dfx 0.50.1 → 0.51.1

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 -95
  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 -57
  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 -26
  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 -29
  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 -15
  32. package/DiscordGateway/Shard/heartbeats.js.map +1 -1
  33. package/DiscordGateway/Shard/identify.d.ts +11 -8
  34. package/DiscordGateway/Shard/identify.d.ts.map +1 -1
  35. package/DiscordGateway/Shard/identify.js +41 -21
  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 +20 -8
  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 -81
  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 -51
  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 +102 -71
  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 -31
  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 +6 -4
  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 -123
  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 +23 -22
  87. package/Helpers/interactions.d.ts.map +1 -1
  88. package/Helpers/interactions.js +75 -40
  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 +87 -55
  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 -36
  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 -42
  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 +22 -17
  131. package/Interactions/webhook.d.ts.map +1 -1
  132. package/Interactions/webhook.js +74 -39
  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 -24
  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 +42 -50
  249. package/src/Cache/driver.ts +27 -15
  250. package/src/Cache/memory.ts +13 -9
  251. package/src/Cache/memoryTTL.ts +69 -53
  252. package/src/Cache/prelude.ts +113 -91
  253. package/src/Cache.ts +86 -61
  254. package/src/DiscordConfig.ts +34 -19
  255. package/src/DiscordGateway/DiscordWS.ts +28 -25
  256. package/src/DiscordGateway/Shard/heartbeats.ts +52 -27
  257. package/src/DiscordGateway/Shard/identify.ts +29 -23
  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 +36 -9
  261. package/src/DiscordGateway/Shard.ts +129 -104
  262. package/src/DiscordGateway/ShardStore.ts +12 -5
  263. package/src/DiscordGateway/Sharder.ts +98 -77
  264. package/src/DiscordGateway/WS.ts +87 -58
  265. package/src/DiscordGateway.ts +59 -18
  266. package/src/DiscordREST/types.ts +5 -5
  267. package/src/DiscordREST/utils.ts +13 -8
  268. package/src/DiscordREST.ts +160 -131
  269. package/src/Helpers/intents.ts +1 -0
  270. package/src/Helpers/interactions.ts +76 -65
  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 +67 -37
  276. package/src/Interactions/definitions.ts +32 -24
  277. package/src/Interactions/gateway.ts +80 -46
  278. package/src/Interactions/handlers.ts +68 -48
  279. package/src/Interactions/index.ts +6 -5
  280. package/src/Interactions/utils.ts +32 -21
  281. package/src/Interactions/webhook.ts +90 -51
  282. package/src/Log.ts +5 -1
  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 -23
  335. package/utils/hub.js.map +0 -1
@@ -1,7 +1,18 @@
1
+ import * as Chunk from "@effect/data/Chunk"
2
+ import { Tag } from "@effect/data/Context"
3
+ import { identity } from "@effect/data/Function"
4
+ import * as Option from "@effect/data/Option"
5
+ import * as Cause from "@effect/io/Cause"
6
+ import * as Config from "@effect/io/Config"
7
+ import * as ConfigError from "@effect/io/Config/Error"
8
+ import * as ConfigSecret from "@effect/io/Config/Secret"
9
+ import * as Effect from "@effect/io/Effect"
10
+ import * as Layer from "@effect/io/Layer"
11
+ import * as D from "dfx/Interactions/definitions"
12
+ import { DefinitionNotFound, handlers } from "dfx/Interactions/handlers"
13
+ import { Interaction, InteractionBuilder } from "dfx/Interactions/index"
14
+ import * as Discord from "dfx/types"
1
15
  import * as Verify from "discord-verify"
2
- import * as D from "./definitions.js"
3
- import { DefinitionNotFound, handlers } from "./handlers.js"
4
- import { InteractionBuilder, Interaction } from "./index.js"
5
16
 
