From d8f32cb05a25c706d7055b55752358e04f205af0 Mon Sep 17 00:00:00 2001 From: Madeline <46743919+MaddyUnderStars@users.noreply.github.com> Date: Wed, 1 Feb 2023 13:00:04 +1100 Subject: [PATCH] Use erlpack instead of @yukikaze-bot/erlpack (#968) --- package-lock.json | 52 +++++++++++++++++++++++--------- package.json | 8 ++--- src/gateway/events/Connection.ts | 22 ++++++-------- src/gateway/events/Message.ts | 12 ++++---- src/gateway/util/Send.ts | 18 +++++------ src/util/imports/Erlpack.ts | 12 ++++++++ src/util/imports/index.ts | 1 + src/webrtc/events/Connection.ts | 4 --- 8 files changed, 80 insertions(+), 49 deletions(-) create mode 100644 src/util/imports/Erlpack.ts diff --git a/package-lock.json b/package-lock.json index b9a712aa..165a2b23 100644 --- a/package-lock.json +++ b/package-lock.json @@ -45,7 +45,7 @@ "probe-image-size": "^7.2.3", "proxy-agent": "^5.0.0", "reflect-metadata": "^0.1.13", - "sqlite3": "^5.1.4", + "sqlite3": "*", "ts-node": "^10.9.1", "tslib": "^2.4.1", "typeorm": "^0.3.10", @@ -79,7 +79,8 @@ "typescript": "^4.9.4" }, "optionalDependencies": { - "@yukikaze-bot/erlpack": "^1.0.1" + "erlpack": "^0.1.4", + "sqlite3": "^5.1.4" } }, "node_modules/@acuminous/bitsyntax": { @@ -2327,17 +2328,6 @@ "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/@yukikaze-bot/erlpack": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@yukikaze-bot/erlpack/-/erlpack-1.0.1.tgz", - "integrity": "sha512-PCJ2lGCf8DsQtrE411PY+NTsolK48l4InNn1kcBo0iUllKZYGLqeqXEWGA/INrmwanKcoYkU4pBySqUFLQDEoA==", - "hasInstallScript": true, - "optional": true, - "dependencies": { - "@mapbox/node-pre-gyp": "^1.0.5", - "node-addon-api": "^4.0.0" - } - }, "node_modules/abbrev": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", @@ -2707,6 +2697,21 @@ "node": "*" } }, + "node_modules/bindings": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", + "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", + "optional": true, + "dependencies": { + "file-uri-to-path": "1.0.0" + } + }, + "node_modules/bindings/node_modules/file-uri-to-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", + "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", + "optional": true + }, "node_modules/body-parser": { "version": "1.20.1", "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", @@ -3569,6 +3574,17 @@ "node": ">=6" } }, + "node_modules/erlpack": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/erlpack/-/erlpack-0.1.4.tgz", + "integrity": "sha512-CJYbkEvsB5FqCCu2tLxF1eYKi28PvemC12oqzJ9oO6mDFrFO9G9G7nNJUHhiAyyL9zfXTOJx/tOcrQk+ncD65w==", + "hasInstallScript": true, + "optional": true, + "dependencies": { + "bindings": "^1.5.0", + "nan": "^2.15.0" + } + }, "node_modules/err-code": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz", @@ -5583,6 +5599,12 @@ "thenify-all": "^1.0.0" } }, + "node_modules/nan": { + "version": "2.17.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.17.0.tgz", + "integrity": "sha512-2ZTgtl0nJsO0KQCjEpxcIr5D+Yv90plTitZt9JBfQvVJDS5seMl3FOvsh3+9CoYWXf/1l5OaZzzF6nDm4cagaQ==", + "optional": true + }, "node_modules/natural-compare": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", @@ -5649,7 +5671,8 @@ "node_modules/node-addon-api": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-4.3.0.tgz", - "integrity": "sha512-73sE9+3UaLYYFmDsFZnqCInzPyh3MqIwZO9cw58yIqAZhONrrabrYyYe3TuIqtIiOuTXVhsGau8hcrhhwSsDIQ==" + "integrity": "sha512-73sE9+3UaLYYFmDsFZnqCInzPyh3MqIwZO9cw58yIqAZhONrrabrYyYe3TuIqtIiOuTXVhsGau8hcrhhwSsDIQ==", + "optional": true }, "node_modules/node-fetch": { "version": "2.6.7", @@ -6782,6 +6805,7 @@ "resolved": "https://registry.npmjs.org/sqlite3/-/sqlite3-5.1.4.tgz", "integrity": "sha512-i0UlWAzPlzX3B5XP2cYuhWQJsTtlMD6obOa1PgeEQ4DHEXUuyJkgv50I3isqZAP5oFc2T8OFvakmDh2W6I+YpA==", "hasInstallScript": true, + "optional": true, "dependencies": { "@mapbox/node-pre-gyp": "^1.0.0", "node-addon-api": "^4.2.0", diff --git a/package.json b/package.json index 1d52cf4b..4aef413a 100644 --- a/package.json +++ b/package.json @@ -99,20 +99,20 @@ "probe-image-size": "^7.2.3", "proxy-agent": "^5.0.0", "reflect-metadata": "^0.1.13", - "sqlite3": "^5.1.4", "ts-node": "^10.9.1", "tslib": "^2.4.1", "typeorm": "^0.3.10", "typescript-json-schema": "^0.50.1", "ws": "^8.9.0" }, - "optionalDependencies": { - "@yukikaze-bot/erlpack": "^1.0.1" - }, "_moduleAliases": { "@fosscord/api": "dist/api", "@fosscord/cdn": "dist/cdn", "@fosscord/gateway": "dist/gateway", "@fosscord/util": "dist/util" + }, + "optionalDependencies": { + "erlpack": "^0.1.4", + "sqlite3": "^5.1.4" } } diff --git a/src/gateway/events/Connection.ts b/src/gateway/events/Connection.ts index 82081266..5ba68ef7 100644 --- a/src/gateway/events/Connection.ts +++ b/src/gateway/events/Connection.ts @@ -27,12 +27,13 @@ import { Close } from "./Close"; import { Message } from "./Message"; import { Deflate, Inflate } from "fast-zlib"; import { URL } from "url"; -import { Config } from "@fosscord/util"; -let erlpack: unknown; +import { Config, ErlpackType } from "@fosscord/util"; + +let erlpack: ErlpackType | null = null; try { - erlpack = require("@yukikaze-bot/erlpack"); -} catch (error) { - /* empty */ + erlpack = require("erlpack") as ErlpackType; +} catch (e) { + // empty } // TODO: check rate limit @@ -84,14 +85,11 @@ export async function Connection( const { searchParams } = new URL(`http://localhost${request.url}`); // @ts-ignore socket.encoding = searchParams.get("encoding") || "json"; - if (!["json", "etf"].includes(socket.encoding)) { - if (socket.encoding === "etf" && erlpack) { - throw new Error( - "Erlpack is not installed: 'npm i @yukikaze-bot/erlpack'", - ); - } + if (!["json", "etf"].includes(socket.encoding)) return socket.close(CLOSECODES.Decode_error); - } + + if (socket.encoding === "etf" && erlpack) + throw new Error("Erlpack is not installed: 'npm i erlpack'"); socket.version = Number(searchParams.get("version")) || 8; if (socket.version != 8) diff --git a/src/gateway/events/Message.ts b/src/gateway/events/Message.ts index b949f273..16e4518d 100644 --- a/src/gateway/events/Message.ts +++ b/src/gateway/events/Message.ts @@ -20,18 +20,18 @@ import { WebSocket, Payload, CLOSECODES, OPCODES } from "@fosscord/gateway"; import OPCodeHandlers from "../opcodes"; import { check } from "../opcodes/instanceOf"; import WS from "ws"; -import { PayloadSchema } from "@fosscord/util"; +import { PayloadSchema, ErlpackType } from "@fosscord/util"; import * as Sentry from "@sentry/node"; import BigIntJson from "json-bigint"; import path from "path"; import fs from "fs/promises"; const bigIntJson = BigIntJson({ storeAsString: true }); -let erlpack: { unpack: (buffer: Buffer) => Payload }; +let erlpack: ErlpackType | null = null; try { - erlpack = require("@yukikaze-bot/erlpack"); -} catch (error) { - /* empty */ + erlpack = require("erlpack") as ErlpackType; +} catch (e) { + // empty } export async function Message(this: WebSocket, buffer: WS.Data) { @@ -52,7 +52,7 @@ export async function Message(this: WebSocket, buffer: WS.Data) { } } data = bigIntJson.parse(buffer as string); - } else if (this.encoding === "etf" && buffer instanceof Buffer) { + } else if (this.encoding === "etf" && buffer instanceof Buffer && erlpack) { try { data = erlpack.unpack(buffer); } catch { diff --git a/src/gateway/util/Send.ts b/src/gateway/util/Send.ts index a89d92d7..38e5ab4a 100644 --- a/src/gateway/util/Send.ts +++ b/src/gateway/util/Send.ts @@ -16,18 +16,18 @@ along with this program. If not, see . */ -let erlpack: { pack: (data: Payload) => Buffer }; -try { - erlpack = require("@yukikaze-bot/erlpack"); -} catch (error) { - console.log( - "Missing @yukikaze-bot/erlpack, electron-based desktop clients designed for discord.com will not be able to connect!", - ); -} import { Payload, WebSocket } from "@fosscord/gateway"; import fs from "fs/promises"; import path from "path"; +import type { ErlpackType } from "@fosscord/util"; +let erlpack: ErlpackType | null = null; +try { + erlpack = require("erlpack") as ErlpackType; +} catch (e) { + // empty +} + export function Send(socket: WebSocket, data: Payload) { if (process.env.WS_VERBOSE) console.log(`[Websocket] Outgoing message: ${JSON.stringify(data)}`); @@ -47,7 +47,7 @@ export function Send(socket: WebSocket, data: Payload) { } let buffer: Buffer | string; - if (socket.encoding === "etf") buffer = erlpack.pack(data); + if (socket.encoding === "etf" && erlpack) buffer = erlpack.pack(data); // TODO: encode circular object else if (socket.encoding === "json") buffer = JSON.stringify(data); else return; diff --git a/src/util/imports/Erlpack.ts b/src/util/imports/Erlpack.ts new file mode 100644 index 00000000..a69cffbb --- /dev/null +++ b/src/util/imports/Erlpack.ts @@ -0,0 +1,12 @@ +/* + https://github.com/discord/erlpack/blob/master/js/index.d.ts + MIT License + Copyright (c) 2017 Discord +*/ +/* eslint-disable @typescript-eslint/no-explicit-any */ +// @fc-license-skip + +export type ErlpackType = { + pack: (data: any) => Buffer; + unpack: (data: Buffer) => T; +}; diff --git a/src/util/imports/index.ts b/src/util/imports/index.ts index 1fd93e45..da0be37c 100644 --- a/src/util/imports/index.ts +++ b/src/util/imports/index.ts @@ -17,3 +17,4 @@ */ export * from "./OrmUtils"; +export * from "./Erlpack"; diff --git a/src/webrtc/events/Connection.ts b/src/webrtc/events/Connection.ts index 0971bc19..c362c97a 100644 --- a/src/webrtc/events/Connection.ts +++ b/src/webrtc/events/Connection.ts @@ -23,10 +23,6 @@ import WS from "ws"; import { VoiceOPCodes } from "../util"; import { onClose } from "./Close"; import { onMessage } from "./Message"; -var erlpack: any; -try { - erlpack = require("@yukikaze-bot/erlpack"); -} catch (error) {} // TODO: check rate limit // TODO: specify rate limit in config