@autofleet/outbreak 2.1.0 → 2.3.0-beta-91bc0ca7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.cjs ADDED
@@ -0,0 +1,2 @@
1
+ 'use strict';Object.defineProperty(exports,'__esModule',{value:true});var winston=require('winston'),c=require('node:http'),node_crypto=require('node:crypto'),x=require('node:async_hooks');function _interopDefault(e){return e&&e.__esModule?e:{default:e}}var c__default=/*#__PURE__*/_interopDefault(c);var x__default=/*#__PURE__*/_interopDefault(x);var b=(e=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(e,{get:(t,r)=>(typeof require<"u"?require:t)[r]}):e)(function(e){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+e+'" is not supported')});var f={HTTP_REQUEST:"httpRequest",WEB_SOCKET:"webSocket",RABBIT:"rabbit"};var p=Symbol("outbreak-wrapped"),S=()=>node_crypto.randomUUID().split("-")[0],I=e=>e instanceof Request||Object.prototype.toString.call(e)==="[object Request]",L=e=>e instanceof Headers||Object.prototype.toString.call(e)==="[object Headers]";function k(e,t,r,s){let o=r.headers[e.correlationIdHeader]??S();t.getCurrentTrace().context.set(e.correlationIdHeader,o),s.setHeader(e.correlationIdHeader,o);}function O(e,t,r,s){e.setAndPropagateCorrelationId&&k(e,t,r,s),Object.entries(r.headers).forEach(([o,n])=>{(e.headersToCollect.has(o)||o.startsWith(e.headersPrefix))&&typeof n<"u"&&t.getCurrentTrace().context.set(o,n);});}function M(e,t,r){return (s,o,n,a)=>{t.newTrace(f.HTTP_REQUEST),O(e,t,s,o),r(s,o,n,a);}}function P(e,t){if(c__default.default.createServer[p])return;let r=c__default.default.createServer;function s(o,n){return n=n||o,r(M(e,t,n))}s[p]=true,c__default.default.createServer=s;}function m(e,t){let r=e.getCurrentTrace().context;r&&(t.headers||={},[...r.keys()].forEach(s=>{t.headers[s]=r.get(s);}));}function v(e,t){if(c__default.default[t][p])return;let r=c__default.default[t];function s(a,i,u){return m(e,i),r(a,i,u)}function o(a,i){return m(e,a),r(a,i)}function n(...a){let i={},u,h;return a.length===3?([u,i,h]=a,s(u,i,h)):([i,h]=a,o(i,h))}n[p]=true,c__default.default[t]=n;}function q(e,t){let r=e.getCurrentTrace()?.context;if(r)for(let s of r.keys())t.set(s,r.get(s));}function U(e){if(globalThis.fetch[p])return;let t=globalThis.fetch;globalThis.fetch=(r,s)=>(I(r)&&r.headers&&!s?.headers?q(e,r.headers):(s??={},s.headers??=new Headers,L(s.headers)||(s.headers=new Headers(s.headers)),q(e,s.headers)),t(r,s)),globalThis.fetch[p]=true;}function g(e,t){P(e,t),v(t,"request"),v(t,"get"),U(t);}var y="x-trace-id",E=e=>{if(!Array.isArray(e))throw new Error("Header list is not an array");let t=/^[\x21-\x7e]+$/i,r=e.filter(s=>typeof s!="string"||!t.test(s));if(r.length>0)throw new Error(`Header list contains invalid headers: ${r}`)},A=(e={})=>{let{setAndPropagateCorrelationId:t=true,headersToPropagate:r=["x-request-id","x-variant-id"],headersPrefix:s="x-af-"}=e;return E(r),{setAndPropagateCorrelationId:t,correlationIdHeader:y,headersToCollect:new Set(r),headersPrefix:s}},R={load:A,correlationIdHeader:y};var T=class{constructor(t){this.type=t;this.id=node_crypto.randomUUID();this.context=new Map;}},l=class{constructor(){this.#t=false;this.#r=new Map;this.#e={currentTrace:null,traces:{}};this.#s=x__default.default.createHook({init:(t,r,s)=>{this.#e.traces[s]&&(this.#e.traces[t]=this.#e.traces[s]);},before:t=>{this.#e.traces[t]&&(this.#r.set(t,this.#e.currentTrace),this.#e.currentTrace=this.#e.traces[t]);},after:t=>{this.#e.traces[t]&&(this.#e.currentTrace=this.#r.get(t));},destroy:t=>{this.#e.traces[t]&&(delete this.#e.traces[t],this.#r.delete(t));}});this.enable=()=>(this.#t||(this.#s.enable(),this.#t=true),this.#s);this.newTrace=t=>{this.#t||this.enable();let r=new T(t);return this.#e.currentTrace=r,this.#e.traces[x__default.default.executionAsyncId()]=r,r};this.getCurrentTrace=()=>this.#e.currentTrace||{};}#t;#r;#e;#s};var d=new l,C=e=>({[e]:d.getCurrentTrace()?.context?.get(R.correlationIdHeader)}),F=e=>winston.format(t=>Object.assign(t,C(e)));function K(e){g(R.load(e),d),d.enable();let t=e.loggerTraceKey||"traceId";e.winstonLogger&&(e.winstonLogger.format=winston.format.combine(F(t)(),e.winstonLogger.format)),e.contextMiddlewareGetter?.(()=>C(t));try{b("bluebird").config({asyncHooks:!0});}catch{}}var te=()=>d.getCurrentTrace(),{newTrace:re}=d;exports.default=K;exports.getCurrentContext=te;exports.newTrace=re;exports.traceTypes=f;//# sourceMappingURL=index.cjs.map
2
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/const.ts","../src/http_wrapper.ts","../src/config.ts","../src/tracer.ts","../src/index.ts"],"names":["traceTypes","kOutbreakWrapped","generateShortId","randomUUID","isFetchRequest","headers","isFetchHeaders","setAndCollectCorrelationId","config","tracer","req","res","correlationId","collect","headerName","value","wrappedListener","listener","next","error","wrapHttpCreateServer","http","originalHttpCreateServer","wrappedHttpCreateServer","options","inject","currentTraceContext","header","wrapHttpRequest","originalMethodName","originalMethod","urlFirst","url","cb","optionsFirst","wrappedHttpRequest","args","callback","injectInFetchRequest","wrapFetch","originalFetch","input","init","wrapHttp","correlationIdHeader","validateHeaderList","headerNameRegex","invalidHeaders","h","load","overrides","setAndPropagateCorrelationId","headersToPropagate","headersPrefix","config_default","Trace","type","Tracer","#isTraceEnabled","#prevStates","#tracer","#hook","asyncHooks","asyncId","_type","triggerAsyncId","currentTrace","contextMiddleware","loggerTraceKey","addMetadataToLog","format","info","outbreakInitialize","traceKey","getCurrentContext","newTrace"],"mappings":"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","file":"index.cjs","sourcesContent":["export const traceTypes = {\n HTTP_REQUEST: 'httpRequest',\n WEB_SOCKET: 'webSocket',\n RABBIT: 'rabbit',\n} as const;\nexport type TraceType = typeof traceTypes[keyof typeof traceTypes];\n","import http from 'node:http';\nimport { randomUUID } from 'node:crypto';\nimport type { URL } from 'node:url';\nimport { traceTypes } from './const';\nimport type { Tracer } from './tracer';\nimport type { LoadedConfig } from './config';\n\nexport const kOutbreakWrapped = Symbol('outbreak-wrapped');\nconst generateShortId = () => randomUUID().split('-')[0];\nconst isFetchRequest = (headers: unknown): headers is Request => headers instanceof Request || Object.prototype.toString.call(headers) === '[object Request]';\nconst isFetchHeaders = (headers: unknown): headers is Headers => headers instanceof Headers || Object.prototype.toString.call(headers) === '[object Headers]';\n\nfunction setAndCollectCorrelationId(config: LoadedConfig, tracer: Tracer, req: http.IncomingMessage, res: http.ServerResponse<http.IncomingMessage>): void {\n const correlationId = req.headers[config.correlationIdHeader] ?? generateShortId();\n tracer.getCurrentTrace().context.set(config.correlationIdHeader, correlationId as string);\n res.setHeader(config.correlationIdHeader, correlationId);\n}\n\nfunction collect(config: LoadedConfig, tracer: Tracer, req: http.IncomingMessage, res: http.ServerResponse<http.IncomingMessage>): void {\n if (config.setAndPropagateCorrelationId) {\n setAndCollectCorrelationId(config, tracer, req, res);\n }\n\n Object.entries(req.headers).forEach(([headerName, value]) => {\n const shouldCollect = config.headersToCollect.has(headerName) || headerName.startsWith(config.headersPrefix);\n if (shouldCollect && typeof value !== 'undefined') {\n tracer.getCurrentTrace().context.set(headerName, value as string);\n }\n });\n}\n\nfunction wrappedListener<\n Request extends typeof http.IncomingMessage = typeof http.IncomingMessage,\n Response extends typeof http.ServerResponse = typeof http.ServerResponse,\n>(\n config: LoadedConfig,\n tracer: Tracer,\n listener: http.RequestListener<Request, Response>,\n): http.RequestListener<Request, Response> {\n // @ts-expect-error we add next and error which don't exist on the original type\n return (req: http.IncomingMessage, res: http.ServerResponse, next: unknown, error: unknown): void => {\n tracer.newTrace(traceTypes.HTTP_REQUEST);\n\n collect(config, tracer, req, res);\n\n // @ts-expect-error we add next and error which don't exist on the original type\n listener(req, res, next, error);\n };\n}\n\nfunction wrapHttpCreateServer<\n Request extends typeof http.IncomingMessage = typeof http.IncomingMessage,\n Response extends typeof http.ServerResponse = typeof http.ServerResponse,\n>(config: LoadedConfig, tracer: Tracer): void {\n if (http.createServer[kOutbreakWrapped]) {\n return;\n }\n const originalHttpCreateServer = http.createServer;\n // args of http.createServer are ([options<Object>], [listener<Fn>]) Express only sends listener\n function wrappedHttpCreateServer(options: http.ServerOptions<Request, Response>, listener?: http.RequestListener<Request, Response>): http.Server<Request, Response>;\n function wrappedHttpCreateServer(listener?: http.RequestListener<Request, Response>): http.Server<Request, Response>;\n function wrappedHttpCreateServer(\n options: http.ServerOptions<Request, Response> | http.RequestListener<Request, Response>,\n listener?: http.RequestListener<Request, Response>,\n ): http.Server<Request, Response> {\n listener = listener || options as http.RequestListener<Request, Response>;\n return originalHttpCreateServer<Request, Response>(wrappedListener(config, tracer, listener));\n }\n wrappedHttpCreateServer[kOutbreakWrapped] = true;\n http.createServer = wrappedHttpCreateServer;\n}\n\nfunction inject(tracer: Tracer, options: http.RequestOptions): void {\n const currentTraceContext = tracer.getCurrentTrace().context;\n if (currentTraceContext) {\n options.headers ||= {};\n [...(currentTraceContext.keys())].forEach((header) => {\n options.headers[header] = currentTraceContext.get(header);\n });\n }\n}\nfunction wrapHttpRequest(tracer: Tracer, originalMethodName: 'request' | 'get'): void {\n if (http[originalMethodName][kOutbreakWrapped]) {\n return;\n }\n const originalMethod = http[originalMethodName];\n function urlFirst(url: string | URL, options: http.RequestOptions, cb: (res: http.IncomingMessage) => void): http.ClientRequest {\n inject(tracer, options);\n\n return originalMethod(url, options, cb);\n }\n\n function optionsFirst(options: http.RequestOptions, cb: (res: http.IncomingMessage) => void): http.ClientRequest {\n inject(tracer, options);\n\n return originalMethod(options, cb);\n }\n\n function wrappedHttpRequest(options: string | http.RequestOptions | URL, callback?: (res: http.IncomingMessage) => void): http.ClientRequest;\n function wrappedHttpRequest(url: string | URL, options: http.RequestOptions, callback?: (res: http.IncomingMessage) => void): http.ClientRequest;\n function wrappedHttpRequest(...args): http.ClientRequest {\n let options = {};\n let url: string | URL;\n let callback: (res: http.IncomingMessage) => void;\n\n if (args.length === 3) {\n [url, options, callback] = args;\n return urlFirst(url, options, callback);\n }\n [options, callback] = args;\n return optionsFirst(options, callback);\n }\n wrappedHttpRequest[kOutbreakWrapped] = true;\n http[originalMethodName] = wrappedHttpRequest;\n}\n\nfunction injectInFetchRequest(tracer: Tracer, headers: Headers): void {\n const currentTraceContext = tracer.getCurrentTrace()?.context;\n /* c8 ignore next 3 */\n if (!currentTraceContext) {\n return;\n }\n // eslint-disable-next-line no-restricted-syntax\n for (const header of currentTraceContext.keys()) {\n headers.set(header, currentTraceContext.get(header));\n }\n}\n\nfunction wrapFetch(tracer: Tracer): void {\n if (globalThis.fetch[kOutbreakWrapped]) {\n return;\n }\n const originalFetch = globalThis.fetch;\n globalThis.fetch = (input: string | URL | Request, init?: RequestInit): Promise<Response> => {\n if (isFetchRequest(input) && input.headers && !init?.headers) {\n injectInFetchRequest(tracer, input.headers);\n } else {\n init ??= {};\n init.headers ??= new Headers();\n if (!isFetchHeaders(init.headers)) {\n init.headers = new Headers(init.headers);\n }\n injectInFetchRequest(tracer, init.headers);\n }\n return originalFetch(input, init);\n };\n globalThis.fetch[kOutbreakWrapped] = true;\n}\n\nexport default function wrapHttp(config: LoadedConfig, tracer: Tracer): void {\n wrapHttpCreateServer(config, tracer);\n wrapHttpRequest(tracer, 'request');\n wrapHttpRequest(tracer, 'get');\n wrapFetch(tracer);\n}\n","const correlationIdHeader = 'x-trace-id';\n\nconst validateHeaderList = (headers: string[]): void => {\n if (!Array.isArray(headers)) {\n throw new Error('Header list is not an array');\n }\n\n // could be tighter - ASCII code between 33 and 126 at the moment\n const headerNameRegex = /^[\\x21-\\x7e]+$/i;\n\n const invalidHeaders = headers.filter((h) => typeof h !== 'string' || !headerNameRegex.test(h));\n\n if (invalidHeaders.length > 0) {\n throw new Error(`Header list contains invalid headers: ${invalidHeaders}`);\n }\n};\n\nexport interface Overrides {\n setAndPropagateCorrelationId?: boolean;\n headersToPropagate?: string[];\n headersPrefix?: string;\n}\n\nexport interface LoadedConfig extends Required<Pick<Overrides, 'setAndPropagateCorrelationId' | 'headersPrefix'>> {\n correlationIdHeader: string;\n headersToCollect: Set<string>;\n}\n\nconst load = (overrides: Overrides = {}): LoadedConfig => {\n const {\n setAndPropagateCorrelationId = true,\n headersToPropagate = [\n 'x-request-id',\n 'x-variant-id',\n ],\n headersPrefix = 'x-af-',\n } = overrides;\n\n validateHeaderList(headersToPropagate);\n\n return {\n setAndPropagateCorrelationId,\n correlationIdHeader,\n headersToCollect: new Set(headersToPropagate),\n headersPrefix,\n };\n};\n\nexport default {\n load,\n correlationIdHeader,\n};\n","import asyncHooks from 'node:async_hooks';\nimport { randomUUID } from 'node:crypto';\nimport type { TraceType } from './const';\n\ninterface TraceHolder {\n currentTrace: Trace | null;\n traces: Record<number, Trace>;\n}\n\nexport class Trace {\n public readonly id = randomUUID();\n\n public readonly context = new Map<string, string>();\n\n constructor(public type: TraceType) {}\n}\n\nexport class Tracer {\n #isTraceEnabled = false;\n\n #prevStates = new Map<number, Trace>();\n\n #tracer: TraceHolder = {\n currentTrace: null,\n traces: {},\n };\n\n #hook = asyncHooks.createHook({\n init: (asyncId, _type, triggerAsyncId) => {\n if (!this.#tracer.traces[triggerAsyncId]) {\n return;\n }\n this.#tracer.traces[asyncId] = this.#tracer.traces[triggerAsyncId];\n },\n before: (asyncId) => {\n if (!this.#tracer.traces[asyncId]) {\n return;\n }\n this.#prevStates.set(asyncId, this.#tracer.currentTrace);\n this.#tracer.currentTrace = this.#tracer.traces[asyncId];\n },\n after: (asyncId) => {\n if (!this.#tracer.traces[asyncId]) {\n return;\n }\n this.#tracer.currentTrace = this.#prevStates.get(asyncId);\n },\n destroy: (asyncId) => {\n if (this.#tracer.traces[asyncId]) {\n delete this.#tracer.traces[asyncId];\n this.#prevStates.delete(asyncId);\n }\n },\n });\n\n public enable = (): asyncHooks.AsyncHook => {\n if (!this.#isTraceEnabled) {\n this.#hook.enable();\n this.#isTraceEnabled = true;\n }\n return this.#hook;\n };\n\n public newTrace = (type: TraceType): Trace => {\n if (!this.#isTraceEnabled) {\n this.enable();\n }\n const currentTrace = new Trace(type);\n this.#tracer.currentTrace = currentTrace;\n this.#tracer.traces[asyncHooks.executionAsyncId()] = currentTrace;\n return currentTrace;\n };\n\n public getCurrentTrace = (): Trace | Record<string, never> => this.#tracer.currentTrace || {};\n}\n","import winston, { format } from 'winston';\n\nimport httpWrapper from './http_wrapper';\nimport config, { type Overrides } from './config';\nimport { type Trace, Tracer } from './tracer';\n\nexport { traceTypes } from './const';\n\nconst tracer = new Tracer();\n\ninterface Options extends Overrides {\n winstonLogger?: winston.Logger;\n contextMiddlewareGetter?: (middleware: () => Record<string, unknown>) => void;\n loggerTraceKey? : string;\n}\n\nconst contextMiddleware = (loggerTraceKey: string) => ({\n [loggerTraceKey]: tracer.getCurrentTrace()?.context?.get(config.correlationIdHeader),\n});\nconst addMetadataToLog = (loggerTraceKey: string) => format((info) => Object.assign(info, contextMiddleware(loggerTraceKey)));\n\nexport default function outbreakInitialize(options: Options): void {\n httpWrapper(config.load(options), tracer);\n tracer.enable();\n\n const traceKey = options.loggerTraceKey || 'traceId';\n if (options.winstonLogger) {\n // eslint-disable-next-line no-param-reassign\n options.winstonLogger.format = format.combine(\n addMetadataToLog(traceKey)(),\n options.winstonLogger.format,\n );\n }\n options.contextMiddlewareGetter?.(() => contextMiddleware(traceKey));\n\n // Make an attempt to enable async hooks for bluebird, if available\n try {\n // eslint-disable-next-line global-require, @typescript-eslint/no-var-requires\n const bluebird = require('bluebird');\n bluebird.config({ asyncHooks: true });\n /* c8 ignore next */\n } catch (e) { /* ignore */ }\n}\n\nexport const getCurrentContext = (): Trace | Record<string, never> => tracer.getCurrentTrace();\n\nexport const { newTrace } = tracer;\n"]}
@@ -0,0 +1,32 @@
1
+ import winston from 'winston';
2
+
3
+ declare const traceTypes: {
4
+ readonly HTTP_REQUEST: "httpRequest";
5
+ readonly WEB_SOCKET: "webSocket";
6
+ readonly RABBIT: "rabbit";
7
+ };
8
+ type TraceType = typeof traceTypes[keyof typeof traceTypes];
9
+
10
+ interface Overrides {
11
+ setAndPropagateCorrelationId?: boolean;
12
+ headersToPropagate?: string[];
13
+ headersPrefix?: string;
14
+ }
15
+
16
+ declare class Trace {
17
+ type: TraceType;
18
+ readonly id: `${string}-${string}-${string}-${string}-${string}`;
19
+ readonly context: Map<string, string>;
20
+ constructor(type: TraceType);
21
+ }
22
+
23
+ interface Options extends Overrides {
24
+ winstonLogger?: winston.Logger;
25
+ contextMiddlewareGetter?: (middleware: () => Record<string, unknown>) => void;
26
+ loggerTraceKey?: string;
27
+ }
28
+ declare function outbreakInitialize(options: Options): void;
29
+ declare const getCurrentContext: () => Trace | Record<string, never>;
30
+ declare const newTrace: (type: TraceType) => Trace;
31
+
32
+ export { outbreakInitialize as default, getCurrentContext, newTrace, traceTypes };
package/dist/index.d.ts CHANGED
@@ -1,11 +1,32 @@
1
1
  import winston from 'winston';
2
- import { type Overrides } from './config';
3
- import { type Trace } from './tracer';
4
- export { traceTypes } from './const';
2
+
3
+ declare const traceTypes: {
4
+ readonly HTTP_REQUEST: "httpRequest";
5
+ readonly WEB_SOCKET: "webSocket";
6
+ readonly RABBIT: "rabbit";
7
+ };
8
+ type TraceType = typeof traceTypes[keyof typeof traceTypes];
9
+
10
+ interface Overrides {
11
+ setAndPropagateCorrelationId?: boolean;
12
+ headersToPropagate?: string[];
13
+ headersPrefix?: string;
14
+ }
15
+
16
+ declare class Trace {
17
+ type: TraceType;
18
+ readonly id: `${string}-${string}-${string}-${string}-${string}`;
19
+ readonly context: Map<string, string>;
20
+ constructor(type: TraceType);
21
+ }
22
+
5
23
  interface Options extends Overrides {
6
24
  winstonLogger?: winston.Logger;
25
+ contextMiddlewareGetter?: (middleware: () => Record<string, unknown>) => void;
7
26
  loggerTraceKey?: string;
8
27
  }
9
- export default function outbreakInitialize(options: Options): void;
10
- export declare const getCurrentContext: () => Trace | Record<string, never>;
11
- export declare const newTrace: (type: import("./const").TraceType) => Trace;
28
+ declare function outbreakInitialize(options: Options): void;
29
+ declare const getCurrentContext: () => Trace | Record<string, never>;
30
+ declare const newTrace: (type: TraceType) => Trace;
31
+
32
+ export { outbreakInitialize as default, getCurrentContext, newTrace, traceTypes };
package/dist/index.js CHANGED
@@ -1,43 +1,2 @@
1
- "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.newTrace = exports.getCurrentContext = exports.traceTypes = void 0;
7
- const winston_1 = require("winston");
8
- const http_wrapper_1 = __importDefault(require("./http_wrapper"));
9
- const config_1 = __importDefault(require("./config"));
10
- const tracer_1 = require("./tracer");
11
- var const_1 = require("./const");
12
- Object.defineProperty(exports, "traceTypes", { enumerable: true, get: function () { return const_1.traceTypes; } });
13
- const tracer = new tracer_1.Tracer();
14
- const addMetadataToLog = (loggerTraceKey) => (0, winston_1.format)((info) => {
15
- const currentTraceContext = tracer.getCurrentTrace()?.context;
16
- if (currentTraceContext) {
17
- // eslint-disable-next-line no-param-reassign
18
- info[loggerTraceKey] = currentTraceContext.get(config_1.default.correlationIdHeader);
19
- }
20
- return info;
21
- });
22
- function outbreakInitialize(options) {
23
- (0, http_wrapper_1.default)(config_1.default.load(options), tracer);
24
- tracer.enable();
25
- if (options.winstonLogger) {
26
- const traceKey = options.loggerTraceKey || 'traceId';
27
- // eslint-disable-next-line no-param-reassign
28
- options.winstonLogger.format = winston_1.format.combine(addMetadataToLog(traceKey)(), options.winstonLogger.format);
29
- }
30
- // Make an attempt to enable async hooks for bluebird, if available
31
- try {
32
- // eslint-disable-next-line global-require, @typescript-eslint/no-var-requires
33
- const bluebird = require('bluebird');
34
- bluebird.config({ asyncHooks: true });
35
- /* c8 ignore next */
36
- }
37
- catch (e) { /* ignore */ }
38
- }
39
- exports.default = outbreakInitialize;
40
- const getCurrentContext = () => tracer.getCurrentTrace();
41
- exports.getCurrentContext = getCurrentContext;
42
- exports.newTrace = tracer.newTrace;
1
+ import {format}from'winston';import c from'node:http';import {randomUUID}from'node:crypto';import x from'node:async_hooks';var b=(e=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(e,{get:(t,r)=>(typeof require<"u"?require:t)[r]}):e)(function(e){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+e+'" is not supported')});var f={HTTP_REQUEST:"httpRequest",WEB_SOCKET:"webSocket",RABBIT:"rabbit"};var p=Symbol("outbreak-wrapped"),S=()=>randomUUID().split("-")[0],I=e=>e instanceof Request||Object.prototype.toString.call(e)==="[object Request]",L=e=>e instanceof Headers||Object.prototype.toString.call(e)==="[object Headers]";function k(e,t,r,s){let o=r.headers[e.correlationIdHeader]??S();t.getCurrentTrace().context.set(e.correlationIdHeader,o),s.setHeader(e.correlationIdHeader,o);}function O(e,t,r,s){e.setAndPropagateCorrelationId&&k(e,t,r,s),Object.entries(r.headers).forEach(([o,n])=>{(e.headersToCollect.has(o)||o.startsWith(e.headersPrefix))&&typeof n<"u"&&t.getCurrentTrace().context.set(o,n);});}function M(e,t,r){return (s,o,n,a)=>{t.newTrace(f.HTTP_REQUEST),O(e,t,s,o),r(s,o,n,a);}}function P(e,t){if(c.createServer[p])return;let r=c.createServer;function s(o,n){return n=n||o,r(M(e,t,n))}s[p]=true,c.createServer=s;}function m(e,t){let r=e.getCurrentTrace().context;r&&(t.headers||={},[...r.keys()].forEach(s=>{t.headers[s]=r.get(s);}));}function v(e,t){if(c[t][p])return;let r=c[t];function s(a,i,u){return m(e,i),r(a,i,u)}function o(a,i){return m(e,a),r(a,i)}function n(...a){let i={},u,h;return a.length===3?([u,i,h]=a,s(u,i,h)):([i,h]=a,o(i,h))}n[p]=true,c[t]=n;}function q(e,t){let r=e.getCurrentTrace()?.context;if(r)for(let s of r.keys())t.set(s,r.get(s));}function U(e){if(globalThis.fetch[p])return;let t=globalThis.fetch;globalThis.fetch=(r,s)=>(I(r)&&r.headers&&!s?.headers?q(e,r.headers):(s??={},s.headers??=new Headers,L(s.headers)||(s.headers=new Headers(s.headers)),q(e,s.headers)),t(r,s)),globalThis.fetch[p]=true;}function g(e,t){P(e,t),v(t,"request"),v(t,"get"),U(t);}var y="x-trace-id",E=e=>{if(!Array.isArray(e))throw new Error("Header list is not an array");let t=/^[\x21-\x7e]+$/i,r=e.filter(s=>typeof s!="string"||!t.test(s));if(r.length>0)throw new Error(`Header list contains invalid headers: ${r}`)},A=(e={})=>{let{setAndPropagateCorrelationId:t=true,headersToPropagate:r=["x-request-id","x-variant-id"],headersPrefix:s="x-af-"}=e;return E(r),{setAndPropagateCorrelationId:t,correlationIdHeader:y,headersToCollect:new Set(r),headersPrefix:s}},R={load:A,correlationIdHeader:y};var T=class{constructor(t){this.type=t;this.id=randomUUID();this.context=new Map;}},l=class{constructor(){this.#t=false;this.#r=new Map;this.#e={currentTrace:null,traces:{}};this.#s=x.createHook({init:(t,r,s)=>{this.#e.traces[s]&&(this.#e.traces[t]=this.#e.traces[s]);},before:t=>{this.#e.traces[t]&&(this.#r.set(t,this.#e.currentTrace),this.#e.currentTrace=this.#e.traces[t]);},after:t=>{this.#e.traces[t]&&(this.#e.currentTrace=this.#r.get(t));},destroy:t=>{this.#e.traces[t]&&(delete this.#e.traces[t],this.#r.delete(t));}});this.enable=()=>(this.#t||(this.#s.enable(),this.#t=true),this.#s);this.newTrace=t=>{this.#t||this.enable();let r=new T(t);return this.#e.currentTrace=r,this.#e.traces[x.executionAsyncId()]=r,r};this.getCurrentTrace=()=>this.#e.currentTrace||{};}#t;#r;#e;#s};var d=new l,C=e=>({[e]:d.getCurrentTrace()?.context?.get(R.correlationIdHeader)}),F=e=>format(t=>Object.assign(t,C(e)));function K(e){g(R.load(e),d),d.enable();let t=e.loggerTraceKey||"traceId";e.winstonLogger&&(e.winstonLogger.format=format.combine(F(t)(),e.winstonLogger.format)),e.contextMiddlewareGetter?.(()=>C(t));try{b("bluebird").config({asyncHooks:!0});}catch{}}var te=()=>d.getCurrentTrace(),{newTrace:re}=d;export{K as default,te as getCurrentContext,re as newTrace,f as traceTypes};//# sourceMappingURL=index.js.map
43
2
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;AAAA,qCAA0C;AAE1C,kEAAyC;AACzC,sDAAkD;AAClD,qCAA8C;AAE9C,iCAAqC;AAA5B,mGAAA,UAAU,OAAA;AAEnB,MAAM,MAAM,GAAG,IAAI,eAAM,EAAE,CAAC;AAO5B,MAAM,gBAAgB,GAAG,CAAC,cAAsB,EAAE,EAAE,CAAC,IAAA,gBAAM,EAAC,CAAC,IAAI,EAAE,EAAE;IACnE,MAAM,mBAAmB,GAAG,MAAM,CAAC,eAAe,EAAE,EAAE,OAAO,CAAC;IAC9D,IAAI,mBAAmB,EAAE;QACvB,6CAA6C;QAC7C,IAAI,CAAC,cAAc,CAAC,GAAG,mBAAmB,CAAC,GAAG,CAAC,gBAAM,CAAC,mBAAmB,CAAC,CAAC;KAC5E;IAED,OAAO,IAAI,CAAC;AACd,CAAC,CAAC,CAAC;AAEH,SAAwB,kBAAkB,CAAC,OAAgB;IACzD,IAAA,sBAAW,EAAC,gBAAM,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC,CAAC;IAC1C,MAAM,CAAC,MAAM,EAAE,CAAC;IAEhB,IAAI,OAAO,CAAC,aAAa,EAAE;QACzB,MAAM,QAAQ,GAAG,OAAO,CAAC,cAAc,IAAI,SAAS,CAAC;QACrD,6CAA6C;QAC7C,OAAO,CAAC,aAAa,CAAC,MAAM,GAAG,gBAAM,CAAC,OAAO,CAC3C,gBAAgB,CAAC,QAAQ,CAAC,EAAE,EAC5B,OAAO,CAAC,aAAa,CAAC,MAAM,CAC7B,CAAC;KACH;IAED,mEAAmE;IACnE,IAAI;QACF,8EAA8E;QAC9E,MAAM,QAAQ,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;QACrC,QAAQ,CAAC,MAAM,CAAC,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC,CAAC;QACtC,oBAAoB;KACrB;IAAC,OAAO,CAAC,EAAE,EAAE,YAAY,EAAE;AAC9B,CAAC;AApBD,qCAoBC;AAEM,MAAM,iBAAiB,GAAG,GAAkC,EAAE,CAAC,MAAM,CAAC,eAAe,EAAE,CAAC;AAAlF,QAAA,iBAAiB,qBAAiE;AAEhF,gBAAQ,GAAK,MAAM,UAAC"}
1
+ {"version":3,"sources":["../src/const.ts","../src/http_wrapper.ts","../src/config.ts","../src/tracer.ts","../src/index.ts"],"names":["traceTypes","kOutbreakWrapped","generateShortId","randomUUID","isFetchRequest","headers","isFetchHeaders","setAndCollectCorrelationId","config","tracer","req","res","correlationId","collect","headerName","value","wrappedListener","listener","next","error","wrapHttpCreateServer","http","originalHttpCreateServer","wrappedHttpCreateServer","options","inject","currentTraceContext","header","wrapHttpRequest","originalMethodName","originalMethod","urlFirst","url","cb","optionsFirst","wrappedHttpRequest","args","callback","injectInFetchRequest","wrapFetch","originalFetch","input","init","wrapHttp","correlationIdHeader","validateHeaderList","headerNameRegex","invalidHeaders","h","load","overrides","setAndPropagateCorrelationId","headersToPropagate","headersPrefix","config_default","Trace","type","Tracer","#isTraceEnabled","#prevStates","#tracer","#hook","asyncHooks","asyncId","_type","triggerAsyncId","currentTrace","contextMiddleware","loggerTraceKey","addMetadataToLog","format","info","outbreakInitialize","traceKey","getCurrentContext","newTrace"],"mappings":"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","file":"index.js","sourcesContent":["export const traceTypes = {\n HTTP_REQUEST: 'httpRequest',\n WEB_SOCKET: 'webSocket',\n RABBIT: 'rabbit',\n} as const;\nexport type TraceType = typeof traceTypes[keyof typeof traceTypes];\n","import http from 'node:http';\nimport { randomUUID } from 'node:crypto';\nimport type { URL } from 'node:url';\nimport { traceTypes } from './const';\nimport type { Tracer } from './tracer';\nimport type { LoadedConfig } from './config';\n\nexport const kOutbreakWrapped = Symbol('outbreak-wrapped');\nconst generateShortId = () => randomUUID().split('-')[0];\nconst isFetchRequest = (headers: unknown): headers is Request => headers instanceof Request || Object.prototype.toString.call(headers) === '[object Request]';\nconst isFetchHeaders = (headers: unknown): headers is Headers => headers instanceof Headers || Object.prototype.toString.call(headers) === '[object Headers]';\n\nfunction setAndCollectCorrelationId(config: LoadedConfig, tracer: Tracer, req: http.IncomingMessage, res: http.ServerResponse<http.IncomingMessage>): void {\n const correlationId = req.headers[config.correlationIdHeader] ?? generateShortId();\n tracer.getCurrentTrace().context.set(config.correlationIdHeader, correlationId as string);\n res.setHeader(config.correlationIdHeader, correlationId);\n}\n\nfunction collect(config: LoadedConfig, tracer: Tracer, req: http.IncomingMessage, res: http.ServerResponse<http.IncomingMessage>): void {\n if (config.setAndPropagateCorrelationId) {\n setAndCollectCorrelationId(config, tracer, req, res);\n }\n\n Object.entries(req.headers).forEach(([headerName, value]) => {\n const shouldCollect = config.headersToCollect.has(headerName) || headerName.startsWith(config.headersPrefix);\n if (shouldCollect && typeof value !== 'undefined') {\n tracer.getCurrentTrace().context.set(headerName, value as string);\n }\n });\n}\n\nfunction wrappedListener<\n Request extends typeof http.IncomingMessage = typeof http.IncomingMessage,\n Response extends typeof http.ServerResponse = typeof http.ServerResponse,\n>(\n config: LoadedConfig,\n tracer: Tracer,\n listener: http.RequestListener<Request, Response>,\n): http.RequestListener<Request, Response> {\n // @ts-expect-error we add next and error which don't exist on the original type\n return (req: http.IncomingMessage, res: http.ServerResponse, next: unknown, error: unknown): void => {\n tracer.newTrace(traceTypes.HTTP_REQUEST);\n\n collect(config, tracer, req, res);\n\n // @ts-expect-error we add next and error which don't exist on the original type\n listener(req, res, next, error);\n };\n}\n\nfunction wrapHttpCreateServer<\n Request extends typeof http.IncomingMessage = typeof http.IncomingMessage,\n Response extends typeof http.ServerResponse = typeof http.ServerResponse,\n>(config: LoadedConfig, tracer: Tracer): void {\n if (http.createServer[kOutbreakWrapped]) {\n return;\n }\n const originalHttpCreateServer = http.createServer;\n // args of http.createServer are ([options<Object>], [listener<Fn>]) Express only sends listener\n function wrappedHttpCreateServer(options: http.ServerOptions<Request, Response>, listener?: http.RequestListener<Request, Response>): http.Server<Request, Response>;\n function wrappedHttpCreateServer(listener?: http.RequestListener<Request, Response>): http.Server<Request, Response>;\n function wrappedHttpCreateServer(\n options: http.ServerOptions<Request, Response> | http.RequestListener<Request, Response>,\n listener?: http.RequestListener<Request, Response>,\n ): http.Server<Request, Response> {\n listener = listener || options as http.RequestListener<Request, Response>;\n return originalHttpCreateServer<Request, Response>(wrappedListener(config, tracer, listener));\n }\n wrappedHttpCreateServer[kOutbreakWrapped] = true;\n http.createServer = wrappedHttpCreateServer;\n}\n\nfunction inject(tracer: Tracer, options: http.RequestOptions): void {\n const currentTraceContext = tracer.getCurrentTrace().context;\n if (currentTraceContext) {\n options.headers ||= {};\n [...(currentTraceContext.keys())].forEach((header) => {\n options.headers[header] = currentTraceContext.get(header);\n });\n }\n}\nfunction wrapHttpRequest(tracer: Tracer, originalMethodName: 'request' | 'get'): void {\n if (http[originalMethodName][kOutbreakWrapped]) {\n return;\n }\n const originalMethod = http[originalMethodName];\n function urlFirst(url: string | URL, options: http.RequestOptions, cb: (res: http.IncomingMessage) => void): http.ClientRequest {\n inject(tracer, options);\n\n return originalMethod(url, options, cb);\n }\n\n function optionsFirst(options: http.RequestOptions, cb: (res: http.IncomingMessage) => void): http.ClientRequest {\n inject(tracer, options);\n\n return originalMethod(options, cb);\n }\n\n function wrappedHttpRequest(options: string | http.RequestOptions | URL, callback?: (res: http.IncomingMessage) => void): http.ClientRequest;\n function wrappedHttpRequest(url: string | URL, options: http.RequestOptions, callback?: (res: http.IncomingMessage) => void): http.ClientRequest;\n function wrappedHttpRequest(...args): http.ClientRequest {\n let options = {};\n let url: string | URL;\n let callback: (res: http.IncomingMessage) => void;\n\n if (args.length === 3) {\n [url, options, callback] = args;\n return urlFirst(url, options, callback);\n }\n [options, callback] = args;\n return optionsFirst(options, callback);\n }\n wrappedHttpRequest[kOutbreakWrapped] = true;\n http[originalMethodName] = wrappedHttpRequest;\n}\n\nfunction injectInFetchRequest(tracer: Tracer, headers: Headers): void {\n const currentTraceContext = tracer.getCurrentTrace()?.context;\n /* c8 ignore next 3 */\n if (!currentTraceContext) {\n return;\n }\n // eslint-disable-next-line no-restricted-syntax\n for (const header of currentTraceContext.keys()) {\n headers.set(header, currentTraceContext.get(header));\n }\n}\n\nfunction wrapFetch(tracer: Tracer): void {\n if (globalThis.fetch[kOutbreakWrapped]) {\n return;\n }\n const originalFetch = globalThis.fetch;\n globalThis.fetch = (input: string | URL | Request, init?: RequestInit): Promise<Response> => {\n if (isFetchRequest(input) && input.headers && !init?.headers) {\n injectInFetchRequest(tracer, input.headers);\n } else {\n init ??= {};\n init.headers ??= new Headers();\n if (!isFetchHeaders(init.headers)) {\n init.headers = new Headers(init.headers);\n }\n injectInFetchRequest(tracer, init.headers);\n }\n return originalFetch(input, init);\n };\n globalThis.fetch[kOutbreakWrapped] = true;\n}\n\nexport default function wrapHttp(config: LoadedConfig, tracer: Tracer): void {\n wrapHttpCreateServer(config, tracer);\n wrapHttpRequest(tracer, 'request');\n wrapHttpRequest(tracer, 'get');\n wrapFetch(tracer);\n}\n","const correlationIdHeader = 'x-trace-id';\n\nconst validateHeaderList = (headers: string[]): void => {\n if (!Array.isArray(headers)) {\n throw new Error('Header list is not an array');\n }\n\n // could be tighter - ASCII code between 33 and 126 at the moment\n const headerNameRegex = /^[\\x21-\\x7e]+$/i;\n\n const invalidHeaders = headers.filter((h) => typeof h !== 'string' || !headerNameRegex.test(h));\n\n if (invalidHeaders.length > 0) {\n throw new Error(`Header list contains invalid headers: ${invalidHeaders}`);\n }\n};\n\nexport interface Overrides {\n setAndPropagateCorrelationId?: boolean;\n headersToPropagate?: string[];\n headersPrefix?: string;\n}\n\nexport interface LoadedConfig extends Required<Pick<Overrides, 'setAndPropagateCorrelationId' | 'headersPrefix'>> {\n correlationIdHeader: string;\n headersToCollect: Set<string>;\n}\n\nconst load = (overrides: Overrides = {}): LoadedConfig => {\n const {\n setAndPropagateCorrelationId = true,\n headersToPropagate = [\n 'x-request-id',\n 'x-variant-id',\n ],\n headersPrefix = 'x-af-',\n } = overrides;\n\n validateHeaderList(headersToPropagate);\n\n return {\n setAndPropagateCorrelationId,\n correlationIdHeader,\n headersToCollect: new Set(headersToPropagate),\n headersPrefix,\n };\n};\n\nexport default {\n load,\n correlationIdHeader,\n};\n","import asyncHooks from 'node:async_hooks';\nimport { randomUUID } from 'node:crypto';\nimport type { TraceType } from './const';\n\ninterface TraceHolder {\n currentTrace: Trace | null;\n traces: Record<number, Trace>;\n}\n\nexport class Trace {\n public readonly id = randomUUID();\n\n public readonly context = new Map<string, string>();\n\n constructor(public type: TraceType) {}\n}\n\nexport class Tracer {\n #isTraceEnabled = false;\n\n #prevStates = new Map<number, Trace>();\n\n #tracer: TraceHolder = {\n currentTrace: null,\n traces: {},\n };\n\n #hook = asyncHooks.createHook({\n init: (asyncId, _type, triggerAsyncId) => {\n if (!this.#tracer.traces[triggerAsyncId]) {\n return;\n }\n this.#tracer.traces[asyncId] = this.#tracer.traces[triggerAsyncId];\n },\n before: (asyncId) => {\n if (!this.#tracer.traces[asyncId]) {\n return;\n }\n this.#prevStates.set(asyncId, this.#tracer.currentTrace);\n this.#tracer.currentTrace = this.#tracer.traces[asyncId];\n },\n after: (asyncId) => {\n if (!this.#tracer.traces[asyncId]) {\n return;\n }\n this.#tracer.currentTrace = this.#prevStates.get(asyncId);\n },\n destroy: (asyncId) => {\n if (this.#tracer.traces[asyncId]) {\n delete this.#tracer.traces[asyncId];\n this.#prevStates.delete(asyncId);\n }\n },\n });\n\n public enable = (): asyncHooks.AsyncHook => {\n if (!this.#isTraceEnabled) {\n this.#hook.enable();\n this.#isTraceEnabled = true;\n }\n return this.#hook;\n };\n\n public newTrace = (type: TraceType): Trace => {\n if (!this.#isTraceEnabled) {\n this.enable();\n }\n const currentTrace = new Trace(type);\n this.#tracer.currentTrace = currentTrace;\n this.#tracer.traces[asyncHooks.executionAsyncId()] = currentTrace;\n return currentTrace;\n };\n\n public getCurrentTrace = (): Trace | Record<string, never> => this.#tracer.currentTrace || {};\n}\n","import winston, { format } from 'winston';\n\nimport httpWrapper from './http_wrapper';\nimport config, { type Overrides } from './config';\nimport { type Trace, Tracer } from './tracer';\n\nexport { traceTypes } from './const';\n\nconst tracer = new Tracer();\n\ninterface Options extends Overrides {\n winstonLogger?: winston.Logger;\n contextMiddlewareGetter?: (middleware: () => Record<string, unknown>) => void;\n loggerTraceKey? : string;\n}\n\nconst contextMiddleware = (loggerTraceKey: string) => ({\n [loggerTraceKey]: tracer.getCurrentTrace()?.context?.get(config.correlationIdHeader),\n});\nconst addMetadataToLog = (loggerTraceKey: string) => format((info) => Object.assign(info, contextMiddleware(loggerTraceKey)));\n\nexport default function outbreakInitialize(options: Options): void {\n httpWrapper(config.load(options), tracer);\n tracer.enable();\n\n const traceKey = options.loggerTraceKey || 'traceId';\n if (options.winstonLogger) {\n // eslint-disable-next-line no-param-reassign\n options.winstonLogger.format = format.combine(\n addMetadataToLog(traceKey)(),\n options.winstonLogger.format,\n );\n }\n options.contextMiddlewareGetter?.(() => contextMiddleware(traceKey));\n\n // Make an attempt to enable async hooks for bluebird, if available\n try {\n // eslint-disable-next-line global-require, @typescript-eslint/no-var-requires\n const bluebird = require('bluebird');\n bluebird.config({ asyncHooks: true });\n /* c8 ignore next */\n } catch (e) { /* ignore */ }\n}\n\nexport const getCurrentContext = (): Trace | Record<string, never> => tracer.getCurrentTrace();\n\nexport const { newTrace } = tracer;\n"]}
package/package.json CHANGED
@@ -1,10 +1,23 @@
1
1
  {
2
2
  "name": "@autofleet/outbreak",
3
- "version": "2.1.0",
3
+ "version": "2.3.0-beta-91bc0ca7.0",
4
4
  "description": "",
5
- "main": "dist/index.js",
6
5
  "type": "module",
7
- "types": "dist/index.d.ts",
6
+ "main": "./dist/index.js",
7
+ "module": "./dist/index.js",
8
+ "types": "./dist/index.d.ts",
9
+ "exports": {
10
+ ".": {
11
+ "import": {
12
+ "types": "./dist/index.d.ts",
13
+ "default": "./dist/index.js"
14
+ },
15
+ "require": {
16
+ "types": "./dist/index.d.cts",
17
+ "default": "./dist/index.cjs"
18
+ }
19
+ }
20
+ },
8
21
  "files": [
9
22
  "dist",
10
23
  "readme.md"
@@ -18,10 +31,10 @@
18
31
  },
19
32
  "homepage": "https://github.com/Autofleet/outbreak#readme",
20
33
  "scripts": {
21
- "build": "rm -rf ./dist && tsc -p tsconfig.build.json",
34
+ "build": "tsup",
22
35
  "prepublish": "npm run build",
23
36
  "start": "node --loader ts-node/esm src/example.ts",
24
- "dev": "node --watch --loader ts-node/esm src/example.ts",
37
+ "dev": "tsup --watch",
25
38
  "lint": "eslint .",
26
39
  "test": "vitest",
27
40
  "coverage": "vitest run --coverage"
@@ -58,6 +71,7 @@
58
71
  "eslint-plugin-import": "^2.31.0",
59
72
  "express": "^4.21.1",
60
73
  "ts-node": "^10.9.2",
74
+ "tsup": "^8.3.6",
61
75
  "typescript": "^4.9.5",
62
76
  "vitest": "^3.0.5"
63
77
  }
package/dist/config.d.ts DELETED
@@ -1,14 +0,0 @@
1
- export interface Overrides {
2
- setAndPropagateCorrelationId?: boolean;
3
- headersToPropagate?: string[];
4
- headersPrefix?: string;
5
- }
6
- export interface LoadedConfig extends Required<Pick<Overrides, 'setAndPropagateCorrelationId' | 'headersPrefix'>> {
7
- correlationIdHeader: string;
8
- headersToCollect: Set<string>;
9
- }
10
- declare const _default: {
11
- load: (overrides?: Overrides) => LoadedConfig;
12
- correlationIdHeader: string;
13
- };
14
- export default _default;
package/dist/config.js DELETED
@@ -1,32 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- const correlationIdHeader = 'x-trace-id';
4
- const validateHeaderList = (headers) => {
5
- if (!Array.isArray(headers)) {
6
- throw new Error('Header list is not an array');
7
- }
8
- // could be tighter - ASCII code between 33 and 126 at the moment
9
- const headerNameRegex = /^[\x21-\x7e]+$/i;
10
- const invalidHeaders = headers.filter((h) => typeof h !== 'string' || !headerNameRegex.test(h));
11
- if (invalidHeaders.length > 0) {
12
- throw new Error(`Header list contains invalid headers: ${invalidHeaders}`);
13
- }
14
- };
15
- const load = (overrides = {}) => {
16
- const { setAndPropagateCorrelationId = true, headersToPropagate = [
17
- 'x-request-id',
18
- 'x-variant-id',
19
- ], headersPrefix = 'x-af-', } = overrides;
20
- validateHeaderList(headersToPropagate);
21
- return {
22
- setAndPropagateCorrelationId,
23
- correlationIdHeader,
24
- headersToCollect: new Set(headersToPropagate),
25
- headersPrefix,
26
- };
27
- };
28
- exports.default = {
29
- load,
30
- correlationIdHeader,
31
- };
32
- //# sourceMappingURL=config.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":";;AAAA,MAAM,mBAAmB,GAAG,YAAY,CAAC;AAEzC,MAAM,kBAAkB,GAAG,CAAC,OAAiB,EAAQ,EAAE;IACrD,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE;QAC3B,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC;KAChD;IAED,iEAAiE;IACjE,MAAM,eAAe,GAAG,iBAAiB,CAAC;IAE1C,MAAM,cAAc,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;IAEhG,IAAI,cAAc,CAAC,MAAM,GAAG,CAAC,EAAE;QAC7B,MAAM,IAAI,KAAK,CAAC,yCAAyC,cAAc,EAAE,CAAC,CAAC;KAC5E;AACH,CAAC,CAAC;AAaF,MAAM,IAAI,GAAG,CAAC,YAAuB,EAAE,EAAgB,EAAE;IACvD,MAAM,EACJ,4BAA4B,GAAG,IAAI,EACnC,kBAAkB,GAAG;QACnB,cAAc;QACd,cAAc;KACf,EACD,aAAa,GAAG,OAAO,GACxB,GAAG,SAAS,CAAC;IAEd,kBAAkB,CAAC,kBAAkB,CAAC,CAAC;IAEvC,OAAO;QACL,4BAA4B;QAC5B,mBAAmB;QACnB,gBAAgB,EAAE,IAAI,GAAG,CAAC,kBAAkB,CAAC;QAC7C,aAAa;KACd,CAAC;AACJ,CAAC,CAAC;AAEF,kBAAe;IACb,IAAI;IACJ,mBAAmB;CACpB,CAAC"}
package/dist/const.d.ts DELETED
@@ -1,6 +0,0 @@
1
- export declare const traceTypes: {
2
- readonly HTTP_REQUEST: "httpRequest";
3
- readonly WEB_SOCKET: "webSocket";
4
- readonly RABBIT: "rabbit";
5
- };
6
- export type TraceType = typeof traceTypes[keyof typeof traceTypes];
package/dist/const.js DELETED
@@ -1,9 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.traceTypes = void 0;
4
- exports.traceTypes = {
5
- HTTP_REQUEST: 'httpRequest',
6
- WEB_SOCKET: 'webSocket',
7
- RABBIT: 'rabbit',
8
- };
9
- //# sourceMappingURL=const.js.map
package/dist/const.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"const.js","sourceRoot":"","sources":["../src/const.ts"],"names":[],"mappings":";;;AAAa,QAAA,UAAU,GAAG;IACxB,YAAY,EAAE,aAAa;IAC3B,UAAU,EAAE,WAAW;IACvB,MAAM,EAAE,QAAQ;CACR,CAAC"}
@@ -1,3 +0,0 @@
1
- import type { Tracer } from './tracer';
2
- import type { LoadedConfig } from './config';
3
- export default function wrapHttp(config: LoadedConfig, tracer: Tracer): void;
@@ -1,113 +0,0 @@
1
- "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- const node_http_1 = __importDefault(require("node:http"));
7
- const node_crypto_1 = require("node:crypto");
8
- const const_1 = require("./const");
9
- const generateShortId = () => (0, node_crypto_1.randomUUID)().split('-')[0];
10
- const isFetchRequest = (headers) => headers instanceof Request || Object.prototype.toString.call(headers) === '[object Request]';
11
- const isFetchHeaders = (headers) => headers instanceof Headers || Object.prototype.toString.call(headers) === '[object Headers]';
12
- const originalHttpCreateServer = node_http_1.default.createServer;
13
- const originalRequest = node_http_1.default.request;
14
- const originalGet = node_http_1.default.get;
15
- const originalFetch = globalThis.fetch;
16
- function setAndCollectCorrelationId(config, tracer, req, res) {
17
- const correlationId = req.headers[config.correlationIdHeader] ?? generateShortId();
18
- tracer.getCurrentTrace().context.set(config.correlationIdHeader, correlationId);
19
- res.setHeader(config.correlationIdHeader, correlationId);
20
- }
21
- function collect(config, tracer, req, res) {
22
- if (config.setAndPropagateCorrelationId) {
23
- setAndCollectCorrelationId(config, tracer, req, res);
24
- }
25
- Object.entries(req.headers).forEach(([headerName, value]) => {
26
- const shouldCollect = config.headersToCollect.has(headerName) || headerName.startsWith(config.headersPrefix);
27
- if (shouldCollect && typeof value !== 'undefined') {
28
- tracer.getCurrentTrace().context.set(headerName, value);
29
- }
30
- });
31
- }
32
- function wrappedListener(config, tracer, listener) {
33
- // @ts-expect-error we add next and error which don't exist on the original type
34
- return (req, res, next, error) => {
35
- tracer.newTrace(const_1.traceTypes.HTTP_REQUEST);
36
- collect(config, tracer, req, res);
37
- // @ts-expect-error we add next and error which don't exist on the original type
38
- listener(req, res, next, error);
39
- };
40
- }
41
- function wrapHttpCreateServer(config, tracer) {
42
- function wrappedHttpCreateServer(options, listener) {
43
- listener = listener || options;
44
- return originalHttpCreateServer(wrappedListener(config, tracer, listener));
45
- }
46
- return wrappedHttpCreateServer;
47
- }
48
- function inject(tracer, options) {
49
- const currentTraceContext = tracer.getCurrentTrace().context;
50
- if (currentTraceContext) {
51
- options.headers || (options.headers = {});
52
- [...(currentTraceContext.keys())].forEach((header) => {
53
- options.headers[header] = currentTraceContext.get(header);
54
- });
55
- }
56
- }
57
- function wrapHttpRequest(tracer, originalMethod) {
58
- function urlFirst(url, options, cb) {
59
- inject(tracer, options);
60
- return originalMethod(url, options, cb);
61
- }
62
- function optionsFirst(options, cb) {
63
- inject(tracer, options);
64
- return originalMethod(options, cb);
65
- }
66
- function wrappedHttpRequest(...args) {
67
- let options = {};
68
- let url;
69
- let callback;
70
- if (args.length === 3) {
71
- [url, options, callback] = args;
72
- return urlFirst(url, options, callback);
73
- }
74
- [options, callback] = args;
75
- return optionsFirst(options, callback);
76
- }
77
- return wrappedHttpRequest;
78
- }
79
- function injectInFetchRequest(tracer, headers) {
80
- const currentTraceContext = tracer.getCurrentTrace()?.context;
81
- /* c8 ignore next 3 */
82
- if (!currentTraceContext) {
83
- return;
84
- }
85
- // eslint-disable-next-line no-restricted-syntax
86
- for (const header of currentTraceContext.keys()) {
87
- headers.set(header, currentTraceContext.get(header));
88
- }
89
- }
90
- function wrapFetch(tracer) {
91
- globalThis.fetch = (input, init) => {
92
- if (isFetchRequest(input) && input.headers && !init?.headers) {
93
- injectInFetchRequest(tracer, input.headers);
94
- }
95
- else {
96
- init ?? (init = {});
97
- init.headers ?? (init.headers = new Headers());
98
- if (!isFetchHeaders(init.headers)) {
99
- init.headers = new Headers(init.headers);
100
- }
101
- injectInFetchRequest(tracer, init.headers);
102
- }
103
- return originalFetch(input, init);
104
- };
105
- }
106
- function wrapHttp(config, tracer) {
107
- node_http_1.default.createServer = wrapHttpCreateServer(config, tracer);
108
- node_http_1.default.request = wrapHttpRequest(tracer, originalRequest);
109
- node_http_1.default.get = wrapHttpRequest(tracer, originalGet);
110
- wrapFetch(tracer);
111
- }
112
- exports.default = wrapHttp;
113
- //# sourceMappingURL=http_wrapper.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"http_wrapper.js","sourceRoot":"","sources":["../src/http_wrapper.ts"],"names":[],"mappings":"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"}
package/dist/tracer.d.ts DELETED
@@ -1,14 +0,0 @@
1
- import asyncHooks from 'node:async_hooks';
2
- import type { TraceType } from './const';
3
- export declare class Trace {
4
- type: TraceType;
5
- readonly id: `${string}-${string}-${string}-${string}-${string}`;
6
- readonly context: Map<string, string>;
7
- constructor(type: TraceType);
8
- }
9
- export declare class Tracer {
10
- #private;
11
- enable: () => asyncHooks.AsyncHook;
12
- newTrace: (type: TraceType) => Trace;
13
- getCurrentTrace: () => Trace | Record<string, never>;
14
- }
package/dist/tracer.js DELETED
@@ -1,85 +0,0 @@
1
- "use strict";
2
- var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
3
- if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
4
- if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
5
- return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
6
- };
7
- var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) {
8
- if (kind === "m") throw new TypeError("Private method is not writable");
9
- if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");
10
- if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it");
11
- return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
12
- };
13
- var __importDefault = (this && this.__importDefault) || function (mod) {
14
- return (mod && mod.__esModule) ? mod : { "default": mod };
15
- };
16
- var _Tracer_isTraceEnabled, _Tracer_prevStates, _Tracer_tracer, _Tracer_hook;
17
- Object.defineProperty(exports, "__esModule", { value: true });
18
- exports.Tracer = exports.Trace = void 0;
19
- const node_async_hooks_1 = __importDefault(require("node:async_hooks"));
20
- const node_crypto_1 = require("node:crypto");
21
- class Trace {
22
- constructor(type) {
23
- this.type = type;
24
- this.id = (0, node_crypto_1.randomUUID)();
25
- this.context = new Map();
26
- }
27
- }
28
- exports.Trace = Trace;
29
- class Tracer {
30
- constructor() {
31
- _Tracer_isTraceEnabled.set(this, false);
32
- _Tracer_prevStates.set(this, new Map());
33
- _Tracer_tracer.set(this, {
34
- currentTrace: null,
35
- traces: {},
36
- });
37
- _Tracer_hook.set(this, node_async_hooks_1.default.createHook({
38
- init: (asyncId, _type, triggerAsyncId) => {
39
- if (!__classPrivateFieldGet(this, _Tracer_tracer, "f").traces[triggerAsyncId]) {
40
- return;
41
- }
42
- __classPrivateFieldGet(this, _Tracer_tracer, "f").traces[asyncId] = __classPrivateFieldGet(this, _Tracer_tracer, "f").traces[triggerAsyncId];
43
- },
44
- before: (asyncId) => {
45
- if (!__classPrivateFieldGet(this, _Tracer_tracer, "f").traces[asyncId]) {
46
- return;
47
- }
48
- __classPrivateFieldGet(this, _Tracer_prevStates, "f").set(asyncId, __classPrivateFieldGet(this, _Tracer_tracer, "f").currentTrace);
49
- __classPrivateFieldGet(this, _Tracer_tracer, "f").currentTrace = __classPrivateFieldGet(this, _Tracer_tracer, "f").traces[asyncId];
50
- },
51
- after: (asyncId) => {
52
- if (!__classPrivateFieldGet(this, _Tracer_tracer, "f").traces[asyncId]) {
53
- return;
54
- }
55
- __classPrivateFieldGet(this, _Tracer_tracer, "f").currentTrace = __classPrivateFieldGet(this, _Tracer_prevStates, "f").get(asyncId);
56
- },
57
- destroy: (asyncId) => {
58
- if (__classPrivateFieldGet(this, _Tracer_tracer, "f").traces[asyncId]) {
59
- delete __classPrivateFieldGet(this, _Tracer_tracer, "f").traces[asyncId];
60
- __classPrivateFieldGet(this, _Tracer_prevStates, "f").delete(asyncId);
61
- }
62
- },
63
- }));
64
- this.enable = () => {
65
- if (!__classPrivateFieldGet(this, _Tracer_isTraceEnabled, "f")) {
66
- __classPrivateFieldGet(this, _Tracer_hook, "f").enable();
67
- __classPrivateFieldSet(this, _Tracer_isTraceEnabled, true, "f");
68
- }
69
- return __classPrivateFieldGet(this, _Tracer_hook, "f");
70
- };
71
- this.newTrace = (type) => {
72
- if (!__classPrivateFieldGet(this, _Tracer_isTraceEnabled, "f")) {
73
- this.enable();
74
- }
75
- const currentTrace = new Trace(type);
76
- __classPrivateFieldGet(this, _Tracer_tracer, "f").currentTrace = currentTrace;
77
- __classPrivateFieldGet(this, _Tracer_tracer, "f").traces[node_async_hooks_1.default.executionAsyncId()] = currentTrace;
78
- return currentTrace;
79
- };
80
- this.getCurrentTrace = () => __classPrivateFieldGet(this, _Tracer_tracer, "f").currentTrace || {};
81
- }
82
- }
83
- exports.Tracer = Tracer;
84
- _Tracer_isTraceEnabled = new WeakMap(), _Tracer_prevStates = new WeakMap(), _Tracer_tracer = new WeakMap(), _Tracer_hook = new WeakMap();
85
- //# sourceMappingURL=tracer.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"tracer.js","sourceRoot":"","sources":["../src/tracer.ts"],"names":[],"mappings":"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"}