@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,444 @@
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, fromBinary } from "@bufbuild/protobuf";
15
+ import { StringValueSchema } from "@bufbuild/protobuf/wkt";
16
+ import { TypeUrls } from "@spine-event-engine/core";
17
+ import { BoundedContextOnlineSchema, ChannelIdSchema, ExternalEventsWantedSchema, } from "@spine-event-engine/proto";
18
+ import { eventBusAccess, EventBus } from "../bus/event-bus.js";
19
+ import { emitServerError } from "../server/server-log.js";
20
+ import { ServerEnvironment, serverEnvironmentAccess } from "../server/server-environment.js";
21
+ import { unpackExternalEvent, toExternalEvent, wrapBoundedContextOnline, wrapExternalEvent, wrapExternalEventsWanted, } from "./external-messages.js";
22
+ const onlineType = typeUrl(BoundedContextOnlineSchema);
23
+ const wantedType = typeUrl(ExternalEventsWantedSchema);
24
+ /**
25
+ * Coordinates private context-owned integration exchanges.
26
+ *
27
+ * @internal
28
+ */
29
+ export class IntegrationBroker {
30
+ #input;
31
+ #wantedByOrigin = new Map();
32
+ #publishers = new Map();
33
+ #resources = [];
34
+ #retainedCloseables = [];
35
+ #externalSchemas;
36
+ #acceptedCallbacks = new Set();
37
+ #transition = Promise.resolve();
38
+ #open;
39
+ #close;
40
+ #closed = false;
41
+ #emptyWantedPublished = false;
42
+ /**
43
+ * Creates an exchange coordinator from context-owned integration resources.
44
+ *
45
+ * @param input Provides the context assembly inputs.
46
+ */
47
+ constructor(input) {
48
+ this.#input = input;
49
+ this.#externalSchemas = Object.freeze([...input.externalEventSchemas].filter((schema, index, schemas) => schemas.findIndex((candidate) => TypeUrls.derive(candidate) === TypeUrls.derive(schema)) === index));
50
+ }
51
+ /**
52
+ * Starts the three exchanges once; callers share the same readiness promise.
53
+ *
54
+ * @returns Completes when all exchanges are ready.
55
+ */
56
+ open() {
57
+ if (this.#closed)
58
+ return Promise.reject(new Error("IntegrationBroker is closed."));
59
+ this.#open ??= this.#openOnce();
60
+ return this.#open;
61
+ }
62
+ /**
63
+ * Stops intake, withdraws interests, drains accepted work, and attempts every cleanup.
64
+ *
65
+ * @returns Completes when all retained resources close.
66
+ */
67
+ close() {
68
+ this.#close ??= this.#closeOnce();
69
+ return this.#close;
70
+ }
71
+ /**
72
+ * Publishes a third-party imported event through this context's private broker.
73
+ *
74
+ * @param event Contains the original event envelope to publish.
75
+ * @returns Completes after publication is accepted or rejects when the broker is closed or the
76
+ * event has no message type URL.
77
+ * @internal
78
+ */
79
+ async publishImported(event) {
80
+ if (this.#closed)
81
+ throw new Error("IntegrationBroker is closed.");
82
+ const targetType = event.message?.typeUrl;
83
+ if (targetType === undefined || targetType.length === 0) {
84
+ throw new Error("Imported event requires event.message.typeUrl.");
85
+ }
86
+ if (![...this.#wantedByOrigin.values()].some((types) => types.has(targetType))) {
87
+ return;
88
+ }
89
+ const publisher = await this.#input.transportFactory.createPublisher(channel(targetType));
90
+ try {
91
+ const frame = wrapExternalEvent(event, this.#input.contextName);
92
+ await publisher.publish(frame.id, frame);
93
+ }
94
+ finally {
95
+ await this.#closeEphemeral(publisher);
96
+ }
97
+ }
98
+ async #openOnce() {
99
+ try {
100
+ const factory = this.#input.transportFactory;
101
+ const status = await this.#attach(factory, onlineType, (message) => this.#onOnline(message));
102
+ this.#resources.push(status);
103
+ const config = await this.#attach(factory, wantedType, (message) => this.#onWanted(message));
104
+ this.#resources.push(config);
105
+ for (const schema of this.#externalSchemas) {
106
+ const targetType = typeUrl(schema);
107
+ this.#resources.push(await this.#attach(factory, targetType, (message) => this.#onEvent(message)));
108
+ }
109
+ await this.#publishOnline();
110
+ await this.#publishWanted();
111
+ }
112
+ catch (error) {
113
+ const failures = await closeRetained(this.#resources);
114
+ this.#open = undefined;
115
+ if (failures.length)
116
+ throw new AggregateError([error, ...failures], "IntegrationBroker open failed.");
117
+ throw error;
118
+ }
119
+ }
120
+ async #attach(factory, targetType, consumer) {
121
+ const subscriber = await factory.createSubscriber(channel(targetType));
122
+ try {
123
+ const handle = await subscriber.addConsumer((message) => this.#acceptCallback(() => consumer(message)));
124
+ return new SubscriberResource(subscriber, handle);
125
+ }
126
+ catch (error) {
127
+ try {
128
+ await subscriber.close();
129
+ }
130
+ catch (closeError) {
131
+ throw new AggregateError([error, closeError], "Integration subscriber setup failed.");
132
+ }
133
+ throw error;
134
+ }
135
+ }
136
+ #acceptCallback(work) {
137
+ if (this.#closed)
138
+ return Promise.resolve();
139
+ const accepted = Promise.resolve().then(work);
140
+ this.#acceptedCallbacks.add(accepted);
141
+ void accepted.then(() => this.#acceptedCallbacks.delete(accepted), () => this.#acceptedCallbacks.delete(accepted));
142
+ return accepted;
143
+ }
144
+ async #onOnline(message) {
145
+ if (this.#closed)
146
+ return;
147
+ const online = unpackOnline(message);
148
+ if (online.context?.value !== message.boundedContextName?.value)
149
+ throw new Error("Malformed integration control message.");
150
+ if (!this.#accepts(online.context))
151
+ return;
152
+ await this.#publishWanted();
153
+ }
154
+ async #onWanted(message) {
155
+ if (this.#closed)
156
+ return;
157
+ if (!this.#accepts(message.boundedContextName))
158
+ return;
159
+ const wanted = unpackWanted(message);
160
+ const requested = new Set(wanted.type.map((entry) => entry.typeUrl).filter(Boolean));
161
+ const origin = message.boundedContextName.value;
162
+ await this.#enqueueTransition(async () => this.#replaceWanted(origin, requested));
163
+ }
164
+ async #onEvent(message) {
165
+ if (this.#closed)
166
+ return;
167
+ if (!this.#accepts(message.boundedContextName))
168
+ return;
169
+ let imported;
170
+ try {
171
+ const original = unpackExternalEvent(message);
172
+ const typeUrl = original.message?.typeUrl;
173
+ const schema = typeUrl === undefined
174
+ ? undefined
175
+ : (eventBusAccess.schema(this.#input.eventBus, typeUrl) ??
176
+ (typeUrl === TypeUrls.derive(StringValueSchema) ? StringValueSchema : undefined));
177
+ if (schema === undefined || original.message === undefined)
178
+ throw new Error("External event message type is not accepted.");
179
+ fromBinary(schema, original.message.value);
180
+ imported = toExternalEvent(original);
181
+ }
182
+ catch {
183
+ emitServerError(serverEnvironmentAccess.loggerFor(ServerEnvironment.instance()), "Dropped corrupt external event.", {
184
+ contextName: message.boundedContextName.value,
185
+ eventType: message.originalMessage?.typeUrl ?? "unknown",
186
+ operation: "external-event-intake",
187
+ reasonCode: "corrupt_external_event",
188
+ });
189
+ return;
190
+ }
191
+ await this.#input.postImported(imported);
192
+ }
193
+ async #replaceWanted(origin, next) {
194
+ const previous = this.#wantedByOrigin.get(origin) ?? new Set();
195
+ const add = [...next].flatMap((type) => {
196
+ const schema = eventBusAccess.schema(this.#input.eventBus, type);
197
+ if (previous.has(type) || this.#wantedElsewhere(type, origin) || schema === undefined)
198
+ return [];
199
+ return [[type, schema]];
200
+ });
201
+ const removals = [...this.#publishers].filter(([type]) => previous.has(type) && !next.has(type) && !this.#wantedElsewhere(type, origin));
202
+ const acquired = [];
203
+ try {
204
+ for (const [targetType, schema] of add) {
205
+ const publisher = await DomesticPublisher.create(this.#input.eventBus, this.#input.transportFactory, targetType, this.#input.contextName, schema);
206
+ acquired.push(publisher);
207
+ }
208
+ }
209
+ catch (error) {
210
+ const failures = await this.#rollbackAcquired(acquired);
211
+ if (failures.length)
212
+ throw new AggregateError([error, ...failures], "Integration publisher acquisition failed.");
213
+ throw error;
214
+ }
215
+ const errors = [];
216
+ for (const [, publisher] of removals) {
217
+ await collect(() => publisher.close(), errors);
218
+ }
219
+ if (errors.length) {
220
+ const failures = await this.#rollbackAcquired(acquired);
221
+ throw new AggregateError([...errors, ...failures], "Failed to remove domestic publisher.");
222
+ }
223
+ this.#wantedByOrigin.set(origin, new Set(next));
224
+ for (const [targetType] of removals)
225
+ this.#publishers.delete(targetType);
226
+ for (const publisher of acquired)
227
+ this.#publishers.set(publisher.targetType, publisher);
228
+ }
229
+ #wantedElsewhere(targetType, exceptOrigin) {
230
+ return [...this.#wantedByOrigin.entries()].some(([origin, types]) => origin !== exceptOrigin && types.has(targetType));
231
+ }
232
+ async #rollbackAcquired(acquired) {
233
+ const settled = await Promise.all(acquired.map(async (publisher) => {
234
+ try {
235
+ await publisher.rollback();
236
+ }
237
+ catch (reason) {
238
+ return { publisher, reason };
239
+ }
240
+ return undefined;
241
+ }));
242
+ const failures = [];
243
+ for (const failure of settled) {
244
+ if (failure === undefined)
245
+ continue;
246
+ this.#retainedCloseables.push(failure.publisher);
247
+ failures.push(failure.reason);
248
+ }
249
+ return failures;
250
+ }
251
+ #enqueueTransition(work) {
252
+ const accepted = this.#transition.then(work);
253
+ this.#transition = accepted.catch(() => undefined);
254
+ return accepted;
255
+ }
256
+ async #publishOnline() {
257
+ const publisher = await this.#input.transportFactory.createPublisher(channel(onlineType));
258
+ try {
259
+ const frame = wrapBoundedContextOnline(create(BoundedContextOnlineSchema, { context: this.#input.contextName }));
260
+ await publisher.publish(frame.id, frame);
261
+ }
262
+ finally {
263
+ await this.#closeEphemeral(publisher);
264
+ }
265
+ }
266
+ async #publishWanted() {
267
+ const types = this.#externalSchemas.map(typeUrl).sort();
268
+ const publisher = await this.#input.transportFactory.createPublisher(channel(wantedType));
269
+ try {
270
+ const frame = wrapExternalEventsWanted(create(ExternalEventsWantedSchema, { type: types.map((typeUrl) => ({ typeUrl })) }), this.#input.contextName);
271
+ await publisher.publish(frame.id, frame);
272
+ }
273
+ finally {
274
+ await this.#closeEphemeral(publisher);
275
+ }
276
+ }
277
+ #accepts(origin) {
278
+ const value = origin?.value;
279
+ return Boolean(value &&
280
+ value !== this.#input.contextName.value &&
281
+ value !== this.#input.pairedContextName?.value);
282
+ }
283
+ async #closeOnce() {
284
+ this.#closed = true;
285
+ const errors = [];
286
+ const opening = this.#open;
287
+ if (opening !== undefined)
288
+ await collect(() => opening, errors);
289
+ await Promise.allSettled([...this.#acceptedCallbacks]);
290
+ await this.#transition;
291
+ await collect(() => this.#publishEmptyWanted(), errors);
292
+ const publisherFailures = await closeRetained(this.#retainedCloseables);
293
+ errors.push(...publisherFailures);
294
+ for (const [type, publisher] of this.#publishers) {
295
+ const failures = [];
296
+ await collect(() => publisher.close(), failures);
297
+ if (failures.length === 0)
298
+ this.#publishers.delete(type);
299
+ else
300
+ errors.push(...failures);
301
+ }
302
+ errors.push(...(await closeRetained(this.#resources)));
303
+ if (errors.length) {
304
+ this.#close = undefined;
305
+ throw new AggregateError(errors, "IntegrationBroker close failed.");
306
+ }
307
+ }
308
+ async #publishEmptyWanted() {
309
+ if (this.#emptyWantedPublished)
310
+ return;
311
+ const publisher = await this.#input.transportFactory.createPublisher(channel(wantedType));
312
+ try {
313
+ const frame = wrapExternalEventsWanted(create(ExternalEventsWantedSchema), this.#input.contextName);
314
+ await publisher.publish(frame.id, frame);
315
+ this.#emptyWantedPublished = true;
316
+ }
317
+ finally {
318
+ await this.#closeEphemeral(publisher);
319
+ }
320
+ }
321
+ async #closeEphemeral(publisher) {
322
+ try {
323
+ await publisher.close();
324
+ }
325
+ catch (error) {
326
+ this.#retainedCloseables.push(publisher);
327
+ throw error;
328
+ }
329
+ }
330
+ }
331
+ class DomesticPublisher {
332
+ targetType;
333
+ #eventBus;
334
+ #dispatcher;
335
+ #publisher;
336
+ #detached = false;
337
+ constructor(eventBus, publisher, targetType, origin, schema) {
338
+ this.#eventBus = eventBus;
339
+ this.#publisher = publisher;
340
+ this.targetType = targetType;
341
+ this.#dispatcher = {
342
+ messageSchemas: () => [schema],
343
+ dispatch: async (event) => {
344
+ const frame = wrapExternalEvent(event, origin);
345
+ await publisher.publish(frame.id, frame);
346
+ },
347
+ };
348
+ }
349
+ static async create(eventBus, factory, targetType, origin, schema) {
350
+ const publisher = await factory.createPublisher(channel(targetType));
351
+ const domestic = new DomesticPublisher(eventBus, publisher, targetType, origin, schema);
352
+ eventBus.register(domestic.#dispatcher);
353
+ return domestic;
354
+ }
355
+ async close() {
356
+ await this.#publisher.close();
357
+ this.#detach();
358
+ }
359
+ async rollback() {
360
+ this.#detach();
361
+ await this.#publisher.close();
362
+ }
363
+ #detach() {
364
+ if (this.#detached)
365
+ return;
366
+ this.#detached = true;
367
+ eventBusAccess.unregister(this.#eventBus, this.#dispatcher);
368
+ }
369
+ }
370
+ class SubscriberResource {
371
+ subscriber;
372
+ handle;
373
+ constructor(subscriber, handle) {
374
+ this.subscriber = subscriber;
375
+ this.handle = handle;
376
+ }
377
+ async close() {
378
+ const errors = [];
379
+ await collect(() => this.handle.close(), errors);
380
+ await collect(() => this.subscriber.close(), errors);
381
+ if (errors.length)
382
+ throw new AggregateError(errors, "Integration subscriber close failed.");
383
+ }
384
+ }
385
+ async function closeRetained(resources) {
386
+ const settled = await Promise.allSettled(resources.map((resource) => resource.close()));
387
+ const retained = resources.filter((_, index) => settled[index]?.status === "rejected");
388
+ resources.splice(0, resources.length, ...retained);
389
+ const failures = [];
390
+ for (const result of settled)
391
+ if (result.status === "rejected")
392
+ failures.push(result.reason);
393
+ return failures;
394
+ }
395
+ async function collect(work, errors) {
396
+ try {
397
+ await work();
398
+ }
399
+ catch (error) {
400
+ errors.push(error);
401
+ }
402
+ }
403
+ function channel(targetType) {
404
+ return create(ChannelIdSchema, { targetType });
405
+ }
406
+ function typeUrl(schema) {
407
+ return TypeUrls.derive(schema);
408
+ }
409
+ function unpackOnline(message) {
410
+ const originalMessage = controlPayload(BoundedContextOnlineSchema, message);
411
+ try {
412
+ return fromBinary(BoundedContextOnlineSchema, originalMessage.value);
413
+ }
414
+ catch {
415
+ throw new Error("Malformed integration control message.");
416
+ }
417
+ }
418
+ function unpackWanted(message) {
419
+ try {
420
+ return fromBinary(ExternalEventsWantedSchema, controlPayload(ExternalEventsWantedSchema, message).value);
421
+ }
422
+ catch {
423
+ throw new Error("Malformed integration control message.");
424
+ }
425
+ }
426
+ function controlPayload(schema, message) {
427
+ const originalMessage = message.originalMessage;
428
+ if (!message.boundedContextName?.value ||
429
+ originalMessage?.typeUrl !== typeUrl(schema) ||
430
+ !isControlIdentity(message.id))
431
+ throw new Error("Malformed integration control message.");
432
+ return originalMessage;
433
+ }
434
+ function isControlIdentity(identity) {
435
+ if (identity?.typeUrl !== typeUrl(StringValueSchema))
436
+ return false;
437
+ try {
438
+ return /^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/iu.test(fromBinary(StringValueSchema, identity.value).value);
439
+ }
440
+ catch {
441
+ return false;
442
+ }
443
+ }
444
+ //# sourceMappingURL=integration-broker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"integration-broker.js","sourceRoot":"","sources":["../../src/integration/integration-broker.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,56 @@
1
+ import { type Message } from "@bufbuild/protobuf";
2
+ import { type ActorContext, type UserId } from "@spine-event-engine/proto";
3
+ /**
4
+ * Represents a hidden bounded context that imports third-party events through its private broker.
5
+ *
6
+ * The JVM-owned integration lifecycle remains private: this facade only creates the context,
7
+ * publishes generated events, observes availability, and closes it.
8
+ */
9
+ export declare class ThirdPartyContext {
10
+ #private;
11
+ private constructor();
12
+ /**
13
+ * Creates a third-party context that forbids actor tenants.
14
+ *
15
+ * @param name Identifies the hidden bounded context.
16
+ * @returns Resolves to an open single-tenant context.
17
+ */
18
+ static singleTenant(name: string): Promise<ThirdPartyContext>;
19
+ /**
20
+ * Creates a third-party context that requires actor tenants.
21
+ *
22
+ * @param name Identifies the hidden bounded context.
23
+ * @returns Resolves to an open multitenant context.
24
+ */
25
+ static multitenant(name: string): Promise<ThirdPartyContext>;
26
+ /**
27
+ * Publishes one generated event with its importing actor identity.
28
+ *
29
+ * @param event Supplies the generated event message to import unchanged.
30
+ * @param actor Supplies a user or actor context that satisfies this context's tenancy policy.
31
+ * @returns Completes when the private broker accepts the imported event, or rejects for a closed
32
+ * context, an unsupported message, or incompatible actor tenancy.
33
+ */
34
+ emittedEvent(event: Message, actor: ActorContext): Promise<void>;
35
+ /**
36
+ * Publishes one generated event with a user identity in a single-tenant context.
37
+ *
38
+ * @param event Supplies the generated event message to import unchanged.
39
+ * @param actor Supplies the importing user identity.
40
+ * @returns Completes when the private broker accepts the imported event.
41
+ */
42
+ emittedEvent(event: Message, actor: UserId): Promise<void>;
43
+ /**
44
+ * Returns whether the hidden bounded context remains available for imports.
45
+ *
46
+ * @returns `true` until a successful close; `false` after it closes.
47
+ */
48
+ isOpen(): boolean;
49
+ /**
50
+ * Closes the hidden bounded context and its private broker resources.
51
+ *
52
+ * @returns Completes after shutdown; repeated calls after a successful close do nothing.
53
+ */
54
+ close(): Promise<void>;
55
+ }
56
+ //# sourceMappingURL=third-party-context.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"third-party-context.d.ts","sourceRoot":"","sources":["../../src/integration/third-party-context.ts"],"names":[],"mappings":"AAcA,OAAO,EAAoB,KAAK,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAGpE,OAAO,EAOL,KAAK,YAAY,EACjB,KAAK,MAAM,EACZ,MAAM,2BAA2B,CAAC;AAKnC;;;;;GAKG;AACH,qBAAa,iBAAiB;;IAK5B,OAAO;IAKP;;;;;OAKG;WACU,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAInE;;;;;OAKG;WACU,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAQlE;;;;;;;OAOG;IACH,YAAY,CAAC,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC;IAEhE;;;;;;OAMG;IACH,YAAY,CAAC,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAmC1D;;;;OAIG;IACH,MAAM,IAAI,OAAO;IAIjB;;;;OAIG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAoC7B"}
@@ -0,0 +1,130 @@
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, toBinary } from "@bufbuild/protobuf";
15
+ import { TimestampSchema } from "@bufbuild/protobuf/wkt";
16
+ import { AnyMessages, TypeUrls } from "@spine-event-engine/core";
17
+ import { ActorContextSchema, BoundedContextNameSchema, EventContextSchema, EventIdSchema, EventSchema, UserIdSchema, } from "@spine-event-engine/proto";
18
+ import { BoundedContext, boundedContextIntegrationAccess } from "../context/bounded-context.js";
19
+ import { ServerEnvironment } from "../server/server-environment.js";
20
+ /**
21
+ * Represents a hidden bounded context that imports third-party events through its private broker.
22
+ *
23
+ * The JVM-owned integration lifecycle remains private: this facade only creates the context,
24
+ * publishes generated events, observes availability, and closes it.
25
+ */
26
+ export class ThirdPartyContext {
27
+ #context;
28
+ #multitenant;
29
+ #closed = false;
30
+ constructor(context, multitenant) {
31
+ this.#context = context;
32
+ this.#multitenant = multitenant;
33
+ }
34
+ /**
35
+ * Creates a third-party context that forbids actor tenants.
36
+ *
37
+ * @param name Identifies the hidden bounded context.
38
+ * @returns Resolves to an open single-tenant context.
39
+ */
40
+ static async singleTenant(name) {
41
+ return new ThirdPartyContext(await BoundedContext.singleTenant(name).buildAsync(), false);
42
+ }
43
+ /**
44
+ * Creates a third-party context that requires actor tenants.
45
+ *
46
+ * @param name Identifies the hidden bounded context.
47
+ * @returns Resolves to an open multitenant context.
48
+ */
49
+ static async multitenant(name) {
50
+ return new ThirdPartyContext(await BoundedContext.multitenant(name).buildAsync(), true);
51
+ }
52
+ /**
53
+ * Publishes one generated event with its importing actor identity.
54
+ *
55
+ * @param event Supplies the generated event message to import unchanged.
56
+ * @param actor Supplies a user or actor context that satisfies this context's tenancy policy.
57
+ * @returns Completes when the private broker accepts the imported event.
58
+ */
59
+ async emittedEvent(event, actor) {
60
+ if (this.#closed)
61
+ throw new Error("ThirdPartyContext is closed.");
62
+ const actorContext = this.#actorContext(actor);
63
+ const typeName = event.$typeName;
64
+ if (typeof typeName !== "string" || typeName.length === 0) {
65
+ throw new TypeError("ThirdPartyContext requires a generated event message.");
66
+ }
67
+ const envelope = create(EventSchema, {
68
+ id: create(EventIdSchema, { value: crypto.randomUUID() }),
69
+ message: {
70
+ typeUrl: this.#schema(typeName).typeUrl,
71
+ value: toBinary(this.#schema(typeName).schema, event),
72
+ },
73
+ context: create(EventContextSchema, {
74
+ timestamp: actorContext.timestamp ?? create(TimestampSchema),
75
+ origin: { case: "importContext", value: actorContext },
76
+ producerId: AnyMessages.pack(BoundedContextNameSchema, create(BoundedContextNameSchema, { value: this.#context.name.value })),
77
+ }),
78
+ });
79
+ await boundedContextIntegrationAccess.publishImported(this.#context, envelope);
80
+ }
81
+ /* eslint-enable @typescript-eslint/unified-signatures */
82
+ /**
83
+ * Returns whether the hidden bounded context remains available for imports.
84
+ *
85
+ * @returns `true` until a successful close; `false` after it closes.
86
+ */
87
+ isOpen() {
88
+ return !this.#closed;
89
+ }
90
+ /**
91
+ * Closes the hidden bounded context and its private broker resources.
92
+ *
93
+ * @returns Completes after shutdown; repeated calls after a successful close do nothing.
94
+ */
95
+ async close() {
96
+ if (this.#closed)
97
+ return;
98
+ await this.#context.close();
99
+ this.#closed = true;
100
+ }
101
+ #actorContext(actor) {
102
+ const isUser = actor.$typeName === UserIdSchema.typeName;
103
+ if (isUser) {
104
+ if (this.#multitenant)
105
+ throw new Error("Multitenant ThirdPartyContext requires ActorContext.");
106
+ const now = Date.now();
107
+ return create(ActorContextSchema, {
108
+ actor,
109
+ timestamp: create(TimestampSchema, {
110
+ seconds: BigInt(Math.floor(now / 1_000)),
111
+ nanos: (now % 1_000) * 1_000_000,
112
+ }),
113
+ });
114
+ }
115
+ const hasTenant = actor.tenantId?.kind.case !== undefined;
116
+ if (this.#multitenant !== hasTenant) {
117
+ throw new Error(this.#multitenant
118
+ ? "Multitenant ThirdPartyContext requires actor tenantId."
119
+ : "Single-tenant ThirdPartyContext forbids actor tenantId.");
120
+ }
121
+ return actor;
122
+ }
123
+ #schema(typeName) {
124
+ const metadata = ServerEnvironment.instance().typeRegistry.findByFullName(typeName);
125
+ if (metadata === undefined)
126
+ throw new TypeError(`ThirdPartyContext does not know ${typeName}.`);
127
+ return { schema: metadata.schema, typeUrl: TypeUrls.derive(metadata.schema) };
128
+ }
129
+ }
130
+ //# sourceMappingURL=third-party-context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"third-party-context.js","sourceRoot":"","sources":["../../src/integration/third-party-context.ts"],"names":[],"mappings":"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"}