@armoriq/sdk-dev 0.8.6 → 0.8.7

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 (42) hide show
  1. package/dist/_version.d.ts +1 -1
  2. package/dist/_version.js +1 -1
  3. package/dist/index.d.ts +1 -1
  4. package/dist/index.d.ts.map +1 -1
  5. package/dist/index.js +3 -1
  6. package/dist/index.js.map +1 -1
  7. package/dist/observability/index.d.ts +4 -2
  8. package/dist/observability/index.d.ts.map +1 -1
  9. package/dist/observability/index.js.map +1 -1
  10. package/dist/observability/otel-runtime.d.ts +44 -3
  11. package/dist/observability/otel-runtime.d.ts.map +1 -1
  12. package/dist/observability/otel-runtime.js +190 -44
  13. package/dist/observability/otel-runtime.js.map +1 -1
  14. package/dist/observability/otel-session.d.ts +10 -3
  15. package/dist/observability/otel-session.d.ts.map +1 -1
  16. package/dist/observability/otel-session.js +13 -7
  17. package/dist/observability/otel-session.js.map +1 -1
  18. package/dist/observability/otel-shutdown.d.ts +1 -1
  19. package/dist/observability/otel-shutdown.d.ts.map +1 -1
  20. package/dist/observability/otel-shutdown.js +1 -13
  21. package/dist/observability/otel-shutdown.js.map +1 -1
  22. package/dist/observability/otel-span-spool.d.ts +55 -0
  23. package/dist/observability/otel-span-spool.d.ts.map +1 -0
  24. package/dist/observability/otel-span-spool.js +94 -0
  25. package/dist/observability/otel-span-spool.js.map +1 -0
  26. package/dist/observability/otel-spool-export.d.ts +64 -0
  27. package/dist/observability/otel-spool-export.d.ts.map +1 -0
  28. package/dist/observability/otel-spool-export.js +279 -0
  29. package/dist/observability/otel-spool-export.js.map +1 -0
  30. package/dist/observability/otlp-http-transport.d.ts +20 -0
  31. package/dist/observability/otlp-http-transport.d.ts.map +1 -0
  32. package/dist/observability/otlp-http-transport.js +141 -0
  33. package/dist/observability/otlp-http-transport.js.map +1 -0
  34. package/dist/observability/policy-lease.d.ts +25 -0
  35. package/dist/observability/policy-lease.d.ts.map +1 -1
  36. package/dist/observability/policy-lease.js +49 -0
  37. package/dist/observability/policy-lease.js.map +1 -1
  38. package/dist/session.d.ts +4 -3
  39. package/dist/session.d.ts.map +1 -1
  40. package/dist/session.js +5 -4
  41. package/dist/session.js.map +1 -1
  42. package/package.json +2 -2
