@effect/cluster 0.28.3 → 0.29.0

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 (626) hide show
  1. package/ClusterError/package.json +6 -0
  2. package/ClusterMetrics/package.json +6 -0
  3. package/ClusterSchema/package.json +6 -0
  4. package/DeliverAt/package.json +6 -0
  5. package/Entity/package.json +6 -0
  6. package/EntityAddress/package.json +6 -0
  7. package/EntityId/package.json +6 -0
  8. package/EntityType/package.json +6 -0
  9. package/Envelope/package.json +6 -0
  10. package/HttpCommon/package.json +6 -0
  11. package/HttpRunner/package.json +6 -0
  12. package/HttpShardManager/package.json +6 -0
  13. package/MachineId/package.json +6 -0
  14. package/MessageStorage/package.json +6 -0
  15. package/README.md +2 -2
  16. package/Reply/package.json +6 -0
  17. package/Runner/package.json +6 -0
  18. package/RunnerAddress/package.json +6 -0
  19. package/RunnerHealth/package.json +6 -0
  20. package/RunnerServer/package.json +6 -0
  21. package/Runners/package.json +6 -0
  22. package/ShardStorage/package.json +6 -0
  23. package/Singleton/package.json +6 -0
  24. package/SingletonAddress/package.json +6 -0
  25. package/Snowflake/package.json +6 -0
  26. package/SocketRunner/package.json +6 -0
  27. package/SocketShardManager/package.json +6 -0
  28. package/SqlMessageStorage/package.json +6 -0
  29. package/SqlShardStorage/package.json +6 -0
  30. package/SynchronizedClock/package.json +6 -0
  31. package/dist/cjs/ClusterError.js +180 -0
  32. package/dist/cjs/ClusterError.js.map +1 -0
  33. package/dist/cjs/ClusterMetrics.js +63 -0
  34. package/dist/cjs/ClusterMetrics.js.map +1 -0
  35. package/dist/cjs/{Pods.js → ClusterSchema.js} +10 -22
  36. package/dist/cjs/ClusterSchema.js.map +1 -0
  37. package/dist/cjs/DeliverAt.js +30 -0
  38. package/dist/cjs/DeliverAt.js.map +1 -0
  39. package/dist/cjs/Entity.js +187 -0
  40. package/dist/cjs/Entity.js.map +1 -0
  41. package/dist/cjs/EntityAddress.js +54 -0
  42. package/dist/cjs/EntityAddress.js.map +1 -0
  43. package/dist/cjs/{AtLeastOnce.js → EntityId.js} +6 -7
  44. package/dist/cjs/EntityId.js.map +1 -0
  45. package/dist/cjs/{ShardManagerClient.js → EntityType.js} +5 -16
  46. package/dist/cjs/EntityType.js.map +1 -0
  47. package/dist/cjs/Envelope.js +168 -0
  48. package/dist/cjs/Envelope.js.map +1 -0
  49. package/dist/cjs/HttpCommon.js +49 -0
  50. package/dist/cjs/HttpCommon.js.map +1 -0
  51. package/dist/cjs/HttpRunner.js +108 -0
  52. package/dist/cjs/HttpRunner.js.map +1 -0
  53. package/dist/cjs/HttpShardManager.js +140 -0
  54. package/dist/cjs/HttpShardManager.js.map +1 -0
  55. package/dist/cjs/{AtLeastOnceStorage.js → MachineId.js} +11 -9
  56. package/dist/cjs/MachineId.js.map +1 -0
  57. package/dist/cjs/Message.js +99 -18
  58. package/dist/cjs/Message.js.map +1 -1
  59. package/dist/cjs/MessageStorage.js +356 -0
  60. package/dist/cjs/MessageStorage.js.map +1 -0
  61. package/dist/cjs/Reply.js +200 -0
  62. package/dist/cjs/Reply.js.map +1 -0
  63. package/dist/cjs/Runner.js +79 -0
  64. package/dist/cjs/Runner.js.map +1 -0
  65. package/dist/cjs/RunnerAddress.js +63 -0
  66. package/dist/cjs/RunnerAddress.js.map +1 -0
  67. package/dist/cjs/RunnerHealth.js +68 -0
  68. package/dist/cjs/RunnerHealth.js.map +1 -0
  69. package/dist/cjs/RunnerServer.js +125 -0
  70. package/dist/cjs/RunnerServer.js.map +1 -0
  71. package/dist/cjs/Runners.js +344 -0
  72. package/dist/cjs/Runners.js.map +1 -0
  73. package/dist/cjs/ShardId.js +7 -46
  74. package/dist/cjs/ShardId.js.map +1 -1
  75. package/dist/cjs/ShardManager.js +493 -8
  76. package/dist/cjs/ShardManager.js.map +1 -1
  77. package/dist/cjs/ShardStorage.js +139 -0
  78. package/dist/cjs/ShardStorage.js.map +1 -0
  79. package/dist/cjs/Sharding.js +732 -88
  80. package/dist/cjs/Sharding.js.map +1 -1
  81. package/dist/cjs/ShardingConfig.js +85 -18
  82. package/dist/cjs/ShardingConfig.js.map +1 -1
  83. package/dist/cjs/ShardingRegistrationEvent.js +26 -32
  84. package/dist/cjs/ShardingRegistrationEvent.js.map +1 -1
  85. package/dist/cjs/{ManagerConfig.js → Singleton.js} +11 -20
  86. package/dist/cjs/Singleton.js.map +1 -0
  87. package/dist/cjs/SingletonAddress.js +50 -0
  88. package/dist/cjs/SingletonAddress.js.map +1 -0
  89. package/dist/cjs/Snowflake.js +133 -0
  90. package/dist/cjs/Snowflake.js.map +1 -0
  91. package/dist/cjs/SocketRunner.js +40 -0
  92. package/dist/cjs/SocketRunner.js.map +1 -0
  93. package/dist/cjs/SocketShardManager.js +33 -0
  94. package/dist/cjs/SocketShardManager.js.map +1 -0
  95. package/dist/cjs/SqlMessageStorage.js +668 -0
  96. package/dist/cjs/SqlMessageStorage.js.map +1 -0
  97. package/dist/cjs/SqlShardStorage.js +228 -0
  98. package/dist/cjs/SqlShardStorage.js.map +1 -0
  99. package/dist/cjs/SynchronizedClock.js +66 -0
  100. package/dist/cjs/SynchronizedClock.js.map +1 -0
  101. package/dist/cjs/index.js +57 -45
  102. package/dist/cjs/internal/entityManager.js +311 -143
  103. package/dist/cjs/internal/entityManager.js.map +1 -1
  104. package/dist/cjs/internal/entityReaper.js +47 -0
  105. package/dist/cjs/internal/entityReaper.js.map +1 -0
  106. package/dist/cjs/internal/hash.js +20 -0
  107. package/dist/cjs/internal/hash.js.map +1 -0
  108. package/dist/cjs/internal/interruptors.js +9 -0
  109. package/dist/cjs/internal/interruptors.js.map +1 -0
  110. package/dist/cjs/internal/resourceMap.js +88 -0
  111. package/dist/cjs/internal/resourceMap.js.map +1 -0
  112. package/dist/cjs/internal/resourceRef.js +92 -0
  113. package/dist/cjs/internal/resourceRef.js.map +1 -0
  114. package/dist/cjs/internal/shardManager.js +219 -235
  115. package/dist/cjs/internal/shardManager.js.map +1 -1
  116. package/dist/dts/ClusterError.d.ts +169 -0
  117. package/dist/dts/ClusterError.d.ts.map +1 -0
  118. package/dist/dts/ClusterMetrics.d.ts +50 -0
  119. package/dist/dts/ClusterMetrics.d.ts.map +1 -0
  120. package/dist/dts/ClusterSchema.d.ts +13 -0
  121. package/dist/dts/ClusterSchema.d.ts.map +1 -0
  122. package/dist/dts/DeliverAt.d.ts +27 -0
  123. package/dist/dts/DeliverAt.d.ts.map +1 -0
  124. package/dist/dts/Entity.d.ts +180 -0
  125. package/dist/dts/Entity.d.ts.map +1 -0
  126. package/dist/dts/EntityAddress.d.ts +55 -0
  127. package/dist/dts/EntityAddress.d.ts.map +1 -0
  128. package/dist/dts/EntityId.d.ts +15 -0
  129. package/dist/dts/EntityId.d.ts.map +1 -0
  130. package/dist/dts/EntityType.d.ts +15 -0
  131. package/dist/dts/EntityType.d.ts.map +1 -0
  132. package/dist/dts/Envelope.d.ts +252 -0
  133. package/dist/dts/Envelope.d.ts.map +1 -0
  134. package/dist/dts/HttpCommon.d.ts +25 -0
  135. package/dist/dts/HttpCommon.d.ts.map +1 -0
  136. package/dist/dts/HttpRunner.d.ts +76 -0
  137. package/dist/dts/HttpRunner.d.ts.map +1 -0
  138. package/dist/dts/HttpShardManager.d.ts +119 -0
  139. package/dist/dts/HttpShardManager.d.ts.map +1 -0
  140. package/dist/dts/MachineId.d.ts +20 -0
  141. package/dist/dts/MachineId.d.ts.map +1 -0
  142. package/dist/dts/Message.d.ts +91 -74
  143. package/dist/dts/Message.d.ts.map +1 -1
  144. package/dist/dts/MessageStorage.d.ts +336 -0
  145. package/dist/dts/MessageStorage.d.ts.map +1 -0
  146. package/dist/dts/Reply.d.ts +171 -0
  147. package/dist/dts/Reply.d.ts.map +1 -0
  148. package/dist/dts/Runner.d.ts +81 -0
  149. package/dist/dts/Runner.d.ts.map +1 -0
  150. package/dist/dts/RunnerAddress.d.ts +56 -0
  151. package/dist/dts/RunnerAddress.d.ts.map +1 -0
  152. package/dist/dts/RunnerHealth.d.ts +54 -0
  153. package/dist/dts/RunnerHealth.d.ts.map +1 -0
  154. package/dist/dts/RunnerServer.d.ts +44 -0
  155. package/dist/dts/RunnerServer.d.ts.map +1 -0
  156. package/dist/dts/Runners.d.ts +161 -0
  157. package/dist/dts/Runners.d.ts.map +1 -0
  158. package/dist/dts/ShardId.d.ts +5 -55
  159. package/dist/dts/ShardId.d.ts.map +1 -1
  160. package/dist/dts/ShardManager.d.ts +435 -23
  161. package/dist/dts/ShardManager.d.ts.map +1 -1
  162. package/dist/dts/ShardStorage.d.ts +200 -0
  163. package/dist/dts/ShardStorage.d.ts.map +1 -0
  164. package/dist/dts/Sharding.d.ts +109 -131
  165. package/dist/dts/Sharding.d.ts.map +1 -1
  166. package/dist/dts/ShardingConfig.d.ts +147 -44
  167. package/dist/dts/ShardingConfig.d.ts.map +1 -1
  168. package/dist/dts/ShardingRegistrationEvent.d.ts +38 -23
  169. package/dist/dts/ShardingRegistrationEvent.d.ts.map +1 -1
  170. package/dist/dts/Singleton.d.ts +13 -0
  171. package/dist/dts/Singleton.d.ts.map +1 -0
  172. package/dist/dts/SingletonAddress.d.ts +49 -0
  173. package/dist/dts/SingletonAddress.d.ts.map +1 -0
  174. package/dist/dts/Snowflake.d.ts +121 -0
  175. package/dist/dts/Snowflake.d.ts.map +1 -0
  176. package/dist/dts/SocketRunner.d.ts +22 -0
  177. package/dist/dts/SocketRunner.d.ts.map +1 -0
  178. package/dist/dts/SocketShardManager.d.ts +17 -0
  179. package/dist/dts/SocketShardManager.d.ts.map +1 -0
  180. package/dist/dts/SqlMessageStorage.d.ts +43 -0
  181. package/dist/dts/SqlMessageStorage.d.ts.map +1 -0
  182. package/dist/dts/SqlShardStorage.d.ts +38 -0
  183. package/dist/dts/SqlShardStorage.d.ts.map +1 -0
  184. package/dist/dts/SynchronizedClock.d.ts +19 -0
  185. package/dist/dts/SynchronizedClock.d.ts.map +1 -0
  186. package/dist/dts/index.d.ts +48 -24
  187. package/dist/dts/index.d.ts.map +1 -1
  188. package/dist/dts/internal/entityReaper.d.ts +2 -0
  189. package/dist/dts/internal/entityReaper.d.ts.map +1 -0
  190. package/dist/dts/internal/hash.d.ts +2 -0
  191. package/dist/dts/internal/hash.d.ts.map +1 -0
  192. package/dist/dts/internal/interruptors.d.ts +2 -0
  193. package/dist/dts/internal/interruptors.d.ts.map +1 -0
  194. package/dist/dts/internal/resourceMap.d.ts +22 -0
  195. package/dist/dts/internal/resourceMap.d.ts.map +1 -0
  196. package/dist/dts/internal/resourceRef.d.ts +25 -0
  197. package/dist/dts/internal/resourceRef.d.ts.map +1 -0
  198. package/dist/dts/internal/shardManager.d.ts +1 -11
  199. package/dist/dts/internal/shardManager.d.ts.map +1 -1
  200. package/dist/esm/ClusterError.js +164 -0
  201. package/dist/esm/ClusterError.js.map +1 -0
  202. package/dist/esm/ClusterMetrics.js +54 -0
  203. package/dist/esm/ClusterMetrics.js.map +1 -0
  204. package/dist/esm/ClusterSchema.js +13 -0
  205. package/dist/esm/ClusterSchema.js.map +1 -0
  206. package/dist/esm/DeliverAt.js +22 -0
  207. package/dist/esm/DeliverAt.js.map +1 -0
  208. package/dist/esm/Entity.js +173 -0
  209. package/dist/esm/Entity.js.map +1 -0
  210. package/dist/esm/EntityAddress.js +44 -0
  211. package/dist/esm/EntityAddress.js.map +1 -0
  212. package/dist/esm/EntityId.js +10 -0
  213. package/dist/esm/EntityId.js.map +1 -0
  214. package/dist/esm/EntityType.js +10 -0
  215. package/dist/esm/EntityType.js.map +1 -0
  216. package/dist/esm/Envelope.js +154 -0
  217. package/dist/esm/Envelope.js.map +1 -0
  218. package/dist/esm/HttpCommon.js +38 -0
  219. package/dist/esm/HttpCommon.js.map +1 -0
  220. package/dist/esm/HttpRunner.js +98 -0
  221. package/dist/esm/HttpRunner.js.map +1 -0
  222. package/dist/esm/HttpShardManager.js +128 -0
  223. package/dist/esm/HttpShardManager.js.map +1 -0
  224. package/dist/esm/MachineId.js +17 -0
  225. package/dist/esm/MachineId.js.map +1 -0
  226. package/dist/esm/Message.js +88 -17
  227. package/dist/esm/Message.js.map +1 -1
  228. package/dist/esm/MessageStorage.js +345 -0
  229. package/dist/esm/MessageStorage.js.map +1 -0
  230. package/dist/esm/Reply.js +184 -0
  231. package/dist/esm/Reply.js.map +1 -0
  232. package/dist/esm/Runner.js +68 -0
  233. package/dist/esm/Runner.js.map +1 -0
  234. package/dist/esm/RunnerAddress.js +52 -0
  235. package/dist/esm/RunnerAddress.js.map +1 -0
  236. package/dist/esm/RunnerHealth.js +58 -0
  237. package/dist/esm/RunnerHealth.js.map +1 -0
  238. package/dist/esm/RunnerServer.js +116 -0
  239. package/dist/esm/RunnerServer.js.map +1 -0
  240. package/dist/esm/Runners.js +332 -0
  241. package/dist/esm/Runners.js.map +1 -0
  242. package/dist/esm/ShardId.js +5 -42
  243. package/dist/esm/ShardId.js.map +1 -1
  244. package/dist/esm/ShardManager.js +486 -7
  245. package/dist/esm/ShardManager.js.map +1 -1
  246. package/dist/esm/ShardStorage.js +129 -0
  247. package/dist/esm/ShardStorage.js.map +1 -0
  248. package/dist/esm/Sharding.js +730 -87
  249. package/dist/esm/Sharding.js.map +1 -1
  250. package/dist/esm/ShardingConfig.js +80 -17
  251. package/dist/esm/ShardingConfig.js.map +1 -1
  252. package/dist/esm/ShardingRegistrationEvent.js +19 -29
  253. package/dist/esm/ShardingRegistrationEvent.js.map +1 -1
  254. package/dist/esm/Singleton.js +15 -0
  255. package/dist/esm/Singleton.js.map +1 -0
  256. package/dist/esm/SingletonAddress.js +40 -0
  257. package/dist/esm/SingletonAddress.js.map +1 -0
  258. package/dist/esm/Snowflake.js +117 -0
  259. package/dist/esm/Snowflake.js.map +1 -0
  260. package/dist/esm/SocketRunner.js +31 -0
  261. package/dist/esm/SocketRunner.js.map +1 -0
  262. package/dist/esm/SocketShardManager.js +24 -0
  263. package/dist/esm/SocketShardManager.js.map +1 -0
  264. package/dist/esm/SqlMessageStorage.js +658 -0
  265. package/dist/esm/SqlMessageStorage.js.map +1 -0
  266. package/dist/esm/SqlShardStorage.js +218 -0
  267. package/dist/esm/SqlShardStorage.js.map +1 -0
  268. package/dist/esm/SynchronizedClock.js +57 -0
  269. package/dist/esm/SynchronizedClock.js.map +1 -0
  270. package/dist/esm/index.js +48 -24
  271. package/dist/esm/index.js.map +1 -1
  272. package/dist/esm/internal/entityManager.js +311 -142
  273. package/dist/esm/internal/entityManager.js.map +1 -1
  274. package/dist/esm/internal/entityReaper.js +38 -0
  275. package/dist/esm/internal/entityReaper.js.map +1 -0
  276. package/dist/esm/internal/hash.js +12 -0
  277. package/dist/esm/internal/hash.js.map +1 -0
  278. package/dist/esm/internal/interruptors.js +3 -0
  279. package/dist/esm/internal/interruptors.js.map +1 -0
  280. package/dist/esm/internal/resourceMap.js +79 -0
  281. package/dist/esm/internal/resourceMap.js.map +1 -0
  282. package/dist/esm/internal/resourceRef.js +83 -0
  283. package/dist/esm/internal/resourceRef.js.map +1 -0
  284. package/dist/esm/internal/shardManager.js +217 -233
  285. package/dist/esm/internal/shardManager.js.map +1 -1
  286. package/package.json +212 -154
  287. package/src/ClusterError.ts +193 -0
  288. package/src/ClusterMetrics.ts +62 -0
  289. package/src/ClusterSchema.ts +13 -0
  290. package/src/DeliverAt.ts +36 -0
  291. package/src/Entity.ts +438 -0
  292. package/src/EntityAddress.ts +55 -0
  293. package/src/EntityId.ts +16 -0
  294. package/src/EntityType.ts +16 -0
  295. package/src/Envelope.ts +352 -0
  296. package/src/HttpCommon.ts +73 -0
  297. package/src/HttpRunner.ts +196 -0
  298. package/src/HttpShardManager.ts +273 -0
  299. package/src/MachineId.ts +27 -0
  300. package/src/Message.ts +143 -92
  301. package/src/MessageStorage.ts +697 -0
  302. package/src/Reply.ts +295 -0
  303. package/src/Runner.ts +84 -0
  304. package/src/RunnerAddress.ts +61 -0
  305. package/src/RunnerHealth.ts +87 -0
  306. package/src/RunnerServer.ts +156 -0
  307. package/src/Runners.ts +533 -0
  308. package/src/ShardId.ts +10 -62
  309. package/src/ShardManager.ts +780 -29
  310. package/src/ShardStorage.ts +289 -0
  311. package/src/Sharding.ts +1060 -183
  312. package/src/ShardingConfig.ts +186 -45
  313. package/src/ShardingRegistrationEvent.ts +38 -39
  314. package/src/Singleton.ts +20 -0
  315. package/src/SingletonAddress.ts +47 -0
  316. package/src/Snowflake.ts +194 -0
  317. package/src/SocketRunner.ts +59 -0
  318. package/src/SocketShardManager.ts +48 -0
  319. package/src/SqlMessageStorage.ts +833 -0
  320. package/src/SqlShardStorage.ts +292 -0
  321. package/src/SynchronizedClock.ts +82 -0
  322. package/src/index.ts +54 -24
  323. package/src/internal/entityManager.ts +464 -361
  324. package/src/internal/entityReaper.ts +53 -0
  325. package/src/internal/hash.ts +11 -0
  326. package/src/internal/interruptors.ts +4 -0
  327. package/src/internal/resourceMap.ts +89 -0
  328. package/src/internal/resourceRef.ts +88 -0
  329. package/src/internal/shardManager.ts +273 -546
  330. package/AtLeastOnce/package.json +0 -6
  331. package/AtLeastOnceStorage/package.json +0 -6
  332. package/Broadcaster/package.json +0 -6
  333. package/ManagerConfig/package.json +0 -6
  334. package/MessageState/package.json +0 -6
  335. package/Messenger/package.json +0 -6
  336. package/Pod/package.json +0 -6
  337. package/PodAddress/package.json +0 -6
  338. package/Pods/package.json +0 -6
  339. package/PodsHealth/package.json +0 -6
  340. package/PoisonPill/package.json +0 -6
  341. package/RecipientAddress/package.json +0 -6
  342. package/RecipientBehaviour/package.json +0 -6
  343. package/RecipientBehaviourContext/package.json +0 -6
  344. package/RecipientType/package.json +0 -6
  345. package/Serialization/package.json +0 -6
  346. package/SerializedEnvelope/package.json +0 -6
  347. package/SerializedMessage/package.json +0 -6
  348. package/ShardManagerClient/package.json +0 -6
  349. package/ShardingEvent/package.json +0 -6
  350. package/ShardingException/package.json +0 -6
  351. package/Storage/package.json +0 -6
  352. package/dist/cjs/AtLeastOnce.js.map +0 -1
  353. package/dist/cjs/AtLeastOnceStorage.js.map +0 -1
  354. package/dist/cjs/Broadcaster.js +0 -6
  355. package/dist/cjs/Broadcaster.js.map +0 -1
  356. package/dist/cjs/ManagerConfig.js.map +0 -1
  357. package/dist/cjs/MessageState.js +0 -55
  358. package/dist/cjs/MessageState.js.map +0 -1
  359. package/dist/cjs/Messenger.js +0 -6
  360. package/dist/cjs/Messenger.js.map +0 -1
  361. package/dist/cjs/Pod.js +0 -78
  362. package/dist/cjs/Pod.js.map +0 -1
  363. package/dist/cjs/PodAddress.js +0 -77
  364. package/dist/cjs/PodAddress.js.map +0 -1
  365. package/dist/cjs/Pods.js.map +0 -1
  366. package/dist/cjs/PodsHealth.js +0 -41
  367. package/dist/cjs/PodsHealth.js.map +0 -1
  368. package/dist/cjs/PoisonPill.js +0 -78
  369. package/dist/cjs/PoisonPill.js.map +0 -1
  370. package/dist/cjs/RecipientAddress.js +0 -79
  371. package/dist/cjs/RecipientAddress.js.map +0 -1
  372. package/dist/cjs/RecipientBehaviour.js +0 -38
  373. package/dist/cjs/RecipientBehaviour.js.map +0 -1
  374. package/dist/cjs/RecipientBehaviourContext.js +0 -64
  375. package/dist/cjs/RecipientBehaviourContext.js.map +0 -1
  376. package/dist/cjs/RecipientType.js +0 -123
  377. package/dist/cjs/RecipientType.js.map +0 -1
  378. package/dist/cjs/Serialization.js +0 -32
  379. package/dist/cjs/Serialization.js.map +0 -1
  380. package/dist/cjs/SerializedEnvelope.js +0 -87
  381. package/dist/cjs/SerializedEnvelope.js.map +0 -1
  382. package/dist/cjs/SerializedMessage.js +0 -64
  383. package/dist/cjs/SerializedMessage.js.map +0 -1
  384. package/dist/cjs/ShardManagerClient.js.map +0 -1
  385. package/dist/cjs/ShardingEvent.js +0 -72
  386. package/dist/cjs/ShardingEvent.js.map +0 -1
  387. package/dist/cjs/ShardingException.js +0 -107
  388. package/dist/cjs/ShardingException.js.map +0 -1
  389. package/dist/cjs/Storage.js +0 -40
  390. package/dist/cjs/Storage.js.map +0 -1
  391. package/dist/cjs/internal/atLeastOnce.js +0 -35
  392. package/dist/cjs/internal/atLeastOnce.js.map +0 -1
  393. package/dist/cjs/internal/atLeastOnceStorage.js +0 -163
  394. package/dist/cjs/internal/atLeastOnceStorage.js.map +0 -1
  395. package/dist/cjs/internal/entityState.js +0 -47
  396. package/dist/cjs/internal/entityState.js.map +0 -1
  397. package/dist/cjs/internal/managerConfig.js +0 -46
  398. package/dist/cjs/internal/managerConfig.js.map +0 -1
  399. package/dist/cjs/internal/message.js +0 -48
  400. package/dist/cjs/internal/message.js.map +0 -1
  401. package/dist/cjs/internal/messageState.js +0 -79
  402. package/dist/cjs/internal/messageState.js.map +0 -1
  403. package/dist/cjs/internal/podWithMetadata.js +0 -54
  404. package/dist/cjs/internal/podWithMetadata.js.map +0 -1
  405. package/dist/cjs/internal/pods.js +0 -35
  406. package/dist/cjs/internal/pods.js.map +0 -1
  407. package/dist/cjs/internal/podsHealth.js +0 -40
  408. package/dist/cjs/internal/podsHealth.js.map +0 -1
  409. package/dist/cjs/internal/recipientBehaviour.js +0 -52
  410. package/dist/cjs/internal/recipientBehaviour.js.map +0 -1
  411. package/dist/cjs/internal/recipientBehaviourContext.js +0 -36
  412. package/dist/cjs/internal/recipientBehaviourContext.js.map +0 -1
  413. package/dist/cjs/internal/serialization.js +0 -48
  414. package/dist/cjs/internal/serialization.js.map +0 -1
  415. package/dist/cjs/internal/shardManagerClient.js +0 -48
  416. package/dist/cjs/internal/shardManagerClient.js.map +0 -1
  417. package/dist/cjs/internal/shardManagerState.js +0 -44
  418. package/dist/cjs/internal/shardManagerState.js.map +0 -1
  419. package/dist/cjs/internal/sharding.js +0 -306
  420. package/dist/cjs/internal/sharding.js.map +0 -1
  421. package/dist/cjs/internal/shardingConfig.js +0 -56
  422. package/dist/cjs/internal/shardingConfig.js.map +0 -1
  423. package/dist/cjs/internal/storage.js +0 -52
  424. package/dist/cjs/internal/storage.js.map +0 -1
  425. package/dist/cjs/internal/utils.js +0 -69
  426. package/dist/cjs/internal/utils.js.map +0 -1
  427. package/dist/dts/AtLeastOnce.d.ts +0 -20
  428. package/dist/dts/AtLeastOnce.d.ts.map +0 -1
  429. package/dist/dts/AtLeastOnceStorage.d.ts +0 -75
  430. package/dist/dts/AtLeastOnceStorage.d.ts.map +0 -1
  431. package/dist/dts/Broadcaster.d.ts +0 -32
  432. package/dist/dts/Broadcaster.d.ts.map +0 -1
  433. package/dist/dts/ManagerConfig.d.ts +0 -61
  434. package/dist/dts/ManagerConfig.d.ts.map +0 -1
  435. package/dist/dts/MessageState.d.ts +0 -107
  436. package/dist/dts/MessageState.d.ts.map +0 -1
  437. package/dist/dts/Messenger.d.ts +0 -32
  438. package/dist/dts/Messenger.d.ts.map +0 -1
  439. package/dist/dts/Pod.d.ts +0 -81
  440. package/dist/dts/Pod.d.ts.map +0 -1
  441. package/dist/dts/PodAddress.d.ts +0 -80
  442. package/dist/dts/PodAddress.d.ts.map +0 -1
  443. package/dist/dts/Pods.d.ts +0 -78
  444. package/dist/dts/Pods.d.ts.map +0 -1
  445. package/dist/dts/PodsHealth.d.ts +0 -66
  446. package/dist/dts/PodsHealth.d.ts.map +0 -1
  447. package/dist/dts/PoisonPill.d.ts +0 -78
  448. package/dist/dts/PoisonPill.d.ts.map +0 -1
  449. package/dist/dts/RecipientAddress.d.ts +0 -57
  450. package/dist/dts/RecipientAddress.d.ts.map +0 -1
  451. package/dist/dts/RecipientBehaviour.d.ts +0 -72
  452. package/dist/dts/RecipientBehaviour.d.ts.map +0 -1
  453. package/dist/dts/RecipientBehaviourContext.d.ts +0 -83
  454. package/dist/dts/RecipientBehaviourContext.d.ts.map +0 -1
  455. package/dist/dts/RecipientType.d.ts +0 -93
  456. package/dist/dts/RecipientType.d.ts.map +0 -1
  457. package/dist/dts/Serialization.d.ts +0 -58
  458. package/dist/dts/Serialization.d.ts.map +0 -1
  459. package/dist/dts/SerializedEnvelope.d.ts +0 -86
  460. package/dist/dts/SerializedEnvelope.d.ts.map +0 -1
  461. package/dist/dts/SerializedMessage.d.ts +0 -66
  462. package/dist/dts/SerializedMessage.d.ts.map +0 -1
  463. package/dist/dts/ShardManagerClient.d.ts +0 -50
  464. package/dist/dts/ShardManagerClient.d.ts.map +0 -1
  465. package/dist/dts/ShardingEvent.d.ts +0 -90
  466. package/dist/dts/ShardingEvent.d.ts.map +0 -1
  467. package/dist/dts/ShardingException.d.ts +0 -125
  468. package/dist/dts/ShardingException.d.ts.map +0 -1
  469. package/dist/dts/Storage.d.ts +0 -78
  470. package/dist/dts/Storage.d.ts.map +0 -1
  471. package/dist/dts/internal/atLeastOnce.d.ts +0 -2
  472. package/dist/dts/internal/atLeastOnce.d.ts.map +0 -1
  473. package/dist/dts/internal/atLeastOnceStorage.d.ts +0 -2
  474. package/dist/dts/internal/atLeastOnceStorage.d.ts.map +0 -1
  475. package/dist/dts/internal/entityState.d.ts +0 -21
  476. package/dist/dts/internal/entityState.d.ts.map +0 -1
  477. package/dist/dts/internal/managerConfig.d.ts +0 -2
  478. package/dist/dts/internal/managerConfig.d.ts.map +0 -1
  479. package/dist/dts/internal/message.d.ts +0 -9
  480. package/dist/dts/internal/message.d.ts.map +0 -1
  481. package/dist/dts/internal/messageState.d.ts +0 -2
  482. package/dist/dts/internal/messageState.d.ts.map +0 -1
  483. package/dist/dts/internal/podWithMetadata.d.ts +0 -2
  484. package/dist/dts/internal/podWithMetadata.d.ts.map +0 -1
  485. package/dist/dts/internal/pods.d.ts +0 -2
  486. package/dist/dts/internal/pods.d.ts.map +0 -1
  487. package/dist/dts/internal/podsHealth.d.ts +0 -2
  488. package/dist/dts/internal/podsHealth.d.ts.map +0 -1
  489. package/dist/dts/internal/recipientBehaviour.d.ts +0 -2
  490. package/dist/dts/internal/recipientBehaviour.d.ts.map +0 -1
  491. package/dist/dts/internal/recipientBehaviourContext.d.ts +0 -2
  492. package/dist/dts/internal/recipientBehaviourContext.d.ts.map +0 -1
  493. package/dist/dts/internal/serialization.d.ts +0 -2
  494. package/dist/dts/internal/serialization.d.ts.map +0 -1
  495. package/dist/dts/internal/shardManagerClient.d.ts +0 -2
  496. package/dist/dts/internal/shardManagerClient.d.ts.map +0 -1
  497. package/dist/dts/internal/shardManagerState.d.ts +0 -26
  498. package/dist/dts/internal/shardManagerState.d.ts.map +0 -1
  499. package/dist/dts/internal/sharding.d.ts +0 -2
  500. package/dist/dts/internal/sharding.d.ts.map +0 -1
  501. package/dist/dts/internal/shardingConfig.d.ts +0 -2
  502. package/dist/dts/internal/shardingConfig.d.ts.map +0 -1
  503. package/dist/dts/internal/storage.d.ts +0 -2
  504. package/dist/dts/internal/storage.d.ts.map +0 -1
  505. package/dist/dts/internal/utils.d.ts +0 -2
  506. package/dist/dts/internal/utils.d.ts.map +0 -1
  507. package/dist/esm/AtLeastOnce.js +0 -12
  508. package/dist/esm/AtLeastOnce.js.map +0 -1
  509. package/dist/esm/AtLeastOnceStorage.js +0 -17
  510. package/dist/esm/AtLeastOnceStorage.js.map +0 -1
  511. package/dist/esm/Broadcaster.js +0 -2
  512. package/dist/esm/Broadcaster.js.map +0 -1
  513. package/dist/esm/ManagerConfig.js +0 -26
  514. package/dist/esm/ManagerConfig.js.map +0 -1
  515. package/dist/esm/MessageState.js +0 -47
  516. package/dist/esm/MessageState.js.map +0 -1
  517. package/dist/esm/Messenger.js +0 -2
  518. package/dist/esm/Messenger.js.map +0 -1
  519. package/dist/esm/Pod.js +0 -65
  520. package/dist/esm/Pod.js.map +0 -1
  521. package/dist/esm/PodAddress.js +0 -64
  522. package/dist/esm/PodAddress.js.map +0 -1
  523. package/dist/esm/Pods.js +0 -27
  524. package/dist/esm/Pods.js.map +0 -1
  525. package/dist/esm/PodsHealth.js +0 -33
  526. package/dist/esm/PodsHealth.js.map +0 -1
  527. package/dist/esm/PoisonPill.js +0 -65
  528. package/dist/esm/PoisonPill.js.map +0 -1
  529. package/dist/esm/RecipientAddress.js +0 -67
  530. package/dist/esm/RecipientAddress.js.map +0 -1
  531. package/dist/esm/RecipientBehaviour.js +0 -30
  532. package/dist/esm/RecipientBehaviour.js.map +0 -1
  533. package/dist/esm/RecipientBehaviourContext.js +0 -56
  534. package/dist/esm/RecipientBehaviourContext.js.map +0 -1
  535. package/dist/esm/RecipientType.js +0 -108
  536. package/dist/esm/RecipientType.js.map +0 -1
  537. package/dist/esm/Serialization.js +0 -24
  538. package/dist/esm/Serialization.js.map +0 -1
  539. package/dist/esm/SerializedEnvelope.js +0 -74
  540. package/dist/esm/SerializedEnvelope.js.map +0 -1
  541. package/dist/esm/SerializedMessage.js +0 -51
  542. package/dist/esm/SerializedMessage.js.map +0 -1
  543. package/dist/esm/ShardManagerClient.js +0 -22
  544. package/dist/esm/ShardManagerClient.js.map +0 -1
  545. package/dist/esm/ShardingEvent.js +0 -62
  546. package/dist/esm/ShardingEvent.js.map +0 -1
  547. package/dist/esm/ShardingException.js +0 -91
  548. package/dist/esm/ShardingException.js.map +0 -1
  549. package/dist/esm/Storage.js +0 -32
  550. package/dist/esm/Storage.js.map +0 -1
  551. package/dist/esm/internal/atLeastOnce.js +0 -26
  552. package/dist/esm/internal/atLeastOnce.js.map +0 -1
  553. package/dist/esm/internal/atLeastOnceStorage.js +0 -154
  554. package/dist/esm/internal/atLeastOnceStorage.js.map +0 -1
  555. package/dist/esm/internal/entityState.js +0 -35
  556. package/dist/esm/internal/entityState.js.map +0 -1
  557. package/dist/esm/internal/managerConfig.js +0 -38
  558. package/dist/esm/internal/managerConfig.js.map +0 -1
  559. package/dist/esm/internal/message.js +0 -35
  560. package/dist/esm/internal/message.js.map +0 -1
  561. package/dist/esm/internal/messageState.js +0 -66
  562. package/dist/esm/internal/messageState.js.map +0 -1
  563. package/dist/esm/internal/podWithMetadata.js +0 -41
  564. package/dist/esm/internal/podWithMetadata.js.map +0 -1
  565. package/dist/esm/internal/pods.js +0 -25
  566. package/dist/esm/internal/pods.js.map +0 -1
  567. package/dist/esm/internal/podsHealth.js +0 -30
  568. package/dist/esm/internal/podsHealth.js.map +0 -1
  569. package/dist/esm/internal/recipientBehaviour.js +0 -42
  570. package/dist/esm/internal/recipientBehaviour.js.map +0 -1
  571. package/dist/esm/internal/recipientBehaviourContext.js +0 -26
  572. package/dist/esm/internal/recipientBehaviourContext.js.map +0 -1
  573. package/dist/esm/internal/serialization.js +0 -38
  574. package/dist/esm/internal/serialization.js.map +0 -1
  575. package/dist/esm/internal/shardManagerClient.js +0 -38
  576. package/dist/esm/internal/shardManagerClient.js.map +0 -1
  577. package/dist/esm/internal/shardManagerState.js +0 -36
  578. package/dist/esm/internal/shardManagerState.js.map +0 -1
  579. package/dist/esm/internal/sharding.js +0 -288
  580. package/dist/esm/internal/sharding.js.map +0 -1
  581. package/dist/esm/internal/shardingConfig.js +0 -47
  582. package/dist/esm/internal/shardingConfig.js.map +0 -1
  583. package/dist/esm/internal/storage.js +0 -42
  584. package/dist/esm/internal/storage.js.map +0 -1
  585. package/dist/esm/internal/utils.js +0 -56
  586. package/dist/esm/internal/utils.js.map +0 -1
  587. package/src/AtLeastOnce.ts +0 -28
  588. package/src/AtLeastOnceStorage.ts +0 -96
  589. package/src/Broadcaster.ts +0 -48
  590. package/src/ManagerConfig.ts +0 -67
  591. package/src/MessageState.ts +0 -126
  592. package/src/Messenger.ts +0 -40
  593. package/src/Pod.ts +0 -95
  594. package/src/PodAddress.ts +0 -94
  595. package/src/Pods.ts +0 -100
  596. package/src/PodsHealth.ts +0 -74
  597. package/src/PoisonPill.ts +0 -105
  598. package/src/RecipientAddress.ts +0 -72
  599. package/src/RecipientBehaviour.ts +0 -108
  600. package/src/RecipientBehaviourContext.ts +0 -101
  601. package/src/RecipientType.ts +0 -134
  602. package/src/Serialization.ts +0 -72
  603. package/src/SerializedEnvelope.ts +0 -108
  604. package/src/SerializedMessage.ts +0 -82
  605. package/src/ShardManagerClient.ts +0 -57
  606. package/src/ShardingEvent.ts +0 -121
  607. package/src/ShardingException.ts +0 -151
  608. package/src/Storage.ts +0 -92
  609. package/src/internal/atLeastOnce.ts +0 -59
  610. package/src/internal/atLeastOnceStorage.ts +0 -218
  611. package/src/internal/entityState.ts +0 -64
  612. package/src/internal/managerConfig.ts +0 -84
  613. package/src/internal/message.ts +0 -63
  614. package/src/internal/messageState.ts +0 -98
  615. package/src/internal/podWithMetadata.ts +0 -72
  616. package/src/internal/pods.ts +0 -29
  617. package/src/internal/podsHealth.ts +0 -39
  618. package/src/internal/recipientBehaviour.ts +0 -133
  619. package/src/internal/recipientBehaviourContext.ts +0 -70
  620. package/src/internal/serialization.ts +0 -63
  621. package/src/internal/shardManagerClient.ts +0 -49
  622. package/src/internal/shardManagerState.ts +0 -80
  623. package/src/internal/sharding.ts +0 -789
  624. package/src/internal/shardingConfig.ts +0 -97
  625. package/src/internal/storage.ts +0 -60
  626. package/src/internal/utils.ts +0 -54
