@effect/cluster 0.0.0-snapshot-d33d8b050b8e3c87dcde9587083e6c1cf733f72b

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 (375) hide show
  1. package/AtLeastOnce/package.json +6 -0
  2. package/AtLeastOnceStorage/package.json +6 -0
  3. package/Broadcaster/package.json +6 -0
  4. package/LICENSE +21 -0
  5. package/ManagerConfig/package.json +6 -0
  6. package/Message/package.json +6 -0
  7. package/MessageState/package.json +6 -0
  8. package/Messenger/package.json +6 -0
  9. package/Pod/package.json +6 -0
  10. package/PodAddress/package.json +6 -0
  11. package/Pods/package.json +6 -0
  12. package/PodsHealth/package.json +6 -0
  13. package/PoisonPill/package.json +6 -0
  14. package/README.md +3 -0
  15. package/RecipientAddress/package.json +6 -0
  16. package/RecipientBehaviour/package.json +6 -0
  17. package/RecipientBehaviourContext/package.json +6 -0
  18. package/RecipientType/package.json +6 -0
  19. package/Serialization/package.json +6 -0
  20. package/SerializedEnvelope/package.json +6 -0
  21. package/SerializedMessage/package.json +6 -0
  22. package/ShardId/package.json +6 -0
  23. package/ShardManager/package.json +6 -0
  24. package/ShardManagerClient/package.json +6 -0
  25. package/Sharding/package.json +6 -0
  26. package/ShardingConfig/package.json +6 -0
  27. package/ShardingEvent/package.json +6 -0
  28. package/ShardingException/package.json +6 -0
  29. package/ShardingRegistrationEvent/package.json +6 -0
  30. package/Storage/package.json +6 -0
  31. package/dist/cjs/AtLeastOnce.js +43 -0
  32. package/dist/cjs/AtLeastOnce.js.map +1 -0
  33. package/dist/cjs/AtLeastOnceStorage.js +48 -0
  34. package/dist/cjs/AtLeastOnceStorage.js.map +1 -0
  35. package/dist/cjs/Broadcaster.js +6 -0
  36. package/dist/cjs/Broadcaster.js.map +1 -0
  37. package/dist/cjs/ManagerConfig.js +57 -0
  38. package/dist/cjs/ManagerConfig.js.map +1 -0
  39. package/dist/cjs/Message.js +64 -0
  40. package/dist/cjs/Message.js.map +1 -0
  41. package/dist/cjs/MessageState.js +78 -0
  42. package/dist/cjs/MessageState.js.map +1 -0
  43. package/dist/cjs/Messenger.js +6 -0
  44. package/dist/cjs/Messenger.js.map +1 -0
  45. package/dist/cjs/Pod.js +101 -0
  46. package/dist/cjs/Pod.js.map +1 -0
  47. package/dist/cjs/PodAddress.js +100 -0
  48. package/dist/cjs/PodAddress.js.map +1 -0
  49. package/dist/cjs/Pods.js +58 -0
  50. package/dist/cjs/Pods.js.map +1 -0
  51. package/dist/cjs/PodsHealth.js +64 -0
  52. package/dist/cjs/PodsHealth.js.map +1 -0
  53. package/dist/cjs/PoisonPill.js +101 -0
  54. package/dist/cjs/PoisonPill.js.map +1 -0
  55. package/dist/cjs/RecipientAddress.js +102 -0
  56. package/dist/cjs/RecipientAddress.js.map +1 -0
  57. package/dist/cjs/RecipientBehaviour.js +61 -0
  58. package/dist/cjs/RecipientBehaviour.js.map +1 -0
  59. package/dist/cjs/RecipientBehaviourContext.js +87 -0
  60. package/dist/cjs/RecipientBehaviourContext.js.map +1 -0
  61. package/dist/cjs/RecipientType.js +142 -0
  62. package/dist/cjs/RecipientType.js.map +1 -0
  63. package/dist/cjs/Serialization.js +55 -0
  64. package/dist/cjs/Serialization.js.map +1 -0
  65. package/dist/cjs/SerializedEnvelope.js +111 -0
  66. package/dist/cjs/SerializedEnvelope.js.map +1 -0
  67. package/dist/cjs/SerializedMessage.js +87 -0
  68. package/dist/cjs/SerializedMessage.js.map +1 -0
  69. package/dist/cjs/ShardId.js +89 -0
  70. package/dist/cjs/ShardId.js.map +1 -0
  71. package/dist/cjs/ShardManager.js +48 -0
  72. package/dist/cjs/ShardManager.js.map +1 -0
  73. package/dist/cjs/ShardManagerClient.js +53 -0
  74. package/dist/cjs/ShardManagerClient.js.map +1 -0
  75. package/dist/cjs/Sharding.js +129 -0
  76. package/dist/cjs/Sharding.js.map +1 -0
  77. package/dist/cjs/ShardingConfig.js +64 -0
  78. package/dist/cjs/ShardingConfig.js.map +1 -0
  79. package/dist/cjs/ShardingEvent.js +72 -0
  80. package/dist/cjs/ShardingEvent.js.map +1 -0
  81. package/dist/cjs/ShardingException.js +130 -0
  82. package/dist/cjs/ShardingException.js.map +1 -0
  83. package/dist/cjs/ShardingRegistrationEvent.js +44 -0
  84. package/dist/cjs/ShardingRegistrationEvent.js.map +1 -0
  85. package/dist/cjs/Storage.js +63 -0
  86. package/dist/cjs/Storage.js.map +1 -0
  87. package/dist/cjs/index.js +88 -0
  88. package/dist/cjs/index.js.map +1 -0
  89. package/dist/cjs/internal/atLeastOnce.js +58 -0
  90. package/dist/cjs/internal/atLeastOnce.js.map +1 -0
  91. package/dist/cjs/internal/atLeastOnceStorage.js +186 -0
  92. package/dist/cjs/internal/atLeastOnceStorage.js.map +1 -0
  93. package/dist/cjs/internal/entityManager.js +191 -0
  94. package/dist/cjs/internal/entityManager.js.map +1 -0
  95. package/dist/cjs/internal/entityState.js +70 -0
  96. package/dist/cjs/internal/entityState.js.map +1 -0
  97. package/dist/cjs/internal/managerConfig.js +69 -0
  98. package/dist/cjs/internal/managerConfig.js.map +1 -0
  99. package/dist/cjs/internal/message.js +68 -0
  100. package/dist/cjs/internal/message.js.map +1 -0
  101. package/dist/cjs/internal/messageState.js +102 -0
  102. package/dist/cjs/internal/messageState.js.map +1 -0
  103. package/dist/cjs/internal/podWithMetadata.js +77 -0
  104. package/dist/cjs/internal/podWithMetadata.js.map +1 -0
  105. package/dist/cjs/internal/pods.js +58 -0
  106. package/dist/cjs/internal/pods.js.map +1 -0
  107. package/dist/cjs/internal/podsHealth.js +63 -0
  108. package/dist/cjs/internal/podsHealth.js.map +1 -0
  109. package/dist/cjs/internal/recipientBehaviour.js +75 -0
  110. package/dist/cjs/internal/recipientBehaviour.js.map +1 -0
  111. package/dist/cjs/internal/recipientBehaviourContext.js +59 -0
  112. package/dist/cjs/internal/recipientBehaviourContext.js.map +1 -0
  113. package/dist/cjs/internal/serialization.js +72 -0
  114. package/dist/cjs/internal/serialization.js.map +1 -0
  115. package/dist/cjs/internal/shardManager.js +291 -0
  116. package/dist/cjs/internal/shardManager.js.map +1 -0
  117. package/dist/cjs/internal/shardManagerClient.js +71 -0
  118. package/dist/cjs/internal/shardManagerClient.js.map +1 -0
  119. package/dist/cjs/internal/shardManagerState.js +67 -0
  120. package/dist/cjs/internal/shardManagerState.js.map +1 -0
  121. package/dist/cjs/internal/sharding.js +329 -0
  122. package/dist/cjs/internal/sharding.js.map +1 -0
  123. package/dist/cjs/internal/shardingConfig.js +79 -0
  124. package/dist/cjs/internal/shardingConfig.js.map +1 -0
  125. package/dist/cjs/internal/storage.js +75 -0
  126. package/dist/cjs/internal/storage.js.map +1 -0
  127. package/dist/cjs/internal/utils.js +92 -0
  128. package/dist/cjs/internal/utils.js.map +1 -0
  129. package/dist/dts/AtLeastOnce.d.ts +20 -0
  130. package/dist/dts/AtLeastOnce.d.ts.map +1 -0
  131. package/dist/dts/AtLeastOnceStorage.d.ts +75 -0
  132. package/dist/dts/AtLeastOnceStorage.d.ts.map +1 -0
  133. package/dist/dts/Broadcaster.d.ts +32 -0
  134. package/dist/dts/Broadcaster.d.ts.map +1 -0
  135. package/dist/dts/ManagerConfig.d.ts +61 -0
  136. package/dist/dts/ManagerConfig.d.ts.map +1 -0
  137. package/dist/dts/Message.d.ts +106 -0
  138. package/dist/dts/Message.d.ts.map +1 -0
  139. package/dist/dts/MessageState.d.ts +107 -0
  140. package/dist/dts/MessageState.d.ts.map +1 -0
  141. package/dist/dts/Messenger.d.ts +32 -0
  142. package/dist/dts/Messenger.d.ts.map +1 -0
  143. package/dist/dts/Pod.d.ts +81 -0
  144. package/dist/dts/Pod.d.ts.map +1 -0
  145. package/dist/dts/PodAddress.d.ts +80 -0
  146. package/dist/dts/PodAddress.d.ts.map +1 -0
  147. package/dist/dts/Pods.d.ts +78 -0
  148. package/dist/dts/Pods.d.ts.map +1 -0
  149. package/dist/dts/PodsHealth.d.ts +66 -0
  150. package/dist/dts/PodsHealth.d.ts.map +1 -0
  151. package/dist/dts/PoisonPill.d.ts +78 -0
  152. package/dist/dts/PoisonPill.d.ts.map +1 -0
  153. package/dist/dts/RecipientAddress.d.ts +57 -0
  154. package/dist/dts/RecipientAddress.d.ts.map +1 -0
  155. package/dist/dts/RecipientBehaviour.d.ts +72 -0
  156. package/dist/dts/RecipientBehaviour.d.ts.map +1 -0
  157. package/dist/dts/RecipientBehaviourContext.d.ts +83 -0
  158. package/dist/dts/RecipientBehaviourContext.d.ts.map +1 -0
  159. package/dist/dts/RecipientType.d.ts +96 -0
  160. package/dist/dts/RecipientType.d.ts.map +1 -0
  161. package/dist/dts/Serialization.d.ts +58 -0
  162. package/dist/dts/Serialization.d.ts.map +1 -0
  163. package/dist/dts/SerializedEnvelope.d.ts +87 -0
  164. package/dist/dts/SerializedEnvelope.d.ts.map +1 -0
  165. package/dist/dts/SerializedMessage.d.ts +66 -0
  166. package/dist/dts/SerializedMessage.d.ts.map +1 -0
  167. package/dist/dts/ShardId.d.ts +70 -0
  168. package/dist/dts/ShardId.d.ts.map +1 -0
  169. package/dist/dts/ShardManager.d.ts +44 -0
  170. package/dist/dts/ShardManager.d.ts.map +1 -0
  171. package/dist/dts/ShardManagerClient.d.ts +50 -0
  172. package/dist/dts/ShardManagerClient.d.ts.map +1 -0
  173. package/dist/dts/Sharding.d.ts +146 -0
  174. package/dist/dts/Sharding.d.ts.map +1 -0
  175. package/dist/dts/ShardingConfig.d.ts +69 -0
  176. package/dist/dts/ShardingConfig.d.ts.map +1 -0
  177. package/dist/dts/ShardingEvent.d.ts +90 -0
  178. package/dist/dts/ShardingEvent.d.ts.map +1 -0
  179. package/dist/dts/ShardingException.d.ts +125 -0
  180. package/dist/dts/ShardingException.d.ts.map +1 -0
  181. package/dist/dts/ShardingRegistrationEvent.d.ts +44 -0
  182. package/dist/dts/ShardingRegistrationEvent.d.ts.map +1 -0
  183. package/dist/dts/Storage.d.ts +78 -0
  184. package/dist/dts/Storage.d.ts.map +1 -0
  185. package/dist/dts/index.d.ts +113 -0
  186. package/dist/dts/index.d.ts.map +1 -0
  187. package/dist/dts/internal/atLeastOnce.d.ts +2 -0
  188. package/dist/dts/internal/atLeastOnce.d.ts.map +1 -0
  189. package/dist/dts/internal/atLeastOnceStorage.d.ts +2 -0
  190. package/dist/dts/internal/atLeastOnceStorage.d.ts.map +1 -0
  191. package/dist/dts/internal/entityManager.d.ts +2 -0
  192. package/dist/dts/internal/entityManager.d.ts.map +1 -0
  193. package/dist/dts/internal/entityState.d.ts +21 -0
  194. package/dist/dts/internal/entityState.d.ts.map +1 -0
  195. package/dist/dts/internal/managerConfig.d.ts +2 -0
  196. package/dist/dts/internal/managerConfig.d.ts.map +1 -0
  197. package/dist/dts/internal/message.d.ts +9 -0
  198. package/dist/dts/internal/message.d.ts.map +1 -0
  199. package/dist/dts/internal/messageState.d.ts +2 -0
  200. package/dist/dts/internal/messageState.d.ts.map +1 -0
  201. package/dist/dts/internal/podWithMetadata.d.ts +2 -0
  202. package/dist/dts/internal/podWithMetadata.d.ts.map +1 -0
  203. package/dist/dts/internal/pods.d.ts +2 -0
  204. package/dist/dts/internal/pods.d.ts.map +1 -0
  205. package/dist/dts/internal/podsHealth.d.ts +2 -0
  206. package/dist/dts/internal/podsHealth.d.ts.map +1 -0
  207. package/dist/dts/internal/recipientBehaviour.d.ts +2 -0
  208. package/dist/dts/internal/recipientBehaviour.d.ts.map +1 -0
  209. package/dist/dts/internal/recipientBehaviourContext.d.ts +2 -0
  210. package/dist/dts/internal/recipientBehaviourContext.d.ts.map +1 -0
  211. package/dist/dts/internal/serialization.d.ts +2 -0
  212. package/dist/dts/internal/serialization.d.ts.map +1 -0
  213. package/dist/dts/internal/shardManager.d.ts +12 -0
  214. package/dist/dts/internal/shardManager.d.ts.map +1 -0
  215. package/dist/dts/internal/shardManagerClient.d.ts +2 -0
  216. package/dist/dts/internal/shardManagerClient.d.ts.map +1 -0
  217. package/dist/dts/internal/shardManagerState.d.ts +26 -0
  218. package/dist/dts/internal/shardManagerState.d.ts.map +1 -0
  219. package/dist/dts/internal/sharding.d.ts +2 -0
  220. package/dist/dts/internal/sharding.d.ts.map +1 -0
  221. package/dist/dts/internal/shardingConfig.d.ts +2 -0
  222. package/dist/dts/internal/shardingConfig.d.ts.map +1 -0
  223. package/dist/dts/internal/storage.d.ts +2 -0
  224. package/dist/dts/internal/storage.d.ts.map +1 -0
  225. package/dist/dts/internal/utils.d.ts +2 -0
  226. package/dist/dts/internal/utils.d.ts.map +1 -0
  227. package/dist/esm/AtLeastOnce.js +12 -0
  228. package/dist/esm/AtLeastOnce.js.map +1 -0
  229. package/dist/esm/AtLeastOnceStorage.js +17 -0
  230. package/dist/esm/AtLeastOnceStorage.js.map +1 -0
  231. package/dist/esm/Broadcaster.js +2 -0
  232. package/dist/esm/Broadcaster.js.map +1 -0
  233. package/dist/esm/ManagerConfig.js +26 -0
  234. package/dist/esm/ManagerConfig.js.map +1 -0
  235. package/dist/esm/Message.js +33 -0
  236. package/dist/esm/Message.js.map +1 -0
  237. package/dist/esm/MessageState.js +47 -0
  238. package/dist/esm/MessageState.js.map +1 -0
  239. package/dist/esm/Messenger.js +2 -0
  240. package/dist/esm/Messenger.js.map +1 -0
  241. package/dist/esm/Pod.js +65 -0
  242. package/dist/esm/Pod.js.map +1 -0
  243. package/dist/esm/PodAddress.js +64 -0
  244. package/dist/esm/PodAddress.js.map +1 -0
  245. package/dist/esm/Pods.js +27 -0
  246. package/dist/esm/Pods.js.map +1 -0
  247. package/dist/esm/PodsHealth.js +33 -0
  248. package/dist/esm/PodsHealth.js.map +1 -0
  249. package/dist/esm/PoisonPill.js +65 -0
  250. package/dist/esm/PoisonPill.js.map +1 -0
  251. package/dist/esm/RecipientAddress.js +67 -0
  252. package/dist/esm/RecipientAddress.js.map +1 -0
  253. package/dist/esm/RecipientBehaviour.js +30 -0
  254. package/dist/esm/RecipientBehaviour.js.map +1 -0
  255. package/dist/esm/RecipientBehaviourContext.js +56 -0
  256. package/dist/esm/RecipientBehaviourContext.js.map +1 -0
  257. package/dist/esm/RecipientType.js +105 -0
  258. package/dist/esm/RecipientType.js.map +1 -0
  259. package/dist/esm/Serialization.js +24 -0
  260. package/dist/esm/Serialization.js.map +1 -0
  261. package/dist/esm/SerializedEnvelope.js +75 -0
  262. package/dist/esm/SerializedEnvelope.js.map +1 -0
  263. package/dist/esm/SerializedMessage.js +51 -0
  264. package/dist/esm/SerializedMessage.js.map +1 -0
  265. package/dist/esm/ShardId.js +54 -0
  266. package/dist/esm/ShardId.js.map +1 -0
  267. package/dist/esm/ShardManager.js +17 -0
  268. package/dist/esm/ShardManager.js.map +1 -0
  269. package/dist/esm/ShardManagerClient.js +22 -0
  270. package/dist/esm/ShardManagerClient.js.map +1 -0
  271. package/dist/esm/Sharding.js +98 -0
  272. package/dist/esm/Sharding.js.map +1 -0
  273. package/dist/esm/ShardingConfig.js +33 -0
  274. package/dist/esm/ShardingConfig.js.map +1 -0
  275. package/dist/esm/ShardingEvent.js +62 -0
  276. package/dist/esm/ShardingEvent.js.map +1 -0
  277. package/dist/esm/ShardingException.js +91 -0
  278. package/dist/esm/ShardingException.js.map +1 -0
  279. package/dist/esm/ShardingRegistrationEvent.js +36 -0
  280. package/dist/esm/ShardingRegistrationEvent.js.map +1 -0
  281. package/dist/esm/Storage.js +32 -0
  282. package/dist/esm/Storage.js.map +1 -0
  283. package/dist/esm/index.js +113 -0
  284. package/dist/esm/index.js.map +1 -0
  285. package/dist/esm/internal/atLeastOnce.js +26 -0
  286. package/dist/esm/internal/atLeastOnce.js.map +1 -0
  287. package/dist/esm/internal/atLeastOnceStorage.js +154 -0
  288. package/dist/esm/internal/atLeastOnceStorage.js.map +1 -0
  289. package/dist/esm/internal/entityManager.js +159 -0
  290. package/dist/esm/internal/entityManager.js.map +1 -0
  291. package/dist/esm/internal/entityState.js +35 -0
  292. package/dist/esm/internal/entityState.js.map +1 -0
  293. package/dist/esm/internal/managerConfig.js +38 -0
  294. package/dist/esm/internal/managerConfig.js.map +1 -0
  295. package/dist/esm/internal/message.js +32 -0
  296. package/dist/esm/internal/message.js.map +1 -0
  297. package/dist/esm/internal/messageState.js +66 -0
  298. package/dist/esm/internal/messageState.js.map +1 -0
  299. package/dist/esm/internal/podWithMetadata.js +41 -0
  300. package/dist/esm/internal/podWithMetadata.js.map +1 -0
  301. package/dist/esm/internal/pods.js +25 -0
  302. package/dist/esm/internal/pods.js.map +1 -0
  303. package/dist/esm/internal/podsHealth.js +30 -0
  304. package/dist/esm/internal/podsHealth.js.map +1 -0
  305. package/dist/esm/internal/recipientBehaviour.js +42 -0
  306. package/dist/esm/internal/recipientBehaviour.js.map +1 -0
  307. package/dist/esm/internal/recipientBehaviourContext.js +26 -0
  308. package/dist/esm/internal/recipientBehaviourContext.js.map +1 -0
  309. package/dist/esm/internal/serialization.js +39 -0
  310. package/dist/esm/internal/serialization.js.map +1 -0
  311. package/dist/esm/internal/shardManager.js +256 -0
  312. package/dist/esm/internal/shardManager.js.map +1 -0
  313. package/dist/esm/internal/shardManagerClient.js +38 -0
  314. package/dist/esm/internal/shardManagerClient.js.map +1 -0
  315. package/dist/esm/internal/shardManagerState.js +36 -0
  316. package/dist/esm/internal/shardManagerState.js.map +1 -0
  317. package/dist/esm/internal/sharding.js +288 -0
  318. package/dist/esm/internal/sharding.js.map +1 -0
  319. package/dist/esm/internal/shardingConfig.js +47 -0
  320. package/dist/esm/internal/shardingConfig.js.map +1 -0
  321. package/dist/esm/internal/storage.js +42 -0
  322. package/dist/esm/internal/storage.js.map +1 -0
  323. package/dist/esm/internal/utils.js +56 -0
  324. package/dist/esm/internal/utils.js.map +1 -0
  325. package/dist/esm/package.json +4 -0
  326. package/package.json +259 -0
  327. package/src/AtLeastOnce.ts +28 -0
  328. package/src/AtLeastOnceStorage.ts +96 -0
  329. package/src/Broadcaster.ts +48 -0
  330. package/src/ManagerConfig.ts +67 -0
  331. package/src/Message.ts +132 -0
  332. package/src/MessageState.ts +126 -0
  333. package/src/Messenger.ts +40 -0
  334. package/src/Pod.ts +95 -0
  335. package/src/PodAddress.ts +94 -0
  336. package/src/Pods.ts +100 -0
  337. package/src/PodsHealth.ts +74 -0
  338. package/src/PoisonPill.ts +105 -0
  339. package/src/RecipientAddress.ts +72 -0
  340. package/src/RecipientBehaviour.ts +108 -0
  341. package/src/RecipientBehaviourContext.ts +101 -0
  342. package/src/RecipientType.ts +134 -0
  343. package/src/Serialization.ts +72 -0
  344. package/src/SerializedEnvelope.ts +109 -0
  345. package/src/SerializedMessage.ts +82 -0
  346. package/src/ShardId.ts +79 -0
  347. package/src/ShardManager.ts +53 -0
  348. package/src/ShardManagerClient.ts +57 -0
  349. package/src/Sharding.ts +214 -0
  350. package/src/ShardingConfig.ts +76 -0
  351. package/src/ShardingEvent.ts +121 -0
  352. package/src/ShardingException.ts +151 -0
  353. package/src/ShardingRegistrationEvent.ts +62 -0
  354. package/src/Storage.ts +92 -0
  355. package/src/index.ts +139 -0
  356. package/src/internal/atLeastOnce.ts +59 -0
  357. package/src/internal/atLeastOnceStorage.ts +218 -0
  358. package/src/internal/entityManager.ts +404 -0
  359. package/src/internal/entityState.ts +64 -0
  360. package/src/internal/managerConfig.ts +84 -0
  361. package/src/internal/message.ts +64 -0
  362. package/src/internal/messageState.ts +98 -0
  363. package/src/internal/podWithMetadata.ts +72 -0
  364. package/src/internal/pods.ts +29 -0
  365. package/src/internal/podsHealth.ts +39 -0
  366. package/src/internal/recipientBehaviour.ts +133 -0
  367. package/src/internal/recipientBehaviourContext.ts +70 -0
  368. package/src/internal/serialization.ts +59 -0
  369. package/src/internal/shardManager.ts +593 -0
  370. package/src/internal/shardManagerClient.ts +49 -0
  371. package/src/internal/shardManagerState.ts +80 -0
  372. package/src/internal/sharding.ts +793 -0
  373. package/src/internal/shardingConfig.ts +97 -0
  374. package/src/internal/storage.ts +60 -0
  375. package/src/internal/utils.ts +54 -0
