@generazioneai/events 0.1.1 → 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.
- package/CHANGELOG.md +27 -0
- package/README.md +55 -8
- package/dist/consumers.service.d.ts.map +1 -1
- package/dist/consumers.service.js +5 -7
- package/dist/consumers.service.js.map +1 -1
- package/dist/drizzle/index.d.ts +3 -0
- package/dist/drizzle/index.d.ts.map +1 -0
- package/dist/drizzle/index.js +10 -0
- package/dist/drizzle/index.js.map +1 -0
- package/dist/drizzle/schema.d.ts +279 -0
- package/dist/drizzle/schema.d.ts.map +1 -0
- package/dist/drizzle/schema.js +37 -0
- package/dist/drizzle/schema.js.map +1 -0
- package/dist/drizzle/store.d.ts +51 -0
- package/dist/drizzle/store.d.ts.map +1 -0
- package/dist/drizzle/store.js +118 -0
- package/dist/drizzle/store.js.map +1 -0
- package/dist/events.module.d.ts.map +1 -1
- package/dist/events.module.js +6 -2
- package/dist/events.module.js.map +1 -1
- package/dist/final-mode.d.ts +23 -0
- package/dist/final-mode.d.ts.map +1 -0
- package/dist/final-mode.js +56 -0
- package/dist/final-mode.js.map +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -1
- package/dist/index.js.map +1 -1
- package/dist/outbox.service.d.ts +11 -15
- package/dist/outbox.service.d.ts.map +1 -1
- package/dist/outbox.service.js +27 -32
- package/dist/outbox.service.js.map +1 -1
- package/dist/prisma-resolver.d.ts +9 -1
- package/dist/prisma-resolver.d.ts.map +1 -1
- package/dist/prisma-resolver.js +14 -1
- package/dist/prisma-resolver.js.map +1 -1
- package/dist/relay.service.d.ts.map +1 -1
- package/dist/relay.service.js +10 -14
- package/dist/relay.service.js.map +1 -1
- package/dist/store.d.ts +91 -0
- package/dist/store.d.ts.map +1 -0
- package/dist/store.js +78 -0
- package/dist/store.js.map +1 -0
- package/dist/types.d.ts +27 -9
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +9 -6
- package/dist/types.js.map +1 -1
- package/package.json +32 -5
- package/sql/002-events-outbox-inbox-snake-rientro.sql +3 -0
- 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;
|
|
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"}
|
package/dist/events.module.js
CHANGED
|
@@ -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
|
-
|
|
60
|
-
|
|
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":";;;;;;;;;;;;;;;;AAAA,2CAA8H;AAC9H,uCAA+C;AAC/C,6CAAgD;AAChD,2DAAsD;AACtD,uCAA0C;AAC1C,qDAAiD;AACjD,uDAAmD;AACnD,mDAA8C;AAC9C,qCAA8D;AAC9D,mCAA+F;AAIxF,IAAM,YAAY,oBAAlB,MAAM,YAAY;IAIvB,YAC0B,IAA4C,EACnD,IAAsB,EACtB,KAAkB,EAClB,SAA0B;QAHF,SAAI,GAAJ,IAAI,CAAuB;QACnD,SAAI,GAAJ,IAAI,CAAkB;QACtB,UAAK,GAAL,KAAK,CAAa;QAClB,cAAS,GAAT,SAAS,CAAiB;QAP5B,QAAG,GAAG,IAAI,eAAM,CAAC,QAAQ,CAAC,CAAC;QACpC,cAAS,GAAG,KAAK,CAAC;IAOvB,CAAC;IAEJ,MAAM,CAAC,OAAO,CAAC,OAA4B;QACzC,MAAM,QAAQ,GAAG,IAAA,sBAAc,EAAC,OAAO,CAAC,CAAC;QACzC,OAAO;YACL,MAAM,EAAE,cAAY;YACpB,MAAM,EAAE,IAAI;YACZ,OAAO,EAAE,CAAC,sBAAe,CAAC;YAC1B,SAAS,EAAE;gBACT,EAAE,OAAO,EAAE,2BAAkB,EAAE,QAAQ,EAAE,OAAO,EAAE;gBAClD,EAAE,OAAO,EAAE,uBAAc,EAAE,QAAQ,EAAE,QAAQ,EAAE;gBAC/C,uBAAa;gBACb,6BAAgB;gBAChB,gCAAc;gBACd,8BAAa;gBACb,2BAAW;gBACX,mCAAe;aAChB;YACD,OAAO,EAAE,CAAC,8BAAa,EAAE,uBAAa,EAAE,uBAAc,CAAC;SACxD,CAAC;IACJ,CAAC;IAED,4HAA4H;IAC5H,sBAAsB;QACpB,MAAM,EAAE,IAAI,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC;QAC5D,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,eAAe,IAAI,qBAAqB,aAAa,EAAE,CAAC,CAAC;QACtE,IAAI,aAAa,KAAK,
|
|
1
|
+
{"version":3,"file":"events.module.js","sourceRoot":"","sources":["../src/events.module.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,2CAA8H;AAC9H,uCAA+C;AAC/C,6CAAgD;AAChD,2DAAsD;AACtD,uCAA0C;AAC1C,qDAAiD;AACjD,uDAAmD;AACnD,mDAA8C;AAC9C,qCAA8D;AAC9D,mCAA+F;AAIxF,IAAM,YAAY,oBAAlB,MAAM,YAAY;IAIvB,YAC0B,IAA4C,EACnD,IAAsB,EACtB,KAAkB,EAClB,SAA0B;QAHF,SAAI,GAAJ,IAAI,CAAuB;QACnD,SAAI,GAAJ,IAAI,CAAkB;QACtB,UAAK,GAAL,KAAK,CAAa;QAClB,cAAS,GAAT,SAAS,CAAiB;QAP5B,QAAG,GAAG,IAAI,eAAM,CAAC,QAAQ,CAAC,CAAC;QACpC,cAAS,GAAG,KAAK,CAAC;IAOvB,CAAC;IAEJ,MAAM,CAAC,OAAO,CAAC,OAA4B;QACzC,MAAM,QAAQ,GAAG,IAAA,sBAAc,EAAC,OAAO,CAAC,CAAC;QACzC,OAAO;YACL,MAAM,EAAE,cAAY;YACpB,MAAM,EAAE,IAAI;YACZ,OAAO,EAAE,CAAC,sBAAe,CAAC;YAC1B,SAAS,EAAE;gBACT,EAAE,OAAO,EAAE,2BAAkB,EAAE,QAAQ,EAAE,OAAO,EAAE;gBAClD,EAAE,OAAO,EAAE,uBAAc,EAAE,QAAQ,EAAE,QAAQ,EAAE;gBAC/C,uBAAa;gBACb,6BAAgB;gBAChB,gCAAc;gBACd,8BAAa;gBACb,2BAAW;gBACX,mCAAe;aAChB;YACD,OAAO,EAAE,CAAC,8BAAa,EAAE,uBAAa,EAAE,uBAAc,CAAC;SACxD,CAAC;IACJ,CAAC;IAED,4HAA4H;IAC5H,sBAAsB;QACpB,MAAM,EAAE,IAAI,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC;QAC5D,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,eAAe,IAAI,qBAAqB,aAAa,EAAE,CAAC,CAAC;QACtE,mIAAmI;QACnI,IAAI,aAAa,KAAK,KAAK,IAAI,CAAC,MAAM,EAAE,CAAC;YACvC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,6GAA6G,CAAC,CAAC;QAC/H,CAAC;QACD,IAAI,aAAa,KAAK,KAAK,IAAI,CAAC,QAAQ,EAAE,CAAC;YACzC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,uHAAuH,CAAC,CAAC;QACzI,CAAC;QACD,IAAI,IAAI,KAAK,IAAI;YAAE,OAAO;QAC1B,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,CAAC;QAC1B,KAAK,IAAI,CAAC,IAAI,EAAE,CAAC;IACnB,CAAC;IAEO,KAAK,CAAC,IAAI;QAChB,OAAO,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;YACvB,IAAI,CAAC;gBACH,MAAM,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;gBACzB,MAAM,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,CAAC;gBAClC,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;gBACnB,MAAM,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC;gBAC7B,OAAO;YACT,CAAC;YAAC,OAAO,CAAM,EAAE,CAAC;gBAChB,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,+BAA+B,CAAC,EAAE,OAAO,IAAI,CAAC,oBAAoB,CAAC,CAAC;gBAClF,MAAM,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC;YACjD,CAAC;QACH,CAAC;IACH,CAAC;IAED,KAAK,CAAC,qBAAqB;QACzB,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;QACtB,MAAM,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;QACxB,MAAM,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC;QAC5B,MAAM,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;IAC1B,CAAC;CACF,CAAA;AApEY,oCAAY;uBAAZ,YAAY;IAFxB,IAAA,eAAM,GAAE;IACR,IAAA,eAAM,EAAC,EAAE,CAAC;IAMN,WAAA,IAAA,eAAM,EAAC,uBAAc,CAAC,CAAA;6CACA,6BAAgB;QACf,2BAAW;QACP,mCAAe;GARlC,YAAY,CAoExB"}
|
|
@@ -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';
|
package/dist/index.d.ts.map
CHANGED
|
@@ -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/outbox.service.d.ts
CHANGED
|
@@ -1,24 +1,20 @@
|
|
|
1
|
-
import
|
|
2
|
-
|
|
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
|
-
|
|
6
|
-
|
|
7
|
-
|
|
7
|
+
private readonly persistence?;
|
|
8
|
+
constructor(opts: ResolvedEventsOptions, persistence?: PrismaResolver | undefined);
|
|
9
|
+
private get store();
|
|
8
10
|
/**
|
|
9
|
-
*
|
|
10
|
-
* `
|
|
11
|
-
*
|
|
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:
|
|
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":"
|
|
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"}
|
package/dist/outbox.service.js
CHANGED
|
@@ -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
|
-
|
|
21
|
-
|
|
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
|
-
|
|
27
|
-
this.verified = new WeakSet();
|
|
28
|
+
this.persistence = persistence;
|
|
28
29
|
}
|
|
29
|
-
|
|
30
|
-
|
|
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
|
|
51
|
-
* `prisma.$transaction(async (tx) => …)
|
|
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
|
|
60
|
-
else if (!tx
|
|
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
|
|
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
|
-
|
|
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
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"outbox.service.js","sourceRoot":"","sources":["../src/outbox.service.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,
|
|
1
|
+
{"version":3,"file":"outbox.service.js","sourceRoot":"","sources":["../src/outbox.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,11 +1,19 @@
|
|
|
1
1
|
import { ModuleRef } from '@nestjs/core';
|
|
2
|
+
import { type OutboxStore } from './store';
|
|
2
3
|
import type { EventsModuleOptions, PrismaLike } from './types';
|
|
3
|
-
/**
|
|
4
|
+
/**
|
|
5
|
+
* Risolve la persistenza quando serve (non alla costruzione: il suo modulo può non essere ancora pronto): lo `store` di
|
|
6
|
+
* `EventsModule.forRoot({ store })` (Drizzle) oppure, di serie, quello di Prisma sopra `PrismaService`. Il nome è rimasto
|
|
7
|
+
* quello di quando c'era solo Prisma.
|
|
8
|
+
*/
|
|
4
9
|
export declare class PrismaResolver {
|
|
5
10
|
private readonly ref;
|
|
6
11
|
private readonly raw;
|
|
7
12
|
private cached?;
|
|
13
|
+
private cachedStore?;
|
|
8
14
|
constructor(ref: ModuleRef, raw: EventsModuleOptions);
|
|
9
15
|
get(): PrismaLike;
|
|
16
|
+
/** Lo store scelto in `forRoot`: `store` se c'è, altrimenti Prisma. Con tutti e due, vince `store`. */
|
|
17
|
+
store(): OutboxStore;
|
|
10
18
|
}
|
|
11
19
|
//# sourceMappingURL=prisma-resolver.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prisma-resolver.d.ts","sourceRoot":"","sources":["../src/prisma-resolver.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"prisma-resolver.d.ts","sourceRoot":"","sources":["../src/prisma-resolver.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAEzC,OAAO,EAAqB,KAAK,WAAW,EAAE,MAAM,SAAS,CAAC;AAE9D,OAAO,KAAK,EAAE,mBAAmB,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAE/D;;;;GAIG;AACH,qBACa,cAAc;IAIvB,OAAO,CAAC,QAAQ,CAAC,GAAG;IACQ,OAAO,CAAC,QAAQ,CAAC,GAAG;IAJlD,OAAO,CAAC,MAAM,CAAC,CAAa;IAC5B,OAAO,CAAC,WAAW,CAAC,CAAc;gBAEf,GAAG,EAAE,SAAS,EACc,GAAG,EAAE,mBAAmB;IAGvE,GAAG,IAAI,UAAU;IAajB,uGAAuG;IACvG,KAAK,IAAI,WAAW;CAMrB"}
|
package/dist/prisma-resolver.js
CHANGED
|
@@ -16,8 +16,13 @@ exports.PrismaResolver = void 0;
|
|
|
16
16
|
const common_1 = require("@nestjs/common");
|
|
17
17
|
const core_1 = require("@nestjs/core");
|
|
18
18
|
const errors_1 = require("./errors");
|
|
19
|
+
const store_1 = require("./store");
|
|
19
20
|
const tokens_1 = require("./tokens");
|
|
20
|
-
/**
|
|
21
|
+
/**
|
|
22
|
+
* Risolve la persistenza quando serve (non alla costruzione: il suo modulo può non essere ancora pronto): lo `store` di
|
|
23
|
+
* `EventsModule.forRoot({ store })` (Drizzle) oppure, di serie, quello di Prisma sopra `PrismaService`. Il nome è rimasto
|
|
24
|
+
* quello di quando c'era solo Prisma.
|
|
25
|
+
*/
|
|
21
26
|
let PrismaResolver = class PrismaResolver {
|
|
22
27
|
constructor(ref, raw) {
|
|
23
28
|
this.ref = ref;
|
|
@@ -36,6 +41,14 @@ let PrismaResolver = class PrismaResolver {
|
|
|
36
41
|
this.cached = inst;
|
|
37
42
|
return inst;
|
|
38
43
|
}
|
|
44
|
+
/** Lo store scelto in `forRoot`: `store` se c'è, altrimenti Prisma. Con tutti e due, vince `store`. */
|
|
45
|
+
store() {
|
|
46
|
+
if (this.cachedStore)
|
|
47
|
+
return this.cachedStore;
|
|
48
|
+
const s = this.raw.store ?? new store_1.PrismaOutboxStore(() => this.get());
|
|
49
|
+
this.cachedStore = s;
|
|
50
|
+
return s;
|
|
51
|
+
}
|
|
39
52
|
};
|
|
40
53
|
exports.PrismaResolver = PrismaResolver;
|
|
41
54
|
exports.PrismaResolver = PrismaResolver = __decorate([
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prisma-resolver.js","sourceRoot":"","sources":["../src/prisma-resolver.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,2CAAoD;AACpD,uCAAyC;AACzC,qCAAuC;AACvC,qCAA8C;AAG9C
|
|
1
|
+
{"version":3,"file":"prisma-resolver.js","sourceRoot":"","sources":["../src/prisma-resolver.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,2CAAoD;AACpD,uCAAyC;AACzC,qCAAuC;AACvC,mCAA8D;AAC9D,qCAA8C;AAG9C;;;;GAIG;AAEI,IAAM,cAAc,GAApB,MAAM,cAAc;IAGzB,YACmB,GAAc,EACc,GAAwB;QADpD,QAAG,GAAH,GAAG,CAAW;QACc,QAAG,GAAH,GAAG,CAAqB;IACpE,CAAC;IAEJ,GAAG;QACD,IAAI,IAAI,CAAC,MAAM;YAAE,OAAO,IAAI,CAAC,MAAM,CAAC;QACpC,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC;QAC1B,MAAM,IAAI,GAAG,CAAC,OAAO,CAAC,KAAK,UAAU,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,OAAO,CAAC,KAAK,QAAQ;YACrF,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAQ,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;YAC3C,CAAC,CAAC,CAAC,CAA2B,CAAC;QACjC,IAAI,CAAC,IAAI,IAAI,OAAO,IAAI,CAAC,YAAY,KAAK,UAAU,EAAE,CAAC;YACrD,MAAM,IAAI,oBAAW,CAAC,eAAe,EAAE,kFAAkF,CAAC,CAAC;QAC7H,CAAC;QACD,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;QACnB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,uGAAuG;IACvG,KAAK;QACH,IAAI,IAAI,CAAC,WAAW;YAAE,OAAO,IAAI,CAAC,WAAW,CAAC;QAC9C,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,IAAI,IAAI,yBAAiB,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;QACpE,IAAI,CAAC,WAAW,GAAG,CAAC,CAAC;QACrB,OAAO,CAAC,CAAC;IACX,CAAC;CACF,CAAA;AA5BY,wCAAc;yBAAd,cAAc;IAD1B,IAAA,mBAAU,GAAE;IAMR,WAAA,IAAA,eAAM,EAAC,2BAAkB,CAAC,CAAA;qCADL,gBAAS;GAJtB,cAAc,CA4B1B"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"relay.service.d.ts","sourceRoot":"","sources":["../src/relay.service.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAChD,OAAO,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"relay.service.d.ts","sourceRoot":"","sources":["../src/relay.service.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAChD,OAAO,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAGnD,OAAO,KAAK,EAAiB,qBAAqB,EAAE,MAAM,SAAS,CAAC;AAEpE;;;;;GAKG;AACH,qBACa,WAAW;IASI,OAAO,CAAC,QAAQ,CAAC,IAAI;IAC7C,OAAO,CAAC,QAAQ,CAAC,IAAI;IACrB,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,OAAO;IAX1B,OAAO,CAAC,QAAQ,CAAC,GAAG,CAA6B;IACjD,OAAO,CAAC,KAAK,CAAC,CAAiB;IAC/B,OAAO,CAAC,OAAO,CAAQ;IACvB,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,UAAU,CAAK;IACvB,OAAO,CAAC,SAAS,CAAK;gBAGqB,IAAI,EAAE,qBAAqB,EACnD,IAAI,EAAE,gBAAgB,EACtB,MAAM,EAAE,cAAc,EACtB,OAAO,EAAE,aAAa;IAGzC,KAAK,IAAI,IAAI;IAMP,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAM3B,OAAO,CAAC,QAAQ;YAKF,IAAI;IAYlB,6EAA6E;IACvE,SAAS,IAAI,OAAO,CAAC,MAAM,CAAC;YA+BpB,OAAO;YAuBP,YAAY;CAc3B"}
|