@ya-accelerators/web-backend-framework 0.0.99 → 0.0.101
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/@types/express.d.ts +0 -4
- package/dist/connector/google-auth/index.js +0 -30
- package/dist/connector/google-auth/index.js.map +1 -1
- package/dist/constants.d.ts +7 -0
- package/dist/constants.js +71 -4
- package/dist/constants.js.map +1 -1
- package/dist/context/audit/index.js.map +1 -1
- package/dist/context/request/index.js +0 -15
- package/dist/context/request/index.js.map +1 -1
- package/dist/coordination/lock/index.d.ts +0 -8
- package/dist/coordination/lock/index.js +0 -29
- package/dist/coordination/lock/index.js.map +1 -1
- package/dist/coordination/rate-limit/index.d.ts +0 -5
- package/dist/coordination/rate-limit/index.js +0 -23
- package/dist/coordination/rate-limit/index.js.map +1 -1
- package/dist/coordination/throttle/index.d.ts +0 -13
- package/dist/coordination/throttle/index.js +0 -13
- package/dist/coordination/throttle/index.js.map +1 -1
- package/dist/env.d.ts +1 -1
- package/dist/env.js +5 -15
- package/dist/env.js.map +1 -1
- package/dist/internal/federation/index.d.ts +1 -1
- package/dist/internal/federation/index.js +0 -20
- package/dist/internal/federation/index.js.map +1 -1
- package/dist/logger/index.js +0 -18
- package/dist/logger/index.js.map +1 -1
- package/dist/repository/prisma/index.js +5 -7
- package/dist/repository/prisma/index.js.map +1 -1
- package/dist/repository/prisma/lifecycle.js +2 -26
- package/dist/repository/prisma/lifecycle.js.map +1 -1
- package/dist/repository/prisma/rds-log-record.d.ts +10 -0
- package/dist/repository/prisma/rds-log-record.js +20 -0
- package/dist/repository/prisma/rds-log-record.js.map +1 -0
- package/dist/repository/redis/index.js +10 -9
- package/dist/repository/redis/index.js.map +1 -1
- package/dist/repository/s3/index.js +16 -28
- package/dist/repository/s3/index.js.map +1 -1
- package/dist/server/express/index.js +18 -53
- package/dist/server/express/index.js.map +1 -1
- package/dist/server/index.d.ts +1 -0
- package/dist/server/index.js +1 -0
- package/dist/server/index.js.map +1 -1
- package/dist/server/trpc/declaration/index.d.ts +38 -0
- package/dist/server/trpc/declaration/index.js +2 -0
- package/dist/server/trpc/declaration/index.js.map +1 -0
- package/dist/server/trpc/index.d.ts +18 -17
- package/dist/server/trpc/index.js +36 -44
- package/dist/server/trpc/index.js.map +1 -1
- package/dist/server/trpc/schema/index.js +0 -10
- package/dist/server/trpc/schema/index.js.map +1 -1
- package/dist/server/uploads/index.js +8 -9
- package/dist/server/uploads/index.js.map +1 -1
- package/dist/util/index.js +88 -74
- package/dist/util/index.js.map +1 -1
- package/package.json +13 -9
|
@@ -5,6 +5,7 @@ import { readReplicas } from '@prisma/extension-read-replicas';
|
|
|
5
5
|
import { defaultEnv } from '../../env.js';
|
|
6
6
|
import { logger } from '../../logger/index.js';
|
|
7
7
|
import { buildAggregateRegistry, discoverModelNames, lifecycleEmitExtension } from './lifecycle.js';
|
|
8
|
+
import { rdsLogRecord } from './rds-log-record.js';
|
|
8
9
|
class Singleton {
|
|
9
10
|
static storage = new AsyncLocalStorage();
|
|
10
11
|
static instances = new Map();
|
|
@@ -91,10 +92,10 @@ export const prisma = {
|
|
|
91
92
|
logger.debug('rds', { ...event, params: '***' });
|
|
92
93
|
});
|
|
93
94
|
primary.$on('warn', (event) => {
|
|
94
|
-
logger.warn('rds', event);
|
|
95
|
+
logger.warn('rds', rdsLogRecord(event));
|
|
95
96
|
});
|
|
96
97
|
primary.$on('error', (event) => {
|
|
97
|
-
logger.error('rds', event);
|
|
98
|
+
logger.error('rds', rdsLogRecord(event));
|
|
98
99
|
});
|
|
99
100
|
const replica = new PrismaClientConstructor({
|
|
100
101
|
log: [
|
|
@@ -117,15 +118,12 @@ export const prisma = {
|
|
|
117
118
|
}),
|
|
118
119
|
});
|
|
119
120
|
replica.$on('warn', (event) => {
|
|
120
|
-
logger.warn('rds', event);
|
|
121
|
+
logger.warn('rds', rdsLogRecord(event));
|
|
121
122
|
});
|
|
122
123
|
replica.$on('error', (event) => {
|
|
123
|
-
logger.error('rds', event);
|
|
124
|
+
logger.error('rds', rdsLogRecord(event));
|
|
124
125
|
});
|
|
125
126
|
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
127
|
logger.info('startup', { lifecycleAggregates: [...registry.keys()] });
|
|
130
128
|
const withReplicas = primary.$extends(readReplicas({
|
|
131
129
|
replicas: [replica],
|
|
@@ -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,UAAU,EAAE,MAAM,cAAc,CAAA;AACzC,OAAO,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAA;AAC9C,OAAO,EAAE,sBAAsB,EAAE,kBAAkB,EAAE,sBAAsB,EAAE,MAAM,gBAAgB,CAAA;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/repository/prisma/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,7 +1,5 @@
|
|
|
1
1
|
import { getCurrentAuditContext } from '../../context/audit/index.js';
|
|
2
2
|
import { logger } from '../../logger/index.js';
|
|
3
|
-
// Auto-discover model names from a Prisma client: each model delegate (`.user`, `.eventUserLifecycle`)
|
|
4
|
-
// is an enumerable own property whose value exposes `.create`; camelCase keys → PascalCase model names.
|
|
5
3
|
export const discoverModelNames = (instance) => {
|
|
6
4
|
if (!instance || typeof instance !== 'object') {
|
|
7
5
|
return [];
|
|
@@ -18,7 +16,6 @@ export const discoverModelNames = (instance) => {
|
|
|
18
16
|
}
|
|
19
17
|
return names;
|
|
20
18
|
};
|
|
21
|
-
// Map aggregate-root → event-model for every `Foo` whose `EventFooLifecycle` also exists.
|
|
22
19
|
export const buildAggregateRegistry = (modelNames) => {
|
|
23
20
|
const set = new Set(modelNames);
|
|
24
21
|
const registry = new Map();
|
|
@@ -34,11 +31,7 @@ export const buildAggregateRegistry = (modelNames) => {
|
|
|
34
31
|
return registry;
|
|
35
32
|
};
|
|
36
33
|
const toCamelCase = (name) => name.charAt(0).toLowerCase() + name.slice(1);
|
|
37
|
-
// Prisma writes a scalar as either the bare value or a `{ set: value }` wrapper; unwrap so a soft-delete
|
|
38
|
-
// restore (`deletedAt: { set: null }`) is not mistaken for a non-null object.
|
|
39
34
|
const unwrapWriteValue = (value) => value !== null && typeof value === 'object' && 'set' in value ? value.set : value;
|
|
40
|
-
// `update` classification: `data.deletedAt` set to a non-null value (bare or `{ set: … }`) → `deleted`;
|
|
41
|
-
// `deletedAt` null / `{ set: null }` (restore) or absent → `updated`.
|
|
42
35
|
export const classifyUpdateEvent = (data) => {
|
|
43
36
|
if (data && typeof data === 'object' && 'deletedAt' in data) {
|
|
44
37
|
const value = unwrapWriteValue(data.deletedAt);
|
|
@@ -48,18 +41,11 @@ export const classifyUpdateEvent = (data) => {
|
|
|
48
41
|
}
|
|
49
42
|
return 'updated';
|
|
50
43
|
};
|
|
51
|
-
// Operations that map to a lifecycle event. `createMany` / `updateMany` / `deleteMany` are absent on
|
|
52
|
-
// purpose — Prisma returns only an affected-row count for those, so no id can be linked.
|
|
53
44
|
const EMIT_OPERATIONS = new Set(['create', 'createManyAndReturn', 'update', 'updateManyAndReturn', 'upsert', 'delete']);
|
|
54
|
-
// Prisma `$extends` extension: emit a Lifecycle event row on single-row create / update / delete / upsert
|
|
55
|
-
// of an aggregate root, in the SAME transaction as the business write. Suppressed inside
|
|
56
|
-
// `runAsSystemAction`.
|
|
57
45
|
export const lifecycleEmitExtension = (options) => {
|
|
58
46
|
const { registry, getCurrentTransactionClient, getRawPrimaryClient } = options;
|
|
59
47
|
const emitOne = async (client, model, eventType, rowId) => {
|
|
60
48
|
if (rowId === undefined || rowId === null) {
|
|
61
|
-
// A single-row write with a `select` / `omit` that drops `id` returns a row we cannot link to its
|
|
62
|
-
// aggregate. Warn (was a silent skip) so the audit gap surfaces during an incident review.
|
|
63
49
|
logger.warn('lifecycle', {
|
|
64
50
|
model,
|
|
65
51
|
eventType,
|
|
@@ -80,13 +66,10 @@ export const lifecycleEmitExtension = (options) => {
|
|
|
80
66
|
reason: ctx?.reason,
|
|
81
67
|
},
|
|
82
68
|
});
|
|
83
|
-
logger.debug('lifecycle-emitted', { model, eventType
|
|
69
|
+
logger.debug('lifecycle-emitted', { model, eventType });
|
|
84
70
|
};
|
|
85
71
|
const rowsOf = (result) => (Array.isArray(result) ? result : [result]);
|
|
86
72
|
const idOf = (row) => row?.id;
|
|
87
|
-
// Run the business op on `emitClient`'s transaction and emit its event(s) on the same client.
|
|
88
|
-
// `runBusiness` performs the write; `emitClient` / `preCheckClient` are the transaction client the
|
|
89
|
-
// event row (and, for upsert, the pre-existence probe) are written / read on.
|
|
90
73
|
const runWithEmit = async (runBusiness, emitClient, preCheckClient, model, operation,
|
|
91
74
|
// biome-ignore lint/suspicious/noExplicitAny: Prisma per-operation args are generator-typed any
|
|
92
75
|
args) => {
|
|
@@ -95,8 +78,7 @@ export const lifecycleEmitExtension = (options) => {
|
|
|
95
78
|
// transaction) so the event type is accurate. The probe is a snapshot read and the upsert is a
|
|
96
79
|
// current-read write, so a concurrent insert of the same unique key committing between them can
|
|
97
80
|
// mislabel the event (created vs updated) — accepted: a rare same-key race that affects only the audit
|
|
98
|
-
// label, never the business row
|
|
99
|
-
// cost for that edge.
|
|
81
|
+
// label, never the business row.
|
|
100
82
|
const existed = (await preCheckClient[toCamelCase(model)].findUnique({ where: args?.where, select: { id: true } })) !== null;
|
|
101
83
|
const result = await runBusiness();
|
|
102
84
|
await emitOne(emitClient, model, existed ? classifyUpdateEvent(args?.update) : 'created', idOf(result));
|
|
@@ -138,15 +120,9 @@ export const lifecycleEmitExtension = (options) => {
|
|
|
138
120
|
}
|
|
139
121
|
const ambientTx = getCurrentTransactionClient();
|
|
140
122
|
if (ambientTx) {
|
|
141
|
-
// Case A — an ambient framework transaction (`prisma.transaction`). The business op already
|
|
142
|
-
// runs on that tx; co-locate the emit on the same client so both commit or roll back together.
|
|
143
123
|
return runWithEmit(() => query(args), ambientTx, ambientTx, model, operation, args);
|
|
144
124
|
}
|
|
145
125
|
if (__internalParams?.transaction) {
|
|
146
|
-
// Case C — a native `db().$transaction(...)` opened outside the framework wrapper. A query
|
|
147
|
-
// extension cannot obtain that connection's client, and writing the event on a separate
|
|
148
|
-
// connection would survive a rollback as a phantom event. Skip + warn (fail toward no false
|
|
149
|
-
// audit); `prisma.transaction()` is the supported path for an atomic aggregate write.
|
|
150
126
|
const result = await query(args);
|
|
151
127
|
logger.warn('lifecycle', {
|
|
152
128
|
model,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lifecycle.js","sourceRoot":"","sources":["../../../src/repository/prisma/lifecycle.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,MAAM,8BAA8B,CAAA;AACrE,OAAO,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAA;
|
|
1
|
+
{"version":3,"file":"lifecycle.js","sourceRoot":"","sources":["../../../src/repository/prisma/lifecycle.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
// The one numeric identifier a Prisma log event carries, and it carries it in the message text rather than
|
|
2
|
+
// as a field: `Raw query failed. Code: `1062`` for a query the server refused, `Database error. Code:
|
|
3
|
+
// `45028`` for an engine-level fault. It is the MySQL errno in the first case and an engine code in the
|
|
4
|
+
// second, so the projection names it as the message does. A `PrismaClientKnownRequestError`'s own `P####`
|
|
5
|
+
// code is NOT in this text — that value reaches the caller on the thrown error, never the log event — and
|
|
6
|
+
// neither is the driver's `(conn:…, no:…, SQLState:…)` prefix, which Prisma replaces with its own wording.
|
|
7
|
+
export const rdsLogRecord = (event) => {
|
|
8
|
+
const code = /\bCode: `(\d+)`/.exec(event.message)?.[1];
|
|
9
|
+
return {
|
|
10
|
+
target: event.target,
|
|
11
|
+
timestamp: event.timestamp,
|
|
12
|
+
// The message is the only failure signal the event carries when the projection above does not match —
|
|
13
|
+
// a unique-constraint violation states the constraint name and no code at all — so dropping it would
|
|
14
|
+
// leave a `warn` / `error` record with nothing an operator can act on at the prd threshold. `logger`
|
|
15
|
+
// applies `Util.sanitize`, which redacts the values a driver embeds in its own message text.
|
|
16
|
+
message: event.message,
|
|
17
|
+
...(code ? { code } : {}),
|
|
18
|
+
};
|
|
19
|
+
};
|
|
20
|
+
//# sourceMappingURL=rds-log-record.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rds-log-record.js","sourceRoot":"","sources":["../../../src/repository/prisma/rds-log-record.ts"],"names":[],"mappings":"AAAA,2GAA2G;AAC3G,sGAAsG;AACtG,wGAAwG;AACxG,0GAA0G;AAC1G,0GAA0G;AAC1G,2GAA2G;AAC3G,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,KAA2D,EAAE,EAAE;IAC1F,MAAM,IAAI,GAAG,iBAAiB,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA;IACvD,OAAO;QACL,MAAM,EAAE,KAAK,CAAC,MAAM;QACpB,SAAS,EAAE,KAAK,CAAC,SAAS;QAC1B,sGAAsG;QACtG,qGAAqG;QACrG,qGAAqG;QACrG,6FAA6F;QAC7F,OAAO,EAAE,KAAK,CAAC,OAAO;QACtB,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAC1B,CAAA;AACH,CAAC,CAAA"}
|
|
@@ -13,6 +13,7 @@ const createClient = () => defaultEnv.REDIS_CLUSTER
|
|
|
13
13
|
useTLS: defaultEnv.DEPLOY_ENV !== 'dev',
|
|
14
14
|
requestTimeout: 30000,
|
|
15
15
|
});
|
|
16
|
+
const keyShape = (key) => ({ keyPrefix: key.slice(0, key.lastIndexOf(':') + 1), keyLength: key.length });
|
|
16
17
|
const getClient = async () => {
|
|
17
18
|
if (clientPromise === undefined) {
|
|
18
19
|
clientPromise = createClient().catch((e) => {
|
|
@@ -39,7 +40,7 @@ export const redis = {
|
|
|
39
40
|
await client.set(key, value, expirationSeconds ? { expiry: { type: TimeUnit.Seconds, count: expirationSeconds } } : undefined);
|
|
40
41
|
}
|
|
41
42
|
catch (e) {
|
|
42
|
-
logger.error('cache', { op: 'set', key, error: e });
|
|
43
|
+
logger.error('cache', { op: 'set', ...keyShape(key), error: e });
|
|
43
44
|
throw e;
|
|
44
45
|
}
|
|
45
46
|
},
|
|
@@ -55,7 +56,7 @@ export const redis = {
|
|
|
55
56
|
});
|
|
56
57
|
}
|
|
57
58
|
catch (e) {
|
|
58
|
-
logger.error('cache', { op: 'setNx', key, error: e });
|
|
59
|
+
logger.error('cache', { op: 'setNx', ...keyShape(key), error: e });
|
|
59
60
|
throw e;
|
|
60
61
|
}
|
|
61
62
|
},
|
|
@@ -65,7 +66,7 @@ export const redis = {
|
|
|
65
66
|
return await client.get(key).then((x) => x?.toString());
|
|
66
67
|
}
|
|
67
68
|
catch (e) {
|
|
68
|
-
logger.error('cache', { op: 'get', key, error: e });
|
|
69
|
+
logger.error('cache', { op: 'get', ...keyShape(key), error: e });
|
|
69
70
|
throw e;
|
|
70
71
|
}
|
|
71
72
|
},
|
|
@@ -75,7 +76,7 @@ export const redis = {
|
|
|
75
76
|
await client.del([key]);
|
|
76
77
|
}
|
|
77
78
|
catch (e) {
|
|
78
|
-
logger.error('cache', { op: 'remove', key, error: e });
|
|
79
|
+
logger.error('cache', { op: 'remove', ...keyShape(key), error: e });
|
|
79
80
|
throw e;
|
|
80
81
|
}
|
|
81
82
|
},
|
|
@@ -85,7 +86,7 @@ export const redis = {
|
|
|
85
86
|
return await client.getdel(key).then((x) => x?.toString());
|
|
86
87
|
}
|
|
87
88
|
catch (e) {
|
|
88
|
-
logger.error('cache', { op: 'getdel', key, error: e });
|
|
89
|
+
logger.error('cache', { op: 'getdel', ...keyShape(key), error: e });
|
|
89
90
|
throw e;
|
|
90
91
|
}
|
|
91
92
|
},
|
|
@@ -95,7 +96,7 @@ export const redis = {
|
|
|
95
96
|
return await client.incr(key);
|
|
96
97
|
}
|
|
97
98
|
catch (e) {
|
|
98
|
-
logger.error('cache', { op: 'incr', key, error: e });
|
|
99
|
+
logger.error('cache', { op: 'incr', ...keyShape(key), error: e });
|
|
99
100
|
throw e;
|
|
100
101
|
}
|
|
101
102
|
},
|
|
@@ -105,7 +106,7 @@ export const redis = {
|
|
|
105
106
|
return await client.expire(key, expirationSeconds);
|
|
106
107
|
}
|
|
107
108
|
catch (e) {
|
|
108
|
-
logger.error('cache', { op: 'expire', key, error: e });
|
|
109
|
+
logger.error('cache', { op: 'expire', ...keyShape(key), error: e });
|
|
109
110
|
throw e;
|
|
110
111
|
}
|
|
111
112
|
},
|
|
@@ -115,7 +116,7 @@ export const redis = {
|
|
|
115
116
|
return await client.decr(key);
|
|
116
117
|
}
|
|
117
118
|
catch (e) {
|
|
118
|
-
logger.error('cache', { op: 'decr', key, error: e });
|
|
119
|
+
logger.error('cache', { op: 'decr', ...keyShape(key), error: e });
|
|
119
120
|
throw e;
|
|
120
121
|
}
|
|
121
122
|
},
|
|
@@ -125,7 +126,7 @@ export const redis = {
|
|
|
125
126
|
return await client.invokeScript(script, opts);
|
|
126
127
|
}
|
|
127
128
|
catch (e) {
|
|
128
|
-
logger.error('cache', { op: 'invokeScript',
|
|
129
|
+
logger.error('cache', { op: 'invokeScript', ...keyShape(opts.keys[0]), error: e });
|
|
129
130
|
throw e;
|
|
130
131
|
}
|
|
131
132
|
},
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/repository/redis/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,kBAAkB,EAAe,QAAQ,EAAE,MAAM,sBAAsB,CAAA;AAE7F,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAA;AACzC,OAAO,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAA;AAE9C,IAAI,aAA4E,CAAA;AAEhF,MAAM,YAAY,GAAG,GAAG,EAAE,CACxB,UAAU,CAAC,aAAa;IACtB,CAAC,CAAC,kBAAkB,CAAC,YAAY,CAAC;QAC9B,SAAS,EAAE,CAAC,EAAE,IAAI,EAAE,UAAU,CAAC,UAAU,EAAE,IAAI,EAAE,UAAU,CAAC,UAAU,EAAE,CAAC;QACzE,MAAM,EAAE,IAAI;QACZ,cAAc,EAAE,KAAK;KACtB,CAAC;IACJ,CAAC,CAAC,WAAW,CAAC,YAAY,CAAC;QACvB,SAAS,EAAE,CAAC,EAAE,IAAI,EAAE,UAAU,CAAC,UAAU,EAAE,IAAI,EAAE,UAAU,CAAC,UAAU,EAAE,CAAC;QACzE,MAAM,EAAE,UAAU,CAAC,UAAU,KAAK,KAAK;QACvC,cAAc,EAAE,KAAK;KACtB,CAAC,CAAA;AAER,MAAM,SAAS,GAAG,KAAK,IAAI,EAAE;IAC3B,IAAI,aAAa,KAAK,SAAS,EAAE,CAAC;QAChC,aAAa,GAAG,YAAY,EAAE,CAAC,KAAK,CAAC,CAAC,CAAU,EAAE,EAAE;YAClD,aAAa,GAAG,SAAS,CAAA;YACzB,MAAM,CAAC,CAAA;QACT,CAAC,CAAC,CAAA;IACJ,CAAC;IACD,OAAO,aAAa,CAAA;AACtB,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,KAAK,GAAG;IACnB,MAAM,EAAE,KAAK,IAAI,EAAE;QACjB,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,SAAS,EAAE,CAAA;YAChC,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,IAAI,EAAE,CAAA;YAC/B,OAAO,GAAG,KAAK,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAA;QACrC,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,IAAI,CAAA;QACb,CAAC;IACH,CAAC;IACD,GAAG,EAAE,KAAK,EAAE,GAAW,EAAE,KAAa,EAAE,iBAA0B,EAAE,EAAE;QACpE,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,SAAS,EAAE,CAAA;YAChC,MAAM,MAAM,CAAC,GAAG,CACd,GAAG,EACH,KAAK,EACL,iBAAiB,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,CAAC,OAAO,EAAE,KAAK,EAAE,iBAAiB,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CACjG,CAAA;QACH,CAAC;QAAC,OAAO,CAAU,EAAE,CAAC;YACpB,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAA;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/repository/redis/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,11 +2,18 @@ import { CreateBucketCommand, DeleteObjectCommand, GetBucketLifecycleConfigurati
|
|
|
2
2
|
import { defaultEnv } from '../../env.js';
|
|
3
3
|
import { logger } from '../../logger/index.js';
|
|
4
4
|
let clientInstance;
|
|
5
|
+
// The key's SHAPE, never the key. This wrapper is generic: a caller decides what goes in a key, and an
|
|
6
|
+
// object key can embed the subject's original filename — a direct identifier — which `Util.sanitize`
|
|
7
|
+
// cannot catch because it redacts by key NAME, not by value. These failures log at `warn` / `error`,
|
|
8
|
+
// which clear the prd threshold with no `LOG_LEVEL` override, so the exposure needs no special
|
|
9
|
+
// condition. The prefix still names the subsystem an incident is grepped by (`_uploads/`,
|
|
10
|
+
// `governance/…`), and the length distinguishes repeated failures on different objects.
|
|
11
|
+
const keyShape = (key) => ({ keyPrefix: key.slice(0, key.lastIndexOf('/') + 1), keyLength: key.length });
|
|
5
12
|
const client = () => {
|
|
6
13
|
if (clientInstance === undefined) {
|
|
7
14
|
clientInstance =
|
|
8
15
|
defaultEnv.LOCAL_S3_ENDPOINT === undefined
|
|
9
|
-
? new S3Client()
|
|
16
|
+
? new S3Client({ region: defaultEnv.AWS_REGION })
|
|
10
17
|
: new S3Client({
|
|
11
18
|
region: defaultEnv.AWS_REGION,
|
|
12
19
|
endpoint: defaultEnv.LOCAL_S3_ENDPOINT,
|
|
@@ -18,9 +25,6 @@ const client = () => {
|
|
|
18
25
|
};
|
|
19
26
|
export const s3 = {
|
|
20
27
|
client,
|
|
21
|
-
// Read an object (optionally a specific version). Returns undefined when the key/version does not exist so
|
|
22
|
-
// the caller decides whether "absent" is an error. Body is materialised to a Buffer; a string consumer
|
|
23
|
-
// calls `.toString()`.
|
|
24
28
|
getObject: async (params) => {
|
|
25
29
|
try {
|
|
26
30
|
const result = await client().send(new GetObjectCommand({ Bucket: params.bucket, Key: params.key, VersionId: params.versionId }));
|
|
@@ -37,7 +41,7 @@ export const s3 = {
|
|
|
37
41
|
if (e instanceof Error && (e.name === 'NoSuchKey' || e.name === 'NotFound')) {
|
|
38
42
|
return undefined;
|
|
39
43
|
}
|
|
40
|
-
logger.error('storage', { op: 'getObject', bucket: params.bucket,
|
|
44
|
+
logger.error('storage', { op: 'getObject', bucket: params.bucket, ...keyShape(params.key), error: e });
|
|
41
45
|
throw e;
|
|
42
46
|
}
|
|
43
47
|
},
|
|
@@ -52,7 +56,7 @@ export const s3 = {
|
|
|
52
56
|
}));
|
|
53
57
|
}
|
|
54
58
|
catch (e) {
|
|
55
|
-
logger.error('storage', { op: 'putObject', bucket: params.bucket,
|
|
59
|
+
logger.error('storage', { op: 'putObject', bucket: params.bucket, ...keyShape(params.key), error: e });
|
|
56
60
|
throw e;
|
|
57
61
|
}
|
|
58
62
|
},
|
|
@@ -61,12 +65,10 @@ export const s3 = {
|
|
|
61
65
|
await client().send(new DeleteObjectCommand({ Bucket: params.bucket, Key: params.key, VersionId: params.versionId }));
|
|
62
66
|
}
|
|
63
67
|
catch (e) {
|
|
64
|
-
logger.error('storage', { op: 'deleteObject', bucket: params.bucket,
|
|
68
|
+
logger.error('storage', { op: 'deleteObject', bucket: params.bucket, ...keyShape(params.key), error: e });
|
|
65
69
|
throw e;
|
|
66
70
|
}
|
|
67
71
|
},
|
|
68
|
-
// Idempotent bucket create — an already-owned/existing bucket is a no-op. `objectLock` turns on versioning +
|
|
69
|
-
// Object Lock at creation (required before any WORM write).
|
|
70
72
|
createBucket: async (params) => {
|
|
71
73
|
try {
|
|
72
74
|
await client().send(new CreateBucketCommand({ Bucket: params.bucket, ObjectLockEnabledForBucket: params.objectLock }));
|
|
@@ -79,8 +81,6 @@ export const s3 = {
|
|
|
79
81
|
throw e;
|
|
80
82
|
}
|
|
81
83
|
},
|
|
82
|
-
// Upsert a single prefix-scoped expiration rule, preserving every other rule already on the bucket
|
|
83
|
-
// (GET-merge-PUT keyed by ruleId).
|
|
84
84
|
ensureBucketLifecycleRule: async (params) => {
|
|
85
85
|
try {
|
|
86
86
|
const existing = await client()
|
|
@@ -108,8 +108,6 @@ export const s3 = {
|
|
|
108
108
|
throw e;
|
|
109
109
|
}
|
|
110
110
|
},
|
|
111
|
-
// Seal an object under Object Lock retention. Returns the S3 version-id the caller records in its
|
|
112
|
-
// own index. Throws when the bucket returns no VersionId (versioning / Object Lock not enabled).
|
|
113
111
|
putObjectWorm: async (params) => {
|
|
114
112
|
try {
|
|
115
113
|
const result = await client().send(new PutObjectCommand({
|
|
@@ -121,16 +119,15 @@ export const s3 = {
|
|
|
121
119
|
ObjectLockRetainUntilDate: params.retainUntil,
|
|
122
120
|
}));
|
|
123
121
|
if (!result.VersionId) {
|
|
124
|
-
throw new Error(`putObjectWorm: no VersionId for ${params.bucket}
|
|
122
|
+
throw new Error(`putObjectWorm: no VersionId for ${params.bucket} (bucket needs versioning + Object Lock)`);
|
|
125
123
|
}
|
|
126
124
|
return { versionId: result.VersionId };
|
|
127
125
|
}
|
|
128
126
|
catch (e) {
|
|
129
|
-
logger.error('storage', { op: 'putObjectWorm', bucket: params.bucket,
|
|
127
|
+
logger.error('storage', { op: 'putObjectWorm', bucket: params.bucket, ...keyShape(params.key), error: e });
|
|
130
128
|
throw e;
|
|
131
129
|
}
|
|
132
130
|
},
|
|
133
|
-
// Enumerate every version of a single key (evidence audit + orphan detection). Paginates fully.
|
|
134
131
|
listObjectVersions: async (params) => {
|
|
135
132
|
try {
|
|
136
133
|
const versions = [];
|
|
@@ -159,16 +156,10 @@ export const s3 = {
|
|
|
159
156
|
return versions;
|
|
160
157
|
}
|
|
161
158
|
catch (e) {
|
|
162
|
-
logger.error('storage', { op: 'listObjectVersions', bucket: params.bucket,
|
|
159
|
+
logger.error('storage', { op: 'listObjectVersions', bucket: params.bucket, ...keyShape(params.key), error: e });
|
|
163
160
|
throw e;
|
|
164
161
|
}
|
|
165
162
|
},
|
|
166
|
-
// Delete versions of a key no longer referenced (`keepVersionIds` = the version-ids still indexed).
|
|
167
|
-
// A version still under retention cannot be deleted: it is returned in `skippedVersionIds` rather than
|
|
168
|
-
// failing the whole sweep. The retention denial surfaces as `AccessDenied` on AWS S3 and as
|
|
169
|
-
// `InvalidRequest` on MinIO (local/dev) — both are treated as "retained, skip". GOVERNANCE-mode
|
|
170
|
-
// versions under retention are deletable only with `governanceBypass` (requires
|
|
171
|
-
// `s3:BypassGovernanceRetention`). Any other error propagates.
|
|
172
163
|
deleteOrphanVersions: async (params) => {
|
|
173
164
|
try {
|
|
174
165
|
const keep = new Set(params.keepVersionIds);
|
|
@@ -189,14 +180,11 @@ export const s3 = {
|
|
|
189
180
|
}
|
|
190
181
|
catch (error) {
|
|
191
182
|
if (error instanceof Error && (error.name === 'AccessDenied' || error.name === 'InvalidRequest')) {
|
|
192
|
-
// AccessDenied (AWS) is the retention-still-active denial, but it is indistinguishable from an
|
|
193
|
-
// IAM misconfiguration — warn so an operator can spot a genuine permission gap instead of it
|
|
194
|
-
// silently reading as a normal under-retention skip. InvalidRequest (MinIO/dev) is unambiguous.
|
|
195
183
|
if (error.name === 'AccessDenied') {
|
|
196
184
|
logger.warn('storage', {
|
|
197
185
|
op: 'deleteOrphanVersions',
|
|
198
186
|
bucket: params.bucket,
|
|
199
|
-
|
|
187
|
+
...keyShape(params.key),
|
|
200
188
|
versionId: version.versionId,
|
|
201
189
|
error,
|
|
202
190
|
});
|
|
@@ -211,7 +199,7 @@ export const s3 = {
|
|
|
211
199
|
return { deletedVersionIds, skippedVersionIds };
|
|
212
200
|
}
|
|
213
201
|
catch (e) {
|
|
214
|
-
logger.error('storage', { op: 'deleteOrphanVersions', bucket: params.bucket,
|
|
202
|
+
logger.error('storage', { op: 'deleteOrphanVersions', bucket: params.bucket, ...keyShape(params.key), error: e });
|
|
215
203
|
throw e;
|
|
216
204
|
}
|
|
217
205
|
},
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/repository/s3/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,mBAAmB,EACnB,mBAAmB,EACnB,sCAAsC,EACtC,gBAAgB,EAChB,yBAAyB,EACzB,sCAAsC,EACtC,gBAAgB,EAChB,QAAQ,GACT,MAAM,oBAAoB,CAAA;AAE3B,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAA;AACzC,OAAO,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAA;AAE9C,IAAI,cAAoC,CAAA;AACxC,MAAM,MAAM,GAAG,GAAG,EAAE;IAClB,IAAI,cAAc,KAAK,SAAS,EAAE,CAAC;QACjC,cAAc;YACZ,UAAU,CAAC,iBAAiB,KAAK,SAAS;gBACxC,CAAC,CAAC,IAAI,QAAQ,EAAE;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/repository/s3/index.ts"],"names":[],"mappings":"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"}
|