@marz32one/otel-ws 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/README.md ADDED
@@ -0,0 +1,26 @@
1
+ # @marz32one/otel-ws
2
+
3
+ Native [`ws`](https://www.npmjs.com/package/ws) OpenTelemetry instrumentation for Node.js.
4
+
5
+ This package keeps the same wire compatibility as Go `otel-gorilla-ws` and `@marz32one/otel-rxjs-ws`:
6
+
7
+ - Outgoing send: embedded JSON `{ "traceparent"?, "tracestate"?, "data": ... }`
8
+ - Incoming receive: embedded JSON, header envelope, or plain JSON/text
9
+
10
+ ## Install
11
+
12
+ ```bash
13
+ npm install @marz32one/otel-ws @opentelemetry/api ws
14
+ ```
15
+
16
+ ## Usage
17
+
18
+ ```ts
19
+ import { connect } from '@marz32one/otel-ws';
20
+
21
+ const socket = await connect('ws://localhost:8082/ws');
22
+ socket.onMessage((msg) => {
23
+ console.log('recv', msg);
24
+ });
25
+ socket.send({ body: 'hello' });
26
+ ```
@@ -0,0 +1,12 @@
1
+ import { Context } from '@opentelemetry/api';
2
+ import WebSocket from 'ws';
3
+ export type MessageHandler<T = unknown> = (data: T, ctx: Context) => void;
4
+ export interface InstrumentedSocket<TSend = unknown, TReceive = unknown> {
5
+ readonly raw: WebSocket;
6
+ send(data: TSend, cb?: (err?: Error) => void): void;
7
+ onMessage(handler: MessageHandler<TReceive>): () => void;
8
+ close(code?: number, reason?: string): void;
9
+ }
10
+ export declare function connect(url: string): Promise<InstrumentedSocket>;
11
+ export declare function instrumentSocket<TSend = unknown, TReceive = unknown>(ws: WebSocket): InstrumentedSocket<TSend, TReceive>;
12
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,OAAO,EAQR,MAAM,oBAAoB,CAAC;AAC5B,OAAO,SAAS,MAAM,IAAI,CAAC;AAW3B,MAAM,MAAM,cAAc,CAAC,CAAC,GAAG,OAAO,IAAI,CAAC,IAAI,EAAE,CAAC,EAAE,GAAG,EAAE,OAAO,KAAK,IAAI,CAAC;AAE1E,MAAM,WAAW,kBAAkB,CAAC,KAAK,GAAG,OAAO,EAAE,QAAQ,GAAG,OAAO;IACrE,QAAQ,CAAC,GAAG,EAAE,SAAS,CAAC;IACxB,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,KAAK,KAAK,IAAI,GAAG,IAAI,CAAC;IACpD,SAAS,CAAC,OAAO,EAAE,cAAc,CAAC,QAAQ,CAAC,GAAG,MAAM,IAAI,CAAC;IACzD,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC7C;AAED,wBAAgB,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAchE;AAED,wBAAgB,gBAAgB,CAAC,KAAK,GAAG,OAAO,EAAE,QAAQ,GAAG,OAAO,EAClE,EAAE,EAAE,SAAS,GACZ,kBAAkB,CAAC,KAAK,EAAE,QAAQ,CAAC,CAiGrC"}
package/dist/index.js ADDED
@@ -0,0 +1,104 @@
1
+ import { SpanKind, SpanStatusCode, context as otelContext, defaultTextMapGetter, defaultTextMapSetter, propagation, trace, } from '@opentelemetry/api';
2
+ import WebSocket from 'ws';
3
+ import { TRACEPARENT_HEADER, TRACESTATE_HEADER, deserializeMessage, } from './message.js';
4
+ import { getTracerProvider } from './options.js';
5
+ import { version } from './version.js';
6
+ export function connect(url) {
7
+ return new Promise((resolve, reject) => {
8
+ const ws = new WebSocket(url);
9
+ const onOpen = () => {
10
+ ws.off('error', onErr);
11
+ resolve(instrumentSocket(ws));
12
+ };
13
+ const onErr = (err) => {
14
+ ws.off('open', onOpen);
15
+ reject(err);
16
+ };
17
+ ws.once('open', onOpen);
18
+ ws.once('error', onErr);
19
+ });
20
+ }
21
+ export function instrumentSocket(ws) {
22
+ const tracer = getTracerProvider().getTracer('@marz32one/otel-ws', version());
23
+ const send = (data, cb) => {
24
+ const activeCtx = otelContext.active();
25
+ const span = tracer.startSpan('websocket.send', {
26
+ kind: SpanKind.PRODUCER,
27
+ attributes: {
28
+ 'messaging.system': 'websocket',
29
+ 'messaging.operation': 'send',
30
+ },
31
+ }, activeCtx);
32
+ const spanCtx = trace.setSpan(activeCtx, span);
33
+ let serialized;
34
+ try {
35
+ const carrier = {};
36
+ propagation.inject(spanCtx, carrier, defaultTextMapSetter);
37
+ const wire = { data };
38
+ const tp = carrier[TRACEPARENT_HEADER];
39
+ const ts = carrier[TRACESTATE_HEADER];
40
+ if (tp)
41
+ wire.traceparent = tp;
42
+ if (ts)
43
+ wire.tracestate = ts;
44
+ serialized = JSON.stringify(wire);
45
+ }
46
+ catch (err) {
47
+ span.recordException(err);
48
+ span.setStatus({ code: SpanStatusCode.ERROR, message: err.message });
49
+ span.end();
50
+ cb?.(err);
51
+ return;
52
+ }
53
+ ws.send(serialized, (sendErr) => {
54
+ if (sendErr) {
55
+ span.recordException(sendErr);
56
+ span.setStatus({ code: SpanStatusCode.ERROR, message: sendErr.message });
57
+ }
58
+ else {
59
+ span.setStatus({ code: SpanStatusCode.OK });
60
+ }
61
+ span.end();
62
+ cb?.(sendErr);
63
+ });
64
+ };
65
+ const onMessage = (handler) => {
66
+ const listener = (raw) => {
67
+ const body = typeof raw === 'string'
68
+ ? raw
69
+ : Buffer.isBuffer(raw)
70
+ ? raw.toString('utf8')
71
+ : raw.toString();
72
+ const parsed = deserializeMessage(body);
73
+ const carrier = {};
74
+ if (parsed.traceparent)
75
+ carrier[TRACEPARENT_HEADER] = parsed.traceparent;
76
+ if (parsed.tracestate)
77
+ carrier[TRACESTATE_HEADER] = parsed.tracestate;
78
+ const hasTrace = Object.keys(carrier).length > 0;
79
+ const baseCtx = otelContext.active();
80
+ const senderCtx = hasTrace
81
+ ? propagation.extract(baseCtx, carrier, defaultTextMapGetter)
82
+ : baseCtx;
83
+ const span = tracer.startSpan('websocket.receive', {
84
+ kind: SpanKind.CONSUMER,
85
+ attributes: {
86
+ 'messaging.system': 'websocket',
87
+ 'messaging.operation': 'receive',
88
+ },
89
+ }, senderCtx);
90
+ const outCtx = trace.setSpan(senderCtx, span);
91
+ span.end();
92
+ otelContext.with(outCtx, () => handler(parsed.data, outCtx));
93
+ };
94
+ ws.on('message', listener);
95
+ return () => ws.off('message', listener);
96
+ };
97
+ return {
98
+ raw: ws,
99
+ send,
100
+ onMessage,
101
+ close: (code, reason) => ws.close(code, reason),
102
+ };
103
+ }
104
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ export declare const TRACEPARENT_HEADER = "traceparent";
2
+ export declare const TRACESTATE_HEADER = "tracestate";
3
+ export interface WireMessage<T = unknown> {
4
+ traceparent?: string;
5
+ tracestate?: string;
6
+ data: T;
7
+ }
8
+ export interface Envelope {
9
+ headers: Record<string, string>;
10
+ payload: string;
11
+ }
12
+ export interface ParsedWireMessage<T = unknown> {
13
+ data: T;
14
+ traceparent?: string;
15
+ tracestate?: string;
16
+ }
17
+ export declare function deserializeMessage<T = unknown>(raw: string): ParsedWireMessage<T>;
18
+ export declare function decodeBase64(s: string): string;
19
+ //# sourceMappingURL=message.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"message.d.ts","sourceRoot":"","sources":["../src/message.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,kBAAkB,gBAAgB,CAAC;AAChD,eAAO,MAAM,iBAAiB,eAAe,CAAC;AAE9C,MAAM,WAAW,WAAW,CAAC,CAAC,GAAG,OAAO;IACtC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,CAAC,CAAC;CACT;AAED,MAAM,WAAW,QAAQ;IACvB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,iBAAiB,CAAC,CAAC,GAAG,OAAO;IAC5C,IAAI,EAAE,CAAC,CAAC;IACR,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,wBAAgB,kBAAkB,CAAC,CAAC,GAAG,OAAO,EAAE,GAAG,EAAE,MAAM,GAAG,iBAAiB,CAAC,CAAC,CAAC,CA2CjF;AAcD,wBAAgB,YAAY,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAgB9C"}
@@ -0,0 +1,72 @@
1
+ export const TRACEPARENT_HEADER = 'traceparent';
2
+ export const TRACESTATE_HEADER = 'tracestate';
3
+ export function deserializeMessage(raw) {
4
+ try {
5
+ const parsed = JSON.parse(raw);
6
+ if (typeof parsed !== 'object' || parsed === null || Array.isArray(parsed)) {
7
+ return { data: parsed };
8
+ }
9
+ const obj = parsed;
10
+ if ('data' in obj) {
11
+ return {
12
+ data: obj.data,
13
+ traceparent: asString(obj[TRACEPARENT_HEADER]),
14
+ tracestate: asString(obj[TRACESTATE_HEADER]),
15
+ };
16
+ }
17
+ if (isEnvelope(obj)) {
18
+ const headers = obj.headers;
19
+ let payloadStr;
20
+ try {
21
+ payloadStr = decodeBase64(obj.payload);
22
+ }
23
+ catch {
24
+ return { data: raw };
25
+ }
26
+ let data;
27
+ try {
28
+ data = JSON.parse(payloadStr);
29
+ }
30
+ catch {
31
+ data = payloadStr;
32
+ }
33
+ return {
34
+ data,
35
+ traceparent: asString(headers[TRACEPARENT_HEADER]),
36
+ tracestate: asString(headers[TRACESTATE_HEADER]),
37
+ };
38
+ }
39
+ return { data: obj };
40
+ }
41
+ catch {
42
+ return { data: raw };
43
+ }
44
+ }
45
+ function isEnvelope(obj) {
46
+ return (typeof obj.headers === 'object' &&
47
+ obj.headers !== null &&
48
+ typeof obj.payload === 'string');
49
+ }
50
+ function asString(v) {
51
+ return typeof v === 'string' && v.length > 0 ? v : undefined;
52
+ }
53
+ export function decodeBase64(s) {
54
+ if (typeof atob === 'function') {
55
+ try {
56
+ return atob(s);
57
+ }
58
+ catch {
59
+ /* fall through */
60
+ }
61
+ }
62
+ if (typeof Buffer !== 'undefined') {
63
+ try {
64
+ return Buffer.from(s, 'base64').toString('utf8');
65
+ }
66
+ catch {
67
+ /* fall through */
68
+ }
69
+ }
70
+ throw new Error('decodeBase64: no decoder available or invalid base64 input');
71
+ }
72
+ //# sourceMappingURL=message.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"message.js","sourceRoot":"","sources":["../src/message.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,kBAAkB,GAAG,aAAa,CAAC;AAChD,MAAM,CAAC,MAAM,iBAAiB,GAAG,YAAY,CAAC;AAmB9C,MAAM,UAAU,kBAAkB,CAAc,GAAW;IACzD,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAY,CAAC;QAE1C,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,KAAK,IAAI,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;YAC3E,OAAO,EAAE,IAAI,EAAE,MAAsB,EAAE,CAAC;QAC1C,CAAC;QAED,MAAM,GAAG,GAAG,MAAiC,CAAC;QAE9C,IAAI,MAAM,IAAI,GAAG,EAAE,CAAC;YAClB,OAAO;gBACL,IAAI,EAAE,GAAG,CAAC,IAAS;gBACnB,WAAW,EAAE,QAAQ,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC;gBAC9C,UAAU,EAAE,QAAQ,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;aAC7C,CAAC;QACJ,CAAC;QAED,IAAI,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YACpB,MAAM,OAAO,GAAG,GAAG,CAAC,OAAkC,CAAC;YACvD,IAAI,UAAkB,CAAC;YACvB,IAAI,CAAC;gBACH,UAAU,GAAG,YAAY,CAAC,GAAG,CAAC,OAAiB,CAAC,CAAC;YACnD,CAAC;YAAC,MAAM,CAAC;gBACP,OAAO,EAAE,IAAI,EAAE,GAAmB,EAAE,CAAC;YACvC,CAAC;YACD,IAAI,IAAO,CAAC;YACZ,IAAI,CAAC;gBACH,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,CAAM,CAAC;YACrC,CAAC;YAAC,MAAM,CAAC;gBACP,IAAI,GAAG,UAA0B,CAAC;YACpC,CAAC;YACD,OAAO;gBACL,IAAI;gBACJ,WAAW,EAAE,QAAQ,CAAC,OAAO,CAAC,kBAAkB,CAAC,CAAC;gBAClD,UAAU,EAAE,QAAQ,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC;aACjD,CAAC;QACJ,CAAC;QAED,OAAO,EAAE,IAAI,EAAE,GAAmB,EAAE,CAAC;IACvC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,IAAI,EAAE,GAAmB,EAAE,CAAC;IACvC,CAAC;AACH,CAAC;AAED,SAAS,UAAU,CAAC,GAA4B;IAC9C,OAAO,CACL,OAAO,GAAG,CAAC,OAAO,KAAK,QAAQ;QAC/B,GAAG,CAAC,OAAO,KAAK,IAAI;QACpB,OAAO,GAAG,CAAC,OAAO,KAAK,QAAQ,CAChC,CAAC;AACJ,CAAC;AAED,SAAS,QAAQ,CAAC,CAAU;IAC1B,OAAO,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;AAC/D,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,CAAS;IACpC,IAAI,OAAO,IAAI,KAAK,UAAU,EAAE,CAAC;QAC/B,IAAI,CAAC;YACH,OAAO,IAAI,CAAC,CAAC,CAAC,CAAC;QACjB,CAAC;QAAC,MAAM,CAAC;YACP,kBAAkB;QACpB,CAAC;IACH,CAAC;IACD,IAAI,OAAO,MAAM,KAAK,WAAW,EAAE,CAAC;QAClC,IAAI,CAAC;YACH,OAAO,MAAM,CAAC,IAAI,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;QACnD,CAAC;QAAC,MAAM,CAAC;YACP,kBAAkB;QACpB,CAAC;IACH,CAAC;IACD,MAAM,IAAI,KAAK,CAAC,4DAA4D,CAAC,CAAC;AAChF,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { TracerProvider } from '@opentelemetry/api';
2
+ export declare function getTracerProvider(): TracerProvider;
3
+ //# sourceMappingURL=options.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"options.d.ts","sourceRoot":"","sources":["../src/options.ts"],"names":[],"mappings":"AAAA,OAAO,EAAS,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAE3D,wBAAgB,iBAAiB,IAAI,cAAc,CAElD"}
@@ -0,0 +1,5 @@
1
+ import { trace } from '@opentelemetry/api';
2
+ export function getTracerProvider() {
3
+ return trace.getTracerProvider();
4
+ }
5
+ //# sourceMappingURL=options.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"options.js","sourceRoot":"","sources":["../src/options.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAkB,MAAM,oBAAoB,CAAC;AAE3D,MAAM,UAAU,iBAAiB;IAC/B,OAAO,KAAK,CAAC,iBAAiB,EAAE,CAAC;AACnC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function version(): string;
2
+ //# sourceMappingURL=version.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"version.d.ts","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":"AAcA,wBAAgB,OAAO,IAAI,MAAM,CAEhC"}
@@ -0,0 +1,17 @@
1
+ // Copyright 2024 The otel-ws Authors.
2
+ //
3
+ // Licensed under the Apache License, Version 2.0 (the "License");
4
+ // you may not use this file except in compliance with the License.
5
+ // You may obtain a copy of the License at
6
+ //
7
+ // http://www.apache.org/licenses/LICENSE-2.0
8
+ //
9
+ // Unless required by applicable law or agreed to in writing, software
10
+ // distributed under the License is distributed on an "AS IS" BASIS,
11
+ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ // See the License for the specific language governing permissions and
13
+ // limitations under the License.
14
+ export function version() {
15
+ return '0.1.0';
16
+ }
17
+ //# sourceMappingURL=version.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"version.js","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":"AAAA,sCAAsC;AACtC,EAAE;AACF,kEAAkE;AAClE,mEAAmE;AACnE,0CAA0C;AAC1C,EAAE;AACF,iDAAiD;AACjD,EAAE;AACF,sEAAsE;AACtE,oEAAoE;AACpE,2EAA2E;AAC3E,sEAAsE;AACtE,iCAAiC;AAEjC,MAAM,UAAU,OAAO;IACrB,OAAO,OAAO,CAAC;AACjB,CAAC"}
package/package.json ADDED
@@ -0,0 +1,54 @@
1
+ {
2
+ "name": "@marz32one/otel-ws",
3
+ "version": "0.1.0",
4
+ "description": "Native ws OpenTelemetry trace propagation (embedded + header envelope; compatible with instrumentation-go/otel-gorilla-ws)",
5
+ "type": "module",
6
+ "main": "./dist/index.js",
7
+ "types": "./dist/index.d.ts",
8
+ "sideEffects": false,
9
+ "exports": {
10
+ ".": {
11
+ "types": "./dist/index.d.ts",
12
+ "import": "./dist/index.js",
13
+ "default": "./dist/index.js"
14
+ }
15
+ },
16
+ "files": [
17
+ "dist/**/*",
18
+ "README.md"
19
+ ],
20
+ "scripts": {
21
+ "build": "tsc",
22
+ "test": "NODE_OPTIONS=--experimental-vm-modules jest",
23
+ "lint": "tsc --noEmit",
24
+ "prepublishOnly": "npm run build"
25
+ },
26
+ "keywords": [
27
+ "opentelemetry",
28
+ "otel",
29
+ "websocket",
30
+ "ws",
31
+ "tracing",
32
+ "instrumentation",
33
+ "w3c-trace-context"
34
+ ],
35
+ "author": "Marz32onE",
36
+ "license": "Apache-2.0",
37
+ "engines": {
38
+ "node": ">=14.21.4"
39
+ },
40
+ "dependencies": {
41
+ "@opentelemetry/api": "^1.9.0",
42
+ "ws": "5.1.1"
43
+ },
44
+ "devDependencies": {
45
+ "@opentelemetry/core": "^1.30.1",
46
+ "@opentelemetry/sdk-trace-node": "^1.30.1",
47
+ "@types/jest": "^29.5.14",
48
+ "@types/node": "^14.18.63",
49
+ "@types/ws": "^5.1.0",
50
+ "jest": "^29.7.0",
51
+ "ts-jest": "^29.4.0",
52
+ "typescript": "^5.7.0"
53
+ }
54
+ }