@osdk/client 2.5.0-beta.1 → 2.5.0-beta.2

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 (293) hide show
  1. package/CHANGELOG.md +26 -0
  2. package/build/browser/Client.js +1 -1
  3. package/build/browser/Client.js.map +1 -1
  4. package/build/browser/intellisense.test.helpers/orderBySuggestionIsRight.js +8 -1
  5. package/build/browser/intellisense.test.helpers/orderBySuggestionIsRight.js.map +1 -1
  6. package/build/browser/intellisense.test.js +14 -4
  7. package/build/browser/intellisense.test.js.map +1 -1
  8. package/build/browser/object/Cache.js +1 -1
  9. package/build/browser/object/Cache.js.map +1 -1
  10. package/build/browser/object/SimpleCache.js +1 -1
  11. package/build/browser/object/SimpleCache.js.map +1 -1
  12. package/build/browser/object/convertWireToOsdkObjects.js +4 -0
  13. package/build/browser/object/convertWireToOsdkObjects.js.map +1 -1
  14. package/build/browser/object/fetchPage.js +8 -4
  15. package/build/browser/object/fetchPage.js.map +1 -1
  16. package/build/browser/object/geotimeseriesreference.test.js +0 -2
  17. package/build/browser/object/geotimeseriesreference.test.js.map +1 -1
  18. package/build/browser/objectSet/createObjectSet.js +3 -1
  19. package/build/browser/objectSet/createObjectSet.js.map +1 -1
  20. package/build/browser/observable/LinkPayload.js +2 -0
  21. package/build/browser/observable/LinkPayload.js.map +1 -0
  22. package/build/browser/observable/ObjectPayload.js.map +1 -1
  23. package/build/browser/observable/ObservableClient/ObserveLink.js +17 -0
  24. package/build/browser/observable/ObservableClient/ObserveLink.js.map +1 -0
  25. package/build/browser/observable/ObservableClient/common.js +2 -0
  26. package/build/browser/observable/ObservableClient/common.js.map +1 -0
  27. package/build/browser/observable/ObservableClient.js +20 -0
  28. package/build/browser/observable/ObservableClient.js.map +1 -1
  29. package/build/browser/observable/Unsubscribable.js +2 -0
  30. package/build/browser/observable/Unsubscribable.js.map +1 -0
  31. package/build/browser/observable/internal/AbstractHelper.js +50 -0
  32. package/build/browser/observable/internal/AbstractHelper.js.map +1 -0
  33. package/build/browser/observable/internal/BaseCollectionQuery.js +2 -0
  34. package/build/browser/observable/internal/BaseCollectionQuery.js.map +1 -0
  35. package/build/browser/observable/internal/BulkObjectLoader.js +3 -3
  36. package/build/browser/observable/internal/BulkObjectLoader.js.map +1 -1
  37. package/build/browser/observable/internal/CacheKeys.js +17 -2
  38. package/build/browser/observable/internal/CacheKeys.js.map +1 -1
  39. package/build/browser/observable/internal/Changes.js +6 -0
  40. package/build/browser/observable/internal/Changes.js.map +1 -1
  41. package/build/browser/observable/internal/KnownCacheKey.js +2 -0
  42. package/build/browser/observable/internal/KnownCacheKey.js.map +1 -0
  43. package/build/browser/observable/internal/Layer.js.map +1 -1
  44. package/build/browser/observable/internal/ListCacheKey.js +2 -0
  45. package/build/browser/observable/internal/ListCacheKey.js.map +1 -0
  46. package/build/browser/observable/internal/ListQuery.js +399 -161
  47. package/build/browser/observable/internal/ListQuery.js.map +1 -1
  48. package/build/browser/observable/internal/ObjectQuery.js +27 -2
  49. package/build/browser/observable/internal/ObjectQuery.js.map +1 -1
  50. package/build/browser/observable/internal/ObservableClientImpl.js +42 -2
  51. package/build/browser/observable/internal/ObservableClientImpl.js.map +1 -1
  52. package/build/browser/observable/internal/OptimisticJob.js +12 -3
  53. package/build/browser/observable/internal/OptimisticJob.js.map +1 -1
  54. package/build/browser/observable/internal/Query.js +17 -3
  55. package/build/browser/observable/internal/Query.js.map +1 -1
  56. package/build/browser/observable/internal/QuerySubscription.js +41 -0
  57. package/build/browser/observable/internal/QuerySubscription.js.map +1 -0
  58. package/build/browser/observable/internal/Store.invalidation.test.js +481 -0
  59. package/build/browser/observable/internal/Store.invalidation.test.js.map +1 -0
  60. package/build/browser/observable/internal/Store.js +38 -91
  61. package/build/browser/observable/internal/Store.js.map +1 -1
  62. package/build/browser/observable/internal/Store.test.js +318 -63
  63. package/build/browser/observable/internal/Store.test.js.map +1 -1
  64. package/build/browser/observable/internal/UnsubscribableWrapper.js +30 -0
  65. package/build/browser/observable/internal/UnsubscribableWrapper.js.map +1 -0
  66. package/build/browser/observable/internal/createCollectionConnectable.js +50 -0
  67. package/build/browser/observable/internal/createCollectionConnectable.js.map +1 -0
  68. package/build/browser/observable/internal/createCollectionConnectable.test.js +599 -0
  69. package/build/browser/observable/internal/createCollectionConnectable.test.js.map +1 -0
  70. package/build/browser/observable/internal/getObjectTypesThatInvalidate.js +216 -0
  71. package/build/browser/observable/internal/getObjectTypesThatInvalidate.js.map +1 -0
  72. package/build/browser/observable/internal/getObjectTypesThatInvalidate.test.js +382 -0
  73. package/build/browser/observable/internal/getObjectTypesThatInvalidate.test.js.map +1 -0
  74. package/build/browser/observable/internal/isObjectInstance.js +23 -0
  75. package/build/browser/observable/internal/isObjectInstance.js.map +1 -0
  76. package/build/browser/observable/internal/links/LinksHelper.js +37 -0
  77. package/build/browser/observable/internal/links/LinksHelper.js.map +1 -0
  78. package/build/browser/observable/internal/links/SpecificLinkCacheKey.js +2 -0
  79. package/build/browser/observable/internal/links/SpecificLinkCacheKey.js.map +1 -0
  80. package/build/browser/observable/internal/links/SpecificLinkQuery.js +185 -0
  81. package/build/browser/observable/internal/links/SpecificLinkQuery.js.map +1 -0
  82. package/build/browser/observable/internal/list/ListsHelper.js +49 -0
  83. package/build/browser/observable/internal/list/ListsHelper.js.map +1 -0
  84. package/build/browser/observable/internal/object/ObjectsHelper.js +34 -0
  85. package/build/browser/observable/internal/object/ObjectsHelper.js.map +1 -0
  86. package/build/browser/observable/internal/removeDuplicates.js +36 -0
  87. package/build/browser/observable/internal/removeDuplicates.js.map +1 -0
  88. package/build/browser/observable/internal/sorting/SortingStrategy.js +78 -0
  89. package/build/browser/observable/internal/sorting/SortingStrategy.js.map +1 -0
  90. package/build/browser/observable/internal/testUtils/invalidateList.js +23 -0
  91. package/build/browser/observable/internal/testUtils/invalidateList.js.map +1 -0
  92. package/build/browser/observable/internal/testUtils/observeLink/expectStandardObserveLink.js +69 -0
  93. package/build/browser/observable/internal/testUtils/observeLink/expectStandardObserveLink.js.map +1 -0
  94. package/build/browser/observable/internal/testUtils/observeObject/expectStandardObserveObject.js +56 -0
  95. package/build/browser/observable/internal/testUtils/observeObject/expectStandardObserveObject.js.map +1 -0
  96. package/build/browser/observable/internal/testUtils.js +70 -7
  97. package/build/browser/observable/internal/testUtils.js.map +1 -1
  98. package/build/browser/public/unstable-do-not-use.js.map +1 -1
  99. package/build/browser/util/UserAgent.js +2 -2
  100. package/build/browser/util/streamutils.js +1 -1
  101. package/build/browser/util/streamutils.js.map +1 -1
  102. package/build/cjs/{chunk-URDXPIRU.cjs → chunk-N5DMNYGH.cjs} +58 -54
  103. package/build/cjs/chunk-N5DMNYGH.cjs.map +1 -0
  104. package/build/cjs/{chunk-BJYCRD5Y.cjs → chunk-NWD33DSJ.cjs} +23 -19
  105. package/build/cjs/chunk-NWD33DSJ.cjs.map +1 -0
  106. package/build/cjs/index.cjs +7 -7
  107. package/build/cjs/public/internal.cjs +8 -8
  108. package/build/cjs/public/unstable-do-not-use.cjs +779 -268
  109. package/build/cjs/public/unstable-do-not-use.cjs.map +1 -1
  110. package/build/cjs/public/unstable-do-not-use.d.cts +161 -12
  111. package/build/esm/Client.js +1 -1
  112. package/build/esm/Client.js.map +1 -1
  113. package/build/esm/intellisense.test.helpers/orderBySuggestionIsRight.js +8 -1
  114. package/build/esm/intellisense.test.helpers/orderBySuggestionIsRight.js.map +1 -1
  115. package/build/esm/intellisense.test.js +14 -4
  116. package/build/esm/intellisense.test.js.map +1 -1
  117. package/build/esm/object/Cache.js +1 -1
  118. package/build/esm/object/Cache.js.map +1 -1
  119. package/build/esm/object/SimpleCache.js +1 -1
  120. package/build/esm/object/SimpleCache.js.map +1 -1
  121. package/build/esm/object/convertWireToOsdkObjects.js +4 -0
  122. package/build/esm/object/convertWireToOsdkObjects.js.map +1 -1
  123. package/build/esm/object/fetchPage.js +8 -4
  124. package/build/esm/object/fetchPage.js.map +1 -1
  125. package/build/esm/object/geotimeseriesreference.test.js +0 -2
  126. package/build/esm/object/geotimeseriesreference.test.js.map +1 -1
  127. package/build/esm/objectSet/createObjectSet.js +3 -1
  128. package/build/esm/objectSet/createObjectSet.js.map +1 -1
  129. package/build/esm/observable/LinkPayload.js +2 -0
  130. package/build/esm/observable/LinkPayload.js.map +1 -0
  131. package/build/esm/observable/ObjectPayload.js.map +1 -1
  132. package/build/esm/observable/ObservableClient/ObserveLink.js +17 -0
  133. package/build/esm/observable/ObservableClient/ObserveLink.js.map +1 -0
  134. package/build/esm/observable/ObservableClient/common.js +2 -0
  135. package/build/esm/observable/ObservableClient/common.js.map +1 -0
  136. package/build/esm/observable/ObservableClient.js +20 -0
  137. package/build/esm/observable/ObservableClient.js.map +1 -1
  138. package/build/esm/observable/Unsubscribable.js +2 -0
  139. package/build/esm/observable/Unsubscribable.js.map +1 -0
  140. package/build/esm/observable/internal/AbstractHelper.js +50 -0
  141. package/build/esm/observable/internal/AbstractHelper.js.map +1 -0
  142. package/build/esm/observable/internal/BaseCollectionQuery.js +2 -0
  143. package/build/esm/observable/internal/BaseCollectionQuery.js.map +1 -0
  144. package/build/esm/observable/internal/BulkObjectLoader.js +3 -3
  145. package/build/esm/observable/internal/BulkObjectLoader.js.map +1 -1
  146. package/build/esm/observable/internal/CacheKeys.js +17 -2
  147. package/build/esm/observable/internal/CacheKeys.js.map +1 -1
  148. package/build/esm/observable/internal/Changes.js +6 -0
  149. package/build/esm/observable/internal/Changes.js.map +1 -1
  150. package/build/esm/observable/internal/KnownCacheKey.js +2 -0
  151. package/build/esm/observable/internal/KnownCacheKey.js.map +1 -0
  152. package/build/esm/observable/internal/Layer.js.map +1 -1
  153. package/build/esm/observable/internal/ListCacheKey.js +2 -0
  154. package/build/esm/observable/internal/ListCacheKey.js.map +1 -0
  155. package/build/esm/observable/internal/ListQuery.js +399 -161
  156. package/build/esm/observable/internal/ListQuery.js.map +1 -1
  157. package/build/esm/observable/internal/ObjectQuery.js +27 -2
  158. package/build/esm/observable/internal/ObjectQuery.js.map +1 -1
  159. package/build/esm/observable/internal/ObservableClientImpl.js +42 -2
  160. package/build/esm/observable/internal/ObservableClientImpl.js.map +1 -1
  161. package/build/esm/observable/internal/OptimisticJob.js +12 -3
  162. package/build/esm/observable/internal/OptimisticJob.js.map +1 -1
  163. package/build/esm/observable/internal/Query.js +17 -3
  164. package/build/esm/observable/internal/Query.js.map +1 -1
  165. package/build/esm/observable/internal/QuerySubscription.js +41 -0
  166. package/build/esm/observable/internal/QuerySubscription.js.map +1 -0
  167. package/build/esm/observable/internal/Store.invalidation.test.js +481 -0
  168. package/build/esm/observable/internal/Store.invalidation.test.js.map +1 -0
  169. package/build/esm/observable/internal/Store.js +38 -91
  170. package/build/esm/observable/internal/Store.js.map +1 -1
  171. package/build/esm/observable/internal/Store.test.js +318 -63
  172. package/build/esm/observable/internal/Store.test.js.map +1 -1
  173. package/build/esm/observable/internal/UnsubscribableWrapper.js +30 -0
  174. package/build/esm/observable/internal/UnsubscribableWrapper.js.map +1 -0
  175. package/build/esm/observable/internal/createCollectionConnectable.js +50 -0
  176. package/build/esm/observable/internal/createCollectionConnectable.js.map +1 -0
  177. package/build/esm/observable/internal/createCollectionConnectable.test.js +599 -0
  178. package/build/esm/observable/internal/createCollectionConnectable.test.js.map +1 -0
  179. package/build/esm/observable/internal/getObjectTypesThatInvalidate.js +216 -0
  180. package/build/esm/observable/internal/getObjectTypesThatInvalidate.js.map +1 -0
  181. package/build/esm/observable/internal/getObjectTypesThatInvalidate.test.js +382 -0
  182. package/build/esm/observable/internal/getObjectTypesThatInvalidate.test.js.map +1 -0
  183. package/build/esm/observable/internal/isObjectInstance.js +23 -0
  184. package/build/esm/observable/internal/isObjectInstance.js.map +1 -0
  185. package/build/esm/observable/internal/links/LinksHelper.js +37 -0
  186. package/build/esm/observable/internal/links/LinksHelper.js.map +1 -0
  187. package/build/esm/observable/internal/links/SpecificLinkCacheKey.js +2 -0
  188. package/build/esm/observable/internal/links/SpecificLinkCacheKey.js.map +1 -0
  189. package/build/esm/observable/internal/links/SpecificLinkQuery.js +185 -0
  190. package/build/esm/observable/internal/links/SpecificLinkQuery.js.map +1 -0
  191. package/build/esm/observable/internal/list/ListsHelper.js +49 -0
  192. package/build/esm/observable/internal/list/ListsHelper.js.map +1 -0
  193. package/build/esm/observable/internal/object/ObjectsHelper.js +34 -0
  194. package/build/esm/observable/internal/object/ObjectsHelper.js.map +1 -0
  195. package/build/esm/observable/internal/removeDuplicates.js +36 -0
  196. package/build/esm/observable/internal/removeDuplicates.js.map +1 -0
  197. package/build/esm/observable/internal/sorting/SortingStrategy.js +78 -0
  198. package/build/esm/observable/internal/sorting/SortingStrategy.js.map +1 -0
  199. package/build/esm/observable/internal/testUtils/invalidateList.js +23 -0
  200. package/build/esm/observable/internal/testUtils/invalidateList.js.map +1 -0
  201. package/build/esm/observable/internal/testUtils/observeLink/expectStandardObserveLink.js +69 -0
  202. package/build/esm/observable/internal/testUtils/observeLink/expectStandardObserveLink.js.map +1 -0
  203. package/build/esm/observable/internal/testUtils/observeObject/expectStandardObserveObject.js +56 -0
  204. package/build/esm/observable/internal/testUtils/observeObject/expectStandardObserveObject.js.map +1 -0
  205. package/build/esm/observable/internal/testUtils.js +70 -7
  206. package/build/esm/observable/internal/testUtils.js.map +1 -1
  207. package/build/esm/public/unstable-do-not-use.js.map +1 -1
  208. package/build/esm/util/UserAgent.js +2 -2
  209. package/build/esm/util/streamutils.js +1 -1
  210. package/build/esm/util/streamutils.js.map +1 -1
  211. package/build/types/Client.d.ts +1 -1
  212. package/build/types/object/fetchPage.d.ts.map +1 -1
  213. package/build/types/observable/LinkPayload.d.ts +9 -0
  214. package/build/types/observable/LinkPayload.d.ts.map +1 -0
  215. package/build/types/observable/ObjectPayload.d.ts +4 -0
  216. package/build/types/observable/ObjectPayload.d.ts.map +1 -1
  217. package/build/types/observable/ObservableClient/ObserveLink.d.ts +32 -0
  218. package/build/types/observable/ObservableClient/ObserveLink.d.ts.map +1 -0
  219. package/build/types/observable/ObservableClient/common.d.ts +67 -0
  220. package/build/types/observable/ObservableClient/common.d.ts.map +1 -0
  221. package/build/types/observable/ObservableClient.d.ts +82 -15
  222. package/build/types/observable/ObservableClient.d.ts.map +1 -1
  223. package/build/types/observable/Unsubscribable.d.ts +3 -0
  224. package/build/types/observable/Unsubscribable.d.ts.map +1 -0
  225. package/build/types/observable/internal/AbstractHelper.d.ts +15 -0
  226. package/build/types/observable/internal/AbstractHelper.d.ts.map +1 -0
  227. package/build/types/observable/internal/BaseCollectionQuery.d.ts +64 -0
  228. package/build/types/observable/internal/BaseCollectionQuery.d.ts.map +1 -0
  229. package/build/types/observable/internal/BulkObjectLoader.d.ts.map +1 -1
  230. package/build/types/observable/internal/CacheKeys.d.ts +10 -4
  231. package/build/types/observable/internal/CacheKeys.d.ts.map +1 -1
  232. package/build/types/observable/internal/Changes.d.ts +7 -4
  233. package/build/types/observable/internal/Changes.d.ts.map +1 -1
  234. package/build/types/observable/internal/KnownCacheKey.d.ts +4 -0
  235. package/build/types/observable/internal/KnownCacheKey.d.ts.map +1 -0
  236. package/build/types/observable/internal/Layer.d.ts +7 -7
  237. package/build/types/observable/internal/Layer.d.ts.map +1 -1
  238. package/build/types/observable/internal/ListCacheKey.d.ts +7 -0
  239. package/build/types/observable/internal/ListCacheKey.d.ts.map +1 -0
  240. package/build/types/observable/internal/ListQuery.d.ts +160 -21
  241. package/build/types/observable/internal/ListQuery.d.ts.map +1 -1
  242. package/build/types/observable/internal/ObjectQuery.d.ts +3 -1
  243. package/build/types/observable/internal/ObjectQuery.d.ts.map +1 -1
  244. package/build/types/observable/internal/OptimisticJob.d.ts.map +1 -1
  245. package/build/types/observable/internal/Query.d.ts +6 -5
  246. package/build/types/observable/internal/Query.d.ts.map +1 -1
  247. package/build/types/observable/internal/QuerySubscription.d.ts +1 -0
  248. package/build/types/observable/internal/QuerySubscription.d.ts.map +1 -0
  249. package/build/types/observable/internal/Store.d.ts +34 -31
  250. package/build/types/observable/internal/Store.d.ts.map +1 -1
  251. package/build/types/observable/internal/Store.invalidation.test.d.ts +1 -0
  252. package/build/types/observable/internal/Store.invalidation.test.d.ts.map +1 -0
  253. package/build/types/observable/internal/Store.test.d.ts +4 -1
  254. package/build/types/observable/internal/Store.test.d.ts.map +1 -1
  255. package/build/types/observable/internal/UnsubscribableWrapper.d.ts +1 -0
  256. package/build/types/observable/internal/UnsubscribableWrapper.d.ts.map +1 -0
  257. package/build/types/observable/internal/createCollectionConnectable.d.ts +38 -0
  258. package/build/types/observable/internal/createCollectionConnectable.d.ts.map +1 -0
  259. package/build/types/observable/internal/createCollectionConnectable.test.d.ts +1 -0
  260. package/build/types/observable/internal/createCollectionConnectable.test.d.ts.map +1 -0
  261. package/build/types/observable/internal/getObjectTypesThatInvalidate.d.ts +9 -0
  262. package/build/types/observable/internal/getObjectTypesThatInvalidate.d.ts.map +1 -0
  263. package/build/types/observable/internal/getObjectTypesThatInvalidate.test.d.ts +1 -0
  264. package/build/types/observable/internal/getObjectTypesThatInvalidate.test.d.ts.map +1 -0
  265. package/build/types/observable/internal/isObjectInstance.d.ts +5 -0
  266. package/build/types/observable/internal/isObjectInstance.d.ts.map +1 -0
  267. package/build/types/observable/internal/links/LinksHelper.d.ts +29 -0
  268. package/build/types/observable/internal/links/LinksHelper.d.ts.map +1 -0
  269. package/build/types/observable/internal/links/SpecificLinkCacheKey.d.ts +17 -0
  270. package/build/types/observable/internal/links/SpecificLinkCacheKey.d.ts.map +1 -0
  271. package/build/types/observable/internal/links/SpecificLinkQuery.d.ts +45 -0
  272. package/build/types/observable/internal/links/SpecificLinkQuery.d.ts.map +1 -0
  273. package/build/types/observable/internal/list/ListsHelper.d.ts +17 -0
  274. package/build/types/observable/internal/list/ListsHelper.d.ts.map +1 -0
  275. package/build/types/observable/internal/object/ObjectsHelper.d.ts +11 -0
  276. package/build/types/observable/internal/object/ObjectsHelper.d.ts.map +1 -0
  277. package/build/types/observable/internal/removeDuplicates.d.ts +11 -0
  278. package/build/types/observable/internal/removeDuplicates.d.ts.map +1 -0
  279. package/build/types/observable/internal/sorting/SortingStrategy.d.ts +41 -0
  280. package/build/types/observable/internal/sorting/SortingStrategy.d.ts.map +1 -0
  281. package/build/types/observable/internal/testUtils/invalidateList.d.ts +9 -0
  282. package/build/types/observable/internal/testUtils/invalidateList.d.ts.map +1 -0
  283. package/build/types/observable/internal/testUtils/observeLink/expectStandardObserveLink.d.ts +46 -0
  284. package/build/types/observable/internal/testUtils/observeLink/expectStandardObserveLink.d.ts.map +1 -0
  285. package/build/types/observable/internal/testUtils/observeObject/expectStandardObserveObject.d.ts +26 -0
  286. package/build/types/observable/internal/testUtils/observeObject/expectStandardObserveObject.d.ts.map +1 -0
  287. package/build/types/observable/internal/testUtils.d.ts +25 -3
  288. package/build/types/observable/internal/testUtils.d.ts.map +1 -1
  289. package/build/types/public/unstable-do-not-use.d.ts +4 -2
  290. package/build/types/public/unstable-do-not-use.d.ts.map +1 -1
  291. package/package.json +10 -10
  292. package/build/cjs/chunk-BJYCRD5Y.cjs.map +0 -1
  293. package/build/cjs/chunk-URDXPIRU.cjs.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Store.invalidation.test.js","names":["Employee","Office","Todo","FauxFoundry","ontologies","startNodeApiServer","stubData","invariant","beforeAll","beforeEach","describe","expect","it","vi","createClient","TestLogger","Store","createDefer","mockListSubCallback","updateList","expectStandardObserveLink","expectStandardObserveObject","defer","logger","EMPLOYEE_1_ID","EMPLOYEE_2_ID","OFFICE_1_ID","OFFICE_2_ID","TODO_1_ID","TODO_2_ID","client","cache","fauxFoundry","setupOntology","fauxOntology","getDefaultOntology","addEmployeeOntology","registerObjectType","todoWithLinkTypes","registerActionType","editTodo","actionTypeV2","b","payload","id","other","parameters","modifyObject","apiName","setupTestObjects","dataStore","getDefaultDataStore","emp1","registerObject","employeeId","fullName","emp2","office1","officeId","name","office2","todo1","$apiName","text","todo2","registerLink","testSetup","apiServer","close","resetAllMocks","undefined","emp1Payload","subFn","empSubFn","type","primaryKey","object","process","env","NODE_ENV","office1Payload","officeSubFn","next","mockClear","invalidateObjectType","Promise","resolve","setTimeout","toHaveBeenCalled","not","todo1Payload","todoSubFn","fetchOne","where","orderBy","empListSubFn","lists","observe","mode","officeListSubFn","linkSubFn","officeLinkSubFn","store","srcObject","srcLinkName","targetType","expected","objectContaining","$primaryKey","todoListSubFn","employeeOfficeLinkSubFn","officeOccupantsLinkSubFn"],"sources":["Store.invalidation.test.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 { Employee, Office, Todo } from \"@osdk/client.test.ontology\";\nimport {\n FauxFoundry,\n ontologies,\n startNodeApiServer,\n stubData,\n} from \"@osdk/shared.test\";\nimport invariant from \"tiny-invariant\";\nimport { beforeAll, beforeEach, describe, expect, it, vi } from \"vitest\";\nimport { createClient } from \"../../createClient.js\";\nimport { TestLogger } from \"../../logger/TestLogger.js\";\nimport { Store } from \"./Store.js\";\nimport { createDefer, mockListSubCallback, updateList } from \"./testUtils.js\";\nimport { expectStandardObserveLink } from \"./testUtils/observeLink/expectStandardObserveLink.js\";\nimport { expectStandardObserveObject } from \"./testUtils/observeObject/expectStandardObserveObject.js\";\n\n// Defer utility to track subscriptions for cleanup\nconst defer = createDefer();\n\n// Logger setup\nconst logger = new TestLogger({}, {\n // level: \"debug\",\n});\n\n// Constants for test objects\nconst EMPLOYEE_1_ID = 1;\nconst EMPLOYEE_2_ID = 2;\nconst OFFICE_1_ID = \"101\";\nconst OFFICE_2_ID = \"102\";\nconst TODO_1_ID = 201;\nconst TODO_2_ID = 202;\n\ndescribe(\"Store Invalidation Type Isolation\", () => {\n let client: ReturnType<typeof createClient>;\n let cache: Store;\n let fauxFoundry: FauxFoundry;\n\n function setupOntology(fauxFoundry: FauxFoundry) {\n const fauxOntology = fauxFoundry.getDefaultOntology();\n ontologies.addEmployeeOntology(fauxOntology);\n\n fauxFoundry.getDefaultOntology().registerObjectType(\n stubData.todoWithLinkTypes,\n );\n\n fauxFoundry.getDefaultOntology().registerActionType(\n stubData.editTodo.actionTypeV2,\n (b, payload) => {\n const { id, ...other } = payload.parameters;\n b.modifyObject<Todo>(Todo.apiName, id, { ...other });\n },\n );\n }\n\n function setupTestObjects(fauxFoundry: FauxFoundry) {\n const dataStore = fauxFoundry.getDefaultDataStore();\n\n // Create Employees\n const emp1 = dataStore.registerObject(Employee, {\n employeeId: EMPLOYEE_1_ID,\n fullName: \"Employee One\",\n });\n\n const emp2 = dataStore.registerObject(Employee, {\n employeeId: EMPLOYEE_2_ID,\n fullName: \"Employee Two\",\n });\n\n // Create Offices\n const office1 = dataStore.registerObject(Office, {\n officeId: OFFICE_1_ID,\n name: \"Office One\",\n });\n\n const office2 = dataStore.registerObject(Office, {\n officeId: OFFICE_2_ID,\n name: \"Office Two\",\n });\n\n // Create Todos\n const todo1 = dataStore.registerObject(Todo, {\n $apiName: \"Todo\",\n id: TODO_1_ID,\n text: \"Todo One\",\n });\n\n const todo2 = dataStore.registerObject(Todo, {\n $apiName: \"Todo\",\n id: TODO_2_ID,\n text: \"Todo Two\",\n });\n\n // Link employees to offices\n dataStore.registerLink(emp1, \"officeLink\", office1, \"occupants\");\n dataStore.registerLink(emp2, \"officeLink\", office2, \"occupants\");\n\n // Link employees to todos (we're not using these links in this test, but showing different link patterns)\n // Note: There are no direct Todo-Employee links in the test ontology\n }\n\n beforeAll(async () => {\n // Set up the mock environment and client\n const testSetup = startNodeApiServer(\n new FauxFoundry(\"https://stack.palantir.com/\"),\n createClient,\n { logger },\n );\n ({ client, fauxFoundry } = testSetup);\n\n // Set up the test ontology and data\n setupOntology(fauxFoundry);\n setupTestObjects(fauxFoundry);\n\n return () => {\n testSetup.apiServer.close();\n };\n });\n\n beforeEach(() => {\n vi.resetAllMocks();\n cache = new Store(client);\n return () => {\n cache = undefined!;\n };\n });\n\n describe(\"Object Type Isolation\", () => {\n it(\"invalidating Employee type should not affect Office objects\", async () => {\n // Set up observations for an Employee and Office object\n const { payload: emp1Payload, subFn: empSubFn } =\n await expectStandardObserveObject({\n cache,\n type: Employee,\n primaryKey: EMPLOYEE_1_ID,\n });\n const emp1 = emp1Payload?.object;\n invariant(emp1);\n\n const { payload: office1Payload, subFn: officeSubFn } =\n await expectStandardObserveObject({\n cache,\n type: Office,\n primaryKey: OFFICE_1_ID,\n });\n const office1 = office1Payload?.object;\n invariant(office1);\n\n // Clear the initial calls\n empSubFn.next.mockClear();\n officeSubFn.next.mockClear();\n\n // Invalidate only the Employee type\n await cache.invalidateObjectType(Employee, undefined);\n\n // Allow time for any potential updates\n await new Promise(resolve => setTimeout(resolve, 500));\n\n // Employee should be updated\n expect(empSubFn.next).toHaveBeenCalled();\n\n // Office object should NOT receive any updates\n expect(officeSubFn.next).not.toHaveBeenCalled();\n });\n\n it(\"invalidating Office type should not affect Employee objects\", async () => {\n // Set up observations for an Employee and Office object\n const { payload: emp1Payload, subFn: empSubFn } =\n await expectStandardObserveObject({\n cache,\n type: Employee,\n primaryKey: EMPLOYEE_1_ID,\n });\n const emp1 = emp1Payload?.object;\n invariant(emp1);\n\n const { payload: office1Payload, subFn: officeSubFn } =\n await expectStandardObserveObject({\n cache,\n type: Office,\n primaryKey: OFFICE_1_ID,\n });\n const office1 = office1Payload?.object;\n invariant(office1);\n\n // Clear the initial calls\n empSubFn.next.mockClear();\n officeSubFn.next.mockClear();\n\n // Invalidate only the Office type\n await cache.invalidateObjectType(Office, undefined);\n\n // Allow time for any potential updates\n await new Promise(resolve => setTimeout(resolve, 500));\n\n // Office should be updated\n expect(officeSubFn.next).toHaveBeenCalled();\n\n // Employee object should NOT receive any updates\n expect(empSubFn.next).not.toHaveBeenCalled();\n });\n\n it(\"invalidating Todo type should not affect Employee or Office objects\", async () => {\n // Set up observations for Employee, Office, and Todo objects\n const { payload: emp1Payload, subFn: empSubFn } =\n await expectStandardObserveObject({\n cache,\n type: Employee,\n primaryKey: EMPLOYEE_1_ID,\n });\n const emp1 = emp1Payload?.object;\n invariant(emp1);\n\n const { payload: office1Payload, subFn: officeSubFn } =\n await expectStandardObserveObject({\n cache,\n type: Office,\n primaryKey: OFFICE_1_ID,\n });\n const office1 = office1Payload?.object;\n invariant(office1);\n\n const { payload: todo1Payload, subFn: todoSubFn } =\n await expectStandardObserveObject({\n cache,\n type: Todo,\n primaryKey: TODO_1_ID,\n });\n const todo1 = todo1Payload?.object;\n invariant(todo1);\n\n // Clear the initial calls\n empSubFn.next.mockClear();\n officeSubFn.next.mockClear();\n todoSubFn.next.mockClear();\n\n // Invalidate only the Todo type\n await cache.invalidateObjectType(Todo, undefined);\n\n // Allow time for any potential updates\n await new Promise(resolve => setTimeout(resolve, 500));\n\n // Todo should be updated\n expect(todoSubFn.next).toHaveBeenCalled();\n\n // Employee and Office objects should NOT receive any updates\n expect(empSubFn.next).not.toHaveBeenCalled();\n expect(officeSubFn.next).not.toHaveBeenCalled();\n });\n });\n\n describe(\"List Query Isolation\", () => {\n it(\"invalidating Employee type should only affect Employee lists\", async () => {\n // Pre-seed the cache with lists - need to fetch the objects first to get proper instances\n const emp1 = await client(Employee).fetchOne(EMPLOYEE_1_ID);\n const emp2 = await client(Employee).fetchOne(EMPLOYEE_2_ID);\n const office1 = await client(Office).fetchOne(OFFICE_1_ID);\n const office2 = await client(Office).fetchOne(OFFICE_2_ID);\n\n updateList(cache, { type: Employee, where: {}, orderBy: {} }, [\n emp1,\n emp2,\n ]);\n updateList(cache, { type: Office, where: {}, orderBy: {} }, [\n office1,\n office2,\n ]);\n\n // Set up list observations\n const empListSubFn = mockListSubCallback();\n defer(cache.lists.observe({\n type: Employee,\n where: {},\n orderBy: {},\n mode: \"offline\",\n }, empListSubFn));\n\n const officeListSubFn = mockListSubCallback();\n defer(cache.lists.observe({\n type: Office,\n where: {},\n orderBy: {},\n mode: \"offline\",\n }, officeListSubFn));\n\n // Wait for the initial calls and clear them\n await new Promise(resolve => setTimeout(resolve, 100));\n empListSubFn.next.mockClear();\n officeListSubFn.next.mockClear();\n\n // Invalidate only the Employee type\n await cache.invalidateObjectType(Employee, undefined);\n\n // Allow time for any potential updates\n await new Promise(resolve => setTimeout(resolve, 500));\n\n // Employee list should be updated\n expect(empListSubFn.next).toHaveBeenCalled();\n\n // Office list should NOT be invalidated\n expect(officeListSubFn.next).not.toHaveBeenCalled();\n });\n });\n\n describe(\"Link Query Isolation\", () => {\n it(\"basic source object filtering works for direct invalidation\", async () => {\n // Get an Office object that has Employee occupants\n const { payload: office1Payload, subFn: officeSubFn } =\n await expectStandardObserveObject({\n cache,\n type: Office,\n primaryKey: OFFICE_1_ID,\n });\n const office1 = office1Payload?.object;\n invariant(office1);\n\n // Get an Employee object\n const { payload: emp1Payload, subFn: empSubFn } =\n await expectStandardObserveObject({\n cache,\n type: Employee,\n primaryKey: EMPLOYEE_1_ID,\n });\n const emp1 = emp1Payload?.object;\n invariant(emp1);\n\n // Set up observation of Employee -> Office link\n const { linkSubFn: officeLinkSubFn } = await expectStandardObserveLink({\n store: cache,\n srcObject: emp1,\n srcLinkName: \"officeLink\",\n targetType: Office,\n expected: [expect.objectContaining({ $primaryKey: OFFICE_1_ID })],\n });\n\n // Clear initial calls\n officeSubFn.next.mockClear();\n empSubFn.next.mockClear();\n officeLinkSubFn.next.mockClear();\n\n // Invalidate the Employee type\n await cache.invalidateObjectType(Employee, undefined);\n\n // Allow time for any potential updates\n await new Promise(resolve => setTimeout(resolve, 500));\n\n // Employee object should be invalidated\n expect(empSubFn.next).toHaveBeenCalled();\n\n // Employee -> Office link (with Employee source) should be invalidated\n // because its source is an Employee object\n expect(officeLinkSubFn.next).toHaveBeenCalled();\n });\n });\n\n describe(\"Complex Multi-Type Scenario\", () => {\n it(\"should correctly isolate invalidation across multiple related objects\", async () => {\n // Set up observations for all three object types\n const { payload: emp1Payload, subFn: empSubFn } =\n await expectStandardObserveObject({\n cache,\n type: Employee,\n primaryKey: EMPLOYEE_1_ID,\n });\n const emp1 = emp1Payload?.object;\n invariant(emp1);\n\n const { payload: office1Payload, subFn: officeSubFn } =\n await expectStandardObserveObject({\n cache,\n type: Office,\n primaryKey: OFFICE_1_ID,\n });\n const office1 = office1Payload?.object;\n invariant(office1);\n\n const { payload: todo1Payload, subFn: todoSubFn } =\n await expectStandardObserveObject({\n cache,\n type: Todo,\n primaryKey: TODO_1_ID,\n });\n const todo1 = todo1Payload?.object;\n invariant(todo1);\n\n // Set up list observations\n const empListSubFn = mockListSubCallback();\n defer(cache.lists.observe({\n type: Employee,\n where: {},\n orderBy: {},\n mode: \"offline\",\n }, empListSubFn));\n\n const officeListSubFn = mockListSubCallback();\n defer(cache.lists.observe({\n type: Office,\n where: {},\n orderBy: {},\n mode: \"offline\",\n }, officeListSubFn));\n\n const todoListSubFn = mockListSubCallback();\n defer(cache.lists.observe({\n type: Todo,\n where: {},\n orderBy: {},\n mode: \"offline\",\n }, todoListSubFn));\n\n // Set up link observations\n const { linkSubFn: employeeOfficeLinkSubFn } =\n await expectStandardObserveLink({\n store: cache,\n srcObject: emp1,\n srcLinkName: \"officeLink\",\n targetType: Office,\n expected: [expect.objectContaining({ $primaryKey: OFFICE_1_ID })],\n });\n\n // Setup another link observation for the test\n const { linkSubFn: officeOccupantsLinkSubFn } =\n await expectStandardObserveLink({\n store: cache,\n srcObject: office1,\n srcLinkName: \"occupants\",\n targetType: Employee,\n expected: [expect.objectContaining({ $primaryKey: EMPLOYEE_1_ID })],\n });\n\n // Clear all the initial calls\n empSubFn.next.mockClear();\n officeSubFn.next.mockClear();\n todoSubFn.next.mockClear();\n empListSubFn.next.mockClear();\n officeListSubFn.next.mockClear();\n todoListSubFn.next.mockClear();\n employeeOfficeLinkSubFn.next.mockClear();\n officeOccupantsLinkSubFn.next.mockClear();\n\n // Invalidate only the Todo type\n await cache.invalidateObjectType(Todo, undefined);\n\n // Allow time for any potential updates\n await new Promise(resolve => setTimeout(resolve, 500));\n\n // Todo object and list should be invalidated\n expect(todoSubFn.next).toHaveBeenCalled();\n expect(todoListSubFn.next).toHaveBeenCalled();\n\n // All Employee and Office related items should NOT be invalidated\n expect(empSubFn.next).not.toHaveBeenCalled();\n expect(officeSubFn.next).not.toHaveBeenCalled();\n expect(empListSubFn.next).not.toHaveBeenCalled();\n expect(officeListSubFn.next).not.toHaveBeenCalled();\n expect(employeeOfficeLinkSubFn.next).not.toHaveBeenCalled();\n expect(officeOccupantsLinkSubFn.next).not.toHaveBeenCalled();\n });\n });\n});\n"],"mappings":"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","ignoreList":[]}
