@webpieces/core-util 0.3.276 → 0.3.277
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/package.json +1 -1
- package/src/http/ContextMgr.d.ts +83 -0
- package/src/http/ContextMgr.js +92 -0
- package/src/http/ContextMgr.js.map +1 -0
- package/src/http/RequestIdChainProcessor.d.ts +20 -0
- package/src/http/RequestIdChainProcessor.js +35 -0
- package/src/http/RequestIdChainProcessor.js.map +1 -0
- package/src/index.d.ts +2 -0
- package/src/index.js +9 -1
- package/src/index.js.map +1 -1
package/package.json
CHANGED
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
import { ContextReader } from './ContextReader';
|
|
2
|
+
import { HeaderMethods } from './HeaderMethods';
|
|
3
|
+
import { HeaderRegistry } from './HeaderRegistry';
|
|
4
|
+
/**
|
|
5
|
+
* ContextMgr - Manages context reader + header registry for HTTP clients.
|
|
6
|
+
*
|
|
7
|
+
* Passed to createApiClient() via ClientConfig.contextMgr to enable automatic
|
|
8
|
+
* header propagation: every header in the registry with isWantTransferred=true
|
|
9
|
+
* is read from the ContextReader and added to outbound requests.
|
|
10
|
+
*
|
|
11
|
+
* Browser-safe (no AsyncLocalStorage): the server-side reader
|
|
12
|
+
* (RequestContextReader, in @webpieces/core-context) and the browser store
|
|
13
|
+
* (MutableContextStore, in @webpieces/http-client) both implement ContextReader,
|
|
14
|
+
* so ContextMgr itself lives here in browser+node core-util.
|
|
15
|
+
*
|
|
16
|
+
* BREAKING (migration from the PlatformHeader[] constructor):
|
|
17
|
+
* new ContextMgr(reader, headerArray)
|
|
18
|
+
* becomes
|
|
19
|
+
* new ContextMgr(reader, new HeaderRegistry([new PlatformHeadersExtension(headerArray)]))
|
|
20
|
+
*
|
|
21
|
+
* Example usage:
|
|
22
|
+
* ```typescript
|
|
23
|
+
* // Node.js server-side (reads the magic context from RequestContext):
|
|
24
|
+
* const contextMgr = new ContextMgr(new RequestContextReader(), registry);
|
|
25
|
+
*
|
|
26
|
+
* // Browser client-side (app-managed store, no AsyncLocalStorage):
|
|
27
|
+
* const store = new MutableContextStore();
|
|
28
|
+
* const contextMgr = new ContextMgr(store, registry);
|
|
29
|
+
*
|
|
30
|
+
* // Both cases:
|
|
31
|
+
* const config = new ClientConfig('http://api.example.com', contextMgr);
|
|
32
|
+
* const client = createApiClient(SaveApi, config);
|
|
33
|
+
* ```
|
|
34
|
+
*/
|
|
35
|
+
export declare class ContextMgr {
|
|
36
|
+
/**
|
|
37
|
+
* The context reader that provides header values.
|
|
38
|
+
* Different implementations for Node.js vs browser.
|
|
39
|
+
*/
|
|
40
|
+
readonly contextReader: ContextReader;
|
|
41
|
+
/**
|
|
42
|
+
* The single source of truth for which headers exist and how they behave
|
|
43
|
+
* (transferred/secured/MDC). Shared with the server-side filters.
|
|
44
|
+
*/
|
|
45
|
+
readonly registry: HeaderRegistry;
|
|
46
|
+
/**
|
|
47
|
+
* When true (default), outbound calls send the current x-request-id as
|
|
48
|
+
* x-previous-request-id (and drop x-request-id) so each hop in a
|
|
49
|
+
* distributed trace gets its own id chained to its caller's.
|
|
50
|
+
*/
|
|
51
|
+
readonly chainRequestIds: boolean;
|
|
52
|
+
private chainProcessor;
|
|
53
|
+
constructor(
|
|
54
|
+
/**
|
|
55
|
+
* The context reader that provides header values.
|
|
56
|
+
* Different implementations for Node.js vs browser.
|
|
57
|
+
*/
|
|
58
|
+
contextReader: ContextReader,
|
|
59
|
+
/**
|
|
60
|
+
* The single source of truth for which headers exist and how they behave
|
|
61
|
+
* (transferred/secured/MDC). Shared with the server-side filters.
|
|
62
|
+
*/
|
|
63
|
+
registry: HeaderRegistry,
|
|
64
|
+
/**
|
|
65
|
+
* When true (default), outbound calls send the current x-request-id as
|
|
66
|
+
* x-previous-request-id (and drop x-request-id) so each hop in a
|
|
67
|
+
* distributed trace gets its own id chained to its caller's.
|
|
68
|
+
*/
|
|
69
|
+
chainRequestIds?: boolean);
|
|
70
|
+
/**
|
|
71
|
+
* Build the headers to send on an outbound request: every transferred
|
|
72
|
+
* header (isWantTransferred=true) with a non-empty value in the context,
|
|
73
|
+
* then request-id chaining applied (unless opted out).
|
|
74
|
+
*
|
|
75
|
+
* Values are RAW (unmasked) - this map goes on the wire, not in logs.
|
|
76
|
+
*/
|
|
77
|
+
buildOutboundHeaders(): Map<string, string>;
|
|
78
|
+
/**
|
|
79
|
+
* Build the header map for LOGGING: secured header values are masked,
|
|
80
|
+
* and headers are keyed by loggerMdcKey when defined.
|
|
81
|
+
*/
|
|
82
|
+
buildHeadersForLogging(headerMethods: HeaderMethods): Map<string, string>;
|
|
83
|
+
}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ContextMgr = void 0;
|
|
4
|
+
const RequestIdChainProcessor_1 = require("./RequestIdChainProcessor");
|
|
5
|
+
/**
|
|
6
|
+
* ContextMgr - Manages context reader + header registry for HTTP clients.
|
|
7
|
+
*
|
|
8
|
+
* Passed to createApiClient() via ClientConfig.contextMgr to enable automatic
|
|
9
|
+
* header propagation: every header in the registry with isWantTransferred=true
|
|
10
|
+
* is read from the ContextReader and added to outbound requests.
|
|
11
|
+
*
|
|
12
|
+
* Browser-safe (no AsyncLocalStorage): the server-side reader
|
|
13
|
+
* (RequestContextReader, in @webpieces/core-context) and the browser store
|
|
14
|
+
* (MutableContextStore, in @webpieces/http-client) both implement ContextReader,
|
|
15
|
+
* so ContextMgr itself lives here in browser+node core-util.
|
|
16
|
+
*
|
|
17
|
+
* BREAKING (migration from the PlatformHeader[] constructor):
|
|
18
|
+
* new ContextMgr(reader, headerArray)
|
|
19
|
+
* becomes
|
|
20
|
+
* new ContextMgr(reader, new HeaderRegistry([new PlatformHeadersExtension(headerArray)]))
|
|
21
|
+
*
|
|
22
|
+
* Example usage:
|
|
23
|
+
* ```typescript
|
|
24
|
+
* // Node.js server-side (reads the magic context from RequestContext):
|
|
25
|
+
* const contextMgr = new ContextMgr(new RequestContextReader(), registry);
|
|
26
|
+
*
|
|
27
|
+
* // Browser client-side (app-managed store, no AsyncLocalStorage):
|
|
28
|
+
* const store = new MutableContextStore();
|
|
29
|
+
* const contextMgr = new ContextMgr(store, registry);
|
|
30
|
+
*
|
|
31
|
+
* // Both cases:
|
|
32
|
+
* const config = new ClientConfig('http://api.example.com', contextMgr);
|
|
33
|
+
* const client = createApiClient(SaveApi, config);
|
|
34
|
+
* ```
|
|
35
|
+
*/
|
|
36
|
+
class ContextMgr {
|
|
37
|
+
contextReader;
|
|
38
|
+
registry;
|
|
39
|
+
chainRequestIds;
|
|
40
|
+
chainProcessor;
|
|
41
|
+
constructor(
|
|
42
|
+
/**
|
|
43
|
+
* The context reader that provides header values.
|
|
44
|
+
* Different implementations for Node.js vs browser.
|
|
45
|
+
*/
|
|
46
|
+
contextReader,
|
|
47
|
+
/**
|
|
48
|
+
* The single source of truth for which headers exist and how they behave
|
|
49
|
+
* (transferred/secured/MDC). Shared with the server-side filters.
|
|
50
|
+
*/
|
|
51
|
+
registry,
|
|
52
|
+
/**
|
|
53
|
+
* When true (default), outbound calls send the current x-request-id as
|
|
54
|
+
* x-previous-request-id (and drop x-request-id) so each hop in a
|
|
55
|
+
* distributed trace gets its own id chained to its caller's.
|
|
56
|
+
*/
|
|
57
|
+
chainRequestIds = true) {
|
|
58
|
+
this.contextReader = contextReader;
|
|
59
|
+
this.registry = registry;
|
|
60
|
+
this.chainRequestIds = chainRequestIds;
|
|
61
|
+
this.chainProcessor = new RequestIdChainProcessor_1.RequestIdChainProcessor();
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Build the headers to send on an outbound request: every transferred
|
|
65
|
+
* header (isWantTransferred=true) with a non-empty value in the context,
|
|
66
|
+
* then request-id chaining applied (unless opted out).
|
|
67
|
+
*
|
|
68
|
+
* Values are RAW (unmasked) - this map goes on the wire, not in logs.
|
|
69
|
+
*/
|
|
70
|
+
buildOutboundHeaders() {
|
|
71
|
+
const outbound = new Map();
|
|
72
|
+
for (const header of this.registry.getTransferredHeaders()) {
|
|
73
|
+
const value = this.contextReader.read(header);
|
|
74
|
+
if (value !== undefined && value !== null && value !== '') {
|
|
75
|
+
outbound.set(header.headerName, value);
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
if (this.chainRequestIds) {
|
|
79
|
+
this.chainProcessor.process(outbound);
|
|
80
|
+
}
|
|
81
|
+
return outbound;
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Build the header map for LOGGING: secured header values are masked,
|
|
85
|
+
* and headers are keyed by loggerMdcKey when defined.
|
|
86
|
+
*/
|
|
87
|
+
buildHeadersForLogging(headerMethods) {
|
|
88
|
+
return headerMethods.buildSecureMapForLogs(this.registry.getHeaders(), this.contextReader);
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
exports.ContextMgr = ContextMgr;
|
|
92
|
+
//# sourceMappingURL=ContextMgr.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ContextMgr.js","sourceRoot":"","sources":["../../../../../../packages/core/core-util/src/http/ContextMgr.ts"],"names":[],"mappings":";;;AAGA,uEAAoE;AAEpE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AACH,MAAa,UAAU;IAQC;IAMA;IAOA;IApBZ,cAAc,CAA0B;IAEhD;IACI;;;OAGG;IACa,aAA4B;IAE5C;;;OAGG;IACa,QAAwB;IAExC;;;;OAIG;IACa,kBAA2B,IAAI;QAb/B,kBAAa,GAAb,aAAa,CAAe;QAM5B,aAAQ,GAAR,QAAQ,CAAgB;QAOxB,oBAAe,GAAf,eAAe,CAAgB;QAE/C,IAAI,CAAC,cAAc,GAAG,IAAI,iDAAuB,EAAE,CAAC;IACxD,CAAC;IAED;;;;;;OAMG;IACH,oBAAoB;QAChB,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAkB,CAAC;QAE3C,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,QAAQ,CAAC,qBAAqB,EAAE,EAAE,CAAC;YACzD,MAAM,KAAK,GAAG,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YAC9C,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,EAAE,EAAE,CAAC;gBACxD,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;YAC3C,CAAC;QACL,CAAC;QAED,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC;YACvB,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;QAC1C,CAAC;QAED,OAAO,QAAQ,CAAC;IACpB,CAAC;IAED;;;OAGG;IACH,sBAAsB,CAAC,aAA4B;QAC/C,OAAO,aAAa,CAAC,qBAAqB,CAAC,IAAI,CAAC,QAAQ,CAAC,UAAU,EAAE,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC;IAC/F,CAAC;CACJ;AAzDD,gCAyDC","sourcesContent":["import { ContextReader } from './ContextReader';\nimport { HeaderMethods } from './HeaderMethods';\nimport { HeaderRegistry } from './HeaderRegistry';\nimport { RequestIdChainProcessor } from './RequestIdChainProcessor';\n\n/**\n * ContextMgr - Manages context reader + header registry for HTTP clients.\n *\n * Passed to createApiClient() via ClientConfig.contextMgr to enable automatic\n * header propagation: every header in the registry with isWantTransferred=true\n * is read from the ContextReader and added to outbound requests.\n *\n * Browser-safe (no AsyncLocalStorage): the server-side reader\n * (RequestContextReader, in @webpieces/core-context) and the browser store\n * (MutableContextStore, in @webpieces/http-client) both implement ContextReader,\n * so ContextMgr itself lives here in browser+node core-util.\n *\n * BREAKING (migration from the PlatformHeader[] constructor):\n * new ContextMgr(reader, headerArray)\n * becomes\n * new ContextMgr(reader, new HeaderRegistry([new PlatformHeadersExtension(headerArray)]))\n *\n * Example usage:\n * ```typescript\n * // Node.js server-side (reads the magic context from RequestContext):\n * const contextMgr = new ContextMgr(new RequestContextReader(), registry);\n *\n * // Browser client-side (app-managed store, no AsyncLocalStorage):\n * const store = new MutableContextStore();\n * const contextMgr = new ContextMgr(store, registry);\n *\n * // Both cases:\n * const config = new ClientConfig('http://api.example.com', contextMgr);\n * const client = createApiClient(SaveApi, config);\n * ```\n */\nexport class ContextMgr {\n private chainProcessor: RequestIdChainProcessor;\n\n constructor(\n /**\n * The context reader that provides header values.\n * Different implementations for Node.js vs browser.\n */\n public readonly contextReader: ContextReader,\n\n /**\n * The single source of truth for which headers exist and how they behave\n * (transferred/secured/MDC). Shared with the server-side filters.\n */\n public readonly registry: HeaderRegistry,\n\n /**\n * When true (default), outbound calls send the current x-request-id as\n * x-previous-request-id (and drop x-request-id) so each hop in a\n * distributed trace gets its own id chained to its caller's.\n */\n public readonly chainRequestIds: boolean = true,\n ) {\n this.chainProcessor = new RequestIdChainProcessor();\n }\n\n /**\n * Build the headers to send on an outbound request: every transferred\n * header (isWantTransferred=true) with a non-empty value in the context,\n * then request-id chaining applied (unless opted out).\n *\n * Values are RAW (unmasked) - this map goes on the wire, not in logs.\n */\n buildOutboundHeaders(): Map<string, string> {\n const outbound = new Map<string, string>();\n\n for (const header of this.registry.getTransferredHeaders()) {\n const value = this.contextReader.read(header);\n if (value !== undefined && value !== null && value !== '') {\n outbound.set(header.headerName, value);\n }\n }\n\n if (this.chainRequestIds) {\n this.chainProcessor.process(outbound);\n }\n\n return outbound;\n }\n\n /**\n * Build the header map for LOGGING: secured header values are masked,\n * and headers are keyed by loggerMdcKey when defined.\n */\n buildHeadersForLogging(headerMethods: HeaderMethods): Map<string, string> {\n return headerMethods.buildSecureMapForLogs(this.registry.getHeaders(), this.contextReader);\n }\n}\n"]}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* RequestIdChainProcessor - Builds the per-hop distributed-trace chain.
|
|
3
|
+
*
|
|
4
|
+
* TS equivalent of the Java MicroSvcHeader REQUEST_ID/PREVIOUS_REQUEST_ID flow:
|
|
5
|
+
* when a server makes an outbound call, its CURRENT request id is sent to the
|
|
6
|
+
* downstream service as x-previous-request-id, and x-request-id is NOT sent -
|
|
7
|
+
* the downstream ContextFilter then generates a fresh id for its own hop.
|
|
8
|
+
* Result: every hop has its own id plus a pointer to its caller's id, forming
|
|
9
|
+
* a trace tree.
|
|
10
|
+
*
|
|
11
|
+
* Invoked by ContextMgr.buildOutboundHeaders() after the transferred headers
|
|
12
|
+
* are collected. Opt out via `new ContextMgr(reader, registry, false)` if you
|
|
13
|
+
* want raw pass-through of x-request-id instead.
|
|
14
|
+
*/
|
|
15
|
+
export declare class RequestIdChainProcessor {
|
|
16
|
+
/**
|
|
17
|
+
* Rewrite the outbound header map in place: x-request-id -> x-previous-request-id.
|
|
18
|
+
*/
|
|
19
|
+
process(outboundHeaders: Map<string, string>): void;
|
|
20
|
+
}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.RequestIdChainProcessor = void 0;
|
|
4
|
+
const WebpiecesCoreHeaders_1 = require("./WebpiecesCoreHeaders");
|
|
5
|
+
/**
|
|
6
|
+
* RequestIdChainProcessor - Builds the per-hop distributed-trace chain.
|
|
7
|
+
*
|
|
8
|
+
* TS equivalent of the Java MicroSvcHeader REQUEST_ID/PREVIOUS_REQUEST_ID flow:
|
|
9
|
+
* when a server makes an outbound call, its CURRENT request id is sent to the
|
|
10
|
+
* downstream service as x-previous-request-id, and x-request-id is NOT sent -
|
|
11
|
+
* the downstream ContextFilter then generates a fresh id for its own hop.
|
|
12
|
+
* Result: every hop has its own id plus a pointer to its caller's id, forming
|
|
13
|
+
* a trace tree.
|
|
14
|
+
*
|
|
15
|
+
* Invoked by ContextMgr.buildOutboundHeaders() after the transferred headers
|
|
16
|
+
* are collected. Opt out via `new ContextMgr(reader, registry, false)` if you
|
|
17
|
+
* want raw pass-through of x-request-id instead.
|
|
18
|
+
*/
|
|
19
|
+
class RequestIdChainProcessor {
|
|
20
|
+
/**
|
|
21
|
+
* Rewrite the outbound header map in place: x-request-id -> x-previous-request-id.
|
|
22
|
+
*/
|
|
23
|
+
process(outboundHeaders) {
|
|
24
|
+
const requestIdName = WebpiecesCoreHeaders_1.WebpiecesCoreHeaders.REQUEST_ID.headerName;
|
|
25
|
+
const previousIdName = WebpiecesCoreHeaders_1.WebpiecesCoreHeaders.PREVIOUS_REQUEST_ID.headerName;
|
|
26
|
+
const currentRequestId = outboundHeaders.get(requestIdName);
|
|
27
|
+
if (currentRequestId === undefined) {
|
|
28
|
+
return;
|
|
29
|
+
}
|
|
30
|
+
outboundHeaders.set(previousIdName, currentRequestId);
|
|
31
|
+
outboundHeaders.delete(requestIdName);
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
exports.RequestIdChainProcessor = RequestIdChainProcessor;
|
|
35
|
+
//# sourceMappingURL=RequestIdChainProcessor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RequestIdChainProcessor.js","sourceRoot":"","sources":["../../../../../../packages/core/core-util/src/http/RequestIdChainProcessor.ts"],"names":[],"mappings":";;;AAAA,iEAA8D;AAE9D;;;;;;;;;;;;;GAaG;AACH,MAAa,uBAAuB;IAChC;;OAEG;IACH,OAAO,CAAC,eAAoC;QACxC,MAAM,aAAa,GAAG,2CAAoB,CAAC,UAAU,CAAC,UAAU,CAAC;QACjE,MAAM,cAAc,GAAG,2CAAoB,CAAC,mBAAmB,CAAC,UAAU,CAAC;QAE3E,MAAM,gBAAgB,GAAG,eAAe,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;QAC5D,IAAI,gBAAgB,KAAK,SAAS,EAAE,CAAC;YACjC,OAAO;QACX,CAAC;QAED,eAAe,CAAC,GAAG,CAAC,cAAc,EAAE,gBAAgB,CAAC,CAAC;QACtD,eAAe,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;IAC1C,CAAC;CACJ;AAhBD,0DAgBC","sourcesContent":["import { WebpiecesCoreHeaders } from './WebpiecesCoreHeaders';\n\n/**\n * RequestIdChainProcessor - Builds the per-hop distributed-trace chain.\n *\n * TS equivalent of the Java MicroSvcHeader REQUEST_ID/PREVIOUS_REQUEST_ID flow:\n * when a server makes an outbound call, its CURRENT request id is sent to the\n * downstream service as x-previous-request-id, and x-request-id is NOT sent -\n * the downstream ContextFilter then generates a fresh id for its own hop.\n * Result: every hop has its own id plus a pointer to its caller's id, forming\n * a trace tree.\n *\n * Invoked by ContextMgr.buildOutboundHeaders() after the transferred headers\n * are collected. Opt out via `new ContextMgr(reader, registry, false)` if you\n * want raw pass-through of x-request-id instead.\n */\nexport class RequestIdChainProcessor {\n /**\n * Rewrite the outbound header map in place: x-request-id -> x-previous-request-id.\n */\n process(outboundHeaders: Map<string, string>): void {\n const requestIdName = WebpiecesCoreHeaders.REQUEST_ID.headerName;\n const previousIdName = WebpiecesCoreHeaders.PREVIOUS_REQUEST_ID.headerName;\n\n const currentRequestId = outboundHeaders.get(requestIdName);\n if (currentRequestId === undefined) {\n return;\n }\n\n outboundHeaders.set(previousIdName, currentRequestId);\n outboundHeaders.delete(requestIdName);\n }\n}\n"]}
|
package/src/index.d.ts
CHANGED
|
@@ -27,6 +27,8 @@ export { WebpiecesCoreHeaders } from './http/WebpiecesCoreHeaders';
|
|
|
27
27
|
export { HeaderMethods } from './http/HeaderMethods';
|
|
28
28
|
export { ContextReader } from './http/ContextReader';
|
|
29
29
|
export { HEADER_TYPES } from './http/HeaderTypes';
|
|
30
|
+
export { ContextMgr } from './http/ContextMgr';
|
|
31
|
+
export { RequestIdChainProcessor } from './http/RequestIdChainProcessor';
|
|
30
32
|
export { LogApiCall } from './http/LogApiCall';
|
|
31
33
|
export { TestCaseRecorder, RecorderKeys } from './http/recorder/TestCaseRecorder';
|
|
32
34
|
export { RecordedEndpoint, RecordedError, RecordedTestCase } from './http/recorder/RecordedEndpoint';
|
package/src/index.js
CHANGED
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
*/
|
|
10
10
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
11
11
|
exports.NOT_APPROVED = exports.WRONG_LOGIN = exports.WRONG_LOGIN_TYPE = exports.ENTITY_NOT_FOUND = exports.HttpUserError = exports.HttpVendorError = exports.HttpInternalServerError = exports.HttpGatewayTimeoutError = exports.HttpBadGatewayError = exports.HttpTimeoutError = exports.HttpForbiddenError = exports.HttpUnauthorizedError = exports.HttpBadRequestError = exports.EndpointNotFoundError = exports.HttpNotFoundError = exports.HttpError = exports.ProtocolError = exports.METADATA_KEYS = exports.RouteMetadata = exports.AuthMeta = exports.validateNoConflictingDecorators = exports.getQueueName = exports.assertPubSubConventions = exports.assertApiKind = exports.getApiKind = exports.assertEveryEndpointHasAuthMode = exports.getAuthMode = exports.getAuthMeta = exports.isApiPath = exports.getEndpoints = exports.getApiPath = exports.Queue = exports.PubSub = exports.Rpc = exports.AuthSharedSecret = exports.AuthOidc = exports.AuthJwt = exports.Public = exports.AuthenticationConfig = exports.Authentication = exports.Endpoint = exports.ApiPath = exports.LogManager = exports.ConsoleLoggerFactory = exports.ConsoleLogger = exports.DESIGN_METADATA_KEYS = exports.isDocumentDesign = exports.DocumentDesign = exports.ContextKey = exports.toError = void 0;
|
|
12
|
-
exports.SerializedError = exports.SerializedMap = exports.RecordSerializer = exports.getDoNotRecordFields = exports.DoNotRecord = exports.RecordedTestCase = exports.RecordedError = exports.RecordedEndpoint = exports.RecorderKeys = exports.LogApiCall = exports.HEADER_TYPES = exports.HeaderMethods = exports.WebpiecesCoreHeaders = exports.HeaderRegistry = exports.PlatformHeadersExtension = exports.PlatformHeader = exports.DateTimeUtil = exports.TimeUtil = exports.DateUtil = exports.InstantUtil = exports.NO_REG_CODE = exports.WRONG_COMPANY = exports.WRONG_DOMAIN = exports.EMAIL_NOT_CONFIRMED = void 0;
|
|
12
|
+
exports.SerializedError = exports.SerializedMap = exports.RecordSerializer = exports.getDoNotRecordFields = exports.DoNotRecord = exports.RecordedTestCase = exports.RecordedError = exports.RecordedEndpoint = exports.RecorderKeys = exports.LogApiCall = exports.RequestIdChainProcessor = exports.ContextMgr = exports.HEADER_TYPES = exports.HeaderMethods = exports.WebpiecesCoreHeaders = exports.HeaderRegistry = exports.PlatformHeadersExtension = exports.PlatformHeader = exports.DateTimeUtil = exports.TimeUtil = exports.DateUtil = exports.InstantUtil = exports.NO_REG_CODE = exports.WRONG_COMPANY = exports.WRONG_DOMAIN = exports.EMAIL_NOT_CONFIRMED = void 0;
|
|
13
13
|
var errorUtils_1 = require("./lib/errorUtils");
|
|
14
14
|
Object.defineProperty(exports, "toError", { enumerable: true, get: function () { return errorUtils_1.toError; } });
|
|
15
15
|
var ContextKey_1 = require("./ContextKey");
|
|
@@ -104,6 +104,14 @@ var HeaderMethods_1 = require("./http/HeaderMethods");
|
|
|
104
104
|
Object.defineProperty(exports, "HeaderMethods", { enumerable: true, get: function () { return HeaderMethods_1.HeaderMethods; } });
|
|
105
105
|
var HeaderTypes_1 = require("./http/HeaderTypes");
|
|
106
106
|
Object.defineProperty(exports, "HEADER_TYPES", { enumerable: true, get: function () { return HeaderTypes_1.HEADER_TYPES; } });
|
|
107
|
+
// Outbound-header machinery (context reader + registry -> outbound HTTP headers).
|
|
108
|
+
// Browser-safe — the server-side reader (RequestContextReader) and browser store
|
|
109
|
+
// (MutableContextStore) both implement ContextReader, so this lives here rather
|
|
110
|
+
// than in the Node-only @webpieces/core-context (which re-exports for back-compat).
|
|
111
|
+
var ContextMgr_1 = require("./http/ContextMgr");
|
|
112
|
+
Object.defineProperty(exports, "ContextMgr", { enumerable: true, get: function () { return ContextMgr_1.ContextMgr; } });
|
|
113
|
+
var RequestIdChainProcessor_1 = require("./http/RequestIdChainProcessor");
|
|
114
|
+
Object.defineProperty(exports, "RequestIdChainProcessor", { enumerable: true, get: function () { return RequestIdChainProcessor_1.RequestIdChainProcessor; } });
|
|
107
115
|
// API-call logging helper (uses LogManager above)
|
|
108
116
|
var LogApiCall_1 = require("./http/LogApiCall");
|
|
109
117
|
Object.defineProperty(exports, "LogApiCall", { enumerable: true, get: function () { return LogApiCall_1.LogApiCall; } });
|
package/src/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../packages/core/core-util/src/index.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * @webpieces/core-util\n *\n * Utility functions for WebPieces applications.\n * This package works in both browser and Node.js environments.\n *\n * @packageDocumentation\n */\n\nexport { toError } from './lib/errorUtils';\nexport { Header } from './Header';\nexport { ContextKey } from './ContextKey';\n\n// @DocumentDesign — DI-design-root marker. Applies to ANY project kind (server\n// controllers AND library impl classes), so it lives here (browser + Node) rather\n// than in a server-only routing package.\nexport { DocumentDesign, isDocumentDesign, DESIGN_METADATA_KEYS } from './DocumentDesign';\n\n// Logging (merged from former @webpieces/wp-logging).\n// Pluggable logging interface + a browser-safe console default; apps plug in\n// bunyan/winston/pino/etc. via LogManager.setLogger(...). Browser + Node.\nexport type { Logger, LogLevel } from './logging/Logger';\nexport type { LoggerFactory } from './logging/LoggerFactory';\nexport { ConsoleLogger } from './logging/ConsoleLogger';\nexport { ConsoleLoggerFactory } from './logging/ConsoleLoggerFactory';\nexport { LogManager } from './logging/LogManager';\n\n// HTTP API contract (merged from former @webpieces/http-api).\n// Shared HTTP API definition consumed by both client and server: REST\n// decorators, the HttpError hierarchy, datetime DTOs, platform-header\n// registry/readers, ValidateImplementation, and the test-case recorder\n// contract. Pure definitions — express-free, browser + Node safe.\n\n// API definition decorators\nexport {\n ApiPath,\n Endpoint,\n Authentication,\n AuthenticationConfig,\n // Auth mode decorators (clean service-to-service + user JWT model)\n Public,\n AuthJwt,\n AuthOidc,\n AuthSharedSecret,\n // API kind (RPC vs PubSub/Cloud Tasks) + queue naming\n Rpc,\n PubSub,\n Queue,\n getApiPath,\n getEndpoints,\n isApiPath,\n getAuthMeta,\n getAuthMode,\n assertEveryEndpointHasAuthMode,\n getApiKind,\n assertApiKind,\n assertPubSubConventions,\n getQueueName,\n validateNoConflictingDecorators,\n AuthMeta,\n RouteMetadata,\n METADATA_KEYS,\n} from './http/decorators';\nexport type { AuthMode, ApiKind } from './http/decorators';\n\n// Type validators\nexport { ValidateImplementation } from './http/validators';\n\n// HTTP errors\nexport {\n ProtocolError,\n HttpError,\n HttpNotFoundError,\n EndpointNotFoundError,\n HttpBadRequestError,\n HttpUnauthorizedError,\n HttpForbiddenError,\n HttpTimeoutError,\n HttpBadGatewayError,\n HttpGatewayTimeoutError,\n HttpInternalServerError,\n HttpVendorError,\n HttpUserError,\n // Error subtype constants\n ENTITY_NOT_FOUND,\n WRONG_LOGIN_TYPE,\n WRONG_LOGIN,\n NOT_APPROVED,\n EMAIL_NOT_CONFIRMED,\n WRONG_DOMAIN,\n WRONG_COMPANY,\n NO_REG_CODE,\n} from './http/errors';\n\n// Date/Time DTOs and Utilities (inspired by Java Time / JSR-310)\nexport {\n InstantDto,\n DateDto,\n TimeDto,\n DateTimeDto,\n InstantUtil,\n DateUtil,\n TimeUtil,\n DateTimeUtil,\n} from './http/datetime';\n\n// Platform Headers\nexport { PlatformHeader } from './http/PlatformHeader';\nexport { PlatformHeadersExtension } from './http/PlatformHeadersExtension';\nexport { HeaderRegistry } from './http/HeaderRegistry';\nexport { WebpiecesCoreHeaders } from './http/WebpiecesCoreHeaders';\nexport { HeaderMethods } from './http/HeaderMethods';\nexport { ContextReader } from './http/ContextReader';\nexport { HEADER_TYPES } from './http/HeaderTypes';\n\n// API-call logging helper (uses LogManager above)\nexport { LogApiCall } from './http/LogApiCall';\n\n// Test-case recording contract (impl lives in http-server; hooks in http-client)\nexport { TestCaseRecorder, RecorderKeys } from './http/recorder/TestCaseRecorder';\nexport { RecordedEndpoint, RecordedError, RecordedTestCase } from './http/recorder/RecordedEndpoint';\nexport { DoNotRecord, getDoNotRecordFields } from './http/recorder/DoNotRecord';\nexport { RecordSerializer, SerializedMap, SerializedError } from './http/recorder/RecordSerializer';\n"]}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../packages/core/core-util/src/index.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * @webpieces/core-util\n *\n * Utility functions for WebPieces applications.\n * This package works in both browser and Node.js environments.\n *\n * @packageDocumentation\n */\n\nexport { toError } from './lib/errorUtils';\nexport { Header } from './Header';\nexport { ContextKey } from './ContextKey';\n\n// @DocumentDesign — DI-design-root marker. Applies to ANY project kind (server\n// controllers AND library impl classes), so it lives here (browser + Node) rather\n// than in a server-only routing package.\nexport { DocumentDesign, isDocumentDesign, DESIGN_METADATA_KEYS } from './DocumentDesign';\n\n// Logging (merged from former @webpieces/wp-logging).\n// Pluggable logging interface + a browser-safe console default; apps plug in\n// bunyan/winston/pino/etc. via LogManager.setLogger(...). Browser + Node.\nexport type { Logger, LogLevel } from './logging/Logger';\nexport type { LoggerFactory } from './logging/LoggerFactory';\nexport { ConsoleLogger } from './logging/ConsoleLogger';\nexport { ConsoleLoggerFactory } from './logging/ConsoleLoggerFactory';\nexport { LogManager } from './logging/LogManager';\n\n// HTTP API contract (merged from former @webpieces/http-api).\n// Shared HTTP API definition consumed by both client and server: REST\n// decorators, the HttpError hierarchy, datetime DTOs, platform-header\n// registry/readers, ValidateImplementation, and the test-case recorder\n// contract. Pure definitions — express-free, browser + Node safe.\n\n// API definition decorators\nexport {\n ApiPath,\n Endpoint,\n Authentication,\n AuthenticationConfig,\n // Auth mode decorators (clean service-to-service + user JWT model)\n Public,\n AuthJwt,\n AuthOidc,\n AuthSharedSecret,\n // API kind (RPC vs PubSub/Cloud Tasks) + queue naming\n Rpc,\n PubSub,\n Queue,\n getApiPath,\n getEndpoints,\n isApiPath,\n getAuthMeta,\n getAuthMode,\n assertEveryEndpointHasAuthMode,\n getApiKind,\n assertApiKind,\n assertPubSubConventions,\n getQueueName,\n validateNoConflictingDecorators,\n AuthMeta,\n RouteMetadata,\n METADATA_KEYS,\n} from './http/decorators';\nexport type { AuthMode, ApiKind } from './http/decorators';\n\n// Type validators\nexport { ValidateImplementation } from './http/validators';\n\n// HTTP errors\nexport {\n ProtocolError,\n HttpError,\n HttpNotFoundError,\n EndpointNotFoundError,\n HttpBadRequestError,\n HttpUnauthorizedError,\n HttpForbiddenError,\n HttpTimeoutError,\n HttpBadGatewayError,\n HttpGatewayTimeoutError,\n HttpInternalServerError,\n HttpVendorError,\n HttpUserError,\n // Error subtype constants\n ENTITY_NOT_FOUND,\n WRONG_LOGIN_TYPE,\n WRONG_LOGIN,\n NOT_APPROVED,\n EMAIL_NOT_CONFIRMED,\n WRONG_DOMAIN,\n WRONG_COMPANY,\n NO_REG_CODE,\n} from './http/errors';\n\n// Date/Time DTOs and Utilities (inspired by Java Time / JSR-310)\nexport {\n InstantDto,\n DateDto,\n TimeDto,\n DateTimeDto,\n InstantUtil,\n DateUtil,\n TimeUtil,\n DateTimeUtil,\n} from './http/datetime';\n\n// Platform Headers\nexport { PlatformHeader } from './http/PlatformHeader';\nexport { PlatformHeadersExtension } from './http/PlatformHeadersExtension';\nexport { HeaderRegistry } from './http/HeaderRegistry';\nexport { WebpiecesCoreHeaders } from './http/WebpiecesCoreHeaders';\nexport { HeaderMethods } from './http/HeaderMethods';\nexport { ContextReader } from './http/ContextReader';\nexport { HEADER_TYPES } from './http/HeaderTypes';\n\n// Outbound-header machinery (context reader + registry -> outbound HTTP headers).\n// Browser-safe — the server-side reader (RequestContextReader) and browser store\n// (MutableContextStore) both implement ContextReader, so this lives here rather\n// than in the Node-only @webpieces/core-context (which re-exports for back-compat).\nexport { ContextMgr } from './http/ContextMgr';\nexport { RequestIdChainProcessor } from './http/RequestIdChainProcessor';\n\n// API-call logging helper (uses LogManager above)\nexport { LogApiCall } from './http/LogApiCall';\n\n// Test-case recording contract (impl lives in http-server; hooks in http-client)\nexport { TestCaseRecorder, RecorderKeys } from './http/recorder/TestCaseRecorder';\nexport { RecordedEndpoint, RecordedError, RecordedTestCase } from './http/recorder/RecordedEndpoint';\nexport { DoNotRecord, getDoNotRecordFields } from './http/recorder/DoNotRecord';\nexport { RecordSerializer, SerializedMap, SerializedError } from './http/recorder/RecordSerializer';\n"]}
|