@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.
Files changed (120) hide show
  1. package/README.md +130 -0
  2. package/dist/browser/index.cjs +1346 -0
  3. package/dist/browser/index.cjs.map +1 -0
  4. package/dist/browser/index.d.cts +5 -0
  5. package/dist/browser/index.d.ts +5 -0
  6. package/dist/browser/index.js +1318 -0
  7. package/dist/browser/index.js.map +1 -0
  8. package/dist/browser_telemetry_client-BzBPQm4m.d.cts +29 -0
  9. package/dist/browser_telemetry_client-Ch_VzwEa.d.ts +29 -0
  10. package/dist/cli/telemetry_bin.cjs +5531 -0
  11. package/dist/cli/telemetry_bin.cjs.map +1 -0
  12. package/dist/cli/telemetry_bin.d.cts +1 -0
  13. package/dist/cli/telemetry_bin.d.ts +1 -0
  14. package/dist/cli/telemetry_bin.js +5517 -0
  15. package/dist/cli/telemetry_bin.js.map +1 -0
  16. package/dist/cli/telemetry_cli.cjs +5523 -0
  17. package/dist/cli/telemetry_cli.cjs.map +1 -0
  18. package/dist/cli/telemetry_cli.d.cts +92 -0
  19. package/dist/cli/telemetry_cli.d.ts +92 -0
  20. package/dist/cli/telemetry_cli.js +5497 -0
  21. package/dist/cli/telemetry_cli.js.map +1 -0
  22. package/dist/client_defaults-B5tC-TgG.d.ts +8 -0
  23. package/dist/client_defaults-C9LnSX4j.d.cts +8 -0
  24. package/dist/core/index.cjs +2354 -0
  25. package/dist/core/index.cjs.map +1 -0
  26. package/dist/core/index.d.cts +168 -0
  27. package/dist/core/index.d.ts +168 -0
  28. package/dist/core/index.js +2318 -0
  29. package/dist/core/index.js.map +1 -0
  30. package/dist/electron/index.cjs +1379 -0
  31. package/dist/electron/index.cjs.map +1 -0
  32. package/dist/electron/index.d.cts +31 -0
  33. package/dist/electron/index.d.ts +31 -0
  34. package/dist/electron/index.js +1353 -0
  35. package/dist/electron/index.js.map +1 -0
  36. package/dist/envelope.types-rOLpWXRC.d.cts +42 -0
  37. package/dist/envelope.types-rOLpWXRC.d.ts +42 -0
  38. package/dist/in_memory_batch_transport-DKW9EZnU.d.cts +16 -0
  39. package/dist/in_memory_batch_transport-oOwNxXnA.d.ts +16 -0
  40. package/dist/index.cjs +3325 -0
  41. package/dist/index.cjs.map +1 -0
  42. package/dist/index.d.cts +66 -0
  43. package/dist/index.d.ts +66 -0
  44. package/dist/index.js +3285 -0
  45. package/dist/index.js.map +1 -0
  46. package/dist/maintenance_coordinator.types-B-bZUNvw.d.cts +127 -0
  47. package/dist/maintenance_coordinator.types-CBA5y74b.d.ts +127 -0
  48. package/dist/metric_definition_contract-BR6a_GzF.d.cts +12 -0
  49. package/dist/metric_definition_contract-l4i4SaAp.d.ts +12 -0
  50. package/dist/node/index.cjs +7157 -0
  51. package/dist/node/index.cjs.map +1 -0
  52. package/dist/node/index.d.cts +74 -0
  53. package/dist/node/index.d.ts +74 -0
  54. package/dist/node/index.js +7122 -0
  55. package/dist/node/index.js.map +1 -0
  56. package/dist/node/producer/index.cjs +1322 -0
  57. package/dist/node/producer/index.cjs.map +1 -0
  58. package/dist/node/producer/index.d.cts +21 -0
  59. package/dist/node/producer/index.d.ts +21 -0
  60. package/dist/node/producer/index.js +1294 -0
  61. package/dist/node/producer/index.js.map +1 -0
  62. package/dist/query.types-Bntwh6KF.d.cts +186 -0
  63. package/dist/query.types-DySoqYop.d.ts +186 -0
  64. package/dist/result.types-171Huujb.d.cts +9 -0
  65. package/dist/result.types-171Huujb.d.ts +9 -0
  66. package/dist/sqlite/index.cjs +3409 -0
  67. package/dist/sqlite/index.cjs.map +1 -0
  68. package/dist/sqlite/index.d.cts +77 -0
  69. package/dist/sqlite/index.d.ts +77 -0
  70. package/dist/sqlite/index.js +3382 -0
  71. package/dist/sqlite/index.js.map +1 -0
  72. package/dist/storage.types-BTCGVxOM.d.ts +76 -0
  73. package/dist/storage.types-DjuUMinz.d.cts +76 -0
  74. package/dist/telemetry_client-BXw8WH_F.d.ts +141 -0
  75. package/dist/telemetry_client-CYaPYfOl.d.cts +141 -0
  76. package/dist/telemetry_configuration_parser-C7Et_gwG.d.ts +39 -0
  77. package/dist/telemetry_configuration_parser-R-niZQRZ.d.cts +39 -0
  78. package/dist/testing/index.cjs +215 -0
  79. package/dist/testing/index.cjs.map +1 -0
  80. package/dist/testing/index.d.cts +32 -0
  81. package/dist/testing/index.d.ts +32 -0
  82. package/dist/testing/index.js +187 -0
  83. package/dist/testing/index.js.map +1 -0
  84. package/dist/trace-adapter/index.cjs +1034 -0
  85. package/dist/trace-adapter/index.cjs.map +1 -0
  86. package/dist/trace-adapter/index.d.cts +72 -0
  87. package/dist/trace-adapter/index.d.ts +72 -0
  88. package/dist/trace-adapter/index.js +1007 -0
  89. package/dist/trace-adapter/index.js.map +1 -0
  90. package/dist/transport.types-BAl_TRtU.d.cts +99 -0
  91. package/dist/transport.types-DDnZoKWi.d.ts +99 -0
  92. package/migrations/1783695629569_raw_events.down.sql +1 -0
  93. package/migrations/1783695629569_raw_events.up.sql +30 -0
  94. package/migrations/1783695630053_batch_acknowledgements.down.sql +1 -0
  95. package/migrations/1783695630053_batch_acknowledgements.up.sql +13 -0
  96. package/migrations/1783695630960_ingest_watermarks.down.sql +1 -0
  97. package/migrations/1783695630960_ingest_watermarks.up.sql +9 -0
  98. package/migrations/1783695631522_metric_definitions.down.sql +1 -0
  99. package/migrations/1783695631522_metric_definitions.up.sql +10 -0
  100. package/migrations/1783695631966_metric_samples.down.sql +1 -0
  101. package/migrations/1783695631966_metric_samples.up.sql +15 -0
  102. package/migrations/1783695632417_metric_rollups.down.sql +1 -0
  103. package/migrations/1783695632417_metric_rollups.up.sql +22 -0
  104. package/migrations/1783695632860_rollup_completions.down.sql +1 -0
  105. package/migrations/1783695632860_rollup_completions.up.sql +17 -0
  106. package/migrations/1783695633302_extraction_failures.down.sql +1 -0
  107. package/migrations/1783695633302_extraction_failures.up.sql +10 -0
  108. package/migrations/1783695633748_maintenance_runs.down.sql +1 -0
  109. package/migrations/1783695633748_maintenance_runs.up.sql +12 -0
  110. package/migrations/1783695634221_reader_leases.down.sql +1 -0
  111. package/migrations/1783695634221_reader_leases.up.sql +9 -0
  112. package/migrations/1783702703104_committed_drop_counters.down.sql +1 -0
  113. package/migrations/1783702703104_committed_drop_counters.up.sql +11 -0
  114. package/migrations/1783705542684_rollup_completion_state.down.sql +2 -0
  115. package/migrations/1783705542684_rollup_completion_state.up.sql +6 -0
  116. package/migrations/1784309799539_metric_samples_event_index.down.sql +1 -0
  117. package/migrations/1784309799539_metric_samples_event_index.up.sql +2 -0
  118. package/native/noego_telemetry_native.node +0 -0
  119. package/package.json +137 -0
  120. 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"]}