@osdk/client 2.2.0-beta.7 → 2.2.0-beta.9

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 (253) hide show
  1. package/CHANGELOG.md +43 -0
  2. package/build/browser/Client.js.map +1 -1
  3. package/build/browser/createClient.js +11 -4
  4. package/build/browser/createClient.js.map +1 -1
  5. package/build/browser/createMinimalClient.js +2 -2
  6. package/build/browser/createMinimalClient.js.map +1 -1
  7. package/build/browser/index.js +1 -0
  8. package/build/browser/index.js.map +1 -1
  9. package/build/browser/object/SimpleOsdkProperties.js +2 -0
  10. package/build/browser/object/SimpleOsdkProperties.js.map +1 -0
  11. package/build/browser/object/convertWireToOsdkObjects/BaseHolder.js +2 -0
  12. package/build/browser/object/convertWireToOsdkObjects/BaseHolder.js.map +1 -0
  13. package/build/browser/object/convertWireToOsdkObjects/InterfaceHolder.js.map +1 -1
  14. package/build/browser/object/convertWireToOsdkObjects/ObjectHolder.js.map +1 -1
  15. package/build/browser/object/convertWireToOsdkObjects/createOsdkInterface.js +25 -0
  16. package/build/browser/object/convertWireToOsdkObjects/createOsdkInterface.js.map +1 -1
  17. package/build/browser/object/convertWireToOsdkObjects/createOsdkObject.js +10 -3
  18. package/build/browser/object/convertWireToOsdkObjects/createOsdkObject.js.map +1 -1
  19. package/build/browser/object/convertWireToOsdkObjects/getDollarAs.js.map +1 -1
  20. package/build/browser/object/convertWireToOsdkObjects/getDollarLink.js.map +1 -1
  21. package/build/browser/object/convertWireToOsdkObjects.js +12 -3
  22. package/build/browser/object/convertWireToOsdkObjects.js.map +1 -1
  23. package/build/browser/object/convertWireToOsdkObjects.test.js +7 -3
  24. package/build/browser/object/convertWireToOsdkObjects.test.js.map +1 -1
  25. package/build/browser/object/createObjectSpecifierFromPrimaryKey.js +20 -0
  26. package/build/browser/object/createObjectSpecifierFromPrimaryKey.js.map +1 -0
  27. package/build/browser/object/fetchPage.js +13 -1
  28. package/build/browser/object/fetchPage.js.map +1 -1
  29. package/build/browser/object/fetchPage.test.js +56 -2
  30. package/build/browser/object/fetchPage.test.js.map +1 -1
  31. package/build/browser/object/object.test.js +109 -0
  32. package/build/browser/object/object.test.js.map +1 -1
  33. package/build/browser/objectSet/InterfaceObjectSet.test.js +18 -2
  34. package/build/browser/objectSet/InterfaceObjectSet.test.js.map +1 -1
  35. package/build/browser/objectSet/ObjectSet.test.js +104 -100
  36. package/build/browser/objectSet/ObjectSet.test.js.map +1 -1
  37. package/build/browser/objectSet/ObjectSetListenerWebsocket.js +18 -14
  38. package/build/browser/objectSet/ObjectSetListenerWebsocket.js.map +1 -1
  39. package/build/browser/objectSet/ObjectSetListenerWebsocket.test.js +2 -0
  40. package/build/browser/objectSet/ObjectSetListenerWebsocket.test.js.map +1 -1
  41. package/build/browser/objectSet/createObjectSet.js.map +1 -1
  42. package/build/browser/observable/ListPayload.js.map +1 -1
  43. package/build/browser/observable/ObjectPayload.js.map +1 -1
  44. package/build/browser/observable/ObservableClient.js.map +1 -1
  45. package/build/browser/observable/internal/ActionApplication.js +29 -29
  46. package/build/browser/observable/internal/ActionApplication.js.map +1 -1
  47. package/build/browser/observable/internal/CacheKey.js +1 -1
  48. package/build/browser/observable/internal/CacheKey.js.map +1 -1
  49. package/build/browser/observable/internal/CacheKeys.js +2 -2
  50. package/build/browser/observable/internal/CacheKeys.js.map +1 -1
  51. package/build/browser/observable/internal/{ChangedObjects.js → Changes.js} +20 -9
  52. package/build/browser/observable/internal/Changes.js.map +1 -0
  53. package/build/browser/observable/internal/Layer.js +3 -0
  54. package/build/browser/observable/internal/Layer.js.map +1 -1
  55. package/build/browser/observable/internal/ListQuery.js +411 -170
  56. package/build/browser/observable/internal/ListQuery.js.map +1 -1
  57. package/build/browser/observable/internal/ObjectQuery.js +32 -16
  58. package/build/browser/observable/internal/ObjectQuery.js.map +1 -1
  59. package/build/browser/observable/internal/ObservableClientImpl.js +4 -12
  60. package/build/browser/observable/internal/ObservableClientImpl.js.map +1 -1
  61. package/build/browser/observable/internal/OptimisticJob.js.map +1 -1
  62. package/build/browser/observable/internal/OrderByCanonicalizer.js +73 -0
  63. package/build/browser/observable/internal/OrderByCanonicalizer.js.map +1 -0
  64. package/build/browser/observable/internal/OrderByCanonicalizer.test.js +78 -0
  65. package/build/browser/observable/internal/OrderByCanonicalizer.test.js.map +1 -0
  66. package/build/browser/observable/internal/Query.js +64 -31
  67. package/build/browser/observable/internal/Query.js.map +1 -1
  68. package/build/browser/observable/internal/RefCounts.js +7 -2
  69. package/build/browser/observable/internal/RefCounts.js.map +1 -1
  70. package/build/browser/observable/internal/SimpleWhereClause.js +2 -0
  71. package/build/browser/observable/internal/SimpleWhereClause.js.map +1 -0
  72. package/build/browser/observable/internal/Store.js +84 -267
  73. package/build/browser/observable/internal/Store.js.map +1 -1
  74. package/build/browser/observable/internal/Store.test.js +264 -247
  75. package/build/browser/observable/internal/Store.test.js.map +1 -1
  76. package/build/browser/observable/internal/WhereClauseCanonicalizer.js +11 -3
  77. package/build/browser/observable/internal/WhereClauseCanonicalizer.js.map +1 -1
  78. package/build/browser/observable/internal/objectMatchesWhereClause.js.map +1 -1
  79. package/build/browser/observable/internal/objectMatchesWhereClause.test.js.map +1 -1
  80. package/build/browser/observable/internal/testUtils.js +82 -18
  81. package/build/browser/observable/internal/testUtils.js.map +1 -1
  82. package/build/browser/public/unstable-do-not-use.js.map +1 -1
  83. package/build/browser/queries/applyQuery.js +33 -1
  84. package/build/browser/queries/applyQuery.js.map +1 -1
  85. package/build/browser/queries/queries.test.js +26 -5
  86. package/build/browser/queries/queries.test.js.map +1 -1
  87. package/build/browser/util/UserAgent.js +1 -1
  88. package/build/browser/util/toDataValueQueries.js +17 -0
  89. package/build/browser/util/toDataValueQueries.js.map +1 -1
  90. package/build/cjs/{Client-C8K3E1vH.d.cts → Client-DBTcM9gB.d.cts} +1 -1
  91. package/build/cjs/{chunk-JPENHIJB.cjs → chunk-EY52J5Z4.cjs} +25 -15
  92. package/build/cjs/chunk-EY52J5Z4.cjs.map +1 -0
  93. package/build/cjs/{chunk-IU47QMYO.cjs → chunk-MCQVHD2F.cjs} +32 -28
  94. package/build/cjs/chunk-MCQVHD2F.cjs.map +1 -0
  95. package/build/cjs/chunk-T4NIFYZS.cjs +14 -0
  96. package/build/cjs/chunk-T4NIFYZS.cjs.map +1 -0
  97. package/build/cjs/index.cjs +154 -73
  98. package/build/cjs/index.cjs.map +1 -1
  99. package/build/cjs/index.d.cts +6 -4
  100. package/build/cjs/public/internal.cjs +6 -6
  101. package/build/cjs/public/internal.d.cts +1 -1
  102. package/build/cjs/public/unstable-do-not-use.cjs +683 -539
  103. package/build/cjs/public/unstable-do-not-use.cjs.map +1 -1
  104. package/build/cjs/public/unstable-do-not-use.d.cts +28 -27
  105. package/build/esm/Client.js.map +1 -1
  106. package/build/esm/createClient.js +11 -4
  107. package/build/esm/createClient.js.map +1 -1
  108. package/build/esm/createMinimalClient.js +2 -2
  109. package/build/esm/createMinimalClient.js.map +1 -1
  110. package/build/esm/index.js +1 -0
  111. package/build/esm/index.js.map +1 -1
  112. package/build/esm/object/SimpleOsdkProperties.js +2 -0
  113. package/build/esm/object/SimpleOsdkProperties.js.map +1 -0
  114. package/build/esm/object/convertWireToOsdkObjects/BaseHolder.js +2 -0
  115. package/build/esm/object/convertWireToOsdkObjects/BaseHolder.js.map +1 -0
  116. package/build/esm/object/convertWireToOsdkObjects/InterfaceHolder.js.map +1 -1
  117. package/build/esm/object/convertWireToOsdkObjects/ObjectHolder.js.map +1 -1
  118. package/build/esm/object/convertWireToOsdkObjects/createOsdkInterface.js +25 -0
  119. package/build/esm/object/convertWireToOsdkObjects/createOsdkInterface.js.map +1 -1
  120. package/build/esm/object/convertWireToOsdkObjects/createOsdkObject.js +10 -3
  121. package/build/esm/object/convertWireToOsdkObjects/createOsdkObject.js.map +1 -1
  122. package/build/esm/object/convertWireToOsdkObjects/getDollarAs.js.map +1 -1
  123. package/build/esm/object/convertWireToOsdkObjects/getDollarLink.js.map +1 -1
  124. package/build/esm/object/convertWireToOsdkObjects.js +12 -3
  125. package/build/esm/object/convertWireToOsdkObjects.js.map +1 -1
  126. package/build/esm/object/convertWireToOsdkObjects.test.js +7 -3
  127. package/build/esm/object/convertWireToOsdkObjects.test.js.map +1 -1
  128. package/build/esm/object/createObjectSpecifierFromPrimaryKey.js +20 -0
  129. package/build/esm/object/createObjectSpecifierFromPrimaryKey.js.map +1 -0
  130. package/build/esm/object/fetchPage.js +13 -1
  131. package/build/esm/object/fetchPage.js.map +1 -1
  132. package/build/esm/object/fetchPage.test.js +56 -2
  133. package/build/esm/object/fetchPage.test.js.map +1 -1
  134. package/build/esm/object/object.test.js +109 -0
  135. package/build/esm/object/object.test.js.map +1 -1
  136. package/build/esm/objectSet/InterfaceObjectSet.test.js +18 -2
  137. package/build/esm/objectSet/InterfaceObjectSet.test.js.map +1 -1
  138. package/build/esm/objectSet/ObjectSet.test.js +104 -100
  139. package/build/esm/objectSet/ObjectSet.test.js.map +1 -1
  140. package/build/esm/objectSet/ObjectSetListenerWebsocket.js +18 -14
  141. package/build/esm/objectSet/ObjectSetListenerWebsocket.js.map +1 -1
  142. package/build/esm/objectSet/ObjectSetListenerWebsocket.test.js +2 -0
  143. package/build/esm/objectSet/ObjectSetListenerWebsocket.test.js.map +1 -1
  144. package/build/esm/objectSet/createObjectSet.js.map +1 -1
  145. package/build/esm/observable/ListPayload.js.map +1 -1
  146. package/build/esm/observable/ObjectPayload.js.map +1 -1
  147. package/build/esm/observable/ObservableClient.js.map +1 -1
  148. package/build/esm/observable/internal/ActionApplication.js +29 -29
  149. package/build/esm/observable/internal/ActionApplication.js.map +1 -1
  150. package/build/esm/observable/internal/CacheKey.js +1 -1
  151. package/build/esm/observable/internal/CacheKey.js.map +1 -1
  152. package/build/esm/observable/internal/CacheKeys.js +2 -2
  153. package/build/esm/observable/internal/CacheKeys.js.map +1 -1
  154. package/build/esm/observable/internal/{ChangedObjects.js → Changes.js} +20 -9
  155. package/build/esm/observable/internal/Changes.js.map +1 -0
  156. package/build/esm/observable/internal/Layer.js +3 -0
  157. package/build/esm/observable/internal/Layer.js.map +1 -1
  158. package/build/esm/observable/internal/ListQuery.js +411 -170
  159. package/build/esm/observable/internal/ListQuery.js.map +1 -1
  160. package/build/esm/observable/internal/ObjectQuery.js +32 -16
  161. package/build/esm/observable/internal/ObjectQuery.js.map +1 -1
  162. package/build/esm/observable/internal/ObservableClientImpl.js +4 -12
  163. package/build/esm/observable/internal/ObservableClientImpl.js.map +1 -1
  164. package/build/esm/observable/internal/OptimisticJob.js.map +1 -1
  165. package/build/esm/observable/internal/OrderByCanonicalizer.js +73 -0
  166. package/build/esm/observable/internal/OrderByCanonicalizer.js.map +1 -0
  167. package/build/esm/observable/internal/OrderByCanonicalizer.test.js +78 -0
  168. package/build/esm/observable/internal/OrderByCanonicalizer.test.js.map +1 -0
  169. package/build/esm/observable/internal/Query.js +64 -31
  170. package/build/esm/observable/internal/Query.js.map +1 -1
  171. package/build/esm/observable/internal/RefCounts.js +7 -2
  172. package/build/esm/observable/internal/RefCounts.js.map +1 -1
  173. package/build/esm/observable/internal/SimpleWhereClause.js +2 -0
  174. package/build/esm/observable/internal/SimpleWhereClause.js.map +1 -0
  175. package/build/esm/observable/internal/Store.js +84 -267
  176. package/build/esm/observable/internal/Store.js.map +1 -1
  177. package/build/esm/observable/internal/Store.test.js +264 -247
  178. package/build/esm/observable/internal/Store.test.js.map +1 -1
  179. package/build/esm/observable/internal/WhereClauseCanonicalizer.js +11 -3
  180. package/build/esm/observable/internal/WhereClauseCanonicalizer.js.map +1 -1
  181. package/build/esm/observable/internal/objectMatchesWhereClause.js.map +1 -1
  182. package/build/esm/observable/internal/objectMatchesWhereClause.test.js.map +1 -1
  183. package/build/esm/observable/internal/testUtils.js +82 -18
  184. package/build/esm/observable/internal/testUtils.js.map +1 -1
  185. package/build/esm/public/unstable-do-not-use.js.map +1 -1
  186. package/build/esm/queries/applyQuery.js +33 -1
  187. package/build/esm/queries/applyQuery.js.map +1 -1
  188. package/build/esm/queries/queries.test.js +26 -5
  189. package/build/esm/queries/queries.test.js.map +1 -1
  190. package/build/esm/util/UserAgent.js +1 -1
  191. package/build/esm/util/toDataValueQueries.js +17 -0
  192. package/build/esm/util/toDataValueQueries.js.map +1 -1
  193. package/build/types/Client.d.ts +1 -1
  194. package/build/types/Client.d.ts.map +1 -1
  195. package/build/types/createClient.d.ts.map +1 -1
  196. package/build/types/index.d.ts +2 -1
  197. package/build/types/index.d.ts.map +1 -1
  198. package/build/types/object/SimpleOsdkProperties.d.ts +1 -0
  199. package/build/types/object/SimpleOsdkProperties.d.ts.map +1 -0
  200. package/build/types/object/convertWireToOsdkObjects/BaseHolder.d.ts +1 -0
  201. package/build/types/object/convertWireToOsdkObjects/BaseHolder.d.ts.map +1 -0
  202. package/build/types/object/convertWireToOsdkObjects.d.ts +8 -1
  203. package/build/types/object/convertWireToOsdkObjects.d.ts.map +1 -1
  204. package/build/types/object/createObjectSpecifierFromPrimaryKey.d.ts +2 -0
  205. package/build/types/object/createObjectSpecifierFromPrimaryKey.d.ts.map +1 -0
  206. package/build/types/object/object.test.d.ts.map +1 -1
  207. package/build/types/objectSet/ObjectSet.test.d.ts.map +1 -1
  208. package/build/types/observable/ListPayload.d.ts +5 -9
  209. package/build/types/observable/ListPayload.d.ts.map +1 -1
  210. package/build/types/observable/ObjectPayload.d.ts +4 -7
  211. package/build/types/observable/ObjectPayload.d.ts.map +1 -1
  212. package/build/types/observable/ObservableClient.d.ts +27 -11
  213. package/build/types/observable/ObservableClient.d.ts.map +1 -1
  214. package/build/types/observable/internal/ActionApplication.d.ts.map +1 -1
  215. package/build/types/observable/internal/CacheKeys.d.ts +1 -1
  216. package/build/types/observable/internal/CacheKeys.d.ts.map +1 -1
  217. package/build/types/observable/internal/Changes.d.ts +15 -0
  218. package/build/types/observable/internal/Changes.d.ts.map +1 -0
  219. package/build/types/observable/internal/Layer.d.ts +1 -0
  220. package/build/types/observable/internal/Layer.d.ts.map +1 -1
  221. package/build/types/observable/internal/ListQuery.d.ts +59 -14
  222. package/build/types/observable/internal/ListQuery.d.ts.map +1 -1
  223. package/build/types/observable/internal/ObjectQuery.d.ts +5 -6
  224. package/build/types/observable/internal/ObjectQuery.d.ts.map +1 -1
  225. package/build/types/observable/internal/OptimisticJob.d.ts +1 -1
  226. package/build/types/observable/internal/OptimisticJob.d.ts.map +1 -1
  227. package/build/types/observable/internal/OrderByCanonicalizer.d.ts +12 -0
  228. package/build/types/observable/internal/OrderByCanonicalizer.d.ts.map +1 -0
  229. package/build/types/observable/internal/OrderByCanonicalizer.test.d.ts +1 -0
  230. package/build/types/observable/internal/OrderByCanonicalizer.test.d.ts.map +1 -0
  231. package/build/types/observable/internal/Query.d.ts +39 -4
  232. package/build/types/observable/internal/Query.d.ts.map +1 -1
  233. package/build/types/observable/internal/RefCounts.d.ts.map +1 -1
  234. package/build/types/observable/internal/SimpleWhereClause.d.ts +2 -0
  235. package/build/types/observable/internal/SimpleWhereClause.d.ts.map +1 -0
  236. package/build/types/observable/internal/Store.d.ts +19 -43
  237. package/build/types/observable/internal/Store.d.ts.map +1 -1
  238. package/build/types/observable/internal/WhereClauseCanonicalizer.d.ts +2 -1
  239. package/build/types/observable/internal/WhereClauseCanonicalizer.d.ts.map +1 -1
  240. package/build/types/observable/internal/objectMatchesWhereClause.d.ts +4 -2
  241. package/build/types/observable/internal/objectMatchesWhereClause.d.ts.map +1 -1
  242. package/build/types/observable/internal/testUtils.d.ts +39 -9
  243. package/build/types/observable/internal/testUtils.d.ts.map +1 -1
  244. package/build/types/public/unstable-do-not-use.d.ts +1 -4
  245. package/build/types/public/unstable-do-not-use.d.ts.map +1 -1
  246. package/build/types/queries/applyQuery.d.ts.map +1 -1
  247. package/package.json +13 -11
  248. package/build/browser/observable/internal/ChangedObjects.js.map +0 -1
  249. package/build/cjs/chunk-IU47QMYO.cjs.map +0 -1
  250. package/build/cjs/chunk-JPENHIJB.cjs.map +0 -1
  251. package/build/esm/observable/internal/ChangedObjects.js.map +0 -1
  252. package/build/types/observable/internal/ChangedObjects.d.ts +0 -11
  253. package/build/types/observable/internal/ChangedObjects.d.ts.map +0 -1
