@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
package/src/Runners.ts ADDED
@@ -0,0 +1,533 @@
1
+ /**
2
+ * @since 1.0.0
3
+ */
4
+ import * as Rpc from "@effect/rpc/Rpc"
5
+ import * as RpcClient_ from "@effect/rpc/RpcClient"
6
+ import * as RpcGroup from "@effect/rpc/RpcGroup"
7
+ import * as RpcSchema from "@effect/rpc/RpcSchema"
8
+ import * as Cause from "effect/Cause"
9
+ import * as Context from "effect/Context"
10
+ import * as Effect from "effect/Effect"
11
+ import * as Exit from "effect/Exit"
12
+ import * as FiberRef from "effect/FiberRef"
13
+ import * as Layer from "effect/Layer"
14
+ import * as Option from "effect/Option"
15
+ import * as RcMap from "effect/RcMap"
16
+ import * as Schema from "effect/Schema"
17
+ import type { Scope } from "effect/Scope"
18
+ import {
19
+ AlreadyProcessingMessage,
20
+ EntityNotManagedByRunner,
21
+ MailboxFull,
22
+ PersistenceError,
23
+ RunnerUnavailable
24
+ } from "./ClusterError.js"
25
+ import { Persisted } from "./ClusterSchema.js"
26
+ import * as Envelope from "./Envelope.js"
27
+ import * as Message from "./Message.js"
28
+ import * as MessageStorage from "./MessageStorage.js"
29
+ import * as Reply from "./Reply.js"
30
+ import type { RunnerAddress } from "./RunnerAddress.js"
31
+ import { ShardingConfig } from "./ShardingConfig.js"
32
+ import * as Snowflake from "./Snowflake.js"
33
+
34
+ /**
35
+ * @since 1.0.0
36
+ * @category context
37
+ */
38
+ export class Runners extends Context.Tag("@effect/cluster/Runners")<Runners, {
39
+ /**
40
+ * Checks if a Runner is responsive.
41
+ */
42
+ readonly ping: (address: RunnerAddress) => Effect.Effect<void, RunnerUnavailable>
43
+
44
+ /**
45
+ * Send a message locally.
46
+ *
47
+ * This ensures that the message hits storage before being sent to the local
48
+ * entity.
49
+ */
50
+ readonly sendLocal: <R extends Rpc.Any>(
51
+ options: {
52
+ readonly message: Message.Outgoing<R>
53
+ readonly send: <Rpc extends Rpc.Any>(
54
+ message: Message.IncomingLocal<Rpc>
55
+ ) => Effect.Effect<void, EntityNotManagedByRunner | MailboxFull | AlreadyProcessingMessage>
56
+ readonly simulateRemoteSerialization: boolean
57
+ }
58
+ ) => Effect.Effect<void, EntityNotManagedByRunner | MailboxFull | AlreadyProcessingMessage>
59
+
60
+ /**
61
+ * Send a message to a Runner.
62
+ */
63
+ readonly send: <R extends Rpc.Any>(
64
+ options: {
65
+ readonly address: RunnerAddress
66
+ readonly message: Message.Outgoing<R>
67
+ }
68
+ ) => Effect.Effect<
69
+ void,
70
+ EntityNotManagedByRunner | RunnerUnavailable | MailboxFull | AlreadyProcessingMessage | PersistenceError
71
+ >
72
+
73
+ /**
74
+ * Notify a Runner that a message is available, then read replies from storage.
75
+ */
76
+ readonly notify: <R extends Rpc.Any>(
77
+ options: {
78
+ readonly address: Option.Option<RunnerAddress>
79
+ readonly message: Message.Outgoing<R>
80
+ readonly discard: boolean
81
+ }
82
+ ) => Effect.Effect<void>
83
+
84
+ /**
85
+ * Notify the current Runner that a message is available, then read replies from
86
+ * storage.
87
+ *
88
+ * This ensures that the message hits storage before being sent to the local
89
+ * entity.
90
+ */
91
+ readonly notifyLocal: <R extends Rpc.Any>(
92
+ options: {
93
+ readonly message: Message.Outgoing<R>
94
+ readonly notify: (options: Message.IncomingLocal<any>) => Effect.Effect<void, EntityNotManagedByRunner>
95
+ readonly discard: boolean
96
+ }
97
+ ) => Effect.Effect<void>
98
+ }>() {}
99
+
100
+ /**
101
+ * @since 1.0.0
102
+ * @category Constructors
103
+ */
104
+ export const make: (options: Omit<Runners["Type"], "sendLocal" | "notifyLocal">) => Effect.Effect<
105
+ Runners["Type"],
106
+ never,
107
+ MessageStorage.MessageStorage | Snowflake.Generator | ShardingConfig | Scope
108
+ > = Effect.fnUntraced(function*(options: Omit<Runners["Type"], "sendLocal" | "notifyLocal">) {
109
+ const storage = yield* MessageStorage.MessageStorage
110
+ const snowflakeGen = yield* Snowflake.Generator
111
+ const config = yield* ShardingConfig
112
+
113
+ const requestIdRewrites = new Map<Snowflake.Snowflake, Snowflake.Snowflake>()
114
+
115
+ function notifyWith<E>(
116
+ message: Message.Outgoing<any>,
117
+ afterPersist: (message: Message.Outgoing<any>, isDuplicate: boolean) => Effect.Effect<void, E>
118
+ ): Effect.Effect<void, E> {
119
+ const rpc = message.rpc as any as Rpc.AnyWithProps
120
+ const persisted = Context.get(rpc.annotations, Persisted)
121
+ if (!persisted) {
122
+ return Effect.dieMessage("Runners.notify only supports persisted messages")
123
+ }
124
+
125
+ if (message._tag === "OutgoingEnvelope") {
126
+ const rewriteId = requestIdRewrites.get(message.envelope.requestId)
127
+ const requestId = rewriteId ?? message.envelope.requestId
128
+ const entry = storageRequests.get(requestId)
129
+ if (rewriteId) {
130
+ message = new Message.OutgoingEnvelope({
131
+ ...message,
132
+ envelope: message.envelope.withRequestId(rewriteId)
133
+ })
134
+ }
135
+ return storage.saveEnvelope(message).pipe(
136
+ Effect.orDie,
137
+ Effect.zipRight(
138
+ entry ? Effect.zipRight(entry.latch.open, afterPersist(message, false)) : afterPersist(message, false)
139
+ )
140
+ )
141
+ }
142
+
143
+ // For requests, after persisting the request, we need to check if the
144
+ // request is a duplicate. If it is, we need to resume from the last
145
+ // received reply.
146
+ //
147
+ // Otherwise, we notify the remote entity and then reply from storage.
148
+ return Effect.flatMap(
149
+ Effect.orDie(storage.saveRequest(message)),
150
+ MessageStorage.SaveResult.$match({
151
+ Success: () => afterPersist(message, false),
152
+ Duplicate: ({ lastReceivedReply, originalId }) => {
153
+ requestIdRewrites.set(message.envelope.requestId, originalId)
154
+ return afterPersist(
155
+ new Message.OutgoingRequest({
156
+ ...message,
157
+ lastReceivedReply,
158
+ envelope: Envelope.makeRequest({
159
+ ...message.envelope,
160
+ requestId: originalId
161
+ }),
162
+ respond(reply) {
163
+ if (reply._tag === "WithExit") {
164
+ requestIdRewrites.delete(message.envelope.requestId)
165
+ }
166
+ return message.respond(reply.withRequestId(message.envelope.requestId))
167
+ }
168
+ }),
169
+ true
170
+ )
171
+ }
172
+ })
173
+ )
174
+ }
175
+
176
+ type StorageRequestEntry = {
177
+ readonly latch: Effect.Latch
178
+ replies: Array<Reply.Reply<any>>
179
+ }
180
+ const storageRequests = new Map<Snowflake.Snowflake, StorageRequestEntry>()
181
+ const waitingStorageRequests = new Map<Snowflake.Snowflake, Message.OutgoingRequest<any>>()
182
+ const replyFromStorage = Effect.fnUntraced(
183
+ function*(message: Message.OutgoingRequest<any>) {
184
+ const entry: StorageRequestEntry = {
185
+ latch: Effect.unsafeMakeLatch(false),
186
+ replies: []
187
+ }
188
+ storageRequests.set(message.envelope.requestId, entry)
189
+
190
+ while (true) {
191
+ // wait for the storage loop to notify us
192
+ entry.latch.unsafeClose()
193
+ waitingStorageRequests.set(message.envelope.requestId, message)
194
+ yield* storageLatch.open
195
+ yield* entry.latch.await
196
+
197
+ // send the replies back
198
+ for (const reply of entry.replies) {
199
+ // we have reached the end
200
+ if (reply._tag === "WithExit") {
201
+ return yield* message.respond(reply)
202
+ }
203
+
204
+ entry.latch.unsafeClose()
205
+ yield* message.respond(reply)
206
+ yield* entry.latch.await
207
+ }
208
+ entry.replies = []
209
+ }
210
+ },
211
+ (effect, message) =>
212
+ Effect.ensuring(
213
+ effect,
214
+ Effect.sync(() => {
215
+ storageRequests.delete(message.envelope.requestId)
216
+ waitingStorageRequests.delete(message.envelope.requestId)
217
+ })
218
+ )
219
+ )
220
+
221
+ const storageLatch = Effect.unsafeMakeLatch(false)
222
+ if (storage !== MessageStorage.noop) {
223
+ yield* Effect.gen(function*() {
224
+ while (true) {
225
+ yield* storageLatch.await
226
+ storageLatch.unsafeClose()
227
+
228
+ const replies = yield* storage.repliesFor(waitingStorageRequests.values()).pipe(
229
+ Effect.catchAllCause((cause) =>
230
+ Effect.as(
231
+ Effect.annotateLogs(Effect.logDebug(cause), {
232
+ package: "@effect/cluster",
233
+ module: "Runners",
234
+ fiber: "Read replies loop"
235
+ }),
236
+ []
237
+ )
238
+ )
239
+ )
240
+
241
+ const foundRequests = new Set<StorageRequestEntry>()
242
+
243
+ // put the replies into the storage requests and then open the latches
244
+ for (const reply of replies) {
245
+ const entry = storageRequests.get(reply.requestId)
246
+ if (!entry) continue
247
+ entry.replies.push(reply)
248
+ waitingStorageRequests.delete(reply.requestId)
249
+ foundRequests.add(entry)
250
+ }
251
+
252
+ for (const entry of foundRequests) {
253
+ entry.latch.unsafeOpen()
254
+ }
255
+ }
256
+ }).pipe(
257
+ Effect.interruptible,
258
+ Effect.forkScoped
259
+ )
260
+
261
+ yield* Effect.suspend(() => {
262
+ if (waitingStorageRequests.size === 0) {
263
+ return storageLatch.await
264
+ }
265
+ return storageLatch.open
266
+ }).pipe(
267
+ Effect.delay(config.entityReplyPollInterval),
268
+ Effect.forever,
269
+ Effect.interruptible,
270
+ Effect.forkScoped
271
+ )
272
+ }
273
+
274
+ return Runners.of({
275
+ ...options,
276
+ sendLocal(options) {
277
+ const message = options.message
278
+ if (!options.simulateRemoteSerialization) {
279
+ return options.send(Message.incomingLocalFromOutgoing(message))
280
+ }
281
+ return Message.serialize(message).pipe(
282
+ Effect.flatMap((encoded) => Message.deserializeLocal(message, encoded)),
283
+ Effect.flatMap(options.send),
284
+ Effect.catchTag("MalformedMessage", (error) => {
285
+ if (message._tag === "OutgoingEnvelope") {
286
+ return Effect.die(error)
287
+ }
288
+ return Effect.orDie(message.respond(
289
+ new Reply.WithExit({
290
+ id: snowflakeGen.unsafeNext(),
291
+ requestId: message.envelope.requestId,
292
+ exit: Exit.die(error)
293
+ })
294
+ ))
295
+ })
296
+ )
297
+ },
298
+ notify(options_) {
299
+ const { discard, message } = options_
300
+ return notifyWith(message, (message) => {
301
+ if (message._tag === "OutgoingEnvelope") {
302
+ return options.notify(options_)
303
+ }
304
+ return discard ? options.notify(options_) : options.notify(options_).pipe(
305
+ Effect.fork,
306
+ Effect.andThen(Effect.orDie(replyFromStorage(message)))
307
+ )
308
+ })
309
+ },
310
+ notifyLocal(options) {
311
+ return notifyWith(options.message, (message, duplicate) => {
312
+ if (options.discard || message._tag === "OutgoingEnvelope") {
313
+ return Effect.orDie(options.notify(Message.incomingLocalFromOutgoing(message)))
314
+ } else if (!duplicate) {
315
+ return storage.registerReplyHandler(message).pipe(
316
+ Effect.andThen(Effect.orDie(options.notify(Message.incomingLocalFromOutgoing(message))))
317
+ )
318
+ }
319
+ return Effect.orDie(options.notify(Message.incomingLocalFromOutgoing(message))).pipe(
320
+ Effect.fork,
321
+ Effect.andThen(Effect.orDie(replyFromStorage(message)))
322
+ )
323
+ })
324
+ }
325
+ })
326
+ })
327
+
328
+ /**
329
+ * @since 1.0.0
330
+ * @category No-op
331
+ */
332
+ export const makeNoop: Effect.Effect<
333
+ Runners["Type"],
334
+ never,
335
+ MessageStorage.MessageStorage | Snowflake.Generator | ShardingConfig | Scope
336
+ > = make({
337
+ send: ({ message }) => Effect.fail(new EntityNotManagedByRunner({ address: message.envelope.address })),
338
+ notify: () => Effect.void,
339
+ ping: () => Effect.void
340
+ })
341
+
342
+ /**
343
+ * @since 1.0.0
344
+ * @category Layers
345
+ */
346
+ export const layerNoop: Layer.Layer<
347
+ Runners,
348
+ never,
349
+ ShardingConfig | MessageStorage.MessageStorage
350
+ > = Layer.scoped(Runners, makeNoop).pipe(Layer.provide([Snowflake.layerGenerator]))
351
+
352
+ const rpcErrors: Schema.Union<[
353
+ typeof EntityNotManagedByRunner,
354
+ typeof MailboxFull,
355
+ typeof AlreadyProcessingMessage,
356
+ typeof PersistenceError
357
+ ]> = Schema.Union(EntityNotManagedByRunner, MailboxFull, AlreadyProcessingMessage, PersistenceError)
358
+
359
+ /**
360
+ * @since 1.0.0
361
+ * @category Rpcs
362
+ */
363
+ export class Rpcs extends RpcGroup.make(
364
+ Rpc.make("Ping"),
365
+ Rpc.make("Notify", {
366
+ payload: {
367
+ envelope: Envelope.PartialEncoded
368
+ },
369
+ success: Schema.Void,
370
+ error: EntityNotManagedByRunner
371
+ }),
372
+ Rpc.make("Effect", {
373
+ payload: {
374
+ request: Envelope.PartialEncodedRequest
375
+ },
376
+ success: Schema.Object as Schema.Schema<Reply.ReplyEncoded<any>>,
377
+ error: rpcErrors
378
+ }),
379
+ Rpc.make("Stream", {
380
+ payload: {
381
+ request: Envelope.PartialEncodedRequest
382
+ },
383
+ error: rpcErrors,
384
+ success: Schema.Object as Schema.Schema<Reply.ReplyEncoded<any>>,
385
+ stream: true
386
+ }),
387
+ Rpc.make("Envelope", {
388
+ payload: { envelope: Schema.Union(Envelope.AckChunk, Envelope.Interrupt) },
389
+ error: rpcErrors
390
+ })
391
+ ) {}
392
+
393
+ /**
394
+ * @since 1.0.0
395
+ * @category Rpcs
396
+ */
397
+ export interface RpcClient extends RpcClient_.FromGroup<typeof Rpcs> {}
398
+
399
+ /**
400
+ * @since 1.0.0
401
+ * @category Rpcs
402
+ */
403
+ export const makeRpcClient: Effect.Effect<
404
+ RpcClient,
405
+ never,
406
+ RpcClient_.Protocol | Scope
407
+ > = RpcClient_.make(Rpcs, { spanPrefix: "Runners", disableTracing: true })
408
+
409
+ /**
410
+ * @since 1.0.0
411
+ * @category constructors
412
+ */
413
+ export const makeRpc: Effect.Effect<
414
+ Runners["Type"],
415
+ never,
416
+ Scope | RpcClientProtocol | MessageStorage.MessageStorage | Snowflake.Generator | ShardingConfig
417
+ > = Effect.gen(function*() {
418
+ const makeClientProtocol = yield* RpcClientProtocol
419
+ const snowflakeGen = yield* Snowflake.Generator
420
+
421
+ const clients = yield* RcMap.make({
422
+ lookup: (address: RunnerAddress) =>
423
+ Effect.flatMap(
424
+ makeClientProtocol(address),
425
+ (protocol) => Effect.provideService(makeRpcClient, RpcClient_.Protocol, protocol)
426
+ ),
427
+ idleTimeToLive: "1 minute"
428
+ })
429
+
430
+ return yield* make({
431
+ ping(address) {
432
+ return RcMap.get(clients, address).pipe(
433
+ Effect.flatMap((client) => client.Ping()),
434
+ Effect.catchAllCause(() => Effect.fail(new RunnerUnavailable({ address }))),
435
+ Effect.scoped
436
+ )
437
+ },
438
+ send({ address, message }) {
439
+ if (message._tag === "OutgoingEnvelope") {
440
+ return RcMap.get(clients, address).pipe(
441
+ Effect.flatMap((client) => client.Envelope({ envelope: message.envelope })),
442
+ Effect.scoped,
443
+ Effect.catchAllDefect(() => Effect.fail(new RunnerUnavailable({ address })))
444
+ )
445
+ }
446
+ const rpc = message.rpc as any as Rpc.AnyWithProps
447
+ const isStream = RpcSchema.isStreamSchema(rpc.successSchema)
448
+ if (!isStream) {
449
+ return Effect.matchEffect(Message.serializeRequest(message), {
450
+ onSuccess: (request) =>
451
+ RcMap.get(clients, address).pipe(
452
+ Effect.flatMap((client) => client.Effect({ request })),
453
+ Effect.flatMap((reply) =>
454
+ Schema.decode(Reply.Reply(message.rpc))(reply).pipe(
455
+ Effect.locally(FiberRef.currentContext, message.context),
456
+ Effect.orDie
457
+ )
458
+ ),
459
+ Effect.flatMap(message.respond),
460
+ Effect.scoped,
461
+ Effect.catchAllDefect(() => Effect.fail(new RunnerUnavailable({ address })))
462
+ ),
463
+ onFailure: (error) =>
464
+ message.respond(
465
+ new Reply.WithExit({
466
+ id: snowflakeGen.unsafeNext(),
467
+ requestId: message.envelope.requestId,
468
+ exit: Exit.die(error)
469
+ })
470
+ )
471
+ })
472
+ }
473
+ return Effect.matchEffect(Message.serializeRequest(message), {
474
+ onSuccess: (request) =>
475
+ RcMap.get(clients, address).pipe(
476
+ Effect.flatMap((client) => client.Stream({ request }, { asMailbox: true })),
477
+ Effect.flatMap((mailbox) => {
478
+ const decode = Schema.decode(Reply.Reply(message.rpc))
479
+ return mailbox.take.pipe(
480
+ Effect.flatMap((reply) => Effect.orDie(decode(reply))),
481
+ Effect.flatMap(message.respond),
482
+ Effect.forever,
483
+ Effect.locally(FiberRef.currentContext, message.context),
484
+ Effect.catchIf(Cause.isNoSuchElementException, () => Effect.void),
485
+ Effect.catchAllDefect(() => Effect.fail(new RunnerUnavailable({ address })))
486
+ )
487
+ }),
488
+ Effect.scoped
489
+ ),
490
+ onFailure: (error) =>
491
+ message.respond(
492
+ new Reply.WithExit({
493
+ id: snowflakeGen.unsafeNext(),
494
+ requestId: message.envelope.requestId,
495
+ exit: Exit.die(error)
496
+ })
497
+ )
498
+ })
499
+ },
500
+ notify({ address, message }) {
501
+ if (Option.isNone(address)) {
502
+ return Effect.void
503
+ }
504
+ const envelope = message.envelope
505
+ return RcMap.get(clients, address.value).pipe(
506
+ Effect.flatMap((client) => client.Notify({ envelope })),
507
+ Effect.scoped,
508
+ Effect.ignore
509
+ )
510
+ }
511
+ })
512
+ })
513
+
514
+ /**
515
+ * @since 1.0.0
516
+ * @category Layers
517
+ */
518
+ export const layerRpc: Layer.Layer<
519
+ Runners,
520
+ never,
521
+ MessageStorage.MessageStorage | RpcClientProtocol | ShardingConfig
522
+ > = Layer.scoped(Runners, makeRpc).pipe(
523
+ Layer.provide(Snowflake.layerGenerator)
524
+ )
525
+
526
+ /**
527
+ * @since 1.0.0
528
+ * @category Client
529
+ */
530
+ export class RpcClientProtocol extends Context.Tag("@effect/cluster/Runners/RpcClientProtocol")<
531
+ RpcClientProtocol,
532
+ (address: RunnerAddress) => Effect.Effect<RpcClient_.Protocol["Type"], never, Scope>
533
+ >() {}
package/src/ShardId.ts CHANGED
@@ -2,78 +2,26 @@
2
2
  * @since 1.0.0
