@osdk/client 2.3.0-beta.5 → 2.3.0-beta.6
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 +16 -0
- package/build/browser/createClient.js +8 -1
- package/build/browser/createClient.js.map +1 -1
- package/build/browser/logger/BaseLogger.js +1 -1
- package/build/browser/logger/BaseLogger.js.map +1 -1
- package/build/browser/observable/ObservableClient.js +17 -1
- package/build/browser/observable/ObservableClient.js.map +1 -1
- package/build/browser/observable/OptimisticBuilder.js.map +1 -1
- package/build/browser/observable/internal/ActionApplication.js +31 -30
- package/build/browser/observable/internal/ActionApplication.js.map +1 -1
- package/build/browser/observable/internal/Changes.js +5 -1
- package/build/browser/observable/internal/Changes.js.map +1 -1
- package/build/browser/observable/internal/ListQuery.js +24 -22
- package/build/browser/observable/internal/ListQuery.js.map +1 -1
- package/build/browser/observable/internal/ObjectQuery.js +30 -1
- package/build/browser/observable/internal/ObjectQuery.js.map +1 -1
- package/build/browser/observable/internal/ObservableClientImpl.js +1 -2
- package/build/browser/observable/internal/ObservableClientImpl.js.map +1 -1
- package/build/browser/observable/internal/OptimisticJob.js +8 -0
- package/build/browser/observable/internal/OptimisticJob.js.map +1 -1
- package/build/browser/observable/internal/Query.js +2 -2
- package/build/browser/observable/internal/Query.js.map +1 -1
- package/build/browser/observable/internal/Store.js +4 -0
- package/build/browser/observable/internal/Store.js.map +1 -1
- package/build/browser/observable/internal/Store.test.js +45 -5
- package/build/browser/observable/internal/Store.test.js.map +1 -1
- package/build/browser/observable/internal/testUtils.js.map +1 -1
- package/build/browser/observable/internal/tombstone.js +18 -0
- package/build/browser/observable/internal/tombstone.js.map +1 -0
- package/build/browser/util/UserAgent.js +2 -1
- package/build/browser/util/UserAgent.js.map +1 -1
- package/build/browser/util/toDataValue.js +1 -1
- package/build/browser/util/toDataValue.js.map +1 -1
- package/build/cjs/chunk-DHPFI5ZJ.cjs +1793 -0
- package/build/cjs/chunk-DHPFI5ZJ.cjs.map +1 -0
- package/build/cjs/{chunk-MZ4JZQUU.cjs → chunk-N4KFUVWG.cjs} +642 -42
- package/build/cjs/chunk-N4KFUVWG.cjs.map +1 -0
- package/build/cjs/index.cjs +16 -1769
- package/build/cjs/index.cjs.map +1 -1
- package/build/cjs/public/internal.cjs +7 -8
- package/build/cjs/public/internal.cjs.map +1 -1
- package/build/cjs/public/unstable-do-not-use.cjs +182 -123
- package/build/cjs/public/unstable-do-not-use.cjs.map +1 -1
- package/build/cjs/public/unstable-do-not-use.d.cts +2 -1
- package/build/esm/createClient.js +8 -1
- package/build/esm/createClient.js.map +1 -1
- package/build/esm/logger/BaseLogger.js +1 -1
- package/build/esm/logger/BaseLogger.js.map +1 -1
- package/build/esm/observable/ObservableClient.js +17 -1
- package/build/esm/observable/ObservableClient.js.map +1 -1
- package/build/esm/observable/OptimisticBuilder.js.map +1 -1
- package/build/esm/observable/internal/ActionApplication.js +31 -30
- package/build/esm/observable/internal/ActionApplication.js.map +1 -1
- package/build/esm/observable/internal/Changes.js +5 -1
- package/build/esm/observable/internal/Changes.js.map +1 -1
- package/build/esm/observable/internal/ListQuery.js +24 -22
- package/build/esm/observable/internal/ListQuery.js.map +1 -1
- package/build/esm/observable/internal/ObjectQuery.js +30 -1
- package/build/esm/observable/internal/ObjectQuery.js.map +1 -1
- package/build/esm/observable/internal/ObservableClientImpl.js +1 -2
- package/build/esm/observable/internal/ObservableClientImpl.js.map +1 -1
- package/build/esm/observable/internal/OptimisticJob.js +8 -0
- package/build/esm/observable/internal/OptimisticJob.js.map +1 -1
- package/build/esm/observable/internal/Query.js +2 -2
- package/build/esm/observable/internal/Query.js.map +1 -1
- package/build/esm/observable/internal/Store.js +4 -0
- package/build/esm/observable/internal/Store.js.map +1 -1
- package/build/esm/observable/internal/Store.test.js +45 -5
- package/build/esm/observable/internal/Store.test.js.map +1 -1
- package/build/esm/observable/internal/testUtils.js.map +1 -1
- package/build/esm/observable/internal/tombstone.js +18 -0
- package/build/esm/observable/internal/tombstone.js.map +1 -0
- package/build/esm/util/UserAgent.js +2 -1
- package/build/esm/util/UserAgent.js.map +1 -1
- package/build/esm/util/toDataValue.js +1 -1
- package/build/esm/util/toDataValue.js.map +1 -1
- package/build/types/createClient.d.ts.map +1 -1
- package/build/types/observable/ObservableClient.d.ts +2 -2
- package/build/types/observable/ObservableClient.d.ts.map +1 -1
- package/build/types/observable/OptimisticBuilder.d.ts +1 -0
- package/build/types/observable/OptimisticBuilder.d.ts.map +1 -1
- package/build/types/observable/internal/ActionApplication.d.ts +1 -1
- package/build/types/observable/internal/ActionApplication.d.ts.map +1 -1
- package/build/types/observable/internal/Changes.d.ts +2 -0
- package/build/types/observable/internal/Changes.d.ts.map +1 -1
- package/build/types/observable/internal/ListQuery.d.ts.map +1 -1
- package/build/types/observable/internal/ObjectQuery.d.ts +1 -0
- package/build/types/observable/internal/ObjectQuery.d.ts.map +1 -1
- package/build/types/observable/internal/OptimisticJob.d.ts.map +1 -1
- package/build/types/observable/internal/Store.d.ts +2 -1
- package/build/types/observable/internal/Store.d.ts.map +1 -1
- package/build/types/observable/internal/testUtils.d.ts +1 -1
- package/build/types/observable/internal/testUtils.d.ts.map +1 -1
- package/build/types/observable/internal/tombstone.d.ts +1 -0
- package/build/types/observable/internal/tombstone.d.ts.map +1 -0
- package/build/types/util/UserAgent.d.ts +1 -0
- package/build/types/util/UserAgent.d.ts.map +1 -1
- package/package.json +9 -9
- package/build/cjs/chunk-C5D7744G.cjs +0 -615
- package/build/cjs/chunk-C5D7744G.cjs.map +0 -1
- package/build/cjs/chunk-MZ4JZQUU.cjs.map +0 -1
- package/build/cjs/chunk-T4NIFYZS.cjs +0 -14
- package/build/cjs/chunk-T4NIFYZS.cjs.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Store.js","names":["BehaviorSubject","invariant","additionalContext","DEBUG_REFCOUNTS","ActionApplication","CacheKeys","createChangedObjects","DEBUG_ONLY__changesToString","Entry","Layer","isListCacheKey","ListQuery","ObjectQuery","OrderByCanonicalizer","RefCounts","WhereClauseCanonicalizer","createInitEntry","cacheKey","status","value","undefined","lastUpdated","Store","whereCanonicalizer","orderByCanonicalizer","truthLayer","topLayer","queries","Map","cacheKeyToSubject","WeakMap","cacheKeys","refCounts","k","cleanupCacheKey","finalizationRegistry","constructor","client","logger","child","msgPrefix","cacheKeyType","type","otherKeys","console","log","JSON","stringify","register","setInterval","gc","FinalizationRegistry","cleanupCallback","e","error","key","subject","peekSubject","closed","observed","remove","process","env","NODE_ENV","complete","delete","get","dispose","applyAction","action","args","opts","removeLayer","layerId","currentLayer","parentLayer","v","entries","has","set","oldEntry","currentEntry","next","isOptimistic","getCacheKey","getSubject","initialValue","canonicalizeWhereClause","where","canonicalize","observeObject","apiName","pk","options","subFn","query","getObjectQuery","retain","mode","revalidate","catch","sub","subscribe","unsubscribe","release","observeList","getListQuery","orderBy","x","streamUpdates","registerStreamUpdates","peekQuery","getQuery","#getQuery","createQuery","def","canonWhere","canonOrderBy","listCacheKey","objectCacheKey","dedupeInterval","getValue","batch","optimisticId","changes","batchFn","needsLayer","batchContext","createLayerIfNeeded","addLayer","optimisticWrite","write","oldTopValue","writeLayer","newValue","Date","now","newTopValue","read","retVal","maybeRevalidateQueries","batchResult","invalidateObject","isEmpty","methodName","debug","promises","keys","promise","maybeUpdateAndRevalidate","push","Promise","all","invalidateObjectType","info","modified","add","then","invalidateList","store"],"sources":["Store.ts"],"sourcesContent":["/*\n * Copyright 2025 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport type {\n ActionDefinition,\n ActionEditResponse,\n InterfaceDefinition,\n Logger,\n ObjectTypeDefinition,\n PrimaryKeyType,\n WhereClause,\n} from \"@osdk/api\";\nimport type { Observer } from \"rxjs\";\nimport { BehaviorSubject } from \"rxjs\";\nimport invariant from \"tiny-invariant\";\nimport type { ActionSignatureFromDef } from \"../../actions/applyAction.js\";\nimport { additionalContext, type Client } from \"../../Client.js\";\nimport { DEBUG_REFCOUNTS } from \"../DebugFlags.js\";\nimport type { ListPayload } from \"../ListPayload.js\";\nimport type { ObjectPayload } from \"../ObjectPayload.js\";\nimport type {\n ObserveListOptions,\n ObserveObjectOptions,\n OrderBy,\n Unsubscribable,\n} from \"../ObservableClient.js\";\nimport type { OptimisticBuilder } from \"../OptimisticBuilder.js\";\nimport { ActionApplication } from \"./ActionApplication.js\";\nimport type { CacheKey } from \"./CacheKey.js\";\nimport { CacheKeys } from \"./CacheKeys.js\";\nimport type { Canonical } from \"./Canonical.js\";\nimport {\n type Changes,\n createChangedObjects,\n DEBUG_ONLY__changesToString,\n} from \"./Changes.js\";\nimport { Entry, Layer } from \"./Layer.js\";\nimport type { ListCacheKey, ListQueryOptions } from \"./ListQuery.js\";\nimport { isListCacheKey, ListQuery } from \"./ListQuery.js\";\nimport type { ObjectCacheKey } from \"./ObjectQuery.js\";\nimport { ObjectQuery } from \"./ObjectQuery.js\";\nimport { type OptimisticId } from \"./OptimisticId.js\";\nimport { OrderByCanonicalizer } from \"./OrderByCanonicalizer.js\";\nimport type { Query } from \"./Query.js\";\nimport { RefCounts } from \"./RefCounts.js\";\nimport type { SimpleWhereClause } from \"./SimpleWhereClause.js\";\nimport { WhereClauseCanonicalizer } from \"./WhereClauseCanonicalizer.js\";\n\n/*\n Work still to do:\n - [x] testing for optimistic writes\n - [x] automatic invalidation of actions\n - [x] automatic optimistic list updates\n - [x] useOsdkObjects\n - [x] imply offline for objects passed directly\n - [x] websocket subscriptions\n - [ ] links\n - [x] add pagination\n - [ ] sub-selection support\n - [ ] interfaces\n - [ ] setup defaults\n - [ ] reduce updates in react\n*/\n\nexport interface SubjectPayload<KEY extends CacheKey> extends Entry<KEY> {\n isOptimistic: boolean;\n}\n\nexport interface BatchContext {\n changes: Changes;\n createLayerIfNeeded: () => void;\n optimisticWrite: boolean;\n\n write: <K extends CacheKey<string, any, any>>(\n k: K,\n v: Entry<K>[\"value\"],\n status: Entry<K>[\"status\"],\n ) => Entry<K>;\n\n read: <K extends CacheKey<string, any, any>>(\n k: K,\n ) => Entry<K> | undefined;\n}\n\ninterface UpdateOptions {\n optimisticId?: OptimisticId;\n}\n\nexport namespace Store {\n export interface ApplyActionOptions {\n optimisticUpdate?: (ctx: OptimisticBuilder) => void;\n }\n}\n\nfunction createInitEntry(cacheKey: CacheKey): Entry<any> {\n return {\n cacheKey,\n status: \"init\",\n value: undefined,\n lastUpdated: 0,\n };\n}\n\n/*\n Notes:\n - Subjects are one per type per store (by cache key)\n - Data is one per layer per cache key\n*/\n\nexport class Store {\n whereCanonicalizer: WhereClauseCanonicalizer = new WhereClauseCanonicalizer();\n orderByCanonicalizer: OrderByCanonicalizer = new OrderByCanonicalizer();\n #truthLayer: Layer = new Layer(undefined, undefined);\n #topLayer: Layer;\n client: Client;\n\n /** @internal */\n logger?: Logger;\n\n // we can use a regular Map here because the refCounting will\n // handle cleanup.\n #queries: Map<\n CacheKey,\n Query<any, any, any>\n > = new Map();\n\n #cacheKeyToSubject = new WeakMap<\n CacheKey<string, any, any>,\n BehaviorSubject<SubjectPayload<any>>\n >();\n #cacheKeys: CacheKeys;\n\n #refCounts = new RefCounts<CacheKey>(\n DEBUG_REFCOUNTS ? 15_000 : 60_000,\n (k) => this.#cleanupCacheKey(k),\n );\n\n // we are currently only using this for debug logging and should just remove it in the future if that\n // continues to be true\n #finalizationRegistry: FinalizationRegistry<() => void>;\n\n constructor(client: Client) {\n this.client = client;\n this.logger = client[additionalContext].logger?.child({}, {\n msgPrefix: \"Store\",\n });\n this.#topLayer = this.#truthLayer;\n this.#cacheKeys = new CacheKeys(\n this.whereCanonicalizer,\n this.orderByCanonicalizer,\n (k) => {\n if (DEBUG_REFCOUNTS) {\n const cacheKeyType = k.type;\n const otherKeys = k.otherKeys;\n // eslint-disable-next-line no-console\n console.log(\n `CacheKeys.onCreate(${cacheKeyType}, ${JSON.stringify(otherKeys)})`,\n );\n\n this.#finalizationRegistry.register(k, () => {\n // eslint-disable-next-line no-console\n console.log(\n `CacheKey Finalization(${cacheKeyType}, ${\n JSON.stringify(otherKeys)\n })`,\n );\n });\n }\n\n this.#refCounts.register(k);\n },\n );\n\n setInterval(() => {\n this.#refCounts.gc();\n }, 1000);\n\n this.#finalizationRegistry = new FinalizationRegistry<() => void>(\n (cleanupCallback) => {\n try {\n cleanupCallback();\n } catch (e) {\n // eslint-disable-next-line no-console\n console.error(\n \"Caught an error while running a finalization callback\",\n e,\n );\n }\n },\n );\n }\n\n /**\n * Called after a key is no longer retained and the timeout has elapsed\n * @param key\n */\n #cleanupCacheKey = (key: CacheKey<string, any, any>) => {\n const subject = this.peekSubject(key);\n\n if (DEBUG_REFCOUNTS) {\n // eslint-disable-next-line no-console\n console.log(\n `CacheKey cleaning up (${\n JSON.stringify({\n closed: subject?.closed,\n observed: subject?.observed,\n })\n })`,\n JSON.stringify([key.type, ...key.otherKeys], null, 2),\n );\n }\n this.#cacheKeys.remove(key);\n if (process.env.NODE_ENV !== \"production\") {\n invariant(subject);\n }\n\n if (subject) {\n subject.complete();\n this.#cacheKeyToSubject.delete(key);\n }\n\n this.#queries.get(key)?.dispose();\n this.#queries.delete(key);\n };\n\n applyAction: <Q extends ActionDefinition<any>>(\n action: Q,\n args: Parameters<ActionSignatureFromDef<Q>[\"applyAction\"]>[0],\n opts?: Store.ApplyActionOptions,\n ) => Promise<ActionEditResponse> = async (action, args, opts) => {\n return await new ActionApplication(this).applyAction(action, args, opts);\n };\n\n removeLayer(layerId: OptimisticId): void {\n invariant(\n layerId != null,\n \"undefined is the reserved layerId for the truth layer\",\n );\n // 1. collect all cache keys for a given layerId\n let currentLayer: Layer | undefined = this.#topLayer;\n const cacheKeys = new Map<CacheKey<string, any, any>, Entry<any>>();\n while (currentLayer != null && currentLayer.parentLayer != null) {\n if (currentLayer.layerId === layerId) {\n for (const [k, v] of currentLayer.entries()) {\n if (cacheKeys.has(k)) continue;\n cacheKeys.set(k, v);\n }\n }\n\n currentLayer = currentLayer.parentLayer;\n }\n\n // 2. remove the layers from the chain\n this.#topLayer = this.#topLayer.removeLayer(layerId);\n\n // 3. check each cache key to see if it is different in the new chain\n for (const [k, oldEntry] of cacheKeys) {\n const currentEntry = this.#topLayer.get(k);\n\n // 4. if different, update the subject\n if (oldEntry !== currentEntry) {\n const x = currentEntry ?? createInitEntry(k);\n // We are going to be pretty lazy here and just re-emit the value.\n // In the future it may benefit us to deep equal check her but I think\n // the subjects are effectively doing this anyway.\n this.peekSubject(k)?.next(\n {\n // eslint-disable-next-line @typescript-eslint/no-misused-spread\n ...(currentEntry ?? createInitEntry(k)),\n isOptimistic:\n currentEntry?.value !== this.#truthLayer.get(k)?.value,\n },\n );\n }\n }\n }\n\n getCacheKey<K extends CacheKey<string, any, any>>(\n type: K[\"type\"],\n ...args: K[\"__cacheKey\"][\"args\"]\n ): K {\n return this.#refCounts.register(this.#cacheKeys.get(type, ...args));\n }\n\n peekSubject = <KEY extends CacheKey<string, any, any>>(\n cacheKey: KEY,\n ):\n | BehaviorSubject<SubjectPayload<KEY>>\n | undefined =>\n {\n return this.#cacheKeyToSubject.get(cacheKey);\n };\n\n getSubject = <KEY extends CacheKey<string, any, any>>(\n cacheKey: KEY,\n ): BehaviorSubject<SubjectPayload<KEY>> => {\n let subject = this.#cacheKeyToSubject.get(cacheKey);\n if (!subject) {\n const initialValue: Entry<KEY> = this.#topLayer.get(cacheKey)\n ?? createInitEntry(cacheKey);\n\n subject = new BehaviorSubject({\n // eslint-disable-next-line @typescript-eslint/no-misused-spread\n ...initialValue,\n isOptimistic:\n initialValue.value !== this.#truthLayer.get(cacheKey)?.value,\n });\n this.#cacheKeyToSubject.set(cacheKey, subject);\n }\n\n return subject;\n };\n\n public canonicalizeWhereClause<\n T extends ObjectTypeDefinition | InterfaceDefinition,\n >(\n where: WhereClause<T>,\n ): Canonical<SimpleWhereClause> {\n return this.whereCanonicalizer.canonicalize(where);\n }\n\n public observeObject<T extends ObjectTypeDefinition | InterfaceDefinition>(\n apiName: T[\"apiName\"] | T,\n pk: PrimaryKeyType<T>,\n options: ObserveObjectOptions<T>,\n subFn: Observer<ObjectPayload>,\n ): Unsubscribable {\n if (typeof apiName !== \"string\") {\n apiName = apiName.apiName;\n }\n\n const query = this.getObjectQuery(apiName, pk);\n this.retain(query.cacheKey);\n\n if (options.mode !== \"offline\") {\n query.revalidate(options.mode === \"force\")\n .catch(e => {\n subFn.error(e);\n // we don't want observeObject() to return a promise,\n // so we settle for logging an error here instead of\n // dropping it on the floor.\n if (this.logger) {\n this.logger.error(\"Unhandled error in observeObject\", e);\n } else {\n throw e;\n }\n });\n }\n const sub = query.subscribe(subFn);\n\n return {\n unsubscribe: () => {\n sub.unsubscribe();\n this.release(query.cacheKey);\n },\n };\n }\n\n public observeList<T extends ObjectTypeDefinition | InterfaceDefinition>(\n options: ObserveListOptions<T>,\n subFn: Observer<ListPayload>,\n ): Unsubscribable {\n // the ListQuery represents the shared state of the list\n const query = this.getListQuery(\n options.type,\n options.where ?? {},\n options.orderBy ?? {},\n options,\n );\n this.retain(query.cacheKey);\n\n if (options.mode !== \"offline\") {\n query.revalidate(options.mode === \"force\").catch((x: unknown) => {\n subFn.error(x);\n });\n }\n const sub = query.subscribe(subFn);\n\n if (options.streamUpdates) {\n query.registerStreamUpdates(sub);\n }\n\n return {\n unsubscribe: () => {\n sub.unsubscribe();\n this.release(query.cacheKey);\n },\n };\n }\n\n peekQuery<K extends CacheKey>(\n cacheKey: K,\n ): K[\"__cacheKey\"][\"query\"] | undefined {\n return this.#queries.get(cacheKey) as K[\"__cacheKey\"][\"query\"] | undefined;\n }\n\n #getQuery<K extends CacheKey>(\n cacheKey: K,\n createQuery: () => K[\"__cacheKey\"][\"query\"],\n ): K[\"__cacheKey\"][\"query\"] {\n let query = this.peekQuery(cacheKey);\n if (!query) {\n query = createQuery();\n this.#queries.set(cacheKey, query);\n }\n return query;\n }\n\n public getListQuery<T extends ObjectTypeDefinition | InterfaceDefinition>(\n def: Pick<T, \"type\" | \"apiName\">,\n where: WhereClause<T>,\n orderBy: Record<string, \"asc\" | \"desc\" | undefined>,\n opts: ListQueryOptions,\n ): ListQuery {\n const { apiName, type } = def;\n\n const canonWhere = this.whereCanonicalizer.canonicalize(where);\n const canonOrderBy = this.orderByCanonicalizer.canonicalize(orderBy);\n const listCacheKey = this.getCacheKey<ListCacheKey>(\n \"list\",\n type,\n apiName,\n canonWhere,\n canonOrderBy,\n );\n\n return this.#getQuery(listCacheKey, () => {\n return new ListQuery(\n this,\n this.getSubject(listCacheKey),\n type,\n apiName,\n canonWhere,\n canonOrderBy,\n listCacheKey,\n opts,\n );\n });\n }\n\n public getObjectQuery<T extends ObjectTypeDefinition>(\n apiName: T[\"apiName\"] | T,\n pk: PrimaryKeyType<T>,\n ): ObjectQuery {\n if (typeof apiName !== \"string\") {\n apiName = apiName.apiName;\n }\n\n const objectCacheKey = this.getCacheKey<ObjectCacheKey>(\n \"object\",\n apiName,\n pk,\n );\n\n return this.#getQuery(objectCacheKey, () =>\n new ObjectQuery(\n this,\n this.getSubject(objectCacheKey),\n apiName,\n pk,\n objectCacheKey,\n { dedupeInterval: 0 },\n ));\n }\n\n public getValue<K extends CacheKey<string, any, any>>(\n cacheKey: K,\n ): Entry<K> | undefined {\n return this.#topLayer.get(cacheKey);\n }\n\n batch = <X>(\n { optimisticId, changes = createChangedObjects() }: {\n optimisticId?: OptimisticId;\n changes?: Changes;\n },\n batchFn: (batchContext: BatchContext) => X,\n ): {\n batchResult: BatchContext;\n retVal: X;\n changes: Changes;\n } => {\n invariant(\n optimisticId === undefined || !!optimisticId,\n \"optimistic must be undefined or not falsy\",\n );\n\n let needsLayer = optimisticId !== undefined;\n const batchContext: BatchContext = {\n changes,\n createLayerIfNeeded: () => {\n if (needsLayer) {\n this.#topLayer = this.#topLayer.addLayer(optimisticId);\n needsLayer = false;\n }\n },\n optimisticWrite: !!optimisticId,\n write: (cacheKey, value, status) => {\n const oldTopValue = this.#topLayer.get(cacheKey);\n\n if (optimisticId) batchContext.createLayerIfNeeded();\n\n const writeLayer = optimisticId\n ? this.#topLayer\n : this.#truthLayer;\n const newValue = new Entry(\n cacheKey,\n value,\n Date.now(),\n status,\n );\n\n writeLayer.set(cacheKey, newValue);\n\n const newTopValue = this.#topLayer.get(cacheKey);\n\n if (oldTopValue !== newTopValue) {\n this.#cacheKeyToSubject.get(cacheKey)?.next({\n // eslint-disable-next-line @typescript-eslint/no-misused-spread\n ...newValue,\n isOptimistic:\n newTopValue?.value !== this.#truthLayer.get(cacheKey)?.value,\n });\n }\n\n return newValue;\n },\n read: (cacheKey) => {\n return optimisticId\n ? this.#topLayer.get(cacheKey)\n : this.#truthLayer.get(cacheKey);\n },\n };\n\n const retVal = batchFn(batchContext);\n this.maybeRevalidateQueries(changes, optimisticId).catch(e => {\n // we don't want batch() to return a promise,\n // so we settle for logging an error here instead of\n // dropping it on the floor.\n if (this.logger) {\n this.logger.error(\"Unhandled error in batch\", e);\n } else {\n // eslint-disable-next-line no-console\n console.error(\"Unhandled error in batch\", e);\n throw e;\n }\n });\n\n return {\n batchResult: batchContext,\n retVal: retVal,\n changes: batchContext.changes,\n };\n };\n\n public invalidateObject<T extends ObjectTypeDefinition>(\n apiName: T[\"apiName\"] | T,\n pk: PrimaryKeyType<T>,\n ): Promise<unknown> {\n if (typeof apiName !== \"string\") {\n apiName = apiName.apiName;\n }\n\n return this.getObjectQuery(apiName, pk)\n .revalidate(/* force */ true);\n }\n\n async maybeRevalidateQueries(\n changes: Changes,\n optimisticId?: OptimisticId | undefined,\n ): Promise<void> {\n if (changes.isEmpty()) {\n if (process.env.NODE_ENV !== \"production\") {\n // todo\n this.logger?.child({ methodName: \"maybeRevalidateQueries\" }).debug(\n \"No changes, aborting\",\n );\n }\n return;\n }\n\n if (process.env.NODE_ENV !== \"production\") {\n // todo\n this.logger?.child({ methodName: \"maybeRevalidateQueries\" }).debug(\n DEBUG_ONLY__changesToString(changes),\n { optimisticId },\n );\n }\n\n try {\n const promises: Array<Promise<unknown>> = [];\n for (const cacheKey of this.#queries.keys()) {\n const promise = this.peekQuery(cacheKey)?.maybeUpdateAndRevalidate?.(\n changes,\n optimisticId,\n );\n if (promise) promises.push(promise);\n }\n await Promise.all(promises);\n } finally {\n if (process.env.NODE_ENV !== \"production\") {\n // todo\n this.logger?.child({ methodName: \"maybeRevalidateQueries\" }).debug(\n \"in finally\",\n DEBUG_ONLY__changesToString(changes),\n );\n }\n }\n }\n\n /**\n * @param apiName\n * @param changes The changes we know about / to update\n * @returns\n */\n public invalidateObjectType<T extends ObjectTypeDefinition>(\n apiName: T[\"apiName\"] | T,\n changes: Changes | undefined,\n ): Promise<void> {\n if (typeof apiName !== \"string\") {\n apiName = apiName.apiName;\n }\n if (process.env.NODE_ENV !== \"production\") {\n this.logger?.child({ methodName: \"invalidateObjectType\" }).info(\n changes ? DEBUG_ONLY__changesToString(changes) : void 0,\n );\n }\n\n const promises: Array<Promise<void>> = [];\n\n for (const cacheKey of this.#truthLayer.keys()) {\n if (isListCacheKey(cacheKey)) {\n if (!changes || !changes.modified.has(cacheKey)) {\n const promise = this.peekQuery(cacheKey)?.revalidate(true);\n\n if (promise) {\n promises.push(promise);\n changes?.modified.add(cacheKey);\n }\n }\n }\n }\n\n return Promise.all(promises).then(() => void 0);\n }\n\n retain(cacheKey: CacheKey<string, any, any>): void {\n this.#refCounts.retain(cacheKey);\n }\n\n release(cacheKey: CacheKey<string, any, any>): void {\n this.#refCounts.release(cacheKey);\n }\n}\n\nexport async function invalidateList<T extends ObjectTypeDefinition>(\n store: Store,\n args: {\n type: Pick<T, \"apiName\" | \"type\">;\n where?: WhereClause<T> | SimpleWhereClause;\n orderBy?: OrderBy<T>;\n },\n): Promise<void> {\n const where = store.whereCanonicalizer.canonicalize(args.where ?? {});\n const orderBy = store.orderByCanonicalizer.canonicalize(args.orderBy ?? {});\n\n const cacheKey = store.getCacheKey<ListCacheKey>(\n \"list\",\n args.type.type,\n args.type.apiName,\n where,\n orderBy as Canonical<OrderBy<T>>,\n );\n\n await store.peekQuery(cacheKey)?.revalidate(true);\n}\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"Store.js","names":["BehaviorSubject","invariant","additionalContext","DEBUG_REFCOUNTS","ActionApplication","CacheKeys","createChangedObjects","DEBUG_ONLY__changesToString","Entry","Layer","isListCacheKey","ListQuery","ObjectQuery","OrderByCanonicalizer","RefCounts","tombstone","WhereClauseCanonicalizer","createInitEntry","cacheKey","status","value","undefined","lastUpdated","Store","whereCanonicalizer","orderByCanonicalizer","truthLayer","topLayer","queries","Map","cacheKeyToSubject","WeakMap","cacheKeys","refCounts","k","cleanupCacheKey","finalizationRegistry","constructor","client","logger","child","msgPrefix","cacheKeyType","type","otherKeys","console","log","JSON","stringify","register","setInterval","gc","FinalizationRegistry","cleanupCallback","e","error","key","subject","peekSubject","closed","observed","remove","process","env","NODE_ENV","complete","delete","get","dispose","applyAction","action","args","opts","removeLayer","layerId","currentLayer","parentLayer","v","entries","has","set","oldEntry","currentEntry","next","isOptimistic","getCacheKey","getSubject","initialValue","canonicalizeWhereClause","where","canonicalize","observeObject","apiName","pk","options","subFn","query","getObjectQuery","retain","mode","revalidate","catch","sub","subscribe","unsubscribe","release","observeList","getListQuery","orderBy","x","streamUpdates","registerStreamUpdates","peekQuery","getQuery","#getQuery","createQuery","def","canonWhere","canonOrderBy","listCacheKey","objectCacheKey","dedupeInterval","getValue","batch","optimisticId","changes","batchFn","needsLayer","batchContext","createLayerIfNeeded","addLayer","optimisticWrite","write","oldTopValue","writeLayer","newValue","Date","now","newTopValue","read","retVal","maybeRevalidateQueries","batchResult","invalidateObject","isEmpty","methodName","debug","promises","keys","promise","maybeUpdateAndRevalidate","push","Promise","all","invalidateObjectType","info","modified","add","then","invalidateList","store"],"sources":["Store.ts"],"sourcesContent":["/*\n * Copyright 2025 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport type {\n ActionDefinition,\n ActionEditResponse,\n InterfaceDefinition,\n Logger,\n ObjectTypeDefinition,\n PrimaryKeyType,\n WhereClause,\n} from \"@osdk/api\";\nimport type { Observer } from \"rxjs\";\nimport { BehaviorSubject } from \"rxjs\";\nimport invariant from \"tiny-invariant\";\nimport type { ActionSignatureFromDef } from \"../../actions/applyAction.js\";\nimport { additionalContext, type Client } from \"../../Client.js\";\nimport { DEBUG_REFCOUNTS } from \"../DebugFlags.js\";\nimport type { ListPayload } from \"../ListPayload.js\";\nimport type { ObjectPayload } from \"../ObjectPayload.js\";\nimport type {\n ObserveListOptions,\n ObserveObjectOptions,\n OrderBy,\n Unsubscribable,\n} from \"../ObservableClient.js\";\nimport type { OptimisticBuilder } from \"../OptimisticBuilder.js\";\nimport { ActionApplication } from \"./ActionApplication.js\";\nimport type { CacheKey } from \"./CacheKey.js\";\nimport { CacheKeys } from \"./CacheKeys.js\";\nimport type { Canonical } from \"./Canonical.js\";\nimport {\n type Changes,\n createChangedObjects,\n DEBUG_ONLY__changesToString,\n} from \"./Changes.js\";\nimport { Entry, Layer } from \"./Layer.js\";\nimport type { ListCacheKey, ListQueryOptions } from \"./ListQuery.js\";\nimport { isListCacheKey, ListQuery } from \"./ListQuery.js\";\nimport type { ObjectCacheKey } from \"./ObjectQuery.js\";\nimport { ObjectQuery } from \"./ObjectQuery.js\";\nimport { type OptimisticId } from \"./OptimisticId.js\";\nimport { OrderByCanonicalizer } from \"./OrderByCanonicalizer.js\";\nimport type { Query } from \"./Query.js\";\nimport { RefCounts } from \"./RefCounts.js\";\nimport type { SimpleWhereClause } from \"./SimpleWhereClause.js\";\nimport { tombstone } from \"./tombstone.js\";\nimport { WhereClauseCanonicalizer } from \"./WhereClauseCanonicalizer.js\";\n\n/*\n Work still to do:\n - [x] testing for optimistic writes\n - [x] automatic invalidation of actions\n - [x] automatic optimistic list updates\n - [x] useOsdkObjects\n - [x] imply offline for objects passed directly\n - [x] websocket subscriptions\n - [ ] links\n - [x] add pagination\n - [ ] sub-selection support\n - [ ] interfaces\n - [ ] setup defaults\n - [ ] reduce updates in react\n*/\n\nexport interface SubjectPayload<KEY extends CacheKey> extends Entry<KEY> {\n isOptimistic: boolean;\n}\n\nexport interface BatchContext {\n changes: Changes;\n createLayerIfNeeded: () => void;\n optimisticWrite: boolean;\n\n write: <K extends CacheKey<string, any, any>>(\n k: K,\n v: Entry<K>[\"value\"],\n status: Entry<K>[\"status\"],\n ) => Entry<K>;\n\n read: <K extends CacheKey<string, any, any>>(\n k: K,\n ) => Entry<K> | undefined;\n\n delete: <K extends CacheKey<string, any, any>>(\n k: K,\n status: Entry<K>[\"status\"],\n ) => Entry<K>;\n}\n\ninterface UpdateOptions {\n optimisticId?: OptimisticId;\n}\n\nexport namespace Store {\n export interface ApplyActionOptions {\n optimisticUpdate?: (ctx: OptimisticBuilder) => void;\n }\n}\n\nfunction createInitEntry(cacheKey: CacheKey): Entry<any> {\n return {\n cacheKey,\n status: \"init\",\n value: undefined,\n lastUpdated: 0,\n };\n}\n\n/*\n Notes:\n - Subjects are one per type per store (by cache key)\n - Data is one per layer per cache key\n*/\n\nexport class Store {\n whereCanonicalizer: WhereClauseCanonicalizer = new WhereClauseCanonicalizer();\n orderByCanonicalizer: OrderByCanonicalizer = new OrderByCanonicalizer();\n #truthLayer: Layer = new Layer(undefined, undefined);\n #topLayer: Layer;\n client: Client;\n\n /** @internal */\n logger?: Logger;\n\n // we can use a regular Map here because the refCounting will\n // handle cleanup.\n #queries: Map<\n CacheKey,\n Query<any, any, any>\n > = new Map();\n\n #cacheKeyToSubject = new WeakMap<\n CacheKey<string, any, any>,\n BehaviorSubject<SubjectPayload<any>>\n >();\n #cacheKeys: CacheKeys;\n\n #refCounts = new RefCounts<CacheKey>(\n DEBUG_REFCOUNTS ? 15_000 : 60_000,\n (k) => this.#cleanupCacheKey(k),\n );\n\n // we are currently only using this for debug logging and should just remove it in the future if that\n // continues to be true\n #finalizationRegistry: FinalizationRegistry<() => void>;\n\n constructor(client: Client) {\n this.client = client;\n this.logger = client[additionalContext].logger?.child({}, {\n msgPrefix: \"Store\",\n });\n this.#topLayer = this.#truthLayer;\n this.#cacheKeys = new CacheKeys(\n this.whereCanonicalizer,\n this.orderByCanonicalizer,\n (k) => {\n if (DEBUG_REFCOUNTS) {\n const cacheKeyType = k.type;\n const otherKeys = k.otherKeys;\n // eslint-disable-next-line no-console\n console.log(\n `CacheKeys.onCreate(${cacheKeyType}, ${JSON.stringify(otherKeys)})`,\n );\n\n this.#finalizationRegistry.register(k, () => {\n // eslint-disable-next-line no-console\n console.log(\n `CacheKey Finalization(${cacheKeyType}, ${\n JSON.stringify(otherKeys)\n })`,\n );\n });\n }\n\n this.#refCounts.register(k);\n },\n );\n\n setInterval(() => {\n this.#refCounts.gc();\n }, 1000);\n\n this.#finalizationRegistry = new FinalizationRegistry<() => void>(\n (cleanupCallback) => {\n try {\n cleanupCallback();\n } catch (e) {\n // eslint-disable-next-line no-console\n console.error(\n \"Caught an error while running a finalization callback\",\n e,\n );\n }\n },\n );\n }\n\n /**\n * Called after a key is no longer retained and the timeout has elapsed\n * @param key\n */\n #cleanupCacheKey = (key: CacheKey<string, any, any>) => {\n const subject = this.peekSubject(key);\n\n if (DEBUG_REFCOUNTS) {\n // eslint-disable-next-line no-console\n console.log(\n `CacheKey cleaning up (${\n JSON.stringify({\n closed: subject?.closed,\n observed: subject?.observed,\n })\n })`,\n JSON.stringify([key.type, ...key.otherKeys], null, 2),\n );\n }\n this.#cacheKeys.remove(key);\n if (process.env.NODE_ENV !== \"production\") {\n invariant(subject);\n }\n\n if (subject) {\n subject.complete();\n this.#cacheKeyToSubject.delete(key);\n }\n\n this.#queries.get(key)?.dispose();\n this.#queries.delete(key);\n };\n\n applyAction: <Q extends ActionDefinition<any>>(\n action: Q,\n args:\n | Parameters<ActionSignatureFromDef<Q>[\"applyAction\"]>[0]\n | Array<Parameters<ActionSignatureFromDef<Q>[\"applyAction\"]>[0]>,\n opts?: Store.ApplyActionOptions,\n ) => Promise<ActionEditResponse> = async (action, args, opts) => {\n return await new ActionApplication(this).applyAction(action, args, opts);\n };\n\n removeLayer(layerId: OptimisticId): void {\n invariant(\n layerId != null,\n \"undefined is the reserved layerId for the truth layer\",\n );\n // 1. collect all cache keys for a given layerId\n let currentLayer: Layer | undefined = this.#topLayer;\n const cacheKeys = new Map<CacheKey<string, any, any>, Entry<any>>();\n while (currentLayer != null && currentLayer.parentLayer != null) {\n if (currentLayer.layerId === layerId) {\n for (const [k, v] of currentLayer.entries()) {\n if (cacheKeys.has(k)) continue;\n cacheKeys.set(k, v);\n }\n }\n\n currentLayer = currentLayer.parentLayer;\n }\n\n // 2. remove the layers from the chain\n this.#topLayer = this.#topLayer.removeLayer(layerId);\n\n // 3. check each cache key to see if it is different in the new chain\n for (const [k, oldEntry] of cacheKeys) {\n const currentEntry = this.#topLayer.get(k);\n\n // 4. if different, update the subject\n if (oldEntry !== currentEntry) {\n const x = currentEntry ?? createInitEntry(k);\n // We are going to be pretty lazy here and just re-emit the value.\n // In the future it may benefit us to deep equal check her but I think\n // the subjects are effectively doing this anyway.\n this.peekSubject(k)?.next(\n {\n // eslint-disable-next-line @typescript-eslint/no-misused-spread\n ...(currentEntry ?? createInitEntry(k)),\n isOptimistic:\n currentEntry?.value !== this.#truthLayer.get(k)?.value,\n },\n );\n }\n }\n }\n\n getCacheKey<K extends CacheKey<string, any, any>>(\n type: K[\"type\"],\n ...args: K[\"__cacheKey\"][\"args\"]\n ): K {\n return this.#refCounts.register(this.#cacheKeys.get(type, ...args));\n }\n\n peekSubject = <KEY extends CacheKey<string, any, any>>(\n cacheKey: KEY,\n ):\n | BehaviorSubject<SubjectPayload<KEY>>\n | undefined =>\n {\n return this.#cacheKeyToSubject.get(cacheKey);\n };\n\n getSubject = <KEY extends CacheKey<string, any, any>>(\n cacheKey: KEY,\n ): BehaviorSubject<SubjectPayload<KEY>> => {\n let subject = this.#cacheKeyToSubject.get(cacheKey);\n if (!subject) {\n const initialValue: Entry<KEY> = this.#topLayer.get(cacheKey)\n ?? createInitEntry(cacheKey);\n\n subject = new BehaviorSubject({\n // eslint-disable-next-line @typescript-eslint/no-misused-spread\n ...initialValue,\n isOptimistic:\n initialValue.value !== this.#truthLayer.get(cacheKey)?.value,\n });\n this.#cacheKeyToSubject.set(cacheKey, subject);\n }\n\n return subject;\n };\n\n public canonicalizeWhereClause<\n T extends ObjectTypeDefinition | InterfaceDefinition,\n >(\n where: WhereClause<T>,\n ): Canonical<SimpleWhereClause> {\n return this.whereCanonicalizer.canonicalize(where);\n }\n\n public observeObject<T extends ObjectTypeDefinition | InterfaceDefinition>(\n apiName: T[\"apiName\"] | T,\n pk: PrimaryKeyType<T>,\n options: ObserveObjectOptions<T>,\n subFn: Observer<ObjectPayload>,\n ): Unsubscribable {\n if (typeof apiName !== \"string\") {\n apiName = apiName.apiName;\n }\n\n const query = this.getObjectQuery(apiName, pk);\n this.retain(query.cacheKey);\n\n if (options.mode !== \"offline\") {\n query.revalidate(options.mode === \"force\")\n .catch(e => {\n subFn.error(e);\n // we don't want observeObject() to return a promise,\n // so we settle for logging an error here instead of\n // dropping it on the floor.\n if (this.logger) {\n this.logger.error(\"Unhandled error in observeObject\", e);\n } else {\n throw e;\n }\n });\n }\n const sub = query.subscribe(subFn);\n\n return {\n unsubscribe: () => {\n sub.unsubscribe();\n this.release(query.cacheKey);\n },\n };\n }\n\n public observeList<T extends ObjectTypeDefinition | InterfaceDefinition>(\n options: ObserveListOptions<T>,\n subFn: Observer<ListPayload>,\n ): Unsubscribable {\n // the ListQuery represents the shared state of the list\n const query = this.getListQuery(\n options.type,\n options.where ?? {},\n options.orderBy ?? {},\n options,\n );\n this.retain(query.cacheKey);\n\n if (options.mode !== \"offline\") {\n query.revalidate(options.mode === \"force\").catch((x: unknown) => {\n subFn.error(x);\n });\n }\n const sub = query.subscribe(subFn);\n\n if (options.streamUpdates) {\n query.registerStreamUpdates(sub);\n }\n\n return {\n unsubscribe: () => {\n sub.unsubscribe();\n this.release(query.cacheKey);\n },\n };\n }\n\n peekQuery<K extends CacheKey>(\n cacheKey: K,\n ): K[\"__cacheKey\"][\"query\"] | undefined {\n return this.#queries.get(cacheKey) as K[\"__cacheKey\"][\"query\"] | undefined;\n }\n\n #getQuery<K extends CacheKey>(\n cacheKey: K,\n createQuery: () => K[\"__cacheKey\"][\"query\"],\n ): K[\"__cacheKey\"][\"query\"] {\n let query = this.peekQuery(cacheKey);\n if (!query) {\n query = createQuery();\n this.#queries.set(cacheKey, query);\n }\n return query;\n }\n\n public getListQuery<T extends ObjectTypeDefinition | InterfaceDefinition>(\n def: Pick<T, \"type\" | \"apiName\">,\n where: WhereClause<T>,\n orderBy: Record<string, \"asc\" | \"desc\" | undefined>,\n opts: ListQueryOptions,\n ): ListQuery {\n const { apiName, type } = def;\n\n const canonWhere = this.whereCanonicalizer.canonicalize(where);\n const canonOrderBy = this.orderByCanonicalizer.canonicalize(orderBy);\n const listCacheKey = this.getCacheKey<ListCacheKey>(\n \"list\",\n type,\n apiName,\n canonWhere,\n canonOrderBy,\n );\n\n return this.#getQuery(listCacheKey, () => {\n return new ListQuery(\n this,\n this.getSubject(listCacheKey),\n type,\n apiName,\n canonWhere,\n canonOrderBy,\n listCacheKey,\n opts,\n );\n });\n }\n\n public getObjectQuery<T extends ObjectTypeDefinition>(\n apiName: T[\"apiName\"] | T,\n pk: PrimaryKeyType<T>,\n ): ObjectQuery {\n if (typeof apiName !== \"string\") {\n apiName = apiName.apiName;\n }\n\n const objectCacheKey = this.getCacheKey<ObjectCacheKey>(\n \"object\",\n apiName,\n pk,\n );\n\n return this.#getQuery(objectCacheKey, () =>\n new ObjectQuery(\n this,\n this.getSubject(objectCacheKey),\n apiName,\n pk,\n objectCacheKey,\n { dedupeInterval: 0 },\n ));\n }\n\n public getValue<K extends CacheKey<string, any, any>>(\n cacheKey: K,\n ): Entry<K> | undefined {\n return this.#topLayer.get(cacheKey);\n }\n\n batch = <X>(\n { optimisticId, changes = createChangedObjects() }: {\n optimisticId?: OptimisticId;\n changes?: Changes;\n },\n batchFn: (batchContext: BatchContext) => X,\n ): {\n batchResult: BatchContext;\n retVal: X;\n changes: Changes;\n } => {\n invariant(\n optimisticId === undefined || !!optimisticId,\n \"optimistic must be undefined or not falsy\",\n );\n\n let needsLayer = optimisticId !== undefined;\n const batchContext: BatchContext = {\n changes,\n createLayerIfNeeded: () => {\n if (needsLayer) {\n this.#topLayer = this.#topLayer.addLayer(optimisticId);\n needsLayer = false;\n }\n },\n optimisticWrite: !!optimisticId,\n write: (cacheKey, value, status) => {\n const oldTopValue = this.#topLayer.get(cacheKey);\n\n if (optimisticId) batchContext.createLayerIfNeeded();\n\n const writeLayer = optimisticId\n ? this.#topLayer\n : this.#truthLayer;\n const newValue = new Entry(\n cacheKey,\n value,\n Date.now(),\n status,\n );\n\n writeLayer.set(cacheKey, newValue);\n\n const newTopValue = this.#topLayer.get(cacheKey);\n\n if (oldTopValue !== newTopValue) {\n this.#cacheKeyToSubject.get(cacheKey)?.next({\n // eslint-disable-next-line @typescript-eslint/no-misused-spread\n ...newValue,\n isOptimistic:\n newTopValue?.value !== this.#truthLayer.get(cacheKey)?.value,\n });\n }\n\n return newValue;\n },\n delete: (cacheKey, status) => {\n return batchContext.write(cacheKey, tombstone, status);\n },\n read: (cacheKey) => {\n return optimisticId\n ? this.#topLayer.get(cacheKey)\n : this.#truthLayer.get(cacheKey);\n },\n };\n\n const retVal = batchFn(batchContext);\n this.maybeRevalidateQueries(changes, optimisticId).catch(e => {\n // we don't want batch() to return a promise,\n // so we settle for logging an error here instead of\n // dropping it on the floor.\n if (this.logger) {\n this.logger.error(\"Unhandled error in batch\", e);\n } else {\n // eslint-disable-next-line no-console\n console.error(\"Unhandled error in batch\", e);\n throw e;\n }\n });\n\n return {\n batchResult: batchContext,\n retVal: retVal,\n changes: batchContext.changes,\n };\n };\n\n public invalidateObject<T extends ObjectTypeDefinition>(\n apiName: T[\"apiName\"] | T,\n pk: PrimaryKeyType<T>,\n ): Promise<unknown> {\n if (typeof apiName !== \"string\") {\n apiName = apiName.apiName;\n }\n\n return this.getObjectQuery(apiName, pk)\n .revalidate(/* force */ true);\n }\n\n async maybeRevalidateQueries(\n changes: Changes,\n optimisticId?: OptimisticId | undefined,\n ): Promise<void> {\n if (changes.isEmpty()) {\n if (process.env.NODE_ENV !== \"production\") {\n // todo\n this.logger?.child({ methodName: \"maybeRevalidateQueries\" }).debug(\n \"No changes, aborting\",\n );\n }\n return;\n }\n\n if (process.env.NODE_ENV !== \"production\") {\n // todo\n this.logger?.child({ methodName: \"maybeRevalidateQueries\" }).debug(\n DEBUG_ONLY__changesToString(changes),\n { optimisticId },\n );\n }\n\n try {\n const promises: Array<Promise<unknown>> = [];\n for (const cacheKey of this.#queries.keys()) {\n const promise = this.peekQuery(cacheKey)?.maybeUpdateAndRevalidate?.(\n changes,\n optimisticId,\n );\n if (promise) promises.push(promise);\n }\n await Promise.all(promises);\n } finally {\n if (process.env.NODE_ENV !== \"production\") {\n // todo\n this.logger?.child({ methodName: \"maybeRevalidateQueries\" }).debug(\n \"in finally\",\n DEBUG_ONLY__changesToString(changes),\n );\n }\n }\n }\n\n /**\n * @param apiName\n * @param changes The changes we know about / to update\n * @returns\n */\n public invalidateObjectType<T extends ObjectTypeDefinition>(\n apiName: T[\"apiName\"] | T,\n changes: Changes | undefined,\n ): Promise<void> {\n if (typeof apiName !== \"string\") {\n apiName = apiName.apiName;\n }\n if (process.env.NODE_ENV !== \"production\") {\n this.logger?.child({ methodName: \"invalidateObjectType\" }).info(\n changes ? DEBUG_ONLY__changesToString(changes) : void 0,\n );\n }\n\n const promises: Array<Promise<void>> = [];\n\n for (const cacheKey of this.#truthLayer.keys()) {\n if (isListCacheKey(cacheKey)) {\n if (!changes || !changes.modified.has(cacheKey)) {\n const promise = this.peekQuery(cacheKey)?.revalidate(true);\n\n if (promise) {\n promises.push(promise);\n changes?.modified.add(cacheKey);\n }\n }\n }\n }\n\n return Promise.all(promises).then(() => void 0);\n }\n\n retain(cacheKey: CacheKey<string, any, any>): void {\n this.#refCounts.retain(cacheKey);\n }\n\n release(cacheKey: CacheKey<string, any, any>): void {\n this.#refCounts.release(cacheKey);\n }\n}\n\nexport async function invalidateList<T extends ObjectTypeDefinition>(\n store: Store,\n args: {\n type: Pick<T, \"apiName\" | \"type\">;\n where?: WhereClause<T> | SimpleWhereClause;\n orderBy?: OrderBy<T>;\n },\n): Promise<void> {\n const where = store.whereCanonicalizer.canonicalize(args.where ?? {});\n const orderBy = store.orderByCanonicalizer.canonicalize(args.orderBy ?? {});\n\n const cacheKey = store.getCacheKey<ListCacheKey>(\n \"list\",\n args.type.type,\n args.type.apiName,\n where,\n orderBy as Canonical<OrderBy<T>>,\n );\n\n await store.peekQuery(cacheKey)?.revalidate(true);\n}\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -15,7 +15,7 @@
|
|
|
15
15
|
*/
|
|
16
16
|
|
|
17
17
|
import { editTodo, Employee, FooInterface, Todo } from "@osdk/client.test.ontology";
|
|
18
|
-
import {
|
|
18
|
+
import { FauxFoundry, ontologies, startNodeApiServer, stubData, TypeHelpers } from "@osdk/shared.test";
|
|
19
19
|
import chalk from "chalk";
|
|
20
20
|
import invariant from "tiny-invariant";
|
|
21
21
|
import { afterAll, afterEach, beforeAll, beforeEach, describe, expect, it, vi, vitest } from "vitest";
|
|
@@ -267,6 +267,46 @@ describe(Store, () => {
|
|
|
267
267
|
expectSingleObjectCallAndClear(subFn, truthUpdatedEmployee);
|
|
268
268
|
expectNoMoreCalls(subFn);
|
|
269
269
|
});
|
|
270
|
+
describe("object deletes", () => {
|
|
271
|
+
it("it properly updates the list", async () => {
|
|
272
|
+
const emp = employeesAsServerReturns[0];
|
|
273
|
+
updateList(cache, {
|
|
274
|
+
type: Employee,
|
|
275
|
+
where: {},
|
|
276
|
+
orderBy: {}
|
|
277
|
+
}, [emp]);
|
|
278
|
+
const subFn = mockSingleSubCallback();
|
|
279
|
+
defer(cache.observeObject(Employee, emp.$primaryKey, {
|
|
280
|
+
mode: "offline"
|
|
281
|
+
}, subFn));
|
|
282
|
+
expectSingleObjectCallAndClear(subFn, emp);
|
|
283
|
+
const subListFn = mockListSubCallback();
|
|
284
|
+
defer(cache.observeList({
|
|
285
|
+
type: Employee,
|
|
286
|
+
mode: "offline"
|
|
287
|
+
}, subListFn));
|
|
288
|
+
await waitForCall(subListFn, 1);
|
|
289
|
+
expectSingleListCallAndClear(subListFn, [emp], {
|
|
290
|
+
status: "loaded"
|
|
291
|
+
});
|
|
292
|
+
const cacheKey = cache.getCacheKey("object", emp.$apiName, emp.$primaryKey);
|
|
293
|
+
|
|
294
|
+
// Actual test is here, prior to this is setup
|
|
295
|
+
testStage("delete the object");
|
|
296
|
+
cache.batch({
|
|
297
|
+
optimisticId: createOptimisticId()
|
|
298
|
+
}, batch => {
|
|
299
|
+
batch.changes.deleteObject(cacheKey);
|
|
300
|
+
batch.delete(cacheKey, "loading");
|
|
301
|
+
});
|
|
302
|
+
expectSingleObjectCallAndClear(subFn, undefined);
|
|
303
|
+
await waitForCall(subListFn, 1);
|
|
304
|
+
expectSingleListCallAndClear(subListFn, [], {
|
|
305
|
+
isOptimistic: true,
|
|
306
|
+
status: "loading"
|
|
307
|
+
});
|
|
308
|
+
});
|
|
309
|
+
});
|
|
270
310
|
});
|
|
271
311
|
describe(".invalidateObject", () => {
|
|
272
312
|
it("triggers an update", async () => {
|
|
@@ -698,9 +738,9 @@ describe(Store, () => {
|
|
|
698
738
|
it("properly fires error handler for a list", async () => {
|
|
699
739
|
const sub = mockListSubCallback();
|
|
700
740
|
store.observeList({
|
|
701
|
-
type:
|
|
702
|
-
|
|
703
|
-
|
|
741
|
+
type: {
|
|
742
|
+
apiName: "notReal",
|
|
743
|
+
type: "object"
|
|
704
744
|
},
|
|
705
745
|
orderBy: {}
|
|
706
746
|
}, sub);
|
|
@@ -1001,7 +1041,7 @@ describe(Store, () => {
|
|
|
1001
1041
|
const {
|
|
1002
1042
|
actionDefinition: crazyAction,
|
|
1003
1043
|
actionTypeV2: crazyActionTypeV2
|
|
1004
|
-
} =
|
|
1044
|
+
} = TypeHelpers.actionTypeBuilder("asdf").addParameter("foo", "string").build();
|
|
1005
1045
|
fauxFoundry.getDefaultOntology().registerActionType(crazyActionTypeV2, batch => {
|
|
1006
1046
|
const idForD = nextPk++;
|
|
1007
1047
|
batch.addObject(Todo.apiName, idForD, {
|