@@ -20,12 +20,12 @@ import { additionalContext } from "../../Client.js";
20
20
  import { DEBUG_REFCOUNTS } from "../DebugFlags.js";
21
21
  import { ActionApplication } from "./ActionApplication.js";
22
22
  import { CacheKeys } from "./CacheKeys.js";
23
- import { createChangedObjects, DEBUG_ONLY__changesToString } from "./ChangedObjects.js";
23
+ import { createChangedObjects, DEBUG_ONLY__changesToString } from "./Changes.js";
24
24
  import { Entry, Layer } from "./Layer.js";
25
25
  import { isListCacheKey, ListQuery } from "./ListQuery.js";
26
26
  import { ObjectQuery } from "./ObjectQuery.js";
27
+ import { OrderByCanonicalizer } from "./OrderByCanonicalizer.js";
27
28
  import { RefCounts } from "./RefCounts.js";
28
- import { WeakMapWithEntries } from "./WeakMapWithEntries.js";
29
29
  import { WhereClauseCanonicalizer } from "./WhereClauseCanonicalizer.js";
30
30
 
31
31
  /*
@@ -59,18 +59,6 @@ function createInitEntry(cacheKey) {
59
59
  - Data is one per layer per cache key
60
60
  */
61
61
 
62
- export class OrderByCanonicalizer {
63
- // crappy version
64
- #map = new Map();
65
- canonicalize = orderBy => {
66
- if (this.#map.has(JSON.stringify(orderBy))) {
67
- return this.#map.get(JSON.stringify(orderBy));
68
- } else {
69
- this.#map.set(JSON.stringify(orderBy), orderBy);
70
- return orderBy;
71
- }
72
- };
73
- }
74
62
  export class Store {
75
63
  whereCanonicalizer = new WhereClauseCanonicalizer();
76
64
  orderByCanonicalizer = new OrderByCanonicalizer();
@@ -79,10 +67,15 @@ export class Store {
79
67
 
80
68
  /** @internal */
81
69
 
82
- #queries = new WeakMapWithEntries();
70
+ // we can use a regular Map here because the refCounting will
71
+ // handle cleanup.
72
+ #queries = new Map();
83
73
  #cacheKeyToSubject = new WeakMap();
84
74
  #cacheKeys;
85
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
86
79
  #finalizationRegistry;
87
80
  constructor(client) {
88
81
  this.client = client;
@@ -197,14 +190,18 @@ export class Store {
197
190
  }
198
191
  return subject;
199
192
  };
193
+ canonicalizeWhereClause(where) {
194
+ return this.whereCanonicalizer.canonicalize(where);
195
+ }
200
196
  observeObject(apiName, pk, options, subFn) {
201
197
  if (typeof apiName !== "string") {
202
198
  apiName = apiName.apiName;
203
199
  }
204
200
  const query = this.getObjectQuery(apiName, pk);
205
- this.#refCounts.retain(query.cacheKey);
201
+ this.retain(query.cacheKey);
206
202
  if (options.mode !== "offline") {
207
203
  query.revalidate(options.mode === "force").catch(e => {
204
+ subFn.error(e);
208
205
  // we don't want observeObject() to return a promise,
209
206
  // so we settle for logging an error here instead of
210
207
  // dropping it on the floor.
@@ -215,156 +212,55 @@ export class Store {
215
212
  }
216
213
  });
217
214
  }
218
- const sub = query.subscribe({
219
- next: subFn
220
- });
215
+ const sub = query.subscribe(subFn);
221
216
  return {
222
217
  unsubscribe: () => {
223
218
  sub.unsubscribe();
224
- this.#refCounts.release(query.cacheKey);
219
+ this.release(query.cacheKey);
225
220
  }
226
221
  };
227
222
  }
228
223
  observeList(options, subFn) {
229
224
  // the ListQuery represents the shared state of the list
230
- const query = this.getListQuery(options.objectType, options.where ?? {}, options.orderBy ?? {}, options);
231
- this.#refCounts.retain(query.cacheKey);
225
+ const query = this.getListQuery(options.type, options.where ?? {}, options.orderBy ?? {}, options);
226
+ this.retain(query.cacheKey);
232
227
  if (options.mode !== "offline") {
233
- void query.revalidate(options.mode === "force");
228
+ query.revalidate(options.mode === "force").catch(x => {
229
+ subFn.error(x);
230
+ });
234
231
  }
235
- const sub = query.subscribe({
236
- next: subFn
237
- });
232
+ const sub = query.subscribe(subFn);
238
233
  if (options.streamUpdates) {
239
- const miniDef = {
240
- type: "object",
241
- apiName: typeof options.objectType === "string" ? options.objectType : options.objectType.apiName
242
- };
243
- let objectSet = this.client(miniDef);
244
- if (options.where) {
245
- objectSet = objectSet.where(options.where ?? {});
246
- }
247
- const store = this;
248
- const websocketSubscription = objectSet.subscribe({
249
- onChange({
250
- object,
251
- state
252
- }) {
253
- if (process.env.NODE_ENV !== "production") {
254
- store.logger?.debug({
255
- methodName: "onError"
256
- }, "updates", state, object);
257
- }
258
- const cacheKey = store.getCacheKey("object", object.$objectType, object.$primaryKey);
259
- const type = store.#peekQuery(cacheKey) == null ? "addedObjects" : "modifiedObjects";
260
- const changes = createChangedObjects();
261
- changes[type].set(object.$objectType, object);
262
- if (state === "ADDED_OR_UPDATED") {
263
- // todo, can we do the update without
264
- // the extra invalidation? maybe a flag to updateObject
265
- store.updateObject(object.$objectType, object);
266
- store.maybeRevalidateLists(changes).catch(err => {
267
- // eslint-disable-next-line no-console
268
- console.error("Unhandled error in maybeRevalidateLists", err);
269
- });
270
- } else if (state === "REMOVED") {
271
- const changes = createChangedObjects();
272
- store.batch({
273
- changes
274
- }, batch => {
275
- const existing = batch.read(query.cacheKey);
276
- const cacheKeyToRemove = store.getCacheKey("object", object.$objectType, object.$primaryKey);
277
- if (existing?.status === "loaded") {
278
- const newObjects = existing.value?.data.filter(o => o !== cacheKeyToRemove);
279
- if (newObjects?.length !== existing.value?.data.length) {
280
- batch.changes.modifiedLists.add(query.cacheKey);
281
- batch.write(query.cacheKey, {
282
- data: newObjects ?? []
283
- }, "loaded");
284
- // Should there be an else for this case? Do we need to invalidate
285
- // the paging tokens we may have?
286
- }
287
- } else {
288
- // There may be a tiny race here where OSW tells us the object has
289
- // been removed but an outstanding invalidation of this query is
290
- // about to return. In this case, its possible that we remove this item
291
- // from the list and then the returned list load re-adds it.
292
- // To avoid this, we will just force reload the query to be sure
293
- // we don't leave things in a bad state.
294
-
295
- if (process.env.NODE_ENV !== "production") {
296
- store.logger?.info("Removing an object from an object list that is in the middle of being loaded.", existing);
297
- }
298
- query.revalidate(/* force */true).catch(e => {
299
- if (store.logger) {
300
- store.logger?.error("Uncaught error while revalidating list", e);
301
- } else {
302
- // eslint-disable-next-line no-console
303
- console.error("Uncaught error while revalidating list", e);
304
- }
305
- });
306
- }
307
- });
308
- }
309
- },
310
- onError(errors) {
311
- if (process.env.NODE_ENV !== "production") {
312
- store.logger?.info({
313
- methodName: "onError"
314
- }, "subscription errors", errors);
315
- }
316
- },
317
- onOutOfDate() {
318
- if (process.env.NODE_ENV !== "production") {
319
- store.logger?.info({
320
- methodName: "onOutOfDate"
321
- });
322
- }
323
- },
324
- onSuccessfulSubscription() {
325
- if (process.env.NODE_ENV !== "production") {
326
- store.logger?.info({
327
- methodName: "onSuccessfulSubscription"
328
- });
329
- }
330
- }
331
- });
332
- sub.add(() => {
333
- if (process.env.NODE_ENV !== "production") {
334
- store.logger?.info({
335
- methodName: "observeList"
336
- }, "Unsubscribing from websocket");
337
- }
338
- websocketSubscription.unsubscribe();
339
- });
234
+ query.registerStreamUpdates(sub);
340
235
  }
341
236
  return {
342
237
  unsubscribe: () => {
343
238
  sub.unsubscribe();
344
- this.#refCounts.release(query.cacheKey);
239
+ this.release(query.cacheKey);
345
240
  }
346
241
  };
347
242
  }
348
- #peekQuery(cacheKey) {
243
+ peekQuery(cacheKey) {
349
244
  return this.#queries.get(cacheKey);
350
245
  }
351
246
  #getQuery(cacheKey, createQuery) {
352
- let query = this.#peekQuery(cacheKey);
247
+ let query = this.peekQuery(cacheKey);
353
248
  if (!query) {
354
249
  query = createQuery();
355
250
  this.#queries.set(cacheKey, query);
356
251
  }
357
252
  return query;
358
253
  }
359
- getListQuery(apiName, where, orderBy, opts) {
360
- if (typeof apiName !== "string") {
361
- apiName = apiName.apiName;
362
- }
254
+ getListQuery(def, where, orderBy, opts) {
255
+ const {
256
+ apiName,
257
+ type
258
+ } = def;
363
259
  const canonWhere = this.whereCanonicalizer.canonicalize(where);
364
260
  const canonOrderBy = this.orderByCanonicalizer.canonicalize(orderBy);
365
- const listCacheKey = this.getCacheKey("list", apiName, canonWhere, canonOrderBy);
261
+ const listCacheKey = this.getCacheKey("list", type, apiName, canonWhere, canonOrderBy);
366
262
  return this.#getQuery(listCacheKey, () => {
367
- return new ListQuery(this, this.getSubject(listCacheKey), apiName, canonWhere, canonOrderBy, listCacheKey, opts);
263
+ return new ListQuery(this, this.getSubject(listCacheKey), type, apiName, canonWhere, canonOrderBy, listCacheKey, opts);
368
264
  });
369
265
  }
