@generazioneai/events 0.1.0 → 0.3.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.
Files changed (54) hide show
  1. package/CHANGELOG.md +33 -0
  2. package/README.md +55 -8
  3. package/dist/consumers.service.d.ts.map +1 -1
  4. package/dist/consumers.service.js +5 -7
  5. package/dist/consumers.service.js.map +1 -1
  6. package/dist/drizzle/index.d.ts +3 -0
  7. package/dist/drizzle/index.d.ts.map +1 -0
  8. package/dist/drizzle/index.js +10 -0
  9. package/dist/drizzle/index.js.map +1 -0
  10. package/dist/drizzle/schema.d.ts +279 -0
  11. package/dist/drizzle/schema.d.ts.map +1 -0
  12. package/dist/drizzle/schema.js +37 -0
  13. package/dist/drizzle/schema.js.map +1 -0
  14. package/dist/drizzle/store.d.ts +51 -0
  15. package/dist/drizzle/store.d.ts.map +1 -0
  16. package/dist/drizzle/store.js +118 -0
  17. package/dist/drizzle/store.js.map +1 -0
  18. package/dist/events.module.d.ts.map +1 -1
  19. package/dist/events.module.js +6 -2
  20. package/dist/events.module.js.map +1 -1
  21. package/dist/final-mode.d.ts +23 -0
  22. package/dist/final-mode.d.ts.map +1 -0
  23. package/dist/final-mode.js +56 -0
  24. package/dist/final-mode.js.map +1 -0
  25. package/dist/index.d.ts +1 -0
  26. package/dist/index.d.ts.map +1 -1
  27. package/dist/index.js +3 -1
  28. package/dist/index.js.map +1 -1
  29. package/dist/metrics.d.ts +8 -0
  30. package/dist/metrics.d.ts.map +1 -1
  31. package/dist/metrics.js +28 -0
  32. package/dist/metrics.js.map +1 -1
  33. package/dist/outbox.service.d.ts +11 -15
  34. package/dist/outbox.service.d.ts.map +1 -1
  35. package/dist/outbox.service.js +27 -32
  36. package/dist/outbox.service.js.map +1 -1
  37. package/dist/prisma-resolver.d.ts +9 -1
  38. package/dist/prisma-resolver.d.ts.map +1 -1
  39. package/dist/prisma-resolver.js +14 -1
  40. package/dist/prisma-resolver.js.map +1 -1
  41. package/dist/relay.service.d.ts.map +1 -1
  42. package/dist/relay.service.js +10 -14
  43. package/dist/relay.service.js.map +1 -1
  44. package/dist/store.d.ts +91 -0
  45. package/dist/store.d.ts.map +1 -0
  46. package/dist/store.js +78 -0
  47. package/dist/store.js.map +1 -0
  48. package/dist/types.d.ts +27 -9
  49. package/dist/types.d.ts.map +1 -1
  50. package/dist/types.js +9 -6
  51. package/dist/types.js.map +1 -1
  52. package/package.json +33 -5
  53. package/sql/002-events-outbox-inbox-snake-rientro.sql +3 -0
  54. package/sql/002-events-outbox-inbox-snake.sql +29 -0
