@statezero/core 0.2.38 → 0.2.39

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 (294) hide show
  1. package/dist/actions/backend1/django_app/calculate-hash.d.ts +57 -0
  2. package/dist/actions/backend1/django_app/calculate-hash.js +80 -0
  3. package/dist/actions/backend1/django_app/calculate-hash.schema.json +148 -0
  4. package/dist/actions/backend1/django_app/get-current-username.d.ts +29 -0
  5. package/dist/actions/backend1/django_app/get-current-username.js +65 -0
  6. package/dist/actions/backend1/django_app/get-current-username.schema.json +47 -0
  7. package/dist/actions/backend1/django_app/get-server-status.d.ts +38 -0
  8. package/dist/actions/backend1/django_app/get-server-status.js +68 -0
  9. package/dist/actions/backend1/django_app/get-server-status.schema.json +93 -0
  10. package/dist/actions/backend1/django_app/get-user-info.d.ts +44 -0
  11. package/dist/actions/backend1/django_app/get-user-info.js +70 -0
  12. package/dist/actions/backend1/django_app/get-user-info.schema.json +127 -0
  13. package/dist/actions/backend1/django_app/index.d.ts +1 -0
  14. package/dist/actions/backend1/django_app/index.js +6 -0
  15. package/dist/actions/backend1/django_app/process-data.d.ts +51 -0
  16. package/dist/actions/backend1/django_app/process-data.js +78 -0
  17. package/dist/actions/backend1/django_app/process-data.schema.json +117 -0
  18. package/dist/actions/backend1/django_app/send-notification.d.ts +55 -0
  19. package/dist/actions/backend1/django_app/send-notification.js +81 -0
  20. package/dist/actions/backend1/django_app/send-notification.schema.json +175 -0
  21. package/dist/actions/backend1/index.d.ts +1 -0
  22. package/dist/actions/backend1/index.js +1 -0
  23. package/dist/actions/default/django_app/calculate-hash.d.ts +57 -0
  24. package/dist/actions/default/django_app/calculate-hash.js +80 -0
  25. package/dist/actions/default/django_app/calculate-hash.schema.json +148 -0
  26. package/dist/actions/default/django_app/get-current-username.d.ts +29 -0
  27. package/dist/actions/default/django_app/get-current-username.js +65 -0
  28. package/dist/actions/default/django_app/get-current-username.schema.json +47 -0
  29. package/dist/actions/default/django_app/get-server-status.d.ts +38 -0
  30. package/dist/actions/default/django_app/get-server-status.js +68 -0
  31. package/dist/actions/default/django_app/get-server-status.schema.json +93 -0
  32. package/dist/actions/default/django_app/get-user-info.d.ts +44 -0
  33. package/dist/actions/default/django_app/get-user-info.js +70 -0
  34. package/dist/actions/default/django_app/get-user-info.schema.json +127 -0
  35. package/dist/actions/default/django_app/index.d.ts +1 -0
  36. package/dist/actions/default/django_app/index.js +6 -0
  37. package/dist/actions/default/django_app/process-data.d.ts +51 -0
  38. package/dist/actions/default/django_app/process-data.js +78 -0
  39. package/dist/actions/default/django_app/process-data.schema.json +117 -0
  40. package/dist/actions/default/django_app/send-notification.d.ts +55 -0
  41. package/dist/actions/default/django_app/send-notification.js +81 -0
  42. package/dist/actions/default/django_app/send-notification.schema.json +175 -0
  43. package/dist/actions/default/index.d.ts +1 -0
  44. package/dist/actions/default/index.js +1 -0
  45. package/dist/actions/index.d.ts +1 -0
  46. package/dist/actions/index.js +5 -0
  47. package/dist/adaptors/react/composables.d.ts +1 -0
  48. package/dist/adaptors/react/composables.js +4 -0
  49. package/dist/adaptors/react/index.d.ts +1 -0
  50. package/dist/adaptors/react/index.js +1 -0
  51. package/dist/adaptors/vue/components/LayoutRenderer.js +46 -49
  52. package/dist/adaptors/vue/components/defaults/index.d.ts +7 -0
  53. package/dist/adaptors/vue/components/defaults/index.js +31 -0
  54. package/dist/adaptors/vue/components/index.d.ts +1 -0
  55. package/dist/adaptors/vue/components/index.js +7 -0
  56. package/dist/adaptors/vue/composables.d.ts +2 -0
  57. package/dist/adaptors/vue/composables.js +44 -0
  58. package/dist/adaptors/vue/index.d.ts +3 -0
  59. package/dist/adaptors/vue/index.js +4 -0
  60. package/dist/adaptors/vue/reactivity.d.ts +18 -0
  61. package/dist/adaptors/vue/reactivity.js +132 -0
  62. package/dist/cli/commands/sync.d.ts +6 -0
  63. package/dist/cli/commands/sync.js +30 -0
  64. package/dist/cli/commands/syncActions.d.ts +46 -0
  65. package/dist/cli/commands/syncActions.js +717 -0
  66. package/dist/cli/commands/syncModels.d.ts +132 -0
  67. package/dist/cli/commands/syncModels.js +1120 -0
  68. package/dist/cli/configFileLoader.d.ts +10 -0
  69. package/dist/cli/configFileLoader.js +85 -0
  70. package/dist/cli/index.d.ts +2 -0
  71. package/dist/cli/index.js +22 -0
  72. package/dist/config.d.ts +57 -0
  73. package/dist/config.js +273 -0
  74. package/dist/core/eventReceivers.d.ts +185 -0
  75. package/dist/core/eventReceivers.js +266 -0
  76. package/dist/core/utils.d.ts +8 -0
  77. package/dist/core/utils.js +62 -0
  78. package/dist/errorHandler.d.ts +21 -0
  79. package/dist/errorHandler.js +27 -0
  80. package/dist/filtering/localFiltering.d.ts +110 -0
  81. package/dist/filtering/localFiltering.js +1080 -0
  82. package/dist/flavours/django/dates.d.ts +34 -0
  83. package/dist/flavours/django/dates.js +113 -0
  84. package/dist/flavours/django/errors.d.ts +138 -0
  85. package/dist/flavours/django/errors.js +195 -0
  86. package/dist/flavours/django/f.d.ts +6 -0
  87. package/dist/flavours/django/f.js +91 -0
  88. package/dist/flavours/django/files.d.ts +62 -0
  89. package/dist/flavours/django/files.js +355 -0
  90. package/dist/flavours/django/makeApiCall.d.ts +36 -0
  91. package/dist/flavours/django/makeApiCall.js +169 -0
  92. package/dist/flavours/django/manager.d.ts +204 -0
  93. package/dist/flavours/django/manager.js +222 -0
  94. package/dist/flavours/django/model.d.ts +137 -0
  95. package/dist/flavours/django/model.js +366 -0
  96. package/dist/flavours/django/operationFactory.d.ts +73 -0
  97. package/dist/flavours/django/operationFactory.js +248 -0
  98. package/dist/flavours/django/q.d.ts +70 -0
  99. package/dist/flavours/django/q.js +43 -0
  100. package/dist/flavours/django/queryExecutor.d.ts +149 -0
  101. package/dist/flavours/django/queryExecutor.js +590 -0
  102. package/dist/flavours/django/querySet.d.ts +301 -0
  103. package/dist/flavours/django/querySet.js +736 -0
  104. package/dist/flavours/django/serializers.d.ts +39 -0
  105. package/dist/flavours/django/serializers.js +296 -0
  106. package/dist/flavours/django/tempPk.d.ts +31 -0
  107. package/dist/flavours/django/tempPk.js +92 -0
  108. package/dist/flavours/django/utils.d.ts +19 -0
  109. package/dist/flavours/django/utils.js +29 -0
  110. package/dist/index.d.ts +46 -0
  111. package/dist/index.js +48 -0
  112. package/dist/models/backend1/django_app/comprehensivemodel.d.ts +894 -0
  113. package/dist/models/backend1/django_app/comprehensivemodel.js +71 -0
  114. package/dist/models/backend1/django_app/comprehensivemodel.schema.json +870 -0
  115. package/dist/models/backend1/django_app/custompkmodel.d.ts +92 -0
  116. package/dist/models/backend1/django_app/custompkmodel.js +69 -0
  117. package/dist/models/backend1/django_app/custompkmodel.schema.json +71 -0
  118. package/dist/models/backend1/django_app/dailyrate.d.ts +230 -0
  119. package/dist/models/backend1/django_app/dailyrate.js +71 -0
  120. package/dist/models/backend1/django_app/dailyrate.schema.json +212 -0
  121. package/dist/models/backend1/django_app/deepmodellevel1.d.ts +140 -0
  122. package/dist/models/backend1/django_app/deepmodellevel1.js +72 -0
  123. package/dist/models/backend1/django_app/deepmodellevel1.schema.json +114 -0
  124. package/dist/models/backend1/django_app/deepmodellevel2.d.ts +118 -0
  125. package/dist/models/backend1/django_app/deepmodellevel2.js +71 -0
  126. package/dist/models/backend1/django_app/deepmodellevel2.schema.json +92 -0
  127. package/dist/models/backend1/django_app/deepmodellevel3.d.ts +92 -0
  128. package/dist/models/backend1/django_app/deepmodellevel3.js +69 -0
  129. package/dist/models/backend1/django_app/deepmodellevel3.schema.json +69 -0
  130. package/dist/models/backend1/django_app/dummymodel.d.ts +134 -0
  131. package/dist/models/backend1/django_app/dummymodel.js +71 -0
  132. package/dist/models/backend1/django_app/dummymodel.schema.json +109 -0
  133. package/dist/models/backend1/django_app/dummyrelatedmodel.d.ts +92 -0
  134. package/dist/models/backend1/django_app/dummyrelatedmodel.js +69 -0
  135. package/dist/models/backend1/django_app/dummyrelatedmodel.schema.json +69 -0
  136. package/dist/models/backend1/django_app/filetest.d.ts +140 -0
  137. package/dist/models/backend1/django_app/filetest.js +69 -0
  138. package/dist/models/backend1/django_app/filetest.schema.json +111 -0
  139. package/dist/models/backend1/django_app/index.d.ts +1 -0
  140. package/dist/models/backend1/django_app/index.js +21 -0
  141. package/dist/models/backend1/django_app/m2mdepthtestlevel1.d.ts +118 -0
  142. package/dist/models/backend1/django_app/m2mdepthtestlevel1.js +71 -0
  143. package/dist/models/backend1/django_app/m2mdepthtestlevel1.schema.json +94 -0
  144. package/dist/models/backend1/django_app/m2mdepthtestlevel2.d.ts +118 -0
  145. package/dist/models/backend1/django_app/m2mdepthtestlevel2.js +71 -0
  146. package/dist/models/backend1/django_app/m2mdepthtestlevel2.schema.json +94 -0
  147. package/dist/models/backend1/django_app/m2mdepthtestlevel3.d.ts +134 -0
  148. package/dist/models/backend1/django_app/m2mdepthtestlevel3.js +71 -0
  149. package/dist/models/backend1/django_app/m2mdepthtestlevel3.schema.json +112 -0
  150. package/dist/models/backend1/django_app/modelwithcustompkrelation.d.ts +118 -0
  151. package/dist/models/backend1/django_app/modelwithcustompkrelation.js +71 -0
  152. package/dist/models/backend1/django_app/modelwithcustompkrelation.schema.json +93 -0
  153. package/dist/models/backend1/django_app/modelwithrestrictedfields.d.ts +134 -0
  154. package/dist/models/backend1/django_app/modelwithrestrictedfields.js +71 -0
  155. package/dist/models/backend1/django_app/modelwithrestrictedfields.schema.json +111 -0
  156. package/dist/models/backend1/django_app/namefiltercustompkmodel.d.ts +92 -0
  157. package/dist/models/backend1/django_app/namefiltercustompkmodel.js +69 -0
  158. package/dist/models/backend1/django_app/namefiltercustompkmodel.schema.json +71 -0
  159. package/dist/models/backend1/django_app/order.d.ts +220 -0
  160. package/dist/models/backend1/django_app/order.js +71 -0
  161. package/dist/models/backend1/django_app/order.schema.json +203 -0
  162. package/dist/models/backend1/django_app/orderitem.d.ts +172 -0
  163. package/dist/models/backend1/django_app/orderitem.js +72 -0
  164. package/dist/models/backend1/django_app/orderitem.schema.json +149 -0
  165. package/dist/models/backend1/django_app/product.d.ts +254 -0
  166. package/dist/models/backend1/django_app/product.js +71 -0
  167. package/dist/models/backend1/django_app/product.schema.json +277 -0
  168. package/dist/models/backend1/django_app/productcategory.d.ts +92 -0
  169. package/dist/models/backend1/django_app/productcategory.js +69 -0
  170. package/dist/models/backend1/django_app/productcategory.schema.json +70 -0
  171. package/dist/models/backend1/django_app/rateplan.d.ts +92 -0
  172. package/dist/models/backend1/django_app/rateplan.js +69 -0
  173. package/dist/models/backend1/django_app/rateplan.schema.json +70 -0
  174. package/dist/models/backend1/django_app/restrictedfieldrelatedmodel.d.ts +108 -0
  175. package/dist/models/backend1/django_app/restrictedfieldrelatedmodel.js +69 -0
  176. package/dist/models/backend1/django_app/restrictedfieldrelatedmodel.schema.json +87 -0
  177. package/dist/models/backend1/fileobject.d.ts +4 -0
  178. package/dist/models/backend1/fileobject.js +9 -0
  179. package/dist/models/backend1/index.d.ts +2 -0
  180. package/dist/models/backend1/index.js +2 -0
  181. package/dist/models/default/django_app/comprehensivemodel.d.ts +894 -0
  182. package/dist/models/default/django_app/comprehensivemodel.js +71 -0
  183. package/dist/models/default/django_app/comprehensivemodel.schema.json +870 -0
  184. package/dist/models/default/django_app/custompkmodel.d.ts +92 -0
  185. package/dist/models/default/django_app/custompkmodel.js +69 -0
  186. package/dist/models/default/django_app/custompkmodel.schema.json +71 -0
  187. package/dist/models/default/django_app/dailyrate.d.ts +230 -0
  188. package/dist/models/default/django_app/dailyrate.js +71 -0
  189. package/dist/models/default/django_app/dailyrate.schema.json +212 -0
  190. package/dist/models/default/django_app/deepmodellevel1.d.ts +128 -0
  191. package/dist/models/default/django_app/deepmodellevel1.js +72 -0
  192. package/dist/models/default/django_app/deepmodellevel1.schema.json +102 -0
  193. package/dist/models/default/django_app/deepmodellevel2.d.ts +106 -0
  194. package/dist/models/default/django_app/deepmodellevel2.js +71 -0
  195. package/dist/models/default/django_app/deepmodellevel2.schema.json +80 -0
  196. package/dist/models/default/django_app/deepmodellevel3.d.ts +80 -0
  197. package/dist/models/default/django_app/deepmodellevel3.js +69 -0
  198. package/dist/models/default/django_app/deepmodellevel3.schema.json +57 -0
  199. package/dist/models/default/django_app/dummymodel.d.ts +122 -0
  200. package/dist/models/default/django_app/dummymodel.js +71 -0
  201. package/dist/models/default/django_app/dummymodel.schema.json +97 -0
  202. package/dist/models/default/django_app/dummyrelatedmodel.d.ts +80 -0
  203. package/dist/models/default/django_app/dummyrelatedmodel.js +69 -0
  204. package/dist/models/default/django_app/dummyrelatedmodel.schema.json +57 -0
  205. package/dist/models/default/django_app/filetest.d.ts +128 -0
  206. package/dist/models/default/django_app/filetest.js +69 -0
  207. package/dist/models/default/django_app/filetest.schema.json +99 -0
  208. package/dist/models/default/django_app/index.d.ts +1 -0
  209. package/dist/models/default/django_app/index.js +21 -0
  210. package/dist/models/default/django_app/m2mdepthtestlevel1.d.ts +118 -0
  211. package/dist/models/default/django_app/m2mdepthtestlevel1.js +71 -0
  212. package/dist/models/default/django_app/m2mdepthtestlevel1.schema.json +94 -0
  213. package/dist/models/default/django_app/m2mdepthtestlevel2.d.ts +118 -0
  214. package/dist/models/default/django_app/m2mdepthtestlevel2.js +71 -0
  215. package/dist/models/default/django_app/m2mdepthtestlevel2.schema.json +94 -0
  216. package/dist/models/default/django_app/m2mdepthtestlevel3.d.ts +134 -0
  217. package/dist/models/default/django_app/m2mdepthtestlevel3.js +71 -0
  218. package/dist/models/default/django_app/m2mdepthtestlevel3.schema.json +112 -0
  219. package/dist/models/default/django_app/modelwithcustompkrelation.d.ts +118 -0
  220. package/dist/models/default/django_app/modelwithcustompkrelation.js +71 -0
  221. package/dist/models/default/django_app/modelwithcustompkrelation.schema.json +93 -0
  222. package/dist/models/default/django_app/modelwithrestrictedfields.d.ts +134 -0
  223. package/dist/models/default/django_app/modelwithrestrictedfields.js +71 -0
  224. package/dist/models/default/django_app/modelwithrestrictedfields.schema.json +111 -0
  225. package/dist/models/default/django_app/namefiltercustompkmodel.d.ts +92 -0
  226. package/dist/models/default/django_app/namefiltercustompkmodel.js +69 -0
  227. package/dist/models/default/django_app/namefiltercustompkmodel.schema.json +71 -0
  228. package/dist/models/default/django_app/order.d.ts +220 -0
  229. package/dist/models/default/django_app/order.js +71 -0
  230. package/dist/models/default/django_app/order.schema.json +203 -0
  231. package/dist/models/default/django_app/orderitem.d.ts +172 -0
  232. package/dist/models/default/django_app/orderitem.js +72 -0
  233. package/dist/models/default/django_app/orderitem.schema.json +149 -0
  234. package/dist/models/default/django_app/product.d.ts +254 -0
  235. package/dist/models/default/django_app/product.js +71 -0
  236. package/dist/models/default/django_app/product.schema.json +277 -0
  237. package/dist/models/default/django_app/productcategory.d.ts +92 -0
  238. package/dist/models/default/django_app/productcategory.js +69 -0
  239. package/dist/models/default/django_app/productcategory.schema.json +70 -0
  240. package/dist/models/default/django_app/rateplan.d.ts +92 -0
  241. package/dist/models/default/django_app/rateplan.js +69 -0
  242. package/dist/models/default/django_app/rateplan.schema.json +70 -0
  243. package/dist/models/default/django_app/restrictedfieldrelatedmodel.d.ts +108 -0
  244. package/dist/models/default/django_app/restrictedfieldrelatedmodel.js +69 -0
  245. package/dist/models/default/django_app/restrictedfieldrelatedmodel.schema.json +87 -0
  246. package/dist/models/default/fileobject.d.ts +4 -0
  247. package/dist/models/default/fileobject.js +9 -0
  248. package/dist/models/default/index.d.ts +2 -0
  249. package/dist/models/default/index.js +2 -0
  250. package/dist/models/index.d.ts +1 -0
  251. package/dist/models/index.js +5 -0
  252. package/dist/react-entry.d.ts +2 -0
  253. package/dist/react-entry.js +2 -0
  254. package/dist/reactiveAdaptor.d.ts +24 -0
  255. package/dist/reactiveAdaptor.js +38 -0
  256. package/dist/reset.d.ts +15 -0
  257. package/dist/reset.js +97 -0
  258. package/dist/setup.d.ts +15 -0
  259. package/dist/setup.js +33 -0
  260. package/dist/syncEngine/cache/cache.d.ts +75 -0
  261. package/dist/syncEngine/cache/cache.js +355 -0
  262. package/dist/syncEngine/metrics/metricOptCalcs.d.ts +79 -0
  263. package/dist/syncEngine/metrics/metricOptCalcs.js +284 -0
  264. package/dist/syncEngine/registries/metricRegistry.d.ts +58 -0
  265. package/dist/syncEngine/registries/metricRegistry.js +171 -0
  266. package/dist/syncEngine/registries/modelStoreRegistry.d.ts +11 -0
  267. package/dist/syncEngine/registries/modelStoreRegistry.js +63 -0
  268. package/dist/syncEngine/registries/querysetStoreGraph.d.ts +41 -0
  269. package/dist/syncEngine/registries/querysetStoreGraph.js +174 -0
  270. package/dist/syncEngine/registries/querysetStoreRegistry.d.ts +72 -0
  271. package/dist/syncEngine/registries/querysetStoreRegistry.js +335 -0
  272. package/dist/syncEngine/stores/metricStore.d.ts +55 -0
  273. package/dist/syncEngine/stores/metricStore.js +222 -0
  274. package/dist/syncEngine/stores/modelStore.d.ts +53 -0
  275. package/dist/syncEngine/stores/modelStore.js +565 -0
  276. package/dist/syncEngine/stores/operation.d.ts +139 -0
  277. package/dist/syncEngine/stores/operation.js +291 -0
  278. package/dist/syncEngine/stores/operationEventHandlers.d.ts +8 -0
  279. package/dist/syncEngine/stores/operationEventHandlers.js +322 -0
  280. package/dist/syncEngine/stores/querysetStore.d.ts +60 -0
  281. package/dist/syncEngine/stores/querysetStore.js +294 -0
  282. package/dist/syncEngine/stores/reactivity.d.ts +3 -0
  283. package/dist/syncEngine/stores/reactivity.js +4 -0
  284. package/dist/syncEngine/stores/utils.d.ts +14 -0
  285. package/dist/syncEngine/stores/utils.js +32 -0
  286. package/dist/syncEngine/sync.d.ts +46 -0
  287. package/dist/syncEngine/sync.js +389 -0
  288. package/dist/testing.d.ts +63 -0
  289. package/dist/testing.js +175 -0
  290. package/dist/vue-entry.d.ts +15 -0
  291. package/dist/vue-entry.js +7 -0
  292. package/package.json +6 -7
  293. package/dist/adaptors/vue/components/layout.tailwind.css +0 -51
  294. /package/{dist → src}/adaptors/vue/components/layout.css +0 -0
