@verdant-web/store 3.8.0 → 3.8.2
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 +650 -21
- package/dist/bundle/index.js +12 -12
- package/dist/bundle/index.js.map +4 -4
- package/dist/esm/__tests__/{documents.test.js → entities.test.js} +30 -2
- package/dist/esm/__tests__/entities.test.js.map +1 -0
- package/dist/esm/__tests__/fixtures/testStorage.js +3 -1
- package/dist/esm/__tests__/fixtures/testStorage.js.map +1 -1
- package/dist/esm/client/Client.d.ts +3 -3
- package/dist/esm/client/Client.js +5 -5
- package/dist/esm/client/Client.js.map +1 -1
- package/dist/esm/client/ClientDescriptor.d.ts +1 -0
- package/dist/esm/client/ClientDescriptor.js +6 -3
- package/dist/esm/client/ClientDescriptor.js.map +1 -1
- package/dist/esm/context.d.ts +1 -0
- package/dist/esm/entities/Entity.d.ts +7 -3
- package/dist/esm/entities/Entity.js +11 -6
- package/dist/esm/entities/Entity.js.map +1 -1
- package/dist/esm/entities/Entity.test.js +1 -1
- package/dist/esm/entities/Entity.test.js.map +1 -1
- package/dist/esm/entities/EntityMetadata.d.ts +1 -0
- package/dist/esm/entities/EntityMetadata.js +1 -0
- package/dist/esm/entities/EntityMetadata.js.map +1 -1
- package/dist/esm/entities/EntityStore.d.ts +3 -3
- package/dist/esm/entities/EntityStore.js +6 -1
- package/dist/esm/entities/EntityStore.js.map +1 -1
- package/dist/esm/entities/entityFieldSubscriber.d.ts +5 -0
- package/dist/esm/entities/entityFieldSubscriber.js +19 -0
- package/dist/esm/entities/entityFieldSubscriber.js.map +1 -0
- package/dist/esm/files/EntityFile.d.ts +3 -0
- package/dist/esm/files/EntityFile.js +19 -8
- package/dist/esm/files/EntityFile.js.map +1 -1
- package/dist/esm/files/FileManager.js +6 -1
- package/dist/esm/files/FileManager.js.map +1 -1
- package/dist/esm/files/FileStorage.d.ts +2 -0
- package/dist/esm/files/FileStorage.js +12 -0
- package/dist/esm/files/FileStorage.js.map +1 -1
- package/dist/esm/idb.d.ts +6 -0
- package/dist/esm/idb.js +17 -1
- package/dist/esm/idb.js.map +1 -1
- package/dist/esm/metadata/openMetadataDatabase.js +6 -1
- package/dist/esm/metadata/openMetadataDatabase.js.map +1 -1
- package/dist/esm/migration/db.d.ts +9 -3
- package/dist/esm/migration/db.js +23 -11
- package/dist/esm/migration/db.js.map +1 -1
- package/dist/esm/migration/engine.d.ts +15 -0
- package/dist/esm/migration/engine.js +159 -0
- package/dist/esm/migration/engine.js.map +1 -0
- package/dist/esm/migration/migrations.d.ts +17 -0
- package/dist/esm/migration/migrations.js +242 -0
- package/dist/esm/migration/migrations.js.map +1 -0
- package/dist/esm/migration/openQueryDatabase.d.ts +10 -0
- package/dist/esm/migration/openQueryDatabase.js +27 -0
- package/dist/esm/migration/openQueryDatabase.js.map +1 -0
- package/dist/esm/migration/openWIPDatabase.d.ts +11 -0
- package/dist/esm/migration/openWIPDatabase.js +65 -0
- package/dist/esm/migration/openWIPDatabase.js.map +1 -0
- package/dist/esm/migration/types.d.ts +3 -0
- package/dist/esm/migration/types.js +2 -0
- package/dist/esm/migration/types.js.map +1 -0
- package/dist/esm/queries/QueryableStorage.js +1 -1
- package/dist/esm/queries/QueryableStorage.js.map +1 -1
- package/dist/esm/sync/PushPullSync.d.ts +3 -2
- package/dist/esm/sync/PushPullSync.js +7 -1
- package/dist/esm/sync/PushPullSync.js.map +1 -1
- package/dist/esm/sync/Sync.d.ts +2 -0
- package/dist/esm/sync/Sync.js +1 -0
- package/dist/esm/sync/Sync.js.map +1 -1
- package/package.json +2 -2
- package/src/__tests__/{documents.test.ts → entities.test.ts} +44 -2
- package/src/__tests__/fixtures/testStorage.ts +3 -1
- package/src/client/Client.ts +6 -8
- package/src/client/ClientDescriptor.ts +7 -6
- package/src/context.ts +1 -0
- package/src/entities/Entity.test.ts +1 -1
- package/src/entities/Entity.ts +20 -8
- package/src/entities/EntityMetadata.ts +2 -0
- package/src/entities/EntityStore.ts +9 -3
- package/src/entities/entityFieldSubscriber.ts +31 -0
- package/src/files/EntityFile.ts +10 -0
- package/src/files/FileManager.ts +11 -1
- package/src/files/FileStorage.ts +31 -0
- package/src/idb.ts +20 -1
- package/src/metadata/openMetadataDatabase.ts +7 -1
- package/src/migration/db.ts +62 -20
- package/src/migration/engine.ts +248 -0
- package/src/migration/migrations.ts +347 -0
- package/src/migration/openQueryDatabase.ts +63 -0
- package/src/migration/openWIPDatabase.ts +97 -0
- package/src/migration/types.ts +4 -0
- package/src/queries/QueryableStorage.ts +1 -1
- package/src/sync/PushPullSync.ts +10 -0
- package/src/sync/Sync.ts +3 -0
- package/dist/esm/__tests__/documents.test.js.map +0 -1
- package/dist/esm/migration/openDatabase.d.ts +0 -20
- package/dist/esm/migration/openDatabase.js +0 -463
- package/dist/esm/migration/openDatabase.js.map +0 -1
- package/src/migration/openDatabase.ts +0 -749
- /package/dist/esm/__tests__/{documents.test.d.ts → entities.test.d.ts} +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"QueryableStorage.js","sourceRoot":"","sources":["../../../src/queries/QueryableStorage.ts"],"names":[],"mappings":"AAAA,OAAO,EAEN,YAAY,EACZ,cAAc,GACd,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAE9C,OAAO,EAAE,mBAAmB,EAAE,MAAM,WAAW,CAAC;AAEhD,MAAM,OAAO,gBAAiB,SAAQ,UAAU;IAG/C,YAAY,EAAE,GAAG,EAAoB;QACpC,KAAK,CAAC,GAAG,CAAC,UAAU,EAAE,EAAE,GAAG,EAAE,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC;QASzC;;WAEG;QACH,UAAK,GAAG,KAAK,IAAI,EAAE;YAClB,MAAM,cAAc,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;YAChE,MAAM,EAAE,GAAG,IAAI,CAAC,
|
|
1
|
+
{"version":3,"file":"QueryableStorage.js","sourceRoot":"","sources":["../../../src/queries/QueryableStorage.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { ClientMessage, EventSubscriber } from '@verdant-web/common';
|
|
1
|
+
import { ClientMessage, EventSubscriber, PresenceUpdateMessage } from '@verdant-web/common';
|
|
2
2
|
import { Metadata } from '../metadata/Metadata.js';
|
|
3
3
|
import { PresenceManager } from './PresenceManager.js';
|
|
4
4
|
import { ServerSyncEndpointProvider } from './ServerSyncEndpointProvider.js';
|
|
@@ -26,7 +26,8 @@ export declare class PushPullSync extends EventSubscriber<SyncTransportEvents> i
|
|
|
26
26
|
get interval(): number;
|
|
27
27
|
private sendRequest;
|
|
28
28
|
private handleServerMessage;
|
|
29
|
-
|
|
29
|
+
throttledPresenceUpdate: (message: PresenceUpdateMessage) => void;
|
|
30
|
+
send: (message: ClientMessage) => void | Promise<void>;
|
|
30
31
|
start(): void;
|
|
31
32
|
stop(): void;
|
|
32
33
|
destroy: () => void;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { EventSubscriber, VerdantErrorCode, isVerdantErrorResponse, } from '@verdant-web/common';
|
|
1
|
+
import { EventSubscriber, VerdantErrorCode, isVerdantErrorResponse, throttle, } from '@verdant-web/common';
|
|
2
2
|
import { Heartbeat } from './Heartbeat.js';
|
|
3
3
|
export class PushPullSync extends EventSubscriber {
|
|
4
4
|
constructor({ endpointProvider, meta, presence, interval = 15 * 1000, log = () => { }, fetch = window.fetch.bind(window), }) {
|
|
@@ -81,10 +81,16 @@ export class PushPullSync extends EventSubscriber {
|
|
|
81
81
|
}
|
|
82
82
|
this.emit('message', message);
|
|
83
83
|
};
|
|
84
|
+
// reduce rate of presence messages sent; each one would trigger an HTTP
|
|
85
|
+
// request, which is not ideal if presence is updating rapidly.
|
|
86
|
+
this.throttledPresenceUpdate = throttle((message) => {
|
|
87
|
+
this.sendRequest([message]);
|
|
88
|
+
}, 3000);
|
|
84
89
|
this.send = (message) => {
|
|
85
90
|
// only certain messages are sent for pull-based sync.
|
|
86
91
|
switch (message.type) {
|
|
87
92
|
case 'presence-update':
|
|
93
|
+
return this.throttledPresenceUpdate(message);
|
|
88
94
|
case 'sync':
|
|
89
95
|
case 'heartbeat':
|
|
90
96
|
return this.sendRequest([message]);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PushPullSync.js","sourceRoot":"","sources":["../../../src/sync/PushPullSync.ts"],"names":[],"mappings":"AAAA,OAAO,EAEN,eAAe,
|
|
1
|
+
{"version":3,"file":"PushPullSync.js","sourceRoot":"","sources":["../../../src/sync/PushPullSync.ts"],"names":[],"mappings":"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"}
|
package/dist/esm/sync/Sync.d.ts
CHANGED
|
@@ -7,6 +7,8 @@ import { Context } from '../context.js';
|
|
|
7
7
|
type SyncEvents = {
|
|
8
8
|
onlineChange: (isOnline: boolean) => void;
|
|
9
9
|
syncingChange: (syncing: boolean) => void;
|
|
10
|
+
/** When the server has lost data and re-requests data from the past */
|
|
11
|
+
serverReset: (since: string | null) => void;
|
|
10
12
|
};
|
|
11
13
|
export type SyncTransportEvents = SyncEvents & {
|
|
12
14
|
message: (message: ServerMessage) => void;
|
package/dist/esm/sync/Sync.js
CHANGED
|
@@ -92,6 +92,7 @@ export class ServerSync extends EventSubscriber {
|
|
|
92
92
|
this.emit('syncingChange', false);
|
|
93
93
|
break;
|
|
94
94
|
case 'need-since':
|
|
95
|
+
this.emit('serverReset', message.since);
|
|
95
96
|
this.activeSync.send(await this.meta.messageCreator.createSyncStep1(message.since));
|
|
96
97
|
break;
|
|
97
98
|
case 'server-ack':
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Sync.js","sourceRoot":"","sources":["../../../src/sync/Sync.ts"],"names":[],"mappings":"AAAA,OAAO,EAGN,eAAe,EAGf,WAAW,GAEX,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACvE,OAAO,EAAkB,QAAQ,EAAoB,MAAM,eAAe,CAAC;AAC3E,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EACN,0BAA0B,GAE1B,MAAM,iCAAiC,CAAC;AACzC,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"Sync.js","sourceRoot":"","sources":["../../../src/sync/Sync.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@verdant-web/store",
|
|
3
|
-
"version": "3.8.
|
|
3
|
+
"version": "3.8.2",
|
|
4
4
|
"access": "public",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"exports": {
|
|
@@ -27,7 +27,7 @@
|
|
|
27
27
|
"jwt-decode": "^3.1.2",
|
|
28
28
|
"kysely": "^0.27.3",
|
|
29
29
|
"weak-event": "^2.0.5",
|
|
30
|
-
"@verdant-web/common": "2.3.
|
|
30
|
+
"@verdant-web/common": "2.3.4"
|
|
31
31
|
},
|
|
32
32
|
"devDependencies": {
|
|
33
33
|
"@types/node": "20.10.5",
|
|
@@ -20,7 +20,7 @@ async function waitForStoragePropagation(mock: MockedFunction<any>) {
|
|
|
20
20
|
});
|
|
21
21
|
}
|
|
22
22
|
|
|
23
|
-
describe('
|
|
23
|
+
describe('entities', () => {
|
|
24
24
|
it('should fill in default values', async () => {
|
|
25
25
|
const storage = await createTestStorage();
|
|
26
26
|
|
|
@@ -64,6 +64,7 @@ describe('storage documents', () => {
|
|
|
64
64
|
const singleItemResult = await singleItemQuery.resolved;
|
|
65
65
|
expect(singleItemResult).toBeTruthy();
|
|
66
66
|
assert(!!singleItemResult);
|
|
67
|
+
expect(singleItemResult).toBe(item1);
|
|
67
68
|
singleItemResult.subscribe('change', vi.fn());
|
|
68
69
|
|
|
69
70
|
const allItemsQuery = storage.todos.findAll();
|
|
@@ -637,6 +638,47 @@ describe('storage documents', () => {
|
|
|
637
638
|
storage.todos.put({
|
|
638
639
|
content: { invalid: 'value' },
|
|
639
640
|
});
|
|
640
|
-
}).toThrowErrorMatchingInlineSnapshot(
|
|
641
|
+
}).toThrowErrorMatchingInlineSnapshot(
|
|
642
|
+
`[Error: Validation error: Expected string for field content, got [object Object]]`,
|
|
643
|
+
);
|
|
644
|
+
});
|
|
645
|
+
|
|
646
|
+
it('should allow subscribing to one field', async () => {
|
|
647
|
+
const storage = await createTestStorage();
|
|
648
|
+
const item = await storage.todos.put({
|
|
649
|
+
content: 'item',
|
|
650
|
+
});
|
|
651
|
+
const queriedItem = await storage.todos.get(item.get('id')).resolved;
|
|
652
|
+
|
|
653
|
+
const callback = vi.fn();
|
|
654
|
+
queriedItem.subscribeToField('content', 'change', callback);
|
|
655
|
+
|
|
656
|
+
queriedItem.set('content', 'updated');
|
|
657
|
+
|
|
658
|
+
await waitForStoragePropagation(callback);
|
|
659
|
+
|
|
660
|
+
expect(callback).toBeCalledTimes(1);
|
|
661
|
+
});
|
|
662
|
+
|
|
663
|
+
it('should allow subscribing to one field and not break on deletion', async () => {
|
|
664
|
+
const storage = await createTestStorage({
|
|
665
|
+
log: console.log,
|
|
666
|
+
});
|
|
667
|
+
const item = await storage.todos.put({
|
|
668
|
+
content: 'item',
|
|
669
|
+
});
|
|
670
|
+
|
|
671
|
+
const callback = vi.fn(console.log);
|
|
672
|
+
item.subscribeToField('content', 'change', callback);
|
|
673
|
+
|
|
674
|
+
item.set('content', 'updated');
|
|
675
|
+
|
|
676
|
+
await waitForStoragePropagation(callback);
|
|
677
|
+
|
|
678
|
+
expect(callback).toBeCalledTimes(1);
|
|
679
|
+
|
|
680
|
+
await storage.todos.delete(item.get('id'));
|
|
681
|
+
|
|
682
|
+
expect(item.deleted).toBe(true);
|
|
641
683
|
});
|
|
642
684
|
});
|
|
@@ -24,7 +24,9 @@ export const todoCollection = schema.collection({
|
|
|
24
24
|
tags: schema.fields.array({
|
|
25
25
|
items: schema.fields.string(),
|
|
26
26
|
}),
|
|
27
|
-
category: schema.fields.string(
|
|
27
|
+
category: schema.fields.string({
|
|
28
|
+
nullable: true,
|
|
29
|
+
}),
|
|
28
30
|
attachments: schema.fields.array({
|
|
29
31
|
items: schema.fields.object({
|
|
30
32
|
properties: {
|
package/src/client/Client.ts
CHANGED
|
@@ -1,27 +1,25 @@
|
|
|
1
1
|
import {
|
|
2
|
-
assert,
|
|
3
2
|
debounce,
|
|
4
3
|
DocumentBaseline,
|
|
5
4
|
EventSubscriber,
|
|
6
5
|
Migration,
|
|
7
6
|
Operation,
|
|
8
|
-
SchemaCollection,
|
|
9
7
|
} from '@verdant-web/common';
|
|
10
8
|
import { Context } from '../context.js';
|
|
11
9
|
import { DocumentManager } from '../DocumentManager.js';
|
|
10
|
+
import { EntityStore } from '../entities/EntityStore.js';
|
|
12
11
|
import { FileManager, FileManagerConfig } from '../files/FileManager.js';
|
|
12
|
+
import { ReturnedFileData } from '../files/FileStorage.js';
|
|
13
13
|
import {
|
|
14
14
|
closeDatabase,
|
|
15
15
|
deleteAllDatabases,
|
|
16
16
|
getSizeOfObjectStore,
|
|
17
17
|
} from '../idb.js';
|
|
18
18
|
import { ExportData, Metadata } from '../metadata/Metadata.js';
|
|
19
|
-
import {
|
|
20
|
-
import { EntityStore } from '../entities/EntityStore.js';
|
|
21
|
-
import { NoSync, ServerSync, ServerSyncOptions, Sync } from '../sync/Sync.js';
|
|
19
|
+
import { openQueryDatabase } from '../migration/openQueryDatabase.js';
|
|
22
20
|
import { CollectionQueries } from '../queries/CollectionQueries.js';
|
|
23
21
|
import { QueryCache } from '../queries/QueryCache.js';
|
|
24
|
-
import {
|
|
22
|
+
import { NoSync, ServerSync, ServerSyncOptions, Sync } from '../sync/Sync.js';
|
|
25
23
|
|
|
26
24
|
interface ClientConfig<Presence = any> {
|
|
27
25
|
syncConfig?: ServerSyncOptions<Presence>;
|
|
@@ -382,7 +380,7 @@ export class Client<Presence = any, Profile = any> extends EventSubscriber<{
|
|
|
382
380
|
}
|
|
383
381
|
// now open the document DB empty at the specified version
|
|
384
382
|
// and initialize it from the meta DB
|
|
385
|
-
this.context.documentDb = await
|
|
383
|
+
this.context.documentDb = await openQueryDatabase({
|
|
386
384
|
meta: this.meta,
|
|
387
385
|
migrations: this.config.migrations,
|
|
388
386
|
context: this.context,
|
|
@@ -402,7 +400,7 @@ export class Client<Presence = any, Profile = any> extends EventSubscriber<{
|
|
|
402
400
|
this.context.log('Migrating up to latest schema...');
|
|
403
401
|
// put the schema back
|
|
404
402
|
this.context.schema = currentSchema;
|
|
405
|
-
this.context.documentDb = await
|
|
403
|
+
this.context.documentDb = await openQueryDatabase({
|
|
406
404
|
meta: this.meta,
|
|
407
405
|
migrations: this.config.migrations,
|
|
408
406
|
context: this.context,
|
|
@@ -12,10 +12,7 @@ import {
|
|
|
12
12
|
openMetadataDatabase,
|
|
13
13
|
openWIPMetadataDatabase,
|
|
14
14
|
} from '../metadata/openMetadataDatabase.js';
|
|
15
|
-
import {
|
|
16
|
-
openDocumentDatabase,
|
|
17
|
-
openWIPDocumentDatabase,
|
|
18
|
-
} from '../migration/openDatabase.js';
|
|
15
|
+
import { openWIPDatabase } from '../migration/openWIPDatabase.js';
|
|
19
16
|
import { ServerSyncOptions } from '../sync/Sync.js';
|
|
20
17
|
import { UndoHistory } from '../UndoHistory.js';
|
|
21
18
|
import { Client } from './Client.js';
|
|
@@ -26,10 +23,12 @@ import {
|
|
|
26
23
|
} from '../idb.js';
|
|
27
24
|
import { FakeWeakRef } from '../FakeWeakRef.js';
|
|
28
25
|
import { METADATA_VERSION_KEY } from './constants.js';
|
|
26
|
+
import { openQueryDatabase } from '../migration/openQueryDatabase.js';
|
|
29
27
|
|
|
30
28
|
export interface ClientDescriptorOptions<Presence = any, Profile = any> {
|
|
31
29
|
/** The schema used to create this client */
|
|
32
30
|
schema: StorageSchema<any>;
|
|
31
|
+
oldSchemas?: StorageSchema<any>[];
|
|
33
32
|
/** Migrations, in order, to upgrade to each successive version of the schema */
|
|
34
33
|
migrations: Migration<any>[];
|
|
35
34
|
/** Provide a sync config to turn on synchronization with a server */
|
|
@@ -177,6 +176,7 @@ export class ClientDescriptor<
|
|
|
177
176
|
}
|
|
178
177
|
},
|
|
179
178
|
migrations: init.migrations,
|
|
179
|
+
oldSchemas: init.oldSchemas,
|
|
180
180
|
};
|
|
181
181
|
const meta = new Metadata({
|
|
182
182
|
context,
|
|
@@ -191,7 +191,7 @@ export class ClientDescriptor<
|
|
|
191
191
|
getNow: () => meta.now,
|
|
192
192
|
});
|
|
193
193
|
|
|
194
|
-
const documentDb = await
|
|
194
|
+
const documentDb = await openQueryDatabase({
|
|
195
195
|
context: contextWithNow,
|
|
196
196
|
version: init.schema.version,
|
|
197
197
|
meta,
|
|
@@ -245,6 +245,7 @@ export class ClientDescriptor<
|
|
|
245
245
|
}
|
|
246
246
|
},
|
|
247
247
|
migrations: init.migrations,
|
|
248
|
+
oldSchemas: init.oldSchemas,
|
|
248
249
|
};
|
|
249
250
|
const meta = new Metadata({
|
|
250
251
|
context,
|
|
@@ -258,7 +259,7 @@ export class ClientDescriptor<
|
|
|
258
259
|
// verify schema integrity
|
|
259
260
|
await meta.updateSchema(init.schema, init.overrideSchemaConflict);
|
|
260
261
|
|
|
261
|
-
const documentDb = await
|
|
262
|
+
const documentDb = await openWIPDatabase({
|
|
262
263
|
context: contextWithNow,
|
|
263
264
|
version: init.schema.version,
|
|
264
265
|
meta,
|
package/src/context.ts
CHANGED
package/src/entities/Entity.ts
CHANGED
|
@@ -45,6 +45,7 @@ import {
|
|
|
45
45
|
ObjectEntity,
|
|
46
46
|
} from './types.js';
|
|
47
47
|
import { EntityStoreEventData, EntityStoreEvents } from './EntityStore.js';
|
|
48
|
+
import { entityFieldSubscriber } from './entityFieldSubscriber.js';
|
|
48
49
|
|
|
49
50
|
export interface EntityInit {
|
|
50
51
|
oid: ObjectIdentifier;
|
|
@@ -57,7 +58,7 @@ export interface EntityInit {
|
|
|
57
58
|
readonlyKeys?: string[];
|
|
58
59
|
fieldPath?: (string | number)[];
|
|
59
60
|
patchCreator: PatchCreator;
|
|
60
|
-
|
|
61
|
+
storeEvents: EntityStoreEvents;
|
|
61
62
|
deleteSelf: () => void;
|
|
62
63
|
}
|
|
63
64
|
|
|
@@ -83,7 +84,7 @@ export class Entity<
|
|
|
83
84
|
private ctx;
|
|
84
85
|
private files;
|
|
85
86
|
private patchCreator;
|
|
86
|
-
private
|
|
87
|
+
private storeEvents;
|
|
87
88
|
|
|
88
89
|
// an internal representation of this Entity.
|
|
89
90
|
// if present, this is the cached, known value. If null,
|
|
@@ -109,7 +110,7 @@ export class Entity<
|
|
|
109
110
|
readonlyKeys,
|
|
110
111
|
files,
|
|
111
112
|
patchCreator,
|
|
112
|
-
|
|
113
|
+
storeEvents,
|
|
113
114
|
deleteSelf,
|
|
114
115
|
}: EntityInit) {
|
|
115
116
|
super();
|
|
@@ -128,15 +129,15 @@ export class Entity<
|
|
|
128
129
|
});
|
|
129
130
|
this.patchCreator = patchCreator;
|
|
130
131
|
this.metadataFamily = metadataFamily;
|
|
131
|
-
this.
|
|
132
|
+
this.storeEvents = storeEvents;
|
|
132
133
|
this.parent = parent;
|
|
133
134
|
this._deleteSelf = deleteSelf;
|
|
134
135
|
|
|
135
136
|
// TODO: should any but the root entity be listening to these?
|
|
136
137
|
if (!this.parent) {
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
138
|
+
storeEvents.add.attach(this.onAdd);
|
|
139
|
+
storeEvents.replace.attach(this.onReplace);
|
|
140
|
+
storeEvents.resetAll.attach(this.onResetAll);
|
|
140
141
|
}
|
|
141
142
|
}
|
|
142
143
|
|
|
@@ -563,11 +564,22 @@ export class Entity<
|
|
|
563
564
|
files: this.files,
|
|
564
565
|
fieldPath: [...this.fieldPath, key],
|
|
565
566
|
patchCreator: this.patchCreator,
|
|
566
|
-
|
|
567
|
+
storeEvents: this.storeEvents,
|
|
567
568
|
deleteSelf: this.delete.bind(this, key),
|
|
568
569
|
});
|
|
569
570
|
};
|
|
570
571
|
|
|
572
|
+
subscribeToField = <K extends keyof KeyValue>(
|
|
573
|
+
key: K,
|
|
574
|
+
event: 'change', // here to keep future api changes stable
|
|
575
|
+
callback: (
|
|
576
|
+
value: KeyValue[K],
|
|
577
|
+
info: { previousValue: KeyValue[K]; isLocal?: boolean },
|
|
578
|
+
) => void,
|
|
579
|
+
) => {
|
|
580
|
+
return entityFieldSubscriber<KeyValue[K]>(this, key, callback);
|
|
581
|
+
};
|
|
582
|
+
|
|
571
583
|
// generic entity methods
|
|
572
584
|
/**
|
|
573
585
|
* Gets a value from this Entity. If the value
|
|
@@ -19,6 +19,7 @@ export type EntityMetadataView = {
|
|
|
19
19
|
deleted: boolean;
|
|
20
20
|
empty: boolean;
|
|
21
21
|
updatedAt: number;
|
|
22
|
+
latestTimestamp: string | null;
|
|
22
23
|
};
|
|
23
24
|
|
|
24
25
|
export class EntityMetadata {
|
|
@@ -136,6 +137,7 @@ export class EntityMetadata {
|
|
|
136
137
|
empty,
|
|
137
138
|
fromOlderVersion,
|
|
138
139
|
updatedAt,
|
|
140
|
+
latestTimestamp: updatedAtTimestamp,
|
|
139
141
|
};
|
|
140
142
|
};
|
|
141
143
|
|
|
@@ -42,12 +42,12 @@ export type EntityStoreEvents = {
|
|
|
42
42
|
resetAll: WeakEvent<EntityStore, void>;
|
|
43
43
|
};
|
|
44
44
|
|
|
45
|
-
|
|
45
|
+
export interface IncomingData {
|
|
46
46
|
operations?: Operation[];
|
|
47
47
|
baselines?: DocumentBaseline[];
|
|
48
48
|
reset?: boolean;
|
|
49
49
|
isLocal?: boolean;
|
|
50
|
-
}
|
|
50
|
+
}
|
|
51
51
|
|
|
52
52
|
export class EntityStore extends Disposable {
|
|
53
53
|
private ctx;
|
|
@@ -137,6 +137,12 @@ export class EntityStore extends Disposable {
|
|
|
137
137
|
await this.processData(data);
|
|
138
138
|
};
|
|
139
139
|
|
|
140
|
+
empty = async () => {
|
|
141
|
+
await this.queryableStorage.reset();
|
|
142
|
+
this.events.resetAll.invoke(this);
|
|
143
|
+
this.cache.clear();
|
|
144
|
+
};
|
|
145
|
+
|
|
140
146
|
private resetData = async () => {
|
|
141
147
|
if (this.disposed) {
|
|
142
148
|
this.ctx.log('warn', 'EntityStore is disposed, not resetting local data');
|
|
@@ -445,7 +451,7 @@ export class EntityStore extends Disposable {
|
|
|
445
451
|
files: this.files,
|
|
446
452
|
metadataFamily: metadataFamily,
|
|
447
453
|
patchCreator: this.meta.patchCreator,
|
|
448
|
-
|
|
454
|
+
storeEvents: this.events,
|
|
449
455
|
deleteSelf: this.delete.bind(this, oid),
|
|
450
456
|
});
|
|
451
457
|
};
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { Entity } from './Entity.js';
|
|
2
|
+
import { EntityChangeInfo } from './types.js';
|
|
3
|
+
|
|
4
|
+
export function entityFieldSubscriber<T = any>(
|
|
5
|
+
entity: Entity,
|
|
6
|
+
field: string | number | symbol,
|
|
7
|
+
subscriber: (
|
|
8
|
+
newValue: T,
|
|
9
|
+
info: EntityChangeInfo & { previousValue: T },
|
|
10
|
+
) => void,
|
|
11
|
+
) {
|
|
12
|
+
const valueHolder = {
|
|
13
|
+
previousValue: entity.get(field),
|
|
14
|
+
isLocal: false,
|
|
15
|
+
};
|
|
16
|
+
function handler(
|
|
17
|
+
this: { previousValue: T } & EntityChangeInfo,
|
|
18
|
+
info: EntityChangeInfo,
|
|
19
|
+
) {
|
|
20
|
+
if (entity.deleted) {
|
|
21
|
+
return;
|
|
22
|
+
}
|
|
23
|
+
const newValue = entity.get(field);
|
|
24
|
+
if (newValue !== this.previousValue) {
|
|
25
|
+
this.isLocal = info.isLocal;
|
|
26
|
+
subscriber(newValue, this);
|
|
27
|
+
this.previousValue = newValue;
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
return entity.subscribe('change', handler.bind(valueHolder));
|
|
31
|
+
}
|
package/src/files/EntityFile.ts
CHANGED
|
@@ -6,6 +6,7 @@ export type EntityFileEvents = {
|
|
|
6
6
|
|
|
7
7
|
export const UPDATE = Symbol('entity-file-update');
|
|
8
8
|
export const MARK_FAILED = Symbol('entity-file-mark-failed');
|
|
9
|
+
export const MARK_UPLOADED = Symbol('entity-file-mark-uploaded');
|
|
9
10
|
|
|
10
11
|
export type EntityFileSnapshot = {
|
|
11
12
|
id: string;
|
|
@@ -42,6 +43,9 @@ export class EntityFile extends EventSubscriber<EntityFileEvents> {
|
|
|
42
43
|
get isFile() {
|
|
43
44
|
return true;
|
|
44
45
|
}
|
|
46
|
+
get isUploaded() {
|
|
47
|
+
return this._fileData?.remote ?? false;
|
|
48
|
+
}
|
|
45
49
|
|
|
46
50
|
[UPDATE] = (fileData: FileData) => {
|
|
47
51
|
this._loading = false;
|
|
@@ -62,6 +66,12 @@ export class EntityFile extends EventSubscriber<EntityFileEvents> {
|
|
|
62
66
|
this.emit('change');
|
|
63
67
|
};
|
|
64
68
|
|
|
69
|
+
[MARK_UPLOADED] = () => {
|
|
70
|
+
if (!this._fileData) return;
|
|
71
|
+
this._fileData!.remote = true;
|
|
72
|
+
this.emit('change');
|
|
73
|
+
};
|
|
74
|
+
|
|
65
75
|
get url(): string | null {
|
|
66
76
|
if (this.loading) return null;
|
|
67
77
|
if (this._objectUrl) return this._objectUrl;
|
package/src/files/FileManager.ts
CHANGED
|
@@ -2,7 +2,12 @@ import { FileData, FileRef } from '@verdant-web/common';
|
|
|
2
2
|
import { Context } from '../context.js';
|
|
3
3
|
import { Metadata } from '../metadata/Metadata.js';
|
|
4
4
|
import { Sync } from '../sync/Sync.js';
|
|
5
|
-
import {
|
|
5
|
+
import {
|
|
6
|
+
EntityFile,
|
|
7
|
+
MARK_FAILED,
|
|
8
|
+
MARK_UPLOADED,
|
|
9
|
+
UPDATE,
|
|
10
|
+
} from './EntityFile.js';
|
|
6
11
|
import {
|
|
7
12
|
FileStorage,
|
|
8
13
|
ReturnedFileData,
|
|
@@ -62,6 +67,7 @@ export class FileManager {
|
|
|
62
67
|
|
|
63
68
|
this.sync.subscribe('onlineChange', this.onOnlineChange);
|
|
64
69
|
this.meta.subscribe('filesDeleted', this.handleFileRefsDeleted);
|
|
70
|
+
this.sync.subscribe('serverReset', this.storage.resetSyncedStatusSince);
|
|
65
71
|
// check on startup to see if files can be cleaned up
|
|
66
72
|
this.tryCleanupDeletedFiles();
|
|
67
73
|
}
|
|
@@ -89,6 +95,10 @@ export class FileManager {
|
|
|
89
95
|
const result = await this.sync.uploadFile(file);
|
|
90
96
|
if (result.success) {
|
|
91
97
|
await this.storage.markUploaded(file.id);
|
|
98
|
+
const cached = this.files.get(file.id);
|
|
99
|
+
if (cached) {
|
|
100
|
+
cached[MARK_UPLOADED]();
|
|
101
|
+
}
|
|
92
102
|
} else {
|
|
93
103
|
if (result.retry && retries < 5) {
|
|
94
104
|
this.context.log('error', 'Error uploading file, retrying...');
|
package/src/files/FileStorage.ts
CHANGED
|
@@ -12,6 +12,7 @@ export interface StoredFileData extends Omit<FileData, 'remote' | 'file'> {
|
|
|
12
12
|
remote: 'true' | 'false';
|
|
13
13
|
buffer?: ArrayBuffer;
|
|
14
14
|
deletedAt: number | null;
|
|
15
|
+
timestamp?: string;
|
|
15
16
|
}
|
|
16
17
|
|
|
17
18
|
export interface ReturnedFileData extends FileData {
|
|
@@ -164,6 +165,36 @@ export class FileStorage extends IDBService {
|
|
|
164
165
|
return raw.map(this.hydrateFileData);
|
|
165
166
|
};
|
|
166
167
|
|
|
168
|
+
resetSyncedStatusSince = async (since: string | null) => {
|
|
169
|
+
const tx = this.createTransaction(['files'], { mode: 'readwrite' });
|
|
170
|
+
const raw = await this.run<StoredFileData[]>(
|
|
171
|
+
'files',
|
|
172
|
+
(store) => {
|
|
173
|
+
return store.index('remote').getAll('true');
|
|
174
|
+
},
|
|
175
|
+
{ transaction: tx },
|
|
176
|
+
);
|
|
177
|
+
|
|
178
|
+
const filtered = raw.filter(
|
|
179
|
+
(file) => !file.timestamp || !since || file.timestamp > since,
|
|
180
|
+
);
|
|
181
|
+
|
|
182
|
+
await Promise.all(
|
|
183
|
+
filtered.map((file) => {
|
|
184
|
+
return this.run(
|
|
185
|
+
'files',
|
|
186
|
+
(store) => {
|
|
187
|
+
return store.put({
|
|
188
|
+
...file,
|
|
189
|
+
remote: 'false',
|
|
190
|
+
} as StoredFileData);
|
|
191
|
+
},
|
|
192
|
+
{ transaction: tx },
|
|
193
|
+
);
|
|
194
|
+
}),
|
|
195
|
+
);
|
|
196
|
+
};
|
|
197
|
+
|
|
167
198
|
iterateOverPendingDelete = (
|
|
168
199
|
iterator: (file: ReturnedFileData, store: IDBObjectStore) => void,
|
|
169
200
|
transaction?: IDBTransaction,
|