diff --git a/.changeset/clean-pugs-serve.md b/.changeset/clean-pugs-serve.md new file mode 100644 index 00000000000..adbb4371724 --- /dev/null +++ b/.changeset/clean-pugs-serve.md @@ -0,0 +1,6 @@ +--- +"@effect/experimental": minor +"@effect/platform": patch +--- + +move the MsgPack, Ndjson & ChannelSchema modules to @effect/platform diff --git a/.changeset/dry-carpets-eat.md b/.changeset/dry-carpets-eat.md new file mode 100644 index 00000000000..cd1f0072e89 --- /dev/null +++ b/.changeset/dry-carpets-eat.md @@ -0,0 +1,10 @@ +--- +"@effect/rpc": minor +--- + +refactor @effect/rpc package + +This is a breaking change that is a significant refactor of the @effect/rpc +package. + +For more information, see the [README](https://github.com/Effect-TS/effect/blob/main/packages/rpc/README.md). diff --git a/.changeset/early-mails-turn.md b/.changeset/early-mails-turn.md new file mode 100644 index 00000000000..68839c881ff --- /dev/null +++ b/.changeset/early-mails-turn.md @@ -0,0 +1,5 @@ +--- +"@effect/platform": patch +--- + +add HttpRouter.Tag.serve api diff --git a/.changeset/friendly-coats-pretend.md b/.changeset/friendly-coats-pretend.md new file mode 100644 index 00000000000..8eeef191d91 --- /dev/null +++ b/.changeset/friendly-coats-pretend.md @@ -0,0 +1,5 @@ +--- +"@effect/experimental": patch +--- + +use unhandled error log level for SocketServer errors diff --git a/.changeset/nine-items-chew.md b/.changeset/nine-items-chew.md new file mode 100644 index 00000000000..ff4345e3736 --- /dev/null +++ b/.changeset/nine-items-chew.md @@ -0,0 +1,5 @@ +--- +"effect": patch +--- + +preserve interruptors in channel executor .runIn diff --git a/.changeset/spotty-carrots-travel.md b/.changeset/spotty-carrots-travel.md new file mode 100644 index 00000000000..f44c69788e9 --- /dev/null +++ b/.changeset/spotty-carrots-travel.md @@ -0,0 +1,9 @@ +--- +"@effect/experimental": minor +"@effect/platform-node-shared": patch +"@effect/platform-node": patch +"@effect/platform-bun": patch +"@effect/platform": patch +--- + +Move SocketServer modules to @effect/platform diff --git a/packages/cluster-browser/CHANGELOG.md b/packages/cluster-browser/CHANGELOG.md deleted file mode 100644 index d69f18f384b..00000000000 --- a/packages/cluster-browser/CHANGELOG.md +++ /dev/null @@ -1,1312 +0,0 @@ -# @effect/cluster - -## 0.22.3 - -### Patch Changes - -- Updated dependencies [[`0c4803f`](https://github.com/Effect-TS/effect/commit/0c4803fcc69262d11a97ce49d0e9b4288df0651f), [`6f65ac4`](https://github.com/Effect-TS/effect/commit/6f65ac4eac1489cd6ea390e18b0908670722adad)]: - - effect@3.13.12 - - @effect/rpc@0.54.3 - -## 0.22.2 - -### Patch Changes - -- Updated dependencies [[`fad8cca`](https://github.com/Effect-TS/effect/commit/fad8cca9bbfcc2eaeb44b97c15dbe0a1eda75315), [`4296293`](https://github.com/Effect-TS/effect/commit/4296293049414d0cf2d915a26c552b09f946b9a0), [`9c241ab`](https://github.com/Effect-TS/effect/commit/9c241abe47ccf7a5257b98a4a64a63054a12741d), [`082b0c1`](https://github.com/Effect-TS/effect/commit/082b0c1b9f4252bcdd69608f2e4a9226f953ac3f), [`389dca2`](https://github.com/Effect-TS/effect/commit/389dca2c590e76fa6e859fe1b6049e9c5287e1a0), [`be12983`](https://github.com/Effect-TS/effect/commit/be12983bc7e7537b41cd8910fc4eb7d1da56ab07), [`de88127`](https://github.com/Effect-TS/effect/commit/de88127a5a5906ccece98af74787b5ae0e65e431)]: - - effect@3.13.11 - - @effect/rpc@0.54.2 - -## 0.22.1 - -### Patch Changes - -- Updated dependencies [[`527c964`](https://github.com/Effect-TS/effect/commit/527c9645229f5be9714a7e60a38a9e753c4bbfb1)]: - - effect@3.13.10 - - @effect/rpc@0.54.1 - -## 0.22.0 - -### Patch Changes - -- Updated dependencies [[`2976e52`](https://github.com/Effect-TS/effect/commit/2976e52538d9dc9ffdcbc84d4ac748cff9305971)]: - - effect@3.13.9 - - @effect/rpc@0.54.0 - -## 0.21.1 - -### Patch Changes - -- Updated dependencies [[`c65d336`](https://github.com/Effect-TS/effect/commit/c65d3362d07ec815ff3b46278314e8a31706ddc2), [`22d2ebb`](https://github.com/Effect-TS/effect/commit/22d2ebb4b11f5a44351a4736e65da391a3b647d0)]: - - effect@3.13.8 - - @effect/rpc@0.53.1 - -## 0.21.0 - -### Patch Changes - -- Updated dependencies []: - - @effect/rpc@0.53.0 - -## 0.20.7 - -### Patch Changes - -- Updated dependencies [[`840cc73`](https://github.com/Effect-TS/effect/commit/840cc7329908db7ca693ef47b07d4f845c29cadd), [`9bf8a74`](https://github.com/Effect-TS/effect/commit/9bf8a74b967f18d931743dd5196af326c9118e9c), [`87ba23c`](https://github.com/Effect-TS/effect/commit/87ba23c41c193503ed0c612b0d32d0b253794c64)]: - - effect@3.13.7 - - @effect/rpc@0.52.7 - -## 0.20.6 - -### Patch Changes - -- Updated dependencies [[`3154ce4`](https://github.com/Effect-TS/effect/commit/3154ce4692fa18b804982158d3c4c8a8a5fae386)]: - - effect@3.13.6 - - @effect/rpc@0.52.6 - -## 0.20.5 - -### Patch Changes - -- Updated dependencies [[`367bb35`](https://github.com/Effect-TS/effect/commit/367bb35f4c2a254e1fb211d96db2474a7aed9020), [`6cf11c3`](https://github.com/Effect-TS/effect/commit/6cf11c3a75773ceec2877c85ddc760f381f0866d), [`a0acec8`](https://github.com/Effect-TS/effect/commit/a0acec851f72e19466363d24b9cc218acd00006a)]: - - effect@3.13.5 - - @effect/rpc@0.52.5 - -## 0.20.4 - -### Patch Changes - -- Updated dependencies [[`17d9e89`](https://github.com/Effect-TS/effect/commit/17d9e89f9851663bdbb6c1e685601d97806114a4)]: - - effect@3.13.4 - - @effect/rpc@0.52.4 - -## 0.20.3 - -### Patch Changes - -- Updated dependencies [[`cc5588d`](https://github.com/Effect-TS/effect/commit/cc5588df07f9103513547cb429ce041b9436a8bd), [`623c8cd`](https://github.com/Effect-TS/effect/commit/623c8cd053ed6ee3d353aaa8778d484670fca2bb), [`00b4eb1`](https://github.com/Effect-TS/effect/commit/00b4eb1ece12a16e222e6220965bb4024d6752ac), [`f2aee98`](https://github.com/Effect-TS/effect/commit/f2aee989b0a600900ce83e7f460d02908620c80f), [`fb798eb`](https://github.com/Effect-TS/effect/commit/fb798eb9061f1191badc017d1aa649360254da20), [`2251b15`](https://github.com/Effect-TS/effect/commit/2251b1528810bb695b37ce388b653cec0c5bf80c), [`2e15c1e`](https://github.com/Effect-TS/effect/commit/2e15c1e33648add0b29fe274fbcb7294b7515085), [`a4979db`](https://github.com/Effect-TS/effect/commit/a4979db021aef16e731be64df196b72088fc4376), [`b74255a`](https://github.com/Effect-TS/effect/commit/b74255a304ad49d60bedb1a260fd697f370af27a), [`d7f6a5c`](https://github.com/Effect-TS/effect/commit/d7f6a5c7d26c1963dcd864ca62360d20d08c7b49), [`9dd8979`](https://github.com/Effect-TS/effect/commit/9dd8979e940915b1cc1b1f264f3d019c77a65a02), [`477b488`](https://github.com/Effect-TS/effect/commit/477b488284f47c5469d7fba3e4065fb7e3b6556e), [`10932cb`](https://github.com/Effect-TS/effect/commit/10932cbf58fc721ada631cebec42f773ce96d3cc), [`9f6c784`](https://github.com/Effect-TS/effect/commit/9f6c78468b3b5e9ebfc38ffdfb70702901ee977b), [`2c639ec`](https://github.com/Effect-TS/effect/commit/2c639ecee332de4266e36022c989c35ae4e02105), [`886aaa8`](https://github.com/Effect-TS/effect/commit/886aaa81e06dfd3cd9391e8ea987d8cd5ada1124)]: - - effect@3.13.3 - - @effect/rpc@0.52.3 - -## 0.20.2 - -### Patch Changes - -- Updated dependencies [[`31be72a`](https://github.com/Effect-TS/effect/commit/31be72ada118cb84a942e67b1663263f8db74a9f)]: - - effect@3.13.2 - - @effect/rpc@0.52.2 - -## 0.20.1 - -### Patch Changes - -- Updated dependencies [[`b56a211`](https://github.com/Effect-TS/effect/commit/b56a2110569fd0ec0b57ac137743e926d49f51cc)]: - - effect@3.13.1 - - @effect/rpc@0.52.1 - -## 0.20.0 - -### Patch Changes - -- Updated dependencies [[`8baef83`](https://github.com/Effect-TS/effect/commit/8baef83e7ff0b7bc0738b680e1ef013065386cff), [`655bfe2`](https://github.com/Effect-TS/effect/commit/655bfe29e44cc3f0fb9b4e53038f50b891c188df), [`d90cbc2`](https://github.com/Effect-TS/effect/commit/d90cbc274e2742d18671fe65aa4764c057eb6cba), [`75632bd`](https://github.com/Effect-TS/effect/commit/75632bd44b8025101d652ccbaeef898c7086c91c), [`c874a2e`](https://github.com/Effect-TS/effect/commit/c874a2e4b17e9d71904ca8375bb77b020975cb1d), [`bf865e5`](https://github.com/Effect-TS/effect/commit/bf865e5833f77fd8f6c06944ca9d507b54488301), [`f98b2b7`](https://github.com/Effect-TS/effect/commit/f98b2b7592cf20f9d85313e7f1e964cb65878138), [`de8ce92`](https://github.com/Effect-TS/effect/commit/de8ce924923eaa4e1b761a97eb45ec967389f3d5), [`cf8b2dd`](https://github.com/Effect-TS/effect/commit/cf8b2dd112f8e092ed99d78fd728db0f91c29050), [`db426a5`](https://github.com/Effect-TS/effect/commit/db426a5fb41ab84d18e3c8753a7329b4de544245), [`6862444`](https://github.com/Effect-TS/effect/commit/6862444094906ad4f2cb077ff3b9cc0b73880c8c), [`5fc8a90`](https://github.com/Effect-TS/effect/commit/5fc8a90ba46a5fd9f3b643f0b5aeadc69d717339), [`546a492`](https://github.com/Effect-TS/effect/commit/546a492e60eb2b8b048a489a474b934ea0877005), [`65c4796`](https://github.com/Effect-TS/effect/commit/65c47966ce39055f02cf5c808daabb3ea6442b0b), [`9760fdc`](https://github.com/Effect-TS/effect/commit/9760fdc37bdaef9da8b150e46b86ddfbe2ad9221), [`5b471e7`](https://github.com/Effect-TS/effect/commit/5b471e7d4317e8ee5d72bbbd3e0c9775160949ab), [`4f810cc`](https://github.com/Effect-TS/effect/commit/4f810cc2770e9f1f266851d2cb6257112c12af49)]: - - effect@3.13.0 - - @effect/rpc@0.52.0 - -## 0.19.1 - -### Patch Changes - -- Updated dependencies [[`4018eae`](https://github.com/Effect-TS/effect/commit/4018eaed2733241676ddb8c52416f463a8c32e35), [`543d36d`](https://github.com/Effect-TS/effect/commit/543d36d1a11452560b01ab966a82529ad5fee8c9), [`f70a65a`](https://github.com/Effect-TS/effect/commit/f70a65ac80c6635d80b12beaf4d32a9cc59fa143), [`ba409f6`](https://github.com/Effect-TS/effect/commit/ba409f69c41aeaa29e475c0630735726eaf4dbac), [`3d2e356`](https://github.com/Effect-TS/effect/commit/3d2e3565e8a43d1bdb5daee8db3b90f56d71d859)]: - - effect@3.12.12 - - @effect/rpc@0.51.1 - -## 0.19.0 - -### Patch Changes - -- Updated dependencies [[`b6a032f`](https://github.com/Effect-TS/effect/commit/b6a032f07bffa020a848c813881879395134fa20), [`42ddd5f`](https://github.com/Effect-TS/effect/commit/42ddd5f144ce9f9d94a036679ebbd626446d37f5), [`2fe447c`](https://github.com/Effect-TS/effect/commit/2fe447c6354d334f9c591b8a8481818f5f0e797e)]: - - effect@3.12.11 - - @effect/rpc@0.51.0 - -## 0.18.4 - -### Patch Changes - -- Updated dependencies [[`e30f132`](https://github.com/Effect-TS/effect/commit/e30f132c336c9d0760bad39f82a55c7ce5159eb7), [`33fa667`](https://github.com/Effect-TS/effect/commit/33fa667c2623be1026e1ccee91bd44f73b09020a), [`87f5f28`](https://github.com/Effect-TS/effect/commit/87f5f2842e4196cb88d13f10f443ff0567e82832), [`4dbd170`](https://github.com/Effect-TS/effect/commit/4dbd170538e8fb7a36aa7c469c6f93b6c7000091)]: - - effect@3.12.10 - - @effect/rpc@0.50.4 - -## 0.18.3 - -### Patch Changes - -- Updated dependencies [[`1b4a4e9`](https://github.com/Effect-TS/effect/commit/1b4a4e904ef5227ec7d9114d4e417eca19eed940)]: - - effect@3.12.9 - - @effect/rpc@0.50.3 - -## 0.18.2 - -### Patch Changes - -- Updated dependencies [[`766113c`](https://github.com/Effect-TS/effect/commit/766113c0ea3512cdb887650ead8ba314236e22ee), [`712277f`](https://github.com/Effect-TS/effect/commit/712277f949052a24b46e4aa234063a6abf395c90), [`f269122`](https://github.com/Effect-TS/effect/commit/f269122508693b111142994dd48698ddc75f3d69), [`430c846`](https://github.com/Effect-TS/effect/commit/430c846cbac05b187e3d24ac8dfee0cf22506f7c), [`7b03057`](https://github.com/Effect-TS/effect/commit/7b03057507d2dab5e6793beb9c578dedaaeb15fe), [`a9c94c8`](https://github.com/Effect-TS/effect/commit/a9c94c807755610831211a686d2fad849ab38eb4), [`107e6f0`](https://github.com/Effect-TS/effect/commit/107e6f0557a1e2d3b0dce25d62fa1e2601521752), [`65c11b9`](https://github.com/Effect-TS/effect/commit/65c11b9266ec9447c31c26fe3ed35c73bd3b81fd), [`e386d2f`](https://github.com/Effect-TS/effect/commit/e386d2f1b3ab3ac2c14ee76de11f5963d32a3df4), [`9172efb`](https://github.com/Effect-TS/effect/commit/9172efba98bc6a82353e6ec2af61ac08f038ba64)]: - - effect@3.12.8 - - @effect/rpc@0.50.2 - -## 0.18.1 - -### Patch Changes - -- Updated dependencies [[`8dff1d1`](https://github.com/Effect-TS/effect/commit/8dff1d1bff76cdba643cad7f0bf864300f08bc61)]: - - effect@3.12.7 - - @effect/rpc@0.50.1 - -## 0.18.0 - -### Patch Changes - -- Updated dependencies [[`289c13b`](https://github.com/Effect-TS/effect/commit/289c13b38e8e35b214d46d385d05dead176c87cd), [`8b4e75d`](https://github.com/Effect-TS/effect/commit/8b4e75d35daea807c447ca760948a717aa66bb52), [`fc5e0f0`](https://github.com/Effect-TS/effect/commit/fc5e0f0d357a0051cfa01c1ede83ffdd3cb41ab1), [`004fd2b`](https://github.com/Effect-TS/effect/commit/004fd2bbd1459e64fb1b57f02eeb791ca5ea1ea5), [`b2a31be`](https://github.com/Effect-TS/effect/commit/b2a31be85c35d891351ce4f9a2cc93ece0c257f6), [`5514d05`](https://github.com/Effect-TS/effect/commit/5514d05b5cd586ff5868b8bd41c959e95e6c33cd), [`bf5f0ae`](https://github.com/Effect-TS/effect/commit/bf5f0ae9daa0170471678e22585e8ec14ce667bb), [`3b19bcf`](https://github.com/Effect-TS/effect/commit/3b19bcfd3aaadb6c9253428622df524537c8e626), [`b064b3b`](https://github.com/Effect-TS/effect/commit/b064b3b293615fd268cc5a5647d0981eb67750b8), [`289c13b`](https://github.com/Effect-TS/effect/commit/289c13b38e8e35b214d46d385d05dead176c87cd), [`f474678`](https://github.com/Effect-TS/effect/commit/f474678bf10b8f1c80e3dc096ddc7ecf20b2b23e), [`ee187d0`](https://github.com/Effect-TS/effect/commit/ee187d098007a402844c94d04f0cd8f07695377a)]: - - effect@3.12.6 - - @effect/rpc@0.50.0 - -## 0.17.0 - -### Patch Changes - -- Updated dependencies [[`a8b0ddb`](https://github.com/Effect-TS/effect/commit/a8b0ddb84710054799fc8f57485b95d00093ada1), [`507d546`](https://github.com/Effect-TS/effect/commit/507d546bd49db31000425fb5da88c434e4291bea), [`a8b0ddb`](https://github.com/Effect-TS/effect/commit/a8b0ddb84710054799fc8f57485b95d00093ada1), [`8db239b`](https://github.com/Effect-TS/effect/commit/8db239b9c869a3707f6566b9d9dbdf53c4df03fc), [`84a0911`](https://github.com/Effect-TS/effect/commit/84a091181634c3a022c94234cec7764a3aeef1be), [`84a0911`](https://github.com/Effect-TS/effect/commit/84a091181634c3a022c94234cec7764a3aeef1be), [`3179a9f`](https://github.com/Effect-TS/effect/commit/3179a9f65d23369a6a9a1f80f7750566dd28df22), [`6cb9b76`](https://github.com/Effect-TS/effect/commit/6cb9b766396d0b2ed995cf26957359713efd202e), [`1fcbe55`](https://github.com/Effect-TS/effect/commit/1fcbe55345042d8468f6a98c84081bd00b6bcf5a), [`d9a63d9`](https://github.com/Effect-TS/effect/commit/d9a63d9d385653865954cac895065360d54cc56b)]: - - effect@3.12.5 - - @effect/rpc@0.49.0 - -## 0.16.1 - -### Patch Changes - -- Updated dependencies [[`5b50ea4`](https://github.com/Effect-TS/effect/commit/5b50ea4a10cf9acd51f9624b2474d9d5ded74019), [`c170a68`](https://github.com/Effect-TS/effect/commit/c170a68b6266100774461fcd6c0e0fabb60112f2), [`a66c2eb`](https://github.com/Effect-TS/effect/commit/a66c2eb473245092cd41f04c2eb2b7b02cf53718)]: - - effect@3.12.4 - - @effect/rpc@0.48.1 - -## 0.16.0 - -### Patch Changes - -- Updated dependencies [[`d7dac48`](https://github.com/Effect-TS/effect/commit/d7dac48a477cdfeec509dbe9f33fce6a1b02b63d), [`1d7fd2b`](https://github.com/Effect-TS/effect/commit/1d7fd2b7ee8eeecc912d27adf76ed897db236dc5), [`1d7fd2b`](https://github.com/Effect-TS/effect/commit/1d7fd2b7ee8eeecc912d27adf76ed897db236dc5)]: - - effect@3.12.3 - - @effect/rpc@0.48.0 - -## 0.15.2 - -### Patch Changes - -- Updated dependencies [[`734af82`](https://github.com/Effect-TS/effect/commit/734af82138e78b9c57a8355b1c6b80e80d38b222), [`b63c780`](https://github.com/Effect-TS/effect/commit/b63c78010893101520448ddda7019c487cf7eedd), [`c640d77`](https://github.com/Effect-TS/effect/commit/c640d77b33ad417876f4e8ffe8574ee6cbe5607f), [`0def088`](https://github.com/Effect-TS/effect/commit/0def0887cfdb6755729a64dfd52b3b9f46b0576c)]: - - effect@3.12.2 - - @effect/rpc@0.47.2 - -## 0.15.1 - -### Patch Changes - -- Updated dependencies [[`302b57d`](https://github.com/Effect-TS/effect/commit/302b57d2cbf9b9ccc17450945aeebfb33cfe8d43), [`0988083`](https://github.com/Effect-TS/effect/commit/0988083d4594938590df5a287e5b27d38526dd07), [`8b46be6`](https://github.com/Effect-TS/effect/commit/8b46be6a3b8160362ab5ea9171c5e6932505125c), [`bfe8027`](https://github.com/Effect-TS/effect/commit/bfe802734b450a4b4ee069d1125dd37995db2bff), [`16dd657`](https://github.com/Effect-TS/effect/commit/16dd657033d8afac2ffea567b3c8bb27c9b249b6), [`39db211`](https://github.com/Effect-TS/effect/commit/39db211414e90c8db8fdad7dc8ce5b4661bcfaef)]: - - effect@3.12.1 - - @effect/rpc@0.47.1 - -## 0.15.0 - -### Patch Changes - -- Updated dependencies [[`abb22a4`](https://github.com/Effect-TS/effect/commit/abb22a429b9c52c31e84856294f175d2064a9b4d), [`f369a89`](https://github.com/Effect-TS/effect/commit/f369a89e98bc682969803b9304adaf4557bb36c2), [`642376c`](https://github.com/Effect-TS/effect/commit/642376c63fd7d78754db991631a4d50a5dc79aa3), [`3d2b7a7`](https://github.com/Effect-TS/effect/commit/3d2b7a7e942a7157afae5b1cdbc6f3fef116428e), [`73f9c6f`](https://github.com/Effect-TS/effect/commit/73f9c6f2ff091512cf904cc54ab59965b86e87c8), [`17cb451`](https://github.com/Effect-TS/effect/commit/17cb4514590e8a86263f7aed009f24da8a237342), [`d801820`](https://github.com/Effect-TS/effect/commit/d80182060c2ee945d7e0e4728812abf9465a0d6a), [`e1eeb2d`](https://github.com/Effect-TS/effect/commit/e1eeb2d7064b3870041dab142f3057970699bbf1), [`c11f3a6`](https://github.com/Effect-TS/effect/commit/c11f3a60a05c3b5fc8e7ce90136728154dc505b0), [`618f7e0`](https://github.com/Effect-TS/effect/commit/618f7e092a1011e5090dca1e69b5e9285689654b), [`c0ba834`](https://github.com/Effect-TS/effect/commit/c0ba834d1995cf5a8b250e4780fd43f3e3881151), [`e1eeb2d`](https://github.com/Effect-TS/effect/commit/e1eeb2d7064b3870041dab142f3057970699bbf1)]: - - effect@3.12.0 - - @effect/rpc@0.47.0 - -## 0.14.7 - -### Patch Changes - -- Updated dependencies [[`39457d4`](https://github.com/Effect-TS/effect/commit/39457d4897d9bc7df8af5c05d352866bbeae82eb), [`a475cc2`](https://github.com/Effect-TS/effect/commit/a475cc25fd7c9f26b27a8e98f8fbe43cc9e6ee3e), [`199214e`](https://github.com/Effect-TS/effect/commit/199214e21c616d8a0ccd7ed5f92e944e6c580193), [`b3c160d`](https://github.com/Effect-TS/effect/commit/b3c160d7a1fdfc2d3fb2440530f1ab80efc65133)]: - - effect@3.11.10 - - @effect/rpc@0.46.7 - -## 0.14.6 - -### Patch Changes - -- Updated dependencies [[`1c08a0b`](https://github.com/Effect-TS/effect/commit/1c08a0b8505badcffb4d9cade5a746ea90c9557e), [`1ce703b`](https://github.com/Effect-TS/effect/commit/1ce703b041bbd7560c5c437c9b9be48f027937fd), [`1ce703b`](https://github.com/Effect-TS/effect/commit/1ce703b041bbd7560c5c437c9b9be48f027937fd)]: - - effect@3.11.9 - - @effect/rpc@0.46.6 - -## 0.14.5 - -### Patch Changes - -- Updated dependencies []: - - @effect/rpc@0.46.5 - -## 0.14.4 - -### Patch Changes - -- Updated dependencies [[`1a6b52d`](https://github.com/Effect-TS/effect/commit/1a6b52dcf020d36e38a7bc90b648152cf5a8ccba)]: - - effect@3.11.8 - - @effect/rpc@0.46.4 - -## 0.14.3 - -### Patch Changes - -- Updated dependencies []: - - @effect/rpc@0.46.3 - -## 0.14.2 - -### Patch Changes - -- Updated dependencies [[`2408616`](https://github.com/Effect-TS/effect/commit/24086163b60b09cc6d0885bd565ef080dcbe866b), [`cec0b4d`](https://github.com/Effect-TS/effect/commit/cec0b4d152ef660be2ccdb0927255f2471436e6e), [`cec0b4d`](https://github.com/Effect-TS/effect/commit/cec0b4d152ef660be2ccdb0927255f2471436e6e), [`8d978c5`](https://github.com/Effect-TS/effect/commit/8d978c53f6fcc98d9d645ecba3e4b55d4297dd36), [`cec0b4d`](https://github.com/Effect-TS/effect/commit/cec0b4d152ef660be2ccdb0927255f2471436e6e), [`cec0b4d`](https://github.com/Effect-TS/effect/commit/cec0b4d152ef660be2ccdb0927255f2471436e6e)]: - - effect@3.11.7 - - @effect/rpc@0.46.2 - -## 0.14.1 - -### Patch Changes - -- Updated dependencies []: - - @effect/rpc@0.46.1 - -## 0.14.0 - -### Patch Changes - -- Updated dependencies [[`662d1ce`](https://github.com/Effect-TS/effect/commit/662d1ce6fb7da384a95888d5b2bb5605bdf3208d), [`31c62d8`](https://github.com/Effect-TS/effect/commit/31c62d83cbdcf9850a8b5331faa239601c60f78a)]: - - effect@3.11.6 - - @effect/rpc@0.46.0 - -## 0.13.7 - -### Patch Changes - -- Updated dependencies [[`9f5a6f7`](https://github.com/Effect-TS/effect/commit/9f5a6f701bf7ba31adccd1f1bcfa8ab5614c9be8), [`22905cf`](https://github.com/Effect-TS/effect/commit/22905cf5addfb1ff3d2a6135c52036be958ae911), [`9f5a6f7`](https://github.com/Effect-TS/effect/commit/9f5a6f701bf7ba31adccd1f1bcfa8ab5614c9be8), [`1e59e4f`](https://github.com/Effect-TS/effect/commit/1e59e4fd778da18296812a2a32f36ca8ae50f60d), [`8d914e5`](https://github.com/Effect-TS/effect/commit/8d914e504e7a22d0ea628e8af265ee450ff9530f), [`03bb00f`](https://github.com/Effect-TS/effect/commit/03bb00faa74f9e168a54a8cc0828a664fbb1ab05), [`9f5a6f7`](https://github.com/Effect-TS/effect/commit/9f5a6f701bf7ba31adccd1f1bcfa8ab5614c9be8), [`14e1149`](https://github.com/Effect-TS/effect/commit/14e1149f1af5a022f06eb8c2e4ba9fec17fe7426), [`9f5a6f7`](https://github.com/Effect-TS/effect/commit/9f5a6f701bf7ba31adccd1f1bcfa8ab5614c9be8), [`9f5a6f7`](https://github.com/Effect-TS/effect/commit/9f5a6f701bf7ba31adccd1f1bcfa8ab5614c9be8)]: - - effect@3.11.5 - - @effect/rpc@0.45.7 - -## 0.13.6 - -### Patch Changes - -- Updated dependencies []: - - @effect/rpc@0.45.6 - -## 0.13.5 - -### Patch Changes - -- Updated dependencies [[`518b258`](https://github.com/Effect-TS/effect/commit/518b258a8a67ecd332a9252c35cc060f8368dee2), [`6e323a3`](https://github.com/Effect-TS/effect/commit/6e323a36faaee46b328c8e3cf60a76b3aff9907f), [`6e323a3`](https://github.com/Effect-TS/effect/commit/6e323a36faaee46b328c8e3cf60a76b3aff9907f)]: - - effect@3.11.4 - - @effect/rpc@0.45.5 - -## 0.13.4 - -### Patch Changes - -- Updated dependencies [[`90906f7`](https://github.com/Effect-TS/effect/commit/90906f7f154b12c7182e8f39e3c55ef3937db857), [`3862cd3`](https://github.com/Effect-TS/effect/commit/3862cd3c7f6a542ed65fb81255b3bd696ce2f567), [`3862cd3`](https://github.com/Effect-TS/effect/commit/3862cd3c7f6a542ed65fb81255b3bd696ce2f567), [`343b6aa`](https://github.com/Effect-TS/effect/commit/343b6aa6ac4a74276bfc7c63ccbf4a1d72bc1bed), [`afba339`](https://github.com/Effect-TS/effect/commit/afba339adc11dad56b5a3b7ca94487e58f34d613)]: - - effect@3.11.3 - - @effect/rpc@0.45.4 - -## 0.13.3 - -### Patch Changes - -- Updated dependencies []: - - @effect/rpc@0.45.3 - -## 0.13.2 - -### Patch Changes - -- Updated dependencies [[`01cee56`](https://github.com/Effect-TS/effect/commit/01cee560b58d94b24cc20e98083251b73e658b41)]: - - effect@3.11.2 - - @effect/rpc@0.45.2 - -## 0.13.1 - -### Patch Changes - -- Updated dependencies [[`dd8a2d8`](https://github.com/Effect-TS/effect/commit/dd8a2d8e80d33b16719fc69361eaedf0b59d4620), [`a71bfef`](https://github.com/Effect-TS/effect/commit/a71bfef46f5061bb2502a61a333638a987b62273)]: - - effect@3.11.1 - - @effect/rpc@0.45.1 - -## 0.13.0 - -### Patch Changes - -- Updated dependencies [[`147434b`](https://github.com/Effect-TS/effect/commit/147434b03d5e1fd692dd9f126e5ab0910f3b76d3), [`6e69493`](https://github.com/Effect-TS/effect/commit/6e694930048bbaf98110f35f41566aeb9752d471), [`147434b`](https://github.com/Effect-TS/effect/commit/147434b03d5e1fd692dd9f126e5ab0910f3b76d3), [`5eff3f6`](https://github.com/Effect-TS/effect/commit/5eff3f6fa3aae7e86948a62cbfd63b8d6c3bdf92), [`d9fe79b`](https://github.com/Effect-TS/effect/commit/d9fe79bb5a3fe105d8e7a3bc2922a8ad936a5d10), [`251d189`](https://github.com/Effect-TS/effect/commit/251d189420bbba71990574e91098c499065f9a9b), [`5a259f3`](https://github.com/Effect-TS/effect/commit/5a259f3711b4369f55d885b568bdb21136155261), [`b4ce4ea`](https://github.com/Effect-TS/effect/commit/b4ce4ea7fd514a7e572f2dcd879c98f334981b0e), [`15fcc5a`](https://github.com/Effect-TS/effect/commit/15fcc5a0ea4bbf40ab48fa6a04fdda74f76f4c07), [`9bc9a47`](https://github.com/Effect-TS/effect/commit/9bc9a476800dc645903c888a68bb1d3baa3383c6), [`aadb8a4`](https://github.com/Effect-TS/effect/commit/aadb8a48d2cba197c06ec9996505510e48e4e5cb), [`1e2747c`](https://github.com/Effect-TS/effect/commit/1e2747c63a4820d1459cbbc88c71212983bd68bd), [`9264162`](https://github.com/Effect-TS/effect/commit/9264162a82783a651776fb7b87604564a63e7070), [`e0b9b09`](https://github.com/Effect-TS/effect/commit/e0b9b09e70c386b2da17d1f0a15b0511861c89e8), [`c36f3b9`](https://github.com/Effect-TS/effect/commit/c36f3b95df5ce9d71b66f22f26ce12eda8d3e848), [`aadb8a4`](https://github.com/Effect-TS/effect/commit/aadb8a48d2cba197c06ec9996505510e48e4e5cb)]: - - effect@3.11.0 - - @effect/rpc@0.45.0 - -## 0.12.32 - -### Patch Changes - -- Updated dependencies [[`3069614`](https://github.com/Effect-TS/effect/commit/30696149271129fc618f6f2ccd1d8f2f6c0f9cd7), [`09a5e52`](https://github.com/Effect-TS/effect/commit/09a5e522fd9b221f05d85b1d1c8a740d4973c302)]: - - effect@3.10.20 - - @effect/rpc@0.44.32 - -## 0.12.31 - -### Patch Changes - -- Updated dependencies []: - - @effect/rpc@0.44.31 - -## 0.12.30 - -### Patch Changes - -- Updated dependencies []: - - @effect/rpc@0.44.30 - -## 0.12.29 - -### Patch Changes - -- Updated dependencies []: - - @effect/rpc@0.44.29 - -## 0.12.28 - -### Patch Changes - -- Updated dependencies [[`944025b`](https://github.com/Effect-TS/effect/commit/944025bc5ce139f4a85846aa689bf30ec06a8ec1), [`54addee`](https://github.com/Effect-TS/effect/commit/54addee438a644bf010646c52042c7b89c5fc0a7)]: - - effect@3.10.19 - - @effect/rpc@0.44.28 - -## 0.12.27 - -### Patch Changes - -- Updated dependencies [[`af409cf`](https://github.com/Effect-TS/effect/commit/af409cf1d2ff973be11cc079ea373eaeedca25de)]: - - effect@3.10.18 - - @effect/rpc@0.44.27 - -## 0.12.26 - -### Patch Changes - -- Updated dependencies [[`42c4ce6`](https://github.com/Effect-TS/effect/commit/42c4ce6f8d8c7d847e97757650a8ad9419a829d7)]: - - effect@3.10.17 - - @effect/rpc@0.44.26 - -## 0.12.25 - -### Patch Changes - -- Updated dependencies [[`4dca30c`](https://github.com/Effect-TS/effect/commit/4dca30cfcdafe4542e236489f71d6f171a5b4e38), [`1d99867`](https://github.com/Effect-TS/effect/commit/1d998671be3cd11043f232822e91dd8c98fccfa9), [`6dae414`](https://github.com/Effect-TS/effect/commit/6dae4147991a97ec14a99289bd25fadae7541e8d), [`6b0d737`](https://github.com/Effect-TS/effect/commit/6b0d737078bf63b97891e6bc47affc04b28f9cf7), [`d8356aa`](https://github.com/Effect-TS/effect/commit/d8356aad428a0c2290db52380220f81d9ec94232)]: - - effect@3.10.16 - - @effect/rpc@0.44.25 - -## 0.12.24 - -### Patch Changes - -- Updated dependencies []: - - @effect/rpc@0.44.24 - -## 0.12.23 - -### Patch Changes - -- Updated dependencies []: - - @effect/rpc@0.44.23 - -## 0.12.22 - -### Patch Changes - -- Updated dependencies [[`8398b32`](https://github.com/Effect-TS/effect/commit/8398b3208242a88239d4449910b7baf923cfe3b6), [`72e55b7`](https://github.com/Effect-TS/effect/commit/72e55b7c610784fcebdbadc592c876e23e76a986)]: - - effect@3.10.15 - - @effect/rpc@0.44.22 - -## 0.12.21 - -### Patch Changes - -- Updated dependencies [[`f983946`](https://github.com/Effect-TS/effect/commit/f9839467b4cad6e788297764ef9f9f0b9fd203f9), [`2d8a750`](https://github.com/Effect-TS/effect/commit/2d8a75081eb83a0a81f817fdf6f428369c5064ab)]: - - effect@3.10.14 - - @effect/rpc@0.44.21 - -## 0.12.20 - -### Patch Changes - -- Updated dependencies [[`995bbdf`](https://github.com/Effect-TS/effect/commit/995bbdffea2e332f203cd5b474cd6a1c77dfa6ae)]: - - effect@3.10.13 - - @effect/rpc@0.44.20 - -## 0.12.19 - -### Patch Changes - -- Updated dependencies []: - - @effect/rpc@0.44.19 - -## 0.12.18 - -### Patch Changes - -- Updated dependencies [[`dd14efe`](https://github.com/Effect-TS/effect/commit/dd14efe0ace255f571273aae876adea96267d7e6)]: - - effect@3.10.12 - - @effect/rpc@0.44.18 - -## 0.12.17 - -### Patch Changes - -- Updated dependencies [[`5eef499`](https://github.com/Effect-TS/effect/commit/5eef4998b6ccb7a5404d9e4fef85e57fa35fbb8a)]: - - effect@3.10.11 - - @effect/rpc@0.44.17 - -## 0.12.16 - -### Patch Changes - -- Updated dependencies [[`cd720ae`](https://github.com/Effect-TS/effect/commit/cd720aedf7f2571edec0843d6a633e84e4832b28), [`cd720ae`](https://github.com/Effect-TS/effect/commit/cd720aedf7f2571edec0843d6a633e84e4832b28), [`b631f40`](https://github.com/Effect-TS/effect/commit/b631f40abbe649b2a089764585b5c39f6a695ac6)]: - - effect@3.10.10 - - @effect/rpc@0.44.16 - -## 0.12.15 - -### Patch Changes - -- Updated dependencies []: - - @effect/rpc@0.44.15 - -## 0.12.14 - -### Patch Changes - -- Updated dependencies [[`a123e80`](https://github.com/Effect-TS/effect/commit/a123e80f111a625428a5b5622b7f55ee1073566b), [`bd5fcd3`](https://github.com/Effect-TS/effect/commit/bd5fcd3e6b603b1e505af90d6a00627c8eca6d41), [`0289d3b`](https://github.com/Effect-TS/effect/commit/0289d3b6391031d00329365bab9791b355031fe3), [`7386b71`](https://github.com/Effect-TS/effect/commit/7386b710e5be570e17f468928a6ed19d549a3e12), [`4211a23`](https://github.com/Effect-TS/effect/commit/4211a2355bb3af3f0e756e2aae9d293379f25662)]: - - effect@3.10.9 - - @effect/rpc@0.44.14 - -## 0.12.13 - -### Patch Changes - -- Updated dependencies [[`68b5c9e`](https://github.com/Effect-TS/effect/commit/68b5c9e44f34192cef26e1cadda5e661a027df41), [`9c9928d`](https://github.com/Effect-TS/effect/commit/9c9928dfeacd9ac33dc37eb0ca3d7d8c39175ada), [`6306e66`](https://github.com/Effect-TS/effect/commit/6306e6656092b350d4ede5746da6f245ec9f7e07), [`361c7f3`](https://github.com/Effect-TS/effect/commit/361c7f39a2c10ede9324847c3d3ba192a6f9b20a)]: - - effect@3.10.8 - - @effect/rpc@0.44.13 - -## 0.12.12 - -### Patch Changes - -- Updated dependencies [[`33f5b9f`](https://github.com/Effect-TS/effect/commit/33f5b9ffaebea4f1bd0e391b44c41fb6230e743a), [`50f0281`](https://github.com/Effect-TS/effect/commit/50f0281b0d2116726b8927a6217622d5f394f3e4)]: - - effect@3.10.7 - - @effect/rpc@0.44.12 - -## 0.12.11 - -### Patch Changes - -- Updated dependencies [[`ce1c21f`](https://github.com/Effect-TS/effect/commit/ce1c21ffc11902ac9ab453a51904207859d38552)]: - - effect@3.10.6 - - @effect/rpc@0.44.11 - -## 0.12.10 - -### Patch Changes - -- Updated dependencies [[`3a6d757`](https://github.com/Effect-TS/effect/commit/3a6d757badeebe00d8ef4d67530d073c8264dcfa), [`59d813a`](https://github.com/Effect-TS/effect/commit/59d813aa4973d1115cfc70cc3667508335f49693)]: - - effect@3.10.5 - - @effect/rpc@0.44.10 - -## 0.12.9 - -### Patch Changes - -- Updated dependencies [[`2367708`](https://github.com/Effect-TS/effect/commit/2367708be449f9526a2047e321302d7bfb16f18e)]: - - effect@3.10.4 - - @effect/rpc@0.44.9 - -## 0.12.8 - -### Patch Changes - -- Updated dependencies []: - - @effect/rpc@0.44.8 - -## 0.12.7 - -### Patch Changes - -- Updated dependencies [[`b9423d8`](https://github.com/Effect-TS/effect/commit/b9423d8bf8181a2389fdbce1e3c14ac6fe8d54f5)]: - - effect@3.10.3 - - @effect/rpc@0.44.7 - -## 0.12.6 - -### Patch Changes - -- Updated dependencies [[`714e119`](https://github.com/Effect-TS/effect/commit/714e11945e45e5a2554ee058e6c43f82a8e309cf), [`c1afd55`](https://github.com/Effect-TS/effect/commit/c1afd55c54e61f9c432823d21b3d016f79160a37)]: - - effect@3.10.2 - - @effect/rpc@0.44.6 - -## 0.12.5 - -### Patch Changes - -- Updated dependencies [[`9604d6b`](https://github.com/Effect-TS/effect/commit/9604d6b616435103dafea8b53637a9d1450b4750)]: - - effect@3.10.1 - - @effect/rpc@0.44.5 - -## 0.12.4 - -### Patch Changes - -- Updated dependencies []: - - @effect/rpc@0.44.4 - -## 0.12.3 - -### Patch Changes - -- Updated dependencies []: - - @effect/rpc@0.44.3 - -## 0.12.2 - -### Patch Changes - -- Updated dependencies []: - - @effect/rpc@0.44.2 - -## 0.12.1 - -### Patch Changes - -- Updated dependencies []: - - @effect/rpc@0.44.1 - -## 0.12.0 - -### Patch Changes - -- Updated dependencies [[`4a01828`](https://github.com/Effect-TS/effect/commit/4a01828b66d6213e9bbe18979c893b13f7bb29bf), [`4a01828`](https://github.com/Effect-TS/effect/commit/4a01828b66d6213e9bbe18979c893b13f7bb29bf), [`c79c4c1`](https://github.com/Effect-TS/effect/commit/c79c4c178390fe61ff6dda88c9e058862349343a), [`38d30f0`](https://github.com/Effect-TS/effect/commit/38d30f08b8da62f9c3e308b9250738cb8d17bdb5), [`5821ce3`](https://github.com/Effect-TS/effect/commit/5821ce3455b47d25e0a40cae6ce22af9db5fa556)]: - - effect@3.10.0 - - @effect/rpc@0.44.0 - -## 0.11.5 - -### Patch Changes - -- Updated dependencies [[`382556f`](https://github.com/Effect-TS/effect/commit/382556f8930780c0634de681077706113a8c8239), [`97cb014`](https://github.com/Effect-TS/effect/commit/97cb0145114b2cd2f378e98f6c4ff5bf2c1865f5)]: - - @effect/schema@0.75.5 - - @effect/rpc@0.43.5 - -## 0.11.4 - -### Patch Changes - -- Updated dependencies []: - - @effect/rpc@0.43.4 - -## 0.11.3 - -### Patch Changes - -- Updated dependencies []: - - @effect/rpc@0.43.3 - -## 0.11.2 - -### Patch Changes - -- Updated dependencies [[`61a99b2`](https://github.com/Effect-TS/effect/commit/61a99b2bf9d757870ef0c2ec9d4c877cdd364a3d)]: - - effect@3.9.2 - - @effect/rpc@0.43.2 - - @effect/schema@0.75.4 - -## 0.11.1 - -### Patch Changes - -- Updated dependencies [[`360ec14`](https://github.com/Effect-TS/effect/commit/360ec14dd4102c526aef7433a8881ad4d9beab75)]: - - @effect/schema@0.75.3 - - @effect/rpc@0.43.1 - -## 0.11.0 - -### Patch Changes - -- Updated dependencies [[`09e8636`](https://github.com/Effect-TS/effect/commit/09e863648fa6ead9894b8b5104f8c11f6cc6120f)]: - - @effect/rpc@0.43.0 - -## 0.10.0 - -### Patch Changes - -- Updated dependencies [[`f02b354`](https://github.com/Effect-TS/effect/commit/f02b354ab5b0451143b82bb73dc866be29adec85)]: - - @effect/schema@0.75.2 - - @effect/rpc@0.42.0 - -## 0.9.1 - -### Patch Changes - -- Updated dependencies [[`3b2ad1d`](https://github.com/Effect-TS/effect/commit/3b2ad1d58a2e33dc1a72b7037396bd25ca1702a9)]: - - effect@3.9.1 - - @effect/schema@0.75.1 - - @effect/rpc@0.41.1 - -## 0.9.0 - -### Patch Changes - -- Updated dependencies [[`ff3d1aa`](https://github.com/Effect-TS/effect/commit/ff3d1aab290b4d1173b2dfc7e4c76abb4babdc16), [`0ba66f2`](https://github.com/Effect-TS/effect/commit/0ba66f2451641fd6990e02ec1ed01c014db9dab0), [`bf77f51`](https://github.com/Effect-TS/effect/commit/bf77f51b323c383224ebf08adf77a7a6e8c9b3cd), [`016f9ad`](https://github.com/Effect-TS/effect/commit/016f9ad931a4b3d09a34e5caf13d87c5b8e9c984), [`0779681`](https://github.com/Effect-TS/effect/commit/07796813f07de035719728733096ba64ce333469), [`534129f`](https://github.com/Effect-TS/effect/commit/534129f8113ce1a8ec50828083e16da9c86326c6), [`d75140c`](https://github.com/Effect-TS/effect/commit/d75140c7a664ceda43142d999f4ff8dcd36d6dda), [`be0451c`](https://github.com/Effect-TS/effect/commit/be0451c149b6618af79cb839cdf04af2db1efb03), [`9237ac6`](https://github.com/Effect-TS/effect/commit/9237ac69bc07de5b3b60076a0ad2921c21de7457), [`be0451c`](https://github.com/Effect-TS/effect/commit/be0451c149b6618af79cb839cdf04af2db1efb03), [`5b36494`](https://github.com/Effect-TS/effect/commit/5b364942e9a9003fdb8217324f8a2d8369c969da), [`c716adb`](https://github.com/Effect-TS/effect/commit/c716adb250ebbea1d1048d818ef7fed4f621d186), [`4986391`](https://github.com/Effect-TS/effect/commit/49863919cd8628c962a712fb1df30d2983820933), [`d75140c`](https://github.com/Effect-TS/effect/commit/d75140c7a664ceda43142d999f4ff8dcd36d6dda), [`d1387ae`](https://github.com/Effect-TS/effect/commit/d1387aebd1ff01bbebde26be46d488956e4daef6)]: - - effect@3.9.0 - - @effect/schema@0.75.0 - - @effect/rpc@0.41.0 - -## 0.8.3 - -### Patch Changes - -- Updated dependencies [[`88e85db`](https://github.com/Effect-TS/effect/commit/88e85db34bd402526e27a323e950d053fa34d232), [`83887ca`](https://github.com/Effect-TS/effect/commit/83887ca1b1793916913d8550a4db4450cd14a044), [`5266b6c`](https://github.com/Effect-TS/effect/commit/5266b6cd86d76c3886da041c8829bca04b1a3110), [`cdead5c`](https://github.com/Effect-TS/effect/commit/cdead5c9cfd54dc6c4f215d9732f654c4a12e991), [`766a8af`](https://github.com/Effect-TS/effect/commit/766a8af307b414aca3648d91c4eab7493a5ec862)]: - - effect@3.8.5 - - @effect/rpc@0.40.3 - - @effect/schema@0.74.2 - -## 0.8.2 - -### Patch Changes - -- Updated dependencies [[`734eae6`](https://github.com/Effect-TS/effect/commit/734eae654f215e4adca457d04d2a1728b1a55c83), [`fd83d0e`](https://github.com/Effect-TS/effect/commit/fd83d0e548feff9ea2d53d370a0b626c4a1d940e), [`4509656`](https://github.com/Effect-TS/effect/commit/45096569d50262275ee984f44c456f5c83b62683), [`ad7e1de`](https://github.com/Effect-TS/effect/commit/ad7e1de948745c0751bfdac96671028ff4b7a727), [`090e41c`](https://github.com/Effect-TS/effect/commit/090e41c636d720b1c7d89684a739855765ed4382), [`090e41c`](https://github.com/Effect-TS/effect/commit/090e41c636d720b1c7d89684a739855765ed4382)]: - - @effect/schema@0.74.1 - - effect@3.8.4 - - @effect/rpc@0.40.2 - -## 0.8.1 - -### Patch Changes - -- Updated dependencies []: - - @effect/rpc@0.40.1 - -## 0.8.0 - -### Patch Changes - -- Updated dependencies [[`de48aa5`](https://github.com/Effect-TS/effect/commit/de48aa54e98d97722a8a4c2c8f9e1fe1d4560ea2)]: - - @effect/schema@0.74.0 - - @effect/rpc@0.40.0 - -## 0.7.5 - -### Patch Changes - -- Updated dependencies [[`bb5ec6b`](https://github.com/Effect-TS/effect/commit/bb5ec6b4b6a6f537394596c5a596faf52cb2aef4)]: - - effect@3.8.3 - - @effect/rpc@0.39.5 - - @effect/schema@0.73.4 - -## 0.7.4 - -### Patch Changes - -- Updated dependencies [[`e6440a7`](https://github.com/Effect-TS/effect/commit/e6440a74fb3f12f6422ed794c07cb44af91cbacc)]: - - @effect/schema@0.73.3 - - @effect/rpc@0.39.4 - -## 0.7.3 - -### Patch Changes - -- Updated dependencies [[`f0d8ef1`](https://github.com/Effect-TS/effect/commit/f0d8ef1ce97ec2a87b09b3e24150cfeab85d6e2f)]: - - effect@3.8.2 - - @effect/rpc@0.39.3 - - @effect/schema@0.73.2 - -## 0.7.2 - -### Patch Changes - -- Updated dependencies [[`10bf621`](https://github.com/Effect-TS/effect/commit/10bf6213f36d8ddb00f058a4609b85220f3d8334), [`f56ab78`](https://github.com/Effect-TS/effect/commit/f56ab785cbee0c1c43bd2c182c35602f486f61f0), [`ae36fa6`](https://github.com/Effect-TS/effect/commit/ae36fa68f754eeab9a54b6dc0f8b44db513aa2b6)]: - - effect@3.8.1 - - @effect/schema@0.73.1 - - @effect/rpc@0.39.2 - -## 0.7.1 - -### Patch Changes - -- Updated dependencies []: - - @effect/rpc@0.39.1 - -## 0.7.0 - -### Patch Changes - -- Updated dependencies [[`fcfa6ee`](https://github.com/Effect-TS/effect/commit/fcfa6ee30ffd07d998bf22799357bf58580a116f), [`bb9931b`](https://github.com/Effect-TS/effect/commit/bb9931b62e249a3b801f2cb9d097aec0c8511af7), [`5798f76`](https://github.com/Effect-TS/effect/commit/5798f7619529de33e5ba06f551806f68fedc19db), [`5f0bfa1`](https://github.com/Effect-TS/effect/commit/5f0bfa17205398d4e4818bfbcf9e1b505b3b1fc5), [`7fdf9d9`](https://github.com/Effect-TS/effect/commit/7fdf9d9aa1e2c1c125cbf87991e6efbf4abb7b07), [`812a4e8`](https://github.com/Effect-TS/effect/commit/812a4e86e2d1aa23b477ef5829aa0e5c07784936), [`273565e`](https://github.com/Effect-TS/effect/commit/273565e7901639e8d0541930ab715aea9c80fbaa), [`569a801`](https://github.com/Effect-TS/effect/commit/569a8017ef0a0bc203e4312867cbdd37b0effbd7), [`aa1fa53`](https://github.com/Effect-TS/effect/commit/aa1fa5301e886b9657c8eb0d38cb87cef92a8305), [`02f6b06`](https://github.com/Effect-TS/effect/commit/02f6b0660e12bee1069532a9cc18d3ab855257be), [`12b893e`](https://github.com/Effect-TS/effect/commit/12b893e63cc6dfada4aca7773b4783940e2edf25), [`bbad27e`](https://github.com/Effect-TS/effect/commit/bbad27ec0a90860593f759405caa877e7f4a655f), [`adf7d7a`](https://github.com/Effect-TS/effect/commit/adf7d7a7dfce3a7021e9f3b0d847dc85be89d754), [`007289a`](https://github.com/Effect-TS/effect/commit/007289a52d5877f8e90e2dacf38171ff9bf603fd), [`42a8f99`](https://github.com/Effect-TS/effect/commit/42a8f99740eefdaf2c4544d2c345313f97547a36), [`eebfd29`](https://github.com/Effect-TS/effect/commit/eebfd29633fd5d38b505c5c0842036f61f05e913), [`040703d`](https://github.com/Effect-TS/effect/commit/040703d0e100cd5511e52d812c15492414262b5e)]: - - effect@3.8.0 - - @effect/schema@0.73.0 - - @effect/rpc@0.39.0 - -## 0.6.1 - -### Patch Changes - -- Updated dependencies [[`35a0f81`](https://github.com/Effect-TS/effect/commit/35a0f813141652d696461cd5d19fd146adaf85be)]: - - effect@3.7.3 - - @effect/rpc@0.38.1 - - @effect/schema@0.72.4 - -## 0.6.0 - -### Patch Changes - -- Updated dependencies [[`f6acb71`](https://github.com/Effect-TS/effect/commit/f6acb71b17a0e6b0d449e7f661c9e2c3d335fcac)]: - - @effect/schema@0.72.3 - - @effect/rpc@0.38.0 - -## 0.5.3 - -### Patch Changes - -- Updated dependencies []: - - @effect/rpc@0.37.3 - -## 0.5.2 - -### Patch Changes - -- Updated dependencies [[`8a601d7`](https://github.com/Effect-TS/effect/commit/8a601d7a1f8ffe52ac9e6d67e9282a1495fe59c9), [`353ba19`](https://github.com/Effect-TS/effect/commit/353ba19f9b2b9e959f0a00d058c6d40a4bc02db7)]: - - effect@3.7.2 - - @effect/rpc@0.37.2 - - @effect/schema@0.72.2 - -## 0.5.1 - -### Patch Changes - -- Updated dependencies [[`79859e7`](https://github.com/Effect-TS/effect/commit/79859e71040d8edf1868b8530b90c650f4321eff), [`f6a469c`](https://github.com/Effect-TS/effect/commit/f6a469c190b9f00eee5ea0cd4d5912a0ef8b46f5), [`dcb9ec0`](https://github.com/Effect-TS/effect/commit/dcb9ec0db443894dd204d87450f779c44b9ad7f1), [`79aa6b1`](https://github.com/Effect-TS/effect/commit/79aa6b136e1f29b36f34e88cb2ff162bff2bb4ed)]: - - effect@3.7.1 - - @effect/rpc@0.37.1 - - @effect/schema@0.72.1 - -## 0.5.0 - -### Patch Changes - -- Updated dependencies [[`db89601`](https://github.com/Effect-TS/effect/commit/db89601ee9c1050c4e762b7bd7ec65a6a2799dfe), [`2f456cc`](https://github.com/Effect-TS/effect/commit/2f456cce5012b9fcb6b4e039190d527813b75b92), [`8745e41`](https://github.com/Effect-TS/effect/commit/8745e41ed96e3765dc6048efc2a9afbe05c8a1e9), [`e557838`](https://github.com/Effect-TS/effect/commit/e55783886b046d3c5f33447f455f9ccf2fa75922), [`d6e7e40`](https://github.com/Effect-TS/effect/commit/d6e7e40b1e2ad0c59aa02f07344d28601b14ebdc), [`8356321`](https://github.com/Effect-TS/effect/commit/8356321598da04bd77c1001f45a4e447bec5591d), [`192f2eb`](https://github.com/Effect-TS/effect/commit/192f2ebb2c4ddbf4bfd8baedd32140b2376868f4), [`718cb70`](https://github.com/Effect-TS/effect/commit/718cb70038629a6d58d02e407760e341f7c94474), [`e9d0310`](https://github.com/Effect-TS/effect/commit/e9d03107acbf204d9304f3e8aea0816b7d3c7dfb), [`6bf28f7`](https://github.com/Effect-TS/effect/commit/6bf28f7e3b1e5e0608ff567205fea0581d11666f)]: - - effect@3.7.0 - - @effect/rpc@0.37.0 - - @effect/schema@0.72.0 - -## 0.4.5 - -### Patch Changes - -- Updated dependencies [[`e809286`](https://github.com/Effect-TS/effect/commit/e8092865900608c4df7a6b7991b1c13cc1e4ca2d)]: - - effect@3.6.8 - - @effect/rpc@0.36.5 - - @effect/schema@0.71.4 - -## 0.4.4 - -### Patch Changes - -- Updated dependencies [[`50ec889`](https://github.com/Effect-TS/effect/commit/50ec8897a49b7d1fe84f63107f89d543c52f3dfc)]: - - effect@3.6.7 - - @effect/rpc@0.36.4 - - @effect/schema@0.71.3 - -## 0.4.3 - -### Patch Changes - -- Updated dependencies [[`f960bf4`](https://github.com/Effect-TS/effect/commit/f960bf45239e9badac6e0ad3a602f4174cd7bbdf), [`46a575f`](https://github.com/Effect-TS/effect/commit/46a575f48a05457b782fb21f7827d338c9b59320)]: - - effect@3.6.6 - - @effect/rpc@0.36.3 - - @effect/schema@0.71.2 - -## 0.4.2 - -### Patch Changes - -- Updated dependencies [[`14a47a8`](https://github.com/Effect-TS/effect/commit/14a47a8c1f3cff2186b8fe7a919a1d773888fb5b), [`0c09841`](https://github.com/Effect-TS/effect/commit/0c0984173be3d58f050b300a1a8aa89d76ba49ae)]: - - effect@3.6.5 - - @effect/rpc@0.36.2 - - @effect/schema@0.71.1 - -## 0.4.1 - -### Patch Changes - -- Updated dependencies []: - - @effect/rpc@0.36.1 - -## 0.4.0 - -### Patch Changes - -- Updated dependencies [[`c1987e2`](https://github.com/Effect-TS/effect/commit/c1987e25c8f5c48bdc9ad223d7a6f2c32f93f5a1), [`8295281`](https://github.com/Effect-TS/effect/commit/8295281ae9bd7441e680402540bf3c8682ec417b), [`c940df6`](https://github.com/Effect-TS/effect/commit/c940df63800bf3c4396d91cf28ec34938642fd2c), [`00b6c6d`](https://github.com/Effect-TS/effect/commit/00b6c6d4001f5de728b7d990a1b14560b4961a63), [`1ceed14`](https://github.com/Effect-TS/effect/commit/1ceed149dc64f4874e64b5cf2f954eba0a5a1f12), [`f8d95a6`](https://github.com/Effect-TS/effect/commit/f8d95a61ad0762147933c5c32bb6d7237e18eef4), [`0e42a8f`](https://github.com/Effect-TS/effect/commit/0e42a8f045ecb1fd3d080edf3d49fef16a9b0ca1)]: - - @effect/schema@0.71.0 - - effect@3.6.4 - - @effect/rpc@0.36.0 - -## 0.3.9 - -### Patch Changes - -- [#3446](https://github.com/Effect-TS/effect/pull/3446) [`335111d`](https://github.com/Effect-TS/effect/commit/335111ddf540b270dd3805d580f6ae63c1a134b8) Thanks @tim-smart! - sync /cluster\* package.json dependencies with source code - -- Updated dependencies [[`04adcac`](https://github.com/Effect-TS/effect/commit/04adcace913e6fc483df266874a68005e9e04ccf)]: - - effect@3.6.3 - - @effect/rpc@0.35.1 - - @effect/schema@0.70.4 - -## 0.3.8 - -### Patch Changes - -- Updated dependencies [[`17245a4`](https://github.com/Effect-TS/effect/commit/17245a4e783c19dee51529600b3b40f164fa59bc), [`630d40e`](https://github.com/Effect-TS/effect/commit/630d40eaa7eb4d2f8b6705b16d4f426bc28a7d09), [`630d40e`](https://github.com/Effect-TS/effect/commit/630d40eaa7eb4d2f8b6705b16d4f426bc28a7d09)]: - - @effect/platform@0.61.7 - - @effect/platform-node@0.56.8 - -## 0.3.7 - -### Patch Changes - -- Updated dependencies [[`99ad841`](https://github.com/Effect-TS/effect/commit/99ad8415293a82d08bd7043c563b29e2b468ca74), [`d829b57`](https://github.com/Effect-TS/effect/commit/d829b576357f2e3b203ab7e107a1492de903a106), [`fd4b2f6`](https://github.com/Effect-TS/effect/commit/fd4b2f6516b325740dde615f1cf0229edf13ca0c)]: - - @effect/schema@0.70.3 - - @effect/platform@0.61.6 - - effect@3.6.2 - - @effect/platform-node@0.56.7 - -## 0.3.6 - -### Patch Changes - -- Updated dependencies [[`76b0496`](https://github.com/Effect-TS/effect/commit/76b0496ff9d7670e3f4c07ae924d30ed7f613cee)]: - - @effect/platform-node@0.56.6 - -## 0.3.5 - -### Patch Changes - -- Updated dependencies [[`056b710`](https://github.com/Effect-TS/effect/commit/056b7108978e70612176c23991916f678d947f38), [`056b710`](https://github.com/Effect-TS/effect/commit/056b7108978e70612176c23991916f678d947f38)]: - - @effect/platform-node@0.56.5 - - @effect/platform@0.61.5 - -## 0.3.4 - -### Patch Changes - -- Updated dependencies [[`e7cb109`](https://github.com/Effect-TS/effect/commit/e7cb109d0754207024a64d55b6bd2a674dd8ed7d)]: - - @effect/platform@0.61.4 - - @effect/platform-node@0.56.4 - -## 0.3.3 - -### Patch Changes - -- Updated dependencies [[`510a34d`](https://github.com/Effect-TS/effect/commit/510a34d4cc5d2f51347a53847f6c7db84d2b17c6), [`fb9f786`](https://github.com/Effect-TS/effect/commit/fb9f7867f0c895e63f9ef23e8d0941248c42179d), [`45dbb9f`](https://github.com/Effect-TS/effect/commit/45dbb9ffeaf93d9e4df99d0cd4920e41ba9a3978)]: - - effect@3.6.1 - - @effect/platform@0.61.3 - - @effect/platform-node@0.56.3 - - @effect/schema@0.70.2 - -## 0.3.2 - -### Patch Changes - -- Updated dependencies [[`3dce357`](https://github.com/Effect-TS/effect/commit/3dce357efe4a4451d7d29859d08ac11713999b1a), [`657fc48`](https://github.com/Effect-TS/effect/commit/657fc48bb32daf2dc09c9335b3cbc3152bcbdd3b)]: - - @effect/schema@0.70.1 - - @effect/platform@0.61.2 - - @effect/platform-node@0.56.2 - -## 0.3.1 - -### Patch Changes - -- Updated dependencies [[`11223bf`](https://github.com/Effect-TS/effect/commit/11223bf9cbf5b822e0bf9a9fb2b35b2ad88af692)]: - - @effect/platform@0.61.1 - - @effect/platform-node@0.56.1 - -## 0.3.0 - -### Patch Changes - -- Updated dependencies [[`1e0fe80`](https://github.com/Effect-TS/effect/commit/1e0fe802b36c257971296617473ce0abe730e8dc), [`8135294`](https://github.com/Effect-TS/effect/commit/8135294b591ea94fde7e6f94a504608f0e630520), [`cd255a4`](https://github.com/Effect-TS/effect/commit/cd255a48872d8fb924cf713ef73f0883a9cc6987), [`3845646`](https://github.com/Effect-TS/effect/commit/3845646828e98f3c7cda1217f6cfe5f642ac0603), [`2d09078`](https://github.com/Effect-TS/effect/commit/2d09078c5948b37fc2f79ef858fe4ca3e4814085), [`4bce5a0`](https://github.com/Effect-TS/effect/commit/4bce5a0274203550ccf117d830721891b0a3d182), [`4ddbff0`](https://github.com/Effect-TS/effect/commit/4ddbff0bb4e3ffddfeb509c59835b83245fb975e), [`e74cc38`](https://github.com/Effect-TS/effect/commit/e74cc38cb420a320c4d7ef98180f19d452a8b316), [`bb069b4`](https://github.com/Effect-TS/effect/commit/bb069b49ef291c532a02c1e8e74271f6d1bb32ec), [`cd255a4`](https://github.com/Effect-TS/effect/commit/cd255a48872d8fb924cf713ef73f0883a9cc6987), [`7d02174`](https://github.com/Effect-TS/effect/commit/7d02174af3bcbf054e5cdddb821c91d0f47e8285)]: - - effect@3.6.0 - - @effect/schema@0.70.0 - - @effect/platform@0.61.0 - - @effect/platform-node@0.56.0 - -## 0.2.3 - -### Patch Changes - -- Updated dependencies [[`7c0da50`](https://github.com/Effect-TS/effect/commit/7c0da5050d30cb804f4eacb15995d0fb7f3a28d2), [`2fc0ff4`](https://github.com/Effect-TS/effect/commit/2fc0ff4c59c25977018f6ac70ced99b04a8c7b2b), [`6359644`](https://github.com/Effect-TS/effect/commit/635964446323cf55d4060559337e710e4a24496e), [`f262665`](https://github.com/Effect-TS/effect/commit/f262665c2773492c01e5dd0e8d6db235aafaaad8), [`7f41e42`](https://github.com/Effect-TS/effect/commit/7f41e428830bf3043b8be0d28dcd235d5747c942), [`9bbe7a6`](https://github.com/Effect-TS/effect/commit/9bbe7a681430ebf5c10167bb7140ba3742e46bb7), [`f566fd1`](https://github.com/Effect-TS/effect/commit/f566fd1d7eea531a0d981dd24037f14a603a1273)]: - - @effect/schema@0.69.3 - - effect@3.5.9 - - @effect/platform@0.60.3 - - @effect/platform-node@0.55.3 - -## 0.2.2 - -### Patch Changes - -- Updated dependencies [[`eb4d014`](https://github.com/Effect-TS/effect/commit/eb4d014c559e1b4c95b3fb9295fe77593c17ed7a), [`1ba640c`](https://github.com/Effect-TS/effect/commit/1ba640c702f187a866023bf043c26e25cce941ef), [`c8c71bd`](https://github.com/Effect-TS/effect/commit/c8c71bd20eb87d23133dac6156b83bb08941597c), [`a26ce58`](https://github.com/Effect-TS/effect/commit/a26ce581ca7d407e1e81439b58c8045b3fa65231), [`fc20f73`](https://github.com/Effect-TS/effect/commit/fc20f73c69e577981cb64714de2adc97e1004dae)]: - - @effect/platform@0.60.2 - - effect@3.5.8 - - @effect/platform-node@0.55.2 - - @effect/schema@0.69.2 - -## 0.2.1 - -### Patch Changes - -- Updated dependencies [[`f241154`](https://github.com/Effect-TS/effect/commit/f241154added5d91e95866c39481f09cdb13bd4d)]: - - @effect/schema@0.69.1 - - @effect/platform@0.60.1 - - @effect/platform-node@0.55.1 - -## 0.2.0 - -### Patch Changes - -- Updated dependencies [[`20807a4`](https://github.com/Effect-TS/effect/commit/20807a45edeb4334e903dca5d708cd62a71702d8)]: - - @effect/schema@0.69.0 - - @effect/platform@0.60.0 - - @effect/platform-node@0.55.0 - -## 0.1.4 - -### Patch Changes - -- [#3310](https://github.com/Effect-TS/effect/pull/3310) [`99bddcf`](https://github.com/Effect-TS/effect/commit/99bddcfb3d6eab4d489d055404e26ad81afe52fc) Thanks @fubhy! - Added additional pure annotations to improve tree-shakeability - -- Updated dependencies [[`3afcc93`](https://github.com/Effect-TS/effect/commit/3afcc93413a3d910beb69e4ce9ae120e4adaffd5), [`99bddcf`](https://github.com/Effect-TS/effect/commit/99bddcfb3d6eab4d489d055404e26ad81afe52fc), [`6921c4f`](https://github.com/Effect-TS/effect/commit/6921c4fb8c45badff09b493043b85ca71302b560)]: - - effect@3.5.7 - - @effect/platform@0.59.3 - - @effect/platform-node@0.54.4 - - @effect/schema@0.68.27 - -## 0.1.3 - -### Patch Changes - -- Updated dependencies [[`f0285d3`](https://github.com/Effect-TS/effect/commit/f0285d3af6a18829123bc1818331c67206becbc4), [`8ec4955`](https://github.com/Effect-TS/effect/commit/8ec49555ed3b3c98093fa4d135a4c57a3f16ebd1), [`3ac2d76`](https://github.com/Effect-TS/effect/commit/3ac2d76048da09e876cf6c3aee3397febd843fe9), [`cc327a1`](https://github.com/Effect-TS/effect/commit/cc327a1bccd22a4ee27ec7e58b53205e93b23e2c), [`4bfe4fb`](https://github.com/Effect-TS/effect/commit/4bfe4fb5c82f597c9beea9baa92e772593598b60), [`2b14d18`](https://github.com/Effect-TS/effect/commit/2b14d181462cad8359da4fa6bc6dfda0f742c398)]: - - @effect/schema@0.68.26 - - effect@3.5.6 - - @effect/platform@0.59.2 - - @effect/platform-node@0.54.3 - -## 0.1.2 - -### Patch Changes - -- Updated dependencies [[`a9d7800`](https://github.com/Effect-TS/effect/commit/a9d7800f6a253192b653d77778b0674f39b1ca39), [`fcecff7`](https://github.com/Effect-TS/effect/commit/fcecff7f7e12b295a252f124861b801c73072151), [`adbf753`](https://github.com/Effect-TS/effect/commit/adbf75340a9db15dc5cadc66e911a8978a195a65), [`adbf753`](https://github.com/Effect-TS/effect/commit/adbf75340a9db15dc5cadc66e911a8978a195a65)]: - - effect@3.5.5 - - @effect/platform@0.59.1 - - @effect/platform-node@0.54.2 - - @effect/schema@0.68.25 - -## 0.1.1 - -### Patch Changes - -- Updated dependencies [[`07db4ac`](https://github.com/Effect-TS/effect/commit/07db4ac8da9d07ce31bd62470a73e362a4291a0c)]: - - @effect/platform-node@0.54.1 - -## 0.1.0 - -### Patch Changes - -- Updated dependencies [[`53c0db0`](https://github.com/Effect-TS/effect/commit/53c0db06872d5b5edea2a706e83249908385325c), [`ed0dde4`](https://github.com/Effect-TS/effect/commit/ed0dde4888e6f1a97ad5bba06b755d26a6a1c52e), [`ada68b3`](https://github.com/Effect-TS/effect/commit/ada68b3e61c67907c2a281c024c84d818186ca4c), [`ca775ce`](https://github.com/Effect-TS/effect/commit/ca775cec53baebc1a43d9b8852a3ac6726178498), [`5be9cc0`](https://github.com/Effect-TS/effect/commit/5be9cc044025a9541b9b7acefa2d3fc05fa1301b), [`203658f`](https://github.com/Effect-TS/effect/commit/203658f8001c132b25764ab70344b171683b554c), [`eb1c4d4`](https://github.com/Effect-TS/effect/commit/eb1c4d44e54b9d8d201a366d1ff94face2a6dcd3)]: - - @effect/platform-node@0.54.0 - - @effect/platform@0.59.0 - - effect@3.5.4 - - @effect/schema@0.68.24 - -## 0.0.32 - -### Patch Changes - -- Updated dependencies [[`edb0da3`](https://github.com/Effect-TS/effect/commit/edb0da383746d760f35d8582f5fb0cc0eeca9217), [`edb0da3`](https://github.com/Effect-TS/effect/commit/edb0da383746d760f35d8582f5fb0cc0eeca9217), [`a1db40a`](https://github.com/Effect-TS/effect/commit/a1db40a650ab842e778654f0d88e80f2ef4fd6f3), [`c8d3fb0`](https://github.com/Effect-TS/effect/commit/c8d3fb0fe23585f6efb724af51fbab3ba1ad6e83), [`dabd028`](https://github.com/Effect-TS/effect/commit/dabd028decf9b7983ca16ebe0f48c05c11a84b68), [`786b2ab`](https://github.com/Effect-TS/effect/commit/786b2ab29d525c877bb84035dac9e2d6499339d1), [`fc57354`](https://github.com/Effect-TS/effect/commit/fc573547d41667016fce05eaee75960fcc6dce4d)]: - - effect@3.5.3 - - @effect/schema@0.68.23 - - @effect/platform@0.58.27 - - @effect/platform-node@0.53.26 - -## 0.0.31 - -### Patch Changes - -- Updated dependencies [[`639208e`](https://github.com/Effect-TS/effect/commit/639208eeb8a44622994f832bc2d45d06ab636bc8), [`6684b4c`](https://github.com/Effect-TS/effect/commit/6684b4c27d77a7fcc7af2e261a450edf971b62b5), [`6684b4c`](https://github.com/Effect-TS/effect/commit/6684b4c27d77a7fcc7af2e261a450edf971b62b5), [`6684b4c`](https://github.com/Effect-TS/effect/commit/6684b4c27d77a7fcc7af2e261a450edf971b62b5)]: - - effect@3.5.2 - - @effect/platform@0.58.26 - - @effect/platform-node@0.53.25 - - @effect/schema@0.68.22 - -## 0.0.30 - -### Patch Changes - -- Updated dependencies [[`0623fca`](https://github.com/Effect-TS/effect/commit/0623fca41679b0e3c5a10dd0f8985f91670bd721)]: - - @effect/platform@0.58.25 - - @effect/platform-node@0.53.24 - -## 0.0.29 - -### Patch Changes - -- Updated dependencies [[`55fdd76`](https://github.com/Effect-TS/effect/commit/55fdd761ee95afd73b6a892c13fee92b36c02837)]: - - effect@3.5.1 - - @effect/platform@0.58.24 - - @effect/platform-node@0.53.23 - - @effect/schema@0.68.21 - -## 0.0.28 - -### Patch Changes - -- Updated dependencies [[`a1f5b83`](https://github.com/Effect-TS/effect/commit/a1f5b831a1bc7535988b370d68d0b3eb1123e0ce), [`a1f5b83`](https://github.com/Effect-TS/effect/commit/a1f5b831a1bc7535988b370d68d0b3eb1123e0ce), [`a1f5b83`](https://github.com/Effect-TS/effect/commit/a1f5b831a1bc7535988b370d68d0b3eb1123e0ce), [`60bc3d0`](https://github.com/Effect-TS/effect/commit/60bc3d0867b13e48b24dc22604b4dd2e7b2c1ca4), [`5ab348f`](https://github.com/Effect-TS/effect/commit/5ab348f265db3d283aa091ddca6d2d49137c16f2), [`60bc3d0`](https://github.com/Effect-TS/effect/commit/60bc3d0867b13e48b24dc22604b4dd2e7b2c1ca4), [`3e04bf8`](https://github.com/Effect-TS/effect/commit/3e04bf8a7127e956cadb7684a8f4c661df57663b), [`e7fc45f`](https://github.com/Effect-TS/effect/commit/e7fc45f0c7002aafdaec7878149ac064cd104ea3), [`a1f5b83`](https://github.com/Effect-TS/effect/commit/a1f5b831a1bc7535988b370d68d0b3eb1123e0ce), [`4626de5`](https://github.com/Effect-TS/effect/commit/4626de59c25b384216faa0be87bf0b8cd36357d0), [`f01e7db`](https://github.com/Effect-TS/effect/commit/f01e7db317827255d7901f523f2e28b43298e8df), [`60bc3d0`](https://github.com/Effect-TS/effect/commit/60bc3d0867b13e48b24dc22604b4dd2e7b2c1ca4), [`79d2d91`](https://github.com/Effect-TS/effect/commit/79d2d91464d95dde0e9444d43e7a7f309f05d6e6), [`ac71f37`](https://github.com/Effect-TS/effect/commit/ac71f378f2413e5aa91c95f649ffe898d6a26114), [`8432360`](https://github.com/Effect-TS/effect/commit/8432360ce68614a419bb328083a4109d0fc8aa93), [`e4bf1bf`](https://github.com/Effect-TS/effect/commit/e4bf1bf2b4a970eacd77c9b77b5ea8c68bc84498), [`13cb861`](https://github.com/Effect-TS/effect/commit/13cb861a5eded15c55c6cdcf6a8acde8320367a6), [`79d2d91`](https://github.com/Effect-TS/effect/commit/79d2d91464d95dde0e9444d43e7a7f309f05d6e6), [`e7fc45f`](https://github.com/Effect-TS/effect/commit/e7fc45f0c7002aafdaec7878149ac064cd104ea3), [`9f66825`](https://github.com/Effect-TS/effect/commit/9f66825f1fce0fe8d10420c285f7dc4c71e8af8d)]: - - effect@3.5.0 - - @effect/platform@0.58.23 - - @effect/platform-node@0.53.22 - - @effect/schema@0.68.20 - -## 0.0.27 - -### Patch Changes - -- Updated dependencies [[`7af137c`](https://github.com/Effect-TS/effect/commit/7af137c9433f6e74959b3887561ec1e6f12e10ee), [`ee4b3dc`](https://github.com/Effect-TS/effect/commit/ee4b3dc5f68d19dc3ae1c2d12901c5b8ffbebabb), [`366f2ee`](https://github.com/Effect-TS/effect/commit/366f2ee3fb6f712a44e8f84fc188612e5ecc016d), [`366f2ee`](https://github.com/Effect-TS/effect/commit/366f2ee3fb6f712a44e8f84fc188612e5ecc016d), [`097d25c`](https://github.com/Effect-TS/effect/commit/097d25cb5d13c049e01789651be56b09620186ef)]: - - effect@3.4.9 - - @effect/platform-node@0.53.21 - - @effect/platform@0.58.22 - - @effect/schema@0.68.19 - -## 0.0.26 - -### Patch Changes - -- Updated dependencies [[`5d5cc6c`](https://github.com/Effect-TS/effect/commit/5d5cc6cfd7d63b07081290fb189b364999201fc5), [`a435e0f`](https://github.com/Effect-TS/effect/commit/a435e0fc5378b33a49bcec92ee235df6f16a2419), [`b5554db`](https://github.com/Effect-TS/effect/commit/b5554db36c4dd6f64fa5e6a62a29b2759c54217a), [`359ff8a`](https://github.com/Effect-TS/effect/commit/359ff8aa2e4e6389bf56d759baa804e2a7674a16), [`a9c4fb3`](https://github.com/Effect-TS/effect/commit/a9c4fb3bf3c6e92cd1c142b0605fddf7eb3c697c), [`f7534b9`](https://github.com/Effect-TS/effect/commit/f7534b94cba06b143a3d4f29275d92874a939559)]: - - @effect/schema@0.68.18 - - effect@3.4.8 - - @effect/platform@0.58.21 - - @effect/platform-node@0.53.20 - -## 0.0.25 - -### Patch Changes - -- Updated dependencies [[`15967cf`](https://github.com/Effect-TS/effect/commit/15967cf18931fb6ede3083eb687a8dfff371cc56), [`2328e17`](https://github.com/Effect-TS/effect/commit/2328e17577112db17c29b7756942a0ff64a70ee0), [`a5737d6`](https://github.com/Effect-TS/effect/commit/a5737d6db2b921605c332eabbc5402ee3d17357b)]: - - @effect/schema@0.68.17 - - effect@3.4.7 - - @effect/platform@0.58.20 - - @effect/platform-node@0.53.19 - -## 0.0.24 - -### Patch Changes - -- Updated dependencies [[`d006cec`](https://github.com/Effect-TS/effect/commit/d006cec022e8524dbfd6dc6df751fe4c86b10042), [`cb22726`](https://github.com/Effect-TS/effect/commit/cb2272656881aa5878a1c3fc0b12d8fbc66eb63c), [`e911cfd`](https://github.com/Effect-TS/effect/commit/e911cfdc79418462d7e9000976fded15ea6b738d)]: - - @effect/schema@0.68.16 - - @effect/platform@0.58.19 - - @effect/platform-node@0.53.18 - -## 0.0.23 - -### Patch Changes - -- Updated dependencies [[`7f8900a`](https://github.com/Effect-TS/effect/commit/7f8900a1de9addeb0d371103a2c5c2aa3e4ff95e)]: - - @effect/platform@0.58.18 - - @effect/platform-node@0.53.17 - -## 0.0.22 - -### Patch Changes - -- Updated dependencies [[`5c0ceb0`](https://github.com/Effect-TS/effect/commit/5c0ceb00826cce9e50bf9d41d83e191d5352c030), [`5c0ceb0`](https://github.com/Effect-TS/effect/commit/5c0ceb00826cce9e50bf9d41d83e191d5352c030), [`34faeb6`](https://github.com/Effect-TS/effect/commit/34faeb6305ba52af4d6f8bdd2e633bb6a5a7a35b), [`33735b1`](https://github.com/Effect-TS/effect/commit/33735b16b41bd26929d8f4754c190925db6323b7), [`5c0ceb0`](https://github.com/Effect-TS/effect/commit/5c0ceb00826cce9e50bf9d41d83e191d5352c030), [`139d4b3`](https://github.com/Effect-TS/effect/commit/139d4b39fb3bff2eeaa7c0c809c581da42425a83)]: - - effect@3.4.6 - - @effect/schema@0.68.15 - - @effect/platform@0.58.17 - - @effect/platform-node@0.53.16 - -## 0.0.21 - -### Patch Changes - -- Updated dependencies [[`61e5964`](https://github.com/Effect-TS/effect/commit/61e59640fd993216cca8ace0ac8abd9104e213ce)]: - - @effect/schema@0.68.14 - - @effect/platform@0.58.16 - - @effect/platform-node@0.53.15 - -## 0.0.20 - -### Patch Changes - -- Updated dependencies [[`cb76bcb`](https://github.com/Effect-TS/effect/commit/cb76bcb2f8858a90db4f785efee262cea1b9844e), [`baa90df`](https://github.com/Effect-TS/effect/commit/baa90df9663f5f37d7b6814dad25142d53dbc720)]: - - @effect/schema@0.68.13 - - @effect/platform@0.58.15 - - @effect/platform-node@0.53.14 - -## 0.0.19 - -### Patch Changes - -- Updated dependencies [[`52a87c7`](https://github.com/Effect-TS/effect/commit/52a87c7a0b9536398deaf8ec507e53a82c607219), [`6d2280e`](https://github.com/Effect-TS/effect/commit/6d2280e9497c95cb0e965ca462c825345074eedf)]: - - @effect/platform@0.58.14 - - @effect/platform-node@0.53.13 - -## 0.0.18 - -### Patch Changes - -- Updated dependencies [[`a047af9`](https://github.com/Effect-TS/effect/commit/a047af99447dfffc729e9c8ef0ca143537927e91), [`dbd53ea`](https://github.com/Effect-TS/effect/commit/dbd53ea363c71a24449cb068251054c3a1acf864), [`d990544`](https://github.com/Effect-TS/effect/commit/d9905444b9e800850cb65899114ca0e502e68fe8)]: - - effect@3.4.5 - - @effect/platform@0.58.13 - - @effect/schema@0.68.12 - - @effect/platform-node@0.53.12 - -## 0.0.17 - -### Patch Changes - -- Updated dependencies [[`74e0ad2`](https://github.com/Effect-TS/effect/commit/74e0ad23b4c36f41b7fd10856b20f8b701bc4044), [`74e0ad2`](https://github.com/Effect-TS/effect/commit/74e0ad23b4c36f41b7fd10856b20f8b701bc4044), [`72638e3`](https://github.com/Effect-TS/effect/commit/72638e3d99f0e93a24febf6c225256ce92d4a20b), [`d7dde2b`](https://github.com/Effect-TS/effect/commit/d7dde2b4af08b37af859d4c327c1f5c6f00cf9d9), [`9b2fc3b`](https://github.com/Effect-TS/effect/commit/9b2fc3b9dfd304a2bd0508ef2313cfc54357be0c), [`d71c192`](https://github.com/Effect-TS/effect/commit/d71c192b89fd1162423acddc5fd3d6270fbf2ef6)]: - - @effect/platform@0.58.12 - - effect@3.4.4 - - @effect/schema@0.68.11 - - @effect/platform-node@0.53.11 - -## 0.0.16 - -### Patch Changes - -- Updated dependencies [[`a5b95b5`](https://github.com/Effect-TS/effect/commit/a5b95b548284e4798654ae7ce6883fa49108f0ea), [`5e29579`](https://github.com/Effect-TS/effect/commit/5e29579187cb8420ea4930b3999fec984f8999f4)]: - - @effect/platform@0.58.11 - - @effect/platform-node@0.53.10 - -## 0.0.15 - -### Patch Changes - -- [#3079](https://github.com/Effect-TS/effect/pull/3079) [`bbdd365`](https://github.com/Effect-TS/effect/commit/bbdd36567706c94cdec45bacea825941c347b6cd) Thanks @tim-smart! - update to typescript 5.5 - -- Updated dependencies [[`a48ee84`](https://github.com/Effect-TS/effect/commit/a48ee845ac21bbde9baf938af9e97a98322211c9), [`c342739`](https://github.com/Effect-TS/effect/commit/c3427396226e1ad7b95b40595a23f9bdff3e3365), [`8898e5e`](https://github.com/Effect-TS/effect/commit/8898e5e238622f6337583d91ee23609c1f5ccdf7), [`a48ee84`](https://github.com/Effect-TS/effect/commit/a48ee845ac21bbde9baf938af9e97a98322211c9), [`a48ee84`](https://github.com/Effect-TS/effect/commit/a48ee845ac21bbde9baf938af9e97a98322211c9), [`ff78636`](https://github.com/Effect-TS/effect/commit/ff786367c522975f40f0f179a0ecdfcfab7ecbdb), [`c86bd4e`](https://github.com/Effect-TS/effect/commit/c86bd4e134c23146c216f9ff97e03781d55991b6), [`bbdd365`](https://github.com/Effect-TS/effect/commit/bbdd36567706c94cdec45bacea825941c347b6cd), [`ab3180f`](https://github.com/Effect-TS/effect/commit/ab3180f827041d0ea3b2d72254a1a8683e99e056), [`bbdd365`](https://github.com/Effect-TS/effect/commit/bbdd36567706c94cdec45bacea825941c347b6cd)]: - - @effect/platform@0.58.10 - - effect@3.4.3 - - @effect/platform-node@0.53.9 - - @effect/schema@0.68.10 - -## 0.0.14 - -### Patch Changes - -- Updated dependencies [[`0b47fdf`](https://github.com/Effect-TS/effect/commit/0b47fdfe449f42de89e0e88b61ae5140f629e5c4)]: - - @effect/schema@0.68.9 - - @effect/platform@0.58.9 - - @effect/platform-node@0.53.8 - -## 0.0.13 - -### Patch Changes - -- Updated dependencies [[`192261b`](https://github.com/Effect-TS/effect/commit/192261b2aec94e9913ceed83683fdcfbc9fca66f), [`3da1497`](https://github.com/Effect-TS/effect/commit/3da1497b5c9cc886d300258bc928fd68a4fefe6f)]: - - @effect/schema@0.68.8 - - effect@3.4.2 - - @effect/platform@0.58.8 - - @effect/platform-node@0.53.7 - -## 0.0.12 - -### Patch Changes - -- Updated dependencies [[`027004a`](https://github.com/Effect-TS/effect/commit/027004a897f654791e75faa28eefb50dd0244b6e)]: - - @effect/platform@0.58.7 - - @effect/platform-node@0.53.6 - -## 0.0.11 - -### Patch Changes - -- Updated dependencies [[`66a1910`](https://github.com/Effect-TS/effect/commit/66a19109ff90c4252123b8809b8c8a74681dba6a), [`2e8e252`](https://github.com/Effect-TS/effect/commit/2e8e2520cac712f0eb644553bd476429ebd674e4)]: - - effect@3.4.1 - - @effect/platform@0.58.6 - - @effect/platform-node@0.53.5 - - @effect/schema@0.68.7 - -## 0.0.10 - -### Patch Changes - -- Updated dependencies [[`37a07a2`](https://github.com/Effect-TS/effect/commit/37a07a2d8d1ce09ab965c0ada84a3fae9a6aba05)]: - - @effect/platform@0.58.5 - - @effect/platform-node@0.53.4 - -## 0.0.9 - -### Patch Changes - -- Updated dependencies [[`b77fb0a`](https://github.com/Effect-TS/effect/commit/b77fb0a811ec1ad0e794917077c9a90824515db8)]: - - @effect/platform@0.58.4 - - @effect/platform-node@0.53.3 - -## 0.0.8 - -### Patch Changes - -- Updated dependencies [[`530fa9e`](https://github.com/Effect-TS/effect/commit/530fa9e36b8532589b948fc4faa37593f36b7f42)]: - - @effect/schema@0.68.6 - - @effect/platform@0.58.3 - - @effect/platform-node@0.53.2 - -## 0.0.7 - -### Patch Changes - -- Updated dependencies [[`1d62815`](https://github.com/Effect-TS/effect/commit/1d62815a50f34115606940ffa397442d75a20c81)]: - - @effect/schema@0.68.5 - - @effect/platform@0.58.2 - - @effect/platform-node@0.53.1 - -## 0.0.6 - -### Patch Changes - -- Updated dependencies [[`5a248aa`](https://github.com/Effect-TS/effect/commit/5a248aa5ab2db3f7131ebc79bb9871a76de57973), [`5a248aa`](https://github.com/Effect-TS/effect/commit/5a248aa5ab2db3f7131ebc79bb9871a76de57973)]: - - @effect/platform@0.58.1 - - @effect/platform-node@0.53.0 - -## 0.0.5 - -### Patch Changes - -- Updated dependencies [[`c0ce180`](https://github.com/Effect-TS/effect/commit/c0ce180861ad0938053c0e6145e813fa6404df3b), [`63dd0c3`](https://github.com/Effect-TS/effect/commit/63dd0c3af45876c1caad7d03356c74daf551c628), [`61707b6`](https://github.com/Effect-TS/effect/commit/61707b6ffc7397c2ba0dce22512b44955724f60f), [`9c1b5b3`](https://github.com/Effect-TS/effect/commit/9c1b5b39e6c19604ce834f072a114ad392c50a06), [`a35faf8`](https://github.com/Effect-TS/effect/commit/a35faf8d116f94899bfc03feab33b004c8ddfdf7), [`ff73c0c`](https://github.com/Effect-TS/effect/commit/ff73c0cacd66132bfad2e5211b3eae347729c667), [`984d516`](https://github.com/Effect-TS/effect/commit/984d516ccd9412dc41188f6a46b748dd20dd5848), [`8c3b8a2`](https://github.com/Effect-TS/effect/commit/8c3b8a2ce208eab753b6206a51605a424f104e98), [`017e2f9`](https://github.com/Effect-TS/effect/commit/017e2f9b371ce24ea4945e5d7390c934ad3c39cf), [`91bf8a2`](https://github.com/Effect-TS/effect/commit/91bf8a2e9d1959393b3cf7366cc1d584d3e666b7), [`c6a4a26`](https://github.com/Effect-TS/effect/commit/c6a4a266606575fd2c7165940c4072ad4c57d01f)]: - - effect@3.4.0 - - @effect/platform-node@0.52.0 - - @effect/platform@0.58.0 - - @effect/schema@0.68.4 - -## 0.0.4 - -### Patch Changes - -- Updated dependencies [[`3ba7ea1`](https://github.com/Effect-TS/effect/commit/3ba7ea1c3c2923e85bf2f17e41176f8f8796d203)]: - - @effect/platform@0.57.8 - - @effect/platform-node@0.51.17 - -## 0.0.3 - -### Patch Changes - -- Updated dependencies [[`d473800`](https://github.com/Effect-TS/effect/commit/d47380012c3241d7287b66968d33a2414275ce7b)]: - - @effect/schema@0.68.3 - - @effect/platform@0.57.7 - - @effect/platform-node@0.51.16 - -## 0.0.2 - -### Patch Changes - -- Updated dependencies [[`eb341b3`](https://github.com/Effect-TS/effect/commit/eb341b3eb34ad64499371bc08b7f59e429979d8a)]: - - @effect/schema@0.68.2 - - @effect/platform@0.57.6 - - @effect/platform-node@0.51.15 diff --git a/packages/cluster-browser/LICENSE b/packages/cluster-browser/LICENSE deleted file mode 100644 index 7f6fe480f77..00000000000 --- a/packages/cluster-browser/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -MIT License - -Copyright (c) 2023-present The Contributors - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/packages/cluster-browser/README.md b/packages/cluster-browser/README.md deleted file mode 100644 index 167d6ef9dff..00000000000 --- a/packages/cluster-browser/README.md +++ /dev/null @@ -1,5 +0,0 @@ -# `@effect/cluster-browser` - -## Documentation - -- **API Reference**: [View the full documentation](https://effect-ts.github.io/effect/docs/cluster-browser). diff --git a/packages/cluster-browser/docgen.json b/packages/cluster-browser/docgen.json deleted file mode 100644 index e161d05ac3e..00000000000 --- a/packages/cluster-browser/docgen.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "$schema": "../../node_modules/@effect/docgen/schema.json", - "srcLink": "https://github.com/Effect-TS/effect/tree/main/packages/cluster-browser/src/", - "exclude": [ - "src/internal/**/*.ts" - ] -} diff --git a/packages/cluster-browser/package.json b/packages/cluster-browser/package.json deleted file mode 100644 index 8433d462772..00000000000 --- a/packages/cluster-browser/package.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "name": "@effect/cluster-browser", - "type": "module", - "version": "0.22.3", - "description": "Unified interfaces for common cluster-browser-specific services", - "publishConfig": { - "access": "public", - "directory": "dist", - "provenance": true - }, - "repository": { - "type": "git", - "url": "https://github.com/Effect-TS/effect.git", - "directory": "packages/cluster-browser" - }, - "homepage": "https://effect.website", - "license": "MIT", - "scripts": { - "codegen": "build-utils prepare-v2", - "build": "pnpm build-esm && pnpm build-annotate && pnpm build-cjs && build-utils pack-v2", - "build-esm": "tsc -b tsconfig.build.json", - "build-cjs": "babel build/esm --plugins @babel/transform-export-namespace-from --plugins @babel/transform-modules-commonjs --out-dir build/cjs --source-maps", - "build-annotate": "babel build/esm --plugins annotate-pure-calls --out-dir build/esm --source-maps", - "check": "tsc -b tsconfig.json", - "test": "vitest", - "coverage": "vitest --coverage" - }, - "peerDependencies": { - "@effect/rpc": "workspace:^", - "effect": "workspace:^" - }, - "devDependencies": { - "@effect/rpc": "workspace:^", - "effect": "workspace:^" - } -} diff --git a/packages/cluster-browser/src/RpcBroadcastChannel.ts b/packages/cluster-browser/src/RpcBroadcastChannel.ts deleted file mode 100644 index afaa7137233..00000000000 --- a/packages/cluster-browser/src/RpcBroadcastChannel.ts +++ /dev/null @@ -1,110 +0,0 @@ -/** - * @since 1.0.0 - */ -import type * as Rpc from "@effect/rpc/Rpc" -import * as RpcResolver from "@effect/rpc/RpcResolver" -import * as RpcRouter from "@effect/rpc/RpcRouter" -import * as Effect from "effect/Effect" -import { pipe } from "effect/Function" -import * as Queue from "effect/Queue" -import type * as RequestResolver from "effect/RequestResolver" -import * as Schema from "effect/Schema" -import * as Stream from "effect/Stream" - -class ClientRequest extends Schema.TaggedClass()("ClientRequest", { - id: Schema.String, - request: Schema.Unknown -}) {} - -class ServerResponse extends Schema.TaggedClass()("ServerResponse", { - id: Schema.String, - response: Schema.Unknown -}) {} - -const BroadcastMessage = Schema.Union(ClientRequest, ServerResponse) - -/** - * @since 1.0.0 - */ -export const toBroadcastChannelRouter = >(self: R, channelId: string) => { - const handler = RpcRouter.toHandlerNoStream(self) - - return Effect.gen(function*() { - const queue = yield* Queue.unbounded() - yield* Effect.addFinalizer(() => Queue.shutdown(queue)) - - const channel = yield* Effect.acquireRelease( - Effect.sync(() => { - const channel = new BroadcastChannel(channelId) - channel.onmessage = (event) => Queue.unsafeOffer(queue, event.data) - return channel - }), - (channel) => Effect.sync(() => channel.close()) - ) - - yield* pipe( - Queue.take(queue), - Effect.flatMap(Schema.decodeUnknown(BroadcastMessage)), - Effect.flatMap((message) => - message._tag === "ClientRequest" ? - pipe( - handler(message.request), - Stream.mapEffect((response) => - pipe( - Schema.encode(BroadcastMessage)(new ServerResponse({ id: message.id, response })), - Effect.flatMap((reply) => Effect.sync(() => channel.postMessage(reply))) - ) - ), - Stream.runDrain, - Effect.forkScoped - ) : - Effect.void - ), - Effect.forever - ) - }).pipe(Effect.forkScoped) -} - -/** - * @since 1.0.0 - */ -export const make = >( - channelId: string -): RequestResolver.RequestResolver< - Rpc.Request>, - Schema.SerializableWithResult.Context> -> => - RpcResolver.make((requests) => { - return Effect.gen(function*() { - const queue = yield* Queue.unbounded() - yield* Effect.addFinalizer(() => Queue.shutdown(queue)) - - const channel = yield* Effect.acquireRelease( - Effect.sync(() => { - const channel = new BroadcastChannel(channelId) - channel.onmessage = (event) => Queue.unsafeOffer(queue, event.data) - - return channel - }), - (channel) => Effect.sync(() => channel.close()) - ) - - return yield* pipe( - Effect.sync(() => (Math.random() * 10000).toString(36)), - Effect.flatMap((id) => - pipe( - Schema.encode(BroadcastMessage)(new ClientRequest({ id, request: requests })), - Effect.flatMap((message) => Effect.sync(() => channel.postMessage(message))), - Effect.zipRight(pipe( - Queue.take(queue), - Effect.flatMap(Schema.decodeUnknown(BroadcastMessage)), - Effect.repeat({ - until: (a): a is ServerResponse => a._tag == "ServerResponse" && a.id == id - }), - Effect.map((message) => message.response) - )) - ) - ) - ) - }).pipe(Effect.scoped) - })() diff --git a/packages/cluster-browser/src/index.ts b/packages/cluster-browser/src/index.ts deleted file mode 100644 index c0baf7bc4c6..00000000000 --- a/packages/cluster-browser/src/index.ts +++ /dev/null @@ -1,4 +0,0 @@ -/** - * @since 1.0.0 - */ -export * as RpcBroadcastChannel from "./RpcBroadcastChannel.js" diff --git a/packages/cluster-browser/tsconfig.build.json b/packages/cluster-browser/tsconfig.build.json deleted file mode 100644 index f0ff2e3e55c..00000000000 --- a/packages/cluster-browser/tsconfig.build.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "extends": "./tsconfig.src.json", - "references": [ - { "path": "../effect/tsconfig.build.json" }, - { "path": "../rpc/tsconfig.build.json" } - ], - "compilerOptions": { - "tsBuildInfoFile": ".tsbuildinfo/build.tsbuildinfo", - "outDir": "build/esm", - "declarationDir": "build/dts", - "stripInternal": true - } -} diff --git a/packages/cluster-browser/tsconfig.json b/packages/cluster-browser/tsconfig.json deleted file mode 100644 index 2c291d2192d..00000000000 --- a/packages/cluster-browser/tsconfig.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "extends": "../../tsconfig.base.json", - "include": [], - "references": [ - { "path": "tsconfig.src.json" }, - { "path": "tsconfig.test.json" } - ] -} diff --git a/packages/cluster-browser/tsconfig.src.json b/packages/cluster-browser/tsconfig.src.json deleted file mode 100644 index 943311bfa0e..00000000000 --- a/packages/cluster-browser/tsconfig.src.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "extends": "../../tsconfig.base.json", - "include": ["src"], - "references": [ - { "path": "../effect/tsconfig.src.json" }, - { "path": "../rpc/tsconfig.src.json" } - ], - "compilerOptions": { - "tsBuildInfoFile": ".tsbuildinfo/src.tsbuildinfo", - "rootDir": "src", - "outDir": "build/src" - } -} diff --git a/packages/cluster-browser/tsconfig.test.json b/packages/cluster-browser/tsconfig.test.json deleted file mode 100644 index 185e7065e44..00000000000 --- a/packages/cluster-browser/tsconfig.test.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "extends": "../../tsconfig.base.json", - "include": ["test"], - "references": [ - { "path": "tsconfig.src.json" }, - { "path": "../vitest/tsconfig.src.json" } - ], - "compilerOptions": { - "tsBuildInfoFile": ".tsbuildinfo/test.tsbuildinfo", - "rootDir": "test", - "noEmit": true - } -} diff --git a/packages/cluster-browser/vitest.config.ts b/packages/cluster-browser/vitest.config.ts deleted file mode 100644 index 578d0667249..00000000000 --- a/packages/cluster-browser/vitest.config.ts +++ /dev/null @@ -1,6 +0,0 @@ -import { mergeConfig, type ViteUserConfig } from "vitest/config" -import shared from "../../vitest.shared.js" - -const config: ViteUserConfig = {} - -export default mergeConfig(shared, config) diff --git a/packages/cluster-node/CHANGELOG.md b/packages/cluster-node/CHANGELOG.md deleted file mode 100644 index c2d67870c13..00000000000 --- a/packages/cluster-node/CHANGELOG.md +++ /dev/null @@ -1,1562 +0,0 @@ -# @effect/cluster - -## 0.29.3 - -### Patch Changes - -- Updated dependencies [[`0c4803f`](https://github.com/Effect-TS/effect/commit/0c4803fcc69262d11a97ce49d0e9b4288df0651f), [`6f65ac4`](https://github.com/Effect-TS/effect/commit/6f65ac4eac1489cd6ea390e18b0908670722adad)]: - - effect@3.13.12 - - @effect/cluster@0.28.3 - - @effect/rpc@0.54.3 - -## 0.29.2 - -### Patch Changes - -- Updated dependencies [[`fad8cca`](https://github.com/Effect-TS/effect/commit/fad8cca9bbfcc2eaeb44b97c15dbe0a1eda75315), [`4296293`](https://github.com/Effect-TS/effect/commit/4296293049414d0cf2d915a26c552b09f946b9a0), [`9c241ab`](https://github.com/Effect-TS/effect/commit/9c241abe47ccf7a5257b98a4a64a63054a12741d), [`082b0c1`](https://github.com/Effect-TS/effect/commit/082b0c1b9f4252bcdd69608f2e4a9226f953ac3f), [`389dca2`](https://github.com/Effect-TS/effect/commit/389dca2c590e76fa6e859fe1b6049e9c5287e1a0), [`be12983`](https://github.com/Effect-TS/effect/commit/be12983bc7e7537b41cd8910fc4eb7d1da56ab07), [`de88127`](https://github.com/Effect-TS/effect/commit/de88127a5a5906ccece98af74787b5ae0e65e431)]: - - effect@3.13.11 - - @effect/rpc@0.54.2 - - @effect/cluster@0.28.2 - -## 0.29.1 - -### Patch Changes - -- Updated dependencies [[`527c964`](https://github.com/Effect-TS/effect/commit/527c9645229f5be9714a7e60a38a9e753c4bbfb1)]: - - effect@3.13.10 - - @effect/cluster@0.28.1 - - @effect/rpc@0.54.1 - -## 0.29.0 - -### Patch Changes - -- Updated dependencies [[`2976e52`](https://github.com/Effect-TS/effect/commit/2976e52538d9dc9ffdcbc84d4ac748cff9305971)]: - - effect@3.13.9 - - @effect/cluster@0.28.0 - - @effect/rpc@0.54.0 - -## 0.28.1 - -### Patch Changes - -- Updated dependencies [[`c65d336`](https://github.com/Effect-TS/effect/commit/c65d3362d07ec815ff3b46278314e8a31706ddc2), [`22d2ebb`](https://github.com/Effect-TS/effect/commit/22d2ebb4b11f5a44351a4736e65da391a3b647d0)]: - - effect@3.13.8 - - @effect/cluster@0.27.1 - - @effect/rpc@0.53.1 - -## 0.28.0 - -### Patch Changes - -- Updated dependencies []: - - @effect/cluster@0.27.0 - - @effect/rpc@0.53.0 - -## 0.27.7 - -### Patch Changes - -- Updated dependencies [[`840cc73`](https://github.com/Effect-TS/effect/commit/840cc7329908db7ca693ef47b07d4f845c29cadd), [`9bf8a74`](https://github.com/Effect-TS/effect/commit/9bf8a74b967f18d931743dd5196af326c9118e9c), [`87ba23c`](https://github.com/Effect-TS/effect/commit/87ba23c41c193503ed0c612b0d32d0b253794c64)]: - - effect@3.13.7 - - @effect/cluster@0.26.7 - - @effect/rpc@0.52.7 - -## 0.27.6 - -### Patch Changes - -- Updated dependencies [[`3154ce4`](https://github.com/Effect-TS/effect/commit/3154ce4692fa18b804982158d3c4c8a8a5fae386)]: - - effect@3.13.6 - - @effect/cluster@0.26.6 - - @effect/rpc@0.52.6 - -## 0.27.5 - -### Patch Changes - -- Updated dependencies [[`367bb35`](https://github.com/Effect-TS/effect/commit/367bb35f4c2a254e1fb211d96db2474a7aed9020), [`6cf11c3`](https://github.com/Effect-TS/effect/commit/6cf11c3a75773ceec2877c85ddc760f381f0866d), [`a0acec8`](https://github.com/Effect-TS/effect/commit/a0acec851f72e19466363d24b9cc218acd00006a)]: - - effect@3.13.5 - - @effect/cluster@0.26.5 - - @effect/rpc@0.52.5 - -## 0.27.4 - -### Patch Changes - -- Updated dependencies [[`17d9e89`](https://github.com/Effect-TS/effect/commit/17d9e89f9851663bdbb6c1e685601d97806114a4)]: - - effect@3.13.4 - - @effect/cluster@0.26.4 - - @effect/rpc@0.52.4 - -## 0.27.3 - -### Patch Changes - -- Updated dependencies [[`cc5588d`](https://github.com/Effect-TS/effect/commit/cc5588df07f9103513547cb429ce041b9436a8bd), [`623c8cd`](https://github.com/Effect-TS/effect/commit/623c8cd053ed6ee3d353aaa8778d484670fca2bb), [`00b4eb1`](https://github.com/Effect-TS/effect/commit/00b4eb1ece12a16e222e6220965bb4024d6752ac), [`f2aee98`](https://github.com/Effect-TS/effect/commit/f2aee989b0a600900ce83e7f460d02908620c80f), [`fb798eb`](https://github.com/Effect-TS/effect/commit/fb798eb9061f1191badc017d1aa649360254da20), [`2251b15`](https://github.com/Effect-TS/effect/commit/2251b1528810bb695b37ce388b653cec0c5bf80c), [`2e15c1e`](https://github.com/Effect-TS/effect/commit/2e15c1e33648add0b29fe274fbcb7294b7515085), [`a4979db`](https://github.com/Effect-TS/effect/commit/a4979db021aef16e731be64df196b72088fc4376), [`b74255a`](https://github.com/Effect-TS/effect/commit/b74255a304ad49d60bedb1a260fd697f370af27a), [`d7f6a5c`](https://github.com/Effect-TS/effect/commit/d7f6a5c7d26c1963dcd864ca62360d20d08c7b49), [`9dd8979`](https://github.com/Effect-TS/effect/commit/9dd8979e940915b1cc1b1f264f3d019c77a65a02), [`477b488`](https://github.com/Effect-TS/effect/commit/477b488284f47c5469d7fba3e4065fb7e3b6556e), [`10932cb`](https://github.com/Effect-TS/effect/commit/10932cbf58fc721ada631cebec42f773ce96d3cc), [`9f6c784`](https://github.com/Effect-TS/effect/commit/9f6c78468b3b5e9ebfc38ffdfb70702901ee977b), [`2c639ec`](https://github.com/Effect-TS/effect/commit/2c639ecee332de4266e36022c989c35ae4e02105), [`886aaa8`](https://github.com/Effect-TS/effect/commit/886aaa81e06dfd3cd9391e8ea987d8cd5ada1124)]: - - effect@3.13.3 - - @effect/cluster@0.26.3 - - @effect/rpc@0.52.3 - -## 0.27.2 - -### Patch Changes - -- Updated dependencies [[`31be72a`](https://github.com/Effect-TS/effect/commit/31be72ada118cb84a942e67b1663263f8db74a9f)]: - - effect@3.13.2 - - @effect/cluster@0.26.2 - - @effect/rpc@0.52.2 - -## 0.27.1 - -### Patch Changes - -- Updated dependencies [[`b56a211`](https://github.com/Effect-TS/effect/commit/b56a2110569fd0ec0b57ac137743e926d49f51cc)]: - - effect@3.13.1 - - @effect/cluster@0.26.1 - - @effect/rpc@0.52.1 - -## 0.27.0 - -### Patch Changes - -- Updated dependencies [[`8baef83`](https://github.com/Effect-TS/effect/commit/8baef83e7ff0b7bc0738b680e1ef013065386cff), [`655bfe2`](https://github.com/Effect-TS/effect/commit/655bfe29e44cc3f0fb9b4e53038f50b891c188df), [`d90cbc2`](https://github.com/Effect-TS/effect/commit/d90cbc274e2742d18671fe65aa4764c057eb6cba), [`75632bd`](https://github.com/Effect-TS/effect/commit/75632bd44b8025101d652ccbaeef898c7086c91c), [`c874a2e`](https://github.com/Effect-TS/effect/commit/c874a2e4b17e9d71904ca8375bb77b020975cb1d), [`bf865e5`](https://github.com/Effect-TS/effect/commit/bf865e5833f77fd8f6c06944ca9d507b54488301), [`f98b2b7`](https://github.com/Effect-TS/effect/commit/f98b2b7592cf20f9d85313e7f1e964cb65878138), [`de8ce92`](https://github.com/Effect-TS/effect/commit/de8ce924923eaa4e1b761a97eb45ec967389f3d5), [`cf8b2dd`](https://github.com/Effect-TS/effect/commit/cf8b2dd112f8e092ed99d78fd728db0f91c29050), [`db426a5`](https://github.com/Effect-TS/effect/commit/db426a5fb41ab84d18e3c8753a7329b4de544245), [`6862444`](https://github.com/Effect-TS/effect/commit/6862444094906ad4f2cb077ff3b9cc0b73880c8c), [`5fc8a90`](https://github.com/Effect-TS/effect/commit/5fc8a90ba46a5fd9f3b643f0b5aeadc69d717339), [`546a492`](https://github.com/Effect-TS/effect/commit/546a492e60eb2b8b048a489a474b934ea0877005), [`65c4796`](https://github.com/Effect-TS/effect/commit/65c47966ce39055f02cf5c808daabb3ea6442b0b), [`9760fdc`](https://github.com/Effect-TS/effect/commit/9760fdc37bdaef9da8b150e46b86ddfbe2ad9221), [`5b471e7`](https://github.com/Effect-TS/effect/commit/5b471e7d4317e8ee5d72bbbd3e0c9775160949ab), [`4f810cc`](https://github.com/Effect-TS/effect/commit/4f810cc2770e9f1f266851d2cb6257112c12af49)]: - - effect@3.13.0 - - @effect/cluster@0.26.0 - - @effect/rpc@0.52.0 - -## 0.26.1 - -### Patch Changes - -- Updated dependencies [[`4018eae`](https://github.com/Effect-TS/effect/commit/4018eaed2733241676ddb8c52416f463a8c32e35), [`543d36d`](https://github.com/Effect-TS/effect/commit/543d36d1a11452560b01ab966a82529ad5fee8c9), [`f70a65a`](https://github.com/Effect-TS/effect/commit/f70a65ac80c6635d80b12beaf4d32a9cc59fa143), [`ba409f6`](https://github.com/Effect-TS/effect/commit/ba409f69c41aeaa29e475c0630735726eaf4dbac), [`3d2e356`](https://github.com/Effect-TS/effect/commit/3d2e3565e8a43d1bdb5daee8db3b90f56d71d859)]: - - effect@3.12.12 - - @effect/cluster@0.25.1 - - @effect/rpc@0.51.1 - -## 0.26.0 - -### Patch Changes - -- Updated dependencies [[`b6a032f`](https://github.com/Effect-TS/effect/commit/b6a032f07bffa020a848c813881879395134fa20), [`42ddd5f`](https://github.com/Effect-TS/effect/commit/42ddd5f144ce9f9d94a036679ebbd626446d37f5), [`2fe447c`](https://github.com/Effect-TS/effect/commit/2fe447c6354d334f9c591b8a8481818f5f0e797e)]: - - effect@3.12.11 - - @effect/cluster@0.25.0 - - @effect/rpc@0.51.0 - -## 0.25.4 - -### Patch Changes - -- Updated dependencies [[`e30f132`](https://github.com/Effect-TS/effect/commit/e30f132c336c9d0760bad39f82a55c7ce5159eb7), [`33fa667`](https://github.com/Effect-TS/effect/commit/33fa667c2623be1026e1ccee91bd44f73b09020a), [`87f5f28`](https://github.com/Effect-TS/effect/commit/87f5f2842e4196cb88d13f10f443ff0567e82832), [`4dbd170`](https://github.com/Effect-TS/effect/commit/4dbd170538e8fb7a36aa7c469c6f93b6c7000091)]: - - effect@3.12.10 - - @effect/cluster@0.24.4 - - @effect/rpc@0.50.4 - -## 0.25.3 - -### Patch Changes - -- Updated dependencies [[`1b4a4e9`](https://github.com/Effect-TS/effect/commit/1b4a4e904ef5227ec7d9114d4e417eca19eed940)]: - - effect@3.12.9 - - @effect/cluster@0.24.3 - - @effect/rpc@0.50.3 - -## 0.25.2 - -### Patch Changes - -- Updated dependencies [[`766113c`](https://github.com/Effect-TS/effect/commit/766113c0ea3512cdb887650ead8ba314236e22ee), [`712277f`](https://github.com/Effect-TS/effect/commit/712277f949052a24b46e4aa234063a6abf395c90), [`f269122`](https://github.com/Effect-TS/effect/commit/f269122508693b111142994dd48698ddc75f3d69), [`430c846`](https://github.com/Effect-TS/effect/commit/430c846cbac05b187e3d24ac8dfee0cf22506f7c), [`7b03057`](https://github.com/Effect-TS/effect/commit/7b03057507d2dab5e6793beb9c578dedaaeb15fe), [`a9c94c8`](https://github.com/Effect-TS/effect/commit/a9c94c807755610831211a686d2fad849ab38eb4), [`107e6f0`](https://github.com/Effect-TS/effect/commit/107e6f0557a1e2d3b0dce25d62fa1e2601521752), [`65c11b9`](https://github.com/Effect-TS/effect/commit/65c11b9266ec9447c31c26fe3ed35c73bd3b81fd), [`e386d2f`](https://github.com/Effect-TS/effect/commit/e386d2f1b3ab3ac2c14ee76de11f5963d32a3df4), [`9172efb`](https://github.com/Effect-TS/effect/commit/9172efba98bc6a82353e6ec2af61ac08f038ba64)]: - - effect@3.12.8 - - @effect/cluster@0.24.2 - - @effect/rpc@0.50.2 - -## 0.25.1 - -### Patch Changes - -- Updated dependencies [[`8dff1d1`](https://github.com/Effect-TS/effect/commit/8dff1d1bff76cdba643cad7f0bf864300f08bc61)]: - - effect@3.12.7 - - @effect/cluster@0.24.1 - - @effect/rpc@0.50.1 - -## 0.25.0 - -### Patch Changes - -- Updated dependencies [[`289c13b`](https://github.com/Effect-TS/effect/commit/289c13b38e8e35b214d46d385d05dead176c87cd), [`8b4e75d`](https://github.com/Effect-TS/effect/commit/8b4e75d35daea807c447ca760948a717aa66bb52), [`fc5e0f0`](https://github.com/Effect-TS/effect/commit/fc5e0f0d357a0051cfa01c1ede83ffdd3cb41ab1), [`004fd2b`](https://github.com/Effect-TS/effect/commit/004fd2bbd1459e64fb1b57f02eeb791ca5ea1ea5), [`b2a31be`](https://github.com/Effect-TS/effect/commit/b2a31be85c35d891351ce4f9a2cc93ece0c257f6), [`5514d05`](https://github.com/Effect-TS/effect/commit/5514d05b5cd586ff5868b8bd41c959e95e6c33cd), [`bf5f0ae`](https://github.com/Effect-TS/effect/commit/bf5f0ae9daa0170471678e22585e8ec14ce667bb), [`3b19bcf`](https://github.com/Effect-TS/effect/commit/3b19bcfd3aaadb6c9253428622df524537c8e626), [`b064b3b`](https://github.com/Effect-TS/effect/commit/b064b3b293615fd268cc5a5647d0981eb67750b8), [`289c13b`](https://github.com/Effect-TS/effect/commit/289c13b38e8e35b214d46d385d05dead176c87cd), [`f474678`](https://github.com/Effect-TS/effect/commit/f474678bf10b8f1c80e3dc096ddc7ecf20b2b23e), [`ee187d0`](https://github.com/Effect-TS/effect/commit/ee187d098007a402844c94d04f0cd8f07695377a)]: - - effect@3.12.6 - - @effect/cluster@0.24.0 - - @effect/rpc@0.50.0 - -## 0.24.0 - -### Patch Changes - -- Updated dependencies [[`a8b0ddb`](https://github.com/Effect-TS/effect/commit/a8b0ddb84710054799fc8f57485b95d00093ada1), [`507d546`](https://github.com/Effect-TS/effect/commit/507d546bd49db31000425fb5da88c434e4291bea), [`a8b0ddb`](https://github.com/Effect-TS/effect/commit/a8b0ddb84710054799fc8f57485b95d00093ada1), [`8db239b`](https://github.com/Effect-TS/effect/commit/8db239b9c869a3707f6566b9d9dbdf53c4df03fc), [`84a0911`](https://github.com/Effect-TS/effect/commit/84a091181634c3a022c94234cec7764a3aeef1be), [`84a0911`](https://github.com/Effect-TS/effect/commit/84a091181634c3a022c94234cec7764a3aeef1be), [`3179a9f`](https://github.com/Effect-TS/effect/commit/3179a9f65d23369a6a9a1f80f7750566dd28df22), [`6cb9b76`](https://github.com/Effect-TS/effect/commit/6cb9b766396d0b2ed995cf26957359713efd202e), [`1fcbe55`](https://github.com/Effect-TS/effect/commit/1fcbe55345042d8468f6a98c84081bd00b6bcf5a), [`d9a63d9`](https://github.com/Effect-TS/effect/commit/d9a63d9d385653865954cac895065360d54cc56b)]: - - effect@3.12.5 - - @effect/cluster@0.23.0 - - @effect/rpc@0.49.0 - -## 0.23.1 - -### Patch Changes - -- Updated dependencies [[`5b50ea4`](https://github.com/Effect-TS/effect/commit/5b50ea4a10cf9acd51f9624b2474d9d5ded74019), [`c170a68`](https://github.com/Effect-TS/effect/commit/c170a68b6266100774461fcd6c0e0fabb60112f2), [`a66c2eb`](https://github.com/Effect-TS/effect/commit/a66c2eb473245092cd41f04c2eb2b7b02cf53718)]: - - effect@3.12.4 - - @effect/cluster@0.22.1 - - @effect/rpc@0.48.1 - -## 0.23.0 - -### Patch Changes - -- Updated dependencies [[`d7dac48`](https://github.com/Effect-TS/effect/commit/d7dac48a477cdfeec509dbe9f33fce6a1b02b63d), [`1d7fd2b`](https://github.com/Effect-TS/effect/commit/1d7fd2b7ee8eeecc912d27adf76ed897db236dc5), [`1d7fd2b`](https://github.com/Effect-TS/effect/commit/1d7fd2b7ee8eeecc912d27adf76ed897db236dc5)]: - - effect@3.12.3 - - @effect/cluster@0.22.0 - - @effect/rpc@0.48.0 - -## 0.22.2 - -### Patch Changes - -- Updated dependencies [[`734af82`](https://github.com/Effect-TS/effect/commit/734af82138e78b9c57a8355b1c6b80e80d38b222), [`b63c780`](https://github.com/Effect-TS/effect/commit/b63c78010893101520448ddda7019c487cf7eedd), [`c640d77`](https://github.com/Effect-TS/effect/commit/c640d77b33ad417876f4e8ffe8574ee6cbe5607f), [`0def088`](https://github.com/Effect-TS/effect/commit/0def0887cfdb6755729a64dfd52b3b9f46b0576c)]: - - effect@3.12.2 - - @effect/cluster@0.21.2 - - @effect/rpc@0.47.2 - -## 0.22.1 - -### Patch Changes - -- Updated dependencies [[`302b57d`](https://github.com/Effect-TS/effect/commit/302b57d2cbf9b9ccc17450945aeebfb33cfe8d43), [`0988083`](https://github.com/Effect-TS/effect/commit/0988083d4594938590df5a287e5b27d38526dd07), [`8b46be6`](https://github.com/Effect-TS/effect/commit/8b46be6a3b8160362ab5ea9171c5e6932505125c), [`bfe8027`](https://github.com/Effect-TS/effect/commit/bfe802734b450a4b4ee069d1125dd37995db2bff), [`16dd657`](https://github.com/Effect-TS/effect/commit/16dd657033d8afac2ffea567b3c8bb27c9b249b6), [`39db211`](https://github.com/Effect-TS/effect/commit/39db211414e90c8db8fdad7dc8ce5b4661bcfaef)]: - - effect@3.12.1 - - @effect/cluster@0.21.1 - - @effect/rpc@0.47.1 - -## 0.22.0 - -### Patch Changes - -- Updated dependencies [[`abb22a4`](https://github.com/Effect-TS/effect/commit/abb22a429b9c52c31e84856294f175d2064a9b4d), [`f369a89`](https://github.com/Effect-TS/effect/commit/f369a89e98bc682969803b9304adaf4557bb36c2), [`642376c`](https://github.com/Effect-TS/effect/commit/642376c63fd7d78754db991631a4d50a5dc79aa3), [`3d2b7a7`](https://github.com/Effect-TS/effect/commit/3d2b7a7e942a7157afae5b1cdbc6f3fef116428e), [`73f9c6f`](https://github.com/Effect-TS/effect/commit/73f9c6f2ff091512cf904cc54ab59965b86e87c8), [`17cb451`](https://github.com/Effect-TS/effect/commit/17cb4514590e8a86263f7aed009f24da8a237342), [`d801820`](https://github.com/Effect-TS/effect/commit/d80182060c2ee945d7e0e4728812abf9465a0d6a), [`e1eeb2d`](https://github.com/Effect-TS/effect/commit/e1eeb2d7064b3870041dab142f3057970699bbf1), [`c11f3a6`](https://github.com/Effect-TS/effect/commit/c11f3a60a05c3b5fc8e7ce90136728154dc505b0), [`618f7e0`](https://github.com/Effect-TS/effect/commit/618f7e092a1011e5090dca1e69b5e9285689654b), [`c0ba834`](https://github.com/Effect-TS/effect/commit/c0ba834d1995cf5a8b250e4780fd43f3e3881151), [`e1eeb2d`](https://github.com/Effect-TS/effect/commit/e1eeb2d7064b3870041dab142f3057970699bbf1)]: - - effect@3.12.0 - - @effect/cluster@0.21.0 - - @effect/rpc@0.47.0 - -## 0.21.3 - -### Patch Changes - -- Updated dependencies [[`39457d4`](https://github.com/Effect-TS/effect/commit/39457d4897d9bc7df8af5c05d352866bbeae82eb), [`a475cc2`](https://github.com/Effect-TS/effect/commit/a475cc25fd7c9f26b27a8e98f8fbe43cc9e6ee3e), [`199214e`](https://github.com/Effect-TS/effect/commit/199214e21c616d8a0ccd7ed5f92e944e6c580193), [`b3c160d`](https://github.com/Effect-TS/effect/commit/b3c160d7a1fdfc2d3fb2440530f1ab80efc65133)]: - - effect@3.11.10 - - @effect/cluster@0.20.3 - - @effect/rpc@0.46.7 - -## 0.21.2 - -### Patch Changes - -- Updated dependencies [[`1c08a0b`](https://github.com/Effect-TS/effect/commit/1c08a0b8505badcffb4d9cade5a746ea90c9557e), [`1ce703b`](https://github.com/Effect-TS/effect/commit/1ce703b041bbd7560c5c437c9b9be48f027937fd), [`1ce703b`](https://github.com/Effect-TS/effect/commit/1ce703b041bbd7560c5c437c9b9be48f027937fd)]: - - effect@3.11.9 - - @effect/cluster@0.20.2 - - @effect/rpc@0.46.6 - -## 0.21.1 - -### Patch Changes - -- Updated dependencies []: - - @effect/cluster@0.20.1 - - @effect/rpc@0.46.5 - -## 0.21.0 - -### Patch Changes - -- Updated dependencies [[`1a6b52d`](https://github.com/Effect-TS/effect/commit/1a6b52dcf020d36e38a7bc90b648152cf5a8ccba)]: - - effect@3.11.8 - - @effect/cluster@0.20.0 - - @effect/rpc@0.46.4 - -## 0.20.3 - -### Patch Changes - -- Updated dependencies []: - - @effect/cluster@0.19.3 - - @effect/rpc@0.46.3 - -## 0.20.2 - -### Patch Changes - -- Updated dependencies [[`2408616`](https://github.com/Effect-TS/effect/commit/24086163b60b09cc6d0885bd565ef080dcbe866b), [`cec0b4d`](https://github.com/Effect-TS/effect/commit/cec0b4d152ef660be2ccdb0927255f2471436e6e), [`cec0b4d`](https://github.com/Effect-TS/effect/commit/cec0b4d152ef660be2ccdb0927255f2471436e6e), [`8d978c5`](https://github.com/Effect-TS/effect/commit/8d978c53f6fcc98d9d645ecba3e4b55d4297dd36), [`cec0b4d`](https://github.com/Effect-TS/effect/commit/cec0b4d152ef660be2ccdb0927255f2471436e6e), [`cec0b4d`](https://github.com/Effect-TS/effect/commit/cec0b4d152ef660be2ccdb0927255f2471436e6e)]: - - effect@3.11.7 - - @effect/cluster@0.19.2 - - @effect/rpc@0.46.2 - -## 0.20.1 - -### Patch Changes - -- Updated dependencies []: - - @effect/cluster@0.19.1 - - @effect/rpc@0.46.1 - -## 0.20.0 - -### Patch Changes - -- Updated dependencies [[`662d1ce`](https://github.com/Effect-TS/effect/commit/662d1ce6fb7da384a95888d5b2bb5605bdf3208d), [`31c62d8`](https://github.com/Effect-TS/effect/commit/31c62d83cbdcf9850a8b5331faa239601c60f78a)]: - - effect@3.11.6 - - @effect/cluster@0.19.0 - - @effect/rpc@0.46.0 - -## 0.19.7 - -### Patch Changes - -- Updated dependencies [[`9f5a6f7`](https://github.com/Effect-TS/effect/commit/9f5a6f701bf7ba31adccd1f1bcfa8ab5614c9be8), [`22905cf`](https://github.com/Effect-TS/effect/commit/22905cf5addfb1ff3d2a6135c52036be958ae911), [`9f5a6f7`](https://github.com/Effect-TS/effect/commit/9f5a6f701bf7ba31adccd1f1bcfa8ab5614c9be8), [`1e59e4f`](https://github.com/Effect-TS/effect/commit/1e59e4fd778da18296812a2a32f36ca8ae50f60d), [`8d914e5`](https://github.com/Effect-TS/effect/commit/8d914e504e7a22d0ea628e8af265ee450ff9530f), [`03bb00f`](https://github.com/Effect-TS/effect/commit/03bb00faa74f9e168a54a8cc0828a664fbb1ab05), [`9f5a6f7`](https://github.com/Effect-TS/effect/commit/9f5a6f701bf7ba31adccd1f1bcfa8ab5614c9be8), [`14e1149`](https://github.com/Effect-TS/effect/commit/14e1149f1af5a022f06eb8c2e4ba9fec17fe7426), [`9f5a6f7`](https://github.com/Effect-TS/effect/commit/9f5a6f701bf7ba31adccd1f1bcfa8ab5614c9be8), [`9f5a6f7`](https://github.com/Effect-TS/effect/commit/9f5a6f701bf7ba31adccd1f1bcfa8ab5614c9be8)]: - - effect@3.11.5 - - @effect/cluster@0.18.7 - - @effect/rpc@0.45.7 - -## 0.19.6 - -### Patch Changes - -- Updated dependencies []: - - @effect/cluster@0.18.6 - - @effect/rpc@0.45.6 - -## 0.19.5 - -### Patch Changes - -- Updated dependencies [[`518b258`](https://github.com/Effect-TS/effect/commit/518b258a8a67ecd332a9252c35cc060f8368dee2), [`6e323a3`](https://github.com/Effect-TS/effect/commit/6e323a36faaee46b328c8e3cf60a76b3aff9907f), [`6e323a3`](https://github.com/Effect-TS/effect/commit/6e323a36faaee46b328c8e3cf60a76b3aff9907f)]: - - effect@3.11.4 - - @effect/cluster@0.18.5 - - @effect/rpc@0.45.5 - -## 0.19.4 - -### Patch Changes - -- Updated dependencies [[`90906f7`](https://github.com/Effect-TS/effect/commit/90906f7f154b12c7182e8f39e3c55ef3937db857), [`3862cd3`](https://github.com/Effect-TS/effect/commit/3862cd3c7f6a542ed65fb81255b3bd696ce2f567), [`3862cd3`](https://github.com/Effect-TS/effect/commit/3862cd3c7f6a542ed65fb81255b3bd696ce2f567), [`343b6aa`](https://github.com/Effect-TS/effect/commit/343b6aa6ac4a74276bfc7c63ccbf4a1d72bc1bed), [`afba339`](https://github.com/Effect-TS/effect/commit/afba339adc11dad56b5a3b7ca94487e58f34d613)]: - - effect@3.11.3 - - @effect/cluster@0.18.4 - - @effect/rpc@0.45.4 - -## 0.19.3 - -### Patch Changes - -- Updated dependencies []: - - @effect/cluster@0.18.3 - - @effect/rpc@0.45.3 - -## 0.19.2 - -### Patch Changes - -- Updated dependencies [[`01cee56`](https://github.com/Effect-TS/effect/commit/01cee560b58d94b24cc20e98083251b73e658b41)]: - - effect@3.11.2 - - @effect/cluster@0.18.2 - - @effect/rpc@0.45.2 - -## 0.19.1 - -### Patch Changes - -- Updated dependencies [[`dd8a2d8`](https://github.com/Effect-TS/effect/commit/dd8a2d8e80d33b16719fc69361eaedf0b59d4620), [`a71bfef`](https://github.com/Effect-TS/effect/commit/a71bfef46f5061bb2502a61a333638a987b62273)]: - - effect@3.11.1 - - @effect/cluster@0.18.1 - - @effect/rpc@0.45.1 - -## 0.19.0 - -### Patch Changes - -- Updated dependencies [[`147434b`](https://github.com/Effect-TS/effect/commit/147434b03d5e1fd692dd9f126e5ab0910f3b76d3), [`6e69493`](https://github.com/Effect-TS/effect/commit/6e694930048bbaf98110f35f41566aeb9752d471), [`147434b`](https://github.com/Effect-TS/effect/commit/147434b03d5e1fd692dd9f126e5ab0910f3b76d3), [`5eff3f6`](https://github.com/Effect-TS/effect/commit/5eff3f6fa3aae7e86948a62cbfd63b8d6c3bdf92), [`d9fe79b`](https://github.com/Effect-TS/effect/commit/d9fe79bb5a3fe105d8e7a3bc2922a8ad936a5d10), [`251d189`](https://github.com/Effect-TS/effect/commit/251d189420bbba71990574e91098c499065f9a9b), [`5a259f3`](https://github.com/Effect-TS/effect/commit/5a259f3711b4369f55d885b568bdb21136155261), [`b4ce4ea`](https://github.com/Effect-TS/effect/commit/b4ce4ea7fd514a7e572f2dcd879c98f334981b0e), [`15fcc5a`](https://github.com/Effect-TS/effect/commit/15fcc5a0ea4bbf40ab48fa6a04fdda74f76f4c07), [`9bc9a47`](https://github.com/Effect-TS/effect/commit/9bc9a476800dc645903c888a68bb1d3baa3383c6), [`aadb8a4`](https://github.com/Effect-TS/effect/commit/aadb8a48d2cba197c06ec9996505510e48e4e5cb), [`1e2747c`](https://github.com/Effect-TS/effect/commit/1e2747c63a4820d1459cbbc88c71212983bd68bd), [`9264162`](https://github.com/Effect-TS/effect/commit/9264162a82783a651776fb7b87604564a63e7070), [`e0b9b09`](https://github.com/Effect-TS/effect/commit/e0b9b09e70c386b2da17d1f0a15b0511861c89e8), [`c36f3b9`](https://github.com/Effect-TS/effect/commit/c36f3b95df5ce9d71b66f22f26ce12eda8d3e848), [`aadb8a4`](https://github.com/Effect-TS/effect/commit/aadb8a48d2cba197c06ec9996505510e48e4e5cb)]: - - effect@3.11.0 - - @effect/cluster@0.18.0 - - @effect/rpc@0.45.0 - -## 0.18.4 - -### Patch Changes - -- Updated dependencies [[`3069614`](https://github.com/Effect-TS/effect/commit/30696149271129fc618f6f2ccd1d8f2f6c0f9cd7), [`09a5e52`](https://github.com/Effect-TS/effect/commit/09a5e522fd9b221f05d85b1d1c8a740d4973c302)]: - - effect@3.10.20 - - @effect/cluster@0.17.4 - - @effect/rpc@0.44.32 - -## 0.18.3 - -### Patch Changes - -- Updated dependencies []: - - @effect/cluster@0.17.3 - - @effect/rpc@0.44.31 - -## 0.18.2 - -### Patch Changes - -- Updated dependencies []: - - @effect/cluster@0.17.2 - -## 0.18.1 - -### Patch Changes - -- Updated dependencies []: - - @effect/cluster@0.17.1 - - @effect/rpc@0.44.30 - -## 0.18.0 - -### Patch Changes - -- Updated dependencies []: - - @effect/cluster@0.17.0 - - @effect/rpc@0.44.29 - -## 0.17.12 - -### Patch Changes - -- Updated dependencies [[`944025b`](https://github.com/Effect-TS/effect/commit/944025bc5ce139f4a85846aa689bf30ec06a8ec1), [`54addee`](https://github.com/Effect-TS/effect/commit/54addee438a644bf010646c52042c7b89c5fc0a7)]: - - effect@3.10.19 - - @effect/cluster@0.16.12 - - @effect/rpc@0.44.28 - -## 0.17.11 - -### Patch Changes - -- Updated dependencies [[`af409cf`](https://github.com/Effect-TS/effect/commit/af409cf1d2ff973be11cc079ea373eaeedca25de)]: - - effect@3.10.18 - - @effect/cluster@0.16.11 - - @effect/rpc@0.44.27 - -## 0.17.10 - -### Patch Changes - -- Updated dependencies [[`42c4ce6`](https://github.com/Effect-TS/effect/commit/42c4ce6f8d8c7d847e97757650a8ad9419a829d7)]: - - effect@3.10.17 - - @effect/cluster@0.16.10 - - @effect/rpc@0.44.26 - -## 0.17.9 - -### Patch Changes - -- Updated dependencies [[`4dca30c`](https://github.com/Effect-TS/effect/commit/4dca30cfcdafe4542e236489f71d6f171a5b4e38), [`1d99867`](https://github.com/Effect-TS/effect/commit/1d998671be3cd11043f232822e91dd8c98fccfa9), [`6dae414`](https://github.com/Effect-TS/effect/commit/6dae4147991a97ec14a99289bd25fadae7541e8d), [`6b0d737`](https://github.com/Effect-TS/effect/commit/6b0d737078bf63b97891e6bc47affc04b28f9cf7), [`d8356aa`](https://github.com/Effect-TS/effect/commit/d8356aad428a0c2290db52380220f81d9ec94232)]: - - effect@3.10.16 - - @effect/cluster@0.16.9 - - @effect/rpc@0.44.25 - -## 0.17.8 - -### Patch Changes - -- Updated dependencies []: - - @effect/cluster@0.16.8 - - @effect/rpc@0.44.24 - -## 0.17.7 - -### Patch Changes - -- Updated dependencies []: - - @effect/cluster@0.16.7 - - @effect/rpc@0.44.23 - -## 0.17.6 - -### Patch Changes - -- Updated dependencies [[`8398b32`](https://github.com/Effect-TS/effect/commit/8398b3208242a88239d4449910b7baf923cfe3b6), [`72e55b7`](https://github.com/Effect-TS/effect/commit/72e55b7c610784fcebdbadc592c876e23e76a986)]: - - effect@3.10.15 - - @effect/cluster@0.16.6 - - @effect/rpc@0.44.22 - -## 0.17.5 - -### Patch Changes - -- Updated dependencies [[`f983946`](https://github.com/Effect-TS/effect/commit/f9839467b4cad6e788297764ef9f9f0b9fd203f9), [`2d8a750`](https://github.com/Effect-TS/effect/commit/2d8a75081eb83a0a81f817fdf6f428369c5064ab)]: - - effect@3.10.14 - - @effect/cluster@0.16.5 - - @effect/rpc@0.44.21 - -## 0.17.4 - -### Patch Changes - -- Updated dependencies [[`995bbdf`](https://github.com/Effect-TS/effect/commit/995bbdffea2e332f203cd5b474cd6a1c77dfa6ae)]: - - effect@3.10.13 - - @effect/cluster@0.16.4 - - @effect/rpc@0.44.20 - -## 0.17.3 - -### Patch Changes - -- Updated dependencies []: - - @effect/cluster@0.16.3 - - @effect/rpc@0.44.19 - -## 0.17.2 - -### Patch Changes - -- Updated dependencies [[`dd14efe`](https://github.com/Effect-TS/effect/commit/dd14efe0ace255f571273aae876adea96267d7e6)]: - - effect@3.10.12 - - @effect/cluster@0.16.2 - - @effect/rpc@0.44.18 - -## 0.17.1 - -### Patch Changes - -- Updated dependencies [[`5eef499`](https://github.com/Effect-TS/effect/commit/5eef4998b6ccb7a5404d9e4fef85e57fa35fbb8a)]: - - effect@3.10.11 - - @effect/cluster@0.16.1 - - @effect/rpc@0.44.17 - -## 0.17.0 - -### Patch Changes - -- Updated dependencies []: - - @effect/cluster@0.16.0 - -## 0.16.0 - -### Patch Changes - -- Updated dependencies [[`cd720ae`](https://github.com/Effect-TS/effect/commit/cd720aedf7f2571edec0843d6a633e84e4832b28), [`cd720ae`](https://github.com/Effect-TS/effect/commit/cd720aedf7f2571edec0843d6a633e84e4832b28), [`b631f40`](https://github.com/Effect-TS/effect/commit/b631f40abbe649b2a089764585b5c39f6a695ac6)]: - - effect@3.10.10 - - @effect/cluster@0.15.0 - - @effect/rpc@0.44.16 - -## 0.15.16 - -### Patch Changes - -- Updated dependencies []: - - @effect/cluster@0.14.16 - - @effect/rpc@0.44.15 - -## 0.15.15 - -### Patch Changes - -- Updated dependencies [[`a123e80`](https://github.com/Effect-TS/effect/commit/a123e80f111a625428a5b5622b7f55ee1073566b), [`bd5fcd3`](https://github.com/Effect-TS/effect/commit/bd5fcd3e6b603b1e505af90d6a00627c8eca6d41), [`0289d3b`](https://github.com/Effect-TS/effect/commit/0289d3b6391031d00329365bab9791b355031fe3), [`7386b71`](https://github.com/Effect-TS/effect/commit/7386b710e5be570e17f468928a6ed19d549a3e12), [`4211a23`](https://github.com/Effect-TS/effect/commit/4211a2355bb3af3f0e756e2aae9d293379f25662)]: - - effect@3.10.9 - - @effect/cluster@0.14.15 - - @effect/rpc@0.44.14 - -## 0.15.14 - -### Patch Changes - -- Updated dependencies [[`68b5c9e`](https://github.com/Effect-TS/effect/commit/68b5c9e44f34192cef26e1cadda5e661a027df41), [`9c9928d`](https://github.com/Effect-TS/effect/commit/9c9928dfeacd9ac33dc37eb0ca3d7d8c39175ada), [`6306e66`](https://github.com/Effect-TS/effect/commit/6306e6656092b350d4ede5746da6f245ec9f7e07), [`361c7f3`](https://github.com/Effect-TS/effect/commit/361c7f39a2c10ede9324847c3d3ba192a6f9b20a)]: - - effect@3.10.8 - - @effect/cluster@0.14.14 - - @effect/rpc@0.44.13 - -## 0.15.13 - -### Patch Changes - -- Updated dependencies [[`33f5b9f`](https://github.com/Effect-TS/effect/commit/33f5b9ffaebea4f1bd0e391b44c41fb6230e743a), [`50f0281`](https://github.com/Effect-TS/effect/commit/50f0281b0d2116726b8927a6217622d5f394f3e4)]: - - effect@3.10.7 - - @effect/cluster@0.14.13 - - @effect/rpc@0.44.12 - -## 0.15.12 - -### Patch Changes - -- Updated dependencies [[`ce1c21f`](https://github.com/Effect-TS/effect/commit/ce1c21ffc11902ac9ab453a51904207859d38552)]: - - effect@3.10.6 - - @effect/cluster@0.14.12 - - @effect/rpc@0.44.11 - -## 0.15.11 - -### Patch Changes - -- Updated dependencies [[`3a6d757`](https://github.com/Effect-TS/effect/commit/3a6d757badeebe00d8ef4d67530d073c8264dcfa), [`59d813a`](https://github.com/Effect-TS/effect/commit/59d813aa4973d1115cfc70cc3667508335f49693)]: - - effect@3.10.5 - - @effect/cluster@0.14.11 - - @effect/rpc@0.44.10 - -## 0.15.10 - -### Patch Changes - -- Updated dependencies [[`2367708`](https://github.com/Effect-TS/effect/commit/2367708be449f9526a2047e321302d7bfb16f18e)]: - - effect@3.10.4 - - @effect/cluster@0.14.10 - - @effect/rpc@0.44.9 - -## 0.15.9 - -### Patch Changes - -- Updated dependencies []: - - @effect/cluster@0.14.9 - - @effect/rpc@0.44.8 - -## 0.15.8 - -### Patch Changes - -- Updated dependencies [[`b9423d8`](https://github.com/Effect-TS/effect/commit/b9423d8bf8181a2389fdbce1e3c14ac6fe8d54f5)]: - - effect@3.10.3 - - @effect/cluster@0.14.8 - - @effect/rpc@0.44.7 - -## 0.15.7 - -### Patch Changes - -- Updated dependencies [[`714e119`](https://github.com/Effect-TS/effect/commit/714e11945e45e5a2554ee058e6c43f82a8e309cf), [`c1afd55`](https://github.com/Effect-TS/effect/commit/c1afd55c54e61f9c432823d21b3d016f79160a37)]: - - effect@3.10.2 - - @effect/cluster@0.14.7 - - @effect/rpc@0.44.6 - -## 0.15.6 - -### Patch Changes - -- Updated dependencies [[`9604d6b`](https://github.com/Effect-TS/effect/commit/9604d6b616435103dafea8b53637a9d1450b4750)]: - - effect@3.10.1 - - @effect/cluster@0.14.6 - - @effect/rpc@0.44.5 - -## 0.15.5 - -### Patch Changes - -- Updated dependencies []: - - @effect/cluster@0.14.5 - - @effect/rpc@0.44.4 - -## 0.15.4 - -### Patch Changes - -- Updated dependencies []: - - @effect/cluster@0.14.4 - - @effect/rpc@0.44.3 - -## 0.15.3 - -### Patch Changes - -- Updated dependencies []: - - @effect/cluster@0.14.3 - - @effect/rpc@0.44.2 - -## 0.15.2 - -### Patch Changes - -- Updated dependencies []: - - @effect/cluster@0.14.2 - -## 0.15.1 - -### Patch Changes - -- Updated dependencies []: - - @effect/cluster@0.14.1 - - @effect/rpc@0.44.1 - -## 0.15.0 - -### Patch Changes - -- Updated dependencies [[`4a01828`](https://github.com/Effect-TS/effect/commit/4a01828b66d6213e9bbe18979c893b13f7bb29bf), [`4a01828`](https://github.com/Effect-TS/effect/commit/4a01828b66d6213e9bbe18979c893b13f7bb29bf), [`c79c4c1`](https://github.com/Effect-TS/effect/commit/c79c4c178390fe61ff6dda88c9e058862349343a), [`38d30f0`](https://github.com/Effect-TS/effect/commit/38d30f08b8da62f9c3e308b9250738cb8d17bdb5), [`5821ce3`](https://github.com/Effect-TS/effect/commit/5821ce3455b47d25e0a40cae6ce22af9db5fa556)]: - - effect@3.10.0 - - @effect/cluster@0.14.0 - - @effect/rpc@0.44.0 - -## 0.14.0 - -### Patch Changes - -- Updated dependencies []: - - @effect/cluster@0.13.0 - -## 0.13.5 - -### Patch Changes - -- Updated dependencies [[`382556f`](https://github.com/Effect-TS/effect/commit/382556f8930780c0634de681077706113a8c8239), [`97cb014`](https://github.com/Effect-TS/effect/commit/97cb0145114b2cd2f378e98f6c4ff5bf2c1865f5)]: - - @effect/schema@0.75.5 - - @effect/cluster@0.12.6 - - @effect/rpc@0.43.5 - -## 0.13.4 - -### Patch Changes - -- Updated dependencies []: - - @effect/cluster@0.12.5 - - @effect/rpc@0.43.4 - -## 0.13.3 - -### Patch Changes - -- Updated dependencies []: - - @effect/cluster@0.12.4 - - @effect/rpc@0.43.3 - -## 0.13.2 - -### Patch Changes - -- Updated dependencies [[`61a99b2`](https://github.com/Effect-TS/effect/commit/61a99b2bf9d757870ef0c2ec9d4c877cdd364a3d)]: - - effect@3.9.2 - - @effect/cluster@0.12.3 - - @effect/rpc@0.43.2 - - @effect/schema@0.75.4 - -## 0.13.1 - -### Patch Changes - -- Updated dependencies [[`360ec14`](https://github.com/Effect-TS/effect/commit/360ec14dd4102c526aef7433a8881ad4d9beab75)]: - - @effect/schema@0.75.3 - - @effect/cluster@0.12.2 - - @effect/rpc@0.43.1 - -## 0.13.0 - -### Patch Changes - -- Updated dependencies [[`09e8636`](https://github.com/Effect-TS/effect/commit/09e863648fa6ead9894b8b5104f8c11f6cc6120f)]: - - @effect/rpc@0.43.0 - - @effect/cluster@0.12.1 - -## 0.12.0 - -### Patch Changes - -- Updated dependencies [[`f02b354`](https://github.com/Effect-TS/effect/commit/f02b354ab5b0451143b82bb73dc866be29adec85)]: - - @effect/schema@0.75.2 - - @effect/cluster@0.12.0 - - @effect/rpc@0.42.0 - -## 0.11.1 - -### Patch Changes - -- Updated dependencies [[`3b2ad1d`](https://github.com/Effect-TS/effect/commit/3b2ad1d58a2e33dc1a72b7037396bd25ca1702a9)]: - - effect@3.9.1 - - @effect/schema@0.75.1 - - @effect/cluster@0.11.1 - - @effect/rpc@0.41.1 - -## 0.11.0 - -### Patch Changes - -- Updated dependencies [[`ff3d1aa`](https://github.com/Effect-TS/effect/commit/ff3d1aab290b4d1173b2dfc7e4c76abb4babdc16), [`0ba66f2`](https://github.com/Effect-TS/effect/commit/0ba66f2451641fd6990e02ec1ed01c014db9dab0), [`bf77f51`](https://github.com/Effect-TS/effect/commit/bf77f51b323c383224ebf08adf77a7a6e8c9b3cd), [`016f9ad`](https://github.com/Effect-TS/effect/commit/016f9ad931a4b3d09a34e5caf13d87c5b8e9c984), [`0779681`](https://github.com/Effect-TS/effect/commit/07796813f07de035719728733096ba64ce333469), [`534129f`](https://github.com/Effect-TS/effect/commit/534129f8113ce1a8ec50828083e16da9c86326c6), [`d75140c`](https://github.com/Effect-TS/effect/commit/d75140c7a664ceda43142d999f4ff8dcd36d6dda), [`be0451c`](https://github.com/Effect-TS/effect/commit/be0451c149b6618af79cb839cdf04af2db1efb03), [`9237ac6`](https://github.com/Effect-TS/effect/commit/9237ac69bc07de5b3b60076a0ad2921c21de7457), [`be0451c`](https://github.com/Effect-TS/effect/commit/be0451c149b6618af79cb839cdf04af2db1efb03), [`5b36494`](https://github.com/Effect-TS/effect/commit/5b364942e9a9003fdb8217324f8a2d8369c969da), [`c716adb`](https://github.com/Effect-TS/effect/commit/c716adb250ebbea1d1048d818ef7fed4f621d186), [`4986391`](https://github.com/Effect-TS/effect/commit/49863919cd8628c962a712fb1df30d2983820933), [`d75140c`](https://github.com/Effect-TS/effect/commit/d75140c7a664ceda43142d999f4ff8dcd36d6dda), [`d1387ae`](https://github.com/Effect-TS/effect/commit/d1387aebd1ff01bbebde26be46d488956e4daef6)]: - - effect@3.9.0 - - @effect/schema@0.75.0 - - @effect/cluster@0.11.0 - - @effect/rpc@0.41.0 - -## 0.10.1 - -### Patch Changes - -- Updated dependencies [[`88e85db`](https://github.com/Effect-TS/effect/commit/88e85db34bd402526e27a323e950d053fa34d232), [`83887ca`](https://github.com/Effect-TS/effect/commit/83887ca1b1793916913d8550a4db4450cd14a044), [`5266b6c`](https://github.com/Effect-TS/effect/commit/5266b6cd86d76c3886da041c8829bca04b1a3110), [`cdead5c`](https://github.com/Effect-TS/effect/commit/cdead5c9cfd54dc6c4f215d9732f654c4a12e991), [`766a8af`](https://github.com/Effect-TS/effect/commit/766a8af307b414aca3648d91c4eab7493a5ec862)]: - - effect@3.8.5 - - @effect/cluster@0.10.1 - - @effect/rpc@0.40.3 - - @effect/schema@0.74.2 - -## 0.10.0 - -### Patch Changes - -- Updated dependencies []: - - @effect/cluster@0.10.0 - -## 0.9.4 - -### Patch Changes - -- Updated dependencies []: - - @effect/cluster@0.9.4 - -## 0.9.3 - -### Patch Changes - -- Updated dependencies [[`734eae6`](https://github.com/Effect-TS/effect/commit/734eae654f215e4adca457d04d2a1728b1a55c83), [`fd83d0e`](https://github.com/Effect-TS/effect/commit/fd83d0e548feff9ea2d53d370a0b626c4a1d940e), [`4509656`](https://github.com/Effect-TS/effect/commit/45096569d50262275ee984f44c456f5c83b62683), [`ad7e1de`](https://github.com/Effect-TS/effect/commit/ad7e1de948745c0751bfdac96671028ff4b7a727), [`090e41c`](https://github.com/Effect-TS/effect/commit/090e41c636d720b1c7d89684a739855765ed4382), [`090e41c`](https://github.com/Effect-TS/effect/commit/090e41c636d720b1c7d89684a739855765ed4382)]: - - @effect/schema@0.74.1 - - effect@3.8.4 - - @effect/cluster@0.9.3 - - @effect/rpc@0.40.2 - -## 0.9.2 - -### Patch Changes - -- Updated dependencies []: - - @effect/cluster@0.9.2 - - @effect/rpc@0.40.1 - -## 0.9.1 - -### Patch Changes - -- Updated dependencies []: - - @effect/cluster@0.9.1 - -## 0.9.0 - -### Patch Changes - -- Updated dependencies [[`de48aa5`](https://github.com/Effect-TS/effect/commit/de48aa54e98d97722a8a4c2c8f9e1fe1d4560ea2)]: - - @effect/schema@0.74.0 - - @effect/cluster@0.9.0 - - @effect/rpc@0.40.0 - -## 0.8.6 - -### Patch Changes - -- Updated dependencies [[`bb5ec6b`](https://github.com/Effect-TS/effect/commit/bb5ec6b4b6a6f537394596c5a596faf52cb2aef4)]: - - effect@3.8.3 - - @effect/cluster@0.8.6 - - @effect/rpc@0.39.5 - - @effect/schema@0.73.4 - -## 0.8.5 - -### Patch Changes - -- Updated dependencies [[`e6440a7`](https://github.com/Effect-TS/effect/commit/e6440a74fb3f12f6422ed794c07cb44af91cbacc)]: - - @effect/schema@0.73.3 - - @effect/cluster@0.8.5 - - @effect/rpc@0.39.4 - -## 0.8.4 - -### Patch Changes - -- Updated dependencies []: - - @effect/cluster@0.8.4 - -## 0.8.3 - -### Patch Changes - -- Updated dependencies [[`f0d8ef1`](https://github.com/Effect-TS/effect/commit/f0d8ef1ce97ec2a87b09b3e24150cfeab85d6e2f)]: - - effect@3.8.2 - - @effect/cluster@0.8.3 - - @effect/rpc@0.39.3 - - @effect/schema@0.73.2 - -## 0.8.2 - -### Patch Changes - -- Updated dependencies [[`10bf621`](https://github.com/Effect-TS/effect/commit/10bf6213f36d8ddb00f058a4609b85220f3d8334), [`f56ab78`](https://github.com/Effect-TS/effect/commit/f56ab785cbee0c1c43bd2c182c35602f486f61f0), [`ae36fa6`](https://github.com/Effect-TS/effect/commit/ae36fa68f754eeab9a54b6dc0f8b44db513aa2b6)]: - - effect@3.8.1 - - @effect/schema@0.73.1 - - @effect/cluster@0.8.2 - - @effect/rpc@0.39.2 - -## 0.8.1 - -### Patch Changes - -- Updated dependencies []: - - @effect/cluster@0.8.1 - - @effect/rpc@0.39.1 - -## 0.8.0 - -### Patch Changes - -- Updated dependencies [[`fcfa6ee`](https://github.com/Effect-TS/effect/commit/fcfa6ee30ffd07d998bf22799357bf58580a116f), [`bb9931b`](https://github.com/Effect-TS/effect/commit/bb9931b62e249a3b801f2cb9d097aec0c8511af7), [`5798f76`](https://github.com/Effect-TS/effect/commit/5798f7619529de33e5ba06f551806f68fedc19db), [`5f0bfa1`](https://github.com/Effect-TS/effect/commit/5f0bfa17205398d4e4818bfbcf9e1b505b3b1fc5), [`7fdf9d9`](https://github.com/Effect-TS/effect/commit/7fdf9d9aa1e2c1c125cbf87991e6efbf4abb7b07), [`812a4e8`](https://github.com/Effect-TS/effect/commit/812a4e86e2d1aa23b477ef5829aa0e5c07784936), [`273565e`](https://github.com/Effect-TS/effect/commit/273565e7901639e8d0541930ab715aea9c80fbaa), [`569a801`](https://github.com/Effect-TS/effect/commit/569a8017ef0a0bc203e4312867cbdd37b0effbd7), [`aa1fa53`](https://github.com/Effect-TS/effect/commit/aa1fa5301e886b9657c8eb0d38cb87cef92a8305), [`02f6b06`](https://github.com/Effect-TS/effect/commit/02f6b0660e12bee1069532a9cc18d3ab855257be), [`12b893e`](https://github.com/Effect-TS/effect/commit/12b893e63cc6dfada4aca7773b4783940e2edf25), [`bbad27e`](https://github.com/Effect-TS/effect/commit/bbad27ec0a90860593f759405caa877e7f4a655f), [`adf7d7a`](https://github.com/Effect-TS/effect/commit/adf7d7a7dfce3a7021e9f3b0d847dc85be89d754), [`007289a`](https://github.com/Effect-TS/effect/commit/007289a52d5877f8e90e2dacf38171ff9bf603fd), [`42a8f99`](https://github.com/Effect-TS/effect/commit/42a8f99740eefdaf2c4544d2c345313f97547a36), [`eebfd29`](https://github.com/Effect-TS/effect/commit/eebfd29633fd5d38b505c5c0842036f61f05e913), [`040703d`](https://github.com/Effect-TS/effect/commit/040703d0e100cd5511e52d812c15492414262b5e)]: - - effect@3.8.0 - - @effect/schema@0.73.0 - - @effect/rpc@0.39.0 - - @effect/cluster@0.8.0 - -## 0.7.3 - -### Patch Changes - -- Updated dependencies []: - - @effect/cluster@0.7.3 - -## 0.7.2 - -### Patch Changes - -- Updated dependencies [[`35a0f81`](https://github.com/Effect-TS/effect/commit/35a0f813141652d696461cd5d19fd146adaf85be)]: - - effect@3.7.3 - - @effect/cluster@0.7.2 - - @effect/rpc@0.38.1 - - @effect/schema@0.72.4 - -## 0.7.1 - -### Patch Changes - -- Updated dependencies []: - - @effect/cluster@0.7.1 - -## 0.7.0 - -### Patch Changes - -- Updated dependencies [[`f6acb71`](https://github.com/Effect-TS/effect/commit/f6acb71b17a0e6b0d449e7f661c9e2c3d335fcac)]: - - @effect/schema@0.72.3 - - @effect/cluster@0.7.0 - - @effect/rpc@0.38.0 - -## 0.6.4 - -### Patch Changes - -- Updated dependencies []: - - @effect/cluster@0.6.4 - -## 0.6.3 - -### Patch Changes - -- Updated dependencies []: - - @effect/cluster@0.6.3 - - @effect/rpc@0.37.3 - -## 0.6.2 - -### Patch Changes - -- Updated dependencies [[`8a601d7`](https://github.com/Effect-TS/effect/commit/8a601d7a1f8ffe52ac9e6d67e9282a1495fe59c9), [`353ba19`](https://github.com/Effect-TS/effect/commit/353ba19f9b2b9e959f0a00d058c6d40a4bc02db7)]: - - effect@3.7.2 - - @effect/cluster@0.6.2 - - @effect/rpc@0.37.2 - - @effect/schema@0.72.2 - -## 0.6.1 - -### Patch Changes - -- Updated dependencies [[`79859e7`](https://github.com/Effect-TS/effect/commit/79859e71040d8edf1868b8530b90c650f4321eff), [`f6a469c`](https://github.com/Effect-TS/effect/commit/f6a469c190b9f00eee5ea0cd4d5912a0ef8b46f5), [`dcb9ec0`](https://github.com/Effect-TS/effect/commit/dcb9ec0db443894dd204d87450f779c44b9ad7f1), [`79aa6b1`](https://github.com/Effect-TS/effect/commit/79aa6b136e1f29b36f34e88cb2ff162bff2bb4ed)]: - - effect@3.7.1 - - @effect/cluster@0.6.1 - - @effect/rpc@0.37.1 - - @effect/schema@0.72.1 - -## 0.6.0 - -### Patch Changes - -- Updated dependencies [[`db89601`](https://github.com/Effect-TS/effect/commit/db89601ee9c1050c4e762b7bd7ec65a6a2799dfe), [`2f456cc`](https://github.com/Effect-TS/effect/commit/2f456cce5012b9fcb6b4e039190d527813b75b92), [`8745e41`](https://github.com/Effect-TS/effect/commit/8745e41ed96e3765dc6048efc2a9afbe05c8a1e9), [`e557838`](https://github.com/Effect-TS/effect/commit/e55783886b046d3c5f33447f455f9ccf2fa75922), [`d6e7e40`](https://github.com/Effect-TS/effect/commit/d6e7e40b1e2ad0c59aa02f07344d28601b14ebdc), [`8356321`](https://github.com/Effect-TS/effect/commit/8356321598da04bd77c1001f45a4e447bec5591d), [`192f2eb`](https://github.com/Effect-TS/effect/commit/192f2ebb2c4ddbf4bfd8baedd32140b2376868f4), [`718cb70`](https://github.com/Effect-TS/effect/commit/718cb70038629a6d58d02e407760e341f7c94474), [`e9d0310`](https://github.com/Effect-TS/effect/commit/e9d03107acbf204d9304f3e8aea0816b7d3c7dfb), [`6bf28f7`](https://github.com/Effect-TS/effect/commit/6bf28f7e3b1e5e0608ff567205fea0581d11666f)]: - - effect@3.7.0 - - @effect/cluster@0.6.0 - - @effect/rpc@0.37.0 - - @effect/schema@0.72.0 - -## 0.5.7 - -### Patch Changes - -- Updated dependencies [[`e809286`](https://github.com/Effect-TS/effect/commit/e8092865900608c4df7a6b7991b1c13cc1e4ca2d)]: - - effect@3.6.8 - - @effect/cluster@0.5.7 - - @effect/rpc@0.36.5 - - @effect/schema@0.71.4 - -## 0.5.6 - -### Patch Changes - -- Updated dependencies [[`50ec889`](https://github.com/Effect-TS/effect/commit/50ec8897a49b7d1fe84f63107f89d543c52f3dfc)]: - - effect@3.6.7 - - @effect/cluster@0.5.6 - - @effect/rpc@0.36.4 - - @effect/schema@0.71.3 - -## 0.5.5 - -### Patch Changes - -- Updated dependencies [[`f960bf4`](https://github.com/Effect-TS/effect/commit/f960bf45239e9badac6e0ad3a602f4174cd7bbdf), [`46a575f`](https://github.com/Effect-TS/effect/commit/46a575f48a05457b782fb21f7827d338c9b59320)]: - - effect@3.6.6 - - @effect/cluster@0.5.5 - - @effect/rpc@0.36.3 - - @effect/schema@0.71.2 - -## 0.5.4 - -### Patch Changes - -- Updated dependencies [[`14a47a8`](https://github.com/Effect-TS/effect/commit/14a47a8c1f3cff2186b8fe7a919a1d773888fb5b), [`0c09841`](https://github.com/Effect-TS/effect/commit/0c0984173be3d58f050b300a1a8aa89d76ba49ae)]: - - effect@3.6.5 - - @effect/cluster@0.5.4 - - @effect/rpc@0.36.2 - - @effect/schema@0.71.1 - -## 0.5.3 - -### Patch Changes - -- Updated dependencies []: - - @effect/cluster@0.5.3 - - @effect/rpc@0.36.1 - -## 0.5.2 - -### Patch Changes - -- Updated dependencies []: - - @effect/cluster@0.5.2 - -## 0.5.1 - -### Patch Changes - -- Updated dependencies []: - - @effect/cluster@0.5.1 - -## 0.5.0 - -### Patch Changes - -- Updated dependencies [[`c1987e2`](https://github.com/Effect-TS/effect/commit/c1987e25c8f5c48bdc9ad223d7a6f2c32f93f5a1), [`8295281`](https://github.com/Effect-TS/effect/commit/8295281ae9bd7441e680402540bf3c8682ec417b), [`c940df6`](https://github.com/Effect-TS/effect/commit/c940df63800bf3c4396d91cf28ec34938642fd2c), [`00b6c6d`](https://github.com/Effect-TS/effect/commit/00b6c6d4001f5de728b7d990a1b14560b4961a63), [`1ceed14`](https://github.com/Effect-TS/effect/commit/1ceed149dc64f4874e64b5cf2f954eba0a5a1f12), [`f8d95a6`](https://github.com/Effect-TS/effect/commit/f8d95a61ad0762147933c5c32bb6d7237e18eef4), [`0e42a8f`](https://github.com/Effect-TS/effect/commit/0e42a8f045ecb1fd3d080edf3d49fef16a9b0ca1)]: - - @effect/schema@0.71.0 - - effect@3.6.4 - - @effect/cluster@0.5.0 - - @effect/rpc@0.36.0 - -## 0.4.1 - -### Patch Changes - -- [#3446](https://github.com/Effect-TS/effect/pull/3446) [`335111d`](https://github.com/Effect-TS/effect/commit/335111ddf540b270dd3805d580f6ae63c1a134b8) Thanks @tim-smart! - sync /cluster\* package.json dependencies with source code - -- Updated dependencies [[`04adcac`](https://github.com/Effect-TS/effect/commit/04adcace913e6fc483df266874a68005e9e04ccf)]: - - effect@3.6.3 - - @effect/cluster@0.4.7 - - @effect/rpc@0.35.1 - - @effect/schema@0.70.4 - -## 0.4.0 - -### Patch Changes - -- Updated dependencies [[`17245a4`](https://github.com/Effect-TS/effect/commit/17245a4e783c19dee51529600b3b40f164fa59bc), [`739834e`](https://github.com/Effect-TS/effect/commit/739834efd99621f92519a98e6f60553d9d7b316d), [`630d40e`](https://github.com/Effect-TS/effect/commit/630d40eaa7eb4d2f8b6705b16d4f426bc28a7d09), [`630d40e`](https://github.com/Effect-TS/effect/commit/630d40eaa7eb4d2f8b6705b16d4f426bc28a7d09), [`739834e`](https://github.com/Effect-TS/effect/commit/739834efd99621f92519a98e6f60553d9d7b316d)]: - - @effect/platform@0.61.7 - - @effect/rpc@0.35.0 - - @effect/platform-node@0.56.8 - -## 0.3.7 - -### Patch Changes - -- Updated dependencies [[`99ad841`](https://github.com/Effect-TS/effect/commit/99ad8415293a82d08bd7043c563b29e2b468ca74), [`d829b57`](https://github.com/Effect-TS/effect/commit/d829b576357f2e3b203ab7e107a1492de903a106), [`fd4b2f6`](https://github.com/Effect-TS/effect/commit/fd4b2f6516b325740dde615f1cf0229edf13ca0c)]: - - @effect/schema@0.70.3 - - @effect/platform@0.61.6 - - effect@3.6.2 - - @effect/platform-node@0.56.7 - - @effect/rpc@0.34.6 - -## 0.3.6 - -### Patch Changes - -- Updated dependencies [[`76b0496`](https://github.com/Effect-TS/effect/commit/76b0496ff9d7670e3f4c07ae924d30ed7f613cee)]: - - @effect/platform-node@0.56.6 - -## 0.3.5 - -### Patch Changes - -- Updated dependencies [[`056b710`](https://github.com/Effect-TS/effect/commit/056b7108978e70612176c23991916f678d947f38), [`23a51df`](https://github.com/Effect-TS/effect/commit/23a51df3685c664dcda400cfc8a51b10063e9b33), [`056b710`](https://github.com/Effect-TS/effect/commit/056b7108978e70612176c23991916f678d947f38)]: - - @effect/platform-node@0.56.5 - - @effect/rpc@0.34.5 - - @effect/platform@0.61.5 - -## 0.3.4 - -### Patch Changes - -- Updated dependencies [[`e7cb109`](https://github.com/Effect-TS/effect/commit/e7cb109d0754207024a64d55b6bd2a674dd8ed7d)]: - - @effect/platform@0.61.4 - - @effect/platform-node@0.56.4 - - @effect/rpc@0.34.4 - -## 0.3.3 - -### Patch Changes - -- Updated dependencies [[`510a34d`](https://github.com/Effect-TS/effect/commit/510a34d4cc5d2f51347a53847f6c7db84d2b17c6), [`fb9f786`](https://github.com/Effect-TS/effect/commit/fb9f7867f0c895e63f9ef23e8d0941248c42179d), [`45dbb9f`](https://github.com/Effect-TS/effect/commit/45dbb9ffeaf93d9e4df99d0cd4920e41ba9a3978)]: - - effect@3.6.1 - - @effect/platform@0.61.3 - - @effect/platform-node@0.56.3 - - @effect/rpc@0.34.3 - - @effect/schema@0.70.2 - -## 0.3.2 - -### Patch Changes - -- Updated dependencies [[`3dce357`](https://github.com/Effect-TS/effect/commit/3dce357efe4a4451d7d29859d08ac11713999b1a), [`657fc48`](https://github.com/Effect-TS/effect/commit/657fc48bb32daf2dc09c9335b3cbc3152bcbdd3b)]: - - @effect/schema@0.70.1 - - @effect/platform@0.61.2 - - @effect/platform-node@0.56.2 - - @effect/rpc@0.34.2 - -## 0.3.1 - -### Patch Changes - -- Updated dependencies [[`11223bf`](https://github.com/Effect-TS/effect/commit/11223bf9cbf5b822e0bf9a9fb2b35b2ad88af692)]: - - @effect/platform@0.61.1 - - @effect/platform-node@0.56.1 - - @effect/rpc@0.34.1 - -## 0.3.0 - -### Patch Changes - -- Updated dependencies [[`1e0fe80`](https://github.com/Effect-TS/effect/commit/1e0fe802b36c257971296617473ce0abe730e8dc), [`8135294`](https://github.com/Effect-TS/effect/commit/8135294b591ea94fde7e6f94a504608f0e630520), [`cd255a4`](https://github.com/Effect-TS/effect/commit/cd255a48872d8fb924cf713ef73f0883a9cc6987), [`3845646`](https://github.com/Effect-TS/effect/commit/3845646828e98f3c7cda1217f6cfe5f642ac0603), [`2d09078`](https://github.com/Effect-TS/effect/commit/2d09078c5948b37fc2f79ef858fe4ca3e4814085), [`4bce5a0`](https://github.com/Effect-TS/effect/commit/4bce5a0274203550ccf117d830721891b0a3d182), [`4ddbff0`](https://github.com/Effect-TS/effect/commit/4ddbff0bb4e3ffddfeb509c59835b83245fb975e), [`e74cc38`](https://github.com/Effect-TS/effect/commit/e74cc38cb420a320c4d7ef98180f19d452a8b316), [`bb069b4`](https://github.com/Effect-TS/effect/commit/bb069b49ef291c532a02c1e8e74271f6d1bb32ec), [`cd255a4`](https://github.com/Effect-TS/effect/commit/cd255a48872d8fb924cf713ef73f0883a9cc6987), [`7d02174`](https://github.com/Effect-TS/effect/commit/7d02174af3bcbf054e5cdddb821c91d0f47e8285)]: - - effect@3.6.0 - - @effect/schema@0.70.0 - - @effect/platform@0.61.0 - - @effect/rpc@0.34.0 - - @effect/platform-node@0.56.0 - -## 0.2.3 - -### Patch Changes - -- Updated dependencies [[`7c0da50`](https://github.com/Effect-TS/effect/commit/7c0da5050d30cb804f4eacb15995d0fb7f3a28d2), [`2fc0ff4`](https://github.com/Effect-TS/effect/commit/2fc0ff4c59c25977018f6ac70ced99b04a8c7b2b), [`6359644`](https://github.com/Effect-TS/effect/commit/635964446323cf55d4060559337e710e4a24496e), [`f262665`](https://github.com/Effect-TS/effect/commit/f262665c2773492c01e5dd0e8d6db235aafaaad8), [`7f41e42`](https://github.com/Effect-TS/effect/commit/7f41e428830bf3043b8be0d28dcd235d5747c942), [`9bbe7a6`](https://github.com/Effect-TS/effect/commit/9bbe7a681430ebf5c10167bb7140ba3742e46bb7), [`f566fd1`](https://github.com/Effect-TS/effect/commit/f566fd1d7eea531a0d981dd24037f14a603a1273)]: - - @effect/schema@0.69.3 - - effect@3.5.9 - - @effect/platform@0.60.3 - - @effect/platform-node@0.55.3 - - @effect/rpc@0.33.3 - -## 0.2.2 - -### Patch Changes - -- Updated dependencies [[`eb4d014`](https://github.com/Effect-TS/effect/commit/eb4d014c559e1b4c95b3fb9295fe77593c17ed7a), [`1ba640c`](https://github.com/Effect-TS/effect/commit/1ba640c702f187a866023bf043c26e25cce941ef), [`c8c71bd`](https://github.com/Effect-TS/effect/commit/c8c71bd20eb87d23133dac6156b83bb08941597c), [`a26ce58`](https://github.com/Effect-TS/effect/commit/a26ce581ca7d407e1e81439b58c8045b3fa65231), [`fc20f73`](https://github.com/Effect-TS/effect/commit/fc20f73c69e577981cb64714de2adc97e1004dae)]: - - @effect/platform@0.60.2 - - effect@3.5.8 - - @effect/platform-node@0.55.2 - - @effect/rpc@0.33.2 - - @effect/schema@0.69.2 - -## 0.2.1 - -### Patch Changes - -- Updated dependencies [[`f241154`](https://github.com/Effect-TS/effect/commit/f241154added5d91e95866c39481f09cdb13bd4d)]: - - @effect/schema@0.69.1 - - @effect/platform@0.60.1 - - @effect/platform-node@0.55.1 - - @effect/rpc@0.33.1 - -## 0.2.0 - -### Patch Changes - -- Updated dependencies [[`20807a4`](https://github.com/Effect-TS/effect/commit/20807a45edeb4334e903dca5d708cd62a71702d8), [`20807a4`](https://github.com/Effect-TS/effect/commit/20807a45edeb4334e903dca5d708cd62a71702d8)]: - - @effect/rpc@0.33.0 - - @effect/schema@0.69.0 - - @effect/platform@0.60.0 - - @effect/platform-node@0.55.0 - -## 0.1.4 - -### Patch Changes - -- [#3310](https://github.com/Effect-TS/effect/pull/3310) [`99bddcf`](https://github.com/Effect-TS/effect/commit/99bddcfb3d6eab4d489d055404e26ad81afe52fc) Thanks @fubhy! - Added additional pure annotations to improve tree-shakeability - -- Updated dependencies [[`3afcc93`](https://github.com/Effect-TS/effect/commit/3afcc93413a3d910beb69e4ce9ae120e4adaffd5), [`99bddcf`](https://github.com/Effect-TS/effect/commit/99bddcfb3d6eab4d489d055404e26ad81afe52fc), [`6921c4f`](https://github.com/Effect-TS/effect/commit/6921c4fb8c45badff09b493043b85ca71302b560)]: - - effect@3.5.7 - - @effect/platform@0.59.3 - - @effect/platform-node@0.54.4 - - @effect/rpc@0.32.3 - - @effect/schema@0.68.27 - -## 0.1.3 - -### Patch Changes - -- Updated dependencies [[`f0285d3`](https://github.com/Effect-TS/effect/commit/f0285d3af6a18829123bc1818331c67206becbc4), [`8ec4955`](https://github.com/Effect-TS/effect/commit/8ec49555ed3b3c98093fa4d135a4c57a3f16ebd1), [`3ac2d76`](https://github.com/Effect-TS/effect/commit/3ac2d76048da09e876cf6c3aee3397febd843fe9), [`cc327a1`](https://github.com/Effect-TS/effect/commit/cc327a1bccd22a4ee27ec7e58b53205e93b23e2c), [`4bfe4fb`](https://github.com/Effect-TS/effect/commit/4bfe4fb5c82f597c9beea9baa92e772593598b60), [`2b14d18`](https://github.com/Effect-TS/effect/commit/2b14d181462cad8359da4fa6bc6dfda0f742c398)]: - - @effect/schema@0.68.26 - - effect@3.5.6 - - @effect/platform@0.59.2 - - @effect/platform-node@0.54.3 - - @effect/rpc@0.32.2 - -## 0.1.2 - -### Patch Changes - -- Updated dependencies [[`a9d7800`](https://github.com/Effect-TS/effect/commit/a9d7800f6a253192b653d77778b0674f39b1ca39), [`fcecff7`](https://github.com/Effect-TS/effect/commit/fcecff7f7e12b295a252f124861b801c73072151), [`adbf753`](https://github.com/Effect-TS/effect/commit/adbf75340a9db15dc5cadc66e911a8978a195a65), [`adbf753`](https://github.com/Effect-TS/effect/commit/adbf75340a9db15dc5cadc66e911a8978a195a65)]: - - effect@3.5.5 - - @effect/platform@0.59.1 - - @effect/platform-node@0.54.2 - - @effect/rpc@0.32.1 - - @effect/schema@0.68.25 - -## 0.1.1 - -### Patch Changes - -- Updated dependencies [[`07db4ac`](https://github.com/Effect-TS/effect/commit/07db4ac8da9d07ce31bd62470a73e362a4291a0c)]: - - @effect/platform-node@0.54.1 - -## 0.1.0 - -### Patch Changes - -- [#3253](https://github.com/Effect-TS/effect/pull/3253) [`ed0dde4`](https://github.com/Effect-TS/effect/commit/ed0dde4888e6f1a97ad5bba06b755d26a6a1c52e) Thanks @tim-smart! - update dependencies - -- Updated dependencies [[`53c0db0`](https://github.com/Effect-TS/effect/commit/53c0db06872d5b5edea2a706e83249908385325c), [`ed0dde4`](https://github.com/Effect-TS/effect/commit/ed0dde4888e6f1a97ad5bba06b755d26a6a1c52e), [`ada68b3`](https://github.com/Effect-TS/effect/commit/ada68b3e61c67907c2a281c024c84d818186ca4c), [`ca775ce`](https://github.com/Effect-TS/effect/commit/ca775cec53baebc1a43d9b8852a3ac6726178498), [`5be9cc0`](https://github.com/Effect-TS/effect/commit/5be9cc044025a9541b9b7acefa2d3fc05fa1301b), [`203658f`](https://github.com/Effect-TS/effect/commit/203658f8001c132b25764ab70344b171683b554c), [`eb1c4d4`](https://github.com/Effect-TS/effect/commit/eb1c4d44e54b9d8d201a366d1ff94face2a6dcd3)]: - - @effect/platform-node@0.54.0 - - @effect/platform@0.59.0 - - effect@3.5.4 - - @effect/schema@0.68.24 - - @effect/rpc@0.32.0 - -## 0.0.32 - -### Patch Changes - -- Updated dependencies [[`edb0da3`](https://github.com/Effect-TS/effect/commit/edb0da383746d760f35d8582f5fb0cc0eeca9217), [`edb0da3`](https://github.com/Effect-TS/effect/commit/edb0da383746d760f35d8582f5fb0cc0eeca9217), [`a1db40a`](https://github.com/Effect-TS/effect/commit/a1db40a650ab842e778654f0d88e80f2ef4fd6f3), [`c8d3fb0`](https://github.com/Effect-TS/effect/commit/c8d3fb0fe23585f6efb724af51fbab3ba1ad6e83), [`dabd028`](https://github.com/Effect-TS/effect/commit/dabd028decf9b7983ca16ebe0f48c05c11a84b68), [`786b2ab`](https://github.com/Effect-TS/effect/commit/786b2ab29d525c877bb84035dac9e2d6499339d1), [`fc57354`](https://github.com/Effect-TS/effect/commit/fc573547d41667016fce05eaee75960fcc6dce4d)]: - - effect@3.5.3 - - @effect/schema@0.68.23 - - @effect/platform@0.58.27 - - @effect/platform-node@0.53.26 - - @effect/rpc@0.31.27 - -## 0.0.31 - -### Patch Changes - -- Updated dependencies [[`639208e`](https://github.com/Effect-TS/effect/commit/639208eeb8a44622994f832bc2d45d06ab636bc8), [`6684b4c`](https://github.com/Effect-TS/effect/commit/6684b4c27d77a7fcc7af2e261a450edf971b62b5), [`6684b4c`](https://github.com/Effect-TS/effect/commit/6684b4c27d77a7fcc7af2e261a450edf971b62b5), [`6684b4c`](https://github.com/Effect-TS/effect/commit/6684b4c27d77a7fcc7af2e261a450edf971b62b5)]: - - effect@3.5.2 - - @effect/platform@0.58.26 - - @effect/platform-node@0.53.25 - - @effect/rpc@0.31.26 - - @effect/schema@0.68.22 - -## 0.0.30 - -### Patch Changes - -- Updated dependencies [[`0623fca`](https://github.com/Effect-TS/effect/commit/0623fca41679b0e3c5a10dd0f8985f91670bd721)]: - - @effect/platform@0.58.25 - - @effect/platform-node@0.53.24 - - @effect/rpc@0.31.25 - -## 0.0.29 - -### Patch Changes - -- Updated dependencies [[`55fdd76`](https://github.com/Effect-TS/effect/commit/55fdd761ee95afd73b6a892c13fee92b36c02837)]: - - effect@3.5.1 - - @effect/platform@0.58.24 - - @effect/platform-node@0.53.23 - - @effect/rpc@0.31.24 - - @effect/schema@0.68.21 - -## 0.0.28 - -### Patch Changes - -- Updated dependencies [[`a1f5b83`](https://github.com/Effect-TS/effect/commit/a1f5b831a1bc7535988b370d68d0b3eb1123e0ce), [`a1f5b83`](https://github.com/Effect-TS/effect/commit/a1f5b831a1bc7535988b370d68d0b3eb1123e0ce), [`a1f5b83`](https://github.com/Effect-TS/effect/commit/a1f5b831a1bc7535988b370d68d0b3eb1123e0ce), [`60bc3d0`](https://github.com/Effect-TS/effect/commit/60bc3d0867b13e48b24dc22604b4dd2e7b2c1ca4), [`5ab348f`](https://github.com/Effect-TS/effect/commit/5ab348f265db3d283aa091ddca6d2d49137c16f2), [`60bc3d0`](https://github.com/Effect-TS/effect/commit/60bc3d0867b13e48b24dc22604b4dd2e7b2c1ca4), [`3e04bf8`](https://github.com/Effect-TS/effect/commit/3e04bf8a7127e956cadb7684a8f4c661df57663b), [`e7fc45f`](https://github.com/Effect-TS/effect/commit/e7fc45f0c7002aafdaec7878149ac064cd104ea3), [`a1f5b83`](https://github.com/Effect-TS/effect/commit/a1f5b831a1bc7535988b370d68d0b3eb1123e0ce), [`4626de5`](https://github.com/Effect-TS/effect/commit/4626de59c25b384216faa0be87bf0b8cd36357d0), [`f01e7db`](https://github.com/Effect-TS/effect/commit/f01e7db317827255d7901f523f2e28b43298e8df), [`60bc3d0`](https://github.com/Effect-TS/effect/commit/60bc3d0867b13e48b24dc22604b4dd2e7b2c1ca4), [`79d2d91`](https://github.com/Effect-TS/effect/commit/79d2d91464d95dde0e9444d43e7a7f309f05d6e6), [`ac71f37`](https://github.com/Effect-TS/effect/commit/ac71f378f2413e5aa91c95f649ffe898d6a26114), [`8432360`](https://github.com/Effect-TS/effect/commit/8432360ce68614a419bb328083a4109d0fc8aa93), [`e4bf1bf`](https://github.com/Effect-TS/effect/commit/e4bf1bf2b4a970eacd77c9b77b5ea8c68bc84498), [`13cb861`](https://github.com/Effect-TS/effect/commit/13cb861a5eded15c55c6cdcf6a8acde8320367a6), [`79d2d91`](https://github.com/Effect-TS/effect/commit/79d2d91464d95dde0e9444d43e7a7f309f05d6e6), [`e7fc45f`](https://github.com/Effect-TS/effect/commit/e7fc45f0c7002aafdaec7878149ac064cd104ea3), [`9f66825`](https://github.com/Effect-TS/effect/commit/9f66825f1fce0fe8d10420c285f7dc4c71e8af8d)]: - - effect@3.5.0 - - @effect/platform@0.58.23 - - @effect/platform-node@0.53.22 - - @effect/rpc@0.31.23 - - @effect/schema@0.68.20 - -## 0.0.27 - -### Patch Changes - -- Updated dependencies [[`7af137c`](https://github.com/Effect-TS/effect/commit/7af137c9433f6e74959b3887561ec1e6f12e10ee), [`ee4b3dc`](https://github.com/Effect-TS/effect/commit/ee4b3dc5f68d19dc3ae1c2d12901c5b8ffbebabb), [`366f2ee`](https://github.com/Effect-TS/effect/commit/366f2ee3fb6f712a44e8f84fc188612e5ecc016d), [`366f2ee`](https://github.com/Effect-TS/effect/commit/366f2ee3fb6f712a44e8f84fc188612e5ecc016d), [`097d25c`](https://github.com/Effect-TS/effect/commit/097d25cb5d13c049e01789651be56b09620186ef)]: - - effect@3.4.9 - - @effect/platform-node@0.53.21 - - @effect/platform@0.58.22 - - @effect/rpc@0.31.22 - - @effect/schema@0.68.19 - -## 0.0.26 - -### Patch Changes - -- Updated dependencies [[`5d5cc6c`](https://github.com/Effect-TS/effect/commit/5d5cc6cfd7d63b07081290fb189b364999201fc5), [`a435e0f`](https://github.com/Effect-TS/effect/commit/a435e0fc5378b33a49bcec92ee235df6f16a2419), [`b5554db`](https://github.com/Effect-TS/effect/commit/b5554db36c4dd6f64fa5e6a62a29b2759c54217a), [`359ff8a`](https://github.com/Effect-TS/effect/commit/359ff8aa2e4e6389bf56d759baa804e2a7674a16), [`a9c4fb3`](https://github.com/Effect-TS/effect/commit/a9c4fb3bf3c6e92cd1c142b0605fddf7eb3c697c), [`f7534b9`](https://github.com/Effect-TS/effect/commit/f7534b94cba06b143a3d4f29275d92874a939559)]: - - @effect/schema@0.68.18 - - effect@3.4.8 - - @effect/platform@0.58.21 - - @effect/platform-node@0.53.20 - - @effect/rpc@0.31.21 - -## 0.0.25 - -### Patch Changes - -- Updated dependencies [[`15967cf`](https://github.com/Effect-TS/effect/commit/15967cf18931fb6ede3083eb687a8dfff371cc56), [`2328e17`](https://github.com/Effect-TS/effect/commit/2328e17577112db17c29b7756942a0ff64a70ee0), [`a5737d6`](https://github.com/Effect-TS/effect/commit/a5737d6db2b921605c332eabbc5402ee3d17357b)]: - - @effect/schema@0.68.17 - - effect@3.4.7 - - @effect/platform@0.58.20 - - @effect/platform-node@0.53.19 - - @effect/rpc@0.31.20 - -## 0.0.24 - -### Patch Changes - -- Updated dependencies [[`d006cec`](https://github.com/Effect-TS/effect/commit/d006cec022e8524dbfd6dc6df751fe4c86b10042), [`cb22726`](https://github.com/Effect-TS/effect/commit/cb2272656881aa5878a1c3fc0b12d8fbc66eb63c), [`e911cfd`](https://github.com/Effect-TS/effect/commit/e911cfdc79418462d7e9000976fded15ea6b738d)]: - - @effect/schema@0.68.16 - - @effect/platform@0.58.19 - - @effect/platform-node@0.53.18 - - @effect/rpc@0.31.19 - -## 0.0.23 - -### Patch Changes - -- Updated dependencies [[`7f8900a`](https://github.com/Effect-TS/effect/commit/7f8900a1de9addeb0d371103a2c5c2aa3e4ff95e)]: - - @effect/platform@0.58.18 - - @effect/platform-node@0.53.17 - - @effect/rpc@0.31.18 - -## 0.0.22 - -### Patch Changes - -- Updated dependencies [[`5c0ceb0`](https://github.com/Effect-TS/effect/commit/5c0ceb00826cce9e50bf9d41d83e191d5352c030), [`5c0ceb0`](https://github.com/Effect-TS/effect/commit/5c0ceb00826cce9e50bf9d41d83e191d5352c030), [`34faeb6`](https://github.com/Effect-TS/effect/commit/34faeb6305ba52af4d6f8bdd2e633bb6a5a7a35b), [`33735b1`](https://github.com/Effect-TS/effect/commit/33735b16b41bd26929d8f4754c190925db6323b7), [`5c0ceb0`](https://github.com/Effect-TS/effect/commit/5c0ceb00826cce9e50bf9d41d83e191d5352c030), [`139d4b3`](https://github.com/Effect-TS/effect/commit/139d4b39fb3bff2eeaa7c0c809c581da42425a83)]: - - effect@3.4.6 - - @effect/schema@0.68.15 - - @effect/platform@0.58.17 - - @effect/platform-node@0.53.16 - - @effect/rpc@0.31.17 - -## 0.0.21 - -### Patch Changes - -- Updated dependencies [[`61e5964`](https://github.com/Effect-TS/effect/commit/61e59640fd993216cca8ace0ac8abd9104e213ce)]: - - @effect/schema@0.68.14 - - @effect/platform@0.58.16 - - @effect/platform-node@0.53.15 - - @effect/rpc@0.31.16 - -## 0.0.20 - -### Patch Changes - -- Updated dependencies [[`cb76bcb`](https://github.com/Effect-TS/effect/commit/cb76bcb2f8858a90db4f785efee262cea1b9844e), [`baa90df`](https://github.com/Effect-TS/effect/commit/baa90df9663f5f37d7b6814dad25142d53dbc720)]: - - @effect/schema@0.68.13 - - @effect/platform@0.58.15 - - @effect/platform-node@0.53.14 - - @effect/rpc@0.31.15 - -## 0.0.19 - -### Patch Changes - -- Updated dependencies [[`52a87c7`](https://github.com/Effect-TS/effect/commit/52a87c7a0b9536398deaf8ec507e53a82c607219), [`6d2280e`](https://github.com/Effect-TS/effect/commit/6d2280e9497c95cb0e965ca462c825345074eedf)]: - - @effect/platform@0.58.14 - - @effect/platform-node@0.53.13 - - @effect/rpc@0.31.14 - -## 0.0.18 - -### Patch Changes - -- Updated dependencies [[`a047af9`](https://github.com/Effect-TS/effect/commit/a047af99447dfffc729e9c8ef0ca143537927e91), [`dbd53ea`](https://github.com/Effect-TS/effect/commit/dbd53ea363c71a24449cb068251054c3a1acf864), [`d990544`](https://github.com/Effect-TS/effect/commit/d9905444b9e800850cb65899114ca0e502e68fe8)]: - - effect@3.4.5 - - @effect/platform@0.58.13 - - @effect/schema@0.68.12 - - @effect/platform-node@0.53.12 - - @effect/rpc@0.31.13 - -## 0.0.17 - -### Patch Changes - -- Updated dependencies [[`74e0ad2`](https://github.com/Effect-TS/effect/commit/74e0ad23b4c36f41b7fd10856b20f8b701bc4044), [`74e0ad2`](https://github.com/Effect-TS/effect/commit/74e0ad23b4c36f41b7fd10856b20f8b701bc4044), [`72638e3`](https://github.com/Effect-TS/effect/commit/72638e3d99f0e93a24febf6c225256ce92d4a20b), [`d7dde2b`](https://github.com/Effect-TS/effect/commit/d7dde2b4af08b37af859d4c327c1f5c6f00cf9d9), [`9b2fc3b`](https://github.com/Effect-TS/effect/commit/9b2fc3b9dfd304a2bd0508ef2313cfc54357be0c), [`d71c192`](https://github.com/Effect-TS/effect/commit/d71c192b89fd1162423acddc5fd3d6270fbf2ef6)]: - - @effect/platform@0.58.12 - - effect@3.4.4 - - @effect/schema@0.68.11 - - @effect/platform-node@0.53.11 - - @effect/rpc@0.31.12 - -## 0.0.16 - -### Patch Changes - -- Updated dependencies [[`a5b95b5`](https://github.com/Effect-TS/effect/commit/a5b95b548284e4798654ae7ce6883fa49108f0ea), [`5e29579`](https://github.com/Effect-TS/effect/commit/5e29579187cb8420ea4930b3999fec984f8999f4)]: - - @effect/platform@0.58.11 - - @effect/platform-node@0.53.10 - - @effect/rpc@0.31.11 - -## 0.0.15 - -### Patch Changes - -- [#3079](https://github.com/Effect-TS/effect/pull/3079) [`bbdd365`](https://github.com/Effect-TS/effect/commit/bbdd36567706c94cdec45bacea825941c347b6cd) Thanks @tim-smart! - update dependencies - -- [#3079](https://github.com/Effect-TS/effect/pull/3079) [`bbdd365`](https://github.com/Effect-TS/effect/commit/bbdd36567706c94cdec45bacea825941c347b6cd) Thanks @tim-smart! - update to typescript 5.5 - -- Updated dependencies [[`a48ee84`](https://github.com/Effect-TS/effect/commit/a48ee845ac21bbde9baf938af9e97a98322211c9), [`c342739`](https://github.com/Effect-TS/effect/commit/c3427396226e1ad7b95b40595a23f9bdff3e3365), [`8898e5e`](https://github.com/Effect-TS/effect/commit/8898e5e238622f6337583d91ee23609c1f5ccdf7), [`a48ee84`](https://github.com/Effect-TS/effect/commit/a48ee845ac21bbde9baf938af9e97a98322211c9), [`a48ee84`](https://github.com/Effect-TS/effect/commit/a48ee845ac21bbde9baf938af9e97a98322211c9), [`ff78636`](https://github.com/Effect-TS/effect/commit/ff786367c522975f40f0f179a0ecdfcfab7ecbdb), [`c86bd4e`](https://github.com/Effect-TS/effect/commit/c86bd4e134c23146c216f9ff97e03781d55991b6), [`bbdd365`](https://github.com/Effect-TS/effect/commit/bbdd36567706c94cdec45bacea825941c347b6cd), [`ab3180f`](https://github.com/Effect-TS/effect/commit/ab3180f827041d0ea3b2d72254a1a8683e99e056), [`bbdd365`](https://github.com/Effect-TS/effect/commit/bbdd36567706c94cdec45bacea825941c347b6cd)]: - - @effect/platform@0.58.10 - - effect@3.4.3 - - @effect/platform-node@0.53.9 - - @effect/schema@0.68.10 - - @effect/rpc@0.31.10 - -## 0.0.14 - -### Patch Changes - -- Updated dependencies [[`0b47fdf`](https://github.com/Effect-TS/effect/commit/0b47fdfe449f42de89e0e88b61ae5140f629e5c4)]: - - @effect/schema@0.68.9 - - @effect/platform@0.58.9 - - @effect/platform-node@0.53.8 - - @effect/rpc@0.31.9 - -## 0.0.13 - -### Patch Changes - -- Updated dependencies [[`192261b`](https://github.com/Effect-TS/effect/commit/192261b2aec94e9913ceed83683fdcfbc9fca66f), [`3da1497`](https://github.com/Effect-TS/effect/commit/3da1497b5c9cc886d300258bc928fd68a4fefe6f)]: - - @effect/schema@0.68.8 - - effect@3.4.2 - - @effect/platform@0.58.8 - - @effect/platform-node@0.53.7 - - @effect/rpc@0.31.8 - -## 0.0.12 - -### Patch Changes - -- Updated dependencies [[`027004a`](https://github.com/Effect-TS/effect/commit/027004a897f654791e75faa28eefb50dd0244b6e)]: - - @effect/platform@0.58.7 - - @effect/platform-node@0.53.6 - - @effect/rpc@0.31.7 - -## 0.0.11 - -### Patch Changes - -- Updated dependencies [[`66a1910`](https://github.com/Effect-TS/effect/commit/66a19109ff90c4252123b8809b8c8a74681dba6a), [`2e8e252`](https://github.com/Effect-TS/effect/commit/2e8e2520cac712f0eb644553bd476429ebd674e4)]: - - effect@3.4.1 - - @effect/platform@0.58.6 - - @effect/platform-node@0.53.5 - - @effect/rpc@0.31.6 - - @effect/schema@0.68.7 - -## 0.0.10 - -### Patch Changes - -- Updated dependencies [[`37a07a2`](https://github.com/Effect-TS/effect/commit/37a07a2d8d1ce09ab965c0ada84a3fae9a6aba05)]: - - @effect/platform@0.58.5 - - @effect/platform-node@0.53.4 - - @effect/rpc@0.31.5 - -## 0.0.9 - -### Patch Changes - -- Updated dependencies [[`b77fb0a`](https://github.com/Effect-TS/effect/commit/b77fb0a811ec1ad0e794917077c9a90824515db8)]: - - @effect/platform@0.58.4 - - @effect/platform-node@0.53.3 - - @effect/rpc@0.31.4 - -## 0.0.8 - -### Patch Changes - -- Updated dependencies [[`530fa9e`](https://github.com/Effect-TS/effect/commit/530fa9e36b8532589b948fc4faa37593f36b7f42)]: - - @effect/schema@0.68.6 - - @effect/platform@0.58.3 - - @effect/platform-node@0.53.2 - - @effect/rpc@0.31.3 - -## 0.0.7 - -### Patch Changes - -- Updated dependencies [[`1d62815`](https://github.com/Effect-TS/effect/commit/1d62815a50f34115606940ffa397442d75a20c81)]: - - @effect/schema@0.68.5 - - @effect/platform@0.58.2 - - @effect/platform-node@0.53.1 - - @effect/rpc@0.31.2 - -## 0.0.6 - -### Patch Changes - -- Updated dependencies [[`5a248aa`](https://github.com/Effect-TS/effect/commit/5a248aa5ab2db3f7131ebc79bb9871a76de57973), [`5a248aa`](https://github.com/Effect-TS/effect/commit/5a248aa5ab2db3f7131ebc79bb9871a76de57973)]: - - @effect/platform@0.58.1 - - @effect/platform-node@0.53.0 - - @effect/rpc@0.31.1 - -## 0.0.5 - -### Patch Changes - -- Updated dependencies [[`c0ce180`](https://github.com/Effect-TS/effect/commit/c0ce180861ad0938053c0e6145e813fa6404df3b), [`63dd0c3`](https://github.com/Effect-TS/effect/commit/63dd0c3af45876c1caad7d03356c74daf551c628), [`61707b6`](https://github.com/Effect-TS/effect/commit/61707b6ffc7397c2ba0dce22512b44955724f60f), [`9c1b5b3`](https://github.com/Effect-TS/effect/commit/9c1b5b39e6c19604ce834f072a114ad392c50a06), [`a35faf8`](https://github.com/Effect-TS/effect/commit/a35faf8d116f94899bfc03feab33b004c8ddfdf7), [`ff73c0c`](https://github.com/Effect-TS/effect/commit/ff73c0cacd66132bfad2e5211b3eae347729c667), [`984d516`](https://github.com/Effect-TS/effect/commit/984d516ccd9412dc41188f6a46b748dd20dd5848), [`8c3b8a2`](https://github.com/Effect-TS/effect/commit/8c3b8a2ce208eab753b6206a51605a424f104e98), [`017e2f9`](https://github.com/Effect-TS/effect/commit/017e2f9b371ce24ea4945e5d7390c934ad3c39cf), [`91bf8a2`](https://github.com/Effect-TS/effect/commit/91bf8a2e9d1959393b3cf7366cc1d584d3e666b7), [`c6a4a26`](https://github.com/Effect-TS/effect/commit/c6a4a266606575fd2c7165940c4072ad4c57d01f)]: - - effect@3.4.0 - - @effect/platform-node@0.52.0 - - @effect/platform@0.58.0 - - @effect/rpc@0.31.0 - - @effect/schema@0.68.4 - -## 0.0.4 - -### Patch Changes - -- Updated dependencies [[`3ba7ea1`](https://github.com/Effect-TS/effect/commit/3ba7ea1c3c2923e85bf2f17e41176f8f8796d203)]: - - @effect/platform@0.57.8 - - @effect/platform-node@0.51.17 - - @effect/rpc@0.30.52 - -## 0.0.3 - -### Patch Changes - -- Updated dependencies [[`d473800`](https://github.com/Effect-TS/effect/commit/d47380012c3241d7287b66968d33a2414275ce7b)]: - - @effect/schema@0.68.3 - - @effect/platform@0.57.7 - - @effect/platform-node@0.51.16 - - @effect/rpc@0.30.51 - -## 0.0.2 - -### Patch Changes - -- Updated dependencies [[`eb341b3`](https://github.com/Effect-TS/effect/commit/eb341b3eb34ad64499371bc08b7f59e429979d8a)]: - - @effect/schema@0.68.2 - - @effect/platform@0.57.6 - - @effect/platform-node@0.51.15 - - @effect/rpc@0.30.50 diff --git a/packages/cluster-node/LICENSE b/packages/cluster-node/LICENSE deleted file mode 100644 index 7f6fe480f77..00000000000 --- a/packages/cluster-node/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -MIT License - -Copyright (c) 2023-present The Contributors - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/packages/cluster-node/README.md b/packages/cluster-node/README.md deleted file mode 100644 index 41b8da3276d..00000000000 --- a/packages/cluster-node/README.md +++ /dev/null @@ -1,5 +0,0 @@ -# `@effect/cluster-node` - -## Documentation - -- **API Reference**: [View the full documentation](https://effect-ts.github.io/effect/docs/cluster-node). diff --git a/packages/cluster-node/docgen.json b/packages/cluster-node/docgen.json deleted file mode 100644 index b437ce438ff..00000000000 --- a/packages/cluster-node/docgen.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "$schema": "../../node_modules/@effect/docgen/schema.json", - "srcLink": "https://github.com/Effect-TS/effect/tree/main/packages/cluster-node/src/", - "exclude": [ - "src/internal/**/*.ts" - ] -} diff --git a/packages/cluster-node/examples/sample-common.ts b/packages/cluster-node/examples/sample-common.ts deleted file mode 100644 index 1b2928f94bf..00000000000 --- a/packages/cluster-node/examples/sample-common.ts +++ /dev/null @@ -1,28 +0,0 @@ -import * as Message from "@effect/cluster/Message" -import * as RecipientType from "@effect/cluster/RecipientType" -import * as Schema from "effect/Schema" - -export class GetCurrent extends Message.TaggedMessage()("GetCurrent", Schema.Never, Schema.Number, { - messageId: Schema.String -}, (_) => _.messageId) { -} - -export class Increment extends Message.TaggedMessage()("Increment", Schema.Never, Schema.Void, { - messageId: Schema.String -}, (_) => _.messageId) { -} - -export class Decrement extends Message.TaggedMessage()("Decrement", Schema.Never, Schema.Void, { - messageId: Schema.String -}, (_) => _.messageId) { -} - -export const CounterMsg = Schema.Union( - Increment, - Decrement, - GetCurrent -) - -export type CounterMsg = Schema.Schema.Type - -export const CounterEntity = RecipientType.makeEntityType("Counter", CounterMsg) diff --git a/packages/cluster-node/examples/sample-connect.ts b/packages/cluster-node/examples/sample-connect.ts deleted file mode 100644 index 3aad0b4a602..00000000000 --- a/packages/cluster-node/examples/sample-connect.ts +++ /dev/null @@ -1,69 +0,0 @@ -import * as PodsRpc from "@effect/cluster-node/PodsRpc" -import type * as ShardingServiceRpc from "@effect/cluster-node/ShardingServiceRpc" -import * as ShardManagerClientRpc from "@effect/cluster-node/ShardManagerClientRpc" -import * as StorageFile from "@effect/cluster-node/StorageFile" -import * as Serialization from "@effect/cluster/Serialization" -import * as Sharding from "@effect/cluster/Sharding" -import * as ShardingConfig from "@effect/cluster/ShardingConfig" -import { HttpClient, HttpClientRequest } from "@effect/platform" -import { NodeHttpClient, NodeRuntime } from "@effect/platform-node" -import { RpcResolver } from "@effect/rpc" -import { HttpRpcResolver } from "@effect/rpc-http" -import { Effect, Layer, Logger, LogLevel, Ref } from "effect" -import { CounterEntity, GetCurrent, Increment } from "./sample-common.js" - -const liveLayer = Effect.gen(function*() { - const messenger = yield* Sharding.messenger(CounterEntity) - const idRef = yield* Ref.make(0) - - while (true) { - const id = yield* Ref.getAndUpdate(idRef, (_) => _ + 1) - const entityId = `entity-${id % 10}` - - yield* messenger.sendDiscard(entityId)(new Increment({ messageId: `increment-${id}` })) - const result = yield* messenger.send(entityId)(new GetCurrent({ messageId: `get-count-${id}` })) - yield* Effect.logInfo(`Counter ${entityId} is now: ${result}`) - - yield* Effect.sleep(200) - } -}).pipe( - Layer.effectDiscard, - Layer.provide(Sharding.live), - Layer.provide(StorageFile.storageFile), - Layer.provide(Layer.unwrapEffect(Effect.gen(function*() { - const client = yield* HttpClient.HttpClient - return PodsRpc.podsRpc((podAddress) => - HttpRpcResolver.make( - client.pipe( - HttpClient.filterStatusOk, - HttpClient.mapRequest( - HttpClientRequest.prependUrl(`http://${podAddress.host}:${podAddress.port}/api/rest`) - ) - ) - ).pipe(RpcResolver.toClient) - ) - }))), - Layer.provide(Layer.unwrapEffect(Effect.gen(function*() { - const client = yield* HttpClient.HttpClient - return ShardManagerClientRpc.shardManagerClientRpc( - (shardManagerUri) => - HttpRpcResolver.make( - client.pipe( - HttpClient.filterStatusOk, - HttpClient.mapRequest( - HttpClientRequest.prependUrl(shardManagerUri) - ) - ) - ).pipe(RpcResolver.toClient) - ) - }))), - Layer.provide(ShardingConfig.withDefaults({ shardingPort: 54322 })), - Layer.provide(Serialization.json), - Layer.provide(NodeHttpClient.layerUndici) -) - -Layer.launch(liveLayer).pipe( - Logger.withMinimumLogLevel(LogLevel.All), - Effect.tapErrorCause(Effect.logError), - NodeRuntime.runMain -) diff --git a/packages/cluster-node/examples/sample-manager.ts b/packages/cluster-node/examples/sample-manager.ts deleted file mode 100644 index 571da95ae60..00000000000 --- a/packages/cluster-node/examples/sample-manager.ts +++ /dev/null @@ -1,65 +0,0 @@ -import * as PodsRpc from "@effect/cluster-node/PodsRpc" -import type * as ShardingServiceRpc from "@effect/cluster-node/ShardingServiceRpc" -import * as ShardManagerServiceRpc from "@effect/cluster-node/ShardManagerServiceRpc" -import * as StorageFile from "@effect/cluster-node/StorageFile" -import * as ManagerConfig from "@effect/cluster/ManagerConfig" -import * as PodsHealth from "@effect/cluster/PodsHealth" -import * as ShardManager from "@effect/cluster/ShardManager" -import { - FetchHttpClient, - HttpClient, - HttpClientRequest, - HttpMiddleware, - HttpRouter, - HttpServer -} from "@effect/platform" -import { NodeHttpServer, NodeRuntime } from "@effect/platform-node" -import { RpcResolver } from "@effect/rpc" -import { HttpRpcResolver, HttpRpcRouter } from "@effect/rpc-http" -import { Context, Effect, Layer, Logger, LogLevel } from "effect" -import { createServer } from "node:http" - -const HttpLive = Layer.flatMap( - Layer.effect(ManagerConfig.ManagerConfig, ManagerConfig.ManagerConfig), - (config) => - HttpRouter.empty.pipe( - HttpRouter.post("/api/rest", HttpRpcRouter.toHttpApp(ShardManagerServiceRpc.router)), - HttpServer.serve(HttpMiddleware.logger), - HttpServer.withLogAddress, - Layer.provide( - NodeHttpServer.layer(createServer, { - port: Context.get(config, ManagerConfig.ManagerConfig).apiPort - }) - ), - Layer.discard - ) -) - -const liveShardingManager = Effect.never.pipe( - Layer.scopedDiscard, - Layer.provide(HttpLive), - Layer.provide(ShardManager.live), - Layer.provide(StorageFile.storageFile), - Layer.provide(PodsHealth.local), - Layer.provide(Layer.unwrapEffect(Effect.gen(function*() { - const client = yield* HttpClient.HttpClient - return PodsRpc.podsRpc((podAddress) => - HttpRpcResolver.make( - client.pipe( - HttpClient.filterStatusOk, - HttpClient.mapRequest( - HttpClientRequest.prependUrl(`http://${podAddress.host}:${podAddress.port}/api/rest`) - ) - ) - ).pipe(RpcResolver.toClient) - ) - }))), - Layer.provide(ManagerConfig.fromConfig), - Layer.provide(FetchHttpClient.layer) -) - -Layer.launch(liveShardingManager).pipe( - Logger.withMinimumLogLevel(LogLevel.All), - Effect.tapErrorCause(Effect.logError), - NodeRuntime.runMain -) diff --git a/packages/cluster-node/examples/sample-shard.ts b/packages/cluster-node/examples/sample-shard.ts deleted file mode 100644 index 3bbfc38da32..00000000000 --- a/packages/cluster-node/examples/sample-shard.ts +++ /dev/null @@ -1,101 +0,0 @@ -import * as PodsRpc from "@effect/cluster-node/PodsRpc" -import * as ShardingServiceRpc from "@effect/cluster-node/ShardingServiceRpc" -import * as ShardManagerClientRpc from "@effect/cluster-node/ShardManagerClientRpc" -import * as StorageFile from "@effect/cluster-node/StorageFile" -import * as MessageState from "@effect/cluster/MessageState" -import * as RecipientBehaviour from "@effect/cluster/RecipientBehaviour" -import * as Serialization from "@effect/cluster/Serialization" -import * as Sharding from "@effect/cluster/Sharding" -import * as ShardingConfig from "@effect/cluster/ShardingConfig" -import { HttpClient, HttpClientRequest, HttpMiddleware, HttpRouter, HttpServer } from "@effect/platform" -import { NodeHttpClient, NodeHttpServer, NodeRuntime } from "@effect/platform-node" -import { RpcResolver } from "@effect/rpc" -import { HttpRpcResolver, HttpRpcRouter } from "@effect/rpc-http" -import { Context, Effect, Exit, Layer, Logger, LogLevel, Ref } from "effect" -import { createServer } from "node:http" -import { CounterEntity } from "./sample-common.js" - -const HttpLive = Layer.flatMap( - Layer.effect(ShardingConfig.ShardingConfig, ShardingConfig.ShardingConfig), - (config) => - HttpRouter.empty.pipe( - HttpRouter.post("/api/rest", HttpRpcRouter.toHttpApp(ShardingServiceRpc.router)), - HttpServer.serve(HttpMiddleware.logger), - HttpServer.withLogAddress, - Layer.provide( - NodeHttpServer.layer(createServer, { - port: Context.get(config, ShardingConfig.ShardingConfig).shardingPort - }) - ), - Layer.discard - ) -) - -const liveLayer = Sharding.registerEntity( - CounterEntity -)( - RecipientBehaviour.fromFunctionEffectStateful( - () => Effect.succeed(0), - (entityId, message, stateRef) => { - switch (message._tag) { - case "Increment": - return Ref.update(stateRef, (count) => count + 1).pipe( - Effect.zipLeft(Effect.logInfo(`Counter ${entityId} incremented`)), - Effect.as(MessageState.Processed(Exit.void)) - ) - case "Decrement": - return Ref.update(stateRef, (count) => count - 1).pipe( - Effect.zipLeft(Effect.logInfo(`Counter ${entityId} decremented`)), - Effect.as(MessageState.Processed(Exit.void)) - ) - case "GetCurrent": - return Ref.get(stateRef).pipe( - Effect.exit, - Effect.map((result) => MessageState.Processed(result)) - ) - } - } - ) -).pipe( - Effect.zipRight(Sharding.registerScoped), - Layer.scopedDiscard, - Layer.provide(HttpLive), - Layer.provideMerge(Sharding.live), - Layer.provide(StorageFile.storageFile), - Layer.provide(Layer.unwrapEffect(Effect.gen(function*() { - const client = yield* HttpClient.HttpClient - return PodsRpc.podsRpc((podAddress) => - HttpRpcResolver.make( - client.pipe( - HttpClient.filterStatusOk, - HttpClient.mapRequest( - HttpClientRequest.prependUrl(`http://${podAddress.host}:${podAddress.port}/api/rest`) - ) - ) - ).pipe(RpcResolver.toClient) - ) - }))), - Layer.provide(Layer.unwrapEffect(Effect.gen(function*() { - const client = yield* HttpClient.HttpClient - return ShardManagerClientRpc.shardManagerClientRpc( - (shardManagerUri) => - HttpRpcResolver.make( - client.pipe( - HttpClient.filterStatusOk, - HttpClient.mapRequest( - HttpClientRequest.prependUrl(shardManagerUri) - ) - ) - ).pipe(RpcResolver.toClient) - ) - }))), - Layer.provide(Serialization.json), - Layer.provide(NodeHttpClient.layerUndici), - Layer.provide(ShardingConfig.fromConfig) -) - -Layer.launch(liveLayer).pipe( - Logger.withMinimumLogLevel(LogLevel.Debug), - Effect.tapErrorCause(Effect.logError), - NodeRuntime.runMain -) diff --git a/packages/cluster-node/package.json b/packages/cluster-node/package.json deleted file mode 100644 index fed2d44d8d0..00000000000 --- a/packages/cluster-node/package.json +++ /dev/null @@ -1,40 +0,0 @@ -{ - "name": "@effect/cluster-node", - "type": "module", - "version": "0.29.3", - "description": "Unified interfaces for common cluster-node-specific services", - "publishConfig": { - "access": "public", - "directory": "dist", - "provenance": true - }, - "repository": { - "type": "git", - "url": "https://github.com/Effect-TS/effect.git", - "directory": "packages/cluster-node" - }, - "homepage": "https://effect.website", - "license": "MIT", - "scripts": { - "codegen": "build-utils prepare-v2", - "build": "pnpm build-esm && pnpm build-annotate && pnpm build-cjs && build-utils pack-v2", - "build-esm": "tsc -b tsconfig.build.json", - "build-cjs": "babel build/esm --plugins @babel/transform-export-namespace-from --plugins @babel/transform-modules-commonjs --out-dir build/cjs --source-maps", - "build-annotate": "babel build/esm --plugins annotate-pure-calls --out-dir build/esm --source-maps", - "check": "tsc -b tsconfig.json", - "test": "vitest", - "coverage": "vitest --coverage" - }, - "peerDependencies": { - "@effect/cluster": "workspace:^", - "@effect/rpc": "workspace:^", - "effect": "workspace:^" - }, - "devDependencies": { - "@effect/platform": "workspace:^", - "@effect/platform-node": "workspace:^", - "@effect/rpc": "workspace:^", - "@effect/rpc-http": "workspace:^", - "effect": "workspace:^" - } -} diff --git a/packages/cluster-node/src/PodsRpc.ts b/packages/cluster-node/src/PodsRpc.ts deleted file mode 100644 index 06fce51aee3..00000000000 --- a/packages/cluster-node/src/PodsRpc.ts +++ /dev/null @@ -1,94 +0,0 @@ -/** - * @since 1.0.0 - */ -import type * as PodAddress from "@effect/cluster/PodAddress" -import * as Pods from "@effect/cluster/Pods" -import type * as SerializedEnvelope from "@effect/cluster/SerializedEnvelope" -import type * as ShardId from "@effect/cluster/ShardId" -import * as ShardingException from "@effect/cluster/ShardingException" -import type * as Rpc from "@effect/rpc/Rpc" -import type * as RpcResolver from "@effect/rpc/RpcResolver" -import * as Effect from "effect/Effect" -import { pipe } from "effect/Function" -import type * as HashSet from "effect/HashSet" -import * as Layer from "effect/Layer" -import type * as RequestResolver from "effect/RequestResolver" -import * as ShardingProtocol from "./ShardingProtocol.js" -import type * as ShardingServiceRpc from "./ShardingServiceRpc.js" - -/** - * Given a function that resolves an RPC client, constructs a Pods service that uses RPC to communicate - * @since 1.0.0 - * @category layers - */ - -export function podsRpc( - buildClient: ( - podAddress: PodAddress.PodAddress - ) => RpcResolver.Client< - RequestResolver.RequestResolver, never> - > -): Layer.Layer { - return Layer.effect(Pods.Pods)( - Effect.gen(function*() { - const env = yield* Effect.context() - - function assignShards(podAddress: PodAddress.PodAddress, shards: HashSet.HashSet) { - return buildClient(podAddress)(new ShardingProtocol.AssignShards({ shards })).pipe( - Effect.provide(env), - Effect.catchAllDefect((e) => - pipe( - Effect.logError(e), - Effect.zipRight(Effect.fail(new ShardingException.PodUnavailableException({ podAddress }))) - ) - ) - ) - } - - function unassignShards(podAddress: PodAddress.PodAddress, shards: HashSet.HashSet) { - return buildClient(podAddress)(new ShardingProtocol.UnassignShards({ shards })).pipe( - Effect.provide(env), - Effect.catchAllDefect((e) => - pipe( - Effect.logError(e), - Effect.zipRight(Effect.fail(new ShardingException.PodUnavailableException({ podAddress }))) - ) - ) - ) - } - - function ping(podAddress: PodAddress.PodAddress) { - return buildClient(podAddress)(new ShardingProtocol.PingShard()).pipe( - Effect.provide(env), - Effect.catchAllCause((e) => - pipe( - Effect.logError(e), - Effect.zipRight( - Effect.fail(new ShardingException.PodUnavailableException({ podAddress })) - ) - ) - ) - ) - } - - function sendAndGetState(podAddress: PodAddress.PodAddress, envelope: SerializedEnvelope.SerializedEnvelope) { - return buildClient(podAddress)(new ShardingProtocol.Send({ envelope })).pipe( - Effect.provide(env), - Effect.catchAllDefect((e) => - pipe( - Effect.logError(e), - Effect.zipRight(Effect.fail(new ShardingException.PodUnavailableException({ podAddress }))) - ) - ) - ) - } - - return Pods.make({ - assignShards, - unassignShards, - ping, - sendAndGetState - }) - }) - ) -} diff --git a/packages/cluster-node/src/ShardManagerClientRpc.ts b/packages/cluster-node/src/ShardManagerClientRpc.ts deleted file mode 100644 index 959741eec99..00000000000 --- a/packages/cluster-node/src/ShardManagerClientRpc.ts +++ /dev/null @@ -1,39 +0,0 @@ -/** - * @since 1.0.0 - */ -import * as Pod from "@effect/cluster/Pod" -import * as ShardingConfig from "@effect/cluster/ShardingConfig" -import * as ShardManagerClient from "@effect/cluster/ShardManagerClient" -import type * as Rpc from "@effect/rpc/Rpc" -import type * as RpcResolver from "@effect/rpc/RpcResolver" -import * as Effect from "effect/Effect" -import * as Layer from "effect/Layer" -import type * as RequestResolver from "effect/RequestResolver" -import * as ShardManagerProtocol from "./ShardManagerProtocol.js" -import type * as ShardManagerServiceRpc from "./ShardManagerServiceRpc.js" - -/** - * @since 1.0.0 - * @category layer - */ -export function shardManagerClientRpc( - makeClient: (shardManagerUri: string) => RpcResolver.Client< - RequestResolver.RequestResolver, never> - > -) { - return Layer.effect( - ShardManagerClient.ShardManagerClient, - Effect.gen(function*() { - const config = yield* ShardingConfig.ShardingConfig - const client = makeClient(config.shardManagerUri) - - return ShardManagerClient.make({ - register: (podAddress) => - client(new ShardManagerProtocol.Register({ pod: Pod.make(podAddress, config.serverVersion) })), - unregister: (podAddress) => client(new ShardManagerProtocol.Unregister({ podAddress })), - notifyUnhealthyPod: (podAddress) => client(new ShardManagerProtocol.NotifyUnhealthyPod({ podAddress })), - getAssignments: client(new ShardManagerProtocol.GetAssignements()) - }) - }) - ) -} diff --git a/packages/cluster-node/src/ShardManagerProtocol.ts b/packages/cluster-node/src/ShardManagerProtocol.ts deleted file mode 100644 index d48edf88468..00000000000 --- a/packages/cluster-node/src/ShardManagerProtocol.ts +++ /dev/null @@ -1,68 +0,0 @@ -/** - * @since 1.0.0 - */ -import * as Pod from "@effect/cluster/Pod" -import * as PodAddress from "@effect/cluster/PodAddress" -import * as ShardId from "@effect/cluster/ShardId" -import * as Schema from "effect/Schema" - -/** - * @since 1.0.0 - * @category schema - */ -export class Register extends Schema.TaggedRequest()( - "@effect/cluster-node/ShardManagerProtocolRpc/Register", - { - failure: Schema.Never, - success: Schema.Void, - payload: { - pod: Pod.schema - } - } -) {} - -/** - * @since 1.0.0 - * @category schema - */ -export class Unregister extends Schema.TaggedRequest()( - "@effect/cluster-node/ShardManagerProtocolRpc/Unregister", - { - failure: Schema.Never, - success: Schema.Void, - payload: { - podAddress: PodAddress.schema - } - } -) {} - -/** - * @since 1.0.0 - * @category schema - */ -export class NotifyUnhealthyPod extends Schema.TaggedRequest()( - "@effect/cluster-node/ShardManagerProtocolRpc/NotifyUnhealthyPod", - { - failure: Schema.Never, - success: Schema.Void, - payload: { - podAddress: PodAddress.schema - } - } -) {} - -/** - * @since 1.0.0 - * @category schema - */ -export class GetAssignements extends Schema.TaggedRequest()( - "@effect/cluster-node/ShardManagerProtocolRpc/GetAssignements", - { - failure: Schema.Never, - success: Schema.HashMap({ - key: ShardId.schema, - value: Schema.Option(PodAddress.schema) - }), - payload: {} - } -) {} diff --git a/packages/cluster-node/src/ShardManagerServiceRpc.ts b/packages/cluster-node/src/ShardManagerServiceRpc.ts deleted file mode 100644 index d4e9aa9c411..00000000000 --- a/packages/cluster-node/src/ShardManagerServiceRpc.ts +++ /dev/null @@ -1,48 +0,0 @@ -/** - * @since 1.0.0 - */ -import * as ShardManager from "@effect/cluster/ShardManager" -import * as Rpc from "@effect/rpc/Rpc" -import * as RpcRouter from "@effect/rpc/RpcRouter" -import * as Effect from "effect/Effect" -import { pipe } from "effect/Function" -import * as ShardManagerProtocolHttp from "./ShardManagerProtocol.js" - -/** - * @since 1.0.0 - * @category rpc - */ -export const router = RpcRouter.make( - Rpc.effect(ShardManagerProtocolHttp.Register, (request) => - pipe( - ShardManager.ShardManager, - Effect.flatMap((shardManager) => shardManager.register(request.pod)) - )), - Rpc.effect(ShardManagerProtocolHttp.Unregister, (request) => - pipe( - ShardManager.ShardManager, - Effect.flatMap((shardManager) => shardManager.unregister(request.podAddress)) - )), - Rpc.effect(ShardManagerProtocolHttp.NotifyUnhealthyPod, (request) => - pipe( - ShardManager.ShardManager, - Effect.flatMap((shardManager) => shardManager.notifyUnhealthyPod(request.podAddress)) - )), - Rpc.effect(ShardManagerProtocolHttp.GetAssignements, () => - pipe( - ShardManager.ShardManager, - Effect.flatMap((shardManager) => shardManager.getAssignments) - )) -) - -/** - * @since 1.0.0 - * @category models - */ -export type ShardManagerServiceRpc = typeof router - -/** - * @since 1.0.0 - * @category models - */ -export type ShardManagerServiceRpcRequest = RpcRouter.RpcRouter.Request diff --git a/packages/cluster-node/src/ShardingProtocol.ts b/packages/cluster-node/src/ShardingProtocol.ts deleted file mode 100644 index 8ce4de0c495..00000000000 --- a/packages/cluster-node/src/ShardingProtocol.ts +++ /dev/null @@ -1,65 +0,0 @@ -/** - * @since 1.0.0 - */ -import * as MessageState from "@effect/cluster/MessageState" -import * as SerializedEnvelope from "@effect/cluster/SerializedEnvelope" -import * as SerializedMessage from "@effect/cluster/SerializedMessage" -import * as ShardId from "@effect/cluster/ShardId" -import * as ShardingException from "@effect/cluster/ShardingException" -import * as Schema from "effect/Schema" - -/** - * @since 1.0.0 - * @category schema - */ -export class AssignShards extends Schema.TaggedRequest()( - "@effect/cluster-node/ShardingProtocol/AssignShards", - { - failure: Schema.Never, - success: Schema.Void, - payload: { - shards: Schema.HashSet(ShardId.schema) - } - } -) { -} - -/** - * @since 1.0.0 - * @category schema - */ -export class UnassignShards extends Schema.TaggedRequest()( - "@effect/cluster-node/ShardingProtocol/UnassignShards", - { - failure: Schema.Never, - success: Schema.Void, - payload: { - shards: Schema.HashSet(ShardId.schema) - } - } -) { -} - -/** - * @since 1.0.0 - * @category schema - */ -export class Send extends Schema.TaggedRequest()( - "@effect/cluster-node/ShardingProtocol/Send", - { - failure: ShardingException.schema, - success: MessageState.schema(SerializedMessage.schema), - payload: { - envelope: SerializedEnvelope.schema - } - } -) {} - -/** - * @since 1.0.0 - * @category schema - */ -export class PingShard extends Schema.TaggedRequest()( - "@effect/cluster-node/ShardingProtocol/PingShard", - { failure: Schema.Never, success: Schema.Boolean, payload: {} } -) {} diff --git a/packages/cluster-node/src/ShardingServiceRpc.ts b/packages/cluster-node/src/ShardingServiceRpc.ts deleted file mode 100644 index bd9d37e6571..00000000000 --- a/packages/cluster-node/src/ShardingServiceRpc.ts +++ /dev/null @@ -1,44 +0,0 @@ -/** - * @since 1.0.0 - */ -import * as Sharding from "@effect/cluster/Sharding" -import * as Rpc from "@effect/rpc/Rpc" -import * as RpcRouter from "@effect/rpc/RpcRouter" -import * as Effect from "effect/Effect" -import { pipe } from "effect/Function" -import * as ShardingProtocol from "./ShardingProtocol.js" - -/** - * @since 1.0.0 - * @category rpc - */ -export const router = RpcRouter.make( - Rpc.effect(ShardingProtocol.AssignShards, (request) => - pipe( - Sharding.Tag, - Effect.flatMap((sharding) => sharding.assign(request.shards)) - )), - Rpc.effect(ShardingProtocol.UnassignShards, (request) => - pipe( - Sharding.Tag, - Effect.flatMap((sharding) => sharding.unassign(request.shards)) - )), - Rpc.effect(ShardingProtocol.PingShard, () => Effect.succeed(true)), - Rpc.effect(ShardingProtocol.Send, (request) => - pipe( - Sharding.Tag, - Effect.flatMap((sharding) => sharding.sendMessageToLocalEntityManagerWithoutRetries(request.envelope)) - )) -) - -/** - * @since 1.0.0 - * @category models - */ -export type ShardingServiceRpc = typeof router - -/** - * @since 1.0.0 - * @category models - */ -export type ShardingServiceRpcRequest = RpcRouter.RpcRouter.Request diff --git a/packages/cluster-node/src/StorageFile.ts b/packages/cluster-node/src/StorageFile.ts deleted file mode 100644 index 67ab6257998..00000000000 --- a/packages/cluster-node/src/StorageFile.ts +++ /dev/null @@ -1,143 +0,0 @@ -/** - * @since 1.0.0 - */ -import * as Pod from "@effect/cluster/Pod" -import * as PodAddress from "@effect/cluster/PodAddress" -import * as ShardId from "@effect/cluster/ShardId" -import * as ShardingException from "@effect/cluster/ShardingException" -import * as Storage from "@effect/cluster/Storage" -import * as Effect from "effect/Effect" -import { pipe } from "effect/Function" -import * as HashMap from "effect/HashMap" -import * as Layer from "effect/Layer" -import type * as Option from "effect/Option" -import * as ParseResult from "effect/ParseResult" -import * as Queue from "effect/Queue" -import * as Schema from "effect/Schema" -import * as Stream from "effect/Stream" -import * as fs from "node:fs" - -/** @internal */ -export function jsonStringify(value: A, schema: Schema.Schema) { - return pipe( - value, - ParseResult.encode(schema), - Effect.mapError((issue) => - new ShardingException.SerializationException({ error: ParseResult.TreeFormatter.formatIssue(issue) }) - ), - Effect.map((_) => JSON.stringify(_)) - ) -} - -/** @internal */ -export function jsonParse(value: string, schema: Schema.Schema) { - return pipe( - Effect.sync(() => JSON.parse(value)), - Effect.flatMap(ParseResult.decode(schema)), - Effect.mapError((issue) => - new ShardingException.SerializationException({ error: ParseResult.TreeFormatter.formatIssue(issue) }) - ) - ) -} - -const PODS_FILE = "pods.json" -const ASSIGNMENTS_FILE = "assignments.json" - -const AssignmentsSchema = Schema.Array( - Schema.Tuple(ShardId.schema, Schema.OptionFromNullOr(PodAddress.schema)) -) - -const PodsSchema = Schema.Array(Schema.Tuple(PodAddress.schema, Pod.schema)) - -function writeJsonData(fileName: string, schema: Schema.Schema, data: A) { - return pipe( - jsonStringify(data, schema), - Effect.flatMap((data) => Effect.sync(() => fs.writeFileSync(fileName, data))), - Effect.orDie - ) -} - -function readJsonData(fileName: string, schema: Schema.Schema, empty: A) { - return pipe( - Effect.sync(() => fs.existsSync(fileName)), - Effect.flatMap((exists) => - exists - ? pipe( - Effect.sync(() => fs.readFileSync(fileName)), - Effect.flatMap((data) => jsonParse(data.toString(), schema)) - ) - : Effect.succeed(empty) - ), - Effect.orDie - ) -} - -const getAssignments: Effect.Effect>> = pipe( - readJsonData(ASSIGNMENTS_FILE, AssignmentsSchema, []), - Effect.map(HashMap.fromIterable) -) - -function saveAssignments( - assignments: HashMap.HashMap> -): Effect.Effect { - return writeJsonData(ASSIGNMENTS_FILE, AssignmentsSchema, Array.from(assignments)) -} - -const getPods: Effect.Effect> = pipe( - readJsonData(PODS_FILE, PodsSchema, []), - Effect.map(HashMap.fromIterable) -) - -function savePods( - pods: HashMap.HashMap -): Effect.Effect { - return writeJsonData("pods.json", PodsSchema, Array.from(pods)) -} - -/** - * A layer that stores data in-memory. - * This is useful for testing with a single pod only. - */ - -function getChangesStream(fileName: string) { - return pipe( - Queue.unbounded(), - Effect.flatMap((queue) => - pipe( - Effect.acquireRelease( - Effect.sync( - () => [fs.watchFile(fileName, () => Effect.runSync(queue.offer(true))), queue] as const - ), - ([watcher, queue]) => - Effect.zip( - queue.shutdown, - Effect.sync(() => watcher.unref()), - { concurrent: true } - ) - ), - Effect.map(([_, queue]) => Stream.fromQueue(queue)) - ) - ), - Stream.unwrapScoped - ) -} - -const assignmentsStream = pipe( - getChangesStream(ASSIGNMENTS_FILE), - Stream.mapEffect(() => getAssignments) -) - -/** - * @since 1.0.0 - * @category layers - */ -export const storageFile = Layer.scoped( - Storage.Storage, - Effect.succeed(Storage.make({ - getAssignments, - saveAssignments, - assignmentsStream, - getPods, - savePods - })) -) diff --git a/packages/cluster-node/src/index.ts b/packages/cluster-node/src/index.ts deleted file mode 100644 index d96a937eaee..00000000000 --- a/packages/cluster-node/src/index.ts +++ /dev/null @@ -1,34 +0,0 @@ -/** - * @since 1.0.0 - */ -export * as PodsRpc from "./PodsRpc.js" - -/** - * @since 1.0.0 - */ -export * as ShardManagerClientRpc from "./ShardManagerClientRpc.js" - -/** - * @since 1.0.0 - */ -export * as ShardManagerProtocol from "./ShardManagerProtocol.js" - -/** - * @since 1.0.0 - */ -export * as ShardManagerServiceRpc from "./ShardManagerServiceRpc.js" - -/** - * @since 1.0.0 - */ -export * as ShardingProtocol from "./ShardingProtocol.js" - -/** - * @since 1.0.0 - */ -export * as ShardingServiceRpc from "./ShardingServiceRpc.js" - -/** - * @since 1.0.0 - */ -export * as StorageFile from "./StorageFile.js" diff --git a/packages/cluster-node/tsconfig.build.json b/packages/cluster-node/tsconfig.build.json deleted file mode 100644 index 8b1286c662e..00000000000 --- a/packages/cluster-node/tsconfig.build.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "extends": "./tsconfig.src.json", - "references": [ - { "path": "../effect/tsconfig.build.json" }, - { "path": "../cluster/tsconfig.build.json" }, - { "path": "../rpc/tsconfig.build.json" } - ], - "compilerOptions": { - "types": ["node"], - "tsBuildInfoFile": ".tsbuildinfo/build.tsbuildinfo", - "outDir": "build/esm", - "declarationDir": "build/dts", - "stripInternal": true - } -} diff --git a/packages/cluster-node/tsconfig.examples.json b/packages/cluster-node/tsconfig.examples.json deleted file mode 100644 index c2399082336..00000000000 --- a/packages/cluster-node/tsconfig.examples.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "extends": "../../tsconfig.base.json", - "include": ["examples"], - "references": [ - { "path": "tsconfig.src.json" }, - { "path": "../rpc-http/tsconfig.src.json" }, - { "path": "../platform-node/tsconfig.src.json" } - ], - "compilerOptions": { - "types": ["node"], - "tsBuildInfoFile": ".tsbuildinfo/examples.tsbuildinfo", - "rootDir": "examples", - "noEmit": true - } -} diff --git a/packages/cluster-node/tsconfig.json b/packages/cluster-node/tsconfig.json deleted file mode 100644 index 3edbf6b8a56..00000000000 --- a/packages/cluster-node/tsconfig.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "extends": "../../tsconfig.base.json", - "include": [], - "references": [ - { "path": "tsconfig.src.json" }, - { "path": "tsconfig.test.json" }, - { "path": "tsconfig.examples.json" } - ] -} diff --git a/packages/cluster-node/tsconfig.src.json b/packages/cluster-node/tsconfig.src.json deleted file mode 100644 index ddcb3a4103e..00000000000 --- a/packages/cluster-node/tsconfig.src.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "extends": "../../tsconfig.base.json", - "include": ["src"], - "references": [ - { "path": "../effect/tsconfig.src.json" }, - { "path": "../cluster/tsconfig.src.json" }, - { "path": "../rpc/tsconfig.src.json" } - ], - "compilerOptions": { - "types": ["node"], - "tsBuildInfoFile": ".tsbuildinfo/src.tsbuildinfo", - "rootDir": "src", - "outDir": "build/src" - } -} diff --git a/packages/cluster-node/tsconfig.test.json b/packages/cluster-node/tsconfig.test.json deleted file mode 100644 index a8deae274fd..00000000000 --- a/packages/cluster-node/tsconfig.test.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "extends": "../../tsconfig.base.json", - "include": ["test"], - "references": [ - { "path": "tsconfig.src.json" }, - { "path": "../vitest/tsconfig.src.json" } - ], - "compilerOptions": { - "types": ["node"], - "tsBuildInfoFile": ".tsbuildinfo/test.tsbuildinfo", - "rootDir": "test", - "noEmit": true - } -} diff --git a/packages/cluster-node/vitest.config.ts b/packages/cluster-node/vitest.config.ts deleted file mode 100644 index 578d0667249..00000000000 --- a/packages/cluster-node/vitest.config.ts +++ /dev/null @@ -1,6 +0,0 @@ -import { mergeConfig, type ViteUserConfig } from "vitest/config" -import shared from "../../vitest.shared.js" - -const config: ViteUserConfig = {} - -export default mergeConfig(shared, config) diff --git a/packages/effect/src/internal/channel/channelExecutor.ts b/packages/effect/src/internal/channel/channelExecutor.ts index 047147ac01c..570c6e1d559 100644 --- a/packages/effect/src/internal/channel/channelExecutor.ts +++ b/packages/effect/src/internal/channel/channelExecutor.ts @@ -7,7 +7,9 @@ import * as Effect from "../../Effect.js" import * as ExecutionStrategy from "../../ExecutionStrategy.js" import * as Exit from "../../Exit.js" import * as Fiber from "../../Fiber.js" +import * as FiberId from "../../FiberId.js" import { dual, identity, pipe } from "../../Function.js" +import * as HashSet from "../../HashSet.js" import * as Option from "../../Option.js" import * as Scope from "../../Scope.js" import type * as UpstreamPullStrategy from "../../UpstreamPullStrategy.js" @@ -1143,8 +1145,9 @@ export const runIn = dual< restore(run(channelDeferred, scopeDeferred, child)).pipe( Effect.forkIn(scope), Effect.flatMap((fiber) => - scope.addFinalizer(() => - Deferred.isDone(channelDeferred).pipe( + scope.addFinalizer((exit) => { + const interruptors = Exit.isFailure(exit) ? Cause.interruptors(exit.cause) : undefined + return Deferred.isDone(channelDeferred).pipe( Effect.flatMap((isDone) => isDone ? Deferred.succeed(scopeDeferred, void 0).pipe( @@ -1152,12 +1155,16 @@ export const runIn = dual< Effect.zipRight(Fiber.inheritAll(fiber)) ) : Deferred.succeed(scopeDeferred, void 0).pipe( - Effect.zipRight(Fiber.interrupt(fiber)), + Effect.zipRight( + interruptors && HashSet.size(interruptors) > 0 + ? Fiber.interruptAs(fiber, FiberId.combineAll(interruptors)) + : Fiber.interrupt(fiber) + ), Effect.zipRight(Fiber.inheritAll(fiber)) ) ) ) - ).pipe(Effect.zipRight(restore(Deferred.await(channelDeferred)))) + }).pipe(Effect.zipRight(restore(Deferred.await(channelDeferred)))) ) ) )) diff --git a/packages/experimental/package.json b/packages/experimental/package.json index 1e722afe10c..9e91bc60f4b 100644 --- a/packages/experimental/package.json +++ b/packages/experimental/package.json @@ -39,7 +39,6 @@ "coverage": "vitest --coverage" }, "dependencies": { - "msgpackr": "^1.10.2", "uuid": "^11.0.3" }, "peerDependencies": { @@ -47,8 +46,7 @@ "@effect/platform-node": "workspace:^", "effect": "workspace:^", "ioredis": "^5", - "lmdb": "^3", - "ws": "^8" + "lmdb": "^3" }, "peerDependenciesMeta": { "@effect/platform-node": { @@ -59,18 +57,13 @@ }, "lmdb": { "optional": true - }, - "ws": { - "optional": true } }, "devDependencies": { "@cloudflare/workers-types": "^4.20240806.0", "@types/ws": "^8.5.12", "ioredis": "^5.4.1", - "lmdb": "^3.0.13", - "vitest-websocket-mock": "^0.4.0", - "ws": "^8.18.0" + "lmdb": "^3.0.13" }, "effect": { "generateExports": { diff --git a/packages/experimental/src/DevTools/Client.ts b/packages/experimental/src/DevTools/Client.ts index de8961b4207..1405b8048c3 100644 --- a/packages/experimental/src/DevTools/Client.ts +++ b/packages/experimental/src/DevTools/Client.ts @@ -1,6 +1,7 @@ /** * @since 1.0.0 */ +import * as Ndjson from "@effect/platform/Ndjson" import * as Socket from "@effect/platform/Socket" import * as Cause from "effect/Cause" import * as Context from "effect/Context" @@ -16,7 +17,6 @@ import * as Schedule from "effect/Schedule" import type * as Scope from "effect/Scope" import * as Stream from "effect/Stream" import * as Tracer from "effect/Tracer" -import * as Ndjson from "../Ndjson.js" import * as Domain from "./Domain.js" /** diff --git a/packages/experimental/src/DevTools/Server.ts b/packages/experimental/src/DevTools/Server.ts index a01fe63a884..92ef64beddf 100644 --- a/packages/experimental/src/DevTools/Server.ts +++ b/packages/experimental/src/DevTools/Server.ts @@ -1,12 +1,12 @@ /** * @since 1.0.0 */ +import * as Ndjson from "@effect/platform/Ndjson" import * as Socket from "@effect/platform/Socket" +import * as SocketServer from "@effect/platform/SocketServer" import * as Effect from "effect/Effect" import * as Mailbox from "effect/Mailbox" import * as Stream from "effect/Stream" -import * as Ndjson from "../Ndjson.js" -import * as SocketServer from "../SocketServer/Node.js" import * as Domain from "./Domain.js" /** @@ -22,36 +22,35 @@ export interface Client { * @since 1.0.0 * @category constructors */ -export const run = (handle: (client: Client) => Effect.Effect<_, E, R>) => - Effect.gen(function*() { - const server = yield* SocketServer.SocketServer - return yield* server.run((socket) => - Effect.gen(function*() { - const responses = yield* Mailbox.make() - const requests = yield* Mailbox.make() +export const run = Effect.fnUntraced(function*(handle: (client: Client) => Effect.Effect<_, E, R>) { + const server = yield* SocketServer.SocketServer + return yield* server.run((socket) => + Effect.gen(function*() { + const responses = yield* Mailbox.make() + const requests = yield* Mailbox.make() - const client: Client = { - queue: requests, - request: (res) => responses.offer(res) - } + const client: Client = { + queue: requests, + request: (res) => responses.offer(res) + } - yield* Mailbox.toStream(responses).pipe( - Stream.pipeThroughChannel( - Ndjson.duplexSchemaString(Socket.toChannelString(socket), { - inputSchema: Domain.Response, - outputSchema: Domain.Request - }) - ), - Stream.runForEach((req) => - req._tag === "Ping" - ? responses.offer({ _tag: "Pong" }) - : requests.offer(req) - ), - Effect.ensuring(Effect.zipRight(responses.shutdown, requests.shutdown)), - Effect.fork - ) + yield* Mailbox.toStream(responses).pipe( + Stream.pipeThroughChannel( + Ndjson.duplexSchemaString(Socket.toChannelString(socket), { + inputSchema: Domain.Response, + outputSchema: Domain.Request + }) + ), + Stream.runForEach((req) => + req._tag === "Ping" + ? responses.offer({ _tag: "Pong" }) + : requests.offer(req) + ), + Effect.ensuring(Effect.zipRight(responses.shutdown, requests.shutdown)), + Effect.fork + ) - yield* handle(client) - }) - ) - }) + yield* handle(client) + }) + ) +}) diff --git a/packages/experimental/src/Event.ts b/packages/experimental/src/Event.ts index b33e2b5ff21..4e325b56032 100644 --- a/packages/experimental/src/Event.ts +++ b/packages/experimental/src/Event.ts @@ -1,10 +1,10 @@ /** * @since 1.0.0 */ +import * as MsgPack from "@effect/platform/MsgPack" import { pipeArguments } from "effect/Pipeable" import * as Predicate from "effect/Predicate" import * as Schema from "effect/Schema" -import * as MsgPack from "./MsgPack.js" /** * @since 1.0.0 diff --git a/packages/experimental/src/EventJournal.ts b/packages/experimental/src/EventJournal.ts index 8eb4e273ea3..4126ff20e49 100644 --- a/packages/experimental/src/EventJournal.ts +++ b/packages/experimental/src/EventJournal.ts @@ -1,6 +1,7 @@ /** * @since 1.0.0 */ +import * as MsgPack from "@effect/platform/MsgPack" import * as Context from "effect/Context" import * as DateTime from "effect/DateTime" import * as Effect from "effect/Effect" @@ -10,7 +11,6 @@ import type * as Queue from "effect/Queue" import * as Schema from "effect/Schema" import type { Scope } from "effect/Scope" import * as Uuid from "uuid" -import * as MsgPack from "./MsgPack.js" /** * @since 1.0.0 diff --git a/packages/experimental/src/EventLogRemote.ts b/packages/experimental/src/EventLogRemote.ts index 4fe29dcf4ef..1522c79b4d6 100644 --- a/packages/experimental/src/EventLogRemote.ts +++ b/packages/experimental/src/EventLogRemote.ts @@ -1,6 +1,7 @@ /** * @since 1.0.0 */ +import * as MsgPack from "@effect/platform/MsgPack" import * as Socket from "@effect/platform/Socket" import * as Deferred from "effect/Deferred" import * as Effect from "effect/Effect" @@ -16,7 +17,6 @@ import { RemoteEntry, RemoteId } from "./EventJournal.js" import type { Identity } from "./EventLog.js" import { EventLog } from "./EventLog.js" import { EncryptedEntry, EncryptedRemoteEntry, EventLogEncryption, layerSubtle } from "./EventLogEncryption.js" -import * as MsgPack from "./MsgPack.js" /** * @since 1.0.0 diff --git a/packages/experimental/src/EventLogServer.ts b/packages/experimental/src/EventLogServer.ts index 08ce4ce4fa2..042cd51e627 100644 --- a/packages/experimental/src/EventLogServer.ts +++ b/packages/experimental/src/EventLogServer.ts @@ -4,6 +4,7 @@ import type * as HttpServerError from "@effect/platform/HttpServerError" import * as HttpServerRequest from "@effect/platform/HttpServerRequest" import * as HttpServerResponse from "@effect/platform/HttpServerResponse" +import * as MsgPack from "@effect/platform/MsgPack" import type * as Socket from "@effect/platform/Socket" import * as Chunk from "effect/Chunk" import * as Context from "effect/Context" @@ -21,7 +22,6 @@ import { EntryId, makeRemoteId } from "./EventJournal.js" import { EncryptedRemoteEntry } from "./EventLogEncryption.js" import type { ProtocolRequest, ProtocolResponse } from "./EventLogRemote.js" import { Ack, Changes, ChunkedMessage, decodeRequest, encodeResponse, Hello, Pong } from "./EventLogRemote.js" -import * as MsgPack from "./MsgPack.js" const constChunkSize = 512_000 diff --git a/packages/experimental/src/SocketServer/Node.ts b/packages/experimental/src/SocketServer/Node.ts deleted file mode 100644 index 708f9e2cc08..00000000000 --- a/packages/experimental/src/SocketServer/Node.ts +++ /dev/null @@ -1,213 +0,0 @@ -/** - * @since 1.0.0 - */ -import * as NodeSocket from "@effect/platform-node/NodeSocket" -import * as Socket from "@effect/platform/Socket" -import * as Context from "effect/Context" -import * as Effect from "effect/Effect" -import * as FiberSet from "effect/FiberSet" -import { pipe } from "effect/Function" -import * as Layer from "effect/Layer" -import type * as Scope from "effect/Scope" -import type * as Http from "node:http" -import * as Net from "node:net" -import * as WS from "ws" -import * as SocketServer from "../SocketServer.js" - -/** - * @since 1.0.0 - */ -export * from "../SocketServer.js" - -/** - * @since 1.0.0 - * @category tags - */ -export interface IncomingMessage { - readonly _: unique symbol -} - -/** - * @since 1.0.0 - * @category tags - */ -export const IncomingMessage = Context.GenericTag( - "@effect/experimental/SocketServer/Node/IncomingMessage" -) - -/** - * @since 1.0.0 - * @category constructors - */ -export const make = ( - options: Net.ServerOpts & Net.ListenOptions -): Effect.Effect => - Effect.gen(function*() { - const server = yield* Effect.acquireRelease( - Effect.sync(() => Net.createServer(options)), - (server) => - Effect.async((resume) => { - server.close(() => resume(Effect.void)) - }) - ) - - yield* Effect.async((resume) => { - server.once("error", (cause) => { - resume(Effect.fail( - new SocketServer.SocketServerError({ - reason: "Open", - cause - }) - )) - }) - server.listen(options, () => { - resume(Effect.void) - }) - }) - - const run = (handler: (socket: Socket.Socket) => Effect.Effect<_, E, R>) => - Effect.gen(function*() { - const run = yield* FiberSet.makeRuntime() - function onConnection(conn: Net.Socket) { - pipe( - NodeSocket.fromDuplex( - Effect.acquireRelease( - Effect.succeed(conn), - (conn) => - Effect.sync(() => { - if (conn.closed === false) { - conn.destroySoon() - } - }) - ) - ), - Effect.flatMap(handler), - Effect.catchAllCause((cause) => Effect.log(cause, "Unhandled error in SocketServer handler")), - Effect.provideService(NodeSocket.NetSocket, conn), - run - ) - } - return yield* Effect.async((_resume) => { - server.on("connection", onConnection) - return Effect.sync(() => { - server.off("connection", onConnection) - }) - }) - }).pipe(Effect.scoped) - - const address = server.address()! - return SocketServer.SocketServer.of({ - [SocketServer.SocketServerTypeId]: SocketServer.SocketServerTypeId, - address: typeof address === "string" ? - { - _tag: "UnixAddress", - path: address - } : - { - _tag: "TcpAddress", - hostname: address.address, - port: address.port - }, - run - }) - }) - -/** - * @since 1.0.0 - * @category layers - */ -export const layer = ( - options: Net.ServerOpts & Net.ListenOptions -): Layer.Layer => - Layer.scoped( - SocketServer.SocketServer, - make(options) - ) - -/** - * @since 1.0.0 - * @category constructors - */ -export const makeWebSocket = ( - options: WS.ServerOptions -): Effect.Effect => - Effect.gen(function*() { - const server = yield* Effect.acquireRelease( - Effect.sync(() => new WS.WebSocketServer(options)), - (server) => - Effect.async((resume) => { - server.close(() => resume(Effect.void)) - }) - ) - - yield* Effect.async((resume) => { - server.once("error", (error) => { - resume(Effect.fail( - new SocketServer.SocketServerError({ - reason: "Open", - cause: error - }) - )) - }) - server.once("listening", () => { - resume(Effect.void) - }) - }) - - const run = (handler: (socket: Socket.Socket) => Effect.Effect<_, E, R>) => - Effect.gen(function*() { - const run = yield* FiberSet.makeRuntime() - function onConnection(conn: Net.Socket, req: Http.IncomingMessage) { - pipe( - Socket.fromWebSocket( - Effect.acquireRelease( - Effect.succeed(conn as unknown as globalThis.WebSocket), - (conn) => - Effect.sync(() => { - conn.close() - }) - ) - ), - Effect.flatMap(handler), - Effect.catchAllCause((cause) => Effect.log(cause, "Unhandled error in SocketServer handler")), - Effect.provideService(Socket.WebSocket, conn as any), - Effect.provideService(IncomingMessage, req), - run - ) - } - return yield* Effect.async((_resume) => { - server.on("connection", onConnection) - return Effect.sync(() => { - server.off("connection", onConnection) - }) - }) - }).pipe(Effect.scoped) - - const address = server.address()! - return SocketServer.SocketServer.of({ - [SocketServer.SocketServerTypeId]: SocketServer.SocketServerTypeId, - address: typeof address === "string" ? - { - _tag: "UnixAddress", - path: address - } : - { - _tag: "TcpAddress", - hostname: address.address, - port: address.port - }, - run - }) - }) - -/** - * @since 1.0.0 - * @category layers - */ -export const layerWebSocket = ( - options: WS.ServerOptions -): Layer.Layer => - Layer.scoped( - SocketServer.SocketServer, - makeWebSocket(options) - ) diff --git a/packages/experimental/src/index.ts b/packages/experimental/src/index.ts index 9507e001b17..e28fb066a2d 100644 --- a/packages/experimental/src/index.ts +++ b/packages/experimental/src/index.ts @@ -1,8 +1,3 @@ -/** - * @since 1.0.0 - */ -export * as ChannelSchema from "./ChannelSchema.js" - /** * @since 1.0.0 */ @@ -48,16 +43,6 @@ export * as EventLogServer from "./EventLogServer.js" */ export * as Machine from "./Machine.js" -/** - * @since 1.0.0 - */ -export * as MsgPack from "./MsgPack.js" - -/** - * @since 1.0.0 - */ -export * as Ndjson from "./Ndjson.js" - /** * @since 1.0.0 */ @@ -78,11 +63,6 @@ export * as Reactivity from "./Reactivity.js" */ export * as RequestResolver from "./RequestResolver.js" -/** - * @since 1.0.0 - */ -export * as SocketServer from "./SocketServer.js" - /** * @since 1.0.0 */ diff --git a/packages/experimental/vitest.config.ts b/packages/experimental/vitest.config.ts index abf85c44b67..578d0667249 100644 --- a/packages/experimental/vitest.config.ts +++ b/packages/experimental/vitest.config.ts @@ -1,10 +1,6 @@ import { mergeConfig, type ViteUserConfig } from "vitest/config" import shared from "../../vitest.shared.js" -const config: ViteUserConfig = { - test: { - setupFiles: ["vitest-websocket-mock"] - } -} +const config: ViteUserConfig = {} export default mergeConfig(shared, config) diff --git a/packages/platform-browser/src/BrowserWorker.ts b/packages/platform-browser/src/BrowserWorker.ts index ba5c77d3c92..c1221b64620 100644 --- a/packages/platform-browser/src/BrowserWorker.ts +++ b/packages/platform-browser/src/BrowserWorker.ts @@ -22,4 +22,12 @@ export const layerWorker: Layer.Layer = internal.layerWor */ export const layer: ( spawn: (id: number) => Worker | SharedWorker | MessagePort -) => Layer.Layer = internal.layer +) => Layer.Layer = internal.layer + +/** + * @since 1.0.0 + * @category layers + */ +export const layerPlatform: ( + spawn: (id: number) => globalThis.Worker | globalThis.SharedWorker | MessagePort +) => Layer.Layer = internal.layerPlatform diff --git a/packages/platform-browser/src/internal/worker.ts b/packages/platform-browser/src/internal/worker.ts index b4e09bf5b15..c7c330615d4 100644 --- a/packages/platform-browser/src/internal/worker.ts +++ b/packages/platform-browser/src/internal/worker.ts @@ -52,3 +52,7 @@ export const layerManager = Layer.provide(Worker.layerManager, layerWorker) /** @internal */ export const layer = (spawn: (id: number) => globalThis.Worker | globalThis.SharedWorker | MessagePort) => Layer.merge(layerManager, Worker.layerSpawner(spawn)) + +/** @internal */ +export const layerPlatform = (spawn: (id: number) => globalThis.Worker | globalThis.SharedWorker | MessagePort) => + Layer.merge(layerWorker, Worker.layerSpawner(spawn)) diff --git a/packages/platform-browser/src/internal/workerRunner.ts b/packages/platform-browser/src/internal/workerRunner.ts index 935ec2d364f..9a4bfa0093b 100644 --- a/packages/platform-browser/src/internal/workerRunner.ts +++ b/packages/platform-browser/src/internal/workerRunner.ts @@ -7,8 +7,10 @@ import * as Effect from "effect/Effect" import * as ExecStrategy from "effect/ExecutionStrategy" import * as Exit from "effect/Exit" import * as FiberSet from "effect/FiberSet" +import { identity } from "effect/Function" import { globalValue } from "effect/GlobalValue" import * as Layer from "effect/Layer" +import * as Mailbox from "effect/Mailbox" import * as Runtime from "effect/Runtime" import * as Scope from "effect/Scope" @@ -24,124 +26,126 @@ if (typeof self !== "undefined" && "onconnect" in self) { export const make = (self: MessagePort | Window) => Runner.PlatformRunner.of({ [Runner.PlatformRunnerTypeId]: Runner.PlatformRunnerTypeId, - start(closeLatch: Deferred.Deferred) { - return Effect.sync(() => { - let currentPortId = 0 + start: Effect.fnUntraced(function*(closeLatch: Deferred.Deferred) { + const disconnects = yield* Mailbox.make() + let currentPortId = 0 - const ports = new Map() - const send = (portId: number, message: O, transfer?: ReadonlyArray) => - Effect.sync(() => { - ;(ports.get(portId)?.[0] ?? self).postMessage([1, message], { - transfer: transfer as any - }) + const ports = new Map() + const send = (portId: number, message: O, transfer?: ReadonlyArray) => + Effect.sync(() => { + ;(ports.get(portId)?.[0] ?? self).postMessage([1, message], { + transfer: transfer as any }) + }) - const run = Effect.fnUntraced(function*( - handler: (portId: number, message: I) => Effect.Effect - ) { - const scope = yield* Effect.scope - const runtime = (yield* Effect.interruptible(Effect.runtime())).pipe( - Runtime.updateContext(Context.omit(Scope.Scope)) - ) as Runtime.Runtime - const fiberSet = yield* FiberSet.make() - const runFork = Runtime.runFork(runtime) - function onExit(exit: Exit.Exit) { - if (exit._tag === "Failure" && !Cause.isInterruptedOnly(exit.cause)) { - Deferred.unsafeDone(closeLatch, Exit.die(Cause.squash(exit.cause))) - } + const run = Effect.fnUntraced(function*( + handler: (portId: number, message: I) => Effect.Effect | void + ) { + const scope = yield* Effect.scope + const runtime = (yield* Effect.interruptible(Effect.runtime())).pipe( + Runtime.updateContext(Context.omit(Scope.Scope)) + ) as Runtime.Runtime + const fiberSet = yield* FiberSet.make() + const runFork = Runtime.runFork(runtime) + function onExit(exit: Exit.Exit) { + if (exit._tag === "Failure" && !Cause.isInterruptedOnly(exit.cause)) { + Deferred.unsafeDone(closeLatch, Exit.die(Cause.squash(exit.cause))) } + } - function onMessage(portId: number) { - return function(event: MessageEvent) { - const message = (event as MessageEvent).data as Runner.BackingRunner.Message - if (message[0] === 0) { - const fiber = runFork(handler(portId, message[1])) + function onMessage(portId: number) { + return function(event: MessageEvent) { + const message = (event as MessageEvent).data as Runner.BackingRunner.Message + if (message[0] === 0) { + const result = handler(portId, message[1]) + if (Effect.isEffect(result)) { + const fiber = runFork(result) fiber.addObserver(onExit) FiberSet.unsafeAdd(fiberSet, fiber) - } else { - const port = ports.get(portId) - if (!port) { - return - } else if (ports.size === 1) { - // let the last port close with the outer scope - return Deferred.unsafeDone(closeLatch, Exit.void) - } - ports.delete(portId) - Effect.runFork(Scope.close(port[1], Exit.void)) } + } else { + const port = ports.get(portId) + if (!port) { + return + } else if (ports.size === 1) { + // let the last port close with the outer scope + return Deferred.unsafeDone(closeLatch, Exit.void) + } + ports.delete(portId) + Effect.runFork(Scope.close(port[1], Exit.void)) } } - function onMessageError(error: MessageEvent) { - Deferred.unsafeDone( - closeLatch, - new WorkerError({ reason: "decode", cause: error.data }) - ) - } - function onError(error: any) { - Deferred.unsafeDone( - closeLatch, - new WorkerError({ reason: "unknown", cause: error.data }) - ) + } + function onMessageError(error: MessageEvent) { + Deferred.unsafeDone( + closeLatch, + new WorkerError({ reason: "decode", cause: error.data }) + ) + } + function onError(error: any) { + Deferred.unsafeDone( + closeLatch, + new WorkerError({ reason: "unknown", cause: error.data }) + ) + } + function handlePort(port: MessagePort) { + const fiber = Scope.fork(scope, ExecStrategy.sequential).pipe( + Effect.flatMap((scope) => { + const portId = currentPortId++ + ports.set(portId, [port, scope]) + const onMsg = onMessage(portId) + port.addEventListener("message", onMsg) + port.addEventListener("messageerror", onMessageError) + if ("start" in port) { + port.start() + } + port.postMessage([0]) + return Scope.addFinalizer( + scope, + Effect.sync(() => { + port.removeEventListener("message", onMsg) + port.removeEventListener("messageerror", onError) + port.close() + }) + ) + }), + runFork + ) + fiber.addObserver(onExit) + FiberSet.unsafeAdd(fiberSet, fiber) + } + self.addEventListener("error", onError) + let prevOnConnect: unknown | undefined + if ("onconnect" in self) { + prevOnConnect = self.onconnect + self.onconnect = function(event: MessageEvent) { + const port = (event as MessageEvent).ports[0] + handlePort(port) } - function handlePort(port: MessagePort) { - const fiber = Scope.fork(scope, ExecStrategy.sequential).pipe( - Effect.flatMap((scope) => { - const portId = currentPortId++ - ports.set(portId, [port, scope]) - const onMsg = onMessage(portId) - port.addEventListener("message", onMsg) - port.addEventListener("messageerror", onMessageError) - if ("start" in port) { - port.start() - } - port.postMessage([0]) - return Scope.addFinalizer( - scope, - Effect.sync(() => { - port.removeEventListener("message", onMsg) - port.removeEventListener("messageerror", onError) - port.close() - }) - ) - }), - runFork - ) - fiber.addObserver(onExit) - FiberSet.unsafeAdd(fiberSet, fiber) - } - self.addEventListener("error", onError) - let prevOnConnect: unknown | undefined - if ("onconnect" in self) { - prevOnConnect = self.onconnect - self.onconnect = function(event: MessageEvent) { - const port = (event as MessageEvent).ports[0] - handlePort(port) - } - for (const port of cachedPorts) { - handlePort(port) - } - cachedPorts.clear() - yield* Scope.addFinalizer( - scope, - Effect.sync(() => self.close()) - ) - } else { - handlePort(self as any) + for (const port of cachedPorts) { + handlePort(port) } + cachedPorts.clear() yield* Scope.addFinalizer( scope, - Effect.sync(() => { - self.removeEventListener("error", onError) - if ("onconnect" in self) { - self.onconnect = prevOnConnect - } - }) + Effect.sync(() => self.close()) ) - }) - - return { run, send } + } else { + handlePort(self as any) + } + yield* Scope.addFinalizer( + scope, + Effect.sync(() => { + self.removeEventListener("error", onError) + if ("onconnect" in self) { + self.onconnect = prevOnConnect + } + }) + ) }) - } + + return identity>({ run, send, disconnects }) + }) as any }) /** @internal */ diff --git a/packages/platform-bun/src/BunSocketServer.ts b/packages/platform-bun/src/BunSocketServer.ts new file mode 100644 index 00000000000..3c7ec9e9306 --- /dev/null +++ b/packages/platform-bun/src/BunSocketServer.ts @@ -0,0 +1,8 @@ +/** + * @since 1.0.0 + */ + +/** + * @since 1.0.0 + */ +export * from "@effect/platform-node-shared/NodeSocketServer" diff --git a/packages/platform-bun/src/BunWorker.ts b/packages/platform-bun/src/BunWorker.ts index b7fa7565749..36357a20236 100644 --- a/packages/platform-bun/src/BunWorker.ts +++ b/packages/platform-bun/src/BunWorker.ts @@ -24,3 +24,11 @@ export const layerWorker: Layer.Layer = internal.layerWor export const layer: ( spawn: (id: number) => Worker ) => Layer.Layer = internal.layer + +/** + * @since 1.0.0 + * @category layers + */ +export const layerPlatform: ( + spawn: (id: number) => globalThis.Worker +) => Layer.Layer = internal.layerPlatform diff --git a/packages/platform-bun/src/index.ts b/packages/platform-bun/src/index.ts index 3abe0d70a3d..29d9252f9ed 100644 --- a/packages/platform-bun/src/index.ts +++ b/packages/platform-bun/src/index.ts @@ -58,6 +58,11 @@ export * as BunSink from "./BunSink.js" */ export * as BunSocket from "./BunSocket.js" +/** + * @since 1.0.0 + */ +export * as BunSocketServer from "./BunSocketServer.js" + /** * @since 1.0.0 */ diff --git a/packages/platform-bun/src/internal/worker.ts b/packages/platform-bun/src/internal/worker.ts index ffe95beaa6b..ebb0677e885 100644 --- a/packages/platform-bun/src/internal/worker.ts +++ b/packages/platform-bun/src/internal/worker.ts @@ -62,3 +62,7 @@ export const layer = (spawn: (id: number) => globalThis.Worker) => layerManager, Worker.layerSpawner(spawn) ) + +/** @internal */ +export const layerPlatform = (spawn: (id: number) => globalThis.Worker) => + Layer.merge(layerWorker, Worker.layerSpawner(spawn)) diff --git a/packages/platform-bun/src/internal/workerRunner.ts b/packages/platform-bun/src/internal/workerRunner.ts index 74900e38fa8..5ddacfcff88 100644 --- a/packages/platform-bun/src/internal/workerRunner.ts +++ b/packages/platform-bun/src/internal/workerRunner.ts @@ -20,7 +20,7 @@ const platformRunnerImpl = Runner.PlatformRunner.of({ } const port = self const run = Effect.fnUntraced(function*( - handler: (portId: number, message: any) => Effect.Effect + handler: (portId: number, message: any) => Effect.Effect | void ) { const scope = yield* Effect.scope const runtime = (yield* Effect.runtime().pipe( @@ -39,9 +39,12 @@ const platformRunnerImpl = Runner.PlatformRunner.of({ function onMessage(event: MessageEvent) { const message = (event as MessageEvent).data as Runner.BackingRunner.Message if (message[0] === 0) { - const fiber = runFork(handler(0, message[1])) - fiber.addObserver(onExit) - FiberSet.unsafeAdd(fiberSet, fiber) + const result = handler(0, message[1]) + if (Effect.isEffect(result)) { + const fiber = runFork(result) + fiber.addObserver(onExit) + FiberSet.unsafeAdd(fiberSet, fiber) + } } else { port.close() Deferred.unsafeDone(closeLatch, Exit.void) diff --git a/packages/platform-node-shared/package.json b/packages/platform-node-shared/package.json index c5a3ac4eade..54d1eca5408 100644 --- a/packages/platform-node-shared/package.json +++ b/packages/platform-node-shared/package.json @@ -42,7 +42,8 @@ }, "dependencies": { "@parcel/watcher": "^2.4.1", - "multipasta": "^0.2.5" + "multipasta": "^0.2.5", + "ws": "^8.18.0" }, "peerDependencies": { "@effect/platform": "workspace:^", @@ -51,6 +52,7 @@ "devDependencies": { "@effect/platform": "workspace:^", "@types/tar": "^6.1.12", + "@types/ws": "^8.5.12", "effect": "workspace:^", "tar": "^6" }, diff --git a/packages/platform-node-shared/src/NodeSocket.ts b/packages/platform-node-shared/src/NodeSocket.ts index c7abf23a150..a561d1ce5a4 100644 --- a/packages/platform-node-shared/src/NodeSocket.ts +++ b/packages/platform-node-shared/src/NodeSocket.ts @@ -45,6 +45,7 @@ export const makeNet = ( resume(Effect.succeed(conn)) }) conn.on("error", (cause) => { + conn.removeAllListeners() resume(Effect.fail(new Socket.SocketGenericError({ reason: "Open", cause }))) }) return Effect.sync(() => { diff --git a/packages/platform-node-shared/src/NodeSocketServer.ts b/packages/platform-node-shared/src/NodeSocketServer.ts new file mode 100644 index 00000000000..9136b429d44 --- /dev/null +++ b/packages/platform-node-shared/src/NodeSocketServer.ts @@ -0,0 +1,225 @@ +/** + * @since 1.0.0 + */ +import * as Socket from "@effect/platform/Socket" +import * as SocketServer from "@effect/platform/SocketServer" +import type { Cause } from "effect/Cause" +import * as Context from "effect/Context" +import * as Effect from "effect/Effect" +import * as Exit from "effect/Exit" +import * as FiberRef from "effect/FiberRef" +import * as FiberSet from "effect/FiberSet" +import { pipe } from "effect/Function" +import * as Layer from "effect/Layer" +import * as Scope from "effect/Scope" +import type * as Http from "node:http" +import * as Net from "node:net" +import * as WS from "ws" +import * as NodeSocket from "./NodeSocket.js" + +/** + * @since 1.0.0 + * @category tags + */ +export class IncomingMessage extends Context.Tag("@effect/platform-node-shared/NodeSocketServer/IncomingMessage")< + IncomingMessage, + Http.IncomingMessage +>() {} + +/** + * @since 1.0.0 + * @category constructors + */ +export const make = Effect.fnUntraced(function*( + options: Net.ServerOpts & Net.ListenOptions +) { + const server = yield* Effect.acquireRelease( + Effect.sync(() => Net.createServer(options)), + (server) => + Effect.async((resume) => { + server.close(() => resume(Effect.void)) + }) + ) + + yield* Effect.async((resume) => { + server.once("error", (cause) => { + resume(Effect.fail( + new SocketServer.SocketServerError({ + reason: "Open", + cause + }) + )) + }) + server.listen(options, () => { + resume(Effect.void) + }) + }) + + const run = Effect.fnUntraced(function*(handler: (socket: Socket.Socket) => Effect.Effect<_, E, R>) { + const scope = yield* Scope.make() + const fiberSet = yield* FiberSet.make().pipe( + Scope.extend(scope) + ) + const run = yield* FiberSet.runtime(fiberSet)() + function onConnection(conn: Net.Socket) { + pipe( + NodeSocket.fromDuplex( + Effect.acquireRelease( + Effect.succeed(conn), + (conn) => + Effect.sync(() => { + if (conn.closed === false) { + conn.destroySoon() + } + }) + ) + ), + Effect.flatMap(handler), + Effect.catchAllCause(reportUnhandledError), + Effect.provideService(NodeSocket.NetSocket, conn), + run + ) + } + return yield* Effect.async((_resume) => { + server.on("connection", onConnection) + return Effect.sync(() => { + server.off("connection", onConnection) + }) + }).pipe( + Effect.ensuring(Scope.close(scope, Exit.void)) + ) + }) + + const address = server.address()! + return SocketServer.SocketServer.of({ + address: typeof address === "string" ? + { + _tag: "UnixAddress", + path: address + } : + { + _tag: "TcpAddress", + hostname: address.address, + port: address.port + }, + run + }) +}) + +/** + * @since 1.0.0 + * @category layers + */ +export const layer = ( + options: Net.ServerOpts & Net.ListenOptions +): Layer.Layer => + Layer.scoped( + SocketServer.SocketServer, + make(options) + ) + +/** + * @since 1.0.0 + * @category constructors + */ +export const makeWebSocket: ( + options: WS.ServerOptions +) => Effect.Effect< + SocketServer.SocketServer["Type"], + SocketServer.SocketServerError, + Scope.Scope +> = Effect.fnUntraced(function*( + options: WS.ServerOptions +) { + const server = yield* Effect.acquireRelease( + Effect.sync(() => new WS.WebSocketServer(options)), + (server) => + Effect.async((resume) => { + server.close(() => resume(Effect.void)) + }) + ) + + yield* Effect.async((resume) => { + server.once("error", (error) => { + resume(Effect.fail( + new SocketServer.SocketServerError({ + reason: "Open", + cause: error + }) + )) + }) + server.once("listening", () => { + resume(Effect.void) + }) + }) + + const run = Effect.fnUntraced(function*(handler: (socket: Socket.Socket) => Effect.Effect<_, E, R>) { + const scope = yield* Scope.make() + const fiberSet = yield* FiberSet.make().pipe( + Scope.extend(scope) + ) + const run = yield* FiberSet.runtime(fiberSet)() + function onConnection(conn: Net.Socket, req: Http.IncomingMessage) { + pipe( + Socket.fromWebSocket( + Effect.acquireRelease( + Effect.succeed(conn as unknown as globalThis.WebSocket), + (conn) => + Effect.sync(() => { + conn.close() + }) + ) + ), + Effect.flatMap(handler), + Effect.catchAllCause(reportUnhandledError), + Effect.provideService(Socket.WebSocket, conn as any), + Effect.provideService(IncomingMessage, req), + run + ) + } + return yield* Effect.async((_resume) => { + server.on("connection", onConnection) + return Effect.sync(() => { + server.off("connection", onConnection) + }) + }).pipe( + Effect.ensuring(Scope.close(scope, Exit.void)) + ) + }) + + const address = server.address()! + return SocketServer.SocketServer.of({ + address: typeof address === "string" ? + { + _tag: "UnixAddress", + path: address + } : + { + _tag: "TcpAddress", + hostname: address.address, + port: address.port + }, + run + }) +}) + +/** + * @since 1.0.0 + * @category layers + */ +export const layerWebSocket = ( + options: WS.ServerOptions +): Layer.Layer => + Layer.scoped( + SocketServer.SocketServer, + makeWebSocket(options) + ) + +const reportUnhandledError = (cause: Cause) => + Effect.withFiberRuntime((fiber) => { + const unhandledLogLevel = fiber.getFiberRef(FiberRef.unhandledErrorLogLevel) + if (unhandledLogLevel._tag === "Some") { + return Effect.logWithLevel(unhandledLogLevel.value, cause, "Unhandled error in SocketServer") + } + return Effect.void + }) diff --git a/packages/platform-node/package.json b/packages/platform-node/package.json index bdf1ac235dd..ebef93cef07 100644 --- a/packages/platform-node/package.json +++ b/packages/platform-node/package.json @@ -57,7 +57,8 @@ "@effect/platform": "workspace:^", "@types/mime": "^3.0.4", "@types/ws": "^8.5.12", - "effect": "workspace:^" + "effect": "workspace:^", + "vitest-websocket-mock": "^0.4.0" }, "effect": { "generateExports": { diff --git a/packages/platform-node/src/NodeSocketServer.ts b/packages/platform-node/src/NodeSocketServer.ts new file mode 100644 index 00000000000..3c7ec9e9306 --- /dev/null +++ b/packages/platform-node/src/NodeSocketServer.ts @@ -0,0 +1,8 @@ +/** + * @since 1.0.0 + */ + +/** + * @since 1.0.0 + */ +export * from "@effect/platform-node-shared/NodeSocketServer" diff --git a/packages/platform-node/src/NodeWorker.ts b/packages/platform-node/src/NodeWorker.ts index 6f0d5c91c95..f39b69beea3 100644 --- a/packages/platform-node/src/NodeWorker.ts +++ b/packages/platform-node/src/NodeWorker.ts @@ -24,4 +24,12 @@ export const layerWorker: Layer.Layer = internal.layerWor */ export const layer: ( spawn: (id: number) => WorkerThreads.Worker -) => Layer.Layer = internal.layer +) => Layer.Layer = internal.layer + +/** + * @since 1.0.0 + * @category layers + */ +export const layerPlatform: ( + spawn: (id: number) => WorkerThreads.Worker +) => Layer.Layer = internal.layerPlatform diff --git a/packages/platform-node/src/index.ts b/packages/platform-node/src/index.ts index 3b31b5f93cd..2fee8a59ddf 100644 --- a/packages/platform-node/src/index.ts +++ b/packages/platform-node/src/index.ts @@ -63,6 +63,11 @@ export * as NodeSink from "./NodeSink.js" */ export * as NodeSocket from "./NodeSocket.js" +/** + * @since 1.0.0 + */ +export * as NodeSocketServer from "./NodeSocketServer.js" + /** * @since 1.0.0 */ diff --git a/packages/platform-node/src/internal/worker.ts b/packages/platform-node/src/internal/worker.ts index 5b5aaa554cd..8c5cb63f24a 100644 --- a/packages/platform-node/src/internal/worker.ts +++ b/packages/platform-node/src/internal/worker.ts @@ -64,3 +64,7 @@ export const layer = (spawn: (id: number) => WorkerThreads.Worker) => layerManager, Worker.layerSpawner(spawn) ) + +/** @internal */ +export const layerPlatform = (spawn: (id: number) => WorkerThreads.Worker) => + Layer.merge(layerWorker, Worker.layerSpawner(spawn)) diff --git a/packages/platform-node/src/internal/workerRunner.ts b/packages/platform-node/src/internal/workerRunner.ts index b89197af0d4..0c9eb912e79 100644 --- a/packages/platform-node/src/internal/workerRunner.ts +++ b/packages/platform-node/src/internal/workerRunner.ts @@ -23,7 +23,7 @@ const platformRunnerImpl = Runner.PlatformRunner.of({ Effect.sync(() => port.postMessage([1, message], transfers as any)) const run = Effect.fnUntraced(function*( - handler: (portId: number, message: I) => Effect.Effect + handler: (portId: number, message: I) => Effect.Effect | void ) { const runtime = (yield* Effect.interruptible(Effect.runtime())).pipe( Runtime.updateContext(Context.omit(Scope.Scope)) @@ -37,9 +37,12 @@ const platformRunnerImpl = Runner.PlatformRunner.of({ } port.on("message", (message: Runner.BackingRunner.Message) => { if (message[0] === 0) { - const fiber = runFork(handler(0, message[1])) - fiber.addObserver(onExit) - FiberSet.unsafeAdd(fiberSet, fiber) + const result = handler(0, message[1]) + if (Effect.isEffect(result)) { + const fiber = runFork(result) + fiber.addObserver(onExit) + FiberSet.unsafeAdd(fiberSet, fiber) + } } else { port.close() Deferred.unsafeDone(closeLatch, Exit.void) diff --git a/packages/experimental/test/MsgPack.test.ts b/packages/platform-node/test/MsgPack.test.ts similarity index 81% rename from packages/experimental/test/MsgPack.test.ts rename to packages/platform-node/test/MsgPack.test.ts index 25caa02b2fc..68e480d1d45 100644 --- a/packages/experimental/test/MsgPack.test.ts +++ b/packages/platform-node/test/MsgPack.test.ts @@ -1,5 +1,5 @@ -import * as MsgPack from "@effect/experimental/MsgPack" -import * as Socket from "@effect/platform-node/NodeSocket" +import { MsgPack } from "@effect/platform" +import { NodeSocket } from "@effect/platform-node" import { assert, describe, test } from "@effect/vitest" import { Chunk, Effect, Stream } from "effect" import * as Net from "node:net" @@ -22,7 +22,7 @@ server.listen({ describe("MsgPack", () => { test("socket", () => Effect.gen(function*(_) { - const socket = Socket.makeNetChannel({ port, host: "localhost" }).pipe( + const socket = NodeSocket.makeNetChannel({ port, host: "localhost" }).pipe( MsgPack.duplex ) @@ -37,7 +37,7 @@ describe("MsgPack", () => { test("socket x10000", () => Effect.gen(function*(_) { - const socket = Socket.makeNetChannel({ port }).pipe( + const socket = NodeSocket.makeNetChannel({ port }).pipe( MsgPack.duplex ) const msgs = Array.from({ length: 10000 }, (_, i) => ({ hello: i })) diff --git a/packages/experimental/test/Ndjson.test.ts b/packages/platform-node/test/Ndjson.test.ts similarity index 89% rename from packages/experimental/test/Ndjson.test.ts rename to packages/platform-node/test/Ndjson.test.ts index 9aab0942d01..e3f6923ddbf 100644 --- a/packages/experimental/test/Ndjson.test.ts +++ b/packages/platform-node/test/Ndjson.test.ts @@ -1,5 +1,5 @@ -import * as Ndjson from "@effect/experimental/Ndjson" -import * as Socket from "@effect/platform-node/NodeSocket" +import { Ndjson } from "@effect/platform" +import { NodeSocket } from "@effect/platform-node" import { assert, describe, test } from "@effect/vitest" import { Chunk, Effect, Stream } from "effect" import * as Net from "node:net" @@ -22,7 +22,7 @@ server.listen({ describe("Ndjson", () => { test("socket", () => Effect.gen(function*(_) { - const socket = Socket.makeNetChannel({ port, host: "localhost" }).pipe( + const socket = NodeSocket.makeNetChannel({ port, host: "localhost" }).pipe( Ndjson.duplex() ) @@ -37,7 +37,7 @@ describe("Ndjson", () => { test("socket x10000", () => Effect.gen(function*(_) { - const socket = Socket.makeNetChannel({ port }).pipe( + const socket = NodeSocket.makeNetChannel({ port }).pipe( Ndjson.duplex() ) const msgs = Array.from({ length: 10000 }, (_, i) => ({ hello: i })) diff --git a/packages/experimental/test/Socket.test.ts b/packages/platform-node/test/Socket.test.ts similarity index 87% rename from packages/experimental/test/Socket.test.ts rename to packages/platform-node/test/Socket.test.ts index b67b52119cd..714850e03ae 100644 --- a/packages/experimental/test/Socket.test.ts +++ b/packages/platform-node/test/Socket.test.ts @@ -1,22 +1,16 @@ -import * as SocketServer from "@effect/experimental/SocketServer/Node" -import * as NodeSocket from "@effect/platform-node/NodeSocket" -import * as Socket from "@effect/platform/Socket" +import { Socket, type SocketServer } from "@effect/platform" +import { NodeSocket, NodeSocketServer } from "@effect/platform-node" import { assert, describe, expect, it } from "@effect/vitest" import { Chunk, Effect, Queue, Stream } from "effect" import { WS } from "vitest-websocket-mock" -const makeServer = Effect.gen(function*(_) { - const server = yield* _(SocketServer.make({ port: 0 })) +const makeServer = Effect.gen(function*() { + const server = yield* NodeSocketServer.make({ port: 0 }) - yield* _( - server.run((socket) => - Effect.gen(function*() { - const write = yield* socket.writer - yield* socket.run(write) - }).pipe(Effect.scoped) - ), - Effect.forkScoped - ) + yield* server.run(Effect.fnUntraced(function*(socket) { + const write = yield* socket.writer + yield* socket.run(write) + }, Effect.scoped)).pipe(Effect.forkScoped) return server }) diff --git a/packages/platform-node/vitest.config.ts b/packages/platform-node/vitest.config.ts index 578d0667249..abf85c44b67 100644 --- a/packages/platform-node/vitest.config.ts +++ b/packages/platform-node/vitest.config.ts @@ -1,6 +1,10 @@ import { mergeConfig, type ViteUserConfig } from "vitest/config" import shared from "../../vitest.shared.js" -const config: ViteUserConfig = {} +const config: ViteUserConfig = { + test: { + setupFiles: ["vitest-websocket-mock"] + } +} export default mergeConfig(shared, config) diff --git a/packages/platform/package.json b/packages/platform/package.json index 51c2057e0e4..748575fda57 100644 --- a/packages/platform/package.json +++ b/packages/platform/package.json @@ -41,6 +41,7 @@ }, "dependencies": { "find-my-way-ts": "^0.1.5", + "msgpackr": "^1.11.2", "multipasta": "^0.2.5" }, "peerDependencies": { diff --git a/packages/experimental/src/ChannelSchema.ts b/packages/platform/src/ChannelSchema.ts similarity index 100% rename from packages/experimental/src/ChannelSchema.ts rename to packages/platform/src/ChannelSchema.ts diff --git a/packages/platform/src/HttpBody.ts b/packages/platform/src/HttpBody.ts index 29e89ec4278..e10d0e2c30e 100644 --- a/packages/platform/src/HttpBody.ts +++ b/packages/platform/src/HttpBody.ts @@ -153,7 +153,7 @@ export interface Uint8Array extends HttpBody.Proto { * @since 1.0.0 * @category constructors */ -export const uint8Array: (body: globalThis.Uint8Array) => Uint8Array = internal.uint8Array +export const uint8Array: (body: globalThis.Uint8Array, contentType?: string) => Uint8Array = internal.uint8Array /** * @since 1.0.0 diff --git a/packages/platform/src/HttpRouter.ts b/packages/platform/src/HttpRouter.ts index bebf8f63831..606d5c6a58f 100644 --- a/packages/platform/src/HttpRouter.ts +++ b/packages/platform/src/HttpRouter.ts @@ -18,7 +18,9 @@ import type * as Etag from "./Etag.js" import type { FileSystem } from "./FileSystem.js" import type * as App from "./HttpApp.js" import type * as Method from "./HttpMethod.js" +import type * as Middleware from "./HttpMiddleware.js" import type * as Platform from "./HttpPlatform.js" +import type * as HttpServer from "./HttpServer.js" import type * as Error from "./HttpServerError.js" import type * as ServerRequest from "./HttpServerRequest.js" import type * as Respondable from "./HttpServerRespondable.js" @@ -144,6 +146,13 @@ export declare namespace HttpRouter { f: (router: Service) => Effect.Effect ) => Layer.Layer> readonly unwrap: (f: (router: HttpRouter) => Layer.Layer) => Layer.Layer + readonly serve: ( + middleware?: Middleware.HttpMiddleware.Applied + ) => Layer.Layer< + never, + never, + HttpServer.HttpServer | Exclude + > } } diff --git a/packages/experimental/src/MsgPack.ts b/packages/platform/src/MsgPack.ts similarity index 95% rename from packages/experimental/src/MsgPack.ts rename to packages/platform/src/MsgPack.ts index 69efde2dca0..447555b334a 100644 --- a/packages/experimental/src/MsgPack.ts +++ b/packages/platform/src/MsgPack.ts @@ -14,6 +14,26 @@ import { Packr, Unpackr } from "msgpackr" import * as Msgpackr from "msgpackr" import * as ChannelSchema from "./ChannelSchema.js" +export { + /** + * @since 1.0.0 + * @category re-exports + */ + Msgpackr +} + +/** + * @since 1.0.0 + * @category errors + */ +export const ErrorTypeId: unique symbol = Symbol.for("@effect/platform/MsgPack/MsgPackError") + +/** + * @since 1.0.0 + * @category errors + */ +export type ErrorTypeId = typeof ErrorTypeId + /** * @since 1.0.0 * @category errors @@ -22,6 +42,14 @@ export class MsgPackError extends Data.TaggedError("MsgPackError")<{ readonly reason: "Pack" | "Unpack" readonly cause: unknown }> { + /** + * @since 1.0.0 + */ + readonly [ErrorTypeId]: ErrorTypeId = ErrorTypeId + + /** + * @since 1.0.0 + */ get message() { return this.reason } diff --git a/packages/experimental/src/Ndjson.ts b/packages/platform/src/Ndjson.ts similarity index 97% rename from packages/experimental/src/Ndjson.ts rename to packages/platform/src/Ndjson.ts index cd950499ecd..b720ee0bc7c 100644 --- a/packages/experimental/src/Ndjson.ts +++ b/packages/platform/src/Ndjson.ts @@ -15,13 +15,13 @@ import * as ChannelSchema from "./ChannelSchema.js" * @since 1.0.0 * @category type ids */ -export const NdjsonErrorTypeId: unique symbol = Symbol.for("@effect/experimental/Ndjson/NdjsonError") +export const ErrorTypeId: unique symbol = Symbol.for("@effect/platform/Ndjson/NdjsonError") /** * @since 1.0.0 * @category type ids */ -export type NdjsonErrorTypeId = typeof NdjsonErrorTypeId +export type NdjsonErrorTypeId = typeof ErrorTypeId const encoder = new TextEncoder() @@ -29,7 +29,7 @@ const encoder = new TextEncoder() * @since 1.0.0 * @category errors */ -export class NdjsonError extends TypeIdError(NdjsonErrorTypeId, "NdjsonError")<{ +export class NdjsonError extends TypeIdError(ErrorTypeId, "NdjsonError")<{ readonly reason: "Pack" | "Unpack" readonly cause: unknown }> { diff --git a/packages/experimental/src/SocketServer.ts b/packages/platform/src/SocketServer.ts similarity index 56% rename from packages/experimental/src/SocketServer.ts rename to packages/platform/src/SocketServer.ts index 5c0e370f964..0a28e0c4d16 100644 --- a/packages/experimental/src/SocketServer.ts +++ b/packages/platform/src/SocketServer.ts @@ -1,42 +1,36 @@ /** * @since 1.0.0 */ -import type * as Socket from "@effect/platform/Socket" import * as Context from "effect/Context" import * as Data from "effect/Data" import type * as Effect from "effect/Effect" +import type * as Socket from "./Socket.js" /** * @since 1.0.0 - * @category type ids - */ -export const SocketServerTypeId: unique symbol = Symbol.for("@effect/experimental/SocketServer") - -/** - * @since 1.0.0 - * @category type ids + * @category tags */ -export type SocketServerTypeId = typeof SocketServerTypeId +export class SocketServer extends Context.Tag("@effect/platform/SocketServer")< + SocketServer, + { + readonly address: Address + readonly run: ( + handler: (socket: Socket.Socket) => Effect.Effect<_, E, R> + ) => Effect.Effect + } +>() {} /** * @since 1.0.0 - * @category tags + * @category errors */ -export const SocketServer: Context.Tag = Context.GenericTag( - "@effect/experimental/SocketServer" -) +export const ErrorTypeId: unique symbol = Symbol.for("@effect/platform/SocketServer/SocketServerError") /** * @since 1.0.0 - * @category models + * @category errors */ -export interface SocketServer { - readonly [SocketServerTypeId]: SocketServerTypeId - readonly address: Address - readonly run: ( - handler: (socket: Socket.Socket) => Effect.Effect<_, E, R> - ) => Effect.Effect -} +export type ErrorTypeId = typeof ErrorTypeId /** * @since 1.0.0 @@ -46,6 +40,11 @@ export class SocketServerError extends Data.TaggedError("SocketServerError")<{ readonly reason: "Open" | "Unknown" readonly cause: unknown }> { + /** + * @since 1.0.0 + */ + readonly [ErrorTypeId]: ErrorTypeId = ErrorTypeId + /** * @since 1.0.0 */ diff --git a/packages/platform/src/Transferable.ts b/packages/platform/src/Transferable.ts index 12fd445b78b..4c78b2609b8 100644 --- a/packages/platform/src/Transferable.ts +++ b/packages/platform/src/Transferable.ts @@ -17,8 +17,8 @@ export interface CollectorService { readonly unsafeAddAll: (_: Iterable) => void readonly read: Effect.Effect> readonly unsafeRead: () => Array - readonly unsafeClear: () => void - readonly clear: Effect.Effect + readonly unsafeClear: () => Array + readonly clear: Effect.Effect> } /** @@ -35,15 +35,16 @@ export class Collector extends Context.Tag("@effect/platform/Transferable/Collec * @category constructors */ export const unsafeMakeCollector = (): CollectorService => { - const tranferables: Array = [] + let tranferables: Array = [] const unsafeAddAll = (transfers: Iterable): void => { - for (const transfer of transfers) { - tranferables.push(transfer) - } + // eslint-disable-next-line no-restricted-syntax + tranferables.push(...transfers) } const unsafeRead = (): Array => tranferables - const unsafeClear = (): void => { - tranferables.length = 0 + const unsafeClear = (): Array => { + const prev = tranferables + tranferables = [] + return prev } return Collector.of({ unsafeAddAll, diff --git a/packages/platform/src/WorkerRunner.ts b/packages/platform/src/WorkerRunner.ts index c99aac07825..91402cb3418 100644 --- a/packages/platform/src/WorkerRunner.ts +++ b/packages/platform/src/WorkerRunner.ts @@ -5,6 +5,7 @@ import type * as Context from "effect/Context" import type * as Deferred from "effect/Deferred" import type * as Effect from "effect/Effect" import type * as Layer from "effect/Layer" +import type * as Mailbox from "effect/Mailbox" import type * as Schema from "effect/Schema" import type * as Scope from "effect/Scope" import type * as Stream from "effect/Stream" @@ -17,13 +18,14 @@ import type { WorkerError } from "./WorkerError.js" */ export interface BackingRunner { readonly run: ( - handler: (portId: number, message: I) => Effect.Effect + handler: (portId: number, message: I) => Effect.Effect | void ) => Effect.Effect readonly send: ( portId: number, message: O, transfers?: ReadonlyArray ) => Effect.Effect + readonly disconnects?: Mailbox.ReadonlyMailbox } /** diff --git a/packages/platform/src/index.ts b/packages/platform/src/index.ts index e0a8523001e..40497125aed 100644 --- a/packages/platform/src/index.ts +++ b/packages/platform/src/index.ts @@ -1,3 +1,8 @@ +/** + * @since 1.0.0 + */ +export * as ChannelSchema from "./ChannelSchema.js" + /** * @since 1.0.0 */ @@ -194,11 +199,21 @@ export * as HttpTraceContext from "./HttpTraceContext.js" */ export * as KeyValueStore from "./KeyValueStore.js" +/** + * @since 1.0.0 + */ +export * as MsgPack from "./MsgPack.js" + /** * @since 1.0.0 */ export * as Multipart from "./Multipart.js" +/** + * @since 1.0.0 + */ +export * as Ndjson from "./Ndjson.js" + /** * @since 1.0.0 */ @@ -234,6 +249,11 @@ export * as Runtime from "./Runtime.js" */ export * as Socket from "./Socket.js" +/** + * @since 1.0.0 + */ +export * as SocketServer from "./SocketServer.js" + /** * @since 1.0.0 */ diff --git a/packages/platform/src/internal/httpRouter.ts b/packages/platform/src/internal/httpRouter.ts index e45d1521480..e51148eddca 100644 --- a/packages/platform/src/internal/httpRouter.ts +++ b/packages/platform/src/internal/httpRouter.ts @@ -18,6 +18,7 @@ import * as FindMyWay from "find-my-way-ts" import type * as App from "../HttpApp.js" import type * as Method from "../HttpMethod.js" import type * as Router from "../HttpRouter.js" +import * as HttpServer from "../HttpServer.js" import * as Error from "../HttpServerError.js" import * as ServerRequest from "../HttpServerRequest.js" import * as Respondable from "../HttpServerRespondable.js" @@ -855,5 +856,6 @@ export const Tag = Layer.unwrapEffect, Layer.provide(TagClass_.Live) ) + TagClass_.serve = (middleware) => TagClass_.unwrap(HttpServer.serve(middleware as any)) return TagClass as any } diff --git a/packages/platform/src/internal/worker.ts b/packages/platform/src/internal/worker.ts index 6a598207b8b..1a1f2d05f26 100644 --- a/packages/platform/src/internal/worker.ts +++ b/packages/platform/src/internal/worker.ts @@ -442,7 +442,7 @@ export const makePlatform = () => port, scope, emit(data) { - FiberSet.unsafeAdd(runFork(handler(data))) + FiberSet.unsafeAdd(fiberSet, runFork(handler(data))) }, deferred: fiberSet.deferred as any }) diff --git a/packages/rpc-http/CHANGELOG.md b/packages/rpc-http/CHANGELOG.md deleted file mode 100644 index 4df8c53d5ec..00000000000 --- a/packages/rpc-http/CHANGELOG.md +++ /dev/null @@ -1,3269 +0,0 @@ -# @effect/rpc-http - -## 0.52.3 - -### Patch Changes - -- Updated dependencies [[`0c4803f`](https://github.com/Effect-TS/effect/commit/0c4803fcc69262d11a97ce49d0e9b4288df0651f), [`6f65ac4`](https://github.com/Effect-TS/effect/commit/6f65ac4eac1489cd6ea390e18b0908670722adad)]: - - effect@3.13.12 - - @effect/platform@0.79.3 - - @effect/rpc@0.54.3 - -## 0.52.2 - -### Patch Changes - -- Updated dependencies [[`fad8cca`](https://github.com/Effect-TS/effect/commit/fad8cca9bbfcc2eaeb44b97c15dbe0a1eda75315), [`4296293`](https://github.com/Effect-TS/effect/commit/4296293049414d0cf2d915a26c552b09f946b9a0), [`9c241ab`](https://github.com/Effect-TS/effect/commit/9c241abe47ccf7a5257b98a4a64a63054a12741d), [`082b0c1`](https://github.com/Effect-TS/effect/commit/082b0c1b9f4252bcdd69608f2e4a9226f953ac3f), [`389dca2`](https://github.com/Effect-TS/effect/commit/389dca2c590e76fa6e859fe1b6049e9c5287e1a0), [`be12983`](https://github.com/Effect-TS/effect/commit/be12983bc7e7537b41cd8910fc4eb7d1da56ab07), [`de88127`](https://github.com/Effect-TS/effect/commit/de88127a5a5906ccece98af74787b5ae0e65e431)]: - - effect@3.13.11 - - @effect/rpc@0.54.2 - - @effect/platform@0.79.2 - -## 0.52.1 - -### Patch Changes - -- Updated dependencies [[`527c964`](https://github.com/Effect-TS/effect/commit/527c9645229f5be9714a7e60a38a9e753c4bbfb1)]: - - effect@3.13.10 - - @effect/platform@0.79.1 - - @effect/rpc@0.54.1 - -## 0.52.0 - -### Patch Changes - -- Updated dependencies [[`88fe129`](https://github.com/Effect-TS/effect/commit/88fe12923740765c0335a6e6203fdcc6a463edca), [`d630249`](https://github.com/Effect-TS/effect/commit/d630249426113088abe8b382db4f14d80f2160c2), [`2976e52`](https://github.com/Effect-TS/effect/commit/2976e52538d9dc9ffdcbc84d4ac748cff9305971)]: - - @effect/platform@0.79.0 - - effect@3.13.9 - - @effect/rpc@0.54.0 - -## 0.51.1 - -### Patch Changes - -- Updated dependencies [[`c65d336`](https://github.com/Effect-TS/effect/commit/c65d3362d07ec815ff3b46278314e8a31706ddc2), [`22d2ebb`](https://github.com/Effect-TS/effect/commit/22d2ebb4b11f5a44351a4736e65da391a3b647d0)]: - - effect@3.13.8 - - @effect/platform@0.78.1 - - @effect/rpc@0.53.1 - -## 0.51.0 - -### Patch Changes - -- Updated dependencies [[`c5bcf53`](https://github.com/Effect-TS/effect/commit/c5bcf53b7cb49dacffdd2a6cd8eb48cc452b417e)]: - - @effect/platform@0.78.0 - - @effect/rpc@0.53.0 - -## 0.50.7 - -### Patch Changes - -- Updated dependencies [[`840cc73`](https://github.com/Effect-TS/effect/commit/840cc7329908db7ca693ef47b07d4f845c29cadd), [`9bf8a74`](https://github.com/Effect-TS/effect/commit/9bf8a74b967f18d931743dd5196af326c9118e9c), [`87ba23c`](https://github.com/Effect-TS/effect/commit/87ba23c41c193503ed0c612b0d32d0b253794c64), [`f910880`](https://github.com/Effect-TS/effect/commit/f91088069057f3b4529753f5bc5532b028d726df), [`0d01480`](https://github.com/Effect-TS/effect/commit/0d014803e4f688f74386a80abd65485e1a319244)]: - - @effect/platform@0.77.7 - - effect@3.13.7 - - @effect/rpc@0.52.7 - -## 0.50.6 - -### Patch Changes - -- Updated dependencies [[`3154ce4`](https://github.com/Effect-TS/effect/commit/3154ce4692fa18b804982158d3c4c8a8a5fae386)]: - - effect@3.13.6 - - @effect/platform@0.77.6 - - @effect/rpc@0.52.6 - -## 0.50.5 - -### Patch Changes - -- Updated dependencies [[`367bb35`](https://github.com/Effect-TS/effect/commit/367bb35f4c2a254e1fb211d96db2474a7aed9020), [`6cf11c3`](https://github.com/Effect-TS/effect/commit/6cf11c3a75773ceec2877c85ddc760f381f0866d), [`a0acec8`](https://github.com/Effect-TS/effect/commit/a0acec851f72e19466363d24b9cc218acd00006a)]: - - effect@3.13.5 - - @effect/platform@0.77.5 - - @effect/rpc@0.52.5 - -## 0.50.4 - -### Patch Changes - -- Updated dependencies [[`e0746f9`](https://github.com/Effect-TS/effect/commit/e0746f9aa398b69c6542e375910683bf17f49f46), [`17d9e89`](https://github.com/Effect-TS/effect/commit/17d9e89f9851663bdbb6c1e685601d97806114a4)]: - - @effect/platform@0.77.4 - - effect@3.13.4 - - @effect/rpc@0.52.4 - -## 0.50.3 - -### Patch Changes - -- Updated dependencies [[`cc5588d`](https://github.com/Effect-TS/effect/commit/cc5588df07f9103513547cb429ce041b9436a8bd), [`623c8cd`](https://github.com/Effect-TS/effect/commit/623c8cd053ed6ee3d353aaa8778d484670fca2bb), [`00b4eb1`](https://github.com/Effect-TS/effect/commit/00b4eb1ece12a16e222e6220965bb4024d6752ac), [`f2aee98`](https://github.com/Effect-TS/effect/commit/f2aee989b0a600900ce83e7f460d02908620c80f), [`fb798eb`](https://github.com/Effect-TS/effect/commit/fb798eb9061f1191badc017d1aa649360254da20), [`2251b15`](https://github.com/Effect-TS/effect/commit/2251b1528810bb695b37ce388b653cec0c5bf80c), [`2e15c1e`](https://github.com/Effect-TS/effect/commit/2e15c1e33648add0b29fe274fbcb7294b7515085), [`a4979db`](https://github.com/Effect-TS/effect/commit/a4979db021aef16e731be64df196b72088fc4376), [`b74255a`](https://github.com/Effect-TS/effect/commit/b74255a304ad49d60bedb1a260fd697f370af27a), [`d7f6a5c`](https://github.com/Effect-TS/effect/commit/d7f6a5c7d26c1963dcd864ca62360d20d08c7b49), [`9dd8979`](https://github.com/Effect-TS/effect/commit/9dd8979e940915b1cc1b1f264f3d019c77a65a02), [`477b488`](https://github.com/Effect-TS/effect/commit/477b488284f47c5469d7fba3e4065fb7e3b6556e), [`10932cb`](https://github.com/Effect-TS/effect/commit/10932cbf58fc721ada631cebec42f773ce96d3cc), [`9f6c784`](https://github.com/Effect-TS/effect/commit/9f6c78468b3b5e9ebfc38ffdfb70702901ee977b), [`2c639ec`](https://github.com/Effect-TS/effect/commit/2c639ecee332de4266e36022c989c35ae4e02105), [`886aaa8`](https://github.com/Effect-TS/effect/commit/886aaa81e06dfd3cd9391e8ea987d8cd5ada1124)]: - - effect@3.13.3 - - @effect/platform@0.77.3 - - @effect/rpc@0.52.3 - -## 0.50.2 - -### Patch Changes - -- Updated dependencies [[`31be72a`](https://github.com/Effect-TS/effect/commit/31be72ada118cb84a942e67b1663263f8db74a9f), [`3e7ce97`](https://github.com/Effect-TS/effect/commit/3e7ce97f8a41756a039cf635d0b3d9a75d781097), [`31be72a`](https://github.com/Effect-TS/effect/commit/31be72ada118cb84a942e67b1663263f8db74a9f)]: - - effect@3.13.2 - - @effect/platform@0.77.2 - - @effect/rpc@0.52.2 - -## 0.50.1 - -### Patch Changes - -- Updated dependencies [[`b56a211`](https://github.com/Effect-TS/effect/commit/b56a2110569fd0ec0b57ac137743e926d49f51cc)]: - - effect@3.13.1 - - @effect/platform@0.77.1 - - @effect/rpc@0.52.1 - -## 0.50.0 - -### Patch Changes - -- Updated dependencies [[`8baef83`](https://github.com/Effect-TS/effect/commit/8baef83e7ff0b7bc0738b680e1ef013065386cff), [`655bfe2`](https://github.com/Effect-TS/effect/commit/655bfe29e44cc3f0fb9b4e53038f50b891c188df), [`d90cbc2`](https://github.com/Effect-TS/effect/commit/d90cbc274e2742d18671fe65aa4764c057eb6cba), [`75632bd`](https://github.com/Effect-TS/effect/commit/75632bd44b8025101d652ccbaeef898c7086c91c), [`c874a2e`](https://github.com/Effect-TS/effect/commit/c874a2e4b17e9d71904ca8375bb77b020975cb1d), [`bf865e5`](https://github.com/Effect-TS/effect/commit/bf865e5833f77fd8f6c06944ca9d507b54488301), [`f98b2b7`](https://github.com/Effect-TS/effect/commit/f98b2b7592cf20f9d85313e7f1e964cb65878138), [`de8ce92`](https://github.com/Effect-TS/effect/commit/de8ce924923eaa4e1b761a97eb45ec967389f3d5), [`cf8b2dd`](https://github.com/Effect-TS/effect/commit/cf8b2dd112f8e092ed99d78fd728db0f91c29050), [`db426a5`](https://github.com/Effect-TS/effect/commit/db426a5fb41ab84d18e3c8753a7329b4de544245), [`6862444`](https://github.com/Effect-TS/effect/commit/6862444094906ad4f2cb077ff3b9cc0b73880c8c), [`5fc8a90`](https://github.com/Effect-TS/effect/commit/5fc8a90ba46a5fd9f3b643f0b5aeadc69d717339), [`546a492`](https://github.com/Effect-TS/effect/commit/546a492e60eb2b8b048a489a474b934ea0877005), [`65c4796`](https://github.com/Effect-TS/effect/commit/65c47966ce39055f02cf5c808daabb3ea6442b0b), [`9760fdc`](https://github.com/Effect-TS/effect/commit/9760fdc37bdaef9da8b150e46b86ddfbe2ad9221), [`5b471e7`](https://github.com/Effect-TS/effect/commit/5b471e7d4317e8ee5d72bbbd3e0c9775160949ab), [`4f810cc`](https://github.com/Effect-TS/effect/commit/4f810cc2770e9f1f266851d2cb6257112c12af49)]: - - effect@3.13.0 - - @effect/platform@0.77.0 - - @effect/rpc@0.52.0 - -## 0.49.1 - -### Patch Changes - -- Updated dependencies [[`4018eae`](https://github.com/Effect-TS/effect/commit/4018eaed2733241676ddb8c52416f463a8c32e35), [`543d36d`](https://github.com/Effect-TS/effect/commit/543d36d1a11452560b01ab966a82529ad5fee8c9), [`c407726`](https://github.com/Effect-TS/effect/commit/c407726f79df4a567a9631cddd8effaa16b3535d), [`f70a65a`](https://github.com/Effect-TS/effect/commit/f70a65ac80c6635d80b12beaf4d32a9cc59fa143), [`ba409f6`](https://github.com/Effect-TS/effect/commit/ba409f69c41aeaa29e475c0630735726eaf4dbac), [`3d2e356`](https://github.com/Effect-TS/effect/commit/3d2e3565e8a43d1bdb5daee8db3b90f56d71d859)]: - - effect@3.12.12 - - @effect/platform@0.76.1 - - @effect/rpc@0.51.1 - -## 0.49.0 - -### Patch Changes - -- Updated dependencies [[`b6a032f`](https://github.com/Effect-TS/effect/commit/b6a032f07bffa020a848c813881879395134fa20), [`42ddd5f`](https://github.com/Effect-TS/effect/commit/42ddd5f144ce9f9d94a036679ebbd626446d37f5), [`2fe447c`](https://github.com/Effect-TS/effect/commit/2fe447c6354d334f9c591b8a8481818f5f0e797e), [`2473ad5`](https://github.com/Effect-TS/effect/commit/2473ad5cf23582e3a41338091fa526ffe611288d)]: - - effect@3.12.11 - - @effect/platform@0.76.0 - - @effect/rpc@0.51.0 - -## 0.48.4 - -### Patch Changes - -- Updated dependencies [[`e30f132`](https://github.com/Effect-TS/effect/commit/e30f132c336c9d0760bad39f82a55c7ce5159eb7), [`33fa667`](https://github.com/Effect-TS/effect/commit/33fa667c2623be1026e1ccee91bd44f73b09020a), [`87f5f28`](https://github.com/Effect-TS/effect/commit/87f5f2842e4196cb88d13f10f443ff0567e82832), [`7d57ecd`](https://github.com/Effect-TS/effect/commit/7d57ecdaf5da2345ebbf9c22df50317578bde0f5), [`4dbd170`](https://github.com/Effect-TS/effect/commit/4dbd170538e8fb7a36aa7c469c6f93b6c7000091)]: - - effect@3.12.10 - - @effect/platform@0.75.4 - - @effect/rpc@0.50.4 - -## 0.48.3 - -### Patch Changes - -- Updated dependencies [[`1b4a4e9`](https://github.com/Effect-TS/effect/commit/1b4a4e904ef5227ec7d9114d4e417eca19eed940)]: - - effect@3.12.9 - - @effect/platform@0.75.3 - - @effect/rpc@0.50.3 - -## 0.48.2 - -### Patch Changes - -- Updated dependencies [[`59b3cfb`](https://github.com/Effect-TS/effect/commit/59b3cfbbd5713dd9475998e95fad5534c0b21466), [`766113c`](https://github.com/Effect-TS/effect/commit/766113c0ea3512cdb887650ead8ba314236e22ee), [`bb05fb8`](https://github.com/Effect-TS/effect/commit/bb05fb83457355b1ca567228a9e041edfb6fd85d), [`712277f`](https://github.com/Effect-TS/effect/commit/712277f949052a24b46e4aa234063a6abf395c90), [`f269122`](https://github.com/Effect-TS/effect/commit/f269122508693b111142994dd48698ddc75f3d69), [`8f6006a`](https://github.com/Effect-TS/effect/commit/8f6006a610fb6d6c7b8d14209a7323338a8964ff), [`c45b559`](https://github.com/Effect-TS/effect/commit/c45b5592b5fd1189a5c932cfe05bd7d5f6d68508), [`430c846`](https://github.com/Effect-TS/effect/commit/430c846cbac05b187e3d24ac8dfee0cf22506f7c), [`7b03057`](https://github.com/Effect-TS/effect/commit/7b03057507d2dab5e6793beb9c578dedaaeb15fe), [`a9c94c8`](https://github.com/Effect-TS/effect/commit/a9c94c807755610831211a686d2fad849ab38eb4), [`107e6f0`](https://github.com/Effect-TS/effect/commit/107e6f0557a1e2d3b0dce25d62fa1e2601521752), [`c9175ae`](https://github.com/Effect-TS/effect/commit/c9175aef41cb1e3b689d0ac0a4f53d8107376b58), [`65c11b9`](https://github.com/Effect-TS/effect/commit/65c11b9266ec9447c31c26fe3ed35c73bd3b81fd), [`e386d2f`](https://github.com/Effect-TS/effect/commit/e386d2f1b3ab3ac2c14ee76de11f5963d32a3df4), [`9172efb`](https://github.com/Effect-TS/effect/commit/9172efba98bc6a82353e6ec2af61ac08f038ba64)]: - - @effect/platform@0.75.2 - - effect@3.12.8 - - @effect/rpc@0.50.2 - -## 0.48.1 - -### Patch Changes - -- Updated dependencies [[`8dff1d1`](https://github.com/Effect-TS/effect/commit/8dff1d1bff76cdba643cad7f0bf864300f08bc61)]: - - effect@3.12.7 - - @effect/platform@0.75.1 - - @effect/rpc@0.50.1 - -## 0.48.0 - -### Patch Changes - -- Updated dependencies [[`5e43ce5`](https://github.com/Effect-TS/effect/commit/5e43ce50bae116865906112e7f88d390739d778b), [`289c13b`](https://github.com/Effect-TS/effect/commit/289c13b38e8e35b214d46d385d05dead176c87cd), [`76eb7d0`](https://github.com/Effect-TS/effect/commit/76eb7d0fbce3c009c8f77e84c178cb15bbed9709), [`8b4e75d`](https://github.com/Effect-TS/effect/commit/8b4e75d35daea807c447ca760948a717aa66bb52), [`fc5e0f0`](https://github.com/Effect-TS/effect/commit/fc5e0f0d357a0051cfa01c1ede83ffdd3cb41ab1), [`004fd2b`](https://github.com/Effect-TS/effect/commit/004fd2bbd1459e64fb1b57f02eeb791ca5ea1ea5), [`b2a31be`](https://github.com/Effect-TS/effect/commit/b2a31be85c35d891351ce4f9a2cc93ece0c257f6), [`5514d05`](https://github.com/Effect-TS/effect/commit/5514d05b5cd586ff5868b8bd41c959e95e6c33cd), [`bf5f0ae`](https://github.com/Effect-TS/effect/commit/bf5f0ae9daa0170471678e22585e8ec14ce667bb), [`3b19bcf`](https://github.com/Effect-TS/effect/commit/3b19bcfd3aaadb6c9253428622df524537c8e626), [`b064b3b`](https://github.com/Effect-TS/effect/commit/b064b3b293615fd268cc5a5647d0981eb67750b8), [`eb264ed`](https://github.com/Effect-TS/effect/commit/eb264ed8a6e8c92a9dc7006f766c6ca2e5d29e03), [`289c13b`](https://github.com/Effect-TS/effect/commit/289c13b38e8e35b214d46d385d05dead176c87cd), [`f474678`](https://github.com/Effect-TS/effect/commit/f474678bf10b8f1c80e3dc096ddc7ecf20b2b23e), [`ee187d0`](https://github.com/Effect-TS/effect/commit/ee187d098007a402844c94d04f0cd8f07695377a)]: - - @effect/platform@0.75.0 - - effect@3.12.6 - - @effect/rpc@0.50.0 - -## 0.47.0 - -### Patch Changes - -- Updated dependencies [[`a8b0ddb`](https://github.com/Effect-TS/effect/commit/a8b0ddb84710054799fc8f57485b95d00093ada1), [`8653072`](https://github.com/Effect-TS/effect/commit/86530720d7a03e118d2c5a8bf5a997cee7e7f3d6), [`507d546`](https://github.com/Effect-TS/effect/commit/507d546bd49db31000425fb5da88c434e4291bea), [`a8b0ddb`](https://github.com/Effect-TS/effect/commit/a8b0ddb84710054799fc8f57485b95d00093ada1), [`8db239b`](https://github.com/Effect-TS/effect/commit/8db239b9c869a3707f6566b9d9dbdf53c4df03fc), [`84a0911`](https://github.com/Effect-TS/effect/commit/84a091181634c3a022c94234cec7764a3aeef1be), [`84a0911`](https://github.com/Effect-TS/effect/commit/84a091181634c3a022c94234cec7764a3aeef1be), [`3179a9f`](https://github.com/Effect-TS/effect/commit/3179a9f65d23369a6a9a1f80f7750566dd28df22), [`6cb9b76`](https://github.com/Effect-TS/effect/commit/6cb9b766396d0b2ed995cf26957359713efd202e), [`1fcbe55`](https://github.com/Effect-TS/effect/commit/1fcbe55345042d8468f6a98c84081bd00b6bcf5a), [`d9a63d9`](https://github.com/Effect-TS/effect/commit/d9a63d9d385653865954cac895065360d54cc56b), [`6cb9b76`](https://github.com/Effect-TS/effect/commit/6cb9b766396d0b2ed995cf26957359713efd202e)]: - - effect@3.12.5 - - @effect/platform@0.74.0 - - @effect/rpc@0.49.0 - -## 0.46.1 - -### Patch Changes - -- Updated dependencies [[`5b50ea4`](https://github.com/Effect-TS/effect/commit/5b50ea4a10cf9acd51f9624b2474d9d5ded74019), [`c170a68`](https://github.com/Effect-TS/effect/commit/c170a68b6266100774461fcd6c0e0fabb60112f2), [`a66c2eb`](https://github.com/Effect-TS/effect/commit/a66c2eb473245092cd41f04c2eb2b7b02cf53718), [`c9e5e1b`](https://github.com/Effect-TS/effect/commit/c9e5e1be17c0c84d3d4e2abc3c60215cdb56bbbe), [`7b3d58d`](https://github.com/Effect-TS/effect/commit/7b3d58d7aec2152ec282460871d3e9de45ed254d)]: - - effect@3.12.4 - - @effect/platform@0.73.1 - - @effect/rpc@0.48.1 - -## 0.46.0 - -### Patch Changes - -- Updated dependencies [[`d7dac48`](https://github.com/Effect-TS/effect/commit/d7dac48a477cdfeec509dbe9f33fce6a1b02b63d), [`c110032`](https://github.com/Effect-TS/effect/commit/c110032322450a8824ba38ae24335a538cd2ce9a), [`1d7fd2b`](https://github.com/Effect-TS/effect/commit/1d7fd2b7ee8eeecc912d27adf76ed897db236dc5), [`1d7fd2b`](https://github.com/Effect-TS/effect/commit/1d7fd2b7ee8eeecc912d27adf76ed897db236dc5), [`23ac740`](https://github.com/Effect-TS/effect/commit/23ac740c7dd4610b7d265c2071b88b0968419e9a), [`8cd7319`](https://github.com/Effect-TS/effect/commit/8cd7319b6568bfc7a30ca16c104d189e37eac3a0)]: - - effect@3.12.3 - - @effect/platform@0.73.0 - - @effect/rpc@0.48.0 - -## 0.45.2 - -### Patch Changes - -- Updated dependencies [[`734af82`](https://github.com/Effect-TS/effect/commit/734af82138e78b9c57a8355b1c6b80e80d38b222), [`b63c780`](https://github.com/Effect-TS/effect/commit/b63c78010893101520448ddda7019c487cf7eedd), [`212e784`](https://github.com/Effect-TS/effect/commit/212e78475f527147ec27c090bd13f789f55add7a), [`f852cb0`](https://github.com/Effect-TS/effect/commit/f852cb02040ea2f165e9b449615b8b1366add5d5), [`7276ae2`](https://github.com/Effect-TS/effect/commit/7276ae21062896adbb7508ac5b2dece95316322f), [`212e784`](https://github.com/Effect-TS/effect/commit/212e78475f527147ec27c090bd13f789f55add7a), [`212e784`](https://github.com/Effect-TS/effect/commit/212e78475f527147ec27c090bd13f789f55add7a), [`212e784`](https://github.com/Effect-TS/effect/commit/212e78475f527147ec27c090bd13f789f55add7a), [`c640d77`](https://github.com/Effect-TS/effect/commit/c640d77b33ad417876f4e8ffe8574ee6cbe5607f), [`0def088`](https://github.com/Effect-TS/effect/commit/0def0887cfdb6755729a64dfd52b3b9f46b0576c)]: - - effect@3.12.2 - - @effect/platform@0.72.2 - - @effect/rpc@0.47.2 - -## 0.45.1 - -### Patch Changes - -- Updated dependencies [[`302b57d`](https://github.com/Effect-TS/effect/commit/302b57d2cbf9b9ccc17450945aeebfb33cfe8d43), [`0988083`](https://github.com/Effect-TS/effect/commit/0988083d4594938590df5a287e5b27d38526dd07), [`8b46be6`](https://github.com/Effect-TS/effect/commit/8b46be6a3b8160362ab5ea9171c5e6932505125c), [`bfe8027`](https://github.com/Effect-TS/effect/commit/bfe802734b450a4b4ee069d1125dd37995db2bff), [`16dd657`](https://github.com/Effect-TS/effect/commit/16dd657033d8afac2ffea567b3c8bb27c9b249b6), [`39db211`](https://github.com/Effect-TS/effect/commit/39db211414e90c8db8fdad7dc8ce5b4661bcfaef)]: - - effect@3.12.1 - - @effect/platform@0.72.1 - - @effect/rpc@0.47.1 - -## 0.45.0 - -### Patch Changes - -- Updated dependencies [[`abb22a4`](https://github.com/Effect-TS/effect/commit/abb22a429b9c52c31e84856294f175d2064a9b4d), [`f369a89`](https://github.com/Effect-TS/effect/commit/f369a89e98bc682969803b9304adaf4557bb36c2), [`642376c`](https://github.com/Effect-TS/effect/commit/642376c63fd7d78754db991631a4d50a5dc79aa3), [`3d2b7a7`](https://github.com/Effect-TS/effect/commit/3d2b7a7e942a7157afae5b1cdbc6f3fef116428e), [`ef64c6f`](https://github.com/Effect-TS/effect/commit/ef64c6fec0d47da573c04230dde9ea729366d871), [`73f9c6f`](https://github.com/Effect-TS/effect/commit/73f9c6f2ff091512cf904cc54ab59965b86e87c8), [`17cb451`](https://github.com/Effect-TS/effect/commit/17cb4514590e8a86263f7aed009f24da8a237342), [`d801820`](https://github.com/Effect-TS/effect/commit/d80182060c2ee945d7e0e4728812abf9465a0d6a), [`e1eeb2d`](https://github.com/Effect-TS/effect/commit/e1eeb2d7064b3870041dab142f3057970699bbf1), [`c11f3a6`](https://github.com/Effect-TS/effect/commit/c11f3a60a05c3b5fc8e7ce90136728154dc505b0), [`618f7e0`](https://github.com/Effect-TS/effect/commit/618f7e092a1011e5090dca1e69b5e9285689654b), [`c0ba834`](https://github.com/Effect-TS/effect/commit/c0ba834d1995cf5a8b250e4780fd43f3e3881151), [`e1eeb2d`](https://github.com/Effect-TS/effect/commit/e1eeb2d7064b3870041dab142f3057970699bbf1)]: - - effect@3.12.0 - - @effect/platform@0.72.0 - - @effect/rpc@0.47.0 - -## 0.44.7 - -### Patch Changes - -- Updated dependencies [[`39457d4`](https://github.com/Effect-TS/effect/commit/39457d4897d9bc7df8af5c05d352866bbeae82eb), [`a475cc2`](https://github.com/Effect-TS/effect/commit/a475cc25fd7c9f26b27a8e98f8fbe43cc9e6ee3e), [`199214e`](https://github.com/Effect-TS/effect/commit/199214e21c616d8a0ccd7ed5f92e944e6c580193), [`b3c160d`](https://github.com/Effect-TS/effect/commit/b3c160d7a1fdfc2d3fb2440530f1ab80efc65133)]: - - effect@3.11.10 - - @effect/platform@0.71.7 - - @effect/rpc@0.46.7 - -## 0.44.6 - -### Patch Changes - -- Updated dependencies [[`1c08a0b`](https://github.com/Effect-TS/effect/commit/1c08a0b8505badcffb4d9cade5a746ea90c9557e), [`1ce703b`](https://github.com/Effect-TS/effect/commit/1ce703b041bbd7560c5c437c9b9be48f027937fd), [`1ce703b`](https://github.com/Effect-TS/effect/commit/1ce703b041bbd7560c5c437c9b9be48f027937fd)]: - - effect@3.11.9 - - @effect/platform@0.71.6 - - @effect/rpc@0.46.6 - -## 0.44.5 - -### Patch Changes - -- Updated dependencies [[`05d71f8`](https://github.com/Effect-TS/effect/commit/05d71f85622305705d8316817694a09762e60865), [`e66b920`](https://github.com/Effect-TS/effect/commit/e66b9205f25ab425d30640886eb3fb2c4715bc26)]: - - @effect/platform@0.71.5 - - @effect/rpc@0.46.5 - -## 0.44.4 - -### Patch Changes - -- Updated dependencies [[`909181a`](https://github.com/Effect-TS/effect/commit/909181a9ce9052a80432ccf52187e0723004bf7f), [`909181a`](https://github.com/Effect-TS/effect/commit/909181a9ce9052a80432ccf52187e0723004bf7f), [`1a6b52d`](https://github.com/Effect-TS/effect/commit/1a6b52dcf020d36e38a7bc90b648152cf5a8ccba)]: - - @effect/platform@0.71.4 - - effect@3.11.8 - - @effect/rpc@0.46.4 - -## 0.44.3 - -### Patch Changes - -- Updated dependencies [[`6984508`](https://github.com/Effect-TS/effect/commit/6984508c87f1bd91213b44c19b25ab5e2dcc1ce0), [`883639c`](https://github.com/Effect-TS/effect/commit/883639cc8ce47757f1cd39439391a8028c0812fe)]: - - @effect/platform@0.71.3 - - @effect/rpc@0.46.3 - -## 0.44.2 - -### Patch Changes - -- Updated dependencies [[`2408616`](https://github.com/Effect-TS/effect/commit/24086163b60b09cc6d0885bd565ef080dcbe866b), [`cec0b4d`](https://github.com/Effect-TS/effect/commit/cec0b4d152ef660be2ccdb0927255f2471436e6e), [`cec0b4d`](https://github.com/Effect-TS/effect/commit/cec0b4d152ef660be2ccdb0927255f2471436e6e), [`8d978c5`](https://github.com/Effect-TS/effect/commit/8d978c53f6fcc98d9d645ecba3e4b55d4297dd36), [`cec0b4d`](https://github.com/Effect-TS/effect/commit/cec0b4d152ef660be2ccdb0927255f2471436e6e), [`cec0b4d`](https://github.com/Effect-TS/effect/commit/cec0b4d152ef660be2ccdb0927255f2471436e6e)]: - - effect@3.11.7 - - @effect/platform@0.71.2 - - @effect/rpc@0.46.2 - -## 0.44.1 - -### Patch Changes - -- Updated dependencies [[`1d3df5b`](https://github.com/Effect-TS/effect/commit/1d3df5bc4324e88a392c348db35fd9d029c7b25e)]: - - @effect/platform@0.71.1 - - @effect/rpc@0.46.1 - -## 0.44.0 - -### Patch Changes - -- Updated dependencies [[`662d1ce`](https://github.com/Effect-TS/effect/commit/662d1ce6fb7da384a95888d5b2bb5605bdf3208d), [`c99a0f3`](https://github.com/Effect-TS/effect/commit/c99a0f376d049d3793ed33e146d9873b8a5e5b78), [`11fc401`](https://github.com/Effect-TS/effect/commit/11fc401f436f99bf4be95f56d50b0e4bdfe5edea), [`c99a0f3`](https://github.com/Effect-TS/effect/commit/c99a0f376d049d3793ed33e146d9873b8a5e5b78), [`31c62d8`](https://github.com/Effect-TS/effect/commit/31c62d83cbdcf9850a8b5331faa239601c60f78a)]: - - effect@3.11.6 - - @effect/platform@0.71.0 - - @effect/rpc@0.46.0 - -## 0.43.7 - -### Patch Changes - -- Updated dependencies [[`9f5a6f7`](https://github.com/Effect-TS/effect/commit/9f5a6f701bf7ba31adccd1f1bcfa8ab5614c9be8), [`22905cf`](https://github.com/Effect-TS/effect/commit/22905cf5addfb1ff3d2a6135c52036be958ae911), [`9f5a6f7`](https://github.com/Effect-TS/effect/commit/9f5a6f701bf7ba31adccd1f1bcfa8ab5614c9be8), [`1e59e4f`](https://github.com/Effect-TS/effect/commit/1e59e4fd778da18296812a2a32f36ca8ae50f60d), [`9f5a6f7`](https://github.com/Effect-TS/effect/commit/9f5a6f701bf7ba31adccd1f1bcfa8ab5614c9be8), [`8d914e5`](https://github.com/Effect-TS/effect/commit/8d914e504e7a22d0ea628e8af265ee450ff9530f), [`03bb00f`](https://github.com/Effect-TS/effect/commit/03bb00faa74f9e168a54a8cc0828a664fbb1ab05), [`9f5a6f7`](https://github.com/Effect-TS/effect/commit/9f5a6f701bf7ba31adccd1f1bcfa8ab5614c9be8), [`14e1149`](https://github.com/Effect-TS/effect/commit/14e1149f1af5a022f06eb8c2e4ba9fec17fe7426), [`9f5a6f7`](https://github.com/Effect-TS/effect/commit/9f5a6f701bf7ba31adccd1f1bcfa8ab5614c9be8), [`9f5a6f7`](https://github.com/Effect-TS/effect/commit/9f5a6f701bf7ba31adccd1f1bcfa8ab5614c9be8)]: - - effect@3.11.5 - - @effect/platform@0.70.7 - - @effect/rpc@0.45.7 - -## 0.43.6 - -### Patch Changes - -- Updated dependencies [[`9a5b8e3`](https://github.com/Effect-TS/effect/commit/9a5b8e36d184bd4967a88752cb6e755e1be263af)]: - - @effect/platform@0.70.6 - - @effect/rpc@0.45.6 - -## 0.43.5 - -### Patch Changes - -- Updated dependencies [[`415f4c9`](https://github.com/Effect-TS/effect/commit/415f4c98321868531727a83cbaad70164f5e4c40), [`518b258`](https://github.com/Effect-TS/effect/commit/518b258a8a67ecd332a9252c35cc060f8368dee2), [`6e323a3`](https://github.com/Effect-TS/effect/commit/6e323a36faaee46b328c8e3cf60a76b3aff9907f), [`518b258`](https://github.com/Effect-TS/effect/commit/518b258a8a67ecd332a9252c35cc060f8368dee2), [`6e323a3`](https://github.com/Effect-TS/effect/commit/6e323a36faaee46b328c8e3cf60a76b3aff9907f)]: - - @effect/platform@0.70.5 - - effect@3.11.4 - - @effect/rpc@0.45.5 - -## 0.43.4 - -### Patch Changes - -- Updated dependencies [[`90906f7`](https://github.com/Effect-TS/effect/commit/90906f7f154b12c7182e8f39e3c55ef3937db857), [`3862cd3`](https://github.com/Effect-TS/effect/commit/3862cd3c7f6a542ed65fb81255b3bd696ce2f567), [`3862cd3`](https://github.com/Effect-TS/effect/commit/3862cd3c7f6a542ed65fb81255b3bd696ce2f567), [`343b6aa`](https://github.com/Effect-TS/effect/commit/343b6aa6ac4a74276bfc7c63ccbf4a1d72bc1bed), [`afba339`](https://github.com/Effect-TS/effect/commit/afba339adc11dad56b5a3b7ca94487e58f34d613)]: - - effect@3.11.3 - - @effect/platform@0.70.4 - - @effect/rpc@0.45.4 - -## 0.43.3 - -### Patch Changes - -- Updated dependencies [[`7044730`](https://github.com/Effect-TS/effect/commit/70447306be1aeeb7d87c230b2a96ec87b993ede9)]: - - @effect/platform@0.70.3 - - @effect/rpc@0.45.3 - -## 0.43.2 - -### Patch Changes - -- Updated dependencies [[`01cee56`](https://github.com/Effect-TS/effect/commit/01cee560b58d94b24cc20e98083251b73e658b41), [`c2249ea`](https://github.com/Effect-TS/effect/commit/c2249ea13fd98ab7d9aa628787931356d8ec2860), [`1358aa5`](https://github.com/Effect-TS/effect/commit/1358aa5326eaa85ef13ee8d1fed0b4a4288ed3eb), [`1de3fe7`](https://github.com/Effect-TS/effect/commit/1de3fe7d1cbafd6391eaa38c2300b99e332cc2aa)]: - - effect@3.11.2 - - @effect/platform@0.70.2 - - @effect/rpc@0.45.2 - -## 0.43.1 - -### Patch Changes - -- Updated dependencies [[`dd8a2d8`](https://github.com/Effect-TS/effect/commit/dd8a2d8e80d33b16719fc69361eaedf0b59d4620), [`a71bfef`](https://github.com/Effect-TS/effect/commit/a71bfef46f5061bb2502a61a333638a987b62273)]: - - effect@3.11.1 - - @effect/platform@0.70.1 - - @effect/rpc@0.45.1 - -## 0.43.0 - -### Patch Changes - -- Updated dependencies [[`147434b`](https://github.com/Effect-TS/effect/commit/147434b03d5e1fd692dd9f126e5ab0910f3b76d3), [`6e69493`](https://github.com/Effect-TS/effect/commit/6e694930048bbaf98110f35f41566aeb9752d471), [`147434b`](https://github.com/Effect-TS/effect/commit/147434b03d5e1fd692dd9f126e5ab0910f3b76d3), [`5eff3f6`](https://github.com/Effect-TS/effect/commit/5eff3f6fa3aae7e86948a62cbfd63b8d6c3bdf92), [`d9fe79b`](https://github.com/Effect-TS/effect/commit/d9fe79bb5a3fe105d8e7a3bc2922a8ad936a5d10), [`251d189`](https://github.com/Effect-TS/effect/commit/251d189420bbba71990574e91098c499065f9a9b), [`5a259f3`](https://github.com/Effect-TS/effect/commit/5a259f3711b4369f55d885b568bdb21136155261), [`b4ce4ea`](https://github.com/Effect-TS/effect/commit/b4ce4ea7fd514a7e572f2dcd879c98f334981b0e), [`15fcc5a`](https://github.com/Effect-TS/effect/commit/15fcc5a0ea4bbf40ab48fa6a04fdda74f76f4c07), [`9bc9a47`](https://github.com/Effect-TS/effect/commit/9bc9a476800dc645903c888a68bb1d3baa3383c6), [`aadb8a4`](https://github.com/Effect-TS/effect/commit/aadb8a48d2cba197c06ec9996505510e48e4e5cb), [`1e2747c`](https://github.com/Effect-TS/effect/commit/1e2747c63a4820d1459cbbc88c71212983bd68bd), [`9264162`](https://github.com/Effect-TS/effect/commit/9264162a82783a651776fb7b87604564a63e7070), [`e0b9b09`](https://github.com/Effect-TS/effect/commit/e0b9b09e70c386b2da17d1f0a15b0511861c89e8), [`c36f3b9`](https://github.com/Effect-TS/effect/commit/c36f3b95df5ce9d71b66f22f26ce12eda8d3e848), [`672bde5`](https://github.com/Effect-TS/effect/commit/672bde5bec51c7d6f9862828e6a654cb2cb6f93d), [`aadb8a4`](https://github.com/Effect-TS/effect/commit/aadb8a48d2cba197c06ec9996505510e48e4e5cb)]: - - effect@3.11.0 - - @effect/platform@0.70.0 - - @effect/rpc@0.45.0 - -## 0.42.32 - -### Patch Changes - -- Updated dependencies [[`3069614`](https://github.com/Effect-TS/effect/commit/30696149271129fc618f6f2ccd1d8f2f6c0f9cd7), [`09a5e52`](https://github.com/Effect-TS/effect/commit/09a5e522fd9b221f05d85b1d1c8a740d4973c302)]: - - effect@3.10.20 - - @effect/platform@0.69.32 - - @effect/rpc@0.44.32 - -## 0.42.31 - -### Patch Changes - -- Updated dependencies [[`e6d4a37`](https://github.com/Effect-TS/effect/commit/e6d4a37c1d7e657b5ea44063a1cf586808228fe5)]: - - @effect/platform@0.69.31 - - @effect/rpc@0.44.31 - -## 0.42.30 - -### Patch Changes - -- Updated dependencies [[`270f199`](https://github.com/Effect-TS/effect/commit/270f199b31810fd643e4c22818698adcbdb5d396)]: - - @effect/platform@0.69.30 - - @effect/rpc@0.44.30 - -## 0.42.29 - -### Patch Changes - -- Updated dependencies [[`24cc35e`](https://github.com/Effect-TS/effect/commit/24cc35e26d6ed4a076470bc687ffd99cc50991b3)]: - - @effect/platform@0.69.29 - - @effect/rpc@0.44.29 - -## 0.42.28 - -### Patch Changes - -- Updated dependencies [[`edd72be`](https://github.com/Effect-TS/effect/commit/edd72be57b904d60c9cbffc2537901821a9da537), [`a3e2771`](https://github.com/Effect-TS/effect/commit/a3e277170a1f7cf61fd629acb60304c7e81d9498), [`944025b`](https://github.com/Effect-TS/effect/commit/944025bc5ce139f4a85846aa689bf30ec06a8ec1), [`54addee`](https://github.com/Effect-TS/effect/commit/54addee438a644bf010646c52042c7b89c5fc0a7), [`a9e00e4`](https://github.com/Effect-TS/effect/commit/a9e00e43f0b5dd22c1f9d5b78be6383daea09c20)]: - - @effect/platform@0.69.28 - - effect@3.10.19 - - @effect/rpc@0.44.28 - -## 0.42.27 - -### Patch Changes - -- Updated dependencies [[`af409cf`](https://github.com/Effect-TS/effect/commit/af409cf1d2ff973be11cc079ea373eaeedca25de), [`beaccae`](https://github.com/Effect-TS/effect/commit/beaccae2d15931e9fe475fb50a0b3638243fe3f7)]: - - effect@3.10.18 - - @effect/platform@0.69.27 - - @effect/rpc@0.44.27 - -## 0.42.26 - -### Patch Changes - -- Updated dependencies [[`c963886`](https://github.com/Effect-TS/effect/commit/c963886d5817986fcbd6bfa4ddf50aca8b6c8184), [`42c4ce6`](https://github.com/Effect-TS/effect/commit/42c4ce6f8d8c7d847e97757650a8ad9419a829d7)]: - - @effect/platform@0.69.26 - - effect@3.10.17 - - @effect/rpc@0.44.26 - -## 0.42.25 - -### Patch Changes - -- Updated dependencies [[`320557a`](https://github.com/Effect-TS/effect/commit/320557ab18d13c5e22fc7dc0d2a157eae461012f), [`4dca30c`](https://github.com/Effect-TS/effect/commit/4dca30cfcdafe4542e236489f71d6f171a5b4e38), [`1d99867`](https://github.com/Effect-TS/effect/commit/1d998671be3cd11043f232822e91dd8c98fccfa9), [`6dae414`](https://github.com/Effect-TS/effect/commit/6dae4147991a97ec14a99289bd25fadae7541e8d), [`6b0d737`](https://github.com/Effect-TS/effect/commit/6b0d737078bf63b97891e6bc47affc04b28f9cf7), [`d8356aa`](https://github.com/Effect-TS/effect/commit/d8356aad428a0c2290db52380220f81d9ec94232), [`7b93dd6`](https://github.com/Effect-TS/effect/commit/7b93dd622e2ab79c7072d79d0d9611e446202201)]: - - @effect/platform@0.69.25 - - effect@3.10.16 - - @effect/rpc@0.44.25 - -## 0.42.24 - -### Patch Changes - -- Updated dependencies [[`3cc6514`](https://github.com/Effect-TS/effect/commit/3cc6514d2dd64e010cb760cc29bfce98c349bb10)]: - - @effect/platform@0.69.24 - - @effect/rpc@0.44.24 - -## 0.42.23 - -### Patch Changes - -- Updated dependencies [[`3aff4d3`](https://github.com/Effect-TS/effect/commit/3aff4d38837c213bb2987973dc4b98febb9f92d2)]: - - @effect/platform@0.69.23 - - @effect/rpc@0.44.23 - -## 0.42.22 - -### Patch Changes - -- Updated dependencies [[`8398b32`](https://github.com/Effect-TS/effect/commit/8398b3208242a88239d4449910b7baf923cfe3b6), [`72e55b7`](https://github.com/Effect-TS/effect/commit/72e55b7c610784fcebdbadc592c876e23e76a986)]: - - effect@3.10.15 - - @effect/platform@0.69.22 - - @effect/rpc@0.44.22 - -## 0.42.21 - -### Patch Changes - -- Updated dependencies [[`f983946`](https://github.com/Effect-TS/effect/commit/f9839467b4cad6e788297764ef9f9f0b9fd203f9), [`2d8a750`](https://github.com/Effect-TS/effect/commit/2d8a75081eb83a0a81f817fdf6f428369c5064ab)]: - - effect@3.10.14 - - @effect/platform@0.69.21 - - @effect/rpc@0.44.21 - -## 0.42.20 - -### Patch Changes - -- Updated dependencies [[`995bbdf`](https://github.com/Effect-TS/effect/commit/995bbdffea2e332f203cd5b474cd6a1c77dfa6ae)]: - - effect@3.10.13 - - @effect/platform@0.69.20 - - @effect/rpc@0.44.20 - -## 0.42.19 - -### Patch Changes - -- Updated dependencies [[`eb8c52d`](https://github.com/Effect-TS/effect/commit/eb8c52d8b4c5e067ebf0a81eb742f5822e6439b5)]: - - @effect/platform@0.69.19 - - @effect/rpc@0.44.19 - -## 0.42.18 - -### Patch Changes - -- Updated dependencies [[`a0584ec`](https://github.com/Effect-TS/effect/commit/a0584ece92ed784bfb139e9c5a699f02d1e71c2d), [`dd14efe`](https://github.com/Effect-TS/effect/commit/dd14efe0ace255f571273aae876adea96267d7e6), [`dd14efe`](https://github.com/Effect-TS/effect/commit/dd14efe0ace255f571273aae876adea96267d7e6)]: - - @effect/platform@0.69.18 - - effect@3.10.12 - - @effect/rpc@0.44.18 - -## 0.42.17 - -### Patch Changes - -- Updated dependencies [[`5eef499`](https://github.com/Effect-TS/effect/commit/5eef4998b6ccb7a5404d9e4fef85e57fa35fbb8a), [`8240b1c`](https://github.com/Effect-TS/effect/commit/8240b1c10d45312fc863cb679b1a1e8441af0c1a), [`5eef499`](https://github.com/Effect-TS/effect/commit/5eef4998b6ccb7a5404d9e4fef85e57fa35fbb8a)]: - - effect@3.10.11 - - @effect/platform@0.69.17 - - @effect/rpc@0.44.17 - -## 0.42.16 - -### Patch Changes - -- Updated dependencies [[`cd720ae`](https://github.com/Effect-TS/effect/commit/cd720aedf7f2571edec0843d6a633e84e4832b28), [`cd720ae`](https://github.com/Effect-TS/effect/commit/cd720aedf7f2571edec0843d6a633e84e4832b28), [`cd720ae`](https://github.com/Effect-TS/effect/commit/cd720aedf7f2571edec0843d6a633e84e4832b28), [`b631f40`](https://github.com/Effect-TS/effect/commit/b631f40abbe649b2a089764585b5c39f6a695ac6), [`7d89650`](https://github.com/Effect-TS/effect/commit/7d8965036cd2ea435c8441ffec3345488baebf85)]: - - effect@3.10.10 - - @effect/platform@0.69.16 - - @effect/rpc@0.44.16 - -## 0.42.15 - -### Patch Changes - -- Updated dependencies [[`8a30e1d`](https://github.com/Effect-TS/effect/commit/8a30e1dfa3a7103bf5414fc6a7fca3088d8c8c00)]: - - @effect/platform@0.69.15 - - @effect/rpc@0.44.15 - -## 0.42.14 - -### Patch Changes - -- Updated dependencies [[`a123e80`](https://github.com/Effect-TS/effect/commit/a123e80f111a625428a5b5622b7f55ee1073566b), [`bd5fcd3`](https://github.com/Effect-TS/effect/commit/bd5fcd3e6b603b1e505af90d6a00627c8eca6d41), [`0289d3b`](https://github.com/Effect-TS/effect/commit/0289d3b6391031d00329365bab9791b355031fe3), [`7386b71`](https://github.com/Effect-TS/effect/commit/7386b710e5be570e17f468928a6ed19d549a3e12), [`07c493a`](https://github.com/Effect-TS/effect/commit/07c493a598e096c7810cd06def8cfa43493c46b1), [`257ab1b`](https://github.com/Effect-TS/effect/commit/257ab1b539fa6e930b7ae2583a188376372200d7), [`4211a23`](https://github.com/Effect-TS/effect/commit/4211a2355bb3af3f0e756e2aae9d293379f25662)]: - - effect@3.10.9 - - @effect/platform@0.69.14 - - @effect/rpc@0.44.14 - -## 0.42.13 - -### Patch Changes - -- Updated dependencies [[`68b5c9e`](https://github.com/Effect-TS/effect/commit/68b5c9e44f34192cef26e1cadda5e661a027df41), [`9c9928d`](https://github.com/Effect-TS/effect/commit/9c9928dfeacd9ac33dc37eb0ca3d7d8c39175ada), [`6306e66`](https://github.com/Effect-TS/effect/commit/6306e6656092b350d4ede5746da6f245ec9f7e07), [`361c7f3`](https://github.com/Effect-TS/effect/commit/361c7f39a2c10ede9324847c3d3ba192a6f9b20a)]: - - effect@3.10.8 - - @effect/platform@0.69.13 - - @effect/rpc@0.44.13 - -## 0.42.12 - -### Patch Changes - -- Updated dependencies [[`33f5b9f`](https://github.com/Effect-TS/effect/commit/33f5b9ffaebea4f1bd0e391b44c41fb6230e743a), [`50f0281`](https://github.com/Effect-TS/effect/commit/50f0281b0d2116726b8927a6217622d5f394f3e4)]: - - effect@3.10.7 - - @effect/platform@0.69.12 - - @effect/rpc@0.44.12 - -## 0.42.11 - -### Patch Changes - -- Updated dependencies [[`ce1c21f`](https://github.com/Effect-TS/effect/commit/ce1c21ffc11902ac9ab453a51904207859d38552), [`81ddd45`](https://github.com/Effect-TS/effect/commit/81ddd45fc074b98206fafab416d9a5a28b31e07a)]: - - effect@3.10.6 - - @effect/platform@0.69.11 - - @effect/rpc@0.44.11 - -## 0.42.10 - -### Patch Changes - -- Updated dependencies [[`3a6d757`](https://github.com/Effect-TS/effect/commit/3a6d757badeebe00d8ef4d67530d073c8264dcfa), [`59d813a`](https://github.com/Effect-TS/effect/commit/59d813aa4973d1115cfc70cc3667508335f49693)]: - - effect@3.10.5 - - @effect/platform@0.69.10 - - @effect/rpc@0.44.10 - -## 0.42.9 - -### Patch Changes - -- Updated dependencies [[`2367708`](https://github.com/Effect-TS/effect/commit/2367708be449f9526a2047e321302d7bfb16f18e)]: - - @effect/platform@0.69.9 - - effect@3.10.4 - - @effect/rpc@0.44.9 - -## 0.42.8 - -### Patch Changes - -- Updated dependencies [[`522f7c5`](https://github.com/Effect-TS/effect/commit/522f7c518a5acfb55ef96d6796869f002cc3eaf8)]: - - @effect/platform@0.69.8 - - @effect/rpc@0.44.8 - -## 0.42.7 - -### Patch Changes - -- Updated dependencies [[`690d6c5`](https://github.com/Effect-TS/effect/commit/690d6c54d2145adb0af545c447db7d4755bf3c6b), [`b9423d8`](https://github.com/Effect-TS/effect/commit/b9423d8bf8181a2389fdbce1e3c14ac6fe8d54f5), [`279fe3a`](https://github.com/Effect-TS/effect/commit/279fe3a7168fe84e520c2cc88ba189a15f03a2bc)]: - - @effect/platform@0.69.7 - - effect@3.10.3 - - @effect/rpc@0.44.7 - -## 0.42.6 - -### Patch Changes - -- Updated dependencies [[`714e119`](https://github.com/Effect-TS/effect/commit/714e11945e45e5a2554ee058e6c43f82a8e309cf), [`c1afd55`](https://github.com/Effect-TS/effect/commit/c1afd55c54e61f9c432823d21b3d016f79160a37), [`42cd72a`](https://github.com/Effect-TS/effect/commit/42cd72a44ca9593e4d81fbb50e8111625fd0fb81)]: - - effect@3.10.2 - - @effect/platform@0.69.6 - - @effect/rpc@0.44.6 - -## 0.42.5 - -### Patch Changes - -- Updated dependencies [[`9604d6b`](https://github.com/Effect-TS/effect/commit/9604d6b616435103dafea8b53637a9d1450b4750)]: - - effect@3.10.1 - - @effect/platform@0.69.5 - - @effect/rpc@0.44.5 - -## 0.42.4 - -### Patch Changes - -- Updated dependencies [[`c86b1d7`](https://github.com/Effect-TS/effect/commit/c86b1d7cd47b66df190ef9775a475467c1abdbd6)]: - - @effect/platform@0.69.4 - - @effect/rpc@0.44.4 - -## 0.42.3 - -### Patch Changes - -- Updated dependencies [[`d5fba63`](https://github.com/Effect-TS/effect/commit/d5fba6391e1005e374aa0238f13edfbd65848313), [`1eb2c30`](https://github.com/Effect-TS/effect/commit/1eb2c30ba064398db5790e376dedcfad55b7b005), [`02d413e`](https://github.com/Effect-TS/effect/commit/02d413e7b6bc1c64885969c37cc3e4e690c94d7d)]: - - @effect/platform@0.69.3 - - @effect/rpc@0.44.3 - -## 0.42.2 - -### Patch Changes - -- Updated dependencies [[`e7afc47`](https://github.com/Effect-TS/effect/commit/e7afc47ce83e381c3f4aed2b2974e3b3d86a2340)]: - - @effect/platform@0.69.2 - - @effect/rpc@0.44.2 - -## 0.42.1 - -### Patch Changes - -- Updated dependencies [[`7564f56`](https://github.com/Effect-TS/effect/commit/7564f56bb2844cf39d2b0d2d9e93cf9b2205e9a8), [`7564f56`](https://github.com/Effect-TS/effect/commit/7564f56bb2844cf39d2b0d2d9e93cf9b2205e9a8)]: - - @effect/platform@0.69.1 - - @effect/rpc@0.44.1 - -## 0.42.0 - -### Patch Changes - -- Updated dependencies [[`4a01828`](https://github.com/Effect-TS/effect/commit/4a01828b66d6213e9bbe18979c893b13f7bb29bf), [`6d9de6b`](https://github.com/Effect-TS/effect/commit/6d9de6b871c5c08e6509a4e830c3d74758faa198), [`4a01828`](https://github.com/Effect-TS/effect/commit/4a01828b66d6213e9bbe18979c893b13f7bb29bf), [`c79c4c1`](https://github.com/Effect-TS/effect/commit/c79c4c178390fe61ff6dda88c9e058862349343a), [`38d30f0`](https://github.com/Effect-TS/effect/commit/38d30f08b8da62f9c3e308b9250738cb8d17bdb5), [`5821ce3`](https://github.com/Effect-TS/effect/commit/5821ce3455b47d25e0a40cae6ce22af9db5fa556)]: - - effect@3.10.0 - - @effect/platform@0.69.0 - - @effect/rpc@0.44.0 - -## 0.41.5 - -### Patch Changes - -- Updated dependencies [[`382556f`](https://github.com/Effect-TS/effect/commit/382556f8930780c0634de681077706113a8c8239), [`97cb014`](https://github.com/Effect-TS/effect/commit/97cb0145114b2cd2f378e98f6c4ff5bf2c1865f5)]: - - @effect/schema@0.75.5 - - @effect/platform@0.68.6 - - @effect/rpc@0.43.5 - -## 0.41.4 - -### Patch Changes - -- Updated dependencies [[`2036402`](https://github.com/Effect-TS/effect/commit/20364020b8b75a684791aa93d90626758023e9e9)]: - - @effect/platform@0.68.5 - - @effect/rpc@0.43.4 - -## 0.41.3 - -### Patch Changes - -- Updated dependencies [[`1b1ef29`](https://github.com/Effect-TS/effect/commit/1b1ef29ae302322f69dc938f9337aa97b4c63266)]: - - @effect/platform@0.68.4 - - @effect/rpc@0.43.3 - -## 0.41.2 - -### Patch Changes - -- Updated dependencies [[`61a99b2`](https://github.com/Effect-TS/effect/commit/61a99b2bf9d757870ef0c2ec9d4c877cdd364a3d), [`8c33087`](https://github.com/Effect-TS/effect/commit/8c330879425e80bed2f65e407cd59e991f0d7bec)]: - - effect@3.9.2 - - @effect/platform@0.68.3 - - @effect/rpc@0.43.2 - - @effect/schema@0.75.4 - -## 0.41.1 - -### Patch Changes - -- Updated dependencies [[`360ec14`](https://github.com/Effect-TS/effect/commit/360ec14dd4102c526aef7433a8881ad4d9beab75)]: - - @effect/schema@0.75.3 - - @effect/platform@0.68.2 - - @effect/rpc@0.43.1 - -## 0.41.0 - -### Minor Changes - -- [#3747](https://github.com/Effect-TS/effect/pull/3747) [`09e8636`](https://github.com/Effect-TS/effect/commit/09e863648fa6ead9894b8b5104f8c11f6cc6120f) Thanks @patroza! - make RpcRouter conversion apis dual - -### Patch Changes - -- [#3747](https://github.com/Effect-TS/effect/pull/3747) [`09e8636`](https://github.com/Effect-TS/effect/commit/09e863648fa6ead9894b8b5104f8c11f6cc6120f) Thanks @patroza! - feat: add support for spanPrefix to HttpRpcRouter - -- Updated dependencies [[`b75ac5d`](https://github.com/Effect-TS/effect/commit/b75ac5d0909115507bedc90f18f2d34deb217769), [`09e8636`](https://github.com/Effect-TS/effect/commit/09e863648fa6ead9894b8b5104f8c11f6cc6120f)]: - - @effect/platform@0.68.1 - - @effect/rpc@0.43.0 - -## 0.40.0 - -### Patch Changes - -- Updated dependencies [[`f02b354`](https://github.com/Effect-TS/effect/commit/f02b354ab5b0451143b82bb73dc866be29adec85), [`90ceeab`](https://github.com/Effect-TS/effect/commit/90ceeab3a04051b740af18c8af8bd73ee8ec6363), [`90ceeab`](https://github.com/Effect-TS/effect/commit/90ceeab3a04051b740af18c8af8bd73ee8ec6363), [`90ceeab`](https://github.com/Effect-TS/effect/commit/90ceeab3a04051b740af18c8af8bd73ee8ec6363)]: - - @effect/schema@0.75.2 - - @effect/platform@0.68.0 - - @effect/rpc@0.42.0 - -## 0.39.1 - -### Patch Changes - -- Updated dependencies [[`3b2ad1d`](https://github.com/Effect-TS/effect/commit/3b2ad1d58a2e33dc1a72b7037396bd25ca1702a9)]: - - @effect/platform@0.67.1 - - effect@3.9.1 - - @effect/schema@0.75.1 - - @effect/rpc@0.41.1 - -## 0.39.0 - -### Patch Changes - -- Updated dependencies [[`ff3d1aa`](https://github.com/Effect-TS/effect/commit/ff3d1aab290b4d1173b2dfc7e4c76abb4babdc16), [`0ba66f2`](https://github.com/Effect-TS/effect/commit/0ba66f2451641fd6990e02ec1ed01c014db9dab0), [`bf77f51`](https://github.com/Effect-TS/effect/commit/bf77f51b323c383224ebf08adf77a7a6e8c9b3cd), [`016f9ad`](https://github.com/Effect-TS/effect/commit/016f9ad931a4b3d09a34e5caf13d87c5b8e9c984), [`0779681`](https://github.com/Effect-TS/effect/commit/07796813f07de035719728733096ba64ce333469), [`534129f`](https://github.com/Effect-TS/effect/commit/534129f8113ce1a8ec50828083e16da9c86326c6), [`d75140c`](https://github.com/Effect-TS/effect/commit/d75140c7a664ceda43142d999f4ff8dcd36d6dda), [`be0451c`](https://github.com/Effect-TS/effect/commit/be0451c149b6618af79cb839cdf04af2db1efb03), [`9237ac6`](https://github.com/Effect-TS/effect/commit/9237ac69bc07de5b3b60076a0ad2921c21de7457), [`be0451c`](https://github.com/Effect-TS/effect/commit/be0451c149b6618af79cb839cdf04af2db1efb03), [`5b36494`](https://github.com/Effect-TS/effect/commit/5b364942e9a9003fdb8217324f8a2d8369c969da), [`c716adb`](https://github.com/Effect-TS/effect/commit/c716adb250ebbea1d1048d818ef7fed4f621d186), [`4986391`](https://github.com/Effect-TS/effect/commit/49863919cd8628c962a712fb1df30d2983820933), [`d75140c`](https://github.com/Effect-TS/effect/commit/d75140c7a664ceda43142d999f4ff8dcd36d6dda), [`d1387ae`](https://github.com/Effect-TS/effect/commit/d1387aebd1ff01bbebde26be46d488956e4daef6)]: - - effect@3.9.0 - - @effect/platform@0.67.0 - - @effect/schema@0.75.0 - - @effect/rpc@0.41.0 - -## 0.38.4 - -### Patch Changes - -- Updated dependencies [[`88e85db`](https://github.com/Effect-TS/effect/commit/88e85db34bd402526e27a323e950d053fa34d232), [`f40da15`](https://github.com/Effect-TS/effect/commit/f40da15fbeb7c491840b8f409d47de79720891c3), [`8e94585`](https://github.com/Effect-TS/effect/commit/8e94585abe62753bf3af28bfae77926a7c570ac3), [`83887ca`](https://github.com/Effect-TS/effect/commit/83887ca1b1793916913d8550a4db4450cd14a044), [`5266b6c`](https://github.com/Effect-TS/effect/commit/5266b6cd86d76c3886da041c8829bca04b1a3110), [`cdead5c`](https://github.com/Effect-TS/effect/commit/cdead5c9cfd54dc6c4f215d9732f654c4a12e991), [`f40da15`](https://github.com/Effect-TS/effect/commit/f40da15fbeb7c491840b8f409d47de79720891c3), [`766a8af`](https://github.com/Effect-TS/effect/commit/766a8af307b414aca3648d91c4eab7493a5ec862)]: - - effect@3.8.5 - - @effect/platform@0.66.3 - - @effect/rpc@0.40.3 - - @effect/schema@0.74.2 - -## 0.38.3 - -### Patch Changes - -- [#3710](https://github.com/Effect-TS/effect/pull/3710) [`dc14e96`](https://github.com/Effect-TS/effect/commit/dc14e96fe7869e09225bf1802b512ba20bf10078) Thanks @tim-smart! - ensure rpc chunks are always delimited on write - -## 0.38.2 - -### Patch Changes - -- Updated dependencies [[`734eae6`](https://github.com/Effect-TS/effect/commit/734eae654f215e4adca457d04d2a1728b1a55c83), [`fd83d0e`](https://github.com/Effect-TS/effect/commit/fd83d0e548feff9ea2d53d370a0b626c4a1d940e), [`4509656`](https://github.com/Effect-TS/effect/commit/45096569d50262275ee984f44c456f5c83b62683), [`ad7e1de`](https://github.com/Effect-TS/effect/commit/ad7e1de948745c0751bfdac96671028ff4b7a727), [`090e41c`](https://github.com/Effect-TS/effect/commit/090e41c636d720b1c7d89684a739855765ed4382), [`090e41c`](https://github.com/Effect-TS/effect/commit/090e41c636d720b1c7d89684a739855765ed4382)]: - - @effect/schema@0.74.1 - - @effect/platform@0.66.2 - - effect@3.8.4 - - @effect/rpc@0.40.2 - -## 0.38.1 - -### Patch Changes - -- Updated dependencies [[`3812788`](https://github.com/Effect-TS/effect/commit/3812788d79caaab8f559a62fd443018a04ac5647)]: - - @effect/platform@0.66.1 - - @effect/rpc@0.40.1 - -## 0.38.0 - -### Patch Changes - -- Updated dependencies [[`de48aa5`](https://github.com/Effect-TS/effect/commit/de48aa54e98d97722a8a4c2c8f9e1fe1d4560ea2)]: - - @effect/schema@0.74.0 - - @effect/platform@0.66.0 - - @effect/rpc@0.40.0 - -## 0.37.5 - -### Patch Changes - -- Updated dependencies [[`321b201`](https://github.com/Effect-TS/effect/commit/321b201adcb6bbbeb806b3467dd0b4cf063ccda8), [`bb5ec6b`](https://github.com/Effect-TS/effect/commit/bb5ec6b4b6a6f537394596c5a596faf52cb2aef4)]: - - @effect/platform@0.65.5 - - effect@3.8.3 - - @effect/rpc@0.39.5 - - @effect/schema@0.73.4 - -## 0.37.4 - -### Patch Changes - -- Updated dependencies [[`e6440a7`](https://github.com/Effect-TS/effect/commit/e6440a74fb3f12f6422ed794c07cb44af91cbacc)]: - - @effect/schema@0.73.3 - - @effect/platform@0.65.4 - - @effect/rpc@0.39.4 - -## 0.37.3 - -### Patch Changes - -- Updated dependencies [[`f0d8ef1`](https://github.com/Effect-TS/effect/commit/f0d8ef1ce97ec2a87b09b3e24150cfeab85d6e2f)]: - - effect@3.8.2 - - @effect/platform@0.65.3 - - @effect/rpc@0.39.3 - - @effect/schema@0.73.2 - -## 0.37.2 - -### Patch Changes - -- Updated dependencies [[`10bf621`](https://github.com/Effect-TS/effect/commit/10bf6213f36d8ddb00f058a4609b85220f3d8334), [`f56ab78`](https://github.com/Effect-TS/effect/commit/f56ab785cbee0c1c43bd2c182c35602f486f61f0), [`ae36fa6`](https://github.com/Effect-TS/effect/commit/ae36fa68f754eeab9a54b6dc0f8b44db513aa2b6)]: - - effect@3.8.1 - - @effect/schema@0.73.1 - - @effect/platform@0.65.2 - - @effect/rpc@0.39.2 - -## 0.37.1 - -### Patch Changes - -- Updated dependencies [[`e44c5f2`](https://github.com/Effect-TS/effect/commit/e44c5f228215738fe4e75023c7461bf9521249cb)]: - - @effect/platform@0.65.1 - - @effect/rpc@0.39.1 - -## 0.37.0 - -### Minor Changes - -- [#3541](https://github.com/Effect-TS/effect/pull/3541) [`7041393`](https://github.com/Effect-TS/effect/commit/7041393cff132e96566d3f36da0483a6ff6195e4) Thanks @tim-smart! - refactor /platform HttpClient - - #### HttpClient.fetch removed - - The `HttpClient.fetch` client implementation has been removed. Instead, you can - access a `HttpClient` using the corresponding `Context.Tag`. - - ```ts - import { FetchHttpClient, HttpClient } from "@effect/platform" - import { Effect } from "effect" - - Effect.gen(function* () { - const client = yield* HttpClient.HttpClient - - // make a get request - yield* client.get("https://jsonplaceholder.typicode.com/todos/1") - }).pipe( - Effect.scoped, - // the fetch client has been moved to the `FetchHttpClient` module - Effect.provide(FetchHttpClient.layer) - ) - ``` - - #### `HttpClient` interface now uses methods - - Instead of being a function that returns the response, the `HttpClient` - interface now uses methods to make requests. - - Some shorthand methods have been added to the `HttpClient` interface to make - less complex requests easier. - - ```ts - import { - FetchHttpClient, - HttpClient, - HttpClientRequest - } from "@effect/platform" - import { Effect } from "effect" - - Effect.gen(function* () { - const client = yield* HttpClient.HttpClient - - // make a get request - yield* client.get("https://jsonplaceholder.typicode.com/todos/1") - // make a post request - yield* client.post("https://jsonplaceholder.typicode.com/todos") - - // execute a request instance - yield* client.execute( - HttpClientRequest.get("https://jsonplaceholder.typicode.com/todos/1") - ) - }) - ``` - - #### Scoped `HttpClientResponse` helpers removed - - The `HttpClientResponse` helpers that also supplied the `Scope` have been removed. - - Instead, you can use the `HttpClientResponse` methods directly, and explicitly - add a `Effect.scoped` to the pipeline. - - ```ts - import { FetchHttpClient, HttpClient } from "@effect/platform" - import { Effect } from "effect" - - Effect.gen(function* () { - const client = yield* HttpClient.HttpClient - - yield* client.get("https://jsonplaceholder.typicode.com/todos/1").pipe( - Effect.flatMap((response) => response.json), - Effect.scoped // supply the `Scope` - ) - }) - ``` - - #### Some apis have been renamed - - Including the `HttpClientRequest` body apis, which is to make them more - discoverable. - -### Patch Changes - -- Updated dependencies [[`fcfa6ee`](https://github.com/Effect-TS/effect/commit/fcfa6ee30ffd07d998bf22799357bf58580a116f), [`bb9931b`](https://github.com/Effect-TS/effect/commit/bb9931b62e249a3b801f2cb9d097aec0c8511af7), [`5798f76`](https://github.com/Effect-TS/effect/commit/5798f7619529de33e5ba06f551806f68fedc19db), [`5f0bfa1`](https://github.com/Effect-TS/effect/commit/5f0bfa17205398d4e4818bfbcf9e1b505b3b1fc5), [`7fdf9d9`](https://github.com/Effect-TS/effect/commit/7fdf9d9aa1e2c1c125cbf87991e6efbf4abb7b07), [`812a4e8`](https://github.com/Effect-TS/effect/commit/812a4e86e2d1aa23b477ef5829aa0e5c07784936), [`6a128f6`](https://github.com/Effect-TS/effect/commit/6a128f63f9b41fec2db70790b3bbb96cb9afa1ab), [`273565e`](https://github.com/Effect-TS/effect/commit/273565e7901639e8d0541930ab715aea9c80fbaa), [`adf7d7a`](https://github.com/Effect-TS/effect/commit/adf7d7a7dfce3a7021e9f3b0d847dc85be89d754), [`569a801`](https://github.com/Effect-TS/effect/commit/569a8017ef0a0bc203e4312867cbdd37b0effbd7), [`aa1fa53`](https://github.com/Effect-TS/effect/commit/aa1fa5301e886b9657c8eb0d38cb87cef92a8305), [`02f6b06`](https://github.com/Effect-TS/effect/commit/02f6b0660e12bee1069532a9cc18d3ab855257be), [`12b893e`](https://github.com/Effect-TS/effect/commit/12b893e63cc6dfada4aca7773b4783940e2edf25), [`bbad27e`](https://github.com/Effect-TS/effect/commit/bbad27ec0a90860593f759405caa877e7f4a655f), [`7041393`](https://github.com/Effect-TS/effect/commit/7041393cff132e96566d3f36da0483a6ff6195e4), [`e0d21a5`](https://github.com/Effect-TS/effect/commit/e0d21a54c8323728fbb75a32f4820a9996257809), [`adf7d7a`](https://github.com/Effect-TS/effect/commit/adf7d7a7dfce3a7021e9f3b0d847dc85be89d754), [`007289a`](https://github.com/Effect-TS/effect/commit/007289a52d5877f8e90e2dacf38171ff9bf603fd), [`42a8f99`](https://github.com/Effect-TS/effect/commit/42a8f99740eefdaf2c4544d2c345313f97547a36), [`eebfd29`](https://github.com/Effect-TS/effect/commit/eebfd29633fd5d38b505c5c0842036f61f05e913), [`040703d`](https://github.com/Effect-TS/effect/commit/040703d0e100cd5511e52d812c15492414262b5e)]: - - effect@3.8.0 - - @effect/schema@0.73.0 - - @effect/platform@0.65.0 - - @effect/rpc@0.39.0 - -## 0.36.1 - -### Patch Changes - -- Updated dependencies [[`35a0f81`](https://github.com/Effect-TS/effect/commit/35a0f813141652d696461cd5d19fd146adaf85be), [`8261c5a`](https://github.com/Effect-TS/effect/commit/8261c5ae6fe86872292ec1fc1a58ab9cea2f5f51)]: - - effect@3.7.3 - - @effect/platform@0.64.1 - - @effect/rpc@0.38.1 - - @effect/schema@0.72.4 - -## 0.36.0 - -### Patch Changes - -- Updated dependencies [[`f6acb71`](https://github.com/Effect-TS/effect/commit/f6acb71b17a0e6b0d449e7f661c9e2c3d335fcac), [`90ac8f6`](https://github.com/Effect-TS/effect/commit/90ac8f6f6053a2e4498f8b0cc56fe12777d02e1a), [`90ac8f6`](https://github.com/Effect-TS/effect/commit/90ac8f6f6053a2e4498f8b0cc56fe12777d02e1a), [`3791e24`](https://github.com/Effect-TS/effect/commit/3791e241636b1dfe924a56f380ebc9a7ff0827a9), [`3791e24`](https://github.com/Effect-TS/effect/commit/3791e241636b1dfe924a56f380ebc9a7ff0827a9)]: - - @effect/schema@0.72.3 - - @effect/platform@0.64.0 - - @effect/rpc@0.38.0 - -## 0.35.3 - -### Patch Changes - -- Updated dependencies [[`4a701c4`](https://github.com/Effect-TS/effect/commit/4a701c406da032563fedae459536c00ae5cfe3c7)]: - - @effect/platform@0.63.3 - - @effect/rpc@0.37.3 - -## 0.35.2 - -### Patch Changes - -- Updated dependencies [[`8a601d7`](https://github.com/Effect-TS/effect/commit/8a601d7a1f8ffe52ac9e6d67e9282a1495fe59c9), [`353ba19`](https://github.com/Effect-TS/effect/commit/353ba19f9b2b9e959f0a00d058c6d40a4bc02db7)]: - - effect@3.7.2 - - @effect/platform@0.63.2 - - @effect/rpc@0.37.2 - - @effect/schema@0.72.2 - -## 0.35.1 - -### Patch Changes - -- Updated dependencies [[`79859e7`](https://github.com/Effect-TS/effect/commit/79859e71040d8edf1868b8530b90c650f4321eff), [`f6a469c`](https://github.com/Effect-TS/effect/commit/f6a469c190b9f00eee5ea0cd4d5912a0ef8b46f5), [`dcb9ec0`](https://github.com/Effect-TS/effect/commit/dcb9ec0db443894dd204d87450f779c44b9ad7f1), [`79aa6b1`](https://github.com/Effect-TS/effect/commit/79aa6b136e1f29b36f34e88cb2ff162bff2bb4ed)]: - - effect@3.7.1 - - @effect/platform@0.63.1 - - @effect/rpc@0.37.1 - - @effect/schema@0.72.1 - -## 0.35.0 - -### Patch Changes - -- Updated dependencies [[`db89601`](https://github.com/Effect-TS/effect/commit/db89601ee9c1050c4e762b7bd7ec65a6a2799dfe), [`2f456cc`](https://github.com/Effect-TS/effect/commit/2f456cce5012b9fcb6b4e039190d527813b75b92), [`8745e41`](https://github.com/Effect-TS/effect/commit/8745e41ed96e3765dc6048efc2a9afbe05c8a1e9), [`e557838`](https://github.com/Effect-TS/effect/commit/e55783886b046d3c5f33447f455f9ccf2fa75922), [`d6e7e40`](https://github.com/Effect-TS/effect/commit/d6e7e40b1e2ad0c59aa02f07344d28601b14ebdc), [`8356321`](https://github.com/Effect-TS/effect/commit/8356321598da04bd77c1001f45a4e447bec5591d), [`192f2eb`](https://github.com/Effect-TS/effect/commit/192f2ebb2c4ddbf4bfd8baedd32140b2376868f4), [`718cb70`](https://github.com/Effect-TS/effect/commit/718cb70038629a6d58d02e407760e341f7c94474), [`e9d0310`](https://github.com/Effect-TS/effect/commit/e9d03107acbf204d9304f3e8aea0816b7d3c7dfb), [`6bf28f7`](https://github.com/Effect-TS/effect/commit/6bf28f7e3b1e5e0608ff567205fea0581d11666f)]: - - effect@3.7.0 - - @effect/platform@0.63.0 - - @effect/rpc@0.37.0 - - @effect/schema@0.72.0 - -## 0.34.5 - -### Patch Changes - -- Updated dependencies [[`e809286`](https://github.com/Effect-TS/effect/commit/e8092865900608c4df7a6b7991b1c13cc1e4ca2d)]: - - effect@3.6.8 - - @effect/platform@0.62.5 - - @effect/rpc@0.36.5 - - @effect/schema@0.71.4 - -## 0.34.4 - -### Patch Changes - -- Updated dependencies [[`e7a65e3`](https://github.com/Effect-TS/effect/commit/e7a65e3c6a08636bbfce3d3af3098bf28474364d), [`50ec889`](https://github.com/Effect-TS/effect/commit/50ec8897a49b7d1fe84f63107f89d543c52f3dfc)]: - - @effect/platform@0.62.4 - - effect@3.6.7 - - @effect/rpc@0.36.4 - - @effect/schema@0.71.3 - -## 0.34.3 - -### Patch Changes - -- Updated dependencies [[`f960bf4`](https://github.com/Effect-TS/effect/commit/f960bf45239e9badac6e0ad3a602f4174cd7bbdf), [`46a575f`](https://github.com/Effect-TS/effect/commit/46a575f48a05457b782fb21f7827d338c9b59320)]: - - effect@3.6.6 - - @effect/platform@0.62.3 - - @effect/rpc@0.36.3 - - @effect/schema@0.71.2 - -## 0.34.2 - -### Patch Changes - -- Updated dependencies [[`413994c`](https://github.com/Effect-TS/effect/commit/413994c9792f16d9d57cca3ae6eb254bf93bd261), [`14a47a8`](https://github.com/Effect-TS/effect/commit/14a47a8c1f3cff2186b8fe7a919a1d773888fb5b), [`0c09841`](https://github.com/Effect-TS/effect/commit/0c0984173be3d58f050b300a1a8aa89d76ba49ae)]: - - @effect/platform@0.62.2 - - effect@3.6.5 - - @effect/rpc@0.36.2 - - @effect/schema@0.71.1 - -## 0.34.1 - -### Patch Changes - -- Updated dependencies [[`9efe0e5`](https://github.com/Effect-TS/effect/commit/9efe0e5b57ac557399be620822c21cc6e9add285)]: - - @effect/platform@0.62.1 - - @effect/rpc@0.36.1 - -## 0.34.0 - -### Patch Changes - -- Updated dependencies [[`c1987e2`](https://github.com/Effect-TS/effect/commit/c1987e25c8f5c48bdc9ad223d7a6f2c32f93f5a1), [`8295281`](https://github.com/Effect-TS/effect/commit/8295281ae9bd7441e680402540bf3c8682ec417b), [`c940df6`](https://github.com/Effect-TS/effect/commit/c940df63800bf3c4396d91cf28ec34938642fd2c), [`00b6c6d`](https://github.com/Effect-TS/effect/commit/00b6c6d4001f5de728b7d990a1b14560b4961a63), [`1ceed14`](https://github.com/Effect-TS/effect/commit/1ceed149dc64f4874e64b5cf2f954eba0a5a1f12), [`f8d95a6`](https://github.com/Effect-TS/effect/commit/f8d95a61ad0762147933c5c32bb6d7237e18eef4), [`0e42a8f`](https://github.com/Effect-TS/effect/commit/0e42a8f045ecb1fd3d080edf3d49fef16a9b0ca1)]: - - @effect/schema@0.71.0 - - effect@3.6.4 - - @effect/platform@0.62.0 - - @effect/rpc@0.36.0 - -## 0.33.1 - -### Patch Changes - -- Updated dependencies [[`04adcac`](https://github.com/Effect-TS/effect/commit/04adcace913e6fc483df266874a68005e9e04ccf)]: - - effect@3.6.3 - - @effect/platform@0.61.8 - - @effect/rpc@0.35.1 - - @effect/schema@0.70.4 - -## 0.33.0 - -### Minor Changes - -- [#3442](https://github.com/Effect-TS/effect/pull/3442) [`739834e`](https://github.com/Effect-TS/effect/commit/739834efd99621f92519a98e6f60553d9d7b316d) Thanks @tim-smart! - add Rpc prefix to rpc modules - -### Patch Changes - -- Updated dependencies [[`17245a4`](https://github.com/Effect-TS/effect/commit/17245a4e783c19dee51529600b3b40f164fa59bc), [`739834e`](https://github.com/Effect-TS/effect/commit/739834efd99621f92519a98e6f60553d9d7b316d), [`630d40e`](https://github.com/Effect-TS/effect/commit/630d40eaa7eb4d2f8b6705b16d4f426bc28a7d09), [`630d40e`](https://github.com/Effect-TS/effect/commit/630d40eaa7eb4d2f8b6705b16d4f426bc28a7d09), [`739834e`](https://github.com/Effect-TS/effect/commit/739834efd99621f92519a98e6f60553d9d7b316d)]: - - @effect/platform@0.61.7 - - @effect/rpc@0.35.0 - -## 0.32.6 - -### Patch Changes - -- Updated dependencies [[`99ad841`](https://github.com/Effect-TS/effect/commit/99ad8415293a82d08bd7043c563b29e2b468ca74), [`d829b57`](https://github.com/Effect-TS/effect/commit/d829b576357f2e3b203ab7e107a1492de903a106), [`fd4b2f6`](https://github.com/Effect-TS/effect/commit/fd4b2f6516b325740dde615f1cf0229edf13ca0c)]: - - @effect/schema@0.70.3 - - @effect/platform@0.61.6 - - effect@3.6.2 - - @effect/rpc@0.34.6 - -## 0.32.5 - -### Patch Changes - -- Updated dependencies [[`23a51df`](https://github.com/Effect-TS/effect/commit/23a51df3685c664dcda400cfc8a51b10063e9b33), [`056b710`](https://github.com/Effect-TS/effect/commit/056b7108978e70612176c23991916f678d947f38)]: - - @effect/rpc@0.34.5 - - @effect/platform@0.61.5 - -## 0.32.4 - -### Patch Changes - -- Updated dependencies [[`e7cb109`](https://github.com/Effect-TS/effect/commit/e7cb109d0754207024a64d55b6bd2a674dd8ed7d)]: - - @effect/platform@0.61.4 - - @effect/rpc@0.34.4 - -## 0.32.3 - -### Patch Changes - -- Updated dependencies [[`510a34d`](https://github.com/Effect-TS/effect/commit/510a34d4cc5d2f51347a53847f6c7db84d2b17c6), [`fb9f786`](https://github.com/Effect-TS/effect/commit/fb9f7867f0c895e63f9ef23e8d0941248c42179d), [`45dbb9f`](https://github.com/Effect-TS/effect/commit/45dbb9ffeaf93d9e4df99d0cd4920e41ba9a3978)]: - - effect@3.6.1 - - @effect/platform@0.61.3 - - @effect/rpc@0.34.3 - - @effect/schema@0.70.2 - -## 0.32.2 - -### Patch Changes - -- Updated dependencies [[`3dce357`](https://github.com/Effect-TS/effect/commit/3dce357efe4a4451d7d29859d08ac11713999b1a), [`657fc48`](https://github.com/Effect-TS/effect/commit/657fc48bb32daf2dc09c9335b3cbc3152bcbdd3b)]: - - @effect/schema@0.70.1 - - @effect/platform@0.61.2 - - @effect/rpc@0.34.2 - -## 0.32.1 - -### Patch Changes - -- Updated dependencies [[`11223bf`](https://github.com/Effect-TS/effect/commit/11223bf9cbf5b822e0bf9a9fb2b35b2ad88af692)]: - - @effect/platform@0.61.1 - - @effect/rpc@0.34.1 - -## 0.32.0 - -### Patch Changes - -- Updated dependencies [[`1e0fe80`](https://github.com/Effect-TS/effect/commit/1e0fe802b36c257971296617473ce0abe730e8dc), [`8135294`](https://github.com/Effect-TS/effect/commit/8135294b591ea94fde7e6f94a504608f0e630520), [`cd255a4`](https://github.com/Effect-TS/effect/commit/cd255a48872d8fb924cf713ef73f0883a9cc6987), [`3845646`](https://github.com/Effect-TS/effect/commit/3845646828e98f3c7cda1217f6cfe5f642ac0603), [`2d09078`](https://github.com/Effect-TS/effect/commit/2d09078c5948b37fc2f79ef858fe4ca3e4814085), [`4bce5a0`](https://github.com/Effect-TS/effect/commit/4bce5a0274203550ccf117d830721891b0a3d182), [`4ddbff0`](https://github.com/Effect-TS/effect/commit/4ddbff0bb4e3ffddfeb509c59835b83245fb975e), [`e74cc38`](https://github.com/Effect-TS/effect/commit/e74cc38cb420a320c4d7ef98180f19d452a8b316), [`bb069b4`](https://github.com/Effect-TS/effect/commit/bb069b49ef291c532a02c1e8e74271f6d1bb32ec), [`cd255a4`](https://github.com/Effect-TS/effect/commit/cd255a48872d8fb924cf713ef73f0883a9cc6987), [`7d02174`](https://github.com/Effect-TS/effect/commit/7d02174af3bcbf054e5cdddb821c91d0f47e8285)]: - - effect@3.6.0 - - @effect/schema@0.70.0 - - @effect/platform@0.61.0 - - @effect/rpc@0.34.0 - -## 0.31.3 - -### Patch Changes - -- Updated dependencies [[`7c0da50`](https://github.com/Effect-TS/effect/commit/7c0da5050d30cb804f4eacb15995d0fb7f3a28d2), [`2fc0ff4`](https://github.com/Effect-TS/effect/commit/2fc0ff4c59c25977018f6ac70ced99b04a8c7b2b), [`6359644`](https://github.com/Effect-TS/effect/commit/635964446323cf55d4060559337e710e4a24496e), [`f262665`](https://github.com/Effect-TS/effect/commit/f262665c2773492c01e5dd0e8d6db235aafaaad8), [`7f41e42`](https://github.com/Effect-TS/effect/commit/7f41e428830bf3043b8be0d28dcd235d5747c942), [`9bbe7a6`](https://github.com/Effect-TS/effect/commit/9bbe7a681430ebf5c10167bb7140ba3742e46bb7), [`f566fd1`](https://github.com/Effect-TS/effect/commit/f566fd1d7eea531a0d981dd24037f14a603a1273)]: - - @effect/schema@0.69.3 - - effect@3.5.9 - - @effect/platform@0.60.3 - - @effect/rpc@0.33.3 - -## 0.31.2 - -### Patch Changes - -- Updated dependencies [[`eb4d014`](https://github.com/Effect-TS/effect/commit/eb4d014c559e1b4c95b3fb9295fe77593c17ed7a), [`1ba640c`](https://github.com/Effect-TS/effect/commit/1ba640c702f187a866023bf043c26e25cce941ef), [`c8c71bd`](https://github.com/Effect-TS/effect/commit/c8c71bd20eb87d23133dac6156b83bb08941597c), [`a26ce58`](https://github.com/Effect-TS/effect/commit/a26ce581ca7d407e1e81439b58c8045b3fa65231), [`fc20f73`](https://github.com/Effect-TS/effect/commit/fc20f73c69e577981cb64714de2adc97e1004dae)]: - - @effect/platform@0.60.2 - - effect@3.5.8 - - @effect/rpc@0.33.2 - - @effect/schema@0.69.2 - -## 0.31.1 - -### Patch Changes - -- Updated dependencies [[`f241154`](https://github.com/Effect-TS/effect/commit/f241154added5d91e95866c39481f09cdb13bd4d)]: - - @effect/schema@0.69.1 - - @effect/platform@0.60.1 - - @effect/rpc@0.33.1 - -## 0.31.0 - -### Patch Changes - -- Updated dependencies [[`20807a4`](https://github.com/Effect-TS/effect/commit/20807a45edeb4334e903dca5d708cd62a71702d8), [`20807a4`](https://github.com/Effect-TS/effect/commit/20807a45edeb4334e903dca5d708cd62a71702d8)]: - - @effect/rpc@0.33.0 - - @effect/schema@0.69.0 - - @effect/platform@0.60.0 - -## 0.30.3 - -### Patch Changes - -- [#3310](https://github.com/Effect-TS/effect/pull/3310) [`99bddcf`](https://github.com/Effect-TS/effect/commit/99bddcfb3d6eab4d489d055404e26ad81afe52fc) Thanks @fubhy! - Added additional pure annotations to improve tree-shakeability - -- Updated dependencies [[`3afcc93`](https://github.com/Effect-TS/effect/commit/3afcc93413a3d910beb69e4ce9ae120e4adaffd5), [`99bddcf`](https://github.com/Effect-TS/effect/commit/99bddcfb3d6eab4d489d055404e26ad81afe52fc), [`6921c4f`](https://github.com/Effect-TS/effect/commit/6921c4fb8c45badff09b493043b85ca71302b560)]: - - effect@3.5.7 - - @effect/platform@0.59.3 - - @effect/rpc@0.32.3 - - @effect/schema@0.68.27 - -## 0.30.2 - -### Patch Changes - -- Updated dependencies [[`f0285d3`](https://github.com/Effect-TS/effect/commit/f0285d3af6a18829123bc1818331c67206becbc4), [`8ec4955`](https://github.com/Effect-TS/effect/commit/8ec49555ed3b3c98093fa4d135a4c57a3f16ebd1), [`3ac2d76`](https://github.com/Effect-TS/effect/commit/3ac2d76048da09e876cf6c3aee3397febd843fe9), [`cc327a1`](https://github.com/Effect-TS/effect/commit/cc327a1bccd22a4ee27ec7e58b53205e93b23e2c), [`4bfe4fb`](https://github.com/Effect-TS/effect/commit/4bfe4fb5c82f597c9beea9baa92e772593598b60), [`2b14d18`](https://github.com/Effect-TS/effect/commit/2b14d181462cad8359da4fa6bc6dfda0f742c398)]: - - @effect/schema@0.68.26 - - effect@3.5.6 - - @effect/platform@0.59.2 - - @effect/rpc@0.32.2 - -## 0.30.1 - -### Patch Changes - -- Updated dependencies [[`a9d7800`](https://github.com/Effect-TS/effect/commit/a9d7800f6a253192b653d77778b0674f39b1ca39), [`fcecff7`](https://github.com/Effect-TS/effect/commit/fcecff7f7e12b295a252f124861b801c73072151), [`adbf753`](https://github.com/Effect-TS/effect/commit/adbf75340a9db15dc5cadc66e911a8978a195a65), [`adbf753`](https://github.com/Effect-TS/effect/commit/adbf75340a9db15dc5cadc66e911a8978a195a65)]: - - effect@3.5.5 - - @effect/platform@0.59.1 - - @effect/rpc@0.32.1 - - @effect/schema@0.68.25 - -## 0.30.0 - -### Patch Changes - -- Updated dependencies [[`53c0db0`](https://github.com/Effect-TS/effect/commit/53c0db06872d5b5edea2a706e83249908385325c), [`ed0dde4`](https://github.com/Effect-TS/effect/commit/ed0dde4888e6f1a97ad5bba06b755d26a6a1c52e), [`ada68b3`](https://github.com/Effect-TS/effect/commit/ada68b3e61c67907c2a281c024c84d818186ca4c), [`ca775ce`](https://github.com/Effect-TS/effect/commit/ca775cec53baebc1a43d9b8852a3ac6726178498), [`5be9cc0`](https://github.com/Effect-TS/effect/commit/5be9cc044025a9541b9b7acefa2d3fc05fa1301b), [`203658f`](https://github.com/Effect-TS/effect/commit/203658f8001c132b25764ab70344b171683b554c), [`eb1c4d4`](https://github.com/Effect-TS/effect/commit/eb1c4d44e54b9d8d201a366d1ff94face2a6dcd3)]: - - @effect/platform@0.59.0 - - effect@3.5.4 - - @effect/schema@0.68.24 - - @effect/rpc@0.32.0 - -## 0.29.27 - -### Patch Changes - -- Updated dependencies [[`edb0da3`](https://github.com/Effect-TS/effect/commit/edb0da383746d760f35d8582f5fb0cc0eeca9217), [`edb0da3`](https://github.com/Effect-TS/effect/commit/edb0da383746d760f35d8582f5fb0cc0eeca9217), [`a1db40a`](https://github.com/Effect-TS/effect/commit/a1db40a650ab842e778654f0d88e80f2ef4fd6f3), [`c8d3fb0`](https://github.com/Effect-TS/effect/commit/c8d3fb0fe23585f6efb724af51fbab3ba1ad6e83), [`dabd028`](https://github.com/Effect-TS/effect/commit/dabd028decf9b7983ca16ebe0f48c05c11a84b68), [`786b2ab`](https://github.com/Effect-TS/effect/commit/786b2ab29d525c877bb84035dac9e2d6499339d1), [`fc57354`](https://github.com/Effect-TS/effect/commit/fc573547d41667016fce05eaee75960fcc6dce4d)]: - - effect@3.5.3 - - @effect/schema@0.68.23 - - @effect/platform@0.58.27 - - @effect/rpc@0.31.27 - -## 0.29.26 - -### Patch Changes - -- Updated dependencies [[`639208e`](https://github.com/Effect-TS/effect/commit/639208eeb8a44622994f832bc2d45d06ab636bc8), [`6684b4c`](https://github.com/Effect-TS/effect/commit/6684b4c27d77a7fcc7af2e261a450edf971b62b5), [`6684b4c`](https://github.com/Effect-TS/effect/commit/6684b4c27d77a7fcc7af2e261a450edf971b62b5), [`6684b4c`](https://github.com/Effect-TS/effect/commit/6684b4c27d77a7fcc7af2e261a450edf971b62b5)]: - - effect@3.5.2 - - @effect/platform@0.58.26 - - @effect/rpc@0.31.26 - - @effect/schema@0.68.22 - -## 0.29.25 - -### Patch Changes - -- Updated dependencies [[`0623fca`](https://github.com/Effect-TS/effect/commit/0623fca41679b0e3c5a10dd0f8985f91670bd721)]: - - @effect/platform@0.58.25 - - @effect/rpc@0.31.25 - -## 0.29.24 - -### Patch Changes - -- Updated dependencies [[`55fdd76`](https://github.com/Effect-TS/effect/commit/55fdd761ee95afd73b6a892c13fee92b36c02837)]: - - effect@3.5.1 - - @effect/platform@0.58.24 - - @effect/rpc@0.31.24 - - @effect/schema@0.68.21 - -## 0.29.23 - -### Patch Changes - -- Updated dependencies [[`a1f5b83`](https://github.com/Effect-TS/effect/commit/a1f5b831a1bc7535988b370d68d0b3eb1123e0ce), [`a1f5b83`](https://github.com/Effect-TS/effect/commit/a1f5b831a1bc7535988b370d68d0b3eb1123e0ce), [`a1f5b83`](https://github.com/Effect-TS/effect/commit/a1f5b831a1bc7535988b370d68d0b3eb1123e0ce), [`60bc3d0`](https://github.com/Effect-TS/effect/commit/60bc3d0867b13e48b24dc22604b4dd2e7b2c1ca4), [`5ab348f`](https://github.com/Effect-TS/effect/commit/5ab348f265db3d283aa091ddca6d2d49137c16f2), [`60bc3d0`](https://github.com/Effect-TS/effect/commit/60bc3d0867b13e48b24dc22604b4dd2e7b2c1ca4), [`3e04bf8`](https://github.com/Effect-TS/effect/commit/3e04bf8a7127e956cadb7684a8f4c661df57663b), [`e7fc45f`](https://github.com/Effect-TS/effect/commit/e7fc45f0c7002aafdaec7878149ac064cd104ea3), [`a1f5b83`](https://github.com/Effect-TS/effect/commit/a1f5b831a1bc7535988b370d68d0b3eb1123e0ce), [`4626de5`](https://github.com/Effect-TS/effect/commit/4626de59c25b384216faa0be87bf0b8cd36357d0), [`f01e7db`](https://github.com/Effect-TS/effect/commit/f01e7db317827255d7901f523f2e28b43298e8df), [`60bc3d0`](https://github.com/Effect-TS/effect/commit/60bc3d0867b13e48b24dc22604b4dd2e7b2c1ca4), [`79d2d91`](https://github.com/Effect-TS/effect/commit/79d2d91464d95dde0e9444d43e7a7f309f05d6e6), [`ac71f37`](https://github.com/Effect-TS/effect/commit/ac71f378f2413e5aa91c95f649ffe898d6a26114), [`8432360`](https://github.com/Effect-TS/effect/commit/8432360ce68614a419bb328083a4109d0fc8aa93), [`e4bf1bf`](https://github.com/Effect-TS/effect/commit/e4bf1bf2b4a970eacd77c9b77b5ea8c68bc84498), [`13cb861`](https://github.com/Effect-TS/effect/commit/13cb861a5eded15c55c6cdcf6a8acde8320367a6), [`79d2d91`](https://github.com/Effect-TS/effect/commit/79d2d91464d95dde0e9444d43e7a7f309f05d6e6), [`e7fc45f`](https://github.com/Effect-TS/effect/commit/e7fc45f0c7002aafdaec7878149ac064cd104ea3), [`9f66825`](https://github.com/Effect-TS/effect/commit/9f66825f1fce0fe8d10420c285f7dc4c71e8af8d)]: - - effect@3.5.0 - - @effect/platform@0.58.23 - - @effect/rpc@0.31.23 - - @effect/schema@0.68.20 - -## 0.29.22 - -### Patch Changes - -- Updated dependencies [[`7af137c`](https://github.com/Effect-TS/effect/commit/7af137c9433f6e74959b3887561ec1e6f12e10ee), [`ee4b3dc`](https://github.com/Effect-TS/effect/commit/ee4b3dc5f68d19dc3ae1c2d12901c5b8ffbebabb), [`366f2ee`](https://github.com/Effect-TS/effect/commit/366f2ee3fb6f712a44e8f84fc188612e5ecc016d), [`366f2ee`](https://github.com/Effect-TS/effect/commit/366f2ee3fb6f712a44e8f84fc188612e5ecc016d), [`097d25c`](https://github.com/Effect-TS/effect/commit/097d25cb5d13c049e01789651be56b09620186ef)]: - - effect@3.4.9 - - @effect/platform@0.58.22 - - @effect/rpc@0.31.22 - - @effect/schema@0.68.19 - -## 0.29.21 - -### Patch Changes - -- Updated dependencies [[`5d5cc6c`](https://github.com/Effect-TS/effect/commit/5d5cc6cfd7d63b07081290fb189b364999201fc5), [`a435e0f`](https://github.com/Effect-TS/effect/commit/a435e0fc5378b33a49bcec92ee235df6f16a2419), [`b5554db`](https://github.com/Effect-TS/effect/commit/b5554db36c4dd6f64fa5e6a62a29b2759c54217a), [`359ff8a`](https://github.com/Effect-TS/effect/commit/359ff8aa2e4e6389bf56d759baa804e2a7674a16), [`a9c4fb3`](https://github.com/Effect-TS/effect/commit/a9c4fb3bf3c6e92cd1c142b0605fddf7eb3c697c), [`f7534b9`](https://github.com/Effect-TS/effect/commit/f7534b94cba06b143a3d4f29275d92874a939559)]: - - @effect/schema@0.68.18 - - effect@3.4.8 - - @effect/platform@0.58.21 - - @effect/rpc@0.31.21 - -## 0.29.20 - -### Patch Changes - -- Updated dependencies [[`15967cf`](https://github.com/Effect-TS/effect/commit/15967cf18931fb6ede3083eb687a8dfff371cc56), [`2328e17`](https://github.com/Effect-TS/effect/commit/2328e17577112db17c29b7756942a0ff64a70ee0), [`a5737d6`](https://github.com/Effect-TS/effect/commit/a5737d6db2b921605c332eabbc5402ee3d17357b)]: - - @effect/schema@0.68.17 - - effect@3.4.7 - - @effect/platform@0.58.20 - - @effect/rpc@0.31.20 - -## 0.29.19 - -### Patch Changes - -- Updated dependencies [[`d006cec`](https://github.com/Effect-TS/effect/commit/d006cec022e8524dbfd6dc6df751fe4c86b10042), [`cb22726`](https://github.com/Effect-TS/effect/commit/cb2272656881aa5878a1c3fc0b12d8fbc66eb63c), [`e911cfd`](https://github.com/Effect-TS/effect/commit/e911cfdc79418462d7e9000976fded15ea6b738d)]: - - @effect/schema@0.68.16 - - @effect/platform@0.58.19 - - @effect/rpc@0.31.19 - -## 0.29.18 - -### Patch Changes - -- Updated dependencies [[`7f8900a`](https://github.com/Effect-TS/effect/commit/7f8900a1de9addeb0d371103a2c5c2aa3e4ff95e)]: - - @effect/platform@0.58.18 - - @effect/rpc@0.31.18 - -## 0.29.17 - -### Patch Changes - -- Updated dependencies [[`5c0ceb0`](https://github.com/Effect-TS/effect/commit/5c0ceb00826cce9e50bf9d41d83e191d5352c030), [`5c0ceb0`](https://github.com/Effect-TS/effect/commit/5c0ceb00826cce9e50bf9d41d83e191d5352c030), [`34faeb6`](https://github.com/Effect-TS/effect/commit/34faeb6305ba52af4d6f8bdd2e633bb6a5a7a35b), [`33735b1`](https://github.com/Effect-TS/effect/commit/33735b16b41bd26929d8f4754c190925db6323b7), [`5c0ceb0`](https://github.com/Effect-TS/effect/commit/5c0ceb00826cce9e50bf9d41d83e191d5352c030), [`139d4b3`](https://github.com/Effect-TS/effect/commit/139d4b39fb3bff2eeaa7c0c809c581da42425a83)]: - - effect@3.4.6 - - @effect/schema@0.68.15 - - @effect/platform@0.58.17 - - @effect/rpc@0.31.17 - -## 0.29.16 - -### Patch Changes - -- Updated dependencies [[`61e5964`](https://github.com/Effect-TS/effect/commit/61e59640fd993216cca8ace0ac8abd9104e213ce)]: - - @effect/schema@0.68.14 - - @effect/platform@0.58.16 - - @effect/rpc@0.31.16 - -## 0.29.15 - -### Patch Changes - -- Updated dependencies [[`cb76bcb`](https://github.com/Effect-TS/effect/commit/cb76bcb2f8858a90db4f785efee262cea1b9844e), [`baa90df`](https://github.com/Effect-TS/effect/commit/baa90df9663f5f37d7b6814dad25142d53dbc720)]: - - @effect/schema@0.68.13 - - @effect/platform@0.58.15 - - @effect/rpc@0.31.15 - -## 0.29.14 - -### Patch Changes - -- Updated dependencies [[`52a87c7`](https://github.com/Effect-TS/effect/commit/52a87c7a0b9536398deaf8ec507e53a82c607219), [`6d2280e`](https://github.com/Effect-TS/effect/commit/6d2280e9497c95cb0e965ca462c825345074eedf)]: - - @effect/platform@0.58.14 - - @effect/rpc@0.31.14 - -## 0.29.13 - -### Patch Changes - -- Updated dependencies [[`a047af9`](https://github.com/Effect-TS/effect/commit/a047af99447dfffc729e9c8ef0ca143537927e91), [`dbd53ea`](https://github.com/Effect-TS/effect/commit/dbd53ea363c71a24449cb068251054c3a1acf864), [`d990544`](https://github.com/Effect-TS/effect/commit/d9905444b9e800850cb65899114ca0e502e68fe8)]: - - effect@3.4.5 - - @effect/platform@0.58.13 - - @effect/schema@0.68.12 - - @effect/rpc@0.31.13 - -## 0.29.12 - -### Patch Changes - -- Updated dependencies [[`74e0ad2`](https://github.com/Effect-TS/effect/commit/74e0ad23b4c36f41b7fd10856b20f8b701bc4044), [`74e0ad2`](https://github.com/Effect-TS/effect/commit/74e0ad23b4c36f41b7fd10856b20f8b701bc4044), [`72638e3`](https://github.com/Effect-TS/effect/commit/72638e3d99f0e93a24febf6c225256ce92d4a20b), [`d7dde2b`](https://github.com/Effect-TS/effect/commit/d7dde2b4af08b37af859d4c327c1f5c6f00cf9d9), [`9b2fc3b`](https://github.com/Effect-TS/effect/commit/9b2fc3b9dfd304a2bd0508ef2313cfc54357be0c), [`d71c192`](https://github.com/Effect-TS/effect/commit/d71c192b89fd1162423acddc5fd3d6270fbf2ef6)]: - - @effect/platform@0.58.12 - - effect@3.4.4 - - @effect/schema@0.68.11 - - @effect/rpc@0.31.12 - -## 0.29.11 - -### Patch Changes - -- Updated dependencies [[`a5b95b5`](https://github.com/Effect-TS/effect/commit/a5b95b548284e4798654ae7ce6883fa49108f0ea), [`5e29579`](https://github.com/Effect-TS/effect/commit/5e29579187cb8420ea4930b3999fec984f8999f4)]: - - @effect/platform@0.58.11 - - @effect/rpc@0.31.11 - -## 0.29.10 - -### Patch Changes - -- [#3079](https://github.com/Effect-TS/effect/pull/3079) [`bbdd365`](https://github.com/Effect-TS/effect/commit/bbdd36567706c94cdec45bacea825941c347b6cd) Thanks @tim-smart! - update to typescript 5.5 - -- Updated dependencies [[`a48ee84`](https://github.com/Effect-TS/effect/commit/a48ee845ac21bbde9baf938af9e97a98322211c9), [`c342739`](https://github.com/Effect-TS/effect/commit/c3427396226e1ad7b95b40595a23f9bdff3e3365), [`8898e5e`](https://github.com/Effect-TS/effect/commit/8898e5e238622f6337583d91ee23609c1f5ccdf7), [`a48ee84`](https://github.com/Effect-TS/effect/commit/a48ee845ac21bbde9baf938af9e97a98322211c9), [`a48ee84`](https://github.com/Effect-TS/effect/commit/a48ee845ac21bbde9baf938af9e97a98322211c9), [`ff78636`](https://github.com/Effect-TS/effect/commit/ff786367c522975f40f0f179a0ecdfcfab7ecbdb), [`c86bd4e`](https://github.com/Effect-TS/effect/commit/c86bd4e134c23146c216f9ff97e03781d55991b6), [`bbdd365`](https://github.com/Effect-TS/effect/commit/bbdd36567706c94cdec45bacea825941c347b6cd), [`ab3180f`](https://github.com/Effect-TS/effect/commit/ab3180f827041d0ea3b2d72254a1a8683e99e056), [`bbdd365`](https://github.com/Effect-TS/effect/commit/bbdd36567706c94cdec45bacea825941c347b6cd)]: - - @effect/platform@0.58.10 - - effect@3.4.3 - - @effect/schema@0.68.10 - - @effect/rpc@0.31.10 - -## 0.29.9 - -### Patch Changes - -- Updated dependencies [[`0b47fdf`](https://github.com/Effect-TS/effect/commit/0b47fdfe449f42de89e0e88b61ae5140f629e5c4)]: - - @effect/schema@0.68.9 - - @effect/platform@0.58.9 - - @effect/rpc@0.31.9 - -## 0.29.8 - -### Patch Changes - -- Updated dependencies [[`192261b`](https://github.com/Effect-TS/effect/commit/192261b2aec94e9913ceed83683fdcfbc9fca66f), [`3da1497`](https://github.com/Effect-TS/effect/commit/3da1497b5c9cc886d300258bc928fd68a4fefe6f)]: - - @effect/schema@0.68.8 - - effect@3.4.2 - - @effect/platform@0.58.8 - - @effect/rpc@0.31.8 - -## 0.29.7 - -### Patch Changes - -- Updated dependencies [[`027004a`](https://github.com/Effect-TS/effect/commit/027004a897f654791e75faa28eefb50dd0244b6e)]: - - @effect/platform@0.58.7 - - @effect/rpc@0.31.7 - -## 0.29.6 - -### Patch Changes - -- Updated dependencies [[`66a1910`](https://github.com/Effect-TS/effect/commit/66a19109ff90c4252123b8809b8c8a74681dba6a), [`2e8e252`](https://github.com/Effect-TS/effect/commit/2e8e2520cac712f0eb644553bd476429ebd674e4)]: - - effect@3.4.1 - - @effect/platform@0.58.6 - - @effect/rpc@0.31.6 - - @effect/schema@0.68.7 - -## 0.29.5 - -### Patch Changes - -- Updated dependencies [[`37a07a2`](https://github.com/Effect-TS/effect/commit/37a07a2d8d1ce09ab965c0ada84a3fae9a6aba05)]: - - @effect/platform@0.58.5 - - @effect/rpc@0.31.5 - -## 0.29.4 - -### Patch Changes - -- Updated dependencies [[`b77fb0a`](https://github.com/Effect-TS/effect/commit/b77fb0a811ec1ad0e794917077c9a90824515db8)]: - - @effect/platform@0.58.4 - - @effect/rpc@0.31.4 - -## 0.29.3 - -### Patch Changes - -- Updated dependencies [[`530fa9e`](https://github.com/Effect-TS/effect/commit/530fa9e36b8532589b948fc4faa37593f36b7f42)]: - - @effect/schema@0.68.6 - - @effect/platform@0.58.3 - - @effect/rpc@0.31.3 - -## 0.29.2 - -### Patch Changes - -- Updated dependencies [[`1d62815`](https://github.com/Effect-TS/effect/commit/1d62815a50f34115606940ffa397442d75a20c81)]: - - @effect/schema@0.68.5 - - @effect/platform@0.58.2 - - @effect/rpc@0.31.2 - -## 0.29.1 - -### Patch Changes - -- Updated dependencies [[`5a248aa`](https://github.com/Effect-TS/effect/commit/5a248aa5ab2db3f7131ebc79bb9871a76de57973)]: - - @effect/platform@0.58.1 - - @effect/rpc@0.31.1 - -## 0.29.0 - -### Minor Changes - -- [#2938](https://github.com/Effect-TS/effect/pull/2938) [`63dd0c3`](https://github.com/Effect-TS/effect/commit/63dd0c3af45876c1caad7d03356c74daf551c628) Thanks @tim-smart! - restructure platform http to use flattened modules - - Instead of using the previous re-exports, you now use the modules directly. - - Before: - - ```ts - import { HttpClient } from "@effect/platform" - - HttpClient.request.get("/").pipe(HttpClient.client.fetchOk) - ``` - - After: - - ```ts - import { HttpClient, HttpClientRequest } from "@effect/platform" - - HttpClientRequest.get("/").pipe(HttpClient.fetchOk) - ``` - -### Patch Changes - -- Updated dependencies [[`c0ce180`](https://github.com/Effect-TS/effect/commit/c0ce180861ad0938053c0e6145e813fa6404df3b), [`63dd0c3`](https://github.com/Effect-TS/effect/commit/63dd0c3af45876c1caad7d03356c74daf551c628), [`61707b6`](https://github.com/Effect-TS/effect/commit/61707b6ffc7397c2ba0dce22512b44955724f60f), [`9c1b5b3`](https://github.com/Effect-TS/effect/commit/9c1b5b39e6c19604ce834f072a114ad392c50a06), [`a35faf8`](https://github.com/Effect-TS/effect/commit/a35faf8d116f94899bfc03feab33b004c8ddfdf7), [`ff73c0c`](https://github.com/Effect-TS/effect/commit/ff73c0cacd66132bfad2e5211b3eae347729c667), [`984d516`](https://github.com/Effect-TS/effect/commit/984d516ccd9412dc41188f6a46b748dd20dd5848), [`8c3b8a2`](https://github.com/Effect-TS/effect/commit/8c3b8a2ce208eab753b6206a51605a424f104e98), [`017e2f9`](https://github.com/Effect-TS/effect/commit/017e2f9b371ce24ea4945e5d7390c934ad3c39cf), [`91bf8a2`](https://github.com/Effect-TS/effect/commit/91bf8a2e9d1959393b3cf7366cc1d584d3e666b7), [`c6a4a26`](https://github.com/Effect-TS/effect/commit/c6a4a266606575fd2c7165940c4072ad4c57d01f)]: - - effect@3.4.0 - - @effect/platform@0.58.0 - - @effect/rpc@0.31.0 - - @effect/schema@0.68.4 - -## 0.28.52 - -### Patch Changes - -- Updated dependencies [[`3ba7ea1`](https://github.com/Effect-TS/effect/commit/3ba7ea1c3c2923e85bf2f17e41176f8f8796d203)]: - - @effect/platform@0.57.8 - - @effect/rpc@0.30.52 - -## 0.28.51 - -### Patch Changes - -- Updated dependencies [[`d473800`](https://github.com/Effect-TS/effect/commit/d47380012c3241d7287b66968d33a2414275ce7b)]: - - @effect/schema@0.68.3 - - @effect/platform@0.57.7 - - @effect/rpc@0.30.51 - -## 0.28.50 - -### Patch Changes - -- Updated dependencies [[`eb341b3`](https://github.com/Effect-TS/effect/commit/eb341b3eb34ad64499371bc08b7f59e429979d8a)]: - - @effect/schema@0.68.2 - - @effect/platform@0.57.6 - - @effect/rpc@0.30.50 - -## 0.28.49 - -### Patch Changes - -- Updated dependencies [[`b8ea6aa`](https://github.com/Effect-TS/effect/commit/b8ea6aa479006358042b4256ee0a1c5cfbe57acb)]: - - @effect/platform@0.57.5 - - @effect/rpc@0.30.49 - -## 0.28.48 - -### Patch Changes - -- Updated dependencies [[`b51e266`](https://github.com/Effect-TS/effect/commit/b51e26662b879b55d2c5164b7c97742739aa9446), [`6c89408`](https://github.com/Effect-TS/effect/commit/6c89408cd7b9204ec4c5828a46cd5312d8afb5e7)]: - - @effect/schema@0.68.1 - - effect@3.3.5 - - @effect/platform@0.57.4 - - @effect/rpc@0.30.48 - -## 0.28.47 - -### Patch Changes - -- Updated dependencies [[`f6c7977`](https://github.com/Effect-TS/effect/commit/f6c79772e632c440b7e5221bb75f0ef9d3c3b005), [`a67b8fe`](https://github.com/Effect-TS/effect/commit/a67b8fe2ace08419424811b5f0d9a5378eaea352)]: - - @effect/schema@0.68.0 - - effect@3.3.4 - - @effect/platform@0.57.3 - - @effect/rpc@0.30.47 - -## 0.28.46 - -### Patch Changes - -- Updated dependencies [[`3b15e1b`](https://github.com/Effect-TS/effect/commit/3b15e1b505c0b0e62a03b4a3605d42a9932cc99c), [`06ede85`](https://github.com/Effect-TS/effect/commit/06ede85d6e84710e6622463be95ff3927fb30dad), [`3a750b2`](https://github.com/Effect-TS/effect/commit/3a750b25b1ed92094a7f7ebc332a6bcfb212871b), [`7204ca5`](https://github.com/Effect-TS/effect/commit/7204ca5761c2b1d27999a624db23aa10b6e0504d)]: - - @effect/schema@0.67.24 - - effect@3.3.3 - - @effect/platform@0.57.2 - - @effect/rpc@0.30.46 - -## 0.28.45 - -### Patch Changes - -- Updated dependencies [[`2ee4f2b`](https://github.com/Effect-TS/effect/commit/2ee4f2be7fd63074a9cbac6dcdfb533b6683533a), [`07e12ec`](https://github.com/Effect-TS/effect/commit/07e12ecdb0e20b9763bd9e9058e567a7c8862efc), [`3572646`](https://github.com/Effect-TS/effect/commit/3572646d5e0804f85bc7f64633fb95722533f9dd), [`1aed347`](https://github.com/Effect-TS/effect/commit/1aed347a125ed3847ec90863424810d6759cbc85), [`df4bf4b`](https://github.com/Effect-TS/effect/commit/df4bf4b62e7b316c6647da0271fc5544a84e7ba2), [`f085f92`](https://github.com/Effect-TS/effect/commit/f085f92dfa204afb41823ffc27d437225137643d), [`9b3b4ac`](https://github.com/Effect-TS/effect/commit/9b3b4ac639d98aae33883926bece1e31fa280d22)]: - - @effect/schema@0.67.23 - - @effect/platform@0.57.1 - - effect@3.3.2 - - @effect/rpc@0.30.45 - -## 0.28.44 - -### Patch Changes - -- Updated dependencies [[`eb98c5b`](https://github.com/Effect-TS/effect/commit/eb98c5b79ab50aa0cde239bd4e660dd19dbab612), [`184fed8`](https://github.com/Effect-TS/effect/commit/184fed83ac36cba05a75a5a8013f740f9f696e3b), [`4d3fbe8`](https://github.com/Effect-TS/effect/commit/4d3fbe82e8cec13ccd0cd0b2096deac6818fb59a), [`6068e07`](https://github.com/Effect-TS/effect/commit/6068e073d4cc8b3c8583583fd5eb3efe43f7d5ba), [`3a77e20`](https://github.com/Effect-TS/effect/commit/3a77e209783933bac3aaddba1b05ff6a9ac72b36), [`d79ca17`](https://github.com/Effect-TS/effect/commit/d79ca17d9fa432571c69714776cab5cf8fef9c34)]: - - effect@3.3.1 - - @effect/platform@0.57.0 - - @effect/schema@0.67.22 - - @effect/rpc@0.30.44 - -## 0.28.43 - -### Patch Changes - -- Updated dependencies [[`2b9ddfc`](https://github.com/Effect-TS/effect/commit/2b9ddfcbac505d98551e764a43923854907ca5c1), [`1f4ac00`](https://github.com/Effect-TS/effect/commit/1f4ac00a91c336c9c9c9b8c3ed9ceb9920ebc9bd), [`9305b76`](https://github.com/Effect-TS/effect/commit/9305b764cceeae4f16564435ae7172f79c2bf822), [`0f40d98`](https://github.com/Effect-TS/effect/commit/0f40d989da10f68df3ecd72b36849401ad679bfb), [`188f0a5`](https://github.com/Effect-TS/effect/commit/188f0a5c57ed0d7c9e5852e0c1c998f1b95810a1), [`b761ef0`](https://github.com/Effect-TS/effect/commit/b761ef00eaf6c67b7ffe34798b98aae5347ab376), [`b53f69b`](https://github.com/Effect-TS/effect/commit/b53f69bff1452a487b21198cd83961f844e02d36), [`0f40d98`](https://github.com/Effect-TS/effect/commit/0f40d989da10f68df3ecd72b36849401ad679bfb), [`5bd549e`](https://github.com/Effect-TS/effect/commit/5bd549e4bd7144727db438ecca6b8dc9b3ef7e22), [`67f160a`](https://github.com/Effect-TS/effect/commit/67f160a213de0219a565d4bf653b3cbf24f58e8f), [`67f160a`](https://github.com/Effect-TS/effect/commit/67f160a213de0219a565d4bf653b3cbf24f58e8f)]: - - @effect/platform@0.56.0 - - effect@3.3.0 - - @effect/schema@0.67.21 - - @effect/rpc@0.30.43 - -## 0.28.42 - -### Patch Changes - -- Updated dependencies [[`4c6bc7f`](https://github.com/Effect-TS/effect/commit/4c6bc7f190c142dc9db70b365a2bf30715a98e62), [`7c4d500`](https://github.com/Effect-TS/effect/commit/7c4d500af6623ecc2aaf301a334820caaf00ca35), [`a67d602`](https://github.com/Effect-TS/effect/commit/a67d60276f96cd20b76145b4cee13efca6c6158a)]: - - @effect/schema@0.67.20 - - @effect/rpc@0.30.42 - - @effect/platform@0.55.7 - -## 0.28.41 - -### Patch Changes - -- Updated dependencies [[`8c5d280`](https://github.com/Effect-TS/effect/commit/8c5d280c0402284a4e58372867a15a431cb99461), [`6ba6d26`](https://github.com/Effect-TS/effect/commit/6ba6d269f5891e6b11aa35c5281dde4bf3273004), [`cd7496b`](https://github.com/Effect-TS/effect/commit/cd7496ba214eabac2e3c297f513fcbd5b11f0e91), [`3f28bf2`](https://github.com/Effect-TS/effect/commit/3f28bf274333611906175446b772243f34f1b6d5), [`5817820`](https://github.com/Effect-TS/effect/commit/58178204a770d1a78c06945ef438f9fffbb50afa), [`349a036`](https://github.com/Effect-TS/effect/commit/349a036ffb08351481c060655660a6ccf26473de), [`799aa20`](https://github.com/Effect-TS/effect/commit/799aa20b4f618736ba33a5297fda90a75d4c26c6)]: - - effect@3.2.9 - - @effect/schema@0.67.19 - - @effect/platform@0.55.6 - - @effect/rpc@0.30.41 - -## 0.28.40 - -### Patch Changes - -- Updated dependencies [[`a0dd1c1`](https://github.com/Effect-TS/effect/commit/a0dd1c1ede2a1e856ecb0e67826ec992016fef97)]: - - @effect/schema@0.67.18 - - @effect/platform@0.55.5 - - @effect/rpc@0.30.40 - -## 0.28.39 - -### Patch Changes - -- Updated dependencies [[`d9d22e7`](https://github.com/Effect-TS/effect/commit/d9d22e7c4d5e31d5b46644c729b027796e467c16), [`3c080f7`](https://github.com/Effect-TS/effect/commit/3c080f74b2e2290edb6143c3aa01026e57f87a2a), [`3c080f7`](https://github.com/Effect-TS/effect/commit/3c080f74b2e2290edb6143c3aa01026e57f87a2a), [`7d6d875`](https://github.com/Effect-TS/effect/commit/7d6d8750077d9c8379f37240745240d7f3b7a4f8), [`70cda70`](https://github.com/Effect-TS/effect/commit/70cda704e8e31c80737b95121c8199e726ea132f), [`fb91f17`](https://github.com/Effect-TS/effect/commit/fb91f17098b48497feca9ec976feb87e4a82451b)]: - - @effect/schema@0.67.17 - - effect@3.2.8 - - @effect/platform@0.55.4 - - @effect/rpc@0.30.39 - -## 0.28.38 - -### Patch Changes - -- Updated dependencies [[`5745886`](https://github.com/Effect-TS/effect/commit/57458869859943410221ccc87f8cecfba7c79d92), [`6801fca`](https://github.com/Effect-TS/effect/commit/6801fca44366be3ee1b6b99f54bd4f38a1b5e4f4)]: - - @effect/schema@0.67.16 - - effect@3.2.7 - - @effect/platform@0.55.3 - - @effect/rpc@0.30.38 - -## 0.28.37 - -### Patch Changes - -- Updated dependencies [[`2c2280b`](https://github.com/Effect-TS/effect/commit/2c2280b98a11fc002663c55792a4fa5781cd5fb6), [`e2740fc`](https://github.com/Effect-TS/effect/commit/e2740fc4e212ba85a90541e8c8d85b0bcd5c2e7c), [`cc8ac50`](https://github.com/Effect-TS/effect/commit/cc8ac5080daba8622ca2ff5dab5c37ddfab732ba), [`60fe3d5`](https://github.com/Effect-TS/effect/commit/60fe3d5fb2be168dd35c6d0cb8ac8f55deb30fc0)]: - - @effect/platform@0.55.2 - - @effect/schema@0.67.15 - - effect@3.2.6 - - @effect/rpc@0.30.37 - -## 0.28.36 - -### Patch Changes - -- Updated dependencies [[`c5846e9`](https://github.com/Effect-TS/effect/commit/c5846e99137e9eb02efd31865e26f49f0d2c7c03)]: - - @effect/schema@0.67.14 - - @effect/platform@0.55.1 - - @effect/rpc@0.30.36 - -## 0.28.35 - -### Patch Changes - -- Updated dependencies [[`608b01f`](https://github.com/Effect-TS/effect/commit/608b01fc342dbae2a642b308a67b84ead530ecea), [`031c712`](https://github.com/Effect-TS/effect/commit/031c7122a24ac42e48d6a434646b4f5d279d7442), [`a44e532`](https://github.com/Effect-TS/effect/commit/a44e532cf3a6a498b12a5aacf8124aa267e24ba0), [`5133ca9`](https://github.com/Effect-TS/effect/commit/5133ca9dc4b8da0e28951316da9ab55dfbe0fbb9)]: - - effect@3.2.5 - - @effect/platform@0.55.0 - - @effect/rpc@0.30.35 - - @effect/schema@0.67.13 - -## 0.28.34 - -### Patch Changes - -- Updated dependencies [[`1af94df`](https://github.com/Effect-TS/effect/commit/1af94df6b74aeb4f6ebcbe80e074b4cb252e62e3), [`1af94df`](https://github.com/Effect-TS/effect/commit/1af94df6b74aeb4f6ebcbe80e074b4cb252e62e3), [`f8038ca`](https://github.com/Effect-TS/effect/commit/f8038cadd5f50d397469e5fdbc70dd8f69671f50), [`e376641`](https://github.com/Effect-TS/effect/commit/e3766411b60ebb45d31e9c9d94efa099121d4d58), [`c07e0ce`](https://github.com/Effect-TS/effect/commit/c07e0cea8ce165887e2c9dfa5d669eba9b2fb798), [`e313a01`](https://github.com/Effect-TS/effect/commit/e313a01b7e80f6cb7704055a190e5623c9d22c6d), [`1af94df`](https://github.com/Effect-TS/effect/commit/1af94df6b74aeb4f6ebcbe80e074b4cb252e62e3)]: - - effect@3.2.4 - - @effect/platform@0.54.0 - - @effect/schema@0.67.12 - - @effect/rpc@0.30.34 - -## 0.28.33 - -### Patch Changes - -- Updated dependencies [[`5af633e`](https://github.com/Effect-TS/effect/commit/5af633eb5ff6560a64d87263d1692bb9c75f7b3c), [`45578e8`](https://github.com/Effect-TS/effect/commit/45578e8faa80ae33d23e08f6f19467f818b7788f)]: - - @effect/schema@0.67.11 - - effect@3.2.3 - - @effect/platform@0.53.14 - - @effect/rpc@0.30.33 - -## 0.28.32 - -### Patch Changes - -- Updated dependencies [[`5d9266e`](https://github.com/Effect-TS/effect/commit/5d9266e8c740746ac9e186c3df6090a1b57fbe2a), [`9f8122e`](https://github.com/Effect-TS/effect/commit/9f8122e78884ab47c5e5f364d86eee1d1543cc61), [`6a6f670`](https://github.com/Effect-TS/effect/commit/6a6f6706b8613c8c7c10971b8d81a0f9e440a6f2), [`c1eaef9`](https://github.com/Effect-TS/effect/commit/c1eaef910420dae416923d172ee58d219e921d0f), [`78ffc27`](https://github.com/Effect-TS/effect/commit/78ffc27ee3fa708433c25fa118c53d38d90d08bc)]: - - effect@3.2.2 - - @effect/platform@0.53.13 - - @effect/schema@0.67.10 - - @effect/rpc@0.30.32 - -## 0.28.31 - -### Patch Changes - -- Updated dependencies [[`5432fff`](https://github.com/Effect-TS/effect/commit/5432fff7c9a69d43910426c1053ebfc3b73ebed6)]: - - @effect/schema@0.67.9 - - @effect/platform@0.53.12 - - @effect/rpc@0.30.31 - -## 0.28.30 - -### Patch Changes - -- Updated dependencies [[`c1e991d`](https://github.com/Effect-TS/effect/commit/c1e991dd5ba87901cd0e05697a8b4a267e7e954a)]: - - effect@3.2.1 - - @effect/platform@0.53.11 - - @effect/rpc@0.30.30 - - @effect/schema@0.67.8 - -## 0.28.29 - -### Patch Changes - -- Updated dependencies [[`146cadd`](https://github.com/Effect-TS/effect/commit/146cadd9d004634a3ff85c480bf92cf975c853e2), [`7135748`](https://github.com/Effect-TS/effect/commit/713574813a0f64085db0b5240ba39e7a0a7c137e), [`7135748`](https://github.com/Effect-TS/effect/commit/713574813a0f64085db0b5240ba39e7a0a7c137e), [`963b4e7`](https://github.com/Effect-TS/effect/commit/963b4e7ac87e2468feb6a344f7ab4ee4ad711198), [`64c9414`](https://github.com/Effect-TS/effect/commit/64c9414e960e82058ca09bbb3976d6fbef303a8e), [`7135748`](https://github.com/Effect-TS/effect/commit/713574813a0f64085db0b5240ba39e7a0a7c137e), [`2cbb76b`](https://github.com/Effect-TS/effect/commit/2cbb76bb52500a3f4bf27d1c91482518cbea56d7), [`870c5fa`](https://github.com/Effect-TS/effect/commit/870c5fa52cd61e745e8e828d38c3f09f00737553), [`146cadd`](https://github.com/Effect-TS/effect/commit/146cadd9d004634a3ff85c480bf92cf975c853e2), [`7135748`](https://github.com/Effect-TS/effect/commit/713574813a0f64085db0b5240ba39e7a0a7c137e), [`64c9414`](https://github.com/Effect-TS/effect/commit/64c9414e960e82058ca09bbb3976d6fbef303a8e)]: - - effect@3.2.0 - - @effect/platform@0.53.10 - - @effect/rpc@0.30.29 - - @effect/schema@0.67.7 - -## 0.28.28 - -### Patch Changes - -- Updated dependencies [[`17da864`](https://github.com/Effect-TS/effect/commit/17da864e4a6f80becdb82db7dece2ba583bfdda3), [`17fc22e`](https://github.com/Effect-TS/effect/commit/17fc22e132593c5caa563705a4748ba0f04a853c), [`810f222`](https://github.com/Effect-TS/effect/commit/810f222268792b13067c7a7bf317b93a9bb8917b), [`596aaea`](https://github.com/Effect-TS/effect/commit/596aaea022648b2e06fb1ec22f1652043d6fe64e), [`ff0efa0`](https://github.com/Effect-TS/effect/commit/ff0efa0a1415a41d4a4312a16cf7a63def86db3f)]: - - @effect/schema@0.67.6 - - @effect/platform@0.53.9 - - effect@3.1.6 - - @effect/rpc@0.30.28 - -## 0.28.27 - -### Patch Changes - -- Updated dependencies [[`9c514de`](https://github.com/Effect-TS/effect/commit/9c514de28152696edff008324d2d7e67d55afd56)]: - - @effect/schema@0.67.5 - - @effect/platform@0.53.8 - - @effect/rpc@0.30.27 - -## 0.28.26 - -### Patch Changes - -- Updated dependencies [[`ee08593`](https://github.com/Effect-TS/effect/commit/ee0859398ecc2589cab0d017bef6a17e00c34dfd), [`da6d7d8`](https://github.com/Effect-TS/effect/commit/da6d7d845246e9d04631d64fa7694944b6010d09)]: - - @effect/schema@0.67.4 - - @effect/platform@0.53.7 - - @effect/rpc@0.30.26 - -## 0.28.25 - -### Patch Changes - -- Updated dependencies [[`6ac4847`](https://github.com/Effect-TS/effect/commit/6ac48479447c01a4f35d655552af93e47e562610), [`6ac4847`](https://github.com/Effect-TS/effect/commit/6ac48479447c01a4f35d655552af93e47e562610)]: - - @effect/platform@0.53.6 - - effect@3.1.5 - - @effect/rpc@0.30.25 - - @effect/schema@0.67.3 - -## 0.28.24 - -### Patch Changes - -- Updated dependencies [[`89a3afb`](https://github.com/Effect-TS/effect/commit/89a3afbe191c83b84b17bfaa95519aff0749afbe), [`992c8e2`](https://github.com/Effect-TS/effect/commit/992c8e21535db9f0c66e81d32fee8af56a96274f)]: - - @effect/schema@0.67.2 - - @effect/platform@0.53.5 - - @effect/rpc@0.30.24 - -## 0.28.23 - -### Patch Changes - -- Updated dependencies [[`e41e911`](https://github.com/Effect-TS/effect/commit/e41e91122fa6dd12fc81e50dcad0db891be67146)]: - - effect@3.1.4 - - @effect/platform@0.53.4 - - @effect/rpc@0.30.23 - - @effect/schema@0.67.1 - -## 0.28.22 - -### Patch Changes - -- Updated dependencies [[`d7e4997`](https://github.com/Effect-TS/effect/commit/d7e49971fe97b7ee5fb7991f3f5ac4d627a26338)]: - - @effect/schema@0.67.0 - - @effect/platform@0.53.3 - - @effect/rpc@0.30.22 - -## 0.28.21 - -### Patch Changes - -- Updated dependencies [[`1f6dc96`](https://github.com/Effect-TS/effect/commit/1f6dc96f51c7bb9c8d11415358308604ba7c7c8e), [`266767c`](https://github.com/Effect-TS/effect/commit/266767cb5837f7bbe59c3e01bdbd2041cbf4e31a)]: - - effect@3.1.3 - - @effect/rpc@0.30.21 - - @effect/platform@0.53.2 - - @effect/schema@0.66.16 - -## 0.28.20 - -### Patch Changes - -- Updated dependencies [[`121d6d9`](https://github.com/Effect-TS/effect/commit/121d6d93755138c7510ba3ab4f0019ec0cb91890)]: - - @effect/schema@0.66.15 - - @effect/platform@0.53.1 - - @effect/rpc@0.30.20 - -## 0.28.19 - -### Patch Changes - -- Updated dependencies [[`d57fbbb`](https://github.com/Effect-TS/effect/commit/d57fbbbd6c466936213a671fc3cd2390064f864e)]: - - @effect/platform@0.53.0 - - @effect/rpc@0.30.19 - -## 0.28.18 - -### Patch Changes - -- Updated dependencies [[`5866c62`](https://github.com/Effect-TS/effect/commit/5866c621d7eb4cc84e4ba972bfdfd219734cd45d)]: - - @effect/platform@0.52.3 - - @effect/rpc@0.30.18 - -## 0.28.17 - -### Patch Changes - -- Updated dependencies [[`2e1cdf6`](https://github.com/Effect-TS/effect/commit/2e1cdf67d141281288fffe9a5c10d1379a800513)]: - - @effect/platform@0.52.2 - - effect@3.1.2 - - @effect/schema@0.66.14 - - @effect/rpc@0.30.17 - -## 0.28.16 - -### Patch Changes - -- Updated dependencies [[`e5e56d1`](https://github.com/Effect-TS/effect/commit/e5e56d138dbed3204636f605229c6685f89659fc)]: - - effect@3.1.1 - - @effect/platform@0.52.1 - - @effect/rpc@0.30.16 - - @effect/schema@0.66.13 - -## 0.28.15 - -### Patch Changes - -- Updated dependencies [[`9deab0a`](https://github.com/Effect-TS/effect/commit/9deab0aec9e99501f9441843e34df9afa10c5be9), [`7719b8a`](https://github.com/Effect-TS/effect/commit/7719b8a7350c14e952ffe685bfd5308773b3e271)]: - - @effect/platform@0.52.0 - - @effect/rpc@0.30.15 - -## 0.28.14 - -### Patch Changes - -- Updated dependencies [[`c3c12c6`](https://github.com/Effect-TS/effect/commit/c3c12c6625633fe80e79f9db75a3b8cf8ca8b11d), [`ba64ea6`](https://github.com/Effect-TS/effect/commit/ba64ea6757810c5e74cad3863a7d19d4d38af66b), [`b5de2d2`](https://github.com/Effect-TS/effect/commit/b5de2d2ce5b1afe8be90827bf898a95cec40eb2b), [`a1c7ab8`](https://github.com/Effect-TS/effect/commit/a1c7ab8ffedacd18c1fc784f4ff5844f79498b83), [`a023f28`](https://github.com/Effect-TS/effect/commit/a023f28336f3865687d9a30c1883e36909906d85), [`0ec93cb`](https://github.com/Effect-TS/effect/commit/0ec93cb4f166e7401c171c2f8e8276ce958d9a57), [`1c9454d`](https://github.com/Effect-TS/effect/commit/1c9454d532eae79b9f759aea77f59332cc6d18ed), [`a023f28`](https://github.com/Effect-TS/effect/commit/a023f28336f3865687d9a30c1883e36909906d85), [`92d56db`](https://github.com/Effect-TS/effect/commit/92d56dbb3f33e36636c2a2f1030c56492e39cf4d)]: - - effect@3.1.0 - - @effect/platform@0.51.0 - - @effect/rpc@0.30.14 - - @effect/schema@0.66.12 - -## 0.28.13 - -### Patch Changes - -- Updated dependencies [[`16039a0`](https://github.com/Effect-TS/effect/commit/16039a08f04f11545e2fdf40952788a8f9cef04f), [`557707b`](https://github.com/Effect-TS/effect/commit/557707bc9e5f230c8964d2757012075c34339b5c), [`d1d33e1`](https://github.com/Effect-TS/effect/commit/d1d33e10b25109f44b5ab1c6e4d778a59c0d3eeb), [`f4ed306`](https://github.com/Effect-TS/effect/commit/f4ed3068a70b50302d078a30d18ca3cfd2bc679c), [`661004f`](https://github.com/Effect-TS/effect/commit/661004f4bf5f8b25f5a0678c21a3a822188ce461), [`e79cb83`](https://github.com/Effect-TS/effect/commit/e79cb83d3b19098bc40a3012e2a059b8426306c2)]: - - @effect/platform@0.50.8 - - effect@3.0.8 - - @effect/schema@0.66.11 - - @effect/rpc@0.30.13 - -## 0.28.12 - -### Patch Changes - -- Updated dependencies [[`18de56b`](https://github.com/Effect-TS/effect/commit/18de56b4a6b6d1f99230dfabf9147d59ea4dd759)]: - - effect@3.0.7 - - @effect/platform@0.50.7 - - @effect/rpc@0.30.12 - - @effect/schema@0.66.10 - -## 0.28.11 - -### Patch Changes - -- Updated dependencies [[`ffe4f4e`](https://github.com/Effect-TS/effect/commit/ffe4f4e95db35fff6869e360b072e3837befa0a1), [`027418e`](https://github.com/Effect-TS/effect/commit/027418edaa6aa6c0ae4861b95832827b45adace4), [`ac1898e`](https://github.com/Effect-TS/effect/commit/ac1898eb7bc96880f911c276048e2ea3d6fe9c50), [`ffe4f4e`](https://github.com/Effect-TS/effect/commit/ffe4f4e95db35fff6869e360b072e3837befa0a1), [`8206529`](https://github.com/Effect-TS/effect/commit/8206529d6a7bbf3e3c6f670afb0381e83176736e)]: - - effect@3.0.6 - - @effect/schema@0.66.9 - - @effect/rpc@0.30.11 - - @effect/platform@0.50.6 - -## 0.28.10 - -### Patch Changes - -- Updated dependencies [[`6222404`](https://github.com/Effect-TS/effect/commit/62224044678751829ed2f128e05133a91c6b0569), [`868ed2a`](https://github.com/Effect-TS/effect/commit/868ed2a8fe94ee7f4206a6070f29dcf2a5ba1dc3)]: - - effect@3.0.5 - - @effect/platform@0.50.5 - - @effect/rpc@0.30.10 - - @effect/schema@0.66.8 - -## 0.28.9 - -### Patch Changes - -- Updated dependencies [[`dd41c6c`](https://github.com/Effect-TS/effect/commit/dd41c6c725b1c1c980683275d8fa69779902187e), [`9a24667`](https://github.com/Effect-TS/effect/commit/9a246672008a2b668d43fbfd2fe5508c54b2b920)]: - - @effect/schema@0.66.7 - - effect@3.0.4 - - @effect/platform@0.50.4 - - @effect/rpc@0.30.9 - -## 0.28.8 - -### Patch Changes - -- Updated dependencies [[`9dfc156`](https://github.com/Effect-TS/effect/commit/9dfc156dc13fb4da9c777aae3acece4b5ecf0064), [`80271bd`](https://github.com/Effect-TS/effect/commit/80271bdc648e9efa659ce66b2c255754a6a1a8b0), [`b3b51a2`](https://github.com/Effect-TS/effect/commit/b3b51a2ea0c6ab92a363db46ebaa7e1176d089f5), [`e4ba97d`](https://github.com/Effect-TS/effect/commit/e4ba97d060c16bdf4e3b5bd5db6777f121a6768c)]: - - @effect/schema@0.66.6 - - @effect/platform@0.50.3 - - @effect/rpc@0.30.8 - -## 0.28.7 - -### Patch Changes - -- Updated dependencies [[`b3fe829`](https://github.com/Effect-TS/effect/commit/b3fe829e8b12726afe94086b5375968f41a26411), [`a58b7de`](https://github.com/Effect-TS/effect/commit/a58b7deb8bb1d3b0dd636decf5d16f115f37eb72), [`d90e8c3`](https://github.com/Effect-TS/effect/commit/d90e8c3090cbc78e2bc7b51c974df66ffefacdfa)]: - - @effect/schema@0.66.5 - - @effect/platform@0.50.2 - - @effect/rpc@0.30.7 - -## 0.28.6 - -### Patch Changes - -- Updated dependencies [[`773b8e0`](https://github.com/Effect-TS/effect/commit/773b8e01521e8fa7c38ff15d92d21d6fd6dad56f)]: - - @effect/schema@0.66.4 - - @effect/platform@0.50.1 - - @effect/rpc@0.30.6 - -## 0.28.5 - -### Patch Changes - -- Updated dependencies [[`6f38dff`](https://github.com/Effect-TS/effect/commit/6f38dff41ffa34532cc2f25b90446550c5730bb6), [`a7b4b84`](https://github.com/Effect-TS/effect/commit/a7b4b84bd5a25f51aba922f9259c3a58c98c6a4e), [`a3b0e6c`](https://github.com/Effect-TS/effect/commit/a3b0e6c490772e6d44b5d98dcf2729c4d5310ecc), [`6f38dff`](https://github.com/Effect-TS/effect/commit/6f38dff41ffa34532cc2f25b90446550c5730bb6)]: - - @effect/platform@0.50.0 - - effect@3.0.3 - - @effect/rpc@0.30.5 - - @effect/schema@0.66.3 - -## 0.28.4 - -### Patch Changes - -- [#2562](https://github.com/Effect-TS/effect/pull/2562) [`2cecdbd`](https://github.com/Effect-TS/effect/commit/2cecdbd1cf30befce4e84796ccd953ea55ecfb86) Thanks [@fubhy](https://github.com/fubhy)! - Added provenance publishing - -- Updated dependencies [[`2cecdbd`](https://github.com/Effect-TS/effect/commit/2cecdbd1cf30befce4e84796ccd953ea55ecfb86)]: - - @effect/platform@0.49.4 - - effect@3.0.2 - - @effect/schema@0.66.2 - - @effect/rpc@0.30.4 - -## 0.28.3 - -### Patch Changes - -- Updated dependencies [[`8d39d65`](https://github.com/Effect-TS/effect/commit/8d39d6554af548228ad767112ce2e0b1f68fa8e1)]: - - @effect/platform@0.49.3 - - @effect/rpc@0.30.3 - -## 0.28.2 - -### Patch Changes - -- Updated dependencies [[`5ef0a1a`](https://github.com/Effect-TS/effect/commit/5ef0a1ae9b773fa2481550cb0d43ff7a0e03cd44)]: - - @effect/platform@0.49.2 - - @effect/rpc@0.30.2 - -## 0.28.1 - -### Patch Changes - -- Updated dependencies [[`3da0cfa`](https://github.com/Effect-TS/effect/commit/3da0cfa12c407fd930dc480be1ecc9217a8058f8), [`570e8d8`](https://github.com/Effect-TS/effect/commit/570e8d87e7c0e9ad4cd2686462fdb9b4812f7716), [`b2b5d66`](https://github.com/Effect-TS/effect/commit/b2b5d6626b18eb5289f364ffab5240e84b04d085), [`87c5687`](https://github.com/Effect-TS/effect/commit/87c5687de0782dab177b7861217fa3b040046282), [`8edacca`](https://github.com/Effect-TS/effect/commit/8edacca37f8e37c01a63fec332b06d9361efaa7b)]: - - effect@3.0.1 - - @effect/schema@0.66.1 - - @effect/platform@0.49.1 - - @effect/rpc@0.30.1 - -## 0.28.0 - -### Minor Changes - -- [#2207](https://github.com/Effect-TS/effect/pull/2207) [`5a2314b`](https://github.com/Effect-TS/effect/commit/5a2314b70ec79c2c02b51cef45a5ddec8327daa1) Thanks [@github-actions](https://github.com/apps/github-actions)! - replace use of `unit` terminology with `void` - - For all the data types. - - ```ts - Effect.unit // => Effect.void - Stream.unit // => Stream.void - - // etc - ``` - -- [#2207](https://github.com/Effect-TS/effect/pull/2207) [`6c6087a`](https://github.com/Effect-TS/effect/commit/6c6087a4a897b64252346426660782d31c13f769) Thanks [@github-actions](https://github.com/apps/github-actions)! - move fetch options to a FiberRef - - This change makes adjusting options to fetch more composable. You can now do: - - ```ts - import { pipe } from "effect" - import * as Http from "@effect/platform/HttpClient" - - pipe( - Http.request.get("https://example.com"), - Http.client.fetchOk, - Http.client.withFetchOptions({ credentials: "include" }), - Http.response.text - ) - ``` - -- [#2207](https://github.com/Effect-TS/effect/pull/2207) [`2fb7d9c`](https://github.com/Effect-TS/effect/commit/2fb7d9ca15037ff62a578bb9fe5732da5f4f317d) Thanks [@github-actions](https://github.com/apps/github-actions)! - Release Effect 3.0 🎉 - -### Patch Changes - -- [#2529](https://github.com/Effect-TS/effect/pull/2529) [`78b767c`](https://github.com/Effect-TS/effect/commit/78b767c2b1625186e17131761a0edbac25d21850) Thanks [@fubhy](https://github.com/fubhy)! - Renamed `ReadonlyArray` and `ReadonlyRecord` modules for better discoverability. - -- Updated dependencies [[`1b5f0c7`](https://github.com/Effect-TS/effect/commit/1b5f0c77e7fd477a0026071e82129a948227f4b3), [`d50a652`](https://github.com/Effect-TS/effect/commit/d50a652479f4d1d64f48da05c79fa847e6e51548), [`9aeae46`](https://github.com/Effect-TS/effect/commit/9aeae461fdf9265389cf3dfe4e428b037215ba5f), [`9a3bd47`](https://github.com/Effect-TS/effect/commit/9a3bd47ebd0750c7e498162734f6d21895de0cb2), [`6460414`](https://github.com/Effect-TS/effect/commit/6460414351a45fb8e0a457c63f3653422efee766), [`cf69f46`](https://github.com/Effect-TS/effect/commit/cf69f46690058d71eeada03cfb40dc744573e9e4), [`cf69f46`](https://github.com/Effect-TS/effect/commit/cf69f46690058d71eeada03cfb40dc744573e9e4), [`e542371`](https://github.com/Effect-TS/effect/commit/e542371981f8b4b484979feaad8a25b1f45e2df0), [`be9d025`](https://github.com/Effect-TS/effect/commit/be9d025e42355260ace02dd135851a8935a4deba), [`78b767c`](https://github.com/Effect-TS/effect/commit/78b767c2b1625186e17131761a0edbac25d21850), [`aa4a3b5`](https://github.com/Effect-TS/effect/commit/aa4a3b550da1c1020265ac389ed3f309388994a2), [`1499974`](https://github.com/Effect-TS/effect/commit/14999741d2e19c1747f6a7e19d68977f6429cdb8), [`1b5f0c7`](https://github.com/Effect-TS/effect/commit/1b5f0c77e7fd477a0026071e82129a948227f4b3), [`5c2b561`](https://github.com/Effect-TS/effect/commit/5c2b5614f583b88784ed68126ae939832fb3c092), [`6c6087a`](https://github.com/Effect-TS/effect/commit/6c6087a4a897b64252346426660782d31c13f769), [`a18f594`](https://github.com/Effect-TS/effect/commit/a18f5948f1439a147232448b2c443472fda0eceb), [`1499974`](https://github.com/Effect-TS/effect/commit/14999741d2e19c1747f6a7e19d68977f6429cdb8), [`2f96d93`](https://github.com/Effect-TS/effect/commit/2f96d938b90f8c19377583279e3c7afd9b509c50), [`5a2314b`](https://github.com/Effect-TS/effect/commit/5a2314b70ec79c2c02b51cef45a5ddec8327daa1), [`25d74f8`](https://github.com/Effect-TS/effect/commit/25d74f8c4d2dd4a9e5ec57ce2f20d36dedd25343), [`6c6087a`](https://github.com/Effect-TS/effect/commit/6c6087a4a897b64252346426660782d31c13f769), [`271b79f`](https://github.com/Effect-TS/effect/commit/271b79fc0b66a6c11e07a8779ff8800493a7eac2), [`1b5f0c7`](https://github.com/Effect-TS/effect/commit/1b5f0c77e7fd477a0026071e82129a948227f4b3), [`2fb7d9c`](https://github.com/Effect-TS/effect/commit/2fb7d9ca15037ff62a578bb9fe5732da5f4f317d), [`53d1c2a`](https://github.com/Effect-TS/effect/commit/53d1c2a77559081fbb89667e343346375c6d6650), [`e7e1bbe`](https://github.com/Effect-TS/effect/commit/e7e1bbe68486fdf31c8f84b0880522d39adcaad3), [`10c169e`](https://github.com/Effect-TS/effect/commit/10c169eadc874e91b4defca3f467b4e6a50fd8f3), [`6424181`](https://github.com/Effect-TS/effect/commit/64241815fe6a939e91e6947253e7dceea1306aa8)]: - - effect@3.0.0 - - @effect/schema@0.66.0 - - @effect/platform@0.49.0 - - @effect/rpc@0.30.0 - -## 0.27.5 - -### Patch Changes - -- Updated dependencies [[`b79cc59`](https://github.com/Effect-TS/effect/commit/b79cc59dbe64b9a0a7742dc9100a9d36c8e46b72)]: - - @effect/platform@0.48.29 - - @effect/rpc@0.29.5 - -## 0.27.4 - -### Patch Changes - -- [#2516](https://github.com/Effect-TS/effect/pull/2516) [`646b5da`](https://github.com/Effect-TS/effect/commit/646b5da1143c015c3a0cf2e10958d4c91fd1ffdf) Thanks [@tim-smart](https://github.com/tim-smart)! - ensure context is available in rpc http stream - -- Updated dependencies [[`0aee906`](https://github.com/Effect-TS/effect/commit/0aee906f034539344db6fbac08919de3e28eccde), [`41c8102`](https://github.com/Effect-TS/effect/commit/41c810228b1a50e4b41f19e735d7c62fe8d36871), [`4c37001`](https://github.com/Effect-TS/effect/commit/4c370013417e18c4f564818de1341a8fccb43b4c), [`776ef2b`](https://github.com/Effect-TS/effect/commit/776ef2bb66db9aa9f68b7beab14f6986f9c1288b), [`217147e`](https://github.com/Effect-TS/effect/commit/217147ea67c5c42c96f024775c41e5b070f81e4c), [`8a69b4e`](https://github.com/Effect-TS/effect/commit/8a69b4ef6a3a06d2e21fe2e11a626038beefb4e1), [`90776ec`](https://github.com/Effect-TS/effect/commit/90776ec8e8671d835b65fc33ead1de6c864b81b9), [`b3acf47`](https://github.com/Effect-TS/effect/commit/b3acf47f9c9dfae1c99377aa906097aaa2d47d44), [`8709856`](https://github.com/Effect-TS/effect/commit/870985694ae985c3cb9360ad8a25c60e6f785f55), [`232c353`](https://github.com/Effect-TS/effect/commit/232c353c2e6f743f38e57639ee30e324ffa9c2a9), [`0d3231a`](https://github.com/Effect-TS/effect/commit/0d3231a195202635ecc0bf6bbf6a08fc017d0d69), [`0ca835c`](https://github.com/Effect-TS/effect/commit/0ca835cbac8e69072a93ace83b534219faba24e8), [`8709856`](https://github.com/Effect-TS/effect/commit/870985694ae985c3cb9360ad8a25c60e6f785f55), [`d590094`](https://github.com/Effect-TS/effect/commit/d5900943489ec1e0891836aeafb5ce99fb9c75c7), [`c22b019`](https://github.com/Effect-TS/effect/commit/c22b019e5eaf9d3a937a3d99cadbb8f8e9116a70), [`e983740`](https://github.com/Effect-TS/effect/commit/e9837401145605aff5bc2ec7e73004f397c5d2d1), [`e3e0924`](https://github.com/Effect-TS/effect/commit/e3e09247d46a35430fc60e4aa4032cc50814f212)]: - - @effect/schema@0.65.0 - - effect@2.4.19 - - @effect/platform@0.48.28 - - @effect/rpc@0.29.4 - -## 0.27.3 - -### Patch Changes - -- Updated dependencies [[`c6dd3c6`](https://github.com/Effect-TS/effect/commit/c6dd3c6909cafe05adc8450c5a499260e17e60d3), [`672f137`](https://github.com/Effect-TS/effect/commit/672f13747ddf6dac3ba304fd4511b1df44ab566d), [`42b3651`](https://github.com/Effect-TS/effect/commit/42b36519f356bae9258a1ea1d416e2902b973e85), [`672f137`](https://github.com/Effect-TS/effect/commit/672f13747ddf6dac3ba304fd4511b1df44ab566d)]: - - @effect/platform@0.48.27 - - @effect/schema@0.64.20 - - @effect/rpc@0.29.3 - -## 0.27.2 - -### Patch Changes - -- Updated dependencies [[`365a486`](https://github.com/Effect-TS/effect/commit/365a4865de5e47ce09f4cfd51fc0f67438f82a57)]: - - @effect/platform@0.48.26 - - @effect/rpc@0.29.2 - -## 0.27.1 - -### Patch Changes - -- Updated dependencies [[`dadc690`](https://github.com/Effect-TS/effect/commit/dadc6906121c512bc32be22b52adbd1ada834594), [`58f66fe`](https://github.com/Effect-TS/effect/commit/58f66fecd4e646c6c8f10995df9faab17022eb8f), [`3cad21d`](https://github.com/Effect-TS/effect/commit/3cad21daa5d2332d33692498c87b7ffff979e304), [`d209171`](https://github.com/Effect-TS/effect/commit/d2091714a786820ebae4bef04a9d67d25dd08e88)]: - - effect@2.4.18 - - @effect/schema@0.64.19 - - @effect/platform@0.48.25 - - @effect/rpc@0.29.1 - -## 0.27.0 - -### Minor Changes - -- [#2455](https://github.com/Effect-TS/effect/pull/2455) [`e066ae2`](https://github.com/Effect-TS/effect/commit/e066ae2df3c6efb6fff4c4f49deb3b7d9a14e6c9) Thanks [@tim-smart](https://github.com/tim-smart)! - move non-streaming rpc apis to seperate module - -### Patch Changes - -- [#2455](https://github.com/Effect-TS/effect/pull/2455) [`e066ae2`](https://github.com/Effect-TS/effect/commit/e066ae2df3c6efb6fff4c4f49deb3b7d9a14e6c9) Thanks [@tim-smart](https://github.com/tim-smart)! - fix return type of HttpResolver.makeClient - -- Updated dependencies [[`e066ae2`](https://github.com/Effect-TS/effect/commit/e066ae2df3c6efb6fff4c4f49deb3b7d9a14e6c9), [`9c6a500`](https://github.com/Effect-TS/effect/commit/9c6a5001b467b6255c68a922f4b6e8d692b63d01), [`8fdfda6`](https://github.com/Effect-TS/effect/commit/8fdfda6618be848c01b399d13bc05a9a3adfb613), [`607b2e7`](https://github.com/Effect-TS/effect/commit/607b2e7a7fd9318c57acf4e50ec61747eea74ad7), [`8fdfda6`](https://github.com/Effect-TS/effect/commit/8fdfda6618be848c01b399d13bc05a9a3adfb613), [`35ad0ba`](https://github.com/Effect-TS/effect/commit/35ad0ba9f3ba27c60453620e514b980f819f92af), [`8206caf`](https://github.com/Effect-TS/effect/commit/8206caf7c2d22c68be4313318b61cfdacf6222b6), [`7ddd654`](https://github.com/Effect-TS/effect/commit/7ddd65415b65ccb654ad04f4dbefe39402f15117), [`7ddd654`](https://github.com/Effect-TS/effect/commit/7ddd65415b65ccb654ad04f4dbefe39402f15117), [`8fdfda6`](https://github.com/Effect-TS/effect/commit/8fdfda6618be848c01b399d13bc05a9a3adfb613), [`f456ba2`](https://github.com/Effect-TS/effect/commit/f456ba273bae21a6dcf8c966c50c97b5f0897d9f)]: - - @effect/rpc@0.29.0 - - @effect/platform@0.48.24 - - effect@2.4.17 - - @effect/schema@0.64.18 - -## 0.26.44 - -### Patch Changes - -- Updated dependencies [[`5170ce7`](https://github.com/Effect-TS/effect/commit/5170ce708c606283e8a30d273950f1a21c7eddc2), [`63a1df2`](https://github.com/Effect-TS/effect/commit/63a1df2e4de3766f48f15676fbd0360ab9c27816), [`5170ce7`](https://github.com/Effect-TS/effect/commit/5170ce708c606283e8a30d273950f1a21c7eddc2), [`62a7f23`](https://github.com/Effect-TS/effect/commit/62a7f23937c0dfaca67a7b2f055b85cfde25ed11), [`7cc2b41`](https://github.com/Effect-TS/effect/commit/7cc2b41d6c551fdca2590b06681c5ad9832aba46), [`74a5dae`](https://github.com/Effect-TS/effect/commit/74a5daed0e65b32a36e026bfcf66d02269cb967a), [`8b46fde`](https://github.com/Effect-TS/effect/commit/8b46fdebf2c075a74cd2cd29dfb69531d20fc154)]: - - @effect/platform@0.48.23 - - effect@2.4.16 - - @effect/schema@0.64.17 - - @effect/rpc@0.28.23 - -## 0.26.43 - -### Patch Changes - -- Updated dependencies [[`a31917a`](https://github.com/Effect-TS/effect/commit/a31917aa4b05b1189b7a8e0bedb60bb3d49262ad), [`4cd2bed`](https://github.com/Effect-TS/effect/commit/4cd2bedf978f864bddd289d1c524c8e868bf587b), [`6cc6267`](https://github.com/Effect-TS/effect/commit/6cc6267026d9bfb1a9882cddf534787327e86ec1)]: - - @effect/schema@0.64.16 - - @effect/platform@0.48.22 - - @effect/rpc@0.28.22 - -## 0.26.42 - -### Patch Changes - -- Updated dependencies [[`d7688c0`](https://github.com/Effect-TS/effect/commit/d7688c0c72717fe7876c871567f6946dabfc0546), [`b3a4fac`](https://github.com/Effect-TS/effect/commit/b3a4face2acaca422f0b0530436e8f13129f3b3a), [`5ded019`](https://github.com/Effect-TS/effect/commit/5ded019970169e3c1f2a375d0876b95fb1ff67f5)]: - - effect@2.4.15 - - @effect/schema@0.64.15 - - @effect/platform@0.48.21 - - @effect/rpc@0.28.21 - -## 0.26.41 - -### Patch Changes - -- Updated dependencies [[`4789083`](https://github.com/Effect-TS/effect/commit/4789083283bdaec456982d614ebc4a496ea0e7f7), [`4789083`](https://github.com/Effect-TS/effect/commit/4789083283bdaec456982d614ebc4a496ea0e7f7)]: - - @effect/platform@0.48.20 - - @effect/rpc@0.28.20 - -## 0.26.40 - -### Patch Changes - -- Updated dependencies [[`fb7285e`](https://github.com/Effect-TS/effect/commit/fb7285e8d6a70527df7137a6a3efdd03ae61cb8b)]: - - @effect/platform@0.48.19 - - @effect/rpc@0.28.19 - -## 0.26.39 - -### Patch Changes - -- Updated dependencies [[`26435ec`](https://github.com/Effect-TS/effect/commit/26435ecfa06569dc18d1801ccf38213a43b7c334), [`a76e5e1`](https://github.com/Effect-TS/effect/commit/a76e5e131a35c88a72771fb745df08f60fbc0e18), [`6180c0c`](https://github.com/Effect-TS/effect/commit/6180c0cc51dee785cfce72220a52c9fc3b9bf9aa)]: - - @effect/platform@0.48.18 - - @effect/schema@0.64.14 - - effect@2.4.14 - - @effect/rpc@0.28.18 - -## 0.26.38 - -### Patch Changes - -- Updated dependencies [[`47a8f1b`](https://github.com/Effect-TS/effect/commit/47a8f1b644d8294692d92cacd3c8c7543edbfabe), [`8c9abe2`](https://github.com/Effect-TS/effect/commit/8c9abe2b35c46d8891d4b2c14ff9eb46302a14f3), [`8c9abe2`](https://github.com/Effect-TS/effect/commit/8c9abe2b35c46d8891d4b2c14ff9eb46302a14f3), [`3336287`](https://github.com/Effect-TS/effect/commit/3336287ff55a25e56d759b83847bfaa21c40f499), [`54b7c00`](https://github.com/Effect-TS/effect/commit/54b7c0077fa784ad2646b812d6a44641f672edcd), [`3336287`](https://github.com/Effect-TS/effect/commit/3336287ff55a25e56d759b83847bfaa21c40f499), [`47a8f1b`](https://github.com/Effect-TS/effect/commit/47a8f1b644d8294692d92cacd3c8c7543edbfabe)]: - - @effect/platform@0.48.17 - - effect@2.4.13 - - @effect/rpc@0.28.17 - - @effect/schema@0.64.13 - -## 0.26.37 - -### Patch Changes - -- [#2385](https://github.com/Effect-TS/effect/pull/2385) [`3307729`](https://github.com/Effect-TS/effect/commit/3307729de162a033fa9caa8e14c111013dcf0d87) Thanks [@tim-smart](https://github.com/tim-smart)! - update typescript to 5.4 - -- Updated dependencies [[`9392de6`](https://github.com/Effect-TS/effect/commit/9392de6baa6861662abc2bd3171897145f5ea073), [`75a8d16`](https://github.com/Effect-TS/effect/commit/75a8d16247cc14860cdd7fd948ef542c50c2d55e), [`3307729`](https://github.com/Effect-TS/effect/commit/3307729de162a033fa9caa8e14c111013dcf0d87), [`9392de6`](https://github.com/Effect-TS/effect/commit/9392de6baa6861662abc2bd3171897145f5ea073), [`3307729`](https://github.com/Effect-TS/effect/commit/3307729de162a033fa9caa8e14c111013dcf0d87), [`d17a427`](https://github.com/Effect-TS/effect/commit/d17a427c4427972fb55c45a058780716dc408631)]: - - @effect/schema@0.64.12 - - @effect/platform@0.48.16 - - effect@2.4.12 - - @effect/rpc@0.28.16 - -## 0.26.36 - -### Patch Changes - -- Updated dependencies [[`2f488c4`](https://github.com/Effect-TS/effect/commit/2f488c436de52576562803c57ebc132ef40ccdd8), [`37ca592`](https://github.com/Effect-TS/effect/commit/37ca592a4101ad90adbf8c8b3f727faf3110cae5), [`317b5b8`](https://github.com/Effect-TS/effect/commit/317b5b8e8c8c2207469b3ebfcf72bf3a9f7cbc60)]: - - effect@2.4.11 - - @effect/schema@0.64.11 - - @effect/platform@0.48.15 - - @effect/rpc@0.28.15 - -## 0.26.35 - -### Patch Changes - -- Updated dependencies [[`9bab1f9`](https://github.com/Effect-TS/effect/commit/9bab1f9fa5b999740755e4e82485cb77c638643a), [`9bbde5b`](https://github.com/Effect-TS/effect/commit/9bbde5be9a0168d1c2a0308bfc27167ed62f3968)]: - - effect@2.4.10 - - @effect/platform@0.48.14 - - @effect/rpc@0.28.14 - - @effect/schema@0.64.10 - -## 0.26.34 - -### Patch Changes - -- Updated dependencies [[`dc7e497`](https://github.com/Effect-TS/effect/commit/dc7e49720df416870a7483f48adc40aeb23fe32d), [`ffaf7c3`](https://github.com/Effect-TS/effect/commit/ffaf7c36514f88496cdd2fdfdf0bc7ba5a2e5cd4)]: - - @effect/schema@0.64.9 - - @effect/platform@0.48.13 - - @effect/rpc@0.28.13 - -## 0.26.33 - -### Patch Changes - -- Updated dependencies [[`e0af20e`](https://github.com/Effect-TS/effect/commit/e0af20ec5f6d0b19d66c5ebf610969d55bfc6c22)]: - - @effect/schema@0.64.8 - - @effect/platform@0.48.12 - - @effect/rpc@0.28.12 - -## 0.26.32 - -### Patch Changes - -- Updated dependencies [[`0f6c7b4`](https://github.com/Effect-TS/effect/commit/0f6c7b426eb3432f60e3a17f8cd92ceac91597bf)]: - - @effect/platform@0.48.11 - - @effect/rpc@0.28.11 - -## 0.26.31 - -### Patch Changes - -- Updated dependencies [[`71fd528`](https://github.com/Effect-TS/effect/commit/71fd5287500f9ce155a7d9f0df6ee3e0ac3aeb99)]: - - @effect/platform@0.48.10 - - effect@2.4.9 - - @effect/rpc@0.28.10 - - @effect/schema@0.64.7 - -## 0.26.30 - -### Patch Changes - -- Updated dependencies [[`595140a`](https://github.com/Effect-TS/effect/commit/595140a13bda09bf22c669196440868e8a274599), [`5f5fcd9`](https://github.com/Effect-TS/effect/commit/5f5fcd969ae30ed6fe61d566a571498d9e895e16), [`bb0b69e`](https://github.com/Effect-TS/effect/commit/bb0b69e519698c7c76aa68217de423c78ad16566), [`7a45ad0`](https://github.com/Effect-TS/effect/commit/7a45ad0a5f715d64a69b28a8ee3573e5f86909c3), [`5c3b1cc`](https://github.com/Effect-TS/effect/commit/5c3b1ccba182d0f636a973729f9c6bfb12539dc8), [`6f7dfc9`](https://github.com/Effect-TS/effect/commit/6f7dfc9637bd641beb93b14e027dcfcb5d2c8feb), [`88b8583`](https://github.com/Effect-TS/effect/commit/88b85838e03d4f33036f9d16c9c00a487fa99bd8), [`cb20824`](https://github.com/Effect-TS/effect/commit/cb20824416cbf251188395d0aad3622e3a5d7ff2), [`6b20bad`](https://github.com/Effect-TS/effect/commit/6b20badebb3a7ca4d38857753e8ecaa09d02ccfb), [`4e64e9b`](https://github.com/Effect-TS/effect/commit/4e64e9b9876de6bfcbabe39e18a91a08e5f3fbb0), [`3851a02`](https://github.com/Effect-TS/effect/commit/3851a022c481006aec1db36651e4b4fd727aa742), [`5f5fcd9`](https://github.com/Effect-TS/effect/commit/5f5fcd969ae30ed6fe61d566a571498d9e895e16), [`814e5b8`](https://github.com/Effect-TS/effect/commit/814e5b828f68210b9e8f336fd6ac688646835dd9), [`a45a525`](https://github.com/Effect-TS/effect/commit/a45a525e7ccf07704dff1666f1e390282b5bac91)]: - - @effect/schema@0.64.6 - - effect@2.4.8 - - @effect/platform@0.48.9 - - @effect/rpc@0.28.9 - -## 0.26.29 - -### Patch Changes - -- Updated dependencies [[`69d27bb`](https://github.com/Effect-TS/effect/commit/69d27bb633884b6b50f9c3d9e95c29f09b4860b5), [`d0f56c6`](https://github.com/Effect-TS/effect/commit/d0f56c68e604b1cf8dd4e761a3f3cf3631b3cec1)]: - - @effect/platform@0.48.8 - - @effect/schema@0.64.5 - - @effect/rpc@0.28.8 - -## 0.26.28 - -### Patch Changes - -- Updated dependencies [[`f908948`](https://github.com/Effect-TS/effect/commit/f908948fd05771a670c0b746e2dd9caa9408ef83)]: - - @effect/platform@0.48.7 - - @effect/rpc@0.28.7 - -## 0.26.27 - -### Patch Changes - -- Updated dependencies [[`eb93283`](https://github.com/Effect-TS/effect/commit/eb93283985913d7b04ca750e36ac8513e7b6cef6)]: - - effect@2.4.7 - - @effect/platform@0.48.6 - - @effect/rpc@0.28.6 - - @effect/schema@0.64.4 - -## 0.26.26 - -### Patch Changes - -- Updated dependencies [[`e006e4a`](https://github.com/Effect-TS/effect/commit/e006e4a538c97bae6ca1efa74802159e8a688fcb)]: - - @effect/platform@0.48.5 - - @effect/rpc@0.28.5 - -## 0.26.25 - -### Patch Changes - -- Updated dependencies [[`cfef6ec`](https://github.com/Effect-TS/effect/commit/cfef6ecd1fe801cec1a3cbfb7f064fc394b0ad73)]: - - @effect/schema@0.64.3 - - @effect/platform@0.48.4 - - @effect/rpc@0.28.4 - -## 0.26.24 - -### Patch Changes - -- Updated dependencies [[`c362e06`](https://github.com/Effect-TS/effect/commit/c362e066550252d5a9fcbc31a4b34d0e17c50699), [`83ddd6f`](https://github.com/Effect-TS/effect/commit/83ddd6f41029724b2cbd144cf309463967ed1164)]: - - @effect/platform@0.48.3 - - @effect/rpc@0.28.3 - -## 0.26.23 - -### Patch Changes - -- Updated dependencies [[`89748c9`](https://github.com/Effect-TS/effect/commit/89748c90b36cb5eb880a9ab9323b252338dee848), [`4f35a7e`](https://github.com/Effect-TS/effect/commit/4f35a7e7c4eba598924aff24d1158b9056bb24be), [`9971186`](https://github.com/Effect-TS/effect/commit/99711862722188fbb5ed3ee75126ad5edf13f72f)]: - - @effect/schema@0.64.2 - - @effect/platform@0.48.2 - - effect@2.4.6 - - @effect/rpc@0.28.2 - -## 0.26.22 - -### Patch Changes - -- Updated dependencies [[`d10f876`](https://github.com/Effect-TS/effect/commit/d10f876cd98da275bc5dc5750a91a7fc95e97541), [`743ae6d`](https://github.com/Effect-TS/effect/commit/743ae6d12b249f0b35b31b65b2f7ec91d83ee387), [`a75bc48`](https://github.com/Effect-TS/effect/commit/a75bc48e0e3278d0f70665fedecc5ae7ec447e24), [`bce21c5`](https://github.com/Effect-TS/effect/commit/bce21c5ded2177114666ba229bd5029fa000dee3), [`c7d3036`](https://github.com/Effect-TS/effect/commit/c7d303630b7f0825cb2e584557c5767a67214d9f)]: - - @effect/schema@0.64.1 - - effect@2.4.5 - - @effect/platform@0.48.1 - - @effect/rpc@0.28.1 - -## 0.26.21 - -### Patch Changes - -- Updated dependencies [[`5d47ee0`](https://github.com/Effect-TS/effect/commit/5d47ee0855e492532085b6092879b1b952d84949), [`5d47ee0`](https://github.com/Effect-TS/effect/commit/5d47ee0855e492532085b6092879b1b952d84949), [`1cb7f9c`](https://github.com/Effect-TS/effect/commit/1cb7f9cff7c2272a32fc7a324d87b02e2cd8a2f5), [`5d47ee0`](https://github.com/Effect-TS/effect/commit/5d47ee0855e492532085b6092879b1b952d84949), [`817a04c`](https://github.com/Effect-TS/effect/commit/817a04cb2df0f4140984dc97eb3e1bb14a6c4a38), [`d90a99d`](https://github.com/Effect-TS/effect/commit/d90a99d03d074adc7cd2533f15419138264da5a2), [`dd05faa`](https://github.com/Effect-TS/effect/commit/dd05faa621555ef3585ecd914ac13ecd89b710f4), [`bdff193`](https://github.com/Effect-TS/effect/commit/bdff193365dd9ec2863573b08eb960aa8dee5c93), [`509be1a`](https://github.com/Effect-TS/effect/commit/509be1a0817118489750cf028523134677e44a8a), [`1cb7f9c`](https://github.com/Effect-TS/effect/commit/1cb7f9cff7c2272a32fc7a324d87b02e2cd8a2f5), [`dd05faa`](https://github.com/Effect-TS/effect/commit/dd05faa621555ef3585ecd914ac13ecd89b710f4), [`e7ca973`](https://github.com/Effect-TS/effect/commit/e7ca973c5430ae60716701e58bedd4632ff971fd), [`a1f44cb`](https://github.com/Effect-TS/effect/commit/a1f44cb5112713ff9a3ac3d91a63a2c99d6b7fc1), [`d910dd2`](https://github.com/Effect-TS/effect/commit/d910dd2ca1e8e5aa2f09d9bf3694ede745758f99), [`e7ca973`](https://github.com/Effect-TS/effect/commit/e7ca973c5430ae60716701e58bedd4632ff971fd), [`802674b`](https://github.com/Effect-TS/effect/commit/802674b379b7559ad3ff09b33388891445a9e48b), [`bdff193`](https://github.com/Effect-TS/effect/commit/bdff193365dd9ec2863573b08eb960aa8dee5c93)]: - - @effect/schema@0.64.0 - - effect@2.4.4 - - @effect/platform@0.48.0 - - @effect/rpc@0.28.0 - -## 0.26.20 - -### Patch Changes - -- Updated dependencies [[`0680545`](https://github.com/Effect-TS/effect/commit/068054540f19bb23a79c7c021ed8b2fe34f3e19f), [`20e63fb`](https://github.com/Effect-TS/effect/commit/20e63fb9207210f3fe2d136ec40d0a2dbff3225e), [`20e63fb`](https://github.com/Effect-TS/effect/commit/20e63fb9207210f3fe2d136ec40d0a2dbff3225e)]: - - @effect/platform@0.47.1 - - effect@2.4.3 - - @effect/rpc@0.27.20 - - @effect/schema@0.63.4 - -## 0.26.19 - -### Patch Changes - -- Updated dependencies [[`e03811e`](https://github.com/Effect-TS/effect/commit/e03811e80c93e986e6348b3b67ac2ed6d5fefff0), [`ac41d84`](https://github.com/Effect-TS/effect/commit/ac41d84776484cdce8165b7ca2c9c9b6377eee2d), [`0f3d99c`](https://github.com/Effect-TS/effect/commit/0f3d99c27521ec6b221b644a0fffc79199c3acca), [`6137533`](https://github.com/Effect-TS/effect/commit/613753300c7705518ab1fea2f370b032851c2750), [`f373529`](https://github.com/Effect-TS/effect/commit/f373529999f4b8bc92b634f6ea14f19271388eed), [`1bf9f31`](https://github.com/Effect-TS/effect/commit/1bf9f31f07667de677673f7c29a4e7a26ebad3c8), [`e3ff789`](https://github.com/Effect-TS/effect/commit/e3ff789226f89e71eb28ca38ce79f90af6a03f1a), [`6137533`](https://github.com/Effect-TS/effect/commit/613753300c7705518ab1fea2f370b032851c2750), [`507ba40`](https://github.com/Effect-TS/effect/commit/507ba4060ff043c1a8d541dae723fa6940633b00), [`4064ea0`](https://github.com/Effect-TS/effect/commit/4064ea04e0b3fa23108ee471cd89ab2482b2f6e5), [`e466afe`](https://github.com/Effect-TS/effect/commit/e466afe32f2de598ceafd8982bd0cfbd388e5671), [`465be79`](https://github.com/Effect-TS/effect/commit/465be7926afe98169837d8a4ed5ebc059a732d21), [`f373529`](https://github.com/Effect-TS/effect/commit/f373529999f4b8bc92b634f6ea14f19271388eed), [`de74eb8`](https://github.com/Effect-TS/effect/commit/de74eb80a79eebde5ff645033765e7a617e92f27), [`d8e6940`](https://github.com/Effect-TS/effect/commit/d8e694040f67da6fefc0f5c98fc8e15c0b48822e), [`fa9663c`](https://github.com/Effect-TS/effect/commit/fa9663cb854ca03dba672d7857ecff84f1140c9e), [`fa9663c`](https://github.com/Effect-TS/effect/commit/fa9663cb854ca03dba672d7857ecff84f1140c9e)]: - - effect@2.4.2 - - @effect/platform@0.47.0 - - @effect/schema@0.63.3 - - @effect/rpc@0.27.19 - -## 0.26.18 - -### Patch Changes - -- Updated dependencies [[`a4a0006`](https://github.com/Effect-TS/effect/commit/a4a0006c7f19fc261df5cda16963d73457e4d6ac), [`7535080`](https://github.com/Effect-TS/effect/commit/7535080f2e2f9859711031161600c01807cc43ea), [`39f583e`](https://github.com/Effect-TS/effect/commit/39f583eaeb29eecd6eaec3b113b24d9d413153df), [`f428198`](https://github.com/Effect-TS/effect/commit/f428198725d4b9e304ecd5ff8bad8f92d871dbe3), [`0a37676`](https://github.com/Effect-TS/effect/commit/0a37676aa0eb2a21e17af2e6df9f81f52bbc8831), [`bd1d7ac`](https://github.com/Effect-TS/effect/commit/bd1d7ac75eea57a94d5e2d8e1edccb3136e84899), [`c035972`](https://github.com/Effect-TS/effect/commit/c035972dfabdd3cb3372b5ab468aa2fd0d808f4d), [`6f503b7`](https://github.com/Effect-TS/effect/commit/6f503b774d893bf2af34f66202e270d8c45d5f31)]: - - effect@2.4.1 - - @effect/platform@0.46.3 - - @effect/schema@0.63.2 - - @effect/rpc@0.27.18 - -## 0.26.17 - -### Patch Changes - -- Updated dependencies [[`5d30853`](https://github.com/Effect-TS/effect/commit/5d308534cac6f187227185393c0bac9eb27f90ab), [`6e350ed`](https://github.com/Effect-TS/effect/commit/6e350ed611feb0341e00aafd3c3905cd5ba53f07)]: - - @effect/schema@0.63.1 - - @effect/platform@0.46.2 - - @effect/rpc@0.27.17 - -## 0.26.16 - -### Patch Changes - -- [#2198](https://github.com/Effect-TS/effect/pull/2198) [`0c58b32`](https://github.com/Effect-TS/effect/commit/0c58b32dcfbed9bb5db78e9c08f6a557ec2f640b) Thanks [@tim-smart](https://github.com/tim-smart)! - add convenience client constructors to /rpc-http - -- Updated dependencies [[`aa6556f`](https://github.com/Effect-TS/effect/commit/aa6556f007117caea84d6965aa30846a11879e9d), [`0c58b32`](https://github.com/Effect-TS/effect/commit/0c58b32dcfbed9bb5db78e9c08f6a557ec2f640b)]: - - @effect/platform@0.46.1 - - @effect/rpc@0.27.16 - -## 0.26.15 - -### Patch Changes - -- Updated dependencies [[`5de7be5`](https://github.com/Effect-TS/effect/commit/5de7be5beca2e963b503e6029dcc3217848187d2), [`489fcf3`](https://github.com/Effect-TS/effect/commit/489fcf363ff2b2a953166b740cb9a62d7fc2a101), [`7d9c3bf`](https://github.com/Effect-TS/effect/commit/7d9c3bff6c18d451e0e4781042945ec5c7be1b9f), [`d8d278b`](https://github.com/Effect-TS/effect/commit/d8d278b2efb2966947029885e01f7b68348a021f), [`14c5711`](https://github.com/Effect-TS/effect/commit/14c57110078f0862b8da5c7a2c5d980f54447484), [`5de7be5`](https://github.com/Effect-TS/effect/commit/5de7be5beca2e963b503e6029dcc3217848187d2), [`54ddbb7`](https://github.com/Effect-TS/effect/commit/54ddbb720aeeb657537b01ae221cdcd5e919c1a6), [`b9cb3a9`](https://github.com/Effect-TS/effect/commit/b9cb3a9c9bfdd75536bd70b4e8b557c12d4923ff), [`585fcce`](https://github.com/Effect-TS/effect/commit/585fcce162d0f07a48d7cd984a9b722966fbebbe), [`93b412d`](https://github.com/Effect-TS/effect/commit/93b412d4a9ed762dc9fa5807e51fad0fc78a614a), [`55b26a6`](https://github.com/Effect-TS/effect/commit/55b26a6342b4826f1116e7a1eb660118c274458e), [`136ef40`](https://github.com/Effect-TS/effect/commit/136ef40fe4a394abfa5c6a7ec103eea57251423e), [`a025b12`](https://github.com/Effect-TS/effect/commit/a025b121235ba01cfce8d62a775491880c575561), [`2097739`](https://github.com/Effect-TS/effect/commit/20977393d2383bff709304e81ec7d51cafd57108), [`f24ac9f`](https://github.com/Effect-TS/effect/commit/f24ac9f0c2c520add58f09fbdcec5defda03bd52)]: - - effect@2.4.0 - - @effect/platform@0.46.0 - - @effect/schema@0.63.0 - - @effect/rpc@0.27.15 - -## 0.26.14 - -### Patch Changes - -- [#2187](https://github.com/Effect-TS/effect/pull/2187) [`e6d36c0`](https://github.com/Effect-TS/effect/commit/e6d36c0813d836f17eabb6a9c7849baffca12dbf) Thanks [@tim-smart](https://github.com/tim-smart)! - update development dependencies - -- Updated dependencies [[`5ad2eec`](https://github.com/Effect-TS/effect/commit/5ad2eece0280b6db6a749d25cac1dcf6d33659a9), [`e6d36c0`](https://github.com/Effect-TS/effect/commit/e6d36c0813d836f17eabb6a9c7849baffca12dbf)]: - - effect@2.3.8 - - @effect/schema@0.62.9 - - @effect/platform@0.45.6 - - @effect/rpc@0.27.14 - -## 0.26.13 - -### Patch Changes - -- Updated dependencies [[`6daf084`](https://github.com/Effect-TS/effect/commit/6daf0845de008772011db8d7c75b7c37a6b4d334)]: - - @effect/platform@0.45.5 - - @effect/rpc@0.27.13 - -## 0.26.12 - -### Patch Changes - -- Updated dependencies [[`bc8404d`](https://github.com/Effect-TS/effect/commit/bc8404d54fd42072d200c0399cb39672837afa9f), [`abcb7d9`](https://github.com/Effect-TS/effect/commit/abcb7d983a4a85b43b7175e952f5b331b9019aea), [`2c5cbcd`](https://github.com/Effect-TS/effect/commit/2c5cbcd1161b4f40dab184999291e817314107de), [`6565916`](https://github.com/Effect-TS/effect/commit/6565916ef254bf910e47d25fd0ef55e7cb420241), [`abcb7d9`](https://github.com/Effect-TS/effect/commit/abcb7d983a4a85b43b7175e952f5b331b9019aea)]: - - effect@2.3.7 - - @effect/platform@0.45.4 - - @effect/rpc@0.27.12 - - @effect/schema@0.62.8 - -## 0.26.11 - -### Patch Changes - -- Updated dependencies [[`09532a8`](https://github.com/Effect-TS/effect/commit/09532a86b7d0cc23557c89158f0342753dfce4b0)]: - - @effect/platform@0.45.3 - - @effect/rpc@0.27.11 - -## 0.26.10 - -### Patch Changes - -- Updated dependencies [[`b1163b2`](https://github.com/Effect-TS/effect/commit/b1163b2bd67b65bafbbb39fc4c67576e5cbaf444), [`b46b869`](https://github.com/Effect-TS/effect/commit/b46b869e59a6da5aa235a9fcc25e1e0d24e9e8f8), [`dbff62c`](https://github.com/Effect-TS/effect/commit/dbff62c3026054350a671f6210058ec5844c285e), [`de1b226`](https://github.com/Effect-TS/effect/commit/de1b226282b5ab6c2809dd93f3bdb066f24a1333), [`a663390`](https://github.com/Effect-TS/effect/commit/a66339090ae7b960f8a8b90a0dcdc505de5aaf3e), [`ff88f80`](https://github.com/Effect-TS/effect/commit/ff88f808c4ed9947a148045849e7410b00acad0a), [`11be07b`](https://github.com/Effect-TS/effect/commit/11be07bf65d82cfdf994cdb9d8ca937f995cb4f0), [`c568645`](https://github.com/Effect-TS/effect/commit/c5686451c87d26382135a1c63b00ef171bb24f62), [`88835e5`](https://github.com/Effect-TS/effect/commit/88835e575a0bfbeff9a3696a332f32192c940e12), [`e572b07`](https://github.com/Effect-TS/effect/commit/e572b076e9b4369d9cc8e55414006eef376c93d9), [`e787a57`](https://github.com/Effect-TS/effect/commit/e787a5772e30d8b840cb98b49d36996e7d659a6c), [`b415577`](https://github.com/Effect-TS/effect/commit/b415577f6c576073733929c858e5aac27b6d5880), [`ff8046f`](https://github.com/Effect-TS/effect/commit/ff8046f57dfd073eba60ce6d3144ab060fbf93ce), [`44c3b43`](https://github.com/Effect-TS/effect/commit/44c3b43653e64d7e425d39815d8ff405acec9b99)]: - - effect@2.3.6 - - @effect/schema@0.62.7 - - @effect/platform@0.45.2 - - @effect/rpc@0.27.10 - -## 0.26.9 - -### Patch Changes - -- Updated dependencies [[`65895ab`](https://github.com/Effect-TS/effect/commit/65895ab982e0917ac92f0827e387e7cf61be1e69)]: - - @effect/platform@0.45.1 - - @effect/rpc@0.27.9 - -## 0.26.8 - -### Patch Changes - -- Updated dependencies [[`2b62548`](https://github.com/Effect-TS/effect/commit/2b6254845882f399636d24223c483e5489e3cff4)]: - - @effect/platform@0.45.0 - - @effect/rpc@0.27.8 - -## 0.26.7 - -### Patch Changes - -- Updated dependencies [[`aef2b8b`](https://github.com/Effect-TS/effect/commit/aef2b8bb636ada07224dc9cf491bebe622c1aeda), [`b881365`](https://github.com/Effect-TS/effect/commit/b8813650355322ea2fc1fbaa4f846bd87a7a05f3), [`7eecb1c`](https://github.com/Effect-TS/effect/commit/7eecb1c6cebe36550df3cca85a46867adbcaa2ca)]: - - @effect/schema@0.62.6 - - effect@2.3.5 - - @effect/platform@0.44.7 - - @effect/rpc@0.27.7 - -## 0.26.6 - -### Patch Changes - -- Updated dependencies [[`17bda66`](https://github.com/Effect-TS/effect/commit/17bda66431c999a546920c10adb205e6c8bea7d1)]: - - effect@2.3.4 - - @effect/platform@0.44.6 - - @effect/rpc@0.27.6 - - @effect/schema@0.62.5 - -## 0.26.5 - -### Patch Changes - -- Updated dependencies [[`1c6d18b`](https://github.com/Effect-TS/effect/commit/1c6d18b422b0bd800f2ed036dba9cb78db296c03), [`13d3266`](https://github.com/Effect-TS/effect/commit/13d3266f331f7aa49b55dd244d4e749a82255274), [`a344b42`](https://github.com/Effect-TS/effect/commit/a344b420862f71532a28c72f00b7ba54776d744d)]: - - @effect/schema@0.62.4 - - @effect/platform@0.44.5 - - @effect/rpc@0.27.5 - -## 0.26.4 - -### Patch Changes - -- Updated dependencies [[`b7d9a55`](https://github.com/Effect-TS/effect/commit/b7d9a55ebb3db5c1d64a2c75c5b1f12ebe1faf39), [`efd41d8`](https://github.com/Effect-TS/effect/commit/efd41d8131c3d90867608969ef7c4eef490eb5e6), [`0f83515`](https://github.com/Effect-TS/effect/commit/0f83515a9c01d13c7c15a3f026e02d22c3c6bb7f), [`0f83515`](https://github.com/Effect-TS/effect/commit/0f83515a9c01d13c7c15a3f026e02d22c3c6bb7f)]: - - @effect/rpc@0.27.4 - - effect@2.3.3 - - @effect/platform@0.44.4 - - @effect/schema@0.62.3 - -## 0.26.3 - -### Patch Changes - -- [#2100](https://github.com/Effect-TS/effect/pull/2100) [`ce0c2ef`](https://github.com/Effect-TS/effect/commit/ce0c2efb465096bca866b424a7e373d7a38ceceb) Thanks [@tim-smart](https://github.com/tim-smart)! - add non-streaming handlers and resolvers to rpc - - Instead of streaming back responses, responses are sent back as a single json - array. - - You can use the HttpResolver.toHttpAppEffect and HttpResolver.makeEffect apis to - opt into the non-streaming transport. - - NOTE: You cannot mix both the streaming and non-streaming transports. - -- Updated dependencies [[`6654f5f`](https://github.com/Effect-TS/effect/commit/6654f5f0f6b9d97165ede5e04ca16776e2599328), [`2eb11b4`](https://github.com/Effect-TS/effect/commit/2eb11b47752cedf233ef4c4395d9c4efc9b9e180), [`56c09bd`](https://github.com/Effect-TS/effect/commit/56c09bd369279a6a7785209d172739935818cba6), [`71aa5b1`](https://github.com/Effect-TS/effect/commit/71aa5b1c180dcb8b53aefe232d12a97bd06b5447), [`1700af8`](https://github.com/Effect-TS/effect/commit/1700af8af1131602887da721914c8562b6342393), [`ce0c2ef`](https://github.com/Effect-TS/effect/commit/ce0c2efb465096bca866b424a7e373d7a38ceceb)]: - - effect@2.3.2 - - @effect/rpc@0.27.3 - - @effect/platform@0.44.3 - - @effect/schema@0.62.2 - -## 0.26.2 - -### Patch Changes - -- [#2092](https://github.com/Effect-TS/effect/pull/2092) [`b974658`](https://github.com/Effect-TS/effect/commit/b974658d416fcc6e57c6cd158d63f7c02126814b) Thanks [@tim-smart](https://github.com/tim-smart)! - add rpc Router.provideService and .provideServiceEffect - - with these apis you can provide context to a Rpc or Router to eliminate - requirements. - - ```ts - import { Rpc, Router } from "@effect/rpc" - - Router.make( - Rpc.effect(MyRequest, () => ...) - ).pipe( - Router.provideServiceEffect(Session, makeSessionEffect) - ) - ``` - -- Updated dependencies [[`b974658`](https://github.com/Effect-TS/effect/commit/b974658d416fcc6e57c6cd158d63f7c02126814b), [`29739dd`](https://github.com/Effect-TS/effect/commit/29739dde8e6232824d49c4c7f8856de245249c5c), [`b974658`](https://github.com/Effect-TS/effect/commit/b974658d416fcc6e57c6cd158d63f7c02126814b), [`b974658`](https://github.com/Effect-TS/effect/commit/b974658d416fcc6e57c6cd158d63f7c02126814b)]: - - @effect/rpc@0.27.2 - - @effect/platform@0.44.2 - -## 0.26.1 - -### Patch Changes - -- Updated dependencies [[`b5a8215`](https://github.com/Effect-TS/effect/commit/b5a8215ee2a97a8865d69ee55ce1b9835948c922)]: - - effect@2.3.1 - - @effect/platform@0.44.1 - - @effect/rpc@0.27.1 - - @effect/schema@0.62.1 - -## 0.26.0 - -### Minor Changes - -- [#2006](https://github.com/Effect-TS/effect/pull/2006) [`9a2d1c1`](https://github.com/Effect-TS/effect/commit/9a2d1c1468ea0789b34767ad683da074f061ea9c) Thanks [@github-actions](https://github.com/apps/github-actions)! - With this change we now require a string key to be provided for all tags and renames the dear old `Tag` to `GenericTag`, so when previously you could do: - - ```ts - import { Effect, Context } from "effect" - interface Service { - readonly _: unique symbol - } - const Service = Context.Tag< - Service, - { - number: Effect.Effect - } - >() - ``` - - you are now mandated to do: - - ```ts - import { Effect, Context } from "effect" - interface Service { - readonly _: unique symbol - } - const Service = Context.GenericTag< - Service, - { - number: Effect.Effect - } - >("Service") - ``` - - This makes by default all tags globals and ensures better debuggaility when unexpected errors arise. - - Furthermore we introduce a new way of constructing tags that should be considered the new default: - - ```ts - import { Effect, Context } from "effect" - class Service extends Context.Tag("Service")< - Service, - { - number: Effect.Effect - } - >() {} - - const program = Effect.flatMap(Service, ({ number }) => number).pipe( - Effect.flatMap((_) => Effect.log(`number: ${_}`)) - ) - ``` - - this will use "Service" as the key and will create automatically an opaque identifier (the class) to be used at the type level, it does something similar to the above in a single shot. - -- [#2006](https://github.com/Effect-TS/effect/pull/2006) [`2131a8c`](https://github.com/Effect-TS/effect/commit/2131a8cfd2b7570ace56591fd7da4b3a856ab531) Thanks [@github-actions](https://github.com/apps/github-actions)! - second revision of /rpc api - - /rpc now uses Schema.TaggedRequest to define the schemas, and supports - streaming. - - The api has been simplified and has a less complex design. See the examples - folder in the /rpc-http package for a simple example. - -- [#2006](https://github.com/Effect-TS/effect/pull/2006) [`1a77f72`](https://github.com/Effect-TS/effect/commit/1a77f72cdaf43d6cdc91b6060f82832edcdbbcb3) Thanks [@github-actions](https://github.com/apps/github-actions)! - change `Effect` type parameters order from `Effect` to `Effect` - -- [#2006](https://github.com/Effect-TS/effect/pull/2006) [`b1e2086`](https://github.com/Effect-TS/effect/commit/b1e2086ea8bf410e4ad75d71c0760825924e8f9f) Thanks [@github-actions](https://github.com/apps/github-actions)! - remove re-exports from platform packages - -- [#2006](https://github.com/Effect-TS/effect/pull/2006) [`9a2d1c1`](https://github.com/Effect-TS/effect/commit/9a2d1c1468ea0789b34767ad683da074f061ea9c) Thanks [@github-actions](https://github.com/apps/github-actions)! - This change enables `Effect.serviceConstants` and `Effect.serviceMembers` to access any constant in the service, not only the effects, namely it is now possible to do: - - ```ts - import { Effect, Context } from "effect" - - class NumberRepo extends Context.TagClass("NumberRepo")< - NumberRepo, - { - readonly numbers: Array - } - >() { - static numbers = Effect.serviceConstants(NumberRepo).numbers - } - ``` - -### Patch Changes - -- Updated dependencies [[`96bcee2`](https://github.com/Effect-TS/effect/commit/96bcee21021aecd8ffd86440a2c9be353c4668e3), [`b1e2086`](https://github.com/Effect-TS/effect/commit/b1e2086ea8bf410e4ad75d71c0760825924e8f9f), [`4cd6e14`](https://github.com/Effect-TS/effect/commit/4cd6e144945b6c398f5f5abe3471ff7fb3372bfd), [`96bcee2`](https://github.com/Effect-TS/effect/commit/96bcee21021aecd8ffd86440a2c9be353c4668e3), [`c77f635`](https://github.com/Effect-TS/effect/commit/c77f635f8a26ca6d83cb569d911f8eee79033fd9), [`e343a74`](https://github.com/Effect-TS/effect/commit/e343a74843dd9edf879417fa94cb51de7ed5b402), [`acf1894`](https://github.com/Effect-TS/effect/commit/acf1894f45945dbe5c39451e36aabb4b5092f257), [`9dc04c8`](https://github.com/Effect-TS/effect/commit/9dc04c88a2ea9c68122cb2632a76f0f4be40329a), [`9a2d1c1`](https://github.com/Effect-TS/effect/commit/9a2d1c1468ea0789b34767ad683da074f061ea9c), [`2131a8c`](https://github.com/Effect-TS/effect/commit/2131a8cfd2b7570ace56591fd7da4b3a856ab531), [`1a77f72`](https://github.com/Effect-TS/effect/commit/1a77f72cdaf43d6cdc91b6060f82832edcdbbcb3), [`af47aa3`](https://github.com/Effect-TS/effect/commit/af47aa37196ad542c9c23a4896d8ef98147e1205), [`d3f9f4d`](https://github.com/Effect-TS/effect/commit/d3f9f4d4032b1131c62f4ddb21a4583e4e8d7c18), [`c986f0e`](https://github.com/Effect-TS/effect/commit/c986f0e0ce4d22ba08177ed351152718479ab63c), [`96bcee2`](https://github.com/Effect-TS/effect/commit/96bcee21021aecd8ffd86440a2c9be353c4668e3), [`d3f9f4d`](https://github.com/Effect-TS/effect/commit/d3f9f4d4032b1131c62f4ddb21a4583e4e8d7c18), [`d3f9f4d`](https://github.com/Effect-TS/effect/commit/d3f9f4d4032b1131c62f4ddb21a4583e4e8d7c18), [`d3f9f4d`](https://github.com/Effect-TS/effect/commit/d3f9f4d4032b1131c62f4ddb21a4583e4e8d7c18), [`70dde23`](https://github.com/Effect-TS/effect/commit/70dde238f81125e353fd7bde5fc24ecd8969bf97), [`a34dbdc`](https://github.com/Effect-TS/effect/commit/a34dbdc1552c73c1b612676f262a0c735ce444a7), [`d3f9f4d`](https://github.com/Effect-TS/effect/commit/d3f9f4d4032b1131c62f4ddb21a4583e4e8d7c18), [`81b7425`](https://github.com/Effect-TS/effect/commit/81b7425320cbbe2a6cf547a3e3ab3549cdba14cf), [`b1e2086`](https://github.com/Effect-TS/effect/commit/b1e2086ea8bf410e4ad75d71c0760825924e8f9f), [`02c3461`](https://github.com/Effect-TS/effect/commit/02c34615d02f91269ea04036d0306fccf4e39e18), [`0e56e99`](https://github.com/Effect-TS/effect/commit/0e56e998ab9815c4d096c239a553cb86a0f99af9), [`8b0ded9`](https://github.com/Effect-TS/effect/commit/8b0ded9f10ba0d96fcb9af24eff2dbd9341f85e3), [`8dd83e8`](https://github.com/Effect-TS/effect/commit/8dd83e854bfcaa6dab876994c5f813dcfb486c28), [`5127afe`](https://github.com/Effect-TS/effect/commit/5127afec1c519e0a3d7460844a9101a96272f29e), [`d75f6fe`](https://github.com/Effect-TS/effect/commit/d75f6fe6499deb0a5ee9ec94af3b5fd4eb03a2d0), [`7356e5c`](https://github.com/Effect-TS/effect/commit/7356e5cc16e9d70f18c02dee1dcb4ad539fd130a), [`3077cde`](https://github.com/Effect-TS/effect/commit/3077cde08a60246821a940964a84dd7f7c8b9f54), [`be19ce0`](https://github.com/Effect-TS/effect/commit/be19ce0b8bdf1fac80bb8d7e0b06a86986b47409), [`4a5d01a`](https://github.com/Effect-TS/effect/commit/4a5d01a409e9b6dd53893e65f8e5c9247f568021), [`78f47ab`](https://github.com/Effect-TS/effect/commit/78f47abfe3cb0a8bbde818b1c5fc603270538b47), [`6361ee2`](https://github.com/Effect-TS/effect/commit/6361ee2e83bdfead24045c3d058a7298efc18113), [`52e5d20`](https://github.com/Effect-TS/effect/commit/52e5d2077582bf51f25861c7139fc920c2c24166), [`c6137ec`](https://github.com/Effect-TS/effect/commit/c6137ec62c6b5542d5062ae1a3c936cb915dee22), [`86f665d`](https://github.com/Effect-TS/effect/commit/86f665d7bd25ba0a3f046a2384798378310dcf0c), [`f5ae081`](https://github.com/Effect-TS/effect/commit/f5ae08195e68e76faeac258c565d79da4e01e7d6), [`4a5d01a`](https://github.com/Effect-TS/effect/commit/4a5d01a409e9b6dd53893e65f8e5c9247f568021), [`60686f5`](https://github.com/Effect-TS/effect/commit/60686f5c38bef1b93a3a0dda9b6596d46aceab03), [`9a2d1c1`](https://github.com/Effect-TS/effect/commit/9a2d1c1468ea0789b34767ad683da074f061ea9c), [`5127afe`](https://github.com/Effect-TS/effect/commit/5127afec1c519e0a3d7460844a9101a96272f29e), [`56b8691`](https://github.com/Effect-TS/effect/commit/56b86916bf3da18002f3655d859dbc487eb5a6de), [`8ee2931`](https://github.com/Effect-TS/effect/commit/8ee293159b4f7cb7af8558287a0a047f3a69743d), [`6727474`](https://github.com/Effect-TS/effect/commit/672747497490a30d36dd49c06db19aabf09dc7f0), [`5127afe`](https://github.com/Effect-TS/effect/commit/5127afec1c519e0a3d7460844a9101a96272f29e)]: - - effect@2.3.0 - - @effect/platform@0.44.0 - - @effect/schema@0.62.0 - - @effect/rpc@0.27.0 - -## 0.25.25 - -### Patch Changes - -- Updated dependencies [[`3ddfdbf`](https://github.com/Effect-TS/effect/commit/3ddfdbf914edea536aef207cec6695f33496258c), [`3ddfdbf`](https://github.com/Effect-TS/effect/commit/3ddfdbf914edea536aef207cec6695f33496258c)]: - - effect@2.2.5 - - @effect/platform@0.43.11 - - @effect/rpc@0.26.18 - - @effect/schema@0.61.7 - -## 0.25.24 - -### Patch Changes - -- Updated dependencies [[`d0b911c`](https://github.com/Effect-TS/effect/commit/d0b911c75f284c7aa87f25aa96926e6bde7690d0), [`330e1a4`](https://github.com/Effect-TS/effect/commit/330e1a4e2c1fc0af6c80c80c81dd38c3e50fab78), [`6928a2b`](https://github.com/Effect-TS/effect/commit/6928a2b0bae86a4bdfbece0aa32924207c2d5a70), [`296bc1c`](https://github.com/Effect-TS/effect/commit/296bc1c9d24986d299d2669115d584cb27b73c60)]: - - effect@2.2.4 - - @effect/platform@0.43.10 - - @effect/schema@0.61.6 - - @effect/rpc@0.26.17 - -## 0.25.23 - -### Patch Changes - -- Updated dependencies [[`1b841a9`](https://github.com/Effect-TS/effect/commit/1b841a91fed86825cd2867cf1e68e41d8ff26b4e)]: - - @effect/platform@0.43.9 - -## 0.25.22 - -### Patch Changes - -- Updated dependencies [[`32bf796`](https://github.com/Effect-TS/effect/commit/32bf796c3e5db1b2b68e8b1b20db664295991643)]: - - @effect/platform@0.43.8 - -## 0.25.21 - -### Patch Changes - -- Updated dependencies [[`cde08f3`](https://github.com/Effect-TS/effect/commit/cde08f354ed2ff2921d1d98bd539c7d65a2ddd73)]: - - @effect/platform@0.43.7 - -## 0.25.20 - -### Patch Changes - -- Updated dependencies [[`c96bb17`](https://github.com/Effect-TS/effect/commit/c96bb17043e2cec1eaeb319614a4c2904d876beb)]: - - @effect/platform@0.43.6 - -## 0.25.19 - -### Patch Changes - -- Updated dependencies [[`f1ff44b`](https://github.com/Effect-TS/effect/commit/f1ff44b58cdb1886b38681e8fedc309eb9ac6853), [`13785cf`](https://github.com/Effect-TS/effect/commit/13785cf4a5082d8d9cf8d7c991141dee0d2b4d31)]: - - @effect/schema@0.61.5 - - @effect/platform@0.43.5 - - @effect/rpc@0.26.16 - -## 0.25.18 - -### Patch Changes - -- Updated dependencies [[`22794e0`](https://github.com/Effect-TS/effect/commit/22794e0ba00e40281f30a22fa84412003c24877d), [`f73e6c0`](https://github.com/Effect-TS/effect/commit/f73e6c033fb0729a9cfa5eb4bc39f79d3126e247), [`6bf02c7`](https://github.com/Effect-TS/effect/commit/6bf02c70fe10a04d1b34d6666f95416e42a6225a), [`78f5921`](https://github.com/Effect-TS/effect/commit/78f59211502ded6fcbe15a49d6fde941cccc9d52)]: - - effect@2.2.3 - - @effect/schema@0.61.4 - - @effect/platform@0.43.4 - - @effect/rpc@0.26.15 - -## 0.25.17 - -### Patch Changes - -- Updated dependencies [[`9863e2f`](https://github.com/Effect-TS/effect/commit/9863e2fb3561dc019965aeccd6584a418fc8b401)]: - - @effect/schema@0.61.3 - - @effect/platform@0.43.3 - - @effect/rpc@0.26.14 - -## 0.25.16 - -### Patch Changes - -- Updated dependencies [[`64f710a`](https://github.com/Effect-TS/effect/commit/64f710aa49dec6ffcd33ee23438d0774f5489733)]: - - @effect/schema@0.61.2 - - @effect/platform@0.43.2 - - @effect/rpc@0.26.13 - -## 0.25.15 - -### Patch Changes - -- Updated dependencies [[`c7550f9`](https://github.com/Effect-TS/effect/commit/c7550f96e1006eee832ce5025bf0c197a65935ea), [`8d1f6e4`](https://github.com/Effect-TS/effect/commit/8d1f6e4bb13e221804fb1762ef19e02bcefc8f61), [`d404561`](https://github.com/Effect-TS/effect/commit/d404561e47ec2fa5f68709a308ee5d2ee959141d), [`7b84a3c`](https://github.com/Effect-TS/effect/commit/7b84a3c7e4b9c8dc02294b0e3cc3ae3becea977b), [`1a84dee`](https://github.com/Effect-TS/effect/commit/1a84dee0e9ddbfaf2610e4d7c00c7020c427171a), [`ac30bf4`](https://github.com/Effect-TS/effect/commit/ac30bf4cd53de0663784f65ae6bee8279333df97)]: - - @effect/schema@0.61.1 - - effect@2.2.2 - - @effect/platform@0.43.1 - - @effect/rpc@0.26.12 - -## 0.25.14 - -### Patch Changes - -- Updated dependencies [[`84da31f`](https://github.com/Effect-TS/effect/commit/84da31f0643e8651b9d311b30526b1e4edfbdfb8), [`62b40e8`](https://github.com/Effect-TS/effect/commit/62b40e8479371d6663c0255aaca56a1ae0d59764), [`645bea2`](https://github.com/Effect-TS/effect/commit/645bea2551129f94a5b0e38347e28067dee531bb), [`62b40e8`](https://github.com/Effect-TS/effect/commit/62b40e8479371d6663c0255aaca56a1ae0d59764)]: - - effect@2.2.1 - - @effect/schema@0.61.0 - - @effect/platform@0.43.0 - - @effect/rpc@0.26.11 - -## 0.25.13 - -### Patch Changes - -- Updated dependencies [[`202befc`](https://github.com/Effect-TS/effect/commit/202befc2ecbeb117c4fa85ef9b12a3d3a48273d2), [`fe05ad7`](https://github.com/Effect-TS/effect/commit/fe05ad7bcb3b88d47800ab69ebf53641023676f1), [`ee4ff8a`](https://github.com/Effect-TS/effect/commit/ee4ff8a943141fcf2877af92c5877ee87a989fb9), [`ee4ff8a`](https://github.com/Effect-TS/effect/commit/ee4ff8a943141fcf2877af92c5877ee87a989fb9), [`ee4ff8a`](https://github.com/Effect-TS/effect/commit/ee4ff8a943141fcf2877af92c5877ee87a989fb9), [`ee4ff8a`](https://github.com/Effect-TS/effect/commit/ee4ff8a943141fcf2877af92c5877ee87a989fb9), [`10df798`](https://github.com/Effect-TS/effect/commit/10df798639e556f9d88265ef7fc3cf8a3bbe3874)]: - - effect@2.2.0 - - @effect/platform@0.42.7 - - @effect/rpc@0.26.10 - - @effect/schema@0.60.7 - -## 0.25.12 - -### Patch Changes - -- Updated dependencies [[`21b9edd`](https://github.com/Effect-TS/effect/commit/21b9edde464f7c5624ef54ad1b5e264204a37625)]: - - effect@2.1.2 - - @effect/platform@0.42.6 - - @effect/rpc@0.26.9 - - @effect/schema@0.60.6 - -## 0.25.11 - -### Patch Changes - -- Updated dependencies [[`3bf67cf`](https://github.com/Effect-TS/effect/commit/3bf67cf64ff27ffaa811b07751875cb161ac3385)]: - - @effect/schema@0.60.5 - - @effect/platform@0.42.5 - - @effect/rpc@0.26.8 - -## 0.25.10 - -### Patch Changes - -- Updated dependencies [[`0d1af1e`](https://github.com/Effect-TS/effect/commit/0d1af1e38c11b94e152beaccd0ff7569a1b3f5b7), [`0d1af1e`](https://github.com/Effect-TS/effect/commit/0d1af1e38c11b94e152beaccd0ff7569a1b3f5b7), [`a222524`](https://github.com/Effect-TS/effect/commit/a2225247e9de2e013d287320790fde88c081dbbd)]: - - @effect/schema@0.60.4 - - effect@2.1.1 - - @effect/platform@0.42.4 - - @effect/rpc@0.26.7 - -## 0.25.9 - -### Patch Changes - -- Updated dependencies [[`d543221`](https://github.com/Effect-TS/effect/commit/d5432213e91ab620aa66e0fd92a6593134d18940), [`2530d47`](https://github.com/Effect-TS/effect/commit/2530d470b0ad5df7e636921eedfb1cbe42821f94), [`f493929`](https://github.com/Effect-TS/effect/commit/f493929ab88d2ea137ca5fbff70bdc6c9d804d80), [`5911fa9`](https://github.com/Effect-TS/effect/commit/5911fa9c9440dd3bc1ee38542bcd15f8c75a4637)]: - - @effect/schema@0.60.3 - - @effect/platform@0.42.3 - - @effect/rpc@0.26.6 - -## 0.25.8 - -### Patch Changes - -- Updated dependencies [[`05c44b3`](https://github.com/Effect-TS/effect/commit/05c44b30662554dde50b70bad79f13ae895fda02), [`05c44b3`](https://github.com/Effect-TS/effect/commit/05c44b30662554dde50b70bad79f13ae895fda02), [`05c44b3`](https://github.com/Effect-TS/effect/commit/05c44b30662554dde50b70bad79f13ae895fda02), [`05c44b3`](https://github.com/Effect-TS/effect/commit/05c44b30662554dde50b70bad79f13ae895fda02), [`edb722d`](https://github.com/Effect-TS/effect/commit/edb722df37592044d8d7b9f0fd377156539e73aa), [`05c44b3`](https://github.com/Effect-TS/effect/commit/05c44b30662554dde50b70bad79f13ae895fda02), [`05c44b3`](https://github.com/Effect-TS/effect/commit/05c44b30662554dde50b70bad79f13ae895fda02)]: - - effect@2.1.0 - - @effect/platform@0.42.2 - - @effect/rpc@0.26.5 - - @effect/schema@0.60.2 - -## 0.25.7 - -### Patch Changes - -- Updated dependencies [[`f7f19f6`](https://github.com/Effect-TS/effect/commit/f7f19f66a5fa349baa2412c1f9f15111c437df09)]: - - effect@2.0.5 - - @effect/platform@0.42.1 - - @effect/rpc@0.26.4 - - @effect/schema@0.60.1 - -## 0.25.6 - -### Patch Changes - -- Updated dependencies [[`ec2bdfa`](https://github.com/Effect-TS/effect/commit/ec2bdfae2da717f28147b9d6820d3494cb240945), [`687e02e`](https://github.com/Effect-TS/effect/commit/687e02e7d84dc06957844160761fda90929470ab), [`536c1df`](https://github.com/Effect-TS/effect/commit/536c1dfb7833961dfb2fbd6bcd2dbdfa2f208d51), [`8eec87e`](https://github.com/Effect-TS/effect/commit/8eec87e311ce55281a98517e6df0ef103b43e8a8), [`540b294`](https://github.com/Effect-TS/effect/commit/540b2941dd0a81e9688311583ce7e2e140d6e7a5), [`8eec87e`](https://github.com/Effect-TS/effect/commit/8eec87e311ce55281a98517e6df0ef103b43e8a8), [`536c1df`](https://github.com/Effect-TS/effect/commit/536c1dfb7833961dfb2fbd6bcd2dbdfa2f208d51), [`a3f96d6`](https://github.com/Effect-TS/effect/commit/a3f96d615b8b3e238dbfa01ef713c87e6f4532be), [`0c397e7`](https://github.com/Effect-TS/effect/commit/0c397e762008a0de40c7526c9d99ff2cfe4f7a6a), [`8eec87e`](https://github.com/Effect-TS/effect/commit/8eec87e311ce55281a98517e6df0ef103b43e8a8), [`b557a10`](https://github.com/Effect-TS/effect/commit/b557a10b773e321bea77fc4951f0ef171dd193c9), [`536c1df`](https://github.com/Effect-TS/effect/commit/536c1dfb7833961dfb2fbd6bcd2dbdfa2f208d51), [`8eec87e`](https://github.com/Effect-TS/effect/commit/8eec87e311ce55281a98517e6df0ef103b43e8a8), [`8eec87e`](https://github.com/Effect-TS/effect/commit/8eec87e311ce55281a98517e6df0ef103b43e8a8), [`74b9094`](https://github.com/Effect-TS/effect/commit/74b90940e571c73a6b76cafa88ffb8a1c949cb4c), [`337e80f`](https://github.com/Effect-TS/effect/commit/337e80f69bc36966f889c439b819db2f84cae496), [`25adce7`](https://github.com/Effect-TS/effect/commit/25adce7ae76ce834096dca1ed70a60ad1a349217), [`536c1df`](https://github.com/Effect-TS/effect/commit/536c1dfb7833961dfb2fbd6bcd2dbdfa2f208d51), [`48a3d40`](https://github.com/Effect-TS/effect/commit/48a3d40aed0f923f567b8911dade732ff472d981)]: - - @effect/schema@0.60.0 - - effect@2.0.4 - - @effect/platform@0.42.0 - - @effect/rpc@0.26.3 - -## 0.25.5 - -### Patch Changes - -- Updated dependencies [[`5b46e99`](https://github.com/Effect-TS/effect/commit/5b46e996d30e2497eb23095e2c21eee04438edf5), [`87f7ef2`](https://github.com/Effect-TS/effect/commit/87f7ef28a3c27e2e4f2fcfa465f85bb2a45a3d6b), [`1d3a06b`](https://github.com/Effect-TS/effect/commit/1d3a06bb58ad1ac123ae8f9d42b4345f9c9c53c0), [`210d27e`](https://github.com/Effect-TS/effect/commit/210d27e999e066ea9b907301150c65f9ff080b39), [`1d3a06b`](https://github.com/Effect-TS/effect/commit/1d3a06bb58ad1ac123ae8f9d42b4345f9c9c53c0)]: - - @effect/schema@0.59.1 - - effect@2.0.3 - - @effect/platform@0.41.0 - - @effect/rpc@0.26.2 - -## 0.25.4 - -### Patch Changes - -- Updated dependencies [[`c4b84f7`](https://github.com/Effect-TS/effect/commit/c4b84f724ae809f3450d71c3ea5d629205fc479f), [`c4b84f7`](https://github.com/Effect-TS/effect/commit/c4b84f724ae809f3450d71c3ea5d629205fc479f), [`c4b84f7`](https://github.com/Effect-TS/effect/commit/c4b84f724ae809f3450d71c3ea5d629205fc479f), [`c4b84f7`](https://github.com/Effect-TS/effect/commit/c4b84f724ae809f3450d71c3ea5d629205fc479f)]: - - @effect/schema@0.59.0 - - @effect/platform@0.40.4 - - @effect/rpc@0.26.1 - -## 0.25.3 - -### Patch Changes - -- Updated dependencies [[`7b2f874`](https://github.com/Effect-TS/effect/commit/7b2f8743d96753c3e24ac4cc6715a4a7f4a2ca0c), [`a904a73`](https://github.com/Effect-TS/effect/commit/a904a739459bfd0fa7844b00b902d2fa984fb014), [`7b2f874`](https://github.com/Effect-TS/effect/commit/7b2f8743d96753c3e24ac4cc6715a4a7f4a2ca0c), [`7b2f874`](https://github.com/Effect-TS/effect/commit/7b2f8743d96753c3e24ac4cc6715a4a7f4a2ca0c), [`92c0322`](https://github.com/Effect-TS/effect/commit/92c0322a58bf7e5b8dbb602186030839e89df5af), [`7b2f874`](https://github.com/Effect-TS/effect/commit/7b2f8743d96753c3e24ac4cc6715a4a7f4a2ca0c), [`7b2f874`](https://github.com/Effect-TS/effect/commit/7b2f8743d96753c3e24ac4cc6715a4a7f4a2ca0c)]: - - @effect/schema@0.58.0 - - @effect/rpc@0.26.0 - - @effect/platform@0.40.3 - -## 0.25.2 - -### Patch Changes - -- Updated dependencies [[`4c90c54`](https://github.com/Effect-TS/effect/commit/4c90c54d87c91f75f3ad114926cdf3b0c25df091), [`d5a1949`](https://github.com/Effect-TS/effect/commit/d5a19499aac7c1d147674a35ac69992177c7536c), [`d3d3bda`](https://github.com/Effect-TS/effect/commit/d3d3bda74c794153def9027e0c40896e72cd5d14)]: - - @effect/platform@0.40.2 - - effect@2.0.2 - - @effect/rpc@0.25.2 - - @effect/schema@0.57.2 - -## 0.25.1 - -### Patch Changes - -- Updated dependencies [[`16bd87d`](https://github.com/Effect-TS/effect/commit/16bd87d32611b966dc42ea4fc979764f97a49071)]: - - effect@2.0.1 - - @effect/platform@0.40.1 - - @effect/rpc@0.25.1 - - @effect/schema@0.57.1 - -## 0.25.0 - -### Minor Changes - -- [`d0471ca`](https://github.com/Effect-TS/effect/commit/d0471ca7b544746674b9e1750202da72b0a21233) Thanks [@mikearnaldi](https://github.com/mikearnaldi)! - Switch to monorepo structure - -- [#1846](https://github.com/Effect-TS/effect/pull/1846) [`693b8f3`](https://github.com/Effect-TS/effect/commit/693b8f3a3dfd43ae61f0d9292cdf356be7329f2f) Thanks [@fubhy](https://github.com/fubhy)! - Enabled `exactOptionalPropertyTypes` throughout - -### Patch Changes - -- [`d987daa`](https://github.com/Effect-TS/effect/commit/d987daafaddd43b6ade74916a08236c19ea0a9fa) Thanks [@mikearnaldi](https://github.com/mikearnaldi)! - Switch effect dependency to caret - -- Updated dependencies [[`d987daa`](https://github.com/Effect-TS/effect/commit/d987daafaddd43b6ade74916a08236c19ea0a9fa), [`7b5eaa3`](https://github.com/Effect-TS/effect/commit/7b5eaa3838c79bf4bdccf91b94d61bbc38a2ec95), [`0724211`](https://github.com/Effect-TS/effect/commit/072421149c36010748ff6b6ee19c15c6cffefe09), [`9f2bc5a`](https://github.com/Effect-TS/effect/commit/9f2bc5a19e0b678a0a85e84daac290922b0fd57d), [`04fb8b4`](https://github.com/Effect-TS/effect/commit/04fb8b428b19bba85a2c79910c5e363340d074e7), [`d0471ca`](https://github.com/Effect-TS/effect/commit/d0471ca7b544746674b9e1750202da72b0a21233), [`bcf0900`](https://github.com/Effect-TS/effect/commit/bcf0900b58f449262556f80bff21e771a37272aa), [`6299b84`](https://github.com/Effect-TS/effect/commit/6299b84c11e5d1fe79fa538df8935018c7613747), [`c0aeb5e`](https://github.com/Effect-TS/effect/commit/c0aeb5e302869bcd7d7627f8cc5b630d07c12d10), [`693b8f3`](https://github.com/Effect-TS/effect/commit/693b8f3a3dfd43ae61f0d9292cdf356be7329f2f)]: - - @effect/platform@0.40.0 - - @effect/schema@0.57.0 - - @effect/rpc@0.25.0 - - effect@2.0.0 - -## 0.24.0 - -### Minor Changes - -- [#163](https://github.com/Effect-TS/rpc/pull/163) [`d2d851a`](https://github.com/Effect-TS/rpc/commit/d2d851a2b6f3fad5888e2a7bb16ec361af1ff3c9) Thanks [@fubhy](https://github.com/fubhy)! - Updated dependencies - -### Patch Changes - -- Updated dependencies [[`d2d851a`](https://github.com/Effect-TS/rpc/commit/d2d851a2b6f3fad5888e2a7bb16ec361af1ff3c9)]: - - @effect/rpc@0.24.0 - -## 0.23.0 - -### Minor Changes - -- [#161](https://github.com/Effect-TS/rpc/pull/161) [`d386fcb`](https://github.com/Effect-TS/rpc/commit/d386fcb6f58f5c94a70a2ba344db0fc19a9fbb29) Thanks [@tim-smart](https://github.com/tim-smart)! - update effect - -### Patch Changes - -- Updated dependencies [[`d386fcb`](https://github.com/Effect-TS/rpc/commit/d386fcb6f58f5c94a70a2ba344db0fc19a9fbb29)]: - - @effect/rpc@0.23.0 - -## 0.22.1 - -### Patch Changes - -- [#159](https://github.com/Effect-TS/rpc/pull/159) [`96ae639`](https://github.com/Effect-TS/rpc/commit/96ae63997c1305b2871a85bede5eee9d0cf848a1) Thanks [@tim-smart](https://github.com/tim-smart)! - update /platform - -- Updated dependencies [[`96ae639`](https://github.com/Effect-TS/rpc/commit/96ae63997c1305b2871a85bede5eee9d0cf848a1)]: - - @effect/rpc@0.22.1 - -## 0.22.0 - -### Minor Changes - -- [#157](https://github.com/Effect-TS/rpc/pull/157) [`57931c2`](https://github.com/Effect-TS/rpc/commit/57931c288e3ba193ed270558119af08d7a8f85a8) Thanks [@tim-smart](https://github.com/tim-smart)! - update effect - -### Patch Changes - -- Updated dependencies [[`57931c2`](https://github.com/Effect-TS/rpc/commit/57931c288e3ba193ed270558119af08d7a8f85a8)]: - - @effect/rpc@0.22.0 - -## 0.21.0 - -### Minor Changes - -- [#155](https://github.com/Effect-TS/rpc/pull/155) [`39185ec`](https://github.com/Effect-TS/rpc/commit/39185ec3269c11b826e7f9c0d934da4e07d71868) Thanks [@tim-smart](https://github.com/tim-smart)! - update effect - -### Patch Changes - -- Updated dependencies [[`39185ec`](https://github.com/Effect-TS/rpc/commit/39185ec3269c11b826e7f9c0d934da4e07d71868)]: - - @effect/rpc@0.21.0 - -## 0.20.1 - -### Patch Changes - -- [#153](https://github.com/Effect-TS/rpc/pull/153) [`40d291b`](https://github.com/Effect-TS/rpc/commit/40d291b9be85878cb710cad986ffcaae2173994d) Thanks [@tim-smart](https://github.com/tim-smart)! - update effect - -- Updated dependencies [[`40d291b`](https://github.com/Effect-TS/rpc/commit/40d291b9be85878cb710cad986ffcaae2173994d)]: - - @effect/rpc@0.20.1 - -## 0.20.0 - -### Minor Changes - -- [#151](https://github.com/Effect-TS/rpc/pull/151) [`cdb7e25`](https://github.com/Effect-TS/rpc/commit/cdb7e25f9ca9439d5dd06203cbede0a49d516271) Thanks [@tim-smart](https://github.com/tim-smart)! - update effect - -### Patch Changes - -- Updated dependencies [[`cdb7e25`](https://github.com/Effect-TS/rpc/commit/cdb7e25f9ca9439d5dd06203cbede0a49d516271)]: - - @effect/rpc@0.20.0 - -## 0.19.0 - -### Minor Changes - -- [#149](https://github.com/Effect-TS/rpc/pull/149) [`4f0ea6d`](https://github.com/Effect-TS/rpc/commit/4f0ea6df46ea862de822769a017b61e470e0e927) Thanks [@tim-smart](https://github.com/tim-smart)! - update effect - -### Patch Changes - -- Updated dependencies [[`4f0ea6d`](https://github.com/Effect-TS/rpc/commit/4f0ea6df46ea862de822769a017b61e470e0e927)]: - - @effect/rpc@0.19.0 - -## 0.18.1 - -### Patch Changes - -- [#147](https://github.com/Effect-TS/rpc/pull/147) [`4ba5cae`](https://github.com/Effect-TS/rpc/commit/4ba5cae0ea95895fe686eb6036cda0546476515c) Thanks [@tim-smart](https://github.com/tim-smart)! - ensure setup arg is provided - -- Updated dependencies [[`4ba5cae`](https://github.com/Effect-TS/rpc/commit/4ba5cae0ea95895fe686eb6036cda0546476515c)]: - - @effect/rpc@0.18.1 - -## 0.18.0 - -### Minor Changes - -- [#145](https://github.com/Effect-TS/rpc/pull/145) [`dec4d40`](https://github.com/Effect-TS/rpc/commit/dec4d4042028883a5a369603d7a93de6eb4e143b) Thanks [@tim-smart](https://github.com/tim-smart)! - update effect - -### Patch Changes - -- Updated dependencies [[`dec4d40`](https://github.com/Effect-TS/rpc/commit/dec4d4042028883a5a369603d7a93de6eb4e143b)]: - - @effect/rpc@0.18.0 - -## 0.17.1 - -### Patch Changes - -- [#141](https://github.com/Effect-TS/rpc/pull/141) [`11e9234`](https://github.com/Effect-TS/rpc/commit/11e923460ee30cb6c7cea21ef6a312b5f1b1d329) Thanks [@tim-smart](https://github.com/tim-smart)! - update effect - -- Updated dependencies [[`11e9234`](https://github.com/Effect-TS/rpc/commit/11e923460ee30cb6c7cea21ef6a312b5f1b1d329)]: - - @effect/rpc@0.17.1 - -## 0.17.0 - -### Minor Changes - -- [#139](https://github.com/Effect-TS/rpc/pull/139) [`8b5e8c7`](https://github.com/Effect-TS/rpc/commit/8b5e8c7c84f60e6ce0a40a1533f1e258ec5a643d) Thanks [@tim-smart](https://github.com/tim-smart)! - update effect - -### Patch Changes - -- Updated dependencies [[`8b5e8c7`](https://github.com/Effect-TS/rpc/commit/8b5e8c7c84f60e6ce0a40a1533f1e258ec5a643d)]: - - @effect/rpc@0.17.0 - -## 0.16.4 - -### Patch Changes - -- [#137](https://github.com/Effect-TS/rpc/pull/137) [`fd125f9`](https://github.com/Effect-TS/rpc/commit/fd125f9df1ac1bb37f2f4a80057c1a18ea426438) Thanks [@tim-smart](https://github.com/tim-smart)! - ensure \_\_setup is called for every worker - -## 0.16.3 - -### Patch Changes - -- Updated dependencies [[`f6e13f2`](https://github.com/Effect-TS/rpc/commit/f6e13f288e1841815be3f0eed7fc42b0c22d5c6c)]: - - @effect/rpc@0.16.3 - -## 0.16.2 - -### Patch Changes - -- [#127](https://github.com/Effect-TS/rpc/pull/127) [`4967ed9`](https://github.com/Effect-TS/rpc/commit/4967ed97923df281777c4eb87b307cedd6cdb56f) Thanks [@tim-smart](https://github.com/tim-smart)! - fix worker server types - -- Updated dependencies [[`4967ed9`](https://github.com/Effect-TS/rpc/commit/4967ed97923df281777c4eb87b307cedd6cdb56f)]: - - @effect/rpc@0.16.2 - -## 0.16.1 - -### Patch Changes - -- [#125](https://github.com/Effect-TS/rpc/pull/125) [`49a262c`](https://github.com/Effect-TS/rpc/commit/49a262c1387eda6cbdf7da1eb5e442908f4971aa) Thanks [@tim-smart](https://github.com/tim-smart)! - handle NoOutput schemas in router - -- Updated dependencies [[`49a262c`](https://github.com/Effect-TS/rpc/commit/49a262c1387eda6cbdf7da1eb5e442908f4971aa)]: - - @effect/rpc@0.16.1 - -## 0.16.0 - -### Minor Changes - -- [#119](https://github.com/Effect-TS/rpc/pull/119) [`1e38404`](https://github.com/Effect-TS/rpc/commit/1e384040ef20bb0db3385f9afb94abeeba7b9c13) Thanks [@tim-smart](https://github.com/tim-smart)! - migrate to @effect/platform - -### Patch Changes - -- [#119](https://github.com/Effect-TS/rpc/pull/119) [`1e38404`](https://github.com/Effect-TS/rpc/commit/1e384040ef20bb0db3385f9afb94abeeba7b9c13) Thanks [@tim-smart](https://github.com/tim-smart)! - add schema annotation for adding custom hashes - -- Updated dependencies [[`1e38404`](https://github.com/Effect-TS/rpc/commit/1e384040ef20bb0db3385f9afb94abeeba7b9c13), [`1e38404`](https://github.com/Effect-TS/rpc/commit/1e384040ef20bb0db3385f9afb94abeeba7b9c13)]: - - @effect/rpc@0.16.0 - -## 0.15.0 - -### Minor Changes - -- [#120](https://github.com/Effect-TS/rpc/pull/120) [`5e9a51d`](https://github.com/Effect-TS/rpc/commit/5e9a51d25306ef06fd1a8d2871723b114c724034) Thanks [@tim-smart](https://github.com/tim-smart)! - update effect - -### Patch Changes - -- Updated dependencies [[`5e9a51d`](https://github.com/Effect-TS/rpc/commit/5e9a51d25306ef06fd1a8d2871723b114c724034)]: - - @effect/rpc@0.15.0 - -## 0.14.0 - -### Minor Changes - -- [#117](https://github.com/Effect-TS/rpc/pull/117) [`c7ae740`](https://github.com/Effect-TS/rpc/commit/c7ae740eb822b081e8267b976aa650d863a86240) Thanks [@tim-smart](https://github.com/tim-smart)! - update effect - -### Patch Changes - -- Updated dependencies [[`c7ae740`](https://github.com/Effect-TS/rpc/commit/c7ae740eb822b081e8267b976aa650d863a86240)]: - - @effect/rpc@0.14.0 - -## 0.13.0 - -### Minor Changes - -- [#115](https://github.com/Effect-TS/rpc/pull/115) [`3d1c365`](https://github.com/Effect-TS/rpc/commit/3d1c365a458c5dfccc2e945376615370cea43cd5) Thanks [@tim-smart](https://github.com/tim-smart)! - update effect - -### Patch Changes - -- Updated dependencies [[`3d1c365`](https://github.com/Effect-TS/rpc/commit/3d1c365a458c5dfccc2e945376615370cea43cd5)]: - - @effect/rpc@0.13.0 - -## 0.12.1 - -### Patch Changes - -- Updated dependencies [[`4eacac5`](https://github.com/Effect-TS/rpc/commit/4eacac5194eaf929d98f4a8b6ed6c361f8251d17)]: - - @effect/rpc@0.12.1 - -## 0.12.0 - -### Minor Changes - -- [#106](https://github.com/Effect-TS/rpc/pull/106) [`442ec63`](https://github.com/Effect-TS/rpc/commit/442ec6361b49e1c58b73ac6b021b00cdc060f02c) Thanks [@tim-smart](https://github.com/tim-smart)! - update effect - -### Patch Changes - -- Updated dependencies [[`442ec63`](https://github.com/Effect-TS/rpc/commit/442ec6361b49e1c58b73ac6b021b00cdc060f02c)]: - - @effect/rpc@0.12.0 - -## 0.11.1 - -### Patch Changes - -- Updated dependencies [[`cb20e7e`](https://github.com/Effect-TS/rpc/commit/cb20e7efb3a729eef51d475715c6d68751546cfb)]: - - @effect/rpc@0.11.1 - -## 0.11.0 - -### Minor Changes - -- [#102](https://github.com/Effect-TS/rpc/pull/102) [`a6c9e24`](https://github.com/Effect-TS/rpc/commit/a6c9e24c93327f882933cec27480c6839ee7263b) Thanks [@tim-smart](https://github.com/tim-smart)! - update effect - -- [#102](https://github.com/Effect-TS/rpc/pull/102) [`a6c9e24`](https://github.com/Effect-TS/rpc/commit/a6c9e24c93327f882933cec27480c6839ee7263b) Thanks [@tim-smart](https://github.com/tim-smart)! - remove output from \_\_setup schema - -### Patch Changes - -- Updated dependencies [[`a6c9e24`](https://github.com/Effect-TS/rpc/commit/a6c9e24c93327f882933cec27480c6839ee7263b), [`a6c9e24`](https://github.com/Effect-TS/rpc/commit/a6c9e24c93327f882933cec27480c6839ee7263b)]: - - @effect/rpc@0.11.0 - -## 0.10.0 - -### Minor Changes - -- [#100](https://github.com/Effect-TS/rpc/pull/100) [`a103fa6`](https://github.com/Effect-TS/rpc/commit/a103fa694b20c35ebf214ee9d421ecdef41b0f1c) Thanks [@tim-smart](https://github.com/tim-smart)! - update effect - -### Patch Changes - -- Updated dependencies [[`a103fa6`](https://github.com/Effect-TS/rpc/commit/a103fa694b20c35ebf214ee9d421ecdef41b0f1c)]: - - @effect/rpc@0.10.0 - -## 0.9.0 - -### Minor Changes - -- [#98](https://github.com/Effect-TS/rpc/pull/98) [`d9370ec`](https://github.com/Effect-TS/rpc/commit/d9370ec53d6f119aa57e3cf0893a5f7ddaacd83e) Thanks [@tim-smart](https://github.com/tim-smart)! - update effect - -- [#98](https://github.com/Effect-TS/rpc/pull/98) [`d9370ec`](https://github.com/Effect-TS/rpc/commit/d9370ec53d6f119aa57e3cf0893a5f7ddaacd83e) Thanks [@tim-smart](https://github.com/tim-smart)! - build with preconstruct - -### Patch Changes - -- Updated dependencies [[`d9370ec`](https://github.com/Effect-TS/rpc/commit/d9370ec53d6f119aa57e3cf0893a5f7ddaacd83e), [`d9370ec`](https://github.com/Effect-TS/rpc/commit/d9370ec53d6f119aa57e3cf0893a5f7ddaacd83e)]: - - @effect/rpc@0.9.0 - -## 0.8.1 - -### Patch Changes - -- [#96](https://github.com/Effect-TS/rpc/pull/96) [`0d0494d`](https://github.com/Effect-TS/rpc/commit/0d0494df52786a90d9d079c2dd732daa3c38f217) Thanks [@tim-smart](https://github.com/tim-smart)! - update effect - -- Updated dependencies [[`0d0494d`](https://github.com/Effect-TS/rpc/commit/0d0494df52786a90d9d079c2dd732daa3c38f217)]: - - @effect/rpc@0.8.1 - -## 0.8.0 - -### Minor Changes - -- [#92](https://github.com/Effect-TS/rpc/pull/92) [`977d259`](https://github.com/Effect-TS/rpc/commit/977d259a52813c912c516fc788ec4d67d37751a1) Thanks [@tim-smart](https://github.com/tim-smart)! - update to effect package - -### Patch Changes - -- Updated dependencies [[`977d259`](https://github.com/Effect-TS/rpc/commit/977d259a52813c912c516fc788ec4d67d37751a1)]: - - @effect/rpc@0.8.0 - -## 0.7.0 - -### Minor Changes - -- [#90](https://github.com/Effect-TS/rpc/pull/90) [`591d1b3`](https://github.com/Effect-TS/rpc/commit/591d1b37153cb5d4ffb9e33c8c36327c7094bfd4) Thanks [@tim-smart](https://github.com/tim-smart)! - update dependencies - -### Patch Changes - -- Updated dependencies [[`591d1b3`](https://github.com/Effect-TS/rpc/commit/591d1b37153cb5d4ffb9e33c8c36327c7094bfd4)]: - - @effect/rpc@0.7.0 - -## 0.6.0 - -### Minor Changes - -- [#88](https://github.com/Effect-TS/rpc/pull/88) [`595a28a`](https://github.com/Effect-TS/rpc/commit/595a28ab657b2c7bbbc3461e6ba8340e37c30f32) Thanks [@tim-smart](https://github.com/tim-smart)! - update dependencies - -### Patch Changes - -- Updated dependencies [[`595a28a`](https://github.com/Effect-TS/rpc/commit/595a28ab657b2c7bbbc3461e6ba8340e37c30f32)]: - - @effect/rpc@0.6.0 - -## 0.5.0 - -### Minor Changes - -- [#86](https://github.com/Effect-TS/rpc/pull/86) [`ed3f157`](https://github.com/Effect-TS/rpc/commit/ed3f157aa7cd16be8e701faff224e724d71ecc2a) Thanks [@tim-smart](https://github.com/tim-smart)! - update dependencies - -### Patch Changes - -- Updated dependencies [[`ed3f157`](https://github.com/Effect-TS/rpc/commit/ed3f157aa7cd16be8e701faff224e724d71ecc2a)]: - - @effect/rpc@0.5.0 - -## 0.4.0 - -### Minor Changes - -- [#84](https://github.com/Effect-TS/rpc/pull/84) [`0557754`](https://github.com/Effect-TS/rpc/commit/05577547715eddd64800db55e4dfa4749366f042) Thanks [@tim-smart](https://github.com/tim-smart)! - update dependencies - -### Patch Changes - -- [#81](https://github.com/Effect-TS/rpc/pull/81) [`4fd7acd`](https://github.com/Effect-TS/rpc/commit/4fd7acde0b7ceccec1df1a395a06c9bb6d2b9b62) Thanks [@tim-smart](https://github.com/tim-smart)! - switch to using peerDependencies - -- [#83](https://github.com/Effect-TS/rpc/pull/83) [`539c1f8`](https://github.com/Effect-TS/rpc/commit/539c1f88d02d8b5cf8454b5b3dc1d3a3d1002f6b) Thanks [@tim-smart](https://github.com/tim-smart)! - update build tools - -- Updated dependencies [[`0557754`](https://github.com/Effect-TS/rpc/commit/05577547715eddd64800db55e4dfa4749366f042), [`4fd7acd`](https://github.com/Effect-TS/rpc/commit/4fd7acde0b7ceccec1df1a395a06c9bb6d2b9b62), [`539c1f8`](https://github.com/Effect-TS/rpc/commit/539c1f88d02d8b5cf8454b5b3dc1d3a3d1002f6b)]: - - @effect/rpc@0.4.0 - -## 0.3.2 - -### Patch Changes - -- [#78](https://github.com/Effect-TS/rpc/pull/78) [`55ba56e`](https://github.com/Effect-TS/rpc/commit/55ba56eb09c6066126af5f224652a4c5d413f8d4) Thanks [@alex-dixon](https://github.com/alex-dixon)! - upgrade deps - -- Updated dependencies [[`55ba56e`](https://github.com/Effect-TS/rpc/commit/55ba56eb09c6066126af5f224652a4c5d413f8d4)]: - - @effect/rpc@0.3.2 - -## 0.3.1 - -### Patch Changes - -- Updated dependencies [[`9e745eb`](https://github.com/Effect-TS/rpc/commit/9e745eb295c2a46a7c9e591ae4ae4c85a70e6f80)]: - - @effect/rpc@0.3.1 - -## 0.3.0 - -### Minor Changes - -- [#69](https://github.com/Effect-TS/rpc/pull/69) [`3feb1e5`](https://github.com/Effect-TS/rpc/commit/3feb1e59b783a8bc06ea7ccbb2e0cef51da95439) Thanks [@tim-smart](https://github.com/tim-smart)! - update dependencies - -### Patch Changes - -- [#67](https://github.com/Effect-TS/rpc/pull/67) [`86829c1`](https://github.com/Effect-TS/rpc/commit/86829c1f957ad56efe3d5b3e530b5f5789546427) Thanks [@tim-smart](https://github.com/tim-smart)! - update docs - -- [#70](https://github.com/Effect-TS/rpc/pull/70) [`fdc4970`](https://github.com/Effect-TS/rpc/commit/fdc49706df05699d02223652d63e0084f5983e0d) Thanks [@tim-smart](https://github.com/tim-smart)! - update deps - -- Updated dependencies [[`86829c1`](https://github.com/Effect-TS/rpc/commit/86829c1f957ad56efe3d5b3e530b5f5789546427), [`3feb1e5`](https://github.com/Effect-TS/rpc/commit/3feb1e59b783a8bc06ea7ccbb2e0cef51da95439), [`fdc4970`](https://github.com/Effect-TS/rpc/commit/fdc49706df05699d02223652d63e0084f5983e0d)]: - - @effect/rpc@0.3.0 - -## 0.2.0 - -### Minor Changes - -- [#64](https://github.com/Effect-TS/rpc/pull/64) [`98bef67`](https://github.com/Effect-TS/rpc/commit/98bef6770efa35488f0eced160418428c52e3657) Thanks [@tim-smart](https://github.com/tim-smart)! - update deps - -### Patch Changes - -- Updated dependencies [[`98bef67`](https://github.com/Effect-TS/rpc/commit/98bef6770efa35488f0eced160418428c52e3657)]: - - @effect/rpc@0.2.0 - -## 0.1.1 - -### Patch Changes - -- [#59](https://github.com/Effect-TS/rpc/pull/59) [`c3f1506`](https://github.com/Effect-TS/rpc/commit/c3f1506c37040c377d5042cf687d1cc3a4adba9f) Thanks [@tim-smart](https://github.com/tim-smart)! - add \_\_setup method - -- Updated dependencies [[`c3f1506`](https://github.com/Effect-TS/rpc/commit/c3f1506c37040c377d5042cf687d1cc3a4adba9f)]: - - @effect/rpc@0.1.1 - -## 0.1.0 - -### Minor Changes - -- [#57](https://github.com/Effect-TS/rpc/pull/57) [`6c4f558`](https://github.com/Effect-TS/rpc/commit/6c4f55889592a53626198909751d70d495a95200) Thanks [@tim-smart](https://github.com/tim-smart)! - release - -### Patch Changes - -- Updated dependencies [[`6c4f558`](https://github.com/Effect-TS/rpc/commit/6c4f55889592a53626198909751d70d495a95200)]: - - @effect/rpc@0.1.0 diff --git a/packages/rpc-http/LICENSE b/packages/rpc-http/LICENSE deleted file mode 100644 index 7f6fe480f77..00000000000 --- a/packages/rpc-http/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -MIT License - -Copyright (c) 2023-present The Contributors - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/packages/rpc-http/README.md b/packages/rpc-http/README.md deleted file mode 100644 index bd2a8acd65a..00000000000 --- a/packages/rpc-http/README.md +++ /dev/null @@ -1,5 +0,0 @@ -# `@effect/rpc-http` - -## Documentation - -- **API Reference**: [View the full documentation](https://effect-ts.github.io/effect/docs/rpc-http). diff --git a/packages/rpc-http/docgen.json b/packages/rpc-http/docgen.json deleted file mode 100644 index 93188b0ddac..00000000000 --- a/packages/rpc-http/docgen.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "$schema": "../../node_modules/@effect/docgen/schema.json", - "srcLink": "https://github.com/Effect-TS/effect/tree/main/packages/rpc-http/src/", - "exclude": [ - "src/internal/**/*.ts" - ] -} diff --git a/packages/rpc-http/examples/client.ts b/packages/rpc-http/examples/client.ts deleted file mode 100644 index f69b8d9901c..00000000000 --- a/packages/rpc-http/examples/client.ts +++ /dev/null @@ -1,29 +0,0 @@ -import { FetchHttpClient, HttpClient, HttpClientRequest } from "@effect/platform" -import { RpcResolver } from "@effect/rpc" -import { HttpRpcResolver } from "@effect/rpc-http" -import { Console, Effect, Stream } from "effect" -import type { UserRouter } from "./router.js" -import { GetUser, GetUserIds } from "./schema.js" - -// Create the client -const makeClient = Effect.gen(function*() { - const client = yield* HttpClient.HttpClient - return HttpRpcResolver.make( - client.pipe( - HttpClient.mapRequest(HttpClientRequest.prependUrl("http://localhost:3000/rpc")) - ) - ).pipe(RpcResolver.toClient) -}) - -// Use the client -Effect.gen(function*() { - const client = yield* makeClient - yield* client(new GetUserIds()).pipe( - Stream.runCollect, - Effect.flatMap(Effect.forEach((id) => client(new GetUser({ id })), { batching: true })), - Effect.tap(Console.log) - ) -}).pipe( - Effect.provide(FetchHttpClient.layer), - Effect.runFork -) diff --git a/packages/rpc-http/examples/router.ts b/packages/rpc-http/examples/router.ts deleted file mode 100644 index 625cbc70dd8..00000000000 --- a/packages/rpc-http/examples/router.ts +++ /dev/null @@ -1,27 +0,0 @@ -import { HttpMiddleware, HttpRouter, HttpServer } from "@effect/platform" -import { NodeHttpServer, NodeRuntime } from "@effect/platform-node" -import { Rpc, RpcRouter } from "@effect/rpc" -import { HttpRpcRouter } from "@effect/rpc-http" -import { Array, Effect, Layer, Stream } from "effect" -import { createServer } from "http" -import { GetUser, GetUserIds, User, UserId } from "./schema.js" - -// Implement the RPC server router -const router = RpcRouter.make( - Rpc.stream(GetUserIds, () => Stream.fromIterable(Array.makeBy(1000, UserId.make))), - Rpc.effect(GetUser, ({ id }) => Effect.succeed(new User({ id, name: "John Doe" }))) -) - -export type UserRouter = typeof router - -// Create the http server -const HttpLive = HttpRouter.empty.pipe( - HttpRouter.post("/rpc", HttpRpcRouter.toHttpApp(router)), - HttpServer.serve(HttpMiddleware.logger), - HttpServer.withLogAddress, - Layer.provide(NodeHttpServer.layer(createServer, { port: 3000 })) -) - -Layer.launch(HttpLive).pipe( - NodeRuntime.runMain -) diff --git a/packages/rpc-http/examples/schema.ts b/packages/rpc-http/examples/schema.ts deleted file mode 100644 index a454ae6b776..00000000000 --- a/packages/rpc-http/examples/schema.ts +++ /dev/null @@ -1,22 +0,0 @@ -import * as Rpc from "@effect/rpc/Rpc" -import { pipe } from "effect/Function" -import * as S from "effect/Schema" - -export const UserId = pipe(S.Number, S.int(), S.brand("UserId")) -export type UserId = S.Schema.Type - -export class User extends S.Class("User")({ - id: UserId, - name: S.String -}) {} - -export class GetUserIds - extends Rpc.StreamRequest()("GetUserIds", { failure: S.Never, success: UserId, payload: {} }) -{} -export class GetUser extends S.TaggedRequest()("GetUser", { - failure: S.Never, - success: User, - payload: { - id: UserId - } -}) {} diff --git a/packages/rpc-http/package.json b/packages/rpc-http/package.json deleted file mode 100644 index 95439e31414..00000000000 --- a/packages/rpc-http/package.json +++ /dev/null @@ -1,53 +0,0 @@ -{ - "name": "@effect/rpc-http", - "version": "0.52.3", - "type": "module", - "license": "MIT", - "description": "Functional programming in TypeScript", - "homepage": "https://effect.website", - "repository": { - "type": "git", - "url": "https://github.com/Effect-TS/effect.git", - "directory": "packages/rpc-http" - }, - "bugs": { - "url": "https://github.com/Effect-TS/effect/issues" - }, - "tags": [ - "typescript", - "algebraic-data-types", - "functional-programming" - ], - "keywords": [ - "typescript", - "algebraic-data-types", - "functional-programming" - ], - "publishConfig": { - "access": "public", - "directory": "dist", - "provenance": true - }, - "scripts": { - "codegen": "build-utils prepare-v2", - "build": "pnpm build-esm && pnpm build-annotate && pnpm build-cjs && build-utils pack-v2", - "build-esm": "tsc -b tsconfig.build.json", - "build-cjs": "babel build/esm --plugins @babel/transform-export-namespace-from --plugins @babel/transform-modules-commonjs --out-dir build/cjs --source-maps", - "build-annotate": "babel build/esm --plugins annotate-pure-calls --out-dir build/esm --source-maps", - "check": "tsc -b tsconfig.json", - "test": "vitest", - "coverage": "vitest --coverage" - }, - "dependencies": { - "@effect/rpc": "workspace:^" - }, - "devDependencies": { - "@effect/platform": "workspace:^", - "@effect/platform-node": "workspace:^", - "effect": "workspace:^" - }, - "peerDependencies": { - "@effect/platform": "workspace:^", - "effect": "workspace:^" - } -} diff --git a/packages/rpc-http/src/HttpRpcResolver.ts b/packages/rpc-http/src/HttpRpcResolver.ts deleted file mode 100644 index a39af972353..00000000000 --- a/packages/rpc-http/src/HttpRpcResolver.ts +++ /dev/null @@ -1,67 +0,0 @@ -/** - * @since 1.0.0 - */ -import * as Body from "@effect/platform/HttpBody" -import * as Client from "@effect/platform/HttpClient" -import * as ClientRequest from "@effect/platform/HttpClientRequest" -import type * as Rpc from "@effect/rpc/Rpc" -import * as Resolver from "@effect/rpc/RpcResolver" -import type * as Router from "@effect/rpc/RpcRouter" -import * as Chunk from "effect/Chunk" -import * as Effect from "effect/Effect" -import type * as RequestResolver from "effect/RequestResolver" -import * as Schedule from "effect/Schedule" -import type * as Schema from "effect/Schema" -import * as Stream from "effect/Stream" - -/** - * @category constructors - * @since 1.0.0 - */ -export const make = >( - client: Client.HttpClient -): RequestResolver.RequestResolver< - Rpc.Request>, - Schema.SerializableWithResult.Context> -> => - Resolver.make((requests) => - client.post("", { - body: Body.unsafeJson(requests) - }).pipe( - Effect.map((_) => - _.stream.pipe( - Stream.decodeText(), - Stream.splitLines, - Stream.map((_) => Chunk.unsafeFromArray(JSON.parse(_))), - Stream.flattenChunks - ) - ), - Stream.unwrapScoped - ) - )() - -/** - * @category constructors - * @since 1.0.0 - */ -export const makeClient = >( - baseUrl: string -): Schema.SerializableWithResult.Context> extends never ? Effect.Effect< - Resolver.Client< - RequestResolver.RequestResolver< - Rpc.Request> - > - >, - never, - Client.HttpClient - > - : "request context is not `never`" => - Effect.map(Client.HttpClient, (client) => - Resolver.toClient(make(client.pipe( - Client.mapRequest(ClientRequest.prependUrl(baseUrl)), - Client.retry( - Schedule.exponential(50).pipe( - Schedule.intersect(Schedule.recurs(5)) - ) - ) - )) as any)) as any diff --git a/packages/rpc-http/src/HttpRpcResolverNoStream.ts b/packages/rpc-http/src/HttpRpcResolverNoStream.ts deleted file mode 100644 index 321429eb314..00000000000 --- a/packages/rpc-http/src/HttpRpcResolverNoStream.ts +++ /dev/null @@ -1,59 +0,0 @@ -/** - * @since 1.0.0 - */ -import * as Body from "@effect/platform/HttpBody" -import * as Client from "@effect/platform/HttpClient" -import * as ClientRequest from "@effect/platform/HttpClientRequest" -import type * as Rpc from "@effect/rpc/Rpc" -import * as Resolver from "@effect/rpc/RpcResolver" -import * as ResolverNoStream from "@effect/rpc/RpcResolverNoStream" -import type * as Router from "@effect/rpc/RpcRouter" -import * as Effect from "effect/Effect" -import type * as RequestResolver from "effect/RequestResolver" -import * as Schedule from "effect/Schedule" -import type * as Schema from "effect/Schema" - -/** - * @category constructors - * @since 1.0.0 - */ -export const make = >( - client: Client.HttpClient -): RequestResolver.RequestResolver< - Rpc.Request>, - Schema.SerializableWithResult.Context> -> => - ResolverNoStream.make((requests) => - client.post("", { - body: Body.unsafeJson(requests) - }).pipe( - Effect.flatMap((_) => _.json), - Effect.scoped - ) - )() - -/** - * @category constructors - * @since 1.0.0 - */ -export const makeClient = >( - baseUrl: string -): Schema.SerializableWithResult.Context> extends never ? Effect.Effect< - Resolver.Client< - RequestResolver.RequestResolver< - Rpc.Request> - > - >, - never, - Client.HttpClient - > - : "request context is not `never`" => - Effect.map(Client.HttpClient, (client) => - Resolver.toClient(make(client.pipe( - Client.mapRequest(ClientRequest.prependUrl(baseUrl)), - Client.retry( - Schedule.exponential(50).pipe( - Schedule.intersect(Schedule.recurs(5)) - ) - ) - )) as any)) as any diff --git a/packages/rpc-http/src/HttpRpcRouter.ts b/packages/rpc-http/src/HttpRpcRouter.ts deleted file mode 100644 index 007a7ba03b8..00000000000 --- a/packages/rpc-http/src/HttpRpcRouter.ts +++ /dev/null @@ -1,54 +0,0 @@ -/** - * @since 1.0.0 - */ -import type * as App from "@effect/platform/HttpApp" -import type * as ServerError from "@effect/platform/HttpServerError" -import * as ServerRequest from "@effect/platform/HttpServerRequest" -import * as ServerResponse from "@effect/platform/HttpServerResponse" -import * as Router from "@effect/rpc/RpcRouter" -import * as Chunk from "effect/Chunk" -import * as Context from "effect/Context" -import * as Effect from "effect/Effect" -import * as FiberRef from "effect/FiberRef" -import { dual } from "effect/Function" -import * as Stream from "effect/Stream" - -/** - * @since 1.0.0 - * @category conversions - */ -export const toHttpApp: { - (options?: { - readonly spanPrefix?: string - }): >(self: R) => App.Default< - ServerError.RequestError, - Router.RpcRouter.Context - > - >(self: R, options?: { - readonly spanPrefix?: string - }): App.Default< - ServerError.RequestError, - Router.RpcRouter.Context - > -} = dual((args) => Router.isRpcRouter(args[0]), >(self: R, options?: { - readonly spanPrefix?: string -}): App.Default< - ServerError.RequestError, - Router.RpcRouter.Context -> => { - const handler = Router.toHandler(self, options) - return Effect.withFiberRuntime((fiber) => { - const context = fiber.getFiberRef(FiberRef.currentContext) - const request = Context.unsafeGet(context, ServerRequest.HttpServerRequest) - return Effect.map(request.json, (_) => - ServerResponse.stream( - handler(_).pipe( - Stream.chunks, - Stream.map((_) => JSON.stringify(Chunk.toReadonlyArray(_)) + "\n"), - Stream.encodeText, - Stream.provideContext(context) - ), - { contentType: "application/ndjson" } - )) - }) -}) diff --git a/packages/rpc-http/src/HttpRpcRouterNoStream.ts b/packages/rpc-http/src/HttpRpcRouterNoStream.ts deleted file mode 100644 index 401255035a8..00000000000 --- a/packages/rpc-http/src/HttpRpcRouterNoStream.ts +++ /dev/null @@ -1,42 +0,0 @@ -/** - * @since 1.0.0 - */ -import type * as App from "@effect/platform/HttpApp" -import type * as ServerError from "@effect/platform/HttpServerError" -import * as ServerRequest from "@effect/platform/HttpServerRequest" -import * as ServerResponse from "@effect/platform/HttpServerResponse" -import * as Router from "@effect/rpc/RpcRouter" -import * as Effect from "effect/Effect" -import { dual } from "effect/Function" -import type { ParseError } from "effect/ParseResult" - -/** - * @since 1.0.0 - * @category conversions - */ -export const toHttpApp: { - (options?: { - readonly spanPrefix?: string - }): >(self: R) => App.Default< - ServerError.RequestError, - Router.RpcRouter.Context - > - >(self: R, options?: { - readonly spanPrefix?: string - }): App.Default< - ServerError.RequestError, - Router.RpcRouter.Context - > -} = dual((args) => Router.isRpcRouter(args[0]), >(self: R, options?: { - readonly spanPrefix?: string -}): App.Default< - ServerError.RequestError | ParseError, - Router.RpcRouter.Context -> => { - const handler = Router.toHandlerNoStream(self, options) - return ServerRequest.HttpServerRequest.pipe( - Effect.flatMap((_) => _.json), - Effect.flatMap(handler), - Effect.map(ServerResponse.unsafeJson) - ) -}) diff --git a/packages/rpc-http/src/index.ts b/packages/rpc-http/src/index.ts deleted file mode 100644 index 488ff5fa7fd..00000000000 --- a/packages/rpc-http/src/index.ts +++ /dev/null @@ -1,19 +0,0 @@ -/** - * @since 1.0.0 - */ -export * as HttpRpcResolver from "./HttpRpcResolver.js" - -/** - * @since 1.0.0 - */ -export * as HttpRpcResolverNoStream from "./HttpRpcResolverNoStream.js" - -/** - * @since 1.0.0 - */ -export * as HttpRpcRouter from "./HttpRpcRouter.js" - -/** - * @since 1.0.0 - */ -export * as HttpRpcRouterNoStream from "./HttpRpcRouterNoStream.js" diff --git a/packages/rpc-http/test/Router.test.ts b/packages/rpc-http/test/Router.test.ts deleted file mode 100644 index 27150538172..00000000000 --- a/packages/rpc-http/test/Router.test.ts +++ /dev/null @@ -1,5 +0,0 @@ -import { describe, test } from "@effect/vitest" - -describe("Router", () => { - test("should work", () => {}) -}) diff --git a/packages/rpc-http/tsconfig.build.json b/packages/rpc-http/tsconfig.build.json deleted file mode 100644 index e32ea6e7189..00000000000 --- a/packages/rpc-http/tsconfig.build.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "extends": "./tsconfig.src.json", - "references": [ - { "path": "../effect/tsconfig.build.json" }, - { "path": "../rpc/tsconfig.build.json" }, - { "path": "../platform/tsconfig.build.json" } - ], - "compilerOptions": { - "tsBuildInfoFile": ".tsbuildinfo/build.tsbuildinfo", - "outDir": "build/esm", - "declarationDir": "build/dts", - "stripInternal": true - } -} diff --git a/packages/rpc-http/tsconfig.examples.json b/packages/rpc-http/tsconfig.examples.json deleted file mode 100644 index 149a8d1ae5d..00000000000 --- a/packages/rpc-http/tsconfig.examples.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "extends": "../../tsconfig.base.json", - "include": ["examples"], - "references": [ - { "path": "tsconfig.src.json" }, - { "path": "../effect" }, - { "path": "../rpc" }, - { "path": "../platform" }, - { "path": "../platform-node" } - ], - "compilerOptions": { - "tsBuildInfoFile": ".tsbuildinfo/examples.tsbuildinfo", - "rootDir": "examples", - "noEmit": true - } -} diff --git a/packages/rpc-http/tsconfig.json b/packages/rpc-http/tsconfig.json deleted file mode 100644 index 3edbf6b8a56..00000000000 --- a/packages/rpc-http/tsconfig.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "extends": "../../tsconfig.base.json", - "include": [], - "references": [ - { "path": "tsconfig.src.json" }, - { "path": "tsconfig.test.json" }, - { "path": "tsconfig.examples.json" } - ] -} diff --git a/packages/rpc-http/tsconfig.src.json b/packages/rpc-http/tsconfig.src.json deleted file mode 100644 index 22e4045b579..00000000000 --- a/packages/rpc-http/tsconfig.src.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "extends": "../../tsconfig.base.json", - "include": ["src"], - "references": [ - { "path": "../effect/tsconfig.src.json" }, - { "path": "../rpc/tsconfig.src.json" }, - { "path": "../platform/tsconfig.src.json" } - ], - "compilerOptions": { - "tsBuildInfoFile": ".tsbuildinfo/src.tsbuildinfo", - "rootDir": "src", - "outDir": "build/src" - } -} diff --git a/packages/rpc-http/tsconfig.test.json b/packages/rpc-http/tsconfig.test.json deleted file mode 100644 index 185e7065e44..00000000000 --- a/packages/rpc-http/tsconfig.test.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "extends": "../../tsconfig.base.json", - "include": ["test"], - "references": [ - { "path": "tsconfig.src.json" }, - { "path": "../vitest/tsconfig.src.json" } - ], - "compilerOptions": { - "tsBuildInfoFile": ".tsbuildinfo/test.tsbuildinfo", - "rootDir": "test", - "noEmit": true - } -} diff --git a/packages/rpc-http/vitest.config.ts b/packages/rpc-http/vitest.config.ts deleted file mode 100644 index 578d0667249..00000000000 --- a/packages/rpc-http/vitest.config.ts +++ /dev/null @@ -1,6 +0,0 @@ -import { mergeConfig, type ViteUserConfig } from "vitest/config" -import shared from "../../vitest.shared.js" - -const config: ViteUserConfig = {} - -export default mergeConfig(shared, config) diff --git a/packages/rpc/README.md b/packages/rpc/README.md index 36e3b19ad10..5eb8b89155c 100644 --- a/packages/rpc/README.md +++ b/packages/rpc/README.md @@ -6,32 +6,15 @@ The `@effect/rpc` library facilitates the development of remote procedure call ( ## Declaring Requests -The `TaggedRequest` API in the `effect/Schema` module is designed to facilitate the creation of structured requests that can serialize function signatures involving input arguments, successful outcomes, and potential failures. Essentially, it's a tool for defining a serializable function that can be reliably transported across different systems or network layers. +The `RpcGroup` and `Rpc` modules can be used alongside the `Schema` module to +define requests and responses. -Here’s a simplified explanation: - -1. **Function Modeling**: `TaggedRequest` allows you to model a function signature as a class, which includes the input arguments, the type of the success response, and the type of the failure response. - -2. **Serialization Schema**: For each component (input, success, failure), you specify a corresponding schema. This setup helps ensure that the data associated with each request can be properly serialized (converted to a format suitable for storage or transmission) and deserialized (converted back to usable format). - -3. **Usage Scenario**: This API is particularly useful when you need to handle remote procedure calls (RPCs) where functions and their arguments need to be sent over a network, processed, and then responded to asynchronously. - -4. **Streamlined Code**: By leveraging `Schema.TaggedRequest`, developers can reduce the amount of boilerplate code typically required for handling complex data serialization and deserialization tasks in distributed systems. - -In practice, when you create an instance of `TaggedRequest`, you define the function's behavior along with its serialization rules, which streamlines the process of encoding input data, sending it across a network, and decoding responses. - -```mermaid -sequenceDiagram - Sender->>SenderBound: encodes A to I - SenderBound-->>ReceiverBound: send I - ReceiverBound->>Receiver: decodes I to A - Receiver->>ReceiverBound: encodes Exit
to Exit - ReceiverBound-->>SenderBound: send back
Exit - SenderBound->>Sender: decodes Exit
to Exit -``` +Here we are defining a request to retrieve a list of users, a request to +retrieve a user by ID, and a request to create a new user. ```ts filename="request.ts" // request.ts +import { Rpc, RpcGroup } from "@effect/rpc" import { Schema } from "effect" // Define a user with an ID and name @@ -40,90 +23,99 @@ export class User extends Schema.Class("User")({ name: Schema.String // User's name as a string }) {} -// Request to retrieve a list of users -export class UserList extends Schema.TaggedRequest()("UserList", { - failure: Schema.Never, // Indicates that no errors are expected - success: Schema.Array(User), // Specifies that the response is an array of Users - payload: {} -}) {} - -// Request to retrieve a user by ID -export class UserById extends Schema.TaggedRequest()("UserById", { - failure: Schema.String, // Indicates that errors, if any, will be returned as strings - success: User, // Specifies that the response is a User - payload: { - id: Schema.String - } -}) {} - -// Request to create a new user -export class UserCreate extends Schema.TaggedRequest()( - "UserCreate", - { - failure: Schema.Never, // Indicates that no errors are expected - success: User, // Specifies that the response is a User +// Define a group of RPCs for user management. +// You can use the `RpcGroup.make` function to create a group of RPCs. +export class UserRpcs extends RpcGroup.make( + // Request to retrieve a list of users + Rpc.make("UserList", { + success: User, // Succeed with a stream of users + stream: true + }), + Rpc.make("UserById", { + success: User, + error: Schema.String, // Indicates that errors, if any, will be returned as strings + payload: { + id: Schema.String + } + }), + Rpc.make("UserCreate", { + success: User, payload: { name: Schema.String } - } + }) ) {} ``` -## Defining a Router +## Implementing the handlers -This section introduces how to configure a router using an imaginary database setup to manage user data. +This section introduces how to implement the rpc handlers, using an imaginary database setup to manage user data. ```ts filename="router.ts" -// router.ts -import { RpcRouter, Rpc } from "@effect/rpc" -import { Effect, Ref } from "effect" -import { User, UserById, UserCreate, UserList } from "./request.js" +// handlers.ts +import type { Rpc } from "@effect/rpc" +import { Effect, Layer, Ref, Stream } from "effect" +import { User, UserRpcs } from "./request.js" // --------------------------------------------- // Imaginary Database // --------------------------------------------- -const ref = Ref.unsafeMake>([ - new User({ id: "1", name: "Alice" }), - new User({ id: "2", name: "Bob" }) -]) - -const db = { - user: { - findMany: () => ref.get, - findById: (id: string) => - Ref.get(ref).pipe( - Effect.andThen((users) => { - const user = users.find((user) => user.id === id) - return user - ? Effect.succeed(user) - : Effect.fail(`User not found: ${id}`) - }) - ), - create: (name: string) => - Ref.updateAndGet(ref, (users) => [ - ...users, - new User({ id: String(users.length + 1), name }) - ]).pipe(Effect.andThen((users) => users[users.length - 1])) +class UserRepository extends Effect.Service()( + "UserRepository", + { + effect: Effect.gen(function* () { + const ref = yield* Ref.make>([ + new User({ id: "1", name: "Alice" }), + new User({ id: "2", name: "Bob" }) + ]) + + return { + findMany: ref.get, + findById: (id: string) => + Ref.get(ref).pipe( + Effect.andThen((users) => { + const user = users.find((user) => user.id === id) + return user + ? Effect.succeed(user) + : Effect.fail(`User not found: ${id}`) + }) + ), + create: (name: string) => + Ref.updateAndGet(ref, (users) => [ + ...users, + new User({ id: String(users.length + 1), name }) + ]).pipe(Effect.andThen((users) => users[users.length - 1])) + } + }) } -} +) {} // --------------------------------------------- -// Router +// RPC handlers // --------------------------------------------- -export const appRouter = RpcRouter.make( - Rpc.effect(UserList, () => db.user.findMany()), - Rpc.effect(UserById, ({ id }) => db.user.findById(id)), - Rpc.effect(UserCreate, ({ name }) => db.user.create(name)) -) +export const UsersLive: Layer.Layer< + Rpc.Handler<"UserList"> | Rpc.Handler<"UserById"> | Rpc.Handler<"UserCreate"> +> = UserRpcs.toLayer( + Effect.gen(function* () { + const db = yield* UserRepository -export type AppRouter = typeof appRouter + return { + UserList: () => Stream.fromIterableEffect(db.findMany), + UserById: ({ id }) => db.findById(id), + UserCreate: ({ name }) => db.create(name) + } + }) +).pipe( + // Provide the UserRepository layer + Layer.provide(UserRepository.Default) +) ``` ## Serving the API -This part explains how to serve the API using the defined router. +This part explains how to serve the API using the handlers we defined earlier. ```ts filename="server.ts" // server.ts @@ -151,15 +143,7 @@ Use this `curl` command to test if the API is operational: ```bash curl -X POST http://localhost:3000/rpc \ -H "Content-Type: application/json" \ - -d '[ - { - "request": { "_tag": "UserList" }, - "traceId": "traceId", - "spanId": "spanId", - "sampled": true, - "headers": {} - } - ]' + -d $'{"_tag": "Request", "id": "123", "tag": "UserList", "payload": {}, "traceId": "traceId", "spanId": "spanId", "sampled": true, "headers": {} }\n' ``` ## Using your new backend on the client @@ -168,58 +152,136 @@ Let's now move to the client-side code and embrace the power of end-to-end types ```ts // client.ts -import { HttpClient, HttpClientRequest } from "@effect/platform" -import { RpcResolver } from "@effect/rpc" -import { HttpRpcResolver } from "@effect/rpc-http" -import { Effect } from "effect" -import { UserCreate, UserList } from "./request.js" -import type { AppRouter } from "./router.js" - -// Define an effect which creates the client -const makeClient = Effect.gen(function*() { - const baseClient = yield* HttpClient.HttpClient - const client = baseClient.pipe( - HttpClient.filterStatusOk, - HttpClient.mapRequest(HttpClientRequest.prependUrl("http://localhost:3000/rpc")) - ) - return RpcResolver.toClient(HttpRpcResolver.make(client)) -}) +import { FetchHttpClient } from "@effect/platform" +import { RpcClient, RpcSerialization } from "@effect/rpc" +import { Chunk, Effect, Layer, Stream } from "effect" +import { UserRpcs } from "./request.js" + +// Choose which protocol to use +const ProtocolLive = RpcClient.layerProtocolHttp({ + url: "http://localhost:3000/rpc" +}).pipe( + Layer.provide([ + // use fetch for http requests + FetchHttpClient.layer, + // use ndjson for serialization + RpcSerialization.layerNdjson + ]) +) // Use the client const program = Effect.gen(function* () { - const client = yield* makeClient - let users = yield* client(new UserList()) - if (!users.find((user) => user.id === "3")) { + const client = yield* RpcClient.make(UserRpcs) + let users = yield* Stream.runCollect(client.UserList({})) + if (!Chunk.findFirst(users, (user) => user.id === "3")) { console.log(`Creating user "Charlie"`) - yield* client(new UserCreate({ name: "Charlie" })) - users = yield* client(new UserList()) + yield* client.UserCreate({ name: "Charlie" }) + users = yield* Stream.runCollect(client.UserList({})) } else { console.log(`User "Charlie" already exists`) } return users -}) +}).pipe(Effect.scoped) -program.pipe( - Effect.provide(FetchHttpClient.layer), - Effect.runPromise -).then(console.log) +program.pipe(Effect.provide(ProtocolLive), Effect.runPromise).then(console.log) ``` -# Stream +## Defining middleware -## Setting Up the Stream Request +To add middleware to the RPC server (& optionally the client), you can use the +`RpcMiddleware` module. -```ts filename="request.ts" -// request.ts -import * as Rpc from "@effect/rpc/Rpc" -import { Schema } from "effect" +The first step is to define the middleware context tag, which is used to both +implement and access the middleware. + +```ts filename="middleware.ts" +// middleware.ts +import { RpcMiddleware } from "@effect/rpc" +import { Context } from "effect" +import type { User } from "./request.js" + +// A context tag which represents the current user +export class CurrentUser extends Context.Tag("CurrentUser")< + CurrentUser, + User +>() {} + +// The context tag for the authentication middleware +export class AuthMiddleware extends RpcMiddleware.Tag()( + "AuthMiddleware", + { + // This middleware will provide the current user context + provides: CurrentUser, + // This middleware requires a client implementation too + requiredForClient: true + } +) {} +``` + +## Implementing middleware + +Once the middleware context tag is defined, you can then use it in a `RpcGroup` +to apply it to various RPCs. + +When it has been applied, you can then implement the middleware logic and add it +to your server and client. + +```ts +import { Headers } from "@effect/platform" +import { Rpc, RpcClient, RpcGroup, RpcMiddleware, RpcServer } from "@effect/rpc" +import { Effect, Layer, Schema } from "effect" +import { AuthMiddleware } from "./middleware.js" +import { User } from "./request.js" + +export class UserRpcs extends RpcGroup.make( + Rpc.make("UserById", { + success: User, + payload: { + id: Schema.String + } + }) + // apply the middleware to a single RPC + .middleware(AuthMiddleware) +) + // or apply the middleware to the entire group + .middleware(AuthMiddleware) {} + +// Implement the middleware for a server +export const AuthLive: Layer.Layer = Layer.succeed( + AuthMiddleware, + // A middleware that provides the current user. + // + // You can access the headers, payload, and the RPC definition when + // implementing the middleware. + AuthMiddleware.of(({ headers, payload, rpc }) => + Effect.succeed(new User({ id: "123", name: "Logged in user" })) + ) +) + +// apply the middleware to a rpc server +RpcServer.layer(UserRpcs).pipe(Layer.provide(AuthLive)) + +// Implement the middleware for a client +// +// The client middleware can access the request and the RPC definition, and +// returns a modified request. +export const AuthClientLive: Layer.Layer< + RpcMiddleware.ForClient +> = RpcMiddleware.layerClient(AuthMiddleware, ({ request, rpc }) => + Effect.succeed({ + ...request, + headers: Headers.set(request.headers, "authorization", "Bearer token") + }) +) -export class Counts extends Rpc.StreamRequest()("Counts", { - failure: Schema.Never, // Indicates that no errors are expected - success: Schema.Number, // Specifies that the response is a number - payload: {} +// apply the middleware to a rpc client +export class UsersClient extends Effect.Service()("UsersClient", { + scoped: RpcClient.make(UserRpcs), + // add the middleware layer to the dependencies + dependencies: [AuthClientLive] }) {} ``` +<<<<<<< HEAD ## Defining the Router @@ -306,3 +368,5 @@ timestamp=...:55.445Z level=INFO fiber=#1 message=4 timestamp=...:55.447Z level=INFO fiber=#1 message=5 */ ``` +======= +>>>>>>> 6e55d9ed4 (@effect/rpc 3rd revision) diff --git a/packages/rpc/package.json b/packages/rpc/package.json index 7574d366d69..165d8885a00 100644 --- a/packages/rpc/package.json +++ b/packages/rpc/package.json @@ -40,7 +40,8 @@ }, "devDependencies": { "@effect/platform": "workspace:^", - "effect": "workspace:^" + "effect": "workspace:^", + "happy-dom": "^14.12.3" }, "peerDependencies": { "@effect/platform": "workspace:^", diff --git a/packages/rpc/src/Rpc.ts b/packages/rpc/src/Rpc.ts index 8e096e793b5..c64bb521d96 100644 --- a/packages/rpc/src/Rpc.ts +++ b/packages/rpc/src/Rpc.ts @@ -1,24 +1,19 @@ /** * @since 1.0.0 */ -import * as Headers from "@effect/platform/Headers" -import type * as Context from "effect/Context" -import * as Effect from "effect/Effect" -import * as FiberRef from "effect/FiberRef" -import { dual, pipe } from "effect/Function" +import type { Headers } from "@effect/platform/Headers" +import * as Context_ from "effect/Context" +import type { Effect } from "effect/Effect" +import type { Exit as Exit_ } from "effect/Exit" import { globalValue } from "effect/GlobalValue" -import type * as ParseResult from "effect/ParseResult" +import * as Option from "effect/Option" import { type Pipeable, pipeArguments } from "effect/Pipeable" import * as Predicate from "effect/Predicate" -import type * as PrimaryKey from "effect/PrimaryKey" -import type * as Record from "effect/Record" -import type * as EffectRequest from "effect/Request" -import type * as RequestResolver from "effect/RequestResolver" import * as Schema from "effect/Schema" -import type { Scope } from "effect/Scope" -import * as Stream from "effect/Stream" -import type * as Types from "effect/Types" -import * as Internal from "./internal/rpc.js" +import type * as AST from "effect/SchemaAST" +import type { Stream } from "effect/Stream" +import type * as RpcMiddleware from "./RpcMiddleware.js" +import * as RpcSchema from "./RpcSchema.js" /** * @since 1.0.0 @@ -34,400 +29,622 @@ export type TypeId = typeof TypeId /** * @since 1.0.0 - * @category refinements + * @category guards */ -export const isRpc = (u: unknown): u is Rpc => Predicate.hasProperty(u, TypeId) +export const isRpc = (u: unknown): u is Rpc => Predicate.hasProperty(u, TypeId) /** + * Represents an API endpoint. An API endpoint is mapped to a single route on + * the underlying `HttpRouter`. + * * @since 1.0.0 * @category models */ -export type Rpc = RpcEffect | RpcStream +export interface Rpc< + out Tag extends string, + out Payload extends AnyStructSchema = Schema.Struct<{}>, + out Success extends Schema.Schema.Any = typeof Schema.Void, + out Error extends Schema.Schema.All = typeof Schema.Never, + out Middleware extends RpcMiddleware.TagClassAny = never +> extends Pipeable { + readonly [TypeId]: TypeId + readonly _tag: Tag + readonly key: string + readonly payloadSchema: Payload + readonly successSchema: Success + readonly errorSchema: Error + readonly annotations: Context_.Context + readonly middlewares: ReadonlySet + + /** + * Set the schema for the success response of the rpc. + */ + setSuccess(schema: S): Rpc< + Tag, + Payload, + S, + Error, + Middleware + > + + /** + * Set the schema for the error response of the rpc. + */ + setError(schema: E): Rpc< + Tag, + Payload, + Success, + E, + Middleware + > + + /** + * Set the schema for the payload of the rpc. + */ + setPayload

| Schema.Struct.Fields>( + schema: P + ): Rpc< + Tag, + P extends Schema.Struct ? P : P extends Schema.Struct.Fields ? Schema.Struct

: never, + Success, + Error, + Middleware + > + + /** + * Add an `RpcMiddleware` to this procedure. + */ + middleware(middleware: M): Rpc< + Tag, + Payload, + Success, + Error, + Middleware | M + > + + /** + * Add an annotation on the rpc. + */ + annotate( + tag: Context_.Tag, + value: S + ): Rpc + + /** + * Merge the annotations of the rpc with the provided context. + */ + annotateContext( + context: Context_.Context + ): Rpc +} /** + * Represents an implemented rpc. + * * @since 1.0.0 * @category models */ -export interface RpcEffect extends Rpc.Proto { - readonly _tag: "Effect" - readonly handler: ( - request: Req - ) => Effect.Effect< - EffectRequest.Request.Success, - EffectRequest.Request.Error, - R - > +export interface Handler { + readonly _: unique symbol + readonly tag: Tag + readonly handler: (request: any, headers: Headers) => Effect | Stream + readonly context: Context } /** * @since 1.0.0 * @category models */ -export interface RpcStream extends Rpc.Proto { - readonly _tag: "Stream" - readonly handler: ( - request: Req - ) => Stream.Stream< - Req extends Schema.WithResult ? A : never, - Req extends Schema.WithResult ? E : never, - R - > +export interface Any extends Pipeable { + readonly [TypeId]: TypeId + readonly _tag: string + readonly key: string } /** * @since 1.0.0 * @category models */ -export declare namespace Rpc { - /** - * @since 1.0.0 - * @category models - */ - export interface Proto extends Pipeable { - readonly [TypeId]: TypeId - readonly _tag: string - readonly schema: Schema.Schema - } +export interface AnyWithProps { + readonly [TypeId]: TypeId + readonly _tag: string + readonly key: string + readonly payloadSchema: AnyStructSchema + readonly successSchema: Schema.Schema.Any + readonly errorSchema: Schema.Schema.All + readonly annotations: Context_.Context + readonly middlewares: ReadonlySet +} - /** - * @since 1.0.0 - * @category models - */ - export type Context> = A extends Rpc - ? R | Schema.SerializableWithResult.Context - : never +/** + * @since 1.0.0 + * @category models + */ +export type Tag = R extends Rpc< + infer _Tag, + infer _Payload, + infer _Success, + infer _Error, + infer _Middleware +> ? _Tag + : never - /** - * @since 1.0.0 - * @category models - */ - export type Request> = Schema.Schema.Type +/** + * @since 1.0.0 + * @category models + */ +export type Success = R extends Rpc< + infer _Tag, + infer _Payload, + infer _Success, + infer _Error, + infer _Middleware +> ? _Success["Type"] + : never - /** - * @since 1.0.0 - * @category models - */ - export type Result = StreamRequestTypeId extends keyof A ? - EffectRequest.Request.Success : - Effect.Effect, EffectRequest.Request.Error, R> +/** + * @since 1.0.0 + * @category models + */ +export type SuccessEncoded = R extends Rpc< + infer _Tag, + infer _Payload, + infer _Success, + infer _Error, + infer _Middleware +> ? _Success["Encoded"] + : never - /** - * @since 1.0.0 - * @category models - */ - export type ResultUndecoded = A extends - Schema.WithResult - ? StreamRequestTypeId extends keyof A ? Stream.Stream - : Effect.Effect - : never -} +/** + * @since 1.0.0 + * @category models + */ +export type SuccessExit = Success extends infer T ? T extends Stream ? void : T + : never /** * @since 1.0.0 - * @category constructors + * @category models */ -export const effect = ( - schema: Schema.Schema, - handler: (request: Req) => Effect.Effect, EffectRequest.Request.Error, R> -): Rpc => ({ - [TypeId]: TypeId, - _tag: "Effect", - schema, - handler, - pipe() { - return pipeArguments(this, arguments) - } -}) +export type SuccessExitEncoded = SuccessEncoded extends infer T ? + T extends Stream ? void : T + : never /** * @since 1.0.0 - * @category type ids + * @category models */ -export const StreamRequestTypeId: unique symbol = Internal.StreamRequestTypeId +export type SuccessChunk = Success extends Stream ? _A : never /** * @since 1.0.0 - * @category type ids + * @category models */ -export type StreamRequestTypeId = typeof StreamRequestTypeId +export type SuccessChunkEncoded = SuccessEncoded extends Stream ? _A : never /** * @since 1.0.0 - * @category schemas + * @category models */ -export interface StreamRequest - extends EffectRequest.Request>, Schema.SerializableWithResult -{ - readonly [StreamRequestTypeId]: StreamRequestTypeId - readonly _tag: Tag -} +export type ErrorSchema = R extends Rpc< + infer _Tag, + infer _Payload, + infer _Success, + infer _Error, + infer _Middleware +> ? _Error | _Middleware + : never /** * @since 1.0.0 - * @category schemas + * @category models */ -export declare namespace StreamRequest { - /** - * @since 1.0.0 - * @category schemas - */ - export type Any = - | StreamRequest - | StreamRequest -} +export type Error = Schema.Schema.Type> /** * @since 1.0.0 - * @category schemas + * @category models + */ +export type ErrorEncoded = Schema.Schema.Encoded> +/** + * @since 1.0.0 + * @category models */ -export interface StreamRequestConstructor - extends Schema.Schema, R> -{ - new( - props: Types.Equals extends true ? void : S, - disableValidation?: boolean - ): StreamRequest & S -} +export type ErrorExit = Success extends Stream ? _E | Error : Error + +/** + * @since 1.0.0 + * @category models + */ +export type ErrorExitEncoded = SuccessEncoded extends Stream + ? _E | ErrorEncoded + : ErrorEncoded /** * @since 1.0.0 - * @category schemas + * @category models */ -export const StreamRequest = - () => - ( - tag: Tag, - options: { - readonly failure: Schema.Schema - readonly success: Schema.Schema - readonly payload: Payload - } - ): StreamRequestConstructor< - Tag, - Self, - Schema.Schema.Context, - Types.Simplify>, - Types.Simplify>, - RE | RA, - IE, - E, - IA, - A - > => { - return class extends (Schema.TaggedRequest<{}>()(tag, options) as any) { - constructor(props: any, disableValidation?: boolean) { - super(props, disableValidation) - ;(this as any)[Internal.StreamRequestTypeId] = Internal.StreamRequestTypeId - } - } as any - } +export type Exit = Exit_, ErrorExit> /** * @since 1.0.0 - * @category constructors + * @category models */ -export const stream = ( - schema: Schema.Schema, - handler: ( - request: Req - ) => Stream.Stream< - Req extends Schema.WithResult ? A : never, - Req extends Schema.WithResult ? E : never, - R - > -): Rpc => ({ +export type ExitEncoded = Schema.ExitEncoded, ErrorExitEncoded, Defect> + +/** + * @since 1.0.0 + * @category models + */ +export type PayloadConstructor = R extends Rpc< + infer _Tag, + infer _Payload, + infer _Success, + infer _Error, + infer _Middleware +> ? + Schema.Struct.Constructor<_Payload["fields"]> extends infer T ? + [keyof T] extends [never] ? void | {} : Schema.Simplify + : never + : never + +/** + * @since 1.0.0 + * @category models + */ +export type Payload = R extends Rpc< + infer _Tag, + infer _Payload, + infer _Success, + infer _Error, + infer _Middleware +> ? _Payload["Type"] + : never + +/** + * @since 1.0.0 + * @category models + */ +export type Context = R extends Rpc< + infer _Tag, + infer _Payload, + infer _Success, + infer _Error, + infer _Middleware +> ? _Payload["Context"] | _Success["Context"] | _Error["Context"] + : never + +/** + * @since 1.0.0 + * @category models + */ +export type Middleware = R extends Rpc< + infer _Tag, + infer _Payload, + infer _Success, + infer _Error, + infer _Middleware +> ? Context_.Tag.Identifier<_Middleware> + : never + +/** + * @since 1.0.0 + * @category models + */ +export type MiddlewareClient = R extends Rpc< + infer _Tag, + infer _Payload, + infer _Success, + infer _Error, + infer _Middleware +> ? + _Middleware extends { readonly requiredForClient: true } + ? RpcMiddleware.ForClient> + : never + : never + +/** + * @since 1.0.0 + * @category models + */ +export type AddError = R extends Rpc< + infer _Tag, + infer _Payload, + infer _Success, + infer _Error, + infer _Middleware +> ? Rpc< + _Tag, + _Payload, + _Success, + _Error | Error, + _Middleware + > : + never + +/** + * @since 1.0.0 + * @category models + */ +export type AddMiddleware = R extends Rpc< + infer _Tag, + infer _Payload, + infer _Success, + infer _Error, + infer _Middleware +> ? Rpc< + _Tag, + _Payload, + _Success, + _Error, + _Middleware | Middleware + > : + never + +/** + * @since 1.0.0 + * @category models + */ +export type ToHandler = R extends Rpc< + infer _Tag, + infer _Payload, + infer _Success, + infer _Error, + infer _Middleware +> ? Handler<_Tag> : + never + +/** + * @since 1.0.0 + * @category models + */ +export type IsStream = R extends + Rpc, infer _Error, infer _Middleware> ? true : never + +/** + * @since 1.0.0 + * @category models + */ +export type ExtractTag = R extends + Rpc ? R : never + +/** + * @since 1.0.0 + * @category models + */ +export type ExtractProvides = R extends + Rpc ? _Middleware extends { + readonly provides: Context_.Tag + } ? _I : + never : + never + +/** + * @since 1.0.0 + * @category models + */ +export type ExcludeProvides = Exclude< + Env, + ExtractProvides +> + +/** + * @since 1.0.0 + * @category models + */ +export interface From extends Rpc {} + +const Proto = { [TypeId]: TypeId, - _tag: "Stream", - schema: schema as any, - handler, pipe() { return pipeArguments(this, arguments) + }, + setSuccess( + this: AnyWithProps, + successSchema: Schema.Schema.Any + ) { + return makeProto({ + ...this, + successSchema + }) + }, + setError(this: AnyWithProps, errorSchema: Schema.Schema.All) { + return makeProto({ + ...this, + errorSchema + }) + }, + setPayload(this: AnyWithProps, payloadSchema: Schema.Struct | Schema.Struct.Fields) { + return makeProto({ + ...this, + payloadSchema: Schema.isSchema(payloadSchema) ? payloadSchema as any : Schema.Struct(payloadSchema as any) + }) + }, + middleware(this: AnyWithProps, middleware: RpcMiddleware.TagClassAny) { + return makeProto({ + ...this, + middlewares: new Set([...this.middlewares, middleware]) + }) + }, + annotate(this: AnyWithProps, tag: Context_.Tag, value: any) { + return makeProto({ + ...this, + annotations: Context_.add(this.annotations, tag, value) + }) + }, + annotateContext(this: AnyWithProps, context: Context_.Context) { + return makeProto({ + ...this, + annotations: Context_.merge(this.annotations, context) + }) } -}) +} + +const makeProto = < + const Tag extends string, + Payload extends AnyStructSchema, + Success extends Schema.Schema.Any, + Error extends Schema.Schema.All, + Middleware extends RpcMiddleware.TagClassAny +>(options: { + readonly _tag: Tag + readonly payloadSchema: Payload + readonly successSchema: Success + readonly errorSchema: Error + readonly annotations: Context_.Context + readonly middlewares: ReadonlySet +}): Rpc => { + const self = Object.assign(Object.create(Proto), options) + self.key = `@effect/rpc/Rpc/${options._tag}` + return self +} + +const constEmptyStruct = Schema.Struct({}) /** * @since 1.0.0 - * @category models + * @category constructors */ -export interface Request extends - EffectRequest.Request< - EffectRequest.Request.Success, - EffectRequest.Request.Error - >, - PrimaryKey.PrimaryKey, - Schema.WithResult< - Schema.WithResult.Context, - Schema.Schema.Encoded, - Schema.Schema.Type, - Schema.Schema.Encoded, - Schema.Schema.Type - > -{ - readonly request: A - readonly traceId: string - readonly spanId: string - readonly sampled: boolean - readonly headers: Headers.Headers +export const make = < + const Tag extends string, + Payload extends AnyStructSchema | Schema.Struct.Fields = Schema.Struct<{}>, + Success extends Schema.Schema.Any = typeof Schema.Void, + Error extends Schema.Schema.All = typeof Schema.Never, + const Stream extends boolean = false +>(tag: Tag, options?: { + readonly payload?: Payload + readonly success?: Success + readonly error?: Error + readonly stream?: Stream +}): Rpc< + Tag, + Payload extends Schema.Struct.Fields ? Schema.Struct : Payload, + Stream extends true ? RpcSchema.Stream : Success, + Stream extends true ? typeof Schema.Never : Error +> => { + const successSchema = options?.success ?? Schema.Void + const errorSchema = options?.error ?? Schema.Never + return makeProto({ + _tag: tag, + payloadSchema: Schema.isSchema(options?.payload) + ? options?.payload as any + : options?.payload + ? Schema.Struct(options?.payload as any) + : constEmptyStruct, + successSchema: options?.stream ? + RpcSchema.Stream({ + success: successSchema, + failure: errorSchema + }) : + successSchema, + errorSchema: options?.stream ? Schema.Never : errorSchema, + annotations: Context_.empty(), + middlewares: new Set() + }) as any } /** * @since 1.0.0 - * @category models + * @category constructors + */ +export interface AnyStructSchema extends Pipeable { + readonly [Schema.TypeId]: any + readonly make: any + readonly Type: any + readonly Encoded: any + readonly Context: any + readonly ast: AST.AST + readonly fields: Schema.Struct.Fields + readonly annotations: any +} + +/** + * @since 1.0.0 + * @category constructors */ -export interface RequestFrom { - readonly request: A - readonly traceId: string - readonly spanId: string - readonly sampled: boolean - readonly headers: Record +export interface AnyTaggedRequestSchema extends AnyStructSchema { + readonly _tag: string + readonly success: Schema.Schema.Any + readonly failure: Schema.Schema.All } /** * @since 1.0.0 - * @category schemas + * @category constructors */ -export const RequestSchema = ( - schema: Schema.Schema -): Schema.Schema, RequestFrom, R> => - Schema.Struct({ - request: schema, - traceId: Schema.String, - spanId: Schema.String, - sampled: Schema.Boolean, - headers: Schema.Record({ key: Schema.String, value: Schema.String }) +export const fromTaggedRequest = ( + schema: S +): From => + makeProto({ + _tag: schema._tag, + payloadSchema: schema as any, + successSchema: schema.success as any, + errorSchema: schema.failure, + annotations: Context_.empty(), + middlewares: new Set() }) +const exitSchemaCache = globalValue("@effect/rpc/Rpc/exitSchemaCache", () => new WeakMap()) + /** * @since 1.0.0 - * @category headers + * @category constructors */ -export const currentHeaders: FiberRef.FiberRef = globalValue( - "@effect/rpc/Rpc/currentHeaders", - () => FiberRef.unsafeMake(Headers.empty) -) +export const exitSchema = ( + self: R +): Schema.Schema, ExitEncoded, Context> => { + if (exitSchemaCache.has(self)) { + return exitSchemaCache.get(self) as any + } + const rpc = self as any as AnyWithProps + const streamSchemas = RpcSchema.getStreamSchemas(rpc.successSchema.ast) + const schema = Schema.Exit({ + success: Option.isSome(streamSchemas) ? Schema.Void : rpc.successSchema, + failure: Option.isSome(streamSchemas) ? + Schema.Union( + streamSchemas.value.failure, + rpc.errorSchema + ) : + rpc.errorSchema, + defect: Schema.Defect + }) + exitSchemaCache.set(self, schema) + return schema as any +} /** * @since 1.0.0 - * @category headers + * @category Fork */ -export const annotateHeaders: { - (headers: Headers.Input): (self: Effect.Effect) => Effect.Effect - (self: Effect.Effect, headers: Headers.Input): Effect.Effect -} = dual(2, (self, headers) => { - const resolved = Headers.fromInput(headers) - return Effect.locallyWith(self, currentHeaders, (prev) => ({ ...prev, ...resolved })) -}) +export const ForkTypeId: unique symbol = Symbol.for("@effect/rpc/Rpc/Fork") /** * @since 1.0.0 - * @category headers + * @category Fork */ -export const schemaHeaders = , A>( - schema: Schema.Schema -): Effect.Effect => { - const decode = Schema.decodeUnknown(schema) - return Effect.flatMap(FiberRef.get(currentHeaders), decode) -} +export type ForkTypeId = typeof ForkTypeId /** * @since 1.0.0 - * @category requests + * @category Fork */ -export const request = ( - request: A, - options?: { - readonly spanPrefix?: string - } -): Effect.Effect, never, Scope> => - pipe( - Effect.makeSpanScoped(`${options?.spanPrefix ?? "Rpc.request "}${request._tag}`, { - kind: "client", - captureStackTrace: false - }), - Effect.zip(FiberRef.get(currentHeaders)), - Effect.map(([span, headers]) => - Internal.makeRequest({ - request, - traceId: span.traceId, - spanId: span.spanId, - sampled: span.sampled, - headers - }) - ) - ) - -/** - * @since 1.0.0 - * @category requests - */ -export const call = < - A extends Schema.TaggedRequest.All, - R extends - | RequestResolver.RequestResolver> - | Effect.Effect>, never, any> ->( - req: A, - resolver: R, - options?: { - readonly spanPrefix?: string - } -): R extends Effect.Effect ? Rpc.Result : Rpc.Result => { - const isStream = Internal.StreamRequestTypeId in req - const res = pipe( - request(req, options), - Effect.flatMap((_) => Effect.request(_, resolver)) - ) - return isStream ? Stream.unwrapScoped(res as any) : Effect.scoped(res) as any +export interface Fork { + readonly [ForkTypeId]: ForkTypeId + readonly value: A } /** + * You can use `fork` to wrap a response Effect or Stream, to ensure that the + * response is executed concurrently regardless of the RpcServer concurrency + * setting. + * * @since 1.0.0 - * @category context - */ -export const provideServiceEffect: { - ( - tag: Context.Tag, - effect: Effect.Effect - ): (self: Rpc) => Rpc | R2> - ( - self: Rpc, - tag: Context.Tag, - effect: Effect.Effect - ): Rpc | R2> -} = dual(3, ( - self: Rpc, - tag: Context.Tag, - make: Effect.Effect -): Rpc | R2> => - self._tag === "Effect" - ? effect(self.schema, (req) => Effect.provideServiceEffect(self.handler(req), tag, Effect.orDie(make))) as any - : stream( - self.schema as any, - (req) => Stream.provideServiceEffect(self.handler(req as any), tag, Effect.orDie(make)) - )) - -/** - * @since 1.0.0 - * @category context - */ -export const provideService: { - ( - tag: Context.Tag, - service: S - ): (self: Rpc) => Rpc> - ( - self: Rpc, - tag: Context.Tag, - service: S - ): Rpc> -} = dual(3, ( - self: Rpc, - tag: Context.Tag, - service: S -): Rpc> => - self._tag === "Effect" - ? effect(self.schema, (req) => Effect.provideService(self.handler(req), tag, service)) as any - : stream( - self.schema as any, - (req) => Stream.provideService(self.handler(req as any), tag, service) - )) + * @category Fork + */ +export const fork = (value: A): Fork => ({ [ForkTypeId]: ForkTypeId, value }) + +/** + * @since 1.0.0 + * @category Fork + */ +export const isFork = (u: object): u is Fork => ForkTypeId in u diff --git a/packages/rpc/src/RpcClient.ts b/packages/rpc/src/RpcClient.ts new file mode 100644 index 00000000000..142fac1b984 --- /dev/null +++ b/packages/rpc/src/RpcClient.ts @@ -0,0 +1,1012 @@ +/** + * @since 1.0.0 + */ +import * as Headers from "@effect/platform/Headers" +import * as HttpBody from "@effect/platform/HttpBody" +import * as HttpClient from "@effect/platform/HttpClient" +import * as HttpClientRequest from "@effect/platform/HttpClientRequest" +import * as Socket from "@effect/platform/Socket" +import * as Transferable from "@effect/platform/Transferable" +import * as Worker from "@effect/platform/Worker" +import type { WorkerError } from "@effect/platform/WorkerError" +import type { NonEmptyReadonlyArray } from "effect/Array" +import * as Cause from "effect/Cause" +import * as Chunk from "effect/Chunk" +import * as Context from "effect/Context" +import type * as Duration from "effect/Duration" +import * as Effect from "effect/Effect" +import * as Exit from "effect/Exit" +import * as Fiber from "effect/Fiber" +import * as FiberId from "effect/FiberId" +import * as FiberRef from "effect/FiberRef" +import { constVoid, dual, identity } from "effect/Function" +import { globalValue } from "effect/GlobalValue" +import * as Layer from "effect/Layer" +import * as Mailbox from "effect/Mailbox" +import * as Option from "effect/Option" +import type { ParseError } from "effect/ParseResult" +import * as Pool from "effect/Pool" +import * as Runtime from "effect/Runtime" +import * as Schedule from "effect/Schedule" +import * as Schema from "effect/Schema" +import * as Scope from "effect/Scope" +import * as Stream from "effect/Stream" +import type { Span } from "effect/Tracer" +import type { Mutable } from "effect/Types" +import { withRun } from "./internal/utils.js" +import * as Rpc from "./Rpc.js" +import type * as RpcGroup from "./RpcGroup.js" +import type { FromClient, FromClientEncoded, FromServer, FromServerEncoded, Request, RequestId } from "./RpcMessage.js" +import { constPing } from "./RpcMessage.js" +import type * as RpcMiddleware from "./RpcMiddleware.js" +import * as RpcSchema from "./RpcSchema.js" +import * as RpcSerialization from "./RpcSerialization.js" +import * as RpcWorker from "./RpcWorker.js" + +/** + * @since 1.0.0 + * @category client + */ +export type RpcClient = { + readonly [Current in Rpcs as Current["_tag"]]: ( + input: Rpc.PayloadConstructor, + options?: Rpc.Success extends Stream.Stream ? { + readonly asMailbox?: AsMailbox | undefined + readonly streamBufferSize?: number | undefined + readonly headers?: Headers.Input | undefined + readonly context?: Context.Context | undefined + } : + { + readonly headers?: Headers.Input | undefined + readonly context?: Context.Context | undefined + readonly discard?: Discard | undefined + } + ) => Rpc.Success extends Stream.Stream + ? AsMailbox extends true ? Effect.Effect< + Mailbox.ReadonlyMailbox<_A, _E | Rpc.Error | E>, + never, + Scope.Scope | Rpc.Context + > + : Stream.Stream<_A, _E | Rpc.Error | E, Rpc.Context> + : Effect.Effect< + Discard extends true ? void : Rpc.Success, + Discard extends true ? never : Rpc.Error | E, + Rpc.Context + > +} + +/** + * @since 1.0.0 + * @category client + */ +export type FromGroup = RpcClient> + +let requestIdCounter = BigInt(0) + +/** + * @since 1.0.0 + * @category client + */ +export const makeNoSerialization: ( + group: RpcGroup.RpcGroup, + options: { + readonly onFromClient: ( + options: { + readonly message: FromClient + readonly context: Context.Context + readonly discard: boolean + } + ) => Effect.Effect + readonly supportsAck?: boolean | undefined + readonly spanPrefix?: string | undefined + readonly generateRequestId?: (() => RequestId) | undefined + readonly disableTracing?: boolean | undefined + } +) => Effect.Effect< + { + readonly client: RpcClient + readonly write: (message: FromServer) => Effect.Effect + }, + never, + Scope.Scope | Rpc.MiddlewareClient +> = Effect.fnUntraced(function*( + group: RpcGroup.RpcGroup, + options: { + readonly onFromClient: ( + options: { + readonly message: FromClient + readonly context: Context.Context + readonly discard: boolean + } + ) => Effect.Effect + readonly supportsAck?: boolean | undefined + readonly spanPrefix?: string | undefined + readonly generateRequestId?: (() => RequestId) | undefined + readonly disableTracing?: boolean | undefined + } +) { + const spanPrefix = options?.spanPrefix ?? "RpcClient" + const supportsAck = options?.supportsAck ?? true + const disableTracing = options?.disableTracing ?? false + const generateRequestId = options?.generateRequestId ?? (() => requestIdCounter++ as RequestId) + + const context = yield* Effect.context | Scope.Scope>() + const scope = Context.get(context, Scope.Scope) + + type ClientEntry = { + readonly _tag: "Effect" + readonly rpc: Rpc.AnyWithProps + readonly context: Context.Context + resume: (_: Exit.Exit) => void + } | { + readonly _tag: "Mailbox" + readonly rpc: Rpc.AnyWithProps + readonly mailbox: Mailbox.Mailbox + readonly scope: Scope.Scope + readonly context: Context.Context + } + const entries = new Map() + + let isShutdown = false + yield* Scope.addFinalizer( + scope, + Effect.fiberIdWith((fiberId) => { + isShutdown = true + return clearEntries(Exit.interrupt(fiberId)) + }) + ) + + const clearEntries = Effect.fnUntraced(function*(exit: Exit.Exit) { + for (const [id, entry] of entries) { + entries.delete(id) + if (entry._tag === "Mailbox") { + yield* entry.mailbox.done(exit) + } else { + entry.resume(exit) + } + } + }) + + const onRequest = (rpc: Rpc.AnyWithProps) => { + const isStream = RpcSchema.isStreamSchema(rpc.successSchema) + const middleware = getRpcClientMiddleware(rpc) + return (payload: any, options?: { + readonly asMailbox?: boolean | undefined + readonly streamBufferSize?: number | undefined + readonly headers?: Headers.Input | undefined + readonly context?: Context.Context | undefined + readonly discard?: boolean | undefined + }) => { + const headers = options?.headers ? Headers.fromInput(options.headers) : Headers.empty + if (!isStream) { + const effect = Effect.useSpan( + `${spanPrefix}.${rpc._tag}`, + { captureStackTrace: false }, + (span) => + onEffectRequest( + rpc, + middleware, + span, + payload ? rpc.payloadSchema.make(payload) : {}, + headers, + options?.context ?? Context.empty(), + options?.discard ?? false + ) + ) + return disableTracing ? Effect.withTracerEnabled(effect, false) : effect + } + const mailbox = Effect.suspend(() => + onStreamRequest( + rpc, + middleware, + payload ? rpc.payloadSchema.make(payload) : {}, + headers, + options?.streamBufferSize ?? 16, + options?.context ?? Context.empty() + ) + ) + if (options?.asMailbox) return mailbox + return Stream.unwrapScoped(Effect.map(mailbox, Mailbox.toStream)) + } + } + + const onEffectRequest = ( + rpc: Rpc.AnyWithProps, + middleware: (request: Request) => Effect.Effect>, + span: Span, + payload: any, + headers: Headers.Headers, + context: Context.Context, + discard: boolean + ) => + Effect.withFiberRuntime((parentFiber) => { + if (isShutdown) { + return Effect.interrupt + } + const id = generateRequestId() + const send = middleware({ + _tag: "Request", + id, + tag: rpc._tag as Rpc.Tag, + payload, + traceId: span.traceId, + spanId: span.spanId, + sampled: span.sampled, + headers: Headers.merge(parentFiber.getFiberRef(currentHeaders), headers) + }) + if (discard) { + return Effect.flatMap(send, (message) => + options.onFromClient({ + message, + context, + discard + })) + } + const runtime = Runtime.make({ + context: parentFiber.currentContext, + fiberRefs: parentFiber.getFiberRefs(), + runtimeFlags: Runtime.defaultRuntime.runtimeFlags + }) + let fiber: Fiber.RuntimeFiber + return Effect.onInterrupt( + Effect.async((resume) => { + const entry: ClientEntry = { + _tag: "Effect", + rpc, + context, + resume(exit) { + resume(exit) + if (!fiber.unsafePoll()) { + parentFiber.currentScheduler.scheduleTask(() => { + fiber.unsafeInterruptAsFork(parentFiber.id()) + }, 0) + } + } + } + entries.set(id, entry) + fiber = send.pipe( + Effect.flatMap((request) => + options.onFromClient({ + message: request, + context, + discard + }) + ), + Effect.withParentSpan(span), + Runtime.runFork(runtime) + ) + fiber.addObserver((exit) => { + if (exit._tag === "Failure") { + return resume(exit) + } + }) + }), + (interruptors) => { + entries.delete(id) + const ids = Array.from(interruptors).flatMap((id) => Array.from(FiberId.toSet(id))) + return Effect.zipRight( + Fiber.interrupt(fiber), + sendInterrupt(id, ids, context) + ) + } + ) + }) + + const onStreamRequest = Effect.fnUntraced(function*( + rpc: Rpc.AnyWithProps, + middleware: (request: Request) => Effect.Effect>, + payload: any, + headers: Headers.Headers, + streamBufferSize: number, + context: Context.Context + ) { + if (isShutdown) { + return yield* Effect.interrupt + } + + const span = yield* Effect.makeSpanScoped(`${spanPrefix}.${rpc._tag}`, { captureStackTrace: false }).pipe( + disableTracing ? Effect.withTracerEnabled(false) : identity + ) + const fiber = Option.getOrThrow(Fiber.getCurrentFiber()) + const id = generateRequestId() + + const scope = Context.unsafeGet(fiber.currentContext, Scope.Scope) + yield* Scope.addFinalizerExit( + scope, + (exit) => { + if (!entries.has(id)) return Effect.void + entries.delete(id) + return sendInterrupt( + id, + Exit.isFailure(exit) + ? Array.from(Cause.interruptors(exit.cause)).flatMap((id) => Array.from(FiberId.toSet(id))) + : [], + context + ) + } + ) + + const mailbox = yield* Mailbox.make(streamBufferSize) + entries.set(id, { + _tag: "Mailbox", + rpc, + mailbox, + scope, + context + }) + + yield* middleware({ + _tag: "Request", + id, + tag: rpc._tag as Rpc.Tag, + traceId: span.traceId, + payload, + spanId: span.spanId, + sampled: span.sampled, + headers: Headers.merge(fiber.getFiberRef(currentHeaders), headers) + }).pipe( + Effect.flatMap( + (request) => + options.onFromClient({ + message: request, + context, + discard: false + }) + ), + Effect.withParentSpan(span), + Effect.catchAllCause((error) => mailbox.failCause(error)), + Effect.interruptible, + Effect.forkIn(scope) + ) + + return mailbox + }) + + const getRpcClientMiddleware = (rpc: Rpc.AnyWithProps): (request: Request) => Effect.Effect> => { + const middlewares: Array = [] + for (const tag of rpc.middlewares.values()) { + const middleware = context.unsafeMap.get(`${tag.key}/Client`) + if (!middleware) continue + middlewares.push(middleware) + } + return middlewares.length === 0 + ? Effect.succeed + : function(request) { + let i = 0 + return Effect.map( + Effect.whileLoop({ + while: () => i < middlewares.length, + body: () => + middlewares[i]({ + rpc, + request + }) as Effect.Effect>, + step(nextRequest) { + request = nextRequest + i++ + } + }), + () => request + ) + } + } + + const sendInterrupt = ( + requestId: RequestId, + interruptors: ReadonlyArray, + context: Context.Context + ): Effect.Effect => + Effect.async((resume) => { + const parentFiber = Option.getOrThrow(Fiber.getCurrentFiber()) + const runtime = Runtime.make({ + context: parentFiber.currentContext, + fiberRefs: parentFiber.getFiberRefs(), + runtimeFlags: Runtime.defaultRuntime.runtimeFlags + }) + const fiber = options.onFromClient({ + message: { _tag: "Interrupt", requestId, interruptors }, + context, + discard: false + }).pipe( + Effect.timeout(1000), + Runtime.runFork(runtime) + ) + fiber.addObserver(() => { + resume(Effect.void) + }) + }) + + const write = (message: FromServer): Effect.Effect => { + switch (message._tag) { + case "Chunk": { + const requestId = parseRequestId(message.requestId) + const entry = entries.get(requestId) + if (!entry || entry._tag !== "Mailbox") return Effect.void + return entry.mailbox.offerAll(message.values).pipe( + supportsAck + ? Effect.zipRight( + options.onFromClient({ + message: { _tag: "Ack", requestId: message.requestId }, + context: entry.context, + discard: false + }) + ) + : identity, + Effect.onError((cause) => entry.mailbox.done(Exit.failCause(cause))), + Effect.forkIn(entry.scope) + ) + } + case "Exit": { + const requestId = parseRequestId(message.requestId) + const entry = entries.get(requestId) + if (!entry) return Effect.void + entries.delete(requestId) + if (entry._tag === "Effect") { + entry.resume(message.exit) + return Effect.void + } + return entry.mailbox.done(Exit.asVoid(message.exit)) + } + case "Defect": { + return clearEntries(Exit.die(message.defect)) + } + case "ClientEnd": { + return Effect.void + } + } + } + + const client = {} as Mutable> + for (const rpc of group.requests.values()) { + ;(client as any)[rpc._tag] = onRequest(rpc as any) + } + + return { + client: client as RpcClient, + write + } as const +}) + +/** + * @since 1.0.0 + * @category client + */ +export const make: ( + group: RpcGroup.RpcGroup, + options?: { + readonly spanPrefix?: string | undefined + readonly generateRequestId?: (() => RequestId) | undefined + readonly disableTracing?: boolean | undefined + } | undefined +) => Effect.Effect< + RpcClient, + never, + Protocol | Rpc.MiddlewareClient | Scope.Scope +> = Effect.fnUntraced(function*( + group: RpcGroup.RpcGroup, + options?: { + readonly spanPrefix?: string | undefined + readonly generateRequestId?: (() => RequestId) | undefined + readonly disableTracing?: boolean | undefined + } | undefined +) { + const { run, send, supportsAck, supportsTransferables } = yield* Protocol + + type ClientEntry = { + readonly rpc: Rpc.AnyWithProps + readonly context: Context.Context + readonly decodeChunk: + | ((chunk: ReadonlyArray) => Effect.Effect, ParseError, unknown>) + | undefined + } + const entries = new Map() + + const { client, write } = yield* makeNoSerialization(group, { + ...options, + supportsAck, + onFromClient({ message }) { + switch (message._tag) { + case "Request": { + const rpc = group.requests.get(message.tag)! as any as Rpc.AnyWithProps + const schemas = RpcSchema.getStreamSchemas(rpc.successSchema.ast) + const collector = supportsTransferables ? Transferable.unsafeMakeCollector() : undefined + + const fiber = Option.getOrThrow(Fiber.getCurrentFiber()) + + const entry: ClientEntry = { + rpc, + context: collector + ? Context.add(fiber.currentContext, Transferable.Collector, collector) + : fiber.currentContext, + decodeChunk: Option.isSome(schemas) + ? Schema.decodeUnknown(Schema.NonEmptyArray(schemas.value.success)) + : undefined + } + entries.set(message.id, entry) + + return Schema.encode(rpc.payloadSchema)(message.payload).pipe( + Effect.locally(FiberRef.currentContext, entry.context), + Effect.orDie, + Effect.flatMap((payload) => + send({ + ...message, + payload, + headers: Object.entries(message.headers) + }, collector && collector.unsafeClear()) + ) + ) as Effect.Effect + } + case "Ack": { + const entry = entries.get(message.requestId) + if (!entry) return Effect.void + return send(message) as Effect.Effect + } + case "Interrupt": { + const entry = entries.get(message.requestId) + if (!entry) return Effect.void + entries.delete(message.requestId) + return send({ + _tag: "Interrupt", + requestId: message.requestId + }) as Effect.Effect + } + case "Eof": { + return Effect.void + } + } + } + }) + + yield* run((message) => { + switch (message._tag) { + case "Chunk": { + const requestId = parseRequestId(message.requestId) + const entry = entries.get(requestId) + if (!entry || !entry.decodeChunk) return Effect.void + return entry.decodeChunk(message.values).pipe( + Effect.locally(FiberRef.currentContext, entry.context), + Effect.orDie, + Effect.flatMap((chunk) => + write({ _tag: "Chunk", clientId: 0, requestId: parseRequestId(message.requestId), values: chunk }) + ), + Effect.onError((cause) => + write({ + _tag: "Exit", + clientId: 0, + requestId: parseRequestId(message.requestId), + exit: Exit.failCause(cause) + }) + ) + ) as Effect.Effect + } + case "Exit": { + const requestId = parseRequestId(message.requestId) + const entry = entries.get(requestId) + if (!entry) return Effect.void + entries.delete(requestId) + return Schema.decode(Rpc.exitSchema(entry.rpc as any))(message.exit).pipe( + Effect.locally(FiberRef.currentContext, entry.context), + Effect.orDie, + Effect.matchCauseEffect({ + onSuccess: (exit) => write({ _tag: "Exit", clientId: 0, requestId, exit }), + onFailure: (cause) => write({ _tag: "Exit", clientId: 0, requestId, exit: Exit.failCause(cause) }) + }) + ) as Effect.Effect + } + case "Defect": { + return write({ _tag: "Defect", clientId: 0, defect: decodeDefect(message.defect) }) + } + default: { + return Effect.void + } + } + }).pipe( + Effect.catchAllCause(Effect.logError), + Effect.interruptible, + Effect.forkScoped + ) + + return client +}) + +const parseRequestId = (input: string | bigint): RequestId => typeof input === "string" ? BigInt(input) : input as any + +/** + * @since 1.0.0 + * @category headers + */ +export const currentHeaders: FiberRef.FiberRef = globalValue( + "@effect/rpc/RpcClient/currentHeaders", + () => FiberRef.unsafeMake(Headers.empty) +) + +/** + * @since 1.0.0 + * @category headers + */ +export const withHeaders: { + (headers: Headers.Input): (effect: Effect.Effect) => Effect.Effect + (effect: Effect.Effect, headers: Headers.Input): Effect.Effect +} = dual( + 2, + (effect: Effect.Effect, headers: Headers.Input): Effect.Effect => + Effect.locallyWith(effect, currentHeaders, Headers.merge(Headers.fromInput(headers))) +) + +/** + * @since 1.0.0 + * @category headers + */ +export const withHeadersEffect: { + ( + headers: Effect.Effect + ): (effect: Effect.Effect) => Effect.Effect + ( + effect: Effect.Effect, + headers: Effect.Effect + ): Effect.Effect +} = dual( + 2, + ( + effect: Effect.Effect, + headers: Effect.Effect + ): Effect.Effect => Effect.flatMap(headers, (headers) => withHeaders(effect, headers)) +) + +/** + * @since 1.0.0 + * @category protocol + */ +export class Protocol extends Context.Tag("@effect/rpc/RpcClient/Protocol") Effect.Effect + ) => Effect.Effect + readonly send: ( + request: FromClientEncoded, + transferables?: ReadonlyArray + ) => Effect.Effect + readonly supportsAck: boolean + readonly supportsTransferables: boolean +}>() { + /** + * @since 1.0.0 + */ + static make = withRun() +} + +/** + * @since 1.0.0 + * @category protocol + */ +export const makeProtocolHttp = (client: HttpClient.HttpClient): Effect.Effect< + Protocol["Type"], + never, + RpcSerialization.RpcSerialization +> => + Protocol.make(Effect.fnUntraced(function*(writeResponse) { + const serialization = yield* RpcSerialization.RpcSerialization + const isJson = serialization.contentType === "application/json" + + const send = (request: FromClientEncoded): Effect.Effect => { + if (request._tag !== "Request") { + return Effect.void + } + + const parser = serialization.unsafeMake() + if (!serialization.supportsBigInt) transformBigInt(request) + + const encoded = parser.encode(request) + const body = typeof encoded === "string" ? + HttpBody.text(encoded, serialization.contentType) : + HttpBody.uint8Array(encoded, serialization.contentType) + + if (isJson) { + return client.post("/", { body }).pipe( + Effect.flatMap((r) => r.json), + Effect.scoped, + Effect.flatMap((u) => { + if (!Array.isArray(u)) { + return Effect.dieMessage(`Expected an array of responses, but got: ${u}`) + } + let i = 0 + return Effect.whileLoop({ + while: () => i < u.length, + body: () => writeResponse(u[i++]), + step: constVoid + }) + }), + Effect.orDie + ) + } + + return client.post("/", { body }).pipe( + Effect.flatMap((r) => + Stream.runForEachChunk(r.stream, (chunk) => { + const responses = Chunk.toReadonlyArray(chunk).flatMap(parser.decode) as Array + if (responses.length === 0) return Effect.void + let i = 0 + return Effect.whileLoop({ + while: () => i < responses.length, + body: () => writeResponse(responses[i++]), + step: constVoid + }) + }) + ), + Effect.orDie + ) + } + + return { + send, + supportsAck: false, + supportsTransferables: false + } + })) + +/** + * @since 1.0.0 + * @category protocol + */ +export const layerProtocolHttp = (options: { + readonly url: string + readonly transformClient?: (client: HttpClient.HttpClient.With) => HttpClient.HttpClient.With +}): Layer.Layer => + Layer.scoped( + Protocol, + Effect.flatMap( + HttpClient.HttpClient, + (client) => { + client = HttpClient.mapRequest(client, HttpClientRequest.prependUrl(options.url)) + return makeProtocolHttp(options.transformClient ? options.transformClient(client) : client) + } + ) + ) + +/** + * @since 1.0.0 + * @category protocol + */ +export const makeProtocolSocket: Effect.Effect< + Protocol["Type"], + never, + Scope.Scope | RpcSerialization.RpcSerialization | Socket.Socket +> = Protocol.make(Effect.fnUntraced(function*(writeResponse) { + const socket = yield* Socket.Socket + const serialization = yield* RpcSerialization.RpcSerialization + + const write = yield* socket.writer + + let parser = serialization.unsafeMake() + + yield* Effect.suspend(() => { + parser = serialization.unsafeMake() + return socket.runRaw((message) => { + try { + const responses = parser.decode(message) as Array + if (responses.length === 0) return + let i = 0 + return Effect.whileLoop({ + while: () => i < responses.length, + body: () => writeResponse(responses[i++]), + step: constVoid + }) + } catch (defect) { + return writeResponse({ _tag: "Defect", defect }) + } + }) + }).pipe( + Effect.zipRight(Effect.fail( + new Socket.SocketCloseError({ + reason: "Close", + code: 1000 + }) + )), + Effect.tapErrorCause((cause) => writeResponse({ _tag: "Defect", defect: Cause.squash(cause) })), + Effect.retry(Schedule.spaced(1000)), + Effect.annotateLogs({ + module: "RpcClient", + method: "makeProtocolSocket" + }), + Effect.interruptible, + Effect.forkScoped + ) + + yield* Effect.suspend(() => write(parser.encode(constPing))).pipe( + Effect.delay("30 seconds"), + Effect.ignore, + Effect.forever, + Effect.interruptible, + Effect.forkScoped + ) + + return { + send(request) { + if (!serialization.supportsBigInt) transformBigInt(request) + return Effect.orDie(write(parser.encode(request))) + }, + supportsAck: true, + supportsTransferables: false + } +})) + +/** + * @since 1.0.0 + * @category protocol + */ +export const makeProtocolWorker = ( + options: { + readonly size: number + readonly concurrency?: number | undefined + readonly targetUtilization?: number | undefined + } | { + readonly minSize: number + readonly maxSize: number + readonly concurrency?: number | undefined + readonly targetUtilization?: number | undefined + readonly timeToLive: Duration.DurationInput + } +): Effect.Effect< + Protocol["Type"], + WorkerError, + Scope.Scope | Worker.PlatformWorker | Worker.Spawner +> => + Protocol.make(Effect.fnUntraced(function*(writeResponse) { + const worker = yield* Worker.PlatformWorker + const scope = yield* Effect.scope + let workerId = 0 + const initialMessage = yield* Effect.serviceOption(RpcWorker.InitialMessage) + + const entries = new Map + readonly scope: Scope.CloseableScope + }>() + + yield* Scope.addFinalizerExit( + scope, + (exit) => + Effect.forEach(entries, ([_, entry]) => Scope.close(entry.scope, exit), { + discard: true, + concurrency: "unbounded" + }) + ) + + const acquire = Effect.gen(function*() { + const id = workerId++ + const backing = yield* worker.spawn(id) + const readyLatch = yield* Effect.makeLatch() + + yield* backing.run((message) => { + if (message[0] === 0) { + return readyLatch.open + } + const response = message[1] + if (response._tag === "Exit") { + const entry = entries.get(response.requestId) + if (entry) { + entries.delete(response.requestId) + return Effect.ensuring(writeResponse(response), Scope.close(entry.scope, Exit.void)) + } + } else if (response._tag === "Defect") { + return Effect.zipRight( + Effect.forEach(entries, ([requestId, entry]) => { + entries.delete(requestId) + return Scope.close(entry.scope, Exit.die(response.defect)) + }, { discard: true }), + writeResponse(response) + ) + } + return writeResponse(response) + }).pipe( + Effect.tapErrorCause((cause) => writeResponse({ _tag: "Defect", defect: Cause.squash(cause) })), + Effect.retry(Schedule.spaced(1000)), + Effect.annotateLogs({ + module: "RpcClient", + method: "makeProtocolWorker" + }), + Effect.interruptible, + Effect.forkScoped + ) + + yield* readyLatch.await + + if (Option.isSome(initialMessage)) { + const [value, transfers] = yield* initialMessage.value + yield* backing.send({ _tag: "InitialMessage", value }, transfers) + } + + return backing + }) + + const pool = "minSize" in options ? + yield* Pool.makeWithTTL({ + acquire, + min: options.minSize, + max: options.maxSize, + concurrency: options.concurrency, + targetUtilization: options.targetUtilization, + timeToLive: options.timeToLive + }) : + yield* Pool.make({ + acquire, + size: options.size, + concurrency: options.concurrency, + targetUtilization: options.targetUtilization + }) + + const send = (request: FromClientEncoded, transferables?: ReadonlyArray) => { + switch (request._tag) { + case "Request": { + return Scope.make().pipe( + Effect.flatMap((scope) => + Effect.flatMap(Scope.extend(pool.get, scope), (worker) => { + entries.set(request.id, { worker, scope }) + return Effect.orDie(worker.send(request, transferables)) + }) + ), + Effect.orDie + ) + } + case "Interrupt": { + const entry = entries.get(request.requestId) + if (!entry) return Effect.void + entries.delete(request.requestId) + return Effect.ensuring( + Effect.orDie(entry.worker.send(request)), + Scope.close(entry.scope, Exit.void) + ) + } + case "Ack": { + const entry = entries.get(request.requestId) + if (!entry) return Effect.void + return Effect.orDie(entry.worker.send(request)) + } + } + return Effect.void + } + + yield* Effect.scoped(pool.get) + + return { + send, + supportsAck: true, + supportsTransferables: true + } + })) + +/** + * @since 1.0.0 + * @category protocol + */ +export const layerProtocolWorker = ( + options: { + readonly size: number + readonly concurrency?: number | undefined + readonly targetUtilization?: number | undefined + } | { + readonly minSize: number + readonly maxSize: number + readonly concurrency?: number | undefined + readonly targetUtilization?: number | undefined + readonly timeToLive: Duration.DurationInput + } +): Layer.Layer => + Layer.scoped(Protocol, makeProtocolWorker(options)) + +/** + * @since 1.0.0 + * @category protocol + */ +export const layerProtocolSocket: Layer.Layer = + Layer.scoped(Protocol, makeProtocolSocket) + +// internal + +const decodeDefect = Schema.decodeSync(Schema.Defect) + +const transformBigInt = (request: FromClientEncoded) => { + if (request._tag === "Request") { + ;(request as any).id = request.id.toString() + } else if ("requestId" in request) { + ;(request as any).requestId = request.requestId.toString() + } +} diff --git a/packages/rpc/src/RpcGroup.ts b/packages/rpc/src/RpcGroup.ts new file mode 100644 index 00000000000..b15236c74e2 --- /dev/null +++ b/packages/rpc/src/RpcGroup.ts @@ -0,0 +1,284 @@ +/** + * @since 1.0.0 + */ +import type { Headers } from "@effect/platform/Headers" +import * as Context from "effect/Context" +import * as Effect from "effect/Effect" +import * as Layer from "effect/Layer" +import type { ReadonlyMailbox } from "effect/Mailbox" +import { type Pipeable } from "effect/Pipeable" +import type * as Record from "effect/Record" +import * as Schema from "effect/Schema" +import type { Scope } from "effect/Scope" +import type * as Stream from "effect/Stream" +import * as Rpc from "./Rpc.js" +import type * as RpcMiddleware from "./RpcMiddleware.js" + +/** + * @since 1.0.0 + * @category type ids + */ +export const TypeId: unique symbol = Symbol.for("@effect/rpc/RpcGroup") + +/** + * @since 1.0.0 + * @category type ids + */ +export type TypeId = typeof TypeId + +/** + * @since 1.0.0 + * @category groups + */ +export interface RpcGroup extends Pipeable { + new(_: never): {} + + readonly [TypeId]: TypeId + readonly requests: ReadonlyMap + readonly annotations: Context.Context + + /** + * Add one or more procedures to the group. + */ + add>( + ...rpcs: Rpcs2 + ): RpcGroup + + /** + * Merge this group with another group. + */ + merge( + that: RpcGroup + ): RpcGroup + + /** + * Add middleware to all the procedures added to the group until this point. + */ + middleware(middleware: M): RpcGroup> + + /** + * Implement the handlers for the procedures in this group, returning a + * context object. + */ + toHandlersContext< + Handlers extends HandlersFrom, + EX = never, + RX = never + >( + build: + | Handlers + | Effect.Effect + ): Effect.Effect< + Context.Context>, + EX, + | RX + | HandlersContext + > + + /** + * Implement the handlers for the procedures in this group. + */ + toLayer< + Handlers extends HandlersFrom, + EX = never, + RX = never + >( + build: + | Handlers + | Effect.Effect + ): Layer.Layer< + Rpc.ToHandler, + EX, + | Exclude + | HandlersContext + > + + /** + * Annotate the group with a value. + */ + annotate(tag: Context.Tag, value: S): RpcGroup + + /** + * Annotate the Rpc's above this point with a value. + */ + annotateRpcs(tag: Context.Tag, value: S): RpcGroup + + /** + * Annotate the group with a context object. + */ + annotateContext(context: Context.Context): RpcGroup + + /** + * Annotate the Rpc's above this point with a context object. + */ + annotateRpcsContext(context: Context.Context): RpcGroup +} + +/** + * @since 1.0.0 + * @category groups + */ +export type HandlersFrom = { + readonly [Current in Rpc as Current["_tag"]]: ( + payload: Rpc.Payload, + headers: Headers + ) => ResultFrom | Rpc.Fork> +} + +/** + * @since 1.0.0 + * @category groups + */ +export type ResultFrom = Rpc.Success extends Stream.Stream ? + | Stream.Stream< + _A, + _E | Rpc.Error, + any + > + | Effect.Effect>, _E | Rpc.Error, any> : + Effect.Effect< + Rpc.Success, + Rpc.Error, + any + > + +/** + * @since 1.0.0 + * @category groups + */ +export type HandlersContext = keyof Handlers extends infer K ? + K extends keyof Handlers & string ? [Rpc.IsStream] extends [true] ? Handlers[K] extends (...args: any) => + | Stream.Stream + | Rpc.Fork> + | Effect.Effect< + ReadonlyMailbox, + infer _EX, + infer _R + > + | Rpc.Fork< + Effect.Effect< + ReadonlyMailbox, + infer _EX, + infer _R + > + > ? Exclude, Scope> : + never : + Handlers[K] extends ( + ...args: any + ) => Effect.Effect | Rpc.Fork> ? + Rpc.ExcludeProvides<_R, Rpcs, K> + : never + : never + : never + +/** + * @since 1.0.0 + * @category groups + */ +export type Rpcs = Group extends RpcGroup ? R : never + +const RpcGroupProto = { + add(this: RpcGroup, ...rpcs: Array) { + return makeProto({ + requests: resolveInput( + ...this.requests.values(), + ...rpcs + ), + annotations: this.annotations + }) + }, + merge(this: RpcGroup, that: RpcGroup) { + const requests = new Map(this.requests) + for (const rpc of that.requests.values()) { + requests.set(rpc._tag, rpc) + } + return makeProto({ + requests, + annotations: Context.merge(this.annotations, that.annotations) + }) + }, + middleware(this: RpcGroup, middleware: RpcMiddleware.TagClassAny) { + const requests = new Map() + for (const [tag, rpc] of this.requests) { + requests.set(tag, rpc.middleware(middleware)) + } + return makeProto({ + requests, + annotations: this.annotations + }) + }, + toHandlersContext(this: RpcGroup, build: Effect.Effect any>>) { + return Effect.gen(this, function*() { + const context = yield* Effect.context() + const handlers = Effect.isEffect(build) ? yield* build : build + const contextMap = new Map() + for (const [tag, handler] of Object.entries(handlers)) { + const rpc = this.requests.get(tag)! + contextMap.set(rpc.key, { + handler, + context + }) + } + return Context.unsafeMake(contextMap) + }) + }, + toLayer(this: RpcGroup, build: Effect.Effect any>>) { + return Layer.scopedContext(this.toHandlersContext(build)) + }, + annotate(this: RpcGroup, tag: Context.Tag, value: any) { + return makeProto({ + requests: this.requests, + annotations: Context.add(this.annotations, tag, value) + }) + }, + annotateRpcs(this: RpcGroup, tag: Context.Tag, value: any) { + return this.annotateRpcsContext(Context.make(tag, value)) + }, + annotateContext(this: RpcGroup, context: Context.Context) { + return makeProto({ + requests: this.requests, + annotations: Context.merge(this.annotations, context) + }) + }, + annotateRpcsContext(this: RpcGroup, context: Context.Context) { + const requests = new Map() + for (const [tag, rpc] of this.requests) { + requests.set(tag, rpc.annotateContext(Context.merge(context, rpc.annotations))) + } + return makeProto({ + requests, + annotations: this.annotations + }) + } +} + +const makeProto = (options: { + readonly requests: ReadonlyMap + readonly annotations: Context.Context +}): RpcGroup => + Object.assign(function() {}, RpcGroupProto, { + requests: options.requests, + annotations: options.annotations + }) as any + +const resolveInput = >( + ...rpcs: Rpcs +): ReadonlyMap => { + const requests = new Map() + for (const rpc of rpcs) { + requests.set(rpc._tag, Schema.isSchema(rpc) ? Rpc.fromTaggedRequest(rpc as any) : rpc as any) + } + return requests +} + +/** + * @since 1.0.0 + * @category groups + */ +export const make = >( + ...rpcs: Rpcs +): RpcGroup => + makeProto({ + requests: resolveInput(...rpcs), + annotations: Context.empty() + }) diff --git a/packages/rpc/src/RpcMessage.ts b/packages/rpc/src/RpcMessage.ts new file mode 100644 index 00000000000..52ecdec3072 --- /dev/null +++ b/packages/rpc/src/RpcMessage.ts @@ -0,0 +1,261 @@ +/** + * @since 1.0.0 + */ +import type { Headers } from "@effect/platform/Headers" +import type { NonEmptyReadonlyArray } from "effect/Array" +import type { Branded } from "effect/Brand" +import type * as FiberId from "effect/FiberId" +import * as Schema from "effect/Schema" +import type * as Rpc from "./Rpc.js" + +/** + * @since 1.0.0 + * @category request + */ +export type FromClient = Request | Ack | Interrupt | Eof + +/** + * @since 1.0.0 + * @category request + */ +export type FromClientEncoded = RequestEncoded | Ack | InterruptEncoded | Ping | Eof + +/** + * @since 1.0.0 + * @category request + */ +export const RequestIdTypeId: unique symbol = Symbol.for("@effect/rpc/RpcServer/RequestId") + +/** + * @since 1.0.0 + * @category request + */ +export type RequestIdTypeId = typeof RequestIdTypeId + +/** + * @since 1.0.0 + * @category request + */ +export type RequestId = Branded + +/** + * @since 1.0.0 + * @category request + */ +export const RequestId = (id: bigint | string): RequestId => + typeof id === "bigint" ? id as RequestId : BigInt(id) as RequestId + +/** + * @since 1.0.0 + * @category request + */ +export interface RequestEncoded { + readonly _tag: "Request" + readonly id: bigint | string + readonly tag: string + readonly payload: unknown + readonly traceId: string + readonly spanId: string + readonly sampled: boolean + readonly headers: ReadonlyArray<[string, string]> +} + +/** + * @since 1.0.0 + * @category request + */ +export interface Request { + readonly _tag: "Request" + readonly id: RequestId + readonly tag: Rpc.Tag + readonly payload: Rpc.Payload + readonly traceId: string + readonly spanId: string + readonly sampled: boolean + readonly headers: Headers +} + +/** + * @since 1.0.0 + * @category request + */ +export interface Ack { + readonly _tag: "Ack" + readonly requestId: RequestId +} + +/** + * @since 1.0.0 + * @category request + */ +export interface Interrupt { + readonly _tag: "Interrupt" + readonly requestId: RequestId + readonly interruptors: ReadonlyArray +} + +/** + * @since 1.0.0 + * @category request + */ +export interface InterruptEncoded { + readonly _tag: "Interrupt" + readonly requestId: RequestId +} + +/** + * @since 1.0.0 + * @category request + */ +export interface Eof { + readonly _tag: "Eof" +} + +/** + * @since 1.0.0 + * @category request + */ +export interface Ping { + readonly _tag: "Ping" +} + +/** + * @since 1.0.0 + * @category request + */ +export const constEof: Eof = { _tag: "Eof" } + +/** + * @since 1.0.0 + * @category request + */ +export const constPing: Ping = { _tag: "Ping" } + +/** + * @since 1.0.0 + * @category response + */ +export type FromServer = + | ResponseChunk + | ResponseExit + | ResponseDefect + | ClientEnd + +/** + * @since 1.0.0 + * @category response + */ +export type FromServerEncoded = ResponseChunkEncoded | ResponseExitEncoded | ResponseDefectEncoded | Pong + +/** + * @since 1.0.0 + * @category response + */ +export const ResponseIdTypeId: unique symbol = Symbol.for("@effect/rpc/RpcServer/ResponseId") + +/** + * @since 1.0.0 + * @category response + */ +export type ResponseIdTypeId = typeof ResponseIdTypeId + +/** + * @since 1.0.0 + * @category response + */ +export type ResponseId = Branded + +/** + * @since 1.0.0 + * @category response + */ +export interface ResponseChunkEncoded { + readonly _tag: "Chunk" + readonly requestId: bigint | string + readonly values: NonEmptyReadonlyArray +} + +/** + * @since 1.0.0 + * @category response + */ +export interface ResponseChunk { + readonly _tag: "Chunk" + readonly clientId: number + readonly requestId: RequestId + readonly values: NonEmptyReadonlyArray> +} + +/** + * @since 1.0.0 + * @category response + */ +export interface ResponseExitEncoded { + readonly _tag: "Exit" + readonly requestId: bigint | string + readonly exit: Schema.ExitEncoded +} + +/** + * @since 1.0.0 + * @category response + */ +export interface ResponseExit { + readonly _tag: "Exit" + readonly clientId: number + readonly requestId: RequestId + readonly exit: Rpc.Exit +} + +/** + * @since 1.0.0 + * @category response + */ +export interface ResponseDefectEncoded { + readonly _tag: "Defect" + readonly defect: unknown +} + +const encodeDefect = Schema.encodeSync(Schema.Defect) + +/** + * @since 1.0.0 + * @category response + */ +export const ResponseDefectEncoded = (input: unknown): ResponseDefectEncoded => ({ + _tag: "Defect", + defect: encodeDefect(input) +}) + +/** + * @since 1.0.0 + * @category response + */ +export interface ResponseDefect { + readonly _tag: "Defect" + readonly clientId: number + readonly defect: unknown +} + +/** + * @since 1.0.0 + * @category response + */ +export interface ClientEnd { + readonly _tag: "ClientEnd" + readonly clientId: number +} + +/** + * @since 1.0.0 + * @category response + */ +export interface Pong { + readonly _tag: "Pong" +} + +/** + * @since 1.0.0 + * @category response + */ +export const constPong: Pong = { _tag: "Pong" } diff --git a/packages/rpc/src/RpcMiddleware.ts b/packages/rpc/src/RpcMiddleware.ts new file mode 100644 index 00000000000..4168d180247 --- /dev/null +++ b/packages/rpc/src/RpcMiddleware.ts @@ -0,0 +1,265 @@ +/** + * @since 1.0.0 + */ +import type { Headers } from "@effect/platform/Headers" +import * as Context from "effect/Context" +import * as Effect from "effect/Effect" +import * as Layer from "effect/Layer" +import * as Schema from "effect/Schema" +import { Scope } from "effect/Scope" +import type { Mutable } from "effect/Types" +import type * as Rpc from "./Rpc.js" +import type { Request } from "./RpcMessage.js" + +/** + * @since 1.0.0 + * @category type ids + */ +export const TypeId: unique symbol = Symbol.for("@effect/rpc/RpcMiddleware") + +/** + * @since 1.0.0 + * @category type ids + */ +export type TypeId = typeof TypeId + +/** + * @since 1.0.0 + * @category models + */ +export interface RpcMiddleware { + (options: { + readonly rpc: Rpc.AnyWithProps + readonly payload: unknown + readonly headers: Headers + }): Effect.Effect +} + +/** + * @since 1.0.0 + * @category models + */ +export interface RpcMiddlewareClient { + (options: { + readonly rpc: Rpc.AnyWithProps + readonly request: Request + }): Effect.Effect, never, R> +} + +/** + * @since 1.0.0 + * @category models + */ +export interface ForClient { + readonly _: unique symbol + readonly id: Id +} + +/** + * @since 1.0.0 + * @category models + */ +export interface Any { + (options: { + readonly rpc: Rpc.AnyWithProps + readonly payload: unknown + readonly headers: Headers + }): Effect.Effect +} + +/** + * @since 1.0.0 + * @category models + */ +export interface TagClass< + Self, + Name extends string, + Options +> extends + TagClass.Base< + Self, + Name, + Options, + RpcMiddleware< + TagClass.Service, + TagClass.FailureService + > + > +{} + +/** + * @since 1.0.0 + * @category models + */ +export declare namespace TagClass { + /** + * @since 1.0.0 + * @category models + */ + export type Provides = Options extends { + readonly provides: Context.Tag + readonly optional?: false + } ? Context.Tag.Identifier + : never + + /** + * @since 1.0.0 + * @category models + */ + export type Service = Options extends { readonly provides: Context.Tag } + ? Context.Tag.Service + : void + + /** + * @since 1.0.0 + * @category models + */ + export type FailureSchema = Options extends + { readonly failure: Schema.Schema.All; readonly optional?: false } ? Options["failure"] + : typeof Schema.Never + + /** + * @since 1.0.0 + * @category models + */ + export type Failure = Options extends + { readonly failure: Schema.Schema; readonly optional?: false } ? _A + : never + + /** + * @since 1.0.0 + * @category models + */ + export type FailureContext = Schema.Schema.Context> + + /** + * @since 1.0.0 + * @category models + */ + export type FailureService = Optional extends true ? unknown : Failure + + /** + * @since 1.0.0 + * @category models + */ + export type Optional = Options extends { readonly optional: true } ? true : false + + /** + * @since 1.0.0 + * @category models + */ + export type RequiredForClient = Options extends { readonly requiredForClient: true } ? true : false + + /** + * @since 1.0.0 + * @category models + */ + export interface Base extends Context.Tag { + new(_: never): Context.TagClassShape + readonly [TypeId]: TypeId + readonly optional: Optional + readonly failure: FailureSchema + readonly provides: Options extends { readonly provides: Context.Tag } ? Options["provides"] + : undefined + readonly requiredForClient: RequiredForClient + } +} + +/** + * @since 1.0.0 + * @category models + */ +export interface TagClassAny extends Context.Tag { + readonly [TypeId]: TypeId + readonly optional: boolean + readonly provides?: Context.Tag | undefined + readonly failure: Schema.Schema.All + readonly requiredForClient: boolean +} + +/** + * @since 1.0.0 + * @category models + */ +export interface TagClassAnyWithProps extends Context.Tag> { + readonly [TypeId]: TypeId + readonly optional: boolean + readonly provides?: Context.Tag + readonly failure: Schema.Schema.All + readonly requiredForClient: boolean +} + +/** + * @since 1.0.0 + * @category tags + */ +export const Tag = (): < + const Name extends string, + const Options extends { + readonly optional?: boolean + readonly failure?: Schema.Schema.All + readonly provides?: Context.Tag + readonly requiredForClient?: boolean + } +>( + id: Name, + options?: Options | undefined +) => TagClass => +( + id: string, + options?: { + readonly optional?: boolean + readonly failure?: Schema.Schema.All + readonly provides?: Context.Tag + readonly requiredForClient?: boolean + } +) => { + const Err = globalThis.Error as any + const limit = Err.stackTraceLimit + Err.stackTraceLimit = 2 + const creationError = new Err() + Err.stackTraceLimit = limit + + function TagClass() {} + const TagClass_ = TagClass as any as Mutable + Object.setPrototypeOf(TagClass, Object.getPrototypeOf(Context.GenericTag(id))) + TagClass.key = id + Object.defineProperty(TagClass, "stack", { + get() { + return creationError.stack + } + }) + TagClass_[TypeId] = TypeId + TagClass_.failure = options?.optional === true || options?.failure === undefined ? Schema.Never : options.failure + if (options?.provides) { + TagClass_.provides = options.provides + } + TagClass_.optional = options?.optional ?? false + TagClass_.requiredForClient = options?.requiredForClient ?? false + return TagClass as any +} + +/** + * @since 1.0.0 + * @category client + */ +export const layerClient = ( + tag: Context.Tag, + service: RpcMiddlewareClient | Effect.Effect, EX, RX> +): Layer.Layer, EX, R | Exclude> => + Layer.scopedContext(Effect.gen(function*() { + const context = (yield* Effect.context()).pipe( + Context.omit(Scope) + ) as Context.Context + const middleware = Effect.isEffect(service) ? yield* service : service + return Context.unsafeMake( + new Map([[ + `${tag.key}/Client`, + (options: any) => + Effect.mapInputContext( + middleware(options), + (requestContext) => Context.merge(context, requestContext) + ) + ]]) + ) + })) diff --git a/packages/rpc/src/RpcResolver.ts b/packages/rpc/src/RpcResolver.ts deleted file mode 100644 index fabb0cf829c..00000000000 --- a/packages/rpc/src/RpcResolver.ts +++ /dev/null @@ -1,204 +0,0 @@ -/** - * @since 1.0.0 - */ -import * as Headers from "@effect/platform/Headers" -import * as Arr from "effect/Array" -import * as Cause from "effect/Cause" -import * as Effect from "effect/Effect" -import * as Exit from "effect/Exit" -import { dual, pipe } from "effect/Function" -import type { ParseError } from "effect/ParseResult" -import * as Request from "effect/Request" -import * as RequestResolver from "effect/RequestResolver" -import * as Schema from "effect/Schema" -import * as Stream from "effect/Stream" -import { StreamRequestTypeId, withRequestTag } from "./internal/rpc.js" -import * as Rpc from "./Rpc.js" -import type * as Router from "./RpcRouter.js" - -/** - * @since 1.0.0 - * @category constructors - */ -export const make = ( - handler: (u: ReadonlyArray) => Stream.Stream -) => ->(): RequestResolver.RequestResolver< - Rpc.Request>, - Schema.SerializableWithResult.Context> | HR -> => { - const getDecode = withRequestTag((req) => Schema.decodeUnknown(Schema.exitSchema(req))) - const getDecodeChunk = withRequestTag((req) => Schema.decodeUnknown(Schema.Chunk(Schema.exitSchema(req)))) - - return RequestResolver.makeBatched( - (requests: Arr.NonEmptyArray>) => { - const [effectRequests, streamRequests] = Arr.partition( - requests, - (_): _ is Rpc.Request => StreamRequestTypeId in _.request - ) - - const processEffects = pipe( - Effect.forEach(effectRequests, (_) => - Effect.map( - Schema.serialize(_.request), - (request) => ({ ..._, request }) - )), - Effect.flatMap((payload) => - Stream.runForEach( - Stream.filter( - handler(payload), - (_): _ is Router.RpcRouter.Response => Arr.isArray(_) && _.length === 2 - ), - ([index, response]): Effect.Effect => { - const request = effectRequests[index] - return Effect.matchCauseEffect(Effect.orDie(getDecode(request.request)(response)), { - onFailure: (cause) => Request.failCause(request, cause as any), - onSuccess: (exit) => Request.complete(request, exit as any) - }) - } - ) - ), - Effect.orDie, - Effect.catchAllCause((cause) => - Effect.forEach( - effectRequests, - (request) => Request.failCause(request, cause), - { discard: true } - ) - ) - ) - - const processStreams = pipe( - Effect.forEach(streamRequests, (request) => { - const decode = getDecodeChunk(request.request) - const stream = pipe( - Schema.serialize(request.request), - Effect.map((_) => ({ ...request, request: _ })), - Effect.map((payload) => - pipe( - handler([payload]), - Stream.mapEffect((_) => Effect.orDie(decode((_ as Router.RpcRouter.Response)[1]))), - Stream.flattenChunks, - Stream.flatMap(Exit.match({ - onFailure: (cause) => Cause.isEmptyType(cause) ? Stream.empty : Stream.failCause(cause), - onSuccess: Stream.succeed - })) - ) - ), - Effect.orDie, - Stream.unwrap - ) - return Request.succeed(request, stream as any) - }, { discard: true }), - Effect.catchAllCause((cause) => - Effect.forEach( - streamRequests, - (request) => Request.failCause(request, cause), - { discard: true } - ) - ) - ) - - return Effect.zipRight(processStreams, processEffects) - } - ) -} - -/** - * @since 1.0.0 - * @category combinators - */ -export const annotateHeaders: { - ( - headers: Headers.Input - ): ( - self: RequestResolver.RequestResolver, R> - ) => RequestResolver.RequestResolver, R> - ( - self: RequestResolver.RequestResolver, R>, - headers: Headers.Input - ): RequestResolver.RequestResolver, R> -} = dual(2, ( - self: RequestResolver.RequestResolver, R>, - headers: Headers.Input -): RequestResolver.RequestResolver, R> => { - const resolved = Headers.fromInput(headers) - return RequestResolver.makeWithEntry((requests) => { - requests.forEach((entries) => - entries.forEach((entry) => { - ;(entry.request as any).headers = Headers.merge(entry.request.headers, resolved) - }) - ) - return self.runAll(requests) - }) -}) - -/** - * @since 1.0.0 - * @category combinators - */ -export const annotateHeadersEffect: { - ( - headers: Effect.Effect - ): ( - self: RequestResolver.RequestResolver, R> - ) => RequestResolver.RequestResolver, R | R2> - ( - self: RequestResolver.RequestResolver, R>, - headers: Effect.Effect - ): RequestResolver.RequestResolver, R | R2> -} = dual(2, ( - self: RequestResolver.RequestResolver, R>, - headers: Effect.Effect -): RequestResolver.RequestResolver, R | R2> => - RequestResolver.makeWithEntry((requests) => - headers.pipe( - Effect.map(Headers.fromInput), - Effect.orDie, - Effect.matchCauseEffect({ - onFailure: (cause) => - Effect.forEach( - requests.flat(), - (entry) => Request.failCause(entry.request, cause), - { discard: true } - ), - onSuccess: (resolved) => { - requests.forEach((entries) => - entries.forEach((entry) => { - ;(entry.request as any).headers = Headers.merge(entry.request.headers, resolved) - }) - ) - return self.runAll(requests) - } - }) - ) - )) - -/** - * @since 1.0.0 - * @category models - */ -export type Client< - R extends - | RequestResolver.RequestResolver, never> - | Effect.Effect, never>, never, any> -> = R extends Effect.Effect>, infer _E, infer R> ? - ((request: Req) => Rpc.Rpc.Result) - : R extends RequestResolver.RequestResolver, never> ? - ((request: Req) => Rpc.Rpc.Result) - : never - -/** - * @since 1.0.0 - * @category combinators - */ -export const toClient = < - R extends - | RequestResolver.RequestResolver, never> - | Effect.Effect, never>, never, any> ->( - resolver: R, - options?: { - readonly spanPrefix?: string - } -): Client => ((request: Schema.TaggedRequest.All) => Rpc.call(request, resolver, options)) as any diff --git a/packages/rpc/src/RpcResolverNoStream.ts b/packages/rpc/src/RpcResolverNoStream.ts deleted file mode 100644 index 908f480c922..00000000000 --- a/packages/rpc/src/RpcResolverNoStream.ts +++ /dev/null @@ -1,87 +0,0 @@ -/** - * @since 1.0.0 - */ -import type { NonEmptyArray } from "effect/Array" -import * as Channel from "effect/Channel" -import * as Chunk from "effect/Chunk" -import * as Effect from "effect/Effect" -import * as Exit from "effect/Exit" -import { pipe } from "effect/Function" -import * as Request from "effect/Request" -import * as RequestResolver from "effect/RequestResolver" -import * as Schema from "effect/Schema" -import * as Stream from "effect/Stream" -import { StreamRequestTypeId, withRequestTag } from "./internal/rpc.js" -import type * as Rpc from "./Rpc.js" -import type * as Router from "./RpcRouter.js" - -/** - * @since 1.0.0 - * @category constructors - */ -export const make = ( - handler: (u: ReadonlyArray) => Effect.Effect -) => ->(): RequestResolver.RequestResolver< - Rpc.Request>, - Schema.SerializableWithResult.Context> | HR -> => { - const getDecode = withRequestTag((req) => Schema.decodeUnknown(Schema.exitSchema(req))) - const getDecodeChunk = withRequestTag((req) => Schema.decodeUnknown(Schema.Chunk(Schema.exitSchema(req)))) - - return RequestResolver.makeBatched((requests: NonEmptyArray>) => - pipe( - Effect.forEach(requests, (_) => - Effect.map( - Schema.serialize(_.request), - (request) => ({ ..._, request }) - )), - Effect.flatMap(handler), - Effect.filterOrDieMessage( - (_): _ is Array => Array.isArray(_) && _.length === requests.length, - "@effect/rpc: handler must return an array of responses with the same length as the requests." - ), - Effect.flatMap(Effect.forEach((response, index) => { - const request = requests[index] - if (StreamRequestTypeId in request.request) { - return pipe( - getDecodeChunk(request.request)(response), - Effect.orDie, - Effect.matchCauseEffect({ - onFailure: (cause) => Request.succeed(request, Stream.failCause(cause)), - onSuccess: (chunk) => { - const lastExit = Chunk.unsafeLast(chunk) - const channel = Exit.match(lastExit, { - onFailure: (cause) => - chunk.length > 1 ? - Channel.zipRight( - Channel.write(Chunk.map( - Chunk.dropRight(chunk, 1), - (exit) => (exit as Exit.Success).value - )), - Channel.failCause(cause) - ) : - Channel.failCause(cause), - onSuccess: (_) => Channel.write(Chunk.map(chunk, (exit) => (exit as Exit.Success).value)) - }) - return Request.succeed(request, Stream.fromChannel(channel)) - } - }) - ) - } - return Effect.matchCauseEffect(Effect.orDie(getDecode(request.request)(response)), { - onFailure: (cause) => Request.failCause(request, cause as any), - onSuccess: (exit) => Request.complete(request, exit as any) - }) - }, { discard: true })), - Effect.orDie, - Effect.catchAllCause((cause) => - Effect.forEach( - requests, - (request) => Request.failCause(request, cause), - { discard: true } - ) - ) - ) - ) -} diff --git a/packages/rpc/src/RpcRouter.ts b/packages/rpc/src/RpcRouter.ts deleted file mode 100644 index 727d09d4459..00000000000 --- a/packages/rpc/src/RpcRouter.ts +++ /dev/null @@ -1,421 +0,0 @@ -/** - * @since 1.0.0 - */ -import * as Cause from "effect/Cause" -import * as Channel from "effect/Channel" -import * as Chunk from "effect/Chunk" -import * as Context from "effect/Context" -import * as Effect from "effect/Effect" -import * as Exit from "effect/Exit" -import { dual, pipe } from "effect/Function" -import * as Mailbox from "effect/Mailbox" -import type { ParseError } from "effect/ParseResult" -import { type Pipeable, pipeArguments } from "effect/Pipeable" -import * as Predicate from "effect/Predicate" -import * as Schema from "effect/Schema" -import * as Stream from "effect/Stream" -import { StreamRequestTypeId, withRequestTag } from "./internal/rpc.js" -import * as Rpc from "./Rpc.js" - -/** - * @since 1.0.0 - * @category type ids - */ -export const TypeId: unique symbol = Symbol.for("@effect/rpc/RpcRouter") - -/** - * @since 1.0.0 - * @category type ids - */ -export type TypeId = typeof TypeId - -/** - * @since 1.0.0 - * @category refinements - */ -export const isRpcRouter = (u: unknown): u is RpcRouter => Predicate.hasProperty(u, TypeId) - -/** - * @since 1.0.0 - * @category models - */ -export interface RpcRouter extends Pipeable { - readonly [TypeId]: TypeId - readonly rpcs: ReadonlySet> -} - -/** - * @since 1.0.0 - * @category models - */ -export declare namespace RpcRouter { - /** - * @since 1.0.0 - * @category models - */ - export type Context> = A extends RpcRouter - ? R | Schema.SerializableWithResult.Context - : never - - /** - * @since 1.0.0 - * @category models - */ - export type ContextRaw> = A extends RpcRouter - ? R | Schema.Serializable.Context - : never - - /** - * @since 1.0.0 - * @category models - */ - export type Request> = A extends RpcRouter ? Req - : never - - /** - * @since 1.0.0 - * @category models - */ - export type Response = [ - index: number, - response: Schema.ExitEncoded | ReadonlyArray> - ] - - /** - * @since 1.0.0 - * @category models - */ - export type ResponseEffect = - | Schema.ExitEncoded - | ReadonlyArray> -} - -const fromSet = ( - rpcs: ReadonlySet> -): RpcRouter => ({ - [TypeId]: TypeId, - rpcs, - pipe() { - return pipeArguments(this, arguments) - } -}) - -/** - * @since 1.0.0 - * @category constructors - */ -export const make = | RpcRouter>>( - ...rpcs: Rpcs -): RpcRouter< - | Rpc.Rpc.Request< - Extract - > - | RpcRouter.Request< - Extract - >, - | Rpc.Rpc.Context< - Extract - > - | RpcRouter.Context< - Extract - > -> => { - const rpcSet = new Set>() - rpcs.forEach((rpc) => { - if (isRpcRouter(rpc)) { - rpc.rpcs.forEach((rpc) => rpcSet.add(rpc)) - } else { - rpcSet.add(rpc) - } - }) - return fromSet(rpcSet) -} - -/** - * @since 1.0.0 - * @category context - */ -export const provideServiceEffect: { - ( - tag: Context.Tag, - effect: Effect.Effect - ): (self: RpcRouter) => RpcRouter | R2> - ( - self: RpcRouter, - tag: Context.Tag, - effect: Effect.Effect - ): RpcRouter | R2> -} = dual(3, ( - self: RpcRouter, - tag: Context.Tag, - effect: Effect.Effect -): RpcRouter | R2> => fromSet(new Set([...self.rpcs].map(Rpc.provideServiceEffect(tag, effect))))) - -/** - * @since 1.0.0 - * @category context - */ -export const provideService: { - ( - tag: Context.Tag, - service: S - ): (self: RpcRouter) => RpcRouter> - ( - self: RpcRouter, - tag: Context.Tag, - service: S - ): RpcRouter> -} = dual(3, ( - self: RpcRouter, - tag: Context.Tag, - service: S -): RpcRouter> => fromSet(new Set([...self.rpcs].map(Rpc.provideService(tag, service))))) - -const emptyExit = Schema.encodeSync(Schema.Exit({ - failure: Schema.Never, - success: Schema.Never, - defect: Schema.Defect -}))(Exit.failCause(Cause.empty)) - -/** - * @since 1.0.0 - * @category combinators - */ -export const toHandler: { - (options?: { - readonly spanPrefix?: string - }): >( - self: R - ) => (u: unknown) => Stream.Stream> - >(self: R, options?: { - readonly spanPrefix?: string - }): (u: unknown) => Stream.Stream> -} = dual( - (args) => isRpcRouter(args[0]), - >(router: R, options?: { readonly spanPrefix?: string }) => { - const spanPrefix = options?.spanPrefix ?? "Rpc.router " - const schema = Schema.Union( - ...[...router.rpcs].map((rpc) => - Schema.transform( - rpc.schema, - Schema.Tuple(Schema.typeSchema(rpc.schema), Schema.Any), - { strict: true, decode: (request) => [request, rpc] as const, encode: ([request]) => request } - ) - ) - ) - const schemaArray = Schema.Array(Rpc.RequestSchema(schema)) - const decode = Schema.decodeUnknown(schemaArray) - const getEncode = withRequestTag((req) => Schema.encode(Schema.exitSchema(req))) - const getEncodeChunk = withRequestTag((req) => Schema.encode(Schema.Chunk(Schema.exitSchema(req)))) - - return (u: unknown): Stream.Stream> => - pipe( - decode(u), - Effect.zip(Mailbox.make(4)), - Effect.tap(([requests, mailbox]) => - pipe( - Effect.forEach(requests, (req, index) => { - const [request, rpc] = req.request - if (rpc._tag === "Effect") { - const encode = getEncode(request) - return pipe( - Effect.exit(rpc.handler(request)), - Effect.flatMap(encode), - Effect.orDie, - Effect.matchCauseEffect({ - onSuccess: (response) => mailbox.offer([index, response]), - onFailure: (cause) => - Effect.flatMap( - encode(Exit.failCause(cause)), - (response) => mailbox.offer([index, response]) - ) - }), - Effect.locally(Rpc.currentHeaders, req.headers as any), - Effect.withSpan(`${spanPrefix}${request._tag}`, { - kind: "server", - parent: { - _tag: "ExternalSpan", - traceId: req.traceId, - spanId: req.spanId, - sampled: req.sampled, - context: Context.empty() - }, - captureStackTrace: false - }) - ) - } - const encode = getEncodeChunk(request) - return pipe( - rpc.handler(request), - Stream.toChannel, - Channel.mapOutEffect((chunk) => - Effect.flatMap( - encode(Chunk.map(chunk, Exit.succeed)), - (response) => mailbox.offer([index, response]) - ) - ), - Channel.runDrain, - Effect.matchCauseEffect({ - onSuccess: () => mailbox.offer([index, [emptyExit]]), - onFailure: (cause) => - Effect.flatMap( - encode(Chunk.of(Exit.failCause(cause))), - (response) => mailbox.offer([index, response]) - ) - }), - Effect.locally(Rpc.currentHeaders, req.headers as any), - Effect.withSpan(`${spanPrefix}${request._tag}`, { - kind: "server", - parent: { - _tag: "ExternalSpan", - traceId: req.traceId, - spanId: req.spanId, - sampled: req.sampled, - context: Context.empty() - }, - captureStackTrace: false - }) - ) - }, { concurrency: "unbounded", discard: true }), - Effect.ensuring(mailbox.end), - Effect.forkScoped - ) - ), - Effect.map(([_, mailbox]) => Mailbox.toStream(mailbox)), - Stream.unwrapScoped - ) - } -) - -/** - * @since 1.0.0 - * @category combinators - */ -export const toHandlerNoStream: { - (options?: { - readonly spanPrefix?: string - }): >( - self: R - ) => (u: unknown) => Effect.Effect> - >(self: R, options?: { - readonly spanPrefix?: string - }): (u: unknown) => Effect.Effect> -} = dual((args) => isRpcRouter(args[0]), >(router: R, options?: { - readonly spanPrefix?: string -}) => { - const spanPrefix = options?.spanPrefix ?? "Rpc.router " - const schema = Schema.Union( - ...[...router.rpcs].map((rpc) => - Schema.transform( - rpc.schema, - Schema.typeSchema(Schema.Tuple(rpc.schema, Schema.Any)), - { strict: true, decode: (request) => [request, rpc] as const, encode: ([request]) => request } - ) - ) - ) - const schemaArray = Schema.Array(Rpc.RequestSchema(schema)) - const decode = Schema.decodeUnknown(schemaArray) - const getEncode = withRequestTag((req) => Schema.encode(Schema.exitSchema(req))) - const getEncodeChunk = withRequestTag((req) => Schema.encode(Schema.Chunk(Schema.exitSchema(req)))) - - return (u: unknown): Effect.Effect, ParseError, RpcRouter.Context> => - Effect.flatMap( - decode(u), - Effect.forEach((req): Effect.Effect => { - const [request, rpc] = req.request - if (rpc._tag === "Effect") { - const encode = getEncode(request) - return pipe( - Effect.exit(rpc.handler(request)), - Effect.flatMap(encode), - Effect.orDie, - Effect.locally(Rpc.currentHeaders, req.headers as any), - Effect.withSpan(`${spanPrefix}${request._tag}`, { - kind: "server", - parent: { - _tag: "ExternalSpan", - traceId: req.traceId, - spanId: req.spanId, - sampled: req.sampled, - context: Context.empty() - }, - captureStackTrace: false - }) - ) - } - const encode = getEncodeChunk(request) - return pipe( - rpc.handler(request), - Stream.map(Exit.succeed), - Stream.catchAllCause((cause) => Stream.succeed(Exit.failCause(cause))), - Stream.runCollect, - Effect.flatMap(encode), - Effect.locally(Rpc.currentHeaders, req.headers as any), - Effect.withSpan(`${spanPrefix}${request._tag}`, { - kind: "server", - parent: { - _tag: "ExternalSpan", - traceId: req.traceId, - spanId: req.spanId, - sampled: req.sampled, - context: Context.empty() - }, - captureStackTrace: false - }) - ) - }, { concurrency: "unbounded" }) - ) -}) - -/** - * @since 1.0.0 - * @category combinators - */ -export const toHandlerRaw = >(router: R) => { - const schema: Schema.Schema< - readonly [Schema.TaggedRequest.All, Rpc.Rpc], - unknown, - RpcRouter.ContextRaw - > = Schema.Union(...[...router.rpcs].map((rpc) => - Schema.transform( - Schema.typeSchema(rpc.schema), - Schema.typeSchema(Schema.Tuple(rpc.schema, Schema.Any)), - { strict: true, decode: (request) => [request, rpc] as const, encode: ([request]) => request } - ) - )) - const parse = Schema.decode(schema) - - return >(request: Req): Rpc.Rpc.Result> => { - const isStream = StreamRequestTypeId in request - const withHandler = parse(request) - if (isStream) { - return Stream.unwrap(Effect.map( - withHandler, - ([request, rpc]) => rpc.handler(request) - )) as any - } - return Effect.flatMap( - withHandler, - ([request, rpc]) => rpc.handler(request) as any - ) as any - } -} - -/** - * @since 1.0.0 - * @category combinators - */ -export const toHandlerUndecoded = >(router: R) => { - const handler = toHandlerRaw(router) - const getEncode = withRequestTag((req) => Schema.encode(Schema.successSchema(req))) - const getEncodeChunk = withRequestTag((req) => Schema.encode(Schema.ChunkFromSelf(Schema.successSchema(req)))) - return >(request: Req): Rpc.Rpc.ResultUndecoded> => { - const result = handler(request) - if (Effect.isEffect(result)) { - const encode = getEncode(request) - return Effect.flatMap(result, encode) as any - } - const encode = getEncodeChunk(request) - return Stream.mapChunksEffect(result as any, encode) as any - } -} diff --git a/packages/rpc/src/RpcSchema.ts b/packages/rpc/src/RpcSchema.ts new file mode 100644 index 00000000000..36014df95b9 --- /dev/null +++ b/packages/rpc/src/RpcSchema.ts @@ -0,0 +1,121 @@ +/** + * @since 1.0.0 + */ +import type * as Chunk from "effect/Chunk" +import * as Effect from "effect/Effect" +import * as Option from "effect/Option" +import * as ParseResult from "effect/ParseResult" +import { hasProperty } from "effect/Predicate" +import * as Schema from "effect/Schema" +import * as AST from "effect/SchemaAST" +import * as Stream_ from "effect/Stream" + +/** + * @since 1.0.0 + * @category Stream + */ +export const StreamSchemaId: unique symbol = Symbol.for("@effect/rpc/RpcSchema/Stream") + +/** + * @since 1.0.0 + * @category Stream + */ +export const isStreamSchema = (schema: Schema.Schema.All): schema is Stream => + schema.ast.annotations[AST.SchemaIdAnnotationId] === StreamSchemaId + +/** + * @since 1.0.0 + * @category Stream + */ +export const isStreamSerializable = (schema: Schema.WithResult.Any): boolean => + isStreamSchema(Schema.successSchema(schema)) + +/** + * @since 1.0.0 + * @category Stream + */ +export const getStreamSchemas = ( + ast: AST.AST +): Option.Option<{ + readonly success: Schema.Schema.Any + readonly failure: Schema.Schema.All +}> => ast.annotations[StreamSchemaId] ? Option.some(ast.annotations[StreamSchemaId] as any) : Option.none() + +/** + * @since 1.0.0 + * @category Stream + */ +export interface Stream extends + Schema.Schema< + Stream_.Stream, + Stream_.Stream, + A["Context"] | E["Context"] + > +{ + readonly success: A + readonly failure: E +} + +/** + * @since 1.0.0 + * @category Stream + */ +export const Stream = ( + { failure, success }: { + readonly failure: E + readonly success: A + } +): Stream => + Object.assign( + Schema.declare( + [success, failure], + { + decode: (success, failure) => + parseStream( + ParseResult.decodeUnknown(Schema.ChunkFromSelf(success)), + ParseResult.decodeUnknown(failure) + ), + encode: (success, failure) => + parseStream( + ParseResult.encodeUnknown(Schema.ChunkFromSelf(success)), + ParseResult.encodeUnknown(failure) + ) + }, + { + schemaId: StreamSchemaId, + [StreamSchemaId]: { success, failure } + } + ), + { + success, + failure + } + ) + +const isStream = (u: unknown): u is Stream_.Stream => hasProperty(u, Stream_.StreamTypeId) + +const parseStream = ( + decodeSuccess: ( + u: Chunk.Chunk, + overrideOptions?: AST.ParseOptions + ) => Effect.Effect, ParseResult.ParseIssue, RA>, + decodeFailure: (u: unknown, overrideOptions?: AST.ParseOptions) => Effect.Effect +) => +(u: unknown, options: AST.ParseOptions, ast: AST.AST) => + Effect.flatMap( + Effect.context(), + (context) => { + if (!isStream(u)) return Effect.fail(new ParseResult.Type(ast, u)) + return Effect.succeed(u.pipe( + Stream_.mapChunksEffect((value) => decodeSuccess(value, options)), + Stream_.catchAll((error) => { + if (ParseResult.isParseError(error)) return Stream_.die(error) + return Effect.matchEffect(decodeFailure(error, options), { + onFailure: Effect.die, + onSuccess: Effect.fail + }) + }), + Stream_.provideContext(context) + )) + } + ) diff --git a/packages/rpc/src/RpcSerialization.ts b/packages/rpc/src/RpcSerialization.ts new file mode 100644 index 00000000000..358f884ccc8 --- /dev/null +++ b/packages/rpc/src/RpcSerialization.ts @@ -0,0 +1,125 @@ +/** + * @since 1.0.0 + */ +import { Msgpackr } from "@effect/platform/MsgPack" +import * as Context from "effect/Context" +import * as Effect from "effect/Effect" +import * as Layer from "effect/Layer" + +/** + * @since 1.0.0 + * @category serialization + */ +export class RpcSerialization extends Context.Tag("@effect/rpc/RpcSerialization")() {} + +/** + * @since 1.0.0 + * @category serialization + */ +export interface Parser { + readonly decode: (data: Uint8Array | string) => ReadonlyArray + readonly encode: (response: unknown) => Uint8Array | string +} + +/** + * @since 1.0.0 + * @category serialization + */ +export const json: Effect.Effect = Effect.sync(() => { + const decoder = new TextDecoder() + return RpcSerialization.of({ + contentType: "application/json", + supportsBigInt: false, + unsafeMake: () => ({ + decode: (bytes) => [JSON.parse(typeof bytes === "string" ? bytes : decoder.decode(bytes))], + encode: (response) => JSON.stringify(response) + }) + }) +}) + +/** + * @since 1.0.0 + * @category serialization + */ +export const ndjson: Effect.Effect = Effect.sync(() => { + const decoder = new TextDecoder() + return RpcSerialization.of({ + contentType: "application/ndjson", + supportsBigInt: false, + unsafeMake: () => { + let buffer = "" + return ({ + decode: (bytes) => { + buffer += typeof bytes === "string" ? bytes : decoder.decode(bytes) + let position = 0 + let nlIndex = buffer.indexOf("\n", position) + const items: Array = [] + while (nlIndex !== -1) { + const item = JSON.parse(buffer.slice(position, nlIndex)) + items.push(item) + position = nlIndex + 1 + nlIndex = buffer.indexOf("\n", position) + } + buffer = buffer.slice(position) + return items + }, + encode: (response) => JSON.stringify(response) + "\n" + }) + } + }) +}) + +/** + * @since 1.0.0 + * @category serialization + */ +export const msgPack: RpcSerialization["Type"] = RpcSerialization.of({ + contentType: "application/msgpack", + supportsBigInt: true, + unsafeMake: () => { + const unpackr = new Msgpackr.Unpackr() + const packr = new Msgpackr.Packr() + const encoder = new TextEncoder() + return ({ + decode: (bytes) => unpackr.unpackMultiple(typeof bytes === "string" ? encoder.encode(bytes) : bytes), + encode: (response) => packr.pack(response) + }) + } +}) + +/** + * A rpc serialization layer that uses JSON for serialization. + * + * Use this if your protocol supports framing for messages, otherwise use + * `layerSerializationNdjson`. + * + * @since 1.0.0 + * @category serialization + */ +export const layerJson: Layer.Layer = Layer.effect(RpcSerialization, json) + +/** + * A rpc serialization layer that uses NDJSON for serialization. + * + * Use this if your protocol does not support framing for messages, otherwise + * use `layerSerializationJson`. + * + * @since 1.0.0 + * @category serialization + */ +export const layerNdjson: Layer.Layer = Layer.effect(RpcSerialization, ndjson) + +/** + * A rpc serialization layer that uses MessagePack for serialization. + * + * MessagePack has a more compact binary format compared to JSON and NDJSON. It + * also has better support for binary data. + * + * @since 1.0.0 + * @category serialization + */ +export const layerMsgPack: Layer.Layer = Layer.succeed(RpcSerialization, msgPack) diff --git a/packages/rpc/src/RpcServer.ts b/packages/rpc/src/RpcServer.ts new file mode 100644 index 00000000000..fb310ee7922 --- /dev/null +++ b/packages/rpc/src/RpcServer.ts @@ -0,0 +1,1234 @@ +/** + * @since 1.0.0 + */ +import * as Headers from "@effect/platform/Headers" +import * as HttpApp from "@effect/platform/HttpApp" +import * as HttpRouter from "@effect/platform/HttpRouter" +import * as HttpServerRequest from "@effect/platform/HttpServerRequest" +import * as HttpServerResponse from "@effect/platform/HttpServerResponse" +import type * as Socket from "@effect/platform/Socket" +import * as SocketServer from "@effect/platform/SocketServer" +import * as Transferable from "@effect/platform/Transferable" +import type { WorkerError } from "@effect/platform/WorkerError" +import * as WorkerRunner from "@effect/platform/WorkerRunner" +import type { NonEmptyReadonlyArray } from "effect/Array" +import * as Arr from "effect/Array" +import * as Cause from "effect/Cause" +import * as Chunk from "effect/Chunk" +import * as Context from "effect/Context" +import * as Deferred from "effect/Deferred" +import * as Effect from "effect/Effect" +import * as Exit from "effect/Exit" +import * as Fiber from "effect/Fiber" +import * as FiberId from "effect/FiberId" +import * as FiberSet from "effect/FiberSet" +import { constant, constTrue, constVoid, identity } from "effect/Function" +import * as Layer from "effect/Layer" +import * as Mailbox from "effect/Mailbox" +import * as ManagedRuntime from "effect/ManagedRuntime" +import * as Option from "effect/Option" +import { ArrayFormatter, type ParseError } from "effect/ParseResult" +import * as Predicate from "effect/Predicate" +import * as Runtime from "effect/Runtime" +import * as Schema from "effect/Schema" +import * as Scope from "effect/Scope" +import * as Stream from "effect/Stream" +import * as Tracer from "effect/Tracer" +import { withRun } from "./internal/utils.js" +import * as Rpc from "./Rpc.js" +import type * as RpcGroup from "./RpcGroup.js" +import { + constEof, + constPong, + type FromClient, + type FromClientEncoded, + type FromServer, + type FromServerEncoded, + type Request, + RequestId, + ResponseDefectEncoded +} from "./RpcMessage.js" +import * as RpcSchema from "./RpcSchema.js" +import * as RpcSerialization from "./RpcSerialization.js" +import type { InitialMessage } from "./RpcWorker.js" + +/** + * @since 1.0.0 + * @category server + */ +export interface RpcServer { + readonly write: (clientId: number, message: FromClient) => Effect.Effect + readonly disconnect: (clientId: number) => Effect.Effect +} + +/** + * @since 1.0.0 + * @category server + */ +export const makeNoSerialization: ( + group: RpcGroup.RpcGroup, + options: { + readonly onFromServer: (response: FromServer) => Effect.Effect + readonly disableTracing?: boolean | undefined + readonly disableSpanPropagation?: boolean | undefined + readonly spanPrefix?: string | undefined + readonly disableClientAcks?: boolean | undefined + readonly concurrency?: number | "unbounded" | undefined + } +) => Effect.Effect< + RpcServer, + never, + Rpc.ToHandler | Rpc.Middleware | Scope.Scope +> = Effect.fnUntraced(function*( + group: RpcGroup.RpcGroup, + options: { + readonly onFromServer: (response: FromServer) => Effect.Effect + readonly disableTracing?: boolean | undefined + readonly disableSpanPropagation?: boolean | undefined + readonly spanPrefix?: string | undefined + readonly disableClientAcks?: boolean | undefined + readonly concurrency?: number | "unbounded" | undefined + } +) { + const enableTracing = options.disableTracing !== true + const enableSpanPropagation = options.disableSpanPropagation !== true + const supportsAck = options.disableClientAcks !== true + const spanPrefix = options.spanPrefix ?? "RpcServer" + const concurrency = options.concurrency ?? "unbounded" + const context = yield* Effect.context | Scope.Scope>() + const scope = Context.get(context, Scope.Scope) + const fiberSet = yield* FiberSet.make() + const runFork = yield* FiberSet.runtime(fiberSet)().pipe( + Effect.interruptible + ) + const concurrencySemaphore = concurrency === "unbounded" + ? undefined + : yield* Effect.makeSemaphore(concurrency) + + type Client = { + readonly id: number + readonly latches: Map + readonly fibers: Map> + ended: boolean + } + + const clients = new Map() + let isShutdown = false + const shutdownLatch = Effect.unsafeMakeLatch(false) + yield* Scope.addFinalizer( + scope, + Effect.fiberIdWith((fiberId) => { + isShutdown = true + for (const client of clients.values()) { + client.ended = true + if (client.fibers.size === 0) { + runFork(endClient(client)) + continue + } + for (const fiber of client.fibers.values()) { + fiber.unsafeInterruptAsFork(fiberId) + } + } + if (clients.size === 0) { + return Effect.void + } + return shutdownLatch.await + }) + ) + + const disconnect = (clientId: number) => + Effect.fiberIdWith((fiberId) => { + const client = clients.get(clientId) + if (!client) return Effect.void + for (const fiber of client.fibers.values()) { + fiber.unsafeInterruptAsFork(fiberId) + } + clients.delete(clientId) + return Effect.void + }) + + const write = (clientId: number, message: FromClient): Effect.Effect => + Effect.catchAllDefect( + Effect.withFiberRuntime((requestFiber) => { + if (isShutdown) return Effect.interrupt + let client = clients.get(clientId) + if (!client) { + client = { + id: clientId, + latches: new Map(), + fibers: new Map(), + ended: false + } + clients.set(clientId, client) + } else if (client.ended) { + return Effect.interrupt + } + + switch (message._tag) { + case "Request": { + return handleRequest(requestFiber, client, message) + } + case "Ack": { + const latch = client.latches.get(message.requestId) + return latch ? latch.open : Effect.void + } + case "Interrupt": { + const fiber = client.fibers.get(message.requestId) + return fiber ? Fiber.interruptFork(fiber) : options.onFromServer({ + _tag: "Exit", + clientId, + requestId: message.requestId, + exit: Exit.interrupt(FiberId.none) + }) + } + case "Eof": { + client.ended = true + if (client.fibers.size > 0) return Effect.void + return endClient(client) + } + default: { + return sendDefect(client, `Unknown request tag: ${(message as any)._tag}`) + } + } + }), + (defect) => sendDefect(clients.get(clientId)!, defect) + ) + + const endClient = (client: Client) => { + clients.delete(client.id) + const write = options.onFromServer({ + _tag: "ClientEnd", + clientId: client.id + }) + if (isShutdown && clients.size === 0) { + return Effect.zipRight(write, shutdownLatch.open) + } + return write + } + + const handleRequest = ( + requestFiber: Fiber.RuntimeFiber, + client: Client, + request: Request + ): Effect.Effect => { + if (client.fibers.has(request.id)) { + return Effect.interrupt + } + const rpc = group.requests.get(request.tag) as any as Rpc.AnyWithProps + const entry = context.unsafeMap.get(rpc?.key) as Rpc.Handler + if (!rpc || !entry) { + const write = Effect.catchAllDefect( + options.onFromServer({ + _tag: "Exit", + clientId: client.id, + requestId: request.id, + exit: Exit.die(`Unknown request tag: ${request.tag}`) + }), + (defect) => sendDefect(client, defect) + ) + if (!client.ended || client.fibers.size > 0) return write + return Effect.zipRight(write, endClient(client)) + } + const isStream = RpcSchema.isStreamSchema(rpc.successSchema) + const result = entry.handler(request.payload, request.headers) + + // if the handler requested forking, then we skip the concurrency control + const isFork = Rpc.isFork(result) + // unwrap the fork data type + const streamOrEffect = isFork ? result.value : result + + let responded = false + let effect = Effect.uninterruptible(Effect.matchCauseEffect( + Effect.interruptible(applyMiddleware( + rpc, + context, + request.payload, + request.headers, + isStream + ? streamEffect(client, request, streamOrEffect) + : streamOrEffect as Effect.Effect + )), + { + onSuccess: (value) => { + responded = true + return options.onFromServer({ + _tag: "Exit", + clientId: client.id, + requestId: request.id, + exit: Exit.succeed(value as any) + }) + }, + onFailure: (cause) => { + responded = true + return options.onFromServer({ + _tag: "Exit", + clientId: client.id, + requestId: request.id, + exit: Exit.failCause(cause) + }) + } + } + )) + if (enableTracing) { + const parentSpan = requestFiber.currentContext.unsafeMap.get(Tracer.ParentSpan.key) as Tracer.AnySpan | undefined + effect = Effect.withSpan(effect, `${spanPrefix}.${request.tag}`, { + captureStackTrace: false, + parent: enableSpanPropagation ? + { + _tag: "ExternalSpan", + traceId: request.traceId, + spanId: request.spanId, + sampled: request.sampled, + context: Context.empty() + } : + undefined, + links: enableSpanPropagation && parentSpan ? + [{ + _tag: "SpanLink", + span: parentSpan, + attributes: {} + }] : + undefined + }) + } + if (!isFork && concurrencySemaphore) { + effect = concurrencySemaphore.withPermits(1)(effect) + } + const runtime = Runtime.make({ + context: Context.merge(entry.context, requestFiber.currentContext), + fiberRefs: requestFiber.getFiberRefs(), + runtimeFlags: Runtime.defaultRuntime.runtimeFlags + }) + const fiber = Runtime.runFork(runtime, effect) + FiberSet.unsafeAdd(fiberSet, fiber) + client.fibers.set(request.id, fiber) + fiber.addObserver((exit) => { + if (!responded && exit._tag === "Failure") { + FiberSet.unsafeAdd( + fiberSet, + Runtime.runFork( + runtime, + options.onFromServer({ + _tag: "Exit", + clientId: client.id, + requestId: request.id, + exit: Exit.interrupt(FiberId.none) + }) + ) + ) + } + client.fibers.delete(request.id) + client.latches.delete(request.id) + if (client.ended && client.fibers.size === 0) { + FiberSet.unsafeAdd( + fiberSet, + Runtime.runFork(runtime, endClient(client)) + ) + } + }) + return Effect.void + } + + const streamEffect = ( + client: Client, + request: Request, + stream: Stream.Stream | Effect.Effect, any, Scope.Scope> + ) => { + let latch = client.latches.get(request.id) + if (supportsAck && !latch) { + latch = Effect.unsafeMakeLatch(false) + client.latches.set(request.id, latch) + } + if (Effect.isEffect(stream)) { + let done = false + return stream.pipe( + Effect.flatMap((mailbox) => + Effect.whileLoop({ + while: () => !done, + body: constant(Effect.flatMap(mailbox.takeAll, ([chunk, done_]) => { + done = done_ + if (!Chunk.isNonEmpty(chunk)) return Effect.void + const write = options.onFromServer({ + _tag: "Chunk", + clientId: client.id, + requestId: request.id, + values: Chunk.toReadonlyArray(chunk) + }) + if (!latch) return write + latch.unsafeClose() + return Effect.zipRight(write, latch.await) + })), + step: constVoid + }) + ), + Effect.scoped + ) + } + return Stream.runForEachChunk(stream, (chunk) => { + if (!Chunk.isNonEmpty(chunk)) return Effect.void + const write = options.onFromServer({ + _tag: "Chunk", + clientId: client.id, + requestId: request.id, + values: Chunk.toReadonlyArray(chunk) + }) + if (!latch) return write + latch.unsafeClose() + return Effect.zipRight(write, latch.await) + }) + } + + const sendDefect = (client: Client, defect: unknown) => + Effect.suspend(() => { + const shouldEnd = client.ended && client.fibers.size === 0 + const write = options.onFromServer({ + _tag: "Defect", + clientId: client.id, + defect + }) + if (!shouldEnd) return write + return Effect.zipRight(write, endClient(client)) + }) + + return identity>({ + write, + disconnect + }) +}) + +const applyMiddleware = ( + rpc: Rpc.AnyWithProps, + context: Context.Context, + payload: A, + headers: Headers.Headers, + handler: Effect.Effect +) => { + if (rpc.middlewares.size === 0) { + return handler + } + + const options = { + rpc, + payload, + headers + } + + for (const tag of rpc.middlewares) { + const middleware = Context.unsafeGet(context, tag) + if (tag.optional) { + const previous = handler + handler = Effect.matchEffect(middleware(options), { + onFailure: () => previous, + onSuccess: tag.provides !== undefined + ? (value) => Effect.provideService(previous, tag.provides as any, value) + : (_) => previous + }) + } else { + handler = tag.provides !== undefined + ? Effect.provideServiceEffect(handler, tag.provides as any, middleware(options)) + : Effect.zipRight(middleware(options), handler) + } + } + + return handler +} + +/** + * @since 1.0.0 + * @category server + */ +export const make: ( + group: RpcGroup.RpcGroup, + options?: + | { + readonly disableTracing?: boolean | undefined + readonly spanPrefix?: string | undefined + readonly concurrency?: number | "unbounded" | undefined + } + | undefined +) => Effect.Effect< + never, + never, + Protocol | Rpc.ToHandler | Rpc.Middleware +> = Effect.fnUntraced(function*( + group: RpcGroup.RpcGroup, + options?: { + readonly disableTracing?: boolean | undefined + readonly spanPrefix?: string | undefined + readonly concurrency?: number | "unbounded" | undefined + } +) { + const { disconnects, end, run, send, supportsAck, supportsSpanPropagation, supportsTransferables } = yield* Protocol + const context = yield* Effect.context | Rpc.Middleware>() + const scope = yield* Scope.make() + + const server = yield* makeNoSerialization(group, { + ...options, + disableClientAcks: !supportsAck, + disableSpanPropagation: !supportsSpanPropagation, + onFromServer(response): Effect.Effect { + const client = clients.get(response.clientId) + if (!client) return Effect.void + switch (response._tag) { + case "Chunk": { + const schemas = client.schemas.get(response.requestId) + if (!schemas) return Effect.void + return handleEncode( + client, + response.requestId, + schemas.collector, + Effect.provide(schemas.encodeChunk(response.values), schemas.context), + (values) => ({ _tag: "Chunk", requestId: response.requestId, values }) + ) + } + case "Exit": { + const schemas = client.schemas.get(response.requestId) + if (!schemas) return Effect.void + client.schemas.delete(response.requestId) + return handleEncode( + client, + response.requestId, + schemas.collector, + Effect.provide(schemas.encodeExit(response.exit), schemas.context), + (exit) => ({ _tag: "Exit", requestId: response.requestId, exit }) + ) + } + case "Defect": { + return sendDefect(client, response.defect) + } + case "ClientEnd": { + clients.delete(response.clientId) + return end(response.clientId) + } + } + } + }).pipe(Scope.extend(scope)) + + // handle disconnects + yield* Effect.fork(Effect.interruptible(Effect.whileLoop({ + while: constTrue, + body: constant(Effect.flatMap(disconnects.take, (clientId) => { + clients.delete(clientId) + return server.disconnect(clientId) + })), + step: constVoid + }))) + + type Schemas = { + readonly decode: (u: unknown) => Effect.Effect, ParseError> + readonly encodeChunk: (u: ReadonlyArray) => Effect.Effect, ParseError> + readonly encodeExit: (u: unknown) => Effect.Effect, ParseError> + readonly context: Context.Context + readonly collector?: Transferable.CollectorService | undefined + } + + const schemasCache = new WeakMap() + const getSchemas = (rpc: Rpc.AnyWithProps) => { + let schemas = schemasCache.get(rpc) + if (!schemas) { + const entry = context.unsafeMap.get(rpc.key) as Rpc.Handler + const streamSchemas = RpcSchema.getStreamSchemas(rpc.successSchema.ast) + const failures = new Set([rpc.errorSchema]) + if (Option.isSome(streamSchemas)) { + failures.add(streamSchemas.value.failure) + } + for (const middleware of rpc.middlewares) { + failures.add(middleware.failure) + } + schemas = { + decode: Schema.decodeUnknown(rpc.payloadSchema as any), + encodeChunk: Schema.encodeUnknown( + Schema.Array(Option.isSome(streamSchemas) ? streamSchemas.value.success : Schema.Any) + ) as any, + encodeExit: Schema.encodeUnknown(Rpc.exitSchema(rpc as any)) as any, + context: entry.context + } + schemasCache.set(rpc, schemas) + } + return schemas + } + + type Client = { + readonly id: number + readonly schemas: Map + } + const clients = new Map() + + const handleEncode = ( + client: Client, + requestId: RequestId, + collector: Transferable.CollectorService | undefined, + effect: Effect.Effect, + onSuccess: (a: A) => FromServerEncoded + ) => + (collector ? Effect.provideService(effect, Transferable.Collector, collector) : effect).pipe( + Effect.flatMap((a) => send(client.id, onSuccess(a), collector && collector.unsafeClear())), + Effect.catchAllCause((cause) => { + client.schemas.delete(requestId) + const defect = Cause.squash(Cause.map(cause, ArrayFormatter.formatErrorSync)) + return Effect.zipRight( + server.write(client.id, { _tag: "Interrupt", requestId, interruptors: [] }), + sendRequestDefect(client, requestId, defect) + ) + }) + ) + + const sendRequestDefect = (client: Client, requestId: RequestId, defect: unknown) => + Effect.catchAllCause( + send(client.id, { + _tag: "Exit", + requestId, + exit: { + _tag: "Failure", + cause: { + _tag: "Die", + defect + } + } + }), + (cause) => sendDefect(client, Cause.squash(cause)) + ) + + const sendDefect = (client: Client, defect: unknown) => + Effect.catchAllCause( + send(client.id, { _tag: "Defect", defect }), + (cause) => + Effect.annotateLogs(Effect.logDebug(cause), { + module: "RpcServer", + method: "sendDefect" + }) + ) + + // main server loop + return yield* run((clientId, request) => { + let client = clients.get(clientId) + if (!client) { + client = { + id: clientId, + schemas: new Map() + } + clients.set(clientId, client) + } + + switch (request._tag) { + case "Request": { + const tag = Predicate.hasProperty(request, "tag") ? request.tag as string : "" + const rpc = group.requests.get(tag) + if (!rpc) { + return sendDefect(client, `Unknown request tag: ${tag}`) + } + let requestId: RequestId + switch (typeof request.id) { + case "bigint": + case "string": { + requestId = RequestId(request.id) + break + } + default: { + return sendDefect(client, `Invalid request id: ${request.id}`) + } + } + const schemas = getSchemas(rpc as any) + return Effect.matchEffect( + Effect.provide(schemas.decode(request.payload), schemas.context), + { + onFailure: (error) => sendRequestDefect(client, requestId, ArrayFormatter.formatErrorSync(error)), + onSuccess: (payload) => { + client.schemas.set( + requestId, + supportsTransferables ? + { + ...schemas, + collector: Transferable.unsafeMakeCollector() + } : + schemas + ) + return server.write(clientId, { + ...request, + id: requestId, + payload, + headers: Headers.fromInput(request.headers) + } as any) + } + } + ) + } + case "Ping": { + return Effect.catchAllCause( + send(client.id, constPong), + (cause) => sendDefect(client, Cause.squash(cause)) + ) + } + case "Ack": + case "Eof": + case "Interrupt": { + if ("requestId" in request && typeof request.requestId === "string") { + ;(request as any).requestId = BigInt(request.requestId) + } + return server.write( + clientId, + request._tag === "Interrupt" ? + { + ...request, + interruptors: [] + } : + request + ) + } + default: { + return sendDefect(client, `Unknown request tag: ${(request as any)._tag}`) + } + } + }).pipe( + Effect.interruptible, + Effect.tapErrorCause((cause) => Effect.logFatal("BUG: RpcServer protocol crashed", cause)), + Effect.onExit((exit) => Scope.close(scope, exit)) + ) +}) + +/** + * @since 1.0.0 + * @category server + */ +export const layer = ( + group: RpcGroup.RpcGroup, + options?: { + readonly disableTracing?: boolean | undefined + readonly spanPrefix?: string | undefined + readonly concurrency?: number | "unbounded" | undefined + } +): Layer.Layer< + never, + never, + | Protocol + | Rpc.ToHandler + | Rpc.Middleware +> => Layer.scopedDiscard(Effect.forkScoped(Effect.interruptible(make(group, options)))) + +/** + * @since 1.0.0 + * @category protocol + */ +export class Protocol extends Context.Tag("@effect/rpc/RpcServer/Protocol") Effect.Effect + ) => Effect.Effect + readonly disconnects: Mailbox.ReadonlyMailbox + readonly send: ( + clientId: number, + response: FromServerEncoded, + transferables?: ReadonlyArray + ) => Effect.Effect + readonly end: (clientId: number) => Effect.Effect + readonly initialMessage: Effect.Effect> + readonly supportsAck: boolean + readonly supportsTransferables: boolean + readonly supportsSpanPropagation: boolean +}>() { + /** + * @since 1.0.0 + */ + static make = withRun() +} + +/** + * @since 1.0.0 + * @category protocol + */ +export const makeProtocolSocketServer = Effect.gen(function*() { + const server = yield* SocketServer.SocketServer + const { onSocket, protocol } = yield* makeSocketProtocol + yield* Effect.forkScoped(Effect.interruptible( + server.run(Effect.fnUntraced(onSocket, Effect.scoped)) + )) + return protocol +}) + +/** + * A rpc protocol that uses `SocketServer` for communication. + * + * @since 1.0.0 + * @category protocol + */ +export const layerProtocolSocketServer: Layer.Layer< + Protocol, + never, + RpcSerialization.RpcSerialization | SocketServer.SocketServer +> = Layer.scoped(Protocol, makeProtocolSocketServer) + +/** + * @since 1.0.0 + * @category protocol + */ +export const makeProtocolWithHttpAppWebsocket: Effect.Effect< + { + readonly protocol: Protocol["Type"] + readonly httpApp: HttpApp.Default + }, + never, + RpcSerialization.RpcSerialization +> = Effect.gen(function*() { + const { onSocket, protocol } = yield* makeSocketProtocol + + const httpApp: HttpApp.Default = Effect.gen(function*() { + const request = yield* HttpServerRequest.HttpServerRequest + const socket = yield* Effect.orDie(request.upgrade) + yield* onSocket(socket) + return HttpServerResponse.empty() + }) + + return { protocol, httpApp } as const +}) + +/** + * @since 1.0.0 + * @category protocol + */ +export const makeProtocolWebsocket: ( + options: { + readonly path: HttpRouter.PathInput + readonly routerTag?: Context.Tag> + } +) => Effect.Effect< + Protocol["Type"], + never, + RpcSerialization.RpcSerialization | I +> = Effect.fnUntraced(function*(options: { + readonly path: HttpRouter.PathInput + readonly routerTag?: Context.Tag> +}) { + const { httpApp, protocol } = yield* makeProtocolWithHttpAppWebsocket + const router = + yield* (options.routerTag ?? HttpRouter.Default as any as Context.Tag>) + yield* router.get(options.path, httpApp) + return protocol +}) + +/** + * A rpc protocol that uses websockets for communication. + * + * @since 1.0.0 + * @category protocol + */ +export const layerProtocolWebsocket = (options: { + readonly path: HttpRouter.PathInput + readonly routerTag?: HttpRouter.HttpRouter.TagClass +}): Layer.Layer => { + const routerTag = options.routerTag ?? + HttpRouter.Default as any as HttpRouter.HttpRouter.TagClass + return Layer.effect(Protocol, makeProtocolWebsocket(options)).pipe( + Layer.provide(routerTag.Live) + ) +} + +/** + * @since 1.0.0 + * @category protocol + */ +export const makeProtocolWithHttpApp: Effect.Effect< + { + readonly protocol: Protocol["Type"] + readonly httpApp: HttpApp.Default + }, + never, + RpcSerialization.RpcSerialization +> = Effect.gen(function*() { + const serialization = yield* RpcSerialization.RpcSerialization + const isJson = serialization.contentType === "application/json" + + const disconnects = yield* Mailbox.make() + let writeRequest!: (clientId: number, message: FromClientEncoded) => Effect.Effect + + let clientId = 0 + + const clients = new Map Effect.Effect + readonly end: Effect.Effect + }>() + + const httpApp: HttpApp.Default = Effect.gen(function*() { + const request = yield* HttpServerRequest.HttpServerRequest + const data = yield* Effect.orDie(request.arrayBuffer) + const id = clientId++ + const mailbox = yield* Mailbox.make() + const parser = serialization.unsafeMake() + const encoder = new TextEncoder() + + const offer = (data: Uint8Array | string) => + typeof data === "string" ? mailbox.offer(encoder.encode(data)) : mailbox.offer(data) + + clients.set(id, { + write: (response) => { + try { + if (!serialization.supportsBigInt) { + transformBigInt(response) + } + return isJson ? mailbox.offer(response) : offer(parser.encode(response)) + } catch (cause) { + return isJson + ? mailbox.offer(ResponseDefectEncoded(cause)) + : offer(parser.encode(ResponseDefectEncoded(cause))) + } + }, + end: mailbox.end + }) + + const requestIds: Array = [] + + try { + const decoded = parser.decode(new Uint8Array(data)) as ReadonlyArray + for (const message of decoded) { + if (message._tag === "Request") { + requestIds.push(RequestId(message.id)) + } + yield* writeRequest(id, message) + } + } catch (cause) { + yield* offer(parser.encode(ResponseDefectEncoded(cause))) + } + + yield* writeRequest(id, constEof) + + if (isJson) { + let done = false + yield* Effect.addFinalizer(() => { + clients.delete(id) + disconnects.unsafeOffer(id) + if (done) return Effect.void + return Effect.forEach( + requestIds, + (requestId) => writeRequest(id, { _tag: "Interrupt", requestId }), + { discard: true } + ) + }) + const responses = Arr.empty() + while (true) { + const [items, done] = yield* mailbox.takeAll + // eslint-disable-next-line no-restricted-syntax + responses.push(...items as any) + if (done) break + } + done = true + return HttpServerResponse.unsafeJson(responses) + } + + return HttpServerResponse.stream( + Stream.ensuringWith(Mailbox.toStream(mailbox as Mailbox.ReadonlyMailbox), (exit) => { + clients.delete(id) + disconnects.unsafeOffer(id) + if (!Exit.isInterrupted(exit)) return Effect.void + return Effect.forEach( + requestIds, + (requestId) => writeRequest(id, { _tag: "Interrupt", requestId }), + { discard: true } + ) + }), + { contentType: serialization.contentType } + ) + }).pipe(Effect.interruptible) + + const protocol = yield* Protocol.make((writeRequest_) => { + writeRequest = writeRequest_ + return Effect.succeed({ + disconnects, + send: (clientId, response) => { + const client = clients.get(clientId) + if (!client) return Effect.void + return client.write(response) + }, + end(clientId) { + const client = clients.get(clientId) + if (!client) return Effect.void + return client.end + }, + initialMessage: Effect.succeedNone, + supportsAck: false, + supportsTransferables: false, + supportsSpanPropagation: false + }) + }) + + return { protocol, httpApp } as const +}) + +/** + * @since 1.0.0 + * @category protocol + */ +export const makeProtocolHttp = Effect.fnUntraced(function*(options: { + readonly path: HttpRouter.PathInput + readonly routerTag?: HttpRouter.HttpRouter.TagClass +}) { + const { httpApp, protocol } = yield* makeProtocolWithHttpApp + const router = + yield* (options.routerTag ?? HttpRouter.Default as any as HttpRouter.HttpRouter.TagClass) + yield* router.post(options.path, httpApp) + return protocol +}) + +/** + * @since 1.0.0 + * @category protocol + */ +export const makeProtocolWorkerRunner: Effect.Effect< + Protocol["Type"], + WorkerError, + WorkerRunner.PlatformRunner | Scope.Scope +> = Protocol.make(Effect.fnUntraced(function*(writeRequest) { + const fiber = yield* Effect.withFiberRuntime>(Effect.succeed as any) + const runner = yield* WorkerRunner.PlatformRunner + const closeLatch = yield* WorkerRunner.CloseLatch + const backing = yield* runner.start(closeLatch) + const initialMessage = yield* Deferred.make() + + yield* Deferred.await(closeLatch).pipe( + Effect.onExit(() => { + fiber.currentScheduler.scheduleTask(() => fiber.unsafeInterruptAsFork(fiber.id()), 0) + return Effect.void + }), + Effect.forkScoped + ) + + yield* backing.run((clientId, message) => { + if (message._tag === "InitialMessage") { + return Deferred.succeed(initialMessage, message.value) + } + return writeRequest(clientId, message) + }) + + return { + disconnects: backing.disconnects ?? (yield* Mailbox.make()), + send: backing.send, + end(_clientId) { + return Effect.void + }, + initialMessage: Effect.asSome(Deferred.await(initialMessage)), + supportsAck: true, + supportsTransferables: true, + supportsSpanPropagation: true + } +})) + +/** + * @since 1.0.0 + * @category protocol + */ +export const layerProtocolWorkerRunner: Layer.Layer< + Protocol, + WorkerError, + WorkerRunner.PlatformRunner +> = Layer.scoped(Protocol, makeProtocolWorkerRunner) + +/** + * A rpc protocol that uses streaming http for communication. + * + * @since 1.0.0 + * @category protocol + */ +export const layerProtocolHttp = (options: { + readonly path: HttpRouter.PathInput + readonly routerTag?: HttpRouter.HttpRouter.TagClass +}): Layer.Layer => { + const routerTag = options.routerTag ?? + HttpRouter.Default as any as HttpRouter.HttpRouter.TagClass + return Layer.effect(Protocol, makeProtocolHttp(options)).pipe( + Layer.provide(routerTag.Live) + ) +} + +/** + * @since 1.0.0 + * @category http app + */ +export const toHttpApp: ( + group: RpcGroup.RpcGroup, + options?: { + readonly disableTracing?: boolean | undefined + readonly spanPrefix?: string | undefined + } | undefined +) => Effect.Effect< + HttpApp.Default, + never, + | Scope.Scope + | RpcSerialization.RpcSerialization + | Rpc.ToHandler + | Rpc.Middleware +> = Effect.fnUntraced(function*( + group: RpcGroup.RpcGroup, + options?: { + readonly disableTracing?: boolean | undefined + readonly spanPrefix?: string | undefined + } +) { + const { httpApp, protocol } = yield* makeProtocolWithHttpApp + yield* make(group, options).pipe( + Effect.provideService(Protocol, protocol), + Effect.interruptible, + Effect.forkScoped + ) + return httpApp +}) + +/** + * @since 1.0.0 + * @category http app + */ +export const toHttpAppWebsocket: ( + group: RpcGroup.RpcGroup, + options?: { + readonly disableTracing?: boolean | undefined + readonly spanPrefix?: string | undefined + } | undefined +) => Effect.Effect< + HttpApp.Default, + never, + | Scope.Scope + | RpcSerialization.RpcSerialization + | Rpc.ToHandler + | Rpc.Middleware +> = Effect.fnUntraced(function*( + group: RpcGroup.RpcGroup, + options?: { + readonly disableTracing?: boolean | undefined + readonly spanPrefix?: string | undefined + } +) { + const { httpApp, protocol } = yield* makeProtocolWithHttpAppWebsocket + yield* make(group, options).pipe( + Effect.provideService(Protocol, protocol), + Effect.interruptible, + Effect.forkScoped + ) + return httpApp +}) + +/** + * Construct an http web handler from an `RpcGroup`. + * + * @since 1.0.0 + * @category constructors + */ +export const toWebHandler = ( + group: RpcGroup.RpcGroup, + options: { + readonly layer: Layer.Layer< + | Rpc.ToHandler + | Rpc.Middleware + | RpcSerialization.RpcSerialization + | HttpRouter.HttpRouter.DefaultServices, + LE + > + readonly disableTracing?: boolean | undefined + readonly spanPrefix?: string | undefined + readonly middleware?: ( + httpApp: HttpApp.Default + ) => HttpApp.Default< + never, + HttpRouter.HttpRouter.DefaultServices + > + readonly memoMap?: Layer.MemoMap + } +): { + readonly handler: (request: globalThis.Request, context?: Context.Context | undefined) => Promise + readonly dispose: () => Promise +} => { + const runtime = ManagedRuntime.make(Layer.mergeAll(options.layer, Layer.scope), options?.memoMap) + let handlerCached: + | ((request: globalThis.Request, context?: Context.Context | undefined) => Promise) + | undefined + const handlerPromise = Effect.gen(function*() { + const app = yield* toHttpApp(group, options) + const rt = yield* runtime.runtimeEffect + const handler = HttpApp.toWebHandlerRuntime(rt)(options?.middleware ? options.middleware(app as any) as any : app) + handlerCached = handler + return handler + }).pipe(runtime.runPromise) + function handler(request: globalThis.Request, context?: Context.Context | undefined): Promise { + if (handlerCached !== undefined) { + return handlerCached(request, context) + } + return handlerPromise.then((handler) => handler(request, context)) + } + return { handler, dispose: runtime.dispose } as const +} + +// internal + +const makeSocketProtocol = Effect.gen(function*() { + const serialization = yield* RpcSerialization.RpcSerialization + const disconnects = yield* Mailbox.make() + + let clientId = 0 + const clients = new Map Effect.Effect + }>() + + let writeRequest!: (clientId: number, message: FromClientEncoded) => Effect.Effect + + const onSocket = function*(socket: Socket.Socket) { + const scope = yield* Effect.scope + const parser = serialization.unsafeMake() + const id = clientId++ + yield* Scope.addFinalizerExit(scope, () => { + clients.delete(id) + return disconnects.offer(id) + }) + + const writeRaw = yield* socket.writer + const write = (response: FromServerEncoded) => { + try { + if (!serialization.supportsBigInt) { + transformBigInt(response) + } + return Effect.orDie(writeRaw(parser.encode(response))) + } catch (cause) { + return Effect.orDie( + writeRaw(parser.encode(ResponseDefectEncoded(cause))) + ) + } + } + clients.set(id, { write }) + + yield* Effect.orDie(Effect.interruptible(socket.runRaw((data) => { + try { + const decoded = parser.decode(data) as ReadonlyArray + if (decoded.length === 0) return Effect.void + let i = 0 + return Effect.whileLoop({ + while: () => i < decoded.length, + body: () => writeRequest(id, decoded[i++]), + step: constVoid + }) + } catch (cause) { + return writeRaw(parser.encode(ResponseDefectEncoded(cause))) + } + }))) + } + + const protocol = yield* Protocol.make((writeRequest_) => { + writeRequest = writeRequest_ + return Effect.succeed({ + disconnects, + send: (clientId, response) => { + const client = clients.get(clientId) + if (!client) return Effect.void + return Effect.orDie(client.write(response)) + }, + end(_clientId) { + return Effect.void + }, + initialMessage: Effect.succeedNone, + supportsAck: true, + supportsTransferables: false, + supportsSpanPropagation: true + }) + }) + + return { protocol, onSocket } as const +}) + +const transformBigInt = (response: FromServerEncoded) => { + if ("requestId" in response) { + ;(response as any).requestId = response.requestId.toString() + } +} diff --git a/packages/rpc/src/RpcTest.ts b/packages/rpc/src/RpcTest.ts new file mode 100644 index 00000000000..a4e6bca0a87 --- /dev/null +++ b/packages/rpc/src/RpcTest.ts @@ -0,0 +1,38 @@ +/** + * @since 1.0.0 + */ +import * as Effect from "effect/Effect" +import type * as Scope from "effect/Scope" +import type * as Rpc from "./Rpc.js" +import * as RpcClient from "./RpcClient.js" +import type * as RpcGroup from "./RpcGroup.js" +import * as RpcServer from "./RpcServer.js" + +/** + * @since 1.0.0 + * @category constructors + */ +export const makeClient: ( + group: RpcGroup.RpcGroup +) => Effect.Effect< + RpcClient.RpcClient, + never, + Scope.Scope | Rpc.ToHandler | Rpc.Middleware | Rpc.MiddlewareClient +> = Effect.fnUntraced(function*( + group: RpcGroup.RpcGroup +) { + // eslint-disable-next-line prefer-const + let client!: Effect.Effect.Success>> + const server = yield* RpcServer.makeNoSerialization(group, { + onFromServer(response) { + return client.write(response) + } + }) + client = yield* RpcClient.makeNoSerialization(group, { + supportsAck: true, + onFromClient({ message }) { + return server.write(0, message) + } + }) + return client.client +}) diff --git a/packages/rpc/src/RpcWorker.ts b/packages/rpc/src/RpcWorker.ts new file mode 100644 index 00000000000..ec08fa8bedf --- /dev/null +++ b/packages/rpc/src/RpcWorker.ts @@ -0,0 +1,90 @@ +/** + * @since 1.0.0 + */ +import * as Transferable from "@effect/platform/Transferable" +import type { NoSuchElementException } from "effect/Cause" +import * as Context from "effect/Context" +import * as Effect from "effect/Effect" +import * as Layer from "effect/Layer" +import type { ParseError } from "effect/ParseResult" +import * as Schema from "effect/Schema" +import type { Protocol } from "./RpcServer.js" + +/** + * @since 1.0.0 + * @category initial message + */ +export class InitialMessage extends Context.Tag("@effect/rpc/RpcWorker/InitialMessage")< + InitialMessage, + Effect.Effect< + readonly [ + data: unknown, + transfers: ReadonlyArray + ] + > +>() {} + +/** + * @since 1.0.0 + * @category initial message + */ +export declare namespace InitialMessage { + /** + * @since 1.0.0 + * @category initial message + */ + export interface Encoded { + readonly _tag: "InitialMessage" + readonly value: unknown + } +} + +const ProtocolTag: typeof Protocol = Context.GenericTag("@effect/rpc/RpcServer/Protocol") as any + +/** + * @since 1.0.0 + * @category initial message + */ +export const makeInitialMessage = ( + schema: Schema.Schema, + effect: Effect.Effect +): Effect.Effect< + readonly [data: unknown, transferables: ReadonlyArray], + E | ParseError, + R | R2 +> => + Effect.flatMap(effect, (value) => { + const collector = Transferable.unsafeMakeCollector() + return Schema.encode(schema)(value).pipe( + Effect.provideService(Transferable.Collector, collector), + Effect.map((encoded) => [encoded, collector.unsafeClear()] as const) + ) + }) + +/** + * @since 1.0.0 + * @category initial message + */ +export const layerInitialMessage = ( + schema: Schema.Schema, + build: Effect.Effect +): Layer.Layer => + Layer.effect( + InitialMessage, + Effect.contextWith((context: Context.Context) => + Effect.provide(Effect.orDie(makeInitialMessage(schema, build)), context) + ) + ) + +/** + * @since 1.0.0 + * @category initial message + */ +export const initialMessage = ( + schema: Schema.Schema +): Effect.Effect => + ProtocolTag.pipe( + Effect.flatMap((protocol) => protocol.initialMessage), + Effect.flatten, + Effect.flatMap(Schema.decodeUnknown(schema)) + ) diff --git a/packages/rpc/src/index.ts b/packages/rpc/src/index.ts index 56a86163a9d..3b352e71a7b 100644 --- a/packages/rpc/src/index.ts +++ b/packages/rpc/src/index.ts @@ -6,14 +6,44 @@ export * as Rpc from "./Rpc.js" /** * @since 1.0.0 */ -export * as RpcResolver from "./RpcResolver.js" +export * as RpcClient from "./RpcClient.js" /** * @since 1.0.0 */ -export * as RpcResolverNoStream from "./RpcResolverNoStream.js" +export * as RpcGroup from "./RpcGroup.js" /** * @since 1.0.0 */ -export * as RpcRouter from "./RpcRouter.js" +export * as RpcMessage from "./RpcMessage.js" + +/** + * @since 1.0.0 + */ +export * as RpcMiddleware from "./RpcMiddleware.js" + +/** + * @since 1.0.0 + */ +export * as RpcSchema from "./RpcSchema.js" + +/** + * @since 1.0.0 + */ +export * as RpcSerialization from "./RpcSerialization.js" + +/** + * @since 1.0.0 + */ +export * as RpcServer from "./RpcServer.js" + +/** + * @since 1.0.0 + */ +export * as RpcTest from "./RpcTest.js" + +/** + * @since 1.0.0 + */ +export * as RpcWorker from "./RpcWorker.js" diff --git a/packages/rpc/src/internal/rpc.ts b/packages/rpc/src/internal/rpc.ts deleted file mode 100644 index 79e5467f6b7..00000000000 --- a/packages/rpc/src/internal/rpc.ts +++ /dev/null @@ -1,61 +0,0 @@ -import type * as Headers from "@effect/platform/Headers" -import * as Equal from "effect/Equal" -import * as Hash from "effect/Hash" -import * as PrimaryKey from "effect/PrimaryKey" -import * as Request from "effect/Request" -import * as Schema from "effect/Schema" -import type * as Rpc from "../Rpc.js" - -/** @internal */ -export const withRequestTag = ( - f: ( - request: Schema.SerializableWithResult - ) => A -) => { - const cache = new Map() - return (request: Schema.TaggedRequest.All): A => { - let result = cache.get(request._tag) - if (result !== undefined) { - return result - } - result = f(request as any) - cache.set(request._tag, result) - return result - } -} - -/** @internal */ -export const StreamRequestTypeId: Rpc.StreamRequestTypeId = Symbol.for( - "@effect/rpc/Rpc/StreamRequest" -) as Rpc.StreamRequestTypeId - -/** @internal */ -export const makeRequest = ( - options: { - readonly request: A - readonly traceId: string - readonly spanId: string - readonly sampled: boolean - readonly headers: Headers.Headers - } -): Rpc.Request => { - const isStream = StreamRequestTypeId in options.request - const hash = Hash.hash(options.request) - return ({ - ...options, - [Request.RequestTypeId]: undefined as any, - [PrimaryKey.symbol]: () => `${options.request._tag}:${hash}`, - [Schema.symbolWithResult]: { - success: isStream - ? Schema.Never - : Schema.successSchema(options.request as any), - failure: isStream ? Schema.Never : Schema.failureSchema(options.request as any) - }, - [Equal.symbol](that: Rpc.Request) { - return Equal.equals(options.request, that.request) - }, - [Hash.symbol]() { - return hash - } - } as Rpc.Request) -} diff --git a/packages/rpc/src/internal/utils.ts b/packages/rpc/src/internal/utils.ts new file mode 100644 index 00000000000..7ce829c25b4 --- /dev/null +++ b/packages/rpc/src/internal/utils.ts @@ -0,0 +1,37 @@ +import type * as Context from "effect/Context" +import * as Effect from "effect/Effect" + +/** @internal */ +export const withRun = < + A extends { + readonly run: (f: (...args: Array) => Effect.Effect) => Effect.Effect + } +>() => +(f: (write: Parameters[0]) => Effect.Effect, EX, RX>): Effect.Effect => + Effect.suspend(() => { + const semaphore = Effect.unsafeMakeSemaphore(1) + let buffer: Array<[Array, Context.Context]> = [] + let write = (...args: Array): Effect.Effect => + Effect.contextWith((context) => { + buffer.push([args, context]) + }) + return Effect.map(f((...args) => write(...args)), (a) => ({ + ...a, + run(f) { + return semaphore.withPermits(1)(Effect.gen(function*() { + const prev = write + write = f + + for (const [args, context] of buffer) { + yield* Effect.provide(write(...args), context) + } + buffer = [] + + return yield* Effect.onExit(Effect.never, () => { + write = prev + return Effect.void + }) + })) + } + } as A)) + }) diff --git a/packages/rpc/test/Router.test.ts b/packages/rpc/test/Router.test.ts deleted file mode 100644 index 9745c7023ff..00000000000 --- a/packages/rpc/test/Router.test.ts +++ /dev/null @@ -1,403 +0,0 @@ -import { RpcResolver, RpcResolverNoStream, RpcRouter } from "@effect/rpc" -import * as Rpc from "@effect/rpc/Rpc" -import { assert, describe, expect, it, test } from "@effect/vitest" -import * as Array from "effect/Array" -import * as Chunk from "effect/Chunk" -import * as Context from "effect/Context" -import * as Effect from "effect/Effect" -import { flow, pipe } from "effect/Function" -import * as Schema from "effect/Schema" -import * as Stream from "effect/Stream" - -interface Name { - readonly _: unique symbol -} -const Name = Context.GenericTag("Name") - -class SomeError extends Schema.TaggedError()("SomeError", { - message: Schema.String -}) {} - -class Post extends Schema.Class("Post")({ - id: Schema.Number, - body: Schema.String -}) {} - -class CreatePost extends Schema.TaggedRequest()("CreatePost", { - failure: Schema.Never, - success: Post, - payload: { - body: Schema.String - } -}) {} - -const posts = RpcRouter.make( - Rpc.effect(CreatePost, ({ body }) => Effect.succeed(new Post({ id: 1, body }))) -) - -class Greet extends Schema.TaggedRequest()("Greet", { - failure: Schema.Never, - success: Schema.String, - payload: { - name: Schema.String - } -}) {} - -class Fail extends Schema.TaggedRequest()("Fail", { - failure: SomeError, - success: Schema.Void, - payload: { - name: Schema.String - } -}) {} - -class FailNoInput - extends Schema.TaggedRequest()("FailNoInput", { failure: SomeError, success: Schema.Void, payload: {} }) -{} - -class EncodeInput extends Schema.TaggedRequest()("EncodeInput", { - failure: Schema.Never, - success: Schema.Date, - payload: { - date: Schema.Date - } -}) {} - -class EncodeDate extends Schema.TaggedRequest()("EncodeDate", { - failure: SomeError, - success: Schema.Date, - payload: { - date: Schema.String - } -}) {} - -class Refined extends Schema.TaggedRequest()("Refined", { - failure: Schema.Never, - success: Schema.Number, - payload: { - number: pipe(Schema.Number, Schema.int(), Schema.greaterThan(10)) - } -}) {} - -class SpanName - extends Schema.TaggedRequest()("SpanName", { failure: Schema.Never, success: Schema.String, payload: {} }) -{} - -class GetName - extends Schema.TaggedRequest()("GetName", { failure: Schema.Never, success: Schema.String, payload: {} }) -{} - -class EchoHeaders extends Schema.TaggedRequest()("EchoHeaders", { - failure: Schema.Never, - success: Schema.Record({ key: Schema.String, value: Schema.Union(Schema.String, Schema.Undefined) }), - payload: {} -}) {} - -class Counts extends Rpc.StreamRequest()( - "Counts", - { failure: Schema.Never, success: Schema.Number, payload: {} } -) {} - -class FailStream extends Rpc.StreamRequest()( - "FailStream", - { failure: SomeError, success: Schema.Number, payload: {} } -) {} - -const router = RpcRouter.make( - posts, - Rpc.effect(Greet, ({ name }) => Effect.succeed(`Hello, ${name}!`)), - Rpc.effect(Fail, () => - new SomeError({ - message: "fail" - })), - Rpc.effect(FailNoInput, () => new SomeError({ message: "fail" })), - Rpc.effect(EncodeInput, ({ date }) => Effect.succeed(date)), - Rpc.effect(EncodeDate, ({ date }) => - Effect.try({ - try: () => new Date(date), - catch: () => new SomeError({ message: "fail" }) - })), - Rpc.effect(Refined, ({ number }) => Effect.succeed(number)), - Rpc.effect(SpanName, () => - Effect.currentSpan.pipe( - Effect.map((span) => span.name), - Effect.orDie - )), - Rpc.effect(GetName, () => Name), - Rpc.stream(Counts, () => - Stream.make(1, 2, 3, 4, 5).pipe( - Stream.tap((_) => Effect.sleep(10)) - )), - Rpc.effect(EchoHeaders, () => - Rpc.schemaHeaders(Schema.Struct({ - foo: Schema.String, - baz: Schema.optional(Schema.String) - })).pipe(Effect.orDie)), - Rpc.stream(FailStream, () => - Stream.range(0, 10).pipe( - Stream.mapEffect((i) => i === 3 ? Effect.fail(new SomeError({ message: "fail" })) : Effect.succeed(i)) - )) -).pipe( - RpcRouter.provideService(Name, "John") -) - -const handler = RpcRouter.toHandler(router) -const handlerEffect = RpcRouter.toHandlerNoStream(router) -const handlerUndecoded = RpcRouter.toHandlerUndecoded(router) -const handlerArray = (u: ReadonlyArray) => - handler(u.map((request, i) => ({ - request, - traceId: "traceId", - spanId: `spanId${i}`, - sampled: true, - headers: {} - }))).pipe( - Stream.runCollect, - Effect.map(flow( - Array.fromIterable, - Array.map(([, response]) => response), - Array.filter((_): _ is Schema.ExitEncoded => Array.isArray(_) === false) - )) - ) -const handlerEffectArray = (u: ReadonlyArray) => - handlerEffect(u.map((request, i) => ({ - request, - traceId: "traceId", - spanId: `spanId${i}`, - sampled: true, - headers: {} - }))) -const resolver = RpcResolver.make(handler)() -const resolverEffect = RpcResolverNoStream.make(handlerEffect)() -const resolverWithHeaders = RpcResolver.annotateHeadersEffect( - resolver, - Effect.succeed({ - BAZ: "qux" - }) -) -const client = RpcResolver.toClient(resolver) - -describe("Router", () => { - it("handler/", async () => { - const date = new Date() - const result = await Effect.runPromise( - handlerArray([ - { _tag: "Greet", name: "John" }, - { _tag: "Fail", name: "" }, - { _tag: "FailNoInput" }, - { _tag: "EncodeInput", date: date.toISOString() }, - { _tag: "EncodeDate", date: date.toISOString() }, - { _tag: "Refined", number: 11 }, - { _tag: "CreatePost", body: "hello" }, - { _tag: "SpanName" }, - { _tag: "GetName" } - ]) - ) - - assert.deepStrictEqual(result, [{ - _tag: "Success", - value: "Hello, John!" - }, { - _tag: "Failure", - cause: { _tag: "Fail", error: { _tag: "SomeError", message: "fail" } } - }, { - _tag: "Failure", - cause: { _tag: "Fail", error: { _tag: "SomeError", message: "fail" } } - }, { - _tag: "Success", - value: date.toISOString() - }, { - _tag: "Success", - value: date.toISOString() - }, { - _tag: "Success", - value: 11 - }, { - _tag: "Success", - value: { - id: 1, - body: "hello" - } - }, { - _tag: "Success", - value: "Rpc.router SpanName" - }, { - _tag: "Success", - value: "John" - }]) - }) - - it("handlerEffect", async () => { - const date = new Date() - const result = await Effect.runPromise( - handlerEffectArray([ - { _tag: "Greet", name: "John" }, - { _tag: "Fail", name: "" }, - { _tag: "FailNoInput" }, - { _tag: "EncodeInput", date: date.toISOString() }, - { _tag: "EncodeDate", date: date.toISOString() }, - { _tag: "Refined", number: 11 }, - { _tag: "CreatePost", body: "hello" }, - { _tag: "SpanName" }, - { _tag: "GetName" } - ]) - ) - - assert.deepStrictEqual(result, [{ - _tag: "Success", - value: "Hello, John!" - }, { - _tag: "Failure", - cause: { _tag: "Fail", error: { _tag: "SomeError", message: "fail" } } - }, { - _tag: "Failure", - cause: { _tag: "Fail", error: { _tag: "SomeError", message: "fail" } } - }, { - _tag: "Success", - value: date.toISOString() - }, { - _tag: "Success", - value: date.toISOString() - }, { - _tag: "Success", - value: 11 - }, { - _tag: "Success", - value: { - id: 1, - body: "hello" - } - }, { - _tag: "Success", - value: "Rpc.router SpanName" - }, { - _tag: "Success", - value: "John" - }]) - }) - - it("stream", async () => { - const result = await Effect.runPromise( - handler([{ - request: { _tag: "Counts" }, - traceId: "traceId", - spanId: "spanId", - sampled: true, - headers: {} - }]).pipe( - Stream.runCollect, - Effect.map(Chunk.toReadonlyArray) - ) - ) - expect(result.length).toEqual(6) - assert.deepStrictEqual(result, [ - [0, [{ _tag: "Success", value: 1 }]], - [0, [{ _tag: "Success", value: 2 }]], - [0, [{ _tag: "Success", value: 3 }]], - [0, [{ _tag: "Success", value: 4 }]], - [0, [{ _tag: "Success", value: 5 }]], - [0, [{ _tag: "Failure", cause: { _tag: "Empty" } }]] - ]) - }) - - it("handlerEffect/ stream", async () => { - const result = await Effect.runPromise( - handlerEffect([{ - request: { _tag: "Counts" }, - traceId: "traceId", - spanId: "spanId", - sampled: true, - headers: {} - }]) - ) - assert.deepStrictEqual( - result, - [[ - { _tag: "Success", value: 1 }, - { _tag: "Success", value: 2 }, - { _tag: "Success", value: 3 }, - { _tag: "Success", value: 4 }, - { _tag: "Success", value: 5 } - ]] as any - ) - }) - - test("handlerUndecoded", () => - Effect.gen(function*(_) { - const result = yield* _( - handlerUndecoded(new CreatePost({ body: "hello" })) - ) - assert.deepStrictEqual(result, { - id: 1, - body: "hello" - }) - }).pipe(Effect.runPromise)) -}) - -describe.each([{ - name: "Resolver.make", - resolver -}, { - name: "Resolver.makeEffect", - resolver: resolverEffect -}])("$name", ({ resolver }) => { - test("effect", () => - Effect.gen(function*(_) { - const name = yield* _(Rpc.call(new SpanName(), resolver)) - assert.strictEqual(name, "Rpc.router SpanName") - - const clientName = yield* _(client(new SpanName())) - assert.strictEqual(clientName, "Rpc.router SpanName") - }).pipe(Effect.runPromise)) - - test("headers", () => - Effect.gen(function*(_) { - const headers = yield* _( - Rpc.call(new EchoHeaders(), resolver), - Rpc.annotateHeaders({ FOO: "bar" }) - ) - assert.deepStrictEqual(headers, { foo: "bar" }) - }).pipe(Effect.runPromise)) - - test("annotateHeadersEffect", () => - Effect.gen(function*(_) { - const headers = yield* _( - Rpc.call(new EchoHeaders(), resolverWithHeaders), - Rpc.annotateHeaders({ FOO: "bar" }) - ) - assert.deepStrictEqual(headers, { foo: "bar", baz: "qux" }) - }).pipe(Effect.tapErrorCause(Effect.logError), Effect.runPromise)) - - test("stream", () => - Effect.gen(function*(_) { - const counts = yield* _( - Rpc.call(new Counts(), resolver), - Stream.runCollect, - Effect.map(Chunk.toReadonlyArray) - ) - assert.deepStrictEqual(counts, [ - 1, - 2, - 3, - 4, - 5 - ]) - }).pipe(Effect.runPromise)) - - test("stream fail", () => - Effect.gen(function*(_) { - let n = 0 - const result = yield* _( - Rpc.call(new FailStream(), resolver), - Stream.tap((i) => - Effect.sync(() => { - n = i - }) - ), - Stream.runCollect, - Effect.flip - ) - assert.strictEqual(n, 2) - assert.deepStrictEqual(result, new SomeError({ message: "fail" })) - }).pipe(Effect.runPromise)) -}) diff --git a/packages/rpc/test/RpcServer.test.ts b/packages/rpc/test/RpcServer.test.ts new file mode 100644 index 00000000000..c6d0d7a1ca5 --- /dev/null +++ b/packages/rpc/test/RpcServer.test.ts @@ -0,0 +1,113 @@ +import { HttpClient, HttpClientRequest, HttpRouter, HttpServer, SocketServer } from "@effect/platform" +import { NodeHttpServer, NodeSocket, NodeSocketServer } from "@effect/platform-node" +import { RpcClient, RpcSerialization, RpcServer } from "@effect/rpc" +import { assert, describe, it } from "@effect/vitest" +import { Effect, Layer } from "effect" +import { e2eSuite } from "./e2e.js" +import { RpcLive, User, UsersClient } from "./fixtures/schemas.js" + +describe("RpcServer", () => { + // http ndjson + const HttpNdjsonServer = HttpRouter.Default.serve().pipe( + Layer.provide(RpcLive), + Layer.provideMerge(RpcServer.layerProtocolHttp({ path: "/rpc" })) + ) + const HttpNdjsonClient = UsersClient.layer.pipe( + Layer.provide( + RpcClient.layerProtocolHttp({ + url: "", + transformClient: HttpClient.mapRequest(HttpClientRequest.appendUrl("/rpc")) + }) + ) + ) + e2eSuite( + "e2e http ndjson", + HttpNdjsonClient.pipe( + Layer.provideMerge(HttpNdjsonServer), + Layer.provide([NodeHttpServer.layerTest, RpcSerialization.layerNdjson]) + ) + ) + e2eSuite( + "e2e http msgpack", + HttpNdjsonClient.pipe( + Layer.provideMerge(HttpNdjsonServer), + Layer.provide([NodeHttpServer.layerTest, RpcSerialization.layerMsgPack]) + ) + ) + + // websocket + const HttpWsServer = HttpRouter.Default.serve().pipe( + Layer.provide(RpcLive), + Layer.provideMerge(RpcServer.layerProtocolWebsocket({ path: "/rpc" })) + ) + const HttpWsClient = UsersClient.layer.pipe( + Layer.provide(RpcClient.layerProtocolSocket), + Layer.provide( + Effect.gen(function*() { + const server = yield* HttpServer.HttpServer + const address = server.address as HttpServer.TcpAddress + return NodeSocket.layerWebSocket(`http://127.0.0.1:${address.port}/rpc`) + }).pipe(Layer.unwrapEffect) + ) + ) + e2eSuite( + "e2e ws ndjson", + HttpWsClient.pipe( + Layer.provideMerge(HttpWsServer), + Layer.provide([NodeHttpServer.layerTest, RpcSerialization.layerNdjson]) + ) + ) + e2eSuite( + "e2e ws json", + HttpWsClient.pipe( + Layer.provideMerge(HttpWsServer), + Layer.provide([NodeHttpServer.layerTest, RpcSerialization.layerJson]) + ) + ) + e2eSuite( + "e2e ws msgpack", + HttpWsClient.pipe( + Layer.provideMerge(HttpWsServer), + Layer.provide([NodeHttpServer.layerTest, RpcSerialization.layerMsgPack]) + ) + ) + + // tcp + const TcpServer = RpcLive.pipe( + Layer.provideMerge(RpcServer.layerProtocolSocketServer), + Layer.provideMerge(NodeSocketServer.layer({ port: 0 })) + ) + const TcpClient = UsersClient.layer.pipe( + Layer.provide(RpcClient.layerProtocolSocket), + Layer.provide( + Effect.gen(function*() { + const server = yield* SocketServer.SocketServer + const address = server.address as SocketServer.TcpAddress + return NodeSocket.layerNet({ port: address.port }) + }).pipe(Layer.unwrapEffect) + ) + ) + e2eSuite( + "e2e tcp ndjson", + TcpClient.pipe( + Layer.provideMerge(TcpServer), + Layer.provide([NodeHttpServer.layerTest, RpcSerialization.layerNdjson]) + ) + ) + e2eSuite( + "e2e tcp msgpack", + TcpClient.pipe( + Layer.provideMerge(TcpServer), + Layer.provide([NodeHttpServer.layerTest, RpcSerialization.layerMsgPack]) + ) + ) + + describe("RpcTest", () => { + it.effect("works", () => + Effect.gen(function*() { + const client = yield* UsersClient + const user = yield* client.GetUser({ id: "1" }) + assert.deepStrictEqual(user, new User({ id: "1", name: "Logged in user" })) + }).pipe(Effect.provide(UsersClient.layerTest))) + }) +}) diff --git a/packages/rpc/test/RpcWorker.test.ts b/packages/rpc/test/RpcWorker.test.ts new file mode 100644 index 00000000000..a7f35547cc7 --- /dev/null +++ b/packages/rpc/test/RpcWorker.test.ts @@ -0,0 +1,21 @@ +// @vitest-environment happy-dom +import "@vitest/web-worker" + +import * as BrowserWorker from "@effect/platform-browser/BrowserWorker" +import { RpcServer } from "@effect/rpc" +import * as RpcClient from "@effect/rpc/RpcClient" +import { describe } from "@effect/vitest" +import { Layer } from "effect" +import { e2eSuite } from "./e2e.js" +import { UsersClient } from "./fixtures/schemas.js" + +describe("RpcWorker", () => { + const WorkerClient = UsersClient.layer.pipe( + Layer.provide(RpcClient.layerProtocolWorker({ size: 1 })), + Layer.provide(BrowserWorker.layerPlatform(() => new Worker(new URL("./fixtures/worker.ts", import.meta.url)))), + Layer.merge(Layer.succeed(RpcServer.Protocol, { + supportsAck: true + } as any)) + ) + e2eSuite("e2e worker", WorkerClient, false) +}) diff --git a/packages/rpc/test/e2e.ts b/packages/rpc/test/e2e.ts new file mode 100644 index 00000000000..8edd546c1ea --- /dev/null +++ b/packages/rpc/test/e2e.ts @@ -0,0 +1,97 @@ +import { RpcClient, RpcServer } from "@effect/rpc" +import { assert, describe, it } from "@effect/vitest" +import type { Layer } from "effect" +import { Cause, Effect, Fiber, Stream } from "effect" +import { User, UsersClient } from "./fixtures/schemas.js" + +export const e2eSuite = ( + name: string, + layer: Layer.Layer, + concurrent = true +) => { + describe(name, { concurrent }, () => { + it.effect("should get user", () => + Effect.gen(function*() { + const client = yield* UsersClient + const user = yield* client.GetUser({ id: "1" }) + assert.instanceOf(user, User) + assert.deepStrictEqual(user, new User({ id: "1", name: "Logged in user" })) + }).pipe(Effect.provide(layer))) + + it.effect("headers", () => + Effect.gen(function*() { + const client = yield* UsersClient + const user = yield* client.GetUser({ id: "1" }) + assert.instanceOf(user, User) + assert.deepStrictEqual(user, new User({ id: "123", name: "Logged in user" })) + }).pipe( + RpcClient.withHeaders({ userId: "123" }), + Effect.provide(layer) + )) + + it.live("Stream", () => + Effect.gen(function*() { + const client = yield* UsersClient + const users: Array = [] + yield* client.StreamUsers({ id: "1" }).pipe( + Stream.take(5), + Stream.runForEach((user) => + Effect.sync(() => { + users.push(user) + }) + ), + Effect.fork + ) + + yield* Effect.sleep(2000) + assert.lengthOf(users, 5) + + // test interrupts + const interrupts = yield* client.GetInterrupts() + assert.equal(interrupts, 1) + + const { supportsAck } = yield* RpcServer.Protocol + + // test backpressure + if (supportsAck) { + const emits = yield* client.GetEmits() + assert.equal(emits, 5) + } + }).pipe(Effect.provide(layer)), { timeout: 20000 }) + + it.effect("defect", () => + Effect.gen(function*() { + const client = yield* UsersClient + const cause = yield* client.ProduceDefect().pipe( + Effect.sandbox, + Effect.flip + ) + assert.deepStrictEqual(cause, Cause.die("boom")) + }).pipe( + RpcClient.withHeaders({ userId: "123" }), + Effect.provide(layer) + )) + + it.live("never", () => + Effect.gen(function*() { + const client = yield* UsersClient + const fiber = yield* client.Never().pipe( + Effect.fork + ) + yield* Effect.sleep(500) + assert.isNull(fiber.unsafePoll()) + + yield* Fiber.interrupt(fiber) + yield* Effect.sleep(100) + + const { supportsAck } = yield* RpcServer.Protocol + if (supportsAck) { + const interrupts = yield* client.GetInterrupts() + assert.equal(interrupts, 1) + } + }).pipe( + RpcClient.withHeaders({ userId: "123" }), + Effect.provide(layer) + )) + }) +} diff --git a/packages/rpc/test/fixtures/schemas.ts b/packages/rpc/test/fixtures/schemas.ts new file mode 100644 index 00000000000..23a4e1d93ab --- /dev/null +++ b/packages/rpc/test/fixtures/schemas.ts @@ -0,0 +1,117 @@ +import { Headers } from "@effect/platform" +import { RpcTest } from "@effect/rpc" +import * as Rpc from "@effect/rpc/Rpc" +import * as RpcClient from "@effect/rpc/RpcClient" +import * as RpcGroup from "@effect/rpc/RpcGroup" +import * as RpcMiddleware from "@effect/rpc/RpcMiddleware" +import * as RpcSchema from "@effect/rpc/RpcSchema" +import * as RpcServer from "@effect/rpc/RpcServer" +import { Context, Effect, Layer, Mailbox, Schema } from "effect" + +export class User extends Schema.Class("User")({ + id: Schema.String, + name: Schema.String +}) {} + +class StreamUsers extends Schema.TaggedRequest()("StreamUsers", { + success: RpcSchema.Stream({ + success: User, + failure: Schema.Never + }), + failure: Schema.Never, + payload: { + id: Schema.String + } +}) {} + +class CurrentUser extends Context.Tag("CurrentUser")() {} + +class AuthMiddleware extends RpcMiddleware.Tag()("AuthMiddleware", { + provides: CurrentUser, + requiredForClient: true +}) {} + +export const UserRpcs = RpcGroup.make( + Rpc.make("GetUser", { + success: User, + payload: { id: Schema.String } + }), + Rpc.fromTaggedRequest(StreamUsers), + Rpc.make("GetInterrupts", { + success: Schema.Number + }), + Rpc.make("GetEmits", { + success: Schema.Number + }), + Rpc.make("ProduceDefect"), + Rpc.make("Never") +).middleware(AuthMiddleware) + +const AuthLive = Layer.succeed( + AuthMiddleware, + AuthMiddleware.of((options) => + Effect.succeed( + new User({ id: options.headers.userid ?? "1", name: options.headers.name ?? "Fallback name" }) + ) + ) +) + +const UsersLive = UserRpcs.toLayer(Effect.gen(function*() { + let interrupts = 0 + let emits = 0 + return { + GetUser: (_) => + CurrentUser.pipe( + Rpc.fork + ), + StreamUsers: Effect.fnUntraced(function*(req) { + const mailbox = yield* Mailbox.make(0) + + yield* Effect.addFinalizer(() => + Effect.sync(() => { + interrupts++ + }) + ) + + yield* mailbox.offer(new User({ id: req.id, name: "John" })).pipe( + Effect.tap(() => { + emits++ + }), + Effect.delay(100), + Effect.forever, + Effect.forkScoped + ) + + return mailbox + }), + GetInterrupts: () => Effect.sync(() => interrupts), + GetEmits: () => Effect.sync(() => emits), + ProduceDefect: () => Effect.die("boom"), + Never: () => Effect.never.pipe(Effect.onInterrupt(() => Effect.sync(() => interrupts++))) + } +})) + +export const RpcLive = RpcServer.layer(UserRpcs).pipe( + Layer.provide([ + UsersLive, + AuthLive + ]) +) + +const AuthClient = RpcMiddleware.layerClient(AuthMiddleware, ({ request }) => + Effect.succeed({ + ...request, + headers: Headers.set(request.headers, "name", "Logged in user") + })) + +export class UsersClient extends Context.Tag("UsersClient")< + UsersClient, + RpcClient.RpcClient> +>() { + static layer = Layer.scoped(UsersClient, RpcClient.make(UserRpcs)).pipe( + Layer.provide(AuthClient) + ) + static layerTest = Layer.scoped(UsersClient, RpcTest.makeClient(UserRpcs)).pipe( + Layer.provide([UsersLive, AuthLive, AuthClient]) + ) +} diff --git a/packages/rpc/test/fixtures/worker.ts b/packages/rpc/test/fixtures/worker.ts new file mode 100644 index 00000000000..b70d91a78ee --- /dev/null +++ b/packages/rpc/test/fixtures/worker.ts @@ -0,0 +1,12 @@ +import { BrowserWorkerRunner } from "@effect/platform-browser" +import * as RpcServer from "@effect/rpc/RpcServer" +import * as Effect from "effect/Effect" +import * as Layer from "effect/Layer" +import { RpcLive } from "./schemas.js" + +const MainLive = RpcLive.pipe( + Layer.provide(RpcServer.layerProtocolWorkerRunner), + Layer.provide(BrowserWorkerRunner.layer) +) + +Effect.runFork(BrowserWorkerRunner.launch(MainLive)) diff --git a/packages/rpc/tsconfig.test.json b/packages/rpc/tsconfig.test.json index 185e7065e44..2b7e3f21d2a 100644 --- a/packages/rpc/tsconfig.test.json +++ b/packages/rpc/tsconfig.test.json @@ -3,6 +3,8 @@ "include": ["test"], "references": [ { "path": "tsconfig.src.json" }, + { "path": "../platform-browser/tsconfig.src.json" }, + { "path": "../platform-node/tsconfig.src.json" }, { "path": "../vitest/tsconfig.src.json" } ], "compilerOptions": { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index f0a355381e2..38dfabbd7b0 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -271,39 +271,6 @@ importers: version: link:../effect/dist publishDirectory: dist - packages/cluster-browser: - devDependencies: - '@effect/rpc': - specifier: workspace:^ - version: link:../rpc/dist - effect: - specifier: workspace:^ - version: link:../effect/dist - publishDirectory: dist - - packages/cluster-node: - dependencies: - '@effect/cluster': - specifier: workspace:^ - version: link:../cluster/dist - devDependencies: - '@effect/platform': - specifier: workspace:^ - version: link:../platform/dist - '@effect/platform-node': - specifier: workspace:^ - version: link:../platform-node/dist - '@effect/rpc': - specifier: workspace:^ - version: link:../rpc/dist - '@effect/rpc-http': - specifier: workspace:^ - version: link:../rpc-http/dist - effect: - specifier: workspace:^ - version: link:../effect/dist - publishDirectory: dist - packages/cluster-workflow: devDependencies: '@effect/cluster': @@ -360,9 +327,6 @@ importers: effect: specifier: workspace:^ version: link:../effect/dist - msgpackr: - specifier: ^1.10.2 - version: 1.11.0 uuid: specifier: ^11.0.3 version: 11.0.3 @@ -379,12 +343,6 @@ importers: lmdb: specifier: ^3.0.13 version: 3.0.13 - vitest-websocket-mock: - specifier: ^0.4.0 - version: 0.4.0(vitest@3.0.5) - ws: - specifier: ^8.18.0 - version: 8.18.0 publishDirectory: dist packages/opentelemetry: @@ -439,6 +397,9 @@ importers: find-my-way-ts: specifier: ^0.1.5 version: 0.1.5 + msgpackr: + specifier: ^1.11.2 + version: 1.11.2 multipasta: specifier: ^0.2.5 version: 0.2.5 @@ -518,6 +479,9 @@ importers: effect: specifier: workspace:^ version: link:../effect/dist + vitest-websocket-mock: + specifier: ^0.4.0 + version: 0.4.0(vitest@3.0.5) publishDirectory: dist packages/platform-node-shared: @@ -528,6 +492,9 @@ importers: multipasta: specifier: ^0.2.5 version: 0.2.5 + ws: + specifier: ^8.18.0 + version: 8.18.0 devDependencies: '@effect/platform': specifier: workspace:^ @@ -535,6 +502,9 @@ importers: '@types/tar': specifier: ^6.1.12 version: 6.1.13 + '@types/ws': + specifier: ^8.5.12 + version: 8.5.14 effect: specifier: workspace:^ version: link:../effect/dist @@ -575,23 +545,9 @@ importers: effect: specifier: workspace:^ version: link:../effect/dist - publishDirectory: dist - - packages/rpc-http: - dependencies: - '@effect/rpc': - specifier: workspace:^ - version: link:../rpc/dist - devDependencies: - '@effect/platform': - specifier: workspace:^ - version: link:../platform/dist - '@effect/platform-node': - specifier: workspace:^ - version: link:../platform-node/dist - effect: - specifier: workspace:^ - version: link:../effect/dist + happy-dom: + specifier: ^14.12.3 + version: 14.12.3 publishDirectory: dist packages/sql: @@ -5510,9 +5466,6 @@ packages: resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} hasBin: true - loupe@3.1.2: - resolution: {integrity: sha512-23I4pFZHmAemUnz8WZXbYRSKYj801VDaNv9ETuMh7IrMc7VuVVSo+Z9iLE3ni30+U48iDWfi30d3twAXBYmnCg==} - loupe@3.1.3: resolution: {integrity: sha512-kkIp7XSkP78ZxJEsSxW3712C6teJVoeHHwgo9zJ380de7IYyJ2ISlxojcH2pC5OFLewESmnRi/+XCDIEEVyoug==} @@ -5799,6 +5752,9 @@ packages: msgpackr@1.11.0: resolution: {integrity: sha512-I8qXuuALqJe5laEBYoFykChhSXLikZmUhccjGsPuSJ/7uPip2TJ7lwdIQwWSAi0jGZDXv4WOP8Qg65QZRuXxXw==} + msgpackr@1.11.2: + resolution: {integrity: sha512-F9UngXRlPyWCDEASDpTf6c9uNhGPTqnTeLVt7bN+bU1eajoR/8V9ys2BRaV5C/e5ihE6sJ9uPIKaYt6bFuO32g==} + msw@2.7.0: resolution: {integrity: sha512-BIodwZ19RWfCbYTxWTUfTXc+sg4OwjCAgxU1ZsgmggX/7S3LdUifsbUPJs61j0rWb19CZRGY5if77duhc0uXzw==} engines: {node: '>=18'} @@ -9850,7 +9806,7 @@ snapshots: '@libsql/isomorphic-ws@0.1.5': dependencies: - '@types/ws': 8.5.12 + '@types/ws': 8.5.14 ws: 8.18.0 transitivePeerDependencies: - bufferutil @@ -10893,7 +10849,7 @@ snapshots: '@vitest/utils@2.1.4': dependencies: '@vitest/pretty-format': 2.1.4 - loupe: 3.1.2 + loupe: 3.1.3 tinyrainbow: 1.2.0 '@vitest/utils@3.0.5': @@ -13309,8 +13265,6 @@ snapshots: dependencies: js-tokens: 4.0.0 - loupe@3.1.2: {} - loupe@3.1.3: {} lru-cache@10.4.3: {} @@ -13713,6 +13667,10 @@ snapshots: optionalDependencies: msgpackr-extract: 3.0.3 + msgpackr@1.11.2: + optionalDependencies: + msgpackr-extract: 3.0.3 + msw@2.7.0(@types/node@22.13.4)(typescript@5.7.2): dependencies: '@bundled-es-modules/cookie': 2.0.1 diff --git a/tsconfig.base.json b/tsconfig.base.json index 75e59e9e65b..94bfe64ddef 100644 --- a/tsconfig.base.json +++ b/tsconfig.base.json @@ -55,14 +55,6 @@ "@effect/cluster": ["./packages/cluster/src/index.js"], "@effect/cluster/*": ["./packages/cluster/src/*.js"], "@effect/cluster/test/*": ["./packages/cluster/test/*.js"], - "@effect/cluster-browser": ["./packages/cluster-browser/src/index.js"], - "@effect/cluster-browser/*": ["./packages/cluster-browser/src/*.js"], - "@effect/cluster-browser/test/*": [ - "./packages/cluster-browser/test/*.js" - ], - "@effect/cluster-node": ["./packages/cluster-node/src/index.js"], - "@effect/cluster-node/*": ["./packages/cluster-node/src/*.js"], - "@effect/cluster-node/test/*": ["./packages/cluster-node/test/*.js"], "@effect/cluster-workflow": ["./packages/cluster-workflow/src/index.js"], "@effect/cluster-workflow/*": ["./packages/cluster-workflow/src/*.js"], "@effect/cluster-workflow/test/*": [ @@ -106,9 +98,6 @@ "@effect/rpc": ["./packages/rpc/src/index.js"], "@effect/rpc/*": ["./packages/rpc/src/*.js"], "@effect/rpc/test/*": ["./packages/rpc/test/*.js"], - "@effect/rpc-http": ["./packages/rpc-http/src/index.js"], - "@effect/rpc-http/*": ["./packages/rpc-http/src/*.js"], - "@effect/rpc-http/test/*": ["./packages/rpc-http/test/*.js"], "@effect/sql": ["./packages/sql/src/index.js"], "@effect/sql/*": ["./packages/sql/src/*.js"], "@effect/sql/test/*": ["./packages/sql/test/*.js"], diff --git a/tsconfig.build.json b/tsconfig.build.json index 5a7b39494c7..f22b74a7151 100644 --- a/tsconfig.build.json +++ b/tsconfig.build.json @@ -8,8 +8,6 @@ { "path": "packages/ai/openai/tsconfig.build.json" }, { "path": "packages/cli/tsconfig.build.json" }, { "path": "packages/cluster/tsconfig.build.json" }, - { "path": "packages/cluster-browser/tsconfig.build.json" }, - { "path": "packages/cluster-node/tsconfig.build.json" }, { "path": "packages/cluster-workflow/tsconfig.build.json" }, { "path": "packages/experimental/tsconfig.build.json" }, { "path": "packages/opentelemetry/tsconfig.build.json" }, @@ -21,7 +19,6 @@ { "path": "packages/printer/tsconfig.build.json" }, { "path": "packages/printer-ansi/tsconfig.build.json" }, { "path": "packages/rpc/tsconfig.build.json" }, - { "path": "packages/rpc-http/tsconfig.build.json" }, { "path": "packages/sql/tsconfig.build.json" }, { "path": "packages/sql-clickhouse/tsconfig.build.json" }, { "path": "packages/sql-d1/tsconfig.build.json" }, diff --git a/tsconfig.json b/tsconfig.json index ab4ea883407..89d71b9c2a0 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -8,8 +8,6 @@ { "path": "packages/ai/openai" }, { "path": "packages/cli" }, { "path": "packages/cluster" }, - { "path": "packages/cluster-browser" }, - { "path": "packages/cluster-node" }, { "path": "packages/cluster-workflow" }, { "path": "packages/experimental" }, { "path": "packages/opentelemetry" }, @@ -21,7 +19,6 @@ { "path": "packages/printer" }, { "path": "packages/printer-ansi" }, { "path": "packages/rpc" }, - { "path": "packages/rpc-http" }, { "path": "packages/sql" }, { "path": "packages/sql-clickhouse" }, { "path": "packages/sql-d1" }, diff --git a/vitest.shared.ts b/vitest.shared.ts index 69c2a409a20..5f0f718661e 100644 --- a/vitest.shared.ts +++ b/vitest.shared.ts @@ -33,8 +33,6 @@ const config: ViteUserConfig = { ...alias("ai-openai", path.join("ai", "openai")), ...alias("cli"), ...alias("cluster"), - ...alias("cluster-browser"), - ...alias("cluster-node"), ...alias("cluster-workflow"), ...alias("experimental"), ...alias("opentelemetry"), @@ -46,7 +44,6 @@ const config: ViteUserConfig = { ...alias("printer"), ...alias("printer-ansi"), ...alias("rpc"), - ...alias("rpc-http"), ...alias("sql"), ...alias("sql-clickhouse"), ...alias("sql-d1"),