@osdk/client 2.2.0-beta.7 → 2.2.0-beta.9
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/CHANGELOG.md +43 -0
- package/build/browser/Client.js.map +1 -1
- package/build/browser/createClient.js +11 -4
- package/build/browser/createClient.js.map +1 -1
- package/build/browser/createMinimalClient.js +2 -2
- package/build/browser/createMinimalClient.js.map +1 -1
- package/build/browser/index.js +1 -0
- package/build/browser/index.js.map +1 -1
- package/build/browser/object/SimpleOsdkProperties.js +2 -0
- package/build/browser/object/SimpleOsdkProperties.js.map +1 -0
- package/build/browser/object/convertWireToOsdkObjects/BaseHolder.js +2 -0
- package/build/browser/object/convertWireToOsdkObjects/BaseHolder.js.map +1 -0
- package/build/browser/object/convertWireToOsdkObjects/InterfaceHolder.js.map +1 -1
- package/build/browser/object/convertWireToOsdkObjects/ObjectHolder.js.map +1 -1
- package/build/browser/object/convertWireToOsdkObjects/createOsdkInterface.js +25 -0
- package/build/browser/object/convertWireToOsdkObjects/createOsdkInterface.js.map +1 -1
- package/build/browser/object/convertWireToOsdkObjects/createOsdkObject.js +10 -3
- package/build/browser/object/convertWireToOsdkObjects/createOsdkObject.js.map +1 -1
- package/build/browser/object/convertWireToOsdkObjects/getDollarAs.js.map +1 -1
- package/build/browser/object/convertWireToOsdkObjects/getDollarLink.js.map +1 -1
- package/build/browser/object/convertWireToOsdkObjects.js +12 -3
- package/build/browser/object/convertWireToOsdkObjects.js.map +1 -1
- package/build/browser/object/convertWireToOsdkObjects.test.js +7 -3
- package/build/browser/object/convertWireToOsdkObjects.test.js.map +1 -1
- package/build/browser/object/createObjectSpecifierFromPrimaryKey.js +20 -0
- package/build/browser/object/createObjectSpecifierFromPrimaryKey.js.map +1 -0
- package/build/browser/object/fetchPage.js +13 -1
- package/build/browser/object/fetchPage.js.map +1 -1
- package/build/browser/object/fetchPage.test.js +56 -2
- package/build/browser/object/fetchPage.test.js.map +1 -1
- package/build/browser/object/object.test.js +109 -0
- package/build/browser/object/object.test.js.map +1 -1
- package/build/browser/objectSet/InterfaceObjectSet.test.js +18 -2
- package/build/browser/objectSet/InterfaceObjectSet.test.js.map +1 -1
- package/build/browser/objectSet/ObjectSet.test.js +104 -100
- package/build/browser/objectSet/ObjectSet.test.js.map +1 -1
- package/build/browser/objectSet/ObjectSetListenerWebsocket.js +18 -14
- package/build/browser/objectSet/ObjectSetListenerWebsocket.js.map +1 -1
- package/build/browser/objectSet/ObjectSetListenerWebsocket.test.js +2 -0
- package/build/browser/objectSet/ObjectSetListenerWebsocket.test.js.map +1 -1
- package/build/browser/objectSet/createObjectSet.js.map +1 -1
- package/build/browser/observable/ListPayload.js.map +1 -1
- package/build/browser/observable/ObjectPayload.js.map +1 -1
- package/build/browser/observable/ObservableClient.js.map +1 -1
- package/build/browser/observable/internal/ActionApplication.js +29 -29
- package/build/browser/observable/internal/ActionApplication.js.map +1 -1
- package/build/browser/observable/internal/CacheKey.js +1 -1
- package/build/browser/observable/internal/CacheKey.js.map +1 -1
- package/build/browser/observable/internal/CacheKeys.js +2 -2
- package/build/browser/observable/internal/CacheKeys.js.map +1 -1
- package/build/browser/observable/internal/{ChangedObjects.js → Changes.js} +20 -9
- package/build/browser/observable/internal/Changes.js.map +1 -0
- package/build/browser/observable/internal/Layer.js +3 -0
- package/build/browser/observable/internal/Layer.js.map +1 -1
- package/build/browser/observable/internal/ListQuery.js +411 -170
- package/build/browser/observable/internal/ListQuery.js.map +1 -1
- package/build/browser/observable/internal/ObjectQuery.js +32 -16
- package/build/browser/observable/internal/ObjectQuery.js.map +1 -1
- package/build/browser/observable/internal/ObservableClientImpl.js +4 -12
- package/build/browser/observable/internal/ObservableClientImpl.js.map +1 -1
- package/build/browser/observable/internal/OptimisticJob.js.map +1 -1
- package/build/browser/observable/internal/OrderByCanonicalizer.js +73 -0
- package/build/browser/observable/internal/OrderByCanonicalizer.js.map +1 -0
- package/build/browser/observable/internal/OrderByCanonicalizer.test.js +78 -0
- package/build/browser/observable/internal/OrderByCanonicalizer.test.js.map +1 -0
- package/build/browser/observable/internal/Query.js +64 -31
- package/build/browser/observable/internal/Query.js.map +1 -1
- package/build/browser/observable/internal/RefCounts.js +7 -2
- package/build/browser/observable/internal/RefCounts.js.map +1 -1
- package/build/browser/observable/internal/SimpleWhereClause.js +2 -0
- package/build/browser/observable/internal/SimpleWhereClause.js.map +1 -0
- package/build/browser/observable/internal/Store.js +84 -267
- package/build/browser/observable/internal/Store.js.map +1 -1
- package/build/browser/observable/internal/Store.test.js +264 -247
- package/build/browser/observable/internal/Store.test.js.map +1 -1
- package/build/browser/observable/internal/WhereClauseCanonicalizer.js +11 -3
- package/build/browser/observable/internal/WhereClauseCanonicalizer.js.map +1 -1
- package/build/browser/observable/internal/objectMatchesWhereClause.js.map +1 -1
- package/build/browser/observable/internal/objectMatchesWhereClause.test.js.map +1 -1
- package/build/browser/observable/internal/testUtils.js +82 -18
- package/build/browser/observable/internal/testUtils.js.map +1 -1
- package/build/browser/public/unstable-do-not-use.js.map +1 -1
- package/build/browser/queries/applyQuery.js +33 -1
- package/build/browser/queries/applyQuery.js.map +1 -1
- package/build/browser/queries/queries.test.js +26 -5
- package/build/browser/queries/queries.test.js.map +1 -1
- package/build/browser/util/UserAgent.js +1 -1
- package/build/browser/util/toDataValueQueries.js +17 -0
- package/build/browser/util/toDataValueQueries.js.map +1 -1
- package/build/cjs/{Client-C8K3E1vH.d.cts → Client-DBTcM9gB.d.cts} +1 -1
- package/build/cjs/{chunk-JPENHIJB.cjs → chunk-EY52J5Z4.cjs} +25 -15
- package/build/cjs/chunk-EY52J5Z4.cjs.map +1 -0
- package/build/cjs/{chunk-IU47QMYO.cjs → chunk-MCQVHD2F.cjs} +32 -28
- package/build/cjs/chunk-MCQVHD2F.cjs.map +1 -0
- package/build/cjs/chunk-T4NIFYZS.cjs +14 -0
- package/build/cjs/chunk-T4NIFYZS.cjs.map +1 -0
- package/build/cjs/index.cjs +154 -73
- package/build/cjs/index.cjs.map +1 -1
- package/build/cjs/index.d.cts +6 -4
- package/build/cjs/public/internal.cjs +6 -6
- package/build/cjs/public/internal.d.cts +1 -1
- package/build/cjs/public/unstable-do-not-use.cjs +683 -539
- package/build/cjs/public/unstable-do-not-use.cjs.map +1 -1
- package/build/cjs/public/unstable-do-not-use.d.cts +28 -27
- package/build/esm/Client.js.map +1 -1
- package/build/esm/createClient.js +11 -4
- package/build/esm/createClient.js.map +1 -1
- package/build/esm/createMinimalClient.js +2 -2
- package/build/esm/createMinimalClient.js.map +1 -1
- package/build/esm/index.js +1 -0
- package/build/esm/index.js.map +1 -1
- package/build/esm/object/SimpleOsdkProperties.js +2 -0
- package/build/esm/object/SimpleOsdkProperties.js.map +1 -0
- package/build/esm/object/convertWireToOsdkObjects/BaseHolder.js +2 -0
- package/build/esm/object/convertWireToOsdkObjects/BaseHolder.js.map +1 -0
- package/build/esm/object/convertWireToOsdkObjects/InterfaceHolder.js.map +1 -1
- package/build/esm/object/convertWireToOsdkObjects/ObjectHolder.js.map +1 -1
- package/build/esm/object/convertWireToOsdkObjects/createOsdkInterface.js +25 -0
- package/build/esm/object/convertWireToOsdkObjects/createOsdkInterface.js.map +1 -1
- package/build/esm/object/convertWireToOsdkObjects/createOsdkObject.js +10 -3
- package/build/esm/object/convertWireToOsdkObjects/createOsdkObject.js.map +1 -1
- package/build/esm/object/convertWireToOsdkObjects/getDollarAs.js.map +1 -1
- package/build/esm/object/convertWireToOsdkObjects/getDollarLink.js.map +1 -1
- package/build/esm/object/convertWireToOsdkObjects.js +12 -3
- package/build/esm/object/convertWireToOsdkObjects.js.map +1 -1
- package/build/esm/object/convertWireToOsdkObjects.test.js +7 -3
- package/build/esm/object/convertWireToOsdkObjects.test.js.map +1 -1
- package/build/esm/object/createObjectSpecifierFromPrimaryKey.js +20 -0
- package/build/esm/object/createObjectSpecifierFromPrimaryKey.js.map +1 -0
- package/build/esm/object/fetchPage.js +13 -1
- package/build/esm/object/fetchPage.js.map +1 -1
- package/build/esm/object/fetchPage.test.js +56 -2
- package/build/esm/object/fetchPage.test.js.map +1 -1
- package/build/esm/object/object.test.js +109 -0
- package/build/esm/object/object.test.js.map +1 -1
- package/build/esm/objectSet/InterfaceObjectSet.test.js +18 -2
- package/build/esm/objectSet/InterfaceObjectSet.test.js.map +1 -1
- package/build/esm/objectSet/ObjectSet.test.js +104 -100
- package/build/esm/objectSet/ObjectSet.test.js.map +1 -1
- package/build/esm/objectSet/ObjectSetListenerWebsocket.js +18 -14
- package/build/esm/objectSet/ObjectSetListenerWebsocket.js.map +1 -1
- package/build/esm/objectSet/ObjectSetListenerWebsocket.test.js +2 -0
- package/build/esm/objectSet/ObjectSetListenerWebsocket.test.js.map +1 -1
- package/build/esm/objectSet/createObjectSet.js.map +1 -1
- package/build/esm/observable/ListPayload.js.map +1 -1
- package/build/esm/observable/ObjectPayload.js.map +1 -1
- package/build/esm/observable/ObservableClient.js.map +1 -1
- package/build/esm/observable/internal/ActionApplication.js +29 -29
- package/build/esm/observable/internal/ActionApplication.js.map +1 -1
- package/build/esm/observable/internal/CacheKey.js +1 -1
- package/build/esm/observable/internal/CacheKey.js.map +1 -1
- package/build/esm/observable/internal/CacheKeys.js +2 -2
- package/build/esm/observable/internal/CacheKeys.js.map +1 -1
- package/build/esm/observable/internal/{ChangedObjects.js → Changes.js} +20 -9
- package/build/esm/observable/internal/Changes.js.map +1 -0
- package/build/esm/observable/internal/Layer.js +3 -0
- package/build/esm/observable/internal/Layer.js.map +1 -1
- package/build/esm/observable/internal/ListQuery.js +411 -170
- package/build/esm/observable/internal/ListQuery.js.map +1 -1
- package/build/esm/observable/internal/ObjectQuery.js +32 -16
- package/build/esm/observable/internal/ObjectQuery.js.map +1 -1
- package/build/esm/observable/internal/ObservableClientImpl.js +4 -12
- package/build/esm/observable/internal/ObservableClientImpl.js.map +1 -1
- package/build/esm/observable/internal/OptimisticJob.js.map +1 -1
- package/build/esm/observable/internal/OrderByCanonicalizer.js +73 -0
- package/build/esm/observable/internal/OrderByCanonicalizer.js.map +1 -0
- package/build/esm/observable/internal/OrderByCanonicalizer.test.js +78 -0
- package/build/esm/observable/internal/OrderByCanonicalizer.test.js.map +1 -0
- package/build/esm/observable/internal/Query.js +64 -31
- package/build/esm/observable/internal/Query.js.map +1 -1
- package/build/esm/observable/internal/RefCounts.js +7 -2
- package/build/esm/observable/internal/RefCounts.js.map +1 -1
- package/build/esm/observable/internal/SimpleWhereClause.js +2 -0
- package/build/esm/observable/internal/SimpleWhereClause.js.map +1 -0
- package/build/esm/observable/internal/Store.js +84 -267
- package/build/esm/observable/internal/Store.js.map +1 -1
- package/build/esm/observable/internal/Store.test.js +264 -247
- package/build/esm/observable/internal/Store.test.js.map +1 -1
- package/build/esm/observable/internal/WhereClauseCanonicalizer.js +11 -3
- package/build/esm/observable/internal/WhereClauseCanonicalizer.js.map +1 -1
- package/build/esm/observable/internal/objectMatchesWhereClause.js.map +1 -1
- package/build/esm/observable/internal/objectMatchesWhereClause.test.js.map +1 -1
- package/build/esm/observable/internal/testUtils.js +82 -18
- package/build/esm/observable/internal/testUtils.js.map +1 -1
- package/build/esm/public/unstable-do-not-use.js.map +1 -1
- package/build/esm/queries/applyQuery.js +33 -1
- package/build/esm/queries/applyQuery.js.map +1 -1
- package/build/esm/queries/queries.test.js +26 -5
- package/build/esm/queries/queries.test.js.map +1 -1
- package/build/esm/util/UserAgent.js +1 -1
- package/build/esm/util/toDataValueQueries.js +17 -0
- package/build/esm/util/toDataValueQueries.js.map +1 -1
- package/build/types/Client.d.ts +1 -1
- package/build/types/Client.d.ts.map +1 -1
- package/build/types/createClient.d.ts.map +1 -1
- package/build/types/index.d.ts +2 -1
- package/build/types/index.d.ts.map +1 -1
- package/build/types/object/SimpleOsdkProperties.d.ts +1 -0
- package/build/types/object/SimpleOsdkProperties.d.ts.map +1 -0
- package/build/types/object/convertWireToOsdkObjects/BaseHolder.d.ts +1 -0
- package/build/types/object/convertWireToOsdkObjects/BaseHolder.d.ts.map +1 -0
- package/build/types/object/convertWireToOsdkObjects.d.ts +8 -1
- package/build/types/object/convertWireToOsdkObjects.d.ts.map +1 -1
- package/build/types/object/createObjectSpecifierFromPrimaryKey.d.ts +2 -0
- package/build/types/object/createObjectSpecifierFromPrimaryKey.d.ts.map +1 -0
- package/build/types/object/object.test.d.ts.map +1 -1
- package/build/types/objectSet/ObjectSet.test.d.ts.map +1 -1
- package/build/types/observable/ListPayload.d.ts +5 -9
- package/build/types/observable/ListPayload.d.ts.map +1 -1
- package/build/types/observable/ObjectPayload.d.ts +4 -7
- package/build/types/observable/ObjectPayload.d.ts.map +1 -1
- package/build/types/observable/ObservableClient.d.ts +27 -11
- package/build/types/observable/ObservableClient.d.ts.map +1 -1
- package/build/types/observable/internal/ActionApplication.d.ts.map +1 -1
- package/build/types/observable/internal/CacheKeys.d.ts +1 -1
- package/build/types/observable/internal/CacheKeys.d.ts.map +1 -1
- package/build/types/observable/internal/Changes.d.ts +15 -0
- package/build/types/observable/internal/Changes.d.ts.map +1 -0
- package/build/types/observable/internal/Layer.d.ts +1 -0
- package/build/types/observable/internal/Layer.d.ts.map +1 -1
- package/build/types/observable/internal/ListQuery.d.ts +59 -14
- package/build/types/observable/internal/ListQuery.d.ts.map +1 -1
- package/build/types/observable/internal/ObjectQuery.d.ts +5 -6
- package/build/types/observable/internal/ObjectQuery.d.ts.map +1 -1
- package/build/types/observable/internal/OptimisticJob.d.ts +1 -1
- package/build/types/observable/internal/OptimisticJob.d.ts.map +1 -1
- package/build/types/observable/internal/OrderByCanonicalizer.d.ts +12 -0
- package/build/types/observable/internal/OrderByCanonicalizer.d.ts.map +1 -0
- package/build/types/observable/internal/OrderByCanonicalizer.test.d.ts +1 -0
- package/build/types/observable/internal/OrderByCanonicalizer.test.d.ts.map +1 -0
- package/build/types/observable/internal/Query.d.ts +39 -4
- package/build/types/observable/internal/Query.d.ts.map +1 -1
- package/build/types/observable/internal/RefCounts.d.ts.map +1 -1
- package/build/types/observable/internal/SimpleWhereClause.d.ts +2 -0
- package/build/types/observable/internal/SimpleWhereClause.d.ts.map +1 -0
- package/build/types/observable/internal/Store.d.ts +19 -43
- package/build/types/observable/internal/Store.d.ts.map +1 -1
- package/build/types/observable/internal/WhereClauseCanonicalizer.d.ts +2 -1
- package/build/types/observable/internal/WhereClauseCanonicalizer.d.ts.map +1 -1
- package/build/types/observable/internal/objectMatchesWhereClause.d.ts +4 -2
- package/build/types/observable/internal/objectMatchesWhereClause.d.ts.map +1 -1
- package/build/types/observable/internal/testUtils.d.ts +39 -9
- package/build/types/observable/internal/testUtils.d.ts.map +1 -1
- package/build/types/public/unstable-do-not-use.d.ts +1 -4
- package/build/types/public/unstable-do-not-use.d.ts.map +1 -1
- package/build/types/queries/applyQuery.d.ts.map +1 -1
- package/package.json +13 -11
- package/build/browser/observable/internal/ChangedObjects.js.map +0 -1
- package/build/cjs/chunk-IU47QMYO.cjs.map +0 -1
- package/build/cjs/chunk-JPENHIJB.cjs.map +0 -1
- package/build/esm/observable/internal/ChangedObjects.js.map +0 -1
- package/build/types/observable/internal/ChangedObjects.d.ts +0 -11
- package/build/types/observable/internal/ChangedObjects.d.ts.map +0 -1
|
@@ -20,12 +20,12 @@ import { additionalContext } from "../../Client.js";
|
|
|
20
20
|
import { DEBUG_REFCOUNTS } from "../DebugFlags.js";
|
|
21
21
|
import { ActionApplication } from "./ActionApplication.js";
|
|
22
22
|
import { CacheKeys } from "./CacheKeys.js";
|
|
23
|
-
import { createChangedObjects, DEBUG_ONLY__changesToString } from "./
|
|
23
|
+
import { createChangedObjects, DEBUG_ONLY__changesToString } from "./Changes.js";
|
|
24
24
|
import { Entry, Layer } from "./Layer.js";
|
|
25
25
|
import { isListCacheKey, ListQuery } from "./ListQuery.js";
|
|
26
26
|
import { ObjectQuery } from "./ObjectQuery.js";
|
|
27
|
+
import { OrderByCanonicalizer } from "./OrderByCanonicalizer.js";
|
|
27
28
|
import { RefCounts } from "./RefCounts.js";
|
|
28
|
-
import { WeakMapWithEntries } from "./WeakMapWithEntries.js";
|
|
29
29
|
import { WhereClauseCanonicalizer } from "./WhereClauseCanonicalizer.js";
|
|
30
30
|
|
|
31
31
|
/*
|
|
@@ -59,18 +59,6 @@ function createInitEntry(cacheKey) {
|
|
|
59
59
|
- Data is one per layer per cache key
|
|
60
60
|
*/
|
|
61
61
|
|
|
62
|
-
export class OrderByCanonicalizer {
|
|
63
|
-
// crappy version
|
|
64
|
-
#map = new Map();
|
|
65
|
-
canonicalize = orderBy => {
|
|
66
|
-
if (this.#map.has(JSON.stringify(orderBy))) {
|
|
67
|
-
return this.#map.get(JSON.stringify(orderBy));
|
|
68
|
-
} else {
|
|
69
|
-
this.#map.set(JSON.stringify(orderBy), orderBy);
|
|
70
|
-
return orderBy;
|
|
71
|
-
}
|
|
72
|
-
};
|
|
73
|
-
}
|
|
74
62
|
export class Store {
|
|
75
63
|
whereCanonicalizer = new WhereClauseCanonicalizer();
|
|
76
64
|
orderByCanonicalizer = new OrderByCanonicalizer();
|
|
@@ -79,10 +67,15 @@ export class Store {
|
|
|
79
67
|
|
|
80
68
|
/** @internal */
|
|
81
69
|
|
|
82
|
-
|
|
70
|
+
// we can use a regular Map here because the refCounting will
|
|
71
|
+
// handle cleanup.
|
|
72
|
+
#queries = new Map();
|
|
83
73
|
#cacheKeyToSubject = new WeakMap();
|
|
84
74
|
#cacheKeys;
|
|
85
75
|
#refCounts = new RefCounts(DEBUG_REFCOUNTS ? 15_000 : 60_000, k => this.#cleanupCacheKey(k));
|
|
76
|
+
|
|
77
|
+
// we are currently only using this for debug logging and should just remove it in the future if that
|
|
78
|
+
// continues to be true
|
|
86
79
|
#finalizationRegistry;
|
|
87
80
|
constructor(client) {
|
|
88
81
|
this.client = client;
|
|
@@ -197,14 +190,18 @@ export class Store {
|
|
|
197
190
|
}
|
|
198
191
|
return subject;
|
|
199
192
|
};
|
|
193
|
+
canonicalizeWhereClause(where) {
|
|
194
|
+
return this.whereCanonicalizer.canonicalize(where);
|
|
195
|
+
}
|
|
200
196
|
observeObject(apiName, pk, options, subFn) {
|
|
201
197
|
if (typeof apiName !== "string") {
|
|
202
198
|
apiName = apiName.apiName;
|
|
203
199
|
}
|
|
204
200
|
const query = this.getObjectQuery(apiName, pk);
|
|
205
|
-
this
|
|
201
|
+
this.retain(query.cacheKey);
|
|
206
202
|
if (options.mode !== "offline") {
|
|
207
203
|
query.revalidate(options.mode === "force").catch(e => {
|
|
204
|
+
subFn.error(e);
|
|
208
205
|
// we don't want observeObject() to return a promise,
|
|
209
206
|
// so we settle for logging an error here instead of
|
|
210
207
|
// dropping it on the floor.
|
|
@@ -215,156 +212,55 @@ export class Store {
|
|
|
215
212
|
}
|
|
216
213
|
});
|
|
217
214
|
}
|
|
218
|
-
const sub = query.subscribe(
|
|
219
|
-
next: subFn
|
|
220
|
-
});
|
|
215
|
+
const sub = query.subscribe(subFn);
|
|
221
216
|
return {
|
|
222
217
|
unsubscribe: () => {
|
|
223
218
|
sub.unsubscribe();
|
|
224
|
-
this
|
|
219
|
+
this.release(query.cacheKey);
|
|
225
220
|
}
|
|
226
221
|
};
|
|
227
222
|
}
|
|
228
223
|
observeList(options, subFn) {
|
|
229
224
|
// the ListQuery represents the shared state of the list
|
|
230
|
-
const query = this.getListQuery(options.
|
|
231
|
-
this
|
|
225
|
+
const query = this.getListQuery(options.type, options.where ?? {}, options.orderBy ?? {}, options);
|
|
226
|
+
this.retain(query.cacheKey);
|
|
232
227
|
if (options.mode !== "offline") {
|
|
233
|
-
|
|
228
|
+
query.revalidate(options.mode === "force").catch(x => {
|
|
229
|
+
subFn.error(x);
|
|
230
|
+
});
|
|
234
231
|
}
|
|
235
|
-
const sub = query.subscribe(
|
|
236
|
-
next: subFn
|
|
237
|
-
});
|
|
232
|
+
const sub = query.subscribe(subFn);
|
|
238
233
|
if (options.streamUpdates) {
|
|
239
|
-
|
|
240
|
-
type: "object",
|
|
241
|
-
apiName: typeof options.objectType === "string" ? options.objectType : options.objectType.apiName
|
|
242
|
-
};
|
|
243
|
-
let objectSet = this.client(miniDef);
|
|
244
|
-
if (options.where) {
|
|
245
|
-
objectSet = objectSet.where(options.where ?? {});
|
|
246
|
-
}
|
|
247
|
-
const store = this;
|
|
248
|
-
const websocketSubscription = objectSet.subscribe({
|
|
249
|
-
onChange({
|
|
250
|
-
object,
|
|
251
|
-
state
|
|
252
|
-
}) {
|
|
253
|
-
if (process.env.NODE_ENV !== "production") {
|
|
254
|
-
store.logger?.debug({
|
|
255
|
-
methodName: "onError"
|
|
256
|
-
}, "updates", state, object);
|
|
257
|
-
}
|
|
258
|
-
const cacheKey = store.getCacheKey("object", object.$objectType, object.$primaryKey);
|
|
259
|
-
const type = store.#peekQuery(cacheKey) == null ? "addedObjects" : "modifiedObjects";
|
|
260
|
-
const changes = createChangedObjects();
|
|
261
|
-
changes[type].set(object.$objectType, object);
|
|
262
|
-
if (state === "ADDED_OR_UPDATED") {
|
|
263
|
-
// todo, can we do the update without
|
|
264
|
-
// the extra invalidation? maybe a flag to updateObject
|
|
265
|
-
store.updateObject(object.$objectType, object);
|
|
266
|
-
store.maybeRevalidateLists(changes).catch(err => {
|
|
267
|
-
// eslint-disable-next-line no-console
|
|
268
|
-
console.error("Unhandled error in maybeRevalidateLists", err);
|
|
269
|
-
});
|
|
270
|
-
} else if (state === "REMOVED") {
|
|
271
|
-
const changes = createChangedObjects();
|
|
272
|
-
store.batch({
|
|
273
|
-
changes
|
|
274
|
-
}, batch => {
|
|
275
|
-
const existing = batch.read(query.cacheKey);
|
|
276
|
-
const cacheKeyToRemove = store.getCacheKey("object", object.$objectType, object.$primaryKey);
|
|
277
|
-
if (existing?.status === "loaded") {
|
|
278
|
-
const newObjects = existing.value?.data.filter(o => o !== cacheKeyToRemove);
|
|
279
|
-
if (newObjects?.length !== existing.value?.data.length) {
|
|
280
|
-
batch.changes.modifiedLists.add(query.cacheKey);
|
|
281
|
-
batch.write(query.cacheKey, {
|
|
282
|
-
data: newObjects ?? []
|
|
283
|
-
}, "loaded");
|
|
284
|
-
// Should there be an else for this case? Do we need to invalidate
|
|
285
|
-
// the paging tokens we may have?
|
|
286
|
-
}
|
|
287
|
-
} else {
|
|
288
|
-
// There may be a tiny race here where OSW tells us the object has
|
|
289
|
-
// been removed but an outstanding invalidation of this query is
|
|
290
|
-
// about to return. In this case, its possible that we remove this item
|
|
291
|
-
// from the list and then the returned list load re-adds it.
|
|
292
|
-
// To avoid this, we will just force reload the query to be sure
|
|
293
|
-
// we don't leave things in a bad state.
|
|
294
|
-
|
|
295
|
-
if (process.env.NODE_ENV !== "production") {
|
|
296
|
-
store.logger?.info("Removing an object from an object list that is in the middle of being loaded.", existing);
|
|
297
|
-
}
|
|
298
|
-
query.revalidate(/* force */true).catch(e => {
|
|
299
|
-
if (store.logger) {
|
|
300
|
-
store.logger?.error("Uncaught error while revalidating list", e);
|
|
301
|
-
} else {
|
|
302
|
-
// eslint-disable-next-line no-console
|
|
303
|
-
console.error("Uncaught error while revalidating list", e);
|
|
304
|
-
}
|
|
305
|
-
});
|
|
306
|
-
}
|
|
307
|
-
});
|
|
308
|
-
}
|
|
309
|
-
},
|
|
310
|
-
onError(errors) {
|
|
311
|
-
if (process.env.NODE_ENV !== "production") {
|
|
312
|
-
store.logger?.info({
|
|
313
|
-
methodName: "onError"
|
|
314
|
-
}, "subscription errors", errors);
|
|
315
|
-
}
|
|
316
|
-
},
|
|
317
|
-
onOutOfDate() {
|
|
318
|
-
if (process.env.NODE_ENV !== "production") {
|
|
319
|
-
store.logger?.info({
|
|
320
|
-
methodName: "onOutOfDate"
|
|
321
|
-
});
|
|
322
|
-
}
|
|
323
|
-
},
|
|
324
|
-
onSuccessfulSubscription() {
|
|
325
|
-
if (process.env.NODE_ENV !== "production") {
|
|
326
|
-
store.logger?.info({
|
|
327
|
-
methodName: "onSuccessfulSubscription"
|
|
328
|
-
});
|
|
329
|
-
}
|
|
330
|
-
}
|
|
331
|
-
});
|
|
332
|
-
sub.add(() => {
|
|
333
|
-
if (process.env.NODE_ENV !== "production") {
|
|
334
|
-
store.logger?.info({
|
|
335
|
-
methodName: "observeList"
|
|
336
|
-
}, "Unsubscribing from websocket");
|
|
337
|
-
}
|
|
338
|
-
websocketSubscription.unsubscribe();
|
|
339
|
-
});
|
|
234
|
+
query.registerStreamUpdates(sub);
|
|
340
235
|
}
|
|
341
236
|
return {
|
|
342
237
|
unsubscribe: () => {
|
|
343
238
|
sub.unsubscribe();
|
|
344
|
-
this
|
|
239
|
+
this.release(query.cacheKey);
|
|
345
240
|
}
|
|
346
241
|
};
|
|
347
242
|
}
|
|
348
|
-
|
|
243
|
+
peekQuery(cacheKey) {
|
|
349
244
|
return this.#queries.get(cacheKey);
|
|
350
245
|
}
|
|
351
246
|
#getQuery(cacheKey, createQuery) {
|
|
352
|
-
let query = this
|
|
247
|
+
let query = this.peekQuery(cacheKey);
|
|
353
248
|
if (!query) {
|
|
354
249
|
query = createQuery();
|
|
355
250
|
this.#queries.set(cacheKey, query);
|
|
356
251
|
}
|
|
357
252
|
return query;
|
|
358
253
|
}
|
|
359
|
-
getListQuery(
|
|
360
|
-
|
|
361
|
-
apiName
|
|
362
|
-
|
|
254
|
+
getListQuery(def, where, orderBy, opts) {
|
|
255
|
+
const {
|
|
256
|
+
apiName,
|
|
257
|
+
type
|
|
258
|
+
} = def;
|
|
363
259
|
const canonWhere = this.whereCanonicalizer.canonicalize(where);
|
|
364
260
|
const canonOrderBy = this.orderByCanonicalizer.canonicalize(orderBy);
|
|
365
|
-
const listCacheKey = this.getCacheKey("list", apiName, canonWhere, canonOrderBy);
|
|
261
|
+
const listCacheKey = this.getCacheKey("list", type, apiName, canonWhere, canonOrderBy);
|
|
366
262
|
return this.#getQuery(listCacheKey, () => {
|
|
367
|
-
return new ListQuery(this, this.getSubject(listCacheKey), apiName, canonWhere, canonOrderBy, listCacheKey, opts);
|
|
263
|
+
return new ListQuery(this, this.getSubject(listCacheKey), type, apiName, canonWhere, canonOrderBy, listCacheKey, opts);
|
|
368
264
|
});
|
|
369
265
|
}
|
|
370
266
|
getObjectQuery(apiName, pk) {
|
|
@@ -376,13 +272,8 @@ export class Store {
|
|
|
376
272
|
dedupeInterval: 0
|
|
377
273
|
}));
|
|
378
274
|
}
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
apiName = apiName.apiName;
|
|
382
|
-
}
|
|
383
|
-
const objectCacheKey = this.getCacheKey("object", apiName, pk);
|
|
384
|
-
const objEntry = this.#topLayer.get(objectCacheKey);
|
|
385
|
-
return objEntry?.value;
|
|
275
|
+
getValue(cacheKey) {
|
|
276
|
+
return this.#topLayer.get(cacheKey);
|
|
386
277
|
}
|
|
387
278
|
batch = ({
|
|
388
279
|
optimisticId,
|
|
@@ -420,73 +311,63 @@ export class Store {
|
|
|
420
311
|
}
|
|
421
312
|
};
|
|
422
313
|
const retVal = batchFn(batchContext);
|
|
423
|
-
|
|
314
|
+
this.maybeRevalidateQueries(changes, optimisticId).catch(e => {
|
|
315
|
+
// we don't want batch() to return a promise,
|
|
316
|
+
// so we settle for logging an error here instead of
|
|
317
|
+
// dropping it on the floor.
|
|
318
|
+
if (this.logger) {
|
|
319
|
+
this.logger.error("Unhandled error in batch", e);
|
|
320
|
+
} else {
|
|
321
|
+
// eslint-disable-next-line no-console
|
|
322
|
+
console.error("Unhandled error in batch", e);
|
|
323
|
+
throw e;
|
|
324
|
+
}
|
|
325
|
+
});
|
|
424
326
|
return {
|
|
425
327
|
batchResult: batchContext,
|
|
426
|
-
retVal: retVal
|
|
328
|
+
retVal: retVal,
|
|
329
|
+
changes: batchContext.changes
|
|
427
330
|
};
|
|
428
331
|
};
|
|
429
332
|
invalidateObject(apiName, pk) {
|
|
430
333
|
if (typeof apiName !== "string") {
|
|
431
334
|
apiName = apiName.apiName;
|
|
432
335
|
}
|
|
433
|
-
|
|
434
|
-
// inevitably we will want an internal version of this and a "public" one
|
|
435
|
-
// so we can avoid extra requests
|
|
436
|
-
|
|
437
|
-
const query = this.getObjectQuery(apiName, pk);
|
|
438
|
-
return query.revalidate(true);
|
|
439
|
-
|
|
440
|
-
// potentially trigger updates of the lists that included this object?
|
|
441
|
-
// TODO
|
|
442
|
-
// could we detect that a list WOULD include it?
|
|
336
|
+
return this.getObjectQuery(apiName, pk).revalidate(/* force */true);
|
|
443
337
|
}
|
|
444
|
-
async
|
|
338
|
+
async maybeRevalidateQueries(changes, optimisticId) {
|
|
339
|
+
if (changes.isEmpty()) {
|
|
340
|
+
if (process.env.NODE_ENV !== "production") {
|
|
341
|
+
// todo
|
|
342
|
+
this.logger?.child({
|
|
343
|
+
methodName: "maybeRevalidateQueries"
|
|
344
|
+
}).debug("No changes, aborting");
|
|
345
|
+
}
|
|
346
|
+
return;
|
|
347
|
+
}
|
|
445
348
|
if (process.env.NODE_ENV !== "production") {
|
|
446
349
|
// todo
|
|
447
|
-
this.logger?.
|
|
448
|
-
methodName: "
|
|
449
|
-
}
|
|
350
|
+
this.logger?.child({
|
|
351
|
+
methodName: "maybeRevalidateQueries"
|
|
352
|
+
}).debug(DEBUG_ONLY__changesToString(changes), {
|
|
353
|
+
optimisticId
|
|
354
|
+
});
|
|
450
355
|
}
|
|
451
356
|
try {
|
|
452
357
|
const promises = [];
|
|
453
|
-
for (const
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
if (promise) promises.push(promise);
|
|
457
|
-
}
|
|
358
|
+
for (const cacheKey of this.#queries.keys()) {
|
|
359
|
+
const promise = this.peekQuery(cacheKey)?.maybeUpdateAndRevalidate?.(changes, optimisticId);
|
|
360
|
+
if (promise) promises.push(promise);
|
|
458
361
|
}
|
|
459
362
|
await Promise.all(promises);
|
|
460
363
|
} finally {
|
|
461
364
|
if (process.env.NODE_ENV !== "production") {
|
|
462
365
|
// todo
|
|
463
|
-
this.logger?.
|
|
464
|
-
methodName: "
|
|
465
|
-
}
|
|
466
|
-
}
|
|
467
|
-
}
|
|
468
|
-
}
|
|
469
|
-
maybeUpdateLists(changes, optimisticId) {
|
|
470
|
-
if (process.env.NODE_ENV !== "production") {
|
|
471
|
-
this.logger?.trace({
|
|
472
|
-
methodName: "maybeUpdateLists"
|
|
473
|
-
}, DEBUG_ONLY__changesToString(changes), {
|
|
474
|
-
optimisticId
|
|
475
|
-
});
|
|
476
|
-
}
|
|
477
|
-
if (changes.addedObjects.size === 0 && changes.modifiedObjects.size === 0) {
|
|
478
|
-
return Promise.resolve([]);
|
|
479
|
-
}
|
|
480
|
-
const promises = [];
|
|
481
|
-
for (const cacheKey of this.#queries.keys()) {
|
|
482
|
-
if (isListCacheKey(cacheKey)) {
|
|
483
|
-
if (!changes.modifiedLists.has(cacheKey)) {
|
|
484
|
-
const promise = this.#peekQuery(cacheKey)?.maybeUpdateAndRevalidate(changes, optimisticId);
|
|
485
|
-
if (promise) promises.push(promise);
|
|
486
|
-
}
|
|
366
|
+
this.logger?.child({
|
|
367
|
+
methodName: "maybeRevalidateQueries"
|
|
368
|
+
}).debug("in finally", DEBUG_ONLY__changesToString(changes));
|
|
487
369
|
}
|
|
488
370
|
}
|
|
489
|
-
return Promise.all(promises);
|
|
490
371
|
}
|
|
491
372
|
|
|
492
373
|
/**
|
|
@@ -499,93 +380,23 @@ export class Store {
|
|
|
499
380
|
apiName = apiName.apiName;
|
|
500
381
|
}
|
|
501
382
|
if (process.env.NODE_ENV !== "production") {
|
|
502
|
-
this.logger?.
|
|
383
|
+
this.logger?.child({
|
|
503
384
|
methodName: "invalidateObjectType"
|
|
504
|
-
}
|
|
385
|
+
}).info(changes ? DEBUG_ONLY__changesToString(changes) : void 0);
|
|
505
386
|
}
|
|
506
387
|
const promises = [];
|
|
507
|
-
for (const
|
|
508
|
-
if (isListCacheKey(cacheKey
|
|
509
|
-
if (!changes || !changes.
|
|
510
|
-
const promise = this
|
|
388
|
+
for (const cacheKey of this.#truthLayer.keys()) {
|
|
389
|
+
if (isListCacheKey(cacheKey)) {
|
|
390
|
+
if (!changes || !changes.modified.has(cacheKey)) {
|
|
391
|
+
const promise = this.peekQuery(cacheKey)?.revalidate(true);
|
|
511
392
|
if (promise) {
|
|
512
393
|
promises.push(promise);
|
|
513
|
-
changes?.
|
|
394
|
+
changes?.modified.add(cacheKey);
|
|
514
395
|
}
|
|
515
396
|
}
|
|
516
397
|
}
|
|
517
398
|
}
|
|
518
|
-
return Promise.all(promises);
|
|
519
|
-
}
|
|
520
|
-
invalidateList({
|
|
521
|
-
objectType,
|
|
522
|
-
where,
|
|
523
|
-
orderBy
|
|
524
|
-
}) {
|
|
525
|
-
if (typeof objectType !== "string") {
|
|
526
|
-
objectType = objectType.apiName;
|
|
527
|
-
}
|
|
528
|
-
where = this.whereCanonicalizer.canonicalize(where ?? {});
|
|
529
|
-
orderBy = this.orderByCanonicalizer.canonicalize(orderBy ?? {});
|
|
530
|
-
const cacheKey = this.getCacheKey("list", objectType, where, orderBy);
|
|
531
|
-
void this.#peekQuery(cacheKey)?.revalidate(true);
|
|
532
|
-
}
|
|
533
|
-
updateObject(apiName, value, {
|
|
534
|
-
optimisticId
|
|
535
|
-
} = {}) {
|
|
536
|
-
if (typeof apiName !== "string") {
|
|
537
|
-
apiName = apiName.apiName;
|
|
538
|
-
}
|
|
539
|
-
const query = this.getObjectQuery(apiName, value.$primaryKey);
|
|
540
|
-
return this.batch({
|
|
541
|
-
optimisticId
|
|
542
|
-
}, batch => {
|
|
543
|
-
return query.writeToStore(value, "loaded", batch);
|
|
544
|
-
}).retVal.value;
|
|
545
|
-
}
|
|
546
|
-
updateObjects(values, batch) {
|
|
547
|
-
// update the cache for any object that has changed
|
|
548
|
-
// and save the mapped values to return
|
|
549
|
-
return values.map(v => {
|
|
550
|
-
return this.getObjectQuery(v.$apiName, v.$primaryKey).writeToStore(v, "loaded", batch).cacheKey;
|
|
551
|
-
});
|
|
552
|
-
}
|
|
553
|
-
|
|
554
|
-
/**
|
|
555
|
-
* Updates the internal state of a list and will create a new internal query if needed.
|
|
556
|
-
*
|
|
557
|
-
* Helper method only for tests right now. May be removed later.
|
|
558
|
-
*
|
|
559
|
-
* @param apiName
|
|
560
|
-
* @param where
|
|
561
|
-
* @param orderBy
|
|
562
|
-
* @param objects
|
|
563
|
-
* @param param4
|
|
564
|
-
* @param opts
|
|
565
|
-
*/
|
|
566
|
-
updateList({
|
|
567
|
-
objectType: apiName,
|
|
568
|
-
where,
|
|
569
|
-
orderBy
|
|
570
|
-
}, objects, {
|
|
571
|
-
optimisticId
|
|
572
|
-
} = {}, opts = {
|
|
573
|
-
dedupeInterval: 0
|
|
574
|
-
}) {
|
|
575
|
-
if (process.env.NODE_ENV !== "production") {
|
|
576
|
-
this.logger?.info({
|
|
577
|
-
methodName: "updateList"
|
|
578
|
-
}, "", {
|
|
579
|
-
optimisticId
|
|
580
|
-
});
|
|
581
|
-
}
|
|
582
|
-
const query = this.getListQuery(apiName, where ?? {}, orderBy ?? {}, opts);
|
|
583
|
-
this.batch({
|
|
584
|
-
optimisticId
|
|
585
|
-
}, batch => {
|
|
586
|
-
const objectCacheKeys = this.updateObjects(objects, batch);
|
|
587
|
-
query.updateList(objectCacheKeys, false, "loaded", batch);
|
|
588
|
-
});
|
|
399
|
+
return Promise.all(promises).then(() => void 0);
|
|
589
400
|
}
|
|
590
401
|
retain(cacheKey) {
|
|
591
402
|
this.#refCounts.retain(cacheKey);
|
|
@@ -594,4 +405,10 @@ export class Store {
|
|
|
594
405
|
this.#refCounts.release(cacheKey);
|
|
595
406
|
}
|
|
596
407
|
}
|
|
408
|
+
export async function invalidateList(store, args) {
|
|
409
|
+
const where = store.whereCanonicalizer.canonicalize(args.where ?? {});
|
|
410
|
+
const orderBy = store.orderByCanonicalizer.canonicalize(args.orderBy ?? {});
|
|
411
|
+
const cacheKey = store.getCacheKey("list", args.type.type, args.type.apiName, where, orderBy);
|
|
412
|
+
await store.peekQuery(cacheKey)?.revalidate(true);
|
|
413
|
+
}
|
|
597
414
|
//# sourceMappingURL=Store.js.map
|