@pipeline-builder/api-core 3.4.109 → 3.4.111
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/lib/helpers/index.d.ts +1 -0
- package/lib/helpers/index.js +2 -1
- package/lib/helpers/org-hierarchy-http.d.ts +12 -0
- package/lib/helpers/org-hierarchy-http.js +29 -1
- package/lib/helpers/restore-helpers.d.ts +25 -0
- package/lib/helpers/restore-helpers.js +39 -0
- package/lib/helpers/sse-helpers.d.ts +7 -0
- package/lib/helpers/sse-helpers.js +13 -4
- package/lib/middleware/step-up.js +26 -13
- package/lib/services/compliance-client.js +24 -41
- package/lib/services/env-redis.d.ts +28 -4
- package/lib/services/env-redis.js +56 -9
- package/lib/services/index.d.ts +3 -1
- package/lib/services/index.js +4 -2
- package/lib/services/leader-lock.d.ts +11 -0
- package/lib/services/leader-lock.js +23 -1
- package/lib/services/remote-audit-client.d.ts +1 -1
- package/lib/services/remote-audit-client.js +2 -1
- package/lib/services/service-boot.d.ts +20 -0
- package/lib/services/service-boot.js +28 -0
- package/lib/services/sse-ticket-store.d.ts +44 -0
- package/lib/services/sse-ticket-store.js +125 -0
- package/lib/types/error-codes.d.ts +6 -0
- package/lib/types/error-codes.js +14 -1
- package/lib/utils/alias-resolver.d.ts +12 -0
- package/lib/utils/alias-resolver.js +18 -1
- package/lib/utils/compliance-attributes.d.ts +6 -0
- package/lib/utils/compliance-attributes.js +69 -0
- package/lib/utils/env.d.ts +28 -0
- package/lib/utils/env.js +54 -0
- package/lib/utils/index.d.ts +2 -0
- package/lib/utils/index.js +3 -1
- package/lib/utils/secret-encryption.d.ts +0 -29
- package/lib/utils/secret-encryption.js +25 -36
- package/lib/validation/common-schemas.d.ts +6 -1
- package/lib/validation/common-schemas.js +9 -3
- package/lib/validation/message-schemas.d.ts +35 -1
- package/lib/validation/message-schemas.js +49 -2
- package/package.json +1 -1
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
// Copyright 2026 Pipeline Builder Contributors
|
|
2
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
3
|
+
import crypto from 'crypto';
|
|
4
|
+
import { createEnvRedisClient } from './env-redis.js';
|
|
5
|
+
import { createLogger } from '../utils/logger.js';
|
|
6
|
+
const logger = createLogger('sse-ticket-store');
|
|
7
|
+
/** Redis key namespaces. Ticket → orgId; windowed issue counters bound abuse. */
|
|
8
|
+
const TICKET_KEY_PREFIX = 'sse:tk:';
|
|
9
|
+
const ORG_COUNT_PREFIX = 'sse:tkc:';
|
|
10
|
+
const TOTAL_COUNT_KEY = 'sse:tkc:__all__';
|
|
11
|
+
function newTicketId() {
|
|
12
|
+
return crypto.randomBytes(24).toString('base64url');
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* In-memory backend — the original single-process behaviour. Counts LIVE
|
|
16
|
+
* (unexpired) tickets per org and evicts expired entries on a timer. Correct
|
|
17
|
+
* only within one process, so it is the fallback used when Redis isn't configured.
|
|
18
|
+
*/
|
|
19
|
+
function createInMemorySseTicketStore(config) {
|
|
20
|
+
const store = new Map();
|
|
21
|
+
const cleanup = setInterval(() => {
|
|
22
|
+
const now = Date.now();
|
|
23
|
+
for (const [id, t] of store)
|
|
24
|
+
if (now > t.expiresAt)
|
|
25
|
+
store.delete(id);
|
|
26
|
+
}, config.ttlMs);
|
|
27
|
+
cleanup.unref();
|
|
28
|
+
function countLiveForOrg(orgId, now) {
|
|
29
|
+
let count = 0;
|
|
30
|
+
for (const t of store.values())
|
|
31
|
+
if (t.orgId === orgId && t.expiresAt > now)
|
|
32
|
+
count++;
|
|
33
|
+
return count;
|
|
34
|
+
}
|
|
35
|
+
return {
|
|
36
|
+
async issue(orgId) {
|
|
37
|
+
const now = Date.now();
|
|
38
|
+
if (store.size >= config.maxTotal)
|
|
39
|
+
return { ok: false, reason: 'total' };
|
|
40
|
+
if (countLiveForOrg(orgId, now) >= config.maxPerOrg)
|
|
41
|
+
return { ok: false, reason: 'org' };
|
|
42
|
+
const ticket = newTicketId();
|
|
43
|
+
store.set(ticket, { orgId, expiresAt: now + config.ttlMs });
|
|
44
|
+
return { ok: true, ticket };
|
|
45
|
+
},
|
|
46
|
+
async consume(ticketId) {
|
|
47
|
+
const t = store.get(ticketId);
|
|
48
|
+
store.delete(ticketId); // single-use — consume immediately
|
|
49
|
+
if (!t || Date.now() > t.expiresAt)
|
|
50
|
+
return null;
|
|
51
|
+
return { orgId: t.orgId };
|
|
52
|
+
},
|
|
53
|
+
stop() { clearInterval(cleanup); },
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Redis backend — multi-replica safe. Tickets live under a TTL'd key so any pod
|
|
58
|
+
* can redeem one; {@link SseTicketStore.consume} uses GETDEL so redemption is
|
|
59
|
+
* atomic (two pods can't both spend the same ticket). The per-org / global caps
|
|
60
|
+
* become windowed rate limits (max mints per TTL window) via INCR + first-hit
|
|
61
|
+
* EXPIRE — equivalent abuse bounding to the in-memory live-count, and it also
|
|
62
|
+
* caps churn.
|
|
63
|
+
*
|
|
64
|
+
* Fail-CLOSED by design (unlike the fail-open token-revocation reader): if Redis
|
|
65
|
+
* errors, `issue` returns a cap rejection and `consume` returns null, so a Redis
|
|
66
|
+
* outage degrades to "no live notifications" rather than handing out or
|
|
67
|
+
* accepting unvalidated tickets. SSE notifications are non-critical, so failing
|
|
68
|
+
* closed here costs only real-time delivery, never correctness.
|
|
69
|
+
*/
|
|
70
|
+
function createRedisSseTicketStore(redis, config) {
|
|
71
|
+
const ttlSec = Math.max(1, Math.ceil(config.ttlMs / 1000));
|
|
72
|
+
// Windowed counter: INCR, and on the first hit of a window set the TTL so it
|
|
73
|
+
// auto-resets. Returns true while still within `limit` for this window.
|
|
74
|
+
async function withinWindow(key, limit) {
|
|
75
|
+
const n = await redis.incr(key);
|
|
76
|
+
if (n === 1)
|
|
77
|
+
await redis.expire(key, ttlSec);
|
|
78
|
+
return n <= limit;
|
|
79
|
+
}
|
|
80
|
+
return {
|
|
81
|
+
async issue(orgId) {
|
|
82
|
+
try {
|
|
83
|
+
if (!(await withinWindow(TOTAL_COUNT_KEY, config.maxTotal)))
|
|
84
|
+
return { ok: false, reason: 'total' };
|
|
85
|
+
if (!(await withinWindow(`${ORG_COUNT_PREFIX}${orgId}`, config.maxPerOrg)))
|
|
86
|
+
return { ok: false, reason: 'org' };
|
|
87
|
+
const ticket = newTicketId();
|
|
88
|
+
await redis.set(`${TICKET_KEY_PREFIX}${ticket}`, orgId, 'EX', ttlSec);
|
|
89
|
+
return { ok: true, ticket };
|
|
90
|
+
}
|
|
91
|
+
catch (err) {
|
|
92
|
+
logger.warn('SSE ticket issue failed (fail-closed)', { error: err instanceof Error ? err.message : String(err) });
|
|
93
|
+
return { ok: false, reason: 'total' };
|
|
94
|
+
}
|
|
95
|
+
},
|
|
96
|
+
async consume(ticketId) {
|
|
97
|
+
try {
|
|
98
|
+
const orgId = await redis.getdel(`${TICKET_KEY_PREFIX}${ticketId}`);
|
|
99
|
+
return orgId ? { orgId } : null;
|
|
100
|
+
}
|
|
101
|
+
catch (err) {
|
|
102
|
+
logger.warn('SSE ticket consume failed (fail-closed)', { error: err instanceof Error ? err.message : String(err) });
|
|
103
|
+
return null;
|
|
104
|
+
}
|
|
105
|
+
},
|
|
106
|
+
stop() { },
|
|
107
|
+
};
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Build an {@link SseTicketStore} from the standard Redis env (`REDIS_URL` or
|
|
111
|
+
* `REDIS_HOST`/`REDIS_PORT`). Uses the Redis backend when configured
|
|
112
|
+
* (multi-replica safe), otherwise falls back to the in-memory single-process
|
|
113
|
+
* backend. A service opts in with one boot line:
|
|
114
|
+
* `const tickets = createEnvSseTicketStore({ ttlMs, maxTotal, maxPerOrg });`
|
|
115
|
+
*/
|
|
116
|
+
export function createEnvSseTicketStore(config) {
|
|
117
|
+
const redis = createEnvRedisClient('sse-ticket');
|
|
118
|
+
if (redis) {
|
|
119
|
+
logger.info('SSE ticket store: Redis backend (multi-replica)');
|
|
120
|
+
return createRedisSseTicketStore(redis, config);
|
|
121
|
+
}
|
|
122
|
+
logger.info('SSE ticket store: in-memory backend (single-process fallback)');
|
|
123
|
+
return createInMemorySseTicketStore(config);
|
|
124
|
+
}
|
|
125
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3NlLXRpY2tldC1zdG9yZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zZXJ2aWNlcy9zc2UtdGlja2V0LXN0b3JlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLCtDQUErQztBQUMvQyxzQ0FBc0M7QUFFdEMsT0FBTyxNQUFNLE1BQU0sUUFBUSxDQUFDO0FBRTVCLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3RELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUVsRCxNQUFNLE1BQU0sR0FBRyxZQUFZLENBQUMsa0JBQWtCLENBQUMsQ0FBQztBQUVoRCxpRkFBaUY7QUFDakYsTUFBTSxpQkFBaUIsR0FBRyxTQUFTLENBQUM7QUFDcEMsTUFBTSxnQkFBZ0IsR0FBRyxVQUFVLENBQUM7QUFDcEMsTUFBTSxlQUFlLEdBQUcsaUJBQWlCLENBQUM7QUEyQzFDLFNBQVMsV0FBVztJQUNsQixPQUFPLE1BQU0sQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxDQUFDO0FBQ3RELENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsU0FBUyw0QkFBNEIsQ0FBQyxNQUE0QjtJQUVoRSxNQUFNLEtBQUssR0FBRyxJQUFJLEdBQUcsRUFBaUIsQ0FBQztJQUV2QyxNQUFNLE9BQU8sR0FBRyxXQUFXLENBQUMsR0FBRyxFQUFFO1FBQy9CLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUN2QixLQUFLLE1BQU0sQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLElBQUksS0FBSztZQUFFLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxTQUFTO2dCQUFFLEtBQUssQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDdkUsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNqQixPQUFPLENBQUMsS0FBSyxFQUFF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RUFBRSxDQUFDLENBQUM7Z0JBQ3BILE9BQU8sSUFBSSxDQUFDO1lBQ2QsQ0FBQztRQUNILENBQUM7UUFDRCxJQUFJLEtBQTBFLENBQUM7S0FDaEYsQ0FBQztBQUNKLENBQUM7QUFFRDs7Ozs7O0dBTUc7QUFDSCxNQUFNLFVBQVUsdUJBQXVCLENBQUMsTUFBNEI7SUFDbEUsTUFBTSxLQUFLLEdBQUcsb0JBQW9CLENBQVcsWUFBWSxDQUFDLENBQUM7SUFDM0QsSUFBSSxLQUFLLEVBQUUsQ0FBQztRQUNWLE1BQU0sQ0FBQyxJQUFJLENBQUMsaURBQWlELENBQUMsQ0FBQztRQUMvRCxPQUFPLHlCQUF5QixDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsQ0FBQztJQUNsRCxDQUFDO0lBQ0QsTUFBTSxDQUFDLElBQUksQ0FBQywrREFBK0QsQ0FBQyxDQUFDO0lBQzdFLE9BQU8sNEJBQTRCLENBQUMsTUFBTSxDQUFDLENBQUM7QUFDOUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAyMDI2IFBpcGVsaW5lIEJ1aWxkZXIgQ29udHJpYnV0b3JzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG5pbXBvcnQgY3J5cHRvIGZyb20gJ2NyeXB0byc7XG5cbmltcG9ydCB7IGNyZWF0ZUVudlJlZGlzQ2xpZW50IH0gZnJvbSAnLi9lbnYtcmVkaXMuanMnO1xuaW1wb3J0IHsgY3JlYXRlTG9nZ2VyIH0gZnJvbSAnLi4vdXRpbHMvbG9nZ2VyLmpzJztcblxuY29uc3QgbG9nZ2VyID0gY3JlYXRlTG9nZ2VyKCdzc2UtdGlja2V0LXN0b3JlJyk7XG5cbi8qKiBSZWRpcyBrZXkgbmFtZXNwYWNlcy4gVGlja2V0IOKGkiBvcmdJZDsgd2luZG93ZWQgaXNzdWUgY291bnRlcnMgYm91bmQgYWJ1c2UuICovXG5jb25zdCBUSUNLRVRfS0VZX1BSRUZJWCA9ICdzc2U6dGs6JztcbmNvbnN0IE9SR19DT1VOVF9QUkVGSVggPSAnc3NlOnRrYzonO1xuY29uc3QgVE9UQUxfQ09VTlRfS0VZID0gJ3NzZTp0a2M6X19hbGxfXyc7XG5cbi8qKiBSZXN1bHQgb2Yge0BsaW5rIFNzZVRpY2tldFN0b3JlLmlzc3VlfS4gKi9cbmV4cG9ydCB0eXBlIFNzZVRpY2tldElzc3VlUmVzdWx0ID1cbiAgfCB7IG9rOiB0cnVlOyB0aWNrZXQ6IHN0cmluZyB9XG4gIHwgeyBvazogZmFsc2U7IHJlYXNvbjogJ3RvdGFsJyB8ICdvcmcnIH07XG5cbi8qKlxuICogU3RvcmUgZm9yIHNob3J0LWxpdmVkLCBzaW5nbGUtdXNlIFNTRSBhdXRoIHRpY2tldHMuIEEgY2xpZW50IGV4Y2hhbmdlcyBpdHMgSldUXG4gKiBmb3IgYSB0aWNrZXQgKHNvIHRoZSB0b2tlbiBuZXZlciBsYW5kcyBpbiBhbiBFdmVudFNvdXJjZSBxdWVyeSBzdHJpbmcgLyBhY2Nlc3NcbiAqIGxvZyksIHRoZW4gcmVkZWVtcyBpdCBvbiB0aGUgU1NFIGBHRVRgLlxuICpcbiAqIFRoZSBzdG9yZSBpcyB0aGUgbXVsdGktcmVwbGljYSBjb3JyZWN0bmVzcyBib3VuZGFyeTogYSB0aWNrZXQgbWludGVkIG9uIHBvZCBBXG4gKiBNVVNUIGJlIHJlZGVlbWFibGUgb24gcG9kIEIuIFRoZSBSZWRpcyBiYWNrZW5kIG1ha2VzIHRoYXQgdHJ1ZTsgdGhlIGluLW1lbW9yeVxuICogYmFja2VuZCBpcyBhIHNpbmdsZS1wcm9jZXNzIGZhbGxiYWNrIGZvciBkZXYgLyBzaW5nbGUtcmVwbGljYSBpbnN0YWxscy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTc2VUaWNrZXRTdG9yZSB7XG4gIC8qKiBNaW50IGEgdGlja2V0IGZvciBgb3JnSWRgLCBvciByZWplY3Qgd2hlbiBhIHJhdGUgd2luZG93IGlzIHNhdHVyYXRlZC4gKi9cbiAgaXNzdWUob3JnSWQ6IHN0cmluZyk6IFByb21pc2U8U3NlVGlja2V0SXNzdWVSZXN1bHQ+O1xuICAvKiogQXRvbWljYWxseSByZWRlZW0gYSB0aWNrZXQgZXhhY3RseSBvbmNlOyByZXR1cm5zIGl0cyBvcmcgb3IgbnVsbCBpZiBpbnZhbGlkL2V4cGlyZWQvc3BlbnQuICovXG4gIGNvbnN1bWUodGlja2V0SWQ6IHN0cmluZyk6IFByb21pc2U8eyBvcmdJZDogc3RyaW5nIH0gfCBudWxsPjtcbiAgLyoqIFJlbGVhc2UgdGltZXJzL3Jlc291cmNlcy4gSW4tbWVtb3J5IGNsZWFycyBpdHMgc3dlZXAgaW50ZXJ2YWw7IFJlZGlzIGlzIGEgbm8tb3AuICovXG4gIHN0b3AoKTogdm9pZDtcbn1cblxuLyoqIENhcHMgKyBUVEwgZm9yIHRoZSB0aWNrZXQgc3RvcmUuICovXG5leHBvcnQgaW50ZXJmYWNlIFNzZVRpY2tldFN0b3JlQ29uZmlnIHtcbiAgLyoqIFRpY2tldCBsaWZldGltZSDigJQgbG9uZyBlbm91Z2ggZm9yIHRoZSBjbGllbnQgdG8gb3BlbiB0aGUgRXZlbnRTb3VyY2UuICovXG4gIHR0bE1zOiBudW1iZXI7XG4gIC8qKiBIYXJkIGNhcCBvbiB0aWNrZXRzIG1pbnRlZCBwZXIgVFRMIHdpbmRvdyBhY3Jvc3MgYWxsIG9yZ3MgKGFidXNlIGJvdW5kKS4gKi9cbiAgbWF4VG90YWw6IG51bWJlcjtcbiAgLyoqIFBlci1vcmcgY2FwIG9uIHRpY2tldHMgbWludGVkIHBlciBUVEwgd2luZG93IChzaW5nbGUtdGVuYW50IGFidXNlIGJvdW5kKS4gKi9cbiAgbWF4UGVyT3JnOiBudW1iZXI7XG59XG5cbi8qKiBNaW5pbWFsIGlvcmVkaXMgc3VyZmFjZSB0aGlzIHN0b3JlIG5lZWRzIChHRVRERUwgcmVxdWlyZXMgUmVkaXMg4omlIDYuMikuICovXG5pbnRlcmZhY2UgU3NlUmVkaXMge1xuICBpbmNyKGtleTogc3RyaW5nKTogUHJvbWlzZTxudW1iZXI+O1xuICBleHBpcmUoa2V5OiBzdHJpbmcsIHNlY29uZHM6IG51bWJlcik6IFByb21pc2U8dW5rbm93bj47XG4gIHNldChrZXk6IHN0cmluZywgdmFsdWU6IHN0cmluZywgLi4uYXJnczogdW5rbm93bltdKTogUHJvbWlzZTx1bmtub3duPjtcbiAgZ2V0ZGVsKGtleTogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmcgfCBudWxsPjtcbn1cblxuZnVuY3Rpb24gbmV3VGlja2V0SWQoKTogc3RyaW5nIHtcbiAgcmV0dXJuIGNyeXB0by5yYW5kb21CeXRlcygyNCkudG9TdHJpbmcoJ2Jhc2U2NHVybCcpO1xufVxuXG4vKipcbiAqIEluLW1lbW9yeSBiYWNrZW5kIOKAlCB0aGUgb3JpZ2luYWwgc2luZ2xlLXByb2Nlc3MgYmVoYXZpb3VyLiBDb3VudHMgTElWRVxuICogKHVuZXhwaXJlZCkgdGlja2V0cyBwZXIgb3JnIGFuZCBldmljdHMgZXhwaXJlZCBlbnRyaWVzIG9uIGEgdGltZXIuIENvcnJlY3RcbiAqIG9ubHkgd2l0aGluIG9uZSBwcm9jZXNzLCBzbyBpdCBpcyB0aGUgZmFsbGJhY2sgdXNlZCB3aGVuIFJlZGlzIGlzbid0IGNvbmZpZ3VyZWQuXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZUluTWVtb3J5U3NlVGlja2V0U3RvcmUoY29uZmlnOiBTc2VUaWNrZXRTdG9yZUNvbmZpZyk6IFNzZVRpY2tldFN0b3JlIHtcbiAgaW50ZXJmYWNlIEVudHJ5IHsgb3JnSWQ6IHN0cmluZzsgZXhwaXJlc0F0OiBudW1iZXIgfVxuICBjb25zdCBzdG9yZSA9IG5ldyBNYXA8c3RyaW5nLCBFbnRyeT4oKTtcblxuICBjb25zdCBjbGVhbnVwID0gc2V0SW50ZXJ2YWwoKCkgPT4ge1xuICAgIGNvbnN0IG5vdyA9IERhdGUubm93KCk7XG4gICAgZm9yIChjb25zdCBbaWQsIHRdIG9mIHN0b3JlKSBpZiAobm93ID4gdC5leHBpcmVzQXQpIHN0b3JlLmRlbGV0ZShpZCk7XG4gIH0sIGNvbmZpZy50dGxNcyk7XG4gIGNsZWFudXAudW5yZWYoKTtcblxuICBmdW5jdGlvbiBjb3VudExpdmVGb3JPcmcob3JnSWQ6IHN0cmluZywgbm93OiBudW1iZXIpOiBudW1iZXIge1xuICAgIGxldCBjb3VudCA9IDA7XG4gICAgZm9yIChjb25zdCB0IG9mIHN0b3JlLnZhbHVlcygpKSBpZiAodC5vcmdJZCA9PT0gb3JnSWQgJiYgdC5leHBpcmVzQXQgPiBub3cpIGNvdW50Kys7XG4gICAgcmV0dXJuIGNvdW50O1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBhc3luYyBpc3N1ZShvcmdJZDogc3RyaW5nKTogUHJvbWlzZTxTc2VUaWNrZXRJc3N1ZVJlc3VsdD4ge1xuICAgICAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKTtcbiAgICAgIGlmIChzdG9yZS5zaXplID49IGNvbmZpZy5tYXhUb3RhbCkgcmV0dXJuIHsgb2s6IGZhbHNlLCByZWFzb246ICd0b3RhbCcgfTtcbiAgICAgIGlmIChjb3VudExpdmVGb3JPcmcob3JnSWQsIG5vdykgPj0gY29uZmlnLm1heFBlck9yZykgcmV0dXJuIHsgb2s6IGZhbHNlLCByZWFzb246ICdvcmcnIH07XG4gICAgICBjb25zdCB0aWNrZXQgPSBuZXdUaWNrZXRJZCgpO1xuICAgICAgc3RvcmUuc2V0KHRpY2tldCwgeyBvcmdJZCwgZXhwaXJlc0F0OiBub3cgKyBjb25maWcudHRsTXMgfSk7XG4gICAgICByZXR1cm4geyBvazogdHJ1ZSwgdGlja2V0IH07XG4gICAgfSxcbiAgICBhc3luYyBjb25zdW1lKHRpY2tldElkOiBzdHJpbmcpOiBQcm9taXNlPHsgb3JnSWQ6IHN0cmluZyB9IHwgbnVsbD4ge1xuICAgICAgY29uc3QgdCA9IHN0b3JlLmdldCh0aWNrZXRJZCk7XG4gICAgICBzdG9yZS5kZWxldGUodGlja2V0SWQpOyAvLyBzaW5nbGUtdXNlIOKAlCBjb25zdW1lIGltbWVkaWF0ZWx5XG4gICAgICBpZiAoIXQgfHwgRGF0ZS5ub3coKSA+IHQuZXhwaXJlc0F0KSByZXR1cm4gbnVsbDtcbiAgICAgIHJldHVybiB7IG9yZ0lkOiB0Lm9yZ0lkIH07XG4gICAgfSxcbiAgICBzdG9wKCk6IHZvaWQgeyBjbGVhckludGVydmFsKGNsZWFudXApOyB9LFxuICB9O1xufVxuXG4vKipcbiAqIFJlZGlzIGJhY2tlbmQg4oCUIG11bHRpLXJlcGxpY2Egc2FmZS4gVGlja2V0cyBsaXZlIHVuZGVyIGEgVFRMJ2Qga2V5IHNvIGFueSBwb2RcbiAqIGNhbiByZWRlZW0gb25lOyB7QGxpbmsgU3NlVGlja2V0U3RvcmUuY29uc3VtZX0gdXNlcyBHRVRERUwgc28gcmVkZW1wdGlvbiBpc1xuICogYXRvbWljICh0d28gcG9kcyBjYW4ndCBib3RoIHNwZW5kIHRoZSBzYW1lIHRpY2tldCkuIFRoZSBwZXItb3JnIC8gZ2xvYmFsIGNhcHNcbiAqIGJlY29tZSB3aW5kb3dlZCByYXRlIGxpbWl0cyAobWF4IG1pbnRzIHBlciBUVEwgd2luZG93KSB2aWEgSU5DUiArIGZpcnN0LWhpdFxuICogRVhQSVJFIOKAlCBlcXVpdmFsZW50IGFidXNlIGJvdW5kaW5nIHRvIHRoZSBpbi1tZW1vcnkgbGl2ZS1jb3VudCwgYW5kIGl0IGFsc29cbiAqIGNhcHMgY2h1cm4uXG4gKlxuICogRmFpbC1DTE9TRUQgYnkgZGVzaWduICh1bmxpa2UgdGhlIGZhaWwtb3BlbiB0b2tlbi1yZXZvY2F0aW9uIHJlYWRlcik6IGlmIFJlZGlzXG4gKiBlcnJvcnMsIGBpc3N1ZWAgcmV0dXJucyBhIGNhcCByZWplY3Rpb24gYW5kIGBjb25zdW1lYCByZXR1cm5zIG51bGwsIHNvIGEgUmVkaXNcbiAqIG91dGFnZSBkZWdyYWRlcyB0byBcIm5vIGxpdmUgbm90aWZpY2F0aW9uc1wiIHJhdGhlciB0aGFuIGhhbmRpbmcgb3V0IG9yXG4gKiBhY2NlcHRpbmcgdW52YWxpZGF0ZWQgdGlja2V0cy4gU1NFIG5vdGlmaWNhdGlvbnMgYXJlIG5vbi1jcml0aWNhbCwgc28gZmFpbGluZ1xuICogY2xvc2VkIGhlcmUgY29zdHMgb25seSByZWFsLXRpbWUgZGVsaXZlcnksIG5ldmVyIGNvcnJlY3RuZXNzLlxuICovXG5mdW5jdGlvbiBjcmVhdGVSZWRpc1NzZVRpY2tldFN0b3JlKHJlZGlzOiBTc2VSZWRpcywgY29uZmlnOiBTc2VUaWNrZXRTdG9yZUNvbmZpZyk6IFNzZVRpY2tldFN0b3JlIHtcbiAgY29uc3QgdHRsU2VjID0gTWF0aC5tYXgoMSwgTWF0aC5jZWlsKGNvbmZpZy50dGxNcyAvIDEwMDApKTtcblxuICAvLyBXaW5kb3dlZCBjb3VudGVyOiBJTkNSLCBhbmQgb24gdGhlIGZpcnN0IGhpdCBvZiBhIHdpbmRvdyBzZXQgdGhlIFRUTCBzbyBpdFxuICAvLyBhdXRvLXJlc2V0cy4gUmV0dXJucyB0cnVlIHdoaWxlIHN0aWxsIHdpdGhpbiBgbGltaXRgIGZvciB0aGlzIHdpbmRvdy5cbiAgYXN5bmMgZnVuY3Rpb24gd2l0aGluV2luZG93KGtleTogc3RyaW5nLCBsaW1pdDogbnVtYmVyKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgY29uc3QgbiA9IGF3YWl0IHJlZGlzLmluY3Ioa2V5KTtcbiAgICBpZiAobiA9PT0gMSkgYXdhaXQgcmVkaXMuZXhwaXJlKGtleSwgdHRsU2VjKTtcbiAgICByZXR1cm4gbiA8PSBsaW1pdDtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgYXN5bmMgaXNzdWUob3JnSWQ6IHN0cmluZyk6IFByb21pc2U8U3NlVGlja2V0SXNzdWVSZXN1bHQ+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGlmICghKGF3YWl0IHdpdGhpbldpbmRvdyhUT1RBTF9DT1VOVF9LRVksIGNvbmZpZy5tYXhUb3RhbCkpKSByZXR1cm4geyBvazogZmFsc2UsIHJlYXNvbjogJ3RvdGFsJyB9O1xuICAgICAgICBpZiAoIShhd2FpdCB3aXRoaW5XaW5kb3coYCR7T1JHX0NPVU5UX1BSRUZJWH0ke29yZ0lkfWAsIGNvbmZpZy5tYXhQZXJPcmcpKSkgcmV0dXJuIHsgb2s6IGZhbHNlLCByZWFzb246ICdvcmcnIH07XG4gICAgICAgIGNvbnN0IHRpY2tldCA9IG5ld1RpY2tldElkKCk7XG4gICAgICAgIGF3YWl0IHJlZGlzLnNldChgJHtUSUNLRVRfS0VZX1BSRUZJWH0ke3RpY2tldH1gLCBvcmdJZCwgJ0VYJywgdHRsU2VjKTtcbiAgICAgICAgcmV0dXJuIHsgb2s6IHRydWUsIHRpY2tldCB9O1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGxvZ2dlci53YXJuKCdTU0UgdGlja2V0IGlzc3VlIGZhaWxlZCAoZmFpbC1jbG9zZWQpJywgeyBlcnJvcjogZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIubWVzc2FnZSA6IFN0cmluZyhlcnIpIH0pO1xuICAgICAgICByZXR1cm4geyBvazogZmFsc2UsIHJlYXNvbjogJ3RvdGFsJyB9O1xuICAgICAgfVxuICAgIH0sXG4gICAgYXN5bmMgY29uc3VtZSh0aWNrZXRJZDogc3RyaW5nKTogUHJvbWlzZTx7IG9yZ0lkOiBzdHJpbmcgfSB8IG51bGw+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IG9yZ0lkID0gYXdhaXQgcmVkaXMuZ2V0ZGVsKGAke1RJQ0tFVF9LRVlfUFJFRklYfSR7dGlja2V0SWR9YCk7XG4gICAgICAgIHJldHVybiBvcmdJZCA/IHsgb3JnSWQgfSA6IG51bGw7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgbG9nZ2VyLndhcm4oJ1NTRSB0aWNrZXQgY29uc3VtZSBmYWlsZWQgKGZhaWwtY2xvc2VkKScsIHsgZXJyb3I6IGVyciBpbnN0YW5jZW9mIEVycm9yID8gZXJyLm1lc3NhZ2UgOiBTdHJpbmcoZXJyKSB9KTtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgfSxcbiAgICBzdG9wKCk6IHZvaWQgeyAvKiBSZWRpcyBrZXlzIGV4cGlyZSBvbiB0aGVpciBvd24gVFRMIOKAlCBub3RoaW5nIHRvIHJlbGVhc2UuICovIH0sXG4gIH07XG59XG5cbi8qKlxuICogQnVpbGQgYW4ge0BsaW5rIFNzZVRpY2tldFN0b3JlfSBmcm9tIHRoZSBzdGFuZGFyZCBSZWRpcyBlbnYgKGBSRURJU19VUkxgIG9yXG4gKiBgUkVESVNfSE9TVGAvYFJFRElTX1BPUlRgKS4gVXNlcyB0aGUgUmVkaXMgYmFja2VuZCB3aGVuIGNvbmZpZ3VyZWRcbiAqIChtdWx0aS1yZXBsaWNhIHNhZmUpLCBvdGhlcndpc2UgZmFsbHMgYmFjayB0byB0aGUgaW4tbWVtb3J5IHNpbmdsZS1wcm9jZXNzXG4gKiBiYWNrZW5kLiBBIHNlcnZpY2Ugb3B0cyBpbiB3aXRoIG9uZSBib290IGxpbmU6XG4gKiAgIGBjb25zdCB0aWNrZXRzID0gY3JlYXRlRW52U3NlVGlja2V0U3RvcmUoeyB0dGxNcywgbWF4VG90YWwsIG1heFBlck9yZyB9KTtgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVFbnZTc2VUaWNrZXRTdG9yZShjb25maWc6IFNzZVRpY2tldFN0b3JlQ29uZmlnKTogU3NlVGlja2V0U3RvcmUge1xuICBjb25zdCByZWRpcyA9IGNyZWF0ZUVudlJlZGlzQ2xpZW50PFNzZVJlZGlzPignc3NlLXRpY2tldCcpO1xuICBpZiAocmVkaXMpIHtcbiAgICBsb2dnZXIuaW5mbygnU1NFIHRpY2tldCBzdG9yZTogUmVkaXMgYmFja2VuZCAobXVsdGktcmVwbGljYSknKTtcbiAgICByZXR1cm4gY3JlYXRlUmVkaXNTc2VUaWNrZXRTdG9yZShyZWRpcywgY29uZmlnKTtcbiAgfVxuICBsb2dnZXIuaW5mbygnU1NFIHRpY2tldCBzdG9yZTogaW4tbWVtb3J5IGJhY2tlbmQgKHNpbmdsZS1wcm9jZXNzIGZhbGxiYWNrKScpO1xuICByZXR1cm4gY3JlYXRlSW5NZW1vcnlTc2VUaWNrZXRTdG9yZShjb25maWcpO1xufVxuIl19
|
|
@@ -33,6 +33,12 @@ export declare enum ErrorCode {
|
|
|
33
33
|
CONFLICT = "CONFLICT",
|
|
34
34
|
DUPLICATE_ENTRY = "DUPLICATE_ENTRY",
|
|
35
35
|
SCAN_CONFLICT = "SCAN_CONFLICT",
|
|
36
|
+
PAYMENT_METHOD_REQUIRED = "PAYMENT_METHOD_REQUIRED",// 402
|
|
37
|
+
DISCOUNT_CEILING_EXCEEDED = "DISCOUNT_CEILING_EXCEEDED",// 400
|
|
38
|
+
DISCOUNT_NOT_FOUND = "DISCOUNT_NOT_FOUND",// 404
|
|
39
|
+
DISCOUNT_INACTIVE = "DISCOUNT_INACTIVE",// 409
|
|
40
|
+
PLAN_OVER_CAP = "PLAN_OVER_CAP",// 409
|
|
41
|
+
ADDON_OVER_CAP = "ADDON_OVER_CAP",// 409
|
|
36
42
|
INTERNAL_ERROR = "INTERNAL_ERROR",
|
|
37
43
|
DATABASE_ERROR = "DATABASE_ERROR",
|
|
38
44
|
SERVICE_UNAVAILABLE = "SERVICE_UNAVAILABLE",
|
package/lib/types/error-codes.js
CHANGED
|
@@ -43,6 +43,13 @@ export var ErrorCode;
|
|
|
43
43
|
ErrorCode["CONFLICT"] = "CONFLICT";
|
|
44
44
|
ErrorCode["DUPLICATE_ENTRY"] = "DUPLICATE_ENTRY";
|
|
45
45
|
ErrorCode["SCAN_CONFLICT"] = "SCAN_CONFLICT";
|
|
46
|
+
// Billing errors
|
|
47
|
+
ErrorCode["PAYMENT_METHOD_REQUIRED"] = "PAYMENT_METHOD_REQUIRED";
|
|
48
|
+
ErrorCode["DISCOUNT_CEILING_EXCEEDED"] = "DISCOUNT_CEILING_EXCEEDED";
|
|
49
|
+
ErrorCode["DISCOUNT_NOT_FOUND"] = "DISCOUNT_NOT_FOUND";
|
|
50
|
+
ErrorCode["DISCOUNT_INACTIVE"] = "DISCOUNT_INACTIVE";
|
|
51
|
+
ErrorCode["PLAN_OVER_CAP"] = "PLAN_OVER_CAP";
|
|
52
|
+
ErrorCode["ADDON_OVER_CAP"] = "ADDON_OVER_CAP";
|
|
46
53
|
// Server errors (500)
|
|
47
54
|
ErrorCode["INTERNAL_ERROR"] = "INTERNAL_ERROR";
|
|
48
55
|
ErrorCode["DATABASE_ERROR"] = "DATABASE_ERROR";
|
|
@@ -80,6 +87,12 @@ export const ErrorCodeStatus = {
|
|
|
80
87
|
[ErrorCode.CONFLICT]: 409,
|
|
81
88
|
[ErrorCode.DUPLICATE_ENTRY]: 409,
|
|
82
89
|
[ErrorCode.SCAN_CONFLICT]: 409,
|
|
90
|
+
[ErrorCode.PAYMENT_METHOD_REQUIRED]: 402,
|
|
91
|
+
[ErrorCode.DISCOUNT_CEILING_EXCEEDED]: 400,
|
|
92
|
+
[ErrorCode.DISCOUNT_NOT_FOUND]: 404,
|
|
93
|
+
[ErrorCode.DISCOUNT_INACTIVE]: 409,
|
|
94
|
+
[ErrorCode.PLAN_OVER_CAP]: 409,
|
|
95
|
+
[ErrorCode.ADDON_OVER_CAP]: 409,
|
|
83
96
|
[ErrorCode.INTERNAL_ERROR]: 500,
|
|
84
97
|
[ErrorCode.DATABASE_ERROR]: 500,
|
|
85
98
|
[ErrorCode.SERVICE_UNAVAILABLE]: 503,
|
|
@@ -91,4 +104,4 @@ export const ErrorCodeStatus = {
|
|
|
91
104
|
export function getStatusForErrorCode(code) {
|
|
92
105
|
return ErrorCodeStatus[code] ?? 500;
|
|
93
106
|
}
|
|
94
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
107
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXJyb3ItY29kZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdHlwZXMvZXJyb3ItY29kZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0NBQStDO0FBQy9DLHNDQUFzQztBQUV0Qzs7Ozs7OztHQU9HO0FBQ0gsTUFBTSxDQUFOLElBQVksU0F3RFg7QUF4REQsV0FBWSxTQUFTO0lBQ25CLDhCQUE4QjtJQUM5QiwwQ0FBNkIsQ0FBQTtJQUM3Qiw0Q0FBK0IsQ0FBQTtJQUMvQiw0Q0FBK0IsQ0FBQTtJQUMvQiw0Q0FBK0IsQ0FBQTtJQUMvQiw0Q0FBK0IsQ0FBQTtJQUUvQiw2QkFBNkI7SUFDN0Isa0VBQXFELENBQUE7SUFDckQsMENBQTZCLENBQUE7SUFDN0IsMERBQTZDLENBQUE7SUFFN0MseUJBQXlCO0lBQ3pCLG9DQUF1QixDQUFBO0lBQ3ZCLDRDQUErQixDQUFBO0lBRS9CLDBCQUEwQjtJQUMxQixrREFBcUMsQ0FBQTtJQUNyQyw4REFBaUQsQ0FBQTtJQUNqRCw0REFBK0MsQ0FBQTtJQUMvQyw4Q0FBaUMsQ0FBQTtJQUNqQywwREFBNkMsQ0FBQTtJQUM3Qyw4REFBaUQsQ0FBQTtJQUNqRCxvRUFBdUQsQ0FBQTtJQUN2RCx3RUFBMkQsQ0FBQTtJQUMzRCw4REFBaUQsQ0FBQTtJQUNqRCxzRUFBeUQsQ0FBQTtJQUV6RCxnQ0FBZ0M7SUFDaEMsOENBQWlDLENBQUE7SUFDakMsd0RBQTJDLENBQUE7SUFFM0MsdUJBQXVCO0lBQ3ZCLG9EQUF1QyxDQUFBO0lBRXZDLHdCQUF3QjtJQUN4QixrQ0FBcUIsQ0FBQTtJQUNyQixnREFBbUMsQ0FBQTtJQUNuQyw0Q0FBK0IsQ0FBQTtJQUUvQixpQkFBaUI7SUFDakIsZ0VBQW1ELENBQUE7SUFDbkQsb0VBQXVELENBQUE7SUFDdkQsc0RBQXlDLENBQUE7SUFDekMsb0RBQXVDLENBQUE7SUFDdkMsNENBQStCLENBQUE7SUFDL0IsOENBQWlDLENBQUE7SUFFakMsc0JBQXNCO0lB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bnRlbnQiOlsiLy8gQ29weXJpZ2h0IDIwMjYgUGlwZWxpbmUgQnVpbGRlciBDb250cmlidXRvcnNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG5cbi8qKlxuICogU3RhbmRhcmRpemVkIGVycm9yIGNvZGVzIHVzZWQgYWNyb3NzIGFsbCBBUEkgbWljcm9zZXJ2aWNlcy5cbiAqIFVzZSB0aGVzZSBjb2RlcyBpbiBlcnJvciByZXNwb25zZXMgZm9yIGNvbnNpc3RlbnQgY2xpZW50IGhhbmRsaW5nLlxuICpcbiAqIEVhY2ggSFRUUCBzdGF0dXMgY2F0ZWdvcnkgaGFzIG9uZSBwcmltYXJ5IGNvZGUuIFVzZSB0aGUgYGRldGFpbHNgXG4gKiBmaWVsZCBpbiBlcnJvciByZXNwb25zZXMgZm9yIHN1Yi10eXBlIGluZm9ybWF0aW9uIChlLmcuIHdoaWNoIHF1b3RhXG4gKiB3YXMgZXhjZWVkZWQsIHdoaWNoIGZpZWxkIGZhaWxlZCB2YWxpZGF0aW9uKS5cbiAqL1xuZXhwb3J0IGVudW0gRXJyb3JDb2RlIHtcbiAgLy8gQXV0aGVudGljYXRpb24gZXJyb3JzICg0MDEpXG4gIFVOQVVUSE9SSVpFRCA9ICdVTkFVVEhPUklaRUQnLFxuICBUT0tFTl9FWFBJUkVEID0gJ1RPS0VOX0VYUElSRUQnLFxuICBUT0tFTl9JTlZBTElEID0gJ1RPS0VOX0lOVkFMSUQnLFxuICBUT0tFTl9NSVNTSU5HID0gJ1RPS0VOX01JU1NJTkcnLFxuICBUT0tFTl9SRVZPS0VEID0gJ1RPS0VOX1JFVk9LRUQnLFxuXG4gIC8vIEF1dGhvcml6YXRpb24gZXJyb3JzICg0MDMpXG4gIElOU1VGRklDSUVOVF9QRVJNSVNTSU9OUyA9ICdJTlNVRkZJQ0lFTlRfUEVSTUlTU0lPTlMnLFxuICBPUkdfTUlTTUFUQ0ggPSAnT1JHX01JU01BVENIJyxcbiAgQ09NUExJQU5DRV9WSU9MQVRJT04gPSAnQ09NUExJQU5DRV9WSU9MQVRJT04nLFxuXG4gIC8vIE5vdCBmb3VuZCBlcnJvcnMgKDQwNClcbiAgTk9UX0ZPVU5EID0gJ05PVF9GT1VORCcsXG4gIE9SR19OT1RfRk9VTkQgPSAnT1JHX05PVF9GT1VORCcsXG5cbiAgLy8gVmFsaWRhdGlvbiBlcnJvcnMgKDQwMClcbiAgVkFMSURBVElPTl9FUlJPUiA9ICdWQUxJREFUSU9OX0VSUk9SJyxcbiAgTUlTU0lOR19SRVFVSVJFRF9GSUVMRCA9ICdNSVNTSU5HX1JFUVVJUkVEX0ZJRUxEJyxcbiAgVEVNUExBVEVfVU5LTk9XTl9QQVRIID0gJ1RFTVBMQVRFX1VOS05PV05fUEFUSCcsXG4gIFRFTVBMQVRFX0NZQ0xFID0gJ1RFTVBMQVRFX0NZQ0xFJyxcbiAgVEVNUExBVEVfUEFSU0VfRVJST1IgPSAnVEVNUExBVEVfUEFSU0VfRVJST1InLFxuICBURU1QTEFURV9UWVBFX01JU01BVENIID0gJ1RFTVBMQVRFX1RZUEVfTUlTTUFUQ0gnLFxuICBURU1QTEFURV9TRUNSRVRTX1JFU0VSVkVEID0gJ1RFTVBMQVRFX1NFQ1JFVFNfUkVTRVJWRUQnLFxuICBURU1QTEFURV9DT05UUkFDVF9WSU9MQVRJT04gPSAnVEVNUExBVEVfQ09OVFJBQ1RfVklPTEFUSU9OJyxcbiAgVEVNUExBVEVfU0laRV9FWENFRURFRCA9ICdURU1QTEFURV9TSVpFX0VYQ0VFREVEJyxcbiAgVEVNUExBVEVfVkFMSURBVElPTl9GQUlMRUQgPSAnVEVNUExBVEVfVkFMSURBVElPTl9GQUlMRUQnLFxuXG4gIC8vIFF1b3RhL1JhdGUgbGltaXQgZXJyb3JzICg0MjkpXG4gIFFVT1RBX0VYQ0VFREVEID0gJ1FVT1RBX0VYQ0VFREVEJyxcbiAgUkFURV9MSU1JVF9FWENFRURFRCA9ICdSQVRFX0xJTUlUX0VYQ0VFREVEJyxcblxuICAvLyBQYXlsb2FkIGVycm9ycyAoNDEzKVxuICBQQVlMT0FEX1RPT19MQVJHRSA9ICdQQVlMT0FEX1RPT19MQVJHRScsXG5cbiAgLy8gQ29uZmxpY3QgZXJyb3JzICg0MDkpXG4gIENPTkZMSUNUID0gJ0NPTkZMSUNUJyxcbiAgRFVQTElDQVRFX0VOVFJZID0gJ0RVUExJQ0FURV9FTlRSWScsXG4gIFNDQU5fQ09ORkxJQ1QgPSAnU0NBTl9DT05GTElDVCcsXG5cbiAgLy8gQmlsbGluZyBlcnJvcnNcbiAgUEFZTUVOVF9NRVRIT0RfUkVRVUlSRUQgPSAnUEFZTUVOVF9NRVRIT0RfUkVRVUlSRUQnLCAvLyA0MDJcbiAgRElTQ09VTlRfQ0VJTElOR19FWENFRURFRCA9ICdESVNDT1VOVF9DRUlMSU5HX0VYQ0VFREVEJywgLy8gNDAwXG4gIERJU0NPVU5UX05PVF9GT1VORCA9ICdESVNDT1VOVF9OT1RfRk9VTkQnLCAvLyA0MDRcbiAgRElTQ09VTlRfSU5BQ1RJVkUgPSAnRElTQ09VTlRfSU5BQ1RJVkUnLCAvLyA0MDlcbiAgUExBTl9PVkVSX0NBUCA9ICdQTEFOX09WRVJfQ0FQJywgLy8gNDA5XG4gIEFERE9OX09WRVJfQ0FQID0gJ0FERE9OX09WRVJfQ0FQJywgLy8gNDA5XG5cbiAgLy8gU2VydmVyIGVycm9ycyAoNTAwKVxuICBJTlRFUk5BTF9FUlJPUiA9ICdJTlRFUk5BTF9FUlJPUicsXG4gIERBVEFCQVNFX0VSUk9SID0gJ0RBVEFCQVNFX0VSUk9SJyxcblxuICAvLyBTZXJ2aWNlIHVuYXZhaWxhYmxlICg1MDMpXG4gIFNFUlZJQ0VfVU5BVkFJTEFCTEUgPSAnU0VSVklDRV9VTkFWQUlMQUJMRScsXG4gIENPTVBMSUFOQ0VfU0VSVklDRV9VTkFWQUlMQUJMRSA9ICdDT01QTElBTkNFX1NFUlZJQ0VfVU5BVkFJTEFCTEUnLFxufVxuXG4vKipcbiAqIE1hcHMgZXJyb3IgY29kZXMgdG8gdGhlaXIgZGVmYXVsdCBIVFRQIHN0YXR1cyBjb2Rlcy5cbiAqL1xuZXhwb3J0IGNvbnN0IEVycm9yQ29kZVN0YXR1czogUmVjb3JkPEVycm9yQ29kZSwgbnVtYmVyPiA9IHtcbiAgW0Vycm9yQ29kZS5VTkFVVEhPUklaRURdOiA0MDEsXG4gIFtFcnJvckNvZGUuVE9LRU5fRVhQSVJFRF06IDQwMSxcbiAgW0Vycm9yQ29kZS5UT0tFTl9JTlZBTElEXTogNDAxLFxuICBbRXJyb3JDb2RlLlRPS0VOX01JU1NJTkddOiA0MDEsXG4gIFtFcnJvckNvZGUuVE9LRU5fUkVWT0tFRF06IDQwMSxcbiAgW0Vycm9yQ29kZS5JTlNVRkZJQ0lFTlRfUEVSTUlTU0lPTlNdOiA0MDMsXG4gIFtFcnJvckNvZGUuT1JHX01JU01BVENIXTogNDAzLFxuICBbRXJyb3JDb2RlLkNPTVBMSUFOQ0VfVklPTEFUSU9OXTogNDAzLFxuICBbRXJyb3JDb2RlLk5PVF9GT1VORF06IDQwNCxcbiAgW0Vycm9yQ29kZS5PUkdfTk9UX0ZPVU5EXTogNDA0LFxuICBbRXJyb3JDb2RlLlZBTElEQVRJT05fRVJST1JdOiA0MDAsXG4gIFtFcnJvckNvZGUuTUlTU0lOR19SRVFVSVJFRF9GSUVMRF06IDQwMCxcbiAgW0Vycm9yQ29kZS5URU1QTEFURV9VTktOT1dOX1BBVEhdOiA0MDAsXG4gIFtFcnJvckNvZGUuVEVNUExBVEVfQ1lDTEVdOiA0MDAsXG4gIFtFcnJvckNvZGUuVEVNUExBVEVfUEFSU0VfRVJST1JdOiA0MDAsXG4gIFtFcnJvckNvZGUuVEVNUExBVEVfVFlQRV9NSVNNQVRDSF06IDQwMCxcbiAgW0Vycm9yQ29kZS5URU1QTEFURV9TRUNSRVRTX1JFU0VSVkVEXTogNDAwLFxuICBbRXJyb3JDb2RlLlRFTVBMQVRFX0NPTlRSQUNUX1ZJT0xBVElPTl06IDQwMCxcbiAgW0Vycm9yQ29kZS5URU1QTEFURV9TSVpFX0VYQ0VFREVEXTogNDAwLFxuICBbRXJyb3JDb2RlLlRFTVBMQVRFX1ZBTElEQVRJT05fRkFJTEVEXTogNDAwLFxuICBbRXJyb3JDb2RlLlFVT1RBX0VYQ0VFREVEXTogNDI5LFxuICBbRXJyb3JDb2RlLlJBVEVfTElNSVRfRVhDRUVERURdOiA0MjksXG4gIFtFcnJvckNvZGUuUEFZTE9BRF9UT09fTEFSR0VdOiA0MTMsXG4gIFtFcnJvckNvZGUuQ09ORkxJQ1RdOiA0MDksXG4gIFtFcnJvckNvZGUuRFVQTElDQVRFX0VOVFJZXTogNDA5LFxuICBbRXJyb3JDb2RlLlNDQU5fQ09ORkxJQ1RdOiA0MDksXG4gIFtFcnJvckNvZGUuUEFZTUVOVF9NRVRIT0RfUkVRVUlSRURdOiA0MDIsXG4gIFtFcnJvckNvZGUuRElTQ09VTlRfQ0VJTElOR19FWENFRURFRF06IDQwMCxcbiAgW0Vycm9yQ29kZS5ESVNDT1VOVF9OT1RfRk9VTkRdOiA0MDQsXG4gIFtFcnJvckNvZGUuRElTQ09VTlRfSU5BQ1RJVkVdOiA0MDksXG4gIFtFcnJvckNvZGUuUExBTl9PVkVSX0NBUF06IDQwOSxcbiAgW0Vycm9yQ29kZS5BRERPTl9PVkVSX0NBUF06IDQwOSxcbiAgW0Vycm9yQ29kZS5JTlRFUk5BTF9FUlJPUl06IDUwMCxcbiAgW0Vycm9yQ29kZS5EQVRBQkFTRV9FUlJPUl06IDUwMCxcbiAgW0Vycm9yQ29kZS5TRVJWSUNFX1VOQVZBSUxBQkxFXTogNTAzLFxuICBbRXJyb3JDb2RlLkNPTVBMSUFOQ0VfU0VSVklDRV9VTkFWQUlMQUJMRV06IDUwMyxcbn07XG5cbi8qKlxuICogR2V0IHRoZSBIVFRQIHN0YXR1cyBjb2RlIGZvciBhbiBlcnJvciBjb2RlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0U3RhdHVzRm9yRXJyb3JDb2RlKGNvZGU6IEVycm9yQ29kZSk6IG51bWJlciB7XG4gIHJldHVybiBFcnJvckNvZGVTdGF0dXNbY29kZV0gPz8gNTAwO1xufVxuIl19
|
|
@@ -1,3 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Clear the memoized alias set so the next access re-reads `SUPPORT_ALIASES`.
|
|
3
|
+
* The cache is process-lifetime by design (env is fixed per process); this hook
|
|
4
|
+
* exists so tests can vary the env between cases.
|
|
5
|
+
*/
|
|
6
|
+
export declare function resetSupportAliasesCache(): void;
|
|
1
7
|
/** Well-known fallback support alias used when SUPPORT_ALIASES is unconfigured. */
|
|
2
8
|
export declare const DEFAULT_SUPPORT_ALIAS = "support@pipeline-builder";
|
|
3
9
|
/**
|
|
@@ -7,6 +13,12 @@ export declare const DEFAULT_SUPPORT_ALIAS = "support@pipeline-builder";
|
|
|
7
13
|
* is unset. (All configured aliases still resolve via {@link resolveRecipientAlias}.)
|
|
8
14
|
*/
|
|
9
15
|
export declare function getPrimarySupportAlias(): string;
|
|
16
|
+
/**
|
|
17
|
+
* ALL configured support aliases (order preserved), for UIs that surface every
|
|
18
|
+
* support inbox as a distinct recipient suggestion. Falls back to a single
|
|
19
|
+
* {@link DEFAULT_SUPPORT_ALIAS} when SUPPORT_ALIASES is unset.
|
|
20
|
+
*/
|
|
21
|
+
export declare function getAllSupportAliases(): string[];
|
|
10
22
|
/** Result of alias resolution. */
|
|
11
23
|
export interface AliasResolution {
|
|
12
24
|
/** The resolved organization ID (e.g., 'system'). */
|
|
@@ -13,6 +13,14 @@ function getSupportAliases() {
|
|
|
13
13
|
}
|
|
14
14
|
return _supportAliases;
|
|
15
15
|
}
|
|
16
|
+
/**
|
|
17
|
+
* Clear the memoized alias set so the next access re-reads `SUPPORT_ALIASES`.
|
|
18
|
+
* The cache is process-lifetime by design (env is fixed per process); this hook
|
|
19
|
+
* exists so tests can vary the env between cases.
|
|
20
|
+
*/
|
|
21
|
+
export function resetSupportAliasesCache() {
|
|
22
|
+
_supportAliases = undefined;
|
|
23
|
+
}
|
|
16
24
|
/** Well-known fallback support alias used when SUPPORT_ALIASES is unconfigured. */
|
|
17
25
|
export const DEFAULT_SUPPORT_ALIAS = 'support@pipeline-builder';
|
|
18
26
|
/**
|
|
@@ -26,6 +34,15 @@ export function getPrimarySupportAlias() {
|
|
|
26
34
|
return alias;
|
|
27
35
|
return DEFAULT_SUPPORT_ALIAS;
|
|
28
36
|
}
|
|
37
|
+
/**
|
|
38
|
+
* ALL configured support aliases (order preserved), for UIs that surface every
|
|
39
|
+
* support inbox as a distinct recipient suggestion. Falls back to a single
|
|
40
|
+
* {@link DEFAULT_SUPPORT_ALIAS} when SUPPORT_ALIASES is unset.
|
|
41
|
+
*/
|
|
42
|
+
export function getAllSupportAliases() {
|
|
43
|
+
const all = [...getSupportAliases()];
|
|
44
|
+
return all.length > 0 ? all : [DEFAULT_SUPPORT_ALIAS];
|
|
45
|
+
}
|
|
29
46
|
/**
|
|
30
47
|
* Resolve an email-like alias to an actual organization ID.
|
|
31
48
|
*
|
|
@@ -48,4 +65,4 @@ export function resolveRecipientAlias(recipientOrgId) {
|
|
|
48
65
|
originalValue: recipientOrgId,
|
|
49
66
|
};
|
|
50
67
|
}
|
|
51
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
68
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWxpYXMtcmVzb2x2ZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdXRpbHMvYWxpYXMtcmVzb2x2ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0NBQStDO0FBQy9DLHNDQUFzQztBQUV0QyxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFFdEQseUZBQXlGO0FBQ3pGLElBQUksZUFBd0MsQ0FBQztBQUU3QyxTQUFTLGlCQUFpQjtJQUN4QixJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7UUFDckIsTUFBTSxHQUFHLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQyxlQUFlLElBQUksRUFBRSxDQUFDO1FBQzlDLGVBQWUsR0FBRyxJQUFJLEdBQUcsQ0FDdkIsR0FBRzthQUNBLEtBQUssQ0FBQyxHQUFHLENBQUM7YUFDVixHQUFHLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUMsV0FBVyxFQUFFLENBQUM7YUFDeEMsTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FDckMsQ0FBQztJQUNKLENBQUM7SUFDRCxPQUFPLGVBQWUsQ0FBQztBQUN6QixDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILE1BQU0sVUFBVSx3QkFBd0I7SUFDdEMsZUFBZSxHQUFHLFNBQVMsQ0FBQztBQUM5QixDQUFDO0FBRUQsbUZBQW1GO0FBQ25GLE1BQU0sQ0FBQyxNQUFNLHFCQUFxQixHQUFHLDBCQUEwQixDQUFDO0FBRWhFOzs7OztHQUtHO0FBQ0gsTUFBTSxVQUFVLHNCQUFzQjtJQUNwQyxLQUFLLE1BQU0sS0FBSyxJQUFJLGlCQUFpQixFQUFFO1FBQUUsT0FBTyxLQUFLLENBQUM7SUFDdEQsT0FBTyxxQkFBcUIsQ0FBQztBQUMvQixDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILE1BQU0sVUFBVSxvQkFBb0I7SUFDbEMsTUFBTSxHQUFHLEdBQUcsQ0FBQyxHQUFHLGlCQUFpQixFQUFFLENBQUMsQ0FBQztJQUNyQyxPQUFPLEdBQUcsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMscUJBQXFCLENBQUMsQ0FBQztBQUN4RCxDQUFDO0FBWUQ7Ozs7O0dBS0c7QUFDSCxNQUFNLFVBQVUscUJBQXFCLENBQUMsY0FBc0I7SUFDMUQsTUFBTSxVQUFVLEdBQUcsY0FBYyxDQUFDLElBQUksRUFBRSxDQUFDLFdBQVcsRUFBRSxDQUFDO0lBQ3ZELE1BQU0sT0FBTyxHQUFHLGlCQUFpQixFQUFFLENBQUM7SUFFcEMsSUFBSSxPQUFPLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUM7UUFDNUIsT0FBTztZQUNMLGFBQWEsRUFBRSxhQUFhO1lBQzVCLFFBQVEsRUFBRSxJQUFJO1lBQ2QsYUFBYSxFQUFFLGNBQWM7U0FDOUIsQ0FBQztJQUNKLENBQUM7SUFFRCxPQUFPO1FBQ0wsYUFBYSxFQUFFLFVBQVU7UUFDekIsUUFBUSxFQUFFLEtBQUs7UUFDZixhQUFhLEVBQUUsY0FBYztLQUM5QixDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAyMDI2IFBpcGVsaW5lIEJ1aWxkZXIgQ29udHJpYnV0b3JzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG5pbXBvcnQgeyBTWVNURU1fT1JHX0lEIH0gZnJvbSAnLi4vbWlkZGxld2FyZS9hdXRoLmpzJztcblxuLyoqIExhemlseS1jYWNoZWQgc2V0IG9mIHN1cHBvcnQgYWxpYXNlcywgcGFyc2VkIGZyb20gU1VQUE9SVF9BTElBU0VTIG9uIGZpcnN0IGFjY2Vzcy4gKi9cbmxldCBfc3VwcG9ydEFsaWFzZXM6IFNldDxzdHJpbmc+IHwgdW5kZWZpbmVkO1xuXG5mdW5jdGlvbiBnZXRTdXBwb3J0QWxpYXNlcygpOiBTZXQ8c3RyaW5nPiB7XG4gIGlmICghX3N1cHBvcnRBbGlhc2VzKSB7XG4gICAgY29uc3QgcmF3ID0gcHJvY2Vzcy5lbnYuU1VQUE9SVF9BTElBU0VTIHx8ICcnO1xuICAgIF9zdXBwb3J0QWxpYXNlcyA9IG5ldyBTZXQoXG4gICAgICByYXdcbiAgICAgICAgLnNwbGl0KCcsJylcbiAgICAgICAgLm1hcChhbGlhcyA9PiBhbGlhcy50cmltKCkudG9Mb3dlckNhc2UoKSlcbiAgICAgICAgLmZpbHRlcihhbGlhcyA9PiBhbGlhcy5sZW5ndGggPiAwKSxcbiAgICApO1xuICB9XG4gIHJldHVybiBfc3VwcG9ydEFsaWFzZXM7XG59XG5cbi8qKlxuICogQ2xlYXIgdGhlIG1lbW9pemVkIGFsaWFzIHNldCBzbyB0aGUgbmV4dCBhY2Nlc3MgcmUtcmVhZHMgYFNVUFBPUlRfQUxJQVNFU2AuXG4gKiBUaGUgY2FjaGUgaXMgcHJvY2Vzcy1saWZldGltZSBieSBkZXNpZ24gKGVudiBpcyBmaXhlZCBwZXIgcHJvY2Vzcyk7IHRoaXMgaG9va1xuICogZXhpc3RzIHNvIHRlc3RzIGNhbiB2YXJ5IHRoZSBlbnYgYmV0d2VlbiBjYXNlcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc2V0U3VwcG9ydEFsaWFzZXNDYWNoZSgpOiB2b2lkIHtcbiAgX3N1cHBvcnRBbGlhc2VzID0gdW5kZWZpbmVkO1xufVxuXG4vKiogV2VsbC1rbm93biBmYWxsYmFjayBzdXBwb3J0IGFsaWFzIHVzZWQgd2hlbiBTVVBQT1JUX0FMSUFTRVMgaXMgdW5jb25maWd1cmVkLiAqL1xuZXhwb3J0IGNvbnN0IERFRkFVTFRfU1VQUE9SVF9BTElBUyA9ICdzdXBwb3J0QHBpcGVsaW5lLWJ1aWxkZXInO1xuXG4vKipcbiAqIFRoZSBQUklNQVJZIChmaXJzdC1jb25maWd1cmVkKSBzdXBwb3J0IGFsaWFzIOKAlCBmb3IgZGlzcGxheSAvIHByZWZpbGwgaW4gVUlzXG4gKiAoZS5nLiB0aGUgY29tcG9zZSBcIlRvXCIgZmllbGQpLCBzbyB0aGUgc2hvd24gdmFsdWUgaXMgZHJpdmVuIGJ5IFNVUFBPUlRfQUxJQVNFU1xuICogcmF0aGVyIHRoYW4gaGFyZGNvZGVkLiBGYWxscyBiYWNrIHRvIHtAbGluayBERUZBVUxUX1NVUFBPUlRfQUxJQVN9IHdoZW4gdGhlIGVudlxuICogaXMgdW5zZXQuIChBbGwgY29uZmlndXJlZCBhbGlhc2VzIHN0aWxsIHJlc29sdmUgdmlhIHtAbGluayByZXNvbHZlUmVjaXBpZW50QWxpYXN9LilcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFByaW1hcnlTdXBwb3J0QWxpYXMoKTogc3RyaW5nIHtcbiAgZm9yIChjb25zdCBhbGlhcyBvZiBnZXRTdXBwb3J0QWxpYXNlcygpKSByZXR1cm4gYWxpYXM7XG4gIHJldHVybiBERUZBVUxUX1NVUFBPUlRfQUxJQVM7XG59XG5cbi8qKlxuICogQUxMIGNvbmZpZ3VyZWQgc3VwcG9ydCBhbGlhc2VzIChvcmRlciBwcmVzZXJ2ZWQpLCBmb3IgVUlzIHRoYXQgc3VyZmFjZSBldmVyeVxuICogc3VwcG9ydCBpbmJveCBhcyBhIGRpc3RpbmN0IHJlY2lwaWVudCBzdWdnZXN0aW9uLiBGYWxscyBiYWNrIHRvIGEgc2luZ2xlXG4gKiB7QGxpbmsgREVGQVVMVF9TVVBQT1JUX0FMSUFTfSB3aGVuIFNVUFBPUlRfQUxJQVNFUyBpcyB1bnNldC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEFsbFN1cHBvcnRBbGlhc2VzKCk6IHN0cmluZ1tdIHtcbiAgY29uc3QgYWxsID0gWy4uLmdldFN1cHBvcnRBbGlhc2VzKCldO1xuICByZXR1cm4gYWxsLmxlbmd0aCA+IDAgPyBhbGwgOiBbREVGQVVMVF9TVVBQT1JUX0FMSUFTXTtcbn1cblxuLyoqIFJlc3VsdCBvZiBhbGlhcyByZXNvbHV0aW9uLiAqL1xuZXhwb3J0IGludGVyZmFjZSBBbGlhc1Jlc29sdXRpb24ge1xuICAvKiogVGhlIHJlc29sdmVkIG9yZ2FuaXphdGlvbiBJRCAoZS5nLiwgJ3N5c3RlbScpLiAqL1xuICByZXNvbHZlZE9yZ0lkOiBzdHJpbmc7XG4gIC8qKiBXaGV0aGVyIHRoZSBpbnB1dCB3YXMgYW4gYWxpYXMgdGhhdCBnb3QgcmVzb2x2ZWQuICovXG4gIHdhc0FsaWFzOiBib29sZWFuO1xuICAvKiogVGhlIG9yaWdpbmFsIGlucHV0IHZhbHVlLCB1c2VmdWwgZm9yIGF1ZGl0IGxvZ2dpbmcuICovXG4gIG9yaWdpbmFsVmFsdWU6IHN0cmluZztcbn1cblxuLyoqXG4gKiBSZXNvbHZlIGFuIGVtYWlsLWxpa2UgYWxpYXMgdG8gYW4gYWN0dWFsIG9yZ2FuaXphdGlvbiBJRC5cbiAqXG4gKiBJZiB0aGUgaW5wdXQgbWF0Y2hlcyBhIGNvbmZpZ3VyZWQgc3VwcG9ydCBhbGlhcywgaXQgcmVzb2x2ZXMgdG8gdGhlIHN5c3RlbVxuICogb3JnIElELiBPdGhlcndpc2UgdGhlIGlucHV0IGlzIHJldHVybmVkIGFzLWlzIChsb3dlcmNhc2VkKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVSZWNpcGllbnRBbGlhcyhyZWNpcGllbnRPcmdJZDogc3RyaW5nKTogQWxpYXNSZXNvbHV0aW9uIHtcbiAgY29uc3Qgbm9ybWFsaXplZCA9IHJlY2lwaWVudE9yZ0lkLnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xuICBjb25zdCBhbGlhc2VzID0gZ2V0U3VwcG9ydEFsaWFzZXMoKTtcblxuICBpZiAoYWxpYXNlcy5oYXMobm9ybWFsaXplZCkpIHtcbiAgICByZXR1cm4ge1xuICAgICAgcmVzb2x2ZWRPcmdJZDogU1lTVEVNX09SR19JRCxcbiAgICAgIHdhc0FsaWFzOiB0cnVlLFxuICAgICAgb3JpZ2luYWxWYWx1ZTogcmVjaXBpZW50T3JnSWQsXG4gICAgfTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgcmVzb2x2ZWRPcmdJZDogbm9ybWFsaXplZCxcbiAgICB3YXNBbGlhczogZmFsc2UsXG4gICAgb3JpZ2luYWxWYWx1ZTogcmVjaXBpZW50T3JnSWQsXG4gIH07XG59XG5cbiJdfQ==
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Project an entity into the compliance-event `attributes`, redacting secret
|
|
3
|
+
* VALUES while preserving everything the compliance engine actually evaluates.
|
|
4
|
+
* Recurses so nested secrets (deep inside a pipeline's `props`) are covered too.
|
|
5
|
+
*/
|
|
6
|
+
export declare function toComplianceAttributes(value: unknown): unknown;
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
// Copyright 2026 Pipeline Builder Contributors
|
|
2
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
3
|
+
/**
|
|
4
|
+
* Secret-redaction for compliance-event `attributes`.
|
|
5
|
+
*
|
|
6
|
+
* Shared by the plugin AND pipeline services (previously a byte-identical copy
|
|
7
|
+
* in each — a security-critical function that must not drift: a future "also
|
|
8
|
+
* redact `credentials`" fix has to protect BOTH services). Both feed entity
|
|
9
|
+
* attributes to the compliance engine over Redis, and neither may leak plaintext
|
|
10
|
+
* secrets there.
|
|
11
|
+
*
|
|
12
|
+
* The compliance rule engine reads secret maps (`env`/`buildArgs`, incl. nested
|
|
13
|
+
* `props.synth.env`, `props.stages[].steps[].env`, …) ONLY by KEY — `$keys(env)`,
|
|
14
|
+
* `$count(env)`, dot-path existence, key-`contains` — never by value (see
|
|
15
|
+
* api/compliance/src/engine/rule-operators.ts + its tests). So we preserve each
|
|
16
|
+
* secret map's shape + KEYS while overwriting every value with a marker; scalar
|
|
17
|
+
* secret fields (source `token`, passwords, …) are replaced outright. Structure
|
|
18
|
+
* and non-secret metadata pass through unchanged, so rule evaluation is
|
|
19
|
+
* identical while plaintext secrets never reach Redis or the compliance service.
|
|
20
|
+
*/
|
|
21
|
+
/** Marker written in place of a redacted secret VALUE. */
|
|
22
|
+
const REDACTED = '[REDACTED]';
|
|
23
|
+
/** Map keys whose (string→string) VALUES are secret build-time material. */
|
|
24
|
+
const SECRET_MAP_KEYS = new Set(['env', 'buildArgs']);
|
|
25
|
+
/**
|
|
26
|
+
* Scalar keys that themselves carry a secret string (tokens/passwords/etc.).
|
|
27
|
+
* Applied only to string values so boolean flags and declaration arrays (e.g.
|
|
28
|
+
* `secrets: PluginSecret[]`) are left intact.
|
|
29
|
+
*/
|
|
30
|
+
function isSecretScalarKey(key) {
|
|
31
|
+
const k = key.toLowerCase();
|
|
32
|
+
return k.includes('token') || k.includes('secret') || k.includes('password')
|
|
33
|
+
|| k.includes('passphrase') || k.includes('credential') || k.includes('apikey')
|
|
34
|
+
|| k.includes('accesskey') || k.includes('privatekey');
|
|
35
|
+
}
|
|
36
|
+
/** Only plain (Object-prototype) objects are traversed — Dates/class instances pass through intact. */
|
|
37
|
+
function isPlainObject(v) {
|
|
38
|
+
if (v === null || typeof v !== 'object')
|
|
39
|
+
return false;
|
|
40
|
+
const proto = Object.getPrototypeOf(v);
|
|
41
|
+
return proto === Object.prototype || proto === null;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Project an entity into the compliance-event `attributes`, redacting secret
|
|
45
|
+
* VALUES while preserving everything the compliance engine actually evaluates.
|
|
46
|
+
* Recurses so nested secrets (deep inside a pipeline's `props`) are covered too.
|
|
47
|
+
*/
|
|
48
|
+
export function toComplianceAttributes(value) {
|
|
49
|
+
if (Array.isArray(value))
|
|
50
|
+
return value.map(toComplianceAttributes);
|
|
51
|
+
if (isPlainObject(value)) {
|
|
52
|
+
const out = {};
|
|
53
|
+
for (const [k, v] of Object.entries(value)) {
|
|
54
|
+
if (SECRET_MAP_KEYS.has(k) && isPlainObject(v)) {
|
|
55
|
+
// Preserve keys (compliance reads $keys/$count/presence), redact values.
|
|
56
|
+
out[k] = Object.fromEntries(Object.keys(v).map((mk) => [mk, REDACTED]));
|
|
57
|
+
}
|
|
58
|
+
else if (isSecretScalarKey(k) && typeof v === 'string') {
|
|
59
|
+
out[k] = REDACTED;
|
|
60
|
+
}
|
|
61
|
+
else {
|
|
62
|
+
out[k] = toComplianceAttributes(v);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
return out;
|
|
66
|
+
}
|
|
67
|
+
return value; // primitives, Date, null — untouched
|
|
68
|
+
}
|
|
69
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tcGxpYW5jZS1hdHRyaWJ1dGVzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3V0aWxzL2NvbXBsaWFuY2UtYXR0cmlidXRlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwrQ0FBK0M7QUFDL0Msc0NBQXNDO0FBRXRDOzs7Ozs7Ozs7Ozs7Ozs7OztHQWlCRztBQUVILDBEQUEwRDtBQUMxRCxNQUFNLFFBQVEsR0FBRyxZQUFZLENBQUM7QUFFOUIsNEVBQTRFO0FBQzVFLE1BQU0sZUFBZSxHQUFHLElBQUksR0FBRyxDQUFDLENBQUMsS0FBSyxFQUFFLFdBQVcsQ0FBQyxDQUFDLENBQUM7QUFFdEQ7Ozs7R0FJRztBQUNILFNBQVMsaUJBQWlCLENBQUMsR0FBVztJQUNwQyxNQUFNLENBQUMsR0FBRyxHQUFHLENBQUMsV0FBVyxFQUFFLENBQUM7SUFDNUIsT0FBTyxDQUFDLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUM7V0FDdkUsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUMsUUFBUSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDO1dBQzVFLENBQUMsQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDLFFBQVEsQ0FBQyxZQUFZLENBQUMsQ0FBQztBQUMzRCxDQUFDO0FBRUQsdUdBQXVHO0FBQ3ZHLFNBQVMsYUFBYSxDQUFDLENBQVU7SUFDL0IsSUFBSSxDQUFDLEtBQUssSUFBSSxJQUFJLE9BQU8sQ0FBQyxLQUFLLFFBQVE7UUFBRSxPQUFPLEtBQUssQ0FBQztJQUN0RCxNQUFNLEtBQUssR0FBRyxNQUFNLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3ZDLE9BQU8sS0FBSyxLQUFLLE1BQU0sQ0FBQyxTQUFTLElBQUksS0FBSyxLQUFLLElBQUksQ0FBQztBQUN0RCxDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILE1BQU0sVUFBVSxzQkFBc0IsQ0FBQyxLQUFjO0lBQ25ELElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUM7UUFBRSxPQUFPLEtBQUssQ0FBQyxHQUFHLENBQUMsc0JBQXNCLENBQUMsQ0FBQztJQUNuRSxJQUFJLGFBQWEsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO1FBQ3pCLE1BQU0sR0FBRyxHQUE0QixFQUFFLENBQUM7UUFDeEMsS0FBSyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUMzQyxJQUFJLGVBQWUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksYUFBYSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7Z0JBQy9DLHlFQUF5RTtnQkFDekUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUMxRSxDQUFDO2lCQUFNLElBQUksaUJBQWlCLENBQUMsQ0FBQyxDQUFDLElBQUksT0FBTyxDQUFDLEtBQUssUUFBUSxFQUFFLENBQUM7Z0JBQ3pELEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxRQUFRLENBQUM7WUFDcEIsQ0FBQztpQkFBTSxDQUFDO2dCQUNOLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxzQkFBc0IsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNyQyxDQUFDO1FBQ0gsQ0FBQztRQUNELE9BQU8sR0FBRyxDQUFDO0lBQ2IsQ0FBQztJQUNELE9BQU8sS0FBSyxDQUFDLENBQUMscUNBQXFDO0FBQ3JELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgMjAyNiBQaXBlbGluZSBCdWlsZGVyIENvbnRyaWJ1dG9yc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcblxuLyoqXG4gKiBTZWNyZXQtcmVkYWN0aW9uIGZvciBjb21wbGlhbmNlLWV2ZW50IGBhdHRyaWJ1dGVzYC5cbiAqXG4gKiBTaGFyZWQgYnkgdGhlIHBsdWdpbiBBTkQgcGlwZWxpbmUgc2VydmljZXMgKHByZXZpb3VzbHkgYSBieXRlLWlkZW50aWNhbCBjb3B5XG4gKiBpbiBlYWNoIOKAlCBhIHNlY3VyaXR5LWNyaXRpY2FsIGZ1bmN0aW9uIHRoYXQgbXVzdCBub3QgZHJpZnQ6IGEgZnV0dXJlIFwiYWxzb1xuICogcmVkYWN0IGBjcmVkZW50aWFsc2BcIiBmaXggaGFzIHRvIHByb3RlY3QgQk9USCBzZXJ2aWNlcykuIEJvdGggZmVlZCBlbnRpdHlcbiAqIGF0dHJpYnV0ZXMgdG8gdGhlIGNvbXBsaWFuY2UgZW5naW5lIG92ZXIgUmVkaXMsIGFuZCBuZWl0aGVyIG1heSBsZWFrIHBsYWludGV4dFxuICogc2VjcmV0cyB0aGVyZS5cbiAqXG4gKiBUaGUgY29tcGxpYW5jZSBydWxlIGVuZ2luZSByZWFkcyBzZWNyZXQgbWFwcyAoYGVudmAvYGJ1aWxkQXJnc2AsIGluY2wuIG5lc3RlZFxuICogYHByb3BzLnN5bnRoLmVudmAsIGBwcm9wcy5zdGFnZXNbXS5zdGVwc1tdLmVudmAsIOKApikgT05MWSBieSBLRVkg4oCUIGAka2V5cyhlbnYpYCxcbiAqIGAkY291bnQoZW52KWAsIGRvdC1wYXRoIGV4aXN0ZW5jZSwga2V5LWBjb250YWluc2Ag4oCUIG5ldmVyIGJ5IHZhbHVlIChzZWVcbiAqIGFwaS9jb21wbGlhbmNlL3NyYy9lbmdpbmUvcnVsZS1vcGVyYXRvcnMudHMgKyBpdHMgdGVzdHMpLiBTbyB3ZSBwcmVzZXJ2ZSBlYWNoXG4gKiBzZWNyZXQgbWFwJ3Mgc2hhcGUgKyBLRVlTIHdoaWxlIG92ZXJ3cml0aW5nIGV2ZXJ5IHZhbHVlIHdpdGggYSBtYXJrZXI7IHNjYWxhclxuICogc2VjcmV0IGZpZWxkcyAoc291cmNlIGB0b2tlbmAsIHBhc3N3b3Jkcywg4oCmKSBhcmUgcmVwbGFjZWQgb3V0cmlnaHQuIFN0cnVjdHVyZVxuICogYW5kIG5vbi1zZWNyZXQgbWV0YWRhdGEgcGFzcyB0aHJvdWdoIHVuY2hhbmdlZCwgc28gcnVsZSBldmFsdWF0aW9uIGlzXG4gKiBpZGVudGljYWwgd2hpbGUgcGxhaW50ZXh0IHNlY3JldHMgbmV2ZXIgcmVhY2ggUmVkaXMgb3IgdGhlIGNvbXBsaWFuY2Ugc2VydmljZS5cbiAqL1xuXG4vKiogTWFya2VyIHdyaXR0ZW4gaW4gcGxhY2Ugb2YgYSByZWRhY3RlZCBzZWNyZXQgVkFMVUUuICovXG5jb25zdCBSRURBQ1RFRCA9ICdbUkVEQUNURURdJztcblxuLyoqIE1hcCBrZXlzIHdob3NlIChzdHJpbmfihpJzdHJpbmcpIFZBTFVFUyBhcmUgc2VjcmV0IGJ1aWxkLXRpbWUgbWF0ZXJpYWwuICovXG5jb25zdCBTRUNSRVRfTUFQX0tFWVMgPSBuZXcgU2V0KFsnZW52JywgJ2J1aWxkQXJncyddKTtcblxuLyoqXG4gKiBTY2FsYXIga2V5cyB0aGF0IHRoZW1zZWx2ZXMgY2FycnkgYSBzZWNyZXQgc3RyaW5nICh0b2tlbnMvcGFzc3dvcmRzL2V0Yy4pLlxuICogQXBwbGllZCBvbmx5IHRvIHN0cmluZyB2YWx1ZXMgc28gYm9vbGVhbiBmbGFncyBhbmQgZGVjbGFyYXRpb24gYXJyYXlzIChlLmcuXG4gKiBgc2VjcmV0czogUGx1Z2luU2VjcmV0W11gKSBhcmUgbGVmdCBpbnRhY3QuXG4gKi9cbmZ1bmN0aW9uIGlzU2VjcmV0U2NhbGFyS2V5KGtleTogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGNvbnN0IGsgPSBrZXkudG9Mb3dlckNhc2UoKTtcbiAgcmV0dXJuIGsuaW5jbHVkZXMoJ3Rva2VuJykgfHwgay5pbmNsdWRlcygnc2VjcmV0JykgfHwgay5pbmNsdWRlcygncGFzc3dvcmQnKVxuICAgIHx8IGsuaW5jbHVkZXMoJ3Bhc3NwaHJhc2UnKSB8fCBrLmluY2x1ZGVzKCdjcmVkZW50aWFsJykgfHwgay5pbmNsdWRlcygnYXBpa2V5JylcbiAgICB8fCBrLmluY2x1ZGVzKCdhY2Nlc3NrZXknKSB8fCBrLmluY2x1ZGVzKCdwcml2YXRla2V5Jyk7XG59XG5cbi8qKiBPbmx5IHBsYWluIChPYmplY3QtcHJvdG90eXBlKSBvYmplY3RzIGFyZSB0cmF2ZXJzZWQg4oCUIERhdGVzL2NsYXNzIGluc3RhbmNlcyBwYXNzIHRocm91Z2ggaW50YWN0LiAqL1xuZnVuY3Rpb24gaXNQbGFpbk9iamVjdCh2OiB1bmtub3duKTogdiBpcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB7XG4gIGlmICh2ID09PSBudWxsIHx8IHR5cGVvZiB2ICE9PSAnb2JqZWN0JykgcmV0dXJuIGZhbHNlO1xuICBjb25zdCBwcm90byA9IE9iamVjdC5nZXRQcm90b3R5cGVPZih2KTtcbiAgcmV0dXJuIHByb3RvID09PSBPYmplY3QucHJvdG90eXBlIHx8IHByb3RvID09PSBudWxsO1xufVxuXG4vKipcbiAqIFByb2plY3QgYW4gZW50aXR5IGludG8gdGhlIGNvbXBsaWFuY2UtZXZlbnQgYGF0dHJpYnV0ZXNgLCByZWRhY3Rpbmcgc2VjcmV0XG4gKiBWQUxVRVMgd2hpbGUgcHJlc2VydmluZyBldmVyeXRoaW5nIHRoZSBjb21wbGlhbmNlIGVuZ2luZSBhY3R1YWxseSBldmFsdWF0ZXMuXG4gKiBSZWN1cnNlcyBzbyBuZXN0ZWQgc2VjcmV0cyAoZGVlcCBpbnNpZGUgYSBwaXBlbGluZSdzIGBwcm9wc2ApIGFyZSBjb3ZlcmVkIHRvby5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvQ29tcGxpYW5jZUF0dHJpYnV0ZXModmFsdWU6IHVua25vd24pOiB1bmtub3duIHtcbiAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSByZXR1cm4gdmFsdWUubWFwKHRvQ29tcGxpYW5jZUF0dHJpYnV0ZXMpO1xuICBpZiAoaXNQbGFpbk9iamVjdCh2YWx1ZSkpIHtcbiAgICBjb25zdCBvdXQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge307XG4gICAgZm9yIChjb25zdCBbaywgdl0gb2YgT2JqZWN0LmVudHJpZXModmFsdWUpKSB7XG4gICAgICBpZiAoU0VDUkVUX01BUF9LRVlTLmhhcyhrKSAmJiBpc1BsYWluT2JqZWN0KHYpKSB7XG4gICAgICAgIC8vIFByZXNlcnZlIGtleXMgKGNvbXBsaWFuY2UgcmVhZHMgJGtleXMvJGNvdW50L3ByZXNlbmNlKSwgcmVkYWN0IHZhbHVlcy5cbiAgICAgICAgb3V0W2tdID0gT2JqZWN0LmZyb21FbnRyaWVzKE9iamVjdC5rZXlzKHYpLm1hcCgobWspID0+IFttaywgUkVEQUNURURdKSk7XG4gICAgICB9IGVsc2UgaWYgKGlzU2VjcmV0U2NhbGFyS2V5KGspICYmIHR5cGVvZiB2ID09PSAnc3RyaW5nJykge1xuICAgICAgICBvdXRba10gPSBSRURBQ1RFRDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG91dFtrXSA9IHRvQ29tcGxpYW5jZUF0dHJpYnV0ZXModik7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBvdXQ7XG4gIH1cbiAgcmV0dXJuIHZhbHVlOyAvLyBwcmltaXRpdmVzLCBEYXRlLCBudWxsIOKAlCB1bnRvdWNoZWRcbn1cbiJdfQ==
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Typed environment-variable readers with consistent parsing + defaults.
|
|
3
|
+
*
|
|
4
|
+
* Services previously hand-rolled `parseInt(process.env.X || '…', 10)` /
|
|
5
|
+
* `process.env.X === 'true'` at hundreds of call sites — which drifts (the same
|
|
6
|
+
* var parsed with different defaults in different packages) and silently returns
|
|
7
|
+
* the default on a typo'd name. These helpers centralize the parsing so a value
|
|
8
|
+
* is read the same way everywhere, and make shared constants importable rather
|
|
9
|
+
* than re-derived (see `MAX_PAGE_LIMIT` / `DEFAULT_PAGE_LIMIT` in
|
|
10
|
+
* `validation/common-schemas.ts`).
|
|
11
|
+
*/
|
|
12
|
+
/**
|
|
13
|
+
* Parse an integer env var. Unset / blank / non-numeric → `def`. Optional
|
|
14
|
+
* `min`/`max` clamp the result (applied after the default).
|
|
15
|
+
*/
|
|
16
|
+
export declare function envInt(name: string, def: number, opts?: {
|
|
17
|
+
min?: number;
|
|
18
|
+
max?: number;
|
|
19
|
+
}): number;
|
|
20
|
+
/**
|
|
21
|
+
* Parse a boolean env var. `true`/`1`/`yes` → true, `false`/`0`/`no` → false
|
|
22
|
+
* (case-insensitive); unset / blank / unrecognized → `def`.
|
|
23
|
+
*/
|
|
24
|
+
export declare function envBool(name: string, def: boolean): boolean;
|
|
25
|
+
/** Read an env var constrained to `allowed`; unset / not-in-set → `def`. */
|
|
26
|
+
export declare function envEnum<T extends string>(name: string, allowed: readonly T[], def: T): T;
|
|
27
|
+
/** Read a string env var; unset / blank → `def`. */
|
|
28
|
+
export declare function envStr(name: string, def: string): string;
|
package/lib/utils/env.js
ADDED
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
// Copyright 2026 Pipeline Builder Contributors
|
|
2
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
3
|
+
/**
|
|
4
|
+
* Typed environment-variable readers with consistent parsing + defaults.
|
|
5
|
+
*
|
|
6
|
+
* Services previously hand-rolled `parseInt(process.env.X || '…', 10)` /
|
|
7
|
+
* `process.env.X === 'true'` at hundreds of call sites — which drifts (the same
|
|
8
|
+
* var parsed with different defaults in different packages) and silently returns
|
|
9
|
+
* the default on a typo'd name. These helpers centralize the parsing so a value
|
|
10
|
+
* is read the same way everywhere, and make shared constants importable rather
|
|
11
|
+
* than re-derived (see `MAX_PAGE_LIMIT` / `DEFAULT_PAGE_LIMIT` in
|
|
12
|
+
* `validation/common-schemas.ts`).
|
|
13
|
+
*/
|
|
14
|
+
/**
|
|
15
|
+
* Parse an integer env var. Unset / blank / non-numeric → `def`. Optional
|
|
16
|
+
* `min`/`max` clamp the result (applied after the default).
|
|
17
|
+
*/
|
|
18
|
+
export function envInt(name, def, opts) {
|
|
19
|
+
const raw = process.env[name];
|
|
20
|
+
let n = raw === undefined || raw.trim() === '' ? def : Number.parseInt(raw, 10);
|
|
21
|
+
if (!Number.isFinite(n))
|
|
22
|
+
n = def;
|
|
23
|
+
if (opts?.min !== undefined)
|
|
24
|
+
n = Math.max(opts.min, n);
|
|
25
|
+
if (opts?.max !== undefined)
|
|
26
|
+
n = Math.min(opts.max, n);
|
|
27
|
+
return n;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Parse a boolean env var. `true`/`1`/`yes` → true, `false`/`0`/`no` → false
|
|
31
|
+
* (case-insensitive); unset / blank / unrecognized → `def`.
|
|
32
|
+
*/
|
|
33
|
+
export function envBool(name, def) {
|
|
34
|
+
const raw = process.env[name];
|
|
35
|
+
if (raw === undefined || raw.trim() === '')
|
|
36
|
+
return def;
|
|
37
|
+
const v = raw.trim().toLowerCase();
|
|
38
|
+
if (v === 'true' || v === '1' || v === 'yes')
|
|
39
|
+
return true;
|
|
40
|
+
if (v === 'false' || v === '0' || v === 'no')
|
|
41
|
+
return false;
|
|
42
|
+
return def;
|
|
43
|
+
}
|
|
44
|
+
/** Read an env var constrained to `allowed`; unset / not-in-set → `def`. */
|
|
45
|
+
export function envEnum(name, allowed, def) {
|
|
46
|
+
const raw = process.env[name]?.trim();
|
|
47
|
+
return raw !== undefined && allowed.includes(raw) ? raw : def;
|
|
48
|
+
}
|
|
49
|
+
/** Read a string env var; unset / blank → `def`. */
|
|
50
|
+
export function envStr(name, def) {
|
|
51
|
+
const raw = process.env[name];
|
|
52
|
+
return raw === undefined || raw.trim() === '' ? def : raw;
|
|
53
|
+
}
|
|
54
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW52LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3V0aWxzL2Vudi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwrQ0FBK0M7QUFDL0Msc0NBQXNDO0FBRXRDOzs7Ozs7Ozs7O0dBVUc7QUFFSDs7O0dBR0c7QUFDSCxNQUFNLFVBQVUsTUFBTSxDQUFDLElBQVksRUFBRSxHQUFXLEVBQUUsSUFBcUM7SUFDckYsTUFBTSxHQUFHLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUM5QixJQUFJLENBQUMsR0FBRyxHQUFHLEtBQUssU0FBUyxJQUFJLEdBQUcsQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDaEYsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO1FBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQztJQUNqQyxJQUFJLElBQUksRUFBRSxHQUFHLEtBQUssU0FBUztRQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDdkQsSUFBSSxJQUFJLEVBQUUsR0FBRyxLQUFLLFNBQVM7UUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ3ZELE9BQU8sQ0FBQyxDQUFDO0FBQ1gsQ0FBQztBQUVEOzs7R0FHRztBQUNILE1BQU0sVUFBVSxPQUFPLENBQUMsSUFBWSxFQUFFLEdBQVk7SUFDaEQsTUFBTSxHQUFHLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUM5QixJQUFJLEdBQUcsS0FBSyxTQUFTLElBQUksR0FBRyxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUU7UUFBRSxPQUFPLEdBQUcsQ0FBQztJQUN2RCxNQUFNLENBQUMsR0FBRyxHQUFHLENBQUMsSUFBSSxFQUFFLENBQUMsV0FBVyxFQUFFLENBQUM7SUFDbkMsSUFBSSxDQUFDLEtBQUssTUFBTSxJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLEtBQUs7UUFBRSxPQUFPLElBQUksQ0FBQztJQUMxRCxJQUFJLENBQUMsS0FBSyxPQUFPLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssSUFBSTtRQUFFLE9BQU8sS0FBSyxDQUFDO0lBQzNELE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUVELDRFQUE0RTtBQUM1RSxNQUFNLFVBQVUsT0FBTyxDQUFtQixJQUFZLEVBQUUsT0FBcUIsRUFBRSxHQUFNO0lBQ25GLE1BQU0sR0FBRyxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsSUFBSSxFQUFtQixDQUFDO0lBQ3ZELE9BQU8sR0FBRyxLQUFLLFNBQVMsSUFBSSxPQUFPLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQztBQUNoRSxDQUFDO0FBRUQsb0RBQW9EO0FBQ3BELE1BQU0sVUFBVSxNQUFNLENBQUMsSUFBWSxFQUFFLEdBQVc7SUFDOUMsTUFBTSxHQUFHLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUM5QixPQUFPLEdBQUcsS0FBSyxTQUFTLElBQUksR0FBRyxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUM7QUFDNUQsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAyMDI2IFBpcGVsaW5lIEJ1aWxkZXIgQ29udHJpYnV0b3JzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG4vKipcbiAqIFR5cGVkIGVudmlyb25tZW50LXZhcmlhYmxlIHJlYWRlcnMgd2l0aCBjb25zaXN0ZW50IHBhcnNpbmcgKyBkZWZhdWx0cy5cbiAqXG4gKiBTZXJ2aWNlcyBwcmV2aW91c2x5IGhhbmQtcm9sbGVkIGBwYXJzZUludChwcm9jZXNzLmVudi5YIHx8ICfigKYnLCAxMClgIC9cbiAqIGBwcm9jZXNzLmVudi5YID09PSAndHJ1ZSdgIGF0IGh1bmRyZWRzIG9mIGNhbGwgc2l0ZXMg4oCUIHdoaWNoIGRyaWZ0cyAodGhlIHNhbWVcbiAqIHZhciBwYXJzZWQgd2l0aCBkaWZmZXJlbnQgZGVmYXVsdHMgaW4gZGlmZmVyZW50IHBhY2thZ2VzKSBhbmQgc2lsZW50bHkgcmV0dXJuc1xuICogdGhlIGRlZmF1bHQgb24gYSB0eXBvJ2QgbmFtZS4gVGhlc2UgaGVscGVycyBjZW50cmFsaXplIHRoZSBwYXJzaW5nIHNvIGEgdmFsdWVcbiAqIGlzIHJlYWQgdGhlIHNhbWUgd2F5IGV2ZXJ5d2hlcmUsIGFuZCBtYWtlIHNoYXJlZCBjb25zdGFudHMgaW1wb3J0YWJsZSByYXRoZXJcbiAqIHRoYW4gcmUtZGVyaXZlZCAoc2VlIGBNQVhfUEFHRV9MSU1JVGAgLyBgREVGQVVMVF9QQUdFX0xJTUlUYCBpblxuICogYHZhbGlkYXRpb24vY29tbW9uLXNjaGVtYXMudHNgKS5cbiAqL1xuXG4vKipcbiAqIFBhcnNlIGFuIGludGVnZXIgZW52IHZhci4gVW5zZXQgLyBibGFuayAvIG5vbi1udW1lcmljIOKGkiBgZGVmYC4gT3B0aW9uYWxcbiAqIGBtaW5gL2BtYXhgIGNsYW1wIHRoZSByZXN1bHQgKGFwcGxpZWQgYWZ0ZXIgdGhlIGRlZmF1bHQpLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZW52SW50KG5hbWU6IHN0cmluZywgZGVmOiBudW1iZXIsIG9wdHM/OiB7IG1pbj86IG51bWJlcjsgbWF4PzogbnVtYmVyIH0pOiBudW1iZXIge1xuICBjb25zdCByYXcgPSBwcm9jZXNzLmVudltuYW1lXTtcbiAgbGV0IG4gPSByYXcgPT09IHVuZGVmaW5lZCB8fCByYXcudHJpbSgpID09PSAnJyA/IGRlZiA6IE51bWJlci5wYXJzZUludChyYXcsIDEwKTtcbiAgaWYgKCFOdW1iZXIuaXNGaW5pdGUobikpIG4gPSBkZWY7XG4gIGlmIChvcHRzPy5taW4gIT09IHVuZGVmaW5lZCkgbiA9IE1hdGgubWF4KG9wdHMubWluLCBuKTtcbiAgaWYgKG9wdHM/Lm1heCAhPT0gdW5kZWZpbmVkKSBuID0gTWF0aC5taW4ob3B0cy5tYXgsIG4pO1xuICByZXR1cm4gbjtcbn1cblxuLyoqXG4gKiBQYXJzZSBhIGJvb2xlYW4gZW52IHZhci4gYHRydWVgL2AxYC9geWVzYCDihpIgdHJ1ZSwgYGZhbHNlYC9gMGAvYG5vYCDihpIgZmFsc2VcbiAqIChjYXNlLWluc2Vuc2l0aXZlKTsgdW5zZXQgLyBibGFuayAvIHVucmVjb2duaXplZCDihpIgYGRlZmAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBlbnZCb29sKG5hbWU6IHN0cmluZywgZGVmOiBib29sZWFuKTogYm9vbGVhbiB7XG4gIGNvbnN0IHJhdyA9IHByb2Nlc3MuZW52W25hbWVdO1xuICBpZiAocmF3ID09PSB1bmRlZmluZWQgfHwgcmF3LnRyaW0oKSA9PT0gJycpIHJldHVybiBkZWY7XG4gIGNvbnN0IHYgPSByYXcudHJpbSgpLnRvTG93ZXJDYXNlKCk7XG4gIGlmICh2ID09PSAndHJ1ZScgfHwgdiA9PT0gJzEnIHx8IHYgPT09ICd5ZXMnKSByZXR1cm4gdHJ1ZTtcbiAgaWYgKHYgPT09ICdmYWxzZScgfHwgdiA9PT0gJzAnIHx8IHYgPT09ICdubycpIHJldHVybiBmYWxzZTtcbiAgcmV0dXJuIGRlZjtcbn1cblxuLyoqIFJlYWQgYW4gZW52IHZhciBjb25zdHJhaW5lZCB0byBgYWxsb3dlZGA7IHVuc2V0IC8gbm90LWluLXNldCDihpIgYGRlZmAuICovXG5leHBvcnQgZnVuY3Rpb24gZW52RW51bTxUIGV4dGVuZHMgc3RyaW5nPihuYW1lOiBzdHJpbmcsIGFsbG93ZWQ6IHJlYWRvbmx5IFRbXSwgZGVmOiBUKTogVCB7XG4gIGNvbnN0IHJhdyA9IHByb2Nlc3MuZW52W25hbWVdPy50cmltKCkgYXMgVCB8IHVuZGVmaW5lZDtcbiAgcmV0dXJuIHJhdyAhPT0gdW5kZWZpbmVkICYmIGFsbG93ZWQuaW5jbHVkZXMocmF3KSA/IHJhdyA6IGRlZjtcbn1cblxuLyoqIFJlYWQgYSBzdHJpbmcgZW52IHZhcjsgdW5zZXQgLyBibGFuayDihpIgYGRlZmAuICovXG5leHBvcnQgZnVuY3Rpb24gZW52U3RyKG5hbWU6IHN0cmluZywgZGVmOiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCByYXcgPSBwcm9jZXNzLmVudltuYW1lXTtcbiAgcmV0dXJuIHJhdyA9PT0gdW5kZWZpbmVkIHx8IHJhdy50cmltKCkgPT09ICcnID8gZGVmIDogcmF3O1xufVxuIl19
|
package/lib/utils/index.d.ts
CHANGED
package/lib/utils/index.js
CHANGED
|
@@ -15,4 +15,6 @@ export * from './secret-encryption.js';
|
|
|
15
15
|
export * from './metric-emitter.js';
|
|
16
16
|
export * from './aws-scrub.js';
|
|
17
17
|
export * from './ssrf.js';
|
|
18
|
-
|
|
18
|
+
export * from './env.js';
|
|
19
|
+
export * from './compliance-attributes.js';
|
|
20
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdXRpbHMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0NBQStDO0FBQy9DLHNDQUFzQztBQUV0QyxjQUFjLGFBQWEsQ0FBQztBQUM1QixjQUFjLG1CQUFtQixDQUFDO0FBQ2xDLGNBQWMscUJBQXFCLENBQUM7QUFDcEMsY0FBYyxlQUFlLENBQUM7QUFDOUIsY0FBYyxhQUFhLENBQUM7QUFDNUIsY0FBYyxjQUFjLENBQUM7QUFDN0IsY0FBYyxlQUFlLENBQUM7QUFDOUIsY0FBYyxhQUFhLENBQUM7QUFDNUIsY0FBYyxxQkFBcUIsQ0FBQztBQUNwQyxjQUFjLGtCQUFrQixDQUFDO0FBQ2pDLGNBQWMsWUFBWSxDQUFDO0FBQzNCLGNBQWMsd0JBQXdCLENBQUM7QUFDdkMsY0FBYyxxQkFBcUIsQ0FBQztBQUNwQyxjQUFjLGdCQUFnQixDQUFDO0FBQy9CLGNBQWMsV0FBVyxDQUFDO0FBQzFCLGNBQWMsVUFBVSxDQUFDO0FBQ3pCLGNBQWMsNEJBQTRCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgMjAyNiBQaXBlbGluZSBCdWlsZGVyIENvbnRyaWJ1dG9yc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcblxuZXhwb3J0ICogZnJvbSAnLi9sb2dnZXIuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9zYWZlLXJlcXVpcmUuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9jcmFzaC1oYW5kbGVycy5qcyc7XG5leHBvcnQgKiBmcm9tICcuL3Jlc3BvbnNlLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vcGFyYW1zLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vaGVhZGVycy5qcyc7XG5leHBvcnQgKiBmcm9tICcuL2lkZW50aXR5LmpzJztcbmV4cG9ydCAqIGZyb20gJy4vb2JqZWN0LmpzJztcbmV4cG9ydCAqIGZyb20gJy4vYWxpYXMtcmVzb2x2ZXIuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9jb25jdXJyZW5jeS5qcyc7XG5leHBvcnQgKiBmcm9tICcuL2F1ZGl0LmpzJztcbmV4cG9ydCAqIGZyb20gJy4vc2VjcmV0LWVuY3J5cHRpb24uanMnO1xuZXhwb3J0ICogZnJvbSAnLi9tZXRyaWMtZW1pdHRlci5qcyc7XG5leHBvcnQgKiBmcm9tICcuL2F3cy1zY3J1Yi5qcyc7XG5leHBvcnQgKiBmcm9tICcuL3NzcmYuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9lbnYuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9jb21wbGlhbmNlLWF0dHJpYnV0ZXMuanMnO1xuIl19
|
|
@@ -36,35 +36,6 @@ export declare class EnvKeyProvider implements KeyProvider {
|
|
|
36
36
|
constructor(masterKeyOverride?: string);
|
|
37
37
|
deriveKey(orgId: string): Buffer;
|
|
38
38
|
}
|
|
39
|
-
/**
|
|
40
|
-
* AWS-KMS-backed KeyProvider.
|
|
41
|
-
*
|
|
42
|
-
* Trade-off picked: store ONE master key encrypted under a KMS CMK; on
|
|
43
|
-
* first use, call `kms:Decrypt` to recover the master key bytes; HKDF-
|
|
44
|
-
* derive per-org from it (same as EnvKeyProvider). The process then holds
|
|
45
|
-
* the plaintext master key in memory until restart.
|
|
46
|
-
*
|
|
47
|
-
* PROS: one KMS call per process lifetime (cheap, low p99 impact),
|
|
48
|
-
* the encrypted-master-key blob is safe to commit/log/checkin,
|
|
49
|
-
* KMS audit log records when the master is recovered.
|
|
50
|
-
* CONS: process memory still holds the master key same posture as
|
|
51
|
-
* EnvKeyProvider once warmed up. For stronger isolation an
|
|
52
|
-
* operator can move to per-record envelope encryption (call
|
|
53
|
-
* GenerateDataKey on every write); that's a follow-on.
|
|
54
|
-
*
|
|
55
|
-
* Operator setup * 1. Create a KMS CMK with key policy allowing the platform service's
|
|
56
|
-
* IAM role kms:Decrypt.
|
|
57
|
-
* 2. Generate a random 32-byte master * head -c 32 /dev/urandom | base64
|
|
58
|
-
* 3. Wrap it with KMS * aws kms encrypt --key-id <KEY_ID> \
|
|
59
|
-
* --plaintext <base64-from-step-2> --output text \
|
|
60
|
-
* --query CiphertextBlob
|
|
61
|
-
* 4. Set on the service * SECRET_ENCRYPTION_KMS_KEY_ID=<KEY_ID>
|
|
62
|
-
* SECRET_ENCRYPTION_KMS_CIPHERTEXT=<base64-output-of-step-3>
|
|
63
|
-
* 5. Pick this provider via `setKeyProvider(new KmsKeyProvider())`.
|
|
64
|
-
*
|
|
65
|
-
* Construct lazily importing the AWS SDK has a non-trivial cold-start
|
|
66
|
-
* cost so envs that stay on EnvKeyProvider never load it.
|
|
67
|
-
*/
|
|
68
39
|
export declare class KmsKeyProvider implements KeyProvider {
|
|
69
40
|
private masterKeyCache;
|
|
70
41
|
private readonly keyId;
|