@effect/cluster 0.28.4 → 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,697 @@
1
+ /**
2
+ * @since 1.0.0
3
+ */
4
+ import type * as Rpc from "@effect/rpc/Rpc"
5
+ import * as Arr from "effect/Array"
6
+ import * as Context from "effect/Context"
7
+ import * as Data from "effect/Data"
8
+ import * as Effect from "effect/Effect"
9
+ import * as Exit from "effect/Exit"
10
+ import * as FiberRef from "effect/FiberRef"
11
+ import { globalValue } from "effect/GlobalValue"
12
+ import * as Iterable from "effect/Iterable"
13
+ import * as Layer from "effect/Layer"
14
+ import * as Option from "effect/Option"
15
+ import type { ParseError } from "effect/ParseResult"
16
+ import type { Predicate } from "effect/Predicate"
17
+ import * as Schema from "effect/Schema"
18
+ import type { PersistenceError } from "./ClusterError.js"
19
+ import { MalformedMessage } from "./ClusterError.js"
20
+ import * as DeliverAt from "./DeliverAt.js"
21
+ import type { EntityAddress } from "./EntityAddress.js"
22
+ import * as Envelope from "./Envelope.js"
23
+ import * as Message from "./Message.js"
24
+ import * as Reply from "./Reply.js"
25
+ import type { ShardId } from "./ShardId.js"
26
+ import type { ShardingConfig } from "./ShardingConfig.js"
27
+ import * as Snowflake from "./Snowflake.js"
28
+
29
+ /**
30
+ * @since 1.0.0
31
+ * @category context
32
+ */
33
+ export class MessageStorage extends Context.Tag("@effect/cluster/MessageStorage")<MessageStorage, {
34
+ /**
35
+ * Save the provided message and its associated metadata.
36
+ */
37
+ readonly saveRequest: <R extends Rpc.Any>(
38
+ envelope: Message.OutgoingRequest<R>
39
+ ) => Effect.Effect<SaveResult<R>, PersistenceError | MalformedMessage>
40
+
41
+ /**
42
+ * Save the provided message and its associated metadata.
43
+ */
44
+ readonly saveEnvelope: (
45
+ envelope: Message.OutgoingEnvelope
46
+ ) => Effect.Effect<void, PersistenceError | MalformedMessage>
47
+
48
+ /**
49
+ * Save the provided `Reply` and its associated metadata.
50
+ */
51
+ readonly saveReply: <R extends Rpc.Any>(
52
+ reply: Reply.ReplyWithContext<R>
53
+ ) => Effect.Effect<void, PersistenceError | MalformedMessage>
54
+
55
+ /**
56
+ * Retrieves the replies for the specified requests.
57
+ *
58
+ * - Un-acknowledged chunk replies
59
+ * - WithExit replies
60
+ */
61
+ readonly repliesFor: <R extends Rpc.Any>(
62
+ requests: Iterable<Message.OutgoingRequest<R>>
63
+ ) => Effect.Effect<Array<Reply.Reply<R>>, PersistenceError | MalformedMessage>
64
+
65
+ /**
66
+ * For locally sent messages, register a handler to process the replies.
67
+ */
68
+ readonly registerReplyHandler: <R extends Rpc.Any>(message: Message.OutgoingRequest<R>) => Effect.Effect<void>
69
+
70
+ /**
71
+ * Retrieves the unprocessed messages for the specified shards.
72
+ *
73
+ * A message is unprocessed when:
74
+ *
75
+ * - Requests that have no WithExit replies
76
+ * - Or they have no unacknowledged chunk replies
77
+ * - The latest AckChunk envelope
78
+ * - All Interrupt's for unprocessed requests
79
+ */
80
+ readonly unprocessedMessages: (
81
+ shardIds: Iterable<ShardId>
82
+ ) => Effect.Effect<Array<Message.Incoming<any>>, PersistenceError>
83
+
84
+ /**
85
+ * Retrieves the unprocessed messages by id.
86
+ */
87
+ readonly unprocessedMessagesById: <R extends Rpc.Any>(
88
+ messageIds: Iterable<Snowflake.Snowflake>
89
+ ) => Effect.Effect<Array<Message.Incoming<R>>, PersistenceError>
90
+
91
+ /**
92
+ * Reset the mailbox state for the provided address.
93
+ */
94
+ readonly resetAddress: (
95
+ address: EntityAddress
96
+ ) => Effect.Effect<void, PersistenceError>
97
+ }>() {}
98
+
99
+ /**
100
+ * @since 1.0.0
101
+ * @category SaveResult
102
+ */
103
+ export type SaveResult<R extends Rpc.Any> = SaveResult.Success | SaveResult.Duplicate<R>
104
+
105
+ /**
106
+ * @since 1.0.0
107
+ * @category SaveResult
108
+ */
109
+ export const SaveResult = Data.taggedEnum<SaveResult.Constructor>()
110
+
111
+ /**
112
+ * @since 1.0.0
113
+ * @category SaveResult
114
+ */
115
+ export const SaveResultEncoded = Data.taggedEnum<SaveResult.Encoded>()
116
+
117
+ /**
118
+ * @since 1.0.0
119
+ * @category SaveResult
120
+ */
121
+ export declare namespace SaveResult {
122
+ /**
123
+ * @since 1.0.0
124
+ * @category SaveResult
125
+ */
126
+ export type Encoded = SaveResult.Success | SaveResult.DuplicateEncoded
127
+
128
+ /**
129
+ * @since 1.0.0
130
+ * @category SaveResult
131
+ */
132
+ export interface Success {
133
+ readonly _tag: "Success"
134
+ }
135
+
136
+ /**
137
+ * @since 1.0.0
138
+ * @category SaveResult
139
+ */
140
+ export interface Duplicate<R extends Rpc.Any> {
141
+ readonly _tag: "Duplicate"
142
+ readonly originalId: Snowflake.Snowflake
143
+ readonly lastReceivedReply: Option.Option<Reply.Reply<R>>
144
+ }
145
+
146
+ /**
147
+ * @since 1.0.0
148
+ * @category SaveResult
149
+ */
150
+ export interface DuplicateEncoded {
151
+ readonly _tag: "Duplicate"
152
+ readonly originalId: Snowflake.Snowflake
153
+ readonly lastReceivedReply: Option.Option<Reply.ReplyEncoded<any>>
154
+ }
155
+
156
+ /**
157
+ * @since 1.0.0
158
+ * @category SaveResult
159
+ */
160
+ export interface Constructor extends Data.TaggedEnum.WithGenerics<1> {
161
+ readonly taggedEnum: SaveResult<this["A"]>
162
+ }
163
+ }
164
+
165
+ /**
166
+ * @since 1.0.0
167
+ * @category Encoded
168
+ */
169
+ export type Encoded = {
170
+ /**
171
+ * Save the provided message and its associated metadata.
172
+ */
173
+ readonly saveEnvelope: (
174
+ options: {
175
+ readonly envelope: Envelope.Envelope.Encoded
176
+ readonly primaryKey: string | null
177
+ readonly deliverAt: number | null
178
+ }
179
+ ) => Effect.Effect<SaveResult.Encoded, PersistenceError>
180
+
181
+ /**
182
+ * Save the provided `Reply` and its associated metadata.
183
+ */
184
+ readonly saveReply: (
185
+ reply: Reply.ReplyEncoded<any>
186
+ ) => Effect.Effect<void, PersistenceError>
187
+
188
+ /**
189
+ * Retrieves the replies for the specified requests.
190
+ *
191
+ * - Un-acknowledged chunk replies
192
+ * - WithExit replies
193
+ */
194
+ readonly repliesFor: (requestIds: Array<string>) => Effect.Effect<
195
+ Array<Reply.ReplyEncoded<any>>,
196
+ PersistenceError
197
+ >
198
+
199
+ /**
200
+ * Retrieves the unprocessed messages for the given shards.
201
+ *
202
+ * A message is unprocessed when:
203
+ *
204
+ * - Requests that have no WithExit replies
205
+ * - Or they have no unacknowledged chunk replies
206
+ * - The latest AckChunk envelope
207
+ * - All Interrupt's for unprocessed requests
208
+ */
209
+ readonly unprocessedMessages: (
210
+ shardIds: ReadonlyArray<number>,
211
+ now: number
212
+ ) => Effect.Effect<
213
+ Array<{
214
+ readonly envelope: Envelope.Envelope.Encoded
215
+ readonly lastSentReply: Option.Option<Reply.ReplyEncoded<any>>
216
+ }>,
217
+ PersistenceError
218
+ >
219
+
220
+ /**
221
+ * Retrieves the unprocessed messages by id.
222
+ */
223
+ readonly unprocessedMessagesById: (
224
+ messageIds: ReadonlyArray<Snowflake.Snowflake>,
225
+ now: number
226
+ ) => Effect.Effect<
227
+ Array<{
228
+ readonly envelope: Envelope.Envelope.Encoded
229
+ readonly lastSentReply: Option.Option<Reply.ReplyEncoded<any>>
230
+ }>,
231
+ PersistenceError
232
+ >
233
+
234
+ /**
235
+ * Reset the mailbox state for the provided address.
236
+ */
237
+ readonly resetAddress: (
238
+ address: EntityAddress
239
+ ) => Effect.Effect<void, PersistenceError>
240
+ }
241
+
242
+ /**
243
+ * @since 1.0.0
244
+ * @category Encoded
245
+ */
246
+ export type EncodedUnprocessedOptions<A> = {
247
+ readonly existingShards: Array<number>
248
+ readonly newShards: Array<number>
249
+ readonly cursor: Option.Option<A>
250
+ }
251
+
252
+ /**
253
+ * @since 1.0.0
254
+ * @category Encoded
255
+ */
256
+ export type EncodedRepliesOptions<A> = {
257
+ readonly existingRequests: Array<string>
258
+ readonly newRequests: Array<string>
259
+ readonly cursor: Option.Option<A>
260
+ }
261
+
262
+ /**
263
+ * @since 1.0.0
264
+ * @category constructors
265
+ */
266
+ export const make = (
267
+ storage: Omit<MessageStorage["Type"], "registerReplyHandler">
268
+ ): Effect.Effect<MessageStorage["Type"]> =>
269
+ Effect.sync(() => {
270
+ const replyHandlers = new Map<
271
+ Snowflake.Snowflake,
272
+ (reply: Reply.Reply<any>) => Effect.Effect<void, PersistenceError>
273
+ >()
274
+ return MessageStorage.of({
275
+ ...storage,
276
+ registerReplyHandler: (message) =>
277
+ Effect.sync(() => {
278
+ replyHandlers.set(message.envelope.requestId, message.respond)
279
+ }),
280
+ saveReply(reply) {
281
+ return Effect.flatMap(storage.saveReply(reply), () => {
282
+ const handler = replyHandlers.get(reply.reply.requestId)
283
+ if (!handler) {
284
+ return Effect.void
285
+ } else if (reply.reply._tag === "WithExit") {
286
+ replyHandlers.delete(reply.reply.requestId)
287
+ }
288
+ return handler(reply.reply)
289
+ })
290
+ }
291
+ })
292
+ })
293
+
294
+ /**
295
+ * @since 1.0.0
296
+ * @category constructors
297
+ */
298
+ export const makeEncoded: (encoded: Encoded) => Effect.Effect<
299
+ MessageStorage["Type"],
300
+ never,
301
+ Snowflake.Generator
302
+ > = Effect.fnUntraced(function*(encoded: Encoded) {
303
+ const snowflakeGen = yield* Snowflake.Generator
304
+ const clock = yield* Effect.clock
305
+
306
+ const storage: MessageStorage["Type"] = yield* make({
307
+ saveRequest: (message) =>
308
+ Message.serializeEnvelope(message).pipe(
309
+ Effect.flatMap((envelope) =>
310
+ encoded.saveEnvelope({
311
+ envelope,
312
+ primaryKey: Envelope.primaryKey(message.envelope),
313
+ deliverAt: DeliverAt.toMillis(message.envelope.payload)
314
+ })
315
+ ),
316
+ Effect.flatMap((result) => {
317
+ if (result._tag === "Success" || result.lastReceivedReply._tag === "None") {
318
+ return Effect.succeed(result as SaveResult<any>)
319
+ }
320
+ const duplicate = result
321
+ const schema = Reply.Reply(message.rpc)
322
+ return Schema.decode(schema)(result.lastReceivedReply.value).pipe(
323
+ Effect.locally(FiberRef.currentContext, message.context),
324
+ MalformedMessage.refail,
325
+ Effect.map((reply) =>
326
+ SaveResult.Duplicate({
327
+ originalId: duplicate.originalId,
328
+ lastReceivedReply: Option.some(reply)
329
+ })
330
+ )
331
+ )
332
+ })
333
+ ),
334
+ saveEnvelope: (message) =>
335
+ Message.serializeEnvelope(message).pipe(
336
+ Effect.flatMap((envelope) =>
337
+ encoded.saveEnvelope({
338
+ envelope,
339
+ primaryKey: null,
340
+ deliverAt: null
341
+ })
342
+ ),
343
+ Effect.asVoid
344
+ ),
345
+ saveReply: (reply) => Effect.flatMap(Reply.serialize(reply), encoded.saveReply),
346
+ repliesFor: Effect.fnUntraced(function*(messages) {
347
+ const requestIds = Arr.empty<string>()
348
+ const map = new Map<string, Message.OutgoingRequest<any>>()
349
+ for (const message of messages) {
350
+ const id = String(message.envelope.requestId)
351
+ requestIds.push(id)
352
+ map.set(id, message)
353
+ }
354
+ if (requestIds.length === 0) return []
355
+ const encodedReplies = yield* encoded.repliesFor(requestIds)
356
+ return yield* decodeReplies(map, encodedReplies)
357
+ }),
358
+ unprocessedMessages: (shardIds) => {
359
+ const shards = Array.from(shardIds)
360
+ if (shards.length === 0) return Effect.succeed([])
361
+ return Effect.flatMap(
362
+ Effect.suspend(() => encoded.unprocessedMessages(shards, clock.unsafeCurrentTimeMillis())),
363
+ decodeMessages
364
+ )
365
+ },
366
+ unprocessedMessagesById(messageIds) {
367
+ const ids = Array.from(messageIds)
368
+ if (ids.length === 0) return Effect.succeed([])
369
+ return Effect.flatMap(
370
+ Effect.suspend(() => encoded.unprocessedMessagesById(ids, clock.unsafeCurrentTimeMillis())),
371
+ decodeMessages
372
+ )
373
+ },
374
+ resetAddress: (address) => encoded.resetAddress(address)
375
+ })
376
+
377
+ const decodeMessages = (
378
+ envelopes: Array<{
379
+ readonly envelope: Envelope.Envelope.Encoded
380
+ readonly lastSentReply: Option.Option<Reply.ReplyEncoded<any>>
381
+ }>
382
+ ) => {
383
+ const messages: Array<Message.Incoming<any>> = []
384
+ let index = 0
385
+
386
+ // if we have a malformed message, we should not return it and update
387
+ // the storage with a defect
388
+ const decodeMessage = Effect.catchAll(
389
+ Effect.suspend(() => {
390
+ const envelope = envelopes[index]
391
+ if (!envelope) return Effect.succeed(undefined)
392
+ return decodeEnvelopeWithReply(envelope)
393
+ }),
394
+ (error) => {
395
+ const envelope = envelopes[index]
396
+ return storage.saveReply(Reply.ReplyWithContext.fromDefect({
397
+ id: snowflakeGen.unsafeNext(),
398
+ requestId: Snowflake.Snowflake(envelope.envelope.requestId),
399
+ defect: error.toString()
400
+ })).pipe(
401
+ Effect.forkDaemon,
402
+ Effect.asVoid
403
+ )
404
+ }
405
+ )
406
+ return Effect.as(
407
+ Effect.whileLoop({
408
+ while: () => index < envelopes.length,
409
+ body: () => decodeMessage,
410
+ step: (message) => {
411
+ const envelope = envelopes[index++]
412
+ if (!message) return
413
+ messages.push(
414
+ message.envelope._tag === "Request"
415
+ ? new Message.IncomingRequest({
416
+ envelope: message.envelope,
417
+ lastSentReply: envelope.lastSentReply,
418
+ respond: storage.saveReply
419
+ })
420
+ : new Message.IncomingEnvelope({
421
+ envelope: message.envelope
422
+ })
423
+ )
424
+ }
425
+ }),
426
+ messages
427
+ )
428
+ }
429
+
430
+ const decodeReplies = (
431
+ messages: Map<string, Message.OutgoingRequest<any>>,
432
+ encodedReplies: Array<Reply.ReplyEncoded<any>>
433
+ ) => {
434
+ const replies: Array<Reply.Reply<any>> = []
435
+ const ignoredRequests = new Set<string>()
436
+ let index = 0
437
+
438
+ const decodeReply: Effect.Effect<void | Reply.Reply<any>> = Effect.catchAll(
439
+ Effect.suspend(() => {
440
+ const reply = encodedReplies[index]
441
+ if (ignoredRequests.has(reply.requestId)) return Effect.void
442
+ const message = messages.get(reply.requestId)
443
+ if (!message) return Effect.void
444
+ const schema = Reply.Reply(message.rpc)
445
+ return Schema.decode(schema)(reply).pipe(
446
+ Effect.locally(FiberRef.currentContext, message.context)
447
+ ) as Effect.Effect<Reply.Reply<any>, ParseError>
448
+ }),
449
+ (error) => {
450
+ const reply = encodedReplies[index]
451
+ ignoredRequests.add(reply.requestId)
452
+ return Effect.succeed(
453
+ new Reply.WithExit({
454
+ id: snowflakeGen.unsafeNext(),
455
+ requestId: Snowflake.Snowflake(reply.requestId),
456
+ exit: Exit.die(error)
457
+ })
458
+ )
459
+ }
460
+ )
461
+
462
+ return Effect.as(
463
+ Effect.whileLoop({
464
+ while: () => index < encodedReplies.length,
465
+ body: () => decodeReply,
466
+ step: (reply) => {
467
+ index++
468
+ if (reply) replies.push(reply)
469
+ }
470
+ }),
471
+ replies
472
+ )
473
+ }
474
+
475
+ return storage
476
+ })
477
+
478
+ /**
479
+ * @since 1.0.0
480
+ * @category Constructors
481
+ */
482
+ export const noop: MessageStorage["Type"] = globalValue(
483
+ "@effect/cluster/MessageStorage/noop",
484
+ () =>
485
+ Effect.runSync(make({
486
+ saveRequest: () => Effect.succeed(SaveResult.Success()),
487
+ saveEnvelope: () => Effect.void,
488
+ saveReply: () => Effect.void,
489
+ repliesFor: () => Effect.succeed([]),
490
+ unprocessedMessages: () => Effect.succeed([]),
491
+ unprocessedMessagesById: () => Effect.succeed([]),
492
+ resetAddress: () => Effect.void
493
+ }))
494
+ )
495
+
496
+ /**
497
+ * @since 1.0.0
498
+ * @category Memory
499
+ */
500
+ export type MemoryEntry = {
501
+ readonly envelope: Envelope.Request.Encoded
502
+ lastReceivedChunk: Option.Option<Reply.ChunkEncoded<any>>
503
+ replies: Array<Reply.ReplyEncoded<any>>
504
+ }
505
+
506
+ /**
507
+ * @since 1.0.0
508
+ * @category Memory
509
+ */
510
+ export class MemoryDriver extends Effect.Service<MemoryDriver>()("@effect/cluster/MessageStorage/MemoryDriver", {
511
+ dependencies: [Snowflake.layerGenerator],
512
+ effect: Effect.gen(function*() {
513
+ const requests = new Map<string, MemoryEntry>()
514
+ const requestsByPrimaryKey = new Map<string, MemoryEntry>()
515
+ const unprocessed = new Set<Envelope.Request.Encoded>()
516
+ const replyIds = new Set<string>()
517
+
518
+ const journal: Array<Envelope.Envelope.Encoded> = []
519
+
520
+ const cursors = new WeakMap<{}, number>()
521
+
522
+ const unprocessedWith = (predicate: Predicate<Envelope.Envelope.Encoded>) => {
523
+ const messages: Array<{
524
+ readonly envelope: Envelope.Envelope.Encoded
525
+ readonly lastSentReply: Option.Option<Reply.ReplyEncoded<any>>
526
+ }> = []
527
+ for (const envelope of unprocessed) {
528
+ if (!predicate(envelope)) {
529
+ continue
530
+ }
531
+ if (envelope._tag === "Request") {
532
+ const entry = requests.get(envelope.requestId)
533
+ messages.push({
534
+ envelope,
535
+ lastSentReply: Option.fromNullable(entry?.replies[entry.replies.length - 1])
536
+ })
537
+ } else {
538
+ messages.push({
539
+ envelope,
540
+ lastSentReply: Option.none()
541
+ })
542
+ }
543
+ }
544
+ return messages
545
+ }
546
+
547
+ const replyLatch = yield* Effect.makeLatch()
548
+
549
+ const encoded: Encoded = {
550
+ saveEnvelope: ({ envelope, primaryKey }) =>
551
+ Effect.sync(() => {
552
+ const existing = primaryKey
553
+ ? requestsByPrimaryKey.get(primaryKey)
554
+ : envelope._tag === "Request" && requests.get(envelope.requestId)
555
+ if (existing) {
556
+ return SaveResultEncoded.Duplicate({
557
+ originalId: Snowflake.Snowflake(existing.envelope.requestId),
558
+ lastReceivedReply: existing.lastReceivedChunk
559
+ })
560
+ }
561
+ if (envelope._tag === "Request") {
562
+ const entry: MemoryEntry = { envelope, replies: [], lastReceivedChunk: Option.none() }
563
+ requests.set(envelope.requestId, entry)
564
+ if (primaryKey) {
565
+ requestsByPrimaryKey.set(primaryKey, entry)
566
+ }
567
+ unprocessed.add(envelope)
568
+ } else if (envelope._tag === "AckChunk") {
569
+ const entry = requests.get(envelope.requestId)
570
+ if (entry) {
571
+ entry.lastReceivedChunk = Arr.findFirst(
572
+ entry.replies,
573
+ (r): r is Reply.ChunkEncoded<any> => r._tag === "Chunk" && r.id === envelope.replyId
574
+ ).pipe(Option.orElse(() => entry.lastReceivedChunk))
575
+ }
576
+ }
577
+ journal.push(envelope)
578
+ return SaveResultEncoded.Success()
579
+ }),
580
+ saveReply: (reply) =>
581
+ Effect.sync(() => {
582
+ const entry = requests.get(reply.requestId)
583
+ if (!entry || replyIds.has(reply.id)) return
584
+ if (reply._tag === "WithExit") {
585
+ unprocessed.delete(entry.envelope)
586
+ }
587
+ entry.replies.push(reply)
588
+ replyIds.add(reply.id)
589
+ replyLatch.unsafeOpen()
590
+ }),
591
+ repliesFor: (requestIds) =>
592
+ Effect.sync(() => {
593
+ const replies = Arr.empty<Reply.ReplyEncoded<any>>()
594
+ for (const requestId of requestIds) {
595
+ const request = requests.get(requestId)
596
+ if (!request) continue
597
+ else if (Option.isNone(request.lastReceivedChunk)) {
598
+ // eslint-disable-next-line no-restricted-syntax
599
+ replies.push(...request.replies)
600
+ continue
601
+ }
602
+ const sequence = request.lastReceivedChunk.value.sequence
603
+ for (const reply of request.replies) {
604
+ if (reply._tag === "Chunk" && reply.sequence <= sequence) {
605
+ continue
606
+ }
607
+ replies.push(reply)
608
+ }
609
+ }
610
+ return replies
611
+ }),
612
+ unprocessedMessages: (shardIds) =>
613
+ Effect.sync(() => {
614
+ if (unprocessed.size === 0) return []
615
+ const messages = Arr.empty<{
616
+ envelope: Envelope.Envelope.Encoded
617
+ lastSentReply: Option.Option<Reply.ReplyEncoded<any>>
618
+ }>()
619
+ let index = journal.indexOf(Iterable.unsafeHead(unprocessed))
620
+ for (; index < journal.length; index++) {
621
+ const envelope = journal[index]
622
+ if (!shardIds.includes(envelope.address.shardId)) {
623
+ continue
624
+ }
625
+ if (envelope._tag === "Request") {
626
+ const entry = requests.get(envelope.requestId)!
627
+ messages.push({
628
+ envelope,
629
+ lastSentReply: Arr.last(entry.replies)
630
+ })
631
+ } else {
632
+ messages.push({
633
+ envelope,
634
+ lastSentReply: Option.none()
635
+ })
636
+ }
637
+ }
638
+ return messages
639
+ }),
640
+ unprocessedMessagesById: (ids) =>
641
+ Effect.sync(() => {
642
+ const envelopeIds = new Set<string>()
643
+ for (const id of ids) {
644
+ envelopeIds.add(String(id))
645
+ }
646
+ return unprocessedWith((envelope) => envelopeIds.has(envelope.requestId))
647
+ }),
648
+ resetAddress: () => Effect.void
649
+ }
650
+
651
+ const storage = yield* makeEncoded(encoded)
652
+
653
+ return {
654
+ storage,
655
+ encoded,
656
+ requests,
657
+ requestsByPrimaryKey,
658
+ unprocessed,
659
+ replyIds,
660
+ journal,
661
+ cursors
662
+ } as const
663
+ })
664
+ }) {}
665
+
666
+ /**
667
+ * @since 1.0.0
668
+ * @category layers
669
+ */
670
+ export const layerNoop: Layer.Layer<MessageStorage> = Layer.succeed(MessageStorage, noop)
671
+
672
+ /**
673
+ * @since 1.0.0
674
+ * @category layers
675
+ */
676
+ export const layerMemory: Layer.Layer<
677
+ MessageStorage | MemoryDriver,
678
+ never,
679
+ ShardingConfig
680
+ > = Layer.effect(MessageStorage, Effect.map(MemoryDriver, (_) => _.storage)).pipe(
681
+ Layer.provideMerge(MemoryDriver.Default)
682
+ )
683
+
684
+ // --- internal ---
685
+
686
+ const EnvelopeWithReply: Schema.Schema<{
687
+ readonly envelope: Envelope.Envelope.PartialEncoded
688
+ readonly lastSentReply: Option.Option<Reply.ReplyEncoded<any>>
689
+ }, {
690
+ readonly envelope: Envelope.Envelope.Encoded
691
+ readonly lastSentReply: Schema.OptionEncoded<Reply.ReplyEncoded<any>>
692
+ }> = Schema.Struct({
693
+ envelope: Envelope.PartialEncoded,
694
+ lastSentReply: Schema.OptionFromSelf(Reply.Encoded)
695
+ }) as any
696
+
697
+ const decodeEnvelopeWithReply = Schema.decode(EnvelopeWithReply)