@@ -0,0 +1,75 @@
1
+ /**
2
+ * Simple IndexedDB key-value store with batched operations
3
+ */
4
+ export class IndexedDBStore {
5
+ constructor(dbName: any, options?: {});
6
+ dbName: any;
7
+ storeName: any;
8
+ batchDelay: any;
9
+ version: any;
10
+ resetOnErrors: any;
11
+ pendingOps: any[];
12
+ activeCommit: Promise<void> | null;
13
+ _destroyed: boolean;
14
+ dbPromise: Promise<any>;
15
+ /**
16
+ * Attempt to open the database, with automatic recovery if it fails
17
+ */
18
+ _openDatabaseWithRecovery(): Promise<any>;
19
+ /**
20
+ * Open the database
21
+ */
22
+ _openDatabase(): Promise<any>;
23
+ /**
24
+ * Delete the database
25
+ */
26
+ _deleteDatabase(): Promise<any>;
27
+ /**
28
+ * Retrieve a value by key
29
+ */
30
+ get(key: any): Promise<any>;
31
+ /**
32
+ * Store a value with the given key
33
+ */
34
+ set(key: any, value: any): Promise<any>;
35
+ /**
36
+ * Remove a key-value pair
37
+ */
38
+ delete(key: any): Promise<any>;
39
+ /**
40
+ * Delete the entire database
41
+ */
42
+ destroy(): Promise<void>;
43
+ /**
44
+ * Kick off a batch if none is running
45
+ */
46
+ _startCommitIfNeeded(): Promise<void>;
47
+ /**
48
+ * Add this method to the IndexedDBStore class
49
+ */
50
+ getAllKeys(): Promise<any>;
51
+ /**
52
+ * Get all entries from the store
53
+ * @returns {Promise<Array<[any, any]>>} Array of [key, value] pairs
54
+ */
55
+ getAll(): Promise<Array<[any, any]>>;
56
+ /**
57
+ * Execute all pending operations in one transaction
58
+ */
59
+ _executeBatch(): Promise<void>;
60
+ }
61
+ export class Cache {
62
+ constructor(dbName: any, options?: {}, onHydrated?: null);
63
+ store: IndexedDBStore;
64
+ localMap: Map<any, any>;
65
+ hydrate(): Promise<void>;
66
+ get(key: any): any;
67
+ set(key: any, value: any): void;
68
+ delete(key: any): void;
69
+ getAllKeys(): Promise<any>;
70
+ /**
71
+ * Clear all entries from the cache
72
+ * Clears the in-memory map and schedules deletion of all keys in IndexedDB
73
+ */
74
+ clear(): void;
75
+ }
@@ -0,0 +1,355 @@
1
+ const dbConnections = new Map();
2
+ /**
3
+ * Simple IndexedDB key-value store with batched operations
4
+ */
5
+ export class IndexedDBStore {
6
+ constructor(dbName, options = {}) {
7
+ this.dbName = dbName;
8
+ this.storeName = options.storeName || "keyval-store";
9
+ this.batchDelay = options.batchDelay || 50;
10
+ this.version = options.version || 5;
11
+ // List of error names or messages that should trigger database deletion
12
+ this.resetOnErrors = options.resetOnErrors || [
13
+ "VersionError",
14
+ "InvalidStateError",
15
+ "Failed to open database"
16
+ ];
17
+ // Queue of pending operations
18
+ this.pendingOps = [];
19
+ this.activeCommit = null;
20
+ // Whether destroy() has been called
21
+ this._destroyed = false;
22
+ // Open the database once
23
+ this.dbPromise = this._openDatabaseWithRecovery();
24
+ }
25
+ /**
26
+ * Attempt to open the database, with automatic recovery if it fails
27
+ */
28
+ async _openDatabaseWithRecovery() {
29
+ try {
30
+ return await this._openDatabase();
31
+ }
32
+ catch (error) {
33
+ // Check if this is an error type that should trigger reset
34
+ const shouldReset = this.resetOnErrors.some(errorPattern => error.name === errorPattern ||
35
+ error.message.includes(errorPattern));
36
+ if (shouldReset) {
37
+ console.warn(`[IndexedDBStore] Database error detected, attempting to reset database "${this.dbName}":`, error);
38
+ try {
39
+ // Delete the database
40
+ await this._deleteDatabase();
41
+ console.log(`[IndexedDBStore] Successfully deleted database "${this.dbName}", attempting to reopen...`);
42
+ // Try to open it again at the desired version
43
+ return await this._openDatabase();
44
+ }
45
+ catch (resetError) {
46
+ console.error(`[IndexedDBStore] Failed to recover database "${this.dbName}":`, resetError);
47
+ throw resetError;
48
+ }
49
+ }
50
+ else {
51
+ // Not a recoverable error
52
+ throw error;
53
+ }
54
+ }
55
+ }
56
+ /**
57
+ * Open the database
58
+ */
59
+ _openDatabase() {
60
+ return new Promise((resolve, reject) => {
61
+ const openRequest = indexedDB.open(this.dbName, this.version);
62
+ openRequest.onupgradeneeded = () => {
63
+ try {
64
+ // Create the object store if it doesn't exist
65
+ if (!openRequest.result.objectStoreNames.contains(this.storeName)) {
66
+ openRequest.result.createObjectStore(this.storeName);
67
+ }
68
+ }
69
+ catch (error) {
70
+ console.error(`[IndexedDBStore] Error during upgrade:`, error);
71
+ // Error during upgrade should reject the promise
72
+ reject(error);
73
+ }
74
+ };
75
+ openRequest.onsuccess = () => resolve(openRequest.result);
76
+ openRequest.onerror = () => reject(new Error(`Failed to open database: ${openRequest.error}`));
77
+ });
78
+ }
79
+ /**
80
+ * Delete the database
81
+ */
82
+ _deleteDatabase() {
83
+ return new Promise((resolve, reject) => {
84
+ const deleteRequest = indexedDB.deleteDatabase(this.dbName);
85
+ deleteRequest.onsuccess = () => resolve();
86
+ deleteRequest.onerror = () => reject(new Error(`Failed to delete database: ${deleteRequest.error}`));
87
+ });
88
+ }
89
+ /**
90
+ * Retrieve a value by key
91
+ */
92
+ async get(key) {
93
+ if (this._destroyed) {
94
+ throw new Error("Database has been destroyed");
95
+ }
96
+ // Schedule the get in the next batch
97
+ const getPromise = new Promise((resolve, reject) => {
98
+ this.pendingOps.push({ operation: "get", key, resolve, reject });
99
+ });
100
+ // Wait for that batch to run (or reject if destroyed)
101
+ await this._startCommitIfNeeded();
102
+ return getPromise;
103
+ }
104
+ /**
105
+ * Store a value with the given key
106
+ */
107
+ async set(key, value) {
108
+ if (this._destroyed) {
109
+ throw new Error("Database has been destroyed");
110
+ }
111
+ // Schedule the set in the next batch with a promise
112
+ const setPromise = new Promise((resolve, reject) => {
113
+ this.pendingOps.push({ operation: "set", key, value, resolve, reject });
114
+ });
115
+ // Wait for that batch to run (or reject if destroyed)
116
+ await this._startCommitIfNeeded();
117
+ return setPromise;
118
+ }
119
+ /**
120
+ * Remove a key-value pair
121
+ */
122
+ async delete(key) {
123
+ if (this._destroyed) {
124
+ throw new Error("Database has been destroyed");
125
+ }
126
+ // Schedule the delete in the next batch with a promise
127
+ const deletePromise = new Promise((resolve, reject) => {
128
+ this.pendingOps.push({ operation: "delete", key, resolve, reject });
129
+ });
130
+ // Wait for that batch to run (or reject if destroyed)
131
+ await this._startCommitIfNeeded();
132
+ return deletePromise;
133
+ }
134
+ /**
135
+ * Delete the entire database
136
+ */
137
+ async destroy() {
138
+ // Prevent any future actions
139
+ this._destroyed = true;
140
+ // Reject all pending operations
141
+ const error = new Error("Database has been destroyed");
142
+ for (const op of this.pendingOps) {
143
+ if (op.reject) {
144
+ op.reject(error);
145
+ }
146
+ }
147
+ this.pendingOps = [];
148
+ try {
149
+ // Close current connection if we have one
150
+ const db = await this.dbPromise;
151
+ db.close();
152
+ // Drop the whole database
153
+ await new Promise((resolve, reject) => {
154
+ const deleteRequest = indexedDB.deleteDatabase(this.dbName);
155
+ deleteRequest.onsuccess = () => resolve();
156
+ deleteRequest.onerror = () => reject(deleteRequest.error);
157
+ });
158
+ }
159
+ catch (error) {
160
+ // If database opening failed, we can safely ignore this
161
+ // as there's no active connection to close
162
+ }
163
+ }
164
+ /**
165
+ * Kick off a batch if none is running
166
+ */
167
+ _startCommitIfNeeded() {
168
+ if (this._destroyed) {
169
+ return Promise.reject(new Error("Database has been destroyed"));
170
+ }
171
+ if (!this.activeCommit) {
172
+ this.activeCommit = this._executeBatch();
173
+ }
174
+ return this.activeCommit;
175
+ }
176
+ /**
177
+ * Add this method to the IndexedDBStore class
178
+ */
179
+ async getAllKeys() {
180
+ if (this._destroyed) {
181
+ throw new Error("Database has been destroyed");
182
+ }
183
+ const db = await this.dbPromise;
184
+ const tx = db.transaction(this.storeName, "readonly");
185
+ const store = tx.objectStore(this.storeName);
186
+ return new Promise((resolve, reject) => {
187
+ const request = store.getAllKeys();
188
+ request.onsuccess = () => resolve(request.result);
189
+ request.onerror = () => reject(request.error);
190
+ });
191
+ }
192
+ /**
193
+ * Get all entries from the store
194
+ * @returns {Promise<Array<[any, any]>>} Array of [key, value] pairs
195
+ */
196
+ async getAll() {
197
+ if (this._destroyed) {
198
+ throw new Error("Database has been destroyed");
199
+ }
200
+ // Use a direct transaction for better performance with large datasets
201
+ const db = await this.dbPromise;
202
+ const tx = db.transaction(this.storeName, "readonly");
203
+ const store = tx.objectStore(this.storeName);
204
+ // Get all keys and values
205
+ const keysRequest = store.getAllKeys();
206
+ const valuesRequest = store.getAll();
207
+ // Wait for both requests to complete
208
+ const [keys, values] = await Promise.all([
209
+ new Promise((resolve, reject) => {
210
+ keysRequest.onsuccess = () => resolve(keysRequest.result);
211
+ keysRequest.onerror = () => reject(keysRequest.error);
212
+ }),
213
+ new Promise((resolve, reject) => {
214
+ valuesRequest.onsuccess = () => resolve(valuesRequest.result);
215
+ valuesRequest.onerror = () => reject(valuesRequest.error);
216
+ })
217
+ ]);
218
+ // Combine keys and values into entries
219
+ return keys.map((key, index) => [key, values[index]]);
220
+ }
221
+ /**
222
+ * Execute all pending operations in one transaction
223
+ */
224
+ async _executeBatch() {
225
+ // Brief pause so multiple ops can be coalesced
226
+ await new Promise((r) => setTimeout(r, this.batchDelay));
227
+ try {
228
+ // If we were destroyed in the meantime, abort and reject all pending operations
229
+ if (this._destroyed) {
230
+ const error = new Error("Database has been destroyed");
231
+ // Reject all pending operations
232
+ for (const op of this.pendingOps) {
233
+ if (op.reject) {
234
+ op.reject(error);
235
+ }
236
+ }
237
+ this.pendingOps = [];
238
+ return;
239
+ }
240
+ const db = await this.dbPromise;
241
+ const tx = db.transaction(this.storeName, "readwrite");
242
+ const store = tx.objectStore(this.storeName);
243
+ // Drain the queue
244
+ for (const op of this.pendingOps) {
245
+ switch (op.operation) {
246
+ case "get": {
247
+ const req = store.get(op.key);
248
+ req.onsuccess = () => op.resolve(req.result);
249
+ req.onerror = () => op.reject(req.error);
250
+ break;
251
+ }
252
+ case "set": {
253
+ const req = store.put(op.value, op.key);
254
+ req.onsuccess = () => op.resolve();
255
+ req.onerror = () => op.reject(req.error);
256
+ break;
257
+ }
258
+ case "delete": {
259
+ const req = store.delete(op.key);
260
+ req.onsuccess = () => op.resolve();
261
+ req.onerror = () => op.reject(req.error);
262
+ break;
263
+ }
264
+ }
265
+ }
266
+ this.pendingOps = [];
267
+ // Wait for the transaction to finish or fail
268
+ await new Promise((resolve, reject) => {
269
+ tx.oncomplete = () => resolve();
270
+ tx.onerror = () => reject(tx.error);
271
+ tx.onabort = (e) => reject(e.target.error);
272
+ });
273
+ }
274
+ catch (error) {
275
+ // If there's an error, make sure to reject all pending operations that have a reject function
276
+ for (const op of this.pendingOps) {
277
+ if (op.reject) {
278
+ op.reject(error);
279
+ }
280
+ }
281
+ this.pendingOps = [];
282
+ throw error; // Re-throw to propagate the error
283
+ }
284
+ finally {
285
+ // Allow a new batch to start
286
+ this.activeCommit = null;
287
+ }
288
+ }
289
+ }
290
+ export class Cache {
291
+ constructor(dbName, options = {}, onHydrated = null) {
292
+ this.store = new IndexedDBStore(dbName, options);
293
+ this.localMap = new Map();
294
+ // don't await - will hydrate during app setup
295
+ this.hydrate()
296
+ .then(result => {
297
+ if (typeof onHydrated === 'function') {
298
+ onHydrated(result);
299
+ }
300
+ })
301
+ .catch(err => {
302
+ console.error(`Cache hydration failed for "${dbName}":`, err);
303
+ });
304
+ }
305
+ async hydrate() {
306
+ this.localMap = new Map(await this.store.getAll());
307
+ }
308
+ get(key) {
309
+ return this.localMap.get(key);
310
+ }
311
+ set(key, value) {
312
+ this.localMap.set(key, value);
313
+ try {
314
+ this.store.set(key, structuredClone(value));
315
+ }
316
+ catch (e) {
317
+ const badFields = Object.entries(value).map(([k, v]) => {
318
+ try {
319
+ structuredClone(v);
320
+ return null;
321
+ }
322
+ catch {
323
+ return k;
324
+ }
325
+ }).filter(Boolean);
326
+ console.warn(`Cache.set failed for "${key}", problematic fields: ${badFields.join(', ')}`, e.message);
327
+ }
328
+ }
329
+ delete(key) {
330
+ this.localMap.delete(key);
331
+ this.store.delete(key);
332
+ }
333
+ async getAllKeys() {
334
+ return await this.store.getAllKeys();
335
+ }
336
+ /**
337
+ * Clear all entries from the cache
338
+ * Clears the in-memory map and schedules deletion of all keys in IndexedDB
339
+ */
340
+ clear() {
341
+ // Clear the in-memory map
342
+ this.localMap.clear();
343
+ // Get all keys from the store and delete them
344
+ this.store.getAll()
345
+ .then(entries => {
346
+ // Delete each key from the store
347
+ entries.forEach(([key]) => {
348
+ this.store.delete(key);
349
+ });
350
+ })
351
+ .catch(err => {
352
+ console.error('Error clearing cache:', err);
353
+ });
354
+ }
355
+ }
@@ -0,0 +1,79 @@
1
+ /**
2
+ * Base class for metric calculation strategies with operations
3
+ */
4
+ export class MetricCalculationStrategy {
5
+ /**
6
+ * Calculate metric based on ground truth and operations
7
+ */
8
+ calculateWithOperations(baseValue: any, operations: any, field: any, ModelClass: any): any;
9
+ /**
10
+ * Get initial value for the metric type
11
+ * Override in subclasses if needed
12
+ */
13
+ getInitialValue(): number;
14
+ /**
15
+ * Process a single operation - implement in subclasses
16
+ */
17
+ reduceOperation(currentValue: any, operation: any, field: any): void;
18
+ /**
19
+ * Safely get a numeric value from an object
20
+ */
21
+ safeGetValue(obj: any, field: any): number;
22
+ }
23
+ /**
24
+ * Count strategy implementation
25
+ */
26
+ export class CountStrategy extends MetricCalculationStrategy {
27
+ reduceOperation(currentCount: any, operation: any, field: any): any;
28
+ }
29
+ /**
30
+ * Sum strategy implementation
31
+ */
32
+ export class SumStrategy extends MetricCalculationStrategy {
33
+ reduceOperation(currentSum: any, operation: any, field: any): any;
34
+ }
35
+ /**
36
+ * Min strategy implementation
37
+ */
38
+ export class MinStrategy extends MetricCalculationStrategy {
39
+ reduceOperation(currentMin: any, operation: any, field: any): any;
40
+ }
41
+ /**
42
+ * Max strategy implementation
43
+ */
44
+ export class MaxStrategy extends MetricCalculationStrategy {
45
+ reduceOperation(currentMax: any, operation: any, field: any): any;
46
+ }
47
+ /**
48
+ * Factory class for creating the appropriate strategy
49
+ */
50
+ export class MetricStrategyFactory {
51
+ static "__#private@#customStrategies": Map<any, any>;
52
+ static "__#private@#defaultStrategies": Map<string, () => CountStrategy>;
53
+ /**
54
+ * Clear all custom strategy overrides
55
+ */
56
+ static clearCustomStrategies(): void;
57
+ /**
58
+ * Generate a unique key for the strategy map
59
+ * @private
60
+ * @param {string} metricType - The type of metric (count, sum, min, max)
61
+ * @param {Function} ModelClass - The model class
62
+ * @returns {string} A unique key
63
+ */
64
+ private static "__#private@#generateStrategyKey";
65
+ /**
66
+ * Override a strategy for a specific metric type and model class
67
+ * @param {string} metricType - The type of metric (count, sum, min, max)
68
+ * @param {Function|null} ModelClass - The model class or null for a generic override
69
+ * @param {MetricCalculationStrategy} strategy - The strategy to use
70
+ */
71
+ static overrideStrategy(metricType: string, ModelClass: Function | null, strategy: MetricCalculationStrategy): void;
72
+ /**
73
+ * Get the appropriate strategy for a model class and metric type
74
+ * @param {string} metricType - The type of metric (count, sum, min, max)
75
+ * @param {Function} ModelClass - The model class
76
+ * @returns {MetricCalculationStrategy} The appropriate strategy
77
+ */
78
+ static getStrategy(metricType: string, ModelClass: Function): MetricCalculationStrategy;
79
+ }