@verdant-web/store 3.3.2 → 3.4.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 +8 -8
- package/dist/bundle/index.js.map +4 -4
- package/dist/esm/BackoffScheduler.js.map +1 -1
- package/dist/esm/IDBService.js.map +1 -1
- package/dist/esm/UndoHistory.js.map +1 -1
- package/dist/esm/__tests__/documents.test.js.map +1 -1
- package/dist/esm/__tests__/queries.test.js.map +1 -1
- package/dist/esm/backup.js.map +1 -1
- package/dist/esm/client/Client.js +7 -0
- package/dist/esm/client/Client.js.map +1 -1
- package/dist/esm/client/ClientDescriptor.js.map +1 -1
- package/dist/esm/entities/Entity.js.map +1 -1
- package/dist/esm/entities/EntityCache.js.map +1 -1
- package/dist/esm/entities/EntityMetadata.js.map +1 -1
- package/dist/esm/entities/EntityStore.js.map +1 -1
- package/dist/esm/entities/OperationBatcher.js.map +1 -1
- package/dist/esm/files/EntityFile.js.map +1 -1
- package/dist/esm/files/FileManager.js +3 -0
- package/dist/esm/files/FileManager.js.map +1 -1
- package/dist/esm/files/FileStorage.js.map +1 -1
- package/dist/esm/files/utils.js.map +1 -1
- package/dist/esm/idb.js.map +1 -1
- package/dist/esm/metadata/AckInfoStore.js.map +1 -1
- package/dist/esm/metadata/LocalReplicaStore.js.map +1 -1
- package/dist/esm/metadata/MessageCreator.js.map +1 -1
- package/dist/esm/metadata/Metadata.js.map +1 -1
- package/dist/esm/metadata/OperationsStore.js.map +1 -1
- package/dist/esm/metadata/SchemaStore.js.map +1 -1
- package/dist/esm/metadata/openMetadataDatabase.js.map +1 -1
- package/dist/esm/migration/db.js.map +1 -1
- package/dist/esm/migration/openDatabase.js.map +1 -1
- package/dist/esm/migration/paths.js.map +1 -1
- package/dist/esm/queries/BaseQuery.js.map +1 -1
- package/dist/esm/queries/QueryCache.js.map +1 -1
- package/dist/esm/queries/QueryableStorage.js.map +1 -1
- package/dist/esm/queries/dbQueries.js.map +1 -1
- package/dist/esm/queries/keys.js.map +1 -1
- package/dist/esm/queries/ranges.js.map +1 -1
- package/dist/esm/queries/utils.js.map +1 -1
- package/dist/esm/sync/FileSync.js.map +1 -1
- package/dist/esm/sync/Heartbeat.js.map +1 -1
- package/dist/esm/sync/PresenceManager.js.map +1 -1
- package/dist/esm/sync/PushPullSync.js.map +1 -1
- package/dist/esm/sync/ServerSyncEndpointProvider.js.map +1 -1
- package/dist/esm/sync/Sync.js.map +1 -1
- package/dist/esm/sync/WebSocketSync.js.map +1 -1
- package/package.json +9 -10
- package/src/client/Client.ts +8 -1
- package/src/files/FileManager.ts +4 -0
- package/src/sync/Sync.ts +2 -2
- package/dist/cjs/BackoffScheduler.d.ts +0 -19
- package/dist/cjs/BackoffScheduler.js +0 -45
- package/dist/cjs/BackoffScheduler.js.map +0 -1
- package/dist/cjs/DocumentManager.d.ts +0 -28
- package/dist/cjs/DocumentManager.js +0 -45
- package/dist/cjs/DocumentManager.js.map +0 -1
- package/dist/cjs/FakeWeakRef.d.ts +0 -11
- package/dist/cjs/FakeWeakRef.js +0 -19
- package/dist/cjs/FakeWeakRef.js.map +0 -1
- package/dist/cjs/IDBService.d.ts +0 -30
- package/dist/cjs/IDBService.js +0 -101
- package/dist/cjs/IDBService.js.map +0 -1
- package/dist/cjs/UndoHistory.d.ts +0 -16
- package/dist/cjs/UndoHistory.js +0 -55
- package/dist/cjs/UndoHistory.js.map +0 -1
- package/dist/cjs/__tests__/batching.test.d.ts +0 -1
- package/dist/cjs/__tests__/batching.test.js +0 -47
- package/dist/cjs/__tests__/batching.test.js.map +0 -1
- package/dist/cjs/__tests__/documents.test.d.ts +0 -1
- package/dist/cjs/__tests__/documents.test.js +0 -468
- package/dist/cjs/__tests__/documents.test.js.map +0 -1
- package/dist/cjs/__tests__/fixtures/testStorage.d.ts +0 -76
- package/dist/cjs/__tests__/fixtures/testStorage.js +0 -96
- package/dist/cjs/__tests__/fixtures/testStorage.js.map +0 -1
- package/dist/cjs/__tests__/legacyOids.test.d.ts +0 -1
- package/dist/cjs/__tests__/legacyOids.test.js +0 -354
- package/dist/cjs/__tests__/legacyOids.test.js.map +0 -1
- package/dist/cjs/__tests__/mutations.test.d.ts +0 -1
- package/dist/cjs/__tests__/mutations.test.js +0 -48
- package/dist/cjs/__tests__/mutations.test.js.map +0 -1
- package/dist/cjs/__tests__/queries.test.d.ts +0 -1
- package/dist/cjs/__tests__/queries.test.js +0 -323
- package/dist/cjs/__tests__/queries.test.js.map +0 -1
- package/dist/cjs/__tests__/setup/indexedDB.d.ts +0 -1
- package/dist/cjs/__tests__/setup/indexedDB.js +0 -16
- package/dist/cjs/__tests__/setup/indexedDB.js.map +0 -1
- package/dist/cjs/__tests__/undo.test.d.ts +0 -1
- package/dist/cjs/__tests__/undo.test.js +0 -94
- package/dist/cjs/__tests__/undo.test.js.map +0 -1
- package/dist/cjs/backup.d.ts +0 -10
- package/dist/cjs/backup.js +0 -58
- package/dist/cjs/backup.js.map +0 -1
- package/dist/cjs/client/Client.d.ts +0 -120
- package/dist/cjs/client/Client.js +0 -300
- package/dist/cjs/client/Client.js.map +0 -1
- package/dist/cjs/client/ClientDescriptor.d.ts +0 -76
- package/dist/cjs/client/ClientDescriptor.js +0 -213
- package/dist/cjs/client/ClientDescriptor.js.map +0 -1
- package/dist/cjs/client/constants.d.ts +0 -1
- package/dist/cjs/client/constants.js +0 -5
- package/dist/cjs/client/constants.js.map +0 -1
- package/dist/cjs/constants.d.ts +0 -1
- package/dist/cjs/constants.js +0 -5
- package/dist/cjs/constants.js.map +0 -1
- package/dist/cjs/context.d.ts +0 -38
- package/dist/cjs/context.js +0 -3
- package/dist/cjs/context.js.map +0 -1
- package/dist/cjs/entities/Entity.d.ts +0 -148
- package/dist/cjs/entities/Entity.js +0 -711
- package/dist/cjs/entities/Entity.js.map +0 -1
- package/dist/cjs/entities/Entity.test.d.ts +0 -1
- package/dist/cjs/entities/Entity.test.js +0 -194
- package/dist/cjs/entities/Entity.test.js.map +0 -1
- package/dist/cjs/entities/EntityCache.d.ts +0 -15
- package/dist/cjs/entities/EntityCache.js +0 -39
- package/dist/cjs/entities/EntityCache.js.map +0 -1
- package/dist/cjs/entities/EntityMetadata.d.ts +0 -68
- package/dist/cjs/entities/EntityMetadata.js +0 -261
- package/dist/cjs/entities/EntityMetadata.js.map +0 -1
- package/dist/cjs/entities/EntityStore.d.ts +0 -80
- package/dist/cjs/entities/EntityStore.js +0 -352
- package/dist/cjs/entities/EntityStore.js.map +0 -1
- package/dist/cjs/entities/OperationBatcher.d.ts +0 -52
- package/dist/cjs/entities/OperationBatcher.js +0 -165
- package/dist/cjs/entities/OperationBatcher.js.map +0 -1
- package/dist/cjs/entities/types.d.ts +0 -103
- package/dist/cjs/entities/types.js +0 -3
- package/dist/cjs/entities/types.js.map +0 -1
- package/dist/cjs/files/EntityFile.d.ts +0 -35
- package/dist/cjs/files/EntityFile.js +0 -81
- package/dist/cjs/files/EntityFile.js.map +0 -1
- package/dist/cjs/files/FileManager.d.ts +0 -46
- package/dist/cjs/files/FileManager.js +0 -174
- package/dist/cjs/files/FileManager.js.map +0 -1
- package/dist/cjs/files/FileStorage.d.ts +0 -39
- package/dist/cjs/files/FileStorage.js +0 -110
- package/dist/cjs/files/FileStorage.js.map +0 -1
- package/dist/cjs/files/utils.d.ts +0 -10
- package/dist/cjs/files/utils.js +0 -62
- package/dist/cjs/files/utils.js.map +0 -1
- package/dist/cjs/files/utils.test.d.ts +0 -1
- package/dist/cjs/files/utils.test.js +0 -81
- package/dist/cjs/files/utils.test.js.map +0 -1
- package/dist/cjs/idb.d.ts +0 -13
- package/dist/cjs/idb.js +0 -158
- package/dist/cjs/idb.js.map +0 -1
- package/dist/cjs/index.d.ts +0 -23
- package/dist/cjs/index.js +0 -25
- package/dist/cjs/index.js.map +0 -1
- package/dist/cjs/metadata/AckInfoStore.d.ts +0 -10
- package/dist/cjs/metadata/AckInfoStore.js +0 -26
- package/dist/cjs/metadata/AckInfoStore.js.map +0 -1
- package/dist/cjs/metadata/BaselinesStore.d.ts +0 -40
- package/dist/cjs/metadata/BaselinesStore.js +0 -106
- package/dist/cjs/metadata/BaselinesStore.js.map +0 -1
- package/dist/cjs/metadata/LocalReplicaStore.d.ts +0 -18
- package/dist/cjs/metadata/LocalReplicaStore.js +0 -62
- package/dist/cjs/metadata/LocalReplicaStore.js.map +0 -1
- package/dist/cjs/metadata/MessageCreator.d.ts +0 -19
- package/dist/cjs/metadata/MessageCreator.js +0 -128
- package/dist/cjs/metadata/MessageCreator.js.map +0 -1
- package/dist/cjs/metadata/Metadata.d.ts +0 -135
- package/dist/cjs/metadata/Metadata.js +0 -408
- package/dist/cjs/metadata/Metadata.js.map +0 -1
- package/dist/cjs/metadata/OperationsStore.d.ts +0 -62
- package/dist/cjs/metadata/OperationsStore.js +0 -179
- package/dist/cjs/metadata/OperationsStore.js.map +0 -1
- package/dist/cjs/metadata/SchemaStore.d.ts +0 -9
- package/dist/cjs/metadata/SchemaStore.js +0 -39
- package/dist/cjs/metadata/SchemaStore.js.map +0 -1
- package/dist/cjs/metadata/openMetadataDatabase.d.ts +0 -19
- package/dist/cjs/metadata/openMetadataDatabase.js +0 -220
- package/dist/cjs/metadata/openMetadataDatabase.js.map +0 -1
- package/dist/cjs/migration/db.d.ts +0 -8
- package/dist/cjs/migration/db.js +0 -112
- package/dist/cjs/migration/db.js.map +0 -1
- package/dist/cjs/migration/errors.d.ts +0 -5
- package/dist/cjs/migration/errors.js +0 -12
- package/dist/cjs/migration/errors.js.map +0 -1
- package/dist/cjs/migration/openDatabase.d.ts +0 -20
- package/dist/cjs/migration/openDatabase.js +0 -468
- package/dist/cjs/migration/openDatabase.js.map +0 -1
- package/dist/cjs/migration/paths.d.ts +0 -6
- package/dist/cjs/migration/paths.js +0 -53
- package/dist/cjs/migration/paths.js.map +0 -1
- package/dist/cjs/migration/paths.test.d.ts +0 -1
- package/dist/cjs/migration/paths.test.js +0 -91
- package/dist/cjs/migration/paths.test.js.map +0 -1
- package/dist/cjs/queries/BaseQuery.d.ts +0 -53
- package/dist/cjs/queries/BaseQuery.js +0 -148
- package/dist/cjs/queries/BaseQuery.js.map +0 -1
- package/dist/cjs/queries/CollectionQueries.d.ts +0 -55
- package/dist/cjs/queries/CollectionQueries.js +0 -92
- package/dist/cjs/queries/CollectionQueries.js.map +0 -1
- package/dist/cjs/queries/FindAllQuery.d.ts +0 -12
- package/dist/cjs/queries/FindAllQuery.js +0 -44
- package/dist/cjs/queries/FindAllQuery.js.map +0 -1
- package/dist/cjs/queries/FindInfiniteQuery.d.ts +0 -19
- package/dist/cjs/queries/FindInfiniteQuery.js +0 -70
- package/dist/cjs/queries/FindInfiniteQuery.js.map +0 -1
- package/dist/cjs/queries/FindOneQuery.d.ts +0 -12
- package/dist/cjs/queries/FindOneQuery.js +0 -43
- package/dist/cjs/queries/FindOneQuery.js.map +0 -1
- package/dist/cjs/queries/FindPageQuery.d.ts +0 -24
- package/dist/cjs/queries/FindPageQuery.js +0 -77
- package/dist/cjs/queries/FindPageQuery.js.map +0 -1
- package/dist/cjs/queries/GetQuery.d.ts +0 -10
- package/dist/cjs/queries/GetQuery.js +0 -30
- package/dist/cjs/queries/GetQuery.js.map +0 -1
- package/dist/cjs/queries/QueryCache.d.ts +0 -17
- package/dist/cjs/queries/QueryCache.js +0 -46
- package/dist/cjs/queries/QueryCache.js.map +0 -1
- package/dist/cjs/queries/QueryableStorage.d.ts +0 -20
- package/dist/cjs/queries/QueryableStorage.js +0 -94
- package/dist/cjs/queries/QueryableStorage.js.map +0 -1
- package/dist/cjs/queries/dbQueries.d.ts +0 -22
- package/dist/cjs/queries/dbQueries.js +0 -136
- package/dist/cjs/queries/dbQueries.js.map +0 -1
- package/dist/cjs/queries/keys.d.ts +0 -10
- package/dist/cjs/queries/keys.js +0 -34
- package/dist/cjs/queries/keys.js.map +0 -1
- package/dist/cjs/queries/ranges.d.ts +0 -2
- package/dist/cjs/queries/ranges.js +0 -70
- package/dist/cjs/queries/ranges.js.map +0 -1
- package/dist/cjs/queries/types.d.ts +0 -6
- package/dist/cjs/queries/types.js +0 -3
- package/dist/cjs/queries/types.js.map +0 -1
- package/dist/cjs/queries/utils.d.ts +0 -3
- package/dist/cjs/queries/utils.js +0 -25
- package/dist/cjs/queries/utils.js.map +0 -1
- package/dist/cjs/sync/FileSync.d.ts +0 -24
- package/dist/cjs/sync/FileSync.js +0 -87
- package/dist/cjs/sync/FileSync.js.map +0 -1
- package/dist/cjs/sync/Heartbeat.d.ts +0 -25
- package/dist/cjs/sync/Heartbeat.js +0 -64
- package/dist/cjs/sync/Heartbeat.js.map +0 -1
- package/dist/cjs/sync/PresenceManager.d.ts +0 -55
- package/dist/cjs/sync/PresenceManager.js +0 -126
- package/dist/cjs/sync/PresenceManager.js.map +0 -1
- package/dist/cjs/sync/PushPullSync.d.ts +0 -39
- package/dist/cjs/sync/PushPullSync.js +0 -159
- package/dist/cjs/sync/PushPullSync.js.map +0 -1
- package/dist/cjs/sync/ServerSyncEndpointProvider.d.ts +0 -34
- package/dist/cjs/sync/ServerSyncEndpointProvider.js +0 -69
- package/dist/cjs/sync/ServerSyncEndpointProvider.js.map +0 -1
- package/dist/cjs/sync/Sync.d.ts +0 -160
- package/dist/cjs/sync/Sync.js +0 -293
- package/dist/cjs/sync/Sync.js.map +0 -1
- package/dist/cjs/sync/WebSocketSync.d.ts +0 -44
- package/dist/cjs/sync/WebSocketSync.js +0 -221
- package/dist/cjs/sync/WebSocketSync.js.map +0 -1
- package/dist/cjs/types.d.ts +0 -12
- package/dist/cjs/types.js +0 -3
- package/dist/cjs/types.js.map +0 -1
- package/dist/cjs/utils/Disposable.d.ts +0 -6
- package/dist/cjs/utils/Disposable.js +0 -19
- package/dist/cjs/utils/Disposable.js.map +0 -1
- package/dist/cjs/utils/Resolvable.d.ts +0 -8
- package/dist/cjs/utils/Resolvable.js +0 -23
- package/dist/cjs/utils/Resolvable.js.map +0 -1
- package/dist/cjs/vanilla.d.ts +0 -1
- package/dist/cjs/vanilla.js +0 -28
- package/dist/cjs/vanilla.js.map +0 -1
- package/dist/esm/BackoffScheduler.d.ts +0 -19
- package/dist/esm/DocumentManager.d.ts +0 -28
- package/dist/esm/FakeWeakRef.d.ts +0 -11
- package/dist/esm/IDBService.d.ts +0 -30
- package/dist/esm/UndoHistory.d.ts +0 -16
- package/dist/esm/__tests__/batching.test.d.ts +0 -1
- package/dist/esm/__tests__/documents.test.d.ts +0 -1
- package/dist/esm/__tests__/fixtures/testStorage.d.ts +0 -76
- package/dist/esm/__tests__/legacyOids.test.d.ts +0 -1
- package/dist/esm/__tests__/mutations.test.d.ts +0 -1
- package/dist/esm/__tests__/queries.test.d.ts +0 -1
- package/dist/esm/__tests__/setup/indexedDB.d.ts +0 -1
- package/dist/esm/__tests__/undo.test.d.ts +0 -1
- package/dist/esm/backup.d.ts +0 -10
- package/dist/esm/client/Client.d.ts +0 -120
- package/dist/esm/client/ClientDescriptor.d.ts +0 -76
- package/dist/esm/client/constants.d.ts +0 -1
- package/dist/esm/constants.d.ts +0 -1
- package/dist/esm/context.d.ts +0 -38
- package/dist/esm/entities/Entity.d.ts +0 -148
- package/dist/esm/entities/Entity.test.d.ts +0 -1
- package/dist/esm/entities/EntityCache.d.ts +0 -15
- package/dist/esm/entities/EntityMetadata.d.ts +0 -68
- package/dist/esm/entities/EntityStore.d.ts +0 -80
- package/dist/esm/entities/OperationBatcher.d.ts +0 -52
- package/dist/esm/entities/types.d.ts +0 -103
- package/dist/esm/files/EntityFile.d.ts +0 -35
- package/dist/esm/files/FileManager.d.ts +0 -46
- package/dist/esm/files/FileStorage.d.ts +0 -39
- package/dist/esm/files/utils.d.ts +0 -10
- package/dist/esm/files/utils.test.d.ts +0 -1
- package/dist/esm/idb.d.ts +0 -13
- package/dist/esm/index.d.ts +0 -23
- package/dist/esm/metadata/AckInfoStore.d.ts +0 -10
- package/dist/esm/metadata/BaselinesStore.d.ts +0 -40
- package/dist/esm/metadata/LocalReplicaStore.d.ts +0 -18
- package/dist/esm/metadata/MessageCreator.d.ts +0 -19
- package/dist/esm/metadata/Metadata.d.ts +0 -135
- package/dist/esm/metadata/OperationsStore.d.ts +0 -62
- package/dist/esm/metadata/SchemaStore.d.ts +0 -9
- package/dist/esm/metadata/openMetadataDatabase.d.ts +0 -19
- package/dist/esm/migration/db.d.ts +0 -8
- package/dist/esm/migration/errors.d.ts +0 -5
- package/dist/esm/migration/openDatabase.d.ts +0 -20
- package/dist/esm/migration/paths.d.ts +0 -6
- package/dist/esm/migration/paths.test.d.ts +0 -1
- package/dist/esm/queries/BaseQuery.d.ts +0 -53
- package/dist/esm/queries/CollectionQueries.d.ts +0 -55
- package/dist/esm/queries/FindAllQuery.d.ts +0 -12
- package/dist/esm/queries/FindInfiniteQuery.d.ts +0 -19
- package/dist/esm/queries/FindOneQuery.d.ts +0 -12
- package/dist/esm/queries/FindPageQuery.d.ts +0 -24
- package/dist/esm/queries/GetQuery.d.ts +0 -10
- package/dist/esm/queries/QueryCache.d.ts +0 -17
- package/dist/esm/queries/QueryableStorage.d.ts +0 -20
- package/dist/esm/queries/dbQueries.d.ts +0 -22
- package/dist/esm/queries/keys.d.ts +0 -10
- package/dist/esm/queries/ranges.d.ts +0 -2
- package/dist/esm/queries/types.d.ts +0 -6
- package/dist/esm/queries/utils.d.ts +0 -3
- package/dist/esm/sync/FileSync.d.ts +0 -24
- package/dist/esm/sync/Heartbeat.d.ts +0 -25
- package/dist/esm/sync/PresenceManager.d.ts +0 -55
- package/dist/esm/sync/PushPullSync.d.ts +0 -39
- package/dist/esm/sync/ServerSyncEndpointProvider.d.ts +0 -34
- package/dist/esm/sync/Sync.d.ts +0 -160
- package/dist/esm/sync/WebSocketSync.d.ts +0 -44
- package/dist/esm/types.d.ts +0 -12
- package/dist/esm/utils/Disposable.d.ts +0 -6
- package/dist/esm/utils/Resolvable.d.ts +0 -8
- package/dist/esm/vanilla.d.ts +0 -1
- package/dist/tsconfig-cjs.tsbuildinfo +0 -1
- package/dist/tsconfig.tsbuildinfo +0 -1
|
@@ -1,165 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.OperationBatcher = void 0;
|
|
4
|
-
const common_1 = require("@verdant-web/common");
|
|
5
|
-
const DEFAULT_BATCH_KEY = '@@default';
|
|
6
|
-
class OperationBatcher {
|
|
7
|
-
constructor({ batchTimeout = 200, meta, ctx, entities, }) {
|
|
8
|
-
this.currentBatchKey = DEFAULT_BATCH_KEY;
|
|
9
|
-
this.flushOperations = async (operations, batchKey, meta) => {
|
|
10
|
-
this.ctx.log('debug', 'Flushing', operations.length, 'operations from batch', batchKey, 'to storage / sync');
|
|
11
|
-
if (!operations.length)
|
|
12
|
-
return;
|
|
13
|
-
// rewrite timestamps of all operations to now - this preserves
|
|
14
|
-
// the linear history of operations which are sent to the server.
|
|
15
|
-
// even if multiple batches are spun up in parallel and flushed
|
|
16
|
-
// after delay, the final operations in each one should reflect
|
|
17
|
-
// when the batch flushed, not when the changes were made.
|
|
18
|
-
// This also corresponds to user-observed behavior, since unconfirmed
|
|
19
|
-
// operations are applied universally after confirmed operations locally,
|
|
20
|
-
// so even operations which were made before a remote operation but
|
|
21
|
-
// have not been confirmed yet will appear to come after the remote one
|
|
22
|
-
// despite the provisional timestamp being earlier
|
|
23
|
-
// NOTE: this MUST be mutating the original operation object! this timestamp
|
|
24
|
-
// also serves as a unique ID for deduplication later.
|
|
25
|
-
for (const op of operations) {
|
|
26
|
-
op.timestamp = this.meta.now;
|
|
27
|
-
}
|
|
28
|
-
await this.commitOperations(operations, meta);
|
|
29
|
-
};
|
|
30
|
-
/**
|
|
31
|
-
* Immediately flushes operations to storage / sync.
|
|
32
|
-
* Providing source to second arg skips hydrating related
|
|
33
|
-
* Entity from storage, which is useful when that Entity
|
|
34
|
-
* isn't in storage (i.e. still creating) or just to speed
|
|
35
|
-
* up the commit.
|
|
36
|
-
*/
|
|
37
|
-
this.commitOperations = async (operations, meta) => {
|
|
38
|
-
if (!operations.length)
|
|
39
|
-
return;
|
|
40
|
-
// now is the time to decide on what the undo operations will
|
|
41
|
-
// look like, based on the confirmed view of the related entities.
|
|
42
|
-
if (meta.undoable) {
|
|
43
|
-
const undo = await this.createUndo({
|
|
44
|
-
ops: operations,
|
|
45
|
-
source: meta.source,
|
|
46
|
-
});
|
|
47
|
-
if (undo)
|
|
48
|
-
this.ctx.undoHistory.addUndo(undo);
|
|
49
|
-
}
|
|
50
|
-
// ship it out to EntityStore to compute final snapshots
|
|
51
|
-
// write to storage and refresh entities and queries
|
|
52
|
-
await this.entities.addData({
|
|
53
|
-
operations,
|
|
54
|
-
baselines: [],
|
|
55
|
-
isLocal: true,
|
|
56
|
-
});
|
|
57
|
-
};
|
|
58
|
-
/**
|
|
59
|
-
* Adds operations to the active batch.
|
|
60
|
-
*/
|
|
61
|
-
this.addOperations = (operations) => {
|
|
62
|
-
if (!operations.length)
|
|
63
|
-
return;
|
|
64
|
-
this.batcher.add({
|
|
65
|
-
key: this.currentBatchKey,
|
|
66
|
-
items: operations,
|
|
67
|
-
});
|
|
68
|
-
this.ctx.log(`debug`, 'added', operations.length, 'ops to batch', this.currentBatchKey, ', size = ', this.batcher.getSize(this.currentBatchKey));
|
|
69
|
-
};
|
|
70
|
-
this.batch = ({ undoable = true, batchName = (0, common_1.generateId)(), max = null, timeout = this.defaultBatchTimeout, } = {}) => {
|
|
71
|
-
const internalBatch = this.batcher.add({
|
|
72
|
-
key: batchName,
|
|
73
|
-
max,
|
|
74
|
-
timeout,
|
|
75
|
-
items: [],
|
|
76
|
-
userData: { undoable },
|
|
77
|
-
});
|
|
78
|
-
const externalApi = {
|
|
79
|
-
run: (fn) => {
|
|
80
|
-
// while the provided function runs, operations are forwarded
|
|
81
|
-
// to the new batch instead of default. this relies on the function
|
|
82
|
-
// being synchronous.
|
|
83
|
-
this.currentBatchKey = batchName;
|
|
84
|
-
fn();
|
|
85
|
-
this.currentBatchKey = DEFAULT_BATCH_KEY;
|
|
86
|
-
return externalApi;
|
|
87
|
-
},
|
|
88
|
-
commit: async () => {
|
|
89
|
-
// before running a batch, the default operations must be flushed
|
|
90
|
-
// this better preserves undo history behavior...
|
|
91
|
-
// if we left the default batch open while flushing a named batch,
|
|
92
|
-
// then the default batch would be flushed after the named batch,
|
|
93
|
-
// and the default batch could contain operations both prior and
|
|
94
|
-
// after the named batch. this would result in a confusing undo
|
|
95
|
-
// history where the first undo might reverse changes before and
|
|
96
|
-
// after a set of other changes.
|
|
97
|
-
await this.batcher.flush(DEFAULT_BATCH_KEY);
|
|
98
|
-
return internalBatch.flush();
|
|
99
|
-
},
|
|
100
|
-
flush: () => externalApi.commit(),
|
|
101
|
-
discard: () => {
|
|
102
|
-
this.batcher.discard(batchName);
|
|
103
|
-
},
|
|
104
|
-
};
|
|
105
|
-
return externalApi;
|
|
106
|
-
};
|
|
107
|
-
this.flushAll = () => Promise.all(this.batcher.flushAll());
|
|
108
|
-
this.createUndo = async (data) => {
|
|
109
|
-
// this can't be done on-demand because we rely on the current
|
|
110
|
-
// state of the entities to calculate the inverse operations.
|
|
111
|
-
const inverseOps = await this.getInverseOperations(data);
|
|
112
|
-
if (!inverseOps.length)
|
|
113
|
-
return null;
|
|
114
|
-
return async () => {
|
|
115
|
-
const redo = await this.createUndo({
|
|
116
|
-
ops: inverseOps,
|
|
117
|
-
source: data.source,
|
|
118
|
-
});
|
|
119
|
-
// set time to now for all undo operations, they're happening now.
|
|
120
|
-
for (const op of inverseOps) {
|
|
121
|
-
op.timestamp = this.meta.now;
|
|
122
|
-
}
|
|
123
|
-
await this.commitOperations(inverseOps,
|
|
124
|
-
// undos should not generate their own undo operations
|
|
125
|
-
// since they already calculate redo as the inverse.
|
|
126
|
-
{ undoable: false });
|
|
127
|
-
return redo;
|
|
128
|
-
};
|
|
129
|
-
};
|
|
130
|
-
this.getInverseOperations = async ({ ops, source, }) => {
|
|
131
|
-
const grouped = (0, common_1.groupPatchesByOid)(ops);
|
|
132
|
-
const inverseOps = [];
|
|
133
|
-
const getNow = () => this.meta.now;
|
|
134
|
-
await Promise.all(Object.entries(grouped).map(async ([oid, patches]) => {
|
|
135
|
-
const entity = source !== null && source !== void 0 ? source : (await this.entities.hydrate((0, common_1.getOidRoot)(oid)));
|
|
136
|
-
// TODO: this is getting the rebased baseline? how? are ops being submitted early?
|
|
137
|
-
const viewData = entity === null || entity === void 0 ? void 0 : entity.__getViewData__(oid, 'confirmed');
|
|
138
|
-
if (!viewData) {
|
|
139
|
-
this.ctx.log('warn', 'could not find entity', oid, 'for undo operation', ops);
|
|
140
|
-
return;
|
|
141
|
-
}
|
|
142
|
-
const inverse = (0, common_1.getUndoOperations)(oid, viewData.view, patches, getNow);
|
|
143
|
-
inverseOps.unshift(...inverse);
|
|
144
|
-
}));
|
|
145
|
-
return inverseOps;
|
|
146
|
-
};
|
|
147
|
-
this.meta = meta;
|
|
148
|
-
this.ctx = ctx;
|
|
149
|
-
this.entities = entities;
|
|
150
|
-
this.defaultBatchTimeout = batchTimeout;
|
|
151
|
-
this.batcher = new common_1.Batcher(this.flushOperations);
|
|
152
|
-
this.batcher.add({
|
|
153
|
-
key: DEFAULT_BATCH_KEY,
|
|
154
|
-
items: [],
|
|
155
|
-
max: 100,
|
|
156
|
-
timeout: batchTimeout,
|
|
157
|
-
userData: { undoable: true },
|
|
158
|
-
});
|
|
159
|
-
}
|
|
160
|
-
get isDefaultBatch() {
|
|
161
|
-
return this.currentBatchKey === DEFAULT_BATCH_KEY;
|
|
162
|
-
}
|
|
163
|
-
}
|
|
164
|
-
exports.OperationBatcher = OperationBatcher;
|
|
165
|
-
//# sourceMappingURL=OperationBatcher.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"OperationBatcher.js","sourceRoot":"","sources":["../../../src/entities/OperationBatcher.ts"],"names":[],"mappings":";;;AAAA,gDAO6B;AAM7B,MAAM,iBAAiB,GAAG,WAAW,CAAC;AAUtC,MAAa,gBAAgB;IAQ5B,YAAY,EACX,YAAY,GAAG,GAAG,EAClB,IAAI,EACJ,GAAG,EACH,QAAQ,GAMR;QAhBO,oBAAe,GAAG,iBAAiB,CAAC;QAqCpC,oBAAe,GAAG,KAAK,EAC9B,UAAuB,EACvB,QAAgB,EAChB,IAA4B,EAC3B,EAAE;YACH,IAAI,CAAC,GAAG,CAAC,GAAG,CACX,OAAO,EACP,UAAU,EACV,UAAU,CAAC,MAAM,EACjB,uBAAuB,EACvB,QAAQ,EACR,mBAAmB,CACnB,CAAC;YACF,IAAI,CAAC,UAAU,CAAC,MAAM;gBAAE,OAAO;YAC/B,+DAA+D;YAC/D,iEAAiE;YACjE,+DAA+D;YAC/D,+DAA+D;YAC/D,0DAA0D;YAC1D,qEAAqE;YACrE,yEAAyE;YACzE,mEAAmE;YACnE,uEAAuE;YACvE,kDAAkD;YAClD,4EAA4E;YAC5E,sDAAsD;YACtD,KAAK,MAAM,EAAE,IAAI,UAAU,EAAE;gBAC5B,EAAE,CAAC,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC;aAC7B;YACD,MAAM,IAAI,CAAC,gBAAgB,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;QAC/C,CAAC,CAAC;QAEF;;;;;;WAMG;QACH,qBAAgB,GAAG,KAAK,EACvB,UAAuB,EACvB,IAA6C,EAC5C,EAAE;YACH,IAAI,CAAC,UAAU,CAAC,MAAM;gBAAE,OAAO;YAC/B,6DAA6D;YAC7D,kEAAkE;YAClE,IAAI,IAAI,CAAC,QAAQ,EAAE;gBAClB,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC;oBAClC,GAAG,EAAE,UAAU;oBACf,MAAM,EAAE,IAAI,CAAC,MAAM;iBACnB,CAAC,CAAC;gBACH,IAAI,IAAI;oBAAE,IAAI,CAAC,GAAG,CAAC,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;aAC7C;YACD,wDAAwD;YACxD,oDAAoD;YACpD,MAAM,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC;gBAC3B,UAAU;gBACV,SAAS,EAAE,EAAE;gBACb,OAAO,EAAE,IAAI;aACb,CAAC,CAAC;QACJ,CAAC,CAAC;QAEF;;WAEG;QACH,kBAAa,GAAG,CAAC,UAAuB,EAAE,EAAE;YAC3C,IAAI,CAAC,UAAU,CAAC,MAAM;gBAAE,OAAO;YAC/B,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC;gBAChB,GAAG,EAAE,IAAI,CAAC,eAAe;gBACzB,KAAK,EAAE,UAAU;aACjB,CAAC,CAAC;YACH,IAAI,CAAC,GAAG,CAAC,GAAG,CACX,OAAO,EACP,OAAO,EACP,UAAU,CAAC,MAAM,EACjB,cAAc,EACd,IAAI,CAAC,eAAe,EACpB,WAAW,EACX,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,eAAe,CAAC,CAC1C,CAAC;QACH,CAAC,CAAC;QAEF,UAAK,GAAG,CAAC,EACR,QAAQ,GAAG,IAAI,EACf,SAAS,GAAG,IAAA,mBAAU,GAAE,EACxB,GAAG,GAAG,IAAI,EACV,OAAO,GAAG,IAAI,CAAC,mBAAmB,MAM/B,EAAE,EAAkB,EAAE;YACzB,MAAM,aAAa,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC;gBACtC,GAAG,EAAE,SAAS;gBACd,GAAG;gBACH,OAAO;gBACP,KAAK,EAAE,EAAE;gBACT,QAAQ,EAAE,EAAE,QAAQ,EAAE;aACtB,CAAC,CAAC;YACH,MAAM,WAAW,GAAG;gBACnB,GAAG,EAAE,CAAC,EAAc,EAAE,EAAE;oBACvB,6DAA6D;oBAC7D,mEAAmE;oBACnE,qBAAqB;oBACrB,IAAI,CAAC,eAAe,GAAG,SAAS,CAAC;oBACjC,EAAE,EAAE,CAAC;oBACL,IAAI,CAAC,eAAe,GAAG,iBAAiB,CAAC;oBACzC,OAAO,WAAW,CAAC;gBACpB,CAAC;gBACD,MAAM,EAAE,KAAK,IAAI,EAAE;oBAClB,iEAAiE;oBACjE,iDAAiD;oBACjD,kEAAkE;oBAClE,iEAAiE;oBACjE,gEAAgE;oBAChE,+DAA+D;oBAC/D,gEAAgE;oBAChE,gCAAgC;oBAChC,MAAM,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC;oBAC5C,OAAO,aAAa,CAAC,KAAK,EAAE,CAAC;gBAC9B,CAAC;gBACD,KAAK,EAAE,GAAG,EAAE,CAAC,WAAW,CAAC,MAAM,EAAE;gBACjC,OAAO,EAAE,GAAG,EAAE;oBACb,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;gBACjC,CAAC;aACD,CAAC;YACF,OAAO,WAAW,CAAC;QACpB,CAAC,CAAC;QAEF,aAAQ,GAAG,GAAG,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC;QAE9C,eAAU,GAAG,KAAK,EAAE,IAA2C,EAAE,EAAE;YAC1E,8DAA8D;YAC9D,6DAA6D;YAC7D,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,CAAC;YAEzD,IAAI,CAAC,UAAU,CAAC,MAAM;gBAAE,OAAO,IAAI,CAAC;YAEpC,OAAO,KAAK,IAAI,EAAE;gBACjB,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC;oBAClC,GAAG,EAAE,UAAU;oBACf,MAAM,EAAE,IAAI,CAAC,MAAM;iBACnB,CAAC,CAAC;gBACH,kEAAkE;gBAClE,KAAK,MAAM,EAAE,IAAI,UAAU,EAAE;oBAC5B,EAAE,CAAC,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC;iBAC7B;gBACD,MAAM,IAAI,CAAC,gBAAgB,CAC1B,UAAU;gBACV,sDAAsD;gBACtD,oDAAoD;gBACpD,EAAE,QAAQ,EAAE,KAAK,EAAE,CACnB,CAAC;gBACF,OAAO,IAAI,CAAC;YACb,CAAC,CAAC;QACH,CAAC,CAAC;QACM,yBAAoB,GAAG,KAAK,EAAE,EACrC,GAAG,EACH,MAAM,GAIN,EAAE,EAAE;YACJ,MAAM,OAAO,GAAG,IAAA,0BAAiB,EAAC,GAAG,CAAC,CAAC;YACvC,MAAM,UAAU,GAAgB,EAAE,CAAC;YACnC,MAAM,MAAM,GAAG,GAAG,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC;YACnC,MAAM,OAAO,CAAC,GAAG,CAChB,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,GAAG,EAAE,OAAO,CAAC,EAAiB,EAAE;gBACnE,MAAM,MAAM,GAAG,MAAM,aAAN,MAAM,cAAN,MAAM,GAAI,CAAC,MAAM,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAA,mBAAU,EAAC,GAAG,CAAC,CAAC,CAAC,CAAC;gBACxE,kFAAkF;gBAClF,MAAM,QAAQ,GAAG,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,eAAe,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC;gBAC3D,IAAI,CAAC,QAAQ,EAAE;oBACd,IAAI,CAAC,GAAG,CAAC,GAAG,CACX,MAAM,EACN,uBAAuB,EACvB,GAAG,EACH,oBAAoB,EACpB,GAAG,CACH,CAAC;oBACF,OAAO;iBACP;gBACD,MAAM,OAAO,GAAG,IAAA,0BAAiB,EAAC,GAAG,EAAE,QAAQ,CAAC,IAAI,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;gBACvE,UAAU,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC,CAAC;YAChC,CAAC,CAAC,CACF,CAAC;YACF,OAAO,UAAU,CAAC;QACnB,CAAC,CAAC;QA/MD,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC;QACf,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;QACzB,IAAI,CAAC,mBAAmB,GAAG,YAAY,CAAC;QACxC,IAAI,CAAC,OAAO,GAAG,IAAI,gBAAO,CACzB,IAAI,CAAC,eAAe,CACpB,CAAC;QACF,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC;YAChB,GAAG,EAAE,iBAAiB;YACtB,KAAK,EAAE,EAAE;YACT,GAAG,EAAE,GAAG;YACR,OAAO,EAAE,YAAY;YACrB,QAAQ,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE;SAC5B,CAAC,CAAC;IACJ,CAAC;IAED,IAAI,cAAc;QACjB,OAAO,IAAI,CAAC,eAAe,KAAK,iBAAiB,CAAC;IACnD,CAAC;CA8LD;AAnOD,4CAmOC"}
|
|
@@ -1,103 +0,0 @@
|
|
|
1
|
-
import { ObjectIdentifier } from '@verdant-web/common';
|
|
2
|
-
import type { Entity } from './Entity.js';
|
|
3
|
-
export type AccessibleEntityProperty<T> = T extends Array<any> ? number : T extends object ? keyof T : never;
|
|
4
|
-
export type DataFromInit<Init> = Init extends {
|
|
5
|
-
[key: string]: any;
|
|
6
|
-
} ? {
|
|
7
|
-
[Key in keyof Init]: Init[Key];
|
|
8
|
-
} : Init extends Array<any> ? Init : any;
|
|
9
|
-
export type DeletableKeys<T> = keyof {
|
|
10
|
-
[Key in keyof T as IfNullableThen<T[Key], Key>]: Key;
|
|
11
|
-
};
|
|
12
|
-
type IfNullableThen<T, Out> = undefined extends T ? Out : null extends T ? Out : never;
|
|
13
|
-
export type EntityShape<E extends Entity<any, any>> = E extends Entity<infer Value, any> ? Value : never;
|
|
14
|
-
export type BaseEntityValue = {
|
|
15
|
-
[Key: string]: any;
|
|
16
|
-
} | any[];
|
|
17
|
-
export interface EntityChange {
|
|
18
|
-
oid: ObjectIdentifier;
|
|
19
|
-
isLocal: boolean;
|
|
20
|
-
}
|
|
21
|
-
export interface EntityChangeInfo {
|
|
22
|
-
isLocal?: boolean;
|
|
23
|
-
}
|
|
24
|
-
export type EntityEvents = {
|
|
25
|
-
change: (info: EntityChangeInfo) => void;
|
|
26
|
-
changeDeep: (target: BaseEntity<any, any, any>, info: EntityChangeInfo) => void;
|
|
27
|
-
delete: (info: EntityChangeInfo) => void;
|
|
28
|
-
restore: (info: EntityChangeInfo) => void;
|
|
29
|
-
};
|
|
30
|
-
export interface BaseEntity<Init, Value extends BaseEntityValue, Snapshot = DataFromInit<Init>> {
|
|
31
|
-
dispose: () => void;
|
|
32
|
-
subscribe<EventName extends keyof EntityEvents>(event: EventName, callback: EntityEvents[EventName]): () => void;
|
|
33
|
-
get<Key extends keyof Value>(key: Key): Value[Key];
|
|
34
|
-
getAll(): Value;
|
|
35
|
-
getSnapshot(): Snapshot;
|
|
36
|
-
readonly deleted: boolean;
|
|
37
|
-
readonly updatedAt: number;
|
|
38
|
-
readonly uid: string;
|
|
39
|
-
}
|
|
40
|
-
export type DeepPartial<T> = T extends object ? {
|
|
41
|
-
[P in keyof T]?: DeepPartial<T[P]>;
|
|
42
|
-
} : T;
|
|
43
|
-
export interface ObjectEntity<Init, Value extends BaseEntityValue, Snapshot = DataFromInit<Init>> extends BaseEntity<Init, Value, Snapshot> {
|
|
44
|
-
keys(): string[];
|
|
45
|
-
entries(): [string, Exclude<Value[keyof Value], undefined>][];
|
|
46
|
-
values(): Exclude<Value[keyof Value], undefined>[];
|
|
47
|
-
set<Key extends keyof Init>(key: Key, value: Init[Key]): void;
|
|
48
|
-
delete(key: DeletableKeys<Value>): void;
|
|
49
|
-
update(value: DeepPartial<Init>, options?: {
|
|
50
|
-
/**
|
|
51
|
-
* Forces the replacement of sub-objects in the update payload - rather than
|
|
52
|
-
* Verdant keeping their identities intact and merging changes, your update
|
|
53
|
-
* will replace these objects entirely, overwriting any other changes from other
|
|
54
|
-
* sources.
|
|
55
|
-
*
|
|
56
|
-
* Useful when the update you're making is logically replacing sub-objects, rather
|
|
57
|
-
* than simply modifying them.
|
|
58
|
-
*
|
|
59
|
-
* Default: false
|
|
60
|
-
*/
|
|
61
|
-
replaceSubObjects?: boolean;
|
|
62
|
-
/**
|
|
63
|
-
* If set to false, this will drop any keys in the object which were
|
|
64
|
-
* not provided in your update payload, while also merging the ones that
|
|
65
|
-
* were. This option only works for `map` and `any` type fields; you cannot
|
|
66
|
-
* use it with defined `object` type fields.
|
|
67
|
-
*
|
|
68
|
-
* Default: true
|
|
69
|
-
*/
|
|
70
|
-
merge?: boolean;
|
|
71
|
-
}): void;
|
|
72
|
-
readonly isList: false;
|
|
73
|
-
}
|
|
74
|
-
export interface ListEntity<Init, Value extends BaseEntityValue, Snapshot = DataFromInit<Init>> extends Iterable<ListItemValue<Value>>, BaseEntity<Init, Value, Snapshot> {
|
|
75
|
-
readonly isList: true;
|
|
76
|
-
readonly length: number;
|
|
77
|
-
push(value: ListItemInit<Init>): void;
|
|
78
|
-
insert(index: number, value: ListItemInit<Init>): void;
|
|
79
|
-
move(from: number, to: number): void;
|
|
80
|
-
moveItem(item: ListItemValue<Value>, to: number): void;
|
|
81
|
-
/**
|
|
82
|
-
* A Set operation which adds a value if an equivalent value is not already present.
|
|
83
|
-
* Object values are never the same.
|
|
84
|
-
*/
|
|
85
|
-
add(value: ListItemValue<Value>): void;
|
|
86
|
-
removeAll(item: ListItemValue<Value>): void;
|
|
87
|
-
removeFirst(item: ListItemValue<Value>): void;
|
|
88
|
-
removeLast(item: ListItemValue<Value>): void;
|
|
89
|
-
map<U>(callback: (value: ListItemValue<Value>, index: number) => U): U[];
|
|
90
|
-
filter(callback: (value: ListItemValue<Value>, index: number) => boolean): ListItemValue<Value>[];
|
|
91
|
-
delete(index: number): void;
|
|
92
|
-
has(value: ListItemValue<Value>): boolean;
|
|
93
|
-
forEach(callback: (value: ListItemValue<Value>, index: number) => void): void;
|
|
94
|
-
some(predicate: (value: ListItemValue<Value>) => boolean): boolean;
|
|
95
|
-
every(predicate: (value: ListItemValue<Value>) => boolean): boolean;
|
|
96
|
-
find(predicate: (value: ListItemValue<Value>) => boolean): ListItemValue<Value> | undefined;
|
|
97
|
-
includes(value: ListItemValue<Value>): boolean;
|
|
98
|
-
}
|
|
99
|
-
export type AnyEntity<Init, KeyValue extends BaseEntityValue, Snapshot extends any> = ListEntity<Init, KeyValue, Snapshot> | ObjectEntity<Init, KeyValue, Snapshot>;
|
|
100
|
-
export type ListItemValue<KeyValue> = KeyValue extends Array<infer T> ? T : never;
|
|
101
|
-
export type ListItemInit<Init> = Init extends Array<infer T> ? T : never;
|
|
102
|
-
export type EntityDestructured<T extends AnyEntity<any, any, any> | null> = (T extends ListEntity<any, infer KeyValue, any> ? KeyValue : T extends ObjectEntity<any, infer KeyValue, any> ? KeyValue : never) | (T extends null ? null : never);
|
|
103
|
-
export {};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/entities/types.ts"],"names":[],"mappings":""}
|
|
@@ -1,35 +0,0 @@
|
|
|
1
|
-
import { EventSubscriber, FileData } from '@verdant-web/common';
|
|
2
|
-
export type EntityFileEvents = {
|
|
3
|
-
change: () => void;
|
|
4
|
-
};
|
|
5
|
-
export declare const UPDATE: unique symbol;
|
|
6
|
-
export declare const MARK_FAILED: unique symbol;
|
|
7
|
-
export type EntityFileSnapshot = {
|
|
8
|
-
id: string;
|
|
9
|
-
url?: string | null;
|
|
10
|
-
};
|
|
11
|
-
/**
|
|
12
|
-
* Provides a consistent interface for files used in an app via
|
|
13
|
-
* Entity access.
|
|
14
|
-
*/
|
|
15
|
-
export declare class EntityFile extends EventSubscriber<EntityFileEvents> {
|
|
16
|
-
readonly id: string;
|
|
17
|
-
private _objectUrl;
|
|
18
|
-
private _fileData;
|
|
19
|
-
private _loading;
|
|
20
|
-
private _failed;
|
|
21
|
-
private _downloadRemote;
|
|
22
|
-
constructor(id: string, { downloadRemote, }?: {
|
|
23
|
-
downloadRemote?: boolean;
|
|
24
|
-
});
|
|
25
|
-
get downloadRemote(): boolean;
|
|
26
|
-
[UPDATE]: (fileData: FileData) => void;
|
|
27
|
-
[MARK_FAILED]: () => void;
|
|
28
|
-
get url(): string | null;
|
|
29
|
-
get name(): string | null;
|
|
30
|
-
get type(): string | null;
|
|
31
|
-
get loading(): boolean;
|
|
32
|
-
get failed(): boolean;
|
|
33
|
-
destroy: () => void;
|
|
34
|
-
getSnapshot(): EntityFileSnapshot;
|
|
35
|
-
}
|
|
@@ -1,81 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var _a, _b;
|
|
3
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
-
exports.EntityFile = exports.MARK_FAILED = exports.UPDATE = void 0;
|
|
5
|
-
const common_1 = require("@verdant-web/common");
|
|
6
|
-
exports.UPDATE = Symbol('entity-file-update');
|
|
7
|
-
exports.MARK_FAILED = Symbol('entity-file-mark-failed');
|
|
8
|
-
/**
|
|
9
|
-
* Provides a consistent interface for files used in an app via
|
|
10
|
-
* Entity access.
|
|
11
|
-
*/
|
|
12
|
-
class EntityFile extends common_1.EventSubscriber {
|
|
13
|
-
constructor(id, { downloadRemote = false, } = {}) {
|
|
14
|
-
super();
|
|
15
|
-
this.id = id;
|
|
16
|
-
// cached object URL for a local blob file, if applicable
|
|
17
|
-
this._objectUrl = null;
|
|
18
|
-
this._fileData = null;
|
|
19
|
-
this._loading = true;
|
|
20
|
-
this._failed = false;
|
|
21
|
-
this._downloadRemote = false;
|
|
22
|
-
this[_a] = (fileData) => {
|
|
23
|
-
this._loading = false;
|
|
24
|
-
this._failed = false;
|
|
25
|
-
this._fileData = fileData;
|
|
26
|
-
if (fileData.file) {
|
|
27
|
-
if (this._objectUrl) {
|
|
28
|
-
URL.revokeObjectURL(this._objectUrl);
|
|
29
|
-
}
|
|
30
|
-
this._objectUrl = URL.createObjectURL(fileData.file);
|
|
31
|
-
}
|
|
32
|
-
this.emit('change');
|
|
33
|
-
};
|
|
34
|
-
this[_b] = () => {
|
|
35
|
-
this._failed = true;
|
|
36
|
-
this._loading = false;
|
|
37
|
-
this.emit('change');
|
|
38
|
-
};
|
|
39
|
-
this.destroy = () => {
|
|
40
|
-
if (this._objectUrl) {
|
|
41
|
-
URL.revokeObjectURL(this._objectUrl);
|
|
42
|
-
}
|
|
43
|
-
this.dispose();
|
|
44
|
-
};
|
|
45
|
-
this._downloadRemote = downloadRemote;
|
|
46
|
-
}
|
|
47
|
-
get downloadRemote() {
|
|
48
|
-
return this._downloadRemote;
|
|
49
|
-
}
|
|
50
|
-
get url() {
|
|
51
|
-
var _c, _d;
|
|
52
|
-
if (this.loading)
|
|
53
|
-
return null;
|
|
54
|
-
if (this._objectUrl)
|
|
55
|
-
return this._objectUrl;
|
|
56
|
-
return (_d = (_c = this._fileData) === null || _c === void 0 ? void 0 : _c.url) !== null && _d !== void 0 ? _d : null;
|
|
57
|
-
}
|
|
58
|
-
get name() {
|
|
59
|
-
var _c, _d;
|
|
60
|
-
return (_d = (_c = this._fileData) === null || _c === void 0 ? void 0 : _c.name) !== null && _d !== void 0 ? _d : null;
|
|
61
|
-
}
|
|
62
|
-
get type() {
|
|
63
|
-
var _c, _d;
|
|
64
|
-
return (_d = (_c = this._fileData) === null || _c === void 0 ? void 0 : _c.type) !== null && _d !== void 0 ? _d : null;
|
|
65
|
-
}
|
|
66
|
-
get loading() {
|
|
67
|
-
return this._loading;
|
|
68
|
-
}
|
|
69
|
-
get failed() {
|
|
70
|
-
return this._failed;
|
|
71
|
-
}
|
|
72
|
-
getSnapshot() {
|
|
73
|
-
return {
|
|
74
|
-
id: this.id,
|
|
75
|
-
url: this.loading || this.failed ? undefined : this.url,
|
|
76
|
-
};
|
|
77
|
-
}
|
|
78
|
-
}
|
|
79
|
-
exports.EntityFile = EntityFile;
|
|
80
|
-
_a = exports.UPDATE, _b = exports.MARK_FAILED;
|
|
81
|
-
//# sourceMappingURL=EntityFile.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"EntityFile.js","sourceRoot":"","sources":["../../../src/files/EntityFile.ts"],"names":[],"mappings":";;;;AAAA,gDAAgE;AAMnD,QAAA,MAAM,GAAG,MAAM,CAAC,oBAAoB,CAAC,CAAC;AACtC,QAAA,WAAW,GAAG,MAAM,CAAC,yBAAyB,CAAC,CAAC;AAO7D;;;GAGG;AACH,MAAa,UAAW,SAAQ,wBAAiC;IAQhE,YACiB,EAAU,EAC1B,EACC,cAAc,GAAG,KAAK,MAGnB,EAAE;QAEN,KAAK,EAAE,CAAC;QAPQ,OAAE,GAAF,EAAE,CAAQ;QAR3B,yDAAyD;QACjD,eAAU,GAAkB,IAAI,CAAC;QACjC,cAAS,GAAoB,IAAI,CAAC;QAClC,aAAQ,GAAG,IAAI,CAAC;QAChB,YAAO,GAAG,KAAK,CAAC;QAChB,oBAAe,GAAG,KAAK,CAAC;QAkBhC,QAAQ,GAAG,CAAC,QAAkB,EAAE,EAAE;YACjC,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC;YACtB,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC;YACrB,IAAI,CAAC,SAAS,GAAG,QAAQ,CAAC;YAC1B,IAAI,QAAQ,CAAC,IAAI,EAAE;gBAClB,IAAI,IAAI,CAAC,UAAU,EAAE;oBACpB,GAAG,CAAC,eAAe,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;iBACrC;gBACD,IAAI,CAAC,UAAU,GAAG,GAAG,CAAC,eAAe,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;aACrD;YACD,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACrB,CAAC,CAAC;QAEF,QAAa,GAAG,GAAG,EAAE;YACpB,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;YACpB,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC;YACtB,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACrB,CAAC,CAAC;QAwBF,YAAO,GAAG,GAAG,EAAE;YACd,IAAI,IAAI,CAAC,UAAU,EAAE;gBACpB,GAAG,CAAC,eAAe,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;aACrC;YACD,IAAI,CAAC,OAAO,EAAE,CAAC;QAChB,CAAC,CAAC;QArDD,IAAI,CAAC,eAAe,GAAG,cAAc,CAAC;IACvC,CAAC;IAED,IAAI,cAAc;QACjB,OAAO,IAAI,CAAC,eAAe,CAAC;IAC7B,CAAC;IAqBD,IAAI,GAAG;;QACN,IAAI,IAAI,CAAC,OAAO;YAAE,OAAO,IAAI,CAAC;QAC9B,IAAI,IAAI,CAAC,UAAU;YAAE,OAAO,IAAI,CAAC,UAAU,CAAC;QAC5C,OAAO,MAAA,MAAA,IAAI,CAAC,SAAS,0CAAE,GAAG,mCAAI,IAAI,CAAC;IACpC,CAAC;IAED,IAAI,IAAI;;QACP,OAAO,MAAA,MAAA,IAAI,CAAC,SAAS,0CAAE,IAAI,mCAAI,IAAI,CAAC;IACrC,CAAC;IAED,IAAI,IAAI;;QACP,OAAO,MAAA,MAAA,IAAI,CAAC,SAAS,0CAAE,IAAI,mCAAI,IAAI,CAAC;IACrC,CAAC;IAED,IAAI,OAAO;QACV,OAAO,IAAI,CAAC,QAAQ,CAAC;IACtB,CAAC;IAED,IAAI,MAAM;QACT,OAAO,IAAI,CAAC,OAAO,CAAC;IACrB,CAAC;IASD,WAAW;QACV,OAAO;YACN,EAAE,EAAE,IAAI,CAAC,EAAE;YACX,GAAG,EAAE,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG;SACvD,CAAC;IACH,CAAC;CACD;AA9ED,gCA8EC;KAtDC,cAAM,OAaN,mBAAW"}
|
|
@@ -1,46 +0,0 @@
|
|
|
1
|
-
import { FileData } from '@verdant-web/common';
|
|
2
|
-
import { Context } from '../context.js';
|
|
3
|
-
import { Metadata } from '../metadata/Metadata.js';
|
|
4
|
-
import { Sync } from '../sync/Sync.js';
|
|
5
|
-
import { EntityFile } from './EntityFile.js';
|
|
6
|
-
import { ReturnedFileData } from './FileStorage.js';
|
|
7
|
-
export interface FileManagerConfig {
|
|
8
|
-
/**
|
|
9
|
-
* Override the heuristic for deciding when a deleted file can be cleaned up.
|
|
10
|
-
* By default this waits 3 days since deletion, then deletes the file data.
|
|
11
|
-
* If the file has been synchronized to a server, it could still be restored
|
|
12
|
-
* if the server has not yet deleted it.
|
|
13
|
-
*/
|
|
14
|
-
canCleanupDeletedFile?: (file: ReturnedFileData) => boolean;
|
|
15
|
-
}
|
|
16
|
-
export declare class FileManager {
|
|
17
|
-
private storage;
|
|
18
|
-
private sync;
|
|
19
|
-
private context;
|
|
20
|
-
private files;
|
|
21
|
-
private config;
|
|
22
|
-
private meta;
|
|
23
|
-
constructor({ db, sync, context, meta, config, }: {
|
|
24
|
-
db: IDBDatabase;
|
|
25
|
-
sync: Sync;
|
|
26
|
-
context: Context;
|
|
27
|
-
config?: FileManagerConfig;
|
|
28
|
-
meta: Metadata;
|
|
29
|
-
});
|
|
30
|
-
add: (fileInput: Omit<FileData, 'remote'>) => Promise<void>;
|
|
31
|
-
private uploadFile;
|
|
32
|
-
/**
|
|
33
|
-
* Immediately returns an EntityFile to use, then either loads
|
|
34
|
-
* the file from cache, local database, or the server.
|
|
35
|
-
*/
|
|
36
|
-
get: (id: string, options?: {
|
|
37
|
-
downloadRemote?: boolean;
|
|
38
|
-
}) => EntityFile;
|
|
39
|
-
private load;
|
|
40
|
-
listUnsynced: () => Promise<ReturnedFileData[]>;
|
|
41
|
-
exportAll: (downloadRemote?: boolean) => Promise<ReturnedFileData[]>;
|
|
42
|
-
importAll: (files: ReturnedFileData[]) => Promise<void>;
|
|
43
|
-
private onOnlineChange;
|
|
44
|
-
private tryCleanupDeletedFiles;
|
|
45
|
-
private handleFileRefsDeleted;
|
|
46
|
-
}
|
|
@@ -1,174 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.FileManager = void 0;
|
|
4
|
-
const EntityFile_js_1 = require("./EntityFile.js");
|
|
5
|
-
const FileStorage_js_1 = require("./FileStorage.js");
|
|
6
|
-
/**
|
|
7
|
-
* Default: if file was deleted > 3 days ago
|
|
8
|
-
*/
|
|
9
|
-
function defaultCanCleanup(fileData) {
|
|
10
|
-
return (fileData.deletedAt !== null &&
|
|
11
|
-
fileData.deletedAt < Date.now() - 1000 * 60 * 24 * 3);
|
|
12
|
-
}
|
|
13
|
-
class FileManager {
|
|
14
|
-
constructor({ db, sync, context, meta, config = {}, }) {
|
|
15
|
-
this.files = new Map();
|
|
16
|
-
this.add = async (fileInput) => {
|
|
17
|
-
const file = fileInput;
|
|
18
|
-
file.remote = false;
|
|
19
|
-
// immediately cache the file
|
|
20
|
-
if (!this.files.has(file.id)) {
|
|
21
|
-
const entityFile = new EntityFile_js_1.EntityFile(file.id);
|
|
22
|
-
entityFile[EntityFile_js_1.UPDATE](file);
|
|
23
|
-
this.files.set(file.id, entityFile);
|
|
24
|
-
}
|
|
25
|
-
else {
|
|
26
|
-
this.files.get(file.id)[EntityFile_js_1.UPDATE](file);
|
|
27
|
-
}
|
|
28
|
-
// write to local storage and send to sync immediately
|
|
29
|
-
await this.storage.addFile(file);
|
|
30
|
-
// send to sync
|
|
31
|
-
if (file.file) {
|
|
32
|
-
await this.uploadFile(file, 1);
|
|
33
|
-
}
|
|
34
|
-
};
|
|
35
|
-
this.uploadFile = async (file, retries = 0) => {
|
|
36
|
-
const result = await this.sync.uploadFile(file);
|
|
37
|
-
if (result.success) {
|
|
38
|
-
await this.storage.markUploaded(file.id);
|
|
39
|
-
}
|
|
40
|
-
else {
|
|
41
|
-
if (result.retry && retries < 5) {
|
|
42
|
-
this.context.log('error', 'Error uploading file, retrying...');
|
|
43
|
-
// schedule a retry
|
|
44
|
-
setTimeout(this.uploadFile, 1000, file, retries + 1);
|
|
45
|
-
}
|
|
46
|
-
else {
|
|
47
|
-
this.context.log('error', 'Failed to upload file. Not retrying until next sync.');
|
|
48
|
-
}
|
|
49
|
-
}
|
|
50
|
-
};
|
|
51
|
-
/**
|
|
52
|
-
* Immediately returns an EntityFile to use, then either loads
|
|
53
|
-
* the file from cache, local database, or the server.
|
|
54
|
-
*/
|
|
55
|
-
this.get = (id, options) => {
|
|
56
|
-
if (this.files.has(id)) {
|
|
57
|
-
return this.files.get(id);
|
|
58
|
-
}
|
|
59
|
-
const file = new EntityFile_js_1.EntityFile(id, options);
|
|
60
|
-
this.files.set(id, file);
|
|
61
|
-
this.load(file);
|
|
62
|
-
return file;
|
|
63
|
-
};
|
|
64
|
-
this.load = async (file, retries = 0) => {
|
|
65
|
-
if (retries > 5) {
|
|
66
|
-
this.context.log('error', 'Failed to load file after 5 retries');
|
|
67
|
-
file[EntityFile_js_1.MARK_FAILED]();
|
|
68
|
-
return;
|
|
69
|
-
}
|
|
70
|
-
const fileData = await this.storage.getFile(file.id);
|
|
71
|
-
if (fileData) {
|
|
72
|
-
file[EntityFile_js_1.UPDATE](fileData);
|
|
73
|
-
}
|
|
74
|
-
else {
|
|
75
|
-
// maybe we don't have it yet, it might be on the server still.
|
|
76
|
-
try {
|
|
77
|
-
const result = await this.sync.getFile(file.id);
|
|
78
|
-
if (result.success) {
|
|
79
|
-
file[EntityFile_js_1.UPDATE](result.data);
|
|
80
|
-
await this.storage.addFile(result.data, {
|
|
81
|
-
downloadRemote: file.downloadRemote,
|
|
82
|
-
});
|
|
83
|
-
}
|
|
84
|
-
else {
|
|
85
|
-
this.context.log('error', 'Failed to load file', result);
|
|
86
|
-
file[EntityFile_js_1.MARK_FAILED]();
|
|
87
|
-
if (result.retry) {
|
|
88
|
-
// schedule a retry
|
|
89
|
-
setTimeout(this.load, 1000, file, retries + 1);
|
|
90
|
-
}
|
|
91
|
-
}
|
|
92
|
-
}
|
|
93
|
-
catch (err) {
|
|
94
|
-
this.context.log('error', 'Failed to load file', err);
|
|
95
|
-
file[EntityFile_js_1.MARK_FAILED]();
|
|
96
|
-
// schedule a retry
|
|
97
|
-
setTimeout(this.load, 1000, file, retries + 1);
|
|
98
|
-
}
|
|
99
|
-
}
|
|
100
|
-
};
|
|
101
|
-
this.listUnsynced = async () => {
|
|
102
|
-
return this.storage.listUnsynced();
|
|
103
|
-
};
|
|
104
|
-
this.exportAll = async (downloadRemote = false) => {
|
|
105
|
-
const storedFiles = await this.storage.getAll();
|
|
106
|
-
if (downloadRemote) {
|
|
107
|
-
for (const storedFile of storedFiles) {
|
|
108
|
-
// if it doesn't have a buffer, we need to read
|
|
109
|
-
// one from the server
|
|
110
|
-
if (!storedFile.file && storedFile.url) {
|
|
111
|
-
try {
|
|
112
|
-
const blob = await fetch(storedFile.url, {
|
|
113
|
-
method: 'GET',
|
|
114
|
-
credentials: 'include',
|
|
115
|
-
}).then((r) => r.blob());
|
|
116
|
-
storedFile.file = blob;
|
|
117
|
-
}
|
|
118
|
-
catch (err) {
|
|
119
|
-
this.context.log('error', "Failed to download file to cache it locally. The file will still be available using its URL. Check the file server's CORS configuration.", err);
|
|
120
|
-
}
|
|
121
|
-
}
|
|
122
|
-
}
|
|
123
|
-
}
|
|
124
|
-
return storedFiles;
|
|
125
|
-
};
|
|
126
|
-
this.importAll = async (files) => {
|
|
127
|
-
await Promise.all(files.map((file) => this.add(file)));
|
|
128
|
-
};
|
|
129
|
-
this.onOnlineChange = async (online) => {
|
|
130
|
-
// if online, try to upload any unsynced files
|
|
131
|
-
if (online) {
|
|
132
|
-
const unsynced = await this.listUnsynced();
|
|
133
|
-
await Promise.all(unsynced.map(this.uploadFile));
|
|
134
|
-
}
|
|
135
|
-
};
|
|
136
|
-
this.tryCleanupDeletedFiles = async () => {
|
|
137
|
-
let count = 0;
|
|
138
|
-
let skipCount = 0;
|
|
139
|
-
await this.storage.iterateOverPendingDelete((fileData, store) => {
|
|
140
|
-
if (this.config.canCleanupDeletedFile(fileData)) {
|
|
141
|
-
count++;
|
|
142
|
-
store.delete(fileData.id);
|
|
143
|
-
}
|
|
144
|
-
else {
|
|
145
|
-
skipCount++;
|
|
146
|
-
}
|
|
147
|
-
});
|
|
148
|
-
this.context.log('info', `Cleaned up ${count} files, skipped ${skipCount} files`);
|
|
149
|
-
};
|
|
150
|
-
this.handleFileRefsDeleted = async (fileRefs) => {
|
|
151
|
-
const tx = this.storage.createTransaction(['files'], { mode: 'readwrite' });
|
|
152
|
-
await Promise.all(fileRefs.map(async (fileRef) => {
|
|
153
|
-
try {
|
|
154
|
-
await this.storage.markPendingDelete(fileRef.id, { transaction: tx });
|
|
155
|
-
}
|
|
156
|
-
catch (err) {
|
|
157
|
-
this.context.log('error', 'Failed to mark file for deletion', err);
|
|
158
|
-
}
|
|
159
|
-
}));
|
|
160
|
-
this.context.log('info', `Marked ${fileRefs.length} files as pending delete`);
|
|
161
|
-
};
|
|
162
|
-
this.storage = new FileStorage_js_1.FileStorage(db);
|
|
163
|
-
this.sync = sync;
|
|
164
|
-
this.context = context;
|
|
165
|
-
this.meta = meta;
|
|
166
|
-
this.config = Object.assign({ canCleanupDeletedFile: defaultCanCleanup }, config);
|
|
167
|
-
this.sync.subscribe('onlineChange', this.onOnlineChange);
|
|
168
|
-
this.meta.subscribe('filesDeleted', this.handleFileRefsDeleted);
|
|
169
|
-
// check on startup to see if files can be cleaned up
|
|
170
|
-
this.tryCleanupDeletedFiles();
|
|
171
|
-
}
|
|
172
|
-
}
|
|
173
|
-
exports.FileManager = FileManager;
|
|
174
|
-
//# sourceMappingURL=FileManager.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"FileManager.js","sourceRoot":"","sources":["../../../src/files/FileManager.ts"],"names":[],"mappings":"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"}
|