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

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 (378) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +209 -0
  3. package/REFERENCE.md +760 -0
  4. package/dist/browser/browser-server.d.ts +95 -0
  5. package/dist/browser/browser-server.d.ts.map +1 -0
  6. package/dist/browser/browser-server.js +719 -0
  7. package/dist/browser/browser-server.js.map +1 -0
  8. package/dist/browser/durable-subscription-bindings.d.ts +122 -0
  9. package/dist/browser/durable-subscription-bindings.d.ts.map +1 -0
  10. package/dist/browser/durable-subscription-bindings.js +524 -0
  11. package/dist/browser/durable-subscription-bindings.js.map +1 -0
  12. package/dist/browser/index.d.ts +12 -0
  13. package/dist/browser/index.d.ts.map +1 -0
  14. package/dist/browser/index.js +24 -0
  15. package/dist/browser/index.js.map +1 -0
  16. package/dist/browser/options.d.ts +183 -0
  17. package/dist/browser/options.d.ts.map +1 -0
  18. package/dist/browser/options.js +15 -0
  19. package/dist/browser/options.js.map +1 -0
  20. package/dist/bus/command-bus.d.ts +63 -0
  21. package/dist/bus/command-bus.d.ts.map +1 -0
  22. package/dist/bus/command-bus.js +236 -0
  23. package/dist/bus/command-bus.js.map +1 -0
  24. package/dist/bus/command-dispatcher-registry.d.ts +33 -0
  25. package/dist/bus/command-dispatcher-registry.d.ts.map +1 -0
  26. package/dist/bus/command-dispatcher-registry.js +75 -0
  27. package/dist/bus/command-dispatcher-registry.js.map +1 -0
  28. package/dist/bus/command-dispatcher.d.ts +25 -0
  29. package/dist/bus/command-dispatcher.d.ts.map +1 -0
  30. package/dist/bus/command-dispatcher.js +15 -0
  31. package/dist/bus/command-dispatcher.js.map +1 -0
  32. package/dist/bus/command-errors.d.ts +23 -0
  33. package/dist/bus/command-errors.d.ts.map +1 -0
  34. package/dist/bus/command-errors.js +52 -0
  35. package/dist/bus/command-errors.js.map +1 -0
  36. package/dist/bus/event-bus.d.ts +113 -0
  37. package/dist/bus/event-bus.d.ts.map +1 -0
  38. package/dist/bus/event-bus.js +518 -0
  39. package/dist/bus/event-bus.js.map +1 -0
  40. package/dist/bus/event-dispatcher-origin-schemas.d.ts +17 -0
  41. package/dist/bus/event-dispatcher-origin-schemas.d.ts.map +1 -0
  42. package/dist/bus/event-dispatcher-origin-schemas.js +32 -0
  43. package/dist/bus/event-dispatcher-origin-schemas.js.map +1 -0
  44. package/dist/bus/event-dispatcher-registry.d.ts +48 -0
  45. package/dist/bus/event-dispatcher-registry.d.ts.map +1 -0
  46. package/dist/bus/event-dispatcher-registry.js +176 -0
  47. package/dist/bus/event-dispatcher-registry.js.map +1 -0
  48. package/dist/bus/event-dispatcher.d.ts +48 -0
  49. package/dist/bus/event-dispatcher.d.ts.map +1 -0
  50. package/dist/bus/event-dispatcher.js +15 -0
  51. package/dist/bus/event-dispatcher.js.map +1 -0
  52. package/dist/context/bounded-context.d.ts +592 -0
  53. package/dist/context/bounded-context.d.ts.map +1 -0
  54. package/dist/context/bounded-context.js +1897 -0
  55. package/dist/context/bounded-context.js.map +1 -0
  56. package/dist/context/entity-inbox.d.ts +63 -0
  57. package/dist/context/entity-inbox.d.ts.map +1 -0
  58. package/dist/context/entity-inbox.js +387 -0
  59. package/dist/context/entity-inbox.js.map +1 -0
  60. package/dist/context/local-inbox-handoff.d.ts +248 -0
  61. package/dist/context/local-inbox-handoff.d.ts.map +1 -0
  62. package/dist/context/local-inbox-handoff.js +340 -0
  63. package/dist/context/local-inbox-handoff.js.map +1 -0
  64. package/dist/context/projection-handoff.d.ts +46 -0
  65. package/dist/context/projection-handoff.d.ts.map +1 -0
  66. package/dist/context/projection-handoff.js +177 -0
  67. package/dist/context/projection-handoff.js.map +1 -0
  68. package/dist/context/tenant-index.d.ts +41 -0
  69. package/dist/context/tenant-index.d.ts.map +1 -0
  70. package/dist/context/tenant-index.js +93 -0
  71. package/dist/context/tenant-index.js.map +1 -0
  72. package/dist/delivery/conditional-pickup.d.ts +25 -0
  73. package/dist/delivery/conditional-pickup.d.ts.map +1 -0
  74. package/dist/delivery/conditional-pickup.js +26 -0
  75. package/dist/delivery/conditional-pickup.js.map +1 -0
  76. package/dist/delivery/delivery-builder.d.ts +216 -0
  77. package/dist/delivery/delivery-builder.d.ts.map +1 -0
  78. package/dist/delivery/delivery-builder.js +323 -0
  79. package/dist/delivery/delivery-builder.js.map +1 -0
  80. package/dist/delivery/delivery-lease.d.ts +15 -0
  81. package/dist/delivery/delivery-lease.d.ts.map +1 -0
  82. package/dist/delivery/delivery-lease.js +44 -0
  83. package/dist/delivery/delivery-lease.js.map +1 -0
  84. package/dist/delivery/delivery-loop.d.ts +113 -0
  85. package/dist/delivery/delivery-loop.d.ts.map +1 -0
  86. package/dist/delivery/delivery-loop.js +119 -0
  87. package/dist/delivery/delivery-loop.js.map +1 -0
  88. package/dist/delivery/delivery-monitor.d.ts +165 -0
  89. package/dist/delivery/delivery-monitor.d.ts.map +1 -0
  90. package/dist/delivery/delivery-monitor.js +168 -0
  91. package/dist/delivery/delivery-monitor.js.map +1 -0
  92. package/dist/delivery/delivery-ports.d.ts +151 -0
  93. package/dist/delivery/delivery-ports.d.ts.map +1 -0
  94. package/dist/delivery/delivery-ports.js +15 -0
  95. package/dist/delivery/delivery-ports.js.map +1 -0
  96. package/dist/delivery/delivery-run-control.d.ts +50 -0
  97. package/dist/delivery/delivery-run-control.d.ts.map +1 -0
  98. package/dist/delivery/delivery-run-control.js +66 -0
  99. package/dist/delivery/delivery-run-control.js.map +1 -0
  100. package/dist/delivery/delivery-run-coordinator.d.ts +218 -0
  101. package/dist/delivery/delivery-run-coordinator.d.ts.map +1 -0
  102. package/dist/delivery/delivery-run-coordinator.js +609 -0
  103. package/dist/delivery/delivery-run-coordinator.js.map +1 -0
  104. package/dist/delivery/delivery-storage-error.d.ts +13 -0
  105. package/dist/delivery/delivery-storage-error.d.ts.map +1 -0
  106. package/dist/delivery/delivery-storage-error.js +30 -0
  107. package/dist/delivery/delivery-storage-error.js.map +1 -0
  108. package/dist/delivery/delivery-supervisor.d.ts +175 -0
  109. package/dist/delivery/delivery-supervisor.d.ts.map +1 -0
  110. package/dist/delivery/delivery-supervisor.js +469 -0
  111. package/dist/delivery/delivery-supervisor.js.map +1 -0
  112. package/dist/delivery/delivery-worker.d.ts +180 -0
  113. package/dist/delivery/delivery-worker.d.ts.map +1 -0
  114. package/dist/delivery/delivery-worker.js +232 -0
  115. package/dist/delivery/delivery-worker.js.map +1 -0
  116. package/dist/delivery/delivery.d.ts +236 -0
  117. package/dist/delivery/delivery.d.ts.map +1 -0
  118. package/dist/delivery/delivery.js +539 -0
  119. package/dist/delivery/delivery.js.map +1 -0
  120. package/dist/delivery/inbox-records.d.ts +19 -0
  121. package/dist/delivery/inbox-records.d.ts.map +1 -0
  122. package/dist/delivery/inbox-records.js +291 -0
  123. package/dist/delivery/inbox-records.js.map +1 -0
  124. package/dist/delivery/inbox-storage.d.ts +83 -0
  125. package/dist/delivery/inbox-storage.d.ts.map +1 -0
  126. package/dist/delivery/inbox-storage.js +336 -0
  127. package/dist/delivery/inbox-storage.js.map +1 -0
  128. package/dist/delivery/inbox.d.ts +272 -0
  129. package/dist/delivery/inbox.d.ts.map +1 -0
  130. package/dist/delivery/inbox.js +183 -0
  131. package/dist/delivery/inbox.js.map +1 -0
  132. package/dist/delivery/parked-delivery-obligations.d.ts +182 -0
  133. package/dist/delivery/parked-delivery-obligations.d.ts.map +1 -0
  134. package/dist/delivery/parked-delivery-obligations.js +390 -0
  135. package/dist/delivery/parked-delivery-obligations.js.map +1 -0
  136. package/dist/delivery/shard-index.d.ts +41 -0
  137. package/dist/delivery/shard-index.d.ts.map +1 -0
  138. package/dist/delivery/shard-index.js +67 -0
  139. package/dist/delivery/shard-index.js.map +1 -0
  140. package/dist/delivery/sharded-work-registry.d.ts +114 -0
  141. package/dist/delivery/sharded-work-registry.d.ts.map +1 -0
  142. package/dist/delivery/sharded-work-registry.js +361 -0
  143. package/dist/delivery/sharded-work-registry.js.map +1 -0
  144. package/dist/entity/entity-metadata.d.ts +173 -0
  145. package/dist/entity/entity-metadata.d.ts.map +1 -0
  146. package/dist/entity/entity-metadata.js +187 -0
  147. package/dist/entity/entity-metadata.js.map +1 -0
  148. package/dist/entity/entity-storage-descriptor.d.ts +64 -0
  149. package/dist/entity/entity-storage-descriptor.d.ts.map +1 -0
  150. package/dist/entity/entity-storage-descriptor.js +227 -0
  151. package/dist/entity/entity-storage-descriptor.js.map +1 -0
  152. package/dist/entity/entity-transaction.d.ts +372 -0
  153. package/dist/entity/entity-transaction.d.ts.map +1 -0
  154. package/dist/entity/entity-transaction.js +413 -0
  155. package/dist/entity/entity-transaction.js.map +1 -0
  156. package/dist/entity/entity-transition-validation.d.ts +47 -0
  157. package/dist/entity/entity-transition-validation.d.ts.map +1 -0
  158. package/dist/entity/entity-transition-validation.js +327 -0
  159. package/dist/entity/entity-transition-validation.js.map +1 -0
  160. package/dist/entity/entity.d.ts +605 -0
  161. package/dist/entity/entity.d.ts.map +1 -0
  162. package/dist/entity/entity.js +981 -0
  163. package/dist/entity/entity.js.map +1 -0
  164. package/dist/entity/implicit-required-id.d.ts +15 -0
  165. package/dist/entity/implicit-required-id.d.ts.map +1 -0
  166. package/dist/entity/implicit-required-id.js +123 -0
  167. package/dist/entity/implicit-required-id.js.map +1 -0
  168. package/dist/entity/spec-scanner.d.ts +14 -0
  169. package/dist/entity/spec-scanner.d.ts.map +1 -0
  170. package/dist/entity/spec-scanner.js +37 -0
  171. package/dist/entity/spec-scanner.js.map +1 -0
  172. package/dist/handler/command-registration-readiness.d.ts +99 -0
  173. package/dist/handler/command-registration-readiness.d.ts.map +1 -0
  174. package/dist/handler/command-registration-readiness.js +120 -0
  175. package/dist/handler/command-registration-readiness.js.map +1 -0
  176. package/dist/handler/declared-rejections.d.ts +11 -0
  177. package/dist/handler/declared-rejections.d.ts.map +1 -0
  178. package/dist/handler/declared-rejections.js +34 -0
  179. package/dist/handler/declared-rejections.js.map +1 -0
  180. package/dist/handler/event-handler-filter.d.ts +43 -0
  181. package/dist/handler/event-handler-filter.d.ts.map +1 -0
  182. package/dist/handler/event-handler-filter.js +128 -0
  183. package/dist/handler/event-handler-filter.js.map +1 -0
  184. package/dist/handler/event-registration-readiness.d.ts +196 -0
  185. package/dist/handler/event-registration-readiness.d.ts.map +1 -0
  186. package/dist/handler/event-registration-readiness.js +187 -0
  187. package/dist/handler/event-registration-readiness.js.map +1 -0
  188. package/dist/handler/external.d.ts +10 -0
  189. package/dist/handler/external.d.ts.map +1 -0
  190. package/dist/handler/external.js +15 -0
  191. package/dist/handler/external.js.map +1 -0
  192. package/dist/handler/generated-handler-registry.d.ts +185 -0
  193. package/dist/handler/generated-handler-registry.d.ts.map +1 -0
  194. package/dist/handler/generated-handler-registry.js +439 -0
  195. package/dist/handler/generated-handler-registry.js.map +1 -0
  196. package/dist/handler/generated-registry-discovery.d.ts +94 -0
  197. package/dist/handler/generated-registry-discovery.d.ts.map +1 -0
  198. package/dist/handler/generated-registry-discovery.js +226 -0
  199. package/dist/handler/generated-registry-discovery.js.map +1 -0
  200. package/dist/handler/handler-decorators.d.ts +151 -0
  201. package/dist/handler/handler-decorators.d.ts.map +1 -0
  202. package/dist/handler/handler-decorators.js +275 -0
  203. package/dist/handler/handler-decorators.js.map +1 -0
  204. package/dist/handler/handler-metadata.d.ts +553 -0
  205. package/dist/handler/handler-metadata.d.ts.map +1 -0
  206. package/dist/handler/handler-metadata.js +437 -0
  207. package/dist/handler/handler-metadata.js.map +1 -0
  208. package/dist/handler/registration-readiness-metadata.d.ts +68 -0
  209. package/dist/handler/registration-readiness-metadata.d.ts.map +1 -0
  210. package/dist/handler/registration-readiness-metadata.js +171 -0
  211. package/dist/handler/registration-readiness-metadata.js.map +1 -0
  212. package/dist/handler/rejection-source.d.ts +11 -0
  213. package/dist/handler/rejection-source.d.ts.map +1 -0
  214. package/dist/handler/rejection-source.js +25 -0
  215. package/dist/handler/rejection-source.js.map +1 -0
  216. package/dist/handler/standalone.d.ts +25 -0
  217. package/dist/handler/standalone.d.ts.map +1 -0
  218. package/dist/handler/standalone.js +38 -0
  219. package/dist/handler/standalone.js.map +1 -0
  220. package/dist/index.d.ts +46 -0
  221. package/dist/index.d.ts.map +1 -0
  222. package/dist/index.js +54 -0
  223. package/dist/index.js.map +1 -0
  224. package/dist/integration/external-messages.d.ts +49 -0
  225. package/dist/integration/external-messages.d.ts.map +1 -0
  226. package/dist/integration/external-messages.js +112 -0
  227. package/dist/integration/external-messages.js.map +1 -0
  228. package/dist/integration/integration-broker.d.ts +74 -0
  229. package/dist/integration/integration-broker.d.ts.map +1 -0
  230. package/dist/integration/integration-broker.js +444 -0
  231. package/dist/integration/integration-broker.js.map +1 -0
  232. package/dist/integration/third-party-context.d.ts +56 -0
  233. package/dist/integration/third-party-context.d.ts.map +1 -0
  234. package/dist/integration/third-party-context.js +130 -0
  235. package/dist/integration/third-party-context.js.map +1 -0
  236. package/dist/repository/command-errors.d.ts +25 -0
  237. package/dist/repository/command-errors.d.ts.map +1 -0
  238. package/dist/repository/command-errors.js +43 -0
  239. package/dist/repository/command-errors.js.map +1 -0
  240. package/dist/repository/command-routing.d.ts +72 -0
  241. package/dist/repository/command-routing.d.ts.map +1 -0
  242. package/dist/repository/command-routing.js +98 -0
  243. package/dist/repository/command-routing.js.map +1 -0
  244. package/dist/repository/commit-fence.d.ts +22 -0
  245. package/dist/repository/commit-fence.d.ts.map +1 -0
  246. package/dist/repository/commit-fence.js +37 -0
  247. package/dist/repository/commit-fence.js.map +1 -0
  248. package/dist/repository/event-routing.d.ts +71 -0
  249. package/dist/repository/event-routing.d.ts.map +1 -0
  250. package/dist/repository/event-routing.js +96 -0
  251. package/dist/repository/event-routing.js.map +1 -0
  252. package/dist/repository/primitive-id.d.ts +75 -0
  253. package/dist/repository/primitive-id.d.ts.map +1 -0
  254. package/dist/repository/primitive-id.js +85 -0
  255. package/dist/repository/primitive-id.js.map +1 -0
  256. package/dist/repository/repository.d.ts +667 -0
  257. package/dist/repository/repository.d.ts.map +1 -0
  258. package/dist/repository/repository.js +3510 -0
  259. package/dist/repository/repository.js.map +1 -0
  260. package/dist/repository/routing-declarations.d.ts +75 -0
  261. package/dist/repository/routing-declarations.d.ts.map +1 -0
  262. package/dist/repository/routing-declarations.js +101 -0
  263. package/dist/repository/routing-declarations.js.map +1 -0
  264. package/dist/repository/state-update-routing.d.ts +66 -0
  265. package/dist/repository/state-update-routing.d.ts.map +1 -0
  266. package/dist/repository/state-update-routing.js +91 -0
  267. package/dist/repository/state-update-routing.js.map +1 -0
  268. package/dist/runtime/runtime.d.ts +156 -0
  269. package/dist/runtime/runtime.d.ts.map +1 -0
  270. package/dist/runtime/runtime.js +215 -0
  271. package/dist/runtime/runtime.js.map +1 -0
  272. package/dist/runtime/signal-intake.d.ts +84 -0
  273. package/dist/runtime/signal-intake.d.ts.map +1 -0
  274. package/dist/runtime/signal-intake.js +94 -0
  275. package/dist/runtime/signal-intake.js.map +1 -0
  276. package/dist/runtime/signal-metadata.d.ts +217 -0
  277. package/dist/runtime/signal-metadata.d.ts.map +1 -0
  278. package/dist/runtime/signal-metadata.js +333 -0
  279. package/dist/runtime/signal-metadata.js.map +1 -0
  280. package/dist/runtime/signal-publisher.d.ts +144 -0
  281. package/dist/runtime/signal-publisher.d.ts.map +1 -0
  282. package/dist/runtime/signal-publisher.js +248 -0
  283. package/dist/runtime/signal-publisher.js.map +1 -0
  284. package/dist/runtime/standalone-handler-runtime.d.ts +114 -0
  285. package/dist/runtime/standalone-handler-runtime.d.ts.map +1 -0
  286. package/dist/runtime/standalone-handler-runtime.js +307 -0
  287. package/dist/runtime/standalone-handler-runtime.js.map +1 -0
  288. package/dist/server/environment-attachment.d.ts +356 -0
  289. package/dist/server/environment-attachment.d.ts.map +1 -0
  290. package/dist/server/environment-attachment.js +2062 -0
  291. package/dist/server/environment-attachment.js.map +1 -0
  292. package/dist/server/environment-delivery-records.d.ts +77 -0
  293. package/dist/server/environment-delivery-records.d.ts.map +1 -0
  294. package/dist/server/environment-delivery-records.js +282 -0
  295. package/dist/server/environment-delivery-records.js.map +1 -0
  296. package/dist/server/environment-delivery-worker.d.ts +161 -0
  297. package/dist/server/environment-delivery-worker.d.ts.map +1 -0
  298. package/dist/server/environment-delivery-worker.js +673 -0
  299. package/dist/server/environment-delivery-worker.js.map +1 -0
  300. package/dist/server/environment.d.ts +43 -0
  301. package/dist/server/environment.d.ts.map +1 -0
  302. package/dist/server/environment.js +90 -0
  303. package/dist/server/environment.js.map +1 -0
  304. package/dist/server/managed-child-subscription.d.ts +11 -0
  305. package/dist/server/managed-child-subscription.d.ts.map +1 -0
  306. package/dist/server/managed-child-subscription.js +44 -0
  307. package/dist/server/managed-child-subscription.js.map +1 -0
  308. package/dist/server/managed-server-application.d.ts +327 -0
  309. package/dist/server/managed-server-application.d.ts.map +1 -0
  310. package/dist/server/managed-server-application.js +937 -0
  311. package/dist/server/managed-server-application.js.map +1 -0
  312. package/dist/server/node-coordinator.d.ts +191 -0
  313. package/dist/server/node-coordinator.d.ts.map +1 -0
  314. package/dist/server/node-coordinator.js +552 -0
  315. package/dist/server/node-coordinator.js.map +1 -0
  316. package/dist/server/process-server-coordinator.d.ts +15 -0
  317. package/dist/server/process-server-coordinator.d.ts.map +1 -0
  318. package/dist/server/process-server-coordinator.js +112 -0
  319. package/dist/server/process-server-coordinator.js.map +1 -0
  320. package/dist/server/reserved-spine-rpc-paths.json +8 -0
  321. package/dist/server/retryable-close.d.ts +28 -0
  322. package/dist/server/retryable-close.d.ts.map +1 -0
  323. package/dist/server/retryable-close.js +129 -0
  324. package/dist/server/retryable-close.js.map +1 -0
  325. package/dist/server/server-environment.d.ts +180 -0
  326. package/dist/server/server-environment.d.ts.map +1 -0
  327. package/dist/server/server-environment.js +418 -0
  328. package/dist/server/server-environment.js.map +1 -0
  329. package/dist/server/server-log.d.ts +18 -0
  330. package/dist/server/server-log.d.ts.map +1 -0
  331. package/dist/server/server-log.js +100 -0
  332. package/dist/server/server-log.js.map +1 -0
  333. package/dist/server/server.d.ts +221 -0
  334. package/dist/server/server.d.ts.map +1 -0
  335. package/dist/server/server.js +704 -0
  336. package/dist/server/server.js.map +1 -0
  337. package/dist/services/query-reader.d.ts +19 -0
  338. package/dist/services/query-reader.d.ts.map +1 -0
  339. package/dist/services/query-reader.js +43 -0
  340. package/dist/services/query-reader.js.map +1 -0
  341. package/dist/services/spine-services.d.ts +88 -0
  342. package/dist/services/spine-services.d.ts.map +1 -0
  343. package/dist/services/spine-services.js +1582 -0
  344. package/dist/services/spine-services.js.map +1 -0
  345. package/dist/spi/delivery.d.ts +5 -0
  346. package/dist/spi/delivery.d.ts.map +1 -0
  347. package/dist/spi/delivery.js +18 -0
  348. package/dist/spi/delivery.js.map +1 -0
  349. package/dist/spi/handler-registry.d.ts +8 -0
  350. package/dist/spi/handler-registry.d.ts.map +1 -0
  351. package/dist/spi/handler-registry.js +15 -0
  352. package/dist/spi/handler-registry.js.map +1 -0
  353. package/dist/stand/stand.d.ts +294 -0
  354. package/dist/stand/stand.d.ts.map +1 -0
  355. package/dist/stand/stand.js +681 -0
  356. package/dist/stand/stand.js.map +1 -0
  357. package/dist/stand/subscription-observer.d.ts +53 -0
  358. package/dist/stand/subscription-observer.d.ts.map +1 -0
  359. package/dist/stand/subscription-observer.js +444 -0
  360. package/dist/stand/subscription-observer.js.map +1 -0
  361. package/dist/stand/subscription-records.d.ts +12 -0
  362. package/dist/stand/subscription-records.d.ts.map +1 -0
  363. package/dist/stand/subscription-records.js +99 -0
  364. package/dist/stand/subscription-records.js.map +1 -0
  365. package/dist/stand/subscription-registry.d.ts +285 -0
  366. package/dist/stand/subscription-registry.d.ts.map +1 -0
  367. package/dist/stand/subscription-registry.js +403 -0
  368. package/dist/stand/subscription-registry.js.map +1 -0
  369. package/dist/stand/subscription-runtime.d.ts +102 -0
  370. package/dist/stand/subscription-runtime.d.ts.map +1 -0
  371. package/dist/stand/subscription-runtime.js +380 -0
  372. package/dist/stand/subscription-runtime.js.map +1 -0
  373. package/dist/testing/index.d.ts +36 -0
  374. package/dist/testing/index.d.ts.map +1 -0
  375. package/dist/testing/index.js +54 -0
  376. package/dist/testing/index.js.map +1 -0
  377. package/dist/tsconfig.tsbuildinfo +1 -0
  378. package/package.json +76 -0
