@verdant-web/store 3.12.0 → 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.
- package/dist/bundle/index.js +11 -13
- package/dist/bundle/index.js.map +4 -4
- package/dist/esm/__tests__/batching.test.js +5 -5
- package/dist/esm/__tests__/batching.test.js.map +1 -1
- package/dist/esm/__tests__/entities.test.js +1 -1
- package/dist/esm/__tests__/entities.test.js.map +1 -1
- package/dist/esm/__tests__/fixtures/testStorage.d.ts +1 -3
- package/dist/esm/__tests__/fixtures/testStorage.js +3 -3
- package/dist/esm/__tests__/fixtures/testStorage.js.map +1 -1
- package/dist/esm/__tests__/queries.test.js.map +1 -1
- package/dist/esm/backup.d.ts +3 -4
- package/dist/esm/backup.js.map +1 -1
- package/dist/esm/client/Client.d.ts +28 -33
- package/dist/esm/client/Client.js +50 -161
- package/dist/esm/client/Client.js.map +1 -1
- package/dist/esm/client/ClientDescriptor.d.ts +8 -11
- package/dist/esm/client/ClientDescriptor.js +39 -141
- package/dist/esm/client/ClientDescriptor.js.map +1 -1
- package/dist/esm/context/Time.d.ts +13 -0
- package/dist/esm/context/Time.js +27 -0
- package/dist/esm/context/Time.js.map +1 -0
- package/dist/esm/context/context.d.ts +170 -0
- package/dist/esm/{context.js.map → context/context.js.map} +1 -1
- package/dist/esm/entities/DocumentManager.js.map +1 -1
- package/dist/esm/entities/Entity.d.ts +4 -5
- package/dist/esm/entities/Entity.js +5 -3
- package/dist/esm/entities/Entity.js.map +1 -1
- package/dist/esm/entities/Entity.test.js +4 -3
- package/dist/esm/entities/Entity.test.js.map +1 -1
- package/dist/esm/entities/EntityCache.d.ts +0 -3
- package/dist/esm/entities/EntityCache.js +0 -9
- package/dist/esm/entities/EntityCache.js.map +1 -1
- package/dist/esm/entities/EntityMetadata.d.ts +1 -1
- package/dist/esm/entities/EntityMetadata.js +6 -5
- package/dist/esm/entities/EntityMetadata.js.map +1 -1
- package/dist/esm/entities/EntityStore.d.ts +2 -6
- package/dist/esm/entities/EntityStore.js +22 -16
- package/dist/esm/entities/EntityStore.js.map +1 -1
- package/dist/esm/entities/OperationBatcher.d.ts +2 -5
- package/dist/esm/entities/OperationBatcher.js +9 -7
- package/dist/esm/entities/OperationBatcher.js.map +1 -1
- package/dist/esm/entities/types.d.ts +1 -1
- package/dist/esm/errors.d.ts +8 -0
- package/dist/esm/errors.js +12 -0
- package/dist/esm/errors.js.map +1 -0
- package/dist/esm/files/EntityFile.d.ts +6 -3
- package/dist/esm/files/EntityFile.js +22 -19
- package/dist/esm/files/EntityFile.js.map +1 -1
- package/dist/esm/files/FileManager.d.ts +8 -39
- package/dist/esm/files/FileManager.js +15 -170
- package/dist/esm/files/FileManager.js.map +1 -1
- package/dist/esm/files/utils.d.ts +0 -1
- package/dist/esm/files/utils.js +0 -14
- package/dist/esm/files/utils.js.map +1 -1
- package/dist/esm/index.d.ts +1 -2
- package/dist/esm/index.js +0 -1
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/{metadata → persistence}/MessageCreator.d.ts +5 -6
- package/dist/esm/{metadata → persistence}/MessageCreator.js +31 -38
- package/dist/esm/persistence/MessageCreator.js.map +1 -0
- package/dist/esm/persistence/PersistenceFiles.d.ts +48 -0
- package/dist/esm/persistence/PersistenceFiles.js +160 -0
- package/dist/esm/persistence/PersistenceFiles.js.map +1 -0
- package/dist/esm/persistence/PersistenceMetadata.d.ts +69 -0
- package/dist/esm/persistence/PersistenceMetadata.js +302 -0
- package/dist/esm/persistence/PersistenceMetadata.js.map +1 -0
- package/dist/esm/persistence/PersistenceQueries.d.ts +34 -0
- package/dist/esm/persistence/PersistenceQueries.js +15 -0
- package/dist/esm/persistence/PersistenceQueries.js.map +1 -0
- package/dist/esm/persistence/PersistenceRebaser.d.ts +32 -0
- package/dist/esm/persistence/PersistenceRebaser.js +120 -0
- package/dist/esm/persistence/PersistenceRebaser.js.map +1 -0
- package/dist/esm/{IDBService.d.ts → persistence/idb/IdbService.d.ts} +9 -7
- package/dist/esm/{IDBService.js → persistence/idb/IdbService.js} +29 -8
- package/dist/esm/persistence/idb/IdbService.js.map +1 -0
- package/dist/esm/persistence/idb/files/IdbPersistenceFileDb.d.ts +58 -0
- package/dist/esm/{files/FileStorage.js → persistence/idb/files/IdbPersistenceFileDb.js} +85 -50
- package/dist/esm/persistence/idb/files/IdbPersistenceFileDb.js.map +1 -0
- package/dist/esm/persistence/idb/idbPersistence.d.ts +19 -0
- package/dist/esm/persistence/idb/idbPersistence.js +80 -0
- package/dist/esm/persistence/idb/idbPersistence.js.map +1 -0
- package/dist/esm/persistence/idb/metadata/IdbMetadataDb.d.ts +72 -0
- package/dist/esm/persistence/idb/metadata/IdbMetadataDb.js +235 -0
- package/dist/esm/persistence/idb/metadata/IdbMetadataDb.js.map +1 -0
- package/dist/esm/{metadata → persistence/idb/metadata}/openMetadataDatabase.d.ts +3 -1
- package/dist/esm/{metadata → persistence/idb/metadata}/openMetadataDatabase.js +12 -3
- package/dist/esm/persistence/idb/metadata/openMetadataDatabase.js.map +1 -0
- package/dist/esm/persistence/idb/queries/IdbQueryDb.d.ts +41 -0
- package/dist/esm/persistence/idb/queries/IdbQueryDb.js +174 -0
- package/dist/esm/persistence/idb/queries/IdbQueryDb.js.map +1 -0
- package/dist/esm/{migration → persistence/idb/queries/migration}/db.d.ts +1 -1
- package/dist/esm/{migration → persistence/idb/queries/migration}/db.js +10 -48
- package/dist/esm/persistence/idb/queries/migration/db.js.map +1 -0
- package/dist/esm/persistence/idb/queries/migration/engine.d.ts +12 -0
- package/dist/esm/{migration → persistence/idb/queries/migration}/engine.js +29 -46
- package/dist/esm/persistence/idb/queries/migration/engine.js.map +1 -0
- package/dist/esm/{migration → persistence/idb/queries/migration}/migrations.d.ts +1 -3
- package/dist/esm/{migration → persistence/idb/queries/migration}/migrations.js +11 -10
- package/dist/esm/persistence/idb/queries/migration/migrations.js.map +1 -0
- package/dist/esm/{migration → persistence/idb/queries/migration}/openQueryDatabase.d.ts +1 -3
- package/dist/esm/{migration → persistence/idb/queries/migration}/openQueryDatabase.js +4 -7
- package/dist/esm/persistence/idb/queries/migration/openQueryDatabase.js.map +1 -0
- package/dist/esm/{migration → persistence/idb/queries/migration}/paths.js +2 -2
- package/dist/esm/persistence/idb/queries/migration/paths.js.map +1 -0
- package/dist/esm/persistence/idb/queries/migration/paths.test.js.map +1 -0
- package/dist/esm/persistence/idb/queries/migration/types.d.ts +6 -0
- package/dist/esm/persistence/idb/queries/migration/types.js.map +1 -0
- package/dist/esm/persistence/idb/queries/ranges.d.ts +2 -0
- package/dist/esm/persistence/idb/queries/ranges.js +66 -0
- package/dist/esm/persistence/idb/queries/ranges.js.map +1 -0
- package/dist/esm/{idb.d.ts → persistence/idb/util.d.ts} +11 -0
- package/dist/esm/{idb.js → persistence/idb/util.js} +58 -1
- package/dist/esm/persistence/idb/util.js.map +1 -0
- package/dist/esm/persistence/interfaces.d.ts +181 -0
- package/dist/esm/persistence/interfaces.js +2 -0
- package/dist/esm/persistence/interfaces.js.map +1 -0
- package/dist/esm/persistence/persistence.d.ts +4 -0
- package/dist/esm/persistence/persistence.js +126 -0
- package/dist/esm/persistence/persistence.js.map +1 -0
- package/dist/esm/queries/BaseQuery.d.ts +2 -1
- package/dist/esm/queries/BaseQuery.js +3 -0
- package/dist/esm/queries/BaseQuery.js.map +1 -1
- package/dist/esm/queries/CollectionQueries.d.ts +1 -1
- package/dist/esm/queries/FindAllQuery.js +1 -3
- package/dist/esm/queries/FindAllQuery.js.map +1 -1
- package/dist/esm/queries/FindInfiniteQuery.js +2 -5
- package/dist/esm/queries/FindInfiniteQuery.js.map +1 -1
- package/dist/esm/queries/FindOneQuery.js +1 -3
- package/dist/esm/queries/FindOneQuery.js.map +1 -1
- package/dist/esm/queries/FindPageQuery.js +1 -3
- package/dist/esm/queries/FindPageQuery.js.map +1 -1
- package/dist/esm/queries/QueryCache.d.ts +1 -1
- package/dist/esm/queries/QueryCache.js +4 -0
- package/dist/esm/queries/QueryCache.js.map +1 -1
- package/dist/esm/sync/FileSync.d.ts +23 -8
- package/dist/esm/sync/FileSync.js +76 -28
- package/dist/esm/sync/FileSync.js.map +1 -1
- package/dist/esm/sync/PresenceManager.d.ts +4 -3
- package/dist/esm/sync/PresenceManager.js +2 -2
- package/dist/esm/sync/PresenceManager.js.map +1 -1
- package/dist/esm/sync/PushPullSync.d.ts +4 -6
- package/dist/esm/sync/PushPullSync.js +13 -12
- package/dist/esm/sync/PushPullSync.js.map +1 -1
- package/dist/esm/sync/Sync.d.ts +9 -11
- package/dist/esm/sync/Sync.js +34 -29
- package/dist/esm/sync/Sync.js.map +1 -1
- package/dist/esm/sync/WebSocketSync.d.ts +4 -6
- package/dist/esm/sync/WebSocketSync.js +20 -22
- package/dist/esm/sync/WebSocketSync.js.map +1 -1
- package/dist/esm/utils/Disposable.d.ts +5 -2
- package/dist/esm/utils/Disposable.js +3 -2
- package/dist/esm/utils/Disposable.js.map +1 -1
- package/dist/esm/utils/wip.d.ts +2 -0
- package/dist/esm/utils/wip.js +5 -0
- package/dist/esm/utils/wip.js.map +1 -0
- package/package.json +2 -2
- package/src/__tests__/batching.test.ts +6 -6
- package/src/__tests__/entities.test.ts +1 -1
- package/src/__tests__/fixtures/testStorage.ts +2 -10
- package/src/__tests__/queries.test.ts +1 -1
- package/src/backup.ts +3 -4
- package/src/client/Client.ts +69 -226
- package/src/client/ClientDescriptor.ts +53 -184
- package/src/context/Time.ts +35 -0
- package/src/context/context.ts +200 -0
- package/src/entities/DocumentManager.ts +0 -3
- package/src/entities/Entity.test.ts +9 -9
- package/src/entities/Entity.ts +6 -12
- package/src/entities/EntityCache.ts +0 -9
- package/src/entities/EntityMetadata.ts +4 -4
- package/src/entities/EntityStore.ts +26 -29
- package/src/entities/OperationBatcher.ts +9 -11
- package/src/entities/types.ts +1 -1
- package/src/errors.ts +13 -0
- package/src/files/EntityFile.ts +16 -5
- package/src/files/FileManager.ts +18 -245
- package/src/files/utils.ts +0 -15
- package/src/index.ts +2 -1
- package/src/{metadata → persistence}/MessageCreator.ts +46 -36
- package/src/persistence/PersistenceFiles.ts +227 -0
- package/src/persistence/PersistenceMetadata.ts +425 -0
- package/src/persistence/PersistenceQueries.ts +22 -0
- package/src/persistence/PersistenceRebaser.ts +171 -0
- package/src/{IDBService.ts → persistence/idb/IdbService.ts} +45 -12
- package/src/{files/FileStorage.ts → persistence/idb/files/IdbPersistenceFileDb.ts} +128 -86
- package/src/persistence/idb/idbPersistence.ts +116 -0
- package/src/persistence/idb/metadata/IdbMetadataDb.ts +460 -0
- package/src/{metadata → persistence/idb/metadata}/openMetadataDatabase.ts +21 -4
- package/src/persistence/idb/queries/IdbQueryDb.ts +251 -0
- package/src/{migration → persistence/idb/queries/migration}/db.ts +18 -72
- package/src/{migration → persistence/idb/queries/migration}/engine.ts +39 -62
- package/src/{migration → persistence/idb/queries/migration}/migrations.ts +13 -18
- package/src/{migration → persistence/idb/queries/migration}/openQueryDatabase.ts +5 -14
- package/src/{migration → persistence/idb/queries/migration}/paths.ts +4 -3
- package/src/persistence/idb/queries/migration/types.ts +8 -0
- package/src/persistence/idb/queries/ranges.ts +107 -0
- package/src/{idb.ts → persistence/idb/util.ts} +75 -0
- package/src/persistence/interfaces.ts +240 -0
- package/src/persistence/persistence.ts +223 -0
- package/src/queries/BaseQuery.ts +5 -1
- package/src/queries/CollectionQueries.ts +2 -2
- package/src/queries/FindAllQuery.ts +1 -3
- package/src/queries/FindInfiniteQuery.ts +2 -5
- package/src/queries/FindOneQuery.ts +1 -3
- package/src/queries/FindPageQuery.ts +1 -3
- package/src/queries/QueryCache.ts +20 -1
- package/src/sync/FileSync.ts +93 -30
- package/src/sync/PresenceManager.ts +5 -7
- package/src/sync/PushPullSync.ts +23 -19
- package/src/sync/Sync.ts +45 -36
- package/src/sync/WebSocketSync.ts +41 -27
- package/src/utils/Disposable.ts +7 -4
- package/src/utils/wip.ts +5 -0
- package/dist/esm/IDBService.js.map +0 -1
- package/dist/esm/__tests__/legacyOids.test.d.ts +0 -1
- package/dist/esm/__tests__/legacyOids.test.js +0 -352
- package/dist/esm/__tests__/legacyOids.test.js.map +0 -1
- package/dist/esm/context.d.ts +0 -45
- package/dist/esm/files/FileStorage.d.ts +0 -47
- package/dist/esm/files/FileStorage.js.map +0 -1
- package/dist/esm/idb.js.map +0 -1
- package/dist/esm/metadata/AckInfoStore.d.ts +0 -10
- package/dist/esm/metadata/AckInfoStore.js +0 -22
- package/dist/esm/metadata/AckInfoStore.js.map +0 -1
- package/dist/esm/metadata/BaselinesStore.d.ts +0 -40
- package/dist/esm/metadata/BaselinesStore.js +0 -102
- package/dist/esm/metadata/BaselinesStore.js.map +0 -1
- package/dist/esm/metadata/LocalReplicaStore.d.ts +0 -19
- package/dist/esm/metadata/LocalReplicaStore.js +0 -56
- package/dist/esm/metadata/LocalReplicaStore.js.map +0 -1
- package/dist/esm/metadata/MessageCreator.js.map +0 -1
- package/dist/esm/metadata/Metadata.d.ts +0 -146
- package/dist/esm/metadata/Metadata.js +0 -452
- package/dist/esm/metadata/Metadata.js.map +0 -1
- package/dist/esm/metadata/OperationsStore.d.ts +0 -62
- package/dist/esm/metadata/OperationsStore.js +0 -175
- package/dist/esm/metadata/OperationsStore.js.map +0 -1
- package/dist/esm/metadata/SchemaStore.d.ts +0 -9
- package/dist/esm/metadata/SchemaStore.js +0 -35
- package/dist/esm/metadata/SchemaStore.js.map +0 -1
- package/dist/esm/metadata/openMetadataDatabase.js.map +0 -1
- package/dist/esm/migration/db.js.map +0 -1
- package/dist/esm/migration/engine.d.ts +0 -15
- package/dist/esm/migration/engine.js.map +0 -1
- package/dist/esm/migration/errors.d.ts +0 -5
- package/dist/esm/migration/errors.js +0 -8
- package/dist/esm/migration/errors.js.map +0 -1
- package/dist/esm/migration/migrations.js.map +0 -1
- package/dist/esm/migration/openQueryDatabase.js.map +0 -1
- package/dist/esm/migration/openWIPDatabase.d.ts +0 -11
- package/dist/esm/migration/openWIPDatabase.js +0 -65
- package/dist/esm/migration/openWIPDatabase.js.map +0 -1
- package/dist/esm/migration/paths.js.map +0 -1
- package/dist/esm/migration/paths.test.js.map +0 -1
- package/dist/esm/migration/types.d.ts +0 -3
- package/dist/esm/migration/types.js.map +0 -1
- package/dist/esm/queries/QueryableStorage.d.ts +0 -20
- package/dist/esm/queries/QueryableStorage.js +0 -90
- package/dist/esm/queries/QueryableStorage.js.map +0 -1
- package/dist/esm/queries/dbQueries.d.ts +0 -22
- package/dist/esm/queries/dbQueries.js +0 -130
- package/dist/esm/queries/dbQueries.js.map +0 -1
- package/src/__tests__/legacyOids.test.ts +0 -375
- package/src/context.ts +0 -55
- package/src/metadata/AckInfoStore.ts +0 -30
- package/src/metadata/BaselinesStore.ts +0 -188
- package/src/metadata/LocalReplicaStore.ts +0 -79
- package/src/metadata/Metadata.ts +0 -685
- package/src/metadata/OperationsStore.ts +0 -332
- package/src/metadata/SchemaStore.ts +0 -47
- package/src/migration/errors.ts +0 -7
- package/src/migration/openWIPDatabase.ts +0 -97
- package/src/migration/types.ts +0 -4
- package/src/queries/QueryableStorage.ts +0 -122
- package/src/queries/dbQueries.ts +0 -161
- /package/dist/esm/{context.js → context/context.js} +0 -0
- /package/dist/esm/{migration → persistence/idb/queries/migration}/paths.d.ts +0 -0
- /package/dist/esm/{migration → persistence/idb/queries/migration}/paths.test.d.ts +0 -0
- /package/dist/esm/{migration → persistence/idb/queries/migration}/paths.test.js +0 -0
- /package/dist/esm/{migration → persistence/idb/queries/migration}/types.js +0 -0
- /package/src/{migration → persistence/idb/queries/migration}/paths.test.ts +0 -0
package/src/sync/PushPullSync.ts
CHANGED
|
@@ -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
|
|
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.
|
|
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(
|
|
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(
|
|
208
|
-
|
|
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([
|
|
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(
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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.
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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.
|
|
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](
|
|
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
|
|
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
|
-
|
|
42
|
+
ctx,
|
|
44
43
|
presence,
|
|
45
|
-
log,
|
|
46
44
|
}: {
|
|
47
45
|
endpointProvider: ServerSyncEndpointProvider;
|
|
48
|
-
|
|
46
|
+
ctx: Context;
|
|
49
47
|
presence: PresenceManager;
|
|
50
|
-
log?: (...args: any[]) => any;
|
|
51
48
|
}) {
|
|
52
49
|
super();
|
|
53
|
-
this.
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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
|
);
|
package/src/utils/Disposable.ts
CHANGED
|
@@ -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.
|
|
7
|
+
await Promise.all(this._disposes.map((dispose) => dispose()));
|
|
8
8
|
this._disposes = [];
|
|
9
9
|
};
|
|
10
10
|
|
|
11
|
-
|
|
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
|
}
|
package/src/utils/wip.ts
ADDED
|
@@ -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 {};
|