dfx 0.126.1 → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (342) hide show
  1. package/.babel.cjs.json +11 -0
  2. package/.babel.mjs.json +10 -0
  3. package/.envrc +1 -0
  4. package/.gitmodules +3 -0
  5. package/.husky/pre-commit +2 -0
  6. package/.oxlintrc.json +72 -0
  7. package/.prettierignore +0 -0
  8. package/.prettierrc.json +5 -0
  9. package/.tool-versions +1 -0
  10. package/.vscode/debug.cjs +8 -0
  11. package/.vscode/launch.json +23 -0
  12. package/.vscode/settings.json +29 -0
  13. package/.vscode/tasks.json +44 -0
  14. package/AGENTS.md +15 -0
  15. package/CHANGELOG.md +1554 -0
  16. package/examples/.env.example +5 -0
  17. package/examples/interactions.ts +79 -0
  18. package/examples/readme.ts +56 -0
  19. package/examples/registry.ts +66 -0
  20. package/flake.lock +27 -0
  21. package/flake.nix +21 -0
  22. package/lerna.json +12 -0
  23. package/package.json +79 -36
  24. package/pnpm-workspace.yaml +7 -0
  25. package/scripts/generate-client.sh +10 -0
  26. package/scripts/worktree-setup.sh +8 -0
  27. package/src/Cache/memory.ts +5 -5
  28. package/src/Cache/memoryTTL.ts +11 -7
  29. package/src/Cache/prelude.ts +10 -8
  30. package/src/Cache.ts +31 -35
  31. package/src/DiscordConfig.ts +12 -16
  32. package/src/DiscordGateway/DiscordWS.ts +58 -32
  33. package/src/DiscordGateway/Messaging.ts +13 -15
  34. package/src/DiscordGateway/Shard/StateStore.ts +30 -25
  35. package/src/DiscordGateway/Shard/heartbeats.ts +25 -28
  36. package/src/DiscordGateway/Shard/identify.ts +11 -6
  37. package/src/DiscordGateway/Shard/sendEvents.ts +1 -1
  38. package/src/DiscordGateway/Shard/utils.ts +1 -1
  39. package/src/DiscordGateway/Shard.ts +39 -35
  40. package/src/DiscordGateway/ShardStore.ts +6 -7
  41. package/src/DiscordGateway/Sharder.ts +31 -29
  42. package/src/DiscordGateway.ts +15 -14
  43. package/src/DiscordREST/Generated.ts +660 -341
  44. package/src/DiscordREST/utils.ts +6 -3
  45. package/src/DiscordREST.ts +37 -41
  46. package/src/Helpers/flags.ts +10 -5
  47. package/src/Helpers/intents.ts +2 -2
  48. package/src/Helpers/interactions.ts +16 -14
  49. package/src/Helpers/members.ts +3 -3
  50. package/src/Helpers/permissions.ts +5 -5
  51. package/src/Helpers/ui.ts +16 -16
  52. package/src/Interactions/builder.ts +10 -10
  53. package/src/Interactions/commandHelper.ts +18 -29
  54. package/src/Interactions/context.ts +51 -65
  55. package/src/Interactions/definitions.ts +3 -3
  56. package/src/Interactions/gateway.ts +33 -45
  57. package/src/Interactions/handlers.ts +8 -5
  58. package/src/Interactions/index.ts +5 -5
  59. package/src/Interactions/utils.ts +6 -6
  60. package/src/Interactions/webhook.ts +31 -38
  61. package/src/RateLimit/memory.ts +3 -3
  62. package/src/RateLimit.ts +18 -15
  63. package/src/gateway.ts +21 -21
  64. package/src/index.ts +17 -17
  65. package/src/types.ts +18 -16
  66. package/src/utils/Effect.ts +38 -27
  67. package/src/webhooks.ts +7 -7
  68. package/test/index.test.ts +5 -0
  69. package/tsconfig.base.json +12 -6
  70. package/tsconfig.examples.json +0 -1
  71. package/vitest.config.ts +22 -0
  72. package/Cache/driver.d.ts +0 -24
  73. package/Cache/driver.d.ts.map +0 -1
  74. package/Cache/driver.js +0 -11
  75. package/Cache/driver.js.map +0 -1
  76. package/Cache/memory.d.ts +0 -5
  77. package/Cache/memory.d.ts.map +0 -1
  78. package/Cache/memory.js +0 -57
  79. package/Cache/memory.js.map +0 -1
  80. package/Cache/memoryTTL.d.ts +0 -23
  81. package/Cache/memoryTTL.d.ts.map +0 -1
  82. package/Cache/memoryTTL.js +0 -128
  83. package/Cache/memoryTTL.js.map +0 -1
  84. package/Cache/prelude.d.ts +0 -32
  85. package/Cache/prelude.d.ts.map +0 -1
  86. package/Cache/prelude.js +0 -143
  87. package/Cache/prelude.js.map +0 -1
  88. package/Cache.d.ts +0 -82
  89. package/Cache.d.ts.map +0 -1
  90. package/Cache.js +0 -144
  91. package/Cache.js.map +0 -1
  92. package/DiscordConfig.d.ts +0 -35
  93. package/DiscordConfig.d.ts.map +0 -1
  94. package/DiscordConfig.js +0 -42
  95. package/DiscordConfig.js.map +0 -1
  96. package/DiscordGateway/DiscordWS.d.ts +0 -37
  97. package/DiscordGateway/DiscordWS.d.ts.map +0 -1
  98. package/DiscordGateway/DiscordWS.js +0 -73
  99. package/DiscordGateway/DiscordWS.js.map +0 -1
  100. package/DiscordGateway/Messaging.d.ts +0 -393
  101. package/DiscordGateway/Messaging.d.ts.map +0 -1
  102. package/DiscordGateway/Messaging.js +0 -40
  103. package/DiscordGateway/Messaging.js.map +0 -1
  104. package/DiscordGateway/Shard/StateStore.d.ts +0 -24
  105. package/DiscordGateway/Shard/StateStore.d.ts.map +0 -1
  106. package/DiscordGateway/Shard/StateStore.js +0 -48
  107. package/DiscordGateway/Shard/StateStore.js.map +0 -1
  108. package/DiscordGateway/Shard/heartbeats.d.ts +0 -8
  109. package/DiscordGateway/Shard/heartbeats.d.ts.map +0 -1
  110. package/DiscordGateway/Shard/heartbeats.js +0 -28
  111. package/DiscordGateway/Shard/heartbeats.js.map +0 -1
  112. package/DiscordGateway/Shard/identify.d.ts +0 -12
  113. package/DiscordGateway/Shard/identify.d.ts.map +0 -1
  114. package/DiscordGateway/Shard/identify.js +0 -38
  115. package/DiscordGateway/Shard/identify.js.map +0 -1
  116. package/DiscordGateway/Shard/sendEvents.d.ts +0 -8
  117. package/DiscordGateway/Shard/sendEvents.d.ts.map +0 -1
  118. package/DiscordGateway/Shard/sendEvents.js +0 -39
  119. package/DiscordGateway/Shard/sendEvents.js.map +0 -1
  120. package/DiscordGateway/Shard/utils.d.ts +0 -6
  121. package/DiscordGateway/Shard/utils.d.ts.map +0 -1
  122. package/DiscordGateway/Shard/utils.js +0 -11
  123. package/DiscordGateway/Shard/utils.js.map +0 -1
  124. package/DiscordGateway/Shard.d.ts +0 -28
  125. package/DiscordGateway/Shard.d.ts.map +0 -1
  126. package/DiscordGateway/Shard.js +0 -149
  127. package/DiscordGateway/Shard.js.map +0 -1
  128. package/DiscordGateway/ShardStore.d.ts +0 -18
  129. package/DiscordGateway/ShardStore.d.ts.map +0 -1
  130. package/DiscordGateway/ShardStore.js +0 -31
  131. package/DiscordGateway/ShardStore.js.map +0 -1
  132. package/DiscordGateway/Sharder.d.ts +0 -13
  133. package/DiscordGateway/Sharder.d.ts.map +0 -1
  134. package/DiscordGateway/Sharder.js +0 -73
  135. package/DiscordGateway/Sharder.js.map +0 -1
  136. package/DiscordGateway.d.ts +0 -32
  137. package/DiscordGateway.d.ts.map +0 -1
  138. package/DiscordGateway.js +0 -28
  139. package/DiscordGateway.js.map +0 -1
  140. package/DiscordREST/Generated.d.ts +0 -5399
  141. package/DiscordREST/Generated.d.ts.map +0 -1
  142. package/DiscordREST/Generated.js +0 -2405
  143. package/DiscordREST/Generated.js.map +0 -1
  144. package/DiscordREST/utils.d.ts +0 -14
  145. package/DiscordREST/utils.d.ts.map +0 -1
  146. package/DiscordREST/utils.js +0 -31
  147. package/DiscordREST/utils.js.map +0 -1
  148. package/DiscordREST.d.ts +0 -23
  149. package/DiscordREST.d.ts.map +0 -1
  150. package/DiscordREST.js +0 -132
  151. package/DiscordREST.js.map +0 -1
  152. package/Helpers/flags.d.ts +0 -28
  153. package/Helpers/flags.d.ts.map +0 -1
  154. package/Helpers/flags.js +0 -48
  155. package/Helpers/flags.js.map +0 -1
  156. package/Helpers/intents.d.ts +0 -25
  157. package/Helpers/intents.d.ts.map +0 -1
  158. package/Helpers/intents.js +0 -34
  159. package/Helpers/intents.js.map +0 -1
  160. package/Helpers/interactions.d.ts +0 -116
  161. package/Helpers/interactions.d.ts.map +0 -1
  162. package/Helpers/interactions.js +0 -143
  163. package/Helpers/interactions.js.map +0 -1
  164. package/Helpers/members.d.ts +0 -10
  165. package/Helpers/members.d.ts.map +0 -1
  166. package/Helpers/members.js +0 -17
  167. package/Helpers/members.js.map +0 -1
  168. package/Helpers/permissions.d.ts +0 -42
  169. package/Helpers/permissions.d.ts.map +0 -1
  170. package/Helpers/permissions.js +0 -97
  171. package/Helpers/permissions.js.map +0 -1
  172. package/Helpers/ui.d.ts +0 -105
  173. package/Helpers/ui.d.ts.map +0 -1
  174. package/Helpers/ui.js +0 -162
  175. package/Helpers/ui.js.map +0 -1
  176. package/Interactions/builder.d.ts +0 -48
  177. package/Interactions/builder.d.ts.map +0 -1
  178. package/Interactions/builder.js +0 -64
  179. package/Interactions/builder.js.map +0 -1
  180. package/Interactions/commandHelper.d.ts +0 -99
  181. package/Interactions/commandHelper.d.ts.map +0 -1
  182. package/Interactions/commandHelper.js +0 -53
  183. package/Interactions/commandHelper.js.map +0 -1
  184. package/Interactions/context.d.ts +0 -54
  185. package/Interactions/context.d.ts.map +0 -1
  186. package/Interactions/context.js +0 -42
  187. package/Interactions/context.js.map +0 -1
  188. package/Interactions/definitions.d.ts +0 -44
  189. package/Interactions/definitions.d.ts.map +0 -1
  190. package/Interactions/definitions.js +0 -67
  191. package/Interactions/definitions.js.map +0 -1
  192. package/Interactions/error.d.ts +0 -2
  193. package/Interactions/error.d.ts.map +0 -1
  194. package/Interactions/error.js +0 -8
  195. package/Interactions/error.js.map +0 -1
  196. package/Interactions/gateway.d.ts +0 -21
  197. package/Interactions/gateway.d.ts.map +0 -1
  198. package/Interactions/gateway.js +0 -90
  199. package/Interactions/gateway.js.map +0 -1
  200. package/Interactions/handlers.d.ts +0 -15
  201. package/Interactions/handlers.d.ts.map +0 -1
  202. package/Interactions/handlers.js +0 -72
  203. package/Interactions/handlers.js.map +0 -1
  204. package/Interactions/index.d.ts +0 -16
  205. package/Interactions/index.d.ts.map +0 -1
  206. package/Interactions/index.js +0 -94
  207. package/Interactions/index.js.map +0 -1
  208. package/Interactions/utils.d.ts +0 -61
  209. package/Interactions/utils.d.ts.map +0 -1
  210. package/Interactions/utils.js +0 -35
  211. package/Interactions/utils.js.map +0 -1
  212. package/Interactions/webhook.d.ts +0 -73
  213. package/Interactions/webhook.d.ts.map +0 -1
  214. package/Interactions/webhook.js +0 -89
  215. package/Interactions/webhook.js.map +0 -1
  216. package/RateLimit/memory.d.ts +0 -3
  217. package/RateLimit/memory.d.ts.map +0 -1
  218. package/RateLimit/memory.js +0 -47
  219. package/RateLimit/memory.js.map +0 -1
  220. package/RateLimit/utils.d.ts +0 -3
  221. package/RateLimit/utils.d.ts.map +0 -1
  222. package/RateLimit/utils.js +0 -25
  223. package/RateLimit/utils.js.map +0 -1
  224. package/RateLimit.d.ts +0 -30
  225. package/RateLimit.d.ts.map +0 -1
  226. package/RateLimit.js +0 -35
  227. package/RateLimit.js.map +0 -1
  228. package/gateway.d.ts +0 -19
  229. package/gateway.d.ts.map +0 -1
  230. package/gateway.js +0 -72
  231. package/gateway.js.map +0 -1
  232. package/index.d.ts +0 -18
  233. package/index.d.ts.map +0 -1
  234. package/index.js +0 -71
  235. package/index.js.map +0 -1
  236. package/mjs/Cache/driver.mjs +0 -3
  237. package/mjs/Cache/driver.mjs.map +0 -1
  238. package/mjs/Cache/memory.mjs +0 -48
  239. package/mjs/Cache/memory.mjs.map +0 -1
  240. package/mjs/Cache/memoryTTL.mjs +0 -119
  241. package/mjs/Cache/memoryTTL.mjs.map +0 -1
  242. package/mjs/Cache/prelude.mjs +0 -131
  243. package/mjs/Cache/prelude.mjs.map +0 -1
  244. package/mjs/Cache.mjs +0 -89
  245. package/mjs/Cache.mjs.map +0 -1
  246. package/mjs/DiscordConfig.mjs +0 -32
  247. package/mjs/DiscordConfig.mjs.map +0 -1
  248. package/mjs/DiscordGateway/DiscordWS.mjs +0 -66
  249. package/mjs/DiscordGateway/DiscordWS.mjs.map +0 -1
  250. package/mjs/DiscordGateway/Messaging.mjs +0 -33
  251. package/mjs/DiscordGateway/Messaging.mjs.map +0 -1
  252. package/mjs/DiscordGateway/Shard/StateStore.mjs +0 -40
  253. package/mjs/DiscordGateway/Shard/StateStore.mjs.map +0 -1
  254. package/mjs/DiscordGateway/Shard/heartbeats.mjs +0 -20
  255. package/mjs/DiscordGateway/Shard/heartbeats.mjs.map +0 -1
  256. package/mjs/DiscordGateway/Shard/identify.mjs +0 -30
  257. package/mjs/DiscordGateway/Shard/identify.mjs.map +0 -1
  258. package/mjs/DiscordGateway/Shard/sendEvents.mjs +0 -26
  259. package/mjs/DiscordGateway/Shard/sendEvents.mjs.map +0 -1
  260. package/mjs/DiscordGateway/Shard/utils.mjs +0 -3
  261. package/mjs/DiscordGateway/Shard/utils.mjs.map +0 -1
  262. package/mjs/DiscordGateway/Shard.mjs +0 -142
  263. package/mjs/DiscordGateway/Shard.mjs.map +0 -1
  264. package/mjs/DiscordGateway/ShardStore.mjs +0 -24
  265. package/mjs/DiscordGateway/ShardStore.mjs.map +0 -1
  266. package/mjs/DiscordGateway/Sharder.mjs +0 -66
  267. package/mjs/DiscordGateway/Sharder.mjs.map +0 -1
  268. package/mjs/DiscordGateway.mjs +0 -21
  269. package/mjs/DiscordGateway.mjs.map +0 -1
  270. package/mjs/DiscordREST/Generated.mjs +0 -2396
  271. package/mjs/DiscordREST/Generated.mjs.map +0 -1
  272. package/mjs/DiscordREST/utils.mjs +0 -20
  273. package/mjs/DiscordREST/utils.mjs.map +0 -1
  274. package/mjs/DiscordREST.mjs +0 -124
  275. package/mjs/DiscordREST.mjs.map +0 -1
  276. package/mjs/Helpers/flags.mjs +0 -36
  277. package/mjs/Helpers/flags.mjs.map +0 -1
  278. package/mjs/Helpers/intents.mjs +0 -27
  279. package/mjs/Helpers/intents.mjs.map +0 -1
  280. package/mjs/Helpers/interactions.mjs +0 -115
  281. package/mjs/Helpers/interactions.mjs.map +0 -1
  282. package/mjs/Helpers/members.mjs +0 -9
  283. package/mjs/Helpers/members.mjs.map +0 -1
  284. package/mjs/Helpers/permissions.mjs +0 -84
  285. package/mjs/Helpers/permissions.mjs.map +0 -1
  286. package/mjs/Helpers/ui.mjs +0 -137
  287. package/mjs/Helpers/ui.mjs.map +0 -1
  288. package/mjs/Interactions/builder.mjs +0 -56
  289. package/mjs/Interactions/builder.mjs.map +0 -1
  290. package/mjs/Interactions/commandHelper.mjs +0 -45
  291. package/mjs/Interactions/commandHelper.mjs.map +0 -1
  292. package/mjs/Interactions/context.mjs +0 -29
  293. package/mjs/Interactions/context.mjs.map +0 -1
  294. package/mjs/Interactions/definitions.mjs +0 -51
  295. package/mjs/Interactions/definitions.mjs.map +0 -1
  296. package/mjs/Interactions/error.mjs +0 -2
  297. package/mjs/Interactions/error.mjs.map +0 -1
  298. package/mjs/Interactions/gateway.mjs +0 -81
  299. package/mjs/Interactions/gateway.mjs.map +0 -1
  300. package/mjs/Interactions/handlers.mjs +0 -63
  301. package/mjs/Interactions/handlers.mjs.map +0 -1
  302. package/mjs/Interactions/index.mjs +0 -11
  303. package/mjs/Interactions/index.mjs.map +0 -1
  304. package/mjs/Interactions/utils.mjs +0 -26
  305. package/mjs/Interactions/utils.mjs.map +0 -1
  306. package/mjs/Interactions/webhook.mjs +0 -76
  307. package/mjs/Interactions/webhook.mjs.map +0 -1
  308. package/mjs/RateLimit/memory.mjs +0 -39
  309. package/mjs/RateLimit/memory.mjs.map +0 -1
  310. package/mjs/RateLimit/utils.mjs +0 -18
  311. package/mjs/RateLimit/utils.mjs.map +0 -1
  312. package/mjs/RateLimit.mjs +0 -28
  313. package/mjs/RateLimit.mjs.map +0 -1
  314. package/mjs/gateway.mjs +0 -19
  315. package/mjs/gateway.mjs.map +0 -1
  316. package/mjs/index.mjs +0 -18
  317. package/mjs/index.mjs.map +0 -1
  318. package/mjs/types.mjs +0 -356
  319. package/mjs/types.mjs.map +0 -1
  320. package/mjs/utils/Effect.mjs +0 -18
  321. package/mjs/utils/Effect.mjs.map +0 -1
  322. package/mjs/version.mjs +0 -2
  323. package/mjs/version.mjs.map +0 -1
  324. package/mjs/webhooks.mjs +0 -6
  325. package/mjs/webhooks.mjs.map +0 -1
  326. package/src/version.ts +0 -1
  327. package/types.d.ts +0 -2457
  328. package/types.d.ts.map +0 -1
  329. package/types.js +0 -408
  330. package/types.js.map +0 -1
  331. package/utils/Effect.d.ts +0 -5
  332. package/utils/Effect.d.ts.map +0 -1
  333. package/utils/Effect.js +0 -27
  334. package/utils/Effect.js.map +0 -1
  335. package/version.d.ts +0 -2
  336. package/version.d.ts.map +0 -1
  337. package/version.js +0 -8
  338. package/version.js.map +0 -1
  339. package/webhooks.d.ts +0 -8
  340. package/webhooks.d.ts.map +0 -1
  341. package/webhooks.js +0 -55
  342. package/webhooks.js.map +0 -1