6
17
  export class BadWebhookSignature {
7
18
  readonly _tag = "BadWebhookSignature"
@@ -16,11 +27,11 @@ const checkSignature = (
16
27
  crypto: SubtleCrypto,
17
28
  algorithm: any,
18
29
  ) =>
19
- Maybe.struct({
20
- signature: Maybe.fromNullable(headers["x-signature-ed25519"]),
21
- timestamp: Maybe.fromNullable(headers["x-signature-timestamp"]),
22
- })
23
- .flatMap(_ =>
30
+ Option.all({
31
+ signature: Option.fromNullable(headers["x-signature-ed25519"]),
32
+ timestamp: Option.fromNullable(headers["x-signature-timestamp"]),
33
+ }).pipe(
34
+ Effect.flatMap(_ =>
24
35
  Effect.promise(() =>
25
36
  Verify.verify(
26
37
  body,
@@ -31,15 +42,17 @@ const checkSignature = (
31
42
  algorithm,
32
43
  ),
33
44
  ),
34
- )
35
- .filterOrFail(identity, () => new BadWebhookSignature())
36
- .catchAllCause(() => Effect.fail(new BadWebhookSignature())).asUnit
45
+ ),
46
+ Effect.filterOrFail(identity, () => new BadWebhookSignature()),
47
+ Effect.catchAllCause(() => Effect.fail(new BadWebhookSignature())),
48
+ Effect.asUnit,
49
+ )
37
50
 
38
51
  export interface MakeConfigOpts {
39
- applicationId: string
40
- publicKey: ConfigSecret
41
- crypto: SubtleCrypto
42
- algorithm: keyof typeof Verify.PlatformAlgorithm
52
+ readonly applicationId: string
53
+ readonly publicKey: ConfigSecret.ConfigSecret
54
+ readonly crypto: SubtleCrypto
55
+ readonly algorithm: keyof typeof Verify.PlatformAlgorithm
43
56
  }
44
57
  const makeConfig = ({
45
58
  applicationId,
@@ -48,17 +61,22 @@ const makeConfig = ({
48
61
  algorithm,
49
62
  }: MakeConfigOpts) => ({
50
63
  applicationId,
51
- publicKey: publicKey.value,
64
+ publicKey: ConfigSecret.value(publicKey),
52
65
  crypto,
53
66
  algorithm: Verify.PlatformAlgorithm[algorithm],
54
67
  })
68
+
55
69
  export interface WebhookConfig extends ReturnType<typeof makeConfig> {}
56
70
  export const WebhookConfig = Tag<WebhookConfig>()
57
- export const makeConfigLayer = flow(makeConfig, _ =>
58
- Layer.succeed(WebhookConfig, _),
59
- )
60
- export const makeFromConfig = (a: Config<MakeConfigOpts>) =>
61
- a.config.map(makeConfig).toLayer(WebhookConfig)
71
+
72
+ export const makeConfigLayer = (opts: MakeConfigOpts) =>
73
+ Layer.succeed(WebhookConfig, makeConfig(opts))
74
+
75
+ export const makeFromConfig: (
76
+ a: Config.Config<MakeConfigOpts>,
77
+ ) => Layer.Layer<never, ConfigError.ConfigError, WebhookConfig> = (
78
+ a: Config.Config<MakeConfigOpts>,
79
+ ) => Layer.effect(WebhookConfig, Effect.map(Effect.config(a), makeConfig))
62
80
 
63
81
  export class WebhookParseError {
64
82
  readonly _tag = "WebhookParseError"
@@ -66,57 +84,64 @@ export class WebhookParseError {
66
84
  }
67
85
 
68
86
  const fromHeadersAndBody = (headers: Headers, body: string) =>
69
- Do($ => {
70
- const { publicKey, crypto, algorithm } = $(WebhookConfig)
71
- $(checkSignature(publicKey, headers, body, crypto, algorithm))
72
- return $(
73
- Effect.tryCatch(
74
- () => JSON.parse(body) as Discord.Interaction,
75
- reason => new WebhookParseError(reason),
76
- ),
77
- )
78
- })
87
+ Effect.tap(WebhookConfig, ({ publicKey, crypto, algorithm }) =>
88
+ checkSignature(publicKey, headers, body, crypto, algorithm),
89
+ ).pipe(
90
+ Effect.flatMap(() =>
91
+ Effect.try({
92
+ try: () => JSON.parse(body) as Discord.Interaction,
93
+ catch: reason => new WebhookParseError(reason),
94
+ }),
95
+ ),
96
+ )
79
97
 
80
98
  const run = <R, E>(
81
- definitions: Chunk<
99
+ definitions: Chunk.Chunk<
82
100
  readonly [
83
101
  handler: D.InteractionDefinition<R, E>,
84
102
  transform: (
85
- self: Effect<R, E, Discord.InteractionResponse>,
86
- ) => Effect<R, E, Discord.InteractionResponse>,
103
+ self: Effect.Effect<R, E, Discord.InteractionResponse>,
104
+ ) => Effect.Effect<R, E, Discord.InteractionResponse>,
87
105
  ]
88
106
  >,
89
107
  handleResponse: (
90
108
  ix: Discord.Interaction,
91
109
  _: Discord.InteractionResponse,
92
- ) => Effect<R, E, Discord.InteractionResponse>,
110
+ ) => Effect.Effect<R, E, Discord.InteractionResponse>,
93
111
  ) => {
94
112
  const handler = handlers(definitions, handleResponse)
95
113
  return (headers: Headers, body: string) =>
96
- Do($ => {
97
- const interaction = $(fromHeadersAndBody(headers, body))
98
- return $(
99
- handler[interaction.type](interaction).provideService(
100
- Interaction,
101
- interaction,
102
- ),
103
- )
104
- })
114
+ Effect.flatMap(fromHeadersAndBody(headers, body), interaction =>
115
+ Effect.provideService(
116
+ handler[interaction.type](interaction),
117
+ Interaction,
118
+ interaction,
119
+ ),
120
+ )
105
121
  }
106
122
 
107
123
  export interface HandleWebhookOpts<E> {
108
124
  headers: Headers
109
125
  body: string
110
- success: (a: Discord.InteractionResponse) => Effect<never, never, void>
111
- error: (e: Cause<E>) => Effect<never, never, void>
126
+ success: (a: Discord.InteractionResponse) => Effect.Effect<never, never, void>
127
+ error: (e: Cause.Cause<E>) => Effect.Effect<never, never, void>
112
128
  }
113
129
 
114
130
  /**
115
131
  * @tsplus getter dfx/InteractionBuilder webhookHandler
116
132
  */
117
- export const makeHandler = <R, E, TE>(ix: InteractionBuilder<R, E, TE>) => {
133
+ export const makeHandler = <R, E, TE>(
134
+ ix: InteractionBuilder<R, E, TE>,
135
+ ): (({
136
+ headers,
137
+ body,
138
+ success,
139
+ error,
140
+ }: HandleWebhookOpts<
141
+ E | WebhookParseError | BadWebhookSignature | DefinitionNotFound
142
+ >) => Effect.Effect<WebhookConfig, never, void>) => {
118
143
  const handle = run(
119
- ix.definitions.map(([d]) => [d, identity] as any),
144
+ Chunk.map(ix.definitions, ([d]) => [d, identity] as any),
120
145
  (_i, r) => Effect.succeed(r),
121
146
  )
122
147
 
@@ -127,7 +152,11 @@ export const makeHandler = <R, E, TE>(ix: InteractionBuilder<R, E, TE>) => {
127
152
  error,
128
153
  }: HandleWebhookOpts<
129
154
  E | WebhookParseError | BadWebhookSignature | DefinitionNotFound
130
- >) => handle(headers, body).flatMap(success).catchAllCause(error)
155
+ >): Effect.Effect<WebhookConfig, never, void> =>
156
+ handle(headers, body).pipe(
157
+ Effect.flatMap(success),
158
+ Effect.catchAllCause(error),
159
+ )
131
160
  }
132
161
 
133
162
  /**
@@ -135,9 +164,19 @@ export const makeHandler = <R, E, TE>(ix: InteractionBuilder<R, E, TE>) => {
135
164
  */
136
165
  export const makeSimpleHandler = <R, E, TE>(
137
166
  ix: InteractionBuilder<R, E, TE>,
138
- ) => {
167
+ ): (({
168
+ headers,
169
+ body,
170
+ }: {
171
+ headers: Headers
172
+ body: string
173
+ }) => Effect.Effect<
174
+ WebhookConfig,
175
+ BadWebhookSignature | WebhookParseError | DefinitionNotFound,
176
+ Discord.InteractionResponse
177
+ >) => {
139
178
  const handle = run(
140
- ix.definitions.map(([d]) => [d, identity] as any),
179
+ Chunk.map(ix.definitions, ([d]) => [d, identity] as any),
141
180
  (_i, r) => Effect.succeed(r),
142
181
  )
143
182
 
package/src/Log.ts CHANGED
@@ -1,3 +1,7 @@
1
+ import * as Effect from "@effect/io/Effect"
2
+ import * as Layer from "@effect/io/Layer"
3
+ import { Tag } from "@effect/data/Context"
4
+
1
5
  const make = (debug = false) => ({
2
6
  info: (...args: any[]) =>
3
7
  Effect.sync(() => {
@@ -8,7 +12,7 @@ const make = (debug = false) => ({
8
12
  ? Effect.sync(() => {
9
13
  console.error("DEBUG", ...args)
10
14
  })
11
- : Effect.unit(),
15
+ : Effect.unit,
12
16
  })
13
17
 
14
18
  export interface Log extends ReturnType<typeof make> {}
@@ -1,4 +1,6 @@
1
- import { BucketDetails, RateLimitStore } from "../RateLimit.js"
1
+ import * as Option from "@effect/data/Option"
2
+ import * as Effect from "@effect/io/Effect"
3
+ import { BucketDetails, RateLimitStore } from "dfx/RateLimit"
2
4
 
3
5
  interface Counter {
4
6
  count: number
@@ -11,10 +13,13 @@ export const make = (): RateLimitStore => {
11
13
  const counters = new Map<string, Counter>()
12
14
 
13
15
  const getCounter = (key: string) =>
14
- Maybe.fromNullable(counters.get(key)).filter(c => c.expires > Date.now())
16
+ Option.filter(
17
+ Option.fromNullable(counters.get(key)),
18
+ c => c.expires > Date.now(),
19
+ )
15
20
 
16
21
  const getBucketForRoute = (route: string) =>
17
- Effect.sync(() => Maybe.fromNullable(buckets.get(routes.get(route)!)))
22
+ Effect.sync(() => Option.fromNullable(buckets.get(routes.get(route)!)))
18
23
 
19
24
  return {
20
25
  hasBucket: key => Effect.sync(() => buckets.has(key)),
@@ -40,7 +45,8 @@ export const make = (): RateLimitStore => {
40
45
  Effect.sync(() => {
41
46
  const now = Date.now()
42
47
  const perRequest = Math.ceil(window / limit)
43
- const counter = getCounter(key).getOrElse(
48
+ const counter = Option.getOrElse(
49
+ getCounter(key),
44
50
  (): Counter => ({
45
51
  expires: now,
46
52
  count: 0,
@@ -1,4 +1,4 @@
1
- import { millis, zero } from "@effect/data/Duration"
1
+ import { Duration, millis, zero } from "@effect/data/Duration"
2
2
 
3
3
  export const delayFrom = (
4
4
  window: number,
package/src/RateLimit.ts CHANGED
@@ -1,6 +1,11 @@
1
- import { delayFrom } from "./RateLimit/utils.js"
2
- import * as Memory from "./RateLimit/memory.js"
1
+ import { Tag } from "@effect/data/Context"
2
+ import * as Duration from "@effect/data/Duration"
3
+ import * as Option from "@effect/data/Option"
4
+ import * as Effect from "@effect/io/Effect"
5
+ import * as Layer from "@effect/io/Layer"
3
6
  import { Log } from "dfx/Log"
7
+ import * as Memory from "dfx/RateLimit/memory"
8
+ import { delayFrom } from "dfx/RateLimit/utils"
4
9
 
5
10
  export type BucketDetails = {
6
11
  key: "global" | string
@@ -9,61 +14,69 @@ export type BucketDetails = {
9
14
  }
10
15
 
11
16
  export interface RateLimitStore {
12
- hasBucket: (bucketKey: string) => Effect<never, never, boolean>
17
+ readonly hasBucket: (
18
+ bucketKey: string,
19
+ ) => Effect.Effect<never, never, boolean>
13
20
 
14
- putBucket: (bucket: BucketDetails) => Effect<never, never, void>
21
+ readonly putBucket: (
22
+ bucket: BucketDetails,
23
+ ) => Effect.Effect<never, never, void>
15
24
 
16
- getBucketForRoute: (
25
+ readonly getBucketForRoute: (
17
26
  route: string,
18
- ) => Effect<never, never, Maybe<BucketDetails>>
27
+ ) => Effect.Effect<never, never, Option.Option<BucketDetails>>
19
28
 
20
- putBucketRoute: (
29
+ readonly putBucketRoute: (
21
30
  route: string,
22
31
  bucketKey: string,
23
- ) => Effect<never, never, void>
32
+ ) => Effect.Effect<never, never, void>
24
33
 
25
- incrementCounter: (
34
+ readonly incrementCounter: (
26
35
  key: string,
27
36
  window: number,
28
37
  limit: number,
29
- ) => Effect<never, never, readonly [count: number, ttl: number]>
38
+ ) => Effect.Effect<never, never, readonly [count: number, ttl: number]>
30
39
 
31
- removeCounter: (key: string) => Effect<never, never, void>
40
+ readonly removeCounter: (key: string) => Effect.Effect<never, never, void>
32
41
  }
33
42
 
34
43
  export const RateLimitStore = Tag<RateLimitStore>()
35
44
  export const LiveMemoryRateLimitStore = Layer.sync(RateLimitStore, Memory.make)
36
45
 
37
- const makeLimiter = Do($ => {
38
- const store = $(RateLimitStore)
39
- const log = $(Log)
46
+ const makeLimiter = Effect.gen(function* (_) {
47
+ const store = yield* _(RateLimitStore)
48
+ const log = yield* _(Log)
40
49
 
41
50
  const maybeWait = (
42
51
  key: string,
43
- window: Duration,
52
+ window: Duration.Duration,
44
53
  limit: number,
45
54
  multiplier = 1.05,
46
55
  ) => {
47
- const windowMs = window.millis * multiplier
56
+ const windowMs = Duration.toMillis(window) * multiplier
48
57
 
49
- return store
50
- .incrementCounter(key, windowMs, limit)
51
- .map(([count, ttl]) => delayFrom(windowMs, limit, count, ttl))
52
- .tap(d =>
58
+ return store.incrementCounter(key, windowMs, limit).pipe(
59
+ Effect.map(([count, ttl]) => delayFrom(windowMs, limit, count, ttl)),
60
+ Effect.tap(d =>
53
61
  log.debug("RateLimitStore maybeWait", {
54
62
  key,
55
- window: window.millis,
63
+ window: Duration.toMillis(window),
56
64
  windowMs,
57
65
  limit,
58
- delay: d.millis,
66
+ delay: Duration.toMillis(d),
59
67
  }),
60
- )
61
- .tap(_ => (_.millis === 0 ? Effect.unit() : Effect.sleep(_))).asUnit
68
+ ),
69
+ Effect.tap(_ =>
70
+ Duration.toMillis(_) === 0 ? Effect.unit : Effect.sleep(_),
71
+ ),
72
+ Effect.asUnit,
73
+ )
62
74
  }
63
75
 
64
76
  return { maybeWait }
65
77
  })
66
78
 
67
- export interface RateLimiter extends Effect.Success<typeof makeLimiter> {}
79
+ export interface RateLimiter
80
+ extends Effect.Effect.Success<typeof makeLimiter> {}
68
81
  export const RateLimiter = Tag<RateLimiter>()
69
82
  export const LiveRateLimiter = Layer.effect(RateLimiter, makeLimiter)
package/src/gateway.ts CHANGED
@@ -1,41 +1,78 @@
1
+ import type { HttpRequestExecutor } from "@effect-http/client"
1
2
  import { LiveFetchRequestExecutor } from "@effect-http/client"
3
+ import * as Config from "@effect/io/Config"
4
+ import type * as ConfigError from "@effect/io/Config/Error"
5
+ import * as Effect from "@effect/io/Effect"
6
+ import * as Layer from "@effect/io/Layer"
7
+ import type { DiscordREST } from "dfx"
2
8
  import { DiscordConfig, LiveDiscordREST, Log } from "dfx"
3
- import { LiveDiscordGateway } from "./DiscordGateway.js"
4
- import { LiveJsonDiscordWSCodec } from "./DiscordGateway/DiscordWS.js"
5
- import { LiveMemoryShardStore } from "./DiscordGateway/ShardStore.js"
6
- import { LiveMemoryRateLimitStore, LiveRateLimiter } from "./RateLimit.js"
9
+ import * as CachePrelude from "dfx/Cache/prelude"
10
+ import type { DiscordGateway } from "dfx/DiscordGateway"
11
+ import { LiveDiscordGateway } from "dfx/DiscordGateway"
12
+ import * as DiscordWS from "dfx/DiscordGateway/DiscordWS"
13
+ import { LiveJsonDiscordWSCodec } from "dfx/DiscordGateway/DiscordWS"
14
+ import * as Shard from "dfx/DiscordGateway/Shard"
15
+ import * as SendEvent from "dfx/DiscordGateway/Shard/sendEvents"
16
+ import * as ShardStore from "dfx/DiscordGateway/ShardStore"
17
+ import { LiveMemoryShardStore } from "dfx/DiscordGateway/ShardStore"
18
+ import * as WS from "dfx/DiscordGateway/WS"
19
+ import type { RateLimiter } from "dfx/RateLimit"
20
+ import { LiveMemoryRateLimitStore, LiveRateLimiter } from "dfx/RateLimit"
7
21
 
8
- export * as CachePrelude from "./Cache/prelude.js"
9
- export { DiscordGateway, LiveDiscordGateway } from "./DiscordGateway.js"
10
- export * as DiscordWS from "./DiscordGateway/DiscordWS.js"
11
- export * as Shard from "./DiscordGateway/Shard.js"
12
- export * as ShardStore from "./DiscordGateway/ShardStore.js"
13
- export * as SendEvent from "./DiscordGateway/Shard/sendEvents.js"
14
- export * as WS from "./DiscordGateway/WS.js"
22
+ export { DiscordGateway, LiveDiscordGateway } from "dfx/DiscordGateway"
15
23
  export {
16
24
  InteractionsRegistry,
17
25
  InteractionsRegistryLive,
18
26
  run as runIx,
19
- } from "./Interactions/gateway.js"
27
+ } from "dfx/Interactions/gateway"
28
+ export { CachePrelude, DiscordWS, SendEvent, Shard, ShardStore, WS }
20
29
 
21
- export const MemoryRateLimit = LiveMemoryRateLimitStore >> LiveRateLimiter
22
-
23
- export const MemoryBot =
24
- (LiveMemoryShardStore + LiveMemoryRateLimitStore + LiveJsonDiscordWSCodec) >>
25
- ((LiveDiscordREST > LiveDiscordGateway) + MemoryRateLimit)
30
+ export const MemoryRateLimit = Layer.provide(
31
+ LiveMemoryRateLimitStore,
32
+ LiveRateLimiter,
33
+ )
26
34
 
35
+ export const MemoryBot = Layer.provide(
36
+ Layer.mergeAll(
37
+ LiveMemoryShardStore,
38
+ LiveMemoryRateLimitStore,
39
+ LiveJsonDiscordWSCodec,
40
+ ),
41
+ Layer.merge(
42
+ Layer.provideMerge(LiveDiscordREST, LiveDiscordGateway),
43
+ MemoryRateLimit,
44
+ ),
45
+ )
27
46
  export const makeLiveWithoutFetch = (
28
- config: Config.Wrap<DiscordConfig.MakeOpts>,
29
- ) =>
47
+ config: Config.Config.Wrap<DiscordConfig.MakeOpts>,
48
+ ): Layer.Layer<
49
+ HttpRequestExecutor,
50
+ ConfigError.ConfigError,
51
+ | RateLimiter
52
+ | Log.Log
53
+ | DiscordREST
54
+ | DiscordConfig.DiscordConfig
55
+ | DiscordGateway
56
+ > =>
30
57
  Layer.unwrapEffect(
31
- Config.unwrap(config)
32
- .config.map(DiscordConfig.make)
33
- .map(config => {
58
+ Effect.config(Config.unwrap(config)).pipe(
59
+ Effect.map(DiscordConfig.make),
60
+ Effect.map(config => {
34
61
  const LiveLog = config.debug ? Log.LiveLogDebug : Log.LiveLog
35
62
  const LiveConfig = Layer.succeed(DiscordConfig.DiscordConfig, config)
36
- return LiveLog + LiveConfig > MemoryBot
63
+ return Layer.provideMerge(Layer.merge(LiveLog, LiveConfig), MemoryBot)
37
64
  }),
65
+ ),
38
66
  )
39
67
 
40
- export const makeLive = (config: Config.Wrap<DiscordConfig.MakeOpts>) =>
41
- LiveFetchRequestExecutor >> makeLiveWithoutFetch(config)
68
+ export const makeLive = (
69
+ config: Config.Config.Wrap<DiscordConfig.MakeOpts>,
70
+ ): Layer.Layer<
71
+ never,
72
+ ConfigError.ConfigError,
73
+ | RateLimiter
74
+ | Log.Log
75
+ | DiscordREST
76
+ | DiscordConfig.DiscordConfig
77
+ | DiscordGateway
78
+ > => Layer.provide(LiveFetchRequestExecutor, makeLiveWithoutFetch(config))
package/src/index.ts CHANGED
@@ -1,20 +1,34 @@
1
- export * as Discord from "./types.js"
2
- export * as DiscordConfig from "./DiscordConfig.js"
3
- export { DiscordREST, LiveDiscordREST } from "./DiscordREST.js"
4
- export * as Ix from "./Interactions/index.js"
5
- export * as Log from "./Log.js"
1
+ import * as Cache from "dfx/Cache"
2
+ import * as DiscordConfig from "dfx/DiscordConfig"
3
+ import * as Flags from "dfx/Helpers/flags"
4
+ import * as Intents from "dfx/Helpers/intents"
5
+ import * as IxHelpers from "dfx/Helpers/interactions"
6
+ import * as Members from "dfx/Helpers/members"
7
+ import * as Perms from "dfx/Helpers/permissions"
8
+ import * as UI from "dfx/Helpers/ui"
9
+ import * as Ix from "dfx/Interactions/index"
10
+ import * as Log from "dfx/Log"
11
+ import * as Discord from "dfx/types"
12
+
13
+ export { DiscordREST, LiveDiscordREST } from "dfx/DiscordREST"
6
14
  export {
7
15
  BucketDetails,
8
- RateLimitStore,
9
16
  LiveMemoryRateLimitStore,
10
- RateLimiter,
11
17
  LiveRateLimiter,
12
- } from "./RateLimit.js"
13
- export * as Cache from "./Cache.js"
18
+ RateLimitStore,
19
+ RateLimiter,
20
+ } from "dfx/RateLimit"
14
21
 
15
- export * as Flags from "./Helpers/flags.js"
16
- export * as Intents from "./Helpers/intents.js"
17
- export * as IxHelpers from "./Helpers/interactions.js"
18
- export * as Members from "./Helpers/members.js"
19
- export * as Perms from "./Helpers/permissions.js"
20
- export * as UI from "./Helpers/ui.js"
22
+ export {
23
+ Cache,
24
+ Discord,
25
+ DiscordConfig,
26
+ Flags,
27
+ Intents,
28
+ Ix,
29
+ IxHelpers,
30
+ Log,
31
+ Members,
32
+ Perms,
33
+ UI,
34
+ }
@@ -0,0 +1,69 @@
1
+ import * as Effect from "@effect/io/Effect"
2
+ import * as Option from "@effect/data/Option"
3
+ import * as Ref from "@effect/io/Ref"
4
+ import * as Queue from "@effect/io/Queue"
5
+ import * as Hub from "@effect/io/Hub"
6
+ import * as Deferred from "@effect/io/Deferred"
7
+ import * as Fiber from "@effect/io/Fiber"
8
+
9
+ export const subscribeForEachPar = <R, E, A, X>(
10
+ self: Hub.Hub<A>,
11
+ effect: (_: A) => Effect.Effect<R, E, X>,
12
+ ): Effect.Effect<R, E, never> =>
13
+ Effect.flatMap(Deferred.make<E, never>(), deferred => {
14
+ const run = Hub.subscribe(self).pipe(
15
+ Effect.flatMap(queue =>
16
+ Queue.take(queue).pipe(
17
+ Effect.flatMap(_ =>
18
+ effect(_).pipe(
19
+ Effect.catchAllCause(_ => Deferred.failCause(deferred, _)),
20
+ Effect.fork,
21
+ ),
22
+ ),
23
+ Effect.forever,
24
+ ),
25
+ ),
26
+ Effect.scoped,
27
+ )
28
+
29
+ return Effect.all(run, Deferred.await(deferred), {
30
+ concurrency: "unbounded",
31
+ discard: true,
32
+ }).pipe(Effect.forever)
33
+ })
34
+
35
+ /**
36
+ * @tsplus fluent effect/io/Effect foreverSwitch
37
+ */
38
+ export const foreverSwitch = <R, E, A, R1, E1, X>(
39
+ self: Effect.Effect<R, E, A>,
40
+ f: (_: A) => Effect.Effect<R1, E1, X>,
41
+ ): Effect.Effect<R | R1, E | E1, never> =>
42
+ Effect.flatMap(
43
+ Effect.all(
44
+ Deferred.make<E1, never>(),
45
+ Ref.make<Option.Option<Fiber.RuntimeFiber<E1, X>>>(Option.none()),
46
+ ),
47
+ ([causeDeferred, fiberRef]) => {
48
+ const run = Effect.flatMap(self, _ =>
49
+ f(_).pipe(
50
+ Effect.tapErrorCause(_ => Deferred.failCause(causeDeferred, _)),
51
+ Effect.fork,
52
+ ),
53
+ ).pipe(
54
+ Effect.flatMap(fiber => Ref.getAndSet(fiberRef, Option.some(fiber))),
55
+ Effect.tap(
56
+ Option.match({
57
+ onNone: () => Effect.unit,
58
+ onSome: fiber => Fiber.interrupt(fiber),
59
+ }),
60
+ ),
61
+ Effect.forever,
62
+ )
63
+
64
+ return Effect.all(run, Deferred.await(causeDeferred), {
65
+ concurrency: "unbounded",
66
+ discard: true,
67
+ }).pipe(Effect.forever)
68
+ },
69
+ )
package/src/version.ts ADDED
@@ -0,0 +1 @@
1
+ export const LIB_VERSION = "0.51.1";