@verdant-web/store 3.12.1 → 4.0.0-next.0

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 (279) hide show
  1. package/dist/bundle/index.js +11 -13
  2. package/dist/bundle/index.js.map +4 -4
  3. package/dist/esm/__tests__/batching.test.js +5 -5
  4. package/dist/esm/__tests__/batching.test.js.map +1 -1
  5. package/dist/esm/__tests__/entities.test.js +1 -1
  6. package/dist/esm/__tests__/entities.test.js.map +1 -1
  7. package/dist/esm/__tests__/fixtures/testStorage.d.ts +1 -3
  8. package/dist/esm/__tests__/fixtures/testStorage.js +3 -3
  9. package/dist/esm/__tests__/fixtures/testStorage.js.map +1 -1
  10. package/dist/esm/__tests__/queries.test.js.map +1 -1
  11. package/dist/esm/backup.d.ts +3 -4
  12. package/dist/esm/backup.js.map +1 -1
  13. package/dist/esm/client/Client.d.ts +28 -33
  14. package/dist/esm/client/Client.js +50 -161
  15. package/dist/esm/client/Client.js.map +1 -1
  16. package/dist/esm/client/ClientDescriptor.d.ts +8 -11
  17. package/dist/esm/client/ClientDescriptor.js +39 -141
  18. package/dist/esm/client/ClientDescriptor.js.map +1 -1
  19. package/dist/esm/context/Time.d.ts +13 -0
  20. package/dist/esm/context/Time.js +27 -0
  21. package/dist/esm/context/Time.js.map +1 -0
  22. package/dist/esm/context/context.d.ts +170 -0
  23. package/dist/esm/{context.js.map → context/context.js.map} +1 -1
  24. package/dist/esm/entities/DocumentManager.js.map +1 -1
  25. package/dist/esm/entities/Entity.d.ts +4 -5
  26. package/dist/esm/entities/Entity.js +5 -3
  27. package/dist/esm/entities/Entity.js.map +1 -1
  28. package/dist/esm/entities/Entity.test.js +4 -3
  29. package/dist/esm/entities/Entity.test.js.map +1 -1
  30. package/dist/esm/entities/EntityCache.d.ts +0 -3
  31. package/dist/esm/entities/EntityCache.js +0 -9
  32. package/dist/esm/entities/EntityCache.js.map +1 -1
  33. package/dist/esm/entities/EntityMetadata.d.ts +1 -1
  34. package/dist/esm/entities/EntityMetadata.js +6 -5
  35. package/dist/esm/entities/EntityMetadata.js.map +1 -1
  36. package/dist/esm/entities/EntityStore.d.ts +2 -6
  37. package/dist/esm/entities/EntityStore.js +22 -16
  38. package/dist/esm/entities/EntityStore.js.map +1 -1
  39. package/dist/esm/entities/OperationBatcher.d.ts +2 -5
  40. package/dist/esm/entities/OperationBatcher.js +9 -7
  41. package/dist/esm/entities/OperationBatcher.js.map +1 -1
  42. package/dist/esm/errors.d.ts +8 -0
  43. package/dist/esm/errors.js +12 -0
  44. package/dist/esm/errors.js.map +1 -0
  45. package/dist/esm/files/EntityFile.d.ts +6 -3
  46. package/dist/esm/files/EntityFile.js +22 -19
  47. package/dist/esm/files/EntityFile.js.map +1 -1
  48. package/dist/esm/files/FileManager.d.ts +8 -39
  49. package/dist/esm/files/FileManager.js +15 -170
  50. package/dist/esm/files/FileManager.js.map +1 -1
  51. package/dist/esm/files/utils.d.ts +0 -1
  52. package/dist/esm/files/utils.js +0 -14
  53. package/dist/esm/files/utils.js.map +1 -1
  54. package/dist/esm/index.d.ts +1 -2
  55. package/dist/esm/index.js +0 -1
  56. package/dist/esm/index.js.map +1 -1
  57. package/dist/esm/{metadata → persistence}/MessageCreator.d.ts +5 -6
  58. package/dist/esm/{metadata → persistence}/MessageCreator.js +31 -38
  59. package/dist/esm/persistence/MessageCreator.js.map +1 -0
  60. package/dist/esm/persistence/PersistenceFiles.d.ts +48 -0
  61. package/dist/esm/persistence/PersistenceFiles.js +160 -0
  62. package/dist/esm/persistence/PersistenceFiles.js.map +1 -0
  63. package/dist/esm/persistence/PersistenceMetadata.d.ts +69 -0
  64. package/dist/esm/persistence/PersistenceMetadata.js +302 -0
  65. package/dist/esm/persistence/PersistenceMetadata.js.map +1 -0
  66. package/dist/esm/persistence/PersistenceQueries.d.ts +34 -0
  67. package/dist/esm/persistence/PersistenceQueries.js +15 -0
  68. package/dist/esm/persistence/PersistenceQueries.js.map +1 -0
  69. package/dist/esm/persistence/PersistenceRebaser.d.ts +32 -0
  70. package/dist/esm/persistence/PersistenceRebaser.js +120 -0
  71. package/dist/esm/persistence/PersistenceRebaser.js.map +1 -0
  72. package/dist/esm/{IDBService.d.ts → persistence/idb/IdbService.d.ts} +9 -7
  73. package/dist/esm/{IDBService.js → persistence/idb/IdbService.js} +29 -8
  74. package/dist/esm/persistence/idb/IdbService.js.map +1 -0
  75. package/dist/esm/persistence/idb/files/IdbPersistenceFileDb.d.ts +58 -0
  76. package/dist/esm/{files/FileStorage.js → persistence/idb/files/IdbPersistenceFileDb.js} +85 -50
  77. package/dist/esm/persistence/idb/files/IdbPersistenceFileDb.js.map +1 -0
  78. package/dist/esm/persistence/idb/idbPersistence.d.ts +19 -0
  79. package/dist/esm/persistence/idb/idbPersistence.js +80 -0
  80. package/dist/esm/persistence/idb/idbPersistence.js.map +1 -0
  81. package/dist/esm/persistence/idb/metadata/IdbMetadataDb.d.ts +72 -0
  82. package/dist/esm/persistence/idb/metadata/IdbMetadataDb.js +235 -0
  83. package/dist/esm/persistence/idb/metadata/IdbMetadataDb.js.map +1 -0
  84. package/dist/esm/{metadata → persistence/idb/metadata}/openMetadataDatabase.d.ts +3 -1
  85. package/dist/esm/{metadata → persistence/idb/metadata}/openMetadataDatabase.js +12 -3
  86. package/dist/esm/persistence/idb/metadata/openMetadataDatabase.js.map +1 -0
  87. package/dist/esm/persistence/idb/queries/IdbQueryDb.d.ts +41 -0
  88. package/dist/esm/persistence/idb/queries/IdbQueryDb.js +174 -0
  89. package/dist/esm/persistence/idb/queries/IdbQueryDb.js.map +1 -0
  90. package/dist/esm/{migration → persistence/idb/queries/migration}/db.d.ts +1 -1
  91. package/dist/esm/{migration → persistence/idb/queries/migration}/db.js +10 -48
  92. package/dist/esm/persistence/idb/queries/migration/db.js.map +1 -0
  93. package/dist/esm/persistence/idb/queries/migration/engine.d.ts +12 -0
  94. package/dist/esm/{migration → persistence/idb/queries/migration}/engine.js +29 -46
  95. package/dist/esm/persistence/idb/queries/migration/engine.js.map +1 -0
  96. package/dist/esm/{migration → persistence/idb/queries/migration}/migrations.d.ts +1 -3
  97. package/dist/esm/{migration → persistence/idb/queries/migration}/migrations.js +11 -10
  98. package/dist/esm/persistence/idb/queries/migration/migrations.js.map +1 -0
  99. package/dist/esm/{migration → persistence/idb/queries/migration}/openQueryDatabase.d.ts +1 -3
  100. package/dist/esm/{migration → persistence/idb/queries/migration}/openQueryDatabase.js +4 -7
  101. package/dist/esm/persistence/idb/queries/migration/openQueryDatabase.js.map +1 -0
  102. package/dist/esm/{migration → persistence/idb/queries/migration}/paths.js +2 -2
  103. package/dist/esm/persistence/idb/queries/migration/paths.js.map +1 -0
  104. package/dist/esm/persistence/idb/queries/migration/paths.test.js.map +1 -0
  105. package/dist/esm/persistence/idb/queries/migration/types.d.ts +6 -0
  106. package/dist/esm/persistence/idb/queries/migration/types.js.map +1 -0
  107. package/dist/esm/persistence/idb/queries/ranges.d.ts +2 -0
  108. package/dist/esm/persistence/idb/queries/ranges.js +66 -0
  109. package/dist/esm/persistence/idb/queries/ranges.js.map +1 -0
  110. package/dist/esm/{idb.d.ts → persistence/idb/util.d.ts} +11 -0
  111. package/dist/esm/{idb.js → persistence/idb/util.js} +58 -1
  112. package/dist/esm/persistence/idb/util.js.map +1 -0
  113. package/dist/esm/persistence/interfaces.d.ts +181 -0
  114. package/dist/esm/persistence/interfaces.js +2 -0
  115. package/dist/esm/persistence/interfaces.js.map +1 -0
  116. package/dist/esm/persistence/persistence.d.ts +4 -0
  117. package/dist/esm/persistence/persistence.js +126 -0
  118. package/dist/esm/persistence/persistence.js.map +1 -0
  119. package/dist/esm/queries/BaseQuery.d.ts +2 -1
  120. package/dist/esm/queries/BaseQuery.js +3 -0
  121. package/dist/esm/queries/BaseQuery.js.map +1 -1
  122. package/dist/esm/queries/CollectionQueries.d.ts +1 -1
  123. package/dist/esm/queries/FindAllQuery.js +1 -3
  124. package/dist/esm/queries/FindAllQuery.js.map +1 -1
  125. package/dist/esm/queries/FindInfiniteQuery.js +2 -5
  126. package/dist/esm/queries/FindInfiniteQuery.js.map +1 -1
  127. package/dist/esm/queries/FindOneQuery.js +1 -3
  128. package/dist/esm/queries/FindOneQuery.js.map +1 -1
  129. package/dist/esm/queries/FindPageQuery.js +1 -3
  130. package/dist/esm/queries/FindPageQuery.js.map +1 -1
  131. package/dist/esm/queries/QueryCache.d.ts +1 -1
  132. package/dist/esm/queries/QueryCache.js +4 -0
  133. package/dist/esm/queries/QueryCache.js.map +1 -1
  134. package/dist/esm/sync/FileSync.d.ts +23 -8
  135. package/dist/esm/sync/FileSync.js +76 -28
  136. package/dist/esm/sync/FileSync.js.map +1 -1
  137. package/dist/esm/sync/PresenceManager.d.ts +4 -3
  138. package/dist/esm/sync/PresenceManager.js +2 -2
  139. package/dist/esm/sync/PresenceManager.js.map +1 -1
  140. package/dist/esm/sync/PushPullSync.d.ts +4 -6
  141. package/dist/esm/sync/PushPullSync.js +13 -12
  142. package/dist/esm/sync/PushPullSync.js.map +1 -1
  143. package/dist/esm/sync/Sync.d.ts +9 -11
  144. package/dist/esm/sync/Sync.js +34 -29
  145. package/dist/esm/sync/Sync.js.map +1 -1
  146. package/dist/esm/sync/WebSocketSync.d.ts +4 -6
  147. package/dist/esm/sync/WebSocketSync.js +20 -22
  148. package/dist/esm/sync/WebSocketSync.js.map +1 -1
  149. package/dist/esm/utils/Disposable.d.ts +5 -2
  150. package/dist/esm/utils/Disposable.js +3 -2
  151. package/dist/esm/utils/Disposable.js.map +1 -1
  152. package/dist/esm/utils/wip.d.ts +2 -0
  153. package/dist/esm/utils/wip.js +5 -0
  154. package/dist/esm/utils/wip.js.map +1 -0
  155. package/package.json +2 -2
  156. package/src/__tests__/batching.test.ts +6 -6
  157. package/src/__tests__/entities.test.ts +1 -1
  158. package/src/__tests__/fixtures/testStorage.ts +2 -10
  159. package/src/__tests__/queries.test.ts +1 -1
  160. package/src/backup.ts +3 -4
  161. package/src/client/Client.ts +69 -226
  162. package/src/client/ClientDescriptor.ts +53 -184
  163. package/src/context/Time.ts +35 -0
  164. package/src/context/context.ts +200 -0
  165. package/src/entities/DocumentManager.ts +0 -3
  166. package/src/entities/Entity.test.ts +9 -9
  167. package/src/entities/Entity.ts +6 -12
  168. package/src/entities/EntityCache.ts +0 -9
  169. package/src/entities/EntityMetadata.ts +4 -4
  170. package/src/entities/EntityStore.ts +26 -29
  171. package/src/entities/OperationBatcher.ts +9 -11
  172. package/src/errors.ts +13 -0
  173. package/src/files/EntityFile.ts +16 -5
  174. package/src/files/FileManager.ts +18 -245
  175. package/src/files/utils.ts +0 -15
  176. package/src/index.ts +2 -1
  177. package/src/{metadata → persistence}/MessageCreator.ts +46 -36
  178. package/src/persistence/PersistenceFiles.ts +227 -0
  179. package/src/persistence/PersistenceMetadata.ts +425 -0
  180. package/src/persistence/PersistenceQueries.ts +22 -0
  181. package/src/persistence/PersistenceRebaser.ts +171 -0
  182. package/src/{IDBService.ts → persistence/idb/IdbService.ts} +45 -12
  183. package/src/{files/FileStorage.ts → persistence/idb/files/IdbPersistenceFileDb.ts} +128 -86
  184. package/src/persistence/idb/idbPersistence.ts +116 -0
  185. package/src/persistence/idb/metadata/IdbMetadataDb.ts +460 -0
  186. package/src/{metadata → persistence/idb/metadata}/openMetadataDatabase.ts +21 -4
  187. package/src/persistence/idb/queries/IdbQueryDb.ts +251 -0
  188. package/src/{migration → persistence/idb/queries/migration}/db.ts +18 -72
  189. package/src/{migration → persistence/idb/queries/migration}/engine.ts +39 -62
  190. package/src/{migration → persistence/idb/queries/migration}/migrations.ts +13 -18
  191. package/src/{migration → persistence/idb/queries/migration}/openQueryDatabase.ts +5 -14
  192. package/src/{migration → persistence/idb/queries/migration}/paths.ts +4 -3
  193. package/src/persistence/idb/queries/migration/types.ts +8 -0
  194. package/src/persistence/idb/queries/ranges.ts +107 -0
  195. package/src/{idb.ts → persistence/idb/util.ts} +75 -0
  196. package/src/persistence/interfaces.ts +240 -0
  197. package/src/persistence/persistence.ts +223 -0
  198. package/src/queries/BaseQuery.ts +5 -1
  199. package/src/queries/CollectionQueries.ts +2 -2
  200. package/src/queries/FindAllQuery.ts +1 -3
  201. package/src/queries/FindInfiniteQuery.ts +2 -5
  202. package/src/queries/FindOneQuery.ts +1 -3
  203. package/src/queries/FindPageQuery.ts +1 -3
  204. package/src/queries/QueryCache.ts +20 -1
  205. package/src/sync/FileSync.ts +93 -30
  206. package/src/sync/PresenceManager.ts +5 -7
  207. package/src/sync/PushPullSync.ts +23 -19
  208. package/src/sync/Sync.ts +45 -36
  209. package/src/sync/WebSocketSync.ts +41 -27
  210. package/src/utils/Disposable.ts +7 -4
  211. package/src/utils/wip.ts +5 -0
  212. package/dist/esm/IDBService.js.map +0 -1
  213. package/dist/esm/__tests__/legacyOids.test.d.ts +0 -1
  214. package/dist/esm/__tests__/legacyOids.test.js +0 -352
  215. package/dist/esm/__tests__/legacyOids.test.js.map +0 -1
  216. package/dist/esm/context.d.ts +0 -45
  217. package/dist/esm/files/FileStorage.d.ts +0 -47
  218. package/dist/esm/files/FileStorage.js.map +0 -1
  219. package/dist/esm/idb.js.map +0 -1
  220. package/dist/esm/metadata/AckInfoStore.d.ts +0 -10
  221. package/dist/esm/metadata/AckInfoStore.js +0 -22
  222. package/dist/esm/metadata/AckInfoStore.js.map +0 -1
  223. package/dist/esm/metadata/BaselinesStore.d.ts +0 -40
  224. package/dist/esm/metadata/BaselinesStore.js +0 -102
  225. package/dist/esm/metadata/BaselinesStore.js.map +0 -1
  226. package/dist/esm/metadata/LocalReplicaStore.d.ts +0 -19
  227. package/dist/esm/metadata/LocalReplicaStore.js +0 -56
  228. package/dist/esm/metadata/LocalReplicaStore.js.map +0 -1
  229. package/dist/esm/metadata/MessageCreator.js.map +0 -1
  230. package/dist/esm/metadata/Metadata.d.ts +0 -146
  231. package/dist/esm/metadata/Metadata.js +0 -452
  232. package/dist/esm/metadata/Metadata.js.map +0 -1
  233. package/dist/esm/metadata/OperationsStore.d.ts +0 -62
  234. package/dist/esm/metadata/OperationsStore.js +0 -175
  235. package/dist/esm/metadata/OperationsStore.js.map +0 -1
  236. package/dist/esm/metadata/SchemaStore.d.ts +0 -9
  237. package/dist/esm/metadata/SchemaStore.js +0 -35
  238. package/dist/esm/metadata/SchemaStore.js.map +0 -1
  239. package/dist/esm/metadata/openMetadataDatabase.js.map +0 -1
  240. package/dist/esm/migration/db.js.map +0 -1
  241. package/dist/esm/migration/engine.d.ts +0 -15
  242. package/dist/esm/migration/engine.js.map +0 -1
  243. package/dist/esm/migration/errors.d.ts +0 -5
  244. package/dist/esm/migration/errors.js +0 -8
  245. package/dist/esm/migration/errors.js.map +0 -1
  246. package/dist/esm/migration/migrations.js.map +0 -1
  247. package/dist/esm/migration/openQueryDatabase.js.map +0 -1
  248. package/dist/esm/migration/openWIPDatabase.d.ts +0 -11
  249. package/dist/esm/migration/openWIPDatabase.js +0 -65
  250. package/dist/esm/migration/openWIPDatabase.js.map +0 -1
  251. package/dist/esm/migration/paths.js.map +0 -1
  252. package/dist/esm/migration/paths.test.js.map +0 -1
  253. package/dist/esm/migration/types.d.ts +0 -3
  254. package/dist/esm/migration/types.js.map +0 -1
  255. package/dist/esm/queries/QueryableStorage.d.ts +0 -20
  256. package/dist/esm/queries/QueryableStorage.js +0 -90
  257. package/dist/esm/queries/QueryableStorage.js.map +0 -1
  258. package/dist/esm/queries/dbQueries.d.ts +0 -22
  259. package/dist/esm/queries/dbQueries.js +0 -130
  260. package/dist/esm/queries/dbQueries.js.map +0 -1
  261. package/src/__tests__/legacyOids.test.ts +0 -375
  262. package/src/context.ts +0 -55
  263. package/src/metadata/AckInfoStore.ts +0 -30
  264. package/src/metadata/BaselinesStore.ts +0 -188
  265. package/src/metadata/LocalReplicaStore.ts +0 -79
  266. package/src/metadata/Metadata.ts +0 -685
  267. package/src/metadata/OperationsStore.ts +0 -332
  268. package/src/metadata/SchemaStore.ts +0 -47
  269. package/src/migration/errors.ts +0 -7
  270. package/src/migration/openWIPDatabase.ts +0 -97
  271. package/src/migration/types.ts +0 -4
  272. package/src/queries/QueryableStorage.ts +0 -122
  273. package/src/queries/dbQueries.ts +0 -161
  274. /package/dist/esm/{context.js → context/context.js} +0 -0
  275. /package/dist/esm/{migration → persistence/idb/queries/migration}/paths.d.ts +0 -0
  276. /package/dist/esm/{migration → persistence/idb/queries/migration}/paths.test.d.ts +0 -0
  277. /package/dist/esm/{migration → persistence/idb/queries/migration}/paths.test.js +0 -0
  278. /package/dist/esm/{migration → persistence/idb/queries/migration}/types.js +0 -0
  279. /package/src/{migration → persistence/idb/queries/migration}/paths.test.ts +0 -0
