@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,829 @@
1
+ /*
2
+ * Copyright 2026, CodeMatters. All rights reserved.
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
5
+ * in compliance with the License. You may obtain a copy of the License at
6
+ *
7
+ * https://www.apache.org/licenses/LICENSE-2.0
8
+ *
9
+ * Unless required by applicable law or agreed to in writing, software distributed under the License
10
+ * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
11
+ * or implied. See the License for the specific language governing permissions and limitations under
12
+ * the License.
13
+ */
14
+ import { clone, fromBinary, toBinary } from "@bufbuild/protobuf";
15
+ import { ValidationErrorSchema, } from "@spine-event-engine/proto";
16
+ import { describeEntityMetadata, } from "./entity-metadata.js";
17
+ import { EntityTransaction, } from "./entity-transaction.js";
18
+ const rejectedCommits = new WeakMap();
19
+ /**
20
+ * Error thrown when a transactional entity draft helper is used outside its scope.
21
+ */
22
+ export class TransactionalEntityScopeError extends Error {
23
+ // prettier-ignore
24
+ /**
25
+ * Scope failure reason.
26
+ */
27
+ reason;
28
+ /**
29
+ * Operation rejected by the current transaction scope.
30
+ */
31
+ operation;
32
+ /**
33
+ * Creates a deterministic transaction-scope error.
34
+ *
35
+ * @param reason Scope failure reason.
36
+ * @param operation Operation rejected by the scope.
37
+ */
38
+ constructor(reason, operation) {
39
+ super(reason === "duplicate"
40
+ ? `Cannot ${operation}: transactional entity already has an active transaction.`
41
+ : `Cannot ${operation}: transactional entity requires an active transaction.`);
42
+ this.name = "TransactionalEntityScopeError";
43
+ this.reason = reason;
44
+ this.operation = operation;
45
+ Object.setPrototypeOf(this, new.target.prototype);
46
+ }
47
+ }
48
+ const isProxy = process.getBuiltinModule("node:util").types.isProxy;
49
+ /**
50
+ * Common in-memory OOP shell for one server-side entity state.
51
+ *
52
+ * The shell exposes identity, descriptor-derived metadata, cloned state
53
+ * snapshots, caller-owned plain version metadata snapshots, and lifecycle flags. It does not
54
+ * invoke handlers, create transactions, write repositories or storage, dispatch
55
+ * messages, increment versions, route IDs, query read models, start buses, or
56
+ * mutate process-wide runtime state.
57
+ */
58
+ export class Entity {
59
+ #id;
60
+ #schema;
61
+ #metadata;
62
+ #state;
63
+ #version;
64
+ #lifecycle;
65
+ #lifecycleFlagsChanged = false;
66
+ /**
67
+ * Creates an entity shell from caller-provided state and metadata inputs.
68
+ *
69
+ * @param options Identity, schema, state, version, and lifecycle inputs.
70
+ */
71
+ constructor(options) {
72
+ this.#id = options.id;
73
+ this.#schema = options.schema;
74
+ this.#metadata = describeEntityMetadata(options.schema);
75
+ this.#state = EntitySnapshots.clone(options.schema, options.state);
76
+ this.#version = EntityVersions.clone(options.version);
77
+ this.#lifecycle = {
78
+ archived: options.lifecycle?.archived ?? false,
79
+ deleted: options.lifecycle?.deleted ?? false,
80
+ };
81
+ }
82
+ /**
83
+ * Gets the stable entity identifier.
84
+ *
85
+ * @returns The caller-owned entity identifier.
86
+ */
87
+ get id() {
88
+ return this.#id;
89
+ }
90
+ /**
91
+ * Gets the generated Protobuf-ES schema describing this entity's state.
92
+ *
93
+ * @returns The generated state schema.
94
+ */
95
+ get schema() {
96
+ return this.#schema;
97
+ }
98
+ /**
99
+ * Gets descriptor-derived metadata for this entity's state schema.
100
+ *
101
+ * @returns The frozen descriptor metadata.
102
+ */
103
+ get metadata() {
104
+ return this.#metadata;
105
+ }
106
+ /**
107
+ * Gets the current entity state snapshot.
108
+ *
109
+ * @returns A cloned state snapshot.
110
+ */
111
+ get state() {
112
+ return EntitySnapshots.clone(this.#schema, this.#state);
113
+ }
114
+ /**
115
+ * Gets the caller-owned plain version metadata snapshot.
116
+ *
117
+ * @returns A validated clone of the version metadata.
118
+ */
119
+ get version() {
120
+ return EntityVersions.clone(this.#version);
121
+ }
122
+ /**
123
+ * Gets the current lifecycle flag snapshot.
124
+ *
125
+ * @returns The archived and deleted flags.
126
+ */
127
+ get lifecycle() {
128
+ return {
129
+ archived: this.#lifecycle.archived,
130
+ deleted: this.#lifecycle.deleted,
131
+ };
132
+ }
133
+ /**
134
+ * Determines whether the entity is archived.
135
+ *
136
+ * @returns `true` when the entity is archived.
137
+ */
138
+ get isArchived() {
139
+ return this.#lifecycle.archived;
140
+ }
141
+ /**
142
+ * Determines whether the entity is deleted.
143
+ *
144
+ * @returns `true` when the entity is deleted.
145
+ */
146
+ get isDeleted() {
147
+ return this.#lifecycle.deleted;
148
+ }
149
+ /**
150
+ * Determines whether neither lifecycle flag marks the entity inactive.
151
+ *
152
+ * @returns `true` when the entity is active.
153
+ */
154
+ get isActive() {
155
+ return !this.isArchived && !this.isDeleted;
156
+ }
157
+ /**
158
+ * Determines whether lifecycle flags changed after construction.
159
+ *
160
+ * @returns `true` when lifecycle flags changed.
161
+ */
162
+ get lifecycleFlagsChanged() {
163
+ return this.#lifecycleFlagsChanged;
164
+ }
165
+ /**
166
+ * Replaces stored state from framework-owned subclass or runtime code.
167
+ *
168
+ * @param state Next entity state snapshot.
169
+ */
170
+ replaceState(state) {
171
+ this.#state = EntitySnapshots.clone(this.#schema, state);
172
+ }
173
+ /**
174
+ * Replaces caller-owned version metadata from framework-owned subclass or runtime code.
175
+ *
176
+ * @param version Next caller-owned version metadata.
177
+ */
178
+ replaceVersionMetadata(version) {
179
+ this.#version = EntityVersions.clone(version);
180
+ }
181
+ /**
182
+ * Replaces lifecycle flags from framework-owned subclass or runtime code.
183
+ *
184
+ * @param lifecycle Lifecycle flag changes to apply.
185
+ */
186
+ replaceLifecycleFlags(lifecycle) {
187
+ const next = {
188
+ archived: lifecycle.archived ?? this.#lifecycle.archived,
189
+ deleted: lifecycle.deleted ?? this.#lifecycle.deleted,
190
+ };
191
+ if (next.archived !== this.#lifecycle.archived || next.deleted !== this.#lifecycle.deleted) {
192
+ this.#lifecycle = next;
193
+ this.#lifecycleFlagsChanged = true;
194
+ }
195
+ }
196
+ /**
197
+ * Reads the newest retained state at or before `time`.
198
+ *
199
+ * This diagnostic facility is repository-bound and is not a remote API.
200
+ *
201
+ * @param time Timestamp of the requested state snapshot.
202
+ * @returns The retained state snapshot, if one exists.
203
+ */
204
+ stateAt(time) {
205
+ return entityHistoryAccess.stateAt(this, time);
206
+ }
207
+ /**
208
+ * Reads retained states in descending version order.
209
+ *
210
+ * @param depth Maximum number of retained states to read.
211
+ * @returns Retained state snapshots in descending version order.
212
+ */
213
+ stateHistoryBackward(depth) {
214
+ return entityHistoryAccess.states(this, depth);
215
+ }
216
+ /**
217
+ * Gets application-managed state-history retention.
218
+ *
219
+ * @returns State-history storage for this entity.
220
+ */
221
+ stateHistoryStorage() {
222
+ return entityHistoryAccess.stateMaintenance(this);
223
+ }
224
+ }
225
+ const boundEntityHistories = new WeakMap();
226
+ /**
227
+ * Provides repository-only history binding.
228
+ *
229
+ * @internal
230
+ */
231
+ export const entityHistoryAccess = Object.freeze({
232
+ bind(entity, binding) {
233
+ boundEntityHistories.set(entity, binding);
234
+ },
235
+ stateAt(entity, time) {
236
+ return EntityHistory.require(entity).stateAt(time);
237
+ },
238
+ states(entity, depth) {
239
+ return EntityHistory.require(entity).states(EntityHistory.depth(depth));
240
+ },
241
+ events(entity, depth) {
242
+ return EntityHistory.require(entity).events(EntityHistory.depth(depth));
243
+ },
244
+ stateMaintenance(entity) {
245
+ return EntityHistory.require(entity).stateMaintenance;
246
+ },
247
+ eventMaintenance(entity) {
248
+ return EntityHistory.require(entity).eventMaintenance;
249
+ },
250
+ });
251
+ /**
252
+ * Validates repository-bound history lookups.
253
+ */
254
+ const EntityHistory = Object.freeze({
255
+ require(entity) {
256
+ const binding = boundEntityHistories.get(entity);
257
+ if (binding === undefined) {
258
+ throw new Error("Entity history is available only from repository execution.");
259
+ }
260
+ return binding;
261
+ },
262
+ depth(depth) {
263
+ if (!Number.isSafeInteger(depth) || depth <= 0) {
264
+ throw new RangeError("Entity history depth must be a positive safe integer.");
265
+ }
266
+ return depth;
267
+ },
268
+ });
269
+ /**
270
+ * Common in-memory entity shell with a protected scoped transaction draft.
271
+ *
272
+ * The transaction scope is backed by {@link EntityTransaction}. Subclasses can
273
+ * start one active draft, mutate draft state/version/lifecycle through protected
274
+ * helpers, and then commit or roll back the scope. Accepted commits replace this
275
+ * entity's in-memory state, explicit version metadata, and lifecycle flags.
276
+ * Rejected commits leave the transaction active so subclass code can correct the
277
+ * draft or roll it back explicitly. This base does not write repositories,
278
+ * emit events, dispatch handlers, increment versions, or manage global
279
+ * transaction state.
280
+ */
281
+ export class TransactionalEntity extends Entity {
282
+ #transaction;
283
+ #stateChanged = false;
284
+ /**
285
+ * Determines whether accepted transaction state or lifecycle changes are visible.
286
+ *
287
+ * @returns `true` when the entity differs from its initial state.
288
+ */
289
+ get changed() {
290
+ return this.#stateChanged || this.lifecycleFlagsChanged;
291
+ }
292
+ /**
293
+ * Determines whether a protected transaction scope is currently active.
294
+ *
295
+ * @returns `true` when an active transaction scope exists.
296
+ */
297
+ isTransactionInProgress() {
298
+ return this.#transaction?.status === "active";
299
+ }
300
+ /**
301
+ * Starts a protected draft transaction from the entity's current snapshots.
302
+ *
303
+ * @throws {@link TransactionalEntityScopeError} when another transaction is active.
304
+ */
305
+ startTransaction() {
306
+ if (this.isTransactionInProgress()) {
307
+ throw new TransactionalEntityScopeError("duplicate", "startTransaction");
308
+ }
309
+ const previousVersion = this.version;
310
+ this.#transaction = new EntityTransaction({
311
+ schema: this.schema,
312
+ previous: this.state,
313
+ version: {
314
+ previous: previousVersion,
315
+ draft: EntityVersions.clone(previousVersion),
316
+ },
317
+ lifecycle: this.lifecycle,
318
+ });
319
+ }
320
+ /**
321
+ * Gets the current draft state snapshot.
322
+ *
323
+ * @returns A cloned current draft state snapshot.
324
+ * @throws {@link TransactionalEntityScopeError} when no transaction is active.
325
+ */
326
+ currentDraft() {
327
+ return this.#requireTransaction("currentDraft").currentDraft;
328
+ }
329
+ /**
330
+ * Gets the current draft version metadata snapshot.
331
+ *
332
+ * @returns Cloned previous and draft version metadata.
333
+ * @throws {@link TransactionalEntityScopeError} when no transaction is active.
334
+ */
335
+ draftVersionMetadata() {
336
+ const version = this.#requireTransaction("draftVersionMetadata").version;
337
+ return {
338
+ previous: EntityVersions.clone(version.previous),
339
+ draft: EntityVersions.clone(version.draft),
340
+ };
341
+ }
342
+ /**
343
+ * Gets the current draft lifecycle flag snapshot.
344
+ *
345
+ * @returns Current archived and deleted draft flags.
346
+ * @throws {@link TransactionalEntityScopeError} when no transaction is active.
347
+ */
348
+ draftLifecycleFlags() {
349
+ return this.#requireTransaction("draftLifecycleFlags").lifecycle;
350
+ }
351
+ /**
352
+ * Updates the buffered draft state in place.
353
+ *
354
+ * @param mutator Changes the active draft state.
355
+ * @returns A cloned snapshot of the updated draft state.
356
+ * @throws {@link TransactionalEntityScopeError} when no transaction is active.
357
+ */
358
+ update(mutator) {
359
+ return this.#requireTransaction("update").update(mutator);
360
+ }
361
+ /**
362
+ * Tries to update and validate a scratch draft, applying it only when valid.
363
+ *
364
+ * Validation failures return immutable constraint violations. Other errors
365
+ * propagate and leave the active draft unchanged.
366
+ *
367
+ * @param mutator Changes the scratch draft state.
368
+ * @returns Immutable constraint violations, or an empty array when the update applies.
369
+ * @throws {@link TransactionalEntityScopeError} when no transaction is active.
370
+ */
371
+ tryUpdate(mutator) {
372
+ return this.#requireTransaction("tryUpdate").tryUpdate(mutator);
373
+ }
374
+ /**
375
+ * Updates the buffered draft version metadata without computing version increments.
376
+ *
377
+ * @param draft Caller-owned version metadata for the active draft.
378
+ * @returns Cloned previous and draft version metadata.
379
+ * @throws {@link TransactionalEntityScopeError} when no transaction is active.
380
+ */
381
+ updateDraftVersionMetadata(draft) {
382
+ this.#requireTransaction("updateDraftVersionMetadata").updateVersionMetadata(EntityVersions.clone(draft));
383
+ return this.draftVersionMetadata();
384
+ }
385
+ /**
386
+ * Marks the buffered draft lifecycle as archived.
387
+ *
388
+ * @returns The archived and deleted draft flags.
389
+ * @throws {@link TransactionalEntityScopeError} when no transaction is active.
390
+ */
391
+ archiveDraft() {
392
+ return this.#requireTransaction("archiveDraft").archive();
393
+ }
394
+ /**
395
+ * Marks the buffered draft lifecycle as not archived.
396
+ *
397
+ * @returns The archived and deleted draft flags.
398
+ * @throws {@link TransactionalEntityScopeError} when no transaction is active.
399
+ */
400
+ unarchiveDraft() {
401
+ return this.#requireTransaction("unarchiveDraft").unarchive();
402
+ }
403
+ /**
404
+ * Marks the buffered draft lifecycle as deleted.
405
+ *
406
+ * @returns The archived and deleted draft flags.
407
+ * @throws {@link TransactionalEntityScopeError} when no transaction is active.
408
+ */
409
+ markDraftDeleted() {
410
+ return this.#requireTransaction("markDraftDeleted").markDeleted();
411
+ }
412
+ /**
413
+ * Marks the buffered draft lifecycle as not deleted.
414
+ *
415
+ * @returns The archived and deleted draft flags.
416
+ * @throws {@link TransactionalEntityScopeError} when no transaction is active.
417
+ */
418
+ restoreDraft() {
419
+ return this.#requireTransaction("restoreDraft").restore();
420
+ }
421
+ /**
422
+ * Commits the active draft transaction.
423
+ *
424
+ * Accepted commits apply state, version metadata, and lifecycle flags to this
425
+ * entity and close the transaction. Rejected commits do not apply anything and
426
+ * keep the transaction active for correction or explicit rollback.
427
+ *
428
+ * @returns A cloned accepted or rejected transaction result.
429
+ * @throws {@link TransactionalEntityScopeError} when no transaction is active.
430
+ */
431
+ commitTransaction() {
432
+ const transaction = this.#requireTransaction("commitTransaction");
433
+ const result = transaction.commit();
434
+ if (result.status === "accepted") {
435
+ if (result.previous === undefined ||
436
+ !EntitySnapshots.equal(this.schema, result.previous, result.next)) {
437
+ this.#stateChanged = true;
438
+ }
439
+ this.replaceState(result.next);
440
+ this.replaceVersionMetadata(result.version.committed);
441
+ this.replaceLifecycleFlags(result.lifecycle);
442
+ this.#transaction = undefined;
443
+ rejectedCommits.delete(this);
444
+ }
445
+ else {
446
+ rejectedCommits.set(this, EntityCommits.clone(result));
447
+ }
448
+ return EntityCommits.clone(result);
449
+ }
450
+ /**
451
+ * Rolls back the active draft without applying state, version, or lifecycle changes.
452
+ *
453
+ * @returns A cloned rollback result containing the discarded draft snapshots.
454
+ * @throws {@link TransactionalEntityScopeError} when no transaction is active.
455
+ */
456
+ rollbackTransaction() {
457
+ const result = this.#requireTransaction("rollbackTransaction").rollback();
458
+ this.#transaction = undefined;
459
+ return result;
460
+ }
461
+ #requireTransaction(operation) {
462
+ const transaction = this.#transaction;
463
+ if (transaction?.status !== "active") {
464
+ throw new TransactionalEntityScopeError("missing", operation);
465
+ }
466
+ return transaction;
467
+ }
468
+ }
469
+ /**
470
+ * Exposes framework-only transaction operations for repository execution.
471
+ *
472
+ * @internal
473
+ */
474
+ export const transactionalEntityAccess = Object.freeze({
475
+ start(entity) {
476
+ TransactionAccess.call(entity, "startTransaction");
477
+ },
478
+ commit(entity) {
479
+ return TransactionAccess.call(entity, "commitTransaction");
480
+ },
481
+ rollback(entity) {
482
+ try {
483
+ TransactionAccess.call(entity, "rollbackTransaction");
484
+ }
485
+ catch (error) {
486
+ if (!TransactionAccess.isMissing(error)) {
487
+ throw error;
488
+ }
489
+ }
490
+ },
491
+ rejectedCommit(entity) {
492
+ const rejected = rejectedCommits.get(entity);
493
+ return rejected === undefined
494
+ ? undefined
495
+ : EntityCommits.clone(rejected);
496
+ },
497
+ });
498
+ /**
499
+ * Bridges repository code to protected transactional entity methods.
500
+ */
501
+ const TransactionAccess = Object.freeze({
502
+ call(entity, methodName) {
503
+ const method = entity[methodName];
504
+ if (typeof method !== "function") {
505
+ throw new TypeError(`Transactional entity access requires "${methodName}".`);
506
+ }
507
+ return Reflect.apply(method, entity, []);
508
+ },
509
+ isMissing(error) {
510
+ return error instanceof TransactionalEntityScopeError && error.reason === "missing";
511
+ },
512
+ });
513
+ /**
514
+ * Abstract aggregate family marker over the common transactional entity shell.
515
+ *
516
+ * This class intentionally adds only stable family identity. It does not add
517
+ * command dispatch, snapshots, repositories, idempotency guards, or handler
518
+ * invocation. Repository-bound diagnostic event-history reads are declared
519
+ * below for the Aggregate family.
520
+ */
521
+ export class Aggregate extends TransactionalEntity {
522
+ /**
523
+ * Creates an aggregate family shell from caller-provided state and metadata inputs.
524
+ *
525
+ * @param options Identity, schema, state, version, and lifecycle inputs.
526
+ */
527
+ constructor(options) {
528
+ super(options);
529
+ EntityFamilies.mark(this, "aggregate");
530
+ }
531
+ /**
532
+ * Reads retained diagnostic events in descending producer-version order.
533
+ *
534
+ * @param depth Maximum number of retained events to read.
535
+ * @returns Retained events in descending producer-version order.
536
+ */
537
+ eventHistoryBackward(depth) {
538
+ return entityHistoryAccess.events(this, depth);
539
+ }
540
+ /**
541
+ * Tests retained diagnostic events in descending producer-version order.
542
+ *
543
+ * @param depth Maximum number of retained events to inspect.
544
+ * @param predicate Tests each retained event.
545
+ * @returns `true` when a retained event matches the predicate.
546
+ */
547
+ async eventHistoryContains(depth, predicate) {
548
+ return (await this.eventHistoryBackward(depth)).some(predicate);
549
+ }
550
+ /**
551
+ * Gets application-managed diagnostic event-history retention.
552
+ *
553
+ * @returns Event-history storage for this entity.
554
+ */
555
+ eventStorage() {
556
+ return entityHistoryAccess.eventMaintenance(this);
557
+ }
558
+ }
559
+ /**
560
+ * Abstract projection family marker over the common transactional entity shell.
561
+ *
562
+ * This class intentionally adds only stable family identity. It does not add
563
+ * event subscriptions, event playing, repositories, version columns, query
564
+ * clients, or handler invocation.
565
+ */
566
+ export class Projection extends TransactionalEntity {
567
+ /**
568
+ * Creates a projection family shell from caller-provided state and metadata inputs.
569
+ *
570
+ * @param options Identity, schema, state, version, and lifecycle inputs.
571
+ */
572
+ constructor(options) {
573
+ super(options);
574
+ EntityFamilies.mark(this, "projection");
575
+ }
576
+ }
577
+ /**
578
+ * Abstract process manager family marker over the common transactional entity shell.
579
+ *
580
+ * This class intentionally adds only stable family identity. It does not add
581
+ * process workflow execution, command posting, query clients, repositories,
582
+ * bounded-context injection, or handler invocation.
583
+ */
584
+ export class ProcessManager extends TransactionalEntity {
585
+ /**
586
+ * Creates a process manager family shell from caller-provided state and metadata inputs.
587
+ *
588
+ * @param options Identity, schema, state, version, and lifecycle inputs.
589
+ */
590
+ constructor(options) {
591
+ super(options);
592
+ EntityFamilies.mark(this, "process-manager");
593
+ }
594
+ /**
595
+ * Reads retained diagnostic events when this repository enabled Process Manager event history.
596
+ *
597
+ * @param depth Maximum number of retained events to read.
598
+ * @returns Retained events in descending producer-version order.
599
+ */
600
+ eventHistoryBackward(depth) {
601
+ return entityHistoryAccess.events(this, depth);
602
+ }
603
+ /**
604
+ * Tests retained diagnostic events when this repository enabled Process Manager event history.
605
+ *
606
+ * @param depth Maximum number of retained events to inspect.
607
+ * @param predicate Tests each retained event.
608
+ * @returns `true` when a retained event matches the predicate.
609
+ */
610
+ async eventHistoryContains(depth, predicate) {
611
+ return (await this.eventHistoryBackward(depth)).some(predicate);
612
+ }
613
+ /**
614
+ * Gets application-managed Process Manager diagnostic event-history retention.
615
+ *
616
+ * @returns Event-history storage for this Process Manager.
617
+ */
618
+ eventStorage() {
619
+ return entityHistoryAccess.eventMaintenance(this);
620
+ }
621
+ }
622
+ /**
623
+ * Marks immutable entity families.
624
+ */
625
+ const EntityFamilies = Object.freeze({
626
+ mark(entity, family) {
627
+ Object.defineProperty(entity, "entityFamily", {
628
+ configurable: false,
629
+ enumerable: false,
630
+ value: family,
631
+ writable: false,
632
+ });
633
+ },
634
+ });
635
+ /**
636
+ * Creates entity-state snapshots and compares state bytes.
637
+ */
638
+ const EntitySnapshots = Object.freeze({
639
+ clone(schema, state) {
640
+ return fromBinary(schema, toBinary(schema, state, { writeUnknownFields: false }));
641
+ },
642
+ equal(schema, previous, next) {
643
+ const previousBinary = toBinary(schema, previous, { writeUnknownFields: false });
644
+ const nextBinary = toBinary(schema, next, { writeUnknownFields: false });
645
+ return (previousBinary.byteLength === nextBinary.byteLength &&
646
+ previousBinary.every((byte, index) => byte === nextBinary[index]));
647
+ },
648
+ });
649
+ /**
650
+ * Creates immutable transaction-result snapshots.
651
+ */
652
+ const EntityCommits = Object.freeze({
653
+ clone(result) {
654
+ if (result.status === "accepted") {
655
+ return {
656
+ ...result,
657
+ version: {
658
+ previous: EntityVersions.clone(result.version.previous),
659
+ committed: EntityVersions.clone(result.version.committed),
660
+ },
661
+ lifecycle: { archived: result.lifecycle.archived, deleted: result.lifecycle.deleted },
662
+ validation: this.validation(result.validation),
663
+ };
664
+ }
665
+ return {
666
+ ...result,
667
+ version: {
668
+ previous: EntityVersions.clone(result.version.previous),
669
+ draft: EntityVersions.clone(result.version.draft),
670
+ },
671
+ lifecycle: { archived: result.lifecycle.archived, deleted: result.lifecycle.deleted },
672
+ validation: this.validation(result.validation),
673
+ };
674
+ },
675
+ validation(validation) {
676
+ if (validation.valid) {
677
+ return { valid: true, violations: [], error: undefined };
678
+ }
679
+ const error = clone(ValidationErrorSchema, validation.error);
680
+ return {
681
+ valid: false,
682
+ violations: error.constraintViolation,
683
+ error,
684
+ };
685
+ },
686
+ });
687
+ const maxVersionMetadataDepth = 1_000;
688
+ /**
689
+ * Validates and clones caller-provided plain version metadata.
690
+ */
691
+ const EntityVersions = Object.freeze({
692
+ clone(version) {
693
+ return this.value(version, "$", new WeakSet(), 0);
694
+ },
695
+ value(value, path, stack, depth) {
696
+ if (depth > maxVersionMetadataDepth) {
697
+ throw this.error(path, "excessive nesting depth");
698
+ }
699
+ if (value === null) {
700
+ return value;
701
+ }
702
+ switch (typeof value) {
703
+ case "string":
704
+ case "number":
705
+ case "boolean":
706
+ case "bigint":
707
+ case "symbol":
708
+ case "undefined":
709
+ return value;
710
+ case "function":
711
+ throw this.error(path, "function");
712
+ case "object":
713
+ return this.object(value, path, stack, depth);
714
+ }
715
+ },
716
+ object(value, path, stack, depth) {
717
+ if (isProxy(value))
718
+ throw this.error(path, "Proxy");
719
+ if (ArrayBuffer.isView(value))
720
+ throw this.error(path, this.kind(value));
721
+ if (value instanceof ArrayBuffer || this.isSharedBuffer(value)) {
722
+ throw this.error(path, this.kind(value));
723
+ }
724
+ if (stack.has(value))
725
+ throw this.error(path, "cyclic object");
726
+ stack.add(value);
727
+ try {
728
+ if (Array.isArray(value))
729
+ return this.array(value, path, stack, depth);
730
+ if (!this.isPlainObject(value))
731
+ throw this.error(path, this.kind(value));
732
+ const clone = Object.create(this.prototype(value));
733
+ const descriptors = Object.getOwnPropertyDescriptors(value);
734
+ const [symbolKey] = Object.getOwnPropertySymbols(descriptors);
735
+ if (symbolKey !== undefined) {
736
+ throw this.error(`${path}[${String(symbolKey)}]`, "symbol-keyed property");
737
+ }
738
+ for (const [key, descriptor] of Object.entries(descriptors)) {
739
+ const childPath = `${path}.${key}`;
740
+ if (!descriptor.enumerable)
741
+ throw this.error(childPath, "non-enumerable property");
742
+ if (!("value" in descriptor))
743
+ throw this.error(childPath, "accessor property");
744
+ Object.defineProperty(clone, key, {
745
+ configurable: true,
746
+ enumerable: true,
747
+ value: this.value(descriptor.value, childPath, stack, depth + 1),
748
+ writable: true,
749
+ });
750
+ }
751
+ return clone;
752
+ }
753
+ finally {
754
+ stack.delete(value);
755
+ }
756
+ },
757
+ array(value, path, stack, depth) {
758
+ if (this.prototype(value) !== Array.prototype)
759
+ throw this.error(path, "Array");
760
+ const descriptors = Object.getOwnPropertyDescriptors(value);
761
+ const [symbolKey] = Object.getOwnPropertySymbols(descriptors);
762
+ if (symbolKey !== undefined) {
763
+ throw this.error(`${path}[${String(symbolKey)}]`, "symbol-keyed property");
764
+ }
765
+ const lengthDescriptor = descriptors.length;
766
+ if (lengthDescriptor === undefined || !("value" in lengthDescriptor)) {
767
+ throw this.error(path, "array without data length");
768
+ }
769
+ const length = lengthDescriptor.value;
770
+ const clone = new Array(length);
771
+ for (const [key, descriptor] of Object.entries(descriptors)) {
772
+ if (key === "length")
773
+ continue;
774
+ if (!this.isArrayKey(key, length))
775
+ throw this.error(`${path}.${key}`, "custom array property");
776
+ if (!descriptor.enumerable)
777
+ throw this.error(`${path}[${key}]`, "non-enumerable property");
778
+ if (!("value" in descriptor))
779
+ throw this.error(`${path}[${key}]`, "accessor property");
780
+ }
781
+ for (let index = 0; index < length; index += 1) {
782
+ const key = String(index);
783
+ const descriptor = descriptors[key];
784
+ if (descriptor === undefined || !("value" in descriptor)) {
785
+ throw this.error(`${path}[${key}]`, "sparse array element");
786
+ }
787
+ Object.defineProperty(clone, index, {
788
+ configurable: true,
789
+ enumerable: true,
790
+ value: this.value(descriptor.value, `${path}[${key}]`, stack, depth + 1),
791
+ writable: true,
792
+ });
793
+ }
794
+ return clone;
795
+ },
796
+ isArrayKey(key, length) {
797
+ const index = Number(key);
798
+ return Number.isInteger(index) && index >= 0 && index < length && String(index) === key;
799
+ },
800
+ isPlainObject(value) {
801
+ const prototype = this.prototype(value);
802
+ return prototype === Object.prototype || prototype === null;
803
+ },
804
+ prototype(value) {
805
+ return Object.getPrototypeOf(value);
806
+ },
807
+ kind(value) {
808
+ if (value instanceof Date)
809
+ return "Date";
810
+ if (value instanceof Map)
811
+ return "Map";
812
+ if (value instanceof Set)
813
+ return "Set";
814
+ if (ArrayBuffer.isView(value))
815
+ return "typed array";
816
+ if (value instanceof ArrayBuffer)
817
+ return "ArrayBuffer";
818
+ if (this.isSharedBuffer(value))
819
+ return "SharedArrayBuffer";
820
+ return "object";
821
+ },
822
+ isSharedBuffer(value) {
823
+ return typeof SharedArrayBuffer !== "undefined" && value instanceof SharedArrayBuffer;
824
+ },
825
+ error(path, kind) {
826
+ return new TypeError(`Entity version metadata must be plain snapshot data; ${path} contains ${kind}.`);
827
+ },
828
+ });
829
+ //# sourceMappingURL=entity.js.map