@ya-accelerators/web-backend-framework 0.0.82 → 0.0.84

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.
@@ -1,9 +1,28 @@
1
1
  import { AsyncLocalStorage } from 'async_hooks';
2
2
  export declare const requestContextStorage: AsyncLocalStorage<{
3
3
  headers: Record<string, string>;
4
- forwardHeaders?: Record<string, string>;
4
+ forwardHeaderScopes?: {
5
+ headers: Record<string, string>;
6
+ forHost?: string;
7
+ }[];
8
+ nonForwardableHeaders?: ReadonlySet<string>;
5
9
  path?: string;
6
10
  }>;
7
11
  export declare const getCurrentRequestPath: () => string | undefined;
8
- export declare const runWithRequestHeaders: <T>(headers: Record<string, string>, fn: () => Promise<T>) => Promise<T>;
12
+ export declare const runWithRequestHeaders: <T>(headers: Record<string, string>, fn: () => Promise<T>, options?: {
13
+ forHost?: string;
14
+ }) => Promise<T>;
9
15
  export declare const runWithRequestPath: <T>(path: string, fn: () => Promise<T> | T) => T | Promise<T>;
16
+ export declare const resolveOutboundHeaders: (store: {
17
+ headers: Record<string, string>;
18
+ forwardHeaderScopes?: {
19
+ headers: Record<string, string>;
20
+ forHost?: string;
21
+ }[];
22
+ nonForwardableHeaders?: ReadonlySet<string>;
23
+ }, options: {
24
+ allowList: ReadonlySet<string>;
25
+ targetHost?: string;
26
+ init?: RequestInit;
27
+ inputHeaders?: Headers;
28
+ }) => Headers;
@@ -6,18 +6,27 @@ import { AsyncLocalStorage } from 'async_hooks';
6
6
  // emitted inside a procedure carry the procedure path rather than the bare `/trpc`
7
7
  // from Express.
8
8
  //
9
- // `headers` are the auto-captured inbound request headers; credential-bearing ones are
10
- // NOT auto-forwarded to outbound `fetch` (see `server/express` § DEFAULT_NON_FORWARDABLE_HEADERS).
11
- // `forwardHeaders` are headers set explicitly via `runWithRequestHeaders` — an intentional,
12
- // audited allow path for in-mesh propagation (e.g. corporateServiceAuth's Bearer token) that
13
- // bypasses that deny-list.
9
+ // `headers` are the auto-captured inbound request headers; only tracing headers are
10
+ // auto-forwarded to outbound `fetch` (see `server/express` § AUTO_FORWARD_ALLOW_LIST) —
11
+ // everything else (credentials, client-context quasi-identifiers, content negotiation) is
12
+ // withheld by default. `forwardHeaderScopes` are headers set explicitly via
13
+ // `runWithRequestHeaders` — an intentional, audited in-mesh propagation path. Each scope may
14
+ // be host-bound (`forHost`) so a forwarded credential is only ever attached to a request whose
15
+ // target host matches, and `nonForwardableHeaders` is the per-app additional deny-set carried
16
+ // from `createApp` so the module-global patched `fetch` reads the right app's config.
14
17
  export const requestContextStorage = new AsyncLocalStorage();
15
18
  export const getCurrentRequestPath = () => requestContextStorage.getStore()?.path;
