@osdk/client 2.2.0-beta.3 → 2.2.0-beta.5

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.
Files changed (96) hide show
  1. package/CHANGELOG.md +25 -0
  2. package/build/browser/Logger.js.map +1 -1
  3. package/build/browser/observable/ObservableClient.js.map +1 -1
  4. package/build/browser/observable/OptimisticBuilder.js.map +1 -1
  5. package/build/browser/observable/internal/ActionApplication.js +102 -0
  6. package/build/browser/observable/internal/ActionApplication.js.map +1 -0
  7. package/build/browser/observable/internal/CacheKey.js +38 -1
  8. package/build/browser/observable/internal/CacheKey.js.map +1 -1
  9. package/build/browser/observable/internal/CacheKeys.js +4 -4
  10. package/build/browser/observable/internal/CacheKeys.js.map +1 -1
  11. package/build/browser/observable/internal/ChangedObjects.js +24 -1
  12. package/build/browser/observable/internal/ChangedObjects.js.map +1 -1
  13. package/build/browser/observable/internal/Layer.js +3 -3
  14. package/build/browser/observable/internal/Layer.js.map +1 -1
  15. package/build/browser/observable/internal/ListQuery.js +188 -66
  16. package/build/browser/observable/internal/ListQuery.js.map +1 -1
  17. package/build/browser/observable/internal/ObjectQuery.js +16 -3
  18. package/build/browser/observable/internal/ObjectQuery.js.map +1 -1
  19. package/build/browser/observable/internal/ObservableClientImpl.js +2 -2
  20. package/build/browser/observable/internal/ObservableClientImpl.js.map +1 -1
  21. package/build/browser/observable/internal/OptimisticJob.js +30 -29
  22. package/build/browser/observable/internal/OptimisticJob.js.map +1 -1
  23. package/build/browser/observable/internal/Query.js +42 -2
  24. package/build/browser/observable/internal/Query.js.map +1 -1
  25. package/build/browser/observable/internal/Store.js +259 -126
  26. package/build/browser/observable/internal/Store.js.map +1 -1
  27. package/build/browser/observable/internal/Store.test.js +418 -78
  28. package/build/browser/observable/internal/Store.test.js.map +1 -1
  29. package/build/browser/observable/internal/objectMatchesWhereClause.js +0 -2
  30. package/build/browser/observable/internal/objectMatchesWhereClause.js.map +1 -1
  31. package/build/browser/observable/internal/testUtils.js +142 -6
  32. package/build/browser/observable/internal/testUtils.js.map +1 -1
  33. package/build/browser/util/UserAgent.js +1 -1
  34. package/build/cjs/index.cjs +1 -1
  35. package/build/cjs/public/unstable-do-not-use.cjs +657 -268
  36. package/build/cjs/public/unstable-do-not-use.cjs.map +1 -1
  37. package/build/cjs/public/unstable-do-not-use.d.cts +14 -5
  38. package/build/esm/Logger.js.map +1 -1
  39. package/build/esm/observable/ObservableClient.js.map +1 -1
  40. package/build/esm/observable/OptimisticBuilder.js.map +1 -1
  41. package/build/esm/observable/internal/ActionApplication.js +102 -0
  42. package/build/esm/observable/internal/ActionApplication.js.map +1 -0
  43. package/build/esm/observable/internal/CacheKey.js +38 -1
  44. package/build/esm/observable/internal/CacheKey.js.map +1 -1
  45. package/build/esm/observable/internal/CacheKeys.js +4 -4
  46. package/build/esm/observable/internal/CacheKeys.js.map +1 -1
  47. package/build/esm/observable/internal/ChangedObjects.js +24 -1
  48. package/build/esm/observable/internal/ChangedObjects.js.map +1 -1
  49. package/build/esm/observable/internal/Layer.js +3 -3
  50. package/build/esm/observable/internal/Layer.js.map +1 -1
  51. package/build/esm/observable/internal/ListQuery.js +188 -66
  52. package/build/esm/observable/internal/ListQuery.js.map +1 -1
  53. package/build/esm/observable/internal/ObjectQuery.js +16 -3
  54. package/build/esm/observable/internal/ObjectQuery.js.map +1 -1
  55. package/build/esm/observable/internal/ObservableClientImpl.js +2 -2
  56. package/build/esm/observable/internal/ObservableClientImpl.js.map +1 -1
  57. package/build/esm/observable/internal/OptimisticJob.js +30 -29
  58. package/build/esm/observable/internal/OptimisticJob.js.map +1 -1
  59. package/build/esm/observable/internal/Query.js +42 -2
  60. package/build/esm/observable/internal/Query.js.map +1 -1
  61. package/build/esm/observable/internal/Store.js +259 -126
  62. package/build/esm/observable/internal/Store.js.map +1 -1
  63. package/build/esm/observable/internal/Store.test.js +418 -78
  64. package/build/esm/observable/internal/Store.test.js.map +1 -1
  65. package/build/esm/observable/internal/objectMatchesWhereClause.js +0 -2
  66. package/build/esm/observable/internal/objectMatchesWhereClause.js.map +1 -1
  67. package/build/esm/observable/internal/testUtils.js +142 -6
  68. package/build/esm/observable/internal/testUtils.js.map +1 -1
  69. package/build/esm/util/UserAgent.js +1 -1
  70. package/build/types/Logger.d.ts +1 -2
  71. package/build/types/Logger.d.ts.map +1 -1
  72. package/build/types/observable/ObservableClient.d.ts +10 -3
  73. package/build/types/observable/ObservableClient.d.ts.map +1 -1
  74. package/build/types/observable/OptimisticBuilder.d.ts +1 -1
  75. package/build/types/observable/OptimisticBuilder.d.ts.map +1 -1
  76. package/build/types/observable/internal/ActionApplication.d.ts +9 -0
  77. package/build/types/observable/internal/ActionApplication.d.ts.map +1 -0
  78. package/build/types/observable/internal/CacheKeys.d.ts +2 -1
  79. package/build/types/observable/internal/CacheKeys.d.ts.map +1 -1
  80. package/build/types/observable/internal/ChangedObjects.d.ts +6 -2
  81. package/build/types/observable/internal/ChangedObjects.d.ts.map +1 -1
  82. package/build/types/observable/internal/Layer.d.ts +1 -1
  83. package/build/types/observable/internal/Layer.d.ts.map +1 -1
  84. package/build/types/observable/internal/ListQuery.d.ts +18 -17
  85. package/build/types/observable/internal/ListQuery.d.ts.map +1 -1
  86. package/build/types/observable/internal/ObjectQuery.d.ts +3 -3
  87. package/build/types/observable/internal/ObjectQuery.d.ts.map +1 -1
  88. package/build/types/observable/internal/OptimisticJob.d.ts +2 -2
  89. package/build/types/observable/internal/OptimisticJob.d.ts.map +1 -1
  90. package/build/types/observable/internal/Query.d.ts +6 -5
  91. package/build/types/observable/internal/Query.d.ts.map +1 -1
  92. package/build/types/observable/internal/Store.d.ts +47 -19
  93. package/build/types/observable/internal/Store.d.ts.map +1 -1
  94. package/build/types/observable/internal/testUtils.d.ts +13 -3
  95. package/build/types/observable/internal/testUtils.d.ts.map +1 -1
  96. package/package.json +9 -8