@@ -0,0 +1,681 @@
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
+ var _a;
15
+ import { clone, create } from "@bufbuild/protobuf";
16
+ import { TypeUrls } from "@spine-event-engine/core";
17
+ import { TenantIdSchema, VersionSchema, } from "@spine-event-engine/proto";
18
+ import { ColumnTypes, RecordColumn, RecordMask, RecordQuery, } from "@spine-event-engine/storage";
19
+ import { TenantBoundary } from "@spine-event-engine/storage/provider";
20
+ import { EntityRecords, standEntityStorageDescriptor, } from "../entity/entity-storage-descriptor.js";
21
+ import { SubscriptionObservers } from "./subscription-observer.js";
22
+ const HANDLE_CLOSE_ERROR_LIMIT = 16;
23
+ /**
24
+ * Error thrown when direct Stand access targets an unregistered state type.
25
+ */
26
+ export class StandStateTypeError extends Error {
27
+ // prettier-ignore
28
+ /**
29
+ * Rejected state type URL.
30
+ */
31
+ typeUrl;
32
+ /**
33
+ * Stand operation that required a known state type.
34
+ */
35
+ operation;
36
+ /**
37
+ * Creates an error for an operation targeting an unknown state type.
38
+ *
39
+ * @param typeUrl The rejected state type URL.
40
+ * @param operation The operation requiring a registered state type.
41
+ */
42
+ constructor(typeUrl, operation) {
43
+ super(`Stand cannot ${operation} unknown entity state type "${typeUrl}".`);
44
+ this.name = "StandStateTypeError";
45
+ this.typeUrl = typeUrl;
46
+ this.operation = operation;
47
+ Object.setPrototypeOf(this, new.target.prototype);
48
+ }
49
+ }
50
+ /**
51
+ * Direct read-side access point for storage-backed entity states and updates.
52
+ *
53
+ * Entity states are queried through the shared durable current-record seam.
54
+ */
55
+ export class Stand {
56
+ #context;
57
+ #storageFactory;
58
+ #registrations = new Map();
59
+ #entityHandles = new Map();
60
+ #handleCloseErrors = [];
61
+ #omittedHandleCloseErrors = 0;
62
+ #inFlight = new Set();
63
+ #closing = false;
64
+ #closed = false;
65
+ #closedPromise;
66
+ /**
67
+ * Creates a direct read-side Stand.
68
+ *
69
+ * @param options The storage context and factory used for state records.
70
+ */
71
+ constructor(options) {
72
+ this.#context = _a.#cloneContext(options.context);
73
+ this.#storageFactory = options.storageFactory;
74
+ deferredUpdates.set(this, (schema, state, updateOptions) => this.#deferUpdate(schema, state, updateOptions));
75
+ currentReads.set(this, (schema, id, readOptions) => this.#readCurrent(schema, id, readOptions));
76
+ }
77
+ /**
78
+ * Registers one entity state schema. Re-registering the same schema is idempotent.
79
+ *
80
+ * @param schema The entity state schema to register.
81
+ * @param options The materialized columns for the state type.
82
+ */
83
+ register(schema, options = {}) {
84
+ this.#requireOpen();
85
+ const typeUrl = TypeUrls.derive(schema);
86
+ if (this.#registrations.has(typeUrl)) {
87
+ return;
88
+ }
89
+ const idField = schema.fields[0]?.localName;
90
+ if (idField === undefined || idField.trim().length === 0) {
91
+ throw new Error(`Stand state "${schema.typeName}" requires an entity ID field.`);
92
+ }
93
+ this.#registrations.set(typeUrl, Object.freeze({
94
+ schema,
95
+ typeUrl,
96
+ idField,
97
+ columns: options.columns ??
98
+ schema.fields.map((field) => new RecordColumn(field.localName, ColumnTypes.fromField(field), (state) => state[field.localName])),
99
+ subscribers: new Set(),
100
+ }));
101
+ }
102
+ /**
103
+ * Returns known state type URLs in registration order.
104
+ *
105
+ * @returns The registered state type URLs.
106
+ */
107
+ stateTypes() {
108
+ this.#requireOpen();
109
+ return Object.freeze([...this.#registrations.keys()]);
110
+ }
111
+ /**
112
+ * Finds state-observer metadata for one type URL.
113
+ *
114
+ * @param typeUrl Identifies the candidate entity state type.
115
+ * @returns Returns observer metadata when the state is registered.
116
+ * @internal
117
+ */
118
+ observedState(typeUrl) {
119
+ const registration = this.#registrations.get(typeUrl);
120
+ return registration === undefined
121
+ ? undefined
122
+ : Object.freeze({ schema: registration.schema, idField: registration.idField });
123
+ }
124
+ /**
125
+ * Reads the latest state for one entity ID.
126
+ *
127
+ * @param schema The registered entity state schema.
128
+ * @param id The entity ID to read.
129
+ * @param options The tenant slice to read.
130
+ * @returns The latest state, or undefined when no live record exists.
131
+ */
132
+ async read(schema, id, options = {}) {
133
+ const result = await this.readVersioned(schema, id, options);
134
+ return result?.state;
135
+ }
136
+ /**
137
+ * Reads the latest state and its supplied version metadata for one entity ID.
138
+ *
139
+ * @param schema The registered entity state schema.
140
+ * @param id The entity ID to read.
141
+ * @param options The tenant slice to read.
142
+ * @returns The current state and version, or undefined when no live record exists.
143
+ */
144
+ async readVersioned(schema, id, options = {}) {
145
+ const finish = this.#beginOperation();
146
+ try {
147
+ const registration = this.#registration(schema, "read");
148
+ const tenantId = this.#tenantId(options.tenantId);
149
+ const storage = this.#leaseCurrent(registration, tenantId);
150
+ try {
151
+ const stored = await storage.current.read(id);
152
+ if (stored === undefined || EntityRecords.unpack(registration.schema, stored).deleted) {
153
+ return undefined;
154
+ }
155
+ return this.#currentResult(registration, stored);
156
+ }
157
+ finally {
158
+ storage.release();
159
+ }
160
+ }
161
+ finally {
162
+ finish();
163
+ }
164
+ }
165
+ /**
166
+ * Reads all latest states and version metadata in storage query order.
167
+ *
168
+ * @param schema The registered entity state schema.
169
+ * @param options The tenant slice to read.
170
+ * @returns The current states and versions in query order.
171
+ */
172
+ async readAllVersioned(schema, options = {}) {
173
+ return this.queryVersioned(schema, {}, options);
174
+ }
175
+ /**
176
+ * Finds latest states and version metadata in storage query order.
177
+ *
178
+ * @param schema The registered entity state schema.
179
+ * @param query The legacy record query to apply.
180
+ * @param options The tenant slice to read.
181
+ * @returns The matching current states and versions.
182
+ */
183
+ async queryVersioned(schema, query = {}, options = {}) {
184
+ const finish = this.#beginOperation();
185
+ try {
186
+ const registration = this.#registration(schema, "read");
187
+ const tenantId = this.#tenantId(options.tenantId);
188
+ const storage = this.#leaseCurrent(registration, tenantId);
189
+ try {
190
+ const stored = await storage.current.query(_a.#legacyPlan(query));
191
+ const results = stored.map((entry) => this.#entryResult(registration, entry.record, query.mask));
192
+ return results.filter((result) => result !== undefined);
193
+ }
194
+ finally {
195
+ storage.release();
196
+ }
197
+ }
198
+ finally {
199
+ finish();
200
+ }
201
+ }
202
+ /**
203
+ * Finds latest states through a normalized plan and retains versions.
204
+ *
205
+ * @param schema The registered entity state schema.
206
+ * @param plan The normalized storage query plan to apply.
207
+ * @param options The tenant slice to read.
208
+ * @returns The matching current states and versions.
209
+ */
210
+ async queryPlanVersioned(schema, plan, options = {}) {
211
+ const finish = this.#beginOperation();
212
+ try {
213
+ const registration = this.#registration(schema, "read");
214
+ const tenantId = this.#tenantId(options.tenantId);
215
+ const storage = this.#leaseCurrent(registration, tenantId);
216
+ try {
217
+ const stored = await storage.current.query(plan);
218
+ const results = stored.map((entry) => this.#entryResult(registration, entry.record, plan.mask?.paths));
219
+ return results.filter((result) => result !== undefined);
220
+ }
221
+ finally {
222
+ storage.release();
223
+ }
224
+ }
225
+ finally {
226
+ finish();
227
+ }
228
+ }
229
+ /**
230
+ * Clears all stored states and durable version metadata for one known state schema.
231
+ *
232
+ * The legacy-named local `BoundedContext.catchUpReadSide()` reset/replay
233
+ * helper uses this to reset one Projection state type for the selected tenant
234
+ * slice.
235
+ *
236
+ * @param schema The registered entity state schema to clear.
237
+ * @param options The tenant slice to clear.
238
+ * @returns The number of state records marked deleted.
239
+ */
240
+ async clear(schema, options = {}) {
241
+ const finish = this.#beginOperation();
242
+ try {
243
+ const registration = this.#registration(schema, "clear");
244
+ const tenantId = this.#tenantId(options.tenantId);
245
+ const storage = this.#leaseCurrent(registration, tenantId);
246
+ try {
247
+ const entries = await storage.current.query({
248
+ candidateLimit: 10_000,
249
+ });
250
+ const ids = entries.map((entry) => entry.id);
251
+ for (const id of ids) {
252
+ const stored = await storage.current.read(id);
253
+ if (stored !== undefined) {
254
+ const value = EntityRecords.unpack(registration.schema, stored);
255
+ await storage.current.write(EntityRecords.pack(registration.schema, id, value.state, value.versionMessage, {
256
+ archived: value.archived,
257
+ deleted: true,
258
+ }));
259
+ }
260
+ }
261
+ return ids.length;
262
+ }
263
+ finally {
264
+ storage.release();
265
+ }
266
+ }
267
+ finally {
268
+ finish();
269
+ }
270
+ }
271
+ /**
272
+ * Records one latest entity state and delivers an update to matching subscribers.
273
+ *
274
+ * @param schema The registered entity state schema.
275
+ * @param state The latest entity state to store.
276
+ * @param options The tenant, version, and lifecycle metadata to store.
277
+ * @returns A promise that resolves after the state update is stored.
278
+ */
279
+ async update(schema, state, options = {}) {
280
+ const prepared = await this.#prepareUpdate(schema, state, options);
281
+ try {
282
+ await prepared.write();
283
+ prepared.notify();
284
+ }
285
+ catch (error) {
286
+ prepared.cancel();
287
+ throw error;
288
+ }
289
+ }
290
+ async #deferUpdate(schema, state, options) {
291
+ return await this.#prepareUpdate(schema, state, options);
292
+ }
293
+ async #prepareUpdate(schema, state, options) {
294
+ const finish = this.#beginOperation();
295
+ let storage;
296
+ try {
297
+ const registration = this.#registration(schema, "update");
298
+ const tenantId = this.#tenantId(options.tenantId);
299
+ const stateCopy = clone(schema, state);
300
+ const id = _a.#readStateId(stateCopy, registration);
301
+ storage = this.#leaseCurrent(registration, tenantId);
302
+ const currentStorage = storage;
303
+ const previous = this.#hasTenantSubscribers(registration, tenantId)
304
+ ? await currentStorage.current.read(id)
305
+ : undefined;
306
+ const previousState = previous === undefined
307
+ ? undefined
308
+ : EntityRecords.unpack(registration.schema, previous).state;
309
+ const subscribers = [...this.#tenantSubscribers(registration, this.#tenantKey(tenantId))];
310
+ const record = EntityRecords.pack(registration.schema, id, stateCopy, options.version ?? 0n, options.lifecycle ?? { archived: false, deleted: false });
311
+ let settled = false;
312
+ const settle = () => {
313
+ if (!settled) {
314
+ settled = true;
315
+ currentStorage.release();
316
+ finish();
317
+ }
318
+ };
319
+ return Object.freeze({
320
+ cancel: settle,
321
+ write: () => currentStorage.current.write(record),
322
+ notify: () => {
323
+ try {
324
+ this.#notify(registration, {
325
+ id,
326
+ previousState,
327
+ state: stateCopy,
328
+ tenantId,
329
+ version: options.version,
330
+ }, subscribers);
331
+ }
332
+ finally {
333
+ settle();
334
+ }
335
+ },
336
+ });
337
+ }
338
+ catch (error) {
339
+ storage?.release();
340
+ finish();
341
+ throw error;
342
+ }
343
+ }
344
+ /**
345
+ * Repository-only full current-record read, including lifecycle metadata.
346
+ */
347
+ async #readCurrent(schema, id, options) {
348
+ const finish = this.#beginOperation();
349
+ try {
350
+ const registration = this.#registration(schema, "read");
351
+ const tenantId = this.#tenantId(options.tenantId);
352
+ const storage = this.#leaseCurrent(registration, tenantId);
353
+ try {
354
+ const stored = await storage.current.read(id);
355
+ if (stored === undefined)
356
+ return undefined;
357
+ const value = EntityRecords.unpack(registration.schema, stored);
358
+ return Object.freeze({
359
+ state: clone(schema, value.state),
360
+ versionMessage: clone(VersionSchema, value.versionMessage),
361
+ version: value.version,
362
+ archived: value.archived,
363
+ deleted: value.deleted,
364
+ });
365
+ }
366
+ finally {
367
+ storage.release();
368
+ }
369
+ }
370
+ finally {
371
+ finish();
372
+ }
373
+ }
374
+ /**
375
+ * Subscribes to in-process updates for one registered state schema.
376
+ *
377
+ * @param schema The registered entity state schema.
378
+ * @param callback The function receiving matching state updates.
379
+ * @param options The tenant slice to subscribe to.
380
+ * @returns A handle that stops future callback delivery.
381
+ */
382
+ subscribe(schema, callback, options = {}) {
383
+ this.#requireOpen();
384
+ const registration = this.#registration(schema, "subscribe");
385
+ const tenantKey = this.#tenantKey(options.tenantId);
386
+ const subscriber = Object.freeze({ tenantKey, callback });
387
+ let closed = false;
388
+ registration.subscribers.add(subscriber);
389
+ return Object.freeze({
390
+ get closed() {
391
+ return closed;
392
+ },
393
+ unsubscribe() {
394
+ if (!closed) {
395
+ closed = true;
396
+ registration.subscribers.delete(subscriber);
397
+ }
398
+ },
399
+ });
400
+ }
401
+ /**
402
+ * Closes direct subscriptions and rejects later Stand operations.
403
+ *
404
+ * Close is idempotent. New operations are rejected once close begins, and the
405
+ * close promise waits for already accepted direct reads/updates to finish
406
+ * before clearing subscriptions and version metadata.
407
+ *
408
+ * @returns A promise that settles after the stand closes.
409
+ *
410
+ */
411
+ close() {
412
+ this.#closedPromise ??= this.#closeOnce();
413
+ return this.#closedPromise;
414
+ }
415
+ async #closeOnce() {
416
+ this.#closing = true;
417
+ await Promise.all([...this.#inFlight]);
418
+ for (const registration of this.#registrations.values()) {
419
+ registration.subscribers.clear();
420
+ }
421
+ const errors = this.#handleCloseErrors.splice(0);
422
+ let omittedErrors = this.#omittedHandleCloseErrors;
423
+ this.#omittedHandleCloseErrors = 0;
424
+ for (const handle of this.#entityHandles.values()) {
425
+ try {
426
+ handle.close();
427
+ }
428
+ catch (error) {
429
+ if (errors.length < HANDLE_CLOSE_ERROR_LIMIT)
430
+ errors.push(error);
431
+ else
432
+ omittedErrors++;
433
+ }
434
+ }
435
+ this.#entityHandles.clear();
436
+ this.#closed = true;
437
+ if (omittedErrors > 0) {
438
+ errors.push(new Error(`${String(omittedErrors)} additional entity handle close failures.`));
439
+ }
440
+ if (errors.length > 0)
441
+ throw new AggregateError(errors, "Stand close failed.");
442
+ }
443
+ #registration(schema, operation) {
444
+ this.#requireOpen();
445
+ const typeUrl = TypeUrls.derive(schema);
446
+ const registration = this.#registrations.get(typeUrl);
447
+ if (registration === undefined) {
448
+ throw new StandStateTypeError(typeUrl, operation);
449
+ }
450
+ return registration;
451
+ }
452
+ #leaseCurrent(registration, tenantId) {
453
+ if (this.#context.multitenant) {
454
+ return this.#lease(_a.#openStorage(this.#storageFactory, standEntityStorageDescriptor(this.#storageContext(tenantId), registration.schema, registration.columns)), true);
455
+ }
456
+ const key = registration.typeUrl;
457
+ const existing = this.#entityHandles.get(key);
458
+ if (existing !== undefined)
459
+ return this.#lease(existing, false);
460
+ const handle = _a.#openStorage(this.#storageFactory, standEntityStorageDescriptor(this.#storageContext(tenantId), registration.schema, registration.columns));
461
+ this.#entityHandles.set(key, handle);
462
+ return this.#lease(handle, false);
463
+ }
464
+ #lease(handle, releaseAfterOperation) {
465
+ let released = false;
466
+ return {
467
+ current: handle.current,
468
+ release: () => {
469
+ if (released)
470
+ return;
471
+ released = true;
472
+ if (releaseAfterOperation) {
473
+ try {
474
+ handle.close();
475
+ }
476
+ catch (error) {
477
+ if (this.#handleCloseErrors.length < HANDLE_CLOSE_ERROR_LIMIT) {
478
+ this.#handleCloseErrors.push(error);
479
+ }
480
+ else {
481
+ this.#omittedHandleCloseErrors++;
482
+ }
483
+ }
484
+ }
485
+ },
486
+ };
487
+ }
488
+ #entryResult(registration, current, maskPaths) {
489
+ const value = EntityRecords.unpack(registration.schema, current);
490
+ if (value.deleted)
491
+ return undefined;
492
+ const version = value.version === 0n && value.versionMessage.timestamp === undefined
493
+ ? undefined
494
+ : value.versionMessage;
495
+ return Object.freeze({
496
+ state: Object.assign(create(registration.schema), RecordMask.apply(clone(registration.schema, value.state), maskPaths)),
497
+ ...(version === undefined ? {} : { version: clone(VersionSchema, version) }),
498
+ });
499
+ }
500
+ #currentResult(registration, current) {
501
+ return this.#entryResult(registration, current);
502
+ }
503
+ #notify(registration, input, captured) {
504
+ const errors = [];
505
+ const tenantKey = this.#tenantKey(input.tenantId);
506
+ const subscribers = captured ?? this.#tenantSubscribers(registration, tenantKey);
507
+ for (const subscriber of subscribers) {
508
+ try {
509
+ subscriber.callback(_a.#createUpdate(registration, input));
510
+ }
511
+ catch (error) {
512
+ errors.push(error);
513
+ }
514
+ }
515
+ if (errors.length === 1) {
516
+ throw errors[0];
517
+ }
518
+ if (errors.length > 1) {
519
+ throw new AggregateError(errors, "Stand subscriber delivery failed.");
520
+ }
521
+ }
522
+ #tenantKey(tenantId) {
523
+ const selected = this.#tenantId(tenantId);
524
+ return selected === undefined ? "__single__" : String(TenantBoundary.from(selected).key);
525
+ }
526
+ #hasTenantSubscribers(registration, tenantId) {
527
+ const tenantKey = this.#tenantKey(tenantId);
528
+ for (const subscriber of registration.subscribers) {
529
+ if (subscriber.tenantKey === tenantKey) {
530
+ return true;
531
+ }
532
+ }
533
+ return false;
534
+ }
535
+ #tenantSubscribers(registration, tenantKey) {
536
+ return [...registration.subscribers].filter((subscriber) => subscriber.tenantKey === tenantKey);
537
+ }
538
+ #tenantId(tenantId) {
539
+ if (!this.#context.multitenant) {
540
+ if (tenantId !== undefined) {
541
+ throw new Error(`Single-tenant Stand "${this.#context.name}" does not accept tenantId.`);
542
+ }
543
+ return undefined;
544
+ }
545
+ if (tenantId === undefined) {
546
+ throw new Error(`Multitenant Stand "${this.#context.name}" requires tenantId.`);
547
+ }
548
+ return TenantBoundary.from(tenantId).tenantId;
549
+ }
550
+ #storageContext(tenantId) {
551
+ if (!this.#context.multitenant) {
552
+ this.#tenantId(tenantId);
553
+ return Object.freeze({ name: this.#context.name, multitenant: false });
554
+ }
555
+ if (tenantId === undefined) {
556
+ throw new Error(`Multitenant Stand "${this.#context.name}" requires tenantId.`);
557
+ }
558
+ return Object.freeze({
559
+ name: this.#context.name,
560
+ multitenant: true,
561
+ tenantId: TenantBoundary.from(tenantId).tenantId,
562
+ });
563
+ }
564
+ #requireOpen() {
565
+ if (this.#closing || this.#closed) {
566
+ throw new Error("Stand is closed.");
567
+ }
568
+ }
569
+ #beginOperation() {
570
+ this.#requireOpen();
571
+ let finish;
572
+ const operation = new Promise((resolve) => {
573
+ finish = resolve;
574
+ });
575
+ this.#inFlight.add(operation);
576
+ return () => {
577
+ this.#inFlight.delete(operation);
578
+ finish?.();
579
+ };
580
+ }
581
+ static #createUpdate(registration, input) {
582
+ const version = input.version === undefined ? undefined : clone(VersionSchema, input.version);
583
+ return Object.freeze({
584
+ typeUrl: registration.typeUrl,
585
+ id: _a.#cloneValue(input.id),
586
+ ...(input.previousState === undefined
587
+ ? {}
588
+ : { previousState: clone(registration.schema, input.previousState) }),
589
+ state: clone(registration.schema, input.state),
590
+ ...(version === undefined ? {} : { version }),
591
+ ...(input.tenantId === undefined ? {} : { tenantId: clone(TenantIdSchema, input.tenantId) }),
592
+ });
593
+ }
594
+ static #readStateId(state, registration) {
595
+ const id = state[registration.idField];
596
+ if (id === undefined || id === null) {
597
+ throw new Error(`Stand state "${registration.schema.typeName}" requires ID field.`);
598
+ }
599
+ return id;
600
+ }
601
+ static #cloneValue(value) {
602
+ return typeof value === "object" && value !== null ? globalThis.structuredClone(value) : value;
603
+ }
604
+ static #legacyPlan(query) {
605
+ RecordQuery.validate(query);
606
+ if (query.after !== undefined) {
607
+ throw new Error("Stand query continuations require the normalized entity query API.");
608
+ }
609
+ const predicates = [
610
+ ...(query.ids === undefined ? [] : [{ kind: "ids", ids: query.ids }]),
611
+ ...(query.filters ?? []).map((filter) => ({
612
+ kind: "comparison",
613
+ column: filter.column,
614
+ operator: "equal",
615
+ value: filter.value,
616
+ })),
617
+ ];
618
+ return {
619
+ ...(predicates.length === 0
620
+ ? {}
621
+ : {
622
+ predicate: predicates.length === 1 ? predicates[0] : { kind: "all", predicates },
623
+ }),
624
+ ...(query.sort === undefined
625
+ ? {}
626
+ : {
627
+ order: query.sort
628
+ .map((sort) => ({ field: sort.field, direction: sort.direction ?? "asc" }))
629
+ .map(({ field, direction }) => ({ column: field, direction })),
630
+ }),
631
+ ...(query.mask === undefined ? {} : { mask: { paths: query.mask } }),
632
+ ...(query.limit === undefined ? {} : { limit: query.limit }),
633
+ candidateLimit: 10_000,
634
+ };
635
+ }
636
+ static #openStorage(factory, input) {
637
+ const candidate = factory;
638
+ if (candidate.createEntityStorage === undefined) {
639
+ throw new Error("StorageFactory does not provide the required entity-record storage seam.");
640
+ }
641
+ return candidate.createEntityStorage(input);
642
+ }
643
+ static #cloneContext(context) {
644
+ return Object.freeze({ name: context.name, multitenant: context.multitenant });
645
+ }
646
+ }
647
+ _a = Stand;
648
+ /**
649
+ * Defines the repository-only persistence seam that defers subscriber delivery.
650
+ *
651
+ * @internal
652
+ */
653
+ export const standAccess = Object.freeze({
654
+ observedState(stand, typeUrl) {
655
+ if (!(stand instanceof Stand))
656
+ throw new TypeError("State observation requires a Stand instance.");
657
+ if (typeUrl === undefined)
658
+ return undefined;
659
+ return stand.observedState(typeUrl);
660
+ },
661
+ observeState(stand, subscription, state, systemEventBus, onUpdate) {
662
+ if (!(stand instanceof Stand))
663
+ throw new TypeError("State observation requires a Stand instance.");
664
+ return SubscriptionObservers.observeState(subscription, state, systemEventBus, onUpdate);
665
+ },
666
+ readCurrent(stand, schema, id, options) {
667
+ const read = currentReads.get(stand);
668
+ if (read === undefined)
669
+ throw new TypeError("Stand current read requires a Stand instance.");
670
+ return read(schema, id, options);
671
+ },
672
+ deferUpdate(stand, schema, state, options) {
673
+ const deferred = deferredUpdates.get(stand);
674
+ if (deferred === undefined)
675
+ throw new TypeError("Stand deferred update requires a Stand instance.");
676
+ return deferred(schema, state, options);
677
+ },
678
+ });
679
+ const deferredUpdates = new WeakMap();
680
+ const currentReads = new WeakMap();
681
+ //# sourceMappingURL=stand.js.map