@@ -0,0 +1,658 @@
1
+ /**
2
+ * @since 1.0.0
3
+ */
4
+ import * as SqlClient from "@effect/sql/SqlClient";
5
+ import * as Arr from "effect/Array";
6
+ import * as Effect from "effect/Effect";
7
+ import * as Layer from "effect/Layer";
8
+ import * as Option from "effect/Option";
9
+ import * as Schedule from "effect/Schedule";
10
+ import { PersistenceError } from "./ClusterError.js";
11
+ import * as MessageStorage from "./MessageStorage.js";
12
+ import { SaveResultEncoded } from "./MessageStorage.js";
13
+ import * as Snowflake from "./Snowflake.js";
14
+ /**
15
+ * @since 1.0.0
16
+ * @category Constructors
17
+ */
18
+ export const make = /*#__PURE__*/Effect.fnUntraced(function* (options) {
19
+ const sql = (yield* SqlClient.SqlClient).withoutTransforms();
20
+ const prefix = options?.prefix ?? "cluster";
21
+ const table = name => `${prefix}_${name}`;
22
+ const messageKindAckChunk = sql.literal(String(messageKind.AckChunk));
23
+ const replyKindWithExit = sql.literal(String(replyKind.WithExit));
24
+ const messagesTable = table("messages");
25
+ const messagesTableSql = sql(messagesTable);
26
+ const repliesTable = table("replies");
27
+ const repliesTableSql = sql(repliesTable);
28
+ yield* sql.onDialectOrElse({
29
+ mssql: () => sql`
30
+ IF OBJECT_ID(N'${messagesTableSql}', N'U') IS NULL
31
+ CREATE TABLE ${messagesTableSql} (
32
+ id BIGINT PRIMARY KEY,
33
+ rowid BIGINT IDENTITY(1,1),
34
+ message_id VARCHAR(255),
35
+ shard_id INT NOT NULL,
36
+ entity_type VARCHAR(255) NOT NULL,
37
+ entity_id VARCHAR(255) NOT NULL,
38
+ kind INT NOT NULL,
39
+ tag VARCHAR(255),
40
+ payload TEXT,
41
+ headers TEXT,
42
+ trace_id VARCHAR(255),
43
+ span_id VARCHAR(255),
44
+ sampled BIT,
45
+ processed BIT NOT NULL DEFAULT 0,
46
+ request_id BIGINT NOT NULL,
47
+ reply_id BIGINT,
48
+ last_reply_id BIGINT,
49
+ last_read DATETIME,
50
+ deliver_at BIGINT,
51
+ UNIQUE (message_id),
52
+ FOREIGN KEY (request_id) REFERENCES ${messagesTableSql} (id) ON DELETE CASCADE
53
+ )
54
+ `,
55
+ mysql: () => sql`
56
+ CREATE TABLE IF NOT EXISTS ${messagesTableSql} (
57
+ id BIGINT NOT NULL,
58
+ rowid BIGINT NOT NULL AUTO_INCREMENT PRIMARY KEY,
59
+ message_id VARCHAR(255),
60
+ shard_id INT NOT NULL,
61
+ entity_type VARCHAR(255) NOT NULL,
62
+ entity_id VARCHAR(255) NOT NULL,
63
+ kind INT NOT NULL,
64
+ tag VARCHAR(255),
65
+ payload TEXT,
66
+ headers TEXT,
67
+ trace_id VARCHAR(255),
68
+ span_id VARCHAR(255),
69
+ sampled BOOLEAN,
70
+ processed BOOLEAN NOT NULL DEFAULT FALSE,
71
+ request_id BIGINT NOT NULL,
72
+ reply_id BIGINT,
73
+ last_reply_id BIGINT,
74
+ last_read DATETIME,
75
+ deliver_at BIGINT,
76
+ UNIQUE (id),
77
+ UNIQUE (message_id),
78
+ FOREIGN KEY (request_id) REFERENCES ${messagesTableSql} (id) ON DELETE CASCADE
79
+ )
80
+ `,
81
+ pg: () => sql`
82
+ CREATE TABLE IF NOT EXISTS ${messagesTableSql} (
83
+ id BIGINT PRIMARY KEY,
84
+ rowid BIGSERIAL,
85
+ message_id VARCHAR(255),
86
+ shard_id INT NOT NULL,
87
+ entity_type VARCHAR(255) NOT NULL,
88
+ entity_id VARCHAR(255) NOT NULL,
89
+ kind INT NOT NULL,
90
+ tag VARCHAR(255),
91
+ payload TEXT,
92
+ headers TEXT,
93
+ trace_id VARCHAR(255),
94
+ span_id VARCHAR(255),
95
+ sampled BOOLEAN,
96
+ processed BOOLEAN NOT NULL DEFAULT FALSE,
97
+ request_id BIGINT NOT NULL,
98
+ reply_id BIGINT,
99
+ last_reply_id BIGINT,
100
+ last_read TIMESTAMP,
101
+ deliver_at BIGINT,
102
+ UNIQUE (message_id),
103
+ FOREIGN KEY (request_id) REFERENCES ${messagesTableSql} (id) ON DELETE CASCADE
104
+ )
105
+ `.pipe(Effect.ignore),
106
+ orElse: () =>
107
+ // sqlite
108
+ sql`
109
+ CREATE TABLE IF NOT EXISTS ${messagesTableSql} (
110
+ id INTEGER PRIMARY KEY,
111
+ message_id TEXT,
112
+ shard_id INTEGER NOT NULL,
113
+ entity_type TEXT NOT NULL,
114
+ entity_id TEXT NOT NULL,
115
+ kind INTEGER NOT NULL,
116
+ tag TEXT,
117
+ payload TEXT,
118
+ headers TEXT,
119
+ trace_id TEXT,
120
+ span_id TEXT,
121
+ sampled BOOLEAN,
122
+ processed BOOLEAN NOT NULL DEFAULT FALSE,
123
+ request_id INTEGER NOT NULL,
124
+ reply_id INTEGER,
125
+ last_reply_id INTEGER,
126
+ last_read TEXT,
127
+ deliver_at INTEGER,
128
+ UNIQUE (message_id),
129
+ FOREIGN KEY (request_id) REFERENCES ${messagesTableSql} (id) ON DELETE CASCADE
130
+ )
131
+ `
132
+ });
133
+ // Add message indexes optimized for the specific query patterns
134
+ const shardLookupIndex = `${messagesTable}_shard_idx`;
135
+ const requestIdLookupIndex = `${messagesTable}_request_id_idx`;
136
+ yield* sql.onDialectOrElse({
137
+ mssql: () => sql`
138
+ IF NOT EXISTS (SELECT * FROM sys.indexes WHERE name = ${shardLookupIndex})
139
+ CREATE INDEX ${sql(shardLookupIndex)}
140
+ ON ${messagesTableSql} (shard_id, processed, last_read, deliver_at);
141
+
142
+ IF NOT EXISTS (SELECT * FROM sys.indexes WHERE name = ${requestIdLookupIndex})
143
+ CREATE INDEX ${sql(requestIdLookupIndex)}
144
+ ON ${messagesTableSql} (request_id);
145
+ `,
146
+ mysql: () => sql`
147
+ CREATE INDEX ${sql(shardLookupIndex)}
148
+ ON ${messagesTableSql} (shard_id, processed, last_read, deliver_at);
149
+
150
+ CREATE INDEX ${sql(requestIdLookupIndex)}
151
+ ON ${messagesTableSql} (request_id);
152
+ `.unprepared.pipe(Effect.ignore),
153
+ pg: () => sql`
154
+ CREATE INDEX IF NOT EXISTS ${sql(shardLookupIndex)}
155
+ ON ${messagesTableSql} (shard_id, processed, last_read, deliver_at);
156
+
157
+ CREATE INDEX IF NOT EXISTS ${sql(requestIdLookupIndex)}
158
+ ON ${messagesTableSql} (request_id);
159
+ `.pipe(Effect.tapDefect(error => Effect.annotateLogs(Effect.logDebug("Failed to create indexes", error), {
160
+ package: "@effect/cluster",
161
+ module: "SqlMessageStorage"
162
+ })), Effect.retry({
163
+ schedule: Schedule.spaced(1000)
164
+ })),
165
+ orElse: () =>
166
+ // sqlite
167
+ Effect.all([sql`
168
+ CREATE INDEX IF NOT EXISTS ${sql(shardLookupIndex)}
169
+ ON ${messagesTableSql} (shard_id, processed, last_read, deliver_at)
170
+ `, sql`
171
+ CREATE INDEX IF NOT EXISTS ${sql(requestIdLookupIndex)}
172
+ ON ${messagesTableSql} (request_id)
173
+ `]).pipe(sql.withTransaction)
174
+ });
175
+ yield* sql.onDialectOrElse({
176
+ mssql: () => sql`
177
+ IF OBJECT_ID(N'${repliesTableSql}', N'U') IS NULL
178
+ CREATE TABLE ${repliesTableSql} (
179
+ id BIGINT PRIMARY KEY,
180
+ rowid BIGINT IDENTITY(1,1),
181
+ kind INT,
182
+ request_id BIGINT NOT NULL,
183
+ payload TEXT NOT NULL,
184
+ sequence INT,
185
+ acked BIT NOT NULL DEFAULT 0,
186
+ CONSTRAINT ${sql(repliesTable + "_one_exit")} UNIQUE (request_id, kind),
187
+ CONSTRAINT ${sql(repliesTable + "_sequence")} UNIQUE (request_id, sequence),
188
+ FOREIGN KEY (request_id) REFERENCES ${messagesTableSql} (id) ON DELETE CASCADE
189
+ )
190
+ `,
191
+ mysql: () => sql`
192
+ CREATE TABLE IF NOT EXISTS ${repliesTableSql} (
193
+ id BIGINT NOT NULL,
194
+ rowid BIGINT AUTO_INCREMENT PRIMARY KEY,
195
+ kind INT,
196
+ request_id BIGINT NOT NULL,
197
+ payload TEXT NOT NULL,
198
+ sequence INT,
199
+ acked BOOLEAN NOT NULL DEFAULT FALSE,
200
+ UNIQUE (id),
201
+ UNIQUE (request_id, kind),
202
+ UNIQUE (request_id, sequence),
203
+ FOREIGN KEY (request_id) REFERENCES ${messagesTableSql} (id) ON DELETE CASCADE
204
+ )
205
+ `,
206
+ pg: () => sql`
207
+ CREATE TABLE IF NOT EXISTS ${repliesTableSql} (
208
+ id BIGINT PRIMARY KEY,
209
+ rowid BIGSERIAL,
210
+ kind INT,
211
+ request_id BIGINT NOT NULL,
212
+ payload TEXT NOT NULL,
213
+ sequence INT,
214
+ acked BOOLEAN NOT NULL DEFAULT FALSE,
215
+ UNIQUE (request_id, kind),
216
+ UNIQUE (request_id, sequence),
217
+ FOREIGN KEY (request_id) REFERENCES ${messagesTableSql} (id) ON DELETE CASCADE
218
+ )
219
+ `,
220
+ orElse: () =>
221
+ // sqlite
222
+ sql`
223
+ CREATE TABLE IF NOT EXISTS ${repliesTableSql} (
224
+ id INTEGER PRIMARY KEY,
225
+ kind INTEGER,
226
+ request_id INTEGER NOT NULL,
227
+ payload TEXT NOT NULL,
228
+ sequence INTEGER,
229
+ acked BOOLEAN NOT NULL DEFAULT FALSE,
230
+ UNIQUE (request_id, kind),
231
+ UNIQUE (request_id, sequence),
232
+ FOREIGN KEY (request_id) REFERENCES ${messagesTableSql} (id) ON DELETE CASCADE
233
+ )
234
+ `
235
+ });
236
+ // Add reply indexes optimized for request_id lookups
237
+ const replyLookupIndex = `${repliesTable}_request_lookup_idx`;
238
+ yield* sql.onDialectOrElse({
239
+ mssql: () => sql`
240
+ IF NOT EXISTS (SELECT * FROM sys.indexes WHERE name = ${replyLookupIndex})
241
+ CREATE INDEX ${sql(replyLookupIndex)}
242
+ ON ${repliesTableSql} (request_id, kind, acked);
243
+ `,
244
+ mysql: () => sql`
245
+ CREATE INDEX ${sql(replyLookupIndex)}
246
+ ON ${repliesTableSql} (request_id, kind, acked);
247
+ `.unprepared.pipe(Effect.ignore),
248
+ pg: () => sql`
249
+ CREATE INDEX IF NOT EXISTS ${sql(replyLookupIndex)}
250
+ ON ${repliesTableSql} (request_id, kind, acked);
251
+ `.pipe(Effect.tapDefect(error => Effect.annotateLogs(Effect.logDebug("Failed to create indexes", error), {
252
+ package: "@effect/cluster",
253
+ module: "SqlMessageStorage"
254
+ })), Effect.retry({
255
+ schedule: Schedule.spaced(1000)
256
+ })),
257
+ orElse: () =>
258
+ // sqlite
259
+ sql`
260
+ CREATE INDEX IF NOT EXISTS ${sql(replyLookupIndex)}
261
+ ON ${repliesTableSql} (request_id, kind, acked);
262
+ `
263
+ });
264
+ const envelopeToRow = (envelope, message_id, deliver_at) => {
265
+ switch (envelope._tag) {
266
+ case "Request":
267
+ return {
268
+ id: envelope.requestId,
269
+ message_id,
270
+ shard_id: envelope.address.shardId,
271
+ entity_type: envelope.address.entityType,
272
+ entity_id: envelope.address.entityId,
273
+ kind: messageKind.Request,
274
+ tag: envelope.tag,
275
+ payload: JSON.stringify(envelope.payload),
276
+ headers: JSON.stringify(envelope.headers),
277
+ trace_id: envelope.traceId,
278
+ span_id: envelope.spanId,
279
+ sampled: supportsBooleans ? envelope.sampled : envelope.sampled ? 1 : 0,
280
+ request_id: envelope.requestId,
281
+ reply_id: null,
282
+ deliver_at
283
+ };
284
+ case "AckChunk":
285
+ return {
286
+ id: envelope.id,
287
+ message_id,
288
+ shard_id: envelope.address.shardId,
289
+ entity_type: envelope.address.entityType,
290
+ entity_id: envelope.address.entityId,
291
+ kind: messageKind.AckChunk,
292
+ tag: null,
293
+ payload: null,
294
+ headers: null,
295
+ trace_id: null,
296
+ span_id: null,
297
+ sampled: null,
298
+ request_id: envelope.requestId,
299
+ reply_id: envelope.replyId,
300
+ deliver_at
301
+ };
302
+ case "Interrupt":
303
+ return {
304
+ id: envelope.id,
305
+ message_id,
306
+ shard_id: envelope.address.shardId,
307
+ entity_type: envelope.address.entityType,
308
+ entity_id: envelope.address.entityId,
309
+ kind: messageKind.Interrupt,
310
+ payload: null,
311
+ tag: null,
312
+ headers: null,
313
+ trace_id: null,
314
+ span_id: null,
315
+ sampled: null,
316
+ request_id: envelope.requestId,
317
+ reply_id: null,
318
+ deliver_at
319
+ };
320
+ }
321
+ };
322
+ const replyToRow = reply => ({
323
+ id: reply.id,
324
+ kind: replyKind[reply._tag],
325
+ request_id: reply.requestId,
326
+ payload: reply._tag === "WithExit" ? JSON.stringify(reply.exit) : JSON.stringify(reply.values),
327
+ sequence: reply._tag === "Chunk" ? reply.sequence : null
328
+ });
329
+ const supportsBooleans = sql.onDialectOrElse({
330
+ mssql: () => false,
331
+ sqlite: () => false,
332
+ orElse: () => true
333
+ });
334
+ const messageFromRow = row => {
335
+ switch (Number(row.kind)) {
336
+ case 0:
337
+ return {
338
+ envelope: {
339
+ _tag: "Request",
340
+ requestId: String(row.id),
341
+ address: {
342
+ shardId: Number(row.shard_id),
343
+ entityType: row.entity_type,
344
+ entityId: row.entity_id
345
+ },
346
+ tag: row.tag,
347
+ payload: JSON.parse(row.payload),
348
+ headers: JSON.parse(row.headers),
349
+ traceId: row.trace_id,
350
+ spanId: row.span_id,
351
+ sampled: !!row.sampled
352
+ },
353
+ lastSentReply: row.reply_reply_id ? Option.some({
354
+ _tag: "Chunk",
355
+ id: String(row.reply_reply_id),
356
+ requestId: String(row.request_id),
357
+ sequence: Number(row.reply_sequence),
358
+ values: JSON.parse(row.reply_payload)
359
+ }) : Option.none()
360
+ };
361
+ case 1:
362
+ return {
363
+ envelope: {
364
+ _tag: "AckChunk",
365
+ id: String(row.id),
366
+ requestId: String(row.request_id),
367
+ replyId: String(row.reply_id),
368
+ address: {
369
+ shardId: Number(row.shard_id),
370
+ entityType: row.entity_type,
371
+ entityId: row.entity_id
372
+ }
373
+ },
374
+ lastSentReply: Option.none()
375
+ };
376
+ case 2:
377
+ return {
378
+ envelope: {
379
+ _tag: "Interrupt",
380
+ id: String(row.id),
381
+ requestId: String(row.request_id),
382
+ address: {
383
+ shardId: Number(row.shard_id),
384
+ entityType: row.entity_type,
385
+ entityId: row.entity_id
386
+ }
387
+ },
388
+ lastSentReply: Option.none()
389
+ };
390
+ }
391
+ };
392
+ const sqlFalse = sql.literal(supportsBooleans ? "FALSE" : "0");
393
+ const sqlTrue = sql.literal(supportsBooleans ? "TRUE" : "1");
394
+ const insertEnvelope = sql.onDialectOrElse({
395
+ pg: () => (row, message_id) => sql`
396
+ WITH inserted AS (
397
+ INSERT INTO ${messagesTableSql} ${sql.insert(row)}
398
+ ON CONFLICT (message_id) DO NOTHING
399
+ RETURNING id
400
+ ),
401
+ existing AS (
402
+ SELECT m.id, r.id as reply_id, r.kind as reply_kind, r.payload as reply_payload, r.sequence as reply_sequence
403
+ FROM ${messagesTableSql} m
404
+ LEFT JOIN ${repliesTableSql} r ON r.id = m.last_reply_id
405
+ WHERE m.message_id = ${message_id}
406
+ AND NOT EXISTS (SELECT 1 FROM inserted)
407
+ )
408
+ SELECT * FROM existing
409
+ `,
410
+ mysql: () => (row, message_id) => sql`
411
+ SELECT m.id, r.id as reply_id, r.kind as reply_kind, r.payload as reply_payload, r.sequence as reply_sequence
412
+ FROM ${messagesTableSql} m
413
+ LEFT JOIN ${repliesTableSql} r ON r.id = m.last_reply_id
414
+ WHERE m.message_id = ${message_id};
415
+ INSERT INTO ${messagesTableSql} ${sql.insert(row)}
416
+ ON DUPLICATE KEY UPDATE id = id;
417
+ `.unprepared.pipe(
418
+ // we need 2 queries for mysql, so we need to run them in a
419
+ // transaction with retries
420
+ sql.withTransaction, Effect.retry({
421
+ times: 3
422
+ }), Effect.map(([rows]) => rows)),
423
+ mssql: () => (row, message_id) => sql`
424
+ MERGE ${messagesTableSql} WITH (HOLDLOCK) AS target
425
+ USING (SELECT ${message_id} as message_id) AS source
426
+ ON target.message_id = source.message_id
427
+ WHEN NOT MATCHED THEN
428
+ INSERT ${sql.insert(row)}
429
+ OUTPUT
430
+ inserted.id,
431
+ CASE
432
+ WHEN inserted.id IS NULL THEN (
433
+ SELECT r.id, r.kind, r.payload
434
+ FROM ${repliesTableSql} r
435
+ WHERE r.id = target.last_reply_id
436
+ )
437
+ END as reply_id,
438
+ CASE
439
+ WHEN inserted.id IS NULL THEN (
440
+ SELECT r.kind
441
+ FROM ${repliesTableSql} r
442
+ WHERE r.id = target.last_reply_id
443
+ )
444
+ END as reply_kind,
445
+ CASE
446
+ WHEN inserted.id IS NULL THEN (
447
+ SELECT r.payload
448
+ FROM ${repliesTableSql} r
449
+ WHERE r.id = target.last_reply_id
450
+ )
451
+ END as reply_payload,
452
+ CASE
453
+ WHEN inserted.id IS NULL THEN (
454
+ SELECT r.sequence
455
+ FROM ${repliesTableSql} r
456
+ WHERE r.id = target.last_reply_id
457
+ )
458
+ END as reply_sequence;
459
+ `,
460
+ orElse: () => (row, message_id) => sql`
461
+ SELECT m.id, r.id as reply_id, r.kind as reply_kind, r.payload as reply_payload, r.sequence as reply_sequence
462
+ FROM ${messagesTableSql} m
463
+ LEFT JOIN ${repliesTableSql} r ON r.id = m.last_reply_id
464
+ WHERE m.message_id = ${message_id}
465
+ `.pipe(Effect.tap(sql`INSERT OR IGNORE INTO ${messagesTableSql} ${sql.insert(row)}`), sql.withTransaction, Effect.retry({
466
+ times: 3
467
+ }))
468
+ });
469
+ const fiveMinutesAgo = sql.onDialectOrElse({
470
+ mssql: () => sql.literal(`DATEADD(MINUTE, -5, GETDATE())`),
471
+ mysql: () => sql.literal(`NOW() - INTERVAL 5 MINUTE`),
472
+ pg: () => sql.literal(`NOW() - INTERVAL '5 minutes'`),
473
+ orElse: () => sql.literal(`DATETIME('now', '-5 minute')`)
474
+ });
475
+ const sqlNowString = sql.onDialectOrElse({
476
+ pg: () => "NOW()",
477
+ mysql: () => "NOW()",
478
+ mssql: () => "GETDATE()",
479
+ orElse: () => "CURRENT_TIMESTAMP"
480
+ });
481
+ const sqlNow = sql.literal(sqlNowString);
482
+ const getUnprocessedMessages = sql.onDialectOrElse({
483
+ pg: () => (shardIds, now) => sql`
484
+ UPDATE ${messagesTableSql} m
485
+ SET last_read = ${sqlNow}
486
+ FROM (
487
+ SELECT m.*
488
+ FROM ${messagesTableSql} m
489
+ WHERE m.shard_id IN (${sql.literal(shardIds.map(String).join(","))})
490
+ AND NOT EXISTS (
491
+ SELECT 1 FROM ${repliesTableSql}
492
+ WHERE request_id = m.request_id
493
+ AND (kind = ${replyKindWithExit} OR acked = ${sqlFalse})
494
+ )
495
+ AND m.processed = ${sqlFalse}
496
+ AND (m.last_read IS NULL OR m.last_read < ${fiveMinutesAgo})
497
+ AND (m.deliver_at IS NULL OR m.deliver_at <= ${sql.literal(String(now))})
498
+ ORDER BY m.rowid ASC
499
+ FOR UPDATE
500
+ ) AS ids
501
+ LEFT JOIN ${repliesTableSql} r ON r.id = ids.last_reply_id
502
+ WHERE m.id = ids.id
503
+ RETURNING ids.*, r.id as reply_reply_id, r.kind as reply_kind, r.payload as reply_payload, r.sequence as reply_sequence
504
+ `,
505
+ orElse: () => (shardIds, now) => sql`
506
+ SELECT m.*, r.id as reply_reply_id, r.kind as reply_kind, r.payload as reply_payload, r.sequence as reply_sequence
507
+ FROM ${messagesTableSql} m
508
+ LEFT JOIN ${repliesTableSql} r ON r.id = m.last_reply_id
509
+ WHERE m.shard_id IN (${sql.literal(shardIds.map(String).join(","))})
510
+ AND NOT EXISTS (
511
+ SELECT 1 FROM ${repliesTableSql}
512
+ WHERE request_id = m.request_id
513
+ AND (kind = ${replyKindWithExit} OR acked = ${sqlFalse})
514
+ )
515
+ AND processed = ${sqlFalse}
516
+ AND (m.last_read IS NULL OR m.last_read < ${fiveMinutesAgo})
517
+ AND (m.deliver_at IS NULL OR m.deliver_at <= ${sql.literal(String(now))})
518
+ ORDER BY m.rowid ASC
519
+ `.unprepared.pipe(Effect.tap(rows => {
520
+ if (rows.length === 0) {
521
+ return Effect.void;
522
+ }
523
+ return sql`
524
+ UPDATE ${messagesTableSql}
525
+ SET last_read = ${sqlNow}
526
+ WHERE id IN (${sql.literal(rows.map(row => row.id).join(","))})
527
+ `.unprepared;
528
+ }), sql.withTransaction)
529
+ });
530
+ return yield* MessageStorage.makeEncoded({
531
+ saveEnvelope: ({
532
+ deliverAt,
533
+ envelope,
534
+ primaryKey
535
+ }) => Effect.suspend(() => {
536
+ const row = envelopeToRow(envelope, primaryKey, deliverAt);
537
+ let insert = primaryKey ? insertEnvelope(row, primaryKey) : Effect.as(sql`INSERT INTO ${messagesTableSql} ${sql.insert(row)}`.unprepared, []);
538
+ if (envelope._tag === "AckChunk") {
539
+ insert = sql`UPDATE ${repliesTableSql} SET acked = ${sqlTrue} WHERE id = ${envelope.replyId}`.pipe(Effect.andThen(sql`UPDATE ${messagesTableSql} SET processed = ${sqlTrue} WHERE processed = ${sqlFalse} AND request_id = ${envelope.requestId} AND kind = ${messageKindAckChunk}`), Effect.andThen(insert), sql.withTransaction);
540
+ }
541
+ return insert.pipe(Effect.map(rows => {
542
+ if (rows.length === 0) {
543
+ return SaveResultEncoded.Success();
544
+ }
545
+ const row = rows[0];
546
+ return SaveResultEncoded.Duplicate({
547
+ originalId: Snowflake.Snowflake(row.id),
548
+ lastReceivedReply: row.reply_id ? Option.some({
549
+ id: String(row.reply_id),
550
+ requestId: String(row.id),
551
+ _tag: row.reply_kind === replyKind.WithExit ? "WithExit" : "Chunk",
552
+ ...(row.reply_kind === replyKind.WithExit ? {
553
+ exit: JSON.parse(row.reply_payload)
554
+ } : {
555
+ sequence: Number(row.reply_sequence),
556
+ values: JSON.parse(row.reply_payload)
557
+ })
558
+ }) : Option.none()
559
+ });
560
+ }));
561
+ }).pipe(Effect.provideService(SqlClient.SafeIntegers, true), PersistenceError.refail),
562
+ saveReply: reply => Effect.suspend(() => {
563
+ const row = replyToRow(reply);
564
+ const update = reply._tag === "Chunk" ? sql`UPDATE ${messagesTableSql} SET last_reply_id = ${reply.id} WHERE id = ${reply.requestId}` : sql`UPDATE ${messagesTableSql} SET processed = ${sqlTrue}, last_reply_id = NULL WHERE request_id = ${reply.requestId}`;
565
+ return update.unprepared.pipe(Effect.andThen(sql`INSERT INTO ${repliesTableSql} ${sql.insert(row)}`), sql.withTransaction);
566
+ }).pipe(Effect.asVoid, PersistenceError.refail),
567
+ repliesFor: requestIds =>
568
+ // replies where:
569
+ // - the request is in the list
570
+ // - the kind is WithExit
571
+ // - or the kind is Chunk and has not been acked yet
572
+ sql`
573
+ SELECT id, kind, request_id, payload, sequence
574
+ FROM ${repliesTableSql}
575
+ WHERE request_id IN (${sql.literal(requestIds.join(","))})
576
+ AND (
577
+ kind = ${replyKindWithExit}
578
+ OR (
579
+ kind IS NULL
580
+ AND acked = ${sqlFalse}
581
+ )
582
+ )
583
+ ORDER BY rowid ASC
584
+ `.unprepared.pipe(Effect.provideService(SqlClient.SafeIntegers, true), Effect.map(Arr.map(row => row.kind === replyKind.WithExit ? {
585
+ _tag: "WithExit",
586
+ id: String(row.id),
587
+ requestId: String(row.request_id),
588
+ exit: JSON.parse(row.payload)
589
+ } : {
590
+ _tag: "Chunk",
591
+ id: String(row.id),
592
+ requestId: String(row.request_id),
593
+ values: JSON.parse(row.payload),
594
+ sequence: Number(row.sequence)
595
+ })), PersistenceError.refail),
596
+ unprocessedMessages: Effect.fnUntraced(function* (shardIds, now) {
597
+ const rows = yield* getUnprocessedMessages(shardIds, now);
598
+ if (rows.length === 0) {
599
+ return [];
600
+ }
601
+ const messages = new Array(rows.length);
602
+ const ids = new Array(rows.length);
603
+ for (let i = 0; i < rows.length; i++) {
604
+ messages[i] = messageFromRow(rows[i]);
605
+ ids[i] = String(rows[i].id);
606
+ }
607
+ return messages;
608
+ }, Effect.provideService(SqlClient.SafeIntegers, true), PersistenceError.refail),
609
+ unprocessedMessagesById(ids, now) {
610
+ const idArr = Array.from(ids, id => String(id));
611
+ return sql`
612
+ SELECT m.*, r.id as reply_id, r.kind as reply_kind, r.payload as reply_payload, r.sequence as reply_sequence
613
+ FROM ${messagesTableSql} m
614
+ LEFT JOIN ${repliesTableSql} r ON r.id = m.last_reply_id
615
+ WHERE m.id IN (${sql.literal(idArr.join(","))})
616
+ AND NOT EXISTS (
617
+ SELECT 1 FROM ${repliesTableSql}
618
+ WHERE request_id = m.request_id
619
+ AND (kind = ${replyKindWithExit} OR acked = ${sqlFalse})
620
+ )
621
+ AND m.processed = ${sqlFalse}
622
+ AND (m.deliver_at IS NULL OR m.deliver_at <= ${sql.literal(String(now))})
623
+ ORDER BY m.rowid ASC
624
+ `.unprepared.pipe(Effect.map(Arr.map(messageFromRow)), Effect.provideService(SqlClient.SafeIntegers, true), PersistenceError.refail);
625
+ },
626
+ resetAddress: address => sql`
627
+ UPDATE ${messagesTableSql}
628
+ SET last_read = NULL
629
+ WHERE processed = ${sqlFalse}
630
+ AND shard_id = ${address.shardId}
631
+ AND entity_type = ${address.entityType}
632
+ AND entity_id = ${address.entityId}
633
+ `.pipe(Effect.asVoid, PersistenceError.refail)
634
+ });
635
+ });
636
+ /**
637
+ * @since 1.0.0
638
+ * @category Layers
639
+ */
640
+ export const layer = /*#__PURE__*/Layer.scoped(MessageStorage.MessageStorage, make()).pipe( /*#__PURE__*/Layer.provide(Snowflake.layerGenerator));
641
+ /**
642
+ * @since 1.0.0
643
+ * @category Layers
644
+ */
645
+ export const layerWith = options => Layer.scoped(MessageStorage.MessageStorage, make(options)).pipe(Layer.provide(Snowflake.layerGenerator));
646
+ // -------------------------------------------------------------------------------------------------
647
+ // internal
648
+ // -------------------------------------------------------------------------------------------------
649
+ const messageKind = {
650
+ "Request": 0,
651
+ "AckChunk": 1,
652
+ "Interrupt": 2
653
+ };
654
+ const replyKind = {
655
+ "WithExit": 0,
656
+ "Chunk": null
657
+ };
658
+ //# sourceMappingURL=SqlMessageStorage.js.map