hexok 1.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/dist/app/api-use-case.d.ts +52 -0
- package/dist/app/api-use-case.d.ts.map +1 -0
- package/dist/app/api-use-case.js +59 -0
- package/dist/app/api-use-case.js.map +1 -0
- package/dist/app/callable-use-case.d.ts +34 -0
- package/dist/app/callable-use-case.d.ts.map +1 -0
- package/dist/app/callable-use-case.js +41 -0
- package/dist/app/callable-use-case.js.map +1 -0
- package/dist/app/contract.d.ts +46 -0
- package/dist/app/contract.d.ts.map +1 -0
- package/dist/app/contract.js +28 -0
- package/dist/app/contract.js.map +1 -0
- package/dist/app/error-factory.d.ts +9 -0
- package/dist/app/error-factory.d.ts.map +1 -0
- package/dist/app/error-factory.js +30 -0
- package/dist/app/error-factory.js.map +1 -0
- package/dist/app/event-channel.d.ts +133 -0
- package/dist/app/event-channel.d.ts.map +1 -0
- package/dist/app/event-channel.js +49 -0
- package/dist/app/event-channel.js.map +1 -0
- package/dist/app/event-use-case.d.ts +47 -0
- package/dist/app/event-use-case.d.ts.map +1 -0
- package/dist/app/event-use-case.js +54 -0
- package/dist/app/event-use-case.js.map +1 -0
- package/dist/app/execute-ctx.d.ts +92 -0
- package/dist/app/execute-ctx.d.ts.map +1 -0
- package/dist/app/execute-ctx.js +2 -0
- package/dist/app/execute-ctx.js.map +1 -0
- package/dist/app/external-use-case.d.ts +25 -0
- package/dist/app/external-use-case.d.ts.map +1 -0
- package/dist/app/external-use-case.js +25 -0
- package/dist/app/external-use-case.js.map +1 -0
- package/dist/app/index.d.ts +9 -0
- package/dist/app/index.d.ts.map +1 -0
- package/dist/app/index.js +8 -0
- package/dist/app/index.js.map +1 -0
- package/dist/app/internal-use-case.d.ts +26 -0
- package/dist/app/internal-use-case.d.ts.map +1 -0
- package/dist/app/internal-use-case.js +26 -0
- package/dist/app/internal-use-case.js.map +1 -0
- package/dist/app/nest.d.ts +9 -0
- package/dist/app/nest.d.ts.map +1 -0
- package/dist/app/nest.js +28 -0
- package/dist/app/nest.js.map +1 -0
- package/dist/app/types.d.ts +153 -0
- package/dist/app/types.d.ts.map +1 -0
- package/dist/app/types.js +17 -0
- package/dist/app/types.js.map +1 -0
- package/dist/core/coded-error.d.ts +24 -0
- package/dist/core/coded-error.d.ts.map +1 -0
- package/dist/core/coded-error.js +32 -0
- package/dist/core/coded-error.js.map +1 -0
- package/dist/core/error-map.d.ts +21 -0
- package/dist/core/error-map.d.ts.map +1 -0
- package/dist/core/error-map.js +5 -0
- package/dist/core/error-map.js.map +1 -0
- package/dist/core/index.d.ts +6 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/index.js +5 -0
- package/dist/core/index.js.map +1 -0
- package/dist/core/result.d.ts +23 -0
- package/dist/core/result.d.ts.map +1 -0
- package/dist/core/result.js +11 -0
- package/dist/core/result.js.map +1 -0
- package/dist/core/schema.d.ts +19 -0
- package/dist/core/schema.d.ts.map +1 -0
- package/dist/core/schema.js +28 -0
- package/dist/core/schema.js.map +1 -0
- package/dist/core/standard-schema.d.ts +51 -0
- package/dist/core/standard-schema.d.ts.map +1 -0
- package/dist/core/standard-schema.js +2 -0
- package/dist/core/standard-schema.js.map +1 -0
- package/dist/domain/capabilities.d.ts +42 -0
- package/dist/domain/capabilities.d.ts.map +1 -0
- package/dist/domain/capabilities.js +2 -0
- package/dist/domain/capabilities.js.map +1 -0
- package/dist/domain/catalog.d.ts +46 -0
- package/dist/domain/catalog.d.ts.map +1 -0
- package/dist/domain/catalog.js +114 -0
- package/dist/domain/catalog.js.map +1 -0
- package/dist/domain/channel.d.ts +36 -0
- package/dist/domain/channel.d.ts.map +1 -0
- package/dist/domain/channel.js +2 -0
- package/dist/domain/channel.js.map +1 -0
- package/dist/domain/cow-draft.d.ts +10 -0
- package/dist/domain/cow-draft.d.ts.map +1 -0
- package/dist/domain/cow-draft.js +147 -0
- package/dist/domain/cow-draft.js.map +1 -0
- package/dist/domain/entity.d.ts +120 -0
- package/dist/domain/entity.d.ts.map +1 -0
- package/dist/domain/entity.js +263 -0
- package/dist/domain/entity.js.map +1 -0
- package/dist/domain/envelope.d.ts +59 -0
- package/dist/domain/envelope.d.ts.map +1 -0
- package/dist/domain/envelope.js +2 -0
- package/dist/domain/envelope.js.map +1 -0
- package/dist/domain/event.d.ts +44 -0
- package/dist/domain/event.d.ts.map +1 -0
- package/dist/domain/event.js +21 -0
- package/dist/domain/event.js.map +1 -0
- package/dist/domain/index.d.ts +8 -0
- package/dist/domain/index.d.ts.map +1 -0
- package/dist/domain/index.js +5 -0
- package/dist/domain/index.js.map +1 -0
- package/dist/domain/port.d.ts +45 -0
- package/dist/domain/port.d.ts.map +1 -0
- package/dist/domain/port.js +41 -0
- package/dist/domain/port.js.map +1 -0
- package/dist/infra/adapter.d.ts +22 -0
- package/dist/infra/adapter.d.ts.map +1 -0
- package/dist/infra/adapter.js +18 -0
- package/dist/infra/adapter.js.map +1 -0
- package/dist/infra/index.d.ts +3 -0
- package/dist/infra/index.d.ts.map +1 -0
- package/dist/infra/index.js +3 -0
- package/dist/infra/index.js.map +1 -0
- package/dist/infra/mapper.d.ts +48 -0
- package/dist/infra/mapper.d.ts.map +1 -0
- package/dist/infra/mapper.js +77 -0
- package/dist/infra/mapper.js.map +1 -0
- package/dist/runtime/app.d.ts +100 -0
- package/dist/runtime/app.d.ts.map +1 -0
- package/dist/runtime/app.js +292 -0
- package/dist/runtime/app.js.map +1 -0
- package/dist/runtime/channel.d.ts +34 -0
- package/dist/runtime/channel.d.ts.map +1 -0
- package/dist/runtime/channel.js +110 -0
- package/dist/runtime/channel.js.map +1 -0
- package/dist/runtime/client.d.ts +21 -0
- package/dist/runtime/client.d.ts.map +1 -0
- package/dist/runtime/client.js +2 -0
- package/dist/runtime/client.js.map +1 -0
- package/dist/runtime/completeness.d.ts +89 -0
- package/dist/runtime/completeness.d.ts.map +1 -0
- package/dist/runtime/completeness.js +2 -0
- package/dist/runtime/completeness.js.map +1 -0
- package/dist/runtime/envelope.d.ts +7 -0
- package/dist/runtime/envelope.d.ts.map +1 -0
- package/dist/runtime/envelope.js +69 -0
- package/dist/runtime/envelope.js.map +1 -0
- package/dist/runtime/events.d.ts +6 -0
- package/dist/runtime/events.d.ts.map +1 -0
- package/dist/runtime/events.js +48 -0
- package/dist/runtime/events.js.map +1 -0
- package/dist/runtime/http-status.d.ts +3 -0
- package/dist/runtime/http-status.d.ts.map +1 -0
- package/dist/runtime/http-status.js +11 -0
- package/dist/runtime/http-status.js.map +1 -0
- package/dist/runtime/http.d.ts +4 -0
- package/dist/runtime/http.d.ts.map +1 -0
- package/dist/runtime/http.js +58 -0
- package/dist/runtime/http.js.map +1 -0
- package/dist/runtime/index.d.ts +10 -0
- package/dist/runtime/index.d.ts.map +1 -0
- package/dist/runtime/index.js +6 -0
- package/dist/runtime/index.js.map +1 -0
- package/dist/runtime/interceptor.d.ts +61 -0
- package/dist/runtime/interceptor.d.ts.map +1 -0
- package/dist/runtime/interceptor.js +7 -0
- package/dist/runtime/interceptor.js.map +1 -0
- package/dist/runtime/invoke.d.ts +34 -0
- package/dist/runtime/invoke.d.ts.map +1 -0
- package/dist/runtime/invoke.js +235 -0
- package/dist/runtime/invoke.js.map +1 -0
- package/dist/runtime/middleware.d.ts +20 -0
- package/dist/runtime/middleware.d.ts.map +1 -0
- package/dist/runtime/middleware.js +2 -0
- package/dist/runtime/middleware.js.map +1 -0
- package/dist/runtime/rpc.d.ts +24 -0
- package/dist/runtime/rpc.d.ts.map +1 -0
- package/dist/runtime/rpc.js +16 -0
- package/dist/runtime/rpc.js.map +1 -0
- package/dist/testing/app-test.d.ts +77 -0
- package/dist/testing/app-test.d.ts.map +1 -0
- package/dist/testing/app-test.js +109 -0
- package/dist/testing/app-test.js.map +1 -0
- package/dist/testing/in-memory-broker.d.ts +18 -0
- package/dist/testing/in-memory-broker.d.ts.map +1 -0
- package/dist/testing/in-memory-broker.js +42 -0
- package/dist/testing/in-memory-broker.js.map +1 -0
- package/dist/testing/in-memory-bus.d.ts +19 -0
- package/dist/testing/in-memory-bus.d.ts.map +1 -0
- package/dist/testing/in-memory-bus.js +31 -0
- package/dist/testing/in-memory-bus.js.map +1 -0
- package/dist/testing/in-memory-channel.d.ts +32 -0
- package/dist/testing/in-memory-channel.d.ts.map +1 -0
- package/dist/testing/in-memory-channel.js +65 -0
- package/dist/testing/in-memory-channel.js.map +1 -0
- package/dist/testing/in-memory-queue.d.ts +24 -0
- package/dist/testing/in-memory-queue.d.ts.map +1 -0
- package/dist/testing/in-memory-queue.js +66 -0
- package/dist/testing/in-memory-queue.js.map +1 -0
- package/dist/testing/in-memory-repository.d.ts +44 -0
- package/dist/testing/in-memory-repository.d.ts.map +1 -0
- package/dist/testing/in-memory-repository.js +60 -0
- package/dist/testing/in-memory-repository.js.map +1 -0
- package/dist/testing/index.d.ts +6 -0
- package/dist/testing/index.d.ts.map +1 -0
- package/dist/testing/index.js +6 -0
- package/dist/testing/index.js.map +1 -0
- package/package.json +60 -0
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
export function isEnvelope(value) {
|
|
2
|
+
return (typeof value === 'object' &&
|
|
3
|
+
value !== null &&
|
|
4
|
+
'key' in value &&
|
|
5
|
+
'payload' in value &&
|
|
6
|
+
'catalog' in value &&
|
|
7
|
+
'kind' in value &&
|
|
8
|
+
'occurredAt' in value);
|
|
9
|
+
}
|
|
10
|
+
/** Wrap a domain event in an envelope, or pass an envelope through. The event must belong to one of `catalogs`. */
|
|
11
|
+
export function wrapEvent(event, catalogs, requestCtx) {
|
|
12
|
+
if (isEnvelope(event))
|
|
13
|
+
return copyTracing(event, requestCtx, false);
|
|
14
|
+
const Ctor = event.constructor;
|
|
15
|
+
const catalog = catalogs.find((item) => item.list().some((registered) => registered === Ctor));
|
|
16
|
+
if (!catalog) {
|
|
17
|
+
throw new Error(`hexok: event "${Ctor.key}" is not in a bound catalog declared by publishes`);
|
|
18
|
+
}
|
|
19
|
+
const envelope = {
|
|
20
|
+
key: Ctor.key,
|
|
21
|
+
payload: event.payload,
|
|
22
|
+
catalog: catalog.key,
|
|
23
|
+
kind: catalog.kind,
|
|
24
|
+
occurredAt: new Date(),
|
|
25
|
+
meta: {},
|
|
26
|
+
};
|
|
27
|
+
if (catalog.hasCtx) {
|
|
28
|
+
if (!('ctx' in event)) {
|
|
29
|
+
throw new Error(`hexok: event "${Ctor.key}" is missing ctx for catalog "${catalog.key}"`);
|
|
30
|
+
}
|
|
31
|
+
envelope.ctx = event.ctx;
|
|
32
|
+
}
|
|
33
|
+
return copyTracing(envelope, requestCtx, true);
|
|
34
|
+
}
|
|
35
|
+
function stringField(value, key) {
|
|
36
|
+
if (typeof value !== 'object' || value === null)
|
|
37
|
+
return undefined;
|
|
38
|
+
const field = value[key];
|
|
39
|
+
return typeof field === 'string' ? field : undefined;
|
|
40
|
+
}
|
|
41
|
+
function copyTracing(envelope, requestCtx, overwrite) {
|
|
42
|
+
const correlationId = stringField(requestCtx, 'correlationId');
|
|
43
|
+
const causationId = stringField(requestCtx, 'causationId');
|
|
44
|
+
if (correlationId !== undefined &&
|
|
45
|
+
(overwrite || envelope.correlationId === undefined)) {
|
|
46
|
+
envelope.correlationId = correlationId;
|
|
47
|
+
}
|
|
48
|
+
if (causationId !== undefined &&
|
|
49
|
+
(overwrite || envelope.causationId === undefined)) {
|
|
50
|
+
envelope.causationId = causationId;
|
|
51
|
+
}
|
|
52
|
+
return envelope;
|
|
53
|
+
}
|
|
54
|
+
/** Request ctx plus `correlationId` inherited from an incoming envelope when ctx omits it. */
|
|
55
|
+
export function tracingCtx(requestCtx, incoming) {
|
|
56
|
+
const correlationId = stringField(requestCtx, 'correlationId') ?? incoming?.correlationId;
|
|
57
|
+
const causationId = stringField(requestCtx, 'causationId');
|
|
58
|
+
if (correlationId === undefined && causationId === undefined) {
|
|
59
|
+
return requestCtx;
|
|
60
|
+
}
|
|
61
|
+
return {
|
|
62
|
+
...(typeof requestCtx === 'object' && requestCtx !== null
|
|
63
|
+
? requestCtx
|
|
64
|
+
: {}),
|
|
65
|
+
...(correlationId !== undefined ? { correlationId } : {}),
|
|
66
|
+
...(causationId !== undefined ? { causationId } : {}),
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
//# sourceMappingURL=envelope.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"envelope.js","sourceRoot":"","sources":["../../src/runtime/envelope.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { EventUseCaseCtor } from '../app/index.js';
|
|
2
|
+
import type { AnyEventCatalog, EventAdapter } from '../domain/index.js';
|
|
3
|
+
import { type InvokeDeps } from './invoke.js';
|
|
4
|
+
export declare function startHandlers(bound: Map<AnyEventCatalog, EventAdapter>, handlers: Map<string, EventUseCaseCtor[]>, deps: InvokeDeps): Promise<void>;
|
|
5
|
+
export declare function stopAdapters(bound: Map<AnyEventCatalog, EventAdapter>): Promise<void>;
|
|
6
|
+
//# sourceMappingURL=events.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"events.d.ts","sourceRoot":"","sources":["../../src/runtime/events.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACxD,OAAO,KAAK,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AACxE,OAAO,EAAE,KAAK,UAAU,EAAe,MAAM,aAAa,CAAC;AAE3D,wBAAsB,aAAa,CACjC,KAAK,EAAE,GAAG,CAAC,eAAe,EAAE,YAAY,CAAC,EACzC,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,gBAAgB,EAAE,CAAC,EACzC,IAAI,EAAE,UAAU,GACf,OAAO,CAAC,IAAI,CAAC,CA4Cf;AAED,wBAAsB,YAAY,CAChC,KAAK,EAAE,GAAG,CAAC,eAAe,EAAE,YAAY,CAAC,GACxC,OAAO,CAAC,IAAI,CAAC,CAIf"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { invokeEvent } from './invoke.js';
|
|
2
|
+
export async function startHandlers(bound, handlers, deps) {
|
|
3
|
+
for (const [catalog, adapter] of bound) {
|
|
4
|
+
for (const eventClass of catalog.list()) {
|
|
5
|
+
const handlerKey = `${catalog.key}:${eventClass.key}`;
|
|
6
|
+
const list = handlers.get(handlerKey) ?? [];
|
|
7
|
+
if (list.length === 0)
|
|
8
|
+
continue;
|
|
9
|
+
if (adapter.kind === 'bus') {
|
|
10
|
+
adapter.subscribe(eventClass.key, async (envelope) => {
|
|
11
|
+
for (const ctor of list) {
|
|
12
|
+
await invokeEvent(ctor, envelope, deps);
|
|
13
|
+
}
|
|
14
|
+
});
|
|
15
|
+
continue;
|
|
16
|
+
}
|
|
17
|
+
const groups = new Map();
|
|
18
|
+
for (const ctor of list) {
|
|
19
|
+
if (ctor.group === undefined) {
|
|
20
|
+
throw new Error(`hexok: queue handler "${ctor.key}" requires static group`);
|
|
21
|
+
}
|
|
22
|
+
const group = groups.get(ctor.group) ?? [];
|
|
23
|
+
group.push(ctor);
|
|
24
|
+
groups.set(ctor.group, group);
|
|
25
|
+
}
|
|
26
|
+
for (const [group, ctors] of groups) {
|
|
27
|
+
adapter.consume(eventClass.key, group, async (envelope, { attempt, ack, nack }) => {
|
|
28
|
+
try {
|
|
29
|
+
for (const ctor of ctors) {
|
|
30
|
+
await invokeEvent(ctor, envelope, deps, { attempt });
|
|
31
|
+
}
|
|
32
|
+
await ack();
|
|
33
|
+
}
|
|
34
|
+
catch (error) {
|
|
35
|
+
await nack();
|
|
36
|
+
throw error;
|
|
37
|
+
}
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
export async function stopAdapters(bound) {
|
|
44
|
+
for (const adapter of bound.values()) {
|
|
45
|
+
await adapter.stop?.();
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=events.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"events.js","sourceRoot":"","sources":["../../src/runtime/events.ts"],"names":[],"mappings":"AAEA,OAAO,EAAmB,WAAW,EAAE,MAAM,aAAa,CAAC;AAE3D,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,KAAyC,EACzC,QAAyC,EACzC,IAAgB;IAEhB,KAAK,MAAM,CAAC,OAAO,EAAE,OAAO,CAAC,IAAI,KAAK,EAAE,CAAC;QACvC,KAAK,MAAM,UAAU,IAAI,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC;YACxC,MAAM,UAAU,GAAG,GAAG,OAAO,CAAC,GAAG,IAAI,UAAU,CAAC,GAAG,EAAE,CAAC;YACtD,MAAM,IAAI,GAAG,QAAQ,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC;YAC5C,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;gBAAE,SAAS;YAChC,IAAI,OAAO,CAAC,IAAI,KAAK,KAAK,EAAE,CAAC;gBAC3B,OAAO,CAAC,SAAS,CAAC,UAAU,CAAC,GAAG,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE;oBACnD,KAAK,MAAM,IAAI,IAAI,IAAI,EAAE,CAAC;wBACxB,MAAM,WAAW,CAAC,IAAI,EAAE,QAAQ,EAAE,IAAI,CAAC,CAAC;oBAC1C,CAAC;gBACH,CAAC,CAAC,CAAC;gBACH,SAAS;YACX,CAAC;YACD,MAAM,MAAM,GAAG,IAAI,GAAG,EAA8B,CAAC;YACrD,KAAK,MAAM,IAAI,IAAI,IAAI,EAAE,CAAC;gBACxB,IAAI,IAAI,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;oBAC7B,MAAM,IAAI,KAAK,CACb,yBAAyB,IAAI,CAAC,GAAG,yBAAyB,CAC3D,CAAC;gBACJ,CAAC;gBACD,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;gBAC3C,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBACjB,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;YAChC,CAAC;YACD,KAAK,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,MAAM,EAAE,CAAC;gBACpC,OAAO,CAAC,OAAO,CACb,UAAU,CAAC,GAAG,EACd,KAAK,EACL,KAAK,EAAE,QAAQ,EAAE,EAAE,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE,EAAE;oBACzC,IAAI,CAAC;wBACH,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;4BACzB,MAAM,WAAW,CAAC,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC;wBACvD,CAAC;wBACD,MAAM,GAAG,EAAE,CAAC;oBACd,CAAC;oBAAC,OAAO,KAAK,EAAE,CAAC;wBACf,MAAM,IAAI,EAAE,CAAC;wBACb,MAAM,KAAK,CAAC;oBACd,CAAC;gBACH,CAAC,CACF,CAAC;YACJ,CAAC;QACH,CAAC;IACH,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,KAAyC;IAEzC,KAAK,MAAM,OAAO,IAAI,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC;QACrC,MAAM,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC;IACzB,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"http-status.d.ts","sourceRoot":"","sources":["../../src/runtime/http-status.ts"],"names":[],"mappings":"AAOA,4HAA4H;AAC5H,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE/C"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
const BY_CODE = {
|
|
2
|
+
NOT_FOUND: 404,
|
|
3
|
+
VALIDATION: 400,
|
|
4
|
+
FORBIDDEN: 403,
|
|
5
|
+
UNAUTHORIZED: 401,
|
|
6
|
+
};
|
|
7
|
+
/** Map a coded error to HTTP status. `NOT_FOUND` 404, `VALIDATION` 400, `FORBIDDEN` 403, `UNAUTHORIZED` 401; others 409. */
|
|
8
|
+
export function httpStatus(code) {
|
|
9
|
+
return BY_CODE[code] ?? 409;
|
|
10
|
+
}
|
|
11
|
+
//# sourceMappingURL=http-status.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"http-status.js","sourceRoot":"","sources":["../../src/runtime/http-status.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,GAA2B;IACtC,SAAS,EAAE,GAAG;IACd,UAAU,EAAE,GAAG;IACf,SAAS,EAAE,GAAG;IACd,YAAY,EAAE,GAAG;CAClB,CAAC;AAEF,4HAA4H;AAC5H,MAAM,UAAU,UAAU,CAAC,IAAY;IACrC,OAAO,OAAO,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC;AAC9B,CAAC"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { ExternalUseCaseCtor } from '../app/index.js';
|
|
2
|
+
import { type InvokeDeps } from './invoke.js';
|
|
3
|
+
export declare function createFetchHandler(externalUseCases: Map<string, ExternalUseCaseCtor>, deps: InvokeDeps): (request: Request) => Promise<Response>;
|
|
4
|
+
//# sourceMappingURL=http.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"http.d.ts","sourceRoot":"","sources":["../../src/runtime/http.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AAG3D,OAAO,EAAE,KAAK,UAAU,EAAkB,MAAM,aAAa,CAAC;AAE9D,wBAAgB,kBAAkB,CAChC,gBAAgB,EAAE,GAAG,CAAC,MAAM,EAAE,mBAAmB,CAAC,EAClD,IAAI,EAAE,UAAU,GACf,CAAC,OAAO,EAAE,OAAO,KAAK,OAAO,CAAC,QAAQ,CAAC,CAyDzC"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { CodedError } from '../core/index.js';
|
|
2
|
+
import { httpStatus } from './http-status.js';
|
|
3
|
+
import { invokeExternal } from './invoke.js';
|
|
4
|
+
export function createFetchHandler(externalUseCases, deps) {
|
|
5
|
+
return async (request) => {
|
|
6
|
+
const url = new URL(request.url);
|
|
7
|
+
if (request.method !== 'POST' || !url.pathname.startsWith('/rpc/')) {
|
|
8
|
+
return json({ ok: false, error: { code: 'NOT_FOUND', status: 404 } }, 404);
|
|
9
|
+
}
|
|
10
|
+
const key = url.pathname.slice('/rpc/'.length).split('/').join('.');
|
|
11
|
+
const ctor = externalUseCases.get(key);
|
|
12
|
+
if (ctor === undefined) {
|
|
13
|
+
return json({ ok: false, error: { code: 'NOT_FOUND', status: 404, message: key } }, 404);
|
|
14
|
+
}
|
|
15
|
+
let body = {};
|
|
16
|
+
try {
|
|
17
|
+
body = (await request.json());
|
|
18
|
+
}
|
|
19
|
+
catch {
|
|
20
|
+
return json({
|
|
21
|
+
ok: false,
|
|
22
|
+
error: { code: 'VALIDATION', status: 400, message: 'Invalid JSON' },
|
|
23
|
+
}, 400);
|
|
24
|
+
}
|
|
25
|
+
try {
|
|
26
|
+
const ctx = deps.ctxFrom
|
|
27
|
+
? await deps.ctxFrom({ request, ctx: deps.defaultCtx })
|
|
28
|
+
: deps.defaultCtx;
|
|
29
|
+
const output = await invokeExternal(ctor, body.input, deps, {
|
|
30
|
+
ctx,
|
|
31
|
+
request,
|
|
32
|
+
});
|
|
33
|
+
return json({ ok: true, output });
|
|
34
|
+
}
|
|
35
|
+
catch (error) {
|
|
36
|
+
if (error instanceof CodedError) {
|
|
37
|
+
const status = httpStatus(error.code);
|
|
38
|
+
return json({
|
|
39
|
+
ok: false,
|
|
40
|
+
error: {
|
|
41
|
+
code: error.code,
|
|
42
|
+
status,
|
|
43
|
+
message: error.message,
|
|
44
|
+
...(error.data !== undefined ? { data: error.data } : {}),
|
|
45
|
+
},
|
|
46
|
+
}, status);
|
|
47
|
+
}
|
|
48
|
+
throw error;
|
|
49
|
+
}
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
function json(body, status = 200) {
|
|
53
|
+
return new Response(JSON.stringify(body), {
|
|
54
|
+
status,
|
|
55
|
+
headers: { 'content-type': 'application/json' },
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
//# sourceMappingURL=http.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"http.js","sourceRoot":"","sources":["../../src/runtime/http.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export { type AdapterFor, App, AppBuilder, type AppInstance } from './app.js';
|
|
2
|
+
export type { ChannelGateway, ChannelGateways, } from './channel.js';
|
|
3
|
+
export type { NestedClient } from './client.js';
|
|
4
|
+
export type { ChannelKindError, DuplicateCatalogError, DuplicateChannelError, DuplicatePortError, MissingMessages, } from './completeness.js';
|
|
5
|
+
export { wrapEvent } from './envelope.js';
|
|
6
|
+
export { httpStatus } from './http-status.js';
|
|
7
|
+
export { type Handler, type HandlerCtx, type Interceptor, requireCapability, } from './interceptor.js';
|
|
8
|
+
export type { ApiMiddleware, RpcMiddleware } from './middleware.js';
|
|
9
|
+
export { deriveRpc, type RpcContract, type RpcRoute, rpcPath, } from './rpc.js';
|
|
10
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/runtime/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,UAAU,EAAE,GAAG,EAAE,UAAU,EAAE,KAAK,WAAW,EAAE,MAAM,UAAU,CAAC;AAC9E,YAAY,EACV,cAAc,EACd,eAAe,GAChB,MAAM,cAAc,CAAC;AACtB,YAAY,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAChD,YAAY,EACV,gBAAgB,EAChB,qBAAqB,EACrB,qBAAqB,EACrB,kBAAkB,EAClB,eAAe,GAChB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAC1C,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EACL,KAAK,OAAO,EACZ,KAAK,UAAU,EACf,KAAK,WAAW,EAChB,iBAAiB,GAClB,MAAM,kBAAkB,CAAC;AAC1B,YAAY,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AACpE,OAAO,EACL,SAAS,EACT,KAAK,WAAW,EAChB,KAAK,QAAQ,EACb,OAAO,GACR,MAAM,UAAU,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export { App, AppBuilder } from './app.js';
|
|
2
|
+
export { wrapEvent } from './envelope.js';
|
|
3
|
+
export { httpStatus } from './http-status.js';
|
|
4
|
+
export { requireCapability, } from './interceptor.js';
|
|
5
|
+
export { deriveRpc, rpcPath, } from './rpc.js';
|
|
6
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/runtime/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAmB,GAAG,EAAE,UAAU,EAAoB,MAAM,UAAU,CAAC;AAa9E,OAAO,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAC1C,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAIL,iBAAiB,GAClB,MAAM,kBAAkB,CAAC;AAE1B,OAAO,EACL,SAAS,EAGT,OAAO,GACR,MAAM,UAAU,CAAC"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import type { UseCaseClass } from '../app/index.js';
|
|
2
|
+
import type { Envelope, PortToken } from '../domain/index.js';
|
|
3
|
+
/** Structural execute/event ctx so interceptors can wrap `next` without `as never`. */
|
|
4
|
+
export type HandlerCtx = {
|
|
5
|
+
/** Port impls aliased as the use case declared them (`ports.incidents`). */
|
|
6
|
+
ports: Record<string, unknown>;
|
|
7
|
+
/** Request context from `.ctx()` or a per-call override. */
|
|
8
|
+
ctx: unknown;
|
|
9
|
+
/** Error factories from the use-case error map. */
|
|
10
|
+
errors: Record<string, (data?: unknown) => never>;
|
|
11
|
+
/** Abort signal for this invocation. */
|
|
12
|
+
signal: AbortSignal;
|
|
13
|
+
/** Enqueue an event. Flushed only if `execute` returns. */
|
|
14
|
+
publish(event: unknown): void;
|
|
15
|
+
/** Invoke an ExternalUseCase or InternalUseCase without re-entering interceptors or App.use middleware. */
|
|
16
|
+
run?(useCase: unknown, input: unknown): Promise<unknown>;
|
|
17
|
+
/** Parsed API input. Absent on event handlers. */
|
|
18
|
+
input?: unknown;
|
|
19
|
+
/** Envelope for event handlers. Absent on external and internal use cases. */
|
|
20
|
+
event?: unknown;
|
|
21
|
+
/** Queue delivery attempt. Set only for queue handlers. */
|
|
22
|
+
attempt?: number;
|
|
23
|
+
};
|
|
24
|
+
/** Interceptor `next` function. Receives the structural execute or event ctx. */
|
|
25
|
+
export type Handler = (ctx: HandlerCtx) => Promise<unknown>;
|
|
26
|
+
/**
|
|
27
|
+
* Extension seam. First registered is **outer**.
|
|
28
|
+
* Register authorize before unit of work so a forbidden call never opens a transaction.
|
|
29
|
+
*
|
|
30
|
+
* ```ts
|
|
31
|
+
* class AuthorizeInterceptor implements Interceptor {
|
|
32
|
+
* readonly key = 'authorize'
|
|
33
|
+
* aroundUseCase(uc, next) {
|
|
34
|
+
* return async (ctx) => {
|
|
35
|
+
* const policy = (uc as { policy?: string }).policy
|
|
36
|
+
* if (policy) check(ctx, policy)
|
|
37
|
+
* return next(ctx)
|
|
38
|
+
* }
|
|
39
|
+
* }
|
|
40
|
+
* }
|
|
41
|
+
* ```
|
|
42
|
+
*
|
|
43
|
+
* `aroundPublish`: interceptors that swallow `next()` **drop** the event.
|
|
44
|
+
* Publish flushes after the use-case onion, so a successful unit-of-work
|
|
45
|
+
* commit naturally yields after-commit publish.
|
|
46
|
+
*/
|
|
47
|
+
export interface Interceptor {
|
|
48
|
+
/** Unique registration id. Duplicate keys throw. */
|
|
49
|
+
readonly key: string;
|
|
50
|
+
/** Wrap external, internal, and event `execute`. Nested `run` does not re-enter this hook. */
|
|
51
|
+
aroundUseCase?(uc: UseCaseClass, next: Handler): Handler;
|
|
52
|
+
/** Wrap a provided port impl once at `build`. First registered is outer, same as the other hooks. */
|
|
53
|
+
aroundAdapter?(port: PortToken<unknown>, impl: unknown): unknown;
|
|
54
|
+
/** Wrap catalog publish after execute returns. Swallowing `next()` drops the event. */
|
|
55
|
+
aroundPublish?(envelope: Envelope, next: () => Promise<void>): Promise<void>;
|
|
56
|
+
/** Wrap one event-handler invocation. External and internal use cases never call this hook. */
|
|
57
|
+
aroundDispatch?(envelope: Envelope, uc: UseCaseClass, next: () => Promise<void>): Promise<void>;
|
|
58
|
+
}
|
|
59
|
+
/** Throw if a port impl is missing `bindTo`/`fork`. `provide()` calls this when the token flags the capability. */
|
|
60
|
+
export declare function requireCapability(token: PortToken<unknown>, impl: unknown, method: 'bindTo' | 'fork', label: 'Transactional' | 'RequestScoped'): void;
|
|
61
|
+
//# sourceMappingURL=interceptor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"interceptor.d.ts","sourceRoot":"","sources":["../../src/runtime/interceptor.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AACpD,OAAO,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAE9D,uFAAuF;AACvF,MAAM,MAAM,UAAU,GAAG;IACvB,4EAA4E;IAC5E,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC/B,4DAA4D;IAC5D,GAAG,EAAE,OAAO,CAAC;IACb,mDAAmD;IACnD,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,OAAO,KAAK,KAAK,CAAC,CAAC;IAClD,wCAAwC;IACxC,MAAM,EAAE,WAAW,CAAC;IACpB,2DAA2D;IAC3D,OAAO,CAAC,KAAK,EAAE,OAAO,GAAG,IAAI,CAAC;IAC9B,2GAA2G;IAC3G,GAAG,CAAC,CAAC,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACzD,kDAAkD;IAClD,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,8EAA8E;IAC9E,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,2DAA2D;IAC3D,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,CAAC;AAEF,iFAAiF;AACjF,MAAM,MAAM,OAAO,GAAG,CAAC,GAAG,EAAE,UAAU,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;AAE5D;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,MAAM,WAAW,WAAW;IAC1B,oDAAoD;IACpD,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,8FAA8F;IAC9F,aAAa,CAAC,CAAC,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC;IACzD,qGAAqG;IACrG,aAAa,CAAC,CAAC,IAAI,EAAE,SAAS,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC;IACjE,uFAAuF;IACvF,aAAa,CAAC,CAAC,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7E,+FAA+F;IAC/F,cAAc,CAAC,CACb,QAAQ,EAAE,QAAQ,EAClB,EAAE,EAAE,YAAY,EAChB,IAAI,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,GACxB,OAAO,CAAC,IAAI,CAAC,CAAC;CAClB;AAED,mHAAmH;AACnH,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,SAAS,CAAC,OAAO,CAAC,EACzB,IAAI,EAAE,OAAO,EACb,MAAM,EAAE,QAAQ,GAAG,MAAM,EACzB,KAAK,EAAE,eAAe,GAAG,eAAe,GACvC,IAAI,CAMN"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/** Throw if a port impl is missing `bindTo`/`fork`. `provide()` calls this when the token flags the capability. */
|
|
2
|
+
export function requireCapability(token, impl, method, label) {
|
|
3
|
+
if (typeof impl[method] !== 'function') {
|
|
4
|
+
throw new Error(`hexok: ${token.key} is ${label.toLowerCase()} but the adapter does not implement ${label}`);
|
|
5
|
+
}
|
|
6
|
+
}
|
|
7
|
+
//# sourceMappingURL=interceptor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"interceptor.js","sourceRoot":"","sources":["../../src/runtime/interceptor.ts"],"names":[],"mappings":"AAkEA,mHAAmH;AACnH,MAAM,UAAU,iBAAiB,CAC/B,KAAyB,EACzB,IAAa,EACb,MAAyB,EACzB,KAAwC;IAExC,IAAI,OAAQ,IAAiC,CAAC,MAAM,CAAC,KAAK,UAAU,EAAE,CAAC;QACrE,MAAM,IAAI,KAAK,CACb,UAAU,KAAK,CAAC,GAAG,OAAO,KAAK,CAAC,WAAW,EAAE,uCAAuC,KAAK,EAAE,CAC5F,CAAC;IACJ,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { type EventUseCaseCtor, type ExternalUseCaseCtor } from '../app/index.js';
|
|
2
|
+
import type { AnyEventCatalog, Envelope, EventAdapter, PortToken } from '../domain/index.js';
|
|
3
|
+
import type { Interceptor } from './interceptor.js';
|
|
4
|
+
import type { ApiMiddleware } from './middleware.js';
|
|
5
|
+
export type InvokeDeps = {
|
|
6
|
+
ports: Map<PortToken<unknown>, unknown>;
|
|
7
|
+
catalogs: Map<AnyEventCatalog, EventAdapter>;
|
|
8
|
+
interceptors: Interceptor[];
|
|
9
|
+
middleware: ApiMiddleware[];
|
|
10
|
+
defaultCtx: unknown;
|
|
11
|
+
onFlush?: (envelope: Envelope) => void;
|
|
12
|
+
channels?: Record<string, unknown>;
|
|
13
|
+
ctxFrom?: (args: {
|
|
14
|
+
request: Request;
|
|
15
|
+
ctx: unknown;
|
|
16
|
+
}) => unknown | Promise<unknown>;
|
|
17
|
+
started: {
|
|
18
|
+
value: boolean;
|
|
19
|
+
};
|
|
20
|
+
handlerKeys: Set<string>;
|
|
21
|
+
};
|
|
22
|
+
export declare function invokeExternal(ctor: ExternalUseCaseCtor, input: unknown, deps: InvokeDeps, opts?: {
|
|
23
|
+
ctx?: unknown;
|
|
24
|
+
signal?: AbortSignal;
|
|
25
|
+
request?: Request;
|
|
26
|
+
}): Promise<unknown>;
|
|
27
|
+
export declare function invokeEvent(ctor: EventUseCaseCtor, envelope: Envelope, deps: InvokeDeps, opts?: {
|
|
28
|
+
ctx?: unknown;
|
|
29
|
+
signal?: AbortSignal;
|
|
30
|
+
attempt?: number;
|
|
31
|
+
}): Promise<void>;
|
|
32
|
+
export declare function aliasPorts(aliases: Record<string, PortToken<unknown>>, provided: Map<PortToken<unknown>, unknown>): Record<string, unknown>;
|
|
33
|
+
export declare function publishNow(envelope: Envelope, deps: InvokeDeps): Promise<void>;
|
|
34
|
+
//# sourceMappingURL=invoke.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"invoke.d.ts","sourceRoot":"","sources":["../../src/runtime/invoke.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,gBAAgB,EACrB,KAAK,mBAAmB,EAKzB,MAAM,iBAAiB,CAAC;AAEzB,OAAO,KAAK,EACV,eAAe,EACf,QAAQ,EACR,YAAY,EACZ,SAAS,EACV,MAAM,oBAAoB,CAAC;AAE5B,OAAO,KAAK,EAAW,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC7D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAErD,MAAM,MAAM,UAAU,GAAG;IACvB,KAAK,EAAE,GAAG,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC,CAAC;IACxC,QAAQ,EAAE,GAAG,CAAC,eAAe,EAAE,YAAY,CAAC,CAAC;IAC7C,YAAY,EAAE,WAAW,EAAE,CAAC;IAC5B,UAAU,EAAE,aAAa,EAAE,CAAC;IAC5B,UAAU,EAAE,OAAO,CAAC;IACpB,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,QAAQ,KAAK,IAAI,CAAC;IACvC,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACnC,OAAO,CAAC,EAAE,CAAC,IAAI,EAAE;QACf,OAAO,EAAE,OAAO,CAAC;QACjB,GAAG,EAAE,OAAO,CAAC;KACd,KAAK,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACjC,OAAO,EAAE;QAAE,KAAK,EAAE,OAAO,CAAA;KAAE,CAAC;IAC5B,WAAW,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;CAC1B,CAAC;AAyEF,wBAAsB,cAAc,CAClC,IAAI,EAAE,mBAAmB,EACzB,KAAK,EAAE,OAAO,EACd,IAAI,EAAE,UAAU,EAChB,IAAI,CAAC,EAAE;IAAE,GAAG,CAAC,EAAE,OAAO,CAAC;IAAC,MAAM,CAAC,EAAE,WAAW,CAAC;IAAC,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE,GAChE,OAAO,CAAC,OAAO,CAAC,CAiDlB;AAED,wBAAsB,WAAW,CAC/B,IAAI,EAAE,gBAAgB,EACtB,QAAQ,EAAE,QAAQ,EAClB,IAAI,EAAE,UAAU,EAChB,IAAI,CAAC,EAAE;IAAE,GAAG,CAAC,EAAE,OAAO,CAAC;IAAC,MAAM,CAAC,EAAE,WAAW,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,GAC/D,OAAO,CAAC,IAAI,CAAC,CAuCf;AAMD,wBAAgB,UAAU,CACxB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,OAAO,CAAC,CAAC,EAC3C,QAAQ,EAAE,GAAG,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC,GACzC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAUzB;AA6FD,wBAAsB,UAAU,CAC9B,QAAQ,EAAE,QAAQ,EAClB,IAAI,EAAE,UAAU,GACf,OAAO,CAAC,IAAI,CAAC,CAGf"}
|
|
@@ -0,0 +1,235 @@
|
|
|
1
|
+
import { errorFactories, isCallableUseCase, } from '../app/index.js';
|
|
2
|
+
import { validate, validationError } from '../core/index.js';
|
|
3
|
+
import { tracingCtx, wrapEvent } from './envelope.js';
|
|
4
|
+
const START_REQUIRED = 'hexok: start() before handlers can receive events';
|
|
5
|
+
function assertHandlersStarted(deps, publishes) {
|
|
6
|
+
if (deps.started.value || publishes === undefined)
|
|
7
|
+
return;
|
|
8
|
+
for (const catalog of publishes) {
|
|
9
|
+
for (const eventClass of catalog.list()) {
|
|
10
|
+
if (deps.handlerKeys.has(`${catalog.key}:${eventClass.key}`)) {
|
|
11
|
+
throw new Error(START_REQUIRED);
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
function assertEnvelopeStarted(deps, envelope) {
|
|
17
|
+
if (deps.started.value)
|
|
18
|
+
return;
|
|
19
|
+
if (deps.handlerKeys.has(`${envelope.catalog}:${envelope.key}`)) {
|
|
20
|
+
throw new Error(START_REQUIRED);
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
function nestedRun(deps, queue, shared) {
|
|
24
|
+
const run = (ctor, input) => runNested(ctor, input, deps, queue, shared, run);
|
|
25
|
+
return run;
|
|
26
|
+
}
|
|
27
|
+
async function runNested(ctor, input, deps, queue, shared, run) {
|
|
28
|
+
if (!isCallableUseCase(ctor)) {
|
|
29
|
+
throw new Error('hexok: run() requires ExternalUseCase or InternalUseCase');
|
|
30
|
+
}
|
|
31
|
+
assertHandlersStarted(deps, ctor.publishes);
|
|
32
|
+
const parsed = validate(ctor.input, input);
|
|
33
|
+
if (!parsed.ok) {
|
|
34
|
+
throw validationError('Validation failed', parsed.issues);
|
|
35
|
+
}
|
|
36
|
+
const publish = ((event) => {
|
|
37
|
+
queue.push(wrapEvent(event, ctor.publishes ?? [], tracingCtx(shared.ctx)));
|
|
38
|
+
});
|
|
39
|
+
const ctx = {
|
|
40
|
+
input: parsed.value,
|
|
41
|
+
ports: aliasPorts(ctor.ports, deps.ports),
|
|
42
|
+
ctx: shared.ctx,
|
|
43
|
+
errors: errorFactories(ctor.errors),
|
|
44
|
+
signal: shared.signal,
|
|
45
|
+
publish,
|
|
46
|
+
run,
|
|
47
|
+
channels: aliasChannels(ctor.channels, deps.channels),
|
|
48
|
+
};
|
|
49
|
+
const instance = constructUseCase(ctor);
|
|
50
|
+
return instance.execute(ctx);
|
|
51
|
+
}
|
|
52
|
+
export async function invokeExternal(ctor, input, deps, opts) {
|
|
53
|
+
assertHandlersStarted(deps, ctor.publishes);
|
|
54
|
+
const parsed = validate(ctor.input, input);
|
|
55
|
+
if (!parsed.ok) {
|
|
56
|
+
throw validationError('Validation failed', parsed.issues);
|
|
57
|
+
}
|
|
58
|
+
const queue = [];
|
|
59
|
+
const shared = {
|
|
60
|
+
ctx: opts?.ctx ?? deps.defaultCtx,
|
|
61
|
+
signal: opts?.signal ?? new AbortController().signal,
|
|
62
|
+
};
|
|
63
|
+
const run = nestedRun(deps, queue, shared);
|
|
64
|
+
const publish = ((event) => {
|
|
65
|
+
queue.push(wrapEvent(event, ctor.publishes ?? [], tracingCtx(shared.ctx)));
|
|
66
|
+
});
|
|
67
|
+
const ports = aliasPorts(ctor.ports, deps.ports);
|
|
68
|
+
const errors = errorFactories(ctor.errors);
|
|
69
|
+
const ctx = {
|
|
70
|
+
input: parsed.value,
|
|
71
|
+
ports,
|
|
72
|
+
ctx: shared.ctx,
|
|
73
|
+
errors,
|
|
74
|
+
signal: shared.signal,
|
|
75
|
+
publish,
|
|
76
|
+
run,
|
|
77
|
+
channels: aliasChannels(ctor.channels, deps.channels),
|
|
78
|
+
};
|
|
79
|
+
const instance = constructUseCase(ctor);
|
|
80
|
+
let handler = (executeCtx) => instance.execute(executeCtx);
|
|
81
|
+
handler = wrapUseCase(ctor, handler, deps.interceptors);
|
|
82
|
+
handler = wrapMiddleware(ctor, handler, deps.middleware, errors, opts?.request);
|
|
83
|
+
try {
|
|
84
|
+
const output = await handler(ctx);
|
|
85
|
+
await flush(queue, deps);
|
|
86
|
+
return output;
|
|
87
|
+
}
|
|
88
|
+
catch (error) {
|
|
89
|
+
queue.length = 0;
|
|
90
|
+
throw error;
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
export async function invokeEvent(ctor, envelope, deps, opts) {
|
|
94
|
+
const queue = [];
|
|
95
|
+
const shared = {
|
|
96
|
+
ctx: opts?.ctx ?? deps.defaultCtx,
|
|
97
|
+
signal: opts?.signal ?? new AbortController().signal,
|
|
98
|
+
};
|
|
99
|
+
assertHandlersStarted(deps, ctor.publishes);
|
|
100
|
+
const run = nestedRun(deps, queue, shared);
|
|
101
|
+
const publish = ((event) => {
|
|
102
|
+
queue.push(wrapEvent(event, ctor.publishes ?? [], tracingCtx(shared.ctx, envelope)));
|
|
103
|
+
});
|
|
104
|
+
const ports = aliasPorts(ctor.ports ?? {}, deps.ports);
|
|
105
|
+
const errors = errorFactories(ctor.errors ?? {});
|
|
106
|
+
const ctx = {
|
|
107
|
+
event: envelope,
|
|
108
|
+
ports,
|
|
109
|
+
ctx: shared.ctx,
|
|
110
|
+
errors,
|
|
111
|
+
signal: shared.signal,
|
|
112
|
+
publish,
|
|
113
|
+
run,
|
|
114
|
+
channels: aliasChannels(ctor.channels, deps.channels),
|
|
115
|
+
...(opts?.attempt !== undefined ? { attempt: opts.attempt } : {}),
|
|
116
|
+
};
|
|
117
|
+
const instance = constructUseCase(ctor);
|
|
118
|
+
let dispatch = () => instance.execute(ctx);
|
|
119
|
+
dispatch = wrapDispatch(ctor, envelope, dispatch, deps.interceptors);
|
|
120
|
+
let handler = async () => dispatch();
|
|
121
|
+
handler = wrapUseCase(ctor, handler, deps.interceptors);
|
|
122
|
+
try {
|
|
123
|
+
await handler(ctx);
|
|
124
|
+
await flush(queue, deps);
|
|
125
|
+
}
|
|
126
|
+
catch (error) {
|
|
127
|
+
queue.length = 0;
|
|
128
|
+
throw error;
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
function constructUseCase(ctor) {
|
|
132
|
+
return new ctor();
|
|
133
|
+
}
|
|
134
|
+
export function aliasPorts(aliases, provided) {
|
|
135
|
+
const ports = {};
|
|
136
|
+
for (const [alias, token] of Object.entries(aliases)) {
|
|
137
|
+
const impl = provided.get(token);
|
|
138
|
+
if (impl === undefined) {
|
|
139
|
+
throw new Error(`hexok: unprovided port "${token.key}"`);
|
|
140
|
+
}
|
|
141
|
+
ports[alias] = impl;
|
|
142
|
+
}
|
|
143
|
+
return ports;
|
|
144
|
+
}
|
|
145
|
+
function wrapUseCase(ctor, handler, interceptors) {
|
|
146
|
+
let current = handler;
|
|
147
|
+
for (let i = interceptors.length - 1; i >= 0; i--) {
|
|
148
|
+
const interceptor = interceptors[i];
|
|
149
|
+
if (interceptor?.aroundUseCase) {
|
|
150
|
+
current = interceptor.aroundUseCase(ctor, current);
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
return current;
|
|
154
|
+
}
|
|
155
|
+
function wrapDispatch(ctor, envelope, run, interceptors) {
|
|
156
|
+
let current = run;
|
|
157
|
+
for (let i = interceptors.length - 1; i >= 0; i--) {
|
|
158
|
+
const interceptor = interceptors[i];
|
|
159
|
+
const aroundDispatch = interceptor?.aroundDispatch;
|
|
160
|
+
if (aroundDispatch) {
|
|
161
|
+
const inner = current;
|
|
162
|
+
current = () => aroundDispatch(envelope, ctor, inner);
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
return current;
|
|
166
|
+
}
|
|
167
|
+
function wrapMiddleware(ctor, handler, middleware, errors, request) {
|
|
168
|
+
let current = handler;
|
|
169
|
+
for (let i = middleware.length - 1; i >= 0; i--) {
|
|
170
|
+
const mw = middleware[i];
|
|
171
|
+
if (!mw)
|
|
172
|
+
continue;
|
|
173
|
+
const inner = current;
|
|
174
|
+
current = async (ctx) => {
|
|
175
|
+
const executeCtx = ctx;
|
|
176
|
+
return mw({
|
|
177
|
+
context: executeCtx.ctx,
|
|
178
|
+
input: executeCtx.input,
|
|
179
|
+
next: () => inner(ctx),
|
|
180
|
+
errors,
|
|
181
|
+
path: ctor.key,
|
|
182
|
+
...(request !== undefined ? { request } : {}),
|
|
183
|
+
});
|
|
184
|
+
};
|
|
185
|
+
}
|
|
186
|
+
return current;
|
|
187
|
+
}
|
|
188
|
+
async function flush(queue, deps) {
|
|
189
|
+
for (const envelope of queue) {
|
|
190
|
+
const adapter = adapterFor(envelope, deps.catalogs);
|
|
191
|
+
const publish = async () => {
|
|
192
|
+
deps.onFlush?.(envelope);
|
|
193
|
+
await adapter.publish(envelope);
|
|
194
|
+
};
|
|
195
|
+
await wrapPublish(envelope, publish, deps.interceptors);
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
function wrapPublish(envelope, publish, interceptors) {
|
|
199
|
+
let current = publish;
|
|
200
|
+
for (let i = interceptors.length - 1; i >= 0; i--) {
|
|
201
|
+
const interceptor = interceptors[i];
|
|
202
|
+
const aroundPublish = interceptor?.aroundPublish;
|
|
203
|
+
if (aroundPublish) {
|
|
204
|
+
const inner = current;
|
|
205
|
+
current = () => aroundPublish(envelope, inner);
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
return current();
|
|
209
|
+
}
|
|
210
|
+
export async function publishNow(envelope, deps) {
|
|
211
|
+
assertEnvelopeStarted(deps, envelope);
|
|
212
|
+
await flush([envelope], deps);
|
|
213
|
+
}
|
|
214
|
+
function aliasChannels(declared, all) {
|
|
215
|
+
if (!declared || declared.length === 0)
|
|
216
|
+
return {};
|
|
217
|
+
const out = {};
|
|
218
|
+
for (const ctor of declared) {
|
|
219
|
+
const key = ctor.catalog.key;
|
|
220
|
+
const handle = all?.[key];
|
|
221
|
+
if (handle === undefined) {
|
|
222
|
+
throw new Error(`hexok: unrouted channel "${key}"`);
|
|
223
|
+
}
|
|
224
|
+
out[key] = handle;
|
|
225
|
+
}
|
|
226
|
+
return out;
|
|
227
|
+
}
|
|
228
|
+
function adapterFor(envelope, catalogs) {
|
|
229
|
+
for (const [catalog, adapter] of catalogs) {
|
|
230
|
+
if (catalog.key === envelope.catalog)
|
|
231
|
+
return adapter;
|
|
232
|
+
}
|
|
233
|
+
throw new Error(`hexok: unbound catalog "${envelope.catalog}"`);
|
|
234
|
+
}
|
|
235
|
+
//# sourceMappingURL=invoke.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"invoke.js","sourceRoot":"","sources":["../../src/runtime/invoke.ts"],"names":[],"mappings":"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"}
|