370
266
  getObjectQuery(apiName, pk) {
@@ -376,13 +272,8 @@ export class Store {
376
272
  dedupeInterval: 0
377
273
  }));
378
274
  }
379
- getObject(apiName, pk) {
380
- if (typeof apiName !== "string") {
381
- apiName = apiName.apiName;
382
- }
383
- const objectCacheKey = this.getCacheKey("object", apiName, pk);
384
- const objEntry = this.#topLayer.get(objectCacheKey);
385
- return objEntry?.value;
275
+ getValue(cacheKey) {
276
+ return this.#topLayer.get(cacheKey);
386
277
  }
387
278
  batch = ({
388
279
  optimisticId,
@@ -420,73 +311,63 @@ export class Store {
420
311
  }
421
312
  };
422
313
  const retVal = batchFn(batchContext);
423
- void this.maybeUpdateLists(changes, optimisticId);
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
+ });
424
326
  return {
425
327
  batchResult: batchContext,
426
- retVal: retVal
328
+ retVal: retVal,
329
+ changes: batchContext.changes
427
330
  };
428
331
  };
429
332
  invalidateObject(apiName, pk) {
430
333
  if (typeof apiName !== "string") {
431
334
  apiName = apiName.apiName;
432
335
  }
433
-
434
- // inevitably we will want an internal version of this and a "public" one
435
- // so we can avoid extra requests
436
-
437
- const query = this.getObjectQuery(apiName, pk);
438
- return query.revalidate(true);
439
-
440
- // potentially trigger updates of the lists that included this object?
441
- // TODO
442
- // could we detect that a list WOULD include it?
336
+ return this.getObjectQuery(apiName, pk).revalidate(/* force */true);
443
337
  }
