@wide-events/collector 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.
Files changed (75) hide show
  1. package/LICENSE +6 -0
  2. package/README.md +20 -0
  3. package/dist/cli.d.ts +3 -0
  4. package/dist/cli.d.ts.map +1 -0
  5. package/dist/cli.js +11 -0
  6. package/dist/cli.js.map +1 -0
  7. package/dist/config.d.ts +13 -0
  8. package/dist/config.d.ts.map +1 -0
  9. package/dist/config.js +29 -0
  10. package/dist/config.js.map +1 -0
  11. package/dist/index.d.ts +4 -0
  12. package/dist/index.d.ts.map +1 -0
  13. package/dist/index.js +4 -0
  14. package/dist/index.js.map +1 -0
  15. package/dist/jobs/retention.d.ts +9 -0
  16. package/dist/jobs/retention.d.ts.map +1 -0
  17. package/dist/jobs/retention.js +19 -0
  18. package/dist/jobs/retention.js.map +1 -0
  19. package/dist/otlp/flatten.d.ts +5 -0
  20. package/dist/otlp/flatten.d.ts.map +1 -0
  21. package/dist/otlp/flatten.js +139 -0
  22. package/dist/otlp/flatten.js.map +1 -0
  23. package/dist/otlp/types.d.ts +39 -0
  24. package/dist/otlp/types.d.ts.map +1 -0
  25. package/dist/otlp/types.js +2 -0
  26. package/dist/otlp/types.js.map +1 -0
  27. package/dist/query/build-query.d.ts +8 -0
  28. package/dist/query/build-query.d.ts.map +1 -0
  29. package/dist/query/build-query.js +104 -0
  30. package/dist/query/build-query.js.map +1 -0
  31. package/dist/routes/columns.d.ts +4 -0
  32. package/dist/routes/columns.d.ts.map +1 -0
  33. package/dist/routes/columns.js +6 -0
  34. package/dist/routes/columns.js.map +1 -0
  35. package/dist/routes/health.d.ts +3 -0
  36. package/dist/routes/health.d.ts.map +1 -0
  37. package/dist/routes/health.js +6 -0
  38. package/dist/routes/health.js.map +1 -0
  39. package/dist/routes/query.d.ts +4 -0
  40. package/dist/routes/query.d.ts.map +1 -0
  41. package/dist/routes/query.js +12 -0
  42. package/dist/routes/query.js.map +1 -0
  43. package/dist/routes/sql.d.ts +4 -0
  44. package/dist/routes/sql.d.ts.map +1 -0
  45. package/dist/routes/sql.js +15 -0
  46. package/dist/routes/sql.js.map +1 -0
  47. package/dist/routes/trace.d.ts +4 -0
  48. package/dist/routes/trace.d.ts.map +1 -0
  49. package/dist/routes/trace.js +11 -0
  50. package/dist/routes/trace.js.map +1 -0
  51. package/dist/routes/v1-traces.d.ts +4 -0
  52. package/dist/routes/v1-traces.d.ts.map +1 -0
  53. package/dist/routes/v1-traces.js +11 -0
  54. package/dist/routes/v1-traces.js.map +1 -0
  55. package/dist/server.d.ts +21 -0
  56. package/dist/server.d.ts.map +1 -0
  57. package/dist/server.js +60 -0
  58. package/dist/server.js.map +1 -0
  59. package/dist/storage/database.d.ts +12 -0
  60. package/dist/storage/database.d.ts.map +1 -0
  61. package/dist/storage/database.js +82 -0
  62. package/dist/storage/database.js.map +1 -0
  63. package/dist/storage/schema-registry.d.ts +12 -0
  64. package/dist/storage/schema-registry.d.ts.map +1 -0
  65. package/dist/storage/schema-registry.js +59 -0
  66. package/dist/storage/schema-registry.js.map +1 -0
  67. package/dist/storage/serialized-executor.d.ts +5 -0
  68. package/dist/storage/serialized-executor.d.ts.map +1 -0
  69. package/dist/storage/serialized-executor.js +9 -0
  70. package/dist/storage/serialized-executor.js.map +1 -0
  71. package/dist/storage/store.d.ts +19 -0
  72. package/dist/storage/store.d.ts.map +1 -0
  73. package/dist/storage/store.js +134 -0
  74. package/dist/storage/store.js.map +1 -0
  75. package/package.json +37 -0
