@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,187 @@
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 { getOption, hasOption } from "@bufbuild/protobuf";
15
+ import { column, entity, EntityOption_Kind, EntityOption_Visibility, set_once, } from "@spine-event-engine/proto";
16
+ const entitySchema = Symbol("spine-ts.entity-schema");
17
+ /**
18
+ * Attaches generated state-schema metadata directly to an Entity class.
19
+ *
20
+ * @internal
21
+ * @param entityType The Entity class that owns the schema metadata.
22
+ * @param schema The generated Entity state schema.
23
+ */
24
+ export function attachEntitySchema(entityType, schema) {
25
+ const current = Object.prototype.hasOwnProperty.call(entityType, entitySchema)
26
+ ? Reflect.get(entityType, entitySchema)
27
+ : undefined;
28
+ if (current !== undefined && current !== schema) {
29
+ throw new Error("Entity class already has different generated state schema metadata.");
30
+ }
31
+ if (current === undefined) {
32
+ Object.defineProperty(entityType, entitySchema, {
33
+ configurable: false,
34
+ enumerable: false,
35
+ value: schema,
36
+ writable: false,
37
+ });
38
+ }
39
+ }
40
+ /**
41
+ * Reads generated state-schema metadata from an Entity class.
42
+ *
43
+ * @internal
44
+ * @param entityType The Entity class whose metadata is read.
45
+ * @returns The attached generated state schema, when present.
46
+ */
47
+ export function entitySchemaOf(entityType) {
48
+ return Object.prototype.hasOwnProperty.call(entityType, entitySchema)
49
+ ? Reflect.get(entityType, entitySchema)
50
+ : undefined;
51
+ }
52
+ /**
53
+ * Error thrown when descriptor metadata cannot be derived for a schema.
54
+ */
55
+ export class DescriptorMetadataError extends Error {
56
+ // prettier-ignore
57
+ /**
58
+ * Stable code for callers/tests that need structured failure handling.
59
+ */
60
+ code;
61
+ /**
62
+ * Creates a descriptor metadata error.
63
+ *
64
+ * @param code Stable failure code.
65
+ * @param message Human-readable explanation of the invalid descriptor.
66
+ */
67
+ constructor(code, message) {
68
+ super(message);
69
+ this.name = "DescriptorMetadataError";
70
+ this.code = code;
71
+ Object.setPrototypeOf(this, new.target.prototype);
72
+ }
73
+ }
74
+ /**
75
+ * Determines whether a schema declares Spine `(entity)` metadata.
76
+ *
77
+ * @param schema Generated schema to inspect.
78
+ * @returns `true` when the schema declares an entity option.
79
+ */
80
+ export function isEntitySchema(schema) {
81
+ return hasOption(schema, entity);
82
+ }
83
+ /**
84
+ * Describes deterministic entity metadata from a Protobuf-ES schema descriptor.
85
+ *
86
+ * @param schema Generated entity-state schema to describe.
87
+ * @returns Frozen metadata derived from the schema descriptor.
88
+ */
89
+ export function describeEntityMetadata(schema) {
90
+ if (!isEntitySchema(schema)) {
91
+ throw new DescriptorMetadataError("NOT_ENTITY_SCHEMA", `Schema "${schema.typeName}" requires an (entity) option before entity metadata can be derived.`);
92
+ }
93
+ const entityOption = getOption(schema, entity);
94
+ const kind = EntityDescriptors.kind(schema, entityOption.kind);
95
+ const declaredVisibility = EntityDescriptors.visibility(schema, entityOption.visibility);
96
+ const visibility = EntityDescriptors.resolvedVisibility(kind, declaredVisibility);
97
+ const idFieldDescriptor = schema.fields[0];
98
+ if (idFieldDescriptor === undefined) {
99
+ throw new DescriptorMetadataError("MISSING_ENTITY_ID_FIELD", `Entity schema "${schema.typeName}" must declare at least one field for its ID and routing metadata.`);
100
+ }
101
+ const idField = EntityDescriptors.field(idFieldDescriptor);
102
+ const firstFieldRoutingHint = Object.freeze({
103
+ strategy: "first-field",
104
+ field: idField,
105
+ });
106
+ const columns = EntityDescriptors.columns(schema, kind);
107
+ const setOnceFields = Object.freeze(schema.fields
108
+ .filter((field) => hasOption(field, set_once) && getOption(field, set_once))
109
+ .map(EntityDescriptors.field));
110
+ const metadata = {
111
+ schema,
112
+ descriptor: schema,
113
+ fullTypeName: schema.typeName,
114
+ fileDescriptor: schema.file,
115
+ fileName: `${schema.file.name}.proto`,
116
+ kind,
117
+ declaredVisibility,
118
+ visibility,
119
+ visibilitySource: declaredVisibility === "default" ? "default" : "explicit",
120
+ idField,
121
+ firstFieldRoutingHint,
122
+ columns,
123
+ setOnceFields,
124
+ };
125
+ return Object.freeze(metadata);
126
+ }
127
+ /**
128
+ * Normalizes private descriptors used to build entity metadata.
129
+ */
130
+ const EntityDescriptors = Object.freeze({
131
+ field(field) {
132
+ return Object.freeze({
133
+ descriptor: field,
134
+ name: field.name,
135
+ localName: field.localName,
136
+ jsonName: field.jsonName,
137
+ number: field.number,
138
+ });
139
+ },
140
+ kind(schema, value) {
141
+ switch (value) {
142
+ case EntityOption_Kind.AGGREGATE:
143
+ return "aggregate";
144
+ case EntityOption_Kind.PROJECTION:
145
+ return "projection";
146
+ case EntityOption_Kind.PROCESS_MANAGER:
147
+ return "process-manager";
148
+ case EntityOption_Kind.ENTITY:
149
+ return "entity";
150
+ default:
151
+ throw new DescriptorMetadataError("UNSUPPORTED_ENTITY_KIND", `Schema "${schema.typeName}" declares unsupported entity kind ` +
152
+ `"${EntityOption_Kind[value] || String(value)}".`);
153
+ }
154
+ },
155
+ visibility(schema, value) {
156
+ switch (value) {
157
+ case EntityOption_Visibility.DEFAULT:
158
+ return "default";
159
+ case EntityOption_Visibility.NONE:
160
+ return "none";
161
+ case EntityOption_Visibility.SUBSCRIBE:
162
+ return "subscribe";
163
+ case EntityOption_Visibility.QUERY:
164
+ return "query";
165
+ case EntityOption_Visibility.FULL:
166
+ return "full";
167
+ default:
168
+ throw new DescriptorMetadataError("UNSUPPORTED_ENTITY_VISIBILITY", `Schema "${schema.typeName}" declares unsupported entity visibility "${String(value)}".`);
169
+ }
170
+ },
171
+ resolvedVisibility(kind, declared) {
172
+ return declared === "default" ? (kind === "projection" ? "full" : "none") : declared;
173
+ },
174
+ columns(schema, kind) {
175
+ if (kind !== "projection" && kind !== "process-manager")
176
+ return Object.freeze([]);
177
+ return Object.freeze(schema.fields
178
+ .filter((field) => hasOption(field, column) && getOption(field, column))
179
+ .map((field) => {
180
+ if (field.fieldKind === "list" || field.fieldKind === "map")
181
+ throw new DescriptorMetadataError("INVALID_COLUMN_FIELD", `Entity column field "${schema.typeName}.${field.name}" must be singular; ` +
182
+ "repeated and map fields are unsupported.");
183
+ return EntityDescriptors.field(field);
184
+ }));
185
+ },
186
+ });
187
+ //# sourceMappingURL=entity-metadata.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"entity-metadata.js","sourceRoot":"","sources":["../../src/entity/entity-metadata.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,64 @@
1
+ import { type Message } from "@bufbuild/protobuf";
2
+ import { type Any } from "@bufbuild/protobuf/wkt";
3
+ import { type EntityRecord } from "@spine-event-engine/proto/generated/spine/server/entity/entity_pb.js";
4
+ import { RecordColumn, RecordSpec, type StorageContext } from "@spine-event-engine/storage";
5
+ import type { EntityStorageInput } from "@spine-event-engine/storage/internal/entity-history";
6
+ import { type DescriptorMessageSchema } from "./entity-metadata.js";
7
+ import type { PrimitiveId } from "../repository/primitive-id.js";
8
+ /**
9
+ * Converts repository current state to and from the JVM EntityRecord envelope.
10
+ *
11
+ * @internal
12
+ */
13
+ export declare const EntityRecords: EntityRecordConverter;
14
+ /**
15
+ * Creates provider input from a class-derived EntityRecord specification.
16
+ *
17
+ * @param context Identifies the storage namespace for entity records.
18
+ * @param spec The Entity-class storage specification.
19
+ * @returns The storage input for generated JVM EntityRecord values.
20
+ */
21
+ export declare function entityStorageDescriptor<I>(context: StorageContext, spec: RecordSpec<I, EntityRecord>): EntityStorageInput<I, Message>;
22
+ /**
23
+ * Packs Entity IDs according to the declaration-first ID field of their state.
24
+ *
25
+ * @internal
26
+ */
27
+ export declare const EntityIds: Readonly<{
28
+ pack(schema: DescriptorMessageSchema, entityId: unknown): Any;
29
+ }>;
30
+ /**
31
+ * Creates the internal Stand storage input for a registered Entity state schema.
32
+ *
33
+ * @param context Identifies the storage namespace for entity records.
34
+ * @param schema The registered generated state schema.
35
+ * @param columns The state columns selected by Stand registration.
36
+ * @returns Storage input backed by generated JVM EntityRecord values.
37
+ * @internal
38
+ */
39
+ export declare function standEntityStorageDescriptor(context: StorageContext, schema: DescriptorMessageSchema, columns: readonly RecordColumn<Message>[]): EntityStorageInput<unknown, Message>;
40
+ /**
41
+ * Builds the shared JVM EntityRecord specification for one Entity state schema.
42
+ *
43
+ * @param schema Generated Entity state schema.
44
+ * @param columns State columns materialized from an unpacked EntityRecord.
45
+ * @returns The generated EntityRecord specification.
46
+ * @internal
47
+ */
48
+ export declare function entityRecordSpec(schema: DescriptorMessageSchema, columns: readonly RecordColumn<Message>[]): RecordSpec<Message | PrimitiveId, EntityRecord>;
49
+ type EntityRecordValue = Readonly<{
50
+ readonly archived: boolean;
51
+ readonly deleted: boolean;
52
+ readonly state: Message;
53
+ readonly version: bigint;
54
+ readonly versionMessage: import("@spine-event-engine/proto").Version;
55
+ }>;
56
+ type EntityRecordConverter = Readonly<{
57
+ pack(schema: DescriptorMessageSchema, entityId: unknown, state: Message, version: bigint | import("@spine-event-engine/proto").Version, lifecycle: {
58
+ readonly archived: boolean;
59
+ readonly deleted: boolean;
60
+ }): EntityRecord;
61
+ unpack(schema: DescriptorMessageSchema, record: EntityRecord): EntityRecordValue;
62
+ }>;
63
+ export {};
64
+ //# sourceMappingURL=entity-storage-descriptor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"entity-storage-descriptor.d.ts","sourceRoot":"","sources":["../../src/entity/entity-storage-descriptor.ts"],"names":[],"mappings":"AAcA,OAAO,EAAuC,KAAK,OAAO,EAAE,MAAM,oBAAoB,CAAC;AACvF,OAAO,EAAa,KAAK,GAAG,EAAE,MAAM,wBAAwB,CAAC;AAG7D,OAAO,EAGL,KAAK,YAAY,EAClB,MAAM,sEAAsE,CAAC;AAC9E,OAAO,EAEL,YAAY,EACZ,UAAU,EACV,KAAK,cAAc,EACpB,MAAM,6BAA6B,CAAC;AACrC,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,qDAAqD,CAAC;AAE9F,OAAO,EAA0B,KAAK,uBAAuB,EAAE,MAAM,sBAAsB,CAAC;AAC5F,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,+BAA+B,CAAC;AAEjE;;;;GAIG;AACH,eAAO,MAAM,aAAa,EAAE,qBAmE1B,CAAC;AAEH;;;;;;GAMG;AACH,wBAAgB,uBAAuB,CAAC,CAAC,EACvC,OAAO,EAAE,cAAc,EACvB,IAAI,EAAE,UAAU,CAAC,CAAC,EAAE,YAAY,CAAC,GAChC,kBAAkB,CAAC,CAAC,EAAE,OAAO,CAAC,CAoBhC;AAED;;;;GAIG;AACH,eAAO,MAAM,SAAS,EAAE,QAAQ,CAAC;IAC/B,IAAI,CAAC,MAAM,EAAE,uBAAuB,EAAE,QAAQ,EAAE,OAAO,GAAG,GAAG,CAAC;CAC/D,CAkBC,CAAC;AAEH;;;;;;;;GAQG;AACH,wBAAgB,4BAA4B,CAC1C,OAAO,EAAE,cAAc,EACvB,MAAM,EAAE,uBAAuB,EAC/B,OAAO,EAAE,SAAS,YAAY,CAAC,OAAO,CAAC,EAAE,GACxC,kBAAkB,CAAC,OAAO,EAAE,OAAO,CAAC,CAKtC;AAED;;;;;;;GAOG;AACH,wBAAgB,gBAAgB,CAC9B,MAAM,EAAE,uBAAuB,EAC/B,OAAO,EAAE,SAAS,YAAY,CAAC,OAAO,CAAC,EAAE,GACxC,UAAU,CAAC,OAAO,GAAG,WAAW,EAAE,YAAY,CAAC,CA0CjD;AAuCD,KAAK,iBAAiB,GAAG,QAAQ,CAAC;IAChC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;IAC3B,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;IACxB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,cAAc,EAAE,OAAO,2BAA2B,EAAE,OAAO,CAAC;CACtE,CAAC,CAAC;AAEH,KAAK,qBAAqB,GAAG,QAAQ,CAAC;IACpC,IAAI,CACF,MAAM,EAAE,uBAAuB,EAC/B,QAAQ,EAAE,OAAO,EACjB,KAAK,EAAE,OAAO,EACd,OAAO,EAAE,MAAM,GAAG,OAAO,2BAA2B,EAAE,OAAO,EAC7D,SAAS,EAAE;QAAE,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;QAAC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAA;KAAE,GACnE,YAAY,CAAC;IAChB,MAAM,CAAC,MAAM,EAAE,uBAAuB,EAAE,MAAM,EAAE,YAAY,GAAG,iBAAiB,CAAC;CAClF,CAAC,CAAC"}
@@ -0,0 +1,227 @@
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, create, ScalarType, toBinary } from "@bufbuild/protobuf";
15
+ import { AnySchema } from "@bufbuild/protobuf/wkt";
16
+ import { AnyMessages, Identifiers } from "@spine-event-engine/core";
17
+ import { VersionSchema } from "@spine-event-engine/proto";
18
+ import { EntityRecordSchema, LifecycleFlagsSchema, } from "@spine-event-engine/proto/generated/spine/server/entity/entity_pb.js";
19
+ import { ColumnTypes, RecordColumn, RecordSpec, } from "@spine-event-engine/storage";
20
+ import { describeEntityMetadata } from "./entity-metadata.js";
21
+ /**
22
+ * Converts repository current state to and from the JVM EntityRecord envelope.
23
+ *
24
+ * @internal
25
+ */
26
+ export const EntityRecords = Object.freeze({
27
+ // prettier-ignore
28
+ /**
29
+ * Packs one current Entity state and its durable metadata.
30
+ *
31
+ * @param schema The generated Entity state schema.
32
+ * @param entityId The authoritative routed Entity ID.
33
+ * @param state The current Entity state.
34
+ * @param version The persisted Entity version.
35
+ * @param lifecycle The persisted Entity lifecycle.
36
+ * @returns The generated JVM EntityRecord envelope.
37
+ */
38
+ pack(schema, entityId, state, version, lifecycle) {
39
+ const versionNumber = typeof version === "bigint" ? version : BigInt(version.number);
40
+ if (versionNumber < 0n || versionNumber > 2147483647n) {
41
+ throw new RangeError("EntityRecord version must fit the non-negative JVM int32 range.");
42
+ }
43
+ const packedId = EntityIds.pack(schema, entityId);
44
+ return create(EntityRecordSchema, {
45
+ entityId: packedId,
46
+ state: AnyMessages.pack(schema, state),
47
+ version: typeof version === "bigint"
48
+ ? create(VersionSchema, { number: Number(version) })
49
+ : clone(VersionSchema, version),
50
+ lifecycleFlags: create(LifecycleFlagsSchema, lifecycle),
51
+ });
52
+ },
53
+ /**
54
+ * Restores state and durable metadata from one generated EntityRecord.
55
+ *
56
+ * @param schema The generated Entity state schema.
57
+ * @param record The JVM EntityRecord envelope.
58
+ * @returns The unpacked state and durable metadata.
59
+ */
60
+ unpack(schema, record) {
61
+ const cached = stateCache.get(record)?.get(schema);
62
+ if (cached !== undefined)
63
+ return cached;
64
+ const packedState = record.state;
65
+ const state = packedState === undefined ? undefined : AnyMessages.unpack(packedState, schema);
66
+ if (state === undefined)
67
+ throw new Error("EntityRecord state does not match the Entity state schema.");
68
+ const version = BigInt(record.version?.number ?? 0);
69
+ if (version < 0n)
70
+ throw new RangeError("EntityRecord version must be non-negative.");
71
+ const value = Object.freeze({
72
+ archived: record.lifecycleFlags?.archived ?? false,
73
+ deleted: record.lifecycleFlags?.deleted ?? false,
74
+ state,
75
+ version,
76
+ versionMessage: clone(VersionSchema, record.version ?? create(VersionSchema)),
77
+ });
78
+ let cachedBySchema = stateCache.get(record);
79
+ if (cachedBySchema === undefined) {
80
+ cachedBySchema = new Map();
81
+ stateCache.set(record, cachedBySchema);
82
+ }
83
+ cachedBySchema.set(schema, value);
84
+ return value;
85
+ },
86
+ });
87
+ /**
88
+ * Creates provider input from a class-derived EntityRecord specification.
89
+ *
90
+ * @param context Identifies the storage namespace for entity records.
91
+ * @param spec The Entity-class storage specification.
92
+ * @returns The storage input for generated JVM EntityRecord values.
93
+ */
94
+ export function entityStorageDescriptor(context, spec) {
95
+ return {
96
+ columns: spec.columns,
97
+ context,
98
+ id: {
99
+ clone: (id) => structuredClone(id),
100
+ key: (id) => canonicalEntityIdKey(spec.sourceType, id),
101
+ pack: (id) => EntityIds.pack(spec.sourceType, id),
102
+ unpack: (id) => {
103
+ try {
104
+ return spec.idValueIn(create(EntityRecordSchema, { entityId: id }));
105
+ }
106
+ catch {
107
+ return undefined;
108
+ }
109
+ },
110
+ },
111
+ recordSpec: spec,
112
+ sourceType: spec.sourceType,
113
+ stateSchema: spec.sourceType,
114
+ };
115
+ }
116
+ /**
117
+ * Packs Entity IDs according to the declaration-first ID field of their state.
118
+ *
119
+ * @internal
120
+ */
121
+ export const EntityIds = Object.freeze({
122
+ pack(schema, entityId) {
123
+ const idField = describeEntityMetadata(schema).idField.descriptor;
124
+ if (idField.fieldKind === "message") {
125
+ return Identifiers.pack(idField.message, entityId);
126
+ }
127
+ if (idField.fieldKind === "scalar") {
128
+ switch (primitiveIdKind(idField.scalar)) {
129
+ case "string":
130
+ return Identifiers.pack("string", entityId);
131
+ case "int32":
132
+ return Identifiers.pack("int32", entityId);
133
+ case "int64":
134
+ return Identifiers.pack("int64", entityId);
135
+ }
136
+ }
137
+ throw new Error("Entity ID field must be scalar or message-valued.");
138
+ },
139
+ });
140
+ /**
141
+ * Creates the internal Stand storage input for a registered Entity state schema.
142
+ *
143
+ * @param context Identifies the storage namespace for entity records.
144
+ * @param schema The registered generated state schema.
145
+ * @param columns The state columns selected by Stand registration.
146
+ * @returns Storage input backed by generated JVM EntityRecord values.
147
+ * @internal
148
+ */
149
+ export function standEntityStorageDescriptor(context, schema, columns) {
150
+ return entityStorageDescriptor(context, entityRecordSpec(schema, columns));
151
+ }
152
+ /**
153
+ * Builds the shared JVM EntityRecord specification for one Entity state schema.
154
+ *
155
+ * @param schema Generated Entity state schema.
156
+ * @param columns State columns materialized from an unpacked EntityRecord.
157
+ * @returns The generated EntityRecord specification.
158
+ * @internal
159
+ */
160
+ export function entityRecordSpec(schema, columns) {
161
+ const metadata = describeEntityMetadata(schema);
162
+ const input = {
163
+ sourceType: schema,
164
+ recordType: EntityRecordSchema,
165
+ columns: [
166
+ new RecordColumn("archived", ColumnTypes.scalar(ScalarType.BOOL), (record) => record.lifecycleFlags?.archived ?? false),
167
+ new RecordColumn("deleted", ColumnTypes.scalar(ScalarType.BOOL), (record) => record.lifecycleFlags?.deleted ?? false),
168
+ new RecordColumn("version", ColumnTypes.message(VersionSchema), (record) => clone(VersionSchema, record.version ?? create(VersionSchema))),
169
+ ...columns.map((column) => new RecordColumn(column.name, column.type, (record) => column.valueIn(EntityRecords.unpack(schema, record).state))),
170
+ ],
171
+ };
172
+ const idField = metadata.idField.descriptor;
173
+ if (idField.fieldKind === "message")
174
+ return new RecordSpec({
175
+ ...input,
176
+ idSchema: idField.message,
177
+ extractId: (record) => unpackMessageId(record, idField.message),
178
+ });
179
+ if (idField.fieldKind === "scalar")
180
+ return new RecordSpec({
181
+ ...input,
182
+ idKind: primitiveIdKind(idField.scalar),
183
+ extractId: (record) => unpackPrimitiveId(record, primitiveIdKind(idField.scalar)),
184
+ });
185
+ throw new Error(`Entity ID field "${idField.name}" must be scalar or message-valued.`);
186
+ }
187
+ function primitiveIdKind(type) {
188
+ switch (type) {
189
+ case ScalarType.STRING:
190
+ return "string";
191
+ case ScalarType.INT32:
192
+ case ScalarType.SINT32:
193
+ case ScalarType.SFIXED32:
194
+ return "int32";
195
+ case ScalarType.INT64:
196
+ case ScalarType.SINT64:
197
+ case ScalarType.SFIXED64:
198
+ return "int64";
199
+ default:
200
+ throw new Error("Spine JVM storage does not support this primitive Entity ID type.");
201
+ }
202
+ }
203
+ function unpackMessageId(record, schema) {
204
+ if (record.entityId === undefined)
205
+ throw new Error("EntityRecord has no packed entity ID.");
206
+ const id = AnyMessages.unpack(record.entityId, schema);
207
+ if (id === undefined)
208
+ throw new Error("EntityRecord ID does not match the Entity ID schema.");
209
+ return id;
210
+ }
211
+ function unpackPrimitiveId(record, kind) {
212
+ const id = record.entityId === undefined
213
+ ? undefined
214
+ : kind === "string"
215
+ ? Identifiers.unpack("string", record.entityId)
216
+ : kind === "int32"
217
+ ? Identifiers.unpack("int32", record.entityId)
218
+ : Identifiers.unpack("int64", record.entityId);
219
+ if (id === undefined)
220
+ throw new Error("EntityRecord ID does not match the Entity ID schema.");
221
+ return id;
222
+ }
223
+ const stateCache = new WeakMap();
224
+ function canonicalEntityIdKey(schema, id) {
225
+ return Buffer.from(toBinary(AnySchema, EntityIds.pack(schema, id))).toString("base64");
226
+ }
227
+ //# sourceMappingURL=entity-storage-descriptor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"entity-storage-descriptor.js","sourceRoot":"","sources":["../../src/entity/entity-storage-descriptor.ts"],"names":[],"mappings":"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"}