@ddd-ts-kit/prisma 0.0.0-stage → 0.1.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/README.md +629 -2
- package/dist/index.d.ts +20 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +22 -0
- package/dist/index.js.map +1 -0
- package/dist/outbox/locked-id-of.d.ts +2 -0
- package/dist/outbox/locked-id-of.d.ts.map +1 -0
- package/dist/outbox/locked-id-of.js +7 -0
- package/dist/outbox/locked-id-of.js.map +1 -0
- package/dist/outbox/locking-select.d.ts +4 -0
- package/dist/outbox/locking-select.d.ts.map +1 -0
- package/dist/outbox/locking-select.js +20 -0
- package/dist/outbox/locking-select.js.map +1 -0
- package/dist/outbox/payload-field.d.ts +9 -0
- package/dist/outbox/payload-field.d.ts.map +1 -0
- package/dist/outbox/payload-field.js +12 -0
- package/dist/outbox/payload-field.js.map +1 -0
- package/dist/outbox/prisma-json-input.d.ts +5 -0
- package/dist/outbox/prisma-json-input.d.ts.map +1 -0
- package/dist/outbox/prisma-json-input.js +2 -0
- package/dist/outbox/prisma-json-input.js.map +1 -0
- package/dist/outbox/prisma-outbox-claim.d.ts +25 -0
- package/dist/outbox/prisma-outbox-claim.d.ts.map +1 -0
- package/dist/outbox/prisma-outbox-claim.js +2 -0
- package/dist/outbox/prisma-outbox-claim.js.map +1 -0
- package/dist/outbox/prisma-outbox-delegate.d.ts +87 -0
- package/dist/outbox/prisma-outbox-delegate.d.ts.map +1 -0
- package/dist/outbox/prisma-outbox-delegate.js +2 -0
- package/dist/outbox/prisma-outbox-delegate.js.map +1 -0
- package/dist/outbox/prisma-outbox-store.d.ts +54 -0
- package/dist/outbox/prisma-outbox-store.d.ts.map +1 -0
- package/dist/outbox/prisma-outbox-store.js +150 -0
- package/dist/outbox/prisma-outbox-store.js.map +1 -0
- package/dist/outbox/prisma-processed-event-delegate.d.ts +17 -0
- package/dist/outbox/prisma-processed-event-delegate.d.ts.map +1 -0
- package/dist/outbox/prisma-processed-event-delegate.js +2 -0
- package/dist/outbox/prisma-processed-event-delegate.js.map +1 -0
- package/dist/outbox/prisma-processed-event-store.d.ts +19 -0
- package/dist/outbox/prisma-processed-event-store.d.ts.map +1 -0
- package/dist/outbox/prisma-processed-event-store.js +23 -0
- package/dist/outbox/prisma-processed-event-store.js.map +1 -0
- package/dist/outbox/prisma-raw-queries.d.ts +5 -0
- package/dist/outbox/prisma-raw-queries.d.ts.map +1 -0
- package/dist/outbox/prisma-raw-queries.js +2 -0
- package/dist/outbox/prisma-raw-queries.js.map +1 -0
- package/dist/outbox/to-outbox-record.d.ts +4 -0
- package/dist/outbox/to-outbox-record.d.ts.map +1 -0
- package/dist/outbox/to-outbox-record.js +25 -0
- package/dist/outbox/to-outbox-record.js.map +1 -0
- package/dist/read-model/criteria-to-prisma.d.ts +10 -0
- package/dist/read-model/criteria-to-prisma.d.ts.map +1 -0
- package/dist/read-model/criteria-to-prisma.js +23 -0
- package/dist/read-model/criteria-to-prisma.js.map +1 -0
- package/dist/read-model/predicate-to-prisma.d.ts +11 -0
- package/dist/read-model/predicate-to-prisma.d.ts.map +1 -0
- package/dist/read-model/predicate-to-prisma.js +41 -0
- package/dist/read-model/predicate-to-prisma.js.map +1 -0
- package/dist/read-model/prisma-criteria.d.ts +13 -0
- package/dist/read-model/prisma-criteria.d.ts.map +1 -0
- package/dist/read-model/prisma-criteria.js +2 -0
- package/dist/read-model/prisma-criteria.js.map +1 -0
- package/dist/read-model/prisma-model-rows.d.ts +17 -0
- package/dist/read-model/prisma-model-rows.d.ts.map +1 -0
- package/dist/read-model/prisma-model-rows.js +50 -0
- package/dist/read-model/prisma-model-rows.js.map +1 -0
- package/dist/read-model/prisma-read-model-delegate.d.ts +21 -0
- package/dist/read-model/prisma-read-model-delegate.d.ts.map +1 -0
- package/dist/read-model/prisma-read-model-delegate.js +2 -0
- package/dist/read-model/prisma-read-model-delegate.js.map +1 -0
- package/dist/read-model/prisma-read-model-options.d.ts +13 -0
- package/dist/read-model/prisma-read-model-options.d.ts.map +1 -0
- package/dist/read-model/prisma-read-model-options.js +2 -0
- package/dist/read-model/prisma-read-model-options.js.map +1 -0
- package/dist/read-model/prisma-read-model-store.d.ts +17 -0
- package/dist/read-model/prisma-read-model-store.d.ts.map +1 -0
- package/dist/read-model/prisma-read-model-store.js +13 -0
- package/dist/read-model/prisma-read-model-store.js.map +1 -0
- package/dist/read-model/prisma-read-model-table.d.ts +32 -0
- package/dist/read-model/prisma-read-model-table.d.ts.map +1 -0
- package/dist/read-model/prisma-read-model-table.js +84 -0
- package/dist/read-model/prisma-read-model-table.js.map +1 -0
- package/dist/read-model/prisma-table-rows.d.ts +27 -0
- package/dist/read-model/prisma-table-rows.d.ts.map +1 -0
- package/dist/read-model/prisma-table-rows.js +59 -0
- package/dist/read-model/prisma-table-rows.js.map +1 -0
- package/dist/read-model/row.mapper.d.ts +17 -0
- package/dist/read-model/row.mapper.d.ts.map +1 -0
- package/dist/read-model/row.mapper.js +58 -0
- package/dist/read-model/row.mapper.js.map +1 -0
- package/dist/read-model/stamped-row-of.d.ts +11 -0
- package/dist/read-model/stamped-row-of.d.ts.map +1 -0
- package/dist/read-model/stamped-row-of.js +13 -0
- package/dist/read-model/stamped-row-of.js.map +1 -0
- package/dist/read-model/written-of.d.ts +4 -0
- package/dist/read-model/written-of.d.ts.map +1 -0
- package/dist/read-model/written-of.js +12 -0
- package/dist/read-model/written-of.js.map +1 -0
- package/dist/unit-of-work/create-prisma-unit-of-work.d.ts +18 -0
- package/dist/unit-of-work/create-prisma-unit-of-work.d.ts.map +1 -0
- package/dist/unit-of-work/create-prisma-unit-of-work.js +30 -0
- package/dist/unit-of-work/create-prisma-unit-of-work.js.map +1 -0
- package/dist/unit-of-work/prisma-context.d.ts +15 -0
- package/dist/unit-of-work/prisma-context.d.ts.map +1 -0
- package/dist/unit-of-work/prisma-context.js +14 -0
- package/dist/unit-of-work/prisma-context.js.map +1 -0
- package/dist/unit-of-work/prisma-transaction-client.d.ts +8 -0
- package/dist/unit-of-work/prisma-transaction-client.d.ts.map +1 -0
- package/dist/unit-of-work/prisma-transaction-client.js +2 -0
- package/dist/unit-of-work/prisma-transaction-client.js.map +1 -0
- package/dist/unit-of-work/prisma-transaction-host.d.ts +9 -0
- package/dist/unit-of-work/prisma-transaction-host.d.ts.map +1 -0
- package/dist/unit-of-work/prisma-transaction-host.js +2 -0
- package/dist/unit-of-work/prisma-transaction-host.js.map +1 -0
- package/package.json +44 -4
- package/prisma/outbox.mysql.prisma +40 -0
- package/prisma/outbox.postgresql.prisma +43 -0
- package/prisma/outbox.sqlite.prisma +42 -0
- package/prisma/read-model.postgresql.prisma +26 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,oBAAoB,EACpB,gBAAgB,EAChB,gBAAgB;AAChB,oFAAoF;AACpF,YAAY,GAEb,MAAM,oBAAoB,CAAC;AAC5B,cAAc,2CAA2C,CAAC;AAC1D,cAAc,6CAA6C,CAAC;AAC5D,cAAc,kCAAkC,CAAC;AACjD,cAAc,8CAA8C,CAAC;AAC7D,cAAc,+BAA+B,CAAC;AAC9C,cAAc,oCAAoC,CAAC;AACnD,cAAc,gCAAgC,CAAC;AAC/C,cAAc,iCAAiC,CAAC;AAChD,cAAc,iCAAiC,CAAC;AAChD,cAAc,6CAA6C,CAAC;AAC5D,cAAc,0CAA0C,CAAC;AACzD,cAAc,iCAAiC,CAAC;AAChD,cAAc,qCAAqC,CAAC;AACpD,cAAc,oCAAoC,CAAC;AACnD,cAAc,4CAA4C,CAAC;AAC3D,cAAc,2CAA2C,CAAC;AAC1D,cAAc,yCAAyC,CAAC;AACxD,cAAc,yCAAyC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"locked-id-of.d.ts","sourceRoot":"","sources":["../../src/outbox/locked-id-of.ts"],"names":[],"mappings":"AAAA,wBAAgB,UAAU,CAAC,GAAG,EAAE,OAAO,GAAG,MAAM,CAM/C"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export function lockedIdOf(row) {
|
|
2
|
+
if (typeof row === 'object' && row !== null && 'id' in row && typeof row.id === 'string') {
|
|
3
|
+
return row.id;
|
|
4
|
+
}
|
|
5
|
+
throw new TypeError('The locking select of the outbox returned a row without an id');
|
|
6
|
+
}
|
|
7
|
+
//# sourceMappingURL=locked-id-of.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"locked-id-of.js","sourceRoot":"","sources":["../../src/outbox/locked-id-of.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,UAAU,CAAC,GAAY;IACrC,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,OAAO,GAAG,CAAC,EAAE,KAAK,QAAQ,EAAE,CAAC;QACzF,OAAO,GAAG,CAAC,EAAE,CAAC;IAChB,CAAC;IAED,MAAM,IAAI,SAAS,CAAC,+DAA+D,CAAC,CAAC;AACvF,CAAC"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { PrismaSkipLockedClaim } from './prisma-outbox-claim.js';
|
|
2
|
+
/** The statement Prisma Client cannot express. Identifiers are checked: this is unsafe raw SQL. */
|
|
3
|
+
export declare function lockingSelect(claim: Pick<PrismaSkipLockedClaim<never>, 'dialect' | 'schema' | 'table'>): string;
|
|
4
|
+
//# sourceMappingURL=locking-select.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"locking-select.d.ts","sourceRoot":"","sources":["../../src/outbox/locking-select.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;AAItE,mGAAmG;AACnG,wBAAgB,aAAa,CAAC,KAAK,EAAE,IAAI,CAAC,qBAAqB,CAAC,KAAK,CAAC,EAAE,SAAS,GAAG,QAAQ,GAAG,OAAO,CAAC,GAAG,MAAM,CAmB/G"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
const IDENTIFIER = /^[A-Za-z_][A-Za-z0-9_]*$/;
|
|
2
|
+
/** The statement Prisma Client cannot express. Identifiers are checked: this is unsafe raw SQL. */
|
|
3
|
+
export function lockingSelect(claim) {
|
|
4
|
+
const names = [claim.schema, claim.table ?? 'outbox'].filter((name) => name !== undefined);
|
|
5
|
+
for (const name of names) {
|
|
6
|
+
if (!IDENTIFIER.test(name)) {
|
|
7
|
+
throw new TypeError(`"${name}" is not a plain SQL identifier`);
|
|
8
|
+
}
|
|
9
|
+
}
|
|
10
|
+
const postgres = claim.dialect === 'postgresql';
|
|
11
|
+
const quote = (name) => (postgres ? `"${name}"` : `\`${name}\``);
|
|
12
|
+
const parameter = (position) => (postgres ? `$${position}` : '?');
|
|
13
|
+
return [
|
|
14
|
+
`select ${quote('id')} from ${names.map(quote).join('.')}`,
|
|
15
|
+
`where ${quote('status')} = ${parameter(1)} and ${quote('next_attempt_at')} <= ${parameter(2)}`,
|
|
16
|
+
`order by ${quote('next_attempt_at')}, ${quote('sequence')} limit ${parameter(3)}`,
|
|
17
|
+
'for update skip locked',
|
|
18
|
+
].join(' ');
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=locking-select.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"locking-select.js","sourceRoot":"","sources":["../../src/outbox/locking-select.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,GAAG,0BAA0B,CAAC;AAE9C,mGAAmG;AACnG,MAAM,UAAU,aAAa,CAAC,KAAyE;IACrG,MAAM,KAAK,GAAG,CAAC,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,KAAK,IAAI,QAAQ,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC;IAE3F,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YAC3B,MAAM,IAAI,SAAS,CAAC,IAAI,IAAI,iCAAiC,CAAC,CAAC;QACjE,CAAC;IACH,CAAC;IAED,MAAM,QAAQ,GAAG,KAAK,CAAC,OAAO,KAAK,YAAY,CAAC;IAChD,MAAM,KAAK,GAAG,CAAC,IAAY,EAAU,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,IAAI,GAAG,CAAC,CAAC,CAAC,KAAK,IAAI,IAAI,CAAC,CAAC;IACjF,MAAM,SAAS,GAAG,CAAC,QAAgB,EAAU,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,QAAQ,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;IAElF,OAAO;QACL,UAAU,KAAK,CAAC,IAAI,CAAC,SAAS,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE;QAC1D,SAAS,KAAK,CAAC,QAAQ,CAAC,MAAM,SAAS,CAAC,CAAC,CAAC,QAAQ,KAAK,CAAC,iBAAiB,CAAC,OAAO,SAAS,CAAC,CAAC,CAAC,EAAE;QAC/F,YAAY,KAAK,CAAC,iBAAiB,CAAC,KAAK,KAAK,CAAC,UAAU,CAAC,UAAU,SAAS,CAAC,CAAC,CAAC,EAAE;QAClF,wBAAwB;KACzB,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACd,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { PrismaJsonInput } from './prisma-json-input.js';
|
|
2
|
+
/**
|
|
3
|
+
* A JSON `null` payload is left out and stored as SQL NULL: Prisma refuses a bare null in a
|
|
4
|
+
* Json field and its sentinels live in the generated client.
|
|
5
|
+
*/
|
|
6
|
+
export declare function payloadField(payload: unknown): {
|
|
7
|
+
payload?: PrismaJsonInput;
|
|
8
|
+
};
|
|
9
|
+
//# sourceMappingURL=payload-field.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"payload-field.d.ts","sourceRoot":"","sources":["../../src/outbox/payload-field.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAE9D;;;GAGG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,OAAO,GAAG;IAAE,OAAO,CAAC,EAAE,eAAe,CAAA;CAAE,CAO5E"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A JSON `null` payload is left out and stored as SQL NULL: Prisma refuses a bare null in a
|
|
3
|
+
* Json field and its sentinels live in the generated client.
|
|
4
|
+
*/
|
|
5
|
+
export function payloadField(payload) {
|
|
6
|
+
if (payload === null || payload === undefined) {
|
|
7
|
+
return {};
|
|
8
|
+
}
|
|
9
|
+
// eslint-disable-next-line ddd-ts-kit/clean-no-escape-hatch -- the payload of an integration event is JSON by contract and typed `unknown` by the kernel; checking it here would walk every payload a second time
|
|
10
|
+
return { payload: payload };
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=payload-field.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"payload-field.js","sourceRoot":"","sources":["../../src/outbox/payload-field.ts"],"names":[],"mappings":"AAEA;;;GAGG;AACH,MAAM,UAAU,YAAY,CAAC,OAAgB;IAC3C,IAAI,OAAO,KAAK,IAAI,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;QAC9C,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,kNAAkN;IAClN,OAAO,EAAE,OAAO,EAAE,OAA0B,EAAE,CAAC;AACjD,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prisma-json-input.d.ts","sourceRoot":"","sources":["../../src/outbox/prisma-json-input.ts"],"names":[],"mappings":"AAAA,2DAA2D;AAC3D,MAAM,MAAM,eAAe,GACvB,MAAM,GACN,MAAM,GACN,OAAO,GACP;IAAE,QAAQ,EAAE,GAAG,EAAE,MAAM,GAAG,eAAe,GAAG,IAAI,CAAA;CAAE,GAClD,SAAS,CAAC,eAAe,GAAG,IAAI,CAAC,EAAE,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prisma-json-input.js","sourceRoot":"","sources":["../../src/outbox/prisma-json-input.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { PrismaRawQueries } from './prisma-raw-queries.js';
|
|
2
|
+
/**
|
|
3
|
+
* How concurrent relays share the pending records.
|
|
4
|
+
* - `compare-and-set`: reads the due records, then takes each with an `updateMany` guarded by
|
|
5
|
+
* the attempt count it read. Plain Prisma Client calls, on any database, at one statement
|
|
6
|
+
* per record.
|
|
7
|
+
* - `skip-locked`: one locking select and one update in a short transaction.
|
|
8
|
+
*/
|
|
9
|
+
export type PrismaOutboxClaim<Tx> = 'compare-and-set' | PrismaSkipLockedClaim<Tx>;
|
|
10
|
+
/**
|
|
11
|
+
* Claims with `SELECT ... FOR UPDATE SKIP LOCKED`. Prisma Client has no row-locking API, so
|
|
12
|
+
* that one statement goes through `$queryRawUnsafe`, which is why the store must be told the
|
|
13
|
+
* dialect and the real name of the table. Needs PostgreSQL or MySQL 8.
|
|
14
|
+
*/
|
|
15
|
+
export interface PrismaSkipLockedClaim<Tx> {
|
|
16
|
+
readonly strategy: 'skip-locked';
|
|
17
|
+
readonly dialect: 'postgresql' | 'mysql';
|
|
18
|
+
/** The raw-query capability of a client: `(client) => client`. */
|
|
19
|
+
readonly raw: (client: Tx) => PrismaRawQueries;
|
|
20
|
+
/** The schema (PostgreSQL) or database (MySQL) of the table. Default: that of the connection. */
|
|
21
|
+
readonly schema?: string;
|
|
22
|
+
/** The table the model is mapped to. Default `outbox`. */
|
|
23
|
+
readonly table?: string;
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=prisma-outbox-claim.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prisma-outbox-claim.d.ts","sourceRoot":"","sources":["../../src/outbox/prisma-outbox-claim.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAEhE;;;;;;GAMG;AACH,MAAM,MAAM,iBAAiB,CAAC,EAAE,IAAI,iBAAiB,GAAG,qBAAqB,CAAC,EAAE,CAAC,CAAC;AAElF;;;;GAIG;AACH,MAAM,WAAW,qBAAqB,CAAC,EAAE;IACvC,QAAQ,CAAC,QAAQ,EAAE,aAAa,CAAC;IACjC,QAAQ,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC;IACzC,kEAAkE;IAClE,QAAQ,CAAC,GAAG,EAAE,CAAC,MAAM,EAAE,EAAE,KAAK,gBAAgB,CAAC;IAC/C,iGAAiG;IACjG,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,0DAA0D;IAC1D,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;CACzB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prisma-outbox-claim.js","sourceRoot":"","sources":["../../src/outbox/prisma-outbox-claim.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
import type { OutboxStatus } from '@ddd-ts-kit/events';
|
|
2
|
+
import type { PrismaJsonInput } from './prisma-json-input.js';
|
|
3
|
+
/**
|
|
4
|
+
* The methods the store calls on the outbox model, typed structurally so the package does not
|
|
5
|
+
* depend on your generated client: `client.outboxRecord` fits as is.
|
|
6
|
+
*/
|
|
7
|
+
export interface PrismaOutboxDelegate {
|
|
8
|
+
createMany(args: {
|
|
9
|
+
data: PrismaOutboxInsert[];
|
|
10
|
+
}): Promise<unknown>;
|
|
11
|
+
findMany(args: {
|
|
12
|
+
where: PrismaOutboxWhere;
|
|
13
|
+
orderBy?: [{
|
|
14
|
+
nextAttemptAt: 'asc';
|
|
15
|
+
}, {
|
|
16
|
+
sequence: 'asc';
|
|
17
|
+
}];
|
|
18
|
+
take?: number;
|
|
19
|
+
}): Promise<PrismaOutboxRow[]>;
|
|
20
|
+
updateMany(args: {
|
|
21
|
+
where: PrismaOutboxWhere;
|
|
22
|
+
data: PrismaOutboxUpdate;
|
|
23
|
+
}): Promise<{
|
|
24
|
+
count: number;
|
|
25
|
+
}>;
|
|
26
|
+
deleteMany(args: {
|
|
27
|
+
where: PrismaOutboxWhere;
|
|
28
|
+
}): Promise<{
|
|
29
|
+
count: number;
|
|
30
|
+
}>;
|
|
31
|
+
count(args: {
|
|
32
|
+
where: PrismaOutboxWhere;
|
|
33
|
+
}): Promise<number>;
|
|
34
|
+
}
|
|
35
|
+
/** The outbox model as Prisma returns it: the fields of the shipped schema fragment. */
|
|
36
|
+
export interface PrismaOutboxRow {
|
|
37
|
+
readonly id: string;
|
|
38
|
+
readonly type: string;
|
|
39
|
+
readonly version: number;
|
|
40
|
+
readonly occurredAt: string;
|
|
41
|
+
readonly payload: unknown;
|
|
42
|
+
readonly traceparent: string | null;
|
|
43
|
+
readonly correlationId: string | null;
|
|
44
|
+
readonly status: string;
|
|
45
|
+
readonly attempts: number;
|
|
46
|
+
readonly nextAttemptAt: Date;
|
|
47
|
+
readonly lastErrorCode: string | null;
|
|
48
|
+
readonly publishedAt: Date | null;
|
|
49
|
+
}
|
|
50
|
+
export interface PrismaOutboxInsert {
|
|
51
|
+
id: string;
|
|
52
|
+
type: string;
|
|
53
|
+
version: number;
|
|
54
|
+
occurredAt: string;
|
|
55
|
+
payload?: PrismaJsonInput;
|
|
56
|
+
traceparent: string | null;
|
|
57
|
+
correlationId: string | null;
|
|
58
|
+
nextAttemptAt: Date;
|
|
59
|
+
}
|
|
60
|
+
export interface PrismaOutboxWhere {
|
|
61
|
+
id?: string | {
|
|
62
|
+
in: string[];
|
|
63
|
+
};
|
|
64
|
+
status?: OutboxStatus | {
|
|
65
|
+
not: OutboxStatus;
|
|
66
|
+
};
|
|
67
|
+
attempts?: number;
|
|
68
|
+
nextAttemptAt?: {
|
|
69
|
+
lte: Date;
|
|
70
|
+
};
|
|
71
|
+
publishedAt?: {
|
|
72
|
+
lt: Date;
|
|
73
|
+
};
|
|
74
|
+
lastErrorCode?: {
|
|
75
|
+
not: null;
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
export interface PrismaOutboxUpdate {
|
|
79
|
+
status?: OutboxStatus;
|
|
80
|
+
attempts?: number | {
|
|
81
|
+
increment: number;
|
|
82
|
+
};
|
|
83
|
+
nextAttemptAt?: Date;
|
|
84
|
+
lastErrorCode?: string;
|
|
85
|
+
publishedAt?: Date;
|
|
86
|
+
}
|
|
87
|
+
//# sourceMappingURL=prisma-outbox-delegate.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prisma-outbox-delegate.d.ts","sourceRoot":"","sources":["../../src/outbox/prisma-outbox-delegate.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prisma-outbox-delegate.js","sourceRoot":"","sources":["../../src/outbox/prisma-outbox-delegate.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import type { IntegrationEvent } from '@ddd-ts-kit/kernel';
|
|
2
|
+
import type { OutboxRecord, OutboxStats, OutboxStore } from '@ddd-ts-kit/events';
|
|
3
|
+
import type { PrismaUnitOfWork } from '../unit-of-work/create-prisma-unit-of-work.js';
|
|
4
|
+
import type { PrismaOutboxClaim } from './prisma-outbox-claim.js';
|
|
5
|
+
import type { PrismaOutboxDelegate } from './prisma-outbox-delegate.js';
|
|
6
|
+
export interface PrismaOutboxStoreOptions<Tx> {
|
|
7
|
+
/** How to reach the outbox model from a client: `(client) => client.outboxRecord`. */
|
|
8
|
+
readonly delegate: (client: Tx) => PrismaOutboxDelegate;
|
|
9
|
+
/**
|
|
10
|
+
* Required, because Prisma does not tell which database it talks to: choose
|
|
11
|
+
* `compare-and-set`, or describe the table for `skip-locked`.
|
|
12
|
+
*/
|
|
13
|
+
readonly claim: PrismaOutboxClaim<Tx>;
|
|
14
|
+
/** How long a claimed record stays invisible to other claims. Default 30000. */
|
|
15
|
+
readonly leaseMs?: number;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* The outbox through Prisma Client. `append` runs on the client of the unit of work: called
|
|
19
|
+
* inside `run`, the events are written by the transaction of the command and share its fate,
|
|
20
|
+
* which is the whole point of an outbox.
|
|
21
|
+
*/
|
|
22
|
+
export declare class PrismaOutboxStore<Tx> implements OutboxStore {
|
|
23
|
+
private readonly unitOfWork;
|
|
24
|
+
private readonly modelOf;
|
|
25
|
+
/** Absent when claiming by compare-and-set. */
|
|
26
|
+
private readonly lockingClaim;
|
|
27
|
+
private readonly leaseDurationMs;
|
|
28
|
+
constructor(unitOfWork: PrismaUnitOfWork<Tx>, options: PrismaOutboxStoreOptions<Tx>);
|
|
29
|
+
append(events: readonly IntegrationEvent[]): Promise<void>;
|
|
30
|
+
claimBatch(limit: number, now: Date): Promise<OutboxRecord[]>;
|
|
31
|
+
markPublished(ids: readonly string[], at: Date): Promise<void>;
|
|
32
|
+
markFailed(id: string, error: {
|
|
33
|
+
readonly code: string;
|
|
34
|
+
}, nextAttemptAt: Date | null): Promise<void>;
|
|
35
|
+
retryDead(ids: readonly string[], now: Date): Promise<number>;
|
|
36
|
+
purgePublished(before: Date): Promise<number>;
|
|
37
|
+
stats(): Promise<OutboxStats>;
|
|
38
|
+
/**
|
|
39
|
+
* Takes each due row with an update that only applies if nobody claimed it since it was
|
|
40
|
+
* read: every claim increments `attempts`, so an unchanged count on a row that is still due
|
|
41
|
+
* means the row is free. Rows lost to another relay are replaced by reading again.
|
|
42
|
+
*/
|
|
43
|
+
private claimByCompareAndSet;
|
|
44
|
+
/**
|
|
45
|
+
* Selects the due rows `FOR UPDATE SKIP LOCKED`, so concurrent relays pass over each other's
|
|
46
|
+
* rows instead of waiting, then leases them in the same transaction by pushing
|
|
47
|
+
* `nextAttemptAt` forward. It joins the current unit of work or opens a short one of its own:
|
|
48
|
+
* the row locks last a few milliseconds, the lease is what covers the publication.
|
|
49
|
+
*/
|
|
50
|
+
private claimSkippingLocked;
|
|
51
|
+
private outbox;
|
|
52
|
+
private lease;
|
|
53
|
+
}
|
|
54
|
+
//# sourceMappingURL=prisma-outbox-store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prisma-outbox-store.d.ts","sourceRoot":"","sources":["../../src/outbox/prisma-outbox-store.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAC3D,OAAO,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjF,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,+CAA+C,CAAC;AAItF,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAClE,OAAO,KAAK,EAAE,oBAAoB,EAAuC,MAAM,6BAA6B,CAAC;AAI7G,MAAM,WAAW,wBAAwB,CAAC,EAAE;IAC1C,sFAAsF;IACtF,QAAQ,CAAC,QAAQ,EAAE,CAAC,MAAM,EAAE,EAAE,KAAK,oBAAoB,CAAC;IACxD;;;OAGG;IACH,QAAQ,CAAC,KAAK,EAAE,iBAAiB,CAAC,EAAE,CAAC,CAAC;IACtC,gFAAgF;IAChF,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;CAC3B;AAUD;;;;GAIG;AACH,qBAAa,iBAAiB,CAAC,EAAE,CAAE,YAAW,WAAW;IACvD,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAuB;IAElD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAuC;IAE/D,+CAA+C;IAC/C,OAAO,CAAC,QAAQ,CAAC,YAAY,CAA+B;IAE5D,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAS;IAEzC,YAAY,UAAU,EAAE,gBAAgB,CAAC,EAAE,CAAC,EAAE,OAAO,EAAE,wBAAwB,CAAC,EAAE,CAAC,EAQlF;IAEK,MAAM,CAAC,MAAM,EAAE,SAAS,gBAAgB,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAiB/D;IAEK,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,CAalE;IAEK,aAAa,CAAC,GAAG,EAAE,SAAS,MAAM,EAAE,EAAE,EAAE,EAAE,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CASnE;IAEK,UAAU,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE;QAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;KAAE,EAAE,aAAa,EAAE,IAAI,GAAG,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAQxG;IAEK,SAAS,CAAC,GAAG,EAAE,SAAS,MAAM,EAAE,EAAE,GAAG,EAAE,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,CAWlE;IAEK,cAAc,CAAC,MAAM,EAAE,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,CAMlD;IAEK,KAAK,IAAI,OAAO,CAAC,WAAW,CAAC,CAQlC;IAED;;;;OAIG;YACW,oBAAoB;IAgClC;;;;;OAKG;IACH,OAAO,CAAC,mBAAmB;IAmB3B,OAAO,CAAC,MAAM;IAId,OAAO,CAAC,KAAK;CAGd"}
|
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
import { lockedIdOf } from './locked-id-of.js';
|
|
2
|
+
import { lockingSelect } from './locking-select.js';
|
|
3
|
+
import { payloadField } from './payload-field.js';
|
|
4
|
+
import { toOutboxRecord } from './to-outbox-record.js';
|
|
5
|
+
// A fresh record is due at once, whatever clock the relay runs on.
|
|
6
|
+
const DUE_IMMEDIATELY = new Date(0);
|
|
7
|
+
/**
|
|
8
|
+
* The outbox through Prisma Client. `append` runs on the client of the unit of work: called
|
|
9
|
+
* inside `run`, the events are written by the transaction of the command and share its fate,
|
|
10
|
+
* which is the whole point of an outbox.
|
|
11
|
+
*/
|
|
12
|
+
export class PrismaOutboxStore {
|
|
13
|
+
unitOfWork;
|
|
14
|
+
modelOf;
|
|
15
|
+
/** Absent when claiming by compare-and-set. */
|
|
16
|
+
lockingClaim;
|
|
17
|
+
leaseDurationMs;
|
|
18
|
+
constructor(unitOfWork, options) {
|
|
19
|
+
this.unitOfWork = unitOfWork;
|
|
20
|
+
this.modelOf = options.delegate;
|
|
21
|
+
this.lockingClaim =
|
|
22
|
+
options.claim === 'compare-and-set' ? undefined : { sql: lockingSelect(options.claim), raw: options.claim.raw };
|
|
23
|
+
this.leaseDurationMs = options.leaseMs ?? 30_000;
|
|
24
|
+
}
|
|
25
|
+
async append(events) {
|
|
26
|
+
if (events.length === 0) {
|
|
27
|
+
return;
|
|
28
|
+
}
|
|
29
|
+
await this.outbox().createMany({
|
|
30
|
+
data: events.map((event) => ({
|
|
31
|
+
id: event.id,
|
|
32
|
+
type: event.type,
|
|
33
|
+
version: event.version,
|
|
34
|
+
occurredAt: event.occurredAt,
|
|
35
|
+
...payloadField(event.payload),
|
|
36
|
+
traceparent: event.traceparent ?? null,
|
|
37
|
+
correlationId: event.correlationId ?? null,
|
|
38
|
+
nextAttemptAt: DUE_IMMEDIATELY,
|
|
39
|
+
})),
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
async claimBatch(limit, now) {
|
|
43
|
+
if (limit <= 0) {
|
|
44
|
+
return [];
|
|
45
|
+
}
|
|
46
|
+
const claimed = this.lockingClaim === undefined
|
|
47
|
+
? await this.claimByCompareAndSet(limit, now)
|
|
48
|
+
: await this.claimSkippingLocked(this.lockingClaim, limit, now);
|
|
49
|
+
const leasedUntil = new Date(now.getTime() + this.leaseDurationMs);
|
|
50
|
+
return claimed.map((row) => toOutboxRecord({ ...row, attempts: row.attempts + 1, nextAttemptAt: leasedUntil }));
|
|
51
|
+
}
|
|
52
|
+
async markPublished(ids, at) {
|
|
53
|
+
if (ids.length === 0) {
|
|
54
|
+
return;
|
|
55
|
+
}
|
|
56
|
+
await this.outbox().updateMany({
|
|
57
|
+
where: { id: { in: [...ids] } },
|
|
58
|
+
data: { status: 'published', publishedAt: at },
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
async markFailed(id, error, nextAttemptAt) {
|
|
62
|
+
await this.outbox().updateMany({
|
|
63
|
+
where: { id, status: { not: 'published' } },
|
|
64
|
+
data: nextAttemptAt === null
|
|
65
|
+
? { status: 'dead', lastErrorCode: error.code }
|
|
66
|
+
: { nextAttemptAt, lastErrorCode: error.code },
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
async retryDead(ids, now) {
|
|
70
|
+
if (ids.length === 0) {
|
|
71
|
+
return 0;
|
|
72
|
+
}
|
|
73
|
+
const revived = await this.outbox().updateMany({
|
|
74
|
+
where: { id: { in: [...ids] }, status: 'dead' },
|
|
75
|
+
data: { status: 'pending', attempts: 0, nextAttemptAt: now },
|
|
76
|
+
});
|
|
77
|
+
return revived.count;
|
|
78
|
+
}
|
|
79
|
+
async purgePublished(before) {
|
|
80
|
+
const purged = await this.outbox().deleteMany({
|
|
81
|
+
where: { status: 'published', publishedAt: { lt: before } },
|
|
82
|
+
});
|
|
83
|
+
return purged.count;
|
|
84
|
+
}
|
|
85
|
+
async stats() {
|
|
86
|
+
const outbox = this.outbox();
|
|
87
|
+
// One after the other: a transaction client runs one query at a time anyway.
|
|
88
|
+
const pending = await outbox.count({ where: { status: 'pending' } });
|
|
89
|
+
const failed = await outbox.count({ where: { status: 'pending', lastErrorCode: { not: null } } });
|
|
90
|
+
const dead = await outbox.count({ where: { status: 'dead' } });
|
|
91
|
+
return { pending, failed, dead };
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Takes each due row with an update that only applies if nobody claimed it since it was
|
|
95
|
+
* read: every claim increments `attempts`, so an unchanged count on a row that is still due
|
|
96
|
+
* means the row is free. Rows lost to another relay are replaced by reading again.
|
|
97
|
+
*/
|
|
98
|
+
async claimByCompareAndSet(limit, now) {
|
|
99
|
+
const claimed = [];
|
|
100
|
+
while (claimed.length < limit) {
|
|
101
|
+
const wanted = limit - claimed.length;
|
|
102
|
+
const due = await this.outbox().findMany({
|
|
103
|
+
where: { status: 'pending', nextAttemptAt: { lte: now } },
|
|
104
|
+
orderBy: [{ nextAttemptAt: 'asc' }, { sequence: 'asc' }],
|
|
105
|
+
take: wanted,
|
|
106
|
+
});
|
|
107
|
+
for (const row of due) {
|
|
108
|
+
const taken = await this.outbox().updateMany({
|
|
109
|
+
where: { id: row.id, status: 'pending', attempts: row.attempts, nextAttemptAt: { lte: now } },
|
|
110
|
+
data: this.lease(now),
|
|
111
|
+
});
|
|
112
|
+
if (taken.count === 1) {
|
|
113
|
+
claimed.push(row);
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
if (due.length < wanted) {
|
|
117
|
+
// Nothing else is due: the rows lost to another relay need no replacement.
|
|
118
|
+
break;
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
return claimed;
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* Selects the due rows `FOR UPDATE SKIP LOCKED`, so concurrent relays pass over each other's
|
|
125
|
+
* rows instead of waiting, then leases them in the same transaction by pushing
|
|
126
|
+
* `nextAttemptAt` forward. It joins the current unit of work or opens a short one of its own:
|
|
127
|
+
* the row locks last a few milliseconds, the lease is what covers the publication.
|
|
128
|
+
*/
|
|
129
|
+
claimSkippingLocked({ sql, raw }, limit, now) {
|
|
130
|
+
return this.unitOfWork.run(async () => {
|
|
131
|
+
const locked = await raw(this.unitOfWork.client()).$queryRawUnsafe(sql, 'pending', now, limit);
|
|
132
|
+
const ids = Array.isArray(locked) ? locked.map(lockedIdOf) : [];
|
|
133
|
+
if (ids.length === 0) {
|
|
134
|
+
return [];
|
|
135
|
+
}
|
|
136
|
+
const order = new Map(ids.map((id, index) => [id, index]));
|
|
137
|
+
const due = await this.outbox().findMany({ where: { id: { in: ids } } });
|
|
138
|
+
await this.outbox().updateMany({ where: { id: { in: ids } }, data: this.lease(now) });
|
|
139
|
+
// An `in` filter gives no order guarantee: restore the one of the claim.
|
|
140
|
+
return due.sort((a, b) => (order.get(a.id) ?? 0) - (order.get(b.id) ?? 0));
|
|
141
|
+
});
|
|
142
|
+
}
|
|
143
|
+
outbox() {
|
|
144
|
+
return this.modelOf(this.unitOfWork.client());
|
|
145
|
+
}
|
|
146
|
+
lease(now) {
|
|
147
|
+
return { attempts: { increment: 1 }, nextAttemptAt: new Date(now.getTime() + this.leaseDurationMs) };
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
//# sourceMappingURL=prisma-outbox-store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prisma-outbox-store.js","sourceRoot":"","sources":["../../src/outbox/prisma-outbox-store.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The one method the store calls on the model of the processed events, typed structurally:
|
|
3
|
+
* the delegate of your generated client (`client.processedEvent`) fits as is on the databases
|
|
4
|
+
* where Prisma offers `skipDuplicates` (PostgreSQL, MySQL, CockroachDB).
|
|
5
|
+
*/
|
|
6
|
+
export interface PrismaProcessedEventDelegate {
|
|
7
|
+
createMany(args: {
|
|
8
|
+
data: {
|
|
9
|
+
consumer: string;
|
|
10
|
+
eventId: string;
|
|
11
|
+
}[];
|
|
12
|
+
skipDuplicates: true;
|
|
13
|
+
}): Promise<{
|
|
14
|
+
count: number;
|
|
15
|
+
}>;
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=prisma-processed-event-delegate.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prisma-processed-event-delegate.d.ts","sourceRoot":"","sources":["../../src/outbox/prisma-processed-event-delegate.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,MAAM,WAAW,4BAA4B;IAC3C,UAAU,CAAC,IAAI,EAAE;QAAE,IAAI,EAAE;YAAE,QAAQ,EAAE,MAAM,CAAC;YAAC,OAAO,EAAE,MAAM,CAAA;SAAE,EAAE,CAAC;QAAC,cAAc,EAAE,IAAI,CAAA;KAAE,GAAG,OAAO,CAAC;QAAE,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACvH"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prisma-processed-event-delegate.js","sourceRoot":"","sources":["../../src/outbox/prisma-processed-event-delegate.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { ProcessedEventStore } from '@ddd-ts-kit/kernel';
|
|
2
|
+
import type { PrismaContext } from '../unit-of-work/prisma-context.js';
|
|
3
|
+
import type { PrismaProcessedEventDelegate } from './prisma-processed-event-delegate.js';
|
|
4
|
+
export interface PrismaProcessedEventStoreOptions<Tx> {
|
|
5
|
+
/** How to reach the model from a client: `(client) => client.processedEvent`. */
|
|
6
|
+
readonly delegate: (client: Tx) => PrismaProcessedEventDelegate;
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Idempotency of consumers. It writes on the client of the context: when the consumer runs
|
|
10
|
+
* inside a unit of work, the mark commits with the effects of the handler and disappears with
|
|
11
|
+
* them if the handler fails, so the redelivery is processed.
|
|
12
|
+
*/
|
|
13
|
+
export declare class PrismaProcessedEventStore<Tx> implements ProcessedEventStore {
|
|
14
|
+
private readonly context;
|
|
15
|
+
private readonly modelOf;
|
|
16
|
+
constructor(context: PrismaContext<Tx>, options: PrismaProcessedEventStoreOptions<Tx>);
|
|
17
|
+
markProcessed(consumer: string, eventId: string): Promise<boolean>;
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=prisma-processed-event-store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prisma-processed-event-store.d.ts","sourceRoot":"","sources":["../../src/outbox/prisma-processed-event-store.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAC9D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mCAAmC,CAAC;AACvE,OAAO,KAAK,EAAE,4BAA4B,EAAE,MAAM,sCAAsC,CAAC;AAEzF,MAAM,WAAW,gCAAgC,CAAC,EAAE;IAClD,iFAAiF;IACjF,QAAQ,CAAC,QAAQ,EAAE,CAAC,MAAM,EAAE,EAAE,KAAK,4BAA4B,CAAC;CACjE;AAED;;;;GAIG;AACH,qBAAa,yBAAyB,CAAC,EAAE,CAAE,YAAW,mBAAmB;IACvE,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAoB;IAE5C,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA+C;IAEvE,YAAY,OAAO,EAAE,aAAa,CAAC,EAAE,CAAC,EAAE,OAAO,EAAE,gCAAgC,CAAC,EAAE,CAAC,EAGpF;IAEK,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CASvE;CACF"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Idempotency of consumers. It writes on the client of the context: when the consumer runs
|
|
3
|
+
* inside a unit of work, the mark commits with the effects of the handler and disappears with
|
|
4
|
+
* them if the handler fails, so the redelivery is processed.
|
|
5
|
+
*/
|
|
6
|
+
export class PrismaProcessedEventStore {
|
|
7
|
+
context;
|
|
8
|
+
modelOf;
|
|
9
|
+
constructor(context, options) {
|
|
10
|
+
this.context = context;
|
|
11
|
+
this.modelOf = options.delegate;
|
|
12
|
+
}
|
|
13
|
+
async markProcessed(consumer, eventId) {
|
|
14
|
+
// INSERT ... ON CONFLICT DO NOTHING: unlike a caught unique violation, it leaves the
|
|
15
|
+
// surrounding PostgreSQL transaction usable.
|
|
16
|
+
const { count } = await this.modelOf(this.context.client()).createMany({
|
|
17
|
+
data: [{ consumer, eventId }],
|
|
18
|
+
skipDuplicates: true,
|
|
19
|
+
});
|
|
20
|
+
return count === 1;
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=prisma-processed-event-store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prisma-processed-event-store.js","sourceRoot":"","sources":["../../src/outbox/prisma-processed-event-store.ts"],"names":[],"mappings":"AASA;;;;GAIG;AACH,MAAM,OAAO,yBAAyB;IACnB,OAAO,CAAoB;IAE3B,OAAO,CAA+C;IAEvE,YAAY,OAA0B,EAAE,OAA6C;QACnF,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvB,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,QAAQ,CAAC;IAClC,CAAC;IAED,KAAK,CAAC,aAAa,CAAC,QAAgB,EAAE,OAAe;QACnD,qFAAqF;QACrF,6CAA6C;QAC7C,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,UAAU,CAAC;YACrE,IAAI,EAAE,CAAC,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC;YAC7B,cAAc,EAAE,IAAI;SACrB,CAAC,CAAC;QAEH,OAAO,KAAK,KAAK,CAAC,CAAC;IACrB,CAAC;CACF"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prisma-raw-queries.d.ts","sourceRoot":"","sources":["../../src/outbox/prisma-raw-queries.ts"],"names":[],"mappings":"AAAA,iGAAiG;AACjG,MAAM,WAAW,gBAAgB;IAC/B,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CACxE"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prisma-raw-queries.js","sourceRoot":"","sources":["../../src/outbox/prisma-raw-queries.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"to-outbox-record.d.ts","sourceRoot":"","sources":["../../src/outbox/to-outbox-record.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAgB,MAAM,oBAAoB,CAAC;AACrE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAEnE,wBAAgB,cAAc,CAAC,GAAG,EAAE,eAAe,GAAG,YAAY,CAiBjE"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
export function toOutboxRecord(row) {
|
|
2
|
+
return {
|
|
3
|
+
event: {
|
|
4
|
+
id: row.id,
|
|
5
|
+
type: row.type,
|
|
6
|
+
version: row.version,
|
|
7
|
+
occurredAt: row.occurredAt,
|
|
8
|
+
payload: row.payload,
|
|
9
|
+
...(row.traceparent === null ? {} : { traceparent: row.traceparent }),
|
|
10
|
+
...(row.correlationId === null ? {} : { correlationId: row.correlationId }),
|
|
11
|
+
},
|
|
12
|
+
status: statusOf(row.status),
|
|
13
|
+
attempts: row.attempts,
|
|
14
|
+
nextAttemptAt: row.nextAttemptAt,
|
|
15
|
+
...(row.lastErrorCode === null ? {} : { lastErrorCode: row.lastErrorCode }),
|
|
16
|
+
...(row.publishedAt === null ? {} : { publishedAt: row.publishedAt }),
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
function statusOf(status) {
|
|
20
|
+
if (status === 'pending' || status === 'published' || status === 'dead') {
|
|
21
|
+
return status;
|
|
22
|
+
}
|
|
23
|
+
throw new TypeError(`Unknown outbox status "${status}"`);
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=to-outbox-record.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"to-outbox-record.js","sourceRoot":"","sources":["../../src/outbox/to-outbox-record.ts"],"names":[],"mappings":"AAGA,MAAM,UAAU,cAAc,CAAC,GAAoB;IACjD,OAAO;QACL,KAAK,EAAE;YACL,EAAE,EAAE,GAAG,CAAC,EAAE;YACV,IAAI,EAAE,GAAG,CAAC,IAAI;YACd,OAAO,EAAE,GAAG,CAAC,OAAO;YACpB,UAAU,EAAE,GAAG,CAAC,UAAU;YAC1B,OAAO,EAAE,GAAG,CAAC,OAAO;YACpB,GAAG,CAAC,GAAG,CAAC,WAAW,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,GAAG,CAAC,WAAW,EAAE,CAAC;YACrE,GAAG,CAAC,GAAG,CAAC,aAAa,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,GAAG,CAAC,aAAa,EAAE,CAAC;SAC5E;QACD,MAAM,EAAE,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC;QAC5B,QAAQ,EAAE,GAAG,CAAC,QAAQ;QACtB,aAAa,EAAE,GAAG,CAAC,aAAa;QAChC,GAAG,CAAC,GAAG,CAAC,aAAa,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,GAAG,CAAC,aAAa,EAAE,CAAC;QAC3E,GAAG,CAAC,GAAG,CAAC,WAAW,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,GAAG,CAAC,WAAW,EAAE,CAAC;KACtE,CAAC;AACJ,CAAC;AAED,SAAS,QAAQ,CAAC,MAAc;IAC9B,IAAI,MAAM,KAAK,SAAS,IAAI,MAAM,KAAK,WAAW,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;QACxE,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,MAAM,IAAI,SAAS,CAAC,0BAA0B,MAAM,GAAG,CAAC,CAAC;AAC3D,CAAC"}
|