@noego/telemetry 0.0.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/README.md +130 -0
- package/dist/browser/index.cjs +1346 -0
- package/dist/browser/index.cjs.map +1 -0
- package/dist/browser/index.d.cts +5 -0
- package/dist/browser/index.d.ts +5 -0
- package/dist/browser/index.js +1318 -0
- package/dist/browser/index.js.map +1 -0
- package/dist/browser_telemetry_client-BzBPQm4m.d.cts +29 -0
- package/dist/browser_telemetry_client-Ch_VzwEa.d.ts +29 -0
- package/dist/cli/telemetry_bin.cjs +5531 -0
- package/dist/cli/telemetry_bin.cjs.map +1 -0
- package/dist/cli/telemetry_bin.d.cts +1 -0
- package/dist/cli/telemetry_bin.d.ts +1 -0
- package/dist/cli/telemetry_bin.js +5517 -0
- package/dist/cli/telemetry_bin.js.map +1 -0
- package/dist/cli/telemetry_cli.cjs +5523 -0
- package/dist/cli/telemetry_cli.cjs.map +1 -0
- package/dist/cli/telemetry_cli.d.cts +92 -0
- package/dist/cli/telemetry_cli.d.ts +92 -0
- package/dist/cli/telemetry_cli.js +5497 -0
- package/dist/cli/telemetry_cli.js.map +1 -0
- package/dist/client_defaults-B5tC-TgG.d.ts +8 -0
- package/dist/client_defaults-C9LnSX4j.d.cts +8 -0
- package/dist/core/index.cjs +2354 -0
- package/dist/core/index.cjs.map +1 -0
- package/dist/core/index.d.cts +168 -0
- package/dist/core/index.d.ts +168 -0
- package/dist/core/index.js +2318 -0
- package/dist/core/index.js.map +1 -0
- package/dist/electron/index.cjs +1379 -0
- package/dist/electron/index.cjs.map +1 -0
- package/dist/electron/index.d.cts +31 -0
- package/dist/electron/index.d.ts +31 -0
- package/dist/electron/index.js +1353 -0
- package/dist/electron/index.js.map +1 -0
- package/dist/envelope.types-rOLpWXRC.d.cts +42 -0
- package/dist/envelope.types-rOLpWXRC.d.ts +42 -0
- package/dist/in_memory_batch_transport-DKW9EZnU.d.cts +16 -0
- package/dist/in_memory_batch_transport-oOwNxXnA.d.ts +16 -0
- package/dist/index.cjs +3325 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +66 -0
- package/dist/index.d.ts +66 -0
- package/dist/index.js +3285 -0
- package/dist/index.js.map +1 -0
- package/dist/maintenance_coordinator.types-B-bZUNvw.d.cts +127 -0
- package/dist/maintenance_coordinator.types-CBA5y74b.d.ts +127 -0
- package/dist/metric_definition_contract-BR6a_GzF.d.cts +12 -0
- package/dist/metric_definition_contract-l4i4SaAp.d.ts +12 -0
- package/dist/node/index.cjs +7157 -0
- package/dist/node/index.cjs.map +1 -0
- package/dist/node/index.d.cts +74 -0
- package/dist/node/index.d.ts +74 -0
- package/dist/node/index.js +7122 -0
- package/dist/node/index.js.map +1 -0
- package/dist/node/producer/index.cjs +1322 -0
- package/dist/node/producer/index.cjs.map +1 -0
- package/dist/node/producer/index.d.cts +21 -0
- package/dist/node/producer/index.d.ts +21 -0
- package/dist/node/producer/index.js +1294 -0
- package/dist/node/producer/index.js.map +1 -0
- package/dist/query.types-Bntwh6KF.d.cts +186 -0
- package/dist/query.types-DySoqYop.d.ts +186 -0
- package/dist/result.types-171Huujb.d.cts +9 -0
- package/dist/result.types-171Huujb.d.ts +9 -0
- package/dist/sqlite/index.cjs +3409 -0
- package/dist/sqlite/index.cjs.map +1 -0
- package/dist/sqlite/index.d.cts +77 -0
- package/dist/sqlite/index.d.ts +77 -0
- package/dist/sqlite/index.js +3382 -0
- package/dist/sqlite/index.js.map +1 -0
- package/dist/storage.types-BTCGVxOM.d.ts +76 -0
- package/dist/storage.types-DjuUMinz.d.cts +76 -0
- package/dist/telemetry_client-BXw8WH_F.d.ts +141 -0
- package/dist/telemetry_client-CYaPYfOl.d.cts +141 -0
- package/dist/telemetry_configuration_parser-C7Et_gwG.d.ts +39 -0
- package/dist/telemetry_configuration_parser-R-niZQRZ.d.cts +39 -0
- package/dist/testing/index.cjs +215 -0
- package/dist/testing/index.cjs.map +1 -0
- package/dist/testing/index.d.cts +32 -0
- package/dist/testing/index.d.ts +32 -0
- package/dist/testing/index.js +187 -0
- package/dist/testing/index.js.map +1 -0
- package/dist/trace-adapter/index.cjs +1034 -0
- package/dist/trace-adapter/index.cjs.map +1 -0
- package/dist/trace-adapter/index.d.cts +72 -0
- package/dist/trace-adapter/index.d.ts +72 -0
- package/dist/trace-adapter/index.js +1007 -0
- package/dist/trace-adapter/index.js.map +1 -0
- package/dist/transport.types-BAl_TRtU.d.cts +99 -0
- package/dist/transport.types-DDnZoKWi.d.ts +99 -0
- package/migrations/1783695629569_raw_events.down.sql +1 -0
- package/migrations/1783695629569_raw_events.up.sql +30 -0
- package/migrations/1783695630053_batch_acknowledgements.down.sql +1 -0
- package/migrations/1783695630053_batch_acknowledgements.up.sql +13 -0
- package/migrations/1783695630960_ingest_watermarks.down.sql +1 -0
- package/migrations/1783695630960_ingest_watermarks.up.sql +9 -0
- package/migrations/1783695631522_metric_definitions.down.sql +1 -0
- package/migrations/1783695631522_metric_definitions.up.sql +10 -0
- package/migrations/1783695631966_metric_samples.down.sql +1 -0
- package/migrations/1783695631966_metric_samples.up.sql +15 -0
- package/migrations/1783695632417_metric_rollups.down.sql +1 -0
- package/migrations/1783695632417_metric_rollups.up.sql +22 -0
- package/migrations/1783695632860_rollup_completions.down.sql +1 -0
- package/migrations/1783695632860_rollup_completions.up.sql +17 -0
- package/migrations/1783695633302_extraction_failures.down.sql +1 -0
- package/migrations/1783695633302_extraction_failures.up.sql +10 -0
- package/migrations/1783695633748_maintenance_runs.down.sql +1 -0
- package/migrations/1783695633748_maintenance_runs.up.sql +12 -0
- package/migrations/1783695634221_reader_leases.down.sql +1 -0
- package/migrations/1783695634221_reader_leases.up.sql +9 -0
- package/migrations/1783702703104_committed_drop_counters.down.sql +1 -0
- package/migrations/1783702703104_committed_drop_counters.up.sql +11 -0
- package/migrations/1783705542684_rollup_completion_state.down.sql +2 -0
- package/migrations/1783705542684_rollup_completion_state.up.sql +6 -0
- package/migrations/1784309799539_metric_samples_event_index.down.sql +1 -0
- package/migrations/1784309799539_metric_samples_event_index.up.sql +2 -0
- package/native/noego_telemetry_native.node +0 -0
- package/package.json +137 -0
- package/proper.json +8 -0
|
@@ -0,0 +1,215 @@
|
|
|
1
|
+
/* @noego/telemetry */
|
|
2
|
+
"use strict";
|
|
3
|
+
var __defProp = Object.defineProperty;
|
|
4
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
5
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
6
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
7
|
+
var __export = (target, all) => {
|
|
8
|
+
for (var name in all)
|
|
9
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
10
|
+
};
|
|
11
|
+
var __copyProps = (to, from, except, desc) => {
|
|
12
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
13
|
+
for (let key of __getOwnPropNames(from))
|
|
14
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
15
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
16
|
+
}
|
|
17
|
+
return to;
|
|
18
|
+
};
|
|
19
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
20
|
+
|
|
21
|
+
// src/testing/index.ts
|
|
22
|
+
var testing_exports = {};
|
|
23
|
+
__export(testing_exports, {
|
|
24
|
+
InMemoryBatchTransport: () => InMemoryBatchTransport,
|
|
25
|
+
InMemoryStorageTransport: () => InMemoryStorageTransport,
|
|
26
|
+
createTestSqliteTargetConfiguration: () => createTestSqliteTargetConfiguration
|
|
27
|
+
});
|
|
28
|
+
module.exports = __toCommonJS(testing_exports);
|
|
29
|
+
|
|
30
|
+
// src/runtime/in_memory_batch_transport.ts
|
|
31
|
+
var InMemoryBatchTransport = class {
|
|
32
|
+
constructor(transportId, receiver, maxPendingBatches = 16) {
|
|
33
|
+
this.transportId = transportId;
|
|
34
|
+
this.receiver = receiver;
|
|
35
|
+
this.capabilities = Object.freeze({
|
|
36
|
+
maxBatchBytes: 1e6,
|
|
37
|
+
acknowledgement: "durable",
|
|
38
|
+
ordering: "producer",
|
|
39
|
+
boundedCapacity: maxPendingBatches
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
transportId;
|
|
43
|
+
capabilities;
|
|
44
|
+
receiver;
|
|
45
|
+
pending = 0;
|
|
46
|
+
closed = false;
|
|
47
|
+
connect(receiver) {
|
|
48
|
+
this.receiver = receiver;
|
|
49
|
+
}
|
|
50
|
+
async send(batch) {
|
|
51
|
+
if (this.closed) {
|
|
52
|
+
return {
|
|
53
|
+
kind: "rejected",
|
|
54
|
+
idempotencyKey: batch.idempotencyKey,
|
|
55
|
+
code: "closed",
|
|
56
|
+
reason: "In-memory telemetry transport is closed",
|
|
57
|
+
targetStates: []
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
if (this.receiver === null || this.pending >= this.capabilities.boundedCapacity) {
|
|
61
|
+
return {
|
|
62
|
+
kind: "retryable",
|
|
63
|
+
idempotencyKey: batch.idempotencyKey,
|
|
64
|
+
reason: this.receiver === null ? "No receiver is connected" : "Transport capacity is full",
|
|
65
|
+
retryAfterMs: 1,
|
|
66
|
+
targetStates: []
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
this.pending += 1;
|
|
70
|
+
try {
|
|
71
|
+
return await this.receiver.receive(batch);
|
|
72
|
+
} finally {
|
|
73
|
+
this.pending -= 1;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
async flush(deadlineMs) {
|
|
77
|
+
while (this.pending > 0 && Date.now() < deadlineMs) {
|
|
78
|
+
const remainingMs = Math.max(0, deadlineMs - Date.now());
|
|
79
|
+
await new Promise((resolve) => setTimeout(resolve, Math.min(1, remainingMs)));
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
async close(deadlineMs) {
|
|
83
|
+
this.closed = true;
|
|
84
|
+
await this.flush(deadlineMs);
|
|
85
|
+
}
|
|
86
|
+
};
|
|
87
|
+
|
|
88
|
+
// src/testing/in_memory_storage_transport.ts
|
|
89
|
+
var InMemoryStorageTransport = class {
|
|
90
|
+
constructor(targetId) {
|
|
91
|
+
this.targetId = targetId;
|
|
92
|
+
}
|
|
93
|
+
targetId;
|
|
94
|
+
capabilities = Object.freeze({
|
|
95
|
+
rawPersistence: true,
|
|
96
|
+
metricSamples: true,
|
|
97
|
+
rollups: false,
|
|
98
|
+
queries: false,
|
|
99
|
+
retention: false,
|
|
100
|
+
maintenance: false
|
|
101
|
+
});
|
|
102
|
+
state = "created";
|
|
103
|
+
acknowledgements = /* @__PURE__ */ new Map();
|
|
104
|
+
committedBatches = [];
|
|
105
|
+
async start(_definitions) {
|
|
106
|
+
this.state = "ready";
|
|
107
|
+
return { ok: true, value: void 0 };
|
|
108
|
+
}
|
|
109
|
+
async persist(request) {
|
|
110
|
+
const existing = this.acknowledgements.get(request.batch.idempotencyKey);
|
|
111
|
+
if (existing) {
|
|
112
|
+
if (existing.checksum !== request.batch.checksum) {
|
|
113
|
+
return {
|
|
114
|
+
kind: "conflict",
|
|
115
|
+
idempotencyKey: request.batch.idempotencyKey,
|
|
116
|
+
reason: "checksum-conflict",
|
|
117
|
+
targetStates: []
|
|
118
|
+
};
|
|
119
|
+
}
|
|
120
|
+
const acknowledgement2 = existing.acknowledgement;
|
|
121
|
+
return acknowledgement2.kind === "committed" ? { ...acknowledgement2, duplicate: true } : acknowledgement2;
|
|
122
|
+
}
|
|
123
|
+
this.committedBatches.push(request.batch);
|
|
124
|
+
const acknowledgement = {
|
|
125
|
+
kind: "committed",
|
|
126
|
+
idempotencyKey: request.batch.idempotencyKey,
|
|
127
|
+
committedAtMs: Date.now(),
|
|
128
|
+
acceptedEvents: request.batch.envelopes.length,
|
|
129
|
+
duplicate: false,
|
|
130
|
+
targetStates: [{
|
|
131
|
+
targetId: this.targetId,
|
|
132
|
+
delivery: "required",
|
|
133
|
+
state: "committed",
|
|
134
|
+
attempts: 1,
|
|
135
|
+
reason: null
|
|
136
|
+
}]
|
|
137
|
+
};
|
|
138
|
+
this.acknowledgements.set(request.batch.idempotencyKey, {
|
|
139
|
+
checksum: request.batch.checksum,
|
|
140
|
+
acknowledgement
|
|
141
|
+
});
|
|
142
|
+
return acknowledgement;
|
|
143
|
+
}
|
|
144
|
+
batches() {
|
|
145
|
+
return Object.freeze([...this.committedBatches]);
|
|
146
|
+
}
|
|
147
|
+
async timeline(_query) {
|
|
148
|
+
return { ok: false, error: { kind: "unsupported", message: "In-memory testing storage has no queries" } };
|
|
149
|
+
}
|
|
150
|
+
async metrics(_query) {
|
|
151
|
+
return { ok: false, error: { kind: "unsupported", message: "In-memory testing storage has no queries" } };
|
|
152
|
+
}
|
|
153
|
+
async materializeRollups(_nowMs, _maxWorkMs) {
|
|
154
|
+
return this.unsupportedStage("rollup");
|
|
155
|
+
}
|
|
156
|
+
async enforceRetention(_nowMs, _shouldContinue) {
|
|
157
|
+
return this.unsupportedStage("retention");
|
|
158
|
+
}
|
|
159
|
+
async checkpoint() {
|
|
160
|
+
return this.unsupportedStage("checkpoint");
|
|
161
|
+
}
|
|
162
|
+
async reclaim(_maxPages) {
|
|
163
|
+
return this.unsupportedStage("reclaim");
|
|
164
|
+
}
|
|
165
|
+
async compact(_deadlineMs) {
|
|
166
|
+
return this.unsupportedStage("compaction");
|
|
167
|
+
}
|
|
168
|
+
status() {
|
|
169
|
+
return { targetId: this.targetId, state: this.state, detail: null, writerLeaseHeld: false };
|
|
170
|
+
}
|
|
171
|
+
async stop(_deadlineMs) {
|
|
172
|
+
this.state = "stopped";
|
|
173
|
+
}
|
|
174
|
+
unsupportedStage(stage) {
|
|
175
|
+
return { ok: false, error: `In-memory testing storage does not support ${stage}` };
|
|
176
|
+
}
|
|
177
|
+
};
|
|
178
|
+
|
|
179
|
+
// src/testing/helper/test_configuration.ts
|
|
180
|
+
function createTestSqliteTargetConfiguration(path, targetId = "local-sqlite") {
|
|
181
|
+
return Object.freeze({
|
|
182
|
+
targetId,
|
|
183
|
+
path,
|
|
184
|
+
delivery: "required",
|
|
185
|
+
schema: Object.freeze({ tablePrefix: "telemetry_", tables: Object.freeze({}) }),
|
|
186
|
+
retention: Object.freeze({
|
|
187
|
+
rawMs: 7 * 24 * 60 * 60 * 1e3,
|
|
188
|
+
lateArrivalMs: 6e4,
|
|
189
|
+
samplesMs: 14 * 24 * 60 * 60 * 1e3,
|
|
190
|
+
rollups: Object.freeze([
|
|
191
|
+
Object.freeze({ resolutionMs: 6e4, retainMs: 30 * 24 * 60 * 60 * 1e3 }),
|
|
192
|
+
Object.freeze({ resolutionMs: 15 * 6e4, retainMs: 180 * 24 * 60 * 60 * 1e3 })
|
|
193
|
+
])
|
|
194
|
+
}),
|
|
195
|
+
maintenance: Object.freeze({
|
|
196
|
+
intervalMs: 15 * 6e4,
|
|
197
|
+
maxWorkMs: 1e3,
|
|
198
|
+
maxReclaimPages: 100
|
|
199
|
+
}),
|
|
200
|
+
leaseExpiryMs: 3e4,
|
|
201
|
+
query: Object.freeze({
|
|
202
|
+
maxRangeMs: 365 * 24 * 60 * 60 * 1e3,
|
|
203
|
+
maxRows: 1e4,
|
|
204
|
+
maxBuckets: 1e4,
|
|
205
|
+
maxResponseBytes: 5e6
|
|
206
|
+
})
|
|
207
|
+
});
|
|
208
|
+
}
|
|
209
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
210
|
+
0 && (module.exports = {
|
|
211
|
+
InMemoryBatchTransport,
|
|
212
|
+
InMemoryStorageTransport,
|
|
213
|
+
createTestSqliteTargetConfiguration
|
|
214
|
+
});
|
|
215
|
+
//# sourceMappingURL=index.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/testing/index.ts","../../src/runtime/in_memory_batch_transport.ts","../../src/testing/in_memory_storage_transport.ts","../../src/testing/helper/test_configuration.ts"],"sourcesContent":["export { InMemoryBatchTransport } from '../runtime/in_memory_batch_transport.js';\nexport { InMemoryStorageTransport } from './in_memory_storage_transport.js';\nexport { createTestSqliteTargetConfiguration } from './helper/test_configuration.js';\n","import type {\n TelemetryAcknowledgement,\n TelemetryBatch,\n TelemetryBatchReceiver,\n TelemetryBatchTransport,\n TelemetryBatchTransportCapabilities,\n} from '../core/types/transport.types.js';\n\nexport class InMemoryBatchTransport implements TelemetryBatchTransport {\n readonly capabilities: TelemetryBatchTransportCapabilities;\n private receiver: TelemetryBatchReceiver | null;\n private pending = 0;\n private closed = false;\n\n constructor(\n readonly transportId: string,\n receiver: TelemetryBatchReceiver | null,\n maxPendingBatches = 16,\n ) {\n this.receiver = receiver;\n this.capabilities = Object.freeze({\n maxBatchBytes: 1_000_000,\n acknowledgement: 'durable',\n ordering: 'producer',\n boundedCapacity: maxPendingBatches,\n });\n }\n\n connect(receiver: TelemetryBatchReceiver | null): void {\n this.receiver = receiver;\n }\n\n async send(batch: TelemetryBatch): Promise<TelemetryAcknowledgement> {\n if (this.closed) {\n return {\n kind: 'rejected',\n idempotencyKey: batch.idempotencyKey,\n code: 'closed',\n reason: 'In-memory telemetry transport is closed',\n targetStates: [],\n };\n }\n if (this.receiver === null || this.pending >= this.capabilities.boundedCapacity) {\n return {\n kind: 'retryable',\n idempotencyKey: batch.idempotencyKey,\n reason: this.receiver === null ? 'No receiver is connected' : 'Transport capacity is full',\n retryAfterMs: 1,\n targetStates: [],\n };\n }\n this.pending += 1;\n try {\n return await this.receiver.receive(batch);\n } finally {\n this.pending -= 1;\n }\n }\n\n async flush(deadlineMs: number): Promise<void> {\n while (this.pending > 0 && Date.now() < deadlineMs) {\n const remainingMs = Math.max(0, deadlineMs - Date.now());\n await new Promise<void>((resolve) => setTimeout(resolve, Math.min(1, remainingMs)));\n }\n }\n\n async close(deadlineMs: number): Promise<void> {\n this.closed = true;\n await this.flush(deadlineMs);\n }\n}\n","import type { MetricDefinition } from '../core/types/metric.types.js';\nimport type {\n MetricQuery,\n MetricQueryResponse,\n TelemetryQueryError,\n TimelineQuery,\n TimelineQueryResponse,\n} from '../core/types/query.types.js';\nimport type { TelemetryResult } from '../core/types/result.types.js';\nimport type {\n MaintenanceStageResult,\n StoragePersistRequest,\n StorageTargetStatus,\n TelemetryStorageCapabilities,\n TelemetryStorageTransport,\n} from '../core/types/storage.types.js';\nimport type { TelemetryAcknowledgement, TelemetryBatch } from '../core/types/transport.types.js';\n\nexport class InMemoryStorageTransport implements TelemetryStorageTransport {\n readonly capabilities: TelemetryStorageCapabilities = Object.freeze({\n rawPersistence: true,\n metricSamples: true,\n rollups: false,\n queries: false,\n retention: false,\n maintenance: false,\n });\n private state: StorageTargetStatus['state'] = 'created';\n private readonly acknowledgements = new Map<string, Readonly<{ checksum: string; acknowledgement: TelemetryAcknowledgement }>>();\n private readonly committedBatches: TelemetryBatch[] = [];\n\n constructor(readonly targetId: string) {}\n\n async start(_definitions: readonly MetricDefinition[]): Promise<TelemetryResult<void, string>> {\n this.state = 'ready';\n return { ok: true, value: undefined };\n }\n\n async persist(request: StoragePersistRequest): Promise<TelemetryAcknowledgement> {\n const existing = this.acknowledgements.get(request.batch.idempotencyKey);\n if (existing) {\n if (existing.checksum !== request.batch.checksum) {\n return {\n kind: 'conflict',\n idempotencyKey: request.batch.idempotencyKey,\n reason: 'checksum-conflict',\n targetStates: [],\n };\n }\n const acknowledgement = existing.acknowledgement;\n return acknowledgement.kind === 'committed'\n ? { ...acknowledgement, duplicate: true }\n : acknowledgement;\n }\n this.committedBatches.push(request.batch);\n const acknowledgement: TelemetryAcknowledgement = {\n kind: 'committed',\n idempotencyKey: request.batch.idempotencyKey,\n committedAtMs: Date.now(),\n acceptedEvents: request.batch.envelopes.length,\n duplicate: false,\n targetStates: [{\n targetId: this.targetId,\n delivery: 'required',\n state: 'committed',\n attempts: 1,\n reason: null,\n }],\n };\n this.acknowledgements.set(request.batch.idempotencyKey, {\n checksum: request.batch.checksum,\n acknowledgement,\n });\n return acknowledgement;\n }\n\n batches(): readonly TelemetryBatch[] {\n return Object.freeze([...this.committedBatches]);\n }\n\n async timeline(_query: TimelineQuery): Promise<TelemetryResult<TimelineQueryResponse, TelemetryQueryError>> {\n return { ok: false, error: { kind: 'unsupported', message: 'In-memory testing storage has no queries' } };\n }\n\n async metrics(_query: MetricQuery): Promise<TelemetryResult<MetricQueryResponse, TelemetryQueryError>> {\n return { ok: false, error: { kind: 'unsupported', message: 'In-memory testing storage has no queries' } };\n }\n\n async materializeRollups(_nowMs: number, _maxWorkMs: number): Promise<TelemetryResult<MaintenanceStageResult, string>> {\n return this.unsupportedStage('rollup');\n }\n\n async enforceRetention(_nowMs: number, _shouldContinue?: () => boolean): Promise<TelemetryResult<MaintenanceStageResult, string>> {\n return this.unsupportedStage('retention');\n }\n\n async checkpoint(): Promise<TelemetryResult<MaintenanceStageResult, string>> {\n return this.unsupportedStage('checkpoint');\n }\n\n async reclaim(_maxPages: number): Promise<TelemetryResult<MaintenanceStageResult, string>> {\n return this.unsupportedStage('reclaim');\n }\n\n async compact(_deadlineMs: number): Promise<TelemetryResult<MaintenanceStageResult, string>> {\n return this.unsupportedStage('compaction');\n }\n\n status(): StorageTargetStatus {\n return { targetId: this.targetId, state: this.state, detail: null, writerLeaseHeld: false };\n }\n\n async stop(_deadlineMs: number): Promise<void> {\n this.state = 'stopped';\n }\n\n private unsupportedStage(stage: MaintenanceStageResult['stage']): TelemetryResult<MaintenanceStageResult, string> {\n return { ok: false, error: `In-memory testing storage does not support ${stage}` };\n }\n}\n","import type { SqliteTargetConfiguration } from '../../core/types/configuration.types.js';\n\nexport function createTestSqliteTargetConfiguration(\n path: string,\n targetId = 'local-sqlite',\n): SqliteTargetConfiguration {\n return Object.freeze({\n targetId,\n path,\n delivery: 'required',\n schema: Object.freeze({ tablePrefix: 'telemetry_', tables: Object.freeze({}) }),\n retention: Object.freeze({\n rawMs: 7 * 24 * 60 * 60 * 1_000,\n lateArrivalMs: 60_000,\n samplesMs: 14 * 24 * 60 * 60 * 1_000,\n rollups: Object.freeze([\n Object.freeze({ resolutionMs: 60_000, retainMs: 30 * 24 * 60 * 60 * 1_000 }),\n Object.freeze({ resolutionMs: 15 * 60_000, retainMs: 180 * 24 * 60 * 60 * 1_000 }),\n ]),\n }),\n maintenance: Object.freeze({\n intervalMs: 15 * 60_000,\n maxWorkMs: 1_000,\n maxReclaimPages: 100,\n }),\n leaseExpiryMs: 30_000,\n query: Object.freeze({\n maxRangeMs: 365 * 24 * 60 * 60 * 1_000,\n maxRows: 10_000,\n maxBuckets: 10_000,\n maxResponseBytes: 5_000_000,\n }),\n });\n}\n"],"mappings":"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","names":["acknowledgement"]}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
export { I as InMemoryBatchTransport } from '../in_memory_batch_transport-DKW9EZnU.cjs';
|
|
2
|
+
import { M as MetricDefinition, T as TimelineQuery, b as TimelineQueryResponse, c as TelemetryQueryError, d as MetricQuery, e as MetricQueryResponse, S as SqliteTargetConfiguration } from '../query.types-Bntwh6KF.cjs';
|
|
3
|
+
import { T as TelemetryResult } from '../result.types-171Huujb.cjs';
|
|
4
|
+
import { T as TelemetryStorageTransport, a as TelemetryStorageCapabilities, S as StoragePersistRequest, M as MaintenanceStageResult, b as StorageTargetStatus } from '../storage.types-DjuUMinz.cjs';
|
|
5
|
+
import { e as TelemetryAcknowledgement, d as TelemetryBatch } from '../transport.types-BAl_TRtU.cjs';
|
|
6
|
+
import '../envelope.types-rOLpWXRC.cjs';
|
|
7
|
+
|
|
8
|
+
declare class InMemoryStorageTransport implements TelemetryStorageTransport {
|
|
9
|
+
readonly targetId: string;
|
|
10
|
+
readonly capabilities: TelemetryStorageCapabilities;
|
|
11
|
+
private state;
|
|
12
|
+
private readonly acknowledgements;
|
|
13
|
+
private readonly committedBatches;
|
|
14
|
+
constructor(targetId: string);
|
|
15
|
+
start(_definitions: readonly MetricDefinition[]): Promise<TelemetryResult<void, string>>;
|
|
16
|
+
persist(request: StoragePersistRequest): Promise<TelemetryAcknowledgement>;
|
|
17
|
+
batches(): readonly TelemetryBatch[];
|
|
18
|
+
timeline(_query: TimelineQuery): Promise<TelemetryResult<TimelineQueryResponse, TelemetryQueryError>>;
|
|
19
|
+
metrics(_query: MetricQuery): Promise<TelemetryResult<MetricQueryResponse, TelemetryQueryError>>;
|
|
20
|
+
materializeRollups(_nowMs: number, _maxWorkMs: number): Promise<TelemetryResult<MaintenanceStageResult, string>>;
|
|
21
|
+
enforceRetention(_nowMs: number, _shouldContinue?: () => boolean): Promise<TelemetryResult<MaintenanceStageResult, string>>;
|
|
22
|
+
checkpoint(): Promise<TelemetryResult<MaintenanceStageResult, string>>;
|
|
23
|
+
reclaim(_maxPages: number): Promise<TelemetryResult<MaintenanceStageResult, string>>;
|
|
24
|
+
compact(_deadlineMs: number): Promise<TelemetryResult<MaintenanceStageResult, string>>;
|
|
25
|
+
status(): StorageTargetStatus;
|
|
26
|
+
stop(_deadlineMs: number): Promise<void>;
|
|
27
|
+
private unsupportedStage;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
declare function createTestSqliteTargetConfiguration(path: string, targetId?: string): SqliteTargetConfiguration;
|
|
31
|
+
|
|
32
|
+
export { InMemoryStorageTransport, createTestSqliteTargetConfiguration };
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
export { I as InMemoryBatchTransport } from '../in_memory_batch_transport-oOwNxXnA.js';
|
|
2
|
+
import { M as MetricDefinition, T as TimelineQuery, b as TimelineQueryResponse, c as TelemetryQueryError, d as MetricQuery, e as MetricQueryResponse, S as SqliteTargetConfiguration } from '../query.types-DySoqYop.js';
|
|
3
|
+
import { T as TelemetryResult } from '../result.types-171Huujb.js';
|
|
4
|
+
import { T as TelemetryStorageTransport, a as TelemetryStorageCapabilities, S as StoragePersistRequest, M as MaintenanceStageResult, b as StorageTargetStatus } from '../storage.types-BTCGVxOM.js';
|
|
5
|
+
import { e as TelemetryAcknowledgement, d as TelemetryBatch } from '../transport.types-DDnZoKWi.js';
|
|
6
|
+
import '../envelope.types-rOLpWXRC.js';
|
|
7
|
+
|
|
8
|
+
declare class InMemoryStorageTransport implements TelemetryStorageTransport {
|
|
9
|
+
readonly targetId: string;
|
|
10
|
+
readonly capabilities: TelemetryStorageCapabilities;
|
|
11
|
+
private state;
|
|
12
|
+
private readonly acknowledgements;
|
|
13
|
+
private readonly committedBatches;
|
|
14
|
+
constructor(targetId: string);
|
|
15
|
+
start(_definitions: readonly MetricDefinition[]): Promise<TelemetryResult<void, string>>;
|
|
16
|
+
persist(request: StoragePersistRequest): Promise<TelemetryAcknowledgement>;
|
|
17
|
+
batches(): readonly TelemetryBatch[];
|
|
18
|
+
timeline(_query: TimelineQuery): Promise<TelemetryResult<TimelineQueryResponse, TelemetryQueryError>>;
|
|
19
|
+
metrics(_query: MetricQuery): Promise<TelemetryResult<MetricQueryResponse, TelemetryQueryError>>;
|
|
20
|
+
materializeRollups(_nowMs: number, _maxWorkMs: number): Promise<TelemetryResult<MaintenanceStageResult, string>>;
|
|
21
|
+
enforceRetention(_nowMs: number, _shouldContinue?: () => boolean): Promise<TelemetryResult<MaintenanceStageResult, string>>;
|
|
22
|
+
checkpoint(): Promise<TelemetryResult<MaintenanceStageResult, string>>;
|
|
23
|
+
reclaim(_maxPages: number): Promise<TelemetryResult<MaintenanceStageResult, string>>;
|
|
24
|
+
compact(_deadlineMs: number): Promise<TelemetryResult<MaintenanceStageResult, string>>;
|
|
25
|
+
status(): StorageTargetStatus;
|
|
26
|
+
stop(_deadlineMs: number): Promise<void>;
|
|
27
|
+
private unsupportedStage;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
declare function createTestSqliteTargetConfiguration(path: string, targetId?: string): SqliteTargetConfiguration;
|
|
31
|
+
|
|
32
|
+
export { InMemoryStorageTransport, createTestSqliteTargetConfiguration };
|
|
@@ -0,0 +1,187 @@
|
|
|
1
|
+
/* @noego/telemetry */
|
|
2
|
+
|
|
3
|
+
// src/runtime/in_memory_batch_transport.ts
|
|
4
|
+
var InMemoryBatchTransport = class {
|
|
5
|
+
constructor(transportId, receiver, maxPendingBatches = 16) {
|
|
6
|
+
this.transportId = transportId;
|
|
7
|
+
this.receiver = receiver;
|
|
8
|
+
this.capabilities = Object.freeze({
|
|
9
|
+
maxBatchBytes: 1e6,
|
|
10
|
+
acknowledgement: "durable",
|
|
11
|
+
ordering: "producer",
|
|
12
|
+
boundedCapacity: maxPendingBatches
|
|
13
|
+
});
|
|
14
|
+
}
|
|
15
|
+
transportId;
|
|
16
|
+
capabilities;
|
|
17
|
+
receiver;
|
|
18
|
+
pending = 0;
|
|
19
|
+
closed = false;
|
|
20
|
+
connect(receiver) {
|
|
21
|
+
this.receiver = receiver;
|
|
22
|
+
}
|
|
23
|
+
async send(batch) {
|
|
24
|
+
if (this.closed) {
|
|
25
|
+
return {
|
|
26
|
+
kind: "rejected",
|
|
27
|
+
idempotencyKey: batch.idempotencyKey,
|
|
28
|
+
code: "closed",
|
|
29
|
+
reason: "In-memory telemetry transport is closed",
|
|
30
|
+
targetStates: []
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
if (this.receiver === null || this.pending >= this.capabilities.boundedCapacity) {
|
|
34
|
+
return {
|
|
35
|
+
kind: "retryable",
|
|
36
|
+
idempotencyKey: batch.idempotencyKey,
|
|
37
|
+
reason: this.receiver === null ? "No receiver is connected" : "Transport capacity is full",
|
|
38
|
+
retryAfterMs: 1,
|
|
39
|
+
targetStates: []
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
this.pending += 1;
|
|
43
|
+
try {
|
|
44
|
+
return await this.receiver.receive(batch);
|
|
45
|
+
} finally {
|
|
46
|
+
this.pending -= 1;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
async flush(deadlineMs) {
|
|
50
|
+
while (this.pending > 0 && Date.now() < deadlineMs) {
|
|
51
|
+
const remainingMs = Math.max(0, deadlineMs - Date.now());
|
|
52
|
+
await new Promise((resolve) => setTimeout(resolve, Math.min(1, remainingMs)));
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
async close(deadlineMs) {
|
|
56
|
+
this.closed = true;
|
|
57
|
+
await this.flush(deadlineMs);
|
|
58
|
+
}
|
|
59
|
+
};
|
|
60
|
+
|
|
61
|
+
// src/testing/in_memory_storage_transport.ts
|
|
62
|
+
var InMemoryStorageTransport = class {
|
|
63
|
+
constructor(targetId) {
|
|
64
|
+
this.targetId = targetId;
|
|
65
|
+
}
|
|
66
|
+
targetId;
|
|
67
|
+
capabilities = Object.freeze({
|
|
68
|
+
rawPersistence: true,
|
|
69
|
+
metricSamples: true,
|
|
70
|
+
rollups: false,
|
|
71
|
+
queries: false,
|
|
72
|
+
retention: false,
|
|
73
|
+
maintenance: false
|
|
74
|
+
});
|
|
75
|
+
state = "created";
|
|
76
|
+
acknowledgements = /* @__PURE__ */ new Map();
|
|
77
|
+
committedBatches = [];
|
|
78
|
+
async start(_definitions) {
|
|
79
|
+
this.state = "ready";
|
|
80
|
+
return { ok: true, value: void 0 };
|
|
81
|
+
}
|
|
82
|
+
async persist(request) {
|
|
83
|
+
const existing = this.acknowledgements.get(request.batch.idempotencyKey);
|
|
84
|
+
if (existing) {
|
|
85
|
+
if (existing.checksum !== request.batch.checksum) {
|
|
86
|
+
return {
|
|
87
|
+
kind: "conflict",
|
|
88
|
+
idempotencyKey: request.batch.idempotencyKey,
|
|
89
|
+
reason: "checksum-conflict",
|
|
90
|
+
targetStates: []
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
const acknowledgement2 = existing.acknowledgement;
|
|
94
|
+
return acknowledgement2.kind === "committed" ? { ...acknowledgement2, duplicate: true } : acknowledgement2;
|
|
95
|
+
}
|
|
96
|
+
this.committedBatches.push(request.batch);
|
|
97
|
+
const acknowledgement = {
|
|
98
|
+
kind: "committed",
|
|
99
|
+
idempotencyKey: request.batch.idempotencyKey,
|
|
100
|
+
committedAtMs: Date.now(),
|
|
101
|
+
acceptedEvents: request.batch.envelopes.length,
|
|
102
|
+
duplicate: false,
|
|
103
|
+
targetStates: [{
|
|
104
|
+
targetId: this.targetId,
|
|
105
|
+
delivery: "required",
|
|
106
|
+
state: "committed",
|
|
107
|
+
attempts: 1,
|
|
108
|
+
reason: null
|
|
109
|
+
}]
|
|
110
|
+
};
|
|
111
|
+
this.acknowledgements.set(request.batch.idempotencyKey, {
|
|
112
|
+
checksum: request.batch.checksum,
|
|
113
|
+
acknowledgement
|
|
114
|
+
});
|
|
115
|
+
return acknowledgement;
|
|
116
|
+
}
|
|
117
|
+
batches() {
|
|
118
|
+
return Object.freeze([...this.committedBatches]);
|
|
119
|
+
}
|
|
120
|
+
async timeline(_query) {
|
|
121
|
+
return { ok: false, error: { kind: "unsupported", message: "In-memory testing storage has no queries" } };
|
|
122
|
+
}
|
|
123
|
+
async metrics(_query) {
|
|
124
|
+
return { ok: false, error: { kind: "unsupported", message: "In-memory testing storage has no queries" } };
|
|
125
|
+
}
|
|
126
|
+
async materializeRollups(_nowMs, _maxWorkMs) {
|
|
127
|
+
return this.unsupportedStage("rollup");
|
|
128
|
+
}
|
|
129
|
+
async enforceRetention(_nowMs, _shouldContinue) {
|
|
130
|
+
return this.unsupportedStage("retention");
|
|
131
|
+
}
|
|
132
|
+
async checkpoint() {
|
|
133
|
+
return this.unsupportedStage("checkpoint");
|
|
134
|
+
}
|
|
135
|
+
async reclaim(_maxPages) {
|
|
136
|
+
return this.unsupportedStage("reclaim");
|
|
137
|
+
}
|
|
138
|
+
async compact(_deadlineMs) {
|
|
139
|
+
return this.unsupportedStage("compaction");
|
|
140
|
+
}
|
|
141
|
+
status() {
|
|
142
|
+
return { targetId: this.targetId, state: this.state, detail: null, writerLeaseHeld: false };
|
|
143
|
+
}
|
|
144
|
+
async stop(_deadlineMs) {
|
|
145
|
+
this.state = "stopped";
|
|
146
|
+
}
|
|
147
|
+
unsupportedStage(stage) {
|
|
148
|
+
return { ok: false, error: `In-memory testing storage does not support ${stage}` };
|
|
149
|
+
}
|
|
150
|
+
};
|
|
151
|
+
|
|
152
|
+
// src/testing/helper/test_configuration.ts
|
|
153
|
+
function createTestSqliteTargetConfiguration(path, targetId = "local-sqlite") {
|
|
154
|
+
return Object.freeze({
|
|
155
|
+
targetId,
|
|
156
|
+
path,
|
|
157
|
+
delivery: "required",
|
|
158
|
+
schema: Object.freeze({ tablePrefix: "telemetry_", tables: Object.freeze({}) }),
|
|
159
|
+
retention: Object.freeze({
|
|
160
|
+
rawMs: 7 * 24 * 60 * 60 * 1e3,
|
|
161
|
+
lateArrivalMs: 6e4,
|
|
162
|
+
samplesMs: 14 * 24 * 60 * 60 * 1e3,
|
|
163
|
+
rollups: Object.freeze([
|
|
164
|
+
Object.freeze({ resolutionMs: 6e4, retainMs: 30 * 24 * 60 * 60 * 1e3 }),
|
|
165
|
+
Object.freeze({ resolutionMs: 15 * 6e4, retainMs: 180 * 24 * 60 * 60 * 1e3 })
|
|
166
|
+
])
|
|
167
|
+
}),
|
|
168
|
+
maintenance: Object.freeze({
|
|
169
|
+
intervalMs: 15 * 6e4,
|
|
170
|
+
maxWorkMs: 1e3,
|
|
171
|
+
maxReclaimPages: 100
|
|
172
|
+
}),
|
|
173
|
+
leaseExpiryMs: 3e4,
|
|
174
|
+
query: Object.freeze({
|
|
175
|
+
maxRangeMs: 365 * 24 * 60 * 60 * 1e3,
|
|
176
|
+
maxRows: 1e4,
|
|
177
|
+
maxBuckets: 1e4,
|
|
178
|
+
maxResponseBytes: 5e6
|
|
179
|
+
})
|
|
180
|
+
});
|
|
181
|
+
}
|
|
182
|
+
export {
|
|
183
|
+
InMemoryBatchTransport,
|
|
184
|
+
InMemoryStorageTransport,
|
|
185
|
+
createTestSqliteTargetConfiguration
|
|
186
|
+
};
|
|
187
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/runtime/in_memory_batch_transport.ts","../../src/testing/in_memory_storage_transport.ts","../../src/testing/helper/test_configuration.ts"],"sourcesContent":["import type {\n TelemetryAcknowledgement,\n TelemetryBatch,\n TelemetryBatchReceiver,\n TelemetryBatchTransport,\n TelemetryBatchTransportCapabilities,\n} from '../core/types/transport.types.js';\n\nexport class InMemoryBatchTransport implements TelemetryBatchTransport {\n readonly capabilities: TelemetryBatchTransportCapabilities;\n private receiver: TelemetryBatchReceiver | null;\n private pending = 0;\n private closed = false;\n\n constructor(\n readonly transportId: string,\n receiver: TelemetryBatchReceiver | null,\n maxPendingBatches = 16,\n ) {\n this.receiver = receiver;\n this.capabilities = Object.freeze({\n maxBatchBytes: 1_000_000,\n acknowledgement: 'durable',\n ordering: 'producer',\n boundedCapacity: maxPendingBatches,\n });\n }\n\n connect(receiver: TelemetryBatchReceiver | null): void {\n this.receiver = receiver;\n }\n\n async send(batch: TelemetryBatch): Promise<TelemetryAcknowledgement> {\n if (this.closed) {\n return {\n kind: 'rejected',\n idempotencyKey: batch.idempotencyKey,\n code: 'closed',\n reason: 'In-memory telemetry transport is closed',\n targetStates: [],\n };\n }\n if (this.receiver === null || this.pending >= this.capabilities.boundedCapacity) {\n return {\n kind: 'retryable',\n idempotencyKey: batch.idempotencyKey,\n reason: this.receiver === null ? 'No receiver is connected' : 'Transport capacity is full',\n retryAfterMs: 1,\n targetStates: [],\n };\n }\n this.pending += 1;\n try {\n return await this.receiver.receive(batch);\n } finally {\n this.pending -= 1;\n }\n }\n\n async flush(deadlineMs: number): Promise<void> {\n while (this.pending > 0 && Date.now() < deadlineMs) {\n const remainingMs = Math.max(0, deadlineMs - Date.now());\n await new Promise<void>((resolve) => setTimeout(resolve, Math.min(1, remainingMs)));\n }\n }\n\n async close(deadlineMs: number): Promise<void> {\n this.closed = true;\n await this.flush(deadlineMs);\n }\n}\n","import type { MetricDefinition } from '../core/types/metric.types.js';\nimport type {\n MetricQuery,\n MetricQueryResponse,\n TelemetryQueryError,\n TimelineQuery,\n TimelineQueryResponse,\n} from '../core/types/query.types.js';\nimport type { TelemetryResult } from '../core/types/result.types.js';\nimport type {\n MaintenanceStageResult,\n StoragePersistRequest,\n StorageTargetStatus,\n TelemetryStorageCapabilities,\n TelemetryStorageTransport,\n} from '../core/types/storage.types.js';\nimport type { TelemetryAcknowledgement, TelemetryBatch } from '../core/types/transport.types.js';\n\nexport class InMemoryStorageTransport implements TelemetryStorageTransport {\n readonly capabilities: TelemetryStorageCapabilities = Object.freeze({\n rawPersistence: true,\n metricSamples: true,\n rollups: false,\n queries: false,\n retention: false,\n maintenance: false,\n });\n private state: StorageTargetStatus['state'] = 'created';\n private readonly acknowledgements = new Map<string, Readonly<{ checksum: string; acknowledgement: TelemetryAcknowledgement }>>();\n private readonly committedBatches: TelemetryBatch[] = [];\n\n constructor(readonly targetId: string) {}\n\n async start(_definitions: readonly MetricDefinition[]): Promise<TelemetryResult<void, string>> {\n this.state = 'ready';\n return { ok: true, value: undefined };\n }\n\n async persist(request: StoragePersistRequest): Promise<TelemetryAcknowledgement> {\n const existing = this.acknowledgements.get(request.batch.idempotencyKey);\n if (existing) {\n if (existing.checksum !== request.batch.checksum) {\n return {\n kind: 'conflict',\n idempotencyKey: request.batch.idempotencyKey,\n reason: 'checksum-conflict',\n targetStates: [],\n };\n }\n const acknowledgement = existing.acknowledgement;\n return acknowledgement.kind === 'committed'\n ? { ...acknowledgement, duplicate: true }\n : acknowledgement;\n }\n this.committedBatches.push(request.batch);\n const acknowledgement: TelemetryAcknowledgement = {\n kind: 'committed',\n idempotencyKey: request.batch.idempotencyKey,\n committedAtMs: Date.now(),\n acceptedEvents: request.batch.envelopes.length,\n duplicate: false,\n targetStates: [{\n targetId: this.targetId,\n delivery: 'required',\n state: 'committed',\n attempts: 1,\n reason: null,\n }],\n };\n this.acknowledgements.set(request.batch.idempotencyKey, {\n checksum: request.batch.checksum,\n acknowledgement,\n });\n return acknowledgement;\n }\n\n batches(): readonly TelemetryBatch[] {\n return Object.freeze([...this.committedBatches]);\n }\n\n async timeline(_query: TimelineQuery): Promise<TelemetryResult<TimelineQueryResponse, TelemetryQueryError>> {\n return { ok: false, error: { kind: 'unsupported', message: 'In-memory testing storage has no queries' } };\n }\n\n async metrics(_query: MetricQuery): Promise<TelemetryResult<MetricQueryResponse, TelemetryQueryError>> {\n return { ok: false, error: { kind: 'unsupported', message: 'In-memory testing storage has no queries' } };\n }\n\n async materializeRollups(_nowMs: number, _maxWorkMs: number): Promise<TelemetryResult<MaintenanceStageResult, string>> {\n return this.unsupportedStage('rollup');\n }\n\n async enforceRetention(_nowMs: number, _shouldContinue?: () => boolean): Promise<TelemetryResult<MaintenanceStageResult, string>> {\n return this.unsupportedStage('retention');\n }\n\n async checkpoint(): Promise<TelemetryResult<MaintenanceStageResult, string>> {\n return this.unsupportedStage('checkpoint');\n }\n\n async reclaim(_maxPages: number): Promise<TelemetryResult<MaintenanceStageResult, string>> {\n return this.unsupportedStage('reclaim');\n }\n\n async compact(_deadlineMs: number): Promise<TelemetryResult<MaintenanceStageResult, string>> {\n return this.unsupportedStage('compaction');\n }\n\n status(): StorageTargetStatus {\n return { targetId: this.targetId, state: this.state, detail: null, writerLeaseHeld: false };\n }\n\n async stop(_deadlineMs: number): Promise<void> {\n this.state = 'stopped';\n }\n\n private unsupportedStage(stage: MaintenanceStageResult['stage']): TelemetryResult<MaintenanceStageResult, string> {\n return { ok: false, error: `In-memory testing storage does not support ${stage}` };\n }\n}\n","import type { SqliteTargetConfiguration } from '../../core/types/configuration.types.js';\n\nexport function createTestSqliteTargetConfiguration(\n path: string,\n targetId = 'local-sqlite',\n): SqliteTargetConfiguration {\n return Object.freeze({\n targetId,\n path,\n delivery: 'required',\n schema: Object.freeze({ tablePrefix: 'telemetry_', tables: Object.freeze({}) }),\n retention: Object.freeze({\n rawMs: 7 * 24 * 60 * 60 * 1_000,\n lateArrivalMs: 60_000,\n samplesMs: 14 * 24 * 60 * 60 * 1_000,\n rollups: Object.freeze([\n Object.freeze({ resolutionMs: 60_000, retainMs: 30 * 24 * 60 * 60 * 1_000 }),\n Object.freeze({ resolutionMs: 15 * 60_000, retainMs: 180 * 24 * 60 * 60 * 1_000 }),\n ]),\n }),\n maintenance: Object.freeze({\n intervalMs: 15 * 60_000,\n maxWorkMs: 1_000,\n maxReclaimPages: 100,\n }),\n leaseExpiryMs: 30_000,\n query: Object.freeze({\n maxRangeMs: 365 * 24 * 60 * 60 * 1_000,\n maxRows: 10_000,\n maxBuckets: 10_000,\n maxResponseBytes: 5_000_000,\n }),\n });\n}\n"],"mappings":"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","names":["acknowledgement"]}
|