dfx 0.51.0 → 0.51.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (335) hide show
  1. package/Cache/driver.d.ts +17 -16
  2. package/Cache/driver.d.ts.map +1 -1
  3. package/Cache/driver.js +10 -2
  4. package/Cache/driver.js.map +1 -1
  5. package/Cache/memory.d.ts +3 -3
  6. package/Cache/memory.d.ts.map +1 -1
  7. package/Cache/memory.js +55 -45
  8. package/Cache/memory.js.map +1 -1
  9. package/Cache/memoryTTL.d.ts +7 -6
  10. package/Cache/memoryTTL.d.ts.map +1 -1
  11. package/Cache/memoryTTL.js +126 -118
  12. package/Cache/memoryTTL.js.map +1 -1
  13. package/Cache/prelude.d.ts +53 -47
  14. package/Cache/prelude.d.ts.map +1 -1
  15. package/Cache/prelude.js +125 -96
  16. package/Cache/prelude.js.map +1 -1
  17. package/Cache.d.ts +33 -32
  18. package/Cache.d.ts.map +1 -1
  19. package/Cache.js +137 -65
  20. package/Cache.js.map +1 -1
  21. package/DiscordConfig.d.ts +26 -20
  22. package/DiscordConfig.d.ts.map +1 -1
  23. package/DiscordConfig.js +43 -25
  24. package/DiscordConfig.js.map +1 -1
  25. package/DiscordGateway/DiscordWS.d.ts +17 -14
  26. package/DiscordGateway/DiscordWS.d.ts.map +1 -1
  27. package/DiscordGateway/DiscordWS.js +49 -30
  28. package/DiscordGateway/DiscordWS.js.map +1 -1
  29. package/DiscordGateway/Shard/heartbeats.d.ts +7 -3
  30. package/DiscordGateway/Shard/heartbeats.d.ts.map +1 -1
  31. package/DiscordGateway/Shard/heartbeats.js +28 -18
  32. package/DiscordGateway/Shard/heartbeats.js.map +1 -1
  33. package/DiscordGateway/Shard/identify.d.ts +10 -8
  34. package/DiscordGateway/Shard/identify.d.ts.map +1 -1
  35. package/DiscordGateway/Shard/identify.js +41 -24
  36. package/DiscordGateway/Shard/identify.js.map +1 -1
  37. package/DiscordGateway/Shard/invalidSession.d.ts +6 -3
  38. package/DiscordGateway/Shard/invalidSession.d.ts.map +1 -1
  39. package/DiscordGateway/Shard/invalidSession.js +14 -5
  40. package/DiscordGateway/Shard/invalidSession.js.map +1 -1
  41. package/DiscordGateway/Shard/sendEvents.d.ts +1 -1
  42. package/DiscordGateway/Shard/sendEvents.d.ts.map +1 -1
  43. package/DiscordGateway/Shard/sendEvents.js +30 -18
  44. package/DiscordGateway/Shard/sendEvents.js.map +1 -1
  45. package/DiscordGateway/Shard/utils.d.ts +7 -3
  46. package/DiscordGateway/Shard/utils.d.ts.map +1 -1
  47. package/DiscordGateway/Shard/utils.js +19 -9
  48. package/DiscordGateway/Shard/utils.js.map +1 -1
  49. package/DiscordGateway/Shard.d.ts +15 -10
  50. package/DiscordGateway/Shard.d.ts.map +1 -1
  51. package/DiscordGateway/Shard.js +109 -87
  52. package/DiscordGateway/Shard.js.map +1 -1
  53. package/DiscordGateway/ShardStore.d.ts +9 -6
  54. package/DiscordGateway/ShardStore.d.ts.map +1 -1
  55. package/DiscordGateway/ShardStore.js +30 -18
  56. package/DiscordGateway/ShardStore.js.map +1 -1
  57. package/DiscordGateway/Sharder.d.ts +17 -11
  58. package/DiscordGateway/Sharder.d.ts.map +1 -1
  59. package/DiscordGateway/Sharder.js +82 -52
  60. package/DiscordGateway/Sharder.js.map +1 -1
  61. package/DiscordGateway/WS.d.ts +13 -10
  62. package/DiscordGateway/WS.d.ts.map +1 -1
  63. package/DiscordGateway/WS.js +100 -74
  64. package/DiscordGateway/WS.js.map +1 -1
  65. package/DiscordGateway.d.ts +19 -13
  66. package/DiscordGateway.d.ts.map +1 -1
  67. package/DiscordGateway.js +45 -32
  68. package/DiscordGateway.js.map +1 -1
  69. package/DiscordREST/types.d.ts +5 -5
  70. package/DiscordREST/types.d.ts.map +1 -1
  71. package/DiscordREST/types.js +5 -1
  72. package/DiscordREST/types.js.map +1 -1
  73. package/DiscordREST/utils.d.ts +3 -2
  74. package/DiscordREST/utils.d.ts.map +1 -1
  75. package/DiscordREST/utils.js +27 -17
  76. package/DiscordREST/utils.js.map +1 -1
  77. package/DiscordREST.d.ts +11 -8
  78. package/DiscordREST.d.ts.map +1 -1
  79. package/DiscordREST.js +141 -127
  80. package/DiscordREST.js.map +1 -1
  81. package/Helpers/flags.js +31 -19
  82. package/Helpers/flags.js.map +1 -1
  83. package/Helpers/intents.d.ts.map +1 -1
  84. package/Helpers/intents.js +22 -10
  85. package/Helpers/intents.js.map +1 -1
  86. package/Helpers/interactions.d.ts +22 -21
  87. package/Helpers/interactions.d.ts.map +1 -1
  88. package/Helpers/interactions.js +75 -39
  89. package/Helpers/interactions.js.map +1 -1
  90. package/Helpers/members.d.ts +3 -3
  91. package/Helpers/members.d.ts.map +1 -1
  92. package/Helpers/members.js +10 -3
  93. package/Helpers/members.js.map +1 -1
  94. package/Helpers/permissions.d.ts +5 -4
  95. package/Helpers/permissions.d.ts.map +1 -1
  96. package/Helpers/permissions.js +69 -52
  97. package/Helpers/permissions.js.map +1 -1
  98. package/Helpers/ui.d.ts +1 -1
  99. package/Helpers/ui.d.ts.map +1 -1
  100. package/Helpers/ui.js +44 -29
  101. package/Helpers/ui.js.map +1 -1
  102. package/Interactions/builder.d.ts +20 -19
  103. package/Interactions/builder.d.ts.map +1 -1
  104. package/Interactions/builder.js +66 -63
  105. package/Interactions/builder.js.map +1 -1
  106. package/Interactions/context.d.ts +26 -23
  107. package/Interactions/context.d.ts.map +1 -1
  108. package/Interactions/context.js +86 -57
  109. package/Interactions/context.js.map +1 -1
  110. package/Interactions/definitions.d.ts +33 -30
  111. package/Interactions/definitions.d.ts.map +1 -1
  112. package/Interactions/definitions.js +61 -47
  113. package/Interactions/definitions.js.map +1 -1
  114. package/Interactions/gateway.d.ts +15 -10
  115. package/Interactions/gateway.d.ts.map +1 -1
  116. package/Interactions/gateway.js +55 -42
  117. package/Interactions/gateway.js.map +1 -1
  118. package/Interactions/handlers.d.ts +6 -4
  119. package/Interactions/handlers.d.ts.map +1 -1
  120. package/Interactions/handlers.js +68 -57
  121. package/Interactions/handlers.js.map +1 -1
  122. package/Interactions/index.d.ts +11 -10
  123. package/Interactions/index.d.ts.map +1 -1
  124. package/Interactions/index.js +95 -10
  125. package/Interactions/index.js.map +1 -1
  126. package/Interactions/utils.d.ts +42 -40
  127. package/Interactions/utils.d.ts.map +1 -1
  128. package/Interactions/utils.js +40 -32
  129. package/Interactions/utils.js.map +1 -1
  130. package/Interactions/webhook.d.ts +20 -16
  131. package/Interactions/webhook.d.ts.map +1 -1
  132. package/Interactions/webhook.js +73 -41
  133. package/Interactions/webhook.js.map +1 -1
  134. package/Log.d.ts +8 -5
  135. package/Log.d.ts.map +1 -1
  136. package/Log.js +23 -14
  137. package/Log.js.map +1 -1
  138. package/RateLimit/memory.d.ts +1 -1
  139. package/RateLimit/memory.d.ts.map +1 -1
  140. package/RateLimit/memory.js +46 -33
  141. package/RateLimit/memory.js.map +1 -1
  142. package/RateLimit/utils.d.ts +1 -1
  143. package/RateLimit/utils.d.ts.map +1 -1
  144. package/RateLimit/utils.js +23 -16
  145. package/RateLimit/utils.js.map +1 -1
  146. package/RateLimit.d.ts +18 -14
  147. package/RateLimit.d.ts.map +1 -1
  148. package/RateLimit.js +40 -26
  149. package/RateLimit.js.map +1 -1
  150. package/gateway.d.ts +20 -13
  151. package/gateway.d.ts.map +1 -1
  152. package/gateway.js +72 -25
  153. package/gateway.js.map +1 -1
  154. package/index.d.ts +14 -13
  155. package/index.d.ts.map +1 -1
  156. package/index.js +71 -13
  157. package/index.js.map +1 -1
  158. package/mjs/Cache/driver.mjs +3 -0
  159. package/mjs/Cache/driver.mjs.map +1 -0
  160. package/mjs/Cache/memory.mjs +48 -0
  161. package/mjs/Cache/memory.mjs.map +1 -0
  162. package/mjs/Cache/memoryTTL.mjs +119 -0
  163. package/mjs/Cache/memoryTTL.mjs.map +1 -0
  164. package/mjs/Cache/prelude.mjs +125 -0
  165. package/mjs/Cache/prelude.mjs.map +1 -0
  166. package/mjs/Cache.mjs +87 -0
  167. package/mjs/Cache.mjs.map +1 -0
  168. package/mjs/DiscordConfig.mjs +34 -0
  169. package/mjs/DiscordConfig.mjs.map +1 -0
  170. package/mjs/DiscordGateway/DiscordWS.mjs +39 -0
  171. package/mjs/DiscordGateway/DiscordWS.mjs.map +1 -0
  172. package/mjs/DiscordGateway/Shard/heartbeats.mjs +21 -0
  173. package/mjs/DiscordGateway/Shard/heartbeats.mjs.map +1 -0
  174. package/mjs/DiscordGateway/Shard/identify.mjs +37 -0
  175. package/mjs/DiscordGateway/Shard/identify.mjs.map +1 -0
  176. package/mjs/DiscordGateway/Shard/invalidSession.mjs +6 -0
  177. package/mjs/DiscordGateway/Shard/invalidSession.mjs.map +1 -0
  178. package/mjs/DiscordGateway/Shard/sendEvents.mjs +25 -0
  179. package/mjs/DiscordGateway/Shard/sendEvents.mjs.map +1 -0
  180. package/mjs/DiscordGateway/Shard/utils.mjs +11 -0
  181. package/mjs/DiscordGateway/Shard/utils.mjs.map +1 -0
  182. package/mjs/DiscordGateway/Shard.mjs +99 -0
  183. package/mjs/DiscordGateway/Shard.mjs.map +1 -0
  184. package/mjs/DiscordGateway/ShardStore.mjs +24 -0
  185. package/mjs/DiscordGateway/ShardStore.mjs.map +1 -0
  186. package/mjs/DiscordGateway/Sharder.mjs +73 -0
  187. package/mjs/DiscordGateway/Sharder.mjs.map +1 -0
  188. package/mjs/DiscordGateway/WS.mjs +94 -0
  189. package/mjs/DiscordGateway/WS.mjs.map +1 -0
  190. package/mjs/DiscordGateway.mjs +36 -0
  191. package/mjs/DiscordGateway.mjs.map +1 -0
  192. package/mjs/DiscordREST/types.mjs +2 -0
  193. package/mjs/DiscordREST/types.mjs.map +1 -0
  194. package/mjs/DiscordREST/utils.mjs +19 -0
  195. package/mjs/DiscordREST/utils.mjs.map +1 -0
  196. package/mjs/DiscordREST.mjs +129 -0
  197. package/mjs/DiscordREST.mjs.map +1 -0
  198. package/mjs/Helpers/flags.mjs +36 -0
  199. package/mjs/Helpers/flags.mjs.map +1 -0
  200. package/mjs/Helpers/intents.mjs +27 -0
  201. package/mjs/Helpers/intents.mjs.map +1 -0
  202. package/mjs/Helpers/interactions.mjs +104 -0
  203. package/mjs/Helpers/interactions.mjs.map +1 -0
  204. package/mjs/Helpers/members.mjs +9 -0
  205. package/mjs/Helpers/members.mjs.map +1 -0
  206. package/mjs/Helpers/permissions.mjs +82 -0
  207. package/mjs/Helpers/permissions.mjs.map +1 -0
  208. package/mjs/Helpers/ui.mjs +66 -0
  209. package/mjs/Helpers/ui.mjs.map +1 -0
  210. package/mjs/Interactions/builder.mjs +62 -0
  211. package/mjs/Interactions/builder.mjs.map +1 -0
  212. package/mjs/Interactions/context.mjs +63 -0
  213. package/mjs/Interactions/context.mjs.map +1 -0
  214. package/mjs/Interactions/definitions.mjs +51 -0
  215. package/mjs/Interactions/definitions.mjs.map +1 -0
  216. package/mjs/Interactions/gateway.mjs +48 -0
  217. package/mjs/Interactions/gateway.mjs.map +1 -0
  218. package/mjs/Interactions/handlers.mjs +61 -0
  219. package/mjs/Interactions/handlers.mjs.map +1 -0
  220. package/mjs/Interactions/index.mjs +12 -0
  221. package/mjs/Interactions/index.mjs.map +1 -0
  222. package/mjs/Interactions/utils.mjs +35 -0
  223. package/mjs/Interactions/utils.mjs.map +1 -0
  224. package/mjs/Interactions/webhook.mjs +73 -0
  225. package/mjs/Interactions/webhook.mjs.map +1 -0
  226. package/mjs/Log.mjs +15 -0
  227. package/mjs/Log.mjs.map +1 -0
  228. package/mjs/RateLimit/memory.mjs +39 -0
  229. package/mjs/RateLimit/memory.mjs.map +1 -0
  230. package/mjs/RateLimit/utils.mjs +18 -0
  231. package/mjs/RateLimit/utils.mjs.map +1 -0
  232. package/mjs/RateLimit.mjs +29 -0
  233. package/mjs/RateLimit.mjs.map +1 -0
  234. package/mjs/gateway.mjs +27 -0
  235. package/mjs/gateway.mjs.map +1 -0
  236. package/mjs/index.mjs +15 -0
  237. package/mjs/index.mjs.map +1 -0
  238. package/mjs/types.mjs +1211 -0
  239. package/mjs/types.mjs.map +1 -0
  240. package/mjs/utils/Effect.mjs +28 -0
  241. package/mjs/utils/Effect.mjs.map +1 -0
  242. package/mjs/utils/tsplus.mjs +2 -0
  243. package/mjs/utils/tsplus.mjs.map +1 -0
  244. package/mjs/version.mjs +2 -0
  245. package/mjs/version.mjs.map +1 -0
  246. package/mjs/webhooks.mjs +30 -0
  247. package/mjs/webhooks.mjs.map +1 -0
  248. package/package.json +46 -50
  249. package/src/Cache/driver.ts +27 -15
  250. package/src/Cache/memory.ts +9 -5
  251. package/src/Cache/memoryTTL.ts +69 -53
  252. package/src/Cache/prelude.ts +113 -91
  253. package/src/Cache.ts +73 -58
  254. package/src/DiscordConfig.ts +33 -19
  255. package/src/DiscordGateway/DiscordWS.ts +28 -25
  256. package/src/DiscordGateway/Shard/heartbeats.ts +47 -27
  257. package/src/DiscordGateway/Shard/identify.ts +29 -25
  258. package/src/DiscordGateway/Shard/invalidSession.ts +9 -7
  259. package/src/DiscordGateway/Shard/sendEvents.ts +1 -1
  260. package/src/DiscordGateway/Shard/utils.ts +33 -9
  261. package/src/DiscordGateway/Shard.ts +119 -99
  262. package/src/DiscordGateway/ShardStore.ts +12 -5
  263. package/src/DiscordGateway/Sharder.ts +95 -74
  264. package/src/DiscordGateway/WS.ts +85 -60
  265. package/src/DiscordGateway.ts +58 -18
  266. package/src/DiscordREST/types.ts +5 -5
  267. package/src/DiscordREST/utils.ts +10 -7
  268. package/src/DiscordREST.ts +152 -132
  269. package/src/Helpers/intents.ts +1 -0
  270. package/src/Helpers/interactions.ts +51 -38
  271. package/src/Helpers/members.ts +2 -0
  272. package/src/Helpers/permissions.ts +6 -5
  273. package/src/Helpers/ui.ts +1 -1
  274. package/src/Interactions/builder.ts +56 -43
  275. package/src/Interactions/context.ts +68 -38
  276. package/src/Interactions/definitions.ts +32 -24
  277. package/src/Interactions/gateway.ts +72 -47
  278. package/src/Interactions/handlers.ts +56 -39
  279. package/src/Interactions/index.ts +6 -5
  280. package/src/Interactions/utils.ts +32 -21
  281. package/src/Interactions/webhook.ts +78 -42
  282. package/src/Log.ts +4 -0
  283. package/src/RateLimit/memory.ts +10 -4
  284. package/src/RateLimit/utils.ts +1 -1
  285. package/src/RateLimit.ts +38 -25
  286. package/src/gateway.ts +62 -25
  287. package/src/index.ts +29 -15
  288. package/src/utils/Effect.ts +69 -0
  289. package/src/version.ts +1 -0
  290. package/src/webhooks.ts +47 -20
  291. package/tsconfig.base.json +48 -0
  292. package/tsconfig.build.json +10 -0
  293. package/tsconfig.examples.json +11 -0
  294. package/tsconfig.json +12 -8
  295. package/tsconfig.madge.json +12 -0
  296. package/tsconfig.test.json +10 -0
  297. package/types.d.ts.map +1 -1
  298. package/types.js +1216 -1200
  299. package/types.js.map +1 -1
  300. package/utils/Effect.d.ts +8 -0
  301. package/utils/Effect.d.ts.map +1 -0
  302. package/utils/Effect.js +38 -0
  303. package/utils/Effect.js.map +1 -0
  304. package/utils/tsplus.js +5 -1
  305. package/utils/tsplus.js.map +1 -1
  306. package/version.d.ts +2 -0
  307. package/version.d.ts.map +1 -0
  308. package/version.js +9 -0
  309. package/version.js.map +1 -0
  310. package/webhooks.d.ts +14 -9
  311. package/webhooks.d.ts.map +1 -1
  312. package/webhooks.js +76 -27
  313. package/webhooks.js.map +1 -1
  314. package/_common.d.ts +0 -37
  315. package/_common.d.ts.map +0 -1
  316. package/_common.js +0 -8
  317. package/_common.js.map +0 -1
  318. package/global.d.ts +0 -18
  319. package/global.d.ts.map +0 -1
  320. package/global.js +0 -2
  321. package/global.js.map +0 -1
  322. package/src/_common.ts +0 -43
  323. package/src/global.ts +0 -45
  324. package/src/package.json +0 -52
  325. package/src/utils/effect.ts +0 -0
  326. package/src/utils/hub.ts +0 -47
  327. package/tsplus.config.json +0 -8
  328. package/utils/effect.d.ts +0 -2
  329. package/utils/effect.d.ts.map +0 -1
  330. package/utils/effect.js +0 -2
  331. package/utils/effect.js.map +0 -1
  332. package/utils/hub.d.ts +0 -12
  333. package/utils/hub.d.ts.map +0 -1
  334. package/utils/hub.js +0 -26
  335. package/utils/hub.js.map +0 -1
