@ya-accelerators/web-backend-framework 0.0.83 → 0.0.85
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/connector/google-auth/index.d.ts +1 -1
- package/dist/connector/google-auth/index.js +5 -2
- package/dist/connector/google-auth/index.js.map +1 -1
- package/dist/context/request/index.d.ts +21 -2
- package/dist/context/request/index.js +59 -8
- package/dist/context/request/index.js.map +1 -1
- package/dist/coordination/rate-limit/index.js +6 -0
- package/dist/coordination/rate-limit/index.js.map +1 -1
- package/dist/env.js +4 -3
- package/dist/env.js.map +1 -1
- package/dist/logger/index.js +37 -25
- package/dist/logger/index.js.map +1 -1
- package/dist/repository/prisma/index.js +6 -104
- package/dist/repository/prisma/index.js.map +1 -1
- package/dist/repository/prisma/lifecycle.d.ts +18 -0
- package/dist/repository/prisma/lifecycle.js +177 -0
- package/dist/repository/prisma/lifecycle.js.map +1 -0
- package/dist/repository/redis/index.js +8 -3
- package/dist/repository/redis/index.js.map +1 -1
- package/dist/repository/s3/index.js +12 -0
- package/dist/repository/s3/index.js.map +1 -1
- package/dist/server/express/index.js +57 -78
- package/dist/server/express/index.js.map +1 -1
- package/dist/server/trpc/index.js +13 -1
- package/dist/server/trpc/index.js.map +1 -1
- package/dist/util/index.js +60 -33
- package/dist/util/index.js.map +1 -1
- package/package.json +2 -2
|
@@ -3,7 +3,7 @@ export declare const googleCloudAuth: (wifConfigBase64: string) => {
|
|
|
3
3
|
authClient: () => Promise<AuthClient>;
|
|
4
4
|
bearer: () => Promise<string>;
|
|
5
5
|
};
|
|
6
|
-
export declare const googleIdTokenAuth: (wifConfigBase64: string, audience: string) => {
|
|
6
|
+
export declare const googleIdTokenAuth: (wifConfigBase64: string, audience: string, forHost?: string) => {
|
|
7
7
|
bearer: () => Promise<string>;
|
|
8
8
|
withAuth: <T>(fn: () => Promise<T>) => Promise<T>;
|
|
9
9
|
};
|
|
@@ -60,7 +60,9 @@ export const googleCloudAuth = (wifConfigBase64) => {
|
|
|
60
60
|
// Audience-bound OIDC id_token auth for service-to-service calls (e.g. a fork's service calling the
|
|
61
61
|
// central corporate-service). Mints a Google-signed id_token whose `aud` is the passed audience, which the
|
|
62
62
|
// callee verifies against Google's JWKS. The token is cached and refreshed REFRESH_SKEW_MS before expiry.
|
|
63
|
-
|
|
63
|
+
// `forHost` (host[:port]) host-binds the Bearer that `withAuth` forwards: it is attached only to a fetch
|
|
64
|
+
// whose target host matches, so an unrelated outbound fetch inside the closure never receives the credential.
|
|
65
|
+
export const googleIdTokenAuth = (wifConfigBase64, audience, forHost) => {
|
|
64
66
|
let cached;
|
|
65
67
|
let inflight;
|
|
66
68
|
const fetchIdToken = async () => {
|
|
@@ -111,7 +113,8 @@ export const googleIdTokenAuth = (wifConfigBase64, audience) => {
|
|
|
111
113
|
bearer,
|
|
112
114
|
// Run fn with the minted Bearer forwarded on outbound fetch (the in-mesh credential-propagation
|
|
113
115
|
// allow path, e.g. a consumer's per-env corporate-service dist client reaching corporate-service).
|
|
114
|
-
|
|
116
|
+
// When `forHost` is set the Bearer is bound to that host, so it never rides an unrelated outbound fetch.
|
|
117
|
+
withAuth: async (fn) => runWithRequestHeaders({ authorization: await bearer() }, fn, forHost === undefined ? undefined : { forHost }),
|
|
115
118
|
};
|
|
116
119
|
};
|
|
117
120
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/connector/google-auth/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,qBAAqB,EAAE,MAAM,gCAAgC,CAAA;AACtE,OAAO,EAAE,8BAA8B,EAAE,cAAc,EAAE,MAAM,oCAAoC,CAAA;AACnG,OAAO,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAA;AAE9C,yGAAyG;AACzG,0GAA0G;AAC1G,wGAAwG;AACxG,0GAA0G;AAC1G,qGAAqG;AACrG,0GAA0G;AAC1G,qGAAqG;AACrG,0GAA0G;AAC1G,gFAAgF;AAEhF,MAAM,gBAAgB,GAAG,IAAI,CAAA;AAC7B,MAAM,eAAe,GAAG,CAAC,GAAG,EAAE,GAAG,IAAI,CAAA;AAErC,0GAA0G;AAC1G,2GAA2G;AAC3G,yGAAyG;AACzG,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,eAAuB,EAAE,EAAE;IACzD,IAAI,MAA8B,CAAA;IAClC,IAAI,QAAyC,CAAA;IAE7C,uGAAuG;IACvG,MAAM,UAAU,GAAG,KAAK,IAAI,EAAE;QAC5B,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;YACzB,OAAO,MAAM,CAAA;QACf,CAAC;QACD,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;YAC3B,QAAQ,GAAG,CAAC,KAAK,IAAI,EAAE;gBACrB,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,MAAM,CAAC,qBAAqB,CAAC,CAAA;gBACzD,gGAAgG;gBAChG,kGAAkG;gBAClG,gGAAgG;gBAChG,gGAAgG;gBAChG,OAAO,IAAI,SAAS,CAAC;oBACnB,GAAG,cAAc,CAAC,eAAe,EAAE,iBAAiB,CAAC;oBACrD,iBAAiB,EAAE,SAAS;oBAC5B,iCAAiC,EAAE,8BAA8B;oBACjE,MAAM,EAAE,CAAC,gDAAgD,CAAC;iBAC3D,CAAC,CAAA;YACJ,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE;gBAChB,QAAQ,GAAG,SAAS,CAAA;YACtB,CAAC,CAAC,CAAA;QACJ,CAAC;QACD,MAAM,GAAG,MAAM,QAAQ,CAAA;QACvB,OAAO,MAAM,CAAA;IACf,CAAC,CAAA;IAED,OAAO;QACL,UAAU;QACV,MAAM,EAAE,KAAK,IAAI,EAAE;YACjB,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,CAAC,MAAM,UAAU,EAAE,CAAC,CAAC,cAAc,EAAE,CAAC,KAAK,CAAC,CAAC,CAAU,EAAE,EAAE;gBACjF,MAAM,CAAC,KAAK,CAAC,aAAa,EAAE,EAAE,EAAE,EAAE,cAAc,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAA;gBAC7D,MAAM,CAAC,CAAA;YACT,CAAC,CAAC,CAAA;YACF,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;gBAC1C,MAAM,IAAI,KAAK,CAAC,2CAA2C,CAAC,CAAA;YAC9D,CAAC;YACD,OAAO,UAAU,KAAK,EAAE,CAAA;QAC1B,CAAC;KACF,CAAA;AACH,CAAC,CAAA;AAED,oGAAoG;AACpG,2GAA2G;AAC3G,0GAA0G;AAC1G,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,eAAuB,EAAE,QAAgB,EAAE,EAAE;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/connector/google-auth/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -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
|
-
|
|
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
|
|
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;
|
|
10
|
-
//
|
|
11
|
-
//
|
|
12
|
-
//
|
|
13
|
-
//
|
|
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
|
-
|
|
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
|
-
|
|
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?.
|
|
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,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/context/request/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -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
|
-
|
|
26
|
-
|
|
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,
|
|
1
|
+
{"version":3,"file":"env.js","sourceRoot":"","sources":["../src/env.ts"],"names":[],"mappings":"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"}
|
package/dist/logger/index.js
CHANGED
|
@@ -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
|
-
//
|
|
17
|
-
//
|
|
18
|
-
//
|
|
19
|
-
//
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
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
|
-
|
|
38
|
-
console.
|
|
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 = {
|
package/dist/logger/index.js.map
CHANGED
|
@@ -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;
|
|
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
|
-
|
|
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
|
-
|
|
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":"AAAA,OAAO,eAAe,CAAA;AAEtB,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAA;AAE/C,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAA;AACvD,OAAO,EAAE,YAAY,EAAE,MAAM,iCAAiC,CAAA;AAE9D,OAAO,EAAE,
|
|
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 {};
|