@osdk/client 2.2.0-beta.2 → 2.2.0-beta.21
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 +282 -0
- package/build/browser/Client.js.map +1 -1
- package/build/browser/MinimalClientContext.js.map +1 -1
- package/build/browser/__unstable/ConjureSupport.js.map +1 -1
- package/build/browser/actions/ActionValidationError.js +1 -1
- package/build/browser/actions/ActionValidationError.js.map +1 -1
- package/build/browser/actions/actions.test.js +226 -87
- package/build/browser/actions/actions.test.js.map +1 -1
- package/build/browser/actions/applyAction.js +28 -16
- package/build/browser/actions/applyAction.js.map +1 -1
- package/build/browser/createClient.js +19 -8
- package/build/browser/createClient.js.map +1 -1
- package/build/browser/createClient.test.js +14 -6
- package/build/browser/createClient.test.js.map +1 -1
- package/build/browser/createMinimalClient.js +2 -2
- package/build/browser/createMinimalClient.js.map +1 -1
- package/build/browser/createMinimalClientHelper.js +25 -0
- package/build/browser/createMinimalClientHelper.js.map +1 -0
- package/build/browser/derivedProperties/createWithPropertiesObjectSet.js +36 -13
- package/build/browser/derivedProperties/createWithPropertiesObjectSet.js.map +1 -1
- package/build/browser/derivedProperties/createWithPropertiesObjectSet.test.js +133 -0
- package/build/browser/derivedProperties/createWithPropertiesObjectSet.test.js.map +1 -1
- package/build/browser/derivedProperties/derivedPropertyDefinitionFactory.js +94 -0
- package/build/browser/derivedProperties/derivedPropertyDefinitionFactory.js.map +1 -0
- package/build/browser/fetchMetadata.test.js +11 -9
- package/build/browser/fetchMetadata.test.js.map +1 -1
- package/build/browser/index.js +1 -0
- package/build/browser/index.js.map +1 -1
- package/build/browser/intellisense.test.helpers/showsObjectPropertyJsdoc.js +25 -0
- package/build/browser/intellisense.test.helpers/showsObjectPropertyJsdoc.js.map +1 -0
- package/build/browser/intellisense.test.js +17 -1
- package/build/browser/intellisense.test.js.map +1 -1
- package/build/browser/internal/conversions/modernToLegacyGroupByClause.js +7 -0
- package/build/browser/internal/conversions/modernToLegacyGroupByClause.js.map +1 -1
- package/build/browser/internal/conversions/modernToLegacyWhereClause.js +1 -1
- package/build/browser/internal/conversions/modernToLegacyWhereClause.js.map +1 -1
- package/build/browser/logger/BaseLogger.js +59 -0
- package/build/browser/logger/BaseLogger.js.map +1 -0
- package/build/browser/logger/BrowserLogger.js +67 -0
- package/build/browser/logger/BrowserLogger.js.map +1 -0
- package/build/browser/logger/MinimalLogger.js +39 -0
- package/build/browser/logger/MinimalLogger.js.map +1 -0
- package/build/browser/logger/MinimalLogger.test.js +60 -0
- package/build/browser/logger/MinimalLogger.test.js.map +1 -0
- package/build/browser/logger/TestLogger.js +56 -0
- package/build/browser/logger/TestLogger.js.map +1 -0
- package/build/browser/object/AttachmentUpload.js +3 -0
- package/build/browser/object/AttachmentUpload.js.map +1 -1
- package/build/browser/object/SimpleOsdkProperties.js +2 -0
- package/build/browser/object/SimpleOsdkProperties.js.map +1 -0
- package/build/browser/object/aggregate.test.js +12 -2
- package/build/browser/object/aggregate.test.js.map +1 -1
- package/build/browser/object/attachment.test.js +20 -7
- package/build/browser/object/attachment.test.js.map +1 -1
- package/build/browser/object/convertWireToOsdkObjects/BaseHolder.js +2 -0
- package/build/browser/object/convertWireToOsdkObjects/BaseHolder.js.map +1 -0
- package/build/browser/object/convertWireToOsdkObjects/InterfaceHolder.js.map +1 -1
- package/build/browser/object/convertWireToOsdkObjects/ObjectHolder.js.map +1 -1
- package/build/browser/object/convertWireToOsdkObjects/createOsdkInterface.js +29 -0
- package/build/browser/object/convertWireToOsdkObjects/createOsdkInterface.js.map +1 -1
- package/build/browser/object/convertWireToOsdkObjects/createOsdkObject.js +53 -35
- package/build/browser/object/convertWireToOsdkObjects/createOsdkObject.js.map +1 -1
- package/build/browser/object/convertWireToOsdkObjects/getDollarAs.js.map +1 -1
- package/build/browser/object/convertWireToOsdkObjects/getDollarLink.js.map +1 -1
- package/build/browser/object/convertWireToOsdkObjects.js +10 -11
- package/build/browser/object/convertWireToOsdkObjects.js.map +1 -1
- package/build/browser/object/convertWireToOsdkObjects.test.js +46 -36
- package/build/browser/object/convertWireToOsdkObjects.test.js.map +1 -1
- package/build/browser/object/fetchPage.js +17 -4
- package/build/browser/object/fetchPage.js.map +1 -1
- package/build/browser/object/fetchPage.test.js +56 -2
- package/build/browser/object/fetchPage.test.js.map +1 -1
- package/build/browser/object/geotimeseriesreference.test.js +56 -134
- package/build/browser/object/geotimeseriesreference.test.js.map +1 -1
- package/build/browser/object/media.test.js +19 -14
- package/build/browser/object/media.test.js.map +1 -1
- package/build/browser/object/object.test.js +182 -66
- package/build/browser/object/object.test.js.map +1 -1
- package/build/browser/object/timeseries.test.js +119 -85
- package/build/browser/object/timeseries.test.js.map +1 -1
- package/build/browser/objectSet/InterfaceObjectSet.test.js +37 -17
- package/build/browser/objectSet/InterfaceObjectSet.test.js.map +1 -1
- package/build/browser/objectSet/ObjectSet.test.js +212 -114
- package/build/browser/objectSet/ObjectSet.test.js.map +1 -1
- package/build/browser/objectSet/ObjectSetListenerWebsocket.js +20 -16
- package/build/browser/objectSet/ObjectSetListenerWebsocket.js.map +1 -1
- package/build/browser/objectSet/ObjectSetListenerWebsocket.test.js +21 -12
- package/build/browser/objectSet/ObjectSetListenerWebsocket.test.js.map +1 -1
- package/build/browser/objectSet/createObjectSet.js +2 -1
- package/build/browser/objectSet/createObjectSet.js.map +1 -1
- package/build/browser/observable/ListPayload.js.map +1 -1
- package/build/browser/observable/ObjectPayload.js.map +1 -1
- package/build/browser/observable/ObservableClient.js.map +1 -1
- package/build/browser/observable/OptimisticBuilder.js.map +1 -1
- package/build/browser/observable/internal/ActionApplication.js +102 -0
- package/build/browser/observable/internal/ActionApplication.js.map +1 -0
- package/build/browser/observable/internal/BulkObjectLoader.js +93 -0
- package/build/browser/observable/internal/BulkObjectLoader.js.map +1 -0
- package/build/browser/observable/internal/BulkObjectLoader.test.js +112 -0
- package/build/browser/observable/internal/BulkObjectLoader.test.js.map +1 -0
- package/build/browser/observable/internal/CacheKey.js +38 -1
- package/build/browser/observable/internal/CacheKey.js.map +1 -1
- package/build/browser/observable/internal/CacheKeys.js +4 -4
- package/build/browser/observable/internal/CacheKeys.js.map +1 -1
- package/build/browser/observable/internal/Changes.js +58 -0
- package/build/browser/observable/internal/Changes.js.map +1 -0
- package/build/browser/observable/internal/Layer.js +6 -3
- package/build/browser/observable/internal/Layer.js.map +1 -1
- package/build/browser/observable/internal/ListQuery.js +495 -129
- package/build/browser/observable/internal/ListQuery.js.map +1 -1
- package/build/browser/observable/internal/ObjectQuery.js +40 -14
- package/build/browser/observable/internal/ObjectQuery.js.map +1 -1
- package/build/browser/observable/internal/ObservableClientImpl.js +4 -12
- package/build/browser/observable/internal/ObservableClientImpl.js.map +1 -1
- package/build/browser/observable/internal/OptimisticJob.js +30 -29
- package/build/browser/observable/internal/OptimisticJob.js.map +1 -1
- package/build/browser/observable/internal/OrderByCanonicalizer.js +73 -0
- package/build/browser/observable/internal/OrderByCanonicalizer.js.map +1 -0
- package/build/browser/observable/internal/OrderByCanonicalizer.test.js +78 -0
- package/build/browser/observable/internal/OrderByCanonicalizer.test.js.map +1 -0
- package/build/browser/observable/internal/Query.js +79 -6
- package/build/browser/observable/internal/Query.js.map +1 -1
- package/build/browser/observable/internal/RefCounts.js +7 -2
- package/build/browser/observable/internal/RefCounts.js.map +1 -1
- package/build/browser/observable/internal/SimpleWhereClause.js +2 -0
- package/build/browser/observable/internal/SimpleWhereClause.js.map +1 -0
- package/build/browser/observable/internal/Store.js +140 -190
- package/build/browser/observable/internal/Store.js.map +1 -1
- package/build/browser/observable/internal/Store.test.js +666 -300
- package/build/browser/observable/internal/Store.test.js.map +1 -1
- package/build/browser/observable/internal/WhereClauseCanonicalizer.js +11 -3
- package/build/browser/observable/internal/WhereClauseCanonicalizer.js.map +1 -1
- package/build/browser/observable/internal/objectMatchesWhereClause.js +0 -4
- package/build/browser/observable/internal/objectMatchesWhereClause.js.map +1 -1
- package/build/browser/observable/internal/objectMatchesWhereClause.test.js.map +1 -1
- package/build/browser/observable/internal/testUtils.js +222 -19
- package/build/browser/observable/internal/testUtils.js.map +1 -1
- package/build/browser/ontology/StandardOntologyProvider.test.js +17 -16
- package/build/browser/ontology/StandardOntologyProvider.test.js.map +1 -1
- package/build/browser/ontology/loadFullObjectMetadata.js +0 -1
- package/build/browser/ontology/loadFullObjectMetadata.js.map +1 -1
- package/build/browser/public/internal.js +2 -0
- package/build/browser/public/internal.js.map +1 -1
- package/build/browser/public/unstable-do-not-use.js +1 -0
- package/build/browser/public/unstable-do-not-use.js.map +1 -1
- package/build/browser/public-utils/osdkConfig.js +49 -0
- package/build/browser/public-utils/osdkConfig.js.map +1 -0
- package/build/{esm/observable/internal/ChangedObjects.js → browser/public-utils/vite-env.d.ts} +2 -7
- package/build/browser/queries/applyQuery.js +34 -2
- package/build/browser/queries/applyQuery.js.map +1 -1
- package/build/browser/queries/queries.test.js +36 -13
- package/build/browser/queries/queries.test.js.map +1 -1
- package/build/browser/queries/types.js.map +1 -1
- package/build/browser/tsserver.js.map +1 -1
- package/build/browser/util/UserAgent.js +1 -1
- package/build/browser/util/UserAgent.js.map +1 -1
- package/build/browser/util/extractRdpDefinition.js +140 -0
- package/build/browser/util/extractRdpDefinition.js.map +1 -0
- package/build/browser/util/extractRdpDefinition.test.js +233 -0
- package/build/browser/util/extractRdpDefinition.test.js.map +1 -0
- package/build/browser/{observable/internal/ChangedObjects.js → util/isPoint.js} +3 -7
- package/build/browser/util/isPoint.js.map +1 -0
- package/build/browser/util/objectSpecifierUtils.js +48 -0
- package/build/browser/util/objectSpecifierUtils.js.map +1 -0
- package/build/browser/util/objectSpecifierUtils.test.js +42 -0
- package/build/browser/util/objectSpecifierUtils.test.js.map +1 -0
- package/build/browser/util/toDataValue.js +14 -2
- package/build/browser/util/toDataValue.js.map +1 -1
- package/build/browser/util/toDataValue.test.js +37 -16
- package/build/browser/util/toDataValue.test.js.map +1 -1
- package/build/browser/util/toDataValueQueries.js +25 -2
- package/build/browser/util/toDataValueQueries.js.map +1 -1
- package/build/cjs/{Client-C8K3E1vH.d.cts → Client-CgL2LKN9.d.cts} +7 -8
- package/build/cjs/{chunk-T5UE6BI7.cjs → chunk-33GHS3X4.cjs} +256 -80
- package/build/cjs/chunk-33GHS3X4.cjs.map +1 -0
- package/build/cjs/{chunk-X7WGNFZ4.cjs → chunk-37QC7LR3.cjs} +173 -34
- package/build/cjs/chunk-37QC7LR3.cjs.map +1 -0
- package/build/cjs/chunk-T4NIFYZS.cjs +14 -0
- package/build/cjs/chunk-T4NIFYZS.cjs.map +1 -0
- package/build/cjs/index.cjs +298 -177
- package/build/cjs/index.cjs.map +1 -1
- package/build/cjs/index.d.cts +14 -22
- package/build/cjs/public/internal.cjs +61 -7
- package/build/cjs/public/internal.cjs.map +1 -1
- package/build/cjs/public/internal.d.cts +50 -3
- package/build/cjs/public/unstable-do-not-use.cjs +1181 -527
- package/build/cjs/public/unstable-do-not-use.cjs.map +1 -1
- package/build/cjs/public/unstable-do-not-use.d.cts +44 -25
- package/build/esm/Client.js.map +1 -1
- package/build/esm/MinimalClientContext.js.map +1 -1
- package/build/esm/__unstable/ConjureSupport.js.map +1 -1
- package/build/esm/actions/ActionValidationError.js +1 -1
- package/build/esm/actions/ActionValidationError.js.map +1 -1
- package/build/esm/actions/actions.test.js +226 -87
- package/build/esm/actions/actions.test.js.map +1 -1
- package/build/esm/actions/applyAction.js +28 -16
- package/build/esm/actions/applyAction.js.map +1 -1
- package/build/esm/createClient.js +19 -8
- package/build/esm/createClient.js.map +1 -1
- package/build/esm/createClient.test.js +14 -6
- package/build/esm/createClient.test.js.map +1 -1
- package/build/esm/createMinimalClient.js +2 -2
- package/build/esm/createMinimalClient.js.map +1 -1
- package/build/esm/createMinimalClientHelper.js +25 -0
- package/build/esm/createMinimalClientHelper.js.map +1 -0
- package/build/esm/derivedProperties/createWithPropertiesObjectSet.js +36 -13
- package/build/esm/derivedProperties/createWithPropertiesObjectSet.js.map +1 -1
- package/build/esm/derivedProperties/createWithPropertiesObjectSet.test.js +133 -0
- package/build/esm/derivedProperties/createWithPropertiesObjectSet.test.js.map +1 -1
- package/build/esm/derivedProperties/derivedPropertyDefinitionFactory.js +94 -0
- package/build/esm/derivedProperties/derivedPropertyDefinitionFactory.js.map +1 -0
- package/build/esm/fetchMetadata.test.js +11 -9
- package/build/esm/fetchMetadata.test.js.map +1 -1
- package/build/esm/index.js +1 -0
- package/build/esm/index.js.map +1 -1
- package/build/esm/intellisense.test.helpers/showsObjectPropertyJsdoc.js +25 -0
- package/build/esm/intellisense.test.helpers/showsObjectPropertyJsdoc.js.map +1 -0
- package/build/esm/intellisense.test.js +17 -1
- package/build/esm/intellisense.test.js.map +1 -1
- package/build/esm/internal/conversions/modernToLegacyGroupByClause.js +7 -0
- package/build/esm/internal/conversions/modernToLegacyGroupByClause.js.map +1 -1
- package/build/esm/internal/conversions/modernToLegacyWhereClause.js +1 -1
- package/build/esm/internal/conversions/modernToLegacyWhereClause.js.map +1 -1
- package/build/esm/logger/BaseLogger.js +59 -0
- package/build/esm/logger/BaseLogger.js.map +1 -0
- package/build/esm/logger/BrowserLogger.js +67 -0
- package/build/esm/logger/BrowserLogger.js.map +1 -0
- package/build/esm/logger/MinimalLogger.js +39 -0
- package/build/esm/logger/MinimalLogger.js.map +1 -0
- package/build/esm/logger/MinimalLogger.test.js +60 -0
- package/build/esm/logger/MinimalLogger.test.js.map +1 -0
- package/build/esm/logger/TestLogger.js +56 -0
- package/build/esm/logger/TestLogger.js.map +1 -0
- package/build/esm/object/AttachmentUpload.js +3 -0
- package/build/esm/object/AttachmentUpload.js.map +1 -1
- package/build/esm/object/SimpleOsdkProperties.js +2 -0
- package/build/esm/object/SimpleOsdkProperties.js.map +1 -0
- package/build/esm/object/aggregate.test.js +12 -2
- package/build/esm/object/aggregate.test.js.map +1 -1
- package/build/esm/object/attachment.test.js +20 -7
- package/build/esm/object/attachment.test.js.map +1 -1
- package/build/esm/object/convertWireToOsdkObjects/BaseHolder.js +2 -0
- package/build/esm/object/convertWireToOsdkObjects/BaseHolder.js.map +1 -0
- package/build/esm/object/convertWireToOsdkObjects/InterfaceHolder.js.map +1 -1
- package/build/esm/object/convertWireToOsdkObjects/ObjectHolder.js.map +1 -1
- package/build/esm/object/convertWireToOsdkObjects/createOsdkInterface.js +29 -0
- package/build/esm/object/convertWireToOsdkObjects/createOsdkInterface.js.map +1 -1
- package/build/esm/object/convertWireToOsdkObjects/createOsdkObject.js +53 -35
- package/build/esm/object/convertWireToOsdkObjects/createOsdkObject.js.map +1 -1
- package/build/esm/object/convertWireToOsdkObjects/getDollarAs.js.map +1 -1
- package/build/esm/object/convertWireToOsdkObjects/getDollarLink.js.map +1 -1
- package/build/esm/object/convertWireToOsdkObjects.js +10 -11
- package/build/esm/object/convertWireToOsdkObjects.js.map +1 -1
- package/build/esm/object/convertWireToOsdkObjects.test.js +46 -36
- package/build/esm/object/convertWireToOsdkObjects.test.js.map +1 -1
- package/build/esm/object/fetchPage.js +17 -4
- package/build/esm/object/fetchPage.js.map +1 -1
- package/build/esm/object/fetchPage.test.js +56 -2
- package/build/esm/object/fetchPage.test.js.map +1 -1
- package/build/esm/object/geotimeseriesreference.test.js +56 -134
- package/build/esm/object/geotimeseriesreference.test.js.map +1 -1
- package/build/esm/object/media.test.js +19 -14
- package/build/esm/object/media.test.js.map +1 -1
- package/build/esm/object/object.test.js +182 -66
- package/build/esm/object/object.test.js.map +1 -1
- package/build/esm/object/timeseries.test.js +119 -85
- package/build/esm/object/timeseries.test.js.map +1 -1
- package/build/esm/objectSet/InterfaceObjectSet.test.js +37 -17
- package/build/esm/objectSet/InterfaceObjectSet.test.js.map +1 -1
- package/build/esm/objectSet/ObjectSet.test.js +212 -114
- package/build/esm/objectSet/ObjectSet.test.js.map +1 -1
- package/build/esm/objectSet/ObjectSetListenerWebsocket.js +20 -16
- package/build/esm/objectSet/ObjectSetListenerWebsocket.js.map +1 -1
- package/build/esm/objectSet/ObjectSetListenerWebsocket.test.js +21 -12
- package/build/esm/objectSet/ObjectSetListenerWebsocket.test.js.map +1 -1
- package/build/esm/objectSet/createObjectSet.js +2 -1
- package/build/esm/objectSet/createObjectSet.js.map +1 -1
- package/build/esm/observable/ListPayload.js.map +1 -1
- package/build/esm/observable/ObjectPayload.js.map +1 -1
- package/build/esm/observable/ObservableClient.js.map +1 -1
- package/build/esm/observable/OptimisticBuilder.js.map +1 -1
- package/build/esm/observable/internal/ActionApplication.js +102 -0
- package/build/esm/observable/internal/ActionApplication.js.map +1 -0
- package/build/esm/observable/internal/BulkObjectLoader.js +93 -0
- package/build/esm/observable/internal/BulkObjectLoader.js.map +1 -0
- package/build/esm/observable/internal/BulkObjectLoader.test.js +112 -0
- package/build/esm/observable/internal/BulkObjectLoader.test.js.map +1 -0
- package/build/esm/observable/internal/CacheKey.js +38 -1
- package/build/esm/observable/internal/CacheKey.js.map +1 -1
- package/build/esm/observable/internal/CacheKeys.js +4 -4
- package/build/esm/observable/internal/CacheKeys.js.map +1 -1
- package/build/esm/observable/internal/Changes.js +58 -0
- package/build/esm/observable/internal/Changes.js.map +1 -0
- package/build/esm/observable/internal/Layer.js +6 -3
- package/build/esm/observable/internal/Layer.js.map +1 -1
- package/build/esm/observable/internal/ListQuery.js +495 -129
- package/build/esm/observable/internal/ListQuery.js.map +1 -1
- package/build/esm/observable/internal/ObjectQuery.js +40 -14
- package/build/esm/observable/internal/ObjectQuery.js.map +1 -1
- package/build/esm/observable/internal/ObservableClientImpl.js +4 -12
- package/build/esm/observable/internal/ObservableClientImpl.js.map +1 -1
- package/build/esm/observable/internal/OptimisticJob.js +30 -29
- package/build/esm/observable/internal/OptimisticJob.js.map +1 -1
- package/build/esm/observable/internal/OrderByCanonicalizer.js +73 -0
- package/build/esm/observable/internal/OrderByCanonicalizer.js.map +1 -0
- package/build/esm/observable/internal/OrderByCanonicalizer.test.js +78 -0
- package/build/esm/observable/internal/OrderByCanonicalizer.test.js.map +1 -0
- package/build/esm/observable/internal/Query.js +79 -6
- package/build/esm/observable/internal/Query.js.map +1 -1
- package/build/esm/observable/internal/RefCounts.js +7 -2
- package/build/esm/observable/internal/RefCounts.js.map +1 -1
- package/build/esm/observable/internal/SimpleWhereClause.js +2 -0
- package/build/esm/observable/internal/SimpleWhereClause.js.map +1 -0
- package/build/esm/observable/internal/Store.js +140 -190
- package/build/esm/observable/internal/Store.js.map +1 -1
- package/build/esm/observable/internal/Store.test.js +666 -300
- package/build/esm/observable/internal/Store.test.js.map +1 -1
- package/build/esm/observable/internal/WhereClauseCanonicalizer.js +11 -3
- package/build/esm/observable/internal/WhereClauseCanonicalizer.js.map +1 -1
- package/build/esm/observable/internal/objectMatchesWhereClause.js +0 -4
- package/build/esm/observable/internal/objectMatchesWhereClause.js.map +1 -1
- package/build/esm/observable/internal/objectMatchesWhereClause.test.js.map +1 -1
- package/build/esm/observable/internal/testUtils.js +222 -19
- package/build/esm/observable/internal/testUtils.js.map +1 -1
- package/build/esm/ontology/StandardOntologyProvider.test.js +17 -16
- package/build/esm/ontology/StandardOntologyProvider.test.js.map +1 -1
- package/build/esm/ontology/loadFullObjectMetadata.js +0 -1
- package/build/esm/ontology/loadFullObjectMetadata.js.map +1 -1
- package/build/esm/public/internal.js +2 -0
- package/build/esm/public/internal.js.map +1 -1
- package/build/esm/public/unstable-do-not-use.js +1 -0
- package/build/esm/public/unstable-do-not-use.js.map +1 -1
- package/build/esm/public-utils/osdkConfig.js +49 -0
- package/build/esm/public-utils/osdkConfig.js.map +1 -0
- package/build/esm/public-utils/vite-env.d.ts +19 -0
- package/build/esm/queries/applyQuery.js +34 -2
- package/build/esm/queries/applyQuery.js.map +1 -1
- package/build/esm/queries/queries.test.js +36 -13
- package/build/esm/queries/queries.test.js.map +1 -1
- package/build/esm/queries/types.js.map +1 -1
- package/build/esm/tsserver.js.map +1 -1
- package/build/esm/util/UserAgent.js +1 -1
- package/build/esm/util/UserAgent.js.map +1 -1
- package/build/esm/util/extractRdpDefinition.js +140 -0
- package/build/esm/util/extractRdpDefinition.js.map +1 -0
- package/build/esm/util/extractRdpDefinition.test.js +233 -0
- package/build/esm/util/extractRdpDefinition.test.js.map +1 -0
- package/build/esm/util/isPoint.js +20 -0
- package/build/esm/util/isPoint.js.map +1 -0
- package/build/esm/util/objectSpecifierUtils.js +48 -0
- package/build/esm/util/objectSpecifierUtils.js.map +1 -0
- package/build/esm/util/objectSpecifierUtils.test.js +42 -0
- package/build/esm/util/objectSpecifierUtils.test.js.map +1 -0
- package/build/esm/util/toDataValue.js +14 -2
- package/build/esm/util/toDataValue.js.map +1 -1
- package/build/esm/util/toDataValue.test.js +37 -16
- package/build/esm/util/toDataValue.test.js.map +1 -1
- package/build/esm/util/toDataValueQueries.js +25 -2
- package/build/esm/util/toDataValueQueries.js.map +1 -1
- package/build/types/Client.d.ts +1 -1
- package/build/types/Client.d.ts.map +1 -1
- package/build/types/MinimalClientContext.d.ts +1 -1
- package/build/types/MinimalClientContext.d.ts.map +1 -1
- package/build/types/__unstable/ConjureSupport.d.ts +2 -2
- package/build/types/actions/applyAction.d.ts +1 -2
- package/build/types/actions/applyAction.d.ts.map +1 -1
- package/build/types/createClient.d.ts +1 -1
- package/build/types/createClient.d.ts.map +1 -1
- package/build/types/createClient.test.d.ts +2 -1
- package/build/types/createClient.test.d.ts.map +1 -1
- package/build/types/createMinimalClientHelper.d.ts +1 -0
- package/build/types/createMinimalClientHelper.d.ts.map +1 -0
- package/build/types/derivedProperties/derivedPropertyDefinitionFactory.d.ts +1 -0
- package/build/types/derivedProperties/derivedPropertyDefinitionFactory.d.ts.map +1 -0
- package/build/types/index.d.ts +5 -5
- package/build/types/index.d.ts.map +1 -1
- package/build/types/intellisense.test.helpers/showsObjectPropertyJsdoc.d.ts +1 -0
- package/build/types/intellisense.test.helpers/showsObjectPropertyJsdoc.d.ts.map +1 -0
- package/build/types/logger/BaseLogger.d.ts +33 -0
- package/build/types/logger/BaseLogger.d.ts.map +1 -0
- package/build/types/logger/BrowserLogger.d.ts +9 -0
- package/build/types/logger/BrowserLogger.d.ts.map +1 -0
- package/build/types/logger/MinimalLogger.d.ts +9 -0
- package/build/types/logger/MinimalLogger.d.ts.map +1 -0
- package/build/types/logger/MinimalLogger.test.d.ts +1 -0
- package/build/types/logger/MinimalLogger.test.d.ts.map +1 -0
- package/build/types/logger/TestLogger.d.ts +14 -0
- package/build/types/logger/TestLogger.d.ts.map +1 -0
- package/build/types/object/AttachmentUpload.d.ts +3 -0
- package/build/types/object/AttachmentUpload.d.ts.map +1 -1
- package/build/types/object/SimpleOsdkProperties.d.ts +1 -0
- package/build/types/object/SimpleOsdkProperties.d.ts.map +1 -0
- package/build/types/object/convertWireToOsdkObjects/BaseHolder.d.ts +1 -0
- package/build/types/object/convertWireToOsdkObjects/BaseHolder.d.ts.map +1 -0
- package/build/types/object/convertWireToOsdkObjects.d.ts +8 -1
- package/build/types/object/convertWireToOsdkObjects.d.ts.map +1 -1
- package/build/types/object/fetchPage.d.ts.map +1 -1
- package/build/types/object/object.test.d.ts.map +1 -1
- package/build/types/objectSet/ObjectSet.test.d.ts.map +1 -1
- package/build/types/observable/ListPayload.d.ts +5 -9
- package/build/types/observable/ListPayload.d.ts.map +1 -1
- package/build/types/observable/ObjectPayload.d.ts +4 -7
- package/build/types/observable/ObjectPayload.d.ts.map +1 -1
- package/build/types/observable/ObservableClient.d.ts +33 -10
- package/build/types/observable/ObservableClient.d.ts.map +1 -1
- package/build/types/observable/OptimisticBuilder.d.ts +1 -1
- package/build/types/observable/OptimisticBuilder.d.ts.map +1 -1
- package/build/types/observable/internal/ActionApplication.d.ts +9 -0
- package/build/types/observable/internal/ActionApplication.d.ts.map +1 -0
- package/build/types/observable/internal/BulkObjectLoader.d.ts +8 -0
- package/build/types/observable/internal/BulkObjectLoader.d.ts.map +1 -0
- package/build/types/observable/internal/BulkObjectLoader.test.d.ts +1 -0
- package/build/types/observable/internal/BulkObjectLoader.test.d.ts.map +1 -0
- package/build/types/observable/internal/CacheKeys.d.ts +2 -1
- package/build/types/observable/internal/CacheKeys.d.ts.map +1 -1
- package/build/types/observable/internal/Changes.d.ts +15 -0
- package/build/types/observable/internal/Changes.d.ts.map +1 -0
- package/build/types/observable/internal/Layer.d.ts +2 -1
- package/build/types/observable/internal/Layer.d.ts.map +1 -1
- package/build/types/observable/internal/ListQuery.d.ts +69 -23
- package/build/types/observable/internal/ListQuery.d.ts.map +1 -1
- package/build/types/observable/internal/ObjectQuery.d.ts +8 -9
- package/build/types/observable/internal/ObjectQuery.d.ts.map +1 -1
- package/build/types/observable/internal/OptimisticJob.d.ts +2 -2
- package/build/types/observable/internal/OptimisticJob.d.ts.map +1 -1
- package/build/types/observable/internal/OrderByCanonicalizer.d.ts +12 -0
- package/build/types/observable/internal/OrderByCanonicalizer.d.ts.map +1 -0
- package/build/types/observable/internal/OrderByCanonicalizer.test.d.ts +1 -0
- package/build/types/observable/internal/OrderByCanonicalizer.test.d.ts.map +1 -0
- package/build/types/observable/internal/Query.d.ts +45 -9
- package/build/types/observable/internal/Query.d.ts.map +1 -1
- package/build/types/observable/internal/RefCounts.d.ts.map +1 -1
- package/build/types/observable/internal/SimpleWhereClause.d.ts +2 -0
- package/build/types/observable/internal/SimpleWhereClause.d.ts.map +1 -0
- package/build/types/observable/internal/Store.d.ts +34 -30
- package/build/types/observable/internal/Store.d.ts.map +1 -1
- package/build/types/observable/internal/WhereClauseCanonicalizer.d.ts +2 -1
- package/build/types/observable/internal/WhereClauseCanonicalizer.d.ts.map +1 -1
- package/build/types/observable/internal/objectMatchesWhereClause.d.ts +4 -2
- package/build/types/observable/internal/objectMatchesWhereClause.d.ts.map +1 -1
- package/build/types/observable/internal/testUtils.d.ts +48 -9
- package/build/types/observable/internal/testUtils.d.ts.map +1 -1
- package/build/types/public/internal.d.ts +2 -0
- package/build/types/public/internal.d.ts.map +1 -1
- package/build/types/public/unstable-do-not-use.d.ts +4 -5
- package/build/types/public/unstable-do-not-use.d.ts.map +1 -1
- package/build/types/public-utils/osdkConfig.d.ts +8 -0
- package/build/types/public-utils/osdkConfig.d.ts.map +1 -0
- package/build/types/public-utils/vite-env.d.d.ts +3 -0
- package/build/types/public-utils/vite-env.d.d.ts.map +1 -0
- package/build/types/queries/applyQuery.d.ts +4 -2
- package/build/types/queries/applyQuery.d.ts.map +1 -1
- package/build/types/queries/types.d.ts +1 -1
- package/build/types/queries/types.d.ts.map +1 -1
- package/build/types/tsserver.d.ts +1 -1
- package/build/types/tsserver.d.ts.map +1 -1
- package/build/types/util/extractRdpDefinition.d.ts +4 -0
- package/build/types/util/extractRdpDefinition.d.ts.map +1 -0
- package/build/types/util/extractRdpDefinition.test.d.ts +1 -0
- package/build/types/util/extractRdpDefinition.test.d.ts.map +1 -0
- package/build/types/util/isPoint.d.ts +1 -0
- package/build/types/util/isPoint.d.ts.map +1 -0
- package/build/types/util/objectSpecifierUtils.d.ts +24 -0
- package/build/types/util/objectSpecifierUtils.d.ts.map +1 -0
- package/build/types/util/objectSpecifierUtils.test.d.ts +1 -0
- package/build/types/util/objectSpecifierUtils.test.d.ts.map +1 -0
- package/package.json +20 -16
- package/build/browser/Logger.js +0 -2
- package/build/browser/Logger.js.map +0 -1
- package/build/browser/observable/internal/ChangedObjects.js.map +0 -1
- package/build/cjs/chunk-Q7SFCCGT.cjs +0 -11
- package/build/cjs/chunk-Q7SFCCGT.cjs.map +0 -1
- package/build/cjs/chunk-T5UE6BI7.cjs.map +0 -1
- package/build/cjs/chunk-X7WGNFZ4.cjs.map +0 -1
- package/build/cjs/graphql-JJX5MZPQ.cjs +0 -10491
- package/build/cjs/graphql-JJX5MZPQ.cjs.map +0 -1
- package/build/esm/Logger.js +0 -2
- package/build/esm/Logger.js.map +0 -1
- package/build/esm/observable/internal/ChangedObjects.js.map +0 -1
- package/build/types/Logger.d.ts +0 -18
- package/build/types/Logger.d.ts.map +0 -1
- package/build/types/observable/internal/ChangedObjects.d.ts +0 -7
- package/build/types/observable/internal/ChangedObjects.d.ts.map +0 -1
|
@@ -14,19 +14,19 @@
|
|
|
14
14
|
* limitations under the License.
|
|
15
15
|
*/
|
|
16
16
|
|
|
17
|
-
import { delay } from "msw";
|
|
18
17
|
import { BehaviorSubject } from "rxjs";
|
|
19
18
|
import invariant from "tiny-invariant";
|
|
19
|
+
import { additionalContext } from "../../Client.js";
|
|
20
20
|
import { DEBUG_REFCOUNTS } from "../DebugFlags.js";
|
|
21
|
+
import { ActionApplication } from "./ActionApplication.js";
|
|
21
22
|
import { CacheKeys } from "./CacheKeys.js";
|
|
22
|
-
import { createChangedObjects } from "./
|
|
23
|
-
import { Layer } from "./Layer.js";
|
|
23
|
+
import { createChangedObjects, DEBUG_ONLY__changesToString } from "./Changes.js";
|
|
24
|
+
import { Entry, Layer } from "./Layer.js";
|
|
24
25
|
import { isListCacheKey, ListQuery } from "./ListQuery.js";
|
|
25
26
|
import { ObjectQuery } from "./ObjectQuery.js";
|
|
26
|
-
import {
|
|
27
|
+
import { OrderByCanonicalizer } from "./OrderByCanonicalizer.js";
|
|
27
28
|
import { RefCounts } from "./RefCounts.js";
|
|
28
29
|
import { WhereClauseCanonicalizer } from "./WhereClauseCanonicalizer.js";
|
|
29
|
-
const ACTION_DELAY = process.env.NODE_ENV === "production" ? 0 : 1000;
|
|
30
30
|
|
|
31
31
|
/*
|
|
32
32
|
Work still to do:
|
|
@@ -35,9 +35,9 @@ const ACTION_DELAY = process.env.NODE_ENV === "production" ? 0 : 1000;
|
|
|
35
35
|
- [x] automatic optimistic list updates
|
|
36
36
|
- [x] useOsdkObjects
|
|
37
37
|
- [x] imply offline for objects passed directly
|
|
38
|
-
- [
|
|
38
|
+
- [x] websocket subscriptions
|
|
39
39
|
- [ ] links
|
|
40
|
-
- [
|
|
40
|
+
- [x] add pagination
|
|
41
41
|
- [ ] sub-selection support
|
|
42
42
|
- [ ] interfaces
|
|
43
43
|
- [ ] setup defaults
|
|
@@ -61,17 +61,29 @@ function createInitEntry(cacheKey) {
|
|
|
61
61
|
|
|
62
62
|
export class Store {
|
|
63
63
|
whereCanonicalizer = new WhereClauseCanonicalizer();
|
|
64
|
+
orderByCanonicalizer = new OrderByCanonicalizer();
|
|
64
65
|
#truthLayer = new Layer(undefined, undefined);
|
|
65
66
|
#topLayer;
|
|
66
|
-
|
|
67
|
+
|
|
68
|
+
/** @internal */
|
|
69
|
+
|
|
70
|
+
// we can use a regular Map here because the refCounting will
|
|
71
|
+
// handle cleanup.
|
|
72
|
+
#queries = new Map();
|
|
67
73
|
#cacheKeyToSubject = new WeakMap();
|
|
68
74
|
#cacheKeys;
|
|
69
75
|
#refCounts = new RefCounts(DEBUG_REFCOUNTS ? 15_000 : 60_000, k => this.#cleanupCacheKey(k));
|
|
76
|
+
|
|
77
|
+
// we are currently only using this for debug logging and should just remove it in the future if that
|
|
78
|
+
// continues to be true
|
|
70
79
|
#finalizationRegistry;
|
|
71
80
|
constructor(client) {
|
|
72
81
|
this.client = client;
|
|
82
|
+
this.logger = client[additionalContext].logger?.child({}, {
|
|
83
|
+
msgPrefix: "Store"
|
|
84
|
+
});
|
|
73
85
|
this.#topLayer = this.#truthLayer;
|
|
74
|
-
this.#cacheKeys = new CacheKeys(this.whereCanonicalizer, k => {
|
|
86
|
+
this.#cacheKeys = new CacheKeys(this.whereCanonicalizer, this.orderByCanonicalizer, k => {
|
|
75
87
|
if (DEBUG_REFCOUNTS) {
|
|
76
88
|
const cacheKeyType = k.type;
|
|
77
89
|
const otherKeys = k.otherKeys;
|
|
@@ -121,8 +133,8 @@ export class Store {
|
|
|
121
133
|
this.#queries.get(key)?.dispose();
|
|
122
134
|
this.#queries.delete(key);
|
|
123
135
|
};
|
|
124
|
-
applyAction = (action, args, opts) => {
|
|
125
|
-
return new ActionApplication(this).applyAction(action, args, opts);
|
|
136
|
+
applyAction = async (action, args, opts) => {
|
|
137
|
+
return await new ActionApplication(this).applyAction(action, args, opts);
|
|
126
138
|
};
|
|
127
139
|
removeLayer(layerId) {
|
|
128
140
|
!(layerId != null) ? process.env.NODE_ENV !== "production" ? invariant(false, "undefined is the reserved layerId for the truth layer") : invariant(false) : void 0;
|
|
@@ -178,63 +190,77 @@ export class Store {
|
|
|
178
190
|
}
|
|
179
191
|
return subject;
|
|
180
192
|
};
|
|
193
|
+
canonicalizeWhereClause(where) {
|
|
194
|
+
return this.whereCanonicalizer.canonicalize(where);
|
|
195
|
+
}
|
|
181
196
|
observeObject(apiName, pk, options, subFn) {
|
|
182
197
|
if (typeof apiName !== "string") {
|
|
183
198
|
apiName = apiName.apiName;
|
|
184
199
|
}
|
|
185
200
|
const query = this.getObjectQuery(apiName, pk);
|
|
186
|
-
this
|
|
201
|
+
this.retain(query.cacheKey);
|
|
187
202
|
if (options.mode !== "offline") {
|
|
188
|
-
|
|
203
|
+
query.revalidate(options.mode === "force").catch(e => {
|
|
204
|
+
subFn.error(e);
|
|
205
|
+
// we don't want observeObject() to return a promise,
|
|
206
|
+
// so we settle for logging an error here instead of
|
|
207
|
+
// dropping it on the floor.
|
|
208
|
+
if (this.logger) {
|
|
209
|
+
this.logger.error("Unhandled error in observeObject", e);
|
|
210
|
+
} else {
|
|
211
|
+
throw e;
|
|
212
|
+
}
|
|
213
|
+
});
|
|
189
214
|
}
|
|
190
|
-
const sub = query.subscribe(
|
|
191
|
-
next: subFn
|
|
192
|
-
});
|
|
215
|
+
const sub = query.subscribe(subFn);
|
|
193
216
|
return {
|
|
194
217
|
unsubscribe: () => {
|
|
195
218
|
sub.unsubscribe();
|
|
196
|
-
this
|
|
219
|
+
this.release(query.cacheKey);
|
|
197
220
|
}
|
|
198
221
|
};
|
|
199
222
|
}
|
|
200
|
-
observeList(
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
const query = this.getListQuery(apiName, where, options);
|
|
205
|
-
this.#refCounts.retain(query.cacheKey);
|
|
223
|
+
observeList(options, subFn) {
|
|
224
|
+
// the ListQuery represents the shared state of the list
|
|
225
|
+
const query = this.getListQuery(options.type, options.where ?? {}, options.orderBy ?? {}, options);
|
|
226
|
+
this.retain(query.cacheKey);
|
|
206
227
|
if (options.mode !== "offline") {
|
|
207
|
-
|
|
228
|
+
query.revalidate(options.mode === "force").catch(x => {
|
|
229
|
+
subFn.error(x);
|
|
230
|
+
});
|
|
231
|
+
}
|
|
232
|
+
const sub = query.subscribe(subFn);
|
|
233
|
+
if (options.streamUpdates) {
|
|
234
|
+
query.registerStreamUpdates(sub);
|
|
208
235
|
}
|
|
209
|
-
const sub = query.subscribe({
|
|
210
|
-
next: subFn
|
|
211
|
-
});
|
|
212
236
|
return {
|
|
213
237
|
unsubscribe: () => {
|
|
214
238
|
sub.unsubscribe();
|
|
215
|
-
this
|
|
239
|
+
this.release(query.cacheKey);
|
|
216
240
|
}
|
|
217
241
|
};
|
|
218
242
|
}
|
|
219
|
-
|
|
243
|
+
peekQuery(cacheKey) {
|
|
220
244
|
return this.#queries.get(cacheKey);
|
|
221
245
|
}
|
|
222
246
|
#getQuery(cacheKey, createQuery) {
|
|
223
|
-
let query = this
|
|
247
|
+
let query = this.peekQuery(cacheKey);
|
|
224
248
|
if (!query) {
|
|
225
249
|
query = createQuery();
|
|
226
250
|
this.#queries.set(cacheKey, query);
|
|
227
251
|
}
|
|
228
252
|
return query;
|
|
229
253
|
}
|
|
230
|
-
getListQuery(
|
|
231
|
-
|
|
232
|
-
apiName
|
|
233
|
-
|
|
254
|
+
getListQuery(def, where, orderBy, opts) {
|
|
255
|
+
const {
|
|
256
|
+
apiName,
|
|
257
|
+
type
|
|
258
|
+
} = def;
|
|
234
259
|
const canonWhere = this.whereCanonicalizer.canonicalize(where);
|
|
235
|
-
const
|
|
260
|
+
const canonOrderBy = this.orderByCanonicalizer.canonicalize(orderBy);
|
|
261
|
+
const listCacheKey = this.getCacheKey("list", type, apiName, canonWhere, canonOrderBy);
|
|
236
262
|
return this.#getQuery(listCacheKey, () => {
|
|
237
|
-
return new ListQuery(this, this.getSubject(listCacheKey), apiName, canonWhere, listCacheKey, opts);
|
|
263
|
+
return new ListQuery(this, this.getSubject(listCacheKey), type, apiName, canonWhere, canonOrderBy, listCacheKey, opts);
|
|
238
264
|
});
|
|
239
265
|
}
|
|
240
266
|
getObjectQuery(apiName, pk) {
|
|
@@ -246,23 +272,17 @@ export class Store {
|
|
|
246
272
|
dedupeInterval: 0
|
|
247
273
|
}));
|
|
248
274
|
}
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
apiName = apiName.apiName;
|
|
252
|
-
}
|
|
253
|
-
const objectCacheKey = this.getCacheKey("object", apiName, pk);
|
|
254
|
-
const objEntry = this.#topLayer.get(objectCacheKey);
|
|
255
|
-
return objEntry?.value;
|
|
275
|
+
getValue(cacheKey) {
|
|
276
|
+
return this.#topLayer.get(cacheKey);
|
|
256
277
|
}
|
|
257
278
|
batch = ({
|
|
258
|
-
optimisticId
|
|
279
|
+
optimisticId,
|
|
280
|
+
changes = createChangedObjects()
|
|
259
281
|
}, batchFn) => {
|
|
260
282
|
!(optimisticId === undefined || !!optimisticId) ? process.env.NODE_ENV !== "production" ? invariant(false, "optimistic must be undefined or not falsy") : invariant(false) : void 0;
|
|
261
283
|
let needsLayer = optimisticId !== undefined;
|
|
262
284
|
const batchContext = {
|
|
263
|
-
|
|
264
|
-
modifiedObjects: new Set(),
|
|
265
|
-
modifiedLists: new Set(),
|
|
285
|
+
changes,
|
|
266
286
|
createLayerIfNeeded: () => {
|
|
267
287
|
if (needsLayer) {
|
|
268
288
|
this.#topLayer = this.#topLayer.addLayer(optimisticId);
|
|
@@ -274,16 +294,12 @@ export class Store {
|
|
|
274
294
|
const oldTopValue = this.#topLayer.get(cacheKey);
|
|
275
295
|
if (optimisticId) batchContext.createLayerIfNeeded();
|
|
276
296
|
const writeLayer = optimisticId ? this.#topLayer : this.#truthLayer;
|
|
277
|
-
const newValue =
|
|
278
|
-
cacheKey,
|
|
279
|
-
value,
|
|
280
|
-
lastUpdated: Date.now(),
|
|
281
|
-
status
|
|
282
|
-
};
|
|
297
|
+
const newValue = new Entry(cacheKey, value, Date.now(), status);
|
|
283
298
|
writeLayer.set(cacheKey, newValue);
|
|
284
299
|
const newTopValue = this.#topLayer.get(cacheKey);
|
|
285
300
|
if (oldTopValue !== newTopValue) {
|
|
286
301
|
this.#cacheKeyToSubject.get(cacheKey)?.next({
|
|
302
|
+
// eslint-disable-next-line @typescript-eslint/no-misused-spread
|
|
287
303
|
...newValue,
|
|
288
304
|
isOptimistic: newTopValue?.value !== this.#truthLayer.get(cacheKey)?.value
|
|
289
305
|
});
|
|
@@ -295,86 +311,92 @@ export class Store {
|
|
|
295
311
|
}
|
|
296
312
|
};
|
|
297
313
|
const retVal = batchFn(batchContext);
|
|
314
|
+
this.maybeRevalidateQueries(changes, optimisticId).catch(e => {
|
|
315
|
+
// we don't want batch() to return a promise,
|
|
316
|
+
// so we settle for logging an error here instead of
|
|
317
|
+
// dropping it on the floor.
|
|
318
|
+
if (this.logger) {
|
|
319
|
+
this.logger.error("Unhandled error in batch", e);
|
|
320
|
+
} else {
|
|
321
|
+
// eslint-disable-next-line no-console
|
|
322
|
+
console.error("Unhandled error in batch", e);
|
|
323
|
+
throw e;
|
|
324
|
+
}
|
|
325
|
+
});
|
|
298
326
|
return {
|
|
299
327
|
batchResult: batchContext,
|
|
300
|
-
retVal: retVal
|
|
328
|
+
retVal: retVal,
|
|
329
|
+
changes: batchContext.changes
|
|
301
330
|
};
|
|
302
331
|
};
|
|
303
332
|
invalidateObject(apiName, pk) {
|
|
304
333
|
if (typeof apiName !== "string") {
|
|
305
334
|
apiName = apiName.apiName;
|
|
306
335
|
}
|
|
307
|
-
|
|
308
|
-
// inevitably we will want an internal version of this and a "public" one
|
|
309
|
-
// so we can avoid extra requests
|
|
310
|
-
|
|
311
|
-
const query = this.getObjectQuery(apiName, pk);
|
|
312
|
-
return query.revalidate(true);
|
|
313
|
-
|
|
314
|
-
// potentially trigger updates of the lists that included this object?
|
|
315
|
-
// TODO
|
|
316
|
-
// could we detect that a list WOULD include it?
|
|
317
|
-
}
|
|
318
|
-
maybeRevalidateLists(changes) {
|
|
319
|
-
for (const [cacheKey, v] of this.#truthLayer.entries()) {
|
|
320
|
-
if (isListCacheKey(cacheKey)) {
|
|
321
|
-
// fixme promise
|
|
322
|
-
void this.#peekQuery(cacheKey)?.maybeRevalidate(changes);
|
|
323
|
-
}
|
|
324
|
-
}
|
|
336
|
+
return this.getObjectQuery(apiName, pk).revalidate(/* force */true);
|
|
325
337
|
}
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
if (
|
|
329
|
-
//
|
|
330
|
-
|
|
338
|
+
async maybeRevalidateQueries(changes, optimisticId) {
|
|
339
|
+
if (changes.isEmpty()) {
|
|
340
|
+
if (process.env.NODE_ENV !== "production") {
|
|
341
|
+
// todo
|
|
342
|
+
this.logger?.child({
|
|
343
|
+
methodName: "maybeRevalidateQueries"
|
|
344
|
+
}).debug("No changes, aborting");
|
|
331
345
|
}
|
|
346
|
+
return;
|
|
332
347
|
}
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
348
|
+
if (process.env.NODE_ENV !== "production") {
|
|
349
|
+
// todo
|
|
350
|
+
this.logger?.child({
|
|
351
|
+
methodName: "maybeRevalidateQueries"
|
|
352
|
+
}).debug(DEBUG_ONLY__changesToString(changes), {
|
|
353
|
+
optimisticId
|
|
354
|
+
});
|
|
337
355
|
}
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
356
|
+
try {
|
|
357
|
+
const promises = [];
|
|
358
|
+
for (const cacheKey of this.#queries.keys()) {
|
|
359
|
+
const promise = this.peekQuery(cacheKey)?.maybeUpdateAndRevalidate?.(changes, optimisticId);
|
|
360
|
+
if (promise) promises.push(promise);
|
|
361
|
+
}
|
|
362
|
+
await Promise.all(promises);
|
|
363
|
+
} finally {
|
|
364
|
+
if (process.env.NODE_ENV !== "production") {
|
|
365
|
+
// todo
|
|
366
|
+
this.logger?.child({
|
|
367
|
+
methodName: "maybeRevalidateQueries"
|
|
368
|
+
}).debug("in finally", DEBUG_ONLY__changesToString(changes));
|
|
341
369
|
}
|
|
342
370
|
}
|
|
343
371
|
}
|
|
344
|
-
|
|
372
|
+
|
|
373
|
+
/**
|
|
374
|
+
* @param apiName
|
|
375
|
+
* @param changes The changes we know about / to update
|
|
376
|
+
* @returns
|
|
377
|
+
*/
|
|
378
|
+
invalidateObjectType(apiName, changes) {
|
|
345
379
|
if (typeof apiName !== "string") {
|
|
346
380
|
apiName = apiName.apiName;
|
|
347
381
|
}
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
optimisticId
|
|
353
|
-
} = {}) {
|
|
354
|
-
if (typeof apiName !== "string") {
|
|
355
|
-
apiName = apiName.apiName;
|
|
382
|
+
if (process.env.NODE_ENV !== "production") {
|
|
383
|
+
this.logger?.child({
|
|
384
|
+
methodName: "invalidateObjectType"
|
|
385
|
+
}).info(changes ? DEBUG_ONLY__changesToString(changes) : void 0);
|
|
356
386
|
}
|
|
357
|
-
const
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
}) {
|
|
369
|
-
if (typeof apiName !== "string") {
|
|
370
|
-
apiName = apiName.apiName;
|
|
387
|
+
const promises = [];
|
|
388
|
+
for (const cacheKey of this.#truthLayer.keys()) {
|
|
389
|
+
if (isListCacheKey(cacheKey)) {
|
|
390
|
+
if (!changes || !changes.modified.has(cacheKey)) {
|
|
391
|
+
const promise = this.peekQuery(cacheKey)?.revalidate(true);
|
|
392
|
+
if (promise) {
|
|
393
|
+
promises.push(promise);
|
|
394
|
+
changes?.modified.add(cacheKey);
|
|
395
|
+
}
|
|
396
|
+
}
|
|
397
|
+
}
|
|
371
398
|
}
|
|
372
|
-
|
|
373
|
-
this.batch({
|
|
374
|
-
optimisticId
|
|
375
|
-
}, b => {
|
|
376
|
-
query.updateList(values, false, "loaded", b);
|
|
377
|
-
});
|
|
399
|
+
return Promise.all(promises).then(() => void 0);
|
|
378
400
|
}
|
|
379
401
|
retain(cacheKey) {
|
|
380
402
|
this.#refCounts.retain(cacheKey);
|
|
@@ -383,82 +405,10 @@ export class Store {
|
|
|
383
405
|
this.#refCounts.release(cacheKey);
|
|
384
406
|
}
|
|
385
407
|
}
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
optimisticUpdate
|
|
392
|
-
} = {}) => {
|
|
393
|
-
const removeOptimisticResult = runOptimisticJob(this.store, optimisticUpdate);
|
|
394
|
-
return (async () => {
|
|
395
|
-
try {
|
|
396
|
-
// The types for client get confused when we dynamically applyAction so we
|
|
397
|
-
// have to deal with the `any` here and force cast it to what it should be.
|
|
398
|
-
// TODO: Update the types so this doesn't happen!
|
|
399
|
-
// eslint-disable-next-line @typescript-eslint/no-unsafe-call
|
|
400
|
-
const actionResults = await this.store.client(action).applyAction(args, {
|
|
401
|
-
$returnEdits: true
|
|
402
|
-
});
|
|
403
|
-
if (ACTION_DELAY > 0) {
|
|
404
|
-
// eslint-disable-next-line no-console
|
|
405
|
-
console.log("action done, pausing");
|
|
406
|
-
await delay(ACTION_DELAY);
|
|
407
|
-
// eslint-disable-next-line no-console
|
|
408
|
-
console.log("action done, pausing done");
|
|
409
|
-
}
|
|
410
|
-
await this.#invalidateActionEditResponse(actionResults);
|
|
411
|
-
return actionResults;
|
|
412
|
-
} finally {
|
|
413
|
-
// make sure this happens even if the action fails
|
|
414
|
-
await removeOptimisticResult();
|
|
415
|
-
}
|
|
416
|
-
})();
|
|
417
|
-
};
|
|
418
|
-
#invalidateActionEditResponse = value => {
|
|
419
|
-
const typesToInvalidate = new Set();
|
|
420
|
-
let promisesToWait = [];
|
|
421
|
-
if (value.type === "edits") {
|
|
422
|
-
// TODO we need an backend update for deletes
|
|
423
|
-
for (const obj of value.modifiedObjects) {
|
|
424
|
-
promisesToWait.push(this.store.invalidateObject(obj.objectType, obj.primaryKey));
|
|
425
|
-
}
|
|
426
|
-
for (const obj of value.addedObjects) {
|
|
427
|
-
promisesToWait.push(this.store.invalidateObject(obj.objectType, obj.primaryKey));
|
|
428
|
-
typesToInvalidate.add(obj.objectType);
|
|
429
|
-
}
|
|
430
|
-
promisesToWait = [Promise.allSettled(promisesToWait).then(() => {
|
|
431
|
-
const changes2 = this.#changesFromActionEditResponse(value);
|
|
432
|
-
this.store.maybeRevalidateLists(changes2);
|
|
433
|
-
})];
|
|
434
|
-
} else {
|
|
435
|
-
for (const apiName of value.editedObjectTypes) {
|
|
436
|
-
typesToInvalidate.add(apiName.toString());
|
|
437
|
-
}
|
|
438
|
-
}
|
|
439
|
-
return Promise.allSettled(promisesToWait).then(() => {
|
|
440
|
-
// after the single object invalidations are done we can decide if we need to updates any lists
|
|
441
|
-
for (const objectType of typesToInvalidate) {
|
|
442
|
-
// TODO make sure this covers individual object loads too
|
|
443
|
-
this.store.invalidateObjectType(objectType);
|
|
444
|
-
}
|
|
445
|
-
return value;
|
|
446
|
-
});
|
|
447
|
-
};
|
|
448
|
-
#changesFromActionEditResponse = value => {
|
|
449
|
-
const changes = createChangedObjects();
|
|
450
|
-
for (const changeType of ["addedObjects", "modifiedObjects"]) {
|
|
451
|
-
for (const {
|
|
452
|
-
objectType,
|
|
453
|
-
primaryKey
|
|
454
|
-
} of value[changeType] ?? []) {
|
|
455
|
-
const obj = this.store.getObject(objectType, primaryKey);
|
|
456
|
-
if (obj) {
|
|
457
|
-
changes[changeType].set(objectType, obj);
|
|
458
|
-
}
|
|
459
|
-
}
|
|
460
|
-
}
|
|
461
|
-
return changes;
|
|
462
|
-
};
|
|
408
|
+
export async function invalidateList(store, args) {
|
|
409
|
+
const where = store.whereCanonicalizer.canonicalize(args.where ?? {});
|
|
410
|
+
const orderBy = store.orderByCanonicalizer.canonicalize(args.orderBy ?? {});
|
|
411
|
+
const cacheKey = store.getCacheKey("list", args.type.type, args.type.apiName, where, orderBy);
|
|
412
|
+
await store.peekQuery(cacheKey)?.revalidate(true);
|
|
463
413
|
}
|
|
464
414
|
//# sourceMappingURL=Store.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Store.js","names":["delay","BehaviorSubject","invariant","DEBUG_REFCOUNTS","CacheKeys","createChangedObjects","Layer","isListCacheKey","ListQuery","ObjectQuery","runOptimisticJob","RefCounts","WhereClauseCanonicalizer","ACTION_DELAY","process","env","NODE_ENV","createInitEntry","cacheKey","status","value","undefined","lastUpdated","Store","whereCanonicalizer","truthLayer","topLayer","queries","WeakMap","cacheKeyToSubject","cacheKeys","refCounts","k","cleanupCacheKey","finalizationRegistry","constructor","client","cacheKeyType","type","otherKeys","console","log","JSON","stringify","register","setInterval","gc","FinalizationRegistry","cleanupCallback","e","error","key","subject","peekSubject","closed","observed","remove","complete","delete","get","dispose","applyAction","action","args","opts","ActionApplication","removeLayer","layerId","currentLayer","Map","parentLayer","v","entries","has","set","oldEntry","currentEntry","next","isOptimistic","getCacheKey","getSubject","initialValue","observeObject","apiName","pk","options","subFn","query","getObjectQuery","retain","mode","revalidate","sub","subscribe","unsubscribe","release","observeList","where","getListQuery","peekQuery","#peekQuery","getQuery","#getQuery","createQuery","peek","canonWhere","canonicalize","listCacheKey","objectCacheKey","dedupeInterval","getObject","objEntry","batch","optimisticId","batchFn","needsLayer","batchContext","addedObjects","Set","modifiedObjects","modifiedLists","createLayerIfNeeded","addLayer","optimisticWrite","write","oldTopValue","writeLayer","newValue","Date","now","newTopValue","read","retVal","batchResult","invalidateObject","maybeRevalidateLists","changes","maybeRevalidate","maybeUpdateLists","maybeUpdate","invalidateObjectType","invalidateList","updateObject","$primaryKey","writeToStore","updateList","values","b","store","optimisticUpdate","removeOptimisticResult","actionResults","$returnEdits","invalidateActionEditResponse","typesToInvalidate","promisesToWait","obj","push","objectType","primaryKey","add","Promise","allSettled","then","changes2","changesFromActionEditResponse","editedObjectTypes","toString","changeType"],"sources":["Store.ts"],"sourcesContent":["/*\n * Copyright 2025 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport type {\n ActionDefinition,\n ActionEditResponse,\n ObjectTypeDefinition,\n Osdk,\n PrimaryKeyType,\n WhereClause,\n} from \"@osdk/api\";\nimport { delay } from \"msw\";\nimport { BehaviorSubject } from \"rxjs\";\nimport invariant from \"tiny-invariant\";\nimport type { ActionSignatureFromDef } from \"../../actions/applyAction.js\";\nimport type { Client } from \"../../Client.js\";\nimport { DEBUG_REFCOUNTS } from \"../DebugFlags.js\";\nimport type { ListPayload } from \"../ListPayload.js\";\nimport type { ObjectPayload } from \"../ObjectPayload.js\";\nimport type {\n ObserveObjectOptions,\n Unsubscribable,\n} from \"../ObservableClient.js\";\nimport type { OptimisticBuilder } from \"../OptimisticBuilder.js\";\nimport type { SubFn } from \"../types.js\";\nimport type { CacheKey } from \"./CacheKey.js\";\nimport { CacheKeys } from \"./CacheKeys.js\";\nimport { type ChangedObjects, createChangedObjects } from \"./ChangedObjects.js\";\nimport type { Entry } from \"./Layer.js\";\nimport { Layer } from \"./Layer.js\";\nimport type { ListCacheKey, ListQueryOptions } from \"./ListQuery.js\";\nimport { isListCacheKey, ListQuery } from \"./ListQuery.js\";\nimport type { ObjectCacheKey } from \"./ObjectQuery.js\";\nimport { ObjectQuery } from \"./ObjectQuery.js\";\nimport { type OptimisticId } from \"./OptimisticId.js\";\nimport { runOptimisticJob } from \"./OptimisticJob.js\";\nimport type { Query } from \"./Query.js\";\nimport { RefCounts } from \"./RefCounts.js\";\nimport { WhereClauseCanonicalizer } from \"./WhereClauseCanonicalizer.js\";\n\nconst ACTION_DELAY = process.env.NODE_ENV === \"production\" ? 0 : 1000;\n\n/*\n Work still to do:\n - [x] testing for optimistic writes\n - [x] automatic invalidation of actions\n - [x] automatic optimistic list updates\n - [x] useOsdkObjects\n - [x] imply offline for objects passed directly\n - [ ] websocket subscriptions\n - [ ] links\n - [ ] add pagination\n - [ ] sub-selection support\n - [ ] interfaces\n - [ ] setup defaults\n - [ ] reduce updates in react\n*/\n\nexport interface SubjectPayload<KEY extends CacheKey> extends Entry<KEY> {\n isOptimistic: boolean;\n}\n\nexport interface BatchContext {\n addedObjects: Set<ObjectCacheKey>;\n modifiedObjects: Set<ObjectCacheKey>;\n modifiedLists: Set<ListCacheKey>;\n createLayerIfNeeded: () => void;\n optimisticWrite: boolean;\n\n write: <K extends CacheKey<string, any, any>>(\n k: K,\n v: Entry<K>[\"value\"],\n status: Entry<K>[\"status\"],\n ) => Entry<K>;\n\n read: <K extends CacheKey<string, any, any>>(\n k: K,\n ) => Entry<K> | undefined;\n}\n\ninterface ObserveOptions {\n mode?: \"offline\" | \"force\";\n}\n\ninterface UpdateOptions {\n optimisticId?: OptimisticId;\n}\n\nexport namespace Store {\n export interface ApplyActionOptions {\n optimisticUpdate?: (ctx: OptimisticBuilder) => void;\n }\n}\n\nfunction createInitEntry(cacheKey: CacheKey): Entry<any> {\n return {\n cacheKey,\n status: \"init\",\n value: undefined,\n lastUpdated: 0,\n };\n}\n\n/*\n Notes:\n - Subjects are one per type per store (by cache key)\n - Data is one per layer per cache key\n*/\n\nexport class Store {\n whereCanonicalizer: WhereClauseCanonicalizer = new WhereClauseCanonicalizer();\n #truthLayer: Layer = new Layer(undefined, undefined);\n #topLayer: Layer;\n client: Client;\n\n #queries: WeakMap<CacheKey<string, any, any>, Query<any, any, any>> =\n new WeakMap();\n\n #cacheKeyToSubject = new WeakMap<\n CacheKey<string, any, any>,\n BehaviorSubject<SubjectPayload<any>>\n >();\n #cacheKeys: CacheKeys;\n\n #refCounts = new RefCounts<CacheKey>(\n DEBUG_REFCOUNTS ? 15_000 : 60_000,\n (k) => this.#cleanupCacheKey(k),\n );\n\n #finalizationRegistry: FinalizationRegistry<() => void>;\n\n constructor(client: Client) {\n this.client = client;\n this.#topLayer = this.#truthLayer;\n this.#cacheKeys = new CacheKeys(this.whereCanonicalizer, (k) => {\n if (DEBUG_REFCOUNTS) {\n const cacheKeyType = k.type;\n const otherKeys = k.otherKeys;\n // eslint-disable-next-line no-console\n console.log(\n `CacheKeys.onCreate(${cacheKeyType}, ${JSON.stringify(otherKeys)})`,\n );\n\n this.#finalizationRegistry.register(k, () => {\n // eslint-disable-next-line no-console\n console.log(\n `CacheKey Finalization(${cacheKeyType}, ${\n JSON.stringify(otherKeys)\n })`,\n );\n });\n }\n\n this.#refCounts.register(k);\n });\n\n setInterval(() => {\n this.#refCounts.gc();\n }, 1000);\n\n this.#finalizationRegistry = new FinalizationRegistry<() => void>(\n (cleanupCallback) => {\n try {\n cleanupCallback();\n } catch (e) {\n // eslint-disable-next-line no-console\n console.error(\n \"Caught an error while running a finalization callback\",\n e,\n );\n }\n },\n );\n }\n\n /**\n * Called after a key is no longer retained and the timeout has elapsed\n * @param key\n */\n #cleanupCacheKey = (key: CacheKey<string, any, any>) => {\n const subject = this.peekSubject(key);\n\n if (DEBUG_REFCOUNTS) {\n // eslint-disable-next-line no-console\n console.log(\n `CacheKey cleaning up (${\n JSON.stringify({\n closed: subject?.closed,\n observed: subject?.observed,\n })\n })`,\n JSON.stringify([key.type, ...key.otherKeys], null, 2),\n );\n }\n this.#cacheKeys.remove(key);\n if (process.env.NODE_ENV !== \"production\") {\n invariant(subject);\n }\n\n if (subject) {\n subject.complete();\n this.#cacheKeyToSubject.delete(key);\n }\n\n this.#queries.get(key)?.dispose();\n this.#queries.delete(key);\n };\n\n applyAction: <Q extends ActionDefinition<any>>(\n action: Q,\n args: Parameters<ActionSignatureFromDef<Q>[\"applyAction\"]>[0],\n opts?: Store.ApplyActionOptions,\n ) => Promise<unknown> = (action, args, opts) => {\n return new ActionApplication(this).applyAction(action, args, opts);\n };\n\n removeLayer(layerId: OptimisticId): void {\n invariant(\n layerId != null,\n \"undefined is the reserved layerId for the truth layer\",\n );\n // 1. collect all cache keys for a given layerId\n let currentLayer: Layer | undefined = this.#topLayer;\n const cacheKeys = new Map<CacheKey<string, any, any>, Entry<any>>();\n while (currentLayer != null && currentLayer.parentLayer != null) {\n if (currentLayer.layerId === layerId) {\n for (const [k, v] of currentLayer.entries()) {\n if (cacheKeys.has(k)) continue;\n cacheKeys.set(k, v);\n }\n }\n\n currentLayer = currentLayer.parentLayer;\n }\n\n // 2. remove the layers from the chain\n this.#topLayer = this.#topLayer.removeLayer(layerId);\n\n // 3. check each cache key to see if it is different in the new chain\n for (const [k, oldEntry] of cacheKeys) {\n const currentEntry = this.#topLayer.get(k);\n\n // 4. if different, update the subject\n if (oldEntry !== currentEntry) {\n const x = currentEntry ?? createInitEntry(k);\n // We are going to be pretty lazy here and just re-emit the value.\n // In the future it may benefit us to deep equal check her but I think\n // the subjects are effectively doing this anyway.\n this.peekSubject(k)?.next(\n {\n // eslint-disable-next-line @typescript-eslint/no-misused-spread\n ...(currentEntry ?? createInitEntry(k)),\n isOptimistic:\n currentEntry?.value !== this.#truthLayer.get(k)?.value,\n },\n );\n }\n }\n }\n\n getCacheKey<K extends CacheKey<string, any, any>>(\n type: K[\"type\"],\n ...args: K[\"__cacheKey\"][\"args\"]\n ): K {\n return this.#refCounts.register(this.#cacheKeys.get(type, ...args));\n }\n\n peekSubject = <KEY extends CacheKey<string, any, any>>(\n cacheKey: KEY,\n ):\n | BehaviorSubject<SubjectPayload<KEY>>\n | undefined =>\n {\n return this.#cacheKeyToSubject.get(cacheKey);\n };\n\n getSubject = <KEY extends CacheKey<string, any, any>>(\n cacheKey: KEY,\n ): BehaviorSubject<SubjectPayload<KEY>> => {\n let subject = this.#cacheKeyToSubject.get(cacheKey);\n if (!subject) {\n const initialValue: Entry<KEY> = this.#topLayer.get(cacheKey)\n ?? createInitEntry(cacheKey);\n\n subject = new BehaviorSubject({\n // eslint-disable-next-line @typescript-eslint/no-misused-spread\n ...initialValue,\n isOptimistic:\n initialValue.value !== this.#truthLayer.get(cacheKey)?.value,\n });\n this.#cacheKeyToSubject.set(cacheKey, subject);\n }\n\n return subject;\n };\n\n public observeObject<T extends ObjectTypeDefinition>(\n apiName: T[\"apiName\"] | T,\n pk: PrimaryKeyType<T>,\n options: ObserveObjectOptions<T>,\n subFn: SubFn<ObjectPayload>,\n ): Unsubscribable {\n if (typeof apiName !== \"string\") {\n apiName = apiName.apiName;\n }\n\n const query = this.getObjectQuery(apiName, pk);\n this.#refCounts.retain(query.cacheKey);\n\n if (options.mode !== \"offline\") {\n void query.revalidate(options.mode === \"force\");\n }\n const sub = query.subscribe({ next: subFn });\n\n return {\n unsubscribe: () => {\n sub.unsubscribe();\n this.#refCounts.release(query.cacheKey);\n },\n };\n }\n\n public observeList<T extends ObjectTypeDefinition>(\n apiName: T[\"apiName\"] | T,\n where: WhereClause<T>,\n options: ObserveOptions & ListQueryOptions,\n subFn: SubFn<ListPayload>,\n ): Unsubscribable {\n if (typeof apiName !== \"string\") {\n apiName = apiName.apiName;\n }\n\n const query = this.getListQuery(apiName, where, options);\n this.#refCounts.retain(query.cacheKey);\n\n if (options.mode !== \"offline\") {\n void query.revalidate(options.mode === \"force\");\n }\n const sub = query.subscribe({ next: subFn });\n\n return {\n unsubscribe: () => {\n sub.unsubscribe();\n this.#refCounts.release(query.cacheKey);\n },\n };\n }\n\n #peekQuery<K extends CacheKey<string, any, any>>(\n cacheKey: K,\n ): K[\"__cacheKey\"][\"query\"] | undefined {\n return this.#queries.get(cacheKey) as K[\"__cacheKey\"][\"query\"] | undefined;\n }\n\n #getQuery<K extends CacheKey>(\n cacheKey: K,\n createQuery: () => K[\"__cacheKey\"][\"query\"],\n ): K[\"__cacheKey\"][\"query\"] {\n let query = this.#peekQuery(cacheKey);\n if (!query) {\n query = createQuery();\n this.#queries.set(cacheKey, query);\n }\n return query;\n }\n\n public getListQuery<T extends ObjectTypeDefinition>(\n apiName: T[\"apiName\"] | T,\n where: WhereClause<T>,\n opts: ListQueryOptions,\n peek = false,\n ): ListQuery {\n if (typeof apiName !== \"string\") {\n apiName = apiName.apiName;\n }\n\n const canonWhere = this.whereCanonicalizer.canonicalize(where);\n const listCacheKey = this.getCacheKey<ListCacheKey>(\n \"list\",\n apiName,\n canonWhere,\n );\n\n return this.#getQuery(listCacheKey, () => {\n return new ListQuery(\n this,\n this.getSubject(listCacheKey),\n apiName,\n canonWhere,\n listCacheKey,\n opts,\n );\n });\n }\n\n public getObjectQuery<T extends ObjectTypeDefinition>(\n apiName: T[\"apiName\"] | T,\n pk: PrimaryKeyType<T>,\n ): ObjectQuery {\n if (typeof apiName !== \"string\") {\n apiName = apiName.apiName;\n }\n\n const objectCacheKey = this.getCacheKey<ObjectCacheKey>(\n \"object\",\n apiName,\n pk,\n );\n\n return this.#getQuery(objectCacheKey, () =>\n new ObjectQuery(\n this,\n this.getSubject(objectCacheKey),\n apiName,\n pk,\n objectCacheKey,\n { dedupeInterval: 0 },\n ));\n }\n\n public getObject<T extends ObjectTypeDefinition>(\n apiName: T[\"apiName\"] | T,\n pk: string | number,\n ): Osdk.Instance<T> | undefined {\n if (typeof apiName !== \"string\") {\n apiName = apiName.apiName;\n }\n\n const objectCacheKey = this.getCacheKey<ObjectCacheKey>(\n \"object\",\n apiName,\n pk,\n );\n const objEntry = this.#topLayer.get(objectCacheKey);\n return objEntry?.value as Osdk.Instance<T> | undefined;\n }\n\n batch = <X>(\n { optimisticId }: { optimisticId?: OptimisticId },\n batchFn: (batchContext: BatchContext) => X,\n ): {\n batchResult: BatchContext;\n retVal: X;\n } => {\n invariant(\n optimisticId === undefined || !!optimisticId,\n \"optimistic must be undefined or not falsy\",\n );\n\n let needsLayer = optimisticId !== undefined;\n const batchContext: BatchContext = {\n addedObjects: new Set(),\n modifiedObjects: new Set(),\n modifiedLists: new Set(),\n createLayerIfNeeded: () => {\n if (needsLayer) {\n this.#topLayer = this.#topLayer.addLayer(optimisticId);\n needsLayer = false;\n }\n },\n optimisticWrite: !!optimisticId,\n write: (cacheKey, value, status) => {\n const oldTopValue = this.#topLayer.get(cacheKey);\n\n if (optimisticId) batchContext.createLayerIfNeeded();\n\n const writeLayer = optimisticId\n ? this.#topLayer\n : this.#truthLayer;\n const newValue = {\n cacheKey,\n value,\n lastUpdated: Date.now(),\n status,\n };\n\n writeLayer.set(cacheKey, newValue);\n\n const newTopValue = this.#topLayer.get(cacheKey);\n\n if (oldTopValue !== newTopValue) {\n this.#cacheKeyToSubject.get(cacheKey)?.next({\n ...newValue,\n isOptimistic:\n newTopValue?.value !== this.#truthLayer.get(cacheKey)?.value,\n });\n }\n\n return newValue;\n },\n read: (cacheKey) => {\n return optimisticId\n ? this.#topLayer.get(cacheKey)\n : this.#truthLayer.get(cacheKey);\n },\n };\n\n const retVal = batchFn(batchContext);\n\n return { batchResult: batchContext, retVal: retVal };\n };\n\n public invalidateObject<T extends ObjectTypeDefinition>(\n apiName: T[\"apiName\"] | T,\n pk: PrimaryKeyType<T>,\n ): Promise<unknown> {\n if (typeof apiName !== \"string\") {\n apiName = apiName.apiName;\n }\n\n // inevitably we will want an internal version of this and a \"public\" one\n // so we can avoid extra requests\n\n const query = this.getObjectQuery(apiName, pk);\n\n return query.revalidate(true);\n\n // potentially trigger updates of the lists that included this object?\n // TODO\n // could we detect that a list WOULD include it?\n }\n\n public maybeRevalidateLists(\n changes: ChangedObjects,\n ): void {\n for (const [cacheKey, v] of this.#truthLayer.entries()) {\n if (isListCacheKey(cacheKey)) {\n // fixme promise\n void this.#peekQuery(cacheKey)?.maybeRevalidate(changes);\n }\n }\n }\n\n public maybeUpdateLists(\n changes: ChangedObjects,\n optimisticId: OptimisticId,\n ): void {\n for (const [cacheKey, v] of this.#truthLayer.entries()) {\n if (isListCacheKey(cacheKey)) {\n // fixme promise\n void this.#peekQuery(cacheKey)?.maybeUpdate(changes, optimisticId);\n }\n }\n }\n\n public invalidateObjectType<T extends ObjectTypeDefinition>(\n apiName: T[\"apiName\"] | T,\n ): void {\n if (typeof apiName !== \"string\") {\n apiName = apiName.apiName;\n }\n\n for (const [cacheKey, v] of this.#truthLayer.entries()) {\n if (isListCacheKey(cacheKey, apiName)) {\n void this.#peekQuery(cacheKey)?.revalidate(true);\n }\n }\n }\n\n public invalidateList<T extends ObjectTypeDefinition>(\n apiName: T[\"apiName\"] | T,\n where: WhereClause<T>,\n ): void {\n if (typeof apiName !== \"string\") {\n apiName = apiName.apiName;\n }\n\n const cacheKey = this.getCacheKey<ListCacheKey>(\n \"list\",\n apiName,\n where,\n );\n\n void this.#peekQuery(cacheKey)?.revalidate(true);\n }\n\n public updateObject(\n apiName: string | ObjectTypeDefinition,\n value: Osdk.Instance<ObjectTypeDefinition>,\n { optimisticId }: UpdateOptions = {},\n ): Osdk.Instance<ObjectTypeDefinition> {\n if (typeof apiName !== \"string\") {\n apiName = apiName.apiName;\n }\n\n const query = this.getObjectQuery(apiName, value.$primaryKey);\n\n return this.batch({ optimisticId }, (batch) => {\n return query.writeToStore(value, \"loaded\", batch);\n }).retVal.value!;\n }\n\n public updateList<T extends ObjectTypeDefinition>(\n apiName: T[\"apiName\"] | T,\n where: WhereClause<T>,\n values: Osdk.Instance<T>[],\n { optimisticId }: UpdateOptions = {},\n opts: ListQueryOptions = { dedupeInterval: 0 },\n ): void {\n if (typeof apiName !== \"string\") {\n apiName = apiName.apiName;\n }\n\n const query = this.getListQuery(apiName, where, opts);\n\n this.batch({ optimisticId }, (b) => {\n query.updateList(values, false, \"loaded\", b);\n });\n }\n\n retain(cacheKey: CacheKey<string, any, any>): void {\n this.#refCounts.retain(cacheKey);\n }\n\n release(cacheKey: CacheKey<string, any, any>): void {\n this.#refCounts.release(cacheKey);\n }\n}\n\nclass ActionApplication {\n constructor(private store: Store) {}\n\n applyAction: <Q extends ActionDefinition<any>>(\n action: Q,\n args: Parameters<ActionSignatureFromDef<Q>[\"applyAction\"]>[0],\n opts?: Store.ApplyActionOptions,\n ) => Promise<unknown> = (action, args, { optimisticUpdate } = {}) => {\n const removeOptimisticResult = runOptimisticJob(\n this.store,\n optimisticUpdate,\n );\n return (async () => {\n try {\n // The types for client get confused when we dynamically applyAction so we\n // have to deal with the `any` here and force cast it to what it should be.\n // TODO: Update the types so this doesn't happen!\n // eslint-disable-next-line @typescript-eslint/no-unsafe-call\n const actionResults: ActionEditResponse = await this.store.client(\n action,\n ).applyAction(args as any, { $returnEdits: true });\n\n if (ACTION_DELAY > 0) {\n // eslint-disable-next-line no-console\n console.log(\"action done, pausing\");\n await delay(ACTION_DELAY);\n // eslint-disable-next-line no-console\n console.log(\"action done, pausing done\");\n }\n await this.#invalidateActionEditResponse(actionResults);\n return actionResults;\n } finally {\n // make sure this happens even if the action fails\n await removeOptimisticResult();\n }\n })();\n };\n\n #invalidateActionEditResponse = (value: ActionEditResponse) => {\n const typesToInvalidate = new Set<string>();\n let promisesToWait: Promise<any>[] = [];\n if (value.type === \"edits\") {\n // TODO we need an backend update for deletes\n for (const obj of value.modifiedObjects) {\n promisesToWait.push(\n this.store.invalidateObject(obj.objectType, obj.primaryKey),\n );\n }\n\n for (const obj of value.addedObjects) {\n promisesToWait.push(\n this.store.invalidateObject(obj.objectType, obj.primaryKey),\n );\n\n typesToInvalidate.add(obj.objectType);\n }\n\n promisesToWait = [\n Promise.allSettled(promisesToWait).then(() => {\n const changes2 = this.#changesFromActionEditResponse(value);\n this.store.maybeRevalidateLists(changes2);\n }),\n ];\n } else {\n for (const apiName of value.editedObjectTypes) {\n typesToInvalidate.add(apiName.toString());\n }\n }\n\n return Promise.allSettled(promisesToWait).then(() => {\n // after the single object invalidations are done we can decide if we need to updates any lists\n for (const objectType of typesToInvalidate) {\n // TODO make sure this covers individual object loads too\n this.store.invalidateObjectType(objectType);\n }\n\n return value;\n });\n };\n\n #changesFromActionEditResponse = (value: ActionEditResponse) => {\n const changes = createChangedObjects();\n for (const changeType of [\"addedObjects\", \"modifiedObjects\"] as const) {\n for (const { objectType, primaryKey } of (value[changeType] ?? [])) {\n const obj = this.store.getObject(objectType, primaryKey);\n if (obj) {\n changes[changeType].set(objectType, obj);\n }\n }\n }\n return changes;\n };\n}\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"Store.js","names":["BehaviorSubject","invariant","additionalContext","DEBUG_REFCOUNTS","ActionApplication","CacheKeys","createChangedObjects","DEBUG_ONLY__changesToString","Entry","Layer","isListCacheKey","ListQuery","ObjectQuery","OrderByCanonicalizer","RefCounts","WhereClauseCanonicalizer","createInitEntry","cacheKey","status","value","undefined","lastUpdated","Store","whereCanonicalizer","orderByCanonicalizer","truthLayer","topLayer","queries","Map","cacheKeyToSubject","WeakMap","cacheKeys","refCounts","k","cleanupCacheKey","finalizationRegistry","constructor","client","logger","child","msgPrefix","cacheKeyType","type","otherKeys","console","log","JSON","stringify","register","setInterval","gc","FinalizationRegistry","cleanupCallback","e","error","key","subject","peekSubject","closed","observed","remove","process","env","NODE_ENV","complete","delete","get","dispose","applyAction","action","args","opts","removeLayer","layerId","currentLayer","parentLayer","v","entries","has","set","oldEntry","currentEntry","next","isOptimistic","getCacheKey","getSubject","initialValue","canonicalizeWhereClause","where","canonicalize","observeObject","apiName","pk","options","subFn","query","getObjectQuery","retain","mode","revalidate","catch","sub","subscribe","unsubscribe","release","observeList","getListQuery","orderBy","x","streamUpdates","registerStreamUpdates","peekQuery","getQuery","#getQuery","createQuery","def","canonWhere","canonOrderBy","listCacheKey","objectCacheKey","dedupeInterval","getValue","batch","optimisticId","changes","batchFn","needsLayer","batchContext","createLayerIfNeeded","addLayer","optimisticWrite","write","oldTopValue","writeLayer","newValue","Date","now","newTopValue","read","retVal","maybeRevalidateQueries","batchResult","invalidateObject","isEmpty","methodName","debug","promises","keys","promise","maybeUpdateAndRevalidate","push","Promise","all","invalidateObjectType","info","modified","add","then","invalidateList","store"],"sources":["Store.ts"],"sourcesContent":["/*\n * Copyright 2025 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport type {\n ActionDefinition,\n ActionEditResponse,\n InterfaceDefinition,\n Logger,\n ObjectTypeDefinition,\n PrimaryKeyType,\n WhereClause,\n} from \"@osdk/api\";\nimport type { Observer } from \"rxjs\";\nimport { BehaviorSubject } from \"rxjs\";\nimport invariant from \"tiny-invariant\";\nimport type { ActionSignatureFromDef } from \"../../actions/applyAction.js\";\nimport { additionalContext, type Client } from \"../../Client.js\";\nimport { DEBUG_REFCOUNTS } from \"../DebugFlags.js\";\nimport type { ListPayload } from \"../ListPayload.js\";\nimport type { ObjectPayload } from \"../ObjectPayload.js\";\nimport type {\n ObserveListOptions,\n ObserveObjectOptions,\n OrderBy,\n Unsubscribable,\n} from \"../ObservableClient.js\";\nimport type { OptimisticBuilder } from \"../OptimisticBuilder.js\";\nimport { ActionApplication } from \"./ActionApplication.js\";\nimport type { CacheKey } from \"./CacheKey.js\";\nimport { CacheKeys } from \"./CacheKeys.js\";\nimport type { Canonical } from \"./Canonical.js\";\nimport {\n type Changes,\n createChangedObjects,\n DEBUG_ONLY__changesToString,\n} from \"./Changes.js\";\nimport { Entry, Layer } from \"./Layer.js\";\nimport type { ListCacheKey, ListQueryOptions } from \"./ListQuery.js\";\nimport { isListCacheKey, ListQuery } from \"./ListQuery.js\";\nimport type { ObjectCacheKey } from \"./ObjectQuery.js\";\nimport { ObjectQuery } from \"./ObjectQuery.js\";\nimport { type OptimisticId } from \"./OptimisticId.js\";\nimport { OrderByCanonicalizer } from \"./OrderByCanonicalizer.js\";\nimport type { Query } from \"./Query.js\";\nimport { RefCounts } from \"./RefCounts.js\";\nimport type { SimpleWhereClause } from \"./SimpleWhereClause.js\";\nimport { WhereClauseCanonicalizer } from \"./WhereClauseCanonicalizer.js\";\n\n/*\n Work still to do:\n - [x] testing for optimistic writes\n - [x] automatic invalidation of actions\n - [x] automatic optimistic list updates\n - [x] useOsdkObjects\n - [x] imply offline for objects passed directly\n - [x] websocket subscriptions\n - [ ] links\n - [x] add pagination\n - [ ] sub-selection support\n - [ ] interfaces\n - [ ] setup defaults\n - [ ] reduce updates in react\n*/\n\nexport interface SubjectPayload<KEY extends CacheKey> extends Entry<KEY> {\n isOptimistic: boolean;\n}\n\nexport interface BatchContext {\n changes: Changes;\n createLayerIfNeeded: () => void;\n optimisticWrite: boolean;\n\n write: <K extends CacheKey<string, any, any>>(\n k: K,\n v: Entry<K>[\"value\"],\n status: Entry<K>[\"status\"],\n ) => Entry<K>;\n\n read: <K extends CacheKey<string, any, any>>(\n k: K,\n ) => Entry<K> | undefined;\n}\n\ninterface UpdateOptions {\n optimisticId?: OptimisticId;\n}\n\nexport namespace Store {\n export interface ApplyActionOptions {\n optimisticUpdate?: (ctx: OptimisticBuilder) => void;\n }\n}\n\nfunction createInitEntry(cacheKey: CacheKey): Entry<any> {\n return {\n cacheKey,\n status: \"init\",\n value: undefined,\n lastUpdated: 0,\n };\n}\n\n/*\n Notes:\n - Subjects are one per type per store (by cache key)\n - Data is one per layer per cache key\n*/\n\nexport class Store {\n whereCanonicalizer: WhereClauseCanonicalizer = new WhereClauseCanonicalizer();\n orderByCanonicalizer: OrderByCanonicalizer = new OrderByCanonicalizer();\n #truthLayer: Layer = new Layer(undefined, undefined);\n #topLayer: Layer;\n client: Client;\n\n /** @internal */\n logger?: Logger;\n\n // we can use a regular Map here because the refCounting will\n // handle cleanup.\n #queries: Map<\n CacheKey,\n Query<any, any, any>\n > = new Map();\n\n #cacheKeyToSubject = new WeakMap<\n CacheKey<string, any, any>,\n BehaviorSubject<SubjectPayload<any>>\n >();\n #cacheKeys: CacheKeys;\n\n #refCounts = new RefCounts<CacheKey>(\n DEBUG_REFCOUNTS ? 15_000 : 60_000,\n (k) => this.#cleanupCacheKey(k),\n );\n\n // we are currently only using this for debug logging and should just remove it in the future if that\n // continues to be true\n #finalizationRegistry: FinalizationRegistry<() => void>;\n\n constructor(client: Client) {\n this.client = client;\n this.logger = client[additionalContext].logger?.child({}, {\n msgPrefix: \"Store\",\n });\n this.#topLayer = this.#truthLayer;\n this.#cacheKeys = new CacheKeys(\n this.whereCanonicalizer,\n this.orderByCanonicalizer,\n (k) => {\n if (DEBUG_REFCOUNTS) {\n const cacheKeyType = k.type;\n const otherKeys = k.otherKeys;\n // eslint-disable-next-line no-console\n console.log(\n `CacheKeys.onCreate(${cacheKeyType}, ${JSON.stringify(otherKeys)})`,\n );\n\n this.#finalizationRegistry.register(k, () => {\n // eslint-disable-next-line no-console\n console.log(\n `CacheKey Finalization(${cacheKeyType}, ${\n JSON.stringify(otherKeys)\n })`,\n );\n });\n }\n\n this.#refCounts.register(k);\n },\n );\n\n setInterval(() => {\n this.#refCounts.gc();\n }, 1000);\n\n this.#finalizationRegistry = new FinalizationRegistry<() => void>(\n (cleanupCallback) => {\n try {\n cleanupCallback();\n } catch (e) {\n // eslint-disable-next-line no-console\n console.error(\n \"Caught an error while running a finalization callback\",\n e,\n );\n }\n },\n );\n }\n\n /**\n * Called after a key is no longer retained and the timeout has elapsed\n * @param key\n */\n #cleanupCacheKey = (key: CacheKey<string, any, any>) => {\n const subject = this.peekSubject(key);\n\n if (DEBUG_REFCOUNTS) {\n // eslint-disable-next-line no-console\n console.log(\n `CacheKey cleaning up (${\n JSON.stringify({\n closed: subject?.closed,\n observed: subject?.observed,\n })\n })`,\n JSON.stringify([key.type, ...key.otherKeys], null, 2),\n );\n }\n this.#cacheKeys.remove(key);\n if (process.env.NODE_ENV !== \"production\") {\n invariant(subject);\n }\n\n if (subject) {\n subject.complete();\n this.#cacheKeyToSubject.delete(key);\n }\n\n this.#queries.get(key)?.dispose();\n this.#queries.delete(key);\n };\n\n applyAction: <Q extends ActionDefinition<any>>(\n action: Q,\n args: Parameters<ActionSignatureFromDef<Q>[\"applyAction\"]>[0],\n opts?: Store.ApplyActionOptions,\n ) => Promise<ActionEditResponse> = async (action, args, opts) => {\n return await new ActionApplication(this).applyAction(action, args, opts);\n };\n\n removeLayer(layerId: OptimisticId): void {\n invariant(\n layerId != null,\n \"undefined is the reserved layerId for the truth layer\",\n );\n // 1. collect all cache keys for a given layerId\n let currentLayer: Layer | undefined = this.#topLayer;\n const cacheKeys = new Map<CacheKey<string, any, any>, Entry<any>>();\n while (currentLayer != null && currentLayer.parentLayer != null) {\n if (currentLayer.layerId === layerId) {\n for (const [k, v] of currentLayer.entries()) {\n if (cacheKeys.has(k)) continue;\n cacheKeys.set(k, v);\n }\n }\n\n currentLayer = currentLayer.parentLayer;\n }\n\n // 2. remove the layers from the chain\n this.#topLayer = this.#topLayer.removeLayer(layerId);\n\n // 3. check each cache key to see if it is different in the new chain\n for (const [k, oldEntry] of cacheKeys) {\n const currentEntry = this.#topLayer.get(k);\n\n // 4. if different, update the subject\n if (oldEntry !== currentEntry) {\n const x = currentEntry ?? createInitEntry(k);\n // We are going to be pretty lazy here and just re-emit the value.\n // In the future it may benefit us to deep equal check her but I think\n // the subjects are effectively doing this anyway.\n this.peekSubject(k)?.next(\n {\n // eslint-disable-next-line @typescript-eslint/no-misused-spread\n ...(currentEntry ?? createInitEntry(k)),\n isOptimistic:\n currentEntry?.value !== this.#truthLayer.get(k)?.value,\n },\n );\n }\n }\n }\n\n getCacheKey<K extends CacheKey<string, any, any>>(\n type: K[\"type\"],\n ...args: K[\"__cacheKey\"][\"args\"]\n ): K {\n return this.#refCounts.register(this.#cacheKeys.get(type, ...args));\n }\n\n peekSubject = <KEY extends CacheKey<string, any, any>>(\n cacheKey: KEY,\n ):\n | BehaviorSubject<SubjectPayload<KEY>>\n | undefined =>\n {\n return this.#cacheKeyToSubject.get(cacheKey);\n };\n\n getSubject = <KEY extends CacheKey<string, any, any>>(\n cacheKey: KEY,\n ): BehaviorSubject<SubjectPayload<KEY>> => {\n let subject = this.#cacheKeyToSubject.get(cacheKey);\n if (!subject) {\n const initialValue: Entry<KEY> = this.#topLayer.get(cacheKey)\n ?? createInitEntry(cacheKey);\n\n subject = new BehaviorSubject({\n // eslint-disable-next-line @typescript-eslint/no-misused-spread\n ...initialValue,\n isOptimistic:\n initialValue.value !== this.#truthLayer.get(cacheKey)?.value,\n });\n this.#cacheKeyToSubject.set(cacheKey, subject);\n }\n\n return subject;\n };\n\n public canonicalizeWhereClause<\n T extends ObjectTypeDefinition | InterfaceDefinition,\n >(\n where: WhereClause<T>,\n ): Canonical<SimpleWhereClause> {\n return this.whereCanonicalizer.canonicalize(where);\n }\n\n public observeObject<T extends ObjectTypeDefinition | InterfaceDefinition>(\n apiName: T[\"apiName\"] | T,\n pk: PrimaryKeyType<T>,\n options: ObserveObjectOptions<T>,\n subFn: Observer<ObjectPayload>,\n ): Unsubscribable {\n if (typeof apiName !== \"string\") {\n apiName = apiName.apiName;\n }\n\n const query = this.getObjectQuery(apiName, pk);\n this.retain(query.cacheKey);\n\n if (options.mode !== \"offline\") {\n query.revalidate(options.mode === \"force\")\n .catch(e => {\n subFn.error(e);\n // we don't want observeObject() to return a promise,\n // so we settle for logging an error here instead of\n // dropping it on the floor.\n if (this.logger) {\n this.logger.error(\"Unhandled error in observeObject\", e);\n } else {\n throw e;\n }\n });\n }\n const sub = query.subscribe(subFn);\n\n return {\n unsubscribe: () => {\n sub.unsubscribe();\n this.release(query.cacheKey);\n },\n };\n }\n\n public observeList<T extends ObjectTypeDefinition | InterfaceDefinition>(\n options: ObserveListOptions<T>,\n subFn: Observer<ListPayload>,\n ): Unsubscribable {\n // the ListQuery represents the shared state of the list\n const query = this.getListQuery(\n options.type,\n options.where ?? {},\n options.orderBy ?? {},\n options,\n );\n this.retain(query.cacheKey);\n\n if (options.mode !== \"offline\") {\n query.revalidate(options.mode === \"force\").catch((x: unknown) => {\n subFn.error(x);\n });\n }\n const sub = query.subscribe(subFn);\n\n if (options.streamUpdates) {\n query.registerStreamUpdates(sub);\n }\n\n return {\n unsubscribe: () => {\n sub.unsubscribe();\n this.release(query.cacheKey);\n },\n };\n }\n\n peekQuery<K extends CacheKey>(\n cacheKey: K,\n ): K[\"__cacheKey\"][\"query\"] | undefined {\n return this.#queries.get(cacheKey) as K[\"__cacheKey\"][\"query\"] | undefined;\n }\n\n #getQuery<K extends CacheKey>(\n cacheKey: K,\n createQuery: () => K[\"__cacheKey\"][\"query\"],\n ): K[\"__cacheKey\"][\"query\"] {\n let query = this.peekQuery(cacheKey);\n if (!query) {\n query = createQuery();\n this.#queries.set(cacheKey, query);\n }\n return query;\n }\n\n public getListQuery<T extends ObjectTypeDefinition | InterfaceDefinition>(\n def: Pick<T, \"type\" | \"apiName\">,\n where: WhereClause<T>,\n orderBy: Record<string, \"asc\" | \"desc\" | undefined>,\n opts: ListQueryOptions,\n ): ListQuery {\n const { apiName, type } = def;\n\n const canonWhere = this.whereCanonicalizer.canonicalize(where);\n const canonOrderBy = this.orderByCanonicalizer.canonicalize(orderBy);\n const listCacheKey = this.getCacheKey<ListCacheKey>(\n \"list\",\n type,\n apiName,\n canonWhere,\n canonOrderBy,\n );\n\n return this.#getQuery(listCacheKey, () => {\n return new ListQuery(\n this,\n this.getSubject(listCacheKey),\n type,\n apiName,\n canonWhere,\n canonOrderBy,\n listCacheKey,\n opts,\n );\n });\n }\n\n public getObjectQuery<T extends ObjectTypeDefinition>(\n apiName: T[\"apiName\"] | T,\n pk: PrimaryKeyType<T>,\n ): ObjectQuery {\n if (typeof apiName !== \"string\") {\n apiName = apiName.apiName;\n }\n\n const objectCacheKey = this.getCacheKey<ObjectCacheKey>(\n \"object\",\n apiName,\n pk,\n );\n\n return this.#getQuery(objectCacheKey, () =>\n new ObjectQuery(\n this,\n this.getSubject(objectCacheKey),\n apiName,\n pk,\n objectCacheKey,\n { dedupeInterval: 0 },\n ));\n }\n\n public getValue<K extends CacheKey<string, any, any>>(\n cacheKey: K,\n ): Entry<K> | undefined {\n return this.#topLayer.get(cacheKey);\n }\n\n batch = <X>(\n { optimisticId, changes = createChangedObjects() }: {\n optimisticId?: OptimisticId;\n changes?: Changes;\n },\n batchFn: (batchContext: BatchContext) => X,\n ): {\n batchResult: BatchContext;\n retVal: X;\n changes: Changes;\n } => {\n invariant(\n optimisticId === undefined || !!optimisticId,\n \"optimistic must be undefined or not falsy\",\n );\n\n let needsLayer = optimisticId !== undefined;\n const batchContext: BatchContext = {\n changes,\n createLayerIfNeeded: () => {\n if (needsLayer) {\n this.#topLayer = this.#topLayer.addLayer(optimisticId);\n needsLayer = false;\n }\n },\n optimisticWrite: !!optimisticId,\n write: (cacheKey, value, status) => {\n const oldTopValue = this.#topLayer.get(cacheKey);\n\n if (optimisticId) batchContext.createLayerIfNeeded();\n\n const writeLayer = optimisticId\n ? this.#topLayer\n : this.#truthLayer;\n const newValue = new Entry(\n cacheKey,\n value,\n Date.now(),\n status,\n );\n\n writeLayer.set(cacheKey, newValue);\n\n const newTopValue = this.#topLayer.get(cacheKey);\n\n if (oldTopValue !== newTopValue) {\n this.#cacheKeyToSubject.get(cacheKey)?.next({\n // eslint-disable-next-line @typescript-eslint/no-misused-spread\n ...newValue,\n isOptimistic:\n newTopValue?.value !== this.#truthLayer.get(cacheKey)?.value,\n });\n }\n\n return newValue;\n },\n read: (cacheKey) => {\n return optimisticId\n ? this.#topLayer.get(cacheKey)\n : this.#truthLayer.get(cacheKey);\n },\n };\n\n const retVal = batchFn(batchContext);\n this.maybeRevalidateQueries(changes, optimisticId).catch(e => {\n // we don't want batch() to return a promise,\n // so we settle for logging an error here instead of\n // dropping it on the floor.\n if (this.logger) {\n this.logger.error(\"Unhandled error in batch\", e);\n } else {\n // eslint-disable-next-line no-console\n console.error(\"Unhandled error in batch\", e);\n throw e;\n }\n });\n\n return {\n batchResult: batchContext,\n retVal: retVal,\n changes: batchContext.changes,\n };\n };\n\n public invalidateObject<T extends ObjectTypeDefinition>(\n apiName: T[\"apiName\"] | T,\n pk: PrimaryKeyType<T>,\n ): Promise<unknown> {\n if (typeof apiName !== \"string\") {\n apiName = apiName.apiName;\n }\n\n return this.getObjectQuery(apiName, pk)\n .revalidate(/* force */ true);\n }\n\n async maybeRevalidateQueries(\n changes: Changes,\n optimisticId?: OptimisticId | undefined,\n ): Promise<void> {\n if (changes.isEmpty()) {\n if (process.env.NODE_ENV !== \"production\") {\n // todo\n this.logger?.child({ methodName: \"maybeRevalidateQueries\" }).debug(\n \"No changes, aborting\",\n );\n }\n return;\n }\n\n if (process.env.NODE_ENV !== \"production\") {\n // todo\n this.logger?.child({ methodName: \"maybeRevalidateQueries\" }).debug(\n DEBUG_ONLY__changesToString(changes),\n { optimisticId },\n );\n }\n\n try {\n const promises: Array<Promise<unknown>> = [];\n for (const cacheKey of this.#queries.keys()) {\n const promise = this.peekQuery(cacheKey)?.maybeUpdateAndRevalidate?.(\n changes,\n optimisticId,\n );\n if (promise) promises.push(promise);\n }\n await Promise.all(promises);\n } finally {\n if (process.env.NODE_ENV !== \"production\") {\n // todo\n this.logger?.child({ methodName: \"maybeRevalidateQueries\" }).debug(\n \"in finally\",\n DEBUG_ONLY__changesToString(changes),\n );\n }\n }\n }\n\n /**\n * @param apiName\n * @param changes The changes we know about / to update\n * @returns\n */\n public invalidateObjectType<T extends ObjectTypeDefinition>(\n apiName: T[\"apiName\"] | T,\n changes: Changes | undefined,\n ): Promise<void> {\n if (typeof apiName !== \"string\") {\n apiName = apiName.apiName;\n }\n if (process.env.NODE_ENV !== \"production\") {\n this.logger?.child({ methodName: \"invalidateObjectType\" }).info(\n changes ? DEBUG_ONLY__changesToString(changes) : void 0,\n );\n }\n\n const promises: Array<Promise<void>> = [];\n\n for (const cacheKey of this.#truthLayer.keys()) {\n if (isListCacheKey(cacheKey)) {\n if (!changes || !changes.modified.has(cacheKey)) {\n const promise = this.peekQuery(cacheKey)?.revalidate(true);\n\n if (promise) {\n promises.push(promise);\n changes?.modified.add(cacheKey);\n }\n }\n }\n }\n\n return Promise.all(promises).then(() => void 0);\n }\n\n retain(cacheKey: CacheKey<string, any, any>): void {\n this.#refCounts.retain(cacheKey);\n }\n\n release(cacheKey: CacheKey<string, any, any>): void {\n this.#refCounts.release(cacheKey);\n }\n}\n\nexport async function invalidateList<T extends ObjectTypeDefinition>(\n store: Store,\n args: {\n type: Pick<T, \"apiName\" | \"type\">;\n where?: WhereClause<T> | SimpleWhereClause;\n orderBy?: OrderBy<T>;\n },\n): Promise<void> {\n const where = store.whereCanonicalizer.canonicalize(args.where ?? {});\n const orderBy = store.orderByCanonicalizer.canonicalize(args.orderBy ?? {});\n\n const cacheKey = store.getCacheKey<ListCacheKey>(\n \"list\",\n args.type.type,\n args.type.apiName,\n where,\n orderBy as Canonical<OrderBy<T>>,\n );\n\n await store.peekQuery(cacheKey)?.revalidate(true);\n}\n"],"mappings":"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","ignoreList":[]}
|