3
3
  */
4
4
  import * as Schema from "effect/Schema"
5
- import { TypeIdSchema } from "./internal/utils.js"
6
-
7
- /** @internal */
8
- const ShardIdSymbolKey = "@effect/cluster/ShardId"
9
-
10
- /**
11
- * @since 1.0.0
12
- * @category symbols
13
- */
14
- export const ShardIdTypeId: unique symbol = Symbol.for(ShardIdSymbolKey)
15
5
 
16
6
  /**
17
7
  * @since 1.0.0
18
- * @category symbols
19
- */
20
- export type ShardIdTypeId = typeof ShardIdTypeId
21
-
22
- /** @internal */
23
- const ShardIdTypeIdSchema = TypeIdSchema(ShardIdSymbolKey, ShardIdTypeId)
24
-
25
- /**
26
- * A shard is a logical grouping of multiple entities. There could be thousands of entities in your system,
27
- * so instead of managing every single entity id, the shard manager group them by shard id, and when they are assigned
28
- * or moved around, we always move all the entities with the same shard id.
29
- *
30
- * @since 1.0.0
31
- * @category models
8
+ * @category constructors
32
9
  */
33
- export class ShardId extends Schema.Class<ShardId>(ShardIdSymbolKey)({
34
- [ShardIdTypeId]: Schema.propertySignature(ShardIdTypeIdSchema).pipe(Schema.fromKey(ShardIdSymbolKey)),
35
- value: Schema.Number
36
- }) {
37
- /**
38
- * @since 1.0.0
39
- */
40
- toString() {
41
- return `ShardId(${this.value})`
42
- }
43
- }
10
+ export const ShardId = Schema.Int.pipe(
11
+ Schema.brand("ShardId"),
12
+ Schema.annotations({
13
+ pretty: () => (shardId) => `ShardId(${shardId})`
14
+ })
15
+ )
44
16
 