package/LICENSE ADDED
@@ -0,0 +1,6 @@
1
+ GNU AFFERO GENERAL PUBLIC LICENSE
2
+ Version 3, 19 November 2007
3
+
4
+ This package is licensed under AGPL-3.0-only.
5
+ See the repository root `LICENSE` file for full terms:
6
+ https://www.gnu.org/licenses/agpl-3.0.txt
package/README.md ADDED
@@ -0,0 +1,20 @@
1
+ # @wide-events/collector
2
+
3
+ Collector service and CLI for ingesting OTLP traces and querying DuckDB-backed
4
+ wide events.
5
+
6
+ ## Install
7
+
8
+ ```bash
9
+ npm install @wide-events/collector
10
+ ```
11
+
12
+ ## Run
13
+
14
+ ```bash
15
+ WIDE_EVENTS_DUCKDB_PATH=./wide-events.db npx wide-events-collector
16
+ ```
17
+
18
+ ## Required Environment Variables
19
+
20
+ - `WIDE_EVENTS_DUCKDB_PATH`: path to the DuckDB file.
package/dist/cli.d.ts ADDED
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=cli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":""}
package/dist/cli.js ADDED
@@ -0,0 +1,11 @@
1
+ #!/usr/bin/env node
2
+ import { createCollectorServer } from "./server.js";
3
+ const server = await createCollectorServer();
4
+ try {
5
+ await server.start();
6
+ }
7
+ catch (error) {
8
+ console.error("Failed to start collector", error);
9
+ process.exitCode = 1;
10
+ }
11
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AAEpD,MAAM,MAAM,GAAG,MAAM,qBAAqB,EAAE,CAAC;AAE7C,IAAI,CAAC;IACH,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;AACvB,CAAC;AAAC,OAAO,KAAK,EAAE,CAAC;IACf,OAAO,CAAC,KAAK,CAAC,2BAA2B,EAAE,KAAK,CAAC,CAAC;IAClD,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;AACvB,CAAC"}
@@ -0,0 +1,13 @@
1
+ import { z } from "zod";
2
+ export declare const collectorConfigSchema: z.ZodObject<{
3
+ duckDbPath: z.ZodString;
4
+ port: z.ZodDefault<z.ZodNumber>;
5
+ batchSize: z.ZodDefault<z.ZodNumber>;
6
+ batchTimeoutMs: z.ZodDefault<z.ZodNumber>;
7
+ retentionDays: z.ZodDefault<z.ZodNumber>;
8
+ maxColumns: z.ZodDefault<z.ZodNumber>;
9
+ queueLimit: z.ZodDefault<z.ZodNumber>;
10
+ }, z.core.$strip>;
11
+ export type CollectorConfig = z.infer<typeof collectorConfigSchema>;
12
+ export declare function readCollectorConfig(env?: NodeJS.ProcessEnv): CollectorConfig;
13
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,eAAO,MAAM,qBAAqB;;;;;;;;iBAQhC,CAAC;AAEH,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,qBAAqB,CAAC,CAAC;AAEpE,wBAAgB,mBAAmB,CACjC,GAAG,GAAE,MAAM,CAAC,UAAwB,GACnC,eAAe,CAUjB"}
package/dist/config.js ADDED
@@ -0,0 +1,29 @@
1
+ import { z } from "zod";
2
+ export const collectorConfigSchema = z.object({
3
+ duckDbPath: z.string().min(1),
4
+ port: z.number().int().positive().default(4318),
5
+ batchSize: z.number().int().positive().default(100),
6
+ batchTimeoutMs: z.number().int().positive().default(1_000),
7
+ retentionDays: z.number().int().positive().default(30),
8
+ maxColumns: z.number().int().positive().default(200),
9
+ queueLimit: z.number().int().positive().default(10_000)
10
+ });
11
+ export function readCollectorConfig(env = process.env) {
12
+ return collectorConfigSchema.parse({
13
+ duckDbPath: env["WIDE_EVENTS_DUCKDB_PATH"],
14
+ port: parseInteger(env["WIDE_EVENTS_COLLECTOR_PORT"], 4318),
15
+ batchSize: parseInteger(env["WIDE_EVENTS_BATCH_SIZE"], 100),
16
+ batchTimeoutMs: parseInteger(env["WIDE_EVENTS_BATCH_TIMEOUT_MS"], 1_000),
17
+ retentionDays: parseInteger(env["WIDE_EVENTS_RETENTION_DAYS"], 30),
18
+ maxColumns: parseInteger(env["WIDE_EVENTS_MAX_COLUMNS"], 200),
19
+ queueLimit: parseInteger(env["WIDE_EVENTS_QUEUE_LIMIT"], 10_000)
20
+ });
21
+ }
22
+ function parseInteger(value, fallback) {
23
+ if (!value) {
24
+ return fallback;
25
+ }
26
+ const parsed = Number.parseInt(value, 10);
27
+ return Number.isFinite(parsed) ? parsed : fallback;
28
+ }
29
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC5C,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IAC7B,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC;IAC/C,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC;IACnD,cAAc,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC;IAC1D,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC;IACtD,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC;IACpD,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC;CACxD,CAAC,CAAC;AAIH,MAAM,UAAU,mBAAmB,CACjC,MAAyB,OAAO,CAAC,GAAG;IAEpC,OAAO,qBAAqB,CAAC,KAAK,CAAC;QACjC,UAAU,EAAE,GAAG,CAAC,yBAAyB,CAAC;QAC1C,IAAI,EAAE,YAAY,CAAC,GAAG,CAAC,4BAA4B,CAAC,EAAE,IAAI,CAAC;QAC3D,SAAS,EAAE,YAAY,CAAC,GAAG,CAAC,wBAAwB,CAAC,EAAE,GAAG,CAAC;QAC3D,cAAc,EAAE,YAAY,CAAC,GAAG,CAAC,8BAA8B,CAAC,EAAE,KAAK,CAAC;QACxE,aAAa,EAAE,YAAY,CAAC,GAAG,CAAC,4BAA4B,CAAC,EAAE,EAAE,CAAC;QAClE,UAAU,EAAE,YAAY,CAAC,GAAG,CAAC,yBAAyB,CAAC,EAAE,GAAG,CAAC;QAC7D,UAAU,EAAE,YAAY,CAAC,GAAG,CAAC,yBAAyB,CAAC,EAAE,MAAM,CAAC;KACjE,CAAC,CAAC;AACL,CAAC;AAED,SAAS,YAAY,CAAC,KAAyB,EAAE,QAAgB;IAC/D,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IAC1C,OAAO,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC;AACrD,CAAC"}
@@ -0,0 +1,4 @@
1
+ export * from "./config.js";
2
+ export * from "./query/build-query.js";
3
+ export * from "./server.js";
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,wBAAwB,CAAC;AACvC,cAAc,aAAa,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,4 @@
1
+ export * from "./config.js";
2
+ export * from "./query/build-query.js";
3
+ export * from "./server.js";
4
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,wBAAwB,CAAC;AACvC,cAAc,aAAa,CAAC"}
@@ -0,0 +1,9 @@
1
+ import type { CollectorStore } from "../storage/store.js";
2
+ export declare class RetentionJob {
3
+ private readonly store;
4
+ private timer;
5
+ constructor(store: CollectorStore);
6
+ start(): void;
7
+ stop(): void;
8
+ }
9
+ //# sourceMappingURL=retention.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"retention.d.ts","sourceRoot":"","sources":["../../src/jobs/retention.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAE1D,qBAAa,YAAY;IAGX,OAAO,CAAC,QAAQ,CAAC,KAAK;IAFlC,OAAO,CAAC,KAAK,CAA6B;gBAEb,KAAK,EAAE,cAAc;IAElD,KAAK,IAAI,IAAI;IAMb,IAAI,IAAI,IAAI;CAMb"}
@@ -0,0 +1,19 @@
1
+ export class RetentionJob {
2
+ store;
3
+ timer;
4
+ constructor(store) {
5
+ this.store = store;
6
+ }
7
+ start() {
8
+ this.timer = setInterval(() => {
9
+ void this.store.runRetention();
10
+ }, 24 * 60 * 60 * 1_000);
11
+ }
12
+ stop() {
13
+ if (this.timer) {
14
+ clearInterval(this.timer);
15
+ this.timer = undefined;
16
+ }
17
+ }
18
+ }
19
+ //# sourceMappingURL=retention.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"retention.js","sourceRoot":"","sources":["../../src/jobs/retention.ts"],"names":[],"mappings":"AAEA,MAAM,OAAO,YAAY;IAGM;IAFrB,KAAK,CAA6B;IAE1C,YAA6B,KAAqB;QAArB,UAAK,GAAL,KAAK,CAAgB;IAAG,CAAC;IAEtD,KAAK;QACH,IAAI,CAAC,KAAK,GAAG,WAAW,CAAC,GAAG,EAAE;YAC5B,KAAK,IAAI,CAAC,KAAK,CAAC,YAAY,EAAE,CAAC;QACjC,CAAC,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,KAAK,CAAC,CAAC;IAC3B,CAAC;IAED,IAAI;QACF,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YACf,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAC1B,IAAI,CAAC,KAAK,GAAG,SAAS,CAAC;QACzB,CAAC;IACH,CAAC;CACF"}
@@ -0,0 +1,5 @@
1
+ import { type DynamicEventAttributes, type FlatEventRow } from "@wide-events/internal";
2
+ import type { OtlpExportTraceServiceRequest, OtlpSpan } from "./types.js";
3
+ export declare function flattenTraceRequest(request: OtlpExportTraceServiceRequest): FlatEventRow[];
4
+ export declare function flattenSpan(resourceAttributes: DynamicEventAttributes, span: OtlpSpan): FlatEventRow;
5
+ //# sourceMappingURL=flatten.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"flatten.d.ts","sourceRoot":"","sources":["../../src/otlp/flatten.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,sBAAsB,EAE3B,KAAK,YAAY,EAClB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,KAAK,EAEV,6BAA6B,EAE7B,QAAQ,EACT,MAAM,YAAY,CAAC;AAEpB,wBAAgB,mBAAmB,CACjC,OAAO,EAAE,6BAA6B,GACrC,YAAY,EAAE,CAgBhB;AAED,wBAAgB,WAAW,CACzB,kBAAkB,EAAE,sBAAsB,EAC1C,IAAI,EAAE,QAAQ,GACb,YAAY,CAiDd"}
@@ -0,0 +1,139 @@
1
+ import { normalizeEventPrimitive } from "@wide-events/internal";
2
+ export function flattenTraceRequest(request) {
3
+ const rows = [];
4
+ for (const resourceSpan of request.resourceSpans ?? []) {
5
+ const resourceAttributes = extractAttributes(resourceSpan.resource?.attributes ?? []);
6
+ for (const scopeSpan of resourceSpan.scopeSpans ?? []) {
7
+ for (const span of scopeSpan.spans ?? []) {
8
+ rows.push(flattenSpan(resourceAttributes, span));
9
+ }
10
+ }
11
+ }
12
+ return rows;
13
+ }
14
+ export function flattenSpan(resourceAttributes, span) {
15
+ const spanAttributes = extractAttributes(span.attributes ?? []);
16
+ const merged = { ...resourceAttributes, ...spanAttributes };
17
+ const startTime = parseNanoseconds(span.startTimeUnixNano);
18
+ const endTime = parseNanoseconds(span.endTimeUnixNano);
19
+ const durationMs = startTime !== null && endTime !== null ? Number(endTime - startTime) / 1_000_000 : null;
20
+ const traceId = requireString(span.traceId, "span.traceId");
21
+ const spanId = requireString(span.spanId, "span.spanId");
22
+ const row = {
23
+ trace_id: traceId,
24
+ span_id: spanId,
25
+ parent_span_id: span.parentSpanId?.trim() ? span.parentSpanId : null,
26
+ ts: startTime === null ? new Date(0).toISOString() : new Date(Number(startTime / 1000000n)).toISOString(),
27
+ duration_ms: durationMs,
28
+ main: typeof merged["main"] === "boolean"
29
+ ? merged["main"]
30
+ : !(span.parentSpanId && span.parentSpanId.length > 0),
31
+ sample_rate: normalizeInteger(merged["sample_rate"], 1),
32
+ "service.name": expectNullableString(merged["service.name"]),
33
+ "service.environment": expectNullableString(merged["service.environment"]),
34
+ "service.version": expectNullableString(merged["service.version"]),
35
+ "http.route": expectNullableString(merged["http.route"]),
36
+ "http.status_code": normalizeNullableInteger(merged["http.status_code"]),
37
+ "http.request.method": expectNullableString(merged["http.request.method"] ?? merged["http.method"]),
38
+ error: normalizeNullableBoolean(merged["error"]),
39
+ "exception.slug": expectNullableString(merged["exception.slug"] ?? merged["exception.type"]),
40
+ "user.id": expectNullableString(merged["user.id"]),
41
+ "user.type": expectNullableString(merged["user.type"]),
42
+ "user.org.id": expectNullableString(merged["user.org.id"])
43
+ };
44
+ for (const [key, value] of Object.entries(merged)) {
45
+ if (key in row) {
46
+ continue;
47
+ }
48
+ row[key] = typeof value === "string" ? value : JSON.stringify(value);
49
+ }
50
+ return row;
51
+ }
52
+ function extractAttributes(attributes) {
53
+ const result = {};
54
+ for (const attribute of attributes) {
55
+ if (!attribute.key) {
56
+ continue;
57
+ }
58
+ result[attribute.key] = normalizeAnyValue(attribute.value);
59
+ }
60
+ return result;
61
+ }
62
+ function normalizeAnyValue(value) {
63
+ if (!value) {
64
+ return null;
65
+ }
66
+ if (typeof value.stringValue === "string") {
67
+ return value.stringValue;
68
+ }
69
+ if (typeof value.boolValue === "boolean") {
70
+ return value.boolValue;
71
+ }
72
+ if (typeof value.doubleValue === "number") {
73
+ return value.doubleValue;
74
+ }
75
+ if (typeof value.intValue === "string") {
76
+ return Number.parseInt(value.intValue, 10);
77
+ }
78
+ if (value.arrayValue?.values) {
79
+ return normalizeEventPrimitive(value.arrayValue.values.map(normalizeAnyValue));
80
+ }
81
+ if (value.kvlistValue?.values) {
82
+ const nested = {};
83
+ for (const entry of value.kvlistValue.values) {
84
+ if (!entry.key) {
85
+ continue;
86
+ }
87
+ nested[entry.key] = normalizeAnyValue(entry.value);
88
+ }
89
+ return normalizeEventPrimitive(nested);
90
+ }
91
+ return null;
92
+ }
93
+ function parseNanoseconds(value) {
94
+ if (!value) {
95
+ return null;
96
+ }
97
+ return BigInt(value);
98
+ }
99
+ function requireString(value, label) {
100
+ if (!value) {
101
+ throw new Error(`${label} is required`);
102
+ }
103
+ return value;
104
+ }
105
+ function expectNullableString(value) {
106
+ if (typeof value === "undefined" || value === null) {
107
+ return null;
108
+ }
109
+ return typeof value === "string" ? value : String(value);
110
+ }
111
+ function normalizeInteger(value, fallback) {
112
+ const normalized = normalizeNullableInteger(value);
113
+ return normalized ?? fallback;
114
+ }
115
+ function normalizeNullableInteger(value) {
116
+ if (typeof value === "number" && Number.isFinite(value)) {
117
+ return Math.trunc(value);
118
+ }
119
+ if (typeof value === "string" && value.length > 0) {
120
+ const parsed = Number.parseInt(value, 10);
121
+ return Number.isFinite(parsed) ? parsed : null;
122
+ }
123
+ return null;
124
+ }
125
+ function normalizeNullableBoolean(value) {
126
+ if (typeof value === "boolean") {
127
+ return value;
128
+ }
129
+ if (typeof value === "string") {
130
+ if (value === "true") {
131
+ return true;
132
+ }
133
+ if (value === "false") {
134
+ return false;
135
+ }
136
+ }
137
+ return null;
138
+ }
139
+ //# sourceMappingURL=flatten.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"flatten.js","sourceRoot":"","sources":["../../src/otlp/flatten.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,39 @@
1
+ export interface OtlpExportTraceServiceRequest {
2
+ resourceSpans?: OtlpResourceSpan[];
3
+ }
4
+ export interface OtlpResourceSpan {
5
+ resource?: OtlpResource;
6
+ scopeSpans?: OtlpScopeSpan[];
7
+ }
8
+ export interface OtlpResource {
9
+ attributes?: OtlpKeyValue[];
10
+ }
11
+ export interface OtlpScopeSpan {
12
+ spans?: OtlpSpan[];
13
+ }
14
+ export interface OtlpSpan {
15
+ traceId?: string;
16
+ spanId?: string;
17
+ parentSpanId?: string;
18
+ name?: string;
19
+ startTimeUnixNano?: string;
20
+ endTimeUnixNano?: string;
21
+ attributes?: OtlpKeyValue[];
22
+ }
23
+ export interface OtlpKeyValue {
24
+ key?: string;
25
+ value?: OtlpAnyValue;
26
+ }
27
+ export interface OtlpAnyValue {
28
+ stringValue?: string;
29
+ boolValue?: boolean;
30
+ intValue?: string;
31
+ doubleValue?: number;
32
+ arrayValue?: {
33
+ values?: OtlpAnyValue[];
34
+ };
35
+ kvlistValue?: {
36
+ values?: OtlpKeyValue[];
37
+ };
38
+ }
39
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/otlp/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,6BAA6B;IAC5C,aAAa,CAAC,EAAE,gBAAgB,EAAE,CAAC;CACpC;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,EAAE,YAAY,CAAC;IACxB,UAAU,CAAC,EAAE,aAAa,EAAE,CAAC;CAC9B;AAED,MAAM,WAAW,YAAY;IAC3B,UAAU,CAAC,EAAE,YAAY,EAAE,CAAC;CAC7B;AAED,MAAM,WAAW,aAAa;IAC5B,KAAK,CAAC,EAAE,QAAQ,EAAE,CAAC;CACpB;AAED,MAAM,WAAW,QAAQ;IACvB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,UAAU,CAAC,EAAE,YAAY,EAAE,CAAC;CAC7B;AAED,MAAM,WAAW,YAAY;IAC3B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,YAAY,CAAC;CACtB;AAED,MAAM,WAAW,YAAY;IAC3B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE;QACX,MAAM,CAAC,EAAE,YAAY,EAAE,CAAC;KACzB,CAAC;IACF,WAAW,CAAC,EAAE;QACZ,MAAM,CAAC,EAAE,YAAY,EAAE,CAAC;KACzB,CAAC;CACH"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/otlp/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,8 @@
1
+ import { type EventPrimitive, type StructuredQuery } from "@wide-events/internal";
2
+ export interface CompiledQuery {
3
+ sql: string;
4
+ params: EventPrimitive[];
5
+ }
6
+ export declare function compileStructuredQuery(query: StructuredQuery): CompiledQuery;
7
+ export declare function assertReadOnlySql(sql: string): void;
8
+ //# sourceMappingURL=build-query.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"build-query.d.ts","sourceRoot":"","sources":["../../src/query/build-query.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,KAAK,cAAc,EAGnB,KAAK,eAAe,EACrB,MAAM,uBAAuB,CAAC;AAE/B,MAAM,WAAW,aAAa;IAC5B,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,cAAc,EAAE,CAAC;CAC1B;AAMD,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,eAAe,GAAG,aAAa,CAoC5E;AAED,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAKnD"}
@@ -0,0 +1,104 @@
1
+ import { parseDurationWindow, quoteIdentifier, sanitizeIdentifier } from "@wide-events/internal";
2
+ const MUTATING_SQL_PATTERN = /\b(insert|update|delete|alter|drop|create|replace|truncate|attach|detach|copy)\b/iu;
3
+ const READ_ONLY_SQL_PATTERN = /^(select|with|pragma|describe|show|explain)\b/iu;
4
+ export function compileStructuredQuery(query) {
5
+ if (query.select.length === 0) {
6
+ throw new Error("Structured query must include at least one select item");
7
+ }
8
+ const params = [];
9
+ const selectSql = query.select.map(compileSelect).join(", ");
10
+ const whereParts = [];
11
+ if (query.timeRange) {
12
+ const milliseconds = parseDurationWindow(query.timeRange.last);
13
+ params.push(new Date(Date.now() - milliseconds).toISOString());
14
+ whereParts.push("ts >= ?");
15
+ }
16
+ for (const filter of query.filters ?? []) {
17
+ whereParts.push(compileFilter(filter, params));
18
+ }
19
+ const groupBy = (query.groupBy ?? []).map(quoteIdentifier);
20
+ const orderBy = query.orderBy
21
+ ? ` ORDER BY ${quoteIdentifier(sanitizeIdentifier(query.orderBy.field))} ${query.orderBy.dir.toUpperCase() === "DESC" ? "DESC" : "ASC"}`
22
+ : "";
23
+ const limit = typeof query.limit === "number" ? ` LIMIT ${Math.max(1, Math.trunc(query.limit))}` : "";
24
+ const sql = `SELECT ${selectSql} FROM events` +
25
+ (whereParts.length > 0 ? ` WHERE ${whereParts.join(" AND ")}` : "") +
26
+ (groupBy.length > 0 ? ` GROUP BY ${groupBy.join(", ")}` : "") +
27
+ orderBy +
28
+ limit;
29
+ return { sql, params };
30
+ }
31
+ export function assertReadOnlySql(sql) {
32
+ const trimmed = sql.trim();
33
+ if (!READ_ONLY_SQL_PATTERN.test(trimmed) || MUTATING_SQL_PATTERN.test(trimmed)) {
34
+ throw new Error("Only read-only SQL statements are allowed");
35
+ }
36
+ }
37
+ function compileSelect(select) {
38
+ const alias = select.as ? ` AS ${quoteIdentifier(sanitizeIdentifier(select.as))}` : "";
39
+ switch (select.fn) {
40
+ case "COUNT":
41
+ return `COUNT(*)${alias}`;
42
+ case "SUM":
43
+ case "AVG":
44
+ case "MIN":
45
+ case "MAX":
46
+ return `${select.fn}(${quoteIdentifier(requireField(select))})${alias}`;
47
+ case "P50":
48
+ return percentileSelect(0.5, select, alias);
49
+ case "P95":
50
+ return percentileSelect(0.95, select, alias);
51
+ case "P99":
52
+ return percentileSelect(0.99, select, alias);
53
+ default:
54
+ throw new Error(`Unsupported aggregate: ${select.fn}`);
55
+ }
56
+ }
57
+ function percentileSelect(percentile, select, alias) {
58
+ return `PERCENTILE_CONT(${percentile}) WITHIN GROUP (ORDER BY ${quoteIdentifier(requireField(select))})${alias}`;
59
+ }
60
+ function compileFilter(filter, params) {
61
+ const field = quoteIdentifier(filter.field);
62
+ switch (filter.op) {
63
+ case "eq":
64
+ params.push(normalizeScalar(filter.value));
65
+ return `${field} = ?`;
66
+ case "neq":
67
+ params.push(normalizeScalar(filter.value));
68
+ return `${field} <> ?`;
69
+ case "gt":
70
+ params.push(normalizeScalar(filter.value));
71
+ return `${field} > ?`;
72
+ case "gte":
73
+ params.push(normalizeScalar(filter.value));
74
+ return `${field} >= ?`;
75
+ case "lt":
76
+ params.push(normalizeScalar(filter.value));
77
+ return `${field} < ?`;
78
+ case "lte":
79
+ params.push(normalizeScalar(filter.value));
80
+ return `${field} <= ?`;
81
+ case "in": {
82
+ if (!Array.isArray(filter.value) || filter.value.length === 0) {
83
+ throw new Error("IN filters require a non-empty array");
84
+ }
85
+ params.push(...filter.value);
86
+ return `${field} IN (${filter.value.map(() => "?").join(", ")})`;
87
+ }
88
+ default:
89
+ throw new Error(`Unsupported filter operator: ${filter.op}`);
90
+ }
91
+ }
92
+ function normalizeScalar(value) {
93
+ if (Array.isArray(value)) {
94
+ throw new Error("Scalar filter received an array");
95
+ }
96
+ return value;
97
+ }
98
+ function requireField(select) {
99
+ if (!select.field) {
100
+ throw new Error(`${select.fn} requires a field`);
101
+ }
102
+ return sanitizeIdentifier(select.field);
103
+ }
104
+ //# sourceMappingURL=build-query.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"build-query.js","sourceRoot":"","sources":["../../src/query/build-query.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { FastifyInstance } from "fastify";
2
+ import type { CollectorDependencies } from "../server.js";
3
+ export declare function registerColumnRoutes(app: FastifyInstance, dependencies: CollectorDependencies): void;
4
+ //# sourceMappingURL=columns.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"columns.d.ts","sourceRoot":"","sources":["../../src/routes/columns.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAC/C,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAC;AAE1D,wBAAgB,oBAAoB,CAClC,GAAG,EAAE,eAAe,EACpB,YAAY,EAAE,qBAAqB,GAClC,IAAI,CAIN"}
@@ -0,0 +1,6 @@
1
+ export function registerColumnRoutes(app, dependencies) {
2
+ app.get("/columns", async () => ({
3
+ columns: dependencies.schema.listColumns()
4
+ }));
5
+ }
6
+ //# sourceMappingURL=columns.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"columns.js","sourceRoot":"","sources":["../../src/routes/columns.ts"],"names":[],"mappings":"AAGA,MAAM,UAAU,oBAAoB,CAClC,GAAoB,EACpB,YAAmC;IAEnC,GAAG,CAAC,GAAG,CAAC,UAAU,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC;QAC/B,OAAO,EAAE,YAAY,CAAC,MAAM,CAAC,WAAW,EAAE;KAC3C,CAAC,CAAC,CAAC;AACN,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { FastifyInstance } from "fastify";
2
+ export declare function registerHealthRoute(app: FastifyInstance): void;
3
+ //# sourceMappingURL=health.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"health.d.ts","sourceRoot":"","sources":["../../src/routes/health.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAE/C,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,eAAe,GAAG,IAAI,CAI9D"}
@@ -0,0 +1,6 @@
1
+ export function registerHealthRoute(app) {
2
+ app.get("/health", async () => ({
3
+ ok: true
4
+ }));
5
+ }
6
+ //# sourceMappingURL=health.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"health.js","sourceRoot":"","sources":["../../src/routes/health.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,mBAAmB,CAAC,GAAoB;IACtD,GAAG,CAAC,GAAG,CAAC,SAAS,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC;QAC9B,EAAE,EAAE,IAAI;KACT,CAAC,CAAC,CAAC;AACN,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { FastifyInstance } from "fastify";
2
+ import type { CollectorDependencies } from "../server.js";
3
+ export declare function registerQueryRoutes(app: FastifyInstance, dependencies: CollectorDependencies): void;
4
+ //# sourceMappingURL=query.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"query.d.ts","sourceRoot":"","sources":["../../src/routes/query.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAG/C,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAC;AAE1D,wBAAgB,mBAAmB,CACjC,GAAG,EAAE,eAAe,EACpB,YAAY,EAAE,qBAAqB,GAClC,IAAI,CAWN"}
@@ -0,0 +1,12 @@
1
+ import { assertRecord } from "@wide-events/internal";
2
+ import { compileStructuredQuery } from "../query/build-query.js";
3
+ export function registerQueryRoutes(app, dependencies) {
4
+ app.post("/query", async (request) => {
5
+ assertRecord(request.body, "Structured query");
6
+ const query = request.body;
7
+ const compiled = compileStructuredQuery(query);
8
+ const rows = await dependencies.database.executeRead(compiled.sql, compiled.params);
9
+ return { rows };
10
+ });
11
+ }
12
+ //# sourceMappingURL=query.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"query.js","sourceRoot":"","sources":["../../src/routes/query.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAwB,MAAM,uBAAuB,CAAC;AAC3E,OAAO,EAAE,sBAAsB,EAAE,MAAM,yBAAyB,CAAC;AAGjE,MAAM,UAAU,mBAAmB,CACjC,GAAoB,EACpB,YAAmC;IAEnC,GAAG,CAAC,IAAI,CAAC,QAAQ,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE;QACnC,YAAY,CAAC,OAAO,CAAC,IAAI,EAAE,kBAAkB,CAAC,CAAC;QAC/C,MAAM,KAAK,GAAG,OAAO,CAAC,IAAkC,CAAC;QACzD,MAAM,QAAQ,GAAG,sBAAsB,CAAC,KAAK,CAAC,CAAC;QAC/C,MAAM,IAAI,GAAG,MAAM,YAAY,CAAC,QAAQ,CAAC,WAAW,CAClD,QAAQ,CAAC,GAAG,EACZ,QAAQ,CAAC,MAAM,CAChB,CAAC;QACF,OAAO,EAAE,IAAI,EAAE,CAAC;IAClB,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { FastifyInstance } from "fastify";
2
+ import type { CollectorDependencies } from "../server.js";
3
+ export declare function registerSqlRoutes(app: FastifyInstance, dependencies: CollectorDependencies): void;
4
+ //# sourceMappingURL=sql.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sql.d.ts","sourceRoot":"","sources":["../../src/routes/sql.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAG/C,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAC;AAE1D,wBAAgB,iBAAiB,CAC/B,GAAG,EAAE,eAAe,EACpB,YAAY,EAAE,qBAAqB,GAClC,IAAI,CAYN"}
@@ -0,0 +1,15 @@
1
+ import { assertRecord } from "@wide-events/internal";
2
+ import { assertReadOnlySql } from "../query/build-query.js";
3
+ export function registerSqlRoutes(app, dependencies) {
4
+ app.post("/sql", async (request) => {
5
+ assertRecord(request.body, "SQL query request");
6
+ const sql = request.body["sql"];
7
+ if (typeof sql !== "string") {
8
+ throw new Error("SQL request must include a sql string");
9
+ }
10
+ assertReadOnlySql(sql);
11
+ const rows = await dependencies.database.executeRead(sql);
12
+ return { rows };
13
+ });
14
+ }
15
+ //# sourceMappingURL=sql.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sql.js","sourceRoot":"","sources":["../../src/routes/sql.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AACrD,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAG5D,MAAM,UAAU,iBAAiB,CAC/B,GAAoB,EACpB,YAAmC;IAEnC,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE;QACjC,YAAY,CAAC,OAAO,CAAC,IAAI,EAAE,mBAAmB,CAAC,CAAC;QAChD,MAAM,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAChC,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE,CAAC;YAC5B,MAAM,IAAI,KAAK,CAAC,uCAAuC,CAAC,CAAC;QAC3D,CAAC;QAED,iBAAiB,CAAC,GAAG,CAAC,CAAC;QACvB,MAAM,IAAI,GAAG,MAAM,YAAY,CAAC,QAAQ,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;QAC1D,OAAO,EAAE,IAAI,EAAE,CAAC;IAClB,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { FastifyInstance } from "fastify";
2
+ import type { CollectorDependencies } from "../server.js";
3
+ export declare function registerTraceQueryRoutes(app: FastifyInstance, dependencies: CollectorDependencies): void;
4
+ //# sourceMappingURL=trace.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"trace.d.ts","sourceRoot":"","sources":["../../src/routes/trace.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAC/C,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAC;AAE1D,wBAAgB,wBAAwB,CACtC,GAAG,EAAE,eAAe,EACpB,YAAY,EAAE,qBAAqB,GAClC,IAAI,CAYN"}