@@ -0,0 +1,64 @@
1
+ import { type InstrumentationScope } from '@opentelemetry/core';
2
+ import type { Resource } from '@opentelemetry/resources';
3
+ import type { ReadableSpan, SpanExporter } from '@opentelemetry/sdk-trace-base';
4
+ import { type SpoolKey } from './otel-span-spool';
5
+ /**
6
+ * Delete the batch on `acknowledged`, `discarded` and `rejected`; keep it on
7
+ * `unsupported` (a newer SDK wrote it) and `failed` (retry later).
8
+ */
9
+ export type SpooledExportResult = {
10
+ readonly status: 'acknowledged';
11
+ } | {
12
+ readonly status: 'discarded';
13
+ readonly reason: 'capture_off';
14
+ } | {
15
+ readonly status: 'rejected';
16
+ readonly reason: 'malformed' | 'oversized' | 'identity_mismatch' | 'tampered';
17
+ } | {
18
+ readonly status: 'rejected';
19
+ readonly reason: 'backend_rejected';
20
+ readonly httpStatus: number;
21
+ } | {
22
+ readonly status: 'unsupported';
23
+ readonly reason: 'newer_version';
24
+ } | {
25
+ readonly status: 'failed';
26
+ readonly reason: 'unavailable' | 'policy_unavailable' | 'export_failed' | 'not_attempted';
27
+ };
28
+ interface SpoolIdentity {
29
+ readonly key: SpoolKey;
30
+ readonly resource: Resource;
31
+ readonly scope: InstrumentationScope;
32
+ }
33
+ type ParsedSpooledBatch = {
34
+ readonly spans: ReadableSpan[];
35
+ } | SpooledExportResult;
36
+ export declare const SPOOL_DISCARDED: SpooledExportResult;
37
+ export declare const SPOOL_UNAVAILABLE: SpooledExportResult;
38
+ export declare const SPOOL_POLICY_UNAVAILABLE: SpooledExportResult;
39
+ export declare function parseSpooledSpanBatches(values: unknown, identity: SpoolIdentity): Promise<ParsedSpooledBatch[]>;
40
+ export declare function settleShippable(entries: readonly ParsedSpooledBatch[], result: SpooledExportResult): SpooledExportResult[];
41
+ export declare function untilAborted(work: Promise<unknown>, signal: AbortSignal): Promise<void>;
42
+ export declare class ExportSlots {
43
+ private free;
44
+ private readonly waiting;
45
+ constructor(free: number);
46
+ acquire(signal: AbortSignal): Promise<boolean>;
47
+ release(): void;
48
+ }
49
+ export declare class SpoolExportCall {
50
+ private readonly transport;
51
+ private readonly exporter;
52
+ private readonly controller;
53
+ readonly signal: AbortSignal;
54
+ constructor(transport: {
55
+ abandon(retire: boolean): void;
56
+ }, exporter: SpanExporter);
57
+ abort(result: SpooledExportResult): void;
58
+ end(): void;
59
+ send(spans: ReadableSpan[]): Promise<SpooledExportResult>;
60
+ private outcome;
61
+ }
62
+ export declare function exportSpooledBatches(entries: readonly ParsedSpooledBatch[], ship: (spans: ReadableSpan[]) => Promise<SpooledExportResult>, slots: ExportSlots, signal: AbortSignal): Promise<SpooledExportResult[]>;
63
+ export {};
64
+ //# sourceMappingURL=otel-spool-export.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"otel-spool-export.d.ts","sourceRoot":"","sources":["../../src/observability/otel-spool-export.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,279 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.SpoolExportCall = exports.ExportSlots = exports.SPOOL_POLICY_UNAVAILABLE = exports.SPOOL_UNAVAILABLE = exports.SPOOL_DISCARDED = void 0;
4
+ exports.parseSpooledSpanBatches = parseSpooledSpanBatches;
5
+ exports.settleShippable = settleShippable;
6
+ exports.untilAborted = untilAborted;
7
+ exports.exportSpooledBatches = exportSpooledBatches;
8
+ const node_crypto_1 = require("node:crypto");
9
+ const api_1 = require("@opentelemetry/api");
10
+ const core_1 = require("@opentelemetry/core");
11
+ const otel_span_spool_1 = require("./otel-span-spool");
12
+ const MAX_BATCHES_PER_CALL = 64;
13
+ const MAX_SPANS_JSON_PER_CALL = 8 * 1024 * 1024;
14
+ const MAX_SPANS_PER_BATCH = 512;
15
+ const MAX_ATTRIBUTES_PER_SPAN = 128;
16
+ const MAX_VALUE_LENGTH = 8 * 1024;
17
+ const RETRYABLE_CLIENT_STATUS = new Set([408, 429]);
18
+ function outcome(result) {
19
+ return Object.freeze(result);
20
+ }
21
+ const ACKNOWLEDGED = outcome({ status: 'acknowledged' });
22
+ exports.SPOOL_DISCARDED = outcome({ status: 'discarded', reason: 'capture_off' });
23
+ exports.SPOOL_UNAVAILABLE = outcome({ status: 'failed', reason: 'unavailable' });
24
+ exports.SPOOL_POLICY_UNAVAILABLE = outcome({ status: 'failed', reason: 'policy_unavailable' });
25
+ const EXPORT_FAILED = outcome({ status: 'failed', reason: 'export_failed' });
26
+ const NOT_ATTEMPTED = outcome({ status: 'failed', reason: 'not_attempted' });
27
+ const MALFORMED = outcome({ status: 'rejected', reason: 'malformed' });
28
+ const OVERSIZED = outcome({ status: 'rejected', reason: 'oversized' });
29
+ const IDENTITY_MISMATCH = outcome({ status: 'rejected', reason: 'identity_mismatch' });
30
+ const TAMPERED = outcome({ status: 'rejected', reason: 'tampered' });
31
+ const NEWER_VERSION = outcome({ status: 'unsupported', reason: 'newer_version' });
32
+ class MalformedRecord extends Error {
33
+ }
34
+ function nextTurn() {
35
+ return new Promise((resolve) => setImmediate(resolve));
36
+ }
37
+ class OversizedRecord extends Error {
38
+ }
39
+ function check(value, valid) {
40
+ if (!valid)
41
+ throw new MalformedRecord();
42
+ return value;
43
+ }
44
+ function within(value, max) {
45
+ if (value.length > max)
46
+ throw new OversizedRecord();
47
+ return value;
48
+ }
49
+ function object(value) {
50
+ return check(value, typeof value === 'object' && value !== null && !Array.isArray(value));
51
+ }
52
+ function list(value) {
53
+ return check(value, Array.isArray(value));
54
+ }
55
+ function text(value) {
56
+ return within(check(value, typeof value === 'string'), MAX_VALUE_LENGTH);
57
+ }
58
+ function integer(value, max = Number.MAX_SAFE_INTEGER) {
59
+ return check(value, Number.isSafeInteger(value) && value >= 0 && value <= max);
60
+ }
61
+ function traceId(value) {
62
+ return check(value, typeof value === 'string' && (0, api_1.isValidTraceId)(value));
63
+ }
64
+ function spanId(value) {
65
+ return check(value, typeof value === 'string' && (0, api_1.isValidSpanId)(value));
66
+ }
67
+ function time(value) {
68
+ const [seconds, nanoseconds] = check(list(value), value.length === 2);
69
+ return [integer(seconds), integer(nanoseconds, 999_999_999)];
70
+ }
71
+ function scalar(value) {
72
+ if (typeof value === 'string')
73
+ return text(value) === value;
74
+ return typeof value === 'boolean' || (typeof value === 'number' && Number.isFinite(value));
75
+ }
76
+ function attributeValue(value) {
77
+ const valid = Array.isArray(value)
78
+ ? within(value, MAX_ATTRIBUTES_PER_SPAN).every((entry) => entry === null || scalar(entry))
79
+ : scalar(value);
80
+ return check(value, valid);
81
+ }
82
+ function attributes(value) {
83
+ const result = {};
84
+ const entries = within(Object.entries(object(value)), MAX_ATTRIBUTES_PER_SPAN);
85
+ for (const [key, entry] of entries)
86
+ result[text(key)] = attributeValue(entry);
87
+ return result;
88
+ }
89
+ function spanStatus(value) {
90
+ const status = object(value);
91
+ const message = status.message === undefined ? undefined : text(status.message);
92
+ return { code: integer(status.code, 2), message };
93
+ }
94
+ function parentContext(value, context) {
95
+ return value === undefined ? undefined : { ...context, spanId: spanId(value), isRemote: false };
96
+ }
97
+ function readableSpan(value, identity) {
98
+ const record = object(value);
99
+ const context = {
100
+ traceId: traceId(record.traceId),
101
+ spanId: spanId(record.spanId),
102
+ traceFlags: integer(record.traceFlags, 255),
103
+ };
104
+ const startTime = time(record.startTime);
105
+ const endTime = time(record.endTime);
106
+ const duration = (0, core_1.hrTimeDuration)(startTime, endTime);
107
+ return {
108
+ name: text(record.name),
109
+ kind: integer(record.kind, 4),
110
+ spanContext: () => context,
111
+ parentSpanContext: parentContext(record.parentSpanId, context),
112
+ startTime,
113
+ endTime,
114
+ duration: check(duration, duration[0] >= 0),
115
+ status: spanStatus(record.status),
116
+ attributes: attributes(record.attributes),
117
+ events: [],
118
+ links: [],
119
+ ended: true,
120
+ resource: identity.resource,
121
+ instrumentationScope: identity.scope,
122
+ droppedAttributesCount: integer(record.droppedAttributesCount),
123
+ droppedEventsCount: 0,
124
+ droppedLinksCount: 0,
125
+ };
126
+ }
127
+ function readableSpans(value, identity) {
128
+ const spans = within(list(value), MAX_SPANS_PER_BATCH);
129
+ return check(spans, spans.length > 0).map((span) => readableSpan(span, identity));
130
+ }
131
+ function unknownVersion(version) {
132
+ return Number.isSafeInteger(version) && version > otel_span_spool_1.SPOOLED_SPAN_BATCH_VERSION
133
+ ? NEWER_VERSION
134
+ : MALFORMED;
135
+ }
136
+ function sealed(seal, key, spansJson) {
137
+ const expected = Buffer.from((0, otel_span_spool_1.spoolSeal)(key, spansJson), 'hex');
138
+ const actual = Buffer.from(typeof seal === 'string' ? seal : '', 'hex');
139
+ return actual.length === expected.length && (0, node_crypto_1.timingSafeEqual)(actual, expected);
140
+ }
141
+ function parseSpooledSpanBatch(values, index, identity, budget) {
142
+ try {
143
+ const batch = object(values[index]);
144
+ if (batch.version !== otel_span_spool_1.SPOOLED_SPAN_BATCH_VERSION)
145
+ return unknownVersion(batch.version);
146
+ if (batch.binding !== identity.key.binding)
147
+ return IDENTITY_MISMATCH;
148
+ const json = check(JSON.stringify(batch.spans) ?? '', Array.isArray(batch.spans));
149
+ budget.json -= within(json, MAX_SPANS_JSON_PER_CALL).length;
150
+ if (budget.json < 0)
151
+ return NOT_ATTEMPTED;
152
+ if (!sealed(batch.seal, identity.key, json))
153
+ return TAMPERED;
154
+ return { spans: readableSpans(JSON.parse(json), identity) };
155
+ }
156
+ catch (error) {
157
+ return error instanceof OversizedRecord ? OVERSIZED : MALFORMED;
158
+ }
159
+ }
160
+ async function parseSpooledSpanBatches(values, identity) {
161
+ if (!Array.isArray(values))
162
+ return [];
163
+ const budget = { json: MAX_SPANS_JSON_PER_CALL };
164
+ const parsed = [];
165
+ for (let index = 0; index < values.length; index += 1) {
166
+ if (index >= MAX_BATCHES_PER_CALL || budget.json < 0) {
167
+ parsed.push(NOT_ATTEMPTED);
168
+ continue;
169
+ }
170
+ parsed.push(parseSpooledSpanBatch(values, index, identity, budget));
171
+ await nextTurn();
172
+ }
173
+ return parsed;
174
+ }
175
+ function settleShippable(entries, result) {
176
+ return entries.map((entry) => ('spans' in entry ? result : entry));
177
+ }
178
+ function backendOutcome(error) {
179
+ const status = error?.code;
180
+ if (typeof status !== 'number' || status < 400 || status > 499)
181
+ return EXPORT_FAILED;
182
+ if (RETRYABLE_CLIENT_STATUS.has(status))
183
+ return EXPORT_FAILED;
184
+ return outcome({ status: 'rejected', reason: 'backend_rejected', httpStatus: status });
185
+ }
186
+ function untilAborted(work, signal) {
187
+ return new Promise((resolve) => {
188
+ const done = () => {
189
+ signal.removeEventListener('abort', done);
190
+ resolve();
191
+ };
192
+ if (signal.aborted)
193
+ return resolve();
194
+ signal.addEventListener('abort', done, { once: true });
195
+ work.then(done, done);
196
+ });
197
+ }
198
+ class ExportSlots {
199
+ free;
200
+ waiting = [];
201
+ constructor(free) {
202
+ this.free = free;
203
+ }
204
+ acquire(signal) {
205
+ if (signal.aborted)
206
+ return Promise.resolve(false);
207
+ if (this.free > 0) {
208
+ this.free -= 1;
209
+ return Promise.resolve(true);
210
+ }
211
+ return new Promise((resolve) => {
212
+ const cancel = () => {
213
+ this.waiting.splice(this.waiting.indexOf(grant), 1);
214
+ resolve(false);
215
+ };
216
+ const grant = () => {
217
+ signal.removeEventListener('abort', cancel);
218
+ resolve(true);
219
+ };
220
+ this.waiting.push(grant);
221
+ signal.addEventListener('abort', cancel, { once: true });
222
+ });
223
+ }
224
+ release() {
225
+ const next = this.waiting.shift();
226
+ if (next)
227
+ next();
228
+ else
229
+ this.free += 1;
230
+ }
231
+ }
232
+ exports.ExportSlots = ExportSlots;
233
+ class SpoolExportCall {
234
+ transport;
235
+ exporter;
236
+ controller = new AbortController();
237
+ signal = this.controller.signal;
238
+ constructor(transport, exporter) {
239
+ this.transport = transport;
240
+ this.exporter = exporter;
241
+ }
242
+ abort(result) {
243
+ if (!this.controller.signal.aborted)
244
+ this.controller.abort(result);
245
+ this.transport.abandon(true);
246
+ }
247
+ end() {
248
+ this.transport.abandon(true);
249
+ }
250
+ send(spans) {
251
+ return new Promise((resolve) => {
252
+ this.exporter.export(spans, (result) => resolve(this.outcome(result)));
253
+ }).catch(() => this.outcome({ code: core_1.ExportResultCode.FAILED }));
254
+ }
255
+ outcome(result) {
256
+ if (result.code === core_1.ExportResultCode.SUCCESS)
257
+ return ACKNOWLEDGED;
258
+ if (this.signal.aborted)
259
+ return this.signal.reason;
260
+ return backendOutcome(result.error);
261
+ }
262
+ }
263
+ exports.SpoolExportCall = SpoolExportCall;
264
+ function exportSpooledBatches(entries, ship, slots, signal) {
265
+ return Promise.all(entries.map(async (entry) => {
266
+ if (!('spans' in entry))
267
+ return entry;
268
+ if (!(await slots.acquire(signal)))
269
+ return signal.reason;
270
+ try {
271
+ await nextTurn();
272
+ return signal.aborted ? signal.reason : await ship(entry.spans);
273
+ }
274
+ finally {
275
+ slots.release();
276
+ }
277
+ }));
278
+ }
279
+ //# sourceMappingURL=otel-spool-export.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"otel-spool-export.js","sourceRoot":"","sources":["../../src/observability/otel-spool-export.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ import { type ExportResponse, type IExporterTransport } from '@opentelemetry/otlp-exporter-base';
2
+ /**
3
+ * OTLP/HTTP transport with OpenTelemetry's retry rules whose requests and
4
+ * retry waits the owning runtime can end, so none outlives `close()`.
5
+ */
6
+ export declare class OwnedOtlpHttpTransport implements IExporterTransport {
7
+ private readonly url;
8
+ private readonly headers;
9
+ private readonly requests;
10
+ private readonly waits;
11
+ private retired;
12
+ constructor(url: URL, headers: Readonly<Record<string, string>>);
13
+ send(data: Uint8Array, timeoutMillis: number): Promise<ExportResponse>;
14
+ /** Fails every open request and retry wait now; `retire` also fails every later one. */
15
+ abandon(retire: boolean): void;
16
+ shutdown(): void;
17
+ private wait;
18
+ private post;
19
+ }
20
+ //# sourceMappingURL=otlp-http-transport.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"otlp-http-transport.d.ts","sourceRoot":"","sources":["../../src/observability/otlp-http-transport.ts"],"names":[],"mappings":"AAEA,OAAO,EAEL,KAAK,cAAc,EACnB,KAAK,kBAAkB,EACxB,MAAM,mCAAmC,CAAC;AA+D3C;;;GAGG;AACH,qBAAa,sBAAuB,YAAW,kBAAkB;IAM7D,OAAO,CAAC,QAAQ,CAAC,GAAG;IACpB,OAAO,CAAC,QAAQ,CAAC,OAAO;IAN1B,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAA4B;IACrD,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAyB;IAC/C,OAAO,CAAC,OAAO,CAAS;gBAGL,GAAG,EAAE,GAAG,EACR,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAGtD,IAAI,CAAC,IAAI,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC;IAc5E,wFAAwF;IACxF,OAAO,CAAC,MAAM,EAAE,OAAO,GAAG,IAAI;IAM9B,QAAQ,IAAI,IAAI;IAIhB,OAAO,CAAC,IAAI;IAcZ,OAAO,CAAC,IAAI;CAsBb"}
@@ -0,0 +1,141 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.OwnedOtlpHttpTransport = void 0;
4
+ const node_http_1 = require("node:http");
5
+ const node_https_1 = require("node:https");
6
+ const otlp_exporter_base_1 = require("@opentelemetry/otlp-exporter-base");
7
+ const MAX_RETRIES = 5;
8
+ const MAX_RESPONSE_BYTES = 4 * 1024 * 1024;
9
+ const RETRYABLE_STATUS = new Set([429, 502, 503, 504]);
10
+ const RETRYABLE_NETWORK_CODES = new Set([
11
+ 'ECONNRESET',
12
+ 'ECONNREFUSED',
13
+ 'EPIPE',
14
+ 'ETIMEDOUT',
15
+ 'EAI_AGAIN',
16
+ 'ENOTFOUND',
17
+ 'ENETUNREACH',
18
+ 'EHOSTUNREACH',
19
+ ]);
20
+ function backoffMillis(retry) {
21
+ return Math.min(1_000 * 1.5 ** retry * (0.8 + Math.random() * 0.4), 5_000);
22
+ }
23
+ function retryAfterMillis(header) {
24
+ if (header === undefined)
25
+ return undefined;
26
+ const seconds = Number.parseInt(header, 10);
27
+ if (Number.isInteger(seconds))
28
+ return Math.max(seconds, 0) * 1_000;
29
+ const delay = Date.parse(header) - Date.now();
30
+ return Number.isNaN(delay) ? undefined : Math.max(delay, 0);
31
+ }
32
+ function responseResult(response, body) {
33
+ const status = response.statusCode ?? 0;
34
+ if (status >= 200 && status <= 299)
35
+ return { status: 'success', data: body };
36
+ if (RETRYABLE_STATUS.has(status)) {
37
+ const retryAfter = response.headers['retry-after'];
38
+ return { status: 'retryable', retryInMillis: retryAfterMillis(retryAfter) };
39
+ }
40
+ return {
41
+ status: 'failure',
42
+ error: new otlp_exporter_base_1.OTLPExporterError(response.statusMessage, status, body.toString()),
43
+ };
44
+ }
45
+ function networkResult(error) {
46
+ const retryable = error.code !== undefined && RETRYABLE_NETWORK_CODES.has(error.code);
47
+ return retryable ? { status: 'retryable', error } : { status: 'failure', error };
48
+ }
49
+ function readResponse(response, finish) {
50
+ const chunks = [];
51
+ let size = 0;
52
+ response.on('data', (chunk) => {
53
+ size += chunk.length;
54
+ if (size <= MAX_RESPONSE_BYTES)
55
+ return void chunks.push(chunk);
56
+ finish(responseResult(response, Buffer.alloc(0)));
57
+ response.destroy();
58
+ });
59
+ response.on('end', () => finish(responseResult(response, Buffer.concat(chunks))));
60
+ response.on('error', (error) => finish({ status: 'failure', error }));
61
+ }
62
+ function abandonedError() {
63
+ return new Error('ArmorIQ telemetry export abandoned');
64
+ }
65
+ /**
66
+ * OTLP/HTTP transport with OpenTelemetry's retry rules whose requests and
67
+ * retry waits the owning runtime can end, so none outlives `close()`.
68
+ */
69
+ class OwnedOtlpHttpTransport {
70
+ url;
71
+ headers;
72
+ requests = new Set();
73
+ waits = new Set();
74
+ retired = false;
75
+ constructor(url, headers) {
76
+ this.url = url;
77
+ this.headers = headers;
78
+ }
79
+ async send(data, timeoutMillis) {
80
+ const deadline = Date.now() + timeoutMillis;
81
+ let result = await this.post(data, timeoutMillis);
82
+ for (let retry = 0; result.status === 'retryable' && retry < MAX_RETRIES; retry++) {
83
+ const delay = result.retryInMillis ?? backoffMillis(retry);
84
+ if (delay > deadline - Date.now())
85
+ return result;
86
+ if (!(await this.wait(delay)))
87
+ return { status: 'failure', error: abandonedError() };
88
+ const remaining = deadline - Date.now();
89
+ if (remaining <= 0)
90
+ return result;
91
+ result = await this.post(data, remaining);
92
+ }
93
+ return result;
94
+ }
95
+ /** Fails every open request and retry wait now; `retire` also fails every later one. */
96
+ abandon(retire) {
97
+ this.retired ||= retire;
98
+ for (const stop of [...this.waits])
99
+ stop();
100
+ for (const request of [...this.requests])
101
+ request.destroy(abandonedError());
102
+ }
103
+ shutdown() {
104
+ this.abandon(true);
105
+ }
106
+ wait(delayMillis) {
107
+ if (this.retired)
108
+ return Promise.resolve(false);
109
+ return new Promise((resolve) => {
110
+ const settle = (elapsed) => {
111
+ clearTimeout(timer);
112
+ this.waits.delete(stop);
113
+ resolve(elapsed);
114
+ };
115
+ const stop = () => settle(false);
116
+ const timer = setTimeout(() => settle(true), delayMillis);
117
+ this.waits.add(stop);
118
+ });
119
+ }
120
+ post(data, timeoutMillis) {
121
+ if (this.retired)
122
+ return Promise.resolve({ status: 'failure', error: abandonedError() });
123
+ return new Promise((resolve) => {
124
+ const finish = (result) => {
125
+ this.requests.delete(request);
126
+ resolve(result);
127
+ };
128
+ const send = this.url.protocol === 'http:' ? node_http_1.request : node_https_1.request;
129
+ const request = send(this.url, { method: 'POST', headers: this.headers, agent: false }, (response) => readResponse(response, finish));
130
+ this.requests.add(request);
131
+ request.setTimeout(timeoutMillis, () => {
132
+ request.destroy();
133
+ finish({ status: 'retryable', error: new Error('Request timed out') });
134
+ });
135
+ request.on('error', (error) => finish(networkResult(error)));
136
+ request.end(data);
137
+ });
138
+ }
139
+ }
140
+ exports.OwnedOtlpHttpTransport = OwnedOtlpHttpTransport;
141
+ //# sourceMappingURL=otlp-http-transport.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"otlp-http-transport.js","sourceRoot":"","sources":["../../src/observability/otlp-http-transport.ts"],"names":[],"mappings":"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"}
@@ -16,7 +16,32 @@ export interface PolicyLease {
16
16
  /** Debug capture must expire even if a stale caller keeps this lease. */
17
17
  readonly debugExpiresAt: Date | null;
18
18
  }