444
- async maybeRevalidateLists(changes) {
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");
345
+ }
346
+ return;
347
+ }
445
348
  if (process.env.NODE_ENV !== "production") {
446
349
  // todo
447
- this.logger?.trace({
448
- methodName: "maybeRevalidateList"
449
- }, DEBUG_ONLY__changesToString(changes));
350
+ this.logger?.child({
351
+ methodName: "maybeRevalidateQueries"
352
+ }).debug(DEBUG_ONLY__changesToString(changes), {
353
+ optimisticId
354
+ });
450
355
  }
451
356
  try {
452
357
  const promises = [];
453
- for (const [cacheKey, v] of this.#truthLayer.entries()) {
454
- if (isListCacheKey(cacheKey)) {
455
- const promise = this.#peekQuery(cacheKey)?.maybeUpdateAndRevalidate(changes, undefined);
456
- if (promise) promises.push(promise);
457
- }
358
+ for (const cacheKey of this.#queries.keys()) {
359
+ const promise = this.peekQuery(cacheKey)?.maybeUpdateAndRevalidate?.(changes, optimisticId);
360
+ if (promise) promises.push(promise);
458
361
  }
459
362
  await Promise.all(promises);
460
363
  } finally {
461
364
  if (process.env.NODE_ENV !== "production") {
462
365
  // todo
463
- this.logger?.trace({
464
- methodName: "maybeRevalidateList"
465
- }, "in finally", DEBUG_ONLY__changesToString(changes));
466
- }
467
- }
468
- }
469
- maybeUpdateLists(changes, optimisticId) {
470
- if (process.env.NODE_ENV !== "production") {
471
- this.logger?.trace({
472
- methodName: "maybeUpdateLists"
473
- }, DEBUG_ONLY__changesToString(changes), {
474
- optimisticId
475
- });
476
- }
477
- if (changes.addedObjects.size === 0 && changes.modifiedObjects.size === 0) {
478
- return Promise.resolve([]);
479
- }
480
- const promises = [];
481
- for (const cacheKey of this.#queries.keys()) {
482
- if (isListCacheKey(cacheKey)) {
483
- if (!changes.modifiedLists.has(cacheKey)) {
484
- const promise = this.#peekQuery(cacheKey)?.maybeUpdateAndRevalidate(changes, optimisticId);
485
- if (promise) promises.push(promise);
486
- }
366
+ this.logger?.child({
367
+ methodName: "maybeRevalidateQueries"
368
+ }).debug("in finally", DEBUG_ONLY__changesToString(changes));
487
369
  }
488
370
  }
489
- return Promise.all(promises);
490
371
  }
