@verdant-web/store 4.0.0 → 4.1.0-alpha.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -650
- package/dist/bundle/index.js +11 -11
- package/dist/bundle/index.js.map +4 -4
- package/dist/esm/__tests__/fixtures/testStorage.d.ts +1 -2
- package/dist/esm/__tests__/fixtures/testStorage.js +3 -5
- package/dist/esm/__tests__/fixtures/testStorage.js.map +1 -1
- package/dist/esm/client/Client.d.ts +6 -2
- package/dist/esm/client/Client.js +18 -6
- package/dist/esm/client/Client.js.map +1 -1
- package/dist/esm/client/ClientDescriptor.d.ts +7 -5
- package/dist/esm/client/ClientDescriptor.js +18 -4
- package/dist/esm/client/ClientDescriptor.js.map +1 -1
- package/dist/esm/context/ShutdownHandler.d.ts +8 -0
- package/dist/esm/context/ShutdownHandler.js +24 -0
- package/dist/esm/context/ShutdownHandler.js.map +1 -0
- package/dist/esm/context/context.d.ts +15 -4
- package/dist/esm/entities/EntityStore.js +6 -3
- package/dist/esm/entities/EntityStore.js.map +1 -1
- package/dist/esm/files/EntityFile.d.ts +1 -0
- package/dist/esm/files/EntityFile.js +16 -11
- package/dist/esm/files/EntityFile.js.map +1 -1
- package/dist/esm/files/FileManager.d.ts +1 -3
- package/dist/esm/files/FileManager.js +12 -10
- package/dist/esm/files/FileManager.js.map +1 -1
- package/dist/esm/index.d.ts +4 -5
- package/dist/esm/index.js +2 -3
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/internal.d.ts +6 -0
- package/dist/esm/internal.js +5 -0
- package/dist/esm/internal.js.map +1 -0
- package/dist/esm/persistence/MessageCreator.d.ts +3 -1
- package/dist/esm/persistence/MessageCreator.js +58 -55
- package/dist/esm/persistence/MessageCreator.js.map +1 -1
- package/dist/esm/persistence/PersistenceFiles.d.ts +8 -21
- package/dist/esm/persistence/PersistenceFiles.js +44 -30
- package/dist/esm/persistence/PersistenceFiles.js.map +1 -1
- package/dist/esm/persistence/PersistenceMetadata.d.ts +12 -11
- package/dist/esm/persistence/PersistenceMetadata.js +201 -137
- package/dist/esm/persistence/PersistenceMetadata.js.map +1 -1
- package/dist/esm/persistence/PersistenceQueries.d.ts +10 -11
- package/dist/esm/persistence/PersistenceQueries.js +33 -5
- package/dist/esm/persistence/PersistenceQueries.js.map +1 -1
- package/dist/esm/persistence/PersistenceRebaser.d.ts +5 -9
- package/dist/esm/persistence/PersistenceRebaser.js +63 -47
- package/dist/esm/persistence/PersistenceRebaser.js.map +1 -1
- package/dist/esm/persistence/idb/IdbService.d.ts +0 -1
- package/dist/esm/persistence/idb/IdbService.js +28 -16
- package/dist/esm/persistence/idb/IdbService.js.map +1 -1
- package/dist/esm/persistence/idb/files/IdbPersistenceFileDb.d.ts +11 -31
- package/dist/esm/persistence/idb/files/IdbPersistenceFileDb.js +31 -36
- package/dist/esm/persistence/idb/files/IdbPersistenceFileDb.js.map +1 -1
- package/dist/esm/persistence/idb/idbPersistence.d.ts +17 -9
- package/dist/esm/persistence/idb/idbPersistence.js +80 -39
- package/dist/esm/persistence/idb/idbPersistence.js.map +1 -1
- package/dist/esm/persistence/idb/metadata/IdbMetadataDb.d.ts +7 -10
- package/dist/esm/persistence/idb/metadata/IdbMetadataDb.js +45 -71
- package/dist/esm/persistence/idb/metadata/IdbMetadataDb.js.map +1 -1
- package/dist/esm/persistence/idb/metadata/openMetadataDatabase.d.ts +1 -12
- package/dist/esm/persistence/idb/metadata/openMetadataDatabase.js +3 -56
- package/dist/esm/persistence/idb/metadata/openMetadataDatabase.js.map +1 -1
- package/dist/esm/persistence/idb/queries/{IdbQueryDb.d.ts → IdbDocumentDb.d.ts} +7 -13
- package/dist/esm/persistence/idb/queries/{IdbQueryDb.js → IdbDocumentDb.js} +15 -32
- package/dist/esm/persistence/idb/queries/IdbDocumentDb.js.map +1 -0
- package/dist/esm/persistence/idb/queries/migration/db.d.ts +3 -5
- package/dist/esm/persistence/idb/queries/migration/db.js +13 -28
- package/dist/esm/persistence/idb/queries/migration/db.js.map +1 -1
- package/dist/esm/persistence/idb/util.d.ts +8 -4
- package/dist/esm/persistence/idb/util.js +64 -21
- package/dist/esm/persistence/idb/util.js.map +1 -1
- package/dist/esm/persistence/interfaces.d.ts +68 -75
- package/dist/esm/persistence/{idb/queries/migration → migration}/engine.d.ts +4 -7
- package/dist/esm/persistence/{idb/queries/migration → migration}/engine.js +18 -10
- package/dist/esm/persistence/migration/engine.js.map +1 -0
- package/dist/esm/persistence/migration/finalize.d.ts +9 -0
- package/dist/esm/persistence/migration/finalize.js +75 -0
- package/dist/esm/persistence/migration/finalize.js.map +1 -0
- package/dist/esm/persistence/migration/migrate.d.ts +12 -0
- package/dist/esm/persistence/migration/migrate.js +89 -0
- package/dist/esm/persistence/migration/migrate.js.map +1 -0
- package/dist/esm/persistence/migration/paths.js.map +1 -0
- package/dist/esm/persistence/migration/paths.test.js.map +1 -0
- package/dist/esm/persistence/migration/types.d.ts +3 -0
- package/dist/esm/persistence/migration/types.js.map +1 -0
- package/dist/esm/persistence/persistence.js +25 -15
- package/dist/esm/persistence/persistence.js.map +1 -1
- package/dist/esm/queries/FindAllQuery.js +1 -1
- package/dist/esm/queries/FindAllQuery.js.map +1 -1
- package/dist/esm/queries/FindInfiniteQuery.js +2 -2
- package/dist/esm/queries/FindInfiniteQuery.js.map +1 -1
- package/dist/esm/queries/FindOneQuery.js +1 -1
- package/dist/esm/queries/FindOneQuery.js.map +1 -1
- package/dist/esm/queries/FindPageQuery.js +1 -1
- package/dist/esm/queries/FindPageQuery.js.map +1 -1
- package/dist/esm/sync/FileSync.js +3 -3
- package/dist/esm/sync/FileSync.js.map +1 -1
- package/dist/esm/sync/PushPullSync.d.ts +2 -3
- package/dist/esm/sync/PushPullSync.js +4 -2
- package/dist/esm/sync/PushPullSync.js.map +1 -1
- package/dist/esm/sync/ServerSyncEndpointProvider.d.ts +3 -7
- package/dist/esm/sync/ServerSyncEndpointProvider.js +3 -2
- package/dist/esm/sync/ServerSyncEndpointProvider.js.map +1 -1
- package/dist/esm/sync/Sync.d.ts +6 -1
- package/dist/esm/sync/Sync.js +12 -4
- package/dist/esm/sync/Sync.js.map +1 -1
- package/dist/esm/sync/WebSocketSync.js +10 -4
- package/dist/esm/sync/WebSocketSync.js.map +1 -1
- package/dist/esm/utils/wip.js +1 -1
- package/package.json +6 -2
- package/src/__tests__/fixtures/testStorage.ts +6 -6
- package/src/client/Client.ts +26 -8
- package/src/client/ClientDescriptor.ts +27 -9
- package/src/context/ShutdownHandler.ts +26 -0
- package/src/context/context.ts +16 -4
- package/src/entities/EntityStore.ts +9 -3
- package/src/files/EntityFile.ts +11 -6
- package/src/files/FileManager.ts +13 -10
- package/src/index.ts +8 -9
- package/src/internal.ts +27 -0
- package/src/persistence/MessageCreator.ts +79 -73
- package/src/persistence/PersistenceFiles.ts +57 -31
- package/src/persistence/PersistenceMetadata.ts +287 -195
- package/src/persistence/PersistenceQueries.ts +45 -9
- package/src/persistence/PersistenceRebaser.ts +105 -70
- package/src/persistence/idb/IdbService.ts +40 -22
- package/src/persistence/idb/files/IdbPersistenceFileDb.ts +30 -62
- package/src/persistence/idb/idbPersistence.ts +123 -47
- package/src/persistence/idb/metadata/IdbMetadataDb.ts +75 -97
- package/src/persistence/idb/metadata/openMetadataDatabase.ts +2 -96
- package/src/persistence/idb/queries/{IdbQueryDb.ts → IdbDocumentDb.ts} +17 -57
- package/src/persistence/idb/queries/migration/db.ts +20 -39
- package/src/persistence/idb/util.ts +84 -21
- package/src/persistence/interfaces.ts +89 -90
- package/src/persistence/{idb/queries/migration → migration}/engine.ts +30 -15
- package/src/persistence/migration/finalize.ts +126 -0
- package/src/persistence/migration/migrate.ts +169 -0
- package/src/persistence/migration/types.ts +4 -0
- package/src/persistence/persistence.ts +37 -14
- package/src/queries/FindAllQuery.ts +1 -1
- package/src/queries/FindInfiniteQuery.ts +2 -2
- package/src/queries/FindOneQuery.ts +1 -1
- package/src/queries/FindPageQuery.ts +1 -1
- package/src/sync/FileSync.ts +21 -15
- package/src/sync/PushPullSync.ts +3 -4
- package/src/sync/ServerSyncEndpointProvider.ts +6 -8
- package/src/sync/Sync.ts +20 -7
- package/src/sync/WebSocketSync.ts +10 -4
- package/src/utils/wip.ts +1 -1
- package/dist/esm/client/constants.d.ts +0 -1
- package/dist/esm/client/constants.js +0 -2
- package/dist/esm/client/constants.js.map +0 -1
- package/dist/esm/persistence/idb/queries/IdbQueryDb.js.map +0 -1
- package/dist/esm/persistence/idb/queries/migration/engine.js.map +0 -1
- package/dist/esm/persistence/idb/queries/migration/migrations.d.ts +0 -15
- package/dist/esm/persistence/idb/queries/migration/migrations.js +0 -243
- package/dist/esm/persistence/idb/queries/migration/migrations.js.map +0 -1
- package/dist/esm/persistence/idb/queries/migration/openQueryDatabase.d.ts +0 -8
- package/dist/esm/persistence/idb/queries/migration/openQueryDatabase.js +0 -24
- package/dist/esm/persistence/idb/queries/migration/openQueryDatabase.js.map +0 -1
- package/dist/esm/persistence/idb/queries/migration/paths.js.map +0 -1
- package/dist/esm/persistence/idb/queries/migration/paths.test.js.map +0 -1
- package/dist/esm/persistence/idb/queries/migration/types.d.ts +0 -6
- package/dist/esm/persistence/idb/queries/migration/types.js.map +0 -1
- package/src/client/constants.ts +0 -1
- package/src/persistence/idb/queries/migration/migrations.ts +0 -345
- package/src/persistence/idb/queries/migration/openQueryDatabase.ts +0 -54
- package/src/persistence/idb/queries/migration/types.ts +0 -8
- /package/dist/esm/persistence/{idb/queries/migration → migration}/paths.d.ts +0 -0
- /package/dist/esm/persistence/{idb/queries/migration → migration}/paths.js +0 -0
- /package/dist/esm/persistence/{idb/queries/migration → migration}/paths.test.d.ts +0 -0
- /package/dist/esm/persistence/{idb/queries/migration → migration}/paths.test.js +0 -0
- /package/dist/esm/persistence/{idb/queries/migration → migration}/types.js +0 -0
- /package/src/persistence/{idb/queries/migration → migration}/paths.test.ts +0 -0
- /package/src/persistence/{idb/queries/migration → migration}/paths.ts +0 -0
|
@@ -2,17 +2,21 @@ import { EntityFile, MARK_FAILED, UPDATE } from './EntityFile.js';
|
|
|
2
2
|
export class FileManager {
|
|
3
3
|
constructor({ sync, context }) {
|
|
4
4
|
this.cache = new Map();
|
|
5
|
-
this.add = async (file
|
|
5
|
+
this.add = async (file) => {
|
|
6
6
|
// immediately cache the file
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
entityFile
|
|
7
|
+
let entityFile = this.cache.get(file.id);
|
|
8
|
+
if (!entityFile) {
|
|
9
|
+
entityFile = new EntityFile(file.id, { ctx: this.context });
|
|
10
10
|
this.cache.set(file.id, entityFile);
|
|
11
11
|
}
|
|
12
|
-
|
|
13
|
-
|
|
12
|
+
if (!file.remote) {
|
|
13
|
+
// immediately update local files.
|
|
14
|
+
entityFile[UPDATE](file);
|
|
14
15
|
}
|
|
15
|
-
|
|
16
|
+
// this will download any original remote file and trigger a re-upload to the
|
|
17
|
+
// new file's identity, in addition to storing it on disk
|
|
18
|
+
const processedFile = await this.context.files.add(file);
|
|
19
|
+
entityFile[UPDATE](processedFile);
|
|
16
20
|
};
|
|
17
21
|
/**
|
|
18
22
|
* Immediately returns an EntityFile to use, then either loads
|
|
@@ -49,9 +53,7 @@ export class FileManager {
|
|
|
49
53
|
const result = await this.sync.getFile(file.id);
|
|
50
54
|
if (result.success) {
|
|
51
55
|
file[UPDATE](result.data);
|
|
52
|
-
await this.context.files.add(result.data
|
|
53
|
-
downloadRemote: file.downloadRemote,
|
|
54
|
-
});
|
|
56
|
+
await this.context.files.add(result.data);
|
|
55
57
|
}
|
|
56
58
|
else {
|
|
57
59
|
this.context.log('error', 'Failed to load file', result);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FileManager.js","sourceRoot":"","sources":["../../../src/files/FileManager.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAElE,MAAM,OAAO,WAAW;IAMvB,YAAY,EAAE,IAAI,EAAE,OAAO,EAAoC;QAFvD,UAAK,GAAG,IAAI,GAAG,EAAsB,CAAC;QAO9C,QAAG,GAAG,KAAK,EAAE,IAAc,EAAE,
|
|
1
|
+
{"version":3,"file":"FileManager.js","sourceRoot":"","sources":["../../../src/files/FileManager.ts"],"names":[],"mappings":"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"}
|
package/dist/esm/index.d.ts
CHANGED
|
@@ -12,11 +12,8 @@ export type { ObjectEntity, ListEntity, EntityShape, AccessibleEntityProperty, A
|
|
|
12
12
|
export { ServerSync } from './sync/Sync.js';
|
|
13
13
|
export type { SyncTransportMode } from './sync/Sync.js';
|
|
14
14
|
export { EntityFile, type EntityFileSnapshot } from './files/EntityFile.js';
|
|
15
|
-
export {
|
|
16
|
-
|
|
17
|
-
collection, schema, createDefaultMigration, migrate, createMigration, } from '@verdant-web/common';
|
|
18
|
-
export type { StorageDocument, StorageSchema, StorageCollectionSchema, StorageAnyFieldSchema, StorageArrayFieldSchema, StorageObjectFieldSchema, StorageBooleanFieldSchema, StorageFieldSchema, StorageFileFieldSchema, StorageMapFieldSchema, StorageNumberFieldSchema, StorageStringFieldSchema, StorageFieldsSchema, IndexValueTag, Migration, VerdantError, VerdantErrorCode, } from '@verdant-web/common';
|
|
19
|
-
export type { UserInfo } from '@verdant-web/common';
|
|
15
|
+
export { schema, createMigration } from '@verdant-web/common';
|
|
16
|
+
export type { StorageDocument, StorageSchema, StorageCollectionSchema, StorageAnyFieldSchema, StorageArrayFieldSchema, StorageObjectFieldSchema, StorageBooleanFieldSchema, StorageFieldSchema, StorageFileFieldSchema, StorageMapFieldSchema, StorageNumberFieldSchema, StorageStringFieldSchema, StorageFieldsSchema, IndexValueTag, Migration, VerdantError, VerdantErrorCode, ObjectIdentifier, CollectionFilter, FileData, DocumentBaseline, UserInfo, } from '@verdant-web/common';
|
|
20
17
|
export type { Query } from './queries/types.js';
|
|
21
18
|
export type { QueryStatus } from './queries/BaseQuery.js';
|
|
22
19
|
export type { CollectionQueries } from './queries/CollectionQueries.js';
|
|
@@ -24,3 +21,5 @@ export * from './utils/id.js';
|
|
|
24
21
|
export { UndoHistory } from './UndoHistory.js';
|
|
25
22
|
export * from './authorization.js';
|
|
26
23
|
export * from './sync/cliSync.js';
|
|
24
|
+
export type * from './persistence/interfaces.js';
|
|
25
|
+
export { IdbPersistence } from './persistence/idb/idbPersistence.js';
|
package/dist/esm/index.js
CHANGED
|
@@ -8,11 +8,10 @@ export { Client as Storage };
|
|
|
8
8
|
export { Entity } from './entities/Entity.js';
|
|
9
9
|
export { ServerSync } from './sync/Sync.js';
|
|
10
10
|
export { EntityFile } from './files/EntityFile.js';
|
|
11
|
-
export {
|
|
12
|
-
/** @deprecated - use schema.collection */
|
|
13
|
-
collection, schema, createDefaultMigration, migrate, createMigration, } from '@verdant-web/common';
|
|
11
|
+
export { schema, createMigration } from '@verdant-web/common';
|
|
14
12
|
export * from './utils/id.js';
|
|
15
13
|
export { UndoHistory } from './UndoHistory.js';
|
|
16
14
|
export * from './authorization.js';
|
|
17
15
|
export * from './sync/cliSync.js';
|
|
16
|
+
export { IdbPersistence } from './persistence/idb/idbPersistence.js';
|
|
18
17
|
//# sourceMappingURL=index.js.map
|
package/dist/esm/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACN,gBAAgB,GAEhB,MAAM,8BAA8B,CAAC;AACtC,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAE5C,OAAO,EAAE,gBAAgB,EAAE,CAAC;AAC5B,OAAO,EAAE,MAAM,EAAE,CAAC;AAClB,kBAAkB;AAClB,OAAO,EAAE,gBAAgB,IAAI,iBAAiB,EAAE,CAAC;AACjD,OAAO,EAAE,MAAM,IAAI,OAAO,EAAE,CAAC;AAG7B,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAU9C,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAE5C,OAAO,EAAE,UAAU,EAA2B,MAAM,uBAAuB,CAAC;AAC5E,OAAO
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACN,gBAAgB,GAEhB,MAAM,8BAA8B,CAAC;AACtC,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAE5C,OAAO,EAAE,gBAAgB,EAAE,CAAC;AAC5B,OAAO,EAAE,MAAM,EAAE,CAAC;AAClB,kBAAkB;AAClB,OAAO,EAAE,gBAAgB,IAAI,iBAAiB,EAAE,CAAC;AACjD,OAAO,EAAE,MAAM,IAAI,OAAO,EAAE,CAAC;AAG7B,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAU9C,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAE5C,OAAO,EAAE,UAAU,EAA2B,MAAM,uBAAuB,CAAC;AAC5E,OAAO,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AA4B9D,cAAc,eAAe,CAAC;AAC9B,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,cAAc,oBAAoB,CAAC;AACnC,cAAc,mBAAmB,CAAC;AAElC,OAAO,EAAE,cAAc,EAAE,MAAM,qCAAqC,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export type { Context, InitialContext } from './context/context.js';
|
|
2
|
+
export { decomposeOid, createOid, generateId, isRangeIndexFilter, isCompoundIndexFilter, isDirectSynthetic, isMatchIndexFilter, isSortIndexFilter, isStartsWithIndexFilter, isMultiValueIndex, assert, createCompoundIndexValue, createLowerBoundIndexValue, createUpperBoundIndexValue, getIndexValues, } from '@verdant-web/common';
|
|
3
|
+
export type { CollectionCompoundIndexFilter, MatchCollectionIndexFilter, RangeCollectionIndexFilter, CollectionIndexFilter, } from '@verdant-web/common';
|
|
4
|
+
export * from './persistence/migration/paths.js';
|
|
5
|
+
export * from './persistence/migration/types.js';
|
|
6
|
+
export { Disposable } from './utils/Disposable.js';
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export { decomposeOid, createOid, generateId, isRangeIndexFilter, isCompoundIndexFilter, isDirectSynthetic, isMatchIndexFilter, isSortIndexFilter, isStartsWithIndexFilter, isMultiValueIndex, assert, createCompoundIndexValue, createLowerBoundIndexValue, createUpperBoundIndexValue, getIndexValues, } from '@verdant-web/common';
|
|
2
|
+
export * from './persistence/migration/paths.js';
|
|
3
|
+
export * from './persistence/migration/types.js';
|
|
4
|
+
export { Disposable } from './utils/Disposable.js';
|
|
5
|
+
//# sourceMappingURL=internal.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"internal.js","sourceRoot":"","sources":["../../src/internal.ts"],"names":[],"mappings":"AACA,OAAO,EACN,YAAY,EACZ,SAAS,EACT,UAAU,EACV,kBAAkB,EAClB,qBAAqB,EACrB,iBAAiB,EACjB,kBAAkB,EAClB,iBAAiB,EACjB,uBAAuB,EACvB,iBAAiB,EACjB,MAAM,EACN,wBAAwB,EACxB,0BAA0B,EAC1B,0BAA0B,EAC1B,cAAc,GACd,MAAM,qBAAqB,CAAC;AAO7B,cAAc,kCAAkC,CAAC;AACjD,cAAc,kCAAkC,CAAC;AACjD,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC"}
|
|
@@ -1,10 +1,12 @@
|
|
|
1
1
|
import { AckMessage, HeartbeatMessage, OperationMessage, PresenceUpdateMessage, SyncMessage, VerdantInternalPresence } from '@verdant-web/common';
|
|
2
2
|
import { Context } from '../context/context.js';
|
|
3
3
|
import { PersistenceMetadataDb } from './interfaces.js';
|
|
4
|
+
import type { PersistenceMetadata } from './PersistenceMetadata.js';
|
|
4
5
|
export declare class MessageCreator {
|
|
5
6
|
private db;
|
|
7
|
+
private meta;
|
|
6
8
|
private ctx;
|
|
7
|
-
constructor(db: PersistenceMetadataDb, ctx: Pick<Context, 'time' | 'schema' | 'log'>);
|
|
9
|
+
constructor(db: PersistenceMetadataDb, meta: PersistenceMetadata, ctx: Pick<Context, 'time' | 'schema' | 'log'>);
|
|
8
10
|
createOperation: (init: Pick<OperationMessage, 'operations'> & {
|
|
9
11
|
timestamp?: string;
|
|
10
12
|
}) => Promise<OperationMessage>;
|
|
@@ -1,10 +1,12 @@
|
|
|
1
1
|
import { getOidRoot, pickValidOperationKeys, } from '@verdant-web/common';
|
|
2
2
|
export class MessageCreator {
|
|
3
|
-
constructor(db, ctx) {
|
|
3
|
+
constructor(db, meta, ctx) {
|
|
4
4
|
this.db = db;
|
|
5
|
+
this.meta = meta;
|
|
5
6
|
this.ctx = ctx;
|
|
6
7
|
this.createOperation = async (init) => {
|
|
7
|
-
const localInfo = await this.
|
|
8
|
+
const localInfo = await this.meta.getLocalReplica();
|
|
9
|
+
this.ctx.log('debug', 'Creating operation message', init.operations.length);
|
|
8
10
|
return {
|
|
9
11
|
type: 'op',
|
|
10
12
|
timestamp: this.ctx.time.now,
|
|
@@ -16,67 +18,68 @@ export class MessageCreator {
|
|
|
16
18
|
* @param since - override local understanding of last sync time
|
|
17
19
|
*/
|
|
18
20
|
this.createSyncStep1 = async (since) => {
|
|
19
|
-
const localReplicaInfo = await this.
|
|
21
|
+
const localReplicaInfo = await this.meta.getLocalReplica();
|
|
20
22
|
const provideChangesSince = since === null ? null : localReplicaInfo.lastSyncedLogicalTime;
|
|
21
23
|
// collect all of our operations that are newer than the server's last operation
|
|
22
24
|
// if server replica isn't stored, we're syncing for the first time.
|
|
23
25
|
const operations = [];
|
|
24
26
|
const affectedDocs = new Set();
|
|
25
|
-
|
|
27
|
+
return this.db.transaction({
|
|
26
28
|
mode: 'readwrite',
|
|
27
29
|
storeNames: ['operations', 'baselines'],
|
|
30
|
+
}, async (tx) => {
|
|
31
|
+
// FIXME: this branch gives bad vibes. should we always
|
|
32
|
+
// send all operations from other replicas too? is there
|
|
33
|
+
// ever a case where we have a "since" timestamp and there
|
|
34
|
+
// are foreign ops that match it?
|
|
35
|
+
if (provideChangesSince) {
|
|
36
|
+
this.ctx.log('debug', 'Syncing local operations since', provideChangesSince);
|
|
37
|
+
await this.db.iterateLocalOperations((patch) => {
|
|
38
|
+
operations.push(pickValidOperationKeys(patch));
|
|
39
|
+
affectedDocs.add(getOidRoot(patch.oid));
|
|
40
|
+
}, {
|
|
41
|
+
after: provideChangesSince,
|
|
42
|
+
// block on writes to prevent race conditions
|
|
43
|
+
transaction: tx,
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
else {
|
|
47
|
+
this.ctx.log('debug', 'Syncing all operations');
|
|
48
|
+
// if providing the whole history, don't limit to only local
|
|
49
|
+
// operations
|
|
50
|
+
await this.db.iterateAllOperations((patch) => {
|
|
51
|
+
operations.push(pickValidOperationKeys(patch));
|
|
52
|
+
affectedDocs.add(getOidRoot(patch.oid));
|
|
53
|
+
}, {
|
|
54
|
+
transaction: tx,
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
// we only need to send baselines if we've never synced before
|
|
58
|
+
let baselines = [];
|
|
59
|
+
if (!provideChangesSince) {
|
|
60
|
+
await this.db.iterateAllBaselines((b) => {
|
|
61
|
+
baselines.push(b);
|
|
62
|
+
}, {
|
|
63
|
+
transaction: tx,
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
if (operations.length > 0) {
|
|
67
|
+
this.ctx.log('debug', `Syncing ${operations.length} operations since ${provideChangesSince}`);
|
|
68
|
+
}
|
|
69
|
+
return {
|
|
70
|
+
type: 'sync',
|
|
71
|
+
schemaVersion: this.ctx.schema.version,
|
|
72
|
+
timestamp: this.ctx.time.now,
|
|
73
|
+
replicaId: localReplicaInfo.id,
|
|
74
|
+
resyncAll: !localReplicaInfo.lastSyncedLogicalTime,
|
|
75
|
+
operations,
|
|
76
|
+
baselines,
|
|
77
|
+
since: provideChangesSince,
|
|
78
|
+
};
|
|
28
79
|
});
|
|
29
|
-
// FIXME: this branch gives bad vibes. should we always
|
|
30
|
-
// send all operations from other replicas too? is there
|
|
31
|
-
// ever a case where we have a "since" timestamp and there
|
|
32
|
-
// are foreign ops that match it?
|
|
33
|
-
if (provideChangesSince) {
|
|
34
|
-
this.ctx.log('debug', 'Syncing local operations since', provideChangesSince);
|
|
35
|
-
await this.db.iterateLocalOperations((patch) => {
|
|
36
|
-
operations.push(pickValidOperationKeys(patch));
|
|
37
|
-
affectedDocs.add(getOidRoot(patch.oid));
|
|
38
|
-
}, {
|
|
39
|
-
after: provideChangesSince,
|
|
40
|
-
// block on writes to prevent race conditions
|
|
41
|
-
transaction: tx,
|
|
42
|
-
});
|
|
43
|
-
}
|
|
44
|
-
else {
|
|
45
|
-
this.ctx.log('debug', 'Syncing all operations');
|
|
46
|
-
// if providing the whole history, don't limit to only local
|
|
47
|
-
// operations
|
|
48
|
-
await this.db.iterateAllOperations((patch) => {
|
|
49
|
-
operations.push(pickValidOperationKeys(patch));
|
|
50
|
-
affectedDocs.add(getOidRoot(patch.oid));
|
|
51
|
-
}, {
|
|
52
|
-
transaction: tx,
|
|
53
|
-
});
|
|
54
|
-
}
|
|
55
|
-
// we only need to send baselines if we've never synced before
|
|
56
|
-
let baselines = [];
|
|
57
|
-
if (!provideChangesSince) {
|
|
58
|
-
await this.db.iterateAllBaselines((b) => {
|
|
59
|
-
baselines.push(b);
|
|
60
|
-
}, {
|
|
61
|
-
transaction: tx,
|
|
62
|
-
});
|
|
63
|
-
}
|
|
64
|
-
if (operations.length > 0) {
|
|
65
|
-
this.ctx.log('debug', `Syncing ${operations.length} operations since ${provideChangesSince}`);
|
|
66
|
-
}
|
|
67
|
-
return {
|
|
68
|
-
type: 'sync',
|
|
69
|
-
schemaVersion: this.ctx.schema.version,
|
|
70
|
-
timestamp: this.ctx.time.now,
|
|
71
|
-
replicaId: localReplicaInfo.id,
|
|
72
|
-
resyncAll: !localReplicaInfo.lastSyncedLogicalTime,
|
|
73
|
-
operations,
|
|
74
|
-
baselines,
|
|
75
|
-
since: provideChangesSince,
|
|
76
|
-
};
|
|
77
80
|
};
|
|
78
81
|
this.createPresenceUpdate = async (data) => {
|
|
79
|
-
const localReplicaInfo = await this.
|
|
82
|
+
const localReplicaInfo = await this.meta.getLocalReplica();
|
|
80
83
|
return {
|
|
81
84
|
type: 'presence-update',
|
|
82
85
|
presence: data.presence,
|
|
@@ -85,7 +88,7 @@ export class MessageCreator {
|
|
|
85
88
|
};
|
|
86
89
|
};
|
|
87
90
|
this.createHeartbeat = async () => {
|
|
88
|
-
const localReplicaInfo = await this.
|
|
91
|
+
const localReplicaInfo = await this.meta.getLocalReplica();
|
|
89
92
|
return {
|
|
90
93
|
type: 'heartbeat',
|
|
91
94
|
timestamp: this.ctx.time.now,
|
|
@@ -93,7 +96,7 @@ export class MessageCreator {
|
|
|
93
96
|
};
|
|
94
97
|
};
|
|
95
98
|
this.createAck = async (nonce) => {
|
|
96
|
-
const localReplicaInfo = await this.
|
|
99
|
+
const localReplicaInfo = await this.meta.getLocalReplica();
|
|
97
100
|
return {
|
|
98
101
|
type: 'ack',
|
|
99
102
|
timestamp: this.ctx.time.now,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MessageCreator.js","sourceRoot":"","sources":["../../../src/persistence/MessageCreator.ts"],"names":[],"mappings":"AAAA,OAAO,EAGN,UAAU,EAKV,sBAAsB,GAItB,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"MessageCreator.js","sourceRoot":"","sources":["../../../src/persistence/MessageCreator.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,31 +1,18 @@
|
|
|
1
1
|
import { FileData } from '@verdant-web/common';
|
|
2
2
|
import { Context } from '../context/context.js';
|
|
3
3
|
import { PersistedFileData, PersistenceFileDb } from './interfaces.js';
|
|
4
|
-
|
|
5
|
-
export declare class PersistenceFiles extends Disposable {
|
|
4
|
+
export declare class PersistenceFiles {
|
|
6
5
|
private db;
|
|
7
6
|
private context;
|
|
8
7
|
constructor(db: PersistenceFileDb, context: Omit<Context, 'queries'>);
|
|
9
8
|
private get config();
|
|
10
9
|
onServerReset: (since: string | null) => Promise<void>;
|
|
11
|
-
add: (file: FileData
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
get: (fileId: string, options?: {
|
|
18
|
-
transaction?: unknown;
|
|
19
|
-
} | undefined) => Promise<PersistedFileData | null>;
|
|
20
|
-
getAll: (options?: {
|
|
21
|
-
transaction?: unknown;
|
|
22
|
-
} | undefined) => Promise<PersistedFileData[]>;
|
|
23
|
-
listUnsynced: (options?: {
|
|
24
|
-
transaction?: unknown;
|
|
25
|
-
} | undefined) => Promise<PersistedFileData[]>;
|
|
26
|
-
iterateOverPendingDelete: (iterator: (file: PersistedFileData, store: IDBObjectStore) => void, options?: {
|
|
27
|
-
transaction?: IDBTransaction | undefined;
|
|
28
|
-
} | undefined) => Promise<void>;
|
|
10
|
+
add: (file: FileData) => Promise<FileData>;
|
|
11
|
+
onUploaded: (fileId: string) => Promise<void>;
|
|
12
|
+
get: (fileId: string) => Promise<PersistedFileData | null>;
|
|
13
|
+
getAll: () => Promise<PersistedFileData[]>;
|
|
14
|
+
listUnsynced: () => Promise<PersistedFileData[]>;
|
|
15
|
+
iterateOverPendingDelete: (iterator: (file: PersistedFileData) => void) => Promise<void>;
|
|
29
16
|
stats: () => Promise<{
|
|
30
17
|
size: {
|
|
31
18
|
count: number;
|
|
@@ -42,7 +29,7 @@ export declare class PersistenceFiles extends Disposable {
|
|
|
42
29
|
files: File[];
|
|
43
30
|
}) => Promise<void>;
|
|
44
31
|
private parseFileExportname;
|
|
45
|
-
|
|
32
|
+
private loadFileContents;
|
|
46
33
|
cleanupDeletedFiles: () => Promise<void>;
|
|
47
34
|
private onFileRefsDeleted;
|
|
48
35
|
}
|
|
@@ -1,11 +1,9 @@
|
|
|
1
|
-
|
|
2
|
-
export class PersistenceFiles extends Disposable {
|
|
1
|
+
export class PersistenceFiles {
|
|
3
2
|
constructor(db, context) {
|
|
4
|
-
super();
|
|
5
3
|
this.db = db;
|
|
6
4
|
this.context = context;
|
|
7
5
|
this.onServerReset = (since) => this.db.resetSyncedStatusSince(since);
|
|
8
|
-
this.add = async (file
|
|
6
|
+
this.add = async (file) => {
|
|
9
7
|
// this method accepts a FileData which refers to a remote
|
|
10
8
|
// file, as well as local files. in the case of a remote file,
|
|
11
9
|
// we actually re-download and upload the file again. this powers
|
|
@@ -13,21 +11,35 @@ export class PersistenceFiles extends Disposable {
|
|
|
13
11
|
// and re-upload to a new file ID. otherwise, when the cloned
|
|
14
12
|
// filedata was marked deleted, the original file would be deleted
|
|
15
13
|
// and the clone would refer to a missing file.
|
|
16
|
-
if (file.url && !file.file) {
|
|
14
|
+
if (file.url && !(file.localPath || file.file)) {
|
|
17
15
|
this.context.log('debug', 'Remote file added to an entity. This usually means an entity was cloned. Downloading remote file...', file.id);
|
|
18
|
-
const blob = await this.
|
|
16
|
+
const blob = await this.loadFileContents(file, 0, 3);
|
|
19
17
|
// convert blob to file with name and type
|
|
20
18
|
file.file = new File([blob], file.name, { type: file.type });
|
|
19
|
+
// remove the URL - it points to the original file's uploaded server version,
|
|
20
|
+
// but this file is a clone
|
|
21
|
+
delete file.url;
|
|
22
|
+
this.context.log('debug', 'Downloaded remote file', file.id, file.name, '. Cleared its remote URL.');
|
|
21
23
|
}
|
|
22
|
-
else if (!file.file) {
|
|
24
|
+
else if (!file.url && !file.file && !file.localPath) {
|
|
23
25
|
this.context.log('warn', 'File added without a file or URL. This file will not be available for use.', file.id);
|
|
24
26
|
}
|
|
27
|
+
// always reset remote status to false, this is a new file just created
|
|
28
|
+
// and must be uploaded, even if it is cloned from an uploaded file.
|
|
25
29
|
file.remote = false;
|
|
26
30
|
// fire event for processing immediately
|
|
27
31
|
this.context.internalEvents.emit('fileAdded', file);
|
|
28
32
|
// store in persistence db
|
|
29
|
-
await this.db.add(file
|
|
30
|
-
this.context.
|
|
33
|
+
await this.db.add(file);
|
|
34
|
+
this.context.globalEvents.emit('fileSaved', file);
|
|
35
|
+
this.context.log('debug', 'File added', file.id, file.name, file.type, file.file
|
|
36
|
+
? 'with binary file'
|
|
37
|
+
: file.url
|
|
38
|
+
? 'with url'
|
|
39
|
+
: file.localPath
|
|
40
|
+
? 'with local path'
|
|
41
|
+
: 'with no data');
|
|
42
|
+
return file;
|
|
31
43
|
};
|
|
32
44
|
this.onUploaded = this.db.markUploaded.bind(this.db);
|
|
33
45
|
this.get = this.db.get.bind(this.db);
|
|
@@ -38,20 +50,23 @@ export class PersistenceFiles extends Disposable {
|
|
|
38
50
|
this.getFileExportName = (originalFileName, id) => {
|
|
39
51
|
return `${id}___${originalFileName}`;
|
|
40
52
|
};
|
|
41
|
-
this.export = async (downloadRemote =
|
|
53
|
+
this.export = async (downloadRemote = true) => {
|
|
42
54
|
const storedFiles = await this.getAll();
|
|
43
55
|
if (downloadRemote) {
|
|
44
56
|
for (const storedFile of storedFiles) {
|
|
45
57
|
// if it doesn't have a buffer, we need to read one from the server
|
|
46
|
-
if (!storedFile.file && storedFile.url) {
|
|
58
|
+
if (!storedFile.file && (storedFile.url || storedFile.localPath)) {
|
|
47
59
|
try {
|
|
48
|
-
const blob = await this.
|
|
60
|
+
const blob = await this.loadFileContents(storedFile);
|
|
49
61
|
storedFile.file = blob;
|
|
50
62
|
}
|
|
51
63
|
catch (err) {
|
|
52
|
-
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);
|
|
64
|
+
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.", storedFile, err);
|
|
53
65
|
}
|
|
54
66
|
}
|
|
67
|
+
else if (!storedFile.file) {
|
|
68
|
+
this.context.log('warn', `File ${storedFile.id} has no file or URL. It will be missing in the export.`, storedFile);
|
|
69
|
+
}
|
|
55
70
|
}
|
|
56
71
|
}
|
|
57
72
|
// split files into data and files
|
|
@@ -97,47 +112,47 @@ export class PersistenceFiles extends Disposable {
|
|
|
97
112
|
const [id, originalFileName] = name.split('___');
|
|
98
113
|
return { id, originalFileName };
|
|
99
114
|
};
|
|
100
|
-
this.
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
if (!resp.ok) {
|
|
115
|
+
this.loadFileContents = async (file, retries = 0, maxRetries = 0) => {
|
|
116
|
+
try {
|
|
117
|
+
return await this.db.loadFileContents(file, this.context);
|
|
118
|
+
}
|
|
119
|
+
catch (err) {
|
|
106
120
|
if (retries < maxRetries) {
|
|
107
121
|
return new Promise((resolve, reject) => {
|
|
108
122
|
setTimeout(() => {
|
|
109
|
-
this.
|
|
123
|
+
this.loadFileContents(file, retries + 1, maxRetries).then(resolve, reject);
|
|
110
124
|
}, 1000);
|
|
111
125
|
});
|
|
112
126
|
}
|
|
113
127
|
else {
|
|
114
|
-
throw new Error(`Failed to download file after ${maxRetries} retries
|
|
128
|
+
throw new Error(`Failed to download file after ${maxRetries} retries`, {
|
|
129
|
+
cause: err,
|
|
130
|
+
});
|
|
115
131
|
}
|
|
116
132
|
}
|
|
117
|
-
return await resp.blob();
|
|
118
133
|
};
|
|
119
134
|
this.cleanupDeletedFiles = async () => {
|
|
120
135
|
let count = 0;
|
|
121
136
|
let skipCount = 0;
|
|
122
|
-
|
|
137
|
+
const deletable = [];
|
|
138
|
+
await this.iterateOverPendingDelete((fileData) => {
|
|
123
139
|
if (this.config.canCleanupDeletedFile(fileData)) {
|
|
124
140
|
count++;
|
|
125
|
-
|
|
141
|
+
deletable.push(fileData.id);
|
|
126
142
|
}
|
|
127
143
|
else {
|
|
128
144
|
skipCount++;
|
|
129
145
|
}
|
|
130
146
|
});
|
|
147
|
+
for (const id of deletable) {
|
|
148
|
+
await this.db.delete(id);
|
|
149
|
+
}
|
|
131
150
|
this.context.log('info', `Cleaned up ${count} files, skipped ${skipCount} files`);
|
|
132
151
|
};
|
|
133
152
|
this.onFileRefsDeleted = async (fileRefs) => {
|
|
134
|
-
const tx = this.db.transaction({
|
|
135
|
-
mode: 'readwrite',
|
|
136
|
-
storeNames: ['files'],
|
|
137
|
-
});
|
|
138
153
|
await Promise.all(fileRefs.map(async (fileRef) => {
|
|
139
154
|
try {
|
|
140
|
-
await this.db.markPendingDelete(fileRef.id
|
|
155
|
+
await this.db.markPendingDelete(fileRef.id);
|
|
141
156
|
}
|
|
142
157
|
catch (err) {
|
|
143
158
|
this.context.log('error', 'Failed to mark file for deletion', err);
|
|
@@ -146,7 +161,6 @@ export class PersistenceFiles extends Disposable {
|
|
|
146
161
|
this.context.log('info', `Marked ${fileRefs.length} files as pending delete`);
|
|
147
162
|
};
|
|
148
163
|
context.internalEvents.subscribe('filesDeleted', this.onFileRefsDeleted);
|
|
149
|
-
this.compose(this.db);
|
|
150
164
|
// on startup, try deleting old files.
|
|
151
165
|
this.cleanupDeletedFiles();
|
|
152
166
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PersistenceFiles.js","sourceRoot":"","sources":["../../../src/persistence/PersistenceFiles.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"PersistenceFiles.js","sourceRoot":"","sources":["../../../src/persistence/PersistenceFiles.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,9 +1,8 @@
|
|
|
1
1
|
import { ClientMessage, DocumentBaseline, EventSubscriber, ObjectIdentifier, Operation } from '@verdant-web/common';
|
|
2
|
-
import { ClientOperation, CommonQueryOptions, MetadataExport, PersistenceMetadataDb } from './interfaces.js';
|
|
2
|
+
import { AbstractTransaction, ClientOperation, CommonQueryOptions, LocalReplicaInfo, MetadataExport, PersistenceMetadataDb } from './interfaces.js';
|
|
3
3
|
import { InitialContext } from '../context/context.js';
|
|
4
4
|
import { MessageCreator } from './MessageCreator.js';
|
|
5
|
-
|
|
6
|
-
export declare class PersistenceMetadata extends Disposable {
|
|
5
|
+
export declare class PersistenceMetadata {
|
|
7
6
|
private db;
|
|
8
7
|
private ctx;
|
|
9
8
|
private rebaser;
|
|
@@ -38,20 +37,22 @@ export declare class PersistenceMetadata extends Disposable {
|
|
|
38
37
|
}) => Promise<void>;
|
|
39
38
|
updateLastSynced: (timestamp: string) => Promise<void>;
|
|
40
39
|
setGlobalAck: (ack: string) => Promise<void>;
|
|
41
|
-
|
|
42
|
-
|
|
40
|
+
private _cachedLocalReplica;
|
|
41
|
+
private _creatingLocalReplica;
|
|
42
|
+
getLocalReplica: (options?: CommonQueryOptions) => Promise<LocalReplicaInfo>;
|
|
43
|
+
updateLocalReplica: (data: Partial<LocalReplicaInfo>, opts?: {
|
|
44
|
+
transaction?: AbstractTransaction;
|
|
45
|
+
}) => Promise<void>;
|
|
46
|
+
iterateLocalOperations: (iterator: import("./interfaces.js").Iterator<ClientOperation>, opts?: (CommonQueryOptions<any> & {
|
|
43
47
|
before?: string | null | undefined;
|
|
44
48
|
after?: string | null | undefined;
|
|
45
49
|
}) | undefined) => Promise<void>;
|
|
46
|
-
iterateAllOperations: (iterator: import("./interfaces.js").Iterator<ClientOperation>, opts?: (CommonQueryOptions & {
|
|
50
|
+
iterateAllOperations: (iterator: import("./interfaces.js").Iterator<ClientOperation>, opts?: (CommonQueryOptions<any> & {
|
|
47
51
|
before?: string | null | undefined;
|
|
48
52
|
from?: string | null | undefined;
|
|
49
53
|
}) | undefined) => Promise<void>;
|
|
50
|
-
iterateAllBaselines: (iterator: import("./interfaces.js").Iterator<DocumentBaseline>, opts?: CommonQueryOptions | undefined) => Promise<void>;
|
|
51
|
-
reset: (
|
|
52
|
-
clearReplica?: boolean | undefined;
|
|
53
|
-
transaction?: unknown;
|
|
54
|
-
} | undefined) => Promise<void>;
|
|
54
|
+
iterateAllBaselines: (iterator: import("./interfaces.js").Iterator<DocumentBaseline>, opts?: CommonQueryOptions<any> | undefined) => Promise<void>;
|
|
55
|
+
reset: () => Promise<void>;
|
|
55
56
|
stats: () => Promise<{
|
|
56
57
|
operationsSize: {
|
|
57
58
|
count: number;
|