19
+ /** The JSON form `parsePolicyLease` accepts, as written to a `PolicyLeaseStore`. */
20
+ export interface PolicyLeaseRecord {
21
+ readonly binding: string;
22
+ readonly captureMode: CaptureMode;
23
+ readonly revision: number;
24
+ readonly expiresAt: string;
25
+ readonly contentCaptureAllowed: boolean;
26
+ readonly externalContentCaptureAllowed: boolean;
27
+ readonly debugExpiresAt: string | null;
28
+ }
29
+ /**
30
+ * Caller-owned storage that lets several processes share one lease until it
31
+ * expires. `binding` is the hex SHA-256 of the backend endpoint and API key
32
+ * of the runtime that wrote the record; a runtime uses a stored record only
33
+ * when that matches its own. Each `read` or `write` has 250 ms before the
34
+ * runtime treats it as a miss.
35
+ */
36
+ export interface PolicyLeaseStore {
37
+ read(): Promise<unknown>;
38
+ write(lease: PolicyLeaseRecord): Promise<void>;
39
+ }
19
40
  export declare function parsePolicyLease(payload: unknown): PolicyLease;
41
+ export declare function policyLeaseBinding(backendEndpoint: string, apiKey: string): string;
42
+ export declare function serializePolicyLease(lease: PolicyLease, binding: string): PolicyLeaseRecord;
43
+ export declare function readStoredPolicyLease(store: PolicyLeaseStore, binding: string, signal: AbortSignal): Promise<PolicyLease | null>;
44
+ export declare function writeStoredPolicyLease(store: PolicyLeaseStore, lease: PolicyLease, binding: string, signal: AbortSignal): void;
20
45
  export declare function fallbackPolicyLease(): PolicyLease;
