@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.
Files changed (483) hide show
  1. package/CHANGELOG.md +282 -0
  2. package/build/browser/Client.js.map +1 -1
  3. package/build/browser/MinimalClientContext.js.map +1 -1
  4. package/build/browser/__unstable/ConjureSupport.js.map +1 -1
  5. package/build/browser/actions/ActionValidationError.js +1 -1
  6. package/build/browser/actions/ActionValidationError.js.map +1 -1
  7. package/build/browser/actions/actions.test.js +226 -87
  8. package/build/browser/actions/actions.test.js.map +1 -1
  9. package/build/browser/actions/applyAction.js +28 -16
  10. package/build/browser/actions/applyAction.js.map +1 -1
  11. package/build/browser/createClient.js +19 -8
  12. package/build/browser/createClient.js.map +1 -1
  13. package/build/browser/createClient.test.js +14 -6
  14. package/build/browser/createClient.test.js.map +1 -1
  15. package/build/browser/createMinimalClient.js +2 -2
  16. package/build/browser/createMinimalClient.js.map +1 -1
  17. package/build/browser/createMinimalClientHelper.js +25 -0
  18. package/build/browser/createMinimalClientHelper.js.map +1 -0
  19. package/build/browser/derivedProperties/createWithPropertiesObjectSet.js +36 -13
  20. package/build/browser/derivedProperties/createWithPropertiesObjectSet.js.map +1 -1
  21. package/build/browser/derivedProperties/createWithPropertiesObjectSet.test.js +133 -0
  22. package/build/browser/derivedProperties/createWithPropertiesObjectSet.test.js.map +1 -1
  23. package/build/browser/derivedProperties/derivedPropertyDefinitionFactory.js +94 -0
  24. package/build/browser/derivedProperties/derivedPropertyDefinitionFactory.js.map +1 -0
  25. package/build/browser/fetchMetadata.test.js +11 -9
  26. package/build/browser/fetchMetadata.test.js.map +1 -1
  27. package/build/browser/index.js +1 -0
  28. package/build/browser/index.js.map +1 -1
  29. package/build/browser/intellisense.test.helpers/showsObjectPropertyJsdoc.js +25 -0
  30. package/build/browser/intellisense.test.helpers/showsObjectPropertyJsdoc.js.map +1 -0
  31. package/build/browser/intellisense.test.js +17 -1
  32. package/build/browser/intellisense.test.js.map +1 -1
  33. package/build/browser/internal/conversions/modernToLegacyGroupByClause.js +7 -0
  34. package/build/browser/internal/conversions/modernToLegacyGroupByClause.js.map +1 -1
  35. package/build/browser/internal/conversions/modernToLegacyWhereClause.js +1 -1
  36. package/build/browser/internal/conversions/modernToLegacyWhereClause.js.map +1 -1
  37. package/build/browser/logger/BaseLogger.js +59 -0
  38. package/build/browser/logger/BaseLogger.js.map +1 -0
  39. package/build/browser/logger/BrowserLogger.js +67 -0
  40. package/build/browser/logger/BrowserLogger.js.map +1 -0
  41. package/build/browser/logger/MinimalLogger.js +39 -0
  42. package/build/browser/logger/MinimalLogger.js.map +1 -0
  43. package/build/browser/logger/MinimalLogger.test.js +60 -0
  44. package/build/browser/logger/MinimalLogger.test.js.map +1 -0
  45. package/build/browser/logger/TestLogger.js +56 -0
  46. package/build/browser/logger/TestLogger.js.map +1 -0
  47. package/build/browser/object/AttachmentUpload.js +3 -0
  48. package/build/browser/object/AttachmentUpload.js.map +1 -1
  49. package/build/browser/object/SimpleOsdkProperties.js +2 -0
  50. package/build/browser/object/SimpleOsdkProperties.js.map +1 -0
  51. package/build/browser/object/aggregate.test.js +12 -2
  52. package/build/browser/object/aggregate.test.js.map +1 -1
  53. package/build/browser/object/attachment.test.js +20 -7
  54. package/build/browser/object/attachment.test.js.map +1 -1
  55. package/build/browser/object/convertWireToOsdkObjects/BaseHolder.js +2 -0
  56. package/build/browser/object/convertWireToOsdkObjects/BaseHolder.js.map +1 -0
  57. package/build/browser/object/convertWireToOsdkObjects/InterfaceHolder.js.map +1 -1
  58. package/build/browser/object/convertWireToOsdkObjects/ObjectHolder.js.map +1 -1
  59. package/build/browser/object/convertWireToOsdkObjects/createOsdkInterface.js +29 -0
  60. package/build/browser/object/convertWireToOsdkObjects/createOsdkInterface.js.map +1 -1
  61. package/build/browser/object/convertWireToOsdkObjects/createOsdkObject.js +53 -35
  62. package/build/browser/object/convertWireToOsdkObjects/createOsdkObject.js.map +1 -1
  63. package/build/browser/object/convertWireToOsdkObjects/getDollarAs.js.map +1 -1
  64. package/build/browser/object/convertWireToOsdkObjects/getDollarLink.js.map +1 -1
  65. package/build/browser/object/convertWireToOsdkObjects.js +10 -11
  66. package/build/browser/object/convertWireToOsdkObjects.js.map +1 -1
  67. package/build/browser/object/convertWireToOsdkObjects.test.js +46 -36
  68. package/build/browser/object/convertWireToOsdkObjects.test.js.map +1 -1
  69. package/build/browser/object/fetchPage.js +17 -4
  70. package/build/browser/object/fetchPage.js.map +1 -1
  71. package/build/browser/object/fetchPage.test.js +56 -2
  72. package/build/browser/object/fetchPage.test.js.map +1 -1
  73. package/build/browser/object/geotimeseriesreference.test.js +56 -134
  74. package/build/browser/object/geotimeseriesreference.test.js.map +1 -1
  75. package/build/browser/object/media.test.js +19 -14
  76. package/build/browser/object/media.test.js.map +1 -1
  77. package/build/browser/object/object.test.js +182 -66
  78. package/build/browser/object/object.test.js.map +1 -1
  79. package/build/browser/object/timeseries.test.js +119 -85
  80. package/build/browser/object/timeseries.test.js.map +1 -1
  81. package/build/browser/objectSet/InterfaceObjectSet.test.js +37 -17
  82. package/build/browser/objectSet/InterfaceObjectSet.test.js.map +1 -1
  83. package/build/browser/objectSet/ObjectSet.test.js +212 -114
  84. package/build/browser/objectSet/ObjectSet.test.js.map +1 -1
  85. package/build/browser/objectSet/ObjectSetListenerWebsocket.js +20 -16
  86. package/build/browser/objectSet/ObjectSetListenerWebsocket.js.map +1 -1
  87. package/build/browser/objectSet/ObjectSetListenerWebsocket.test.js +21 -12
  88. package/build/browser/objectSet/ObjectSetListenerWebsocket.test.js.map +1 -1
  89. package/build/browser/objectSet/createObjectSet.js +2 -1
  90. package/build/browser/objectSet/createObjectSet.js.map +1 -1
  91. package/build/browser/observable/ListPayload.js.map +1 -1
  92. package/build/browser/observable/ObjectPayload.js.map +1 -1
  93. package/build/browser/observable/ObservableClient.js.map +1 -1
  94. package/build/browser/observable/OptimisticBuilder.js.map +1 -1
  95. package/build/browser/observable/internal/ActionApplication.js +102 -0
  96. package/build/browser/observable/internal/ActionApplication.js.map +1 -0
  97. package/build/browser/observable/internal/BulkObjectLoader.js +93 -0
  98. package/build/browser/observable/internal/BulkObjectLoader.js.map +1 -0
  99. package/build/browser/observable/internal/BulkObjectLoader.test.js +112 -0
  100. package/build/browser/observable/internal/BulkObjectLoader.test.js.map +1 -0
  101. package/build/browser/observable/internal/CacheKey.js +38 -1
  102. package/build/browser/observable/internal/CacheKey.js.map +1 -1
  103. package/build/browser/observable/internal/CacheKeys.js +4 -4
  104. package/build/browser/observable/internal/CacheKeys.js.map +1 -1
  105. package/build/browser/observable/internal/Changes.js +58 -0
  106. package/build/browser/observable/internal/Changes.js.map +1 -0
  107. package/build/browser/observable/internal/Layer.js +6 -3
  108. package/build/browser/observable/internal/Layer.js.map +1 -1
  109. package/build/browser/observable/internal/ListQuery.js +495 -129
  110. package/build/browser/observable/internal/ListQuery.js.map +1 -1
  111. package/build/browser/observable/internal/ObjectQuery.js +40 -14
  112. package/build/browser/observable/internal/ObjectQuery.js.map +1 -1
  113. package/build/browser/observable/internal/ObservableClientImpl.js +4 -12
  114. package/build/browser/observable/internal/ObservableClientImpl.js.map +1 -1
  115. package/build/browser/observable/internal/OptimisticJob.js +30 -29
  116. package/build/browser/observable/internal/OptimisticJob.js.map +1 -1
  117. package/build/browser/observable/internal/OrderByCanonicalizer.js +73 -0
  118. package/build/browser/observable/internal/OrderByCanonicalizer.js.map +1 -0
  119. package/build/browser/observable/internal/OrderByCanonicalizer.test.js +78 -0
  120. package/build/browser/observable/internal/OrderByCanonicalizer.test.js.map +1 -0
  121. package/build/browser/observable/internal/Query.js +79 -6
  122. package/build/browser/observable/internal/Query.js.map +1 -1
  123. package/build/browser/observable/internal/RefCounts.js +7 -2
  124. package/build/browser/observable/internal/RefCounts.js.map +1 -1
  125. package/build/browser/observable/internal/SimpleWhereClause.js +2 -0
  126. package/build/browser/observable/internal/SimpleWhereClause.js.map +1 -0
  127. package/build/browser/observable/internal/Store.js +140 -190
  128. package/build/browser/observable/internal/Store.js.map +1 -1
  129. package/build/browser/observable/internal/Store.test.js +666 -300
  130. package/build/browser/observable/internal/Store.test.js.map +1 -1
  131. package/build/browser/observable/internal/WhereClauseCanonicalizer.js +11 -3
  132. package/build/browser/observable/internal/WhereClauseCanonicalizer.js.map +1 -1
  133. package/build/browser/observable/internal/objectMatchesWhereClause.js +0 -4
  134. package/build/browser/observable/internal/objectMatchesWhereClause.js.map +1 -1
  135. package/build/browser/observable/internal/objectMatchesWhereClause.test.js.map +1 -1
  136. package/build/browser/observable/internal/testUtils.js +222 -19
  137. package/build/browser/observable/internal/testUtils.js.map +1 -1
  138. package/build/browser/ontology/StandardOntologyProvider.test.js +17 -16
  139. package/build/browser/ontology/StandardOntologyProvider.test.js.map +1 -1
  140. package/build/browser/ontology/loadFullObjectMetadata.js +0 -1
  141. package/build/browser/ontology/loadFullObjectMetadata.js.map +1 -1
  142. package/build/browser/public/internal.js +2 -0
  143. package/build/browser/public/internal.js.map +1 -1
  144. package/build/browser/public/unstable-do-not-use.js +1 -0
  145. package/build/browser/public/unstable-do-not-use.js.map +1 -1
  146. package/build/browser/public-utils/osdkConfig.js +49 -0
  147. package/build/browser/public-utils/osdkConfig.js.map +1 -0
  148. package/build/{esm/observable/internal/ChangedObjects.js → browser/public-utils/vite-env.d.ts} +2 -7
  149. package/build/browser/queries/applyQuery.js +34 -2
  150. package/build/browser/queries/applyQuery.js.map +1 -1
  151. package/build/browser/queries/queries.test.js +36 -13
  152. package/build/browser/queries/queries.test.js.map +1 -1
  153. package/build/browser/queries/types.js.map +1 -1
  154. package/build/browser/tsserver.js.map +1 -1
  155. package/build/browser/util/UserAgent.js +1 -1
  156. package/build/browser/util/UserAgent.js.map +1 -1
  157. package/build/browser/util/extractRdpDefinition.js +140 -0
  158. package/build/browser/util/extractRdpDefinition.js.map +1 -0
  159. package/build/browser/util/extractRdpDefinition.test.js +233 -0
  160. package/build/browser/util/extractRdpDefinition.test.js.map +1 -0
  161. package/build/browser/{observable/internal/ChangedObjects.js → util/isPoint.js} +3 -7
  162. package/build/browser/util/isPoint.js.map +1 -0
  163. package/build/browser/util/objectSpecifierUtils.js +48 -0
  164. package/build/browser/util/objectSpecifierUtils.js.map +1 -0
  165. package/build/browser/util/objectSpecifierUtils.test.js +42 -0
  166. package/build/browser/util/objectSpecifierUtils.test.js.map +1 -0
  167. package/build/browser/util/toDataValue.js +14 -2
  168. package/build/browser/util/toDataValue.js.map +1 -1
  169. package/build/browser/util/toDataValue.test.js +37 -16
  170. package/build/browser/util/toDataValue.test.js.map +1 -1
  171. package/build/browser/util/toDataValueQueries.js +25 -2
  172. package/build/browser/util/toDataValueQueries.js.map +1 -1
  173. package/build/cjs/{Client-C8K3E1vH.d.cts → Client-CgL2LKN9.d.cts} +7 -8
  174. package/build/cjs/{chunk-T5UE6BI7.cjs → chunk-33GHS3X4.cjs} +256 -80
  175. package/build/cjs/chunk-33GHS3X4.cjs.map +1 -0
  176. package/build/cjs/{chunk-X7WGNFZ4.cjs → chunk-37QC7LR3.cjs} +173 -34
  177. package/build/cjs/chunk-37QC7LR3.cjs.map +1 -0
  178. package/build/cjs/chunk-T4NIFYZS.cjs +14 -0
  179. package/build/cjs/chunk-T4NIFYZS.cjs.map +1 -0
  180. package/build/cjs/index.cjs +298 -177
  181. package/build/cjs/index.cjs.map +1 -1
  182. package/build/cjs/index.d.cts +14 -22
  183. package/build/cjs/public/internal.cjs +61 -7
  184. package/build/cjs/public/internal.cjs.map +1 -1
  185. package/build/cjs/public/internal.d.cts +50 -3
  186. package/build/cjs/public/unstable-do-not-use.cjs +1181 -527
  187. package/build/cjs/public/unstable-do-not-use.cjs.map +1 -1
  188. package/build/cjs/public/unstable-do-not-use.d.cts +44 -25
  189. package/build/esm/Client.js.map +1 -1
  190. package/build/esm/MinimalClientContext.js.map +1 -1
  191. package/build/esm/__unstable/ConjureSupport.js.map +1 -1
  192. package/build/esm/actions/ActionValidationError.js +1 -1
  193. package/build/esm/actions/ActionValidationError.js.map +1 -1
  194. package/build/esm/actions/actions.test.js +226 -87
  195. package/build/esm/actions/actions.test.js.map +1 -1
  196. package/build/esm/actions/applyAction.js +28 -16
  197. package/build/esm/actions/applyAction.js.map +1 -1
  198. package/build/esm/createClient.js +19 -8
  199. package/build/esm/createClient.js.map +1 -1
  200. package/build/esm/createClient.test.js +14 -6
  201. package/build/esm/createClient.test.js.map +1 -1
  202. package/build/esm/createMinimalClient.js +2 -2
  203. package/build/esm/createMinimalClient.js.map +1 -1
  204. package/build/esm/createMinimalClientHelper.js +25 -0
  205. package/build/esm/createMinimalClientHelper.js.map +1 -0
  206. package/build/esm/derivedProperties/createWithPropertiesObjectSet.js +36 -13
  207. package/build/esm/derivedProperties/createWithPropertiesObjectSet.js.map +1 -1
  208. package/build/esm/derivedProperties/createWithPropertiesObjectSet.test.js +133 -0
  209. package/build/esm/derivedProperties/createWithPropertiesObjectSet.test.js.map +1 -1
  210. package/build/esm/derivedProperties/derivedPropertyDefinitionFactory.js +94 -0
  211. package/build/esm/derivedProperties/derivedPropertyDefinitionFactory.js.map +1 -0
  212. package/build/esm/fetchMetadata.test.js +11 -9
  213. package/build/esm/fetchMetadata.test.js.map +1 -1
  214. package/build/esm/index.js +1 -0
  215. package/build/esm/index.js.map +1 -1
  216. package/build/esm/intellisense.test.helpers/showsObjectPropertyJsdoc.js +25 -0
  217. package/build/esm/intellisense.test.helpers/showsObjectPropertyJsdoc.js.map +1 -0
  218. package/build/esm/intellisense.test.js +17 -1
  219. package/build/esm/intellisense.test.js.map +1 -1
  220. package/build/esm/internal/conversions/modernToLegacyGroupByClause.js +7 -0
  221. package/build/esm/internal/conversions/modernToLegacyGroupByClause.js.map +1 -1
  222. package/build/esm/internal/conversions/modernToLegacyWhereClause.js +1 -1
  223. package/build/esm/internal/conversions/modernToLegacyWhereClause.js.map +1 -1
  224. package/build/esm/logger/BaseLogger.js +59 -0
  225. package/build/esm/logger/BaseLogger.js.map +1 -0
  226. package/build/esm/logger/BrowserLogger.js +67 -0
  227. package/build/esm/logger/BrowserLogger.js.map +1 -0
  228. package/build/esm/logger/MinimalLogger.js +39 -0
  229. package/build/esm/logger/MinimalLogger.js.map +1 -0
  230. package/build/esm/logger/MinimalLogger.test.js +60 -0
  231. package/build/esm/logger/MinimalLogger.test.js.map +1 -0
  232. package/build/esm/logger/TestLogger.js +56 -0
  233. package/build/esm/logger/TestLogger.js.map +1 -0
  234. package/build/esm/object/AttachmentUpload.js +3 -0
  235. package/build/esm/object/AttachmentUpload.js.map +1 -1
  236. package/build/esm/object/SimpleOsdkProperties.js +2 -0
  237. package/build/esm/object/SimpleOsdkProperties.js.map +1 -0
  238. package/build/esm/object/aggregate.test.js +12 -2
  239. package/build/esm/object/aggregate.test.js.map +1 -1
  240. package/build/esm/object/attachment.test.js +20 -7
  241. package/build/esm/object/attachment.test.js.map +1 -1
  242. package/build/esm/object/convertWireToOsdkObjects/BaseHolder.js +2 -0
  243. package/build/esm/object/convertWireToOsdkObjects/BaseHolder.js.map +1 -0
  244. package/build/esm/object/convertWireToOsdkObjects/InterfaceHolder.js.map +1 -1
  245. package/build/esm/object/convertWireToOsdkObjects/ObjectHolder.js.map +1 -1
  246. package/build/esm/object/convertWireToOsdkObjects/createOsdkInterface.js +29 -0
  247. package/build/esm/object/convertWireToOsdkObjects/createOsdkInterface.js.map +1 -1
  248. package/build/esm/object/convertWireToOsdkObjects/createOsdkObject.js +53 -35
  249. package/build/esm/object/convertWireToOsdkObjects/createOsdkObject.js.map +1 -1
  250. package/build/esm/object/convertWireToOsdkObjects/getDollarAs.js.map +1 -1
  251. package/build/esm/object/convertWireToOsdkObjects/getDollarLink.js.map +1 -1
  252. package/build/esm/object/convertWireToOsdkObjects.js +10 -11
  253. package/build/esm/object/convertWireToOsdkObjects.js.map +1 -1
  254. package/build/esm/object/convertWireToOsdkObjects.test.js +46 -36
  255. package/build/esm/object/convertWireToOsdkObjects.test.js.map +1 -1
  256. package/build/esm/object/fetchPage.js +17 -4
  257. package/build/esm/object/fetchPage.js.map +1 -1
  258. package/build/esm/object/fetchPage.test.js +56 -2
  259. package/build/esm/object/fetchPage.test.js.map +1 -1
  260. package/build/esm/object/geotimeseriesreference.test.js +56 -134
  261. package/build/esm/object/geotimeseriesreference.test.js.map +1 -1
  262. package/build/esm/object/media.test.js +19 -14
  263. package/build/esm/object/media.test.js.map +1 -1
  264. package/build/esm/object/object.test.js +182 -66
  265. package/build/esm/object/object.test.js.map +1 -1
  266. package/build/esm/object/timeseries.test.js +119 -85
  267. package/build/esm/object/timeseries.test.js.map +1 -1
  268. package/build/esm/objectSet/InterfaceObjectSet.test.js +37 -17
  269. package/build/esm/objectSet/InterfaceObjectSet.test.js.map +1 -1
  270. package/build/esm/objectSet/ObjectSet.test.js +212 -114
  271. package/build/esm/objectSet/ObjectSet.test.js.map +1 -1
  272. package/build/esm/objectSet/ObjectSetListenerWebsocket.js +20 -16
  273. package/build/esm/objectSet/ObjectSetListenerWebsocket.js.map +1 -1
  274. package/build/esm/objectSet/ObjectSetListenerWebsocket.test.js +21 -12
  275. package/build/esm/objectSet/ObjectSetListenerWebsocket.test.js.map +1 -1
  276. package/build/esm/objectSet/createObjectSet.js +2 -1
  277. package/build/esm/objectSet/createObjectSet.js.map +1 -1
  278. package/build/esm/observable/ListPayload.js.map +1 -1
  279. package/build/esm/observable/ObjectPayload.js.map +1 -1
  280. package/build/esm/observable/ObservableClient.js.map +1 -1
  281. package/build/esm/observable/OptimisticBuilder.js.map +1 -1
  282. package/build/esm/observable/internal/ActionApplication.js +102 -0
  283. package/build/esm/observable/internal/ActionApplication.js.map +1 -0
  284. package/build/esm/observable/internal/BulkObjectLoader.js +93 -0
  285. package/build/esm/observable/internal/BulkObjectLoader.js.map +1 -0
  286. package/build/esm/observable/internal/BulkObjectLoader.test.js +112 -0
  287. package/build/esm/observable/internal/BulkObjectLoader.test.js.map +1 -0
  288. package/build/esm/observable/internal/CacheKey.js +38 -1
  289. package/build/esm/observable/internal/CacheKey.js.map +1 -1
  290. package/build/esm/observable/internal/CacheKeys.js +4 -4
  291. package/build/esm/observable/internal/CacheKeys.js.map +1 -1
  292. package/build/esm/observable/internal/Changes.js +58 -0
  293. package/build/esm/observable/internal/Changes.js.map +1 -0
  294. package/build/esm/observable/internal/Layer.js +6 -3
  295. package/build/esm/observable/internal/Layer.js.map +1 -1
  296. package/build/esm/observable/internal/ListQuery.js +495 -129
  297. package/build/esm/observable/internal/ListQuery.js.map +1 -1
  298. package/build/esm/observable/internal/ObjectQuery.js +40 -14
  299. package/build/esm/observable/internal/ObjectQuery.js.map +1 -1
  300. package/build/esm/observable/internal/ObservableClientImpl.js +4 -12
  301. package/build/esm/observable/internal/ObservableClientImpl.js.map +1 -1
  302. package/build/esm/observable/internal/OptimisticJob.js +30 -29
  303. package/build/esm/observable/internal/OptimisticJob.js.map +1 -1
  304. package/build/esm/observable/internal/OrderByCanonicalizer.js +73 -0
  305. package/build/esm/observable/internal/OrderByCanonicalizer.js.map +1 -0
  306. package/build/esm/observable/internal/OrderByCanonicalizer.test.js +78 -0
  307. package/build/esm/observable/internal/OrderByCanonicalizer.test.js.map +1 -0
  308. package/build/esm/observable/internal/Query.js +79 -6
  309. package/build/esm/observable/internal/Query.js.map +1 -1
  310. package/build/esm/observable/internal/RefCounts.js +7 -2
  311. package/build/esm/observable/internal/RefCounts.js.map +1 -1
  312. package/build/esm/observable/internal/SimpleWhereClause.js +2 -0
  313. package/build/esm/observable/internal/SimpleWhereClause.js.map +1 -0
  314. package/build/esm/observable/internal/Store.js +140 -190
  315. package/build/esm/observable/internal/Store.js.map +1 -1
  316. package/build/esm/observable/internal/Store.test.js +666 -300
  317. package/build/esm/observable/internal/Store.test.js.map +1 -1
  318. package/build/esm/observable/internal/WhereClauseCanonicalizer.js +11 -3
  319. package/build/esm/observable/internal/WhereClauseCanonicalizer.js.map +1 -1
  320. package/build/esm/observable/internal/objectMatchesWhereClause.js +0 -4
  321. package/build/esm/observable/internal/objectMatchesWhereClause.js.map +1 -1
  322. package/build/esm/observable/internal/objectMatchesWhereClause.test.js.map +1 -1
  323. package/build/esm/observable/internal/testUtils.js +222 -19
  324. package/build/esm/observable/internal/testUtils.js.map +1 -1
  325. package/build/esm/ontology/StandardOntologyProvider.test.js +17 -16
  326. package/build/esm/ontology/StandardOntologyProvider.test.js.map +1 -1
  327. package/build/esm/ontology/loadFullObjectMetadata.js +0 -1
  328. package/build/esm/ontology/loadFullObjectMetadata.js.map +1 -1
  329. package/build/esm/public/internal.js +2 -0
  330. package/build/esm/public/internal.js.map +1 -1
  331. package/build/esm/public/unstable-do-not-use.js +1 -0
  332. package/build/esm/public/unstable-do-not-use.js.map +1 -1
  333. package/build/esm/public-utils/osdkConfig.js +49 -0
  334. package/build/esm/public-utils/osdkConfig.js.map +1 -0
  335. package/build/esm/public-utils/vite-env.d.ts +19 -0
  336. package/build/esm/queries/applyQuery.js +34 -2
  337. package/build/esm/queries/applyQuery.js.map +1 -1
  338. package/build/esm/queries/queries.test.js +36 -13
  339. package/build/esm/queries/queries.test.js.map +1 -1
  340. package/build/esm/queries/types.js.map +1 -1
  341. package/build/esm/tsserver.js.map +1 -1
  342. package/build/esm/util/UserAgent.js +1 -1
  343. package/build/esm/util/UserAgent.js.map +1 -1
  344. package/build/esm/util/extractRdpDefinition.js +140 -0
  345. package/build/esm/util/extractRdpDefinition.js.map +1 -0
  346. package/build/esm/util/extractRdpDefinition.test.js +233 -0
  347. package/build/esm/util/extractRdpDefinition.test.js.map +1 -0
  348. package/build/esm/util/isPoint.js +20 -0
  349. package/build/esm/util/isPoint.js.map +1 -0
  350. package/build/esm/util/objectSpecifierUtils.js +48 -0
  351. package/build/esm/util/objectSpecifierUtils.js.map +1 -0
  352. package/build/esm/util/objectSpecifierUtils.test.js +42 -0
  353. package/build/esm/util/objectSpecifierUtils.test.js.map +1 -0
  354. package/build/esm/util/toDataValue.js +14 -2
  355. package/build/esm/util/toDataValue.js.map +1 -1
  356. package/build/esm/util/toDataValue.test.js +37 -16
  357. package/build/esm/util/toDataValue.test.js.map +1 -1
  358. package/build/esm/util/toDataValueQueries.js +25 -2
  359. package/build/esm/util/toDataValueQueries.js.map +1 -1
  360. package/build/types/Client.d.ts +1 -1
  361. package/build/types/Client.d.ts.map +1 -1
  362. package/build/types/MinimalClientContext.d.ts +1 -1
  363. package/build/types/MinimalClientContext.d.ts.map +1 -1
  364. package/build/types/__unstable/ConjureSupport.d.ts +2 -2
  365. package/build/types/actions/applyAction.d.ts +1 -2
  366. package/build/types/actions/applyAction.d.ts.map +1 -1
  367. package/build/types/createClient.d.ts +1 -1
  368. package/build/types/createClient.d.ts.map +1 -1
  369. package/build/types/createClient.test.d.ts +2 -1
  370. package/build/types/createClient.test.d.ts.map +1 -1
  371. package/build/types/createMinimalClientHelper.d.ts +1 -0
  372. package/build/types/createMinimalClientHelper.d.ts.map +1 -0
  373. package/build/types/derivedProperties/derivedPropertyDefinitionFactory.d.ts +1 -0
  374. package/build/types/derivedProperties/derivedPropertyDefinitionFactory.d.ts.map +1 -0
  375. package/build/types/index.d.ts +5 -5
  376. package/build/types/index.d.ts.map +1 -1
  377. package/build/types/intellisense.test.helpers/showsObjectPropertyJsdoc.d.ts +1 -0
  378. package/build/types/intellisense.test.helpers/showsObjectPropertyJsdoc.d.ts.map +1 -0
  379. package/build/types/logger/BaseLogger.d.ts +33 -0
  380. package/build/types/logger/BaseLogger.d.ts.map +1 -0
  381. package/build/types/logger/BrowserLogger.d.ts +9 -0
  382. package/build/types/logger/BrowserLogger.d.ts.map +1 -0
  383. package/build/types/logger/MinimalLogger.d.ts +9 -0
  384. package/build/types/logger/MinimalLogger.d.ts.map +1 -0
  385. package/build/types/logger/MinimalLogger.test.d.ts +1 -0
  386. package/build/types/logger/MinimalLogger.test.d.ts.map +1 -0
  387. package/build/types/logger/TestLogger.d.ts +14 -0
  388. package/build/types/logger/TestLogger.d.ts.map +1 -0
  389. package/build/types/object/AttachmentUpload.d.ts +3 -0
  390. package/build/types/object/AttachmentUpload.d.ts.map +1 -1
  391. package/build/types/object/SimpleOsdkProperties.d.ts +1 -0
  392. package/build/types/object/SimpleOsdkProperties.d.ts.map +1 -0
  393. package/build/types/object/convertWireToOsdkObjects/BaseHolder.d.ts +1 -0
  394. package/build/types/object/convertWireToOsdkObjects/BaseHolder.d.ts.map +1 -0
  395. package/build/types/object/convertWireToOsdkObjects.d.ts +8 -1
  396. package/build/types/object/convertWireToOsdkObjects.d.ts.map +1 -1
  397. package/build/types/object/fetchPage.d.ts.map +1 -1
  398. package/build/types/object/object.test.d.ts.map +1 -1
  399. package/build/types/objectSet/ObjectSet.test.d.ts.map +1 -1
  400. package/build/types/observable/ListPayload.d.ts +5 -9
  401. package/build/types/observable/ListPayload.d.ts.map +1 -1
  402. package/build/types/observable/ObjectPayload.d.ts +4 -7
  403. package/build/types/observable/ObjectPayload.d.ts.map +1 -1
  404. package/build/types/observable/ObservableClient.d.ts +33 -10
  405. package/build/types/observable/ObservableClient.d.ts.map +1 -1
  406. package/build/types/observable/OptimisticBuilder.d.ts +1 -1
  407. package/build/types/observable/OptimisticBuilder.d.ts.map +1 -1
  408. package/build/types/observable/internal/ActionApplication.d.ts +9 -0
  409. package/build/types/observable/internal/ActionApplication.d.ts.map +1 -0
  410. package/build/types/observable/internal/BulkObjectLoader.d.ts +8 -0
  411. package/build/types/observable/internal/BulkObjectLoader.d.ts.map +1 -0
  412. package/build/types/observable/internal/BulkObjectLoader.test.d.ts +1 -0
  413. package/build/types/observable/internal/BulkObjectLoader.test.d.ts.map +1 -0
  414. package/build/types/observable/internal/CacheKeys.d.ts +2 -1
  415. package/build/types/observable/internal/CacheKeys.d.ts.map +1 -1
  416. package/build/types/observable/internal/Changes.d.ts +15 -0
  417. package/build/types/observable/internal/Changes.d.ts.map +1 -0
  418. package/build/types/observable/internal/Layer.d.ts +2 -1
  419. package/build/types/observable/internal/Layer.d.ts.map +1 -1
  420. package/build/types/observable/internal/ListQuery.d.ts +69 -23
  421. package/build/types/observable/internal/ListQuery.d.ts.map +1 -1
  422. package/build/types/observable/internal/ObjectQuery.d.ts +8 -9
  423. package/build/types/observable/internal/ObjectQuery.d.ts.map +1 -1
  424. package/build/types/observable/internal/OptimisticJob.d.ts +2 -2
  425. package/build/types/observable/internal/OptimisticJob.d.ts.map +1 -1
  426. package/build/types/observable/internal/OrderByCanonicalizer.d.ts +12 -0
  427. package/build/types/observable/internal/OrderByCanonicalizer.d.ts.map +1 -0
  428. package/build/types/observable/internal/OrderByCanonicalizer.test.d.ts +1 -0
  429. package/build/types/observable/internal/OrderByCanonicalizer.test.d.ts.map +1 -0
  430. package/build/types/observable/internal/Query.d.ts +45 -9
  431. package/build/types/observable/internal/Query.d.ts.map +1 -1
  432. package/build/types/observable/internal/RefCounts.d.ts.map +1 -1
  433. package/build/types/observable/internal/SimpleWhereClause.d.ts +2 -0
  434. package/build/types/observable/internal/SimpleWhereClause.d.ts.map +1 -0
  435. package/build/types/observable/internal/Store.d.ts +34 -30
  436. package/build/types/observable/internal/Store.d.ts.map +1 -1
  437. package/build/types/observable/internal/WhereClauseCanonicalizer.d.ts +2 -1
  438. package/build/types/observable/internal/WhereClauseCanonicalizer.d.ts.map +1 -1
  439. package/build/types/observable/internal/objectMatchesWhereClause.d.ts +4 -2
  440. package/build/types/observable/internal/objectMatchesWhereClause.d.ts.map +1 -1
  441. package/build/types/observable/internal/testUtils.d.ts +48 -9
  442. package/build/types/observable/internal/testUtils.d.ts.map +1 -1
  443. package/build/types/public/internal.d.ts +2 -0
  444. package/build/types/public/internal.d.ts.map +1 -1
  445. package/build/types/public/unstable-do-not-use.d.ts +4 -5
  446. package/build/types/public/unstable-do-not-use.d.ts.map +1 -1
  447. package/build/types/public-utils/osdkConfig.d.ts +8 -0
  448. package/build/types/public-utils/osdkConfig.d.ts.map +1 -0
  449. package/build/types/public-utils/vite-env.d.d.ts +3 -0
  450. package/build/types/public-utils/vite-env.d.d.ts.map +1 -0
  451. package/build/types/queries/applyQuery.d.ts +4 -2
  452. package/build/types/queries/applyQuery.d.ts.map +1 -1
  453. package/build/types/queries/types.d.ts +1 -1
  454. package/build/types/queries/types.d.ts.map +1 -1
  455. package/build/types/tsserver.d.ts +1 -1
  456. package/build/types/tsserver.d.ts.map +1 -1
  457. package/build/types/util/extractRdpDefinition.d.ts +4 -0
  458. package/build/types/util/extractRdpDefinition.d.ts.map +1 -0
  459. package/build/types/util/extractRdpDefinition.test.d.ts +1 -0
  460. package/build/types/util/extractRdpDefinition.test.d.ts.map +1 -0
  461. package/build/types/util/isPoint.d.ts +1 -0
  462. package/build/types/util/isPoint.d.ts.map +1 -0
  463. package/build/types/util/objectSpecifierUtils.d.ts +24 -0
  464. package/build/types/util/objectSpecifierUtils.d.ts.map +1 -0
  465. package/build/types/util/objectSpecifierUtils.test.d.ts +1 -0
  466. package/build/types/util/objectSpecifierUtils.test.d.ts.map +1 -0
  467. package/package.json +20 -16
  468. package/build/browser/Logger.js +0 -2
  469. package/build/browser/Logger.js.map +0 -1
  470. package/build/browser/observable/internal/ChangedObjects.js.map +0 -1
  471. package/build/cjs/chunk-Q7SFCCGT.cjs +0 -11
  472. package/build/cjs/chunk-Q7SFCCGT.cjs.map +0 -1
  473. package/build/cjs/chunk-T5UE6BI7.cjs.map +0 -1
  474. package/build/cjs/chunk-X7WGNFZ4.cjs.map +0 -1
  475. package/build/cjs/graphql-JJX5MZPQ.cjs +0 -10491
  476. package/build/cjs/graphql-JJX5MZPQ.cjs.map +0 -1
  477. package/build/esm/Logger.js +0 -2
  478. package/build/esm/Logger.js.map +0 -1
  479. package/build/esm/observable/internal/ChangedObjects.js.map +0 -1
  480. package/build/types/Logger.d.ts +0 -18
  481. package/build/types/Logger.d.ts.map +0 -1
  482. package/build/types/observable/internal/ChangedObjects.d.ts +0 -7
  483. 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 "./ChangedObjects.js";
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 { runOptimisticJob } from "./OptimisticJob.js";
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
- - [ ] websocket subscriptions
38
+ - [x] websocket subscriptions
39
39
  - [ ] links
