@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.
- package/dist/actions/backend1/django_app/calculate-hash.d.ts +57 -0
- package/dist/actions/backend1/django_app/calculate-hash.js +80 -0
- package/dist/actions/backend1/django_app/calculate-hash.schema.json +148 -0
- package/dist/actions/backend1/django_app/get-current-username.d.ts +29 -0
- package/dist/actions/backend1/django_app/get-current-username.js +65 -0
- package/dist/actions/backend1/django_app/get-current-username.schema.json +47 -0
- package/dist/actions/backend1/django_app/get-server-status.d.ts +38 -0
- package/dist/actions/backend1/django_app/get-server-status.js +68 -0
- package/dist/actions/backend1/django_app/get-server-status.schema.json +93 -0
- package/dist/actions/backend1/django_app/get-user-info.d.ts +44 -0
- package/dist/actions/backend1/django_app/get-user-info.js +70 -0
- package/dist/actions/backend1/django_app/get-user-info.schema.json +127 -0
- package/dist/actions/backend1/django_app/index.d.ts +1 -0
- package/dist/actions/backend1/django_app/index.js +6 -0
- package/dist/actions/backend1/django_app/process-data.d.ts +51 -0
- package/dist/actions/backend1/django_app/process-data.js +78 -0
- package/dist/actions/backend1/django_app/process-data.schema.json +117 -0
- package/dist/actions/backend1/django_app/send-notification.d.ts +55 -0
- package/dist/actions/backend1/django_app/send-notification.js +81 -0
- package/dist/actions/backend1/django_app/send-notification.schema.json +175 -0
- package/dist/actions/backend1/index.d.ts +1 -0
- package/dist/actions/backend1/index.js +1 -0
- package/dist/actions/default/django_app/calculate-hash.d.ts +57 -0
- package/dist/actions/default/django_app/calculate-hash.js +80 -0
- package/dist/actions/default/django_app/calculate-hash.schema.json +148 -0
- package/dist/actions/default/django_app/get-current-username.d.ts +29 -0
- package/dist/actions/default/django_app/get-current-username.js +65 -0
- package/dist/actions/default/django_app/get-current-username.schema.json +47 -0
- package/dist/actions/default/django_app/get-server-status.d.ts +38 -0
- package/dist/actions/default/django_app/get-server-status.js +68 -0
- package/dist/actions/default/django_app/get-server-status.schema.json +93 -0
- package/dist/actions/default/django_app/get-user-info.d.ts +44 -0
- package/dist/actions/default/django_app/get-user-info.js +70 -0
- package/dist/actions/default/django_app/get-user-info.schema.json +127 -0
- package/dist/actions/default/django_app/index.d.ts +1 -0
- package/dist/actions/default/django_app/index.js +6 -0
- package/dist/actions/default/django_app/process-data.d.ts +51 -0
- package/dist/actions/default/django_app/process-data.js +78 -0
- package/dist/actions/default/django_app/process-data.schema.json +117 -0
- package/dist/actions/default/django_app/send-notification.d.ts +55 -0
- package/dist/actions/default/django_app/send-notification.js +81 -0
- package/dist/actions/default/django_app/send-notification.schema.json +175 -0
- package/dist/actions/default/index.d.ts +1 -0
- package/dist/actions/default/index.js +1 -0
- package/dist/actions/index.d.ts +1 -0
- package/dist/actions/index.js +5 -0
- package/dist/adaptors/react/composables.d.ts +1 -0
- package/dist/adaptors/react/composables.js +4 -0
- package/dist/adaptors/react/index.d.ts +1 -0
- package/dist/adaptors/react/index.js +1 -0
- package/dist/adaptors/vue/components/LayoutRenderer.js +46 -49
- package/dist/adaptors/vue/components/defaults/index.d.ts +7 -0
- package/dist/adaptors/vue/components/defaults/index.js +31 -0
- package/dist/adaptors/vue/components/index.d.ts +1 -0
- package/dist/adaptors/vue/components/index.js +7 -0
- package/dist/adaptors/vue/composables.d.ts +2 -0
- package/dist/adaptors/vue/composables.js +44 -0
- package/dist/adaptors/vue/index.d.ts +3 -0
- package/dist/adaptors/vue/index.js +4 -0
- package/dist/adaptors/vue/reactivity.d.ts +18 -0
- package/dist/adaptors/vue/reactivity.js +132 -0
- package/dist/cli/commands/sync.d.ts +6 -0
- package/dist/cli/commands/sync.js +30 -0
- package/dist/cli/commands/syncActions.d.ts +46 -0
- package/dist/cli/commands/syncActions.js +717 -0
- package/dist/cli/commands/syncModels.d.ts +132 -0
- package/dist/cli/commands/syncModels.js +1120 -0
- package/dist/cli/configFileLoader.d.ts +10 -0
- package/dist/cli/configFileLoader.js +85 -0
- package/dist/cli/index.d.ts +2 -0
- package/dist/cli/index.js +22 -0
- package/dist/config.d.ts +57 -0
- package/dist/config.js +273 -0
- package/dist/core/eventReceivers.d.ts +185 -0
- package/dist/core/eventReceivers.js +266 -0
- package/dist/core/utils.d.ts +8 -0
- package/dist/core/utils.js +62 -0
- package/dist/errorHandler.d.ts +21 -0
- package/dist/errorHandler.js +27 -0
- package/dist/filtering/localFiltering.d.ts +110 -0
- package/dist/filtering/localFiltering.js +1080 -0
- package/dist/flavours/django/dates.d.ts +34 -0
- package/dist/flavours/django/dates.js +113 -0
- package/dist/flavours/django/errors.d.ts +138 -0
- package/dist/flavours/django/errors.js +195 -0
- package/dist/flavours/django/f.d.ts +6 -0
- package/dist/flavours/django/f.js +91 -0
- package/dist/flavours/django/files.d.ts +62 -0
- package/dist/flavours/django/files.js +355 -0
- package/dist/flavours/django/makeApiCall.d.ts +36 -0
- package/dist/flavours/django/makeApiCall.js +169 -0
- package/dist/flavours/django/manager.d.ts +204 -0
- package/dist/flavours/django/manager.js +222 -0
- package/dist/flavours/django/model.d.ts +137 -0
- package/dist/flavours/django/model.js +366 -0
- package/dist/flavours/django/operationFactory.d.ts +73 -0
- package/dist/flavours/django/operationFactory.js +248 -0
- package/dist/flavours/django/q.d.ts +70 -0
- package/dist/flavours/django/q.js +43 -0
- package/dist/flavours/django/queryExecutor.d.ts +149 -0
- package/dist/flavours/django/queryExecutor.js +590 -0
- package/dist/flavours/django/querySet.d.ts +301 -0
- package/dist/flavours/django/querySet.js +736 -0
- package/dist/flavours/django/serializers.d.ts +39 -0
- package/dist/flavours/django/serializers.js +296 -0
- package/dist/flavours/django/tempPk.d.ts +31 -0
- package/dist/flavours/django/tempPk.js +92 -0
- package/dist/flavours/django/utils.d.ts +19 -0
- package/dist/flavours/django/utils.js +29 -0
- package/dist/index.d.ts +46 -0
- package/dist/index.js +48 -0
- package/dist/models/backend1/django_app/comprehensivemodel.d.ts +894 -0
- package/dist/models/backend1/django_app/comprehensivemodel.js +71 -0
- package/dist/models/backend1/django_app/comprehensivemodel.schema.json +870 -0
- package/dist/models/backend1/django_app/custompkmodel.d.ts +92 -0
- package/dist/models/backend1/django_app/custompkmodel.js +69 -0
- package/dist/models/backend1/django_app/custompkmodel.schema.json +71 -0
- package/dist/models/backend1/django_app/dailyrate.d.ts +230 -0
- package/dist/models/backend1/django_app/dailyrate.js +71 -0
- package/dist/models/backend1/django_app/dailyrate.schema.json +212 -0
- package/dist/models/backend1/django_app/deepmodellevel1.d.ts +140 -0
- package/dist/models/backend1/django_app/deepmodellevel1.js +72 -0
- package/dist/models/backend1/django_app/deepmodellevel1.schema.json +114 -0
- package/dist/models/backend1/django_app/deepmodellevel2.d.ts +118 -0
- package/dist/models/backend1/django_app/deepmodellevel2.js +71 -0
- package/dist/models/backend1/django_app/deepmodellevel2.schema.json +92 -0
- package/dist/models/backend1/django_app/deepmodellevel3.d.ts +92 -0
- package/dist/models/backend1/django_app/deepmodellevel3.js +69 -0
- package/dist/models/backend1/django_app/deepmodellevel3.schema.json +69 -0
- package/dist/models/backend1/django_app/dummymodel.d.ts +134 -0
- package/dist/models/backend1/django_app/dummymodel.js +71 -0
- package/dist/models/backend1/django_app/dummymodel.schema.json +109 -0
- package/dist/models/backend1/django_app/dummyrelatedmodel.d.ts +92 -0
- package/dist/models/backend1/django_app/dummyrelatedmodel.js +69 -0
- package/dist/models/backend1/django_app/dummyrelatedmodel.schema.json +69 -0
- package/dist/models/backend1/django_app/filetest.d.ts +140 -0
- package/dist/models/backend1/django_app/filetest.js +69 -0
- package/dist/models/backend1/django_app/filetest.schema.json +111 -0
- package/dist/models/backend1/django_app/index.d.ts +1 -0
- package/dist/models/backend1/django_app/index.js +21 -0
- package/dist/models/backend1/django_app/m2mdepthtestlevel1.d.ts +118 -0
- package/dist/models/backend1/django_app/m2mdepthtestlevel1.js +71 -0
- package/dist/models/backend1/django_app/m2mdepthtestlevel1.schema.json +94 -0
- package/dist/models/backend1/django_app/m2mdepthtestlevel2.d.ts +118 -0
- package/dist/models/backend1/django_app/m2mdepthtestlevel2.js +71 -0
- package/dist/models/backend1/django_app/m2mdepthtestlevel2.schema.json +94 -0
- package/dist/models/backend1/django_app/m2mdepthtestlevel3.d.ts +134 -0
- package/dist/models/backend1/django_app/m2mdepthtestlevel3.js +71 -0
- package/dist/models/backend1/django_app/m2mdepthtestlevel3.schema.json +112 -0
- package/dist/models/backend1/django_app/modelwithcustompkrelation.d.ts +118 -0
- package/dist/models/backend1/django_app/modelwithcustompkrelation.js +71 -0
- package/dist/models/backend1/django_app/modelwithcustompkrelation.schema.json +93 -0
- package/dist/models/backend1/django_app/modelwithrestrictedfields.d.ts +134 -0
- package/dist/models/backend1/django_app/modelwithrestrictedfields.js +71 -0
- package/dist/models/backend1/django_app/modelwithrestrictedfields.schema.json +111 -0
- package/dist/models/backend1/django_app/namefiltercustompkmodel.d.ts +92 -0
- package/dist/models/backend1/django_app/namefiltercustompkmodel.js +69 -0
- package/dist/models/backend1/django_app/namefiltercustompkmodel.schema.json +71 -0
- package/dist/models/backend1/django_app/order.d.ts +220 -0
- package/dist/models/backend1/django_app/order.js +71 -0
- package/dist/models/backend1/django_app/order.schema.json +203 -0
- package/dist/models/backend1/django_app/orderitem.d.ts +172 -0
- package/dist/models/backend1/django_app/orderitem.js +72 -0
- package/dist/models/backend1/django_app/orderitem.schema.json +149 -0
- package/dist/models/backend1/django_app/product.d.ts +254 -0
- package/dist/models/backend1/django_app/product.js +71 -0
- package/dist/models/backend1/django_app/product.schema.json +277 -0
- package/dist/models/backend1/django_app/productcategory.d.ts +92 -0
- package/dist/models/backend1/django_app/productcategory.js +69 -0
- package/dist/models/backend1/django_app/productcategory.schema.json +70 -0
- package/dist/models/backend1/django_app/rateplan.d.ts +92 -0
- package/dist/models/backend1/django_app/rateplan.js +69 -0
- package/dist/models/backend1/django_app/rateplan.schema.json +70 -0
- package/dist/models/backend1/django_app/restrictedfieldrelatedmodel.d.ts +108 -0
- package/dist/models/backend1/django_app/restrictedfieldrelatedmodel.js +69 -0
- package/dist/models/backend1/django_app/restrictedfieldrelatedmodel.schema.json +87 -0
- package/dist/models/backend1/fileobject.d.ts +4 -0
- package/dist/models/backend1/fileobject.js +9 -0
- package/dist/models/backend1/index.d.ts +2 -0
- package/dist/models/backend1/index.js +2 -0
- package/dist/models/default/django_app/comprehensivemodel.d.ts +894 -0
- package/dist/models/default/django_app/comprehensivemodel.js +71 -0
- package/dist/models/default/django_app/comprehensivemodel.schema.json +870 -0
- package/dist/models/default/django_app/custompkmodel.d.ts +92 -0
- package/dist/models/default/django_app/custompkmodel.js +69 -0
- package/dist/models/default/django_app/custompkmodel.schema.json +71 -0
- package/dist/models/default/django_app/dailyrate.d.ts +230 -0
- package/dist/models/default/django_app/dailyrate.js +71 -0
- package/dist/models/default/django_app/dailyrate.schema.json +212 -0
- package/dist/models/default/django_app/deepmodellevel1.d.ts +128 -0
- package/dist/models/default/django_app/deepmodellevel1.js +72 -0
- package/dist/models/default/django_app/deepmodellevel1.schema.json +102 -0
- package/dist/models/default/django_app/deepmodellevel2.d.ts +106 -0
- package/dist/models/default/django_app/deepmodellevel2.js +71 -0
- package/dist/models/default/django_app/deepmodellevel2.schema.json +80 -0
- package/dist/models/default/django_app/deepmodellevel3.d.ts +80 -0
- package/dist/models/default/django_app/deepmodellevel3.js +69 -0
- package/dist/models/default/django_app/deepmodellevel3.schema.json +57 -0
- package/dist/models/default/django_app/dummymodel.d.ts +122 -0
- package/dist/models/default/django_app/dummymodel.js +71 -0
- package/dist/models/default/django_app/dummymodel.schema.json +97 -0
- package/dist/models/default/django_app/dummyrelatedmodel.d.ts +80 -0
- package/dist/models/default/django_app/dummyrelatedmodel.js +69 -0
- package/dist/models/default/django_app/dummyrelatedmodel.schema.json +57 -0
- package/dist/models/default/django_app/filetest.d.ts +128 -0
- package/dist/models/default/django_app/filetest.js +69 -0
- package/dist/models/default/django_app/filetest.schema.json +99 -0
- package/dist/models/default/django_app/index.d.ts +1 -0
- package/dist/models/default/django_app/index.js +21 -0
- package/dist/models/default/django_app/m2mdepthtestlevel1.d.ts +118 -0
- package/dist/models/default/django_app/m2mdepthtestlevel1.js +71 -0
- package/dist/models/default/django_app/m2mdepthtestlevel1.schema.json +94 -0
- package/dist/models/default/django_app/m2mdepthtestlevel2.d.ts +118 -0
- package/dist/models/default/django_app/m2mdepthtestlevel2.js +71 -0
- package/dist/models/default/django_app/m2mdepthtestlevel2.schema.json +94 -0
- package/dist/models/default/django_app/m2mdepthtestlevel3.d.ts +134 -0
- package/dist/models/default/django_app/m2mdepthtestlevel3.js +71 -0
- package/dist/models/default/django_app/m2mdepthtestlevel3.schema.json +112 -0
- package/dist/models/default/django_app/modelwithcustompkrelation.d.ts +118 -0
- package/dist/models/default/django_app/modelwithcustompkrelation.js +71 -0
- package/dist/models/default/django_app/modelwithcustompkrelation.schema.json +93 -0
- package/dist/models/default/django_app/modelwithrestrictedfields.d.ts +134 -0
- package/dist/models/default/django_app/modelwithrestrictedfields.js +71 -0
- package/dist/models/default/django_app/modelwithrestrictedfields.schema.json +111 -0
- package/dist/models/default/django_app/namefiltercustompkmodel.d.ts +92 -0
- package/dist/models/default/django_app/namefiltercustompkmodel.js +69 -0
- package/dist/models/default/django_app/namefiltercustompkmodel.schema.json +71 -0
- package/dist/models/default/django_app/order.d.ts +220 -0
- package/dist/models/default/django_app/order.js +71 -0
- package/dist/models/default/django_app/order.schema.json +203 -0
- package/dist/models/default/django_app/orderitem.d.ts +172 -0
- package/dist/models/default/django_app/orderitem.js +72 -0
- package/dist/models/default/django_app/orderitem.schema.json +149 -0
- package/dist/models/default/django_app/product.d.ts +254 -0
- package/dist/models/default/django_app/product.js +71 -0
- package/dist/models/default/django_app/product.schema.json +277 -0
- package/dist/models/default/django_app/productcategory.d.ts +92 -0
- package/dist/models/default/django_app/productcategory.js +69 -0
- package/dist/models/default/django_app/productcategory.schema.json +70 -0
- package/dist/models/default/django_app/rateplan.d.ts +92 -0
- package/dist/models/default/django_app/rateplan.js +69 -0
- package/dist/models/default/django_app/rateplan.schema.json +70 -0
- package/dist/models/default/django_app/restrictedfieldrelatedmodel.d.ts +108 -0
- package/dist/models/default/django_app/restrictedfieldrelatedmodel.js +69 -0
- package/dist/models/default/django_app/restrictedfieldrelatedmodel.schema.json +87 -0
- package/dist/models/default/fileobject.d.ts +4 -0
- package/dist/models/default/fileobject.js +9 -0
- package/dist/models/default/index.d.ts +2 -0
- package/dist/models/default/index.js +2 -0
- package/dist/models/index.d.ts +1 -0
- package/dist/models/index.js +5 -0
- package/dist/react-entry.d.ts +2 -0
- package/dist/react-entry.js +2 -0
- package/dist/reactiveAdaptor.d.ts +24 -0
- package/dist/reactiveAdaptor.js +38 -0
- package/dist/reset.d.ts +15 -0
- package/dist/reset.js +97 -0
- package/dist/setup.d.ts +15 -0
- package/dist/setup.js +33 -0
- package/dist/syncEngine/cache/cache.d.ts +75 -0
- package/dist/syncEngine/cache/cache.js +355 -0
- package/dist/syncEngine/metrics/metricOptCalcs.d.ts +79 -0
- package/dist/syncEngine/metrics/metricOptCalcs.js +284 -0
- package/dist/syncEngine/registries/metricRegistry.d.ts +58 -0
- package/dist/syncEngine/registries/metricRegistry.js +171 -0
- package/dist/syncEngine/registries/modelStoreRegistry.d.ts +11 -0
- package/dist/syncEngine/registries/modelStoreRegistry.js +63 -0
- package/dist/syncEngine/registries/querysetStoreGraph.d.ts +41 -0
- package/dist/syncEngine/registries/querysetStoreGraph.js +174 -0
- package/dist/syncEngine/registries/querysetStoreRegistry.d.ts +72 -0
- package/dist/syncEngine/registries/querysetStoreRegistry.js +335 -0
- package/dist/syncEngine/stores/metricStore.d.ts +55 -0
- package/dist/syncEngine/stores/metricStore.js +222 -0
- package/dist/syncEngine/stores/modelStore.d.ts +53 -0
- package/dist/syncEngine/stores/modelStore.js +565 -0
- package/dist/syncEngine/stores/operation.d.ts +139 -0
- package/dist/syncEngine/stores/operation.js +291 -0
- package/dist/syncEngine/stores/operationEventHandlers.d.ts +8 -0
- package/dist/syncEngine/stores/operationEventHandlers.js +322 -0
- package/dist/syncEngine/stores/querysetStore.d.ts +60 -0
- package/dist/syncEngine/stores/querysetStore.js +294 -0
- package/dist/syncEngine/stores/reactivity.d.ts +3 -0
- package/dist/syncEngine/stores/reactivity.js +4 -0
- package/dist/syncEngine/stores/utils.d.ts +14 -0
- package/dist/syncEngine/stores/utils.js +32 -0
- package/dist/syncEngine/sync.d.ts +46 -0
- package/dist/syncEngine/sync.js +389 -0
- package/dist/testing.d.ts +63 -0
- package/dist/testing.js +175 -0
- package/dist/vue-entry.d.ts +15 -0
- package/dist/vue-entry.js +7 -0
- package/package.json +6 -7
- package/dist/adaptors/vue/components/layout.tailwind.css +0 -51
- /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
|
+
}
|