@baguette-studios/kernl-telemetry 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +13 -0
- package/README.md +11 -0
- package/dist/delivery.d.ts +151 -0
- package/dist/delivery.d.ts.map +1 -0
- package/dist/delivery.js +237 -0
- package/dist/delivery.js.map +1 -0
- package/dist/index.d.ts +246 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +531 -0
- package/dist/index.js.map +1 -0
- package/dist/semantic.d.ts +53 -0
- package/dist/semantic.d.ts.map +1 -0
- package/dist/semantic.js +244 -0
- package/dist/semantic.js.map +1 -0
- package/dist/sinks.d.ts +114 -0
- package/dist/sinks.d.ts.map +1 -0
- package/dist/sinks.js +247 -0
- package/dist/sinks.js.map +1 -0
- package/package.json +41 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
Copyright (c) 2026 Jules Astier
|
|
2
|
+
|
|
3
|
+
Permission to use, copy, modify, and/or distribute this software for any
|
|
4
|
+
purpose with or without fee is hereby granted, provided that the above
|
|
5
|
+
copyright notice and this permission notice appear in all copies.
|
|
6
|
+
|
|
7
|
+
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
|
8
|
+
WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
|
9
|
+
MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
|
10
|
+
ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
|
11
|
+
WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
|
12
|
+
ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
|
13
|
+
OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
# @baguette-studios/kernl-telemetry
|
|
2
|
+
|
|
3
|
+
Canonical Kernl telemetry records, trace views, privacy filters, exporter contracts, and evaluation hooks.
|
|
4
|
+
|
|
5
|
+
```bash
|
|
6
|
+
npm install @baguette-studios/kernl-telemetry
|
|
7
|
+
```
|
|
8
|
+
|
|
9
|
+
The React UI package uses the trace-view contracts from this package. Applications can also use it to build customer-owned telemetry exporters without depending on the private hosted runtime.
|
|
10
|
+
|
|
11
|
+
See the [observability documentation](https://github.com/Jules-Astier/agent-context/tree/main/docs/observability) for privacy and export guidance.
|
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
import { TELEMETRY_SCHEMA_VERSION, type TelemetryFilterOptions, type TelemetryRecord, type TelemetryRecordKind, type TelemetryRecordName, type TelemetryStatus } from "./index.js";
|
|
2
|
+
export type TelemetryDeliverySinkKind = "webhook" | "object-storage" | "warehouse" | "memory";
|
|
3
|
+
export type TelemetryDeliveryFilter = TelemetryFilterOptions & {
|
|
4
|
+
kinds?: readonly TelemetryRecordKind[] | undefined;
|
|
5
|
+
names?: readonly TelemetryRecordName[] | undefined;
|
|
6
|
+
statuses?: readonly TelemetryStatus[] | undefined;
|
|
7
|
+
traceIds?: readonly string[] | undefined;
|
|
8
|
+
sessionIds?: readonly string[] | undefined;
|
|
9
|
+
runIds?: readonly string[] | undefined;
|
|
10
|
+
};
|
|
11
|
+
export type TelemetryDeliverySinkConfigBase = {
|
|
12
|
+
id: string;
|
|
13
|
+
kind: TelemetryDeliverySinkKind;
|
|
14
|
+
enabled?: boolean | undefined;
|
|
15
|
+
filter?: TelemetryDeliveryFilter | undefined;
|
|
16
|
+
};
|
|
17
|
+
export type TelemetryWebhookSinkConfig = TelemetryDeliverySinkConfigBase & {
|
|
18
|
+
kind: "webhook";
|
|
19
|
+
url: string;
|
|
20
|
+
secret?: string | undefined;
|
|
21
|
+
headers?: Record<string, string> | undefined;
|
|
22
|
+
};
|
|
23
|
+
export type TelemetryObjectStorageSinkConfig = TelemetryDeliverySinkConfigBase & {
|
|
24
|
+
kind: "object-storage";
|
|
25
|
+
bucket: string;
|
|
26
|
+
prefix?: string | undefined;
|
|
27
|
+
format?: TelemetryObjectStorageFormat | undefined;
|
|
28
|
+
};
|
|
29
|
+
export type TelemetryWarehouseSinkConfig = TelemetryDeliverySinkConfigBase & {
|
|
30
|
+
kind: "warehouse";
|
|
31
|
+
table: string;
|
|
32
|
+
};
|
|
33
|
+
export type TelemetryMemorySinkConfig = TelemetryDeliverySinkConfigBase & {
|
|
34
|
+
kind: "memory";
|
|
35
|
+
};
|
|
36
|
+
export type TelemetryDeliverySinkConfig = TelemetryWebhookSinkConfig | TelemetryObjectStorageSinkConfig | TelemetryWarehouseSinkConfig | TelemetryMemorySinkConfig;
|
|
37
|
+
export type TelemetryNdjsonEnvelope = {
|
|
38
|
+
version: typeof TELEMETRY_SCHEMA_VERSION;
|
|
39
|
+
batchId: string;
|
|
40
|
+
sequence: number;
|
|
41
|
+
generatedAt: number;
|
|
42
|
+
sinkId?: string | undefined;
|
|
43
|
+
record: TelemetryRecord;
|
|
44
|
+
};
|
|
45
|
+
export type TelemetryNdjsonSerializeOptions = {
|
|
46
|
+
batchId?: string | undefined;
|
|
47
|
+
generatedAt?: number | undefined;
|
|
48
|
+
sinkId?: string | undefined;
|
|
49
|
+
};
|
|
50
|
+
export type TelemetryWebhookBatch = {
|
|
51
|
+
version: typeof TELEMETRY_SCHEMA_VERSION;
|
|
52
|
+
batchId: string;
|
|
53
|
+
generatedAt: number;
|
|
54
|
+
recordCount: number;
|
|
55
|
+
records: readonly TelemetryRecord[];
|
|
56
|
+
};
|
|
57
|
+
export type TelemetryWebhookPayload = {
|
|
58
|
+
batch: TelemetryWebhookBatch;
|
|
59
|
+
body: string;
|
|
60
|
+
headers: Record<string, string>;
|
|
61
|
+
signature?: string | undefined;
|
|
62
|
+
};
|
|
63
|
+
export type TelemetryWebhookPayloadOptions = {
|
|
64
|
+
batchId?: string | undefined;
|
|
65
|
+
generatedAt?: number | undefined;
|
|
66
|
+
timestamp?: number | undefined;
|
|
67
|
+
secret?: string | undefined;
|
|
68
|
+
headers?: Record<string, string> | undefined;
|
|
69
|
+
};
|
|
70
|
+
export type TelemetryObjectStorageFormat = "ndjson" | "json";
|
|
71
|
+
export type TelemetryObjectStorageKeyOptions = {
|
|
72
|
+
prefix?: string | undefined;
|
|
73
|
+
sinkId?: string | undefined;
|
|
74
|
+
batchId?: string | undefined;
|
|
75
|
+
timestamp?: number | undefined;
|
|
76
|
+
extension?: string | undefined;
|
|
77
|
+
};
|
|
78
|
+
export type TelemetryObjectStorageBatchOptions = TelemetryObjectStorageKeyOptions & {
|
|
79
|
+
format?: TelemetryObjectStorageFormat | undefined;
|
|
80
|
+
};
|
|
81
|
+
export type TelemetryObjectStorageBatch = {
|
|
82
|
+
key: string;
|
|
83
|
+
body: string;
|
|
84
|
+
contentType: "application/x-ndjson" | "application/json";
|
|
85
|
+
recordCount: number;
|
|
86
|
+
};
|
|
87
|
+
export type TelemetryWarehouseRow = {
|
|
88
|
+
id: string;
|
|
89
|
+
schemaVersion: typeof TELEMETRY_SCHEMA_VERSION;
|
|
90
|
+
kind: TelemetryRecordKind;
|
|
91
|
+
name: TelemetryRecordName;
|
|
92
|
+
timestamp: number;
|
|
93
|
+
timestampIso: string;
|
|
94
|
+
traceId?: string | undefined;
|
|
95
|
+
sessionId?: string | undefined;
|
|
96
|
+
runId?: string | undefined;
|
|
97
|
+
spanId?: string | undefined;
|
|
98
|
+
parentSpanId?: string | undefined;
|
|
99
|
+
status?: TelemetryStatus | undefined;
|
|
100
|
+
retention?: TelemetryRecord["retention"];
|
|
101
|
+
privacyLevel?: TelemetryRecord["privacy"] extends {
|
|
102
|
+
level?: infer Level;
|
|
103
|
+
} ? Level : never;
|
|
104
|
+
error?: string | undefined;
|
|
105
|
+
attributesJson?: string | undefined;
|
|
106
|
+
inputJson?: string | undefined;
|
|
107
|
+
outputJson?: string | undefined;
|
|
108
|
+
};
|
|
109
|
+
export type TelemetryRetryClassification = {
|
|
110
|
+
retryable: boolean;
|
|
111
|
+
reason: string;
|
|
112
|
+
statusCode?: number | undefined;
|
|
113
|
+
delayMs: number;
|
|
114
|
+
};
|
|
115
|
+
export type TelemetryRetryOptions = {
|
|
116
|
+
attempt?: number | undefined;
|
|
117
|
+
maxAttempts?: number | undefined;
|
|
118
|
+
baseDelayMs?: number | undefined;
|
|
119
|
+
maxDelayMs?: number | undefined;
|
|
120
|
+
};
|
|
121
|
+
export type TelemetryDeliveryResult = {
|
|
122
|
+
status: "success" | "partial" | "error";
|
|
123
|
+
delivered: number;
|
|
124
|
+
failed: number;
|
|
125
|
+
errors?: string[] | undefined;
|
|
126
|
+
};
|
|
127
|
+
export type TelemetryDeliveryHandler = (records: readonly TelemetryRecord[]) => Promise<TelemetryDeliveryResult> | TelemetryDeliveryResult;
|
|
128
|
+
export type InMemoryTelemetryDeliveryWorkerOptions = {
|
|
129
|
+
sink: TelemetryDeliverySinkConfig;
|
|
130
|
+
deliver: TelemetryDeliveryHandler;
|
|
131
|
+
maxBatchSize?: number | undefined;
|
|
132
|
+
};
|
|
133
|
+
export type InMemoryTelemetryDeliveryWorker = {
|
|
134
|
+
readonly sink: TelemetryDeliverySinkConfig;
|
|
135
|
+
readonly pending: readonly TelemetryRecord[];
|
|
136
|
+
readonly delivered: readonly TelemetryRecord[];
|
|
137
|
+
enqueue(records: TelemetryRecord | readonly TelemetryRecord[]): number;
|
|
138
|
+
flush(): Promise<TelemetryDeliveryResult>;
|
|
139
|
+
clear(): void;
|
|
140
|
+
};
|
|
141
|
+
export declare function filterTelemetryForSink(records: readonly TelemetryRecord[], sink: TelemetryDeliverySinkConfig): TelemetryRecord[];
|
|
142
|
+
export declare function serializeTelemetryNdjsonEnvelope(records: readonly TelemetryRecord[], options?: TelemetryNdjsonSerializeOptions): string;
|
|
143
|
+
export declare function createWebhookBatchPayload(records: readonly TelemetryRecord[], options?: TelemetryWebhookPayloadOptions): TelemetryWebhookPayload;
|
|
144
|
+
export declare function signWebhookBody(body: string, secret: string, timestamp: number): string;
|
|
145
|
+
export declare function createObjectStorageKey(options?: TelemetryObjectStorageKeyOptions): string;
|
|
146
|
+
export declare function serializeObjectStorageBatch(records: readonly TelemetryRecord[], options?: TelemetryObjectStorageBatchOptions): TelemetryObjectStorageBatch;
|
|
147
|
+
export declare function telemetryRecordToWarehouseRow(record: TelemetryRecord): TelemetryWarehouseRow;
|
|
148
|
+
export declare function telemetryRecordsToWarehouseRows(records: readonly TelemetryRecord[]): TelemetryWarehouseRow[];
|
|
149
|
+
export declare function classifyTelemetryDeliveryRetry(errorOrStatus: unknown, options?: TelemetryRetryOptions): TelemetryRetryClassification;
|
|
150
|
+
export declare function createInMemoryTelemetryDeliveryWorker(options: InMemoryTelemetryDeliveryWorkerOptions): InMemoryTelemetryDeliveryWorker;
|
|
151
|
+
//# sourceMappingURL=delivery.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"delivery.d.ts","sourceRoot":"","sources":["../src/delivery.ts"],"names":[],"mappings":"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"}
|
package/dist/delivery.js
ADDED
|
@@ -0,0 +1,237 @@
|
|
|
1
|
+
import { createHmac } from "node:crypto";
|
|
2
|
+
import { TELEMETRY_SCHEMA_VERSION, filterTelemetryRecord } from "./index.js";
|
|
3
|
+
export function filterTelemetryForSink(records, sink) {
|
|
4
|
+
if (sink.enabled === false) {
|
|
5
|
+
return [];
|
|
6
|
+
}
|
|
7
|
+
return records
|
|
8
|
+
.filter((record) => matchesDeliveryFilter(record, sink.filter))
|
|
9
|
+
.map((record) => filterTelemetryRecord(record, sink.filter))
|
|
10
|
+
.filter((record) => record !== undefined);
|
|
11
|
+
}
|
|
12
|
+
export function serializeTelemetryNdjsonEnvelope(records, options = {}) {
|
|
13
|
+
const batchId = options.batchId ?? defaultBatchId(records);
|
|
14
|
+
const generatedAt = options.generatedAt ?? Date.now();
|
|
15
|
+
return records
|
|
16
|
+
.map((record, index) => JSON.stringify(compactObject({
|
|
17
|
+
version: TELEMETRY_SCHEMA_VERSION,
|
|
18
|
+
batchId,
|
|
19
|
+
sequence: index,
|
|
20
|
+
generatedAt,
|
|
21
|
+
sinkId: options.sinkId,
|
|
22
|
+
record
|
|
23
|
+
})))
|
|
24
|
+
.join("\n");
|
|
25
|
+
}
|
|
26
|
+
export function createWebhookBatchPayload(records, options = {}) {
|
|
27
|
+
const generatedAt = options.generatedAt ?? Date.now();
|
|
28
|
+
const timestamp = options.timestamp ?? generatedAt;
|
|
29
|
+
const batch = {
|
|
30
|
+
version: TELEMETRY_SCHEMA_VERSION,
|
|
31
|
+
batchId: options.batchId ?? defaultBatchId(records),
|
|
32
|
+
generatedAt,
|
|
33
|
+
recordCount: records.length,
|
|
34
|
+
records
|
|
35
|
+
};
|
|
36
|
+
const body = JSON.stringify(batch);
|
|
37
|
+
const signature = options.secret ? signWebhookBody(body, options.secret, timestamp) : undefined;
|
|
38
|
+
const headers = compactStringHeaders({
|
|
39
|
+
"content-type": "application/json",
|
|
40
|
+
"x-kernl-schema-version": TELEMETRY_SCHEMA_VERSION,
|
|
41
|
+
"x-kernl-batch-id": batch.batchId,
|
|
42
|
+
"x-kernl-timestamp": String(timestamp),
|
|
43
|
+
"x-kernl-signature": signature,
|
|
44
|
+
...options.headers
|
|
45
|
+
});
|
|
46
|
+
return compactObject({ batch, body, headers, signature });
|
|
47
|
+
}
|
|
48
|
+
export function signWebhookBody(body, secret, timestamp) {
|
|
49
|
+
return `sha256=${createHmac("sha256", secret).update(`${timestamp}.${body}`).digest("hex")}`;
|
|
50
|
+
}
|
|
51
|
+
export function createObjectStorageKey(options = {}) {
|
|
52
|
+
const timestamp = options.timestamp ?? Date.now();
|
|
53
|
+
const date = new Date(timestamp);
|
|
54
|
+
const prefix = trimSlashes(options.prefix ?? "telemetry");
|
|
55
|
+
const sinkPart = safePathPart(options.sinkId ?? "default");
|
|
56
|
+
const batchId = safePathPart(options.batchId ?? `batch-${timestamp}`);
|
|
57
|
+
const extension = trimSlashes(options.extension ?? "ndjson");
|
|
58
|
+
const parts = [
|
|
59
|
+
prefix,
|
|
60
|
+
`sink=${sinkPart}`,
|
|
61
|
+
`year=${date.getUTCFullYear()}`,
|
|
62
|
+
`month=${pad2(date.getUTCMonth() + 1)}`,
|
|
63
|
+
`day=${pad2(date.getUTCDate())}`,
|
|
64
|
+
`hour=${pad2(date.getUTCHours())}`,
|
|
65
|
+
`${batchId}.${extension}`
|
|
66
|
+
];
|
|
67
|
+
return parts.filter(Boolean).join("/");
|
|
68
|
+
}
|
|
69
|
+
export function serializeObjectStorageBatch(records, options = {}) {
|
|
70
|
+
const format = options.format ?? "ndjson";
|
|
71
|
+
const batchId = options.batchId ?? defaultBatchId(records);
|
|
72
|
+
const timestamp = options.timestamp ?? Date.now();
|
|
73
|
+
const key = createObjectStorageKey({
|
|
74
|
+
...options,
|
|
75
|
+
batchId,
|
|
76
|
+
timestamp,
|
|
77
|
+
extension: options.extension ?? format
|
|
78
|
+
});
|
|
79
|
+
const body = format === "json"
|
|
80
|
+
? JSON.stringify({ version: TELEMETRY_SCHEMA_VERSION, batchId, generatedAt: timestamp, records })
|
|
81
|
+
: serializeTelemetryNdjsonEnvelope(records, { batchId, generatedAt: timestamp, sinkId: options.sinkId });
|
|
82
|
+
return {
|
|
83
|
+
key,
|
|
84
|
+
body,
|
|
85
|
+
contentType: format === "json" ? "application/json" : "application/x-ndjson",
|
|
86
|
+
recordCount: records.length
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
export function telemetryRecordToWarehouseRow(record) {
|
|
90
|
+
return compactObject({
|
|
91
|
+
id: record.id,
|
|
92
|
+
schemaVersion: record.version,
|
|
93
|
+
kind: record.kind,
|
|
94
|
+
name: record.name,
|
|
95
|
+
timestamp: record.timestamp,
|
|
96
|
+
timestampIso: new Date(record.timestamp).toISOString(),
|
|
97
|
+
traceId: record.traceId,
|
|
98
|
+
sessionId: record.sessionId,
|
|
99
|
+
runId: record.runId,
|
|
100
|
+
spanId: record.spanId,
|
|
101
|
+
parentSpanId: record.parentSpanId,
|
|
102
|
+
status: record.status,
|
|
103
|
+
retention: record.retention,
|
|
104
|
+
privacyLevel: record.privacy?.level,
|
|
105
|
+
error: record.error,
|
|
106
|
+
attributesJson: stringifyOptional(record.attributes),
|
|
107
|
+
inputJson: stringifyOptional(record.input),
|
|
108
|
+
outputJson: stringifyOptional(record.output)
|
|
109
|
+
});
|
|
110
|
+
}
|
|
111
|
+
export function telemetryRecordsToWarehouseRows(records) {
|
|
112
|
+
return records.map(telemetryRecordToWarehouseRow);
|
|
113
|
+
}
|
|
114
|
+
export function classifyTelemetryDeliveryRetry(errorOrStatus, options = {}) {
|
|
115
|
+
const statusCode = typeof errorOrStatus === "number" ? errorOrStatus : getStatusCode(errorOrStatus);
|
|
116
|
+
const maxAttempts = options.maxAttempts ?? 3;
|
|
117
|
+
const attempt = options.attempt ?? 1;
|
|
118
|
+
const hasAttemptsRemaining = attempt < maxAttempts;
|
|
119
|
+
const baseDelayMs = options.baseDelayMs ?? 500;
|
|
120
|
+
const maxDelayMs = options.maxDelayMs ?? 30_000;
|
|
121
|
+
let retryable = false;
|
|
122
|
+
let reason = "not-retryable";
|
|
123
|
+
if (typeof statusCode === "number") {
|
|
124
|
+
retryable = statusCode === 408 || statusCode === 409 || statusCode === 425 || statusCode === 429 || statusCode >= 500;
|
|
125
|
+
if (statusCode === 501 || statusCode === 505) {
|
|
126
|
+
retryable = false;
|
|
127
|
+
}
|
|
128
|
+
reason = retryable ? `http-${statusCode}` : `http-${statusCode}-not-retryable`;
|
|
129
|
+
}
|
|
130
|
+
else if (isRetryableError(errorOrStatus)) {
|
|
131
|
+
retryable = true;
|
|
132
|
+
reason = "transient-error";
|
|
133
|
+
}
|
|
134
|
+
retryable = retryable && hasAttemptsRemaining;
|
|
135
|
+
return compactObject({
|
|
136
|
+
retryable,
|
|
137
|
+
reason: retryable ? reason : attempt >= maxAttempts ? "attempts-exhausted" : reason,
|
|
138
|
+
statusCode,
|
|
139
|
+
delayMs: retryable ? Math.min(maxDelayMs, baseDelayMs * 2 ** Math.max(0, attempt - 1)) : 0
|
|
140
|
+
});
|
|
141
|
+
}
|
|
142
|
+
export function createInMemoryTelemetryDeliveryWorker(options) {
|
|
143
|
+
const pending = [];
|
|
144
|
+
const delivered = [];
|
|
145
|
+
const maxBatchSize = Math.max(1, options.maxBatchSize ?? 100);
|
|
146
|
+
return {
|
|
147
|
+
sink: options.sink,
|
|
148
|
+
get pending() {
|
|
149
|
+
return pending;
|
|
150
|
+
},
|
|
151
|
+
get delivered() {
|
|
152
|
+
return delivered;
|
|
153
|
+
},
|
|
154
|
+
enqueue(records) {
|
|
155
|
+
const input = Array.isArray(records) ? records : [records];
|
|
156
|
+
const filtered = filterTelemetryForSink(input, options.sink);
|
|
157
|
+
pending.push(...filtered);
|
|
158
|
+
return filtered.length;
|
|
159
|
+
},
|
|
160
|
+
async flush() {
|
|
161
|
+
if (pending.length === 0) {
|
|
162
|
+
return { status: "success", delivered: 0, failed: 0 };
|
|
163
|
+
}
|
|
164
|
+
const batch = pending.slice(0, maxBatchSize);
|
|
165
|
+
const result = await options.deliver(batch);
|
|
166
|
+
const accepted = Math.max(0, Math.min(batch.length, result.delivered));
|
|
167
|
+
if (accepted > 0) {
|
|
168
|
+
delivered.push(...batch.slice(0, accepted));
|
|
169
|
+
pending.splice(0, accepted);
|
|
170
|
+
}
|
|
171
|
+
return {
|
|
172
|
+
status: result.status,
|
|
173
|
+
delivered: result.delivered,
|
|
174
|
+
failed: result.failed,
|
|
175
|
+
...(result.errors?.length ? { errors: result.errors } : {})
|
|
176
|
+
};
|
|
177
|
+
},
|
|
178
|
+
clear() {
|
|
179
|
+
pending.splice(0, pending.length);
|
|
180
|
+
}
|
|
181
|
+
};
|
|
182
|
+
}
|
|
183
|
+
function matchesDeliveryFilter(record, filter) {
|
|
184
|
+
if (!filter) {
|
|
185
|
+
return true;
|
|
186
|
+
}
|
|
187
|
+
return (includesIfPresent(filter.kinds, record.kind) &&
|
|
188
|
+
includesIfPresent(filter.names, record.name) &&
|
|
189
|
+
includesIfPresent(filter.statuses, record.status) &&
|
|
190
|
+
includesIfPresent(filter.traceIds, record.traceId) &&
|
|
191
|
+
includesIfPresent(filter.sessionIds, record.sessionId) &&
|
|
192
|
+
includesIfPresent(filter.runIds, record.runId));
|
|
193
|
+
}
|
|
194
|
+
function includesIfPresent(values, value) {
|
|
195
|
+
return values === undefined || (value !== undefined && values.includes(value));
|
|
196
|
+
}
|
|
197
|
+
function defaultBatchId(records) {
|
|
198
|
+
return records.length === 0 ? "batch-empty" : `batch-${records[0]?.id}-${records.length}`;
|
|
199
|
+
}
|
|
200
|
+
function compactObject(input) {
|
|
201
|
+
return Object.fromEntries(Object.entries(input).filter(([, value]) => value !== undefined));
|
|
202
|
+
}
|
|
203
|
+
function compactStringHeaders(input) {
|
|
204
|
+
return Object.fromEntries(Object.entries(input).filter(([, value]) => value !== undefined));
|
|
205
|
+
}
|
|
206
|
+
function stringifyOptional(value) {
|
|
207
|
+
return value === undefined ? undefined : JSON.stringify(value);
|
|
208
|
+
}
|
|
209
|
+
function trimSlashes(value) {
|
|
210
|
+
return value.replace(/^\/+|\/+$/g, "");
|
|
211
|
+
}
|
|
212
|
+
function safePathPart(value) {
|
|
213
|
+
return value.replace(/[^a-zA-Z0-9._=-]+/g, "-");
|
|
214
|
+
}
|
|
215
|
+
function pad2(value) {
|
|
216
|
+
return String(value).padStart(2, "0");
|
|
217
|
+
}
|
|
218
|
+
function getStatusCode(value) {
|
|
219
|
+
if (typeof value !== "object" || value === null) {
|
|
220
|
+
return undefined;
|
|
221
|
+
}
|
|
222
|
+
const record = value;
|
|
223
|
+
const status = record.statusCode ?? record.status ?? record.response?.status;
|
|
224
|
+
return typeof status === "number" ? status : undefined;
|
|
225
|
+
}
|
|
226
|
+
function isRetryableError(value) {
|
|
227
|
+
if (!(value instanceof Error)) {
|
|
228
|
+
return false;
|
|
229
|
+
}
|
|
230
|
+
const code = value.code;
|
|
231
|
+
return (code === "ECONNRESET" ||
|
|
232
|
+
code === "ETIMEDOUT" ||
|
|
233
|
+
code === "ECONNREFUSED" ||
|
|
234
|
+
code === "EAI_AGAIN" ||
|
|
235
|
+
/timeout|temporar|network|socket/i.test(value.message));
|
|
236
|
+
}
|
|
237
|
+
//# sourceMappingURL=delivery.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"delivery.js","sourceRoot":"","sources":["../src/delivery.ts"],"names":[],"mappings":"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"}
|