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
@@ -0,0 +1,21 @@
1
+ import { millis } from "@effect/data/Duration";
2
+ import * as Option from "@effect/data/Option";
3
+ import * as Effect from "@effect/io/Effect";
4
+ import * as Queue from "@effect/io/Queue";
5
+ import * as Ref from "@effect/io/Ref";
6
+ import * as Schedule from "@effect/io/Schedule";
7
+ import * as SendEvents from "dfx/DiscordGateway/Shard/sendEvents";
8
+ import { Reconnect } from "dfx/DiscordGateway/WS";
9
+ import * as EffectU from "dfx/utils/Effect";
10
+ const payload = (ref, seqRef) => Ref.get(seqRef).pipe(Effect.map(o => SendEvents.heartbeat(Option.getOrNull(o))), Effect.tap(() => Ref.set(ref, false)));
11
+ const payloadOrReconnect = (ref, seqRef) => Effect.flatMap(Ref.get(ref), acked => acked ? payload(ref, seqRef) : Effect.succeed(Reconnect));
12
+ export const send = (hellos, acks, seqRef, send) => Effect.gen(function* (_) {
13
+ const ackedRef = yield* _(Ref.make(true));
14
+ const heartbeats = EffectU.foreverSwitch(Queue.take(hellos).pipe(Effect.tap(() => Ref.set(ackedRef, true))), p => payloadOrReconnect(ackedRef, seqRef).pipe(Effect.tap(send), Effect.schedule(Schedule.duration(millis(p.d.heartbeat_interval * Math.random())).pipe(Schedule.andThen(Schedule.fixed(millis(p.d.heartbeat_interval)))))));
15
+ const run = Queue.take(acks).pipe(Effect.tap(() => Ref.set(ackedRef, true)), Effect.forever);
16
+ return yield* _(Effect.all(run, heartbeats, {
17
+ concurrency: "unbounded",
18
+ discard: true
19
+ }));
20
+ });
21
+ //# sourceMappingURL=heartbeats.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"heartbeats.mjs","names":["millis","Option","Effect","Queue","Ref","Schedule","SendEvents","Reconnect","EffectU","payload","ref","seqRef","get","pipe","map","o","heartbeat","getOrNull","tap","set","payloadOrReconnect","flatMap","acked","succeed","send","hellos","acks","gen","_","ackedRef","make","heartbeats","foreverSwitch","take","p","schedule","duration","d","heartbeat_interval","Math","random","andThen","fixed","run","forever","all","concurrency","discard"],"sources":["../../../src/DiscordGateway/Shard/heartbeats.ts"],"sourcesContent":[null],"mappings":"AAAA,SAASA,MAAM,QAAQ,uBAAuB;AAC9C,OAAO,KAAKC,MAAM,MAAM,qBAAqB;AAC7C,OAAO,KAAKC,MAAM,MAAM,mBAAmB;AAC3C,OAAO,KAAKC,KAAK,MAAM,kBAAkB;AACzC,OAAO,KAAKC,GAAG,MAAM,gBAAgB;AACrC,OAAO,KAAKC,QAAQ,MAAM,qBAAqB;AAE/C,OAAO,KAAKC,UAAU,MAAM,qCAAqC;AACjE,SAASC,SAAS,QAAQ,uBAAuB;AAEjD,OAAO,KAAKC,OAAO,MAAM,kBAAkB;AAE3C,MAAMC,OAAO,GAAGA,CACdC,GAAqB,EACrBC,MAAsC,KAEtCP,GAAG,CAACQ,GAAG,CAACD,MAAM,CAAC,CAACE,IAAI,CAClBX,MAAM,CAACY,GAAG,CAACC,CAAC,IAAIT,UAAU,CAACU,SAAS,CAACf,MAAM,CAACgB,SAAS,CAACF,CAAC,CAAC,CAAC,CAAC,EAC1Db,MAAM,CAACgB,GAAG,CAAC,MAAMd,GAAG,CAACe,GAAG,CAACT,GAAG,EAAE,KAAK,CAAC,CAAC,CACtC;AAEH,MAAMU,kBAAkB,GAAGA,CACzBV,GAAqB,EACrBC,MAAsC,KAEtCT,MAAM,CAACmB,OAAO,CACZjB,GAAG,CAACQ,GAAG,CAACF,GAAG,CAAC,EACXY,KAAK,IACJA,KAAK,GAAGb,OAAO,CAACC,GAAG,EAAEC,MAAM,CAAC,GAAGT,MAAM,CAACqB,OAAO,CAAChB,SAAS,CAAC,CAC3D;AAEH,OAAO,MAAMiB,IAAI,GAAGA,CAClBC,MAA6C,EAC7CC,IAA2C,EAC3Cf,MAAsC,EACtCa,IAAoE,KAEpEtB,MAAM,CAACyB,GAAG,CAAC,WAAWC,CAAC;EACrB,MAAMC,QAAQ,GAAG,OAAOD,CAAC,CAACxB,GAAG,CAAC0B,IAAI,CAAC,IAAI,CAAC,CAAC;EAEzC,MAAMC,UAAU,GAAGvB,OAAO,CAACwB,aAAa,CACtC7B,KAAK,CAAC8B,IAAI,CAACR,MAAM,CAAC,CAACZ,IAAI,CAACX,MAAM,CAACgB,GAAG,CAAC,MAAMd,GAAG,CAACe,GAAG,CAACU,QAAQ,EAAE,IAAI,CAAC,CAAC,CAAC,EAClEK,CAAC,IACCd,kBAAkB,CAACS,QAAQ,EAAElB,MAAM,CAAC,CAACE,IAAI,CACvCX,MAAM,CAACgB,GAAG,CAACM,IAAI,CAAC,EAChBtB,MAAM,CAACiC,QAAQ,CACb9B,QAAQ,CAAC+B,QAAQ,CACfpC,MAAM,CAACkC,CAAC,CAACG,CAAE,CAACC,kBAAkB,GAAGC,IAAI,CAACC,MAAM,EAAE,CAAC,CAChD,CAAC3B,IAAI,CACJR,QAAQ,CAACoC,OAAO,CAACpC,QAAQ,CAACqC,KAAK,CAAC1C,MAAM,CAACkC,CAAC,CAACG,CAAE,CAACC,kBAAkB,CAAC,CAAC,CAAC,CAClE,CACF,CACF,CACJ;EAED,MAAMK,GAAG,GAAGxC,KAAK,CAAC8B,IAAI,CAACP,IAAI,CAAC,CAACb,IAAI,CAC/BX,MAAM,CAACgB,GAAG,CAAC,MAAMd,GAAG,CAACe,GAAG,CAACU,QAAQ,EAAE,IAAI,CAAC,CAAC,EACzC3B,MAAM,CAAC0C,OAAO,CACf;EAED,OAAO,OAAOhB,CAAC,CACb1B,MAAM,CAAC2C,GAAG,CAACF,GAAG,EAAEZ,UAAU,EAAE;IAC1Be,WAAW,EAAE,WAAW;IACxBC,OAAO,EAAE;GACV,CAAC,CACH;AACH,CAAC,CAAC"}
@@ -0,0 +1,37 @@
1
+ import * as Option from "@effect/data/Option";
2
+ import * as Effect from "@effect/io/Effect";
3
+ import * as Ref from "@effect/io/Ref";
4
+ import * as SendEvents from "dfx/DiscordGateway/Shard/sendEvents";
5
+ import * as OS from "os";
6
+ const identify = ({
7
+ intents,
8
+ presence,
9
+ shard,
10
+ token
11
+ }) => SendEvents.identify({
12
+ token,
13
+ intents,
14
+ properties: {
15
+ os: OS.platform(),
16
+ browser: "dfx",
17
+ device: "dfx"
18
+ },
19
+ shard,
20
+ presence
21
+ });
22
+ const resume = (token, ready, seq) => SendEvents.resume({
23
+ token,
24
+ session_id: ready.session_id,
25
+ seq
26
+ });
27
+ export const identifyOrResume = (opts, ready, seq) => Effect.map(Effect.all(Ref.get(ready), Ref.get(seq)), ([readyEvent, seqNumber]) => Option.match(Option.all({
28
+ readyEvent,
29
+ seqNumber
30
+ }), {
31
+ onNone: () => identify(opts),
32
+ onSome: ({
33
+ readyEvent,
34
+ seqNumber
35
+ }) => resume(opts.token, readyEvent, seqNumber)
36
+ }));
37
+ //# sourceMappingURL=identify.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"identify.mjs","names":["Option","Effect","Ref","SendEvents","OS","identify","intents","presence","shard","token","properties","os","platform","browser","device","resume","ready","seq","session_id","identifyOrResume","opts","map","all","get","readyEvent","seqNumber","match","onNone","onSome"],"sources":["../../../src/DiscordGateway/Shard/identify.ts"],"sourcesContent":[null],"mappings":"AAAA,OAAO,KAAKA,MAAM,MAAM,qBAAqB;AAC7C,OAAO,KAAKC,MAAM,MAAM,mBAAmB;AAC3C,OAAO,KAAKC,GAAG,MAAM,gBAAgB;AACrC,OAAO,KAAKC,UAAU,MAAM,qCAAqC;AAEjE,OAAO,KAAKC,EAAE,MAAM,IAAI;AAcxB,MAAMC,QAAQ,GAAGA,CAAC;EAAEC,OAAO;EAAEC,QAAQ;EAAEC,KAAK;EAAEC;AAAK,CAAW,KAC5DN,UAAU,CAACE,QAAQ,CAAC;EAClBI,KAAK;EACLH,OAAO;EACPI,UAAU,EAAE;IACVC,EAAE,EAAEP,EAAE,CAACQ,QAAQ,EAAE;IACjBC,OAAO,EAAE,KAAK;IACdC,MAAM,EAAE;GACT;EACDN,KAAK;EACLD;CACD,CAAC;AAEJ,MAAMQ,MAAM,GAAGA,CAACN,KAAa,EAAEO,KAAyB,EAAEC,GAAW,KACnEd,UAAU,CAACY,MAAM,CAAC;EAChBN,KAAK;EACLS,UAAU,EAAEF,KAAK,CAACE,UAAU;EAC5BD;CACD,CAAC;AAEJ,OAAO,MAAME,gBAAgB,GAAGA,CAC9BC,IAAa,EACbJ,KAAiD,EACjDC,GAAmC,KAOnChB,MAAM,CAACoB,GAAG,CACRpB,MAAM,CAACqB,GAAG,CAACpB,GAAG,CAACqB,GAAG,CAACP,KAAK,CAAC,EAAEd,GAAG,CAACqB,GAAG,CAACN,GAAG,CAAC,CAAC,EACxC,CAAC,CAACO,UAAU,EAAEC,SAAS,CAAC,KACtBzB,MAAM,CAAC0B,KAAK,CAAC1B,MAAM,CAACsB,GAAG,CAAC;EAAEE,UAAU;EAAEC;AAAS,CAAE,CAAC,EAAE;EAClDE,MAAM,EAAEA,CAAA,KAAMtB,QAAQ,CAACe,IAAI,CAAC;EAC5BQ,MAAM,EAAEA,CAAC;IAAEJ,UAAU;IAAEC;EAAS,CAAE,KAChCV,MAAM,CAACK,IAAI,CAACX,KAAK,EAAEe,UAAU,EAAEC,SAAS;CAC3C,CAAC,CACL"}
@@ -0,0 +1,6 @@
1
+ import * as Option from "@effect/data/Option";
2
+ import * as Effect from "@effect/io/Effect";
3
+ import * as Ref from "@effect/io/Ref";
4
+ import { Reconnect } from "dfx/DiscordGateway/WS";
5
+ export const fromPayload = (p, latestReady) => Effect.as(p.d ? Effect.unit : Ref.set(latestReady, Option.none()), Reconnect);
6
+ //# sourceMappingURL=invalidSession.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"invalidSession.mjs","names":["Option","Effect","Ref","Reconnect","fromPayload","p","latestReady","as","d","unit","set","none"],"sources":["../../../src/DiscordGateway/Shard/invalidSession.ts"],"sourcesContent":[null],"mappings":"AAAA,OAAO,KAAKA,MAAM,MAAM,qBAAqB;AAC7C,OAAO,KAAKC,MAAM,MAAM,mBAAmB;AAC3C,OAAO,KAAKC,GAAG,MAAM,gBAAgB;AAErC,SAASC,SAAS,QAAQ,uBAAuB;AAGjD,OAAO,MAAMC,WAAW,GAAGA,CACzBC,CAAyB,EACzBC,WAAuD,KAEvDL,MAAM,CAACM,EAAE,CAACF,CAAC,CAACG,CAAC,GAAGP,MAAM,CAACQ,IAAI,GAAGP,GAAG,CAACQ,GAAG,CAACJ,WAAW,EAAEN,MAAM,CAACW,IAAI,EAAE,CAAC,EAAER,SAAS,CAAC"}
@@ -0,0 +1,25 @@
1
+ export const heartbeat = d => ({
2
+ op: 1 /* Discord.GatewayOpcode.HEARTBEAT */,
3
+ d
4
+ });
5
+ export const identify = d => ({
6
+ op: 2 /* Discord.GatewayOpcode.IDENTIFY */,
7
+ d
8
+ });
9
+ export const resume = d => ({
10
+ op: 6 /* Discord.GatewayOpcode.RESUME */,
11
+ d
12
+ });
13
+ export const requestGuildMembers = d => ({
14
+ op: 8 /* Discord.GatewayOpcode.REQUEST_GUILD_MEMBERS */,
15
+ d
16
+ });
17
+ export const voiceStateUpdate = d => ({
18
+ op: 4 /* Discord.GatewayOpcode.VOICE_STATE_UPDATE */,
19
+ d
20
+ });
21
+ export const presenceUpdate = d => ({
22
+ op: 3 /* Discord.GatewayOpcode.PRESENCE_UPDATE */,
23
+ d
24
+ });
25
+ //# sourceMappingURL=sendEvents.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sendEvents.mjs","names":["heartbeat","d","op","identify","resume","requestGuildMembers","voiceStateUpdate","presenceUpdate"],"sources":["../../../src/DiscordGateway/Shard/sendEvents.ts"],"sourcesContent":[null],"mappings":"AAEA,OAAO,MAAMA,SAAS,GACpBC,CAAoB,KAC2B;EAC/CC,EAAE;EACFD;CACD,CAAC;AAEF,OAAO,MAAME,QAAQ,GACnBF,CAAmB,KAC2B;EAC9CC,EAAE;EACFD;CACD,CAAC;AAEF,OAAO,MAAMG,MAAM,GACjBH,CAAiB,KAC2B;EAC5CC,EAAE;EACFD;CACD,CAAC;AAEF,OAAO,MAAMI,mBAAmB,GAC9BJ,CAA6B,KAC2B;EACxDC,EAAE;EACFD;CACD,CAAC;AAEF,OAAO,MAAMK,gBAAgB,GAC3BL,CAA2B,KAC2B;EACtDC,EAAE;EACFD;CACD,CAAC;AAEF,OAAO,MAAMM,cAAc,GACzBN,CAAyB,KAC2B;EACpDC,EAAE;EACFD;CACD,CAAC"}
@@ -0,0 +1,11 @@
1
+ import * as Option from "@effect/data/Option";
2
+ import * as Effect from "@effect/io/Effect";
3
+ import * as Ref from "@effect/io/Ref";
4
+ import * as Stream from "@effect/stream/Stream";
5
+ export const opCode = source => code => source.pipe(Stream.filter(p => p.op === code));
6
+ const maybeUpdateRef = (f, ref) => _ => Option.match(f(_), {
7
+ onNone: () => Effect.unit,
8
+ onSome: a => Ref.set(ref, Option.some(a))
9
+ });
10
+ export const latest = f => Effect.map(Ref.make(Option.none()), ref => [ref, maybeUpdateRef(f, ref)]);
11
+ //# sourceMappingURL=utils.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.mjs","names":["Option","Effect","Ref","Stream","opCode","source","code","pipe","filter","p","op","maybeUpdateRef","f","ref","_","match","onNone","unit","onSome","a","set","some","latest","map","make","none"],"sources":["../../../src/DiscordGateway/Shard/utils.ts"],"sourcesContent":[null],"mappings":"AAAA,OAAO,KAAKA,MAAM,MAAM,qBAAqB;AAC7C,OAAO,KAAKC,MAAM,MAAM,mBAAmB;AAC3C,OAAO,KAAKC,GAAG,MAAM,gBAAgB;AAErC,OAAO,KAAKC,MAAM,MAAM,uBAAuB;AAE/C,OAAO,MAAMC,MAAM,GACVC,MAAmD,IAExDC,IAA2B,IAE3BD,MAAM,CAACE,IAAI,CACTJ,MAAM,CAACK,MAAM,CAAEC,CAAC,IAAqCA,CAAC,CAACC,EAAE,KAAKJ,IAAI,CAAC,CACpE;AAEL,MAAMK,cAAc,GAClBA,CACEC,CAAkD,EAClDC,GAA8B,KAE/BC,CAAyB,IACxBd,MAAM,CAACe,KAAK,CAACH,CAAC,CAACE,CAAC,CAAC,EAAE;EACjBE,MAAM,EAAEA,CAAA,KAAMf,MAAM,CAACgB,IAAI;EACzBC,MAAM,EAAEC,CAAC,IAAIjB,GAAG,CAACkB,GAAG,CAACP,GAAG,EAAEb,MAAM,CAACqB,IAAI,CAACF,CAAC,CAAC;CACzC,CAAC;AAEN,OAAO,MAAMG,MAAM,GACjBV,CAAkD,IASlDX,MAAM,CAACsB,GAAG,CACRrB,GAAG,CAACsB,IAAI,CAAmBxB,MAAM,CAACyB,IAAI,EAAE,CAAC,EAEzCZ,GAAG,IAAI,CAACA,GAAG,EAAEF,cAAc,CAACC,CAAC,EAAEC,GAAG,CAAC,CAAU,CAC9C"}
@@ -0,0 +1,99 @@
1
+ import { DiscordConfig } from "dfx/DiscordConfig";
2
+ import { LiveRateLimiter, RateLimiter } from "dfx/RateLimit";
3
+ import { DiscordWS, LiveDiscordWS } from "dfx/DiscordGateway/DiscordWS";
4
+ import * as Heartbeats from "dfx/DiscordGateway/Shard/heartbeats";
5
+ import * as Identify from "dfx/DiscordGateway/Shard/identify";
6
+ import * as InvalidSession from "dfx/DiscordGateway/Shard/invalidSession";
7
+ import * as Utils from "dfx/DiscordGateway/Shard/utils";
8
+ import { Reconnect } from "dfx/DiscordGateway/WS";
9
+ import { Log } from "dfx/Log";
10
+ import * as Effect from "@effect/io/Effect";
11
+ import * as Layer from "@effect/io/Layer";
12
+ import { Tag } from "@effect/data/Context";
13
+ import * as Option from "@effect/data/Option";
14
+ import * as Hub from "@effect/io/Hub";
15
+ import * as Queue from "@effect/io/Queue";
16
+ import * as Ref from "@effect/io/Ref";
17
+ import * as Duration from "@effect/data/Duration";
18
+ import * as Chunk from "@effect/data/Chunk";
19
+ import * as ConfigSecret from "@effect/io/Config/Secret";
20
+ export const make = /*#__PURE__*/Effect.gen(function* (_) {
21
+ const {
22
+ token,
23
+ gateway
24
+ } = yield* _(DiscordConfig);
25
+ const limiter = yield* _(RateLimiter);
26
+ const dws = yield* _(DiscordWS);
27
+ const log = yield* _(Log);
28
+ const connect = (shard, hub, sendQueue) => Effect.gen(function* (_) {
29
+ const outboundQueue = yield* _(Queue.unbounded());
30
+ const pendingQueue = yield* _(Queue.unbounded());
31
+ const phase = yield* _(Ref.make(0 /* Phase.Connecting */));
32
+ const setPhase = p => Effect.zipLeft(Ref.set(phase, p), log.debug("Shard", shard, "phase", p));
33
+ const outbound = Effect.zipLeft(Queue.take(outboundQueue), limiter.maybeWait("dfx.shard.send", Duration.minutes(1), 120));
34
+ const send = p => Effect.flatMap(Ref.get(phase), phase => phase === 2 /* Phase.Connected */ ? Queue.offer(outboundQueue, p) : Queue.offer(pendingQueue, p));
35
+ const heartbeatSend = p => Effect.flatMap(Ref.get(phase), phase => phase !== 0 /* Phase.Connecting */ ? Queue.offer(outboundQueue, p) : Effect.succeed(false));
36
+ const prioritySend = p => Queue.offer(outboundQueue, p);
37
+ const resume = setPhase(2 /* Phase.Connected */).pipe(Effect.zipRight(Queue.takeAll(pendingQueue)), Effect.tap(_ => Queue.offerAll(outboundQueue, _)), Effect.asUnit);
38
+ const onConnecting = Queue.takeAll(outboundQueue).pipe(Effect.tap(msgs => Queue.offerAll(pendingQueue, Chunk.filter(msgs, msg => msg !== Reconnect && msg.op !== 2 /* Discord.GatewayOpcode.IDENTIFY */ && msg.op !== 6 /* Discord.GatewayOpcode.RESUME */ && msg.op !== 1 /* Discord.GatewayOpcode.HEARTBEAT */))), Effect.zipRight(setPhase(0 /* Phase.Connecting */)));
39
+ const socket = yield* _(dws.connect({
40
+ outbound,
41
+ onConnecting
42
+ }));
43
+ const [latestReady, updateLatestReady] = yield* _(Utils.latest(p => Option.some(p).pipe(Option.filter(p => p.op === 0 /* Discord.GatewayOpcode.DISPATCH */ && p.t === "READY"), Option.map(p => p.d))));
44
+ const [latestSequence, updateLatestSequence] = yield* _(Utils.latest(p => Option.fromNullable(p.s)));
45
+ const maybeUpdateUrl = p => Option.some(p).pipe(Option.filter(p => p.op === 0 /* Discord.GatewayOpcode.DISPATCH */ && p.t === "READY"), Option.map(p => p.d), Option.match({
46
+ onNone: () => Effect.unit,
47
+ onSome: ({
48
+ resume_gateway_url
49
+ }) => socket.setUrl(resume_gateway_url)
50
+ }));
51
+ const hellos = yield* _(Queue.unbounded());
52
+ const acks = yield* _(Queue.unbounded());
53
+ // heartbeats
54
+ const heartbeats = Heartbeats.send(hellos, acks, latestSequence, heartbeatSend);
55
+ // identify
56
+ const identify = Identify.identifyOrResume({
57
+ token: ConfigSecret.value(token),
58
+ shard,
59
+ intents: gateway.intents,
60
+ presence: gateway.presence
61
+ }, latestReady, latestSequence);
62
+ const onPayload = p => Effect.tap(Effect.all(updateLatestReady(p), updateLatestSequence(p), maybeUpdateUrl(p), {
63
+ discard: true
64
+ }), () => {
65
+ switch (p.op) {
66
+ case 10 /* Discord.GatewayOpcode.HELLO */:
67
+ return Effect.all(Effect.tap(identify, prioritySend), setPhase(1 /* Phase.Handshake */), Queue.offer(hellos, p), {
68
+ discard: true
69
+ });
70
+ case 11 /* Discord.GatewayOpcode.HEARTBEAT_ACK */:
71
+ return Queue.offer(acks, p);
72
+ case 9 /* Discord.GatewayOpcode.INVALID_SESSION */:
73
+ return Effect.tap(InvalidSession.fromPayload(p, latestReady), send);
74
+ case 0 /* Discord.GatewayOpcode.DISPATCH */:
75
+ if (p.t === "READY" || p.t === "RESUMED") {
76
+ return Effect.zipRight(resume, Hub.publish(hub, p));
77
+ }
78
+ return Hub.publish(hub, p);
79
+ }
80
+ return Effect.unit;
81
+ });
82
+ const drainSendQueue = Queue.take(sendQueue).pipe(Effect.tap(send), Effect.forever);
83
+ const run = Effect.all(socket.take.pipe(Effect.flatMap(onPayload), Effect.forever), heartbeats, drainSendQueue, socket.run, {
84
+ discard: true,
85
+ concurrency: "unbounded"
86
+ });
87
+ return {
88
+ id: shard,
89
+ send,
90
+ run
91
+ };
92
+ });
93
+ return {
94
+ connect
95
+ };
96
+ });
97
+ export const Shard = /*#__PURE__*/Tag();
98
+ export const LiveShard = /*#__PURE__*/Layer.provide( /*#__PURE__*/Layer.merge(LiveDiscordWS, LiveRateLimiter), /*#__PURE__*/Layer.effect(Shard, make));
99
+ //# sourceMappingURL=Shard.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Shard.mjs","names":["DiscordConfig","LiveRateLimiter","RateLimiter","DiscordWS","LiveDiscordWS","Heartbeats","Identify","InvalidSession","Utils","Reconnect","Log","Effect","Layer","Tag","Option","Hub","Queue","Ref","Duration","Chunk","ConfigSecret","make","gen","_","token","gateway","limiter","dws","log","connect","shard","hub","sendQueue","outboundQueue","unbounded","pendingQueue","phase","setPhase","p","zipLeft","set","debug","outbound","take","maybeWait","minutes","send","flatMap","get","offer","heartbeatSend","succeed","prioritySend","resume","pipe","zipRight","takeAll","tap","offerAll","asUnit","onConnecting","msgs","filter","msg","op","socket","latestReady","updateLatestReady","latest","some","t","map","d","latestSequence","updateLatestSequence","fromNullable","s","maybeUpdateUrl","match","onNone","unit","onSome","resume_gateway_url","setUrl","hellos","acks","heartbeats","identify","identifyOrResume","value","intents","presence","onPayload","all","discard","fromPayload","publish","drainSendQueue","forever","run","concurrency","id","Shard","LiveShard","provide","merge","effect"],"sources":["../../src/DiscordGateway/Shard.ts"],"sourcesContent":[null],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ import * as Effect from "@effect/io/Effect";
2
+ import * as Layer from "@effect/io/Layer";
3
+ import { Tag } from "@effect/data/Context";
4
+ import * as Option from "@effect/data/Option";
5
+ export const ShardStore = /*#__PURE__*/Tag();
6
+ // Very basic shard id store, that does no health checks
7
+ const memoryStore = () => {
8
+ let currentId = 0;
9
+ return {
10
+ claimId: ({
11
+ totalCount
12
+ }) => Effect.sync(() => {
13
+ if (currentId >= totalCount) {
14
+ return Option.none();
15
+ }
16
+ const id = currentId;
17
+ currentId++;
18
+ return Option.some(id);
19
+ }),
20
+ allClaimed: totalCount => Effect.sync(() => currentId >= totalCount)
21
+ };
22
+ };
23
+ export const LiveMemoryShardStore = /*#__PURE__*/Layer.sync(ShardStore, memoryStore);
24
+ //# sourceMappingURL=ShardStore.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ShardStore.mjs","names":["Effect","Layer","Tag","Option","ShardStore","memoryStore","currentId","claimId","totalCount","sync","none","id","some","allClaimed","LiveMemoryShardStore"],"sources":["../../src/DiscordGateway/ShardStore.ts"],"sourcesContent":[null],"mappings":"AAAA,OAAO,KAAKA,MAAM,MAAM,mBAAmB;AAC3C,OAAO,KAAKC,KAAK,MAAM,kBAAkB;AACzC,SAASC,GAAG,QAAQ,sBAAsB;AAC1C,OAAO,KAAKC,MAAM,MAAM,qBAAqB;AAc7C,OAAO,MAAMC,UAAU,gBAAGF,GAAG,EAAc;AAE3C;AACA,MAAMG,WAAW,GAAGA,CAAA,KAAiB;EACnC,IAAIC,SAAS,GAAG,CAAC;EAEjB,OAAO;IACLC,OAAO,EAAEA,CAAC;MAAEC;IAAU,CAAE,KACtBR,MAAM,CAACS,IAAI,CAAC,MAAK;MACf,IAAIH,SAAS,IAAIE,UAAU,EAAE;QAC3B,OAAOL,MAAM,CAACO,IAAI,EAAE;;MAGtB,MAAMC,EAAE,GAAGL,SAAS;MACpBA,SAAS,EAAE;MACX,OAAOH,MAAM,CAACS,IAAI,CAACD,EAAE,CAAC;IACxB,CAAC,CAAC;IAEJE,UAAU,EAAEL,UAAU,IAAIR,MAAM,CAACS,IAAI,CAAC,MAAMH,SAAS,IAAIE,UAAU;GACpE;AACH,CAAC;AAED,OAAO,MAAMM,oBAAoB,gBAAGb,KAAK,CAACQ,IAAI,CAACL,UAAU,EAAEC,WAAW,CAAC"}
@@ -0,0 +1,73 @@
1
+ import * as Chunk from "@effect/data/Chunk";
2
+ import { Tag } from "@effect/data/Context";
3
+ import * as Duration from "@effect/data/Duration";
4
+ import * as HashSet from "@effect/data/HashSet";
5
+ import * as Deferred from "@effect/io/Deferred";
6
+ import * as Effect from "@effect/io/Effect";
7
+ import * as Layer from "@effect/io/Layer";
8
+ import * as Ref from "@effect/io/Ref";
9
+ import * as Schedule from "@effect/io/Schedule";
10
+ import { DiscordConfig } from "dfx/DiscordConfig";
11
+ import { LiveShard, Shard } from "dfx/DiscordGateway/Shard";
12
+ import { ShardStore } from "dfx/DiscordGateway/ShardStore";
13
+ import { DiscordREST } from "dfx/DiscordREST";
14
+ import { LiveRateLimiter, RateLimiter } from "dfx/RateLimit";
15
+ const claimRepeatPolicy = /*#__PURE__*/Schedule.fixed("3 minutes").pipe( /*#__PURE__*/Schedule.whileInput(_ => _._tag === "None"), Schedule.passthrough);
16
+ const make = /*#__PURE__*/Effect.gen(function* (_) {
17
+ const store = yield* _(ShardStore);
18
+ const rest = yield* _(DiscordREST);
19
+ const {
20
+ gateway: config
21
+ } = yield* _(DiscordConfig);
22
+ const limiter = yield* _(RateLimiter);
23
+ const shard = yield* _(Shard);
24
+ const currentShards = yield* _(Ref.make(HashSet.empty()));
25
+ const takeConfig = totalCount => Effect.gen(function* (_) {
26
+ const currentCount = yield* _(Ref.make(0));
27
+ const claimId = sharderCount => store.claimId({
28
+ totalCount,
29
+ sharderCount
30
+ }).pipe(Effect.repeat(claimRepeatPolicy), Effect.map(_ => _.value));
31
+ return Ref.getAndUpdate(currentCount, _ => _ + 1).pipe(Effect.flatMap(claimId), Effect.map(id => ({
32
+ id,
33
+ totalCount
34
+ })));
35
+ });
36
+ const gateway = yield* _(rest.getGatewayBot(), Effect.flatMap(r => r.json), Effect.catchAll(() => Effect.succeed({
37
+ url: "wss://gateway.discord.gg/",
38
+ shards: 1,
39
+ session_start_limit: {
40
+ total: 0,
41
+ remaining: 0,
42
+ reset_after: 0,
43
+ max_concurrency: 1
44
+ }
45
+ })));
46
+ const run = (hub, sendQueue) => Effect.gen(function* (_) {
47
+ const deferred = yield* _(Deferred.make());
48
+ const take = yield* _(takeConfig(config.shardCount ?? gateway.shards));
49
+ const spawner = take.pipe(Effect.map(config => ({
50
+ ...config,
51
+ url: gateway.url,
52
+ concurrency: gateway.session_start_limit.max_concurrency
53
+ })), Effect.tap(({
54
+ id,
55
+ concurrency
56
+ }) => limiter.maybeWait(`dfx.sharder.${id % concurrency}`, Duration.millis(config.identifyRateLimit[0]), config.identifyRateLimit[1])), Effect.flatMap(c => shard.connect([c.id, c.totalCount], hub, sendQueue)), Effect.flatMap(shard => Effect.acquireUseRelease(Ref.update(currentShards, HashSet.add(shard)), () => shard.run, () => Ref.update(currentShards, HashSet.remove(shard))).pipe(Effect.catchAllCause(_ => Deferred.failCause(deferred, _)), Effect.fork)), Effect.forever);
57
+ const spawners = Chunk.map(Chunk.range(1, gateway.session_start_limit.max_concurrency), () => spawner);
58
+ return yield* _(Effect.all(Effect.all(spawners, {
59
+ concurrency: "unbounded",
60
+ discard: true
61
+ }), Deferred.await(deferred), {
62
+ concurrency: "unbounded",
63
+ discard: true
64
+ }));
65
+ });
66
+ return {
67
+ shards: Ref.get(currentShards),
68
+ run
69
+ };
70
+ });
71
+ export const Sharder = /*#__PURE__*/Tag();
72
+ export const LiveSharder = /*#__PURE__*/Layer.provide( /*#__PURE__*/Layer.merge(LiveRateLimiter, LiveShard), /*#__PURE__*/Layer.effect(Sharder, make));
73
+ //# sourceMappingURL=Sharder.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Sharder.mjs","names":["Chunk","Tag","Duration","HashSet","Deferred","Effect","Layer","Ref","Schedule","DiscordConfig","LiveShard","Shard","ShardStore","DiscordREST","LiveRateLimiter","RateLimiter","claimRepeatPolicy","fixed","pipe","whileInput","_","_tag","passthrough","make","gen","store","rest","gateway","config","limiter","shard","currentShards","empty","takeConfig","totalCount","currentCount","claimId","sharderCount","repeat","map","value","getAndUpdate","flatMap","id","getGatewayBot","r","json","catchAll","succeed","url","shards","session_start_limit","total","remaining","reset_after","max_concurrency","run","hub","sendQueue","deferred","take","shardCount","spawner","concurrency","tap","maybeWait","millis","identifyRateLimit","c","connect","acquireUseRelease","update","add","remove","catchAllCause","failCause","fork","forever","spawners","range","all","discard","await","get","Sharder","LiveSharder","provide","merge","effect"],"sources":["../../src/DiscordGateway/Sharder.ts"],"sourcesContent":[null],"mappings":"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"}
@@ -0,0 +1,94 @@
1
+ import { Log } from "dfx/Log";
2
+ import WebSocket from "isomorphic-ws";
3
+ import * as Effect from "@effect/io/Effect";
4
+ import * as Layer from "@effect/io/Layer";
5
+ import { Tag } from "@effect/data/Context";
6
+ import * as Ref from "@effect/io/Ref";
7
+ import * as Queue from "@effect/io/Queue";
8
+ import * as Runtime from "@effect/io/Runtime";
9
+ import * as Duration from "@effect/data/Duration";
10
+ export const Reconnect = /*#__PURE__*/Symbol();
11
+ export class WebSocketError {
12
+ reason;
13
+ error;
14
+ _tag = "WebSocketError";
15
+ constructor(reason, error) {
16
+ this.reason = reason;
17
+ this.error = error;
18
+ }
19
+ }
20
+ export class WebSocketCloseError {
21
+ code;
22
+ reason;
23
+ _tag = "WebSocketCloseError";
24
+ constructor(code, reason) {
25
+ this.code = code;
26
+ this.reason = reason;
27
+ }
28
+ }
29
+ const isReconnect = e => e._tag === "WebSocketCloseError" && e.code === 1012;
30
+ const socket = urlRef => Ref.get(urlRef).pipe(Effect.map(_ => new WebSocket(_)), Effect.acquireRelease(ws => Effect.sync(() => {
31
+ // eslint-disable-next-line @typescript-eslint/no-extra-semi
32
+ ;
33
+ ws.removeAllListeners?.();
34
+ ws.close();
35
+ })));
36
+ const offer = (ws, queue, log) => Effect.runtime().pipe(Effect.flatMap(runtime => Effect.async(resume => {
37
+ const run = Runtime.runFork(runtime);
38
+ ws.addEventListener("message", message => {
39
+ run(Effect.all(log.debug("WS", "receive", message.data), Queue.offer(queue, message.data), {
40
+ concurrency: "unbounded",
41
+ discard: true
42
+ }));
43
+ });
44
+ ws.addEventListener("error", cause => {
45
+ resume(Effect.fail(new WebSocketError("error", cause)));
46
+ });
47
+ ws.addEventListener("close", e => {
48
+ resume(Effect.fail(new WebSocketCloseError(e.code, e.reason)));
49
+ });
50
+ })));
51
+ const waitForOpen = (ws, timeout) => Effect.timeoutFail(Effect.suspend(() => {
52
+ if (ws.readyState === WebSocket.OPEN) {
53
+ return Effect.unit;
54
+ }
55
+ return Effect.async(resume => {
56
+ ws.addEventListener("open", () => resume(Effect.unit), {
57
+ once: true
58
+ });
59
+ });
60
+ }), {
61
+ onTimeout: () => new WebSocketError("open-timeout"),
62
+ duration: timeout
63
+ });
64
+ const send = (ws, take, log) => take.pipe(Effect.tap(data => log.debug("WS", "send", data)), Effect.tap(data => {
65
+ if (data === Reconnect) {
66
+ return Effect.failSync(() => {
67
+ ws.close(1012, "reconnecting");
68
+ return new WebSocketCloseError(1012, "reconnecting");
69
+ });
70
+ }
71
+ return Effect.sync(() => {
72
+ ws.send(data);
73
+ });
74
+ }), Effect.forever);
75
+ const make = /*#__PURE__*/Effect.gen(function* (_) {
76
+ const log = yield* _(Log);
77
+ const connect = (url, takeOutbound, onConnecting = Effect.unit, openTimeout = Duration.seconds(3)) => Effect.gen(function* (_) {
78
+ const queue = yield* _(Queue.unbounded());
79
+ const run = onConnecting.pipe(Effect.zipRight(socket(url)), Effect.flatMap(ws => Effect.all(offer(ws, queue, log), waitForOpen(ws, openTimeout).pipe(Effect.zipRight(send(ws, takeOutbound, log))), {
80
+ concurrency: "unbounded",
81
+ discard: true
82
+ })), Effect.scoped, Effect.retryWhile(isReconnect));
83
+ return {
84
+ run,
85
+ take: Queue.take(queue)
86
+ };
87
+ });
88
+ return {
89
+ connect
90
+ };
91
+ });
92
+ export const WS = /*#__PURE__*/Tag();
93
+ export const LiveWS = /*#__PURE__*/Layer.effect(WS, make);
94
+ //# sourceMappingURL=WS.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"WS.mjs","names":["Log","WebSocket","Effect","Layer","Tag","Ref","Queue","Runtime","Duration","Reconnect","Symbol","WebSocketError","reason","error","_tag","constructor","WebSocketCloseError","code","isReconnect","e","socket","urlRef","get","pipe","map","_","acquireRelease","ws","sync","removeAllListeners","close","offer","queue","log","runtime","flatMap","async","resume","run","runFork","addEventListener","message","all","debug","data","concurrency","discard","cause","fail","waitForOpen","timeout","timeoutFail","suspend","readyState","OPEN","unit","once","onTimeout","duration","send","take","tap","failSync","forever","make","gen","connect","url","takeOutbound","onConnecting","openTimeout","seconds","unbounded","zipRight","scoped","retryWhile","WS","LiveWS","effect"],"sources":["../../src/DiscordGateway/WS.ts"],"sourcesContent":[null],"mappings":"AAAA,SAASA,GAAG,QAAQ,SAAS;AAC7B,OAAOC,SAAS,MAAM,eAAe;AACrC,OAAO,KAAKC,MAAM,MAAM,mBAAmB;AAC3C,OAAO,KAAKC,KAAK,MAAM,kBAAkB;AACzC,SAASC,GAAG,QAAQ,sBAAsB;AAC1C,OAAO,KAAKC,GAAG,MAAM,gBAAgB;AACrC,OAAO,KAAKC,KAAK,MAAM,kBAAkB;AACzC,OAAO,KAAKC,OAAO,MAAM,oBAAoB;AAC7C,OAAO,KAAKC,QAAQ,MAAM,uBAAuB;AAEjD,OAAO,MAAMC,SAAS,gBAAGC,MAAM,EAAE;AAIjC,OAAM,MAAOC,cAAc;EAGdC,MAAA;EACAC,KAAA;EAHFC,IAAI,GAAG,gBAAgB;EAChCC,YACWH,MAAgC,EAChCC,KAAe;IADf,KAAAD,MAAM,GAANA,MAAM;IACN,KAAAC,KAAK,GAALA,KAAK;EACb;;AAGL,OAAM,MAAOG,mBAAmB;EAETC,IAAA;EAAuBL,MAAA;EADnCE,IAAI,GAAG,qBAAqB;EACrCC,YAAqBE,IAAY,EAAWL,MAAc;IAArC,KAAAK,IAAI,GAAJA,IAAI;IAAmB,KAAAL,MAAM,GAANA,MAAM;EAAW;;AAG/D,MAAMM,WAAW,GACfC,CAAuC,IAEvCA,CAAC,CAACL,IAAI,KAAK,qBAAqB,IAAIK,CAAC,CAACF,IAAI,KAAK,IAAI;AAErD,MAAMG,MAAM,GAAIC,MAAuB,IACrChB,GAAG,CAACiB,GAAG,CAACD,MAAM,CAAC,CAACE,IAAI,CAClBrB,MAAM,CAACsB,GAAG,CAACC,CAAC,IAAI,IAAIxB,SAAS,CAACwB,CAAC,CAAgC,CAAC,EAChEvB,MAAM,CAACwB,cAAc,CAACC,EAAE,IACtBzB,MAAM,CAAC0B,IAAI,CAAC,MAAK;EACf;EACA;EAAED,EAAU,CAACE,kBAAkB,GAAE,CAAE;EACnCF,EAAE,CAACG,KAAK,EAAE;AACZ,CAAC,CAAC,CACH,CACF;AAEH,MAAMC,KAAK,GAAGA,CACZJ,EAAwB,EACxBK,KAAoC,EACpCC,GAAQ,KAER/B,MAAM,CAACgC,OAAO,EAAS,CAACX,IAAI,CAC1BrB,MAAM,CAACiC,OAAO,CAACD,OAAO,IACpBhC,MAAM,CAACkC,KAAK,CACVC,MAAM,IAAG;EACP,MAAMC,GAAG,GAAG/B,OAAO,CAACgC,OAAO,CAACL,OAAO,CAAC;EACpCP,EAAE,CAACa,gBAAgB,CAAC,SAAS,EAAEC,OAAO,IAAG;IACvCH,GAAG,CACDpC,MAAM,CAACwC,GAAG,CACRT,GAAG,CAACU,KAAK,CAAC,IAAI,EAAE,SAAS,EAAEF,OAAO,CAACG,IAAI,CAAC,EACxCtC,KAAK,CAACyB,KAAK,CAACC,KAAK,EAAES,OAAO,CAACG,IAAI,CAAC,EAChC;MAAEC,WAAW,EAAE,WAAW;MAAEC,OAAO,EAAE;IAAI,CAAE,CAC5C,CACF;EACH,CAAC,CAAC;EAEFnB,EAAE,CAACa,gBAAgB,CAAC,OAAO,EAAEO,KAAK,IAAG;IACnCV,MAAM,CAACnC,MAAM,CAAC8C,IAAI,CAAC,IAAIrC,cAAc,CAAC,OAAO,EAAEoC,KAAK,CAAC,CAAC,CAAC;EACzD,CAAC,CAAC;EAEFpB,EAAE,CAACa,gBAAgB,CAAC,OAAO,EAAErB,CAAC,IAAG;IAC/BkB,MAAM,CAACnC,MAAM,CAAC8C,IAAI,CAAC,IAAIhC,mBAAmB,CAACG,CAAC,CAACF,IAAI,EAAEE,CAAC,CAACP,MAAM,CAAC,CAAC,CAAC;EAChE,CAAC,CAAC;AACJ,CAAC,CACF,CACF,CACF;AAEH,MAAMqC,WAAW,GAAGA,CAACtB,EAAwB,EAAEuB,OAA0B,KACvEhD,MAAM,CAACiD,WAAW,CAChBjD,MAAM,CAACkD,OAAO,CAAC,MAAK;EAClB,IAAIzB,EAAE,CAAC0B,UAAU,KAAKpD,SAAS,CAACqD,IAAI,EAAE;IACpC,OAAOpD,MAAM,CAACqD,IAAI;;EAGpB,OAAOrD,MAAM,CAACkC,KAAK,CAAqBC,MAAM,IAAG;IAC/CV,EAAE,CAACa,gBAAgB,CAAC,MAAM,EAAE,MAAMH,MAAM,CAACnC,MAAM,CAACqD,IAAI,CAAC,EAAE;MACrDC,IAAI,EAAE;KACP,CAAC;EACJ,CAAC,CAAC;AACJ,CAAC,CAAC,EACF;EACEC,SAAS,EAAEA,CAAA,KAAM,IAAI9C,cAAc,CAAC,cAAc,CAAC;EACnD+C,QAAQ,EAAER;CACX,CACF;AAEH,MAAMS,IAAI,GAAGA,CACXhC,EAAwB,EACxBiC,IAA0C,EAC1C3B,GAAQ,KAER2B,IAAI,CAACrC,IAAI,CACPrB,MAAM,CAAC2D,GAAG,CAACjB,IAAI,IAAIX,GAAG,CAACU,KAAK,CAAC,IAAI,EAAE,MAAM,EAAEC,IAAI,CAAC,CAAC,EACjD1C,MAAM,CAAC2D,GAAG,CAACjB,IAAI,IAAG;EAChB,IAAIA,IAAI,KAAKnC,SAAS,EAAE;IACtB,OAAOP,MAAM,CAAC4D,QAAQ,CAAC,MAAK;MAC1BnC,EAAE,CAACG,KAAK,CAAC,IAAI,EAAE,cAAc,CAAC;MAC9B,OAAO,IAAId,mBAAmB,CAAC,IAAI,EAAE,cAAc,CAAC;IACtD,CAAC,CAAC;;EAGJ,OAAOd,MAAM,CAAC0B,IAAI,CAAC,MAAK;IACtBD,EAAE,CAACgC,IAAI,CAACf,IAAI,CAAC;EACf,CAAC,CAAC;AACJ,CAAC,CAAC,EACF1C,MAAM,CAAC6D,OAAO,CACf;AAEH,MAAMC,IAAI,gBAAG9D,MAAM,CAAC+D,GAAG,CAAC,WAAWxC,CAAC;EAClC,MAAMQ,GAAG,GAAG,OAAOR,CAAC,CAACzB,GAAG,CAAC;EAEzB,MAAMkE,OAAO,GAAGA,CACdC,GAAoB,EACpBC,YAAkD,EAClDC,YAAY,GAAGnE,MAAM,CAACqD,IAAI,EAC1Be,WAAW,GAAG9D,QAAQ,CAAC+D,OAAO,CAAC,CAAC,CAAC,KAEjCrE,MAAM,CAAC+D,GAAG,CAAC,WAAWxC,CAAC;IACrB,MAAMO,KAAK,GAAG,OAAOP,CAAC,CAACnB,KAAK,CAACkE,SAAS,EAAkB,CAAC;IAEzD,MAAMlC,GAAG,GAAG+B,YAAY,CAAC9C,IAAI,CAC3BrB,MAAM,CAACuE,QAAQ,CAACrD,MAAM,CAAC+C,GAAG,CAAC,CAAC,EAC5BjE,MAAM,CAACiC,OAAO,CAACR,EAAE,IACfzB,MAAM,CAACwC,GAAG,CACRX,KAAK,CAACJ,EAAE,EAAEK,KAAK,EAAEC,GAAG,CAAC,EACrBgB,WAAW,CAACtB,EAAE,EAAE2C,WAAW,CAAC,CAAC/C,IAAI,CAC/BrB,MAAM,CAACuE,QAAQ,CAACd,IAAI,CAAChC,EAAE,EAAEyC,YAAY,EAAEnC,GAAG,CAAC,CAAC,CAC7C,EACD;MAAEY,WAAW,EAAE,WAAW;MAAEC,OAAO,EAAE;IAAI,CAAE,CAC5C,CACF,EACD5C,MAAM,CAACwE,MAAM,EACbxE,MAAM,CAACyE,UAAU,CAACzD,WAAW,CAAC,CAC/B;IAED,OAAO;MAAEoB,GAAG;MAAEsB,IAAI,EAAEtD,KAAK,CAACsD,IAAI,CAAC5B,KAAK;IAAC,CAAW;EAClD,CAAC,CAAC;EAEJ,OAAO;IAAEkC;EAAO,CAAW;AAC7B,CAAC,CAAC;AAGF,OAAO,MAAMU,EAAE,gBAAGxE,GAAG,EAAM;AAC3B,OAAO,MAAMyE,MAAM,gBAAG1E,KAAK,CAAC2E,MAAM,CAACF,EAAE,EAAEZ,IAAI,CAAC"}
@@ -0,0 +1,36 @@
1
+ import { Tag } from "@effect/data/Context";
2
+ import * as Effect from "@effect/io/Effect";
3
+ import * as Hub from "@effect/io/Hub";
4
+ import * as Layer from "@effect/io/Layer";
5
+ import * as Queue from "@effect/io/Queue";
6
+ import * as Stream from "@effect/stream/Stream";
7
+ import { LiveSharder, Sharder } from "dfx/DiscordGateway/Sharder";
8
+ import * as EffectUtils from "dfx/utils/Effect";
9
+ const fromDispatchFactory = source => event => Stream.filter(source, p => p.t === event).pipe(Stream.map(p => p.d));
10
+ const handleDispatchFactory = hub => (event, handle) => EffectUtils.subscribeForEachPar(hub, _ => {
11
+ if (_.t === event) {
12
+ return handle(_.d);
13
+ }
14
+ return Effect.unit;
15
+ });
16
+ export const DiscordGateway = /*#__PURE__*/Tag();
17
+ export const make = /*#__PURE__*/Effect.gen(function* (_) {
18
+ const sharder = yield* _(Sharder);
19
+ const hub = yield* _(Hub.unbounded());
20
+ const sendQueue = yield* _(Queue.unbounded());
21
+ const send = payload => sendQueue.offer(payload);
22
+ const dispatch = Stream.fromHub(hub);
23
+ const fromDispatch = fromDispatchFactory(dispatch);
24
+ const handleDispatch = handleDispatchFactory(hub);
25
+ const run = sharder.run(hub, sendQueue);
26
+ return DiscordGateway.of({
27
+ run,
28
+ dispatch,
29
+ fromDispatch,
30
+ handleDispatch,
31
+ send,
32
+ shards: sharder.shards
33
+ });
34
+ });
35
+ export const LiveDiscordGateway = /*#__PURE__*/Layer.provide(LiveSharder, /*#__PURE__*/Layer.effect(DiscordGateway, make));
36
+ //# sourceMappingURL=DiscordGateway.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DiscordGateway.mjs","names":["Tag","Effect","Hub","Layer","Queue","Stream","LiveSharder","Sharder","EffectUtils","fromDispatchFactory","source","event","filter","p","t","pipe","map","d","handleDispatchFactory","hub","handle","subscribeForEachPar","_","unit","DiscordGateway","make","gen","sharder","unbounded","sendQueue","send","payload","offer","dispatch","fromHub","fromDispatch","handleDispatch","run","of","shards","LiveDiscordGateway","provide","effect"],"sources":["../src/DiscordGateway.ts"],"sourcesContent":[null],"mappings":"AAAA,SAASA,GAAG,QAAQ,sBAAsB;AAE1C,OAAO,KAAKC,MAAM,MAAM,mBAAmB;AAC3C,OAAO,KAAKC,GAAG,MAAM,gBAAgB;AACrC,OAAO,KAAKC,KAAK,MAAM,kBAAkB;AACzC,OAAO,KAAKC,KAAK,MAAM,kBAAkB;AACzC,OAAO,KAAKC,MAAM,MAAM,uBAAuB;AAE/C,SAASC,WAAW,EAAEC,OAAO,QAAQ,4BAA4B;AAGjE,OAAO,KAAKC,WAAW,MAAM,kBAAkB;AAE/C,MAAMC,mBAAmB,GAErBC,MAAyE,IAGzEC,KAAQ,IAERN,MAAM,CAACO,MAAM,CAACF,MAAM,EAAEG,CAAC,IAAIA,CAAC,CAACC,CAAC,KAAKH,KAAK,CAAC,CAACI,IAAI,CAACV,MAAM,CAACW,GAAG,CAACH,CAAC,IAAIA,CAAC,CAACI,CAAS,CAAC,CAAC;AAEhF,MAAMC,qBAAqB,GACxBC,GAA0D,IAC3D,CACER,KAAQ,EACRS,MAAmE,KAEnEZ,WAAW,CAACa,mBAAmB,CAACF,GAAG,EAAEG,CAAC,IAAG;EACvC,IAAIA,CAAC,CAACR,CAAC,KAAKH,KAAK,EAAE;IACjB,OAAOS,MAAM,CAACE,CAAC,CAACL,CAAQ,CAAC;;EAE3B,OAAOhB,MAAM,CAACsB,IAAI;AACpB,CAAC,CAAC;AAyBN,OAAO,MAAMC,cAAc,gBAAGxB,GAAG,EAAkB;AAEnD,OAAO,MAAMyB,IAAI,gBAAGxB,MAAM,CAACyB,GAAG,CAAC,WAAWJ,CAAC;EACzC,MAAMK,OAAO,GAAG,OAAOL,CAAC,CAACf,OAAO,CAAC;EACjC,MAAMY,GAAG,GAAG,OAAOG,CAAC,CAClBpB,GAAG,CAAC0B,SAAS,EAAgD,CAC9D;EAED,MAAMC,SAAS,GAAG,OAAOP,CAAC,CACxBlB,KAAK,CAACwB,SAAS,EAA6C,CAC7D;EACD,MAAME,IAAI,GAAIC,OAAkD,IAC9DF,SAAS,CAACG,KAAK,CAACD,OAAO,CAAC;EAE1B,MAAME,QAAQ,GAAG5B,MAAM,CAAC6B,OAAO,CAACf,GAAG,CAAC;EACpC,MAAMgB,YAAY,GAAG1B,mBAAmB,CAACwB,QAAQ,CAAC;EAClD,MAAMG,cAAc,GAAGlB,qBAAqB,CAACC,GAAG,CAAC;EAEjD,MAAMkB,GAAG,GAAGV,OAAO,CAACU,GAAG,CAAClB,GAAG,EAAEU,SAAS,CAAC;EAEvC,OAAOL,cAAc,CAACc,EAAE,CAAC;IACvBD,GAAG;IACHJ,QAAQ;IACRE,YAAY;IACZC,cAAc;IACdN,IAAI;IACJS,MAAM,EAAEZ,OAAO,CAACY;GACjB,CAAC;AACJ,CAAC,CAAC;AAEF,OAAO,MAAMC,kBAAkB,gBAAGrC,KAAK,CAACsC,OAAO,CAC7CnC,WAAW,eACXH,KAAK,CAACuC,MAAM,CAAClB,cAAc,EAAEC,IAAI,CAAC,CACnC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.mjs","names":[],"sources":["../../src/DiscordREST/types.ts"],"sourcesContent":[null],"mappings":""}
@@ -0,0 +1,19 @@
1
+ import * as Option from "@effect/data/Option";
2
+ import * as Duration from "@effect/data/Duration";
3
+ const majorResources = ["channels", "guilds", "webhooks"];
4
+ export const routeFromConfig = (path, method) => {
5
+ // Only keep major ID's
6
+ const routeURL = path.split("?")[0].replace(/\/([A-Za-z]+)\/(\d{16,21}|@me)/g, (match, resource) => majorResources.includes(resource) ? match : `/${resource}`)
7
+ // Strip reactions
8
+ .replace(/\/reactions\/(.*)/, "/reactions");
9
+ return `${method}-${routeURL}`;
10
+ };
11
+ export const numberHeader = headers => key => Option.fromNullable(headers.get(key)).pipe(Option.map(parseFloat), Option.filter(n => !isNaN(n)));
12
+ export const retryAfter = headers => numberHeader(headers)("x-ratelimit-reset-after").pipe(Option.orElse(() => numberHeader(headers)("retry-after")), Option.map(Duration.seconds));
13
+ export const rateLimitFromHeaders = headers => Option.all({
14
+ bucket: Option.fromNullable(headers.get("x-ratelimit-bucket")),
15
+ retryAfter: retryAfter(headers),
16
+ limit: numberHeader(headers)("x-ratelimit-limit"),
17
+ remaining: numberHeader(headers)("x-ratelimit-remaining")
18
+ });
19
+ //# sourceMappingURL=utils.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.mjs","names":["Option","Duration","majorResources","routeFromConfig","path","method","routeURL","split","replace","match","resource","includes","numberHeader","headers","key","fromNullable","get","pipe","map","parseFloat","filter","n","isNaN","retryAfter","orElse","seconds","rateLimitFromHeaders","all","bucket","limit","remaining"],"sources":["../../src/DiscordREST/utils.ts"],"sourcesContent":[null],"mappings":"AAAA,OAAO,KAAKA,MAAM,MAAM,qBAAqB;AAC7C,OAAO,KAAKC,QAAQ,MAAM,uBAAuB;AAEjD,MAAMC,cAAc,GAAG,CAAC,UAAU,EAAE,QAAQ,EAAE,UAAU,CAAU;AAElE,OAAO,MAAMC,eAAe,GAAGA,CAACC,IAAY,EAAEC,MAAc,KAAI;EAC9D;EACA,MAAMC,QAAQ,GAAGF,IAAI,CAClBG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CACbC,OAAO,CAAC,iCAAiC,EAAE,CAACC,KAAK,EAAEC,QAAQ,KAC1DR,cAAc,CAACS,QAAQ,CAACD,QAAQ,CAAC,GAAGD,KAAK,GAAG,IAAIC,QAAQ,EAAE;EAE5D;EAAA,CACCF,OAAO,CAAC,mBAAmB,EAAE,YAAY,CAAC;EAE7C,OAAO,GAAGH,MAAM,IAAIC,QAAQ,EAAE;AAChC,CAAC;AAED,OAAO,MAAMM,YAAY,GAAIC,OAAgB,IAAMC,GAAW,IAC5Dd,MAAM,CAACe,YAAY,CAACF,OAAO,CAACG,GAAG,CAACF,GAAG,CAAC,CAAC,CAACG,IAAI,CACxCjB,MAAM,CAACkB,GAAG,CAACC,UAAU,CAAC,EACtBnB,MAAM,CAACoB,MAAM,CAACC,CAAC,IAAI,CAACC,KAAK,CAACD,CAAC,CAAC,CAAC,CAC9B;AAEH,OAAO,MAAME,UAAU,GAAIV,OAAgB,IACzCD,YAAY,CAACC,OAAO,CAAC,CAAC,yBAAyB,CAAC,CAACI,IAAI,CACnDjB,MAAM,CAACwB,MAAM,CAAC,MAAMZ,YAAY,CAACC,OAAO,CAAC,CAAC,aAAa,CAAC,CAAC,EACzDb,MAAM,CAACkB,GAAG,CAACjB,QAAQ,CAACwB,OAAO,CAAC,CAC7B;AAEH,OAAO,MAAMC,oBAAoB,GAAIb,OAAgB,IACnDb,MAAM,CAAC2B,GAAG,CAAC;EACTC,MAAM,EAAE5B,MAAM,CAACe,YAAY,CAACF,OAAO,CAACG,GAAG,CAAC,oBAAoB,CAAC,CAAC;EAC9DO,UAAU,EAAEA,UAAU,CAACV,OAAO,CAAC;EAC/BgB,KAAK,EAAEjB,YAAY,CAACC,OAAO,CAAC,CAAC,mBAAmB,CAAC;EACjDiB,SAAS,EAAElB,YAAY,CAACC,OAAO,CAAC,CAAC,uBAAuB;CACzD,CAAC"}