@@ -1,27 +1,26 @@
1
- import { DiscordConfig } from "dfx/DiscordConfig"
2
- import type { MessageSend } from "dfx/DiscordGateway/DiscordWS"
3
- import {
4
- DiscordWS,
5
- DiscordWSLive,
6
- Reconnect,
7
- } from "dfx/DiscordGateway/DiscordWS"
8
- import { Messaging, MesssagingLive } from "dfx/DiscordGateway/Messaging"
9
- import type { ShardState } from "dfx/DiscordGateway/Shard/StateStore"
10
- import { ShardStateStore } from "dfx/DiscordGateway/Shard/StateStore"
11
- import * as Heartbeats from "dfx/DiscordGateway/Shard/heartbeats"
12
- import * as Identify from "dfx/DiscordGateway/Shard/identify"
13
- import { RateLimiter, RateLimiterLive } from "dfx/RateLimit"
14
- import * as Discord from "dfx/types"
15
- import { GenericTag } from "effect/Context"
1
+ import { DiscordConfig } from "../DiscordConfig.ts"
2
+ import type { MessageSend } from "./DiscordWS.ts"
3
+ import { DiscordWS, DiscordWSLive, Reconnect } from "./DiscordWS.ts"
4
+ import { Messaging, MesssagingLive } from "./Messaging.ts"
5
+ import type { ShardState } from "./Shard/StateStore.ts"
6
+ import { ShardStateStore } from "./Shard/StateStore.ts"
7
+ import * as Heartbeats from "./Shard/heartbeats.ts"
8
+ import * as Identify from "./Shard/identify.ts"
9
+ import { RateLimiter, RateLimiterLive } from "../RateLimit.ts"
10
+ import * as Discord from "../types.ts"
16
11
  import * as Duration from "effect/Duration"
