@verdant-web/store 5.3.0 → 5.4.2

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 (89) hide show
  1. package/dist/bundle/index.js +8 -8
  2. package/dist/bundle/index.js.map +4 -4
  3. package/dist/esm/__tests__/queries.test.js +35 -0
  4. package/dist/esm/__tests__/queries.test.js.map +1 -1
  5. package/dist/esm/client/Client.js +12 -4
  6. package/dist/esm/client/Client.js.map +1 -1
  7. package/dist/esm/entities/Entity.d.ts +2 -5
  8. package/dist/esm/entities/Entity.js +17 -10
  9. package/dist/esm/entities/Entity.js.map +1 -1
  10. package/dist/esm/entities/EntityMetadata.js +14 -2
  11. package/dist/esm/entities/EntityMetadata.js.map +1 -1
  12. package/dist/esm/entities/EntityStore.js +1 -0
  13. package/dist/esm/entities/EntityStore.js.map +1 -1
  14. package/dist/esm/persistence/MessageCreator.js +1 -1
  15. package/dist/esm/persistence/MessageCreator.js.map +1 -1
  16. package/dist/esm/persistence/PersistenceMetadata.d.ts +6 -1
  17. package/dist/esm/persistence/PersistenceMetadata.js +40 -2
  18. package/dist/esm/persistence/PersistenceMetadata.js.map +1 -1
  19. package/dist/esm/persistence/PersistenceRebaser.js +1 -1
  20. package/dist/esm/persistence/PersistenceRebaser.js.map +1 -1
  21. package/dist/esm/persistence/idb/IdbService.js +1 -1
  22. package/dist/esm/persistence/idb/IdbService.js.map +1 -1
  23. package/dist/esm/persistence/idb/indexNames.d.ts +5 -0
  24. package/dist/esm/persistence/idb/indexNames.js +6 -0
  25. package/dist/esm/persistence/idb/indexNames.js.map +1 -0
  26. package/dist/esm/persistence/idb/metadata/IdbMetadataDb.d.ts +6 -3
  27. package/dist/esm/persistence/idb/metadata/IdbMetadataDb.js +33 -8
  28. package/dist/esm/persistence/idb/metadata/IdbMetadataDb.js.map +1 -1
  29. package/dist/esm/persistence/idb/metadata/openMetadataDatabase.js +5 -5
  30. package/dist/esm/persistence/idb/metadata/openMetadataDatabase.js.map +1 -1
  31. package/dist/esm/persistence/idb/queries/ranges.js +3 -4
  32. package/dist/esm/persistence/idb/queries/ranges.js.map +1 -1
  33. package/dist/esm/persistence/interfaces.d.ts +2 -0
  34. package/dist/esm/persistence/migration/engine.js +3 -4
  35. package/dist/esm/persistence/migration/engine.js.map +1 -1
  36. package/dist/esm/queries/BaseQuery.d.ts +6 -0
  37. package/dist/esm/queries/BaseQuery.js +39 -5
  38. package/dist/esm/queries/BaseQuery.js.map +1 -1
  39. package/dist/esm/queries/CollectionQueries.d.ts +8 -7
  40. package/dist/esm/queries/CollectionQueries.js +8 -6
  41. package/dist/esm/queries/CollectionQueries.js.map +1 -1
  42. package/dist/esm/queries/FindAllQuery.d.ts +3 -1
  43. package/dist/esm/queries/FindAllQuery.js +6 -4
  44. package/dist/esm/queries/FindAllQuery.js.map +1 -1
  45. package/dist/esm/queries/FindInfiniteQuery.js +6 -6
  46. package/dist/esm/queries/FindInfiniteQuery.js.map +1 -1
  47. package/dist/esm/queries/FindOneQuery.js +3 -3
  48. package/dist/esm/queries/FindOneQuery.js.map +1 -1
  49. package/dist/esm/queries/FindPageQuery.js +3 -3
  50. package/dist/esm/queries/FindPageQuery.js.map +1 -1
  51. package/dist/esm/queries/GetQuery.js +1 -1
  52. package/dist/esm/queries/GetQuery.js.map +1 -1
  53. package/dist/esm/queries/QueryCache.d.ts +4 -1
  54. package/dist/esm/queries/QueryCache.js +15 -1
  55. package/dist/esm/queries/QueryCache.js.map +1 -1
  56. package/dist/esm/queries/diagnostics.d.ts +19 -0
  57. package/dist/esm/queries/diagnostics.js +11 -0
  58. package/dist/esm/queries/diagnostics.js.map +1 -0
  59. package/dist/esm/queries/ranges.js +3 -4
  60. package/dist/esm/queries/ranges.js.map +1 -1
  61. package/dist/esm/sync/WebSocketSync.js +4 -2
  62. package/dist/esm/sync/WebSocketSync.js.map +1 -1
  63. package/package.json +7 -2
  64. package/src/__tests__/queries.test.ts +42 -0
  65. package/src/client/Client.ts +15 -4
  66. package/src/entities/Entity.ts +31 -22
  67. package/src/entities/EntityMetadata.ts +15 -3
  68. package/src/entities/EntityStore.ts +1 -0
  69. package/src/persistence/MessageCreator.ts +1 -1
  70. package/src/persistence/PersistenceMetadata.ts +67 -7
  71. package/src/persistence/PersistenceRebaser.ts +1 -1
  72. package/src/persistence/idb/IdbService.ts +1 -1
  73. package/src/persistence/idb/indexNames.ts +5 -0
  74. package/src/persistence/idb/metadata/IdbMetadataDb.ts +71 -14
  75. package/src/persistence/idb/metadata/openMetadataDatabase.ts +15 -7
  76. package/src/persistence/idb/queries/ranges.ts +2 -3
  77. package/src/persistence/interfaces.ts +5 -1
  78. package/src/persistence/migration/engine.ts +3 -4
  79. package/src/queries/BaseQuery.ts +41 -5
  80. package/src/queries/CollectionQueries.ts +12 -9
  81. package/src/queries/FindAllQuery.ts +14 -7
  82. package/src/queries/FindInfiniteQuery.ts +22 -18
  83. package/src/queries/FindOneQuery.ts +9 -7
  84. package/src/queries/FindPageQuery.ts +11 -9
  85. package/src/queries/GetQuery.ts +1 -1
  86. package/src/queries/QueryCache.ts +19 -2
  87. package/src/queries/diagnostics.ts +32 -0
  88. package/src/queries/ranges.ts +2 -3
  89. package/src/sync/WebSocketSync.ts +2 -0
