@relkit/observability-local 0.0.0-stage → 0.1.1
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/LICENSE +21 -0
- package/README.md +4 -2
- package/dist/index.d.ts +9 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +8 -0
- package/dist/index.js.map +1 -0
- package/dist/local/duckdb-batch-cursors.d.ts +10 -0
- package/dist/local/duckdb-batch-cursors.d.ts.map +1 -0
- package/dist/local/duckdb-batch-cursors.js +30 -0
- package/dist/local/duckdb-batch-cursors.js.map +1 -0
- package/dist/local/duckdb-batch-insert.d.ts +8 -0
- package/dist/local/duckdb-batch-insert.d.ts.map +1 -0
- package/dist/local/duckdb-batch-insert.js +29 -0
- package/dist/local/duckdb-batch-insert.js.map +1 -0
- package/dist/local/duckdb-batch-prepare.d.ts +7 -0
- package/dist/local/duckdb-batch-prepare.d.ts.map +1 -0
- package/dist/local/duckdb-batch-prepare.js +29 -0
- package/dist/local/duckdb-batch-prepare.js.map +1 -0
- package/dist/local/duckdb-batch-receipts.d.ts +7 -0
- package/dist/local/duckdb-batch-receipts.d.ts.map +1 -0
- package/dist/local/duckdb-batch-receipts.js +24 -0
- package/dist/local/duckdb-batch-receipts.js.map +1 -0
- package/dist/local/duckdb-batch.d.ts +8 -0
- package/dist/local/duckdb-batch.d.ts.map +1 -0
- package/dist/local/duckdb-batch.js +19 -0
- package/dist/local/duckdb-batch.js.map +1 -0
- package/dist/local/duckdb-batch.types.d.ts +19 -0
- package/dist/local/duckdb-batch.types.d.ts.map +1 -0
- package/dist/local/duckdb-batch.types.js +2 -0
- package/dist/local/duckdb-batch.types.js.map +1 -0
- package/dist/local/duckdb-database-effect.d.ts +88 -0
- package/dist/local/duckdb-database-effect.d.ts.map +1 -0
- package/dist/local/duckdb-database-effect.js +81 -0
- package/dist/local/duckdb-database-effect.js.map +1 -0
- package/dist/local/duckdb-database.d.ts +101 -0
- package/dist/local/duckdb-database.d.ts.map +1 -0
- package/dist/local/duckdb-database.js +61 -0
- package/dist/local/duckdb-database.js.map +1 -0
- package/dist/local/duckdb-database.types.d.ts +19 -0
- package/dist/local/duckdb-database.types.d.ts.map +1 -0
- package/dist/local/duckdb-database.types.js +2 -0
- package/dist/local/duckdb-database.types.js.map +1 -0
- package/dist/local/duckdb-driver.d.ts +25 -0
- package/dist/local/duckdb-driver.d.ts.map +1 -0
- package/dist/local/duckdb-driver.js +34 -0
- package/dist/local/duckdb-driver.js.map +1 -0
- package/dist/local/duckdb-driver.types.d.ts +96 -0
- package/dist/local/duckdb-driver.types.d.ts.map +1 -0
- package/dist/local/duckdb-driver.types.js +2 -0
- package/dist/local/duckdb-driver.types.js.map +1 -0
- package/dist/local/duckdb-error.d.ts +32 -0
- package/dist/local/duckdb-error.d.ts.map +1 -0
- package/dist/local/duckdb-error.js +36 -0
- package/dist/local/duckdb-error.js.map +1 -0
- package/dist/local/duckdb-metrics.d.ts +17 -0
- package/dist/local/duckdb-metrics.d.ts.map +1 -0
- package/dist/local/duckdb-metrics.js +30 -0
- package/dist/local/duckdb-metrics.js.map +1 -0
- package/dist/local/duckdb-query-detail.d.ts +40 -0
- package/dist/local/duckdb-query-detail.d.ts.map +1 -0
- package/dist/local/duckdb-query-detail.js +43 -0
- package/dist/local/duckdb-query-detail.js.map +1 -0
- package/dist/local/duckdb-query-effect.d.ts +42 -0
- package/dist/local/duckdb-query-effect.d.ts.map +1 -0
- package/dist/local/duckdb-query-effect.js +10 -0
- package/dist/local/duckdb-query-effect.js.map +1 -0
- package/dist/local/duckdb-query-error.d.ts +32 -0
- package/dist/local/duckdb-query-error.d.ts.map +1 -0
- package/dist/local/duckdb-query-error.js +35 -0
- package/dist/local/duckdb-query-error.js.map +1 -0
- package/dist/local/duckdb-query-filters.d.ts +9 -0
- package/dist/local/duckdb-query-filters.d.ts.map +1 -0
- package/dist/local/duckdb-query-filters.js +51 -0
- package/dist/local/duckdb-query-filters.js.map +1 -0
- package/dist/local/duckdb-query-list.d.ts +7 -0
- package/dist/local/duckdb-query-list.d.ts.map +1 -0
- package/dist/local/duckdb-query-list.js +26 -0
- package/dist/local/duckdb-query-list.js.map +1 -0
- package/dist/local/duckdb-query-plan.d.ts +8 -0
- package/dist/local/duckdb-query-plan.d.ts.map +1 -0
- package/dist/local/duckdb-query-plan.js +49 -0
- package/dist/local/duckdb-query-plan.js.map +1 -0
- package/dist/local/duckdb-query-rows.d.ts +8 -0
- package/dist/local/duckdb-query-rows.d.ts.map +1 -0
- package/dist/local/duckdb-query-rows.js +23 -0
- package/dist/local/duckdb-query-rows.js.map +1 -0
- package/dist/local/duckdb-query-rows.types.d.ts +8 -0
- package/dist/local/duckdb-query-rows.types.d.ts.map +1 -0
- package/dist/local/duckdb-query-rows.types.js +2 -0
- package/dist/local/duckdb-query-rows.types.js.map +1 -0
- package/dist/local/duckdb-query.d.ts +49 -0
- package/dist/local/duckdb-query.d.ts.map +1 -0
- package/dist/local/duckdb-query.js +29 -0
- package/dist/local/duckdb-query.js.map +1 -0
- package/dist/local/duckdb-retention.d.ts +6 -0
- package/dist/local/duckdb-retention.d.ts.map +1 -0
- package/dist/local/duckdb-retention.js +22 -0
- package/dist/local/duckdb-retention.js.map +1 -0
- package/dist/local/duckdb-schema.d.ts +17 -0
- package/dist/local/duckdb-schema.d.ts.map +1 -0
- package/dist/local/duckdb-schema.js +39 -0
- package/dist/local/duckdb-schema.js.map +1 -0
- package/dist/local/duckdb-sql.d.ts +35 -0
- package/dist/local/duckdb-sql.d.ts.map +1 -0
- package/dist/local/duckdb-sql.js +35 -0
- package/dist/local/duckdb-sql.js.map +1 -0
- package/dist/local/duckdb-storage-state.types.d.ts +12 -0
- package/dist/local/duckdb-storage-state.types.d.ts.map +1 -0
- package/dist/local/duckdb-storage-state.types.js +2 -0
- package/dist/local/duckdb-storage-state.types.js.map +1 -0
- package/dist/local/duckdb-storage.d.ts +8 -0
- package/dist/local/duckdb-storage.d.ts.map +1 -0
- package/dist/local/duckdb-storage.js +33 -0
- package/dist/local/duckdb-storage.js.map +1 -0
- package/dist/local/duckdb-storage.types.d.ts +44 -0
- package/dist/local/duckdb-storage.types.d.ts.map +1 -0
- package/dist/local/duckdb-storage.types.js +2 -0
- package/dist/local/duckdb-storage.types.js.map +1 -0
- package/dist/local/duckdb-transaction.d.ts +7 -0
- package/dist/local/duckdb-transaction.d.ts.map +1 -0
- package/dist/local/duckdb-transaction.js +25 -0
- package/dist/local/duckdb-transaction.js.map +1 -0
- package/dist/local/duckdb-worker-database.d.ts +25 -0
- package/dist/local/duckdb-worker-database.d.ts.map +1 -0
- package/dist/local/duckdb-worker-database.js +53 -0
- package/dist/local/duckdb-worker-database.js.map +1 -0
- package/dist/local/duckdb-worker-effect.d.ts +26 -0
- package/dist/local/duckdb-worker-effect.d.ts.map +1 -0
- package/dist/local/duckdb-worker-effect.js +29 -0
- package/dist/local/duckdb-worker-effect.js.map +1 -0
- package/dist/local/duckdb-worker-ipc.d.ts +7 -0
- package/dist/local/duckdb-worker-ipc.d.ts.map +1 -0
- package/dist/local/duckdb-worker-ipc.js +40 -0
- package/dist/local/duckdb-worker-ipc.js.map +1 -0
- package/dist/local/duckdb-worker-maintenance.d.ts +7 -0
- package/dist/local/duckdb-worker-maintenance.d.ts.map +1 -0
- package/dist/local/duckdb-worker-maintenance.js +25 -0
- package/dist/local/duckdb-worker-maintenance.js.map +1 -0
- package/dist/local/duckdb-worker-process.d.ts +5 -0
- package/dist/local/duckdb-worker-process.d.ts.map +1 -0
- package/dist/local/duckdb-worker-process.js +19 -0
- package/dist/local/duckdb-worker-process.js.map +1 -0
- package/dist/local/duckdb-worker-process.types.d.ts +21 -0
- package/dist/local/duckdb-worker-process.types.d.ts.map +1 -0
- package/dist/local/duckdb-worker-process.types.js +2 -0
- package/dist/local/duckdb-worker-process.types.js.map +1 -0
- package/dist/local/duckdb-worker-signals.d.ts +5 -0
- package/dist/local/duckdb-worker-signals.d.ts.map +1 -0
- package/dist/local/duckdb-worker-signals.js +22 -0
- package/dist/local/duckdb-worker-signals.js.map +1 -0
- package/dist/local/duckdb-worker-state.types.d.ts +12 -0
- package/dist/local/duckdb-worker-state.types.d.ts.map +1 -0
- package/dist/local/duckdb-worker-state.types.js +2 -0
- package/dist/local/duckdb-worker-state.types.js.map +1 -0
- package/dist/local/duckdb-worker.d.ts +2 -0
- package/dist/local/duckdb-worker.d.ts.map +1 -0
- package/dist/local/duckdb-worker.js +18 -0
- package/dist/local/duckdb-worker.js.map +1 -0
- package/dist/local/duckdb-worker.types.d.ts +38 -0
- package/dist/local/duckdb-worker.types.d.ts.map +1 -0
- package/dist/local/duckdb-worker.types.js +2 -0
- package/dist/local/duckdb-worker.types.js.map +1 -0
- package/dist/local/import-history-effect.d.ts +9 -0
- package/dist/local/import-history-effect.d.ts.map +1 -0
- package/dist/local/import-history-effect.js +32 -0
- package/dist/local/import-history-effect.js.map +1 -0
- package/dist/local/import-history-files.d.ts +5 -0
- package/dist/local/import-history-files.d.ts.map +1 -0
- package/dist/local/import-history-files.js +37 -0
- package/dist/local/import-history-files.js.map +1 -0
- package/dist/local/import-history-line.d.ts +6 -0
- package/dist/local/import-history-line.d.ts.map +1 -0
- package/dist/local/import-history-line.js +51 -0
- package/dist/local/import-history-line.js.map +1 -0
- package/dist/local/import-history-lines.d.ts +8 -0
- package/dist/local/import-history-lines.d.ts.map +1 -0
- package/dist/local/import-history-lines.js +27 -0
- package/dist/local/import-history-lines.js.map +1 -0
- package/dist/local/import-history-lines.types.d.ts +11 -0
- package/dist/local/import-history-lines.types.d.ts.map +1 -0
- package/dist/local/import-history-lines.types.js +2 -0
- package/dist/local/import-history-lines.types.js.map +1 -0
- package/dist/local/import-history.d.ts +18 -0
- package/dist/local/import-history.d.ts.map +1 -0
- package/dist/local/import-history.js +26 -0
- package/dist/local/import-history.js.map +1 -0
- package/dist/local/import-history.types.d.ts +28 -0
- package/dist/local/import-history.types.d.ts.map +1 -0
- package/dist/local/import-history.types.js +2 -0
- package/dist/local/import-history.types.js.map +1 -0
- package/dist/local/worker-client-effect.d.ts +9 -0
- package/dist/local/worker-client-effect.d.ts.map +1 -0
- package/dist/local/worker-client-effect.js +54 -0
- package/dist/local/worker-client-effect.js.map +1 -0
- package/dist/local/worker-client-send.d.ts +13 -0
- package/dist/local/worker-client-send.d.ts.map +1 -0
- package/dist/local/worker-client-send.js +82 -0
- package/dist/local/worker-client-send.js.map +1 -0
- package/dist/local/worker-client-service.d.ts +33 -0
- package/dist/local/worker-client-service.d.ts.map +1 -0
- package/dist/local/worker-client-service.js +31 -0
- package/dist/local/worker-client-service.js.map +1 -0
- package/dist/local/worker-client-state.d.ts +9 -0
- package/dist/local/worker-client-state.d.ts.map +1 -0
- package/dist/local/worker-client-state.js +96 -0
- package/dist/local/worker-client-state.js.map +1 -0
- package/dist/local/worker-client-state.types.d.ts +24 -0
- package/dist/local/worker-client-state.types.d.ts.map +1 -0
- package/dist/local/worker-client-state.types.js +2 -0
- package/dist/local/worker-client-state.types.js.map +1 -0
- package/dist/local/worker-client.d.ts +21 -0
- package/dist/local/worker-client.d.ts.map +1 -0
- package/dist/local/worker-client.js +35 -0
- package/dist/local/worker-client.js.map +1 -0
- package/dist/local/worker.d.ts +15 -0
- package/dist/local/worker.d.ts.map +1 -0
- package/dist/local/worker.js +12 -0
- package/dist/local/worker.js.map +1 -0
- package/package.json +54 -4
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/** Composes serialized append, retention configuration and checkpoint operations for one native history owner. */
|
|
2
|
+
import { Effect } from "effect";
|
|
3
|
+
import { appendDuckdbRecords } from "./duckdb-transaction.js";
|
|
4
|
+
import { retainDuckdbRecords } from "./duckdb-retention.js";
|
|
5
|
+
import { runDuckdbSql } from "./duckdb-sql.js";
|
|
6
|
+
import { observeDuckdb } from "./duckdb-metrics.js";
|
|
7
|
+
/** @param connection - Scoped native connection. @param permit - Shared database serialization. @param configured - Retention policy. @param initialRedaction - Admission policy. @returns Native store capabilities. */
|
|
8
|
+
export function makeDuckdbStorage(connection, permit, configured, initialRedaction) {
|
|
9
|
+
const state = {
|
|
10
|
+
connection,
|
|
11
|
+
permit,
|
|
12
|
+
retention: configured,
|
|
13
|
+
redaction: initialRedaction,
|
|
14
|
+
};
|
|
15
|
+
return {
|
|
16
|
+
append: (records) => appendDuckdbRecords(state, records),
|
|
17
|
+
configure: Effect.fn("ObservabilityDuckdb.configure")(function* (value, nextRedaction) {
|
|
18
|
+
yield* observeDuckdb("configure", permit.withPermit(Effect.gen(function* () {
|
|
19
|
+
state.retention = value;
|
|
20
|
+
state.redaction = nextRedaction;
|
|
21
|
+
yield* retainDuckdbRecords(state);
|
|
22
|
+
yield* runDuckdbSql(connection, "checkpoint", "CHECKPOINT");
|
|
23
|
+
})));
|
|
24
|
+
}),
|
|
25
|
+
flush: Effect.fn("ObservabilityDuckdb.flush")(function* () {
|
|
26
|
+
yield* observeDuckdb("flush", permit.withPermit(Effect.gen(function* () {
|
|
27
|
+
yield* retainDuckdbRecords(state);
|
|
28
|
+
yield* runDuckdbSql(connection, "checkpoint", "CHECKPOINT");
|
|
29
|
+
})));
|
|
30
|
+
}),
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=duckdb-storage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"duckdb-storage.js","sourceRoot":"","sources":["../../src/local/duckdb-storage.ts"],"names":[],"mappings":"AAAA,kHAAkH;AAClH,OAAO,EAAE,MAAM,EAAkB,MAAM,QAAQ,CAAC;AAKhD,OAAO,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAC9D,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,yNAAyN;AACzN,MAAM,UAAU,iBAAiB,CAC/B,UAAgC,EAChC,MAA2B,EAC3B,UAAyC,EACzC,gBAAkC;IAElC,MAAM,KAAK,GAAuB;QAChC,UAAU;QACV,MAAM;QACN,SAAS,EAAE,UAAU;QACrB,SAAS,EAAE,gBAAgB;KAC5B,CAAC;IACF,OAAO;QACL,MAAM,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,mBAAmB,CAAC,KAAK,EAAE,OAAO,CAAC;QACxD,SAAS,EAAE,MAAM,CAAC,EAAE,CAAC,+BAA+B,CAAC,CAAC,QAAQ,CAAC,EAC7D,KAAoC,EACpC,aAA+B;YAE/B,KAAK,CAAC,CAAC,aAAa,CAClB,WAAW,EACX,MAAM,CAAC,UAAU,CACf,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;gBAClB,KAAK,CAAC,SAAS,GAAG,KAAK,CAAC;gBACxB,KAAK,CAAC,SAAS,GAAG,aAAa,CAAC;gBAChC,KAAK,CAAC,CAAC,mBAAmB,CAAC,KAAK,CAAC,CAAC;gBAClC,KAAK,CAAC,CAAC,YAAY,CAAC,UAAU,EAAE,YAAY,EAAE,YAAY,CAAC,CAAC;YAC9D,CAAC,CAAC,CACH,CACF,CAAC;QACJ,CAAC,CAAC;QACF,KAAK,EAAE,MAAM,CAAC,EAAE,CAAC,2BAA2B,CAAC,CAAC,QAAQ,CAAC;YACrD,KAAK,CAAC,CAAC,aAAa,CAClB,OAAO,EACP,MAAM,CAAC,UAAU,CACf,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;gBAClB,KAAK,CAAC,CAAC,mBAAmB,CAAC,KAAK,CAAC,CAAC;gBAClC,KAAK,CAAC,CAAC,YAAY,CAAC,UAAU,EAAE,YAAY,EAAE,YAAY,CAAC,CAAC;YAC9D,CAAC,CAAC,CACH,CACF,CAAC;QACJ,CAAC,CAAC;KACH,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Owns duckdb storage.types for the optional local history store.
|
|
3
|
+
* Shared records and query contracts come from lightweight observability; native
|
|
4
|
+
* handles and worker lifetimes remain owned by this storage package.
|
|
5
|
+
*/
|
|
6
|
+
import type { Effect } from "effect";
|
|
7
|
+
import type { RedactionPolicy } from "@relkit/observability";
|
|
8
|
+
import type { TelemetryLocalRetentionPolicy } from "@relkit/observability";
|
|
9
|
+
import type { LocalRecord, StoredLocalRecord } from "@relkit/observability/local/record";
|
|
10
|
+
import type { DuckdbError } from "./duckdb-error.js";
|
|
11
|
+
/**
|
|
12
|
+
* Effect operations that persist and retain local telemetry.
|
|
13
|
+
* All methods serialize access to one native connection.
|
|
14
|
+
*
|
|
15
|
+
* @example
|
|
16
|
+
* const stored = yield* storage.append(records);
|
|
17
|
+
*/
|
|
18
|
+
export interface DuckdbStorageEffects {
|
|
19
|
+
/**
|
|
20
|
+
* Appends at most 256 idempotent records in one transaction.
|
|
21
|
+
* @param records - Valid local telemetry envelopes.
|
|
22
|
+
* @returns An Effect with committed records or a tagged DuckdbError.
|
|
23
|
+
* @example
|
|
24
|
+
* const stored = yield* storage.append(records);
|
|
25
|
+
*/
|
|
26
|
+
readonly append: (records: readonly LocalRecord[]) => Effect.Effect<StoredLocalRecord[], DuckdbError>;
|
|
27
|
+
/**
|
|
28
|
+
* Reconfigures retention and redaction, then checkpoints.
|
|
29
|
+
* @param retention - New retention limits.
|
|
30
|
+
* @param redaction - New admission policy.
|
|
31
|
+
* @returns An Effect completing after checkpoint or a DuckdbError.
|
|
32
|
+
* @example
|
|
33
|
+
* yield* storage.configure({ maxEntries: 100 });
|
|
34
|
+
*/
|
|
35
|
+
readonly configure: (retention: TelemetryLocalRetentionPolicy, redaction?: RedactionPolicy) => Effect.Effect<void, DuckdbError>;
|
|
36
|
+
/**
|
|
37
|
+
* Applies retention and checkpoints.
|
|
38
|
+
* @returns An Effect completing after the flush or a DuckdbError.
|
|
39
|
+
* @example
|
|
40
|
+
* yield* storage.flush();
|
|
41
|
+
*/
|
|
42
|
+
readonly flush: () => Effect.Effect<void, DuckdbError>;
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=duckdb-storage.types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"duckdb-storage.types.d.ts","sourceRoot":"","sources":["../../src/local/duckdb-storage.types.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AACrC,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAC7D,OAAO,KAAK,EAAE,6BAA6B,EAAE,MAAM,uBAAuB,CAAC;AAC3E,OAAO,KAAK,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,oCAAoC,CAAC;AACzF,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AACrD;;;;;;GAMG;AACH,MAAM,WAAW,oBAAoB;IACnC;;;;;;OAMG;IACH,QAAQ,CAAC,MAAM,EAAE,CACf,OAAO,EAAE,SAAS,WAAW,EAAE,KAC5B,MAAM,CAAC,MAAM,CAAC,iBAAiB,EAAE,EAAE,WAAW,CAAC,CAAC;IACrD;;;;;;;OAOG;IACH,QAAQ,CAAC,SAAS,EAAE,CAClB,SAAS,EAAE,6BAA6B,EACxC,SAAS,CAAC,EAAE,eAAe,KACxB,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;IACtC;;;;;OAKG;IACH,QAAQ,CAAC,KAAK,EAAE,MAAM,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;CACxD"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"duckdb-storage.types.js","sourceRoot":"","sources":["../../src/local/duckdb-storage.types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/** Commits one validated idempotent batch and retention atomically; failures retain rollback behavior. */
|
|
2
|
+
import { Effect } from "effect";
|
|
3
|
+
import type { LocalRecord, StoredLocalRecord } from "@relkit/observability/local/record";
|
|
4
|
+
import type { DuckdbStorageState } from "./duckdb-storage-state.types.js";
|
|
5
|
+
/** @param state - Serialized store owner. @param records - At most 256 envelopes. @returns Committed stored records or typed native failure. */
|
|
6
|
+
export declare const appendDuckdbRecords: (state: DuckdbStorageState, records: readonly LocalRecord[]) => Effect.Effect<StoredLocalRecord[], import("./duckdb-error.js").DuckdbError, never>;
|
|
7
|
+
//# sourceMappingURL=duckdb-transaction.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"duckdb-transaction.d.ts","sourceRoot":"","sources":["../../src/local/duckdb-transaction.ts"],"names":[],"mappings":"AAAA,0GAA0G;AAC1G,OAAO,EAAS,MAAM,EAAQ,MAAM,QAAQ,CAAC;AAC7C,OAAO,KAAK,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,oCAAoC,CAAC;AAMzF,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,iCAAiC,CAAC;AAC1E,gJAAgJ;AAChJ,eAAO,MAAM,mBAAmB,oJA4C9B,CAAC"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/** Commits one validated idempotent batch and retention atomically; failures retain rollback behavior. */
|
|
2
|
+
import { Clock, Effect, Exit } from "effect";
|
|
3
|
+
import { appendDuckdbBatchEffect } from "./duckdb-batch.js";
|
|
4
|
+
import { retainDuckdbRecords } from "./duckdb-retention.js";
|
|
5
|
+
import { runDuckdbSql } from "./duckdb-sql.js";
|
|
6
|
+
import { duckdbError } from "./duckdb-error.js";
|
|
7
|
+
import { observeDuckdb } from "./duckdb-metrics.js";
|
|
8
|
+
/** @param state - Serialized store owner. @param records - At most 256 envelopes. @returns Committed stored records or typed native failure. */
|
|
9
|
+
export const appendDuckdbRecords = Effect.fn("ObservabilityDuckdb.append")(function* (state, records) {
|
|
10
|
+
return yield* observeDuckdb("append", state.permit.withPermit(Effect.gen(function* () {
|
|
11
|
+
if (records.length > 256)
|
|
12
|
+
return yield* Effect.fail(duckdbError("append", new RangeError("Telemetry batches contain at most 256 records")));
|
|
13
|
+
let committed = [];
|
|
14
|
+
const receivedAt = yield* Clock.currentTimeMillis;
|
|
15
|
+
yield* Effect.acquireUseRelease(runDuckdbSql(state.connection, "begin", "BEGIN TRANSACTION"), () => Effect.gen(function* () {
|
|
16
|
+
committed = yield* appendDuckdbBatchEffect(state.connection, records, receivedAt, state.redaction);
|
|
17
|
+
yield* retainDuckdbRecords(state);
|
|
18
|
+
return committed;
|
|
19
|
+
}), (_begin, exit) => Exit.isSuccess(exit)
|
|
20
|
+
? runDuckdbSql(state.connection, "commit", "COMMIT").pipe(Effect.catchTag("DuckdbError", (failure) => runDuckdbSql(state.connection, "rollback", "ROLLBACK").pipe(Effect.ignore, Effect.flatMap(() => Effect.fail(failure)))), Effect.asVoid)
|
|
21
|
+
: runDuckdbSql(state.connection, "rollback", "ROLLBACK").pipe(Effect.ignore));
|
|
22
|
+
return committed;
|
|
23
|
+
})));
|
|
24
|
+
});
|
|
25
|
+
//# sourceMappingURL=duckdb-transaction.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"duckdb-transaction.js","sourceRoot":"","sources":["../../src/local/duckdb-transaction.ts"],"names":[],"mappings":"AAAA,0GAA0G;AAC1G,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAE7C,OAAO,EAAE,uBAAuB,EAAE,MAAM,mBAAmB,CAAC;AAC5D,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEpD,gJAAgJ;AAChJ,MAAM,CAAC,MAAM,mBAAmB,GAAG,MAAM,CAAC,EAAE,CAAC,4BAA4B,CAAC,CAAC,QAAQ,CAAC,EAClF,KAAyB,EACzB,OAA+B;IAE/B,OAAO,KAAK,CAAC,CAAC,aAAa,CACzB,QAAQ,EACR,KAAK,CAAC,MAAM,CAAC,UAAU,CACrB,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;QAClB,IAAI,OAAO,CAAC,MAAM,GAAG,GAAG;YACtB,OAAO,KAAK,CAAC,CAAC,MAAM,CAAC,IAAI,CACvB,WAAW,CAAC,QAAQ,EAAE,IAAI,UAAU,CAAC,+CAA+C,CAAC,CAAC,CACvF,CAAC;QACJ,IAAI,SAAS,GAAwB,EAAE,CAAC;QACxC,MAAM,UAAU,GAAG,KAAK,CAAC,CAAC,KAAK,CAAC,iBAAiB,CAAC;QAClD,KAAK,CAAC,CAAC,MAAM,CAAC,iBAAiB,CAC7B,YAAY,CAAC,KAAK,CAAC,UAAU,EAAE,OAAO,EAAE,mBAAmB,CAAC,EAC5D,GAAG,EAAE,CACH,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;YAClB,SAAS,GAAG,KAAK,CAAC,CAAC,uBAAuB,CACxC,KAAK,CAAC,UAAU,EAChB,OAAO,EACP,UAAU,EACV,KAAK,CAAC,SAAS,CAChB,CAAC;YACF,KAAK,CAAC,CAAC,mBAAmB,CAAC,KAAK,CAAC,CAAC;YAClC,OAAO,SAAS,CAAC;QACnB,CAAC,CAAC,EACJ,CAAC,MAAM,EAAE,IAAI,EAAE,EAAE,CACf,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;YAClB,CAAC,CAAC,YAAY,CAAC,KAAK,CAAC,UAAU,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC,IAAI,CACrD,MAAM,CAAC,QAAQ,CAAC,aAAa,EAAE,CAAC,OAAO,EAAE,EAAE,CACzC,YAAY,CAAC,KAAK,CAAC,UAAU,EAAE,UAAU,EAAE,UAAU,CAAC,CAAC,IAAI,CACzD,MAAM,CAAC,MAAM,EACb,MAAM,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAC3C,CACF,EACD,MAAM,CAAC,MAAM,CACd;YACH,CAAC,CAAC,YAAY,CAAC,KAAK,CAAC,UAAU,EAAE,UAAU,EAAE,UAAU,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CACjF,CAAC;QACF,OAAO,SAAS,CAAC;IACnB,CAAC,CAAC,CACH,CACF,CAAC;AACJ,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Transfers a database's native handles to the worker's explicit owning scope.
|
|
3
|
+
* Acquisition failure closes partial handles; retirement flushes before release.
|
|
4
|
+
*/
|
|
5
|
+
import { Effect } from "effect";
|
|
6
|
+
import type { LocalWorkerCommand } from "@relkit/observability/local/record";
|
|
7
|
+
import type { DuckdbWorkerState } from "./duckdb-worker-state.types.js";
|
|
8
|
+
/** @param state - Worker-owned database authority. @returns Completion after flush and native scope release. */
|
|
9
|
+
export declare const closeDuckdbWorkerDatabase: (state: DuckdbWorkerState) => Effect.Effect<void, import("./duckdb-error.js").DuckdbError, never>;
|
|
10
|
+
/** @param state - Worker-owned database authority. @param command - Open request with the unchanged history root. @returns Existing-history import summary after scoped acquisition. */
|
|
11
|
+
export declare const openDuckdbWorkerDatabase: (state: DuckdbWorkerState, command: {
|
|
12
|
+
readonly type: "open";
|
|
13
|
+
readonly root: string;
|
|
14
|
+
readonly retention?: import("@relkit/observability").TelemetryLocalRetentionPolicy;
|
|
15
|
+
readonly redaction?: import("@relkit/observability").RedactionPolicy;
|
|
16
|
+
}) => Effect.Effect<{
|
|
17
|
+
records: number;
|
|
18
|
+
malformed: number;
|
|
19
|
+
}, import("./duckdb-error.js").DuckdbError, never>;
|
|
20
|
+
/** @param state - Worker-owned authority. @param command - Serialized wire operation. @returns Database operation result or typed state failure. */
|
|
21
|
+
export declare const executeDuckdbWorkerCommand: (state: DuckdbWorkerState, command: LocalWorkerCommand) => Effect.Effect<void | import("@relkit/observability/local/record").StoredLocalRecord[] | import("@relkit/observability").ObservabilityQueryPage<import("@relkit/observability/local/record").StoredLocalRecord> | {
|
|
22
|
+
records: number;
|
|
23
|
+
malformed: number;
|
|
24
|
+
}, import("./duckdb-error.js").DuckdbError | import("./duckdb-query-error.js").DuckdbQueryError, never>;
|
|
25
|
+
//# sourceMappingURL=duckdb-worker-database.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"duckdb-worker-database.d.ts","sourceRoot":"","sources":["../../src/local/duckdb-worker-database.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,MAAM,EAAe,MAAM,QAAQ,CAAC;AAC7C,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,oCAAoC,CAAC;AAI7E,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,gCAAgC,CAAC;AAExE,gHAAgH;AAChH,eAAO,MAAM,yBAAyB,mGASrC,CAAC;AAEF,wLAAwL;AACxL,eAAO,MAAM,wBAAwB;;;;;;;;kDA2BpC,CAAC;AAEF,oJAAoJ;AACpJ,eAAO,MAAM,0BAA0B;;;uGAuBtC,CAAC"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Transfers a database's native handles to the worker's explicit owning scope.
|
|
3
|
+
* Acquisition failure closes partial handles; retirement flushes before release.
|
|
4
|
+
*/
|
|
5
|
+
import { Effect, Exit, Scope } from "effect";
|
|
6
|
+
import { openDuckdbDatabaseEffect } from "./duckdb-database-effect.js";
|
|
7
|
+
import { DuckdbDriverService } from "./duckdb-driver.js";
|
|
8
|
+
import { duckdbError } from "./duckdb-error.js";
|
|
9
|
+
/** @param state - Worker-owned database authority. @returns Completion after flush and native scope release. */
|
|
10
|
+
export const closeDuckdbWorkerDatabase = Effect.fn("ObservabilityDuckdb.worker.closeDatabase")(function* (state) {
|
|
11
|
+
const current = state.database;
|
|
12
|
+
const scope = state.databaseScope;
|
|
13
|
+
state.database = undefined;
|
|
14
|
+
state.databaseScope = undefined;
|
|
15
|
+
if (current === undefined || scope === undefined)
|
|
16
|
+
return;
|
|
17
|
+
yield* current.flush().pipe(Effect.ensuring(Scope.close(scope, Exit.void)));
|
|
18
|
+
});
|
|
19
|
+
/** @param state - Worker-owned database authority. @param command - Open request with the unchanged history root. @returns Existing-history import summary after scoped acquisition. */
|
|
20
|
+
export const openDuckdbWorkerDatabase = Effect.fn("ObservabilityDuckdb.worker.openDatabase")(function* (state, command) {
|
|
21
|
+
if (state.database !== undefined)
|
|
22
|
+
return yield* Effect.fail(duckdbError("open", new Error("Telemetry database is already open")));
|
|
23
|
+
return yield* Effect.uninterruptible(Effect.gen(function* () {
|
|
24
|
+
const scope = yield* Scope.make();
|
|
25
|
+
const acquired = yield* openDuckdbDatabaseEffect(command.root, command.retention, command.redaction).pipe(Scope.provide(scope), Effect.provideService(DuckdbDriverService, state.driver), Effect.onExit((exit) => (Exit.isSuccess(exit) ? Effect.void : Scope.close(scope, exit))));
|
|
26
|
+
state.database = acquired;
|
|
27
|
+
state.databaseScope = scope;
|
|
28
|
+
return acquired.imported;
|
|
29
|
+
}));
|
|
30
|
+
});
|
|
31
|
+
/** @param state - Worker-owned authority. @param command - Serialized wire operation. @returns Database operation result or typed state failure. */
|
|
32
|
+
export const executeDuckdbWorkerCommand = Effect.fn("ObservabilityDuckdb.worker.command")(function* (state, command) {
|
|
33
|
+
if (command.type === "open")
|
|
34
|
+
return yield* openDuckdbWorkerDatabase(state, command);
|
|
35
|
+
const database = state.database;
|
|
36
|
+
if (database === undefined)
|
|
37
|
+
return yield* Effect.fail(duckdbError("command", new Error("Telemetry database is not open")));
|
|
38
|
+
switch (command.type) {
|
|
39
|
+
case "append":
|
|
40
|
+
return yield* database.append(command.records);
|
|
41
|
+
case "query":
|
|
42
|
+
return yield* database.list(command.kind, command.query);
|
|
43
|
+
case "detail":
|
|
44
|
+
return yield* database.detail(command.kind, command.id);
|
|
45
|
+
case "retention":
|
|
46
|
+
return yield* database.configure(command.retention, command.redaction);
|
|
47
|
+
case "flush":
|
|
48
|
+
return yield* database.flush();
|
|
49
|
+
case "close":
|
|
50
|
+
return yield* closeDuckdbWorkerDatabase(state);
|
|
51
|
+
}
|
|
52
|
+
});
|
|
53
|
+
//# sourceMappingURL=duckdb-worker-database.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"duckdb-worker-database.js","sourceRoot":"","sources":["../../src/local/duckdb-worker-database.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Composes serialized storage commands behind an injectable worker service.
|
|
3
|
+
* Its scope owns the explicit database scope until close, failure or interruption.
|
|
4
|
+
*/
|
|
5
|
+
import { Context, Effect, Layer } from "effect";
|
|
6
|
+
import { DuckdbDriverService } from "./duckdb-driver.js";
|
|
7
|
+
import type { DuckdbWorkerEffects } from "./duckdb-worker.types.js";
|
|
8
|
+
import type { LocalWorkerCommand } from "@relkit/observability/local/record";
|
|
9
|
+
declare const DuckdbWorkerService_base: Context.ServiceClass<DuckdbWorkerService, "@relkit/observability/DuckdbWorker", DuckdbWorkerEffects> & {
|
|
10
|
+
readonly make: () => Effect.Effect<DuckdbWorkerEffects, never, DuckdbDriverService>;
|
|
11
|
+
};
|
|
12
|
+
/** Injectable command executor whose owner must close its database. */
|
|
13
|
+
export declare class DuckdbWorkerService extends DuckdbWorkerService_base {
|
|
14
|
+
}
|
|
15
|
+
/** @returns Lazy command service requiring the explicit native driver. */
|
|
16
|
+
export declare const makeDuckdbWorkerEffect: () => Effect.Effect<{
|
|
17
|
+
execute: (command: LocalWorkerCommand) => Effect.Effect<void | import("@relkit/observability/local/record").StoredLocalRecord[] | import("@relkit/observability").ObservabilityQueryPage<import("@relkit/observability/local/record").StoredLocalRecord> | {
|
|
18
|
+
records: number;
|
|
19
|
+
malformed: number;
|
|
20
|
+
}, import("./duckdb-error.js").DuckdbError | import("./duckdb-query-error.js").DuckdbQueryError, never>;
|
|
21
|
+
close: () => Effect.Effect<void, import("./duckdb-error.js").DuckdbError, never>;
|
|
22
|
+
}, never, DuckdbDriverService>;
|
|
23
|
+
/** Owns the command service and releases native state on every scope exit. */
|
|
24
|
+
export declare const duckdbWorkerLayer: Layer.Layer<DuckdbWorkerService, never, DuckdbDriverService>;
|
|
25
|
+
export {};
|
|
26
|
+
//# sourceMappingURL=duckdb-worker-effect.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"duckdb-worker-effect.d.ts","sourceRoot":"","sources":["../../src/local/duckdb-worker-effect.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAa,MAAM,QAAQ,CAAC;AAC3D,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAGzD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAEpE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,oCAAoC,CAAC;;;;AAE7E,uEAAuE;AACvE,qBAAa,mBAAoB,SAAQ,wBAG0C;CAAG;AAEtF,0EAA0E;AAC1E,eAAO,MAAM,sBAAsB;;;;;;8BAoBjC,CAAC;AAEH,8EAA8E;AAC9E,eAAO,MAAM,iBAAiB,8DAG7B,CAAC"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Composes serialized storage commands behind an injectable worker service.
|
|
3
|
+
* Its scope owns the explicit database scope until close, failure or interruption.
|
|
4
|
+
*/
|
|
5
|
+
import { Context, Effect, Layer, Semaphore } from "effect";
|
|
6
|
+
import { DuckdbDriverService } from "./duckdb-driver.js";
|
|
7
|
+
import { observeDuckdb } from "./duckdb-metrics.js";
|
|
8
|
+
import { closeDuckdbWorkerDatabase, executeDuckdbWorkerCommand } from "./duckdb-worker-database.js";
|
|
9
|
+
/** Injectable command executor whose owner must close its database. */
|
|
10
|
+
export class DuckdbWorkerService extends Context.Service()("@relkit/observability/DuckdbWorker", { make: () => makeDuckdbWorkerEffect() }) {
|
|
11
|
+
}
|
|
12
|
+
/** @returns Lazy command service requiring the explicit native driver. */
|
|
13
|
+
export const makeDuckdbWorkerEffect = Effect.fn("ObservabilityDuckdb.worker.create")(function* () {
|
|
14
|
+
const driver = yield* DuckdbDriverService;
|
|
15
|
+
const permit = yield* Semaphore.make(1);
|
|
16
|
+
const state = {
|
|
17
|
+
driver,
|
|
18
|
+
permit,
|
|
19
|
+
database: undefined,
|
|
20
|
+
databaseScope: undefined,
|
|
21
|
+
};
|
|
22
|
+
return {
|
|
23
|
+
execute: Effect.fn("ObservabilityDuckdb.worker.execute")((command) => observeDuckdb("worker-command", permit.withPermit(executeDuckdbWorkerCommand(state, command)))),
|
|
24
|
+
close: Effect.fn("ObservabilityDuckdb.worker.close")(() => permit.withPermit(closeDuckdbWorkerDatabase(state))),
|
|
25
|
+
};
|
|
26
|
+
});
|
|
27
|
+
/** Owns the command service and releases native state on every scope exit. */
|
|
28
|
+
export const duckdbWorkerLayer = Layer.effect(DuckdbWorkerService, Effect.acquireRelease(DuckdbWorkerService.make(), (worker) => Effect.ignore(worker.close())));
|
|
29
|
+
//# sourceMappingURL=duckdb-worker-effect.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"duckdb-worker-effect.js","sourceRoot":"","sources":["../../src/local/duckdb-worker-effect.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AAC3D,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,yBAAyB,EAAE,0BAA0B,EAAE,MAAM,6BAA6B,CAAC;AAKpG,uEAAuE;AACvE,MAAM,OAAO,mBAAoB,SAAQ,OAAO,CAAC,OAAO,EAGrD,CAAC,oCAAoC,EAAE,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,sBAAsB,EAAE,EAAE,CAAC;CAAG;AAEtF,0EAA0E;AAC1E,MAAM,CAAC,MAAM,sBAAsB,GAAG,MAAM,CAAC,EAAE,CAAC,mCAAmC,CAAC,CAAC,QAAQ,CAAC;IAC5F,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,mBAAmB,CAAC;IAC1C,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACxC,MAAM,KAAK,GAAsB;QAC/B,MAAM;QACN,MAAM;QACN,QAAQ,EAAE,SAAS;QACnB,aAAa,EAAE,SAAS;KACzB,CAAC;IACF,OAAO;QACL,OAAO,EAAE,MAAM,CAAC,EAAE,CAAC,oCAAoC,CAAC,CAAC,CAAC,OAA2B,EAAE,EAAE,CACvF,aAAa,CACX,gBAAgB,EAChB,MAAM,CAAC,UAAU,CAAC,0BAA0B,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC,CAC9D,CACF;QACD,KAAK,EAAE,MAAM,CAAC,EAAE,CAAC,kCAAkC,CAAC,CAAC,GAAG,EAAE,CACxD,MAAM,CAAC,UAAU,CAAC,yBAAyB,CAAC,KAAK,CAAC,CAAC,CACpD;KAC4B,CAAC;AAClC,CAAC,CAAC,CAAC;AAEH,8EAA8E;AAC9E,MAAM,CAAC,MAAM,iBAAiB,GAAG,KAAK,CAAC,MAAM,CAC3C,mBAAmB,EACnB,MAAM,CAAC,cAAc,CAAC,mBAAmB,CAAC,IAAI,EAAE,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAC7F,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/** Registers the existing worker command/reply channel within the process owner's Effect scope. */
|
|
2
|
+
import { Effect } from "effect";
|
|
3
|
+
import type { DuckdbWorkerEffects } from "./duckdb-worker.types.js";
|
|
4
|
+
import type { DuckdbProcessState } from "./duckdb-worker-process.types.js";
|
|
5
|
+
/** @param worker - Serialized database executor. @param state - Process maintenance state. @returns Scoped IPC listener registration. */
|
|
6
|
+
export declare const installDuckdbWorkerIpc: (worker: DuckdbWorkerEffects, state: DuckdbProcessState) => Effect.Effect<void, never, import("effect/Scope").Scope>;
|
|
7
|
+
//# sourceMappingURL=duckdb-worker-ipc.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"duckdb-worker-ipc.d.ts","sourceRoot":"","sources":["../../src/local/duckdb-worker-ipc.ts"],"names":[],"mappings":"AAAA,mGAAmG;AACnG,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAEhC,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AACpE,OAAO,KAAK,EAAuB,kBAAkB,EAAE,MAAM,kCAAkC,CAAC;AAChG,yIAAyI;AACzI,eAAO,MAAM,sBAAsB,sHAwCjC,CAAC"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/** Registers the existing worker command/reply channel within the process owner's Effect scope. */
|
|
2
|
+
import { Effect } from "effect";
|
|
3
|
+
import { DuckdbQueryError } from "./duckdb-query-error.js";
|
|
4
|
+
/** @param worker - Serialized database executor. @param state - Process maintenance state. @returns Scoped IPC listener registration. */
|
|
5
|
+
export const installDuckdbWorkerIpc = Effect.fn("ObservabilityDuckdb.worker.ipc")(function* (worker, state) {
|
|
6
|
+
const message = (envelope) => {
|
|
7
|
+
void Effect.runPromise(worker.execute(envelope.command))
|
|
8
|
+
.then((value) => {
|
|
9
|
+
if (envelope.command.type === "open")
|
|
10
|
+
state.opened = true;
|
|
11
|
+
if (envelope.command.type === "close")
|
|
12
|
+
state.opened = false;
|
|
13
|
+
process.send?.({ id: envelope.id, value });
|
|
14
|
+
if (envelope.command.type === "close")
|
|
15
|
+
process.disconnect?.();
|
|
16
|
+
}, (error) => {
|
|
17
|
+
process.send?.({
|
|
18
|
+
id: envelope.id,
|
|
19
|
+
error: error instanceof Error ? error.message : String(error),
|
|
20
|
+
...(error instanceof DuckdbQueryError ? { code: error.code } : {}),
|
|
21
|
+
});
|
|
22
|
+
})
|
|
23
|
+
.catch(() => {
|
|
24
|
+
process.exitCode = 1;
|
|
25
|
+
try {
|
|
26
|
+
process.disconnect?.();
|
|
27
|
+
}
|
|
28
|
+
catch {
|
|
29
|
+
/* The IPC channel may already be gone. */
|
|
30
|
+
}
|
|
31
|
+
});
|
|
32
|
+
};
|
|
33
|
+
yield* Effect.acquireRelease(Effect.sync(() => {
|
|
34
|
+
process.on("message", message);
|
|
35
|
+
return message;
|
|
36
|
+
}), (owned) => Effect.sync(() => {
|
|
37
|
+
process.off("message", owned);
|
|
38
|
+
}));
|
|
39
|
+
});
|
|
40
|
+
//# sourceMappingURL=duckdb-worker-ipc.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"duckdb-worker-ipc.js","sourceRoot":"","sources":["../../src/local/duckdb-worker-ipc.ts"],"names":[],"mappings":"AAAA,mGAAmG;AACnG,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAChC,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAG3D,yIAAyI;AACzI,MAAM,CAAC,MAAM,sBAAsB,GAAG,MAAM,CAAC,EAAE,CAAC,gCAAgC,CAAC,CAAC,QAAQ,CAAC,EACzF,MAA2B,EAC3B,KAAyB;IAEzB,MAAM,OAAO,GAAG,CAAC,QAA6B,EAAQ,EAAE;QACtD,KAAK,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;aACrD,IAAI,CACH,CAAC,KAAK,EAAE,EAAE;YACR,IAAI,QAAQ,CAAC,OAAO,CAAC,IAAI,KAAK,MAAM;gBAAE,KAAK,CAAC,MAAM,GAAG,IAAI,CAAC;YAC1D,IAAI,QAAQ,CAAC,OAAO,CAAC,IAAI,KAAK,OAAO;gBAAE,KAAK,CAAC,MAAM,GAAG,KAAK,CAAC;YAC5D,OAAO,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE,EAAE,QAAQ,CAAC,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;YAC3C,IAAI,QAAQ,CAAC,OAAO,CAAC,IAAI,KAAK,OAAO;gBAAE,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC;QAChE,CAAC,EACD,CAAC,KAAK,EAAE,EAAE;YACR,OAAO,CAAC,IAAI,EAAE,CAAC;gBACb,EAAE,EAAE,QAAQ,CAAC,EAAE;gBACf,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;gBAC7D,GAAG,CAAC,KAAK,YAAY,gBAAgB,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aACnE,CAAC,CAAC;QACL,CAAC,CACF;aACA,KAAK,CAAC,GAAG,EAAE;YACV,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;YACrB,IAAI,CAAC;gBACH,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC;YACzB,CAAC;YAAC,MAAM,CAAC;gBACP,0CAA0C;YAC5C,CAAC;QACH,CAAC,CAAC,CAAC;IACP,CAAC,CAAC;IACF,KAAK,CAAC,CAAC,MAAM,CAAC,cAAc,CAC1B,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE;QACf,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;QAC/B,OAAO,OAAO,CAAC;IACjB,CAAC,CAAC,EACF,CAAC,KAAK,EAAE,EAAE,CACR,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE;QACf,OAAO,CAAC,GAAG,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;IAChC,CAAC,CAAC,CACL,CAAC;AACJ,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/** Runs the existing minute retention checkpoint only while the process owns an open database. */
|
|
2
|
+
import { Effect } from "effect";
|
|
3
|
+
import type { DuckdbWorkerEffects } from "./duckdb-worker.types.js";
|
|
4
|
+
import type { DuckdbProcessState } from "./duckdb-worker-process.types.js";
|
|
5
|
+
/** @param worker - Serialized database authority. @param state - Open/close state shared with IPC. @returns Scoped maintenance timer ownership. */
|
|
6
|
+
export declare const installDuckdbWorkerMaintenance: (worker: DuckdbWorkerEffects, state: DuckdbProcessState) => Effect.Effect<void, never, import("effect/Scope").Scope>;
|
|
7
|
+
//# sourceMappingURL=duckdb-worker-maintenance.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"duckdb-worker-maintenance.d.ts","sourceRoot":"","sources":["../../src/local/duckdb-worker-maintenance.ts"],"names":[],"mappings":"AAAA,kGAAkG;AAClG,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAChC,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AACpE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,kCAAkC,CAAC;AAC3E,mJAAmJ;AACnJ,eAAO,MAAM,8BAA8B,sHAyB1C,CAAC"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/** Runs the existing minute retention checkpoint only while the process owns an open database. */
|
|
2
|
+
import { Effect } from "effect";
|
|
3
|
+
/** @param worker - Serialized database authority. @param state - Open/close state shared with IPC. @returns Scoped maintenance timer ownership. */
|
|
4
|
+
export const installDuckdbWorkerMaintenance = Effect.fn("ObservabilityDuckdb.worker.maintenance")(function* (worker, state) {
|
|
5
|
+
yield* Effect.acquireRelease(Effect.sync(() => {
|
|
6
|
+
const timer = setInterval(() => {
|
|
7
|
+
if (!state.opened)
|
|
8
|
+
return;
|
|
9
|
+
void Effect.runPromise(worker.execute({ type: "flush" })).catch((error) => {
|
|
10
|
+
process.send?.({
|
|
11
|
+
id: 0,
|
|
12
|
+
fatal: true,
|
|
13
|
+
error: `Telemetry cleanup failed: ${String(error)}`,
|
|
14
|
+
});
|
|
15
|
+
process.exitCode = 1;
|
|
16
|
+
process.disconnect?.();
|
|
17
|
+
});
|
|
18
|
+
}, 60_000);
|
|
19
|
+
timer.unref();
|
|
20
|
+
return timer;
|
|
21
|
+
}), (timer) => Effect.sync(() => {
|
|
22
|
+
clearInterval(timer);
|
|
23
|
+
}));
|
|
24
|
+
});
|
|
25
|
+
//# sourceMappingURL=duckdb-worker-maintenance.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"duckdb-worker-maintenance.js","sourceRoot":"","sources":["../../src/local/duckdb-worker-maintenance.ts"],"names":[],"mappings":"AAAA,kGAAkG;AAClG,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAGhC,mJAAmJ;AACnJ,MAAM,CAAC,MAAM,8BAA8B,GAAG,MAAM,CAAC,EAAE,CAAC,wCAAwC,CAAC,CAC/F,QAAQ,CAAC,EAAE,MAA2B,EAAE,KAAyB;IAC/D,KAAK,CAAC,CAAC,MAAM,CAAC,cAAc,CAC1B,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE;QACf,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,EAAE;YAC7B,IAAI,CAAC,KAAK,CAAC,MAAM;gBAAE,OAAO;YAC1B,KAAK,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;gBACxE,OAAO,CAAC,IAAI,EAAE,CAAC;oBACb,EAAE,EAAE,CAAC;oBACL,KAAK,EAAE,IAAI;oBACX,KAAK,EAAE,6BAA6B,MAAM,CAAC,KAAK,CAAC,EAAE;iBACpD,CAAC,CAAC;gBACH,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;gBACrB,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC;YACzB,CAAC,CAAC,CAAC;QACL,CAAC,EAAE,MAAM,CAAC,CAAC;QACX,KAAK,CAAC,KAAK,EAAE,CAAC;QACd,OAAO,KAAK,CAAC;IACf,CAAC,CAAC,EACF,CAAC,KAAK,EAAE,EAAE,CACR,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE;QACf,aAAa,CAAC,KAAK,CAAC,CAAC;IACvB,CAAC,CAAC,CACL,CAAC;AACJ,CAAC,CACF,CAAC"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
/** Owns native database commands, IPC, signals and maintenance until the physical worker process disconnects. */
|
|
2
|
+
import { Effect, type Scope } from "effect";
|
|
3
|
+
/** @param scope - Physical process owner. @returns Completion after all scoped resources are registered. */
|
|
4
|
+
export declare const startDuckdbWorkerProcessEffect: (scope: Scope.Closeable) => Effect.Effect<void, never, Scope.Scope>;
|
|
5
|
+
//# sourceMappingURL=duckdb-worker-process.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"duckdb-worker-process.d.ts","sourceRoot":"","sources":["../../src/local/duckdb-worker-process.ts"],"names":[],"mappings":"AAAA,iHAAiH;AACjH,OAAO,EAAE,MAAM,EAAE,KAAK,KAAK,EAAE,MAAM,QAAQ,CAAC;AAO5C,4GAA4G;AAC5G,eAAO,MAAM,8BAA8B,qEAgB1C,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/** Owns native database commands, IPC, signals and maintenance until the physical worker process disconnects. */
|
|
2
|
+
import { Effect } from "effect";
|
|
3
|
+
import { makeDuckdbWorkerEffect } from "./duckdb-worker-effect.js";
|
|
4
|
+
import { duckdbDriverLayer } from "./duckdb-driver.js";
|
|
5
|
+
import { observeDuckdb } from "./duckdb-metrics.js";
|
|
6
|
+
import { installDuckdbWorkerIpc } from "./duckdb-worker-ipc.js";
|
|
7
|
+
import { installDuckdbWorkerSignals } from "./duckdb-worker-signals.js";
|
|
8
|
+
import { installDuckdbWorkerMaintenance } from "./duckdb-worker-maintenance.js";
|
|
9
|
+
/** @param scope - Physical process owner. @returns Completion after all scoped resources are registered. */
|
|
10
|
+
export const startDuckdbWorkerProcessEffect = Effect.fn("ObservabilityDuckdb.worker.process")(function* (scope) {
|
|
11
|
+
return yield* observeDuckdb("worker-process", Effect.gen(function* () {
|
|
12
|
+
const worker = yield* Effect.acquireRelease(makeDuckdbWorkerEffect().pipe(Effect.provide(duckdbDriverLayer)), (owned) => Effect.ignore(owned.close()));
|
|
13
|
+
const state = { opened: false };
|
|
14
|
+
yield* installDuckdbWorkerIpc(worker, state);
|
|
15
|
+
yield* installDuckdbWorkerSignals(scope);
|
|
16
|
+
yield* installDuckdbWorkerMaintenance(worker, state);
|
|
17
|
+
}));
|
|
18
|
+
});
|
|
19
|
+
//# sourceMappingURL=duckdb-worker-process.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"duckdb-worker-process.js","sourceRoot":"","sources":["../../src/local/duckdb-worker-process.ts"],"names":[],"mappings":"AAAA,iHAAiH;AACjH,OAAO,EAAE,MAAM,EAAc,MAAM,QAAQ,CAAC;AAC5C,OAAO,EAAE,sBAAsB,EAAE,MAAM,2BAA2B,CAAC;AACnE,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAC;AAChE,OAAO,EAAE,0BAA0B,EAAE,MAAM,4BAA4B,CAAC;AACxE,OAAO,EAAE,8BAA8B,EAAE,MAAM,gCAAgC,CAAC;AAChF,4GAA4G;AAC5G,MAAM,CAAC,MAAM,8BAA8B,GAAG,MAAM,CAAC,EAAE,CAAC,oCAAoC,CAAC,CAC3F,QAAQ,CAAC,EAAE,KAAsB;IAC/B,OAAO,KAAK,CAAC,CAAC,aAAa,CACzB,gBAAgB,EAChB,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;QAClB,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,MAAM,CAAC,cAAc,CACzC,sBAAsB,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC,EAChE,CAAC,KAAK,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC,CACxC,CAAC;QACF,MAAM,KAAK,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;QAChC,KAAK,CAAC,CAAC,sBAAsB,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;QAC7C,KAAK,CAAC,CAAC,0BAA0B,CAAC,KAAK,CAAC,CAAC;QACzC,KAAK,CAAC,CAAC,8BAA8B,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;IACvD,CAAC,CAAC,CACH,CAAC;AACJ,CAAC,CACF,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Owns duckdb worker process.types for the optional local history store.
|
|
3
|
+
* Shared records and query contracts come from lightweight observability; native
|
|
4
|
+
* handles and worker lifetimes remain owned by this storage package.
|
|
5
|
+
*/
|
|
6
|
+
import type { LocalWorkerCommand } from "@relkit/observability/local/record";
|
|
7
|
+
/**
|
|
8
|
+
* IPC envelope received by the local DuckDB worker process.
|
|
9
|
+
*
|
|
10
|
+
* @example
|
|
11
|
+
* const message: DuckdbWorkerMessage = { id: 1, command: { type: "flush" } };
|
|
12
|
+
*/
|
|
13
|
+
export interface DuckdbWorkerMessage {
|
|
14
|
+
readonly id: number;
|
|
15
|
+
readonly command: LocalWorkerCommand;
|
|
16
|
+
}
|
|
17
|
+
/** Tracks whether maintenance may issue database commands in this process. */
|
|
18
|
+
export interface DuckdbProcessState {
|
|
19
|
+
opened: boolean;
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=duckdb-worker-process.types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"duckdb-worker-process.types.d.ts","sourceRoot":"","sources":["../../src/local/duckdb-worker-process.types.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,oCAAoC,CAAC;AAE7E;;;;;GAKG;AACH,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,OAAO,EAAE,kBAAkB,CAAC;CACtC;AAED,8EAA8E;AAC9E,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,OAAO,CAAC;CACjB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"duckdb-worker-process.types.js","sourceRoot":"","sources":["../../src/local/duckdb-worker-process.types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
/** Holds signal/disconnect listeners until the worker process scope finishes database finalization. */
|
|
2
|
+
import { Effect, Scope } from "effect";
|
|
3
|
+
/** @param scope - Physical process owner. @returns Scoped signal/disconnect registrations. */
|
|
4
|
+
export declare const installDuckdbWorkerSignals: (scope: Scope.Closeable) => Effect.Effect<void, never, Scope.Scope>;
|
|
5
|
+
//# sourceMappingURL=duckdb-worker-signals.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"duckdb-worker-signals.d.ts","sourceRoot":"","sources":["../../src/local/duckdb-worker-signals.ts"],"names":[],"mappings":"AAAA,uGAAuG;AACvG,OAAO,EAAE,MAAM,EAAQ,KAAK,EAAE,MAAM,QAAQ,CAAC;AAC7C,8FAA8F;AAC9F,eAAO,MAAM,0BAA0B,qEA8BtC,CAAC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/** Holds signal/disconnect listeners until the worker process scope finishes database finalization. */
|
|
2
|
+
import { Effect, Exit, Scope } from "effect";
|
|
3
|
+
/** @param scope - Physical process owner. @returns Scoped signal/disconnect registrations. */
|
|
4
|
+
export const installDuckdbWorkerSignals = Effect.fn("ObservabilityDuckdb.worker.signals")(function* (scope) {
|
|
5
|
+
const sigint = () => undefined;
|
|
6
|
+
yield* Effect.acquireRelease(Effect.sync(() => {
|
|
7
|
+
process.on("SIGINT", sigint);
|
|
8
|
+
return sigint;
|
|
9
|
+
}), (owned) => Effect.sync(() => {
|
|
10
|
+
process.off("SIGINT", owned);
|
|
11
|
+
}));
|
|
12
|
+
const disconnect = () => {
|
|
13
|
+
void Effect.runPromise(Scope.close(scope, Exit.void)).then(() => process.exit(), () => process.exit(1));
|
|
14
|
+
};
|
|
15
|
+
yield* Effect.acquireRelease(Effect.sync(() => {
|
|
16
|
+
process.on("disconnect", disconnect);
|
|
17
|
+
return disconnect;
|
|
18
|
+
}), (owned) => Effect.sync(() => {
|
|
19
|
+
process.off("disconnect", owned);
|
|
20
|
+
}));
|
|
21
|
+
});
|
|
22
|
+
//# sourceMappingURL=duckdb-worker-signals.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"duckdb-worker-signals.js","sourceRoot":"","sources":["../../src/local/duckdb-worker-signals.ts"],"names":[],"mappings":"AAAA,uGAAuG;AACvG,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAC;AAC7C,8FAA8F;AAC9F,MAAM,CAAC,MAAM,0BAA0B,GAAG,MAAM,CAAC,EAAE,CAAC,oCAAoC,CAAC,CACvF,QAAQ,CAAC,EAAE,KAAsB;IAC/B,MAAM,MAAM,GAAG,GAAS,EAAE,CAAC,SAAS,CAAC;IACrC,KAAK,CAAC,CAAC,MAAM,CAAC,cAAc,CAC1B,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE;QACf,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;QAC7B,OAAO,MAAM,CAAC;IAChB,CAAC,CAAC,EACF,CAAC,KAAK,EAAE,EAAE,CACR,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE;QACf,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;IAC/B,CAAC,CAAC,CACL,CAAC;IACF,MAAM,UAAU,GAAG,GAAS,EAAE;QAC5B,KAAK,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CACxD,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,EACpB,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CACtB,CAAC;IACJ,CAAC,CAAC;IACF,KAAK,CAAC,CAAC,MAAM,CAAC,cAAc,CAC1B,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE;QACf,OAAO,CAAC,EAAE,CAAC,YAAY,EAAE,UAAU,CAAC,CAAC;QACrC,OAAO,UAAU,CAAC;IACpB,CAAC,CAAC,EACF,CAAC,KAAK,EAAE,EAAE,CACR,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE;QACf,OAAO,CAAC,GAAG,CAAC,YAAY,EAAE,KAAK,CAAC,CAAC;IACnC,CAAC,CAAC,CACL,CAAC;AACJ,CAAC,CACF,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/** Physical database scope and serialization state owned by one storage worker. */
|
|
2
|
+
import type { Scope, Semaphore } from "effect";
|
|
3
|
+
import type { DuckdbDriver } from "./duckdb-driver.types.js";
|
|
4
|
+
import type { DuckdbDatabaseEffects } from "./duckdb-database.types.js";
|
|
5
|
+
/** Open transfers its database scope here; close clears authority before release. */
|
|
6
|
+
export interface DuckdbWorkerState {
|
|
7
|
+
readonly driver: DuckdbDriver;
|
|
8
|
+
readonly permit: Semaphore.Semaphore;
|
|
9
|
+
database: DuckdbDatabaseEffects | undefined;
|
|
10
|
+
databaseScope: Scope.Closeable | undefined;
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=duckdb-worker-state.types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"duckdb-worker-state.types.d.ts","sourceRoot":"","sources":["../../src/local/duckdb-worker-state.types.ts"],"names":[],"mappings":"AAAA,mFAAmF;AACnF,OAAO,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AAC/C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AAExE,qFAAqF;AACrF,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,MAAM,EAAE,YAAY,CAAC;IAC9B,QAAQ,CAAC,MAAM,EAAE,SAAS,CAAC,SAAS,CAAC;IACrC,QAAQ,EAAE,qBAAqB,GAAG,SAAS,CAAC;IAC5C,aAAa,EAAE,KAAK,CAAC,SAAS,GAAG,SAAS,CAAC;CAC5C"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"duckdb-worker-state.types.js","sourceRoot":"","sources":["../../src/local/duckdb-worker-state.types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"duckdb-worker.d.ts","sourceRoot":"","sources":["../../src/local/duckdb-worker.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Owns duckdb worker for the optional local history store.
|
|
3
|
+
* Shared records and query contracts come from lightweight observability; native
|
|
4
|
+
* handles and worker lifetimes remain owned by this storage package.
|
|
5
|
+
*/
|
|
6
|
+
import { Effect, Exit, Scope } from "effect";
|
|
7
|
+
import { startDuckdbWorkerProcessEffect } from "./duckdb-worker-process.js";
|
|
8
|
+
const scope = Effect.runSync(Scope.make());
|
|
9
|
+
void Effect.runPromise(startDuckdbWorkerProcessEffect(scope).pipe(Scope.provide(scope))).catch((error) => {
|
|
10
|
+
process.send?.({
|
|
11
|
+
id: 0,
|
|
12
|
+
fatal: true,
|
|
13
|
+
error: `Telemetry worker startup failed: ${String(error)}`,
|
|
14
|
+
});
|
|
15
|
+
process.exitCode = 1;
|
|
16
|
+
void Effect.runPromise(Scope.close(scope, Exit.fail(error))).then(() => process.disconnect?.(), () => process.disconnect?.());
|
|
17
|
+
});
|
|
18
|
+
//# sourceMappingURL=duckdb-worker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"duckdb-worker.js","sourceRoot":"","sources":["../../src/local/duckdb-worker.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAC;AAC7C,OAAO,EAAE,8BAA8B,EAAE,MAAM,4BAA4B,CAAC;AAC5E,MAAM,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;AAC3C,KAAK,MAAM,CAAC,UAAU,CAAC,8BAA8B,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAC5F,CAAC,KAAK,EAAE,EAAE;IACR,OAAO,CAAC,IAAI,EAAE,CAAC;QACb,EAAE,EAAE,CAAC;QACL,KAAK,EAAE,IAAI;QACX,KAAK,EAAE,oCAAoC,MAAM,CAAC,KAAK,CAAC,EAAE;KAC3D,CAAC,CAAC;IACH,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;IACrB,KAAK,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAC/D,GAAG,EAAE,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,EAC5B,GAAG,EAAE,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAC7B,CAAC;AACJ,CAAC,CACF,CAAC"}
|