@workglow/storage 0.0.85 → 0.0.87
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/README.md +185 -53
- package/dist/browser.js +451 -188
- package/dist/browser.js.map +21 -18
- package/dist/bun.js +1069 -356
- package/dist/bun.js.map +29 -24
- package/dist/common-server.d.ts +17 -15
- package/dist/common-server.d.ts.map +1 -1
- package/dist/common.d.ts +13 -10
- package/dist/common.d.ts.map +1 -1
- package/dist/kv/{FsFolderJsonKvRepository.d.ts → FsFolderJsonKvStorage.d.ts} +8 -8
- package/dist/kv/FsFolderJsonKvStorage.d.ts.map +1 -0
- package/dist/kv/{FsFolderKvRepository.d.ts → FsFolderKvStorage.d.ts} +7 -7
- package/dist/kv/FsFolderKvStorage.d.ts.map +1 -0
- package/dist/kv/{IKvRepository.d.ts → IKvStorage.d.ts} +3 -3
- package/dist/kv/IKvStorage.d.ts.map +1 -0
- package/dist/kv/{InMemoryKvRepository.d.ts → InMemoryKvStorage.d.ts} +8 -8
- package/dist/kv/InMemoryKvStorage.d.ts.map +1 -0
- package/dist/kv/{IndexedDbKvRepository.d.ts → IndexedDbKvStorage.d.ts} +8 -8
- package/dist/kv/IndexedDbKvStorage.d.ts.map +1 -0
- package/dist/kv/{KvRepository.d.ts → KvStorage.d.ts} +7 -7
- package/dist/kv/KvStorage.d.ts.map +1 -0
- package/dist/kv/{KvViaTabularRepository.d.ts → KvViaTabularStorage.d.ts} +7 -7
- package/dist/kv/KvViaTabularStorage.d.ts.map +1 -0
- package/dist/kv/{PostgresKvRepository.d.ts → PostgresKvStorage.d.ts} +8 -8
- package/dist/kv/PostgresKvStorage.d.ts.map +1 -0
- package/dist/kv/{SqliteKvRepository.d.ts → SqliteKvStorage.d.ts} +8 -8
- package/dist/kv/SqliteKvStorage.d.ts.map +1 -0
- package/dist/kv/{SupabaseKvRepository.d.ts → SupabaseKvStorage.d.ts} +9 -9
- package/dist/kv/SupabaseKvStorage.d.ts.map +1 -0
- package/dist/node.js +1069 -356
- package/dist/node.js.map +29 -24
- package/dist/queue-limiter/IRateLimiterStorage.d.ts.map +1 -0
- package/dist/queue-limiter/InMemoryRateLimiterStorage.d.ts.map +1 -0
- package/dist/queue-limiter/IndexedDbRateLimiterStorage.d.ts.map +1 -0
- package/dist/queue-limiter/PostgresRateLimiterStorage.d.ts.map +1 -0
- package/dist/queue-limiter/SqliteRateLimiterStorage.d.ts.map +1 -0
- package/dist/queue-limiter/SupabaseRateLimiterStorage.d.ts.map +1 -0
- package/dist/tabular/{BaseSqlTabularRepository.d.ts → BaseSqlTabularStorage.d.ts} +8 -7
- package/dist/tabular/BaseSqlTabularStorage.d.ts.map +1 -0
- package/dist/tabular/{TabularRepository.d.ts → BaseTabularStorage.d.ts} +52 -10
- package/dist/tabular/BaseTabularStorage.d.ts.map +1 -0
- package/dist/tabular/{CachedTabularRepository.d.ts → CachedTabularStorage.d.ts} +15 -14
- package/dist/tabular/CachedTabularStorage.d.ts.map +1 -0
- package/dist/tabular/{FsFolderTabularRepository.d.ts → FsFolderTabularStorage.d.ts} +22 -12
- package/dist/tabular/FsFolderTabularStorage.d.ts.map +1 -0
- package/dist/tabular/{ITabularRepository.d.ts → ITabularStorage.d.ts} +29 -6
- package/dist/tabular/ITabularStorage.d.ts.map +1 -0
- package/dist/tabular/{InMemoryTabularRepository.d.ts → InMemoryTabularStorage.d.ts} +24 -14
- package/dist/tabular/InMemoryTabularStorage.d.ts.map +1 -0
- package/dist/tabular/{IndexedDbTabularRepository.d.ts → IndexedDbTabularStorage.d.ts} +20 -11
- package/dist/tabular/IndexedDbTabularStorage.d.ts.map +1 -0
- package/dist/tabular/{PostgresTabularRepository.d.ts → PostgresTabularStorage.d.ts} +37 -15
- package/dist/tabular/PostgresTabularStorage.d.ts.map +1 -0
- package/dist/tabular/{SharedInMemoryTabularRepository.d.ts → SharedInMemoryTabularStorage.d.ts} +14 -13
- package/dist/tabular/SharedInMemoryTabularStorage.d.ts.map +1 -0
- package/dist/tabular/{SqliteTabularRepository.d.ts → SqliteTabularStorage.d.ts} +25 -11
- package/dist/tabular/SqliteTabularStorage.d.ts.map +1 -0
- package/dist/tabular/{SupabaseTabularRepository.d.ts → SupabaseTabularStorage.d.ts} +17 -15
- package/dist/tabular/SupabaseTabularStorage.d.ts.map +1 -0
- package/dist/tabular/TabularStorageRegistry.d.ts +29 -0
- package/dist/tabular/TabularStorageRegistry.d.ts.map +1 -0
- package/dist/util/IndexedDbTable.d.ts +1 -1
- package/dist/util/IndexedDbTable.d.ts.map +1 -1
- package/dist/vector/IVectorStorage.d.ts +83 -0
- package/dist/vector/IVectorStorage.d.ts.map +1 -0
- package/dist/vector/InMemoryVectorStorage.d.ts +41 -0
- package/dist/vector/InMemoryVectorStorage.d.ts.map +1 -0
- package/dist/vector/PostgresVectorStorage.d.ts +57 -0
- package/dist/vector/PostgresVectorStorage.d.ts.map +1 -0
- package/dist/vector/SqliteVectorStorage.d.ts +45 -0
- package/dist/vector/SqliteVectorStorage.d.ts.map +1 -0
- package/package.json +7 -7
- package/src/kv/README.md +3 -3
- package/src/tabular/README.md +186 -23
- package/src/vector/README.md +393 -0
- package/dist/kv/FsFolderJsonKvRepository.d.ts.map +0 -1
- package/dist/kv/FsFolderKvRepository.d.ts.map +0 -1
- package/dist/kv/IKvRepository.d.ts.map +0 -1
- package/dist/kv/InMemoryKvRepository.d.ts.map +0 -1
- package/dist/kv/IndexedDbKvRepository.d.ts.map +0 -1
- package/dist/kv/KvRepository.d.ts.map +0 -1
- package/dist/kv/KvViaTabularRepository.d.ts.map +0 -1
- package/dist/kv/PostgresKvRepository.d.ts.map +0 -1
- package/dist/kv/SqliteKvRepository.d.ts.map +0 -1
- package/dist/kv/SupabaseKvRepository.d.ts.map +0 -1
- package/dist/limiter/IRateLimiterStorage.d.ts.map +0 -1
- package/dist/limiter/InMemoryRateLimiterStorage.d.ts.map +0 -1
- package/dist/limiter/IndexedDbRateLimiterStorage.d.ts.map +0 -1
- package/dist/limiter/PostgresRateLimiterStorage.d.ts.map +0 -1
- package/dist/limiter/SqliteRateLimiterStorage.d.ts.map +0 -1
- package/dist/limiter/SupabaseRateLimiterStorage.d.ts.map +0 -1
- package/dist/tabular/BaseSqlTabularRepository.d.ts.map +0 -1
- package/dist/tabular/CachedTabularRepository.d.ts.map +0 -1
- package/dist/tabular/FsFolderTabularRepository.d.ts.map +0 -1
- package/dist/tabular/ITabularRepository.d.ts.map +0 -1
- package/dist/tabular/InMemoryTabularRepository.d.ts.map +0 -1
- package/dist/tabular/IndexedDbTabularRepository.d.ts.map +0 -1
- package/dist/tabular/PostgresTabularRepository.d.ts.map +0 -1
- package/dist/tabular/SharedInMemoryTabularRepository.d.ts.map +0 -1
- package/dist/tabular/SqliteTabularRepository.d.ts.map +0 -1
- package/dist/tabular/SupabaseTabularRepository.d.ts.map +0 -1
- package/dist/tabular/TabularRepository.d.ts.map +0 -1
- /package/dist/{limiter → queue-limiter}/IRateLimiterStorage.d.ts +0 -0
- /package/dist/{limiter → queue-limiter}/InMemoryRateLimiterStorage.d.ts +0 -0
- /package/dist/{limiter → queue-limiter}/IndexedDbRateLimiterStorage.d.ts +0 -0
- /package/dist/{limiter → queue-limiter}/PostgresRateLimiterStorage.d.ts +0 -0
- /package/dist/{limiter → queue-limiter}/SqliteRateLimiterStorage.d.ts +0 -0
- /package/dist/{limiter → queue-limiter}/SupabaseRateLimiterStorage.d.ts +0 -0
package/dist/browser.js
CHANGED
|
@@ -1,18 +1,4 @@
|
|
|
1
|
-
// src/tabular/
|
|
2
|
-
import { createServiceToken as createServiceToken3 } from "@workglow/util";
|
|
3
|
-
|
|
4
|
-
// src/tabular/InMemoryTabularRepository.ts
|
|
5
|
-
import {
|
|
6
|
-
createServiceToken as createServiceToken2,
|
|
7
|
-
makeFingerprint as makeFingerprint2
|
|
8
|
-
} from "@workglow/util";
|
|
9
|
-
|
|
10
|
-
// src/tabular/ITabularRepository.ts
|
|
11
|
-
function isSearchCondition(value) {
|
|
12
|
-
return typeof value === "object" && value !== null && "value" in value && "operator" in value && typeof value.operator === "string";
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
// src/tabular/TabularRepository.ts
|
|
1
|
+
// src/tabular/BaseTabularStorage.ts
|
|
16
2
|
import {
|
|
17
3
|
createServiceToken,
|
|
18
4
|
EventEmitter,
|
|
@@ -20,16 +6,20 @@ import {
|
|
|
20
6
|
} from "@workglow/util";
|
|
21
7
|
var TABULAR_REPOSITORY = createServiceToken("storage.tabularRepository");
|
|
22
8
|
|
|
23
|
-
class
|
|
9
|
+
class BaseTabularStorage {
|
|
24
10
|
schema;
|
|
25
11
|
primaryKeyNames;
|
|
26
12
|
events = new EventEmitter;
|
|
27
13
|
indexes;
|
|
28
14
|
primaryKeySchema;
|
|
29
15
|
valueSchema;
|
|
30
|
-
|
|
16
|
+
autoGeneratedKeyName = null;
|
|
17
|
+
autoGeneratedKeyStrategy = null;
|
|
18
|
+
clientProvidedKeys;
|
|
19
|
+
constructor(schema, primaryKeyNames, indexes = [], clientProvidedKeys = "if-missing") {
|
|
31
20
|
this.schema = schema;
|
|
32
21
|
this.primaryKeyNames = primaryKeyNames;
|
|
22
|
+
this.clientProvidedKeys = clientProvidedKeys;
|
|
33
23
|
const primaryKeyProps = {};
|
|
34
24
|
const valueProps = {};
|
|
35
25
|
const primaryKeySet = new Set(primaryKeyNames);
|
|
@@ -72,6 +62,28 @@ class TabularRepository {
|
|
|
72
62
|
}
|
|
73
63
|
}
|
|
74
64
|
}
|
|
65
|
+
const autoGeneratedKeys = [];
|
|
66
|
+
for (const key of primaryKeyNames) {
|
|
67
|
+
const keyStr = String(key);
|
|
68
|
+
const propDef = schema.properties[keyStr];
|
|
69
|
+
if (propDef && typeof propDef === "object" && "x-auto-generated" in propDef) {
|
|
70
|
+
if (propDef["x-auto-generated"] === true) {
|
|
71
|
+
autoGeneratedKeys.push(keyStr);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
if (autoGeneratedKeys.length > 1) {
|
|
76
|
+
throw new Error(`Multiple auto-generated keys detected: ${autoGeneratedKeys.join(", ")}. ` + `Only the first primary key column can be auto-generated.`);
|
|
77
|
+
}
|
|
78
|
+
if (autoGeneratedKeys.length > 0) {
|
|
79
|
+
const autoGenKeyName = autoGeneratedKeys[0];
|
|
80
|
+
const firstPrimaryKey = String(primaryKeyNames[0]);
|
|
81
|
+
if (autoGenKeyName !== firstPrimaryKey) {
|
|
82
|
+
throw new Error(`Auto-generated key "${autoGenKeyName}" must be the first primary key column. ` + `Current first primary key is "${firstPrimaryKey}".`);
|
|
83
|
+
}
|
|
84
|
+
this.autoGeneratedKeyName = autoGenKeyName;
|
|
85
|
+
this.autoGeneratedKeyStrategy = this.determineGenerationStrategy(autoGenKeyName, schema.properties[autoGenKeyName]);
|
|
86
|
+
}
|
|
75
87
|
}
|
|
76
88
|
filterCompoundKeys(primaryKey, potentialKeys) {
|
|
77
89
|
const isPrefix = (prefix, arr) => {
|
|
@@ -193,6 +205,32 @@ class TabularRepository {
|
|
|
193
205
|
}
|
|
194
206
|
return bestMatch;
|
|
195
207
|
}
|
|
208
|
+
hasAutoGeneratedKey() {
|
|
209
|
+
return this.autoGeneratedKeyName !== null;
|
|
210
|
+
}
|
|
211
|
+
isAutoGeneratedKey(name) {
|
|
212
|
+
return this.autoGeneratedKeyName !== null && String(this.autoGeneratedKeyName) === name;
|
|
213
|
+
}
|
|
214
|
+
determineGenerationStrategy(columnName, typeDef) {
|
|
215
|
+
let actualType = typeDef;
|
|
216
|
+
if (typeDef && typeof typeDef === "object") {
|
|
217
|
+
if (typeDef.anyOf && Array.isArray(typeDef.anyOf)) {
|
|
218
|
+
actualType = typeDef.anyOf.find((t) => t.type !== "null") || typeDef;
|
|
219
|
+
} else if (typeDef.oneOf && Array.isArray(typeDef.oneOf)) {
|
|
220
|
+
actualType = typeDef.oneOf.find((t) => t.type !== "null") || typeDef;
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
if (typeof actualType !== "object") {
|
|
224
|
+
return "uuid";
|
|
225
|
+
}
|
|
226
|
+
if (actualType.type === "integer") {
|
|
227
|
+
return "autoincrement";
|
|
228
|
+
}
|
|
229
|
+
return "uuid";
|
|
230
|
+
}
|
|
231
|
+
generateKeyValue(columnName, strategy) {
|
|
232
|
+
throw new Error(`generateKeyValue not implemented for ${this.constructor.name}. ` + `Column: ${columnName}, Strategy: ${strategy}`);
|
|
233
|
+
}
|
|
196
234
|
async setupDatabase() {}
|
|
197
235
|
destroy() {}
|
|
198
236
|
async[Symbol.asyncDispose]() {
|
|
@@ -202,22 +240,67 @@ class TabularRepository {
|
|
|
202
240
|
this.destroy();
|
|
203
241
|
}
|
|
204
242
|
}
|
|
243
|
+
// src/tabular/CachedTabularStorage.ts
|
|
244
|
+
import {
|
|
245
|
+
createServiceToken as createServiceToken3
|
|
246
|
+
} from "@workglow/util";
|
|
247
|
+
|
|
248
|
+
// src/tabular/InMemoryTabularStorage.ts
|
|
249
|
+
import {
|
|
250
|
+
createServiceToken as createServiceToken2,
|
|
251
|
+
makeFingerprint as makeFingerprint2,
|
|
252
|
+
uuid4
|
|
253
|
+
} from "@workglow/util";
|
|
254
|
+
|
|
255
|
+
// src/tabular/ITabularStorage.ts
|
|
256
|
+
function isSearchCondition(value) {
|
|
257
|
+
return typeof value === "object" && value !== null && "value" in value && "operator" in value && typeof value.operator === "string";
|
|
258
|
+
}
|
|
205
259
|
|
|
206
|
-
// src/tabular/
|
|
260
|
+
// src/tabular/InMemoryTabularStorage.ts
|
|
207
261
|
var MEMORY_TABULAR_REPOSITORY = createServiceToken2("storage.tabularRepository.inMemory");
|
|
208
262
|
|
|
209
|
-
class
|
|
263
|
+
class InMemoryTabularStorage extends BaseTabularStorage {
|
|
210
264
|
values = new Map;
|
|
211
|
-
|
|
212
|
-
|
|
265
|
+
autoIncrementCounter = 0;
|
|
266
|
+
constructor(schema, primaryKeyNames, indexes = [], clientProvidedKeys = "if-missing") {
|
|
267
|
+
super(schema, primaryKeyNames, indexes, clientProvidedKeys);
|
|
213
268
|
}
|
|
214
269
|
async setupDatabase() {}
|
|
270
|
+
generateKeyValue(columnName, strategy) {
|
|
271
|
+
if (strategy === "autoincrement") {
|
|
272
|
+
return ++this.autoIncrementCounter;
|
|
273
|
+
} else {
|
|
274
|
+
return uuid4();
|
|
275
|
+
}
|
|
276
|
+
}
|
|
215
277
|
async put(value) {
|
|
216
|
-
|
|
278
|
+
let entityToStore = value;
|
|
279
|
+
if (this.hasAutoGeneratedKey() && this.autoGeneratedKeyName) {
|
|
280
|
+
const keyName = this.autoGeneratedKeyName;
|
|
281
|
+
const clientProvidedValue = value[keyName];
|
|
282
|
+
const hasClientValue = clientProvidedValue !== undefined && clientProvidedValue !== null;
|
|
283
|
+
let shouldGenerate = false;
|
|
284
|
+
if (this.clientProvidedKeys === "never") {
|
|
285
|
+
shouldGenerate = true;
|
|
286
|
+
} else if (this.clientProvidedKeys === "always") {
|
|
287
|
+
if (!hasClientValue) {
|
|
288
|
+
throw new Error(`Auto-generated key "${keyName}" is required when clientProvidedKeys is "always"`);
|
|
289
|
+
}
|
|
290
|
+
shouldGenerate = false;
|
|
291
|
+
} else {
|
|
292
|
+
shouldGenerate = !hasClientValue;
|
|
293
|
+
}
|
|
294
|
+
if (shouldGenerate) {
|
|
295
|
+
const generatedValue = this.generateKeyValue(keyName, this.autoGeneratedKeyStrategy);
|
|
296
|
+
entityToStore = { ...value, [keyName]: generatedValue };
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
const { key } = this.separateKeyValueFromCombined(entityToStore);
|
|
217
300
|
const id = await makeFingerprint2(key);
|
|
218
|
-
this.values.set(id,
|
|
219
|
-
this.events.emit("put",
|
|
220
|
-
return
|
|
301
|
+
this.values.set(id, entityToStore);
|
|
302
|
+
this.events.emit("put", entityToStore);
|
|
303
|
+
return entityToStore;
|
|
221
304
|
}
|
|
222
305
|
async putBulk(values) {
|
|
223
306
|
return await Promise.all(values.map(async (value) => this.put(value)));
|
|
@@ -338,23 +421,23 @@ class InMemoryTabularRepository extends TabularRepository {
|
|
|
338
421
|
}
|
|
339
422
|
}
|
|
340
423
|
|
|
341
|
-
// src/tabular/
|
|
424
|
+
// src/tabular/CachedTabularStorage.ts
|
|
342
425
|
var CACHED_TABULAR_REPOSITORY = createServiceToken3("storage.tabularRepository.cached");
|
|
343
426
|
|
|
344
|
-
class
|
|
427
|
+
class CachedTabularStorage extends BaseTabularStorage {
|
|
345
428
|
cache;
|
|
346
429
|
durable;
|
|
347
430
|
cacheInitialized = false;
|
|
348
|
-
constructor(durable, cache, schema, primaryKeyNames, indexes) {
|
|
431
|
+
constructor(durable, cache, schema, primaryKeyNames, indexes, clientProvidedKeys = "if-missing") {
|
|
349
432
|
if (!schema || !primaryKeyNames) {
|
|
350
|
-
throw new Error("Schema and primaryKeyNames must be provided when creating
|
|
433
|
+
throw new Error("Schema and primaryKeyNames must be provided when creating CachedTabularStorage");
|
|
351
434
|
}
|
|
352
|
-
super(schema, primaryKeyNames, indexes || []);
|
|
435
|
+
super(schema, primaryKeyNames, indexes || [], clientProvidedKeys);
|
|
353
436
|
this.durable = durable;
|
|
354
437
|
if (cache) {
|
|
355
438
|
this.cache = cache;
|
|
356
439
|
} else {
|
|
357
|
-
this.cache = new
|
|
440
|
+
this.cache = new InMemoryTabularStorage(schema, primaryKeyNames, indexes || [], clientProvidedKeys);
|
|
358
441
|
}
|
|
359
442
|
this.setupEventForwarding();
|
|
360
443
|
}
|
|
@@ -481,7 +564,36 @@ class CachedTabularRepository extends TabularRepository {
|
|
|
481
564
|
this.cache.destroy();
|
|
482
565
|
}
|
|
483
566
|
}
|
|
484
|
-
// src/
|
|
567
|
+
// src/tabular/TabularStorageRegistry.ts
|
|
568
|
+
import {
|
|
569
|
+
createServiceToken as createServiceToken4,
|
|
570
|
+
globalServiceRegistry,
|
|
571
|
+
registerInputResolver
|
|
572
|
+
} from "@workglow/util";
|
|
573
|
+
var TABULAR_REPOSITORIES = createServiceToken4("storage.tabular.repositories");
|
|
574
|
+
if (!globalServiceRegistry.has(TABULAR_REPOSITORIES)) {
|
|
575
|
+
globalServiceRegistry.register(TABULAR_REPOSITORIES, () => new Map, true);
|
|
576
|
+
}
|
|
577
|
+
function getGlobalTabularRepositories() {
|
|
578
|
+
return globalServiceRegistry.get(TABULAR_REPOSITORIES);
|
|
579
|
+
}
|
|
580
|
+
function registerTabularRepository(id, repository) {
|
|
581
|
+
const repos = getGlobalTabularRepositories();
|
|
582
|
+
repos.set(id, repository);
|
|
583
|
+
}
|
|
584
|
+
function getTabularRepository(id) {
|
|
585
|
+
return getGlobalTabularRepositories().get(id);
|
|
586
|
+
}
|
|
587
|
+
function resolveRepositoryFromRegistry(id, format, registry) {
|
|
588
|
+
const repos = registry.has(TABULAR_REPOSITORIES) ? registry.get(TABULAR_REPOSITORIES) : getGlobalTabularRepositories();
|
|
589
|
+
const repo = repos.get(id);
|
|
590
|
+
if (!repo) {
|
|
591
|
+
throw new Error(`Tabular storage "${id}" not found in registry`);
|
|
592
|
+
}
|
|
593
|
+
return repo;
|
|
594
|
+
}
|
|
595
|
+
registerInputResolver("storage:tabular", resolveRepositoryFromRegistry);
|
|
596
|
+
// src/kv/IKvStorage.ts
|
|
485
597
|
var DefaultKeyValueSchema = {
|
|
486
598
|
type: "object",
|
|
487
599
|
properties: {
|
|
@@ -491,14 +603,14 @@ var DefaultKeyValueSchema = {
|
|
|
491
603
|
additionalProperties: false
|
|
492
604
|
};
|
|
493
605
|
var DefaultKeyValueKey = ["key"];
|
|
494
|
-
// src/kv/
|
|
495
|
-
import { createServiceToken as
|
|
606
|
+
// src/kv/InMemoryKvStorage.ts
|
|
607
|
+
import { createServiceToken as createServiceToken6 } from "@workglow/util";
|
|
496
608
|
|
|
497
|
-
// src/kv/
|
|
498
|
-
import { createServiceToken as
|
|
499
|
-
var KV_REPOSITORY =
|
|
609
|
+
// src/kv/KvStorage.ts
|
|
610
|
+
import { createServiceToken as createServiceToken5, EventEmitter as EventEmitter2, makeFingerprint as makeFingerprint3 } from "@workglow/util";
|
|
611
|
+
var KV_REPOSITORY = createServiceToken5("storage.kvRepository");
|
|
500
612
|
|
|
501
|
-
class
|
|
613
|
+
class KvStorage {
|
|
502
614
|
keySchema;
|
|
503
615
|
valueSchema;
|
|
504
616
|
events = new EventEmitter2;
|
|
@@ -526,8 +638,8 @@ class KvRepository {
|
|
|
526
638
|
}
|
|
527
639
|
}
|
|
528
640
|
|
|
529
|
-
// src/kv/
|
|
530
|
-
class
|
|
641
|
+
// src/kv/KvViaTabularStorage.ts
|
|
642
|
+
class KvViaTabularStorage extends KvStorage {
|
|
531
643
|
async setupDatabase() {
|
|
532
644
|
await this.tabularRepository.setupDatabase?.();
|
|
533
645
|
}
|
|
@@ -602,22 +714,22 @@ class KvViaTabularRepository extends KvRepository {
|
|
|
602
714
|
}
|
|
603
715
|
}
|
|
604
716
|
|
|
605
|
-
// src/kv/
|
|
606
|
-
var MEMORY_KV_REPOSITORY =
|
|
717
|
+
// src/kv/InMemoryKvStorage.ts
|
|
718
|
+
var MEMORY_KV_REPOSITORY = createServiceToken6("storage.kvRepository.inMemory");
|
|
607
719
|
|
|
608
|
-
class
|
|
720
|
+
class InMemoryKvStorage extends KvViaTabularStorage {
|
|
609
721
|
tabularRepository;
|
|
610
722
|
constructor(keySchema = { type: "string" }, valueSchema = {}) {
|
|
611
723
|
super(keySchema, valueSchema);
|
|
612
|
-
this.tabularRepository = new
|
|
724
|
+
this.tabularRepository = new InMemoryTabularStorage(DefaultKeyValueSchema, DefaultKeyValueKey);
|
|
613
725
|
}
|
|
614
726
|
}
|
|
615
727
|
// src/queue/InMemoryQueueStorage.ts
|
|
616
|
-
import { createServiceToken as
|
|
728
|
+
import { createServiceToken as createServiceToken8, EventEmitter as EventEmitter3, makeFingerprint as makeFingerprint4, sleep, uuid4 as uuid42 } from "@workglow/util";
|
|
617
729
|
|
|
618
730
|
// src/queue/IQueueStorage.ts
|
|
619
|
-
import { createServiceToken as
|
|
620
|
-
var QUEUE_STORAGE =
|
|
731
|
+
import { createServiceToken as createServiceToken7 } from "@workglow/util";
|
|
732
|
+
var QUEUE_STORAGE = createServiceToken7("jobqueue.storage");
|
|
621
733
|
var JobStatus = {
|
|
622
734
|
PENDING: "PENDING",
|
|
623
735
|
PROCESSING: "PROCESSING",
|
|
@@ -628,7 +740,7 @@ var JobStatus = {
|
|
|
628
740
|
};
|
|
629
741
|
|
|
630
742
|
// src/queue/InMemoryQueueStorage.ts
|
|
631
|
-
var IN_MEMORY_QUEUE_STORAGE =
|
|
743
|
+
var IN_MEMORY_QUEUE_STORAGE = createServiceToken8("jobqueue.storage.inMemory");
|
|
632
744
|
|
|
633
745
|
class InMemoryQueueStorage {
|
|
634
746
|
queueName;
|
|
@@ -656,8 +768,8 @@ class InMemoryQueueStorage {
|
|
|
656
768
|
await sleep(0);
|
|
657
769
|
const now = new Date().toISOString();
|
|
658
770
|
const jobWithPrefixes = job;
|
|
659
|
-
jobWithPrefixes.id = jobWithPrefixes.id ??
|
|
660
|
-
jobWithPrefixes.job_run_id = jobWithPrefixes.job_run_id ??
|
|
771
|
+
jobWithPrefixes.id = jobWithPrefixes.id ?? uuid42();
|
|
772
|
+
jobWithPrefixes.job_run_id = jobWithPrefixes.job_run_id ?? uuid42();
|
|
661
773
|
jobWithPrefixes.queue = this.queueName;
|
|
662
774
|
jobWithPrefixes.fingerprint = await makeFingerprint4(jobWithPrefixes.input);
|
|
663
775
|
jobWithPrefixes.status = JobStatus.PENDING;
|
|
@@ -804,9 +916,9 @@ class InMemoryQueueStorage {
|
|
|
804
916
|
return this.events.subscribe("change", filteredCallback);
|
|
805
917
|
}
|
|
806
918
|
}
|
|
807
|
-
// src/limiter/InMemoryRateLimiterStorage.ts
|
|
808
|
-
import { createServiceToken as
|
|
809
|
-
var IN_MEMORY_RATE_LIMITER_STORAGE =
|
|
919
|
+
// src/queue-limiter/InMemoryRateLimiterStorage.ts
|
|
920
|
+
import { createServiceToken as createServiceToken9, sleep as sleep2 } from "@workglow/util";
|
|
921
|
+
var IN_MEMORY_RATE_LIMITER_STORAGE = createServiceToken9("ratelimiter.storage.inMemory");
|
|
810
922
|
|
|
811
923
|
class InMemoryRateLimiterStorage {
|
|
812
924
|
prefixValues;
|
|
@@ -863,9 +975,9 @@ class InMemoryRateLimiterStorage {
|
|
|
863
975
|
this.nextAvailableTimes.delete(key);
|
|
864
976
|
}
|
|
865
977
|
}
|
|
866
|
-
// src/limiter/IRateLimiterStorage.ts
|
|
867
|
-
import { createServiceToken as
|
|
868
|
-
var RATE_LIMITER_STORAGE =
|
|
978
|
+
// src/queue-limiter/IRateLimiterStorage.ts
|
|
979
|
+
import { createServiceToken as createServiceToken10 } from "@workglow/util";
|
|
980
|
+
var RATE_LIMITER_STORAGE = createServiceToken10("ratelimiter.storage");
|
|
869
981
|
// src/util/HybridSubscriptionManager.ts
|
|
870
982
|
class HybridSubscriptionManager {
|
|
871
983
|
subscribers = new Set;
|
|
@@ -1139,10 +1251,129 @@ class PollingSubscriptionManager {
|
|
|
1139
1251
|
this.initialized = false;
|
|
1140
1252
|
}
|
|
1141
1253
|
}
|
|
1142
|
-
// src/
|
|
1254
|
+
// src/vector/InMemoryVectorStorage.ts
|
|
1255
|
+
import { cosineSimilarity } from "@workglow/util";
|
|
1256
|
+
|
|
1257
|
+
// src/vector/IVectorStorage.ts
|
|
1258
|
+
function getVectorProperty(schema) {
|
|
1259
|
+
for (const [key, value] of Object.entries(schema.properties)) {
|
|
1260
|
+
if (typeof value !== "boolean" && value.type === "array" && (value.format === "TypedArray" || value.format?.startsWith("TypedArray:"))) {
|
|
1261
|
+
return key;
|
|
1262
|
+
}
|
|
1263
|
+
}
|
|
1264
|
+
return;
|
|
1265
|
+
}
|
|
1266
|
+
function getMetadataProperty(schema) {
|
|
1267
|
+
for (const [key, value] of Object.entries(schema.properties)) {
|
|
1268
|
+
if (typeof value !== "boolean" && value.type === "object" && value.format === "metadata") {
|
|
1269
|
+
return key;
|
|
1270
|
+
}
|
|
1271
|
+
}
|
|
1272
|
+
return;
|
|
1273
|
+
}
|
|
1274
|
+
|
|
1275
|
+
// src/vector/InMemoryVectorStorage.ts
|
|
1276
|
+
function matchesFilter(metadata, filter) {
|
|
1277
|
+
for (const [key, value] of Object.entries(filter)) {
|
|
1278
|
+
if (metadata[key] !== value) {
|
|
1279
|
+
return false;
|
|
1280
|
+
}
|
|
1281
|
+
}
|
|
1282
|
+
return true;
|
|
1283
|
+
}
|
|
1284
|
+
function textRelevance(text, query) {
|
|
1285
|
+
const textLower = text.toLowerCase();
|
|
1286
|
+
const queryLower = query.toLowerCase();
|
|
1287
|
+
const queryWords = queryLower.split(/\s+/).filter((w) => w.length > 0);
|
|
1288
|
+
if (queryWords.length === 0) {
|
|
1289
|
+
return 0;
|
|
1290
|
+
}
|
|
1291
|
+
let matches = 0;
|
|
1292
|
+
for (const word of queryWords) {
|
|
1293
|
+
if (textLower.includes(word)) {
|
|
1294
|
+
matches++;
|
|
1295
|
+
}
|
|
1296
|
+
}
|
|
1297
|
+
return matches / queryWords.length;
|
|
1298
|
+
}
|
|
1299
|
+
|
|
1300
|
+
class InMemoryVectorStorage extends InMemoryTabularStorage {
|
|
1301
|
+
vectorDimensions;
|
|
1302
|
+
VectorType;
|
|
1303
|
+
vectorPropertyName;
|
|
1304
|
+
metadataPropertyName;
|
|
1305
|
+
constructor(schema, primaryKeyNames, indexes = [], dimensions, VectorType = Float32Array) {
|
|
1306
|
+
super(schema, primaryKeyNames, indexes);
|
|
1307
|
+
this.vectorDimensions = dimensions;
|
|
1308
|
+
this.VectorType = VectorType;
|
|
1309
|
+
const vectorProp = getVectorProperty(schema);
|
|
1310
|
+
if (!vectorProp) {
|
|
1311
|
+
throw new Error("Schema must have a property with type array and format TypedArray");
|
|
1312
|
+
}
|
|
1313
|
+
this.vectorPropertyName = vectorProp;
|
|
1314
|
+
this.metadataPropertyName = getMetadataProperty(schema);
|
|
1315
|
+
}
|
|
1316
|
+
getVectorDimensions() {
|
|
1317
|
+
return this.vectorDimensions;
|
|
1318
|
+
}
|
|
1319
|
+
async similaritySearch(query, options = {}) {
|
|
1320
|
+
const { topK = 10, filter, scoreThreshold = 0 } = options;
|
|
1321
|
+
const results = [];
|
|
1322
|
+
const allEntities = await this.getAll() || [];
|
|
1323
|
+
for (const entity of allEntities) {
|
|
1324
|
+
const vector = entity[this.vectorPropertyName];
|
|
1325
|
+
const metadata = this.metadataPropertyName ? entity[this.metadataPropertyName] : {};
|
|
1326
|
+
if (filter && !matchesFilter(metadata, filter)) {
|
|
1327
|
+
continue;
|
|
1328
|
+
}
|
|
1329
|
+
const score = cosineSimilarity(query, vector);
|
|
1330
|
+
if (score < scoreThreshold) {
|
|
1331
|
+
continue;
|
|
1332
|
+
}
|
|
1333
|
+
results.push({
|
|
1334
|
+
...entity,
|
|
1335
|
+
score
|
|
1336
|
+
});
|
|
1337
|
+
}
|
|
1338
|
+
results.sort((a, b) => b.score - a.score);
|
|
1339
|
+
const topResults = results.slice(0, topK);
|
|
1340
|
+
return topResults;
|
|
1341
|
+
}
|
|
1342
|
+
async hybridSearch(query, options) {
|
|
1343
|
+
const { topK = 10, filter, scoreThreshold = 0, textQuery, vectorWeight = 0.7 } = options;
|
|
1344
|
+
if (!textQuery || textQuery.trim().length === 0) {
|
|
1345
|
+
return this.similaritySearch(query, { topK, filter, scoreThreshold });
|
|
1346
|
+
}
|
|
1347
|
+
const results = [];
|
|
1348
|
+
const allEntities = await this.getAll() || [];
|
|
1349
|
+
for (const entity of allEntities) {
|
|
1350
|
+
const vector = entity[this.vectorPropertyName];
|
|
1351
|
+
const metadata = this.metadataPropertyName ? entity[this.metadataPropertyName] : {};
|
|
1352
|
+
if (filter && !matchesFilter(metadata, filter)) {
|
|
1353
|
+
continue;
|
|
1354
|
+
}
|
|
1355
|
+
const vectorScore = cosineSimilarity(query, vector);
|
|
1356
|
+
const metadataText = Object.values(metadata).join(" ").toLowerCase();
|
|
1357
|
+
const textScore = textRelevance(metadataText, textQuery);
|
|
1358
|
+
const combinedScore = vectorWeight * vectorScore + (1 - vectorWeight) * textScore;
|
|
1359
|
+
if (combinedScore < scoreThreshold) {
|
|
1360
|
+
continue;
|
|
1361
|
+
}
|
|
1362
|
+
results.push({
|
|
1363
|
+
...entity,
|
|
1364
|
+
score: combinedScore
|
|
1365
|
+
});
|
|
1366
|
+
}
|
|
1367
|
+
results.sort((a, b) => b.score - a.score);
|
|
1368
|
+
const topResults = results.slice(0, topK);
|
|
1369
|
+
return topResults;
|
|
1370
|
+
}
|
|
1371
|
+
}
|
|
1372
|
+
// src/tabular/IndexedDbTabularStorage.ts
|
|
1143
1373
|
import {
|
|
1144
|
-
createServiceToken as
|
|
1145
|
-
makeFingerprint as makeFingerprint5
|
|
1374
|
+
createServiceToken as createServiceToken11,
|
|
1375
|
+
makeFingerprint as makeFingerprint5,
|
|
1376
|
+
uuid4 as uuid43
|
|
1146
1377
|
} from "@workglow/util";
|
|
1147
1378
|
|
|
1148
1379
|
// src/util/IndexedDbTable.ts
|
|
@@ -1291,7 +1522,7 @@ async function performIncrementalMigration(db, tableName, diff, options = {}) {
|
|
|
1291
1522
|
options.onMigrationProgress?.(`Migration complete`, 1);
|
|
1292
1523
|
});
|
|
1293
1524
|
}
|
|
1294
|
-
async function performDestructiveMigration(db, tableName, primaryKey, expectedIndexes, options = {}) {
|
|
1525
|
+
async function performDestructiveMigration(db, tableName, primaryKey, expectedIndexes, options = {}, autoIncrement = false) {
|
|
1295
1526
|
if (!options.allowDestructiveMigration) {
|
|
1296
1527
|
throw new Error(`Destructive migration required for ${tableName} but not allowed. ` + `Primary key has changed. Set allowDestructiveMigration=true to proceed with data loss, ` + `or provide a dataTransformer to migrate data.`);
|
|
1297
1528
|
}
|
|
@@ -1336,7 +1567,7 @@ async function performDestructiveMigration(db, tableName, primaryKey, expectedIn
|
|
|
1336
1567
|
if (db2.objectStoreNames.contains(tableName)) {
|
|
1337
1568
|
db2.deleteObjectStore(tableName);
|
|
1338
1569
|
}
|
|
1339
|
-
const store = db2.createObjectStore(tableName, { keyPath: primaryKey });
|
|
1570
|
+
const store = db2.createObjectStore(tableName, { keyPath: primaryKey, autoIncrement });
|
|
1340
1571
|
for (const idx of expectedIndexes) {
|
|
1341
1572
|
store.createIndex(idx.name, idx.keyPath, idx.options);
|
|
1342
1573
|
}
|
|
@@ -1354,7 +1585,7 @@ async function performDestructiveMigration(db, tableName, primaryKey, expectedIn
|
|
|
1354
1585
|
options.onMigrationProgress?.(`Destructive migration complete`, 1);
|
|
1355
1586
|
return newDb;
|
|
1356
1587
|
}
|
|
1357
|
-
async function createNewDatabase(tableName, primaryKey, expectedIndexes, options = {}) {
|
|
1588
|
+
async function createNewDatabase(tableName, primaryKey, expectedIndexes, options = {}, autoIncrement = false) {
|
|
1358
1589
|
options.onMigrationProgress?.(`Creating new database: ${tableName}`, 0);
|
|
1359
1590
|
try {
|
|
1360
1591
|
await deleteIndexedDbTable(tableName);
|
|
@@ -1366,7 +1597,7 @@ async function createNewDatabase(tableName, primaryKey, expectedIndexes, options
|
|
|
1366
1597
|
if (!db2.objectStoreNames.contains(METADATA_STORE_NAME)) {
|
|
1367
1598
|
db2.createObjectStore(METADATA_STORE_NAME, { keyPath: "tableName" });
|
|
1368
1599
|
}
|
|
1369
|
-
const store = db2.createObjectStore(tableName, { keyPath: primaryKey });
|
|
1600
|
+
const store = db2.createObjectStore(tableName, { keyPath: primaryKey, autoIncrement });
|
|
1370
1601
|
for (const idx of expectedIndexes) {
|
|
1371
1602
|
store.createIndex(idx.name, idx.keyPath, idx.options);
|
|
1372
1603
|
}
|
|
@@ -1382,7 +1613,7 @@ async function createNewDatabase(tableName, primaryKey, expectedIndexes, options
|
|
|
1382
1613
|
options.onMigrationProgress?.(`Database created successfully`, 1);
|
|
1383
1614
|
return db;
|
|
1384
1615
|
}
|
|
1385
|
-
async function ensureIndexedDbTable(tableName, primaryKey, expectedIndexes = [], options = {}) {
|
|
1616
|
+
async function ensureIndexedDbTable(tableName, primaryKey, expectedIndexes = [], options = {}, autoIncrement = false) {
|
|
1386
1617
|
try {
|
|
1387
1618
|
let db;
|
|
1388
1619
|
let wasJustCreated = false;
|
|
@@ -1394,7 +1625,7 @@ async function ensureIndexedDbTable(tableName, primaryKey, expectedIndexes = [],
|
|
|
1394
1625
|
}
|
|
1395
1626
|
} catch (err) {
|
|
1396
1627
|
options.onMigrationProgress?.(`Database ${tableName} does not exist or has version conflict, creating...`, 0);
|
|
1397
|
-
return await createNewDatabase(tableName, primaryKey, expectedIndexes, options);
|
|
1628
|
+
return await createNewDatabase(tableName, primaryKey, expectedIndexes, options, autoIncrement);
|
|
1398
1629
|
}
|
|
1399
1630
|
if (wasJustCreated) {
|
|
1400
1631
|
options.onMigrationProgress?.(`Creating new database: ${tableName}`, 0);
|
|
@@ -1407,7 +1638,7 @@ async function ensureIndexedDbTable(tableName, primaryKey, expectedIndexes = [],
|
|
|
1407
1638
|
if (!db2.objectStoreNames.contains(METADATA_STORE_NAME)) {
|
|
1408
1639
|
db2.createObjectStore(METADATA_STORE_NAME, { keyPath: "tableName" });
|
|
1409
1640
|
}
|
|
1410
|
-
const store2 = db2.createObjectStore(tableName, { keyPath: primaryKey });
|
|
1641
|
+
const store2 = db2.createObjectStore(tableName, { keyPath: primaryKey, autoIncrement });
|
|
1411
1642
|
for (const idx of expectedIndexes) {
|
|
1412
1643
|
store2.createIndex(idx.name, idx.keyPath, idx.options);
|
|
1413
1644
|
}
|
|
@@ -1437,7 +1668,7 @@ async function ensureIndexedDbTable(tableName, primaryKey, expectedIndexes = [],
|
|
|
1437
1668
|
if (!db.objectStoreNames.contains(tableName)) {
|
|
1438
1669
|
options.onMigrationProgress?.(`Object store ${tableName} does not exist, creating...`, 0);
|
|
1439
1670
|
db.close();
|
|
1440
|
-
return await createNewDatabase(tableName, primaryKey, expectedIndexes, options);
|
|
1671
|
+
return await createNewDatabase(tableName, primaryKey, expectedIndexes, options, autoIncrement);
|
|
1441
1672
|
}
|
|
1442
1673
|
const transaction = db.transaction(tableName, "readonly");
|
|
1443
1674
|
const store = transaction.objectStore(tableName);
|
|
@@ -1460,7 +1691,7 @@ async function ensureIndexedDbTable(tableName, primaryKey, expectedIndexes = [],
|
|
|
1460
1691
|
}
|
|
1461
1692
|
if (diff.needsObjectStoreRecreation) {
|
|
1462
1693
|
options.onMigrationProgress?.(`Schema change requires object store recreation for ${tableName}`, 0);
|
|
1463
|
-
db = await performDestructiveMigration(db, tableName, primaryKey, expectedIndexes, options);
|
|
1694
|
+
db = await performDestructiveMigration(db, tableName, primaryKey, expectedIndexes, options, autoIncrement);
|
|
1464
1695
|
} else {
|
|
1465
1696
|
options.onMigrationProgress?.(`Performing incremental migration for ${tableName}`, 0);
|
|
1466
1697
|
db = await performIncrementalMigration(db, tableName, diff, options);
|
|
@@ -1482,18 +1713,18 @@ async function dropIndexedDbTable(tableName) {
|
|
|
1482
1713
|
return deleteIndexedDbTable(tableName);
|
|
1483
1714
|
}
|
|
1484
1715
|
|
|
1485
|
-
// src/tabular/
|
|
1486
|
-
var IDB_TABULAR_REPOSITORY =
|
|
1716
|
+
// src/tabular/IndexedDbTabularStorage.ts
|
|
1717
|
+
var IDB_TABULAR_REPOSITORY = createServiceToken11("storage.tabularRepository.indexedDb");
|
|
1487
1718
|
|
|
1488
|
-
class
|
|
1719
|
+
class IndexedDbTabularStorage extends BaseTabularStorage {
|
|
1489
1720
|
table;
|
|
1490
1721
|
db;
|
|
1491
1722
|
setupPromise = null;
|
|
1492
1723
|
migrationOptions;
|
|
1493
1724
|
hybridManager = null;
|
|
1494
1725
|
hybridOptions;
|
|
1495
|
-
constructor(table = "tabular_store", schema, primaryKeyNames, indexes = [], migrationOptions = {}) {
|
|
1496
|
-
super(schema, primaryKeyNames, indexes);
|
|
1726
|
+
constructor(table = "tabular_store", schema, primaryKeyNames, indexes = [], migrationOptions = {}, clientProvidedKeys = "if-missing") {
|
|
1727
|
+
super(schema, primaryKeyNames, indexes, clientProvidedKeys);
|
|
1497
1728
|
this.table = table;
|
|
1498
1729
|
this.migrationOptions = migrationOptions;
|
|
1499
1730
|
this.hybridOptions = {
|
|
@@ -1540,21 +1771,64 @@ class IndexedDbTabularRepository extends TabularRepository {
|
|
|
1540
1771
|
});
|
|
1541
1772
|
}
|
|
1542
1773
|
const primaryKey = pkColumns.length === 1 ? pkColumns[0] : pkColumns;
|
|
1543
|
-
|
|
1774
|
+
const useAutoIncrement = this.hasAutoGeneratedKey() && this.autoGeneratedKeyStrategy === "autoincrement" && pkColumns.length === 1;
|
|
1775
|
+
return await ensureIndexedDbTable(this.table, primaryKey, expectedIndexes, this.migrationOptions, useAutoIncrement);
|
|
1776
|
+
}
|
|
1777
|
+
generateKeyValue(columnName, strategy) {
|
|
1778
|
+
if (strategy === "uuid") {
|
|
1779
|
+
return uuid43();
|
|
1780
|
+
}
|
|
1781
|
+
throw new Error(`IndexedDB autoincrement keys are generated by the database, not client-side. Column: ${columnName}`);
|
|
1544
1782
|
}
|
|
1545
1783
|
async put(record) {
|
|
1546
1784
|
const db = await this.getDb();
|
|
1547
|
-
|
|
1785
|
+
let recordToStore = record;
|
|
1786
|
+
if (this.hasAutoGeneratedKey() && this.autoGeneratedKeyName) {
|
|
1787
|
+
const keyName = String(this.autoGeneratedKeyName);
|
|
1788
|
+
const clientProvidedValue = record[keyName];
|
|
1789
|
+
const hasClientValue = clientProvidedValue !== undefined && clientProvidedValue !== null;
|
|
1790
|
+
if (this.autoGeneratedKeyStrategy === "uuid") {
|
|
1791
|
+
let shouldGenerate = false;
|
|
1792
|
+
if (this.clientProvidedKeys === "never") {
|
|
1793
|
+
shouldGenerate = true;
|
|
1794
|
+
} else if (this.clientProvidedKeys === "always") {
|
|
1795
|
+
if (!hasClientValue) {
|
|
1796
|
+
throw new Error(`Auto-generated key "${keyName}" is required when clientProvidedKeys is "always"`);
|
|
1797
|
+
}
|
|
1798
|
+
shouldGenerate = false;
|
|
1799
|
+
} else {
|
|
1800
|
+
shouldGenerate = !hasClientValue;
|
|
1801
|
+
}
|
|
1802
|
+
if (shouldGenerate) {
|
|
1803
|
+
const generatedValue = this.generateKeyValue(keyName, "uuid");
|
|
1804
|
+
recordToStore = { ...record, [keyName]: generatedValue };
|
|
1805
|
+
}
|
|
1806
|
+
} else if (this.autoGeneratedKeyStrategy === "autoincrement") {
|
|
1807
|
+
if (this.clientProvidedKeys === "always" && !hasClientValue) {
|
|
1808
|
+
throw new Error(`Auto-generated key "${keyName}" is required when clientProvidedKeys is "always"`);
|
|
1809
|
+
}
|
|
1810
|
+
if (this.clientProvidedKeys === "never") {
|
|
1811
|
+
const { [keyName]: _, ...rest } = record;
|
|
1812
|
+
recordToStore = rest;
|
|
1813
|
+
}
|
|
1814
|
+
}
|
|
1815
|
+
}
|
|
1548
1816
|
return new Promise((resolve, reject) => {
|
|
1549
1817
|
const transaction = db.transaction(this.table, "readwrite");
|
|
1550
1818
|
const store = transaction.objectStore(this.table);
|
|
1551
|
-
const request = store.put(
|
|
1819
|
+
const request = store.put(recordToStore);
|
|
1552
1820
|
request.onerror = () => {
|
|
1553
1821
|
reject(request.error);
|
|
1554
1822
|
};
|
|
1555
1823
|
request.onsuccess = () => {
|
|
1556
|
-
this.
|
|
1557
|
-
|
|
1824
|
+
if (this.hasAutoGeneratedKey() && this.autoGeneratedKeyName && this.autoGeneratedKeyStrategy === "autoincrement") {
|
|
1825
|
+
const keyName = String(this.autoGeneratedKeyName);
|
|
1826
|
+
if (recordToStore[keyName] === undefined) {
|
|
1827
|
+
recordToStore = { ...recordToStore, [keyName]: request.result };
|
|
1828
|
+
}
|
|
1829
|
+
}
|
|
1830
|
+
this.events.emit("put", recordToStore);
|
|
1831
|
+
resolve(recordToStore);
|
|
1558
1832
|
};
|
|
1559
1833
|
transaction.oncomplete = () => {
|
|
1560
1834
|
this.hybridManager?.notifyLocalChange();
|
|
@@ -1562,38 +1836,7 @@ class IndexedDbTabularRepository extends TabularRepository {
|
|
|
1562
1836
|
});
|
|
1563
1837
|
}
|
|
1564
1838
|
async putBulk(records) {
|
|
1565
|
-
|
|
1566
|
-
return new Promise((resolve, reject) => {
|
|
1567
|
-
const transaction = db.transaction(this.table, "readwrite");
|
|
1568
|
-
const store = transaction.objectStore(this.table);
|
|
1569
|
-
let completed = 0;
|
|
1570
|
-
let hasError = false;
|
|
1571
|
-
transaction.onerror = () => {
|
|
1572
|
-
if (!hasError) {
|
|
1573
|
-
hasError = true;
|
|
1574
|
-
reject(transaction.error);
|
|
1575
|
-
}
|
|
1576
|
-
};
|
|
1577
|
-
transaction.oncomplete = () => {
|
|
1578
|
-
if (!hasError) {
|
|
1579
|
-
this.hybridManager?.notifyLocalChange();
|
|
1580
|
-
resolve(records);
|
|
1581
|
-
}
|
|
1582
|
-
};
|
|
1583
|
-
for (const record of records) {
|
|
1584
|
-
const request = store.put(record);
|
|
1585
|
-
request.onsuccess = () => {
|
|
1586
|
-
this.events.emit("put", record);
|
|
1587
|
-
completed++;
|
|
1588
|
-
};
|
|
1589
|
-
request.onerror = () => {
|
|
1590
|
-
if (!hasError) {
|
|
1591
|
-
hasError = true;
|
|
1592
|
-
reject(request.error);
|
|
1593
|
-
}
|
|
1594
|
-
};
|
|
1595
|
-
}
|
|
1596
|
-
});
|
|
1839
|
+
return await Promise.all(records.map((record) => this.put(record)));
|
|
1597
1840
|
}
|
|
1598
1841
|
getPrimaryKeyAsOrderedArray(key) {
|
|
1599
1842
|
return super.getPrimaryKeyAsOrderedArray(key).map((value) => typeof value === "bigint" ? value.toString() : value);
|
|
@@ -1885,20 +2128,22 @@ class IndexedDbTabularRepository extends TabularRepository {
|
|
|
1885
2128
|
this.db?.close();
|
|
1886
2129
|
}
|
|
1887
2130
|
}
|
|
1888
|
-
// src/tabular/
|
|
1889
|
-
import {
|
|
1890
|
-
|
|
2131
|
+
// src/tabular/SharedInMemoryTabularStorage.ts
|
|
2132
|
+
import {
|
|
2133
|
+
createServiceToken as createServiceToken12
|
|
2134
|
+
} from "@workglow/util";
|
|
2135
|
+
var SHARED_IN_MEMORY_TABULAR_REPOSITORY = createServiceToken12("storage.tabularRepository.sharedInMemory");
|
|
1891
2136
|
|
|
1892
|
-
class
|
|
2137
|
+
class SharedInMemoryTabularStorage extends BaseTabularStorage {
|
|
1893
2138
|
channel = null;
|
|
1894
2139
|
channelName;
|
|
1895
2140
|
inMemoryRepo;
|
|
1896
2141
|
isInitialized = false;
|
|
1897
2142
|
syncInProgress = false;
|
|
1898
|
-
constructor(channelName = "tabular_store", schema, primaryKeyNames, indexes = []) {
|
|
1899
|
-
super(schema, primaryKeyNames, indexes);
|
|
2143
|
+
constructor(channelName = "tabular_store", schema, primaryKeyNames, indexes = [], clientProvidedKeys = "if-missing") {
|
|
2144
|
+
super(schema, primaryKeyNames, indexes, clientProvidedKeys);
|
|
1900
2145
|
this.channelName = channelName;
|
|
1901
|
-
this.inMemoryRepo = new
|
|
2146
|
+
this.inMemoryRepo = new InMemoryTabularStorage(schema, primaryKeyNames, indexes, clientProvidedKeys);
|
|
1902
2147
|
this.setupEventForwarding();
|
|
1903
2148
|
this.initializeBroadcastChannel();
|
|
1904
2149
|
}
|
|
@@ -2049,14 +2294,16 @@ class SharedInMemoryTabularRepository extends TabularRepository {
|
|
|
2049
2294
|
this.inMemoryRepo.destroy();
|
|
2050
2295
|
}
|
|
2051
2296
|
}
|
|
2052
|
-
// src/tabular/
|
|
2053
|
-
import {
|
|
2297
|
+
// src/tabular/SupabaseTabularStorage.ts
|
|
2298
|
+
import {
|
|
2299
|
+
createServiceToken as createServiceToken13
|
|
2300
|
+
} from "@workglow/util";
|
|
2054
2301
|
|
|
2055
|
-
// src/tabular/
|
|
2056
|
-
class
|
|
2302
|
+
// src/tabular/BaseSqlTabularStorage.ts
|
|
2303
|
+
class BaseSqlTabularStorage extends BaseTabularStorage {
|
|
2057
2304
|
table;
|
|
2058
|
-
constructor(table = "tabular_store", schema, primaryKeyNames, indexes = []) {
|
|
2059
|
-
super(schema, primaryKeyNames, indexes);
|
|
2305
|
+
constructor(table = "tabular_store", schema, primaryKeyNames, indexes = [], clientProvidedKeys = "if-missing") {
|
|
2306
|
+
super(schema, primaryKeyNames, indexes, clientProvidedKeys);
|
|
2060
2307
|
this.table = table;
|
|
2061
2308
|
this.validateTableAndSchema();
|
|
2062
2309
|
}
|
|
@@ -2235,14 +2482,14 @@ class BaseSqlTabularRepository extends TabularRepository {
|
|
|
2235
2482
|
}
|
|
2236
2483
|
}
|
|
2237
2484
|
|
|
2238
|
-
// src/tabular/
|
|
2239
|
-
var SUPABASE_TABULAR_REPOSITORY =
|
|
2485
|
+
// src/tabular/SupabaseTabularStorage.ts
|
|
2486
|
+
var SUPABASE_TABULAR_REPOSITORY = createServiceToken13("storage.tabularRepository.supabase");
|
|
2240
2487
|
|
|
2241
|
-
class
|
|
2488
|
+
class SupabaseTabularStorage extends BaseSqlTabularStorage {
|
|
2242
2489
|
client;
|
|
2243
2490
|
realtimeChannel = null;
|
|
2244
|
-
constructor(client, table = "tabular_store", schema, primaryKeyNames, indexes = []) {
|
|
2245
|
-
super(table, schema, primaryKeyNames, indexes);
|
|
2491
|
+
constructor(client, table = "tabular_store", schema, primaryKeyNames, indexes = [], clientProvidedKeys = "if-missing") {
|
|
2492
|
+
super(table, schema, primaryKeyNames, indexes, clientProvidedKeys);
|
|
2246
2493
|
this.client = client;
|
|
2247
2494
|
}
|
|
2248
2495
|
async setupDatabase() {
|
|
@@ -2369,6 +2616,17 @@ class SupabaseTabularRepository extends BaseSqlTabularRepository {
|
|
|
2369
2616
|
}
|
|
2370
2617
|
constructPrimaryKeyColumns($delimiter = "") {
|
|
2371
2618
|
const cols = Object.entries(this.primaryKeySchema.properties).map(([key, typeDef]) => {
|
|
2619
|
+
if (this.isAutoGeneratedKey(key)) {
|
|
2620
|
+
if (this.autoGeneratedKeyStrategy === "autoincrement") {
|
|
2621
|
+
const sqlType2 = this.mapTypeToSQL(typeDef);
|
|
2622
|
+
const isSmallInt = sqlType2.includes("SMALLINT");
|
|
2623
|
+
const isBigInt = sqlType2.includes("BIGINT");
|
|
2624
|
+
const serialType = isBigInt ? "BIGSERIAL" : isSmallInt ? "SMALLSERIAL" : "SERIAL";
|
|
2625
|
+
return `${$delimiter}${key}${$delimiter} ${serialType}`;
|
|
2626
|
+
} else if (this.autoGeneratedKeyStrategy === "uuid") {
|
|
2627
|
+
return `${$delimiter}${key}${$delimiter} UUID DEFAULT gen_random_uuid()`;
|
|
2628
|
+
}
|
|
2629
|
+
}
|
|
2372
2630
|
const sqlType = this.mapTypeToSQL(typeDef);
|
|
2373
2631
|
let constraints = "NOT NULL";
|
|
2374
2632
|
if (this.shouldBeUnsigned(typeDef)) {
|
|
@@ -2428,7 +2686,27 @@ class SupabaseTabularRepository extends BaseSqlTabularRepository {
|
|
|
2428
2686
|
return false;
|
|
2429
2687
|
}
|
|
2430
2688
|
async put(entity) {
|
|
2431
|
-
|
|
2689
|
+
let entityToInsert = { ...entity };
|
|
2690
|
+
if (this.hasAutoGeneratedKey() && this.autoGeneratedKeyName) {
|
|
2691
|
+
const keyName = String(this.autoGeneratedKeyName);
|
|
2692
|
+
const clientProvidedValue = entity[keyName];
|
|
2693
|
+
const hasClientValue = clientProvidedValue !== undefined && clientProvidedValue !== null;
|
|
2694
|
+
let shouldOmitKey = false;
|
|
2695
|
+
if (this.clientProvidedKeys === "never") {
|
|
2696
|
+
shouldOmitKey = true;
|
|
2697
|
+
} else if (this.clientProvidedKeys === "always") {
|
|
2698
|
+
if (!hasClientValue) {
|
|
2699
|
+
throw new Error(`Auto-generated key "${keyName}" is required when clientProvidedKeys is "always"`);
|
|
2700
|
+
}
|
|
2701
|
+
shouldOmitKey = false;
|
|
2702
|
+
} else {
|
|
2703
|
+
shouldOmitKey = !hasClientValue;
|
|
2704
|
+
}
|
|
2705
|
+
if (shouldOmitKey) {
|
|
2706
|
+
delete entityToInsert[keyName];
|
|
2707
|
+
}
|
|
2708
|
+
}
|
|
2709
|
+
const normalizedEntity = { ...entityToInsert };
|
|
2432
2710
|
const requiredSet = new Set(this.valueSchema.required ?? []);
|
|
2433
2711
|
for (const key in this.valueSchema.properties) {
|
|
2434
2712
|
if (!(key in normalizedEntity) || normalizedEntity[key] === undefined) {
|
|
@@ -2450,29 +2728,7 @@ class SupabaseTabularRepository extends BaseSqlTabularRepository {
|
|
|
2450
2728
|
async putBulk(entities) {
|
|
2451
2729
|
if (entities.length === 0)
|
|
2452
2730
|
return [];
|
|
2453
|
-
|
|
2454
|
-
const normalizedEntities = entities.map((entity) => {
|
|
2455
|
-
const normalized = { ...entity };
|
|
2456
|
-
for (const key in this.valueSchema.properties) {
|
|
2457
|
-
if (!(key in normalized) || normalized[key] === undefined) {
|
|
2458
|
-
if (!requiredSet.has(key)) {
|
|
2459
|
-
normalized[key] = null;
|
|
2460
|
-
}
|
|
2461
|
-
}
|
|
2462
|
-
}
|
|
2463
|
-
return normalized;
|
|
2464
|
-
});
|
|
2465
|
-
const { data, error } = await this.client.from(this.table).upsert(normalizedEntities, { onConflict: this.primaryKeyColumnList() }).select();
|
|
2466
|
-
if (error)
|
|
2467
|
-
throw error;
|
|
2468
|
-
const updatedEntities = data;
|
|
2469
|
-
for (const entity of updatedEntities) {
|
|
2470
|
-
for (const key in this.schema.properties) {
|
|
2471
|
-
entity[key] = this.sqlToJsValue(key, entity[key]);
|
|
2472
|
-
}
|
|
2473
|
-
this.events.emit("put", entity);
|
|
2474
|
-
}
|
|
2475
|
-
return updatedEntities;
|
|
2731
|
+
return await Promise.all(entities.map((entity) => this.put(entity)));
|
|
2476
2732
|
}
|
|
2477
2733
|
async get(key) {
|
|
2478
2734
|
let query = this.client.from(this.table).select("*");
|
|
@@ -2645,24 +2901,24 @@ class SupabaseTabularRepository extends BaseSqlTabularRepository {
|
|
|
2645
2901
|
}
|
|
2646
2902
|
}
|
|
2647
2903
|
}
|
|
2648
|
-
// src/kv/
|
|
2649
|
-
import { createServiceToken as
|
|
2650
|
-
var IDB_KV_REPOSITORY =
|
|
2904
|
+
// src/kv/IndexedDbKvStorage.ts
|
|
2905
|
+
import { createServiceToken as createServiceToken14 } from "@workglow/util";
|
|
2906
|
+
var IDB_KV_REPOSITORY = createServiceToken14("storage.kvRepository.indexedDb");
|
|
2651
2907
|
|
|
2652
|
-
class
|
|
2908
|
+
class IndexedDbKvStorage extends KvViaTabularStorage {
|
|
2653
2909
|
dbName;
|
|
2654
2910
|
tabularRepository;
|
|
2655
2911
|
constructor(dbName, keySchema = { type: "string" }, valueSchema = {}) {
|
|
2656
2912
|
super(keySchema, valueSchema);
|
|
2657
2913
|
this.dbName = dbName;
|
|
2658
|
-
this.tabularRepository = new
|
|
2914
|
+
this.tabularRepository = new IndexedDbTabularStorage(dbName, DefaultKeyValueSchema, DefaultKeyValueKey);
|
|
2659
2915
|
}
|
|
2660
2916
|
}
|
|
2661
|
-
// src/kv/
|
|
2662
|
-
import { createServiceToken as
|
|
2663
|
-
var SUPABASE_KV_REPOSITORY =
|
|
2917
|
+
// src/kv/SupabaseKvStorage.ts
|
|
2918
|
+
import { createServiceToken as createServiceToken15 } from "@workglow/util";
|
|
2919
|
+
var SUPABASE_KV_REPOSITORY = createServiceToken15("storage.kvRepository.supabase");
|
|
2664
2920
|
|
|
2665
|
-
class
|
|
2921
|
+
class SupabaseKvStorage extends KvViaTabularStorage {
|
|
2666
2922
|
client;
|
|
2667
2923
|
tableName;
|
|
2668
2924
|
tabularRepository;
|
|
@@ -2670,12 +2926,12 @@ class SupabaseKvRepository extends KvViaTabularRepository {
|
|
|
2670
2926
|
super(keySchema, valueSchema);
|
|
2671
2927
|
this.client = client;
|
|
2672
2928
|
this.tableName = tableName;
|
|
2673
|
-
this.tabularRepository = tabularRepository ?? new
|
|
2929
|
+
this.tabularRepository = tabularRepository ?? new SupabaseTabularStorage(client, tableName, DefaultKeyValueSchema, DefaultKeyValueKey);
|
|
2674
2930
|
}
|
|
2675
2931
|
}
|
|
2676
2932
|
// src/queue/IndexedDbQueueStorage.ts
|
|
2677
|
-
import { createServiceToken as
|
|
2678
|
-
var INDEXED_DB_QUEUE_STORAGE =
|
|
2933
|
+
import { createServiceToken as createServiceToken16, makeFingerprint as makeFingerprint6, uuid4 as uuid44 } from "@workglow/util";
|
|
2934
|
+
var INDEXED_DB_QUEUE_STORAGE = createServiceToken16("jobqueue.storage.indexedDb");
|
|
2679
2935
|
|
|
2680
2936
|
class IndexedDbQueueStorage {
|
|
2681
2937
|
queueName;
|
|
@@ -2755,8 +3011,8 @@ class IndexedDbQueueStorage {
|
|
|
2755
3011
|
const db = await this.getDb();
|
|
2756
3012
|
const now = new Date().toISOString();
|
|
2757
3013
|
const jobWithPrefixes = job;
|
|
2758
|
-
jobWithPrefixes.id = jobWithPrefixes.id ??
|
|
2759
|
-
jobWithPrefixes.job_run_id = jobWithPrefixes.job_run_id ??
|
|
3014
|
+
jobWithPrefixes.id = jobWithPrefixes.id ?? uuid44();
|
|
3015
|
+
jobWithPrefixes.job_run_id = jobWithPrefixes.job_run_id ?? uuid44();
|
|
2760
3016
|
jobWithPrefixes.queue = this.queueName;
|
|
2761
3017
|
jobWithPrefixes.fingerprint = await makeFingerprint6(jobWithPrefixes.input);
|
|
2762
3018
|
jobWithPrefixes.status = JobStatus.PENDING;
|
|
@@ -3243,8 +3499,8 @@ class IndexedDbQueueStorage {
|
|
|
3243
3499
|
}
|
|
3244
3500
|
}
|
|
3245
3501
|
// src/queue/SupabaseQueueStorage.ts
|
|
3246
|
-
import { createServiceToken as
|
|
3247
|
-
var SUPABASE_QUEUE_STORAGE =
|
|
3502
|
+
import { createServiceToken as createServiceToken17, makeFingerprint as makeFingerprint7, uuid4 as uuid45 } from "@workglow/util";
|
|
3503
|
+
var SUPABASE_QUEUE_STORAGE = createServiceToken17("jobqueue.storage.supabase");
|
|
3248
3504
|
|
|
3249
3505
|
class SupabaseQueueStorage {
|
|
3250
3506
|
client;
|
|
@@ -3360,7 +3616,7 @@ class SupabaseQueueStorage {
|
|
|
3360
3616
|
async add(job) {
|
|
3361
3617
|
const now = new Date().toISOString();
|
|
3362
3618
|
job.queue = this.queueName;
|
|
3363
|
-
job.job_run_id = job.job_run_id ??
|
|
3619
|
+
job.job_run_id = job.job_run_id ?? uuid45();
|
|
3364
3620
|
job.fingerprint = await makeFingerprint7(job.input);
|
|
3365
3621
|
job.status = JobStatus.PENDING;
|
|
3366
3622
|
job.progress = 0;
|
|
@@ -3742,9 +3998,9 @@ class SupabaseQueueStorage {
|
|
|
3742
3998
|
return manager.subscribe(callback, { intervalMs });
|
|
3743
3999
|
}
|
|
3744
4000
|
}
|
|
3745
|
-
// src/limiter/IndexedDbRateLimiterStorage.ts
|
|
3746
|
-
import { createServiceToken as
|
|
3747
|
-
var INDEXED_DB_RATE_LIMITER_STORAGE =
|
|
4001
|
+
// src/queue-limiter/IndexedDbRateLimiterStorage.ts
|
|
4002
|
+
import { createServiceToken as createServiceToken18 } from "@workglow/util";
|
|
4003
|
+
var INDEXED_DB_RATE_LIMITER_STORAGE = createServiceToken18("ratelimiter.storage.indexedDb");
|
|
3748
4004
|
|
|
3749
4005
|
class IndexedDbRateLimiterStorage {
|
|
3750
4006
|
executionDb;
|
|
@@ -3963,9 +4219,9 @@ class IndexedDbRateLimiterStorage {
|
|
|
3963
4219
|
});
|
|
3964
4220
|
}
|
|
3965
4221
|
}
|
|
3966
|
-
// src/limiter/SupabaseRateLimiterStorage.ts
|
|
3967
|
-
import { createServiceToken as
|
|
3968
|
-
var SUPABASE_RATE_LIMITER_STORAGE =
|
|
4222
|
+
// src/queue-limiter/SupabaseRateLimiterStorage.ts
|
|
4223
|
+
import { createServiceToken as createServiceToken19 } from "@workglow/util";
|
|
4224
|
+
var SUPABASE_RATE_LIMITER_STORAGE = createServiceToken19("ratelimiter.storage.supabase");
|
|
3969
4225
|
|
|
3970
4226
|
class SupabaseRateLimiterStorage {
|
|
3971
4227
|
client;
|
|
@@ -4117,16 +4373,21 @@ class SupabaseRateLimiterStorage {
|
|
|
4117
4373
|
}
|
|
4118
4374
|
}
|
|
4119
4375
|
export {
|
|
4376
|
+
registerTabularRepository,
|
|
4120
4377
|
isSearchCondition,
|
|
4378
|
+
getVectorProperty,
|
|
4379
|
+
getTabularRepository,
|
|
4380
|
+
getMetadataProperty,
|
|
4381
|
+
getGlobalTabularRepositories,
|
|
4121
4382
|
ensureIndexedDbTable,
|
|
4122
4383
|
dropIndexedDbTable,
|
|
4123
|
-
TabularRepository,
|
|
4124
4384
|
TABULAR_REPOSITORY,
|
|
4125
|
-
|
|
4385
|
+
TABULAR_REPOSITORIES,
|
|
4386
|
+
SupabaseTabularStorage,
|
|
4126
4387
|
SupabaseRateLimiterStorage,
|
|
4127
4388
|
SupabaseQueueStorage,
|
|
4128
|
-
|
|
4129
|
-
|
|
4389
|
+
SupabaseKvStorage,
|
|
4390
|
+
SharedInMemoryTabularStorage,
|
|
4130
4391
|
SUPABASE_TABULAR_REPOSITORY,
|
|
4131
4392
|
SUPABASE_RATE_LIMITER_STORAGE,
|
|
4132
4393
|
SUPABASE_QUEUE_STORAGE,
|
|
@@ -4137,18 +4398,19 @@ export {
|
|
|
4137
4398
|
PollingSubscriptionManager,
|
|
4138
4399
|
MEMORY_TABULAR_REPOSITORY,
|
|
4139
4400
|
MEMORY_KV_REPOSITORY,
|
|
4140
|
-
|
|
4141
|
-
|
|
4401
|
+
KvViaTabularStorage,
|
|
4402
|
+
KvStorage,
|
|
4142
4403
|
KV_REPOSITORY,
|
|
4143
4404
|
JobStatus,
|
|
4144
|
-
|
|
4405
|
+
IndexedDbTabularStorage,
|
|
4145
4406
|
IndexedDbRateLimiterStorage,
|
|
4146
4407
|
IndexedDbQueueStorage,
|
|
4147
|
-
|
|
4148
|
-
|
|
4408
|
+
IndexedDbKvStorage,
|
|
4409
|
+
InMemoryVectorStorage,
|
|
4410
|
+
InMemoryTabularStorage,
|
|
4149
4411
|
InMemoryRateLimiterStorage,
|
|
4150
4412
|
InMemoryQueueStorage,
|
|
4151
|
-
|
|
4413
|
+
InMemoryKvStorage,
|
|
4152
4414
|
IN_MEMORY_RATE_LIMITER_STORAGE,
|
|
4153
4415
|
IN_MEMORY_QUEUE_STORAGE,
|
|
4154
4416
|
INDEXED_DB_RATE_LIMITER_STORAGE,
|
|
@@ -4158,8 +4420,9 @@ export {
|
|
|
4158
4420
|
HybridSubscriptionManager,
|
|
4159
4421
|
DefaultKeyValueSchema,
|
|
4160
4422
|
DefaultKeyValueKey,
|
|
4161
|
-
|
|
4162
|
-
CACHED_TABULAR_REPOSITORY
|
|
4423
|
+
CachedTabularStorage,
|
|
4424
|
+
CACHED_TABULAR_REPOSITORY,
|
|
4425
|
+
BaseTabularStorage
|
|
4163
4426
|
};
|
|
4164
4427
|
|
|
4165
|
-
//# debugId=
|
|
4428
|
+
//# debugId=DD95869160C198CF64756E2164756E21
|