@verdant-web/store 4.0.0 → 4.1.0-alpha.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 (173) hide show
  1. package/LICENSE +21 -650
  2. package/dist/bundle/index.js +11 -11
  3. package/dist/bundle/index.js.map +4 -4
  4. package/dist/esm/__tests__/fixtures/testStorage.d.ts +1 -2
  5. package/dist/esm/__tests__/fixtures/testStorage.js +3 -5
  6. package/dist/esm/__tests__/fixtures/testStorage.js.map +1 -1
  7. package/dist/esm/client/Client.d.ts +6 -2
  8. package/dist/esm/client/Client.js +18 -6
  9. package/dist/esm/client/Client.js.map +1 -1
  10. package/dist/esm/client/ClientDescriptor.d.ts +7 -5
  11. package/dist/esm/client/ClientDescriptor.js +18 -4
  12. package/dist/esm/client/ClientDescriptor.js.map +1 -1
  13. package/dist/esm/context/ShutdownHandler.d.ts +8 -0
  14. package/dist/esm/context/ShutdownHandler.js +24 -0
  15. package/dist/esm/context/ShutdownHandler.js.map +1 -0
  16. package/dist/esm/context/context.d.ts +15 -4
  17. package/dist/esm/entities/EntityStore.js +6 -3
  18. package/dist/esm/entities/EntityStore.js.map +1 -1
  19. package/dist/esm/files/EntityFile.d.ts +1 -0
  20. package/dist/esm/files/EntityFile.js +16 -11
  21. package/dist/esm/files/EntityFile.js.map +1 -1
  22. package/dist/esm/files/FileManager.d.ts +1 -3
  23. package/dist/esm/files/FileManager.js +12 -10
  24. package/dist/esm/files/FileManager.js.map +1 -1
  25. package/dist/esm/index.d.ts +4 -5
  26. package/dist/esm/index.js +2 -3
  27. package/dist/esm/index.js.map +1 -1
  28. package/dist/esm/internal.d.ts +6 -0
  29. package/dist/esm/internal.js +5 -0
  30. package/dist/esm/internal.js.map +1 -0
  31. package/dist/esm/persistence/MessageCreator.d.ts +3 -1
  32. package/dist/esm/persistence/MessageCreator.js +58 -55
  33. package/dist/esm/persistence/MessageCreator.js.map +1 -1
  34. package/dist/esm/persistence/PersistenceFiles.d.ts +8 -21
  35. package/dist/esm/persistence/PersistenceFiles.js +44 -30
  36. package/dist/esm/persistence/PersistenceFiles.js.map +1 -1
  37. package/dist/esm/persistence/PersistenceMetadata.d.ts +12 -11
  38. package/dist/esm/persistence/PersistenceMetadata.js +201 -137
  39. package/dist/esm/persistence/PersistenceMetadata.js.map +1 -1
  40. package/dist/esm/persistence/PersistenceQueries.d.ts +10 -11
  41. package/dist/esm/persistence/PersistenceQueries.js +33 -5
  42. package/dist/esm/persistence/PersistenceQueries.js.map +1 -1
  43. package/dist/esm/persistence/PersistenceRebaser.d.ts +5 -9
  44. package/dist/esm/persistence/PersistenceRebaser.js +63 -47
  45. package/dist/esm/persistence/PersistenceRebaser.js.map +1 -1
  46. package/dist/esm/persistence/idb/IdbService.d.ts +0 -1
  47. package/dist/esm/persistence/idb/IdbService.js +28 -16
  48. package/dist/esm/persistence/idb/IdbService.js.map +1 -1
  49. package/dist/esm/persistence/idb/files/IdbPersistenceFileDb.d.ts +11 -31
  50. package/dist/esm/persistence/idb/files/IdbPersistenceFileDb.js +31 -36
  51. package/dist/esm/persistence/idb/files/IdbPersistenceFileDb.js.map +1 -1
  52. package/dist/esm/persistence/idb/idbPersistence.d.ts +17 -9
  53. package/dist/esm/persistence/idb/idbPersistence.js +80 -39
  54. package/dist/esm/persistence/idb/idbPersistence.js.map +1 -1
  55. package/dist/esm/persistence/idb/metadata/IdbMetadataDb.d.ts +7 -10
  56. package/dist/esm/persistence/idb/metadata/IdbMetadataDb.js +45 -71
  57. package/dist/esm/persistence/idb/metadata/IdbMetadataDb.js.map +1 -1
  58. package/dist/esm/persistence/idb/metadata/openMetadataDatabase.d.ts +1 -12
  59. package/dist/esm/persistence/idb/metadata/openMetadataDatabase.js +3 -56
  60. package/dist/esm/persistence/idb/metadata/openMetadataDatabase.js.map +1 -1
  61. package/dist/esm/persistence/idb/queries/{IdbQueryDb.d.ts → IdbDocumentDb.d.ts} +7 -13
  62. package/dist/esm/persistence/idb/queries/{IdbQueryDb.js → IdbDocumentDb.js} +15 -32
  63. package/dist/esm/persistence/idb/queries/IdbDocumentDb.js.map +1 -0
  64. package/dist/esm/persistence/idb/queries/migration/db.d.ts +3 -5
  65. package/dist/esm/persistence/idb/queries/migration/db.js +13 -28
  66. package/dist/esm/persistence/idb/queries/migration/db.js.map +1 -1
  67. package/dist/esm/persistence/idb/util.d.ts +8 -4
  68. package/dist/esm/persistence/idb/util.js +64 -21
  69. package/dist/esm/persistence/idb/util.js.map +1 -1
  70. package/dist/esm/persistence/interfaces.d.ts +68 -75
  71. package/dist/esm/persistence/{idb/queries/migration → migration}/engine.d.ts +4 -7
  72. package/dist/esm/persistence/{idb/queries/migration → migration}/engine.js +18 -10
  73. package/dist/esm/persistence/migration/engine.js.map +1 -0
  74. package/dist/esm/persistence/migration/finalize.d.ts +9 -0
  75. package/dist/esm/persistence/migration/finalize.js +75 -0
  76. package/dist/esm/persistence/migration/finalize.js.map +1 -0
  77. package/dist/esm/persistence/migration/migrate.d.ts +12 -0
  78. package/dist/esm/persistence/migration/migrate.js +89 -0
  79. package/dist/esm/persistence/migration/migrate.js.map +1 -0
  80. package/dist/esm/persistence/migration/paths.js.map +1 -0
  81. package/dist/esm/persistence/migration/paths.test.js.map +1 -0
  82. package/dist/esm/persistence/migration/types.d.ts +3 -0
  83. package/dist/esm/persistence/migration/types.js.map +1 -0
  84. package/dist/esm/persistence/persistence.js +25 -15
  85. package/dist/esm/persistence/persistence.js.map +1 -1
  86. package/dist/esm/queries/FindAllQuery.js +1 -1
  87. package/dist/esm/queries/FindAllQuery.js.map +1 -1
  88. package/dist/esm/queries/FindInfiniteQuery.js +2 -2
  89. package/dist/esm/queries/FindInfiniteQuery.js.map +1 -1
  90. package/dist/esm/queries/FindOneQuery.js +1 -1
  91. package/dist/esm/queries/FindOneQuery.js.map +1 -1
  92. package/dist/esm/queries/FindPageQuery.js +1 -1
  93. package/dist/esm/queries/FindPageQuery.js.map +1 -1
  94. package/dist/esm/sync/FileSync.js +3 -3
  95. package/dist/esm/sync/FileSync.js.map +1 -1
  96. package/dist/esm/sync/PushPullSync.d.ts +2 -3
  97. package/dist/esm/sync/PushPullSync.js +4 -2
  98. package/dist/esm/sync/PushPullSync.js.map +1 -1
  99. package/dist/esm/sync/ServerSyncEndpointProvider.d.ts +3 -7
  100. package/dist/esm/sync/ServerSyncEndpointProvider.js +3 -2
  101. package/dist/esm/sync/ServerSyncEndpointProvider.js.map +1 -1
  102. package/dist/esm/sync/Sync.d.ts +6 -1
  103. package/dist/esm/sync/Sync.js +12 -4
  104. package/dist/esm/sync/Sync.js.map +1 -1
  105. package/dist/esm/sync/WebSocketSync.js +10 -4
  106. package/dist/esm/sync/WebSocketSync.js.map +1 -1
  107. package/dist/esm/utils/wip.js +1 -1
  108. package/package.json +6 -2
  109. package/src/__tests__/fixtures/testStorage.ts +6 -6
  110. package/src/client/Client.ts +26 -8
  111. package/src/client/ClientDescriptor.ts +27 -9
  112. package/src/context/ShutdownHandler.ts +26 -0
  113. package/src/context/context.ts +16 -4
  114. package/src/entities/EntityStore.ts +9 -3
  115. package/src/files/EntityFile.ts +11 -6
  116. package/src/files/FileManager.ts +13 -10
  117. package/src/index.ts +8 -9
  118. package/src/internal.ts +27 -0
  119. package/src/persistence/MessageCreator.ts +79 -73
  120. package/src/persistence/PersistenceFiles.ts +57 -31
  121. package/src/persistence/PersistenceMetadata.ts +287 -195
  122. package/src/persistence/PersistenceQueries.ts +45 -9
  123. package/src/persistence/PersistenceRebaser.ts +105 -70
  124. package/src/persistence/idb/IdbService.ts +40 -22
  125. package/src/persistence/idb/files/IdbPersistenceFileDb.ts +30 -62
  126. package/src/persistence/idb/idbPersistence.ts +123 -47
  127. package/src/persistence/idb/metadata/IdbMetadataDb.ts +75 -97
  128. package/src/persistence/idb/metadata/openMetadataDatabase.ts +2 -96
  129. package/src/persistence/idb/queries/{IdbQueryDb.ts → IdbDocumentDb.ts} +17 -57
  130. package/src/persistence/idb/queries/migration/db.ts +20 -39
  131. package/src/persistence/idb/util.ts +84 -21
  132. package/src/persistence/interfaces.ts +89 -90
  133. package/src/persistence/{idb/queries/migration → migration}/engine.ts +30 -15
  134. package/src/persistence/migration/finalize.ts +126 -0
  135. package/src/persistence/migration/migrate.ts +169 -0
  136. package/src/persistence/migration/types.ts +4 -0
  137. package/src/persistence/persistence.ts +37 -14
  138. package/src/queries/FindAllQuery.ts +1 -1
  139. package/src/queries/FindInfiniteQuery.ts +2 -2
  140. package/src/queries/FindOneQuery.ts +1 -1
  141. package/src/queries/FindPageQuery.ts +1 -1
  142. package/src/sync/FileSync.ts +21 -15
  143. package/src/sync/PushPullSync.ts +3 -4
  144. package/src/sync/ServerSyncEndpointProvider.ts +6 -8
  145. package/src/sync/Sync.ts +20 -7
  146. package/src/sync/WebSocketSync.ts +10 -4
  147. package/src/utils/wip.ts +1 -1
  148. package/dist/esm/client/constants.d.ts +0 -1
  149. package/dist/esm/client/constants.js +0 -2
  150. package/dist/esm/client/constants.js.map +0 -1
  151. package/dist/esm/persistence/idb/queries/IdbQueryDb.js.map +0 -1
  152. package/dist/esm/persistence/idb/queries/migration/engine.js.map +0 -1
  153. package/dist/esm/persistence/idb/queries/migration/migrations.d.ts +0 -15
  154. package/dist/esm/persistence/idb/queries/migration/migrations.js +0 -243
  155. package/dist/esm/persistence/idb/queries/migration/migrations.js.map +0 -1
  156. package/dist/esm/persistence/idb/queries/migration/openQueryDatabase.d.ts +0 -8
  157. package/dist/esm/persistence/idb/queries/migration/openQueryDatabase.js +0 -24
  158. package/dist/esm/persistence/idb/queries/migration/openQueryDatabase.js.map +0 -1
  159. package/dist/esm/persistence/idb/queries/migration/paths.js.map +0 -1
  160. package/dist/esm/persistence/idb/queries/migration/paths.test.js.map +0 -1
  161. package/dist/esm/persistence/idb/queries/migration/types.d.ts +0 -6
  162. package/dist/esm/persistence/idb/queries/migration/types.js.map +0 -1
  163. package/src/client/constants.ts +0 -1
  164. package/src/persistence/idb/queries/migration/migrations.ts +0 -345
  165. package/src/persistence/idb/queries/migration/openQueryDatabase.ts +0 -54
  166. package/src/persistence/idb/queries/migration/types.ts +0 -8
  167. /package/dist/esm/persistence/{idb/queries/migration → migration}/paths.d.ts +0 -0
  168. /package/dist/esm/persistence/{idb/queries/migration → migration}/paths.js +0 -0
  169. /package/dist/esm/persistence/{idb/queries/migration → migration}/paths.test.d.ts +0 -0
  170. /package/dist/esm/persistence/{idb/queries/migration → migration}/paths.test.js +0 -0
  171. /package/dist/esm/persistence/{idb/queries/migration → migration}/types.js +0 -0
  172. /package/src/persistence/{idb/queries/migration → migration}/paths.test.ts +0 -0
  173. /package/src/persistence/{idb/queries/migration → migration}/paths.ts +0 -0
