@orqenix/mesh-observability 0.6.0-phase-6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/LICENSE ADDED
@@ -0,0 +1,19 @@
1
+ Apache License
2
+ Version 2.0, January 2004
3
+ http://www.apache.org/licenses/
4
+
5
+ Copyright 2026 Milo Nguyen and Orqenix contributors
6
+
7
+ Licensed under the Apache License, Version 2.0 (the "License");
8
+ you may not use this file except in compliance with the License.
9
+ You may obtain a copy of the License at
10
+
11
+ http://www.apache.org/licenses/LICENSE-2.0
12
+
13
+ Unless required by applicable law or agreed to in writing, software
14
+ distributed under the License is distributed on an "AS IS" BASIS,
15
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16
+ See the License for the specific language governing permissions and
17
+ limitations under the License.
18
+
19
+ [Full Apache 2.0 text: include verbatim from https://www.apache.org/licenses/LICENSE-2.0.txt]
@@ -0,0 +1,44 @@
1
+ import { MeshLogger } from './logger.js';
2
+ import { MeshMetrics } from './metrics.js';
3
+ import type { MeshRequest, MeshResponse, ScopeId } from '@orqenix/mesh-transport-core';
4
+ export interface ObservabilityHooks {
5
+ logger: MeshLogger;
6
+ metrics: MeshMetrics;
7
+ }
8
+ export interface CommonCtx {
9
+ scopeId: ScopeId;
10
+ transport: string;
11
+ peerId?: string;
12
+ }
13
+ export declare function onTransportStart(h: ObservabilityHooks, ctx: CommonCtx): void;
14
+ export declare function onTransportStop(h: ObservabilityHooks, ctx: CommonCtx): void;
15
+ export declare function onPeerConnect(h: ObservabilityHooks, ctx: CommonCtx & {
16
+ peerCount: number;
17
+ }): void;
18
+ export declare function onPeerDisconnect(h: ObservabilityHooks, ctx: CommonCtx & {
19
+ peerCount: number;
20
+ }): void;
21
+ export declare function onRpcIn(h: ObservabilityHooks, ctx: CommonCtx, req: MeshRequest): void;
22
+ export declare function onRpcOut(h: ObservabilityHooks, ctx: CommonCtx, req: MeshRequest, resp: MeshResponse, durationMs: number): void;
23
+ export declare function onRpcDenied(h: ObservabilityHooks, ctx: CommonCtx, req: Pick<MeshRequest, 'id' | 'method'>, errorCode: string): void;
24
+ export declare function onDiscoveryFound(h: ObservabilityHooks, ctx: CommonCtx): void;
25
+ export declare function onDiscoveryLost(h: ObservabilityHooks, ctx: CommonCtx): void;
26
+ export declare function onFailover(h: ObservabilityHooks, ctx: {
27
+ scopeId: ScopeId;
28
+ from: string;
29
+ to: string;
30
+ }): void;
31
+ export declare function onCircuitOpen(h: ObservabilityHooks, ctx: {
32
+ scopeId: ScopeId;
33
+ transport: string;
34
+ }): void;
35
+ export declare function onCircuitHalfOpen(h: ObservabilityHooks, ctx: {
36
+ scopeId: ScopeId;
37
+ transport: string;
38
+ }): void;
39
+ export declare function onCircuitClose(h: ObservabilityHooks, ctx: {
40
+ scopeId: ScopeId;
41
+ transport: string;
42
+ }): void;
43
+ export declare function rpcTraceId(req: MeshRequest): string | undefined;
44
+ //# sourceMappingURL=adapters.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adapters.d.ts","sourceRoot":"","sources":["../src/adapters.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAgB,WAAW,EAAE,MAAM,cAAc,CAAC;AAGzD,OAAO,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,8BAA8B,CAAC;AAEvF,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,UAAU,CAAC;IACnB,OAAO,EAAE,WAAW,CAAC;CACtB;AAED,MAAM,WAAW,SAAS;IACxB,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,kBAAkB,EAAE,GAAG,EAAE,SAAS,GAAG,IAAI,CAE5E;AACD,wBAAgB,eAAe,CAAC,CAAC,EAAE,kBAAkB,EAAE,GAAG,EAAE,SAAS,GAAG,IAAI,CAE3E;AAED,wBAAgB,aAAa,CAAC,CAAC,EAAE,kBAAkB,EAAE,GAAG,EAAE,SAAS,GAAG;IAAE,SAAS,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAGjG;AACD,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,kBAAkB,EAAE,GAAG,EAAE,SAAS,GAAG;IAAE,SAAS,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAGpG;AAED,wBAAgB,OAAO,CAAC,CAAC,EAAE,kBAAkB,EAAE,GAAG,EAAE,SAAS,EAAE,GAAG,EAAE,WAAW,GAAG,IAAI,CAUrF;AAED,wBAAgB,QAAQ,CACtB,CAAC,EAAE,kBAAkB,EACrB,GAAG,EAAE,SAAS,EACd,GAAG,EAAE,WAAW,EAChB,IAAI,EAAE,YAAY,EAClB,UAAU,EAAE,MAAM,GACjB,IAAI,CAgBN;AAED,wBAAgB,WAAW,CACzB,CAAC,EAAE,kBAAkB,EACrB,GAAG,EAAE,SAAS,EACd,GAAG,EAAE,IAAI,CAAC,WAAW,EAAE,IAAI,GAAG,QAAQ,CAAC,EACvC,SAAS,EAAE,MAAM,GAChB,IAAI,CAaN;AAED,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,kBAAkB,EAAE,GAAG,EAAE,SAAS,GAAG,IAAI,CAE5E;AACD,wBAAgB,eAAe,CAAC,CAAC,EAAE,kBAAkB,EAAE,GAAG,EAAE,SAAS,GAAG,IAAI,CAE3E;AAED,wBAAgB,UAAU,CACxB,CAAC,EAAE,kBAAkB,EACrB,GAAG,EAAE;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAE,GAClD,IAAI,CAGN;AAED,wBAAgB,aAAa,CAAC,CAAC,EAAE,kBAAkB,EAAE,GAAG,EAAE;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAGvG;AACD,wBAAgB,iBAAiB,CAAC,CAAC,EAAE,kBAAkB,EAAE,GAAG,EAAE;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAG3G;AACD,wBAAgB,cAAc,CAAC,CAAC,EAAE,kBAAkB,EAAE,GAAG,EAAE;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAGxG;AAED,wBAAgB,UAAU,CAAC,GAAG,EAAE,WAAW,GAAG,MAAM,GAAG,SAAS,CAE/D"}
@@ -0,0 +1,85 @@
1
+ import { METRIC_NAMES } from './metrics.js';
2
+ import { summarizePayload } from './redaction.js';
3
+ import { traceIdOf } from './trace.js';
4
+ export function onTransportStart(h, ctx) {
5
+ h.logger.emit({ level: 'info', event: 'transport.start', ...ctx });
6
+ }
7
+ export function onTransportStop(h, ctx) {
8
+ h.logger.emit({ level: 'info', event: 'transport.stop', ...ctx });
9
+ }
10
+ export function onPeerConnect(h, ctx) {
11
+ h.logger.emit({ level: 'info', event: 'peer.connect', scopeId: ctx.scopeId, transport: ctx.transport, peerId: ctx.peerId });
12
+ h.metrics.setGauge(METRIC_NAMES.PEERS, ctx.peerCount, { transport: ctx.transport });
13
+ }
14
+ export function onPeerDisconnect(h, ctx) {
15
+ h.logger.emit({ level: 'info', event: 'peer.disconnect', scopeId: ctx.scopeId, transport: ctx.transport, peerId: ctx.peerId });
16
+ h.metrics.setGauge(METRIC_NAMES.PEERS, ctx.peerCount, { transport: ctx.transport });
17
+ }
18
+ export function onRpcIn(h, ctx, req) {
19
+ h.logger.emit({
20
+ level: 'info',
21
+ event: 'rpc.in',
22
+ scopeId: ctx.scopeId,
23
+ transport: ctx.transport,
24
+ peerId: ctx.peerId,
25
+ requestId: req.id,
26
+ method: req.method,
27
+ });
28
+ }
29
+ export function onRpcOut(h, ctx, req, resp, durationMs) {
30
+ h.logger.emit({
31
+ level: 'info',
32
+ event: 'rpc.out',
33
+ scopeId: ctx.scopeId,
34
+ transport: ctx.transport,
35
+ peerId: ctx.peerId,
36
+ requestId: req.id,
37
+ method: req.method,
38
+ durationMs,
39
+ status: resp.status,
40
+ errorCode: resp.error?.code,
41
+ });
42
+ h.metrics.incCounter(METRIC_NAMES.RPC_TOTAL, 1, { transport: ctx.transport, status: resp.status });
43
+ h.metrics.observeHistogram(METRIC_NAMES.RPC_DURATION_MS, durationMs, { transport: ctx.transport });
44
+ void summarizePayload(resp.payload);
45
+ }
46
+ export function onRpcDenied(h, ctx, req, errorCode) {
47
+ h.logger.emit({
48
+ level: 'warn',
49
+ event: 'rpc.denied',
50
+ scopeId: ctx.scopeId,
51
+ transport: ctx.transport,
52
+ peerId: ctx.peerId,
53
+ requestId: req.id,
54
+ method: req.method,
55
+ status: 'denied',
56
+ errorCode,
57
+ });
58
+ h.metrics.incCounter(METRIC_NAMES.RPC_TOTAL, 1, { transport: ctx.transport, status: 'denied' });
59
+ }
60
+ export function onDiscoveryFound(h, ctx) {
61
+ h.logger.emit({ level: 'info', event: 'discovery.found', scopeId: ctx.scopeId, transport: ctx.transport, peerId: ctx.peerId });
62
+ }
63
+ export function onDiscoveryLost(h, ctx) {
64
+ h.logger.emit({ level: 'info', event: 'discovery.lost', scopeId: ctx.scopeId, transport: ctx.transport, peerId: ctx.peerId });
65
+ }
66
+ export function onFailover(h, ctx) {
67
+ h.logger.emit({ level: 'warn', event: 'failover', scopeId: ctx.scopeId, transport: ctx.from });
68
+ h.metrics.incCounter(METRIC_NAMES.FAILOVER_TOTAL, 1, { from: ctx.from, to: ctx.to });
69
+ }
70
+ export function onCircuitOpen(h, ctx) {
71
+ h.logger.emit({ level: 'warn', event: 'circuit.open', scopeId: ctx.scopeId, transport: ctx.transport });
72
+ h.metrics.setGauge(METRIC_NAMES.CIRCUIT_STATE, 2, { transport: ctx.transport });
73
+ }
74
+ export function onCircuitHalfOpen(h, ctx) {
75
+ h.logger.emit({ level: 'info', event: 'circuit.halfopen', scopeId: ctx.scopeId, transport: ctx.transport });
76
+ h.metrics.setGauge(METRIC_NAMES.CIRCUIT_STATE, 1, { transport: ctx.transport });
77
+ }
78
+ export function onCircuitClose(h, ctx) {
79
+ h.logger.emit({ level: 'info', event: 'circuit.close', scopeId: ctx.scopeId, transport: ctx.transport });
80
+ h.metrics.setGauge(METRIC_NAMES.CIRCUIT_STATE, 0, { transport: ctx.transport });
81
+ }
82
+ export function rpcTraceId(req) {
83
+ return traceIdOf(req.trace.traceparent);
84
+ }
85
+ //# sourceMappingURL=adapters.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adapters.js","sourceRoot":"","sources":["../src/adapters.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ export * from './schema.js';
2
+ export * from './redaction.js';
3
+ export * from './logger.js';
4
+ export * from './metrics.js';
5
+ export * from './trace.js';
6
+ export * from './adapters.js';
7
+ //# 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,gBAAgB,CAAC;AAC/B,cAAc,aAAa,CAAC;AAC5B,cAAc,cAAc,CAAC;AAC7B,cAAc,YAAY,CAAC;AAC3B,cAAc,eAAe,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,7 @@
1
+ export * from './schema.js';
2
+ export * from './redaction.js';
3
+ export * from './logger.js';
4
+ export * from './metrics.js';
5
+ export * from './trace.js';
6
+ export * from './adapters.js';
7
+ //# 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,gBAAgB,CAAC;AAC/B,cAAc,aAAa,CAAC;AAC5B,cAAc,cAAc,CAAC;AAC7B,cAAc,YAAY,CAAC;AAC3B,cAAc,eAAe,CAAC"}
@@ -0,0 +1,46 @@
1
+ import { type MeshLogEvent, type MeshLogLevel, type MeshStatus } from './schema.js';
2
+ import type { ScopeId } from '@orqenix/mesh-transport-core';
3
+ export type LogSink = (event: MeshLogEvent, serialized: string) => void;
4
+ export interface MeshLoggerOptions {
5
+ sink?: LogSink;
6
+ level?: MeshLogLevel;
7
+ now?: () => Date;
8
+ strict?: boolean;
9
+ }
10
+ export declare class MeshLogger {
11
+ private readonly sink;
12
+ private readonly level;
13
+ private readonly now;
14
+ private readonly strict;
15
+ constructor(opts?: MeshLoggerOptions);
16
+ emit(partial: Omit<MeshLogEvent, 'ts'> & {
17
+ ts?: string;
18
+ }): void;
19
+ rpcIn(args: {
20
+ scopeId: ScopeId;
21
+ transport: string;
22
+ requestId: string;
23
+ method: string;
24
+ }): void;
25
+ rpcOut(args: {
26
+ scopeId: ScopeId;
27
+ transport: string;
28
+ requestId: string;
29
+ method: string;
30
+ durationMs: number;
31
+ status: MeshStatus;
32
+ }): void;
33
+ rpcDenied(args: {
34
+ scopeId: ScopeId;
35
+ transport: string;
36
+ requestId: string;
37
+ method?: string;
38
+ errorCode: string;
39
+ }): void;
40
+ }
41
+ export declare function bufferSink(): {
42
+ events: MeshLogEvent[];
43
+ lines: string[];
44
+ sink: LogSink;
45
+ };
46
+ //# sourceMappingURL=logger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":"AAAA,OAAO,EAA0D,KAAK,YAAY,EAAE,KAAK,YAAY,EAAE,KAAK,UAAU,EAAE,MAAM,aAAa,CAAC;AAE5I,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,8BAA8B,CAAC;AAE5D,MAAM,MAAM,OAAO,GAAG,CAAC,KAAK,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,KAAK,IAAI,CAAC;AAExE,MAAM,WAAW,iBAAiB;IAChC,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,KAAK,CAAC,EAAE,YAAY,CAAC;IACrB,GAAG,CAAC,EAAE,MAAM,IAAI,CAAC;IACjB,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAID,qBAAa,UAAU;IACrB,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAU;IAC/B,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAe;IACrC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAa;IACjC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAU;gBAErB,IAAI,GAAE,iBAAsB;IAOxC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,YAAY,EAAE,IAAI,CAAC,GAAG;QAAE,EAAE,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI;IAwC/D,KAAK,CAAC,IAAI,EAAE;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI;IAG7F,MAAM,CAAC,IAAI,EAAE;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,UAAU,CAAA;KAAE,GAAG,IAAI;IAGtI,SAAS,CAAC,IAAI,EAAE;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI;CAGtH;AAMD,wBAAgB,UAAU,IAAI;IAAE,MAAM,EAAE,YAAY,EAAE,CAAC;IAAC,KAAK,EAAE,MAAM,EAAE,CAAC;IAAC,IAAI,EAAE,OAAO,CAAA;CAAE,CAOvF"}
package/dist/logger.js ADDED
@@ -0,0 +1,75 @@
1
+ import { validateLogEvent } from './schema.js';
2
+ import { containsLeak } from './redaction.js';
3
+ const LEVEL_RANK = { debug: 0, info: 1, warn: 2, error: 3 };
4
+ export class MeshLogger {
5
+ sink;
6
+ level;
7
+ now;
8
+ strict;
9
+ constructor(opts = {}) {
10
+ this.sink = opts.sink ?? defaultSink;
11
+ this.level = opts.level ?? 'info';
12
+ this.now = opts.now ?? (() => new Date());
13
+ this.strict = opts.strict ?? false;
14
+ }
15
+ emit(partial) {
16
+ if (LEVEL_RANK[partial.level] < LEVEL_RANK[this.level])
17
+ return;
18
+ const event = {
19
+ ...partial,
20
+ ts: partial.ts ?? this.now().toISOString(),
21
+ };
22
+ const errs = validateLogEvent(event);
23
+ if (errs) {
24
+ if (this.strict)
25
+ throw new Error(`MeshLogger schema violation: ${errs.join('; ')}`);
26
+ return;
27
+ }
28
+ let serialized;
29
+ try {
30
+ serialized = JSON.stringify(event);
31
+ }
32
+ catch {
33
+ return;
34
+ }
35
+ if (containsLeak(serialized)) {
36
+ try {
37
+ this.sink({
38
+ ts: this.now().toISOString(),
39
+ level: 'warn',
40
+ event: 'rpc.denied',
41
+ scopeId: event.scopeId,
42
+ transport: event.transport,
43
+ errorCode: 'E_LOG_REDACTION',
44
+ }, '{"event":"rpc.denied","errorCode":"E_LOG_REDACTION"}');
45
+ }
46
+ catch { /* ignore */ }
47
+ return;
48
+ }
49
+ try {
50
+ this.sink(event, serialized);
51
+ }
52
+ catch { /* ignore */ }
53
+ }
54
+ rpcIn(args) {
55
+ this.emit({ level: 'info', event: 'rpc.in', ...args });
56
+ }
57
+ rpcOut(args) {
58
+ this.emit({ level: 'info', event: 'rpc.out', ...args });
59
+ }
60
+ rpcDenied(args) {
61
+ this.emit({ level: 'warn', event: 'rpc.denied', status: 'denied', ...args });
62
+ }
63
+ }
64
+ function defaultSink(_evt, serialized) {
65
+ console.log(serialized);
66
+ }
67
+ export function bufferSink() {
68
+ const events = [];
69
+ const lines = [];
70
+ return {
71
+ events, lines,
72
+ sink: (e, s) => { events.push(e); lines.push(s); },
73
+ };
74
+ }
75
+ //# sourceMappingURL=logger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.js","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,50 @@
1
+ export type MetricKind = 'counter' | 'gauge' | 'histogram';
2
+ export declare const METRIC_NAMES: {
3
+ readonly RPC_TOTAL: "orqenix_mesh_rpc_total";
4
+ readonly RPC_DURATION_MS: "orqenix_mesh_rpc_duration_ms";
5
+ readonly PEERS: "orqenix_mesh_peers";
6
+ readonly CAPABILITY_VERIFY_MS: "orqenix_mesh_capability_verify_ms";
7
+ readonly FAILOVER_TOTAL: "orqenix_mesh_failover_total";
8
+ readonly CIRCUIT_STATE: "orqenix_mesh_circuit_state";
9
+ };
10
+ export interface HistogramSummary {
11
+ count: number;
12
+ p50: number;
13
+ p95: number;
14
+ p99: number;
15
+ max: number;
16
+ }
17
+ export interface MetricSnapshot {
18
+ counters: Array<{
19
+ name: string;
20
+ labels: string;
21
+ value: number;
22
+ }>;
23
+ gauges: Array<{
24
+ name: string;
25
+ labels: string;
26
+ value: number;
27
+ }>;
28
+ histograms: Array<{
29
+ name: string;
30
+ labels: string;
31
+ summary: HistogramSummary;
32
+ }>;
33
+ }
34
+ export interface MeshMetricsOptions {
35
+ histogramCapacity?: number;
36
+ }
37
+ export declare class MeshMetrics {
38
+ private readonly metrics;
39
+ private readonly histogramCapacity;
40
+ constructor(opts?: MeshMetricsOptions);
41
+ incCounter(name: string, by: number, labels?: Record<string, string>): void;
42
+ setGauge(name: string, value: number, labels?: Record<string, string>): void;
43
+ observeHistogram(name: string, sample: number, labels?: Record<string, string>): void;
44
+ snapshot(): MetricSnapshot;
45
+ registeredNames(): string[];
46
+ private ensureCounter;
47
+ private ensureGauge;
48
+ private ensureHistogram;
49
+ }
50
+ //# sourceMappingURL=metrics.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"metrics.d.ts","sourceRoot":"","sources":["../src/metrics.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,UAAU,GAAG,SAAS,GAAG,OAAO,GAAG,WAAW,CAAC;AA2B3D,eAAO,MAAM,YAAY;;;;;;;CAOf,CAAC;AAEX,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;CACb;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACjE,MAAM,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC/D,UAAU,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,gBAAgB,CAAA;KAAE,CAAC,CAAC;CAChF;AAED,MAAM,WAAW,kBAAkB;IACjC,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED,qBAAa,WAAW;IACtB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA6B;IACrD,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAS;gBAE/B,IAAI,GAAE,kBAAuB;IAUzC,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI;IAM3E,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI;IAK5E,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI;IAYrF,QAAQ,IAAI,cAAc;IAiB1B,eAAe,IAAI,MAAM,EAAE;IAI3B,OAAO,CAAC,aAAa;IASrB,OAAO,CAAC,WAAW;IASnB,OAAO,CAAC,eAAe;CASxB"}
@@ -0,0 +1,109 @@
1
+ function labelKey(labels) {
2
+ if (!labels)
3
+ return '';
4
+ const keys = Object.keys(labels).sort();
5
+ return keys.map((k) => `${k}=${labels[k]}`).join(',');
6
+ }
7
+ export const METRIC_NAMES = {
8
+ RPC_TOTAL: 'orqenix_mesh_rpc_total',
9
+ RPC_DURATION_MS: 'orqenix_mesh_rpc_duration_ms',
10
+ PEERS: 'orqenix_mesh_peers',
11
+ CAPABILITY_VERIFY_MS: 'orqenix_mesh_capability_verify_ms',
12
+ FAILOVER_TOTAL: 'orqenix_mesh_failover_total',
13
+ CIRCUIT_STATE: 'orqenix_mesh_circuit_state',
14
+ };
15
+ export class MeshMetrics {
16
+ metrics = new Map();
17
+ histogramCapacity;
18
+ constructor(opts = {}) {
19
+ this.histogramCapacity = opts.histogramCapacity ?? 1024;
20
+ this.ensureCounter(METRIC_NAMES.RPC_TOTAL);
21
+ this.ensureHistogram(METRIC_NAMES.RPC_DURATION_MS);
22
+ this.ensureGauge(METRIC_NAMES.PEERS);
23
+ this.ensureHistogram(METRIC_NAMES.CAPABILITY_VERIFY_MS);
24
+ this.ensureCounter(METRIC_NAMES.FAILOVER_TOTAL);
25
+ this.ensureGauge(METRIC_NAMES.CIRCUIT_STATE);
26
+ }
27
+ incCounter(name, by, labels) {
28
+ const m = this.ensureCounter(name);
29
+ const k = labelKey(labels);
30
+ m.values.set(k, (m.values.get(k) ?? 0) + by);
31
+ }
32
+ setGauge(name, value, labels) {
33
+ const m = this.ensureGauge(name);
34
+ m.values.set(labelKey(labels), value);
35
+ }
36
+ observeHistogram(name, sample, labels) {
37
+ const m = this.ensureHistogram(name);
38
+ const k = labelKey(labels);
39
+ let buf = m.ring.get(k);
40
+ if (!buf) {
41
+ buf = [];
42
+ m.ring.set(k, buf);
43
+ }
44
+ buf.push(sample);
45
+ if (buf.length > m.capacity)
46
+ buf.shift();
47
+ }
48
+ snapshot() {
49
+ const counters = [];
50
+ const gauges = [];
51
+ const histograms = [];
52
+ for (const m of this.metrics.values()) {
53
+ if (m.kind === 'counter') {
54
+ for (const [labels, value] of m.values)
55
+ counters.push({ name: m.name, labels, value });
56
+ }
57
+ else if (m.kind === 'gauge') {
58
+ for (const [labels, value] of m.values)
59
+ gauges.push({ name: m.name, labels, value });
60
+ }
61
+ else {
62
+ for (const [labels, buf] of m.ring)
63
+ histograms.push({ name: m.name, labels, summary: summarize(buf) });
64
+ }
65
+ }
66
+ return { counters, gauges, histograms };
67
+ }
68
+ registeredNames() {
69
+ return [...this.metrics.keys()].sort();
70
+ }
71
+ ensureCounter(name) {
72
+ let m = this.metrics.get(name);
73
+ if (!m) {
74
+ m = { kind: 'counter', name, values: new Map() };
75
+ this.metrics.set(name, m);
76
+ }
77
+ if (m.kind !== 'counter')
78
+ throw new Error(`metric ${name} already registered with kind ${m.kind}`);
79
+ return m;
80
+ }
81
+ ensureGauge(name) {
82
+ let m = this.metrics.get(name);
83
+ if (!m) {
84
+ m = { kind: 'gauge', name, values: new Map() };
85
+ this.metrics.set(name, m);
86
+ }
87
+ if (m.kind !== 'gauge')
88
+ throw new Error(`metric ${name} already registered with kind ${m.kind}`);
89
+ return m;
90
+ }
91
+ ensureHistogram(name) {
92
+ let m = this.metrics.get(name);
93
+ if (!m) {
94
+ m = { kind: 'histogram', name, ring: new Map(), capacity: this.histogramCapacity };
95
+ this.metrics.set(name, m);
96
+ }
97
+ if (m.kind !== 'histogram')
98
+ throw new Error(`metric ${name} already registered with kind ${m.kind}`);
99
+ return m;
100
+ }
101
+ }
102
+ function summarize(samples) {
103
+ if (samples.length === 0)
104
+ return { count: 0, p50: 0, p95: 0, p99: 0, max: 0 };
105
+ const sorted = samples.slice().sort((a, b) => a - b);
106
+ const at = (q) => sorted[Math.min(sorted.length - 1, Math.floor(sorted.length * q))];
107
+ return { count: sorted.length, p50: at(0.5), p95: at(0.95), p99: at(0.99), max: sorted[sorted.length - 1] };
108
+ }
109
+ //# sourceMappingURL=metrics.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"metrics.js","sourceRoot":"","sources":["../src/metrics.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ import type { MeshRequest } from '@orqenix/mesh-transport-core';
2
+ export interface PayloadSummary {
3
+ payloadSize: number;
4
+ payloadHash: string;
5
+ }
6
+ export interface CapabilitySummary {
7
+ jti?: string;
8
+ }
9
+ export declare function summarizePayload(bytes: Uint8Array | undefined): PayloadSummary | undefined;
10
+ export declare function summarizeCapability(_token: unknown): CapabilitySummary | undefined;
11
+ export declare function summarizeRequest(req: Pick<MeshRequest, 'id' | 'method' | 'payload'>): {
12
+ requestId: string;
13
+ method: string;
14
+ payload?: PayloadSummary;
15
+ };
16
+ export declare function redact(input: unknown, depth?: number): unknown;
17
+ export declare function containsLeak(serialized: string): boolean;
18
+ //# sourceMappingURL=redaction.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"redaction.d.ts","sourceRoot":"","sources":["../src/redaction.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAC;AAEhE,MAAM,WAAW,cAAc;IAC7B,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,iBAAiB;IAChC,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAQD,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,UAAU,GAAG,SAAS,GAAG,cAAc,GAAG,SAAS,CAO1F;AAED,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,OAAO,GAAG,iBAAiB,GAAG,SAAS,CAElF;AAED,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,IAAI,CAAC,WAAW,EAAE,IAAI,GAAG,QAAQ,GAAG,SAAS,CAAC,GAAG;IACrF,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,cAAc,CAAC;CAC1B,CAMA;AAED,wBAAgB,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,KAAK,SAAI,GAAG,OAAO,CAiBzD;AAED,wBAAgB,YAAY,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAQxD"}
@@ -0,0 +1,57 @@
1
+ import { hash as blake3Hash } from 'blake3-wasm';
2
+ const FORBIDDEN_FIELD_NAMES = new Set([
3
+ 'capability', 'cap', 'token', 'signature', 'sig', 'secret',
4
+ 'privateKey', 'private_key', 'seed', 'scopeSeed',
5
+ 'payload', 'payloadBytes',
6
+ ]);
7
+ export function summarizePayload(bytes) {
8
+ if (!bytes)
9
+ return undefined;
10
+ const digest = blake3Hash(bytes);
11
+ return {
12
+ payloadSize: bytes.length,
13
+ payloadHash: Buffer.from(digest).toString('hex'),
14
+ };
15
+ }
16
+ export function summarizeCapability(_token) {
17
+ return { jti: undefined };
18
+ }
19
+ export function summarizeRequest(req) {
20
+ return {
21
+ requestId: req.id,
22
+ method: req.method,
23
+ payload: summarizePayload(req.payload),
24
+ };
25
+ }
26
+ export function redact(input, depth = 0) {
27
+ if (depth > 4)
28
+ return '[depth-limited]';
29
+ if (input == null)
30
+ return input;
31
+ if (input instanceof Uint8Array)
32
+ return summarizePayload(input);
33
+ if (Array.isArray(input))
34
+ return input.map((v) => redact(v, depth + 1));
35
+ if (typeof input === 'object') {
36
+ const out = {};
37
+ for (const [k, v] of Object.entries(input)) {
38
+ if (FORBIDDEN_FIELD_NAMES.has(k)) {
39
+ out[k] = '[redacted]';
40
+ continue;
41
+ }
42
+ out[k] = redact(v, depth + 1);
43
+ }
44
+ return out;
45
+ }
46
+ return input;
47
+ }
48
+ export function containsLeak(serialized) {
49
+ if (/"(capability|token|sig|signature|secret|privateKey|seed)"\s*:\s*"(?!\[redacted\])/.test(serialized)) {
50
+ return true;
51
+ }
52
+ if (/"[A-Za-z0-9_-]{120,}"/.test(serialized)) {
53
+ return true;
54
+ }
55
+ return false;
56
+ }
57
+ //# sourceMappingURL=redaction.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"redaction.js","sourceRoot":"","sources":["../src/redaction.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,IAAI,UAAU,EAAE,MAAM,aAAa,CAAC;AAYjD,MAAM,qBAAqB,GAAG,IAAI,GAAG,CAAC;IACpC,YAAY,EAAE,KAAK,EAAE,OAAO,EAAE,WAAW,EAAE,KAAK,EAAE,QAAQ;IAC1D,YAAY,EAAE,aAAa,EAAE,MAAM,EAAE,WAAW;IAChD,SAAS,EAAE,cAAc;CAC1B,CAAC,CAAC;AAEH,MAAM,UAAU,gBAAgB,CAAC,KAA6B;IAC5D,IAAI,CAAC,KAAK;QAAE,OAAO,SAAS,CAAC;IAC7B,MAAM,MAAM,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC;IACjC,OAAO;QACL,WAAW,EAAE,KAAK,CAAC,MAAM;QACzB,WAAW,EAAE,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC;KACjD,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,MAAe;IACjD,OAAO,EAAE,GAAG,EAAE,SAAS,EAAE,CAAC;AAC5B,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,GAAmD;IAKlF,OAAO;QACL,SAAS,EAAE,GAAG,CAAC,EAAE;QACjB,MAAM,EAAE,GAAG,CAAC,MAAM;QAClB,OAAO,EAAE,gBAAgB,CAAC,GAAG,CAAC,OAAO,CAAC;KACvC,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,MAAM,CAAC,KAAc,EAAE,KAAK,GAAG,CAAC;IAC9C,IAAI,KAAK,GAAG,CAAC;QAAE,OAAO,iBAAiB,CAAC;IACxC,IAAI,KAAK,IAAI,IAAI;QAAE,OAAO,KAAK,CAAC;IAChC,IAAI,KAAK,YAAY,UAAU;QAAE,OAAO,gBAAgB,CAAC,KAAK,CAAC,CAAC;IAChE,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC;IACxE,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,MAAM,GAAG,GAA4B,EAAE,CAAC;QACxC,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAgC,CAAC,EAAE,CAAC;YACtE,IAAI,qBAAqB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;gBACjC,GAAG,CAAC,CAAC,CAAC,GAAG,YAAY,CAAC;gBACtB,SAAS;YACX,CAAC;YACD,GAAG,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC;QAChC,CAAC;QACD,OAAO,GAAG,CAAC;IACb,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,UAAkB;IAC7C,IAAI,mFAAmF,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC;QACzG,OAAO,IAAI,CAAC;IACd,CAAC;IACD,IAAI,uBAAuB,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC;QAC7C,OAAO,IAAI,CAAC;IACd,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC"}
@@ -0,0 +1,20 @@
1
+ import type { ScopeId } from '@orqenix/mesh-transport-core';
2
+ export type MeshLogLevel = 'debug' | 'info' | 'warn' | 'error';
3
+ export type MeshEventName = 'transport.start' | 'transport.stop' | 'peer.connect' | 'peer.disconnect' | 'rpc.in' | 'rpc.out' | 'rpc.denied' | 'discovery.found' | 'discovery.lost' | 'failover' | 'circuit.open' | 'circuit.halfopen' | 'circuit.close';
4
+ export type MeshStatus = 'ok' | 'denied' | 'error' | 'timeout';
5
+ export declare const CANONICAL_EVENTS: ReadonlySet<MeshEventName>;
6
+ export interface MeshLogEvent {
7
+ ts: string;
8
+ level: MeshLogLevel;
9
+ event: MeshEventName;
10
+ scopeId: ScopeId;
11
+ peerId?: string;
12
+ requestId?: string;
13
+ transport: 'http' | 'libp2p' | 'loopback' | string;
14
+ method?: string;
15
+ durationMs?: number;
16
+ status?: MeshStatus;
17
+ errorCode?: string;
18
+ }
19
+ export declare function validateLogEvent(value: unknown): string[] | null;
20
+ //# sourceMappingURL=schema.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../src/schema.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,8BAA8B,CAAC;AAE5D,MAAM,MAAM,YAAY,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;AAE/D,MAAM,MAAM,aAAa,GACrB,iBAAiB,GACjB,gBAAgB,GAChB,cAAc,GACd,iBAAiB,GACjB,QAAQ,GACR,SAAS,GACT,YAAY,GACZ,iBAAiB,GACjB,gBAAgB,GAChB,UAAU,GACV,cAAc,GACd,kBAAkB,GAClB,eAAe,CAAC;AAEpB,MAAM,MAAM,UAAU,GAAG,IAAI,GAAG,QAAQ,GAAG,OAAO,GAAG,SAAS,CAAC;AAE/D,eAAO,MAAM,gBAAgB,EAAE,WAAW,CAAC,aAAa,CActD,CAAC;AAEH,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,YAAY,CAAC;IACpB,KAAK,EAAE,aAAa,CAAC;IACrB,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,GAAG,QAAQ,GAAG,UAAU,GAAG,MAAM,CAAC;IACnD,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,UAAU,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,EAAE,GAAG,IAAI,CA0ChE"}
package/dist/schema.js ADDED
@@ -0,0 +1,62 @@
1
+ export const CANONICAL_EVENTS = new Set([
2
+ 'transport.start',
3
+ 'transport.stop',
4
+ 'peer.connect',
5
+ 'peer.disconnect',
6
+ 'rpc.in',
7
+ 'rpc.out',
8
+ 'rpc.denied',
9
+ 'discovery.found',
10
+ 'discovery.lost',
11
+ 'failover',
12
+ 'circuit.open',
13
+ 'circuit.halfopen',
14
+ 'circuit.close',
15
+ ]);
16
+ export function validateLogEvent(value) {
17
+ const errs = [];
18
+ if (!value || typeof value !== 'object') {
19
+ return ['event is not an object'];
20
+ }
21
+ const v = value;
22
+ const allowed = new Set([
23
+ 'ts', 'level', 'event', 'scopeId', 'peerId', 'requestId',
24
+ 'transport', 'method', 'durationMs', 'status', 'errorCode',
25
+ ]);
26
+ for (const k of Object.keys(v)) {
27
+ if (!allowed.has(k))
28
+ errs.push(`unknown field: ${k}`);
29
+ }
30
+ if (typeof v.ts !== 'string' || !/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}\.\d{3}Z$/.test(v.ts)) {
31
+ errs.push('ts must be ISO-8601 with ms precision and Z suffix');
32
+ }
33
+ if (!['debug', 'info', 'warn', 'error'].includes(v.level)) {
34
+ errs.push('level must be one of debug|info|warn|error');
35
+ }
36
+ if (typeof v.event !== 'string' || !CANONICAL_EVENTS.has(v.event)) {
37
+ errs.push('event must be one of the canonical event names');
38
+ }
39
+ if (typeof v.scopeId !== 'string' || v.scopeId.length === 0) {
40
+ errs.push('scopeId required');
41
+ }
42
+ if (typeof v.transport !== 'string' || v.transport.length === 0) {
43
+ errs.push('transport required');
44
+ }
45
+ if (v.peerId !== undefined && typeof v.peerId !== 'string')
46
+ errs.push('peerId must be string when present');
47
+ if (v.requestId !== undefined && typeof v.requestId !== 'string')
48
+ errs.push('requestId must be string when present');
49
+ if (v.method !== undefined && typeof v.method !== 'string')
50
+ errs.push('method must be string when present');
51
+ if (v.durationMs !== undefined && (typeof v.durationMs !== 'number' || v.durationMs < 0)) {
52
+ errs.push('durationMs must be a non-negative number when present');
53
+ }
54
+ if (v.status !== undefined && !['ok', 'denied', 'error', 'timeout'].includes(v.status)) {
55
+ errs.push('status must be one of ok|denied|error|timeout when present');
56
+ }
57
+ if (v.errorCode !== undefined && typeof v.errorCode !== 'string') {
58
+ errs.push('errorCode must be string when present');
59
+ }
60
+ return errs.length === 0 ? null : errs;
61
+ }
62
+ //# sourceMappingURL=schema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.js","sourceRoot":"","sources":["../src/schema.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ import type { TraceContext } from '@orqenix/mesh-transport-core';
2
+ export interface ParsedTraceparent {
3
+ version: '00';
4
+ traceId: string;
5
+ spanId: string;
6
+ flags: string;
7
+ }
8
+ export declare function parseTraceparent(tp: string): ParsedTraceparent | null;
9
+ export declare function validateTraceparent(tp: string): boolean;
10
+ export declare function formatTraceparent(p: ParsedTraceparent): string;
11
+ export declare function newTraceparent(): string;
12
+ export declare function deriveChildSpan(parent: string): string;
13
+ export declare function buildOutgoingTraceContext(parent?: string): TraceContext;
14
+ export declare function traceIdOf(traceparent: string): string | undefined;
15
+ //# sourceMappingURL=trace.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"trace.d.ts","sourceRoot":"","sources":["../src/trace.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAIjE,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,IAAI,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;CACf;AAED,wBAAgB,gBAAgB,CAAC,EAAE,EAAE,MAAM,GAAG,iBAAiB,GAAG,IAAI,CAIrE;AAED,wBAAgB,mBAAmB,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAEvD;AAED,wBAAgB,iBAAiB,CAAC,CAAC,EAAE,iBAAiB,GAAG,MAAM,CAE9D;AAQD,wBAAgB,cAAc,IAAI,MAAM,CAEvC;AAED,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAItD;AAED,wBAAgB,yBAAyB,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,YAAY,CAGvE;AAED,wBAAgB,SAAS,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAEjE"}
package/dist/trace.js ADDED
@@ -0,0 +1,36 @@
1
+ import { webcrypto } from 'node:crypto';
2
+ const TRACEPARENT_RE = /^00-([0-9a-f]{32})-([0-9a-f]{16})-([0-9a-f]{2})$/;
3
+ export function parseTraceparent(tp) {
4
+ const m = TRACEPARENT_RE.exec(tp);
5
+ if (!m)
6
+ return null;
7
+ return { version: '00', traceId: m[1], spanId: m[2], flags: m[3] };
8
+ }
9
+ export function validateTraceparent(tp) {
10
+ return parseTraceparent(tp) !== null;
11
+ }
12
+ export function formatTraceparent(p) {
13
+ return `00-${p.traceId}-${p.spanId}-${p.flags}`;
14
+ }
15
+ function randHex(bytes) {
16
+ const buf = new Uint8Array(bytes);
17
+ webcrypto.getRandomValues(buf);
18
+ return Buffer.from(buf).toString('hex');
19
+ }
20
+ export function newTraceparent() {
21
+ return formatTraceparent({ version: '00', traceId: randHex(16), spanId: randHex(8), flags: '01' });
22
+ }
23
+ export function deriveChildSpan(parent) {
24
+ const p = parseTraceparent(parent);
25
+ if (!p)
26
+ return newTraceparent();
27
+ return formatTraceparent({ ...p, spanId: randHex(8) });
28
+ }
29
+ export function buildOutgoingTraceContext(parent) {
30
+ const traceparent = parent ? deriveChildSpan(parent) : newTraceparent();
31
+ return { traceparent };
32
+ }
33
+ export function traceIdOf(traceparent) {
34
+ return parseTraceparent(traceparent)?.traceId;
35
+ }
36
+ //# sourceMappingURL=trace.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"trace.js","sourceRoot":"","sources":["../src/trace.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAGxC,MAAM,cAAc,GAAG,kDAAkD,CAAC;AAS1E,MAAM,UAAU,gBAAgB,CAAC,EAAU;IACzC,MAAM,CAAC,GAAG,cAAc,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAClC,IAAI,CAAC,CAAC;QAAE,OAAO,IAAI,CAAC;IACpB,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;AACrE,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,EAAU;IAC5C,OAAO,gBAAgB,CAAC,EAAE,CAAC,KAAK,IAAI,CAAC;AACvC,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,CAAoB;IACpD,OAAO,MAAM,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,KAAK,EAAE,CAAC;AAClD,CAAC;AAED,SAAS,OAAO,CAAC,KAAa;IAC5B,MAAM,GAAG,GAAG,IAAI,UAAU,CAAC,KAAK,CAAC,CAAC;IAClC,SAAS,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC;IAC/B,OAAO,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;AAC1C,CAAC;AAED,MAAM,UAAU,cAAc;IAC5B,OAAO,iBAAiB,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;AACrG,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,MAAc;IAC5C,MAAM,CAAC,GAAG,gBAAgB,CAAC,MAAM,CAAC,CAAC;IACnC,IAAI,CAAC,CAAC;QAAE,OAAO,cAAc,EAAE,CAAC;IAChC,OAAO,iBAAiB,CAAC,EAAE,GAAG,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;AACzD,CAAC;AAED,MAAM,UAAU,yBAAyB,CAAC,MAAe;IACvD,MAAM,WAAW,GAAG,MAAM,CAAC,CAAC,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,cAAc,EAAE,CAAC;IACxE,OAAO,EAAE,WAAW,EAAE,CAAC;AACzB,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,WAAmB;IAC3C,OAAO,gBAAgB,CAAC,WAAW,CAAC,EAAE,OAAO,CAAC;AAChD,CAAC"}
package/package.json ADDED
@@ -0,0 +1,45 @@
1
+ {
2
+ "name": "@orqenix/mesh-observability",
3
+ "version": "0.6.0-phase-6",
4
+ "description": "Structured logs, OpenTelemetry-compatible metrics, W3C traceparent propagation, and strict redaction for the Orqenix mesh.",
5
+ "type": "module",
6
+ "license": "Apache-2.0",
7
+ "main": "./dist/index.js",
8
+ "types": "./dist/index.d.ts",
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
+ "LICENSE",
20
+ "CHANGELOG.md"
21
+ ],
22
+ "dependencies": {
23
+ "blake3-wasm": "^2.0.0",
24
+ "@orqenix/mesh-transport-core": "0.6.0-phase-6"
25
+ },
26
+ "devDependencies": {
27
+ "@types/node": "^22.7.0",
28
+ "@vitest/coverage-v8": "^2.1.0",
29
+ "tsx": "^4.19.0",
30
+ "typescript": "^5.6.0",
31
+ "vitest": "^2.1.0"
32
+ },
33
+ "publishConfig": {
34
+ "access": "public",
35
+ "provenance": false
36
+ },
37
+ "engines": {
38
+ "node": ">=22.0.0"
39
+ },
40
+ "scripts": {
41
+ "build": "tsc -p tsconfig.json",
42
+ "test": "vitest run --coverage",
43
+ "gate:G42": "vitest run test/G42-gate-wrapper.test.ts --reporter verbose"
44
+ }
45
+ }