40
- - [ ] add pagination
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
- #queries = new WeakMap();
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.#refCounts.retain(query.cacheKey);
201
+ this.retain(query.cacheKey);
187
202
  if (options.mode !== "offline") {
188
- void query.revalidate(options.mode === "force");
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.#refCounts.release(query.cacheKey);
219
+ this.release(query.cacheKey);
197
220
  }
198
221
  };
199
222
  }
200
- observeList(apiName, where, options, subFn) {
201
- if (typeof apiName !== "string") {
202
- apiName = apiName.apiName;
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
- void query.revalidate(options.mode === "force");
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.#refCounts.release(query.cacheKey);
239
+ this.release(query.cacheKey);
216
240
  }
217
241
  };
218
242
  }
219
- #peekQuery(cacheKey) {
243
+ peekQuery(cacheKey) {
220
244
  return this.#queries.get(cacheKey);
221
245
  }
222
246
  #getQuery(cacheKey, createQuery) {
223
- let query = this.#peekQuery(cacheKey);
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(apiName, where, opts, peek = false) {
231
- if (typeof apiName !== "string") {
232
- apiName = apiName.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 listCacheKey = this.getCacheKey("list", apiName, canonWhere);
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
- getObject(apiName, pk) {
250
- if (typeof apiName !== "string") {
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
- addedObjects: new Set(),
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
- maybeUpdateLists(changes, optimisticId) {
327
- for (const [cacheKey, v] of this.#truthLayer.entries()) {
328
- if (isListCacheKey(cacheKey)) {
329
- // fixme promise
330
- void this.#peekQuery(cacheKey)?.maybeUpdate(changes, optimisticId);
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
- invalidateObjectType(apiName) {
335
- if (typeof apiName !== "string") {
336
- apiName = apiName.apiName;
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
- for (const [cacheKey, v] of this.#truthLayer.entries()) {
339
- if (isListCacheKey(cacheKey, apiName)) {
340
- void this.#peekQuery(cacheKey)?.revalidate(true);
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
- invalidateList(apiName, where) {
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
- const cacheKey = this.getCacheKey("list", apiName, where);
349
- void this.#peekQuery(cacheKey)?.revalidate(true);
350
- }
351
- updateObject(apiName, value, {
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 query = this.getObjectQuery(apiName, value.$primaryKey);
358
- return this.batch({
359
- optimisticId
360
- }, batch => {
361
- return query.writeToStore(value, "loaded", batch);
362
- }).retVal.value;
363
- }
364
- updateList(apiName, where, values, {
365
- optimisticId
366
- } = {}, opts = {
367
- dedupeInterval: 0
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
- const query = this.getListQuery(apiName, where, opts);
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
- class ActionApplication {
387
- constructor(store) {
388
- this.store = store;
389
- }
390
- applyAction = (action, args, {
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":[]}