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
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(() => {
@@ -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.accessWith(identity))
39
- const log = $(Log.accessWith(identity))
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.toMillis * 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.toMillis,
63
+ window: Duration.toMillis(window),
56
64
  windowMs,
57
65
  limit,
58
- delay: d.toMillis,
66
+ delay: Duration.toMillis(d),
59
67
  }),
60
- )
61
- .tap(_ => (_.toMillis === 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.2";
package/src/webhooks.ts CHANGED
@@ -1,50 +1,77 @@
1
+ import type { HttpRequestExecutor } from "@effect-http/client"
1
2
  import { LiveFetchRequestExecutor } from "@effect-http/client"
2
- import { LiveDiscordREST } from "./DiscordREST.js"
3
- import { MakeConfigOpts, makeConfigLayer } from "./Interactions/webhook.js"
4
- import { LiveMemoryRateLimitStore, LiveRateLimiter } from "./RateLimit.js"
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"
5
7
  import * as DiscordConfig from "dfx/DiscordConfig"
6
- import * as Log from "./Log.js"
8
+ import type { DiscordREST } from "dfx/DiscordREST"
9
+ import { LiveDiscordREST } from "dfx/DiscordREST"
10
+ import type { MakeConfigOpts, WebhookConfig } from "dfx/Interactions/webhook"
11
+ import { makeConfigLayer } from "dfx/Interactions/webhook"
12
+ import * as Log from "dfx/Log"
13
+ import type { RateLimiter } from "dfx/RateLimit"
14
+ import { LiveMemoryRateLimitStore, LiveRateLimiter } from "dfx/RateLimit"
7
15
 
8
16
  export {
9
17
  BadWebhookSignature,
18
+ WebhookConfig,
19
+ WebhookParseError,
10
20
  makeConfigLayer,
11
21
  makeHandler,
12
22
  makeSimpleHandler,
13
- WebhookConfig,
14
- WebhookParseError,
15
- } from "./Interactions/webhook.js"
23
+ } from "dfx/Interactions/webhook"
16
24
 
17
- export const MemoryRateLimit = LiveMemoryRateLimitStore >> LiveRateLimiter
25
+ export const MemoryRateLimit = Layer.provide(
26
+ LiveMemoryRateLimitStore,
27
+ LiveRateLimiter,
28
+ )
18
29
 
19
- export const MemoryREST = LiveMemoryRateLimitStore >> LiveDiscordREST
30
+ export const MemoryREST = Layer.provide(
31
+ LiveMemoryRateLimitStore,
32
+ LiveDiscordREST,
33
+ )
20
34
 
21
35
  export const makeLiveWithoutFetch = (
22
- options: Config.Wrap<DiscordConfig.MakeOpts & MakeConfigOpts>,
23
- ) =>
36
+ options: Config.Config.Wrap<DiscordConfig.MakeOpts & MakeConfigOpts>,
37
+ ): Layer.Layer<
38
+ HttpRequestExecutor,
39
+ ConfigError.ConfigError,
40
+ RateLimiter | DiscordREST | WebhookConfig
41
+ > =>
24
42
  Layer.unwrapEffect(
25
- Config.unwrap(options).config.map(options => {
43
+ Effect.map(Effect.config(Config.unwrap(options)), options => {
26
44
  const config = DiscordConfig.make(options)
27
45
  const LiveConfig = Layer.succeed(DiscordConfig.DiscordConfig, config)
28
46
  const LiveWebhook = makeConfigLayer(options)
29
47
  const LiveLog = config.debug ? Log.LiveLogDebug : Log.LiveLog
30
- const LiveEnv =
31
- (LiveLog + LiveConfig) >> (MemoryREST + LiveWebhook + MemoryRateLimit)
48
+ const LiveEnv = Layer.provide(
49
+ Layer.merge(LiveLog, LiveConfig),
50
+ Layer.mergeAll(MemoryREST, LiveWebhook, MemoryRateLimit),
51
+ )
52
+
32
53
  return LiveEnv
33
54
  }),
34
55
  )
35
56
 
36
57
  export const makeLive = (
37
- config: Config.Wrap<DiscordConfig.MakeOpts & MakeConfigOpts>,
38
- ) => LiveFetchRequestExecutor >> makeLiveWithoutFetch(config)
58
+ config: Config.Config.Wrap<DiscordConfig.MakeOpts & MakeConfigOpts>,
59
+ ): Layer.Layer<
60
+ never,
61
+ ConfigError.ConfigError,
62
+ RateLimiter | DiscordREST | WebhookConfig
63
+ > => Layer.provide(LiveFetchRequestExecutor, makeLiveWithoutFetch(config))
39
64
 
40
65
  export const makeLiveWithoutConfig = (
41
66
  options: DiscordConfig.MakeOpts & MakeConfigOpts,
42
- ) => {
67
+ ): Layer.Layer<never, never, RateLimiter | DiscordREST | WebhookConfig> => {
43
68
  const config = DiscordConfig.make(options)
44
69
  const LiveConfig = Layer.succeed(DiscordConfig.DiscordConfig, config)
45
70
  const LiveWebhook = makeConfigLayer(options)
46
71
  const LiveLog = config.debug ? Log.LiveLogDebug : Log.LiveLog
47
- const LiveEnv =
48
- (LiveLog + LiveConfig) >> (MemoryREST + LiveWebhook + MemoryRateLimit)
49
- return LiveFetchRequestExecutor >> LiveEnv
72
+ const LiveEnv = Layer.provide(
73
+ Layer.merge(LiveLog, LiveConfig),
74
+ Layer.mergeAll(MemoryREST, LiveWebhook, MemoryRateLimit),
75
+ )
76
+ return Layer.provide(LiveFetchRequestExecutor, LiveEnv)
50
77
  }
@@ -0,0 +1,48 @@
1
+ {
2
+ "compilerOptions": {
3
+ "moduleDetection": "force",
4
+ "composite": true,
5
+ "downlevelIteration": true,
6
+ "resolveJsonModule": true,
7
+ "esModuleInterop": true,
8
+ "declaration": true,
9
+ "skipLibCheck": true,
10
+ "emitDecoratorMetadata": true,
11
+ "experimentalDecorators": true,
12
+ "preserveSymlinks": true,
13
+ "moduleResolution": "node",
14
+ "noEmit": false,
15
+ "lib": ["ES2021", "DOM"],
16
+ "sourceMap": true,
17
+ "declarationMap": true,
18
+ "strict": true,
19
+ "noImplicitReturns": false,
20
+ "noUnusedLocals": true,
21
+ "noUnusedParameters": false,
22
+ "noFallthroughCasesInSwitch": true,
23
+ "noEmitOnError": false,
24
+ "noErrorTruncation": false,
25
+ "allowJs": false,
26
+ "checkJs": false,
27
+ "forceConsistentCasingInFileNames": true,
28
+ "stripInternal": true,
29
+ "noImplicitAny": true,
30
+ "noImplicitThis": true,
31
+ "noUncheckedIndexedAccess": false,
32
+ "strictNullChecks": true,
33
+ "baseUrl": ".",
34
+ "target": "ESNext",
35
+ "module": "ES2022",
36
+ "incremental": true,
37
+ "removeComments": false,
38
+ "paths": {
39
+ "dfx": ["./src/index.ts"],
40
+ "dfx/test/*": ["./test/*"],
41
+ "dfx/examples/*": ["./examples/*"],
42
+ "dfx/*": ["./src/*"]
43
+ },
44
+ "plugins": [{ "name": "@effect/language-service" }]
45
+ },
46
+ "include": [],
47
+ "exclude": ["node_modules", "build", "lib"]
48
+ }
@@ -0,0 +1,10 @@
1
+ {
2
+ "extends": "./tsconfig.base.json",
3
+ "compilerOptions": {
4
+ "outDir": "build/esm",
5
+ "declarationDir": "build/dts",
6
+ "tsBuildInfoFile": "build/tsbuildinfo/esm.tsbuildinfo",
7
+ "rootDir": "src"
8
+ },
9
+ "include": ["src/**/*"]
10
+ }
@@ -0,0 +1,11 @@
1
+ {
2
+ "extends": "./tsconfig.base.json",
3
+ "compilerOptions": {
4
+ "tsBuildInfoFile": "build/tsbuildinfo/examples.tsbuildinfo",
5
+ "rootDir": "examples",
6
+ "module": "CommonJS",
7
+ "outDir": "build/examples"
8
+ },
9
+ "include": ["examples/**/*.ts"],
10
+ "references": [{ "path": "./tsconfig.build.json" }]
11
+ }
package/tsconfig.json CHANGED
@@ -1,10 +1,14 @@
1
1
  {
2
- "extends": "../tsconfig.json",
3
- "compilerOptions": {
4
- "baseUrl": ".",
5
- "outDir": ".",
6
- "rootDir": "./src"
7
- },
8
- "include": ["src/**/*"],
9
- "exclude": []
2
+ "extends": "./tsconfig.base.json",
3
+ "references": [
4
+ {
5
+ "path": "./tsconfig.build.json"
6
+ },
7
+ {
8
+ "path": "./tsconfig.test.json"
9
+ },
10
+ {
11
+ "path": "./tsconfig.examples.json"
12
+ }
13
+ ]
10
14
  }
@@ -0,0 +1,12 @@
1
+ {
2
+ "compilerOptions": {
3
+ "noEmit": true,
4
+ "allowJs": true,
5
+ "baseUrl": ".",
6
+ "paths": {
7
+ "dfx": ["./build/esm/index.js"],
8
+ "dfx/*": ["./build/esm/*"]
9
+ }
10
+ },
11
+ "include": ["./build/esm/**/*"]
12
+ }
@@ -0,0 +1,10 @@
1
+ {
2
+ "extends": "./tsconfig.base.json",
3
+ "compilerOptions": {
4
+ "tsBuildInfoFile": "build/tsbuildinfo/test.tsbuildinfo",
5
+ "rootDir": "./",
6
+ "noEmit": true,
7
+ "types": ["vitest/globals"]
8
+ },
9
+ "include": ["test/**/*", "src/**/*"]
10
+ }