45
17
  /**
46
18
  * @since 1.0.0
47
19
  * @category models
48
20
  */
49
- export namespace ShardId {
50
- /**
51
- * This is the shape that a shard id has over the wire.
52
- *
53
- * @since 1.0.0
54
- * @category models
55
- */
56
- export interface Encoded extends Schema.Schema.Encoded<typeof ShardId> {}
57
- }
58
-
59
- /**
60
- * Constructs a shard id from its numerical value.
61
- * The shard id is currently built up by making the hash of the entity id, and then modulo the max amount of shards configured in ManagerConfig.
62
- *
63
- * @since 1.0.0
64
- * @category constructors
65
- */
66
- export function make(value: number): ShardId {
67
- return new ShardId({ [ShardIdTypeId]: ShardIdTypeId, value })
68
- }
21
+ export type ShardId = typeof ShardId.Type
69
22
 
70
23
  /**
71
- * This is the schema for a ShardId.
72
- *
73
24
  * @since 1.0.0
74
- * @category schema
25
+ * @category Constructors
75
26
  */
76
- export const schema: Schema.Schema<
77
- ShardId,
78
- ShardId.Encoded
79
- > = Schema.asSchema(ShardId)
27
+ export const make = (shardId: number): ShardId => ShardId.make(shardId)