@osdk/client 2.4.2 → 2.5.0-beta.10
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 +106 -93
- package/build/browser/Client.js +1 -1
- package/build/browser/Client.js.map +1 -1
- package/build/browser/MinimalClientContext.js.map +1 -1
- package/build/browser/actions/applyAction.js +4 -0
- package/build/browser/actions/applyAction.js.map +1 -1
- package/build/browser/createClient.js +6 -2
- package/build/browser/createClient.js.map +1 -1
- package/build/browser/createMinimalClient.js +2 -1
- package/build/browser/createMinimalClient.js.map +1 -1
- package/build/browser/derivedProperties/createWithPropertiesObjectSet.js +17 -0
- package/build/browser/derivedProperties/createWithPropertiesObjectSet.js.map +1 -1
- package/build/browser/fetchMetadata.test.js +11 -0
- package/build/browser/fetchMetadata.test.js.map +1 -1
- package/build/browser/index.js +3 -1
- package/build/browser/index.js.map +1 -1
- package/build/browser/intellisense.test.helpers/orderBySuggestionIsRight.js +8 -1
- package/build/browser/intellisense.test.helpers/orderBySuggestionIsRight.js.map +1 -1
- package/build/browser/intellisense.test.js +14 -4
- package/build/browser/intellisense.test.js.map +1 -1
- package/build/browser/object/Cache.js +1 -1
- package/build/browser/object/Cache.js.map +1 -1
- package/build/browser/object/Cache.test.js +1 -1
- package/build/browser/object/Cache.test.js.map +1 -1
- package/build/browser/object/SimpleCache.js +1 -1
- package/build/browser/object/SimpleCache.js.map +1 -1
- package/build/browser/object/aggregate.js +2 -0
- package/build/browser/object/aggregate.js.map +1 -1
- package/build/browser/object/aggregate.test.js +30 -0
- package/build/browser/object/aggregate.test.js.map +1 -1
- package/build/browser/object/convertWireToOsdkObjects/OsdkCustomInspectPrototype.js +1 -0
- package/build/browser/object/convertWireToOsdkObjects/OsdkCustomInspectPrototype.js.map +1 -1
- package/build/browser/object/convertWireToOsdkObjects/createOsdkInterface.js +6 -0
- package/build/browser/object/convertWireToOsdkObjects/createOsdkInterface.js.map +1 -1
- package/build/browser/object/convertWireToOsdkObjects/getDollarLink.js +20 -1
- package/build/browser/object/convertWireToOsdkObjects/getDollarLink.js.map +1 -1
- package/build/browser/object/convertWireToOsdkObjects.js +4 -0
- package/build/browser/object/convertWireToOsdkObjects.js.map +1 -1
- package/build/browser/object/convertWireToOsdkObjects.test.js +14 -0
- package/build/browser/object/convertWireToOsdkObjects.test.js.map +1 -1
- package/build/browser/object/fetchPage.js +96 -21
- package/build/browser/object/fetchPage.js.map +1 -1
- package/build/browser/object/fetchPage.test.js +35 -1
- package/build/browser/object/fetchPage.test.js.map +1 -1
- package/build/browser/object/geotimeseriesreference.test.js +0 -2
- package/build/browser/object/geotimeseriesreference.test.js.map +1 -1
- package/build/browser/object/mediaUpload.js +3 -0
- package/build/browser/object/mediaUpload.js.map +1 -1
- package/build/browser/objectSet/ObjectSet.test.js +6 -0
- package/build/browser/objectSet/ObjectSet.test.js.map +1 -1
- package/build/browser/objectSet/ObjectSetListenerWebsocket.js +31 -9
- package/build/browser/objectSet/ObjectSetListenerWebsocket.js.map +1 -1
- package/build/browser/objectSet/ObjectSetListenerWebsocket.test.js +69 -4
- package/build/browser/objectSet/ObjectSetListenerWebsocket.test.js.map +1 -1
- package/build/browser/objectSet/createObjectSet.js +3 -1
- package/build/browser/objectSet/createObjectSet.js.map +1 -1
- package/build/browser/observable/LinkPayload.js +2 -0
- package/build/browser/observable/LinkPayload.js.map +1 -0
- package/build/browser/observable/ObjectPayload.js.map +1 -1
- package/build/browser/observable/ObservableClient/ObserveLink.js +17 -0
- package/build/browser/observable/ObservableClient/ObserveLink.js.map +1 -0
- package/build/browser/observable/ObservableClient/common.js +2 -0
- package/build/browser/observable/ObservableClient/common.js.map +1 -0
- package/build/browser/observable/ObservableClient.js +20 -0
- package/build/browser/observable/ObservableClient.js.map +1 -1
- package/build/browser/observable/Unsubscribable.js +2 -0
- package/build/browser/observable/Unsubscribable.js.map +1 -0
- package/build/browser/observable/internal/AbstractHelper.js +54 -0
- package/build/browser/observable/internal/AbstractHelper.js.map +1 -0
- package/build/browser/observable/internal/BatchContext.js +2 -0
- package/build/browser/observable/internal/BatchContext.js.map +1 -0
- package/build/browser/observable/internal/BulkObjectLoader.js +3 -3
- package/build/browser/observable/internal/BulkObjectLoader.js.map +1 -1
- package/build/browser/observable/internal/CacheKeys.js +65 -25
- package/build/browser/observable/internal/CacheKeys.js.map +1 -1
- package/build/browser/observable/internal/Changes.js +6 -0
- package/build/browser/observable/internal/Changes.js.map +1 -1
- package/build/browser/observable/internal/KnownCacheKey.js +2 -0
- package/build/browser/observable/internal/KnownCacheKey.js.map +1 -0
- package/build/browser/observable/internal/Layer.js +0 -8
- package/build/browser/observable/internal/Layer.js.map +1 -1
- package/build/browser/observable/internal/Layers.js +151 -0
- package/build/browser/observable/internal/Layers.js.map +1 -0
- package/build/browser/observable/internal/ObservableClientImpl.js +54 -3
- package/build/browser/observable/internal/ObservableClientImpl.js.map +1 -1
- package/build/browser/observable/internal/OrderByCanonicalizer.js +1 -37
- package/build/browser/observable/internal/OrderByCanonicalizer.js.map +1 -1
- package/build/browser/observable/internal/Queries.js +40 -0
- package/build/browser/observable/internal/Queries.js.map +1 -0
- package/build/browser/observable/internal/Query.js +45 -4
- package/build/browser/observable/internal/Query.js.map +1 -1
- package/build/browser/observable/internal/QuerySubscription.js +48 -0
- package/build/browser/observable/internal/QuerySubscription.js.map +1 -0
- package/build/browser/observable/internal/Store.invalidation.test.js +646 -0
- package/build/browser/observable/internal/Store.invalidation.test.js.map +1 -0
- package/build/browser/observable/internal/Store.js +87 -308
- package/build/browser/observable/internal/Store.js.map +1 -1
- package/build/browser/observable/internal/Store.test.js +330 -73
- package/build/browser/observable/internal/Store.test.js.map +1 -1
- package/build/browser/observable/internal/SubjectPayload.js +2 -0
- package/build/browser/observable/internal/SubjectPayload.js.map +1 -0
- package/build/browser/observable/internal/Subjects.js +55 -0
- package/build/browser/observable/internal/Subjects.js.map +1 -0
- package/build/browser/observable/internal/UnsubscribableWrapper.js +30 -0
- package/build/browser/observable/internal/UnsubscribableWrapper.js.map +1 -0
- package/build/browser/observable/internal/WeakRefTrie.js +61 -0
- package/build/browser/observable/internal/WeakRefTrie.js.map +1 -0
- package/build/browser/observable/internal/{ActionApplication.js → actions/ActionApplication.js} +2 -2
- package/build/browser/observable/internal/actions/ActionApplication.js.map +1 -0
- package/build/{esm/observable/internal → browser/observable/internal/actions}/OptimisticJob.js +15 -6
- package/build/browser/observable/internal/actions/OptimisticJob.js.map +1 -0
- package/build/browser/observable/internal/base-list/BaseCollectionQuery.js +2 -0
- package/build/browser/observable/internal/base-list/BaseCollectionQuery.js.map +1 -0
- package/build/browser/observable/internal/base-list/BaseListQuery.js +411 -0
- package/build/browser/observable/internal/base-list/BaseListQuery.js.map +1 -0
- package/build/browser/observable/internal/base-list/createCollectionConnectable.js +50 -0
- package/build/browser/observable/internal/base-list/createCollectionConnectable.js.map +1 -0
- package/build/browser/observable/internal/base-list/createCollectionConnectable.test.js +597 -0
- package/build/browser/observable/internal/base-list/createCollectionConnectable.test.js.map +1 -0
- package/build/browser/observable/internal/base-list/removeDuplicates.js +36 -0
- package/build/browser/observable/internal/base-list/removeDuplicates.js.map +1 -0
- package/build/browser/observable/internal/createInitEntry.js +25 -0
- package/build/browser/observable/internal/createInitEntry.js.map +1 -0
- package/build/browser/observable/internal/getObjectTypesThatInvalidate.js +216 -0
- package/build/browser/observable/internal/getObjectTypesThatInvalidate.js.map +1 -0
- package/build/browser/observable/internal/getObjectTypesThatInvalidate.test.js +382 -0
- package/build/browser/observable/internal/getObjectTypesThatInvalidate.test.js.map +1 -0
- package/build/browser/observable/internal/isObjectInstance.js +23 -0
- package/build/browser/observable/internal/isObjectInstance.js.map +1 -0
- package/build/browser/observable/internal/links/LinksHelper.js +37 -0
- package/build/browser/observable/internal/links/LinksHelper.js.map +1 -0
- package/build/browser/observable/internal/links/SpecificLinkCacheKey.js +2 -0
- package/build/browser/observable/internal/links/SpecificLinkCacheKey.js.map +1 -0
- package/build/browser/observable/internal/links/SpecificLinkQuery.js +185 -0
- package/build/browser/observable/internal/links/SpecificLinkQuery.js.map +1 -0
- package/build/browser/observable/internal/list/InterfaceListQuery.js +83 -0
- package/build/browser/observable/internal/list/InterfaceListQuery.js.map +1 -0
- package/build/browser/observable/internal/list/ListCacheKey.js +2 -0
- package/build/browser/observable/internal/list/ListCacheKey.js.map +1 -0
- package/build/browser/observable/internal/list/ListQuery.js +372 -0
- package/build/browser/observable/internal/list/ListQuery.js.map +1 -0
- package/build/browser/observable/internal/list/ListQueryOptions.js +2 -0
- package/build/browser/observable/internal/list/ListQueryOptions.js.map +1 -0
- package/build/browser/observable/internal/list/ListsHelper.js +51 -0
- package/build/browser/observable/internal/list/ListsHelper.js.map +1 -0
- package/build/browser/observable/internal/list/ObjectListQuery.js +48 -0
- package/build/browser/observable/internal/list/ObjectListQuery.js.map +1 -0
- package/build/browser/observable/internal/object/ObjectCacheKey.js +2 -0
- package/build/browser/observable/internal/object/ObjectCacheKey.js.map +1 -0
- package/build/browser/observable/internal/{ObjectQuery.js → object/ObjectQuery.js} +27 -18
- package/build/browser/observable/internal/object/ObjectQuery.js.map +1 -0
- package/build/browser/observable/internal/object/ObjectsHelper.js +48 -0
- package/build/browser/observable/internal/object/ObjectsHelper.js.map +1 -0
- package/build/browser/observable/internal/sorting/SortingStrategy.js +78 -0
- package/build/browser/observable/internal/sorting/SortingStrategy.js.map +1 -0
- package/build/browser/observable/internal/testUtils/invalidateList.js +23 -0
- package/build/browser/observable/internal/testUtils/invalidateList.js.map +1 -0
- package/build/browser/observable/internal/testUtils/observeLink/expectStandardObserveLink.js +69 -0
- package/build/browser/observable/internal/testUtils/observeLink/expectStandardObserveLink.js.map +1 -0
- package/build/browser/observable/internal/testUtils/observeObject/expectStandardObserveObject.js +56 -0
- package/build/browser/observable/internal/testUtils/observeObject/expectStandardObserveObject.js.map +1 -0
- package/build/browser/observable/internal/testUtils.js +72 -10
- package/build/browser/observable/internal/testUtils.js.map +1 -1
- package/build/browser/ontology/loadActionMetadata.js +3 -1
- package/build/browser/ontology/loadActionMetadata.js.map +1 -1
- package/build/browser/ontology/loadFullObjectMetadata.js +2 -1
- package/build/browser/ontology/loadFullObjectMetadata.js.map +1 -1
- package/build/browser/ontology/loadInterfaceMetadata.js +2 -1
- package/build/browser/ontology/loadInterfaceMetadata.js.map +1 -1
- package/build/browser/public/unstable-do-not-use.js.map +1 -1
- package/build/browser/util/UserAgent.js +2 -2
- package/build/browser/util/UserAgent.js.map +1 -1
- package/build/browser/util/exponentialBackoff.js +51 -0
- package/build/browser/util/exponentialBackoff.js.map +1 -0
- package/build/browser/util/exponentialBackoff.test.js +81 -0
- package/build/browser/util/exponentialBackoff.test.js.map +1 -0
- package/build/browser/util/extractObjectOrInterfaceType.js +9 -1
- package/build/browser/util/extractObjectOrInterfaceType.js.map +1 -1
- package/build/browser/util/extractObjectOrInterfaceType.test.js +2 -2
- package/build/browser/util/extractObjectOrInterfaceType.test.js.map +1 -1
- package/build/browser/util/streamutils.js +1 -1
- package/build/browser/util/streamutils.js.map +1 -1
- package/build/browser/util/toDataValue.js +15 -1
- package/build/browser/util/toDataValue.js.map +1 -1
- package/build/browser/util/toDataValue.test.js +42 -2
- package/build/browser/util/toDataValue.test.js.map +1 -1
- package/build/cjs/{chunk-633AI7EA.cjs → chunk-GVGP7T5P.cjs} +407 -257
- package/build/cjs/chunk-GVGP7T5P.cjs.map +1 -0
- package/build/cjs/{chunk-26WFEZQO.cjs → chunk-YADG7KA6.cjs} +136 -84
- package/build/cjs/chunk-YADG7KA6.cjs.map +1 -0
- package/build/cjs/{createClient-BJo8T7Js.d.cts → createClient-mOlFts15.d.cts} +1 -0
- package/build/cjs/index.cjs +11 -7
- package/build/cjs/index.d.cts +2 -2
- package/build/cjs/public/internal.cjs +8 -8
- package/build/cjs/public/unstable-do-not-use.cjs +1502 -851
- package/build/cjs/public/unstable-do-not-use.cjs.map +1 -1
- package/build/cjs/public/unstable-do-not-use.d.cts +183 -13
- package/build/esm/Client.js +1 -1
- package/build/esm/Client.js.map +1 -1
- package/build/esm/MinimalClientContext.js.map +1 -1
- package/build/esm/actions/applyAction.js +4 -0
- package/build/esm/actions/applyAction.js.map +1 -1
- package/build/esm/createClient.js +6 -2
- package/build/esm/createClient.js.map +1 -1
- package/build/esm/createMinimalClient.js +2 -1
- package/build/esm/createMinimalClient.js.map +1 -1
- package/build/esm/derivedProperties/createWithPropertiesObjectSet.js +17 -0
- package/build/esm/derivedProperties/createWithPropertiesObjectSet.js.map +1 -1
- package/build/esm/fetchMetadata.test.js +11 -0
- package/build/esm/fetchMetadata.test.js.map +1 -1
- package/build/esm/index.js +3 -1
- package/build/esm/index.js.map +1 -1
- package/build/esm/intellisense.test.helpers/orderBySuggestionIsRight.js +8 -1
- package/build/esm/intellisense.test.helpers/orderBySuggestionIsRight.js.map +1 -1
- package/build/esm/intellisense.test.js +14 -4
- package/build/esm/intellisense.test.js.map +1 -1
- package/build/esm/object/Cache.js +1 -1
- package/build/esm/object/Cache.js.map +1 -1
- package/build/esm/object/Cache.test.js +1 -1
- package/build/esm/object/Cache.test.js.map +1 -1
- package/build/esm/object/SimpleCache.js +1 -1
- package/build/esm/object/SimpleCache.js.map +1 -1
- package/build/esm/object/aggregate.js +2 -0
- package/build/esm/object/aggregate.js.map +1 -1
- package/build/esm/object/aggregate.test.js +30 -0
- package/build/esm/object/aggregate.test.js.map +1 -1
- package/build/esm/object/convertWireToOsdkObjects/OsdkCustomInspectPrototype.js +1 -0
- package/build/esm/object/convertWireToOsdkObjects/OsdkCustomInspectPrototype.js.map +1 -1
- package/build/esm/object/convertWireToOsdkObjects/createOsdkInterface.js +6 -0
- package/build/esm/object/convertWireToOsdkObjects/createOsdkInterface.js.map +1 -1
- package/build/esm/object/convertWireToOsdkObjects/getDollarLink.js +20 -1
- package/build/esm/object/convertWireToOsdkObjects/getDollarLink.js.map +1 -1
- package/build/esm/object/convertWireToOsdkObjects.js +4 -0
- package/build/esm/object/convertWireToOsdkObjects.js.map +1 -1
- package/build/esm/object/convertWireToOsdkObjects.test.js +14 -0
- package/build/esm/object/convertWireToOsdkObjects.test.js.map +1 -1
- package/build/esm/object/fetchPage.js +96 -21
- package/build/esm/object/fetchPage.js.map +1 -1
- package/build/esm/object/fetchPage.test.js +35 -1
- package/build/esm/object/fetchPage.test.js.map +1 -1
- package/build/esm/object/geotimeseriesreference.test.js +0 -2
- package/build/esm/object/geotimeseriesreference.test.js.map +1 -1
- package/build/esm/object/mediaUpload.js +3 -0
- package/build/esm/object/mediaUpload.js.map +1 -1
- package/build/esm/objectSet/ObjectSet.test.js +6 -0
- package/build/esm/objectSet/ObjectSet.test.js.map +1 -1
- package/build/esm/objectSet/ObjectSetListenerWebsocket.js +31 -9
- package/build/esm/objectSet/ObjectSetListenerWebsocket.js.map +1 -1
- package/build/esm/objectSet/ObjectSetListenerWebsocket.test.js +69 -4
- package/build/esm/objectSet/ObjectSetListenerWebsocket.test.js.map +1 -1
- package/build/esm/objectSet/createObjectSet.js +3 -1
- package/build/esm/objectSet/createObjectSet.js.map +1 -1
- package/build/esm/observable/LinkPayload.js +2 -0
- package/build/esm/observable/LinkPayload.js.map +1 -0
- package/build/esm/observable/ObjectPayload.js.map +1 -1
- package/build/esm/observable/ObservableClient/ObserveLink.js +17 -0
- package/build/esm/observable/ObservableClient/ObserveLink.js.map +1 -0
- package/build/esm/observable/ObservableClient/common.js +2 -0
- package/build/esm/observable/ObservableClient/common.js.map +1 -0
- package/build/esm/observable/ObservableClient.js +20 -0
- package/build/esm/observable/ObservableClient.js.map +1 -1
- package/build/esm/observable/Unsubscribable.js +2 -0
- package/build/esm/observable/Unsubscribable.js.map +1 -0
- package/build/esm/observable/internal/AbstractHelper.js +54 -0
- package/build/esm/observable/internal/AbstractHelper.js.map +1 -0
- package/build/esm/observable/internal/BatchContext.js +2 -0
- package/build/esm/observable/internal/BatchContext.js.map +1 -0
- package/build/esm/observable/internal/BulkObjectLoader.js +3 -3
- package/build/esm/observable/internal/BulkObjectLoader.js.map +1 -1
- package/build/esm/observable/internal/CacheKeys.js +65 -25
- package/build/esm/observable/internal/CacheKeys.js.map +1 -1
- package/build/esm/observable/internal/Changes.js +6 -0
- package/build/esm/observable/internal/Changes.js.map +1 -1
- package/build/esm/observable/internal/KnownCacheKey.js +2 -0
- package/build/esm/observable/internal/KnownCacheKey.js.map +1 -0
- package/build/esm/observable/internal/Layer.js +0 -8
- package/build/esm/observable/internal/Layer.js.map +1 -1
- package/build/esm/observable/internal/Layers.js +151 -0
- package/build/esm/observable/internal/Layers.js.map +1 -0
- package/build/esm/observable/internal/ObservableClientImpl.js +54 -3
- package/build/esm/observable/internal/ObservableClientImpl.js.map +1 -1
- package/build/esm/observable/internal/OrderByCanonicalizer.js +1 -37
- package/build/esm/observable/internal/OrderByCanonicalizer.js.map +1 -1
- package/build/esm/observable/internal/Queries.js +40 -0
- package/build/esm/observable/internal/Queries.js.map +1 -0
- package/build/esm/observable/internal/Query.js +45 -4
- package/build/esm/observable/internal/Query.js.map +1 -1
- package/build/esm/observable/internal/QuerySubscription.js +48 -0
- package/build/esm/observable/internal/QuerySubscription.js.map +1 -0
- package/build/esm/observable/internal/Store.invalidation.test.js +646 -0
- package/build/esm/observable/internal/Store.invalidation.test.js.map +1 -0
- package/build/esm/observable/internal/Store.js +87 -308
- package/build/esm/observable/internal/Store.js.map +1 -1
- package/build/esm/observable/internal/Store.test.js +330 -73
- package/build/esm/observable/internal/Store.test.js.map +1 -1
- package/build/esm/observable/internal/SubjectPayload.js +2 -0
- package/build/esm/observable/internal/SubjectPayload.js.map +1 -0
- package/build/esm/observable/internal/Subjects.js +55 -0
- package/build/esm/observable/internal/Subjects.js.map +1 -0
- package/build/esm/observable/internal/UnsubscribableWrapper.js +30 -0
- package/build/esm/observable/internal/UnsubscribableWrapper.js.map +1 -0
- package/build/esm/observable/internal/WeakRefTrie.js +61 -0
- package/build/esm/observable/internal/WeakRefTrie.js.map +1 -0
- package/build/esm/observable/internal/{ActionApplication.js → actions/ActionApplication.js} +2 -2
- package/build/esm/observable/internal/actions/ActionApplication.js.map +1 -0
- package/build/{browser/observable/internal → esm/observable/internal/actions}/OptimisticJob.js +15 -6
- package/build/esm/observable/internal/actions/OptimisticJob.js.map +1 -0
- package/build/esm/observable/internal/base-list/BaseCollectionQuery.js +2 -0
- package/build/esm/observable/internal/base-list/BaseCollectionQuery.js.map +1 -0
- package/build/esm/observable/internal/base-list/BaseListQuery.js +411 -0
- package/build/esm/observable/internal/base-list/BaseListQuery.js.map +1 -0
- package/build/esm/observable/internal/base-list/createCollectionConnectable.js +50 -0
- package/build/esm/observable/internal/base-list/createCollectionConnectable.js.map +1 -0
- package/build/esm/observable/internal/base-list/createCollectionConnectable.test.js +597 -0
- package/build/esm/observable/internal/base-list/createCollectionConnectable.test.js.map +1 -0
- package/build/esm/observable/internal/base-list/removeDuplicates.js +36 -0
- package/build/esm/observable/internal/base-list/removeDuplicates.js.map +1 -0
- package/build/esm/observable/internal/createInitEntry.js +25 -0
- package/build/esm/observable/internal/createInitEntry.js.map +1 -0
- package/build/esm/observable/internal/getObjectTypesThatInvalidate.js +216 -0
- package/build/esm/observable/internal/getObjectTypesThatInvalidate.js.map +1 -0
- package/build/esm/observable/internal/getObjectTypesThatInvalidate.test.js +382 -0
- package/build/esm/observable/internal/getObjectTypesThatInvalidate.test.js.map +1 -0
- package/build/esm/observable/internal/isObjectInstance.js +23 -0
- package/build/esm/observable/internal/isObjectInstance.js.map +1 -0
- package/build/esm/observable/internal/links/LinksHelper.js +37 -0
- package/build/esm/observable/internal/links/LinksHelper.js.map +1 -0
- package/build/esm/observable/internal/links/SpecificLinkCacheKey.js +2 -0
- package/build/esm/observable/internal/links/SpecificLinkCacheKey.js.map +1 -0
- package/build/esm/observable/internal/links/SpecificLinkQuery.js +185 -0
- package/build/esm/observable/internal/links/SpecificLinkQuery.js.map +1 -0
- package/build/esm/observable/internal/list/InterfaceListQuery.js +83 -0
- package/build/esm/observable/internal/list/InterfaceListQuery.js.map +1 -0
- package/build/esm/observable/internal/list/ListCacheKey.js +2 -0
- package/build/esm/observable/internal/list/ListCacheKey.js.map +1 -0
- package/build/esm/observable/internal/list/ListQuery.js +372 -0
- package/build/esm/observable/internal/list/ListQuery.js.map +1 -0
- package/build/esm/observable/internal/list/ListQueryOptions.js +2 -0
- package/build/esm/observable/internal/list/ListQueryOptions.js.map +1 -0
- package/build/esm/observable/internal/list/ListsHelper.js +51 -0
- package/build/esm/observable/internal/list/ListsHelper.js.map +1 -0
- package/build/esm/observable/internal/list/ObjectListQuery.js +48 -0
- package/build/esm/observable/internal/list/ObjectListQuery.js.map +1 -0
- package/build/esm/observable/internal/object/ObjectCacheKey.js +2 -0
- package/build/esm/observable/internal/object/ObjectCacheKey.js.map +1 -0
- package/build/esm/observable/internal/{ObjectQuery.js → object/ObjectQuery.js} +27 -18
- package/build/esm/observable/internal/object/ObjectQuery.js.map +1 -0
- package/build/esm/observable/internal/object/ObjectsHelper.js +48 -0
- package/build/esm/observable/internal/object/ObjectsHelper.js.map +1 -0
- package/build/esm/observable/internal/sorting/SortingStrategy.js +78 -0
- package/build/esm/observable/internal/sorting/SortingStrategy.js.map +1 -0
- package/build/esm/observable/internal/testUtils/invalidateList.js +23 -0
- package/build/esm/observable/internal/testUtils/invalidateList.js.map +1 -0
- package/build/esm/observable/internal/testUtils/observeLink/expectStandardObserveLink.js +69 -0
- package/build/esm/observable/internal/testUtils/observeLink/expectStandardObserveLink.js.map +1 -0
- package/build/esm/observable/internal/testUtils/observeObject/expectStandardObserveObject.js +56 -0
- package/build/esm/observable/internal/testUtils/observeObject/expectStandardObserveObject.js.map +1 -0
- package/build/esm/observable/internal/testUtils.js +72 -10
- package/build/esm/observable/internal/testUtils.js.map +1 -1
- package/build/esm/ontology/loadActionMetadata.js +3 -1
- package/build/esm/ontology/loadActionMetadata.js.map +1 -1
- package/build/esm/ontology/loadFullObjectMetadata.js +2 -1
- package/build/esm/ontology/loadFullObjectMetadata.js.map +1 -1
- package/build/esm/ontology/loadInterfaceMetadata.js +2 -1
- package/build/esm/ontology/loadInterfaceMetadata.js.map +1 -1
- package/build/esm/public/unstable-do-not-use.js.map +1 -1
- package/build/esm/util/UserAgent.js +2 -2
- package/build/esm/util/UserAgent.js.map +1 -1
- package/build/esm/util/exponentialBackoff.js +51 -0
- package/build/esm/util/exponentialBackoff.js.map +1 -0
- package/build/esm/util/exponentialBackoff.test.js +81 -0
- package/build/esm/util/exponentialBackoff.test.js.map +1 -0
- package/build/esm/util/extractObjectOrInterfaceType.js +9 -1
- package/build/esm/util/extractObjectOrInterfaceType.js.map +1 -1
- package/build/esm/util/extractObjectOrInterfaceType.test.js +2 -2
- package/build/esm/util/extractObjectOrInterfaceType.test.js.map +1 -1
- package/build/esm/util/streamutils.js +1 -1
- package/build/esm/util/streamutils.js.map +1 -1
- package/build/esm/util/toDataValue.js +15 -1
- package/build/esm/util/toDataValue.js.map +1 -1
- package/build/esm/util/toDataValue.test.js +42 -2
- package/build/esm/util/toDataValue.test.js.map +1 -1
- package/build/types/Client.d.ts +1 -1
- package/build/types/MinimalClientContext.d.ts +1 -0
- package/build/types/MinimalClientContext.d.ts.map +1 -1
- package/build/types/actions/applyAction.d.ts.map +1 -1
- package/build/types/createClient.d.ts +1 -0
- package/build/types/createClient.d.ts.map +1 -1
- package/build/types/index.d.ts +1 -1
- package/build/types/index.d.ts.map +1 -1
- package/build/types/object/fetchPage.d.ts.map +1 -1
- package/build/types/object/mediaUpload.d.ts +2 -1
- package/build/types/object/mediaUpload.d.ts.map +1 -1
- package/build/types/observable/LinkPayload.d.ts +9 -0
- package/build/types/observable/LinkPayload.d.ts.map +1 -0
- package/build/types/observable/ObjectPayload.d.ts +4 -0
- package/build/types/observable/ObjectPayload.d.ts.map +1 -1
- package/build/types/observable/ObservableClient/ObserveLink.d.ts +32 -0
- package/build/types/observable/ObservableClient/ObserveLink.d.ts.map +1 -0
- package/build/types/observable/ObservableClient/common.d.ts +67 -0
- package/build/types/observable/ObservableClient/common.d.ts.map +1 -0
- package/build/types/observable/ObservableClient.d.ts +103 -15
- package/build/types/observable/ObservableClient.d.ts.map +1 -1
- package/build/types/observable/Unsubscribable.d.ts +3 -0
- package/build/types/observable/Unsubscribable.d.ts.map +1 -0
- package/build/types/observable/internal/AbstractHelper.d.ts +17 -0
- package/build/types/observable/internal/AbstractHelper.d.ts.map +1 -0
- package/build/types/observable/internal/BatchContext.d.ts +11 -0
- package/build/types/observable/internal/BatchContext.d.ts.map +1 -0
- package/build/types/observable/internal/BulkObjectLoader.d.ts.map +1 -1
- package/build/types/observable/internal/CacheKeys.d.ts +12 -6
- package/build/types/observable/internal/CacheKeys.d.ts.map +1 -1
- package/build/types/observable/internal/Changes.d.ts +8 -5
- package/build/types/observable/internal/Changes.d.ts.map +1 -1
- package/build/types/observable/internal/KnownCacheKey.d.ts +4 -0
- package/build/types/observable/internal/KnownCacheKey.d.ts.map +1 -0
- package/build/types/observable/internal/Layer.d.ts +6 -7
- package/build/types/observable/internal/Layer.d.ts.map +1 -1
- package/build/types/observable/internal/Layers.d.ts +26 -0
- package/build/types/observable/internal/Layers.d.ts.map +1 -0
- package/build/types/observable/internal/OrderByCanonicalizer.d.ts +0 -7
- package/build/types/observable/internal/OrderByCanonicalizer.d.ts.map +1 -1
- package/build/types/observable/internal/Queries.d.ts +9 -0
- package/build/types/observable/internal/Queries.d.ts.map +1 -0
- package/build/types/observable/internal/Query.d.ts +23 -6
- package/build/types/observable/internal/Query.d.ts.map +1 -1
- package/build/types/observable/internal/QuerySubscription.d.ts +1 -0
- package/build/types/observable/internal/QuerySubscription.d.ts.map +1 -0
- package/build/types/observable/internal/Store.d.ts +41 -51
- package/build/types/observable/internal/Store.d.ts.map +1 -1
- package/build/types/observable/internal/Store.invalidation.test.d.ts +1 -0
- package/build/types/observable/internal/Store.invalidation.test.d.ts.map +1 -0
- package/build/types/observable/internal/Store.test.d.ts +4 -1
- package/build/types/observable/internal/Store.test.d.ts.map +1 -1
- package/build/types/observable/internal/SubjectPayload.d.ts +5 -0
- package/build/types/observable/internal/SubjectPayload.d.ts.map +1 -0
- package/build/types/observable/internal/Subjects.d.ts +16 -0
- package/build/types/observable/internal/Subjects.d.ts.map +1 -0
- package/build/types/observable/internal/UnsubscribableWrapper.d.ts +1 -0
- package/build/types/observable/internal/UnsubscribableWrapper.d.ts.map +1 -0
- package/build/types/observable/internal/WeakRefTrie.d.ts +13 -0
- package/build/types/observable/internal/WeakRefTrie.d.ts.map +1 -0
- package/build/types/observable/internal/{ActionApplication.d.ts → actions/ActionApplication.d.ts} +2 -2
- package/build/types/observable/internal/{ActionApplication.d.ts.map → actions/ActionApplication.d.ts.map} +1 -1
- package/build/types/observable/internal/{OptimisticJob.d.ts → actions/OptimisticJob.d.ts} +4 -4
- package/build/types/observable/internal/actions/OptimisticJob.d.ts.map +1 -0
- package/build/types/observable/internal/base-list/BaseCollectionQuery.d.ts +64 -0
- package/build/types/observable/internal/base-list/BaseCollectionQuery.d.ts.map +1 -0
- package/build/types/observable/internal/base-list/BaseListQuery.d.ts +145 -0
- package/build/types/observable/internal/base-list/BaseListQuery.d.ts.map +1 -0
- package/build/types/observable/internal/base-list/createCollectionConnectable.d.ts +39 -0
- package/build/types/observable/internal/base-list/createCollectionConnectable.d.ts.map +1 -0
- package/build/types/observable/internal/base-list/createCollectionConnectable.test.d.ts +1 -0
- package/build/types/observable/internal/base-list/createCollectionConnectable.test.d.ts.map +1 -0
- package/build/types/observable/internal/base-list/removeDuplicates.d.ts +11 -0
- package/build/types/observable/internal/base-list/removeDuplicates.d.ts.map +1 -0
- package/build/types/observable/internal/createInitEntry.d.ts +3 -0
- package/build/types/observable/internal/createInitEntry.d.ts.map +1 -0
- package/build/types/observable/internal/getObjectTypesThatInvalidate.d.ts +9 -0
- package/build/types/observable/internal/getObjectTypesThatInvalidate.d.ts.map +1 -0
- package/build/types/observable/internal/getObjectTypesThatInvalidate.test.d.ts +1 -0
- package/build/types/observable/internal/getObjectTypesThatInvalidate.test.d.ts.map +1 -0
- package/build/types/observable/internal/isObjectInstance.d.ts +5 -0
- package/build/types/observable/internal/isObjectInstance.d.ts.map +1 -0
- package/build/types/observable/internal/links/LinksHelper.d.ts +31 -0
- package/build/types/observable/internal/links/LinksHelper.d.ts.map +1 -0
- package/build/types/observable/internal/links/SpecificLinkCacheKey.d.ts +17 -0
- package/build/types/observable/internal/links/SpecificLinkCacheKey.d.ts.map +1 -0
- package/build/types/observable/internal/links/SpecificLinkQuery.d.ts +47 -0
- package/build/types/observable/internal/links/SpecificLinkQuery.d.ts.map +1 -0
- package/build/types/observable/internal/list/InterfaceListQuery.d.ts +18 -0
- package/build/types/observable/internal/list/InterfaceListQuery.d.ts.map +1 -0
- package/build/types/observable/internal/list/ListCacheKey.d.ts +7 -0
- package/build/types/observable/internal/list/ListCacheKey.d.ts.map +1 -0
- package/build/types/observable/internal/list/ListQuery.d.ts +106 -0
- package/build/types/observable/internal/list/ListQuery.d.ts.map +1 -0
- package/build/types/observable/internal/list/ListQueryOptions.d.ts +4 -0
- package/build/types/observable/internal/list/ListQueryOptions.d.ts.map +1 -0
- package/build/types/observable/internal/list/ListsHelper.d.ts +19 -0
- package/build/types/observable/internal/list/ListsHelper.d.ts.map +1 -0
- package/build/types/observable/internal/list/ObjectListQuery.d.ts +18 -0
- package/build/types/observable/internal/list/ObjectListQuery.d.ts.map +1 -0
- package/build/types/observable/internal/object/ObjectCacheKey.d.ts +5 -0
- package/build/types/observable/internal/object/ObjectCacheKey.d.ts.map +1 -0
- package/build/types/observable/internal/{ObjectQuery.d.ts → object/ObjectQuery.d.ts} +11 -9
- package/build/types/observable/internal/object/ObjectQuery.d.ts.map +1 -0
- package/build/types/observable/internal/object/ObjectsHelper.d.ts +11 -0
- package/build/types/observable/internal/object/ObjectsHelper.d.ts.map +1 -0
- package/build/types/observable/internal/sorting/SortingStrategy.d.ts +41 -0
- package/build/types/observable/internal/sorting/SortingStrategy.d.ts.map +1 -0
- package/build/types/observable/internal/testUtils/invalidateList.d.ts +9 -0
- package/build/types/observable/internal/testUtils/invalidateList.d.ts.map +1 -0
- package/build/types/observable/internal/testUtils/observeLink/expectStandardObserveLink.d.ts +46 -0
- package/build/types/observable/internal/testUtils/observeLink/expectStandardObserveLink.d.ts.map +1 -0
- package/build/types/observable/internal/testUtils/observeObject/expectStandardObserveObject.d.ts +26 -0
- package/build/types/observable/internal/testUtils/observeObject/expectStandardObserveObject.d.ts.map +1 -0
- package/build/types/observable/internal/testUtils.d.ts +26 -4
- package/build/types/observable/internal/testUtils.d.ts.map +1 -1
- package/build/types/public/unstable-do-not-use.d.ts +4 -2
- package/build/types/public/unstable-do-not-use.d.ts.map +1 -1
- package/build/types/util/exponentialBackoff.d.ts +14 -0
- package/build/types/util/exponentialBackoff.d.ts.map +1 -0
- package/build/types/util/exponentialBackoff.test.d.ts +1 -0
- package/build/types/util/exponentialBackoff.test.d.ts.map +1 -0
- package/package.json +27 -27
- package/build/browser/observable/internal/ActionApplication.js.map +0 -1
- package/build/browser/observable/internal/ListQuery.js +0 -618
- package/build/browser/observable/internal/ListQuery.js.map +0 -1
- package/build/browser/observable/internal/ObjectQuery.js.map +0 -1
- package/build/browser/observable/internal/OptimisticJob.js.map +0 -1
- package/build/cjs/chunk-26WFEZQO.cjs.map +0 -1
- package/build/cjs/chunk-633AI7EA.cjs.map +0 -1
- package/build/esm/observable/internal/ActionApplication.js.map +0 -1
- package/build/esm/observable/internal/ListQuery.js +0 -618
- package/build/esm/observable/internal/ListQuery.js.map +0 -1
- package/build/esm/observable/internal/ObjectQuery.js.map +0 -1
- package/build/esm/observable/internal/OptimisticJob.js.map +0 -1
- package/build/types/observable/internal/ListQuery.d.ts +0 -88
- package/build/types/observable/internal/ListQuery.d.ts.map +0 -1
- package/build/types/observable/internal/ObjectQuery.d.ts.map +0 -1
- package/build/types/observable/internal/OptimisticJob.d.ts.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"KnownCacheKey.js","names":[],"sources":["KnownCacheKey.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 { SpecificLinkCacheKey } from \"./links/SpecificLinkCacheKey.js\";\nimport type { ListCacheKey } from \"./list/ListCacheKey.js\";\nimport type { ObjectCacheKey } from \"./object/ObjectCacheKey.js\";\n\nexport type KnownCacheKey =\n | ObjectCacheKey\n | SpecificLinkCacheKey\n | ListCacheKey;\n"],"mappings":"","ignoreList":[]}
|
|
@@ -68,12 +68,4 @@ export class Layer {
|
|
|
68
68
|
this.#cache.set(cacheKey, value);
|
|
69
69
|
}
|
|
70
70
|
}
|
|
71
|
-
export class Entry {
|
|
72
|
-
constructor(cacheKey, value, lastUpdated, status = "init") {
|
|
73
|
-
this.cacheKey = cacheKey;
|
|
74
|
-
this.value = value;
|
|
75
|
-
this.lastUpdated = lastUpdated;
|
|
76
|
-
this.status = status;
|
|
77
|
-
}
|
|
78
|
-
}
|
|
79
71
|
//# sourceMappingURL=Layer.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Layer.js","names":["WeakMapWithEntries","Layer","parent","cache","layerId","constructor","parentLayer","addLayer","removeLayer","entries","keys","get","cacheKey","set","value"
|
|
1
|
+
{"version":3,"file":"Layer.js","names":["WeakMapWithEntries","Layer","parent","cache","layerId","constructor","parentLayer","addLayer","removeLayer","entries","keys","get","cacheKey","set","value"],"sources":["Layer.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 { KnownCacheKey } from \"./KnownCacheKey.js\";\nimport { WeakMapWithEntries } from \"./WeakMapWithEntries.js\";\n\n/*\n Image some layers\n\n [\n { cache: { obj1: { a: 1 } }, layerId: undefined },\n { cache: { obj1: { a: 1, b: 2 } }, layerId: \"layer1\" },\n { cache: { obj1: { a: undefined, b: 2 } }, layerId: \"layer2\" },\n { cache: { obj1: { a: 1, b: 2 } }, layerId: \"layer3\" },\n ]\n*/\n\nexport class Layer {\n #parent: Layer | undefined;\n #cache = new WeakMapWithEntries<KnownCacheKey, Entry<any>>();\n #layerId: unknown;\n\n constructor(parent: Layer | undefined, layerId: unknown) {\n this.#parent = parent;\n this.#layerId = layerId;\n }\n\n get parentLayer(): Layer | undefined {\n return this.#parent;\n }\n\n get layerId(): unknown {\n return this.#layerId;\n }\n\n addLayer(layerId: unknown): Layer {\n return new Layer(this, layerId);\n }\n\n removeLayer(layerId: unknown): Layer {\n if (layerId == null || this.#parent == null) {\n // we are the root, so we can't remove anything\n return this;\n }\n\n if (this.#layerId !== layerId) {\n this.#parent = this.#parent.removeLayer(layerId);\n return this;\n }\n\n return this.#parent.removeLayer(layerId);\n }\n\n entries(): IterableIterator<[KnownCacheKey, Entry<any>]> {\n return this.#cache.entries();\n }\n\n keys(): IterableIterator<KnownCacheKey> {\n return this.#cache.keys();\n }\n\n public get<K extends KnownCacheKey>(\n cacheKey: K,\n ): Entry<K> | undefined {\n return this.#cache.get(cacheKey) as Entry<K> | undefined\n ?? this.#parent?.get(cacheKey) as Entry<K> | undefined;\n }\n\n public set<K extends KnownCacheKey>(\n cacheKey: K,\n value: Entry<K>,\n ): void {\n this.#cache.set(cacheKey, value);\n }\n}\n\nexport interface Entry<K extends KnownCacheKey> {\n readonly cacheKey: K;\n value: K[\"__cacheKey\"][\"value\"] | undefined;\n lastUpdated: number;\n status: \"init\" | \"loading\" | \"loaded\" | \"error\";\n}\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAGA,SAASA,kBAAkB,QAAQ,yBAAyB;;AAE5D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,OAAO,MAAMC,KAAK,CAAC;EACjB,CAACC,MAAM;EACP,CAACC,KAAK,GAAG,IAAIH,kBAAkB,CAA4B,CAAC;EAC5D,CAACI,OAAO;EAERC,WAAWA,CAACH,MAAyB,EAAEE,OAAgB,EAAE;IACvD,IAAI,CAAC,CAACF,MAAM,GAAGA,MAAM;IACrB,IAAI,CAAC,CAACE,OAAO,GAAGA,OAAO;EACzB;EAEA,IAAIE,WAAWA,CAAA,EAAsB;IACnC,OAAO,IAAI,CAAC,CAACJ,MAAM;EACrB;EAEA,IAAIE,OAAOA,CAAA,EAAY;IACrB,OAAO,IAAI,CAAC,CAACA,OAAO;EACtB;EAEAG,QAAQA,CAACH,OAAgB,EAAS;IAChC,OAAO,IAAIH,KAAK,CAAC,IAAI,EAAEG,OAAO,CAAC;EACjC;EAEAI,WAAWA,CAACJ,OAAgB,EAAS;IACnC,IAAIA,OAAO,IAAI,IAAI,IAAI,IAAI,CAAC,CAACF,MAAM,IAAI,IAAI,EAAE;MAC3C;MACA,OAAO,IAAI;IACb;IAEA,IAAI,IAAI,CAAC,CAACE,OAAO,KAAKA,OAAO,EAAE;MAC7B,IAAI,CAAC,CAACF,MAAM,GAAG,IAAI,CAAC,CAACA,MAAM,CAACM,WAAW,CAACJ,OAAO,CAAC;MAChD,OAAO,IAAI;IACb;IAEA,OAAO,IAAI,CAAC,CAACF,MAAM,CAACM,WAAW,CAACJ,OAAO,CAAC;EAC1C;EAEAK,OAAOA,CAAA,EAAkD;IACvD,OAAO,IAAI,CAAC,CAACN,KAAK,CAACM,OAAO,CAAC,CAAC;EAC9B;EAEAC,IAAIA,CAAA,EAAoC;IACtC,OAAO,IAAI,CAAC,CAACP,KAAK,CAACO,IAAI,CAAC,CAAC;EAC3B;EAEOC,GAAGA,CACRC,QAAW,EACW;IACtB,OAAO,IAAI,CAAC,CAACT,KAAK,CAACQ,GAAG,CAACC,QAAQ,CAAC,IAC3B,IAAI,CAAC,CAACV,MAAM,EAAES,GAAG,CAACC,QAAQ,CAAyB;EAC1D;EAEOC,GAAGA,CACRD,QAAW,EACXE,KAAe,EACT;IACN,IAAI,CAAC,CAACX,KAAK,CAACU,GAAG,CAACD,QAAQ,EAAEE,KAAK,CAAC;EAClC;AACF","ignoreList":[]}
|
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright 2025 Palantir Technologies, Inc. All rights reserved.
|
|
3
|
+
*
|
|
4
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
* you may not use this file except in compliance with the License.
|
|
6
|
+
* You may obtain a copy of the License at
|
|
7
|
+
*
|
|
8
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
*
|
|
10
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
* See the License for the specific language governing permissions and
|
|
14
|
+
* limitations under the License.
|
|
15
|
+
*/
|
|
16
|
+
|
|
17
|
+
import invariant from "tiny-invariant";
|
|
18
|
+
import { createInitEntry } from "./createInitEntry.js";
|
|
19
|
+
import { Layer } from "./Layer.js";
|
|
20
|
+
import { Subjects } from "./Subjects.js";
|
|
21
|
+
import { tombstone } from "./tombstone.js";
|
|
22
|
+
export class Layers {
|
|
23
|
+
#truthLayer = new Layer(undefined, undefined);
|
|
24
|
+
#topLayer;
|
|
25
|
+
#onRevalidate;
|
|
26
|
+
constructor({
|
|
27
|
+
logger,
|
|
28
|
+
onRevalidate
|
|
29
|
+
}) {
|
|
30
|
+
this.logger = logger;
|
|
31
|
+
this.#topLayer = this.#truthLayer;
|
|
32
|
+
this.subjects = new Subjects({
|
|
33
|
+
logger,
|
|
34
|
+
layers: this
|
|
35
|
+
});
|
|
36
|
+
this.#onRevalidate = onRevalidate;
|
|
37
|
+
}
|
|
38
|
+
get top() {
|
|
39
|
+
return this.#topLayer;
|
|
40
|
+
}
|
|
41
|
+
get truth() {
|
|
42
|
+
return this.#truthLayer;
|
|
43
|
+
}
|
|
44
|
+
remove(layerId) {
|
|
45
|
+
!(layerId != null) ? process.env.NODE_ENV !== "production" ? invariant(false, "undefined is the reserved layerId for the truth layer") : invariant(false) : void 0;
|
|
46
|
+
// 1. collect all cache keys for a given layerId
|
|
47
|
+
let currentLayer = this.#topLayer;
|
|
48
|
+
const cacheKeys = new Map();
|
|
49
|
+
while (currentLayer != null && currentLayer.parentLayer != null) {
|
|
50
|
+
if (currentLayer.layerId === layerId) {
|
|
51
|
+
for (const [k, v] of currentLayer.entries()) {
|
|
52
|
+
if (cacheKeys.has(k)) continue;
|
|
53
|
+
cacheKeys.set(k, v);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
currentLayer = currentLayer.parentLayer;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
// 2. remove the layers from the chain
|
|
60
|
+
this.#topLayer = this.#topLayer.removeLayer(layerId);
|
|
61
|
+
|
|
62
|
+
// 3. check each cache key to see if it is different in the new chain
|
|
63
|
+
for (const [k, oldEntry] of cacheKeys) {
|
|
64
|
+
const currentEntry = this.#topLayer.get(k);
|
|
65
|
+
|
|
66
|
+
// 4. if different, update the subject
|
|
67
|
+
if (oldEntry !== currentEntry) {
|
|
68
|
+
const newEntry = currentEntry ?? createInitEntry(k);
|
|
69
|
+
// We are going to be pretty lazy here and just re-emit the value.
|
|
70
|
+
// In the future it may benefit us to deep equal check her but I think
|
|
71
|
+
// the subjects are effectively doing this anyway.
|
|
72
|
+
this.subjects.peek(k)?.next({
|
|
73
|
+
...newEntry,
|
|
74
|
+
isOptimistic: currentEntry?.value !== this.#truthLayer.get(k)?.value
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
batch({
|
|
80
|
+
optimisticId,
|
|
81
|
+
changes
|
|
82
|
+
}, batchFn) {
|
|
83
|
+
!(optimisticId === undefined || !!optimisticId) ? process.env.NODE_ENV !== "production" ? invariant(false, "optimistic must be undefined or not falsy") : invariant(false) : void 0;
|
|
84
|
+
const batchContext = this.#createBatchContext({
|
|
85
|
+
optimisticId,
|
|
86
|
+
changes
|
|
87
|
+
});
|
|
88
|
+
const retVal = batchFn(batchContext);
|
|
89
|
+
this.#onRevalidate(changes, optimisticId).catch(e => {
|
|
90
|
+
// we don't want batch() to return a promise,
|
|
91
|
+
// so we settle for logging an error here instead of
|
|
92
|
+
// dropping it on the floor.
|
|
93
|
+
if (this.logger) {
|
|
94
|
+
this.logger.error("Unhandled error in batch", e);
|
|
95
|
+
} else {
|
|
96
|
+
// eslint-disable-next-line no-console
|
|
97
|
+
console.error("Unhandled error in batch", e);
|
|
98
|
+
throw e;
|
|
99
|
+
}
|
|
100
|
+
});
|
|
101
|
+
return {
|
|
102
|
+
batchResult: batchContext,
|
|
103
|
+
retVal: retVal,
|
|
104
|
+
changes: batchContext.changes
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
#createBatchContext({
|
|
108
|
+
optimisticId,
|
|
109
|
+
changes
|
|
110
|
+
}) {
|
|
111
|
+
let needsLayer = optimisticId !== undefined;
|
|
112
|
+
const batchContext = {
|
|
113
|
+
changes,
|
|
114
|
+
createLayerIfNeeded: () => {
|
|
115
|
+
if (needsLayer) {
|
|
116
|
+
this.#topLayer = this.#topLayer.addLayer(optimisticId);
|
|
117
|
+
needsLayer = false;
|
|
118
|
+
}
|
|
119
|
+
},
|
|
120
|
+
optimisticWrite: !!optimisticId,
|
|
121
|
+
write: (cacheKey, value, status) => {
|
|
122
|
+
const oldTopValue = this.#topLayer.get(cacheKey);
|
|
123
|
+
if (optimisticId) batchContext.createLayerIfNeeded();
|
|
124
|
+
const writeLayer = optimisticId ? this.#topLayer : this.#truthLayer;
|
|
125
|
+
const newValue = {
|
|
126
|
+
cacheKey,
|
|
127
|
+
value,
|
|
128
|
+
lastUpdated: Date.now(),
|
|
129
|
+
status
|
|
130
|
+
};
|
|
131
|
+
writeLayer.set(cacheKey, newValue);
|
|
132
|
+
const newTopValue = this.#topLayer.get(cacheKey);
|
|
133
|
+
if (oldTopValue !== newTopValue) {
|
|
134
|
+
this.subjects.get(cacheKey)?.next({
|
|
135
|
+
...newValue,
|
|
136
|
+
isOptimistic: newTopValue?.value !== this.#truthLayer.get(cacheKey)?.value
|
|
137
|
+
});
|
|
138
|
+
}
|
|
139
|
+
return newValue;
|
|
140
|
+
},
|
|
141
|
+
delete: (cacheKey, status) => {
|
|
142
|
+
return batchContext.write(cacheKey, tombstone, status);
|
|
143
|
+
},
|
|
144
|
+
read: cacheKey => {
|
|
145
|
+
return optimisticId ? this.#topLayer.get(cacheKey) : this.#truthLayer.get(cacheKey);
|
|
146
|
+
}
|
|
147
|
+
};
|
|
148
|
+
return batchContext;
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
//# sourceMappingURL=Layers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Layers.js","names":["invariant","createInitEntry","Layer","Subjects","tombstone","Layers","truthLayer","undefined","topLayer","onRevalidate","constructor","logger","subjects","layers","top","truth","remove","layerId","process","env","NODE_ENV","currentLayer","cacheKeys","Map","parentLayer","k","v","entries","has","set","removeLayer","oldEntry","currentEntry","get","newEntry","peek","next","isOptimistic","value","batch","optimisticId","changes","batchFn","batchContext","createBatchContext","retVal","catch","e","error","console","batchResult","#createBatchContext","needsLayer","createLayerIfNeeded","addLayer","optimisticWrite","write","cacheKey","status","oldTopValue","writeLayer","newValue","lastUpdated","Date","now","newTopValue","delete","read"],"sources":["Layers.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 { Logger } from \"@osdk/api\";\nimport invariant from \"tiny-invariant\";\nimport type { BatchContext } from \"./BatchContext.js\";\nimport { type Changes } from \"./Changes.js\";\nimport { createInitEntry } from \"./createInitEntry.js\";\nimport type { KnownCacheKey } from \"./KnownCacheKey.js\";\nimport type { Entry } from \"./Layer.js\";\nimport { Layer } from \"./Layer.js\";\nimport type { OptimisticId } from \"./OptimisticId.js\";\nimport { Subjects } from \"./Subjects.js\";\nimport { tombstone } from \"./tombstone.js\";\n\nexport class Layers {\n #truthLayer: Layer = new Layer(undefined, undefined);\n #topLayer: Layer;\n #onRevalidate: (\n changes: Changes,\n optimisticId?: OptimisticId,\n ) => Promise<void>;\n\n logger?: Logger;\n\n readonly subjects: Subjects;\n\n constructor(\n { logger, onRevalidate }: {\n logger?: Logger;\n onRevalidate: (\n changes: Changes,\n optimisticId?: OptimisticId,\n ) => Promise<void>;\n },\n ) {\n this.logger = logger;\n this.#topLayer = this.#truthLayer;\n this.subjects = new Subjects({ logger, layers: this });\n this.#onRevalidate = onRevalidate;\n }\n\n get top(): Layer {\n return this.#topLayer;\n }\n\n get truth(): Layer {\n return this.#truthLayer;\n }\n\n remove(layerId: OptimisticId): void {\n invariant(\n layerId != null,\n \"undefined is the reserved layerId for the truth layer\",\n );\n // 1. collect all cache keys for a given layerId\n let currentLayer: Layer | undefined = this.#topLayer;\n const cacheKeys = new Map<KnownCacheKey, Entry<any>>();\n while (currentLayer != null && currentLayer.parentLayer != null) {\n if (currentLayer.layerId === layerId) {\n for (const [k, v] of currentLayer.entries()) {\n if (cacheKeys.has(k)) continue;\n cacheKeys.set(k, v);\n }\n }\n\n currentLayer = currentLayer.parentLayer;\n }\n\n // 2. remove the layers from the chain\n this.#topLayer = this.#topLayer.removeLayer(layerId);\n\n // 3. check each cache key to see if it is different in the new chain\n for (const [k, oldEntry] of cacheKeys) {\n const currentEntry = this.#topLayer.get(k);\n\n // 4. if different, update the subject\n if (oldEntry !== currentEntry) {\n const newEntry = currentEntry ?? createInitEntry(k);\n // We are going to be pretty lazy here and just re-emit the value.\n // In the future it may benefit us to deep equal check her but I think\n // the subjects are effectively doing this anyway.\n this.subjects.peek(k)?.next(\n {\n ...newEntry,\n isOptimistic:\n currentEntry?.value !== this.#truthLayer.get(k)?.value,\n },\n );\n }\n }\n }\n\n public batch<X>(\n { optimisticId, changes }: {\n optimisticId?: OptimisticId;\n changes: Changes;\n },\n batchFn: (batchContext: BatchContext) => X,\n ): {\n batchResult: BatchContext;\n retVal: X;\n changes: Changes;\n } {\n invariant(\n optimisticId === undefined || !!optimisticId,\n \"optimistic must be undefined or not falsy\",\n );\n\n const batchContext: BatchContext = this.#createBatchContext({\n optimisticId,\n changes,\n });\n\n const retVal = batchFn(batchContext);\n\n this.#onRevalidate(changes, optimisticId).catch(e => {\n // we don't want batch() to return a promise,\n // so we settle for logging an error here instead of\n // dropping it on the floor.\n if (this.logger) {\n this.logger.error(\"Unhandled error in batch\", e);\n } else {\n // eslint-disable-next-line no-console\n console.error(\"Unhandled error in batch\", e);\n throw e;\n }\n });\n\n return {\n batchResult: batchContext,\n retVal: retVal,\n changes: batchContext.changes,\n };\n }\n\n #createBatchContext(\n { optimisticId, changes }: {\n optimisticId?: OptimisticId;\n changes: Changes;\n },\n ): BatchContext {\n let needsLayer = optimisticId !== undefined;\n\n const batchContext: BatchContext = {\n changes,\n createLayerIfNeeded: () => {\n if (needsLayer) {\n this.#topLayer = this.#topLayer.addLayer(optimisticId);\n needsLayer = false;\n }\n },\n optimisticWrite: !!optimisticId,\n write: (cacheKey, value, status) => {\n const oldTopValue = this.#topLayer.get(cacheKey);\n\n if (optimisticId) batchContext.createLayerIfNeeded();\n\n const writeLayer = optimisticId\n ? this.#topLayer\n : this.#truthLayer;\n const newValue: Entry<typeof cacheKey> = {\n cacheKey,\n value,\n lastUpdated: Date.now(),\n status,\n };\n\n writeLayer.set(cacheKey, newValue);\n\n const newTopValue = this.#topLayer.get(cacheKey);\n\n if (oldTopValue !== newTopValue) {\n this.subjects.get(cacheKey)?.next({\n ...newValue,\n isOptimistic:\n newTopValue?.value !== this.#truthLayer.get(cacheKey)?.value,\n });\n }\n\n return newValue;\n },\n delete: (cacheKey, status) => {\n return batchContext.write(cacheKey, tombstone, status);\n },\n read: (cacheKey) => {\n return optimisticId\n ? this.#topLayer.get(cacheKey)\n : this.#truthLayer.get(cacheKey);\n },\n };\n\n return batchContext;\n }\n}\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -14,17 +14,68 @@
|
|
|
14
14
|
* limitations under the License.
|
|
15
15
|
*/
|
|
16
16
|
|
|
17
|
+
import { Subscription } from "rxjs";
|
|
18
|
+
import { UnsubscribableWrapper } from "./UnsubscribableWrapper.js";
|
|
19
|
+
|
|
17
20
|
/**
|
|
21
|
+
* Implementation of the public ObservableClient interface.
|
|
22
|
+
* - Delegates all operations to the Store for consistency
|
|
23
|
+
* - Serves as the entry point for reactive data management
|
|
24
|
+
* - Ensures proper method binding and API exposure
|
|
25
|
+
*
|
|
18
26
|
* @internal
|
|
19
27
|
*/
|
|
20
28
|
export class ObservableClientImpl {
|
|
21
29
|
constructor(store) {
|
|
22
30
|
this.__experimentalStore = store;
|
|
23
|
-
this.observeObject = store.observeObject.bind(store);
|
|
24
|
-
this.observeList = store.observeList.bind(store);
|
|
25
31
|
this.applyAction = store.applyAction.bind(store);
|
|
26
32
|
this.validateAction = store.validateAction.bind(store);
|
|
27
|
-
|
|
33
|
+
}
|
|
34
|
+
observeObject = (apiName, pk, options, subFn) => {
|
|
35
|
+
return this.__experimentalStore.objects.observe({
|
|
36
|
+
...options,
|
|
37
|
+
apiName,
|
|
38
|
+
pk
|
|
39
|
+
},
|
|
40
|
+
// cast to cross typed to untyped barrier
|
|
41
|
+
subFn);
|
|
42
|
+
};
|
|
43
|
+
observeList = (options, subFn) => {
|
|
44
|
+
return this.__experimentalStore.lists.observe(options,
|
|
45
|
+
// cast to cross typed to untyped barrier
|
|
46
|
+
subFn);
|
|
47
|
+
};
|
|
48
|
+
observeLinks = (objects, linkName, options, subFn) => {
|
|
49
|
+
// Convert to array if single object provided
|
|
50
|
+
const objectsArray = Array.isArray(objects) ? objects : [objects];
|
|
51
|
+
const parentSub = new Subscription();
|
|
52
|
+
for (const obj of objectsArray) {
|
|
53
|
+
const querySubscription = this.__experimentalStore.links.observe({
|
|
54
|
+
...options,
|
|
55
|
+
srcType: {
|
|
56
|
+
type: "object",
|
|
57
|
+
apiName: obj.$apiName
|
|
58
|
+
},
|
|
59
|
+
linkName,
|
|
60
|
+
pk: obj.$primaryKey
|
|
61
|
+
},
|
|
62
|
+
// cast to cross typed to untyped barrier
|
|
63
|
+
subFn);
|
|
64
|
+
parentSub.add(querySubscription);
|
|
65
|
+
}
|
|
66
|
+
return new UnsubscribableWrapper(parentSub);
|
|
67
|
+
};
|
|
68
|
+
invalidateAll() {
|
|
69
|
+
return this.__experimentalStore.invalidateAll();
|
|
70
|
+
}
|
|
71
|
+
invalidateObjects(objects) {
|
|
72
|
+
return this.__experimentalStore.invalidateObjects(objects);
|
|
73
|
+
}
|
|
74
|
+
invalidateObjectType(type) {
|
|
75
|
+
return this.__experimentalStore.invalidateObjectType(type, undefined);
|
|
76
|
+
}
|
|
77
|
+
canonicalizeWhereClause(where) {
|
|
78
|
+
return this.__experimentalStore.whereCanonicalizer.canonicalize(where);
|
|
28
79
|
}
|
|
29
80
|
}
|
|
30
81
|
//# sourceMappingURL=ObservableClientImpl.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ObservableClientImpl.js","names":["ObservableClientImpl","constructor","store","__experimentalStore","
|
|
1
|
+
{"version":3,"file":"ObservableClientImpl.js","names":["Subscription","UnsubscribableWrapper","ObservableClientImpl","constructor","store","__experimentalStore","applyAction","bind","validateAction","observeObject","apiName","pk","options","subFn","objects","observe","observeList","lists","observeLinks","linkName","objectsArray","Array","isArray","parentSub","obj","querySubscription","links","srcType","type","$apiName","$primaryKey","add","invalidateAll","invalidateObjects","invalidateObjectType","undefined","canonicalizeWhereClause","where","whereCanonicalizer","canonicalize"],"sources":["ObservableClientImpl.ts"],"sourcesContent":["/*\n * Copyright 2025 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport type {\n ActionDefinition,\n ActionValidationResponse,\n CompileTimeMetadata,\n InterfaceDefinition,\n ObjectTypeDefinition,\n Osdk,\n PrimaryKeyType,\n WhereClause,\n} from \"@osdk/api\";\nimport { Subscription } from \"rxjs\";\nimport type { ActionSignatureFromDef } from \"../../actions/applyAction.js\";\nimport type { SpecificLinkPayload } from \"../LinkPayload.js\";\nimport type { ListPayload } from \"../ListPayload.js\";\nimport type { ObjectPayload } from \"../ObjectPayload.js\";\nimport type {\n ObservableClient,\n ObserveListOptions,\n ObserveObjectArgs,\n ObserveObjectOptions,\n ObserveObjectsArgs,\n Unsubscribable,\n} from \"../ObservableClient.js\";\nimport type { Observer } from \"../ObservableClient/common.js\";\nimport type { ObserveLinks } from \"../ObservableClient/ObserveLink.js\";\nimport type { Canonical } from \"./Canonical.js\";\nimport type { Store } from \"./Store.js\";\nimport { UnsubscribableWrapper } from \"./UnsubscribableWrapper.js\";\n\n/**\n * Implementation of the public ObservableClient interface.\n * - Delegates all operations to the Store for consistency\n * - Serves as the entry point for reactive data management\n * - Ensures proper method binding and API exposure\n *\n * @internal\n */\nexport class ObservableClientImpl implements ObservableClient {\n __experimentalStore: Store;\n\n constructor(store: Store) {\n this.__experimentalStore = store;\n\n this.applyAction = store.applyAction.bind(store);\n this.validateAction = store.validateAction.bind(store);\n }\n\n public observeObject: <T extends ObjectTypeDefinition>(\n apiName: T[\"apiName\"] | T,\n pk: PrimaryKeyType<T>,\n options: Omit<ObserveObjectOptions<T>, \"apiName\" | \"pk\">,\n subFn: Observer<ObserveObjectArgs<T>>,\n ) => Unsubscribable = (apiName, pk, options, subFn) => {\n return this.__experimentalStore.objects.observe(\n {\n ...options,\n apiName,\n pk,\n },\n // cast to cross typed to untyped barrier\n subFn as unknown as Observer<ObjectPayload>,\n );\n };\n\n public observeList: <T extends ObjectTypeDefinition | InterfaceDefinition>(\n options: ObserveListOptions<T>,\n subFn: Observer<ObserveObjectsArgs<T>>,\n ) => Unsubscribable = (options, subFn) => {\n return this.__experimentalStore.lists.observe(\n options,\n // cast to cross typed to untyped barrier\n subFn as unknown as Observer<ListPayload>,\n );\n };\n\n public observeLinks: <\n T extends ObjectTypeDefinition | InterfaceDefinition,\n L extends keyof CompileTimeMetadata<T>[\"links\"] & string,\n >(\n objects: Osdk.Instance<T> | Array<Osdk.Instance<T>>,\n linkName: L,\n options: ObserveLinks.Options<T, L>,\n subFn: Observer<\n ObserveLinks.CallbackArgs<\n CompileTimeMetadata<T>[\"links\"][L][\"targetType\"]\n >\n >,\n ) => Unsubscribable = (objects, linkName, options, subFn) => {\n // Convert to array if single object provided\n const objectsArray = Array.isArray(objects) ? objects : [objects];\n\n const parentSub = new Subscription();\n\n for (const obj of objectsArray) {\n const querySubscription = this.__experimentalStore.links\n .observe(\n {\n ...options,\n srcType: {\n type: \"object\",\n apiName: obj.$apiName,\n },\n linkName,\n pk: obj.$primaryKey,\n },\n // cast to cross typed to untyped barrier\n subFn as unknown as Observer<SpecificLinkPayload>,\n );\n\n parentSub.add(querySubscription);\n }\n\n return new UnsubscribableWrapper(parentSub);\n };\n\n public applyAction: <Q extends ActionDefinition<any>>(\n action: Q,\n args: Parameters<ActionSignatureFromDef<Q>[\"applyAction\"]>[0],\n opts?: ObservableClient.ApplyActionOptions,\n ) => Promise<unknown>;\n\n public validateAction: <Q extends ActionDefinition<any>>(\n action: Q,\n args: Parameters<ActionSignatureFromDef<Q>[\"applyAction\"]>[0],\n ) => Promise<ActionValidationResponse>;\n\n public invalidateAll(): Promise<void> {\n return this.__experimentalStore.invalidateAll();\n }\n\n public invalidateObjects(\n objects:\n | Osdk.Instance<ObjectTypeDefinition>\n | ReadonlyArray<Osdk.Instance<ObjectTypeDefinition>>,\n ): Promise<void> {\n return this.__experimentalStore.invalidateObjects(objects);\n }\n\n public invalidateObjectType<T extends ObjectTypeDefinition>(\n type: T | T[\"apiName\"],\n ): Promise<void> {\n return this.__experimentalStore.invalidateObjectType(type, undefined);\n }\n\n public canonicalizeWhereClause<\n T extends ObjectTypeDefinition | InterfaceDefinition,\n >(where: WhereClause<T>): Canonical<WhereClause<T>> {\n return this.__experimentalStore.whereCanonicalizer\n .canonicalize(where) as Canonical<WhereClause<T>>;\n }\n}\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAYA,SAASA,YAAY,QAAQ,MAAM;AAiBnC,SAASC,qBAAqB,QAAQ,4BAA4B;;AAElE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,MAAMC,oBAAoB,CAA6B;EAG5DC,WAAWA,CAACC,KAAY,EAAE;IACxB,IAAI,CAACC,mBAAmB,GAAGD,KAAK;IAEhC,IAAI,CAACE,WAAW,GAAGF,KAAK,CAACE,WAAW,CAACC,IAAI,CAACH,KAAK,CAAC;IAChD,IAAI,CAACI,cAAc,GAAGJ,KAAK,CAACI,cAAc,CAACD,IAAI,CAACH,KAAK,CAAC;EACxD;EAEOK,aAAa,GAKEA,CAACC,OAAO,EAAEC,EAAE,EAAEC,OAAO,EAAEC,KAAK,KAAK;IACrD,OAAO,IAAI,CAACR,mBAAmB,CAACS,OAAO,CAACC,OAAO,CAC7C;MACE,GAAGH,OAAO;MACVF,OAAO;MACPC;IACF,CAAC;IACD;IACAE,KACF,CAAC;EACH,CAAC;EAEMG,WAAW,GAGIA,CAACJ,OAAO,EAAEC,KAAK,KAAK;IACxC,OAAO,IAAI,CAACR,mBAAmB,CAACY,KAAK,CAACF,OAAO,CAC3CH,OAAO;IACP;IACAC,KACF,CAAC;EACH,CAAC;EAEMK,YAAY,GAYGA,CAACJ,OAAO,EAAEK,QAAQ,EAAEP,OAAO,EAAEC,KAAK,KAAK;IAC3D;IACA,MAAMO,YAAY,GAAGC,KAAK,CAACC,OAAO,CAACR,OAAO,CAAC,GAAGA,OAAO,GAAG,CAACA,OAAO,CAAC;IAEjE,MAAMS,SAAS,GAAG,IAAIvB,YAAY,CAAC,CAAC;IAEpC,KAAK,MAAMwB,GAAG,IAAIJ,YAAY,EAAE;MAC9B,MAAMK,iBAAiB,GAAG,IAAI,CAACpB,mBAAmB,CAACqB,KAAK,CACrDX,OAAO,CACN;QACE,GAAGH,OAAO;QACVe,OAAO,EAAE;UACPC,IAAI,EAAE,QAAQ;UACdlB,OAAO,EAAEc,GAAG,CAACK;QACf,CAAC;QACDV,QAAQ;QACRR,EAAE,EAAEa,GAAG,CAACM;MACV,CAAC;MACD;MACAjB,KACF,CAAC;MAEHU,SAAS,CAACQ,GAAG,CAACN,iBAAiB,CAAC;IAClC;IAEA,OAAO,IAAIxB,qBAAqB,CAACsB,SAAS,CAAC;EAC7C,CAAC;EAaMS,aAAaA,CAAA,EAAkB;IACpC,OAAO,IAAI,CAAC3B,mBAAmB,CAAC2B,aAAa,CAAC,CAAC;EACjD;EAEOC,iBAAiBA,CACtBnB,OAEsD,EACvC;IACf,OAAO,IAAI,CAACT,mBAAmB,CAAC4B,iBAAiB,CAACnB,OAAO,CAAC;EAC5D;EAEOoB,oBAAoBA,CACzBN,IAAsB,EACP;IACf,OAAO,IAAI,CAACvB,mBAAmB,CAAC6B,oBAAoB,CAACN,IAAI,EAAEO,SAAS,CAAC;EACvE;EAEOC,uBAAuBA,CAE5BC,KAAqB,EAA6B;IAClD,OAAO,IAAI,CAAChC,mBAAmB,CAACiC,kBAAkB,CAC/CC,YAAY,CAACF,KAAK,CAAC;EACxB;AACF","ignoreList":[]}
|
|
@@ -14,43 +14,7 @@
|
|
|
14
14
|
* limitations under the License.
|
|
15
15
|
*/
|
|
16
16
|
|
|
17
|
-
import {
|
|
18
|
-
const defaultMakeData = () => Object.create(null);
|
|
19
|
-
export class WeakRefTrie {
|
|
20
|
-
#finalizer = new FinalizationRegistry(orderBy => {
|
|
21
|
-
this.#trie.removeArray(Object.entries(orderBy).flat());
|
|
22
|
-
});
|
|
23
|
-
#trie;
|
|
24
|
-
constructor(makeData = defaultMakeData) {
|
|
25
|
-
this.#trie = new Trie(false, array => {
|
|
26
|
-
const data = makeData(array);
|
|
27
|
-
this.#finalizer.register(data, array);
|
|
28
|
-
return new WeakRef(data);
|
|
29
|
-
});
|
|
30
|
-
}
|
|
31
|
-
lookupArray(array) {
|
|
32
|
-
const maybe = this.#trie.lookupArray(array);
|
|
33
|
-
let ret = maybe.deref();
|
|
34
|
-
if (maybe && !ret) {
|
|
35
|
-
// in case finalizer hasn't run
|
|
36
|
-
this.#trie.removeArray(array);
|
|
37
|
-
ret = this.#trie.lookupArray(array).deref();
|
|
38
|
-
}
|
|
39
|
-
return ret;
|
|
40
|
-
}
|
|
41
|
-
peekArray(array) {
|
|
42
|
-
const maybe = this.#trie.peekArray(array);
|
|
43
|
-
const ret = maybe?.deref();
|
|
44
|
-
if (maybe && !ret) {
|
|
45
|
-
// in case finalizer hasn't run
|
|
46
|
-
this.#trie.removeArray(array);
|
|
47
|
-
}
|
|
48
|
-
return ret;
|
|
49
|
-
}
|
|
50
|
-
removeArray(array) {
|
|
51
|
-
return this.#trie.removeArray(array)?.deref();
|
|
52
|
-
}
|
|
53
|
-
}
|
|
17
|
+
import { WeakRefTrie } from "./WeakRefTrie.js";
|
|
54
18
|
export class OrderByCanonicalizer {
|
|
55
19
|
#trie = new WeakRefTrie(array => {
|
|
56
20
|
const pairs = array.reduce(function (result, _, index, array) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"OrderByCanonicalizer.js","names":["
|
|
1
|
+
{"version":3,"file":"OrderByCanonicalizer.js","names":["WeakRefTrie","OrderByCanonicalizer","trie","array","pairs","reduce","result","_","index","push","slice","data","Object","fromEntries","process","env","NODE_ENV","freeze","canonicalize","orderBy","strings","entries","flat","lookupArray"],"sources":["OrderByCanonicalizer.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 { ObjectTypeDefinition } from \"@osdk/api\";\nimport type { OrderBy } from \"../ObservableClient.js\";\nimport type { Canonical } from \"./Canonical.js\";\nimport { WeakRefTrie } from \"./WeakRefTrie.js\";\n\nexport class OrderByCanonicalizer {\n #trie = new WeakRefTrie(\n (array: Array<string>) => {\n const pairs = array.reduce<Array<[string, \"asc\" | \"desc\"]>>(\n function(result, _, index, array) {\n if (index % 2 === 0 && array[index] != null) {\n result.push(\n array.slice(index, index + 2) as [string, \"asc\" | \"desc\"],\n );\n }\n return result;\n },\n [],\n );\n let data = Object.fromEntries(pairs) satisfies Record<\n string,\n \"asc\" | \"desc\"\n > as Canonical<OrderBy<ObjectTypeDefinition>>;\n\n if (process.env.NODE_ENV !== \"production\") {\n data = Object.freeze(data);\n }\n return data;\n },\n );\n\n canonicalize: (\n orderBy: Record<string, \"asc\" | \"desc\" | undefined>,\n ) => Canonical<Record<string, \"asc\" | \"desc\" | undefined>> = (\n orderBy,\n ) => {\n const strings = Object.entries(orderBy).flat();\n return this.#trie.lookupArray(strings);\n };\n}\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAKA,SAASA,WAAW,QAAQ,kBAAkB;AAE9C,OAAO,MAAMC,oBAAoB,CAAC;EAChC,CAACC,IAAI,GAAG,IAAIF,WAAW,CACpBG,KAAoB,IAAK;IACxB,MAAMC,KAAK,GAAGD,KAAK,CAACE,MAAM,CACxB,UAASC,MAAM,EAAEC,CAAC,EAAEC,KAAK,EAAEL,KAAK,EAAE;MAChC,IAAIK,KAAK,GAAG,CAAC,KAAK,CAAC,IAAIL,KAAK,CAACK,KAAK,CAAC,IAAI,IAAI,EAAE;QAC3CF,MAAM,CAACG,IAAI,CACTN,KAAK,CAACO,KAAK,CAACF,KAAK,EAAEA,KAAK,GAAG,CAAC,CAC9B,CAAC;MACH;MACA,OAAOF,MAAM;IACf,CAAC,EACD,EACF,CAAC;IACD,IAAIK,IAAI,GAAGC,MAAM,CAACC,WAAW,CAACT,KAAK,CAGU;IAE7C,IAAIU,OAAO,CAACC,GAAG,CAACC,QAAQ,KAAK,YAAY,EAAE;MACzCL,IAAI,GAAGC,MAAM,CAACK,MAAM,CAACN,IAAI,CAAC;IAC5B;IACA,OAAOA,IAAI;EACb,CACF,CAAC;EAEDO,YAAY,GAGVC,OAAO,IACJ;IACH,MAAMC,OAAO,GAAGR,MAAM,CAACS,OAAO,CAACF,OAAO,CAAC,CAACG,IAAI,CAAC,CAAC;IAC9C,OAAO,IAAI,CAAC,CAACpB,IAAI,CAACqB,WAAW,CAACH,OAAO,CAAC;EACxC,CAAC;AACH","ignoreList":[]}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright 2025 Palantir Technologies, Inc. All rights reserved.
|
|
3
|
+
*
|
|
4
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
* you may not use this file except in compliance with the License.
|
|
6
|
+
* You may obtain a copy of the License at
|
|
7
|
+
*
|
|
8
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
*
|
|
10
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
* See the License for the specific language governing permissions and
|
|
14
|
+
* limitations under the License.
|
|
15
|
+
*/
|
|
16
|
+
|
|
17
|
+
export class Queries {
|
|
18
|
+
// we can use a regular Map here because the refCounting will
|
|
19
|
+
// handle cleanup.
|
|
20
|
+
map = new Map();
|
|
21
|
+
peek(cacheKey) {
|
|
22
|
+
return this.map.get(cacheKey);
|
|
23
|
+
}
|
|
24
|
+
get(cacheKey, createQuery) {
|
|
25
|
+
let query = this.peek(cacheKey);
|
|
26
|
+
if (!query) {
|
|
27
|
+
query = createQuery();
|
|
28
|
+
this.map.set(cacheKey, query);
|
|
29
|
+
}
|
|
30
|
+
return query;
|
|
31
|
+
}
|
|
32
|
+
keys() {
|
|
33
|
+
return this.map.keys();
|
|
34
|
+
}
|
|
35
|
+
delete(cacheKey) {
|
|
36
|
+
this.map.get(cacheKey)?.dispose();
|
|
37
|
+
this.map.delete(cacheKey);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=Queries.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Queries.js","names":["Queries","map","Map","peek","cacheKey","get","createQuery","query","set","keys","delete","dispose"],"sources":["Queries.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 { KnownCacheKey } from \"./KnownCacheKey.js\";\nimport type { Query } from \"./Query.js\";\n\nexport class Queries {\n // we can use a regular Map here because the refCounting will\n // handle cleanup.\n map: Map<\n KnownCacheKey,\n Query<any, any, any>\n > = new Map();\n\n peek<K extends KnownCacheKey>(\n cacheKey: K,\n ): K[\"__cacheKey\"][\"query\"] | undefined {\n return this.map.get(cacheKey) as K[\"__cacheKey\"][\"query\"] | undefined;\n }\n\n get<K extends KnownCacheKey>(\n cacheKey: K,\n createQuery: () => K[\"__cacheKey\"][\"query\"],\n ): K[\"__cacheKey\"][\"query\"] {\n let query = this.peek(cacheKey);\n if (!query) {\n query = createQuery();\n this.map.set(cacheKey, query);\n }\n return query;\n }\n\n keys(): IterableIterator<KnownCacheKey> {\n return this.map.keys();\n }\n\n delete<K extends KnownCacheKey>(cacheKey: K): void {\n this.map.get(cacheKey)?.dispose();\n this.map.delete(cacheKey);\n }\n}\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAKA,OAAO,MAAMA,OAAO,CAAC;EACnB;EACA;EACAC,GAAG,GAGC,IAAIC,GAAG,CAAC,CAAC;EAEbC,IAAIA,CACFC,QAAW,EAC2B;IACtC,OAAO,IAAI,CAACH,GAAG,CAACI,GAAG,CAACD,QAAQ,CAAC;EAC/B;EAEAC,GAAGA,CACDD,QAAW,EACXE,WAA2C,EACjB;IAC1B,IAAIC,KAAK,GAAG,IAAI,CAACJ,IAAI,CAACC,QAAQ,CAAC;IAC/B,IAAI,CAACG,KAAK,EAAE;MACVA,KAAK,GAAGD,WAAW,CAAC,CAAC;MACrB,IAAI,CAACL,GAAG,CAACO,GAAG,CAACJ,QAAQ,EAAEG,KAAK,CAAC;IAC/B;IACA,OAAOA,KAAK;EACd;EAEAE,IAAIA,CAAA,EAAoC;IACtC,OAAO,IAAI,CAACR,GAAG,CAACQ,IAAI,CAAC,CAAC;EACxB;EAEAC,MAAMA,CAA0BN,QAAW,EAAQ;IACjD,IAAI,CAACH,GAAG,CAACI,GAAG,CAACD,QAAQ,CAAC,EAAEO,OAAO,CAAC,CAAC;IACjC,IAAI,CAACV,GAAG,CAACS,MAAM,CAACN,QAAQ,CAAC;EAC3B;AACF","ignoreList":[]}
|
|
@@ -20,6 +20,7 @@ export class Query {
|
|
|
20
20
|
#connectable;
|
|
21
21
|
#subscription;
|
|
22
22
|
#subject;
|
|
23
|
+
#subscriptionDedupeIntervals = new Map();
|
|
23
24
|
|
|
24
25
|
/** @internal */
|
|
25
26
|
|
|
@@ -27,6 +28,7 @@ export class Query {
|
|
|
27
28
|
this.options = opts;
|
|
28
29
|
this.cacheKey = cacheKey;
|
|
29
30
|
this.store = store;
|
|
31
|
+
this.cacheKeys = store.cacheKeys;
|
|
30
32
|
this.#subject = observable;
|
|
31
33
|
this.logger = logger ?? (process.env.NODE_ENV === "production" ? store.client[additionalContext].logger : store.client[additionalContext].logger?.child({}, {
|
|
32
34
|
msgPrefix: process.env.NODE_ENV !== "production" ? `Query<${cacheKey.type}, ${cacheKey.otherKeys.map(x => JSON.stringify(x)).join(", ")}>` : "Query"
|
|
@@ -38,6 +40,32 @@ export class Query {
|
|
|
38
40
|
return this.#connectable.subscribe(observer);
|
|
39
41
|
}
|
|
40
42
|
|
|
43
|
+
/**
|
|
44
|
+
* Register a subscription's dedupeInterval value
|
|
45
|
+
*/
|
|
46
|
+
registerSubscriptionDedupeInterval(subscriptionId, dedupeInterval) {
|
|
47
|
+
if (dedupeInterval != null && dedupeInterval > 0) {
|
|
48
|
+
this.#subscriptionDedupeIntervals.set(subscriptionId, dedupeInterval);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
/**
|
|
53
|
+
* Unregister a subscription's dedupeInterval value
|
|
54
|
+
*/
|
|
55
|
+
unregisterSubscriptionDedupeInterval(subscriptionId) {
|
|
56
|
+
this.#subscriptionDedupeIntervals.delete(subscriptionId);
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
/**
|
|
60
|
+
* Get the minimum dedupeInterval from all active subscriptions
|
|
61
|
+
*/
|
|
62
|
+
getMinimumDedupeInterval() {
|
|
63
|
+
if (this.#subscriptionDedupeIntervals.size === 0) {
|
|
64
|
+
return this.options.dedupeInterval ?? 0;
|
|
65
|
+
}
|
|
66
|
+
return Math.min(...this.#subscriptionDedupeIntervals.values());
|
|
67
|
+
}
|
|
68
|
+
|
|
41
69
|
/**
|
|
42
70
|
* Causes the query to revalidate. This will cause the query to fetch
|
|
43
71
|
* the latest data from the server and update the store if it is deemed
|
|
@@ -66,7 +94,8 @@ export class Query {
|
|
|
66
94
|
await this.pendingFetch;
|
|
67
95
|
return;
|
|
68
96
|
}
|
|
69
|
-
|
|
97
|
+
const minDedupeInterval = this.getMinimumDedupeInterval();
|
|
98
|
+
if (minDedupeInterval > 0 && this.lastFetchStarted != null && Date.now() - this.lastFetchStarted < minDedupeInterval) {
|
|
70
99
|
if (process.env.NODE_ENV !== "production") {
|
|
71
100
|
logger?.debug("Within dupeInterval, aborting revalidate");
|
|
72
101
|
}
|
|
@@ -88,7 +117,7 @@ export class Query {
|
|
|
88
117
|
logger?.debug("calling _fetchAndStore()");
|
|
89
118
|
}
|
|
90
119
|
this.pendingFetch = this._fetchAndStore().finally(() => {
|
|
91
|
-
logger?.debug("finally _fetchAndStore()");
|
|
120
|
+
logger?.debug("promise's finally for _fetchAndStore()");
|
|
92
121
|
this.pendingFetch = undefined;
|
|
93
122
|
});
|
|
94
123
|
await this.pendingFetch;
|
|
@@ -105,10 +134,22 @@ export class Query {
|
|
|
105
134
|
if (process.env.NODE_ENV !== "production") {
|
|
106
135
|
this.logger?.child({
|
|
107
136
|
methodName: "setStatus"
|
|
108
|
-
}).debug(status);
|
|
137
|
+
}).debug(`Attempting to set status to '${status}'`);
|
|
109
138
|
}
|
|
110
139
|
const existing = batch.read(this.cacheKey);
|
|
111
|
-
if (existing?.status === status)
|
|
140
|
+
if (existing?.status === status) {
|
|
141
|
+
if (process.env.NODE_ENV !== "production") {
|
|
142
|
+
this.logger?.child({
|
|
143
|
+
methodName: "setStatus"
|
|
144
|
+
}).debug(`Status is already set to '${status}'; aborting`);
|
|
145
|
+
}
|
|
146
|
+
return;
|
|
147
|
+
}
|
|
148
|
+
if (process.env.NODE_ENV !== "production") {
|
|
149
|
+
this.logger?.child({
|
|
150
|
+
methodName: "setStatus"
|
|
151
|
+
}).debug(`Writing status '${status}' to cache`);
|
|
152
|
+
}
|
|
112
153
|
batch.write(this.cacheKey, existing?.value, status);
|
|
113
154
|
}
|
|
114
155
|
dispose() {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Query.js","names":["additionalContext","Query","retainCount","connectable","subscription","subject","constructor","store","observable","opts","cacheKey","logger","options","process","env","NODE_ENV","client","child","msgPrefix","type","otherKeys","map","x","JSON","stringify","join","subscribe","observer","_createConnectable","connect","revalidate","force","methodName","abortController","abort","pendingFetch","debug","dedupeInterval","lastFetchStarted","Date","now","Promise","resolve","batch","setStatus","_preFetch","_fetchAndStore","finally","undefined","status","existing","read","write","value","dispose","unsubscribe","_dispose"],"sources":["Query.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 { Logger } from \"@osdk/api\";\nimport type {\n Connectable,\n Observable,\n Observer,\n Subscribable,\n Subscription,\n} from \"rxjs\";\nimport { additionalContext } from \"../../Client.js\";\nimport type { CommonObserveOptions, Status } from \"../ObservableClient.js\";\nimport type { CacheKey } from \"./CacheKey.js\";\nimport type { Changes } from \"./Changes.js\";\nimport type { Entry } from \"./Layer.js\";\nimport type { OptimisticId } from \"./OptimisticId.js\";\nimport type { BatchContext, Store, SubjectPayload } from \"./Store.js\";\n\nexport abstract class Query<\n KEY extends CacheKey,\n PAYLOAD,\n O extends CommonObserveOptions,\n> implements Subscribable<PAYLOAD> {\n lastFetchStarted?: number;\n pendingFetch?: Promise<unknown>;\n retainCount: number = 0;\n options: O;\n cacheKey: KEY;\n store: Store;\n abortController?: AbortController;\n #connectable?: Connectable<PAYLOAD>;\n #subscription?: Subscription;\n #subject: Observable<SubjectPayload<KEY>>;\n\n /** @internal */\n protected logger: Logger | undefined;\n\n constructor(\n store: Store,\n observable: Observable<SubjectPayload<KEY>>,\n opts: O,\n cacheKey: KEY,\n logger?: Logger,\n ) {\n this.options = opts;\n this.cacheKey = cacheKey;\n this.store = store;\n this.#subject = observable;\n\n this.logger = logger ?? (\n process.env.NODE_ENV === \"production\"\n ? store.client[additionalContext].logger\n : store.client[additionalContext].logger?.child({}, {\n msgPrefix: process.env.NODE_ENV !== \"production\"\n ? (`Query<${cacheKey.type}, ${\n cacheKey.otherKeys.map(x => JSON.stringify(x)).join(\", \")\n }>`)\n : \"Query\",\n })\n );\n }\n\n protected abstract _createConnectable(\n subject: Observable<SubjectPayload<KEY>>,\n ): Connectable<PAYLOAD>;\n\n public subscribe(\n observer: Observer<PAYLOAD>,\n ): Subscription {\n this.#connectable ??= this._createConnectable(this.#subject);\n this.#subscription = this.#connectable.connect();\n return this.#connectable.subscribe(observer);\n }\n\n /**\n * Causes the query to revalidate. This will cause the query to fetch\n * the latest data from the server and update the store if it is deemed\n * \"stale\" or if `force` is true.\n *\n * @param force\n * @returns\n */\n async revalidate(force?: boolean): Promise<void> {\n const logger = process.env.NODE_ENV !== \"production\"\n ? this.logger?.child({ methodName: \"revalidate\" })\n : this.logger;\n\n if (force) {\n this.abortController?.abort();\n }\n\n // n.b. I think this isn't quite right since we may require multiple\n // pages to properly \"revalidate\" for someone. This only really works if you\n // have a single page/object. It needs to be redone. FIXME\n\n // if we are pending the first page/object we can just ignore this\n if (this.pendingFetch) {\n if (process.env.NODE_ENV !== \"production\") {\n logger?.debug(\"Fetch is already pending, using it\");\n }\n await this.pendingFetch;\n return;\n }\n\n if (\n (this.options.dedupeInterval ?? 0) > 0 && (\n this.lastFetchStarted != null\n && Date.now() - this.lastFetchStarted < (this.options.dedupeInterval\n ?? 0)\n )\n ) {\n if (process.env.NODE_ENV !== \"production\") {\n logger?.debug(\"Within dupeInterval, aborting revalidate\");\n }\n\n return Promise.resolve();\n }\n\n if (process.env.NODE_ENV !== \"production\") {\n logger?.debug(\"Starting actual revalidate\");\n }\n\n this.store.batch({}, (batch) => {\n // make sure the truth layer knows we are loading\n\n // this will not trigger an update to `changes` so it cannot trigger an\n // update of a list either. This may not be the behavior we want.\n this.setStatus(\"loading\", batch);\n });\n\n this._preFetch();\n\n this.lastFetchStarted = Date.now();\n\n if (process.env.NODE_ENV !== \"production\") {\n logger?.debug(\"calling _fetchAndStore()\");\n }\n this.pendingFetch = this._fetchAndStore()\n .finally(() => {\n logger?.debug(\"finally _fetchAndStore()\");\n this.pendingFetch = undefined;\n });\n\n await this.pendingFetch;\n return;\n }\n\n protected _preFetch(): void {}\n\n protected abstract _fetchAndStore(): Promise<unknown>;\n\n /**\n * Sets the status of the query in the store (but does not store that in `changes`).\n *\n * @param status\n * @param batch\n * @returns\n */\n setStatus(\n status: Status,\n batch: BatchContext,\n ): void {\n if (process.env.NODE_ENV !== \"production\") {\n this.logger?.child({ methodName: \"setStatus\" }).debug(status);\n }\n const existing = batch.read(this.cacheKey);\n if (existing?.status === status) return;\n\n batch.write(this.cacheKey, existing?.value, status);\n }\n\n dispose(): void {\n if (this.abortController) {\n this.abortController.abort();\n }\n this.#subscription?.unsubscribe();\n this._dispose();\n }\n\n /**\n * Per query type dispose functionality\n */\n protected _dispose(): void {}\n\n /**\n * The purpose of this method is to provide a way for others to write\n * directly into the store for this query.\n *\n * @param data\n * @param status\n * @param batch\n */\n abstract writeToStore(\n data: KEY[\"__cacheKey\"][\"value\"],\n status: Status,\n batch: BatchContext,\n ): Entry<KEY>;\n\n /**\n * @param changes\n * @param optimisticId\n * @returns If revalidation is needed, a promise that resolves after the\n * revalidation is complete. Otherwise, undefined.\n */\n maybeUpdateAndRevalidate?: (\n changes: Changes,\n optimisticId: OptimisticId | undefined,\n ) => Promise<void> | undefined;\n}\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"Query.js","names":["additionalContext","Query","retainCount","connectable","subscription","subject","subscriptionDedupeIntervals","Map","constructor","store","observable","opts","cacheKey","logger","options","cacheKeys","process","env","NODE_ENV","client","child","msgPrefix","type","otherKeys","map","x","JSON","stringify","join","subscribe","observer","_createConnectable","connect","registerSubscriptionDedupeInterval","subscriptionId","dedupeInterval","set","unregisterSubscriptionDedupeInterval","delete","getMinimumDedupeInterval","size","Math","min","values","revalidate","force","methodName","abortController","abort","pendingFetch","debug","minDedupeInterval","lastFetchStarted","Date","now","Promise","resolve","batch","setStatus","_preFetch","_fetchAndStore","finally","undefined","status","existing","read","write","value","dispose","unsubscribe","_dispose"],"sources":["Query.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 { Logger } from \"@osdk/api\";\nimport type {\n Connectable,\n Observable,\n Observer,\n Subscribable,\n Subscription,\n} from \"rxjs\";\nimport { additionalContext } from \"../../Client.js\";\nimport type {\n CommonObserveOptions,\n Status,\n} from \"../ObservableClient/common.js\";\nimport type { BatchContext } from \"./BatchContext.js\";\nimport type { CacheKeys } from \"./CacheKeys.js\";\nimport type { Changes } from \"./Changes.js\";\nimport type { KnownCacheKey } from \"./KnownCacheKey.js\";\nimport type { Entry } from \"./Layer.js\";\nimport type { OptimisticId } from \"./OptimisticId.js\";\nimport type { Store } from \"./Store.js\";\nimport type { SubjectPayload } from \"./SubjectPayload.js\";\n\nexport abstract class Query<\n KEY extends KnownCacheKey,\n PAYLOAD,\n O extends CommonObserveOptions,\n> implements Subscribable<PAYLOAD> {\n lastFetchStarted?: number;\n pendingFetch?: Promise<void>;\n retainCount: number = 0;\n options: O;\n cacheKey: KEY;\n store: Store;\n abortController?: AbortController;\n #connectable?: Connectable<PAYLOAD>;\n #subscription?: Subscription;\n #subject: Observable<SubjectPayload<KEY>>;\n #subscriptionDedupeIntervals: Map<string, number> = new Map();\n\n /** @internal */\n protected logger: Logger | undefined;\n\n protected readonly cacheKeys: CacheKeys<KnownCacheKey>;\n\n constructor(\n store: Store,\n observable: Observable<SubjectPayload<KEY>>,\n opts: O,\n cacheKey: KEY,\n logger?: Logger,\n ) {\n this.options = opts;\n this.cacheKey = cacheKey;\n this.store = store;\n this.cacheKeys = store.cacheKeys;\n this.#subject = observable;\n\n this.logger = logger ?? (\n process.env.NODE_ENV === \"production\"\n ? store.client[additionalContext].logger\n : store.client[additionalContext].logger?.child({}, {\n msgPrefix: process.env.NODE_ENV !== \"production\"\n ? (`Query<${cacheKey.type}, ${\n cacheKey.otherKeys.map(x => JSON.stringify(x)).join(\", \")\n }>`)\n : \"Query\",\n })\n );\n }\n\n protected abstract _createConnectable(\n subject: Observable<SubjectPayload<KEY>>,\n ): Connectable<PAYLOAD>;\n\n public subscribe(\n observer: Observer<PAYLOAD>,\n ): Subscription {\n this.#connectable ??= this._createConnectable(this.#subject);\n this.#subscription = this.#connectable.connect();\n return this.#connectable.subscribe(observer);\n }\n\n /**\n * Register a subscription's dedupeInterval value\n */\n registerSubscriptionDedupeInterval(\n subscriptionId: string,\n dedupeInterval: number | undefined,\n ): void {\n if (dedupeInterval != null && dedupeInterval > 0) {\n this.#subscriptionDedupeIntervals.set(subscriptionId, dedupeInterval);\n }\n }\n\n /**\n * Unregister a subscription's dedupeInterval value\n */\n unregisterSubscriptionDedupeInterval(subscriptionId: string): void {\n this.#subscriptionDedupeIntervals.delete(subscriptionId);\n }\n\n /**\n * Get the minimum dedupeInterval from all active subscriptions\n */\n private getMinimumDedupeInterval(): number {\n if (this.#subscriptionDedupeIntervals.size === 0) {\n return this.options.dedupeInterval ?? 0;\n }\n\n return Math.min(...this.#subscriptionDedupeIntervals.values());\n }\n\n /**\n * Causes the query to revalidate. This will cause the query to fetch\n * the latest data from the server and update the store if it is deemed\n * \"stale\" or if `force` is true.\n *\n * @param force\n * @returns\n */\n async revalidate(force?: boolean): Promise<void> {\n const logger = process.env.NODE_ENV !== \"production\"\n ? this.logger?.child({ methodName: \"revalidate\" })\n : this.logger;\n\n if (force) {\n this.abortController?.abort();\n }\n\n // n.b. I think this isn't quite right since we may require multiple\n // pages to properly \"revalidate\" for someone. This only really works if you\n // have a single page/object. It needs to be redone. FIXME\n\n // if we are pending the first page/object we can just ignore this\n if (this.pendingFetch) {\n if (process.env.NODE_ENV !== \"production\") {\n logger?.debug(\"Fetch is already pending, using it\");\n }\n await this.pendingFetch;\n return;\n }\n\n const minDedupeInterval = this.getMinimumDedupeInterval();\n if (\n minDedupeInterval > 0 && (\n this.lastFetchStarted != null\n && Date.now() - this.lastFetchStarted < minDedupeInterval\n )\n ) {\n if (process.env.NODE_ENV !== \"production\") {\n logger?.debug(\"Within dupeInterval, aborting revalidate\");\n }\n\n return Promise.resolve();\n }\n\n if (process.env.NODE_ENV !== \"production\") {\n logger?.debug(\"Starting actual revalidate\");\n }\n\n this.store.batch({}, (batch) => {\n // make sure the truth layer knows we are loading\n\n // this will not trigger an update to `changes` so it cannot trigger an\n // update of a list either. This may not be the behavior we want.\n this.setStatus(\"loading\", batch);\n });\n\n this._preFetch();\n\n this.lastFetchStarted = Date.now();\n\n if (process.env.NODE_ENV !== \"production\") {\n logger?.debug(\"calling _fetchAndStore()\");\n }\n this.pendingFetch = this._fetchAndStore()\n .finally(() => {\n logger?.debug(\"promise's finally for _fetchAndStore()\");\n this.pendingFetch = undefined;\n });\n\n await this.pendingFetch;\n return;\n }\n\n protected _preFetch(): void {}\n\n protected abstract _fetchAndStore(): Promise<void>;\n\n /**\n * Sets the status of the query in the store (but does not store that in `changes`).\n *\n * @param status\n * @param batch\n * @returns\n */\n setStatus(\n status: Status,\n batch: BatchContext,\n ): void {\n if (process.env.NODE_ENV !== \"production\") {\n this.logger?.child({ methodName: \"setStatus\" }).debug(\n `Attempting to set status to '${status}'`,\n );\n }\n const existing = batch.read(this.cacheKey);\n if (existing?.status === status) {\n if (process.env.NODE_ENV !== \"production\") {\n this.logger?.child({ methodName: \"setStatus\" }).debug(\n `Status is already set to '${status}'; aborting`,\n );\n }\n return;\n }\n\n if (process.env.NODE_ENV !== \"production\") {\n this.logger?.child({ methodName: \"setStatus\" }).debug(\n `Writing status '${status}' to cache`,\n );\n }\n batch.write(this.cacheKey, existing?.value, status);\n }\n\n dispose(): void {\n if (this.abortController) {\n this.abortController.abort();\n }\n this.#subscription?.unsubscribe();\n this._dispose();\n }\n\n /**\n * Per query type dispose functionality\n */\n protected _dispose(): void {}\n\n /**\n * The purpose of this method is to provide a way for others to write\n * directly into the store for this query.\n *\n * @param data\n * @param status\n * @param batch\n */\n abstract writeToStore(\n data: KEY[\"__cacheKey\"][\"value\"],\n status: Status,\n batch: BatchContext,\n ): Entry<KEY>;\n\n /**\n * @param changes\n * @param optimisticId\n * @returns If revalidation is needed, a promise that resolves after the\n * revalidation is complete. Otherwise, undefined.\n */\n maybeUpdateAndRevalidate?: (\n changes: Changes,\n optimisticId: OptimisticId | undefined,\n ) => Promise<void> | undefined;\n\n abstract invalidateObjectType(\n objectType: string,\n changes: Changes | undefined,\n ): Promise<void>;\n}\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAUA,SAASA,iBAAiB,QAAQ,iBAAiB;AAcnD,OAAO,MAAeC,KAAK,CAIQ;EAGjCC,WAAW,GAAW,CAAC;EAKvB,CAACC,WAAW;EACZ,CAACC,YAAY;EACb,CAACC,OAAO;EACR,CAACC,2BAA2B,GAAwB,IAAIC,GAAG,CAAC,CAAC;;EAE7D;;EAKAC,WAAWA,CACTC,KAAY,EACZC,UAA2C,EAC3CC,IAAO,EACPC,QAAa,EACbC,MAAe,EACf;IACA,IAAI,CAACC,OAAO,GAAGH,IAAI;IACnB,IAAI,CAACC,QAAQ,GAAGA,QAAQ;IACxB,IAAI,CAACH,KAAK,GAAGA,KAAK;IAClB,IAAI,CAACM,SAAS,GAAGN,KAAK,CAACM,SAAS;IAChC,IAAI,CAAC,CAACV,OAAO,GAAGK,UAAU;IAE1B,IAAI,CAACG,MAAM,GAAGA,MAAM,KAClBG,OAAO,CAACC,GAAG,CAACC,QAAQ,KAAK,YAAY,GACjCT,KAAK,CAACU,MAAM,CAACnB,iBAAiB,CAAC,CAACa,MAAM,GACtCJ,KAAK,CAACU,MAAM,CAACnB,iBAAiB,CAAC,CAACa,MAAM,EAAEO,KAAK,CAAC,CAAC,CAAC,EAAE;MAClDC,SAAS,EAAEL,OAAO,CAACC,GAAG,CAACC,QAAQ,KAAK,YAAY,GAC3C,SAASN,QAAQ,CAACU,IAAI,KACvBV,QAAQ,CAACW,SAAS,CAACC,GAAG,CAACC,CAAC,IAAIC,IAAI,CAACC,SAAS,CAACF,CAAC,CAAC,CAAC,CAACG,IAAI,CAAC,IAAI,CAAC,GACxD,GACD;IACN,CAAC,CAAC,CACL;EACH;EAMOC,SAASA,CACdC,QAA2B,EACb;IACd,IAAI,CAAC,CAAC3B,WAAW,KAAK,IAAI,CAAC4B,kBAAkB,CAAC,IAAI,CAAC,CAAC1B,OAAO,CAAC;IAC5D,IAAI,CAAC,CAACD,YAAY,GAAG,IAAI,CAAC,CAACD,WAAW,CAAC6B,OAAO,CAAC,CAAC;IAChD,OAAO,IAAI,CAAC,CAAC7B,WAAW,CAAC0B,SAAS,CAACC,QAAQ,CAAC;EAC9C;;EAEA;AACF;AACA;EACEG,kCAAkCA,CAChCC,cAAsB,EACtBC,cAAkC,EAC5B;IACN,IAAIA,cAAc,IAAI,IAAI,IAAIA,cAAc,GAAG,CAAC,EAAE;MAChD,IAAI,CAAC,CAAC7B,2BAA2B,CAAC8B,GAAG,CAACF,cAAc,EAAEC,cAAc,CAAC;IACvE;EACF;;EAEA;AACF;AACA;EACEE,oCAAoCA,CAACH,cAAsB,EAAQ;IACjE,IAAI,CAAC,CAAC5B,2BAA2B,CAACgC,MAAM,CAACJ,cAAc,CAAC;EAC1D;;EAEA;AACF;AACA;EACUK,wBAAwBA,CAAA,EAAW;IACzC,IAAI,IAAI,CAAC,CAACjC,2BAA2B,CAACkC,IAAI,KAAK,CAAC,EAAE;MAChD,OAAO,IAAI,CAAC1B,OAAO,CAACqB,cAAc,IAAI,CAAC;IACzC;IAEA,OAAOM,IAAI,CAACC,GAAG,CAAC,GAAG,IAAI,CAAC,CAACpC,2BAA2B,CAACqC,MAAM,CAAC,CAAC,CAAC;EAChE;;EAEA;AACF;AACA;AACA;AACA;AACA;AACA;AACA;EACE,MAAMC,UAAUA,CAACC,KAAe,EAAiB;IAC/C,MAAMhC,MAAM,GAAGG,OAAO,CAACC,GAAG,CAACC,QAAQ,KAAK,YAAY,GAChD,IAAI,CAACL,MAAM,EAAEO,KAAK,CAAC;MAAE0B,UAAU,EAAE;IAAa,CAAC,CAAC,GAChD,IAAI,CAACjC,MAAM;IAEf,IAAIgC,KAAK,EAAE;MACT,IAAI,CAACE,eAAe,EAAEC,KAAK,CAAC,CAAC;IAC/B;;IAEA;IACA;IACA;;IAEA;IACA,IAAI,IAAI,CAACC,YAAY,EAAE;MACrB,IAAIjC,OAAO,CAACC,GAAG,CAACC,QAAQ,KAAK,YAAY,EAAE;QACzCL,MAAM,EAAEqC,KAAK,CAAC,oCAAoC,CAAC;MACrD;MACA,MAAM,IAAI,CAACD,YAAY;MACvB;IACF;IAEA,MAAME,iBAAiB,GAAG,IAAI,CAACZ,wBAAwB,CAAC,CAAC;IACzD,IACEY,iBAAiB,GAAG,CAAC,IACnB,IAAI,CAACC,gBAAgB,IAAI,IAAI,IAC1BC,IAAI,CAACC,GAAG,CAAC,CAAC,GAAG,IAAI,CAACF,gBAAgB,GAAGD,iBACzC,EACD;MACA,IAAInC,OAAO,CAACC,GAAG,CAACC,QAAQ,KAAK,YAAY,EAAE;QACzCL,MAAM,EAAEqC,KAAK,CAAC,0CAA0C,CAAC;MAC3D;MAEA,OAAOK,OAAO,CAACC,OAAO,CAAC,CAAC;IAC1B;IAEA,IAAIxC,OAAO,CAACC,GAAG,CAACC,QAAQ,KAAK,YAAY,EAAE;MACzCL,MAAM,EAAEqC,KAAK,CAAC,4BAA4B,CAAC;IAC7C;IAEA,IAAI,CAACzC,KAAK,CAACgD,KAAK,CAAC,CAAC,CAAC,EAAGA,KAAK,IAAK;MAC9B;;MAEA;MACA;MACA,IAAI,CAACC,SAAS,CAAC,SAAS,EAAED,KAAK,CAAC;IAClC,CAAC,CAAC;IAEF,IAAI,CAACE,SAAS,CAAC,CAAC;IAEhB,IAAI,CAACP,gBAAgB,GAAGC,IAAI,CAACC,GAAG,CAAC,CAAC;IAElC,IAAItC,OAAO,CAACC,GAAG,CAACC,QAAQ,KAAK,YAAY,EAAE;MACzCL,MAAM,EAAEqC,KAAK,CAAC,0BAA0B,CAAC;IAC3C;IACA,IAAI,CAACD,YAAY,GAAG,IAAI,CAACW,cAAc,CAAC,CAAC,CACtCC,OAAO,CAAC,MAAM;MACbhD,MAAM,EAAEqC,KAAK,CAAC,wCAAwC,CAAC;MACvD,IAAI,CAACD,YAAY,GAAGa,SAAS;IAC/B,CAAC,CAAC;IAEJ,MAAM,IAAI,CAACb,YAAY;EAEzB;EAEUU,SAASA,CAAA,EAAS,CAAC;EAI7B;AACF;AACA;AACA;AACA;AACA;AACA;EACED,SAASA,CACPK,MAAc,EACdN,KAAmB,EACb;IACN,IAAIzC,OAAO,CAACC,GAAG,CAACC,QAAQ,KAAK,YAAY,EAAE;MACzC,IAAI,CAACL,MAAM,EAAEO,KAAK,CAAC;QAAE0B,UAAU,EAAE;MAAY,CAAC,CAAC,CAACI,KAAK,CACnD,gCAAgCa,MAAM,GACxC,CAAC;IACH;IACA,MAAMC,QAAQ,GAAGP,KAAK,CAACQ,IAAI,CAAC,IAAI,CAACrD,QAAQ,CAAC;IAC1C,IAAIoD,QAAQ,EAAED,MAAM,KAAKA,MAAM,EAAE;MAC/B,IAAI/C,OAAO,CAACC,GAAG,CAACC,QAAQ,KAAK,YAAY,EAAE;QACzC,IAAI,CAACL,MAAM,EAAEO,KAAK,CAAC;UAAE0B,UAAU,EAAE;QAAY,CAAC,CAAC,CAACI,KAAK,CACnD,6BAA6Ba,MAAM,aACrC,CAAC;MACH;MACA;IACF;IAEA,IAAI/C,OAAO,CAACC,GAAG,CAACC,QAAQ,KAAK,YAAY,EAAE;MACzC,IAAI,CAACL,MAAM,EAAEO,KAAK,CAAC;QAAE0B,UAAU,EAAE;MAAY,CAAC,CAAC,CAACI,KAAK,CACnD,mBAAmBa,MAAM,YAC3B,CAAC;IACH;IACAN,KAAK,CAACS,KAAK,CAAC,IAAI,CAACtD,QAAQ,EAAEoD,QAAQ,EAAEG,KAAK,EAAEJ,MAAM,CAAC;EACrD;EAEAK,OAAOA,CAAA,EAAS;IACd,IAAI,IAAI,CAACrB,eAAe,EAAE;MACxB,IAAI,CAACA,eAAe,CAACC,KAAK,CAAC,CAAC;IAC9B;IACA,IAAI,CAAC,CAAC5C,YAAY,EAAEiE,WAAW,CAAC,CAAC;IACjC,IAAI,CAACC,QAAQ,CAAC,CAAC;EACjB;;EAEA;AACF;AACA;EACYA,QAAQA,CAAA,EAAS,CAAC;;EAE5B;AACF;AACA;AACA;AACA;AACA;AACA;AACA;;EAOE;AACF;AACA;AACA;AACA;AACA;AAUA","ignoreList":[]}
|