@mongrov/analytics 0.3.0 → 0.5.0
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/core/errors.js +1 -1
- package/dist/core/errors.js.map +1 -1
- package/dist/core/extensions.d.ts +20 -6
- package/dist/core/extensions.d.ts.map +1 -1
- package/dist/core/extensions.js +21 -7
- package/dist/core/extensions.js.map +1 -1
- package/dist/core/factory.d.ts.map +1 -1
- package/dist/core/factory.js +90 -15
- package/dist/core/factory.js.map +1 -1
- package/dist/core/migrations.d.ts +22 -4
- package/dist/core/migrations.d.ts.map +1 -1
- package/dist/core/migrations.js +46 -7
- package/dist/core/migrations.js.map +1 -1
- package/dist/core/schemas.d.ts +36 -5
- package/dist/core/schemas.d.ts.map +1 -1
- package/dist/core/schemas.js +39 -6
- package/dist/core/schemas.js.map +1 -1
- package/dist/core/types.d.ts +43 -5
- package/dist/core/types.d.ts.map +1 -1
- package/dist/core/warehouse.d.ts +55 -5
- package/dist/core/warehouse.d.ts.map +1 -1
- package/dist/core/warehouse.js +93 -18
- package/dist/core/warehouse.js.map +1 -1
- package/dist/rules/__fakes__/fakeEngine.d.ts +3 -1
- package/dist/rules/__fakes__/fakeEngine.d.ts.map +1 -1
- package/dist/rules/__fakes__/fakeEngine.js +4 -1
- package/dist/rules/__fakes__/fakeEngine.js.map +1 -1
- package/dist/rules/defaults/loader.d.ts.map +1 -1
- package/dist/rules/defaults/loader.js +4 -2
- package/dist/rules/defaults/loader.js.map +1 -1
- package/dist/rules/emitter.d.ts +2 -0
- package/dist/rules/emitter.d.ts.map +1 -1
- package/dist/rules/emitter.js +3 -0
- package/dist/rules/emitter.js.map +1 -1
- package/dist/rules/evaluator.d.ts.map +1 -1
- package/dist/rules/evaluator.js +4 -0
- package/dist/rules/evaluator.js.map +1 -1
- package/dist/rules/factory.d.ts.map +1 -1
- package/dist/rules/factory.js +29 -4
- package/dist/rules/factory.js.map +1 -1
- package/dist/rules/registry.d.ts +8 -0
- package/dist/rules/registry.d.ts.map +1 -1
- package/dist/rules/registry.js +22 -0
- package/dist/rules/registry.js.map +1 -1
- package/dist/rules/types.d.ts +9 -0
- package/dist/rules/types.d.ts.map +1 -1
- package/dist/sync/factory.d.ts.map +1 -1
- package/dist/sync/factory.js +20 -7
- package/dist/sync/factory.js.map +1 -1
- package/dist/sync/fetcher.d.ts.map +1 -1
- package/dist/sync/fetcher.js +2 -1
- package/dist/sync/fetcher.js.map +1 -1
- package/dist/sync/pusher.d.ts +10 -3
- package/dist/sync/pusher.d.ts.map +1 -1
- package/dist/sync/pusher.js +1 -1
- package/dist/sync/pusher.js.map +1 -1
- package/dist/tools/__fakes__/engine.d.ts.map +1 -1
- package/dist/tools/__fakes__/engine.js +1 -0
- package/dist/tools/__fakes__/engine.js.map +1 -1
- package/package.json +3 -3
package/dist/core/errors.js
CHANGED
|
@@ -19,7 +19,7 @@ export class AnalyticsError extends Error {
|
|
|
19
19
|
*/
|
|
20
20
|
export class NotImplementedError extends AnalyticsError {
|
|
21
21
|
constructor(symbol) {
|
|
22
|
-
super('not_implemented', `${symbol} is not implemented
|
|
22
|
+
super('not_implemented', `${symbol} is not implemented`);
|
|
23
23
|
this.name = 'NotImplementedError';
|
|
24
24
|
}
|
|
25
25
|
}
|
package/dist/core/errors.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/core/errors.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAeH,MAAM,OAAO,cAAe,SAAQ,KAAK;IAIvC,YAAY,IAAwB,EAAE,OAAe,EAAE,KAAe;QACpE,KAAK,CAAC,OAAO,CAAC,CAAA;QACd,IAAI,CAAC,IAAI,GAAG,gBAAgB,CAAA;QAC5B,IAAI,CAAC,IAAI,GAAG,IAAI,CAAA;QAChB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAA;IACpB,CAAC;CACF;AAED;;;GAGG;AACH,MAAM,OAAO,mBAAoB,SAAQ,cAAc;IACrD,YAAY,MAAc;QACxB,KAAK,CAAC,iBAAiB,EAAE,GAAG,MAAM,
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/core/errors.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAeH,MAAM,OAAO,cAAe,SAAQ,KAAK;IAIvC,YAAY,IAAwB,EAAE,OAAe,EAAE,KAAe;QACpE,KAAK,CAAC,OAAO,CAAC,CAAA;QACd,IAAI,CAAC,IAAI,GAAG,gBAAgB,CAAA;QAC5B,IAAI,CAAC,IAAI,GAAG,IAAI,CAAA;QAChB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAA;IACpB,CAAC;CACF;AAED;;;GAGG;AACH,MAAM,OAAO,mBAAoB,SAAQ,cAAc;IACrD,YAAY,MAAc;QACxB,KAAK,CAAC,iBAAiB,EAAE,GAAG,MAAM,qBAAqB,CAAC,CAAA;QACxD,IAAI,CAAC,IAAI,GAAG,qBAAqB,CAAA;IACnC,CAAC;CACF"}
|
|
@@ -1,20 +1,34 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* DuckDB extension bootstrap.
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
4
|
+
* Two extension sets, selected by mode:
|
|
5
|
+
* - `r2` (default) — `httpfs` + `iceberg` + `parquet`. Required before
|
|
6
|
+
* any `ATTACH 'iceberg://…'` can succeed. iceberg + httpfs also drag
|
|
7
|
+
* in AWSSDK + OpenSSL/curl at native build time — see the fork's
|
|
8
|
+
* build-duckdb-ios.sh / android/CMakeLists.txt for the vcpkg wiring.
|
|
9
|
+
* - `local` — just `parquet`. Skips iceberg + httpfs entirely, which
|
|
10
|
+
* means local-only consumers can build the fork WITHOUT AWSSDK /
|
|
11
|
+
* OpenSSL / vcpkg (major DX win on iOS + Android).
|
|
12
|
+
*
|
|
13
|
+
* This module is the single place we issue `INSTALL/LOAD`, so failures
|
|
14
|
+
* map cleanly to `AnalyticsError('extension_load_failed', <name>)`.
|
|
8
15
|
*
|
|
9
16
|
* Bootstrapping is idempotent — a `#booted: Set<string>` guards repeated
|
|
10
17
|
* calls, and DuckDB itself no-ops re-loads, so calling twice is safe.
|
|
11
18
|
*/
|
|
12
19
|
import type { HybridDuckDB } from './engine';
|
|
20
|
+
import type { AnalyticsMode } from './types';
|
|
13
21
|
/** Extensions required for R2 Iceberg attach, in load order. */
|
|
14
22
|
export declare const REQUIRED_EXTENSIONS: readonly ["httpfs", "iceberg", "parquet"];
|
|
23
|
+
/** Extensions required for local-only mode (no remote sync, no iceberg). */
|
|
24
|
+
export declare const LOCAL_EXTENSIONS: readonly ["parquet"];
|
|
15
25
|
export type RequiredExtension = (typeof REQUIRED_EXTENSIONS)[number];
|
|
16
26
|
/**
|
|
17
|
-
* Issue `INSTALL <ext>; LOAD <ext>;` for each
|
|
27
|
+
* Issue `INSTALL <ext>; LOAD <ext>;` for each mode-appropriate extension
|
|
28
|
+
* in order.
|
|
29
|
+
*
|
|
30
|
+
* `mode` is optional and defaults to `'r2'` for back-compat with 0.4.x
|
|
31
|
+
* callers.
|
|
18
32
|
*
|
|
19
33
|
* Idempotent per-engine: extensions already loaded on the same
|
|
20
34
|
* `HybridDuckDB` instance are skipped.
|
|
@@ -22,7 +36,7 @@ export type RequiredExtension = (typeof REQUIRED_EXTENSIONS)[number];
|
|
|
22
36
|
* @throws `AnalyticsError('extension_load_failed', <ext>)` if any extension
|
|
23
37
|
* fails; the extension name appears in the message + cause is preserved.
|
|
24
38
|
*/
|
|
25
|
-
export declare function bootstrapExtensions(db: HybridDuckDB): Promise<void>;
|
|
39
|
+
export declare function bootstrapExtensions(db: HybridDuckDB, mode?: AnalyticsMode): Promise<void>;
|
|
26
40
|
/**
|
|
27
41
|
* Test-only: introspect which extensions have been booted for a given engine.
|
|
28
42
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"extensions.d.ts","sourceRoot":"","sources":["../../src/core/extensions.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"extensions.d.ts","sourceRoot":"","sources":["../../src/core/extensions.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAGH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,UAAU,CAAA;AAC5C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,SAAS,CAAA;AAE5C,gEAAgE;AAChE,eAAO,MAAM,mBAAmB,2CAA4C,CAAA;AAE5E,4EAA4E;AAC5E,eAAO,MAAM,gBAAgB,sBAAuB,CAAA;AAEpD,MAAM,MAAM,iBAAiB,GAAG,CAAC,OAAO,mBAAmB,CAAC,CAAC,MAAM,CAAC,CAAA;AAQpE;;;;;;;;;;;;GAYG;AACH,wBAAsB,mBAAmB,CACvC,EAAE,EAAE,YAAY,EAChB,IAAI,GAAE,aAAoB,GACzB,OAAO,CAAC,IAAI,CAAC,CA2Bf;AAED;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,EAAE,EAAE,YAAY,GAAG,WAAW,CAAC,MAAM,CAAC,CAEzE"}
|
package/dist/core/extensions.js
CHANGED
|
@@ -1,10 +1,17 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* DuckDB extension bootstrap.
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
4
|
+
* Two extension sets, selected by mode:
|
|
5
|
+
* - `r2` (default) — `httpfs` + `iceberg` + `parquet`. Required before
|
|
6
|
+
* any `ATTACH 'iceberg://…'` can succeed. iceberg + httpfs also drag
|
|
7
|
+
* in AWSSDK + OpenSSL/curl at native build time — see the fork's
|
|
8
|
+
* build-duckdb-ios.sh / android/CMakeLists.txt for the vcpkg wiring.
|
|
9
|
+
* - `local` — just `parquet`. Skips iceberg + httpfs entirely, which
|
|
10
|
+
* means local-only consumers can build the fork WITHOUT AWSSDK /
|
|
11
|
+
* OpenSSL / vcpkg (major DX win on iOS + Android).
|
|
12
|
+
*
|
|
13
|
+
* This module is the single place we issue `INSTALL/LOAD`, so failures
|
|
14
|
+
* map cleanly to `AnalyticsError('extension_load_failed', <name>)`.
|
|
8
15
|
*
|
|
9
16
|
* Bootstrapping is idempotent — a `#booted: Set<string>` guards repeated
|
|
10
17
|
* calls, and DuckDB itself no-ops re-loads, so calling twice is safe.
|
|
@@ -12,13 +19,19 @@
|
|
|
12
19
|
import { AnalyticsError } from './errors';
|
|
13
20
|
/** Extensions required for R2 Iceberg attach, in load order. */
|
|
14
21
|
export const REQUIRED_EXTENSIONS = ['httpfs', 'iceberg', 'parquet'];
|
|
22
|
+
/** Extensions required for local-only mode (no remote sync, no iceberg). */
|
|
23
|
+
export const LOCAL_EXTENSIONS = ['parquet'];
|
|
15
24
|
/**
|
|
16
25
|
* Tracks which extensions this process has already booted. Keyed by
|
|
17
26
|
* `HybridDuckDB` instance to keep isolation across engines in tests.
|
|
18
27
|
*/
|
|
19
28
|
const bootedByDb = new WeakMap();
|
|
20
29
|
/**
|
|
21
|
-
* Issue `INSTALL <ext>; LOAD <ext>;` for each
|
|
30
|
+
* Issue `INSTALL <ext>; LOAD <ext>;` for each mode-appropriate extension
|
|
31
|
+
* in order.
|
|
32
|
+
*
|
|
33
|
+
* `mode` is optional and defaults to `'r2'` for back-compat with 0.4.x
|
|
34
|
+
* callers.
|
|
22
35
|
*
|
|
23
36
|
* Idempotent per-engine: extensions already loaded on the same
|
|
24
37
|
* `HybridDuckDB` instance are skipped.
|
|
@@ -26,13 +39,14 @@ const bootedByDb = new WeakMap();
|
|
|
26
39
|
* @throws `AnalyticsError('extension_load_failed', <ext>)` if any extension
|
|
27
40
|
* fails; the extension name appears in the message + cause is preserved.
|
|
28
41
|
*/
|
|
29
|
-
export async function bootstrapExtensions(db) {
|
|
42
|
+
export async function bootstrapExtensions(db, mode = 'r2') {
|
|
30
43
|
let booted = bootedByDb.get(db);
|
|
31
44
|
if (!booted) {
|
|
32
45
|
booted = new Set();
|
|
33
46
|
bootedByDb.set(db, booted);
|
|
34
47
|
}
|
|
35
|
-
|
|
48
|
+
const extensions = mode === 'local' ? LOCAL_EXTENSIONS : REQUIRED_EXTENSIONS;
|
|
49
|
+
for (const ext of extensions) {
|
|
36
50
|
if (booted.has(ext)) {
|
|
37
51
|
continue;
|
|
38
52
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"extensions.js","sourceRoot":"","sources":["../../src/core/extensions.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"extensions.js","sourceRoot":"","sources":["../../src/core/extensions.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,UAAU,CAAA;AAIzC,gEAAgE;AAChE,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,QAAQ,EAAE,SAAS,EAAE,SAAS,CAAU,CAAA;AAE5E,4EAA4E;AAC5E,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,SAAS,CAAU,CAAA;AAIpD;;;GAGG;AACH,MAAM,UAAU,GAAG,IAAI,OAAO,EAA6B,CAAA;AAE3D;;;;;;;;;;;;GAYG;AACH,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,EAAgB,EAChB,OAAsB,IAAI;IAE1B,IAAI,MAAM,GAAG,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;IAC/B,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,GAAG,IAAI,GAAG,EAAE,CAAA;QAClB,UAAU,CAAC,GAAG,CAAC,EAAE,EAAE,MAAM,CAAC,CAAA;IAC5B,CAAC;IAED,MAAM,UAAU,GACZ,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,mBAAmB,CAAA;IAE7D,KAAK,MAAM,GAAG,IAAI,UAAU,EAAE,CAAC;QAC7B,IAAI,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;YACpB,SAAQ;QACV,CAAC;QACD,IAAI,CAAC;YACH,MAAM,EAAE,CAAC,OAAO,CAAC,WAAW,GAAG,GAAG,CAAC,CAAA;YACnC,MAAM,EAAE,CAAC,OAAO,CAAC,QAAQ,GAAG,GAAG,CAAC,CAAA;QAClC,CAAC;QACD,OAAO,KAAK,EAAE,CAAC;YACb,MAAM,IAAI,cAAc,CACtB,uBAAuB,EACvB,oCAAoC,GAAG,EAAE,EACzC,KAAK,CACN,CAAA;QACH,CAAC;QACD,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;IACjB,CAAC;AACH,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,mBAAmB,CAAC,EAAgB;IAClD,OAAO,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,IAAI,GAAG,EAAE,CAAA;AACxC,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"factory.d.ts","sourceRoot":"","sources":["../../src/core/factory.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAKH,OAAO,KAAK,EAAE,aAAa,EAAkB,MAAM,UAAU,CAAA;AAe7D,OAAO,KAAK,EAEV,eAAe,EACf,eAAe,
|
|
1
|
+
{"version":3,"file":"factory.d.ts","sourceRoot":"","sources":["../../src/core/factory.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAKH,OAAO,KAAK,EAAE,aAAa,EAAkB,MAAM,UAAU,CAAA;AAe7D,OAAO,KAAK,EAEV,eAAe,EACf,eAAe,EAKhB,MAAM,SAAS,CAAA;AAgChB;;;;;GAKG;AACH,MAAM,WAAW,uBAAuB;IACtC,6EAA6E;IAC7E,aAAa,CAAC,EAAE,aAAa,CAAA;CAC9B;AAwED,wBAAgB,eAAe,CAC7B,MAAM,EAAE,eAAe,EACvB,QAAQ,GAAE,uBAA4B,GACrC,eAAe,CA8QjB"}
|
package/dist/core/factory.js
CHANGED
|
@@ -19,7 +19,7 @@ import { analyticsMachine } from './machine';
|
|
|
19
19
|
import { ensureMigrations } from './migrations';
|
|
20
20
|
import { clearLastAttach, loadLastAttach, loadRetentionOverride, saveLastAttach, saveRetentionOverride, } from './persistence';
|
|
21
21
|
import { resolveEffectiveRetention, runRetentionSweep } from './retention';
|
|
22
|
-
import { attachWarehouse, detachWarehouse, warehouseSecretName, } from './warehouse';
|
|
22
|
+
import { attachLocal, attachWarehouse, detachLocal, detachWarehouse, probeLocalCatalog, warehouseSecretName, } from './warehouse';
|
|
23
23
|
// -------------------- default DuckDB factory --------------------
|
|
24
24
|
/**
|
|
25
25
|
* Lazy resolver for `react-native-duckdb`. Only fires on `open()` — importing
|
|
@@ -62,41 +62,100 @@ function currentState(actor) {
|
|
|
62
62
|
const raw = actor.getSnapshot().value;
|
|
63
63
|
return typeof raw === 'string' ? raw : 'idle';
|
|
64
64
|
}
|
|
65
|
+
function assertAttached(state, operation) {
|
|
66
|
+
if (state !== 'attached') {
|
|
67
|
+
throw new AnalyticsError('not_attached', `${operation} requires an attached engine (state=${state})`);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
const MEMORY_LIMIT_PATTERN = /^\d+(?:\.\d+)?\s*(?:KB|MB|GB|TB)$/i;
|
|
71
|
+
const THREADS_PATTERN = /^\d+$/;
|
|
72
|
+
async function applyDuckdbTuning(db, cfg) {
|
|
73
|
+
if (cfg?.memoryLimit !== undefined) {
|
|
74
|
+
if (!MEMORY_LIMIT_PATTERN.test(cfg.memoryLimit)) {
|
|
75
|
+
throw new AnalyticsError('engine_open_failed', `invalid duckdb.memoryLimit: ${cfg.memoryLimit} (expected e.g. '512MB', '2GB')`);
|
|
76
|
+
}
|
|
77
|
+
await db.execute(`SET memory_limit = '${cfg.memoryLimit}'`);
|
|
78
|
+
}
|
|
79
|
+
if (cfg?.threads !== undefined) {
|
|
80
|
+
if (!THREADS_PATTERN.test(cfg.threads)) {
|
|
81
|
+
throw new AnalyticsError('engine_open_failed', `invalid duckdb.threads: ${cfg.threads} (expected integer)`);
|
|
82
|
+
}
|
|
83
|
+
await db.execute(`SET threads = ${cfg.threads}`);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
65
86
|
// -------------------- factory --------------------
|
|
66
87
|
export function createAnalytics(config, internal = {}) {
|
|
67
88
|
const log = resolveLogger(config.logger);
|
|
68
89
|
const duckdbFactory = internal.duckdbFactory ?? defaultDuckdbFactory();
|
|
69
90
|
const db = new HybridDuckDB(duckdbFactory);
|
|
91
|
+
// Resolve mode once — default 'r2' for back-compat with 0.4.x call sites
|
|
92
|
+
// that don't set the field. `isLocal` gates dispatch throughout the
|
|
93
|
+
// actor closures; `r2Config` is a typed alias for the R2 branch (safe
|
|
94
|
+
// by construction — only accessed inside `if (!isLocal)` blocks).
|
|
95
|
+
const mode = config.mode ?? 'r2';
|
|
96
|
+
const isLocal = mode === 'local';
|
|
97
|
+
const r2Config = config;
|
|
70
98
|
const machineActors = {
|
|
71
99
|
async openEngine() {
|
|
72
100
|
await db.open();
|
|
73
|
-
await
|
|
101
|
+
await applyDuckdbTuning(db, config.duckdb);
|
|
102
|
+
await bootstrapExtensions(db, mode);
|
|
74
103
|
},
|
|
75
104
|
async attachEngine({ ctx }) {
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
105
|
+
// Dispatch based on mode. Local: probe current catalog, no auth,
|
|
106
|
+
// no ATTACH. R2: full attach protocol (URI + token + SECRET + ATTACH).
|
|
107
|
+
// In both cases, ensureMigrations runs with the appropriate catalog
|
|
108
|
+
// set — LOCAL_SCHEMAS always in local catalog; SCHEMAS in remote
|
|
109
|
+
// when attached — so local tables get created even for R2 installs
|
|
110
|
+
// (fixing the pre-0.5.0 gap where the sink threw on first append).
|
|
111
|
+
let attach;
|
|
112
|
+
let remoteCatalog;
|
|
113
|
+
if (isLocal) {
|
|
114
|
+
attach = await attachLocal(db, ctx);
|
|
115
|
+
}
|
|
116
|
+
else {
|
|
117
|
+
attach = await attachWarehouse(db, ctx, {
|
|
118
|
+
warehouseUriBuilder: r2Config.warehouseUriBuilder,
|
|
119
|
+
tokenVendor: r2Config.tokenVendor,
|
|
120
|
+
familyMembersProvider: r2Config.familyMembersProvider,
|
|
121
|
+
catalogEndpoint: r2Config.catalogEndpoint,
|
|
122
|
+
});
|
|
123
|
+
remoteCatalog = attach.warehouseSecret;
|
|
124
|
+
}
|
|
125
|
+
const localCatalog = await probeLocalCatalog(db);
|
|
126
|
+
await ensureMigrations(db, config.storage, { brand: ctx.brand, tenantId: ctx.tenantId }, { local: localCatalog, remote: remoteCatalog });
|
|
83
127
|
return {
|
|
84
128
|
warehouseSecret: attach.warehouseSecret,
|
|
85
129
|
tokenExpiresAt: attach.tokenExpiresAt.getTime(),
|
|
86
130
|
};
|
|
87
131
|
},
|
|
88
132
|
async detachEngine({ ctx }) {
|
|
89
|
-
|
|
133
|
+
if (isLocal) {
|
|
134
|
+
await detachLocal(db, ctx.tenantId);
|
|
135
|
+
}
|
|
136
|
+
else {
|
|
137
|
+
await detachWarehouse(db, ctx.tenantId);
|
|
138
|
+
}
|
|
90
139
|
},
|
|
91
140
|
async refreshToken({ ctx }) {
|
|
92
|
-
|
|
141
|
+
// Local mode: no token, no refresh. Return a far-future expiry so
|
|
142
|
+
// the machine's TOKEN_REFRESH_TICK never fires again. This actor
|
|
143
|
+
// shouldn't be scheduled in local mode (attachLocal returns
|
|
144
|
+
// sentinel far-future expiry), but guarding here is cheap
|
|
145
|
+
// defense-in-depth if a consumer forces attachEngine somehow.
|
|
146
|
+
if (isLocal) {
|
|
147
|
+
return {
|
|
148
|
+
tokenExpiresAt: Date.now() + 100 * 365 * 24 * 60 * 60 * 1000,
|
|
149
|
+
};
|
|
150
|
+
}
|
|
151
|
+
const token = await r2Config.tokenVendor.fetch({
|
|
93
152
|
brand: ctx.brand,
|
|
94
153
|
tenantScope: ctx.tenantScope,
|
|
95
154
|
tenantId: ctx.tenantId,
|
|
96
155
|
});
|
|
97
156
|
const secretName = warehouseSecretName(ctx.tenantId);
|
|
98
157
|
try {
|
|
99
|
-
await db.execute(`CREATE OR REPLACE SECRET ${secretName} (TYPE ICEBERG, TOKEN $token, ENDPOINT $endpoint);`, { token: token.token, endpoint:
|
|
158
|
+
await db.execute(`CREATE OR REPLACE SECRET ${secretName} (TYPE ICEBERG, TOKEN $token, ENDPOINT $endpoint);`, { token: token.token, endpoint: r2Config.catalogEndpoint });
|
|
100
159
|
}
|
|
101
160
|
catch (cause) {
|
|
102
161
|
throw new AnalyticsError('token_vendor_failed', `refreshToken: CREATE OR REPLACE SECRET failed for ${secretName}`, cause);
|
|
@@ -218,9 +277,22 @@ export function createAnalytics(config, internal = {}) {
|
|
|
218
277
|
}
|
|
219
278
|
}
|
|
220
279
|
},
|
|
221
|
-
execute
|
|
222
|
-
|
|
223
|
-
|
|
280
|
+
// `execute` declares `Promise<T[]>` — funnel the guard through a
|
|
281
|
+
// rejected promise instead of a sync throw so all failures land on the
|
|
282
|
+
// returned promise. `stream` / `createAppender` return synchronous
|
|
283
|
+
// values, so a sync throw is the natural signal there.
|
|
284
|
+
async execute(sql, params) {
|
|
285
|
+
assertAttached(currentState(actor), 'execute');
|
|
286
|
+
return db.execute(sql, params);
|
|
287
|
+
},
|
|
288
|
+
stream: (sql, params) => {
|
|
289
|
+
assertAttached(currentState(actor), 'stream');
|
|
290
|
+
return db.stream(sql, params);
|
|
291
|
+
},
|
|
292
|
+
createAppender: (table) => {
|
|
293
|
+
assertAttached(currentState(actor), `createAppender('${table}')`);
|
|
294
|
+
return db.createAppender(table);
|
|
295
|
+
},
|
|
224
296
|
get state() {
|
|
225
297
|
return currentState(actor);
|
|
226
298
|
},
|
|
@@ -230,6 +302,9 @@ export function createAnalytics(config, internal = {}) {
|
|
|
230
302
|
get catalog() {
|
|
231
303
|
return actor.getSnapshot().context.warehouseSecret;
|
|
232
304
|
},
|
|
305
|
+
get mode() {
|
|
306
|
+
return mode;
|
|
307
|
+
},
|
|
233
308
|
subscribe(listener) {
|
|
234
309
|
publicSubscribers.add(listener);
|
|
235
310
|
return () => publicSubscribers.delete(listener);
|
package/dist/core/factory.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"factory.js","sourceRoot":"","sources":["../../src/core/factory.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"factory.js","sourceRoot":"","sources":["../../src/core/factory.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,7 +3,19 @@
|
|
|
3
3
|
*
|
|
4
4
|
* Version is tracked per `(brand, tenantId)` in KVStore. v0.1.0 has a single
|
|
5
5
|
* baseline migration (step 1: `ensureSchemas`) — future migrations append to
|
|
6
|
-
* `MIGRATIONS` in order; each `up(db)` receives the
|
|
6
|
+
* `MIGRATIONS` in order; each `up(db, catalogs)` receives the catalog set
|
|
7
|
+
* for the current attach mode.
|
|
8
|
+
*
|
|
9
|
+
* `ensureMigrations` accepts a `MigrationCatalogs` object with:
|
|
10
|
+
* - `local` — the local DuckDB catalog name (always present, from
|
|
11
|
+
* `current_database()`). LOCAL_SCHEMAS DDL runs here.
|
|
12
|
+
* - `remote` — the attached R2 iceberg catalog secret name (present only
|
|
13
|
+
* in R2 mode). SCHEMAS (with `PARTITIONED BY`) DDL runs here.
|
|
14
|
+
*
|
|
15
|
+
* The baseline migration ensures BOTH sets get created when both catalogs
|
|
16
|
+
* are present. Local-mode installs run just the LOCAL_SCHEMAS half. R2
|
|
17
|
+
* installs run both halves — fixing the pre-0.5.0 gap where `local.*`
|
|
18
|
+
* tables never got created and the sink threw on first append.
|
|
7
19
|
*
|
|
8
20
|
* `ensureMigrations` is idempotent and safe to call on every attach.
|
|
9
21
|
*/
|
|
@@ -13,13 +25,19 @@ export interface MigrationContext {
|
|
|
13
25
|
brand: string;
|
|
14
26
|
tenantId: string;
|
|
15
27
|
}
|
|
28
|
+
export interface MigrationCatalogs {
|
|
29
|
+
/** Local DuckDB catalog name (e.g. `memory` in tests, `<filestem>` on device). */
|
|
30
|
+
local: string;
|
|
31
|
+
/** Attached R2 iceberg catalog secret name. Undefined in local mode. */
|
|
32
|
+
remote?: string;
|
|
33
|
+
}
|
|
16
34
|
export interface Migration {
|
|
17
35
|
/** Sequential integer, starting at 1. */
|
|
18
36
|
version: number;
|
|
19
37
|
/** Human name shown in errors + logs. */
|
|
20
38
|
name: string;
|
|
21
|
-
/** Idempotent DDL — called with the
|
|
22
|
-
up(db: HybridDuckDB,
|
|
39
|
+
/** Idempotent DDL — called with the current attach's catalog set. */
|
|
40
|
+
up(db: HybridDuckDB, catalogs: MigrationCatalogs): Promise<void>;
|
|
23
41
|
}
|
|
24
42
|
/**
|
|
25
43
|
* Ordered list of migrations. Each entry's `version` must equal its
|
|
@@ -48,5 +66,5 @@ export interface EnsureMigrationsResult {
|
|
|
48
66
|
* advanced after each successful step so a partial upgrade leaves the
|
|
49
67
|
* version at the last successful step (subsequent runs retry from there).
|
|
50
68
|
*/
|
|
51
|
-
export declare function ensureMigrations(db: HybridDuckDB, kv: KVStore, ctx: MigrationContext,
|
|
69
|
+
export declare function ensureMigrations(db: HybridDuckDB, kv: KVStore, ctx: MigrationContext, catalogs: MigrationCatalogs): Promise<EnsureMigrationsResult>;
|
|
52
70
|
//# sourceMappingURL=migrations.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"migrations.d.ts","sourceRoot":"","sources":["../../src/core/migrations.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"migrations.d.ts","sourceRoot":"","sources":["../../src/core/migrations.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAGH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,UAAU,CAAA;AAE5C,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,SAAS,CAAA;AAEtC,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,MAAM,CAAA;IACb,QAAQ,EAAE,MAAM,CAAA;CACjB;AAED,MAAM,WAAW,iBAAiB;IAChC,kFAAkF;IAClF,KAAK,EAAE,MAAM,CAAA;IACb,wEAAwE;IACxE,MAAM,CAAC,EAAE,MAAM,CAAA;CAChB;AAED,MAAM,WAAW,SAAS;IACxB,yCAAyC;IACzC,OAAO,EAAE,MAAM,CAAA;IACf,yCAAyC;IACzC,IAAI,EAAE,MAAM,CAAA;IACZ,qEAAqE;IACrE,EAAE,CAAC,EAAE,EAAE,YAAY,EAAE,QAAQ,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;CACjE;AAED;;;GAGG;AACH,eAAO,MAAM,UAAU,EAAE,SAAS,SAAS,EAezC,CAAA;AAEF,uEAAuE;AACvE,eAAO,MAAM,eAAe,EAAE,MAA0B,CAAA;AAExD;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAExE;AAWD,MAAM,WAAW,sBAAsB;IACrC,IAAI,EAAE,MAAM,CAAA;IACZ,EAAE,EAAE,MAAM,CAAA;CACX;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,gBAAgB,CACpC,EAAE,EAAE,YAAY,EAChB,EAAE,EAAE,OAAO,EACX,GAAG,EAAE,gBAAgB,EACrB,QAAQ,EAAE,iBAAiB,GAC1B,OAAO,CAAC,sBAAsB,CAAC,CAyCjC"}
|
package/dist/core/migrations.js
CHANGED
|
@@ -3,12 +3,24 @@
|
|
|
3
3
|
*
|
|
4
4
|
* Version is tracked per `(brand, tenantId)` in KVStore. v0.1.0 has a single
|
|
5
5
|
* baseline migration (step 1: `ensureSchemas`) — future migrations append to
|
|
6
|
-
* `MIGRATIONS` in order; each `up(db)` receives the
|
|
6
|
+
* `MIGRATIONS` in order; each `up(db, catalogs)` receives the catalog set
|
|
7
|
+
* for the current attach mode.
|
|
8
|
+
*
|
|
9
|
+
* `ensureMigrations` accepts a `MigrationCatalogs` object with:
|
|
10
|
+
* - `local` — the local DuckDB catalog name (always present, from
|
|
11
|
+
* `current_database()`). LOCAL_SCHEMAS DDL runs here.
|
|
12
|
+
* - `remote` — the attached R2 iceberg catalog secret name (present only
|
|
13
|
+
* in R2 mode). SCHEMAS (with `PARTITIONED BY`) DDL runs here.
|
|
14
|
+
*
|
|
15
|
+
* The baseline migration ensures BOTH sets get created when both catalogs
|
|
16
|
+
* are present. Local-mode installs run just the LOCAL_SCHEMAS half. R2
|
|
17
|
+
* installs run both halves — fixing the pre-0.5.0 gap where `local.*`
|
|
18
|
+
* tables never got created and the sink threw on first append.
|
|
7
19
|
*
|
|
8
20
|
* `ensureMigrations` is idempotent and safe to call on every attach.
|
|
9
21
|
*/
|
|
10
22
|
import { AnalyticsError } from './errors';
|
|
11
|
-
import { ensureSchemas } from './schemas';
|
|
23
|
+
import { ensureSchemas, LOCAL_SCHEMAS, SCHEMAS } from './schemas';
|
|
12
24
|
/**
|
|
13
25
|
* Ordered list of migrations. Each entry's `version` must equal its
|
|
14
26
|
* (1-based) position; `CURRENT_VERSION` is derived from the tail.
|
|
@@ -17,8 +29,15 @@ export const MIGRATIONS = Object.freeze([
|
|
|
17
29
|
{
|
|
18
30
|
version: 1,
|
|
19
31
|
name: 'baseline schemas',
|
|
20
|
-
async up(db,
|
|
21
|
-
|
|
32
|
+
async up(db, catalogs) {
|
|
33
|
+
// Always ensure local tables (LOCAL_SCHEMAS — no PARTITIONED BY;
|
|
34
|
+
// plain DuckDB accepts the DDL).
|
|
35
|
+
await ensureSchemas(db, catalogs.local, LOCAL_SCHEMAS);
|
|
36
|
+
// Ensure remote tables when attached to R2 (SCHEMAS — with
|
|
37
|
+
// PARTITIONED BY; Iceberg requires it).
|
|
38
|
+
if (catalogs.remote) {
|
|
39
|
+
await ensureSchemas(db, catalogs.remote, SCHEMAS);
|
|
40
|
+
}
|
|
22
41
|
},
|
|
23
42
|
},
|
|
24
43
|
]);
|
|
@@ -29,6 +48,14 @@ export const CURRENT_VERSION = MIGRATIONS.length;
|
|
|
29
48
|
* `(brand, tenantId)` pair.
|
|
30
49
|
*/
|
|
31
50
|
export function schemaVersionKey(brand, tenantId) {
|
|
51
|
+
return `analytics:schema_version:${brand}:${tenantId}`;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Legacy KV key format used before T-23 canonicalization (hyphen instead
|
|
55
|
+
* of underscore). Read-only — `ensureMigrations` copies any legacy entry
|
|
56
|
+
* to the canonical key on first read and deletes the legacy one.
|
|
57
|
+
*/
|
|
58
|
+
function legacySchemaVersionKey(brand, tenantId) {
|
|
32
59
|
return `analytics:schema-version:${brand}:${tenantId}`;
|
|
33
60
|
}
|
|
34
61
|
/**
|
|
@@ -42,9 +69,21 @@ export function schemaVersionKey(brand, tenantId) {
|
|
|
42
69
|
* advanced after each successful step so a partial upgrade leaves the
|
|
43
70
|
* version at the last successful step (subsequent runs retry from there).
|
|
44
71
|
*/
|
|
45
|
-
export async function ensureMigrations(db, kv, ctx,
|
|
72
|
+
export async function ensureMigrations(db, kv, ctx, catalogs) {
|
|
46
73
|
const key = schemaVersionKey(ctx.brand, ctx.tenantId);
|
|
47
|
-
|
|
74
|
+
let stored = await kv.get(key);
|
|
75
|
+
// One-shot migration from the pre-T-23 hyphenated key. If the canonical
|
|
76
|
+
// key is absent but a legacy value exists, adopt it under the new key
|
|
77
|
+
// and remove the legacy entry so this branch stays cold on next boot.
|
|
78
|
+
if (stored === undefined) {
|
|
79
|
+
const legacyKey = legacySchemaVersionKey(ctx.brand, ctx.tenantId);
|
|
80
|
+
const legacyValue = await kv.get(legacyKey);
|
|
81
|
+
if (typeof legacyValue === 'number') {
|
|
82
|
+
await kv.set(key, legacyValue);
|
|
83
|
+
await kv.delete(legacyKey);
|
|
84
|
+
stored = legacyValue;
|
|
85
|
+
}
|
|
86
|
+
}
|
|
48
87
|
const from = typeof stored === 'number' ? stored : 0;
|
|
49
88
|
if (from >= CURRENT_VERSION) {
|
|
50
89
|
return { from, to: from };
|
|
@@ -54,7 +93,7 @@ export async function ensureMigrations(db, kv, ctx, catalog) {
|
|
|
54
93
|
continue;
|
|
55
94
|
}
|
|
56
95
|
try {
|
|
57
|
-
await migration.up(db,
|
|
96
|
+
await migration.up(db, catalogs);
|
|
58
97
|
}
|
|
59
98
|
catch (cause) {
|
|
60
99
|
throw new AnalyticsError('migration_failed', `migration step-${migration.version} (${migration.name}) failed`, cause);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"migrations.js","sourceRoot":"","sources":["../../src/core/migrations.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"migrations.js","sourceRoot":"","sources":["../../src/core/migrations.ts"],"names":[],"mappings":"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"}
|
package/dist/core/schemas.d.ts
CHANGED
|
@@ -5,10 +5,21 @@
|
|
|
5
5
|
* DDL strings are frozen — apps must not mutate them; migrations (T-08) own
|
|
6
6
|
* schema evolution.
|
|
7
7
|
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
8
|
+
* Two DDL variants exist:
|
|
9
|
+
* - `SCHEMAS` — for Iceberg-attached remote catalogs. Includes
|
|
10
|
+
* `PARTITIONED BY (day(ts), user_id)` clauses that Iceberg requires
|
|
11
|
+
* for partition pruning at scan time.
|
|
12
|
+
* - `LOCAL_SCHEMAS` — for the app's local DuckDB catalog. Identical to
|
|
13
|
+
* `SCHEMAS` minus the `PARTITIONED BY` clauses, which plain DuckDB
|
|
14
|
+
* (non-Iceberg) rejects with a parser error. Derived from `SCHEMAS`
|
|
15
|
+
* via `toLocalDdl` at module load time so both variants stay in sync
|
|
16
|
+
* through schema changes.
|
|
17
|
+
*
|
|
18
|
+
* `ensureSchemas(db, catalog, schemas)` idempotently creates every table
|
|
19
|
+
* inside the given catalog, rewriting `CREATE TABLE <name>` to
|
|
20
|
+
* `CREATE TABLE IF NOT EXISTS <catalog>.<name>` at issue time. Callers
|
|
21
|
+
* pick the variant: remote attach uses `SCHEMAS`, local mode uses
|
|
22
|
+
* `LOCAL_SCHEMAS`.
|
|
12
23
|
*/
|
|
13
24
|
import type { HybridDuckDB } from './engine';
|
|
14
25
|
/** Ordered list of every warehouse table. Order = creation order. */
|
|
@@ -25,11 +36,31 @@ export declare const SCHEMAS: Readonly<Record<TableName, string>>;
|
|
|
25
36
|
* Exported for tests; call sites should prefer `ensureSchemas`.
|
|
26
37
|
*/
|
|
27
38
|
export declare function qualifyDdl(baseDdl: string, table: TableName, catalog: string): string;
|
|
39
|
+
/**
|
|
40
|
+
* Strip the Iceberg-only `PARTITIONED BY (...)` clause from a DDL string.
|
|
41
|
+
* Plain DuckDB (non-Iceberg) rejects the clause with a parser error; local
|
|
42
|
+
* mode uses the returned form. Preserves the trailing `);` terminator.
|
|
43
|
+
*
|
|
44
|
+
* Exported for tests; call sites should prefer `LOCAL_SCHEMAS`.
|
|
45
|
+
*/
|
|
46
|
+
export declare function toLocalDdl(baseDdl: string): string;
|
|
47
|
+
/**
|
|
48
|
+
* Local-catalog DDL variants of `SCHEMAS` — same tables, same columns,
|
|
49
|
+
* same primary keys; only difference is the `PARTITIONED BY` clauses are
|
|
50
|
+
* stripped. Derived programmatically so schema changes in `SCHEMAS`
|
|
51
|
+
* propagate automatically.
|
|
52
|
+
*/
|
|
53
|
+
export declare const LOCAL_SCHEMAS: Readonly<Record<TableName, string>>;
|
|
28
54
|
/**
|
|
29
55
|
* Create every warehouse table under `<catalog>.<table>`, in `TABLE_NAMES` order.
|
|
30
56
|
*
|
|
31
57
|
* Idempotent — every issued statement uses `IF NOT EXISTS`. Failure at any
|
|
32
58
|
* table surfaces as `AnalyticsError('migration_failed', <table>, cause)`.
|
|
59
|
+
*
|
|
60
|
+
* `schemas` selects the DDL variant: pass `SCHEMAS` for remote iceberg
|
|
61
|
+
* catalogs (with `PARTITIONED BY`), `LOCAL_SCHEMAS` for the local DuckDB
|
|
62
|
+
* catalog (without). Default is `SCHEMAS` for back-compat with 0.4.x
|
|
63
|
+
* callers that only wrote to the attached remote.
|
|
33
64
|
*/
|
|
34
|
-
export declare function ensureSchemas(db: HybridDuckDB, catalog: string): Promise<void>;
|
|
65
|
+
export declare function ensureSchemas(db: HybridDuckDB, catalog: string, schemas?: Readonly<Record<TableName, string>>): Promise<void>;
|
|
35
66
|
//# sourceMappingURL=schemas.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schemas.d.ts","sourceRoot":"","sources":["../../src/core/schemas.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"schemas.d.ts","sourceRoot":"","sources":["../../src/core/schemas.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAGH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,UAAU,CAAA;AAE5C,qEAAqE;AACrE,eAAO,MAAM,WAAW,oNAed,CAAA;AAEV,MAAM,MAAM,SAAS,GAAG,CAAC,OAAO,WAAW,CAAC,CAAC,MAAM,CAAC,CAAA;AAEpD;;;GAGG;AACH,eAAO,MAAM,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,CAiKtD,CAAA;AAEF;;;;GAIG;AACH,wBAAgB,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAKrF;AAED;;;;;;GAMG;AACH,wBAAgB,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAElD;AAED;;;;;GAKG;AACH,eAAO,MAAM,aAAa,EAAE,QAAQ,CAAC,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,CAI7D,CAAA;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,aAAa,CACjC,EAAE,EAAE,YAAY,EAChB,OAAO,EAAE,MAAM,EACf,OAAO,GAAE,QAAQ,CAAC,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,CAAW,GACrD,OAAO,CAAC,IAAI,CAAC,CAcf"}
|