hexok 1.0.1 → 2.0.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 +4 -26
- package/dist/adapter.d.ts +18 -0
- package/dist/adapter.d.ts.map +1 -0
- package/dist/adapter.js +21 -0
- package/dist/adapter.js.map +1 -0
- package/dist/catalog.d.ts +88 -0
- package/dist/catalog.d.ts.map +1 -0
- package/dist/catalog.js +79 -0
- package/dist/catalog.js.map +1 -0
- package/dist/{core/coded-error.d.ts → coded-error.d.ts} +9 -4
- package/dist/coded-error.d.ts.map +1 -0
- package/dist/{core/coded-error.js → coded-error.js} +9 -4
- package/dist/coded-error.js.map +1 -0
- package/dist/cow-draft.d.ts.map +1 -0
- package/dist/cow-draft.js.map +1 -0
- package/dist/entity.d.ts +63 -0
- package/dist/entity.d.ts.map +1 -0
- package/dist/{domain/entity.js → entity.js} +52 -80
- package/dist/entity.js.map +1 -0
- package/dist/error-map.d.ts +22 -0
- package/dist/error-map.d.ts.map +1 -0
- package/dist/error-map.js +2 -0
- package/dist/error-map.js.map +1 -0
- package/dist/errors.d.ts +85 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +85 -0
- package/dist/errors.js.map +1 -0
- package/dist/event-handler.d.ts +31 -0
- package/dist/event-handler.d.ts.map +1 -0
- package/dist/event-handler.js +28 -0
- package/dist/event-handler.js.map +1 -0
- package/dist/event.d.ts +37 -0
- package/dist/event.d.ts.map +1 -0
- package/dist/event.js +44 -0
- package/dist/event.js.map +1 -0
- package/dist/index.d.ts +16 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +14 -0
- package/dist/index.js.map +1 -0
- package/dist/mapper.d.ts +100 -0
- package/dist/mapper.d.ts.map +1 -0
- package/dist/mapper.js +167 -0
- package/dist/mapper.js.map +1 -0
- package/dist/port.d.ts +20 -0
- package/dist/port.d.ts.map +1 -0
- package/dist/port.js +25 -0
- package/dist/port.js.map +1 -0
- package/dist/result.d.ts.map +1 -0
- package/dist/result.js.map +1 -0
- package/dist/schema.d.ts +37 -0
- package/dist/schema.d.ts.map +1 -0
- package/dist/schema.js +50 -0
- package/dist/schema.js.map +1 -0
- package/dist/{core/standard-schema.d.ts → standard-schema.d.ts} +1 -1
- package/dist/standard-schema.d.ts.map +1 -0
- package/dist/standard-schema.js.map +1 -0
- package/dist/use-case.d.ts +183 -0
- package/dist/use-case.d.ts.map +1 -0
- package/dist/use-case.js +221 -0
- package/dist/use-case.js.map +1 -0
- package/dist/{core/schema.d.ts → validate.d.ts} +1 -1
- package/dist/validate.d.ts.map +1 -0
- package/dist/{core/schema.js → validate.js} +1 -1
- package/dist/validate.js.map +1 -0
- package/package.json +5 -25
- package/dist/app/callable-use-case.d.ts +0 -34
- package/dist/app/callable-use-case.d.ts.map +0 -1
- package/dist/app/callable-use-case.js +0 -41
- package/dist/app/callable-use-case.js.map +0 -1
- package/dist/app/contract.d.ts +0 -46
- package/dist/app/contract.d.ts.map +0 -1
- package/dist/app/contract.js +0 -28
- package/dist/app/contract.js.map +0 -1
- package/dist/app/error-factory.d.ts +0 -9
- package/dist/app/error-factory.d.ts.map +0 -1
- package/dist/app/error-factory.js +0 -30
- package/dist/app/error-factory.js.map +0 -1
- package/dist/app/event-channel.d.ts +0 -133
- package/dist/app/event-channel.d.ts.map +0 -1
- package/dist/app/event-channel.js +0 -49
- package/dist/app/event-channel.js.map +0 -1
- package/dist/app/event-use-case.d.ts +0 -47
- package/dist/app/event-use-case.d.ts.map +0 -1
- package/dist/app/event-use-case.js +0 -54
- package/dist/app/event-use-case.js.map +0 -1
- package/dist/app/execute-ctx.d.ts +0 -92
- package/dist/app/execute-ctx.d.ts.map +0 -1
- package/dist/app/execute-ctx.js +0 -2
- package/dist/app/execute-ctx.js.map +0 -1
- package/dist/app/external-use-case.d.ts +0 -25
- package/dist/app/external-use-case.d.ts.map +0 -1
- package/dist/app/external-use-case.js +0 -25
- package/dist/app/external-use-case.js.map +0 -1
- package/dist/app/index.d.ts +0 -9
- package/dist/app/index.d.ts.map +0 -1
- package/dist/app/index.js +0 -8
- package/dist/app/index.js.map +0 -1
- package/dist/app/internal-use-case.d.ts +0 -26
- package/dist/app/internal-use-case.d.ts.map +0 -1
- package/dist/app/internal-use-case.js +0 -26
- package/dist/app/internal-use-case.js.map +0 -1
- package/dist/app/nest.d.ts +0 -9
- package/dist/app/nest.d.ts.map +0 -1
- package/dist/app/nest.js +0 -28
- package/dist/app/nest.js.map +0 -1
- package/dist/app/types.d.ts +0 -153
- package/dist/app/types.d.ts.map +0 -1
- package/dist/app/types.js +0 -17
- package/dist/app/types.js.map +0 -1
- package/dist/core/coded-error.d.ts.map +0 -1
- package/dist/core/coded-error.js.map +0 -1
- package/dist/core/error-map.d.ts +0 -21
- package/dist/core/error-map.d.ts.map +0 -1
- package/dist/core/error-map.js +0 -5
- package/dist/core/error-map.js.map +0 -1
- package/dist/core/index.d.ts +0 -6
- package/dist/core/index.d.ts.map +0 -1
- package/dist/core/index.js +0 -5
- package/dist/core/index.js.map +0 -1
- package/dist/core/result.d.ts.map +0 -1
- package/dist/core/result.js.map +0 -1
- package/dist/core/schema.d.ts.map +0 -1
- package/dist/core/schema.js.map +0 -1
- package/dist/core/standard-schema.d.ts.map +0 -1
- package/dist/core/standard-schema.js.map +0 -1
- package/dist/domain/capabilities.d.ts +0 -42
- package/dist/domain/capabilities.d.ts.map +0 -1
- package/dist/domain/capabilities.js +0 -2
- package/dist/domain/capabilities.js.map +0 -1
- package/dist/domain/catalog.d.ts +0 -46
- package/dist/domain/catalog.d.ts.map +0 -1
- package/dist/domain/catalog.js +0 -114
- package/dist/domain/catalog.js.map +0 -1
- package/dist/domain/channel.d.ts +0 -36
- package/dist/domain/channel.d.ts.map +0 -1
- package/dist/domain/channel.js +0 -2
- package/dist/domain/channel.js.map +0 -1
- package/dist/domain/cow-draft.d.ts.map +0 -1
- package/dist/domain/cow-draft.js.map +0 -1
- package/dist/domain/entity.d.ts +0 -120
- package/dist/domain/entity.d.ts.map +0 -1
- package/dist/domain/entity.js.map +0 -1
- package/dist/domain/envelope.d.ts +0 -59
- package/dist/domain/envelope.d.ts.map +0 -1
- package/dist/domain/envelope.js +0 -2
- package/dist/domain/envelope.js.map +0 -1
- package/dist/domain/event.d.ts +0 -44
- package/dist/domain/event.d.ts.map +0 -1
- package/dist/domain/event.js +0 -21
- package/dist/domain/event.js.map +0 -1
- package/dist/domain/index.d.ts +0 -8
- package/dist/domain/index.d.ts.map +0 -1
- package/dist/domain/index.js +0 -5
- package/dist/domain/index.js.map +0 -1
- package/dist/domain/port.d.ts +0 -45
- package/dist/domain/port.d.ts.map +0 -1
- package/dist/domain/port.js +0 -41
- package/dist/domain/port.js.map +0 -1
- package/dist/infra/adapter.d.ts +0 -22
- package/dist/infra/adapter.d.ts.map +0 -1
- package/dist/infra/adapter.js +0 -18
- package/dist/infra/adapter.js.map +0 -1
- package/dist/infra/index.d.ts +0 -3
- package/dist/infra/index.d.ts.map +0 -1
- package/dist/infra/index.js +0 -3
- package/dist/infra/index.js.map +0 -1
- package/dist/infra/mapper.d.ts +0 -48
- package/dist/infra/mapper.d.ts.map +0 -1
- package/dist/infra/mapper.js +0 -77
- package/dist/infra/mapper.js.map +0 -1
- package/dist/runtime/app.d.ts +0 -100
- package/dist/runtime/app.d.ts.map +0 -1
- package/dist/runtime/app.js +0 -292
- package/dist/runtime/app.js.map +0 -1
- package/dist/runtime/channel.d.ts +0 -34
- package/dist/runtime/channel.d.ts.map +0 -1
- package/dist/runtime/channel.js +0 -110
- package/dist/runtime/channel.js.map +0 -1
- package/dist/runtime/client.d.ts +0 -21
- package/dist/runtime/client.d.ts.map +0 -1
- package/dist/runtime/client.js +0 -2
- package/dist/runtime/client.js.map +0 -1
- package/dist/runtime/completeness.d.ts +0 -89
- package/dist/runtime/completeness.d.ts.map +0 -1
- package/dist/runtime/completeness.js +0 -2
- package/dist/runtime/completeness.js.map +0 -1
- package/dist/runtime/envelope.d.ts +0 -7
- package/dist/runtime/envelope.d.ts.map +0 -1
- package/dist/runtime/envelope.js +0 -69
- package/dist/runtime/envelope.js.map +0 -1
- package/dist/runtime/events.d.ts +0 -6
- package/dist/runtime/events.d.ts.map +0 -1
- package/dist/runtime/events.js +0 -48
- package/dist/runtime/events.js.map +0 -1
- package/dist/runtime/http-status.d.ts +0 -3
- package/dist/runtime/http-status.d.ts.map +0 -1
- package/dist/runtime/http-status.js +0 -11
- package/dist/runtime/http-status.js.map +0 -1
- package/dist/runtime/http.d.ts +0 -4
- package/dist/runtime/http.d.ts.map +0 -1
- package/dist/runtime/http.js +0 -58
- package/dist/runtime/http.js.map +0 -1
- package/dist/runtime/index.d.ts +0 -10
- package/dist/runtime/index.d.ts.map +0 -1
- package/dist/runtime/index.js +0 -6
- package/dist/runtime/index.js.map +0 -1
- package/dist/runtime/interceptor.d.ts +0 -61
- package/dist/runtime/interceptor.d.ts.map +0 -1
- package/dist/runtime/interceptor.js +0 -7
- package/dist/runtime/interceptor.js.map +0 -1
- package/dist/runtime/invoke.d.ts +0 -34
- package/dist/runtime/invoke.d.ts.map +0 -1
- package/dist/runtime/invoke.js +0 -235
- package/dist/runtime/invoke.js.map +0 -1
- package/dist/runtime/middleware.d.ts +0 -20
- package/dist/runtime/middleware.d.ts.map +0 -1
- package/dist/runtime/middleware.js +0 -2
- package/dist/runtime/middleware.js.map +0 -1
- package/dist/runtime/rpc.d.ts +0 -24
- package/dist/runtime/rpc.d.ts.map +0 -1
- package/dist/runtime/rpc.js +0 -16
- package/dist/runtime/rpc.js.map +0 -1
- package/dist/testing/app-test.d.ts +0 -77
- package/dist/testing/app-test.d.ts.map +0 -1
- package/dist/testing/app-test.js +0 -109
- package/dist/testing/app-test.js.map +0 -1
- package/dist/testing/in-memory-bus.d.ts +0 -19
- package/dist/testing/in-memory-bus.d.ts.map +0 -1
- package/dist/testing/in-memory-bus.js +0 -31
- package/dist/testing/in-memory-bus.js.map +0 -1
- package/dist/testing/in-memory-channel.d.ts +0 -32
- package/dist/testing/in-memory-channel.d.ts.map +0 -1
- package/dist/testing/in-memory-channel.js +0 -65
- package/dist/testing/in-memory-channel.js.map +0 -1
- package/dist/testing/in-memory-queue.d.ts +0 -24
- package/dist/testing/in-memory-queue.d.ts.map +0 -1
- package/dist/testing/in-memory-queue.js +0 -66
- package/dist/testing/in-memory-queue.js.map +0 -1
- package/dist/testing/in-memory-repository.d.ts +0 -44
- package/dist/testing/in-memory-repository.d.ts.map +0 -1
- package/dist/testing/in-memory-repository.js +0 -60
- package/dist/testing/in-memory-repository.js.map +0 -1
- package/dist/testing/index.d.ts +0 -6
- package/dist/testing/index.d.ts.map +0 -1
- package/dist/testing/index.js +0 -6
- package/dist/testing/index.js.map +0 -1
- /package/dist/{domain/cow-draft.d.ts → cow-draft.d.ts} +0 -0
- /package/dist/{domain/cow-draft.js → cow-draft.js} +0 -0
- /package/dist/{core/result.d.ts → result.d.ts} +0 -0
- /package/dist/{core/result.js → result.js} +0 -0
- /package/dist/{core/standard-schema.js → standard-schema.js} +0 -0
|
@@ -1,65 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* In-process channel adapter. Records `sent`. `stop()` closes connections.
|
|
3
|
-
*/
|
|
4
|
-
export class InMemoryChannel {
|
|
5
|
-
/** `{ id, payload }` records from `send`, in order. */
|
|
6
|
-
sent = [];
|
|
7
|
-
#clients = new Map();
|
|
8
|
-
/** Empty channel. Pass to `.route(Channel, InMemoryChannel.create())`. */
|
|
9
|
-
static create() {
|
|
10
|
-
return new InMemoryChannel();
|
|
11
|
-
}
|
|
12
|
-
/** Track a connected client. Replaces an existing row with the same `id`. */
|
|
13
|
-
join(id, session, connection) {
|
|
14
|
-
this.#clients.set(id, { session, connection });
|
|
15
|
-
connection.addEventListener('close', () => {
|
|
16
|
-
this.leave(id);
|
|
17
|
-
});
|
|
18
|
-
}
|
|
19
|
-
/** Drop the client without closing the connection. */
|
|
20
|
-
leave(id) {
|
|
21
|
-
this.#clients.delete(id);
|
|
22
|
-
}
|
|
23
|
-
/** Close the connection; the `close` listener then `leave`s. */
|
|
24
|
-
eject(id) {
|
|
25
|
-
const row = this.#clients.get(id);
|
|
26
|
-
if (!row)
|
|
27
|
-
return;
|
|
28
|
-
row.connection.close();
|
|
29
|
-
}
|
|
30
|
-
/** Replace session claims for a connected client. No-op if unknown `id`. */
|
|
31
|
-
update(id, session) {
|
|
32
|
-
const row = this.#clients.get(id);
|
|
33
|
-
if (!row)
|
|
34
|
-
return;
|
|
35
|
-
row.session = session;
|
|
36
|
-
}
|
|
37
|
-
/** Snapshot of connected `{ id, session }` rows. */
|
|
38
|
-
list() {
|
|
39
|
-
return [...this.#clients.entries()].map(([id, row]) => ({
|
|
40
|
-
id,
|
|
41
|
-
session: row.session,
|
|
42
|
-
}));
|
|
43
|
-
}
|
|
44
|
-
/** Record and deliver `payload` to `id`. Leaves the client if `send` throws. */
|
|
45
|
-
send(id, payload) {
|
|
46
|
-
const row = this.#clients.get(id);
|
|
47
|
-
if (!row)
|
|
48
|
-
return;
|
|
49
|
-
this.sent.push({ id, payload });
|
|
50
|
-
try {
|
|
51
|
-
row.connection.send(payload);
|
|
52
|
-
}
|
|
53
|
-
catch {
|
|
54
|
-
this.leave(id);
|
|
55
|
-
}
|
|
56
|
-
}
|
|
57
|
-
/** Close every connection and clear clients. Does not clear `sent`. */
|
|
58
|
-
async stop() {
|
|
59
|
-
for (const { connection } of this.#clients.values()) {
|
|
60
|
-
connection.close();
|
|
61
|
-
}
|
|
62
|
-
this.#clients.clear();
|
|
63
|
-
}
|
|
64
|
-
}
|
|
65
|
-
//# sourceMappingURL=in-memory-channel.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"in-memory-channel.js","sourceRoot":"","sources":["../../src/testing/in-memory-channel.ts"],"names":[],"mappings":"AAOA;;GAEG;AACH,MAAM,OAAO,eAAe;IAG1B,uDAAuD;IAC9C,IAAI,GAA2C,EAAE,CAAC;IAC3D,QAAQ,GAAG,IAAI,GAAG,EAAwB,CAAC;IAE3C,0EAA0E;IAC1E,MAAM,CAAC,MAAM;QACX,OAAO,IAAI,eAAe,EAAK,CAAC;IAClC,CAAC;IAED,6EAA6E;IAC7E,IAAI,CAAC,EAAU,EAAE,OAAgB,EAAE,UAA6B;QAC9D,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,OAAO,EAAE,UAAU,EAAE,CAAC,CAAC;QAC/C,UAAU,CAAC,gBAAgB,CAAC,OAAO,EAAE,GAAG,EAAE;YACxC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QACjB,CAAC,CAAC,CAAC;IACL,CAAC;IAED,sDAAsD;IACtD,KAAK,CAAC,EAAU;QACd,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IAC3B,CAAC;IAED,gEAAgE;IAChE,KAAK,CAAC,EAAU;QACd,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAClC,IAAI,CAAC,GAAG;YAAE,OAAO;QACjB,GAAG,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC;IACzB,CAAC;IAED,4EAA4E;IAC5E,MAAM,CAAC,EAAU,EAAE,OAAgB;QACjC,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAClC,IAAI,CAAC,GAAG;YAAE,OAAO;QACjB,GAAG,CAAC,OAAO,GAAG,OAAO,CAAC;IACxB,CAAC;IAED,oDAAoD;IACpD,IAAI;QACF,OAAO,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC;YACtD,EAAE;YACF,OAAO,EAAE,GAAG,CAAC,OAAO;SACrB,CAAC,CAAC,CAAC;IACN,CAAC;IAED,gFAAgF;IAChF,IAAI,CAAC,EAAU,EAAE,OAAe;QAC9B,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAClC,IAAI,CAAC,GAAG;YAAE,OAAO;QACjB,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC;QAChC,IAAI,CAAC;YACH,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC/B,CAAC;QAAC,MAAM,CAAC;YACP,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QACjB,CAAC;IACH,CAAC;IAED,uEAAuE;IACvE,KAAK,CAAC,IAAI;QACR,KAAK,MAAM,EAAE,UAAU,EAAE,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC;YACpD,UAAU,CAAC,KAAK,EAAE,CAAC;QACrB,CAAC;QACD,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC;IACxB,CAAC;CACF"}
|
|
@@ -1,24 +0,0 @@
|
|
|
1
|
-
import type { Envelope, QueueAdapter, QueueConsumeCtx } from '../domain/index.js';
|
|
2
|
-
type Consumer = (envelope: Envelope, ctx: QueueConsumeCtx) => Promise<void>;
|
|
3
|
-
/**
|
|
4
|
-
* In-process queue. `nack` (or a throw) redelivers with `attempt + 1` up to
|
|
5
|
-
* `maxAttempts` (default 3). `stop()` clears consumers.
|
|
6
|
-
*/
|
|
7
|
-
export declare class InMemoryQueue implements QueueAdapter {
|
|
8
|
-
#private;
|
|
9
|
-
readonly kind: "queue";
|
|
10
|
-
/** Envelopes passed to `publish`, in order (one entry per publish, not per attempt). */
|
|
11
|
-
readonly published: Envelope[];
|
|
12
|
-
/** Stop redelivering after this many attempts. */
|
|
13
|
-
maxAttempts: number;
|
|
14
|
-
/** Empty queue. Pass to `.bind(catalog, InMemoryQueue.create())`. */
|
|
15
|
-
static create(): InMemoryQueue;
|
|
16
|
-
/** Record the envelope and dispatch every consumer group for its key. */
|
|
17
|
-
publish(envelope: Envelope): Promise<void>;
|
|
18
|
-
/** Register the consumer for `key`+`group`. Later calls replace that group. */
|
|
19
|
-
consume(key: string, group: string, handler: Consumer): void;
|
|
20
|
-
/** Drop all consumers. Does not clear `published`. */
|
|
21
|
-
stop(): Promise<void>;
|
|
22
|
-
}
|
|
23
|
-
export {};
|
|
24
|
-
//# sourceMappingURL=in-memory-queue.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"in-memory-queue.d.ts","sourceRoot":"","sources":["../../src/testing/in-memory-queue.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,QAAQ,EACR,YAAY,EACZ,eAAe,EAChB,MAAM,oBAAoB,CAAC;AAE5B,KAAK,QAAQ,GAAG,CAAC,QAAQ,EAAE,QAAQ,EAAE,GAAG,EAAE,eAAe,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;AAE5E;;;GAGG;AACH,qBAAa,aAAc,YAAW,YAAY;;IAChD,QAAQ,CAAC,IAAI,EAAG,OAAO,CAAU;IACjC,wFAAwF;IACxF,QAAQ,CAAC,SAAS,EAAE,QAAQ,EAAE,CAAM;IAEpC,kDAAkD;IAClD,WAAW,SAAK;IAEhB,qEAAqE;IACrE,MAAM,CAAC,MAAM,IAAI,aAAa;IAI9B,yEAAyE;IACnE,OAAO,CAAC,QAAQ,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;IAuChD,+EAA+E;IAC/E,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,GAAG,IAAI;IAM5D,sDAAsD;IAChD,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;CAG5B"}
|
|
@@ -1,66 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* In-process queue. `nack` (or a throw) redelivers with `attempt + 1` up to
|
|
3
|
-
* `maxAttempts` (default 3). `stop()` clears consumers.
|
|
4
|
-
*/
|
|
5
|
-
export class InMemoryQueue {
|
|
6
|
-
kind = 'queue';
|
|
7
|
-
/** Envelopes passed to `publish`, in order (one entry per publish, not per attempt). */
|
|
8
|
-
published = [];
|
|
9
|
-
#consumers = new Map();
|
|
10
|
-
/** Stop redelivering after this many attempts. */
|
|
11
|
-
maxAttempts = 3;
|
|
12
|
-
/** Empty queue. Pass to `.bind(catalog, InMemoryQueue.create())`. */
|
|
13
|
-
static create() {
|
|
14
|
-
return new InMemoryQueue();
|
|
15
|
-
}
|
|
16
|
-
/** Record the envelope and dispatch every consumer group for its key. */
|
|
17
|
-
async publish(envelope) {
|
|
18
|
-
this.published.push(envelope);
|
|
19
|
-
const groups = this.#consumers.get(envelope.key);
|
|
20
|
-
if (!groups)
|
|
21
|
-
return;
|
|
22
|
-
for (const consumer of groups.values()) {
|
|
23
|
-
await this.#deliver(envelope, consumer, 1);
|
|
24
|
-
}
|
|
25
|
-
}
|
|
26
|
-
async #deliver(envelope, consumer, attempt) {
|
|
27
|
-
let outcome = 'none';
|
|
28
|
-
let thrown;
|
|
29
|
-
const ctx = {
|
|
30
|
-
attempt,
|
|
31
|
-
ack: async () => {
|
|
32
|
-
outcome = 'ack';
|
|
33
|
-
},
|
|
34
|
-
nack: async () => {
|
|
35
|
-
outcome = 'nack';
|
|
36
|
-
},
|
|
37
|
-
};
|
|
38
|
-
try {
|
|
39
|
-
await consumer(envelope, ctx);
|
|
40
|
-
}
|
|
41
|
-
catch (error) {
|
|
42
|
-
thrown = error;
|
|
43
|
-
if (outcome === 'none')
|
|
44
|
-
outcome = 'nack';
|
|
45
|
-
}
|
|
46
|
-
if (outcome !== 'nack')
|
|
47
|
-
return;
|
|
48
|
-
if (attempt < this.maxAttempts) {
|
|
49
|
-
await this.#deliver(envelope, consumer, attempt + 1);
|
|
50
|
-
return;
|
|
51
|
-
}
|
|
52
|
-
if (thrown !== undefined)
|
|
53
|
-
throw thrown;
|
|
54
|
-
}
|
|
55
|
-
/** Register the consumer for `key`+`group`. Later calls replace that group. */
|
|
56
|
-
consume(key, group, handler) {
|
|
57
|
-
const groups = this.#consumers.get(key) ?? new Map();
|
|
58
|
-
groups.set(group, handler);
|
|
59
|
-
this.#consumers.set(key, groups);
|
|
60
|
-
}
|
|
61
|
-
/** Drop all consumers. Does not clear `published`. */
|
|
62
|
-
async stop() {
|
|
63
|
-
this.#consumers.clear();
|
|
64
|
-
}
|
|
65
|
-
}
|
|
66
|
-
//# sourceMappingURL=in-memory-queue.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"in-memory-queue.js","sourceRoot":"","sources":["../../src/testing/in-memory-queue.ts"],"names":[],"mappings":"AAQA;;;GAGG;AACH,MAAM,OAAO,aAAa;IACf,IAAI,GAAG,OAAgB,CAAC;IACjC,wFAAwF;IAC/E,SAAS,GAAe,EAAE,CAAC;IACpC,UAAU,GAAG,IAAI,GAAG,EAAiC,CAAC;IACtD,kDAAkD;IAClD,WAAW,GAAG,CAAC,CAAC;IAEhB,qEAAqE;IACrE,MAAM,CAAC,MAAM;QACX,OAAO,IAAI,aAAa,EAAE,CAAC;IAC7B,CAAC;IAED,yEAAyE;IACzE,KAAK,CAAC,OAAO,CAAC,QAAkB;QAC9B,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC9B,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;QACjD,IAAI,CAAC,MAAM;YAAE,OAAO;QACpB,KAAK,MAAM,QAAQ,IAAI,MAAM,CAAC,MAAM,EAAE,EAAE,CAAC;YACvC,MAAM,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC;QAC7C,CAAC;IACH,CAAC;IAED,KAAK,CAAC,QAAQ,CACZ,QAAkB,EAClB,QAAkB,EAClB,OAAe;QAEf,IAAI,OAAO,GAA4B,MAAM,CAAC;QAC9C,IAAI,MAAe,CAAC;QACpB,MAAM,GAAG,GAAoB;YAC3B,OAAO;YACP,GAAG,EAAE,KAAK,IAAI,EAAE;gBACd,OAAO,GAAG,KAAK,CAAC;YAClB,CAAC;YACD,IAAI,EAAE,KAAK,IAAI,EAAE;gBACf,OAAO,GAAG,MAAM,CAAC;YACnB,CAAC;SACF,CAAC;QACF,IAAI,CAAC;YACH,MAAM,QAAQ,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;QAChC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,GAAG,KAAK,CAAC;YACf,IAAI,OAAO,KAAK,MAAM;gBAAE,OAAO,GAAG,MAAM,CAAC;QAC3C,CAAC;QACD,IAAI,OAAO,KAAK,MAAM;YAAE,OAAO;QAC/B,IAAI,OAAO,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;YAC/B,MAAM,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,QAAQ,EAAE,OAAO,GAAG,CAAC,CAAC,CAAC;YACrD,OAAO;QACT,CAAC;QACD,IAAI,MAAM,KAAK,SAAS;YAAE,MAAM,MAAM,CAAC;IACzC,CAAC;IAED,+EAA+E;IAC/E,OAAO,CAAC,GAAW,EAAE,KAAa,EAAE,OAAiB;QACnD,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,IAAI,GAAG,EAAoB,CAAC;QACvE,MAAM,CAAC,GAAG,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;QAC3B,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;IACnC,CAAC;IAED,sDAAsD;IACtD,KAAK,CAAC,IAAI;QACR,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC;IAC1B,CAAC;CACF"}
|
|
@@ -1,44 +0,0 @@
|
|
|
1
|
-
import type { CrudRepository, Entity, PortToken } from '../domain/index.js';
|
|
2
|
-
type CrudKeys = 'get' | 'save' | 'list' | 'delete';
|
|
3
|
-
type ExtraKeys<I> = Exclude<keyof I, CrudKeys | 'bindTo' | 'fork'>;
|
|
4
|
-
type ExtraOption<I> = [ExtraKeys<I>] extends [never] ? unknown : {
|
|
5
|
-
extra: Pick<I, ExtraKeys<I>>;
|
|
6
|
-
};
|
|
7
|
-
type RepoEntity<I> = I extends {
|
|
8
|
-
get: (id: string) => Promise<infer E>;
|
|
9
|
-
} ? NonNullable<E> : Entity<Record<string, unknown>>;
|
|
10
|
-
type EntityKey<E> = E extends {
|
|
11
|
-
toProps(): infer P;
|
|
12
|
-
} ? P extends object ? keyof P & string : string : string;
|
|
13
|
-
type AssertCrud<I> = 'get' | 'save' extends keyof I ? I : `hexok: InMemoryRepository.of expects a CRUD repository port`;
|
|
14
|
-
/**
|
|
15
|
-
* In-memory fake for the standard CRUD port `{ get, save, list, delete }`.
|
|
16
|
-
* Clones on get/save so tests do not mutate the store by accident.
|
|
17
|
-
*
|
|
18
|
-
* ```ts
|
|
19
|
-
* .provide(IncidentRepository, InMemoryRepository.of(IncidentRepository, {
|
|
20
|
-
* keyBy: 'id',
|
|
21
|
-
* seed: [Incident.open('1')],
|
|
22
|
-
* }))
|
|
23
|
-
* ```
|
|
24
|
-
*/
|
|
25
|
-
export declare class InMemoryRepository<E extends Entity<Record<string, unknown>>> implements CrudRepository<E> {
|
|
26
|
-
#private;
|
|
27
|
-
private constructor();
|
|
28
|
-
/** Fake a CRUD port. Extra methods beyond get/save/list/delete go in `extra`. */
|
|
29
|
-
static of<I>(_token: [AssertCrud<I>] extends [I] ? PortToken<I> : AssertCrud<I>, options: {
|
|
30
|
-
keyBy: EntityKey<RepoEntity<I>>;
|
|
31
|
-
seed?: RepoEntity<I>[];
|
|
32
|
-
} & ExtraOption<I>): I;
|
|
33
|
-
/** Clone of the stored entity, or `null`. */
|
|
34
|
-
get(id: string): Promise<E | null>;
|
|
35
|
-
/** Clone into the store and `commit()` the working entity. */
|
|
36
|
-
save(entity: E): Promise<void>;
|
|
37
|
-
/** Clones of every stored entity. */
|
|
38
|
-
list(): Promise<E[]>;
|
|
39
|
-
/** Remove by id. No-op if missing. */
|
|
40
|
-
delete(id: string): Promise<void>;
|
|
41
|
-
private keyOf;
|
|
42
|
-
}
|
|
43
|
-
export {};
|
|
44
|
-
//# sourceMappingURL=in-memory-repository.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"in-memory-repository.d.ts","sourceRoot":"","sources":["../../src/testing/in-memory-repository.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,cAAc,EACd,MAAM,EAEN,SAAS,EACV,MAAM,oBAAoB,CAAC;AAE5B,KAAK,QAAQ,GAAG,KAAK,GAAG,MAAM,GAAG,MAAM,GAAG,QAAQ,CAAC;AAEnD,KAAK,SAAS,CAAC,CAAC,IAAI,OAAO,CAAC,MAAM,CAAC,EAAE,QAAQ,GAAG,QAAQ,GAAG,MAAM,CAAC,CAAC;AAEnE,KAAK,WAAW,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,GAChD,OAAO,GACP;IAAE,KAAK,EAAE,IAAI,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,CAAA;CAAE,CAAC;AAErC,KAAK,UAAU,CAAC,CAAC,IAAI,CAAC,SAAS;IAC7B,GAAG,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC;CACvC,GACG,WAAW,CAAC,CAAC,CAAC,GACd,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;AAEpC,KAAK,SAAS,CAAC,CAAC,IAAI,CAAC,SAAS;IAAE,OAAO,IAAI,MAAM,CAAC,CAAA;CAAE,GAChD,CAAC,SAAS,MAAM,GACd,MAAM,CAAC,GAAG,MAAM,GAChB,MAAM,GACR,MAAM,CAAC;AAEX,KAAK,UAAU,CAAC,CAAC,IAAI,KAAK,GAAG,MAAM,SAAS,MAAM,CAAC,GAC/C,CAAC,GACD,6DAA6D,CAAC;AAElE;;;;;;;;;;GAUG;AACH,qBAAa,kBAAkB,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CACvE,YAAW,cAAc,CAAC,CAAC,CAAC;;IAK5B,OAAO;IAOP,iFAAiF;IACjF,MAAM,CAAC,EAAE,CAAC,CAAC,EACT,MAAM,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC,CAAC,CAAC,GAAG,UAAU,CAAC,CAAC,CAAC,EAClE,OAAO,EAAE;QACP,KAAK,EAAE,SAAS,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC;QAChC,IAAI,CAAC,EAAE,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC;KACxB,GAAG,WAAW,CAAC,CAAC,CAAC,GACjB,CAAC;IAWJ,6CAA6C;IACvC,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC;IAKxC,8DAA8D;IACxD,IAAI,CAAC,MAAM,EAAE,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAKpC,qCAAqC;IAC/B,IAAI,IAAI,OAAO,CAAC,CAAC,EAAE,CAAC;IAI1B,sCAAsC;IAChC,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIvC,OAAO,CAAC,KAAK;CAUd"}
|
|
@@ -1,60 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* In-memory fake for the standard CRUD port `{ get, save, list, delete }`.
|
|
3
|
-
* Clones on get/save so tests do not mutate the store by accident.
|
|
4
|
-
*
|
|
5
|
-
* ```ts
|
|
6
|
-
* .provide(IncidentRepository, InMemoryRepository.of(IncidentRepository, {
|
|
7
|
-
* keyBy: 'id',
|
|
8
|
-
* seed: [Incident.open('1')],
|
|
9
|
-
* }))
|
|
10
|
-
* ```
|
|
11
|
-
*/
|
|
12
|
-
export class InMemoryRepository {
|
|
13
|
-
#keyBy;
|
|
14
|
-
#store = new Map();
|
|
15
|
-
constructor(keyBy, seed) {
|
|
16
|
-
this.#keyBy = keyBy;
|
|
17
|
-
for (const entity of seed) {
|
|
18
|
-
this.#store.set(this.keyOf(entity), cloneEntity(entity));
|
|
19
|
-
}
|
|
20
|
-
}
|
|
21
|
-
/** Fake a CRUD port. Extra methods beyond get/save/list/delete go in `extra`. */
|
|
22
|
-
static of(_token, options) {
|
|
23
|
-
const repo = new InMemoryRepository(options.keyBy, (options.seed ?? []));
|
|
24
|
-
if ('extra' in options && options.extra !== undefined) {
|
|
25
|
-
return Object.assign(repo, options.extra);
|
|
26
|
-
}
|
|
27
|
-
return repo;
|
|
28
|
-
}
|
|
29
|
-
/** Clone of the stored entity, or `null`. */
|
|
30
|
-
async get(id) {
|
|
31
|
-
const found = this.#store.get(id);
|
|
32
|
-
return found ? cloneEntity(found) : null;
|
|
33
|
-
}
|
|
34
|
-
/** Clone into the store and `commit()` the working entity. */
|
|
35
|
-
async save(entity) {
|
|
36
|
-
this.#store.set(this.keyOf(entity), cloneEntity(entity));
|
|
37
|
-
entity.commit();
|
|
38
|
-
}
|
|
39
|
-
/** Clones of every stored entity. */
|
|
40
|
-
async list() {
|
|
41
|
-
return [...this.#store.values()].map((entity) => cloneEntity(entity));
|
|
42
|
-
}
|
|
43
|
-
/** Remove by id. No-op if missing. */
|
|
44
|
-
async delete(id) {
|
|
45
|
-
this.#store.delete(id);
|
|
46
|
-
}
|
|
47
|
-
keyOf(entity) {
|
|
48
|
-
const props = entity.toProps();
|
|
49
|
-
const key = props[this.#keyBy];
|
|
50
|
-
if (typeof key !== 'string') {
|
|
51
|
-
throw new Error(`hexok: InMemoryRepository keyBy "${this.#keyBy}" is not a string`);
|
|
52
|
-
}
|
|
53
|
-
return key;
|
|
54
|
-
}
|
|
55
|
-
}
|
|
56
|
-
function cloneEntity(entity) {
|
|
57
|
-
const Ctor = entity.constructor;
|
|
58
|
-
return Ctor.restore(entity.toProps());
|
|
59
|
-
}
|
|
60
|
-
//# sourceMappingURL=in-memory-repository.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"in-memory-repository.js","sourceRoot":"","sources":["../../src/testing/in-memory-repository.ts"],"names":[],"mappings":"AA+BA;;;;;;;;;;GAUG;AACH,MAAM,OAAO,kBAAkB;IAGpB,MAAM,CAAS;IACf,MAAM,GAAG,IAAI,GAAG,EAAa,CAAC;IAEvC,YAAoB,KAAa,EAAE,IAAS;QAC1C,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC;QACpB,KAAK,MAAM,MAAM,IAAI,IAAI,EAAE,CAAC;YAC1B,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC;QAC3D,CAAC;IACH,CAAC;IAED,iFAAiF;IACjF,MAAM,CAAC,EAAE,CACP,MAAkE,EAClE,OAGkB;QAElB,MAAM,IAAI,GAAG,IAAI,kBAAkB,CACjC,OAAO,CAAC,KAAK,EACb,CAAC,OAAO,CAAC,IAAI,IAAI,EAAE,CAAsC,CAC1D,CAAC;QACF,IAAI,OAAO,IAAI,OAAO,IAAI,OAAO,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;YACtD,OAAO,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,KAAK,CAAiB,CAAC;QAC5D,CAAC;QACD,OAAO,IAAoB,CAAC;IAC9B,CAAC;IAED,6CAA6C;IAC7C,KAAK,CAAC,GAAG,CAAC,EAAU;QAClB,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAClC,OAAO,KAAK,CAAC,CAAC,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAC3C,CAAC;IAED,8DAA8D;IAC9D,KAAK,CAAC,IAAI,CAAC,MAAS;QAClB,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC;QACzD,MAAM,CAAC,MAAM,EAAE,CAAC;IAClB,CAAC;IAED,qCAAqC;IACrC,KAAK,CAAC,IAAI;QACR,OAAO,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC;IACxE,CAAC;IAED,sCAAsC;IACtC,KAAK,CAAC,MAAM,CAAC,EAAU;QACrB,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IACzB,CAAC;IAEO,KAAK,CAAC,MAAS;QACrB,MAAM,KAAK,GAAG,MAAM,CAAC,OAAO,EAA6B,CAAC;QAC1D,MAAM,GAAG,GAAG,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC/B,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE,CAAC;YAC5B,MAAM,IAAI,KAAK,CACb,oCAAoC,IAAI,CAAC,MAAM,mBAAmB,CACnE,CAAC;QACJ,CAAC;QACD,OAAO,GAAG,CAAC;IACb,CAAC;CACF;AAED,SAAS,WAAW,CAA4C,MAAS;IACvE,MAAM,IAAI,GAAG,MAAM,CAAC,WAEnB,CAAC;IACF,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC;AACxC,CAAC"}
|
package/dist/testing/index.d.ts
DELETED
|
@@ -1,6 +0,0 @@
|
|
|
1
|
-
export { App, TestAppBuilder, type TestAppInstance } from './app-test.js';
|
|
2
|
-
export { InMemoryBus } from './in-memory-bus.js';
|
|
3
|
-
export { InMemoryChannel } from './in-memory-channel.js';
|
|
4
|
-
export { InMemoryQueue } from './in-memory-queue.js';
|
|
5
|
-
export { InMemoryRepository } from './in-memory-repository.js';
|
|
6
|
-
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/testing/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,cAAc,EAAE,KAAK,eAAe,EAAE,MAAM,eAAe,CAAC;AAC1E,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC"}
|
package/dist/testing/index.js
DELETED
|
@@ -1,6 +0,0 @@
|
|
|
1
|
-
export { App, TestAppBuilder } from './app-test.js';
|
|
2
|
-
export { InMemoryBus } from './in-memory-bus.js';
|
|
3
|
-
export { InMemoryChannel } from './in-memory-channel.js';
|
|
4
|
-
export { InMemoryQueue } from './in-memory-queue.js';
|
|
5
|
-
export { InMemoryRepository } from './in-memory-repository.js';
|
|
6
|
-
//# sourceMappingURL=index.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/testing/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,cAAc,EAAwB,MAAM,eAAe,CAAC;AAC1E,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC"}
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|