@nxtedition/trace
Advanced tools
| /** | ||
| * Lightweight trace-writer primitives shared by hot-path consumers. | ||
| * | ||
| * Keep this module free of RxJS and transport dependencies: scheduler, HTTP, | ||
| * cache and SMB all import it even when no trace is ever constructed. | ||
| */ | ||
| export interface TraceWriter { | ||
| write: ((obj: object, op: string) => void) | null; | ||
| } | ||
| export declare function installTrace(trace: TraceWriter | undefined): void; | ||
| export declare function getTrace(): TraceWriter | undefined; | ||
| export declare function getTraceCount(): number; | ||
| export declare function traceWrite(trace: TraceWriter | null | undefined): TraceWriter['write']; | ||
| export declare function validateTrace(trace: unknown): TraceWriter | null | undefined; | ||
| export declare function traceSafe(write: (obj: object, op: string) => void, obj: object, op: string): void; | ||
| /** Return a bounded, exception-safe, low-cardinality error tag. */ | ||
| export declare function traceErr(err: unknown): string; | ||
| export declare function genTracerId(): number; | ||
| //# sourceMappingURL=core.d.ts.map |
| {"version":3,"file":"core.d.ts","sourceRoot":"","sources":["../src/core.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,CAAC,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC,GAAG,IAAI,CAAA;CAClD;AAoBD,wBAAgB,YAAY,CAAC,KAAK,EAAE,WAAW,GAAG,SAAS,GAAG,IAAI,CAMjE;AAED,wBAAgB,QAAQ,IAAI,WAAW,GAAG,SAAS,CAElD;AAED,wBAAgB,aAAa,IAAI,MAAM,CAEtC;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE,WAAW,GAAG,IAAI,GAAG,SAAS,GAAG,WAAW,CAAC,OAAO,CAAC,CAStF;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,OAAO,GAAG,WAAW,GAAG,IAAI,GAAG,SAAS,CAkB5E;AAED,wBAAgB,SAAS,CAAC,KAAK,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,KAAK,IAAI,EAAE,GAAG,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,IAAI,CAMjG;AA4ED,mEAAmE;AACnE,wBAAgB,QAAQ,CAAC,GAAG,EAAE,OAAO,GAAG,MAAM,CAE7C;AAED,wBAAgB,WAAW,IAAI,MAAM,CAWpC"} |
+152
| /** | ||
| * Lightweight trace-writer primitives shared by hot-path consumers. | ||
| * | ||
| * Keep this module free of RxJS and transport dependencies: scheduler, HTTP, | ||
| * cache and SMB all import it even when no trace is ever constructed. | ||
| */ | ||
| const TraceSymbol = Symbol.for('@nxtedition/app/trace'); | ||
| const TraceCounterSymbol = Symbol.for('@nxtedition/app/traceCounter'); | ||
| const TracerIdSymbol = Symbol.for('@nxtedition/app/tracerId'); | ||
| const traceGlobals = globalThis; | ||
| // A module-local mirror keeps the per-operation default lookup to one variable | ||
| // read. The interval only synchronizes installs performed by another physical | ||
| // copy of this package in the same thread. | ||
| let globalTrace = traceGlobals[TraceSymbol]; | ||
| setInterval(() => { | ||
| globalTrace = traceGlobals[TraceSymbol]; | ||
| }, 1e3).unref(); | ||
| export function installTrace(trace) { | ||
| if (trace !== undefined) { | ||
| validateTrace(trace); | ||
| } | ||
| traceGlobals[TraceSymbol] = trace; | ||
| globalTrace = trace; | ||
| } | ||
| export function getTrace() { | ||
| return traceGlobals[TraceSymbol]; | ||
| } | ||
| export function getTraceCount() { | ||
| return traceGlobals[TraceCounterSymbol] ?? 0; | ||
| } | ||
| export function traceWrite(trace) { | ||
| try { | ||
| const writer = (trace === undefined ? globalTrace : trace)?.write; | ||
| return typeof writer === 'function' ? writer : null; | ||
| } | ||
| catch { | ||
| // A caller-mutable writer (or Proxy) must not turn tracing into a failure | ||
| // path before traceSafe gets a chance to contain the actual invocation. | ||
| return null; | ||
| } | ||
| } | ||
| export function validateTrace(trace) { | ||
| if (trace === undefined || trace === null) { | ||
| return trace; | ||
| } | ||
| try { | ||
| if ((typeof trace !== 'object' && typeof trace !== 'function') || !('write' in trace)) { | ||
| throw new Error('Invalid trace'); | ||
| } | ||
| const write = trace.write; | ||
| if (write !== null && typeof write !== 'function') { | ||
| throw new Error('Invalid trace'); | ||
| } | ||
| } | ||
| catch { | ||
| throw new Error('Invalid trace'); | ||
| } | ||
| return trace; | ||
| } | ||
| export function traceSafe(write, obj, op) { | ||
| try { | ||
| write(obj, op); | ||
| } | ||
| catch (err) { | ||
| process.emitWarning(err instanceof Error ? err : new Error(traceErr(err))); | ||
| } | ||
| } | ||
| const TRACE_ERR_LIMIT = 64; | ||
| function joinTraceErrors(errors, limit, active) { | ||
| if (active.has(errors)) { | ||
| return 'unknown'.slice(0, limit); | ||
| } | ||
| active.add(errors); | ||
| try { | ||
| let result = ''; | ||
| for (let i = 0; i < errors.length && result.length < limit; i++) { | ||
| if (i > 0) { | ||
| result += ','; | ||
| if (result.length >= limit) { | ||
| break; | ||
| } | ||
| } | ||
| result += traceErrPart(errors[i], limit - result.length, active); | ||
| } | ||
| return result.slice(0, limit); | ||
| } | ||
| catch { | ||
| return resultOrUnknown('', limit); | ||
| } | ||
| finally { | ||
| active.delete(errors); | ||
| } | ||
| } | ||
| function resultOrUnknown(result, limit) { | ||
| return (result || 'unknown').slice(0, limit); | ||
| } | ||
| function traceErrPart(err, limit, active) { | ||
| if (limit <= 0) { | ||
| return ''; | ||
| } | ||
| try { | ||
| if (Array.isArray(err)) { | ||
| return resultOrUnknown(joinTraceErrors(err, limit, active ?? new WeakSet()), limit); | ||
| } | ||
| const value = err; | ||
| const code = value?.code; | ||
| if (typeof code === 'string' && code !== '') { | ||
| return code.slice(0, limit); | ||
| } | ||
| const errors = value?.errors; | ||
| if (Array.isArray(errors) && errors.length > 0) { | ||
| active ??= new WeakSet(); | ||
| if (typeof err === 'object' && err !== null) { | ||
| if (active.has(err)) { | ||
| return 'unknown'.slice(0, limit); | ||
| } | ||
| active.add(err); | ||
| try { | ||
| return resultOrUnknown(joinTraceErrors(errors, limit, active), limit); | ||
| } | ||
| finally { | ||
| active.delete(err); | ||
| } | ||
| } | ||
| return resultOrUnknown(joinTraceErrors(errors, limit, active), limit); | ||
| } | ||
| const message = value?.message; | ||
| if (typeof message === 'string' && message !== '') { | ||
| return message.slice(0, limit); | ||
| } | ||
| return String(err).slice(0, limit); | ||
| } | ||
| catch { | ||
| return 'unknown'.slice(0, limit); | ||
| } | ||
| } | ||
| /** Return a bounded, exception-safe, low-cardinality error tag. */ | ||
| export function traceErr(err) { | ||
| return resultOrUnknown(traceErrPart(err, TRACE_ERR_LIMIT), TRACE_ERR_LIMIT); | ||
| } | ||
| export function genTracerId() { | ||
| const current = traceGlobals[TracerIdSymbol]; | ||
| const next = typeof current === 'number' && | ||
| Number.isSafeInteger(current) && | ||
| current >= 0 && | ||
| current < Number.MAX_SAFE_INTEGER | ||
| ? current + 1 | ||
| : 1; | ||
| traceGlobals[TracerIdSymbol] = next; | ||
| return next; | ||
| } | ||
| //# sourceMappingURL=core.js.map |
| {"version":3,"file":"core.js","sourceRoot":"","sources":["../src/core.ts"],"names":[],"mappings":"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"} |
+5
-56
| import * as rxjs from 'rxjs'; | ||
| import { type TraceWriter } from './core.ts'; | ||
| export { genTracerId, getTrace, getTraceCount, installTrace, traceErr, traceSafe, traceWrite, validateTrace, type TraceWriter, } from './core.ts'; | ||
| /** | ||
| * The makeTrace writer contract consumed across the lib packages (smb, cache, | ||
| * scheduler, http): `write` is the trace function while tracing is enabled and | ||
| * null while disabled, so call sites gate on it at zero cost when off. | ||
| * | ||
| * Contract: `write` must not call back into the instance being traced — | ||
| * emission happens inside dispatch/park control flow, and reentrancy there is | ||
| * unsupported (makeTrace's writer is a plain string append and satisfies this). | ||
| */ | ||
| export interface TraceWriter { | ||
| write: ((obj: object, op: string) => void) | null; | ||
| } | ||
| /** | ||
| * Install (or clear, with undefined) the per-thread default writer. Writes | ||
| * the shared slots — the cross-copy source of truth — AND this copy's mirror | ||
| * synchronously, so the installing thread traces immediately instead of | ||
| * waiting out the mirror interval. Used by `@nxtedition/app`'s | ||
| * traceMiddleware; tests toggling the default writer must use this too. | ||
| */ | ||
| export declare function installTrace(trace: TraceWriter | undefined): void; | ||
| /** | ||
| * The currently installed per-thread default writer, if any — the same | ||
| * resolution the mirror refreshes from. For deciding whether to install/warn | ||
| * (traceMiddleware) or for diagnostics; per-operation code should use | ||
| * traceWrite, which reads the mirror. | ||
| */ | ||
| export declare function getTrace(): TraceWriter | undefined; | ||
| /** | ||
| * Number of currently *enabled* traces in this thread: each makeTrace bumps | ||
| * this while its enabled$ stream says on and drops it when disabled or disposed | ||
| * — the monitor middleware surfaces this as the per-thread trace status. | ||
| */ | ||
| export declare function getTraceCount(): number; | ||
| /** | ||
| * Resolve the effective trace write fn for an operation: an explicit option | ||
| * wins (null = tracing disabled for this instance); when the option is absent, | ||
| * fall back to the per-thread writer `@nxtedition/app`'s traceMiddleware | ||
| * installs (installTrace). Resolved lazily per operation — | ||
| * the global may be installed after an instance is constructed, and `write` | ||
| * flips between fn and null at runtime. | ||
| */ | ||
| export declare function traceWrite(trace: TraceWriter | null | undefined): TraceWriter['write']; | ||
| export declare function validateTrace(trace: unknown): TraceWriter | null | undefined; | ||
| /** | ||
| * Emit a trace doc from inside dispatch/park/slot-accounting or request | ||
| * control flow. Tracing is auxiliary — a throwing writer must never strand | ||
| * slots, abort a drain loop, fail a request, or crash a timer callback. | ||
| * Surface the failure as a process warning instead of rethrowing. | ||
| */ | ||
| export declare function traceSafe(w: (obj: object, op: string) => void, obj: object, op: string): void; | ||
| export declare function traceErr(err: unknown): string; | ||
| export declare function genTracerId(): number; | ||
| /** | ||
| * Force-enable tracing for `serviceName` in every thread of this process | ||
@@ -101,3 +51,3 @@ * until `until` (epoch ms). Re-posting with a later `until` slides the | ||
| export interface MakeTraceOptions { | ||
| url: string | string[]; | ||
| url: string; | ||
| stringify?: (obj: unknown) => string; | ||
@@ -107,4 +57,2 @@ index: string; | ||
| limit?: number; | ||
| /** @deprecated Compat: push the disposer here instead of using Symbol.asyncDispose. */ | ||
| destroyers?: Array<() => Promise<void>> | null; | ||
| logger: TraceLogger; | ||
@@ -121,5 +69,6 @@ serviceName: string; | ||
| flush: () => Promise<void>; | ||
| readonly enabled$: rxjs.Observable<boolean | null>; | ||
| [Symbol.asyncDispose]: () => Promise<void>; | ||
| } | ||
| export declare function makeTrace({ url, stringify, index, batch, limit, destroyers, logger, serviceName, enabled$: userEnabled$, ds, }: MakeTraceOptions): Trace; | ||
| export declare function makeTrace({ url, stringify, index, batch, limit, logger, serviceName, enabled$: userEnabled$, ds, }: MakeTraceOptions): Trace; | ||
| //# sourceMappingURL=index.d.ts.map |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"} | ||
| {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,IAAI,MAAM,MAAM,CAAA;AAC5B,OAAO,EAA0B,KAAK,WAAW,EAAE,MAAM,WAAW,CAAA;AAEpE,OAAO,EACL,WAAW,EACX,QAAQ,EACR,aAAa,EACb,YAAY,EACZ,QAAQ,EACR,SAAS,EACT,UAAU,EACV,aAAa,EACb,KAAK,WAAW,GACjB,MAAM,WAAW,CAAA;AAkIlB;;;;GAIG;AACH,wBAAgB,UAAU,CAAC,WAAW,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAYnE;AAeD,eAAO,MAAM,aAAa,QAAO,CAAA;AACjC,eAAO,MAAM,sBAAsB,KAAK,CAAA;AAIxC,eAAO,MAAM,yBAAyB,QAAoB,CAAA;AAG1D,MAAM,MAAM,cAAc,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,EAAE,CAAA;CAAE,CAAA;AAEtF,wBAAgB,aAAa,IAAI,cAAc,CAE9C;AAED;;;;;;;;;GASG;AACH,wBAAgB,aAAa,CAC3B,KAAK,EAAE,cAAc,EACrB,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,KAAK,EAC7B,MAAM,EAAE,OAAO,EACf,GAAG,EAAE,MAAM,GACV;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,SAAS,EAAE,OAAO,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,CAwC9D;AAGD,MAAM,WAAW,WAAW;IAC1B,KAAK,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACvC,KAAK,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAA;IACxB,IAAI,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACtC,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAA;IACvB,IAAI,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACtC,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAA;IACvB,KAAK,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACvC,KAAK,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAA;CACzB;AAGD,MAAM,WAAW,OAAO;IACtB,MAAM,EAAE;QACN,OAAO,CAAC,UAAU,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,CAAA;KACrE,CAAA;IAKD,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CACrB;AAED,MAAM,WAAW,gBAAgB;IAC/B,GAAG,EAAE,MAAM,CAAA;IACX,SAAS,CAAC,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,MAAM,CAAA;IACpC,KAAK,EAAE,MAAM,CAAA;IACb,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,MAAM,EAAE,WAAW,CAAA;IACnB,WAAW,EAAE,MAAM,CAAA;IACnB,QAAQ,CAAC,EAAE,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,GAAG,IAAI,CAAA;IAC1C,EAAE,CAAC,EAAE,OAAO,GAAG,IAAI,CAAA;CACpB;AAED,MAAM,WAAW,KAAM,SAAQ,WAAW;IACxC,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,IAAI,CAAA;IACxC,SAAS,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,MAAM,CAAA;IACnC,KAAK,EAAE,CAAC,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,EAAE,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC,GAAG,IAAI,CAAA;IAC1D,KAAK,EAAE,CAAC,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,EAAE,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC,GAAG,IAAI,CAAA;IAC1D,KAAK,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAA;IAC1B,QAAQ,CAAC,QAAQ,EAAE,IAAI,CAAC,UAAU,CAAC,OAAO,GAAG,IAAI,CAAC,CAAA;IAClD,CAAC,MAAM,CAAC,YAAY,CAAC,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAA;CAC3C;AAiBD,wBAAgB,SAAS,CAAC,EACxB,GAAG,EACH,SAA0B,EAC1B,KAAK,EACL,KAAa,EACb,KAAY,EACZ,MAAM,EACN,WAAW,EACX,QAAQ,EAAE,YAAmB,EAC7B,EAAS,GACV,EAAE,gBAAgB,GAAG,KAAK,CAsgB1B"} |
+490
-404
| import { threadId } from 'node:worker_threads'; | ||
| import fp from 'lodash/fp.js'; | ||
| import * as rxjs from 'rxjs'; | ||
| import assert from 'node:assert/strict'; | ||
| import { getTrace, installTrace } from './core.js'; | ||
| export { genTracerId, getTrace, getTraceCount, installTrace, traceErr, traceSafe, traceWrite, validateTrace, } from './core.js'; | ||
| // nxt-undici is loaded lazily at first flush, NOT statically: it depends on | ||
@@ -16,157 +16,18 @@ // @nxtedition/scheduler, which depends on this package — a static import here | ||
| if (undici === null) { | ||
| undici = await (undiciImport ??= import('@nxtedition/nxt-undici')); | ||
| undiciImport ??= import('@nxtedition/nxt-undici').catch((err) => { | ||
| // A transient loader failure must not poison every later flush with the | ||
| // same permanently-rejected promise. | ||
| undiciImport = null; | ||
| throw err; | ||
| }); | ||
| undici = await undiciImport; | ||
| } | ||
| return undici; | ||
| } | ||
| // Symbol.for-keyed slots (the http package's cross-realm registry convention): | ||
| // same key in every copy/realm of this package, collision-proof against other | ||
| // globals. `declare global` cannot express computed-name vars, so access goes | ||
| // through the typed cast below. These slots are the ONLY registry — consumers | ||
| // resolve through getTrace()/traceWrite() (or read the Symbol.for slot | ||
| // directly where depending on this package is impossible). | ||
| const TraceSymbol = Symbol.for('@nxtedition/app/trace'); | ||
| const TraceCounterSymbol = Symbol.for('@nxtedition/app/traceCounter'); | ||
| const TracerIdSymbol = Symbol.for('@nxtedition/app/tracerId'); | ||
| const traceGlobals = globalThis; | ||
| // Module-local mirror of the global slot so the per-operation resolution in | ||
| // traceWrite is a plain variable read instead of a globalThis property access | ||
| // on hot paths. The mirror caches the writer OBJECT — runtime enable/disable | ||
| // (the `write` null-flip) stays instantaneous; only install/clear of the slot | ||
| // itself propagates lazily. installTrace() updates this copy synchronously; | ||
| // the 1s interval only catches writers installed by a DIFFERENT copy of this | ||
| // package writing the Symbol.for slot. | ||
| let globalTrace = traceGlobals[TraceSymbol]; | ||
| setInterval(() => { | ||
| globalTrace = traceGlobals[TraceSymbol]; | ||
| }, 1e3).unref(); | ||
| /** | ||
| * Install (or clear, with undefined) the per-thread default writer. Writes | ||
| * the shared slots — the cross-copy source of truth — AND this copy's mirror | ||
| * synchronously, so the installing thread traces immediately instead of | ||
| * waiting out the mirror interval. Used by `@nxtedition/app`'s | ||
| * traceMiddleware; tests toggling the default writer must use this too. | ||
| */ | ||
| export function installTrace(trace) { | ||
| traceGlobals[TraceSymbol] = trace; | ||
| globalTrace = trace; | ||
| } | ||
| /** | ||
| * The currently installed per-thread default writer, if any — the same | ||
| * resolution the mirror refreshes from. For deciding whether to install/warn | ||
| * (traceMiddleware) or for diagnostics; per-operation code should use | ||
| * traceWrite, which reads the mirror. | ||
| */ | ||
| export function getTrace() { | ||
| return traceGlobals[TraceSymbol]; | ||
| } | ||
| /** | ||
| * Number of currently *enabled* traces in this thread: each makeTrace bumps | ||
| * this while its enabled$ stream says on and drops it when disabled or disposed | ||
| * — the monitor middleware surfaces this as the per-thread trace status. | ||
| */ | ||
| export function getTraceCount() { | ||
| return traceGlobals[TraceCounterSymbol] ?? 0; | ||
| } | ||
| /** | ||
| * Resolve the effective trace write fn for an operation: an explicit option | ||
| * wins (null = tracing disabled for this instance); when the option is absent, | ||
| * fall back to the per-thread writer `@nxtedition/app`'s traceMiddleware | ||
| * installs (installTrace). Resolved lazily per operation — | ||
| * the global may be installed after an instance is constructed, and `write` | ||
| * flips between fn and null at runtime. | ||
| */ | ||
| export function traceWrite(trace) { | ||
| const t = trace === undefined ? globalTrace : trace; | ||
| const w = t?.write; | ||
| // typeof guard rather than a bare nullish check: `write` is caller-mutable | ||
| // at runtime, and a truthy non-function must resolve to "disabled" instead | ||
| // of a deferred TypeError at the emission site. | ||
| return typeof w === 'function' ? w : null; | ||
| } | ||
| // Functions are accepted alongside objects: makeTrace's canonical writer is a | ||
| // callable with `write` assigned onto itself. `write` itself must be a | ||
| // function or null AT VALIDATION TIME (it flips between the two at runtime) — | ||
| // a `{ write: 42 }` writer must fail fast here, not silently never trace. | ||
| export function validateTrace(trace) { | ||
| if (trace !== undefined && trace !== null) { | ||
| if ((typeof trace !== 'object' && typeof trace !== 'function') || !('write' in trace)) { | ||
| throw new Error('Invalid trace'); | ||
| } | ||
| let write; | ||
| try { | ||
| write = trace.write; | ||
| } | ||
| catch { | ||
| throw new Error('Invalid trace'); | ||
| } | ||
| if (write !== null && typeof write !== 'function') { | ||
| throw new Error('Invalid trace'); | ||
| } | ||
| } | ||
| return trace; | ||
| } | ||
| /** | ||
| * Emit a trace doc from inside dispatch/park/slot-accounting or request | ||
| * control flow. Tracing is auxiliary — a throwing writer must never strand | ||
| * slots, abort a drain loop, fail a request, or crash a timer callback. | ||
| * Surface the failure as a process warning instead of rethrowing. | ||
| */ | ||
| export function traceSafe(w, obj, op) { | ||
| try { | ||
| w(obj, op); | ||
| } | ||
| catch (err) { | ||
| // traceErr (never throws) rather than String(err): a writer throwing a | ||
| // non-stringifiable value must not escape the containment either. | ||
| process.emitWarning(err instanceof Error ? err : new Error(traceErr(err))); | ||
| } | ||
| } | ||
| // Short, bounded error tag for trace docs — prefer the error code so the field | ||
| // maps to one low-cardinality keyword in the trace index. AggregateError and | ||
| // Error arrays tag each member (comma-joined, still bounded). Must never | ||
| // throw: it is evaluated while building docs inside slot-accounting control | ||
| // flow, so a poisoned error value (throwing getter, unstringifiable object, | ||
| // cyclic aggregate) must yield a fallback tag, not a new throw path. | ||
| export function traceErr(err) { | ||
| try { | ||
| if (Array.isArray(err)) { | ||
| return err | ||
| .map((e) => traceErr(e)) | ||
| .join(',') | ||
| .slice(0, 64); | ||
| } | ||
| const e = err; | ||
| if (typeof e?.code === 'string' && e.code !== '') { | ||
| return e.code.slice(0, 64); | ||
| } | ||
| // AggregateError (and anything else carrying an `errors` array): the | ||
| // members are more specific than the generic top-level message. | ||
| if (Array.isArray(e?.errors) && e.errors.length > 0) { | ||
| return e.errors | ||
| .map((x) => traceErr(x)) | ||
| .join(',') | ||
| .slice(0, 64); | ||
| } | ||
| if (typeof e?.message === 'string' && e.message !== '') { | ||
| return e.message.slice(0, 64); | ||
| } | ||
| return String(err).slice(0, 64); | ||
| } | ||
| catch { | ||
| return 'unknown'; | ||
| } | ||
| } | ||
| // Per-thread monotonically increasing id for stamping trace docs from multiple | ||
| // instances of a traced component (scheduler/limiter/smb client, …) so their | ||
| // docs stay distinguishable within one pid/tid. Shared across components — the | ||
| // op prefix already namespaces them. | ||
| export function genTracerId() { | ||
| const next = (traceGlobals[TracerIdSymbol] ?? 0) + 1; | ||
| traceGlobals[TracerIdSymbol] = next; | ||
| return next; | ||
| } | ||
| const maxInt = 2147483647; | ||
| let nextTraceId = Math.floor(Math.random() * maxInt); | ||
| const MAX_INT_32 = 2147483647; | ||
| let nextTraceId = Math.floor(Math.random() * MAX_INT_32); | ||
| function genTraceId() { | ||
| nextTraceId = (nextTraceId + 1) & maxInt; | ||
| nextTraceId = (nextTraceId + 1) & MAX_INT_32; | ||
| return nextTraceId; | ||
@@ -190,2 +51,68 @@ } | ||
| let forceChannel = null; | ||
| const forceWindows = new Map(); | ||
| const forceListeners = new Set(); | ||
| function applyForceWindow(serviceName, until) { | ||
| if (until > Date.now()) { | ||
| forceWindows.set(serviceName, until); | ||
| } | ||
| else { | ||
| forceWindows.delete(serviceName); | ||
| } | ||
| for (const listener of forceListeners) { | ||
| listener(serviceName, until); | ||
| } | ||
| } | ||
| function ensureForceChannel() { | ||
| if (forceChannel === null) { | ||
| forceChannel = new BroadcastChannel(TRACE_FORCE_CHANNEL); | ||
| forceChannel.unref(); | ||
| forceChannel.onmessage = (event) => { | ||
| const data = event?.data; | ||
| if (data != null && | ||
| typeof data.serviceName === 'string' && | ||
| data.serviceName !== '' && | ||
| typeof data.until === 'number' && | ||
| Number.isFinite(data.until)) { | ||
| applyForceWindow(data.serviceName, data.until); | ||
| } | ||
| }; | ||
| } | ||
| return forceChannel; | ||
| } | ||
| function unrefTimer(delay) { | ||
| return new rxjs.Observable((subscriber) => { | ||
| const timer = setTimeout(() => { | ||
| subscriber.next(); | ||
| subscriber.complete(); | ||
| }, Math.min(Math.max(delay, 0), MAX_INT_32)).unref(); | ||
| return () => clearTimeout(timer); | ||
| }); | ||
| } | ||
| function forceWindow(until) { | ||
| return new rxjs.Observable((subscriber) => { | ||
| let timer = null; | ||
| const check = () => { | ||
| const remaining = until - Date.now(); | ||
| if (remaining <= 0) { | ||
| subscriber.next(false); | ||
| subscriber.complete(); | ||
| return; | ||
| } | ||
| timer = setTimeout(check, Math.min(remaining, MAX_INT_32)).unref(); | ||
| }; | ||
| if (until > Date.now()) { | ||
| subscriber.next(true); | ||
| check(); | ||
| } | ||
| else { | ||
| subscriber.next(false); | ||
| subscriber.complete(); | ||
| } | ||
| return () => { | ||
| if (timer !== null) { | ||
| clearTimeout(timer); | ||
| } | ||
| }; | ||
| }); | ||
| } | ||
| /** | ||
@@ -203,13 +130,12 @@ * Force-enable tracing for `serviceName` in every thread of this process | ||
| } | ||
| if (forceChannel == null) { | ||
| forceChannel = new BroadcastChannel(TRACE_FORCE_CHANNEL); | ||
| // The poster must never keep an otherwise-finished process alive. | ||
| forceChannel.unref(); | ||
| } | ||
| forceChannel.postMessage({ serviceName, until }); | ||
| // Apply locally before broadcasting so the detector's activation sample can | ||
| // be captured in the same tick. BroadcastChannel delivery covers workers | ||
| // and other physical copies of this package. | ||
| applyForceWindow(serviceName, until); | ||
| ensureForceChannel().postMessage({ serviceName, until }); | ||
| } | ||
| // Auto-trace window/throttle state machine (pure, so it is unit-testable — | ||
| // callers wire it to their live pressure signal + clock and forceTrace()). | ||
| // Ported verbatim from nxt render/src/lib/auto-trace.js so every service | ||
| // shares the same episode/window/day-cap semantics. | ||
| // Shared with nxt render's auto-trace driver so every service uses the same | ||
| // episode/window/day-cap semantics. | ||
| // | ||
@@ -244,2 +170,16 @@ // Model: while a pressure `reason` is present, (re)arm a sliding AUTO_TRACE_MS | ||
| export function stepAutoTrace(state, reason, manual, now) { | ||
| // Keep the advertised rolling-day count accurate even on quiet/manual ticks. | ||
| let expired = 0; | ||
| while (expired < state.starts.length && now - state.starts[expired] > DAY_MS) { | ||
| expired++; | ||
| } | ||
| if (expired > 0) { | ||
| state.starts.splice(0, expired); | ||
| } | ||
| // A capped chronic-pressure episode must observe an OFF tick before it can | ||
| // consume another daily slot; otherwise it reactivates immediately at the | ||
| // exact cap and tracing never actually turns off. | ||
| if (!reason && now >= state.until) { | ||
| state.episodeStart = 0; | ||
| } | ||
| let activated = false; | ||
@@ -252,8 +192,8 @@ if (reason && !manual) { | ||
| if (now - state.episodeStart < AUTO_TRACE_MAX_EPISODE_MS) { | ||
| state.until = now + AUTO_TRACE_MS; | ||
| state.until = Math.min(now + AUTO_TRACE_MS, state.episodeStart + AUTO_TRACE_MAX_EPISODE_MS); | ||
| } | ||
| } | ||
| else { | ||
| else if (state.episodeStart === 0 || | ||
| state.until < state.episodeStart + AUTO_TRACE_MAX_EPISODE_MS) { | ||
| // New episode (OFF→ON). Enforce the rolling daily cap. | ||
| state.starts = state.starts.filter((t) => now - t <= DAY_MS); | ||
| if (state.starts.length < AUTO_TRACE_MAX_PER_DAY) { | ||
@@ -269,12 +209,17 @@ state.starts.push(now); | ||
| } | ||
| // A `debug`-array entry enables tracing for a service, optionally scoped to a | ||
| // single logged-in user via `{user}@{serviceName}`. A bare `{serviceName}` | ||
| // entry (no `{user}@` prefix) matches regardless of who is connected. The user | ||
| // segment forbids `@` so the split is unambiguous; the service segment takes | ||
| // the remainder. | ||
| const DEBUG_ENTRY_RE = /^(?:(?<user>[^@]+)@)?(?<serviceName>.+)$/; | ||
| export function makeTrace({ url, stringify = JSON.stringify, index, batch = 256e3, limit = 32e6, destroyers = null, logger, serviceName, enabled$: userEnabled$ = null, ds = null, }) { | ||
| const HEADERS = { 'content-type': 'application/x-ndjson' }; | ||
| let pending = 0; | ||
| let enabled = null; | ||
| const BULK_HEADERS = { 'content-type': 'application/x-ndjson' }; | ||
| const DROP_REPORT_INTERVAL = 10e3; | ||
| function normalizeToggle(value) { | ||
| if (typeof value === 'boolean') { | ||
| return value; | ||
| } | ||
| try { | ||
| const enabled = value?.enabled; | ||
| return typeof enabled === 'boolean' ? enabled : null; | ||
| } | ||
| catch { | ||
| return null; | ||
| } | ||
| } | ||
| export function makeTrace({ url, stringify = JSON.stringify, index, batch = 256e3, limit = 32e6, logger, serviceName, enabled$: userEnabled$ = null, ds = null, }) { | ||
| if (typeof stringify !== 'function') { | ||
@@ -289,20 +234,86 @@ throw new TypeError('trace.stringify must be a function'); | ||
| } | ||
| // Validate before creating the interval/Agent below so an invalid enabled$ | ||
| // can't throw and leak those resources. | ||
| if (typeof batch !== 'number' || !Number.isFinite(batch) || batch <= 0) { | ||
| throw new TypeError('trace.batch must be a positive finite number'); | ||
| } | ||
| if (typeof limit !== 'number' || !Number.isFinite(limit) || limit < 0) { | ||
| throw new TypeError('trace.limit must be a non-negative finite number'); | ||
| } | ||
| if (typeof url !== 'string' || url === '') { | ||
| throw new TypeError('trace.url must be a non-empty string'); | ||
| } | ||
| let bulkUrl; | ||
| try { | ||
| bulkUrl = new URL('/_bulk?filter_path=errors,items.*.error', url); | ||
| if (bulkUrl.protocol !== 'http:' && bulkUrl.protocol !== 'https:') { | ||
| throw new TypeError('unsupported protocol'); | ||
| } | ||
| } | ||
| catch (err) { | ||
| throw new TypeError('trace.url must be an absolute HTTP(S) URL', { cause: err }); | ||
| } | ||
| for (const method of ['debug', 'info', 'warn', 'error']) { | ||
| if (typeof logger?.[method] !== 'function') { | ||
| throw new TypeError(`trace.logger.${method} must be a function`); | ||
| } | ||
| } | ||
| if (userEnabled$ != null && !rxjs.isObservable(userEnabled$)) { | ||
| throw new TypeError('trace.enabled$ must be an Observable'); | ||
| } | ||
| // A trace is off by default and only a stream (a ds record or enabled$) can | ||
| // turn it on, so require one here rather than silently constructing a trace | ||
| // that could never trace. Checked before the interval/Agent below so a throw | ||
| // can't leak them. | ||
| if (ds == null && userEnabled$ == null) { | ||
| throw new TypeError('trace must have either ds or enabled$'); | ||
| const safeLog = (method, first, message) => { | ||
| try { | ||
| if (message === undefined) { | ||
| logger[method](first); | ||
| } | ||
| else { | ||
| logger[method](first, message); | ||
| } | ||
| } | ||
| catch (err) { | ||
| process.emitWarning(err instanceof Error ? err : new Error('trace logger failed', { cause: err })); | ||
| } | ||
| }; | ||
| let recordEnabled$ = null; | ||
| if (ds !== null) { | ||
| if (typeof ds.record?.observe !== 'function') { | ||
| throw new TypeError('trace.ds.record.observe must be a function'); | ||
| } | ||
| let service$; | ||
| let debug$; | ||
| try { | ||
| service$ = ds.record.observe(serviceName, 'trace'); | ||
| debug$ = ds.record.observe('debug', 'trace'); | ||
| } | ||
| catch (err) { | ||
| throw new TypeError('trace.ds.record.observe failed', { cause: err }); | ||
| } | ||
| if (!rxjs.isObservable(service$) || !rxjs.isObservable(debug$)) { | ||
| throw new TypeError('trace.ds.record.observe must return an Observable'); | ||
| } | ||
| const toggles = rxjs.combineLatest([service$, debug$]).pipe(rxjs.map(([service, debug]) => { | ||
| const serviceToggle = normalizeToggle(service); | ||
| if (serviceToggle !== null) { | ||
| return serviceToggle; | ||
| } | ||
| let debugValue = debug; | ||
| if (Array.isArray(debug)) { | ||
| const userEntry = ds.user == null ? null : `${ds.user}@${serviceName}`; | ||
| // Arrays are enable-lists: absence is "unset", not an explicit false. | ||
| return debug.some((entry) => entry === serviceName || (userEntry !== null && entry === userEntry)) | ||
| ? true | ||
| : null; | ||
| } | ||
| if (typeof debug === 'object' && debug !== null) { | ||
| try { | ||
| debugValue = debug[serviceName]; | ||
| } | ||
| catch { | ||
| debugValue = null; | ||
| } | ||
| } | ||
| return normalizeToggle(debugValue); | ||
| })); | ||
| // Force/user streams must be able to control tracing while DS is still | ||
| // waiting for their first record values. | ||
| recordEnabled$ = rxjs.concat(rxjs.of(null), toggles); | ||
| } | ||
| // unref: @nxtedition/app relies on the event loop draining so beforeExit can | ||
| // fire and trigger disposal — a ref'd interval would keep an otherwise- | ||
| // finished process alive forever. Symbol.asyncDispose does a final flush on | ||
| // shutdown. | ||
| const flushInterval = setInterval(() => void flushTraces(), 10e3).unref(); | ||
| const traceUrl = Array.isArray(url) ? url[0] : url; | ||
| // Created lazily on first flush together with the nxt-undici import (see | ||
@@ -312,14 +323,71 @@ // loadUndici) — construction must not close the module cycle. | ||
| let client = null; | ||
| logger.info({ url: traceUrl }, 'trace initialized'); | ||
| let traceData = ''; | ||
| async function flushTraces() { | ||
| if (!traceData) { | ||
| safeLog('info', { url }, 'trace initialized'); | ||
| if (recordEnabled$ !== null) { | ||
| safeLog('info', { serviceName }, 'trace enabled$ created from ds.record.observe'); | ||
| } | ||
| const header = `${JSON.stringify({ create: { _index: `trace-${index}` } })}\n`; | ||
| const headerBytes = Buffer.byteLength(header); | ||
| const postfix = `,"serviceName":${JSON.stringify(serviceName)},"pid":${process.pid},"tid":${threadId}}\n`; | ||
| let enabled = null; | ||
| let disposed = false; | ||
| let pendingBytes = 0; | ||
| let bufferedBytes = 0; | ||
| let bufferedDocuments = 0; | ||
| let bufferedLosses = 0; | ||
| const buffer = []; | ||
| const lossWeights = []; | ||
| const inFlight = new Set(); | ||
| const appendDocument = (document, representedLosses = 1) => { | ||
| buffer.push(header, document); | ||
| lossWeights.push(representedLosses); | ||
| bufferedBytes += headerBytes + Buffer.byteLength(document); | ||
| bufferedDocuments++; | ||
| bufferedLosses += representedLosses; | ||
| }; | ||
| const appendDropMarker = (count, reason) => { | ||
| if (count <= 0) { | ||
| return; | ||
| } | ||
| const data = traceData; | ||
| traceData = ''; | ||
| pending += data.length; | ||
| appendDocument(`${JSON.stringify({ | ||
| count, | ||
| reason, | ||
| traceId: genTraceId(), | ||
| '@timestamp': Date.now(), | ||
| op: 'trace:dropped', | ||
| serviceName, | ||
| pid: process.pid, | ||
| tid: threadId, | ||
| })}\n`, count); | ||
| }; | ||
| const takeBatch = () => { | ||
| if (bufferedDocuments === 0) { | ||
| return null; | ||
| } | ||
| const result = { | ||
| data: buffer.join(''), | ||
| bytes: bufferedBytes, | ||
| documents: bufferedDocuments, | ||
| losses: bufferedLosses, | ||
| lossWeights: lossWeights.splice(0), | ||
| }; | ||
| buffer.length = 0; | ||
| bufferedBytes = 0; | ||
| bufferedDocuments = 0; | ||
| bufferedLosses = 0; | ||
| return result; | ||
| }; | ||
| const itemError = (item) => { | ||
| if (typeof item !== 'object' || item === null) { | ||
| return null; | ||
| } | ||
| for (const action in item) { | ||
| const error = item[action]?.error; | ||
| if (typeof error === 'object' && error !== null) { | ||
| return error; | ||
| } | ||
| } | ||
| return null; | ||
| }; | ||
| const sendBatch = async (current) => { | ||
| try { | ||
| // Cached after the first flush — see loadUndici; the common steady-state | ||
| // path costs one null check, no promise hop. | ||
| const { request, Agent } = undici ?? (await loadUndici()); | ||
@@ -331,23 +399,17 @@ client ??= new Agent({ | ||
| }); | ||
| // filter_path trims the bulk response to the errors flag + per-item | ||
| // errors, so inspecting rejections costs nothing on the happy path | ||
| // (a clean response is just {"errors":false}). ES answers HTTP 200 | ||
| // with errors:true for per-item rejections (mapping conflicts, field | ||
| // caps) — the body used to be dumped unchecked, which made every such | ||
| // rejection an invisible gap in the trace window: outside both the | ||
| // NXT_TRACE_DROPPED accounting and the 'trace failed' log. | ||
| const { statusCode, body } = await request(new URL('/_bulk?filter_path=errors,items.*.error', traceUrl), { | ||
| const { statusCode, body } = await request(bulkUrl, { | ||
| method: 'POST', | ||
| idempotent: true, | ||
| headers: HEADERS, | ||
| headers: BULK_HEADERS, | ||
| headersTimeout: 60e3, | ||
| bodyTimeout: 60e3, | ||
| body: data, | ||
| body: current.data, | ||
| dispatcher: client, | ||
| retry: 4, | ||
| // The trace sink must never feed its own undici request docs back into | ||
| // itself, otherwise every flush permanently schedules the next flush. | ||
| trace: null, | ||
| }); | ||
| const text = await body.text(); | ||
| if (statusCode >= 400) { | ||
| // undici's retry already handled retryable failures — a status that | ||
| // still arrives here means the whole batch was not indexed. | ||
| if (statusCode < 200 || statusCode >= 300) { | ||
| throw Object.assign(new Error(`bulk request failed: ${statusCode}`), { | ||
@@ -358,101 +420,226 @@ statusCode, | ||
| } | ||
| let res = null; | ||
| let response; | ||
| try { | ||
| res = JSON.parse(text); | ||
| response = JSON.parse(text); | ||
| } | ||
| catch { | ||
| // A non-JSON 2xx body has nothing actionable. | ||
| catch (err) { | ||
| throw new Error('bulk request returned invalid JSON', { cause: err }); | ||
| } | ||
| if (res?.errors) { | ||
| // filter_path keeps only the items that carry an error, so the array | ||
| // length IS the rejection count. | ||
| const items = Array.isArray(res.items) ? res.items : []; | ||
| const sample = items | ||
| .map((item) => item != null && typeof item === 'object' | ||
| ? Object.values(item)[0]?.error | ||
| : undefined) | ||
| .find(Boolean); | ||
| if (items.length > 0) { | ||
| logger.warn({ | ||
| code: 'NXT_TRACE_REJECTED', | ||
| count: items.length, | ||
| index, | ||
| type: sample?.type, | ||
| reason: typeof sample?.reason === 'string' ? sample.reason.slice(0, 256) : undefined, | ||
| }, 'trace rejected'); | ||
| // Same in-index convention as the backpressure marker below: a gap | ||
| // in a trace window must be distinguishable from quiescence. | ||
| // `reason` labels the loss class. | ||
| traceData += header; | ||
| traceData += `{"count":${items.length},"reason":"rejected","traceId":${genTraceId()},"@timestamp":${Date.now()},"op":"trace:dropped${postfix}`; | ||
| if (response === null || typeof response.errors !== 'boolean') { | ||
| throw new Error('bulk request returned an invalid response'); | ||
| } | ||
| if (!response.errors) { | ||
| return; | ||
| } | ||
| const items = Array.isArray(response.items) ? response.items : []; | ||
| let rejectedDocuments = 0; | ||
| let rejectedLosses = 0; | ||
| let sample = null; | ||
| for (let i = 0; i < items.length; i++) { | ||
| const item = items[i]; | ||
| const error = itemError(item); | ||
| if (error !== null) { | ||
| rejectedDocuments++; | ||
| rejectedLosses += current.lossWeights[i] ?? 1; | ||
| sample ??= error; | ||
| } | ||
| } | ||
| if (rejectedDocuments === 0) { | ||
| throw new Error('bulk request reported errors without item details'); | ||
| } | ||
| safeLog('warn', { | ||
| code: 'NXT_TRACE_REJECTED', | ||
| count: rejectedLosses, | ||
| documents: rejectedDocuments, | ||
| index, | ||
| type: sample?.type, | ||
| reason: typeof sample?.reason === 'string' ? sample.reason.slice(0, 256) : undefined, | ||
| }, 'trace rejected'); | ||
| appendDropMarker(rejectedLosses, 'rejected'); | ||
| } | ||
| catch (err) { | ||
| // Bounded head only — during an ES outage every failed flush would | ||
| // otherwise attach up to `batch` bytes of payload to the error log. | ||
| const count = data.split(header).length - 1; | ||
| logger.error({ err, bytes: data.length, count, data: data.slice(0, 4096) }, 'trace failed'); | ||
| // The whole batch is lost — leave the loss marker for the window; it is | ||
| // indexed by the next successful flush. Persistent outages compound the | ||
| // counts (a marker for lost markers), which is self-describing. | ||
| traceData += header; | ||
| traceData += `{"count":${count},"reason":"failed","traceId":${genTraceId()},"@timestamp":${Date.now()},"op":"trace:dropped${postfix}`; | ||
| safeLog('error', { | ||
| err, | ||
| bytes: current.bytes, | ||
| documents: current.documents, | ||
| count: current.losses, | ||
| data: current.data.slice(0, 4096), | ||
| }, 'trace failed'); | ||
| appendDropMarker(current.losses, 'failed'); | ||
| } | ||
| finally { | ||
| pending -= data.length; | ||
| }; | ||
| const startFlush = () => { | ||
| const current = takeBatch(); | ||
| if (current === null) { | ||
| return null; | ||
| } | ||
| } | ||
| const header = `{"create":{"_index":"trace-${index}"}}\n`; | ||
| const postfix = `","serviceName":"${serviceName}","pid":${process.pid},"tid":${threadId}}\n`; | ||
| let dropCount = 0; | ||
| const markDrop = fp.throttle(10e3, () => { | ||
| if (!dropCount) { | ||
| pendingBytes += current.bytes; | ||
| const operation = sendBatch(current); | ||
| const tracked = operation.finally(() => { | ||
| pendingBytes -= current.bytes; | ||
| inFlight.delete(tracked); | ||
| }); | ||
| inFlight.add(tracked); | ||
| return tracked; | ||
| }; | ||
| const awaitInFlight = async () => { | ||
| while (inFlight.size > 0) { | ||
| await Promise.all(inFlight); | ||
| } | ||
| }; | ||
| let lastDropReport = 0; | ||
| let dropTimer = null; | ||
| const dropCounts = new Map(); | ||
| const emitDrops = () => { | ||
| if (dropTimer !== null) { | ||
| clearTimeout(dropTimer); | ||
| dropTimer = null; | ||
| } | ||
| if (dropCounts.size === 0) { | ||
| return; | ||
| } | ||
| logger.warn({ code: 'NXT_TRACE_DROPPED', count: dropCount, index }, 'trace dropped'); | ||
| // Also record the loss in-index — otherwise a gap in a trace window is | ||
| // indistinguishable from quiescence. The marker bypasses the pending limit | ||
| // (it must land precisely when everything else is being dropped) but is | ||
| // bounded by the throttle to one small doc per window. | ||
| traceData += header; | ||
| traceData += `{"count":${dropCount},"traceId":${genTraceId()},"@timestamp":${Date.now()},"op":"trace:dropped${postfix}`; | ||
| dropCount = 0; | ||
| }); | ||
| lastDropReport = Date.now(); | ||
| for (const [reason, count] of dropCounts) { | ||
| safeLog('warn', { code: 'NXT_TRACE_DROPPED', count, index, reason }, 'trace dropped'); | ||
| appendDropMarker(count, reason); | ||
| } | ||
| dropCounts.clear(); | ||
| }; | ||
| const markDrop = (reason) => { | ||
| dropCounts.set(reason, (dropCounts.get(reason) ?? 0) + 1); | ||
| const remaining = DROP_REPORT_INTERVAL - (Date.now() - lastDropReport); | ||
| if (lastDropReport === 0 || remaining <= 0) { | ||
| emitDrops(); | ||
| } | ||
| else if (dropTimer === null) { | ||
| dropTimer = setTimeout(emitDrops, remaining).unref(); | ||
| } | ||
| }; | ||
| const flushAll = async () => { | ||
| emitDrops(); | ||
| void startFlush(); | ||
| await awaitInFlight(); | ||
| // A failed/rejected in-flight batch creates one loss marker. Give that | ||
| // marker one best-effort send without recursively retrying forever. | ||
| if (bufferedDocuments > 0) { | ||
| void startFlush(); | ||
| await awaitInFlight(); | ||
| } | ||
| }; | ||
| const trace = ((obj, op) => { | ||
| if (!enabled) { | ||
| if (!enabled || disposed) { | ||
| return; | ||
| } | ||
| if (pending > limit) { | ||
| dropCount++; | ||
| markDrop(); | ||
| if (pendingBytes !== 0 && pendingBytes >= limit) { | ||
| markDrop('backpressure'); | ||
| return; | ||
| } | ||
| else { | ||
| const doc = (typeof obj === 'string' ? obj : stringify(obj)).slice(0, -1); | ||
| traceData += header; | ||
| traceData += `${doc},"traceId":${genTraceId()},"@timestamp":${Date.now()},"op":"${op}${postfix}`; | ||
| if (traceData.length > batch) { | ||
| void flushTraces(); | ||
| let doc; | ||
| try { | ||
| const serialized = typeof obj === 'string' ? obj : stringify(obj); | ||
| if (typeof serialized !== 'string' || | ||
| serialized.charCodeAt(0) !== 123 || | ||
| serialized.charCodeAt(serialized.length - 1) !== 125 || | ||
| typeof op !== 'string') { | ||
| throw new TypeError('trace document must serialize to a JSON object'); | ||
| } | ||
| let hasProperties = serialized.length > 2; | ||
| // Raw strings and custom serializers are trust boundaries. Validate | ||
| // their syntax once so one malformed payload cannot corrupt the rest of | ||
| // the NDJSON batch. The default JSON.stringify object path needs only | ||
| // the O(1) top-level-object check above. | ||
| if (typeof obj === 'string' || stringify !== JSON.stringify) { | ||
| const parsed = JSON.parse(serialized); | ||
| if (typeof parsed !== 'object' || parsed === null || Array.isArray(parsed)) { | ||
| throw new TypeError('trace document must serialize to a JSON object'); | ||
| } | ||
| hasProperties = Object.keys(parsed).length > 0; | ||
| } | ||
| const separator = hasProperties ? ',' : ''; | ||
| doc = `${serialized.slice(0, -1)}${separator}"traceId":${genTraceId()},"@timestamp":${Date.now()},"op":${JSON.stringify(op)}${postfix}`; | ||
| } | ||
| catch { | ||
| markDrop('serialize'); | ||
| return; | ||
| } | ||
| appendDocument(doc); | ||
| if (bufferedBytes >= batch) { | ||
| void startFlush(); | ||
| } | ||
| }); | ||
| trace.stringify = stringify; | ||
| trace.trace = trace; | ||
| trace.write = trace; | ||
| trace.flush = flushTraces; | ||
| let enabledSubscription = null; | ||
| let disposed = false; | ||
| trace[Symbol.asyncDispose] = async () => { | ||
| // Idempotent: mixing manual cleanup with AsyncDisposableStack/`using` | ||
| // makes double-dispose easy, and a second pass would corrupt the live | ||
| // refcount and re-close the transport. | ||
| if (disposed) { | ||
| trace.trace = null; | ||
| trace.write = null; | ||
| trace.flush = () => (disposed && disposePromise !== null ? disposePromise : flushAll()); | ||
| const enabledStatus = new rxjs.BehaviorSubject(null); | ||
| Object.defineProperty(trace, 'enabled$', { | ||
| enumerable: true, | ||
| value: enabledStatus.asObservable(), | ||
| }); | ||
| const force$ = new rxjs.Observable((subscriber) => { | ||
| ensureForceChannel(); | ||
| const listener = (name, until) => { | ||
| if (name === serviceName) { | ||
| subscriber.next(until); | ||
| } | ||
| }; | ||
| forceListeners.add(listener); | ||
| subscriber.next(forceWindows.get(serviceName) ?? 0); | ||
| return () => forceListeners.delete(listener); | ||
| }).pipe(rxjs.switchMap((until) => forceWindow(until).pipe(rxjs.tap((forced) => { | ||
| if (!forced && forceWindows.get(serviceName) === until) { | ||
| forceWindows.delete(serviceName); | ||
| } | ||
| })))); | ||
| const userState$ = userEnabled$ | ||
| ? rxjs.concat(rxjs.of(null), userEnabled$.pipe(rxjs.map(normalizeToggle))) | ||
| : rxjs.of(null); | ||
| const changeCount = (delta) => { | ||
| traceGlobals[TraceCounterSymbol] = Math.max(0, (traceGlobals[TraceCounterSymbol] ?? 0) + delta); | ||
| }; | ||
| const setEnabled = (value) => { | ||
| if (disposed || value === enabled) { | ||
| return; | ||
| } | ||
| const wasEnabled = enabled === true; | ||
| enabled = value; | ||
| if (value) { | ||
| trace.write = trace; | ||
| trace.trace = trace; | ||
| if (!wasEnabled) { | ||
| changeCount(1); | ||
| } | ||
| safeLog('debug', 'trace enabled'); | ||
| } | ||
| else { | ||
| trace.write = null; | ||
| trace.trace = null; | ||
| if (wasEnabled) { | ||
| changeCount(-1); | ||
| } | ||
| safeLog('debug', 'trace disabled'); | ||
| emitDrops(); | ||
| void flushAll(); | ||
| } | ||
| // Publish only after writer and refcount state are coherent. | ||
| enabledStatus.next(value); | ||
| }; | ||
| let enabledSubscription = null; | ||
| enabledSubscription = rxjs | ||
| .combineLatest([recordEnabled$ ?? rxjs.of(null), force$, userState$]) | ||
| .pipe(rxjs.map(([record, force, user]) => record ?? (force || user === true)), rxjs.retry({ | ||
| resetOnSuccess: true, | ||
| delay: (err, retryCount) => { | ||
| safeLog('error', { err, retryCount }, 'trace enabled$ error, retrying'); | ||
| return unrefTimer(10e3); | ||
| }, | ||
| }), rxjs.distinctUntilChanged()) | ||
| .subscribe({ | ||
| next: setEnabled, | ||
| error: (err) => safeLog('error', { err }, 'trace enabled$ error'), | ||
| }); | ||
| let disposePromise = null; | ||
| const dispose = async () => { | ||
| disposed = true; | ||
| // Clear the default-writer slots when they point at this trace: a later | ||
| // install in the same thread must not be blocked by a disposed (inert) | ||
| // registration. The write/trace nulling below keeps captured references | ||
| // and other copies' mirrors harmless regardless. | ||
| if (traceGlobals[TraceSymbol] === trace) { | ||
| if (getTrace() === trace) { | ||
| installTrace(undefined); | ||
@@ -462,7 +649,4 @@ } | ||
| enabledSubscription?.unsubscribe(); | ||
| // Release this trace's enabled-count slot if it was still on at dispose, | ||
| // mirroring the true -> false decrement in the enabled$ handler. The | ||
| // `disposed` guard above keeps a double dispose from decrementing twice. | ||
| if (enabled === true) { | ||
| traceGlobals[TraceCounterSymbol] = (traceGlobals[TraceCounterSymbol] ?? 1) - 1; | ||
| changeCount(-1); | ||
| } | ||
@@ -472,121 +656,23 @@ enabled = false; | ||
| trace.trace = null; | ||
| await flushTraces(); | ||
| if (enabledStatus.getValue() !== false) { | ||
| enabledStatus.next(false); | ||
| } | ||
| enabledStatus.complete(); | ||
| emitDrops(); | ||
| await flushAll(); | ||
| await client?.close(); | ||
| }; | ||
| let recordEnabled$ = null; | ||
| if (ds) { | ||
| recordEnabled$ = rxjs | ||
| .combineLatest([ | ||
| serviceName ? ds.record.observe(serviceName, 'trace') : rxjs.of(undefined), | ||
| ds.record.observe('debug', 'trace'), | ||
| ]) | ||
| .pipe(rxjs.map(([service, debug]) => service ?? | ||
| (Array.isArray(debug) | ||
| ? debug.some((entry) => { | ||
| if (typeof entry !== 'string') { | ||
| return false; | ||
| } | ||
| const groups = entry.match(DEBUG_ENTRY_RE)?.groups; | ||
| return (groups?.serviceName === serviceName && | ||
| (groups?.user == null || groups.user === ds.user)); | ||
| }) | ||
| : typeof debug === 'object' && debug !== null | ||
| ? debug[serviceName] | ||
| : debug)), rxjs.map((value) => (typeof value === 'boolean' ? value : null) ?? | ||
| value?.enabled ?? | ||
| value), rxjs.map((enabled) => (typeof enabled === 'boolean' ? enabled : null))); | ||
| logger.info({ serviceName }, 'trace enabled$ created from ds.record.observe'); | ||
| } | ||
| // Controlled by enabled$: start disabled and let the stream turn tracing on, so a | ||
| // service never traces during the startup window before the first emission (matches | ||
| // the off-by-default behavior consumers previously wired up themselves). The internal | ||
| // `enabled` flag gates the callable itself, so a captured `trace`/`trace.trace` | ||
| // reference can't bypass the toggle; nulling `trace.write`/`trace.trace` additionally | ||
| // keeps the property-based contract consumers rely on. | ||
| assert.strictEqual(enabled, null, 'trace enabled must start null'); | ||
| trace.write = null; | ||
| trace.trace = null; | ||
| // Force-enable stream: follows forceTrace() broadcasts addressed to this | ||
| // serviceName. Each message (re)opens a window that closes at `until`; | ||
| // switchMap so a newer message supersedes the pending expiry timer. The | ||
| // channel is created on subscribe and closed on unsubscribe (the | ||
| // enabledSubscription teardown in the disposer), and unref'd so it never | ||
| // keeps an otherwise-finished process alive. | ||
| const force$ = new rxjs.Observable((subscriber) => { | ||
| const bc = new BroadcastChannel(TRACE_FORCE_CHANNEL); | ||
| bc.unref(); | ||
| bc.onmessage = (event) => { | ||
| const data = event?.data; | ||
| if (data != null && | ||
| data.serviceName === serviceName && | ||
| typeof data.until === 'number' && | ||
| Number.isFinite(data.until)) { | ||
| subscriber.next(data.until); | ||
| } | ||
| }; | ||
| return () => bc.close(); | ||
| }).pipe(rxjs.switchMap((until) => { | ||
| const remainingMs = until - Date.now(); | ||
| return remainingMs > 0 | ||
| ? rxjs.concat(rxjs.of(true), rxjs.timer(remainingMs).pipe(rxjs.map(() => false))) | ||
| : rxjs.of(false); | ||
| }), rxjs.startWith(false)); | ||
| // Precedence: an explicit boolean on the service/debug record wins (in both | ||
| // directions — a manual `false` suppresses a force window), then a live | ||
| // forceTrace() window, then the caller-supplied enabled$, default off. | ||
| // Absent streams contribute a constant null so the positional destructure | ||
| // below stays stable. | ||
| enabledSubscription = rxjs | ||
| .combineLatest([ | ||
| recordEnabled$ ?? rxjs.of(null), | ||
| force$, | ||
| userEnabled$ ?? rxjs.of(null), | ||
| ]) | ||
| .pipe(rxjs.map(([record, force, user]) => record ?? (force || (user ?? false))), rxjs.retry({ | ||
| resetOnSuccess: true, | ||
| // delay must return an ObservableInput; a bare number throws "where a stream | ||
| // was expected" and the retry never happens. | ||
| delay: (err, retryCount) => { | ||
| logger.error({ err, retryCount }, 'trace enabled$ error, retrying'); | ||
| return rxjs.timer(10e3); | ||
| }, | ||
| }), rxjs.distinctUntilChanged()) | ||
| .subscribe({ | ||
| next: (value) => { | ||
| if (value === enabled) { | ||
| return; | ||
| } | ||
| // Only genuine boolean transitions move the enabled-count: (null|false) | ||
| // -> true bumps it, true -> false drops it. The initial null -> false (a | ||
| // trace that starts disabled and was never counted) must NOT decrement, | ||
| // or getTraceCount() drifts negative. Disposal-while-enabled is handled | ||
| // in the disposer, so a merely completing stream never disables. | ||
| const wasEnabled = enabled === true; | ||
| enabled = value; | ||
| if (value) { | ||
| logger.debug('trace enabled'); | ||
| trace.write = trace; | ||
| trace.trace = trace; | ||
| traceGlobals[TraceCounterSymbol] = (traceGlobals[TraceCounterSymbol] ?? 0) + 1; | ||
| } | ||
| else { | ||
| logger.debug('trace disabled'); | ||
| trace.write = null; | ||
| trace.trace = null; | ||
| if (wasEnabled) { | ||
| traceGlobals[TraceCounterSymbol] = (traceGlobals[TraceCounterSymbol] ?? 1) - 1; | ||
| } | ||
| void flushTraces(); | ||
| } | ||
| }, | ||
| error: (err) => { | ||
| logger.error({ err }, 'trace enabled$ error'); | ||
| }, | ||
| }); | ||
| // Compat | ||
| if (Array.isArray(destroyers)) { | ||
| destroyers.push(trace[Symbol.asyncDispose]); | ||
| } | ||
| trace[Symbol.asyncDispose] = () => { | ||
| if (disposePromise === null) { | ||
| const { promise, resolve, reject } = Promise.withResolvers(); | ||
| disposePromise = promise; | ||
| void dispose().then(resolve, reject); | ||
| } | ||
| return disposePromise; | ||
| }; | ||
| // Periodic fire-and-forget batches are tracked by startFlush, so public | ||
| // flush/dispose remain real barriers for them. | ||
| const flushInterval = setInterval(() => void startFlush(), 10e3).unref(); | ||
| return trace; | ||
| } | ||
| //# sourceMappingURL=index.js.map |
+1
-1
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"} | ||
| {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAA;AAE9C,OAAO,KAAK,IAAI,MAAM,MAAM,CAAA;AAC5B,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAoB,MAAM,WAAW,CAAA;AAEpE,OAAO,EACL,WAAW,EACX,QAAQ,EACR,aAAa,EACb,YAAY,EACZ,QAAQ,EACR,SAAS,EACT,UAAU,EACV,aAAa,GAEd,MAAM,WAAW,CAAA;AAElB,4EAA4E;AAC5E,8EAA8E;AAC9E,yEAAyE;AACzE,6EAA6E;AAC7E,6EAA6E;AAC7E,6EAA6E;AAC7E,4BAA4B;AAC5B,IAAI,MAAM,GAAmD,IAAI,CAAA;AACjE,IAAI,YAAY,GAA4D,IAAI,CAAA;AAChF,KAAK,UAAU,UAAU;IACvB,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;QACpB,YAAY,KAAK,MAAM,CAAC,wBAAwB,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;YAC9D,wEAAwE;YACxE,qCAAqC;YACrC,YAAY,GAAG,IAAI,CAAA;YACnB,MAAM,GAAG,CAAA;QACX,CAAC,CAAC,CAAA;QACF,MAAM,GAAG,MAAM,YAAY,CAAA;IAC7B,CAAC;IACD,OAAO,MAAM,CAAA;AACf,CAAC;AAED,MAAM,kBAAkB,GAAG,MAAM,CAAC,GAAG,CAAC,8BAA8B,CAAC,CAAA;AAErE,MAAM,YAAY,GAAG,UAEpB,CAAA;AAED,MAAM,UAAU,GAAG,UAAU,CAAA;AAC7B,IAAI,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,UAAU,CAAC,CAAA;AACxD,SAAS,UAAU;IACjB,WAAW,GAAG,CAAC,WAAW,GAAG,CAAC,CAAC,GAAG,UAAU,CAAA;IAC5C,OAAO,WAAW,CAAA;AACpB,CAAC;AAED,8EAA8E;AAC9E,qCAAqC;AACrC,EAAE;AACF,4EAA4E;AAC5E,yEAAyE;AACzE,6EAA6E;AAC7E,2EAA2E;AAC3E,8EAA8E;AAC9E,mEAAmE;AACnE,sEAAsE;AACtE,6EAA6E;AAC7E,0EAA0E;AAC1E,4BAA4B;AAC5B,8EAA8E;AAE9E,MAAM,mBAAmB,GAAG,yBAAyB,CAAA;AAErD,IAAI,YAAY,GAA4B,IAAI,CAAA;AAChD,MAAM,YAAY,GAAG,IAAI,GAAG,EAAkB,CAAA;AAC9C,MAAM,cAAc,GAAG,IAAI,GAAG,EAAgD,CAAA;AAE9E,SAAS,gBAAgB,CAAC,WAAmB,EAAE,KAAa;IAC1D,IAAI,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;QACvB,YAAY,CAAC,GAAG,CAAC,WAAW,EAAE,KAAK,CAAC,CAAA;IACtC,CAAC;SAAM,CAAC;QACN,YAAY,CAAC,MAAM,CAAC,WAAW,CAAC,CAAA;IAClC,CAAC;IACD,KAAK,MAAM,QAAQ,IAAI,cAAc,EAAE,CAAC;QACtC,QAAQ,CAAC,WAAW,EAAE,KAAK,CAAC,CAAA;IAC9B,CAAC;AACH,CAAC;AAED,SAAS,kBAAkB;IACzB,IAAI,YAAY,KAAK,IAAI,EAAE,CAAC;QAC1B,YAAY,GAAG,IAAI,gBAAgB,CAAC,mBAAmB,CAAC,CAAA;QACxD,YAAY,CAAC,KAAK,EAAE,CAAA;QACpB,YAAY,CAAC,SAAS,GAAG,CAAC,KAAc,EAAE,EAAE;YAC1C,MAAM,IAAI,GAAI,KAAsE,EAAE,IAAI,CAAA;YAC1F,IACE,IAAI,IAAI,IAAI;gBACZ,OAAO,IAAI,CAAC,WAAW,KAAK,QAAQ;gBACpC,IAAI,CAAC,WAAW,KAAK,EAAE;gBACvB,OAAO,IAAI,CAAC,KAAK,KAAK,QAAQ;gBAC9B,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,EAC3B,CAAC;gBACD,gBAAgB,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,KAAK,CAAC,CAAA;YAChD,CAAC;QACH,CAAC,CAAA;IACH,CAAC;IACD,OAAO,YAAY,CAAA;AACrB,CAAC;AAED,SAAS,UAAU,CAAC,KAAa;IAC/B,OAAO,IAAI,IAAI,CAAC,UAAU,CAAC,CAAC,UAAU,EAAE,EAAE;QACxC,MAAM,KAAK,GAAG,UAAU,CACtB,GAAG,EAAE;YACH,UAAU,CAAC,IAAI,EAAE,CAAA;YACjB,UAAU,CAAC,QAAQ,EAAE,CAAA;QACvB,CAAC,EACD,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,CAAC,EAAE,UAAU,CAAC,CACzC,CAAC,KAAK,EAAE,CAAA;QACT,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,KAAK,CAAC,CAAA;IAClC,CAAC,CAAC,CAAA;AACJ,CAAC;AAED,SAAS,WAAW,CAAC,KAAa;IAChC,OAAO,IAAI,IAAI,CAAC,UAAU,CAAC,CAAC,UAAU,EAAE,EAAE;QACxC,IAAI,KAAK,GAA0B,IAAI,CAAA;QACvC,MAAM,KAAK,GAAG,GAAG,EAAE;YACjB,MAAM,SAAS,GAAG,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,CAAA;YACpC,IAAI,SAAS,IAAI,CAAC,EAAE,CAAC;gBACnB,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;gBACtB,UAAU,CAAC,QAAQ,EAAE,CAAA;gBACrB,OAAM;YACR,CAAC;YACD,KAAK,GAAG,UAAU,CAAC,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC,CAAC,KAAK,EAAE,CAAA;QACpE,CAAC,CAAA;QAED,IAAI,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;YACvB,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;YACrB,KAAK,EAAE,CAAA;QACT,CAAC;aAAM,CAAC;YACN,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;YACtB,UAAU,CAAC,QAAQ,EAAE,CAAA;QACvB,CAAC;QACD,OAAO,GAAG,EAAE;YACV,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;gBACnB,YAAY,CAAC,KAAK,CAAC,CAAA;YACrB,CAAC;QACH,CAAC,CAAA;IACH,CAAC,CAAC,CAAA;AACJ,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,UAAU,CAAC,WAAmB,EAAE,KAAa;IAC3D,IAAI,OAAO,WAAW,KAAK,QAAQ,IAAI,CAAC,WAAW,EAAE,CAAC;QACpD,MAAM,IAAI,SAAS,CAAC,mDAAmD,CAAC,CAAA;IAC1E,CAAC;IACD,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QACzD,MAAM,IAAI,SAAS,CAAC,kDAAkD,CAAC,CAAA;IACzE,CAAC;IACD,4EAA4E;IAC5E,yEAAyE;IACzE,6CAA6C;IAC7C,gBAAgB,CAAC,WAAW,EAAE,KAAK,CAAC,CAAA;IACpC,kBAAkB,EAAE,CAAC,WAAW,CAAC,EAAE,WAAW,EAAE,KAAK,EAAE,CAAC,CAAA;AAC1D,CAAC;AAED,2EAA2E;AAC3E,2EAA2E;AAC3E,4EAA4E;AAC5E,oCAAoC;AACpC,EAAE;AACF,+EAA+E;AAC/E,6EAA6E;AAC7E,8EAA8E;AAC9E,4EAA4E;AAC5E,0EAA0E;AAC1E,4EAA4E;AAC5E,gEAAgE;AAEhE,MAAM,CAAC,MAAM,aAAa,GAAG,IAAI,CAAA;AACjC,MAAM,CAAC,MAAM,sBAAsB,GAAG,EAAE,CAAA;AACxC,wEAAwE;AACxE,4EAA4E;AAC5E,qBAAqB;AACrB,MAAM,CAAC,MAAM,yBAAyB,GAAG,CAAC,GAAG,aAAa,CAAA;AAC1D,MAAM,MAAM,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAA;AAI7B,MAAM,UAAU,aAAa;IAC3B,OAAO,EAAE,KAAK,EAAE,CAAC,EAAE,YAAY,EAAE,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,CAAA;AAClD,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,aAAa,CAC3B,KAAqB,EACrB,MAA6B,EAC7B,MAAe,EACf,GAAW;IAEX,6EAA6E;IAC7E,IAAI,OAAO,GAAG,CAAC,CAAA;IACf,OAAO,OAAO,GAAG,KAAK,CAAC,MAAM,CAAC,MAAM,IAAI,GAAG,GAAG,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,MAAM,EAAE,CAAC;QAC7E,OAAO,EAAE,CAAA;IACX,CAAC;IACD,IAAI,OAAO,GAAG,CAAC,EAAE,CAAC;QAChB,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,OAAO,CAAC,CAAA;IACjC,CAAC;IAED,2EAA2E;IAC3E,0EAA0E;IAC1E,kDAAkD;IAClD,IAAI,CAAC,MAAM,IAAI,GAAG,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC;QAClC,KAAK,CAAC,YAAY,GAAG,CAAC,CAAA;IACxB,CAAC;IAED,IAAI,SAAS,GAAG,KAAK,CAAA;IACrB,IAAI,MAAM,IAAI,CAAC,MAAM,EAAE,CAAC;QACtB,IAAI,GAAG,GAAG,KAAK,CAAC,KAAK,EAAE,CAAC;YACtB,wEAAwE;YACxE,yEAAyE;YACzE,QAAQ;YACR,IAAI,GAAG,GAAG,KAAK,CAAC,YAAY,GAAG,yBAAyB,EAAE,CAAC;gBACzD,KAAK,CAAC,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,GAAG,aAAa,EAAE,KAAK,CAAC,YAAY,GAAG,yBAAyB,CAAC,CAAA;YAC7F,CAAC;QACH,CAAC;aAAM,IACL,KAAK,CAAC,YAAY,KAAK,CAAC;YACxB,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC,YAAY,GAAG,yBAAyB,EAC5D,CAAC;YACD,uDAAuD;YACvD,IAAI,KAAK,CAAC,MAAM,CAAC,MAAM,GAAG,sBAAsB,EAAE,CAAC;gBACjD,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;gBACtB,KAAK,CAAC,YAAY,GAAG,GAAG,CAAA;gBACxB,KAAK,CAAC,KAAK,GAAG,GAAG,GAAG,aAAa,CAAA;gBACjC,SAAS,GAAG,IAAI,CAAA;YAClB,CAAC;QACH,CAAC;IACH,CAAC;IACD,OAAO,EAAE,OAAO,EAAE,MAAM,IAAI,GAAG,GAAG,KAAK,CAAC,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,CAAA;AAC7F,CAAC;AAgDD,MAAM,YAAY,GAAG,EAAE,cAAc,EAAE,sBAAsB,EAAE,CAAA;AAC/D,MAAM,oBAAoB,GAAG,IAAI,CAAA;AAEjC,SAAS,eAAe,CAAC,KAAc;IACrC,IAAI,OAAO,KAAK,KAAK,SAAS,EAAE,CAAC;QAC/B,OAAO,KAAK,CAAA;IACd,CAAC;IACD,IAAI,CAAC;QACH,MAAM,OAAO,GAAI,KAAsC,EAAE,OAAO,CAAA;QAChE,OAAO,OAAO,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAA;IACtD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAA;IACb,CAAC;AACH,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,EACxB,GAAG,EACH,SAAS,GAAG,IAAI,CAAC,SAAS,EAC1B,KAAK,EACL,KAAK,GAAG,KAAK,EACb,KAAK,GAAG,IAAI,EACZ,MAAM,EACN,WAAW,EACX,QAAQ,EAAE,YAAY,GAAG,IAAI,EAC7B,EAAE,GAAG,IAAI,GACQ;IACjB,IAAI,OAAO,SAAS,KAAK,UAAU,EAAE,CAAC;QACpC,MAAM,IAAI,SAAS,CAAC,oCAAoC,CAAC,CAAA;IAC3D,CAAC;IAED,IAAI,OAAO,WAAW,KAAK,QAAQ,IAAI,CAAC,WAAW,EAAE,CAAC;QACpD,MAAM,IAAI,SAAS,CAAC,8CAA8C,CAAC,CAAA;IACrE,CAAC;IAED,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,KAAK,EAAE,CAAC;QACxC,MAAM,IAAI,SAAS,CAAC,wCAAwC,CAAC,CAAA;IAC/D,CAAC;IACD,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,KAAK,IAAI,CAAC,EAAE,CAAC;QACvE,MAAM,IAAI,SAAS,CAAC,8CAA8C,CAAC,CAAA;IACrE,CAAC;IACD,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;QACtE,MAAM,IAAI,SAAS,CAAC,kDAAkD,CAAC,CAAA;IACzE,CAAC;IACD,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,EAAE,EAAE,CAAC;QAC1C,MAAM,IAAI,SAAS,CAAC,sCAAsC,CAAC,CAAA;IAC7D,CAAC;IAED,IAAI,OAAY,CAAA;IAChB,IAAI,CAAC;QACH,OAAO,GAAG,IAAI,GAAG,CAAC,yCAAyC,EAAE,GAAG,CAAC,CAAA;QACjE,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,IAAI,OAAO,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;YAClE,MAAM,IAAI,SAAS,CAAC,sBAAsB,CAAC,CAAA;QAC7C,CAAC;IACH,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,IAAI,SAAS,CAAC,2CAA2C,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAA;IAClF,CAAC;IAED,KAAK,MAAM,MAAM,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,CAAU,EAAE,CAAC;QACjE,IAAI,OAAO,MAAM,EAAE,CAAC,MAAM,CAAC,KAAK,UAAU,EAAE,CAAC;YAC3C,MAAM,IAAI,SAAS,CAAC,gBAAgB,MAAM,qBAAqB,CAAC,CAAA;QAClE,CAAC;IACH,CAAC;IACD,IAAI,YAAY,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,YAAY,CAAC,EAAE,CAAC;QAC7D,MAAM,IAAI,SAAS,CAAC,sCAAsC,CAAC,CAAA;IAC7D,CAAC;IAED,MAAM,OAAO,GAAG,CACd,MAA2C,EAC3C,KAAc,EACd,OAAgB,EAChB,EAAE;QACF,IAAI,CAAC;YACH,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;gBAC1B,MAAM,CAAC,MAAM,CAAC,CAAC,KAAe,CAAC,CAAA;YACjC,CAAC;iBAAM,CAAC;gBACN,MAAM,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,OAAO,CAAC,CAAA;YAChC,CAAC;QACH,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,WAAW,CACjB,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,qBAAqB,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAC9E,CAAA;QACH,CAAC;IACH,CAAC,CAAA;IAED,IAAI,cAAc,GAA2C,IAAI,CAAA;IACjE,IAAI,EAAE,KAAK,IAAI,EAAE,CAAC;QAChB,IAAI,OAAO,EAAE,CAAC,MAAM,EAAE,OAAO,KAAK,UAAU,EAAE,CAAC;YAC7C,MAAM,IAAI,SAAS,CAAC,4CAA4C,CAAC,CAAA;QACnE,CAAC;QAED,IAAI,QAAkC,CAAA;QACtC,IAAI,MAAgC,CAAA;QACpC,IAAI,CAAC;YACH,QAAQ,GAAG,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,WAAW,EAAE,OAAO,CAAC,CAAA;YAClD,MAAM,GAAG,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC,CAAA;QAC9C,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,IAAI,SAAS,CAAC,gCAAgC,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAA;QACvE,CAAC;QACD,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,EAAE,CAAC;YAC/D,MAAM,IAAI,SAAS,CAAC,mDAAmD,CAAC,CAAA;QAC1E,CAAC;QAED,MAAM,OAAO,GAAG,IAAI,CAAC,aAAa,CAAC,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC,IAAI,CACzD,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,EAAE,KAAK,CAAC,EAAkB,EAAE;YAC5C,MAAM,aAAa,GAAG,eAAe,CAAC,OAAO,CAAC,CAAA;YAC9C,IAAI,aAAa,KAAK,IAAI,EAAE,CAAC;gBAC3B,OAAO,aAAa,CAAA;YACtB,CAAC;YAED,IAAI,UAAU,GAAY,KAAK,CAAA;YAC/B,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;gBACzB,MAAM,SAAS,GAAG,EAAE,CAAC,IAAI,IAAI,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,IAAI,IAAI,WAAW,EAAE,CAAA;gBACtE,sEAAsE;gBACtE,OAAO,KAAK,CAAC,IAAI,CACf,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,KAAK,WAAW,IAAI,CAAC,SAAS,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS,CAAC,CAChF;oBACC,CAAC,CAAC,IAAI;oBACN,CAAC,CAAC,IAAI,CAAA;YACV,CAAC;YACD,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;gBAChD,IAAI,CAAC;oBACH,UAAU,GAAI,KAAiC,CAAC,WAAW,CAAC,CAAA;gBAC9D,CAAC;gBAAC,MAAM,CAAC;oBACP,UAAU,GAAG,IAAI,CAAA;gBACnB,CAAC;YACH,CAAC;YACD,OAAO,eAAe,CAAC,UAAU,CAAC,CAAA;QACpC,CAAC,CAAC,CACH,CAAA;QACD,uEAAuE;QACvE,yCAAyC;QACzC,cAAc,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAiB,IAAI,CAAC,EAAE,OAAO,CAAC,CAAA;IACtE,CAAC;IAED,yEAAyE;IACzE,8DAA8D;IAC9D,4KAA4K;IAC5K,IAAI,MAAM,GAAiB,IAAI,CAAA;IAC/B,OAAO,CAAC,MAAM,EAAE,EAAE,GAAG,EAAE,EAAE,mBAAmB,CAAC,CAAA;IAC7C,IAAI,cAAc,KAAK,IAAI,EAAE,CAAC;QAC5B,OAAO,CAAC,MAAM,EAAE,EAAE,WAAW,EAAE,EAAE,+CAA+C,CAAC,CAAA;IACnF,CAAC;IAED,MAAM,MAAM,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,SAAS,KAAK,EAAE,EAAE,EAAE,CAAC,IAAI,CAAA;IAC9E,MAAM,WAAW,GAAG,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,CAAA;IAC7C,MAAM,OAAO,GAAG,kBAAkB,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,UAAU,OAAO,CAAC,GAAG,UAAU,QAAQ,KAAK,CAAA;IAEzG,IAAI,OAAO,GAAmB,IAAI,CAAA;IAClC,IAAI,QAAQ,GAAG,KAAK,CAAA;IACpB,IAAI,YAAY,GAAG,CAAC,CAAA;IACpB,IAAI,aAAa,GAAG,CAAC,CAAA;IACrB,IAAI,iBAAiB,GAAG,CAAC,CAAA;IACzB,IAAI,cAAc,GAAG,CAAC,CAAA;IACtB,MAAM,MAAM,GAAa,EAAE,CAAA;IAC3B,MAAM,WAAW,GAAa,EAAE,CAAA;IAChC,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAiB,CAAA;IAEzC,MAAM,cAAc,GAAG,CAAC,QAAgB,EAAE,iBAAiB,GAAG,CAAC,EAAE,EAAE;QACjE,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAA;QAC7B,WAAW,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAA;QACnC,aAAa,IAAI,WAAW,GAAG,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAA;QAC1D,iBAAiB,EAAE,CAAA;QACnB,cAAc,IAAI,iBAAiB,CAAA;IACrC,CAAC,CAAA;IAED,MAAM,gBAAgB,GAAG,CAAC,KAAa,EAAE,MAAc,EAAE,EAAE;QACzD,IAAI,KAAK,IAAI,CAAC,EAAE,CAAC;YACf,OAAM;QACR,CAAC;QACD,cAAc,CACZ,GAAG,IAAI,CAAC,SAAS,CAAC;YAChB,KAAK;YACL,MAAM;YACN,OAAO,EAAE,UAAU,EAAE;YACrB,YAAY,EAAE,IAAI,CAAC,GAAG,EAAE;YACxB,EAAE,EAAE,eAAe;YACnB,WAAW;YACX,GAAG,EAAE,OAAO,CAAC,GAAG;YAChB,GAAG,EAAE,QAAQ;SACd,CAAC,IAAI,EACN,KAAK,CACN,CAAA;IACH,CAAC,CAAA;IAUD,MAAM,SAAS,GAAG,GAAiB,EAAE;QACnC,IAAI,iBAAiB,KAAK,CAAC,EAAE,CAAC;YAC5B,OAAO,IAAI,CAAA;QACb,CAAC;QACD,MAAM,MAAM,GAAG;YACb,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;YACrB,KAAK,EAAE,aAAa;YACpB,SAAS,EAAE,iBAAiB;YAC5B,MAAM,EAAE,cAAc;YACtB,WAAW,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC;SACnC,CAAA;QACD,MAAM,CAAC,MAAM,GAAG,CAAC,CAAA;QACjB,aAAa,GAAG,CAAC,CAAA;QACjB,iBAAiB,GAAG,CAAC,CAAA;QACrB,cAAc,GAAG,CAAC,CAAA;QAClB,OAAO,MAAM,CAAA;IACf,CAAC,CAAA;IAED,MAAM,SAAS,GAAG,CAAC,IAAa,EAA8C,EAAE;QAC9E,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;YAC9C,OAAO,IAAI,CAAA;QACb,CAAC;QACD,KAAK,MAAM,MAAM,IAAI,IAAI,EAAE,CAAC;YAC1B,MAAM,KAAK,GAAI,IAA4C,CAAC,MAAM,CAAC,EAAE,KAAK,CAAA;YAC1E,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;gBAChD,OAAO,KAAK,CAAA;YACd,CAAC;QACH,CAAC;QACD,OAAO,IAAI,CAAA;IACb,CAAC,CAAA;IAED,MAAM,SAAS,GAAG,KAAK,EAAE,OAAc,EAAiB,EAAE;QACxD,IAAI,CAAC;YACH,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,MAAM,IAAI,CAAC,MAAM,UAAU,EAAE,CAAC,CAAA;YACzD,MAAM,KAAK,IAAI,KAAK,CAAC;gBACnB,gBAAgB,EAAE,EAAE,GAAG,IAAI;gBAC3B,UAAU,EAAE,CAAC;gBACb,WAAW,EAAE,CAAC;aACf,CAAC,CAAA;YACF,MAAM,EAAE,UAAU,EAAE,IAAI,EAAE,GAAG,MAAM,OAAO,CAAC,OAAO,EAAE;gBAClD,MAAM,EAAE,MAAM;gBACd,UAAU,EAAE,IAAI;gBAChB,OAAO,EAAE,YAAY;gBACrB,cAAc,EAAE,IAAI;gBACpB,WAAW,EAAE,IAAI;gBACjB,IAAI,EAAE,OAAO,CAAC,IAAI;gBAClB,UAAU,EAAE,MAAM;gBAClB,KAAK,EAAE,CAAC;gBACR,uEAAuE;gBACvE,sEAAsE;gBACtE,KAAK,EAAE,IAAI;aACZ,CAAC,CAAA;YACF,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,IAAI,EAAE,CAAA;YAC9B,IAAI,UAAU,GAAG,GAAG,IAAI,UAAU,IAAI,GAAG,EAAE,CAAC;gBAC1C,MAAM,MAAM,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,wBAAwB,UAAU,EAAE,CAAC,EAAE;oBACnE,UAAU;oBACV,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC;iBAC1B,CAAC,CAAA;YACJ,CAAC;YAED,IAAI,QAAsD,CAAA;YAC1D,IAAI,CAAC;gBACH,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAiD,CAAA;YAC7E,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,MAAM,IAAI,KAAK,CAAC,oCAAoC,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAA;YACvE,CAAC;YACD,IAAI,QAAQ,KAAK,IAAI,IAAI,OAAO,QAAQ,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;gBAC9D,MAAM,IAAI,KAAK,CAAC,2CAA2C,CAAC,CAAA;YAC9D,CAAC;YACD,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC;gBACrB,OAAM;YACR,CAAC;YAED,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAA;YACjE,IAAI,iBAAiB,GAAG,CAAC,CAAA;YACzB,IAAI,cAAc,GAAG,CAAC,CAAA;YACtB,IAAI,MAAM,GAA+C,IAAI,CAAA;YAC7D,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;gBACtC,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAA;gBACrB,MAAM,KAAK,GAAG,SAAS,CAAC,IAAI,CAAC,CAAA;gBAC7B,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;oBACnB,iBAAiB,EAAE,CAAA;oBACnB,cAAc,IAAI,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,CAAA;oBAC7C,MAAM,KAAK,KAAK,CAAA;gBAClB,CAAC;YACH,CAAC;YACD,IAAI,iBAAiB,KAAK,CAAC,EAAE,CAAC;gBAC5B,MAAM,IAAI,KAAK,CAAC,mDAAmD,CAAC,CAAA;YACtE,CAAC;YAED,OAAO,CACL,MAAM,EACN;gBACE,IAAI,EAAE,oBAAoB;gBAC1B,KAAK,EAAE,cAAc;gBACrB,SAAS,EAAE,iBAAiB;gBAC5B,KAAK;gBACL,IAAI,EAAE,MAAM,EAAE,IAAI;gBAClB,MAAM,EAAE,OAAO,MAAM,EAAE,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS;aACrF,EACD,gBAAgB,CACjB,CAAA;YACD,gBAAgB,CAAC,cAAc,EAAE,UAAU,CAAC,CAAA;QAC9C,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CACL,OAAO,EACP;gBACE,GAAG;gBACH,KAAK,EAAE,OAAO,CAAC,KAAK;gBACpB,SAAS,EAAE,OAAO,CAAC,SAAS;gBAC5B,KAAK,EAAE,OAAO,CAAC,MAAM;gBACrB,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC;aAClC,EACD,cAAc,CACf,CAAA;YACD,gBAAgB,CAAC,OAAO,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAA;QAC5C,CAAC;IACH,CAAC,CAAA;IAED,MAAM,UAAU,GAAG,GAAyB,EAAE;QAC5C,MAAM,OAAO,GAAG,SAAS,EAAE,CAAA;QAC3B,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;YACrB,OAAO,IAAI,CAAA;QACb,CAAC;QAED,YAAY,IAAI,OAAO,CAAC,KAAK,CAAA;QAC7B,MAAM,SAAS,GAAG,SAAS,CAAC,OAAO,CAAC,CAAA;QACpC,MAAM,OAAO,GAAG,SAAS,CAAC,OAAO,CAAC,GAAG,EAAE;YACrC,YAAY,IAAI,OAAO,CAAC,KAAK,CAAA;YAC7B,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,CAAA;QAC1B,CAAC,CAAC,CAAA;QACF,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,CAAA;QACrB,OAAO,OAAO,CAAA;IAChB,CAAC,CAAA;IAED,MAAM,aAAa,GAAG,KAAK,IAAI,EAAE;QAC/B,OAAO,QAAQ,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC;YACzB,MAAM,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAA;QAC7B,CAAC;IACH,CAAC,CAAA;IAED,IAAI,cAAc,GAAG,CAAC,CAAA;IACtB,IAAI,SAAS,GAA0B,IAAI,CAAA;IAC3C,MAAM,UAAU,GAAG,IAAI,GAAG,EAAkB,CAAA;IAE5C,MAAM,SAAS,GAAG,GAAG,EAAE;QACrB,IAAI,SAAS,KAAK,IAAI,EAAE,CAAC;YACvB,YAAY,CAAC,SAAS,CAAC,CAAA;YACvB,SAAS,GAAG,IAAI,CAAA;QAClB,CAAC;QACD,IAAI,UAAU,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;YAC1B,OAAM;QACR,CAAC;QACD,cAAc,GAAG,IAAI,CAAC,GAAG,EAAE,CAAA;QAC3B,KAAK,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,IAAI,UAAU,EAAE,CAAC;YACzC,OAAO,CAAC,MAAM,EAAE,EAAE,IAAI,EAAE,mBAAmB,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,eAAe,CAAC,CAAA;YACrF,gBAAgB,CAAC,KAAK,EAAE,MAAM,CAAC,CAAA;QACjC,CAAC;QACD,UAAU,CAAC,KAAK,EAAE,CAAA;IACpB,CAAC,CAAA;IAED,MAAM,QAAQ,GAAG,CAAC,MAAc,EAAE,EAAE;QAClC,UAAU,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAA;QACzD,MAAM,SAAS,GAAG,oBAAoB,GAAG,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,cAAc,CAAC,CAAA;QACtE,IAAI,cAAc,KAAK,CAAC,IAAI,SAAS,IAAI,CAAC,EAAE,CAAC;YAC3C,SAAS,EAAE,CAAA;QACb,CAAC;aAAM,IAAI,SAAS,KAAK,IAAI,EAAE,CAAC;YAC9B,SAAS,GAAG,UAAU,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC,KAAK,EAAE,CAAA;QACtD,CAAC;IACH,CAAC,CAAA;IAED,MAAM,QAAQ,GAAG,KAAK,IAAI,EAAE;QAC1B,SAAS,EAAE,CAAA;QACX,KAAK,UAAU,EAAE,CAAA;QACjB,MAAM,aAAa,EAAE,CAAA;QACrB,uEAAuE;QACvE,oEAAoE;QACpE,IAAI,iBAAiB,GAAG,CAAC,EAAE,CAAC;YAC1B,KAAK,UAAU,EAAE,CAAA;YACjB,MAAM,aAAa,EAAE,CAAA;QACvB,CAAC;IACH,CAAC,CAAA;IAED,MAAM,KAAK,GAAG,CAAC,CAAC,GAAoB,EAAE,EAAU,EAAE,EAAE;QAClD,IAAI,CAAC,OAAO,IAAI,QAAQ,EAAE,CAAC;YACzB,OAAM;QACR,CAAC;QACD,IAAI,YAAY,KAAK,CAAC,IAAI,YAAY,IAAI,KAAK,EAAE,CAAC;YAChD,QAAQ,CAAC,cAAc,CAAC,CAAA;YACxB,OAAM;QACR,CAAC;QAED,IAAI,GAAW,CAAA;QACf,IAAI,CAAC;YACH,MAAM,UAAU,GAAG,OAAO,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,CAAA;YACjE,IACE,OAAO,UAAU,KAAK,QAAQ;gBAC9B,UAAU,CAAC,UAAU,CAAC,CAAC,CAAC,KAAK,GAAG;gBAChC,UAAU,CAAC,UAAU,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC,KAAK,GAAG;gBACpD,OAAO,EAAE,KAAK,QAAQ,EACtB,CAAC;gBACD,MAAM,IAAI,SAAS,CAAC,gDAAgD,CAAC,CAAA;YACvE,CAAC;YACD,IAAI,aAAa,GAAG,UAAU,CAAC,MAAM,GAAG,CAAC,CAAA;YACzC,oEAAoE;YACpE,wEAAwE;YACxE,sEAAsE;YACtE,yCAAyC;YACzC,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,SAAS,KAAK,IAAI,CAAC,SAAS,EAAE,CAAC;gBAC5D,MAAM,MAAM,GAAY,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAA;gBAC9C,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,KAAK,IAAI,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;oBAC3E,MAAM,IAAI,SAAS,CAAC,gDAAgD,CAAC,CAAA;gBACvE,CAAC;gBACD,aAAa,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,MAAM,GAAG,CAAC,CAAA;YAChD,CAAC;YACD,MAAM,SAAS,GAAG,aAAa,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAA;YAC1C,GAAG,GAAG,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,SAAS,aAAa,UAAU,EAAE,iBAAiB,IAAI,CAAC,GAAG,EAAE,SAAS,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,GAAG,OAAO,EAAE,CAAA;QACzI,CAAC;QAAC,MAAM,CAAC;YACP,QAAQ,CAAC,WAAW,CAAC,CAAA;YACrB,OAAM;QACR,CAAC;QAED,cAAc,CAAC,GAAG,CAAC,CAAA;QACnB,IAAI,aAAa,IAAI,KAAK,EAAE,CAAC;YAC3B,KAAK,UAAU,EAAE,CAAA;QACnB,CAAC;IACH,CAAC,CAAU,CAAA;IAEX,KAAK,CAAC,SAAS,GAAG,SAAS,CAAA;IAC3B,KAAK,CAAC,KAAK,GAAG,IAAI,CAAA;IAClB,KAAK,CAAC,KAAK,GAAG,IAAI,CAAA;IAClB,KAAK,CAAC,KAAK,GAAG,GAAG,EAAE,CAAC,CAAC,QAAQ,IAAI,cAAc,KAAK,IAAI,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAA;IACvF,MAAM,aAAa,GAAG,IAAI,IAAI,CAAC,eAAe,CAAiB,IAAI,CAAC,CAAA;IACpE,MAAM,CAAC,cAAc,CAAC,KAAK,EAAE,UAAU,EAAE;QACvC,UAAU,EAAE,IAAI;QAChB,KAAK,EAAE,aAAa,CAAC,YAAY,EAAE;KACpC,CAAC,CAAA;IAEF,MAAM,MAAM,GAAG,IAAI,IAAI,CAAC,UAAU,CAAS,CAAC,UAAU,EAAE,EAAE;QACxD,kBAAkB,EAAE,CAAA;QACpB,MAAM,QAAQ,GAAG,CAAC,IAAY,EAAE,KAAa,EAAE,EAAE;YAC/C,IAAI,IAAI,KAAK,WAAW,EAAE,CAAC;gBACzB,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;YACxB,CAAC;QACH,CAAC,CAAA;QACD,cAAc,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAA;QAC5B,UAAU,CAAC,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAA;QACnD,OAAO,GAAG,EAAE,CAAC,cAAc,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAA;IAC9C,CAAC,CAAC,CAAC,IAAI,CACL,IAAI,CAAC,SAAS,CAAC,CAAC,KAAK,EAAE,EAAE,CACvB,WAAW,CAAC,KAAK,CAAC,CAAC,IAAI,CACrB,IAAI,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE;QAClB,IAAI,CAAC,MAAM,IAAI,YAAY,CAAC,GAAG,CAAC,WAAW,CAAC,KAAK,KAAK,EAAE,CAAC;YACvD,YAAY,CAAC,MAAM,CAAC,WAAW,CAAC,CAAA;QAClC,CAAC;IACH,CAAC,CAAC,CACH,CACF,CACF,CAAA;IAED,MAAM,UAAU,GAAG,YAAY;QAC7B,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAiB,IAAI,CAAC,EAAE,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC,CAAC;QAC1F,CAAC,CAAC,IAAI,CAAC,EAAE,CAAiB,IAAI,CAAC,CAAA;IAEjC,MAAM,WAAW,GAAG,CAAC,KAAa,EAAE,EAAE;QACpC,YAAY,CAAC,kBAAkB,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,YAAY,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC,GAAG,KAAK,CAAC,CAAA;IACjG,CAAC,CAAA;IAED,MAAM,UAAU,GAAG,CAAC,KAAc,EAAE,EAAE;QACpC,IAAI,QAAQ,IAAI,KAAK,KAAK,OAAO,EAAE,CAAC;YAClC,OAAM;QACR,CAAC;QACD,MAAM,UAAU,GAAG,OAAO,KAAK,IAAI,CAAA;QACnC,OAAO,GAAG,KAAK,CAAA;QACf,IAAI,KAAK,EAAE,CAAC;YACV,KAAK,CAAC,KAAK,GAAG,KAAK,CAAA;YACnB,KAAK,CAAC,KAAK,GAAG,KAAK,CAAA;YACnB,IAAI,CAAC,UAAU,EAAE,CAAC;gBAChB,WAAW,CAAC,CAAC,CAAC,CAAA;YAChB,CAAC;YACD,OAAO,CAAC,OAAO,EAAE,eAAe,CAAC,CAAA;QACnC,CAAC;aAAM,CAAC;YACN,KAAK,CAAC,KAAK,GAAG,IAAI,CAAA;YAClB,KAAK,CAAC,KAAK,GAAG,IAAI,CAAA;YAClB,IAAI,UAAU,EAAE,CAAC;gBACf,WAAW,CAAC,CAAC,CAAC,CAAC,CAAA;YACjB,CAAC;YACD,OAAO,CAAC,OAAO,EAAE,gBAAgB,CAAC,CAAA;YAClC,SAAS,EAAE,CAAA;YACX,KAAK,QAAQ,EAAE,CAAA;QACjB,CAAC;QACD,6DAA6D;QAC7D,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;IAC3B,CAAC,CAAA;IAED,IAAI,mBAAmB,GAA6B,IAAI,CAAA;IACxD,mBAAmB,GAAG,IAAI;SACvB,aAAa,CAAC,CAAC,cAAc,IAAI,IAAI,CAAC,EAAE,CAAiB,IAAI,CAAC,EAAE,MAAM,EAAE,UAAU,CAAC,CAAC;SACpF,IAAI,CACH,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,EAAE,KAAK,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,MAAM,IAAI,CAAC,KAAK,IAAI,IAAI,KAAK,IAAI,CAAC,CAAC,EACvE,IAAI,CAAC,KAAK,CAAC;QACT,cAAc,EAAE,IAAI;QACpB,KAAK,EAAE,CAAC,GAAG,EAAE,UAAU,EAAE,EAAE;YACzB,OAAO,CAAC,OAAO,EAAE,EAAE,GAAG,EAAE,UAAU,EAAE,EAAE,gCAAgC,CAAC,CAAA;YACvE,OAAO,UAAU,CAAC,IAAI,CAAC,CAAA;QACzB,CAAC;KACF,CAAC,EACF,IAAI,CAAC,oBAAoB,EAAE,CAC5B;SACA,SAAS,CAAC;QACT,IAAI,EAAE,UAAU;QAChB,KAAK,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,GAAG,EAAE,EAAE,sBAAsB,CAAC;KAClE,CAAC,CAAA;IAEJ,IAAI,cAAc,GAAyB,IAAI,CAAA;IAC/C,MAAM,OAAO,GAAG,KAAK,IAAI,EAAE;QACzB,QAAQ,GAAG,IAAI,CAAA;QACf,IAAI,QAAQ,EAAE,KAAK,KAAK,EAAE,CAAC;YACzB,YAAY,CAAC,SAAS,CAAC,CAAA;QACzB,CAAC;QACD,aAAa,CAAC,aAAa,CAAC,CAAA;QAC5B,mBAAmB,EAAE,WAAW,EAAE,CAAA;QAClC,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;YACrB,WAAW,CAAC,CAAC,CAAC,CAAC,CAAA;QACjB,CAAC;QACD,OAAO,GAAG,KAAK,CAAA;QACf,KAAK,CAAC,KAAK,GAAG,IAAI,CAAA;QAClB,KAAK,CAAC,KAAK,GAAG,IAAI,CAAA;QAClB,IAAI,aAAa,CAAC,QAAQ,EAAE,KAAK,KAAK,EAAE,CAAC;YACvC,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;QAC3B,CAAC;QACD,aAAa,CAAC,QAAQ,EAAE,CAAA;QACxB,SAAS,EAAE,CAAA;QACX,MAAM,QAAQ,EAAE,CAAA;QAChB,MAAM,MAAM,EAAE,KAAK,EAAE,CAAA;IACvB,CAAC,CAAA;IAED,KAAK,CAAC,MAAM,CAAC,YAAY,CAAC,GAAG,GAAG,EAAE;QAChC,IAAI,cAAc,KAAK,IAAI,EAAE,CAAC;YAC5B,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,aAAa,EAAQ,CAAA;YAClE,cAAc,GAAG,OAAO,CAAA;YACxB,KAAK,OAAO,EAAE,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAA;QACtC,CAAC;QACD,OAAO,cAAc,CAAA;IACvB,CAAC,CAAA;IAED,wEAAwE;IACxE,+CAA+C;IAC/C,MAAM,aAAa,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC,KAAK,UAAU,EAAE,EAAE,IAAI,CAAC,CAAC,KAAK,EAAE,CAAA;IAExE,OAAO,KAAK,CAAA;AACd,CAAC"} |
+17
-11
| { | ||
| "name": "@nxtedition/trace", | ||
| "version": "1.1.4", | ||
| "version": "2.0.0", | ||
| "type": "module", | ||
@@ -8,3 +8,10 @@ "main": "lib/index.js", | ||
| "exports": { | ||
| ".": "./lib/index.js" | ||
| ".": { | ||
| "types": "./lib/index.d.ts", | ||
| "default": "./lib/index.js" | ||
| }, | ||
| "./core": { | ||
| "types": "./lib/core.d.ts", | ||
| "default": "./lib/core.js" | ||
| } | ||
| }, | ||
@@ -22,18 +29,17 @@ "files": [ | ||
| "build": "rimraf lib && tsc -p tsconfig.build.json", | ||
| "typecheck": "tsc --noEmit", | ||
| "typecheck": "tsc -p tsconfig.json", | ||
| "test": "yarn build && node --test", | ||
| "test:ci": "yarn build && node --test" | ||
| "test:ci": "node --test" | ||
| }, | ||
| "dependencies": { | ||
| "@nxtedition/nxt-undici": "^7.3.27", | ||
| "lodash": "^4.18.1", | ||
| "rxjs": "^7.0.0" | ||
| "@nxtedition/nxt-undici": "^8.0.4", | ||
| "rxjs": "^7.8.2" | ||
| }, | ||
| "devDependencies": { | ||
| "@types/node": "^25.9.4", | ||
| "oxlint-tsgolint": "^0.23.0", | ||
| "@types/node": "^26.1.1", | ||
| "es-module-lexer": "^2.3.1", | ||
| "rimraf": "^6.1.3", | ||
| "typescript": "^5.9.3" | ||
| "typescript": "^7.0.2" | ||
| }, | ||
| "gitHead": "53fdc3a961a0df3cad75c7d25dce565bd5f8e5ef" | ||
| "gitHead": "756528b231bf3618493c73d7aeaf05ed31ac9f05" | ||
| } |
Major refactor
Supply chain riskPackage has recently undergone a major refactor. It may be unstable or indicate significant internal changes. Use caution when updating to versions that include significant changes.
66528
23.62%2
-33.33%9
80%904
29.14%1
Infinity%+ Added
+ Added
+ Added
+ Added
+ Added
- Removed
- Removed
- Removed
- Removed
- Removed
Updated