66 lines
1.5 KiB
TypeScript
66 lines
1.5 KiB
TypeScript
import type { InferredDarkEvent } from "@islandflow/types";
|
|
|
|
export const INFERRED_DARK_TABLE = "inferred_dark";
|
|
|
|
export type InferredDarkRecord = {
|
|
source_ts: number;
|
|
ingest_ts: number;
|
|
seq: number;
|
|
trace_id: string;
|
|
type: string;
|
|
confidence: number;
|
|
evidence_refs_json: string;
|
|
};
|
|
|
|
export const inferredDarkTableDDL = (): string => {
|
|
return `
|
|
CREATE TABLE IF NOT EXISTS ${INFERRED_DARK_TABLE} (
|
|
source_ts UInt64,
|
|
ingest_ts UInt64,
|
|
seq UInt64,
|
|
trace_id String,
|
|
type String,
|
|
confidence Float64,
|
|
evidence_refs_json String
|
|
)
|
|
ENGINE = MergeTree
|
|
ORDER BY (source_ts, seq)
|
|
`;
|
|
};
|
|
|
|
export const toInferredDarkRecord = (event: InferredDarkEvent): InferredDarkRecord => {
|
|
return {
|
|
source_ts: event.source_ts,
|
|
ingest_ts: event.ingest_ts,
|
|
seq: event.seq,
|
|
trace_id: event.trace_id,
|
|
type: event.type,
|
|
confidence: event.confidence,
|
|
evidence_refs_json: JSON.stringify(event.evidence_refs)
|
|
};
|
|
};
|
|
|
|
const safeStringArray = (value: string): string[] => {
|
|
try {
|
|
const parsed = JSON.parse(value);
|
|
if (Array.isArray(parsed)) {
|
|
return parsed.map((entry) => String(entry));
|
|
}
|
|
} catch {
|
|
// ignore
|
|
}
|
|
|
|
return [];
|
|
};
|
|
|
|
export const fromInferredDarkRecord = (record: InferredDarkRecord): InferredDarkEvent => {
|
|
return {
|
|
source_ts: record.source_ts,
|
|
ingest_ts: record.ingest_ts,
|
|
seq: record.seq,
|
|
trace_id: record.trace_id,
|
|
type: record.type,
|
|
confidence: record.confidence,
|
|
evidence_refs: safeStringArray(record.evidence_refs_json)
|
|
};
|
|
};
|