@nodii/telemetry 0.4.0 → 0.5.0
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/agent-invocable.d.ts +1 -1
- package/dist/agent-invocable.d.ts.map +1 -1
- package/dist/agent-invocable.js +1 -1
- package/dist/agent-invocable.js.map +1 -1
- package/dist/audit.d.ts +30 -1
- package/dist/audit.d.ts.map +1 -1
- package/dist/audit.js +64 -11
- package/dist/audit.js.map +1 -1
- package/dist/configure.d.ts +27 -8
- package/dist/configure.d.ts.map +1 -1
- package/dist/configure.js +12 -7
- package/dist/configure.js.map +1 -1
- package/dist/context.d.ts +1 -1
- package/dist/context.d.ts.map +1 -1
- package/dist/drizzle/audit-schema.d.ts +82 -11
- package/dist/drizzle/audit-schema.d.ts.map +1 -1
- package/dist/drizzle/audit-schema.js +62 -4
- package/dist/drizzle/audit-schema.js.map +1 -1
- package/dist/drizzle/index.d.ts +2 -2
- package/dist/drizzle/index.d.ts.map +1 -1
- package/dist/drizzle/index.js +1 -1
- package/dist/drizzle/index.js.map +1 -1
- package/dist/index.d.ts +22 -21
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +16 -15
- package/dist/index.js.map +1 -1
- package/dist/init.d.ts +1 -1
- package/dist/init.d.ts.map +1 -1
- package/dist/init.js +19 -2
- package/dist/init.js.map +1 -1
- package/dist/intent.js +4 -4
- package/dist/intent.js.map +1 -1
- package/dist/logger.d.ts +1 -1
- package/dist/logger.d.ts.map +1 -1
- package/dist/logger.js +5 -5
- package/dist/logger.js.map +1 -1
- package/dist/metrics.d.ts +56 -2
- package/dist/metrics.d.ts.map +1 -1
- package/dist/metrics.js +86 -6
- package/dist/metrics.js.map +1 -1
- package/dist/otlp-adapter.d.ts +2 -2
- package/dist/otlp-adapter.d.ts.map +1 -1
- package/dist/otlp-adapter.js +25 -4
- package/dist/otlp-adapter.js.map +1 -1
- package/dist/outbox-emit.js +2 -2
- package/dist/outbox-emit.js.map +1 -1
- package/dist/traceparent.d.ts +60 -0
- package/dist/traceparent.d.ts.map +1 -0
- package/dist/traceparent.js +88 -0
- package/dist/traceparent.js.map +1 -0
- package/dist/tracer.d.ts +20 -4
- package/dist/tracer.d.ts.map +1 -1
- package/dist/tracer.js +38 -9
- package/dist/tracer.js.map +1 -1
- package/dist/types.d.ts +47 -3
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +66 -0
- package/dist/types.js.map +1 -1
- package/package.json +9 -3
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent-invocable.d.ts","sourceRoot":"","sources":["../src/agent-invocable.ts"],"names":[],"mappings":"AASA,OAAO,EAEL,KAAK,oBAAoB,EAC1B,MAAM,
|
|
1
|
+
{"version":3,"file":"agent-invocable.d.ts","sourceRoot":"","sources":["../src/agent-invocable.ts"],"names":[],"mappings":"AASA,OAAO,EAEL,KAAK,oBAAoB,EAC1B,MAAM,YAAY,CAAC;AAEpB,eAAO,MAAM,wBAAwB,eAEpC,CAAC;AAoBF;;;;;;;;;;;;;GAaG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,oBAAoB,IAGpD,QAAQ,MAAM,EACd,aAAa,MAAM,GAAG,MAAM,EAC5B,YAAY,kBAAkB,KAC7B,kBAAkB,CAuBtB;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,CAAC,SAAS,MAAM,EAChD,IAAI,EAAE,CAAC,GACN,MAAM,CAAC,MAAM,GAAG,MAAM,EAAE,oBAAoB,CAAC,CAM/C"}
|
package/dist/agent-invocable.js
CHANGED
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
// under a well-known symbol so the codegen step (a separate tsc AST
|
|
7
7
|
// walk in TS-8 wave 2) can also discover registrations via runtime
|
|
8
8
|
// import if it falls back from the AST path.
|
|
9
|
-
import { AGENT_INVOCABLE_SIDE_EFFECTS, } from "./types";
|
|
9
|
+
import { AGENT_INVOCABLE_SIDE_EFFECTS, } from "./types.js";
|
|
10
10
|
export const AGENT_INVOCABLE_METADATA = Symbol.for("@nodii/telemetry/agentInvocable");
|
|
11
11
|
function validate(cfg) {
|
|
12
12
|
if (cfg.mode === "strict-only" && !cfg.allowedPipelines?.length) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent-invocable.js","sourceRoot":"","sources":["../src/agent-invocable.ts"],"names":[],"mappings":"AAAA,sEAAsE;AACtE,4DAA4D;AAC5D,8DAA8D;AAC9D,EAAE;AACF,oEAAoE;AACpE,oEAAoE;AACpE,mEAAmE;AACnE,6CAA6C;AAE7C,OAAO,EACL,4BAA4B,GAE7B,MAAM,
|
|
1
|
+
{"version":3,"file":"agent-invocable.js","sourceRoot":"","sources":["../src/agent-invocable.ts"],"names":[],"mappings":"AAAA,sEAAsE;AACtE,4DAA4D;AAC5D,8DAA8D;AAC9D,EAAE;AACF,oEAAoE;AACpE,oEAAoE;AACpE,mEAAmE;AACnE,6CAA6C;AAE7C,OAAO,EACL,4BAA4B,GAE7B,MAAM,YAAY,CAAC;AAEpB,MAAM,CAAC,MAAM,wBAAwB,GAAG,MAAM,CAAC,GAAG,CAChD,iCAAiC,CAClC,CAAC;AAEF,SAAS,QAAQ,CAAC,GAAyB;IACzC,IAAI,GAAG,CAAC,IAAI,KAAK,aAAa,IAAI,CAAC,GAAG,CAAC,gBAAgB,EAAE,MAAM,EAAE,CAAC;QAChE,MAAM,IAAI,KAAK,CACb,6EAA6E,CAC9E,CAAC;IACJ,CAAC;IACD,KAAK,MAAM,GAAG,IAAI,GAAG,CAAC,WAAW,EAAE,CAAC;QAClC,IAAI,CAAC,4BAA4B,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;YAChD,MAAM,IAAI,KAAK,CACb,gCAAgC,GAAG,2CAA2C,CAC/E,CAAC;QACJ,CAAC;IACH,CAAC;IACD,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC;QACrB,MAAM,IAAI,KAAK,CAAC,4CAA4C,CAAC,CAAC;IAChE,CAAC;AACH,CAAC;AAED;;;;;;;;;;;;;GAaG;AACH,MAAM,UAAU,cAAc,CAAC,GAAyB;IACtD,QAAQ,CAAC,GAAG,CAAC,CAAC;IACd,OAAO,SAAS,QAAQ,CACtB,MAAc,EACd,WAA4B,EAC5B,UAA8B;QAE9B,MAAM,QAAQ,GAAG,UAAU,CAAC,KAAK,CAAC;QAClC,IAAI,OAAO,QAAQ,KAAK,UAAU,EAAE,CAAC;YACnC,MAAM,IAAI,KAAK,CACb,+FAA+F,CAChG,CAAC;QACJ,CAAC;QACD,iDAAiD;QAChD,QAA+C,CAAC,wBAAwB,CAAC;YACxE,GAAG,CAAC;QACN,4DAA4D;QAC5D,MAAM,IAAI,GAAI,MAAkC,CAAC,WAGhD,CAAC;QACF,MAAM,QAAQ,GACX,IAAI,CAAC,wBAAwB,CAEhB,IAAI,EAAE,CAAC;QACvB,QAAQ,CAAC,WAAW,CAAC,GAAG,GAAG,CAAC;QAC5B,IAAI,CAAC,wBAAwB,CAAC,GAAG,QAAQ,CAAC;QAC1C,OAAO,UAAU,CAAC;IACpB,CAAC,CAAC;AACJ,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,iBAAiB,CAC/B,IAAO;IAEP,OAAO,CACH,IAA2C,CAC3C,wBAAwB,CACyB,IAAI,EAAE,CAC1D,CAAC;AACJ,CAAC"}
|
package/dist/audit.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { AUDIT_ACTOR_KINDS, AUDIT_OUTCOMES, type ActorKind, type AuditOutcome } from "./audit-types";
|
|
1
|
+
import { AUDIT_ACTOR_KINDS, AUDIT_OUTCOMES, type ActorKind, type AuditOutcome } from "./audit-types.js";
|
|
2
2
|
export { AUDIT_ACTOR_KINDS, AUDIT_OUTCOMES };
|
|
3
3
|
export type { ActorKind, AuditOutcome };
|
|
4
4
|
/**
|
|
@@ -187,6 +187,35 @@ export interface AuditChainAdapter {
|
|
|
187
187
|
export declare class TelemetryAuditWriterMissing extends Error {
|
|
188
188
|
constructor();
|
|
189
189
|
}
|
|
190
|
+
/**
|
|
191
|
+
* Provider for a DEFAULT `AuditWriter`, populated by `@nodii/audit-chain`
|
|
192
|
+
* (the optional peer) when it initializes. This is the f08a4471 /
|
|
193
|
+
* e6b303f1 "default audit.emit delegates to @nodii/audit-chain" path:
|
|
194
|
+
* when a service has `@nodii/audit-chain` installed + initialized, that
|
|
195
|
+
* lib registers a provider here, and telemetry's `audit.emit` routes to
|
|
196
|
+
* it WITHOUT the consumer calling `initTelemetry({auditWriter})` or
|
|
197
|
+
* `configureTelemetry({audit:{writer}})`.
|
|
198
|
+
*
|
|
199
|
+
* The provider is lazy (a factory) so audit-chain only constructs the
|
|
200
|
+
* writer once, on first use, after its own `initAuditChain(...)` has
|
|
201
|
+
* resolved its store + signing config. Returns `null` until audit-chain
|
|
202
|
+
* registers it — in which case `audit.emit` fails fast
|
|
203
|
+
* (`TelemetryAuditWriterMissing`) rather than silently no-op'ing (R1).
|
|
204
|
+
*/
|
|
205
|
+
export type DefaultAuditWriterProvider = () => AuditWriter;
|
|
206
|
+
/**
|
|
207
|
+
* SDK-internal: `@nodii/audit-chain` calls this from `initAuditChain(...)`
|
|
208
|
+
* (via its `installTelemetryAuditDefault()` bridge) to register itself as
|
|
209
|
+
* telemetry's DEFAULT audit writer. After this, `audit.emit` routes to
|
|
210
|
+
* audit-chain automatically with no consumer wiring. An explicit writer
|
|
211
|
+
* (`_setAuditWriter`) still takes precedence. Passing `null` removes the
|
|
212
|
+
* default (used by `initAuditChain`'s test reset).
|
|
213
|
+
*/
|
|
214
|
+
export declare function _setDefaultAuditWriterProvider(provider: DefaultAuditWriterProvider | null): void;
|
|
215
|
+
/** SDK-internal: is a default writer (or explicit writer) available? */
|
|
216
|
+
export declare function _hasAnyAuditWriter(): boolean;
|
|
217
|
+
/** Test-only reset of the default-writer provider + its memoised writer. */
|
|
218
|
+
export declare function _resetDefaultAuditWriterForTests(): void;
|
|
190
219
|
/**
|
|
191
220
|
* SDK-internal: services or the `@nodii/db-rls` adapter sets the writer.
|
|
192
221
|
* Public callers MUST NOT call this; the override exists for the adapter
|
package/dist/audit.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"audit.d.ts","sourceRoot":"","sources":["../src/audit.ts"],"names":[],"mappings":"AAiBA,OAAO,EACL,iBAAiB,EACjB,cAAc,EACd,KAAK,SAAS,EACd,KAAK,YAAY,EAClB,MAAM,
|
|
1
|
+
{"version":3,"file":"audit.d.ts","sourceRoot":"","sources":["../src/audit.ts"],"names":[],"mappings":"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"}
|
package/dist/audit.js
CHANGED
|
@@ -14,10 +14,10 @@
|
|
|
14
14
|
// - Pattern A — explicit tx pass: `audit.emit(tx, args)`
|
|
15
15
|
// - Pattern B — Hono `c.set("txn", tx)` middleware: also `audit.emit(tx, args)`
|
|
16
16
|
// - Pattern C — out-of-band: `audit.emit(args)` (writer owns its tx)
|
|
17
|
-
import { AUDIT_ACTOR_KINDS, AUDIT_OUTCOMES, } from "./audit-types";
|
|
18
|
-
import { getContext } from "./context";
|
|
19
|
-
import { requireTelemetry } from "./init";
|
|
20
|
-
import { uuidv7 } from "./uuid";
|
|
17
|
+
import { AUDIT_ACTOR_KINDS, AUDIT_OUTCOMES, } from "./audit-types.js";
|
|
18
|
+
import { getContext } from "./context.js";
|
|
19
|
+
import { requireTelemetry } from "./init.js";
|
|
20
|
+
import { uuidv7 } from "./uuid.js";
|
|
21
21
|
export { AUDIT_ACTOR_KINDS, AUDIT_OUTCOMES };
|
|
22
22
|
/**
|
|
23
23
|
* Thrown by `audit.emit` when no `AuditWriter` has been wired. v0.1.2
|
|
@@ -28,10 +28,14 @@ export { AUDIT_ACTOR_KINDS, AUDIT_OUTCOMES };
|
|
|
28
28
|
export class TelemetryAuditWriterMissing extends Error {
|
|
29
29
|
constructor() {
|
|
30
30
|
super("@nodii/telemetry: audit.emit called before an AuditWriter was wired. " +
|
|
31
|
-
"Drift 4cc80f62 (R1
|
|
32
|
-
"because it silently dropped audit rows
|
|
33
|
-
"
|
|
34
|
-
"
|
|
31
|
+
"Drift 4cc80f62 + request e6b303f1 (R1) removed the v0.1.0–v0.1.1 " +
|
|
32
|
+
"Noop default because it silently dropped audit rows in production. " +
|
|
33
|
+
"Either (a) install + initialize `@nodii/audit-chain` — its " +
|
|
34
|
+
"initAuditChain(...) auto-registers as telemetry's default audit " +
|
|
35
|
+
"writer (no further wiring needed), or (b) wire a service writer via " +
|
|
36
|
+
"`configureTelemetry({audit:{writer}})` / `_setAuditWriter(...)` " +
|
|
37
|
+
"(typically from `@nodii/db-rls`'s adapter writing to " +
|
|
38
|
+
"<serviceName>_audit_event per 02-audit-doctrine.md § 5.1 + § 6.0).");
|
|
35
39
|
this.name = "TelemetryAuditWriterMissing";
|
|
36
40
|
}
|
|
37
41
|
}
|
|
@@ -46,10 +50,56 @@ const NODII_TELEMETRY_AUDIT_KEY = Symbol.for("@nodii/telemetry::audit-state");
|
|
|
46
50
|
function getAuditState() {
|
|
47
51
|
const g = globalThis;
|
|
48
52
|
if (!g[NODII_TELEMETRY_AUDIT_KEY]) {
|
|
49
|
-
g[NODII_TELEMETRY_AUDIT_KEY] = {
|
|
53
|
+
g[NODII_TELEMETRY_AUDIT_KEY] = {
|
|
54
|
+
writer: null,
|
|
55
|
+
chain: null,
|
|
56
|
+
defaultWriterProvider: null,
|
|
57
|
+
resolvedDefaultWriter: null,
|
|
58
|
+
};
|
|
50
59
|
}
|
|
51
60
|
return g[NODII_TELEMETRY_AUDIT_KEY];
|
|
52
61
|
}
|
|
62
|
+
/**
|
|
63
|
+
* SDK-internal: `@nodii/audit-chain` calls this from `initAuditChain(...)`
|
|
64
|
+
* (via its `installTelemetryAuditDefault()` bridge) to register itself as
|
|
65
|
+
* telemetry's DEFAULT audit writer. After this, `audit.emit` routes to
|
|
66
|
+
* audit-chain automatically with no consumer wiring. An explicit writer
|
|
67
|
+
* (`_setAuditWriter`) still takes precedence. Passing `null` removes the
|
|
68
|
+
* default (used by `initAuditChain`'s test reset).
|
|
69
|
+
*/
|
|
70
|
+
export function _setDefaultAuditWriterProvider(provider) {
|
|
71
|
+
const state = getAuditState();
|
|
72
|
+
state.defaultWriterProvider = provider;
|
|
73
|
+
state.resolvedDefaultWriter = null;
|
|
74
|
+
}
|
|
75
|
+
/** SDK-internal: is a default writer (or explicit writer) available? */
|
|
76
|
+
export function _hasAnyAuditWriter() {
|
|
77
|
+
const state = getAuditState();
|
|
78
|
+
return state.writer !== null || state.defaultWriterProvider !== null;
|
|
79
|
+
}
|
|
80
|
+
/** Test-only reset of the default-writer provider + its memoised writer. */
|
|
81
|
+
export function _resetDefaultAuditWriterForTests() {
|
|
82
|
+
const state = getAuditState();
|
|
83
|
+
state.defaultWriterProvider = null;
|
|
84
|
+
state.resolvedDefaultWriter = null;
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Resolve the effective writer: an explicit one wins; otherwise the
|
|
88
|
+
* audit-chain default (lazily constructed + memoised). Returns `null`
|
|
89
|
+
* when neither is available — `emitImpl` then throws (R1 fail-fast).
|
|
90
|
+
*/
|
|
91
|
+
function resolveWriter() {
|
|
92
|
+
const state = getAuditState();
|
|
93
|
+
if (state.writer !== null)
|
|
94
|
+
return state.writer;
|
|
95
|
+
if (state.resolvedDefaultWriter !== null)
|
|
96
|
+
return state.resolvedDefaultWriter;
|
|
97
|
+
if (state.defaultWriterProvider !== null) {
|
|
98
|
+
state.resolvedDefaultWriter = state.defaultWriterProvider();
|
|
99
|
+
return state.resolvedDefaultWriter;
|
|
100
|
+
}
|
|
101
|
+
return null;
|
|
102
|
+
}
|
|
53
103
|
/**
|
|
54
104
|
* SDK-internal: services or the `@nodii/db-rls` adapter sets the writer.
|
|
55
105
|
* Public callers MUST NOT call this; the override exists for the adapter
|
|
@@ -249,7 +299,10 @@ function resolveRow(args) {
|
|
|
249
299
|
async function emitImpl(args, tx) {
|
|
250
300
|
requireTelemetry();
|
|
251
301
|
const state = getAuditState();
|
|
252
|
-
|
|
302
|
+
const writer = resolveWriter();
|
|
303
|
+
if (writer === null) {
|
|
304
|
+
// R1 fail-fast: NO silent noop. Either an explicit writer or the
|
|
305
|
+
// `@nodii/audit-chain` default must be wired before the first emit.
|
|
253
306
|
throw new TelemetryAuditWriterMissing();
|
|
254
307
|
}
|
|
255
308
|
const row = resolveRow(args);
|
|
@@ -259,7 +312,7 @@ async function emitImpl(args, tx) {
|
|
|
259
312
|
row.row_hash = augmented.row_hash;
|
|
260
313
|
row.tenant_audit_seq = augmented.tenant_audit_seq;
|
|
261
314
|
}
|
|
262
|
-
await
|
|
315
|
+
await writer(row, tx);
|
|
263
316
|
}
|
|
264
317
|
async function emit(a, b) {
|
|
265
318
|
if (b !== undefined) {
|
package/dist/audit.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"audit.js","sourceRoot":"","sources":["../src/audit.ts"],"names":[],"mappings":"AAAA,wEAAwE;AACxE,2EAA2E;AAC3E,EAAE;AACF,wEAAwE;AACxE,2CAA2C;AAC3C,EAAE;AACF,qEAAqE;AACrE,qEAAqE;AACrE,sEAAsE;AACtE,wEAAwE;AACxE,uDAAuD;AACvD,EAAE;AACF,qCAAqC;AACrC,2DAA2D;AAC3D,kFAAkF;AAClF,uEAAuE;AAEvE,OAAO,EACL,iBAAiB,EACjB,cAAc,GAGf,MAAM,
|
|
1
|
+
{"version":3,"file":"audit.js","sourceRoot":"","sources":["../src/audit.ts"],"names":[],"mappings":"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"}
|
package/dist/configure.d.ts
CHANGED
|
@@ -1,11 +1,30 @@
|
|
|
1
|
-
import { type AuditChainAdapter } from "./audit";
|
|
1
|
+
import { type AuditChainAdapter, type AuditWriter } from "./audit.js";
|
|
2
2
|
/**
|
|
3
|
-
* Arguments to `configureTelemetry`.
|
|
4
|
-
*
|
|
5
|
-
*
|
|
3
|
+
* Arguments to `configureTelemetry`. Supports `audit.writer` (the
|
|
4
|
+
* service's rich-row Postgres write path) + `audit.chain` (the optional
|
|
5
|
+
* tamper-evident chain layer). The shape leaves room for additional
|
|
6
|
+
* knobs (log redaction overrides, custom exporters) without an API break.
|
|
7
|
+
*
|
|
8
|
+
* Wiring example per D199:
|
|
9
|
+
*
|
|
10
|
+
* configureTelemetry({
|
|
11
|
+
* audit: {
|
|
12
|
+
* writer: postgresAuditWriter(db, "auth"),
|
|
13
|
+
* chain: createDoctrineChainAdapter({ storage }),
|
|
14
|
+
* },
|
|
15
|
+
* });
|
|
6
16
|
*/
|
|
7
17
|
export interface ConfigureTelemetryOptions {
|
|
8
18
|
audit?: {
|
|
19
|
+
/**
|
|
20
|
+
* The service rich-row write path per `02-audit-doctrine.md § 5.1`.
|
|
21
|
+
* Wiring it here is equivalent to `_setAuditWriter(...)` (the
|
|
22
|
+
* SDK-internal hook). When NEITHER a writer NOR `@nodii/audit-chain`
|
|
23
|
+
* (the optional-peer default) is wired, `audit.emit` THROWS
|
|
24
|
+
* `TelemetryAuditWriterMissing` — there is no silent Noop default
|
|
25
|
+
* (R1, request e6b303f1).
|
|
26
|
+
*/
|
|
27
|
+
writer?: AuditWriter;
|
|
9
28
|
/**
|
|
10
29
|
* Opt-in tamper-evident chain layer per `02-audit-doctrine.md § 13` +
|
|
11
30
|
* § 15.3. When wired, every `audit.emit` row receives `prev_hash`,
|
|
@@ -25,10 +44,10 @@ export interface ConfigureTelemetryOptions {
|
|
|
25
44
|
};
|
|
26
45
|
}
|
|
27
46
|
/**
|
|
28
|
-
* Wire optional telemetry adapters.
|
|
29
|
-
*
|
|
30
|
-
*
|
|
31
|
-
*
|
|
47
|
+
* Wire optional telemetry adapters (`audit.writer` + `audit.chain`).
|
|
48
|
+
* Idempotent: calling repeatedly with a knob set replaces the previously
|
|
49
|
+
* wired value; calling with `audit` undefined leaves the existing wiring
|
|
50
|
+
* intact.
|
|
32
51
|
*/
|
|
33
52
|
export declare function configureTelemetry(opts: ConfigureTelemetryOptions): void;
|
|
34
53
|
//# sourceMappingURL=configure.d.ts.map
|
package/dist/configure.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"configure.d.ts","sourceRoot":"","sources":["../src/configure.ts"],"names":[],"mappings":"AAWA,OAAO,
|
|
1
|
+
{"version":3,"file":"configure.d.ts","sourceRoot":"","sources":["../src/configure.ts"],"names":[],"mappings":"AAWA,OAAO,EAGL,KAAK,iBAAiB,EACtB,KAAK,WAAW,EACjB,MAAM,YAAY,CAAC;AAEpB;;;;;;;;;;;;;;GAcG;AACH,MAAM,WAAW,yBAAyB;IACxC,KAAK,CAAC,EAAE;QACN;;;;;;;WAOG;QACH,MAAM,CAAC,EAAE,WAAW,CAAC;QACrB;;;;;;;;;;;;;;WAcG;QACH,KAAK,CAAC,EAAE,iBAAiB,GAAG,IAAI,CAAC;KAClC,CAAC;CACH;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,yBAAyB,GAAG,IAAI,CASxE"}
|
package/dist/configure.js
CHANGED
|
@@ -8,16 +8,21 @@
|
|
|
8
8
|
// once secrets/clients are resolved). The library reads the wired
|
|
9
9
|
// adapter inside `audit.emit` at write time — there is no init-time
|
|
10
10
|
// snapshot.
|
|
11
|
-
import { _setAuditChain } from "./audit";
|
|
11
|
+
import { _setAuditChain, _setAuditWriter, } from "./audit.js";
|
|
12
12
|
/**
|
|
13
|
-
* Wire optional telemetry adapters.
|
|
14
|
-
*
|
|
15
|
-
*
|
|
16
|
-
*
|
|
13
|
+
* Wire optional telemetry adapters (`audit.writer` + `audit.chain`).
|
|
14
|
+
* Idempotent: calling repeatedly with a knob set replaces the previously
|
|
15
|
+
* wired value; calling with `audit` undefined leaves the existing wiring
|
|
16
|
+
* intact.
|
|
17
17
|
*/
|
|
18
18
|
export function configureTelemetry(opts) {
|
|
19
|
-
if (opts.audit !== undefined
|
|
20
|
-
|
|
19
|
+
if (opts.audit !== undefined) {
|
|
20
|
+
if ("writer" in opts.audit && opts.audit.writer !== undefined) {
|
|
21
|
+
_setAuditWriter(opts.audit.writer);
|
|
22
|
+
}
|
|
23
|
+
if ("chain" in opts.audit) {
|
|
24
|
+
_setAuditChain(opts.audit.chain ?? null);
|
|
25
|
+
}
|
|
21
26
|
}
|
|
22
27
|
}
|
|
23
28
|
//# sourceMappingURL=configure.js.map
|
package/dist/configure.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"configure.js","sourceRoot":"","sources":["../src/configure.ts"],"names":[],"mappings":"AAAA,8DAA8D;AAC9D,uEAAuE;AACvE,6DAA6D;AAC7D,EAAE;AACF,uEAAuE;AACvE,yEAAyE;AACzE,qEAAqE;AACrE,kEAAkE;AAClE,oEAAoE;AACpE,YAAY;AAEZ,OAAO,
|
|
1
|
+
{"version":3,"file":"configure.js","sourceRoot":"","sources":["../src/configure.ts"],"names":[],"mappings":"AAAA,8DAA8D;AAC9D,uEAAuE;AACvE,6DAA6D;AAC7D,EAAE;AACF,uEAAuE;AACvE,yEAAyE;AACzE,qEAAqE;AACrE,kEAAkE;AAClE,oEAAoE;AACpE,YAAY;AAEZ,OAAO,EACL,cAAc,EACd,eAAe,GAGhB,MAAM,YAAY,CAAC;AA+CpB;;;;;GAKG;AACH,MAAM,UAAU,kBAAkB,CAAC,IAA+B;IAChE,IAAI,IAAI,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;QAC7B,IAAI,QAAQ,IAAI,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;YAC9D,eAAe,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QACrC,CAAC;QACD,IAAI,OAAO,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YAC1B,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,IAAI,IAAI,CAAC,CAAC;QAC3C,CAAC;IACH,CAAC;AACH,CAAC"}
|
package/dist/context.d.ts
CHANGED
package/dist/context.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../src/context.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../src/context.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAI/C;;;;GAIG;AACH,wBAAgB,UAAU,IAAI,YAAY,GAAG,IAAI,CAEhD;AAED;;;;GAIG;AACH,wBAAgB,cAAc,IAAI,YAAY,CAQ7C;AAED;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,CAAC,EAAE,GAAG,EAAE,YAAY,EAAE,EAAE,EAAE,MAAM,CAAC,GAAG,CAAC,CAEhE;AAED;;;;;;GAMG;AACH,wBAAgB,yBAAyB,CAAC,GAAG,EAAE,YAAY,GAAG,IAAI,CAEjE;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,0BAA0B,CACxC,QAAQ,EAAE,MAAM,GAAG,IAAI,GACtB,YAAY,CAUd"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { AUDIT_ACTOR_KINDS, AUDIT_OUTCOMES, type ActorKind, type AuditOutcome } from "../audit-types";
|
|
1
|
+
import { AUDIT_ACTOR_KINDS, AUDIT_OUTCOMES, type ActorKind, type AuditOutcome } from "../audit-types.js";
|
|
2
2
|
export { AUDIT_ACTOR_KINDS, AUDIT_OUTCOMES };
|
|
3
3
|
export type { ActorKind, AuditOutcome };
|
|
4
4
|
/**
|
|
@@ -200,7 +200,9 @@ export declare function makeAuditEventTable<const Name extends string>(serviceNa
|
|
|
200
200
|
baseColumn: never;
|
|
201
201
|
identity: undefined;
|
|
202
202
|
generated: undefined;
|
|
203
|
-
}, {}, {
|
|
203
|
+
}, {}, {
|
|
204
|
+
$type: Record<string, unknown> | null;
|
|
205
|
+
}>;
|
|
204
206
|
action: import("drizzle-orm/pg-core").PgColumn<{
|
|
205
207
|
name: "action";
|
|
206
208
|
tableName: `${Name}_audit_event`;
|
|
@@ -404,7 +406,9 @@ export declare function makeAuditEventTable<const Name extends string>(serviceNa
|
|
|
404
406
|
baseColumn: never;
|
|
405
407
|
identity: undefined;
|
|
406
408
|
generated: undefined;
|
|
407
|
-
}, {}, {
|
|
409
|
+
}, {}, {
|
|
410
|
+
$type: Record<string, unknown> | null;
|
|
411
|
+
}>;
|
|
408
412
|
before: import("drizzle-orm/pg-core").PgColumn<{
|
|
409
413
|
name: "before";
|
|
410
414
|
tableName: `${Name}_audit_event`;
|
|
@@ -421,7 +425,9 @@ export declare function makeAuditEventTable<const Name extends string>(serviceNa
|
|
|
421
425
|
baseColumn: never;
|
|
422
426
|
identity: undefined;
|
|
423
427
|
generated: undefined;
|
|
424
|
-
}, {}, {
|
|
428
|
+
}, {}, {
|
|
429
|
+
$type: Record<string, unknown> | null;
|
|
430
|
+
}>;
|
|
425
431
|
after: import("drizzle-orm/pg-core").PgColumn<{
|
|
426
432
|
name: "after";
|
|
427
433
|
tableName: `${Name}_audit_event`;
|
|
@@ -438,7 +444,9 @@ export declare function makeAuditEventTable<const Name extends string>(serviceNa
|
|
|
438
444
|
baseColumn: never;
|
|
439
445
|
identity: undefined;
|
|
440
446
|
generated: undefined;
|
|
441
|
-
}, {}, {
|
|
447
|
+
}, {}, {
|
|
448
|
+
$type: Record<string, unknown> | null;
|
|
449
|
+
}>;
|
|
442
450
|
patch: import("drizzle-orm/pg-core").PgColumn<{
|
|
443
451
|
name: "patch";
|
|
444
452
|
tableName: `${Name}_audit_event`;
|
|
@@ -455,7 +463,9 @@ export declare function makeAuditEventTable<const Name extends string>(serviceNa
|
|
|
455
463
|
baseColumn: never;
|
|
456
464
|
identity: undefined;
|
|
457
465
|
generated: undefined;
|
|
458
|
-
}, {}, {
|
|
466
|
+
}, {}, {
|
|
467
|
+
$type: Record<string, unknown> | null;
|
|
468
|
+
}>;
|
|
459
469
|
changedFields: import("drizzle-orm/pg-core").PgColumn<{
|
|
460
470
|
name: "changed_fields";
|
|
461
471
|
tableName: `${Name}_audit_event`;
|
|
@@ -485,10 +495,20 @@ export declare function makeAuditEventTable<const Name extends string>(serviceNa
|
|
|
485
495
|
baseColumn: never;
|
|
486
496
|
identity: undefined;
|
|
487
497
|
generated: undefined;
|
|
488
|
-
},
|
|
498
|
+
}, {}, {}>;
|
|
489
499
|
identity: undefined;
|
|
490
500
|
generated: undefined;
|
|
491
|
-
}, {}, {
|
|
501
|
+
}, {}, {
|
|
502
|
+
baseBuilder: import("drizzle-orm/pg-core").PgColumnBuilder<{
|
|
503
|
+
name: "changed_fields";
|
|
504
|
+
dataType: "string";
|
|
505
|
+
columnType: "PgText";
|
|
506
|
+
data: string;
|
|
507
|
+
enumValues: [string, ...string[]];
|
|
508
|
+
driverParam: string;
|
|
509
|
+
}, {}, {}, import("drizzle-orm").ColumnBuilderExtraConfig>;
|
|
510
|
+
size: undefined;
|
|
511
|
+
}>;
|
|
492
512
|
reasonCode: import("drizzle-orm/pg-core").PgColumn<{
|
|
493
513
|
name: "reason_code";
|
|
494
514
|
tableName: `${Name}_audit_event`;
|
|
@@ -777,7 +797,9 @@ export declare function makeAuditEventTable<const Name extends string>(serviceNa
|
|
|
777
797
|
baseColumn: never;
|
|
778
798
|
identity: undefined;
|
|
779
799
|
generated: undefined;
|
|
780
|
-
}, {}, {
|
|
800
|
+
}, {}, {
|
|
801
|
+
pgColumnBuilderBrand: "PgCustomColumnBuilderBrand";
|
|
802
|
+
}>;
|
|
781
803
|
rowHash: import("drizzle-orm/pg-core").PgColumn<{
|
|
782
804
|
name: "row_hash";
|
|
783
805
|
tableName: `${Name}_audit_event`;
|
|
@@ -794,7 +816,9 @@ export declare function makeAuditEventTable<const Name extends string>(serviceNa
|
|
|
794
816
|
baseColumn: never;
|
|
795
817
|
identity: undefined;
|
|
796
818
|
generated: undefined;
|
|
797
|
-
}, {}, {
|
|
819
|
+
}, {}, {
|
|
820
|
+
pgColumnBuilderBrand: "PgCustomColumnBuilderBrand";
|
|
821
|
+
}>;
|
|
798
822
|
tenantAuditSeq: import("drizzle-orm/pg-core").PgColumn<{
|
|
799
823
|
name: "tenant_audit_seq";
|
|
800
824
|
tableName: `${Name}_audit_event`;
|
|
@@ -828,7 +852,9 @@ export declare function makeAuditEventTable<const Name extends string>(serviceNa
|
|
|
828
852
|
baseColumn: never;
|
|
829
853
|
identity: undefined;
|
|
830
854
|
generated: undefined;
|
|
831
|
-
}, {}, {
|
|
855
|
+
}, {}, {
|
|
856
|
+
$type: Record<string, unknown>;
|
|
857
|
+
}>;
|
|
832
858
|
};
|
|
833
859
|
dialect: "pg";
|
|
834
860
|
}>;
|
|
@@ -879,6 +905,51 @@ export declare function auditEventIndexes<T extends ReturnType<typeof makeAuditE
|
|
|
879
905
|
*
|
|
880
906
|
* Indexes from `auditEventIndexes` are still created against the parent
|
|
881
907
|
* table — Postgres propagates them to existing + future child partitions.
|
|
908
|
+
*
|
|
909
|
+
* D204 (Locked 2026-06-04) — Postgres partitioning rules drive three
|
|
910
|
+
* constraints that the original DDL got wrong (it failed `CREATE TABLE` on
|
|
911
|
+
* PG16):
|
|
912
|
+
* 1. A partitioned table's PRIMARY KEY MUST include every partition
|
|
913
|
+
* column. The partition key is `at`, so the PK is the composite
|
|
914
|
+
* `(id, at)` — declared as a table-level constraint. `id` keeps
|
|
915
|
+
* `NOT NULL DEFAULT gen_random_uuid()`.
|
|
916
|
+
* 2. `parent_audit_event_id` is a PLAIN `UUID` with NO self-FK. A
|
|
917
|
+
* self-foreign-key cannot reference the now-composite PK (a single-col
|
|
918
|
+
* FK can only target a single-col unique/PK), and D204 picks the
|
|
919
|
+
* `makeAuditEventTable` posture (plain UUID soft reference) as
|
|
920
|
+
* canonical.
|
|
921
|
+
* 3. Per-tenant `tenant_audit_seq` UNIQUEness does NOT live on this
|
|
922
|
+
* partitioned table (a unique index on a partitioned table would have
|
|
923
|
+
* to include the partition key `at`, which would not enforce the
|
|
924
|
+
* intended per-tenant invariant). Uniqueness rides on the chain table
|
|
925
|
+
* `<svc>_audit_rows` (owned by `@nodii/audit-chain`). This function
|
|
926
|
+
* emits no `(tenant_id, tenant_audit_seq)` index at all; the 8 §3
|
|
927
|
+
* B-tree indexes are non-unique and are created by Drizzle from
|
|
928
|
+
* `makeAuditEventTable` (or directly by the consumer migration).
|
|
882
929
|
*/
|
|
883
930
|
export declare function auditEventPartitionDDL(serviceName: string): string;
|
|
931
|
+
/**
|
|
932
|
+
* The 8 canonical §3 B-tree indexes as raw `CREATE INDEX` DDL for the
|
|
933
|
+
* partitioned `<serviceName>_audit_event` parent table emitted by
|
|
934
|
+
* `auditEventPartitionDDL`. Companion to that function for consumers that
|
|
935
|
+
* adopt monthly partitioning and therefore cannot let Drizzle's declarative
|
|
936
|
+
* migration own the table (and thus its indexes).
|
|
937
|
+
*
|
|
938
|
+
* Mirrors `makeAuditEventTable`'s inline index set 1:1 with two D204
|
|
939
|
+
* differences that partitioning forces:
|
|
940
|
+
* - Every index is NON-unique. The `(tenant_id, tenant_audit_seq)` index
|
|
941
|
+
* is a plain B-tree here, NOT a unique index — a unique index on a
|
|
942
|
+
* partitioned table must include the partition key `at`, which would not
|
|
943
|
+
* enforce the intended per-tenant invariant. Per-tenant
|
|
944
|
+
* `tenant_audit_seq` uniqueness rides on the chain table
|
|
945
|
+
* `<svc>_audit_rows` (owned by `@nodii/audit-chain`).
|
|
946
|
+
* - Indexes are created against the parent partitioned table; Postgres
|
|
947
|
+
* propagates them to existing + future child partitions.
|
|
948
|
+
*
|
|
949
|
+
* Returns the statements as an array (one `CREATE INDEX` per element) so the
|
|
950
|
+
* caller can apply them individually. Postgres has no `CREATE INDEX IF NOT
|
|
951
|
+
* EXISTS ... CONCURRENTLY` ordering concerns here — these run inside the same
|
|
952
|
+
* migration transaction that created the parent table.
|
|
953
|
+
*/
|
|
954
|
+
export declare function auditEventPartitionIndexDDL(serviceName: string): string[];
|
|
884
955
|
//# sourceMappingURL=audit-schema.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"audit-schema.d.ts","sourceRoot":"","sources":["../../src/drizzle/audit-schema.ts"],"names":[],"mappings":"AAyCA,OAAO,EACL,iBAAiB,EACjB,cAAc,EACd,KAAK,SAAS,EACd,KAAK,YAAY,EAClB,MAAM,
|
|
1
|
+
{"version":3,"file":"audit-schema.d.ts","sourceRoot":"","sources":["../../src/drizzle/audit-schema.ts"],"names":[],"mappings":"AAyCA,OAAO,EACL,iBAAiB,EACjB,cAAc,EACd,KAAK,SAAS,EACd,KAAK,YAAY,EAClB,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EAAE,iBAAiB,EAAE,cAAc,EAAE,CAAC;AAC7C,YAAY,EAAE,SAAS,EAAE,YAAY,EAAE,CAAC;AAoBxC;;;;;GAKG;AACH,eAAO,MAAM,yBAAyB,QAQ9B,CAAC;AAET;;GAEG;AACH,eAAO,MAAM,sBAAsB,QAO3B,CAAC;AAET,6DAA6D;AAC7D,eAAO,MAAM,kBAAkB,qLAAgD,CAAC;AAEhF,0DAA0D;AAC1D,eAAO,MAAM,gBAAgB,kIAA0C,CAAC;AAExE;;;;;;;;;;GAUG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,CAAC,IAAI,SAAS,MAAM,EAC3D,WAAW,EAAE,IAAI;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoHlB;AAED;;;;;;;GAOG;AACH,wBAAgB,iBAAiB,CAC/B,CAAC,SAAS,UAAU,CAAC,OAAO,mBAAmB,CAAC,EAChD,KAAK,EAAE,CAAC,EAAE,YAAY,EAAE,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;EA2B/B;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AACH,wBAAgB,sBAAsB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAoDlE;AAED;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,wBAAgB,2BAA2B,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,EAAE,CAYzE"}
|
|
@@ -25,7 +25,7 @@
|
|
|
25
25
|
// `AUDIT_OUTCOME_ENUM_DDL` so service migrations can run them once.
|
|
26
26
|
import { bigint, customType, index, inet, integer, jsonb, pgEnum, pgTable, text, timestamp, uniqueIndex, uuid, } from "drizzle-orm/pg-core";
|
|
27
27
|
import { sql } from "drizzle-orm";
|
|
28
|
-
import { AUDIT_ACTOR_KINDS, AUDIT_OUTCOMES, } from "../audit-types";
|
|
28
|
+
import { AUDIT_ACTOR_KINDS, AUDIT_OUTCOMES, } from "../audit-types.js";
|
|
29
29
|
export { AUDIT_ACTOR_KINDS, AUDIT_OUTCOMES };
|
|
30
30
|
/**
|
|
31
31
|
* `bytea` column for the audit-chain hash columns (`prev_hash`, `row_hash`).
|
|
@@ -212,11 +212,32 @@ export function auditEventIndexes(table, _serviceName) {
|
|
|
212
212
|
*
|
|
213
213
|
* Indexes from `auditEventIndexes` are still created against the parent
|
|
214
214
|
* table — Postgres propagates them to existing + future child partitions.
|
|
215
|
+
*
|
|
216
|
+
* D204 (Locked 2026-06-04) — Postgres partitioning rules drive three
|
|
217
|
+
* constraints that the original DDL got wrong (it failed `CREATE TABLE` on
|
|
218
|
+
* PG16):
|
|
219
|
+
* 1. A partitioned table's PRIMARY KEY MUST include every partition
|
|
220
|
+
* column. The partition key is `at`, so the PK is the composite
|
|
221
|
+
* `(id, at)` — declared as a table-level constraint. `id` keeps
|
|
222
|
+
* `NOT NULL DEFAULT gen_random_uuid()`.
|
|
223
|
+
* 2. `parent_audit_event_id` is a PLAIN `UUID` with NO self-FK. A
|
|
224
|
+
* self-foreign-key cannot reference the now-composite PK (a single-col
|
|
225
|
+
* FK can only target a single-col unique/PK), and D204 picks the
|
|
226
|
+
* `makeAuditEventTable` posture (plain UUID soft reference) as
|
|
227
|
+
* canonical.
|
|
228
|
+
* 3. Per-tenant `tenant_audit_seq` UNIQUEness does NOT live on this
|
|
229
|
+
* partitioned table (a unique index on a partitioned table would have
|
|
230
|
+
* to include the partition key `at`, which would not enforce the
|
|
231
|
+
* intended per-tenant invariant). Uniqueness rides on the chain table
|
|
232
|
+
* `<svc>_audit_rows` (owned by `@nodii/audit-chain`). This function
|
|
233
|
+
* emits no `(tenant_id, tenant_audit_seq)` index at all; the 8 §3
|
|
234
|
+
* B-tree indexes are non-unique and are created by Drizzle from
|
|
235
|
+
* `makeAuditEventTable` (or directly by the consumer migration).
|
|
215
236
|
*/
|
|
216
237
|
export function auditEventPartitionDDL(serviceName) {
|
|
217
238
|
return `
|
|
218
239
|
CREATE TABLE ${serviceName}_audit_event (
|
|
219
|
-
id UUID
|
|
240
|
+
id UUID NOT NULL DEFAULT gen_random_uuid(),
|
|
220
241
|
tenant_id UUID NOT NULL REFERENCES tenants(id) ON DELETE RESTRICT,
|
|
221
242
|
at TIMESTAMPTZ NOT NULL DEFAULT now(),
|
|
222
243
|
actor_kind audit_actor_kind NOT NULL,
|
|
@@ -254,15 +275,52 @@ CREATE TABLE ${serviceName}_audit_event (
|
|
|
254
275
|
idempotency_key TEXT,
|
|
255
276
|
queue_name TEXT,
|
|
256
277
|
job_id TEXT,
|
|
257
|
-
parent_audit_event_id UUID
|
|
278
|
+
parent_audit_event_id UUID,
|
|
258
279
|
read_count INTEGER,
|
|
259
280
|
first_read_at TIMESTAMPTZ,
|
|
260
281
|
last_read_at TIMESTAMPTZ,
|
|
261
282
|
prev_hash BYTEA,
|
|
262
283
|
row_hash BYTEA,
|
|
263
284
|
tenant_audit_seq BIGINT,
|
|
264
|
-
metadata JSONB NOT NULL DEFAULT '{}'::jsonb
|
|
285
|
+
metadata JSONB NOT NULL DEFAULT '{}'::jsonb,
|
|
286
|
+
PRIMARY KEY (id, at)
|
|
265
287
|
) PARTITION BY RANGE (at);
|
|
266
288
|
`.trim();
|
|
267
289
|
}
|
|
290
|
+
/**
|
|
291
|
+
* The 8 canonical §3 B-tree indexes as raw `CREATE INDEX` DDL for the
|
|
292
|
+
* partitioned `<serviceName>_audit_event` parent table emitted by
|
|
293
|
+
* `auditEventPartitionDDL`. Companion to that function for consumers that
|
|
294
|
+
* adopt monthly partitioning and therefore cannot let Drizzle's declarative
|
|
295
|
+
* migration own the table (and thus its indexes).
|
|
296
|
+
*
|
|
297
|
+
* Mirrors `makeAuditEventTable`'s inline index set 1:1 with two D204
|
|
298
|
+
* differences that partitioning forces:
|
|
299
|
+
* - Every index is NON-unique. The `(tenant_id, tenant_audit_seq)` index
|
|
300
|
+
* is a plain B-tree here, NOT a unique index — a unique index on a
|
|
301
|
+
* partitioned table must include the partition key `at`, which would not
|
|
302
|
+
* enforce the intended per-tenant invariant. Per-tenant
|
|
303
|
+
* `tenant_audit_seq` uniqueness rides on the chain table
|
|
304
|
+
* `<svc>_audit_rows` (owned by `@nodii/audit-chain`).
|
|
305
|
+
* - Indexes are created against the parent partitioned table; Postgres
|
|
306
|
+
* propagates them to existing + future child partitions.
|
|
307
|
+
*
|
|
308
|
+
* Returns the statements as an array (one `CREATE INDEX` per element) so the
|
|
309
|
+
* caller can apply them individually. Postgres has no `CREATE INDEX IF NOT
|
|
310
|
+
* EXISTS ... CONCURRENTLY` ordering concerns here — these run inside the same
|
|
311
|
+
* migration transaction that created the parent table.
|
|
312
|
+
*/
|
|
313
|
+
export function auditEventPartitionIndexDDL(serviceName) {
|
|
314
|
+
const t = `${serviceName}_audit_event`;
|
|
315
|
+
return [
|
|
316
|
+
`CREATE INDEX ${serviceName}_audit_tenant_time ON ${t} (tenant_id, at);`,
|
|
317
|
+
`CREATE INDEX ${serviceName}_audit_resource ON ${t} (tenant_id, resource_type, resource_id, at);`,
|
|
318
|
+
`CREATE INDEX ${serviceName}_audit_action_outcome ON ${t} (tenant_id, action, outcome, at);`,
|
|
319
|
+
`CREATE INDEX ${serviceName}_audit_actor ON ${t} (tenant_id, actor_id, at);`,
|
|
320
|
+
`CREATE INDEX ${serviceName}_audit_correlation ON ${t} (tenant_id, correlation_id);`,
|
|
321
|
+
`CREATE INDEX ${serviceName}_audit_trace ON ${t} (tenant_id, trace_id);`,
|
|
322
|
+
`CREATE INDEX ${serviceName}_audit_saga ON ${t} (tenant_id, saga_id, at) WHERE saga_id IS NOT NULL;`,
|
|
323
|
+
`CREATE INDEX ${serviceName}_audit_tenant_seq ON ${t} (tenant_id, tenant_audit_seq) WHERE tenant_audit_seq IS NOT NULL;`,
|
|
324
|
+
];
|
|
325
|
+
}
|
|
268
326
|
//# sourceMappingURL=audit-schema.js.map
|