@@ -4,28 +4,26 @@ import {
4
4
  PresenceUpdateMessage,
5
5
  ServerMessage,
6
6
  VerdantErrorCode,
7
- debounce,
8
7
  isVerdantErrorResponse,
9
8
  throttle,
10
9
  } from '@verdant-web/common';
11
- import { Metadata } from '../metadata/Metadata.js';
12
10
  import { PresenceManager } from './PresenceManager.js';
13
11
  import { Heartbeat } from './Heartbeat.js';
14
12
  import { ServerSyncEndpointProvider } from './ServerSyncEndpointProvider.js';
15
13
  import { SyncTransport, SyncTransportEvents } from './Sync.js';
14
+ import { Context } from '../context/context.js';
16
15
 
17
16
  export class PushPullSync
18
17
  extends EventSubscriber<SyncTransportEvents>
19
18
  implements SyncTransport
20
19
  {
21
- readonly meta: Metadata;
22
20
  readonly presence: PresenceManager;
23
21
  private endpointProvider;
24
22
  private heartbeat;
25
23
  private fetch;
26
24
 
27
25
  readonly mode = 'pull';
28
- private log;
26
+ private ctx;
29
27
 
30
28
  private _isConnected = false;
31
29
  private _status: 'active' | 'paused' = 'paused';
@@ -33,22 +31,19 @@ export class PushPullSync
33
31
 
34
32
  constructor({
35
33
  endpointProvider,
36
- meta,
37
34
  presence,
38
35
  interval = 15 * 1000,
39
- log = () => {},
40
36
  fetch = window.fetch.bind(window),
37
+ ctx,
41
38
  }: {
42
39
  endpointProvider: ServerSyncEndpointProvider;
43
- meta: Metadata;
44
40
  presence: PresenceManager;
45
41
  interval?: number;
46
- log?: (...args: any[]) => any;
47
42
  fetch?: typeof window.fetch;
43
+ ctx: Context;
48
44
  }) {
49
45
  super();
50
- this.log = log;
51
- this.meta = meta;
46
+ this.ctx = ctx;
52
47
  this.presence = presence;
53
48
  this.endpointProvider = endpointProvider;
54
49
  this.fetch = fetch;
@@ -73,7 +68,7 @@ export class PushPullSync
73
68
  }
74
69
 
75
70
  private sendRequest = async (messages: ClientMessage[]) => {
76
- this.log('Sending sync request', messages);
71
+ this.ctx.log('debug', 'Sending sync request', messages);
77
72
  try {
78
73
  const { http: host, token } = await this.endpointProvider.getEndpoints();
79
74
  const response = await this.fetch(host, {
@@ -104,7 +99,12 @@ export class PushPullSync
104
99
  }
105
100
  await handlePromise;
106
101
  } else {
107
- this.log('Sync request failed', response.status, await response.text());
102
+ this.ctx.log(
103
+ 'error',
104
+ 'Sync request failed',
105
+ response.status,
106
+ await response.text(),
107
+ );
108
108
 
109
109
  if (this._isConnected) {
110
110
  this._isConnected = false;
@@ -130,7 +130,7 @@ export class PushPullSync
130
130
  this._isConnected = false;
131
131
  this.emit('onlineChange', false);
132
132
  }
133
- this.log(error);
133
+ this.ctx.log('error', error);
134
134
 
135
135
  this.heartbeat.keepAlive();
136
136
  }
@@ -142,9 +142,9 @@ export class PushPullSync
142
142
  // but we can go ahead and preemptively allow ops to be sent
143
143
  this._hasSynced = true;
144
144
  if (message.ackThisNonce) {
145
- this.log('Sending sync ack', message.ackThisNonce);
145
+ this.ctx.log('debug', 'Sending sync ack', message.ackThisNonce);
146
146
  await this.sendRequest([
147
- await this.meta.messageCreator.createAck(message.ackThisNonce),
147
+ await this.ctx.meta.messageCreator.createAck(message.ackThisNonce),
148
148
  ]);
149
149
  }
150
150
  }
@@ -204,8 +204,10 @@ export class PushPullSync
204
204
  // will include the client's own presence info and fill in missing profile
205
205
  // data on the first request. otherwise it would have to wait for the second.
206
206
  this.sendRequest([
207
- await this.meta.messageCreator.createPresenceUpdate(this.presence.self),
208
- await this.meta.messageCreator.createSyncStep1(),
207
+ await this.ctx.meta.messageCreator.createPresenceUpdate(
208
+ this.presence.self,
209
+ ),
210
+ await this.ctx.meta.messageCreator.createSyncStep1(),
209
211
  ]);
210
212
  };
211
213
 
@@ -213,12 +215,14 @@ export class PushPullSync
213
215
  // the connection is lost and go offline.
214
216
  private onHeartbeatMissed = async () => {
215
217
  this.emit('onlineChange', false);
216
- this.log('Missed heartbeat');
218
+ this.ctx.log('warn', 'Missed heartbeat');
217
219
  this._isConnected = false;
218
220
  };
219
221
 
220
222
  syncOnce = async () => {
221
- await this.sendRequest([await this.meta.messageCreator.createSyncStep1()]);
223
+ await this.sendRequest([
224
+ await this.ctx.meta.messageCreator.createSyncStep1(),
225
+ ]);
222
226
  };
223
227
 
224
228
  get isConnected(): boolean {
package/src/sync/Sync.ts CHANGED
@@ -10,7 +10,6 @@ import {
10
10
  VerdantError,
11
11
  VerdantInternalPresence,
12
12
  } from '@verdant-web/common';
13
- import { Metadata } from '../metadata/Metadata.js';
14
13
  import { HANDLE_MESSAGE, PresenceManager } from './PresenceManager.js';
15
14
  import { FilePullResult, FileSync, FileUploadResult } from './FileSync.js';
16
15
  import { PushPullSync } from './PushPullSync.js';
@@ -19,7 +18,7 @@ import {
19
18
  ServerSyncEndpointProviderConfig,
20
19
  } from './ServerSyncEndpointProvider.js';
21
20
  import { WebSocketSync } from './WebSocketSync.js';
22
- import { Context } from '../context.js';
21
+ import { Context } from '../context/context.js';
23
22
  import { attemptToRegisterBackgroundSync } from './background.js';
24
23
 
25
24
  type SyncEvents = {
@@ -100,12 +99,12 @@ export class NoSync<Presence = any, Profile = any>
100
99
 
101
100
  public readonly presence;
102
101
 
103
- constructor({ meta }: { meta: Metadata }) {
102
+ constructor(ctx: Context) {
104
103
  super();
105
104
  this.presence = new PresenceManager({
106
105
  initialPresence: null as any,
107
106
  defaultProfile: null as any,
108
- replicaStore: meta.localReplica,
107
+ ctx,
109
108
  });
110
109
  }
111
110
 
@@ -119,7 +118,7 @@ export class NoSync<Presence = any, Profile = any>
119
118
  getFile = async (): Promise<FilePullResult> => {
120
119
  return {
121
120
  success: false,
122
- retry: false,
121
+ error: 'Sync is not active',
123
122
  };
124
123
  };
125
124
 
@@ -206,13 +205,11 @@ export class ServerSync<Presence = any, Profile = any>
206
205
  private broadcastChannel: BroadcastChannel | null = null;
207
206
  private _activelySyncing = false;
208
207
 
209
- private meta: Metadata;
210
-
211
208
  readonly presence: PresenceManager<Profile, Presence>;
212
209
 
213
210
  private onOutgoingMessage?: (message: ClientMessage) => void;
214
211
 
215
- private log;
212
+ private ctx;
216
213
 
217
214
  constructor(
218
215
  {
@@ -231,11 +228,9 @@ export class ServerSync<Presence = any, Profile = any>
231
228
  EXPERIMENTAL_backgroundSync,
232
229
  }: ServerSyncOptions<Profile, Presence>,
233
230
  {
234
- meta,
235
231
  ctx,
236
232
  onData,
237
233
  }: {
238
- meta: Metadata;
239
234
  ctx: Context;
240
235
  onData: (data: {
241
236
  operations: Operation[];
@@ -245,15 +240,14 @@ export class ServerSync<Presence = any, Profile = any>
245
240
  },
246
241
  ) {
247
242
  super();
248
- this.meta = meta;
249
243
  this.onData = onData;
250
- this.log = ctx.log;
244
+ this.ctx = ctx;
251
245
  this.onOutgoingMessage = onOutgoingMessage;
252
246
  this.presence = new PresenceManager({
253
247
  initialPresence,
254
248
  defaultProfile,
255
249
  updateBatchTimeout: presenceUpdateBatchTimeout,
256
- replicaStore: meta.localReplica,
250
+ ctx,
257
251
  });
258
252
  this.endpointProvider = new ServerSyncEndpointProvider({
259
253
  authEndpoint,
@@ -263,21 +257,19 @@ export class ServerSync<Presence = any, Profile = any>
263
257
 
264
258
  this.webSocketSync = new WebSocketSync({
265
259
  endpointProvider: this.endpointProvider,
266
- meta,
267
260
  presence: this.presence,
268
- log: ctx.log,
261
+ ctx,
269
262
  });
270
263
  this.pushPullSync = new PushPullSync({
271
264
  endpointProvider: this.endpointProvider,
272
- meta,
273
265
  presence: this.presence,
274
- log: ctx.log,
275
266
  interval: pullInterval,
276
267
  fetch,
268
+ ctx,
277
269
  });
278
270
  this.fileSync = new FileSync({
279
271
  endpointProvider: this.endpointProvider,
280
- log: ctx.log,
272
+ ctx,
281
273
  });
282
274
  if (useBroadcastChannel && 'BroadcastChannel' in window) {
283
275
  this.broadcastChannel = new BroadcastChannel(`verdant-${ctx.namespace}`);
@@ -294,7 +286,7 @@ export class ServerSync<Presence = any, Profile = any>
294
286
 
295
287
  this.presence.subscribe('update', this.handlePresenceUpdate);
296
288
 
297
- this.meta.subscribe('message', this.send);
289
+ ctx.meta.events.subscribe('syncMessage', this.send);
298
290
 
299
291
  this.webSocketSync.subscribe('message', this.handleMessage);
300
292
  this.webSocketSync.subscribe('onlineChange', this.handleOnlineChange);
@@ -360,10 +352,6 @@ export class ServerSync<Presence = any, Profile = any>
360
352
  }
361
353
  };
362
354
 
363
- private onTokenExpired = () => {
364
- this.endpointProvider.clearCache();
365
- };
366
-
367
355
  private handleMessage = async (
368
356
  message: ServerMessage,
369
357
  { source }: { source: 'network' | 'broadcastChannel' } = {
@@ -373,11 +361,11 @@ export class ServerSync<Presence = any, Profile = any>
373
361
  // TODO: move this into metadata
374
362
  if (message.type === 'op-re' || message.type === 'sync-resp') {
375
363
  for (const op of message.operations) {
376
- this.meta.time.update(op.timestamp);
364
+ this.ctx.time.update(op.timestamp);
377
365
  }
378
366
  }
379
367
 
380
- this.log('debug', 'sync message', JSON.stringify(message, null, 2));
368
+ this.ctx.log('debug', 'sync message', JSON.stringify(message, null, 2));
381
369
  switch (message.type) {
382
370
  case 'op-re':
383
371
  await this.onData({
@@ -385,11 +373,11 @@ export class ServerSync<Presence = any, Profile = any>
385
373
  baselines: message.baselines,
386
374
  });
387
375
  if (message.globalAckTimestamp) {
388
- await this.meta.setGlobalAck(message.globalAckTimestamp);
376
+ await this.ctx.meta.setGlobalAck(message.globalAckTimestamp);
389
377
  }
390
378
  break;
391
379
  case 'global-ack':
392
- await this.meta.setGlobalAck(message.timestamp);
380
+ await this.ctx.meta.setGlobalAck(message.timestamp);
393
381
  break;
394
382
  case 'sync-resp':
395
383
  this._activelySyncing = true;
@@ -401,21 +389,22 @@ export class ServerSync<Presence = any, Profile = any>
401
389
  });
402
390
 
403
391
  if (message.globalAckTimestamp) {
404
- await this.meta.setGlobalAck(message.globalAckTimestamp);
392
+ await this.ctx.meta.setGlobalAck(message.globalAckTimestamp);
405
393
  }
406
394
 
407
- await this.meta.updateLastSynced(message.ackedTimestamp);
395
+ await this.ctx.meta.updateLastSynced(message.ackedTimestamp);
408
396
  this._activelySyncing = false;
409
397
  this.emit('syncingChange', false);
410
398
  break;
411
399
  case 'need-since':
412
400
  this.emit('serverReset', message.since);
401
+ this.ctx.files.onServerReset(message.since);
413
402
  this.activeSync.send(
414
- await this.meta.messageCreator.createSyncStep1(message.since),
403
+ await this.ctx.meta.messageCreator.createSyncStep1(message.since),
415
404
  );
416
405
  break;
417
406
  case 'server-ack':
418
- await this.meta.updateLastSynced(message.timestamp);
407
+ await this.ctx.meta.updateLastSynced(message.timestamp);
419
408
  }
420
409
 
421
410
  // avoid rebroadcasting messages
@@ -427,16 +416,36 @@ export class ServerSync<Presence = any, Profile = any>
427
416
  }
428
417
 
429
418
  // update presence if necessary
430
- this.presence[HANDLE_MESSAGE](await this.meta.localReplica.get(), message);
419
+ this.presence[HANDLE_MESSAGE](
420
+ await this.ctx.meta.getLocalReplica(),
421
+ message,
422
+ );
431
423
  };
432
- private handleOnlineChange = (online: boolean) => {
424
+ private handleOnlineChange = async (online: boolean) => {
433
425
  this.emit('onlineChange', online);
426
+
427
+ // if online, attempt to upload any unsynced files.
428
+ if (online) {
429
+ const unsyncedFiles = await this.ctx.files.listUnsynced();
430
+ const results = await Promise.allSettled(
431
+ unsyncedFiles.map((file) => this.fileSync.uploadFile(file)),
432
+ );
433
+ if (results.some((r) => r.status === 'rejected')) {
434
+ this.ctx.log(
435
+ 'error',
436
+ 'Failed to upload unsynced files',
437
+ results
438
+ .filter((r): r is PromiseRejectedResult => r.status === 'rejected')
439
+ .map((r) => r.reason),
440
+ );
441
+ }
442
+ }
434
443
  };
435
444
  private handlePresenceUpdate = async (data: {
436
445
  presence?: Presence;
437
446
  internal?: VerdantInternalPresence;
438
447
  }) => {
439
- this.send(await this.meta.messageCreator.createPresenceUpdate(data));
448
+ this.send(await this.ctx.meta.messageCreator.createPresenceUpdate(data));
440
449
  };
441
450
 
442
451
  setMode = (transport: SyncTransportMode) => {
@@ -454,7 +463,7 @@ export class ServerSync<Presence = any, Profile = any>
454
463
  }
455
464
 
456
465
  if (newSync === this.activeSync) return;
457
- this.log('debug', 'switching to', transport, 'mode');
466
+ this.ctx.log('debug', 'switching to', transport, 'mode');
458
467
 
459
468
  // transfer state to new sync
460
469
  if (this.activeSync.status === 'active') {
@@ -496,7 +505,7 @@ export class ServerSync<Presence = any, Profile = any>
496
505
  };
497
506
 
498
507
  uploadFile = async (info: FileData) => {
499
- this.log('info', 'Uploading file', {
508
+ this.ctx.log('info', 'Uploading file', {
500
509
  name: info.name,
501
510
  type: info.type,
502
511
  id: info.id,
@@ -4,17 +4,16 @@ import {
4
4
  ServerMessage,
5
5
  } from '@verdant-web/common';
6
6
  import { Backoff, BackoffScheduler } from '../BackoffScheduler.js';
7
- import { Metadata } from '../metadata/Metadata.js';
8
7
  import { Heartbeat } from './Heartbeat.js';
9
8
  import { PresenceManager } from './PresenceManager.js';
10
9
  import { ServerSyncEndpointProvider } from './ServerSyncEndpointProvider.js';
11
10
  import { SyncTransport, SyncTransportEvents } from './Sync.js';
11
+ import { Context } from '../context/context.js';
12
12
 
13
13
  export class WebSocketSync
14
14
  extends EventSubscriber<SyncTransportEvents>
15
15
  implements SyncTransport
16
16
  {
17
- private meta: Metadata;
18
17
  readonly presence: PresenceManager;
19
18
  private socket: WebSocket | null = null;
20
19
  // messages awaiting websocket connection to send
@@ -30,7 +29,7 @@ export class WebSocketSync
30
29
  private _ignoreIncoming = false;
31
30
 
32
31
  readonly mode = 'realtime';
33
- private log = (...args: any[]) => {};
32
+ private ctx: Context;
34
33
 
35
34
  private heartbeat = new Heartbeat();
36
35
 
@@ -40,19 +39,16 @@ export class WebSocketSync
40
39
 
41
40
  constructor({
42
41
  endpointProvider,
43
- meta,
42
+ ctx,
44
43
  presence,
45
- log,
46
44
  }: {
47
45
  endpointProvider: ServerSyncEndpointProvider;
48
- meta: Metadata;
46
+ ctx: Context;
49
47
  presence: PresenceManager;
50
- log?: (...args: any[]) => any;
51
48
  }) {
52
49
  super();
53
- this.log = log || this.log;
50
+ this.ctx = ctx;
54
51
  this.endpointProvider = endpointProvider;
55
- this.meta = meta;
56
52
  this.presence = presence;
57
53
 
58
54
  this.reconnectScheduler.subscribe('trigger', this.initializeSocket);
@@ -70,18 +66,22 @@ export class WebSocketSync
70
66
  this.synced = false;
71
67
  if (this.connectQueue.length) {
72
68
  for (const msg of this.connectQueue) {
73
- this.log('Sending queued message', JSON.stringify(msg, null, 2));
69
+ this.ctx.log(
70
+ 'debug',
71
+ 'Sending queued message',
72
+ JSON.stringify(msg, null, 2),
73
+ );
74
74
  this.socket.send(JSON.stringify(msg));
75
75
  }
76
76
  this.connectQueue = [];
77
77
  }
78
- this.log('Sync connected');
78
+ this.ctx.log('debug', 'Sync connected');
79
79
  this.onOnlineChange(true);
80
80
  this.reconnectScheduler.reset();
81
81
  };
82
82
 
83
83
  private onOnlineChange = async (online: boolean) => {
84
- this.log('Socket online change', online);
84
+ this.ctx.log('info', 'Socket online change', online);
85
85
  if (this.disposed) {
86
86
  return;
87
87
  }
@@ -90,13 +90,15 @@ export class WebSocketSync
90
90
  this.synced = false;
91
91
  this.heartbeat.stop();
92
92
  } else {
93
- this.log('Starting sync');
93
+ this.ctx.log('debug', 'Starting sync');
94
94
  this.hasStartedSync = true;
95
95
  this.synced = false;
96
96
  this.send(
97
- await this.meta.messageCreator.createPresenceUpdate(this.presence.self),
97
+ await this.ctx.meta.messageCreator.createPresenceUpdate(
98
+ this.presence.self,
99
+ ),
98
100
  );
99
- this.send(await this.meta.messageCreator.createSyncStep1());
101
+ this.send(await this.ctx.meta.messageCreator.createSyncStep1());
100
102
  this.heartbeat.start();
101
103
  }
102
104
  this.emit('onlineChange', online);
@@ -104,7 +106,8 @@ export class WebSocketSync
104
106
 
105
107
  private onMessage = async (event: MessageEvent) => {
106
108
  if (this._ignoreIncoming) {
107
- this.log(
109
+ this.ctx.log(
110
+ 'warn',
108
111
  'Ignoring incoming message (ignore incoming flag set)',
109
112
  event.data,
110
113
  );
@@ -117,14 +120,14 @@ export class WebSocketSync
117
120
  if (message.ackThisNonce) {
118
121
  // we need to send the ack to confirm we got the response
119
122
  this.send(
120
- await this.meta.messageCreator.createAck(message.ackThisNonce),
123
+ await this.ctx.meta.messageCreator.createAck(message.ackThisNonce),
121
124
  );
122
125
  }
123
126
  this.hasStartedSync = true;
124
127
  this.synced = true;
125
128
  if (this.syncQueue.length) {
126
129
  if (message.overwriteLocalData) {
127
- this.log(
130
+ this.ctx.log(
128
131
  'warn',
129
132
  'Overwriting local data - dropping outgoing message queue',
130
133
  );
@@ -151,7 +154,8 @@ export class WebSocketSync
151
154
  break;
152
155
  case 'op-re':
153
156
  if (!this.synced) {
154
- this.log(
157
+ this.ctx.log(
158
+ 'debug',
155
159
  `Enqueueing op-re message because sync hasn't finished yet`,
156
160
  message,
157
161
  );
@@ -173,14 +177,14 @@ export class WebSocketSync
173
177
  };
174
178
 
175
179
  private onError = (event: Event) => {
176
- this.log(event);
180
+ this.ctx.log('error', event);
177
181
  this.reconnectScheduler.next();
178
182
 
179
- this.log(`Attempting reconnect to websocket sync`);
183
+ this.ctx.log('info', `Attempting reconnect to websocket sync`);
180
184
  };
181
185
 
182
186
  private onClose = (event: CloseEvent) => {
183
- this.log('Sync disconnected');
187
+ this.ctx.log('info', 'Sync disconnected');
184
188
  this.onOnlineChange(false);
185
189
  this.onError(event);
186
190
  };
@@ -197,7 +201,7 @@ export class WebSocketSync
197
201
  };
198
202
 
199
203
  private sendHeartbeat = async () => {
200
- this.send(await this.meta.messageCreator.createHeartbeat());
204
+ this.send(await this.ctx.meta.messageCreator.createHeartbeat());
201
205
  };
202
206
 
203
207
  reconnect = () => {
@@ -225,10 +229,15 @@ export class WebSocketSync
225
229
 
226
230
  if (this.canSkipSyncWait(message)) {
227
231
  if (this.socket?.readyState === WebSocket.OPEN) {
228
- this.log('Sending message', JSON.stringify(message, null, 2));
232
+ this.ctx.log(
233
+ 'debug',
234
+ 'Sending message',
235
+ JSON.stringify(message, null, 2),
236
+ );
229
237
  this.socket!.send(JSON.stringify(message));
230
238
  } else {
231
- this.log(
239
+ this.ctx.log(
240
+ 'debug',
232
241
  'Enqueueing message until socket is open',
233
242
  JSON.stringify(message, null, 2),
234
243
  );
@@ -236,11 +245,16 @@ export class WebSocketSync
236
245
  }
237
246
  } else if (this.synced) {
238
247
  if (this.socket?.readyState === WebSocket.OPEN) {
239
- this.log('Sending message', JSON.stringify(message, null, 2));
248
+ this.ctx.log(
249
+ 'debug',
250
+ 'Sending message',
251
+ JSON.stringify(message, null, 2),
252
+ );
240
253
  this.socket.send(JSON.stringify(message));
241
254
  }
242
255
  } else if (this.hasStartedSync) {
243
- this.log(
256
+ this.ctx.log(
257
+ 'debug',
244
258
  'Enqueueing message until synced',
245
259
  JSON.stringify(message, null, 2),
246
260
  );
@@ -1,14 +1,17 @@
1
1
  export class Disposable {
2
- private _disposes: (() => void)[] = [];
2
+ private _disposes: (() => void | Promise<void>)[] = [];
3
3
  protected disposed = false;
4
4
 
5
- dispose = () => {
5
+ dispose = async () => {
6
6
  this.disposed = true;
7
- this._disposes.forEach((dispose) => dispose());
7
+ await Promise.all(this._disposes.map((dispose) => dispose()));
8
8
  this._disposes = [];
9
9
  };
10
10
 
11
- protected addDispose = (dispose: () => void) => {
11
+ compose = (disposable: { dispose: () => void | Promise<void> }) =>
12
+ this.addDispose(disposable.dispose.bind(disposable));
13
+
14
+ protected addDispose = (dispose: () => void | Promise<void>) => {
12
15
  this._disposes.push(dispose);
13
16
  };
14
17
  }
@@ -0,0 +1,5 @@
1
+ import { hashObject, StorageSchema } from '@verdant-web/common';
2
+
3
+ export function getWipNamespace(namespace: string, schema: StorageSchema) {
4
+ return `@@wip_${namespace}_${hashObject(schema)}`;
5
+ }
@@ -1 +0,0 @@
1
- {"version":3,"file":"IDBService.js","sourceRoot":"","sources":["../../src/IDBService.ts"],"names":[],"mappings":"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"}
@@ -1 +0,0 @@
1
- export {};