21
46
  export declare function isLeaseCurrent(lease: PolicyLease): boolean;
22
47
  //# sourceMappingURL=policy-lease.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"policy-lease.d.ts","sourceRoot":"","sources":["../../src/observability/policy-lease.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AACjD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAE3D,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,WAAW,EAAE,WAAW,CAAC;IAClC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,SAAS,EAAE,IAAI,CAAC;IACzB,2DAA2D;IAC3D,QAAQ,CAAC,aAAa,EAAE,OAAO,CAAC;IAChC,2EAA2E;IAC3E,QAAQ,CAAC,qBAAqB,EAAE,OAAO,CAAC;IACxC,uEAAuE;IACvE,QAAQ,CAAC,6BAA6B,EAAE,OAAO,CAAC;IAChD,6EAA6E;IAC7E,QAAQ,CAAC,sBAAsB,EAAE,OAAO,CAAC;IACzC,QAAQ,CAAC,iBAAiB,EAAE,iBAAiB,CAAC;IAC9C,yEAAyE;IACzE,QAAQ,CAAC,cAAc,EAAE,IAAI,GAAG,IAAI,CAAC;CACtC;AAaD,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,OAAO,GAAG,WAAW,CA+C9D;AAwBD,wBAAgB,mBAAmB,IAAI,WAAW,CAYjD;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,WAAW,GAAG,OAAO,CAE1D"}