@@ -39,6 +39,8 @@ export class WebSocketSync extends EventSubscriber {
39
39
  if (this.disposed) {
40
40
  return;
41
41
  }
42
+ if (this.ctx.closing)
43
+ return;
42
44
  if (!online) {
43
45
  this.hasStartedSync = false;
44
46
  this.synced = false;
@@ -125,7 +127,10 @@ export class WebSocketSync extends EventSubscriber {
125
127
  this.initializeSocket = async () => {
126
128
  const endpoint = await this.endpointProvider.getEndpoints();
127
129
  // abusing protocols to pass the auth token
128
- this.socket = new WebSocket(endpoint.websocket, ['Bearer', endpoint.token]);
130
+ this.socket = new this.ctx.environment.WebSocket(endpoint.websocket, [
131
+ 'Bearer',
132
+ endpoint.token,
133
+ ]);
129
134
  this.socket.addEventListener('message', this.onMessage);
130
135
  this.socket.addEventListener('open', this.onOpen);
131
136
  this.socket.addEventListener('error', this.onError);
@@ -155,7 +160,7 @@ export class WebSocketSync extends EventSubscriber {
155
160
  return;
156
161
  }
157
162
  if (this.canSkipSyncWait(message)) {
158
- if (((_a = this.socket) === null || _a === void 0 ? void 0 : _a.readyState) === WebSocket.OPEN) {
163
+ if (((_a = this.socket) === null || _a === void 0 ? void 0 : _a.readyState) === WEBSOCKET_OPEN) {
159
164
  this.ctx.log('debug', 'Sending message', JSON.stringify(message, null, 2));
160
165
  this.socket.send(JSON.stringify(message));
161
166
  }
@@ -165,7 +170,7 @@ export class WebSocketSync extends EventSubscriber {
165
170
  }
166
171
  }
167
172
  else if (this.synced) {
168
- if (((_b = this.socket) === null || _b === void 0 ? void 0 : _b.readyState) === WebSocket.OPEN) {
173
+ if (((_b = this.socket) === null || _b === void 0 ? void 0 : _b.readyState) === WEBSOCKET_OPEN) {
169
174
  this.ctx.log('debug', 'Sending message', JSON.stringify(message, null, 2));
170
175
  this.socket.send(JSON.stringify(message));
171
176
  }
@@ -209,10 +214,11 @@ export class WebSocketSync extends EventSubscriber {
209
214
  }
210
215
  get isConnected() {
211
216
  var _a;
212
- return ((_a = this.socket) === null || _a === void 0 ? void 0 : _a.readyState) === WebSocket.OPEN;
217
+ return ((_a = this.socket) === null || _a === void 0 ? void 0 : _a.readyState) === WEBSOCKET_OPEN;
213
218
  }
214
219
  get status() {
215
220
  return this._status;
216
221
  }
217
222
  }
223
+ const WEBSOCKET_OPEN = 1;
218
224
  //# sourceMappingURL=WebSocketSync.js.map
@@ -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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"}
@@ -1,5 +1,5 @@
1
1
  import { hashObject } from '@verdant-web/common';
2
2
  export function getWipNamespace(namespace, schema) {
3
- return `@@wip_${namespace}_${hashObject(schema)}`;
3
+ return `@@wip-${namespace}-${hashObject(schema)}`;
4
4
  }
5
5
  //# sourceMappingURL=wip.js.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@verdant-web/store",
3
- "version": "4.0.0",
3
+ "version": "4.1.0-alpha.1",
4
4
  "access": "public",
5
5
  "type": "module",
6
6
  "exports": {
@@ -15,6 +15,10 @@
15
15
  "./serviceWorker": {
16
16
  "import": "./dist/esm/sync/serviceWorker.js",
17
17
  "types": "./dist/esm/sync/serviceWorker.d.ts"
18
+ },
19
+ "./internal": {
20
+ "import": "./dist/esm/internal.js",
21
+ "types": "./dist/esm/internal.d.ts"
18
22
  }
19
23
  },
20
24
  "publishConfig": {
@@ -31,7 +35,7 @@
31
35
  "jwt-decode": "^3.1.2",
32
36
  "kysely": "^0.27.3",
33
37
  "weak-event": "^2.0.5",
34
- "@verdant-web/common": "2.6.0"
38
+ "@verdant-web/common": "2.7.0-alpha.0"
35
39
  },
36
40
  "devDependencies": {
37
41
  "@types/node": "20.10.5",
@@ -1,8 +1,11 @@
1
1
  import { createMigration, schema } from '@verdant-web/common';
2
2
  // @ts-ignore
3
3
  import { IDBFactory } from 'fake-indexeddb';
4
- import { ClientWithCollections, ClientDescriptor } from '../../index.js';
5
- import { METADATA_VERSION_KEY } from '../../client/constants.js';
4
+ import {
5
+ ClientWithCollections,
6
+ ClientDescriptor,
7
+ IdbPersistence,
8
+ } from '../../index.js';
6
9
 
7
10
  export const todoCollection = schema.collection({
8
11
  name: 'todo',
@@ -94,23 +97,20 @@ const testSchema = schema({
94
97
  export function createTestStorage({
95
98
  idb = new IDBFactory(),
96
99
  disableRebasing = false,
97
- metadataVersion,
98
100
  log,
99
101
  }: {
100
102
  idb?: IDBFactory;
101
103
  disableRebasing?: boolean;
102
- metadataVersion?: number;
103
104
  log?: (...args: any[]) => void;
104
105
  } = {}) {
105
106
  const storage = new ClientDescriptor({
106
107
  schema: testSchema,
107
108
  migrations: [createMigration<{}>(testSchema)],
108
- indexedDb: idb,
109
109
  namespace: 'test',
110
110
  disableRebasing,
111
111
  oldSchemas: [testSchema],
112
112
  log,
113
- [METADATA_VERSION_KEY]: metadataVersion,
113
+ persistence: new IdbPersistence(idb),
114
114
  }).open();
115
115
  return storage as Promise<ClientWithCollections>;
116
116
  }
@@ -2,6 +2,7 @@ import {
2
2
  debounce,
3
3
  DocumentBaseline,
4
4
  EventSubscriber,
5
+ FileData,
5
6
  Operation,
6
7
  } from '@verdant-web/common';
7
8
  import { Context } from '../context/context.js';
@@ -56,6 +57,10 @@ export class Client<Presence = any, Profile = any> extends EventSubscriber<{
56
57
  * or stored data, but is useful for debugging and testing.
57
58
  */
58
59
  rebase: () => void;
60
+ /**
61
+ * Emitted when a file is stored locally. Used for test coordination right now.
62
+ */
63
+ fileSaved: (fileData: FileData) => void;
59
64
  }> {
60
65
  private _entities: EntityStore;
61
66
  private _queryCache: QueryCache;
@@ -125,6 +130,9 @@ export class Client<Presence = any, Profile = any> extends EventSubscriber<{
125
130
  this.context.globalEvents.subscribe('rebase', () => {
126
131
  this.emit('rebase');
127
132
  });
133
+ this.context.globalEvents.subscribe('fileSaved', (file) => {
134
+ this.emit('fileSaved', file);
135
+ });
128
136
 
129
137
  // self-assign collection shortcuts. these are not typed
130
138
  // here but are typed in the generated code...
@@ -236,7 +244,7 @@ export class Client<Presence = any, Profile = any> extends EventSubscriber<{
236
244
  if (this.disposed) {
237
245
  return {} as any;
238
246
  }
239
- const collections = await this.context.queries.stats();
247
+ const collections = await this.context.documents.stats();
240
248
  const meta = await this.context.meta.stats();
241
249
  const storage =
242
250
  typeof navigator !== 'undefined' &&
@@ -276,15 +284,16 @@ export class Client<Presence = any, Profile = any> extends EventSubscriber<{
276
284
  // NOTE: this happens after flushing or else flushed data
277
285
  // won't be written to storage or synced.
278
286
  this.context.closing = true;
279
- this.context.files.dispose();
287
+ if (this.context.closeLock) {
288
+ await this.context.closeLock;
289
+ }
280
290
  this.sync.stop();
281
291
  this.sync.destroy();
282
292
  // this step does have the potential to flush
283
293
  // changes to storage, so don't close metadata db yet
284
294
  await this._entities.destroy();
285
295
 
286
- this.context.queries.dispose();
287
- this.context.meta.dispose();
296
+ this.context.persistenceShutdownHandler.shutdown();
288
297
 
289
298
  // the idea here is to flush the microtask queue -
290
299
  // we may have queued tasks related to queries that
@@ -309,8 +318,9 @@ export class Client<Presence = any, Profile = any> extends EventSubscriber<{
309
318
  ): Promise<ExportedData> => {
310
319
  this.context.log('info', 'Exporting data...');
311
320
  const metaExport = await this.context.meta.export();
312
- const { fileData, files } =
313
- await this.context.files.export(downloadRemoteFiles);
321
+ const { fileData, files } = await this.context.files.export(
322
+ downloadRemoteFiles,
323
+ );
314
324
  return {
315
325
  data: metaExport,
316
326
  fileData,
@@ -387,7 +397,15 @@ export class Client<Presence = any, Profile = any> extends EventSubscriber<{
387
397
  * rebasing rules. Rebases already happen automatically
388
398
  * during normal operation, so you probably don't need this.
389
399
  */
390
- __manualRebase = () => this.context.meta.manualRebase();
400
+ __manualRebase = () => {
401
+ this.context.meta.manualRebase();
402
+ return new Promise<void>((resolve) => {
403
+ const unsub = this.subscribe('rebase', () => {
404
+ unsub();
405
+ resolve();
406
+ });
407
+ });
408
+ };
391
409
 
392
410
  /**
393
411
  * WARNING: the internal functions of the persistence layer
@@ -397,7 +415,7 @@ export class Client<Presence = any, Profile = any> extends EventSubscriber<{
397
415
  get __persistence() {
398
416
  return {
399
417
  meta: this.context.meta,
400
- queries: this.context.queries,
418
+ queries: this.context.documents,
401
419
  files: this.context.files,
402
420
  };
403
421
  }
@@ -12,11 +12,11 @@ import { UndoHistory } from '../UndoHistory.js';
12
12
  import { Client } from './Client.js';
13
13
  import { deleteAllDatabases } from '../persistence/idb/util.js';
14
14
  import { FakeWeakRef } from '../FakeWeakRef.js';
15
- import { METADATA_VERSION_KEY } from './constants.js';
16
15
  import { Time } from '../context/Time.js';
17
16
  import { initializePersistence } from '../persistence/persistence.js';
18
17
  import { PersistenceImplementation } from '../persistence/interfaces.js';
19
18
  import { IdbPersistence } from '../persistence/idb/idbPersistence.js';
19
+ import { ShutdownHandler } from '../context/ShutdownHandler.js';
20
20
 
21
21
  export interface ClientDescriptorOptions<Presence = any, Profile = any> {
22
22
  /** The schema used to create this client */
@@ -26,8 +26,6 @@ export interface ClientDescriptorOptions<Presence = any, Profile = any> {
26
26
  migrations: Migration<any>[];
27
27
  /** Provide a sync config to turn on synchronization with a server */
28
28
  sync?: ServerSyncOptions<Profile, Presence>;
29
- /** Optionally override the IndexedDB implementation */
30
- indexedDb?: IDBFactory;
31
29
  /**
32
30
  * Namespaces are used to separate data from different clients in IndexedDB.
33
31
  */
@@ -63,6 +61,13 @@ export interface ClientDescriptorOptions<Presence = any, Profile = any> {
63
61
  */
64
62
  persistence?: PersistenceImplementation;
65
63
 
64
+ /**
65
+ * Specify the environment dependencies needed for the client.
66
+ * Normally these are provided by the browser, but in other
67
+ * runtimes you may need to provide your own.
68
+ */
69
+ environment?: InitialContext['environment'];
70
+
66
71
  /**
67
72
  * Enables experimental WeakRef usage to cull documents
68
73
  * from cache that aren't being used. This is a performance
@@ -71,9 +76,6 @@ export interface ClientDescriptorOptions<Presence = any, Profile = any> {
71
76
  * before turning it on.
72
77
  */
73
78
  EXPERIMENTAL_weakRefs?: boolean;
74
-
75
- // not for public use
76
- [METADATA_VERSION_KEY]?: number;
77
79
  }
78
80
 
79
81
  /**
@@ -112,9 +114,9 @@ export class ClientDescriptor<
112
114
  private initialize = async (init: ClientDescriptorOptions) => {
113
115
  // if server-side and no alternative IndexedDB implementation was provided,
114
116
  // we can't initialize the storage
115
- if (typeof window === 'undefined' && !init.indexedDb) {
117
+ if (typeof window === 'undefined' && !init.environment) {
116
118
  throw new Error(
117
- 'A Verdant client was initialized in an environment without IndexedDB. If you are using verdant in a server-rendered framework, you must enforce that all clients are initialized on the client-side, or you must provide some mock interface of IDBFactory to the ClientDescriptor options.',
119
+ 'A Verdant client was initialized in an environment without a global Window or `environment` configuration. If you are using verdant in a server-rendered framework, you must enforce that all clients are initialized on the client-side, or you must provide some mock interface of the environment to the ClientDescriptor options.',
118
120
  );
119
121
  }
120
122
 
@@ -127,6 +129,7 @@ export class ClientDescriptor<
127
129
  new HybridLogicalClockTimestampProvider(),
128
130
  init.schema.version,
129
131
  );
132
+ const environment = init.environment || defaultBrowserEnvironment;
130
133
  let ctx: InitialContext = {
131
134
  closing: false,
132
135
  entityEvents: new EventSubscriber(),
@@ -153,8 +156,17 @@ export class ClientDescriptor<
153
156
  rebaseTimeout: init.rebaseTimeout,
154
157
  },
155
158
  },
156
- persistence: init.persistence || new IdbPersistence(init.indexedDb),
159
+ persistence:
160
+ init.persistence || new IdbPersistence(environment.indexedDB),
161
+ environment,
162
+ persistenceShutdownHandler: new ShutdownHandler(),
163
+ pauseRebasing: false,
157
164
  };
165
+ ctx.log('info', 'Initializing client', {
166
+ namespace: ctx.namespace,
167
+ version: init.schema.version,
168
+ persistence: ctx.persistence.name,
169
+ });
158
170
  const context = await initializePersistence(ctx);
159
171
  const client = new Client(context) as ClientImpl;
160
172
  this.resolveReady(client);
@@ -202,3 +214,9 @@ export class ClientDescriptor<
202
214
  await deleteAllDatabases(this.namespace);
203
215
  };
204
216
  }
217
+
218
+ const defaultBrowserEnvironment = {
219
+ WebSocket: typeof WebSocket !== 'undefined' ? WebSocket : (undefined as any),
220
+ fetch: typeof window !== 'undefined' ? window.fetch.bind(window) : fetch!,
221
+ indexedDB: typeof indexedDB !== 'undefined' ? indexedDB : (undefined as any),
222
+ };
@@ -0,0 +1,26 @@
1
+ export class ShutdownHandler {
2
+ private consumed = false;
3
+ private readonly handlers: (() => Promise<void>)[] = [];
4
+
5
+ register(handler: () => Promise<void>) {
6
+ this.handlers.push(handler);
7
+ }
8
+
9
+ async shutdown() {
10
+ if (this.consumed) {
11
+ console.warn('ShutdownHandler already consumed');
12
+ }
13
+
14
+ this.consumed = true;
15
+ await Promise.all(this.handlers.map((handler) => handler()));
16
+ this.handlers.length = 0;
17
+ }
18
+
19
+ get isShuttingDown() {
20
+ return this.consumed;
21
+ }
22
+
23
+ reset = () => {
24
+ this.consumed = false;
25
+ };
26
+ }
@@ -11,13 +11,14 @@ import {
11
11
  } from '@verdant-web/common';
12
12
  import { UndoHistory } from '../UndoHistory.js';
13
13
  import { Time } from './Time.js';
14
- import type { PersistenceQueries } from '../persistence/PersistenceQueries.js';
14
+ import type { PersistenceDocuments } from '../persistence/PersistenceQueries.js';
15
15
  import type { PersistenceMetadata } from '../persistence/PersistenceMetadata.js';
16
16
  import { PersistenceFiles } from '../persistence/PersistenceFiles.js';
17
17
  import {
18
18
  PersistedFileData,
19
19
  PersistenceImplementation,
20
20
  } from '../persistence/interfaces.js';
21
+ import { ShutdownHandler } from './ShutdownHandler.js';
21
22
 
22
23
  /**
23
24
  * Common components utilized across various client
@@ -33,7 +34,7 @@ export interface Context {
33
34
  time: Time;
34
35
 
35
36
  meta: PersistenceMetadata;
36
- queries: PersistenceQueries;
37
+ documents: PersistenceDocuments;
37
38
  files: PersistenceFiles;
38
39
 
39
40
  undoHistory: UndoHistory;
@@ -55,7 +56,7 @@ export interface Context {
55
56
  persistenceReset: () => void;
56
57
  filesDeleted: (files: FileRef[]) => void;
57
58
  fileAdded: (file: FileData) => void;
58
- [ev: `fileUploaded:${string}`]: () => void;
59
+ [ev: `fileUploaded:${string}`]: (file: FileData) => void;
59
60
  }>;
60
61
  globalEvents: EventSubscriber<{
61
62
  /**
@@ -83,11 +84,16 @@ export interface Context {
83
84
  * or stored data, but is useful for debugging and testing.
84
85
  */
85
86
  rebase: () => void;
87
+ fileSaved: (file: FileData) => void;
86
88
  }>;
87
89
  weakRef<T extends object>(value: T): WeakRef<T>;
88
90
  migrations: Migration<any>[];
89
91
  closing: boolean;
92
+ /** If this is present, any attempt to close the client should await it first. */
93
+ closeLock?: Promise<void>;
94
+ pauseRebasing: boolean;
90
95
  patchCreator: PatchCreator;
96
+ persistenceShutdownHandler: ShutdownHandler;
91
97
 
92
98
  config: {
93
99
  files?: FileConfig;
@@ -95,6 +101,12 @@ export interface Context {
95
101
  persistence?: PersistenceConfig;
96
102
  };
97
103
 
104
+ environment: {
105
+ WebSocket: typeof WebSocket;
106
+ fetch: typeof fetch;
107
+ indexedDB: typeof indexedDB;
108
+ };
109
+
98
110
  persistence: PersistenceImplementation;
99
111
  }
100
112
 
@@ -197,4 +209,4 @@ export interface PersistenceConfig {
197
209
  rebaseTimeout?: number;
198
210
  }
199
211
 
200
- export type InitialContext = Omit<Context, 'queries' | 'meta' | 'files'>;
212
+ export type InitialContext = Omit<Context, 'documents' | 'meta' | 'files'>;
@@ -132,7 +132,7 @@ export class EntityStore extends Disposable {
132
132
  };
133
133
 
134
134
  empty = async () => {
135
- await this.ctx.queries.reset();
135
+ await this.ctx.documents.reset();
136
136
  this.events.resetAll.invoke(this);
137
137
  this.cache.clear();
138
138
  };
@@ -143,7 +143,7 @@ export class EntityStore extends Disposable {
143
143
  return;
144
144
  }
145
145
  await this.ctx.meta.reset();
146
- await this.ctx.queries.reset();
146
+ await this.ctx.documents.reset();
147
147
  this.events.resetAll.invoke(this);
148
148
  };
149
149
 
@@ -222,6 +222,10 @@ export class EntityStore extends Disposable {
222
222
  // so that realtime is lower latency? What would happen
223
223
  // if the storage failed?
224
224
  await this.ctx.meta.insertData(data, abortOptions);
225
+ this.ctx.log(
226
+ 'debug',
227
+ 'Data processing complete, all data saved to metadata db.',
228
+ );
225
229
 
226
230
  // recompute all affected documents for querying
227
231
  const entities = await Promise.all(
@@ -240,7 +244,8 @@ export class EntityStore extends Disposable {
240
244
  }),
241
245
  );
242
246
  try {
243
- await this.ctx.queries.saveEntities(entities, abortOptions);
247
+ this.ctx.log('debug', 'Saving entities to queryable storage');
248
+ await this.ctx.documents.saveEntities(entities, abortOptions);
244
249
  } catch (err) {
245
250
  if (this.disposed) {
246
251
  this.ctx.log(
@@ -439,6 +444,7 @@ export class EntityStore extends Disposable {
439
444
  * Constructs an entity from an OID, but does not load it.
440
445
  */
441
446
  private constructEntity = (oid: string): Entity | null => {
447
+ assert(!!oid, 'Cannot construct entity without OID');
442
448
  const { collection } = decomposeOid(oid);
443
449
  const { schema, readonlyKeys } = this.getCollectionSchema(collection);
444
450
 
@@ -24,6 +24,7 @@ export class EntityFile extends EventSubscriber<EntityFileEvents> {
24
24
  private _loading = true;
25
25
  private _failed = false;
26
26
  private _downloadRemote = false;
27
+ private _uploaded = false;
27
28
  private ctx: Context;
28
29
  private unsubscribes: (() => void)[] = [];
29
30
 
@@ -53,7 +54,7 @@ export class EntityFile extends EventSubscriber<EntityFileEvents> {
53
54
  return true;
54
55
  }
55
56
  get isUploaded() {
56
- return this._fileData?.remote ?? false;
57
+ return this._uploaded || this._fileData?.remote || false;
57
58
  }
58
59
 
59
60
  [UPDATE] = (fileData: FileData) => {
@@ -62,7 +63,7 @@ export class EntityFile extends EventSubscriber<EntityFileEvents> {
62
63
  this._failed = false;
63
64
  this._fileData = fileData;
64
65
  if (fileData.file) {
65
- if (this._objectUrl) {
66
+ if (this._objectUrl && 'revokeObjectURL' in URL) {
66
67
  URL.revokeObjectURL(this._objectUrl);
67
68
  }
68
69
  this.ctx.log('debug', 'Creating object URL for file', this.id);
@@ -77,15 +78,19 @@ export class EntityFile extends EventSubscriber<EntityFileEvents> {
77
78
  this.emit('change');
78
79
  };
79
80
 
80
- private onUploaded = () => {
81
- if (!this._fileData) return;
82
- this._fileData!.remote = true;
81
+ private onUploaded = (data: FileData) => {
82
+ // TODO: cleanup all this uploaded flagging junk
83
+ this._fileData ??= data;
84
+ this._uploaded = true;
85
+ this.ctx.log('debug', 'File marked uploaded', this.id, this._fileData);
83
86
  this.emit('change');
84
87
  };
85
88
 
86
89
  get url(): string | null {
90
+ // prefer local file representations.
87
91
  if (this.loading) return null;
88
92
  if (this._objectUrl) return this._objectUrl;
93
+ // TODO: use localPath here?
89
94
  return this._fileData?.url ?? null;
90
95
  }
91
96
 
@@ -117,7 +122,7 @@ export class EntityFile extends EventSubscriber<EntityFileEvents> {
117
122
  id: this.id,
118
123
  url: this._objectUrl ?? this._fileData?.url ?? undefined,
119
124
  name: this.name ?? 'unknown-file',
120
- remote: false,
125
+ remote: this._fileData?.remote ?? false,
121
126
  type: this.type ?? '',
122
127
  file: this._fileData?.file,
123
128
  };
@@ -14,17 +14,22 @@ export class FileManager {
14
14
  this.context = context;
15
15
  }
16
16
 
17
- add = async (file: FileData, options?: { downloadRemote: boolean }) => {
17
+ add = async (file: FileData) => {
18
18
  // immediately cache the file
19
- if (!this.cache.has(file.id)) {
20
- const entityFile = new EntityFile(file.id, { ctx: this.context });
21
- entityFile[UPDATE](file);
19
+ let entityFile = this.cache.get(file.id);
20
+ if (!entityFile) {
21
+ entityFile = new EntityFile(file.id, { ctx: this.context });
22
22
  this.cache.set(file.id, entityFile);
23
- } else {
24
- this.cache.get(file.id)![UPDATE](file);
25
23
  }
26
24
 
27
- await this.context.files.add(file, options);
25
+ if (!file.remote) {
26
+ // immediately update local files.
27
+ entityFile[UPDATE](file);
28
+ }
29
+ // this will download any original remote file and trigger a re-upload to the
30
+ // new file's identity, in addition to storing it on disk
31
+ const processedFile = await this.context.files.add(file);
32
+ entityFile[UPDATE](processedFile);
28
33
  };
29
34
 
30
35
  /**
@@ -68,9 +73,7 @@ export class FileManager {
68
73
  const result = await this.sync.getFile(file.id);
69
74
  if (result.success) {
70
75
  file[UPDATE](result.data);
71
- await this.context.files.add(result.data, {
72
- downloadRemote: file.downloadRemote,
73
- });
76
+ await this.context.files.add(result.data);
74
77
  } else {
75
78
  this.context.log('error', 'Failed to load file', result);
76
79
  file[MARK_FAILED]();
package/src/index.ts CHANGED
@@ -24,14 +24,7 @@ export type {
24
24
  export { ServerSync } from './sync/Sync.js';
25
25
  export type { SyncTransportMode } from './sync/Sync.js';
26
26
  export { EntityFile, type EntityFileSnapshot } from './files/EntityFile.js';
27
- export {
28
- /** @deprecated - use schema.collection */
29
- collection,
30
- schema,
31
- createDefaultMigration,
32
- migrate,
33
- createMigration,
34
- } from '@verdant-web/common';
27
+ export { schema, createMigration } from '@verdant-web/common';
35
28
  export type {
36
29
  StorageDocument,
37
30
  StorageSchema,
@@ -50,8 +43,12 @@ export type {
50
43
  Migration,
51
44
  VerdantError,
52
45
  VerdantErrorCode,
46
+ ObjectIdentifier,
47
+ CollectionFilter,
48
+ FileData,
49
+ DocumentBaseline,
50
+ UserInfo,
53
51
  } from '@verdant-web/common';
54
- export type { UserInfo } from '@verdant-web/common';
55
52
  export type { Query } from './queries/types.js';
56
53
  export type { QueryStatus } from './queries/BaseQuery.js';
57
54
  export type { CollectionQueries } from './queries/CollectionQueries.js';
@@ -59,3 +56,5 @@ export * from './utils/id.js';
59
56
  export { UndoHistory } from './UndoHistory.js';
60
57
  export * from './authorization.js';
61
58
  export * from './sync/cliSync.js';
59
+ export type * from './persistence/interfaces.js';
60
+ export { IdbPersistence } from './persistence/idb/idbPersistence.js';
@@ -0,0 +1,27 @@
1
+ export type { Context, InitialContext } from './context/context.js';
2
+ export {
3
+ decomposeOid,
4
+ createOid,
5
+ generateId,
6
+ isRangeIndexFilter,
7
+ isCompoundIndexFilter,
8
+ isDirectSynthetic,
9
+ isMatchIndexFilter,
10
+ isSortIndexFilter,
11
+ isStartsWithIndexFilter,
12
+ isMultiValueIndex,
13
+ assert,
14
+ createCompoundIndexValue,
15
+ createLowerBoundIndexValue,
16
+ createUpperBoundIndexValue,
17
+ getIndexValues,
18
+ } from '@verdant-web/common';
19
+ export type {
20
+ CollectionCompoundIndexFilter,
21
+ MatchCollectionIndexFilter,
22
+ RangeCollectionIndexFilter,
23
+ CollectionIndexFilter,
24
+ } from '@verdant-web/common';
25
+ export * from './persistence/migration/paths.js';
26
+ export * from './persistence/migration/types.js';
27
+ export { Disposable } from './utils/Disposable.js';