@@ -1,114 +1,135 @@
1
- import { millis } from "@effect/data/Duration"
1
+ import * as Chunk from "@effect/data/Chunk"
2
+ import { Tag } from "@effect/data/Context"
3
+ import * as Duration from "@effect/data/Duration"
4
+ import * as HashSet from "@effect/data/HashSet"
5
+ import * as Option from "@effect/data/Option"
6
+ import * as Deferred from "@effect/io/Deferred"
7
+ import * as Effect from "@effect/io/Effect"
8
+ import * as Hub from "@effect/io/Hub"
9
+ import * as Layer from "@effect/io/Layer"
10
+ import * as Queue from "@effect/io/Queue"
11
+ import * as Ref from "@effect/io/Ref"
12
+ import * as Schedule from "@effect/io/Schedule"
2
13
  import { DiscordConfig } from "dfx/DiscordConfig"
14
+ import { LiveShard, RunningShard, Shard } from "dfx/DiscordGateway/Shard"
15
+ import { ShardStore } from "dfx/DiscordGateway/ShardStore"
16
+ import { WebSocketCloseError, WebSocketError } from "dfx/DiscordGateway/WS"
3
17
  import { DiscordREST } from "dfx/DiscordREST"
4
- import { LiveRateLimiter, RateLimiter } from "../RateLimit.js"
5
- import { LiveShard, RunningShard, Shard } from "./Shard.js"
6
- import { ShardStore } from "./ShardStore.js"
7
- import { WebSocketCloseError, WebSocketError } from "./WS.js"
8
- import { Some } from "@effect/data/Option"
18
+ import { LiveRateLimiter, RateLimiter } from "dfx/RateLimit"
19
+ import * as Discord from "dfx/types"
9
20
 
