@instantdb/core 0.22.86-experimental.split-store.20178922132.1 → 0.22.87-experimental.drewh-explorer-component.20180358679.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (57) hide show
  1. package/dist/commonjs/Reactor.d.ts +6 -20
  2. package/dist/commonjs/Reactor.d.ts.map +1 -1
  3. package/dist/commonjs/Reactor.js +42 -97
  4. package/dist/commonjs/Reactor.js.map +1 -1
  5. package/dist/commonjs/SyncTable.d.ts +1 -4
  6. package/dist/commonjs/SyncTable.d.ts.map +1 -1
  7. package/dist/commonjs/SyncTable.js +37 -35
  8. package/dist/commonjs/SyncTable.js.map +1 -1
  9. package/dist/commonjs/instaml.d.ts +4 -17
  10. package/dist/commonjs/instaml.d.ts.map +1 -1
  11. package/dist/commonjs/instaml.js +76 -105
  12. package/dist/commonjs/instaml.js.map +1 -1
  13. package/dist/commonjs/instaql.d.ts +1 -2
  14. package/dist/commonjs/instaql.d.ts.map +1 -1
  15. package/dist/commonjs/instaql.js +63 -65
  16. package/dist/commonjs/instaql.js.map +1 -1
  17. package/dist/commonjs/store.d.ts +21 -44
  18. package/dist/commonjs/store.d.ts.map +1 -1
  19. package/dist/commonjs/store.js +69 -164
  20. package/dist/commonjs/store.js.map +1 -1
  21. package/dist/esm/Reactor.d.ts +6 -20
  22. package/dist/esm/Reactor.d.ts.map +1 -1
  23. package/dist/esm/Reactor.js +43 -98
  24. package/dist/esm/Reactor.js.map +1 -1
  25. package/dist/esm/SyncTable.d.ts +1 -4
  26. package/dist/esm/SyncTable.d.ts.map +1 -1
  27. package/dist/esm/SyncTable.js +37 -35
  28. package/dist/esm/SyncTable.js.map +1 -1
  29. package/dist/esm/instaml.d.ts +4 -17
  30. package/dist/esm/instaml.d.ts.map +1 -1
  31. package/dist/esm/instaml.js +71 -102
  32. package/dist/esm/instaml.js.map +1 -1
  33. package/dist/esm/instaql.d.ts +1 -2
  34. package/dist/esm/instaql.d.ts.map +1 -1
  35. package/dist/esm/instaql.js +63 -65
  36. package/dist/esm/instaql.js.map +1 -1
  37. package/dist/esm/store.d.ts +21 -44
  38. package/dist/esm/store.d.ts.map +1 -1
  39. package/dist/esm/store.js +69 -161
  40. package/dist/esm/store.js.map +1 -1
  41. package/dist/standalone/index.js +1364 -1536
  42. package/dist/standalone/index.umd.cjs +3 -3
  43. package/package.json +2 -2
  44. package/src/Reactor.js +58 -126
  45. package/src/SyncTable.ts +45 -85
  46. package/src/{instaml.ts → instaml.js} +95 -195
  47. package/src/instaql.ts +60 -86
  48. package/src/store.ts +79 -209
  49. package/dist/commonjs/reactorTypes.d.ts +0 -29
  50. package/dist/commonjs/reactorTypes.d.ts.map +0 -1
  51. package/dist/commonjs/reactorTypes.js +0 -3
  52. package/dist/commonjs/reactorTypes.js.map +0 -1
  53. package/dist/esm/reactorTypes.d.ts +0 -29
  54. package/dist/esm/reactorTypes.d.ts.map +0 -1
  55. package/dist/esm/reactorTypes.js +0 -2
  56. package/dist/esm/reactorTypes.js.map +0 -1
  57. package/src/reactorTypes.ts +0 -32
@@ -1,4 +1,3 @@
1
- import * as s from './store.ts';
2
1
  import { Logger } from './Reactor.js';
3
2
  import { InstaQLResponse, ValidQuery } from './queryTypes.ts';
4
3
  import { EntitiesDef, IContainEntitiesAndLinks } from './schemaTypes.ts';
@@ -48,7 +47,6 @@ type TrySend = (eventId: string, msg: SendMsg) => void;
48
47
  type Config = {
49
48
  useDateObjects: boolean;
50
49
  };