@@ -0,0 +1,51 @@
1
+ import { type SQL } from 'drizzle-orm';
2
+ import { type OutboxInsert, type OutboxRow, type OutboxStore, type OutboxTransactionOptions } from '../store';
3
+ /** Il pezzo di una transazione (o del client) di Drizzle che serve alla libreria: eseguire SQL. Vale per `postgres-js`, `node-postgres` e PGlite. */
4
+ export interface DrizzleExecutor {
5
+ execute(query: SQL): PromiseLike<unknown>;
6
+ }
7
+ /** Il client di Drizzle (`drizzle(...)`) o un oggetto con la stessa forma, p.es. un wrapper che apre la transazione con lo scope che serve al servizio. */
8
+ export interface DrizzleDbLike extends DrizzleExecutor {
9
+ transaction<R>(fn: (tx: any) => Promise<R>): Promise<R>;
10
+ }
11
+ export interface DrizzleOutboxStoreOptions {
12
+ /** Il client di Drizzle. Il relay e i consumer aprono `db.transaction(...)`: le tabelle dell'outbox non hanno azienda. */
13
+ db: DrizzleDbLike;
14
+ /**
15
+ * `snake` (di serie): `aggregate_type`, `published_at`, … come in `sql/002-events-outbox-inbox-snake.sql` e nello schema
16
+ * `outboxEvents`/`inboxProcessed`. `camel`: le colonne di `sql/001-events-outbox-inbox.sql` (le stesse di Prisma).
17
+ */
18
+ columns?: 'snake' | 'camel';
19
+ }
20
+ /**
21
+ * Lo store Drizzle (`@generazioneai/events/drizzle`): stesso SQL e stesse garanzie di quello di Prisma, scritto con `db.execute`.
22
+ * - **Nella transazione del chiamante**: `enqueue(tx, …)` riceve il `tx` di `db.transaction(async (tx) => …)`; fuori da una
23
+ * transazione lancia `EVENTS_OUTSIDE_TX`.
24
+ * - **Indipendente dal driver**: JSON e UUID viaggiano come testo con il cast sul server (con `postgres-js` un oggetto JSON passato
25
+ * a una colonna `jsonb` verrebbe serializzato due volte), e le righe si leggono sia come array (`postgres-js`) sia come `{ rows }`.
26
+ * - Drizzle non ha un timeout di transazione: `timeout` e `maxWait` delle opzioni non hanno effetto.
27
+ */
28
+ export declare class DrizzleOutboxStore implements OutboxStore<DrizzleExecutor> {
29
+ readonly kind = "drizzle";
30
+ private readonly verified;
31
+ private readonly db;
32
+ private readonly c;
33
+ constructor(options: DrizzleOutboxStoreOptions);
34
+ accepts(tx: unknown): tx is DrizzleExecutor;
35
+ /** `SAVEPOINT` esiste solo dentro un blocco di transazione (altrimenti Postgres risponde 25P01): è il database a dire se `tx` lo è. */
36
+ assertInTransaction(tx: DrizzleExecutor, subject: string | undefined): Promise<void>;
37
+ insert(tx: DrizzleExecutor, r: OutboxInsert): Promise<void>;
38
+ transaction<R>(fn: (tx: DrizzleExecutor) => Promise<R>, _options?: OutboxTransactionOptions): Promise<R>;
39
+ claimPending(tx: DrizzleExecutor, limit: number): Promise<OutboxRow[]>;
40
+ markPublished(tx: DrizzleExecutor, id: string): Promise<void>;
41
+ markFailed(tx: DrizzleExecutor, id: string, error: string): Promise<void>;
42
+ claimInbox(tx: DrizzleExecutor, consumer: string, eventId: string): Promise<boolean>;
43
+ pendingStats(): Promise<{
44
+ pending: number;
45
+ oldestSeconds: number;
46
+ }>;
47
+ prune(outboxDays: number, inboxDays: number): Promise<void>;
48
+ }
49
+ /** `EventsModule.forRoot({ service: 'checkflow', store: createDrizzleOutboxStore({ db }), … })`. */
50
+ export declare const createDrizzleOutboxStore: (options: DrizzleOutboxStoreOptions) => DrizzleOutboxStore;
51
+ //# sourceMappingURL=store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../src/drizzle/store.ts"],"names":[],"mappings":"AAAA,OAAO,EAAO,KAAK,GAAG,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAEL,KAAK,YAAY,EACjB,KAAK,SAAS,EACd,KAAK,WAAW,EAChB,KAAK,wBAAwB,EAC9B,MAAM,UAAU,CAAC;AAElB,qJAAqJ;AACrJ,MAAM,WAAW,eAAe;IAC9B,OAAO,CAAC,KAAK,EAAE,GAAG,GAAG,WAAW,CAAC,OAAO,CAAC,CAAC;CAC3C;AAED,2JAA2J;AAC3J,MAAM,WAAW,aAAc,SAAQ,eAAe;IACpD,WAAW,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,GAAG,KAAK,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;CACzD;AAED,MAAM,WAAW,yBAAyB;IACxC,0HAA0H;IAC1H,EAAE,EAAE,aAAa,CAAC;IAClB;;;OAGG;IACH,OAAO,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC;CAC7B;AAMD;;;;;;;GAOG;AACH,qBAAa,kBAAmB,YAAW,WAAW,CAAC,eAAe,CAAC;IACrE,QAAQ,CAAC,IAAI,aAAa;IAC1B,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAyB;IAClD,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAgB;IACnC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAoP;gBAE1P,OAAO,EAAE,yBAAyB;IA0B9C,OAAO,CAAC,EAAE,EAAE,OAAO,GAAG,EAAE,IAAI,eAAe;IAI3C,uIAAuI;IACjI,mBAAmB,CAAC,EAAE,EAAE,eAAe,EAAE,OAAO,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC;IAYpF,MAAM,CAAC,EAAE,EAAE,eAAe,EAAE,CAAC,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC;IAOjE,WAAW,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,eAAe,KAAK,OAAO,CAAC,CAAC,CAAC,EAAE,QAAQ,CAAC,EAAE,wBAAwB,GAAG,OAAO,CAAC,CAAC,CAAC;IAIlG,YAAY,CAAC,EAAE,EAAE,eAAe,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC;IAmBtE,aAAa,CAAC,EAAE,EAAE,eAAe,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAO7D,UAAU,CAAC,EAAE,EAAE,eAAe,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAKzE,UAAU,CAAC,EAAE,EAAE,eAAe,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAQpF,YAAY,IAAI,OAAO,CAAC;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,aAAa,EAAE,MAAM,CAAA;KAAE,CAAC;IAWnE,KAAK,CAAC,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CASlE;AAED,oGAAoG;AACpG,eAAO,MAAM,wBAAwB,GAAI,SAAS,yBAAyB,KAAG,kBAAqD,CAAC"}
@@ -0,0 +1,118 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createDrizzleOutboxStore = exports.DrizzleOutboxStore = void 0;
4
+ const drizzle_orm_1 = require("drizzle-orm");
5
+ const store_1 = require("../store");
6
+ const rowsOf = (res) => (Array.isArray(res) ? res : (res?.rows ?? []));
7
+ const col = (name) => drizzle_orm_1.sql.raw(`"${name}"`);
8
+ /**
9
+ * Lo store Drizzle (`@generazioneai/events/drizzle`): stesso SQL e stesse garanzie di quello di Prisma, scritto con `db.execute`.
10
+ * - **Nella transazione del chiamante**: `enqueue(tx, …)` riceve il `tx` di `db.transaction(async (tx) => …)`; fuori da una
11
+ * transazione lancia `EVENTS_OUTSIDE_TX`.
12
+ * - **Indipendente dal driver**: JSON e UUID viaggiano come testo con il cast sul server (con `postgres-js` un oggetto JSON passato
13
+ * a una colonna `jsonb` verrebbe serializzato due volte), e le righe si leggono sia come array (`postgres-js`) sia come `{ rows }`.
14
+ * - Drizzle non ha un timeout di transazione: `timeout` e `maxWait` delle opzioni non hanno effetto.
15
+ */
16
+ class DrizzleOutboxStore {
17
+ constructor(options) {
18
+ this.kind = 'drizzle';
19
+ this.verified = new WeakSet();
20
+ if (!options?.db || typeof options.db.transaction !== 'function' || typeof options.db.execute !== 'function') {
21
+ throw new Error('createDrizzleOutboxStore({ db }): db deve avere transaction() ed execute() (il client di drizzle)');
22
+ }
23
+ this.db = options.db;
24
+ const snake = (options.columns ?? 'snake') === 'snake';
25
+ const n = (camel, sn) => col(snake ? sn : camel);
26
+ this.c = {
27
+ id: n('id', 'id'),
28
+ subject: n('subject', 'subject'),
29
+ aggregateType: n('aggregateType', 'aggregate_type'),
30
+ aggregateId: n('aggregateId', 'aggregate_id'),
31
+ aggregateVersion: n('aggregateVersion', 'aggregate_version'),
32
+ juridicalId: n('juridicalId', 'juridical_id'),
33
+ payload: n('payload', 'payload'),
34
+ headers: n('headers', 'headers'),
35
+ createdAt: n('createdAt', 'created_at'),
36
+ publishedAt: n('publishedAt', 'published_at'),
37
+ attempts: n('attempts', 'attempts'),
38
+ lastError: n('lastError', 'last_error'),
39
+ consumer: n('consumer', 'consumer'),
40
+ eventId: n('eventId', 'event_id'),
41
+ processedAt: n('processedAt', 'processed_at'),
42
+ };
43
+ }
44
+ accepts(tx) {
45
+ return !!tx && typeof tx.execute === 'function';
46
+ }
47
+ /** `SAVEPOINT` esiste solo dentro un blocco di transazione (altrimenti Postgres risponde 25P01): è il database a dire se `tx` lo è. */
48
+ async assertInTransaction(tx, subject) {
49
+ if (!this.accepts(tx))
50
+ throw (0, store_1.outsideTransaction)(subject, undefined, this.kind);
51
+ if (this.verified.has(tx))
52
+ return;
53
+ try {
54
+ await tx.execute((0, drizzle_orm_1.sql) `SAVEPOINT genai_events_probe`);
55
+ await tx.execute((0, drizzle_orm_1.sql) `RELEASE SAVEPOINT genai_events_probe`);
56
+ }
57
+ catch (e) {
58
+ throw (0, store_1.outsideTransaction)(subject, e);
59
+ }
60
+ this.verified.add(tx);
61
+ }
62
+ async insert(tx, r) {
63
+ const c = this.c;
64
+ await tx.execute((0, drizzle_orm_1.sql) `INSERT INTO outbox_events
65
+ (${c.id},${c.subject},${c.aggregateType},${c.aggregateId},${c.aggregateVersion},${c.juridicalId},${c.payload},${c.headers})
66
+ VALUES (${r.id}::uuid,${r.subject}::text,${r.aggregateType}::text,${r.aggregateId}::text,${r.aggregateVersion}::integer,${r.juridicalId}::text,${r.payload}::text::jsonb,${r.headers}::text::jsonb)`);
67
+ }
68
+ transaction(fn, _options) {
69
+ return this.db.transaction(fn);
70
+ }
71
+ async claimPending(tx, limit) {
72
+ const c = this.c;
73
+ const res = await tx.execute((0, drizzle_orm_1.sql) `SELECT ${c.id} AS "id", ${c.subject} AS "subject", ${c.aggregateType} AS "aggregateType",
74
+ ${c.aggregateId} AS "aggregateId", ${c.aggregateVersion} AS "aggregateVersion", ${c.juridicalId} AS "juridicalId",
75
+ ${c.payload}::text AS "payload", ${c.headers}::text AS "headers"
76
+ FROM outbox_events WHERE ${c.publishedAt} IS NULL ORDER BY ${c.id} LIMIT ${drizzle_orm_1.sql.raw(String(Math.floor(limit)))}
77
+ FOR UPDATE SKIP LOCKED`);
78
+ return rowsOf(res).map((r) => ({
79
+ id: String(r.id),
80
+ subject: r.subject,
81
+ aggregateType: r.aggregateType,
82
+ aggregateId: r.aggregateId,
83
+ aggregateVersion: Number(r.aggregateVersion),
84
+ juridicalId: r.juridicalId ?? null,
85
+ payload: JSON.parse(r.payload),
86
+ headers: r.headers == null ? null : JSON.parse(r.headers),
87
+ }));
88
+ }
89
+ async markPublished(tx, id) {
90
+ const c = this.c;
91
+ await tx.execute((0, drizzle_orm_1.sql) `UPDATE outbox_events SET ${c.publishedAt} = CURRENT_TIMESTAMP, ${c.attempts} = ${c.attempts} + 1, ${c.lastError} = NULL WHERE ${c.id} = ${id}::uuid`);
92
+ }
93
+ async markFailed(tx, id, error) {
94
+ const c = this.c;
95
+ await tx.execute((0, drizzle_orm_1.sql) `UPDATE outbox_events SET ${c.attempts} = ${c.attempts} + 1, ${c.lastError} = ${error}::text WHERE ${c.id} = ${id}::uuid`);
96
+ }
97
+ async claimInbox(tx, consumer, eventId) {
98
+ const c = this.c;
99
+ const res = await tx.execute((0, drizzle_orm_1.sql) `INSERT INTO inbox_processed (${c.consumer},${c.eventId}) VALUES (${consumer}::text,${eventId}::uuid) ON CONFLICT DO NOTHING RETURNING ${c.consumer} AS "consumer"`);
100
+ return rowsOf(res).length > 0;
101
+ }
102
+ async pendingStats() {
103
+ const c = this.c;
104
+ const [row] = rowsOf(await this.db.execute((0, drizzle_orm_1.sql) `SELECT COUNT(*)::float8 AS "pending", EXTRACT(EPOCH FROM (CURRENT_TIMESTAMP - MIN(${c.createdAt})))::float8 AS "oldest"
105
+ FROM outbox_events WHERE ${c.publishedAt} IS NULL`));
106
+ return { pending: Number(row?.pending ?? 0), oldestSeconds: Number(row?.oldest ?? 0) };
107
+ }
108
+ async prune(outboxDays, inboxDays) {
109
+ const c = this.c;
110
+ await this.db.execute((0, drizzle_orm_1.sql) `DELETE FROM outbox_events WHERE ${c.publishedAt} IS NOT NULL AND ${c.publishedAt} < CURRENT_TIMESTAMP - make_interval(days => ${drizzle_orm_1.sql.raw(String(Math.floor(outboxDays)))})`);
111
+ await this.db.execute((0, drizzle_orm_1.sql) `DELETE FROM inbox_processed WHERE ${c.processedAt} < CURRENT_TIMESTAMP - make_interval(days => ${drizzle_orm_1.sql.raw(String(Math.floor(inboxDays)))})`);
112
+ }
113
+ }
114
+ exports.DrizzleOutboxStore = DrizzleOutboxStore;
115
+ /** `EventsModule.forRoot({ service: 'checkflow', store: createDrizzleOutboxStore({ db }), … })`. */
116
+ const createDrizzleOutboxStore = (options) => new DrizzleOutboxStore(options);
117
+ exports.createDrizzleOutboxStore = createDrizzleOutboxStore;
118
+ //# sourceMappingURL=store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"store.js","sourceRoot":"","sources":["../../src/drizzle/store.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"events.module.d.ts","sourceRoot":"","sources":["../src/events.module.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAkC,sBAAsB,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AAE9H,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAChD,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAItD,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAE9C,OAAO,EAAkB,KAAK,mBAAmB,EAAE,KAAK,qBAAqB,EAAE,MAAM,SAAS,CAAC;AAE/F,qBAEa,YAAa,YAAW,sBAAsB,EAAE,qBAAqB;IAKtD,OAAO,CAAC,QAAQ,CAAC,IAAI;IAC7C,OAAO,CAAC,QAAQ,CAAC,IAAI;IACrB,OAAO,CAAC,QAAQ,CAAC,KAAK;IACtB,OAAO,CAAC,QAAQ,CAAC,SAAS;IAP5B,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAwB;IAC5C,OAAO,CAAC,SAAS,CAAS;gBAGiB,IAAI,EAAE,qBAAqB,EACnD,IAAI,EAAE,gBAAgB,EACtB,KAAK,EAAE,WAAW,EAClB,SAAS,EAAE,eAAe;IAG7C,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,mBAAmB,GAAG,aAAa;IAoB3D,4HAA4H;IAC5H,sBAAsB,IAAI,IAAI;YAWhB,IAAI;IAeZ,qBAAqB,IAAI,OAAO,CAAC,IAAI,CAAC;CAM7C"}
1
+ {"version":3,"file":"events.module.d.ts","sourceRoot":"","sources":["../src/events.module.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAkC,sBAAsB,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AAE9H,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAChD,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAItD,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAE9C,OAAO,EAAkB,KAAK,mBAAmB,EAAE,KAAK,qBAAqB,EAAE,MAAM,SAAS,CAAC;AAE/F,qBAEa,YAAa,YAAW,sBAAsB,EAAE,qBAAqB;IAKtD,OAAO,CAAC,QAAQ,CAAC,IAAI;IAC7C,OAAO,CAAC,QAAQ,CAAC,IAAI;IACrB,OAAO,CAAC,QAAQ,CAAC,KAAK;IACtB,OAAO,CAAC,QAAQ,CAAC,SAAS;IAP5B,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAwB;IAC5C,OAAO,CAAC,SAAS,CAAS;gBAGiB,IAAI,EAAE,qBAAqB,EACnD,IAAI,EAAE,gBAAgB,EACtB,KAAK,EAAE,WAAW,EAClB,SAAS,EAAE,eAAe;IAG7C,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,mBAAmB,GAAG,aAAa;IAoB3D,4HAA4H;IAC5H,sBAAsB,IAAI,IAAI;YAehB,IAAI;IAeZ,qBAAqB,IAAI,OAAO,CAAC,IAAI,CAAC;CAM7C"}
@@ -56,8 +56,12 @@ let EventsModule = EventsModule_1 = class EventsModule {
56
56
  onApplicationBootstrap() {
57
57
  const { mode, signatureMode, verifier, signer } = this.opts;
58
58
  this.log.log(`EVENTS_MODE=${mode} EVENTS_SIGNATURE=${signatureMode}`);
59
- if (signatureMode === 'enforce' && (!verifier || !signer)) {
60
- throw new Error('EVENTS_SIGNATURE=enforce richiede signer e verifier in EventsModule.forRoot');
59
+ // 0.3 (via gli interruttori): la firma si fa e si verifica se il servizio passa signer e verifier; senza, una riga, mai un errore.
60
+ if (signatureMode !== 'off' && !signer) {
61
+ this.log.warn('firma degli eventi non configurata (manca signer in EventsModule.forRoot): gli eventi partono senza Gen-Sig');
62
+ }
63
+ if (signatureMode !== 'off' && !verifier) {
64
+ this.log.warn('verifica della firma non configurata (manca verifier in EventsModule.forRoot): gli eventi si accettano senza verifica');
61
65
  }
62
66
  if (mode !== 'on')
63
67
  return;
@@ -1 +1 @@
1
- {"version":3,"file":"events.module.js","sourceRoot":"","sources":["../src/events.module.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"events.module.js","sourceRoot":"","sources":["../src/events.module.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ /** `true` solo in sviluppo locale o nei test: l'unico caso in cui le vecchie modalità contano ancora. */
2
+ export declare function isLocalDevEnv(env?: NodeJS.ProcessEnv): boolean;
3
+ export interface FinalModeOptions<T extends string> {
4
+ /** Nome della variabile (per l'avviso). */
5
+ name: string;
6
+ /** Il valore finale, quello che vale fuori dallo sviluppo locale. */
7
+ final: T;
8
+ /** I valori che lo sviluppo locale può ancora chiedere (il finale compreso). */
9
+ allowed: readonly T[];
10
+ /** Il valore chiesto (opzione o env); vuoto/assente = il finale. */
11
+ requested?: string | null;
12
+ env?: NodeJS.ProcessEnv;
13
+ /** Default `console.warn`. */
14
+ warn?: (message: string) => void;
15
+ }
16
+ /** Per i test: dimentica gli avvisi già dati. */
17
+ export declare function resetFinalModeWarnings(): void;
18
+ /**
19
+ * Il valore effettivo di una vecchia modalità: il finale, tranne in sviluppo locale dove si rispetta il valore chiesto (se è
20
+ * uno degli ammessi). Un valore sconosciuto o fuori posto non fa mai fallire l'avvio: vale il finale, con un avviso.
21
+ */
22
+ export declare function finalMode<T extends string>(o: FinalModeOptions<T>): T;
23
+ //# sourceMappingURL=final-mode.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"final-mode.d.ts","sourceRoot":"","sources":["../src/final-mode.ts"],"names":[],"mappings":"AAYA,yGAAyG;AACzG,wBAAgB,aAAa,CAAC,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,OAAO,CAM3E;AAED,MAAM,WAAW,gBAAgB,CAAC,CAAC,SAAS,MAAM;IAChD,2CAA2C;IAC3C,IAAI,EAAE,MAAM,CAAC;IACb,qEAAqE;IACrE,KAAK,EAAE,CAAC,CAAC;IACT,gFAAgF;IAChF,OAAO,EAAE,SAAS,CAAC,EAAE,CAAC;IACtB,oEAAoE;IACpE,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;IACxB,8BAA8B;IAC9B,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;CAClC;AAID,iDAAiD;AACjD,wBAAgB,sBAAsB,IAAI,IAAI,CAE7C;AAQD;;;GAGG;AACH,wBAAgB,SAAS,CAAC,CAAC,SAAS,MAAM,EAAE,CAAC,EAAE,gBAAgB,CAAC,CAAC,CAAC,GAAG,CAAC,CAmBrE"}
@@ -0,0 +1,56 @@
1
+ "use strict";
2
+ // Valori finali fissi delle vecchie modalità di rilascio (decisione del CTO del 2026-11-10, «via gli interruttori»).
3
+ //
4
+ // Le variabili che sceglievano off/log/shadow/enforce (AUTHZ_ENFORCE_MODE, AUTHZ_INTERNAL_AUTH_MODE, AUTHZ_KEY_POLICY, …) non
5
+ // scelgono più nulla: vale sempre il comportamento finale. Resta UNA via di fuga, solo per lo sviluppo locale e i test
6
+ // (D-E del censimento): lì il valore dell'env (o dell'opzione) si rispetta ancora. In ogni altro ambiente un valore diverso
7
+ // dal finale si ignora con un avviso, una volta per variabile e valore: mai un crash all'avvio.
8
+ //
9
+ // Sviluppo locale = nessun `KUBERNETES_SERVICE_HOST` (mai dentro un cluster) E (`SKILLERA_ENV` è `dev`/`local`, oppure
10
+ // `SKILLERA_ENV` manca e `NODE_ENV` è `development`/`test`). Uno `SKILLERA_ENV` diverso (stg, prod, …) chiude sempre la via.
11
+ //
12
+ // Copia identica in authz, gateway-kit, events, telemetry e crypto (pacchetti pubblicati a parte, senza dipendenze fra loro).
13
+ Object.defineProperty(exports, "__esModule", { value: true });
14
+ exports.isLocalDevEnv = isLocalDevEnv;
15
+ exports.resetFinalModeWarnings = resetFinalModeWarnings;
16
+ exports.finalMode = finalMode;
17
+ /** `true` solo in sviluppo locale o nei test: l'unico caso in cui le vecchie modalità contano ancora. */
18
+ function isLocalDevEnv(env = process.env) {
19
+ if ((env.KUBERNETES_SERVICE_HOST ?? '').trim())
20
+ return false;
21
+ const skilleraEnv = (env.SKILLERA_ENV ?? '').trim().toLowerCase();
22
+ if (skilleraEnv)
23
+ return skilleraEnv === 'dev' || skilleraEnv === 'local';
24
+ const nodeEnv = (env.NODE_ENV ?? '').trim().toLowerCase();
25
+ return nodeEnv === 'development' || nodeEnv === 'test';
26
+ }
27
+ const warned = new Set();
28
+ /** Per i test: dimentica gli avvisi già dati. */
29
+ function resetFinalModeWarnings() {
30
+ warned.clear();
31
+ }
32
+ function warnOnce(key, message, warn) {
33
+ if (warned.has(key))
34
+ return;
35
+ warned.add(key);
36
+ (warn ?? ((m) => console.warn(m)))(message);
37
+ }
38
+ /**
39
+ * Il valore effettivo di una vecchia modalità: il finale, tranne in sviluppo locale dove si rispetta il valore chiesto (se è
40
+ * uno degli ammessi). Un valore sconosciuto o fuori posto non fa mai fallire l'avvio: vale il finale, con un avviso.
41
+ */
42
+ function finalMode(o) {
43
+ const raw = (o.requested ?? '').toString().trim().toLowerCase();
44
+ if (!raw || raw === o.final)
45
+ return o.final;
46
+ const env = o.env ?? process.env;
47
+ if (!o.allowed.includes(raw)) {
48
+ warnOnce(`${o.name}|${raw}`, `[via-interruttori] ${o.name}=«${raw}» sconosciuto: vale «${o.final}» (ammessi solo in sviluppo locale: ${o.allowed.join(', ')})`, o.warn);
49
+ return o.final;
50
+ }
51
+ if (isLocalDevEnv(env))
52
+ return raw;
53
+ warnOnce(`${o.name}|${raw}`, `[via-interruttori] ${o.name}=«${raw}» ignorato: fuori dallo sviluppo locale vale sempre «${o.final}» (decisione 2026-11-10, via gli interruttori)`, o.warn);
54
+ return o.final;
55
+ }
56
+ //# sourceMappingURL=final-mode.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"final-mode.js","sourceRoot":"","sources":["../src/final-mode.ts"],"names":[],"mappings":";AAAA,qHAAqH;AACrH,EAAE;AACF,8HAA8H;AAC9H,uHAAuH;AACvH,4HAA4H;AAC5H,gGAAgG;AAChG,EAAE;AACF,uHAAuH;AACvH,6HAA6H;AAC7H,EAAE;AACF,8HAA8H;;AAG9H,sCAMC;AAmBD,wDAEC;AAYD,8BAmBC;AA3DD,yGAAyG;AACzG,SAAgB,aAAa,CAAC,MAAyB,OAAO,CAAC,GAAG;IAChE,IAAI,CAAC,GAAG,CAAC,uBAAuB,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE;QAAE,OAAO,KAAK,CAAC;IAC7D,MAAM,WAAW,GAAG,CAAC,GAAG,CAAC,YAAY,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAClE,IAAI,WAAW;QAAE,OAAO,WAAW,KAAK,KAAK,IAAI,WAAW,KAAK,OAAO,CAAC;IACzE,MAAM,OAAO,GAAG,CAAC,GAAG,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAC1D,OAAO,OAAO,KAAK,aAAa,IAAI,OAAO,KAAK,MAAM,CAAC;AACzD,CAAC;AAgBD,MAAM,MAAM,GAAG,IAAI,GAAG,EAAU,CAAC;AAEjC,iDAAiD;AACjD,SAAgB,sBAAsB;IACpC,MAAM,CAAC,KAAK,EAAE,CAAC;AACjB,CAAC;AAED,SAAS,QAAQ,CAAC,GAAW,EAAE,OAAe,EAAE,IAA0B;IACxE,IAAI,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC;QAAE,OAAO;IAC5B,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAChB,CAAC,IAAI,IAAI,CAAC,CAAC,CAAS,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;AACtD,CAAC;AAED;;;GAGG;AACH,SAAgB,SAAS,CAAmB,CAAsB;IAChE,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,SAAS,IAAI,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAChE,IAAI,CAAC,GAAG,IAAI,GAAG,KAAK,CAAC,CAAC,KAAK;QAAE,OAAO,CAAC,CAAC,KAAK,CAAC;IAC5C,MAAM,GAAG,GAAG,CAAC,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,CAAC;IACjC,IAAI,CAAE,CAAC,CAAC,OAA6B,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;QACpD,QAAQ,CACN,GAAG,CAAC,CAAC,IAAI,IAAI,GAAG,EAAE,EAClB,sBAAsB,CAAC,CAAC,IAAI,KAAK,GAAG,wBAAwB,CAAC,CAAC,KAAK,uCAAuC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EACjI,CAAC,CAAC,IAAI,CACP,CAAC;QACF,OAAO,CAAC,CAAC,KAAK,CAAC;IACjB,CAAC;IACD,IAAI,aAAa,CAAC,GAAG,CAAC;QAAE,OAAO,GAAQ,CAAC;IACxC,QAAQ,CACN,GAAG,CAAC,CAAC,IAAI,IAAI,GAAG,EAAE,EAClB,sBAAsB,CAAC,CAAC,IAAI,KAAK,GAAG,wDAAwD,CAAC,CAAC,KAAK,gDAAgD,EACnJ,CAAC,CAAC,IAAI,CACP,CAAC;IACF,OAAO,CAAC,CAAC,KAAK,CAAC;AACjB,CAAC"}
package/dist/index.d.ts CHANGED
@@ -1,5 +1,6 @@
1
1
  export { EventsModule } from './events.module';
2
2
  export { OutboxService, OUTBOX_INSERT } from './outbox.service';
3
+ export { PrismaOutboxStore, type OutboxInsert, type OutboxRow, type OutboxStore, type OutboxTransactionOptions, } from './store';
3
4
  export { OutboxRelay } from './relay.service';
4
5
  export { EventsConsumers, durableName, streamForSubject } from './consumers.service';
5
6
  export { EventsConnection } from './connection';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAChE,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAC9C,OAAO,EAAE,eAAe,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AACrF,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAChD,OAAO,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,OAAO,EAAE,KAAK,eAAe,EAAE,MAAM,cAAc,CAAC;AAC7D,OAAO,EAAE,WAAW,EAAE,oBAAoB,EAAE,MAAM,UAAU,CAAC;AAC7D,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAChC,OAAO,EACL,yBAAyB,EACzB,cAAc,EACd,KAAK,aAAa,EAClB,KAAK,aAAa,EAClB,KAAK,YAAY,EACjB,KAAK,WAAW,EAChB,KAAK,aAAa,EAClB,KAAK,UAAU,EACf,KAAK,mBAAmB,EACxB,KAAK,aAAa,EAClB,KAAK,mBAAmB,EACxB,KAAK,cAAc,EACnB,KAAK,UAAU,EACf,KAAK,QAAQ,EACb,KAAK,UAAU,EACf,KAAK,YAAY,GAClB,MAAM,SAAS,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAChE,OAAO,EACL,iBAAiB,EACjB,KAAK,YAAY,EACjB,KAAK,SAAS,EACd,KAAK,WAAW,EAChB,KAAK,wBAAwB,GAC9B,MAAM,SAAS,CAAC;AACjB,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAC9C,OAAO,EAAE,eAAe,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AACrF,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAChD,OAAO,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,OAAO,EAAE,KAAK,eAAe,EAAE,MAAM,cAAc,CAAC;AAC7D,OAAO,EAAE,WAAW,EAAE,oBAAoB,EAAE,MAAM,UAAU,CAAC;AAC7D,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAChC,OAAO,EACL,yBAAyB,EACzB,cAAc,EACd,KAAK,aAAa,EAClB,KAAK,aAAa,EAClB,KAAK,YAAY,EACjB,KAAK,WAAW,EAChB,KAAK,aAAa,EAClB,KAAK,UAAU,EACf,KAAK,mBAAmB,EACxB,KAAK,aAAa,EAClB,KAAK,mBAAmB,EACxB,KAAK,cAAc,EACnB,KAAK,UAAU,EACf,KAAK,QAAQ,EACb,KAAK,UAAU,EACf,KAAK,YAAY,GAClB,MAAM,SAAS,CAAC"}
package/dist/index.js CHANGED
@@ -1,11 +1,13 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.resolveOptions = exports.DEFAULT_RETRY_SCHEDULE_MS = exports.uuidv7 = exports.EventValidationError = exports.EventsError = exports.OnEvent = exports.EventsMetrics = exports.EventsConnection = exports.streamForSubject = exports.durableName = exports.EventsConsumers = exports.OutboxRelay = exports.OUTBOX_INSERT = exports.OutboxService = exports.EventsModule = void 0;
3
+ exports.resolveOptions = exports.DEFAULT_RETRY_SCHEDULE_MS = exports.uuidv7 = exports.EventValidationError = exports.EventsError = exports.OnEvent = exports.EventsMetrics = exports.EventsConnection = exports.streamForSubject = exports.durableName = exports.EventsConsumers = exports.OutboxRelay = exports.PrismaOutboxStore = exports.OUTBOX_INSERT = exports.OutboxService = exports.EventsModule = void 0;
4
4
  var events_module_1 = require("./events.module");
5
5
  Object.defineProperty(exports, "EventsModule", { enumerable: true, get: function () { return events_module_1.EventsModule; } });
6
6
  var outbox_service_1 = require("./outbox.service");
7
7
  Object.defineProperty(exports, "OutboxService", { enumerable: true, get: function () { return outbox_service_1.OutboxService; } });
8
8
  Object.defineProperty(exports, "OUTBOX_INSERT", { enumerable: true, get: function () { return outbox_service_1.OUTBOX_INSERT; } });
9
+ var store_1 = require("./store");
10
+ Object.defineProperty(exports, "PrismaOutboxStore", { enumerable: true, get: function () { return store_1.PrismaOutboxStore; } });
9
11
  var relay_service_1 = require("./relay.service");
10
12
  Object.defineProperty(exports, "OutboxRelay", { enumerable: true, get: function () { return relay_service_1.OutboxRelay; } });
11
13
  var consumers_service_1 = require("./consumers.service");
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AAAA,iDAA+C;AAAtC,6GAAA,YAAY,OAAA;AACrB,mDAAgE;AAAvD,+GAAA,aAAa,OAAA;AAAE,+GAAA,aAAa,OAAA;AACrC,iDAA8C;AAArC,4GAAA,WAAW,OAAA;AACpB,yDAAqF;AAA5E,oHAAA,eAAe,OAAA;AAAE,gHAAA,WAAW,OAAA;AAAE,qHAAA,gBAAgB,OAAA;AACvD,2CAAgD;AAAvC,8GAAA,gBAAgB,OAAA;AACzB,qCAA0C;AAAjC,wGAAA,aAAa,OAAA;AACtB,2CAA6D;AAApD,qGAAA,OAAO,OAAA;AAChB,mCAA6D;AAApD,qGAAA,WAAW,OAAA;AAAE,8GAAA,oBAAoB,OAAA;AAC1C,+BAAgC;AAAvB,8FAAA,MAAM,OAAA;AACf,iCAiBiB;AAhBf,kHAAA,yBAAyB,OAAA;AACzB,uGAAA,cAAc,OAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AAAA,iDAA+C;AAAtC,6GAAA,YAAY,OAAA;AACrB,mDAAgE;AAAvD,+GAAA,aAAa,OAAA;AAAE,+GAAA,aAAa,OAAA;AACrC,iCAMiB;AALf,0GAAA,iBAAiB,OAAA;AAMnB,iDAA8C;AAArC,4GAAA,WAAW,OAAA;AACpB,yDAAqF;AAA5E,oHAAA,eAAe,OAAA;AAAE,gHAAA,WAAW,OAAA;AAAE,qHAAA,gBAAgB,OAAA;AACvD,2CAAgD;AAAvC,8GAAA,gBAAgB,OAAA;AACzB,qCAA0C;AAAjC,wGAAA,aAAa,OAAA;AACtB,2CAA6D;AAApD,qGAAA,OAAO,OAAA;AAChB,mCAA6D;AAApD,qGAAA,WAAW,OAAA;AAAE,8GAAA,oBAAoB,OAAA;AAC1C,+BAAgC;AAAvB,8FAAA,MAAM,OAAA;AACf,iCAiBiB;AAhBf,kHAAA,yBAAyB,OAAA;AACzB,uGAAA,cAAc,OAAA"}
package/dist/metrics.d.ts CHANGED
@@ -4,10 +4,18 @@ type Labels = Record<string, string>;
4
4
  * endpoint delle metriche (o `@generazioneai/telemetry` lo legge). Nomi del contratto: events_outbox_pending,
5
5
  * events_outbox_oldest_seconds, events_published_total, events_delivered_total{consumer}, events_nak_total,
6
6
  * events_term_total, events_consumer_lag{consumer}.
7
+ *
8
+ * Le stesse serie passano anche all'API di OpenTelemetry (come fa `@generazioneai/jobs`): senza SDK sono no-op, con
9
+ * `@generazioneai/telemetry` le esporta il Collector e finiscono in VictoriaMetrics, dove le regole di allarme
10
+ * (`outbox-in-ritardo`, `consumer-in-ritardo`) le leggono. Nessun servizio deve aggiungere un endpoint.
7
11
  */
8
12
  export declare class EventsMetrics {
9
13
  private counters;
10
14
  private gauges;
15
+ private readonly gaugeLabels;
16
+ private readonly otelCounters;
17
+ private readonly otelGauges;
18
+ private readonly meter;
11
19
  private static key;
12
20
  inc(name: string, labels?: Labels, by?: number): void;
13
21
  set(name: string, value: number, labels?: Labels): void;
@@ -1 +1 @@
1
- {"version":3,"file":"metrics.d.ts","sourceRoot":"","sources":["../src/metrics.ts"],"names":[],"mappings":"AAEA,KAAK,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AAErC;;;;;GAKG;AACH,qBACa,aAAa;IACxB,OAAO,CAAC,QAAQ,CAA0C;IAC1D,OAAO,CAAC,MAAM,CAA0C;IAExD,OAAO,CAAC,MAAM,CAAC,GAAG;IAQlB,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,EAAE,EAAE,SAAI,GAAG,IAAI;IAOhD,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI;IAMvD,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM;IAK1C,MAAM,IAAI,MAAM;CAYjB"}
1
+ {"version":3,"file":"metrics.d.ts","sourceRoot":"","sources":["../src/metrics.ts"],"names":[],"mappings":"AAGA,KAAK,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AAErC;;;;;;;;;GASG;AACH,qBACa,aAAa;IACxB,OAAO,CAAC,QAAQ,CAA0C;IAC1D,OAAO,CAAC,MAAM,CAA0C;IACxD,OAAO,CAAC,QAAQ,CAAC,WAAW,CAA0C;IACtE,OAAO,CAAC,QAAQ,CAAC,YAAY,CAA8B;IAC3D,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAqB;IAChD,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAoD;IAE1E,OAAO,CAAC,MAAM,CAAC,GAAG;IAQlB,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,EAAE,EAAE,SAAI,GAAG,IAAI;IAahD,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI;IAmBvD,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM;IAK1C,MAAM,IAAI,MAAM;CAYjB"}
package/dist/metrics.js CHANGED
@@ -9,16 +9,25 @@ var EventsMetrics_1;
9
9
  Object.defineProperty(exports, "__esModule", { value: true });
10
10
  exports.EventsMetrics = void 0;
11
11
  const common_1 = require("@nestjs/common");
12
+ const api_1 = require("@opentelemetry/api");
12
13
  /**
13
14
  * Registro minimo di metriche (nessuna dipendenza). `render()` produce il testo Prometheus: il servizio lo aggiunge al suo
14
15
  * endpoint delle metriche (o `@generazioneai/telemetry` lo legge). Nomi del contratto: events_outbox_pending,
15
16
  * events_outbox_oldest_seconds, events_published_total, events_delivered_total{consumer}, events_nak_total,
16
17
  * events_term_total, events_consumer_lag{consumer}.
18
+ *
19
+ * Le stesse serie passano anche all'API di OpenTelemetry (come fa `@generazioneai/jobs`): senza SDK sono no-op, con
20
+ * `@generazioneai/telemetry` le esporta il Collector e finiscono in VictoriaMetrics, dove le regole di allarme
21
+ * (`outbox-in-ritardo`, `consumer-in-ritardo`) le leggono. Nessun servizio deve aggiungere un endpoint.
17
22
  */
18
23
  let EventsMetrics = EventsMetrics_1 = class EventsMetrics {
19
24
  constructor() {
20
25
  this.counters = new Map();
21
26
  this.gauges = new Map();
27
+ this.gaugeLabels = new Map();
28
+ this.otelCounters = new Map();
29
+ this.otelGauges = new Set();
30
+ this.meter = api_1.metrics.getMeter('@generazioneai/events');
22
31
  }
23
32
  static key(l) {
24
33
  if (!l)
@@ -33,11 +42,30 @@ let EventsMetrics = EventsMetrics_1 = class EventsMetrics {
33
42
  const k = EventsMetrics_1.key(labels);
34
43
  m.set(k, (m.get(k) ?? 0) + by);
35
44
  this.counters.set(name, m);
45
+ let c = this.otelCounters.get(name);
46
+ if (!c) {
47
+ c = this.meter.createCounter(name);
48
+ this.otelCounters.set(name, c);
49
+ }
50
+ c.add(by, labels ?? {});
36
51
  }
37
52
  set(name, value, labels) {
38
53
  const m = this.gauges.get(name) ?? new Map();
39
54
  m.set(EventsMetrics_1.key(labels), value);
40
55
  this.gauges.set(name, m);
56
+ const k = EventsMetrics_1.key(labels);
57
+ const l = this.gaugeLabels.get(name) ?? new Map();
58
+ l.set(k, labels ?? {});
59
+ this.gaugeLabels.set(name, l);
60
+ if (!this.otelGauges.has(name)) {
61
+ this.otelGauges.add(name);
62
+ // Il callback legge i valori correnti al momento dell'esportazione.
63
+ this.meter.createObservableGauge(name).addCallback((result) => {
64
+ for (const [key, value] of this.gauges.get(name) ?? []) {
65
+ result.observe(value, this.gaugeLabels.get(name)?.get(key) ?? {});
66
+ }
67
+ });
68
+ }
41
69
  }
42
70
  get(name, labels) {
43
71
  const k = EventsMetrics_1.key(labels);
@@ -1 +1 @@
1
- {"version":3,"file":"metrics.js","sourceRoot":"","sources":["../src/metrics.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"metrics.js","sourceRoot":"","sources":["../src/metrics.ts"],"names":[],"mappings":";;;;;;;;;;AAAA,2CAA4C;AAC5C,4CAAuE;AAIvE;;;;;;;;;GASG;AAEI,IAAM,aAAa,qBAAnB,MAAM,aAAa;IAAnB;QACG,aAAQ,GAAG,IAAI,GAAG,EAA+B,CAAC;QAClD,WAAM,GAAG,IAAI,GAAG,EAA+B,CAAC;QACvC,gBAAW,GAAG,IAAI,GAAG,EAA+B,CAAC;QACrD,iBAAY,GAAG,IAAI,GAAG,EAAmB,CAAC;QAC1C,eAAU,GAAG,IAAI,GAAG,EAAU,CAAC;QAC/B,UAAK,GAAU,aAAO,CAAC,QAAQ,CAAC,uBAAuB,CAAC,CAAC;IA2D5E,CAAC;IAzDS,MAAM,CAAC,GAAG,CAAC,CAAU;QAC3B,IAAI,CAAC,CAAC;YAAE,OAAO,EAAE,CAAC;QAClB,OAAO,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;aAClB,IAAI,EAAE;aACN,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,KAAK,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,GAAG,CAAC;aAChF,IAAI,CAAC,GAAG,CAAC,CAAC;IACf,CAAC;IAED,GAAG,CAAC,IAAY,EAAE,MAAe,EAAE,EAAE,GAAG,CAAC;QACvC,MAAM,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,IAAI,GAAG,EAAkB,CAAC;QAC/D,MAAM,CAAC,GAAG,eAAa,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QACpC,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC;QAC/B,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;QAC3B,IAAI,CAAC,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACpC,IAAI,CAAC,CAAC,EAAE,CAAC;YACP,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;YACnC,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;QACjC,CAAC;QACD,CAAC,CAAC,GAAG,CAAC,EAAE,EAAE,MAAM,IAAI,EAAE,CAAC,CAAC;IAC1B,CAAC;IAED,GAAG,CAAC,IAAY,EAAE,KAAa,EAAE,MAAe;QAC9C,MAAM,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,IAAI,GAAG,EAAkB,CAAC;QAC7D,CAAC,CAAC,GAAG,CAAC,eAAa,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,KAAK,CAAC,CAAC;QACxC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;QACzB,MAAM,CAAC,GAAG,eAAa,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QACpC,MAAM,CAAC,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,IAAI,GAAG,EAAkB,CAAC;QAClE,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,IAAI,EAAE,CAAC,CAAC;QACvB,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;QAC9B,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;YAC/B,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YAC1B,oEAAoE;YACpE,IAAI,CAAC,KAAK,CAAC,qBAAqB,CAAC,IAAI,CAAC,CAAC,WAAW,CAAC,CAAC,MAAM,EAAE,EAAE;gBAC5D,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC;oBACvD,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC;gBACpE,CAAC;YACH,CAAC,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,GAAG,CAAC,IAAY,EAAE,MAAe;QAC/B,MAAM,CAAC,GAAG,eAAa,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QACpC,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IAC/E,CAAC;IAED,MAAM;QACJ,MAAM,GAAG,GAAa,EAAE,CAAC;QACzB,MAAM,IAAI,GAAG,CAAC,IAAY,EAAE,GAAqC,EAAE,EAAE;YACnE,KAAK,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,GAAG,EAAE,CAAC;gBACjC,GAAG,CAAC,IAAI,CAAC,UAAU,IAAI,IAAI,IAAI,EAAE,CAAC,CAAC;gBACnC,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM;oBAAE,GAAG,CAAC,IAAI,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC;YAC5E,CAAC;QACH,CAAC,CAAC;QACF,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC/B,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;QAC3B,OAAO,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;IAC/B,CAAC;CACF,CAAA;AAjEY,sCAAa;wBAAb,aAAa;IADzB,IAAA,mBAAU,GAAE;GACA,aAAa,CAiEzB"}
@@ -1,24 +1,20 @@
1
- import type { EnqueueParams, PrismaTx, ResolvedEventsOptions } from './types';
2
- export declare const OUTBOX_INSERT = "INSERT INTO outbox_events\n (\"id\",\"subject\",\"aggregateType\",\"aggregateId\",\"aggregateVersion\",\"juridicalId\",\"payload\",\"headers\")\n VALUES ($1::uuid,$2,$3,$4,$5,$6,$7::jsonb,$8::jsonb)";
1
+ import { PrismaResolver } from './prisma-resolver';
2
+ import { OUTBOX_INSERT } from './store';
3
+ import type { EnqueueParams, ResolvedEventsOptions } from './types';
4
+ export { OUTBOX_INSERT };
3
5
  export declare class OutboxService {
4
6
  private readonly opts;
5
- /** Client di transazione già verificati (un `tx` vive quanto la sua transazione: la prova si fa una volta sola). */
6
- private readonly verified;
7
- constructor(opts: ResolvedEventsOptions);
7
+ private readonly persistence?;
8
+ constructor(opts: ResolvedEventsOptions, persistence?: PrismaResolver | undefined);
9
+ private get store();
8
10
  /**
9
- * Riconosce una transazione dal lato del database, non dalla forma del client (in Prisma 7 il `tx` ha anch'esso `$transaction`):
10
- * `SAVEPOINT` esiste solo dentro un blocco di transazione, altrimenti Postgres risponde 25P01. Con il client radice (una query
11
- * in autocommit) fallisce → `EVENTS_OUTSIDE_TX`. Un `tx` verificato non si riprova.
12
- */
13
- private assertInTransaction;
14
- /**
15
- * Scrive l'evento nell'outbox, nella stessa transazione del dato. `tx` è il client del callback di
16
- * `prisma.$transaction(async (tx) => …)`; fuori da una transazione (client radice, con `$transaction`) lancia
17
- * `EVENTS_OUTSIDE_TX`: niente «pubblica e speriamo».
11
+ * Scrive l'evento nell'outbox, nella stessa transazione del dato. `tx` è il client del callback della transazione del chiamante
12
+ * (`prisma.$transaction(async (tx) => …)` oppure `db.transaction(async (tx) => …)` di Drizzle, secondo lo store); fuori da una
13
+ * transazione (client radice) lancia `EVENTS_OUTSIDE_TX`: niente «pubblica e speriamo».
18
14
  *
19
15
  * Con `EVENTS_MODE=off` non scrive nulla e restituisce `null` (il controllo della transazione resta, per trovare i bug prima
20
16
  * dell'accensione). Altrimenti restituisce l'id dell'evento (UUID v7).
21
17
  */
22
- enqueue<T>(tx: PrismaTx, p: EnqueueParams<T>): Promise<string | null>;
18
+ enqueue<T>(tx: unknown, p: EnqueueParams<T>): Promise<string | null>;
23
19
  }
24
20
  //# sourceMappingURL=outbox.service.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"outbox.service.d.ts","sourceRoot":"","sources":["../src/outbox.service.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,aAAa,EAAE,QAAQ,EAAE,qBAAqB,EAAE,MAAM,SAAS,CAAC;AAG9E,eAAO,MAAM,aAAa,6MAE6B,CAAC;AAExD,qBACa,aAAa;IAIY,OAAO,CAAC,QAAQ,CAAC,IAAI;IAHzD,oHAAoH;IACpH,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAyB;gBAEG,IAAI,EAAE,qBAAqB;IAEhF;;;;OAIG;YACW,mBAAmB;IAiBjC;;;;;;;OAOG;IACG,OAAO,CAAC,CAAC,EAAE,EAAE,EAAE,QAAQ,EAAE,CAAC,EAAE,aAAa,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;CA+B5E"}
1
+ {"version":3,"file":"outbox.service.d.ts","sourceRoot":"","sources":["../src/outbox.service.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,EAAE,aAAa,EAAuC,MAAM,SAAS,CAAC;AAE7E,OAAO,KAAK,EAAE,aAAa,EAAE,qBAAqB,EAAE,MAAM,SAAS,CAAC;AAGpE,OAAO,EAAE,aAAa,EAAE,CAAC;AAKzB,qBACa,aAAa;IAEE,OAAO,CAAC,QAAQ,CAAC,IAAI;IACjC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAC;gBADA,IAAI,EAAE,qBAAqB,EACvC,WAAW,CAAC,EAAE,cAAc,YAAA;IAG3D,OAAO,KAAK,KAAK,GAEhB;IAED;;;;;;;OAOG;IACG,OAAO,CAAC,CAAC,EAAE,EAAE,EAAE,OAAO,EAAE,CAAC,EAAE,aAAa,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;CA+B3E"}
@@ -15,49 +15,34 @@ Object.defineProperty(exports, "__esModule", { value: true });
15
15
  exports.OutboxService = exports.OUTBOX_INSERT = void 0;
16
16
  const common_1 = require("@nestjs/common");
17
17
  const errors_1 = require("./errors");
18
+ const prisma_resolver_1 = require("./prisma-resolver");
19
+ const store_1 = require("./store");
20
+ Object.defineProperty(exports, "OUTBOX_INSERT", { enumerable: true, get: function () { return store_1.OUTBOX_INSERT; } });
18
21
  const tokens_1 = require("./tokens");
19
22
  const uuid_1 = require("./uuid");
20
- exports.OUTBOX_INSERT = `INSERT INTO outbox_events
21
- ("id","subject","aggregateType","aggregateId","aggregateVersion","juridicalId","payload","headers")
22
- VALUES ($1::uuid,$2,$3,$4,$5,$6,$7::jsonb,$8::jsonb)`;
23
+ /** Senza modulo (prove, codice non Nest) `enqueue` lavora sul solo `tx` di Prisma: non serve il client radice. */
24
+ const PRISMA_TX_ONLY = new store_1.PrismaOutboxStore();
23
25
  let OutboxService = class OutboxService {
24
- constructor(opts) {
26
+ constructor(opts, persistence) {
25
27
  this.opts = opts;
26
- /** Client di transazione già verificati (un `tx` vive quanto la sua transazione: la prova si fa una volta sola). */
27
- this.verified = new WeakSet();
28
+ this.persistence = persistence;
28
29
  }
29
- /**
30
- * Riconosce una transazione dal lato del database, non dalla forma del client (in Prisma 7 il `tx` ha anch'esso `$transaction`):
31
- * `SAVEPOINT` esiste solo dentro un blocco di transazione, altrimenti Postgres risponde 25P01. Con il client radice (una query
32
- * in autocommit) fallisce → `EVENTS_OUTSIDE_TX`. Un `tx` verificato non si riprova.
33
- */
34
- async assertInTransaction(tx, subject) {
35
- const outside = (cause) => new errors_1.EventsError('EVENTS_OUTSIDE_TX', `enqueue(${subject}) va chiamato dentro prisma.$transaction(async (tx) => …) passando il tx, non il client${cause ? ` (${cause?.message ?? cause})` : ''}`);
36
- if (!tx || typeof tx.$executeRawUnsafe !== 'function')
37
- throw outside();
38
- if (this.verified.has(tx))
39
- return;
40
- try {
41
- await tx.$executeRawUnsafe('SAVEPOINT genai_events_probe');
42
- await tx.$executeRawUnsafe('RELEASE SAVEPOINT genai_events_probe');
43
- }
44
- catch (e) {
45
- throw outside(e);
46
- }
47
- this.verified.add(tx);
30
+ get store() {
31
+ return this.persistence?.store() ?? PRISMA_TX_ONLY;
48
32
  }
49
33
  /**
50
- * Scrive l'evento nell'outbox, nella stessa transazione del dato. `tx` è il client del callback di
51
- * `prisma.$transaction(async (tx) => …)`; fuori da una transazione (client radice, con `$transaction`) lancia
52
- * `EVENTS_OUTSIDE_TX`: niente «pubblica e speriamo».
34
+ * Scrive l'evento nell'outbox, nella stessa transazione del dato. `tx` è il client del callback della transazione del chiamante
35
+ * (`prisma.$transaction(async (tx) => …)` oppure `db.transaction(async (tx) => …)` di Drizzle, secondo lo store); fuori da una
36
+ * transazione (client radice) lancia `EVENTS_OUTSIDE_TX`: niente «pubblica e speriamo».
53
37
  *
54
38
  * Con `EVENTS_MODE=off` non scrive nulla e restituisce `null` (il controllo della transazione resta, per trovare i bug prima
55
39
  * dell'accensione). Altrimenti restituisce l'id dell'evento (UUID v7).
56
40
  */
57
41
  async enqueue(tx, p) {
42
+ const store = this.store;
58
43
  if (this.opts.mode !== 'off')
59
- await this.assertInTransaction(tx, p?.subject);
60
- else if (!tx || typeof tx.$executeRawUnsafe !== 'function')
44
+ await store.assertInTransaction(tx, p?.subject);
45
+ else if (!store.accepts(tx))
61
46
  return null; // off non lancia mai
62
47
  const svc = this.opts.service;
63
48
  const ok = p.subject?.startsWith(`evt.${svc}.`) || p.subject === `audit.${svc}` || p.subject?.startsWith(`audit.${svc}.`);
@@ -75,7 +60,16 @@ let OutboxService = class OutboxService {
75
60
  const tp = this.opts.traceparent?.();
76
61
  if (tp)
77
62
  headers.traceparent = tp;
78
- await tx.$executeRawUnsafe(exports.OUTBOX_INSERT, id, p.subject, p.aggregate.type, p.aggregate.id, p.aggregate.version, p.juridicalId ?? null, JSON.stringify(p.data ?? null), JSON.stringify(headers));
63
+ await store.insert(tx, {
64
+ id,
65
+ subject: p.subject,
66
+ aggregateType: p.aggregate.type,
67
+ aggregateId: p.aggregate.id,
68
+ aggregateVersion: p.aggregate.version,
69
+ juridicalId: p.juridicalId ?? null,
70
+ payload: JSON.stringify(p.data ?? null),
71
+ headers: JSON.stringify(headers),
72
+ });
79
73
  return id;
80
74
  }
81
75
  };
@@ -83,6 +77,7 @@ exports.OutboxService = OutboxService;
83
77
  exports.OutboxService = OutboxService = __decorate([
84
78
  (0, common_1.Injectable)(),
85
79
  __param(0, (0, common_1.Inject)(tokens_1.EVENTS_OPTIONS)),
86
- __metadata("design:paramtypes", [Object])
80
+ __param(1, (0, common_1.Optional)()),
81
+ __metadata("design:paramtypes", [Object, prisma_resolver_1.PrismaResolver])
87
82
  ], OutboxService);
88
83
  //# sourceMappingURL=outbox.service.js.map