17
12
  import * as Effect from "effect/Effect"
18
13
  import * as Layer from "effect/Layer"
19
14
  import * as Option from "effect/Option"
20
- import * as Mailbox from "effect/Mailbox"
21
15
  import * as Redacted from "effect/Redacted"
22
16
  import type * as Types from "effect/Types"
23
17
  import * as FiberHandle from "effect/FiberHandle"
24
18
  import { constant, constTrue, constVoid } from "effect/Function"
19
+ import * as Queue from "effect/Queue"
20
+ import * as ServiceMap from "effect/ServiceMap"
21
+ import * as PubSub from "effect/PubSub"
22
+ import * as LogLevel from "effect/LogLevel"
23
+ import { MinimumLogLevel } from "effect/References"
25
24
 
26
25
  const enum Phase {
27
26
  Connecting,
@@ -38,6 +37,10 @@ export const make = Effect.gen(function* () {
38
37
 
39
38
  const connect = Effect.fnUntraced(
40
39
  function* (shard: [id: number, count: number]) {
40
+ const traceEnabled = LogLevel.isLessThanOrEqualTo(
41
+ yield* MinimumLogLevel,
42
+ "Trace",
43
+ )
41
44
  const reconnectHandle = yield* FiberHandle.make()
42
45
  let phase = Phase.Connecting
43
46
  const stateStore = shardState.forShard(shard)
@@ -52,6 +55,7 @@ export const make = Effect.gen(function* () {
52
55
  const setPhase = (p: Phase): Effect.Effect<void> =>
53
56
  Effect.suspend(() => {
54
57
  phase = p
58
+ if (!traceEnabled) return Effect.void
55
59
  return Effect.annotateLogs(
56
60
  Effect.logTrace("phase transition"),
57
61
  "phase",
@@ -65,7 +69,7 @@ export const make = Effect.gen(function* () {
65
69
  return write(p)
66
70
  })
67
71
 
68
- const resume = Effect.zipRight(
72
+ const resume = Effect.andThen(
69
73
  FiberHandle.clear(reconnectHandle),
70
74
  setPhase(Phase.Connected),
71
75
  )
@@ -74,18 +78,18 @@ export const make = Effect.gen(function* () {
74
78
 
75
79
  const socket = yield* dws.connect({ onConnecting })
76
80
  const write = (p: MessageSend) =>
77
- Effect.zipRight(
81
+ Effect.andThen(
78
82
  limiter.maybeWait("dfx.shard.send", Duration.minutes(1), 120),
79
83
  socket.write(p),
80
84
  )
81
85
 
82
86
  const hellos = yield* Effect.acquireRelease(
83
- Mailbox.make<Discord.GatewayHelloData>(),
84
- _ => _.shutdown,
87
+ Queue.make<Discord.GatewayHelloData>(),
88
+ Queue.shutdown,
85
89
  )
86
90
  const acks = yield* Effect.acquireRelease(
87
- Mailbox.make<void>(),
88
- _ => _.shutdown,
91
+ Queue.make<void>(),
92
+ Queue.shutdown,
89
93
  )
90
94
 
91
95
  // heartbeats
@@ -129,12 +133,12 @@ export const make = Effect.gen(function* () {
129
133
  case Discord.GatewayOpcodes.Hello: {
130
134
  yield* write(yield* identify)
131
135
  yield* setPhase(Phase.Handshake)
132
- hellos.unsafeOffer(p.d)
136
+ Queue.offerUnsafe(hellos, p.d)
133
137
  yield* FiberHandle.run(reconnectHandle, delayedReconnect)
134
138
  return
135
139
  }
136
140
  case Discord.GatewayOpcodes.HeartbeatAck: {
137
- acks.unsafeOffer(void 0)
141
+ Queue.offerUnsafe(acks, void 0)
138
142
  return
139
143
  }
140
144
  case Discord.GatewayOpcodes.InvalidSession: {
@@ -149,7 +153,7 @@ export const make = Effect.gen(function* () {
149
153
  if (p.t === "READY" || p.t === "RESUMED") {
150
154
  yield* resume
151
155
  }
152
- hub.unsafeOffer(p)
156
+ PubSub.publishUnsafe(hub, p)
153
157
  return
154
158
  }
155
159
  case Discord.GatewayOpcodes.Reconnect: {
@@ -161,15 +165,15 @@ export const make = Effect.gen(function* () {
161
165
 
162
166
  yield* Effect.whileLoop({
163
167
  while: constTrue,
164
- body: constant(Effect.flatMap(sendMailbox.take, write)),
168
+ body: constant(Effect.flatMap(Queue.take(sendMailbox), write)),
165
169
  step: constVoid,
166
- }).pipe(Effect.forkScoped, Effect.interruptible)
170
+ }).pipe(Effect.forkScoped)
167
171
 
168
172
  yield* Effect.gen(function* () {
169
173
  while (true) {
170
174
  yield* onPayload(yield* socket.take)
171
175
  }
172
- }).pipe(Effect.forkScoped, Effect.interruptible)
176
+ }).pipe(Effect.forkScoped)
173
177
 
174
178
  return { id: shard, write } as const
175
179
  },
@@ -184,12 +188,11 @@ export const make = Effect.gen(function* () {
184
188
  return { connect } as const
185
189
  })
186
190
 
187
- type ShardService = Effect.Effect.Success<typeof make>
191
+ type ShardService = Effect.Success<typeof make>
188
192
 
189
- export interface Shard {
190
- readonly _: unique symbol
191
- }
192
- export const Shard = GenericTag<Shard, ShardService>("dfx/DiscordGateway/Shard")
193
+ export class Shard extends ServiceMap.Service<Shard, ShardService>()(
194
+ "dfx/DiscordGateway/Shard",
195
+ ) {}
193
196
  export const ShardLive = Layer.effect(Shard, make).pipe(
194
197
  Layer.provide(DiscordWSLive),
195
198
  Layer.provide(MesssagingLive),
@@ -197,5 +200,6 @@ export const ShardLive = Layer.effect(Shard, make).pipe(
197
200
  )
198
201
 
199
202
  // eslint-disable-next-line @typescript-eslint/no-empty-object-type
200
- export interface RunningShard
201
- extends Effect.Effect.Success<ReturnType<ShardService["connect"]>> {}
203
+ export interface RunningShard extends Effect.Success<
204
+ ReturnType<ShardService["connect"]>
205
+ > {}
@@ -1,7 +1,7 @@
1
- import { GenericTag } from "effect/Context"
2
1
  import * as Option from "effect/Option"
3
2
  import * as Effect from "effect/Effect"
4
3
  import * as Layer from "effect/Layer"
4
+ import * as ServiceMap from "effect/ServiceMap"
5
5
 
6
6
  export interface ClaimIdContext {
7
7
  sharderCount: number
@@ -13,12 +13,11 @@ export interface ShardStoreService {
13
13
  allClaimed: (totalCount: number) => Effect.Effect<boolean>
14
14
  heartbeat?: (shardId: number) => Effect.Effect<void>
15
15
  }
16
- export interface ShardStore {
17
- readonly _: unique symbol
18
- }
19
- export const ShardStore = GenericTag<ShardStore, ShardStoreService>(
20
- "dfx/DiscordGateway/ShardStore",
21
- )
16
+
17
+ export class ShardStore extends ServiceMap.Service<
18
+ ShardStore,
19
+ ShardStoreService
20
+ >()("dfx/DiscordGateway/ShardStore") {}
22
21
 
23
22
  // Very basic shard id store, that does no health checks
24
23
  const memoryStore = (): ShardStoreService => {
@@ -1,11 +1,10 @@
1
- import { DiscordConfig } from "dfx/DiscordConfig"
2
- import type { RunningShard } from "dfx/DiscordGateway/Shard"
3
- import { Shard, ShardLive } from "dfx/DiscordGateway/Shard"
4
- import { ShardStore } from "dfx/DiscordGateway/ShardStore"
5
- import { DiscordREST, DiscordRESTLive } from "dfx/DiscordREST"
6
- import { RateLimiter, RateLimiterLive } from "dfx/RateLimit"
7
- import type * as Discord from "dfx/types"
8
- import { GenericTag } from "effect/Context"
1
+ import { DiscordConfig } from "../DiscordConfig.ts"
2
+ import type { RunningShard } from "./Shard.ts"
3
+ import { Shard, ShardLive } from "./Shard.ts"
4
+ import { ShardStore } from "./ShardStore.ts"
5
+ import { DiscordREST, DiscordRESTLive } from "../DiscordREST.ts"
6
+ import { RateLimiter, RateLimiterLive } from "../RateLimit.ts"
7
+ import type * as Discord from "../types.ts"
9
8
  import * as Duration from "effect/Duration"
10
9
  import * as Effect from "effect/Effect"
11
10
  import { pipe } from "effect/Function"
@@ -13,23 +12,25 @@ import * as Layer from "effect/Layer"
13
12
  import type * as Option from "effect/Option"
14
13
  import * as Ref from "effect/Ref"
15
14
  import * as Schedule from "effect/Schedule"
15
+ import * as ServiceMap from "effect/ServiceMap"
16
16
 
17
- const claimRepeatPolicy = Schedule.spaced("3 minutes").pipe(
18
- Schedule.whileInput((_: Option.Option<number>) => _._tag === "None"),
17
+ const claimRepeatPolicy = Schedule.identity<Option.Option<number>>().pipe(
18
+ Schedule.either(Schedule.spaced("3 minutes")),
19
+ Schedule.while(_ => Effect.succeed(_.input._tag === "None")),
19
20
  Schedule.passthrough,
20
21
  ) as Schedule.Schedule<Option.Some<number>, Option.Option<number>>
21
22
 
22
23
  const make = Effect.gen(function* () {
23
24
  const store = yield* ShardStore
24
25
  const rest = yield* DiscordREST
25
- const { gateway: config } = yield* DiscordConfig
26
+ const { gateway: gatewayConfig } = yield* DiscordConfig
26
27
  const limiter = yield* RateLimiter
27
28
  const shard = yield* Shard
28
29
  const currentShards = new Set<RunningShard>()
29
30
 
30
31
  const gateway = yield* rest.getBotGateway().pipe(
31
- Effect.catchAll(() =>
32
- Effect.succeed<Discord.GatewayBotResponse>({
32
+ Effect.catch(() =>
33
+ Effect.succeed<Discord.APIGatewayBotInfo>({
33
34
  url: "wss://gateway.discord.gg/",
34
35
  shards: 1,
35
36
  session_start_limit: {
@@ -42,7 +43,7 @@ const make = Effect.gen(function* () {
42
43
  ),
43
44
  )
44
45
 
45
- const totalCount = config.shardCount ?? gateway.shards
46
+ const totalCount = gatewayConfig.shardCount ?? gateway.shards
46
47
  const currentCount = yield* Ref.make(0)
47
48
  const claimId = (sharderCount: number): Effect.Effect<number> =>
48
49
  pipe(
@@ -61,21 +62,22 @@ const make = Effect.gen(function* () {
61
62
 
62
63
  const spawner = pipe(
63
64
  takeConfig,
64
- Effect.map(config => ({
65
- ...config,
65
+ Effect.map(shardConfig => ({
66
+ ...shardConfig,
66
67
  url: gateway.url,
67
68
  concurrency: gateway.session_start_limit.max_concurrency,
68
69
  })),
69
70
  Effect.tap(({ concurrency, id }) =>
70
71
  limiter.maybeWait(
71
72
  `dfx.sharder.${id % concurrency}`,
72
- Duration.millis(config.identifyRateLimit[0]),
73
- config.identifyRateLimit[1],
73
+ Duration.millis(gatewayConfig.identifyRateLimit[0]),
74
+ gatewayConfig.identifyRateLimit[1],
74
75
  ),
75
76
  ),
76
77
  Effect.flatMap(c => shard.connect([c.id, c.totalCount])),
77
- Effect.tap(shard => {
78
- currentShards.add(shard)
78
+ Effect.tap(runningShard => {
79
+ currentShards.add(runningShard)
80
+ return Effect.void
79
81
  }),
80
82
  Effect.forever,
81
83
  )
@@ -86,11 +88,10 @@ const make = Effect.gen(function* () {
86
88
  { concurrency: "unbounded", discard: true },
87
89
  ).pipe(
88
90
  Effect.scoped,
89
- Effect.catchAllCause(Effect.logError),
91
+ Effect.catchCause(Effect.logError),
90
92
  Effect.ensuring(Effect.sync(() => currentShards.clear())),
91
93
  Effect.forever,
92
94
  Effect.forkScoped,
93
- Effect.interruptible,
94
95
  )
95
96
 
96
97
  return {
@@ -103,13 +104,14 @@ const make = Effect.gen(function* () {
103
104
  }),
104
105
  )
105
106
 
106
- export interface Sharder {
107
- readonly _: unique symbol
108
- }
109
- export const Sharder = GenericTag<Sharder, Effect.Effect.Success<typeof make>>(
110
- "dfx/DiscordGateway/Sharder",
111
- )
112
- export const SharderLive = Layer.scoped(Sharder, make).pipe(
107
+ export class Sharder extends ServiceMap.Service<
108
+ Sharder,
109
+ {
110
+ readonly shards: Effect.Effect<ReadonlySet<RunningShard>, never, never>
111
+ }
112
+ >()("dfx/DiscordGateway/Sharder") {}
113
+
114
+ export const SharderLive = Layer.effect(Sharder, make).pipe(
113
115
  Layer.provide(DiscordRESTLive),
114
116
  Layer.provide(RateLimiterLive),
115
117
  Layer.provide(ShardLive),
@@ -1,19 +1,19 @@
1
- import type { HttpClient } from "@effect/platform/HttpClient"
2
- import type { WebSocketConstructor } from "@effect/platform/Socket"
3
- import type { DiscordConfig } from "dfx/DiscordConfig"
4
- import type { DiscordWSCodec } from "dfx/DiscordGateway/DiscordWS"
5
- import type { Messsaging } from "dfx/DiscordGateway/Messaging"
6
- import { Messaging, MesssagingLive } from "dfx/DiscordGateway/Messaging"
7
- import type { RunningShard } from "dfx/DiscordGateway/Shard"
8
- import type { ShardStateStore } from "dfx/DiscordGateway/Shard/StateStore"
9
- import { Sharder, SharderLive } from "dfx/DiscordGateway/Sharder"
10
- import type { ShardStore } from "dfx/DiscordGateway/ShardStore"
11
- import type { RateLimitStore } from "dfx/RateLimit"
12
- import type * as Discord from "dfx/types"
13
- import { GenericTag } from "effect/Context"
1
+ import type { WebSocketConstructor } from "effect/unstable/socket/Socket"
2
+ import type { DiscordConfig } from "./DiscordConfig.ts"
3
+ import type { DiscordWSCodec } from "./DiscordGateway/DiscordWS.ts"
4
+ import type { Messsaging } from "./DiscordGateway/Messaging.ts"
5
+ import { Messaging, MesssagingLive } from "./DiscordGateway/Messaging.ts"
6
+ import type { RunningShard } from "./DiscordGateway/Shard.ts"
7
+ import type { ShardStateStore } from "./DiscordGateway/Shard/StateStore.ts"
8
+ import { Sharder, SharderLive } from "./DiscordGateway/Sharder.ts"
9
+ import type { ShardStore } from "./DiscordGateway/ShardStore.ts"
10
+ import type { RateLimitStore } from "./RateLimit.ts"
11
+ import type * as Discord from "./types.ts"
14
12
  import * as Effect from "effect/Effect"
15
13
  import * as Layer from "effect/Layer"
16
14
  import type * as Stream from "effect/Stream"
15
+ import type { HttpClient } from "effect/unstable/http/HttpClient"
16
+ import * as ServiceMap from "effect/ServiceMap"
17
17
 
18
18
  export const TypeId = Symbol.for("dfx/DiscordGateway")
19
19
  export type TypeId = typeof TypeId
@@ -45,7 +45,8 @@ export interface DiscordGateway {
45
45
  readonly shards: Effect.Effect<ReadonlySet<RunningShard>>
46
46
  }
47
47
 
48
- export const DiscordGateway = GenericTag<DiscordGateway>("dfx/DiscordGateway")
48
+ export const DiscordGateway =
49
+ ServiceMap.Service<DiscordGateway>("dfx/DiscordGateway")
49
50
 
50
51
  export const make: Effect.Effect<DiscordGateway, never, Messsaging | Sharder> =
51
52
  Effect.gen(function* () {