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.
Files changed (201) hide show
  1. package/dist/app/api-use-case.d.ts +52 -0
  2. package/dist/app/api-use-case.d.ts.map +1 -0
  3. package/dist/app/api-use-case.js +59 -0
  4. package/dist/app/api-use-case.js.map +1 -0
  5. package/dist/app/callable-use-case.d.ts +34 -0
  6. package/dist/app/callable-use-case.d.ts.map +1 -0
  7. package/dist/app/callable-use-case.js +41 -0
  8. package/dist/app/callable-use-case.js.map +1 -0
  9. package/dist/app/contract.d.ts +46 -0
  10. package/dist/app/contract.d.ts.map +1 -0
  11. package/dist/app/contract.js +28 -0
  12. package/dist/app/contract.js.map +1 -0
  13. package/dist/app/error-factory.d.ts +9 -0
  14. package/dist/app/error-factory.d.ts.map +1 -0
  15. package/dist/app/error-factory.js +30 -0
  16. package/dist/app/error-factory.js.map +1 -0
  17. package/dist/app/event-channel.d.ts +133 -0
  18. package/dist/app/event-channel.d.ts.map +1 -0
  19. package/dist/app/event-channel.js +49 -0
  20. package/dist/app/event-channel.js.map +1 -0
  21. package/dist/app/event-use-case.d.ts +47 -0
  22. package/dist/app/event-use-case.d.ts.map +1 -0
  23. package/dist/app/event-use-case.js +54 -0
  24. package/dist/app/event-use-case.js.map +1 -0
  25. package/dist/app/execute-ctx.d.ts +92 -0
  26. package/dist/app/execute-ctx.d.ts.map +1 -0
  27. package/dist/app/execute-ctx.js +2 -0
  28. package/dist/app/execute-ctx.js.map +1 -0
  29. package/dist/app/external-use-case.d.ts +25 -0
  30. package/dist/app/external-use-case.d.ts.map +1 -0
  31. package/dist/app/external-use-case.js +25 -0
  32. package/dist/app/external-use-case.js.map +1 -0
  33. package/dist/app/index.d.ts +9 -0
  34. package/dist/app/index.d.ts.map +1 -0
  35. package/dist/app/index.js +8 -0
  36. package/dist/app/index.js.map +1 -0
  37. package/dist/app/internal-use-case.d.ts +26 -0
  38. package/dist/app/internal-use-case.d.ts.map +1 -0
  39. package/dist/app/internal-use-case.js +26 -0
  40. package/dist/app/internal-use-case.js.map +1 -0
  41. package/dist/app/nest.d.ts +9 -0
  42. package/dist/app/nest.d.ts.map +1 -0
  43. package/dist/app/nest.js +28 -0
  44. package/dist/app/nest.js.map +1 -0
  45. package/dist/app/types.d.ts +153 -0
  46. package/dist/app/types.d.ts.map +1 -0
  47. package/dist/app/types.js +17 -0
  48. package/dist/app/types.js.map +1 -0
  49. package/dist/core/coded-error.d.ts +24 -0
  50. package/dist/core/coded-error.d.ts.map +1 -0
  51. package/dist/core/coded-error.js +32 -0
  52. package/dist/core/coded-error.js.map +1 -0
  53. package/dist/core/error-map.d.ts +21 -0
  54. package/dist/core/error-map.d.ts.map +1 -0
  55. package/dist/core/error-map.js +5 -0
  56. package/dist/core/error-map.js.map +1 -0
  57. package/dist/core/index.d.ts +6 -0
  58. package/dist/core/index.d.ts.map +1 -0
  59. package/dist/core/index.js +5 -0
  60. package/dist/core/index.js.map +1 -0
  61. package/dist/core/result.d.ts +23 -0
  62. package/dist/core/result.d.ts.map +1 -0
  63. package/dist/core/result.js +11 -0
  64. package/dist/core/result.js.map +1 -0
  65. package/dist/core/schema.d.ts +19 -0
  66. package/dist/core/schema.d.ts.map +1 -0
  67. package/dist/core/schema.js +28 -0
  68. package/dist/core/schema.js.map +1 -0
  69. package/dist/core/standard-schema.d.ts +51 -0
  70. package/dist/core/standard-schema.d.ts.map +1 -0
  71. package/dist/core/standard-schema.js +2 -0
  72. package/dist/core/standard-schema.js.map +1 -0
  73. package/dist/domain/capabilities.d.ts +42 -0
  74. package/dist/domain/capabilities.d.ts.map +1 -0
  75. package/dist/domain/capabilities.js +2 -0
  76. package/dist/domain/capabilities.js.map +1 -0
  77. package/dist/domain/catalog.d.ts +46 -0
  78. package/dist/domain/catalog.d.ts.map +1 -0
  79. package/dist/domain/catalog.js +114 -0
  80. package/dist/domain/catalog.js.map +1 -0
  81. package/dist/domain/channel.d.ts +36 -0
  82. package/dist/domain/channel.d.ts.map +1 -0
  83. package/dist/domain/channel.js +2 -0
  84. package/dist/domain/channel.js.map +1 -0
  85. package/dist/domain/cow-draft.d.ts +10 -0
  86. package/dist/domain/cow-draft.d.ts.map +1 -0
  87. package/dist/domain/cow-draft.js +147 -0
  88. package/dist/domain/cow-draft.js.map +1 -0
  89. package/dist/domain/entity.d.ts +120 -0
  90. package/dist/domain/entity.d.ts.map +1 -0
  91. package/dist/domain/entity.js +263 -0
  92. package/dist/domain/entity.js.map +1 -0
  93. package/dist/domain/envelope.d.ts +59 -0
  94. package/dist/domain/envelope.d.ts.map +1 -0
  95. package/dist/domain/envelope.js +2 -0
  96. package/dist/domain/envelope.js.map +1 -0
  97. package/dist/domain/event.d.ts +44 -0
  98. package/dist/domain/event.d.ts.map +1 -0
  99. package/dist/domain/event.js +21 -0
  100. package/dist/domain/event.js.map +1 -0
  101. package/dist/domain/index.d.ts +8 -0
  102. package/dist/domain/index.d.ts.map +1 -0
  103. package/dist/domain/index.js +5 -0
  104. package/dist/domain/index.js.map +1 -0
  105. package/dist/domain/port.d.ts +45 -0
  106. package/dist/domain/port.d.ts.map +1 -0
  107. package/dist/domain/port.js +41 -0
  108. package/dist/domain/port.js.map +1 -0
  109. package/dist/infra/adapter.d.ts +22 -0
  110. package/dist/infra/adapter.d.ts.map +1 -0
  111. package/dist/infra/adapter.js +18 -0
  112. package/dist/infra/adapter.js.map +1 -0
  113. package/dist/infra/index.d.ts +3 -0
  114. package/dist/infra/index.d.ts.map +1 -0
  115. package/dist/infra/index.js +3 -0
  116. package/dist/infra/index.js.map +1 -0
  117. package/dist/infra/mapper.d.ts +48 -0
  118. package/dist/infra/mapper.d.ts.map +1 -0
  119. package/dist/infra/mapper.js +77 -0
  120. package/dist/infra/mapper.js.map +1 -0
  121. package/dist/runtime/app.d.ts +100 -0
  122. package/dist/runtime/app.d.ts.map +1 -0
  123. package/dist/runtime/app.js +292 -0
  124. package/dist/runtime/app.js.map +1 -0
  125. package/dist/runtime/channel.d.ts +34 -0
  126. package/dist/runtime/channel.d.ts.map +1 -0
  127. package/dist/runtime/channel.js +110 -0
  128. package/dist/runtime/channel.js.map +1 -0
  129. package/dist/runtime/client.d.ts +21 -0
  130. package/dist/runtime/client.d.ts.map +1 -0
  131. package/dist/runtime/client.js +2 -0
  132. package/dist/runtime/client.js.map +1 -0
  133. package/dist/runtime/completeness.d.ts +89 -0
  134. package/dist/runtime/completeness.d.ts.map +1 -0
  135. package/dist/runtime/completeness.js +2 -0
  136. package/dist/runtime/completeness.js.map +1 -0
  137. package/dist/runtime/envelope.d.ts +7 -0
  138. package/dist/runtime/envelope.d.ts.map +1 -0
  139. package/dist/runtime/envelope.js +69 -0
  140. package/dist/runtime/envelope.js.map +1 -0
  141. package/dist/runtime/events.d.ts +6 -0
  142. package/dist/runtime/events.d.ts.map +1 -0
  143. package/dist/runtime/events.js +48 -0
  144. package/dist/runtime/events.js.map +1 -0
  145. package/dist/runtime/http-status.d.ts +3 -0
  146. package/dist/runtime/http-status.d.ts.map +1 -0
  147. package/dist/runtime/http-status.js +11 -0
  148. package/dist/runtime/http-status.js.map +1 -0
  149. package/dist/runtime/http.d.ts +4 -0
  150. package/dist/runtime/http.d.ts.map +1 -0
  151. package/dist/runtime/http.js +58 -0
  152. package/dist/runtime/http.js.map +1 -0
  153. package/dist/runtime/index.d.ts +10 -0
  154. package/dist/runtime/index.d.ts.map +1 -0
  155. package/dist/runtime/index.js +6 -0
  156. package/dist/runtime/index.js.map +1 -0
  157. package/dist/runtime/interceptor.d.ts +61 -0
  158. package/dist/runtime/interceptor.d.ts.map +1 -0
  159. package/dist/runtime/interceptor.js +7 -0
  160. package/dist/runtime/interceptor.js.map +1 -0
  161. package/dist/runtime/invoke.d.ts +34 -0
  162. package/dist/runtime/invoke.d.ts.map +1 -0
  163. package/dist/runtime/invoke.js +235 -0
  164. package/dist/runtime/invoke.js.map +1 -0
  165. package/dist/runtime/middleware.d.ts +20 -0
  166. package/dist/runtime/middleware.d.ts.map +1 -0
  167. package/dist/runtime/middleware.js +2 -0
  168. package/dist/runtime/middleware.js.map +1 -0
  169. package/dist/runtime/rpc.d.ts +24 -0
  170. package/dist/runtime/rpc.d.ts.map +1 -0
  171. package/dist/runtime/rpc.js +16 -0
  172. package/dist/runtime/rpc.js.map +1 -0
  173. package/dist/testing/app-test.d.ts +77 -0
  174. package/dist/testing/app-test.d.ts.map +1 -0
  175. package/dist/testing/app-test.js +109 -0
  176. package/dist/testing/app-test.js.map +1 -0
  177. package/dist/testing/in-memory-broker.d.ts +18 -0
  178. package/dist/testing/in-memory-broker.d.ts.map +1 -0
  179. package/dist/testing/in-memory-broker.js +42 -0
  180. package/dist/testing/in-memory-broker.js.map +1 -0
  181. package/dist/testing/in-memory-bus.d.ts +19 -0
  182. package/dist/testing/in-memory-bus.d.ts.map +1 -0
  183. package/dist/testing/in-memory-bus.js +31 -0
  184. package/dist/testing/in-memory-bus.js.map +1 -0
  185. package/dist/testing/in-memory-channel.d.ts +32 -0
  186. package/dist/testing/in-memory-channel.d.ts.map +1 -0
  187. package/dist/testing/in-memory-channel.js +65 -0
  188. package/dist/testing/in-memory-channel.js.map +1 -0
  189. package/dist/testing/in-memory-queue.d.ts +24 -0
  190. package/dist/testing/in-memory-queue.d.ts.map +1 -0
  191. package/dist/testing/in-memory-queue.js +66 -0
  192. package/dist/testing/in-memory-queue.js.map +1 -0
  193. package/dist/testing/in-memory-repository.d.ts +44 -0
  194. package/dist/testing/in-memory-repository.d.ts.map +1 -0
  195. package/dist/testing/in-memory-repository.js +60 -0
  196. package/dist/testing/in-memory-repository.js.map +1 -0
  197. package/dist/testing/index.d.ts +6 -0
  198. package/dist/testing/index.d.ts.map +1 -0
  199. package/dist/testing/index.js +6 -0
  200. package/dist/testing/index.js.map +1 -0
  201. package/package.json +60 -0
