@spine-event-engine/server 2.0.0-snapshot.2

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 (354) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +569 -0
  3. package/REFERENCE.md +488 -0
  4. package/dist/bus/command-bus.d.ts +61 -0
  5. package/dist/bus/command-bus.d.ts.map +1 -0
  6. package/dist/bus/command-bus.js +201 -0
  7. package/dist/bus/command-bus.js.map +1 -0
  8. package/dist/bus/command-dispatcher-registry.d.ts +33 -0
  9. package/dist/bus/command-dispatcher-registry.d.ts.map +1 -0
  10. package/dist/bus/command-dispatcher-registry.js +75 -0
  11. package/dist/bus/command-dispatcher-registry.js.map +1 -0
  12. package/dist/bus/command-dispatcher.d.ts +25 -0
  13. package/dist/bus/command-dispatcher.d.ts.map +1 -0
  14. package/dist/bus/command-dispatcher.js +15 -0
  15. package/dist/bus/command-dispatcher.js.map +1 -0
  16. package/dist/bus/command-errors.d.ts +23 -0
  17. package/dist/bus/command-errors.d.ts.map +1 -0
  18. package/dist/bus/command-errors.js +52 -0
  19. package/dist/bus/command-errors.js.map +1 -0
  20. package/dist/bus/event-bus.d.ts +113 -0
  21. package/dist/bus/event-bus.d.ts.map +1 -0
  22. package/dist/bus/event-bus.js +518 -0
  23. package/dist/bus/event-bus.js.map +1 -0
  24. package/dist/bus/event-dispatcher-origin-schemas.d.ts +17 -0
  25. package/dist/bus/event-dispatcher-origin-schemas.d.ts.map +1 -0
  26. package/dist/bus/event-dispatcher-origin-schemas.js +32 -0
  27. package/dist/bus/event-dispatcher-origin-schemas.js.map +1 -0
  28. package/dist/bus/event-dispatcher-registry.d.ts +48 -0
  29. package/dist/bus/event-dispatcher-registry.d.ts.map +1 -0
  30. package/dist/bus/event-dispatcher-registry.js +176 -0
  31. package/dist/bus/event-dispatcher-registry.js.map +1 -0
  32. package/dist/bus/event-dispatcher.d.ts +48 -0
  33. package/dist/bus/event-dispatcher.d.ts.map +1 -0
  34. package/dist/bus/event-dispatcher.js +15 -0
  35. package/dist/bus/event-dispatcher.js.map +1 -0
  36. package/dist/context/bounded-context.d.ts +606 -0
  37. package/dist/context/bounded-context.d.ts.map +1 -0
  38. package/dist/context/bounded-context.js +1780 -0
  39. package/dist/context/bounded-context.js.map +1 -0
  40. package/dist/context/entity-inbox.d.ts +63 -0
  41. package/dist/context/entity-inbox.d.ts.map +1 -0
  42. package/dist/context/entity-inbox.js +380 -0
  43. package/dist/context/entity-inbox.js.map +1 -0
  44. package/dist/context/local-inbox-handoff.d.ts +244 -0
  45. package/dist/context/local-inbox-handoff.d.ts.map +1 -0
  46. package/dist/context/local-inbox-handoff.js +334 -0
  47. package/dist/context/local-inbox-handoff.js.map +1 -0
  48. package/dist/context/projection-handoff.d.ts +46 -0
  49. package/dist/context/projection-handoff.d.ts.map +1 -0
  50. package/dist/context/projection-handoff.js +172 -0
  51. package/dist/context/projection-handoff.js.map +1 -0
  52. package/dist/context/tenant-index.d.ts +41 -0
  53. package/dist/context/tenant-index.d.ts.map +1 -0
  54. package/dist/context/tenant-index.js +92 -0
  55. package/dist/context/tenant-index.js.map +1 -0
  56. package/dist/delivery/conditional-pickup.d.ts +25 -0
  57. package/dist/delivery/conditional-pickup.d.ts.map +1 -0
  58. package/dist/delivery/conditional-pickup.js +26 -0
  59. package/dist/delivery/conditional-pickup.js.map +1 -0
  60. package/dist/delivery/delivery-builder.d.ts +216 -0
  61. package/dist/delivery/delivery-builder.d.ts.map +1 -0
  62. package/dist/delivery/delivery-builder.js +323 -0
  63. package/dist/delivery/delivery-builder.js.map +1 -0
  64. package/dist/delivery/delivery-lease.d.ts +15 -0
  65. package/dist/delivery/delivery-lease.d.ts.map +1 -0
  66. package/dist/delivery/delivery-lease.js +44 -0
  67. package/dist/delivery/delivery-lease.js.map +1 -0
  68. package/dist/delivery/delivery-loop.d.ts +113 -0
  69. package/dist/delivery/delivery-loop.d.ts.map +1 -0
  70. package/dist/delivery/delivery-loop.js +119 -0
  71. package/dist/delivery/delivery-loop.js.map +1 -0
  72. package/dist/delivery/delivery-monitor.d.ts +165 -0
  73. package/dist/delivery/delivery-monitor.d.ts.map +1 -0
  74. package/dist/delivery/delivery-monitor.js +168 -0
  75. package/dist/delivery/delivery-monitor.js.map +1 -0
  76. package/dist/delivery/delivery-ports.d.ts +141 -0
  77. package/dist/delivery/delivery-ports.d.ts.map +1 -0
  78. package/dist/delivery/delivery-ports.js +15 -0
  79. package/dist/delivery/delivery-ports.js.map +1 -0
  80. package/dist/delivery/delivery-run-control.d.ts +50 -0
  81. package/dist/delivery/delivery-run-control.d.ts.map +1 -0
  82. package/dist/delivery/delivery-run-control.js +66 -0
  83. package/dist/delivery/delivery-run-control.js.map +1 -0
  84. package/dist/delivery/delivery-run-coordinator.d.ts +218 -0
  85. package/dist/delivery/delivery-run-coordinator.d.ts.map +1 -0
  86. package/dist/delivery/delivery-run-coordinator.js +609 -0
  87. package/dist/delivery/delivery-run-coordinator.js.map +1 -0
  88. package/dist/delivery/delivery-storage-error.d.ts +13 -0
  89. package/dist/delivery/delivery-storage-error.d.ts.map +1 -0
  90. package/dist/delivery/delivery-storage-error.js +30 -0
  91. package/dist/delivery/delivery-storage-error.js.map +1 -0
  92. package/dist/delivery/delivery-supervisor.d.ts +175 -0
  93. package/dist/delivery/delivery-supervisor.d.ts.map +1 -0
  94. package/dist/delivery/delivery-supervisor.js +469 -0
  95. package/dist/delivery/delivery-supervisor.js.map +1 -0
  96. package/dist/delivery/delivery-worker.d.ts +180 -0
  97. package/dist/delivery/delivery-worker.d.ts.map +1 -0
  98. package/dist/delivery/delivery-worker.js +232 -0
  99. package/dist/delivery/delivery-worker.js.map +1 -0
  100. package/dist/delivery/delivery.d.ts +238 -0
  101. package/dist/delivery/delivery.d.ts.map +1 -0
  102. package/dist/delivery/delivery.js +400 -0
  103. package/dist/delivery/delivery.js.map +1 -0
  104. package/dist/delivery/inbox-records.d.ts +19 -0
  105. package/dist/delivery/inbox-records.d.ts.map +1 -0
  106. package/dist/delivery/inbox-records.js +291 -0
  107. package/dist/delivery/inbox-records.js.map +1 -0
  108. package/dist/delivery/inbox-storage.d.ts +81 -0
  109. package/dist/delivery/inbox-storage.d.ts.map +1 -0
  110. package/dist/delivery/inbox-storage.js +353 -0
  111. package/dist/delivery/inbox-storage.js.map +1 -0
  112. package/dist/delivery/inbox.d.ts +263 -0
  113. package/dist/delivery/inbox.d.ts.map +1 -0
  114. package/dist/delivery/inbox.js +172 -0
  115. package/dist/delivery/inbox.js.map +1 -0
  116. package/dist/delivery/parked-delivery-obligations.d.ts +182 -0
  117. package/dist/delivery/parked-delivery-obligations.d.ts.map +1 -0
  118. package/dist/delivery/parked-delivery-obligations.js +390 -0
  119. package/dist/delivery/parked-delivery-obligations.js.map +1 -0
  120. package/dist/delivery/shard-index.d.ts +41 -0
  121. package/dist/delivery/shard-index.d.ts.map +1 -0
  122. package/dist/delivery/shard-index.js +67 -0
  123. package/dist/delivery/shard-index.js.map +1 -0
  124. package/dist/delivery/sharded-work-registry.d.ts +114 -0
  125. package/dist/delivery/sharded-work-registry.d.ts.map +1 -0
  126. package/dist/delivery/sharded-work-registry.js +360 -0
  127. package/dist/delivery/sharded-work-registry.js.map +1 -0
  128. package/dist/entity/entity-metadata.d.ts +173 -0
  129. package/dist/entity/entity-metadata.d.ts.map +1 -0
  130. package/dist/entity/entity-metadata.js +187 -0
  131. package/dist/entity/entity-metadata.js.map +1 -0
  132. package/dist/entity/entity-storage-descriptor.d.ts +64 -0
  133. package/dist/entity/entity-storage-descriptor.d.ts.map +1 -0
  134. package/dist/entity/entity-storage-descriptor.js +227 -0
  135. package/dist/entity/entity-storage-descriptor.js.map +1 -0
  136. package/dist/entity/entity-transaction.d.ts +372 -0
  137. package/dist/entity/entity-transaction.d.ts.map +1 -0
  138. package/dist/entity/entity-transaction.js +413 -0
  139. package/dist/entity/entity-transaction.js.map +1 -0
  140. package/dist/entity/entity-transition-validation.d.ts +47 -0
  141. package/dist/entity/entity-transition-validation.d.ts.map +1 -0
  142. package/dist/entity/entity-transition-validation.js +327 -0
  143. package/dist/entity/entity-transition-validation.js.map +1 -0
  144. package/dist/entity/entity.d.ts +499 -0
  145. package/dist/entity/entity.d.ts.map +1 -0
  146. package/dist/entity/entity.js +829 -0
  147. package/dist/entity/entity.js.map +1 -0
  148. package/dist/entity/implicit-required-id.d.ts +15 -0
  149. package/dist/entity/implicit-required-id.d.ts.map +1 -0
  150. package/dist/entity/implicit-required-id.js +123 -0
  151. package/dist/entity/implicit-required-id.js.map +1 -0
  152. package/dist/entity/spec-scanner.d.ts +14 -0
  153. package/dist/entity/spec-scanner.d.ts.map +1 -0
  154. package/dist/entity/spec-scanner.js +37 -0
  155. package/dist/entity/spec-scanner.js.map +1 -0
  156. package/dist/handler/build-time-handler-analyzer.d.ts +150 -0
  157. package/dist/handler/build-time-handler-analyzer.d.ts.map +1 -0
  158. package/dist/handler/build-time-handler-analyzer.js +1101 -0
  159. package/dist/handler/build-time-handler-analyzer.js.map +1 -0
  160. package/dist/handler/command-registration-readiness.d.ts +99 -0
  161. package/dist/handler/command-registration-readiness.d.ts.map +1 -0
  162. package/dist/handler/command-registration-readiness.js +118 -0
  163. package/dist/handler/command-registration-readiness.js.map +1 -0
  164. package/dist/handler/event-handler-filter.d.ts +43 -0
  165. package/dist/handler/event-handler-filter.d.ts.map +1 -0
  166. package/dist/handler/event-handler-filter.js +128 -0
  167. package/dist/handler/event-handler-filter.js.map +1 -0
  168. package/dist/handler/event-registration-readiness.d.ts +196 -0
  169. package/dist/handler/event-registration-readiness.d.ts.map +1 -0
  170. package/dist/handler/event-registration-readiness.js +187 -0
  171. package/dist/handler/event-registration-readiness.js.map +1 -0
  172. package/dist/handler/external.d.ts +10 -0
  173. package/dist/handler/external.d.ts.map +1 -0
  174. package/dist/handler/external.js +15 -0
  175. package/dist/handler/external.js.map +1 -0
  176. package/dist/handler/generated-handler-registry.d.ts +154 -0
  177. package/dist/handler/generated-handler-registry.d.ts.map +1 -0
  178. package/dist/handler/generated-handler-registry.js +223 -0
  179. package/dist/handler/generated-handler-registry.js.map +1 -0
  180. package/dist/handler/generated-registry-discovery.d.ts +94 -0
  181. package/dist/handler/generated-registry-discovery.d.ts.map +1 -0
  182. package/dist/handler/generated-registry-discovery.js +228 -0
  183. package/dist/handler/generated-registry-discovery.js.map +1 -0
  184. package/dist/handler/generated-registry-writer.d.ts +58 -0
  185. package/dist/handler/generated-registry-writer.d.ts.map +1 -0
  186. package/dist/handler/generated-registry-writer.js +458 -0
  187. package/dist/handler/generated-registry-writer.js.map +1 -0
  188. package/dist/handler/handler-codegen.d.ts +48 -0
  189. package/dist/handler/handler-codegen.d.ts.map +1 -0
  190. package/dist/handler/handler-codegen.js +214 -0
  191. package/dist/handler/handler-codegen.js.map +1 -0
  192. package/dist/handler/handler-decorators.d.ts +134 -0
  193. package/dist/handler/handler-decorators.d.ts.map +1 -0
  194. package/dist/handler/handler-decorators.js +239 -0
  195. package/dist/handler/handler-decorators.js.map +1 -0
  196. package/dist/handler/handler-metadata.d.ts +510 -0
  197. package/dist/handler/handler-metadata.d.ts.map +1 -0
  198. package/dist/handler/handler-metadata.js +391 -0
  199. package/dist/handler/handler-metadata.js.map +1 -0
  200. package/dist/handler/registration-readiness-metadata.d.ts +68 -0
  201. package/dist/handler/registration-readiness-metadata.d.ts.map +1 -0
  202. package/dist/handler/registration-readiness-metadata.js +170 -0
  203. package/dist/handler/registration-readiness-metadata.js.map +1 -0
  204. package/dist/handler/rejection-source.d.ts +11 -0
  205. package/dist/handler/rejection-source.d.ts.map +1 -0
  206. package/dist/handler/rejection-source.js +25 -0
  207. package/dist/handler/rejection-source.js.map +1 -0
  208. package/dist/index.d.ts +46 -0
  209. package/dist/index.d.ts.map +1 -0
  210. package/dist/index.js +54 -0
  211. package/dist/index.js.map +1 -0
  212. package/dist/integration/external-messages.d.ts +49 -0
  213. package/dist/integration/external-messages.d.ts.map +1 -0
  214. package/dist/integration/external-messages.js +112 -0
  215. package/dist/integration/external-messages.js.map +1 -0
  216. package/dist/integration/integration-broker.d.ts +74 -0
  217. package/dist/integration/integration-broker.d.ts.map +1 -0
  218. package/dist/integration/integration-broker.js +444 -0
  219. package/dist/integration/integration-broker.js.map +1 -0
  220. package/dist/integration/third-party-context.d.ts +56 -0
  221. package/dist/integration/third-party-context.d.ts.map +1 -0
  222. package/dist/integration/third-party-context.js +130 -0
  223. package/dist/integration/third-party-context.js.map +1 -0
  224. package/dist/repository/command-errors.d.ts +25 -0
  225. package/dist/repository/command-errors.d.ts.map +1 -0
  226. package/dist/repository/command-errors.js +43 -0
  227. package/dist/repository/command-errors.js.map +1 -0
  228. package/dist/repository/command-routing.d.ts +72 -0
  229. package/dist/repository/command-routing.d.ts.map +1 -0
  230. package/dist/repository/command-routing.js +98 -0
  231. package/dist/repository/command-routing.js.map +1 -0
  232. package/dist/repository/commit-fence.d.ts +22 -0
  233. package/dist/repository/commit-fence.d.ts.map +1 -0
  234. package/dist/repository/commit-fence.js +37 -0
  235. package/dist/repository/commit-fence.js.map +1 -0
  236. package/dist/repository/event-routing.d.ts +71 -0
  237. package/dist/repository/event-routing.d.ts.map +1 -0
  238. package/dist/repository/event-routing.js +96 -0
  239. package/dist/repository/event-routing.js.map +1 -0
  240. package/dist/repository/primitive-id.d.ts +86 -0
  241. package/dist/repository/primitive-id.d.ts.map +1 -0
  242. package/dist/repository/primitive-id.js +110 -0
  243. package/dist/repository/primitive-id.js.map +1 -0
  244. package/dist/repository/repository.d.ts +670 -0
  245. package/dist/repository/repository.d.ts.map +1 -0
  246. package/dist/repository/repository.js +3298 -0
  247. package/dist/repository/repository.js.map +1 -0
  248. package/dist/repository/routing-declarations.d.ts +75 -0
  249. package/dist/repository/routing-declarations.d.ts.map +1 -0
  250. package/dist/repository/routing-declarations.js +101 -0
  251. package/dist/repository/routing-declarations.js.map +1 -0
  252. package/dist/repository/state-update-routing.d.ts +66 -0
  253. package/dist/repository/state-update-routing.d.ts.map +1 -0
  254. package/dist/repository/state-update-routing.js +91 -0
  255. package/dist/repository/state-update-routing.js.map +1 -0
  256. package/dist/runtime/runtime.d.ts +156 -0
  257. package/dist/runtime/runtime.d.ts.map +1 -0
  258. package/dist/runtime/runtime.js +215 -0
  259. package/dist/runtime/runtime.js.map +1 -0
  260. package/dist/runtime/signal-intake.d.ts +84 -0
  261. package/dist/runtime/signal-intake.d.ts.map +1 -0
  262. package/dist/runtime/signal-intake.js +94 -0
  263. package/dist/runtime/signal-intake.js.map +1 -0
  264. package/dist/runtime/signal-metadata.d.ts +242 -0
  265. package/dist/runtime/signal-metadata.d.ts.map +1 -0
  266. package/dist/runtime/signal-metadata.js +368 -0
  267. package/dist/runtime/signal-metadata.js.map +1 -0
  268. package/dist/server/browser-server.d.ts +49 -0
  269. package/dist/server/browser-server.d.ts.map +1 -0
  270. package/dist/server/browser-server.js +633 -0
  271. package/dist/server/browser-server.js.map +1 -0
  272. package/dist/server/durable-subscription-bindings.d.ts +122 -0
  273. package/dist/server/durable-subscription-bindings.d.ts.map +1 -0
  274. package/dist/server/durable-subscription-bindings.js +524 -0
  275. package/dist/server/durable-subscription-bindings.js.map +1 -0
  276. package/dist/server/environment-attachment.d.ts +356 -0
  277. package/dist/server/environment-attachment.d.ts.map +1 -0
  278. package/dist/server/environment-attachment.js +2061 -0
  279. package/dist/server/environment-attachment.js.map +1 -0
  280. package/dist/server/environment-delivery-records.d.ts +77 -0
  281. package/dist/server/environment-delivery-records.d.ts.map +1 -0
  282. package/dist/server/environment-delivery-records.js +282 -0
  283. package/dist/server/environment-delivery-records.js.map +1 -0
  284. package/dist/server/environment-delivery-worker.d.ts +161 -0
  285. package/dist/server/environment-delivery-worker.d.ts.map +1 -0
  286. package/dist/server/environment-delivery-worker.js +664 -0
  287. package/dist/server/environment-delivery-worker.js.map +1 -0
  288. package/dist/server/environment.d.ts +43 -0
  289. package/dist/server/environment.d.ts.map +1 -0
  290. package/dist/server/environment.js +90 -0
  291. package/dist/server/environment.js.map +1 -0
  292. package/dist/server/managed-child-subscription.d.ts +11 -0
  293. package/dist/server/managed-child-subscription.d.ts.map +1 -0
  294. package/dist/server/managed-child-subscription.js +44 -0
  295. package/dist/server/managed-child-subscription.js.map +1 -0
  296. package/dist/server/managed-server-application.d.ts +324 -0
  297. package/dist/server/managed-server-application.d.ts.map +1 -0
  298. package/dist/server/managed-server-application.js +937 -0
  299. package/dist/server/managed-server-application.js.map +1 -0
  300. package/dist/server/node-coordinator.d.ts +191 -0
  301. package/dist/server/node-coordinator.d.ts.map +1 -0
  302. package/dist/server/node-coordinator.js +552 -0
  303. package/dist/server/node-coordinator.js.map +1 -0
  304. package/dist/server/process-server-coordinator.d.ts +15 -0
  305. package/dist/server/process-server-coordinator.d.ts.map +1 -0
  306. package/dist/server/process-server-coordinator.js +112 -0
  307. package/dist/server/process-server-coordinator.js.map +1 -0
  308. package/dist/server/reserved-spine-rpc-paths.json +8 -0
  309. package/dist/server/retryable-close.d.ts +28 -0
  310. package/dist/server/retryable-close.d.ts.map +1 -0
  311. package/dist/server/retryable-close.js +129 -0
  312. package/dist/server/retryable-close.js.map +1 -0
  313. package/dist/server/server-environment.d.ts +180 -0
  314. package/dist/server/server-environment.d.ts.map +1 -0
  315. package/dist/server/server-environment.js +418 -0
  316. package/dist/server/server-environment.js.map +1 -0
  317. package/dist/server/server-log.d.ts +18 -0
  318. package/dist/server/server-log.d.ts.map +1 -0
  319. package/dist/server/server-log.js +96 -0
  320. package/dist/server/server-log.js.map +1 -0
  321. package/dist/server/server.d.ts +389 -0
  322. package/dist/server/server.d.ts.map +1 -0
  323. package/dist/server/server.js +752 -0
  324. package/dist/server/server.js.map +1 -0
  325. package/dist/services/spine-services.d.ts +88 -0
  326. package/dist/services/spine-services.d.ts.map +1 -0
  327. package/dist/services/spine-services.js +1586 -0
  328. package/dist/services/spine-services.js.map +1 -0
  329. package/dist/stand/stand.d.ts +294 -0
  330. package/dist/stand/stand.d.ts.map +1 -0
  331. package/dist/stand/stand.js +680 -0
  332. package/dist/stand/stand.js.map +1 -0
  333. package/dist/stand/subscription-observer.d.ts +53 -0
  334. package/dist/stand/subscription-observer.d.ts.map +1 -0
  335. package/dist/stand/subscription-observer.js +444 -0
  336. package/dist/stand/subscription-observer.js.map +1 -0
  337. package/dist/stand/subscription-records.d.ts +12 -0
  338. package/dist/stand/subscription-records.d.ts.map +1 -0
  339. package/dist/stand/subscription-records.js +99 -0
  340. package/dist/stand/subscription-records.js.map +1 -0
  341. package/dist/stand/subscription-registry.d.ts +285 -0
  342. package/dist/stand/subscription-registry.d.ts.map +1 -0
  343. package/dist/stand/subscription-registry.js +403 -0
  344. package/dist/stand/subscription-registry.js.map +1 -0
  345. package/dist/stand/subscription-runtime.d.ts +102 -0
  346. package/dist/stand/subscription-runtime.d.ts.map +1 -0
  347. package/dist/stand/subscription-runtime.js +380 -0
  348. package/dist/stand/subscription-runtime.js.map +1 -0
  349. package/dist/testing/index.d.ts +14 -0
  350. package/dist/testing/index.d.ts.map +1 -0
  351. package/dist/testing/index.js +34 -0
  352. package/dist/testing/index.js.map +1 -0
  353. package/dist/tsconfig.tsbuildinfo +1 -0
  354. package/package.json +65 -0