491
372
 
492
373
  /**
@@ -499,93 +380,23 @@ export class Store {
499
380
  apiName = apiName.apiName;
500
381
  }
501
382
  if (process.env.NODE_ENV !== "production") {
502
- this.logger?.info({
383
+ this.logger?.child({
503
384
  methodName: "invalidateObjectType"
504
- }, changes ? DEBUG_ONLY__changesToString(changes) : void 0);
385
+ }).info(changes ? DEBUG_ONLY__changesToString(changes) : void 0);
505
386
  }
506
387
  const promises = [];
507
- for (const [cacheKey, v] of this.#truthLayer.entries()) {
508
- if (isListCacheKey(cacheKey, apiName)) {
509
- if (!changes || !changes.modifiedLists.has(cacheKey)) {
510
- const promise = this.#peekQuery(cacheKey)?.revalidate(true);
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);
511
392
  if (promise) {
512
393
  promises.push(promise);
513
- changes?.modifiedLists.add(cacheKey);
394
+ changes?.modified.add(cacheKey);
514
395
  }
515
396
  }
516
397
  }
517
398
  }
518
- return Promise.all(promises);
519
- }
520
- invalidateList({
521
- objectType,
522
- where,
523
- orderBy
524
- }) {
525
- if (typeof objectType !== "string") {
526
- objectType = objectType.apiName;
527
- }
528
- where = this.whereCanonicalizer.canonicalize(where ?? {});
529
- orderBy = this.orderByCanonicalizer.canonicalize(orderBy ?? {});
530
- const cacheKey = this.getCacheKey("list", objectType, where, orderBy);
531
- void this.#peekQuery(cacheKey)?.revalidate(true);
532
- }
533
- updateObject(apiName, value, {
534
- optimisticId
535
- } = {}) {
536
- if (typeof apiName !== "string") {
537
- apiName = apiName.apiName;
538
- }
539
- const query = this.getObjectQuery(apiName, value.$primaryKey);
540
- return this.batch({
541
- optimisticId
542
- }, batch => {
543
- return query.writeToStore(value, "loaded", batch);
544
- }).retVal.value;
545
- }
546
- updateObjects(values, batch) {
547
- // update the cache for any object that has changed
548
- // and save the mapped values to return
549
- return values.map(v => {
550
- return this.getObjectQuery(v.$apiName, v.$primaryKey).writeToStore(v, "loaded", batch).cacheKey;
551
- });
552
- }
553
-
554
- /**
555
- * Updates the internal state of a list and will create a new internal query if needed.
556
- *
557
- * Helper method only for tests right now. May be removed later.
558
- *
559
- * @param apiName
560
- * @param where
561
- * @param orderBy
562
- * @param objects
563
- * @param param4
564
- * @param opts
565
- */
566
- updateList({
567
- objectType: apiName,
568
- where,
569
- orderBy
570
- }, objects, {
571
- optimisticId
572
- } = {}, opts = {
573
- dedupeInterval: 0
574
- }) {
575
- if (process.env.NODE_ENV !== "production") {
576
- this.logger?.info({
577
- methodName: "updateList"
578
- }, "", {
579
- optimisticId
580
- });
581
- }
582
- const query = this.getListQuery(apiName, where ?? {}, orderBy ?? {}, opts);
583
- this.batch({
584
- optimisticId
585
- }, batch => {
586
- const objectCacheKeys = this.updateObjects(objects, batch);
587
- query.updateList(objectCacheKeys, false, "loaded", batch);
588
- });
399
+ return Promise.all(promises).then(() => void 0);
589
400
  }
590
401
  retain(cacheKey) {
591
402
  this.#refCounts.retain(cacheKey);
@@ -594,4 +405,10 @@ export class Store {
594
405
  this.#refCounts.release(cacheKey);
595
406
  }
596
407
  }
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);
413
+ }
597
414
  //# sourceMappingURL=Store.js.map