@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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"}
@@ -55,26 +55,27 @@ const instaql_ts_1 = __importStar(require("./instaql.js"));
55
55
  function syncSubFromStorage(sub, useDateObjects) {
56
56
  const values = sub.values;
57
57
  if (values) {
58
- const attrsStore = s.attrsStoreFromJSON(values.attrsStore, null);
59
- if (attrsStore) {
60
- for (const e of values.entities || []) {
61
- e.store.useDateObjects = useDateObjects;
62
- e.store = s.fromJSON(attrsStore, e.store);
63
- }
64
- values.attrsStore = attrsStore;
58
+ for (const e of values.entities || []) {
59
+ e.store.useDateObjects = useDateObjects;
60
+ e.store.attrs = values.attrs;
61
+ e.store = s.fromJSON(e.store);
65
62
  }
66
63
  }
67
64
  return sub;
68
65
  }
69
66
  function syncSubToStorage(_k, sub) {
70
- var _a;
71
- if (sub.values) {
67
+ var _a, _b;
68
+ if ((_a = sub.values) === null || _a === void 0 ? void 0 : _a.entities) {
72
69
  const entities = [];
73
- for (const e of (_a = sub.values) === null || _a === void 0 ? void 0 : _a.entities) {
70
+ for (const e of (_b = sub.values) === null || _b === void 0 ? void 0 : _b.entities) {
74
71
  const store = s.toJSON(e.store);
72
+ // We'll store the attrs once on values, and put the
73
+ // attrs back into the store on hydration
74
+ // @ts-ignore: ts doesn't want us to delete a non-optional
75
+ delete store['attrs'];
75
76
  entities.push(Object.assign(Object.assign({}, e), { store }));
76
77
  }
77
- return Object.assign(Object.assign({}, sub), { values: { attrsStore: sub.values.attrsStore.toJSON(), entities } });
78
+ return Object.assign(Object.assign({}, sub), { values: Object.assign(Object.assign({}, sub.values), { entities }) });
78
79
  }
79
80
  else {
80
81
  return sub;
@@ -92,13 +93,13 @@ function onMergeSub(_key, storageSub, inMemorySub) {
92
93
  }
93
94
  return storageSub || inMemorySub;
94
95
  }
95
- function queryEntity(sub, store, attrsStore) {
96
- const res = (0, instaql_ts_1.default)({ store, attrsStore, pageInfo: null, aggregate: null }, sub.query);
96
+ function queryEntity(sub, store) {
97
+ const res = (0, instaql_ts_1.default)({ store, pageInfo: null, aggregate: null }, sub.query);
97
98
  return res.data[sub.table][0];
98
99
  }
99
- function getServerCreatedAt(sub, store, attrsStore, entityId) {
100
+ function getServerCreatedAt(sub, store, entityId) {
100
101
  var _a;
101
- const aid = (_a = s.getAttrByFwdIdentName(attrsStore, sub.table, 'id')) === null || _a === void 0 ? void 0 : _a.id;
102
+ const aid = (_a = s.getAttrByFwdIdentName(store, sub.table, 'id')) === null || _a === void 0 ? void 0 : _a.id;
102
103
  if (!aid) {
103
104
  return -1;
104
105
  }
@@ -108,26 +109,26 @@ function getServerCreatedAt(sub, store, attrsStore, entityId) {
108
109
  }
109
110
  return t[3];
110
111
  }
111
- function applyChangesToStore(store, attrsStore, changes) {
112
+ function applyChangesToStore(store, changes) {
112
113
  for (const { action, triple } of changes) {
113
114
  switch (action) {
114
115
  case 'added':
115
- s.addTriple(store, attrsStore, triple);
116
+ s.addTriple(store, triple);
116
117
  break;
117
118
  case 'removed':
118
- s.retractTriple(store, attrsStore, triple);
119
+ s.retractTriple(store, triple);
119
120
  break;
120
121
  }
121
122
  }
122
123
  }
123
- function changedFieldsOfChanges(store, attrsStore, changes) {
124
+ function changedFieldsOfChanges(store, changes) {
124
125
  var _a, _b, _c, _d;
125
126
  // This will be more complicated when we include links, we can either add a
126
127
  // changedLinks field or we can have something like 'bookshelves.title`
127
128
  const changedFields = {};
128
129
  for (const { action, triple } of changes) {
129
130
  const [e, a, v] = triple;
130
- const field = (_b = (_a = attrsStore.getAttr(a)) === null || _a === void 0 ? void 0 : _a['forward-identity']) === null || _b === void 0 ? void 0 : _b[2];
131
+ const field = (_b = (_a = store.attrs[a]) === null || _a === void 0 ? void 0 : _a['forward-identity']) === null || _b === void 0 ? void 0 : _b[2];
131
132
  if (!field)
132
133
  continue;
133
134
  const fields = (_c = changedFields[e]) !== null && _c !== void 0 ? _c : {};
@@ -160,14 +161,14 @@ function subData(sub, entities) {
160
161
  // Updates the sub order field type if it hasn't been set
161
162
  // and returns the type. We have to wait until the attrs
162
163
  // are loaded before we can determine the type.
163
- function orderFieldTypeMutative(sub, getAttrs) {
164
+ function orderFieldTypeMutative(sub, createStore) {
164
165
  var _a;
165
166
  if (sub.orderFieldType) {
166
167
  return sub.orderFieldType;
167
168
  }
168
169
  const orderFieldType = sub.orderField === 'serverCreatedAt'
169
170
  ? 'number'
170
- : (_a = s.getAttrByFwdIdentName(getAttrs(), sub.table, sub.orderField)) === null || _a === void 0 ? void 0 : _a['checked-data-type'];
171
+ : (_a = s.getAttrByFwdIdentName(createStore([]), sub.table, sub.orderField)) === null || _a === void 0 ? void 0 : _a['checked-data-type'];
171
172
  sub.orderFieldType = orderFieldType;
172
173
  return orderFieldType;
173
174
  }
@@ -201,7 +202,7 @@ var CallbackEventType;
201
202
  CallbackEventType["Error"] = "Error";
202
203
  })(CallbackEventType || (exports.CallbackEventType = CallbackEventType = {}));
203
204
  class SyncTable {
204
- constructor(trySend, storage, config, log, createStore, getAttrs) {
205
+ constructor(trySend, storage, config, log, createStore) {
205
206
  // Using any for the SyncCallback because we'd need Reactor to be typed
206
207
  this.callbacks = {};
207
208
  this.idToHash = {};
@@ -209,7 +210,6 @@ class SyncTable {
209
210
  this.config = config;
210
211
  this.log = log;
211
212
  this.createStore = createStore;
212
- this.getAttrs = getAttrs;
213
213
  this.subs = new PersistedObject_ts_1.PersistedObject({
214
214
  persister: storage,
215
215
  merge: onMergeSub,
@@ -362,17 +362,18 @@ class SyncTable {
362
362
  }
363
363
  const values = (_a = sub.values) !== null && _a !== void 0 ? _a : {
364
364
  entities: [],
365
- attrsStore: this.getAttrs(),
365
+ attrs: this.createStore([]).attrs,
366
366
  };
367
367
  sub.values = values;
368
368
  const entities = values.entities;
369
369
  for (const entRows of joinRows) {
370
370
  const store = this.createStore(entRows);
371
- const entity = queryEntity(sub, store, values.attrsStore);
371
+ values.attrs = store.attrs;
372
+ const entity = queryEntity(sub, store);
372
373
  entities.push({
373
374
  store,
374
375
  entity,
375
- serverCreatedAt: getServerCreatedAt(sub, store, values.attrsStore, entity.id),
376
+ serverCreatedAt: getServerCreatedAt(sub, store, entity.id),
376
377
  });
377
378
  batch.push(entity);
378
379
  }
@@ -453,7 +454,7 @@ class SyncTable {
453
454
  }
454
455
  const values = (_b = sub.values) !== null && _b !== void 0 ? _b : {
455
456
  entities: [],
456
- attrsStore: this.getAttrs(),
457
+ attrs: this.createStore([]).attrs,
457
458
  };
458
459
  const entities = values.entities;
459
460
  sub.values = values;
@@ -463,9 +464,9 @@ class SyncTable {
463
464
  for (let i = 0; i < entities.length; i++) {
464
465
  const ent = entities[i];
465
466
  if (s.hasEntity(ent.store, eid)) {
466
- applyChangesToStore(ent.store, values.attrsStore, changes);
467
- const entity = queryEntity(sub, ent.store, values.attrsStore);
468
- const changedFields = changedFieldsOfChanges(ent.store, values.attrsStore, changes)[eid];
467
+ applyChangesToStore(ent.store, changes);
468
+ const entity = queryEntity(sub, ent.store);
469
+ const changedFields = changedFieldsOfChanges(ent.store, changes)[eid];
469
470
  if (entity) {
470
471
  updated.push({
471
472
  oldEntity: ent.entity,
@@ -486,8 +487,9 @@ class SyncTable {
486
487
  // If we have anything left in byEid, then this must be a new entity we don't know about
487
488
  for (const [_eid, changes] of Object.entries(byEid)) {
488
489
  const store = this.createStore([]);
489
- applyChangesToStore(store, values.attrsStore, changes);
490
- const entity = queryEntity(sub, store, values.attrsStore);
490
+ values.attrs = store.attrs;
491
+ applyChangesToStore(store, changes);
492
+ const entity = queryEntity(sub, store);
491
493
  if (!entity) {
492
494
  this.log.error('No entity found after applying change', {
493
495
  sub,
@@ -499,7 +501,7 @@ class SyncTable {
499
501
  entities.push({
500
502
  store,
501
503
  entity,
502
- serverCreatedAt: getServerCreatedAt(sub, store, values.attrsStore, entity.id),
504
+ serverCreatedAt: getServerCreatedAt(sub, store, entity.id),
503
505
  });
504
506
  added.push(entity);
505
507
  }
@@ -508,7 +510,7 @@ class SyncTable {
508
510
  removed.push(entities[idx].entity);
509
511
  entities.splice(idx, 1);
510
512
  }
511
- const orderFieldType = orderFieldTypeMutative(sub, this.getAttrs);
513
+ const orderFieldType = orderFieldTypeMutative(sub, this.createStore);
512
514
  sortEntitiesInPlace(sub, orderFieldType, entities);
513
515
  this.notifyCbs(hash, {
514
516
  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"}