@verdant-web/store 2.5.8 → 2.7.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 +15 -10
- package/dist/bundle/index.js.map +4 -4
- package/dist/cjs/{entities/FakeWeakRef.d.ts → FakeWeakRef.d.ts} +2 -2
- package/dist/cjs/{entities/FakeWeakRef.js → FakeWeakRef.js} +4 -4
- package/dist/cjs/FakeWeakRef.js.map +1 -0
- package/dist/cjs/IDBService.d.ts +1 -1
- package/dist/cjs/IDBService.js +18 -1
- package/dist/cjs/IDBService.js.map +1 -1
- package/dist/cjs/__tests__/documents.test.js +17 -0
- package/dist/cjs/__tests__/documents.test.js.map +1 -1
- package/dist/cjs/__tests__/fixtures/testStorage.d.ts +1 -1
- package/dist/cjs/__tests__/fixtures/testStorage.js +3 -2
- package/dist/cjs/__tests__/fixtures/testStorage.js.map +1 -1
- package/dist/cjs/__tests__/mutations.test.d.ts +1 -0
- package/dist/cjs/__tests__/mutations.test.js +42 -0
- package/dist/cjs/__tests__/mutations.test.js.map +1 -0
- package/dist/cjs/__tests__/queries.test.js +2 -0
- package/dist/cjs/__tests__/queries.test.js.map +1 -1
- package/dist/cjs/client/Client.d.ts +6 -4
- package/dist/cjs/client/Client.js +24 -16
- package/dist/cjs/client/Client.js.map +1 -1
- package/dist/cjs/client/ClientDescriptor.d.ts +15 -4
- package/dist/cjs/client/ClientDescriptor.js +117 -36
- package/dist/cjs/client/ClientDescriptor.js.map +1 -1
- package/dist/cjs/context.d.ts +1 -0
- package/dist/cjs/entities/DocumentFamiliyCache.d.ts +22 -2
- package/dist/cjs/entities/DocumentFamiliyCache.js +39 -21
- package/dist/cjs/entities/DocumentFamiliyCache.js.map +1 -1
- package/dist/cjs/entities/Entity.d.ts +7 -2
- package/dist/cjs/entities/Entity.js +33 -3
- package/dist/cjs/entities/Entity.js.map +1 -1
- package/dist/cjs/entities/EntityStore.d.ts +2 -1
- package/dist/cjs/entities/EntityStore.js +50 -20
- package/dist/cjs/entities/EntityStore.js.map +1 -1
- package/dist/cjs/idb.d.ts +2 -0
- package/dist/cjs/idb.js +9 -1
- package/dist/cjs/idb.js.map +1 -1
- package/dist/cjs/index.d.ts +1 -1
- package/dist/cjs/index.js +2 -1
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/metadata/BaselinesStore.js +15 -5
- package/dist/cjs/metadata/BaselinesStore.js.map +1 -1
- package/dist/cjs/metadata/openMetadataDatabase.d.ts +11 -2
- package/dist/cjs/metadata/openMetadataDatabase.js +56 -3
- package/dist/cjs/metadata/openMetadataDatabase.js.map +1 -1
- package/dist/cjs/migration/db.d.ts +1 -1
- package/dist/cjs/migration/db.js +5 -2
- package/dist/cjs/migration/db.js.map +1 -1
- package/dist/cjs/migration/openDatabase.d.ts +8 -0
- package/dist/cjs/migration/openDatabase.js +217 -165
- package/dist/cjs/migration/openDatabase.js.map +1 -1
- package/dist/cjs/queries/BaseQuery.js +12 -1
- package/dist/cjs/queries/BaseQuery.js.map +1 -1
- package/dist/cjs/sync/Sync.d.ts +6 -5
- package/dist/cjs/sync/Sync.js.map +1 -1
- package/dist/cjs/sync/WebSocketSync.js +4 -3
- package/dist/cjs/sync/WebSocketSync.js.map +1 -1
- package/dist/esm/{entities/FakeWeakRef.d.ts → FakeWeakRef.d.ts} +2 -2
- package/dist/esm/{entities/FakeWeakRef.js → FakeWeakRef.js} +2 -2
- package/dist/esm/FakeWeakRef.js.map +1 -0
- package/dist/esm/IDBService.d.ts +1 -1
- package/dist/esm/IDBService.js +18 -1
- package/dist/esm/IDBService.js.map +1 -1
- package/dist/esm/__tests__/documents.test.js +17 -0
- package/dist/esm/__tests__/documents.test.js.map +1 -1
- package/dist/esm/__tests__/fixtures/testStorage.d.ts +1 -1
- package/dist/esm/__tests__/fixtures/testStorage.js +4 -3
- package/dist/esm/__tests__/fixtures/testStorage.js.map +1 -1
- package/dist/esm/__tests__/mutations.test.d.ts +1 -0
- package/dist/esm/__tests__/mutations.test.js +40 -0
- package/dist/esm/__tests__/mutations.test.js.map +1 -0
- package/dist/esm/__tests__/queries.test.js +2 -0
- package/dist/esm/__tests__/queries.test.js.map +1 -1
- package/dist/esm/client/Client.d.ts +6 -4
- package/dist/esm/client/Client.js +25 -17
- package/dist/esm/client/Client.js.map +1 -1
- package/dist/esm/client/ClientDescriptor.d.ts +15 -4
- package/dist/esm/client/ClientDescriptor.js +121 -40
- package/dist/esm/client/ClientDescriptor.js.map +1 -1
- package/dist/esm/context.d.ts +1 -0
- package/dist/esm/entities/DocumentFamiliyCache.d.ts +22 -2
- package/dist/esm/entities/DocumentFamiliyCache.js +39 -21
- package/dist/esm/entities/DocumentFamiliyCache.js.map +1 -1
- package/dist/esm/entities/Entity.d.ts +7 -2
- package/dist/esm/entities/Entity.js +33 -3
- package/dist/esm/entities/Entity.js.map +1 -1
- package/dist/esm/entities/EntityStore.d.ts +2 -1
- package/dist/esm/entities/EntityStore.js +51 -21
- package/dist/esm/entities/EntityStore.js.map +1 -1
- package/dist/esm/idb.d.ts +2 -0
- package/dist/esm/idb.js +6 -0
- package/dist/esm/idb.js.map +1 -1
- package/dist/esm/index.d.ts +1 -1
- package/dist/esm/index.js +1 -1
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/metadata/BaselinesStore.js +16 -6
- package/dist/esm/metadata/BaselinesStore.js.map +1 -1
- package/dist/esm/metadata/openMetadataDatabase.d.ts +11 -2
- package/dist/esm/metadata/openMetadataDatabase.js +54 -2
- package/dist/esm/metadata/openMetadataDatabase.js.map +1 -1
- package/dist/esm/migration/db.d.ts +1 -1
- package/dist/esm/migration/db.js +5 -2
- package/dist/esm/migration/db.js.map +1 -1
- package/dist/esm/migration/openDatabase.d.ts +8 -0
- package/dist/esm/migration/openDatabase.js +215 -164
- package/dist/esm/migration/openDatabase.js.map +1 -1
- package/dist/esm/queries/BaseQuery.js +12 -1
- package/dist/esm/queries/BaseQuery.js.map +1 -1
- package/dist/esm/sync/Sync.d.ts +6 -5
- package/dist/esm/sync/Sync.js.map +1 -1
- package/dist/esm/sync/WebSocketSync.js +4 -3
- package/dist/esm/sync/WebSocketSync.js.map +1 -1
- package/dist/tsconfig-cjs.tsbuildinfo +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +9 -4
- package/src/{entities/FakeWeakRef.ts → FakeWeakRef.ts} +2 -2
- package/src/IDBService.ts +20 -2
- package/src/__tests__/documents.test.ts +19 -0
- package/src/__tests__/fixtures/testStorage.ts +4 -7
- package/src/__tests__/mutations.test.ts +51 -0
- package/src/__tests__/queries.test.ts +3 -0
- package/src/client/Client.ts +29 -21
- package/src/client/ClientDescriptor.ts +176 -53
- package/src/context.ts +1 -0
- package/src/entities/DocumentFamiliyCache.ts +66 -21
- package/src/entities/Entity.ts +41 -6
- package/src/entities/EntityStore.ts +68 -21
- package/src/idb.ts +10 -0
- package/src/index.ts +1 -0
- package/src/metadata/BaselinesStore.ts +17 -6
- package/src/metadata/openMetadataDatabase.ts +96 -13
- package/src/migration/db.ts +14 -1
- package/src/migration/openDatabase.ts +350 -219
- package/src/queries/BaseQuery.ts +14 -1
- package/src/sync/Sync.ts +13 -9
- package/src/sync/WebSocketSync.ts +1 -0
- package/dist/cjs/entities/FakeWeakRef.js.map +0 -1
- package/dist/cjs/indexes.d.ts +0 -3
- package/dist/cjs/indexes.js +0 -20
- package/dist/cjs/indexes.js.map +0 -1
- package/dist/esm/entities/FakeWeakRef.js.map +0 -1
- package/dist/esm/indexes.d.ts +0 -3
- package/dist/esm/indexes.js +0 -15
- package/dist/esm/indexes.js.map +0 -1
- package/src/indexes.ts +0 -31
|
@@ -8,6 +8,7 @@ const openDatabase_js_1 = require("../migration/openDatabase.js");
|
|
|
8
8
|
const UndoHistory_js_1 = require("../UndoHistory.js");
|
|
9
9
|
const Client_js_1 = require("./Client.js");
|
|
10
10
|
const idb_js_1 = require("../idb.js");
|
|
11
|
+
const FakeWeakRef_js_1 = require("../FakeWeakRef.js");
|
|
11
12
|
/**
|
|
12
13
|
* Since storage initialization is async, this class wraps the core
|
|
13
14
|
* Storage creation promise and exposes some metadata which can
|
|
@@ -31,42 +32,14 @@ class ClientDescriptor {
|
|
|
31
32
|
}
|
|
32
33
|
this._initializing = true;
|
|
33
34
|
try {
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
metaDb,
|
|
43
|
-
schema: init.schema,
|
|
44
|
-
log: init.log || (() => { }),
|
|
45
|
-
undoHistory: init.undoHistory || new UndoHistory_js_1.UndoHistory(),
|
|
46
|
-
entityEvents: new common_1.EventSubscriber(),
|
|
47
|
-
globalEvents: new common_1.EventSubscriber(),
|
|
48
|
-
};
|
|
49
|
-
const meta = new Metadata_js_1.Metadata({
|
|
50
|
-
context,
|
|
51
|
-
disableRebasing: init.disableRebasing,
|
|
52
|
-
});
|
|
53
|
-
// verify schema integrity
|
|
54
|
-
await meta.updateSchema(init.schema, init.overrideSchemaConflict);
|
|
55
|
-
const documentDb = await (0, openDatabase_js_1.openDocumentDatabase)({
|
|
56
|
-
context,
|
|
57
|
-
version: init.schema.version,
|
|
58
|
-
meta,
|
|
59
|
-
migrations: init.migrations,
|
|
60
|
-
indexedDB: init.indexedDb,
|
|
61
|
-
});
|
|
62
|
-
const fullContext = Object.assign(context, { documentDb });
|
|
63
|
-
const storage = new Client_js_1.Client({
|
|
64
|
-
syncConfig: init.sync,
|
|
65
|
-
migrations: init.migrations,
|
|
66
|
-
files: init.files,
|
|
67
|
-
}, fullContext, {
|
|
68
|
-
meta,
|
|
69
|
-
});
|
|
35
|
+
let storage;
|
|
36
|
+
if (init.schema.wip) {
|
|
37
|
+
storage = await this.initializeWIPDatabases(init);
|
|
38
|
+
}
|
|
39
|
+
else {
|
|
40
|
+
storage = await this.initializeDatabases(init);
|
|
41
|
+
this.cleanupWIPDatabases(init);
|
|
42
|
+
}
|
|
70
43
|
this.resolveReady(storage);
|
|
71
44
|
this._resolvedValue = storage;
|
|
72
45
|
return storage;
|
|
@@ -79,6 +52,114 @@ class ClientDescriptor {
|
|
|
79
52
|
this._initializing = false;
|
|
80
53
|
}
|
|
81
54
|
};
|
|
55
|
+
this.initializeDatabases = async (init) => {
|
|
56
|
+
const { db: metaDb } = await (0, openMetadataDatabase_js_1.openMetadataDatabase)({
|
|
57
|
+
indexedDB: init.indexedDb,
|
|
58
|
+
log: init.log,
|
|
59
|
+
namespace: init.namespace,
|
|
60
|
+
});
|
|
61
|
+
const context = {
|
|
62
|
+
namespace: this._namespace,
|
|
63
|
+
metaDb,
|
|
64
|
+
schema: init.schema,
|
|
65
|
+
log: init.log || (() => { }),
|
|
66
|
+
undoHistory: init.undoHistory || new UndoHistory_js_1.UndoHistory(),
|
|
67
|
+
entityEvents: new common_1.EventSubscriber(),
|
|
68
|
+
globalEvents: new common_1.EventSubscriber(),
|
|
69
|
+
weakRef: (value) => {
|
|
70
|
+
if (init.EXPERIMENTAL_weakRefs) {
|
|
71
|
+
return new WeakRef(value);
|
|
72
|
+
}
|
|
73
|
+
else {
|
|
74
|
+
return new FakeWeakRef_js_1.FakeWeakRef(value);
|
|
75
|
+
}
|
|
76
|
+
},
|
|
77
|
+
};
|
|
78
|
+
const meta = new Metadata_js_1.Metadata({
|
|
79
|
+
context,
|
|
80
|
+
disableRebasing: init.disableRebasing,
|
|
81
|
+
});
|
|
82
|
+
// verify schema integrity
|
|
83
|
+
await meta.updateSchema(init.schema, init.overrideSchemaConflict);
|
|
84
|
+
const documentDb = await (0, openDatabase_js_1.openDocumentDatabase)({
|
|
85
|
+
context,
|
|
86
|
+
version: init.schema.version,
|
|
87
|
+
meta,
|
|
88
|
+
migrations: init.migrations,
|
|
89
|
+
indexedDB: init.indexedDb,
|
|
90
|
+
});
|
|
91
|
+
const fullContext = Object.assign(context, { documentDb });
|
|
92
|
+
const storage = new Client_js_1.Client({
|
|
93
|
+
syncConfig: init.sync,
|
|
94
|
+
migrations: init.migrations,
|
|
95
|
+
files: init.files,
|
|
96
|
+
}, fullContext, {
|
|
97
|
+
meta,
|
|
98
|
+
});
|
|
99
|
+
return storage;
|
|
100
|
+
};
|
|
101
|
+
this.initializeWIPDatabases = async (init) => {
|
|
102
|
+
const schemaHash = (0, common_1.hashObject)(init.schema);
|
|
103
|
+
console.info(`WIP schema in use. Opening database with hash ${schemaHash}`);
|
|
104
|
+
const wipNamespace = `@@wip_${init.namespace}_${schemaHash}`;
|
|
105
|
+
const { db: metaDb } = await (0, openMetadataDatabase_js_1.openWIPMetadataDatabase)({
|
|
106
|
+
indexedDB: init.indexedDb,
|
|
107
|
+
log: init.log,
|
|
108
|
+
namespace: init.namespace,
|
|
109
|
+
wipNamespace: wipNamespace,
|
|
110
|
+
});
|
|
111
|
+
const context = {
|
|
112
|
+
namespace: this._namespace,
|
|
113
|
+
metaDb,
|
|
114
|
+
schema: init.schema,
|
|
115
|
+
log: init.log || (() => { }),
|
|
116
|
+
undoHistory: init.undoHistory || new UndoHistory_js_1.UndoHistory(),
|
|
117
|
+
entityEvents: new common_1.EventSubscriber(),
|
|
118
|
+
globalEvents: new common_1.EventSubscriber(),
|
|
119
|
+
weakRef: (value) => {
|
|
120
|
+
if (init.EXPERIMENTAL_weakRefs) {
|
|
121
|
+
return new WeakRef(value);
|
|
122
|
+
}
|
|
123
|
+
else {
|
|
124
|
+
return new FakeWeakRef_js_1.FakeWeakRef(value);
|
|
125
|
+
}
|
|
126
|
+
},
|
|
127
|
+
};
|
|
128
|
+
const meta = new Metadata_js_1.Metadata({
|
|
129
|
+
context,
|
|
130
|
+
disableRebasing: init.disableRebasing,
|
|
131
|
+
});
|
|
132
|
+
// verify schema integrity
|
|
133
|
+
await meta.updateSchema(init.schema, init.overrideSchemaConflict);
|
|
134
|
+
const documentDb = await (0, openDatabase_js_1.openWIPDocumentDatabase)({
|
|
135
|
+
context,
|
|
136
|
+
version: init.schema.version,
|
|
137
|
+
meta,
|
|
138
|
+
migrations: init.migrations,
|
|
139
|
+
indexedDB: init.indexedDb,
|
|
140
|
+
wipNamespace,
|
|
141
|
+
});
|
|
142
|
+
const fullContext = Object.assign(context, { documentDb });
|
|
143
|
+
const storage = new Client_js_1.Client({
|
|
144
|
+
syncConfig: init.sync,
|
|
145
|
+
migrations: init.migrations,
|
|
146
|
+
files: init.files,
|
|
147
|
+
}, fullContext, {
|
|
148
|
+
meta,
|
|
149
|
+
});
|
|
150
|
+
return storage;
|
|
151
|
+
};
|
|
152
|
+
this.cleanupWIPDatabases = async (init) => {
|
|
153
|
+
const databaseInfo = await (0, idb_js_1.getAllDatabaseNamesAndVersions)(init.indexedDb);
|
|
154
|
+
const wipDatabases = databaseInfo
|
|
155
|
+
.filter((db) => { var _a; return (_a = db.name) === null || _a === void 0 ? void 0 : _a.startsWith('@@wip_'); })
|
|
156
|
+
.map((db) => db.name);
|
|
157
|
+
// don't clear a current WIP database.
|
|
158
|
+
const wipDatabasesToDelete = wipDatabases.filter((db) => !db.startsWith(`@@wip_${init.namespace}_${(0, common_1.hashObject)(init.schema)}`));
|
|
159
|
+
for (const db of wipDatabasesToDelete) {
|
|
160
|
+
await (0, idb_js_1.deleteDatabase)(db, init.indexedDb);
|
|
161
|
+
}
|
|
162
|
+
};
|
|
82
163
|
this.open = () => this.initialize(this.init);
|
|
83
164
|
this.close = async () => {
|
|
84
165
|
if (this._resolvedValue) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ClientDescriptor.js","sourceRoot":"","sources":["../../../src/client/ClientDescriptor.ts"],"names":[],"mappings":";;;AAAA,
|
|
1
|
+
{"version":3,"file":"ClientDescriptor.js","sourceRoot":"","sources":["../../../src/client/ClientDescriptor.ts"],"names":[],"mappings":"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"}
|
package/dist/cjs/context.d.ts
CHANGED
|
@@ -27,11 +27,15 @@ export declare class DocumentFamilyCache extends EventSubscriber<Record<`change:
|
|
|
27
27
|
private entities;
|
|
28
28
|
private context;
|
|
29
29
|
private storeTools;
|
|
30
|
+
private _initialized;
|
|
31
|
+
get initializedPromise(): Promise<boolean>;
|
|
32
|
+
setInitialized: () => void;
|
|
30
33
|
constructor({ oid, store, context, }: {
|
|
31
34
|
oid: ObjectIdentifier;
|
|
32
35
|
store: EntityStore;
|
|
33
36
|
context: Context;
|
|
34
37
|
});
|
|
38
|
+
get weakRef(): <T extends object>(value: T) => WeakRef<T>;
|
|
35
39
|
insertLocalOperations: (operations: Operation[]) => void;
|
|
36
40
|
insertOperations: (operations: TaggedOperation[], info: {
|
|
37
41
|
isLocal: boolean;
|
|
@@ -63,8 +67,24 @@ export declare class DocumentFamilyCache extends EventSubscriber<Record<`change:
|
|
|
63
67
|
empty: boolean;
|
|
64
68
|
};
|
|
65
69
|
getLastTimestamp: (oid: ObjectIdentifier) => number | null;
|
|
66
|
-
getEntity: (oid: ObjectIdentifier, schema: StorageFieldSchema, parent?: Entity) => Entity;
|
|
70
|
+
getEntity: (oid: ObjectIdentifier, schema: StorageFieldSchema, parent?: Entity, readonlyKeys?: string[]) => Entity;
|
|
67
71
|
hasOid: (oid: ObjectIdentifier) => boolean;
|
|
68
72
|
dispose: () => void;
|
|
69
|
-
reset: (operations
|
|
73
|
+
reset: ({ operations, baselines, dropExistingUnconfirmed: dropUnconfirmed, unconfirmedOperations, dropAll, }: {
|
|
74
|
+
operations: TaggedOperation[];
|
|
75
|
+
unconfirmedOperations?: Operation[] | undefined;
|
|
76
|
+
baselines: DocumentBaseline[];
|
|
77
|
+
/**
|
|
78
|
+
* Whether to drop operations which are only in-memory. Unconfirmed operations
|
|
79
|
+
* will not be restored from storage until they are persisted, so it's not advisable
|
|
80
|
+
* to use this unless the intention is to completely clear the entities.
|
|
81
|
+
*/
|
|
82
|
+
dropExistingUnconfirmed?: boolean | undefined;
|
|
83
|
+
/**
|
|
84
|
+
* Drop unconfirmed and confirmed data before resetting to incoming data.
|
|
85
|
+
* This is dangerous due to race conditions. Only use when a full reset is
|
|
86
|
+
* required.
|
|
87
|
+
*/
|
|
88
|
+
dropAll?: boolean | undefined;
|
|
89
|
+
}) => void;
|
|
70
90
|
}
|
|
@@ -3,7 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.DocumentFamilyCache = void 0;
|
|
4
4
|
const common_1 = require("@verdant-web/common");
|
|
5
5
|
const Entity_js_1 = require("./Entity.js");
|
|
6
|
-
const
|
|
6
|
+
const Resolvable_js_1 = require("../utils/Resolvable.js");
|
|
7
7
|
/**
|
|
8
8
|
* Local operations: operations on this client that haven't
|
|
9
9
|
* yet been synced and are only applied in-memory. These are
|
|
@@ -19,9 +19,16 @@ const FakeWeakRef_js_1 = require("./FakeWeakRef.js");
|
|
|
19
19
|
* cached entities while storage goes on async.
|
|
20
20
|
*/
|
|
21
21
|
class DocumentFamilyCache extends common_1.EventSubscriber {
|
|
22
|
+
get initializedPromise() {
|
|
23
|
+
return this._initialized.promise;
|
|
24
|
+
}
|
|
22
25
|
constructor({ oid, store, context, }) {
|
|
23
26
|
super();
|
|
24
27
|
this.entities = new Map();
|
|
28
|
+
this._initialized = new Resolvable_js_1.Resolvable();
|
|
29
|
+
this.setInitialized = () => {
|
|
30
|
+
this._initialized.resolve(true);
|
|
31
|
+
};
|
|
25
32
|
this.insertLocalOperations = (operations) => {
|
|
26
33
|
const oidSet = new Set();
|
|
27
34
|
for (const operation of operations) {
|
|
@@ -150,6 +157,12 @@ class DocumentFamilyCache extends common_1.EventSubscriber {
|
|
|
150
157
|
return { view, deleted, empty: !view && !operations.length };
|
|
151
158
|
};
|
|
152
159
|
this.computeView = (oid) => {
|
|
160
|
+
if (this.baselinesMap.size === 0 &&
|
|
161
|
+
this.operationsMap.size === 0 &&
|
|
162
|
+
this.localOperationsMap.size === 0) {
|
|
163
|
+
this.context.log('debug', `Entity ${oid} accessed with no data at all`);
|
|
164
|
+
return { view: null, deleted: true, lastTimestamp: null };
|
|
165
|
+
}
|
|
153
166
|
const confirmed = this.computeConfirmedView(oid);
|
|
154
167
|
const unconfirmedOperations = this.localOperationsMap.get(oid) || [];
|
|
155
168
|
if (confirmed.empty && !unconfirmedOperations.length) {
|
|
@@ -192,7 +205,7 @@ class DocumentFamilyCache extends common_1.EventSubscriber {
|
|
|
192
205
|
return null;
|
|
193
206
|
return this.storeTools.time.getWallClockTime(logicalTimestamp);
|
|
194
207
|
};
|
|
195
|
-
this.getEntity = (oid, schema, parent) => {
|
|
208
|
+
this.getEntity = (oid, schema, parent, readonlyKeys) => {
|
|
196
209
|
let entityRef = this.entities.get(oid);
|
|
197
210
|
let entity = entityRef === null || entityRef === void 0 ? void 0 : entityRef.deref();
|
|
198
211
|
if (!entity) {
|
|
@@ -202,9 +215,10 @@ class DocumentFamilyCache extends common_1.EventSubscriber {
|
|
|
202
215
|
fieldSchema: schema,
|
|
203
216
|
store: this.storeTools,
|
|
204
217
|
parent,
|
|
218
|
+
readonlyKeys,
|
|
205
219
|
});
|
|
206
220
|
// immediately add to cache and queue a removal if nobody subscribed
|
|
207
|
-
this.entities.set(oid,
|
|
221
|
+
this.entities.set(oid, this.context.weakRef(entity));
|
|
208
222
|
}
|
|
209
223
|
return entity;
|
|
210
224
|
};
|
|
@@ -215,27 +229,28 @@ class DocumentFamilyCache extends common_1.EventSubscriber {
|
|
|
215
229
|
this.entities.forEach((entity) => { var _a; return (_a = entity.deref()) === null || _a === void 0 ? void 0 : _a.dispose(); });
|
|
216
230
|
this.entities.clear();
|
|
217
231
|
};
|
|
218
|
-
this.reset = (operations, baselines,
|
|
219
|
-
|
|
220
|
-
* Whether to drop operations which are only in-memory. Unconfirmed operations
|
|
221
|
-
* will not be restored from storage until they are persisted, so it's not advisable
|
|
222
|
-
* to use this unless the intention is to completely clear the entities.
|
|
223
|
-
*/
|
|
224
|
-
dropUnconfirmed = false) => {
|
|
225
|
-
var _a, _b;
|
|
232
|
+
this.reset = ({ operations, baselines, dropExistingUnconfirmed: dropUnconfirmed = false, unconfirmedOperations, dropAll, }) => {
|
|
233
|
+
this.context.log('debug', `Resetting cache for ${this.oid} with ${operations.length} ops and ${baselines.length} baselines, dropUnconfirmed=${dropUnconfirmed}`);
|
|
226
234
|
const info = { isLocal: false, affectedOids: new Set() };
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
235
|
+
// NOTE: not clearing these maps... there are even more
|
|
236
|
+
// race conditions where we begin opening a cache, queue up a
|
|
237
|
+
// reset, then receive incoming operations before the reset
|
|
238
|
+
// actually hits this function, so those incoming ops are
|
|
239
|
+
// dropped.
|
|
240
|
+
// FIXME: include this in a future refactor of this
|
|
241
|
+
// whole system.
|
|
242
|
+
if (dropAll)
|
|
243
|
+
this.baselinesMap.clear();
|
|
244
|
+
this.insertBaselines(baselines, info);
|
|
245
|
+
if (dropAll)
|
|
246
|
+
this.operationsMap.clear();
|
|
247
|
+
this.insertOperations(operations, info);
|
|
248
|
+
if (unconfirmedOperations || dropUnconfirmed) {
|
|
249
|
+
this.localOperationsMap.clear();
|
|
250
|
+
if (unconfirmedOperations) {
|
|
251
|
+
this.insertLocalOperations(unconfirmedOperations);
|
|
236
252
|
}
|
|
237
253
|
}
|
|
238
|
-
this.insertOperations(operations, info);
|
|
239
254
|
for (const oid of this.entities.keys()) {
|
|
240
255
|
const entityRef = this.entities.get(oid);
|
|
241
256
|
const entity = entityRef === null || entityRef === void 0 ? void 0 : entityRef.deref();
|
|
@@ -260,6 +275,9 @@ class DocumentFamilyCache extends common_1.EventSubscriber {
|
|
|
260
275
|
};
|
|
261
276
|
this.context = context;
|
|
262
277
|
}
|
|
278
|
+
get weakRef() {
|
|
279
|
+
return this.context.weakRef;
|
|
280
|
+
}
|
|
263
281
|
}
|
|
264
282
|
exports.DocumentFamilyCache = DocumentFamilyCache;
|
|
265
283
|
//# sourceMappingURL=DocumentFamiliyCache.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DocumentFamiliyCache.js","sourceRoot":"","sources":["../../../src/entities/DocumentFamiliyCache.ts"],"names":[],"mappings":";;;AAAA,gDAU6B;AAC7B,2CAAgE;
|
|
1
|
+
{"version":3,"file":"DocumentFamiliyCache.js","sourceRoot":"","sources":["../../../src/entities/DocumentFamiliyCache.ts"],"names":[],"mappings":";;;AAAA,gDAU6B;AAC7B,2CAAgE;AAIhE,0DAAoD;AAEpD;;;;;;;;;;;;;GAaG;AACH,MAAa,mBAAoB,SAAQ,wBAIxC;IAYA,IAAI,kBAAkB;QACrB,OAAO,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC;IAClC,CAAC;IAKD,YAAY,EACX,GAAG,EACH,KAAK,EACL,OAAO,GAKP;QACA,KAAK,EAAE,CAAC;QAtBD,aAAQ,GAA2C,IAAI,GAAG,EAAE,CAAC;QAK7D,iBAAY,GAAG,IAAI,0BAAU,EAAW,CAAC;QAIjD,mBAAc,GAAG,GAAG,EAAE;YACrB,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QACjC,CAAC,CAAC;QA+BF,0BAAqB,GAAG,CAAC,UAAuB,EAAE,EAAE;YACnD,MAAM,MAAM,GAAG,IAAI,GAAG,EAAoB,CAAC;YAC3C,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE;gBACnC,MAAM,EAAE,GAAG,EAAE,GAAG,SAAS,CAAC;gBAC1B,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;gBAChB,MAAM,kBAAkB,GAAG,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;gBAClE,kBAAkB,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;gBACnC,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,GAAG,EAAE,kBAAkB,CAAC,CAAC;aACrD;YACD,KAAK,MAAM,GAAG,IAAI,MAAM,EAAE;gBACzB,MAAM,SAAS,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;gBACzC,MAAM,MAAM,GAAG,SAAS,aAAT,SAAS,uBAAT,SAAS,CAAE,KAAK,EAAE,CAAC;gBAClC,IAAI,MAAM,EAAE;oBACX,IAAA,yBAAa,EAAC,MAAM,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;oBACzC,IAAI,CAAC,IAAI,CAAC,UAAU,GAAG,EAAE,CAAC,CAAC;oBAC3B,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC;iBAC3B;aACD;QACF,CAAC,CAAC;QAEF,qBAAgB,GAAG,CAClB,UAA6B,EAC7B,IAGC,EACA,EAAE;;YACH,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE;gBACnC,MAAM,EAAE,GAAG,EAAE,GAAG,SAAS,CAAC;gBAC1B,MAAA,IAAI,CAAC,YAAY,0CAAE,GAAG,CAAC,GAAG,CAAC,CAAC;gBAC5B,MAAM,kBAAkB,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;gBAC7D,+BAA+B;gBAC/B,MAAM,KAAK,GAAG,kBAAkB,CAAC,SAAS,CACzC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,SAAS,IAAI,SAAS,CAAC,SAAS,CAC3C,CAAC;gBACF,8DAA8D;gBAC9D,IAAI,KAAK,KAAK,CAAC,CAAC,EAAE;oBACjB,IAAI,kBAAkB,CAAC,KAAK,CAAC,CAAC,SAAS,KAAK,SAAS,CAAC,SAAS,EAAE;wBAChE,SAAS;qBACT;oBACD,kBAAkB,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,EAAE,SAAS,CAAC,CAAC;iBAC/C;qBAAM;oBACN,kBAAkB,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;iBACnC;gBACD,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,GAAG,EAAE,kBAAkB,CAAC,CAAC;gBAEhD,2BAA2B;gBAC3B,MAAM,qBAAqB,GAAG,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;gBAC/D,IAAI,qBAAqB,EAAE;oBAC1B,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAC1B,GAAG,EACH,qBAAqB,CAAC,MAAM,CAC3B,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,SAAS,KAAK,SAAS,CAAC,SAAS,CAC5C,CACD,CAAC;iBACF;aACD;QACF,CAAC,CAAC;QAEF;;;WAGG;QACH,oBAAe,GAAG,CACjB,SAA6B,EAC7B,EACC,YAAY,GACgD,EAC5D,EAAE;;YACH,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE;gBACjC,MAAM,EAAE,GAAG,EAAE,GAAG,QAAQ,CAAC;gBACzB,oCAAoC;gBACpC,MAAM,QAAQ,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;gBAC5C,IAAI,CAAA,QAAQ,aAAR,QAAQ,uBAAR,QAAQ,CAAE,SAAS,KAAI,QAAQ,CAAC,SAAS,IAAI,QAAQ,CAAC,SAAS,EAAE;oBACpE,SAAS;iBACT;gBAED,YAAY,aAAZ,YAAY,uBAAZ,YAAY,CAAE,GAAG,CAAC,GAAG,CAAC,CAAC;gBACvB,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;gBACrC,sCAAsC;gBACtC,MAAM,GAAG,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;gBAC9C,OAAO,CAAA,MAAA,GAAG,CAAC,CAAC,CAAC,0CAAE,SAAS,IAAG,QAAQ,CAAC,SAAS,EAAE;oBAC9C,GAAG,CAAC,KAAK,EAAE,CAAC;iBACZ;aACD;QACF,CAAC,CAAC;QAEF,YAAO,GAAG,CAAC,EACV,UAAU,EACV,SAAS,EACT,KAAK,EACL,OAAO,GAMP,EAAE,EAAE;YACJ,IAAI,KAAK,EAAE;gBACV,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,CAAC;gBAC3B,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,CAAC;aAC1B;YACD,MAAM,IAAI,GAAG;gBACZ,OAAO,EAAE,OAAO,IAAI,KAAK;gBACzB,YAAY,EAAE,IAAI,GAAG,EAAoB;aACzC,CAAC;YACF,IAAI,CAAC,eAAe,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;YACtC,yDAAyD;YACzD,wCAAwC;YACxC,IAAI,CAAC,gBAAgB,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;YACxC,IAAI,KAAK,EAAE;gBACV,KAAK,MAAM,SAAS,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,EAAE;oBAC/C,MAAM,MAAM,GAAG,SAAS,CAAC,KAAK,EAAE,CAAC;oBACjC,IAAI,MAAM,EAAE;wBACX,IAAA,yBAAa,EAAC,MAAM,EAAE,IAAI,CAAC,CAAC;qBAC5B;iBACD;aACD;iBAAM;gBACN,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,YAAY,EAAE;oBACpC,MAAM,SAAS,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;oBACzC,MAAM,MAAM,GAAG,SAAS,aAAT,SAAS,uBAAT,SAAS,CAAE,KAAK,EAAE,CAAC;oBAClC,IAAI,MAAM,EAAE;wBACX,IAAA,yBAAa,EAAC,MAAM,EAAE,IAAI,CAAC,CAAC;wBAC5B,IAAI,CAAC,IAAI,CAAC,UAAU,GAAG,EAAE,CAAC,CAAC;wBAC3B,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC;qBAC3B;iBACD;aACD;QACF,CAAC,CAAC;QAEM,oBAAe,GAAG,CACzB,IAAS,EACT,OAAgB,EAChB,UAAuB,EACvB,KAAc,EAKb,EAAE;YACH,IAAI,UAAU,GAAuB,SAAS,CAAC;YAC/C,MAAM,GAAG,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;YAChC,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE;gBACnC,IAAI,KAAK,IAAI,SAAS,CAAC,SAAS,IAAI,KAAK,EAAE;oBAC1C,SAAS;iBACT;gBACD,IAAI,IAAA,uCAA8B,EAAC,SAAS,CAAC,SAAS,EAAE,GAAG,CAAC,GAAG,CAAC,EAAE;oBACjE,8CAA8C;oBAC9C,UAAU,GAAG,SAAS,CAAC,SAAS,CAAC;oBACjC,SAAS;iBACT;gBACD,IAAI,SAAS,CAAC,IAAI,CAAC,EAAE,KAAK,QAAQ,EAAE;oBACnC,OAAO,GAAG,IAAI,CAAC;iBACf;qBAAM;oBACN,IAAI,GAAG,IAAA,mBAAU,EAAC,IAAI,EAAE,SAAS,CAAC,IAAI,CAAC,CAAC;oBACxC,IAAI,SAAS,CAAC,IAAI,CAAC,EAAE,KAAK,YAAY,EAAE;wBACvC,OAAO,GAAG,KAAK,CAAC;qBAChB;iBACD;aACD;YACD,IAAI,UAAU,EAAE;gBACf,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,IAAI,CAAC,YAAY,EAAE,UAAU,CAAC,CAAC;aACzD;YACD,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,CAAC;QAC9D,CAAC,CAAC;QAEF,gBAAW,GAAG,CAAC,GAAqB,EAAE,EAAE;YACvC,IACC,IAAI,CAAC,YAAY,CAAC,IAAI,KAAK,CAAC;gBAC5B,IAAI,CAAC,aAAa,CAAC,IAAI,KAAK,CAAC;gBAC7B,IAAI,CAAC,kBAAkB,CAAC,IAAI,KAAK,CAAC,EACjC;gBACD,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,EAAE,UAAU,GAAG,+BAA+B,CAAC,CAAC;gBACxE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC;aAC1D;YACD,MAAM,SAAS,GAAG,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,CAAC;YACjD,MAAM,qBAAqB,GAAG,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;YACrE,IAAI,SAAS,CAAC,KAAK,IAAI,CAAC,qBAAqB,CAAC,MAAM,EAAE;gBACrD,IAAI,CAAC,OAAO,CAAC,GAAG,CACf,OAAO,EACP,UAAU,GAAG,qCAAqC,CAClD,CAAC;gBACF,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC;aAC1D;YACD,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC,eAAe,CAC3C,SAAS,CAAC,IAAI,EACd,SAAS,CAAC,OAAO,EACjB,qBAAqB,CACrB,CAAC;YACF,IAAI,IAAI,EAAE;gBACT,IAAA,kBAAS,EAAC,IAAI,EAAE,GAAG,CAAC,CAAC;aACrB;YACD,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,aAAa,EAAE,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,EAAE,CAAC;QACrE,CAAC,CAAC;QAEF,yBAAoB,GAAG,CACtB,GAAqB,EAKpB,EAAE;YACH,MAAM,QAAQ,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YAC5C,MAAM,UAAU,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;YACrD,MAAM,QAAQ,GAAG,IAAA,kBAAS,EAAC,CAAA,QAAQ,aAAR,QAAQ,uBAAR,QAAQ,CAAE,QAAQ,KAAI,SAAS,CAAC,CAAC;YAC5D,MAAM,MAAM,GAAG,IAAI,CAAC,eAAe,CAClC,QAAQ,EACR,CAAC,QAAQ,EACT,UAAU,EACV,QAAQ,aAAR,QAAQ,uBAAR,QAAQ,CAAE,SAAS,CACnB,CAAC;YACF,IAAI,MAAM,CAAC,IAAI,EAAE;gBAChB,IAAA,kBAAS,EAAC,MAAM,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;aAC5B;YACD,IAAI,MAAM,CAAC,KAAK,EAAE;gBACjB,IAAI,CAAC,OAAO,CAAC,GAAG,CACf,OAAO,EACP,UAAU,GAAG,kCAAkC,CAC/C,CAAC;aACF;YACD,OAAO,MAAM,CAAC;QACf,CAAC,CAAC;QAEF,qBAAgB,GAAG,CAAC,GAAqB,EAAE,EAAE;;YAC5C,IAAI,UAAU,GAAG,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YAClD,IAAI,CAAC,CAAA,UAAU,aAAV,UAAU,uBAAV,UAAU,CAAE,MAAM,CAAA,EAAE;gBACxB,UAAU,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;aAC/C;YACD,IAAI,gBAAgB,GAAkB,IAAI,CAAC;YAC3C,IAAI,UAAU,CAAC,MAAM,EAAE;gBACtB,gBAAgB,GAAG,MAAA,UAAU,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC,0CAAE,SAAS,CAAC;aAChE;iBAAM;gBACN,gBAAgB,GAAG,MAAA,MAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC,0CAAE,SAAS,mCAAI,IAAI,CAAC;aACjE;YACD,IAAI,CAAC,gBAAgB;gBAAE,OAAO,IAAI,CAAC;YACnC,OAAO,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,gBAAgB,CAAC,gBAAgB,CAAC,CAAC;QAChE,CAAC,CAAC;QAEF,cAAS,GAAG,CACX,GAAqB,EACrB,MAA0B,EAC1B,MAAe,EACf,YAAuB,EACd,EAAE;YACX,IAAI,SAAS,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YACvC,IAAI,MAAM,GAAG,SAAS,aAAT,SAAS,uBAAT,SAAS,CAAE,KAAK,EAAE,CAAC;YAChC,IAAI,CAAC,MAAM,EAAE;gBACZ,MAAM,GAAG,IAAI,kBAAM,CAAC;oBACnB,GAAG;oBACH,KAAK,EAAE,IAAI;oBACX,WAAW,EAAE,MAAM;oBACnB,KAAK,EAAE,IAAI,CAAC,UAAU;oBACtB,MAAM;oBACN,YAAY;iBACZ,CAAC,CAAC;gBAEH,oEAAoE;gBACpE,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC;aACrD;YAED,OAAO,MAAa,CAAC;QACtB,CAAC,CAAC;QAEF,WAAM,GAAG,CAAC,GAAqB,EAAE,EAAE;YAClC,OAAO,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAClE,CAAC,CAAC;QAEF,YAAO,GAAG,GAAG,EAAE;YACd,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,EAAE,WAAC,OAAA,MAAA,MAAM,CAAC,KAAK,EAAE,0CAAE,OAAO,EAAE,CAAA,EAAA,CAAC,CAAC;YAC7D,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC;QACvB,CAAC,CAAC;QAEF,UAAK,GAAG,CAAC,EACR,UAAU,EACV,SAAS,EACT,uBAAuB,EAAE,eAAe,GAAG,KAAK,EAChD,qBAAqB,EACrB,OAAO,GAiBP,EAAE,EAAE;YACJ,IAAI,CAAC,OAAO,CAAC,GAAG,CACf,OAAO,EACP,uBAAuB,IAAI,CAAC,GAAG,SAAS,UAAU,CAAC,MAAM,YAAY,SAAS,CAAC,MAAM,+BAA+B,eAAe,EAAE,CACrI,CAAC;YACF,MAAM,IAAI,GAAG,EAAE,OAAO,EAAE,KAAK,EAAE,YAAY,EAAE,IAAI,GAAG,EAAoB,EAAE,CAAC;YAE3E,uDAAuD;YACvD,6DAA6D;YAC7D,2DAA2D;YAC3D,yDAAyD;YACzD,WAAW;YACX,mDAAmD;YACnD,gBAAgB;YAEhB,IAAI,OAAO;gBAAE,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,CAAC;YACvC,IAAI,CAAC,eAAe,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;YAEtC,IAAI,OAAO;gBAAE,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,CAAC;YACxC,IAAI,CAAC,gBAAgB,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;YAExC,IAAI,qBAAqB,IAAI,eAAe,EAAE;gBAC7C,IAAI,CAAC,kBAAkB,CAAC,KAAK,EAAE,CAAC;gBAChC,IAAI,qBAAqB,EAAE;oBAC1B,IAAI,CAAC,qBAAqB,CAAC,qBAAqB,CAAC,CAAC;iBAClD;aACD;YAED,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,EAAE;gBACvC,MAAM,SAAS,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;gBACzC,MAAM,MAAM,GAAG,SAAS,aAAT,SAAS,uBAAT,SAAS,CAAE,KAAK,EAAE,CAAC;gBAClC,IAAI,MAAM,EAAE;oBACX,IAAA,yBAAa,EAAC,MAAM,EAAE,IAAI,CAAC,CAAC;oBAC5B,IAAI,CAAC,IAAI,CAAC,UAAU,GAAG,EAAE,CAAC,CAAC;oBAC3B,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC;iBAC3B;aACD;QACF,CAAC,CAAC;QA9VD,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC;QACf,IAAI,CAAC,aAAa,GAAG,IAAI,GAAG,EAAE,CAAC;QAC/B,IAAI,CAAC,kBAAkB,GAAG,IAAI,GAAG,EAAE,CAAC;QACpC,IAAI,CAAC,YAAY,GAAG,IAAI,GAAG,EAAE,CAAC;QAC9B,IAAI,CAAC,UAAU,GAAG;YACjB,kBAAkB,EAAE,KAAK,CAAC,kBAAkB;YAC5C,YAAY,EAAE,KAAK,CAAC,IAAI,CAAC,YAAY;YACrC,OAAO,EAAE,KAAK,CAAC,KAAK,CAAC,GAAG;YACxB,OAAO,EAAE,KAAK,CAAC,KAAK,CAAC,GAAG;YACxB,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI;YACrB,GAAG,EAAE,KAAK,CAAC,IAAI,CAAC,GAAG;SACnB,CAAC;QACF,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;IACxB,CAAC;IAED,IAAI,OAAO;QACV,OAAO,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC;IAC7B,CAAC;CA8UD;AAhYD,kDAgYC"}
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import { EventSubscriber, FileData, ObjectIdentifier, Operation, PatchCreator, StorageFieldSchema, StorageFieldsSchema, TimestampProvider } from '@verdant-web/common';
|
|
2
2
|
import { EntityFile } from '../files/EntityFile.js';
|
|
3
|
-
import { WeakRef } from './FakeWeakRef.js';
|
|
4
3
|
export declare const ADD_OPERATIONS = "@@addOperations";
|
|
5
4
|
export declare const DELETE = "@@delete";
|
|
6
5
|
export declare const REBASE = "@@rebase";
|
|
@@ -14,6 +13,7 @@ export interface CacheTools {
|
|
|
14
13
|
};
|
|
15
14
|
getEntity(oid: ObjectIdentifier, schema: StorageFieldSchema, parent?: Entity): Entity;
|
|
16
15
|
hasOid(oid: ObjectIdentifier): boolean;
|
|
16
|
+
weakRef<T extends object>(value: T): WeakRef<T>;
|
|
17
17
|
}
|
|
18
18
|
export interface StoreTools {
|
|
19
19
|
addLocalOperations(operations: Operation[]): void;
|
|
@@ -56,6 +56,7 @@ export declare class Entity<Init = any, KeyValue extends BaseEntityValue = any,
|
|
|
56
56
|
protected readonly cache: CacheTools;
|
|
57
57
|
protected _deleted: boolean;
|
|
58
58
|
protected parent: WeakRef<Entity<any, any>> | undefined;
|
|
59
|
+
protected readonly readonlyKeys: (keyof Init)[];
|
|
59
60
|
private cachedSnapshot;
|
|
60
61
|
private cachedDestructure;
|
|
61
62
|
private cachedDeepUpdatedAt;
|
|
@@ -69,13 +70,14 @@ export declare class Entity<Init = any, KeyValue extends BaseEntityValue = any,
|
|
|
69
70
|
get updatedAt(): number | null;
|
|
70
71
|
get deepUpdatedAt(): number | null;
|
|
71
72
|
get uid(): string;
|
|
72
|
-
constructor({ oid, store, fieldSchema, cache, parent, onAllUnsubscribed, }: {
|
|
73
|
+
constructor({ oid, store, fieldSchema, cache, parent, onAllUnsubscribed, readonlyKeys, }: {
|
|
73
74
|
oid: ObjectIdentifier;
|
|
74
75
|
store: StoreTools;
|
|
75
76
|
fieldSchema: StorageFieldSchema | StorageFieldsSchema;
|
|
76
77
|
cache: CacheTools;
|
|
77
78
|
parent?: Entity<any, any>;
|
|
78
79
|
onAllUnsubscribed?: () => void;
|
|
80
|
+
readonlyKeys?: (keyof Init)[];
|
|
79
81
|
});
|
|
80
82
|
private [REFRESH];
|
|
81
83
|
private [DEEP_CHANGE];
|
|
@@ -89,6 +91,7 @@ export declare class Entity<Init = any, KeyValue extends BaseEntityValue = any,
|
|
|
89
91
|
protected processInputValue: (value: any, key: any) => any;
|
|
90
92
|
get: <Key extends keyof KeyValue>(key: Key) => KeyValue[Key];
|
|
91
93
|
getAll: () => KeyValue;
|
|
94
|
+
private getFileSnapshot;
|
|
92
95
|
/**
|
|
93
96
|
* Returns a copy of the entity and all sub-objects as
|
|
94
97
|
* a plain object or array.
|
|
@@ -145,6 +148,7 @@ export declare class Entity<Init = any, KeyValue extends BaseEntityValue = any,
|
|
|
145
148
|
some: (predicate: (value: ListItemValue<KeyValue>) => boolean) => boolean;
|
|
146
149
|
every: (predicate: (value: ListItemValue<KeyValue>) => boolean) => boolean;
|
|
147
150
|
find: (predicate: (value: ListItemValue<KeyValue>) => boolean) => ListItemValue<KeyValue> | undefined;
|
|
151
|
+
includes: (item: ListItemValue<KeyValue>) => any;
|
|
148
152
|
}
|
|
149
153
|
export interface BaseEntity<Init, Value extends BaseEntityValue, Snapshot = DataFromInit<Init>> {
|
|
150
154
|
dispose: () => void;
|
|
@@ -190,6 +194,7 @@ export interface ListEntity<Init, Value extends BaseEntityValue, Snapshot = Data
|
|
|
190
194
|
some(predicate: (value: ListItemValue<Value>) => boolean): boolean;
|
|
191
195
|
every(predicate: (value: ListItemValue<Value>) => boolean): boolean;
|
|
192
196
|
find(predicate: (value: ListItemValue<Value>) => boolean): ListItemValue<Value> | undefined;
|
|
197
|
+
includes(value: ListItemValue<Value>): boolean;
|
|
193
198
|
}
|
|
194
199
|
export type AnyEntity<Init, KeyValue extends BaseEntityValue, Snapshot extends any> = ListEntity<Init, KeyValue, Snapshot> | ObjectEntity<Init, KeyValue, Snapshot>;
|
|
195
200
|
type ListItemValue<KeyValue> = KeyValue extends Array<infer T> ? T : never;
|
|
@@ -4,7 +4,6 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
4
4
|
exports.Entity = exports.refreshEntity = exports.DEEP_CHANGE = exports.REBASE = exports.DELETE = exports.ADD_OPERATIONS = void 0;
|
|
5
5
|
const common_1 = require("@verdant-web/common");
|
|
6
6
|
const utils_js_1 = require("../files/utils.js");
|
|
7
|
-
const FakeWeakRef_js_1 = require("./FakeWeakRef.js");
|
|
8
7
|
exports.ADD_OPERATIONS = '@@addOperations';
|
|
9
8
|
exports.DELETE = '@@delete';
|
|
10
9
|
exports.REBASE = '@@rebase';
|
|
@@ -77,7 +76,7 @@ class Entity {
|
|
|
77
76
|
get uid() {
|
|
78
77
|
return this.oid;
|
|
79
78
|
}
|
|
80
|
-
constructor({ oid, store, fieldSchema, cache, parent, onAllUnsubscribed, }) {
|
|
79
|
+
constructor({ oid, store, fieldSchema, cache, parent, onAllUnsubscribed, readonlyKeys = [], }) {
|
|
81
80
|
// if current is null, the entity was deleted.
|
|
82
81
|
this._current = null;
|
|
83
82
|
this._deleted = false;
|
|
@@ -247,6 +246,9 @@ class Entity {
|
|
|
247
246
|
if ((0, common_1.isObjectRef)(item)) {
|
|
248
247
|
return (_c = this.getSubObject(item.id, idx)) === null || _c === void 0 ? void 0 : _c.getSnapshot();
|
|
249
248
|
}
|
|
249
|
+
else if ((0, common_1.isFileRef)(item)) {
|
|
250
|
+
return this.getFileSnapshot(item);
|
|
251
|
+
}
|
|
250
252
|
return item;
|
|
251
253
|
});
|
|
252
254
|
}
|
|
@@ -256,6 +258,9 @@ class Entity {
|
|
|
256
258
|
if ((0, common_1.isObjectRef)(value)) {
|
|
257
259
|
snapshot[key] = (_c = this.getSubObject(value.id, key)) === null || _c === void 0 ? void 0 : _c.getSnapshot();
|
|
258
260
|
}
|
|
261
|
+
else if ((0, common_1.isFileRef)(value)) {
|
|
262
|
+
snapshot[key] = this.getFileSnapshot(value);
|
|
263
|
+
}
|
|
259
264
|
}
|
|
260
265
|
}
|
|
261
266
|
(0, common_1.assignOid)(snapshot, this.oid);
|
|
@@ -275,6 +280,9 @@ class Entity {
|
|
|
275
280
|
return Object.values(this.getAll());
|
|
276
281
|
};
|
|
277
282
|
this.set = (key, value) => {
|
|
283
|
+
if (this.readonlyKeys.includes(key)) {
|
|
284
|
+
throw new Error(`Cannot set readonly key ${key.toString()}`);
|
|
285
|
+
}
|
|
278
286
|
this.addPatches(this.store.patchCreator.createSet(this.oid, key, this.processInputValue(value, key)));
|
|
279
287
|
};
|
|
280
288
|
this.delete = (key) => {
|
|
@@ -296,6 +304,9 @@ class Entity {
|
|
|
296
304
|
}
|
|
297
305
|
};
|
|
298
306
|
this.getDeleteMode = (key) => {
|
|
307
|
+
if (this.readonlyKeys.includes(key)) {
|
|
308
|
+
return false;
|
|
309
|
+
}
|
|
299
310
|
// 'any' is always deletable, and map values can be removed completely
|
|
300
311
|
if (this.fieldSchema.type === 'any' || this.fieldSchema.type === 'map') {
|
|
301
312
|
return 'delete';
|
|
@@ -339,6 +350,9 @@ class Entity {
|
|
|
339
350
|
throw new Error('Cannot use .update without merge if the field has a strict schema type. merge: false is only available on "any" or "map" types.');
|
|
340
351
|
}
|
|
341
352
|
for (const [key, field] of Object.entries(value)) {
|
|
353
|
+
if (this.readonlyKeys.includes(key)) {
|
|
354
|
+
throw new Error(`Cannot set readonly key ${key.toString()}`);
|
|
355
|
+
}
|
|
342
356
|
const fieldSchema = this.getChildFieldSchema(key);
|
|
343
357
|
if (fieldSchema) {
|
|
344
358
|
(0, common_1.traverseCollectionFieldsAndApplyDefaults)(field, fieldSchema);
|
|
@@ -442,13 +456,17 @@ class Entity {
|
|
|
442
456
|
this.find = (predicate) => {
|
|
443
457
|
return this.getAsWrapped().find(predicate);
|
|
444
458
|
};
|
|
459
|
+
this.includes = (item) => {
|
|
460
|
+
return this.has(item);
|
|
461
|
+
};
|
|
445
462
|
this.oid = oid;
|
|
446
463
|
const { collection } = (0, common_1.decomposeOid)(oid);
|
|
447
464
|
this.collection = collection;
|
|
448
|
-
this.parent = parent && new FakeWeakRef_js_1.WeakRef(parent);
|
|
449
465
|
this.store = store;
|
|
450
466
|
this.fieldSchema = fieldSchema;
|
|
467
|
+
this.readonlyKeys = readonlyKeys;
|
|
451
468
|
this.cache = cache;
|
|
469
|
+
this.parent = parent && this.cache.weakRef(parent);
|
|
452
470
|
const { view, deleted, lastTimestamp } = this.cache.computeView(oid);
|
|
453
471
|
this._current = view;
|
|
454
472
|
this._deleted = deleted;
|
|
@@ -464,6 +482,18 @@ class Entity {
|
|
|
464
482
|
}
|
|
465
483
|
(0, common_1.assert)(!!fieldSchema, 'Field schema must be provided');
|
|
466
484
|
}
|
|
485
|
+
getFileSnapshot(item) {
|
|
486
|
+
const file = this.store.getFile(item.id);
|
|
487
|
+
if (file.url) {
|
|
488
|
+
return { id: item.id, url: file.url };
|
|
489
|
+
}
|
|
490
|
+
else if (file.loading || file.failed) {
|
|
491
|
+
return { id: item.id, url: undefined };
|
|
492
|
+
}
|
|
493
|
+
else {
|
|
494
|
+
return { id: item.id, url: null };
|
|
495
|
+
}
|
|
496
|
+
}
|
|
467
497
|
get length() {
|
|
468
498
|
return this.value.length;
|
|
469
499
|
}
|