16
- export const runWithRequestHeaders = (headers, fn) => {
19
+ // Attach `headers` to every outbound `fetch` within `fn`. Pass `forHost` to bind them to a single
20
+ // target host so a forwarded credential cannot leak to a different (e.g. cross-origin-redirect) host —
21
+ // undici strips only `authorization` across a cross-origin redirect, so any other custom credential
22
+ // MUST be host-bound to stay contained.
23
+ export const runWithRequestHeaders = (headers, fn, options) => {
17
24
  const current = requestContextStorage.getStore();
25
+ const scope = options?.forHost === undefined ? { headers } : { headers, forHost: options.forHost.toLowerCase() };
18
26
  return requestContextStorage.run({
19
27
  headers: current?.headers ?? {},
20
- forwardHeaders: { ...current?.forwardHeaders, ...headers },
28
+ forwardHeaderScopes: [...(current?.forwardHeaderScopes ?? []), scope],
29
+ ...(current?.nonForwardableHeaders === undefined ? {} : { nonForwardableHeaders: current.nonForwardableHeaders }),
21
30
  ...(current?.path === undefined ? {} : { path: current.path }),
22
31
  }, fn);
23
32
  };
@@ -25,8 +34,50 @@ export const runWithRequestPath = (path, fn) => {
25
34
  const current = requestContextStorage.getStore();
26
35
  return requestContextStorage.run({
27
36
  headers: current?.headers ?? {},
28
- ...(current?.forwardHeaders === undefined ? {} : { forwardHeaders: current.forwardHeaders }),
37
+ ...(current?.forwardHeaderScopes === undefined ? {} : { forwardHeaderScopes: current.forwardHeaderScopes }),
38
+ ...(current?.nonForwardableHeaders === undefined ? {} : { nonForwardableHeaders: current.nonForwardableHeaders }),
29
39
  path,
30
40
  }, fn);
31
41
  };
42
+ // `requestHost()` derives `targetHost` via `new URL(url).host`, which drops a port equal to the scheme
43
+ // default (`http:` 80 / `https:` 443) — so a caller who writes `forHost: 'api.internal:80'` (as the docs
44
+ // show) would never match the `'api.internal'` that an actual `http://api.internal:80/...` fetch produces.
45
+ // Strip the default ports from both sides before comparing so host-binding works for the common in-mesh
46
+ // case (the BFF listens on port 80).
47
+ const stripDefaultPort = (host) => host.replace(/:(?:80|443)$/, '');
48
+ // Compute the header set for a request-scoped outbound `fetch`. Precedence (highest wins):
49
+ // 1. the caller's own per-call headers — `init.headers`, then the input `Request`'s own headers
50
+ // (`fetch(new Request(url, { headers }))`; init wins over the Request per the fetch spec)
51
+ // 2. explicit `runWithRequestHeaders` scopes (inner overrides outer; a host-bound scope applies only
52
+ // when the target host matches — a forwarded credential must not follow a cross-origin redirect)
53
+ // 3. auto-forwarded inbound headers, restricted to `allowList` minus the app's `nonForwardableHeaders`
54
+ // Pure (no I/O / no ALS read) so the branch matrix is unit-testable; `server/express` supplies the store,
55
+ // the framework allow-list, the parsed target host, and the input `Request`'s headers.
56
+ export const resolveOutboundHeaders = (store, options) => {
57
+ // The caller's own headers = the input Request's headers, then overridden by init.headers. Passing a
58
+ // rebuilt `headers` in init to `fetch(Request, init)` otherwise drops the Request's own headers, so
59
+ // they must be carried here.
60
+ const callerHeaders = new Headers(options.inputHeaders ?? undefined);
61
+ for (const [key, value] of new Headers(options.init?.headers ?? {})) {
62
+ callerHeaders.set(key, value);
63
+ }
64
+ const headers = new Headers(callerHeaders);
65
+ for (const [key, value] of Object.entries(store.headers)) {
66
+ const lower = key.toLowerCase();
67
+ if (options.allowList.has(lower) && !store.nonForwardableHeaders?.has(lower) && !headers.has(key)) {
68
+ headers.set(key, value);
69
+ }
70
+ }
71
+ for (const scope of store.forwardHeaderScopes ?? []) {
72
+ if (scope.forHost !== undefined && stripDefaultPort(scope.forHost) !== stripDefaultPort(options.targetHost ?? '')) {
73
+ continue;
74
+ }
75
+ for (const [key, value] of Object.entries(scope.headers)) {
76
+ if (!callerHeaders.has(key)) {
77
+ headers.set(key, value);
78
+ }
79
+ }
80
+ }
81
+ return headers;
82
+ };
32
83
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/context/request/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAA;AAE/C,iFAAiF;AACjF,oFAAoF;AACpF,yFAAyF;AACzF,kFAAkF;AAClF,mFAAmF;AACnF,gBAAgB;AAChB,EAAE;AACF,uFAAuF;AACvF,mGAAmG;AACnG,4FAA4F;AAC5F,6FAA6F;AAC7F,2BAA2B;AAC3B,MAAM,CAAC,MAAM,qBAAqB,GAAG,IAAI,iBAAiB,EAItD,CAAA;AAEJ,MAAM,CAAC,MAAM,qBAAqB,GAAG,GAAG,EAAE,CAAC,qBAAqB,CAAC,QAAQ,EAAE,EAAE,IAAI,CAAA;AAEjF,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAI,OAA+B,EAAE,EAAoB,EAAE,EAAE;IAChG,MAAM,OAAO,GAAG,qBAAqB,CAAC,QAAQ,EAAE,CAAA;IAChD,OAAO,qBAAqB,CAAC,GAAG,CAC9B;QACE,OAAO,EAAE,OAAO,EAAE,OAAO,IAAI,EAAE;QAC/B,cAAc,EAAE,EAAE,GAAG,OAAO,EAAE,cAAc,EAAE,GAAG,OAAO,EAAE;QAC1D,GAAG,CAAC,OAAO,EAAE,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,CAAC;KAC/D,EACD,EAAE,CACH,CAAA;AACH,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAI,IAAY,EAAE,EAAwB,EAAE,EAAE;IAC9E,MAAM,OAAO,GAAG,qBAAqB,CAAC,QAAQ,EAAE,CAAA;IAChD,OAAO,qBAAqB,CAAC,GAAG,CAC9B;QACE,OAAO,EAAE,OAAO,EAAE,OAAO,IAAI,EAAE;QAC/B,GAAG,CAAC,OAAO,EAAE,cAAc,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,cAAc,EAAE,OAAO,CAAC,cAAc,EAAE,CAAC;QAC5F,IAAI;KACL,EACD,EAAE,CACH,CAAA;AACH,CAAC,CAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/context/request/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAA;AAE/C,iFAAiF;AACjF,oFAAoF;AACpF,yFAAyF;AACzF,kFAAkF;AAClF,mFAAmF;AACnF,gBAAgB;AAChB,EAAE;AACF,oFAAoF;AACpF,wFAAwF;AACxF,0FAA0F;AAC1F,4EAA4E;AAC5E,6FAA6F;AAC7F,+FAA+F;AAC/F,8FAA8F;AAC9F,sFAAsF;AACtF,MAAM,CAAC,MAAM,qBAAqB,GAAG,IAAI,iBAAiB,EAKtD,CAAA;AAEJ,MAAM,CAAC,MAAM,qBAAqB,GAAG,GAAG,EAAE,CAAC,qBAAqB,CAAC,QAAQ,EAAE,EAAE,IAAI,CAAA;AAEjF,kGAAkG;AAClG,uGAAuG;AACvG,oGAAoG;AACpG,wCAAwC;AACxC,MAAM,CAAC,MAAM,qBAAqB,GAAG,CACnC,OAA+B,EAC/B,EAAoB,EACpB,OAA8B,EAC9B,EAAE;IACF,MAAM,OAAO,GAAG,qBAAqB,CAAC,QAAQ,EAAE,CAAA;IAChD,MAAM,KAAK,GAAG,OAAO,EAAE,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,WAAW,EAAE,EAAE,CAAA;IAChH,OAAO,qBAAqB,CAAC,GAAG,CAC9B;QACE,OAAO,EAAE,OAAO,EAAE,OAAO,IAAI,EAAE;QAC/B,mBAAmB,EAAE,CAAC,GAAG,CAAC,OAAO,EAAE,mBAAmB,IAAI,EAAE,CAAC,EAAE,KAAK,CAAC;QACrE,GAAG,CAAC,OAAO,EAAE,qBAAqB,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,qBAAqB,EAAE,OAAO,CAAC,qBAAqB,EAAE,CAAC;QACjH,GAAG,CAAC,OAAO,EAAE,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,CAAC;KAC/D,EACD,EAAE,CACH,CAAA;AACH,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAI,IAAY,EAAE,EAAwB,EAAE,EAAE;IAC9E,MAAM,OAAO,GAAG,qBAAqB,CAAC,QAAQ,EAAE,CAAA;IAChD,OAAO,qBAAqB,CAAC,GAAG,CAC9B;QACE,OAAO,EAAE,OAAO,EAAE,OAAO,IAAI,EAAE;QAC/B,GAAG,CAAC,OAAO,EAAE,mBAAmB,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,mBAAmB,EAAE,OAAO,CAAC,mBAAmB,EAAE,CAAC;QAC3G,GAAG,CAAC,OAAO,EAAE,qBAAqB,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,qBAAqB,EAAE,OAAO,CAAC,qBAAqB,EAAE,CAAC;QACjH,IAAI;KACL,EACD,EAAE,CACH,CAAA;AACH,CAAC,CAAA;AAED,uGAAuG;AACvG,yGAAyG;AACzG,2GAA2G;AAC3G,wGAAwG;AACxG,qCAAqC;AACrC,MAAM,gBAAgB,GAAG,CAAC,IAAY,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,cAAc,EAAE,EAAE,CAAC,CAAA;AAE3E,2FAA2F;AAC3F,kGAAkG;AAClG,+FAA+F;AAC/F,uGAAuG;AACvG,sGAAsG;AACtG,yGAAyG;AACzG,0GAA0G;AAC1G,uFAAuF;AACvF,MAAM,CAAC,MAAM,sBAAsB,GAAG,CACpC,KAIC,EACD,OAA4G,EAC5G,EAAE;IACF,qGAAqG;IACrG,oGAAoG;IACpG,6BAA6B;IAC7B,MAAM,aAAa,GAAG,IAAI,OAAO,CAAC,OAAO,CAAC,YAAY,IAAI,SAAS,CAAC,CAAA;IACpE,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,IAAI,OAAO,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,IAAI,EAAE,CAAC,EAAE,CAAC;QACpE,aAAa,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAA;IAC/B,CAAC;IACD,MAAM,OAAO,GAAG,IAAI,OAAO,CAAC,aAAa,CAAC,CAAA;IAC1C,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC;QACzD,MAAM,KAAK,GAAG,GAAG,CAAC,WAAW,EAAE,CAAA;QAC/B,IAAI,OAAO,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,qBAAqB,EAAE,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;YAClG,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAA;QACzB,CAAC;IACH,CAAC;IACD,KAAK,MAAM,KAAK,IAAI,KAAK,CAAC,mBAAmB,IAAI,EAAE,EAAE,CAAC;QACpD,IAAI,KAAK,CAAC,OAAO,KAAK,SAAS,IAAI,gBAAgB,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,gBAAgB,CAAC,OAAO,CAAC,UAAU,IAAI,EAAE,CAAC,EAAE,CAAC;YAClH,SAAQ;QACV,CAAC;QACD,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC;YACzD,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;gBAC5B,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAA;YACzB,CAAC;QACH,CAAC;IACH,CAAC;IACD,OAAO,OAAO,CAAA;AAChB,CAAC,CAAA"}
@@ -27,6 +27,12 @@ export const rateLimit = {
27
27
  * the current window.
28
28
  */
29
29
  attempt: async ({ key, max, windowSec }) => {
30
+ // A non-integer windowSec makes the Lua EXPIRE fail after the INCR (no rollback) — the key persists
31
+ // with no TTL, permanently denying the caller; windowSec: 0 makes EXPIRE delete the key, permanently
32
+ // allowing it. Reject both before running the script.
33
+ if (!Number.isInteger(windowSec) || windowSec <= 0) {
34
+ throw new Error(`rateLimit: windowSec must be a positive integer (got ${windowSec})`);
35
+ }
30
36
  const count = Number(await redis.invokeScript(ATTEMPT_SCRIPT, { keys: [key], args: [String(windowSec)] }));
31
37
  return {
32
38
  allowed: count <= max,
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/coordination/rate-limit/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAA;AAE7C,OAAO,EAAE,KAAK,EAAE,MAAM,iCAAiC,CAAA;AAEvD;;;;;;;;;;;;;;GAcG;AACH,MAAM,cAAc,GAAG,IAAI,MAAM,CAAC;;;;CAIjC,CAAC,CAAA;AAEF,MAAM,CAAC,MAAM,SAAS,GAAG;IACvB;;;;OAIG;IACH,OAAO,EAAE,KAAK,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,SAAS,EAAmD,EAAE,EAAE;QAC1F,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,KAAK,CAAC,YAAY,CAAC,cAAc,EAAE,EAAE,IAAI,EAAE,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;QAC1G,OAAO;YACL,OAAO,EAAE,KAAK,IAAI,GAAG;YACrB,KAAK;YACL,SAAS,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,GAAG,KAAK,CAAC;SACpC,CAAA;IACH,CAAC;CACF,CAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/coordination/rate-limit/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAA;AAE7C,OAAO,EAAE,KAAK,EAAE,MAAM,iCAAiC,CAAA;AAEvD;;;;;;;;;;;;;;GAcG;AACH,MAAM,cAAc,GAAG,IAAI,MAAM,CAAC;;;;CAIjC,CAAC,CAAA;AAEF,MAAM,CAAC,MAAM,SAAS,GAAG;IACvB;;;;OAIG;IACH,OAAO,EAAE,KAAK,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,SAAS,EAAmD,EAAE,EAAE;QAC1F,oGAAoG;QACpG,qGAAqG;QACrG,sDAAsD;QACtD,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,SAAS,CAAC,IAAI,SAAS,IAAI,CAAC,EAAE,CAAC;YACnD,MAAM,IAAI,KAAK,CAAC,wDAAwD,SAAS,GAAG,CAAC,CAAA;QACvF,CAAC;QACD,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,KAAK,CAAC,YAAY,CAAC,cAAc,EAAE,EAAE,IAAI,EAAE,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;QAC1G,OAAO;YACL,OAAO,EAAE,KAAK,IAAI,GAAG;YACrB,KAAK;YACL,SAAS,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,GAAG,KAAK,CAAC;SACpC,CAAA;IACH,CAAC;CACF,CAAA"}
package/dist/env.js CHANGED
@@ -21,9 +21,10 @@ export const defaultEnv = Util.createEnvProxy(z.object({
21
21
  SERVICE: z.string().min(1),
22
22
  PORT: z.string().min(1).transform(Number),
23
23
  CORS_ORIGIN: z.string().min(1),
24
- // s3 (object storage) — LOCAL_S3_ENDPOINT points the client at MinIO on dev; both fall back to the AWS resolution chain
25
- LOCAL_S3_ENDPOINT: z.string().optional(),
26
- AWS_REGION: z.string().optional(),
24
+ // s3 (object storage) — LOCAL_S3_ENDPOINT points the client at MinIO on dev; both fall back to the AWS resolution chain.
25
+ // `.min(1)` so a set-but-empty value in stg/prd does not read as "set" and fall into the MinIO dev branch (absent stays undefined).
26
+ LOCAL_S3_ENDPOINT: z.string().min(1).optional(),
27
+ AWS_REGION: z.string().min(1).optional(),
27
28
  }), () => ({
28
29
  // common
29
30
  NODE_ENV: process.env.NODE_ENV,
package/dist/env.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"env.js","sourceRoot":"","sources":["../src/env.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAEvB,OAAO,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAA;AAEtC,MAAM,CAAC,MAAM,UAAU,GAAG,IAAI,CAAC,cAAc,CAC3C,CAAC,CAAC,MAAM,CAAC;IACP,SAAS;IACT,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,aAAa,EAAE,YAAY,CAAC,CAAC;IAC/C,UAAU,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;IACzC,6FAA6F;IAC7F,SAAS,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,QAAQ,EAAE;IAChE,UAAU;IACV,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IAChC,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC;IAClD,gBAAgB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IACnC,gBAAgB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC;IACrD,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IAChC,iBAAiB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IACpC,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;IAC3C,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,SAAS,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,KAAK,MAAM,CAAC;IAC5D,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IAC7B,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC;IAC/C,cAAc;IACd,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IAC1B,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC;IACzC,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IAC9B,wHAAwH;IACxH,iBAAiB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACxC,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;CAClC,CAAC,EACF,GAAG,EAAE,CAAC,CAAC;IACL,SAAS;IACT,QAAQ,EAAE,OAAO,CAAC,GAAG,CAAC,QAAQ;IAC9B,UAAU,EAAE,OAAO,CAAC,GAAG,CAAC,UAAU;IAClC,SAAS,EAAE,OAAO,CAAC,GAAG,CAAC,SAAS;IAChC,UAAU;IACV,aAAa,EAAE,OAAO,CAAC,GAAG,CAAC,aAAa;IACxC,aAAa,EAAE,OAAO,CAAC,GAAG,CAAC,aAAa;IACxC,gBAAgB,EAAE,OAAO,CAAC,GAAG,CAAC,gBAAgB;IAC9C,gBAAgB,EAAE,OAAO,CAAC,GAAG,CAAC,gBAAgB;IAC9C,aAAa,EAAE,OAAO,CAAC,GAAG,CAAC,aAAa;IACxC,iBAAiB,EAAE,OAAO,CAAC,GAAG,CAAC,iBAAiB;IAChD,aAAa,EAAE,OAAO,CAAC,GAAG,CAAC,aAAa;IACxC,aAAa,EAAE,OAAO,CAAC,GAAG,CAAC,aAAa;IACxC,UAAU,EAAE,OAAO,CAAC,GAAG,CAAC,UAAU;IAClC,UAAU,EAAE,OAAO,CAAC,GAAG,CAAC,UAAU;IAClC,cAAc;IACd,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,OAAO;IAC5B,IAAI,EAAE,OAAO,CAAC,GAAG,CAAC,IAAI;IACtB,WAAW,EAAE,OAAO,CAAC,GAAG,CAAC,WAAW;IACpC,sBAAsB;IACtB,iBAAiB,EAAE,OAAO,CAAC,GAAG,CAAC,iBAAiB;IAChD,UAAU,EAAE,OAAO,CAAC,GAAG,CAAC,UAAU;CACnC,CAAC,CACH,CAAA"}
1
+ {"version":3,"file":"env.js","sourceRoot":"","sources":["../src/env.ts"],"names":[],"mappings":"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"}
@@ -9,36 +9,48 @@ const LEVEL_ORDER = { debug: 10, info: 20, warn: 30, error: 40 };
9
9
  // raise visibility — e.g. enable debug in prd for an incident, or info in stg for a
10
10
  // repro session.
11
11
  const DEFAULT_BY_DEPLOY_ENV = { dev: 'debug', stg: 'info', prd: 'warn' };
12
+ // Cap each sanitized string so one oversized value (a base64 blob, a giant payload) cannot blow past
13
+ // the CloudWatch 256 KB per-event limit. Applied per string / line, well under the whole-record ceiling.
14
+ const MAX_LOG_STRING_LENGTH = 8192;
12
15
  const emit = (level, tag, payload) => {
13
16
  if (LEVEL_ORDER[level] < LEVEL_ORDER[defaultEnv.LOG_LEVEL ?? DEFAULT_BY_DEPLOY_ENV[defaultEnv.DEPLOY_ENV]]) {
14
17
  return;
15
18
  }
16
- // dev (local, human-read) prints via util.inspect so string values render literally — no
17
- // JSON quote/newline escaping (`\"`, `\n`) and no depth truncation (`[Object]`). stg/prd
18
- // (ECS → CloudWatch, machine-parsed) print single-line JSON so each entry maps to one
19
- // CloudWatch record and the escaping is the correct, parseable wire form.
20
- // `path` is auto-injected from the AsyncLocalStorage request context (Express request
21
- // path, overridden to the tRPC procedure path inside `baseProcedure`). The caller can
22
- // still pass `path` in `payload` to override — payload spreads last.
23
- const autoPath = getCurrentRequestPath();
24
- const record = Util.sanitize({
25
- level,
26
- service: defaultEnv.SERVICE ?? 'unknown',
27
- tag,
28
- ...(autoPath === undefined ? {} : { path: autoPath }),
29
- ...payload,
30
- });
31
- const message = defaultEnv.NODE_ENV === 'development'
32
- ? inspect(record, { depth: null, maxArrayLength: null, maxStringLength: null, breakLength: 120, colors: false })
33
- : JSON.stringify(record);
34
- if (level === 'error') {
35
- console.error(message);
19
+ // Guard the whole sanitize+format+write: a payload with a throwing getter or non-serializable value
20
+ // must not make `logger.error` throw — it runs inside the uncaughtException handler and tRPC onError,
21
+ // where a throw is fatal. On failure, degrade to a minimal single-line record (sanctioned console use,
22
+ // last-resort logger).
23
+ try {
24
+ // dev (local, human-read) prints via util.inspect so string values render literally — no
25
+ // JSON quote/newline escaping (`\"`, `\n`) and no depth truncation (`[Object]`). stg/prd
26
+ // (ECS → CloudWatch, machine-parsed) print single-line JSON so each entry maps to one
27
+ // CloudWatch record and the escaping is the correct, parseable wire form.
28
+ // `path` is auto-injected from the AsyncLocalStorage request context (Express request
29
+ // path, overridden to the tRPC procedure path inside `baseProcedure`). The caller can
30
+ // still pass `path` in `payload` to override — payload spreads last.
31
+ const autoPath = getCurrentRequestPath();
32
+ const record = Util.sanitize({
33
+ level,
34
+ service: defaultEnv.SERVICE ?? 'unknown',
35
+ tag,
36
+ ...(autoPath === undefined ? {} : { path: autoPath }),
37
+ ...payload,
38
+ }, { maxStringLength: MAX_LOG_STRING_LENGTH });
39
+ const message = defaultEnv.NODE_ENV === 'development'
40
+ ? inspect(record, { depth: null, maxArrayLength: null, maxStringLength: null, breakLength: 120, colors: false })
41
+ : JSON.stringify(record);
42
+ if (level === 'error') {
43
+ console.error(message);
44
+ }
45
+ else if (level === 'warn') {
46
+ console.warn(message);
47
+ }
48
+ else {
49
+ console.log(message);
50
+ }
36
51
  }
37
- else if (level === 'warn') {
38
- console.warn(message);
39
- }
40
- else {
41
- console.log(message);
52
+ catch {
53
+ console.error(JSON.stringify({ level: 'error', tag: 'logger', message: 'emit failed' }));
42
54
  }
43
55
  };
44
56
  export const logger = {
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/logger/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAEnC,OAAO,EAAE,qBAAqB,EAAE,MAAM,6BAA6B,CAAA;AACnE,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAA;AACtC,OAAO,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAA;AAEvC,MAAM,WAAW,GAAG,EAAE,KAAK,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,EAAW,CAAA;AAGzE,oFAAoF;AACpF,wFAAwF;AACxF,yFAAyF;AACzF,oFAAoF;AACpF,iBAAiB;AACjB,MAAM,qBAAqB,GAAG,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAW,CAAA;AAEjF,MAAM,IAAI,GAAG,CAAC,KAAe,EAAE,GAAW,EAAE,OAAgC,EAAE,EAAE;IAC9E,IAAI,WAAW,CAAC,KAAK,CAAC,GAAG,WAAW,CAAC,UAAU,CAAC,SAAS,IAAI,qBAAqB,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC;QAC3G,OAAM;IACR,CAAC;IACD,yFAAyF;IACzF,yFAAyF;IACzF,sFAAsF;IACtF,0EAA0E;IAC1E,sFAAsF;IACtF,sFAAsF;IACtF,qEAAqE;IACrE,MAAM,QAAQ,GAAG,qBAAqB,EAAE,CAAA;IACxC,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC;QAC3B,KAAK;QACL,OAAO,EAAE,UAAU,CAAC,OAAO,IAAI,SAAS;QACxC,GAAG;QACH,GAAG,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;QACrD,GAAG,OAAO;KACX,CAAC,CAAA;IACF,MAAM,OAAO,GACX,UAAU,CAAC,QAAQ,KAAK,aAAa;QACnC,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,cAAc,EAAE,IAAI,EAAE,eAAe,EAAE,IAAI,EAAE,WAAW,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;QAChH,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAA;IAC5B,IAAI,KAAK,KAAK,OAAO,EAAE,CAAC;QACtB,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAA;IACxB,CAAC;SAAM,IAAI,KAAK,KAAK,MAAM,EAAE,CAAC;QAC5B,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;IACvB,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAA;IACtB,CAAC;AACH,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,MAAM,GAAG;IACpB,KAAK,EAAE,CAAC,GAAW,EAAE,OAAgC,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,EAAE,OAAO,CAAC;IACrF,IAAI,EAAE,CAAC,GAAW,EAAE,OAAgC,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,EAAE,OAAO,CAAC;IACnF,IAAI,EAAE,CAAC,GAAW,EAAE,OAAgC,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,EAAE,OAAO,CAAC;IACnF,KAAK,EAAE,CAAC,GAAW,EAAE,OAAgC,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,EAAE,OAAO,CAAC;IACrF,MAAM,EAAE,CAAC,OAAe,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,OAAO,OAAO,CAAC;CACjE,CAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/logger/index.ts"],"names":[],"mappings":"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"}
@@ -2,111 +2,9 @@ import 'dotenv/config';
2
2
  import { AsyncLocalStorage } from 'async_hooks';
3
3
  import { PrismaMariaDb } from '@prisma/adapter-mariadb';
4
4
  import { readReplicas } from '@prisma/extension-read-replicas';
5
- import { getCurrentAuditContext } from '../../context/audit/index.js';
6
5
  import { defaultEnv } from '../../env.js';
7
6
  import { logger } from '../../logger/index.js';
8
- // Auto-discover model names from a Prisma client: each model delegate (`.user`, `.eventUserLifecycle`)
9
- // is an enumerable own property whose value exposes `.create`; camelCase keys → PascalCase model names.
10
- const discoverModelNames = (instance) => {
11
- if (!instance || typeof instance !== 'object') {
12
- return [];
13
- }
14
- const names = [];
15
- for (const key of Object.keys(instance)) {
16
- if (key.length === 0 || !/^[a-z]/.test(key)) {
17
- continue;
18
- }
19
- const value = instance[key];
20
- if (value && typeof value === 'object' && typeof value.create === 'function') {
21
- names.push(key.charAt(0).toUpperCase() + key.slice(1));
22
- }
23
- }
24
- return names;
25
- };
26
- // Map aggregate-root → event-model for every `Foo` whose `EventFooLifecycle` also exists.
27
- const buildAggregateRegistry = (modelNames) => {
28
- const set = new Set(modelNames);
29
- const registry = new Map();
30
- for (const model of modelNames) {
31
- if (model.startsWith('Event') && model.endsWith('Lifecycle')) {
32
- continue;
33
- }
34
- const eventName = `Event${model}Lifecycle`;
35
- if (set.has(eventName)) {
36
- registry.set(model, eventName);
37
- }
38
- }
39
- return registry;
40
- };
41
- // `update` classification: `data.deletedAt = non-null` → `deleted`; `deletedAt = null` (restore) or
42
- // absent → `updated`.
43
- const classifyUpdateEvent = (data) => {
44
- if (data && typeof data === 'object' && 'deletedAt' in data) {
45
- const v = data.deletedAt;
46
- if (v !== null && v !== undefined) {
47
- return 'deleted';
48
- }
49
- }
50
- return 'updated';
51
- };
52
- const toCamelCase = (name) => name.charAt(0).toLowerCase() + name.slice(1);
53
- // Prisma `$extends` extension: emit a Lifecycle event row on single-row create / update / delete of an
54
- // aggregate root, in the same transaction. Suppressed inside `runAsSystemAction`.
55
- const lifecycleEmitExtension = (options) => {
56
- const { registry, getCurrentTransactionClient, getCurrentPrimaryClient } = options;
57
- const emit = async (model, eventType, rowId) => {
58
- const eventModel = registry.get(model);
59
- if (!eventModel) {
60
- return;
61
- }
62
- const ctx = getCurrentAuditContext();
63
- if (ctx?.suppress) {
64
- return;
65
- }
66
- if (rowId === undefined || rowId === null) {
67
- // Without a row id the event row cannot be linked to its aggregate; a single-row create / update /
68
- // delete on a model with `id` always returns one.
69
- return;
70
- }
71
- const client = getCurrentTransactionClient() ?? getCurrentPrimaryClient();
72
- if (!client) {
73
- return;
74
- }
75
- await client[toCamelCase(eventModel)].create({
76
- data: {
77
- [`${toCamelCase(model)}Id`]: rowId,
78
- eventType,
79
- actorUserId: ctx?.actorUserId,
80
- reason: ctx?.reason,
81
- },
82
- });
83
- logger.debug('lifecycle-emitted', { model, eventType, actorUserId: ctx?.actorUserId });
84
- };
85
- // biome-ignore-start lint/suspicious/noExplicitAny: Prisma's $extends query callbacks are generator-typed any
86
- return {
87
- name: 'lifecycleEmit',
88
- query: {
89
- $allModels: {
90
- async create({ model, args, query }) {
91
- const result = await query(args);
92
- await emit(model, 'created', result?.id);
93
- return result;
94
- },
95
- async update({ model, args, query }) {
96
- const result = await query(args);
97
- await emit(model, classifyUpdateEvent(args?.data), result?.id);
98
- return result;
99
- },
100
- async delete({ model, args, query }) {
101
- const result = await query(args);
102
- await emit(model, 'deleted', result?.id);
103
- return result;
104
- },
105
- },
106
- },
107
- };
108
- // biome-ignore-end lint/suspicious/noExplicitAny: Prisma's $extends query callbacks are generator-typed any
109
- };
7
+ import { buildAggregateRegistry, discoverModelNames, lifecycleEmitExtension } from './lifecycle.js';
110
8
  class Singleton {
111
9
  static storage = new AsyncLocalStorage();
112
10
  static instances = new Map();
@@ -225,13 +123,17 @@ export const prisma = {
225
123
  logger.error('rds', event);
226
124
  });
227
125
  const registry = buildAggregateRegistry(discoverModelNames(primary));
126
+ // Log the detected aggregate registry so an empty result (e.g. a Prisma change to delegate
127
+ // enumerability that breaks discovery) is visible at startup rather than silently disabling all
128
+ // audit emit.
129
+ logger.info('startup', { lifecycleAggregates: [...registry.keys()] });
228
130
  const withReplicas = primary.$extends(readReplicas({
229
131
  replicas: [replica],
230
132
  }));
231
133
  const instance = withReplicas.$extends(lifecycleEmitExtension({
232
134
  registry,
233
135
  getCurrentTransactionClient: () => Singleton.getTransaction(),
234
- getCurrentPrimaryClient: () => Singleton.getInstance(databaseName),
136
+ getRawPrimaryClient: () => Singleton.getPrimaryInstance(databaseName),
235
137
  }));
236
138
  instance.health = async () => {
237
139
  const primary = Singleton.getPrimaryInstance(databaseName);
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/repository/prisma/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/repository/prisma/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ type PrismaClientType = any;
2
+ export type LifecycleEventType = 'created' | 'updated' | 'deleted';
3
+ export declare const discoverModelNames: (instance: unknown) => string[];
4
+ export declare const buildAggregateRegistry: (modelNames: readonly string[]) => Map<string, string>;
5
+ export declare const classifyUpdateEvent: (data: unknown) => LifecycleEventType;
6
+ export declare const lifecycleEmitExtension: (options: {
7
+ registry: Map<string, string>;
8
+ getCurrentTransactionClient: () => PrismaClientType | undefined;
9
+ getRawPrimaryClient: () => PrismaClientType | undefined;
10
+ }) => {
11
+ name: string;
12
+ query: {
13
+ $allModels: {
14
+ $allOperations({ model, operation, args, query, __internalParams }: any): Promise<any>;
15
+ };
16
+ };
17
+ };
18
+ export {};