@autofleet/outbreak 2.0.1 → 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,13 +1,32 @@
1
1
  import winston from 'winston';
2
- import * as tracer from './tracer';
3
- export { traceTypes } from './const';
4
- interface Options {
5
- winstonLogger?: winston.Logger;
6
- loggerTraceKey?: string;
7
- headersPrefix?: string;
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 {
8
11
  setAndPropagateCorrelationId?: boolean;
9
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;
10
27
  }
11
- export default function outbreakInitialize(options: Options): void;
12
- export declare const getCurrentContext: () => Partial<tracer.Trace>;
13
- export declare const newTrace: (type: import("./const").TraceType) => tracer.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,64 +1,2 @@
1
- "use strict";
2
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
- if (k2 === undefined) k2 = k;
4
- var desc = Object.getOwnPropertyDescriptor(m, k);
5
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
- desc = { enumerable: true, get: function() { return m[k]; } };
7
- }
8
- Object.defineProperty(o, k2, desc);
9
- }) : (function(o, m, k, k2) {
10
- if (k2 === undefined) k2 = k;
11
- o[k2] = m[k];
12
- }));
13
- var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
- Object.defineProperty(o, "default", { enumerable: true, value: v });
15
- }) : function(o, v) {
16
- o["default"] = v;
17
- });
18
- var __importStar = (this && this.__importStar) || function (mod) {
19
- if (mod && mod.__esModule) return mod;
20
- var result = {};
21
- if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
- __setModuleDefault(result, mod);
23
- return result;
24
- };
25
- var __importDefault = (this && this.__importDefault) || function (mod) {
26
- return (mod && mod.__esModule) ? mod : { "default": mod };
27
- };
28
- Object.defineProperty(exports, "__esModule", { value: true });
29
- exports.newTrace = exports.getCurrentContext = exports.traceTypes = void 0;
30
- const winston_1 = require("winston");
31
- const http_wrapper_1 = __importDefault(require("./http_wrapper"));
32
- const config_1 = __importDefault(require("./config"));
33
- const tracer = __importStar(require("./tracer"));
34
- var const_1 = require("./const");
35
- Object.defineProperty(exports, "traceTypes", { enumerable: true, get: function () { return const_1.traceTypes; } });
36
- const addMetadataToLog = (loggerTraceKey) => (0, winston_1.format)((info) => {
37
- const currentTrace = tracer.getCurrentTrace();
38
- if (currentTrace && currentTrace.context && currentTrace.context.get) {
39
- // eslint-disable-next-line no-param-reassign
40
- info[loggerTraceKey] = currentTrace.context.get(config_1.default.correlationIdHeader);
41
- }
42
- return info;
43
- });
44
- function outbreakInitialize(options) {
45
- (0, http_wrapper_1.default)(config_1.default.load(options));
46
- tracer.enable();
47
- if (options.winstonLogger) {
48
- const traceKey = options.loggerTraceKey || 'traceId';
49
- // eslint-disable-next-line no-param-reassign
50
- options.winstonLogger.format = winston_1.format.combine(addMetadataToLog(traceKey)(), options.winstonLogger.format);
51
- }
52
- // Make an attempt to enable async hooks for bluebird, if available
53
- try {
54
- // eslint-disable-next-line global-require, @typescript-eslint/no-var-requires
55
- const bluebird = require('bluebird');
56
- bluebird.config({ asyncHooks: true });
57
- }
58
- catch (e) { /* ignore */ }
59
- }
60
- exports.default = outbreakInitialize;
61
- const getCurrentContext = () => tracer.getCurrentTrace();
62
- exports.getCurrentContext = getCurrentContext;
63
- 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
64
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,sDAA8B;AAC9B,iDAAmC;AAEnC,iCAAqC;AAA5B,mGAAA,UAAU,OAAA;AAUnB,MAAM,gBAAgB,GAAG,CAAC,cAAsB,EAAE,EAAE,CAAC,IAAA,gBAAM,EAAC,CAAC,IAAI,EAAE,EAAE;IACnE,MAAM,YAAY,GAAG,MAAM,CAAC,eAAe,EAAE,CAAC;IAC9C,IAAI,YAAY,IAAI,YAAY,CAAC,OAAO,IAAI,YAAY,CAAC,OAAO,CAAC,GAAG,EAAE;QACpE,6CAA6C;QAC7C,IAAI,CAAC,cAAc,CAAC,GAAG,YAAY,CAAC,OAAO,CAAC,GAAG,CAAC,gBAAM,CAAC,mBAAmB,CAAC,CAAC;KAC7E;IAED,OAAO,IAAI,CAAC;AACd,CAAC,CAAC,CAAC;AAEH,SAAwB,kBAAkB,CAAC,OAAgB;IACzD,IAAA,sBAAW,EAAC,gBAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;IAClC,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;KACvC;IAAC,OAAO,CAAC,EAAE,EAAE,YAAY,EAAE;AAC9B,CAAC;AAnBD,qCAmBC;AAEM,MAAM,iBAAiB,GAAG,GAA0B,EAAE,CAAC,MAAM,CAAC,eAAe,EAAE,CAAC;AAA1E,QAAA,iBAAiB,qBAAyD;AAExE,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.0.1",
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,16 +0,0 @@
1
- interface Overrides {
2
- setAndPropagateCorrelationId?: boolean;
3
- propagateInResponses?: boolean;
4
- headersToPropagate?: string[];
5
- headersPrefix?: string;
6
- }
7
- export interface LoadedConfig extends Required<Pick<Overrides, 'setAndPropagateCorrelationId' | 'propagateInResponses' | 'headersPrefix'>> {
8
- correlationIdHeader: string;
9
- headersToCollect: string[];
10
- headersToInject: string[];
11
- }
12
- declare const _default: {
13
- load: (overrides?: Overrides) => LoadedConfig;
14
- correlationIdHeader: string;
15
- };
16
- export default _default;
package/dist/config.js DELETED
@@ -1,37 +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, propagateInResponses = false, headersToPropagate = [
17
- 'x-request-id',
18
- 'x-variant-id',
19
- ], headersPrefix = 'x-af-', } = overrides;
20
- validateHeaderList(headersToPropagate);
21
- const headersToInject = setAndPropagateCorrelationId === true
22
- ? [correlationIdHeader, ...headersToPropagate]
23
- : headersToPropagate;
24
- return {
25
- setAndPropagateCorrelationId,
26
- propagateInResponses,
27
- correlationIdHeader,
28
- headersToCollect: headersToPropagate,
29
- headersToInject,
30
- headersPrefix,
31
- };
32
- };
33
- exports.default = {
34
- load,
35
- correlationIdHeader,
36
- };
37
- //# 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;AAeF,MAAM,IAAI,GAAG,CAAC,YAAuB,EAAE,EAAgB,EAAE;IACvD,MAAM,EACJ,4BAA4B,GAAG,IAAI,EACnC,oBAAoB,GAAG,KAAK,EAC5B,kBAAkB,GAAG;QACnB,cAAc;QACd,cAAc;KACf,EACD,aAAa,GAAG,OAAO,GACxB,GAAG,SAAS,CAAC;IAEd,kBAAkB,CAAC,kBAAkB,CAAC,CAAC;IAEvC,MAAM,eAAe,GAAG,4BAA4B,KAAK,IAAI;QAC3D,CAAC,CAAC,CAAC,mBAAmB,EAAE,GAAG,kBAAkB,CAAC;QAC9C,CAAC,CAAC,kBAAkB,CAAC;IAEvB,OAAO;QACL,4BAA4B;QAC5B,oBAAoB;QACpB,mBAAmB;QACnB,gBAAgB,EAAE,kBAAkB;QACpC,eAAe;QACf,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,2 +0,0 @@
1
- import { LoadedConfig } from './config';
2
- export default function wrapHttp(config: LoadedConfig): void;
@@ -1,118 +0,0 @@
1
- "use strict";
2
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
- if (k2 === undefined) k2 = k;
4
- var desc = Object.getOwnPropertyDescriptor(m, k);
5
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
- desc = { enumerable: true, get: function() { return m[k]; } };
7
- }
8
- Object.defineProperty(o, k2, desc);
9
- }) : (function(o, m, k, k2) {
10
- if (k2 === undefined) k2 = k;
11
- o[k2] = m[k];
12
- }));
13
- var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
- Object.defineProperty(o, "default", { enumerable: true, value: v });
15
- }) : function(o, v) {
16
- o["default"] = v;
17
- });
18
- var __importStar = (this && this.__importStar) || function (mod) {
19
- if (mod && mod.__esModule) return mod;
20
- var result = {};
21
- if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
- __setModuleDefault(result, mod);
23
- return result;
24
- };
25
- var __importDefault = (this && this.__importDefault) || function (mod) {
26
- return (mod && mod.__esModule) ? mod : { "default": mod };
27
- };
28
- Object.defineProperty(exports, "__esModule", { value: true });
29
- const node_http_1 = __importDefault(require("node:http"));
30
- const node_crypto_1 = require("node:crypto");
31
- const tracer_1 = __importStar(require("./tracer"));
32
- const const_1 = require("./const");
33
- const generateShortId = () => (0, node_crypto_1.randomUUID)().split('-')[0];
34
- const originalHttpCreateServer = node_http_1.default.createServer;
35
- const originalRequest = node_http_1.default.request;
36
- const originalGet = node_http_1.default.get;
37
- function setAndCollectCorrelationId(config, req, res) {
38
- const correlationId = req.headers[config.correlationIdHeader] ?? generateShortId();
39
- tracer_1.default.currentTrace.context.set(config.correlationIdHeader, correlationId);
40
- res.setHeader(config.correlationIdHeader, correlationId);
41
- }
42
- function collect(req, headers, headersPrefix) {
43
- const prefixHeaders = headersPrefix
44
- ? Object.keys(req.headers).filter((hn) => hn.includes(headersPrefix))
45
- : [];
46
- [...headers, ...prefixHeaders].forEach((header) => {
47
- if (typeof req.headers[header] !== 'undefined') {
48
- tracer_1.default.currentTrace.context.set(header, req.headers[header]);
49
- }
50
- });
51
- }
52
- function injectInResponse(response, headers) {
53
- if (tracer_1.default.currentTrace) {
54
- headers.forEach((header) => {
55
- response.setHeader(header, tracer_1.default.currentTrace.context.get(header));
56
- });
57
- }
58
- }
59
- function wrappedListener(config, listener) {
60
- // @ts-expect-error we add next and error which don't exist on the original type
61
- return (req, res, next, error) => {
62
- (0, tracer_1.newTrace)(const_1.traceTypes.HTTP_REQUEST);
63
- if (config.setAndPropagateCorrelationId === true) {
64
- setAndCollectCorrelationId(config, req, res);
65
- }
66
- collect(req, config.headersToCollect, config.headersPrefix);
67
- if (config.propagateInResponses) {
68
- injectInResponse(res, [config.correlationIdHeader]);
69
- }
70
- // @ts-expect-error we add next and error which don't exist on the original type
71
- listener(req, res, next, error);
72
- };
73
- }
74
- function wrapHttpCreateServer(config) {
75
- function wrappedHttpCreateServer(options, listener) {
76
- listener = listener || options;
77
- return originalHttpCreateServer(wrappedListener(config, listener));
78
- }
79
- return wrappedHttpCreateServer;
80
- }
81
- function inject(options) {
82
- if (tracer_1.default.currentTrace) {
83
- options.headers || (options.headers = {});
84
- [...(tracer_1.default.currentTrace.context.keys())].forEach((header) => {
85
- options.headers[header] = tracer_1.default.currentTrace.context.get(header);
86
- });
87
- }
88
- }
89
- function wrapHttpRequest(originalMethod) {
90
- // Return type
91
- function urlFirst(url, options, cb) {
92
- inject(options);
93
- return originalMethod(url, options, cb);
94
- }
95
- function optionsFirst(options, cb) {
96
- inject(options);
97
- return originalMethod(options, cb);
98
- }
99
- function wrappedHttpRequest(...args) {
100
- let options = {};
101
- let url;
102
- let callback;
103
- if (args.length === 3) {
104
- [options, url, callback] = args;
105
- return urlFirst(url, options, callback);
106
- }
107
- [options, callback] = args;
108
- return optionsFirst(options, callback);
109
- }
110
- return wrappedHttpRequest;
111
- }
112
- function wrapHttp(config) {
113
- node_http_1.default.createServer = wrapHttpCreateServer(config);
114
- node_http_1.default.request = wrapHttpRequest(originalRequest);
115
- node_http_1.default.get = wrapHttpRequest(originalGet);
116
- }
117
- exports.default = wrapHttp;
118
- //# 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,18 +0,0 @@
1
- import asyncHooks from 'node:async_hooks';
2
- import type { TraceType } from './const';
3
- interface Tracer {
4
- currentTrace: Trace | null;
5
- traces: Record<number, Trace>;
6
- }
7
- declare const tracer: Tracer;
8
- declare class Trace {
9
- type: string;
10
- readonly id: `${string}-${string}-${string}-${string}-${string}`;
11
- readonly context: Map<string, string>;
12
- constructor(type: string);
13
- }
14
- export type { Trace };
15
- export declare const enable: () => asyncHooks.AsyncHook;
16
- export declare const newTrace: (type: TraceType) => Trace;
17
- export declare const getCurrentTrace: () => Partial<Trace>;
18
- export default tracer;
package/dist/tracer.js DELETED
@@ -1,68 +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
- exports.getCurrentTrace = exports.newTrace = exports.enable = void 0;
7
- const node_async_hooks_1 = __importDefault(require("node:async_hooks"));
8
- const node_crypto_1 = require("node:crypto");
9
- const prevStates = {};
10
- const tracer = {
11
- currentTrace: null,
12
- traces: {},
13
- };
14
- function init(asyncId, type, triggerAsyncId) {
15
- if (tracer.traces[triggerAsyncId]) {
16
- tracer.traces[asyncId] = tracer.traces[triggerAsyncId];
17
- }
18
- }
19
- function before(asyncId) {
20
- if (!tracer.traces[asyncId]) {
21
- return;
22
- }
23
- prevStates[asyncId] = tracer.currentTrace;
24
- tracer.currentTrace = tracer.traces[asyncId];
25
- }
26
- function after(asyncId) {
27
- if (!tracer.traces[asyncId]) {
28
- return;
29
- }
30
- tracer.currentTrace = prevStates[asyncId];
31
- }
32
- function destroy(asyncId) {
33
- if (tracer.traces[asyncId]) {
34
- delete tracer.traces[asyncId];
35
- delete prevStates[asyncId];
36
- }
37
- }
38
- const hook = node_async_hooks_1.default.createHook({
39
- init, before, after, destroy,
40
- });
41
- class Trace {
42
- constructor(type) {
43
- this.type = type;
44
- this.id = (0, node_crypto_1.randomUUID)();
45
- this.context = new Map();
46
- }
47
- }
48
- let isTraceEnabled = false;
49
- const enable = () => {
50
- if (isTraceEnabled) {
51
- return hook;
52
- }
53
- hook.enable();
54
- isTraceEnabled = true;
55
- return hook;
56
- };
57
- exports.enable = enable;
58
- const newTrace = (type) => {
59
- (0, exports.enable)();
60
- tracer.currentTrace = new Trace(type);
61
- tracer.traces[node_async_hooks_1.default.executionAsyncId()] = tracer.currentTrace;
62
- return tracer.currentTrace;
63
- };
64
- exports.newTrace = newTrace;
65
- const getCurrentTrace = () => tracer.currentTrace || {};
66
- exports.getCurrentTrace = getCurrentTrace;
67
- exports.default = tracer;
68
- //# sourceMappingURL=tracer.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"tracer.js","sourceRoot":"","sources":["../src/tracer.ts"],"names":[],"mappings":";;;;;;AAAA,wEAA0C;AAC1C,6CAAyC;AAQzC,MAAM,UAAU,GAA0B,EAAE,CAAC;AAE7C,MAAM,MAAM,GAAW;IACrB,YAAY,EAAE,IAAI;IAClB,MAAM,EAAE,EAAE;CACX,CAAC;AAEF,SAAS,IAAI,CAAC,OAAe,EAAE,IAAY,EAAE,cAAsB;IACjE,IAAI,MAAM,CAAC,MAAM,CAAC,cAAc,CAAC,EAAE;QACjC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC;KACxD;AACH,CAAC;AAED,SAAS,MAAM,CAAC,OAAe;IAC7B,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE;QAC3B,OAAO;KACR;IACD,UAAU,CAAC,OAAO,CAAC,GAAG,MAAM,CAAC,YAAY,CAAC;IAC1C,MAAM,CAAC,YAAY,GAAG,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;AAC/C,CAAC;AAED,SAAS,KAAK,CAAC,OAAe;IAC5B,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE;QAC3B,OAAO;KACR;IACD,MAAM,CAAC,YAAY,GAAG,UAAU,CAAC,OAAO,CAAC,CAAC;AAC5C,CAAC;AAED,SAAS,OAAO,CAAC,OAAe;IAC9B,IAAI,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE;QAC1B,OAAO,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QAC9B,OAAO,UAAU,CAAC,OAAO,CAAC,CAAC;KAC5B;AACH,CAAC;AAED,MAAM,IAAI,GAAG,0BAAU,CAAC,UAAU,CAAC;IACjC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO;CAC7B,CAAC,CAAC;AAEH,MAAM,KAAK;IAKT,YAAmB,IAAY;QAAZ,SAAI,GAAJ,IAAI,CAAQ;QAJf,OAAE,GAAG,IAAA,wBAAU,GAAE,CAAC;QAElB,YAAO,GAAG,IAAI,GAAG,EAAkB,CAAC;IAElB,CAAC;CACpC;AAGD,IAAI,cAAc,GAAG,KAAK,CAAC;AAEpB,MAAM,MAAM,GAAG,GAAyB,EAAE;IAC/C,IAAI,cAAc,EAAE;QAClB,OAAO,IAAI,CAAC;KACb;IACD,IAAI,CAAC,MAAM,EAAE,CAAC;IACd,cAAc,GAAG,IAAI,CAAC;IACtB,OAAO,IAAI,CAAC;AACd,CAAC,CAAC;AAPW,QAAA,MAAM,UAOjB;AAEK,MAAM,QAAQ,GAAG,CAAC,IAAe,EAAS,EAAE;IACjD,IAAA,cAAM,GAAE,CAAC;IACT,MAAM,CAAC,YAAY,GAAG,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC;IACtC,MAAM,CAAC,MAAM,CAAC,0BAAU,CAAC,gBAAgB,EAAE,CAAC,GAAG,MAAM,CAAC,YAAY,CAAC;IACnE,OAAO,MAAM,CAAC,YAAY,CAAC;AAC7B,CAAC,CAAC;AALW,QAAA,QAAQ,YAKnB;AAEK,MAAM,eAAe,GAAG,GAAmB,EAAE,CAAC,MAAM,CAAC,YAAY,IAAI,EAAE,CAAC;AAAlE,QAAA,eAAe,mBAAmD;AAE/E,kBAAe,MAAM,CAAC"}