@ddd-ts-kit/testing 0.7.0 → 0.9.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 (96) hide show
  1. package/README.md +8 -4
  2. package/dist/contracts/event-bus-contract.js +4 -3
  3. package/dist/contracts/event-bus-contract.js.map +1 -1
  4. package/dist/contracts/file-storage/arrangement-suite.d.ts +9 -0
  5. package/dist/contracts/file-storage/arrangement-suite.d.ts.map +1 -0
  6. package/dist/contracts/file-storage/arrangement-suite.js +51 -0
  7. package/dist/contracts/file-storage/arrangement-suite.js.map +1 -0
  8. package/dist/contracts/file-storage/checksum-of.d.ts +3 -0
  9. package/dist/contracts/file-storage/checksum-of.d.ts.map +1 -0
  10. package/dist/contracts/file-storage/checksum-of.js +10 -0
  11. package/dist/contracts/file-storage/checksum-of.js.map +1 -0
  12. package/dist/contracts/file-storage/chunks-of.d.ts +3 -0
  13. package/dist/contracts/file-storage/chunks-of.d.ts.map +1 -0
  14. package/dist/contracts/file-storage/chunks-of.js +5 -0
  15. package/dist/contracts/file-storage/chunks-of.js.map +1 -0
  16. package/dist/contracts/file-storage/content-suite.d.ts +12 -0
  17. package/dist/contracts/file-storage/content-suite.d.ts.map +1 -0
  18. package/dist/contracts/file-storage/content-suite.js +110 -0
  19. package/dist/contracts/file-storage/content-suite.js.map +1 -0
  20. package/dist/contracts/file-storage/contents.d.ts +7 -0
  21. package/dist/contracts/file-storage/contents.d.ts.map +1 -0
  22. package/dist/contracts/file-storage/contents.js +7 -0
  23. package/dist/contracts/file-storage/contents.js.map +1 -0
  24. package/dist/contracts/file-storage/file-storage-contract-options.d.ts +17 -0
  25. package/dist/contracts/file-storage/file-storage-contract-options.d.ts.map +1 -0
  26. package/dist/contracts/file-storage/file-storage-contract-options.js +2 -0
  27. package/dist/contracts/file-storage/file-storage-contract-options.js.map +1 -0
  28. package/dist/contracts/file-storage/file-storage-suite.d.ts +14 -0
  29. package/dist/contracts/file-storage/file-storage-suite.d.ts.map +1 -0
  30. package/dist/contracts/file-storage/file-storage-suite.js +30 -0
  31. package/dist/contracts/file-storage/file-storage-suite.js.map +1 -0
  32. package/dist/contracts/file-storage/follow-served.d.ts +9 -0
  33. package/dist/contracts/file-storage/follow-served.d.ts.map +1 -0
  34. package/dist/contracts/file-storage/follow-served.js +28 -0
  35. package/dist/contracts/file-storage/follow-served.js.map +1 -0
  36. package/dist/contracts/file-storage/follow-with-fetch.d.ts +5 -0
  37. package/dist/contracts/file-storage/follow-with-fetch.d.ts.map +1 -0
  38. package/dist/contracts/file-storage/follow-with-fetch.js +14 -0
  39. package/dist/contracts/file-storage/follow-with-fetch.js.map +1 -0
  40. package/dist/contracts/file-storage/followed-response.d.ts +7 -0
  41. package/dist/contracts/file-storage/followed-response.d.ts.map +1 -0
  42. package/dist/contracts/file-storage/followed-response.js +2 -0
  43. package/dist/contracts/file-storage/followed-response.js.map +1 -0
  44. package/dist/contracts/file-storage/large-content.d.ts +3 -0
  45. package/dist/contracts/file-storage/large-content.d.ts.map +1 -0
  46. package/dist/contracts/file-storage/large-content.js +8 -0
  47. package/dist/contracts/file-storage/large-content.js.map +1 -0
  48. package/dist/contracts/file-storage/read-all.d.ts +3 -0
  49. package/dist/contracts/file-storage/read-all.d.ts.map +1 -0
  50. package/dist/contracts/file-storage/read-all.js +9 -0
  51. package/dist/contracts/file-storage/read-all.js.map +1 -0
  52. package/dist/contracts/file-storage/signed-links-suite.d.ts +11 -0
  53. package/dist/contracts/file-storage/signed-links-suite.d.ts.map +1 -0
  54. package/dist/contracts/file-storage/signed-links-suite.js +93 -0
  55. package/dist/contracts/file-storage/signed-links-suite.js.map +1 -0
  56. package/dist/contracts/file-storage/signed-request.d.ts +8 -0
  57. package/dist/contracts/file-storage/signed-request.d.ts.map +1 -0
  58. package/dist/contracts/file-storage/signed-request.js +2 -0
  59. package/dist/contracts/file-storage/signed-request.js.map +1 -0
  60. package/dist/contracts/file-storage/tampered.d.ts +3 -0
  61. package/dist/contracts/file-storage/tampered.d.ts.map +1 -0
  62. package/dist/contracts/file-storage/tampered.js +5 -0
  63. package/dist/contracts/file-storage/tampered.js.map +1 -0
  64. package/dist/contracts/file-storage-contract.d.ts +11 -0
  65. package/dist/contracts/file-storage-contract.d.ts.map +1 -0
  66. package/dist/contracts/file-storage-contract.js +16 -0
  67. package/dist/contracts/file-storage-contract.js.map +1 -0
  68. package/dist/contracts/outbox-store-contract.d.ts +5 -0
  69. package/dist/contracts/outbox-store-contract.d.ts.map +1 -1
  70. package/dist/contracts/outbox-store-contract.js +3 -1
  71. package/dist/contracts/outbox-store-contract.js.map +1 -1
  72. package/dist/contracts/tenant-envelope.d.ts +4 -0
  73. package/dist/contracts/tenant-envelope.d.ts.map +1 -0
  74. package/dist/contracts/tenant-envelope.js +6 -0
  75. package/dist/contracts/tenant-envelope.js.map +1 -0
  76. package/dist/contracts/tenant-isolation-contract.d.ts +37 -0
  77. package/dist/contracts/tenant-isolation-contract.d.ts.map +1 -0
  78. package/dist/contracts/tenant-isolation-contract.js +117 -0
  79. package/dist/contracts/tenant-isolation-contract.js.map +1 -0
  80. package/dist/contracts.d.ts +7 -0
  81. package/dist/contracts.d.ts.map +1 -1
  82. package/dist/contracts.js +4 -0
  83. package/dist/contracts.js.map +1 -1
  84. package/dist/execution/as-tenant.d.ts +7 -0
  85. package/dist/execution/as-tenant.d.ts.map +1 -0
  86. package/dist/execution/as-tenant.js +10 -0
  87. package/dist/execution/as-tenant.js.map +1 -0
  88. package/dist/execution/execution-context-builder.d.ts +4 -1
  89. package/dist/execution/execution-context-builder.d.ts.map +1 -1
  90. package/dist/execution/execution-context-builder.js +7 -1
  91. package/dist/execution/execution-context-builder.js.map +1 -1
  92. package/dist/index.d.ts +1 -0
  93. package/dist/index.d.ts.map +1 -1
  94. package/dist/index.js +1 -0
  95. package/dist/index.js.map +1 -1
  96. package/package.json +4 -4
