@probemap/node 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/dist/client.d.ts +46 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +373 -0
- package/dist/client.js.map +1 -0
- package/dist/fastify.d.ts +4 -0
- package/dist/fastify.d.ts.map +1 -0
- package/dist/fastify.js +52 -0
- package/dist/fastify.js.map +1 -0
- package/dist/http-adapters.d.ts +17 -0
- package/dist/http-adapters.d.ts.map +1 -0
- package/dist/http-adapters.js +21 -0
- package/dist/http-adapters.js.map +1 -0
- package/dist/http-transport.d.ts +11 -0
- package/dist/http-transport.d.ts.map +1 -0
- package/dist/http-transport.js +31 -0
- package/dist/http-transport.js.map +1 -0
- package/dist/index.d.ts +10 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +10 -0
- package/dist/index.js.map +1 -0
- package/dist/ingest-proxy.d.ts +150 -0
- package/dist/ingest-proxy.d.ts.map +1 -0
- package/dist/ingest-proxy.js +28 -0
- package/dist/ingest-proxy.js.map +1 -0
- package/dist/source-map-service.d.ts +22 -0
- package/dist/source-map-service.d.ts.map +1 -0
- package/dist/source-map-service.js +46 -0
- package/dist/source-map-service.js.map +1 -0
- package/dist/types.d.ts +59 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/package.json +35 -0
package/dist/client.d.ts
ADDED
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { type ProbeMapEventType, type TraceHeaders } from "@probemap/shared";
|
|
2
|
+
import type { NodeAssertInput, NodeAssertionResult, NodeEventOptions, NodeHeaderSource, NodeProbeConfig, NodeProbeStatus, NodeTraceContext } from "./types.js";
|
|
3
|
+
export declare class NodeProbeClient {
|
|
4
|
+
private readonly asyncContext;
|
|
5
|
+
private initialized;
|
|
6
|
+
private enabled;
|
|
7
|
+
private config;
|
|
8
|
+
private transport;
|
|
9
|
+
private queue;
|
|
10
|
+
private timer;
|
|
11
|
+
private flushPromise;
|
|
12
|
+
private clientSequence;
|
|
13
|
+
private droppedEvents;
|
|
14
|
+
private consecutiveFailures;
|
|
15
|
+
private lastError;
|
|
16
|
+
init(input: NodeProbeConfig): void;
|
|
17
|
+
status(): NodeProbeStatus;
|
|
18
|
+
contextFromHeaders(headers: NodeHeaderSource): NodeTraceContext | undefined;
|
|
19
|
+
enterContext(context: NodeTraceContext): void;
|
|
20
|
+
enterContextFromHeaders(headers: NodeHeaderSource): boolean;
|
|
21
|
+
runWithContext<T>(context: NodeTraceContext, callback: () => T): T;
|
|
22
|
+
runWithHeaders<T>(headers: NodeHeaderSource, callback: () => T): T;
|
|
23
|
+
currentContext(): NodeTraceContext | undefined;
|
|
24
|
+
createSessionContext(input?: {
|
|
25
|
+
sessionId?: string;
|
|
26
|
+
branch?: string;
|
|
27
|
+
commitHash?: string;
|
|
28
|
+
metadata?: Record<string, unknown>;
|
|
29
|
+
}): Promise<NodeTraceContext>;
|
|
30
|
+
getTraceHeaders(): TraceHeaders | undefined;
|
|
31
|
+
step(name: string, payload?: unknown, options?: NodeEventOptions): string | undefined;
|
|
32
|
+
observe(name: string, value: unknown, options?: NodeEventOptions): string | undefined;
|
|
33
|
+
assert(name: string, assertion: NodeAssertInput): NodeAssertionResult;
|
|
34
|
+
capture(type: ProbeMapEventType, name: string, payload: unknown, options?: NodeEventOptions): string | undefined;
|
|
35
|
+
runInSpan<T>(name: string, callback: () => T | Promise<T>): Promise<T>;
|
|
36
|
+
flush(): Promise<void>;
|
|
37
|
+
destroy(): Promise<void>;
|
|
38
|
+
private reset;
|
|
39
|
+
private enqueue;
|
|
40
|
+
private scheduleFlush;
|
|
41
|
+
private clearTimer;
|
|
42
|
+
private takeNextBatch;
|
|
43
|
+
private flushInternal;
|
|
44
|
+
private emitDiagnostic;
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAEA,OAAO,EAQL,KAAK,iBAAiB,EAEtB,KAAK,YAAY,EAClB,MAAM,kBAAkB,CAAC;AAG1B,OAAO,KAAK,EACV,eAAe,EACf,mBAAmB,EACnB,gBAAgB,EAChB,gBAAgB,EAChB,eAAe,EAEf,eAAe,EAEf,gBAAgB,EACjB,MAAM,YAAY,CAAC;AA6BpB,qBAAa,eAAe;IAC1B,OAAO,CAAC,QAAQ,CAAC,YAAY,CAA6C;IAC1E,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,MAAM,CAA6B;IAC3C,OAAO,CAAC,SAAS,CAAiC;IAClD,OAAO,CAAC,KAAK,CAAuB;IACpC,OAAO,CAAC,KAAK,CAA4C;IACzD,OAAO,CAAC,YAAY,CAA4B;IAChD,OAAO,CAAC,cAAc,CAAK;IAC3B,OAAO,CAAC,aAAa,CAAK;IAC1B,OAAO,CAAC,mBAAmB,CAAK;IAChC,OAAO,CAAC,SAAS,CAAqB;IAE/B,IAAI,CAAC,KAAK,EAAE,eAAe,GAAG,IAAI,CAgCxC;IAEM,MAAM,IAAI,eAAe,CAS/B;IAEM,kBAAkB,CAAC,OAAO,EAAE,gBAAgB,GAAG,gBAAgB,GAAG,SAAS,CAOjF;IAEM,YAAY,CAAC,OAAO,EAAE,gBAAgB,GAAG,IAAI,CAEnD;IAEM,uBAAuB,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAOjE;IAEM,cAAc,CAAC,CAAC,EAAE,OAAO,EAAE,gBAAgB,EAAE,QAAQ,EAAE,MAAM,CAAC,GAAG,CAAC,CAExE;IAEM,cAAc,CAAC,CAAC,EAAE,OAAO,EAAE,gBAAgB,EAAE,QAAQ,EAAE,MAAM,CAAC,GAAG,CAAC,CAMxE;IAEM,cAAc,IAAI,gBAAgB,GAAG,SAAS,CAEpD;IAEY,oBAAoB,CAAC,KAAK,GAAE;QAAE,SAAS,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,UAAU,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;KAAO,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAKzK;IAEM,eAAe,IAAI,YAAY,GAAG,SAAS,CAwBjD;IAEM,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,GAAE,OAAY,EAAE,OAAO,GAAE,gBAAqB,GAAG,MAAM,GAAG,SAAS,CAEnG;IAEM,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,GAAE,gBAAqB,GAAG,MAAM,GAAG,SAAS,CAE/F;IAEM,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,eAAe,GAAG,mBAAmB,CAyB3E;IAEM,OAAO,CACZ,IAAI,EAAE,iBAAiB,EACvB,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,OAAO,EAChB,OAAO,GAAE,gBAAqB,GAC7B,MAAM,GAAG,SAAS,CAqDpB;IAEY,SAAS,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAiBlF;IAEY,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAelC;IAEY,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAMpC;IAED,OAAO,CAAC,KAAK;IAeb,OAAO,CAAC,OAAO;IAiBf,OAAO,CAAC,aAAa;IAQrB,OAAO,CAAC,UAAU;IAOlB,OAAO,CAAC,aAAa;YAqBP,aAAa;IA+C3B,OAAO,CAAC,cAAc;CAcvB"}
|
package/dist/client.js
ADDED
|
@@ -0,0 +1,373 @@
|
|
|
1
|
+
import { AsyncLocalStorage } from "node:async_hooks";
|
|
2
|
+
import { PROTOCOL_VERSION, createTraceHeaders, evaluateBuiltIn, parseTraceHeaders, safeSnapshot, } from "@probemap/shared";
|
|
3
|
+
import { NodeHttpTransport } from "./http-transport.js";
|
|
4
|
+
const nodeSdkVersion = "0.1.0";
|
|
5
|
+
function randomHex(byteLength) {
|
|
6
|
+
return [...crypto.getRandomValues(new Uint8Array(byteLength))]
|
|
7
|
+
.map((byte) => byte.toString(16).padStart(2, "0"))
|
|
8
|
+
.join("");
|
|
9
|
+
}
|
|
10
|
+
function errorMessage(error) {
|
|
11
|
+
return error instanceof Error ? error.message : String(error);
|
|
12
|
+
}
|
|
13
|
+
export class NodeProbeClient {
|
|
14
|
+
asyncContext = new AsyncLocalStorage();
|
|
15
|
+
initialized = false;
|
|
16
|
+
enabled = false;
|
|
17
|
+
config;
|
|
18
|
+
transport;
|
|
19
|
+
queue = [];
|
|
20
|
+
timer;
|
|
21
|
+
flushPromise;
|
|
22
|
+
clientSequence = 0;
|
|
23
|
+
droppedEvents = 0;
|
|
24
|
+
consecutiveFailures = 0;
|
|
25
|
+
lastError;
|
|
26
|
+
init(input) {
|
|
27
|
+
this.reset();
|
|
28
|
+
const environment = input.environment ?? "development";
|
|
29
|
+
const productionBlocked = environment === "production" && input.allowProduction !== true;
|
|
30
|
+
this.config = {
|
|
31
|
+
projectId: input.projectId,
|
|
32
|
+
environmentId: input.environmentId,
|
|
33
|
+
collectorUrl: input.collectorUrl,
|
|
34
|
+
serviceName: input.serviceName,
|
|
35
|
+
environment,
|
|
36
|
+
runtimeId: input.runtimeId ?? crypto.randomUUID(),
|
|
37
|
+
maxEventsPerBatch: Math.max(1, input.batching?.maxEventsPerBatch ?? 100),
|
|
38
|
+
batchIntervalMs: Math.max(10, input.batching?.batchIntervalMs ?? 300),
|
|
39
|
+
maxBufferedEvents: Math.max(1, input.batching?.maxBufferedEvents ?? 5_000),
|
|
40
|
+
maxRetryDelayMs: Math.max(100, input.batching?.maxRetryDelayMs ?? 5_000),
|
|
41
|
+
debug: input.debug ?? false,
|
|
42
|
+
onDiagnostic: input.onDiagnostic,
|
|
43
|
+
};
|
|
44
|
+
this.initialized = true;
|
|
45
|
+
this.enabled = input.enabled && !productionBlocked;
|
|
46
|
+
if (productionBlocked) {
|
|
47
|
+
this.emitDiagnostic({
|
|
48
|
+
level: "warning",
|
|
49
|
+
code: "production_disabled",
|
|
50
|
+
message: "ProbeMap Node SDK is disabled in production unless allowProduction is true.",
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
if (this.enabled) {
|
|
54
|
+
this.transport = input.transport ?? new NodeHttpTransport(input.collectorUrl, undefined, input.auth);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
status() {
|
|
58
|
+
return {
|
|
59
|
+
initialized: this.initialized,
|
|
60
|
+
enabled: this.enabled,
|
|
61
|
+
pendingEvents: this.queue.length,
|
|
62
|
+
droppedEvents: this.droppedEvents,
|
|
63
|
+
consecutiveFailures: this.consecutiveFailures,
|
|
64
|
+
...(this.lastError === undefined ? {} : { lastError: this.lastError }),
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
contextFromHeaders(headers) {
|
|
68
|
+
const parsed = parseTraceHeaders(headers);
|
|
69
|
+
if (parsed === undefined || parsed.projectId !== this.config?.projectId) {
|
|
70
|
+
return undefined;
|
|
71
|
+
}
|
|
72
|
+
return { ...parsed, currentSpanId: parsed.parentSpanId };
|
|
73
|
+
}
|
|
74
|
+
enterContext(context) {
|
|
75
|
+
this.asyncContext.enterWith(context);
|
|
76
|
+
}
|
|
77
|
+
enterContextFromHeaders(headers) {
|
|
78
|
+
const context = this.contextFromHeaders(headers);
|
|
79
|
+
if (context === undefined) {
|
|
80
|
+
return false;
|
|
81
|
+
}
|
|
82
|
+
this.enterContext(context);
|
|
83
|
+
return true;
|
|
84
|
+
}
|
|
85
|
+
runWithContext(context, callback) {
|
|
86
|
+
return this.asyncContext.run({ ...context }, callback);
|
|
87
|
+
}
|
|
88
|
+
runWithHeaders(headers, callback) {
|
|
89
|
+
const context = this.contextFromHeaders(headers);
|
|
90
|
+
if (context === undefined) {
|
|
91
|
+
return callback();
|
|
92
|
+
}
|
|
93
|
+
return this.runWithContext(context, callback);
|
|
94
|
+
}
|
|
95
|
+
currentContext() {
|
|
96
|
+
return this.asyncContext.getStore();
|
|
97
|
+
}
|
|
98
|
+
async createSessionContext(input = {}) {
|
|
99
|
+
const config = this.config;
|
|
100
|
+
if (!this.initialized || config === undefined || this.transport === undefined)
|
|
101
|
+
throw new Error("ProbeMap Node SDK must be initialized and enabled before session bootstrap.");
|
|
102
|
+
if (this.transport.bootstrapSession === undefined)
|
|
103
|
+
throw new Error("The configured ProbeMap transport does not support session bootstrap.");
|
|
104
|
+
const sessionId = input.sessionId ?? crypto.randomUUID();
|
|
105
|
+
await this.transport.bootstrapSession({ id: sessionId, projectId: config.projectId, ...(config.environmentId === undefined ? {} : { environmentId: config.environmentId }), environment: config.environment, ...(input.branch === undefined ? {} : { branch: input.branch }), ...(input.commitHash === undefined ? {} : { commitHash: input.commitHash }), ...(input.metadata === undefined ? {} : { metadata: input.metadata }) });
|
|
106
|
+
const parentSpanId = randomHex(8);
|
|
107
|
+
return { projectId: config.projectId, sessionId, traceId: randomHex(16), parentSpanId, currentSpanId: parentSpanId, sampled: true };
|
|
108
|
+
}
|
|
109
|
+
getTraceHeaders() {
|
|
110
|
+
const context = this.currentContext();
|
|
111
|
+
if (context === undefined) {
|
|
112
|
+
return undefined;
|
|
113
|
+
}
|
|
114
|
+
try {
|
|
115
|
+
return createTraceHeaders({
|
|
116
|
+
projectId: context.projectId,
|
|
117
|
+
sessionId: context.sessionId,
|
|
118
|
+
...(context.flowId === undefined ? {} : { flowId: context.flowId }),
|
|
119
|
+
traceId: context.traceId,
|
|
120
|
+
parentSpanId: context.currentSpanId,
|
|
121
|
+
sampled: context.sampled,
|
|
122
|
+
});
|
|
123
|
+
}
|
|
124
|
+
catch (error) {
|
|
125
|
+
this.emitDiagnostic({
|
|
126
|
+
level: "warning",
|
|
127
|
+
code: "trace_header_generation_failed",
|
|
128
|
+
message: "ProbeMap could not create downstream trace headers.",
|
|
129
|
+
error,
|
|
130
|
+
});
|
|
131
|
+
return undefined;
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
step(name, payload = {}, options = {}) {
|
|
135
|
+
return this.capture("probe.step", name, payload, options);
|
|
136
|
+
}
|
|
137
|
+
observe(name, value, options = {}) {
|
|
138
|
+
return this.capture("probe.observe", name, { value: safeSnapshot(value) }, options);
|
|
139
|
+
}
|
|
140
|
+
assert(name, assertion) {
|
|
141
|
+
let result;
|
|
142
|
+
try {
|
|
143
|
+
const evaluation = evaluateBuiltIn(assertion.evaluator, assertion.input, assertion.expected);
|
|
144
|
+
result = { status: evaluation.status, message: evaluation.message };
|
|
145
|
+
}
|
|
146
|
+
catch (error) {
|
|
147
|
+
result = { status: "unknown", message: `Evaluator failed safely: ${errorMessage(error)}` };
|
|
148
|
+
}
|
|
149
|
+
const eventId = this.capture("probe.assert", name, {
|
|
150
|
+
evaluator: assertion.evaluator,
|
|
151
|
+
input: safeSnapshot(assertion.input),
|
|
152
|
+
expected: safeSnapshot(assertion.expected),
|
|
153
|
+
result,
|
|
154
|
+
}, { ...assertion, status: result.status });
|
|
155
|
+
return { ...result, ...(eventId === undefined ? {} : { eventId }) };
|
|
156
|
+
}
|
|
157
|
+
capture(type, name, payload, options = {}) {
|
|
158
|
+
if (!this.enabled || this.config === undefined) {
|
|
159
|
+
return undefined;
|
|
160
|
+
}
|
|
161
|
+
const context = this.currentContext();
|
|
162
|
+
if (context === undefined) {
|
|
163
|
+
this.emitDiagnostic({
|
|
164
|
+
level: "warning",
|
|
165
|
+
code: "missing_trace_context",
|
|
166
|
+
message: `ProbeMap ignored ${name} because no request trace context is active.`,
|
|
167
|
+
});
|
|
168
|
+
return undefined;
|
|
169
|
+
}
|
|
170
|
+
try {
|
|
171
|
+
const spanId = randomHex(8);
|
|
172
|
+
const event = {
|
|
173
|
+
id: crypto.randomUUID(),
|
|
174
|
+
protocolVersion: PROTOCOL_VERSION,
|
|
175
|
+
sdkVersion: nodeSdkVersion,
|
|
176
|
+
projectId: context.projectId,
|
|
177
|
+
sessionId: context.sessionId,
|
|
178
|
+
...(context.flowId === undefined ? {} : { flowId: context.flowId }),
|
|
179
|
+
traceId: context.traceId,
|
|
180
|
+
spanId,
|
|
181
|
+
parentSpanId: context.currentSpanId,
|
|
182
|
+
...(options.linkedSpanIds === undefined ? {} : { linkedSpanIds: options.linkedSpanIds }),
|
|
183
|
+
runtimeId: this.config.runtimeId,
|
|
184
|
+
processId: String(process.pid),
|
|
185
|
+
clientSequence: ++this.clientSequence,
|
|
186
|
+
clientTimestamp: new Date().toISOString(),
|
|
187
|
+
monotonicTime: performance.now(),
|
|
188
|
+
type,
|
|
189
|
+
source: "node-sdk",
|
|
190
|
+
...(options.status === undefined ? {} : { status: options.status }),
|
|
191
|
+
name,
|
|
192
|
+
payload: safeSnapshot({ serviceName: this.config.serviceName, value: payload }),
|
|
193
|
+
...(options.tags === undefined ? {} : { tags: options.tags }),
|
|
194
|
+
privacyLevel: "safe",
|
|
195
|
+
};
|
|
196
|
+
context.currentSpanId = spanId;
|
|
197
|
+
this.enqueue(event);
|
|
198
|
+
return event.id;
|
|
199
|
+
}
|
|
200
|
+
catch (error) {
|
|
201
|
+
this.emitDiagnostic({
|
|
202
|
+
level: "error",
|
|
203
|
+
code: "event_record_failed",
|
|
204
|
+
message: `ProbeMap safely ignored a failed ${type} event.`,
|
|
205
|
+
error,
|
|
206
|
+
});
|
|
207
|
+
return undefined;
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
async runInSpan(name, callback) {
|
|
211
|
+
const parent = this.currentContext();
|
|
212
|
+
if (parent === undefined || !this.enabled) {
|
|
213
|
+
return await callback();
|
|
214
|
+
}
|
|
215
|
+
return await this.runWithContext({ ...parent }, async () => {
|
|
216
|
+
this.step(`${name}.start`, {}, { tags: ["span"] });
|
|
217
|
+
try {
|
|
218
|
+
const value = await callback();
|
|
219
|
+
this.step(`${name}.end`, {}, { tags: ["span"] });
|
|
220
|
+
return value;
|
|
221
|
+
}
|
|
222
|
+
catch (error) {
|
|
223
|
+
this.capture("runtime.exception", name, error, { status: "fail", tags: ["span"] });
|
|
224
|
+
throw error;
|
|
225
|
+
}
|
|
226
|
+
});
|
|
227
|
+
}
|
|
228
|
+
async flush() {
|
|
229
|
+
if (!this.enabled || this.queue.length === 0) {
|
|
230
|
+
this.clearTimer();
|
|
231
|
+
return;
|
|
232
|
+
}
|
|
233
|
+
if (this.flushPromise !== undefined) {
|
|
234
|
+
await this.flushPromise;
|
|
235
|
+
return;
|
|
236
|
+
}
|
|
237
|
+
this.clearTimer();
|
|
238
|
+
this.flushPromise = this.flushInternal().finally(() => {
|
|
239
|
+
this.flushPromise = undefined;
|
|
240
|
+
});
|
|
241
|
+
await this.flushPromise;
|
|
242
|
+
}
|
|
243
|
+
async destroy() {
|
|
244
|
+
await this.flush();
|
|
245
|
+
this.clearTimer();
|
|
246
|
+
this.enabled = false;
|
|
247
|
+
this.initialized = false;
|
|
248
|
+
this.asyncContext.disable();
|
|
249
|
+
}
|
|
250
|
+
reset() {
|
|
251
|
+
this.clearTimer();
|
|
252
|
+
this.asyncContext.disable();
|
|
253
|
+
this.initialized = false;
|
|
254
|
+
this.enabled = false;
|
|
255
|
+
this.config = undefined;
|
|
256
|
+
this.transport = undefined;
|
|
257
|
+
this.queue = [];
|
|
258
|
+
this.flushPromise = undefined;
|
|
259
|
+
this.clientSequence = 0;
|
|
260
|
+
this.droppedEvents = 0;
|
|
261
|
+
this.consecutiveFailures = 0;
|
|
262
|
+
this.lastError = undefined;
|
|
263
|
+
}
|
|
264
|
+
enqueue(event) {
|
|
265
|
+
const config = this.config;
|
|
266
|
+
if (config === undefined)
|
|
267
|
+
return;
|
|
268
|
+
if (this.queue.length >= config.maxBufferedEvents) {
|
|
269
|
+
this.queue.shift();
|
|
270
|
+
this.droppedEvents += 1;
|
|
271
|
+
this.emitDiagnostic({
|
|
272
|
+
level: "warning",
|
|
273
|
+
code: "buffer_overflow",
|
|
274
|
+
message: "ProbeMap dropped the oldest Node event because the ring buffer is full.",
|
|
275
|
+
});
|
|
276
|
+
}
|
|
277
|
+
this.queue.push(event);
|
|
278
|
+
this.scheduleFlush(config.batchIntervalMs);
|
|
279
|
+
}
|
|
280
|
+
scheduleFlush(delayMs) {
|
|
281
|
+
if (this.timer !== undefined || !this.enabled)
|
|
282
|
+
return;
|
|
283
|
+
this.timer = setTimeout(() => {
|
|
284
|
+
this.timer = undefined;
|
|
285
|
+
void this.flush();
|
|
286
|
+
}, delayMs);
|
|
287
|
+
}
|
|
288
|
+
clearTimer() {
|
|
289
|
+
if (this.timer !== undefined) {
|
|
290
|
+
clearTimeout(this.timer);
|
|
291
|
+
this.timer = undefined;
|
|
292
|
+
}
|
|
293
|
+
}
|
|
294
|
+
takeNextBatch(maxEvents) {
|
|
295
|
+
const first = this.queue[0];
|
|
296
|
+
if (first === undefined)
|
|
297
|
+
return [];
|
|
298
|
+
const batch = [];
|
|
299
|
+
const remaining = [];
|
|
300
|
+
for (const event of this.queue) {
|
|
301
|
+
if (batch.length < maxEvents &&
|
|
302
|
+
event.projectId === first.projectId &&
|
|
303
|
+
event.sessionId === first.sessionId) {
|
|
304
|
+
batch.push(event);
|
|
305
|
+
}
|
|
306
|
+
else {
|
|
307
|
+
remaining.push(event);
|
|
308
|
+
}
|
|
309
|
+
}
|
|
310
|
+
this.queue = remaining;
|
|
311
|
+
return batch;
|
|
312
|
+
}
|
|
313
|
+
async flushInternal() {
|
|
314
|
+
const config = this.config;
|
|
315
|
+
const transport = this.transport;
|
|
316
|
+
if (config === undefined || transport === undefined)
|
|
317
|
+
return;
|
|
318
|
+
while (this.queue.length > 0) {
|
|
319
|
+
const events = this.takeNextBatch(config.maxEventsPerBatch);
|
|
320
|
+
if (events.length === 0)
|
|
321
|
+
return;
|
|
322
|
+
try {
|
|
323
|
+
const response = await transport.sendBatch({
|
|
324
|
+
projectId: events[0].projectId,
|
|
325
|
+
sessionId: events[0].sessionId,
|
|
326
|
+
events,
|
|
327
|
+
});
|
|
328
|
+
if (response.accepted + response.duplicates !== events.length) {
|
|
329
|
+
this.emitDiagnostic({
|
|
330
|
+
level: "warning",
|
|
331
|
+
code: "partial_batch_acknowledgement",
|
|
332
|
+
message: "Collector acknowledgement does not match the Node event batch.",
|
|
333
|
+
});
|
|
334
|
+
}
|
|
335
|
+
this.consecutiveFailures = 0;
|
|
336
|
+
this.lastError = undefined;
|
|
337
|
+
}
|
|
338
|
+
catch (error) {
|
|
339
|
+
const combined = [...events, ...this.queue];
|
|
340
|
+
const overflow = Math.max(0, combined.length - config.maxBufferedEvents);
|
|
341
|
+
this.queue = combined.slice(-config.maxBufferedEvents);
|
|
342
|
+
this.droppedEvents += overflow;
|
|
343
|
+
this.consecutiveFailures += 1;
|
|
344
|
+
this.lastError = errorMessage(error);
|
|
345
|
+
this.emitDiagnostic({
|
|
346
|
+
level: "warning",
|
|
347
|
+
code: "batch_send_failed",
|
|
348
|
+
message: "ProbeMap retained the Node event batch and will retry.",
|
|
349
|
+
error,
|
|
350
|
+
});
|
|
351
|
+
this.scheduleFlush(Math.min(config.batchIntervalMs * 2 ** Math.min(this.consecutiveFailures, 6), config.maxRetryDelayMs));
|
|
352
|
+
return;
|
|
353
|
+
}
|
|
354
|
+
}
|
|
355
|
+
}
|
|
356
|
+
emitDiagnostic(diagnostic) {
|
|
357
|
+
try {
|
|
358
|
+
this.config?.onDiagnostic?.(diagnostic);
|
|
359
|
+
}
|
|
360
|
+
catch {
|
|
361
|
+
// Diagnostics cannot affect the host server.
|
|
362
|
+
}
|
|
363
|
+
if (this.config?.debug === true) {
|
|
364
|
+
try {
|
|
365
|
+
console.warn(`[ProbeMap] ${diagnostic.code}: ${diagnostic.message}`);
|
|
366
|
+
}
|
|
367
|
+
catch {
|
|
368
|
+
// Host applications may patch console.
|
|
369
|
+
}
|
|
370
|
+
}
|
|
371
|
+
}
|
|
372
|
+
}
|
|
373
|
+
//# sourceMappingURL=client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fastify.d.ts","sourceRoot":"","sources":["../src/fastify.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAkB,MAAM,SAAS,CAAC;AAGlE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAGnD,wBAAgB,2BAA2B,CAAC,MAAM,EAAE,eAAe,GAAG,kBAAkB,CA8DvF"}
|
package/dist/fastify.js
ADDED
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import fastifyPlugin from "fastify-plugin";
|
|
2
|
+
export function createProbeMapFastifyPlugin(client) {
|
|
3
|
+
return fastifyPlugin(async (fastify) => {
|
|
4
|
+
const contexts = new WeakMap();
|
|
5
|
+
const startedAt = new WeakMap();
|
|
6
|
+
fastify.addHook("onRequest", (request, _reply, done) => {
|
|
7
|
+
const context = client.contextFromHeaders(request.headers);
|
|
8
|
+
if (context !== undefined) {
|
|
9
|
+
contexts.set(request, context);
|
|
10
|
+
startedAt.set(request, performance.now());
|
|
11
|
+
client.enterContext(context);
|
|
12
|
+
client.capture("network.request", "http.request", {
|
|
13
|
+
method: request.method,
|
|
14
|
+
url: request.url,
|
|
15
|
+
route: request.routeOptions.url,
|
|
16
|
+
}, { tags: ["fastify", "request"] });
|
|
17
|
+
}
|
|
18
|
+
done();
|
|
19
|
+
});
|
|
20
|
+
fastify.addHook("onError", (request, _reply, error, done) => {
|
|
21
|
+
const context = contexts.get(request);
|
|
22
|
+
if (context !== undefined) {
|
|
23
|
+
client.enterContext(context);
|
|
24
|
+
client.capture("runtime.exception", "http.request.exception", error, {
|
|
25
|
+
status: "fail",
|
|
26
|
+
tags: ["fastify", "request"],
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
done();
|
|
30
|
+
});
|
|
31
|
+
fastify.addHook("onResponse", (request, reply, done) => {
|
|
32
|
+
const context = contexts.get(request);
|
|
33
|
+
if (context !== undefined) {
|
|
34
|
+
client.enterContext(context);
|
|
35
|
+
const durationMs = Math.max(0, performance.now() - (startedAt.get(request) ?? 0));
|
|
36
|
+
client.capture("network.response", "http.response", {
|
|
37
|
+
method: request.method,
|
|
38
|
+
url: request.url,
|
|
39
|
+
statusCode: reply.statusCode,
|
|
40
|
+
durationMs,
|
|
41
|
+
}, {
|
|
42
|
+
status: reply.statusCode < 400 ? "pass" : "fail",
|
|
43
|
+
tags: ["fastify", "response"],
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
contexts.delete(request);
|
|
47
|
+
startedAt.delete(request);
|
|
48
|
+
done();
|
|
49
|
+
});
|
|
50
|
+
}, { name: "probemap-node" });
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=fastify.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fastify.js","sourceRoot":"","sources":["../src/fastify.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { NodeProbeClient } from "./client.js";
|
|
2
|
+
import type { NodeHeaderSource } from "./types.js";
|
|
3
|
+
export interface MinimalNodeRequest {
|
|
4
|
+
headers: NodeHeaderSource;
|
|
5
|
+
method?: string;
|
|
6
|
+
url?: string;
|
|
7
|
+
}
|
|
8
|
+
export interface MinimalNodeResponse {
|
|
9
|
+
statusCode: number;
|
|
10
|
+
once(event: "finish", listener: () => void): unknown;
|
|
11
|
+
}
|
|
12
|
+
export type MinimalNext = (error?: unknown) => void;
|
|
13
|
+
export declare function createProbeMapExpressMiddleware(client: NodeProbeClient): (request: MinimalNodeRequest, response: MinimalNodeResponse, next: MinimalNext) => void;
|
|
14
|
+
export declare function withProbeMapNextHandler<Request extends {
|
|
15
|
+
headers: NodeHeaderSource;
|
|
16
|
+
}, Result>(client: NodeProbeClient, handler: (request: Request) => Result | Promise<Result>): (request: Request) => Result | Promise<Result>;
|
|
17
|
+
//# sourceMappingURL=http-adapters.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"http-adapters.d.ts","sourceRoot":"","sources":["../src/http-adapters.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AACnD,OAAO,KAAK,EAAE,gBAAgB,EAAoB,MAAM,YAAY,CAAC;AAErE,MAAM,WAAW,kBAAkB;IAAG,OAAO,EAAE,gBAAgB,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAA;CAAE;AAChG,MAAM,WAAW,mBAAmB;IAAG,UAAU,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,IAAI,GAAG,OAAO,CAAA;CAAE;AACjH,MAAM,MAAM,WAAW,GAAG,CAAC,KAAK,CAAC,EAAE,OAAO,KAAK,IAAI,CAAC;AAEpD,wBAAgB,+BAA+B,CAAC,MAAM,EAAE,eAAe,aAEpD,kBAAkB,YAAY,mBAAmB,QAAQ,WAAW,KAAG,IAAI,CAW7F;AAED,wBAAgB,uBAAuB,CAAC,OAAO,SAAS;IAAE,OAAO,EAAE,gBAAgB,CAAA;CAAE,EAAE,MAAM,EAAE,MAAM,EAAE,eAAe,EAAE,OAAO,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,aAC5J,OAAO,KAAG,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CACpD"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
export function createProbeMapExpressMiddleware(client) {
|
|
2
|
+
const contexts = new WeakMap();
|
|
3
|
+
return (request, response, next) => {
|
|
4
|
+
const context = client.contextFromHeaders(request.headers);
|
|
5
|
+
if (context === undefined) {
|
|
6
|
+
next();
|
|
7
|
+
return;
|
|
8
|
+
}
|
|
9
|
+
contexts.set(request, context);
|
|
10
|
+
const started = performance.now();
|
|
11
|
+
client.runWithContext(context, () => {
|
|
12
|
+
client.capture("network.request", "http.request", { method: request.method, url: request.url }, { tags: ["express", "request"] });
|
|
13
|
+
response.once("finish", () => client.runWithContext(context, () => client.capture("network.response", "http.response", { method: request.method, url: request.url, statusCode: response.statusCode, durationMs: performance.now() - started }, { status: response.statusCode < 400 ? "pass" : "fail", tags: ["express", "response"] })));
|
|
14
|
+
next();
|
|
15
|
+
});
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
export function withProbeMapNextHandler(client, handler) {
|
|
19
|
+
return (request) => client.runWithHeaders(request.headers, () => handler(request));
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=http-adapters.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"http-adapters.js","sourceRoot":"","sources":["../src/http-adapters.ts"],"names":[],"mappings":"AAOA,MAAM,UAAU,+BAA+B,CAAC,MAAuB;IACrE,MAAM,QAAQ,GAAG,IAAI,OAAO,EAA4B,CAAC;IACzD,OAAO,CAAC,OAA2B,EAAE,QAA6B,EAAE,IAAiB,EAAQ,EAAE;QAC7F,MAAM,OAAO,GAAG,MAAM,CAAC,kBAAkB,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QAC3D,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;YAAC,IAAI,EAAE,CAAC;YAAC,OAAO;QAAC,CAAC;QAC9C,QAAQ,CAAC,GAAG,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QAC/B,MAAM,OAAO,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC;QAClC,MAAM,CAAC,cAAc,CAAC,OAAO,EAAE,GAAG,EAAE;YAClC,MAAM,CAAC,OAAO,CAAC,iBAAiB,EAAE,cAAc,EAAE,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,SAAS,EAAE,SAAS,CAAC,EAAE,CAAC,CAAC;YAClI,QAAQ,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,cAAc,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,kBAAkB,EAAE,eAAe,EAAE,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,UAAU,EAAE,QAAQ,CAAC,UAAU,EAAE,UAAU,EAAE,WAAW,CAAC,GAAG,EAAE,GAAG,OAAO,EAAE,EAAE,EAAE,MAAM,EAAE,QAAQ,CAAC,UAAU,GAAG,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,SAAS,EAAE,UAAU,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;YACzU,IAAI,EAAE,CAAC;QACT,CAAC,CAAC,CAAC;IACL,CAAC,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,uBAAuB,CAAwD,MAAuB,EAAE,OAAuD;IAC7K,OAAO,CAAC,OAAgB,EAA4B,EAAE,CAAC,MAAM,CAAC,cAAc,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC;AACxH,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { type EventBatch, type EventIngestResponse, type ProbeAuth, type SessionCreateInput } from "@probemap/shared";
|
|
2
|
+
import type { NodeProbeTransport } from "./types.js";
|
|
3
|
+
export declare class NodeHttpTransport implements NodeProbeTransport {
|
|
4
|
+
private readonly fetchFunction;
|
|
5
|
+
private readonly auth?;
|
|
6
|
+
private readonly baseUrl;
|
|
7
|
+
constructor(collectorUrl: string, fetchFunction?: typeof globalThis.fetch, auth?: ProbeAuth | undefined);
|
|
8
|
+
sendBatch(batch: EventBatch): Promise<EventIngestResponse>;
|
|
9
|
+
bootstrapSession(input: SessionCreateInput): Promise<void>;
|
|
10
|
+
}
|
|
11
|
+
//# sourceMappingURL=http-transport.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"http-transport.d.ts","sourceRoot":"","sources":["../src/http-transport.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,UAAU,EACf,KAAK,mBAAmB,EAExB,KAAK,SAAS,EACd,KAAK,kBAAkB,EACxB,MAAM,kBAAkB,CAAC;AAE1B,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAErD,qBAAa,iBAAkB,YAAW,kBAAkB;IAKxD,OAAO,CAAC,QAAQ,CAAC,aAAa;IAC9B,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC;IALxB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IAEjC,YACE,YAAY,EAAE,MAAM,EACH,aAAa,GAAE,OAAO,UAAU,CAAC,KAAyC,EAC1E,IAAI,CAAC,EAAE,SAAS,YAAA,EAGlC;IAEY,SAAS,CAAC,KAAK,EAAE,UAAU,GAAG,OAAO,CAAC,mBAAmB,CAAC,CActE;IAEY,gBAAgB,CAAC,KAAK,EAAE,kBAAkB,GAAG,OAAO,CAAC,IAAI,CAAC,CAItE;CACF"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { eventIngestResponseSchema, sessionCreateSchema, resolveProbeAuthToken, } from "@probemap/shared";
|
|
2
|
+
export class NodeHttpTransport {
|
|
3
|
+
fetchFunction;
|
|
4
|
+
auth;
|
|
5
|
+
baseUrl;
|
|
6
|
+
constructor(collectorUrl, fetchFunction = globalThis.fetch.bind(globalThis), auth) {
|
|
7
|
+
this.fetchFunction = fetchFunction;
|
|
8
|
+
this.auth = auth;
|
|
9
|
+
this.baseUrl = collectorUrl.replace(/\/$/, "");
|
|
10
|
+
}
|
|
11
|
+
async sendBatch(batch) {
|
|
12
|
+
const token = await resolveProbeAuthToken(this.auth);
|
|
13
|
+
const response = await this.fetchFunction(`${this.baseUrl}/api/events/batch`, {
|
|
14
|
+
method: "POST",
|
|
15
|
+
headers: { "content-type": "application/json", ...(token === undefined ? {} : { authorization: `Bearer ${token}` }) },
|
|
16
|
+
body: JSON.stringify(batch),
|
|
17
|
+
});
|
|
18
|
+
if (!response.ok) {
|
|
19
|
+
throw new Error(`ProbeMap collector returned ${response.status}: ${(await response.text()).slice(0, 2_000)}`);
|
|
20
|
+
}
|
|
21
|
+
return eventIngestResponseSchema.parse(await response.json());
|
|
22
|
+
}
|
|
23
|
+
async bootstrapSession(input) {
|
|
24
|
+
const token = await resolveProbeAuthToken(this.auth);
|
|
25
|
+
const body = sessionCreateSchema.parse(input);
|
|
26
|
+
const response = await this.fetchFunction(`${this.baseUrl}/api/sessions`, { method: "POST", headers: { "content-type": "application/json", ...(token === undefined ? {} : { authorization: `Bearer ${token}` }) }, body: JSON.stringify(body) });
|
|
27
|
+
if (!response.ok && response.status !== 409)
|
|
28
|
+
throw new Error(`ProbeMap session bootstrap returned ${response.status}: ${(await response.text()).slice(0, 2_000)}`);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=http-transport.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"http-transport.js","sourceRoot":"","sources":["../src/http-transport.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,yBAAyB,EACzB,mBAAmB,EAGnB,qBAAqB,GAGtB,MAAM,kBAAkB,CAAC;AAI1B,MAAM,OAAO,iBAAiB;IAKT,aAAa;IACb,IAAI;IALN,OAAO,CAAS;IAEjC,YACE,YAAoB,EACH,aAAa,GAA4B,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,EAC1E,IAAgB;6BADhB,aAAa;oBACb,IAAI;QAErB,IAAI,CAAC,OAAO,GAAG,YAAY,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IACjD,CAAC;IAEM,KAAK,CAAC,SAAS,CAAC,KAAiB;QACtC,MAAM,KAAK,GAAG,MAAM,qBAAqB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACrD,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,GAAG,IAAI,CAAC,OAAO,mBAAmB,EAAE;YAC5E,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE,GAAG,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,UAAU,KAAK,EAAE,EAAE,CAAC,EAAE;YACrH,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC;SAC5B,CAAC,CAAC;QACH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,MAAM,IAAI,KAAK,CACb,+BAA+B,QAAQ,CAAC,MAAM,KAAK,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,EAAE,CAC7F,CAAC;QACJ,CAAC;QAED,OAAO,yBAAyB,CAAC,KAAK,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC;IAChE,CAAC;IAEM,KAAK,CAAC,gBAAgB,CAAC,KAAyB;QACrD,MAAM,KAAK,GAAG,MAAM,qBAAqB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAAC,MAAM,IAAI,GAAG,mBAAmB,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QACpG,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,GAAG,IAAI,CAAC,OAAO,eAAe,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE,GAAG,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,UAAU,KAAK,EAAE,EAAE,CAAC,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACjP,IAAI,CAAC,QAAQ,CAAC,EAAE,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG;YAAE,MAAM,IAAI,KAAK,CAAC,uCAAuC,QAAQ,CAAC,MAAM,KAAK,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,EAAE,CAAC,CAAC;IACrK,CAAC;CACF"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export * from "./client.js";
|
|
2
|
+
export * from "./fastify.js";
|
|
3
|
+
export * from "./http-adapters.js";
|
|
4
|
+
export * from "./source-map-service.js";
|
|
5
|
+
export * from "./http-transport.js";
|
|
6
|
+
export * from "./types.js";
|
|
7
|
+
export * from "./ingest-proxy.js";
|
|
8
|
+
import { NodeProbeClient } from "./client.js";
|
|
9
|
+
export declare const probe: NodeProbeClient;
|
|
10
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,cAAc,CAAC;AAC7B,cAAc,oBAAoB,CAAC;AACnC,cAAc,yBAAyB,CAAC;AACxC,cAAc,qBAAqB,CAAC;AACpC,cAAc,YAAY,CAAC;AAC3B,cAAc,mBAAmB,CAAC;AAElC,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAE9C,eAAO,MAAM,KAAK,iBAAwB,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export * from "./client.js";
|
|
2
|
+
export * from "./fastify.js";
|
|
3
|
+
export * from "./http-adapters.js";
|
|
4
|
+
export * from "./source-map-service.js";
|
|
5
|
+
export * from "./http-transport.js";
|
|
6
|
+
export * from "./types.js";
|
|
7
|
+
export * from "./ingest-proxy.js";
|
|
8
|
+
import { NodeProbeClient } from "./client.js";
|
|
9
|
+
export const probe = new NodeProbeClient();
|
|
10
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,cAAc,CAAC;AAC7B,cAAc,oBAAoB,CAAC;AACnC,cAAc,yBAAyB,CAAC;AACxC,cAAc,qBAAqB,CAAC;AACpC,cAAc,YAAY,CAAC;AAC3B,cAAc,mBAAmB,CAAC;AAElC,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAE9C,MAAM,CAAC,MAAM,KAAK,GAAG,IAAI,eAAe,EAAE,CAAC"}
|
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
import { type ProbeAuth } from "@probemap/shared";
|
|
2
|
+
declare const proxySchemas: {
|
|
3
|
+
readonly "/api/sessions": import("zod").ZodObject<{
|
|
4
|
+
id: import("zod").ZodUUID;
|
|
5
|
+
projectId: import("zod").ZodUUID;
|
|
6
|
+
environmentId: import("zod").ZodOptional<import("zod").ZodUUID>;
|
|
7
|
+
appVersion: import("zod").ZodOptional<import("zod").ZodString>;
|
|
8
|
+
environment: import("zod").ZodDefault<import("zod").ZodString>;
|
|
9
|
+
branch: import("zod").ZodOptional<import("zod").ZodString>;
|
|
10
|
+
commitHash: import("zod").ZodOptional<import("zod").ZodString>;
|
|
11
|
+
retentionClass: import("zod").ZodOptional<import("zod").ZodEnum<{
|
|
12
|
+
live: "live";
|
|
13
|
+
manual: "manual";
|
|
14
|
+
pinned: "pinned";
|
|
15
|
+
}>>;
|
|
16
|
+
retentionDays: import("zod").ZodOptional<import("zod").ZodNumber>;
|
|
17
|
+
integration: import("zod").ZodOptional<import("zod").ZodObject<{
|
|
18
|
+
standard: import("zod").ZodLiteral<"PM-HIS-1">;
|
|
19
|
+
schemaVersion: import("zod").ZodUnion<readonly [import("zod").ZodLiteral<1>, import("zod").ZodLiteral<2>]>;
|
|
20
|
+
profileKey: import("zod").ZodString;
|
|
21
|
+
profileVersion: import("zod").ZodNumber;
|
|
22
|
+
profileHash: import("zod").ZodString;
|
|
23
|
+
}, import("zod/v4/core").$strict>>;
|
|
24
|
+
metadata: import("zod").ZodOptional<import("zod").ZodRecord<import("zod").ZodString, import("zod").ZodUnknown>>;
|
|
25
|
+
}, import("zod/v4/core").$strict>;
|
|
26
|
+
readonly "/api/flows": import("zod").ZodObject<{
|
|
27
|
+
id: import("zod").ZodUUID;
|
|
28
|
+
projectId: import("zod").ZodUUID;
|
|
29
|
+
sessionId: import("zod").ZodUUID;
|
|
30
|
+
name: import("zod").ZodString;
|
|
31
|
+
metadata: import("zod").ZodOptional<import("zod").ZodRecord<import("zod").ZodString, import("zod").ZodUnknown>>;
|
|
32
|
+
}, import("zod/v4/core").$strict>;
|
|
33
|
+
readonly "/api/events/batch": import("zod").ZodObject<{
|
|
34
|
+
projectId: import("zod").ZodUUID;
|
|
35
|
+
sessionId: import("zod").ZodUUID;
|
|
36
|
+
events: import("zod").ZodArray<import("zod").ZodObject<{
|
|
37
|
+
id: import("zod").ZodUUID;
|
|
38
|
+
protocolVersion: import("zod").ZodString;
|
|
39
|
+
sdkVersion: import("zod").ZodString;
|
|
40
|
+
payloadSchemaId: import("zod").ZodOptional<import("zod").ZodString>;
|
|
41
|
+
projectId: import("zod").ZodUUID;
|
|
42
|
+
sessionId: import("zod").ZodUUID;
|
|
43
|
+
flowId: import("zod").ZodOptional<import("zod").ZodUUID>;
|
|
44
|
+
flowContractVersionId: import("zod").ZodOptional<import("zod").ZodUUID>;
|
|
45
|
+
probeDefinitionId: import("zod").ZodOptional<import("zod").ZodUUID>;
|
|
46
|
+
traceId: import("zod").ZodString;
|
|
47
|
+
spanId: import("zod").ZodString;
|
|
48
|
+
parentSpanId: import("zod").ZodOptional<import("zod").ZodString>;
|
|
49
|
+
linkedSpanIds: import("zod").ZodOptional<import("zod").ZodArray<import("zod").ZodString>>;
|
|
50
|
+
runtimeId: import("zod").ZodString;
|
|
51
|
+
processId: import("zod").ZodOptional<import("zod").ZodString>;
|
|
52
|
+
threadId: import("zod").ZodOptional<import("zod").ZodString>;
|
|
53
|
+
clientSequence: import("zod").ZodNumber;
|
|
54
|
+
clientTimestamp: import("zod").ZodISODateTime;
|
|
55
|
+
monotonicTime: import("zod").ZodNumber;
|
|
56
|
+
serverReceivedAt: import("zod").ZodOptional<import("zod").ZodISODateTime>;
|
|
57
|
+
type: import("zod").ZodEnum<{
|
|
58
|
+
"action.click": "action.click";
|
|
59
|
+
"action.double_click": "action.double_click";
|
|
60
|
+
"action.drag_end": "action.drag_end";
|
|
61
|
+
"action.drag_move": "action.drag_move";
|
|
62
|
+
"action.drag_start": "action.drag_start";
|
|
63
|
+
"action.drop": "action.drop";
|
|
64
|
+
"action.input": "action.input";
|
|
65
|
+
"action.keypress": "action.keypress";
|
|
66
|
+
"action.navigation": "action.navigation";
|
|
67
|
+
"bug.recorded": "bug.recorded";
|
|
68
|
+
"console.error": "console.error";
|
|
69
|
+
"console.log": "console.log";
|
|
70
|
+
"console.warn": "console.warn";
|
|
71
|
+
"diagnosis.created": "diagnosis.created";
|
|
72
|
+
"flow.end": "flow.end";
|
|
73
|
+
"flow.start": "flow.start";
|
|
74
|
+
"git.snapshot": "git.snapshot";
|
|
75
|
+
"network.error": "network.error";
|
|
76
|
+
"network.request": "network.request";
|
|
77
|
+
"network.response": "network.response";
|
|
78
|
+
"performance.long_task": "performance.long_task";
|
|
79
|
+
"probe.assert": "probe.assert";
|
|
80
|
+
"probe.observe": "probe.observe";
|
|
81
|
+
"probe.step": "probe.step";
|
|
82
|
+
"runtime.exception": "runtime.exception";
|
|
83
|
+
"session.end": "session.end";
|
|
84
|
+
"session.start": "session.start";
|
|
85
|
+
"state.snapshot": "state.snapshot";
|
|
86
|
+
"verification.created": "verification.created";
|
|
87
|
+
"visual.snapshot": "visual.snapshot";
|
|
88
|
+
}>;
|
|
89
|
+
source: import("zod").ZodEnum<{
|
|
90
|
+
adapter: "adapter";
|
|
91
|
+
"browser-sdk": "browser-sdk";
|
|
92
|
+
cli: "cli";
|
|
93
|
+
collector: "collector";
|
|
94
|
+
mcp: "mcp";
|
|
95
|
+
"node-sdk": "node-sdk";
|
|
96
|
+
}>;
|
|
97
|
+
status: import("zod").ZodOptional<import("zod").ZodEnum<{
|
|
98
|
+
fail: "fail";
|
|
99
|
+
not_reached: "not_reached";
|
|
100
|
+
pass: "pass";
|
|
101
|
+
skipped: "skipped";
|
|
102
|
+
unknown: "unknown";
|
|
103
|
+
warn: "warn";
|
|
104
|
+
}>>;
|
|
105
|
+
name: import("zod").ZodOptional<import("zod").ZodString>;
|
|
106
|
+
message: import("zod").ZodOptional<import("zod").ZodString>;
|
|
107
|
+
payload: import("zod").ZodOptional<import("zod").ZodUnknown>;
|
|
108
|
+
tags: import("zod").ZodOptional<import("zod").ZodArray<import("zod").ZodString>>;
|
|
109
|
+
relatedObjectIds: import("zod").ZodOptional<import("zod").ZodArray<import("zod").ZodString>>;
|
|
110
|
+
stackTrace: import("zod").ZodOptional<import("zod").ZodString>;
|
|
111
|
+
fileHints: import("zod").ZodOptional<import("zod").ZodArray<import("zod").ZodObject<{
|
|
112
|
+
path: import("zod").ZodString;
|
|
113
|
+
reason: import("zod").ZodString;
|
|
114
|
+
confidence: import("zod").ZodNumber;
|
|
115
|
+
source: import("zod").ZodEnum<{
|
|
116
|
+
discovery: "discovery";
|
|
117
|
+
git: "git";
|
|
118
|
+
heuristic: "heuristic";
|
|
119
|
+
probe: "probe";
|
|
120
|
+
stack: "stack";
|
|
121
|
+
}>;
|
|
122
|
+
line: import("zod").ZodOptional<import("zod").ZodNumber>;
|
|
123
|
+
column: import("zod").ZodOptional<import("zod").ZodNumber>;
|
|
124
|
+
}, import("zod/v4/core").$strict>>>;
|
|
125
|
+
privacyLevel: import("zod").ZodEnum<{
|
|
126
|
+
redacted: "redacted";
|
|
127
|
+
safe: "safe";
|
|
128
|
+
sensitive: "sensitive";
|
|
129
|
+
}>;
|
|
130
|
+
}, import("zod/v4/core").$strict>>;
|
|
131
|
+
}, import("zod/v4/core").$strict>;
|
|
132
|
+
};
|
|
133
|
+
export type ProbeMapProxyPath = keyof typeof proxySchemas;
|
|
134
|
+
export interface ProbeMapIngestProxyOptions {
|
|
135
|
+
collectorUrl: string;
|
|
136
|
+
projectId: string;
|
|
137
|
+
auth: ProbeAuth;
|
|
138
|
+
maxBodyBytes?: number;
|
|
139
|
+
fetchFunction?: typeof globalThis.fetch;
|
|
140
|
+
}
|
|
141
|
+
export interface ProbeMapProxyResponse {
|
|
142
|
+
status: number;
|
|
143
|
+
contentType: string;
|
|
144
|
+
body: string;
|
|
145
|
+
}
|
|
146
|
+
export declare function createProbeMapIngestProxy(options: ProbeMapIngestProxyOptions): {
|
|
147
|
+
handle(path: ProbeMapProxyPath, rawBody: unknown): Promise<ProbeMapProxyResponse>;
|
|
148
|
+
};
|
|
149
|
+
export {};
|
|
150
|
+
//# sourceMappingURL=ingest-proxy.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ingest-proxy.d.ts","sourceRoot":"","sources":["../src/ingest-proxy.ts"],"names":[],"mappings":"AAAA,OAAO,EAA2D,KAAK,SAAS,EAAyB,MAAM,kBAAkB,CAAC;AAElI,QAAA,MAAM,YAAY;aAChB,eAAe;;;;;;;;;;;;;;;;;;;;;;;aACf,YAAY;;;;;;;aACZ,mBAAmB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CACX,CAAC;AAEX,MAAM,MAAM,iBAAiB,GAAG,MAAM,OAAO,YAAY,CAAC;AAE1D,MAAM,WAAW,0BAA0B;IACzC,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,SAAS,CAAC;IAChB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,aAAa,CAAC,EAAE,OAAO,UAAU,CAAC,KAAK,CAAC;CACzC;AAED,MAAM,WAAW,qBAAqB;IACpC,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,0BAA0B;IAKnE,MAAM,OAAO,iBAAiB,WAAW,OAAO,GAAG,OAAO,CAAC,qBAAqB,CAAC;EAY1F"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { eventBatchSchema, flowCreateSchema, sessionCreateSchema, resolveProbeAuthToken } from "@probemap/shared";
|
|
2
|
+
const proxySchemas = {
|
|
3
|
+
"/api/sessions": sessionCreateSchema,
|
|
4
|
+
"/api/flows": flowCreateSchema,
|
|
5
|
+
"/api/events/batch": eventBatchSchema,
|
|
6
|
+
};
|
|
7
|
+
export function createProbeMapIngestProxy(options) {
|
|
8
|
+
const baseUrl = options.collectorUrl.replace(/\/$/u, "");
|
|
9
|
+
const maximum = Math.max(1_024, Math.min(options.maxBodyBytes ?? 2 * 1_024 * 1_024, 4 * 1_024 * 1_024));
|
|
10
|
+
const fetchFunction = options.fetchFunction ?? globalThis.fetch.bind(globalThis);
|
|
11
|
+
return {
|
|
12
|
+
async handle(path, rawBody) {
|
|
13
|
+
const schema = proxySchemas[path];
|
|
14
|
+
const body = schema.parse(rawBody);
|
|
15
|
+
if (body.projectId !== options.projectId)
|
|
16
|
+
throw new Error("ProbeMap proxy rejected a cross-project payload.");
|
|
17
|
+
const serialized = JSON.stringify(body);
|
|
18
|
+
if (Buffer.byteLength(serialized) > maximum)
|
|
19
|
+
throw new Error(`ProbeMap proxy payload exceeds ${maximum} bytes.`);
|
|
20
|
+
const token = await resolveProbeAuthToken(options.auth);
|
|
21
|
+
if (token === undefined)
|
|
22
|
+
throw new Error("ProbeMap proxy requires a server-side credential.");
|
|
23
|
+
const response = await fetchFunction(`${baseUrl}${path}`, { method: "POST", headers: { "content-type": "application/json", authorization: `Bearer ${token}` }, body: serialized });
|
|
24
|
+
return { status: response.status, contentType: response.headers.get("content-type") ?? "application/json", body: (await response.text()).slice(0, maximum) };
|
|
25
|
+
},
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=ingest-proxy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ingest-proxy.js","sourceRoot":"","sources":["../src/ingest-proxy.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,mBAAmB,EAAkB,qBAAqB,EAAE,MAAM,kBAAkB,CAAC;AAElI,MAAM,YAAY,GAAG;IACnB,eAAe,EAAE,mBAAmB;IACpC,YAAY,EAAE,gBAAgB;IAC9B,mBAAmB,EAAE,gBAAgB;CAC7B,CAAC;AAkBX,MAAM,UAAU,yBAAyB,CAAC,OAAmC;IAC3E,MAAM,OAAO,GAAG,OAAO,CAAC,YAAY,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IACzD,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,YAAY,IAAI,CAAC,GAAG,KAAK,GAAG,KAAK,EAAE,CAAC,GAAG,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC;IACxG,MAAM,aAAa,GAAG,OAAO,CAAC,aAAa,IAAI,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IACjF,OAAO;QACL,KAAK,CAAC,MAAM,CAAC,IAAuB,EAAE,OAAgB;YACpD,MAAM,MAAM,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;YAClC,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YACnC,IAAI,IAAI,CAAC,SAAS,KAAK,OAAO,CAAC,SAAS;gBAAE,MAAM,IAAI,KAAK,CAAC,kDAAkD,CAAC,CAAC;YAC9G,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;YACxC,IAAI,MAAM,CAAC,UAAU,CAAC,UAAU,CAAC,GAAG,OAAO;gBAAE,MAAM,IAAI,KAAK,CAAC,kCAAkC,OAAO,SAAS,CAAC,CAAC;YACjH,MAAM,KAAK,GAAG,MAAM,qBAAqB,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;YACxD,IAAI,KAAK,KAAK,SAAS;gBAAE,MAAM,IAAI,KAAK,CAAC,mDAAmD,CAAC,CAAC;YAC9F,MAAM,QAAQ,GAAG,MAAM,aAAa,CAAC,GAAG,OAAO,GAAG,IAAI,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE,aAAa,EAAE,UAAU,KAAK,EAAE,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,CAAC;YACnL,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAC,MAAM,EAAE,WAAW,EAAE,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,IAAI,kBAAkB,EAAE,IAAI,EAAE,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,OAAO,CAAC,EAAE,CAAC;QAC/J,CAAC;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
export interface SourceMapRequest {
|
|
2
|
+
generatedFile: string;
|
|
3
|
+
line: number;
|
|
4
|
+
column: number;
|
|
5
|
+
expectedSourceHash?: string;
|
|
6
|
+
expectedCommit?: string;
|
|
7
|
+
sourceMapCommit?: string;
|
|
8
|
+
}
|
|
9
|
+
export interface ResolvedSourceLocation {
|
|
10
|
+
generatedFile: string;
|
|
11
|
+
originalFile: string;
|
|
12
|
+
line: number;
|
|
13
|
+
column: number;
|
|
14
|
+
name: string | null;
|
|
15
|
+
sourceHash: string | null;
|
|
16
|
+
trusted: boolean;
|
|
17
|
+
limitations: string[];
|
|
18
|
+
}
|
|
19
|
+
export declare class SourceMapService {
|
|
20
|
+
resolve(request: SourceMapRequest): Promise<ResolvedSourceLocation | undefined>;
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=source-map-service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"source-map-service.d.ts","sourceRoot":"","sources":["../src/source-map-service.ts"],"names":[],"mappings":"AASA,MAAM,WAAW,gBAAgB;IAC/B,aAAa,EAAE,MAAM,CAAC;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,sBAAsB;IACrC,aAAa,EAAE,MAAM,CAAC;IACtB,YAAY,EAAE,MAAM,CAAC;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,OAAO,EAAE,OAAO,CAAC;IACjB,WAAW,EAAE,MAAM,EAAE,CAAC;CACvB;AAYD,qBAAa,gBAAgB;IACd,OAAO,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,sBAAsB,GAAG,SAAS,CAAC,CAgB3F;CACF"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { createHash } from "node:crypto";
|
|
2
|
+
import { readFile } from "node:fs/promises";
|
|
3
|
+
import path from "node:path";
|
|
4
|
+
import { fileURLToPath, pathToFileURL } from "node:url";
|
|
5
|
+
import { originalPositionFor, TraceMap } from "@jridgewell/trace-mapping";
|
|
6
|
+
function sha256(value) { return createHash("sha256").update(value).digest("hex"); }
|
|
7
|
+
async function loadMap(generatedFile, source) {
|
|
8
|
+
const match = source.match(/\/\/# sourceMappingURL=([^\s]+)\s*$/mu);
|
|
9
|
+
if (match?.[1] === undefined)
|
|
10
|
+
return undefined;
|
|
11
|
+
if (match[1].startsWith("data:application/json;base64,")) {
|
|
12
|
+
return { map: Buffer.from(match[1].slice("data:application/json;base64,".length), "base64").toString("utf8"), mapPath: `${generatedFile}.map` };
|
|
13
|
+
}
|
|
14
|
+
const mapPath = path.resolve(path.dirname(generatedFile), decodeURIComponent(match[1]));
|
|
15
|
+
return { map: await readFile(mapPath, "utf8"), mapPath };
|
|
16
|
+
}
|
|
17
|
+
export class SourceMapService {
|
|
18
|
+
async resolve(request) {
|
|
19
|
+
if (request.line < 1 || request.column < 0)
|
|
20
|
+
return undefined;
|
|
21
|
+
const generatedFile = path.resolve(request.generatedFile);
|
|
22
|
+
const generatedSource = await readFile(generatedFile, "utf8");
|
|
23
|
+
const loaded = await loadMap(generatedFile, generatedSource);
|
|
24
|
+
if (loaded === undefined)
|
|
25
|
+
return undefined;
|
|
26
|
+
const trace = new TraceMap(loaded.map, pathToFileURL(loaded.mapPath).href);
|
|
27
|
+
const original = originalPositionFor(trace, { line: request.line, column: request.column });
|
|
28
|
+
if (original.source === null || original.line === null || original.column === null)
|
|
29
|
+
return undefined;
|
|
30
|
+
const originalFile = original.source.startsWith("file:") ? fileURLToPath(original.source) : path.resolve(path.dirname(loaded.mapPath), original.source);
|
|
31
|
+
let sourceHash = null;
|
|
32
|
+
const limitations = [];
|
|
33
|
+
try {
|
|
34
|
+
sourceHash = sha256(await readFile(originalFile, "utf8"));
|
|
35
|
+
}
|
|
36
|
+
catch {
|
|
37
|
+
limitations.push("Original source file could not be read for hash verification.");
|
|
38
|
+
}
|
|
39
|
+
if (request.expectedSourceHash !== undefined && sourceHash !== request.expectedSourceHash)
|
|
40
|
+
limitations.push("Original source hash does not match the expected build source.");
|
|
41
|
+
if (request.expectedCommit !== undefined && request.sourceMapCommit !== request.expectedCommit)
|
|
42
|
+
limitations.push("Source map commit does not match the recorded runtime commit.");
|
|
43
|
+
return { generatedFile, originalFile, line: original.line, column: original.column, name: original.name, sourceHash, trusted: limitations.length === 0, limitations };
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=source-map-service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"source-map-service.js","sourceRoot":"","sources":["../src/source-map-service.ts"],"names":[],"mappings":"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"}
|
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import type { EvaluatorReference, EventBatch, EventIngestResponse, HeaderSource, ProbeAuth, ProbeMapEvent, PropagatedTraceContext, SessionCreateInput } from "@probemap/shared";
|
|
2
|
+
export interface NodeProbeTransport {
|
|
3
|
+
sendBatch(batch: EventBatch): Promise<EventIngestResponse>;
|
|
4
|
+
bootstrapSession?(input: SessionCreateInput): Promise<void>;
|
|
5
|
+
}
|
|
6
|
+
export interface NodeProbeDiagnostic {
|
|
7
|
+
level: "warning" | "error";
|
|
8
|
+
code: string;
|
|
9
|
+
message: string;
|
|
10
|
+
error?: unknown;
|
|
11
|
+
}
|
|
12
|
+
export interface NodeProbeConfig {
|
|
13
|
+
projectId: string;
|
|
14
|
+
environmentId?: string;
|
|
15
|
+
collectorUrl: string;
|
|
16
|
+
serviceName: string;
|
|
17
|
+
enabled: boolean;
|
|
18
|
+
environment?: string;
|
|
19
|
+
allowProduction?: boolean;
|
|
20
|
+
runtimeId?: string;
|
|
21
|
+
auth?: ProbeAuth;
|
|
22
|
+
transport?: NodeProbeTransport;
|
|
23
|
+
batching?: {
|
|
24
|
+
maxEventsPerBatch?: number;
|
|
25
|
+
batchIntervalMs?: number;
|
|
26
|
+
maxBufferedEvents?: number;
|
|
27
|
+
maxRetryDelayMs?: number;
|
|
28
|
+
};
|
|
29
|
+
debug?: boolean;
|
|
30
|
+
onDiagnostic?: (diagnostic: NodeProbeDiagnostic) => void;
|
|
31
|
+
}
|
|
32
|
+
export interface NodeTraceContext extends PropagatedTraceContext {
|
|
33
|
+
currentSpanId: string;
|
|
34
|
+
}
|
|
35
|
+
export interface NodeEventOptions {
|
|
36
|
+
status?: ProbeMapEvent["status"];
|
|
37
|
+
tags?: string[];
|
|
38
|
+
linkedSpanIds?: string[];
|
|
39
|
+
}
|
|
40
|
+
export interface NodeAssertInput extends NodeEventOptions {
|
|
41
|
+
evaluator: EvaluatorReference;
|
|
42
|
+
input: unknown;
|
|
43
|
+
expected?: unknown;
|
|
44
|
+
}
|
|
45
|
+
export interface NodeAssertionResult {
|
|
46
|
+
eventId?: string;
|
|
47
|
+
status: "pass" | "fail" | "unknown";
|
|
48
|
+
message: string;
|
|
49
|
+
}
|
|
50
|
+
export interface NodeProbeStatus {
|
|
51
|
+
initialized: boolean;
|
|
52
|
+
enabled: boolean;
|
|
53
|
+
pendingEvents: number;
|
|
54
|
+
droppedEvents: number;
|
|
55
|
+
consecutiveFailures: number;
|
|
56
|
+
lastError?: string;
|
|
57
|
+
}
|
|
58
|
+
export type NodeHeaderSource = HeaderSource;
|
|
59
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,kBAAkB,EAClB,UAAU,EACV,mBAAmB,EACnB,YAAY,EACZ,SAAS,EACT,aAAa,EACb,sBAAsB,EACtB,kBAAkB,EACnB,MAAM,kBAAkB,CAAC;AAE1B,MAAM,WAAW,kBAAkB;IACjC,SAAS,CAAC,KAAK,EAAE,UAAU,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAAC;IAC3D,gBAAgB,CAAC,CAAC,KAAK,EAAE,kBAAkB,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC7D;AAED,MAAM,WAAW,mBAAmB;IAClC,KAAK,EAAE,SAAS,GAAG,OAAO,CAAC;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,eAAe;IAC9B,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,OAAO,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,SAAS,CAAC,EAAE,kBAAkB,CAAC;IAC/B,QAAQ,CAAC,EAAE;QACT,iBAAiB,CAAC,EAAE,MAAM,CAAC;QAC3B,eAAe,CAAC,EAAE,MAAM,CAAC;QACzB,iBAAiB,CAAC,EAAE,MAAM,CAAC;QAC3B,eAAe,CAAC,EAAE,MAAM,CAAC;KAC1B,CAAC;IACF,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,YAAY,CAAC,EAAE,CAAC,UAAU,EAAE,mBAAmB,KAAK,IAAI,CAAC;CAC1D;AAED,MAAM,WAAW,gBAAiB,SAAQ,sBAAsB;IAC9D,aAAa,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,gBAAgB;IAC/B,MAAM,CAAC,EAAE,aAAa,CAAC,QAAQ,CAAC,CAAC;IACjC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;CAC1B;AAED,MAAM,WAAW,eAAgB,SAAQ,gBAAgB;IACvD,SAAS,EAAE,kBAAkB,CAAC;IAC9B,KAAK,EAAE,OAAO,CAAC;IACf,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,mBAAmB;IAClC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC;IACpC,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,eAAe;IAC9B,WAAW,EAAE,OAAO,CAAC;IACrB,OAAO,EAAE,OAAO,CAAC;IACjB,aAAa,EAAE,MAAM,CAAC;IACtB,aAAa,EAAE,MAAM,CAAC;IACtB,mBAAmB,EAAE,MAAM,CAAC;IAC5B,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,MAAM,gBAAgB,GAAG,YAAY,CAAC"}
|
package/dist/types.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
|
package/package.json
ADDED
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@probemap/node",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"type": "module",
|
|
5
|
+
"exports": {
|
|
6
|
+
".": {
|
|
7
|
+
"types": "./dist/index.d.ts",
|
|
8
|
+
"import": "./dist/index.js"
|
|
9
|
+
}
|
|
10
|
+
},
|
|
11
|
+
"files": [
|
|
12
|
+
"dist"
|
|
13
|
+
],
|
|
14
|
+
"publishConfig": {
|
|
15
|
+
"access": "public"
|
|
16
|
+
},
|
|
17
|
+
"dependencies": {
|
|
18
|
+
"@jridgewell/trace-mapping": "0.3.31",
|
|
19
|
+
"fastify": "5.10.0",
|
|
20
|
+
"fastify-plugin": "6.0.0",
|
|
21
|
+
"@probemap/shared": "^0.1.0"
|
|
22
|
+
},
|
|
23
|
+
"devDependencies": {
|
|
24
|
+
"@types/node": "26.1.1",
|
|
25
|
+
"drizzle-orm": "0.45.2",
|
|
26
|
+
"@probemap/storage": "0.0.0",
|
|
27
|
+
"@probemap/browser": "0.1.0",
|
|
28
|
+
"@probemap/collector": "0.0.0"
|
|
29
|
+
},
|
|
30
|
+
"scripts": {
|
|
31
|
+
"build": "tsc -p tsconfig.json",
|
|
32
|
+
"typecheck": "tsc -p tsconfig.json --noEmit",
|
|
33
|
+
"test": "vitest run --passWithNoTests"
|
|
34
|
+
}
|
|
35
|
+
}
|