@@ -22,8 +22,9 @@ import { ActionApplication } from "./ActionApplication.js";
22
22
  import { CacheKeys } from "./CacheKeys.js";
23
23
  import { createChangedObjects, DEBUG_ONLY__changesToString } from "./Changes.js";
24
24
  import { Entry, Layer } from "./Layer.js";
25
- import { isListCacheKey, ListQuery } from "./ListQuery.js";
26
- import { ObjectQuery } from "./ObjectQuery.js";
25
+ import { LinksHelper } from "./links/LinksHelper.js";
26
+ import { ListsHelper } from "./list/ListsHelper.js";
27
+ import { ObjectsHelper } from "./object/ObjectsHelper.js";
27
28
  import { OrderByCanonicalizer } from "./OrderByCanonicalizer.js";
28
29
  import { RefCounts } from "./RefCounts.js";
29
30
  import { tombstone } from "./tombstone.js";
@@ -60,6 +61,12 @@ function createInitEntry(cacheKey) {
60
61
  - Data is one per layer per cache key
61
62
  */
62
63
 
64
+ /**
65
+ * Central data store with layered cache architecture.
66
+ * - Truth layer: server state | Optimistic layers: pending changes
67
+ * - Reference counting prevents memory leaks
68
+ * - Batch operations ensure consistency
69
+ */
63
70
  export class Store {
64
71
  whereCanonicalizer = new WhereClauseCanonicalizer();
65
72
  orderByCanonicalizer = new OrderByCanonicalizer();
@@ -78,11 +85,17 @@ export class Store {
78
85
  // we are currently only using this for debug logging and should just remove it in the future if that
79
86
  // continues to be true
80
87
  #finalizationRegistry;
88
+
89
+ // these are hopefully temporary
90
+
81
91
  constructor(client) {
82
92
  this.client = client;
83
93
  this.logger = client[additionalContext].logger?.child({}, {
84
94
  msgPrefix: "Store"
85
95
  });
96
+ this.lists = new ListsHelper(this, this.whereCanonicalizer, this.orderByCanonicalizer);
97
+ this.objects = new ObjectsHelper(this);
98
+ this.links = new LinksHelper(this, this.whereCanonicalizer, this.orderByCanonicalizer);
86
99
  this.#topLayer = this.#truthLayer;
87
100
  this.#cacheKeys = new CacheKeys(this.whereCanonicalizer, this.orderByCanonicalizer, k => {
88
101
  if (DEBUG_REFCOUNTS) {
@@ -201,57 +214,10 @@ export class Store {
201
214
  canonicalizeWhereClause(where) {
202
215
  return this.whereCanonicalizer.canonicalize(where);
203
216
  }
204
- observeObject(apiName, pk, options, subFn) {
205
- if (typeof apiName !== "string") {
206
- apiName = apiName.apiName;
207
- }
208
- const query = this.getObjectQuery(apiName, pk);
209
- this.retain(query.cacheKey);
210
- if (options.mode !== "offline") {
211
- query.revalidate(options.mode === "force").catch(e => {
212
- subFn.error(e);
213
- // we don't want observeObject() to return a promise,
214
- // so we settle for logging an error here instead of
215
- // dropping it on the floor.
216
- if (this.logger) {
217
- this.logger.error("Unhandled error in observeObject", e);
218
- } else {
219
- throw e;
220
- }
221
- });
222
- }
223
- const sub = query.subscribe(subFn);
224
- return {
225
- unsubscribe: () => {
226
- sub.unsubscribe();
227
- this.release(query.cacheKey);
228
- }
229
- };
230
- }
231
- observeList(options, subFn) {
232
- // the ListQuery represents the shared state of the list
233
- const query = this.getListQuery(options.type, options.where ?? {}, options.orderBy ?? {}, options);
234
- this.retain(query.cacheKey);
235
- if (options.mode !== "offline") {
236
- query.revalidate(options.mode === "force").catch(x => {
237
- subFn.error(x);
238
- });
239
- }
240
- const sub = query.subscribe(subFn);
241
- if (options.streamUpdates) {
242
- query.registerStreamUpdates(sub);
243
- }
244
- return {
245
- unsubscribe: () => {
246
- sub.unsubscribe();
247
- this.release(query.cacheKey);
248
- }
249
- };
250
- }
251
217
  peekQuery(cacheKey) {
252
218
  return this.#queries.get(cacheKey);
253
219
  }
254
- #getQuery(cacheKey, createQuery) {
220
+ getQuery(cacheKey, createQuery) {
255
221
  let query = this.peekQuery(cacheKey);
256
222
  if (!query) {
257
223
  query = createQuery();
@@ -259,27 +225,6 @@ export class Store {
259
225
  }
260
226
  return query;
261
227
  }
262
- getListQuery(def, where, orderBy, opts) {
263
- const {
264
- apiName,
265
- type
266
- } = def;
267
- const canonWhere = this.whereCanonicalizer.canonicalize(where);
268
- const canonOrderBy = this.orderByCanonicalizer.canonicalize(orderBy);
269
- const listCacheKey = this.getCacheKey("list", type, apiName, canonWhere, canonOrderBy);
270
- return this.#getQuery(listCacheKey, () => {
271
- return new ListQuery(this, this.getSubject(listCacheKey), type, apiName, canonWhere, canonOrderBy, listCacheKey, opts);
272
- });
273
- }
274
- getObjectQuery(apiName, pk) {
275
- if (typeof apiName !== "string") {
276
- apiName = apiName.apiName;
277
- }
278
- const objectCacheKey = this.getCacheKey("object", apiName, pk);
279
- return this.#getQuery(objectCacheKey, () => new ObjectQuery(this, this.getSubject(objectCacheKey), apiName, pk, objectCacheKey, {
280
- dedupeInterval: 0
281
- }));
282
- }
283
228
  getValue(cacheKey) {
284
229
  return this.#topLayer.get(cacheKey);
285
230
  }
@@ -306,7 +251,7 @@ export class Store {
306
251
  writeLayer.set(cacheKey, newValue);
307
252
  const newTopValue = this.#topLayer.get(cacheKey);
308
253
  if (oldTopValue !== newTopValue) {
309
- this.#cacheKeyToSubject.get(cacheKey)?.next({
254
+ this.getSubject(cacheKey)?.next({
310
255
  // eslint-disable-next-line @typescript-eslint/no-misused-spread
311
256
  ...newValue,
312
257
  isOptimistic: newTopValue?.value !== this.#truthLayer.get(cacheKey)?.value
@@ -344,7 +289,10 @@ export class Store {
344
289
  if (typeof apiName !== "string") {
345
290
  apiName = apiName.apiName;
346
291
  }
347
- return this.getObjectQuery(apiName, pk).revalidate(/* force */true);
292
+ return this.objects.getQuery({
293
+ apiName,
294
+ pk
295
+ }).revalidate(/* force */true);
348
296
  }
349
297
  async maybeRevalidateQueries(changes, optimisticId) {
350
298
  if (changes.isEmpty()) {
@@ -382,9 +330,15 @@ export class Store {
382
330
  }
383
331
 
384
332
  /**
385
- * @param apiName
386
- * @param changes The changes we know about / to update
387
- * @returns
333
+ * Invalidates all cache entries for a specific object type.
334
+ * This will revalidate:
335
+ * 1. All objects of the specified type
336
+ * 2. All lists of the specified type
337
+ * 3. All links where the source object is of the specified type
338
+ *
339
+ * @param apiName - The API name of the object type to invalidate
340
+ * @param changes - Optional changes object to track what has been modified
341
+ * @returns Promise that resolves when all invalidations are complete
388
342
  */
389
343
  invalidateObjectType(apiName, changes) {
390
344
  if (typeof apiName !== "string") {
@@ -397,17 +351,16 @@ export class Store {
397
351
  }
398
352
  const promises = [];
399
353
  for (const cacheKey of this.#truthLayer.keys()) {
400
- if (isListCacheKey(cacheKey)) {
401
- if (!changes || !changes.modified.has(cacheKey)) {
402
- const promise = this.peekQuery(cacheKey)?.revalidate(true);
403
- if (promise) {
404
- promises.push(promise);
405
- changes?.modified.add(cacheKey);
406
- }
407
- }
354
+ if (changes && changes.modified.has(cacheKey)) {
355
+ continue;
408
356
  }
357
+ const query = this.peekQuery(cacheKey);
358
+ if (!query) continue;
359
+ promises.push(query.invalidateObjectType(apiName, changes));
409
360
  }
410
- return Promise.all(promises).then(() => void 0);
361
+
362
+ // we use allSettled here because we don't care if it succeeds or fails, just that they all complete.
363
+ return Promise.allSettled(promises).then(() => void 0);
411
364
  }
412
365
  retain(cacheKey) {
413
366
  this.#refCounts.retain(cacheKey);
@@ -416,10 +369,4 @@ export class Store {
416
369
  this.#refCounts.release(cacheKey);
417
370
  }
418
371
  }
419
- export async function invalidateList(store, args) {
420
- const where = store.whereCanonicalizer.canonicalize(args.where ?? {});
421
- const orderBy = store.orderByCanonicalizer.canonicalize(args.orderBy ?? {});
422
- const cacheKey = store.getCacheKey("list", args.type.type, args.type.apiName, where, orderBy);
423
- await store.peekQuery(cacheKey)?.revalidate(true);
424
- }
425
372
  //# sourceMappingURL=Store.js.map
@@ -1 +1 @@
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","tombstone","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","validateAction","result","$validateOnly","$returnEdits","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 ActionValidationResponse,\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 { tombstone } from \"./tombstone.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 delete: <K extends CacheKey<string, any, any>>(\n k: K,\n status: Entry<K>[\"status\"],\n ) => Entry<K>;\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:\n | Parameters<ActionSignatureFromDef<Q>[\"applyAction\"]>[0]\n | Array<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 validateAction: <Q extends ActionDefinition<any>>(\n action: Q,\n args: Parameters<ActionSignatureFromDef<Q>[\"applyAction\"]>[0],\n ) => Promise<ActionValidationResponse> = async (action, args) => {\n const result = await this.client(action).applyAction(args as any, {\n $validateOnly: true,\n $returnEdits: false,\n });\n return result as ActionValidationResponse;\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 delete: (cacheKey, status) => {\n return batchContext.write(cacheKey, tombstone, status);\n },\n read: (cacheKey) => {\n return optimisticId\n ? this.#topLayer.get(cacheKey)\n : this.#truthLayer.get(cacheKey);\n },\n };\n\n 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":[]}
1
+ {"version":3,"file":"Store.js","names":["BehaviorSubject","invariant","additionalContext","DEBUG_REFCOUNTS","ActionApplication","CacheKeys","createChangedObjects","DEBUG_ONLY__changesToString","Entry","Layer","LinksHelper","ListsHelper","ObjectsHelper","OrderByCanonicalizer","RefCounts","tombstone","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","lists","objects","links","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","validateAction","result","$validateOnly","$returnEdits","removeLayer","layerId","currentLayer","parentLayer","v","entries","has","set","oldEntry","currentEntry","next","isOptimistic","getCacheKey","getSubject","initialValue","canonicalizeWhereClause","where","canonicalize","peekQuery","getQuery","createQuery","query","getValue","batch","optimisticId","changes","batchFn","needsLayer","batchContext","createLayerIfNeeded","addLayer","optimisticWrite","write","oldTopValue","writeLayer","newValue","Date","now","newTopValue","read","retVal","maybeRevalidateQueries","catch","batchResult","invalidateObject","apiName","pk","revalidate","isEmpty","methodName","debug","promises","keys","promise","maybeUpdateAndRevalidate","push","Promise","all","invalidateObjectType","info","modified","allSettled","then","retain","release"],"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 ActionValidationResponse,\n InterfaceDefinition,\n Logger,\n ObjectTypeDefinition,\n PrimaryKeyType,\n WhereClause,\n} from \"@osdk/api\";\nimport { BehaviorSubject } from \"rxjs\";\nimport invariant from \"tiny-invariant\";\nimport type { ActionSignatureFromDef } from \"../../actions/applyAction.js\";\nimport { additionalContext, type Client } from \"../../Client.js\";\nimport { DEBUG_REFCOUNTS } from \"../DebugFlags.js\";\nimport type { OptimisticBuilder } from \"../OptimisticBuilder.js\";\nimport { ActionApplication } from \"./ActionApplication.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 type { KnownCacheKey } from \"./KnownCacheKey.js\";\nimport { Entry, Layer } from \"./Layer.js\";\nimport { LinksHelper } from \"./links/LinksHelper.js\";\nimport { ListsHelper } from \"./list/ListsHelper.js\";\nimport { ObjectsHelper } from \"./object/ObjectsHelper.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 { tombstone } from \"./tombstone.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 KnownCacheKey> 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 KnownCacheKey>(\n k: K,\n v: Entry<K>[\"value\"],\n status: Entry<K>[\"status\"],\n ) => Entry<K>;\n\n read: <K extends KnownCacheKey>(\n k: K,\n ) => Entry<K> | undefined;\n\n delete: <K extends KnownCacheKey>(\n k: K,\n status: Entry<K>[\"status\"],\n ) => Entry<K>;\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: KnownCacheKey): 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\n/**\n * Central data store with layered cache architecture.\n * - Truth layer: server state | Optimistic layers: pending changes\n * - Reference counting prevents memory leaks\n * - Batch operations ensure consistency\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 KnownCacheKey,\n Query<any, any, any>\n > = new Map();\n\n #cacheKeyToSubject = new WeakMap<\n KnownCacheKey,\n BehaviorSubject<SubjectPayload<any>>\n >();\n #cacheKeys: CacheKeys;\n\n #refCounts = new RefCounts<KnownCacheKey>(\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 // these are hopefully temporary\n lists: ListsHelper;\n objects: ObjectsHelper;\n links: LinksHelper;\n\n constructor(client: Client) {\n this.client = client;\n this.logger = client[additionalContext].logger?.child({}, {\n msgPrefix: \"Store\",\n });\n\n this.lists = new ListsHelper(\n this,\n this.whereCanonicalizer,\n this.orderByCanonicalizer,\n );\n this.objects = new ObjectsHelper(this);\n this.links = new LinksHelper(\n this,\n this.whereCanonicalizer,\n this.orderByCanonicalizer,\n );\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: KnownCacheKey) => {\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:\n | Parameters<ActionSignatureFromDef<Q>[\"applyAction\"]>[0]\n | Array<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 validateAction: <Q extends ActionDefinition<any>>(\n action: Q,\n args: Parameters<ActionSignatureFromDef<Q>[\"applyAction\"]>[0],\n ) => Promise<ActionValidationResponse> = async (action, args) => {\n const result = await this.client(action).applyAction(args as any, {\n $validateOnly: true,\n $returnEdits: false,\n });\n return result as ActionValidationResponse;\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<KnownCacheKey, Entry<any>>();\n while (currentLayer != null && currentLayer.parentLayer != null) {\n if (currentLayer.layerId === layerId) {\n for (const [k, v] of currentLayer.entries()) {\n if (cacheKeys.has(k)) continue;\n cacheKeys.set(k, v);\n }\n }\n\n currentLayer = currentLayer.parentLayer;\n }\n\n // 2. remove the layers from the chain\n this.#topLayer = this.#topLayer.removeLayer(layerId);\n\n // 3. check each cache key to see if it is different in the new chain\n for (const [k, oldEntry] of cacheKeys) {\n const currentEntry = this.#topLayer.get(k);\n\n // 4. if different, update the subject\n if (oldEntry !== currentEntry) {\n const 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 KnownCacheKey>(\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 KnownCacheKey>(\n cacheKey: KEY,\n ):\n | BehaviorSubject<SubjectPayload<KEY>>\n | undefined =>\n {\n return this.#cacheKeyToSubject.get(cacheKey);\n };\n\n getSubject = <KEY extends KnownCacheKey>(\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 peekQuery<K extends KnownCacheKey>(\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 KnownCacheKey>(\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 getValue<K extends KnownCacheKey>(\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.getSubject(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 delete: (cacheKey, status) => {\n return batchContext.write(cacheKey, tombstone, status);\n },\n read: (cacheKey) => {\n return optimisticId\n ? this.#topLayer.get(cacheKey)\n : this.#truthLayer.get(cacheKey);\n },\n };\n\n 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.objects.getQuery({\n apiName,\n 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 * Invalidates all cache entries for a specific object type.\n * This will revalidate:\n * 1. All objects of the specified type\n * 2. All lists of the specified type\n * 3. All links where the source object is of the specified type\n *\n * @param apiName - The API name of the object type to invalidate\n * @param changes - Optional changes object to track what has been modified\n * @returns Promise that resolves when all invalidations are complete\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 (changes && changes.modified.has(cacheKey)) {\n continue;\n }\n const query = this.peekQuery(cacheKey);\n if (!query) continue;\n\n promises.push(query.invalidateObjectType(apiName, changes));\n }\n\n // we use allSettled here because we don't care if it succeeds or fails, just that they all complete.\n return Promise.allSettled(promises).then(() => void 0);\n }\n\n retain(cacheKey: KnownCacheKey): void {\n this.#refCounts.retain(cacheKey);\n }\n\n release(cacheKey: KnownCacheKey): void {\n this.#refCounts.release(cacheKey);\n }\n}\n"],"mappings":"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","ignoreList":[]}