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.
- package/Cache/driver.d.ts +17 -16
- package/Cache/driver.d.ts.map +1 -1
- package/Cache/driver.js +10 -2
- package/Cache/driver.js.map +1 -1
- package/Cache/memory.d.ts +3 -3
- package/Cache/memory.d.ts.map +1 -1
- package/Cache/memory.js +55 -45
- package/Cache/memory.js.map +1 -1
- package/Cache/memoryTTL.d.ts +7 -6
- package/Cache/memoryTTL.d.ts.map +1 -1
- package/Cache/memoryTTL.js +126 -118
- package/Cache/memoryTTL.js.map +1 -1
- package/Cache/prelude.d.ts +53 -47
- package/Cache/prelude.d.ts.map +1 -1
- package/Cache/prelude.js +125 -96
- package/Cache/prelude.js.map +1 -1
- package/Cache.d.ts +33 -32
- package/Cache.d.ts.map +1 -1
- package/Cache.js +137 -65
- package/Cache.js.map +1 -1
- package/DiscordConfig.d.ts +26 -20
- package/DiscordConfig.d.ts.map +1 -1
- package/DiscordConfig.js +43 -25
- package/DiscordConfig.js.map +1 -1
- package/DiscordGateway/DiscordWS.d.ts +17 -14
- package/DiscordGateway/DiscordWS.d.ts.map +1 -1
- package/DiscordGateway/DiscordWS.js +49 -30
- package/DiscordGateway/DiscordWS.js.map +1 -1
- package/DiscordGateway/Shard/heartbeats.d.ts +7 -3
- package/DiscordGateway/Shard/heartbeats.d.ts.map +1 -1
- package/DiscordGateway/Shard/heartbeats.js +28 -18
- package/DiscordGateway/Shard/heartbeats.js.map +1 -1
- package/DiscordGateway/Shard/identify.d.ts +10 -8
- package/DiscordGateway/Shard/identify.d.ts.map +1 -1
- package/DiscordGateway/Shard/identify.js +41 -24
- package/DiscordGateway/Shard/identify.js.map +1 -1
- package/DiscordGateway/Shard/invalidSession.d.ts +6 -3
- package/DiscordGateway/Shard/invalidSession.d.ts.map +1 -1
- package/DiscordGateway/Shard/invalidSession.js +14 -5
- package/DiscordGateway/Shard/invalidSession.js.map +1 -1
- package/DiscordGateway/Shard/sendEvents.d.ts +1 -1
- package/DiscordGateway/Shard/sendEvents.d.ts.map +1 -1
- package/DiscordGateway/Shard/sendEvents.js +30 -18
- package/DiscordGateway/Shard/sendEvents.js.map +1 -1
- package/DiscordGateway/Shard/utils.d.ts +7 -3
- package/DiscordGateway/Shard/utils.d.ts.map +1 -1
- package/DiscordGateway/Shard/utils.js +19 -9
- package/DiscordGateway/Shard/utils.js.map +1 -1
- package/DiscordGateway/Shard.d.ts +15 -10
- package/DiscordGateway/Shard.d.ts.map +1 -1
- package/DiscordGateway/Shard.js +109 -87
- package/DiscordGateway/Shard.js.map +1 -1
- package/DiscordGateway/ShardStore.d.ts +9 -6
- package/DiscordGateway/ShardStore.d.ts.map +1 -1
- package/DiscordGateway/ShardStore.js +30 -18
- package/DiscordGateway/ShardStore.js.map +1 -1
- package/DiscordGateway/Sharder.d.ts +17 -11
- package/DiscordGateway/Sharder.d.ts.map +1 -1
- package/DiscordGateway/Sharder.js +82 -52
- package/DiscordGateway/Sharder.js.map +1 -1
- package/DiscordGateway/WS.d.ts +13 -10
- package/DiscordGateway/WS.d.ts.map +1 -1
- package/DiscordGateway/WS.js +100 -74
- package/DiscordGateway/WS.js.map +1 -1
- package/DiscordGateway.d.ts +19 -13
- package/DiscordGateway.d.ts.map +1 -1
- package/DiscordGateway.js +45 -32
- package/DiscordGateway.js.map +1 -1
- package/DiscordREST/types.d.ts +5 -5
- package/DiscordREST/types.d.ts.map +1 -1
- package/DiscordREST/types.js +5 -1
- package/DiscordREST/types.js.map +1 -1
- package/DiscordREST/utils.d.ts +3 -2
- package/DiscordREST/utils.d.ts.map +1 -1
- package/DiscordREST/utils.js +27 -17
- package/DiscordREST/utils.js.map +1 -1
- package/DiscordREST.d.ts +11 -8
- package/DiscordREST.d.ts.map +1 -1
- package/DiscordREST.js +141 -127
- package/DiscordREST.js.map +1 -1
- package/Helpers/flags.js +31 -19
- package/Helpers/flags.js.map +1 -1
- package/Helpers/intents.d.ts.map +1 -1
- package/Helpers/intents.js +22 -10
- package/Helpers/intents.js.map +1 -1
- package/Helpers/interactions.d.ts +22 -21
- package/Helpers/interactions.d.ts.map +1 -1
- package/Helpers/interactions.js +75 -39
- package/Helpers/interactions.js.map +1 -1
- package/Helpers/members.d.ts +3 -3
- package/Helpers/members.d.ts.map +1 -1
- package/Helpers/members.js +10 -3
- package/Helpers/members.js.map +1 -1
- package/Helpers/permissions.d.ts +5 -4
- package/Helpers/permissions.d.ts.map +1 -1
- package/Helpers/permissions.js +69 -52
- package/Helpers/permissions.js.map +1 -1
- package/Helpers/ui.d.ts +1 -1
- package/Helpers/ui.d.ts.map +1 -1
- package/Helpers/ui.js +44 -29
- package/Helpers/ui.js.map +1 -1
- package/Interactions/builder.d.ts +20 -19
- package/Interactions/builder.d.ts.map +1 -1
- package/Interactions/builder.js +66 -63
- package/Interactions/builder.js.map +1 -1
- package/Interactions/context.d.ts +26 -23
- package/Interactions/context.d.ts.map +1 -1
- package/Interactions/context.js +86 -57
- package/Interactions/context.js.map +1 -1
- package/Interactions/definitions.d.ts +33 -30
- package/Interactions/definitions.d.ts.map +1 -1
- package/Interactions/definitions.js +61 -47
- package/Interactions/definitions.js.map +1 -1
- package/Interactions/gateway.d.ts +15 -10
- package/Interactions/gateway.d.ts.map +1 -1
- package/Interactions/gateway.js +55 -42
- package/Interactions/gateway.js.map +1 -1
- package/Interactions/handlers.d.ts +6 -4
- package/Interactions/handlers.d.ts.map +1 -1
- package/Interactions/handlers.js +68 -57
- package/Interactions/handlers.js.map +1 -1
- package/Interactions/index.d.ts +11 -10
- package/Interactions/index.d.ts.map +1 -1
- package/Interactions/index.js +95 -10
- package/Interactions/index.js.map +1 -1
- package/Interactions/utils.d.ts +42 -40
- package/Interactions/utils.d.ts.map +1 -1
- package/Interactions/utils.js +40 -32
- package/Interactions/utils.js.map +1 -1
- package/Interactions/webhook.d.ts +20 -16
- package/Interactions/webhook.d.ts.map +1 -1
- package/Interactions/webhook.js +73 -41
- package/Interactions/webhook.js.map +1 -1
- package/Log.d.ts +8 -5
- package/Log.d.ts.map +1 -1
- package/Log.js +23 -14
- package/Log.js.map +1 -1
- package/RateLimit/memory.d.ts +1 -1
- package/RateLimit/memory.d.ts.map +1 -1
- package/RateLimit/memory.js +46 -33
- package/RateLimit/memory.js.map +1 -1
- package/RateLimit/utils.d.ts +1 -1
- package/RateLimit/utils.d.ts.map +1 -1
- package/RateLimit/utils.js +23 -16
- package/RateLimit/utils.js.map +1 -1
- package/RateLimit.d.ts +18 -14
- package/RateLimit.d.ts.map +1 -1
- package/RateLimit.js +40 -26
- package/RateLimit.js.map +1 -1
- package/gateway.d.ts +20 -13
- package/gateway.d.ts.map +1 -1
- package/gateway.js +72 -25
- package/gateway.js.map +1 -1
- package/index.d.ts +14 -13
- package/index.d.ts.map +1 -1
- package/index.js +71 -13
- package/index.js.map +1 -1
- package/mjs/Cache/driver.mjs +3 -0
- package/mjs/Cache/driver.mjs.map +1 -0
- package/mjs/Cache/memory.mjs +48 -0
- package/mjs/Cache/memory.mjs.map +1 -0
- package/mjs/Cache/memoryTTL.mjs +119 -0
- package/mjs/Cache/memoryTTL.mjs.map +1 -0
- package/mjs/Cache/prelude.mjs +125 -0
- package/mjs/Cache/prelude.mjs.map +1 -0
- package/mjs/Cache.mjs +87 -0
- package/mjs/Cache.mjs.map +1 -0
- package/mjs/DiscordConfig.mjs +34 -0
- package/mjs/DiscordConfig.mjs.map +1 -0
- package/mjs/DiscordGateway/DiscordWS.mjs +39 -0
- package/mjs/DiscordGateway/DiscordWS.mjs.map +1 -0
- package/mjs/DiscordGateway/Shard/heartbeats.mjs +21 -0
- package/mjs/DiscordGateway/Shard/heartbeats.mjs.map +1 -0
- package/mjs/DiscordGateway/Shard/identify.mjs +37 -0
- package/mjs/DiscordGateway/Shard/identify.mjs.map +1 -0
- package/mjs/DiscordGateway/Shard/invalidSession.mjs +6 -0
- package/mjs/DiscordGateway/Shard/invalidSession.mjs.map +1 -0
- package/mjs/DiscordGateway/Shard/sendEvents.mjs +25 -0
- package/mjs/DiscordGateway/Shard/sendEvents.mjs.map +1 -0
- package/mjs/DiscordGateway/Shard/utils.mjs +11 -0
- package/mjs/DiscordGateway/Shard/utils.mjs.map +1 -0
- package/mjs/DiscordGateway/Shard.mjs +99 -0
- package/mjs/DiscordGateway/Shard.mjs.map +1 -0
- package/mjs/DiscordGateway/ShardStore.mjs +24 -0
- package/mjs/DiscordGateway/ShardStore.mjs.map +1 -0
- package/mjs/DiscordGateway/Sharder.mjs +73 -0
- package/mjs/DiscordGateway/Sharder.mjs.map +1 -0
- package/mjs/DiscordGateway/WS.mjs +94 -0
- package/mjs/DiscordGateway/WS.mjs.map +1 -0
- package/mjs/DiscordGateway.mjs +36 -0
- package/mjs/DiscordGateway.mjs.map +1 -0
- package/mjs/DiscordREST/types.mjs +2 -0
- package/mjs/DiscordREST/types.mjs.map +1 -0
- package/mjs/DiscordREST/utils.mjs +19 -0
- package/mjs/DiscordREST/utils.mjs.map +1 -0
- package/mjs/DiscordREST.mjs +129 -0
- package/mjs/DiscordREST.mjs.map +1 -0
- package/mjs/Helpers/flags.mjs +36 -0
- package/mjs/Helpers/flags.mjs.map +1 -0
- package/mjs/Helpers/intents.mjs +27 -0
- package/mjs/Helpers/intents.mjs.map +1 -0
- package/mjs/Helpers/interactions.mjs +104 -0
- package/mjs/Helpers/interactions.mjs.map +1 -0
- package/mjs/Helpers/members.mjs +9 -0
- package/mjs/Helpers/members.mjs.map +1 -0
- package/mjs/Helpers/permissions.mjs +82 -0
- package/mjs/Helpers/permissions.mjs.map +1 -0
- package/mjs/Helpers/ui.mjs +66 -0
- package/mjs/Helpers/ui.mjs.map +1 -0
- package/mjs/Interactions/builder.mjs +62 -0
- package/mjs/Interactions/builder.mjs.map +1 -0
- package/mjs/Interactions/context.mjs +63 -0
- package/mjs/Interactions/context.mjs.map +1 -0
- package/mjs/Interactions/definitions.mjs +51 -0
- package/mjs/Interactions/definitions.mjs.map +1 -0
- package/mjs/Interactions/gateway.mjs +48 -0
- package/mjs/Interactions/gateway.mjs.map +1 -0
- package/mjs/Interactions/handlers.mjs +61 -0
- package/mjs/Interactions/handlers.mjs.map +1 -0
- package/mjs/Interactions/index.mjs +12 -0
- package/mjs/Interactions/index.mjs.map +1 -0
- package/mjs/Interactions/utils.mjs +35 -0
- package/mjs/Interactions/utils.mjs.map +1 -0
- package/mjs/Interactions/webhook.mjs +73 -0
- package/mjs/Interactions/webhook.mjs.map +1 -0
- package/mjs/Log.mjs +15 -0
- package/mjs/Log.mjs.map +1 -0
- package/mjs/RateLimit/memory.mjs +39 -0
- package/mjs/RateLimit/memory.mjs.map +1 -0
- package/mjs/RateLimit/utils.mjs +18 -0
- package/mjs/RateLimit/utils.mjs.map +1 -0
- package/mjs/RateLimit.mjs +29 -0
- package/mjs/RateLimit.mjs.map +1 -0
- package/mjs/gateway.mjs +27 -0
- package/mjs/gateway.mjs.map +1 -0
- package/mjs/index.mjs +15 -0
- package/mjs/index.mjs.map +1 -0
- package/mjs/types.mjs +1211 -0
- package/mjs/types.mjs.map +1 -0
- package/mjs/utils/Effect.mjs +28 -0
- package/mjs/utils/Effect.mjs.map +1 -0
- package/mjs/utils/tsplus.mjs +2 -0
- package/mjs/utils/tsplus.mjs.map +1 -0
- package/mjs/version.mjs +2 -0
- package/mjs/version.mjs.map +1 -0
- package/mjs/webhooks.mjs +30 -0
- package/mjs/webhooks.mjs.map +1 -0
- package/package.json +46 -50
- package/src/Cache/driver.ts +27 -15
- package/src/Cache/memory.ts +9 -5
- package/src/Cache/memoryTTL.ts +69 -53
- package/src/Cache/prelude.ts +113 -91
- package/src/Cache.ts +73 -58
- package/src/DiscordConfig.ts +33 -19
- package/src/DiscordGateway/DiscordWS.ts +28 -25
- package/src/DiscordGateway/Shard/heartbeats.ts +47 -27
- package/src/DiscordGateway/Shard/identify.ts +29 -25
- package/src/DiscordGateway/Shard/invalidSession.ts +9 -7
- package/src/DiscordGateway/Shard/sendEvents.ts +1 -1
- package/src/DiscordGateway/Shard/utils.ts +33 -9
- package/src/DiscordGateway/Shard.ts +119 -99
- package/src/DiscordGateway/ShardStore.ts +12 -5
- package/src/DiscordGateway/Sharder.ts +95 -74
- package/src/DiscordGateway/WS.ts +85 -60
- package/src/DiscordGateway.ts +58 -18
- package/src/DiscordREST/types.ts +5 -5
- package/src/DiscordREST/utils.ts +10 -7
- package/src/DiscordREST.ts +152 -132
- package/src/Helpers/intents.ts +1 -0
- package/src/Helpers/interactions.ts +51 -38
- package/src/Helpers/members.ts +2 -0
- package/src/Helpers/permissions.ts +6 -5
- package/src/Helpers/ui.ts +1 -1
- package/src/Interactions/builder.ts +56 -43
- package/src/Interactions/context.ts +68 -38
- package/src/Interactions/definitions.ts +32 -24
- package/src/Interactions/gateway.ts +72 -47
- package/src/Interactions/handlers.ts +56 -39
- package/src/Interactions/index.ts +6 -5
- package/src/Interactions/utils.ts +32 -21
- package/src/Interactions/webhook.ts +78 -42
- package/src/Log.ts +4 -0
- package/src/RateLimit/memory.ts +10 -4
- package/src/RateLimit/utils.ts +1 -1
- package/src/RateLimit.ts +38 -25
- package/src/gateway.ts +62 -25
- package/src/index.ts +29 -15
- package/src/utils/Effect.ts +69 -0
- package/src/version.ts +1 -0
- package/src/webhooks.ts +47 -20
- package/tsconfig.base.json +48 -0
- package/tsconfig.build.json +10 -0
- package/tsconfig.examples.json +11 -0
- package/tsconfig.json +12 -8
- package/tsconfig.madge.json +12 -0
- package/tsconfig.test.json +10 -0
- package/types.d.ts.map +1 -1
- package/types.js +1216 -1200
- package/types.js.map +1 -1
- package/utils/Effect.d.ts +8 -0
- package/utils/Effect.d.ts.map +1 -0
- package/utils/Effect.js +38 -0
- package/utils/Effect.js.map +1 -0
- package/utils/tsplus.js +5 -1
- package/utils/tsplus.js.map +1 -1
- package/version.d.ts +2 -0
- package/version.d.ts.map +1 -0
- package/version.js +9 -0
- package/version.js.map +1 -0
- package/webhooks.d.ts +14 -9
- package/webhooks.d.ts.map +1 -1
- package/webhooks.js +76 -27
- package/webhooks.js.map +1 -1
- package/_common.d.ts +0 -37
- package/_common.d.ts.map +0 -1
- package/_common.js +0 -8
- package/_common.js.map +0 -1
- package/global.d.ts +0 -18
- package/global.d.ts.map +0 -1
- package/global.js +0 -2
- package/global.js.map +0 -1
- package/src/_common.ts +0 -43
- package/src/global.ts +0 -45
- package/src/package.json +0 -52
- package/src/utils/effect.ts +0 -0
- package/src/utils/hub.ts +0 -47
- package/tsplus.config.json +0 -8
- package/utils/effect.d.ts +0 -2
- package/utils/effect.d.ts.map +0 -1
- package/utils/effect.js +0 -2
- package/utils/effect.js.map +0 -1
- package/utils/hub.d.ts +0 -12
- package/utils/hub.d.ts.map +0 -1
- package/utils/hub.js +0 -26
- 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":"AAAA,SAASA,aAAa,QAAQ,mBAAmB;AACjD,SAASC,eAAe,EAAEC,WAAW,QAAQ,eAAe;AAC5D,SAASC,SAAS,EAAEC,aAAa,QAAiB,8BAA8B;AAChF,OAAO,KAAKC,UAAU,MAAM,qCAAqC;AACjE,OAAO,KAAKC,QAAQ,MAAM,mCAAmC;AAC7D,OAAO,KAAKC,cAAc,MAAM,yCAAyC;AACzE,OAAO,KAAKC,KAAK,MAAM,gCAAgC;AACvD,SAASC,SAAS,QAAQ,uBAAuB;AACjD,SAASC,GAAG,QAAQ,SAAS;AAE7B,OAAO,KAAKC,MAAM,MAAM,mBAAmB;AAC3C,OAAO,KAAKC,KAAK,MAAM,kBAAkB;AACzC,SAASC,GAAG,QAAQ,sBAAsB;AAC1C,OAAO,KAAKC,MAAM,MAAM,qBAAqB;AAC7C,OAAO,KAAKC,GAAG,MAAM,gBAAgB;AACrC,OAAO,KAAKC,KAAK,MAAM,kBAAkB;AACzC,OAAO,KAAKC,GAAG,MAAM,gBAAgB;AACrC,OAAO,KAAKC,QAAQ,MAAM,uBAAuB;AACjD,OAAO,KAAKC,KAAK,MAAM,oBAAoB;AAC3C,OAAO,KAAKC,YAAY,MAAM,0BAA0B;AAQxD,OAAO,MAAMC,IAAI,gBAAGV,MAAM,CAACW,GAAG,CAAC,WAAWC,CAAC;EACzC,MAAM;IAAEC,KAAK;IAAEC;EAAO,CAAE,GAAG,OAAOF,CAAC,CAACvB,aAAa,CAAC;EAClD,MAAM0B,OAAO,GAAG,OAAOH,CAAC,CAACrB,WAAW,CAAC;EACrC,MAAMyB,GAAG,GAAG,OAAOJ,CAAC,CAACpB,SAAS,CAAC;EAC/B,MAAMyB,GAAG,GAAG,OAAOL,CAAC,CAACb,GAAG,CAAC;EAEzB,MAAMmB,OAAO,GAAGA,CACdC,KAAkC,EAClCC,GAA0D,EAC1DC,SAAmE,KAEnErB,MAAM,CAACW,GAAG,CAAC,WAAWC,CAAC;IACrB,MAAMU,aAAa,GAAG,OAAOV,CAAC,CAACP,KAAK,CAACkB,SAAS,EAAW,CAAC;IAC1D,MAAMC,YAAY,GAAG,OAAOZ,CAAC,CAACP,KAAK,CAACkB,SAAS,EAAW,CAAC;IACzD,MAAME,KAAK,GAAG,OAAOb,CAAC,CAACN,GAAG,CAACI,IAAI,0BAAkB,CAAC;IAClD,MAAMgB,QAAQ,GAAIC,CAAQ,IACxB3B,MAAM,CAAC4B,OAAO,CAACtB,GAAG,CAACuB,GAAG,CAACJ,KAAK,EAAEE,CAAC,CAAC,EAAEV,GAAG,CAACa,KAAK,CAAC,OAAO,EAAEX,KAAK,EAAE,OAAO,EAAEQ,CAAC,CAAC,CAAC;IAC1E,MAAMI,QAAQ,GAAG/B,MAAM,CAAC4B,OAAO,CAC7BvB,KAAK,CAAC2B,IAAI,CAACV,aAAa,CAAC,EACzBP,OAAO,CAACkB,SAAS,CAAC,gBAAgB,EAAE1B,QAAQ,CAAC2B,OAAO,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAC9D;IAED,MAAMC,IAAI,GAAIR,CAAU,IACtB3B,MAAM,CAACoC,OAAO,CAAC9B,GAAG,CAAC+B,GAAG,CAACZ,KAAK,CAAC,EAAEA,KAAK,IAClCA,KAAK,+BACDpB,KAAK,CAACiC,KAAK,CAAChB,aAAa,EAAEK,CAAC,CAAC,GAC7BtB,KAAK,CAACiC,KAAK,CAACd,YAAY,EAAEG,CAAC,CAAC,CACjC;IAEH,MAAMY,aAAa,GAAIZ,CAAU,IAC/B3B,MAAM,CAACoC,OAAO,CAAC9B,GAAG,CAAC+B,GAAG,CAACZ,KAAK,CAAC,EAAEA,KAAK,IAClCA,KAAK,gCACDpB,KAAK,CAACiC,KAAK,CAAChB,aAAa,EAAEK,CAAC,CAAC,GAC7B3B,MAAM,CAACwC,OAAO,CAAC,KAAK,CAAC,CAC1B;IAEH,MAAMC,YAAY,GAAId,CAAU,IAAKtB,KAAK,CAACiC,KAAK,CAAChB,aAAa,EAAEK,CAAC,CAAC;IAElE,MAAMe,MAAM,GAAGhB,QAAQ,yBAAiB,CAACiB,IAAI,CAC3C3C,MAAM,CAAC4C,QAAQ,CAACvC,KAAK,CAACwC,OAAO,CAACrB,YAAY,CAAC,CAAC,EAC5CxB,MAAM,CAAC8C,GAAG,CAAClC,CAAC,IAAIP,KAAK,CAAC0C,QAAQ,CAACzB,aAAa,EAAEV,CAAC,CAAC,CAAC,EACjDZ,MAAM,CAACgD,MAAM,CACd;IAED,MAAMC,YAAY,GAAG5C,KAAK,CAACwC,OAAO,CAACvB,aAAa,CAAC,CAACqB,IAAI,CACpD3C,MAAM,CAAC8C,GAAG,CAACI,IAAI,IACb7C,KAAK,CAAC0C,QAAQ,CACZvB,YAAY,EACZhB,KAAK,CAAC2C,MAAM,CACVD,IAAI,EACJE,GAAG,IACDA,GAAG,KAAKtD,SAAS,IACjBsD,GAAG,CAACC,EAAE,+CACND,GAAG,CAACC,EAAE,6CACND,GAAG,CAACC,EAAE,4CAAoC,CAC7C,CACF,CACF,EACDrD,MAAM,CAAC4C,QAAQ,CAAClB,QAAQ,0BAAkB,CAAC,CAC5C;IAED,MAAM4B,MAAM,GAAG,OAAO1C,CAAC,CAACI,GAAG,CAACE,OAAO,CAAC;MAAEa,QAAQ;MAAEkB;IAAY,CAAE,CAAC,CAAC;IAEhE,MAAM,CAACM,WAAW,EAAEC,iBAAiB,CAAC,GAAG,OAAO5C,CAAC,CAC/Cf,KAAK,CAAC4D,MAAM,CAAC9B,CAAC,IACZxB,MAAM,CAACuD,IAAI,CAAC/B,CAAC,CAAC,CAACgB,IAAI,CACjBxC,MAAM,CAACgD,MAAM,CACVxB,CAAC,IACAA,CAAC,CAAC0B,EAAE,+CAAuC1B,CAAC,CAACgC,CAAC,KAAK,OAAO,CAC7D,EACDxD,MAAM,CAACyD,GAAG,CAACjC,CAAC,IAAIA,CAAC,CAACkC,CAAE,CAAC,CACtB,CACF,CACF;IACD,MAAM,CAACC,cAAc,EAAEC,oBAAoB,CAAC,GAAG,OAAOnD,CAAC,CACrDf,KAAK,CAAC4D,MAAM,CAAC9B,CAAC,IAAIxB,MAAM,CAAC6D,YAAY,CAACrC,CAAC,CAACsC,CAAC,CAAC,CAAC,CAC5C;IACD,MAAMC,cAAc,GAAIvC,CAAyB,IAC/CxB,MAAM,CAACuD,IAAI,CAAC/B,CAAC,CAAC,CAACgB,IAAI,CACjBxC,MAAM,CAACgD,MAAM,CACVxB,CAAC,IACAA,CAAC,CAAC0B,EAAE,+CAAuC1B,CAAC,CAACgC,CAAC,KAAK,OAAO,CAC7D,EACDxD,MAAM,CAACyD,GAAG,CAACjC,CAAC,IAAIA,CAAC,CAACkC,CAAE,CAAC,EACrB1D,MAAM,CAACgE,KAAK,CAAC;MACXC,MAAM,EAAEA,CAAA,KAAMpE,MAAM,CAACqE,IAAI;MACzBC,MAAM,EAAEA,CAAC;QAAEC;MAAkB,CAAE,KAC7BjB,MAAM,CAACkB,MAAM,CAACD,kBAAkB;KACnC,CAAC,CACH;IAEH,MAAME,MAAM,GAAG,OAAO7D,CAAC,CAACP,KAAK,CAACkB,SAAS,EAA0B,CAAC;IAClE,MAAMmD,IAAI,GAAG,OAAO9D,CAAC,CAACP,KAAK,CAACkB,SAAS,EAA0B,CAAC;IAEhE;IACA,MAAMoD,UAAU,GAAGjF,UAAU,CAACyC,IAAI,CAChCsC,MAAM,EACNC,IAAI,EACJZ,cAAc,EACdvB,aAAa,CACd;IAED;IACA,MAAMqC,QAAQ,GAAGjF,QAAQ,CAACkF,gBAAgB,CACxC;MACEhE,KAAK,EAAEJ,YAAY,CAACqE,KAAK,CAACjE,KAAK,CAAC;MAChCM,KAAK;MACL4D,OAAO,EAAEjE,OAAO,CAACiE,OAAO;MACxBC,QAAQ,EAAElE,OAAO,CAACkE;KACnB,EACDzB,WAAW,EACXO,cAAc,CACf;IAED,MAAMmB,SAAS,GAAItD,CAAyB,IAC1C3B,MAAM,CAAC8C,GAAG,CACR9C,MAAM,CAACkF,GAAG,CACR1B,iBAAiB,CAAC7B,CAAC,CAAC,EACpBoC,oBAAoB,CAACpC,CAAC,CAAC,EACvBuC,cAAc,CAACvC,CAAC,CAAC,EACjB;MAAEwD,OAAO,EAAE;IAAI,CAAE,CAClB,EACD,MAAK;MACH,QAAQxD,CAAC,CAAC0B,EAAE;QACV;UACE,OAAOrD,MAAM,CAACkF,GAAG,CACflF,MAAM,CAAC8C,GAAG,CAAC8B,QAAQ,EAAEnC,YAAY,CAAC,EAClCf,QAAQ,yBAAiB,EACzBrB,KAAK,CAACiC,KAAK,CAACmC,MAAM,EAAE9C,CAAC,CAAC,EACtB;YAAEwD,OAAO,EAAE;UAAI,CAAE,CAClB;QACH;UACE,OAAO9E,KAAK,CAACiC,KAAK,CAACoC,IAAI,EAAE/C,CAAC,CAAC;QAC7B;UACE,OAAO3B,MAAM,CAAC8C,GAAG,CACflD,cAAc,CAACwF,WAAW,CAACzD,CAAC,EAAE4B,WAAW,CAAC,EAC1CpB,IAAI,CACL;QACH;UACE,IAAIR,CAAC,CAACgC,CAAC,KAAK,OAAO,IAAIhC,CAAC,CAACgC,CAAC,KAAK,SAAS,EAAE;YACxC,OAAO3D,MAAM,CAAC4C,QAAQ,CAACF,MAAM,EAAEtC,GAAG,CAACiF,OAAO,CAACjE,GAAG,EAAEO,CAAC,CAAC,CAAC;;UAErD,OAAOvB,GAAG,CAACiF,OAAO,CAACjE,GAAG,EAAEO,CAAC,CAAC;;MAG9B,OAAO3B,MAAM,CAACqE,IAAI;IACpB,CAAC,CACF;IAEH,MAAMiB,cAAc,GAAGjF,KAAK,CAAC2B,IAAI,CAACX,SAAS,CAAC,CAACsB,IAAI,CAC/C3C,MAAM,CAAC8C,GAAG,CAACX,IAAI,CAAC,EAChBnC,MAAM,CAACuF,OAAO,CACf;IAED,MAAMC,GAAG,GAAGxF,MAAM,CAACkF,GAAG,CACpB5B,MAAM,CAACtB,IAAI,CAACW,IAAI,CAAC3C,MAAM,CAACoC,OAAO,CAAC6C,SAAS,CAAC,EAAEjF,MAAM,CAACuF,OAAO,CAAC,EAC3DZ,UAAU,EACVW,cAAc,EACdhC,MAAM,CAACkC,GAAG,EACV;MAAEL,OAAO,EAAE,IAAI;MAAEM,WAAW,EAAE;IAAW,CAAE,CAC5C;IAED,OAAO;MAAEC,EAAE,EAAEvE,KAAK;MAAEgB,IAAI;MAAEqD;IAAG,CAAW;EAC1C,CAAC,CAAC;EAEJ,OAAO;IAAEtE;EAAO,CAAW;AAC7B,CAAC,CAAC;AAGF,OAAO,MAAMyE,KAAK,gBAAGzF,GAAG,EAAS;AACjC,OAAO,MAAM0F,SAAS,gBAAG3F,KAAK,CAAC4F,OAAO,eACpC5F,KAAK,CAAC6F,KAAK,CAACrG,aAAa,EAAEH,eAAe,CAAC,eAC3CW,KAAK,CAAC8F,MAAM,CAACJ,KAAK,EAAEjF,IAAI,CAAC,CAC1B"}
|
|
@@ -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":"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"}
|
|
@@ -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 @@
|
|
|
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"}
|