@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,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Owns duckdb worker.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 { DuckdbDatabaseEffects } from "./duckdb-database.types.js";
|
|
8
|
+
import type { DuckdbError } from "./duckdb-error.js";
|
|
9
|
+
import type { DuckdbQueryError } from "./duckdb-query-error.js";
|
|
10
|
+
import type { LocalWorkerCommand } from "@relkit/observability/local/record";
|
|
11
|
+
/**
|
|
12
|
+
* Serialized command operations for the local DuckDB worker.
|
|
13
|
+
* The Layer owns any open database until its Scope closes.
|
|
14
|
+
*
|
|
15
|
+
* @example
|
|
16
|
+
* const worker = yield* DuckdbWorkerService;
|
|
17
|
+
* yield* worker.execute({ type: "flush" });
|
|
18
|
+
*/
|
|
19
|
+
export interface DuckdbWorkerEffects {
|
|
20
|
+
/**
|
|
21
|
+
* Executes one IPC command with a tagged database or query failure.
|
|
22
|
+
* @param command - Open, append, query, retention, flush, or close command.
|
|
23
|
+
* @returns An Effect with the command result or tagged failure.
|
|
24
|
+
* @example
|
|
25
|
+
* const summary = yield* worker.execute({ type: "open", root });
|
|
26
|
+
*/
|
|
27
|
+
readonly execute: (command: LocalWorkerCommand) => Effect.Effect<DuckdbWorkerResult, DuckdbError | DuckdbQueryError>;
|
|
28
|
+
/**
|
|
29
|
+
* Flushes and releases the active database Scope once.
|
|
30
|
+
* @returns An Effect completing after release or a DuckdbError.
|
|
31
|
+
* @example
|
|
32
|
+
* yield* worker.close();
|
|
33
|
+
*/
|
|
34
|
+
readonly close: () => Effect.Effect<void, DuckdbError>;
|
|
35
|
+
}
|
|
36
|
+
/** Actual command results before JSON serialization at the IPC boundary. */
|
|
37
|
+
export type DuckdbWorkerResult = void | DuckdbDatabaseEffects["imported"] | Effect.Success<ReturnType<DuckdbDatabaseEffects["append"]>> | Effect.Success<ReturnType<DuckdbDatabaseEffects["list"]>> | Effect.Success<ReturnType<DuckdbDatabaseEffects["detail"]>>;
|
|
38
|
+
//# sourceMappingURL=duckdb-worker.types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"duckdb-worker.types.d.ts","sourceRoot":"","sources":["../../src/local/duckdb-worker.types.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AACrC,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AACxE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAChE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,oCAAoC,CAAC;AAC7E;;;;;;;GAOG;AACH,MAAM,WAAW,mBAAmB;IAClC;;;;;;OAMG;IACH,QAAQ,CAAC,OAAO,EAAE,CAChB,OAAO,EAAE,kBAAkB,KACxB,MAAM,CAAC,MAAM,CAAC,kBAAkB,EAAE,WAAW,GAAG,gBAAgB,CAAC,CAAC;IACvE;;;;;OAKG;IACH,QAAQ,CAAC,KAAK,EAAE,MAAM,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;CACxD;AAED,4EAA4E;AAC5E,MAAM,MAAM,kBAAkB,GAC1B,IAAI,GACJ,qBAAqB,CAAC,UAAU,CAAC,GACjC,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,qBAAqB,CAAC,QAAQ,CAAC,CAAC,CAAC,GAC3D,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,qBAAqB,CAAC,MAAM,CAAC,CAAC,CAAC,GACzD,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,qBAAqB,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"duckdb-worker.types.js","sourceRoot":"","sources":["../../src/local/duckdb-worker.types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { Effect } from "effect";
|
|
2
|
+
import type { DuckdbConnectionPort } from "./duckdb-driver.types.js";
|
|
3
|
+
import type { LegacyAppend } from "./import-history.types.js";
|
|
4
|
+
/** @param root - Unchanged diagnostic history root. @param connection - Scoped native connection. @param append - Idempotent append operation. @returns Original import summary or typed IO/storage failure. */
|
|
5
|
+
export declare const importLocalHistoryEffect: (root: string, connection: DuckdbConnectionPort, append: LegacyAppend) => Effect.Effect<{
|
|
6
|
+
records: number;
|
|
7
|
+
malformed: number;
|
|
8
|
+
}, import("./duckdb-error.js").DuckdbError, never>;
|
|
9
|
+
//# sourceMappingURL=import-history-effect.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"import-history-effect.d.ts","sourceRoot":"","sources":["../../src/local/import-history-effect.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAKhC,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AACrE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAE9D,gNAAgN;AAChN,eAAO,MAAM,wBAAwB;;;kDAsBnC,CAAC"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Imports existing history in stable path order using original path/hash markers.
|
|
3
|
+
* Source files, receipt identities, malformed counts and applied schema stay intact.
|
|
4
|
+
*/
|
|
5
|
+
import { relative } from "node:path";
|
|
6
|
+
import { Effect } from "effect";
|
|
7
|
+
import { readDuckdbSql, runDuckdbSql } from "./duckdb-sql.js";
|
|
8
|
+
import { historyFiles, historyFingerprint } from "./import-history-files.js";
|
|
9
|
+
import { importLegacyLines } from "./import-history-lines.js";
|
|
10
|
+
import { observeDuckdb } from "./duckdb-metrics.js";
|
|
11
|
+
/** @param root - Unchanged diagnostic history root. @param connection - Scoped native connection. @param append - Idempotent append operation. @returns Original import summary or typed IO/storage failure. */
|
|
12
|
+
export const importLocalHistoryEffect = Effect.fn("ObservabilityDuckdb.import")(function* (root, connection, append) {
|
|
13
|
+
return yield* observeDuckdb("import", Effect.gen(function* () {
|
|
14
|
+
const summaries = yield* Effect.forEach(yield* historyFiles(root), (path) => importHistoryFile(root, path, connection, append), { concurrency: 1 });
|
|
15
|
+
return summaries.reduce((total, item) => ({
|
|
16
|
+
records: total.records + item.records,
|
|
17
|
+
malformed: total.malformed + item.malformed,
|
|
18
|
+
}), { records: 0, malformed: 0 });
|
|
19
|
+
}));
|
|
20
|
+
});
|
|
21
|
+
/** @param root - History root. @param path - Existing segment. @param connection - Native imports table. @param append - Transactional writer. @returns Counts for a new file fingerprint, or zero for an existing import. */
|
|
22
|
+
const importHistoryFile = Effect.fn("ObservabilityDuckdb.import.file")(function* (root, path, connection, append) {
|
|
23
|
+
const sourcePath = relative(root, path).replace(/\.active\.ndjson$/, ".ndjson");
|
|
24
|
+
const source = `${sourcePath}:${yield* historyFingerprint(path)}`;
|
|
25
|
+
const exists = yield* readDuckdbSql(connection, "import", "SELECT source FROM imports WHERE source = ?", [source]);
|
|
26
|
+
if (exists.getRowObjectsJson().length > 0)
|
|
27
|
+
return { records: 0, malformed: 0 };
|
|
28
|
+
const summary = yield* importLegacyLines(path, sourcePath, append);
|
|
29
|
+
yield* runDuckdbSql(connection, "import", "INSERT INTO imports VALUES (?, ?) ON CONFLICT DO NOTHING", [source, summary.malformed]);
|
|
30
|
+
return summary;
|
|
31
|
+
});
|
|
32
|
+
//# sourceMappingURL=import-history-effect.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"import-history-effect.js","sourceRoot":"","sources":["../../src/local/import-history-effect.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AACrC,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAChC,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC9D,OAAO,EAAE,YAAY,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAC7E,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAC9D,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAIpD,gNAAgN;AAChN,MAAM,CAAC,MAAM,wBAAwB,GAAG,MAAM,CAAC,EAAE,CAAC,4BAA4B,CAAC,CAAC,QAAQ,CAAC,EACvF,IAAY,EACZ,UAAgC,EAChC,MAAoB;IAEpB,OAAO,KAAK,CAAC,CAAC,aAAa,CACzB,QAAQ,EACR,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;QAClB,MAAM,SAAS,GAAG,KAAK,CAAC,CAAC,MAAM,CAAC,OAAO,CACrC,KAAK,CAAC,CAAC,YAAY,CAAC,IAAI,CAAC,EACzB,CAAC,IAAI,EAAE,EAAE,CAAC,iBAAiB,CAAC,IAAI,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,CAAC,EAC3D,EAAE,WAAW,EAAE,CAAC,EAAE,CACnB,CAAC;QACF,OAAO,SAAS,CAAC,MAAM,CACrB,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC;YAChB,OAAO,EAAE,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO;YACrC,SAAS,EAAE,KAAK,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS;SAC5C,CAAC,EACF,EAAE,OAAO,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,CAC7B,CAAC;IACJ,CAAC,CAAC,CACH,CAAC;AACJ,CAAC,CAAC,CAAC;AAEH,8NAA8N;AAC9N,MAAM,iBAAiB,GAAG,MAAM,CAAC,EAAE,CAAC,iCAAiC,CAAC,CAAC,QAAQ,CAAC,EAC9E,IAAY,EACZ,IAAY,EACZ,UAAgC,EAChC,MAAoB;IAEpB,MAAM,UAAU,GAAG,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,OAAO,CAAC,mBAAmB,EAAE,SAAS,CAAC,CAAC;IAChF,MAAM,MAAM,GAAG,GAAG,UAAU,IAAI,KAAK,CAAC,CAAC,kBAAkB,CAAC,IAAI,CAAC,EAAE,CAAC;IAClE,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,aAAa,CACjC,UAAU,EACV,QAAQ,EACR,6CAA6C,EAC7C,CAAC,MAAM,CAAC,CACT,CAAC;IACF,IAAI,MAAM,CAAC,iBAAiB,EAAE,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,CAAC;IAC/E,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,iBAAiB,CAAC,IAAI,EAAE,UAAU,EAAE,MAAM,CAAC,CAAC;IACnE,KAAK,CAAC,CAAC,YAAY,CACjB,UAAU,EACV,QAAQ,EACR,0DAA0D,EAC1D,CAAC,MAAM,EAAE,OAAO,CAAC,SAAS,CAAC,CAC5B,CAAC;IACF,OAAO,OAAO,CAAC;AACjB,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { Effect } from "effect";
|
|
2
|
+
import { duckdbError } from "./duckdb-error.js";
|
|
3
|
+
export declare const historyFiles: (root: string) => Effect.Effect<string[], ReturnType<typeof duckdbError>>;
|
|
4
|
+
export declare const historyFingerprint: (path: string) => Effect.Effect<string, import("./duckdb-error.js").DuckdbError, never>;
|
|
5
|
+
//# sourceMappingURL=import-history-files.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"import-history-files.d.ts","sourceRoot":"","sources":["../../src/local/import-history-files.ts"],"names":[],"mappings":"AAUA,OAAO,EAAE,MAAM,EAAU,MAAM,QAAQ,CAAC;AACxC,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,eAAO,MAAM,YAAY,EAAE,CACzB,IAAI,EAAE,MAAM,KACT,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,EAAE,UAAU,CAAC,OAAO,WAAW,CAAC,CAqBzD,CAAC;AACH,eAAO,MAAM,kBAAkB,yFAoB7B,CAAC"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Owns import history effect 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 { createHash } from "node:crypto";
|
|
7
|
+
import { createReadStream } from "node:fs";
|
|
8
|
+
import { readdir } from "node:fs/promises";
|
|
9
|
+
import { join, relative } from "node:path";
|
|
10
|
+
import { createInterface } from "node:readline";
|
|
11
|
+
import { Effect, Stream } from "effect";
|
|
12
|
+
import { duckdbError } from "./duckdb-error.js";
|
|
13
|
+
export const historyFiles = Effect.fn("ObservabilityDuckdb.import.files")(function* (root) {
|
|
14
|
+
const entries = yield* Effect.tryPromise({
|
|
15
|
+
try: () => readdir(root, { withFileTypes: true }),
|
|
16
|
+
catch: (cause) => duckdbError("import-files", cause),
|
|
17
|
+
});
|
|
18
|
+
const nested = yield* Effect.forEach(entries, (item) => Effect.gen(function* () {
|
|
19
|
+
const path = join(root, item.name);
|
|
20
|
+
return item.isDirectory()
|
|
21
|
+
? yield* historyFiles(path)
|
|
22
|
+
: item.isFile() && item.name.endsWith(".ndjson")
|
|
23
|
+
? [path]
|
|
24
|
+
: [];
|
|
25
|
+
}), { concurrency: 1 });
|
|
26
|
+
return nested.flat().sort();
|
|
27
|
+
});
|
|
28
|
+
export const historyFingerprint = Effect.fn("ObservabilityDuckdb.import.fingerprint")(function* (path) {
|
|
29
|
+
const hash = createHash("sha256");
|
|
30
|
+
yield* Effect.acquireUseRelease(Effect.sync(() => createReadStream(path)), (input) => Stream.runForEach(Stream.fromAsyncIterable(input, (cause) => duckdbError("import-read", cause)), (chunk) => Effect.sync(() => {
|
|
31
|
+
hash.update(chunk);
|
|
32
|
+
})), (input) => Effect.sync(() => {
|
|
33
|
+
input.destroy();
|
|
34
|
+
}));
|
|
35
|
+
return hash.digest("hex");
|
|
36
|
+
});
|
|
37
|
+
//# sourceMappingURL=import-history-files.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"import-history-files.js","sourceRoot":"","sources":["../../src/local/import-history-files.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAC3C,OAAO,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAC3C,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAC3C,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AACxC,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,MAAM,CAAC,MAAM,YAAY,GAEsC,MAAM,CAAC,EAAE,CACtE,kCAAkC,CACnC,CAAC,QAAQ,CAAC,EAAE,IAAY;IACvB,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC;QACvC,GAAG,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC;QACjD,KAAK,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,WAAW,CAAC,cAAc,EAAE,KAAK,CAAC;KACrD,CAAC,CAAC;IACH,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,MAAM,CAAC,OAAO,CAClC,OAAO,EACP,CAAC,IAAI,EAAE,EAAE,CACP,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;QAClB,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;QACnC,OAAO,IAAI,CAAC,WAAW,EAAE;YACvB,CAAC,CAAC,KAAK,CAAC,CAAC,YAAY,CAAC,IAAI,CAAC;YAC3B,CAAC,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC;gBAC9C,CAAC,CAAC,CAAC,IAAI,CAAC;gBACR,CAAC,CAAC,EAAE,CAAC;IACX,CAAC,CAAC,EACJ,EAAE,WAAW,EAAE,CAAC,EAAE,CACnB,CAAC;IACF,OAAO,MAAM,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC;AAC9B,CAAC,CAAC,CAAC;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG,MAAM,CAAC,EAAE,CAAC,wCAAwC,CAAC,CAAC,QAAQ,CAAC,EAC7F,IAAY;IAEZ,MAAM,IAAI,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC;IAClC,KAAK,CAAC,CAAC,MAAM,CAAC,iBAAiB,CAC7B,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC,EACzC,CAAC,KAAK,EAAE,EAAE,CACR,MAAM,CAAC,UAAU,CACf,MAAM,CAAC,iBAAiB,CAAC,KAAK,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,WAAW,CAAC,aAAa,EAAE,KAAK,CAAC,CAAC,EAC7E,CAAC,KAAK,EAAE,EAAE,CACR,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE;QACf,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACrB,CAAC,CAAC,CACL,EACH,CAAC,KAAK,EAAE,EAAE,CACR,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE;QACf,KAAK,CAAC,OAAO,EAAE,CAAC;IAClB,CAAC,CAAC,CACL,CAAC;IACF,OAAO,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAC5B,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { Effect } from "effect";
|
|
2
|
+
import type { LegacyAppend } from "./import-history.types.js";
|
|
3
|
+
import type { LegacyLineState } from "./import-history-lines.types.js";
|
|
4
|
+
/** @param state - Per-file identity and batch state. @param line - Original file line. @param append - Transactional idempotent writer. @returns Completion after admission or one malformed count. */
|
|
5
|
+
export declare const importLegacyLine: (state: LegacyLineState, line: string, append: LegacyAppend) => Effect.Effect<void, import("./duckdb-error.js").DuckdbError, never>;
|
|
6
|
+
//# sourceMappingURL=import-history-line.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"import-history-line.d.ts","sourceRoot":"","sources":["../../src/local/import-history-line.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAIhC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAC9D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAC;AA8BvE,uMAAuM;AACvM,eAAO,MAAM,gBAAgB,qIAoB3B,CAAC"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
/** Derives unchanged path/line/hash receipt keys and admits bounded legacy batches. */
|
|
2
|
+
import { createHash } from "node:crypto";
|
|
3
|
+
import { Effect } from "effect";
|
|
4
|
+
import { validateLocalRecord } from "@relkit/observability/local/record";
|
|
5
|
+
import { duckdbError } from "./duckdb-error.js";
|
|
6
|
+
/** @param sourcePath - Normalized relative segment path. @param lineNumber - Original physical line. @param line - Untrusted NDJSON. @returns A validated legacy envelope. */
|
|
7
|
+
function decodeLegacyLine(sourcePath, lineNumber, line) {
|
|
8
|
+
const record = JSON.parse(line);
|
|
9
|
+
const envelope = {
|
|
10
|
+
key: `legacy:${sourcePath}:${lineNumber}:${createHash("sha256").update(line).digest("hex")}`,
|
|
11
|
+
record,
|
|
12
|
+
origin: legacyOrigin(record),
|
|
13
|
+
};
|
|
14
|
+
validateLocalRecord(envelope);
|
|
15
|
+
return envelope;
|
|
16
|
+
}
|
|
17
|
+
/** @typeParam Record - Foreign parsed record. @param record - Parsed input narrowed before property use. @returns Existing legacy CLI/application source attribution. */
|
|
18
|
+
function legacyOrigin(record) {
|
|
19
|
+
if (record === null ||
|
|
20
|
+
typeof record !== "object" ||
|
|
21
|
+
!("signal" in record) ||
|
|
22
|
+
record.signal !== "log" ||
|
|
23
|
+
!("component" in record) ||
|
|
24
|
+
typeof record.component !== "string")
|
|
25
|
+
return "application";
|
|
26
|
+
if (record.component.startsWith("cli."))
|
|
27
|
+
return "relkit";
|
|
28
|
+
if (record.component === "inspector")
|
|
29
|
+
return "inspector";
|
|
30
|
+
return "application";
|
|
31
|
+
}
|
|
32
|
+
/** @param state - Per-file identity and batch state. @param line - Original file line. @param append - Transactional idempotent writer. @returns Completion after admission or one malformed count. */
|
|
33
|
+
export const importLegacyLine = Effect.fn("ObservabilityDuckdb.import.line")(function* (state, line, append) {
|
|
34
|
+
state.lineNumber++;
|
|
35
|
+
if (!line.trim())
|
|
36
|
+
return;
|
|
37
|
+
const item = yield* Effect.try({
|
|
38
|
+
try: () => decodeLegacyLine(state.sourcePath, state.lineNumber, line),
|
|
39
|
+
catch: (cause) => duckdbError("import-decode", cause),
|
|
40
|
+
}).pipe(Effect.option);
|
|
41
|
+
if (item._tag === "None") {
|
|
42
|
+
state.malformed++;
|
|
43
|
+
return;
|
|
44
|
+
}
|
|
45
|
+
state.pending.push(item.value);
|
|
46
|
+
if (state.pending.length === 256) {
|
|
47
|
+
state.records += (yield* append(state.pending)).length;
|
|
48
|
+
state.pending = [];
|
|
49
|
+
}
|
|
50
|
+
});
|
|
51
|
+
//# sourceMappingURL=import-history-line.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"import-history-line.js","sourceRoot":"","sources":["../../src/local/import-history-line.ts"],"names":[],"mappings":"AAAA,uFAAuF;AACvF,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAChC,OAAO,EAAE,mBAAmB,EAAE,MAAM,oCAAoC,CAAC;AAEzE,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAIhD,8KAA8K;AAC9K,SAAS,gBAAgB,CAAC,UAAkB,EAAE,UAAkB,EAAE,IAAY;IAC5E,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAChC,MAAM,QAAQ,GAAG;QACf,GAAG,EAAE,UAAU,UAAU,IAAI,UAAU,IAAI,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE;QAC5F,MAAM;QACN,MAAM,EAAE,YAAY,CAAC,MAAM,CAAC;KAC7B,CAAC;IACF,mBAAmB,CAAC,QAAQ,CAAC,CAAC;IAC9B,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,yKAAyK;AACzK,SAAS,YAAY,CAAS,MAAc;IAC1C,IACE,MAAM,KAAK,IAAI;QACf,OAAO,MAAM,KAAK,QAAQ;QAC1B,CAAC,CAAC,QAAQ,IAAI,MAAM,CAAC;QACrB,MAAM,CAAC,MAAM,KAAK,KAAK;QACvB,CAAC,CAAC,WAAW,IAAI,MAAM,CAAC;QACxB,OAAO,MAAM,CAAC,SAAS,KAAK,QAAQ;QAEpC,OAAO,aAAa,CAAC;IACvB,IAAI,MAAM,CAAC,SAAS,CAAC,UAAU,CAAC,MAAM,CAAC;QAAE,OAAO,QAAQ,CAAC;IACzD,IAAI,MAAM,CAAC,SAAS,KAAK,WAAW;QAAE,OAAO,WAAW,CAAC;IACzD,OAAO,aAAa,CAAC;AACvB,CAAC;AAED,uMAAuM;AACvM,MAAM,CAAC,MAAM,gBAAgB,GAAG,MAAM,CAAC,EAAE,CAAC,iCAAiC,CAAC,CAAC,QAAQ,CAAC,EACpF,KAAsB,EACtB,IAAY,EACZ,MAAoB;IAEpB,KAAK,CAAC,UAAU,EAAE,CAAC;IACnB,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE;QAAE,OAAO;IACzB,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;QAC7B,GAAG,EAAE,GAAG,EAAE,CAAC,gBAAgB,CAAC,KAAK,CAAC,UAAU,EAAE,KAAK,CAAC,UAAU,EAAE,IAAI,CAAC;QACrE,KAAK,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,WAAW,CAAC,eAAe,EAAE,KAAK,CAAC;KACtD,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IACvB,IAAI,IAAI,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;QACzB,KAAK,CAAC,SAAS,EAAE,CAAC;QAClB,OAAO;IACT,CAAC;IACD,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC/B,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;QACjC,KAAK,CAAC,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC;QACvD,KAAK,CAAC,OAAO,GAAG,EAAE,CAAC;IACrB,CAAC;AACH,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { Effect } from "effect";
|
|
2
|
+
import type { LegacyAppend } from "./import-history.types.js";
|
|
3
|
+
/** @param path - Existing segment file. @param sourcePath - Stable normalized relative path. @param append - Idempotent transactional append. @returns Accepted/malformed counts after all file handles close. */
|
|
4
|
+
export declare const importLegacyLines: (path: string, sourcePath: string, append: LegacyAppend) => Effect.Effect<{
|
|
5
|
+
records: number;
|
|
6
|
+
malformed: number;
|
|
7
|
+
}, import("./duckdb-error.js").DuckdbError, never>;
|
|
8
|
+
//# sourceMappingURL=import-history-lines.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"import-history-lines.d.ts","sourceRoot":"","sources":["../../src/local/import-history-lines.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,MAAM,EAAU,MAAM,QAAQ,CAAC;AAGxC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAG9D,kNAAkN;AAClN,eAAO,MAAM,iBAAiB;;;kDA8B5B,CAAC"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/** Streams one legacy NDJSON source with owned reader handles and sequential receipt identity. */
|
|
2
|
+
import { createReadStream } from "node:fs";
|
|
3
|
+
import { createInterface } from "node:readline";
|
|
4
|
+
import { Effect, Stream } from "effect";
|
|
5
|
+
import { duckdbError } from "./duckdb-error.js";
|
|
6
|
+
import { importLegacyLine } from "./import-history-line.js";
|
|
7
|
+
/** @param path - Existing segment file. @param sourcePath - Stable normalized relative path. @param append - Idempotent transactional append. @returns Accepted/malformed counts after all file handles close. */
|
|
8
|
+
export const importLegacyLines = Effect.fn("ObservabilityDuckdb.import.lines")(function* (path, sourcePath, append) {
|
|
9
|
+
const state = {
|
|
10
|
+
sourcePath,
|
|
11
|
+
lineNumber: 0,
|
|
12
|
+
malformed: 0,
|
|
13
|
+
records: 0,
|
|
14
|
+
pending: [],
|
|
15
|
+
};
|
|
16
|
+
yield* Effect.acquireUseRelease(Effect.sync(() => {
|
|
17
|
+
const stream = createReadStream(path);
|
|
18
|
+
return { stream, input: createInterface({ input: stream, crlfDelay: Infinity }) };
|
|
19
|
+
}), ({ input }) => Stream.runForEach(Stream.fromAsyncIterable(input, (cause) => duckdbError("import-read", cause)), (line) => importLegacyLine(state, line, append)), ({ input, stream }) => Effect.sync(() => {
|
|
20
|
+
input.close();
|
|
21
|
+
stream.destroy();
|
|
22
|
+
}));
|
|
23
|
+
if (state.pending.length)
|
|
24
|
+
state.records += (yield* append(state.pending)).length;
|
|
25
|
+
return { records: state.records, malformed: state.malformed };
|
|
26
|
+
});
|
|
27
|
+
//# sourceMappingURL=import-history-lines.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"import-history-lines.js","sourceRoot":"","sources":["../../src/local/import-history-lines.ts"],"names":[],"mappings":"AAAA,kGAAkG;AAClG,OAAO,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAC3C,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AACxC,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAI5D,kNAAkN;AAClN,MAAM,CAAC,MAAM,iBAAiB,GAAG,MAAM,CAAC,EAAE,CAAC,kCAAkC,CAAC,CAAC,QAAQ,CAAC,EACtF,IAAY,EACZ,UAAkB,EAClB,MAAoB;IAEpB,MAAM,KAAK,GAAoB;QAC7B,UAAU;QACV,UAAU,EAAE,CAAC;QACb,SAAS,EAAE,CAAC;QACZ,OAAO,EAAE,CAAC;QACV,OAAO,EAAE,EAAE;KACZ,CAAC;IACF,KAAK,CAAC,CAAC,MAAM,CAAC,iBAAiB,CAC7B,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE;QACf,MAAM,MAAM,GAAG,gBAAgB,CAAC,IAAI,CAAC,CAAC;QACtC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,eAAe,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC;IACpF,CAAC,CAAC,EACF,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,CACZ,MAAM,CAAC,UAAU,CACf,MAAM,CAAC,iBAAiB,CAAC,KAAK,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,WAAW,CAAC,aAAa,EAAE,KAAK,CAAC,CAAC,EAC7E,CAAC,IAAI,EAAE,EAAE,CAAC,gBAAgB,CAAC,KAAK,EAAE,IAAI,EAAE,MAAM,CAAC,CAChD,EACH,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,CACpB,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE;QACf,KAAK,CAAC,KAAK,EAAE,CAAC;QACd,MAAM,CAAC,OAAO,EAAE,CAAC;IACnB,CAAC,CAAC,CACL,CAAC;IACF,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM;QAAE,KAAK,CAAC,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC;IACjF,OAAO,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,SAAS,EAAE,KAAK,CAAC,SAAS,EAAE,CAAC;AAChE,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/** Sequential line/import counters private to one legacy NDJSON source. */
|
|
2
|
+
import type { LocalRecord } from "@relkit/observability/local/record";
|
|
3
|
+
/** Keeps file line identity stable across malformed rows and batch boundaries. */
|
|
4
|
+
export interface LegacyLineState {
|
|
5
|
+
readonly sourcePath: string;
|
|
6
|
+
lineNumber: number;
|
|
7
|
+
malformed: number;
|
|
8
|
+
records: number;
|
|
9
|
+
pending: LocalRecord[];
|
|
10
|
+
}
|
|
11
|
+
//# sourceMappingURL=import-history-lines.types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"import-history-lines.types.d.ts","sourceRoot":"","sources":["../../src/local/import-history-lines.types.ts"],"names":[],"mappings":"AAAA,2EAA2E;AAC3E,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oCAAoC,CAAC;AAEtE,kFAAkF;AAClF,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,WAAW,EAAE,CAAC;CACxB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"import-history-lines.types.js","sourceRoot":"","sources":["../../src/local/import-history-lines.types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { DuckdbConnectionPort } from "./duckdb-driver.types.js";
|
|
2
|
+
import type { LocalRecord, StoredLocalRecord } from "@relkit/observability/local/record";
|
|
3
|
+
/**
|
|
4
|
+
* Imports legacy NDJSON through the scoped Effect implementation.
|
|
5
|
+
*
|
|
6
|
+
* @param root - Directory containing legacy segment files.
|
|
7
|
+
* @param connection - Open DuckDB connection.
|
|
8
|
+
* @param append - Idempotent Promise batch persistence operation.
|
|
9
|
+
* @returns Imported and malformed record counts.
|
|
10
|
+
* @throws {DuckdbError} If file IO or persistence fails.
|
|
11
|
+
* @example
|
|
12
|
+
* const summary = await importLocalHistory(root, connection, append);
|
|
13
|
+
*/
|
|
14
|
+
export declare function importLocalHistory(root: string, connection: DuckdbConnectionPort, append: (records: readonly LocalRecord[]) => Promise<readonly StoredLocalRecord[]>): Promise<{
|
|
15
|
+
records: number;
|
|
16
|
+
malformed: number;
|
|
17
|
+
}>;
|
|
18
|
+
//# sourceMappingURL=import-history.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"import-history.d.ts","sourceRoot":"","sources":["../../src/local/import-history.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AAErE,OAAO,KAAK,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,oCAAoC,CAAC;AACzF;;;;;;;;;;GAUG;AACH,wBAAgB,kBAAkB,CAChC,IAAI,EAAE,MAAM,EACZ,UAAU,EAAE,oBAAoB,EAChC,MAAM,EAAE,CAAC,OAAO,EAAE,SAAS,WAAW,EAAE,KAAK,OAAO,CAAC,SAAS,iBAAiB,EAAE,CAAC;;;GAUnF"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Owns import history 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 } from "effect";
|
|
7
|
+
import { duckdbError } from "./duckdb-error.js";
|
|
8
|
+
import { importLocalHistoryEffect } from "./import-history-effect.js";
|
|
9
|
+
/**
|
|
10
|
+
* Imports legacy NDJSON through the scoped Effect implementation.
|
|
11
|
+
*
|
|
12
|
+
* @param root - Directory containing legacy segment files.
|
|
13
|
+
* @param connection - Open DuckDB connection.
|
|
14
|
+
* @param append - Idempotent Promise batch persistence operation.
|
|
15
|
+
* @returns Imported and malformed record counts.
|
|
16
|
+
* @throws {DuckdbError} If file IO or persistence fails.
|
|
17
|
+
* @example
|
|
18
|
+
* const summary = await importLocalHistory(root, connection, append);
|
|
19
|
+
*/
|
|
20
|
+
export function importLocalHistory(root, connection, append) {
|
|
21
|
+
return Effect.runPromise(importLocalHistoryEffect(root, connection, (records) => Effect.tryPromise({
|
|
22
|
+
try: () => append(records),
|
|
23
|
+
catch: (cause) => duckdbError("import-append", cause),
|
|
24
|
+
})));
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=import-history.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"import-history.js","sourceRoot":"","sources":["../../src/local/import-history.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAChC,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAEhD,OAAO,EAAE,wBAAwB,EAAE,MAAM,4BAA4B,CAAC;AAEtE;;;;;;;;;;GAUG;AACH,MAAM,UAAU,kBAAkB,CAChC,IAAY,EACZ,UAAgC,EAChC,MAAkF;IAElF,OAAO,MAAM,CAAC,UAAU,CACtB,wBAAwB,CAAC,IAAI,EAAE,UAAU,EAAE,CAAC,OAAO,EAAE,EAAE,CACrD,MAAM,CAAC,UAAU,CAAC;QAChB,GAAG,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC;QAC1B,KAAK,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,WAAW,CAAC,eAAe,EAAE,KAAK,CAAC;KACtD,CAAC,CACH,CACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Owns import history.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 { DuckdbError } from "./duckdb-error.js";
|
|
8
|
+
import type { LocalRecord, StoredLocalRecord } from "@relkit/observability/local/record";
|
|
9
|
+
/**
|
|
10
|
+
* Counts persisted and malformed legacy segment records.
|
|
11
|
+
*
|
|
12
|
+
* @example
|
|
13
|
+
* const summary: LegacyImportSummary = { records: 2, malformed: 1 };
|
|
14
|
+
*/
|
|
15
|
+
export interface LegacyImportSummary {
|
|
16
|
+
readonly records: number;
|
|
17
|
+
readonly malformed: number;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Effect batch writer used during the ordered legacy import.
|
|
21
|
+
*
|
|
22
|
+
* @param records - At most 256 validated legacy envelopes.
|
|
23
|
+
* @returns An Effect with committed records or a tagged DuckdbError.
|
|
24
|
+
* @example
|
|
25
|
+
* const append: LegacyAppend = (records) => storage.append(records);
|
|
26
|
+
*/
|
|
27
|
+
export type LegacyAppend = (records: readonly LocalRecord[]) => Effect.Effect<readonly StoredLocalRecord[], DuckdbError>;
|
|
28
|
+
//# sourceMappingURL=import-history.types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"import-history.types.d.ts","sourceRoot":"","sources":["../../src/local/import-history.types.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AACrC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,KAAK,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,oCAAoC,CAAC;AAEzF;;;;;GAKG;AACH,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;CAC5B;AAED;;;;;;;GAOG;AACH,MAAM,MAAM,YAAY,GAAG,CACzB,OAAO,EAAE,SAAS,WAAW,EAAE,KAC5B,MAAM,CAAC,MAAM,CAAC,SAAS,iBAAiB,EAAE,EAAE,WAAW,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"import-history.types.js","sourceRoot":"","sources":["../../src/local/import-history.types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { Effect } from "effect";
|
|
2
|
+
import type { LocalWorkerEffects } from "@relkit/observability/local/worker-contract";
|
|
3
|
+
/**
|
|
4
|
+
* Starts one child without opening a database until the caller sends open.
|
|
5
|
+
* @param onFailure - Receives its first unexpected terminal failure.
|
|
6
|
+
* @returns Lazy worker acquisition with typed IPC failures and explicit close.
|
|
7
|
+
*/
|
|
8
|
+
export declare const startLocalWorkerEffect: (onFailure?: ((error: Error) => void) | undefined) => Effect.Effect<LocalWorkerEffects, import("@relkit/observability/local/worker-contract").LocalWorkerError, never>;
|
|
9
|
+
//# sourceMappingURL=worker-client-effect.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"worker-client-effect.d.ts","sourceRoot":"","sources":["../../src/local/worker-client-effect.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAGhC,OAAO,KAAK,EACV,kBAAkB,EAEnB,MAAM,6CAA6C,CAAC;AAIrD;;;;GAIG;AACH,eAAO,MAAM,sBAAsB,wBACd,KAAK,KAAK,IAAI,kIAMjC,CAAC"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Acquires the optional isolated Node worker and exposes shared structural effects.
|
|
3
|
+
* Its caller owns close; neither record producers nor console logging import it.
|
|
4
|
+
*/
|
|
5
|
+
import { fork } from "node:child_process";
|
|
6
|
+
import { existsSync } from "node:fs";
|
|
7
|
+
import { fileURLToPath } from "node:url";
|
|
8
|
+
import { Effect } from "effect";
|
|
9
|
+
import { ObservabilityQueryError } from "@relkit/observability";
|
|
10
|
+
import { workerFailure } from "@relkit/observability/local/worker-contract";
|
|
11
|
+
import { createWorkerClientState } from "./worker-client-state.js";
|
|
12
|
+
import { sendWorkerCommand, closeWorkerClient } from "./worker-client-send.js";
|
|
13
|
+
/**
|
|
14
|
+
* Starts one child without opening a database until the caller sends open.
|
|
15
|
+
* @param onFailure - Receives its first unexpected terminal failure.
|
|
16
|
+
* @returns Lazy worker acquisition with typed IPC failures and explicit close.
|
|
17
|
+
*/
|
|
18
|
+
export const startLocalWorkerEffect = Effect.fn("observability.worker.start")(function* (onFailure = () => undefined) {
|
|
19
|
+
return yield* Effect.try({
|
|
20
|
+
try: () => createWorkerEffects(onFailure),
|
|
21
|
+
catch: (error) => workerFailure(error, "start"),
|
|
22
|
+
});
|
|
23
|
+
});
|
|
24
|
+
/** @param onFailure - Terminal diagnostic observer. @returns Structural IPC operations for one owned child. */
|
|
25
|
+
function createWorkerEffects(onFailure) {
|
|
26
|
+
const built = new URL("./duckdb-worker.js", import.meta.url);
|
|
27
|
+
const workerPath = existsSync(built)
|
|
28
|
+
? built
|
|
29
|
+
: new URL("../../dist/local/duckdb-worker.js", import.meta.url);
|
|
30
|
+
const child = fork(fileURLToPath(workerPath), [], {
|
|
31
|
+
execPath: "node",
|
|
32
|
+
execArgv: [],
|
|
33
|
+
stdio: ["ignore", "ignore", "pipe", "ipc"],
|
|
34
|
+
});
|
|
35
|
+
const state = createWorkerClientState(child, onFailure);
|
|
36
|
+
return {
|
|
37
|
+
pid: child.pid,
|
|
38
|
+
call: Effect.fn("observability.worker.call")((command) => {
|
|
39
|
+
if (state.failure)
|
|
40
|
+
return Effect.fail(workerFailure(state.failure, "worker"));
|
|
41
|
+
if (state.closed)
|
|
42
|
+
return Effect.fail(workerFailure(new Error("Telemetry worker is closed"), "closed"));
|
|
43
|
+
return Effect.tryPromise({
|
|
44
|
+
try: (signal) => sendWorkerCommand(state, command, signal),
|
|
45
|
+
catch: (error) => workerFailure(error, error instanceof ObservabilityQueryError ? "response" : "worker"),
|
|
46
|
+
});
|
|
47
|
+
}),
|
|
48
|
+
close: Effect.fn("observability.worker.close")(() => Effect.uninterruptible(Effect.tryPromise({
|
|
49
|
+
try: () => closeWorkerClient(state),
|
|
50
|
+
catch: (error) => workerFailure(error, "worker"),
|
|
51
|
+
}))),
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
//# sourceMappingURL=worker-client-effect.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"worker-client-effect.js","sourceRoot":"","sources":["../../src/local/worker-client-effect.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Sends timeout-bound commands to an owned storage child and joins its close IPC.
|
|
3
|
+
* Caller cancellation stops waiting; the shared worker retains sent commands
|
|
4
|
+
* until their reply or deadline, so one disconnected reader cannot abort writes.
|
|
5
|
+
*/
|
|
6
|
+
import type { Schema } from "effect";
|
|
7
|
+
import type { LocalWorkerCommand } from "@relkit/observability/local/record";
|
|
8
|
+
import type { WorkerClientState } from "./worker-client-state.types.js";
|
|
9
|
+
/** @param state - Child authority. @param command - Existing wire command. @param signal - Call cancellation. @returns Decoded reply after the worker acknowledges. */
|
|
10
|
+
export declare function sendWorkerCommand(state: WorkerClientState, command: LocalWorkerCommand, signal?: AbortSignal): Promise<Schema.Json | undefined>;
|
|
11
|
+
/** @param state - Owned worker. @returns The single close acknowledgement followed by physical termination. */
|
|
12
|
+
export declare function closeWorkerClient(state: WorkerClientState): Promise<void>;
|
|
13
|
+
//# sourceMappingURL=worker-client-send.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"worker-client-send.d.ts","sourceRoot":"","sources":["../../src/local/worker-client-send.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAErC,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,oCAAoC,CAAC;AAC7E,OAAO,KAAK,EAAE,iBAAiB,EAAqB,MAAM,gCAAgC,CAAC;AAG3F,uKAAuK;AACvK,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,iBAAiB,EACxB,OAAO,EAAE,kBAAkB,EAC3B,MAAM,CAAC,EAAE,WAAW,GACnB,OAAO,CAAC,MAAM,CAAC,IAAI,GAAG,SAAS,CAAC,CAyClC;AAgBD,+GAA+G;AAC/G,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC,CAGzE"}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import { WorkerTransportError } from "@relkit/observability/local/worker-contract";
|
|
2
|
+
import { failWorkerClient, stopWorkerClient } from "./worker-client-state.js";
|
|
3
|
+
/** @param state - Child authority. @param command - Existing wire command. @param signal - Call cancellation. @returns Decoded reply after the worker acknowledges. */
|
|
4
|
+
export function sendWorkerCommand(state, command, signal) {
|
|
5
|
+
if (state.failure || state.closed)
|
|
6
|
+
return Promise.reject(state.failure ?? new Error("Telemetry worker is closed"));
|
|
7
|
+
return new Promise((resolve, reject) => {
|
|
8
|
+
const id = ++state.nextId;
|
|
9
|
+
const abort = () => reject(new DOMException("Telemetry request interrupted", "AbortError"));
|
|
10
|
+
if (signal?.aborted) {
|
|
11
|
+
abort();
|
|
12
|
+
return;
|
|
13
|
+
}
|
|
14
|
+
signal?.addEventListener("abort", abort, { once: true });
|
|
15
|
+
if (signal?.aborted) {
|
|
16
|
+
abort();
|
|
17
|
+
signal.removeEventListener("abort", abort);
|
|
18
|
+
return;
|
|
19
|
+
}
|
|
20
|
+
// Sent work still owns its deadline and receipt, even after its caller leaves.
|
|
21
|
+
const timer = setTimeout(() => failWorkerClient(state, new WorkerTransportError("timeout", "Telemetry worker timed out; restart dev to recover")), command.type === "open" ? 120_000 : 15_000);
|
|
22
|
+
const cleanup = () => signal?.removeEventListener("abort", abort);
|
|
23
|
+
const pending = {
|
|
24
|
+
timer,
|
|
25
|
+
resolve: (value) => {
|
|
26
|
+
cleanup();
|
|
27
|
+
if (command.type === "open")
|
|
28
|
+
state.opened = true;
|
|
29
|
+
resolve(value);
|
|
30
|
+
},
|
|
31
|
+
reject: (error) => {
|
|
32
|
+
cleanup();
|
|
33
|
+
reject(error);
|
|
34
|
+
},
|
|
35
|
+
};
|
|
36
|
+
state.pending.set(id, pending);
|
|
37
|
+
sendEnvelope(state, id, command);
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
/** @param state - Child authority. @param id - Pending identity. @param command - Wire command. @returns Nothing; send failure settles the pending owner. */
|
|
41
|
+
function sendEnvelope(state, id, command) {
|
|
42
|
+
try {
|
|
43
|
+
state.child.send({ id, command }, (error) => {
|
|
44
|
+
if (error)
|
|
45
|
+
failWorkerClient(state, new WorkerTransportError("send", error.message));
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
catch (cause) {
|
|
49
|
+
failWorkerClient(state, new WorkerTransportError("send", cause instanceof Error ? cause.message : String(cause)));
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
/** @param state - Owned worker. @returns The single close acknowledgement followed by physical termination. */
|
|
53
|
+
export function closeWorkerClient(state) {
|
|
54
|
+
state.closePromise ??= closeOnce(state);
|
|
55
|
+
return state.closePromise;
|
|
56
|
+
}
|
|
57
|
+
/** @param state - Owned worker. @returns Completion after the worker close command or failure. */
|
|
58
|
+
async function closeOnce(state) {
|
|
59
|
+
state.closing = true;
|
|
60
|
+
const deadline = setTimeout(() => {
|
|
61
|
+
try {
|
|
62
|
+
failWorkerClient(state, new WorkerTransportError("timeout", "Diagnostic history flush exceeded its five-second shutdown budget; history may be incomplete."));
|
|
63
|
+
}
|
|
64
|
+
finally {
|
|
65
|
+
state.child.kill("SIGKILL");
|
|
66
|
+
}
|
|
67
|
+
}, 4000);
|
|
68
|
+
try {
|
|
69
|
+
if (!state.closed && !state.failure && state.opened)
|
|
70
|
+
await sendWorkerCommand(state, { type: "close" });
|
|
71
|
+
}
|
|
72
|
+
finally {
|
|
73
|
+
stopWorkerClient(state);
|
|
74
|
+
try {
|
|
75
|
+
await state.exited;
|
|
76
|
+
}
|
|
77
|
+
finally {
|
|
78
|
+
clearTimeout(deadline);
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
//# sourceMappingURL=worker-client-send.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"worker-client-send.js","sourceRoot":"","sources":["../../src/local/worker-client-send.ts"],"names":[],"mappings":"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"}
|