@@ -0,0 +1,11 @@
1
+ import { Entity } from '../entities/Entity.js';
2
+ export const getDiagnosticResult = (value) => {
3
+ if (Array.isArray(value)) {
4
+ return value.map(getDiagnosticResult);
5
+ }
6
+ if (value instanceof Entity) {
7
+ return value.getSnapshot();
8
+ }
9
+ return value;
10
+ };
11
+ //# sourceMappingURL=diagnostics.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diagnostics.js","sourceRoot":"","sources":["../../../src/queries/diagnostics.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAuB/C,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,KAAc,EAAW,EAAE;IAC9D,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QAC1B,OAAO,KAAK,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC;IACvC,CAAC;IACD,IAAI,KAAK,YAAY,MAAM,EAAE,CAAC;QAC7B,OAAO,KAAK,CAAC,WAAW,EAAE,CAAC;IAC5B,CAAC;IACD,OAAO,KAAK,CAAC;AACd,CAAC,CAAC"}
@@ -21,12 +21,11 @@ const rangeIndexToIdbKeyRange = (filter) => {
21
21
  return IDBKeyRange.bound(sanitizeIndexValue(lower), sanitizeIndexValue(upper), !!filter.gt, !!filter.lt);
22
22
  }
23
23
  };
24
- const compoundIndexToIdbKeyRange = (
25
- // FIXME:
26
- schema, collection, filter) => {
24
+ const compoundIndexToIdbKeyRange = (schema, collection, filter) => {
25
+ var _a;
27
26
  // validate the usage of the compound index:
28
27
  // - all match fields must be contiguous at the start of the compound order
29
- const indexDefinition = schema.collections[collection].compounds[filter.where];
28
+ const indexDefinition = (_a = schema.collections[collection].compounds) === null || _a === void 0 ? void 0 : _a[filter.where];
30
29
  assert(indexDefinition, `Index ${filter.where} does not exist on collection ${collection}`);
31
30
  const matchedKeys = Object.keys(filter.match).sort((a, b) => indexDefinition.of.indexOf(a) - indexDefinition.of.indexOf(b));
32
31
  for (const key of matchedKeys) {
@@ -1 +1 @@
1
- {"version":3,"file":"ranges.js","sourceRoot":"","sources":["../../../src/queries/ranges.ts"],"names":[],"mappings":"AAAA,OAAO,EACN,MAAM,EAGN,wBAAwB,EACxB,0BAA0B,EAC1B,0BAA0B,EAC1B,kBAAkB,EAClB,kBAAkB,EAClB,iBAAiB,EACjB,uBAAuB,EAGvB,kBAAkB,GAIlB,MAAM,qBAAqB,CAAC;AAE7B,MAAM,uBAAuB,GAAG,CAAC,MAAkC,EAAE,EAAE;IACtE,OAAO,WAAW,CAAC,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC;AAC5D,CAAC,CAAC;AAEF,MAAM,sBAAsB,GAAG,CAAC,MAAuB,EAAE,EAAE;IAC1D,OAAO,SAAS,CAAC;AAClB,CAAC,CAAC;AAEF,MAAM,uBAAuB,GAAG,CAAC,MAAkC,EAAE,EAAE;IACtE,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,IAAI,MAAM,CAAC,EAAE,CAAC;IACtC,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,IAAI,MAAM,CAAC,EAAE,CAAC;IACtC,IAAI,KAAK,KAAK,KAAK,EAAE,CAAC;QACrB,OAAO,WAAW,CAAC,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC,CAAC;IACpD,CAAC;IACD,IAAI,CAAC,KAAK,EAAE,CAAC;QACZ,OAAO,WAAW,CAAC,UAAU,CAAC,kBAAkB,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IACvE,CAAC;SAAM,IAAI,CAAC,KAAK,EAAE,CAAC;QACnB,OAAO,WAAW,CAAC,UAAU,CAAC,kBAAkB,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IACvE,CAAC;SAAM,CAAC;QACP,OAAO,WAAW,CAAC,KAAK,CACvB,kBAAkB,CAAC,KAAK,CAAC,EACzB,kBAAkB,CAAC,KAAK,CAAC,EACzB,CAAC,CAAC,MAAM,CAAC,EAAE,EACX,CAAC,CAAC,MAAM,CAAC,EAAE,CACX,CAAC;IACH,CAAC;AACF,CAAC,CAAC;AAEF,MAAM,0BAA0B,GAAG;AAClC,SAAS;AACT,MAAW,EACX,UAAkB,EAClB,MAAqC,EACpC,EAAE;IACH,4CAA4C;IAC5C,2EAA2E;IAC3E,MAAM,eAAe,GACpB,MAAM,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACxD,MAAM,CACL,eAAe,EACf,SAAS,MAAM,CAAC,KAAK,iCAAiC,UAAU,EAAE,CAClE,CAAC;IACF,MAAM,WAAW,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CACjD,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,eAAe,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,eAAe,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,CACvE,CAAC;IACF,KAAK,MAAM,GAAG,IAAI,WAAW,EAAE,CAAC;QAC/B,IAAI,eAAe,CAAC,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,WAAW,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;YAClE,MAAM,IAAI,KAAK,CACd,kBAAkB,MAAM,CAAC,KAAK,kBAAkB,GAAG,4BAA4B,CAC/E,CAAC;QACH,CAAC;IACF,CAAC;IAED,MAAM,aAAa,GAAG,WAAW,CAAC,GAAG,CACpC,CAAC,GAAG,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,GAAgC,CAAoB,CAC1E,CAAC;IAEF,uEAAuE;IACvE,iCAAiC;IACjC,IAAI,WAAW,CAAC,MAAM,KAAK,eAAe,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC;QACtD,OAAO,WAAW,CAAC,IAAI,CAAC,wBAAwB,CAAC,GAAG,aAAa,CAAC,CAAC,CAAC;IACrE,CAAC;IAED,2CAA2C;IAC3C,MAAM,KAAK,GAAG,0BAA0B,CAAC,GAAG,aAAa,CAAC,CAAC;IAC3D,MAAM,KAAK,GAAG,0BAA0B,CAAC,GAAG,aAAa,CAAC,CAAC;IAC3D,OAAO,WAAW,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;AACxC,CAAC,CAAC;AAEF,SAAS,4BAA4B,CAAC,MAA6B;IAClE,MAAM,KAAK,GAAG,MAAM,CAAC,UAAU,CAAC;IAChC,MAAM,KAAK,GAAG,MAAM,CAAC,UAAU,GAAG,QAAQ,CAAC;IAC3C,OAAO,WAAW,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;AACxC,CAAC;AAED,MAAM,UAAU,QAAQ,CACvB,MAAqB,EACrB,UAAkB,EAClB,KAAwB;IAExB,IAAI,CAAC,KAAK;QAAE,OAAO,SAAS,CAAC;IAC7B,IAAI,kBAAkB,CAAC,KAAK,CAAC;QAAE,OAAO,uBAAuB,CAAC,KAAK,CAAC,CAAC;IACrE,IAAI,kBAAkB,CAAC,KAAK,CAAC;QAAE,OAAO,uBAAuB,CAAC,KAAK,CAAC,CAAC;IACrE,IAAI,iBAAiB,CAAC,KAAK,CAAC;QAAE,OAAO,sBAAsB,CAAC,KAAK,CAAC,CAAC;IACnE,IAAI,uBAAuB,CAAC,KAAK,CAAC;QACjC,OAAO,4BAA4B,CAAC,KAAK,CAAC,CAAC;IAC5C,OAAO,0BAA0B,CAAC,MAAM,EAAE,UAAU,EAAE,KAAK,CAAC,CAAC;AAC9D,CAAC"}
1
+ {"version":3,"file":"ranges.js","sourceRoot":"","sources":["../../../src/queries/ranges.ts"],"names":[],"mappings":"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"}
@@ -208,11 +208,13 @@ export class WebSocketSync extends EventSubscriber {
208
208
  this._status = 'active';
209
209
  };
210
210
  this.stop = async () => {
211
- var _a, _b, _c;
211
+ var _a, _b, _c, _d, _e;
212
212
  await this.sendDisconnecting();
213
213
  (_a = this.socket) === null || _a === void 0 ? void 0 : _a.removeEventListener('message', this.onMessage);
214
214
  (_b = this.socket) === null || _b === void 0 ? void 0 : _b.removeEventListener('close', this.onClose);
215
- if (((_c = this.socket) === null || _c === void 0 ? void 0 : _c.readyState) === WEBSOCKET_OPEN) {
215
+ (_c = this.socket) === null || _c === void 0 ? void 0 : _c.removeEventListener('error', this.onError);
216
+ (_d = this.socket) === null || _d === void 0 ? void 0 : _d.removeEventListener('open', this.onOpen);
217
+ if (((_e = this.socket) === null || _e === void 0 ? void 0 : _e.readyState) === WEBSOCKET_OPEN) {
216
218
  this.socket.close();
217
219
  }
218
220
  this.socket = null;
@@ -1 +1 @@
1
- {"version":3,"file":"WebSocketSync.js","sourceRoot":"","sources":["../../../src/sync/WebSocketSync.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"WebSocketSync.js","sourceRoot":"","sources":["../../../src/sync/WebSocketSync.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@verdant-web/store",
3
- "version": "5.3.0",
3
+ "version": "5.4.2",
4
4
  "access": "public",
5
5
  "type": "module",
6
6
  "main": "dist/esm/index.js",
@@ -25,6 +25,11 @@
25
25
  "publishConfig": {
26
26
  "access": "public"
27
27
  },
28
+ "repository": {
29
+ "url": "https://github.com/a-type/verdant",
30
+ "directory": "packages/store",
31
+ "type": "git"
32
+ },
28
33
  "files": [
29
34
  "dist/",
30
35
  "src/"
@@ -34,7 +39,7 @@
34
39
  "jszip": "^3.10.1",
35
40
  "jwt-decode": "^3.1.2",
36
41
  "weak-event": "^2.0.5",
37
- "@verdant-web/common": "3.2.0"
42
+ "@verdant-web/common": "3.2.1"
38
43
  },
39
44
  "devDependencies": {
40
45
  "@types/node": "20.10.5",
@@ -76,6 +76,25 @@ describe('storage queries', () => {
76
76
  expect(results.map((i: any) => i.get('id'))).toEqual([items[3].get('id')]);
77
77
  });
78
78
 
79
+ it('exposes query diagnostics with result data and phase timings', async () => {
80
+ const storage = createTestStorage();
81
+ await storage.todos.put({ id: '1', content: 'item' });
82
+
83
+ await storage.todos.findAll().resolved;
84
+
85
+ const diagnostics = storage.queries.diagnostics.queries;
86
+ expect(diagnostics).toHaveLength(1);
87
+ expect(diagnostics[0]).toMatchObject({
88
+ key: 'findAll:todos:undefined:',
89
+ collection: 'todos',
90
+ type: 'FindAllQuery',
91
+ active: true,
92
+ result: [{ id: '1', content: 'item' }],
93
+ });
94
+ expect(diagnostics[0].timing.sweep).toBeTypeOf('number');
95
+ expect(diagnostics[0].timing.hydration).toBeTypeOf('number');
96
+ });
97
+
79
98
  it('can query simple compound indexes by match and order', async () => {
80
99
  const storage = createTestStorage();
81
100
 
@@ -123,6 +142,29 @@ describe('storage queries', () => {
123
142
  ]);
124
143
  });
125
144
 
145
+ it('can limit query results of find all queries', async () => {
146
+ const storage = await createTestStorage();
147
+
148
+ const items = await addTestingItems(storage);
149
+
150
+ const query = storage.todos.findAll({
151
+ index: {
152
+ where: 'categorySortedByDone',
153
+ match: {
154
+ category: 'general',
155
+ },
156
+ order: 'asc',
157
+ },
158
+ limit: 2,
159
+ });
160
+ const results = await query.resolved;
161
+
162
+ expect(results.map((i: any) => i.get('id'))).toEqual([
163
+ items[0].get('id'),
164
+ items[2].get('id'),
165
+ ]);
166
+ });
167
+
126
168
  it('can query starts-with on a string', async () => {
127
169
  const storage = createTestStorage();
128
170
  const items = await addTestingItems(storage);
@@ -101,10 +101,8 @@ export class Client<Presence = any, Profile = any> extends EventSubscriber<{
101
101
  ctx: this.context,
102
102
  files: this._fileManager,
103
103
  });
104
- // note: query cache must be initialized after EntityStore,
105
- // since EntityStore needs to clear its cache before queries
106
- // refresh.
107
- // FIXME: make this less fragile
104
+ // note: historically querycache needed to be constructed after entities,
105
+ // not sure if this is still the case.
108
106
  this._queryCache = new QueryCache({
109
107
  context: this.context,
110
108
  evictionTime: this.context.config.queries?.evictionTime,
@@ -142,6 +140,11 @@ export class Client<Presence = any, Profile = any> extends EventSubscriber<{
142
140
  documentManager: this.documentManager,
143
141
  });
144
142
  }
143
+
144
+ if (typeof window !== 'undefined') {
145
+ (window as Window & { __VERDANT_CLIENT__?: Client }).__VERDANT_CLIENT__ =
146
+ this;
147
+ }
145
148
  }
146
149
 
147
150
  private importingPromise = Promise.resolve();
@@ -325,6 +328,14 @@ export class Client<Presence = any, Profile = any> extends EventSubscriber<{
325
328
  this.context.persistenceShutdownHandler.shutdown();
326
329
  this.context.internalEvents.disable();
327
330
  this.context.entityEvents.disable();
331
+ if (typeof window !== 'undefined') {
332
+ const browserWindow = window as Window & {
333
+ __VERDANT_CLIENT__?: Client;
334
+ };
335
+ if (browserWindow.__VERDANT_CLIENT__ === this) {
336
+ delete browserWindow.__VERDANT_CLIENT__;
337
+ }
338
+ }
328
339
 
329
340
  // the idea here is to flush the microtask queue -
330
341
  // we may have queued tasks related to queries that
@@ -103,6 +103,9 @@ export class Entity<
103
103
  // provided from external creators, this is a method to delete
104
104
  // this entity.
105
105
  private _deleteSelf: () => void;
106
+ // set manually when deleting the entity, this silences pruning warnings
107
+ // for missing data while the deletion is being processed.
108
+ private _deleting = false;
106
109
 
107
110
  constructor({
108
111
  oid,
@@ -239,13 +242,15 @@ export class Entity<
239
242
  for (let i = 0; i < rawView.length; i++) {
240
243
  const child = this.get(i);
241
244
  if (this.childIsNull(child) && !isNullable(schema)) {
242
- this.ctx.log(
243
- 'error',
244
- 'Child missing in non-nullable field',
245
- this.oid,
246
- 'index:',
247
- i,
248
- );
245
+ if (!this._deleting) {
246
+ this.ctx.log(
247
+ 'error',
248
+ 'Child missing in non-nullable field',
249
+ this.oid,
250
+ 'index:',
251
+ i,
252
+ );
253
+ }
249
254
 
250
255
  // this item will be pruned.
251
256
  } else {
@@ -286,13 +291,15 @@ export class Entity<
286
291
  }
287
292
  const child = this.get(key as any);
288
293
  if (this.childIsNull(child) && !isNullable(schema)) {
289
- this.ctx.log(
290
- 'error',
291
- 'Child entity is missing for non-nullable field',
292
- this.oid,
293
- 'key:',
294
- key,
295
- );
294
+ if (!this._deleting) {
295
+ this.ctx.log(
296
+ 'error',
297
+ 'Child entity is missing for non-nullable field',
298
+ this.oid,
299
+ 'key:',
300
+ key,
301
+ );
302
+ }
296
303
  if (this.schema.type !== 'map') {
297
304
  /**
298
305
  * PRUNE - this is a prune point. we can't continue
@@ -334,14 +341,6 @@ export class Entity<
334
341
  return this.viewData.deleted || this.view === null;
335
342
  }
336
343
 
337
- /**
338
- * Doesn't compute view data; simply uses available cached
339
- * view info to determine deletion status.
340
- */
341
- private get quickDeleted() {
342
- return this._viewData?.deleted || this.cachedView === null;
343
- }
344
-
345
344
  get invalid() {
346
345
  return !!this.validate();
347
346
  }
@@ -603,6 +602,12 @@ export class Entity<
603
602
  if (this.access) {
604
603
  for (const op of operations) {
605
604
  op.authz = this.access;
605
+
606
+ // if op is init, reset _deleting flag - this is not a functional flag, only
607
+ // hides some warnings. if we're here, we must be re-initializing and we can reset it.
608
+ if (op.data.op === 'initialize') {
609
+ this._deleting = false;
610
+ }
606
611
  }
607
612
  }
608
613
 
@@ -1397,6 +1402,10 @@ export class Entity<
1397
1402
  this.metadataFamily.discardPendingOperation(operation);
1398
1403
  this.invalidateCachedView();
1399
1404
  };
1405
+
1406
+ __markDeleting__ = () => {
1407
+ this._deleting = true;
1408
+ };
1400
1409
  }
1401
1410
 
1402
1411
  function assertNotSymbol<T>(key: T): asserts key is Exclude<T, symbol> {
@@ -37,6 +37,10 @@ export class EntityMetadata {
37
37
  // soon as the user makes modifications to the entity, this
38
38
  // ephemeral pruned data is applied underneath it.
39
39
  private ephemeralOperations?: Operation[] = [];
40
+ // pending operations are 'in flight' into persistence, but
41
+ // if you killed the power now they'd be lost. they don't have an
42
+ // officially applied timestamp yet either, so they are applied
43
+ // last, after all confirmed/ephemerals.
40
44
  private pendingOperations: Operation[] = [];
41
45
  readonly oid;
42
46
 
@@ -209,7 +213,6 @@ export class EntityMetadata {
209
213
  this.confirmedOperations.push(op);
210
214
  totalAdded++;
211
215
  }
212
- // FIXME: seems inefficient
213
216
  // remove this incoming op from pending if it's in there
214
217
  const pendingPrior = this.pendingOperations.length;
215
218
  this.discardPendingOperation(op);
@@ -235,10 +238,19 @@ export class EntityMetadata {
235
238
  return old;
236
239
  };
237
240
 
241
+ // while this may not be the most efficient way to remove an operation,
242
+ // in practice the ops we discard are generally some of the first in
243
+ // the list, so the find is quick.
238
244
  discardPendingOperation = (operation: Operation) => {
239
- this.pendingOperations = this.pendingOperations.filter(
240
- (op) => op.timestamp !== operation.timestamp,
245
+ // only one op can match, so - avoiding filter() here,
246
+ // we want short circuiting.
247
+ const indexOfOperation = this.pendingOperations.findIndex(
248
+ (op) => op.timestamp === operation.timestamp,
241
249
  );
250
+ if (indexOfOperation === -1) {
251
+ return;
252
+ }
253
+ this.pendingOperations.splice(indexOfOperation, 1);
242
254
  };
243
255
 
244
256
  private applyOperations = (
@@ -414,6 +414,7 @@ export class EntityStore extends Disposable {
414
414
  op.authz = entity.access;
415
415
  }
416
416
  operations.push(...deletes);
417
+ entity.__markDeleting__();
417
418
  }
418
419
  }
419
420
 
@@ -59,7 +59,7 @@ export class MessageCreator {
59
59
  storeNames: ['operations', 'baselines'],
60
60
  },
61
61
  async (tx) => {
62
- // FIXME: this branch gives bad vibes. should we always
62
+ // TODO: this branch gives bad vibes. should we always
63
63
  // send all operations from other replicas too? is there
64
64
  // ever a case where we have a "since" timestamp and there
65
65
  // are foreign ops that match it?
@@ -2,6 +2,7 @@ import {
2
2
  applyPatch,
3
3
  assert,
4
4
  assignOid,
5
+ decomposeOid,
5
6
  DocumentBaseline,
6
7
  getOidRoot,
7
8
  ObjectIdentifier,
@@ -293,15 +294,31 @@ export class PersistenceMetadata {
293
294
  );
294
295
  };
295
296
 
297
+ // worst case of this is rather expensive but currently only used for migration
298
+ // and deletion. if usage is expanded, consider caching...
296
299
  getDocumentAuthz = async (oid: ObjectIdentifier) => {
297
300
  let authz;
298
- await this.db.iterateEntityOperations(oid, (op) => {
299
- if (op.data.op === 'initialize') {
300
- authz = op.authz;
301
- return true;
302
- }
303
- });
304
- return authz;
301
+
302
+ // find the latest initialize op - this is most up to date authz.
303
+ await this.db.iterateEntityOperations(
304
+ oid,
305
+ (op) => {
306
+ if (op.data.op === 'initialize') {
307
+ authz = op.authz;
308
+ return true;
309
+ }
310
+ },
311
+ {
312
+ reverse: true,
313
+ },
314
+ );
315
+
316
+ // found initialize, this is the answer.
317
+ if (authz) return authz;
318
+
319
+ // all initialize ops may have been rebased, in which case we use the baseline.
320
+ const baseline = await this.db.getBaseline(oid);
321
+ return baseline?.authz;
305
322
  };
306
323
 
307
324
  insertData = async (
@@ -512,4 +529,47 @@ export class PersistenceMetadata {
512
529
  this.updateLocalReplica({ ackedLogicalTime: timestamp });
513
530
  }
514
531
  };
532
+
533
+ // upkeep - not called automatically as of today
534
+
535
+ /**
536
+ * Removes all metadata entries related to collections which are no
537
+ * longer present in the schema.
538
+ */
539
+ __unstable__purgeRemovedCollections = async () => {
540
+ const schema = this.ctx.schema;
541
+ const collectionsInSchema = new Set(Object.keys(schema.collections));
542
+ const oidsToPurge = new Set<ObjectIdentifier>();
543
+ await this.db.iterateAllBaselines((baseline) => {
544
+ const { collection } = decomposeOid(baseline.oid);
545
+ if (!collectionsInSchema.has(collection)) {
546
+ this.ctx.log(
547
+ 'debug',
548
+ `Deleting baseline for removed collection ${collection}`,
549
+ baseline.oid,
550
+ );
551
+ oidsToPurge.add(baseline.oid);
552
+ }
553
+ });
554
+ await this.db.iterateAllOperations((op) => {
555
+ const { collection } = decomposeOid(op.oid);
556
+ if (!collectionsInSchema.has(collection)) {
557
+ this.ctx.log(
558
+ 'debug',
559
+ `Deleting operation for removed collection ${collection}`,
560
+ op.oid,
561
+ );
562
+ oidsToPurge.add(op.oid);
563
+ }
564
+ });
565
+
566
+ for (const oid of oidsToPurge) {
567
+ await this.db.purgeDocumentData(oid);
568
+ }
569
+
570
+ this.ctx.log(
571
+ 'debug',
572
+ `Purged ${oidsToPurge.size} document metadata groups for removed collections`,
573
+ );
574
+ };
515
575
  }
@@ -136,7 +136,7 @@ export class PersistenceRebaser {
136
136
  await this.db.iterateEntityOperations(
137
137
  oid,
138
138
  (patch) => {
139
- // FIXME: this seems like the wrong place to do this
139
+ // seems like the wrong place to do this
140
140
  // but it's here as a safety measure...
141
141
  if (!baseline || patch.timestamp > baseline.timestamp) {
142
142
  current = applyPatch(current, patch.data, deletedRefs);
@@ -18,7 +18,7 @@ export class IdbService extends Disposable {
18
18
  super();
19
19
  const abortController = new AbortController();
20
20
  this.globalAbortController = abortController;
21
- // FIXME: replace with event? I can't get this to work.
21
+ // TODO: replace with event? I can't get this to work. (Illegal invocation on abort?)
22
22
  // this.addDispose(abort);
23
23
  this.db.addEventListener('versionchange', this.onVersionChange);
24
24
  this.addDispose(() => {
@@ -0,0 +1,5 @@
1
+ export const OPERATION_INDEX_NAMES = {
2
+ IS_LOCAL__TIMESTAMP: 'l_t',
3
+ ROOT_OID__TIMESTAMP: 'd_t',
4
+ OID__TIMESTAMP: 'oid_timestamp', // never got migrated to o_t because it's the primary key
5
+ } as const;
@@ -3,7 +3,6 @@ import {
3
3
  createLowerBoundIndexValue,
4
4
  createUpperBoundIndexValue,
5
5
  DocumentBaseline,
6
- getLegacyDotOidSubIdRange,
7
6
  getOidRoot,
8
7
  getOidSubIdRange,
9
8
  ObjectIdentifier,
@@ -19,13 +18,14 @@ import {
19
18
  PersistenceMetadataDb,
20
19
  } from '../../interfaces.js';
21
20
  import { IdbService } from '../IdbService.js';
21
+ import { OPERATION_INDEX_NAMES } from '../indexNames.js';
22
22
  import { closeDatabase, getSizeOfObjectStore } from '../util.js';
23
23
 
24
24
  export type StoredClientOperation = ClientOperation & {
25
25
  /** This acts as the primary key */
26
- oid_timestamp: string;
27
- l_t: string;
28
- d_t: string;
26
+ [OPERATION_INDEX_NAMES.OID__TIMESTAMP]: string;
27
+ [OPERATION_INDEX_NAMES.IS_LOCAL__TIMESTAMP]: string;
28
+ [OPERATION_INDEX_NAMES.ROOT_OID__TIMESTAMP]: string;
29
29
  };
30
30
 
31
31
  export type StoredSchema = {
@@ -123,12 +123,9 @@ export class IdbMetadataDb
123
123
  (store) => {
124
124
  const root = getOidRoot(rootOid);
125
125
  const [start, end] = getOidSubIdRange(rootOid);
126
- // FIXME: get rid of legacy dot OIDs...
127
- const [dotStart, dotEnd] = getLegacyDotOidSubIdRange(rootOid);
128
126
  return [
129
127
  store.openCursor(IDBKeyRange.only(root)),
130
128
  store.openCursor(IDBKeyRange.bound(start, end, false, false)),
131
- store.openCursor(IDBKeyRange.bound(dotStart, dotEnd, false, false)),
132
129
  ];
133
130
  },
134
131
  iterator,
@@ -204,7 +201,7 @@ export class IdbMetadataDb
204
201
  return this.iterate<StoredClientOperation>(
205
202
  'operations',
206
203
  (store) => {
207
- const index = store.index('d_t');
204
+ const index = store.index(OPERATION_INDEX_NAMES.ROOT_OID__TIMESTAMP);
208
205
  const start = createLowerBoundIndexValue(rootOid);
209
206
  const end = opts?.to
210
207
  ? createCompoundIndexValue(rootOid, opts.to)
@@ -221,7 +218,7 @@ export class IdbMetadataDb
221
218
  iterateEntityOperations = (
222
219
  oid: string,
223
220
  iterator: (op: StoredClientOperation) => void,
224
- opts?: CommonQueryOptions & { to?: string | null },
221
+ opts?: CommonQueryOptions & { to?: string | null; reverse?: boolean },
225
222
  ): Promise<void> => {
226
223
  // NOTE: this is simplified from original impl.
227
224
  // perhaps I missed some nuance as to why it was
@@ -236,7 +233,7 @@ export class IdbMetadataDb
236
233
  : createUpperBoundIndexValue(oid);
237
234
 
238
235
  const range = IDBKeyRange.bound(start, end, false, false);
239
- return store.openCursor(range);
236
+ return store.openCursor(range, opts?.reverse ? 'prev' : 'next');
240
237
  },
241
238
  iterator,
242
239
  opts,
@@ -296,7 +293,7 @@ export class IdbMetadataDb
296
293
  ? createCompoundIndexValue(true, opts.after)
297
294
  : createLowerBoundIndexValue(true);
298
295
  const end = createUpperBoundIndexValue(true);
299
- const index = store.index('l_t');
296
+ const index = store.index(OPERATION_INDEX_NAMES.IS_LOCAL__TIMESTAMP);
300
297
  return index.openCursor(
301
298
  // NOTE: differs from original impl -- last arg is 'false' instead of 'true'
302
299
  IDBKeyRange.bound(start, end, !!opts?.after, false),
@@ -425,11 +422,71 @@ export class IdbMetadataDb
425
422
  ): StoredClientOperation => {
426
423
  return {
427
424
  ...op,
428
- oid_timestamp: createCompoundIndexValue(op.oid, op.timestamp) as string,
429
- l_t: createCompoundIndexValue(op.isLocal, op.timestamp) as string,
430
- d_t: createCompoundIndexValue(getOidRoot(op.oid), op.timestamp) as string,
425
+ [OPERATION_INDEX_NAMES.OID__TIMESTAMP]: createCompoundIndexValue(
426
+ op.oid,
427
+ op.timestamp,
428
+ ) as string,
429
+ [OPERATION_INDEX_NAMES.IS_LOCAL__TIMESTAMP]: createCompoundIndexValue(
430
+ op.isLocal,
431
+ op.timestamp,
432
+ ) as string,
433
+ [OPERATION_INDEX_NAMES.ROOT_OID__TIMESTAMP]: createCompoundIndexValue(
434
+ getOidRoot(op.oid),
435
+ op.timestamp,
436
+ ) as string,
431
437
  };
432
438
  };
439
+
440
+ purgeDocumentData(
441
+ oid: ObjectIdentifier,
442
+ opts?: CommonQueryOptions<IDBTransaction> | undefined,
443
+ ): Promise<void> {
444
+ const rootOid = getOidRoot(oid);
445
+ const tx = opts?.transaction as IDBTransaction | undefined;
446
+
447
+ return this.transaction(
448
+ {
449
+ mode: 'readwrite',
450
+ storeNames: ['baselines', 'operations'],
451
+ },
452
+ async (ownedTx) => {
453
+ const transaction = tx ?? ownedTx;
454
+
455
+ await this.iterate<DocumentBaseline>(
456
+ 'baselines',
457
+ (store) => {
458
+ const [start, end] = getOidSubIdRange(rootOid);
459
+ return [
460
+ store.openCursor(IDBKeyRange.only(rootOid)),
461
+ store.openCursor(IDBKeyRange.bound(start, end, false, false)),
462
+ ];
463
+ },
464
+ (baseline, store) => {
465
+ store.delete(baseline.oid);
466
+ },
467
+ { mode: 'readwrite', transaction },
468
+ );
469
+
470
+ await this.iterate<StoredClientOperation>(
471
+ 'operations',
472
+ (store) => {
473
+ const index = store.index(
474
+ OPERATION_INDEX_NAMES.ROOT_OID__TIMESTAMP,
475
+ );
476
+ const start = createLowerBoundIndexValue(rootOid);
477
+ const end = createUpperBoundIndexValue(rootOid);
478
+ return index.openCursor(
479
+ IDBKeyRange.bound(start, end, false, false),
480
+ );
481
+ },
482
+ (op, store) => {
483
+ store.delete(op[OPERATION_INDEX_NAMES.OID__TIMESTAMP]);
484
+ },
485
+ { mode: 'readwrite', transaction },
486
+ );
487
+ },
488
+ );
489
+ }
433
490
  }
434
491
 
435
492
  const writeOpts = { mode: 'readwrite' } as const;