@bakit/gateway 2.1.7 → 2.1.9
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/dist/index.js +42 -24
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -7,7 +7,7 @@ import { fork } from 'child_process';
|
|
|
7
7
|
import '@bakit/rest';
|
|
8
8
|
|
|
9
9
|
// src/lib/shard.ts
|
|
10
|
-
var
|
|
10
|
+
var DEFAULT_SHARD_OPTIONS = {
|
|
11
11
|
gateway: {
|
|
12
12
|
baseURL: "wss://gateway.discord.gg",
|
|
13
13
|
version: 10
|
|
@@ -34,7 +34,7 @@ var ZLIB_FLUSH = Buffer.from([0, 0, 255, 255]), DEFAULT_SHARD_OPTIONS = {
|
|
|
34
34
|
Shutdown: 4
|
|
35
35
|
};
|
|
36
36
|
function createShard(options) {
|
|
37
|
-
let resolvedOptions = { ...DEFAULT_SHARD_OPTIONS, ...options }, state = ShardState.Idle, strategy = ShardStrategy.Unknown, ws, resumeGatewayURL, inflater,
|
|
37
|
+
let resolvedOptions = { ...DEFAULT_SHARD_OPTIONS, ...options }, textDecoder = new TextDecoder(), state = ShardState.Idle, strategy = ShardStrategy.Unknown, ws, resumeGatewayURL, inflater, decompressBuffer = [], sessionId, lastSequence, lastHeartbeatSent = -1, lastHeartbeatAcknowledged = -1, missedHeartbeats = 0, reconnectTimeout, heartbeatTimeout, heartbeatInterval, self = attachEventBus({
|
|
38
38
|
send,
|
|
39
39
|
connect,
|
|
40
40
|
disconnect,
|
|
@@ -60,29 +60,14 @@ function createShard(options) {
|
|
|
60
60
|
let { gateway } = resolvedOptions, baseURL = isResumable() && resumeGatewayURL ? resumeGatewayURL : gateway.baseURL, url = new URL(baseURL);
|
|
61
61
|
url.searchParams.set("v", gateway.version.toString()), url.searchParams.set("encoding", "json"), url.searchParams.set("compress", "zlib-stream"), ws = new WebSocket(url.toString(), {
|
|
62
62
|
perMessageDeflate: false
|
|
63
|
-
}),
|
|
63
|
+
}), inflater = createInflate({
|
|
64
64
|
flush: constants.Z_SYNC_FLUSH
|
|
65
|
-
}), inflater.on("data", (
|
|
66
|
-
if (inflateBuffer) {
|
|
67
|
-
if (inflateBuffer = Buffer.concat([inflateBuffer, chunk]), inflateBuffer.length > 10 * 1024 * 1024) {
|
|
68
|
-
self.emit("error", new Error("Inflate buffer overflow")), ws?.terminate();
|
|
69
|
-
return;
|
|
70
|
-
}
|
|
71
|
-
try {
|
|
72
|
-
let text = inflateBuffer.toString("utf8"), payload = JSON.parse(text);
|
|
73
|
-
inflateBuffer = Buffer.alloc(0), handlePayload(payload);
|
|
74
|
-
} catch (err) {
|
|
75
|
-
if (err instanceof SyntaxError)
|
|
76
|
-
return;
|
|
77
|
-
inflateBuffer = Buffer.alloc(0), self.emit("error", err);
|
|
78
|
-
}
|
|
79
|
-
}
|
|
80
|
-
}), inflater.on("error", (err) => {
|
|
65
|
+
}), inflater.on("data", onInflate), inflater.on("error", (err) => {
|
|
81
66
|
self.emit("error", err), ws?.terminate();
|
|
82
67
|
}), ws.on("message", onMessage), ws.on("close", onClose), ws.on("error", (err) => self.emit("error", err));
|
|
83
68
|
}
|
|
84
69
|
function cleanup() {
|
|
85
|
-
heartbeatInterval && (clearInterval(heartbeatInterval), heartbeatInterval = void 0), heartbeatTimeout && (clearTimeout(heartbeatTimeout), heartbeatTimeout = void 0), reconnectTimeout && (clearTimeout(reconnectTimeout), reconnectTimeout = void 0), inflater && (inflater.destroy(), inflater = void 0),
|
|
70
|
+
heartbeatInterval && (clearInterval(heartbeatInterval), heartbeatInterval = void 0), heartbeatTimeout && (clearTimeout(heartbeatTimeout), heartbeatTimeout = void 0), reconnectTimeout && (clearTimeout(reconnectTimeout), reconnectTimeout = void 0), inflater && (inflater.destroy(), inflater = void 0), ws && (ws.readyState !== WebSocket.CLOSED && ws.terminate(), ws.removeAllListeners(), ws = void 0), decompressBuffer = [], missedHeartbeats = 0, lastHeartbeatSent = -1, lastHeartbeatAcknowledged = -1;
|
|
86
71
|
}
|
|
87
72
|
function connect() {
|
|
88
73
|
return new Promise((resolve) => {
|
|
@@ -101,12 +86,45 @@ function createShard(options) {
|
|
|
101
86
|
});
|
|
102
87
|
}
|
|
103
88
|
function onMessage(data) {
|
|
104
|
-
if (!
|
|
105
|
-
|
|
106
|
-
|
|
89
|
+
if (!inflater) {
|
|
90
|
+
try {
|
|
91
|
+
let text = data.toString(), payload = JSON.parse(text);
|
|
92
|
+
handlePayload(payload);
|
|
93
|
+
} catch (error) {
|
|
94
|
+
self.emit("error", error);
|
|
95
|
+
}
|
|
96
|
+
return;
|
|
97
|
+
}
|
|
98
|
+
let buffer;
|
|
99
|
+
Buffer.isBuffer(data) ? buffer = data : Array.isArray(data) ? buffer = Buffer.concat(data) : data instanceof ArrayBuffer ? buffer = Buffer.from(data) : buffer = Buffer.from(String(data));
|
|
100
|
+
let hasSyncFlush = buffer.length >= 4 && buffer[buffer.length - 4] === 0 && buffer[buffer.length - 3] === 0 && buffer[buffer.length - 2] === 255 && buffer[buffer.length - 1] === 255;
|
|
101
|
+
inflater.write(buffer, (writeError) => {
|
|
102
|
+
if (writeError) {
|
|
103
|
+
self.emit("error", writeError);
|
|
107
104
|
return;
|
|
108
105
|
}
|
|
109
|
-
|
|
106
|
+
hasSyncFlush && inflater?.flush(constants.Z_SYNC_FLUSH);
|
|
107
|
+
});
|
|
108
|
+
}
|
|
109
|
+
function onInflate(chunk) {
|
|
110
|
+
decompressBuffer.push(chunk);
|
|
111
|
+
try {
|
|
112
|
+
let fullBuffer = Buffer.concat(decompressBuffer), text = textDecoder.decode(fullBuffer), payload = JSON.parse(text);
|
|
113
|
+
handlePayload(payload), decompressBuffer = [];
|
|
114
|
+
} catch (error) {
|
|
115
|
+
if (error instanceof SyntaxError) {
|
|
116
|
+
let fullBuffer = Buffer.concat(decompressBuffer), text = textDecoder.decode(fullBuffer);
|
|
117
|
+
if (text.includes("{") && !isValidJSON(text))
|
|
118
|
+
return;
|
|
119
|
+
self.emit("error", error), decompressBuffer = [];
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
function isValidJSON(str) {
|
|
124
|
+
try {
|
|
125
|
+
return JSON.parse(str), !0;
|
|
126
|
+
} catch {
|
|
127
|
+
return false;
|
|
110
128
|
}
|
|
111
129
|
}
|
|
112
130
|
function onClose(code) {
|