1
+ {"version":3,"file":"policy-lease.d.ts","sourceRoot":"","sources":["../../src/observability/policy-lease.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AACjD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAE3D,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,WAAW,EAAE,WAAW,CAAC;IAClC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,SAAS,EAAE,IAAI,CAAC;IACzB,2DAA2D;IAC3D,QAAQ,CAAC,aAAa,EAAE,OAAO,CAAC;IAChC,2EAA2E;IAC3E,QAAQ,CAAC,qBAAqB,EAAE,OAAO,CAAC;IACxC,uEAAuE;IACvE,QAAQ,CAAC,6BAA6B,EAAE,OAAO,CAAC;IAChD,6EAA6E;IAC7E,QAAQ,CAAC,sBAAsB,EAAE,OAAO,CAAC;IACzC,QAAQ,CAAC,iBAAiB,EAAE,iBAAiB,CAAC;IAC9C,yEAAyE;IACzE,QAAQ,CAAC,cAAc,EAAE,IAAI,GAAG,IAAI,CAAC;CACtC;AAED,oFAAoF;AACpF,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,WAAW,EAAE,WAAW,CAAC;IAClC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,qBAAqB,EAAE,OAAO,CAAC;IACxC,QAAQ,CAAC,6BAA6B,EAAE,OAAO,CAAC;IAChD,QAAQ,CAAC,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;CACxC;AAED;;;;;;GAMG;AACH,MAAM,WAAW,gBAAgB;IAC/B,IAAI,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC;IACzB,KAAK,CAAC,KAAK,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAChD;AAcD,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,OAAO,GAAG,WAAW,CA+C9D;AAwBD,wBAAgB,kBAAkB,CAAC,eAAe,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAElF;AAED,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,GAAG,iBAAiB,CAU3F;AAoBD,wBAAsB,qBAAqB,CACzC,KAAK,EAAE,gBAAgB,EACvB,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,WAAW,GAClB,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,CAQ7B;AAED,wBAAgB,sBAAsB,CACpC,KAAK,EAAE,gBAAgB,EACvB,KAAK,EAAE,WAAW,EAClB,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,WAAW,GAClB,IAAI,CAEN;AAED,wBAAgB,mBAAmB,IAAI,WAAW,CAYjD;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,WAAW,GAAG,OAAO,CAE1D"}
@@ -1,9 +1,15 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.parsePolicyLease = parsePolicyLease;
4
+ exports.policyLeaseBinding = policyLeaseBinding;
5
+ exports.serializePolicyLease = serializePolicyLease;
6
+ exports.readStoredPolicyLease = readStoredPolicyLease;
7
+ exports.writeStoredPolicyLease = writeStoredPolicyLease;
4
8
  exports.fallbackPolicyLease = fallbackPolicyLease;
5
9
  exports.isLeaseCurrent = isLeaseCurrent;
10
+ const crypto_1 = require("crypto");
6
11
  const LEASE_MS = 60_000;
12
+ const STORE_DEADLINE_MS = 250;
7
13
  const MODES = new Set(['off', 'metadata', 'enhanced', 'debug']);
8
14
  // `new Date("2026-09-10T12:00:00")` (no offset) is parsed as local time, so
9
15
  // the same lease resolves to a different, unannounced instant on every host.
@@ -83,6 +89,49 @@ function deriveReason(input) {
83
89
  return 'external_content_disabled';
84
90
  return 'captured';
85
91
  }
92
+ function policyLeaseBinding(backendEndpoint, apiKey) {
93
+ return (0, crypto_1.createHash)('sha256').update(`${backendEndpoint}\n${apiKey}`).digest('hex');
94
+ }
95
+ function serializePolicyLease(lease, binding) {
96
+ return {
97
+ binding,
98
+ captureMode: lease.captureMode,
99
+ revision: lease.revision,
100
+ expiresAt: lease.expiresAt.toISOString(),
101
+ contentCaptureAllowed: lease.contentCaptureAllowed,
102
+ externalContentCaptureAllowed: lease.externalContentCaptureAllowed,
103
+ debugExpiresAt: lease.debugExpiresAt?.toISOString() ?? null,
104
+ };
105
+ }
106
+ function withinStoreDeadline(call, signal) {
107
+ if (signal.aborted)
108
+ return Promise.resolve(undefined);
109
+ return new Promise((resolve) => {
110
+ const settle = (value) => {
111
+ clearTimeout(timer);
112
+ signal.removeEventListener('abort', miss);
113
+ resolve(value);
114
+ };
115
+ const miss = () => settle();
116
+ const timer = setTimeout(miss, STORE_DEADLINE_MS);
117
+ signal.addEventListener('abort', miss, { once: true });
118
+ Promise.resolve().then(call).then(settle, miss);
119
+ });
120
+ }
121
+ async function readStoredPolicyLease(store, binding, signal) {
122
+ const record = await withinStoreDeadline(() => store.read(), signal);
123
+ if (record?.binding !== binding)
124
+ return null;
125
+ try {
126
+ return parsePolicyLease(record);
127
+ }
128
+ catch {
129
+ return null;
130
+ }
131
+ }
132
+ function writeStoredPolicyLease(store, lease, binding, signal) {
133
+ void withinStoreDeadline(() => store.write(serializePolicyLease(lease, binding)), signal);
134
+ }
86
135
  function fallbackPolicyLease() {
87
136
  return Object.freeze({
88
137
  captureMode: 'metadata',