@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
@@ -1,13 +1,11 @@
1
- import { CollectionFilter, DocumentBaseline, FileData, ObjectIdentifier, Operation } from '@verdant-web/common';
1
+ import { CollectionFilter, DocumentBaseline, FileData, Migration, ObjectIdentifier, Operation } from '@verdant-web/common';
2
2
  import { Context, InitialContext } from '../context/context.js';
3
3
  export interface AckInfo {
4
- type: 'ack';
5
4
  globalAckTimestamp: string | null;
6
5
  }
7
6
  export interface LocalReplicaInfo {
8
- type: 'localReplicaInfo';
9
7
  id: string;
10
- userId: string | undefined;
8
+ userId: string | null;
11
9
  ackedLogicalTime: string | null;
12
10
  lastSyncedLogicalTime: string | null;
13
11
  }
@@ -25,56 +23,55 @@ export interface ExportedData {
25
23
  fileData: Array<Omit<PersistedFileData, 'file'>>;
26
24
  files: File[];
27
25
  }
28
- export type AbstractTransaction = unknown;
26
+ export type AbstractTransaction = any;
29
27
  export type QueryMode = 'readwrite' | 'readonly';
30
- export interface CommonQueryOptions {
31
- transaction?: AbstractTransaction;
28
+ export interface CommonQueryOptions<Tx extends AbstractTransaction = AbstractTransaction> {
29
+ transaction?: Tx;
32
30
  mode?: QueryMode;
33
31
  }
34
32
  export type Iterator<T> = (item: T) => void | boolean;
35
- export interface PersistenceMetadataDb {
36
- transaction(opts: {
33
+ export interface PersistenceMetadataDb<Tx extends AbstractTransaction = AbstractTransaction> {
34
+ transaction<T = void>(opts: {
37
35
  mode?: QueryMode;
38
36
  storeNames: string[];
39
37
  abort?: AbortSignal;
40
- }): AbstractTransaction;
41
- dispose(): void | Promise<void>;
38
+ }, procedure: (tx: Tx) => Promise<T>): Promise<T>;
42
39
  getAckInfo(): Promise<AckInfo>;
43
40
  setGlobalAck(ack: string): Promise<void>;
44
- getLocalReplica(opts?: CommonQueryOptions): Promise<LocalReplicaInfo>;
45
- updateLocalReplica(data: Partial<LocalReplicaInfo>, opts?: CommonQueryOptions): Promise<void>;
46
- iterateDocumentBaselines(rootOid: string, iterator: Iterator<DocumentBaseline>, opts?: CommonQueryOptions): Promise<void>;
47
- iterateCollectionBaselines(collection: string, iterator: Iterator<DocumentBaseline>, opts?: CommonQueryOptions): Promise<void>;
48
- iterateAllBaselines(iterator: Iterator<DocumentBaseline>, opts?: CommonQueryOptions): Promise<void>;
49
- getBaseline(oid: string, opts?: CommonQueryOptions): Promise<DocumentBaseline>;
50
- setBaselines(baselines: DocumentBaseline[], opts?: CommonQueryOptions): Promise<void>;
51
- deleteBaseline(oid: string, opts?: CommonQueryOptions): Promise<void>;
52
- iterateDocumentOperations(rootOid: string, iterator: Iterator<ClientOperation>, opts?: CommonQueryOptions & {
41
+ getLocalReplica(opts?: CommonQueryOptions<Tx>): Promise<LocalReplicaInfo | undefined | null>;
42
+ updateLocalReplica(data: LocalReplicaInfo, opts?: CommonQueryOptions<Tx>): Promise<void>;
43
+ iterateDocumentBaselines(rootOid: string, iterator: Iterator<DocumentBaseline>, opts?: CommonQueryOptions<Tx>): Promise<void>;
44
+ iterateCollectionBaselines(collection: string, iterator: Iterator<DocumentBaseline>, opts?: CommonQueryOptions<Tx>): Promise<void>;
45
+ iterateAllBaselines(iterator: Iterator<DocumentBaseline>, opts?: CommonQueryOptions<Tx>): Promise<void>;
46
+ getBaseline(oid: string, opts?: CommonQueryOptions<Tx>): Promise<DocumentBaseline | null>;
47
+ setBaselines(baselines: DocumentBaseline[], opts?: CommonQueryOptions<Tx>): Promise<void>;
48
+ deleteBaseline(oid: string, opts?: CommonQueryOptions<Tx>): Promise<void>;
49
+ iterateDocumentOperations(rootOid: string, iterator: Iterator<ClientOperation>, opts?: CommonQueryOptions<Tx> & {
53
50
  to?: string | null;
54
51
  }): Promise<void>;
55
- iterateEntityOperations(oid: string, iterator: Iterator<ClientOperation>, opts?: CommonQueryOptions & {
52
+ iterateEntityOperations(oid: string, iterator: Iterator<ClientOperation>, opts?: CommonQueryOptions<Tx> & {
56
53
  to?: string | null;
57
54
  }): Promise<void>;
58
- iterateCollectionOperations(collection: string, iterator: Iterator<ClientOperation>, opts?: CommonQueryOptions): Promise<void>;
59
- iterateLocalOperations(iterator: Iterator<ClientOperation>, opts?: CommonQueryOptions & {
55
+ iterateCollectionOperations(collection: string, iterator: Iterator<ClientOperation>, opts?: CommonQueryOptions<Tx>): Promise<void>;
56
+ iterateLocalOperations(iterator: Iterator<ClientOperation>, opts?: CommonQueryOptions<Tx> & {
60
57
  before?: string | null;
61
58
  after?: string | null;
62
59
  }): Promise<void>;
63
60
  /** Iterates over operations for an entity for processing and deletes them as it goes. */
64
- consumeEntityOperations(oid: string, iterator: Iterator<ClientOperation>, opts?: CommonQueryOptions & {
65
- to?: string | null;
61
+ deleteEntityOperations(oid: string, opts: CommonQueryOptions<Tx> & {
62
+ to: string | null;
66
63
  }): Promise<void>;
67
- iterateAllOperations(iterator: Iterator<ClientOperation>, opts?: CommonQueryOptions & {
64
+ iterateAllOperations(iterator: Iterator<ClientOperation>, opts?: CommonQueryOptions<Tx> & {
68
65
  before?: string | null;
69
66
  from?: string | null;
70
67
  }): Promise<void>;
71
68
  /**
72
69
  * @returns a list of all document (root) OIDs affected by the adds.
73
70
  */
74
- addOperations(ops: ClientOperation[], opts?: CommonQueryOptions): Promise<ObjectIdentifier[]>;
71
+ addOperations(ops: ClientOperation[], opts?: CommonQueryOptions<Tx>): Promise<ObjectIdentifier[]>;
75
72
  reset(opts?: {
76
73
  clearReplica?: boolean;
77
- transaction?: AbstractTransaction;
74
+ transaction?: Tx;
78
75
  }): Promise<void>;
79
76
  stats(): Promise<{
80
77
  operationsSize: {
@@ -87,13 +84,7 @@ export interface PersistenceMetadataDb {
87
84
  };
88
85
  }>;
89
86
  }
90
- export interface PersistenceQueryDb {
91
- transaction(opts: {
92
- mode?: QueryMode;
93
- storeNames: string[];
94
- abort?: AbortSignal;
95
- }): AbstractTransaction;
96
- dispose(): void | Promise<void>;
87
+ export interface PersistenceDocumentDb {
97
88
  findOneOid(opts: {
98
89
  collection: string;
99
90
  index?: CollectionFilter;
@@ -110,55 +101,33 @@ export interface PersistenceQueryDb {
110
101
  saveEntities(entities: {
111
102
  oid: ObjectIdentifier;
112
103
  getSnapshot: () => any;
113
- }[], opts?: CommonQueryOptions & {
104
+ }[], optsAndInfo: {
114
105
  abort?: AbortSignal;
106
+ collections: string[];
115
107
  }): Promise<void>;
116
- reset(opts?: {
117
- transaction?: AbstractTransaction;
118
- }): Promise<void>;
108
+ reset(): Promise<void>;
119
109
  stats(): Promise<Record<string, {
120
110
  count: number;
121
111
  size: number;
122
112
  }>>;
113
+ close(): Promise<void>;
123
114
  }
124
115
  export interface PersistedFileData extends FileData {
125
116
  deletedAt: number | null;
126
117
  }
127
118
  export interface PersistenceFileDb {
128
- transaction(opts: {
129
- mode?: QueryMode;
130
- storeNames: string[];
131
- abort?: AbortSignal;
132
- }): AbstractTransaction;
133
- dispose(): void | Promise<void>;
134
119
  add(file: FileData, options?: {
135
- transaction?: AbstractTransaction;
136
120
  downloadRemote?: boolean;
137
121
  }): Promise<void>;
138
- markUploaded(fileId: string, options?: {
139
- transaction?: AbstractTransaction;
140
- }): Promise<void>;
141
- get(fileId: string, options?: {
142
- transaction?: AbstractTransaction;
143
- }): Promise<PersistedFileData | null>;
144
- delete(fileId: string, options?: {
145
- transaction?: AbstractTransaction;
146
- }): Promise<void>;
147
- markPendingDelete(fileId: string, options?: {
148
- transaction?: AbstractTransaction;
149
- }): Promise<void>;
150
- listUnsynced(options?: {
151
- transaction?: AbstractTransaction;
152
- }): Promise<PersistedFileData[]>;
153
- resetSyncedStatusSince(since: string | null, options?: {
154
- transaction?: AbstractTransaction;
155
- }): Promise<void>;
156
- iterateOverPendingDelete(iterator: (file: PersistedFileData, store: IDBObjectStore) => void, options?: {
157
- transaction?: IDBTransaction;
158
- }): Promise<void>;
159
- getAll(options?: {
160
- transaction?: AbstractTransaction;
161
- }): Promise<PersistedFileData[]>;
122
+ markUploaded(fileId: string): Promise<void>;
123
+ get(fileId: string): Promise<PersistedFileData | null>;
124
+ delete(fileId: string): Promise<void>;
125
+ markPendingDelete(fileId: string): Promise<void>;
126
+ listUnsynced(): Promise<PersistedFileData[]>;
127
+ resetSyncedStatusSince(since: string | null): Promise<void>;
128
+ iterateOverPendingDelete(iterator: (file: PersistedFileData) => void): Promise<void>;
129
+ loadFileContents(file: FileData, ctx: Context): Promise<Blob>;
130
+ getAll(): Promise<PersistedFileData[]>;
162
131
  stats(): Promise<{
163
132
  size: {
164
133
  count: number;
@@ -166,16 +135,40 @@ export interface PersistenceFileDb {
166
135
  };
167
136
  }>;
168
137
  }
169
- export interface PersistenceImplementation {
138
+ export interface PersistenceNamespace {
170
139
  openMetadata(ctx: InitialContext): Promise<PersistenceMetadataDb>;
171
- openQueries(ctx: Omit<Context, 'queries'>): Promise<PersistenceQueryDb>;
172
- openFiles(ctx: Omit<Context, 'files' | 'queries'>): Promise<PersistenceFileDb>;
173
- /** Copies all data (metadata/document queries/files) from one namespace to another. */
174
- copyNamespace(from: string, to: string, ctx: InitialContext): Promise<void>;
140
+ /**
141
+ * Open the Documents database according to the schema in the given
142
+ * context. By the time this is called with a version, relevant migrations
143
+ * will have been applied.
144
+ */
145
+ openDocuments(ctx: Omit<Context, 'documents' | 'files'>): Promise<PersistenceDocumentDb>;
146
+ /**
147
+ * Apply a migration to the namespace provided in ctx.
148
+ * This should make any transformations necessary to the
149
+ * document database to accommodate the new schema indexes.
150
+ * The migration itself contains a lot of information about
151
+ * what changed between versions.
152
+ *
153
+ * This method should also store the new version to persisted
154
+ * metadata, however your implementation chooses to do that.
155
+ */
156
+ applyMigration(ctx: InitialContext, migration: Migration<any>): Promise<void>;
157
+ openFiles(ctx: Omit<Context, 'files' | 'documents'>): Promise<PersistenceFileDb>;
158
+ }
159
+ export interface PersistenceImplementation {
160
+ name: string;
161
+ openNamespace(namespace: string, ctx: Pick<Context, 'log' | 'persistenceShutdownHandler'>): Promise<PersistenceNamespace>;
175
162
  /** Returns a list of all persisted namespaces visible to this app. */
176
163
  getNamespaces(): Promise<string[]>;
177
164
  /** Deletes all data from a particular namespace. */
178
165
  deleteNamespace(namespace: string, ctx: InitialContext): Promise<void>;
179
166
  /** Gets the schema version of the given namespace */
180
167
  getNamespaceVersion(namespace: string): Promise<number>;
168
+ /**
169
+ * Copies all data from one namespace to another. It should
170
+ * overwrite the target namespace such that data and database
171
+ * schema are identical.
172
+ */
173
+ copyNamespace(from: string, to: string, ctx: InitialContext): Promise<void>;
181
174
  }
@@ -1,12 +1,9 @@
1
1
  import { Migration, MigrationEngine } from '@verdant-web/common';
2
2
  import { OpenDocumentDbContext } from './types.js';
3
- export declare function getMigrationEngine({ migration, context, queryDb, }: {
3
+ import { PersistenceNamespace } from '../interfaces.js';
4
+ export declare function getMigrationEngine({ migration, context, ns, }: {
4
5
  log?: (...args: any[]) => void;
5
6
  migration: Migration;
6
7
  context: OpenDocumentDbContext;
7
- queryDb: IDBDatabase;
8
- }): MigrationEngine;
9
- export declare function getInitialMigrationEngine({ migration, context, }: {
10
- context: OpenDocumentDbContext;
11
- migration: Migration;
12
- }): MigrationEngine;
8
+ ns: PersistenceNamespace;
9
+ }): Promise<MigrationEngine>;
@@ -1,5 +1,4 @@
1
1
  import { addFieldDefaults, assert, assignOidsToAllSubObjects, cloneDeep, createOid, diffToPatches, getOid, removeOidPropertiesFromAllSubObjects, } from '@verdant-web/common';
2
- import { IdbQueryDb } from '../IdbQueryDb.js';
3
2
  function getMigrationMutations({ migration, newOids, ctx, }) {
4
3
  return migration.allCollections.reduce((acc, collectionName) => {
5
4
  acc[collectionName] = {
@@ -23,8 +22,7 @@ function getMigrationMutations({ migration, newOids, ctx, }) {
23
22
  return acc;
24
23
  }, {});
25
24
  }
26
- function getMigrationQueries({ migration, context, queryDb, }) {
27
- const queries = new IdbQueryDb(queryDb, context);
25
+ function getMigrationQueries({ migration, context, documents, }) {
28
26
  return migration.oldCollections.reduce((acc, collectionName) => {
29
27
  acc[collectionName] = {
30
28
  get: async (id) => {
@@ -36,7 +34,7 @@ function getMigrationQueries({ migration, context, queryDb, }) {
36
34
  return doc;
37
35
  },
38
36
  findOne: async (filter) => {
39
- const oid = await queries.findOneOid({
37
+ const oid = await documents.findOneOid({
40
38
  collection: collectionName,
41
39
  index: filter,
42
40
  });
@@ -49,7 +47,7 @@ function getMigrationQueries({ migration, context, queryDb, }) {
49
47
  return doc;
50
48
  },
51
49
  findAll: async (filter) => {
52
- const { result: oids } = await queries.findAllOids({
50
+ const { result: oids } = await documents.findAllOids({
53
51
  collection: collectionName,
54
52
  index: filter,
55
53
  });
@@ -63,17 +61,22 @@ function getMigrationQueries({ migration, context, queryDb, }) {
63
61
  return acc;
64
62
  }, {});
65
63
  }
66
- export function getMigrationEngine({ migration, context, queryDb, }) {
64
+ export async function getMigrationEngine({ migration, context, ns, }) {
65
+ const migrationContext = Object.assign(Object.assign({}, context), { schema: migration.oldSchema });
66
+ if (migration.oldSchema.version === 0) {
67
+ return getInitialMigrationEngine({ migration, context: migrationContext });
68
+ }
67
69
  const newOids = new Array();
70
+ const documents = await ns.openDocuments(migrationContext);
68
71
  const queries = getMigrationQueries({
69
72
  migration,
70
- context,
71
- queryDb,
73
+ context: migrationContext,
74
+ documents,
72
75
  });
73
76
  const mutations = getMigrationMutations({
74
77
  migration,
75
78
  newOids,
76
- ctx: context,
79
+ ctx: migrationContext,
77
80
  });
78
81
  const deleteCollection = async (collection) => {
79
82
  await context.meta.deleteCollection(collection);
@@ -85,6 +88,7 @@ export function getMigrationEngine({ migration, context, queryDb, }) {
85
88
  deleteCollection,
86
89
  migrate: async (collection, strategy) => {
87
90
  const docs = await queries[collection].findAll();
91
+ context.log('debug', `Migrating ${docs.length} documents in ${collection}`);
88
92
  await Promise.all(docs.filter(Boolean).map(async (doc) => {
89
93
  const rootOid = getOid(doc);
90
94
  assert(!!rootOid, `Document is missing an OID: ${JSON.stringify(doc)}`);
@@ -119,10 +123,13 @@ export function getMigrationEngine({ migration, context, queryDb, }) {
119
123
  queries,
120
124
  mutations,
121
125
  awaitables,
126
+ close: async () => {
127
+ await documents.close();
128
+ },
122
129
  };
123
130
  return engine;
124
131
  }
125
- export function getInitialMigrationEngine({ migration, context, }) {
132
+ function getInitialMigrationEngine({ migration, context, }) {
126
133
  const newOids = new Array();
127
134
  const queries = new Proxy({}, {
128
135
  get() {
@@ -146,6 +153,7 @@ export function getInitialMigrationEngine({ migration, context, }) {
146
153
  queries,
147
154
  mutations,
148
155
  awaitables: [],
156
+ close: () => Promise.resolve(),
149
157
  };
150
158
  return engine;
151
159
  }
@@ -0,0 +1 @@
1
+ {"version":3,"file":"engine.js","sourceRoot":"","sources":["../../../../src/persistence/migration/engine.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import { Migration, MigrationEngine } from '@verdant-web/common';
2
+ import { PersistenceDocumentDb } from '../interfaces.js';
3
+ import { OpenDocumentDbContext } from './types.js';
4
+ export declare function finalizeMigration({ ctx, documents, migration, engine, }: {
5
+ ctx: OpenDocumentDbContext;
6
+ documents: PersistenceDocumentDb;
7
+ migration: Migration<any>;
8
+ engine: MigrationEngine;
9
+ }): Promise<void>;
@@ -0,0 +1,75 @@
1
+ import { decomposeOid, getOidRoot, } from '@verdant-web/common';
2
+ export async function finalizeMigration({ ctx, documents, migration, engine, }) {
3
+ /**
4
+ * In cases where operations from the future have been
5
+ * received by this client, we may have created entire
6
+ * documents in metadata which were not written to storage
7
+ * because all of their operations were in the future (
8
+ * i.e. in the next version). We have to find those documents
9
+ * and also write their snapshots to storage, because they
10
+ * won't be present in storage already to 'refresh,' so
11
+ * if we don't analyze metadata for 'future' operations like
12
+ * this, we won't know they exist.
13
+ *
14
+ * This led to behavior where the metadata would be properly
15
+ * synced, but after upgrading the app and migrating, items
16
+ * would be missing from findAll and findOne queries.
17
+ */
18
+ const docsWithUnappliedMigrations = await getDocsWithUnappliedMigrations({
19
+ currentVersion: migration.oldSchema.version,
20
+ newVersion: migration.newSchema.version,
21
+ ctx,
22
+ });
23
+ // once the schema is ready, we can write back the migrated documents
24
+ for (const collection of migration.allCollections) {
25
+ // map the keys to OIDs
26
+ const { result: oids } = await documents.findAllOids({
27
+ collection,
28
+ });
29
+ oids.push(...engine.newOids.filter((oid) => {
30
+ return decomposeOid(oid).collection === collection;
31
+ }), ...docsWithUnappliedMigrations.filter((oid) => {
32
+ return decomposeOid(oid).collection === collection;
33
+ }));
34
+ const snapshots = await Promise.all(oids.map(async (oid) => {
35
+ try {
36
+ const snap = await ctx.meta.getDocumentSnapshot(oid);
37
+ return [oid, snap];
38
+ }
39
+ catch (e) {
40
+ // this seems to happen with baselines/ops which are not fully
41
+ // cleaned up after deletion?
42
+ ctx.log('error', 'Could not regenerate snapshot during migration for oid', oid, 'this document will not be preserved', e);
43
+ return null;
44
+ }
45
+ }));
46
+ const views = snapshots.filter((s) => !!s);
47
+ // now we can write the documents back
48
+ await documents.saveEntities(views.map(([oid, snapshot]) => ({
49
+ oid,
50
+ getSnapshot() {
51
+ return snapshot;
52
+ },
53
+ })), {
54
+ collections: [collection],
55
+ });
56
+ }
57
+ }
58
+ /**
59
+ * Gets a list of root OIDs for all documents which had operations stored already
60
+ * that were not applied to their queryable snapshots because they were in the
61
+ * future. These documents need to be refreshed in storage.
62
+ */
63
+ async function getDocsWithUnappliedMigrations({ currentVersion, newVersion: _, ctx, }) {
64
+ // scan for all operations in metadata after the current version.
65
+ // this could be more efficient if also filtering below or equal newVersion but
66
+ // that seems so unlikely in practice...
67
+ const unappliedOperations = [];
68
+ await ctx.meta.iterateAllOperations((op) => {
69
+ unappliedOperations.push(op);
70
+ }, {
71
+ from: ctx.time.zeroWithVersion(currentVersion + 1),
72
+ });
73
+ return Array.from(new Set(unappliedOperations.map((op) => getOidRoot(op.oid))));
74
+ }
75
+ //# sourceMappingURL=finalize.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"finalize.js","sourceRoot":"","sources":["../../../../src/persistence/migration/finalize.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import { Migration } from '@verdant-web/common';
2
+ import { OpenDocumentDbContext } from './types.js';
3
+ import { PersistenceNamespace } from '../interfaces.js';
4
+ export declare function migrate({ context, version, }: {
5
+ context: OpenDocumentDbContext;
6
+ version: number;
7
+ }): Promise<void>;
8
+ export declare function runMigrations({ context, toRun, ns, }: {
9
+ context: OpenDocumentDbContext;
10
+ toRun: Migration<any>[];
11
+ ns: PersistenceNamespace;
12
+ }): Promise<void>;
@@ -0,0 +1,89 @@
1
+ import { getMigrationPath } from './paths.js';
2
+ import { getMigrationEngine } from './engine.js';
3
+ import { finalizeMigration } from './finalize.js';
4
+ import { ShutdownHandler } from '../../context/ShutdownHandler.js';
5
+ export async function migrate({ context, version, }) {
6
+ const ns = await context.persistence.openNamespace(context.namespace, context);
7
+ await acquireLock(context.namespace, async () => {
8
+ const currentVersion = await context.persistence.getNamespaceVersion(context.namespace);
9
+ context.log('debug', 'Opening index database', context.namespace, 'Current database version:', currentVersion, 'target version:', version, context.schema.wip ? '(wip)' : '');
10
+ const toRun = getMigrationPath({
11
+ currentVersion,
12
+ targetVersion: version,
13
+ migrations: context.migrations,
14
+ });
15
+ if (toRun.length > 0) {
16
+ context.log('debug', 'Migrations to run:', toRun.map((m) => m.version));
17
+ await runMigrations({ context, ns, toRun });
18
+ }
19
+ });
20
+ }
21
+ async function acquireLock(namespace, procedure) {
22
+ if (typeof navigator !== 'undefined' && navigator.locks) {
23
+ await navigator.locks.request(`verdant_migration_${namespace}`, procedure);
24
+ }
25
+ else {
26
+ // TODO: is there a fallback?
27
+ await procedure();
28
+ }
29
+ }
30
+ export async function runMigrations({ context, toRun, ns, }) {
31
+ // disable rebasing for the duration of migrations
32
+ context.pauseRebasing = true;
33
+ // now the fun part
34
+ for (const migration of toRun) {
35
+ context.log('info', `🚀 Running migration v${migration.oldSchema.version} -> v${migration.newSchema.version}`);
36
+ const migrationContext = Object.assign(Object.assign({}, context), { schema: migration.oldSchema, shutdownHandler: new ShutdownHandler() });
37
+ // this will only write to our metadata store via operations!
38
+ const engine = await getMigrationEngine({
39
+ migration,
40
+ context: migrationContext,
41
+ ns,
42
+ });
43
+ try {
44
+ context.log('debug', 'Migrating data', migrationContext.namespace, 'from version', migration.oldSchema.version, 'to version', migration.newSchema.version);
45
+ await migration.migrate(engine);
46
+ // wait on any out-of-band async operations to complete
47
+ await Promise.all(engine.awaitables);
48
+ }
49
+ catch (err) {
50
+ context.log('critical', `Migration failed (${migration.oldSchema.version} -> ${migration.newSchema.version})`, err);
51
+ if (err instanceof Error) {
52
+ throw err;
53
+ }
54
+ else {
55
+ throw new Error('Unknown error during migration');
56
+ }
57
+ }
58
+ await engine.close();
59
+ migrationContext.log('debug', 'Upgrading database', migrationContext.namespace, 'from version', migrationContext.schema.version, 'to version', migration.newSchema.version);
60
+ await ns.applyMigration(migrationContext, migration);
61
+ // switch to the new schema
62
+ migrationContext.schema = migration.newSchema;
63
+ const upgradedDocuments = await ns.openDocuments(migrationContext);
64
+ await finalizeMigration({
65
+ ctx: migrationContext,
66
+ migration,
67
+ engine,
68
+ documents: upgradedDocuments,
69
+ });
70
+ await upgradedDocuments.close();
71
+ migrationContext.log('debug', `Migration of ${migrationContext.namespace} complete.`);
72
+ migrationContext.log('info', `
73
+ ⬆️ v${migration.newSchema.version} Migration complete. Here's the rundown:
74
+ - Added collections: ${migration.addedCollections.join(', ')}
75
+ - Removed collections: ${migration.removedCollections.join(', ')}
76
+ - Changed collections: ${migration.changedCollections.join(', ')}
77
+ - New indexes: ${Object.keys(migration.addedIndexes)
78
+ .map((col) => migration.addedIndexes[col].map((i) => `${col}.${i.name}`))
79
+ .flatMap((i) => i)
80
+ .join(', ')}
81
+ - Removed indexes: ${Object.keys(migration.removedIndexes)
82
+ .map((col) => migration.removedIndexes[col].map((i) => `${col}.${i.name}`))
83
+ .flatMap((i) => i)
84
+ .join(', ')}
85
+ `);
86
+ }
87
+ context.pauseRebasing = false;
88
+ }
89
+ //# sourceMappingURL=migrate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"migrate.js","sourceRoot":"","sources":["../../../../src/persistence/migration/migrate.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"paths.js","sourceRoot":"","sources":["../../../../src/persistence/migration/paths.ts"],"names":[],"mappings":"AAAA,OAAO,EAAa,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAE9D,MAAM,UAAU,gBAAgB,CAAC,EAChC,cAAc,EACd,aAAa,EACb,UAAU,GAKV;IACA,MAAM,IAAI,GAAG,eAAe,CAAC;QAC5B,cAAc;QACd,aAAa;QACb,UAAU;KACV,CAAC,CAAC;IACH,IAAI,CAAC,IAAI,EAAE,CAAC;QACX,MAAM,IAAI,YAAY,CACrB,YAAY,CAAC,IAAI,CAAC,qBAAqB,EACvC,SAAS,EACT,gCAAgC,cAAc,OAAO,aAAa,wHAAwH,CAC1L,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACb,CAAC;AAED,SAAS,eAAe,CAAC,EACxB,cAAc,EACd,aAAa,EACb,UAAU,GAKV;IACA,IAAI,cAAc,KAAK,aAAa,EAAE,CAAC;QACtC,OAAO,EAAE,CAAC;IACX,CAAC;IAED,MAAM,QAAQ,GAAG,UAAU;SACzB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,OAAO,KAAK,cAAc,CAAC;SACrD,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,OAAO,GAAG,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;IAE5D,0DAA0D;IAC1D,mEAAmE;IACnE,OAAO,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC5B,MAAM,IAAI,GAAG,QAAQ,CAAC,KAAK,EAAG,CAAC;QAC/B,6DAA6D;QAC7D,IAAI,IAAI,CAAC,SAAS,CAAC,OAAO,GAAG,aAAa,EAAE,CAAC;YAC5C,OAAO,IAAI,CAAC;QACb,CAAC;QACD,4CAA4C;QAC5C,IAAI,IAAI,CAAC,SAAS,CAAC,OAAO,KAAK,aAAa,EAAE,CAAC;YAC9C,OAAO,CAAC,IAAI,CAAC,CAAC;QACf,CAAC;QACD,6DAA6D;QAC7D,uBAAuB;QACvB,MAAM,QAAQ,GAAG,eAAe,CAAC;YAChC,cAAc,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO;YACtC,aAAa;YACb,UAAU;SACV,CAAC,CAAC;QACH,IAAI,QAAQ,EAAE,CAAC;YACd,OAAO,CAAC,IAAI,EAAE,GAAG,QAAQ,CAAC,CAAC;QAC5B,CAAC;QAED,uDAAuD;IACxD,CAAC;IAED,yEAAyE;IACzE,iEAAiE;IACjE,wBAAwB;IACxB,OAAO,IAAI,CAAC;AACb,CAAC"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"paths.test.js","sourceRoot":"","sources":["../../../../src/persistence/migration/paths.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Context } from '../../context/context.js';
2
+ /** During migration, only a partial context is available */
3
+ export type OpenDocumentDbContext = Omit<Context, 'documents' | 'files'>;
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../src/persistence/migration/types.ts"],"names":[],"mappings":""}