dfx 0.77.3 → 0.79.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/Cache/prelude.d.ts +3 -3
- package/DiscordConfig.d.ts +8 -10
- package/DiscordConfig.d.ts.map +1 -1
- package/DiscordConfig.js +1 -3
- package/DiscordConfig.js.map +1 -1
- package/DiscordGateway/DiscordWS.d.ts +12 -11
- package/DiscordGateway/DiscordWS.d.ts.map +1 -1
- package/DiscordGateway/DiscordWS.js +8 -5
- package/DiscordGateway/DiscordWS.js.map +1 -1
- package/DiscordGateway/Messaging.d.ts +28 -0
- package/DiscordGateway/Messaging.d.ts.map +1 -0
- package/DiscordGateway/Messaging.js +41 -0
- package/DiscordGateway/Messaging.js.map +1 -0
- package/DiscordGateway/Shard.d.ts +14 -11
- package/DiscordGateway/Shard.d.ts.map +1 -1
- package/DiscordGateway/Shard.js +22 -19
- package/DiscordGateway/Shard.js.map +1 -1
- package/DiscordGateway/ShardStore.d.ts +5 -2
- package/DiscordGateway/ShardStore.d.ts.map +1 -1
- package/DiscordGateway/ShardStore.js +1 -1
- package/DiscordGateway/ShardStore.js.map +1 -1
- package/DiscordGateway/Sharder.d.ts +9 -18
- package/DiscordGateway/Sharder.d.ts.map +1 -1
- package/DiscordGateway/Sharder.js +36 -45
- package/DiscordGateway/Sharder.js.map +1 -1
- package/DiscordGateway/WS.d.ts +14 -10
- package/DiscordGateway/WS.d.ts.map +1 -1
- package/DiscordGateway/WS.js +31 -21
- package/DiscordGateway/WS.js.map +1 -1
- package/DiscordGateway.d.ts +10 -7
- package/DiscordGateway.d.ts.map +1 -1
- package/DiscordGateway.js +13 -31
- package/DiscordGateway.js.map +1 -1
- package/DiscordREST.d.ts +6 -4
- package/DiscordREST.d.ts.map +1 -1
- package/DiscordREST.js +9 -8
- package/DiscordREST.js.map +1 -1
- package/Interactions/context.d.ts +36 -18
- package/Interactions/context.d.ts.map +1 -1
- package/Interactions/context.js +6 -6
- package/Interactions/context.js.map +1 -1
- package/Interactions/definitions.d.ts +11 -11
- package/Interactions/definitions.d.ts.map +1 -1
- package/Interactions/definitions.js.map +1 -1
- package/Interactions/gateway.d.ts +7 -6
- package/Interactions/gateway.d.ts.map +1 -1
- package/Interactions/gateway.js +1 -1
- package/Interactions/gateway.js.map +1 -1
- package/Interactions/handlers.d.ts +2 -1
- package/Interactions/handlers.d.ts.map +1 -1
- package/Interactions/webhook.d.ts +7 -8
- package/Interactions/webhook.d.ts.map +1 -1
- package/Interactions/webhook.js +3 -3
- package/Interactions/webhook.js.map +1 -1
- package/README.md +37 -29
- package/RateLimit/memory.d.ts +2 -2
- package/RateLimit/memory.d.ts.map +1 -1
- package/RateLimit/memory.js.map +1 -1
- package/RateLimit.d.ts +10 -9
- package/RateLimit.d.ts.map +1 -1
- package/RateLimit.js +4 -5
- package/RateLimit.js.map +1 -1
- package/gateway.d.ts +2 -2
- package/gateway.d.ts.map +1 -1
- package/gateway.js +1 -2
- package/gateway.js.map +1 -1
- package/index.d.ts +1 -2
- package/index.d.ts.map +1 -1
- package/index.js +1 -3
- package/index.js.map +1 -1
- package/mjs/DiscordConfig.mjs +1 -3
- package/mjs/DiscordConfig.mjs.map +1 -1
- package/mjs/DiscordGateway/DiscordWS.mjs +8 -5
- package/mjs/DiscordGateway/DiscordWS.mjs.map +1 -1
- package/mjs/DiscordGateway/Messaging.mjs +33 -0
- package/mjs/DiscordGateway/Messaging.mjs.map +1 -0
- package/mjs/DiscordGateway/Shard.mjs +22 -19
- package/mjs/DiscordGateway/Shard.mjs.map +1 -1
- package/mjs/DiscordGateway/ShardStore.mjs +1 -1
- package/mjs/DiscordGateway/ShardStore.mjs.map +1 -1
- package/mjs/DiscordGateway/Sharder.mjs +35 -44
- package/mjs/DiscordGateway/Sharder.mjs.map +1 -1
- package/mjs/DiscordGateway/WS.mjs +32 -22
- package/mjs/DiscordGateway/WS.mjs.map +1 -1
- package/mjs/DiscordGateway.mjs +12 -30
- package/mjs/DiscordGateway.mjs.map +1 -1
- package/mjs/DiscordREST.mjs +9 -8
- package/mjs/DiscordREST.mjs.map +1 -1
- package/mjs/Interactions/context.mjs +6 -6
- package/mjs/Interactions/context.mjs.map +1 -1
- package/mjs/Interactions/definitions.mjs.map +1 -1
- package/mjs/Interactions/gateway.mjs +1 -1
- package/mjs/Interactions/gateway.mjs.map +1 -1
- package/mjs/Interactions/webhook.mjs +3 -3
- package/mjs/Interactions/webhook.mjs.map +1 -1
- package/mjs/RateLimit/memory.mjs.map +1 -1
- package/mjs/RateLimit.mjs +4 -5
- package/mjs/RateLimit.mjs.map +1 -1
- package/mjs/gateway.mjs +1 -2
- package/mjs/gateway.mjs.map +1 -1
- package/mjs/index.mjs +1 -2
- package/mjs/index.mjs.map +1 -1
- package/mjs/version.mjs +1 -1
- package/mjs/webhooks.mjs +1 -2
- package/mjs/webhooks.mjs.map +1 -1
- package/package.json +4 -4
- package/src/DiscordConfig.ts +10 -12
- package/src/DiscordGateway/DiscordWS.ts +23 -13
- package/src/DiscordGateway/Messaging.ts +72 -0
- package/src/DiscordGateway/Shard.ts +53 -35
- package/src/DiscordGateway/ShardStore.ts +8 -3
- package/src/DiscordGateway/Sharder.ts +72 -97
- package/src/DiscordGateway/WS.ts +64 -32
- package/src/DiscordGateway.ts +22 -71
- package/src/DiscordREST.ts +42 -29
- package/src/Interactions/context.ts +47 -10
- package/src/Interactions/definitions.ts +22 -20
- package/src/Interactions/gateway.ts +14 -6
- package/src/Interactions/handlers.ts +1 -1
- package/src/Interactions/webhook.ts +21 -7
- package/src/RateLimit/memory.ts +2 -2
- package/src/RateLimit.ts +17 -8
- package/src/gateway.ts +0 -2
- package/src/index.ts +0 -2
- package/src/version.ts +1 -1
- package/src/webhooks.ts +1 -2
- package/version.d.ts +1 -1
- package/version.js +1 -1
- package/webhooks.d.ts +1 -2
- package/webhooks.d.ts.map +1 -1
- package/webhooks.js +1 -2
- package/webhooks.js.map +1 -1
- package/Log.d.ts +0 -14
- package/Log.d.ts.map +0 -1
- package/Log.js +0 -23
- package/Log.js.map +0 -1
- package/mjs/Log.mjs +0 -15
- package/mjs/Log.mjs.map +0 -1
- package/src/Log.ts +0 -24
|
@@ -3,7 +3,7 @@ import { Tag } from "effect/Context";
|
|
|
3
3
|
import * as Duration from "effect/Duration";
|
|
4
4
|
import { pipe } from "effect/Function";
|
|
5
5
|
import * as Option from "effect/Option";
|
|
6
|
-
import * as
|
|
6
|
+
import * as Secret from "effect/Secret";
|
|
7
7
|
import * as Effect from "effect/Effect";
|
|
8
8
|
import * as PubSub from "effect/PubSub";
|
|
9
9
|
import * as Layer from "effect/Layer";
|
|
@@ -16,9 +16,9 @@ import * as Identify from "dfx/DiscordGateway/Shard/identify";
|
|
|
16
16
|
import * as InvalidSession from "dfx/DiscordGateway/Shard/invalidSession";
|
|
17
17
|
import * as Utils from "dfx/DiscordGateway/Shard/utils";
|
|
18
18
|
import { Reconnect } from "dfx/DiscordGateway/WS";
|
|
19
|
-
import { Log } from "dfx/Log";
|
|
20
19
|
import { RateLimiterLive, RateLimiter } from "dfx/RateLimit";
|
|
21
20
|
import * as Discord from "dfx/types";
|
|
21
|
+
import { Messaging, MesssagingLive } from "dfx/DiscordGateway/Messaging";
|
|
22
22
|
export const make = /*#__PURE__*/Effect.gen(function* (_) {
|
|
23
23
|
const {
|
|
24
24
|
gateway,
|
|
@@ -26,12 +26,15 @@ export const make = /*#__PURE__*/Effect.gen(function* (_) {
|
|
|
26
26
|
} = yield* _(DiscordConfig);
|
|
27
27
|
const limiter = yield* _(RateLimiter);
|
|
28
28
|
const dws = yield* _(DiscordWS);
|
|
29
|
-
const
|
|
30
|
-
|
|
29
|
+
const {
|
|
30
|
+
hub,
|
|
31
|
+
sendQueue
|
|
32
|
+
} = yield* _(Messaging);
|
|
33
|
+
const connect = shard => Effect.gen(function* (_) {
|
|
31
34
|
const outboundQueue = yield* _(Queue.unbounded());
|
|
32
35
|
const pendingQueue = yield* _(Queue.unbounded());
|
|
33
36
|
const phase = yield* _(Ref.make(0 /* Phase.Connecting */));
|
|
34
|
-
const setPhase = p => Effect.zipLeft(Ref.set(phase, p),
|
|
37
|
+
const setPhase = p => Effect.zipLeft(Ref.set(phase, p), Effect.annotateLogs(Effect.logTrace("phase transition"), "phase", p));
|
|
35
38
|
const outbound = Effect.zipLeft(Queue.take(outboundQueue), limiter.maybeWait("dfx.shard.send", Duration.minutes(1), 120));
|
|
36
39
|
const send = p => Effect.flatMap(Ref.get(phase), phase => phase === 2 /* Phase.Connected */ ? Queue.offer(outboundQueue, p) : Queue.offer(pendingQueue, p));
|
|
37
40
|
const heartbeatSend = p => Effect.flatMap(Ref.get(phase), phase => phase !== 0 /* Phase.Connecting */ ? Queue.offer(outboundQueue, p) : Effect.succeed(false));
|
|
@@ -51,13 +54,13 @@ export const make = /*#__PURE__*/Effect.gen(function* (_) {
|
|
|
51
54
|
resume_gateway_url
|
|
52
55
|
}) => socket.setUrl(resume_gateway_url)
|
|
53
56
|
});
|
|
54
|
-
const hellos = yield* _(Queue.unbounded());
|
|
55
|
-
const acks = yield* _(Queue.unbounded());
|
|
57
|
+
const hellos = yield* _(Effect.acquireRelease(Queue.unbounded(), Queue.shutdown));
|
|
58
|
+
const acks = yield* _(Effect.acquireRelease(Queue.unbounded(), Queue.shutdown));
|
|
56
59
|
// heartbeats
|
|
57
|
-
|
|
60
|
+
yield* _(Heartbeats.send(hellos, acks, latestSequence, heartbeatSend), Effect.forkScoped);
|
|
58
61
|
// identify
|
|
59
62
|
const identify = Identify.identifyOrResume({
|
|
60
|
-
token:
|
|
63
|
+
token: Secret.value(token),
|
|
61
64
|
shard,
|
|
62
65
|
intents: gateway.intents,
|
|
63
66
|
presence: gateway.presence
|
|
@@ -79,21 +82,21 @@ export const make = /*#__PURE__*/Effect.gen(function* (_) {
|
|
|
79
82
|
return Effect.unit;
|
|
80
83
|
}
|
|
81
84
|
}));
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
discard: true,
|
|
85
|
-
concurrency: "unbounded"
|
|
86
|
-
});
|
|
85
|
+
yield* _(Queue.take(sendQueue), Effect.tap(send), Effect.forever, Effect.forkScoped);
|
|
86
|
+
yield* _(socket.take, Effect.flatMap(onPayload), Effect.forever, Effect.forkScoped);
|
|
87
87
|
return {
|
|
88
88
|
id: shard,
|
|
89
|
-
send
|
|
90
|
-
run
|
|
89
|
+
send
|
|
91
90
|
};
|
|
92
|
-
})
|
|
91
|
+
}).pipe(Effect.annotateLogs({
|
|
92
|
+
package: "dfx",
|
|
93
|
+
module: "DiscordGateway/Shard",
|
|
94
|
+
shard
|
|
95
|
+
}));
|
|
93
96
|
return {
|
|
94
97
|
connect
|
|
95
98
|
};
|
|
96
99
|
});
|
|
97
|
-
export const Shard = /*#__PURE__*/Tag();
|
|
98
|
-
export const ShardLive = /*#__PURE__*/Layer.
|
|
100
|
+
export const Shard = /*#__PURE__*/Tag("dfx/DiscordGateway/Shard");
|
|
101
|
+
export const ShardLive = /*#__PURE__*/Layer.effect(Shard, make).pipe( /*#__PURE__*/Layer.provide(DiscordWSLive), /*#__PURE__*/Layer.provide(MesssagingLive), /*#__PURE__*/Layer.provide(RateLimiterLive));
|
|
99
102
|
//# sourceMappingURL=Shard.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Shard.mjs","names":["Chunk","Tag","Duration","pipe","Option","
|
|
1
|
+
{"version":3,"file":"Shard.mjs","names":["Chunk","Tag","Duration","pipe","Option","Secret","Effect","PubSub","Layer","Queue","Ref","DiscordConfig","DiscordWS","DiscordWSLive","Heartbeats","Identify","InvalidSession","Utils","Reconnect","RateLimiterLive","RateLimiter","Discord","Messaging","MesssagingLive","make","gen","_","gateway","token","limiter","dws","hub","sendQueue","connect","shard","outboundQueue","unbounded","pendingQueue","phase","setPhase","p","zipLeft","set","annotateLogs","logTrace","outbound","take","maybeWait","minutes","send","flatMap","get","offer","heartbeatSend","succeed","prioritySend","resume","zipRight","takeAll","tap","offerAll","asUnit","onConnecting","msgs","filter","msg","op","GatewayOpcode","IDENTIFY","RESUME","HEARTBEAT","socket","isReady","liftPredicate","DISPATCH","t","latestReady","updateLatestReady","latest","map","d","latestSequence","updateLatestSequence","fromNullable","s","maybeUpdateUrl","match","onNone","unit","onSome","resume_gateway_url","setUrl","hellos","acquireRelease","shutdown","acks","forkScoped","identify","identifyOrResume","value","intents","presence","onPayload","HELLO","HEARTBEAT_ACK","INVALID_SESSION","fromPayload","publish","forever","id","package","module","Shard","ShardLive","effect","provide"],"sources":["../../src/DiscordGateway/Shard.ts"],"sourcesContent":[null],"mappings":"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"}
|
|
@@ -2,7 +2,7 @@ import { Tag } from "effect/Context";
|
|
|
2
2
|
import * as Option from "effect/Option";
|
|
3
3
|
import * as Effect from "effect/Effect";
|
|
4
4
|
import * as Layer from "effect/Layer";
|
|
5
|
-
export const ShardStore = /*#__PURE__*/Tag();
|
|
5
|
+
export const ShardStore = /*#__PURE__*/Tag("dfx/DiscordGateway/ShardStore");
|
|
6
6
|
// Very basic shard id store, that does no health checks
|
|
7
7
|
const memoryStore = () => {
|
|
8
8
|
let currentId = 0;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ShardStore.mjs","names":["Tag","Option","Effect","Layer","ShardStore","memoryStore","currentId","claimId","totalCount","sync","none","id","some","allClaimed","MemoryShardStoreLive"],"sources":["../../src/DiscordGateway/ShardStore.ts"],"sourcesContent":[null],"mappings":"AAAA,SAASA,GAAG,QAAQ,gBAAgB;AACpC,OAAO,KAAKC,MAAM,MAAM,eAAe;AACvC,OAAO,KAAKC,MAAM,MAAM,eAAe;AACvC,OAAO,KAAKC,KAAK,MAAM,cAAc;
|
|
1
|
+
{"version":3,"file":"ShardStore.mjs","names":["Tag","Option","Effect","Layer","ShardStore","memoryStore","currentId","claimId","totalCount","sync","none","id","some","allClaimed","MemoryShardStoreLive"],"sources":["../../src/DiscordGateway/ShardStore.ts"],"sourcesContent":[null],"mappings":"AAAA,SAASA,GAAG,QAAQ,gBAAgB;AACpC,OAAO,KAAKC,MAAM,MAAM,eAAe;AACvC,OAAO,KAAKC,MAAM,MAAM,eAAe;AACvC,OAAO,KAAKC,KAAK,MAAM,cAAc;AAiBrC,OAAO,MAAMC,UAAU,gBAAGJ,GAAG,CAC3B,+BAA+B,CAChC;AAED;AACA,MAAMK,WAAW,GAAGA,CAAA,KAAwB;EAC1C,IAAIC,SAAS,GAAG,CAAC;EAEjB,OAAO;IACLC,OAAO,EAAEA,CAAC;MAAEC;IAAU,CAAE,KACtBN,MAAM,CAACO,IAAI,CAAC,MAAK;MACf,IAAIH,SAAS,IAAIE,UAAU,EAAE;QAC3B,OAAOP,MAAM,CAACS,IAAI,EAAE;MACtB;MAEA,MAAMC,EAAE,GAAGL,SAAS;MACpBA,SAAS,EAAE;MACX,OAAOL,MAAM,CAACW,IAAI,CAACD,EAAE,CAAC;IACxB,CAAC,CAAC;IAEJE,UAAU,EAAEL,UAAU,IAAIN,MAAM,CAACO,IAAI,CAAC,MAAMH,SAAS,IAAIE,UAAU;GACpE;AACH,CAAC;AAED,OAAO,MAAMM,oBAAoB,gBAAGX,KAAK,CAACM,IAAI,CAACL,UAAU,EAAEC,WAAW,CAAC"}
|
|
@@ -1,18 +1,16 @@
|
|
|
1
|
-
import
|
|
1
|
+
import { DiscordConfig } from "dfx/DiscordConfig";
|
|
2
|
+
import { Shard, ShardLive } from "dfx/DiscordGateway/Shard";
|
|
3
|
+
import { ShardStore } from "dfx/DiscordGateway/ShardStore";
|
|
4
|
+
import { DiscordREST, DiscordRESTLive } from "dfx/DiscordREST";
|
|
5
|
+
import { RateLimiter, RateLimiterLive } from "dfx/RateLimit";
|
|
2
6
|
import { Tag } from "effect/Context";
|
|
3
7
|
import * as Duration from "effect/Duration";
|
|
8
|
+
import * as Effect from "effect/Effect";
|
|
4
9
|
import { pipe } from "effect/Function";
|
|
5
10
|
import * as HashSet from "effect/HashSet";
|
|
6
|
-
import * as Deferred from "effect/Deferred";
|
|
7
|
-
import * as Effect from "effect/Effect";
|
|
8
11
|
import * as Layer from "effect/Layer";
|
|
9
12
|
import * as Ref from "effect/Ref";
|
|
10
13
|
import * as Schedule from "effect/Schedule";
|
|
11
|
-
import { DiscordConfig } from "dfx/DiscordConfig";
|
|
12
|
-
import { ShardLive, Shard } from "dfx/DiscordGateway/Shard";
|
|
13
|
-
import { ShardStore } from "dfx/DiscordGateway/ShardStore";
|
|
14
|
-
import { DiscordREST } from "dfx/DiscordREST";
|
|
15
|
-
import { RateLimiterLive, RateLimiter } from "dfx/RateLimit";
|
|
16
14
|
const claimRepeatPolicy = /*#__PURE__*/Schedule.spaced("3 minutes").pipe( /*#__PURE__*/Schedule.whileInput(_ => _._tag === "None"), Schedule.passthrough);
|
|
17
15
|
const make = /*#__PURE__*/Effect.gen(function* (_) {
|
|
18
16
|
const store = yield* _(ShardStore);
|
|
@@ -23,17 +21,6 @@ const make = /*#__PURE__*/Effect.gen(function* (_) {
|
|
|
23
21
|
const limiter = yield* _(RateLimiter);
|
|
24
22
|
const shard = yield* _(Shard);
|
|
25
23
|
const currentShards = yield* _(Ref.make(HashSet.empty()));
|
|
26
|
-
const takeConfig = totalCount => Effect.gen(function* (_) {
|
|
27
|
-
const currentCount = yield* _(Ref.make(0));
|
|
28
|
-
const claimId = sharderCount => pipe(store.claimId({
|
|
29
|
-
totalCount,
|
|
30
|
-
sharderCount
|
|
31
|
-
}), Effect.repeat(claimRepeatPolicy), Effect.map(_ => _.value));
|
|
32
|
-
return pipe(Ref.getAndUpdate(currentCount, _ => _ + 1), Effect.flatMap(claimId), Effect.map(id => ({
|
|
33
|
-
id,
|
|
34
|
-
totalCount
|
|
35
|
-
})));
|
|
36
|
-
});
|
|
37
24
|
const gateway = yield* _(rest.getGatewayBot(), Effect.flatMap(r => r.json), Effect.catchAll(() => Effect.succeed({
|
|
38
25
|
url: "wss://gateway.discord.gg/",
|
|
39
26
|
shards: 1,
|
|
@@ -44,31 +31,35 @@ const make = /*#__PURE__*/Effect.gen(function* (_) {
|
|
|
44
31
|
max_concurrency: 1
|
|
45
32
|
}
|
|
46
33
|
})));
|
|
47
|
-
const
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
34
|
+
const totalCount = config.shardCount ?? gateway.shards;
|
|
35
|
+
const currentCount = yield* _(Ref.make(0));
|
|
36
|
+
const claimId = sharderCount => pipe(store.claimId({
|
|
37
|
+
totalCount,
|
|
38
|
+
sharderCount
|
|
39
|
+
}), Effect.repeat(claimRepeatPolicy), Effect.map(_ => _.value));
|
|
40
|
+
const takeConfig = pipe(Ref.getAndUpdate(currentCount, _ => _ + 1), Effect.flatMap(claimId), Effect.map(id => ({
|
|
41
|
+
id,
|
|
42
|
+
totalCount
|
|
43
|
+
})));
|
|
44
|
+
const spawner = pipe(takeConfig, Effect.map(config => ({
|
|
45
|
+
...config,
|
|
46
|
+
url: gateway.url,
|
|
47
|
+
concurrency: gateway.session_start_limit.max_concurrency
|
|
48
|
+
})), Effect.tap(({
|
|
49
|
+
concurrency,
|
|
50
|
+
id
|
|
51
|
+
}) => limiter.maybeWait(`dfx.sharder.${id % concurrency}`, Duration.millis(config.identifyRateLimit[0]), config.identifyRateLimit[1])), Effect.flatMap(c => shard.connect([c.id, c.totalCount])), Effect.flatMap(shard => Ref.update(currentShards, HashSet.add(shard))), Effect.forever);
|
|
52
|
+
yield* _(Effect.replicateEffect(spawner, gateway.session_start_limit.max_concurrency, {
|
|
53
|
+
concurrency: "unbounded",
|
|
54
|
+
discard: true
|
|
55
|
+
}), Effect.scoped, Effect.catchAllCause(Effect.logError), Effect.ensuring(Ref.set(currentShards, HashSet.empty())), Effect.forever, Effect.forkScoped);
|
|
67
56
|
return {
|
|
68
|
-
shards: Ref.get(currentShards)
|
|
69
|
-
run
|
|
57
|
+
shards: Ref.get(currentShards)
|
|
70
58
|
};
|
|
71
|
-
})
|
|
72
|
-
|
|
73
|
-
|
|
59
|
+
}).pipe( /*#__PURE__*/Effect.annotateLogs({
|
|
60
|
+
package: "dfx",
|
|
61
|
+
module: "DiscordGateway/Sharder"
|
|
62
|
+
}));
|
|
63
|
+
export const Sharder = /*#__PURE__*/Tag("dfx/DiscordGateway/Sharder");
|
|
64
|
+
export const SharderLive = /*#__PURE__*/Layer.scoped(Sharder, make).pipe( /*#__PURE__*/Layer.provide(DiscordRESTLive), /*#__PURE__*/Layer.provide(RateLimiterLive), /*#__PURE__*/Layer.provide(ShardLive));
|
|
74
65
|
//# sourceMappingURL=Sharder.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Sharder.mjs","names":["
|
|
1
|
+
{"version":3,"file":"Sharder.mjs","names":["DiscordConfig","Shard","ShardLive","ShardStore","DiscordREST","DiscordRESTLive","RateLimiter","RateLimiterLive","Tag","Duration","Effect","pipe","HashSet","Layer","Ref","Schedule","claimRepeatPolicy","spaced","whileInput","_","_tag","passthrough","make","gen","store","rest","gateway","config","limiter","shard","currentShards","empty","getGatewayBot","flatMap","r","json","catchAll","succeed","url","shards","session_start_limit","total","remaining","reset_after","max_concurrency","totalCount","shardCount","currentCount","claimId","sharderCount","repeat","map","value","takeConfig","getAndUpdate","id","spawner","concurrency","tap","maybeWait","millis","identifyRateLimit","c","connect","update","add","forever","replicateEffect","discard","scoped","catchAllCause","logError","ensuring","set","forkScoped","get","annotateLogs","package","module","Sharder","SharderLive","provide"],"sources":["../../src/DiscordGateway/Sharder.ts"],"sourcesContent":[null],"mappings":"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"}
|
|
@@ -1,12 +1,11 @@
|
|
|
1
1
|
import { Tag } from "effect/Context";
|
|
2
|
-
import
|
|
3
|
-
import { pipe } from "effect/Function";
|
|
2
|
+
import { identity, pipe } from "effect/Function";
|
|
4
3
|
import * as Effect from "effect/Effect";
|
|
5
4
|
import * as Layer from "effect/Layer";
|
|
6
5
|
import * as Queue from "effect/Queue";
|
|
7
6
|
import * as Ref from "effect/Ref";
|
|
8
|
-
import { Log } from "dfx/Log";
|
|
9
7
|
import WebSocket from "isomorphic-ws";
|
|
8
|
+
import * as Schedule from "effect/Schedule";
|
|
10
9
|
export const Reconnect = /*#__PURE__*/Symbol();
|
|
11
10
|
export class WebSocketError {
|
|
12
11
|
reason;
|
|
@@ -33,9 +32,9 @@ const socket = urlRef => pipe(Ref.get(urlRef), Effect.map(_ => new WebSocket(_))
|
|
|
33
32
|
ws.removeAllListeners?.();
|
|
34
33
|
ws.close();
|
|
35
34
|
})));
|
|
36
|
-
const offer = (ws, queue
|
|
35
|
+
const offer = (ws, queue) => Effect.async(resume => {
|
|
37
36
|
ws.addEventListener("message", message => {
|
|
38
|
-
|
|
37
|
+
Queue.unsafeOffer(queue, message.data);
|
|
39
38
|
});
|
|
40
39
|
ws.addEventListener("error", cause => {
|
|
41
40
|
resume(Effect.fail(new WebSocketError("error", cause)));
|
|
@@ -57,7 +56,7 @@ const waitForOpen = (ws, timeout) => Effect.timeoutFail(Effect.suspend(() => {
|
|
|
57
56
|
onTimeout: () => new WebSocketError("open-timeout"),
|
|
58
57
|
duration: timeout
|
|
59
58
|
});
|
|
60
|
-
const send = (ws, take
|
|
59
|
+
const send = (ws, take) => pipe(take, Effect.tap(data => Effect.logTrace(data)), Effect.tap(data => {
|
|
61
60
|
if (data === Reconnect) {
|
|
62
61
|
return Effect.failSync(() => {
|
|
63
62
|
ws.close(1012, "reconnecting");
|
|
@@ -67,24 +66,35 @@ const send = (ws, take, log) => pipe(take, Effect.tap(data => log.debug("WS", "s
|
|
|
67
66
|
return Effect.sync(() => {
|
|
68
67
|
ws.send(data);
|
|
69
68
|
});
|
|
70
|
-
}), Effect.forever);
|
|
71
|
-
const
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
69
|
+
}), Effect.forever, Effect.annotateLogs("method", "send"));
|
|
70
|
+
const wsImpl = {
|
|
71
|
+
connect: ({
|
|
72
|
+
onConnecting = Effect.unit,
|
|
73
|
+
openTimeout = "3 seconds",
|
|
74
|
+
reconnectWhen,
|
|
75
|
+
takeOutbound,
|
|
76
|
+
urlRef
|
|
77
|
+
}) => Effect.gen(function* (_) {
|
|
78
|
+
const scope = yield* _(Effect.scope);
|
|
79
|
+
const queue = yield* _(Effect.acquireRelease(Queue.unbounded(), Queue.shutdown));
|
|
80
|
+
const take = Effect.annotateLogs(Effect.tap(Queue.take(queue), data => Effect.logTrace(data)), {
|
|
81
|
+
package: "dfx",
|
|
82
|
+
module: "DiscordGateway/WS",
|
|
83
|
+
method: "take"
|
|
84
|
+
});
|
|
85
|
+
const run = pipe(onConnecting, Effect.zipRight(socket(urlRef)), Effect.flatMap(ws => Effect.all([offer(ws, queue), Effect.zipRight(waitForOpen(ws, openTimeout), send(ws, takeOutbound))], {
|
|
76
86
|
concurrency: "unbounded",
|
|
77
87
|
discard: true
|
|
78
|
-
})), Effect.scoped, Effect.retryWhile(isReconnect));
|
|
88
|
+
})), Effect.scoped, Effect.retryWhile(isReconnect), reconnectWhen ? Effect.retryWhile(reconnectWhen) : identity, Effect.catchAllCause(Effect.logError), Effect.repeat(Schedule.exponential("500 millis").pipe(Schedule.union(Schedule.spaced("30 seconds")))), Effect.forkIn(scope));
|
|
89
|
+
yield* _(run);
|
|
79
90
|
return {
|
|
80
|
-
|
|
81
|
-
take: Queue.take(queue)
|
|
91
|
+
take
|
|
82
92
|
};
|
|
83
|
-
})
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
}
|
|
87
|
-
}
|
|
88
|
-
export const WS = /*#__PURE__*/Tag();
|
|
89
|
-
export const WSLive = /*#__PURE__*/Layer.
|
|
93
|
+
}).pipe(Effect.annotateLogs({
|
|
94
|
+
package: "dfx",
|
|
95
|
+
module: "DiscordGateway/WS"
|
|
96
|
+
}))
|
|
97
|
+
};
|
|
98
|
+
export const WS = /*#__PURE__*/Tag("dfx/DiscordGateway/WS");
|
|
99
|
+
export const WSLive = /*#__PURE__*/Layer.succeed(WS, wsImpl);
|
|
90
100
|
//# sourceMappingURL=WS.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"WS.mjs","names":["Tag","
|
|
1
|
+
{"version":3,"file":"WS.mjs","names":["Tag","identity","pipe","Effect","Layer","Queue","Ref","WebSocket","Schedule","Reconnect","Symbol","WebSocketError","reason","error","_tag","constructor","WebSocketCloseError","code","isReconnect","e","socket","urlRef","get","map","_","acquireRelease","ws","sync","removeAllListeners","close","offer","queue","async","resume","addEventListener","message","unsafeOffer","data","cause","fail","waitForOpen","timeout","timeoutFail","suspend","readyState","OPEN","unit","once","onTimeout","duration","send","take","tap","logTrace","failSync","forever","annotateLogs","wsImpl","connect","onConnecting","openTimeout","reconnectWhen","takeOutbound","gen","scope","unbounded","shutdown","package","module","method","run","zipRight","flatMap","all","concurrency","discard","scoped","retryWhile","catchAllCause","logError","repeat","exponential","union","spaced","forkIn","WS","WSLive","succeed"],"sources":["../../src/DiscordGateway/WS.ts"],"sourcesContent":[null],"mappings":"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"}
|
package/mjs/DiscordGateway.mjs
CHANGED
|
@@ -1,39 +1,21 @@
|
|
|
1
|
+
import { Messaging, MesssagingLive } from "dfx/DiscordGateway/Messaging";
|
|
2
|
+
import { Sharder, SharderLive } from "dfx/DiscordGateway/Sharder";
|
|
1
3
|
import { Tag } from "effect/Context";
|
|
2
4
|
import * as Effect from "effect/Effect";
|
|
3
|
-
import * as PubSub from "effect/PubSub";
|
|
4
5
|
import * as Layer from "effect/Layer";
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
import { SharedLive, Sharder } from "dfx/DiscordGateway/Sharder";
|
|
8
|
-
import * as EffectUtils from "dfx/utils/Effect";
|
|
9
|
-
import * as Schedule from "effect/Schedule";
|
|
10
|
-
const fromDispatchFactory = source => event => Stream.map(Stream.filter(source, p => p.t === event), p => p.d);
|
|
11
|
-
const handleDispatchFactory = hub => (event, handle) => EffectUtils.subscribeForEachPar(hub, _ => {
|
|
12
|
-
if (_.t === event) {
|
|
13
|
-
return handle(_.d);
|
|
14
|
-
}
|
|
15
|
-
return Effect.unit;
|
|
16
|
-
});
|
|
17
|
-
export const DiscordGateway = /*#__PURE__*/Tag();
|
|
6
|
+
export const TypeId = /*#__PURE__*/Symbol.for("dfx/DiscordGateway");
|
|
7
|
+
export const DiscordGateway = /*#__PURE__*/Tag(TypeId);
|
|
18
8
|
export const make = /*#__PURE__*/Effect.gen(function* (_) {
|
|
19
9
|
const sharder = yield* _(Sharder);
|
|
20
|
-
const
|
|
21
|
-
const sendQueue = yield* _(Queue.unbounded());
|
|
22
|
-
const send = payload => sendQueue.offer(payload);
|
|
23
|
-
const dispatch = Stream.fromPubSub(hub);
|
|
24
|
-
const fromDispatch = fromDispatchFactory(dispatch);
|
|
25
|
-
const handleDispatch = handleDispatchFactory(hub);
|
|
26
|
-
yield* _(sharder.run(hub, sendQueue), Effect.tapErrorCause(_ => Effect.logError("fatal error, restarting", _)), Effect.retry(Schedule.exponential("1 seconds").pipe(Schedule.union(Schedule.spaced("30 seconds")))), Effect.forkScoped);
|
|
10
|
+
const messaging = yield* _(Messaging);
|
|
27
11
|
return DiscordGateway.of({
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
12
|
+
[TypeId]: TypeId,
|
|
13
|
+
dispatch: messaging.dispatch,
|
|
14
|
+
fromDispatch: messaging.fromDispatch,
|
|
15
|
+
handleDispatch: messaging.handleDispatch,
|
|
16
|
+
send: messaging.send,
|
|
32
17
|
shards: sharder.shards
|
|
33
18
|
});
|
|
34
|
-
})
|
|
35
|
-
|
|
36
|
-
service: "DiscordGateway"
|
|
37
|
-
}));
|
|
38
|
-
export const DiscordGatewayLive = /*#__PURE__*/Layer.provide( /*#__PURE__*/Layer.scoped(DiscordGateway, make), SharedLive);
|
|
19
|
+
});
|
|
20
|
+
export const DiscordGatewayLive = /*#__PURE__*/Layer.effect(DiscordGateway, make).pipe( /*#__PURE__*/Layer.provide(MesssagingLive), /*#__PURE__*/Layer.provide(SharderLive));
|
|
39
21
|
//# sourceMappingURL=DiscordGateway.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DiscordGateway.mjs","names":["
|
|
1
|
+
{"version":3,"file":"DiscordGateway.mjs","names":["Messaging","MesssagingLive","Sharder","SharderLive","Tag","Effect","Layer","TypeId","Symbol","for","DiscordGateway","make","gen","_","sharder","messaging","of","dispatch","fromDispatch","handleDispatch","send","shards","DiscordGatewayLive","effect","pipe","provide"],"sources":["../src/DiscordGateway.ts"],"sourcesContent":[null],"mappings":"AAAA,SAASA,SAAS,EAAEC,cAAc,QAAQ,8BAA8B;AAExE,SAASC,OAAO,EAAEC,WAAW,QAAQ,4BAA4B;AAEjE,SAASC,GAAG,QAAQ,gBAAgB;AACpC,OAAO,KAAKC,MAAM,MAAM,eAAe;AAEvC,OAAO,KAAKC,KAAK,MAAM,cAAc;AAGrC,OAAO,MAAMC,MAAM,gBAAGC,MAAM,CAACC,GAAG,CAAC,oBAAoB,CAAC;AAwBtD,OAAO,MAAMC,cAAc,gBAAGN,GAAG,CAAiBG,MAAM,CAAC;AAEzD,OAAO,MAAMI,IAAI,gBAAGN,MAAM,CAACO,GAAG,CAAC,WAAWC,CAAC;EACzC,MAAMC,OAAO,GAAG,OAAOD,CAAC,CAACX,OAAO,CAAC;EACjC,MAAMa,SAAS,GAAG,OAAOF,CAAC,CAACb,SAAS,CAAC;EAErC,OAAOU,cAAc,CAACM,EAAE,CAAC;IACvB,CAACT,MAAM,GAAGA,MAAM;IAChBU,QAAQ,EAAEF,SAAS,CAACE,QAAQ;IAC5BC,YAAY,EAAEH,SAAS,CAACG,YAAY;IACpCC,cAAc,EAAEJ,SAAS,CAACI,cAAc;IACxCC,IAAI,EAAEL,SAAS,CAACK,IAAI;IACpBC,MAAM,EAAEP,OAAO,CAACO;GACjB,CAAC;AACJ,CAAC,CAAC;AAEF,OAAO,MAAMC,kBAAkB,gBAAGhB,KAAK,CAACiB,MAAM,CAACb,cAAc,EAAEC,IAAI,CAAC,CAACa,IAAI,eACvElB,KAAK,CAACmB,OAAO,CAACxB,cAAc,CAAC,eAC7BK,KAAK,CAACmB,OAAO,CAACtB,WAAW,CAAC,CAC3B"}
|
package/mjs/DiscordREST.mjs
CHANGED
|
@@ -4,14 +4,13 @@ import { millis } from "effect/Duration";
|
|
|
4
4
|
import { pipe } from "effect/Function";
|
|
5
5
|
import * as HashSet from "effect/HashSet";
|
|
6
6
|
import * as Option from "effect/Option";
|
|
7
|
-
import * as
|
|
7
|
+
import * as Secret from "effect/Secret";
|
|
8
8
|
import * as Effect from "effect/Effect";
|
|
9
9
|
import * as Layer from "effect/Layer";
|
|
10
10
|
import * as Ref from "effect/Ref";
|
|
11
11
|
import * as Http from "@effect/platform/HttpClient";
|
|
12
12
|
import { DiscordConfig } from "dfx/DiscordConfig";
|
|
13
13
|
import { rateLimitFromHeaders, retryAfter, routeFromConfig } from "dfx/DiscordREST/utils";
|
|
14
|
-
import { Log } from "dfx/Log";
|
|
15
14
|
import { RateLimiterLive, RateLimiter, RateLimitStore } from "dfx/RateLimit";
|
|
16
15
|
import * as Discord from "dfx/types";
|
|
17
16
|
import { LIB_VERSION } from "dfx/version";
|
|
@@ -30,7 +29,6 @@ const make = /*#__PURE__*/Effect.gen(function* (_) {
|
|
|
30
29
|
token
|
|
31
30
|
} = yield* _(DiscordConfig);
|
|
32
31
|
const http = yield* _(Http.client.Client);
|
|
33
|
-
const log = yield* _(Log);
|
|
34
32
|
const store = yield* _(RateLimitStore);
|
|
35
33
|
const {
|
|
36
34
|
maybeWait
|
|
@@ -39,7 +37,7 @@ const make = /*#__PURE__*/Effect.gen(function* (_) {
|
|
|
39
37
|
// Invalid route handling (40x)
|
|
40
38
|
const badRoutesRef = yield* _(Ref.make(HashSet.empty()));
|
|
41
39
|
const tenMinutes = Duration.toMillis(Duration.minutes(10));
|
|
42
|
-
const addBadRoute = route =>
|
|
40
|
+
const addBadRoute = route => Effect.logDebug("bad route").pipe(Effect.zipRight(Ref.update(badRoutesRef, HashSet.add(route))), Effect.zipRight(store.incrementCounter("dfx.rest.invalid", tenMinutes, 10000)), Effect.annotateLogs("route", route));
|
|
43
41
|
const isBadRoute = route => Effect.map(Ref.get(badRoutesRef), HashSet.has(route));
|
|
44
42
|
const removeBadRoute = route => Ref.update(badRoutesRef, HashSet.remove(route));
|
|
45
43
|
const invalidRateLimit = route => isBadRoute(route).pipe(Effect.tap(invalid => invalid ? maybeWait("dfx.rest.invalid", Duration.minutes(10), 10000) : Effect.unit), Effect.asUnit);
|
|
@@ -75,7 +73,7 @@ const make = /*#__PURE__*/Effect.gen(function* (_) {
|
|
|
75
73
|
});
|
|
76
74
|
}), Effect.ignore);
|
|
77
75
|
const httpExecutor = pipe(Http.client.filterStatusOk(http), Http.client.mapRequest(req => pipe(Http.request.prependUrl(req, rest.baseUrl), Http.request.setHeaders({
|
|
78
|
-
Authorization: `Bot ${
|
|
76
|
+
Authorization: `Bot ${Secret.value(token)}`,
|
|
79
77
|
"User-Agent": `DiscordBot (https://github.com/tim-smart/dfx, ${LIB_VERSION})`
|
|
80
78
|
}))), Http.client.catchAll(error => error.reason === "StatusCode" ? error.response.json.pipe(Effect.mapError(_ => new DiscordRESTError(_)), Effect.flatMap(body => Effect.fail(new DiscordRESTError(error, body)))) : Effect.fail(new DiscordRESTError(error))));
|
|
81
79
|
const executor = request => requestRateLimit(request.url, request).pipe(Effect.zipLeft(globalRateLimit), Effect.zipRight(httpExecutor(request)), Effect.tap(response => updateBuckets(request, response)), Effect.catchTag("DiscordRESTError", e => {
|
|
@@ -85,14 +83,17 @@ const make = /*#__PURE__*/Effect.gen(function* (_) {
|
|
|
85
83
|
const response = e.error.response;
|
|
86
84
|
switch (response.status) {
|
|
87
85
|
case 403:
|
|
88
|
-
return Effect.zipRight(Effect.all([
|
|
86
|
+
return Effect.zipRight(Effect.all([Effect.annotateLogs(Effect.logDebug("403"), "url", request.url), addBadRoute(routeFromConfig(request.url, request.method)), updateBuckets(request, response)], {
|
|
89
87
|
concurrency: "unbounded",
|
|
90
88
|
discard: true
|
|
91
89
|
}), Effect.fail(e));
|
|
92
90
|
case 429:
|
|
93
|
-
return
|
|
91
|
+
return Effect.annotateLogs(Effect.logDebug("429"), "url", request.url).pipe(Effect.zipRight(addBadRoute(routeFromConfig(request.url, request.method))), Effect.zipRight(updateBuckets(request, response)), Effect.zipRight(Effect.sleep(Option.getOrElse(retryAfter(response.headers), () => Duration.seconds(5)))), Effect.zipRight(executor(request)));
|
|
94
92
|
}
|
|
95
93
|
return Effect.fail(e);
|
|
94
|
+
}), Effect.annotateLogs({
|
|
95
|
+
package: "dfx",
|
|
96
|
+
module: "DiscordREST"
|
|
96
97
|
}));
|
|
97
98
|
const routes = Discord.createRoutes(({
|
|
98
99
|
method,
|
|
@@ -118,6 +119,6 @@ const make = /*#__PURE__*/Effect.gen(function* (_) {
|
|
|
118
119
|
executor
|
|
119
120
|
};
|
|
120
121
|
});
|
|
121
|
-
export const DiscordREST = /*#__PURE__*/Tag();
|
|
122
|
+
export const DiscordREST = /*#__PURE__*/Tag("dfx/DiscordREST");
|
|
122
123
|
export const DiscordRESTLive = /*#__PURE__*/Layer.effect(DiscordREST, make).pipe( /*#__PURE__*/Layer.provide(RateLimiterLive), /*#__PURE__*/Layer.provide(Http.client.layer));
|
|
123
124
|
//# sourceMappingURL=DiscordREST.mjs.map
|