1
0
mirror of https://github.com/spacebarchat/server.git synced 2024-09-22 10:41:34 +02:00

zlib compression

This commit is contained in:
Flam3rboy 2021-04-06 04:06:32 +02:00
parent ccfa61ca63
commit e4115d13ef
3 changed files with 18 additions and 2 deletions

View File

@ -5,6 +5,7 @@ import { Message } from "./Message";
import { setHeartbeat } from "../util/setHeartbeat"; import { setHeartbeat } from "../util/setHeartbeat";
import { Send } from "../util/Send"; import { Send } from "../util/Send";
import { CLOSECODES, OPCODES } from "../util/Constants"; import { CLOSECODES, OPCODES } from "../util/Constants";
import { createDeflate } from "zlib";
// TODO: check rate limit // TODO: check rate limit
// TODO: specify rate limit in config // TODO: specify rate limit in config
@ -24,8 +25,14 @@ export async function Connection(this: Server, socket: WebSocket, request: Incom
if (socket.version != 8) return socket.close(CLOSECODES.Invalid_API_version); if (socket.version != 8) return socket.close(CLOSECODES.Invalid_API_version);
// @ts-ignore // @ts-ignore
socket.compression = searchParams.get("compress") || ""; socket.compress = searchParams.get("compress") || "";
// TODO: compression if (socket.compress) {
if (socket.compress !== "zlib-stream") return socket.close(CLOSECODES.Decode_error);
socket.deflate = createDeflate({ chunkSize: 65535 });
socket.deflate.on("data", (chunk) => socket.send(chunk));
}
socket.sequence = 0;
setHeartbeat(socket); setHeartbeat(socket);

View File

@ -1,6 +1,7 @@
import erlpack from "erlpack"; import erlpack from "erlpack";
import { promisify } from "util"; import { promisify } from "util";
import { Payload } from "../util/Constants"; import { Payload } from "../util/Constants";
import { deflateSync } from "zlib";
import WebSocket from "./WebSocket"; import WebSocket from "./WebSocket";
@ -11,6 +12,11 @@ export async function Send(socket: WebSocket, data: Payload) {
else if (socket.encoding === "json") buffer = JSON.stringify(data); else if (socket.encoding === "json") buffer = JSON.stringify(data);
// TODO: compression // TODO: compression
if (socket.deflate) {
socket.deflate.write(buffer);
socket.deflate.flush();
return;
}
return new Promise((res, rej) => { return new Promise((res, rej) => {
socket.send(buffer, (err) => { socket.send(buffer, (err) => {

View File

@ -1,14 +1,17 @@
import { Intents } from "fosscord-server-util"; import { Intents } from "fosscord-server-util";
import WS, { Server, Data } from "ws"; import WS, { Server, Data } from "ws";
import { Deflate } from "zlib";
interface WebSocket extends WS { interface WebSocket extends WS {
version: number; version: number;
user_id: bigint; user_id: bigint;
encoding: "etf" | "json"; encoding: "etf" | "json";
compress?: "zlib-stream"; compress?: "zlib-stream";
deflate?: Deflate;
heartbeatTimeout: NodeJS.Timeout; heartbeatTimeout: NodeJS.Timeout;
readyTimeout: NodeJS.Timeout; readyTimeout: NodeJS.Timeout;
intents: Intents; intents: Intents;
sequence: number;
} }
export default WebSocket; export default WebSocket;