@@ -0,0 +1,201 @@
1
+ /*
2
+ * Copyright 2026, CodeMatters. All rights reserved.
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
5
+ * in compliance with the License. You may obtain a copy of the License at
6
+ *
7
+ * https://www.apache.org/licenses/LICENSE-2.0
8
+ *
9
+ * Unless required by applicable law or agreed to in writing, software distributed under the License
10
+ * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
11
+ * or implied. See the License for the specific language governing permissions and limitations under
12
+ * the License.
13
+ */
14
+ import { clone } from "@bufbuild/protobuf";
15
+ import { ValidationException, Validate, AnyMessages } from "@spine-event-engine/core";
16
+ import { CommandSchema } from "@spine-event-engine/proto";
17
+ import { runtimeAccess, ServerRuntimeStateError, SingleProcessServerRuntime, } from "../runtime/runtime.js";
18
+ import { CommandValidationError } from "./command-errors.js";
19
+ import { ImplicitRequiredIds } from "../entity/implicit-required-id.js";
20
+ import { CommandDispatcherRegistry } from "./command-dispatcher-registry.js";
21
+ const internalCommandPosters = new WeakMap();
22
+ const commandBusCloseStarters = new WeakMap();
23
+ const commandBusDrainers = new WeakMap();
24
+ const commandBusCloseFinishers = new WeakMap();
25
+ const commandBusWorkCounters = new WeakMap();
26
+ /**
27
+ * Small single-process unicast command bus.
28
+ *
29
+ * Commands are accepted asynchronously through `post()` and routed by enclosed
30
+ * message type URL to exactly one registered dispatcher.
31
+ */
32
+ export class CommandBus {
33
+ #registry = new CommandDispatcherRegistry();
34
+ #runtime = new SingleProcessServerRuntime();
35
+ #started;
36
+ #intakeState = "open";
37
+ #acceptedWorkCount = 0;
38
+ #closed;
39
+ /**
40
+ * Creates a bus and registers its initial dispatchers.
41
+ *
42
+ * @param dispatchers the dispatchers to register.
43
+ */
44
+ constructor(dispatchers = []) {
45
+ this.#started = this.#runtime.start();
46
+ internalCommandPosters.set(this, (command) => this.#postInternal(command));
47
+ commandBusCloseStarters.set(this, () => {
48
+ this.#beginClose();
49
+ });
50
+ commandBusDrainers.set(this, () => this.#drain());
51
+ commandBusCloseFinishers.set(this, () => this.#finishClose());
52
+ commandBusWorkCounters.set(this, () => this.#acceptedWorkCount);
53
+ for (const dispatcher of dispatchers) {
54
+ this.register(dispatcher);
55
+ }
56
+ }
57
+ /**
58
+ * Registers a dispatcher.
59
+ *
60
+ * @param dispatcher the dispatcher to register.
61
+ * @returns the registered dispatcher.
62
+ */
63
+ register(dispatcher) {
64
+ this.#registry.register(dispatcher);
65
+ return dispatcher;
66
+ }
67
+ /**
68
+ * Lists command type URLs accepted by registered dispatchers.
69
+ *
70
+ * @returns the accepted command type URLs.
71
+ */
72
+ acceptedCommandTypes() {
73
+ return this.#registry.acceptedTypeUrls();
74
+ }
75
+ /**
76
+ * Posts a command for asynchronous dispatch.
77
+ *
78
+ * @param command the command envelope to post.
79
+ * @returns A promise that settles after queued command dispatch completes and may reject.
80
+ */
81
+ post(command) {
82
+ const accepted = clone(CommandSchema, command);
83
+ if (this.#intakeState !== "open") {
84
+ return Promise.reject(new ServerRuntimeStateError("enqueue", this.#intakeState));
85
+ }
86
+ return this.#enqueueAccepted(accepted);
87
+ }
88
+ /**
89
+ * Stops accepting new command work and waits for accepted work to settle.
90
+ *
91
+ * Close is idempotent and returns the same close outcome on repeated calls.
92
+ * Runtime close failures reject the returned promise.
93
+ * @returns A promise that settles after the command bus closes.
94
+ *
95
+ */
96
+ close() {
97
+ this.#closed ??= this.#closeOnce();
98
+ return this.#closed;
99
+ }
100
+ #postInternal(command) {
101
+ const accepted = clone(CommandSchema, command);
102
+ if (this.#intakeState === "closed") {
103
+ return Promise.reject(new ServerRuntimeStateError("enqueue", "closed"));
104
+ }
105
+ return this.#enqueueAccepted(accepted);
106
+ }
107
+ #enqueueAccepted(command) {
108
+ this.#acceptedWorkCount++;
109
+ return this.#started.then(() => this.#runtime.enqueue(() => this.#dispatch(command)));
110
+ }
111
+ #beginClose() {
112
+ if (this.#intakeState === "open") {
113
+ this.#intakeState = "closing";
114
+ }
115
+ }
116
+ #drain() {
117
+ return this.#started.then(() => runtimeAccess.drain(this.#runtime));
118
+ }
119
+ #finishClose() {
120
+ this.#closed ??= this.#closeOnce();
121
+ return this.#closed;
122
+ }
123
+ async #closeOnce() {
124
+ this.#beginClose();
125
+ await this.#started;
126
+ await this.#runtime.close();
127
+ this.#intakeState = "closed";
128
+ }
129
+ async #dispatch(command) {
130
+ const packed = command.message;
131
+ if (packed === undefined || packed.typeUrl === "") {
132
+ throw new Error("CommandBus requires command.message.typeUrl.");
133
+ }
134
+ const typeUrl = packed.typeUrl;
135
+ const registration = this.#registry.find(typeUrl);
136
+ if (registration === undefined) {
137
+ throw new Error(`No command dispatcher registered for "${typeUrl}".`);
138
+ }
139
+ const message = AnyMessages.unpack(packed, registration.schema);
140
+ if (message === undefined) {
141
+ throw CommandValidationError.invalidPayload();
142
+ }
143
+ try {
144
+ Validate.check(registration.schema, message);
145
+ }
146
+ catch (error) {
147
+ if (error instanceof ValidationException) {
148
+ throw new CommandValidationError(error.asMessage());
149
+ }
150
+ throw error;
151
+ }
152
+ const implicitId = ImplicitRequiredIds.validateCommand(registration.schema, message);
153
+ if (!implicitId.valid) {
154
+ throw new CommandValidationError(implicitId.error);
155
+ }
156
+ await registration.dispatcher.dispatch(clone(CommandSchema, command));
157
+ }
158
+ }
159
+ /**
160
+ * Provides framework-owned command posting and coordinated close access.
161
+ *
162
+ * @internal
163
+ */
164
+ export const commandBusAccess = Object.freeze({
165
+ postInternal(commandBus, command) {
166
+ const postInternal = internalCommandPosters.get(commandBus);
167
+ if (postInternal === undefined) {
168
+ throw new TypeError("Internal command post requires a CommandBus instance.");
169
+ }
170
+ return postInternal(command);
171
+ },
172
+ beginClose(commandBus) {
173
+ const beginClose = commandBusCloseStarters.get(commandBus);
174
+ if (beginClose === undefined) {
175
+ throw new TypeError("Command-bus close coordination requires a CommandBus instance.");
176
+ }
177
+ beginClose();
178
+ },
179
+ drain(commandBus) {
180
+ const drain = commandBusDrainers.get(commandBus);
181
+ if (drain === undefined) {
182
+ throw new TypeError("Command-bus drain requires a CommandBus instance.");
183
+ }
184
+ return drain();
185
+ },
186
+ finishClose(commandBus) {
187
+ const finishClose = commandBusCloseFinishers.get(commandBus);
188
+ if (finishClose === undefined) {
189
+ throw new TypeError("Command-bus close completion requires a CommandBus instance.");
190
+ }
191
+ return finishClose();
192
+ },
193
+ acceptedWorkCount(commandBus) {
194
+ const acceptedWorkCount = commandBusWorkCounters.get(commandBus);
195
+ if (acceptedWorkCount === undefined) {
196
+ throw new TypeError("Command-bus work counting requires a CommandBus instance.");
197
+ }
198
+ return acceptedWorkCount();
199
+ },
200
+ });
201
+ //# sourceMappingURL=command-bus.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"command-bus.js","sourceRoot":"","sources":["../../src/bus/command-bus.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,33 @@
1
+ import { type MessageSchema } from "@spine-event-engine/core";
2
+ import type { CommandDispatcher } from "./command-dispatcher.js";
3
+ interface RegisteredCommandDispatcher {
4
+ readonly dispatcher: CommandDispatcher;
5
+ readonly schema: MessageSchema;
6
+ }
7
+ /**
8
+ * Internal unicast registry keyed by canonical Spine command type URL.
9
+ */
10
+ export declare class CommandDispatcherRegistry {
11
+ #private;
12
+ /**
13
+ * Registers a dispatcher and all of its distinct command schemas.
14
+ *
15
+ * @param dispatcher the dispatcher to register.
16
+ */
17
+ register(dispatcher: CommandDispatcher): void;
18
+ /**
19
+ * Finds the dispatcher registered for a canonical command type URL.
20
+ *
21
+ * @param typeUrl the canonical command type URL.
22
+ * @returns the registration, when one exists.
23
+ */
24
+ find(typeUrl: string): RegisteredCommandDispatcher | undefined;
25
+ /**
26
+ * Lists the canonical command type URLs accepted by this registry.
27
+ *
28
+ * @returns the registered type URLs.
29
+ */
30
+ acceptedTypeUrls(): readonly string[];
31
+ }
32
+ export {};
33
+ //# sourceMappingURL=command-dispatcher-registry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"command-dispatcher-registry.d.ts","sourceRoot":"","sources":["../../src/bus/command-dispatcher-registry.ts"],"names":[],"mappings":"AAcA,OAAO,EAAE,KAAK,aAAa,EAAY,MAAM,0BAA0B,CAAC;AAExE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAEjE,UAAU,2BAA2B;IACnC,QAAQ,CAAC,UAAU,EAAE,iBAAiB,CAAC;IACvC,QAAQ,CAAC,MAAM,EAAE,aAAa,CAAC;CAChC;AAED;;GAEG;AACH,qBAAa,yBAAyB;;IAIpC;;;;OAIG;IACH,QAAQ,CAAC,UAAU,EAAE,iBAAiB,GAAG,IAAI;IAyB7C;;;;;OAKG;IACH,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,2BAA2B,GAAG,SAAS;IAI9D;;;;OAIG;IACH,gBAAgB,IAAI,SAAS,MAAM,EAAE;CAoBtC"}
@@ -0,0 +1,75 @@
1
+ /*
2
+ * Copyright 2026, CodeMatters. All rights reserved.
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
5
+ * in compliance with the License. You may obtain a copy of the License at
6
+ *
7
+ * https://www.apache.org/licenses/LICENSE-2.0
8
+ *
9
+ * Unless required by applicable law or agreed to in writing, software distributed under the License
10
+ * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
11
+ * or implied. See the License for the specific language governing permissions and limitations under
12
+ * the License.
13
+ */
14
+ import { TypeUrls } from "@spine-event-engine/core";
15
+ /**
16
+ * Internal unicast registry keyed by canonical Spine command type URL.
17
+ */
18
+ export class CommandDispatcherRegistry {
19
+ #dispatchers = new Set();
20
+ #byTypeUrl = new Map();
21
+ /**
22
+ * Registers a dispatcher and all of its distinct command schemas.
23
+ *
24
+ * @param dispatcher the dispatcher to register.
25
+ */
26
+ register(dispatcher) {
27
+ if (this.#dispatchers.has(dispatcher)) {
28
+ return;
29
+ }
30
+ const registrations = CommandDispatcherRegistry.#registrations(dispatcher);
31
+ for (const registration of registrations) {
32
+ const registered = this.#byTypeUrl.get(registration.typeUrl);
33
+ if (registered !== undefined && registered.dispatcher !== dispatcher) {
34
+ throw new Error(`Duplicate command dispatcher for "${registration.typeUrl}".`);
35
+ }
36
+ }
37
+ this.#dispatchers.add(dispatcher);
38
+ for (const registration of registrations) {
39
+ this.#byTypeUrl.set(registration.typeUrl, {
40
+ dispatcher,
41
+ schema: registration.schema,
42
+ });
43
+ }
44
+ }
45
+ /**
46
+ * Finds the dispatcher registered for a canonical command type URL.
47
+ *
48
+ * @param typeUrl the canonical command type URL.
49
+ * @returns the registration, when one exists.
50
+ */
51
+ find(typeUrl) {
52
+ return this.#byTypeUrl.get(typeUrl);
53
+ }
54
+ /**
55
+ * Lists the canonical command type URLs accepted by this registry.
56
+ *
57
+ * @returns the registered type URLs.
58
+ */
59
+ acceptedTypeUrls() {
60
+ return Object.freeze([...this.#byTypeUrl.keys()]);
61
+ }
62
+ static #registrations(dispatcher) {
63
+ const registrations = [];
64
+ const seen = new Set();
65
+ for (const schema of dispatcher.messageSchemas()) {
66
+ const typeUrl = TypeUrls.derive(schema);
67
+ if (!seen.has(typeUrl)) {
68
+ seen.add(typeUrl);
69
+ registrations.push({ typeUrl, schema });
70
+ }
71
+ }
72
+ return Object.freeze(registrations);
73
+ }
74
+ }
75
+ //# sourceMappingURL=command-dispatcher-registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"command-dispatcher-registry.js","sourceRoot":"","sources":["../../src/bus/command-dispatcher-registry.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAsB,QAAQ,EAAE,MAAM,0BAA0B,CAAC;AASxE;;GAEG;AACH,MAAM,OAAO,yBAAyB;IAC3B,YAAY,GAAG,IAAI,GAAG,EAAqB,CAAC;IAC5C,UAAU,GAAG,IAAI,GAAG,EAAuC,CAAC;IAErE;;;;OAIG;IACH,QAAQ,CAAC,UAA6B;QACpC,IAAI,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC;YACtC,OAAO;QACT,CAAC;QAED,MAAM,aAAa,GAAG,yBAAyB,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC;QAE3E,KAAK,MAAM,YAAY,IAAI,aAAa,EAAE,CAAC;YACzC,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;YAE7D,IAAI,UAAU,KAAK,SAAS,IAAI,UAAU,CAAC,UAAU,KAAK,UAAU,EAAE,CAAC;gBACrE,MAAM,IAAI,KAAK,CAAC,qCAAqC,YAAY,CAAC,OAAO,IAAI,CAAC,CAAC;YACjF,CAAC;QACH,CAAC;QAED,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QAElC,KAAK,MAAM,YAAY,IAAI,aAAa,EAAE,CAAC;YACzC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,YAAY,CAAC,OAAO,EAAE;gBACxC,UAAU;gBACV,MAAM,EAAE,YAAY,CAAC,MAAM;aAC5B,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED;;;;;OAKG;IACH,IAAI,CAAC,OAAe;QAClB,OAAO,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IACtC,CAAC;IAED;;;;OAIG;IACH,gBAAgB;QACd,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;IACpD,CAAC;IACD,MAAM,CAAC,cAAc,CACnB,UAA6B;QAE7B,MAAM,aAAa,GAAiD,EAAE,CAAC;QACvE,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;QAE/B,KAAK,MAAM,MAAM,IAAI,UAAU,CAAC,cAAc,EAAE,EAAE,CAAC;YACjD,MAAM,OAAO,GAAG,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;YAExC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;gBACvB,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;gBAClB,aAAa,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC;YAC1C,CAAC;QACH,CAAC;QAED,OAAO,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;IACtC,CAAC;CACF"}
@@ -0,0 +1,25 @@
1
+ import type { Command } from "@spine-event-engine/proto";
2
+ import type { MessageSchema } from "@spine-event-engine/core";
3
+ /**
4
+ * Small unicast command-dispatch seam for bus and repository adapters.
5
+ *
6
+ * Dispatchers declare the command message schemas they accept and perform
7
+ * handling behind the bus seam. Repository-backed adapters own entity loading
8
+ * and method invocation; the bus only routes accepted command envelopes.
9
+ */
10
+ export interface CommandDispatcher {
11
+ /**
12
+ * Lists generated command message schemas accepted by this dispatcher.
13
+ *
14
+ * @returns the accepted message schemas.
15
+ */
16
+ messageSchemas(): readonly MessageSchema[];
17
+ /**
18
+ * Dispatches one generated Spine command envelope.
19
+ *
20
+ * @param command the command envelope to dispatch.
21
+ * @returns A promise that resolves after the command is dispatched.
22
+ */
23
+ dispatch(command: Command): Promise<void>;
24
+ }
25
+ //# sourceMappingURL=command-dispatcher.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"command-dispatcher.d.ts","sourceRoot":"","sources":["../../src/bus/command-dispatcher.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,2BAA2B,CAAC;AACzD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAE9D;;;;;;GAMG;AACH,MAAM,WAAW,iBAAiB;IAGhC;;;;OAIG;IACH,cAAc,IAAI,SAAS,aAAa,EAAE,CAAC;IAE3C;;;;;OAKG;IACH,QAAQ,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC3C"}
@@ -0,0 +1,15 @@
1
+ /*
2
+ * Copyright 2026, CodeMatters. All rights reserved.
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
5
+ * in compliance with the License. You may obtain a copy of the License at
6
+ *
7
+ * https://www.apache.org/licenses/LICENSE-2.0
8
+ *
9
+ * Unless required by applicable law or agreed to in writing, software distributed under the License
10
+ * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
11
+ * or implied. See the License for the specific language governing permissions and limitations under
12
+ * the License.
13
+ */
14
+ export {};
15
+ //# sourceMappingURL=command-dispatcher.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"command-dispatcher.js","sourceRoot":"","sources":["../../src/bus/command-dispatcher.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG"}
@@ -0,0 +1,23 @@
1
+ import { type ValidationError } from "@spine-event-engine/proto";
2
+ /**
3
+ * Error raised when a command envelope payload fails command-bus validation.
4
+ */
5
+ export declare class CommandValidationError extends Error {
6
+ /**
7
+ * Structured payload validation details from the command-bus boundary.
8
+ */
9
+ readonly validationError: ValidationError;
10
+ /**
11
+ * Creates a command-bus validation error with structured details.
12
+ *
13
+ * @param validationError the structured payload validation details.
14
+ */
15
+ constructor(validationError: ValidationError);
16
+ /**
17
+ * Creates a validation error for payloads that cannot be unpacked as the registered type.
18
+ *
19
+ * @returns the invalid-payload error.
20
+ */
21
+ static invalidPayload(): CommandValidationError;
22
+ }
23
+ //# sourceMappingURL=command-errors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"command-errors.d.ts","sourceRoot":"","sources":["../../src/bus/command-errors.ts"],"names":[],"mappings":"AAgBA,OAAO,EAGL,KAAK,eAAe,EACrB,MAAM,2BAA2B,CAAC;AAEnC;;GAEG;AACH,qBAAa,sBAAuB,SAAQ,KAAK;IAG/C;;OAEG;IACH,QAAQ,CAAC,eAAe,EAAE,eAAe,CAAC;IAE1C;;;;OAIG;gBACS,eAAe,EAAE,eAAe;IAO5C;;;;OAIG;IACH,MAAM,CAAC,cAAc,IAAI,sBAAsB;CAWhD"}
@@ -0,0 +1,52 @@
1
+ /*
2
+ * Copyright 2026, CodeMatters. All rights reserved.
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
5
+ * in compliance with the License. You may obtain a copy of the License at
6
+ *
7
+ * https://www.apache.org/licenses/LICENSE-2.0
8
+ *
9
+ * Unless required by applicable law or agreed to in writing, software distributed under the License
10
+ * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
11
+ * or implied. See the License for the specific language governing permissions and limitations under
12
+ * the License.
13
+ */
14
+ import { create } from "@bufbuild/protobuf";
15
+ import { Validate } from "@spine-event-engine/core";
16
+ import { ConstraintViolationSchema, TemplateStringSchema, } from "@spine-event-engine/proto";
17
+ /**
18
+ * Error raised when a command envelope payload fails command-bus validation.
19
+ */
20
+ export class CommandValidationError extends Error {
21
+ // prettier-ignore
22
+ /**
23
+ * Structured payload validation details from the command-bus boundary.
24
+ */
25
+ validationError;
26
+ /**
27
+ * Creates a command-bus validation error with structured details.
28
+ *
29
+ * @param validationError the structured payload validation details.
30
+ */
31
+ constructor(validationError) {
32
+ super("Command payload validation failed.");
33
+ this.name = "CommandValidationError";
34
+ this.validationError = validationError;
35
+ Object.setPrototypeOf(this, new.target.prototype);
36
+ }
37
+ /**
38
+ * Creates a validation error for payloads that cannot be unpacked as the registered type.
39
+ *
40
+ * @returns the invalid-payload error.
41
+ */
42
+ static invalidPayload() {
43
+ return new CommandValidationError(Validate.createError([
44
+ create(ConstraintViolationSchema, {
45
+ message: create(TemplateStringSchema, {
46
+ withPlaceholders: "Command payload could not be decoded as the registered type.",
47
+ }),
48
+ }),
49
+ ]));
50
+ }
51
+ }
52
+ //# sourceMappingURL=command-errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"command-errors.js","sourceRoot":"","sources":["../../src/bus/command-errors.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAC5C,OAAO,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAC;AACpD,OAAO,EACL,yBAAyB,EACzB,oBAAoB,GAErB,MAAM,2BAA2B,CAAC;AAEnC;;GAEG;AACH,MAAM,OAAO,sBAAuB,SAAQ,KAAK;IAC/C,kBAAkB;IAElB;;OAEG;IACM,eAAe,CAAkB;IAE1C;;;;OAIG;IACH,YAAY,eAAgC;QAC1C,KAAK,CAAC,oCAAoC,CAAC,CAAC;QAC5C,IAAI,CAAC,IAAI,GAAG,wBAAwB,CAAC;QACrC,IAAI,CAAC,eAAe,GAAG,eAAe,CAAC;QACvC,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IACpD,CAAC;IAED;;;;OAIG;IACH,MAAM,CAAC,cAAc;QACnB,OAAO,IAAI,sBAAsB,CAC/B,QAAQ,CAAC,WAAW,CAAC;YACnB,MAAM,CAAC,yBAAyB,EAAE;gBAChC,OAAO,EAAE,MAAM,CAAC,oBAAoB,EAAE;oBACpC,gBAAgB,EAAE,8DAA8D;iBACjF,CAAC;aACH,CAAC;SACH,CAAC,CACH,CAAC;IACJ,CAAC;CACF"}
@@ -0,0 +1,113 @@
1
+ import { type MessageSchema } from "@spine-event-engine/core";
2
+ import { type Event } from "@spine-event-engine/proto";
3
+ import type { EventStore } from "@spine-event-engine/storage";
4
+ import type { ILogLayer } from "loglayer";
5
+ import type { EventDispatcher } from "./event-dispatcher.js";
6
+ interface EventBusAccess {
7
+ /**
8
+ * Assembles a package-internal bus that owns no event store.
9
+ *
10
+ * @param dispatchers the initial dispatchers to register.
11
+ * @returns the assembled forgetting bus.
12
+ */
13
+ createForgettingBus(dispatchers?: Iterable<EventDispatcher>): EventBus;
14
+ createSystemBus(eventStore: EventStore | undefined, dispatchers?: Iterable<EventDispatcher>): EventBus;
15
+ postStored(eventBus: EventBus, event: Event): Promise<void>;
16
+ postStoredFollowUp(eventBus: EventBus, event: Event): Promise<void>;
17
+ postFollowUp(eventBus: EventBus, event: Event): Promise<void>;
18
+ runExclusive<Result>(eventBus: EventBus, work: () => Result | Promise<Result>): Promise<Result>;
19
+ subscribe(eventBus: EventBus, typeUrl: string, subscriber: EventSubscriber): EventSubscription;
20
+ eventSchemas(eventBus: EventBus): readonly MessageSchema[];
21
+ registerSchemas(eventBus: EventBus, schemas: Iterable<MessageSchema>): void;
22
+ unregister(eventBus: EventBus, dispatcher: EventDispatcher): void;
23
+ schema(eventBus: EventBus, typeUrl: string): MessageSchema | undefined;
24
+ beginClose(eventBus: EventBus): void;
25
+ drain(eventBus: EventBus): Promise<void>;
26
+ finishClose(eventBus: EventBus): Promise<void>;
27
+ abortClose(eventBus: EventBus): void;
28
+ acceptedWorkCount(eventBus: EventBus): number;
29
+ installLogger(eventBus: EventBus, logger: ILogLayer): void;
30
+ clearLogger(eventBus: EventBus): void;
31
+ }
32
+ /**
33
+ * Small single-process multicast event bus.
34
+ *
35
+ * Public construction creates a domain-only bus that stores domain events and
36
+ * rejects System schemas, dispatchers, and events. Internally assembled
37
+ * forgetting and System buses own no `EventStore` unless explicitly given one.
38
+ * Events with no matching dispatcher resolve without dispatch. Events with no
39
+ * registered schema reject deterministically before storage or dispatch.
40
+ */
41
+ export declare class EventBus {
42
+ #private;
43
+ /**
44
+ * Creates a domain-only bus backed by an event store and initial dispatchers.
45
+ * System schemas and dispatchers are rejected; framework System events use
46
+ * the package-internal System-bus factory instead.
47
+ *
48
+ * @param eventStore the store that persists accepted events.
49
+ * @param dispatchers the dispatchers to register.
50
+ */
51
+ constructor(eventStore: EventStore, dispatchers?: Iterable<EventDispatcher>);
52
+ /**
53
+ * Registers an event dispatcher.
54
+ *
55
+ * @param dispatcher the dispatcher to register.
56
+ * @returns the registered dispatcher.
57
+ */
58
+ register<Dispatcher extends EventDispatcher>(dispatcher: Dispatcher): Dispatcher;
59
+ /**
60
+ * Posts an event for asynchronous dispatch.
61
+ *
62
+ * @param event the event envelope to post.
63
+ * @returns A promise that settles after admission and dispatch complete and may reject.
64
+ */
65
+ post(event: Event): Promise<void>;
66
+ /**
67
+ * Stops accepting new event work, drains accepted work, and closes an owned event store.
68
+ *
69
+ * Close is idempotent and returns the same close outcome on repeated calls.
70
+ * Runtime and event-store close hooks are both attempted; failures reject as
71
+ * an `AggregateError`.
72
+ *
73
+ * @returns A promise that settles after the event bus closes.
74
+ *
75
+ */
76
+ close(): Promise<void>;
77
+ }
78
+ /**
79
+ * Accepts events for framework service adapters.
80
+ *
81
+ * @internal
82
+ */
83
+ export interface EventSubscriber {
84
+ /**
85
+ * Accepts a cloned dispatched event.
86
+ *
87
+ * @param event the event received by the subscription.
88
+ */
89
+ onEvent(event: Event): void;
90
+ }
91
+ /**
92
+ * Represents an explicit cleanup handle for framework event subscriptions.
93
+ *
94
+ * @internal
95
+ */
96
+ export interface EventSubscription {
97
+ /**
98
+ * Indicates whether the subscription no longer receives events.
99
+ */
100
+ readonly closed: boolean;
101
+ /**
102
+ * Stops this subscription from receiving events.
103
+ */
104
+ unsubscribe(): void;
105
+ }
106
+ /**
107
+ * Provides package-internal EventBus access and assembly.
108
+ *
109
+ * @internal
110
+ */
111
+ export declare const eventBusAccess: EventBusAccess;
112
+ export {};
113
+ //# sourceMappingURL=event-bus.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"event-bus.d.ts","sourceRoot":"","sources":["../../src/bus/event-bus.ts"],"names":[],"mappings":"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"}