@@ -0,0 +1 @@
1
+ {"version":3,"file":"large-content.js","sourceRoot":"","sources":["../../../src/contracts/file-storage/large-content.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAExD,sFAAsF;AACtF,MAAM,CAAC,KAAK,SAAS,CAAC,CAAC,YAAY;IACjC,KAAK,IAAI,MAAM,GAAG,CAAC,EAAE,MAAM,GAAG,UAAU,EAAE,MAAM,IAAI,WAAW,EAAE,CAAC;QAChE,MAAM,IAAI,UAAU,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,MAAM,GAAG,WAAW,CAAC,CAAC;IAC/D,CAAC;AACH,CAAC"}
@@ -0,0 +1,3 @@
1
+ /** The whole content of a stream: for the small files of a test, never in an adapter. */
2
+ export declare function readAll(stream: AsyncIterable<unknown>): Promise<Uint8Array>;
3
+ //# sourceMappingURL=read-all.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"read-all.d.ts","sourceRoot":"","sources":["../../../src/contracts/file-storage/read-all.ts"],"names":[],"mappings":"AAAA,yFAAyF;AACzF,wBAAsB,OAAO,CAAC,MAAM,EAAE,aAAa,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC,UAAU,CAAC,CAQjF"}
@@ -0,0 +1,9 @@
1
+ /** The whole content of a stream: for the small files of a test, never in an adapter. */
2
+ export async function readAll(stream) {
3
+ const chunks = [];
4
+ for await (const chunk of stream) {
5
+ chunks.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk instanceof Uint8Array ? chunk : String(chunk)));
6
+ }
7
+ return new Uint8Array(Buffer.concat(chunks));
8
+ }
9
+ //# sourceMappingURL=read-all.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"read-all.js","sourceRoot":"","sources":["../../../src/contracts/file-storage/read-all.ts"],"names":[],"mappings":"AAAA,yFAAyF;AACzF,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,MAA8B;IAC1D,MAAM,MAAM,GAAa,EAAE,CAAC;IAE5B,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QACjC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,YAAY,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IACjH,CAAC;IAED,OAAO,IAAI,UAAU,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC;AAC/C,CAAC"}
@@ -0,0 +1,11 @@
1
+ import { FileStorageSuite } from './file-storage-suite.js';
2
+ /** A signed link grants one action on one file, for a short time, to whoever holds it unchanged. */
3
+ export declare class SignedLinksSuite extends FileStorageSuite {
4
+ protected tests(): void;
5
+ private downloads;
6
+ private uploads;
7
+ private refuses;
8
+ private textUpload;
9
+ private follow;
10
+ }
11
+ //# sourceMappingURL=signed-links-suite.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"signed-links-suite.d.ts","sourceRoot":"","sources":["../../../src/contracts/file-storage/signed-links-suite.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAG3D,oGAAoG;AACpG,qBAAa,gBAAiB,SAAQ,gBAAgB;IACpD,SAAS,CAAC,KAAK,IAAI,IAAI,CAItB;IAED,OAAO,CAAC,SAAS;IAmCjB,OAAO,CAAC,OAAO;IAiCf,OAAO,CAAC,OAAO;IA2Bf,OAAO,CAAC,UAAU;IAQlB,OAAO,CAAC,MAAM;CAGf"}
@@ -0,0 +1,93 @@
1
+ import { MAX_SIGNED_URL_SECONDS } from '@ddd-ts-kit/kernel';
2
+ import { PDF, TEXT } from './contents.js';
3
+ import { tampered } from './tampered.js';
4
+ import { followWithFetch } from './follow-with-fetch.js';
5
+ import { FileStorageSuite } from './file-storage-suite.js';
6
+ /** A signed link grants one action on one file, for a short time, to whoever holds it unchanged. */
7
+ export class SignedLinksSuite extends FileStorageSuite {
8
+ tests() {
9
+ this.downloads();
10
+ this.uploads();
11
+ this.refuses();
12
+ }
13
+ downloads() {
14
+ this.it('downloads the file through its link, under the name it was signed with', async () => {
15
+ await this.write('documents/report.pdf', PDF);
16
+ const link = await this.subject.signedDownloadUrl('documents/report.pdf', {
17
+ expiresInSeconds: 300,
18
+ fileName: 'report.pdf',
19
+ });
20
+ const longer = await this.subject.signedDownloadUrl('documents/report.pdf', { expiresInSeconds: 600 });
21
+ const response = await this.follow({ url: link.url, method: 'GET' });
22
+ this.expect([response.status, response.body]).toEqual([200, PDF]);
23
+ this.expect(response.headers['content-disposition']?.includes('report.pdf')).toBe(true);
24
+ this.expect(Math.abs(longer.expiresAt.getTime() - link.expiresAt.getTime() - 300_000) < 5_000).toBe(true);
25
+ });
26
+ this.it('serves a link signed without a name as an attachment all the same, never inline', async () => {
27
+ await this.write('documents/report.pdf', PDF);
28
+ const link = await this.subject.signedDownloadUrl('documents/report.pdf', { expiresInSeconds: 300 });
29
+ const response = await this.follow({ url: link.url, method: 'GET' });
30
+ this.expect(response.headers['content-disposition']?.startsWith('attachment')).toBe(true);
31
+ });
32
+ this.it('refuses a download link once it has expired', async () => {
33
+ await this.write('documents/report.pdf', PDF);
34
+ const link = await this.subject.signedDownloadUrl('documents/report.pdf', { expiresInSeconds: 1 });
35
+ await this.options.elapse(2_100);
36
+ this.expect((await this.follow({ url: link.url, method: 'GET' })).status >= 400).toBe(true);
37
+ });
38
+ }
39
+ uploads() {
40
+ this.it('stores what is sent through an upload link, with the media type it was signed for', async () => {
41
+ const upload = await this.textUpload();
42
+ const response = await this.follow({
43
+ url: upload.url,
44
+ method: upload.method,
45
+ headers: upload.headers,
46
+ body: TEXT,
47
+ });
48
+ const metadata = await this.subject.stat('staging/documents/notes.txt');
49
+ this.expect(response.status < 300).toBe(true);
50
+ this.expect([metadata?.size, metadata?.mediaType]).toEqual([TEXT.length, 'text/plain']);
51
+ this.expect(await this.read('staging/documents/notes.txt')).toEqual(TEXT);
52
+ });
53
+ this.it('refuses an upload sent with another media type than the one signed', async () => {
54
+ const upload = await this.textUpload();
55
+ const response = await this.follow({
56
+ url: upload.url,
57
+ method: 'PUT',
58
+ headers: { 'content-type': 'text/html' },
59
+ body: TEXT,
60
+ });
61
+ this.expect(response.status >= 400).toBe(true);
62
+ this.expect(await this.subject.stat('staging/documents/notes.txt')).toBe(undefined);
63
+ });
64
+ }
65
+ refuses() {
66
+ this.it('refuses a link whose signature was changed', async () => {
67
+ await this.write('documents/report.pdf', PDF);
68
+ const link = await this.subject.signedDownloadUrl('documents/report.pdf', { expiresInSeconds: 300 });
69
+ this.expect((await this.follow({ url: tampered(link.url), method: 'GET' })).status >= 400).toBe(true);
70
+ });
71
+ this.it('refuses to sign a link for longer than the maximum, or for no time', async () => {
72
+ for (const expiresInSeconds of [MAX_SIGNED_URL_SECONDS + 1, 0, 1.5]) {
73
+ const code = await this.codeOf(() => this.subject.signedDownloadUrl('documents/report.pdf', { expiresInSeconds }));
74
+ this.expect(code).toBe('INVALID_FILE_URL_EXPIRY');
75
+ }
76
+ });
77
+ this.it('refuses to sign a link for a key that could leave its place', async () => {
78
+ const code = await this.codeOf(() => this.subject.signedUploadUrl('../outside', { expiresInSeconds: 60, mediaType: 'text/plain', maxBytes: 1_000 }));
79
+ this.expect(code).toBe('INVALID_FILE_KEY');
80
+ });
81
+ }
82
+ textUpload() {
83
+ return this.subject.signedUploadUrl('staging/documents/notes.txt', {
84
+ expiresInSeconds: 300,
85
+ mediaType: 'text/plain',
86
+ maxBytes: 1_000,
87
+ });
88
+ }
89
+ follow(request) {
90
+ return (this.options.follow ?? followWithFetch)(request);
91
+ }
92
+ }
93
+ //# sourceMappingURL=signed-links-suite.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"signed-links-suite.js","sourceRoot":"","sources":["../../../src/contracts/file-storage/signed-links-suite.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ /** A request to a signed link, as a client would send it. */
2
+ export interface SignedRequest {
3
+ readonly url: string;
4
+ readonly method: 'GET' | 'PUT';
5
+ readonly headers?: Readonly<Record<string, string>>;
6
+ readonly body?: Uint8Array;
7
+ }
8
+ //# sourceMappingURL=signed-request.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"signed-request.d.ts","sourceRoot":"","sources":["../../../src/contracts/file-storage/signed-request.ts"],"names":[],"mappings":"AAAA,6DAA6D;AAC7D,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,MAAM,EAAE,KAAK,GAAG,KAAK,CAAC;IAC/B,QAAQ,CAAC,OAAO,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IACpD,QAAQ,CAAC,IAAI,CAAC,EAAE,UAAU,CAAC;CAC5B"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=signed-request.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"signed-request.js","sourceRoot":"","sources":["../../../src/contracts/file-storage/signed-request.ts"],"names":[],"mappings":""}
@@ -0,0 +1,3 @@
1
+ /** The link with its last character changed: the end of the signature, for every connector of the kit. */
2
+ export declare function tampered(url: string): string;
3
+ //# sourceMappingURL=tampered.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tampered.d.ts","sourceRoot":"","sources":["../../../src/contracts/file-storage/tampered.ts"],"names":[],"mappings":"AAAA,0GAA0G;AAC1G,wBAAgB,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAE5C"}
@@ -0,0 +1,5 @@
1
+ /** The link with its last character changed: the end of the signature, for every connector of the kit. */
2
+ export function tampered(url) {
3
+ return `${url.slice(0, -1)}${url.endsWith('A') ? 'B' : 'A'}`;
4
+ }
5
+ //# sourceMappingURL=tampered.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tampered.js","sourceRoot":"","sources":["../../../src/contracts/file-storage/tampered.ts"],"names":[],"mappings":"AAAA,0GAA0G;AAC1G,MAAM,UAAU,QAAQ,CAAC,GAAW;IAClC,OAAO,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC;AAC/D,CAAC"}
@@ -0,0 +1,11 @@
1
+ import type { ContractRunner } from './contract-runner.js';
2
+ import type { FileStorageContractOptions } from './file-storage/file-storage-contract-options.js';
3
+ /**
4
+ * What every connector of the kernel `FileStorage` port guarantees, the in-memory one included:
5
+ * content streams in and out intact and measured, a refused write leaves nothing, keys never
6
+ * leave their place, copies, moves and listings by key, and short signed links that grant one
7
+ * action. A connector of your own (Google Cloud Storage, Azure Blob Storage) is done when it
8
+ * passes this suite against the real service or its emulator.
9
+ */
10
+ export declare function fileStorageContract(runner: ContractRunner, options: FileStorageContractOptions): void;
11
+ //# sourceMappingURL=file-storage-contract.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file-storage-contract.d.ts","sourceRoot":"","sources":["../../src/contracts/file-storage-contract.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAG3D,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,iDAAiD,CAAC;AAGlG;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,cAAc,EAAE,OAAO,EAAE,0BAA0B,GAAG,IAAI,CAIrG"}
@@ -0,0 +1,16 @@
1
+ import { ArrangementSuite } from './file-storage/arrangement-suite.js';
2
+ import { ContentSuite } from './file-storage/content-suite.js';
3
+ import { SignedLinksSuite } from './file-storage/signed-links-suite.js';
4
+ /**
5
+ * What every connector of the kernel `FileStorage` port guarantees, the in-memory one included:
6
+ * content streams in and out intact and measured, a refused write leaves nothing, keys never
7
+ * leave their place, copies, moves and listings by key, and short signed links that grant one
8
+ * action. A connector of your own (Google Cloud Storage, Azure Blob Storage) is done when it
9
+ * passes this suite against the real service or its emulator.
10
+ */
11
+ export function fileStorageContract(runner, options) {
12
+ new ContentSuite(runner, options).describe(`${options.name} (file storage contract: content)`);
13
+ new ArrangementSuite(runner, options).describe(`${options.name} (file storage contract: copy, move, list)`);
14
+ new SignedLinksSuite(runner, options).describe(`${options.name} (file storage contract: signed links)`);
15
+ }
16
+ //# sourceMappingURL=file-storage-contract.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file-storage-contract.js","sourceRoot":"","sources":["../../src/contracts/file-storage-contract.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,MAAM,qCAAqC,CAAC;AACvE,OAAO,EAAE,YAAY,EAAE,MAAM,iCAAiC,CAAC;AAE/D,OAAO,EAAE,gBAAgB,EAAE,MAAM,sCAAsC,CAAC;AAExE;;;;;;GAMG;AACH,MAAM,UAAU,mBAAmB,CAAC,MAAsB,EAAE,OAAmC;IAC7F,IAAI,YAAY,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,QAAQ,CAAC,GAAG,OAAO,CAAC,IAAI,mCAAmC,CAAC,CAAC;IAC/F,IAAI,gBAAgB,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,QAAQ,CAAC,GAAG,OAAO,CAAC,IAAI,4CAA4C,CAAC,CAAC;IAC5G,IAAI,gBAAgB,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,QAAQ,CAAC,GAAG,OAAO,CAAC,IAAI,wCAAwC,CAAC,CAAC;AAC1G,CAAC"}
@@ -31,6 +31,11 @@ export interface OutboxStoreContractOptions {
31
31
  createStore(): Awaitable<OutboxStoreUnderContract>;
32
32
  /** The lease the created store is configured with: how long a claim hides a record. */
33
33
  readonly leaseMs: number;
34
+ /**
35
+ * The store keeps the tenant of an event (`tenant_id`), as a multi-tenant project needs: its
36
+ * consumers then run in that tenant. Default false, for a store created without the column.
37
+ */
38
+ readonly carriesTenant?: boolean;
34
39
  }