10
- const claimRepeatPolicy = Schedule.fixed(Duration.minutes(3)).whileInput(
11
- (_: Maybe<number>) => _.isNone(),
12
- ).passthrough as Schedule<never, Maybe<number>, Some<number>>
21
+ const claimRepeatPolicy = Schedule.fixed("3 minutes").pipe(
22
+ Schedule.whileInput((_: Option.Option<number>) => _._tag === "None"),
23
+ Schedule.passthrough,
24
+ ) as Schedule.Schedule<never, Option.Option<number>, Option.Some<number>>
13
25
 
14
- const make = Do($ => {
15
- const store = $(ShardStore.accessWith(identity))
16
- const rest = $(DiscordREST.accessWith(identity))
17
- const { gateway: config } = $(DiscordConfig.accessWith(identity))
18
- const limiter = $(RateLimiter.accessWith(identity))
19
- const shard = $(Shard.accessWith(identity))
20
- const currentShards = $(Ref.make(HashSet.empty<RunningShard>()))
26
+ const make = Effect.gen(function* (_) {
27
+ const store = yield* _(ShardStore)
28
+ const rest = yield* _(DiscordREST)
29
+ const { gateway: config } = yield* _(DiscordConfig)
30
+ const limiter = yield* _(RateLimiter)
31
+ const shard = yield* _(Shard)
32
+ const currentShards = yield* _(Ref.make(HashSet.empty<RunningShard>()))
21
33
 
22
34
  const takeConfig = (totalCount: number) =>
23
- Do($ => {
24
- const currentCount = $(Ref.make(0))
35
+ Effect.gen(function* (_) {
36
+ const currentCount = yield* _(Ref.make(0))
25
37
 
26
- const claimId = (sharderCount: number): Effect<never, never, number> =>
38
+ const claimId = (
39
+ sharderCount: number,
40
+ ): Effect.Effect<never, never, number> =>
27
41
  store
28
42
  .claimId({
29
43
  totalCount,
30
44
  sharderCount,
31
45
  })
32
- .repeat(claimRepeatPolicy)
33
- .map(_ => _.value)
46
+ .pipe(
47
+ Effect.repeat(claimRepeatPolicy),
48
+ Effect.map(_ => _.value),
49
+ )
34
50
 
35
- return currentCount
36
- .getAndUpdate(_ => _ + 1)
37
- .flatMap(claimId)
38
- .map(id => ({ id, totalCount } as const))
51
+ return Ref.getAndUpdate(currentCount, _ => _ + 1).pipe(
52
+ Effect.flatMap(claimId),
53
+ Effect.map(id => ({ id, totalCount } as const)),
54
+ )
39
55
  })
40
56
 
41
- const gateway = $(
42
- rest
43
- .getGatewayBot()
44
- .flatMap(r => r.json)
45
- .catchAll(() =>
46
- Effect.succeed<Discord.GetGatewayBotResponse>({
47
- url: "wss://gateway.discord.gg/",
48
- shards: 1,
49
- session_start_limit: {
50
- total: 0,
51
- remaining: 0,
52
- reset_after: 0,
53
- max_concurrency: 1,
54
- },
55
- }),
56
- ),
57
+ const gateway = yield* _(
58
+ rest.getGatewayBot(),
59
+ Effect.flatMap(r => r.json),
60
+ Effect.catchAll(() =>
61
+ Effect.succeed<Discord.GetGatewayBotResponse>({
62
+ url: "wss://gateway.discord.gg/",
63
+ shards: 1,
64
+ session_start_limit: {
65
+ total: 0,
66
+ remaining: 0,
67
+ reset_after: 0,
68
+ max_concurrency: 1,
69
+ },
70
+ }),
71
+ ),
57
72
  )
58
73
 
59
74
  const run = (
60
- hub: Hub<Discord.GatewayPayload<Discord.ReceiveEvent>>,
61
- sendQueue: Dequeue<Discord.GatewayPayload<Discord.SendEvent>>,
75
+ hub: Hub.Hub<Discord.GatewayPayload<Discord.ReceiveEvent>>,
76
+ sendQueue: Queue.Dequeue<Discord.GatewayPayload<Discord.SendEvent>>,
62
77
  ) =>
63
- Do($ => {
64
- const deferred = $(
78
+ Effect.gen(function* (_) {
79
+ const deferred = yield* _(
65
80
  Deferred.make<WebSocketError | WebSocketCloseError, never>(),
66
81
  )
67
- const take = $(takeConfig(config.shardCount ?? gateway.shards))
82
+ const take = yield* _(takeConfig(config.shardCount ?? gateway.shards))
68
83
 
69
- const spawner = take
70
- .map(config => ({
84
+ const spawner = take.pipe(
85
+ Effect.map(config => ({
71
86
  ...config,
72
87
  url: gateway.url,
73
88
  concurrency: gateway.session_start_limit.max_concurrency,
74
- }))
75
- .tap(({ id, concurrency }) =>
89
+ })),
90
+ Effect.tap(({ id, concurrency }) =>
76
91
  limiter.maybeWait(
77
92
  `dfx.sharder.${id % concurrency}`,
78
- millis(config.identifyRateLimit[0]),
93
+ Duration.millis(config.identifyRateLimit[0]),
79
94
  config.identifyRateLimit[1],
80
95
  ),
81
- )
82
- .flatMap(c => shard.connect([c.id, c.totalCount], hub, sendQueue))
83
- .flatMap(
84
- shard =>
85
- currentShards
86
- .update(_ => _.add(shard))
87
- .acquireUseRelease(
88
- () => shard.run,
89
- () => currentShards.update(_ => _.remove(shard)),
90
- )
91
- .catchAllCause(_ => deferred.failCause(_)).fork,
92
- ).forever
96
+ ),
97
+ Effect.flatMap(c =>
98
+ shard.connect([c.id, c.totalCount], hub, sendQueue),
99
+ ),
100
+ Effect.flatMap(shard =>
101
+ Effect.acquireUseRelease(
102
+ Ref.update(currentShards, HashSet.add(shard)),
103
+ () => shard.run,
104
+ () => Ref.update(currentShards, HashSet.remove(shard)),
105
+ ).pipe(
106
+ Effect.catchAllCause(_ => Deferred.failCause(deferred, _)),
107
+ Effect.fork,
108
+ ),
109
+ ),
110
+ Effect.forever,
111
+ )
93
112
 
94
- const spawners = Chunk.range(
95
- 1,
96
- gateway.session_start_limit.max_concurrency,
97
- ).map(() => spawner)
113
+ const spawners = Chunk.map(
114
+ Chunk.range(1, gateway.session_start_limit.max_concurrency),
115
+ () => spawner,
116
+ )
98
117
 
99
- return $(
118
+ return yield* _(
100
119
  Effect.all(
101
120
  Effect.all(spawners, { concurrency: "unbounded", discard: true }),
102
- deferred.await,
121
+ Deferred.await(deferred),
103
122
  { concurrency: "unbounded", discard: true },
104
- ) as Effect<never, WebSocketError | WebSocketCloseError, never>,
123
+ ) as Effect.Effect<never, WebSocketError | WebSocketCloseError, never>,
105
124
  )
106
125
  })
107
126
 
108
- return { shards: currentShards.get, run } as const
127
+ return { shards: Ref.get(currentShards), run } as const
109
128
  })
110
129
 
111
- export interface Sharder extends Effect.Success<typeof make> {}
130
+ export interface Sharder extends Effect.Effect.Success<typeof make> {}
112
131
  export const Sharder = Tag<Sharder>()
113
- export const LiveSharder =
114
- (LiveRateLimiter + LiveShard) >> Layer.effect(Sharder, make)
132
+ export const LiveSharder = Layer.provide(
133
+ Layer.merge(LiveRateLimiter, LiveShard),
134
+ Layer.effect(Sharder, make),
135
+ )
@@ -1,9 +1,16 @@
1
1
  import { Log } from "dfx/Log"
2
2
  import WebSocket from "isomorphic-ws"
3
+ import * as Effect from "@effect/io/Effect"
4
+ import * as Layer from "@effect/io/Layer"
5
+ import { Tag } from "@effect/data/Context"
6
+ import * as Ref from "@effect/io/Ref"
7
+ import * as Queue from "@effect/io/Queue"
8
+ import * as Runtime from "@effect/io/Runtime"
9
+ import * as Duration from "@effect/data/Duration"
3
10
 
4
11
  export const Reconnect = Symbol()
5
12
  export type Reconnect = typeof Reconnect
6
- export type Message = string | Buffer | ArrayBuffer | Reconnect
13
+ export type Message = string | Uint8Array | ArrayBuffer | Reconnect
7
14
 
8
15
  export class WebSocketError {
9
16
  readonly _tag = "WebSocketError"
@@ -23,66 +30,77 @@ const isReconnect = (
23
30
  ): e is WebSocketCloseError =>
24
31
  e._tag === "WebSocketCloseError" && e.code === 1012
25
32
 
26
- const socket = (urlRef: Ref<string>) =>
27
- urlRef.get
28
- .map(_ => new WebSocket(_) as any as globalThis.WebSocket)
29
- .acquireRelease(ws =>
33
+ const socket = (urlRef: Ref.Ref<string>) =>
34
+ Ref.get(urlRef).pipe(
35
+ Effect.map(_ => new WebSocket(_) as any as globalThis.WebSocket),
36
+ Effect.acquireRelease(ws =>
30
37
  Effect.sync(() => {
38
+ // eslint-disable-next-line @typescript-eslint/no-extra-semi
31
39
  ;(ws as any).removeAllListeners?.()
32
40
  ws.close()
33
41
  }),
34
- )
42
+ ),
43
+ )
35
44
 
36
45
  const offer = (
37
46
  ws: globalThis.WebSocket,
38
- queue: Enqueue<WebSocket.Data>,
47
+ queue: Queue.Enqueue<WebSocket.Data>,
39
48
  log: Log,
40
49
  ) =>
41
- Effect.runtime<never>().flatMap(runtime =>
42
- Effect.async<never, WebSocketError | WebSocketCloseError, never>(resume => {
43
- const run = runtime.runFork
44
- ws.addEventListener("message", message => {
45
- run(
46
- queue
47
- .offer(message.data)
48
- .zipLeft(log.debug("WS", "offer", message.data), {}),
49
- )
50
- })
50
+ Effect.runtime<never>().pipe(
51
+ Effect.flatMap(runtime =>
52
+ Effect.async<never, WebSocketError | WebSocketCloseError, never>(
53
+ resume => {
54
+ const run = Runtime.runFork(runtime)
55
+ ws.addEventListener("message", message => {
56
+ run(
57
+ Effect.all(
58
+ log.debug("WS", "receive", message.data),
59
+ Queue.offer(queue, message.data),
60
+ { concurrency: "unbounded", discard: true },
61
+ ),
62
+ )
63
+ })
64
+
65
+ ws.addEventListener("error", cause => {
66
+ resume(Effect.fail(new WebSocketError("error", cause)))
67
+ })
68
+
69
+ ws.addEventListener("close", e => {
70
+ resume(Effect.fail(new WebSocketCloseError(e.code, e.reason)))
71
+ })
72
+ },
73
+ ),
74
+ ),
75
+ )
51
76
 
52
- ws.addEventListener("error", cause => {
53
- resume(Effect.fail(new WebSocketError("error", cause)))
54
- })
77
+ const waitForOpen = (ws: globalThis.WebSocket, timeout: Duration.Duration) =>
78
+ Effect.timeoutFail(
79
+ Effect.suspend(() => {
80
+ if (ws.readyState === WebSocket.OPEN) {
81
+ return Effect.unit
82
+ }
55
83
 
56
- ws.addEventListener("close", e => {
57
- resume(Effect.fail(new WebSocketCloseError(e.code, e.reason)))
84
+ return Effect.async<never, never, void>(resume => {
85
+ ws.addEventListener("open", () => resume(Effect.unit), {
86
+ once: true,
87
+ })
58
88
  })
59
89
  }),
90
+ {
91
+ onTimeout: () => new WebSocketError("open-timeout"),
92
+ duration: timeout,
93
+ },
60
94
  )
61
95
 
62
- const waitForOpen = (ws: globalThis.WebSocket, timeout: Duration) =>
63
- Effect.suspend(() => {
64
- if (ws.readyState === WebSocket.OPEN) {
65
- return Effect.unit
66
- }
67
-
68
- return Effect.async<never, never, void>(resume => {
69
- ws.addEventListener("open", () => resume(Effect.unit), {
70
- once: true,
71
- })
72
- })
73
- }).timeoutFail({
74
- onTimeout: () => new WebSocketError("open-timeout"),
75
- duration: timeout,
76
- })
77
-
78
96
  const send = (
79
97
  ws: globalThis.WebSocket,
80
- take: Effect<never, never, Message>,
98
+ take: Effect.Effect<never, never, Message>,
81
99
  log: Log,
82
100
  ) =>
83
- take
84
- .tap(data => log.debug("WS", "send", data))
85
- .tap(data => {
101
+ take.pipe(
102
+ Effect.tap(data => log.debug("WS", "send", data)),
103
+ Effect.tap(data => {
86
104
  if (data === Reconnect) {
87
105
  return Effect.failSync(() => {
88
106
  ws.close(1012, "reconnecting")
@@ -93,36 +111,43 @@ const send = (
93
111
  return Effect.sync(() => {
94
112
  ws.send(data)
95
113
  })
96
- }).forever
114
+ }),
115
+ Effect.forever,
116
+ )
97
117
 
98
- const make = Do($ => {
99
- const log = $(Log.accessWith(identity))
118
+ const make = Effect.gen(function* (_) {
119
+ const log = yield* _(Log)
100
120
 
101
121
  const connect = (
102
- url: Ref<string>,
103
- takeOutbound: Effect<never, never, Message>,
122
+ url: Ref.Ref<string>,
123
+ takeOutbound: Effect.Effect<never, never, Message>,
104
124
  onConnecting = Effect.unit,
105
125
  openTimeout = Duration.seconds(3),
106
126
  ) =>
107
- Do($ => {
108
- const queue = $(Queue.unbounded<WebSocket.Data>())
109
-
110
- const run = onConnecting
111
- .zipRight(socket(url))
112
- .flatMap(ws =>
113
- offer(ws, queue, log).zipLeft(
114
- waitForOpen(ws, openTimeout).zipRight(send(ws, takeOutbound, log)),
115
- { parallel: true },
127
+ Effect.gen(function* (_) {
128
+ const queue = yield* _(Queue.unbounded<WebSocket.Data>())
129
+
130
+ const run = onConnecting.pipe(
131
+ Effect.zipRight(socket(url)),
132
+ Effect.flatMap(ws =>
133
+ Effect.all(
134
+ offer(ws, queue, log),
135
+ waitForOpen(ws, openTimeout).pipe(
136
+ Effect.zipRight(send(ws, takeOutbound, log)),
137
+ ),
138
+ { concurrency: "unbounded", discard: true },
116
139
  ),
117
- )
118
- .scoped.retryWhile(isReconnect)
140
+ ),
141
+ Effect.scoped,
142
+ Effect.retryWhile(isReconnect),
143
+ )
119
144
 
120
- return { run, take: queue.take() } as const
145
+ return { run, take: Queue.take(queue) } as const
121
146
  })
122
147
 
123
148
  return { connect } as const
124
149
  })
125
150
 
126
- export interface WS extends Effect.Success<typeof make> {}
151
+ export interface WS extends Effect.Effect.Success<typeof make> {}
127
152
  export const WS = Tag<WS>()
128
153
  export const LiveWS = Layer.effect(WS, make)
@@ -1,30 +1,70 @@
1
- import { LiveSharder, Sharder } from "./DiscordGateway/Sharder.js"
1
+ import { Tag } from "@effect/data/Context"
2
+ import * as HashSet from "@effect/data/HashSet"
3
+ import * as Effect from "@effect/io/Effect"
4
+ import * as Hub from "@effect/io/Hub"
5
+ import * as Layer from "@effect/io/Layer"
6
+ import * as Queue from "@effect/io/Queue"
7
+ import * as Stream from "@effect/stream/Stream"
8
+ import { RunningShard } from "dfx/DiscordGateway/Shard"
9
+ import { LiveSharder, Sharder } from "dfx/DiscordGateway/Sharder"
10
+ import { WebSocketCloseError, WebSocketError } from "dfx/DiscordGateway/WS"
11
+ import * as Discord from "dfx/types"
12
+ import * as EffectUtils from "dfx/utils/Effect"
2
13
 
3
14
  const fromDispatchFactory =
4
- <R, E>(source: Stream<R, E, Discord.GatewayPayload<Discord.ReceiveEvent>>) =>
15
+ <R, E>(
16
+ source: Stream.Stream<R, E, Discord.GatewayPayload<Discord.ReceiveEvent>>,
17
+ ) =>
5
18
  <K extends keyof Discord.ReceiveEvents>(
6
19
  event: K,
7
- ): Stream<R, E, Discord.ReceiveEvents[K]> =>
8
- source.filter(p => p.t === event).map(p => p.d! as any)
20
+ ): Stream.Stream<R, E, Discord.ReceiveEvents[K]> =>
21
+ Stream.filter(source, p => p.t === event).pipe(Stream.map(p => p.d! as any))
9
22
 
10
23
  const handleDispatchFactory =
11
- (hub: Hub<Discord.GatewayPayload<Discord.ReceiveEvent>>) =>
24
+ (hub: Hub.Hub<Discord.GatewayPayload<Discord.ReceiveEvent>>) =>
12
25
  <K extends keyof Discord.ReceiveEvents, R, E, A>(
13
26
  event: K,
14
- handle: (event: Discord.ReceiveEvents[K]) => Effect<R, E, A>,
15
- ): Effect<R, E, never> =>
16
- hub.subscribeForEachPar(_ => {
27
+ handle: (event: Discord.ReceiveEvents[K]) => Effect.Effect<R, E, A>,
28
+ ): Effect.Effect<R, E, never> =>
29
+ EffectUtils.subscribeForEachPar(hub, _ => {
17
30
  if (_.t === event) {
18
31
  return handle(_.d as any)
19
32
  }
20
33
  return Effect.unit
21
34
  })
22
35
 
23
- export const make = Do($ => {
24
- const sharder = $(Sharder.accessWith(identity))
25
- const hub = $(Hub.unbounded<Discord.GatewayPayload<Discord.ReceiveEvent>>())
36
+ export interface DiscordGateway {
37
+ readonly run: Effect.Effect<
38
+ never,
39
+ WebSocketError | WebSocketCloseError,
40
+ never
41
+ >
42
+ readonly dispatch: Stream.Stream<
43
+ never,
44
+ never,
45
+ Discord.GatewayPayload<Discord.ReceiveEvent>
46
+ >
47
+ readonly fromDispatch: <K extends keyof Discord.ReceiveEvents>(
48
+ event: K,
49
+ ) => Stream.Stream<never, never, Discord.ReceiveEvents[K]>
50
+ readonly handleDispatch: <K extends keyof Discord.ReceiveEvents, R, E, A>(
51
+ event: K,
52
+ handle: (event: Discord.ReceiveEvents[K]) => Effect.Effect<R, E, A>,
53
+ ) => Effect.Effect<R, E, never>
54
+ readonly send: (
55
+ payload: Discord.GatewayPayload<Discord.SendEvent>,
56
+ ) => Effect.Effect<never, never, boolean>
57
+ readonly shards: Effect.Effect<never, never, HashSet.HashSet<RunningShard>>
58
+ }
59
+ export const DiscordGateway = Tag<DiscordGateway>()
26
60
 
27
- const sendQueue = $(
61
+ export const make = Effect.gen(function* (_) {
62
+ const sharder = yield* _(Sharder)
63
+ const hub = yield* _(
64
+ Hub.unbounded<Discord.GatewayPayload<Discord.ReceiveEvent>>(),
65
+ )
66
+
67
+ const sendQueue = yield* _(
28
68
  Queue.unbounded<Discord.GatewayPayload<Discord.SendEvent>>(),
29
69
  )
30
70
  const send = (payload: Discord.GatewayPayload<Discord.SendEvent>) =>
@@ -36,17 +76,17 @@ export const make = Do($ => {
36
76
 
37
77
  const run = sharder.run(hub, sendQueue)
38
78
 
39
- return {
79
+ return DiscordGateway.of({
40
80
  run,
41
81
  dispatch,
42
82
  fromDispatch,
43
83
  handleDispatch,
44
84
  send,
45
85
  shards: sharder.shards,
46
- } as const
86
+ })
47
87
  })
48
88
 
49
- export interface DiscordGateway extends Effect.Success<typeof make> {}
50
- export const DiscordGateway = Tag<DiscordGateway>()
51
- export const LiveDiscordGateway =
52
- LiveSharder >> Layer.effect(DiscordGateway, make)
89
+ export const LiveDiscordGateway = Layer.provide(
90
+ LiveSharder,
91
+ Layer.effect(DiscordGateway, make),
92
+ )
@@ -1,12 +1,12 @@
1
- import * as Http from "@effect-http/client"
2
- import { DiscordRESTError } from "dfx/DiscordREST"
3
- import { Effect } from "dfx/_common"
1
+ import type * as Http from "@effect-http/client"
2
+ import type { DiscordRESTError } from "dfx/DiscordREST"
3
+ import type * as Effect from "@effect/io/Effect"
4
4
 
5
5
  export interface ResponseWithData<A> extends Http.response.Response {
6
- readonly json: Effect<never, Http.ResponseDecodeError, A>
6
+ readonly json: Effect.Effect<never, Http.ResponseDecodeError, A>
7
7
  }
8
8
 
9
- export type RestResponse<T> = Effect<
9
+ export type RestResponse<T> = Effect.Effect<
10
10
  never,
11
11
  DiscordRESTError,
12
12
  ResponseWithData<T>
@@ -1,4 +1,5 @@
1
1
  import * as Option from "@effect/data/Option"
2
+ import * as Duration from "@effect/data/Duration"
2
3
 
3
4
  const majorResources = ["channels", "guilds", "webhooks"] as const
4
5
 
@@ -16,18 +17,20 @@ export const routeFromConfig = (path: string, method: string) => {
16
17
  }
17
18
 
18
19
  export const numberHeader = (headers: Headers) => (key: string) =>
19
- Maybe.fromNullable(headers.get(key))
20
- .map(parseFloat)
21
- .filter(n => !isNaN(n))
20
+ Option.fromNullable(headers.get(key)).pipe(
21
+ Option.map(parseFloat),
22
+ Option.filter(n => !isNaN(n)),
23
+ )
22
24
 
23
25
  export const retryAfter = (headers: Headers) =>
24
- numberHeader(headers)("x-ratelimit-reset-after")
25
- .orElse(() => numberHeader(headers)("retry-after"))
26
- .map(Duration.seconds)
26
+ numberHeader(headers)("x-ratelimit-reset-after").pipe(
27
+ Option.orElse(() => numberHeader(headers)("retry-after")),
28
+ Option.map(Duration.seconds),
29
+ )
27
30
 
28
31
  export const rateLimitFromHeaders = (headers: Headers) =>
29
32
  Option.all({
30
- bucket: Maybe.fromNullable(headers.get("x-ratelimit-bucket")),
33
+ bucket: Option.fromNullable(headers.get("x-ratelimit-bucket")),
31
34
  retryAfter: retryAfter(headers),
32
35
  limit: numberHeader(headers)("x-ratelimit-limit"),
33
36
  remaining: numberHeader(headers)("x-ratelimit-remaining"),