@@ -1 +1 @@
1
- {"version":3,"file":"Store.js","names":["delay","BehaviorSubject","invariant","DEBUG_REFCOUNTS","CacheKeys","createChangedObjects","Layer","isListCacheKey","ListQuery","ObjectQuery","runOptimisticJob","RefCounts","WhereClauseCanonicalizer","ACTION_DELAY","process","env","NODE_ENV","createInitEntry","cacheKey","status","value","undefined","lastUpdated","Store","whereCanonicalizer","truthLayer","topLayer","queries","WeakMap","cacheKeyToSubject","cacheKeys","refCounts","k","cleanupCacheKey","finalizationRegistry","constructor","client","cacheKeyType","type","otherKeys","console","log","JSON","stringify","register","setInterval","gc","FinalizationRegistry","cleanupCallback","e","error","key","subject","peekSubject","closed","observed","remove","complete","delete","get","dispose","applyAction","action","args","opts","ActionApplication","removeLayer","layerId","currentLayer","Map","parentLayer","v","entries","has","set","oldEntry","currentEntry","next","isOptimistic","getCacheKey","getSubject","initialValue","observeObject","apiName","pk","options","subFn","query","getObjectQuery","retain","mode","revalidate","sub","subscribe","unsubscribe","release","observeList","where","getListQuery","peekQuery","#peekQuery","getQuery","#getQuery","createQuery","peek","canonWhere","canonicalize","listCacheKey","objectCacheKey","dedupeInterval","getObject","objEntry","batch","optimisticId","batchFn","needsLayer","batchContext","addedObjects","Set","modifiedObjects","modifiedLists","createLayerIfNeeded","addLayer","optimisticWrite","write","oldTopValue","writeLayer","newValue","Date","now","newTopValue","read","retVal","batchResult","invalidateObject","maybeRevalidateLists","changes","maybeRevalidate","maybeUpdateLists","maybeUpdate","invalidateObjectType","invalidateList","updateObject","$primaryKey","writeToStore","updateList","values","b","store","optimisticUpdate","removeOptimisticResult","actionResults","$returnEdits","invalidateActionEditResponse","typesToInvalidate","promisesToWait","obj","push","objectType","primaryKey","add","Promise","allSettled","then","changes2","changesFromActionEditResponse","editedObjectTypes","toString","changeType"],"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 ObjectTypeDefinition,\n Osdk,\n PrimaryKeyType,\n WhereClause,\n} from \"@osdk/api\";\nimport { delay } from \"msw\";\nimport { BehaviorSubject } from \"rxjs\";\nimport invariant from \"tiny-invariant\";\nimport type { ActionSignatureFromDef } from \"../../actions/applyAction.js\";\nimport 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 ObserveObjectOptions,\n Unsubscribable,\n} from \"../ObservableClient.js\";\nimport type { OptimisticBuilder } from \"../OptimisticBuilder.js\";\nimport type { SubFn } from \"../types.js\";\nimport type { CacheKey } from \"./CacheKey.js\";\nimport { CacheKeys } from \"./CacheKeys.js\";\nimport { type ChangedObjects, createChangedObjects } from \"./ChangedObjects.js\";\nimport type { Entry } from \"./Layer.js\";\nimport { 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 { runOptimisticJob } from \"./OptimisticJob.js\";\nimport type { Query } from \"./Query.js\";\nimport { RefCounts } from \"./RefCounts.js\";\nimport { WhereClauseCanonicalizer } from \"./WhereClauseCanonicalizer.js\";\n\nconst ACTION_DELAY = process.env.NODE_ENV === \"production\" ? 0 : 1000;\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 - [ ] websocket subscriptions\n - [ ] links\n - [ ] 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 addedObjects: Set<ObjectCacheKey>;\n modifiedObjects: Set<ObjectCacheKey>;\n modifiedLists: Set<ListCacheKey>;\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 ObserveOptions {\n mode?: \"offline\" | \"force\";\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 #truthLayer: Layer = new Layer(undefined, undefined);\n #topLayer: Layer;\n client: Client;\n\n #queries: WeakMap<CacheKey<string, any, any>, Query<any, any, any>> =\n new WeakMap();\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 #finalizationRegistry: FinalizationRegistry<() => void>;\n\n constructor(client: Client) {\n this.client = client;\n this.#topLayer = this.#truthLayer;\n this.#cacheKeys = new CacheKeys(this.whereCanonicalizer, (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 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<unknown> = (action, args, opts) => {\n return 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 observeObject<T extends ObjectTypeDefinition>(\n apiName: T[\"apiName\"] | T,\n pk: PrimaryKeyType<T>,\n options: ObserveObjectOptions<T>,\n subFn: SubFn<ObjectPayload>,\n ): Unsubscribable {\n if (typeof apiName !== \"string\") {\n apiName = apiName.apiName;\n }\n\n const query = this.getObjectQuery(apiName, pk);\n this.#refCounts.retain(query.cacheKey);\n\n if (options.mode !== \"offline\") {\n void query.revalidate(options.mode === \"force\");\n }\n const sub = query.subscribe({ next: subFn });\n\n return {\n unsubscribe: () => {\n sub.unsubscribe();\n this.#refCounts.release(query.cacheKey);\n },\n };\n }\n\n public observeList<T extends ObjectTypeDefinition>(\n apiName: T[\"apiName\"] | T,\n where: WhereClause<T>,\n options: ObserveOptions & ListQueryOptions,\n subFn: SubFn<ListPayload>,\n ): Unsubscribable {\n if (typeof apiName !== \"string\") {\n apiName = apiName.apiName;\n }\n\n const query = this.getListQuery(apiName, where, options);\n this.#refCounts.retain(query.cacheKey);\n\n if (options.mode !== \"offline\") {\n void query.revalidate(options.mode === \"force\");\n }\n const sub = query.subscribe({ next: subFn });\n\n return {\n unsubscribe: () => {\n sub.unsubscribe();\n this.#refCounts.release(query.cacheKey);\n },\n };\n }\n\n #peekQuery<K extends CacheKey<string, any, any>>(\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>(\n apiName: T[\"apiName\"] | T,\n where: WhereClause<T>,\n opts: ListQueryOptions,\n peek = false,\n ): ListQuery {\n if (typeof apiName !== \"string\") {\n apiName = apiName.apiName;\n }\n\n const canonWhere = this.whereCanonicalizer.canonicalize(where);\n const listCacheKey = this.getCacheKey<ListCacheKey>(\n \"list\",\n apiName,\n canonWhere,\n );\n\n return this.#getQuery(listCacheKey, () => {\n return new ListQuery(\n this,\n this.getSubject(listCacheKey),\n apiName,\n canonWhere,\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 getObject<T extends ObjectTypeDefinition>(\n apiName: T[\"apiName\"] | T,\n pk: string | number,\n ): Osdk.Instance<T> | undefined {\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 const objEntry = this.#topLayer.get(objectCacheKey);\n return objEntry?.value as Osdk.Instance<T> | undefined;\n }\n\n batch = <X>(\n { optimisticId }: { optimisticId?: OptimisticId },\n batchFn: (batchContext: BatchContext) => X,\n ): {\n batchResult: BatchContext;\n retVal: X;\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 addedObjects: new Set(),\n modifiedObjects: new Set(),\n modifiedLists: new Set(),\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 = {\n cacheKey,\n value,\n lastUpdated: 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 ...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\n return { batchResult: batchContext, retVal: retVal };\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 // inevitably we will want an internal version of this and a \"public\" one\n // so we can avoid extra requests\n\n const query = this.getObjectQuery(apiName, pk);\n\n return query.revalidate(true);\n\n // potentially trigger updates of the lists that included this object?\n // TODO\n // could we detect that a list WOULD include it?\n }\n\n public maybeRevalidateLists(\n changes: ChangedObjects,\n ): void {\n for (const [cacheKey, v] of this.#truthLayer.entries()) {\n if (isListCacheKey(cacheKey)) {\n // fixme promise\n void this.#peekQuery(cacheKey)?.maybeRevalidate(changes);\n }\n }\n }\n\n public maybeUpdateLists(\n changes: ChangedObjects,\n optimisticId: OptimisticId,\n ): void {\n for (const [cacheKey, v] of this.#truthLayer.entries()) {\n if (isListCacheKey(cacheKey)) {\n // fixme promise\n void this.#peekQuery(cacheKey)?.maybeUpdate(changes, optimisticId);\n }\n }\n }\n\n public invalidateObjectType<T extends ObjectTypeDefinition>(\n apiName: T[\"apiName\"] | T,\n ): void {\n if (typeof apiName !== \"string\") {\n apiName = apiName.apiName;\n }\n\n for (const [cacheKey, v] of this.#truthLayer.entries()) {\n if (isListCacheKey(cacheKey, apiName)) {\n void this.#peekQuery(cacheKey)?.revalidate(true);\n }\n }\n }\n\n public invalidateList<T extends ObjectTypeDefinition>(\n apiName: T[\"apiName\"] | T,\n where: WhereClause<T>,\n ): void {\n if (typeof apiName !== \"string\") {\n apiName = apiName.apiName;\n }\n\n const cacheKey = this.getCacheKey<ListCacheKey>(\n \"list\",\n apiName,\n where,\n );\n\n void this.#peekQuery(cacheKey)?.revalidate(true);\n }\n\n public updateObject(\n apiName: string | ObjectTypeDefinition,\n value: Osdk.Instance<ObjectTypeDefinition>,\n { optimisticId }: UpdateOptions = {},\n ): Osdk.Instance<ObjectTypeDefinition> {\n if (typeof apiName !== \"string\") {\n apiName = apiName.apiName;\n }\n\n const query = this.getObjectQuery(apiName, value.$primaryKey);\n\n return this.batch({ optimisticId }, (batch) => {\n return query.writeToStore(value, \"loaded\", batch);\n }).retVal.value!;\n }\n\n public updateList<T extends ObjectTypeDefinition>(\n apiName: T[\"apiName\"] | T,\n where: WhereClause<T>,\n values: Osdk.Instance<T>[],\n { optimisticId }: UpdateOptions = {},\n opts: ListQueryOptions = { dedupeInterval: 0 },\n ): void {\n if (typeof apiName !== \"string\") {\n apiName = apiName.apiName;\n }\n\n const query = this.getListQuery(apiName, where, opts);\n\n this.batch({ optimisticId }, (b) => {\n query.updateList(values, false, \"loaded\", b);\n });\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\nclass ActionApplication {\n constructor(private store: Store) {}\n\n applyAction: <Q extends ActionDefinition<any>>(\n action: Q,\n args: Parameters<ActionSignatureFromDef<Q>[\"applyAction\"]>[0],\n opts?: Store.ApplyActionOptions,\n ) => Promise<unknown> = (action, args, { optimisticUpdate } = {}) => {\n const removeOptimisticResult = runOptimisticJob(\n this.store,\n optimisticUpdate,\n );\n return (async () => {\n try {\n // The types for client get confused when we dynamically applyAction so we\n // have to deal with the `any` here and force cast it to what it should be.\n // TODO: Update the types so this doesn't happen!\n // eslint-disable-next-line @typescript-eslint/no-unsafe-call\n const actionResults: ActionEditResponse = await this.store.client(\n action,\n ).applyAction(args as any, { $returnEdits: true });\n\n if (ACTION_DELAY > 0) {\n // eslint-disable-next-line no-console\n console.log(\"action done, pausing\");\n await delay(ACTION_DELAY);\n // eslint-disable-next-line no-console\n console.log(\"action done, pausing done\");\n }\n await this.#invalidateActionEditResponse(actionResults);\n return actionResults;\n } finally {\n // make sure this happens even if the action fails\n await removeOptimisticResult();\n }\n })();\n };\n\n #invalidateActionEditResponse = (value: ActionEditResponse) => {\n const typesToInvalidate = new Set<string>();\n let promisesToWait: Promise<any>[] = [];\n if (value.type === \"edits\") {\n // TODO we need an backend update for deletes\n for (const obj of value.modifiedObjects) {\n promisesToWait.push(\n this.store.invalidateObject(obj.objectType, obj.primaryKey),\n );\n }\n\n for (const obj of value.addedObjects) {\n promisesToWait.push(\n this.store.invalidateObject(obj.objectType, obj.primaryKey),\n );\n\n typesToInvalidate.add(obj.objectType);\n }\n\n promisesToWait = [\n Promise.allSettled(promisesToWait).then(() => {\n const changes2 = this.#changesFromActionEditResponse(value);\n this.store.maybeRevalidateLists(changes2);\n }),\n ];\n } else {\n for (const apiName of value.editedObjectTypes) {\n typesToInvalidate.add(apiName.toString());\n }\n }\n\n return Promise.allSettled(promisesToWait).then(() => {\n // after the single object invalidations are done we can decide if we need to updates any lists\n for (const objectType of typesToInvalidate) {\n // TODO make sure this covers individual object loads too\n this.store.invalidateObjectType(objectType);\n }\n\n return value;\n });\n };\n\n #changesFromActionEditResponse = (value: ActionEditResponse) => {\n const changes = createChangedObjects();\n for (const changeType of [\"addedObjects\", \"modifiedObjects\"] as const) {\n for (const { objectType, primaryKey } of (value[changeType] ?? [])) {\n const obj = this.store.getObject(objectType, primaryKey);\n if (obj) {\n changes[changeType].set(objectType, obj);\n }\n }\n }\n return changes;\n };\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","RefCounts","WeakMapWithEntries","WhereClauseCanonicalizer","createInitEntry","cacheKey","status","value","undefined","lastUpdated","OrderByCanonicalizer","map","Map","canonicalize","orderBy","has","JSON","stringify","get","set","Store","whereCanonicalizer","orderByCanonicalizer","truthLayer","topLayer","queries","cacheKeyToSubject","WeakMap","cacheKeys","refCounts","k","cleanupCacheKey","finalizationRegistry","constructor","client","logger","child","msgPrefix","cacheKeyType","type","otherKeys","console","log","register","setInterval","gc","FinalizationRegistry","cleanupCallback","e","error","key","subject","peekSubject","closed","observed","remove","process","env","NODE_ENV","complete","delete","dispose","applyAction","action","args","opts","removeLayer","layerId","currentLayer","parentLayer","v","entries","oldEntry","currentEntry","next","isOptimistic","getCacheKey","getSubject","initialValue","observeObject","apiName","pk","options","subFn","query","getObjectQuery","retain","mode","revalidate","catch","sub","subscribe","unsubscribe","release","observeList","getListQuery","objectType","where","streamUpdates","miniDef","objectSet","store","websocketSubscription","onChange","object","state","debug","methodName","$objectType","$primaryKey","peekQuery","changes","updateObject","maybeRevalidateLists","err","batch","existing","read","cacheKeyToRemove","newObjects","data","filter","o","length","modifiedLists","add","write","info","onError","errors","onOutOfDate","onSuccessfulSubscription","#peekQuery","getQuery","#getQuery","createQuery","canonWhere","canonOrderBy","listCacheKey","objectCacheKey","dedupeInterval","getObject","objEntry","optimisticId","batchFn","needsLayer","batchContext","createLayerIfNeeded","addLayer","optimisticWrite","oldTopValue","writeLayer","newValue","Date","now","newTopValue","retVal","maybeUpdateLists","batchResult","invalidateObject","trace","promises","promise","maybeUpdateAndRevalidate","push","Promise","all","addedObjects","size","modifiedObjects","resolve","keys","invalidateObjectType","invalidateList","writeToStore","updateObjects","values","$apiName","updateList","objects","objectCacheKeys"],"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 ObjectSet,\n ObjectTypeDefinition,\n Osdk,\n PrimaryKeyType,\n WhereClause,\n} from \"@osdk/api\";\nimport { BehaviorSubject } from \"rxjs\";\nimport invariant from \"tiny-invariant\";\nimport type { ActionSignatureFromDef } from \"../../actions/applyAction.js\";\nimport { additionalContext, type Client } from \"../../Client.js\";\nimport type { Logger } from \"../../Logger.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 type { SubFn } from \"../types.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 \"./ChangedObjects.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 type { Query } from \"./Query.js\";\nimport { RefCounts } from \"./RefCounts.js\";\nimport { WeakMapWithEntries } from \"./WeakMapWithEntries.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 OrderByCanonicalizer {\n // crappy version\n #map = new Map<string, Record<string, \"asc\" | \"desc\" | undefined>>();\n\n canonicalize: <T>(\n orderBy: Record<string, \"asc\" | \"desc\" | undefined>,\n ) => Canonical<Record<string, \"asc\" | \"desc\" | undefined>> = (orderBy) => {\n if (this.#map.has(JSON.stringify(orderBy))) {\n return this.#map.get(JSON.stringify(orderBy))! as Canonical<\n Record<string, \"asc\" | \"desc\" | undefined>\n >;\n } else {\n this.#map.set(JSON.stringify(orderBy), orderBy);\n return orderBy as Canonical<Record<string, \"asc\" | \"desc\" | undefined>>;\n }\n };\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 #queries: WeakMapWithEntries<\n CacheKey<string, any, any>,\n Query<any, any, any>\n > = new WeakMapWithEntries();\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 #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<unknown> = (action, args, opts) => {\n return 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 observeObject<T extends ObjectTypeDefinition>(\n apiName: T[\"apiName\"] | T,\n pk: PrimaryKeyType<T>,\n options: ObserveObjectOptions<T>,\n subFn: SubFn<ObjectPayload>,\n ): Unsubscribable {\n if (typeof apiName !== \"string\") {\n apiName = apiName.apiName;\n }\n\n const query = this.getObjectQuery(apiName, pk);\n this.#refCounts.retain(query.cacheKey);\n\n if (options.mode !== \"offline\") {\n query.revalidate(options.mode === \"force\")\n .catch(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({ next: subFn });\n\n return {\n unsubscribe: () => {\n sub.unsubscribe();\n this.#refCounts.release(query.cacheKey);\n },\n };\n }\n\n public observeList<T extends ObjectTypeDefinition>(\n options: ObserveListOptions<T>,\n subFn: SubFn<ListPayload>,\n ): Unsubscribable {\n // the ListQuery represents the shared state of the list\n const query = this.getListQuery(\n options.objectType,\n options.where ?? {},\n options.orderBy ?? {},\n options,\n );\n this.#refCounts.retain(query.cacheKey);\n\n if (options.mode !== \"offline\") {\n void query.revalidate(options.mode === \"force\");\n }\n const sub = query.subscribe({ next: subFn });\n\n if (options.streamUpdates) {\n const miniDef = {\n type: \"object\",\n apiName: (typeof options.objectType === \"string\"\n ? options.objectType\n : options.objectType.apiName),\n } as T;\n let objectSet: ObjectSet<T> = this.client(miniDef);\n if (options.where) {\n objectSet = objectSet.where(options.where ?? {});\n }\n const store = this;\n const websocketSubscription = objectSet.subscribe({\n onChange({ object, state }) {\n if (process.env.NODE_ENV !== \"production\") {\n store.logger?.debug(\n { methodName: \"onError\" },\n \"updates\",\n state,\n object,\n );\n }\n\n const cacheKey = store.getCacheKey<ObjectCacheKey>(\n \"object\",\n object.$objectType,\n object.$primaryKey,\n );\n const type = store.#peekQuery(cacheKey) == null\n ? \"addedObjects\"\n : \"modifiedObjects\";\n\n const changes = createChangedObjects();\n changes[type].set(\n object.$objectType,\n object,\n );\n\n if (state === \"ADDED_OR_UPDATED\") {\n // todo, can we do the update without\n // the extra invalidation? maybe a flag to updateObject\n store.updateObject(\n object.$objectType,\n object,\n );\n store.maybeRevalidateLists(changes).catch(err => {\n // eslint-disable-next-line no-console\n console.error(\"Unhandled error in maybeRevalidateLists\", err);\n });\n } else if (state === \"REMOVED\") {\n const changes = createChangedObjects();\n store.batch({ changes }, (batch) => {\n const existing = batch.read(query.cacheKey);\n const cacheKeyToRemove = store.getCacheKey<ObjectCacheKey>(\n \"object\",\n object.$objectType,\n object.$primaryKey,\n );\n if (existing?.status === \"loaded\") {\n const newObjects = existing.value?.data.filter(\n (o) => o !== cacheKeyToRemove,\n );\n if (newObjects?.length !== existing.value?.data.length) {\n batch.changes.modifiedLists.add(query.cacheKey);\n batch.write(\n query.cacheKey,\n { data: newObjects ?? [] },\n \"loaded\",\n );\n // Should there be an else for this case? Do we need to invalidate\n // the paging tokens we may have?\n }\n } else {\n // There may be a tiny race here where OSW tells us the object has\n // been removed but an outstanding invalidation of this query is\n // about to return. In this case, its possible that we remove this item\n // from the list and then the returned list load re-adds it.\n // To avoid this, we will just force reload the query to be sure\n // we don't leave things in a bad state.\n\n if (process.env.NODE_ENV !== \"production\") {\n store.logger?.info(\n \"Removing an object from an object list that is in the middle of being loaded.\",\n existing,\n );\n }\n\n query.revalidate(/* force */ true).catch((e) => {\n if (store.logger) {\n store.logger?.error(\n \"Uncaught error while revalidating list\",\n e,\n );\n } else {\n // eslint-disable-next-line no-console\n console.error(\n \"Uncaught error while revalidating list\",\n e,\n );\n }\n });\n }\n });\n }\n },\n\n onError(errors) {\n if (process.env.NODE_ENV !== \"production\") {\n store.logger?.info(\n { methodName: \"onError\" },\n \"subscription errors\",\n errors,\n );\n }\n },\n\n onOutOfDate() {\n if (process.env.NODE_ENV !== \"production\") {\n store.logger?.info(\n { methodName: \"onOutOfDate\" },\n );\n }\n },\n\n onSuccessfulSubscription() {\n if (process.env.NODE_ENV !== \"production\") {\n store.logger?.info(\n { methodName: \"onSuccessfulSubscription\" },\n );\n }\n },\n });\n\n sub.add(() => {\n if (process.env.NODE_ENV !== \"production\") {\n store.logger?.info(\n { methodName: \"observeList\" },\n \"Unsubscribing from websocket\",\n );\n }\n\n websocketSubscription.unsubscribe();\n });\n }\n\n return {\n unsubscribe: () => {\n sub.unsubscribe();\n this.#refCounts.release(query.cacheKey);\n },\n };\n }\n\n #peekQuery<K extends CacheKey<string, any, any>>(\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>(\n apiName: T[\"apiName\"] | T,\n where: WhereClause<T>,\n orderBy: Record<string, \"asc\" | \"desc\" | undefined>,\n opts: ListQueryOptions,\n ): ListQuery {\n if (typeof apiName !== \"string\") {\n apiName = apiName.apiName;\n }\n\n const canonWhere = this.whereCanonicalizer.canonicalize(where);\n const canonOrderBy = this.orderByCanonicalizer.canonicalize(orderBy);\n const listCacheKey = this.getCacheKey<ListCacheKey>(\n \"list\",\n apiName,\n canonWhere,\n canonOrderBy,\n );\n\n return this.#getQuery(listCacheKey, () => {\n return new ListQuery(\n this,\n this.getSubject(listCacheKey),\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 getObject<T extends ObjectTypeDefinition>(\n apiName: T[\"apiName\"] | T,\n pk: string | number,\n ): Osdk.Instance<T> | undefined {\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 const objEntry = this.#topLayer.get(objectCacheKey);\n return objEntry?.value as Osdk.Instance<T> | undefined;\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 } => {\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 void this.maybeUpdateLists(changes, optimisticId);\n\n return { batchResult: batchContext, retVal: retVal };\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 // inevitably we will want an internal version of this and a \"public\" one\n // so we can avoid extra requests\n\n const query = this.getObjectQuery(apiName, pk);\n\n return query.revalidate(true);\n\n // potentially trigger updates of the lists that included this object?\n // TODO\n // could we detect that a list WOULD include it?\n }\n\n public async maybeRevalidateLists(\n changes: Changes,\n ): Promise<void> {\n if (process.env.NODE_ENV !== \"production\") {\n // todo\n this.logger?.trace(\n { methodName: \"maybeRevalidateList\" },\n DEBUG_ONLY__changesToString(changes),\n );\n }\n\n try {\n const promises: Array<Promise<unknown>> = [];\n for (const [cacheKey, v] of this.#truthLayer.entries()) {\n if (isListCacheKey(cacheKey)) {\n const promise = this.#peekQuery(cacheKey)?.maybeUpdateAndRevalidate(\n changes,\n undefined,\n );\n if (promise) promises.push(promise);\n }\n }\n await Promise.all(promises);\n } finally {\n if (process.env.NODE_ENV !== \"production\") {\n // todo\n this.logger?.trace(\n { methodName: \"maybeRevalidateList\" },\n \"in finally\",\n DEBUG_ONLY__changesToString(changes),\n );\n }\n }\n }\n\n public maybeUpdateLists(\n changes: Changes,\n optimisticId: OptimisticId | undefined,\n ): Promise<(void | undefined)[]> {\n if (process.env.NODE_ENV !== \"production\") {\n this.logger?.trace(\n { methodName: \"maybeUpdateLists\" },\n DEBUG_ONLY__changesToString(changes),\n { optimisticId },\n );\n }\n if (changes.addedObjects.size === 0 && changes.modifiedObjects.size === 0) {\n return Promise.resolve([]);\n }\n const promises = [];\n for (const cacheKey of this.#queries.keys()) {\n if (isListCacheKey(cacheKey)) {\n if (!changes.modifiedLists.has(cacheKey)) {\n const promise = this.#peekQuery(cacheKey)?.maybeUpdateAndRevalidate(\n changes,\n optimisticId,\n );\n if (promise) promises.push(promise);\n }\n }\n }\n\n return Promise.all(promises);\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<unknown[]> {\n if (typeof apiName !== \"string\") {\n apiName = apiName.apiName;\n }\n if (process.env.NODE_ENV !== \"production\") {\n this.logger?.info(\n { methodName: \"invalidateObjectType\" },\n changes ? DEBUG_ONLY__changesToString(changes) : void 0,\n );\n }\n\n const promises: Array<Promise<unknown>> = [];\n\n for (const [cacheKey, v] of this.#truthLayer.entries()) {\n if (isListCacheKey(cacheKey, apiName)) {\n if (!changes || !changes.modifiedLists.has(cacheKey)) {\n const promise = this.#peekQuery(cacheKey)?.revalidate(true);\n\n if (promise) {\n promises.push(promise);\n changes?.modifiedLists.add(cacheKey);\n }\n }\n }\n }\n\n return Promise.all(promises);\n }\n\n public invalidateList<T extends ObjectTypeDefinition>(\n { objectType, where, orderBy }: {\n objectType: T[\"apiName\"] | T;\n where?: WhereClause<T>;\n orderBy?: OrderBy<T>;\n },\n ): void {\n if (typeof objectType !== \"string\") {\n objectType = objectType.apiName;\n }\n\n where = this.whereCanonicalizer.canonicalize(where ?? {});\n orderBy = this.orderByCanonicalizer.canonicalize(orderBy ?? {});\n\n const cacheKey = this.getCacheKey<ListCacheKey>(\n \"list\",\n objectType,\n where as Canonical<WhereClause<T>>,\n orderBy as Canonical<OrderBy<T>>,\n );\n\n void this.#peekQuery(cacheKey)?.revalidate(true);\n }\n\n public updateObject(\n apiName: string | ObjectTypeDefinition,\n value: Osdk.Instance<ObjectTypeDefinition>,\n { optimisticId }: UpdateOptions = {},\n ): Osdk.Instance<ObjectTypeDefinition> {\n if (typeof apiName !== \"string\") {\n apiName = apiName.apiName;\n }\n\n const query = this.getObjectQuery(apiName, value.$primaryKey);\n\n return this.batch({ optimisticId }, (batch) => {\n return query.writeToStore(value, \"loaded\", batch);\n }).retVal.value!;\n }\n\n public updateObjects(\n values: Array<Osdk.Instance<ObjectTypeDefinition>>,\n batch: BatchContext,\n ): ObjectCacheKey[] {\n // update the cache for any object that has changed\n // and save the mapped values to return\n return values.map(v => {\n return this.getObjectQuery(\n v.$apiName,\n v.$primaryKey as string | number,\n )\n .writeToStore(v, \"loaded\", batch).cacheKey;\n });\n }\n\n /**\n * Updates the internal state of a list and will create a new internal query if needed.\n *\n * Helper method only for tests right now. May be removed later.\n *\n * @param apiName\n * @param where\n * @param orderBy\n * @param objects\n * @param param4\n * @param opts\n */\n public updateList<T extends ObjectTypeDefinition>(\n {\n objectType: apiName,\n where,\n orderBy,\n }: {\n objectType: T[\"apiName\"] | T;\n where: WhereClause<T>;\n orderBy: OrderBy<T>;\n },\n objects: Osdk.Instance<T>[],\n { optimisticId }: UpdateOptions = {},\n opts: ListQueryOptions = { dedupeInterval: 0 },\n ): void {\n if (process.env.NODE_ENV !== \"production\") {\n this.logger?.info(\n { methodName: \"updateList\" },\n \"\",\n { optimisticId },\n );\n }\n\n const query = this.getListQuery(apiName, where ?? {}, orderBy ?? {}, opts);\n\n this.batch({ optimisticId }, (batch) => {\n const objectCacheKeys = this.updateObjects(objects, batch);\n query.updateList(objectCacheKeys, false, \"loaded\", batch);\n });\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"],"mappings":"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","ignoreList":[]}