35
40
  export declare function outboxStoreContract(runner: ContractRunner, options: OutboxStoreContractOptions): void;
36
41
  //# sourceMappingURL=outbox-store-contract.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"outbox-store-contract.d.ts","sourceRoot":"","sources":["../../src/contracts/outbox-store-contract.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAC3D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAChD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAK3D;;;GAGG;AACH,MAAM,WAAW,wBAAwB;IACvC,MAAM,CAAC,MAAM,EAAE,SAAS,gBAAgB,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3D,UAAU,CACR,KAAK,EAAE,MAAM,EACb,GAAG,EAAE,IAAI,GACR,OAAO,CACR;QACE,QAAQ,CAAC,KAAK,EAAE,gBAAgB,CAAC;QACjC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;QACxB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;QAC1B,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;KACjC,EAAE,CACJ,CAAC;IACF,aAAa,CAAC,GAAG,EAAE,SAAS,MAAM,EAAE,EAAE,EAAE,EAAE,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/D,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,CAAC;IACpG,SAAS,CAAC,GAAG,EAAE,SAAS,MAAM,EAAE,EAAE,GAAG,EAAE,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAC9D,cAAc,CAAC,MAAM,EAAE,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAC9C,KAAK,IAAI,OAAO,CAAC;QAAE,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAChG;AAED,MAAM,WAAW,0BAA0B;IACzC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,qDAAqD;IACrD,WAAW,IAAI,SAAS,CAAC,wBAAwB,CAAC,CAAC;IACnD,uFAAuF;IACvF,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC1B;AAED,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,cAAc,EAAE,OAAO,EAAE,0BAA0B,GAAG,IAAI,CAErG"}
