dfx 0.95.1 → 0.95.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/DiscordGateway/Shard/StateStore.d.ts +25 -0
- package/DiscordGateway/Shard/StateStore.d.ts.map +1 -0
- package/DiscordGateway/Shard/StateStore.js +33 -0
- package/DiscordGateway/Shard/StateStore.js.map +1 -0
- package/DiscordGateway/Shard/heartbeats.d.ts +2 -2
- package/DiscordGateway/Shard/heartbeats.d.ts.map +1 -1
- package/DiscordGateway/Shard/heartbeats.js +4 -4
- package/DiscordGateway/Shard/heartbeats.js.map +1 -1
- package/DiscordGateway/Shard/identify.d.ts +2 -6
- package/DiscordGateway/Shard/identify.d.ts.map +1 -1
- package/DiscordGateway/Shard/identify.js +5 -12
- package/DiscordGateway/Shard/identify.js.map +1 -1
- package/DiscordGateway/Shard/utils.d.ts +1 -8
- package/DiscordGateway/Shard/utils.d.ts.map +1 -1
- package/DiscordGateway/Shard/utils.js +1 -10
- package/DiscordGateway/Shard/utils.js.map +1 -1
- package/DiscordGateway/Shard.d.ts +5 -4
- package/DiscordGateway/Shard.d.ts.map +1 -1
- package/DiscordGateway/Shard.js +41 -26
- package/DiscordGateway/Shard.js.map +1 -1
- package/DiscordGateway/Sharder.d.ts +1 -1
- package/DiscordGateway/Sharder.d.ts.map +1 -1
- package/DiscordGateway.d.ts +1 -1
- package/DiscordGateway.d.ts.map +1 -1
- package/gateway.d.ts +2 -2
- package/gateway.d.ts.map +1 -1
- package/gateway.js +2 -1
- package/gateway.js.map +1 -1
- package/mjs/DiscordGateway/Shard/StateStore.mjs +25 -0
- package/mjs/DiscordGateway/Shard/StateStore.mjs.map +1 -0
- package/mjs/DiscordGateway/Shard/heartbeats.mjs +4 -4
- package/mjs/DiscordGateway/Shard/heartbeats.mjs.map +1 -1
- package/mjs/DiscordGateway/Shard/identify.mjs +5 -12
- package/mjs/DiscordGateway/Shard/identify.mjs.map +1 -1
- package/mjs/DiscordGateway/Shard/utils.mjs +0 -8
- package/mjs/DiscordGateway/Shard/utils.mjs.map +1 -1
- package/mjs/DiscordGateway/Shard.mjs +41 -26
- package/mjs/DiscordGateway/Shard.mjs.map +1 -1
- package/mjs/gateway.mjs +2 -1
- package/mjs/gateway.mjs.map +1 -1
- package/mjs/version.mjs +1 -1
- package/package.json +2 -2
- package/src/DiscordGateway/Shard/StateStore.ts +46 -0
- package/src/DiscordGateway/Shard/heartbeats.ts +8 -7
- package/src/DiscordGateway/Shard/identify.ts +10 -18
- package/src/DiscordGateway/Shard/utils.ts +1 -28
- package/src/DiscordGateway/Shard.ts +53 -50
- package/src/gateway.ts +2 -0
- package/src/version.ts +1 -1
- package/version.d.ts +1 -1
- package/version.js +1 -1
- package/src/DiscordGateway/Shard/invalidSession.ts +0 -11
package/gateway.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gateway.js","names":["CachePrelude","_interopRequireWildcard","require","exports","_DiscordGateway","_DiscordWS","DiscordWS","Shard","SendEvent","_ShardStore","ShardStore","_DiscordREST","_gateway","_RateLimit","Layer","_getRequireWildcardCache","e","WeakMap","r","t","__esModule","default","has","get","n","__proto__","a","Object","defineProperty","getOwnPropertyDescriptor","u","hasOwnProperty","call","i","set","DiscordLive","mergeAll","RateLimiterLive","DiscordGatewayLive","pipe","provideMerge","DiscordRESTLive","provide","JsonDiscordWSCodecLive","MemoryRateLimitStoreLive","MemoryShardStoreLive","DiscordIxLive","InteractionsRegistryLive"],"sources":["./src/gateway.ts"],"sourcesContent":[null],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,IAAAA,YAAA,gBAAAC,uBAAA,eAAAC,OAAA;AAAiDC,OAAA,CAAAH,YAAA,GAAAA,YAAA;AACjD,IAAAI,eAAA,gBAAAF,OAAA;AACA,IAAAG,UAAA,gBAAAJ,uBAAA,eAAAC,OAAA;AAAyD,IAAAI,SAAA,GAAAD,UAAA;AAAAF,OAAA,CAAAG,SAAA,GAAAD,UAAA;AAEzD,IAAAE,KAAA,gBAAAN,uBAAA,eAAAC,OAAA;AAAiDC,OAAA,CAAAI,KAAA,GAAAA,KAAA;AACjD,IAAAC,SAAA,
|
|
1
|
+
{"version":3,"file":"gateway.js","names":["CachePrelude","_interopRequireWildcard","require","exports","_DiscordGateway","_DiscordWS","DiscordWS","Shard","_StateStore","SendEvent","_ShardStore","ShardStore","_DiscordREST","_gateway","_RateLimit","Layer","_getRequireWildcardCache","e","WeakMap","r","t","__esModule","default","has","get","n","__proto__","a","Object","defineProperty","getOwnPropertyDescriptor","u","hasOwnProperty","call","i","set","DiscordLive","mergeAll","RateLimiterLive","DiscordGatewayLive","pipe","provideMerge","DiscordRESTLive","provide","JsonDiscordWSCodecLive","MemoryRateLimitStoreLive","MemoryShardStoreLive","MemoryShardStateStoreLive","DiscordIxLive","InteractionsRegistryLive"],"sources":["./src/gateway.ts"],"sourcesContent":[null],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,IAAAA,YAAA,gBAAAC,uBAAA,eAAAC,OAAA;AAAiDC,OAAA,CAAAH,YAAA,GAAAA,YAAA;AACjD,IAAAI,eAAA,gBAAAF,OAAA;AACA,IAAAG,UAAA,gBAAAJ,uBAAA,eAAAC,OAAA;AAAyD,IAAAI,SAAA,GAAAD,UAAA;AAAAF,OAAA,CAAAG,SAAA,GAAAD,UAAA;AAEzD,IAAAE,KAAA,gBAAAN,uBAAA,eAAAC,OAAA;AAAiDC,OAAA,CAAAI,KAAA,GAAAA,KAAA;AACjD,IAAAC,WAAA,gBAAAN,OAAA;AACA,IAAAO,SAAA,gBAAAR,uBAAA,eAAAC,OAAA;AAAgEC,OAAA,CAAAM,SAAA,GAAAA,SAAA;AAChE,IAAAC,WAAA,gBAAAT,uBAAA,eAAAC,OAAA;AAA2D,IAAAS,UAAA,GAAAD,WAAA;AAAAP,OAAA,CAAAQ,UAAA,GAAAD,WAAA;AAE3D,IAAAE,YAAA,gBAAAV,OAAA;AACA,IAAAW,QAAA,gBAAAX,OAAA;AACA,IAAAY,UAAA,gBAAAZ,OAAA;AACA,IAAAa,KAAA,gBAAAd,uBAAA,eAAAC,OAAA;AAAqC,SAAAc,yBAAAC,CAAA,6BAAAC,OAAA,mBAAAC,CAAA,OAAAD,OAAA,IAAAE,CAAA,OAAAF,OAAA,YAAAF,wBAAA,YAAAA,CAAAC,CAAA,WAAAA,CAAA,GAAAG,CAAA,GAAAD,CAAA,KAAAF,CAAA;AAAA,SAAAhB,wBAAAgB,CAAA,EAAAE,CAAA,SAAAA,CAAA,IAAAF,CAAA,IAAAA,CAAA,CAAAI,UAAA,SAAAJ,CAAA,eAAAA,CAAA,uBAAAA,CAAA,yBAAAA,CAAA,WAAAK,OAAA,EAAAL,CAAA,QAAAG,CAAA,GAAAJ,wBAAA,CAAAG,CAAA,OAAAC,CAAA,IAAAA,CAAA,CAAAG,GAAA,CAAAN,CAAA,UAAAG,CAAA,CAAAI,GAAA,CAAAP,CAAA,OAAAQ,CAAA,KAAAC,SAAA,UAAAC,CAAA,GAAAC,MAAA,CAAAC,cAAA,IAAAD,MAAA,CAAAE,wBAAA,WAAAC,CAAA,IAAAd,CAAA,oBAAAc,CAAA,OAAAC,cAAA,CAAAC,IAAA,CAAAhB,CAAA,EAAAc,CAAA,SAAAG,CAAA,GAAAP,CAAA,GAAAC,MAAA,CAAAE,wBAAA,CAAAb,CAAA,EAAAc,CAAA,UAAAG,CAAA,KAAAA,CAAA,CAAAV,GAAA,IAAAU,CAAA,CAAAC,GAAA,IAAAP,MAAA,CAAAC,cAAA,CAAAJ,CAAA,EAAAM,CAAA,EAAAG,CAAA,IAAAT,CAAA,CAAAM,CAAA,IAAAd,CAAA,CAAAc,CAAA,YAAAN,CAAA,CAAAH,OAAA,GAAAL,CAAA,EAAAG,CAAA,IAAAA,CAAA,CAAAe,GAAA,CAAAlB,CAAA,EAAAQ,CAAA,GAAAA,CAAA;AAc9B,MAAMW,WAAW,GAAAjC,OAAA,CAAAiC,WAAA,gBAAGrB,KAAK,CAACsB,QAAQ,CACvCC,0BAAe,EACfC,kCAAkB,CACnB,CAACC,IAAI,eACJzB,KAAK,CAAC0B,YAAY,CAACC,4BAAe,CAAC,eACnC3B,KAAK,CAAC4B,OAAO,CAACC,iCAAsB,CAAC,eACrC7B,KAAK,CAAC4B,OAAO,CAACE,mCAAwB,CAAC,eACvC9B,KAAK,CAAC4B,OAAO,CAACG,gCAAoB,CAAC,eACnC/B,KAAK,CAAC4B,OAAO,CAACI,qCAAyB,CAAC,CACzC;AAEM,MAAMC,aAAa,GAAA7C,OAAA,CAAA6C,aAAA,gBAAGC,iCAAwB,CAACT,IAAI,eACxDzB,KAAK,CAAC0B,YAAY,CAACL,WAAW,CAAC,CAChC","ignoreList":[]}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import * as Effect from "effect/Effect";
|
|
2
|
+
import * as Option from "effect/Option";
|
|
3
|
+
import * as Context from "effect/Context";
|
|
4
|
+
import * as Layer from "effect/Layer";
|
|
5
|
+
export const ShardStateStore = /*#__PURE__*/Context.GenericTag("dfx/Shard/StateStore");
|
|
6
|
+
export const MemoryShardStateStoreLive = /*#__PURE__*/Layer.sync(ShardStateStore, () => {
|
|
7
|
+
const store = new Map();
|
|
8
|
+
return ShardStateStore.of({
|
|
9
|
+
forShard: ([id, count]) => {
|
|
10
|
+
const key = `${id}-${count}`;
|
|
11
|
+
return {
|
|
12
|
+
get: Effect.sync(() => Option.fromNullable(store.get(key))),
|
|
13
|
+
set(state) {
|
|
14
|
+
return Effect.sync(() => {
|
|
15
|
+
store.set(key, state);
|
|
16
|
+
});
|
|
17
|
+
},
|
|
18
|
+
clear: Effect.sync(() => {
|
|
19
|
+
store.delete(key);
|
|
20
|
+
})
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
});
|
|
24
|
+
});
|
|
25
|
+
//# sourceMappingURL=StateStore.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"StateStore.mjs","names":["Effect","Option","Context","Layer","ShardStateStore","GenericTag","MemoryShardStateStoreLive","sync","store","Map","of","forShard","id","count","key","get","fromNullable","set","state","clear","delete"],"sources":["../../../src/DiscordGateway/Shard/StateStore.ts"],"sourcesContent":[null],"mappings":"AAAA,OAAO,KAAKA,MAAM,MAAM,eAAe;AACvC,OAAO,KAAKC,MAAM,MAAM,eAAe;AACvC,OAAO,KAAKC,OAAO,MAAM,gBAAgB;AACzC,OAAO,KAAKC,KAAK,MAAM,cAAc;AAkBrC,OAAO,MAAMC,eAAe,gBAAGF,OAAO,CAACG,UAAU,CAG/C,sBAAsB,CAAC;AAEzB,OAAO,MAAMC,yBAAyB,gBAAGH,KAAK,CAACI,IAAI,CAACH,eAAe,EAAE,MAAK;EACxE,MAAMI,KAAK,GAAG,IAAIC,GAAG,EAAsB;EAE3C,OAAOL,eAAe,CAACM,EAAE,CAAC;IACxBC,QAAQ,EAAEA,CAAC,CAACC,EAAE,EAAEC,KAAK,CAAC,KAAI;MACxB,MAAMC,GAAG,GAAG,GAAGF,EAAE,IAAIC,KAAK,EAAE;MAC5B,OAAO;QACLE,GAAG,EAAEf,MAAM,CAACO,IAAI,CAAC,MAAMN,MAAM,CAACe,YAAY,CAACR,KAAK,CAACO,GAAG,CAACD,GAAG,CAAC,CAAC,CAAC;QAC3DG,GAAGA,CAACC,KAAK;UACP,OAAOlB,MAAM,CAACO,IAAI,CAAC,MAAK;YACtBC,KAAK,CAACS,GAAG,CAACH,GAAG,EAAEI,KAAK,CAAC;UACvB,CAAC,CAAC;QACJ,CAAC;QACDC,KAAK,EAAEnB,MAAM,CAACO,IAAI,CAAC,MAAK;UACtBC,KAAK,CAACY,MAAM,CAACN,GAAG,CAAC;QACnB,CAAC;OACF;IACH;GACD,CAAC;AACJ,CAAC,CAAC","ignoreList":[]}
|
|
@@ -7,10 +7,10 @@ import * as Schedule from "effect/Schedule";
|
|
|
7
7
|
import * as DiscordWS from "dfx/DiscordGateway/DiscordWS";
|
|
8
8
|
import * as SendEvents from "dfx/DiscordGateway/Shard/sendEvents";
|
|
9
9
|
import * as EffectU from "dfx/utils/Effect";
|
|
10
|
-
const payload =
|
|
11
|
-
const payloadOrReconnect = (ref,
|
|
12
|
-
export const send = (hellos, acks,
|
|
13
|
-
const heartbeats = EffectU.foreverSwitch(Effect.zipLeft(Queue.take(hellos), Ref.set(ackedRef, true)), p => payloadOrReconnect(ackedRef,
|
|
10
|
+
const payload = state => Effect.map(state, state => SendEvents.heartbeat(Option.getOrNull(Option.map(state, s => s.sequence))));
|
|
11
|
+
const payloadOrReconnect = (ref, state) => Effect.flatMap(Ref.get(ref), acked => acked ? payload(state) : Effect.succeed(DiscordWS.Reconnect));
|
|
12
|
+
export const send = (hellos, acks, state, send) => Effect.flatMap(Ref.make(true), ackedRef => {
|
|
13
|
+
const heartbeats = EffectU.foreverSwitch(Effect.zipLeft(Queue.take(hellos), Ref.set(ackedRef, true)), p => payloadOrReconnect(ackedRef, state).pipe(Effect.zipLeft(Ref.set(ackedRef, false)), Effect.tap(send), Effect.schedule(Schedule.andThen(Schedule.duration(Duration.millis(p.d.heartbeat_interval * Math.random())), Schedule.spaced(Duration.millis(p.d.heartbeat_interval))))));
|
|
14
14
|
const run = Queue.take(acks).pipe(Effect.zipLeft(Ref.set(ackedRef, true)), Effect.forever);
|
|
15
15
|
return Effect.all([run, heartbeats], {
|
|
16
16
|
concurrency: "unbounded",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"heartbeats.mjs","names":["Duration","Option","Effect","Queue","Ref","Schedule","DiscordWS","SendEvents","EffectU","payload","
|
|
1
|
+
{"version":3,"file":"heartbeats.mjs","names":["Duration","Option","Effect","Queue","Ref","Schedule","DiscordWS","SendEvents","EffectU","payload","state","map","heartbeat","getOrNull","s","sequence","payloadOrReconnect","ref","flatMap","get","acked","succeed","Reconnect","send","hellos","acks","make","ackedRef","heartbeats","foreverSwitch","zipLeft","take","set","p","pipe","tap","schedule","andThen","duration","millis","d","heartbeat_interval","Math","random","spaced","run","forever","all","concurrency","discard"],"sources":["../../../src/DiscordGateway/Shard/heartbeats.ts"],"sourcesContent":[null],"mappings":"AAAA,OAAO,KAAKA,QAAQ,MAAM,iBAAiB;AAC3C,OAAO,KAAKC,MAAM,MAAM,eAAe;AACvC,OAAO,KAAKC,MAAM,MAAM,eAAe;AACvC,OAAO,KAAKC,KAAK,MAAM,cAAc;AACrC,OAAO,KAAKC,GAAG,MAAM,YAAY;AACjC,OAAO,KAAKC,QAAQ,MAAM,iBAAiB;AAC3C,OAAO,KAAKC,SAAS,MAAM,8BAA8B;AACzD,OAAO,KAAKC,UAAU,MAAM,qCAAqC;AAEjE,OAAO,KAAKC,OAAO,MAAM,kBAAkB;AAG3C,MAAMC,OAAO,GAAIC,KAA+C,IAC9DR,MAAM,CAACS,GAAG,CAACD,KAAK,EAAEA,KAAK,IACrBH,UAAU,CAACK,SAAS,CAACX,MAAM,CAACY,SAAS,CAACZ,MAAM,CAACU,GAAG,CAACD,KAAK,EAAEI,CAAC,IAAIA,CAAC,CAACC,QAAQ,CAAC,CAAC,CAAC,CAC3E;AAEH,MAAMC,kBAAkB,GAAGA,CACzBC,GAAqB,EACrBP,KAA+C,KAE/CR,MAAM,CAACgB,OAAO,CACZd,GAAG,CAACe,GAAG,CAACF,GAAG,CAAC,EACXG,KAAK,IACJA,KAAK,GAAGX,OAAO,CAACC,KAAK,CAAC,GAAGR,MAAM,CAACmB,OAAO,CAACf,SAAS,CAACgB,SAAS,CAAC,CAC/D;AAEH,OAAO,MAAMC,IAAI,GAAGA,CAClBC,MAA6C,EAC7CC,IAA2C,EAC3Cf,KAA+C,EAC/Ca,IAAsD,KAEtDrB,MAAM,CAACgB,OAAO,CAACd,GAAG,CAACsB,IAAI,CAAC,IAAI,CAAC,EAAEC,QAAQ,IAAG;EACxC,MAAMC,UAAU,GAAGpB,OAAO,CAACqB,aAAa,CACtC3B,MAAM,CAAC4B,OAAO,CAAC3B,KAAK,CAAC4B,IAAI,CAACP,MAAM,CAAC,EAAEpB,GAAG,CAAC4B,GAAG,CAACL,QAAQ,EAAE,IAAI,CAAC,CAAC,EAC3DM,CAAC,IACCjB,kBAAkB,CAACW,QAAQ,EAAEjB,KAAK,CAAC,CAACwB,IAAI,CACtChC,MAAM,CAAC4B,OAAO,CAAC1B,GAAG,CAAC4B,GAAG,CAACL,QAAQ,EAAE,KAAK,CAAC,CAAC,EACxCzB,MAAM,CAACiC,GAAG,CAACZ,IAAI,CAAC,EAChBrB,MAAM,CAACkC,QAAQ,CACb/B,QAAQ,CAACgC,OAAO,CACdhC,QAAQ,CAACiC,QAAQ,CACftC,QAAQ,CAACuC,MAAM,CAACN,CAAC,CAACO,CAAE,CAACC,kBAAkB,GAAGC,IAAI,CAACC,MAAM,EAAE,CAAC,CACzD,EACDtC,QAAQ,CAACuC,MAAM,CAAC5C,QAAQ,CAACuC,MAAM,CAACN,CAAC,CAACO,CAAE,CAACC,kBAAkB,CAAC,CAAC,CAC1D,CACF,CACF,CACJ;EAED,MAAMI,GAAG,GAAG1C,KAAK,CAAC4B,IAAI,CAACN,IAAI,CAAC,CAACS,IAAI,CAC/BhC,MAAM,CAAC4B,OAAO,CAAC1B,GAAG,CAAC4B,GAAG,CAACL,QAAQ,EAAE,IAAI,CAAC,CAAC,EACvCzB,MAAM,CAAC4C,OAAO,CACf;EAED,OAAO5C,MAAM,CAAC6C,GAAG,CAAC,CAACF,GAAG,EAAEjB,UAAU,CAAC,EAAE;IACnCoB,WAAW,EAAE,WAAW;IACxBC,OAAO,EAAE;GACV,CAAC;AACJ,CAAC,CAAC","ignoreList":[]}
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import * as Option from "effect/Option";
|
|
2
2
|
import * as Effect from "effect/Effect";
|
|
3
|
-
import * as Ref from "effect/Ref";
|
|
4
3
|
import * as SendEvents from "dfx/DiscordGateway/Shard/sendEvents";
|
|
5
4
|
import * as OS from "os";
|
|
6
5
|
const identify = ({
|
|
@@ -19,19 +18,13 @@ const identify = ({
|
|
|
19
18
|
shard,
|
|
20
19
|
presence
|
|
21
20
|
});
|
|
22
|
-
const resume = (token,
|
|
21
|
+
const resume = (token, session_id, seq) => SendEvents.resume({
|
|
23
22
|
token,
|
|
24
|
-
session_id
|
|
25
|
-
seq
|
|
23
|
+
session_id,
|
|
24
|
+
seq: seq
|
|
26
25
|
});
|
|
27
|
-
export const identifyOrResume = (opts,
|
|
28
|
-
readyEvent,
|
|
29
|
-
seqNumber
|
|
30
|
-
}), {
|
|
26
|
+
export const identifyOrResume = (opts, state) => Effect.map(state, Option.match({
|
|
31
27
|
onNone: () => identify(opts),
|
|
32
|
-
onSome: (
|
|
33
|
-
readyEvent,
|
|
34
|
-
seqNumber
|
|
35
|
-
}) => resume(opts.token, readyEvent, seqNumber)
|
|
28
|
+
onSome: state => resume(opts.token, state.sessionId, state.sequence)
|
|
36
29
|
}));
|
|
37
30
|
//# sourceMappingURL=identify.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"identify.mjs","names":["Option","Effect","
|
|
1
|
+
{"version":3,"file":"identify.mjs","names":["Option","Effect","SendEvents","OS","identify","intents","presence","shard","token","properties","os","platform","browser","device","resume","session_id","seq","identifyOrResume","opts","state","map","match","onNone","onSome","sessionId","sequence"],"sources":["../../../src/DiscordGateway/Shard/identify.ts"],"sourcesContent":[null],"mappings":"AAAA,OAAO,KAAKA,MAAM,MAAM,eAAe;AACvC,OAAO,KAAKC,MAAM,MAAM,eAAe;AACvC,OAAO,KAAKC,UAAU,MAAM,qCAAqC;AAEjE,OAAO,KAAKC,EAAE,MAAM,IAAI;AAUxB,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,UAAkB,EAAEC,GAAkB,KACnEd,UAAU,CAACY,MAAM,CAAC;EAChBN,KAAK;EACLO,UAAU;EACVC,GAAG,EAAEA;CACN,CAAC;AAEJ,OAAO,MAAMC,gBAAgB,GAAGA,CAC9BC,IAAa,EACbC,KAA+C,KAK/ClB,MAAM,CAACmB,GAAG,CACRD,KAAK,EACLnB,MAAM,CAACqB,KAAK,CAAC;EACXC,MAAM,EAAEA,CAAA,KAAMlB,QAAQ,CAACc,IAAI,CAAC;EAC5BK,MAAM,EAAEJ,KAAK,IAAIL,MAAM,CAACI,IAAI,CAACV,KAAK,EAAEW,KAAK,CAACK,SAAS,EAAEL,KAAK,CAACM,QAAQ;CACpE,CAAC,CACH","ignoreList":[]}
|
|
@@ -1,11 +1,3 @@
|
|
|
1
|
-
import * as Option from "effect/Option";
|
|
2
|
-
import * as Effect from "effect/Effect";
|
|
3
|
-
import * as Ref from "effect/Ref";
|
|
4
1
|
import * as Stream from "effect/Stream";
|
|
5
2
|
export const opCode = source => code => source.pipe(Stream.filter(p => p.op === code));
|
|
6
|
-
const maybeUpdateRef = (f, ref) => _ => Option.match(f(_), {
|
|
7
|
-
onNone: () => Effect.void,
|
|
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
3
|
//# sourceMappingURL=utils.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.mjs","names":["
|
|
1
|
+
{"version":3,"file":"utils.mjs","names":["Stream","opCode","source","code","pipe","filter","p","op"],"sources":["../../../src/DiscordGateway/Shard/utils.ts"],"sourcesContent":[null],"mappings":"AACA,OAAO,KAAKA,MAAM,MAAM,eAAe;AAEvC,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","ignoreList":[]}
|
|
@@ -1,23 +1,22 @@
|
|
|
1
|
+
import { DiscordConfig } from "dfx/DiscordConfig";
|
|
2
|
+
import { DiscordWS, DiscordWSLive, Reconnect } from "dfx/DiscordGateway/DiscordWS";
|
|
3
|
+
import { Messaging, MesssagingLive } from "dfx/DiscordGateway/Messaging";
|
|
4
|
+
import { ShardStateStore } from "dfx/DiscordGateway/Shard/StateStore";
|
|
5
|
+
import * as Heartbeats from "dfx/DiscordGateway/Shard/heartbeats";
|
|
6
|
+
import * as Identify from "dfx/DiscordGateway/Shard/identify";
|
|
7
|
+
import { RateLimiter, RateLimiterLive } from "dfx/RateLimit";
|
|
8
|
+
import * as Discord from "dfx/types";
|
|
1
9
|
import * as Chunk from "effect/Chunk";
|
|
2
10
|
import { GenericTag } from "effect/Context";
|
|
3
11
|
import * as Duration from "effect/Duration";
|
|
12
|
+
import * as Effect from "effect/Effect";
|
|
4
13
|
import { pipe } from "effect/Function";
|
|
14
|
+
import * as Layer from "effect/Layer";
|
|
5
15
|
import * as Option from "effect/Option";
|
|
6
|
-
import * as Secret from "effect/Secret";
|
|
7
|
-
import * as Effect from "effect/Effect";
|
|
8
16
|
import * as PubSub from "effect/PubSub";
|
|
9
|
-
import * as Layer from "effect/Layer";
|
|
10
17
|
import * as Queue from "effect/Queue";
|
|
11
18
|
import * as Ref from "effect/Ref";
|
|
12
|
-
import
|
|
13
|
-
import { DiscordWS, DiscordWSLive, Reconnect } from "dfx/DiscordGateway/DiscordWS";
|
|
14
|
-
import * as Heartbeats from "dfx/DiscordGateway/Shard/heartbeats";
|
|
15
|
-
import * as Identify from "dfx/DiscordGateway/Shard/identify";
|
|
16
|
-
import * as InvalidSession from "dfx/DiscordGateway/Shard/invalidSession";
|
|
17
|
-
import * as Utils from "dfx/DiscordGateway/Shard/utils";
|
|
18
|
-
import { RateLimiterLive, RateLimiter } from "dfx/RateLimit";
|
|
19
|
-
import * as Discord from "dfx/types";
|
|
20
|
-
import { Messaging, MesssagingLive } from "dfx/DiscordGateway/Messaging";
|
|
19
|
+
import * as Secret from "effect/Secret";
|
|
21
20
|
export const make = /*#__PURE__*/Effect.gen(function* () {
|
|
22
21
|
const {
|
|
23
22
|
gateway,
|
|
@@ -29,10 +28,17 @@ export const make = /*#__PURE__*/Effect.gen(function* () {
|
|
|
29
28
|
hub,
|
|
30
29
|
sendQueue
|
|
31
30
|
} = yield* Messaging;
|
|
32
|
-
const
|
|
31
|
+
const shardState = yield* ShardStateStore;
|
|
32
|
+
const connect = shard => Effect.gen(function* (_) {
|
|
33
33
|
const outboundQueue = yield* Queue.unbounded();
|
|
34
34
|
const pendingQueue = yield* Queue.unbounded();
|
|
35
35
|
const phase = yield* Ref.make(0 /* Phase.Connecting */);
|
|
36
|
+
const stateStore = shardState.forShard(shard);
|
|
37
|
+
const resumeState = Option.getOrElse(yield* stateStore.get, () => ({
|
|
38
|
+
resumeUrl: "",
|
|
39
|
+
sessionId: "",
|
|
40
|
+
sequence: 0
|
|
41
|
+
}));
|
|
36
42
|
const setPhase = p => Effect.zipLeft(Ref.set(phase, p), Effect.annotateLogs(Effect.logTrace("phase transition"), "phase", p));
|
|
37
43
|
const outbound = Effect.zipLeft(Queue.take(outboundQueue), limiter.maybeWait("dfx.shard.send", Duration.minutes(1), 120));
|
|
38
44
|
const send = p => Effect.flatMap(Ref.get(phase), phase => phase === 2 /* Phase.Connected */ ? Queue.offer(outboundQueue, p) : Queue.offer(pendingQueue, p));
|
|
@@ -44,27 +50,32 @@ export const make = /*#__PURE__*/Effect.gen(function* () {
|
|
|
44
50
|
outbound,
|
|
45
51
|
onConnecting
|
|
46
52
|
});
|
|
47
|
-
const isReady = Option.liftPredicate(p => p.op === Discord.GatewayOpcode.DISPATCH && p.t === "READY");
|
|
48
|
-
const [latestReady, updateLatestReady] = yield* Utils.latest(p => Option.map(isReady(p), p => p.d));
|
|
49
|
-
const [latestSequence, updateLatestSequence] = yield* Utils.latest(p => Option.fromNullable(p.s));
|
|
50
|
-
const maybeUpdateUrl = p => Option.match(Option.map(isReady(p), p => p.d), {
|
|
51
|
-
onNone: () => Effect.void,
|
|
52
|
-
onSome: ({
|
|
53
|
-
resume_gateway_url
|
|
54
|
-
}) => socket.setUrl(resume_gateway_url)
|
|
55
|
-
});
|
|
56
53
|
const hellos = yield* Effect.acquireRelease(Queue.unbounded(), Queue.shutdown);
|
|
57
54
|
const acks = yield* Effect.acquireRelease(Queue.unbounded(), Queue.shutdown);
|
|
58
55
|
// heartbeats
|
|
59
|
-
yield* Heartbeats.send(hellos, acks,
|
|
56
|
+
yield* Heartbeats.send(hellos, acks, stateStore.get, heartbeatSend).pipe(Effect.forkScoped, Effect.interruptible);
|
|
60
57
|
// identify
|
|
61
58
|
const identify = Identify.identifyOrResume({
|
|
62
59
|
token: Secret.value(token),
|
|
63
60
|
shard,
|
|
64
61
|
intents: gateway.intents,
|
|
65
62
|
presence: gateway.presence
|
|
66
|
-
},
|
|
67
|
-
const onPayload = p => pipe(
|
|
63
|
+
}, stateStore.get);
|
|
64
|
+
const onPayload = p => pipe(Effect.suspend(() => {
|
|
65
|
+
if (typeof p.s === "number") {
|
|
66
|
+
resumeState.sequence = p.s;
|
|
67
|
+
}
|
|
68
|
+
if (p.op === Discord.GatewayOpcode.DISPATCH && p.t === "READY") {
|
|
69
|
+
const payload = p.d;
|
|
70
|
+
resumeState.sessionId = payload.session_id;
|
|
71
|
+
resumeState.resumeUrl = payload.resume_gateway_url;
|
|
72
|
+
return Effect.zipRight(stateStore.set(resumeState), socket.setUrl(payload.resume_gateway_url));
|
|
73
|
+
}
|
|
74
|
+
if (resumeState.resumeUrl !== "" && resumeState.sessionId !== "") {
|
|
75
|
+
return stateStore.set(resumeState);
|
|
76
|
+
}
|
|
77
|
+
return Effect.void;
|
|
78
|
+
}), Effect.tap(() => {
|
|
68
79
|
switch (p.op) {
|
|
69
80
|
case Discord.GatewayOpcode.HELLO:
|
|
70
81
|
{
|
|
@@ -76,7 +87,11 @@ export const make = /*#__PURE__*/Effect.gen(function* () {
|
|
|
76
87
|
}
|
|
77
88
|
case Discord.GatewayOpcode.INVALID_SESSION:
|
|
78
89
|
{
|
|
79
|
-
|
|
90
|
+
if (p.d) {
|
|
91
|
+
return send(Reconnect);
|
|
92
|
+
}
|
|
93
|
+
resumeState.sessionId = "";
|
|
94
|
+
return Effect.zipRight(stateStore.clear, send(Reconnect));
|
|
80
95
|
}
|
|
81
96
|
case Discord.GatewayOpcode.DISPATCH:
|
|
82
97
|
{
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Shard.mjs","names":["
|
|
1
|
+
{"version":3,"file":"Shard.mjs","names":["DiscordConfig","DiscordWS","DiscordWSLive","Reconnect","Messaging","MesssagingLive","ShardStateStore","Heartbeats","Identify","RateLimiter","RateLimiterLive","Discord","Chunk","GenericTag","Duration","Effect","pipe","Layer","Option","PubSub","Queue","Ref","Secret","make","gen","gateway","token","limiter","dws","hub","sendQueue","shardState","connect","shard","_","outboundQueue","unbounded","pendingQueue","phase","stateStore","forShard","resumeState","getOrElse","get","resumeUrl","sessionId","sequence","setPhase","p","zipLeft","set","annotateLogs","logTrace","outbound","take","maybeWait","minutes","send","flatMap","offer","heartbeatSend","succeed","prioritySend","resume","zipRight","takeAll","tap","offerAll","asVoid","onConnecting","msgs","filter","msg","op","GatewayOpcode","IDENTIFY","RESUME","HEARTBEAT","socket","hellos","acquireRelease","shutdown","acks","forkScoped","interruptible","identify","identifyOrResume","value","intents","presence","onPayload","suspend","s","DISPATCH","t","payload","d","session_id","resume_gateway_url","setUrl","void","HELLO","HEARTBEAT_ACK","INVALID_SESSION","clear","publish","RECONNECT","forever","id","package","module","Shard","ShardLive","effect","provide"],"sources":["../../src/DiscordGateway/Shard.ts"],"sourcesContent":[null],"mappings":"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","ignoreList":[]}
|
package/mjs/gateway.mjs
CHANGED
|
@@ -3,6 +3,7 @@ import { DiscordGatewayLive } from "dfx/DiscordGateway";
|
|
|
3
3
|
import * as DiscordWS from "dfx/DiscordGateway/DiscordWS";
|
|
4
4
|
import { JsonDiscordWSCodecLive } from "dfx/DiscordGateway/DiscordWS";
|
|
5
5
|
import * as Shard from "dfx/DiscordGateway/Shard";
|
|
6
|
+
import { MemoryShardStateStoreLive } from "dfx/DiscordGateway/Shard/StateStore";
|
|
6
7
|
import * as SendEvent from "dfx/DiscordGateway/Shard/sendEvents";
|
|
7
8
|
import * as ShardStore from "dfx/DiscordGateway/ShardStore";
|
|
8
9
|
import { MemoryShardStoreLive } from "dfx/DiscordGateway/ShardStore";
|
|
@@ -13,6 +14,6 @@ import * as Layer from "effect/Layer";
|
|
|
13
14
|
export { DiscordGateway, DiscordGatewayLive } from "dfx/DiscordGateway";
|
|
14
15
|
export { InteractionsRegistry, InteractionsRegistryLive, interactionsSync, run as runIx, setInteractionsSync } from "dfx/Interactions/gateway";
|
|
15
16
|
export { CachePrelude, DiscordWS, SendEvent, Shard, ShardStore };
|
|
16
|
-
export const DiscordLive = /*#__PURE__*/Layer.mergeAll(RateLimiterLive, DiscordGatewayLive).pipe( /*#__PURE__*/Layer.provideMerge(DiscordRESTLive), /*#__PURE__*/Layer.provide(JsonDiscordWSCodecLive), /*#__PURE__*/Layer.provide(MemoryRateLimitStoreLive), /*#__PURE__*/Layer.provide(MemoryShardStoreLive));
|
|
17
|
+
export const DiscordLive = /*#__PURE__*/Layer.mergeAll(RateLimiterLive, DiscordGatewayLive).pipe( /*#__PURE__*/Layer.provideMerge(DiscordRESTLive), /*#__PURE__*/Layer.provide(JsonDiscordWSCodecLive), /*#__PURE__*/Layer.provide(MemoryRateLimitStoreLive), /*#__PURE__*/Layer.provide(MemoryShardStoreLive), /*#__PURE__*/Layer.provide(MemoryShardStateStoreLive));
|
|
17
18
|
export const DiscordIxLive = /*#__PURE__*/InteractionsRegistryLive.pipe( /*#__PURE__*/Layer.provideMerge(DiscordLive));
|
|
18
19
|
//# sourceMappingURL=gateway.mjs.map
|
package/mjs/gateway.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gateway.mjs","names":["CachePrelude","DiscordGatewayLive","DiscordWS","JsonDiscordWSCodecLive","Shard","SendEvent","ShardStore","MemoryShardStoreLive","DiscordRESTLive","InteractionsRegistryLive","MemoryRateLimitStoreLive","RateLimiterLive","Layer","DiscordGateway","InteractionsRegistry","interactionsSync","run","runIx","setInteractionsSync","DiscordLive","mergeAll","pipe","provideMerge","provide","DiscordIxLive"],"sources":["../src/gateway.ts"],"sourcesContent":[null],"mappings":"AAAA,OAAO,KAAKA,YAAY,MAAM,mBAAmB;AACjD,SAASC,kBAAkB,QAAQ,oBAAoB;AACvD,OAAO,KAAKC,SAAS,MAAM,8BAA8B;AACzD,SAASC,sBAAsB,QAAQ,8BAA8B;AACrE,OAAO,KAAKC,KAAK,MAAM,0BAA0B;AACjD,OAAO,KAAKC,SAAS,MAAM,qCAAqC;AAChE,OAAO,KAAKC,UAAU,MAAM,+BAA+B;AAC3D,SAASC,oBAAoB,QAAQ,+BAA+B;AACpE,SAASC,eAAe,QAAQ,iBAAiB;AACjD,SAASC,wBAAwB,QAAQ,0BAA0B;AACnE,SAASC,wBAAwB,EAAEC,eAAe,QAAQ,eAAe;AACzE,OAAO,KAAKC,KAAK,MAAM,cAAc;AAErC,SAASC,cAAc,
|
|
1
|
+
{"version":3,"file":"gateway.mjs","names":["CachePrelude","DiscordGatewayLive","DiscordWS","JsonDiscordWSCodecLive","Shard","MemoryShardStateStoreLive","SendEvent","ShardStore","MemoryShardStoreLive","DiscordRESTLive","InteractionsRegistryLive","MemoryRateLimitStoreLive","RateLimiterLive","Layer","DiscordGateway","InteractionsRegistry","interactionsSync","run","runIx","setInteractionsSync","DiscordLive","mergeAll","pipe","provideMerge","provide","DiscordIxLive"],"sources":["../src/gateway.ts"],"sourcesContent":[null],"mappings":"AAAA,OAAO,KAAKA,YAAY,MAAM,mBAAmB;AACjD,SAASC,kBAAkB,QAAQ,oBAAoB;AACvD,OAAO,KAAKC,SAAS,MAAM,8BAA8B;AACzD,SAASC,sBAAsB,QAAQ,8BAA8B;AACrE,OAAO,KAAKC,KAAK,MAAM,0BAA0B;AACjD,SAASC,yBAAyB,QAAQ,qCAAqC;AAC/E,OAAO,KAAKC,SAAS,MAAM,qCAAqC;AAChE,OAAO,KAAKC,UAAU,MAAM,+BAA+B;AAC3D,SAASC,oBAAoB,QAAQ,+BAA+B;AACpE,SAASC,eAAe,QAAQ,iBAAiB;AACjD,SAASC,wBAAwB,QAAQ,0BAA0B;AACnE,SAASC,wBAAwB,EAAEC,eAAe,QAAQ,eAAe;AACzE,OAAO,KAAKC,KAAK,MAAM,cAAc;AAErC,SAASC,cAAc,EAAEb,kBAAkB,QAAQ,oBAAoB;AAEvE,SACEc,oBAAoB,EACpBL,wBAAwB,EACxBM,gBAAgB,EAChBC,GAAG,IAAIC,KAAK,EACZC,mBAAmB,QACd,0BAA0B;AAEjC,SAASnB,YAAY,EAAEE,SAAS,EAAEI,SAAS,EAAEF,KAAK,EAAEG,UAAU;AAE9D,OAAO,MAAMa,WAAW,gBAAGP,KAAK,CAACQ,QAAQ,CACvCT,eAAe,EACfX,kBAAkB,CACnB,CAACqB,IAAI,eACJT,KAAK,CAACU,YAAY,CAACd,eAAe,CAAC,eACnCI,KAAK,CAACW,OAAO,CAACrB,sBAAsB,CAAC,eACrCU,KAAK,CAACW,OAAO,CAACb,wBAAwB,CAAC,eACvCE,KAAK,CAACW,OAAO,CAAChB,oBAAoB,CAAC,eACnCK,KAAK,CAACW,OAAO,CAACnB,yBAAyB,CAAC,CACzC;AAED,OAAO,MAAMoB,aAAa,gBAAGf,wBAAwB,CAACY,IAAI,eACxDT,KAAK,CAACU,YAAY,CAACH,WAAW,CAAC,CAChC","ignoreList":[]}
|
package/mjs/version.mjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export const LIB_VERSION = "0.95.
|
|
1
|
+
export const LIB_VERSION = "0.95.2";
|
|
2
2
|
//# sourceMappingURL=version.mjs.map
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "dfx",
|
|
3
|
-
"version": "0.95.
|
|
3
|
+
"version": "0.95.2",
|
|
4
4
|
"description": "Effect-TS discord library",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"repository": {
|
|
@@ -44,6 +44,6 @@
|
|
|
44
44
|
"utf-8-validate": "^6.0.3",
|
|
45
45
|
"zlib-sync": "^0.1.9"
|
|
46
46
|
},
|
|
47
|
-
"gitHead": "
|
|
47
|
+
"gitHead": "b1c54e933611fbd187e370dc61d5f057b0d3361a",
|
|
48
48
|
"main": "./index.js"
|
|
49
49
|
}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import * as Effect from "effect/Effect"
|
|
2
|
+
import * as Option from "effect/Option"
|
|
3
|
+
import * as Context from "effect/Context"
|
|
4
|
+
import * as Layer from "effect/Layer"
|
|
5
|
+
|
|
6
|
+
export interface ShardState {
|
|
7
|
+
readonly resumeUrl: string
|
|
8
|
+
readonly sequence: number | null
|
|
9
|
+
readonly sessionId: string
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
export interface ShardStateStore {
|
|
13
|
+
readonly _: unique symbol
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
export interface StateStore {
|
|
17
|
+
readonly get: Effect.Effect<Option.Option<ShardState>>
|
|
18
|
+
readonly set: (state: ShardState) => Effect.Effect<void>
|
|
19
|
+
readonly clear: Effect.Effect<void>
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
export const ShardStateStore = Context.GenericTag<
|
|
23
|
+
ShardStateStore,
|
|
24
|
+
{ readonly forShard: (id: [id: number, count: number]) => StateStore }
|
|
25
|
+
>("dfx/Shard/StateStore")
|
|
26
|
+
|
|
27
|
+
export const MemoryShardStateStoreLive = Layer.sync(ShardStateStore, () => {
|
|
28
|
+
const store = new Map<string, ShardState>()
|
|
29
|
+
|
|
30
|
+
return ShardStateStore.of({
|
|
31
|
+
forShard: ([id, count]) => {
|
|
32
|
+
const key = `${id}-${count}`
|
|
33
|
+
return {
|
|
34
|
+
get: Effect.sync(() => Option.fromNullable(store.get(key))),
|
|
35
|
+
set(state) {
|
|
36
|
+
return Effect.sync(() => {
|
|
37
|
+
store.set(key, state)
|
|
38
|
+
})
|
|
39
|
+
},
|
|
40
|
+
clear: Effect.sync(() => {
|
|
41
|
+
store.delete(key)
|
|
42
|
+
}),
|
|
43
|
+
}
|
|
44
|
+
},
|
|
45
|
+
})
|
|
46
|
+
})
|
|
@@ -8,33 +8,34 @@ import * as DiscordWS from "dfx/DiscordGateway/DiscordWS"
|
|
|
8
8
|
import * as SendEvents from "dfx/DiscordGateway/Shard/sendEvents"
|
|
9
9
|
import type * as Discord from "dfx/types"
|
|
10
10
|
import * as EffectU from "dfx/utils/Effect"
|
|
11
|
+
import type { ShardState } from "dfx/DiscordGateway/Shard/StateStore"
|
|
11
12
|
|
|
12
|
-
const payload = (
|
|
13
|
-
Effect.map(
|
|
14
|
-
SendEvents.heartbeat(Option.getOrNull(
|
|
13
|
+
const payload = (state: Effect.Effect<Option.Option<ShardState>>) =>
|
|
14
|
+
Effect.map(state, state =>
|
|
15
|
+
SendEvents.heartbeat(Option.getOrNull(Option.map(state, s => s.sequence))),
|
|
15
16
|
)
|
|
16
17
|
|
|
17
18
|
const payloadOrReconnect = (
|
|
18
19
|
ref: Ref.Ref<boolean>,
|
|
19
|
-
|
|
20
|
+
state: Effect.Effect<Option.Option<ShardState>>,
|
|
20
21
|
) =>
|
|
21
22
|
Effect.flatMap(
|
|
22
23
|
Ref.get(ref),
|
|
23
24
|
(acked): Effect.Effect<DiscordWS.Message> =>
|
|
24
|
-
acked ? payload(
|
|
25
|
+
acked ? payload(state) : Effect.succeed(DiscordWS.Reconnect),
|
|
25
26
|
)
|
|
26
27
|
|
|
27
28
|
export const send = (
|
|
28
29
|
hellos: Queue.Dequeue<Discord.GatewayPayload>,
|
|
29
30
|
acks: Queue.Dequeue<Discord.GatewayPayload>,
|
|
30
|
-
|
|
31
|
+
state: Effect.Effect<Option.Option<ShardState>>,
|
|
31
32
|
send: (p: DiscordWS.Message) => Effect.Effect<boolean>,
|
|
32
33
|
) =>
|
|
33
34
|
Effect.flatMap(Ref.make(true), ackedRef => {
|
|
34
35
|
const heartbeats = EffectU.foreverSwitch(
|
|
35
36
|
Effect.zipLeft(Queue.take(hellos), Ref.set(ackedRef, true)),
|
|
36
37
|
p =>
|
|
37
|
-
payloadOrReconnect(ackedRef,
|
|
38
|
+
payloadOrReconnect(ackedRef, state).pipe(
|
|
38
39
|
Effect.zipLeft(Ref.set(ackedRef, false)),
|
|
39
40
|
Effect.tap(send),
|
|
40
41
|
Effect.schedule(
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import * as Option from "effect/Option"
|
|
2
2
|
import * as Effect from "effect/Effect"
|
|
3
|
-
import * as Ref from "effect/Ref"
|
|
4
3
|
import * as SendEvents from "dfx/DiscordGateway/Shard/sendEvents"
|
|
5
4
|
import type * as Discord from "dfx/types"
|
|
6
5
|
import * as OS from "os"
|
|
6
|
+
import type { ShardState } from "dfx/DiscordGateway/Shard/StateStore"
|
|
7
7
|
|
|
8
8
|
export interface Options {
|
|
9
9
|
readonly token: string
|
|
@@ -12,11 +12,6 @@ export interface Options {
|
|
|
12
12
|
readonly presence?: Discord.UpdatePresence
|
|
13
13
|
}
|
|
14
14
|
|
|
15
|
-
export interface Requirements {
|
|
16
|
-
readonly latestReady: Ref.Ref<Option.Option<Discord.ReadyEvent>>
|
|
17
|
-
readonly latestSequence: Ref.Ref<Option.Option<number>>
|
|
18
|
-
}
|
|
19
|
-
|
|
20
15
|
const identify = ({ intents, presence, shard, token }: Options) =>
|
|
21
16
|
SendEvents.identify({
|
|
22
17
|
token,
|
|
@@ -30,27 +25,24 @@ const identify = ({ intents, presence, shard, token }: Options) =>
|
|
|
30
25
|
presence,
|
|
31
26
|
})
|
|
32
27
|
|
|
33
|
-
const resume = (token: string,
|
|
28
|
+
const resume = (token: string, session_id: string, seq: number | null) =>
|
|
34
29
|
SendEvents.resume({
|
|
35
30
|
token,
|
|
36
|
-
session_id
|
|
37
|
-
seq
|
|
31
|
+
session_id,
|
|
32
|
+
seq: seq!,
|
|
38
33
|
})
|
|
39
34
|
|
|
40
35
|
export const identifyOrResume = (
|
|
41
36
|
opts: Options,
|
|
42
|
-
|
|
43
|
-
seq: Ref.Ref<Option.Option<number>>,
|
|
37
|
+
state: Effect.Effect<Option.Option<ShardState>>,
|
|
44
38
|
): Effect.Effect<
|
|
45
39
|
| Discord.GatewayPayload<Discord.Identify>
|
|
46
40
|
| Discord.GatewayPayload<Discord.Resume>
|
|
47
41
|
> =>
|
|
48
42
|
Effect.map(
|
|
49
|
-
|
|
50
|
-
(
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
resume(opts.token, readyEvent, seqNumber),
|
|
55
|
-
}),
|
|
43
|
+
state,
|
|
44
|
+
Option.match({
|
|
45
|
+
onNone: () => identify(opts),
|
|
46
|
+
onSome: state => resume(opts.token, state.sessionId, state.sequence),
|
|
47
|
+
}),
|
|
56
48
|
)
|
|
@@ -1,8 +1,5 @@
|
|
|
1
|
-
import * as Option from "effect/Option"
|
|
2
|
-
import * as Effect from "effect/Effect"
|
|
3
|
-
import * as Ref from "effect/Ref"
|
|
4
|
-
import * as Stream from "effect/Stream"
|
|
5
1
|
import type * as Discord from "dfx/types"
|
|
2
|
+
import * as Stream from "effect/Stream"
|
|
6
3
|
|
|
7
4
|
export const opCode =
|
|
8
5
|
<R, E>(source: Stream.Stream<Discord.GatewayPayload, E, R>) =>
|
|
@@ -12,27 +9,3 @@ export const opCode =
|
|
|
12
9
|
source.pipe(
|
|
13
10
|
Stream.filter((p): p is Discord.GatewayPayload<T> => p.op === code),
|
|
14
11
|
)
|
|
15
|
-
|
|
16
|
-
const maybeUpdateRef =
|
|
17
|
-
<T>(
|
|
18
|
-
f: (p: Discord.GatewayPayload) => Option.Option<T>,
|
|
19
|
-
ref: Ref.Ref<Option.Option<T>>,
|
|
20
|
-
) =>
|
|
21
|
-
(_: Discord.GatewayPayload): Effect.Effect<void> =>
|
|
22
|
-
Option.match(f(_), {
|
|
23
|
-
onNone: () => Effect.void,
|
|
24
|
-
onSome: a => Ref.set(ref, Option.some(a)),
|
|
25
|
-
})
|
|
26
|
-
|
|
27
|
-
export const latest = <T>(
|
|
28
|
-
f: (p: Discord.GatewayPayload) => Option.Option<T>,
|
|
29
|
-
): Effect.Effect<
|
|
30
|
-
readonly [
|
|
31
|
-
Ref.Ref<Option.Option<T>>,
|
|
32
|
-
(_: Discord.GatewayPayload<any>) => Effect.Effect<void>,
|
|
33
|
-
]
|
|
34
|
-
> =>
|
|
35
|
-
Effect.map(
|
|
36
|
-
Ref.make<Option.Option<T>>(Option.none()),
|
|
37
|
-
ref => [ref, maybeUpdateRef(f, ref)] as const,
|
|
38
|
-
)
|