@@ -0,0 +1,793 @@
1
+ import * as Clock from "effect/Clock"
2
+ import * as Context from "effect/Context"
3
+ import * as Duration from "effect/Duration"
4
+ import * as Effect from "effect/Effect"
5
+ import type * as Either from "effect/Either"
6
+ import { equals } from "effect/Equal"
7
+ import * as Fiber from "effect/Fiber"
8
+ import { pipe } from "effect/Function"
9
+ import * as HashMap from "effect/HashMap"
10
+ import * as HashSet from "effect/HashSet"
11
+ import * as Layer from "effect/Layer"
12
+ import * as List from "effect/List"
13
+ import * as Option from "effect/Option"
14
+ import * as PrimaryKey from "effect/PrimaryKey"
15
+ import * as PubSub from "effect/PubSub"
16
+ import * as Ref from "effect/Ref"
17
+ import * as Schedule from "effect/Schedule"
18
+ import type * as Scope from "effect/Scope"
19
+ import * as Stream from "effect/Stream"
20
+ import * as Synchronized from "effect/SynchronizedRef"
21
+ import * as Unify from "effect/Unify"
22
+ import type * as Broadcaster from "../Broadcaster.js"
23
+ import * as Message from "../Message.js"
24
+ import * as MessageState from "../MessageState.js"
25
+ import type { Messenger } from "../Messenger.js"
26
+ import * as PodAddress from "../PodAddress.js"
27
+ import * as Pods from "../Pods.js"
28
+ import * as RecipientAddress from "../RecipientAddress.js"
29
+ import type * as RecipientBehaviour from "../RecipientBehaviour.js"
30
+ import type * as RecipientBehaviourContext from "../RecipientBehaviourContext.js"
31
+ import * as RecipientType from "../RecipientType.js"
32
+ import * as Serialization from "../Serialization.js"
33
+ import * as SerializedEnvelope from "../SerializedEnvelope.js"
34
+ import type * as SerializedMessage from "../SerializedMessage.js"
35
+ import * as ShardId from "../ShardId.js"
36
+ import type * as Sharding from "../Sharding.js"
37
+ import * as ShardingConfig from "../ShardingConfig.js"
38
+ import * as ShardingException from "../ShardingException.js"
39
+ import * as ShardingRegistrationEvent from "../ShardingRegistrationEvent.js"
40
+ import * as ShardManagerClient from "../ShardManagerClient.js"
41
+ import * as Storage from "../Storage.js"
42
+ import * as EntityManager from "./entityManager.js"
43
+
44
+ /** @internal */
45
+ const ShardingSymbolKey = "@effect/cluster/Sharding"
46
+
47
+ /** @internal */
48
+ export const ShardingTypeId: Sharding.ShardingTypeId = Symbol.for(ShardingSymbolKey) as Sharding.ShardingTypeId
49
+
50
+ /**
51
+ * @internal
52
+ */
53
+ export const shardingTag: Context.Tag<Sharding.Sharding, Sharding.Sharding> = Context.GenericTag<Sharding.Sharding>(
54
+ ShardingSymbolKey
55
+ )
56
+
57
+ /**
58
+ * @internal
59
+ */
60
+ export const register: Effect.Effect<void, never, Sharding.Sharding> = Effect.flatMap(shardingTag, (_) => _.register)
61
+
62
+ /**
63
+ * @internal
64
+ */
65
+ export const unregister: Effect.Effect<void, never, Sharding.Sharding> = Effect.flatMap(
66
+ shardingTag,
67
+ (_) => _.unregister
68
+ )
69
+
70
+ /**
71
+ * @internal
72
+ */
73
+ export const registerScoped: Effect.Effect<void, never, Sharding.Sharding | Scope.Scope> = pipe(
74
+ register,
75
+ Effect.zipRight(Effect.addFinalizer(() => unregister))
76
+ )
77
+
78
+ /**
79
+ * @internal
80
+ */
81
+ export function registerSingleton<R>(
82
+ name: string,
83
+ run: Effect.Effect<void, never, R>
84
+ ): Effect.Effect<void, never, R | Sharding.Sharding> {
85
+ return Effect.flatMap(shardingTag, (_) => _.registerSingleton(name, run))
86
+ }
87
+
88
+ /**
89
+ * @internal
90
+ */
91
+ export function registerEntity<Msg extends Message.Message.Any>(
92
+ entityType: RecipientType.EntityType<Msg>
93
+ ) {
94
+ return <R>(
95
+ behavior: RecipientBehaviour.RecipientBehaviour<Msg, R>,
96
+ options?: RecipientBehaviour.EntityBehaviourOptions
97
+ ): Effect.Effect<void, never, Sharding.Sharding | Exclude<R, RecipientBehaviourContext.RecipientBehaviourContext>> =>
98
+ Effect.flatMap(shardingTag, (_) => _.registerEntity(entityType)(behavior, options))
99
+ }
100
+
101
+ /**
102
+ * @internal
103
+ */
104
+ export function registerTopic<Msg extends Message.Message.Any>(
105
+ topicType: RecipientType.TopicType<Msg>
106
+ ) {
107
+ return <R>(
108
+ behavior: RecipientBehaviour.RecipientBehaviour<Msg, R>,
109
+ options?: RecipientBehaviour.EntityBehaviourOptions
110
+ ): Effect.Effect<void, never, Sharding.Sharding | Exclude<R, RecipientBehaviourContext.RecipientBehaviourContext>> =>
111
+ Effect.flatMap(shardingTag, (_) => _.registerTopic(topicType)(behavior, options))
112
+ }
113
+
114
+ /**
115
+ * @internal
116
+ */
117
+ export function messenger<Msg extends Message.Message.Any>(
118
+ entityType: RecipientType.EntityType<Msg>
119
+ ): Effect.Effect<Messenger<Msg>, never, Sharding.Sharding> {
120
+ return Effect.map(shardingTag, (_) => _.messenger(entityType))
121
+ }
122
+
123
+ /**
124
+ * @internal
125
+ */
126
+ export function broadcaster<Msg extends Message.Message.Any>(
127
+ topicType: RecipientType.TopicType<Msg>
128
+ ): Effect.Effect<Broadcaster.Broadcaster<Msg>, never, Sharding.Sharding> {
129
+ return Effect.map(shardingTag, (_) => _.broadcaster(topicType))
130
+ }
131
+
132
+ /**
133
+ * @internal
134
+ */
135
+ export const getPods: Effect.Effect<HashSet.HashSet<PodAddress.PodAddress>, never, Sharding.Sharding> = Effect.flatMap(
136
+ shardingTag,
137
+ (_) => _.getPods
138
+ )
139
+
140
+ /**
141
+ * @internal
142
+ */
143
+ export const sendMessageToLocalEntityManagerWithoutRetries: (
144
+ message: SerializedEnvelope.SerializedEnvelope
145
+ ) => Effect.Effect<
146
+ MessageState.MessageState<SerializedMessage.SerializedMessage>,
147
+ ShardingException.ShardingException,
148
+ Sharding.Sharding
149
+ > = (message) => Effect.flatMap(shardingTag, (_) => _.sendMessageToLocalEntityManagerWithoutRetries(message))
150
+
151
+ /**
152
+ * @internal
153
+ */
154
+ export const getAssignedShardIds: Effect.Effect<
155
+ HashSet.HashSet<ShardId.ShardId>,
156
+ never,
157
+ Sharding.Sharding
158
+ > = Effect.flatMap(shardingTag, (_) => _.getAssignedShardIds)
159
+
160
+ type SingletonEntry = [string, Effect.Effect<void>, Option.Option<Fiber.Fiber<void>>]
161
+
162
+ /**
163
+ * @internal
164
+ */
165
+ function make(
166
+ layerScope: Scope.Scope,
167
+ address: PodAddress.PodAddress,
168
+ config: ShardingConfig.ShardingConfig,
169
+ shardAssignments: Ref.Ref<HashMap.HashMap<ShardId.ShardId, PodAddress.PodAddress>>,
170
+ entityManagers: Ref.Ref<HashMap.HashMap<string, EntityManager.EntityManager>>,
171
+ singletons: Synchronized.SynchronizedRef<
172
+ List.List<SingletonEntry>
173
+ >,
174
+ lastUnhealthyNodeReported: Ref.Ref<number>,
175
+ isShuttingDownRef: Ref.Ref<boolean>,
176
+ shardManager: ShardManagerClient.ShardManagerClient,
177
+ pods: Pods.Pods,
178
+ storage: Storage.Storage,
179
+ serialization: Serialization.Serialization,
180
+ eventsHub: PubSub.PubSub<ShardingRegistrationEvent.ShardingRegistrationEvent>
181
+ ) {
182
+ function getEntityManagerByEntityTypeName(
183
+ entityType: string
184
+ ) {
185
+ return pipe(
186
+ Ref.get(entityManagers),
187
+ Effect.map(HashMap.get(entityType)),
188
+ Effect.flatMap((_) =>
189
+ Unify.unify(Option.match(_, {
190
+ onNone: () =>
191
+ Effect.fail(new ShardingException.EntityTypeNotRegisteredException({ entityType, podAddress: address })),
192
+ onSome: (entityManager) => Effect.succeed(entityManager as EntityManager.EntityManager)
193
+ }))
194
+ )
195
+ )
196
+ }
197
+
198
+ function getShardId(recipientAddress: RecipientAddress.RecipientAddress): ShardId.ShardId {
199
+ return RecipientType.getShardId(recipientAddress.entityId, config.numberOfShards)
200
+ }
201
+
202
+ const register: Effect.Effect<void> = pipe(
203
+ Effect.logDebug(`Registering pod ${(address)} to Shard Manager`),
204
+ Effect.zipRight(pipe(isShuttingDownRef, Ref.set(false))),
205
+ Effect.zipRight(shardManager.register(address))
206
+ )
207
+
208
+ const unregister: Effect.Effect<void> = pipe(
209
+ Effect.logDebug("Begin unregistering from ShardManager..."),
210
+ Effect.zipRight(shardManager.getAssignments),
211
+ Effect.matchCauseEffect({
212
+ onFailure: (_) => Effect.logWarning("Shard Manager not available. Can't unregister cleanly", _),
213
+ onSuccess: () =>
214
+ pipe(
215
+ Effect.logDebug(`Stopping local entities`),
216
+ Effect.zipRight(pipe(isShuttingDownRef, Ref.set(true))),
217
+ Effect.zipRight(
218
+ pipe(
219
+ Ref.get(entityManagers),
220
+ Effect.flatMap(
221
+ Effect.forEach(
222
+ ([name, entityManager]) =>
223
+ pipe(
224
+ entityManager.terminateAllEntities,
225
+ Effect.catchAllCause(
226
+ (_) => Effect.logError("Error during stop of entity " + name, _)
227
+ )
228
+ ),
229
+ { discard: true }
230
+ )
231
+ )
232
+ )
233
+ ),
234
+ Effect.zipRight(
235
+ Effect.logDebug(`Unregistering pod ${(address)} to Shard Manager`)
236
+ ),
237
+ Effect.zipRight(shardManager.unregister(address))
238
+ )
239
+ })
240
+ )
241
+
242
+ const isSingletonNode: Effect.Effect<boolean> = pipe(
243
+ Ref.get(shardAssignments),
244
+ Effect.map((_) =>
245
+ pipe(
246
+ HashMap.get(_, ShardId.make(1)),
247
+ Option.match({
248
+ onNone: () => false,
249
+ onSome: equals(address)
250
+ })
251
+ )
252
+ )
253
+ )
254
+
255
+ const startSingletonsIfNeeded: Effect.Effect<void> = pipe(
256
+ Synchronized.updateEffect(
257
+ singletons,
258
+ (singletons) =>
259
+ pipe(
260
+ Effect.forEach(singletons, ([name, run, maybeExecutionFiber]) =>
261
+ Option.match(
262
+ maybeExecutionFiber,
263
+ {
264
+ onNone: () =>
265
+ pipe(
266
+ Effect.logDebug("Starting singleton " + name),
267
+ Effect.zipRight(
268
+ Effect.map(
269
+ Effect.forkIn(layerScope)(run),
270
+ (fiber) => [name, run, Option.some(fiber)] as SingletonEntry
271
+ )
272
+ )
273
+ ),
274
+ onSome: (_) => Effect.succeed([name, run, maybeExecutionFiber] as SingletonEntry)
275
+ }
276
+ )),
277
+ Effect.map(List.fromIterable)
278
+ )
279
+ ),
280
+ Effect.whenEffect(isSingletonNode),
281
+ Effect.asVoid
282
+ )
283
+
284
+ const stopSingletonsIfNeeded: Effect.Effect<void> = pipe(
285
+ Synchronized.updateEffect(
286
+ singletons,
287
+ (singletons) =>
288
+ pipe(
289
+ Effect.forEach(singletons, ([name, run, maybeExecutionFiber]) =>
290
+ Option.match(
291
+ maybeExecutionFiber,
292
+ {
293
+ onNone: () => Effect.succeed([name, run, maybeExecutionFiber] as SingletonEntry),
294
+ onSome: (fiber) =>
295
+ pipe(
296
+ Effect.logDebug("Stopping singleton " + name),
297
+ Effect.zipRight(
298
+ Effect.as(Fiber.interrupt(fiber), [name, run, Option.none()] as SingletonEntry)
299
+ )
300
+ )
301
+ }
302
+ )),
303
+ Effect.map(List.fromIterable)
304
+ )
305
+ ),
306
+ Effect.unlessEffect(isSingletonNode),
307
+ Effect.asVoid
308
+ )
309
+
310
+ function registerSingleton<R>(name: string, run: Effect.Effect<void, never, R>): Effect.Effect<void, never, R> {
311
+ return pipe(
312
+ Effect.context<R>(),
313
+ Effect.flatMap((context) =>
314
+ Synchronized.update(
315
+ singletons,
316
+ (list) => (List.prepend(list, [name, Effect.provide(run, context), Option.none()] as SingletonEntry))
317
+ )
318
+ ),
319
+ Effect.zipLeft(startSingletonsIfNeeded),
320
+ Effect.zipRight(PubSub.publish(eventsHub, ShardingRegistrationEvent.SingletonRegistered(name)))
321
+ )
322
+ }
323
+
324
+ const isShuttingDown: Effect.Effect<boolean> = Ref.get(isShuttingDownRef)
325
+
326
+ function assign(shards: HashSet.HashSet<ShardId.ShardId>): Effect.Effect<void> {
327
+ return pipe(
328
+ Ref.update(shardAssignments, (_) => HashSet.reduce(shards, _, (_, shardId) => HashMap.set(_, shardId, address))),
329
+ Effect.zipRight(startSingletonsIfNeeded),
330
+ Effect.zipLeft(Effect.logDebug("Assigned shards: " + (shards))),
331
+ Effect.unlessEffect(isShuttingDown),
332
+ Effect.asVoid
333
+ )
334
+ }
335
+
336
+ function unassign(shards: HashSet.HashSet<ShardId.ShardId>): Effect.Effect<void> {
337
+ return pipe(
338
+ Ref.update(shardAssignments, (_) =>
339
+ HashSet.reduce(shards, _, (_, shardId) => {
340
+ const value = HashMap.get(_, shardId)
341
+ if (Option.isSome(value) && equals(value.value, address)) {
342
+ return HashMap.remove(_, shardId)
343
+ }
344
+ return _
345
+ })),
346
+ Effect.zipRight(stopSingletonsIfNeeded),
347
+ Effect.zipLeft(Effect.logDebug("Unassigning shards: " + (shards)))
348
+ )
349
+ }
350
+
351
+ function getPodAddressForShardId(
352
+ shardId: ShardId.ShardId
353
+ ): Effect.Effect<Option.Option<PodAddress.PodAddress>> {
354
+ return pipe(
355
+ Ref.get(shardAssignments),
356
+ Effect.map((shards) => HashMap.get(shards, shardId))
357
+ )
358
+ }
359
+
360
+ function isEntityOnLocalShards(
361
+ recipientAddress: RecipientAddress.RecipientAddress
362
+ ): Effect.Effect<boolean> {
363
+ return pipe(
364
+ getPodAddressForShardId(getShardId(recipientAddress)),
365
+ Effect.map((_) => equals(_, Option.some(address)))
366
+ )
367
+ }
368
+
369
+ const getPods: Effect.Effect<HashSet.HashSet<PodAddress.PodAddress>> = pipe(
370
+ Ref.get(shardAssignments),
371
+ Effect.map((_) => HashSet.fromIterable(HashMap.values(_)))
372
+ )
373
+
374
+ const getAssignedShardIds: Effect.Effect<HashSet.HashSet<ShardId.ShardId>> = pipe(
375
+ Ref.get(shardAssignments),
376
+ Effect.map(HashMap.filter((_) => equals(_, address))),
377
+ Effect.map(HashMap.keySet)
378
+ )
379
+
380
+ function updateAssignments(
381
+ assignmentsOpt: HashMap.HashMap<ShardId.ShardId, Option.Option<PodAddress.PodAddress>>,
382
+ fromShardManager: boolean
383
+ ) {
384
+ const assignments = HashMap.map(assignmentsOpt, (v, _) => Option.getOrElse(v, () => address))
385
+
386
+ if (fromShardManager) {
387
+ return Ref.update(shardAssignments, (map) => (HashMap.isEmpty(map)) ? assignments : map)
388
+ }
389
+
390
+ return Ref.update(shardAssignments, (map) => {
391
+ // we keep self assignments (we don't override them with the new assignments
392
+ // because only the Shard Manager is able to change assignments of the current node, via assign/unassign
393
+ return HashMap.union(
394
+ pipe(
395
+ assignments,
396
+ HashMap.filter((pod, _) => !equals(pod, address))
397
+ ),
398
+ pipe(
399
+ map,
400
+ HashMap.filter((pod, _) => equals(pod, address))
401
+ )
402
+ )
403
+ })
404
+ }
405
+
406
+ const refreshAssignments: Effect.Effect<void, never, Scope.Scope> = pipe(
407
+ Stream.fromEffect(Effect.map(shardManager.getAssignments, (_) => [_, true] as const)),
408
+ Stream.merge(
409
+ pipe(
410
+ storage.assignmentsStream,
411
+ Stream.map((_) => [_, false] as const)
412
+ )
413
+ ),
414
+ Stream.mapEffect(([assignmentsOpt, fromShardManager]) => updateAssignments(assignmentsOpt, fromShardManager)),
415
+ Stream.tap(() => startSingletonsIfNeeded),
416
+ Stream.runDrain,
417
+ Effect.retry(Schedule.fixed(config.refreshAssignmentsRetryInterval)),
418
+ Effect.interruptible,
419
+ Effect.forkScoped,
420
+ Effect.asVoid
421
+ )
422
+
423
+ function sendMessageToLocalEntityManagerWithoutRetries(
424
+ envelope: SerializedEnvelope.SerializedEnvelope
425
+ ): Effect.Effect<
426
+ MessageState.MessageState<SerializedMessage.SerializedMessage>,
427
+ ShardingException.ShardingException
428
+ > {
429
+ return pipe(
430
+ getEntityManagerByEntityTypeName(envelope.recipientAddress.recipientTypeName),
431
+ Effect.flatMap((entityManager) => entityManager.sendAndGetState(envelope)),
432
+ Effect.annotateLogs("envelope", envelope)
433
+ )
434
+ }
435
+
436
+ function sendMessageToRemotePodWithoutRetries(
437
+ pod: PodAddress.PodAddress,
438
+ envelope: SerializedEnvelope.SerializedEnvelope
439
+ ): Effect.Effect<
440
+ MessageState.MessageState<SerializedMessage.SerializedMessage>,
441
+ ShardingException.ShardingException
442
+ > {
443
+ return pipe(
444
+ pods.sendAndGetState(pod, envelope),
445
+ Effect.tapError((error) => {
446
+ if (ShardingException.isPodUnavailableException(error)) {
447
+ const notify = pipe(
448
+ Clock.currentTimeMillis,
449
+ Effect.flatMap((cdt) =>
450
+ pipe(
451
+ Ref.updateAndGet(lastUnhealthyNodeReported, (old) =>
452
+ old + Duration.toMillis(config.unhealthyPodReportInterval) < cdt ? cdt : old),
453
+ Effect.map((_) =>
454
+ _ === cdt
455
+ )
456
+ )
457
+ )
458
+ )
459
+
460
+ return pipe(
461
+ shardManager.notifyUnhealthyPod(pod),
462
+ Effect.zipRight(shardManager.getAssignments),
463
+ Effect.flatMap((_) => updateAssignments(_, true)),
464
+ Effect.forkDaemon,
465
+ Effect.whenEffect(notify),
466
+ Effect.asVoid
467
+ )
468
+ }
469
+ return Effect.void
470
+ }),
471
+ Effect.annotateLogs("pod", pod),
472
+ Effect.annotateLogs("envelope", envelope)
473
+ )
474
+ }
475
+
476
+ function sendMessageToPodWithoutRetries(
477
+ pod: PodAddress.PodAddress,
478
+ envelope: SerializedEnvelope.SerializedEnvelope
479
+ ): Effect.Effect<
480
+ MessageState.MessageState<SerializedMessage.SerializedMessage>,
481
+ ShardingException.ShardingException
482
+ > {
483
+ return equals(pod, address)
484
+ ? sendMessageToLocalEntityManagerWithoutRetries(envelope)
485
+ : sendMessageToRemotePodWithoutRetries(pod, envelope)
486
+ }
487
+
488
+ function messenger<Msg extends Message.Message.Any>(
489
+ entityType: RecipientType.EntityType<Msg>
490
+ ): Messenger<Msg> {
491
+ function sendDiscard(entityId: string) {
492
+ return (message: Msg) =>
493
+ pipe(
494
+ sendMessage(entityId, message),
495
+ Effect.asVoid
496
+ )
497
+ }
498
+
499
+ function send(entityId: string) {
500
+ return <A extends Msg & Message.Message.Any>(message: A) => {
501
+ return pipe(
502
+ sendMessage(entityId, message),
503
+ Effect.flatMap((state) =>
504
+ MessageState.mapEffect(state, (body) => serialization.decode(Message.exitSchema(message), body))
505
+ ),
506
+ Effect.flatMap((state) =>
507
+ Unify.unify(pipe(
508
+ state,
509
+ MessageState.match({
510
+ onAcknowledged: () => Effect.fail(new ShardingException.NoResultInProcessedMessageStateException()),
511
+ onProcessed: (state) => Effect.succeed(state.result)
512
+ })
513
+ ))
514
+ ),
515
+ Effect.retry(pipe(
516
+ Schedule.fixed(100),
517
+ Schedule.whileInput((error: unknown) => ShardingException.isNoResultInProcessedMessageStateException(error))
518
+ )),
519
+ Effect.flatten,
520
+ Effect.interruptible
521
+ )
522
+ }
523
+ }
524
+
525
+ function sendMessage<A extends Msg>(
526
+ entityId: string,
527
+ message: A
528
+ ): Effect.Effect<
529
+ MessageState.MessageState<SerializedMessage.SerializedMessage>,
530
+ ShardingException.ShardingException
531
+ > {
532
+ const recipientAddress = RecipientAddress.makeRecipientAddress(entityType.name, entityId)
533
+ const shardId = getShardId(recipientAddress)
534
+
535
+ return Effect.flatMap(serialization.encode(entityType.schema, message), (body) =>
536
+ pipe(
537
+ getPodAddressForShardId(shardId),
538
+ Effect.flatMap((pod) =>
539
+ Option.isSome(pod)
540
+ ? Effect.succeed(pod.value)
541
+ : Effect.fail(new ShardingException.EntityNotManagedByThisPodException({ recipientAddress }))
542
+ ),
543
+ Effect.flatMap((pod) =>
544
+ sendMessageToPodWithoutRetries(
545
+ pod,
546
+ SerializedEnvelope.make(
547
+ recipientAddress,
548
+ PrimaryKey.value(message),
549
+ body
550
+ )
551
+ )
552
+ ),
553
+ Effect.retry(pipe(
554
+ Schedule.fixed(Duration.millis(100)),
555
+ Schedule.whileInput((error: unknown) =>
556
+ ShardingException.isPodUnavailableException(error) ||
557
+ ShardingException.isEntityNotManagedByThisPodException(error)
558
+ )
559
+ ))
560
+ ))
561
+ }
562
+
563
+ return { sendDiscard, send }
564
+ }
565
+
566
+ function broadcaster<Msg extends Message.Message.Any>(
567
+ topicType: RecipientType.TopicType<Msg>
568
+ ): Broadcaster.Broadcaster<Msg> {
569
+ function sendMessage<A extends Msg>(
570
+ topicId: string,
571
+ message: A
572
+ ): Effect.Effect<
573
+ HashMap.HashMap<
574
+ PodAddress.PodAddress,
575
+ Either.Either<
576
+ MessageState.MessageState<SerializedMessage.SerializedMessage>,
577
+ ShardingException.ShardingException
578
+ >
579
+ >,
580
+ ShardingException.ShardingException
581
+ > {
582
+ return Effect.flatMap(serialization.encode(topicType.schema, message), (body) =>
583
+ pipe(
584
+ getPods,
585
+ Effect.flatMap((pods) =>
586
+ Effect.forEach(
587
+ pods,
588
+ (pod) =>
589
+ pipe(
590
+ sendMessageToPodWithoutRetries(
591
+ pod,
592
+ SerializedEnvelope.make(
593
+ RecipientAddress.makeRecipientAddress(topicType.name, topicId),
594
+ PrimaryKey.value(message),
595
+ body
596
+ )
597
+ ),
598
+ Effect.retry(pipe(
599
+ Schedule.fixed(Duration.millis(100)),
600
+ Schedule.whileInput((error: unknown) =>
601
+ ShardingException.isPodUnavailableException(error) ||
602
+ ShardingException.isEntityNotManagedByThisPodException(error)
603
+ )
604
+ )),
605
+ Effect.either,
606
+ Effect.map((res) => [pod, res] as const)
607
+ ),
608
+ { concurrency: "inherit" }
609
+ )
610
+ ),
611
+ Effect.map((_) => HashMap.fromIterable(_))
612
+ ))
613
+ }
614
+
615
+ function broadcastDiscard(topicId: string) {
616
+ return (message: Msg) =>
617
+ pipe(
618
+ sendMessage(topicId, message),
619
+ Effect.asVoid
620
+ )
621
+ }
622
+
623
+ function broadcast(topicId: string) {
624
+ return <A extends Msg & Message.Message.Any>(message: A) => {
625
+ return pipe(
626
+ sendMessage(topicId, message),
627
+ Effect.flatMap((results) =>
628
+ pipe(
629
+ Effect.forEach(results, ([pod, eitherResult]) =>
630
+ pipe(
631
+ eitherResult,
632
+ Effect.flatMap((state) =>
633
+ MessageState.mapEffect(state, (body) => serialization.decode(Message.exitSchema(message), body))
634
+ ),
635
+ Effect.flatMap((state) =>
636
+ Unify.unify(pipe(
637
+ state,
638
+ MessageState.match({
639
+ onAcknowledged: () =>
640
+ Effect.fail(new ShardingException.NoResultInProcessedMessageStateException()),
641
+ onProcessed: (state) => Effect.succeed(state.result)
642
+ })
643
+ ))
644
+ ),
645
+ Effect.retry(pipe(
646
+ Schedule.fixed(100),
647
+ Schedule.whileInput((error: unknown) =>
648
+ ShardingException.isNoResultInProcessedMessageStateException(error)
649
+ )
650
+ )),
651
+ Effect.flatMap((_) => _),
652
+ Effect.either,
653
+ Effect.map((res) => [pod, res] as const)
654
+ ))
655
+ )
656
+ ),
657
+ Effect.map((_) => HashMap.fromIterable(_))
658
+ )
659
+ }
660
+ }
661
+
662
+ return { broadcast, broadcastDiscard }
663
+ }
664
+
665
+ function registerEntity<Msg extends Message.Message.Any>(
666
+ entityType: RecipientType.EntityType<Msg>
667
+ ) {
668
+ return <R>(
669
+ behavior: RecipientBehaviour.RecipientBehaviour<Msg, R>,
670
+ options?: RecipientBehaviour.EntityBehaviourOptions
671
+ ): Effect.Effect<void, never, Exclude<R, RecipientBehaviourContext.RecipientBehaviourContext>> =>
672
+ pipe(
673
+ registerRecipient(entityType, behavior, options),
674
+ Effect.zipRight(PubSub.publish(eventsHub, ShardingRegistrationEvent.EntityRegistered(entityType))),
675
+ Effect.asVoid
676
+ )
677
+ }
678
+
679
+ function registerTopic<Msg extends Message.Message.Any>(
680
+ topicType: RecipientType.TopicType<Msg>
681
+ ) {
682
+ return <R>(
683
+ behavior: RecipientBehaviour.RecipientBehaviour<Msg, R>,
684
+ options?: RecipientBehaviour.EntityBehaviourOptions
685
+ ): Effect.Effect<void, never, Exclude<R, RecipientBehaviourContext.RecipientBehaviourContext>> =>
686
+ pipe(
687
+ registerRecipient(topicType, behavior, options),
688
+ Effect.zipRight(PubSub.publish(eventsHub, ShardingRegistrationEvent.TopicRegistered(topicType))),
689
+ Effect.asVoid
690
+ )
691
+ }
692
+
693
+ const getShardingRegistrationEvents: Stream.Stream<ShardingRegistrationEvent.ShardingRegistrationEvent> = Stream
694
+ .fromPubSub(eventsHub)
695
+
696
+ function registerRecipient<Msg extends Message.Message.Any, R>(
697
+ recipientType: RecipientType.RecipientType<Msg>,
698
+ behavior: RecipientBehaviour.RecipientBehaviour<Msg, R>,
699
+ options?: RecipientBehaviour.EntityBehaviourOptions
700
+ ) {
701
+ return Effect.gen(function*($) {
702
+ const entityManager = yield* $(
703
+ EntityManager.make(
704
+ recipientType,
705
+ behavior,
706
+ self,
707
+ config,
708
+ serialization,
709
+ options
710
+ )
711
+ )
712
+
713
+ yield* $(
714
+ Ref.update(entityManagers, HashMap.set(recipientType.name, entityManager as any))
715
+ )
716
+ })
717
+ }
718
+
719
+ const registerScoped = Effect.acquireRelease(register, (_) => unregister)
720
+
721
+ const self: Sharding.Sharding = {
722
+ [ShardingTypeId]: ShardingTypeId,
723
+ getShardId,
724
+ register,
725
+ unregister,
726
+ registerScoped,
727
+ messenger,
728
+ broadcaster,
729
+ isEntityOnLocalShards,
730
+ isShuttingDown,
731
+ registerSingleton,
732
+ registerEntity,
733
+ registerTopic,
734
+ assign,
735
+ unassign,
736
+ getShardingRegistrationEvents,
737
+ getPods,
738
+ getAssignedShardIds,
739
+ refreshAssignments,
740
+ sendMessageToLocalEntityManagerWithoutRetries
741
+ }
742
+
743
+ return self
744
+ }
745
+ /**
746
+ * @internal
747
+ */
748
+ export const live = Layer.scoped(
749
+ shardingTag,
750
+ Effect.gen(function*(_) {
751
+ const config = yield* _(ShardingConfig.ShardingConfig)
752
+ const pods = yield* _(Pods.Pods)
753
+ const shardManager = yield* _(ShardManagerClient.ShardManagerClient)
754
+ const storage = yield* _(Storage.Storage)
755
+ const serialization = yield* _(Serialization.Serialization)
756
+ const shardsCache = yield* _(Ref.make(HashMap.empty<ShardId.ShardId, PodAddress.PodAddress>()))
757
+ const entityManagers = yield* _(Ref.make(HashMap.empty<string, EntityManager.EntityManager>()))
758
+ const shuttingDown = yield* _(Ref.make(false))
759
+ const eventsHub = yield* _(PubSub.unbounded<ShardingRegistrationEvent.ShardingRegistrationEvent>())
760
+ const singletons = yield* _(Synchronized.make<List.List<SingletonEntry>>(List.nil()))
761
+ const layerScope = yield* _(Effect.scope)
762
+ const cdt = yield* _(Clock.currentTimeMillis)
763
+ const lastUnhealthyNodeReported = yield* _(Ref.make(cdt))
764
+ yield* _(Effect.addFinalizer(() =>
765
+ pipe(
766
+ Synchronized.get(singletons),
767
+ Effect.flatMap(
768
+ Effect.forEach(([_, __, fa]) => Option.isSome(fa) ? Fiber.interrupt(fa.value) : Effect.void)
769
+ )
770
+ )
771
+ ))
772
+
773
+ const sharding = make(
774
+ layerScope,
775
+ PodAddress.make(config.selfHost, config.shardingPort),
776
+ config,
777
+ shardsCache,
778
+ entityManagers,
779
+ singletons,
780
+ lastUnhealthyNodeReported,
781
+ shuttingDown,
782
+ shardManager,
783
+ pods,
784
+ storage,
785
+ serialization,
786
+ eventsHub
787
+ )
788
+
789
+ yield* _(sharding.refreshAssignments)
790
+
791
+ return sharding
792
+ })
793
+ )