@owlpane/browser 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,164 @@
1
+ import { formatTraceparent } from "./ids.js";
2
+ import { sanitizeUrl, shouldPropagate } from "./url.js";
3
+ function baseHref(env) {
4
+ return env.location?.href;
5
+ }
6
+ function httpAttrs(c, method, raw) {
7
+ const base = baseHref(c.env);
8
+ const url = sanitizeUrl(raw, base, c.opts.keepQuery);
9
+ return {
10
+ "http.request.method": method.toUpperCase(),
11
+ "url.full": url,
12
+ "server.address": (() => {
13
+ try {
14
+ return new URL(raw, base).hostname;
15
+ }
16
+ catch {
17
+ return undefined;
18
+ }
19
+ })(),
20
+ };
21
+ }
22
+ function errStatus(code) {
23
+ return code !== undefined && code >= 400 ? { code: 2, message: `HTTP ${code}` } : { code: 0 };
24
+ }
25
+ function absolute(c, raw) {
26
+ try {
27
+ return new URL(raw, baseHref(c.env)).toString();
28
+ }
29
+ catch {
30
+ return raw;
31
+ }
32
+ }
33
+ /** Replaces `global.fetch` with an instrumented wrapper. Returns an undo function. */
34
+ export function instrumentFetch(c, original) {
35
+ const g = c.env.global;
36
+ if (!g)
37
+ return () => undefined;
38
+ const wrapped = function (input, init) {
39
+ let span;
40
+ let callArgs = [input, init];
41
+ try {
42
+ const isReq = c.env.Request && input instanceof c.env.Request;
43
+ const raw = typeof input === "string" ? input : isReq ? input.url : String(input?.href ?? input);
44
+ if (c.isOwnUrl(absolute(c, raw)))
45
+ return original(input, init);
46
+ const method = String(init?.method ?? (isReq ? input.method : "GET"));
47
+ span = c.tracer.start("HTTP " + method.toUpperCase(), 3, { attributes: httpAttrs(c, method, raw) });
48
+ if (shouldPropagate(raw, baseHref(c.env), c.opts.propagateTraceTo) && c.env.Headers) {
49
+ try {
50
+ const headers = new c.env.Headers(init?.headers ?? (isReq ? input.headers : undefined));
51
+ if (!headers.has("traceparent")) {
52
+ headers.set("traceparent", formatTraceparent(span.traceId, span.spanId, span.sampled));
53
+ callArgs = [input, { ...init, headers }];
54
+ }
55
+ }
56
+ catch {
57
+ callArgs = [input, init];
58
+ }
59
+ }
60
+ }
61
+ catch {
62
+ return original(input, init);
63
+ }
64
+ const s = span;
65
+ let p;
66
+ try {
67
+ p = original(...callArgs);
68
+ }
69
+ catch (e) {
70
+ s.end({ status: { code: 2, message: String(e?.message ?? e) }, attributes: { "error.type": e?.name ?? "Error" } });
71
+ throw e;
72
+ }
73
+ return p.then((res) => {
74
+ try {
75
+ const code = typeof res?.status === "number" ? res.status : undefined;
76
+ s.end({ status: errStatus(code), attributes: { "http.response.status_code": code, "error.type": code !== undefined && code >= 400 ? String(code) : undefined } });
77
+ }
78
+ catch {
79
+ /* ignore */
80
+ }
81
+ return res;
82
+ }, (e) => {
83
+ try {
84
+ s.end({ status: { code: 2, message: String(e?.message ?? e) }, attributes: { "error.type": e?.name ?? "Error" } });
85
+ }
86
+ catch {
87
+ /* ignore */
88
+ }
89
+ throw e;
90
+ });
91
+ };
92
+ g.fetch = wrapped;
93
+ return () => {
94
+ if (g.fetch === wrapped)
95
+ g.fetch = original;
96
+ };
97
+ }
98
+ const KEY = Symbol.for("owlpane.xhr");
99
+ /** Patches XMLHttpRequest.prototype open/send. Returns an undo function. */
100
+ export function instrumentXhr(c) {
101
+ const X = c.env.XMLHttpRequest;
102
+ const proto = X?.prototype;
103
+ if (!proto || typeof proto.open !== "function" || typeof proto.send !== "function")
104
+ return () => undefined;
105
+ const origOpen = proto.open;
106
+ const origSend = proto.send;
107
+ proto.open = function (method, url, ...rest) {
108
+ try {
109
+ this[KEY] = { method: String(method), raw: String(url?.href ?? url) };
110
+ }
111
+ catch {
112
+ /* ignore */
113
+ }
114
+ return origOpen.call(this, method, url, ...rest);
115
+ };
116
+ proto.send = function (...args) {
117
+ try {
118
+ const meta = this[KEY];
119
+ if (meta && !c.isOwnUrl(absolute(c, meta.raw))) {
120
+ const span = c.tracer.start("HTTP " + meta.method.toUpperCase(), 3, { attributes: httpAttrs(c, meta.method, meta.raw) });
121
+ if (shouldPropagate(meta.raw, baseHref(c.env), c.opts.propagateTraceTo) && typeof this.setRequestHeader === "function") {
122
+ try {
123
+ this.setRequestHeader("traceparent", formatTraceparent(span.traceId, span.spanId, span.sampled));
124
+ }
125
+ catch {
126
+ /* ignore */
127
+ }
128
+ }
129
+ let finished = false;
130
+ const finish = (kind) => {
131
+ if (finished)
132
+ return;
133
+ finished = true;
134
+ try {
135
+ const code = typeof this.status === "number" && this.status > 0 ? this.status : undefined;
136
+ if (code === undefined || kind) {
137
+ span.end({ status: { code: 2, message: kind ?? "network error" }, attributes: { "error.type": kind ?? "network_error" } });
138
+ }
139
+ else {
140
+ span.end({ status: errStatus(code), attributes: { "http.response.status_code": code, "error.type": code >= 400 ? String(code) : undefined } });
141
+ }
142
+ }
143
+ catch {
144
+ /* ignore */
145
+ }
146
+ };
147
+ if (typeof this.addEventListener === "function") {
148
+ this.addEventListener("abort", () => finish("abort"));
149
+ this.addEventListener("timeout", () => finish("timeout"));
150
+ this.addEventListener("loadend", () => finish());
151
+ }
152
+ }
153
+ }
154
+ catch {
155
+ /* fall through to the real send */
156
+ }
157
+ return origSend.apply(this, args);
158
+ };
159
+ return () => {
160
+ proto.open = origOpen;
161
+ proto.send = origSend;
162
+ };
163
+ }
164
+ //# sourceMappingURL=instrument-http.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"instrument-http.js","sourceRoot":"","sources":["../src/instrument-http.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ import { Attrs } from "./otlp.js";
2
+ export declare function buildLogsRequestBody(resourceAttrs: Attrs, records: Array<{
3
+ timeMs: number;
4
+ body: string;
5
+ attributes: Attrs;
6
+ }>): string;
7
+ export type LogFetchLike = (input: string, init: {
8
+ method: string;
9
+ headers: Record<string, string>;
10
+ body: string;
11
+ keepalive: boolean;
12
+ }) => Promise<{
13
+ ok: boolean;
14
+ }>;
15
+ /** POST OTLP/HTTP JSON logs. Never throws. */
16
+ export declare function postLogs(url: string, projectKey: string, body: string, fetchFn: LogFetchLike | undefined): Promise<void>;
@@ -0,0 +1,28 @@
1
+ import { encodeAttrs, unixNano } from "./otlp.js";
2
+ const REPLAY_SCOPE = { name: "@owlpane/browser-replay", version: "0.1.0" };
3
+ export function buildLogsRequestBody(resourceAttrs, records) {
4
+ const resource = JSON.stringify({ attributes: encodeAttrs(resourceAttrs) });
5
+ const logs = records.map((r) => JSON.stringify({
6
+ timeUnixNano: unixNano(r.timeMs),
7
+ body: { stringValue: r.body },
8
+ attributes: encodeAttrs(r.attributes),
9
+ }));
10
+ return `{"resourceLogs":[{"resource":${resource},"scopeLogs":[{"scope":${JSON.stringify(REPLAY_SCOPE)},"logRecords":[${logs.join(",")}]}]}]}`;
11
+ }
12
+ /** POST OTLP/HTTP JSON logs. Never throws. */
13
+ export async function postLogs(url, projectKey, body, fetchFn) {
14
+ if (!fetchFn)
15
+ return;
16
+ try {
17
+ await fetchFn(url, {
18
+ method: "POST",
19
+ headers: { "content-type": "application/json", authorization: `Bearer ${projectKey}` },
20
+ body,
21
+ keepalive: true,
22
+ });
23
+ }
24
+ catch {
25
+ /* ignore */
26
+ }
27
+ }
28
+ //# sourceMappingURL=log-otlp.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"log-otlp.js","sourceRoot":"","sources":["../src/log-otlp.ts"],"names":[],"mappings":"AAAA,OAAO,EAAS,WAAW,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAEzD,MAAM,YAAY,GAAG,EAAE,IAAI,EAAE,yBAAyB,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC;AAE3E,MAAM,UAAU,oBAAoB,CAClC,aAAoB,EACpB,OAAmE;IAEnE,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,EAAE,UAAU,EAAE,WAAW,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC;IAC5E,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAC7B,IAAI,CAAC,SAAS,CAAC;QACb,YAAY,EAAE,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC;QAChC,IAAI,EAAE,EAAE,WAAW,EAAE,CAAC,CAAC,IAAI,EAAE;QAC7B,UAAU,EAAE,WAAW,CAAC,CAAC,CAAC,UAAU,CAAC;KACtC,CAAC,CACH,CAAC;IACF,OAAO,gCAAgC,QAAQ,0BAA0B,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,kBAAkB,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC;AAChJ,CAAC;AASD,8CAA8C;AAC9C,MAAM,CAAC,KAAK,UAAU,QAAQ,CAC5B,GAAW,EACX,UAAkB,EAClB,IAAY,EACZ,OAAiC;IAEjC,IAAI,CAAC,OAAO;QAAE,OAAO;IACrB,IAAI,CAAC;QACH,MAAM,OAAO,CAAC,GAAG,EAAE;YACjB,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE,aAAa,EAAE,UAAU,UAAU,EAAE,EAAE;YACtF,IAAI;YACJ,SAAS,EAAE,IAAI;SAChB,CAAC,CAAC;IACL,CAAC;IAAC,MAAM,CAAC;QACP,YAAY;IACd,CAAC;AACH,CAAC"}
@@ -0,0 +1,30 @@
1
+ import type { Env } from "./env.js";
2
+ import type { ActiveSpan, ResolvedOptions, Tracer } from "./tracer.js";
3
+ type Ctx = {
4
+ env: Env;
5
+ opts: ResolvedOptions;
6
+ tracer: Tracer;
7
+ page: ActiveSpan;
8
+ };
9
+ /**
10
+ * Emits one 'documentLoad' span covering navigation start..loadEventEnd. Phase timings are
11
+ * attributes (milliseconds relative to navigation start) rather than child spans, to keep volume low.
12
+ */
13
+ export declare function captureDocumentLoad(c: Ctx): void;
14
+ export type VitalsHandle = {
15
+ report(): void;
16
+ };
17
+ /**
18
+ * LCP / CLS / INP via PerformanceObserver. Values keep updating while the page is alive and are
19
+ * reported once, when the page is hidden (or `report()` is called), as spans named 'webvital.<NAME>'.
20
+ */
21
+ export declare function captureVitals(c: Ctx): VitalsHandle;
22
+ export type ErrorReporter = (error: unknown, source: string, where?: {
23
+ file?: string;
24
+ line?: number;
25
+ col?: number;
26
+ }) => void;
27
+ /** Records an error as a span with an OTLP 'exception' event (same attribute names as the Node SDK / OTel). */
28
+ export declare function createErrorReporter(c: Ctx): ErrorReporter;
29
+ export declare function captureErrors(c: Ctx, report: ErrorReporter): void;
30
+ export {};
@@ -0,0 +1,176 @@
1
+ import { ClsTracker, InpTracker, rate } from "./vitals.js";
2
+ function observe(env, type, cb, extra = {}) {
3
+ const PO = env.PerformanceObserver;
4
+ if (!PO)
5
+ return false;
6
+ try {
7
+ const supported = PO.supportedEntryTypes;
8
+ if (supported && !supported.includes(type))
9
+ return false;
10
+ const po = new PO((list) => {
11
+ try {
12
+ cb(list.getEntries());
13
+ }
14
+ catch {
15
+ /* ignore */
16
+ }
17
+ });
18
+ po.observe({ type, buffered: true, ...extra });
19
+ return true;
20
+ }
21
+ catch {
22
+ return false;
23
+ }
24
+ }
25
+ /**
26
+ * Emits one 'documentLoad' span covering navigation start..loadEventEnd. Phase timings are
27
+ * attributes (milliseconds relative to navigation start) rather than child spans, to keep volume low.
28
+ */
29
+ export function captureDocumentLoad(c) {
30
+ const { env } = c;
31
+ const run = () => {
32
+ try {
33
+ const nav = env.performance?.getEntriesByType?.("navigation")?.[0];
34
+ const origin = env.performance?.timeOrigin ?? env.now();
35
+ const attrs = {};
36
+ let end = env.now();
37
+ if (nav) {
38
+ const ms = (v) => (typeof v === "number" && v >= 0 ? Math.round(v * 100) / 100 : undefined);
39
+ attrs["browser.navigation.type"] = nav.type;
40
+ attrs["browser.timing.redirect_ms"] = ms(nav.redirectEnd - nav.redirectStart);
41
+ attrs["browser.timing.dns_ms"] = ms(nav.domainLookupEnd - nav.domainLookupStart);
42
+ attrs["browser.timing.connect_ms"] = ms(nav.connectEnd - nav.connectStart);
43
+ attrs["browser.timing.ttfb_ms"] = ms(nav.responseStart - nav.startTime);
44
+ attrs["browser.timing.response_ms"] = ms(nav.responseEnd - nav.responseStart);
45
+ attrs["browser.timing.dom_interactive_ms"] = ms(nav.domInteractive);
46
+ attrs["browser.timing.dom_content_loaded_ms"] = ms(nav.domContentLoadedEventEnd);
47
+ attrs["browser.timing.load_ms"] = ms(nav.loadEventEnd);
48
+ attrs["browser.timing.transfer_size_bytes"] = ms(nav.transferSize);
49
+ if (nav.loadEventEnd > 0)
50
+ end = origin + nav.loadEventEnd;
51
+ }
52
+ c.page.end({ endMs: end, attributes: attrs });
53
+ }
54
+ catch {
55
+ /* ignore */
56
+ }
57
+ };
58
+ if (env.document?.readyState === "complete")
59
+ env.setTimeout?.(run, 0);
60
+ else
61
+ env.addEventListener?.("load", () => env.setTimeout?.(run, 0));
62
+ }
63
+ /**
64
+ * LCP / CLS / INP via PerformanceObserver. Values keep updating while the page is alive and are
65
+ * reported once, when the page is hidden (or `report()` is called), as spans named 'webvital.<NAME>'.
66
+ */
67
+ export function captureVitals(c) {
68
+ const { env } = c;
69
+ let lcp;
70
+ const cls = new ClsTracker();
71
+ const inp = new InpTracker();
72
+ let clsSeen = false;
73
+ let reported = false;
74
+ observe(env, "largest-contentful-paint", (es) => {
75
+ for (const e of es)
76
+ lcp = e.renderTime || e.loadTime || e.startTime;
77
+ });
78
+ observe(env, "layout-shift", (es) => {
79
+ for (const e of es) {
80
+ clsSeen = true;
81
+ cls.add(e);
82
+ }
83
+ });
84
+ observe(env, "event", (es) => es.forEach((e) => inp.add(e)), { durationThreshold: 40 });
85
+ function emit(name, value, extra = {}) {
86
+ const now = env.now();
87
+ const s = c.tracer.start(`webvital.${name}`, 1, {
88
+ traceId: c.page.traceId,
89
+ parentSpanId: c.page.spanId,
90
+ sampled: c.page.sampled,
91
+ startMs: now,
92
+ attributes: { "webvital.name": name, "webvital.value": name === "CLS" ? Math.round(value * 10000) / 10000 : Math.round(value * 100) / 100, "webvital.unit": name === "CLS" ? "score" : "ms", "webvital.rating": rate(name, value), ...extra },
93
+ });
94
+ s.end({ endMs: now });
95
+ }
96
+ function report() {
97
+ if (reported)
98
+ return;
99
+ reported = true;
100
+ try {
101
+ if (lcp !== undefined)
102
+ emit("LCP", lcp);
103
+ if (clsSeen || lcp !== undefined)
104
+ emit("CLS", cls.value);
105
+ const v = inp.value;
106
+ if (v !== undefined)
107
+ emit("INP", v, { "webvital.interactions": inp.count });
108
+ }
109
+ catch {
110
+ /* ignore */
111
+ }
112
+ }
113
+ return { report };
114
+ }
115
+ function errorInfo(x) {
116
+ if (x && typeof x === "object" && ("message" in x || "stack" in x)) {
117
+ const e = x;
118
+ return { type: String(e.name || "Error"), message: String(e.message ?? ""), stack: typeof e.stack === "string" ? e.stack : undefined };
119
+ }
120
+ return { type: typeof x === "string" ? "string" : "UnknownError", message: typeof x === "string" ? x : safeString(x) };
121
+ }
122
+ function safeString(x) {
123
+ try {
124
+ return typeof x === "object" ? JSON.stringify(x) ?? String(x) : String(x);
125
+ }
126
+ catch {
127
+ return String(x);
128
+ }
129
+ }
130
+ /** Records an error as a span with an OTLP 'exception' event (same attribute names as the Node SDK / OTel). */
131
+ export function createErrorReporter(c) {
132
+ let count = 0;
133
+ return (error, source, where) => {
134
+ try {
135
+ if (count >= c.opts.maxErrorsPerPage)
136
+ return;
137
+ count++;
138
+ const info = errorInfo(error);
139
+ const now = c.env.now();
140
+ const s = c.tracer.start("exception", 1, {
141
+ traceId: c.page.traceId,
142
+ parentSpanId: c.page.spanId,
143
+ sampled: c.page.sampled,
144
+ startMs: now,
145
+ attributes: { "owlpane.error.source": source, "code.filepath": where?.file, "code.lineno": where?.line, "code.column": where?.col },
146
+ });
147
+ s.end({
148
+ endMs: now,
149
+ status: { code: 2, message: info.message.slice(0, 500) },
150
+ events: [
151
+ {
152
+ name: "exception",
153
+ timeMs: now,
154
+ attributes: { "exception.type": info.type, "exception.message": info.message.slice(0, 2000), "exception.stacktrace": info.stack?.slice(0, 8000), "exception.escaped": true },
155
+ },
156
+ ],
157
+ });
158
+ }
159
+ catch {
160
+ /* ignore */
161
+ }
162
+ };
163
+ }
164
+ export function captureErrors(c, report) {
165
+ const add = c.env.addEventListener;
166
+ if (!add)
167
+ return;
168
+ add("error", (ev) => {
169
+ // Resource load errors have no `message`; skip them.
170
+ if (!ev || (ev.message === undefined && ev.error === undefined))
171
+ return;
172
+ report(ev.error ?? ev.message, "onerror", { file: ev.filename ? String(ev.filename).split(/[?#]/)[0] : undefined, line: ev.lineno, col: ev.colno });
173
+ });
174
+ add("unhandledrejection", (ev) => report(ev?.reason, "unhandledrejection"));
175
+ }
176
+ //# sourceMappingURL=observers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"observers.js","sourceRoot":"","sources":["../src/observers.ts"],"names":[],"mappings":"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"}
package/dist/otlp.d.ts ADDED
@@ -0,0 +1,47 @@
1
+ export type AttrValue = string | number | boolean;
2
+ export type Attrs = Record<string, AttrValue | undefined | null>;
3
+ export type SpanEvent = {
4
+ name: string;
5
+ timeMs: number;
6
+ attributes?: Attrs;
7
+ };
8
+ export type SpanData = {
9
+ traceId: string;
10
+ spanId: string;
11
+ parentSpanId?: string;
12
+ name: string;
13
+ /** OTLP SpanKind: 1 internal, 2 server, 3 client. */
14
+ kind: 1 | 3;
15
+ /** Epoch milliseconds (fractional allowed). */
16
+ startMs: number;
17
+ endMs: number;
18
+ attributes: Attrs;
19
+ events?: SpanEvent[];
20
+ /** OTLP status code: 0 unset, 1 ok, 2 error. */
21
+ status?: {
22
+ code: 0 | 1 | 2;
23
+ message?: string;
24
+ };
25
+ };
26
+ export type OtlpAnyValue = {
27
+ stringValue: string;
28
+ } | {
29
+ intValue: string;
30
+ } | {
31
+ doubleValue: number;
32
+ } | {
33
+ boolValue: boolean;
34
+ };
35
+ export type OtlpKeyValue = {
36
+ key: string;
37
+ value: OtlpAnyValue;
38
+ };
39
+ export declare function unixNano(ms: number): string;
40
+ export declare function encodeValue(v: AttrValue): OtlpAnyValue;
41
+ export declare function encodeAttrs(attrs: Attrs | undefined): OtlpKeyValue[];
42
+ export declare function encodeSpan(s: SpanData): Record<string, unknown>;
43
+ export declare const SCOPE: {
44
+ name: string;
45
+ };
46
+ /** Wraps already-serialised span JSON strings into an ExportTraceServiceRequest body. */
47
+ export declare function buildRequestBody(resourceAttrs: Attrs, spanJson: string[], version: string): string;
package/dist/otlp.js ADDED
@@ -0,0 +1,49 @@
1
+ export function unixNano(ms) {
2
+ if (!Number.isFinite(ms) || ms < 0)
3
+ return "0";
4
+ return (BigInt(Math.round(ms * 1000)) * 1000n).toString();
5
+ }
6
+ export function encodeValue(v) {
7
+ if (typeof v === "boolean")
8
+ return { boolValue: v };
9
+ if (typeof v === "number") {
10
+ if (!Number.isFinite(v))
11
+ return { stringValue: String(v) };
12
+ return Number.isInteger(v) && Math.abs(v) <= Number.MAX_SAFE_INTEGER ? { intValue: String(v) } : { doubleValue: v };
13
+ }
14
+ return { stringValue: String(v) };
15
+ }
16
+ export function encodeAttrs(attrs) {
17
+ const out = [];
18
+ if (!attrs)
19
+ return out;
20
+ for (const [key, value] of Object.entries(attrs)) {
21
+ if (value === undefined || value === null)
22
+ continue;
23
+ out.push({ key, value: encodeValue(value) });
24
+ }
25
+ return out;
26
+ }
27
+ export function encodeSpan(s) {
28
+ const o = {
29
+ traceId: s.traceId,
30
+ spanId: s.spanId,
31
+ name: s.name,
32
+ kind: s.kind,
33
+ startTimeUnixNano: unixNano(s.startMs),
34
+ endTimeUnixNano: unixNano(Math.max(s.endMs, s.startMs)),
35
+ attributes: encodeAttrs(s.attributes),
36
+ events: (s.events ?? []).map((e) => ({ timeUnixNano: unixNano(e.timeMs), name: e.name, attributes: encodeAttrs(e.attributes) })),
37
+ status: s.status ? { code: s.status.code, ...(s.status.message ? { message: s.status.message } : {}) } : { code: 0 },
38
+ };
39
+ if (s.parentSpanId)
40
+ o.parentSpanId = s.parentSpanId;
41
+ return o;
42
+ }
43
+ export const SCOPE = { name: "@owlpane/browser" };
44
+ /** Wraps already-serialised span JSON strings into an ExportTraceServiceRequest body. */
45
+ export function buildRequestBody(resourceAttrs, spanJson, version) {
46
+ const resource = JSON.stringify({ attributes: encodeAttrs(resourceAttrs) });
47
+ return `{"resourceSpans":[{"resource":${resource},"scopeSpans":[{"scope":${JSON.stringify({ ...SCOPE, version })},"spans":[${spanJson.join(",")}]}]}]}`;
48
+ }
49
+ //# sourceMappingURL=otlp.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"otlp.js","sourceRoot":"","sources":["../src/otlp.ts"],"names":[],"mappings":"AAwBA,MAAM,UAAU,QAAQ,CAAC,EAAU;IACjC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,GAAG,CAAC;QAAE,OAAO,GAAG,CAAC;IAC/C,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,GAAG,IAAI,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,QAAQ,EAAE,CAAC;AAC5D,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,CAAY;IACtC,IAAI,OAAO,CAAC,KAAK,SAAS;QAAE,OAAO,EAAE,SAAS,EAAE,CAAC,EAAE,CAAC;IACpD,IAAI,OAAO,CAAC,KAAK,QAAQ,EAAE,CAAC;QAC1B,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC;YAAE,OAAO,EAAE,WAAW,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;QAC3D,OAAO,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC,gBAAgB,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,CAAC,EAAE,CAAC;IACtH,CAAC;IACD,OAAO,EAAE,WAAW,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;AACpC,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,KAAwB;IAClD,MAAM,GAAG,GAAmB,EAAE,CAAC;IAC/B,IAAI,CAAC,KAAK;QAAE,OAAO,GAAG,CAAC;IACvB,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACjD,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI;YAAE,SAAS;QACpD,GAAG,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,WAAW,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IAC/C,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,CAAW;IACpC,MAAM,CAAC,GAA4B;QACjC,OAAO,EAAE,CAAC,CAAC,OAAO;QAClB,MAAM,EAAE,CAAC,CAAC,MAAM;QAChB,IAAI,EAAE,CAAC,CAAC,IAAI;QACZ,IAAI,EAAE,CAAC,CAAC,IAAI;QACZ,iBAAiB,EAAE,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC;QACtC,eAAe,EAAE,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC;QACvD,UAAU,EAAE,WAAW,CAAC,CAAC,CAAC,UAAU,CAAC;QACrC,MAAM,EAAE,CAAC,CAAC,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,YAAY,EAAE,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,UAAU,EAAE,WAAW,CAAC,CAAC,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;QAChI,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE;KACrH,CAAC;IACF,IAAI,CAAC,CAAC,YAAY;QAAE,CAAC,CAAC,YAAY,GAAG,CAAC,CAAC,YAAY,CAAC;IACpD,OAAO,CAAC,CAAC;AACX,CAAC;AAED,MAAM,CAAC,MAAM,KAAK,GAAG,EAAE,IAAI,EAAE,kBAAkB,EAAE,CAAC;AAElD,yFAAyF;AACzF,MAAM,UAAU,gBAAgB,CAAC,aAAoB,EAAE,QAAkB,EAAE,OAAe;IACxF,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,EAAE,UAAU,EAAE,WAAW,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC;IAC5E,OAAO,iCAAiC,QAAQ,2BAA2B,IAAI,CAAC,SAAS,CAAC,EAAE,GAAG,KAAK,EAAE,OAAO,EAAE,CAAC,aAAa,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC;AAC1J,CAAC"}
@@ -0,0 +1,18 @@
1
+ export type QueueItem = {
2
+ json: string;
3
+ bytes: number;
4
+ };
5
+ /** Bounded FIFO. Oldest items are dropped when full so a broken endpoint cannot grow memory. */
6
+ export declare class SpanQueue {
7
+ private readonly maxItems;
8
+ private items;
9
+ dropped: number;
10
+ constructor(maxItems: number);
11
+ get size(): number;
12
+ push(item: QueueItem): void;
13
+ /**
14
+ * Removes and returns items for one request, capped by count and by total bytes.
15
+ * A single oversize item is dropped (counted) rather than blocking the queue.
16
+ */
17
+ take(maxCount: number, maxBytes: number): QueueItem[];
18
+ }
package/dist/queue.js ADDED
@@ -0,0 +1,41 @@
1
+ /** Bounded FIFO. Oldest items are dropped when full so a broken endpoint cannot grow memory. */
2
+ export class SpanQueue {
3
+ maxItems;
4
+ items = [];
5
+ dropped = 0;
6
+ constructor(maxItems) {
7
+ this.maxItems = maxItems;
8
+ }
9
+ get size() {
10
+ return this.items.length;
11
+ }
12
+ push(item) {
13
+ this.items.push(item);
14
+ while (this.items.length > this.maxItems) {
15
+ this.items.shift();
16
+ this.dropped++;
17
+ }
18
+ }
19
+ /**
20
+ * Removes and returns items for one request, capped by count and by total bytes.
21
+ * A single oversize item is dropped (counted) rather than blocking the queue.
22
+ */
23
+ take(maxCount, maxBytes) {
24
+ const out = [];
25
+ let bytes = 0;
26
+ while (this.items.length && out.length < maxCount) {
27
+ const next = this.items[0];
28
+ if (next.bytes > maxBytes) {
29
+ this.items.shift();
30
+ this.dropped++;
31
+ continue;
32
+ }
33
+ if (bytes + next.bytes > maxBytes)
34
+ break;
35
+ bytes += next.bytes;
36
+ out.push(this.items.shift());
37
+ }
38
+ return out;
39
+ }
40
+ }
41
+ //# sourceMappingURL=queue.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"queue.js","sourceRoot":"","sources":["../src/queue.ts"],"names":[],"mappings":"AAEA,gGAAgG;AAChG,MAAM,OAAO,SAAS;IAGS;IAFrB,KAAK,GAAgB,EAAE,CAAC;IAChC,OAAO,GAAG,CAAC,CAAC;IACZ,YAA6B,QAAgB;QAAhB,aAAQ,GAAR,QAAQ,CAAQ;IAAG,CAAC;IAEjD,IAAI,IAAI;QACN,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC;IAC3B,CAAC;IAED,IAAI,CAAC,IAAe;QAClB,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACtB,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC;YACzC,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;YACnB,IAAI,CAAC,OAAO,EAAE,CAAC;QACjB,CAAC;IACH,CAAC;IAED;;;OAGG;IACH,IAAI,CAAC,QAAgB,EAAE,QAAgB;QACrC,MAAM,GAAG,GAAgB,EAAE,CAAC;QAC5B,IAAI,KAAK,GAAG,CAAC,CAAC;QACd,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,IAAI,GAAG,CAAC,MAAM,GAAG,QAAQ,EAAE,CAAC;YAClD,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YAC3B,IAAI,IAAI,CAAC,KAAK,GAAG,QAAQ,EAAE,CAAC;gBAC1B,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;gBACnB,IAAI,CAAC,OAAO,EAAE,CAAC;gBACf,SAAS;YACX,CAAC;YACD,IAAI,KAAK,GAAG,IAAI,CAAC,KAAK,GAAG,QAAQ;gBAAE,MAAM;YACzC,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC;YACpB,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,EAAG,CAAC,CAAC;QAChC,CAAC;QACD,OAAO,GAAG,CAAC;IACb,CAAC;CACF"}