@relkit/observability-local 0.0.0-stage → 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/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
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 rel-kit
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
1
|
-
#
|
|
1
|
+
# @relkit/observability-local
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
Explicit local diagnostic history and worker storage for RELKIT inspection.
|
|
4
|
+
|
|
5
|
+
See [@relkit/app](https://github.com/rel-kit/relkit) for supported application APIs.
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/** Optional native history API; importing this package explicitly selects local storage. */
|
|
2
|
+
export * from "./local/worker-client.js";
|
|
3
|
+
export * from "./local/duckdb-database-effect.js";
|
|
4
|
+
export * from "./local/duckdb-database.js";
|
|
5
|
+
export * from "./local/duckdb-driver.js";
|
|
6
|
+
export * from "./local/duckdb-error.js";
|
|
7
|
+
export * from "./local/duckdb-worker-effect.js";
|
|
8
|
+
export type * from "@relkit/observability/local/record";
|
|
9
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,4FAA4F;AAC5F,cAAc,0BAA0B,CAAC;AACzC,cAAc,mCAAmC,CAAC;AAClD,cAAc,4BAA4B,CAAC;AAC3C,cAAc,0BAA0B,CAAC;AACzC,cAAc,yBAAyB,CAAC;AACxC,cAAc,iCAAiC,CAAC;AAChD,mBAAmB,oCAAoC,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/** Optional native history API; importing this package explicitly selects local storage. */
|
|
2
|
+
export * from "./local/worker-client.js";
|
|
3
|
+
export * from "./local/duckdb-database-effect.js";
|
|
4
|
+
export * from "./local/duckdb-database.js";
|
|
5
|
+
export * from "./local/duckdb-driver.js";
|
|
6
|
+
export * from "./local/duckdb-error.js";
|
|
7
|
+
export * from "./local/duckdb-worker-effect.js";
|
|
8
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,4FAA4F;AAC5F,cAAc,0BAA0B,CAAC;AACzC,cAAc,mCAAmC,CAAC;AAClD,cAAc,4BAA4B,CAAC;AAC3C,cAAc,0BAA0B,CAAC;AACzC,cAAc,yBAAyB,CAAC;AACxC,cAAc,iCAAiC,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/** Assigns explicit monotonically ordered cursors without relying on native sequence row order. */
|
|
2
|
+
import { Effect } from "effect";
|
|
3
|
+
import type { DuckdbConnectionPort } from "./duckdb-driver.types.js";
|
|
4
|
+
import type { PreparedDuckdbRecord } from "./duckdb-batch.types.js";
|
|
5
|
+
/** @param connection - Transaction-owned connection. @param admitted - Newly receipted records. @returns A proven one-to-one cursor assignment. */
|
|
6
|
+
export declare const assignDuckdbCursors: (connection: DuckdbConnectionPort, admitted: PreparedDuckdbRecord[]) => Effect.Effect<{
|
|
7
|
+
prepared: PreparedDuckdbRecord;
|
|
8
|
+
cursor: string;
|
|
9
|
+
}[], import("./duckdb-error.js").DuckdbError, never>;
|
|
10
|
+
//# sourceMappingURL=duckdb-batch-cursors.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"duckdb-batch-cursors.d.ts","sourceRoot":"","sources":["../../src/local/duckdb-batch-cursors.ts"],"names":[],"mappings":"AAAA,mGAAmG;AACnG,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAGhC,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AACrE,OAAO,KAAK,EAAE,oBAAoB,EAAwB,MAAM,yBAAyB,CAAC;AAC1F,mJAAmJ;AACnJ,eAAO,MAAM,mBAAmB;;;oDA8B9B,CAAC"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/** Assigns explicit monotonically ordered cursors without relying on native sequence row order. */
|
|
2
|
+
import { Effect } from "effect";
|
|
3
|
+
import { duckdbError } from "./duckdb-error.js";
|
|
4
|
+
import { readDuckdbSql } from "./duckdb-sql.js";
|
|
5
|
+
/** @param connection - Transaction-owned connection. @param admitted - Newly receipted records. @returns A proven one-to-one cursor assignment. */
|
|
6
|
+
export const assignDuckdbCursors = Effect.fn("ObservabilityDuckdb.batch.cursors")(function* (connection, admitted) {
|
|
7
|
+
const allocated = yield* readDuckdbSql(connection, "append", "SELECT nextval('record_ids')::VARCHAR AS id FROM range(?)", [admitted.length]);
|
|
8
|
+
return yield* Effect.try({
|
|
9
|
+
try: () => {
|
|
10
|
+
const values = [];
|
|
11
|
+
for (const row of allocated.getRowObjectsJson()) {
|
|
12
|
+
const value = row["id"];
|
|
13
|
+
if (typeof value !== "string" || !/^[1-9][0-9]*$/.test(value))
|
|
14
|
+
throw new Error("Unexpected cursor allocation result");
|
|
15
|
+
values.push(value);
|
|
16
|
+
}
|
|
17
|
+
if (values.length !== admitted.length || new Set(values).size !== values.length)
|
|
18
|
+
throw new Error("Unexpected cursor allocation result");
|
|
19
|
+
values.sort((left, right) => (BigInt(left) < BigInt(right) ? -1 : 1));
|
|
20
|
+
return admitted.map((prepared, index) => {
|
|
21
|
+
const cursor = values[index];
|
|
22
|
+
if (cursor === undefined)
|
|
23
|
+
throw new Error("Unexpected cursor allocation result");
|
|
24
|
+
return { prepared, cursor };
|
|
25
|
+
});
|
|
26
|
+
},
|
|
27
|
+
catch: (cause) => duckdbError("append", cause),
|
|
28
|
+
});
|
|
29
|
+
});
|
|
30
|
+
//# sourceMappingURL=duckdb-batch-cursors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"duckdb-batch-cursors.js","sourceRoot":"","sources":["../../src/local/duckdb-batch-cursors.ts"],"names":[],"mappings":"AAAA,mGAAmG;AACnG,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAChC,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAGhD,mJAAmJ;AACnJ,MAAM,CAAC,MAAM,mBAAmB,GAAG,MAAM,CAAC,EAAE,CAAC,mCAAmC,CAAC,CAAC,QAAQ,CAAC,EACzF,UAAgC,EAChC,QAAgC;IAEhC,MAAM,SAAS,GAAG,KAAK,CAAC,CAAC,aAAa,CACpC,UAAU,EACV,QAAQ,EACR,2DAA2D,EAC3D,CAAC,QAAQ,CAAC,MAAM,CAAC,CAClB,CAAC;IACF,OAAO,KAAK,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;QACvB,GAAG,EAAE,GAAG,EAAE;YACR,MAAM,MAAM,GAAa,EAAE,CAAC;YAC5B,KAAK,MAAM,GAAG,IAAI,SAAS,CAAC,iBAAiB,EAAE,EAAE,CAAC;gBAChD,MAAM,KAAK,GAAG,GAAG,CAAC,IAAI,CAAC,CAAC;gBACxB,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,KAAK,CAAC;oBAC3D,MAAM,IAAI,KAAK,CAAC,qCAAqC,CAAC,CAAC;gBACzD,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACrB,CAAC;YACD,IAAI,MAAM,CAAC,MAAM,KAAK,QAAQ,CAAC,MAAM,IAAI,IAAI,GAAG,CAAC,MAAM,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,MAAM;gBAC7E,MAAM,IAAI,KAAK,CAAC,qCAAqC,CAAC,CAAC;YACzD,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YACtE,OAAO,QAAQ,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,KAAK,EAAE,EAAE;gBACtC,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;gBAC7B,IAAI,MAAM,KAAK,SAAS;oBAAE,MAAM,IAAI,KAAK,CAAC,qCAAqC,CAAC,CAAC;gBACjF,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC;YAC9B,CAAC,CAAC,CAAC;QACL,CAAC;QACD,KAAK,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,WAAW,CAAC,QAAQ,EAAE,KAAK,CAAC;KAC/C,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/** Writes explicitly assigned cursor/payload rows inside the caller's atomic batch transaction. */
|
|
2
|
+
import { Effect } from "effect";
|
|
3
|
+
import type { StoredLocalRecord } from "@relkit/observability/local/record";
|
|
4
|
+
import type { DuckdbConnectionPort } from "./duckdb-driver.types.js";
|
|
5
|
+
import type { AssignedDuckdbRecord } from "./duckdb-batch.types.js";
|
|
6
|
+
/** @param connection - Transaction-owned connection. @param assigned - Explicit record/cursor pairs. @param receivedAt - Batch epoch milliseconds. @returns Stored envelopes after the native insert. */
|
|
7
|
+
export declare const insertDuckdbBatch: (connection: DuckdbConnectionPort, assigned: readonly AssignedDuckdbRecord[], receivedAt: number) => Effect.Effect<StoredLocalRecord[], import("./duckdb-error.js").DuckdbError, never>;
|
|
8
|
+
//# sourceMappingURL=duckdb-batch-insert.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"duckdb-batch-insert.d.ts","sourceRoot":"","sources":["../../src/local/duckdb-batch-insert.ts"],"names":[],"mappings":"AAAA,mGAAmG;AACnG,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAEhC,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,oCAAoC,CAAC;AAE5E,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AACrE,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AACpE,yMAAyM;AACzM,eAAO,MAAM,iBAAiB,yLA+B5B,CAAC"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/** Writes explicitly assigned cursor/payload rows inside the caller's atomic batch transaction. */
|
|
2
|
+
import { Effect } from "effect";
|
|
3
|
+
import { recordTime } from "@relkit/observability/local/record";
|
|
4
|
+
import { runDuckdbSql } from "./duckdb-sql.js";
|
|
5
|
+
/** @param connection - Transaction-owned connection. @param assigned - Explicit record/cursor pairs. @param receivedAt - Batch epoch milliseconds. @returns Stored envelopes after the native insert. */
|
|
6
|
+
export const insertDuckdbBatch = Effect.fn("ObservabilityDuckdb.batch.insert")(function* (connection, assigned, receivedAt) {
|
|
7
|
+
const parameters = assigned.flatMap(({ prepared: { item, safe, payload }, cursor }) => [
|
|
8
|
+
BigInt(cursor),
|
|
9
|
+
item.origin,
|
|
10
|
+
safe.signal,
|
|
11
|
+
recordTime(safe),
|
|
12
|
+
receivedAt,
|
|
13
|
+
safe.requestId ?? null,
|
|
14
|
+
safe.originRequestId ?? null,
|
|
15
|
+
safe.traceId ?? null,
|
|
16
|
+
"spanId" in safe ? (safe.spanId ?? null) : null,
|
|
17
|
+
Buffer.byteLength(payload),
|
|
18
|
+
payload,
|
|
19
|
+
]);
|
|
20
|
+
yield* runDuckdbSql(connection, "append", "INSERT INTO records (id, origin, signal, recorded_at, received_at, request_id, " +
|
|
21
|
+
"origin_request_id, trace_id, span_id, bytes, payload) VALUES " +
|
|
22
|
+
Array(assigned.length).fill("(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)").join(", "), parameters);
|
|
23
|
+
return assigned.map(({ prepared: { item, safe }, cursor }) => ({
|
|
24
|
+
...safe,
|
|
25
|
+
cursor,
|
|
26
|
+
origin: item.origin,
|
|
27
|
+
}));
|
|
28
|
+
});
|
|
29
|
+
//# sourceMappingURL=duckdb-batch-insert.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"duckdb-batch-insert.js","sourceRoot":"","sources":["../../src/local/duckdb-batch-insert.ts"],"names":[],"mappings":"AAAA,mGAAmG;AACnG,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAChC,OAAO,EAAE,UAAU,EAAE,MAAM,oCAAoC,CAAC;AAEhE,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAG/C,yMAAyM;AACzM,MAAM,CAAC,MAAM,iBAAiB,GAAG,MAAM,CAAC,EAAE,CAAC,kCAAkC,CAAC,CAAC,QAAQ,CAAC,EACtF,UAAgC,EAChC,QAAyC,EACzC,UAAkB;IAElB,MAAM,UAAU,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAC,EAAE,QAAQ,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;QACrF,MAAM,CAAC,MAAM,CAAC;QACd,IAAI,CAAC,MAAM;QACX,IAAI,CAAC,MAAM;QACX,UAAU,CAAC,IAAI,CAAC;QAChB,UAAU;QACV,IAAI,CAAC,SAAS,IAAI,IAAI;QACtB,IAAI,CAAC,eAAe,IAAI,IAAI;QAC5B,IAAI,CAAC,OAAO,IAAI,IAAI;QACpB,QAAQ,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI;QAC/C,MAAM,CAAC,UAAU,CAAC,OAAO,CAAC;QAC1B,OAAO;KACR,CAAC,CAAC;IACH,KAAK,CAAC,CAAC,YAAY,CACjB,UAAU,EACV,QAAQ,EACR,iFAAiF;QAC/E,+DAA+D;QAC/D,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,mCAAmC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAC7E,UAAU,CACX,CAAC;IACF,OAAO,QAAQ,CAAC,GAAG,CAAC,CAAC,EAAE,QAAQ,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,MAAM,EAAE,EAAqB,EAAE,CAAC,CAAC;QAChF,GAAG,IAAI;QACP,MAAM;QACN,MAAM,EAAE,IAAI,CAAC,MAAM;KACpB,CAAC,CAAC,CAAC;AACN,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { RedactionPolicy } from "@relkit/observability";
|
|
2
|
+
import type { LocalRecord } from "@relkit/observability/local/record";
|
|
3
|
+
import { Effect } from "effect";
|
|
4
|
+
import type { PreparedDuckdbRecord } from "./duckdb-batch.types.js";
|
|
5
|
+
/** @param records - Input envelopes, including repeated keys. @param redaction - Current admission policy. @returns First envelope per key after all validation. */
|
|
6
|
+
export declare const prepareDuckdbBatch: (records: readonly LocalRecord[], redaction?: RedactionPolicy | undefined) => Effect.Effect<Map<string, PreparedDuckdbRecord>, import("./duckdb-error.js").DuckdbError, never>;
|
|
7
|
+
//# sourceMappingURL=duckdb-batch-prepare.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"duckdb-batch-prepare.d.ts","sourceRoot":"","sources":["../../src/local/duckdb-batch-prepare.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAE7D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oCAAoC,CAAC;AACtE,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAIhC,OAAO,KAAK,EAAE,oBAAoB,EAAwB,MAAM,yBAAyB,CAAC;AAC1F,oKAAoK;AACpK,eAAO,MAAM,kBAAkB,gLAoB7B,CAAC"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/** Validates every envelope before receipt deduplication and encodes only admitted redacted payloads. */
|
|
2
|
+
import { canonicalJson } from "@relkit/contracts";
|
|
3
|
+
import { admitObservabilityRecord } from "@relkit/observability";
|
|
4
|
+
import { validateLocalRecord } from "@relkit/observability/local/record";
|
|
5
|
+
import { Effect } from "effect";
|
|
6
|
+
import { duckdbError } from "./duckdb-error.js";
|
|
7
|
+
import { readDuckdbSql } from "./duckdb-sql.js";
|
|
8
|
+
/** @param records - Input envelopes, including repeated keys. @param redaction - Current admission policy. @returns First envelope per key after all validation. */
|
|
9
|
+
export const prepareDuckdbBatch = Effect.fn("ObservabilityDuckdb.batch.prepare")(function* (records, redaction) {
|
|
10
|
+
return yield* Effect.try({
|
|
11
|
+
try: () => {
|
|
12
|
+
if (records.length > 256)
|
|
13
|
+
throw new RangeError("Telemetry batches contain at most 256 records");
|
|
14
|
+
const values = new Map();
|
|
15
|
+
for (const item of records) {
|
|
16
|
+
validateLocalRecord(item);
|
|
17
|
+
const safe = admitObservabilityRecord(item.record, redaction);
|
|
18
|
+
if (!safe)
|
|
19
|
+
throw new TypeError("Telemetry record could not be admitted");
|
|
20
|
+
const payload = canonicalJson(safe);
|
|
21
|
+
if (!values.has(item.key))
|
|
22
|
+
values.set(item.key, { item, safe, payload });
|
|
23
|
+
}
|
|
24
|
+
return values;
|
|
25
|
+
},
|
|
26
|
+
catch: (cause) => duckdbError("append", cause),
|
|
27
|
+
});
|
|
28
|
+
});
|
|
29
|
+
//# sourceMappingURL=duckdb-batch-prepare.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"duckdb-batch-prepare.js","sourceRoot":"","sources":["../../src/local/duckdb-batch-prepare.ts"],"names":[],"mappings":"AAAA,yGAAyG;AACzG,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAClD,OAAO,EAAE,wBAAwB,EAAE,MAAM,uBAAuB,CAAC;AAEjE,OAAO,EAAE,mBAAmB,EAAE,MAAM,oCAAoC,CAAC;AAEzE,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAChC,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAGhD,oKAAoK;AACpK,MAAM,CAAC,MAAM,kBAAkB,GAAG,MAAM,CAAC,EAAE,CAAC,mCAAmC,CAAC,CAAC,QAAQ,CAAC,EACxF,OAA+B,EAC/B,SAA2B;IAE3B,OAAO,KAAK,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;QACvB,GAAG,EAAE,GAAG,EAAE;YACR,IAAI,OAAO,CAAC,MAAM,GAAG,GAAG;gBACtB,MAAM,IAAI,UAAU,CAAC,+CAA+C,CAAC,CAAC;YACxE,MAAM,MAAM,GAAG,IAAI,GAAG,EAAgC,CAAC;YACvD,KAAK,MAAM,IAAI,IAAI,OAAO,EAAE,CAAC;gBAC3B,mBAAmB,CAAC,IAAI,CAAC,CAAC;gBAC1B,MAAM,IAAI,GAAG,wBAAwB,CAAC,IAAI,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;gBAC9D,IAAI,CAAC,IAAI;oBAAE,MAAM,IAAI,SAAS,CAAC,wCAAwC,CAAC,CAAC;gBACzE,MAAM,OAAO,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC;gBACpC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC;oBAAE,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;YAC3E,CAAC;YACD,OAAO,MAAM,CAAC;QAChB,CAAC;QACD,KAAK,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,WAAW,CAAC,QAAQ,EAAE,KAAK,CAAC;KAC/C,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/** Inserts stable transport receipts transactionally and recovers first-input ordering from returned keys. */
|
|
2
|
+
import { Effect } from "effect";
|
|
3
|
+
import type { DuckdbConnectionPort } from "./duckdb-driver.types.js";
|
|
4
|
+
import type { PreparedDuckdbRecord } from "./duckdb-batch.types.js";
|
|
5
|
+
/** @param connection - Transaction-owned connection. @param first - Validated first envelopes. @param receivedAt - Receipt epoch milliseconds. @returns Newly admitted records in input order. */
|
|
6
|
+
export declare const admitDuckdbReceipts: (connection: DuckdbConnectionPort, first: Map<string, PreparedDuckdbRecord>, receivedAt: number) => Effect.Effect<PreparedDuckdbRecord[], import("./duckdb-error.js").DuckdbError, never>;
|
|
7
|
+
//# sourceMappingURL=duckdb-batch-receipts.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"duckdb-batch-receipts.d.ts","sourceRoot":"","sources":["../../src/local/duckdb-batch-receipts.ts"],"names":[],"mappings":"AAAA,8GAA8G;AAC9G,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAGhC,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AACrE,OAAO,KAAK,EAAE,oBAAoB,EAAwB,MAAM,yBAAyB,CAAC;AAC1F,kMAAkM;AAClM,eAAO,MAAM,mBAAmB,2LA0B9B,CAAC"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/** Inserts stable transport receipts transactionally and recovers first-input ordering from returned keys. */
|
|
2
|
+
import { Effect } from "effect";
|
|
3
|
+
import { duckdbError } from "./duckdb-error.js";
|
|
4
|
+
import { readDuckdbSql } from "./duckdb-sql.js";
|
|
5
|
+
/** @param connection - Transaction-owned connection. @param first - Validated first envelopes. @param receivedAt - Receipt epoch milliseconds. @returns Newly admitted records in input order. */
|
|
6
|
+
export const admitDuckdbReceipts = Effect.fn("ObservabilityDuckdb.batch.receipts")(function* (connection, first, receivedAt) {
|
|
7
|
+
const receipts = yield* readDuckdbSql(connection, "append", "INSERT INTO receipts VALUES " +
|
|
8
|
+
Array(first.size).fill("(?, ?)").join(", ") +
|
|
9
|
+
" ON CONFLICT DO NOTHING RETURNING key", [...first.keys()].flatMap((key) => [key, receivedAt]));
|
|
10
|
+
return yield* Effect.try({
|
|
11
|
+
try: () => {
|
|
12
|
+
const keys = new Set();
|
|
13
|
+
for (const row of receipts.getRowObjectsJson()) {
|
|
14
|
+
const key = row["key"];
|
|
15
|
+
if (typeof key !== "string" || !first.has(key) || keys.has(key))
|
|
16
|
+
throw new Error("Unexpected receipt admission result");
|
|
17
|
+
keys.add(key);
|
|
18
|
+
}
|
|
19
|
+
return [...first.values()].filter(({ item }) => keys.has(item.key));
|
|
20
|
+
},
|
|
21
|
+
catch: (cause) => duckdbError("append", cause),
|
|
22
|
+
});
|
|
23
|
+
});
|
|
24
|
+
//# sourceMappingURL=duckdb-batch-receipts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"duckdb-batch-receipts.js","sourceRoot":"","sources":["../../src/local/duckdb-batch-receipts.ts"],"names":[],"mappings":"AAAA,8GAA8G;AAC9G,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAChC,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAGhD,kMAAkM;AAClM,MAAM,CAAC,MAAM,mBAAmB,GAAG,MAAM,CAAC,EAAE,CAAC,oCAAoC,CAAC,CAAC,QAAQ,CAAC,EAC1F,UAAgC,EAChC,KAAwC,EACxC,UAAkB;IAElB,MAAM,QAAQ,GAAG,KAAK,CAAC,CAAC,aAAa,CACnC,UAAU,EACV,QAAQ,EACR,8BAA8B;QAC5B,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;QAC3C,uCAAuC,EACzC,CAAC,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC,CACtD,CAAC;IACF,OAAO,KAAK,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;QACvB,GAAG,EAAE,GAAG,EAAE;YACR,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;YAC/B,KAAK,MAAM,GAAG,IAAI,QAAQ,CAAC,iBAAiB,EAAE,EAAE,CAAC;gBAC/C,MAAM,GAAG,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC;gBACvB,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;oBAC7D,MAAM,IAAI,KAAK,CAAC,qCAAqC,CAAC,CAAC;gBACzD,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YAChB,CAAC;YACD,OAAO,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;QACtE,CAAC;QACD,KAAK,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,WAAW,CAAC,QAAQ,EAAE,KAAK,CAAC;KAC/C,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/** Composes validated receipt admission, explicit cursor allocation and insertion within one borrowed transaction. */
|
|
2
|
+
import { Effect } from "effect";
|
|
3
|
+
import type { RedactionPolicy } from "@relkit/observability";
|
|
4
|
+
import type { LocalRecord } from "@relkit/observability/local/record";
|
|
5
|
+
import type { DuckdbConnectionPort } from "./duckdb-driver.types.js";
|
|
6
|
+
/** @param connection - Transaction-owned connection. @param records - At most 256 envelopes. @param receivedAt - Batch epoch milliseconds. @param redaction - Admission policy. @returns Explicitly cursored stored records; caller commits or rolls back. */
|
|
7
|
+
export declare const appendDuckdbBatchEffect: (connection: DuckdbConnectionPort, records: readonly LocalRecord[], receivedAt: number, redaction?: RedactionPolicy | undefined) => Effect.Effect<import("@relkit/observability/local/record").StoredLocalRecord[], import("./duckdb-error.js").DuckdbError, never>;
|
|
8
|
+
//# sourceMappingURL=duckdb-batch.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"duckdb-batch.d.ts","sourceRoot":"","sources":["../../src/local/duckdb-batch.ts"],"names":[],"mappings":"AAAA,sHAAsH;AACtH,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAChC,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAC7D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oCAAoC,CAAC;AACtE,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AAMrE,8PAA8P;AAC9P,eAAO,MAAM,uBAAuB,qQAenC,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/** Composes validated receipt admission, explicit cursor allocation and insertion within one borrowed transaction. */
|
|
2
|
+
import { Effect } from "effect";
|
|
3
|
+
import { prepareDuckdbBatch } from "./duckdb-batch-prepare.js";
|
|
4
|
+
import { admitDuckdbReceipts } from "./duckdb-batch-receipts.js";
|
|
5
|
+
import { assignDuckdbCursors } from "./duckdb-batch-cursors.js";
|
|
6
|
+
import { insertDuckdbBatch } from "./duckdb-batch-insert.js";
|
|
7
|
+
import { observeDuckdb } from "./duckdb-metrics.js";
|
|
8
|
+
/** @param connection - Transaction-owned connection. @param records - At most 256 envelopes. @param receivedAt - Batch epoch milliseconds. @param redaction - Admission policy. @returns Explicitly cursored stored records; caller commits or rolls back. */
|
|
9
|
+
export const appendDuckdbBatchEffect = Effect.fn("ObservabilityDuckdb.appendBatch")(function* (connection, records, receivedAt, redaction) {
|
|
10
|
+
const first = yield* prepareDuckdbBatch(records, redaction);
|
|
11
|
+
if (first.size === 0)
|
|
12
|
+
return [];
|
|
13
|
+
const admitted = yield* admitDuckdbReceipts(connection, first, receivedAt);
|
|
14
|
+
if (admitted.length === 0)
|
|
15
|
+
return [];
|
|
16
|
+
const assigned = yield* assignDuckdbCursors(connection, admitted);
|
|
17
|
+
return yield* insertDuckdbBatch(connection, assigned, receivedAt);
|
|
18
|
+
}, (effect) => observeDuckdb("append-batch", effect));
|
|
19
|
+
//# sourceMappingURL=duckdb-batch.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"duckdb-batch.js","sourceRoot":"","sources":["../../src/local/duckdb-batch.ts"],"names":[],"mappings":"AAAA,sHAAsH;AACtH,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAIhC,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAC/D,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACjE,OAAO,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AAChE,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,8PAA8P;AAC9P,MAAM,CAAC,MAAM,uBAAuB,GAAG,MAAM,CAAC,EAAE,CAAC,iCAAiC,CAAC,CACjF,QAAQ,CAAC,EACP,UAAgC,EAChC,OAA+B,EAC/B,UAAkB,EAClB,SAA2B;IAE3B,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,kBAAkB,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;IAC5D,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IAChC,MAAM,QAAQ,GAAG,KAAK,CAAC,CAAC,mBAAmB,CAAC,UAAU,EAAE,KAAK,EAAE,UAAU,CAAC,CAAC;IAC3E,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IACrC,MAAM,QAAQ,GAAG,KAAK,CAAC,CAAC,mBAAmB,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;IAClE,OAAO,KAAK,CAAC,CAAC,iBAAiB,CAAC,UAAU,EAAE,QAAQ,EAAE,UAAU,CAAC,CAAC;AACpE,CAAC,EACD,CAAC,MAAM,EAAE,EAAE,CAAC,aAAa,CAAC,cAAc,EAAE,MAAM,CAAC,CAClD,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Owns duckdb batch.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 { ObservabilityRecord } from "@relkit/observability";
|
|
7
|
+
import type { LocalRecord } from "@relkit/observability/local/record";
|
|
8
|
+
/** Validated and redacted envelope retained until its transaction commits. */
|
|
9
|
+
export interface PreparedDuckdbRecord {
|
|
10
|
+
readonly item: LocalRecord;
|
|
11
|
+
readonly safe: ObservabilityRecord;
|
|
12
|
+
readonly payload: string;
|
|
13
|
+
}
|
|
14
|
+
/** Cursor assignment validated before inserting the record payload. */
|
|
15
|
+
export interface AssignedDuckdbRecord {
|
|
16
|
+
readonly prepared: PreparedDuckdbRecord;
|
|
17
|
+
readonly cursor: string;
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=duckdb-batch.types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"duckdb-batch.types.d.ts","sourceRoot":"","sources":["../../src/local/duckdb-batch.types.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AACjE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oCAAoC,CAAC;AAEtE,8EAA8E;AAC9E,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAC;IAC3B,QAAQ,CAAC,IAAI,EAAE,mBAAmB,CAAC;IACnC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC1B;AAED,uEAAuE;AACvE,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,QAAQ,EAAE,oBAAoB,CAAC;IACxC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"duckdb-batch.types.js","sourceRoot":"","sources":["../../src/local/duckdb-batch.types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
import { Context, Effect, Layer } from "effect";
|
|
2
|
+
import type { RedactionPolicy } from "@relkit/observability";
|
|
3
|
+
import type { TelemetryLocalRetentionPolicy } from "@relkit/observability";
|
|
4
|
+
import type { DuckdbDatabaseEffects } from "./duckdb-database.types.js";
|
|
5
|
+
import { DuckdbDriverService } from "./duckdb-driver.js";
|
|
6
|
+
declare const DuckdbDatabaseService_base: Context.ServiceClass<DuckdbDatabaseService, "@relkit/observability/DuckdbDatabase", DuckdbDatabaseEffects> & {
|
|
7
|
+
readonly make: (root: string, configured?: TelemetryLocalRetentionPolicy | undefined, redaction?: RedactionPolicy | undefined) => Effect.Effect<DuckdbDatabaseEffects, import("./duckdb-error.js").DuckdbError, import("effect/Scope").Scope | DuckdbDriverService>;
|
|
8
|
+
};
|
|
9
|
+
/**
|
|
10
|
+
* Database operations provided for one owned Effect Scope.
|
|
11
|
+
*
|
|
12
|
+
* @example
|
|
13
|
+
* const database = yield* DuckdbDatabaseService;
|
|
14
|
+
* yield* database.flush();
|
|
15
|
+
*/
|
|
16
|
+
export declare class DuckdbDatabaseService extends DuckdbDatabaseService_base {
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Acquires an instance and connection in the caller's Scope, initializes schema,
|
|
20
|
+
* and returns Effect operations. Scope finalizers close the connection first,
|
|
21
|
+
* then the instance, including on setup failure or interruption.
|
|
22
|
+
*
|
|
23
|
+
* @param root - Private local storage directory.
|
|
24
|
+
* @param configured - Initial retention policy.
|
|
25
|
+
* @param redaction - Initial redaction policy.
|
|
26
|
+
* @returns A scoped database service or a tagged DuckdbError.
|
|
27
|
+
* @example
|
|
28
|
+
* const database = yield* openDuckdbDatabaseEffect(root);
|
|
29
|
+
* yield* database.flush();
|
|
30
|
+
*/
|
|
31
|
+
export declare const openDuckdbDatabaseEffect: (root: string, configured?: TelemetryLocalRetentionPolicy | undefined, redaction?: RedactionPolicy | undefined) => Effect.Effect<{
|
|
32
|
+
imported: {
|
|
33
|
+
records: number;
|
|
34
|
+
malformed: number;
|
|
35
|
+
};
|
|
36
|
+
append: (records: readonly import("@relkit/observability/local/record").LocalRecord[]) => Effect.Effect<import("@relkit/observability/local/record").StoredLocalRecord[], import("./duckdb-error.js").DuckdbError>;
|
|
37
|
+
configure: (retention: TelemetryLocalRetentionPolicy, redaction?: RedactionPolicy) => Effect.Effect<void, import("./duckdb-error.js").DuckdbError>;
|
|
38
|
+
flush: () => Effect.Effect<void, import("./duckdb-error.js").DuckdbError>;
|
|
39
|
+
list: (kind: "logs" | "requests" | "traces", input?: import("@relkit/observability").ObservabilityQueryRequest | undefined) => Effect.Effect<import("@relkit/observability").ObservabilityQueryPage<import("@relkit/observability/local/record").StoredLocalRecord>, import("./duckdb-query-error.js").DuckdbQueryError | import("./duckdb-error.js").DuckdbError, never>;
|
|
40
|
+
detail: (kind: "trace" | "request" | "log", id: string) => Effect.Effect<{
|
|
41
|
+
log: import("@relkit/observability/local/record").StoredLocalRecord;
|
|
42
|
+
items: readonly never[];
|
|
43
|
+
nextCursor?: string;
|
|
44
|
+
protocol: typeof import("@relkit/observability").OBSERVABILITY_QUERY_PROTOCOL;
|
|
45
|
+
version: typeof import("@relkit/observability").OBSERVABILITY_QUERY_VERSION;
|
|
46
|
+
} | {
|
|
47
|
+
request: import("@relkit/observability").RequestRecord;
|
|
48
|
+
spans: readonly import("@relkit/observability").SpanRecord[];
|
|
49
|
+
roots: readonly import("@relkit/observability").SpanNode[];
|
|
50
|
+
continuations: readonly {
|
|
51
|
+
readonly traceId: string;
|
|
52
|
+
readonly active: boolean;
|
|
53
|
+
}[];
|
|
54
|
+
records: readonly import("@relkit/observability").ObservabilityRecord[];
|
|
55
|
+
counts: {
|
|
56
|
+
readonly records: number;
|
|
57
|
+
readonly spans: number;
|
|
58
|
+
readonly continuations: number;
|
|
59
|
+
};
|
|
60
|
+
incomplete: readonly string[];
|
|
61
|
+
items: readonly never[];
|
|
62
|
+
nextCursor?: string;
|
|
63
|
+
protocol: typeof import("@relkit/observability").OBSERVABILITY_QUERY_PROTOCOL;
|
|
64
|
+
version: typeof import("@relkit/observability").OBSERVABILITY_QUERY_VERSION;
|
|
65
|
+
} | {
|
|
66
|
+
trace: import("@relkit/observability/local/record").StoredLocalRecord | undefined;
|
|
67
|
+
spans: import("@relkit/observability").SpanRecord[];
|
|
68
|
+
records: readonly import("@relkit/observability/local/record").StoredLocalRecord[];
|
|
69
|
+
items: readonly import("@relkit/observability/local/record").StoredLocalRecord[];
|
|
70
|
+
nextCursor?: string;
|
|
71
|
+
protocol: typeof import("@relkit/observability").OBSERVABILITY_QUERY_PROTOCOL;
|
|
72
|
+
version: typeof import("@relkit/observability").OBSERVABILITY_QUERY_VERSION;
|
|
73
|
+
} | undefined, import("./duckdb-query-error.js").DuckdbQueryError | import("./duckdb-error.js").DuckdbError, never>;
|
|
74
|
+
}, import("./duckdb-error.js").DuckdbError, import("effect/Scope").Scope | DuckdbDriverService>;
|
|
75
|
+
/**
|
|
76
|
+
* Provides a scoped database service using an injectable DuckdbDriverService.
|
|
77
|
+
*
|
|
78
|
+
* @param root - Private local storage directory.
|
|
79
|
+
* @param configured - Initial retention policy.
|
|
80
|
+
* @param redaction - Initial redaction policy.
|
|
81
|
+
* @returns A Layer whose scope owns both native DuckDB handles.
|
|
82
|
+
* @example
|
|
83
|
+
* const program = Effect.gen(function* () { return yield* DuckdbDatabaseService; });
|
|
84
|
+
* const layer = duckdbDatabaseLayer(root);
|
|
85
|
+
*/
|
|
86
|
+
export declare function duckdbDatabaseLayer(root: string, configured?: TelemetryLocalRetentionPolicy, redaction?: RedactionPolicy): Layer.Layer<DuckdbDatabaseService, import("./duckdb-error.js").DuckdbError, DuckdbDriverService>;
|
|
87
|
+
export {};
|
|
88
|
+
//# sourceMappingURL=duckdb-database-effect.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"duckdb-database-effect.d.ts","sourceRoot":"","sources":["../../src/local/duckdb-database-effect.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAa,MAAM,QAAQ,CAAC;AAC3D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAC7D,OAAO,KAAK,EAAE,6BAA6B,EAAE,MAAM,uBAAuB,CAAC;AAC3E,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AACxE,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;;;;AAOzD;;;;;;GAMG;AAEH,qBAAa,qBAAsB,SAAQ,0BAKzC;CAAG;AACL;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,wBAAwB;;;;;;mEAZO,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;+FAiD3C,CAAC;AACH;;;;;;;;;;GAUG;AACH,wBAAgB,mBAAmB,CACjC,IAAI,EAAE,MAAM,EACZ,UAAU,GAAE,6BAAkC,EAC9C,SAAS,CAAC,EAAE,eAAe,oGAM5B"}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Owns duckdb database 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 { chmod, mkdir } from "node:fs/promises";
|
|
7
|
+
import { join } from "node:path";
|
|
8
|
+
import { Context, Effect, Layer, Semaphore } from "effect";
|
|
9
|
+
import { DuckdbDriverService } from "./duckdb-driver.js";
|
|
10
|
+
import { duckdbError } from "./duckdb-error.js";
|
|
11
|
+
import { observeDuckdb } from "./duckdb-metrics.js";
|
|
12
|
+
import { makeDuckdbQueryEffect } from "./duckdb-query-effect.js";
|
|
13
|
+
import { initializeDuckdbSchema } from "./duckdb-schema.js";
|
|
14
|
+
import { makeDuckdbStorage } from "./duckdb-storage.js";
|
|
15
|
+
import { importLocalHistoryEffect } from "./import-history-effect.js";
|
|
16
|
+
/**
|
|
17
|
+
* Database operations provided for one owned Effect Scope.
|
|
18
|
+
*
|
|
19
|
+
* @example
|
|
20
|
+
* const database = yield* DuckdbDatabaseService;
|
|
21
|
+
* yield* database.flush();
|
|
22
|
+
*/
|
|
23
|
+
// prettier-ignore
|
|
24
|
+
export class DuckdbDatabaseService extends Context.Service()("@relkit/observability/DuckdbDatabase", {
|
|
25
|
+
make: (root, configured = {}, redaction) => openDuckdbDatabaseEffect(root, configured, redaction),
|
|
26
|
+
}) {
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Acquires an instance and connection in the caller's Scope, initializes schema,
|
|
30
|
+
* and returns Effect operations. Scope finalizers close the connection first,
|
|
31
|
+
* then the instance, including on setup failure or interruption.
|
|
32
|
+
*
|
|
33
|
+
* @param root - Private local storage directory.
|
|
34
|
+
* @param configured - Initial retention policy.
|
|
35
|
+
* @param redaction - Initial redaction policy.
|
|
36
|
+
* @returns A scoped database service or a tagged DuckdbError.
|
|
37
|
+
* @example
|
|
38
|
+
* const database = yield* openDuckdbDatabaseEffect(root);
|
|
39
|
+
* yield* database.flush();
|
|
40
|
+
*/
|
|
41
|
+
export const openDuckdbDatabaseEffect = Effect.fn("ObservabilityDuckdb.open")(function* (root, configured = {}, redaction) {
|
|
42
|
+
return yield* observeDuckdb("open", Effect.gen(function* () {
|
|
43
|
+
const driver = yield* DuckdbDriverService;
|
|
44
|
+
yield* Effect.tryPromise({
|
|
45
|
+
try: () => mkdir(root, { recursive: true, mode: 0o700 }),
|
|
46
|
+
catch: (cause) => duckdbError("mkdir", cause),
|
|
47
|
+
});
|
|
48
|
+
const path = join(root, "observability.duckdb");
|
|
49
|
+
const instance = yield* Effect.acquireRelease(driver.create(path), (owned) => Effect.sync(() => owned.closeSync()));
|
|
50
|
+
const connection = yield* Effect.acquireRelease(Effect.tryPromise({
|
|
51
|
+
try: () => instance.connect(),
|
|
52
|
+
catch: (cause) => duckdbError("connect", cause),
|
|
53
|
+
}), (owned) => Effect.sync(() => owned.closeSync()));
|
|
54
|
+
yield* Effect.tryPromise({
|
|
55
|
+
try: () => chmod(path, 0o600),
|
|
56
|
+
catch: (cause) => duckdbError("chmod", cause),
|
|
57
|
+
});
|
|
58
|
+
yield* initializeDuckdbSchema(connection);
|
|
59
|
+
const permit = yield* Semaphore.make(1);
|
|
60
|
+
const storage = makeDuckdbStorage(connection, permit, configured, redaction);
|
|
61
|
+
const query = makeDuckdbQueryEffect(connection, permit);
|
|
62
|
+
const imported = yield* importLocalHistoryEffect(root, connection, storage.append);
|
|
63
|
+
yield* storage.flush();
|
|
64
|
+
return { ...query, ...storage, imported };
|
|
65
|
+
}));
|
|
66
|
+
});
|
|
67
|
+
/**
|
|
68
|
+
* Provides a scoped database service using an injectable DuckdbDriverService.
|
|
69
|
+
*
|
|
70
|
+
* @param root - Private local storage directory.
|
|
71
|
+
* @param configured - Initial retention policy.
|
|
72
|
+
* @param redaction - Initial redaction policy.
|
|
73
|
+
* @returns A Layer whose scope owns both native DuckDB handles.
|
|
74
|
+
* @example
|
|
75
|
+
* const program = Effect.gen(function* () { return yield* DuckdbDatabaseService; });
|
|
76
|
+
* const layer = duckdbDatabaseLayer(root);
|
|
77
|
+
*/
|
|
78
|
+
export function duckdbDatabaseLayer(root, configured = {}, redaction) {
|
|
79
|
+
return Layer.effect(DuckdbDatabaseService, DuckdbDatabaseService.make(root, configured, redaction));
|
|
80
|
+
}
|
|
81
|
+
//# sourceMappingURL=duckdb-database-effect.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"duckdb-database-effect.js","sourceRoot":"","sources":["../../src/local/duckdb-database-effect.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Owns duckdb database 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 type { RedactionPolicy } from "@relkit/observability";
|
|
8
|
+
import type { TelemetryLocalRetentionPolicy } from "@relkit/observability";
|
|
9
|
+
import { DuckdbQueryError } from "./duckdb-query-error.js";
|
|
10
|
+
/**
|
|
11
|
+
* Opens a private DuckDB database and owns its Effect Scope until close.
|
|
12
|
+
* The scoped Effect implementation contains acquisition and operation logic.
|
|
13
|
+
*
|
|
14
|
+
* @param root - Directory containing the local database file.
|
|
15
|
+
* @param configured - Initial retention policy.
|
|
16
|
+
* @param redaction - Initial redaction policy.
|
|
17
|
+
* @returns A live Promise API with append, query, configure, flush, and close.
|
|
18
|
+
* @throws {DuckdbError} If acquisition, storage, or import fails.
|
|
19
|
+
* @example
|
|
20
|
+
* const database = await openDuckdbDatabase(root);
|
|
21
|
+
* await database.close();
|
|
22
|
+
*/
|
|
23
|
+
export declare function openDuckdbDatabase(root: string, configured?: TelemetryLocalRetentionPolicy, redaction?: RedactionPolicy): Promise<{
|
|
24
|
+
imported: {
|
|
25
|
+
records: number;
|
|
26
|
+
malformed: number;
|
|
27
|
+
};
|
|
28
|
+
append: (records: Parameters<(records: readonly import("@relkit/observability/local/record").LocalRecord[]) => Effect.Effect<import("@relkit/observability/local/record").StoredLocalRecord[], import("./duckdb-error.js").DuckdbError>>[0]) => Promise<import("@relkit/observability/local/record").StoredLocalRecord[]>;
|
|
29
|
+
list: (kind: Parameters<(kind: "logs" | "requests" | "traces", input?: import("@relkit/observability").ObservabilityQueryRequest | undefined) => Effect.Effect<import("@relkit/observability").ObservabilityQueryPage<import("@relkit/observability/local/record").StoredLocalRecord>, DuckdbQueryError | import("./duckdb-error.js").DuckdbError, never>>[0], input?: Parameters<(kind: "logs" | "requests" | "traces", input?: import("@relkit/observability").ObservabilityQueryRequest | undefined) => Effect.Effect<import("@relkit/observability").ObservabilityQueryPage<import("@relkit/observability/local/record").StoredLocalRecord>, DuckdbQueryError | import("./duckdb-error.js").DuckdbError, never>>[1]) => Promise<import("@relkit/observability").ObservabilityQueryPage<import("@relkit/observability/local/record").StoredLocalRecord>>;
|
|
30
|
+
detail: (kind: Parameters<(kind: "trace" | "request" | "log", id: string) => Effect.Effect<{
|
|
31
|
+
log: import("@relkit/observability/local/record").StoredLocalRecord;
|
|
32
|
+
items: readonly never[];
|
|
33
|
+
nextCursor?: string;
|
|
34
|
+
protocol: typeof import("@relkit/observability").OBSERVABILITY_QUERY_PROTOCOL;
|
|
35
|
+
version: typeof import("@relkit/observability").OBSERVABILITY_QUERY_VERSION;
|
|
36
|
+
} | {
|
|
37
|
+
request: import("@relkit/observability").RequestRecord;
|
|
38
|
+
spans: readonly import("@relkit/observability").SpanRecord[];
|
|
39
|
+
roots: readonly import("@relkit/observability").SpanNode[];
|
|
40
|
+
continuations: readonly {
|
|
41
|
+
readonly traceId: string;
|
|
42
|
+
readonly active: boolean;
|
|
43
|
+
}[];
|
|
44
|
+
records: readonly import("@relkit/observability").ObservabilityRecord[];
|
|
45
|
+
counts: {
|
|
46
|
+
readonly records: number;
|
|
47
|
+
readonly spans: number;
|
|
48
|
+
readonly continuations: number;
|
|
49
|
+
};
|
|
50
|
+
incomplete: readonly string[];
|
|
51
|
+
items: readonly never[];
|
|
52
|
+
nextCursor?: string;
|
|
53
|
+
protocol: typeof import("@relkit/observability").OBSERVABILITY_QUERY_PROTOCOL;
|
|
54
|
+
version: typeof import("@relkit/observability").OBSERVABILITY_QUERY_VERSION;
|
|
55
|
+
} | {
|
|
56
|
+
trace: import("@relkit/observability/local/record").StoredLocalRecord | undefined;
|
|
57
|
+
spans: import("@relkit/observability").SpanRecord[];
|
|
58
|
+
records: readonly import("@relkit/observability/local/record").StoredLocalRecord[];
|
|
59
|
+
items: readonly import("@relkit/observability/local/record").StoredLocalRecord[];
|
|
60
|
+
nextCursor?: string;
|
|
61
|
+
protocol: typeof import("@relkit/observability").OBSERVABILITY_QUERY_PROTOCOL;
|
|
62
|
+
version: typeof import("@relkit/observability").OBSERVABILITY_QUERY_VERSION;
|
|
63
|
+
} | undefined, DuckdbQueryError | import("./duckdb-error.js").DuckdbError, never>>[0], id: string) => Promise<{
|
|
64
|
+
log: import("@relkit/observability/local/record").StoredLocalRecord;
|
|
65
|
+
items: readonly never[];
|
|
66
|
+
nextCursor?: string;
|
|
67
|
+
protocol: typeof import("@relkit/observability").OBSERVABILITY_QUERY_PROTOCOL;
|
|
68
|
+
version: typeof import("@relkit/observability").OBSERVABILITY_QUERY_VERSION;
|
|
69
|
+
} | {
|
|
70
|
+
request: import("@relkit/observability").RequestRecord;
|
|
71
|
+
spans: readonly import("@relkit/observability").SpanRecord[];
|
|
72
|
+
roots: readonly import("@relkit/observability").SpanNode[];
|
|
73
|
+
continuations: readonly {
|
|
74
|
+
readonly traceId: string;
|
|
75
|
+
readonly active: boolean;
|
|
76
|
+
}[];
|
|
77
|
+
records: readonly import("@relkit/observability").ObservabilityRecord[];
|
|
78
|
+
counts: {
|
|
79
|
+
readonly records: number;
|
|
80
|
+
readonly spans: number;
|
|
81
|
+
readonly continuations: number;
|
|
82
|
+
};
|
|
83
|
+
incomplete: readonly string[];
|
|
84
|
+
items: readonly never[];
|
|
85
|
+
nextCursor?: string;
|
|
86
|
+
protocol: typeof import("@relkit/observability").OBSERVABILITY_QUERY_PROTOCOL;
|
|
87
|
+
version: typeof import("@relkit/observability").OBSERVABILITY_QUERY_VERSION;
|
|
88
|
+
} | {
|
|
89
|
+
trace: import("@relkit/observability/local/record").StoredLocalRecord | undefined;
|
|
90
|
+
spans: import("@relkit/observability").SpanRecord[];
|
|
91
|
+
records: readonly import("@relkit/observability/local/record").StoredLocalRecord[];
|
|
92
|
+
items: readonly import("@relkit/observability/local/record").StoredLocalRecord[];
|
|
93
|
+
nextCursor?: string;
|
|
94
|
+
protocol: typeof import("@relkit/observability").OBSERVABILITY_QUERY_PROTOCOL;
|
|
95
|
+
version: typeof import("@relkit/observability").OBSERVABILITY_QUERY_VERSION;
|
|
96
|
+
} | undefined>;
|
|
97
|
+
configure: (value: TelemetryLocalRetentionPolicy, nextRedaction?: RedactionPolicy) => Promise<void>;
|
|
98
|
+
flush: () => Promise<void>;
|
|
99
|
+
close: () => Promise<void>;
|
|
100
|
+
}>;
|
|
101
|
+
//# sourceMappingURL=duckdb-database.d.ts.map
|