@osdk/client 2.7.0-beta.11 → 2.7.0-beta.13
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 +27 -0
- package/build/browser/actions/actions.test.js +0 -8
- package/build/browser/actions/actions.test.js.map +1 -1
- package/build/browser/internal/conversions/modernToLegacyWhereClause.js +14 -9
- package/build/browser/internal/conversions/modernToLegacyWhereClause.js.map +1 -1
- package/build/browser/internal/conversions/modernToLegacyWhereClause.test.js +74 -0
- package/build/browser/internal/conversions/modernToLegacyWhereClause.test.js.map +1 -1
- package/build/browser/objectSet/ObjectSetListenerWebsocket.js +13 -4
- package/build/browser/objectSet/ObjectSetListenerWebsocket.js.map +1 -1
- package/build/browser/objectSet/ObjectSetListenerWebsocket.test.js +46 -2
- package/build/browser/objectSet/ObjectSetListenerWebsocket.test.js.map +1 -1
- package/build/browser/objectSet/createObjectSet.js +1 -1
- package/build/browser/objectSet/createObjectSet.js.map +1 -1
- package/build/browser/observable/internal/Changes.js +1 -1
- package/build/browser/observable/internal/Changes.js.map +1 -1
- package/build/browser/observable/internal/ObservableClientImpl.js +2 -2
- package/build/browser/observable/internal/ObservableClientImpl.js.map +1 -1
- package/build/browser/observable/internal/Store.test.js +48 -1
- package/build/browser/observable/internal/Store.test.js.map +1 -1
- package/build/browser/observable/internal/base-list/BaseListQuery.js +1 -1
- package/build/browser/observable/internal/base-list/BaseListQuery.js.map +1 -1
- package/build/browser/observable/internal/function/FunctionParamsCanonicalizer.js +3 -2
- package/build/browser/observable/internal/function/FunctionParamsCanonicalizer.js.map +1 -1
- package/build/browser/observable/internal/list/InterfaceListQuery.js +24 -9
- package/build/browser/observable/internal/list/InterfaceListQuery.js.map +1 -1
- package/build/browser/observable/internal/object/ObjectsHelper.js +1 -3
- package/build/browser/observable/internal/object/ObjectsHelper.js.map +1 -1
- package/build/browser/util/UserAgent.js +2 -2
- package/build/browser/util/isObjectSpecifiersObject.js.map +1 -1
- package/build/cjs/{chunk-RDZ5NKAI.cjs → chunk-VVKEXIIO.cjs} +30 -14
- package/build/cjs/chunk-VVKEXIIO.cjs.map +1 -0
- package/build/cjs/{chunk-666JN2DO.cjs → chunk-ZFL7RPT6.cjs} +65 -65
- package/build/cjs/{chunk-666JN2DO.cjs.map → chunk-ZFL7RPT6.cjs.map} +1 -1
- package/build/cjs/index.cjs +8 -8
- package/build/cjs/public/internal.cjs +8 -8
- package/build/cjs/public/unstable-do-not-use.cjs +81 -63
- package/build/cjs/public/unstable-do-not-use.cjs.map +1 -1
- package/build/esm/actions/actions.test.js +0 -8
- package/build/esm/actions/actions.test.js.map +1 -1
- package/build/esm/internal/conversions/modernToLegacyWhereClause.js +14 -9
- package/build/esm/internal/conversions/modernToLegacyWhereClause.js.map +1 -1
- package/build/esm/internal/conversions/modernToLegacyWhereClause.test.js +74 -0
- package/build/esm/internal/conversions/modernToLegacyWhereClause.test.js.map +1 -1
- package/build/esm/objectSet/ObjectSetListenerWebsocket.js +13 -4
- package/build/esm/objectSet/ObjectSetListenerWebsocket.js.map +1 -1
- package/build/esm/objectSet/ObjectSetListenerWebsocket.test.js +46 -2
- package/build/esm/objectSet/ObjectSetListenerWebsocket.test.js.map +1 -1
- package/build/esm/objectSet/createObjectSet.js +1 -1
- package/build/esm/objectSet/createObjectSet.js.map +1 -1
- package/build/esm/observable/internal/Changes.js +1 -1
- package/build/esm/observable/internal/Changes.js.map +1 -1
- package/build/esm/observable/internal/ObservableClientImpl.js +2 -2
- package/build/esm/observable/internal/ObservableClientImpl.js.map +1 -1
- package/build/esm/observable/internal/Store.test.js +48 -1
- package/build/esm/observable/internal/Store.test.js.map +1 -1
- package/build/esm/observable/internal/base-list/BaseListQuery.js +1 -1
- package/build/esm/observable/internal/base-list/BaseListQuery.js.map +1 -1
- package/build/esm/observable/internal/function/FunctionParamsCanonicalizer.js +3 -2
- package/build/esm/observable/internal/function/FunctionParamsCanonicalizer.js.map +1 -1
- package/build/esm/observable/internal/list/InterfaceListQuery.js +24 -9
- package/build/esm/observable/internal/list/InterfaceListQuery.js.map +1 -1
- package/build/esm/observable/internal/object/ObjectsHelper.js +1 -3
- package/build/esm/observable/internal/object/ObjectsHelper.js.map +1 -1
- package/build/esm/util/UserAgent.js +2 -2
- package/build/esm/util/isObjectSpecifiersObject.js.map +1 -1
- package/build/types/observable/internal/Changes.d.ts.map +1 -1
- package/build/types/observable/internal/Store.test.d.ts.map +1 -1
- package/build/types/observable/internal/function/FunctionParamsCanonicalizer.d.ts.map +1 -1
- package/build/types/observable/internal/list/InterfaceListQuery.d.ts +3 -0
- package/build/types/observable/internal/list/InterfaceListQuery.d.ts.map +1 -1
- package/build/types/observable/internal/object/ObjectsHelper.d.ts.map +1 -1
- package/build/types/util/isObjectSpecifiersObject.d.ts +1 -0
- package/build/types/util/isObjectSpecifiersObject.d.ts.map +1 -1
- package/package.json +9 -9
- package/build/cjs/chunk-RDZ5NKAI.cjs.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BaseListQuery.js","names":["deepEqual","DEBUG_ONLY__cacheKeysToString","isObjectInstance","RDP_IDX","Query","NoOpSortingStrategy","createCollectionConnectable","removeDuplicates","BaseListQuery","sortingStrategy","rdpConfig","cacheKey","otherKeys","_updateList","items","status","batch","append","process","env","NODE_ENV","logger","child","methodName","debug","JSON","stringify","objectCacheKeys","length","store","objects","storeOsdkInstances","retainReleaseAppend","_sortCacheKeys","writeToStore","data","entry","read","value","write","ret","registerCacheChanges","#retainReleaseAppend","existingList","optimisticWrite","objectCacheKey","cacheKeys","release","retain","_dispose","createPayload","params","resolvedList","resolvedData","isOptimistic","fetchMore","hasMore","nextPageToken","lastUpdated","_createConnectable","subject","subjects","_preFetch","undefined","pendingPageFetch","pendingFetch","finally","Promise","resolve","setStatus","fetchPageAndUpdate","abortController","signal","then","minResultsToLoad","_fetchAndStore","count","aborted","hadPreviousPage","result","fetchPageData","retVal","finalStatus","objectKeys","error","handleFetchError","_error","_status","sortCacheKeys","updateCollection","options","createWebsocketSubscription","objectSet","sub","info","websocketSubscription","subscribe","onChange","onOswChange","bind","onError","onOswError","onOutOfDate","onOswOutOfDate","onSuccessfulSubscription","onOswSuccessfulSubscription","add","unsubscribe","subscriptionClosed","errors","object","state","onOswRemoved","get","$apiName","$primaryKey","delete"],"sources":["BaseListQuery.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 ObjectSet,\n ObjectTypeDefinition,\n Osdk,\n PageResult,\n} from \"@osdk/api\";\nimport deepEqual from \"fast-deep-equal\";\nimport type { Connectable, Observable, Subscription } from \"rxjs\";\nimport type {\n CommonObserveOptions,\n Status,\n} from \"../../ObservableClient/common.js\";\nimport type { BatchContext } from \"../BatchContext.js\";\nimport { type CacheKey, DEBUG_ONLY__cacheKeysToString } from \"../CacheKey.js\";\nimport type { Canonical } from \"../Canonical.js\";\nimport { isObjectInstance } from \"../isObjectInstance.js\";\nimport type { Entry } from \"../Layer.js\";\nimport { RDP_IDX } from \"../list/ListCacheKey.js\";\nimport { type ObjectCacheKey } from \"../object/ObjectCacheKey.js\";\nimport { Query } from \"../Query.js\";\nimport type { Rdp } from \"../RdpCanonicalizer.js\";\nimport type { SortingStrategy } from \"../sorting/SortingStrategy.js\";\nimport { NoOpSortingStrategy } from \"../sorting/SortingStrategy.js\";\nimport type { SubjectPayload } from \"../SubjectPayload.js\";\nimport type { ObjectUpdate } from \"../types/ObjectUpdate.js\";\nimport type {\n CollectionConnectableParams,\n CollectionStorageData,\n} from \"./BaseCollectionQuery.js\";\nimport { createCollectionConnectable } from \"./createCollectionConnectable.js\";\nimport { removeDuplicates } from \"./removeDuplicates.js\";\n\n/**\n * Base class for collection-based queries (lists and links)\n * Provides common functionality for working with collections of objects\n */\nexport abstract class BaseListQuery<\n KEY extends CacheKey<any, CollectionStorageData, any, any>,\n PAYLOAD,\n O extends CommonObserveOptions,\n> extends Query<KEY, PAYLOAD, O> {\n /**\n * The sorting strategy to use for this collection\n * @protected\n */\n protected sortingStrategy: SortingStrategy = new NoOpSortingStrategy();\n\n /**\n * Get RDP configuration from the cache key\n */\n public get rdpConfig(): Canonical<Rdp> | null {\n return this.cacheKey.otherKeys[RDP_IDX];\n }\n\n // Collection-specific behavior is implemented by subclasses\n /**\n * Token for the next page of results\n * @protected\n */\n protected nextPageToken?: string;\n\n /**\n * Promise tracking an in-progress page fetch\n * @protected\n */\n protected pendingPageFetch?: Promise<void>;\n\n //\n // Shared Implementations\n //\n\n /**\n * Standard method to update a list of objects\n * Handles common list update patterns for both ListQuery and SpecificLinkQuery\n *\n * @param items Objects or cache keys to add to the list\n * @param status Status to set for the list\n * @param batch Batch context to use\n * @param append Whether to append to the existing list or replace it\n * @returns The updated entry\n */\n public _updateList<T extends ObjectCacheKey | Osdk.Instance<any>>(\n items: T[],\n status: Status,\n batch: BatchContext,\n append: boolean = false,\n ): Entry<KEY> {\n if (process.env.NODE_ENV !== \"production\") {\n this.logger\n ?.child({ methodName: \"updateList\" })\n .debug(\n `{status: ${status}, append: ${append}}`,\n JSON.stringify(items, null, 2),\n );\n }\n\n let objectCacheKeys: ObjectCacheKey[];\n\n if (items.length === 0) {\n objectCacheKeys = [];\n } else if (isObjectInstance(items[0])) {\n // Items are object instances, need to store them first\n objectCacheKeys = this.store.objects.storeOsdkInstances(\n items as Array<Osdk.Instance<any>>,\n batch,\n this.rdpConfig,\n );\n } else {\n // Items are already cache keys\n objectCacheKeys = items as ObjectCacheKey[];\n }\n\n objectCacheKeys = this.#retainReleaseAppend(batch, append, objectCacheKeys);\n objectCacheKeys = this._sortCacheKeys(objectCacheKeys, batch);\n objectCacheKeys = removeDuplicates(objectCacheKeys, batch);\n\n return this.writeToStore({ data: objectCacheKeys }, status, batch);\n }\n\n /**\n * Common implementation for writing to store for collection-based queries\n * @param data The collection data to write to the store\n * @param status The status to set\n * @param batch The batch context\n */\n writeToStore(\n data: CollectionStorageData,\n status: Status,\n batch: BatchContext,\n ): Entry<KEY> {\n const entry = batch.read(this.cacheKey);\n\n if (entry && deepEqual(data, entry.value)) {\n // Check if both data AND status are the same\n if (entry.status === status) {\n if (process.env.NODE_ENV !== \"production\") {\n this.logger?.child({ methodName: \"writeToStore\" }).debug(\n `Collection data was deep equal and status unchanged (${status}), skipping update`,\n );\n }\n // Return the existing entry without writing to avoid unnecessary notifications\n return entry;\n }\n\n if (process.env.NODE_ENV !== \"production\") {\n this.logger?.child({ methodName: \"writeToStore\" }).debug(\n `Collection data was deep equal, just updating status from ${entry.status} to ${status}`,\n );\n }\n // Keep the same value but update status and lastUpdated\n return batch.write(this.cacheKey, entry.value, status);\n }\n\n if (process.env.NODE_ENV !== \"production\") {\n this.logger?.child({ methodName: \"writeToStore\" }).debug(\n `{status: ${status}},`,\n DEBUG_ONLY__cacheKeysToString(data.data),\n );\n }\n\n const ret = batch.write(this.cacheKey, data, status);\n this.registerCacheChanges(batch);\n return ret;\n }\n\n /**\n * Register changes to the cache based on the specific collection type\n * Implemented by subclasses to handle specific change registration\n */\n protected abstract registerCacheChanges(batch: BatchContext): void;\n\n /**\n * Common method for managing object reference counting and appending results\n * Used by collection queries when updating object references\n *\n * @param batch The batch context to use\n * @param append Whether to append to existing objects or replace them\n * @param objectCacheKeys Array of object cache keys to process\n * @returns The final array of object cache keys after retain/release/append\n */\n #retainReleaseAppend(\n batch: BatchContext,\n append: boolean,\n objectCacheKeys: ObjectCacheKey[],\n ): ObjectCacheKey[] {\n const existingList = batch.read(this.cacheKey);\n\n // whether its append or update we need to retain all the new objects\n if (!batch.optimisticWrite) {\n if (!append) {\n // we need to release all the old objects\n // N.B. the store keeps the cache keys around for a bit so we don't\n // need to worry about them being GC'd before we re-retain them\n for (const objectCacheKey of existingList?.value?.data ?? []) {\n this.store.cacheKeys.release(objectCacheKey);\n }\n }\n\n for (const objectCacheKey of objectCacheKeys) {\n this.store.cacheKeys.retain(objectCacheKey);\n }\n }\n\n if (append) {\n objectCacheKeys = [\n ...existingList?.value?.data ?? [],\n ...objectCacheKeys,\n ];\n }\n return objectCacheKeys;\n }\n\n _dispose(): void {\n this.store.batch({}, (batch) => {\n const entry = batch.read(this.cacheKey);\n if (entry) {\n for (const objectCacheKey of entry.value?.data ?? []) {\n this.store.cacheKeys.release(objectCacheKey);\n }\n }\n });\n }\n\n /**\n * Creates a payload from collection parameters\n * Default implementation that covers common fields for all collection types\n * Subclasses may override to add type-specific fields if needed\n *\n * @param params Common collection parameters\n * @returns A typed payload for the specific collection type\n */\n protected createPayload(\n params: CollectionConnectableParams,\n ): PAYLOAD {\n return {\n resolvedList: params.resolvedData,\n isOptimistic: params.isOptimistic,\n fetchMore: this.fetchMore,\n hasMore: this.nextPageToken != null,\n status: params.status,\n lastUpdated: params.lastUpdated,\n } as unknown as PAYLOAD; // Type assertion needed since we don't know exact subtype\n }\n\n /**\n * Creates a connectable observable for this collection\n * Common implementation shared by all collection types\n *\n * @param subject The subject to connect to\n * @returns A connectable observable of the collection's payload type\n */\n protected _createConnectable(\n subject: Observable<SubjectPayload<KEY>>,\n ): Connectable<PAYLOAD> {\n return createCollectionConnectable<KEY, PAYLOAD>(\n subject,\n this.store.subjects,\n (params) => this.createPayload(params),\n );\n }\n\n /**\n * @override Reset pagination state before a fetch\n */\n protected _preFetch(): void {\n this.nextPageToken = undefined;\n super._preFetch();\n }\n\n /**\n * Common fetchMore implementation for pagination\n * Handles pending request management and loading states\n */\n fetchMore = (): Promise<void> => {\n if (this.pendingPageFetch) {\n return this.pendingPageFetch;\n }\n\n if (this.pendingFetch) {\n this.pendingPageFetch = (async () => {\n await this.pendingFetch;\n await this.fetchMore();\n })().finally(() => {\n this.pendingPageFetch = undefined;\n });\n return this.pendingPageFetch;\n }\n\n if (this.nextPageToken == null) {\n return Promise.resolve(undefined);\n }\n\n this.store.batch({}, (batch) => {\n this.setStatus(\"loading\", batch);\n });\n\n this.pendingFetch = this.fetchPageAndUpdate(\n \"loaded\",\n this.abortController?.signal,\n ).then(() => void 0).finally(() => {\n this.pendingFetch = undefined;\n });\n return this.pendingFetch;\n };\n\n /**\n * Minimum number of results to load initially\n * May be overridden by subclasses for specific collection types\n * @protected\n */\n protected minResultsToLoad: number = 0;\n\n /**\n * Common _fetchAndStore implementation for pagination\n * Uses fetchPageAndUpdate to load the initial set of data\n * Will load multiple pages if necessary to reach minResultsToLoad\n */\n protected async _fetchAndStore(): Promise<void> {\n if (process.env.NODE_ENV !== \"production\") {\n this.logger?.child({ methodName: \"_fetchAndStore\" }).debug(\n \"fetching pages\",\n );\n }\n\n // Keep fetching pages until we have the minimum number of results or no more pages\n while (true) {\n const entry = await this.fetchPageAndUpdate(\n \"loading\",\n this.abortController?.signal,\n );\n\n if (!entry) {\n // we were aborted\n return;\n }\n\n // Check if we have enough results or no more pages\n const count = entry.value?.data.length || 0;\n if (count >= this.minResultsToLoad || this.nextPageToken == null) {\n break;\n }\n\n await Promise.resolve();\n }\n\n this.store.batch({}, (batch) => {\n this.setStatus(\"loaded\", batch);\n });\n\n return Promise.resolve();\n }\n\n /**\n * Template method for fetching a page of data and updating the store\n * Provides common error handling and abort signal checking\n *\n * @param status The status to set for the entry\n * @param signal Optional AbortSignal for cancellation\n * @returns A promise that resolves to the updated entry or undefined if aborted\n */\n protected async fetchPageAndUpdate(\n status: Status,\n signal: AbortSignal | undefined,\n ): Promise<Entry<KEY> | undefined> {\n if (process.env.NODE_ENV !== \"production\") {\n this.logger?.child({ methodName: \"fetchPageAndUpdate\" }).debug(\n `Fetching data with status: ${status}`,\n );\n }\n\n // Early abort check\n if (signal?.aborted) {\n return undefined;\n }\n\n try {\n const hadPreviousPage = this.nextPageToken != null;\n\n // Call the subclass-specific implementation to fetch data\n const result = await this.fetchPageData(signal);\n\n // Check for abort again after fetch\n if (signal?.aborted) {\n return undefined;\n }\n\n // Store the fetched data using batch operations\n const { retVal } = this.store.batch({}, (batch) => {\n const append = hadPreviousPage;\n const finalStatus = result.nextPageToken ? status : \"loaded\";\n\n const objectKeys = this.store.objects.storeOsdkInstances(\n result.data,\n batch,\n this.rdpConfig,\n );\n\n return this._updateList(\n objectKeys,\n finalStatus,\n batch,\n append,\n );\n });\n\n return retVal;\n } catch (error: unknown) {\n // Log any errors that occur\n if (process.env.NODE_ENV !== \"production\") {\n this.logger?.child({ methodName: \"fetchPageAndUpdate\" }).error(\n \"Error fetching data\",\n error,\n );\n }\n\n // For unexpected errors, write error status if not aborted\n if (!signal?.aborted) {\n const { retVal } = this.store.batch({}, (batch) => {\n return this.handleFetchError(error, status, batch);\n });\n return retVal;\n }\n\n // If aborted, just return undefined\n return undefined;\n }\n }\n\n /**\n * Abstract method that subclasses implement for their specific data fetching logic\n *\n * @param signal Optional AbortSignal for cancellation\n * @returns A promise that resolves to the fetched data\n */\n protected abstract fetchPageData(\n signal: AbortSignal | undefined,\n ): Promise<PageResult<Osdk.Instance<any>>>;\n\n /**\n * Handle fetch errors by setting appropriate error state\n * Default implementation that subclasses can override\n *\n * @param error The error that occurred\n * @param status The intended status if successful\n * @param batch The batch context to use\n * @returns The updated entry with error status\n */\n protected handleFetchError(\n _error: unknown,\n _status: Status,\n batch: BatchContext,\n ): Entry<KEY> {\n // Default implementation writes an empty list with error status\n // Most subclasses should be able to use this\n return this.writeToStore({ data: [] }, \"error\", batch);\n }\n\n /**\n * Sort the collection items using the configured sorting strategy\n * @param objectCacheKeys - The cache keys to sort\n * @param batch - The batch context\n * @returns Sorted array of cache keys\n */\n protected _sortCacheKeys(\n objectCacheKeys: ObjectCacheKey[],\n batch: BatchContext,\n ): ObjectCacheKey[] {\n return this.sortingStrategy.sortCacheKeys(objectCacheKeys, batch);\n }\n\n /**\n * Unified method for updating collection data in the store\n * Handles storing, sorting, deduplication, and reference counting\n *\n * @param items - Either object cache keys or object instances to update\n * @param options - Configuration options for the update\n * @param batch - The batch context to use\n * @returns The updated entry\n */\n protected updateCollection<T extends ObjectCacheKey | Osdk.Instance<any>>(\n items: T[],\n options: {\n append?: boolean;\n status: Status;\n },\n batch: BatchContext,\n ): Entry<KEY> {\n if (process.env.NODE_ENV !== \"production\") {\n const logger = process.env.NODE_ENV !== \"production\"\n ? this.logger?.child({ methodName: \"updateCollection\" })\n : this.logger;\n\n logger?.debug(\n `{status: ${options.status}, append: ${options.append}}`,\n JSON.stringify(items, null, 2),\n );\n }\n\n // Step 1: Convert items to object cache keys if needed\n let objectCacheKeys: ObjectCacheKey[];\n\n if (items.length === 0) {\n objectCacheKeys = [];\n } else if (isObjectInstance(items[0])) {\n // Items are object instances, need to store them first\n objectCacheKeys = this.store.objects.storeOsdkInstances(\n items as Array<Osdk.Instance<any>>,\n batch,\n this.rdpConfig,\n );\n } else {\n // Items are already cache keys\n objectCacheKeys = items as ObjectCacheKey[];\n }\n\n // Step 2: Handle retain/release/append logic\n objectCacheKeys = this.#retainReleaseAppend(\n batch,\n options.append ?? false,\n objectCacheKeys,\n );\n\n // Step 3: Sort using the configured sorting strategy\n objectCacheKeys = this._sortCacheKeys(objectCacheKeys, batch);\n\n // Step 4: Remove duplicates\n objectCacheKeys = removeDuplicates(objectCacheKeys, batch);\n\n // Step 5: Write to store\n return this.writeToStore({ data: objectCacheKeys }, options.status, batch);\n }\n\n //\n // Shared Websocket Subscription Methods\n //\n\n /**\n * Create standard websocket subscription handlers for an ObjectSet.\n * Subclasses can override individual handlers for custom behavior.\n *\n * @param objectSet The ObjectSet to subscribe to\n * @param sub The parent subscription to add cleanup to\n * @param methodName The method name for logging purposes\n */\n protected createWebsocketSubscription(\n objectSet: ObjectSet<any>,\n sub: Subscription,\n methodName: string = \"registerStreamUpdates\",\n ): void {\n const logger = process.env.NODE_ENV !== \"production\"\n ? this.logger?.child({ methodName })\n : this.logger;\n\n if (process.env.NODE_ENV !== \"production\") {\n logger?.child({ methodName }).info(\"Subscribing from websocket\");\n }\n\n try {\n const websocketSubscription = objectSet.subscribe({\n onChange: this.onOswChange.bind(this),\n onError: this.onOswError.bind(this),\n onOutOfDate: this.onOswOutOfDate.bind(this),\n onSuccessfulSubscription: this.onOswSuccessfulSubscription.bind(this),\n });\n\n sub.add(() => {\n if (process.env.NODE_ENV !== \"production\") {\n logger?.child({ methodName }).info(\"Unsubscribing from websocket\");\n }\n websocketSubscription.unsubscribe();\n });\n } catch (error) {\n if (this.logger) {\n this.logger.child({ methodName })\n .error(\"Failed to register stream updates\", error);\n }\n this.onOswError({ subscriptionClosed: true, error });\n }\n }\n\n /**\n * Handler called when websocket subscription is successfully established.\n */\n protected onOswSuccessfulSubscription(): void {\n if (process.env.NODE_ENV !== \"production\") {\n this.logger?.child({ methodName: \"onSuccessfulSubscription\" }).debug(\"\");\n }\n }\n\n /**\n * Handler called when subscribed data becomes out of date.\n */\n protected onOswOutOfDate(): void {\n if (process.env.NODE_ENV !== \"production\") {\n this.logger?.child({ methodName: \"onOutOfDate\" }).debug(\"\");\n }\n }\n\n /**\n * Handler called when websocket subscription encounters an error.\n */\n protected onOswError(errors: {\n subscriptionClosed: boolean;\n error: unknown;\n }): void {\n if (this.logger) {\n this.logger?.child({ methodName: \"onError\" }).error(\n \"subscription errors\",\n errors,\n );\n }\n }\n\n /**\n * Handler called when an object in the subscribed set is added or updated.\n * Default implementation stores the object with RDP config if available.\n *\n * @param update The object update notification\n */\n protected onOswChange(\n { object, state }: ObjectUpdate<ObjectTypeDefinition, string>,\n ): void {\n const logger = process.env.NODE_ENV !== \"production\"\n ? this.logger?.child({ methodName: \"registerStreamUpdates\" })\n : this.logger;\n\n if (process.env.NODE_ENV !== \"production\") {\n logger?.child({ methodName: \"onChange\" }).debug(\n `Got an update of type: ${state}`,\n object,\n );\n }\n\n if (state === \"ADDED_OR_UPDATED\") {\n this.store.batch({}, (batch) => {\n this.store.objects.storeOsdkInstances(\n [object as Osdk.Instance<ObjectTypeDefinition>],\n batch,\n this.rdpConfig, // Safe - null for queries without RDPs\n );\n });\n } else if (state === \"REMOVED\") {\n this.onOswRemoved(object);\n }\n }\n\n /**\n * Handler called when an object is removed from the subscribed set.\n * Default implementation deletes the object from cache.\n * ListQuery overrides this for list-specific removal logic.\n *\n * @param object The removed object\n */\n protected onOswRemoved(\n object: Osdk.Instance<ObjectTypeDefinition, never, string, {}>,\n ): void {\n if (process.env.NODE_ENV !== \"production\") {\n this.logger?.child({ methodName: \"onRemoved\" }).debug(\n \"Removing object\",\n object,\n );\n }\n\n this.store.batch({}, (batch) => {\n const objectCacheKey = this.store.cacheKeys.get(\n \"object\",\n object.$apiName,\n object.$primaryKey,\n );\n batch.delete(objectCacheKey, \"loaded\");\n });\n }\n}\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"BaseListQuery.js","names":["deepEqual","DEBUG_ONLY__cacheKeysToString","isObjectInstance","RDP_IDX","Query","NoOpSortingStrategy","createCollectionConnectable","removeDuplicates","BaseListQuery","sortingStrategy","rdpConfig","cacheKey","otherKeys","_updateList","items","status","batch","append","process","env","NODE_ENV","logger","child","methodName","debug","JSON","stringify","objectCacheKeys","length","store","objects","storeOsdkInstances","retainReleaseAppend","_sortCacheKeys","writeToStore","data","entry","read","value","write","ret","registerCacheChanges","#retainReleaseAppend","existingList","optimisticWrite","objectCacheKey","cacheKeys","release","retain","_dispose","createPayload","params","resolvedList","resolvedData","isOptimistic","fetchMore","hasMore","nextPageToken","lastUpdated","_createConnectable","subject","subjects","_preFetch","undefined","pendingPageFetch","pendingFetch","finally","Promise","resolve","setStatus","fetchPageAndUpdate","abortController","signal","then","minResultsToLoad","_fetchAndStore","count","aborted","hadPreviousPage","result","fetchPageData","retVal","finalStatus","objectKeys","error","handleFetchError","_error","_status","sortCacheKeys","updateCollection","options","createWebsocketSubscription","objectSet","sub","info","websocketSubscription","subscribe","onChange","onOswChange","bind","onError","onOswError","onOutOfDate","onOswOutOfDate","onSuccessfulSubscription","onOswSuccessfulSubscription","add","unsubscribe","subscriptionClosed","errors","object","state","onOswRemoved","get","$objectType","$apiName","$primaryKey","delete"],"sources":["BaseListQuery.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 ObjectSet,\n ObjectTypeDefinition,\n Osdk,\n PageResult,\n} from \"@osdk/api\";\nimport deepEqual from \"fast-deep-equal\";\nimport type { Connectable, Observable, Subscription } from \"rxjs\";\nimport type {\n CommonObserveOptions,\n Status,\n} from \"../../ObservableClient/common.js\";\nimport type { BatchContext } from \"../BatchContext.js\";\nimport { type CacheKey, DEBUG_ONLY__cacheKeysToString } from \"../CacheKey.js\";\nimport type { Canonical } from \"../Canonical.js\";\nimport { isObjectInstance } from \"../isObjectInstance.js\";\nimport type { Entry } from \"../Layer.js\";\nimport { RDP_IDX } from \"../list/ListCacheKey.js\";\nimport { type ObjectCacheKey } from \"../object/ObjectCacheKey.js\";\nimport { Query } from \"../Query.js\";\nimport type { Rdp } from \"../RdpCanonicalizer.js\";\nimport type { SortingStrategy } from \"../sorting/SortingStrategy.js\";\nimport { NoOpSortingStrategy } from \"../sorting/SortingStrategy.js\";\nimport type { SubjectPayload } from \"../SubjectPayload.js\";\nimport type { ObjectUpdate } from \"../types/ObjectUpdate.js\";\nimport type {\n CollectionConnectableParams,\n CollectionStorageData,\n} from \"./BaseCollectionQuery.js\";\nimport { createCollectionConnectable } from \"./createCollectionConnectable.js\";\nimport { removeDuplicates } from \"./removeDuplicates.js\";\n\n/**\n * Base class for collection-based queries (lists and links)\n * Provides common functionality for working with collections of objects\n */\nexport abstract class BaseListQuery<\n KEY extends CacheKey<any, CollectionStorageData, any, any>,\n PAYLOAD,\n O extends CommonObserveOptions,\n> extends Query<KEY, PAYLOAD, O> {\n /**\n * The sorting strategy to use for this collection\n * @protected\n */\n protected sortingStrategy: SortingStrategy = new NoOpSortingStrategy();\n\n /**\n * Get RDP configuration from the cache key\n */\n public get rdpConfig(): Canonical<Rdp> | null {\n return this.cacheKey.otherKeys[RDP_IDX];\n }\n\n // Collection-specific behavior is implemented by subclasses\n /**\n * Token for the next page of results\n * @protected\n */\n protected nextPageToken?: string;\n\n /**\n * Promise tracking an in-progress page fetch\n * @protected\n */\n protected pendingPageFetch?: Promise<void>;\n\n //\n // Shared Implementations\n //\n\n /**\n * Standard method to update a list of objects\n * Handles common list update patterns for both ListQuery and SpecificLinkQuery\n *\n * @param items Objects or cache keys to add to the list\n * @param status Status to set for the list\n * @param batch Batch context to use\n * @param append Whether to append to the existing list or replace it\n * @returns The updated entry\n */\n public _updateList<T extends ObjectCacheKey | Osdk.Instance<any>>(\n items: T[],\n status: Status,\n batch: BatchContext,\n append: boolean = false,\n ): Entry<KEY> {\n if (process.env.NODE_ENV !== \"production\") {\n this.logger\n ?.child({ methodName: \"updateList\" })\n .debug(\n `{status: ${status}, append: ${append}}`,\n JSON.stringify(items, null, 2),\n );\n }\n\n let objectCacheKeys: ObjectCacheKey[];\n\n if (items.length === 0) {\n objectCacheKeys = [];\n } else if (isObjectInstance(items[0])) {\n // Items are object instances, need to store them first\n objectCacheKeys = this.store.objects.storeOsdkInstances(\n items as Array<Osdk.Instance<any>>,\n batch,\n this.rdpConfig,\n );\n } else {\n // Items are already cache keys\n objectCacheKeys = items as ObjectCacheKey[];\n }\n\n objectCacheKeys = this.#retainReleaseAppend(batch, append, objectCacheKeys);\n objectCacheKeys = this._sortCacheKeys(objectCacheKeys, batch);\n objectCacheKeys = removeDuplicates(objectCacheKeys, batch);\n\n return this.writeToStore({ data: objectCacheKeys }, status, batch);\n }\n\n /**\n * Common implementation for writing to store for collection-based queries\n * @param data The collection data to write to the store\n * @param status The status to set\n * @param batch The batch context\n */\n writeToStore(\n data: CollectionStorageData,\n status: Status,\n batch: BatchContext,\n ): Entry<KEY> {\n const entry = batch.read(this.cacheKey);\n\n if (entry && deepEqual(data, entry.value)) {\n // Check if both data AND status are the same\n if (entry.status === status) {\n if (process.env.NODE_ENV !== \"production\") {\n this.logger?.child({ methodName: \"writeToStore\" }).debug(\n `Collection data was deep equal and status unchanged (${status}), skipping update`,\n );\n }\n // Return the existing entry without writing to avoid unnecessary notifications\n return entry;\n }\n\n if (process.env.NODE_ENV !== \"production\") {\n this.logger?.child({ methodName: \"writeToStore\" }).debug(\n `Collection data was deep equal, just updating status from ${entry.status} to ${status}`,\n );\n }\n // Keep the same value but update status and lastUpdated\n return batch.write(this.cacheKey, entry.value, status);\n }\n\n if (process.env.NODE_ENV !== \"production\") {\n this.logger?.child({ methodName: \"writeToStore\" }).debug(\n `{status: ${status}},`,\n DEBUG_ONLY__cacheKeysToString(data.data),\n );\n }\n\n const ret = batch.write(this.cacheKey, data, status);\n this.registerCacheChanges(batch);\n return ret;\n }\n\n /**\n * Register changes to the cache based on the specific collection type\n * Implemented by subclasses to handle specific change registration\n */\n protected abstract registerCacheChanges(batch: BatchContext): void;\n\n /**\n * Common method for managing object reference counting and appending results\n * Used by collection queries when updating object references\n *\n * @param batch The batch context to use\n * @param append Whether to append to existing objects or replace them\n * @param objectCacheKeys Array of object cache keys to process\n * @returns The final array of object cache keys after retain/release/append\n */\n #retainReleaseAppend(\n batch: BatchContext,\n append: boolean,\n objectCacheKeys: ObjectCacheKey[],\n ): ObjectCacheKey[] {\n const existingList = batch.read(this.cacheKey);\n\n // whether its append or update we need to retain all the new objects\n if (!batch.optimisticWrite) {\n if (!append) {\n // we need to release all the old objects\n // N.B. the store keeps the cache keys around for a bit so we don't\n // need to worry about them being GC'd before we re-retain them\n for (const objectCacheKey of existingList?.value?.data ?? []) {\n this.store.cacheKeys.release(objectCacheKey);\n }\n }\n\n for (const objectCacheKey of objectCacheKeys) {\n this.store.cacheKeys.retain(objectCacheKey);\n }\n }\n\n if (append) {\n objectCacheKeys = [\n ...existingList?.value?.data ?? [],\n ...objectCacheKeys,\n ];\n }\n return objectCacheKeys;\n }\n\n _dispose(): void {\n this.store.batch({}, (batch) => {\n const entry = batch.read(this.cacheKey);\n if (entry) {\n for (const objectCacheKey of entry.value?.data ?? []) {\n this.store.cacheKeys.release(objectCacheKey);\n }\n }\n });\n }\n\n /**\n * Creates a payload from collection parameters\n * Default implementation that covers common fields for all collection types\n * Subclasses may override to add type-specific fields if needed\n *\n * @param params Common collection parameters\n * @returns A typed payload for the specific collection type\n */\n protected createPayload(\n params: CollectionConnectableParams,\n ): PAYLOAD {\n return {\n resolvedList: params.resolvedData,\n isOptimistic: params.isOptimistic,\n fetchMore: this.fetchMore,\n hasMore: this.nextPageToken != null,\n status: params.status,\n lastUpdated: params.lastUpdated,\n } as unknown as PAYLOAD; // Type assertion needed since we don't know exact subtype\n }\n\n /**\n * Creates a connectable observable for this collection\n * Common implementation shared by all collection types\n *\n * @param subject The subject to connect to\n * @returns A connectable observable of the collection's payload type\n */\n protected _createConnectable(\n subject: Observable<SubjectPayload<KEY>>,\n ): Connectable<PAYLOAD> {\n return createCollectionConnectable<KEY, PAYLOAD>(\n subject,\n this.store.subjects,\n (params) => this.createPayload(params),\n );\n }\n\n /**\n * @override Reset pagination state before a fetch\n */\n protected _preFetch(): void {\n this.nextPageToken = undefined;\n super._preFetch();\n }\n\n /**\n * Common fetchMore implementation for pagination\n * Handles pending request management and loading states\n */\n fetchMore = (): Promise<void> => {\n if (this.pendingPageFetch) {\n return this.pendingPageFetch;\n }\n\n if (this.pendingFetch) {\n this.pendingPageFetch = (async () => {\n await this.pendingFetch;\n await this.fetchMore();\n })().finally(() => {\n this.pendingPageFetch = undefined;\n });\n return this.pendingPageFetch;\n }\n\n if (this.nextPageToken == null) {\n return Promise.resolve(undefined);\n }\n\n this.store.batch({}, (batch) => {\n this.setStatus(\"loading\", batch);\n });\n\n this.pendingFetch = this.fetchPageAndUpdate(\n \"loaded\",\n this.abortController?.signal,\n ).then(() => void 0).finally(() => {\n this.pendingFetch = undefined;\n });\n return this.pendingFetch;\n };\n\n /**\n * Minimum number of results to load initially\n * May be overridden by subclasses for specific collection types\n * @protected\n */\n protected minResultsToLoad: number = 0;\n\n /**\n * Common _fetchAndStore implementation for pagination\n * Uses fetchPageAndUpdate to load the initial set of data\n * Will load multiple pages if necessary to reach minResultsToLoad\n */\n protected async _fetchAndStore(): Promise<void> {\n if (process.env.NODE_ENV !== \"production\") {\n this.logger?.child({ methodName: \"_fetchAndStore\" }).debug(\n \"fetching pages\",\n );\n }\n\n // Keep fetching pages until we have the minimum number of results or no more pages\n while (true) {\n const entry = await this.fetchPageAndUpdate(\n \"loading\",\n this.abortController?.signal,\n );\n\n if (!entry) {\n // we were aborted\n return;\n }\n\n // Check if we have enough results or no more pages\n const count = entry.value?.data.length || 0;\n if (count >= this.minResultsToLoad || this.nextPageToken == null) {\n break;\n }\n\n await Promise.resolve();\n }\n\n this.store.batch({}, (batch) => {\n this.setStatus(\"loaded\", batch);\n });\n\n return Promise.resolve();\n }\n\n /**\n * Template method for fetching a page of data and updating the store\n * Provides common error handling and abort signal checking\n *\n * @param status The status to set for the entry\n * @param signal Optional AbortSignal for cancellation\n * @returns A promise that resolves to the updated entry or undefined if aborted\n */\n protected async fetchPageAndUpdate(\n status: Status,\n signal: AbortSignal | undefined,\n ): Promise<Entry<KEY> | undefined> {\n if (process.env.NODE_ENV !== \"production\") {\n this.logger?.child({ methodName: \"fetchPageAndUpdate\" }).debug(\n `Fetching data with status: ${status}`,\n );\n }\n\n // Early abort check\n if (signal?.aborted) {\n return undefined;\n }\n\n try {\n const hadPreviousPage = this.nextPageToken != null;\n\n // Call the subclass-specific implementation to fetch data\n const result = await this.fetchPageData(signal);\n\n // Check for abort again after fetch\n if (signal?.aborted) {\n return undefined;\n }\n\n // Store the fetched data using batch operations\n const { retVal } = this.store.batch({}, (batch) => {\n const append = hadPreviousPage;\n const finalStatus = result.nextPageToken ? status : \"loaded\";\n\n const objectKeys = this.store.objects.storeOsdkInstances(\n result.data,\n batch,\n this.rdpConfig,\n );\n\n return this._updateList(\n objectKeys,\n finalStatus,\n batch,\n append,\n );\n });\n\n return retVal;\n } catch (error: unknown) {\n // Log any errors that occur\n if (process.env.NODE_ENV !== \"production\") {\n this.logger?.child({ methodName: \"fetchPageAndUpdate\" }).error(\n \"Error fetching data\",\n error,\n );\n }\n\n // For unexpected errors, write error status if not aborted\n if (!signal?.aborted) {\n const { retVal } = this.store.batch({}, (batch) => {\n return this.handleFetchError(error, status, batch);\n });\n return retVal;\n }\n\n // If aborted, just return undefined\n return undefined;\n }\n }\n\n /**\n * Abstract method that subclasses implement for their specific data fetching logic\n *\n * @param signal Optional AbortSignal for cancellation\n * @returns A promise that resolves to the fetched data\n */\n protected abstract fetchPageData(\n signal: AbortSignal | undefined,\n ): Promise<PageResult<Osdk.Instance<any>>>;\n\n /**\n * Handle fetch errors by setting appropriate error state\n * Default implementation that subclasses can override\n *\n * @param error The error that occurred\n * @param status The intended status if successful\n * @param batch The batch context to use\n * @returns The updated entry with error status\n */\n protected handleFetchError(\n _error: unknown,\n _status: Status,\n batch: BatchContext,\n ): Entry<KEY> {\n // Default implementation writes an empty list with error status\n // Most subclasses should be able to use this\n return this.writeToStore({ data: [] }, \"error\", batch);\n }\n\n /**\n * Sort the collection items using the configured sorting strategy\n * @param objectCacheKeys - The cache keys to sort\n * @param batch - The batch context\n * @returns Sorted array of cache keys\n */\n protected _sortCacheKeys(\n objectCacheKeys: ObjectCacheKey[],\n batch: BatchContext,\n ): ObjectCacheKey[] {\n return this.sortingStrategy.sortCacheKeys(objectCacheKeys, batch);\n }\n\n /**\n * Unified method for updating collection data in the store\n * Handles storing, sorting, deduplication, and reference counting\n *\n * @param items - Either object cache keys or object instances to update\n * @param options - Configuration options for the update\n * @param batch - The batch context to use\n * @returns The updated entry\n */\n protected updateCollection<T extends ObjectCacheKey | Osdk.Instance<any>>(\n items: T[],\n options: {\n append?: boolean;\n status: Status;\n },\n batch: BatchContext,\n ): Entry<KEY> {\n if (process.env.NODE_ENV !== \"production\") {\n const logger = process.env.NODE_ENV !== \"production\"\n ? this.logger?.child({ methodName: \"updateCollection\" })\n : this.logger;\n\n logger?.debug(\n `{status: ${options.status}, append: ${options.append}}`,\n JSON.stringify(items, null, 2),\n );\n }\n\n // Step 1: Convert items to object cache keys if needed\n let objectCacheKeys: ObjectCacheKey[];\n\n if (items.length === 0) {\n objectCacheKeys = [];\n } else if (isObjectInstance(items[0])) {\n // Items are object instances, need to store them first\n objectCacheKeys = this.store.objects.storeOsdkInstances(\n items as Array<Osdk.Instance<any>>,\n batch,\n this.rdpConfig,\n );\n } else {\n // Items are already cache keys\n objectCacheKeys = items as ObjectCacheKey[];\n }\n\n // Step 2: Handle retain/release/append logic\n objectCacheKeys = this.#retainReleaseAppend(\n batch,\n options.append ?? false,\n objectCacheKeys,\n );\n\n // Step 3: Sort using the configured sorting strategy\n objectCacheKeys = this._sortCacheKeys(objectCacheKeys, batch);\n\n // Step 4: Remove duplicates\n objectCacheKeys = removeDuplicates(objectCacheKeys, batch);\n\n // Step 5: Write to store\n return this.writeToStore({ data: objectCacheKeys }, options.status, batch);\n }\n\n //\n // Shared Websocket Subscription Methods\n //\n\n /**\n * Create standard websocket subscription handlers for an ObjectSet.\n * Subclasses can override individual handlers for custom behavior.\n *\n * @param objectSet The ObjectSet to subscribe to\n * @param sub The parent subscription to add cleanup to\n * @param methodName The method name for logging purposes\n */\n protected createWebsocketSubscription(\n objectSet: ObjectSet<any>,\n sub: Subscription,\n methodName: string = \"registerStreamUpdates\",\n ): void {\n const logger = process.env.NODE_ENV !== \"production\"\n ? this.logger?.child({ methodName })\n : this.logger;\n\n if (process.env.NODE_ENV !== \"production\") {\n logger?.child({ methodName }).info(\"Subscribing from websocket\");\n }\n\n try {\n const websocketSubscription = objectSet.subscribe({\n onChange: this.onOswChange.bind(this),\n onError: this.onOswError.bind(this),\n onOutOfDate: this.onOswOutOfDate.bind(this),\n onSuccessfulSubscription: this.onOswSuccessfulSubscription.bind(this),\n });\n\n sub.add(() => {\n if (process.env.NODE_ENV !== \"production\") {\n logger?.child({ methodName }).info(\"Unsubscribing from websocket\");\n }\n websocketSubscription.unsubscribe();\n });\n } catch (error) {\n if (this.logger) {\n this.logger.child({ methodName })\n .error(\"Failed to register stream updates\", error);\n }\n this.onOswError({ subscriptionClosed: true, error });\n }\n }\n\n /**\n * Handler called when websocket subscription is successfully established.\n */\n protected onOswSuccessfulSubscription(): void {\n if (process.env.NODE_ENV !== \"production\") {\n this.logger?.child({ methodName: \"onSuccessfulSubscription\" }).debug(\"\");\n }\n }\n\n /**\n * Handler called when subscribed data becomes out of date.\n */\n protected onOswOutOfDate(): void {\n if (process.env.NODE_ENV !== \"production\") {\n this.logger?.child({ methodName: \"onOutOfDate\" }).debug(\"\");\n }\n }\n\n /**\n * Handler called when websocket subscription encounters an error.\n */\n protected onOswError(errors: {\n subscriptionClosed: boolean;\n error: unknown;\n }): void {\n if (this.logger) {\n this.logger?.child({ methodName: \"onError\" }).error(\n \"subscription errors\",\n errors,\n );\n }\n }\n\n /**\n * Handler called when an object in the subscribed set is added or updated.\n * Default implementation stores the object with RDP config if available.\n *\n * @param update The object update notification\n */\n protected onOswChange(\n { object, state }: ObjectUpdate<ObjectTypeDefinition, string>,\n ): void {\n const logger = process.env.NODE_ENV !== \"production\"\n ? this.logger?.child({ methodName: \"registerStreamUpdates\" })\n : this.logger;\n\n if (process.env.NODE_ENV !== \"production\") {\n logger?.child({ methodName: \"onChange\" }).debug(\n `Got an update of type: ${state}`,\n object,\n );\n }\n\n if (state === \"ADDED_OR_UPDATED\") {\n this.store.batch({}, (batch) => {\n this.store.objects.storeOsdkInstances(\n [object as Osdk.Instance<ObjectTypeDefinition>],\n batch,\n this.rdpConfig, // Safe - null for queries without RDPs\n );\n });\n } else if (state === \"REMOVED\") {\n this.onOswRemoved(object);\n }\n }\n\n /**\n * Handler called when an object is removed from the subscribed set.\n * Default implementation deletes the object from cache.\n * ListQuery overrides this for list-specific removal logic.\n *\n * @param object The removed object\n */\n protected onOswRemoved(\n object: Osdk.Instance<ObjectTypeDefinition, never, string, {}>,\n ): void {\n if (process.env.NODE_ENV !== \"production\") {\n this.logger?.child({ methodName: \"onRemoved\" }).debug(\n \"Removing object\",\n object,\n );\n }\n\n this.store.batch({}, (batch) => {\n const objectCacheKey = this.store.cacheKeys.get(\n \"object\",\n object.$objectType ?? object.$apiName,\n object.$primaryKey,\n );\n batch.delete(objectCacheKey, \"loaded\");\n });\n }\n}\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -88,9 +88,10 @@ export class FunctionParamsCanonicalizer {
|
|
|
88
88
|
return arr;
|
|
89
89
|
}
|
|
90
90
|
if (isObjectSpecifiersObject(value)) {
|
|
91
|
-
|
|
91
|
+
const objectType = value.$objectType ?? value.$apiName;
|
|
92
|
+
path.push("$:osdk", objectType, value.$primaryKey);
|
|
92
93
|
return {
|
|
93
|
-
$apiName:
|
|
94
|
+
$apiName: objectType,
|
|
94
95
|
$primaryKey: value.$primaryKey
|
|
95
96
|
};
|
|
96
97
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FunctionParamsCanonicalizer.js","names":["Trie","getWireObjectSet","isObjectSet","isObjectSpecifiersObject","isPrimitiveValue","value","t","FunctionParamsCanonicalizer","inputCache","WeakMap","trie","canonicalByMarker","canonicalize","params","undefined","has","get","seen","WeakSet","path","canonicalValue","encodeAndBuild","marker","lookupArray","canonical","set","#encodeAndBuild","push","Error","add","Date","iso","toISOString","Array","isArray","arr","map","item","Set","sorted","sortSetValues","from","Map","sortMapEntries","entries","k","v","$apiName","$primaryKey","wire","obj","key","Object","keys","sort","comparePrimitives","#comparePrimitives","a","b","ta","tb","localeCompare","an","bn","Number","isNaN","ab","bb","#sortSetValues","items","slice","JSON","stringify","#sortMapEntries"],"sources":["FunctionParamsCanonicalizer.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 { ObjectSet as WireObjectSet } from \"@osdk/foundry.ontologies\";\nimport { Trie } from \"@wry/trie\";\nimport {\n getWireObjectSet,\n isObjectSet,\n} from \"../../../objectSet/createObjectSet.js\";\nimport { isObjectSpecifiersObject } from \"../../../util/isObjectSpecifiersObject.js\";\nimport type { Canonical } from \"../Canonical.js\";\n\nexport type CanonicalFunctionParams = Record<string, CanonicalValue>;\n\ntype PrimitiveValue = string | number | boolean | bigint | null | undefined;\n\ntype OsdkObjectRef = { $apiName: string; $primaryKey: string | number };\n\ntype CanonicalValue =\n | PrimitiveValue\n | OsdkObjectRef\n | WireObjectSet\n | CanonicalValue[]\n | [CanonicalValue, CanonicalValue][]\n | { [key: string]: CanonicalValue };\n\ntype PathElement = PrimitiveValue | WireObjectSet;\n\n// Path markers use \"$:\" prefix. User data with this prefix is unlikely but could\n// theoretically cause collisions if it matches the exact marker sequence.\nfunction isPrimitiveValue(value: unknown): value is PrimitiveValue {\n if (value == null) return true;\n const t = typeof value;\n return t === \"string\" || t === \"number\" || t === \"boolean\" || t === \"bigint\";\n}\n\nexport class FunctionParamsCanonicalizer {\n #inputCache = new WeakMap<\n Record<string, unknown>,\n Canonical<CanonicalFunctionParams>\n >();\n #trie = new Trie<object>(false);\n #canonicalByMarker = new WeakMap<\n object,\n Canonical<CanonicalFunctionParams>\n >();\n\n public canonicalize(\n params: Record<string, unknown> | undefined | null,\n ): Canonical<CanonicalFunctionParams> | undefined {\n if (params == null) {\n return undefined;\n }\n\n if (this.#inputCache.has(params)) {\n return this.#inputCache.get(params);\n }\n\n const seen = new WeakSet<object>();\n const path: PathElement[] = [];\n const canonicalValue = this.#encodeAndBuild(\n params,\n path,\n seen,\n ) as CanonicalFunctionParams;\n\n const marker = this.#trie.lookupArray(path);\n let canonical = this.#canonicalByMarker.get(marker);\n if (canonical === undefined) {\n canonical = canonicalValue as Canonical<CanonicalFunctionParams>;\n this.#canonicalByMarker.set(marker, canonical);\n }\n\n this.#inputCache.set(params, canonical);\n return canonical;\n }\n\n #encodeAndBuild(\n value: unknown,\n path: PathElement[],\n seen: WeakSet<object>,\n ): CanonicalValue {\n if (value == null) {\n path.push(value);\n return value;\n }\n\n if (isPrimitiveValue(value)) {\n path.push(value);\n return value;\n }\n\n // Poor man's circular reference detection, we should improve this if this turns into a problem\n if (seen.has(value as object)) {\n throw new Error(\"Circular reference in function parameters\");\n }\n seen.add(value as object);\n\n if (value instanceof Date) {\n const iso = value.toISOString();\n path.push(\"$:date\", iso);\n return iso;\n }\n\n if (Array.isArray(value)) {\n path.push(\"$:array\");\n const arr = value.map(item => this.#encodeAndBuild(item, path, seen));\n path.push(\"$:array_end\");\n return arr;\n }\n\n if (value instanceof Set) {\n path.push(\"$:set\");\n const sorted = this.#sortSetValues(Array.from(value));\n const arr = sorted.map(item => this.#encodeAndBuild(item, path, seen));\n path.push(\"$:set_end\");\n return arr;\n }\n\n if (value instanceof Map) {\n path.push(\"$:map\");\n const sorted = this.#sortMapEntries(Array.from(value.entries()));\n const arr: [CanonicalValue, CanonicalValue][] = sorted.map(([k, v]) => [\n this.#encodeAndBuild(k, path, seen),\n this.#encodeAndBuild(v, path, seen),\n ]);\n path.push(\"$:map_end\");\n return arr;\n }\n\n if (isObjectSpecifiersObject(value)) {\n path.push(\"$:osdk\", value.$apiName, value.$primaryKey);\n return { $apiName: value.$apiName, $primaryKey: value.$primaryKey };\n }\n\n if (isObjectSet(value)) {\n const wire = getWireObjectSet(value);\n path.push(\"$:objectset\", wire);\n return wire;\n }\n\n const obj = value as Record<string, unknown>;\n path.push(\"$:object\");\n const canonical: Record<string, CanonicalValue> = {};\n for (const key of Object.keys(obj).sort()) {\n path.push(key);\n canonical[key] = this.#encodeAndBuild(obj[key], path, seen);\n }\n path.push(\"$:object_end\");\n return canonical;\n }\n\n #comparePrimitives(a: PrimitiveValue, b: PrimitiveValue): number {\n const ta = typeof a;\n const tb = typeof b;\n if (ta !== tb) return ta.localeCompare(tb);\n if (ta === \"string\") return (a as string).localeCompare(b as string);\n if (ta === \"number\") {\n const an = a as number;\n const bn = b as number;\n if (Number.isNaN(an) && Number.isNaN(bn)) return 0;\n if (Number.isNaN(an)) return 1;\n if (Number.isNaN(bn)) return -1;\n return an - bn;\n }\n if (ta === \"boolean\") return (a ? 1 : 0) - (b ? 1 : 0);\n if (ta === \"bigint\") {\n const ab = a as bigint;\n const bb = b as bigint;\n return ab < bb ? -1 : ab > bb ? 1 : 0;\n }\n return 0;\n }\n\n #sortSetValues<T>(items: T[]): T[] {\n return items.slice().sort((a, b) => {\n if (isPrimitiveValue(a) && isPrimitiveValue(b)) {\n return this.#comparePrimitives(a, b);\n }\n return JSON.stringify(a).localeCompare(JSON.stringify(b));\n });\n }\n\n #sortMapEntries<K, V>(entries: [K, V][]): [K, V][] {\n return entries.slice().sort(([a], [b]) => {\n if (isPrimitiveValue(a) && isPrimitiveValue(b)) {\n return this.#comparePrimitives(a, b);\n }\n return JSON.stringify(a).localeCompare(JSON.stringify(b));\n });\n }\n}\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"FunctionParamsCanonicalizer.js","names":["Trie","getWireObjectSet","isObjectSet","isObjectSpecifiersObject","isPrimitiveValue","value","t","FunctionParamsCanonicalizer","inputCache","WeakMap","trie","canonicalByMarker","canonicalize","params","undefined","has","get","seen","WeakSet","path","canonicalValue","encodeAndBuild","marker","lookupArray","canonical","set","#encodeAndBuild","push","Error","add","Date","iso","toISOString","Array","isArray","arr","map","item","Set","sorted","sortSetValues","from","Map","sortMapEntries","entries","k","v","objectType","$objectType","$apiName","$primaryKey","wire","obj","key","Object","keys","sort","comparePrimitives","#comparePrimitives","a","b","ta","tb","localeCompare","an","bn","Number","isNaN","ab","bb","#sortSetValues","items","slice","JSON","stringify","#sortMapEntries"],"sources":["FunctionParamsCanonicalizer.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 { ObjectSet as WireObjectSet } from \"@osdk/foundry.ontologies\";\nimport { Trie } from \"@wry/trie\";\nimport {\n getWireObjectSet,\n isObjectSet,\n} from \"../../../objectSet/createObjectSet.js\";\nimport { isObjectSpecifiersObject } from \"../../../util/isObjectSpecifiersObject.js\";\nimport type { Canonical } from \"../Canonical.js\";\n\nexport type CanonicalFunctionParams = Record<string, CanonicalValue>;\n\ntype PrimitiveValue = string | number | boolean | bigint | null | undefined;\n\ntype OsdkObjectRef = { $apiName: string; $primaryKey: string | number };\n\ntype CanonicalValue =\n | PrimitiveValue\n | OsdkObjectRef\n | WireObjectSet\n | CanonicalValue[]\n | [CanonicalValue, CanonicalValue][]\n | { [key: string]: CanonicalValue };\n\ntype PathElement = PrimitiveValue | WireObjectSet;\n\n// Path markers use \"$:\" prefix. User data with this prefix is unlikely but could\n// theoretically cause collisions if it matches the exact marker sequence.\nfunction isPrimitiveValue(value: unknown): value is PrimitiveValue {\n if (value == null) return true;\n const t = typeof value;\n return t === \"string\" || t === \"number\" || t === \"boolean\" || t === \"bigint\";\n}\n\nexport class FunctionParamsCanonicalizer {\n #inputCache = new WeakMap<\n Record<string, unknown>,\n Canonical<CanonicalFunctionParams>\n >();\n #trie = new Trie<object>(false);\n #canonicalByMarker = new WeakMap<\n object,\n Canonical<CanonicalFunctionParams>\n >();\n\n public canonicalize(\n params: Record<string, unknown> | undefined | null,\n ): Canonical<CanonicalFunctionParams> | undefined {\n if (params == null) {\n return undefined;\n }\n\n if (this.#inputCache.has(params)) {\n return this.#inputCache.get(params);\n }\n\n const seen = new WeakSet<object>();\n const path: PathElement[] = [];\n const canonicalValue = this.#encodeAndBuild(\n params,\n path,\n seen,\n ) as CanonicalFunctionParams;\n\n const marker = this.#trie.lookupArray(path);\n let canonical = this.#canonicalByMarker.get(marker);\n if (canonical === undefined) {\n canonical = canonicalValue as Canonical<CanonicalFunctionParams>;\n this.#canonicalByMarker.set(marker, canonical);\n }\n\n this.#inputCache.set(params, canonical);\n return canonical;\n }\n\n #encodeAndBuild(\n value: unknown,\n path: PathElement[],\n seen: WeakSet<object>,\n ): CanonicalValue {\n if (value == null) {\n path.push(value);\n return value;\n }\n\n if (isPrimitiveValue(value)) {\n path.push(value);\n return value;\n }\n\n // Poor man's circular reference detection, we should improve this if this turns into a problem\n if (seen.has(value as object)) {\n throw new Error(\"Circular reference in function parameters\");\n }\n seen.add(value as object);\n\n if (value instanceof Date) {\n const iso = value.toISOString();\n path.push(\"$:date\", iso);\n return iso;\n }\n\n if (Array.isArray(value)) {\n path.push(\"$:array\");\n const arr = value.map(item => this.#encodeAndBuild(item, path, seen));\n path.push(\"$:array_end\");\n return arr;\n }\n\n if (value instanceof Set) {\n path.push(\"$:set\");\n const sorted = this.#sortSetValues(Array.from(value));\n const arr = sorted.map(item => this.#encodeAndBuild(item, path, seen));\n path.push(\"$:set_end\");\n return arr;\n }\n\n if (value instanceof Map) {\n path.push(\"$:map\");\n const sorted = this.#sortMapEntries(Array.from(value.entries()));\n const arr: [CanonicalValue, CanonicalValue][] = sorted.map(([k, v]) => [\n this.#encodeAndBuild(k, path, seen),\n this.#encodeAndBuild(v, path, seen),\n ]);\n path.push(\"$:map_end\");\n return arr;\n }\n\n if (isObjectSpecifiersObject(value)) {\n const objectType = value.$objectType ?? value.$apiName;\n path.push(\"$:osdk\", objectType, value.$primaryKey);\n return { $apiName: objectType, $primaryKey: value.$primaryKey };\n }\n\n if (isObjectSet(value)) {\n const wire = getWireObjectSet(value);\n path.push(\"$:objectset\", wire);\n return wire;\n }\n\n const obj = value as Record<string, unknown>;\n path.push(\"$:object\");\n const canonical: Record<string, CanonicalValue> = {};\n for (const key of Object.keys(obj).sort()) {\n path.push(key);\n canonical[key] = this.#encodeAndBuild(obj[key], path, seen);\n }\n path.push(\"$:object_end\");\n return canonical;\n }\n\n #comparePrimitives(a: PrimitiveValue, b: PrimitiveValue): number {\n const ta = typeof a;\n const tb = typeof b;\n if (ta !== tb) return ta.localeCompare(tb);\n if (ta === \"string\") return (a as string).localeCompare(b as string);\n if (ta === \"number\") {\n const an = a as number;\n const bn = b as number;\n if (Number.isNaN(an) && Number.isNaN(bn)) return 0;\n if (Number.isNaN(an)) return 1;\n if (Number.isNaN(bn)) return -1;\n return an - bn;\n }\n if (ta === \"boolean\") return (a ? 1 : 0) - (b ? 1 : 0);\n if (ta === \"bigint\") {\n const ab = a as bigint;\n const bb = b as bigint;\n return ab < bb ? -1 : ab > bb ? 1 : 0;\n }\n return 0;\n }\n\n #sortSetValues<T>(items: T[]): T[] {\n return items.slice().sort((a, b) => {\n if (isPrimitiveValue(a) && isPrimitiveValue(b)) {\n return this.#comparePrimitives(a, b);\n }\n return JSON.stringify(a).localeCompare(JSON.stringify(b));\n });\n }\n\n #sortMapEntries<K, V>(entries: [K, V][]): [K, V][] {\n return entries.slice().sort(([a], [b]) => {\n if (isPrimitiveValue(a) && isPrimitiveValue(b)) {\n return this.#comparePrimitives(a, b);\n }\n return JSON.stringify(a).localeCompare(JSON.stringify(b));\n });\n }\n}\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -16,7 +16,7 @@
|
|
|
16
16
|
|
|
17
17
|
import groupBy from "object.groupby";
|
|
18
18
|
import invariant from "tiny-invariant";
|
|
19
|
-
import { ObjectDefRef
|
|
19
|
+
import { ObjectDefRef } from "../../../object/convertWireToOsdkObjects/InternalSymbols.js";
|
|
20
20
|
import { ListQuery, RDP_IDX } from "./ListQuery.js";
|
|
21
21
|
export class InterfaceListQuery extends ListQuery {
|
|
22
22
|
createObjectSet(store) {
|
|
@@ -42,6 +42,17 @@ export class InterfaceListQuery extends ListQuery {
|
|
|
42
42
|
async postProcessFetchedData(data) {
|
|
43
43
|
return reloadDataAsFullObjects(this.store.client, data);
|
|
44
44
|
}
|
|
45
|
+
createPayload(params) {
|
|
46
|
+
const resolvedList = params.resolvedData.map(obj => obj.$as(this.apiName));
|
|
47
|
+
return {
|
|
48
|
+
resolvedList,
|
|
49
|
+
isOptimistic: params.isOptimistic,
|
|
50
|
+
fetchMore: this.fetchMore,
|
|
51
|
+
hasMore: this.nextPageToken != null,
|
|
52
|
+
status: params.status,
|
|
53
|
+
lastUpdated: params.lastUpdated
|
|
54
|
+
};
|
|
55
|
+
}
|
|
45
56
|
extractRelevantObjects(changes) {
|
|
46
57
|
const matchesApiName = ([, object]) => {
|
|
47
58
|
return this.apiName in object[ObjectDefRef].interfaceMap;
|
|
@@ -65,12 +76,16 @@ export class InterfaceListQuery extends ListQuery {
|
|
|
65
76
|
|
|
66
77
|
// Hopefully this can go away when we can just request the full object properties on first load
|
|
67
78
|
async function reloadDataAsFullObjects(client, data) {
|
|
79
|
+
if (data.length === 0) {
|
|
80
|
+
return data;
|
|
81
|
+
}
|
|
68
82
|
const groups = groupBy(data, x => x.$objectType);
|
|
69
83
|
const objectTypeToPrimaryKeyToObject = Object.fromEntries(await Promise.all(Object.entries(groups).map(async ([apiName, objects]) => {
|
|
70
|
-
//
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
84
|
+
// Interface query results don't have ObjectDefRef, so we fetch metadata to get primaryKeyApiName
|
|
85
|
+
const objectDef = await client.fetchMetadata({
|
|
86
|
+
type: "object",
|
|
87
|
+
apiName
|
|
88
|
+
});
|
|
74
89
|
const where = {
|
|
75
90
|
[objectDef.primaryKeyApiName]: {
|
|
76
91
|
$in: objects.map(x => x.$primaryKey)
|
|
@@ -79,10 +94,10 @@ async function reloadDataAsFullObjects(client, data) {
|
|
|
79
94
|
const result = await client(objectDef).where(where).fetchPage();
|
|
80
95
|
return [apiName, Object.fromEntries(result.data.map(x => [x.$primaryKey, x]))];
|
|
81
96
|
})));
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
97
|
+
return data.map(obj => {
|
|
98
|
+
const fullObject = objectTypeToPrimaryKeyToObject[obj.$objectType][obj.$primaryKey];
|
|
99
|
+
!fullObject ? process.env.NODE_ENV !== "production" ? invariant(false, `Could not find object ${obj.$objectType} ${obj.$primaryKey}`) : invariant(false) : void 0;
|
|
100
|
+
return fullObject;
|
|
85
101
|
});
|
|
86
|
-
return data;
|
|
87
102
|
}
|
|
88
103
|
//# sourceMappingURL=InterfaceListQuery.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"InterfaceListQuery.js","names":["groupBy","invariant","ObjectDefRef","UnderlyingOsdkObject","ListQuery","RDP_IDX","InterfaceListQuery","createObjectSet","store","rdpConfig","cacheKey","otherKeys","objectTypeDef","type","apiName","client","withProperties","where","canonicalWhere","revalidateObjectType","objectMetadata","fetchMetadata","interfaceMap","revalidate","postProcessFetchedData","data","reloadDataAsFullObjects","extractRelevantObjects","changes","matchesApiName","object","added","Array","from","addedObjects","filter","map","$as","modified","modifiedObjects","all","strictMatches","Set","sortaMatches","groups","x","$objectType","objectTypeToPrimaryKeyToObject","Object","fromEntries","Promise","entries","objects","objectDef","primaryKeyApiName","$in","$primaryKey","result","fetchPage","obj","process","env","NODE_ENV"],"sources":["InterfaceListQuery.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 { ObjectSet, ObjectTypeDefinition, Osdk } from \"@osdk/api\";\nimport groupBy from \"object.groupby\";\nimport invariant from \"tiny-invariant\";\nimport type { Client } from \"../../../Client.js\";\nimport type { InterfaceHolder } from \"../../../object/convertWireToOsdkObjects/InterfaceHolder.js\";\nimport {\n ObjectDefRef,\n UnderlyingOsdkObject,\n} from \"../../../object/convertWireToOsdkObjects/InternalSymbols.js\";\nimport type { ObjectHolder } from \"../../../object/convertWireToOsdkObjects/ObjectHolder.js\";\nimport type { Changes } from \"../Changes.js\";\nimport type { Rdp } from \"../RdpCanonicalizer.js\";\nimport type { SimpleWhereClause } from \"../SimpleWhereClause.js\";\nimport type { Store } from \"../Store.js\";\nimport { ListQuery, RDP_IDX } from \"./ListQuery.js\";\n\ntype ExtractRelevantObjectsResult = Record<\"added\" | \"modified\", {\n all: (ObjectHolder | InterfaceHolder)[];\n strictMatches: Set<(ObjectHolder | InterfaceHolder)>;\n sortaMatches: Set<(ObjectHolder | InterfaceHolder)>;\n}>;\n\nexport class InterfaceListQuery extends ListQuery {\n protected createObjectSet(store: Store): ObjectSet<ObjectTypeDefinition> {\n const rdpConfig = this.cacheKey.otherKeys[RDP_IDX];\n const type: string = \"interface\" as const;\n const objectTypeDef = {\n type,\n apiName: this.apiName,\n } as ObjectTypeDefinition;\n\n if (rdpConfig != null) {\n return store.client(objectTypeDef)\n .withProperties(rdpConfig as Rdp)\n .where(this.canonicalWhere);\n }\n\n return store.client(objectTypeDef)\n .where(this.canonicalWhere);\n }\n\n async revalidateObjectType(apiName: string): Promise<void> {\n const objectMetadata = await this.store.client.fetchMetadata({\n type: \"object\",\n apiName,\n });\n\n if (this.apiName in objectMetadata.interfaceMap) {\n await this.revalidate(/* force */ true);\n }\n }\n\n protected async postProcessFetchedData(\n data: Osdk.Instance<any>[],\n ): Promise<Osdk.Instance<any>[]> {\n return reloadDataAsFullObjects(this.store.client, data);\n }\n\n protected extractRelevantObjects(\n changes: Changes,\n ): ExtractRelevantObjectsResult {\n const matchesApiName = ([, object]: [unknown, ObjectHolder]) => {\n return this.apiName in object[ObjectDefRef].interfaceMap;\n };\n\n const added = Array.from(changes.addedObjects).filter(matchesApiName).map((\n [, object],\n ) => object.$as(this.apiName));\n\n const modified = Array.from(changes.modifiedObjects).filter(matchesApiName)\n .map((\n [, object],\n ) => object.$as(this.apiName));\n\n return {\n added: {\n all: added,\n strictMatches: new Set(),\n sortaMatches: new Set(),\n },\n modified: {\n all: modified,\n strictMatches: new Set(),\n sortaMatches: new Set(),\n },\n };\n }\n}\n\n// Hopefully this can go away when we can just request the full object properties on first load\nasync function reloadDataAsFullObjects(\n client: Client,\n data: Osdk.Instance<any>[],\n) {\n const groups = groupBy(data, (x) => x.$objectType);\n const objectTypeToPrimaryKeyToObject = Object.fromEntries(\n await Promise.all(\n Object.entries(groups).map<\n Promise<\n [\n /** objectType **/ string,\n Record<string | number, Osdk.Instance<ObjectTypeDefinition>>,\n ]\n >\n >(async ([apiName, objects]) => {\n // to keep InternalSimpleOsdkInstance simple, we make both the `ObjectDefRef` and\n // the `InterfaceDefRef` optional but we know that the right one is on there\n // thus we can `!`\n const objectDef = (objects[0] as ObjectHolder)[UnderlyingOsdkObject][\n ObjectDefRef\n ]!;\n const where: SimpleWhereClause = {\n [objectDef.primaryKeyApiName]: {\n $in: objects.map(x => x.$primaryKey),\n },\n };\n\n const result = await client(\n objectDef as ObjectTypeDefinition,\n ).where(\n where as Parameters<ObjectSet<ObjectTypeDefinition>[\"where\"]>[0],\n ).fetchPage();\n return [\n apiName,\n Object.fromEntries(result.data.map(\n x => [x.$primaryKey, x],\n )),\n ];\n }),\n ),\n );\n\n data = data.map((obj) => {\n invariant(\n objectTypeToPrimaryKeyToObject[obj.$objectType][obj.$primaryKey],\n `Could not find object ${obj.$objectType} ${obj.$primaryKey}`,\n );\n return objectTypeToPrimaryKeyToObject[obj.$objectType][obj.$primaryKey];\n });\n\n return data;\n}\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"InterfaceListQuery.js","names":["groupBy","invariant","ObjectDefRef","ListQuery","RDP_IDX","InterfaceListQuery","createObjectSet","store","rdpConfig","cacheKey","otherKeys","objectTypeDef","type","apiName","client","withProperties","where","canonicalWhere","revalidateObjectType","objectMetadata","fetchMetadata","interfaceMap","revalidate","postProcessFetchedData","data","reloadDataAsFullObjects","createPayload","params","resolvedList","resolvedData","map","obj","$as","isOptimistic","fetchMore","hasMore","nextPageToken","status","lastUpdated","extractRelevantObjects","changes","matchesApiName","object","added","Array","from","addedObjects","filter","modified","modifiedObjects","all","strictMatches","Set","sortaMatches","length","groups","x","$objectType","objectTypeToPrimaryKeyToObject","Object","fromEntries","Promise","entries","objects","objectDef","primaryKeyApiName","$in","$primaryKey","result","fetchPage","fullObject","process","env","NODE_ENV"],"sources":["InterfaceListQuery.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 { ObjectSet, ObjectTypeDefinition, Osdk } from \"@osdk/api\";\nimport groupBy from \"object.groupby\";\nimport invariant from \"tiny-invariant\";\nimport type { Client } from \"../../../Client.js\";\nimport type { InterfaceHolder } from \"../../../object/convertWireToOsdkObjects/InterfaceHolder.js\";\nimport { ObjectDefRef } from \"../../../object/convertWireToOsdkObjects/InternalSymbols.js\";\nimport type { ObjectHolder } from \"../../../object/convertWireToOsdkObjects/ObjectHolder.js\";\nimport type { ListPayload } from \"../../ListPayload.js\";\nimport type { CollectionConnectableParams } from \"../base-list/BaseCollectionQuery.js\";\nimport type { Changes } from \"../Changes.js\";\nimport type { Rdp } from \"../RdpCanonicalizer.js\";\nimport type { SimpleWhereClause } from \"../SimpleWhereClause.js\";\nimport type { Store } from \"../Store.js\";\nimport { ListQuery, RDP_IDX } from \"./ListQuery.js\";\n\ntype ExtractRelevantObjectsResult = Record<\"added\" | \"modified\", {\n all: (ObjectHolder | InterfaceHolder)[];\n strictMatches: Set<(ObjectHolder | InterfaceHolder)>;\n sortaMatches: Set<(ObjectHolder | InterfaceHolder)>;\n}>;\n\nexport class InterfaceListQuery extends ListQuery {\n protected createObjectSet(store: Store): ObjectSet<ObjectTypeDefinition> {\n const rdpConfig = this.cacheKey.otherKeys[RDP_IDX];\n const type: string = \"interface\" as const;\n const objectTypeDef = {\n type,\n apiName: this.apiName,\n } as ObjectTypeDefinition;\n\n if (rdpConfig != null) {\n return store.client(objectTypeDef)\n .withProperties(rdpConfig as Rdp)\n .where(this.canonicalWhere);\n }\n\n return store.client(objectTypeDef)\n .where(this.canonicalWhere);\n }\n\n async revalidateObjectType(apiName: string): Promise<void> {\n const objectMetadata = await this.store.client.fetchMetadata({\n type: \"object\",\n apiName,\n });\n\n if (this.apiName in objectMetadata.interfaceMap) {\n await this.revalidate(/* force */ true);\n }\n }\n\n protected async postProcessFetchedData(\n data: Osdk.Instance<any>[],\n ): Promise<Osdk.Instance<any>[]> {\n return reloadDataAsFullObjects(this.store.client, data);\n }\n\n protected createPayload(\n params: CollectionConnectableParams,\n ): ListPayload {\n const resolvedList = params.resolvedData.map((obj: ObjectHolder) =>\n obj.$as(this.apiName)\n );\n\n return {\n resolvedList,\n isOptimistic: params.isOptimistic,\n fetchMore: this.fetchMore,\n hasMore: this.nextPageToken != null,\n status: params.status,\n lastUpdated: params.lastUpdated,\n };\n }\n\n protected extractRelevantObjects(\n changes: Changes,\n ): ExtractRelevantObjectsResult {\n const matchesApiName = ([, object]: [unknown, ObjectHolder]) => {\n return this.apiName in object[ObjectDefRef].interfaceMap;\n };\n\n const added = Array.from(changes.addedObjects).filter(matchesApiName).map((\n [, object],\n ) => object.$as(this.apiName));\n\n const modified = Array.from(changes.modifiedObjects).filter(matchesApiName)\n .map((\n [, object],\n ) => object.$as(this.apiName));\n\n return {\n added: {\n all: added,\n strictMatches: new Set(),\n sortaMatches: new Set(),\n },\n modified: {\n all: modified,\n strictMatches: new Set(),\n sortaMatches: new Set(),\n },\n };\n }\n}\n\n// Hopefully this can go away when we can just request the full object properties on first load\nasync function reloadDataAsFullObjects(\n client: Client,\n data: Osdk.Instance<any>[],\n) {\n if (data.length === 0) {\n return data;\n }\n\n const groups = groupBy(data, (x) => x.$objectType);\n const objectTypeToPrimaryKeyToObject = Object.fromEntries(\n await Promise.all(\n Object.entries(groups).map<\n Promise<\n [\n /** objectType **/ string,\n Record<string | number, Osdk.Instance<ObjectTypeDefinition>>,\n ]\n >\n >(async ([apiName, objects]) => {\n // Interface query results don't have ObjectDefRef, so we fetch metadata to get primaryKeyApiName\n const objectDef = await client.fetchMetadata({\n type: \"object\",\n apiName,\n });\n const where: SimpleWhereClause = {\n [objectDef.primaryKeyApiName]: {\n $in: objects.map(x => x.$primaryKey),\n },\n };\n\n const result = await client(\n objectDef as ObjectTypeDefinition,\n ).where(\n where as Parameters<ObjectSet<ObjectTypeDefinition>[\"where\"]>[0],\n ).fetchPage();\n return [\n apiName,\n Object.fromEntries(result.data.map(\n x => [x.$primaryKey, x],\n )),\n ];\n }),\n ),\n );\n\n return data.map((obj) => {\n const fullObject =\n objectTypeToPrimaryKeyToObject[obj.$objectType][obj.$primaryKey];\n invariant(\n fullObject,\n `Could not find object ${obj.$objectType} ${obj.$primaryKey}`,\n );\n return fullObject;\n });\n}\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -41,10 +41,8 @@ export class ObjectsHelper extends AbstractHelper {
|
|
|
41
41
|
* @internal
|
|
42
42
|
*/
|
|
43
43
|
storeOsdkInstances(values, batch, rdpConfig) {
|
|
44
|
-
// update the cache for any object that has changed
|
|
45
|
-
// and save the mapped values to return
|
|
46
44
|
return values.map(v => this.getQuery({
|
|
47
|
-
apiName: v.$apiName,
|
|
45
|
+
apiName: v.$objectType ?? v.$apiName,
|
|
48
46
|
pk: v.$primaryKey
|
|
49
47
|
}, rdpConfig).writeToStore(v, "loaded", batch).cacheKey);
|
|
50
48
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ObjectsHelper.js","names":["deepEqual","AbstractHelper","tombstone","mergeObjectFields","ObjectQuery","ObjectsHelper","observe","options","subFn","getQuery","rdpConfig","apiName","pk","objectCacheKey","cacheKeys","get","undefined","store","queries","subjects","dedupeInterval","storeOsdkInstances","values","batch","map","v","$apiName","$primaryKey","writeToStore","cacheKey","propagateWrite","sourceCacheKey","value","status","existing","read","dataChanged","statusChanged","valueToWrite","write","changes","registerObject","metadata","objectCacheKeyRegistry","getMetadata","relatedKeys","getVariants","primaryKey","Set","targetKey","isKeyActive","targetCurrentValue","merged","mergeForTarget","isObjectHolder","key","subject","peek","observed","sourceValue","targetCacheKey","sourceRdpFields","getRdpFieldSet","targetRdpFields"],"sources":["ObjectsHelper.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 InterfaceDefinition,\n ObjectTypeDefinition,\n Osdk,\n} from \"@osdk/api\";\nimport deepEqual from \"fast-deep-equal\";\nimport type { ObjectHolder } from \"../../../object/convertWireToOsdkObjects/ObjectHolder.js\";\nimport type { ObjectPayload } from \"../../ObjectPayload.js\";\nimport type { ObserveObjectOptions } from \"../../ObservableClient.js\";\nimport type { Observer, Status } from \"../../ObservableClient/common.js\";\nimport { AbstractHelper } from \"../AbstractHelper.js\";\nimport type { BatchContext } from \"../BatchContext.js\";\nimport type { Canonical } from \"../Canonical.js\";\nimport type { QuerySubscription } from \"../QuerySubscription.js\";\nimport type { Rdp } from \"../RdpCanonicalizer.js\";\nimport { tombstone } from \"../tombstone.js\";\nimport { mergeObjectFields } from \"../utils/rdpFieldOperations.js\";\nimport { type ObjectCacheKey } from \"./ObjectCacheKey.js\";\nimport { ObjectQuery } from \"./ObjectQuery.js\";\n\nexport class ObjectsHelper extends AbstractHelper<\n ObjectQuery,\n ObserveObjectOptions<any>\n> {\n observe<T extends ObjectTypeDefinition | InterfaceDefinition>(\n options: ObserveObjectOptions<T>,\n subFn: Observer<ObjectPayload>,\n ): QuerySubscription<ObjectQuery> {\n return super.observe(options, subFn);\n }\n\n getQuery<T extends ObjectTypeDefinition | InterfaceDefinition>(\n options: ObserveObjectOptions<T>,\n rdpConfig?: Canonical<Rdp> | null,\n ): ObjectQuery {\n const apiName = typeof options.apiName === \"string\"\n ? options.apiName\n : options.apiName.apiName;\n const { pk } = options;\n\n const objectCacheKey = this.cacheKeys.get<ObjectCacheKey>(\n \"object\",\n apiName,\n pk,\n rdpConfig ?? undefined,\n );\n\n return this.store.queries.get(objectCacheKey, () =>\n new ObjectQuery(\n this.store,\n this.store.subjects.get(objectCacheKey),\n apiName,\n pk,\n objectCacheKey,\n { dedupeInterval: 0 },\n ));\n }\n\n /**\n * Internal helper method for writing objects to the store and returning their\n * object keys. For list queries with RDPs, the rdpConfig is included in the\n * cache key to ensure proper data isolation.\n * @internal\n */\n public storeOsdkInstances(\n values: Array<ObjectHolder> | Array<Osdk.Instance<any, any, any>>,\n batch: BatchContext,\n rdpConfig?: Canonical<Rdp> | null,\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 this.getQuery({\n apiName: v.$apiName,\n pk: v.$primaryKey as string | number,\n }, rdpConfig).writeToStore(\n v as ObjectHolder,\n \"loaded\",\n batch,\n ).cacheKey\n );\n }\n\n /**\n * Write an object to cache and propagate to all related cache keys\n * @internal\n */\n public propagateWrite(\n sourceCacheKey: ObjectCacheKey,\n value: ObjectHolder | typeof tombstone,\n status: Status,\n batch: BatchContext,\n ): void {\n const existing = batch.read(sourceCacheKey);\n const dataChanged = !existing\n || existing.value === undefined\n || value === tombstone\n || !deepEqual(existing.value, value);\n const statusChanged = !existing || existing.status !== status;\n\n if (!dataChanged && !statusChanged) {\n return;\n }\n\n const valueToWrite = !dataChanged && existing ? existing.value : value;\n batch.write(sourceCacheKey, valueToWrite, status);\n\n if (value !== tombstone) {\n batch.changes.registerObject(sourceCacheKey, value, !existing);\n }\n\n const metadata = this.store.objectCacheKeyRegistry.getMetadata(\n sourceCacheKey,\n );\n\n const relatedKeys = metadata\n ? this.store.objectCacheKeyRegistry.getVariants(\n metadata.apiName,\n metadata.primaryKey,\n )\n : new Set([sourceCacheKey]);\n\n for (const targetKey of relatedKeys) {\n if (targetKey === sourceCacheKey || !this.isKeyActive(targetKey)) {\n continue;\n }\n\n if (value === tombstone) {\n batch.write(targetKey, tombstone, status);\n continue;\n }\n\n const targetCurrentValue = batch.read(targetKey)?.value;\n const merged = this.mergeForTarget(\n value,\n targetCurrentValue && this.isObjectHolder(targetCurrentValue)\n ? targetCurrentValue\n : undefined,\n sourceCacheKey,\n targetKey,\n );\n\n batch.write(targetKey, merged, status);\n }\n }\n\n /**\n * Check if a cache key is actively observed\n */\n private isKeyActive(key: ObjectCacheKey): boolean {\n const subject = this.store.subjects.peek(key);\n return subject?.observed === true;\n }\n\n /**\n * Type guard to check if a value is an ObjectHolder\n */\n private isObjectHolder(\n value: ObjectHolder | undefined,\n ): value is ObjectHolder {\n return value != null\n && typeof value === \"object\"\n && \"$apiName\" in value\n && \"$primaryKey\" in value;\n }\n\n /**\n * Merge object data for a specific target cache key, preserving RDP fields\n */\n private mergeForTarget(\n sourceValue: ObjectHolder,\n targetCurrentValue: ObjectHolder | undefined,\n sourceCacheKey: ObjectCacheKey,\n targetCacheKey: ObjectCacheKey,\n ): ObjectHolder {\n const sourceRdpFields = this.store.objectCacheKeyRegistry.getRdpFieldSet(\n sourceCacheKey,\n );\n const targetRdpFields = this.store.objectCacheKeyRegistry.getRdpFieldSet(\n targetCacheKey,\n );\n\n return mergeObjectFields(\n sourceValue,\n sourceRdpFields,\n targetRdpFields,\n targetCurrentValue,\n );\n }\n}\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"ObjectsHelper.js","names":["deepEqual","AbstractHelper","tombstone","mergeObjectFields","ObjectQuery","ObjectsHelper","observe","options","subFn","getQuery","rdpConfig","apiName","pk","objectCacheKey","cacheKeys","get","undefined","store","queries","subjects","dedupeInterval","storeOsdkInstances","values","batch","map","v","$objectType","$apiName","$primaryKey","writeToStore","cacheKey","propagateWrite","sourceCacheKey","value","status","existing","read","dataChanged","statusChanged","valueToWrite","write","changes","registerObject","metadata","objectCacheKeyRegistry","getMetadata","relatedKeys","getVariants","primaryKey","Set","targetKey","isKeyActive","targetCurrentValue","merged","mergeForTarget","isObjectHolder","key","subject","peek","observed","sourceValue","targetCacheKey","sourceRdpFields","getRdpFieldSet","targetRdpFields"],"sources":["ObjectsHelper.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 InterfaceDefinition,\n ObjectTypeDefinition,\n Osdk,\n} from \"@osdk/api\";\nimport deepEqual from \"fast-deep-equal\";\nimport type { ObjectHolder } from \"../../../object/convertWireToOsdkObjects/ObjectHolder.js\";\nimport type { ObjectPayload } from \"../../ObjectPayload.js\";\nimport type { ObserveObjectOptions } from \"../../ObservableClient.js\";\nimport type { Observer, Status } from \"../../ObservableClient/common.js\";\nimport { AbstractHelper } from \"../AbstractHelper.js\";\nimport type { BatchContext } from \"../BatchContext.js\";\nimport type { Canonical } from \"../Canonical.js\";\nimport type { QuerySubscription } from \"../QuerySubscription.js\";\nimport type { Rdp } from \"../RdpCanonicalizer.js\";\nimport { tombstone } from \"../tombstone.js\";\nimport { mergeObjectFields } from \"../utils/rdpFieldOperations.js\";\nimport { type ObjectCacheKey } from \"./ObjectCacheKey.js\";\nimport { ObjectQuery } from \"./ObjectQuery.js\";\n\nexport class ObjectsHelper extends AbstractHelper<\n ObjectQuery,\n ObserveObjectOptions<any>\n> {\n observe<T extends ObjectTypeDefinition | InterfaceDefinition>(\n options: ObserveObjectOptions<T>,\n subFn: Observer<ObjectPayload>,\n ): QuerySubscription<ObjectQuery> {\n return super.observe(options, subFn);\n }\n\n getQuery<T extends ObjectTypeDefinition | InterfaceDefinition>(\n options: ObserveObjectOptions<T>,\n rdpConfig?: Canonical<Rdp> | null,\n ): ObjectQuery {\n const apiName = typeof options.apiName === \"string\"\n ? options.apiName\n : options.apiName.apiName;\n const { pk } = options;\n\n const objectCacheKey = this.cacheKeys.get<ObjectCacheKey>(\n \"object\",\n apiName,\n pk,\n rdpConfig ?? undefined,\n );\n\n return this.store.queries.get(objectCacheKey, () =>\n new ObjectQuery(\n this.store,\n this.store.subjects.get(objectCacheKey),\n apiName,\n pk,\n objectCacheKey,\n { dedupeInterval: 0 },\n ));\n }\n\n /**\n * Internal helper method for writing objects to the store and returning their\n * object keys. For list queries with RDPs, the rdpConfig is included in the\n * cache key to ensure proper data isolation.\n * @internal\n */\n public storeOsdkInstances(\n values: Array<ObjectHolder> | Array<Osdk.Instance<any, any, any>>,\n batch: BatchContext,\n rdpConfig?: Canonical<Rdp> | null,\n ): ObjectCacheKey[] {\n return values.map(v =>\n this.getQuery({\n apiName: v.$objectType ?? v.$apiName,\n pk: v.$primaryKey as string | number,\n }, rdpConfig).writeToStore(\n v as ObjectHolder,\n \"loaded\",\n batch,\n ).cacheKey\n );\n }\n\n /**\n * Write an object to cache and propagate to all related cache keys\n * @internal\n */\n public propagateWrite(\n sourceCacheKey: ObjectCacheKey,\n value: ObjectHolder | typeof tombstone,\n status: Status,\n batch: BatchContext,\n ): void {\n const existing = batch.read(sourceCacheKey);\n const dataChanged = !existing\n || existing.value === undefined\n || value === tombstone\n || !deepEqual(existing.value, value);\n const statusChanged = !existing || existing.status !== status;\n\n if (!dataChanged && !statusChanged) {\n return;\n }\n\n const valueToWrite = !dataChanged && existing ? existing.value : value;\n batch.write(sourceCacheKey, valueToWrite, status);\n\n if (value !== tombstone) {\n batch.changes.registerObject(sourceCacheKey, value, !existing);\n }\n\n const metadata = this.store.objectCacheKeyRegistry.getMetadata(\n sourceCacheKey,\n );\n\n const relatedKeys = metadata\n ? this.store.objectCacheKeyRegistry.getVariants(\n metadata.apiName,\n metadata.primaryKey,\n )\n : new Set([sourceCacheKey]);\n\n for (const targetKey of relatedKeys) {\n if (targetKey === sourceCacheKey || !this.isKeyActive(targetKey)) {\n continue;\n }\n\n if (value === tombstone) {\n batch.write(targetKey, tombstone, status);\n continue;\n }\n\n const targetCurrentValue = batch.read(targetKey)?.value;\n const merged = this.mergeForTarget(\n value,\n targetCurrentValue && this.isObjectHolder(targetCurrentValue)\n ? targetCurrentValue\n : undefined,\n sourceCacheKey,\n targetKey,\n );\n\n batch.write(targetKey, merged, status);\n }\n }\n\n /**\n * Check if a cache key is actively observed\n */\n private isKeyActive(key: ObjectCacheKey): boolean {\n const subject = this.store.subjects.peek(key);\n return subject?.observed === true;\n }\n\n /**\n * Type guard to check if a value is an ObjectHolder\n */\n private isObjectHolder(\n value: ObjectHolder | undefined,\n ): value is ObjectHolder {\n return value != null\n && typeof value === \"object\"\n && \"$apiName\" in value\n && \"$primaryKey\" in value;\n }\n\n /**\n * Merge object data for a specific target cache key, preserving RDP fields\n */\n private mergeForTarget(\n sourceValue: ObjectHolder,\n targetCurrentValue: ObjectHolder | undefined,\n sourceCacheKey: ObjectCacheKey,\n targetCacheKey: ObjectCacheKey,\n ): ObjectHolder {\n const sourceRdpFields = this.store.objectCacheKeyRegistry.getRdpFieldSet(\n sourceCacheKey,\n );\n const targetRdpFields = this.store.objectCacheKeyRegistry.getRdpFieldSet(\n targetCacheKey,\n );\n\n return mergeObjectFields(\n sourceValue,\n sourceRdpFields,\n targetRdpFields,\n targetCurrentValue,\n );\n }\n}\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -14,6 +14,6 @@
|
|
|
14
14
|
* limitations under the License.
|
|
15
15
|
*/
|
|
16
16
|
|
|
17
|
-
export const USER_AGENT = `osdk-client/${"2.7.0-beta.
|
|
18
|
-
export const OBSERVABLE_USER_AGENT = `osdk-observable-client/${"2.7.0-beta.
|
|
17
|
+
export const USER_AGENT = `osdk-client/${"2.7.0-beta.13"}`;
|
|
18
|
+
export const OBSERVABLE_USER_AGENT = `osdk-observable-client/${"2.7.0-beta.13"}`;
|
|
19
19
|
//# sourceMappingURL=UserAgent.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"isObjectSpecifiersObject.js","names":["isObjectSpecifiersObject","o","$apiName","$primaryKey"],"sources":["isObjectSpecifiersObject.ts"],"sourcesContent":["/*\n * Copyright 2024 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 { PrimaryKeyTypes } from \"@osdk/api\";\n\nexport function isObjectSpecifiersObject(\n o: any,\n): o is {
|
|
1
|
+
{"version":3,"file":"isObjectSpecifiersObject.js","names":["isObjectSpecifiersObject","o","$apiName","$primaryKey"],"sources":["isObjectSpecifiersObject.ts"],"sourcesContent":["/*\n * Copyright 2024 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 { PrimaryKeyTypes } from \"@osdk/api\";\n\nexport function isObjectSpecifiersObject(\n o: any,\n): o is {\n $apiName: string;\n $objectType?: string;\n $primaryKey: PrimaryKeyTypes;\n} {\n return o && typeof o === \"object\" && typeof o.$apiName === \"string\"\n && o.$primaryKey != null;\n}\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAIA,OAAO,SAASA,wBAAwBA,CACtCC,CAAM,EAKN;EACA,OAAOA,CAAC,IAAI,OAAOA,CAAC,KAAK,QAAQ,IAAI,OAAOA,CAAC,CAACC,QAAQ,KAAK,QAAQ,IAC9DD,CAAC,CAACE,WAAW,IAAI,IAAI;AAC5B","ignoreList":[]}
|
|
@@ -1205,13 +1205,20 @@ function handleWherePair([fieldName, filter], objectOrInterface, structFieldSele
|
|
|
1205
1205
|
const firstKey = keysOfFilter[0];
|
|
1206
1206
|
!(filter[firstKey] != null) ? process.env.NODE_ENV !== "production" ? invariant4__default.default(false) : invariant4__default.default(false) : void 0;
|
|
1207
1207
|
if (firstKey === "$contains" && filter[firstKey] instanceof Object) {
|
|
1208
|
-
const
|
|
1209
|
-
|
|
1210
|
-
const
|
|
1211
|
-
|
|
1212
|
-
|
|
1213
|
-
|
|
1214
|
-
|
|
1208
|
+
const containsValue = filter[firstKey];
|
|
1209
|
+
const containsKeys = Object.keys(containsValue);
|
|
1210
|
+
const isFilterObject = containsKeys.some((key) => key.startsWith("$"));
|
|
1211
|
+
if (isFilterObject) {
|
|
1212
|
+
return handleWherePair([fieldName, containsValue], objectOrInterface, structFieldSelector, rdpNames);
|
|
1213
|
+
} else {
|
|
1214
|
+
const structFilter = Object.entries(containsValue);
|
|
1215
|
+
!(structFilter.length === 1) ? process.env.NODE_ENV !== "production" ? invariant4__default.default(false, "Cannot filter on more than one struct field in the same clause, need to use an and clause") : invariant4__default.default(false) : void 0;
|
|
1216
|
+
const structFieldApiName = structFilter[0][0];
|
|
1217
|
+
return handleWherePair(structFilter[0], objectOrInterface, {
|
|
1218
|
+
propertyApiName: fieldName,
|
|
1219
|
+
structFieldApiName
|
|
1220
|
+
});
|
|
1221
|
+
}
|
|
1215
1222
|
}
|
|
1216
1223
|
if (firstKey === "$ne") {
|
|
1217
1224
|
return {
|
|
@@ -1757,7 +1764,7 @@ var ObjectSetListenerWebsocket = class _ObjectSetListenerWebsocket {
|
|
|
1757
1764
|
});
|
|
1758
1765
|
!(client.baseUrl.startsWith("https://") || client.baseUrl.startsWith("http://")) ? process.env.NODE_ENV !== "production" ? invariant4__default.default(false, "Stack must be a URL") : invariant4__default.default(false) : void 0;
|
|
1759
1766
|
}
|
|
1760
|
-
async subscribe(objectType, objectSet, listener, properties = []) {
|
|
1767
|
+
async subscribe(objectType, objectSet, listener, properties = [], shouldLoadRids = false) {
|
|
1761
1768
|
const objOrInterfaceDef = objectType.type === "object" ? await this.#client.ontologyProvider.getObjectDefinition(objectType.apiName) : await this.#client.ontologyProvider.getInterfaceDefinition(objectType.apiName);
|
|
1762
1769
|
let objectProperties = [];
|
|
1763
1770
|
let referenceProperties = [];
|
|
@@ -1776,7 +1783,8 @@ var ObjectSetListenerWebsocket = class _ObjectSetListenerWebsocket {
|
|
|
1776
1783
|
// Since we don't have a real subscription id yet but we need to keep
|
|
1777
1784
|
// track of this reference, we can just use a random uuid.
|
|
1778
1785
|
subscriptionId: `TMP-${nextUuid()}}`,
|
|
1779
|
-
interfaceApiName: objOrInterfaceDef.type === "object" ? void 0 : objOrInterfaceDef.apiName
|
|
1786
|
+
interfaceApiName: objOrInterfaceDef.type === "object" ? void 0 : objOrInterfaceDef.apiName,
|
|
1787
|
+
loadRids: shouldLoadRids
|
|
1780
1788
|
};
|
|
1781
1789
|
this.#subscriptions.set(sub.subscriptionId, sub);
|
|
1782
1790
|
void this.#initiateSubscribe(sub);
|
|
@@ -1829,7 +1837,10 @@ var ObjectSetListenerWebsocket = class _ObjectSetListenerWebsocket {
|
|
|
1829
1837
|
return {
|
|
1830
1838
|
objectSet,
|
|
1831
1839
|
propertySet: requestedProperties,
|
|
1832
|
-
referenceSet: requestedReferenceProperties
|
|
1840
|
+
referenceSet: requestedReferenceProperties,
|
|
1841
|
+
objectLoadingResponseOptions: {
|
|
1842
|
+
shouldLoadObjectRids: true
|
|
1843
|
+
}
|
|
1833
1844
|
};
|
|
1834
1845
|
})
|
|
1835
1846
|
};
|
|
@@ -1987,9 +1998,14 @@ var ObjectSetListenerWebsocket = class _ObjectSetListenerWebsocket {
|
|
|
1987
1998
|
}
|
|
1988
1999
|
const osdkObjectArray = await this.#client.objectFactory2(this.#client, [o.object], sub.interfaceApiName, {}, void 0, false, void 0, false, await this.#fetchInterfaceMapping(o.object.__apiName, sub.interfaceApiName));
|
|
1989
2000
|
const singleOsdkObject = osdkObjectArray[0] ?? void 0;
|
|
1990
|
-
|
|
2001
|
+
const rid = singleOsdkObject["$rid"];
|
|
2002
|
+
return singleOsdkObject != null ? rid === void 0 ? {
|
|
1991
2003
|
object: singleOsdkObject,
|
|
1992
2004
|
state: o.state
|
|
2005
|
+
} : {
|
|
2006
|
+
object: singleOsdkObject,
|
|
2007
|
+
state: o.state,
|
|
2008
|
+
rid
|
|
1993
2009
|
} : void 0;
|
|
1994
2010
|
}));
|
|
1995
2011
|
for (const osdkObject of osdkObjects) {
|
|
@@ -2233,7 +2249,7 @@ function createObjectSet(objectType, clientCtx, objectSet = resolveBaseObjectSet
|
|
|
2233
2249
|
})), objectType, options, await createWithPk(clientCtx, objectType, objectSet, primaryKey));
|
|
2234
2250
|
} : void 0,
|
|
2235
2251
|
subscribe: (listener, opts) => {
|
|
2236
|
-
const pendingSubscribe = ObjectSetListenerWebsocket.getInstance(clientCtx).subscribe(objectType, objectSet, listener, opts?.properties);
|
|
2252
|
+
const pendingSubscribe = ObjectSetListenerWebsocket.getInstance(clientCtx).subscribe(objectType, objectSet, listener, opts?.properties, opts?.includeRid);
|
|
2237
2253
|
return {
|
|
2238
2254
|
unsubscribe: async () => (await pendingSubscribe)()
|
|
2239
2255
|
};
|
|
@@ -2343,5 +2359,5 @@ exports.hydrateAttachmentFromRidInternal = hydrateAttachmentFromRidInternal;
|
|
|
2343
2359
|
exports.isObjectSet = isObjectSet;
|
|
2344
2360
|
exports.isWireObjectSet = isWireObjectSet;
|
|
2345
2361
|
exports.symbolClientContext = symbolClientContext;
|
|
2346
|
-
//# sourceMappingURL=chunk-
|
|
2347
|
-
//# sourceMappingURL=chunk-
|
|
2362
|
+
//# sourceMappingURL=chunk-VVKEXIIO.cjs.map
|
|
2363
|
+
//# sourceMappingURL=chunk-VVKEXIIO.cjs.map
|