@@ -0,0 +1,292 @@
1
+ import { deriveContract, isEventUseCase, isExternalUseCase, isInternalUseCase, nestByKey, } from '../app/index.js';
2
+ import { createChannelHandle, resolveChannelPorts, startChannels, stopChannelAdapters, } from './channel.js';
3
+ import { startHandlers, stopAdapters } from './events.js';
4
+ import { createFetchHandler } from './http.js';
5
+ import { requireCapability } from './interceptor.js';
6
+ import { invokeExternal, publishNow } from './invoke.js';
7
+ import { deriveRpc } from './rpc.js';
8
+ /** Fluent composition. `build` is callable only after every required port, catalog, and channel is wired. */
9
+ export class AppBuilder {
10
+ #useCases;
11
+ #provided = new Map();
12
+ #bound = new Map();
13
+ #routed = new Map();
14
+ #interceptors = [];
15
+ #middleware = [];
16
+ #defaultCtx;
17
+ #ctxFrom;
18
+ constructor(useCases) {
19
+ this.#useCases = useCases;
20
+ }
21
+ /** Start composition from a map of use-case classes. */
22
+ static from(useCases) {
23
+ return new AppBuilder(useCases);
24
+ }
25
+ /** Register a port implementation. A second `provide` for the same token is a compile-time error and a runtime throw. */
26
+ provide(token, impl) {
27
+ const port = token;
28
+ if (this.#provided.has(port)) {
29
+ throw new Error(`hexok: port "${port.key}" already provided`);
30
+ }
31
+ for (const existing of this.#provided.keys()) {
32
+ if (existing.key === port.key && existing !== port) {
33
+ throw new Error(`hexok: two tokens share the key "${port.key}"`);
34
+ }
35
+ }
36
+ if (port.capabilities.transactional) {
37
+ requireCapability(port, impl, 'bindTo', 'Transactional');
38
+ }
39
+ if (port.capabilities.requestScoped) {
40
+ requireCapability(port, impl, 'fork', 'RequestScoped');
41
+ }
42
+ this.#provided.set(port, impl);
43
+ return this;
44
+ }
45
+ /** Bind an event adapter to a catalog. Adapter `kind` must match; a second bind of the same catalog fails. */
46
+ bind(catalog, adapter) {
47
+ const cat = catalog;
48
+ if (this.#bound.has(cat)) {
49
+ throw new Error(`hexok: catalog "${cat.key}" already bound`);
50
+ }
51
+ if (adapter.kind !== cat.kind) {
52
+ throw new Error(`hexok: catalog "${cat.key}" is kind "${cat.kind}" but the adapter is "${adapter.kind}"`);
53
+ }
54
+ cat.freeze();
55
+ this.#bound.set(cat, adapter);
56
+ return this;
57
+ }
58
+ /** Route a channel class to a presence adapter. The channel catalog must be a bus and still needs `bind`. */
59
+ route(channel, adapter) {
60
+ const ctor = channel;
61
+ const catalog = ctor.catalog;
62
+ if (catalog.kind !== 'bus') {
63
+ throw new Error(`hexok: channel catalog "${catalog.key}" is kind "${catalog.kind}". Channels require a bus catalog.`);
64
+ }
65
+ if (this.#routed.has(catalog)) {
66
+ throw new Error(`hexok: catalog "${catalog.key}" already routed`);
67
+ }
68
+ catalog.freeze();
69
+ const instance = new ctor();
70
+ this.#routed.set(catalog, {
71
+ ctor,
72
+ instance,
73
+ adapter: adapter,
74
+ ports: {},
75
+ });
76
+ return this;
77
+ }
78
+ /** Set the default request context for `local`, HTTP, and event handlers. Per-call `ctx` overrides it. */
79
+ ctx(defaults) {
80
+ this.#defaultCtx = defaults;
81
+ return this;
82
+ }
83
+ /**
84
+ * Set HTTP request context from the `Request`. `body.ctx` is ignored.
85
+ * Call `.ctx<C>()` first so `ctx` is typed. `local` still uses `.ctx()` / per-call `{ ctx }`.
86
+ */
87
+ ctxFrom(fn) {
88
+ this.#ctxFrom = fn;
89
+ return this;
90
+ }
91
+ /**
92
+ * Provide a factory from `Adapter.of` by calling `create(...deps)`.
93
+ * Same as `.provide(factory.token, factory.create(...deps))`.
94
+ */
95
+ adapt(factory, ...deps) {
96
+ return this.provide(factory.token, factory.create(...deps));
97
+ }
98
+ /** Register middleware around external `execute` (`local` and HTTP) — not event handlers or nested `run`. */
99
+ use(middleware) {
100
+ this.#middleware.push(middleware);
101
+ return this;
102
+ }
103
+ /** Register an interceptor. First registered is outer for execute, adapter, publish, and dispatch. Duplicate `key` throws. */
104
+ intercept(interceptor) {
105
+ if (this.#interceptors.some((item) => item.key === interceptor.key)) {
106
+ throw new Error(`hexok: duplicate interceptor key "${interceptor.key}"`);
107
+ }
108
+ this.#interceptors.push(interceptor);
109
+ return this;
110
+ }
111
+ /**
112
+ * Complete the graph. Incomplete builders expose `build` as the missing
113
+ * port/catalog message (not callable). Runtime throws the same sentences.
114
+ */
115
+ get build() {
116
+ return (() => this.#build());
117
+ }
118
+ #build() {
119
+ this.#assertComplete();
120
+ const adapted = new Map();
121
+ for (const [token, impl] of this.#provided) {
122
+ let current = impl;
123
+ for (let i = this.#interceptors.length - 1; i >= 0; i--) {
124
+ const interceptor = this.#interceptors[i];
125
+ if (interceptor?.aroundAdapter) {
126
+ current = interceptor.aroundAdapter(token, current);
127
+ }
128
+ }
129
+ adapted.set(token, current);
130
+ }
131
+ for (const routed of this.#routed.values()) {
132
+ routed.ports = resolveChannelPorts(routed.ctor, adapted);
133
+ }
134
+ const catalog = deriveContract(this.#useCases);
135
+ const rpc = deriveRpc(catalog);
136
+ const external = new Map();
137
+ const eventHandlers = new Map();
138
+ const handlersView = {};
139
+ for (const ctor of Object.values(this.#useCases)) {
140
+ if (isExternalUseCase(ctor)) {
141
+ external.set(ctor.key, ctor);
142
+ continue;
143
+ }
144
+ if (isInternalUseCase(ctor)) {
145
+ continue;
146
+ }
147
+ if (isEventUseCase(ctor)) {
148
+ const handlerKey = `${ctor.catalog.key}:${ctor.on.key}`;
149
+ const list = eventHandlers.get(handlerKey) ?? [];
150
+ list.push(ctor);
151
+ eventHandlers.set(handlerKey, list);
152
+ const byCatalog = handlersView[ctor.catalog.key] ?? {};
153
+ const byEvent = byCatalog[ctor.on.key] ?? [];
154
+ byEvent.push(ctor);
155
+ byCatalog[ctor.on.key] = byEvent;
156
+ handlersView[ctor.catalog.key] = byCatalog;
157
+ }
158
+ }
159
+ const channelHandles = {};
160
+ for (const [cat, routed] of this.#routed) {
161
+ channelHandles[cat.key] = createChannelHandle(routed.ctor, routed.instance, routed.adapter, routed.ports);
162
+ }
163
+ const started = { value: false };
164
+ const handlerKeys = new Set(eventHandlers.keys());
165
+ const deps = () => ({
166
+ ports: adapted,
167
+ catalogs: this.#bound,
168
+ interceptors: this.#interceptors,
169
+ middleware: this.#middleware,
170
+ defaultCtx: this.#defaultCtx,
171
+ channels: channelHandles,
172
+ started,
173
+ handlerKeys,
174
+ ...(this.#ctxFrom !== undefined ? { ctxFrom: this.#ctxFrom } : {}),
175
+ });
176
+ const local = nestByKey([...external.entries()].map(([key, ctor]) => [
177
+ key,
178
+ (input, opts) => invokeExternal(ctor, input, deps(), opts),
179
+ ]));
180
+ const instance = {
181
+ contract: nestedContract(catalog),
182
+ rpc,
183
+ router: { fetch: createFetchHandler(external, deps()) },
184
+ local,
185
+ handlers: handlersView,
186
+ channels: channelHandles,
187
+ publish: (envelope) => publishNow(envelope, deps()),
188
+ start: async () => {
189
+ if (started.value)
190
+ throw new Error('hexok: start() called twice');
191
+ started.value = true;
192
+ await startHandlers(this.#bound, eventHandlers, deps());
193
+ startChannels(this.#routed, this.#bound);
194
+ },
195
+ stop: async () => {
196
+ await stopChannelAdapters(this.#routed);
197
+ if (!started.value)
198
+ return;
199
+ await stopAdapters(this.#bound);
200
+ started.value = false;
201
+ },
202
+ };
203
+ return instance;
204
+ }
205
+ #assertComplete() {
206
+ const requiredPorts = new Map();
207
+ const requiredCatalogs = new Map();
208
+ const requiredChannels = new Map();
209
+ for (const ctor of Object.values(this.#useCases)) {
210
+ const ports = (ctor.ports ?? {});
211
+ for (const token of Object.values(ports)) {
212
+ const rec = requiredPorts.get(token.key) ?? { token, usedBy: [] };
213
+ rec.usedBy.push(ctor.key);
214
+ requiredPorts.set(token.key, rec);
215
+ }
216
+ const catalogs = [
217
+ ...(ctor.publishes ?? []),
218
+ ...('catalog' in ctor && ctor.catalog ? [ctor.catalog] : []),
219
+ ];
220
+ for (const catalog of catalogs) {
221
+ const rec = requiredCatalogs.get(catalog.key) ?? {
222
+ catalog,
223
+ usedBy: [],
224
+ };
225
+ rec.usedBy.push(ctor.key);
226
+ requiredCatalogs.set(catalog.key, rec);
227
+ }
228
+ for (const channel of ctor.channels ?? []) {
229
+ const rec = requiredChannels.get(channel.catalog.key) ?? {
230
+ ctor: channel,
231
+ usedBy: [],
232
+ };
233
+ rec.usedBy.push(ctor.key);
234
+ requiredChannels.set(channel.catalog.key, rec);
235
+ }
236
+ }
237
+ for (const routed of this.#routed.values()) {
238
+ const ports = (routed.ctor.ports ?? {});
239
+ for (const token of Object.values(ports)) {
240
+ const rec = requiredPorts.get(token.key) ?? {
241
+ token,
242
+ usedBy: [],
243
+ };
244
+ rec.usedBy.push(routed.ctor.catalog.key);
245
+ requiredPorts.set(token.key, rec);
246
+ }
247
+ const catalog = routed.ctor.catalog;
248
+ const rec = requiredCatalogs.get(catalog.key) ?? {
249
+ catalog,
250
+ usedBy: [],
251
+ };
252
+ rec.usedBy.push('channel');
253
+ requiredCatalogs.set(catalog.key, rec);
254
+ }
255
+ for (const { token, usedBy } of requiredPorts.values()) {
256
+ if (!this.#provided.has(token)) {
257
+ throw new Error(`hexok: unprovided port "${token.key}" (used by ${usedBy.join(', ')})`);
258
+ }
259
+ }
260
+ for (const { catalog, usedBy } of requiredCatalogs.values()) {
261
+ if (!this.#bound.has(catalog)) {
262
+ throw new Error(`hexok: unbound catalog "${catalog.key}" (used by ${usedBy.join(', ')})`);
263
+ }
264
+ }
265
+ for (const { ctor, usedBy } of requiredChannels.values()) {
266
+ if (!this.#routed.has(ctor.catalog)) {
267
+ throw new Error(`hexok: unrouted channel "${ctor.catalog.key}" (used by ${usedBy.join(', ')}). Call .route(...) before .build()`);
268
+ }
269
+ }
270
+ }
271
+ }
272
+ /**
273
+ * Composition root. `build()` is only callable when every required port
274
+ * and event catalog is provided.
275
+ *
276
+ * ```ts
277
+ * const app = App.from({ close: CloseIncident })
278
+ * .provide(IncidentRepository, repo)
279
+ * .provide(Clock, clock)
280
+ * .bind(DomainEvents, bus)
281
+ * .build()
282
+ * await app.local.incident.close({ id: '1' })
283
+ * ```
284
+ */
285
+ export const App = {
286
+ /** Start composition from a map of use-case classes. */
287
+ from: AppBuilder.from,
288
+ };
289
+ function nestedContract(catalog) {
290
+ return nestByKey(Object.entries(catalog.entries));
291
+ }
292
+ //# sourceMappingURL=app.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"app.js","sourceRoot":"","sources":["../../src/runtime/app.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,34 @@
1
+ import type { ChannelControl, ChannelSession, EventChannelCtor } from '../app/index.js';
2
+ import { type Infer, type StandardSchemaV1 } from '../core/index.js';
3
+ import type { AnyEventCatalog, ChannelAdapter, ChannelConnection, Envelope, EventAdapter, EventCatalog, PortToken } from '../domain/index.js';
4
+ /** Presence handle for one routed channel: join, list, eject, refresh, update. */
5
+ export type ChannelGateway<C extends EventChannelCtor> = ChannelControl<ChannelSession<C>> & {
6
+ /** Admit a connection after validating `joinInput`. Routing of events starts on `app.start()`. */
7
+ join(input: C extends {
8
+ joinInput: infer S extends StandardSchemaV1;
9
+ } ? Infer<S> : unknown, connection: ChannelConnection): Promise<ChannelSession<C>>;
10
+ };
11
+ type UnionToIntersection<U> = (U extends unknown ? (x: U) => void : never) extends (x: infer I) => void ? I : never;
12
+ /** Routed channel gateways keyed by catalog key (`app.channels.client`). */
13
+ export type ChannelGateways<Routed> = [Routed] extends [never] ? Record<string, never> : UnionToIntersection<Routed extends infer C ? C extends EventChannelCtor ? C extends {
14
+ catalog: EventCatalog<infer K extends string, infer _Kind, infer _E, infer _Ctx>;
15
+ } ? {
16
+ [P in K]: ChannelGateway<C>;
17
+ } : never : never : never>;
18
+ export type RoutedChannel = {
19
+ ctor: EventChannelCtor;
20
+ instance: {
21
+ join(ctx: never): Promise<unknown>;
22
+ refresh(ctx: never): Promise<unknown>;
23
+ route(ctx: never): Promise<void>;
24
+ };
25
+ adapter: ChannelAdapter<unknown>;
26
+ ports: Record<string, unknown>;
27
+ };
28
+ export declare function serializeChannelEnvelope(envelope: Envelope): string;
29
+ export declare function createChannelHandle(ctor: EventChannelCtor, instance: RoutedChannel['instance'], adapter: ChannelAdapter<unknown>, ports: Record<string, unknown>): ChannelGateway<EventChannelCtor>;
30
+ export declare function startChannels(routed: Map<AnyEventCatalog, RoutedChannel>, bound: Map<AnyEventCatalog, EventAdapter>): void;
31
+ export declare function stopChannelAdapters(routed: Map<AnyEventCatalog, RoutedChannel>): Promise<void>;
32
+ export declare function resolveChannelPorts(ctor: EventChannelCtor, provided: Map<PortToken<unknown>, unknown>): Record<string, unknown>;
33
+ export {};
34
+ //# sourceMappingURL=channel.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"channel.d.ts","sourceRoot":"","sources":["../../src/runtime/channel.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,110 @@
1
+ import { errorFactories } from '../app/error-factory.js';
2
+ import { CodedError, validate, } from '../core/index.js';
3
+ import { aliasPorts } from './invoke.js';
4
+ export function serializeChannelEnvelope(envelope) {
5
+ return JSON.stringify({
6
+ key: envelope.key,
7
+ catalog: envelope.catalog,
8
+ payload: envelope.payload,
9
+ occurredAt: envelope.occurredAt,
10
+ });
11
+ }
12
+ export function createChannelHandle(ctor, instance, adapter, ports) {
13
+ const errors = errorFactories(ctor.errors ?? {});
14
+ const refreshOne = async (id, session) => {
15
+ const next = await instance.refresh({
16
+ session,
17
+ ports,
18
+ errors,
19
+ });
20
+ if (next === 'eject') {
21
+ adapter.eject(id);
22
+ return;
23
+ }
24
+ adapter.update(id, next);
25
+ };
26
+ return {
27
+ list: () => adapter.list(),
28
+ eject: (id) => {
29
+ adapter.eject(id);
30
+ },
31
+ ejectWhere: (pred) => {
32
+ for (const { id, session } of [...adapter.list()]) {
33
+ if (pred(session))
34
+ adapter.eject(id);
35
+ }
36
+ },
37
+ refresh: async (id) => {
38
+ const row = adapter.list().find((item) => item.id === id);
39
+ if (!row)
40
+ return;
41
+ await refreshOne(id, row.session);
42
+ },
43
+ refreshWhere: async (pred) => {
44
+ for (const { id, session } of [...adapter.list()]) {
45
+ if (pred(session))
46
+ await refreshOne(id, session);
47
+ }
48
+ },
49
+ update: (id, session) => {
50
+ adapter.update(id, session);
51
+ },
52
+ join: async (input, connection) => {
53
+ const parsed = validate(ctor.joinInput, input);
54
+ if (!parsed.ok) {
55
+ throw new CodedError({
56
+ code: 'VALIDATION',
57
+ message: 'Validation failed',
58
+ });
59
+ }
60
+ const session = await instance.join({
61
+ input: parsed.value,
62
+ ports,
63
+ errors,
64
+ });
65
+ const id = crypto.randomUUID();
66
+ adapter.join(id, session, connection);
67
+ connection.addEventListener('close', () => {
68
+ adapter.leave(id);
69
+ });
70
+ return session;
71
+ },
72
+ };
73
+ }
74
+ export function startChannels(routed, bound) {
75
+ for (const [catalog, { instance, adapter, ports }] of routed) {
76
+ const eventAdapter = bound.get(catalog);
77
+ if (eventAdapter?.kind !== 'bus') {
78
+ throw new Error(`hexok: channel catalog "${catalog.key}" must be bound as a bus`);
79
+ }
80
+ const bus = eventAdapter;
81
+ for (const eventClass of catalog.list()) {
82
+ bus.subscribe(eventClass.key, async (envelope) => {
83
+ const payload = serializeChannelEnvelope(envelope);
84
+ await instance.route({
85
+ event: envelope,
86
+ ctx: envelope.ctx,
87
+ clients: adapter.list(),
88
+ ports,
89
+ send: async (id) => {
90
+ try {
91
+ adapter.send(id, payload);
92
+ }
93
+ catch {
94
+ adapter.leave(id);
95
+ }
96
+ },
97
+ });
98
+ });
99
+ }
100
+ }
101
+ }
102
+ export async function stopChannelAdapters(routed) {
103
+ for (const { adapter } of routed.values()) {
104
+ await adapter.stop?.();
105
+ }
106
+ }
107
+ export function resolveChannelPorts(ctor, provided) {
108
+ return aliasPorts(ctor.ports ?? {}, provided);
109
+ }
110
+ //# sourceMappingURL=channel.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"channel.js","sourceRoot":"","sources":["../../src/runtime/channel.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAMzD,OAAO,EACL,UAAU,EAGV,QAAQ,GACT,MAAM,kBAAkB,CAAC;AAW1B,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAsDzC,MAAM,UAAU,wBAAwB,CAAC,QAAkB;IACzD,OAAO,IAAI,CAAC,SAAS,CAAC;QACpB,GAAG,EAAE,QAAQ,CAAC,GAAG;QACjB,OAAO,EAAE,QAAQ,CAAC,OAAO;QACzB,OAAO,EAAE,QAAQ,CAAC,OAAO;QACzB,UAAU,EAAE,QAAQ,CAAC,UAAU;KAChC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,mBAAmB,CACjC,IAAsB,EACtB,QAAmC,EACnC,OAAgC,EAChC,KAA8B;IAE9B,MAAM,MAAM,GAAG,cAAc,CAAC,IAAI,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC;IAEjD,MAAM,UAAU,GAAG,KAAK,EAAE,EAAU,EAAE,OAAgB,EAAiB,EAAE;QACvE,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,OAAO,CAAC;YAClC,OAAO;YACP,KAAK;YACL,MAAM;SACE,CAAC,CAAC;QACZ,IAAI,IAAI,KAAK,OAAO,EAAE,CAAC;YACrB,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;YAClB,OAAO;QACT,CAAC;QACD,OAAO,CAAC,MAAM,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;IAC3B,CAAC,CAAC;IAEF,OAAO;QACL,IAAI,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE;QAC1B,KAAK,EAAE,CAAC,EAAE,EAAE,EAAE;YACZ,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QACpB,CAAC;QACD,UAAU,EAAE,CAAC,IAAI,EAAE,EAAE;YACnB,KAAK,MAAM,EAAE,EAAE,EAAE,OAAO,EAAE,IAAI,CAAC,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC;gBAClD,IAAI,IAAI,CAAC,OAAO,CAAC;oBAAE,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;YACvC,CAAC;QACH,CAAC;QACD,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE;YACpB,MAAM,GAAG,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;YAC1D,IAAI,CAAC,GAAG;gBAAE,OAAO;YACjB,MAAM,UAAU,CAAC,EAAE,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC;QACpC,CAAC;QACD,YAAY,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;YAC3B,KAAK,MAAM,EAAE,EAAE,EAAE,OAAO,EAAE,IAAI,CAAC,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC;gBAClD,IAAI,IAAI,CAAC,OAAO,CAAC;oBAAE,MAAM,UAAU,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC;YACnD,CAAC;QACH,CAAC;QACD,MAAM,EAAE,CAAC,EAAE,EAAE,OAAO,EAAE,EAAE;YACtB,OAAO,CAAC,MAAM,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC;QAC9B,CAAC;QACD,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,UAAU,EAAE,EAAE;YAChC,MAAM,MAAM,GAAG,QAAQ,CAAC,IAAI,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;YAC/C,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC;gBACf,MAAM,IAAI,UAAU,CAAC;oBACnB,IAAI,EAAE,YAAY;oBAClB,OAAO,EAAE,mBAAmB;iBAC7B,CAAC,CAAC;YACL,CAAC;YACD,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC;gBAClC,KAAK,EAAE,MAAM,CAAC,KAAK;gBACnB,KAAK;gBACL,MAAM;aACE,CAAC,CAAC;YACZ,MAAM,EAAE,GAAG,MAAM,CAAC,UAAU,EAAE,CAAC;YAC/B,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,OAAO,EAAE,UAAU,CAAC,CAAC;YACtC,UAAU,CAAC,gBAAgB,CAAC,OAAO,EAAE,GAAG,EAAE;gBACxC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;YACpB,CAAC,CAAC,CAAC;YACH,OAAO,OAAO,CAAC;QACjB,CAAC;KACF,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,aAAa,CAC3B,MAA2C,EAC3C,KAAyC;IAEzC,KAAK,MAAM,CAAC,OAAO,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,IAAI,MAAM,EAAE,CAAC;QAC7D,MAAM,YAAY,GAAG,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QACxC,IAAI,YAAY,EAAE,IAAI,KAAK,KAAK,EAAE,CAAC;YACjC,MAAM,IAAI,KAAK,CACb,2BAA2B,OAAO,CAAC,GAAG,0BAA0B,CACjE,CAAC;QACJ,CAAC;QACD,MAAM,GAAG,GAAG,YAA0B,CAAC;QACvC,KAAK,MAAM,UAAU,IAAI,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC;YACxC,GAAG,CAAC,SAAS,CAAC,UAAU,CAAC,GAAG,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE;gBAC/C,MAAM,OAAO,GAAG,wBAAwB,CAAC,QAAQ,CAAC,CAAC;gBACnD,MAAM,QAAQ,CAAC,KAAK,CAAC;oBACnB,KAAK,EAAE,QAAQ;oBACf,GAAG,EAAE,QAAQ,CAAC,GAAG;oBACjB,OAAO,EAAE,OAAO,CAAC,IAAI,EAAE;oBACvB,KAAK;oBACL,IAAI,EAAE,KAAK,EAAE,EAAU,EAAE,EAAE;wBACzB,IAAI,CAAC;4BACH,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC;wBAC5B,CAAC;wBAAC,MAAM,CAAC;4BACP,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;wBACpB,CAAC;oBACH,CAAC;iBACO,CAAC,CAAC;YACd,CAAC,CAAC,CAAC;QACL,CAAC;IACH,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,MAA2C;IAE3C,KAAK,MAAM,EAAE,OAAO,EAAE,IAAI,MAAM,CAAC,MAAM,EAAE,EAAE,CAAC;QAC1C,MAAM,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC;IACzB,CAAC;AACH,CAAC;AAED,MAAM,UAAU,mBAAmB,CACjC,IAAsB,EACtB,QAA0C;IAE1C,OAAO,UAAU,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE,EAAE,QAAQ,CAAC,CAAC;AAChD,CAAC"}
@@ -0,0 +1,21 @@
1
+ import type { UseCaseBag } from '../app/index.js';
2
+ import type { PathTo, UnionToIntersection } from '../app/nest.js';
3
+ import type { Infer, StandardSchemaV1 } from '../core/index.js';
4
+ type ExternalCall<C, Ctx> = C extends {
5
+ input: infer Input extends StandardSchemaV1;
6
+ output: infer Output extends StandardSchemaV1;
7
+ } ? (input: Infer<Input>, opts?: {
8
+ ctx?: Ctx;
9
+ signal?: AbortSignal;
10
+ }) => Promise<Infer<Output>> : never;
11
+ /**
12
+ * In-process client nested by use-case key. Event and internal use cases are omitted.
13
+ */
14
+ export type NestedClient<Bag extends UseCaseBag, Ctx> = UnionToIntersection<{
15
+ [K in keyof Bag]: Bag[K] extends {
16
+ trigger: 'external';
17
+ key: infer Id extends string;
18
+ } ? PathTo<Id, ExternalCall<Bag[K], Ctx>> : never;
19
+ }[keyof Bag]>;
20
+ export {};
21
+ //# sourceMappingURL=client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/runtime/client.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,KAAK,EAAE,MAAM,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AAClE,OAAO,KAAK,EAAE,KAAK,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAEhE,KAAK,YAAY,CAAC,CAAC,EAAE,GAAG,IAAI,CAAC,SAAS;IACpC,KAAK,EAAE,MAAM,KAAK,SAAS,gBAAgB,CAAC;IAC5C,MAAM,EAAE,MAAM,MAAM,SAAS,gBAAgB,CAAC;CAC/C,GACG,CACE,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,EACnB,IAAI,CAAC,EAAE;IAAE,GAAG,CAAC,EAAE,GAAG,CAAC;IAAC,MAAM,CAAC,EAAE,WAAW,CAAA;CAAE,KACvC,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,GAC3B,KAAK,CAAC;AAEV;;GAEG;AACH,MAAM,MAAM,YAAY,CAAC,GAAG,SAAS,UAAU,EAAE,GAAG,IAAI,mBAAmB,CACzE;KACG,CAAC,IAAI,MAAM,GAAG,GAAG,GAAG,CAAC,CAAC,CAAC,SAAS;QAC/B,OAAO,EAAE,UAAU,CAAC;QACpB,GAAG,EAAE,MAAM,EAAE,SAAS,MAAM,CAAC;KAC9B,GACG,MAAM,CAAC,EAAE,EAAE,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,GACrC,KAAK;CACV,CAAC,MAAM,GAAG,CAAC,CACb,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/runtime/client.ts"],"names":[],"mappings":""}
@@ -0,0 +1,89 @@
1
+ import type { UseCaseBag } from '../app/index.js';
2
+ import type { EventCatalog } from '../domain/index.js';
3
+ export type RequiredPorts<Bag extends UseCaseBag, Routed = never> = {
4
+ [K in keyof Bag]: Bag[K] extends {
5
+ ports: infer P;
6
+ } ? P[keyof P] : never;
7
+ }[keyof Bag] | ChannelPorts<Routed>;
8
+ type ChannelPorts<Routed> = Routed extends {
9
+ ports: infer P;
10
+ } ? P[keyof P] : never;
11
+ export type RequiredCatalogs<Bag extends UseCaseBag, Routed = never> = {
12
+ [K in keyof Bag]: (Bag[K] extends {
13
+ publishes: readonly (infer C)[];
14
+ } ? C : never) | (Bag[K] extends {
15
+ catalog: infer C;
16
+ } ? C : never);
17
+ }[keyof Bag] | ChannelCatalogs<Routed>;
18
+ type ChannelCatalogs<Routed> = Routed extends {
19
+ catalog: infer C;
20
+ } ? C : never;
21
+ type RequiredChannels<Bag extends UseCaseBag> = {
22
+ [K in keyof Bag]: Bag[K] extends {
23
+ channels: readonly (infer Ch)[];
24
+ } ? Ch : never;
25
+ }[keyof Bag];
26
+ type UsedByPort<Bag extends UseCaseBag, Routed, Token> = {
27
+ [K in keyof Bag]: Bag[K] extends {
28
+ ports: infer P;
29
+ key: infer Id extends string;
30
+ } ? Token extends P[keyof P] ? Id : never : never;
31
+ }[keyof Bag] | ChannelUsedByPort<Routed, Token>;
32
+ type ChannelUsedByPort<Routed, Token> = Routed extends {
33
+ ports: infer P;
34
+ catalog: EventCatalog<infer Key extends string>;
35
+ } ? Token extends P[keyof P] ? Key : never : never;
36
+ type UsedByCatalog<Bag extends UseCaseBag, Routed, Cat> = {
37
+ [K in keyof Bag]: Bag[K] extends {
38
+ key: infer Id extends string;
39
+ } ? (Bag[K] extends {
40
+ publishes: readonly (infer C)[];
41
+ } ? Cat extends C ? Id : never : never) | (Bag[K] extends {
42
+ catalog: infer C;
43
+ } ? Cat extends C ? Id : never : never) : never;
44
+ }[keyof Bag] | ChannelUsedByCatalog<Routed, Cat>;
45
+ type ChannelUsedByCatalog<Routed, Cat> = Routed extends {
46
+ catalog: infer C;
47
+ } ? Cat extends C ? 'channel' : never : never;
48
+ type UsedByChannel<Bag extends UseCaseBag, Ch> = {
49
+ [K in keyof Bag]: Bag[K] extends {
50
+ channels: readonly (infer C)[];
51
+ key: infer Id extends string;
52
+ } ? Ch extends C ? Id : never : never;
53
+ }[keyof Bag];
54
+ type PortAlias<Bag extends UseCaseBag, Routed, Token> = {
55
+ [K in keyof Bag]: Bag[K] extends {
56
+ ports: infer P;
57
+ } ? {
58
+ [A in keyof P]: [P[A]] extends [Token] ? [Token] extends [P[A]] ? A & string : never : never;
59
+ }[keyof P] : never;
60
+ }[keyof Bag] | ChannelPortAlias<Routed, Token>;
61
+ type ChannelPortAlias<Routed, Token> = Routed extends {
62
+ ports: infer P;
63
+ } ? {
64
+ [A in keyof P]: [P[A]] extends [Token] ? [Token] extends [P[A]] ? A & string : never : never;
65
+ }[keyof P] : never;
66
+ type PortDisplayName<Bag extends UseCaseBag, Routed, Token> = JoinUnion<PortAlias<Bag, Routed, Token>>;
67
+ type CatalogKeyOf<T> = T extends EventCatalog<infer Key extends string, infer _Kind, infer _Events, infer _Ctx> ? Key : 'unknown';
68
+ type CatalogKeyOfChannel<T> = T extends {
69
+ catalog: EventCatalog<infer Key extends string, infer _Kind, infer _Events, infer _Ctx>;
70
+ } ? Key : 'unknown';
71
+ type UnionToIntersection<U> = (U extends unknown ? (x: U) => void : never) extends (x: infer I) => void ? I : never;
72
+ type LastOf<U> = UnionToIntersection<U extends unknown ? (x: U) => void : never> extends (x: infer L) => void ? L : never;
73
+ /** Collapse `'a' | 'b'` into `'a, b'` so one missing port is one message. */
74
+ type JoinUnion<U extends string> = [U] extends [never] ? never : LastOf<U> extends infer L extends string ? Exclude<U, L> extends infer Rest extends string ? [Rest] extends [never] ? L : `${JoinUnion<Rest>}, ${L}` : L : never;
75
+ type MissingPortMessages<Bag extends UseCaseBag, Provided, Routed> = Exclude<RequiredPorts<Bag, Routed>, Provided> extends infer T ? T extends unknown ? `hexok: unprovided port "${PortDisplayName<Bag, Routed, T>}" (used by ${JoinUnion<UsedByPort<Bag, Routed, T>>}). Call .provide(token, impl) before .build()` : never : never;
76
+ type MissingCatalogMessages<Bag extends UseCaseBag, Bound, Routed> = Exclude<RequiredCatalogs<Bag, Routed>, Bound> extends infer T ? T extends unknown ? `hexok: unbound catalog "${CatalogKeyOf<T>}" (used by ${JoinUnion<UsedByCatalog<Bag, Routed, T>>}). Call .bind(...) before .build()` : never : never;
77
+ type MissingChannelMessages<Bag extends UseCaseBag, Routed> = Exclude<RequiredChannels<Bag>, Routed> extends infer T ? T extends unknown ? `hexok: unrouted channel "${CatalogKeyOfChannel<T>}" (used by ${JoinUnion<UsedByChannel<Bag, T>>}). Call .route(...) before .build()` : never : never;
78
+ /** Compile-time type of `build` when a required port, catalog, or channel is still missing. */
79
+ export type MissingMessages<Bag extends UseCaseBag, Provided, Bound, Routed = never> = MissingPortMessages<Bag, Provided, Routed> | MissingCatalogMessages<Bag, Bound, Routed> | MissingChannelMessages<Bag, Routed>;
80
+ /** Compile-time error when `provide` is called twice for the same token. */
81
+ export type DuplicatePortError = `hexok: port already provided`;
82
+ /** Compile-time error when `bind` is called twice for the same catalog. */
83
+ export type DuplicateCatalogError<N extends string = string> = string extends N ? `hexok: catalog already bound` : `hexok: catalog "${N}" already bound`;
84
+ /** Compile-time error when `route` is called twice for the same channel catalog. */
85
+ export type DuplicateChannelError<N extends string = string> = string extends N ? `hexok: channel already routed` : `hexok: catalog "${N}" already routed`;
86
+ /** Compile-time error when `route` is given a catalog that is not a bus. */
87
+ export type ChannelKindError<Key extends string = string, Kind extends string = string> = `hexok: channel catalog "${Key}" is kind "${Kind}". Channels require a bus catalog.`;
88
+ export {};
89
+ //# sourceMappingURL=completeness.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"completeness.d.ts","sourceRoot":"","sources":["../../src/runtime/completeness.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=completeness.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"completeness.js","sourceRoot":"","sources":["../../src/runtime/completeness.ts"],"names":[],"mappings":""}
@@ -0,0 +1,7 @@
1
+ import type { AnyEventCatalog, DomainEvent, Envelope } from '../domain/index.js';
2
+ export declare function isEnvelope(value: unknown): value is Envelope;
3
+ /** Wrap a domain event in an envelope, or pass an envelope through. The event must belong to one of `catalogs`. */
4
+ export declare function wrapEvent(event: DomainEvent | Envelope, catalogs: readonly AnyEventCatalog[], requestCtx?: unknown): Envelope;
5
+ /** Request ctx plus `correlationId` inherited from an incoming envelope when ctx omits it. */
6
+ export declare function tracingCtx(requestCtx: unknown, incoming?: Envelope): unknown;
7
+ //# sourceMappingURL=envelope.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"envelope.d.ts","sourceRoot":"","sources":["../../src/runtime/envelope.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,eAAe,EACf,WAAW,EACX,QAAQ,EAET,MAAM,oBAAoB,CAAC;AAE5B,wBAAgB,UAAU,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,QAAQ,CAU5D;AAED,mHAAmH;AACnH,wBAAgB,SAAS,CACvB,KAAK,EAAE,WAAW,GAAG,QAAQ,EAC7B,QAAQ,EAAE,SAAS,eAAe,EAAE,EACpC,UAAU,CAAC,EAAE,OAAO,GACnB,QAAQ,CA4BV;AA8BD,8FAA8F;AAC9F,wBAAgB,UAAU,CAAC,UAAU,EAAE,OAAO,EAAE,QAAQ,CAAC,EAAE,QAAQ,GAAG,OAAO,CAc5E"}