51
- type CreateStore = (triples: Triple[]) => s.Store;
52
50
  export declare enum CallbackEventType {
53
51
  InitialSyncBatch = "InitialSyncBatch",
54
52
  InitialSyncComplete = "InitialSyncComplete",
@@ -107,8 +105,7 @@ export declare class SyncTable {
107
105
  private idToHash;
108
106
  private log;
109
107
  private createStore;
110
- private getAttrs;
111
- constructor(trySend: TrySend, storage: StorageInterface, config: Config, log: Logger, createStore: CreateStore, getAttrs: () => s.AttrsStore);
108
+ constructor(trySend: TrySend, storage: StorageInterface, config: Config, log: Logger, createStore: (triples: Triple[]) => any);
112
109
  beforeUnload(): void;
113
110
  subscribe(q: any, cb: SyncTableCallback<any, any, any>): (opts?: {
114
111
  keepSubscription?: boolean | null | undefined;
@@ -1 +1 @@
1
- {"version":3,"file":"SyncTable.d.ts","sourceRoot":"","sources":["../../src/SyncTable.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"SyncTable.d.ts","sourceRoot":"","sources":["../../src/SyncTable.ts"],"names":[],"mappings":"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"}
@@ -16,26 +16,27 @@ import instaql, { compareOrder } from "./instaql.js";
16
16
  function syncSubFromStorage(sub, useDateObjects) {
17
17
  const values = sub.values;
18
18
  if (values) {
19
- const attrsStore = s.attrsStoreFromJSON(values.attrsStore, null);
20
- if (attrsStore) {
21
- for (const e of values.entities || []) {
22
- e.store.useDateObjects = useDateObjects;
23
- e.store = s.fromJSON(attrsStore, e.store);
24
- }
25
- values.attrsStore = attrsStore;
19
+ for (const e of values.entities || []) {
20
+ e.store.useDateObjects = useDateObjects;
21
+ e.store.attrs = values.attrs;
22
+ e.store = s.fromJSON(e.store);
26
23
  }
27
24
  }
28
25
  return sub;
29
26
  }
30
27
  function syncSubToStorage(_k, sub) {
31
- var _a;
32
- if (sub.values) {
28
+ var _a, _b;
29
+ if ((_a = sub.values) === null || _a === void 0 ? void 0 : _a.entities) {
33
30
  const entities = [];
34
- for (const e of (_a = sub.values) === null || _a === void 0 ? void 0 : _a.entities) {
31
+ for (const e of (_b = sub.values) === null || _b === void 0 ? void 0 : _b.entities) {
35
32
  const store = s.toJSON(e.store);
33
+ // We'll store the attrs once on values, and put the
34
+ // attrs back into the store on hydration
35
+ // @ts-ignore: ts doesn't want us to delete a non-optional
36
+ delete store['attrs'];
36
37
  entities.push(Object.assign(Object.assign({}, e), { store }));
37
38
  }
38
- return Object.assign(Object.assign({}, sub), { values: { attrsStore: sub.values.attrsStore.toJSON(), entities } });
39
+ return Object.assign(Object.assign({}, sub), { values: Object.assign(Object.assign({}, sub.values), { entities }) });
39
40
  }
40
41
  else {
41
42
  return sub;
@@ -53,13 +54,13 @@ function onMergeSub(_key, storageSub, inMemorySub) {
53
54
  }
54
55
  return storageSub || inMemorySub;
55
56
  }
56
- function queryEntity(sub, store, attrsStore) {
57
- const res = instaql({ store, attrsStore, pageInfo: null, aggregate: null }, sub.query);
57
+ function queryEntity(sub, store) {
58
+ const res = instaql({ store, pageInfo: null, aggregate: null }, sub.query);
58
59
  return res.data[sub.table][0];
59
60
  }
60
- function getServerCreatedAt(sub, store, attrsStore, entityId) {
61
+ function getServerCreatedAt(sub, store, entityId) {
61
62
  var _a;
62
- const aid = (_a = s.getAttrByFwdIdentName(attrsStore, sub.table, 'id')) === null || _a === void 0 ? void 0 : _a.id;
63
+ const aid = (_a = s.getAttrByFwdIdentName(store, sub.table, 'id')) === null || _a === void 0 ? void 0 : _a.id;
63
64
  if (!aid) {
64
65
  return -1;
65
66
  }
@@ -69,26 +70,26 @@ function getServerCreatedAt(sub, store, attrsStore, entityId) {
69
70
  }
70
71
  return t[3];
71
72
  }
72
- function applyChangesToStore(store, attrsStore, changes) {
73
+ function applyChangesToStore(store, changes) {
73
74
  for (const { action, triple } of changes) {
74
75
  switch (action) {
75
76
  case 'added':
76
- s.addTriple(store, attrsStore, triple);
77
+ s.addTriple(store, triple);
77
78
  break;
78
79
  case 'removed':
79
- s.retractTriple(store, attrsStore, triple);
80
+ s.retractTriple(store, triple);
80
81
  break;
81
82
  }
82
83
  }
83
84
  }
84
- function changedFieldsOfChanges(store, attrsStore, changes) {
85
+ function changedFieldsOfChanges(store, changes) {
85
86
  var _a, _b, _c, _d;
86
87
  // This will be more complicated when we include links, we can either add a
87
88
  // changedLinks field or we can have something like 'bookshelves.title`
88
89
  const changedFields = {};
89
90
  for (const { action, triple } of changes) {
90
91
  const [e, a, v] = triple;
91
- const field = (_b = (_a = attrsStore.getAttr(a)) === null || _a === void 0 ? void 0 : _a['forward-identity']) === null || _b === void 0 ? void 0 : _b[2];
92
+ const field = (_b = (_a = store.attrs[a]) === null || _a === void 0 ? void 0 : _a['forward-identity']) === null || _b === void 0 ? void 0 : _b[2];
92
93
  if (!field)
93
94
  continue;
94
95
  const fields = (_c = changedFields[e]) !== null && _c !== void 0 ? _c : {};
@@ -121,14 +122,14 @@ function subData(sub, entities) {
121
122
  // Updates the sub order field type if it hasn't been set
122
123
  // and returns the type. We have to wait until the attrs
123
124
  // are loaded before we can determine the type.
124
- function orderFieldTypeMutative(sub, getAttrs) {
125
+ function orderFieldTypeMutative(sub, createStore) {
125
126
  var _a;
126
127
  if (sub.orderFieldType) {
127
128
  return sub.orderFieldType;
128
129
  }
129
130
  const orderFieldType = sub.orderField === 'serverCreatedAt'
130
131
  ? 'number'
131
- : (_a = s.getAttrByFwdIdentName(getAttrs(), sub.table, sub.orderField)) === null || _a === void 0 ? void 0 : _a['checked-data-type'];
132
+ : (_a = s.getAttrByFwdIdentName(createStore([]), sub.table, sub.orderField)) === null || _a === void 0 ? void 0 : _a['checked-data-type'];
132
133
  sub.orderFieldType = orderFieldType;
133
134
  return orderFieldType;
134
135
  }
@@ -162,7 +163,7 @@ export var CallbackEventType;
162
163
  CallbackEventType["Error"] = "Error";
163
164
  })(CallbackEventType || (CallbackEventType = {}));
164
165
  export class SyncTable {
165
- constructor(trySend, storage, config, log, createStore, getAttrs) {
166
+ constructor(trySend, storage, config, log, createStore) {
166
167
  // Using any for the SyncCallback because we'd need Reactor to be typed
167
168
  this.callbacks = {};
168
169
  this.idToHash = {};
@@ -170,7 +171,6 @@ export class SyncTable {
170
171
  this.config = config;
171
172
  this.log = log;
172
173
  this.createStore = createStore;
173
- this.getAttrs = getAttrs;
174
174
  this.subs = new PersistedObject({
175
175
  persister: storage,
176
176
  merge: onMergeSub,
@@ -323,17 +323,18 @@ export class SyncTable {
323
323
  }
324
324
  const values = (_a = sub.values) !== null && _a !== void 0 ? _a : {
325
325
  entities: [],
326
- attrsStore: this.getAttrs(),
326
+ attrs: this.createStore([]).attrs,
327
327
  };
328
328
  sub.values = values;
329
329
  const entities = values.entities;
330
330
  for (const entRows of joinRows) {
331
331
  const store = this.createStore(entRows);
332
- const entity = queryEntity(sub, store, values.attrsStore);
332
+ values.attrs = store.attrs;
333
+ const entity = queryEntity(sub, store);
333
334
  entities.push({
334
335
  store,
335
336
  entity,
336
- serverCreatedAt: getServerCreatedAt(sub, store, values.attrsStore, entity.id),
337
+ serverCreatedAt: getServerCreatedAt(sub, store, entity.id),
337
338
  });
338
339
  batch.push(entity);
339
340
  }
@@ -414,7 +415,7 @@ export class SyncTable {
414
415
  }
415
416
  const values = (_b = sub.values) !== null && _b !== void 0 ? _b : {
416
417
  entities: [],
417
- attrsStore: this.getAttrs(),
418
+ attrs: this.createStore([]).attrs,
418
419
  };
419
420
  const entities = values.entities;
420
421
  sub.values = values;
@@ -424,9 +425,9 @@ export class SyncTable {
424
425
  for (let i = 0; i < entities.length; i++) {
425
426
  const ent = entities[i];
426
427
  if (s.hasEntity(ent.store, eid)) {
427
- applyChangesToStore(ent.store, values.attrsStore, changes);
428
- const entity = queryEntity(sub, ent.store, values.attrsStore);
429
- const changedFields = changedFieldsOfChanges(ent.store, values.attrsStore, changes)[eid];
428
+ applyChangesToStore(ent.store, changes);
429
+ const entity = queryEntity(sub, ent.store);
430
+ const changedFields = changedFieldsOfChanges(ent.store, changes)[eid];
430
431
  if (entity) {
431
432
  updated.push({
432
433
  oldEntity: ent.entity,
@@ -447,8 +448,9 @@ export class SyncTable {
447
448
  // If we have anything left in byEid, then this must be a new entity we don't know about
448
449
  for (const [_eid, changes] of Object.entries(byEid)) {
449
450
  const store = this.createStore([]);
450
- applyChangesToStore(store, values.attrsStore, changes);
451
- const entity = queryEntity(sub, store, values.attrsStore);
451
+ values.attrs = store.attrs;
452
+ applyChangesToStore(store, changes);
453
+ const entity = queryEntity(sub, store);
452
454
  if (!entity) {
453
455
  this.log.error('No entity found after applying change', {
454
456
  sub,
@@ -460,7 +462,7 @@ export class SyncTable {
460
462
  entities.push({
461
463
  store,
462
464
  entity,
463
- serverCreatedAt: getServerCreatedAt(sub, store, values.attrsStore, entity.id),
465
+ serverCreatedAt: getServerCreatedAt(sub, store, entity.id),
464
466
  });
465
467
  added.push(entity);
466
468
  }
@@ -469,7 +471,7 @@ export class SyncTable {
469
471
  removed.push(entities[idx].entity);
470
472
  entities.splice(idx, 1);
471
473
  }
472
- const orderFieldType = orderFieldTypeMutative(sub, this.getAttrs);
474
+ const orderFieldType = orderFieldTypeMutative(sub, this.createStore);
473
475
  sortEntitiesInPlace(sub, orderFieldType, entities);
474
476
  this.notifyCbs(hash, {
475
477
  type: CallbackEventType.SyncTransaction,
@@ -1 +1 @@
1
- {"version":3,"file":"SyncTable.js","sourceRoot":"","sources":["../../src/SyncTable.ts"],"names":[],"mappings":"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","sourcesContent":["import { PersistedObject } from './utils/PersistedObject.ts';\nimport * as s from './store.ts';\nimport weakHash from './utils/weakHash.ts';\nimport uuid from './utils/uuid.ts';\nimport { Logger } from './Reactor.js';\nimport instaql, { compareOrder } from './instaql.ts';\nimport { InstaQLResponse, ValidQuery } from './queryTypes.ts';\nimport { EntitiesDef, IContainEntitiesAndLinks } from './schemaTypes.ts';\nimport { StorageInterface } from './index.ts';\n\ntype SubState = {\n txId?: number;\n subscriptionId: string;\n token: string;\n};\n\ntype SubEntity = {\n entity: any;\n store: s.Store;\n serverCreatedAt: number;\n};\n\ntype SubValues = {\n attrsStore: s.AttrsStore;\n entities: Array<SubEntity>;\n};\n\ntype Sub = {\n query: any;\n hash: string;\n table: string;\n orderField: string;\n orderDirection: 'asc' | 'desc';\n orderFieldType?: 'string' | 'number' | 'date' | 'boolean' | null;\n state?: SubState;\n values?: SubValues;\n createdAt: number;\n updatedAt: number;\n};\n\ntype SubEntityInStorage = {\n entity: any;\n store: s.StoreJson;\n serverCreatedAt: number;\n};\n\ntype SubValuesInStorage = {\n attrsStore: s.AttrsStoreJson;\n entities: Array<SubEntityInStorage>;\n};\n\n// We could make a better type for this if we had a return type for s.toJSON\ntype SubInStorage = Omit<Sub, 'values'> & {\n values: SubValuesInStorage;\n};\n\ntype StartMsg = {\n op: 'start-sync';\n q: string;\n};\n\ntype EndMsg = {\n op: 'remove-sync';\n 'subscription-id': string;\n 'keep-subscription': boolean;\n};\n\ntype ResyncMsg = {\n op: 'resync-table';\n 'subscription-id': string;\n 'tx-id': number;\n token: string;\n};\n\ntype SendMsg = StartMsg | EndMsg | ResyncMsg;\n\ntype StartSyncOkMsg = {\n 'subscription-id': string;\n 'client-event-id': string;\n q: string;\n token: string;\n};\n\ntype Triple = [string, string, any, number];\n\ntype SyncLoadBatchMsg = {\n 'subscription-id': string;\n 'join-rows': Array<Triple[]>;\n};\n\ntype SyncInitFinishMsg = {\n 'subscription-id': string;\n 'tx-id': number;\n};\n\ntype SyncUpdateTriplesMsg = {\n 'subscription-id': string;\n txes: {\n 'tx-id': number;\n changes: { action: 'added' | 'removed'; triple: Triple }[];\n }[];\n};\n\ntype TrySend = (eventId: string, msg: SendMsg) => void;\n\ntype Config = { useDateObjects: boolean };\n\n// Modifies the data in place because it comes directly from storage\nfunction syncSubFromStorage(sub: SubInStorage, useDateObjects: boolean): Sub {\n const values = sub.values;\n if (values) {\n const attrsStore = s.attrsStoreFromJSON(values.attrsStore, null);\n if (attrsStore) {\n for (const e of values.entities || []) {\n e.store.useDateObjects = useDateObjects;\n (e as unknown as SubEntity).store = s.fromJSON(attrsStore, e.store);\n }\n (values as unknown as SubValues).attrsStore = attrsStore;\n }\n }\n\n return sub as unknown as Sub;\n}\n\nfunction syncSubToStorage(_k: string, sub: Sub): SubInStorage {\n if (sub.values) {\n const entities: SubEntityInStorage[] = [];\n for (const e of sub.values?.entities) {\n const store = s.toJSON(e.store);\n entities.push({ ...e, store });\n }\n return {\n ...sub,\n values: { attrsStore: sub.values.attrsStore.toJSON(), entities },\n };\n } else {\n return sub as unknown as SubInStorage;\n }\n}\n\nfunction onMergeSub(\n _key: string,\n storageSub: Sub,\n inMemorySub: Sub | null,\n): Sub {\n const storageTxId = storageSub?.state?.txId;\n const memoryTxId = inMemorySub?.state?.txId;\n\n if (storageTxId && (!memoryTxId || storageTxId > memoryTxId)) {\n return storageSub;\n }\n\n if (memoryTxId && (!storageTxId || memoryTxId > storageTxId)) {\n return inMemorySub;\n }\n\n return storageSub || inMemorySub;\n}\n\nfunction queryEntity(sub: Sub, store: s.Store, attrsStore: s.AttrsStore) {\n const res = instaql(\n { store, attrsStore, pageInfo: null, aggregate: null },\n sub.query,\n );\n return res.data[sub.table][0];\n}\n\nfunction getServerCreatedAt(\n sub: Sub,\n store: s.Store,\n attrsStore: s.AttrsStore,\n entityId: string,\n): number {\n const aid = s.getAttrByFwdIdentName(attrsStore, sub.table, 'id')?.id;\n if (!aid) {\n return -1;\n }\n const t = s.getInMap(store.eav, [entityId, aid, entityId]);\n if (!t) {\n return -1;\n }\n return t[3];\n}\n\nfunction applyChangesToStore(\n store: s.Store,\n attrsStore: s.AttrsStore,\n changes: SyncUpdateTriplesMsg['txes'][number]['changes'],\n): void {\n for (const { action, triple } of changes) {\n switch (action) {\n case 'added':\n s.addTriple(store, attrsStore, triple);\n break;\n case 'removed':\n s.retractTriple(store, attrsStore, triple);\n break;\n }\n }\n}\n\nfunction changedFieldsOfChanges(\n store: s.Store,\n attrsStore: s.AttrsStore,\n changes: SyncUpdateTriplesMsg['txes'][number]['changes'],\n): {\n [eid: string]: SyncTransaction<\n any,\n any,\n any\n >['updated'][number]['changedFields'];\n} {\n // This will be more complicated when we include links, we can either add a\n // changedLinks field or we can have something like 'bookshelves.title`\n const changedFields = {};\n for (const { action, triple } of changes) {\n const [e, a, v] = triple;\n const field = attrsStore.getAttr(a)?.['forward-identity']?.[2];\n if (!field) continue;\n\n const fields = changedFields[e] ?? {};\n changedFields[e] = fields;\n\n const oldNew = fields[field] ?? {};\n fields[field] = oldNew;\n\n switch (action) {\n case 'added':\n oldNew.newValue = v;\n break;\n case 'removed':\n // Only take the first thing that was removed, in case we modified things in the middle\n if (oldNew.oldValue === undefined) {\n oldNew.oldValue = v;\n }\n break;\n }\n }\n\n for (const k of Object.keys(changedFields)) {\n const { oldValue, newValue } = changedFields[k];\n if (oldValue === newValue) {\n delete changedFields[k];\n }\n }\n return changedFields;\n}\n\nfunction subData(sub: Sub, entities: NonNullable<Sub['values']>['entities']) {\n return { [sub.table]: entities.map((e) => e.entity) };\n}\n\ntype CreateStore = (triples: Triple[]) => s.Store;\n\n// Updates the sub order field type if it hasn't been set\n// and returns the type. We have to wait until the attrs\n// are loaded before we can determine the type.\nfunction orderFieldTypeMutative(sub: Sub, getAttrs: () => s.AttrsStore) {\n if (sub.orderFieldType) {\n return sub.orderFieldType;\n }\n const orderFieldType =\n sub.orderField === 'serverCreatedAt'\n ? 'number'\n : s.getAttrByFwdIdentName(getAttrs(), sub.table, sub.orderField)?.[\n 'checked-data-type'\n ];\n\n sub.orderFieldType = orderFieldType;\n return orderFieldType;\n}\n\nfunction sortEntitiesInPlace(\n sub: Sub,\n orderFieldType: NonNullable<Sub['orderFieldType']>,\n entities: NonNullable<Sub['values']>['entities'],\n) {\n const dataType = orderFieldType;\n if (sub.orderField === 'serverCreatedAt') {\n entities.sort(\n sub.orderDirection === 'asc'\n ? function compareEntities(a, b) {\n return compareOrder(\n a.entity.id,\n a.serverCreatedAt,\n b.entity.id,\n b.serverCreatedAt,\n dataType,\n );\n }\n : function compareEntities(b, a) {\n return compareOrder(\n a.entity.id,\n a.serverCreatedAt,\n b.entity.id,\n b.serverCreatedAt,\n dataType,\n );\n },\n );\n return;\n }\n\n const field = sub.orderField;\n\n entities.sort(\n sub.orderDirection === 'asc'\n ? function compareEntities(a, b) {\n return compareOrder(\n a.entity.id,\n a.entity[field],\n b.entity.id,\n b.entity[field],\n dataType,\n );\n }\n : function compareEntities(b, a) {\n return compareOrder(\n a.entity.id,\n a.entity[field],\n b.entity.id,\n b.entity[field],\n dataType,\n );\n },\n );\n}\n\nexport enum CallbackEventType {\n InitialSyncBatch = 'InitialSyncBatch',\n InitialSyncComplete = 'InitialSyncComplete',\n LoadFromStorage = 'LoadFromStorage',\n SyncTransaction = 'SyncTransaction',\n Error = 'Error',\n}\n\ntype QueryEntities<\n Schema extends IContainEntitiesAndLinks<EntitiesDef, any>,\n Q extends ValidQuery<Q, Schema>,\n UseDates extends boolean,\n> = InstaQLResponse<Schema, Q, UseDates>[keyof InstaQLResponse<\n Schema,\n Q,\n UseDates\n>];\n\ntype QueryEntity<\n Schema extends IContainEntitiesAndLinks<EntitiesDef, any>,\n Q extends ValidQuery<Q, Schema>,\n UseDates extends boolean,\n> = QueryEntities<Schema, Q, UseDates> extends (infer E)[] ? E : never;\n\ntype ChangedFields<Entity> = {\n [K in keyof Entity]?: {\n oldValue: Entity[K];\n newValue: Entity[K];\n };\n};\n\nexport interface BaseCallbackEvent<\n Schema extends IContainEntitiesAndLinks<EntitiesDef, any>,\n Q extends ValidQuery<Q, Schema>,\n UseDates extends boolean,\n> {\n type: CallbackEventType;\n data: InstaQLResponse<Schema, Q, UseDates>;\n}\n\nexport interface InitialSyncBatch<\n Schema extends IContainEntitiesAndLinks<EntitiesDef, any>,\n Q extends ValidQuery<Q, Schema>,\n UseDates extends boolean,\n> extends BaseCallbackEvent<Schema, Q, UseDates> {\n type: CallbackEventType.InitialSyncBatch;\n batch: QueryEntities<Schema, Q, UseDates>;\n}\n\nexport interface InitialSyncComplete<\n Schema extends IContainEntitiesAndLinks<EntitiesDef, any>,\n Q extends ValidQuery<Q, Schema>,\n UseDates extends boolean,\n> extends BaseCallbackEvent<Schema, Q, UseDates> {\n type: CallbackEventType.InitialSyncComplete;\n}\n\nexport interface SyncTransaction<\n Schema extends IContainEntitiesAndLinks<EntitiesDef, any>,\n Q extends ValidQuery<Q, Schema>,\n UseDates extends boolean,\n> extends BaseCallbackEvent<Schema, Q, UseDates> {\n type: CallbackEventType.SyncTransaction;\n added: QueryEntities<Schema, Q, UseDates>;\n removed: QueryEntities<Schema, Q, UseDates>;\n updated: {\n oldEntity: QueryEntity<Schema, Q, UseDates>;\n newEntity: QueryEntity<Schema, Q, UseDates>;\n changedFields: ChangedFields<QueryEntity<Schema, Q, UseDates>>;\n }[];\n}\n\nexport interface LoadFromStorage<\n Schema extends IContainEntitiesAndLinks<EntitiesDef, any>,\n Q extends ValidQuery<Q, Schema>,\n UseDates extends boolean,\n> extends BaseCallbackEvent<Schema, Q, UseDates> {\n type: CallbackEventType.LoadFromStorage;\n}\n\nexport interface SetupError<\n Schema extends IContainEntitiesAndLinks<EntitiesDef, any>,\n Q extends ValidQuery<Q, Schema>,\n UseDates extends boolean,\n> extends BaseCallbackEvent<Schema, Q, UseDates> {\n type: CallbackEventType.Error;\n error: { message: string; hint?: any; type: string; status: number };\n}\n\nexport type CallbackEvent<\n Schema extends IContainEntitiesAndLinks<EntitiesDef, any>,\n Q extends ValidQuery<Q, Schema>,\n UseDates extends boolean,\n> =\n | InitialSyncBatch<Schema, Q, UseDates>\n | InitialSyncComplete<Schema, Q, UseDates>\n | SyncTransaction<Schema, Q, UseDates>\n | LoadFromStorage<Schema, Q, UseDates>\n | SetupError<Schema, Q, UseDates>;\n\nexport type SyncTableCallback<\n Schema extends IContainEntitiesAndLinks<EntitiesDef, any>,\n Q extends ValidQuery<Q, Schema>,\n UseDates extends boolean,\n> = (event: CallbackEvent<Schema, Q, UseDates>) => void;\n\nexport class SyncTable {\n private trySend: TrySend;\n private subs: PersistedObject<string, Sub, SubInStorage>;\n // Using any for the SyncCallback because we'd need Reactor to be typed\n private callbacks: { [hash: string]: SyncTableCallback<any, any, any>[] } =\n {};\n private config: Config;\n private idToHash: { [subscriptionId: string]: string } = {};\n private log: Logger;\n private createStore: CreateStore;\n private getAttrs: () => s.AttrsStore;\n\n constructor(\n trySend: TrySend,\n storage: StorageInterface,\n config: Config,\n log: Logger,\n createStore: CreateStore,\n getAttrs: () => s.AttrsStore,\n ) {\n this.trySend = trySend;\n this.config = config;\n this.log = log;\n this.createStore = createStore;\n this.getAttrs = getAttrs;\n\n this.subs = new PersistedObject<string, Sub, SubInStorage>({\n persister: storage,\n merge: onMergeSub,\n serialize: syncSubToStorage,\n parse: (_key, x) => syncSubFromStorage(x, this.config.useDateObjects),\n objectSize: (sub) => sub.values?.entities.length || 0,\n logger: log,\n gc: {\n maxAgeMs: 1000 * 60 * 60 * 24 * 7 * 52, // 1 year\n maxEntries: 1000,\n // Size of each sub is the number of entity\n maxSize: 1_000_000, // 1 million entities\n },\n });\n }\n\n public beforeUnload() {\n this.subs.flush();\n }\n\n public subscribe(\n q: any,\n cb: SyncTableCallback<any, any, any>,\n ): (\n opts?: { keepSubscription?: boolean | null | undefined } | null | undefined,\n ) => void {\n const hash = weakHash(q);\n this.callbacks[hash] = this.callbacks[hash] || [];\n this.callbacks[hash].push(cb);\n\n this.initSubscription(q, hash, cb);\n\n return (opts?: { keepSubscription?: boolean | null | undefined }) => {\n this.unsubscribe(hash, cb, opts?.keepSubscription);\n };\n }\n\n private unsubscribe(\n hash: string,\n cb: SyncTableCallback<any, any, any>,\n keepSubscription: boolean | null | undefined,\n ) {\n const cbs = (this.callbacks[hash] || []).filter((x) => x !== cb);\n this.callbacks[hash] = cbs;\n\n if (!cbs.length) {\n delete this.callbacks[hash];\n const sub = this.subs.currentValue[hash];\n if (sub?.state) {\n this.clearSubscriptionData(\n sub.state.subscriptionId,\n !!keepSubscription,\n );\n }\n if (!keepSubscription) {\n this.subs.updateInPlace((prev) => {\n delete prev[hash];\n });\n }\n }\n }\n\n private sendStart(query: string) {\n this.trySend(uuid(), {\n op: 'start-sync',\n q: query,\n });\n }\n\n private sendResync(sub: Sub, state: SubState, txId: number) {\n // Make sure we can find the hash from the subscriptionId\n this.idToHash[state.subscriptionId] = sub.hash;\n this.trySend(state.subscriptionId, {\n op: 'resync-table',\n 'subscription-id': state.subscriptionId,\n 'tx-id': txId,\n token: state.token,\n });\n }\n\n private sendRemove(state: SubState, keepSubscription: boolean) {\n this.trySend(uuid(), {\n op: 'remove-sync',\n 'subscription-id': state.subscriptionId,\n 'keep-subscription': keepSubscription,\n });\n }\n\n private async initSubscription(\n query: any,\n hash: string,\n cb?: SyncTableCallback<any, any, any>,\n ) {\n // Wait for storage to load so that we know if we already have an existing subscription\n await this.subs.waitForKeyToLoad(hash);\n const existingSub = this.subs.currentValue[hash];\n\n if (existingSub && existingSub.state && existingSub.state.txId) {\n this.sendResync(existingSub, existingSub.state, existingSub.state.txId);\n\n if (existingSub.values?.entities && cb) {\n cb({\n type: CallbackEventType.LoadFromStorage,\n data: subData(existingSub, existingSub.values?.entities),\n });\n }\n\n return;\n }\n\n const table = Object.keys(query)[0];\n const orderBy = query[table]?.$?.order || { serverCreatedAt: 'asc' };\n const [orderField, orderDirection] = Object.entries(orderBy)[0] as [\n string,\n 'asc' | 'desc',\n ];\n\n this.subs.updateInPlace((prev) => {\n prev[hash] = {\n query,\n hash: hash,\n table,\n orderDirection,\n orderField,\n createdAt: Date.now(),\n updatedAt: Date.now(),\n };\n });\n\n this.sendStart(query);\n }\n\n public async flushPending() {\n for (const hash of Object.keys(this.callbacks)) {\n await this.subs.waitForKeyToLoad(hash);\n const sub = this.subs.currentValue[hash];\n if (sub) {\n await this.initSubscription(sub.query, sub.hash);\n } else {\n this.log.error('Missing sub for hash in flushPending', hash);\n }\n }\n }\n\n public onStartSyncOk(msg: StartSyncOkMsg) {\n const subscriptionId = msg['subscription-id'];\n const q = msg.q;\n const hash = weakHash(q);\n\n this.idToHash[subscriptionId] = hash;\n\n this.subs.updateInPlace((prev) => {\n const sub = prev[hash];\n if (!sub) {\n this.log.error(\n 'Missing sub for hash',\n hash,\n 'subscription-id',\n subscriptionId,\n 'query',\n q,\n );\n return prev;\n }\n\n sub.state = {\n subscriptionId: subscriptionId,\n token: msg.token,\n };\n });\n }\n\n private notifyCbs(hash: string, event: CallbackEvent<any, any, any>) {\n for (const cb of this.callbacks[hash] || []) {\n cb(event);\n }\n }\n\n public onSyncLoadBatch(msg: SyncLoadBatchMsg) {\n const subscriptionId = msg['subscription-id'];\n const joinRows = msg['join-rows'];\n const hash = this.idToHash[subscriptionId];\n if (!hash) {\n this.log.error('Missing hash for subscription', msg);\n return;\n }\n\n const batch: any[] = [];\n const sub = this.subs.currentValue[hash];\n if (!sub) {\n this.log.error('Missing sub for hash', hash, msg);\n return;\n }\n\n const values: SubValues = sub.values ?? {\n entities: [],\n attrsStore: this.getAttrs(),\n };\n sub.values = values;\n const entities = values.entities;\n\n for (const entRows of joinRows) {\n const store = this.createStore(entRows);\n const entity = queryEntity(sub, store, values.attrsStore);\n entities.push({\n store,\n entity,\n serverCreatedAt: getServerCreatedAt(\n sub,\n store,\n values.attrsStore,\n entity.id,\n ),\n });\n batch.push(entity);\n }\n\n this.subs.updateInPlace((prev) => {\n prev[hash] = sub;\n // Make sure we write a field or mutative won't\n // see the change because sub === prev[hash]\n prev[hash].updatedAt = Date.now();\n });\n\n if (sub.values) {\n this.notifyCbs(hash, {\n type: CallbackEventType.InitialSyncBatch,\n data: subData(sub, sub.values.entities),\n batch,\n });\n }\n }\n\n public onSyncInitFinish(msg: SyncInitFinishMsg) {\n const subscriptionId = msg['subscription-id'];\n const hash = this.idToHash[subscriptionId];\n if (!hash) {\n this.log.error('Missing hash for subscription', msg);\n return;\n }\n this.subs.updateInPlace((prev) => {\n const sub = prev[hash];\n if (!sub) {\n this.log.error('Missing sub for hash', hash, msg);\n return;\n }\n const state = sub.state;\n if (!state) {\n this.log.error('Sub never set init, missing result', sub, msg);\n return prev;\n }\n state.txId = msg['tx-id'];\n sub.updatedAt = Date.now();\n });\n\n const sub = this.subs.currentValue[hash];\n\n if (sub) {\n this.notifyCbs(hash, {\n type: CallbackEventType.InitialSyncComplete,\n data: subData(sub, sub.values?.entities || []),\n });\n }\n }\n\n public onSyncUpdateTriples(msg: SyncUpdateTriplesMsg) {\n const subscriptionId = msg['subscription-id'];\n const hash = this.idToHash[subscriptionId];\n if (!hash) {\n this.log.error('Missing hash for subscription', msg);\n return;\n }\n\n const sub = this.subs.currentValue[hash];\n if (!sub) {\n this.log.error('Missing sub for hash', hash, msg);\n return;\n }\n\n const state = sub.state;\n if (!state) {\n this.log.error('Missing state for sub', sub, msg);\n return;\n }\n\n for (const tx of msg.txes) {\n if (state.txId && state.txId >= tx['tx-id']) {\n continue;\n }\n state.txId = tx['tx-id'];\n const idxesToDelete: number[] = [];\n // Note: this won't work as well when links are involved\n const byEid: {\n [eid: string]: SyncUpdateTriplesMsg['txes'][number]['changes'];\n } = {};\n for (const change of tx.changes) {\n const eidChanges = byEid[change.triple[0]] ?? [];\n byEid[change.triple[0]] = eidChanges;\n eidChanges.push(change);\n }\n\n const values: SubValues = sub.values ?? {\n entities: [],\n attrsStore: this.getAttrs(),\n };\n const entities = values.entities;\n sub.values = values;\n\n const updated: SyncTransaction<any, any, any>['updated'] = [];\n // Update the existing stores, if we already know about this entity\n eidLoop: for (const [eid, changes] of Object.entries(byEid)) {\n for (let i = 0; i < entities.length; i++) {\n const ent = entities[i];\n if (s.hasEntity(ent.store, eid)) {\n applyChangesToStore(ent.store, values.attrsStore, changes);\n const entity = queryEntity(sub, ent.store, values.attrsStore);\n const changedFields = changedFieldsOfChanges(\n ent.store,\n values.attrsStore,\n changes,\n )[eid];\n if (entity) {\n updated.push({\n oldEntity: ent.entity,\n newEntity: entity,\n changedFields: changedFields || {},\n });\n ent.entity = entity;\n } else {\n idxesToDelete.push(i);\n }\n delete byEid[eid];\n continue eidLoop;\n }\n }\n }\n\n const added: any[] = [];\n // If we have anything left in byEid, then this must be a new entity we don't know about\n for (const [_eid, changes] of Object.entries(byEid)) {\n const store = this.createStore([]);\n applyChangesToStore(store, values.attrsStore, changes);\n const entity = queryEntity(sub, store, values.attrsStore);\n if (!entity) {\n this.log.error('No entity found after applying change', {\n sub,\n changes,\n store,\n });\n continue;\n }\n entities.push({\n store,\n entity,\n serverCreatedAt: getServerCreatedAt(\n sub,\n store,\n values.attrsStore,\n entity.id,\n ),\n });\n added.push(entity);\n }\n\n const removed: any[] = [];\n\n for (const idx of idxesToDelete.sort().reverse()) {\n removed.push(entities[idx].entity);\n entities.splice(idx, 1);\n }\n\n const orderFieldType = orderFieldTypeMutative(sub, this.getAttrs);\n\n sortEntitiesInPlace(sub, orderFieldType!, entities);\n this.notifyCbs(hash, {\n type: CallbackEventType.SyncTransaction,\n data: subData(sub, sub.values?.entities),\n added,\n removed,\n updated,\n });\n }\n this.subs.updateInPlace((prev) => {\n prev[hash] = sub;\n // Make sure we write a field or mutative won't\n // see the change because sub === prev[hash]\n prev[hash].updatedAt = Date.now();\n });\n }\n\n private clearSubscriptionData(\n subscriptionId: string,\n keepSubscription: boolean,\n ) {\n const hash = this.idToHash[subscriptionId];\n if (hash) {\n delete this.idToHash[subscriptionId];\n const sub = this.subs.currentValue[hash];\n if (sub.state) {\n this.sendRemove(sub.state, keepSubscription);\n }\n if (keepSubscription) {\n this.subs.unloadKey(hash);\n } else {\n this.subs.updateInPlace((prev) => {\n delete prev[hash];\n });\n }\n if (sub) {\n return sub;\n }\n }\n }\n\n public onStartSyncError(msg: {\n op: 'error';\n 'original-event': StartMsg;\n 'client-event-id': string;\n status: number;\n type: string;\n message?: string;\n hint?: any;\n }) {\n const hash = weakHash(msg['original-event']['q']);\n const error = {\n message: msg.message || 'Uh-oh, something went wrong. Ping Joe & Stopa.',\n status: msg.status,\n type: msg.type,\n hint: msg.hint,\n };\n\n const k = Object.keys(msg['original-event']['q'])[0];\n this.notifyCbs(hash, {\n type: CallbackEventType.Error,\n data: { [k]: [] },\n error,\n });\n }\n\n public onResyncError(msg: {\n op: 'error';\n 'original-event': ResyncMsg;\n status: number;\n type: string;\n }) {\n // Clear the subscription and start from scrath on any resync error\n // This can happen if the auth changed and we need to refetch with the\n // new auth or if the subscription is too far behind.\n const subscriptionId = msg['original-event']['subscription-id'];\n const removedSub = this.clearSubscriptionData(subscriptionId, false);\n if (removedSub) {\n this.initSubscription(removedSub.query, removedSub.hash);\n }\n }\n}\n"]}
1
+ {"version":3,"file":"SyncTable.js","sourceRoot":"","sources":["../../src/SyncTable.ts"],"names":[],"mappings":"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","sourcesContent":["import { PersistedObject } from './utils/PersistedObject.ts';\nimport * as s from './store.ts';\nimport weakHash from './utils/weakHash.ts';\nimport uuid from './utils/uuid.ts';\nimport { Logger } from './Reactor.js';\nimport instaql, { compareOrder } from './instaql.ts';\nimport { InstaQLResponse, ValidQuery } from './queryTypes.ts';\nimport { EntitiesDef, IContainEntitiesAndLinks } from './schemaTypes.ts';\nimport { StorageInterface } from './index.ts';\n\ntype SubState = {\n txId?: number;\n subscriptionId: string;\n token: string;\n};\n\ntype SubEntity = {\n entity: any;\n store: any;\n serverCreatedAt: number;\n};\n\ntype SubValues = {\n attrs: Record<string, any>;\n entities: Array<SubEntity>;\n};\n\ntype Sub = {\n query: any;\n hash: string;\n table: string;\n orderField: string;\n orderDirection: 'asc' | 'desc';\n orderFieldType?: 'string' | 'number' | 'date' | 'boolean' | null;\n state?: SubState;\n values?: SubValues;\n createdAt: number;\n updatedAt: number;\n};\n\n// We could make a better type for this if we had a return type for s.toJSON\ntype SubInStorage = Sub;\n\ntype StartMsg = {\n op: 'start-sync';\n q: string;\n};\n\ntype EndMsg = {\n op: 'remove-sync';\n 'subscription-id': string;\n 'keep-subscription': boolean;\n};\n\ntype ResyncMsg = {\n op: 'resync-table';\n 'subscription-id': string;\n 'tx-id': number;\n token: string;\n};\n\ntype SendMsg = StartMsg | EndMsg | ResyncMsg;\n\ntype StartSyncOkMsg = {\n 'subscription-id': string;\n 'client-event-id': string;\n q: string;\n token: string;\n};\n\ntype Triple = [string, string, any, number];\n\ntype SyncLoadBatchMsg = {\n 'subscription-id': string;\n 'join-rows': Array<Triple[]>;\n};\n\ntype SyncInitFinishMsg = {\n 'subscription-id': string;\n 'tx-id': number;\n};\n\ntype SyncUpdateTriplesMsg = {\n 'subscription-id': string;\n txes: {\n 'tx-id': number;\n changes: { action: 'added' | 'removed'; triple: Triple }[];\n }[];\n};\n\ntype TrySend = (eventId: string, msg: SendMsg) => void;\n\ntype Config = { useDateObjects: boolean };\n\n// Modifies the data in place because it comes directly from storage\nfunction syncSubFromStorage(sub: SubInStorage, useDateObjects: boolean): Sub {\n const values = sub.values;\n if (values) {\n for (const e of values.entities || []) {\n e.store.useDateObjects = useDateObjects;\n e.store.attrs = values.attrs;\n e.store = s.fromJSON(e.store);\n }\n }\n\n return sub;\n}\n\nfunction syncSubToStorage(_k: string, sub: Sub): SubInStorage {\n if (sub.values?.entities) {\n const entities: SubEntity[] = [];\n for (const e of sub.values?.entities) {\n const store = s.toJSON(e.store);\n // We'll store the attrs once on values, and put the\n // attrs back into the store on hydration\n // @ts-ignore: ts doesn't want us to delete a non-optional\n delete store['attrs'];\n entities.push({ ...e, store });\n }\n return { ...sub, values: { ...sub.values, entities } };\n } else {\n return sub;\n }\n}\n\nfunction onMergeSub(\n _key: string,\n storageSub: SubInStorage,\n inMemorySub: Sub | null,\n): Sub {\n const storageTxId = storageSub?.state?.txId;\n const memoryTxId = inMemorySub?.state?.txId;\n\n if (storageTxId && (!memoryTxId || storageTxId > memoryTxId)) {\n return storageSub;\n }\n\n if (memoryTxId && (!storageTxId || memoryTxId > storageTxId)) {\n return inMemorySub;\n }\n\n return storageSub || inMemorySub;\n}\n\nfunction queryEntity(sub: Sub, store: any) {\n const res = instaql({ store, pageInfo: null, aggregate: null }, sub.query);\n return res.data[sub.table][0];\n}\n\nfunction getServerCreatedAt(sub: Sub, store: any, entityId: string): number {\n const aid = s.getAttrByFwdIdentName(store, sub.table, 'id')?.id;\n if (!aid) {\n return -1;\n }\n const t = s.getInMap(store.eav, [entityId, aid, entityId]);\n if (!t) {\n return -1;\n }\n return t[3];\n}\n\nfunction applyChangesToStore(\n store: any,\n changes: SyncUpdateTriplesMsg['txes'][number]['changes'],\n): void {\n for (const { action, triple } of changes) {\n switch (action) {\n case 'added':\n s.addTriple(store, triple);\n break;\n case 'removed':\n s.retractTriple(store, triple);\n break;\n }\n }\n}\n\nfunction changedFieldsOfChanges(\n store: any,\n changes: SyncUpdateTriplesMsg['txes'][number]['changes'],\n): {\n [eid: string]: SyncTransaction<\n any,\n any,\n any\n >['updated'][number]['changedFields'];\n} {\n // This will be more complicated when we include links, we can either add a\n // changedLinks field or we can have something like 'bookshelves.title`\n const changedFields = {};\n for (const { action, triple } of changes) {\n const [e, a, v] = triple;\n const field = store.attrs[a]?.['forward-identity']?.[2];\n if (!field) continue;\n\n const fields = changedFields[e] ?? {};\n changedFields[e] = fields;\n\n const oldNew = fields[field] ?? {};\n fields[field] = oldNew;\n\n switch (action) {\n case 'added':\n oldNew.newValue = v;\n break;\n case 'removed':\n // Only take the first thing that was removed, in case we modified things in the middle\n if (oldNew.oldValue === undefined) {\n oldNew.oldValue = v;\n }\n break;\n }\n }\n\n for (const k of Object.keys(changedFields)) {\n const { oldValue, newValue } = changedFields[k];\n if (oldValue === newValue) {\n delete changedFields[k];\n }\n }\n return changedFields;\n}\n\nfunction subData(sub: Sub, entities: NonNullable<Sub['values']>['entities']) {\n return { [sub.table]: entities.map((e) => e.entity) };\n}\n\n// Updates the sub order field type if it hasn't been set\n// and returns the type. We have to wait until the attrs\n// are loaded before we can determine the type.\nfunction orderFieldTypeMutative(sub: Sub, createStore) {\n if (sub.orderFieldType) {\n return sub.orderFieldType;\n }\n const orderFieldType =\n sub.orderField === 'serverCreatedAt'\n ? 'number'\n : s.getAttrByFwdIdentName(createStore([]), sub.table, sub.orderField)?.[\n 'checked-data-type'\n ];\n\n sub.orderFieldType = orderFieldType;\n return orderFieldType;\n}\n\nfunction sortEntitiesInPlace(\n sub: Sub,\n orderFieldType: NonNullable<Sub['orderFieldType']>,\n entities: NonNullable<Sub['values']>['entities'],\n) {\n const dataType = orderFieldType;\n if (sub.orderField === 'serverCreatedAt') {\n entities.sort(\n sub.orderDirection === 'asc'\n ? function compareEntities(a, b) {\n return compareOrder(\n a.entity.id,\n a.serverCreatedAt,\n b.entity.id,\n b.serverCreatedAt,\n dataType,\n );\n }\n : function compareEntities(b, a) {\n return compareOrder(\n a.entity.id,\n a.serverCreatedAt,\n b.entity.id,\n b.serverCreatedAt,\n dataType,\n );\n },\n );\n return;\n }\n\n const field = sub.orderField;\n\n entities.sort(\n sub.orderDirection === 'asc'\n ? function compareEntities(a, b) {\n return compareOrder(\n a.entity.id,\n a.entity[field],\n b.entity.id,\n b.entity[field],\n dataType,\n );\n }\n : function compareEntities(b, a) {\n return compareOrder(\n a.entity.id,\n a.entity[field],\n b.entity.id,\n b.entity[field],\n dataType,\n );\n },\n );\n}\n\nexport enum CallbackEventType {\n InitialSyncBatch = 'InitialSyncBatch',\n InitialSyncComplete = 'InitialSyncComplete',\n LoadFromStorage = 'LoadFromStorage',\n SyncTransaction = 'SyncTransaction',\n Error = 'Error',\n}\n\ntype QueryEntities<\n Schema extends IContainEntitiesAndLinks<EntitiesDef, any>,\n Q extends ValidQuery<Q, Schema>,\n UseDates extends boolean,\n> = InstaQLResponse<Schema, Q, UseDates>[keyof InstaQLResponse<\n Schema,\n Q,\n UseDates\n>];\n\ntype QueryEntity<\n Schema extends IContainEntitiesAndLinks<EntitiesDef, any>,\n Q extends ValidQuery<Q, Schema>,\n UseDates extends boolean,\n> = QueryEntities<Schema, Q, UseDates> extends (infer E)[] ? E : never;\n\ntype ChangedFields<Entity> = {\n [K in keyof Entity]?: {\n oldValue: Entity[K];\n newValue: Entity[K];\n };\n};\n\nexport interface BaseCallbackEvent<\n Schema extends IContainEntitiesAndLinks<EntitiesDef, any>,\n Q extends ValidQuery<Q, Schema>,\n UseDates extends boolean,\n> {\n type: CallbackEventType;\n data: InstaQLResponse<Schema, Q, UseDates>;\n}\n\nexport interface InitialSyncBatch<\n Schema extends IContainEntitiesAndLinks<EntitiesDef, any>,\n Q extends ValidQuery<Q, Schema>,\n UseDates extends boolean,\n> extends BaseCallbackEvent<Schema, Q, UseDates> {\n type: CallbackEventType.InitialSyncBatch;\n batch: QueryEntities<Schema, Q, UseDates>;\n}\n\nexport interface InitialSyncComplete<\n Schema extends IContainEntitiesAndLinks<EntitiesDef, any>,\n Q extends ValidQuery<Q, Schema>,\n UseDates extends boolean,\n> extends BaseCallbackEvent<Schema, Q, UseDates> {\n type: CallbackEventType.InitialSyncComplete;\n}\n\nexport interface SyncTransaction<\n Schema extends IContainEntitiesAndLinks<EntitiesDef, any>,\n Q extends ValidQuery<Q, Schema>,\n UseDates extends boolean,\n> extends BaseCallbackEvent<Schema, Q, UseDates> {\n type: CallbackEventType.SyncTransaction;\n added: QueryEntities<Schema, Q, UseDates>;\n removed: QueryEntities<Schema, Q, UseDates>;\n updated: {\n oldEntity: QueryEntity<Schema, Q, UseDates>;\n newEntity: QueryEntity<Schema, Q, UseDates>;\n changedFields: ChangedFields<QueryEntity<Schema, Q, UseDates>>;\n }[];\n}\n\nexport interface LoadFromStorage<\n Schema extends IContainEntitiesAndLinks<EntitiesDef, any>,\n Q extends ValidQuery<Q, Schema>,\n UseDates extends boolean,\n> extends BaseCallbackEvent<Schema, Q, UseDates> {\n type: CallbackEventType.LoadFromStorage;\n}\n\nexport interface SetupError<\n Schema extends IContainEntitiesAndLinks<EntitiesDef, any>,\n Q extends ValidQuery<Q, Schema>,\n UseDates extends boolean,\n> extends BaseCallbackEvent<Schema, Q, UseDates> {\n type: CallbackEventType.Error;\n error: { message: string; hint?: any; type: string; status: number };\n}\n\nexport type CallbackEvent<\n Schema extends IContainEntitiesAndLinks<EntitiesDef, any>,\n Q extends ValidQuery<Q, Schema>,\n UseDates extends boolean,\n> =\n | InitialSyncBatch<Schema, Q, UseDates>\n | InitialSyncComplete<Schema, Q, UseDates>\n | SyncTransaction<Schema, Q, UseDates>\n | LoadFromStorage<Schema, Q, UseDates>\n | SetupError<Schema, Q, UseDates>;\n\nexport type SyncTableCallback<\n Schema extends IContainEntitiesAndLinks<EntitiesDef, any>,\n Q extends ValidQuery<Q, Schema>,\n UseDates extends boolean,\n> = (event: CallbackEvent<Schema, Q, UseDates>) => void;\n\nexport class SyncTable {\n private trySend: TrySend;\n private subs: PersistedObject<string, Sub, SubInStorage>;\n // Using any for the SyncCallback because we'd need Reactor to be typed\n private callbacks: { [hash: string]: SyncTableCallback<any, any, any>[] } =\n {};\n private config: Config;\n private idToHash: { [subscriptionId: string]: string } = {};\n private log: Logger;\n private createStore: (triples: Triple[]) => any;\n\n constructor(\n trySend: TrySend,\n storage: StorageInterface,\n config: Config,\n log: Logger,\n createStore: (triples: Triple[]) => any,\n ) {\n this.trySend = trySend;\n this.config = config;\n this.log = log;\n this.createStore = createStore;\n\n this.subs = new PersistedObject<string, Sub, SubInStorage>({\n persister: storage,\n merge: onMergeSub,\n serialize: syncSubToStorage,\n parse: (_key, x) => syncSubFromStorage(x, this.config.useDateObjects),\n objectSize: (sub) => sub.values?.entities.length || 0,\n logger: log,\n gc: {\n maxAgeMs: 1000 * 60 * 60 * 24 * 7 * 52, // 1 year\n maxEntries: 1000,\n // Size of each sub is the number of entity\n maxSize: 1_000_000, // 1 million entities\n },\n });\n }\n\n public beforeUnload() {\n this.subs.flush();\n }\n\n public subscribe(\n q: any,\n cb: SyncTableCallback<any, any, any>,\n ): (\n opts?: { keepSubscription?: boolean | null | undefined } | null | undefined,\n ) => void {\n const hash = weakHash(q);\n this.callbacks[hash] = this.callbacks[hash] || [];\n this.callbacks[hash].push(cb);\n\n this.initSubscription(q, hash, cb);\n\n return (opts?: { keepSubscription?: boolean | null | undefined }) => {\n this.unsubscribe(hash, cb, opts?.keepSubscription);\n };\n }\n\n private unsubscribe(\n hash: string,\n cb: SyncTableCallback<any, any, any>,\n keepSubscription: boolean | null | undefined,\n ) {\n const cbs = (this.callbacks[hash] || []).filter((x) => x !== cb);\n this.callbacks[hash] = cbs;\n\n if (!cbs.length) {\n delete this.callbacks[hash];\n const sub = this.subs.currentValue[hash];\n if (sub?.state) {\n this.clearSubscriptionData(\n sub.state.subscriptionId,\n !!keepSubscription,\n );\n }\n if (!keepSubscription) {\n this.subs.updateInPlace((prev) => {\n delete prev[hash];\n });\n }\n }\n }\n\n private sendStart(query: string) {\n this.trySend(uuid(), {\n op: 'start-sync',\n q: query,\n });\n }\n\n private sendResync(sub: Sub, state: SubState, txId: number) {\n // Make sure we can find the hash from the subscriptionId\n this.idToHash[state.subscriptionId] = sub.hash;\n this.trySend(state.subscriptionId, {\n op: 'resync-table',\n 'subscription-id': state.subscriptionId,\n 'tx-id': txId,\n token: state.token,\n });\n }\n\n private sendRemove(state: SubState, keepSubscription: boolean) {\n this.trySend(uuid(), {\n op: 'remove-sync',\n 'subscription-id': state.subscriptionId,\n 'keep-subscription': keepSubscription,\n });\n }\n\n private async initSubscription(\n query: any,\n hash: string,\n cb?: SyncTableCallback<any, any, any>,\n ) {\n // Wait for storage to load so that we know if we already have an existing subscription\n await this.subs.waitForKeyToLoad(hash);\n const existingSub = this.subs.currentValue[hash];\n\n if (existingSub && existingSub.state && existingSub.state.txId) {\n this.sendResync(existingSub, existingSub.state, existingSub.state.txId);\n\n if (existingSub.values?.entities && cb) {\n cb({\n type: CallbackEventType.LoadFromStorage,\n data: subData(existingSub, existingSub.values?.entities),\n });\n }\n\n return;\n }\n\n const table = Object.keys(query)[0];\n const orderBy = query[table]?.$?.order || { serverCreatedAt: 'asc' };\n const [orderField, orderDirection] = Object.entries(orderBy)[0] as [\n string,\n 'asc' | 'desc',\n ];\n\n this.subs.updateInPlace((prev) => {\n prev[hash] = {\n query,\n hash: hash,\n table,\n orderDirection,\n orderField,\n createdAt: Date.now(),\n updatedAt: Date.now(),\n };\n });\n\n this.sendStart(query);\n }\n\n public async flushPending() {\n for (const hash of Object.keys(this.callbacks)) {\n await this.subs.waitForKeyToLoad(hash);\n const sub = this.subs.currentValue[hash];\n if (sub) {\n await this.initSubscription(sub.query, sub.hash);\n } else {\n this.log.error('Missing sub for hash in flushPending', hash);\n }\n }\n }\n\n public onStartSyncOk(msg: StartSyncOkMsg) {\n const subscriptionId = msg['subscription-id'];\n const q = msg.q;\n const hash = weakHash(q);\n\n this.idToHash[subscriptionId] = hash;\n\n this.subs.updateInPlace((prev) => {\n const sub = prev[hash];\n if (!sub) {\n this.log.error(\n 'Missing sub for hash',\n hash,\n 'subscription-id',\n subscriptionId,\n 'query',\n q,\n );\n return prev;\n }\n\n sub.state = {\n subscriptionId: subscriptionId,\n token: msg.token,\n };\n });\n }\n\n private notifyCbs(hash: string, event: CallbackEvent<any, any, any>) {\n for (const cb of this.callbacks[hash] || []) {\n cb(event);\n }\n }\n\n public onSyncLoadBatch(msg: SyncLoadBatchMsg) {\n const subscriptionId = msg['subscription-id'];\n const joinRows = msg['join-rows'];\n const hash = this.idToHash[subscriptionId];\n if (!hash) {\n this.log.error('Missing hash for subscription', msg);\n return;\n }\n\n const batch: any[] = [];\n const sub = this.subs.currentValue[hash];\n if (!sub) {\n this.log.error('Missing sub for hash', hash, msg);\n return;\n }\n\n const values: SubValues = sub.values ?? {\n entities: [],\n attrs: this.createStore([]).attrs,\n };\n sub.values = values;\n const entities = values.entities;\n\n for (const entRows of joinRows) {\n const store = this.createStore(entRows);\n values.attrs = store.attrs;\n const entity = queryEntity(sub, store);\n entities.push({\n store,\n entity,\n serverCreatedAt: getServerCreatedAt(sub, store, entity.id),\n });\n batch.push(entity);\n }\n\n this.subs.updateInPlace((prev) => {\n prev[hash] = sub;\n // Make sure we write a field or mutative won't\n // see the change because sub === prev[hash]\n prev[hash].updatedAt = Date.now();\n });\n\n if (sub.values) {\n this.notifyCbs(hash, {\n type: CallbackEventType.InitialSyncBatch,\n data: subData(sub, sub.values.entities),\n batch,\n });\n }\n }\n\n public onSyncInitFinish(msg: SyncInitFinishMsg) {\n const subscriptionId = msg['subscription-id'];\n const hash = this.idToHash[subscriptionId];\n if (!hash) {\n this.log.error('Missing hash for subscription', msg);\n return;\n }\n this.subs.updateInPlace((prev) => {\n const sub = prev[hash];\n if (!sub) {\n this.log.error('Missing sub for hash', hash, msg);\n return;\n }\n const state = sub.state;\n if (!state) {\n this.log.error('Sub never set init, missing result', sub, msg);\n return prev;\n }\n state.txId = msg['tx-id'];\n sub.updatedAt = Date.now();\n });\n\n const sub = this.subs.currentValue[hash];\n\n if (sub) {\n this.notifyCbs(hash, {\n type: CallbackEventType.InitialSyncComplete,\n data: subData(sub, sub.values?.entities || []),\n });\n }\n }\n\n public onSyncUpdateTriples(msg: SyncUpdateTriplesMsg) {\n const subscriptionId = msg['subscription-id'];\n const hash = this.idToHash[subscriptionId];\n if (!hash) {\n this.log.error('Missing hash for subscription', msg);\n return;\n }\n\n const sub = this.subs.currentValue[hash];\n if (!sub) {\n this.log.error('Missing sub for hash', hash, msg);\n return;\n }\n\n const state = sub.state;\n if (!state) {\n this.log.error('Missing state for sub', sub, msg);\n return;\n }\n\n for (const tx of msg.txes) {\n if (state.txId && state.txId >= tx['tx-id']) {\n continue;\n }\n state.txId = tx['tx-id'];\n const idxesToDelete: number[] = [];\n // Note: this won't work as well when links are involved\n const byEid: {\n [eid: string]: SyncUpdateTriplesMsg['txes'][number]['changes'];\n } = {};\n for (const change of tx.changes) {\n const eidChanges = byEid[change.triple[0]] ?? [];\n byEid[change.triple[0]] = eidChanges;\n eidChanges.push(change);\n }\n\n const values: SubValues = sub.values ?? {\n entities: [],\n attrs: this.createStore([]).attrs,\n };\n const entities = values.entities;\n sub.values = values;\n\n const updated: SyncTransaction<any, any, any>['updated'] = [];\n // Update the existing stores, if we already know about this entity\n eidLoop: for (const [eid, changes] of Object.entries(byEid)) {\n for (let i = 0; i < entities.length; i++) {\n const ent = entities[i];\n if (s.hasEntity(ent.store, eid)) {\n applyChangesToStore(ent.store, changes);\n const entity = queryEntity(sub, ent.store);\n const changedFields = changedFieldsOfChanges(ent.store, changes)[\n eid\n ];\n if (entity) {\n updated.push({\n oldEntity: ent.entity,\n newEntity: entity,\n changedFields: changedFields || {},\n });\n ent.entity = entity;\n } else {\n idxesToDelete.push(i);\n }\n delete byEid[eid];\n continue eidLoop;\n }\n }\n }\n\n const added: any[] = [];\n // If we have anything left in byEid, then this must be a new entity we don't know about\n for (const [_eid, changes] of Object.entries(byEid)) {\n const store = this.createStore([]);\n values.attrs = store.attrs;\n applyChangesToStore(store, changes);\n const entity = queryEntity(sub, store);\n if (!entity) {\n this.log.error('No entity found after applying change', {\n sub,\n changes,\n store,\n });\n continue;\n }\n entities.push({\n store,\n entity,\n serverCreatedAt: getServerCreatedAt(sub, store, entity.id),\n });\n added.push(entity);\n }\n\n const removed: any[] = [];\n\n for (const idx of idxesToDelete.sort().reverse()) {\n removed.push(entities[idx].entity);\n entities.splice(idx, 1);\n }\n\n const orderFieldType = orderFieldTypeMutative(sub, this.createStore);\n\n sortEntitiesInPlace(sub, orderFieldType!, entities);\n this.notifyCbs(hash, {\n type: CallbackEventType.SyncTransaction,\n data: subData(sub, sub.values?.entities),\n added,\n removed,\n updated,\n });\n }\n this.subs.updateInPlace((prev) => {\n prev[hash] = sub;\n // Make sure we write a field or mutative won't\n // see the change because sub === prev[hash]\n prev[hash].updatedAt = Date.now();\n });\n }\n\n private clearSubscriptionData(\n subscriptionId: string,\n keepSubscription: boolean,\n ) {\n const hash = this.idToHash[subscriptionId];\n if (hash) {\n delete this.idToHash[subscriptionId];\n const sub = this.subs.currentValue[hash];\n if (sub.state) {\n this.sendRemove(sub.state, keepSubscription);\n }\n if (keepSubscription) {\n this.subs.unloadKey(hash);\n } else {\n this.subs.updateInPlace((prev) => {\n delete prev[hash];\n });\n }\n if (sub) {\n return sub;\n }\n }\n }\n\n public onStartSyncError(msg: {\n op: 'error';\n 'original-event': StartMsg;\n 'client-event-id': string;\n status: number;\n type: string;\n message?: string;\n hint?: any;\n }) {\n const hash = weakHash(msg['original-event']['q']);\n const error = {\n message: msg.message || 'Uh-oh, something went wrong. Ping Joe & Stopa.',\n status: msg.status,\n type: msg.type,\n hint: msg.hint,\n };\n\n const k = Object.keys(msg['original-event']['q'])[0];\n this.notifyCbs(hash, {\n type: CallbackEventType.Error,\n data: { [k]: [] },\n error,\n });\n }\n\n public onResyncError(msg: {\n op: 'error';\n 'original-event': ResyncMsg;\n status: number;\n type: string;\n }) {\n // Clear the subscription and start from scrath on any resync error\n // This can happen if the auth changed and we need to refetch with the\n // new auth or if the subscription is too far behind.\n const subscriptionId = msg['original-event']['subscription-id'];\n const removedSub = this.clearSubscriptionData(subscriptionId, false);\n if (removedSub) {\n this.initSubscription(removedSub.query, removedSub.hash);\n }\n }\n}\n"]}
@@ -1,18 +1,5 @@
1
- import { AttrsStore, Store } from './store.ts';
2
- import { IContainEntitiesAndLinks } from './schemaTypes.ts';
3
- export type AttrMapping = {
4
- attrIdMap: Record<string, string>;
5
- refSwapAttrIds: Set<string>;
6
- };
7
- type TXStep = any[];
8
- export declare function rewriteStep(attrMapping: AttrMapping, txStep: TXStep): TXStep;
9
- type Ctx = {
10
- stores: (Store | undefined)[];
11
- attrsStore: AttrsStore;
12
- schema: Schema;
13
- useDateObjects: boolean | null;
14
- };
15
- type Schema = IContainEntitiesAndLinks<any, any>;
16
- export declare function transform(ctx: Ctx, inputChunks: any): TXStep[];
17
- export {};
1
+ export function rewriteStep(attrMapping: any, txStep: any): any[];
2
+ export function getAttrByFwdIdentName(attrs: any, inputEtype: any, inputIdentName: any): any;
3
+ export function getAttrByReverseIdentName(attrs: any, inputEtype: any, inputIdentName: any): any;
4
+ export function transform(ctx: any, inputChunks: any): any[];
18
5
  //# sourceMappingURL=instaml.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"instaml.d.ts","sourceRoot":"","sources":["../../src/instaml.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,UAAU,EAGV,KAAK,EACN,MAAM,YAAY,CAAC;AAKpB,OAAO,EAEL,wBAAwB,EAEzB,MAAM,kBAAkB,CAAC;AAG1B,MAAM,MAAM,WAAW,GAAG;IACxB,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAClC,cAAc,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;CAC7B,CAAC;AAEF,KAAK,MAAM,GAAG,GAAG,EAAE,CAAC;AAGpB,wBAAgB,WAAW,CAAC,WAAW,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CA4B5E;AA4LD,KAAK,GAAG,GAAG;IACT,MAAM,EAAE,CAAC,KAAK,GAAG,SAAS,CAAC,EAAE,CAAC;IAC9B,UAAU,EAAE,UAAU,CAAC;IACvB,MAAM,EAAE,MAAM,CAAC;IACf,cAAc,EAAE,OAAO,GAAG,IAAI,CAAC;CAChC,CAAC;AAuLF,KAAK,MAAM,GAAG,wBAAwB,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;AA+QjD,wBAAgB,SAAS,CAAC,GAAG,EAAE,GAAG,EAAE,WAAW,KAAA,YAO9C"}
1
+ {"version":3,"file":"instaml.d.ts","sourceRoot":"","sources":["../../src/instaml.js"],"names":[],"mappings":"AAOA,kEA4BC;AAED,6FAKC;AAED,iGAOC;AAsiBD,6DAOC"}