1
+ {"version":3,"file":"outbox-store-contract.d.ts","sourceRoot":"","sources":["../../src/contracts/outbox-store-contract.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAC3D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAChD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAM3D;;;GAGG;AACH,MAAM,WAAW,wBAAwB;IACvC,MAAM,CAAC,MAAM,EAAE,SAAS,gBAAgB,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3D,UAAU,CACR,KAAK,EAAE,MAAM,EACb,GAAG,EAAE,IAAI,GACR,OAAO,CACR;QACE,QAAQ,CAAC,KAAK,EAAE,gBAAgB,CAAC;QACjC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;QACxB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;QAC1B,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;KACjC,EAAE,CACJ,CAAC;IACF,aAAa,CAAC,GAAG,EAAE,SAAS,MAAM,EAAE,EAAE,EAAE,EAAE,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/D,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,CAAC;IACpG,SAAS,CAAC,GAAG,EAAE,SAAS,MAAM,EAAE,EAAE,GAAG,EAAE,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAC9D,cAAc,CAAC,MAAM,EAAE,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAC9C,KAAK,IAAI,OAAO,CAAC;QAAE,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAChG;AAED,MAAM,WAAW,0BAA0B;IACzC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,qDAAqD;IACrD,WAAW,IAAI,SAAS,CAAC,wBAAwB,CAAC,CAAC;IACnD,uFAAuF;IACvF,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB;;;OAGG;IACH,QAAQ,CAAC,aAAa,CAAC,EAAE,OAAO,CAAC;CAClC;AAED,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,cAAc,EAAE,OAAO,EAAE,0BAA0B,GAAG,IAAI,CAErG"}
@@ -1,6 +1,7 @@
1
1
  import { ContractSuite } from './contract-suite.js';
2
2
  import { failureOf } from './failure-of.js';
3
3
  import { fullEnvelope } from './full-envelope.js';
4
+ import { tenantEnvelope } from './tenant-envelope.js';
4
5
  export function outboxStoreContract(runner, options) {
5
6
  new OutboxStoreSuite(runner, options).describe(`${options.name} (outbox store contract)`);
6
7
  }
@@ -36,13 +37,14 @@ class OutboxStoreSuite extends ContractSuite {
36
37
  }
37
38
  returnsTheEventAsAppended() {
38
39
  this.it('returns the event exactly as appended, trace and correlation included', async () => {
39
- const appended = fullEnvelope(outboxEvent('evt-1'));
40
+ const appended = (this.options.carriesTenant === true ? tenantEnvelope : fullEnvelope)(outboxEvent('evt-1'));
40
41
  await this.subject.append([appended, outboxEvent('evt-2')]);
41
42
  const claimed = await this.subject.claimBatch(10, NOW);
42
43
  this.expect(claimed[0]?.event).toEqual(appended);
43
44
  this.expect(claimed[1]?.event).toEqual(outboxEvent('evt-2'));
44
45
  this.expect(claimed[1]?.event.traceparent).toBe(undefined);
45
46
  this.expect(claimed[1]?.event.correlationId).toBe(undefined);
47
+ this.expect(claimed[1]?.event.tenantId).toBe(undefined);
46
48
  });
47
49
  }
48
50
  leasesWhatItHandsOut() {
@@ -1 +1 @@
1
- {"version":3,"file":"outbox-store-contract.js","sourceRoot":"","sources":["../../src/contracts/outbox-store-contract.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAkClD,MAAM,UAAU,mBAAmB,CAAC,MAAsB,EAAE,OAAmC;IAC7F,IAAI,gBAAgB,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,QAAQ,CAAC,GAAG,OAAO,CAAC,IAAI,0BAA0B,CAAC,CAAC;AAC5F,CAAC;AAED,MAAM,GAAG,GAAG,IAAI,IAAI,CAAC,0BAA0B,CAAC,CAAC;AAEjD,MAAM,gBAAiB,SAAQ,aAAuC;IAGjD,OAAO;IAF1B,YACE,MAAsB,EACL,OAAmC;QAEpD,KAAK,CAAC,MAAM,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC;uBAF1B,OAAO;IAG1B,CAAC;IAES,KAAK;QACb,IAAI,CAAC,uBAAuB,EAAE,CAAC;QAC/B,IAAI,CAAC,yBAAyB,EAAE,CAAC;QACjC,IAAI,CAAC,oBAAoB,EAAE,CAAC;QAC5B,IAAI,CAAC,4BAA4B,EAAE,CAAC;QACpC,IAAI,CAAC,kBAAkB,EAAE,CAAC;QAC1B,IAAI,CAAC,0BAA0B,EAAE,CAAC;IACpC,CAAC;IAEO,uBAAuB;QAC7B,IAAI,CAAC,EAAE,CAAC,cAAc,EAAE,KAAK,IAAI,EAAE;YACjC,IAAI,CAAC,MAAM,CAAC,MAAM,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC,OAAO,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC;YACpF,IAAI,CAAC,MAAM,CAAC,MAAM,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QAClE,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,EAAE,CAAC,mEAAmE,EAAE,KAAK,IAAI,EAAE;YACtF,MAAM,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,WAAW,CAAC,OAAO,CAAC,EAAE,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;YACxE,MAAM,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;YAClD,IAAI,CAAC,MAAM,CAAC,MAAM,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC,OAAO,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC;YAEpF,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;YAEvD,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC;YAC3F,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;YACzE,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,SAAS,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC,CAAC;QACjG,CAAC,CAAC,CAAC;IACL,CAAC;IAEO,yBAAyB;QAC/B,IAAI,CAAC,EAAE,CAAC,uEAAuE,EAAE,KAAK,IAAI,EAAE;YAC1F,MAAM,QAAQ,GAAG,YAAY,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC;YAEpD,MAAM,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,QAAQ,EAAE,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;YAE5D,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;YAEvD,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;YACjD,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,OAAO,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC;YAC7D,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YAC3D,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAC/D,CAAC,CAAC,CAAC;IACL,CAAC;IAEO,oBAAoB;QAC1B,IAAI,CAAC,EAAE,CAAC,yDAAyD,EAAE,KAAK,IAAI,EAAE;YAC5E,MAAM,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,WAAW,CAAC,OAAO,CAAC,EAAE,WAAW,CAAC,OAAO,CAAC,EAAE,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;YAE9F,IAAI,CAAC,MAAM,CAAC,MAAM,IAAI,CAAC,UAAU,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC;YACvE,IAAI,CAAC,MAAM,CAAC,MAAM,IAAI,CAAC,UAAU,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;QAChE,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,EAAE,CAAC,yEAAyE,EAAE,KAAK,IAAI,EAAE;YAC5F,MAAM,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;YAClD,MAAM,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;YAEvC,IAAI,CAAC,MAAM,CAAC,MAAM,IAAI,CAAC,UAAU,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;YACxD,IAAI,CAAC,MAAM,CAAC,MAAM,IAAI,CAAC,UAAU,CAAC,EAAE,EAAE,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;YAEpF,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,EAAE,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC;YAE7E,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;YACvE,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC1C,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,EAAE,CAAC,sDAAsD,EAAE,KAAK,IAAI,EAAE;YACzE,MAAM,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,WAAW,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;YAE9F,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC;YAEtF,MAAM,GAAG,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;YAE3B,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAChC,IAAI,CAAC,MAAM,CAAC,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACzC,CAAC,CAAC,CAAC;IACL,CAAC;IAEO,4BAA4B;QAClC,IAAI,CAAC,EAAE,CAAC,0CAA0C,EAAE,KAAK,IAAI,EAAE;YAC7D,MAAM,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,WAAW,CAAC,OAAO,CAAC,EAAE,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;YACxE,MAAM,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;YAEvC,MAAM,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC,OAAO,CAAC,EAAE,GAAG,CAAC,CAAC;YAEjD,IAAI,CAAC,MAAM,CAAC,MAAM,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC,OAAO,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC;YACpF,IAAI,CAAC,MAAM,CAAC,MAAM,IAAI,CAAC,UAAU,CAAC,EAAE,EAAE,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;QAC9F,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,EAAE,CAAC,yDAAyD,EAAE,KAAK,IAAI,EAAE;YAC5E,MAAM,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;YAClD,MAAM,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;YAEvC,MAAM,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,IAAI,EAAE,aAAa,EAAE,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;YAE9E,IAAI,CAAC,MAAM,CAAC,MAAM,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC,OAAO,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC;YACpF,IAAI,CAAC,MAAM,CAAC,MAAM,IAAI,CAAC,UAAU,CAAC,EAAE,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;YACjE,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;YAEhE,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;YACzE,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAC1C,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,aAAa,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QAC7D,CAAC,CAAC,CAAC;IACL,CAAC;IAEO,kBAAkB;QACxB,IAAI,CAAC,EAAE,CAAC,mCAAmC,EAAE,KAAK,IAAI,EAAE;YACtD,MAAM,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,WAAW,CAAC,OAAO,CAAC,EAAE,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;YACxE,MAAM,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;YAEvC,MAAM,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,IAAI,EAAE,aAAa,EAAE,EAAE,IAAI,CAAC,CAAC;YAEtE,IAAI,CAAC,MAAM,CAAC,MAAM,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC,OAAO,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC;YACpF,IAAI,CAAC,MAAM,CAAC,MAAM,IAAI,CAAC,UAAU,CAAC,EAAE,EAAE,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;QAC9F,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,EAAE,CAAC,iEAAiE,EAAE,KAAK,IAAI,EAAE;YACpF,MAAM,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,WAAW,CAAC,OAAO,CAAC,EAAE,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;YACxE,MAAM,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;YACvC,MAAM,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,IAAI,EAAE,aAAa,EAAE,EAAE,IAAI,CAAC,CAAC;YACtE,MAAM,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC,OAAO,CAAC,EAAE,GAAG,CAAC,CAAC;YAEjD,MAAM,YAAY,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE,OAAO,EAAE,SAAS,CAAC,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;YAE/F,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAElC,IAAI,CAAC,MAAM,CAAC,MAAM,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC,OAAO,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC;YACpF,IAAI,CAAC,MAAM,CAAC,MAAM,IAAI,CAAC,UAAU,CAAC,EAAE,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;YAC/D,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;YAEhE,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;YACzE,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC5C,CAAC,CAAC,CAAC;IACL,CAAC;IAEO,0BAA0B;QAChC,IAAI,CAAC,EAAE,CAAC,yDAAyD,EAAE,KAAK,IAAI,EAAE;YAC5E,MAAM,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,WAAW,CAAC,OAAO,CAAC,EAAE,WAAW,CAAC,OAAO,CAAC,EAAE,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;YAC9F,MAAM,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;YACvC,MAAM,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC,OAAO,CAAC,EAAE,GAAG,CAAC,CAAC;YACjD,MAAM,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC,OAAO,CAAC,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;YAE1D,IAAI,CAAC,MAAM,CAAC,MAAM,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAC5D,IAAI,CAAC,MAAM,CAAC,MAAM,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAErE,IAAI,CAAC,MAAM,CAAC,MAAM,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC,OAAO,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC;YACpF,IAAI,CAAC,MAAM,CAAC,MAAM,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACvE,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,EAAE,CAAC,yEAAyE,EAAE,KAAK,IAAI,EAAE;YAC5F,MAAM,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;YAElD,MAAM,KAAK,GAAG,CAAC,WAAW,CAAC,OAAO,CAAC,EAAE,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC;YAC3D,MAAM,OAAO,GAAG,MAAM,SAAS,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;YAElE,IAAI,CAAC,MAAM,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC9C,IAAI,CAAC,MAAM,CAAC,MAAM,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC,OAAO,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC;QACtF,CAAC,CAAC,CAAC;IACL,CAAC;IAEO,KAAK,CAAC,UAAU,CAAC,KAAa,EAAE,EAAQ;QAC9C,OAAO,CAAC,MAAM,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IACrF,CAAC;CACF;AAED,SAAS,KAAK,CAAC,EAAU;IACvB,OAAO,IAAI,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,CAAC;AACtC,CAAC;AAED,SAAS,WAAW,CAAC,EAAU;IAC7B,OAAO;QACL,EAAE;QACF,IAAI,EAAE,yBAAyB;QAC/B,OAAO,EAAE,CAAC;QACV,UAAU,EAAE,0BAA0B;QACtC,OAAO,EAAE,EAAE,OAAO,EAAE,SAAS,EAAE,EAAE,EAAE;KACpC,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"outbox-store-contract.js","sourceRoot":"","sources":["../../src/contracts/outbox-store-contract.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { IntegrationEvent } from '@ddd-ts-kit/kernel';
2
+ /** The full envelope of a fact that belongs to a tenant: what a transport of a multi-tenant project carries. */
3
+ export declare function tenantEnvelope(event: IntegrationEvent): IntegrationEvent;
4
+ //# sourceMappingURL=tenant-envelope.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tenant-envelope.d.ts","sourceRoot":"","sources":["../../src/contracts/tenant-envelope.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAG3D,gHAAgH;AAChH,wBAAgB,cAAc,CAAC,KAAK,EAAE,gBAAgB,GAAG,gBAAgB,CAExE"}
@@ -0,0 +1,6 @@
1
+ import { fullEnvelope } from './full-envelope.js';
2
+ /** The full envelope of a fact that belongs to a tenant: what a transport of a multi-tenant project carries. */
3
+ export function tenantEnvelope(event) {
4
+ return { ...fullEnvelope(event), tenantId: 'tenant-7' };
5
+ }
6
+ //# sourceMappingURL=tenant-envelope.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tenant-envelope.js","sourceRoot":"","sources":["../../src/contracts/tenant-envelope.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAElD,gHAAgH;AAChH,MAAM,UAAU,cAAc,CAAC,KAAuB;IACpD,OAAO,EAAE,GAAG,YAAY,CAAC,KAAK,CAAC,EAAE,QAAQ,EAAE,UAAU,EAAE,CAAC;AAC1D,CAAC"}
@@ -0,0 +1,37 @@
1
+ import type { AggregateRoot, ExecutionScope, Repository } from '@ddd-ts-kit/kernel';
2
+ import type { Awaitable } from './awaitable.js';
3
+ import type { ContractRunner } from './contract-runner.js';
4
+ export interface TenantIsolationContractOptions<A extends AggregateRoot<Id>, Id extends string | number> {
5
+ /** The strategy and the adapter: `KnexInvoiceRepository, shared tables`. */
6
+ readonly name: string;
7
+ /**
8
+ * The repository, on empty storage where both tenants `acme` and `globex` exist (their
9
+ * schema or database provisioned), reading the tenant from `scope`; called before each test.
10
+ */
11
+ createRepository(scope: ExecutionScope): Awaitable<Repository<A, Id>>;
12
+ /** A new valid aggregate with an id of its own at each call. */
13
+ createAggregate(): A;
14
+ /** Any business operation that changes what `stateOf` returns. */
15
+ mutate(aggregate: A): void;
16
+ idOf(aggregate: A): Id;
17
+ stateOf(aggregate: A): unknown;
18
+ /**
19
+ * A new aggregate, never saved, with the id of `aggregate`: what a tenant would insert under
20
+ * an id another tenant already holds. Without it, that case is not run.
21
+ */
22
+ recreate?(aggregate: A): A;
23
+ /**
24
+ * Whether an elevation of platform staff over every tenant reads another tenant's aggregate:
25
+ * true on shared tables (and under row-level security), false where a unit of work reaches one
26
+ * tenant's storage only (schema or database per tenant). Writes are refused either way.
27
+ */
28
+ readonly elevatedReads?: boolean;
29
+ }
30
+ /**
31
+ * What every strategy of tenant isolation guarantees, for one repository: no read and no write
32
+ * crosses from one tenant to another (an update, an insert under a taken id, a write under an
33
+ * elevation), an elevation widens reads only, and work that names no tenant reaches nothing. Run it
34
+ * against each adapter and each strategy a project uses.
35
+ */
36
+ export declare function tenantIsolationContract<A extends AggregateRoot<Id>, Id extends string | number = string>(runner: ContractRunner, options: TenantIsolationContractOptions<A, Id>): void;
37
+ //# sourceMappingURL=tenant-isolation-contract.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tenant-isolation-contract.d.ts","sourceRoot":"","sources":["../../src/contracts/tenant-isolation-contract.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,aAAa,EAAoB,cAAc,EAAE,UAAU,EAAmB,MAAM,oBAAoB,CAAC;AAEvH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAChD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAI3D,MAAM,WAAW,8BAA8B,CAAC,CAAC,SAAS,aAAa,CAAC,EAAE,CAAC,EAAE,EAAE,SAAS,MAAM,GAAG,MAAM;IACrG,4EAA4E;IAC5E,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB;;;OAGG;IACH,gBAAgB,CAAC,KAAK,EAAE,cAAc,GAAG,SAAS,CAAC,UAAU,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;IACtE,gEAAgE;IAChE,eAAe,IAAI,CAAC,CAAC;IACrB,kEAAkE;IAClE,MAAM,CAAC,SAAS,EAAE,CAAC,GAAG,IAAI,CAAC;IAC3B,IAAI,CAAC,SAAS,EAAE,CAAC,GAAG,EAAE,CAAC;IACvB,OAAO,CAAC,SAAS,EAAE,CAAC,GAAG,OAAO,CAAC;IAC/B;;;OAGG;IACH,QAAQ,CAAC,CAAC,SAAS,EAAE,CAAC,GAAG,CAAC,CAAC;IAC3B;;;;OAIG;IACH,QAAQ,CAAC,aAAa,CAAC,EAAE,OAAO,CAAC;CAClC;AAMD;;;;;GAKG;AACH,wBAAgB,uBAAuB,CAAC,CAAC,SAAS,aAAa,CAAC,EAAE,CAAC,EAAE,EAAE,SAAS,MAAM,GAAG,MAAM,GAAG,MAAM,EACtG,MAAM,EAAE,cAAc,EACtB,OAAO,EAAE,8BAA8B,CAAC,CAAC,EAAE,EAAE,CAAC,GAC7C,IAAI,CAEN"}
@@ -0,0 +1,117 @@
1
+ import { AsyncLocalStorageExecutionScope, NoCurrentTenantError, executionContext, systemActor, } from '@ddd-ts-kit/kernel';
2
+ import { asTenant } from '../execution/as-tenant.js';
3
+ import { ContractSuite } from './contract-suite.js';
4
+ import { failureOf } from './failure-of.js';
5
+ const ACME = 'acme';
6
+ const GLOBEX = 'globex';
7
+ const STAFF = 'initech';
8
+ /**
9
+ * What every strategy of tenant isolation guarantees, for one repository: no read and no write
10
+ * crosses from one tenant to another (an update, an insert under a taken id, a write under an
11
+ * elevation), an elevation widens reads only, and work that names no tenant reaches nothing. Run it
12
+ * against each adapter and each strategy a project uses.
13
+ */
14
+ export function tenantIsolationContract(runner, options) {
15
+ new TenantIsolationSuite(runner, options).describe(`${options.name} (tenant isolation contract)`);
16
+ }
17
+ class TenantIsolationSuite extends ContractSuite {
18
+ options;
19
+ static scope = new AsyncLocalStorageExecutionScope();
20
+ constructor(runner, options) {
21
+ super(runner, () => options.createRepository(TenantIsolationSuite.scope));
22
+ this.options = options;
23
+ }
24
+ tests() {
25
+ this.hidesWhatAnotherTenantSaved();
26
+ this.keepsAnotherTenantFromOverwriting();
27
+ this.keepsAnotherTenantFromInserting();
28
+ this.widensReadsOnlyUnderAnElevation();
29
+ this.refusesWorkWithoutATenant();
30
+ }
31
+ hidesWhatAnotherTenantSaved() {
32
+ const { options } = this;
33
+ this.it('hides from a tenant what another tenant saved, and keeps it for its owner', async () => {
34
+ const saved = options.createAggregate();
35
+ await this.as(ACME, () => this.subject.save(saved));
36
+ this.expect(await this.as(GLOBEX, () => this.subject.findById(options.idOf(saved)))).toBe(undefined);
37
+ const found = await this.as(ACME, () => this.subject.findById(options.idOf(saved)));
38
+ this.expect(found === undefined ? undefined : options.stateOf(found)).toEqual(options.stateOf(saved));
39
+ });
40
+ }
41
+ keepsAnotherTenantFromOverwriting() {
42
+ const { options } = this;
43
+ this.it('leaves untouched what a tenant saved when another saves under the same id', async () => {
44
+ const saved = options.createAggregate();
45
+ const original = options.stateOf(saved);
46
+ await this.as(ACME, () => this.subject.save(saved));
47
+ const intruder = await this.as(ACME, () => this.subject.findById(options.idOf(saved)));
48
+ if (intruder !== undefined) {
49
+ options.mutate(intruder);
50
+ await failureOf(() => this.as(GLOBEX, () => this.subject.save(intruder)));
51
+ }
52
+ const kept = await this.as(ACME, () => this.subject.findById(options.idOf(saved)));
53
+ this.expect(kept === undefined ? undefined : options.stateOf(kept)).toEqual(original);
54
+ });
55
+ }
56
+ keepsAnotherTenantFromInserting() {
57
+ const { options } = this;
58
+ const recreate = options.recreate?.bind(options);
59
+ if (recreate === undefined) {
60
+ return;
61
+ }
62
+ this.it('leaves untouched what a tenant saved when another inserts a new aggregate under its id', async () => {
63
+ const saved = options.createAggregate();
64
+ const original = options.stateOf(saved);
65
+ await this.as(ACME, () => this.subject.save(saved));
66
+ const clash = recreate(saved);
67
+ options.mutate(clash);
68
+ await failureOf(() => this.as(GLOBEX, () => this.subject.save(clash)));
69
+ const kept = await this.as(ACME, () => this.subject.findById(options.idOf(saved)));
70
+ this.expect(kept === undefined ? undefined : options.stateOf(kept)).toEqual(original);
71
+ });
72
+ }
73
+ widensReadsOnlyUnderAnElevation() {
74
+ const { options } = this;
75
+ this.it('lets an elevation read what it reaches when the strategy allows it, and write nothing', async () => {
76
+ const saved = options.createAggregate();
77
+ const original = options.stateOf(saved);
78
+ const elevation = { reason: 'CONTRACT', tenants: 'all' };
79
+ const staff = Object.freeze({ ...this.contextOf(STAFF), elevation });
80
+ await this.as(ACME, () => this.subject.save(saved));
81
+ if (options.elevatedReads === true) {
82
+ const seen = await TenantIsolationSuite.scope.run(staff, () => this.subject.findById(options.idOf(saved)));
83
+ this.expect(seen === undefined ? undefined : options.stateOf(seen)).toEqual(original);
84
+ }
85
+ const changed = await this.as(ACME, () => this.subject.findById(options.idOf(saved)));
86
+ if (changed !== undefined) {
87
+ options.mutate(changed);
88
+ await failureOf(() => TenantIsolationSuite.scope.run(staff, () => this.subject.save(changed)));
89
+ }
90
+ const kept = await this.as(ACME, () => this.subject.findById(options.idOf(saved)));
91
+ this.expect(kept === undefined ? undefined : options.stateOf(kept)).toEqual(original);
92
+ });
93
+ }
94
+ refusesWorkWithoutATenant() {
95
+ const { options } = this;
96
+ this.it('refuses a write of work that names no tenant, and shows it nothing', async () => {
97
+ const saved = options.createAggregate();
98
+ await this.as(ACME, () => this.subject.save(saved));
99
+ const job = executionContext({ correlationId: 'no-tenant', actor: systemActor('contract'), origin: 'test' });
100
+ const scope = TenantIsolationSuite.scope;
101
+ const read = await Promise.resolve()
102
+ .then(() => scope.run(job, () => this.subject.findById(options.idOf(saved))))
103
+ .catch((error) => error);
104
+ const write = await failureOf(() => scope.run(job, () => this.subject.save(options.createAggregate())));
105
+ // Refused by the adapter, or, under row-level security alone, shown nothing by the database.
106
+ this.expect(read instanceof NoCurrentTenantError || read === undefined).toBe(true);
107
+ this.expect(write instanceof NoCurrentTenantError).toBe(true);
108
+ });
109
+ }
110
+ contextOf(tenantId) {
111
+ return executionContext({ correlationId: 'contract', actor: systemActor('contract'), origin: 'test', tenantId });
112
+ }
113
+ as(tenantId, work) {
114
+ return asTenant(TenantIsolationSuite.scope, tenantId, work);
115
+ }
116
+ }
117
+ //# sourceMappingURL=tenant-isolation-contract.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tenant-isolation-contract.js","sourceRoot":"","sources":["../../src/contracts/tenant-isolation-contract.ts"],"names":[],"mappings":"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"}
@@ -8,6 +8,12 @@ export { criteriaContractDefinition } from './contracts/criteria/criteria-contra
8
8
  export type { CriteriaContractRow } from './contracts/criteria/criteria-contract-row.js';
9
9
  export { criteriaContractRows } from './contracts/criteria/criteria-contract-rows.js';
10
10
  export { eventBusContract, type EventBusContractOptions, type EventBusUnderContract, } from './contracts/event-bus-contract.js';
11
+ export { fileStorageContract } from './contracts/file-storage-contract.js';
12
+ export type { FileStorageContractOptions } from './contracts/file-storage/file-storage-contract-options.js';
13
+ export { followServed } from './contracts/file-storage/follow-served.js';
14
+ export { followWithFetch } from './contracts/file-storage/follow-with-fetch.js';
15
+ export type { FollowedResponse } from './contracts/file-storage/followed-response.js';
16
+ export type { SignedRequest } from './contracts/file-storage/signed-request.js';
11
17
  export { jobSchedulerContract, type JobSchedulerContractOptions, type JobSchedulerUnderContract, } from './contracts/job-scheduler-contract.js';
12
18
  export { lockContract, type LockContractOptions } from './contracts/lock-contract.js';
13
19
  export { loggerContract, type LoggerContractOptions } from './contracts/logger-contract.js';
@@ -22,6 +28,7 @@ export { readModelStoreContract, type ReadModelStoreContractOptions } from './co
22
28
  export type { ReadModelStoreUnderContract } from './contracts/read-model/read-model-store-under-contract.js';
23
29
  export { SourceOfTruth } from './contracts/read-model/source-of-truth.js';
24
30
  export { repositoryContract, type RepositoryContractOptions } from './contracts/repository-contract.js';
31
+ export { tenantIsolationContract, type TenantIsolationContractOptions, } from './contracts/tenant-isolation-contract.js';
25
32
  export { unitOfWorkContract, type UnitOfWorkContractOptions } from './contracts/unit-of-work-contract.js';
26
33
  export type { UnitOfWorkUnderContract } from './contracts/unit-of-work/unit-of-work-under-contract.js';
27
34
  //# sourceMappingURL=contracts.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"contracts.d.ts","sourceRoot":"","sources":["../src/contracts.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AAC1D,OAAO,EAAE,aAAa,EAAE,KAAK,oBAAoB,EAAE,MAAM,+BAA+B,CAAC;AACzF,YAAY,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAC;AACrE,OAAO,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AAC9D,OAAO,EACL,gBAAgB,EAChB,KAAK,uBAAuB,EAC5B,KAAK,sBAAsB,GAC5B,MAAM,kCAAkC,CAAC;AAC1C,YAAY,EAAE,YAAY,EAAE,MAAM,uCAAuC,CAAC;AAC1E,OAAO,EAAE,0BAA0B,EAAE,MAAM,sDAAsD,CAAC;AAClG,YAAY,EAAE,mBAAmB,EAAE,MAAM,+CAA+C,CAAC;AACzF,OAAO,EAAE,oBAAoB,EAAE,MAAM,gDAAgD,CAAC;AACtF,OAAO,EACL,gBAAgB,EAChB,KAAK,uBAAuB,EAC5B,KAAK,qBAAqB,GAC3B,MAAM,mCAAmC,CAAC;AAC3C,OAAO,EACL,oBAAoB,EACpB,KAAK,2BAA2B,EAChC,KAAK,yBAAyB,GAC/B,MAAM,uCAAuC,CAAC;AAC/C,OAAO,EAAE,YAAY,EAAE,KAAK,mBAAmB,EAAE,MAAM,8BAA8B,CAAC;AACtF,OAAO,EAAE,cAAc,EAAE,KAAK,qBAAqB,EAAE,MAAM,gCAAgC,CAAC;AAC5F,YAAY,EAAE,YAAY,EAAE,MAAM,qCAAqC,CAAC;AACxE,YAAY,EAAE,UAAU,EAAE,MAAM,mCAAmC,CAAC;AACpE,YAAY,EAAE,mBAAmB,EAAE,MAAM,6CAA6C,CAAC;AACvF,YAAY,EAAE,mBAAmB,EAAE,MAAM,6CAA6C,CAAC;AACvF,OAAO,EACL,mBAAmB,EACnB,KAAK,0BAA0B,EAC/B,KAAK,wBAAwB,GAC9B,MAAM,sCAAsC,CAAC;AAC9C,OAAO,EACL,2BAA2B,EAC3B,KAAK,kCAAkC,GACxC,MAAM,+CAA+C,CAAC;AACvD,OAAO,EAAE,mBAAmB,EAAE,KAAK,0BAA0B,EAAE,MAAM,sCAAsC,CAAC;AAC5G,OAAO,EAAE,sBAAsB,EAAE,KAAK,6BAA6B,EAAE,MAAM,0CAA0C,CAAC;AACtH,YAAY,EAAE,2BAA2B,EAAE,MAAM,2DAA2D,CAAC;AAC7G,OAAO,EAAE,aAAa,EAAE,MAAM,2CAA2C,CAAC;AAC1E,OAAO,EAAE,kBAAkB,EAAE,KAAK,yBAAyB,EAAE,MAAM,oCAAoC,CAAC;AACxG,OAAO,EAAE,kBAAkB,EAAE,KAAK,yBAAyB,EAAE,MAAM,sCAAsC,CAAC;AAC1G,YAAY,EAAE,uBAAuB,EAAE,MAAM,yDAAyD,CAAC"}
1
+ {"version":3,"file":"contracts.d.ts","sourceRoot":"","sources":["../src/contracts.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AAC1D,OAAO,EAAE,aAAa,EAAE,KAAK,oBAAoB,EAAE,MAAM,+BAA+B,CAAC;AACzF,YAAY,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAC;AACrE,OAAO,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AAC9D,OAAO,EACL,gBAAgB,EAChB,KAAK,uBAAuB,EAC5B,KAAK,sBAAsB,GAC5B,MAAM,kCAAkC,CAAC;AAC1C,YAAY,EAAE,YAAY,EAAE,MAAM,uCAAuC,CAAC;AAC1E,OAAO,EAAE,0BAA0B,EAAE,MAAM,sDAAsD,CAAC;AAClG,YAAY,EAAE,mBAAmB,EAAE,MAAM,+CAA+C,CAAC;AACzF,OAAO,EAAE,oBAAoB,EAAE,MAAM,gDAAgD,CAAC;AACtF,OAAO,EACL,gBAAgB,EAChB,KAAK,uBAAuB,EAC5B,KAAK,qBAAqB,GAC3B,MAAM,mCAAmC,CAAC;AAC3C,OAAO,EAAE,mBAAmB,EAAE,MAAM,sCAAsC,CAAC;AAC3E,YAAY,EAAE,0BAA0B,EAAE,MAAM,2DAA2D,CAAC;AAC5G,OAAO,EAAE,YAAY,EAAE,MAAM,2CAA2C,CAAC;AACzE,OAAO,EAAE,eAAe,EAAE,MAAM,+CAA+C,CAAC;AAChF,YAAY,EAAE,gBAAgB,EAAE,MAAM,+CAA+C,CAAC;AACtF,YAAY,EAAE,aAAa,EAAE,MAAM,4CAA4C,CAAC;AAChF,OAAO,EACL,oBAAoB,EACpB,KAAK,2BAA2B,EAChC,KAAK,yBAAyB,GAC/B,MAAM,uCAAuC,CAAC;AAC/C,OAAO,EAAE,YAAY,EAAE,KAAK,mBAAmB,EAAE,MAAM,8BAA8B,CAAC;AACtF,OAAO,EAAE,cAAc,EAAE,KAAK,qBAAqB,EAAE,MAAM,gCAAgC,CAAC;AAC5F,YAAY,EAAE,YAAY,EAAE,MAAM,qCAAqC,CAAC;AACxE,YAAY,EAAE,UAAU,EAAE,MAAM,mCAAmC,CAAC;AACpE,YAAY,EAAE,mBAAmB,EAAE,MAAM,6CAA6C,CAAC;AACvF,YAAY,EAAE,mBAAmB,EAAE,MAAM,6CAA6C,CAAC;AACvF,OAAO,EACL,mBAAmB,EACnB,KAAK,0BAA0B,EAC/B,KAAK,wBAAwB,GAC9B,MAAM,sCAAsC,CAAC;AAC9C,OAAO,EACL,2BAA2B,EAC3B,KAAK,kCAAkC,GACxC,MAAM,+CAA+C,CAAC;AACvD,OAAO,EAAE,mBAAmB,EAAE,KAAK,0BAA0B,EAAE,MAAM,sCAAsC,CAAC;AAC5G,OAAO,EAAE,sBAAsB,EAAE,KAAK,6BAA6B,EAAE,MAAM,0CAA0C,CAAC;AACtH,YAAY,EAAE,2BAA2B,EAAE,MAAM,2DAA2D,CAAC;AAC7G,OAAO,EAAE,aAAa,EAAE,MAAM,2CAA2C,CAAC;AAC1E,OAAO,EAAE,kBAAkB,EAAE,KAAK,yBAAyB,EAAE,MAAM,oCAAoC,CAAC;AACxG,OAAO,EACL,uBAAuB,EACvB,KAAK,8BAA8B,GACpC,MAAM,0CAA0C,CAAC;AAClD,OAAO,EAAE,kBAAkB,EAAE,KAAK,yBAAyB,EAAE,MAAM,sCAAsC,CAAC;AAC1G,YAAY,EAAE,uBAAuB,EAAE,MAAM,yDAAyD,CAAC"}
package/dist/contracts.js CHANGED
@@ -4,6 +4,9 @@ export { criteriaContract, } from './contracts/criteria-contract.js';
4
4
  export { criteriaContractDefinition } from './contracts/criteria/criteria-contract-definition.js';
5
5
  export { criteriaContractRows } from './contracts/criteria/criteria-contract-rows.js';
6
6
  export { eventBusContract, } from './contracts/event-bus-contract.js';
7
+ export { fileStorageContract } from './contracts/file-storage-contract.js';
8
+ export { followServed } from './contracts/file-storage/follow-served.js';
9
+ export { followWithFetch } from './contracts/file-storage/follow-with-fetch.js';
7
10
  export { jobSchedulerContract, } from './contracts/job-scheduler-contract.js';
8
11
  export { lockContract } from './contracts/lock-contract.js';
9
12
  export { loggerContract } from './contracts/logger-contract.js';
@@ -13,5 +16,6 @@ export { rateLimiterContract } from './contracts/rate-limiter-contract.js';
13
16
  export { readModelStoreContract } from './contracts/read-model-store-contract.js';
14
17
  export { SourceOfTruth } from './contracts/read-model/source-of-truth.js';
15
18
  export { repositoryContract } from './contracts/repository-contract.js';
19
+ export { tenantIsolationContract, } from './contracts/tenant-isolation-contract.js';
16
20
  export { unitOfWorkContract } from './contracts/unit-of-work-contract.js';
17
21
  //# sourceMappingURL=contracts.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"contracts.js","sourceRoot":"","sources":["../src/contracts.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAA6B,MAAM,+BAA+B,CAAC;AAEzF,OAAO,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AAC9D,OAAO,EACL,gBAAgB,GAGjB,MAAM,kCAAkC,CAAC;AAE1C,OAAO,EAAE,0BAA0B,EAAE,MAAM,sDAAsD,CAAC;AAElG,OAAO,EAAE,oBAAoB,EAAE,MAAM,gDAAgD,CAAC;AACtF,OAAO,EACL,gBAAgB,GAGjB,MAAM,mCAAmC,CAAC;AAC3C,OAAO,EACL,oBAAoB,GAGrB,MAAM,uCAAuC,CAAC;AAC/C,OAAO,EAAE,YAAY,EAA4B,MAAM,8BAA8B,CAAC;AACtF,OAAO,EAAE,cAAc,EAA8B,MAAM,gCAAgC,CAAC;AAK5F,OAAO,EACL,mBAAmB,GAGpB,MAAM,sCAAsC,CAAC;AAC9C,OAAO,EACL,2BAA2B,GAE5B,MAAM,+CAA+C,CAAC;AACvD,OAAO,EAAE,mBAAmB,EAAmC,MAAM,sCAAsC,CAAC;AAC5G,OAAO,EAAE,sBAAsB,EAAsC,MAAM,0CAA0C,CAAC;AAEtH,OAAO,EAAE,aAAa,EAAE,MAAM,2CAA2C,CAAC;AAC1E,OAAO,EAAE,kBAAkB,EAAkC,MAAM,oCAAoC,CAAC;AACxG,OAAO,EAAE,kBAAkB,EAAkC,MAAM,sCAAsC,CAAC"}
1
+ {"version":3,"file":"contracts.js","sourceRoot":"","sources":["../src/contracts.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAA6B,MAAM,+BAA+B,CAAC;AAEzF,OAAO,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AAC9D,OAAO,EACL,gBAAgB,GAGjB,MAAM,kCAAkC,CAAC;AAE1C,OAAO,EAAE,0BAA0B,EAAE,MAAM,sDAAsD,CAAC;AAElG,OAAO,EAAE,oBAAoB,EAAE,MAAM,gDAAgD,CAAC;AACtF,OAAO,EACL,gBAAgB,GAGjB,MAAM,mCAAmC,CAAC;AAC3C,OAAO,EAAE,mBAAmB,EAAE,MAAM,sCAAsC,CAAC;AAE3E,OAAO,EAAE,YAAY,EAAE,MAAM,2CAA2C,CAAC;AACzE,OAAO,EAAE,eAAe,EAAE,MAAM,+CAA+C,CAAC;AAGhF,OAAO,EACL,oBAAoB,GAGrB,MAAM,uCAAuC,CAAC;AAC/C,OAAO,EAAE,YAAY,EAA4B,MAAM,8BAA8B,CAAC;AACtF,OAAO,EAAE,cAAc,EAA8B,MAAM,gCAAgC,CAAC;AAK5F,OAAO,EACL,mBAAmB,GAGpB,MAAM,sCAAsC,CAAC;AAC9C,OAAO,EACL,2BAA2B,GAE5B,MAAM,+CAA+C,CAAC;AACvD,OAAO,EAAE,mBAAmB,EAAmC,MAAM,sCAAsC,CAAC;AAC5G,OAAO,EAAE,sBAAsB,EAAsC,MAAM,0CAA0C,CAAC;AAEtH,OAAO,EAAE,aAAa,EAAE,MAAM,2CAA2C,CAAC;AAC1E,OAAO,EAAE,kBAAkB,EAAkC,MAAM,oCAAoC,CAAC;AACxG,OAAO,EACL,uBAAuB,GAExB,MAAM,0CAA0C,CAAC;AAClD,OAAO,EAAE,kBAAkB,EAAkC,MAAM,sCAAsC,CAAC"}
@@ -0,0 +1,7 @@
1
+ import type { ExecutionScope } from '@ddd-ts-kit/kernel';
2
+ /**
3
+ * Runs a block as the work of a member of a tenant: `await asTenant(scope, 'acme', () =>
4
+ * invoices.save(invoice))`. The actor is a test user of that tenant, origin `test`.
5
+ */
6
+ export declare function asTenant<T>(scope: ExecutionScope, tenantId: string, work: () => T): T;
7
+ //# sourceMappingURL=as-tenant.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"as-tenant.d.ts","sourceRoot":"","sources":["../../src/execution/as-tenant.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAGzD;;;GAGG;AACH,wBAAgB,QAAQ,CAAC,CAAC,EAAE,KAAK,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,GAAG,CAAC,CAIrF"}