From 11ded99daab187b6545029f453c74cceea7da501 Mon Sep 17 00:00:00 2001 From: shuaiplus <2327005759@qq.com> Date: Sat, 24 May 2025 01:46:52 +0800 Subject: [PATCH] =?UTF-8?q?npm=E7=9A=84=E6=96=B9=E5=BC=8Fcdn=E6=9C=AC?= =?UTF-8?q?=E5=9C=B0=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package-lock.json | 39 + package.json | 3 + server/node_modules/.bin/node-gyp-build | 16 - .../node_modules/.bin/node-gyp-build-optional | 16 - .../.bin/node-gyp-build-optional.cmd | 17 - .../.bin/node-gyp-build-optional.ps1 | 28 - server/node_modules/.bin/node-gyp-build-test | 16 - .../node_modules/.bin/node-gyp-build-test.cmd | 17 - .../node_modules/.bin/node-gyp-build-test.ps1 | 28 - server/node_modules/.bin/node-gyp-build.cmd | 17 - server/node_modules/.bin/node-gyp-build.ps1 | 28 - server/node_modules/.package-lock.json | 66 - server/node_modules/bufferutil/LICENSE | 20 - server/node_modules/bufferutil/README.md | 79 -- server/node_modules/bufferutil/binding.gyp | 32 - server/node_modules/bufferutil/fallback.js | 34 - server/node_modules/bufferutil/index.js | 7 - server/node_modules/bufferutil/package.json | 36 - .../darwin-x64+arm64/bufferutil.node | Bin 66976 -> 0 bytes .../prebuilds/linux-x64/bufferutil.node | Bin 14576 -> 0 bytes .../prebuilds/win32-ia32/bufferutil.node | Bin 126976 -> 0 bytes .../prebuilds/win32-x64/bufferutil.node | Bin 153600 -> 0 bytes .../node_modules/bufferutil/src/bufferutil.c | 171 --- server/node_modules/node-gyp-build/LICENSE | 21 - server/node_modules/node-gyp-build/README.md | 58 - .../node_modules/node-gyp-build/SECURITY.md | 5 - server/node_modules/node-gyp-build/bin.js | 84 -- .../node_modules/node-gyp-build/build-test.js | 19 - server/node_modules/node-gyp-build/index.js | 6 - .../node-gyp-build/node-gyp-build.js | 207 --- .../node_modules/node-gyp-build/optional.js | 7 - .../node_modules/node-gyp-build/package.json | 43 - server/node_modules/utf-8-validate/LICENSE | 30 - server/node_modules/utf-8-validate/README.md | 50 - .../node_modules/utf-8-validate/binding.gyp | 18 - .../node_modules/utf-8-validate/fallback.js | 62 - server/node_modules/utf-8-validate/index.js | 7 - .../node_modules/utf-8-validate/package.json | 36 - .../prebuilds/darwin-x64+arm64/node.napi.node | Bin 116000 -> 0 bytes .../prebuilds/linux-x64/node.napi.node | Bin 6232 -> 0 bytes .../prebuilds/win32-ia32/node.napi.node | Bin 121856 -> 0 bytes .../prebuilds/win32-x64/node.napi.node | Bin 150528 -> 0 bytes .../utf-8-validate/src/validation.c | 109 -- server/node_modules/ws/LICENSE | 21 - server/node_modules/ws/README.md | 495 ------- server/node_modules/ws/browser.js | 8 - server/node_modules/ws/index.js | 10 - server/node_modules/ws/lib/buffer-util.js | 129 -- server/node_modules/ws/lib/constants.js | 10 - server/node_modules/ws/lib/event-target.js | 184 --- server/node_modules/ws/lib/extension.js | 223 --- server/node_modules/ws/lib/limiter.js | 55 - .../node_modules/ws/lib/permessage-deflate.js | 518 ------- server/node_modules/ws/lib/receiver.js | 607 --------- server/node_modules/ws/lib/sender.js | 409 ------ server/node_modules/ws/lib/stream.js | 180 --- server/node_modules/ws/lib/validation.js | 104 -- .../node_modules/ws/lib/websocket-server.js | 449 ------- server/node_modules/ws/lib/websocket.js | 1197 ----------------- server/node_modules/ws/package.json | 56 - server/server.js | 3 +- vite.config.js | 15 +- web/NodeCrypt.js | 2 +- web/chat.js | 18 +- web/index.html | 2 +- web/main.js | 5 +- web/room.js | 15 +- web/ui.js | 14 +- web/util.avatar.js | 20 +- web/util.emoji.js | 36 +- 70 files changed, 100 insertions(+), 6117 deletions(-) delete mode 100644 server/node_modules/.bin/node-gyp-build delete mode 100644 server/node_modules/.bin/node-gyp-build-optional delete mode 100644 server/node_modules/.bin/node-gyp-build-optional.cmd delete mode 100644 server/node_modules/.bin/node-gyp-build-optional.ps1 delete mode 100644 server/node_modules/.bin/node-gyp-build-test delete mode 100644 server/node_modules/.bin/node-gyp-build-test.cmd delete mode 100644 server/node_modules/.bin/node-gyp-build-test.ps1 delete mode 100644 server/node_modules/.bin/node-gyp-build.cmd delete mode 100644 server/node_modules/.bin/node-gyp-build.ps1 delete mode 100644 server/node_modules/.package-lock.json delete mode 100644 server/node_modules/bufferutil/LICENSE delete mode 100644 server/node_modules/bufferutil/README.md delete mode 100644 server/node_modules/bufferutil/binding.gyp delete mode 100644 server/node_modules/bufferutil/fallback.js delete mode 100644 server/node_modules/bufferutil/index.js delete mode 100644 server/node_modules/bufferutil/package.json delete mode 100644 server/node_modules/bufferutil/prebuilds/darwin-x64+arm64/bufferutil.node delete mode 100644 server/node_modules/bufferutil/prebuilds/linux-x64/bufferutil.node delete mode 100644 server/node_modules/bufferutil/prebuilds/win32-ia32/bufferutil.node delete mode 100644 server/node_modules/bufferutil/prebuilds/win32-x64/bufferutil.node delete mode 100644 server/node_modules/bufferutil/src/bufferutil.c delete mode 100644 server/node_modules/node-gyp-build/LICENSE delete mode 100644 server/node_modules/node-gyp-build/README.md delete mode 100644 server/node_modules/node-gyp-build/SECURITY.md delete mode 100644 server/node_modules/node-gyp-build/bin.js delete mode 100644 server/node_modules/node-gyp-build/build-test.js delete mode 100644 server/node_modules/node-gyp-build/index.js delete mode 100644 server/node_modules/node-gyp-build/node-gyp-build.js delete mode 100644 server/node_modules/node-gyp-build/optional.js delete mode 100644 server/node_modules/node-gyp-build/package.json delete mode 100644 server/node_modules/utf-8-validate/LICENSE delete mode 100644 server/node_modules/utf-8-validate/README.md delete mode 100644 server/node_modules/utf-8-validate/binding.gyp delete mode 100644 server/node_modules/utf-8-validate/fallback.js delete mode 100644 server/node_modules/utf-8-validate/index.js delete mode 100644 server/node_modules/utf-8-validate/package.json delete mode 100644 server/node_modules/utf-8-validate/prebuilds/darwin-x64+arm64/node.napi.node delete mode 100644 server/node_modules/utf-8-validate/prebuilds/linux-x64/node.napi.node delete mode 100644 server/node_modules/utf-8-validate/prebuilds/win32-ia32/node.napi.node delete mode 100644 server/node_modules/utf-8-validate/prebuilds/win32-x64/node.napi.node delete mode 100644 server/node_modules/utf-8-validate/src/validation.c delete mode 100644 server/node_modules/ws/LICENSE delete mode 100644 server/node_modules/ws/README.md delete mode 100644 server/node_modules/ws/browser.js delete mode 100644 server/node_modules/ws/index.js delete mode 100644 server/node_modules/ws/lib/buffer-util.js delete mode 100644 server/node_modules/ws/lib/constants.js delete mode 100644 server/node_modules/ws/lib/event-target.js delete mode 100644 server/node_modules/ws/lib/extension.js delete mode 100644 server/node_modules/ws/lib/limiter.js delete mode 100644 server/node_modules/ws/lib/permessage-deflate.js delete mode 100644 server/node_modules/ws/lib/receiver.js delete mode 100644 server/node_modules/ws/lib/sender.js delete mode 100644 server/node_modules/ws/lib/stream.js delete mode 100644 server/node_modules/ws/lib/validation.js delete mode 100644 server/node_modules/ws/lib/websocket-server.js delete mode 100644 server/node_modules/ws/lib/websocket.js delete mode 100644 server/node_modules/ws/package.json diff --git a/package-lock.json b/package-lock.json index 2c1373a..bd9d0bd 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,9 +9,12 @@ "version": "1.0.0", "license": "ISC", "dependencies": { + "@dicebear/core": "^9.2.2", + "@dicebear/micah": "^9.2.2", "aes-js": "^3.1.2", "buffer": "^6.0.3", "elliptic": "^6.6.1", + "emoji-picker-element": "^1.26.3", "js-chacha20": "^1.1.0", "js-sha256": "^0.11.0" }, @@ -20,6 +23,30 @@ "vite": "^6.3.5" } }, + "node_modules/@dicebear/core": { + "version": "9.2.2", + "resolved": "https://registry.npmmirror.com/@dicebear/core/-/core-9.2.2.tgz", + "integrity": "sha512-ROhgHG249dPtcXgBHcqPEsDeAPRPRD/9d+tZCjLYyueO+cXDlIA8dUlxpwIVcOuZFvCyW6RJtqo8BhNAi16pIQ==", + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.11" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@dicebear/micah": { + "version": "9.2.2", + "resolved": "https://registry.npmmirror.com/@dicebear/micah/-/micah-9.2.2.tgz", + "integrity": "sha512-NCajcJV5yw8uMKiACp694w1T/UyYme2CUEzyTzWHgWnQ+drAuCcH8gpAoLWd67viNdQB/MTpNlaelUgTjmI4AQ==", + "license": "MIT", + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "@dicebear/core": "^9.0.0" + } + }, "node_modules/@esbuild/aix-ppc64": { "version": "0.25.4", "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.4.tgz", @@ -796,6 +823,12 @@ "dev": true, "license": "MIT" }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmmirror.com/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "license": "MIT" + }, "node_modules/acorn": { "version": "8.14.1", "resolved": "https://registry.npmmirror.com/acorn/-/acorn-8.14.1.tgz", @@ -900,6 +933,12 @@ "minimalistic-crypto-utils": "^1.0.1" } }, + "node_modules/emoji-picker-element": { + "version": "1.26.3", + "resolved": "https://registry.npmmirror.com/emoji-picker-element/-/emoji-picker-element-1.26.3.tgz", + "integrity": "sha512-fOMG44d/3OqTe1pPqlu5H4ZtWg7gK4Le6Bt24JTKtDyce5+EO3Mo8WA95cKHbPSsSsg7ehM12M1x3Y6U6fgvTQ==", + "license": "Apache-2.0" + }, "node_modules/esbuild": { "version": "0.25.4", "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.4.tgz", diff --git a/package.json b/package.json index 21dc795..d1816e2 100644 --- a/package.json +++ b/package.json @@ -23,9 +23,12 @@ "vite": "^6.3.5" }, "dependencies": { + "@dicebear/core": "^9.2.2", + "@dicebear/micah": "^9.2.2", "aes-js": "^3.1.2", "buffer": "^6.0.3", "elliptic": "^6.6.1", + "emoji-picker-element": "^1.26.3", "js-chacha20": "^1.1.0", "js-sha256": "^0.11.0" } diff --git a/server/node_modules/.bin/node-gyp-build b/server/node_modules/.bin/node-gyp-build deleted file mode 100644 index b804ba9..0000000 --- a/server/node_modules/.bin/node-gyp-build +++ /dev/null @@ -1,16 +0,0 @@ -#!/bin/sh -basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')") - -case `uname` in - *CYGWIN*|*MINGW*|*MSYS*) - if command -v cygpath > /dev/null 2>&1; then - basedir=`cygpath -w "$basedir"` - fi - ;; -esac - -if [ -x "$basedir/node" ]; then - exec "$basedir/node" "$basedir/../node-gyp-build/bin.js" "$@" -else - exec node "$basedir/../node-gyp-build/bin.js" "$@" -fi diff --git a/server/node_modules/.bin/node-gyp-build-optional b/server/node_modules/.bin/node-gyp-build-optional deleted file mode 100644 index cb670aa..0000000 --- a/server/node_modules/.bin/node-gyp-build-optional +++ /dev/null @@ -1,16 +0,0 @@ -#!/bin/sh -basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')") - -case `uname` in - *CYGWIN*|*MINGW*|*MSYS*) - if command -v cygpath > /dev/null 2>&1; then - basedir=`cygpath -w "$basedir"` - fi - ;; -esac - -if [ -x "$basedir/node" ]; then - exec "$basedir/node" "$basedir/../node-gyp-build/optional.js" "$@" -else - exec node "$basedir/../node-gyp-build/optional.js" "$@" -fi diff --git a/server/node_modules/.bin/node-gyp-build-optional.cmd b/server/node_modules/.bin/node-gyp-build-optional.cmd deleted file mode 100644 index 74d85f2..0000000 --- a/server/node_modules/.bin/node-gyp-build-optional.cmd +++ /dev/null @@ -1,17 +0,0 @@ -@ECHO off -GOTO start -:find_dp0 -SET dp0=%~dp0 -EXIT /b -:start -SETLOCAL -CALL :find_dp0 - -IF EXIST "%dp0%\node.exe" ( - SET "_prog=%dp0%\node.exe" -) ELSE ( - SET "_prog=node" - SET PATHEXT=%PATHEXT:;.JS;=;% -) - -endLocal & goto #_undefined_# 2>NUL || title %COMSPEC% & "%_prog%" "%dp0%\..\node-gyp-build\optional.js" %* diff --git a/server/node_modules/.bin/node-gyp-build-optional.ps1 b/server/node_modules/.bin/node-gyp-build-optional.ps1 deleted file mode 100644 index 45995c3..0000000 --- a/server/node_modules/.bin/node-gyp-build-optional.ps1 +++ /dev/null @@ -1,28 +0,0 @@ -#!/usr/bin/env pwsh -$basedir=Split-Path $MyInvocation.MyCommand.Definition -Parent - -$exe="" -if ($PSVersionTable.PSVersion -lt "6.0" -or $IsWindows) { - # Fix case when both the Windows and Linux builds of Node - # are installed in the same directory - $exe=".exe" -} -$ret=0 -if (Test-Path "$basedir/node$exe") { - # Support pipeline input - if ($MyInvocation.ExpectingInput) { - $input | & "$basedir/node$exe" "$basedir/../node-gyp-build/optional.js" $args - } else { - & "$basedir/node$exe" "$basedir/../node-gyp-build/optional.js" $args - } - $ret=$LASTEXITCODE -} else { - # Support pipeline input - if ($MyInvocation.ExpectingInput) { - $input | & "node$exe" "$basedir/../node-gyp-build/optional.js" $args - } else { - & "node$exe" "$basedir/../node-gyp-build/optional.js" $args - } - $ret=$LASTEXITCODE -} -exit $ret diff --git a/server/node_modules/.bin/node-gyp-build-test b/server/node_modules/.bin/node-gyp-build-test deleted file mode 100644 index bdf6dca..0000000 --- a/server/node_modules/.bin/node-gyp-build-test +++ /dev/null @@ -1,16 +0,0 @@ -#!/bin/sh -basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')") - -case `uname` in - *CYGWIN*|*MINGW*|*MSYS*) - if command -v cygpath > /dev/null 2>&1; then - basedir=`cygpath -w "$basedir"` - fi - ;; -esac - -if [ -x "$basedir/node" ]; then - exec "$basedir/node" "$basedir/../node-gyp-build/build-test.js" "$@" -else - exec node "$basedir/../node-gyp-build/build-test.js" "$@" -fi diff --git a/server/node_modules/.bin/node-gyp-build-test.cmd b/server/node_modules/.bin/node-gyp-build-test.cmd deleted file mode 100644 index 182a757..0000000 --- a/server/node_modules/.bin/node-gyp-build-test.cmd +++ /dev/null @@ -1,17 +0,0 @@ -@ECHO off -GOTO start -:find_dp0 -SET dp0=%~dp0 -EXIT /b -:start -SETLOCAL -CALL :find_dp0 - -IF EXIST "%dp0%\node.exe" ( - SET "_prog=%dp0%\node.exe" -) ELSE ( - SET "_prog=node" - SET PATHEXT=%PATHEXT:;.JS;=;% -) - -endLocal & goto #_undefined_# 2>NUL || title %COMSPEC% & "%_prog%" "%dp0%\..\node-gyp-build\build-test.js" %* diff --git a/server/node_modules/.bin/node-gyp-build-test.ps1 b/server/node_modules/.bin/node-gyp-build-test.ps1 deleted file mode 100644 index 6cb0b9b..0000000 --- a/server/node_modules/.bin/node-gyp-build-test.ps1 +++ /dev/null @@ -1,28 +0,0 @@ -#!/usr/bin/env pwsh -$basedir=Split-Path $MyInvocation.MyCommand.Definition -Parent - -$exe="" -if ($PSVersionTable.PSVersion -lt "6.0" -or $IsWindows) { - # Fix case when both the Windows and Linux builds of Node - # are installed in the same directory - $exe=".exe" -} -$ret=0 -if (Test-Path "$basedir/node$exe") { - # Support pipeline input - if ($MyInvocation.ExpectingInput) { - $input | & "$basedir/node$exe" "$basedir/../node-gyp-build/build-test.js" $args - } else { - & "$basedir/node$exe" "$basedir/../node-gyp-build/build-test.js" $args - } - $ret=$LASTEXITCODE -} else { - # Support pipeline input - if ($MyInvocation.ExpectingInput) { - $input | & "node$exe" "$basedir/../node-gyp-build/build-test.js" $args - } else { - & "node$exe" "$basedir/../node-gyp-build/build-test.js" $args - } - $ret=$LASTEXITCODE -} -exit $ret diff --git a/server/node_modules/.bin/node-gyp-build.cmd b/server/node_modules/.bin/node-gyp-build.cmd deleted file mode 100644 index ac854a6..0000000 --- a/server/node_modules/.bin/node-gyp-build.cmd +++ /dev/null @@ -1,17 +0,0 @@ -@ECHO off -GOTO start -:find_dp0 -SET dp0=%~dp0 -EXIT /b -:start -SETLOCAL -CALL :find_dp0 - -IF EXIST "%dp0%\node.exe" ( - SET "_prog=%dp0%\node.exe" -) ELSE ( - SET "_prog=node" - SET PATHEXT=%PATHEXT:;.JS;=;% -) - -endLocal & goto #_undefined_# 2>NUL || title %COMSPEC% & "%_prog%" "%dp0%\..\node-gyp-build\bin.js" %* diff --git a/server/node_modules/.bin/node-gyp-build.ps1 b/server/node_modules/.bin/node-gyp-build.ps1 deleted file mode 100644 index c1f9a9a..0000000 --- a/server/node_modules/.bin/node-gyp-build.ps1 +++ /dev/null @@ -1,28 +0,0 @@ -#!/usr/bin/env pwsh -$basedir=Split-Path $MyInvocation.MyCommand.Definition -Parent - -$exe="" -if ($PSVersionTable.PSVersion -lt "6.0" -or $IsWindows) { - # Fix case when both the Windows and Linux builds of Node - # are installed in the same directory - $exe=".exe" -} -$ret=0 -if (Test-Path "$basedir/node$exe") { - # Support pipeline input - if ($MyInvocation.ExpectingInput) { - $input | & "$basedir/node$exe" "$basedir/../node-gyp-build/bin.js" $args - } else { - & "$basedir/node$exe" "$basedir/../node-gyp-build/bin.js" $args - } - $ret=$LASTEXITCODE -} else { - # Support pipeline input - if ($MyInvocation.ExpectingInput) { - $input | & "node$exe" "$basedir/../node-gyp-build/bin.js" $args - } else { - & "node$exe" "$basedir/../node-gyp-build/bin.js" $args - } - $ret=$LASTEXITCODE -} -exit $ret diff --git a/server/node_modules/.package-lock.json b/server/node_modules/.package-lock.json deleted file mode 100644 index 9069940..0000000 --- a/server/node_modules/.package-lock.json +++ /dev/null @@ -1,66 +0,0 @@ -{ - "name": "chatcrypt-server", - "version": "1.0.0", - "lockfileVersion": 3, - "requires": true, - "packages": { - "node_modules/bufferutil": { - "version": "4.0.9", - "resolved": "https://registry.npmjs.org/bufferutil/-/bufferutil-4.0.9.tgz", - "integrity": "sha512-WDtdLmJvAuNNPzByAYpRo2rF1Mmradw6gvWsQKf63476DDXmomT9zUiGypLcG4ibIM67vhAj8jJRdbmEws2Aqw==", - "hasInstallScript": true, - "license": "MIT", - "dependencies": { - "node-gyp-build": "^4.3.0" - }, - "engines": { - "node": ">=6.14.2" - } - }, - "node_modules/node-gyp-build": { - "version": "4.8.4", - "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.8.4.tgz", - "integrity": "sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==", - "license": "MIT", - "bin": { - "node-gyp-build": "bin.js", - "node-gyp-build-optional": "optional.js", - "node-gyp-build-test": "build-test.js" - } - }, - "node_modules/utf-8-validate": { - "version": "5.0.10", - "resolved": "https://registry.npmjs.org/utf-8-validate/-/utf-8-validate-5.0.10.tgz", - "integrity": "sha512-Z6czzLq4u8fPOyx7TU6X3dvUZVvoJmxSQ+IcrlmagKhilxlhZgxPK6C5Jqbkw1IDUmFTM+cz9QDnnLTwDz/2gQ==", - "hasInstallScript": true, - "license": "MIT", - "dependencies": { - "node-gyp-build": "^4.3.0" - }, - "engines": { - "node": ">=6.14.2" - } - }, - "node_modules/ws": { - "version": "7.5.10", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", - "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", - "license": "MIT", - "engines": { - "node": ">=8.3.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": "^5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - } - } -} diff --git a/server/node_modules/bufferutil/LICENSE b/server/node_modules/bufferutil/LICENSE deleted file mode 100644 index 1da5b96..0000000 --- a/server/node_modules/bufferutil/LICENSE +++ /dev/null @@ -1,20 +0,0 @@ -Copyright (c) 2011 Einar Otto Stangvik -Copyright (c) 2013 Arnout Kazemier and contributors -Copyright (c) 2016 Luigi Pinca and contributors - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of -the Software, and to permit persons to whom the Software is furnished to do so, -subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/server/node_modules/bufferutil/README.md b/server/node_modules/bufferutil/README.md deleted file mode 100644 index feb6318..0000000 --- a/server/node_modules/bufferutil/README.md +++ /dev/null @@ -1,79 +0,0 @@ -# bufferutil - -[![Version npm](https://img.shields.io/npm/v/bufferutil.svg?logo=npm)](https://www.npmjs.com/package/bufferutil) -[![Linux/macOS/Windows Build](https://img.shields.io/github/actions/workflow/status/websockets/bufferutil/ci.yml?branch=master&label=build&logo=github)](https://github.com/websockets/bufferutil/actions?query=workflow%3ACI+branch%3Amaster) - -`bufferutil` is what makes `ws` fast. It provides some utilities to efficiently -perform some operations such as masking and unmasking the data payload of -WebSocket frames. - -## Installation - -``` -npm install bufferutil --save-optional -``` - -The `--save-optional` flag tells npm to save the package in your package.json -under the -[`optionalDependencies`](https://docs.npmjs.com/files/package.json#optionaldependencies) -key. - -## API - -The module exports two functions. To maximize performance, parameters are not -validated. It is the caller's responsibility to ensure that they are correct. - -### `bufferUtil.mask(source, mask, output, offset, length)` - -Masks a buffer using the given masking-key as specified by the WebSocket -protocol. - -#### Arguments - -- `source` - The buffer to mask. -- `mask` - A buffer representing the masking-key. -- `output` - The buffer where to store the result. -- `offset` - The offset at which to start writing. -- `length` - The number of bytes to mask. - -#### Example - -```js -'use strict'; - -const bufferUtil = require('bufferutil'); -const crypto = require('crypto'); - -const source = crypto.randomBytes(10); -const mask = crypto.randomBytes(4); - -bufferUtil.mask(source, mask, source, 0, source.length); -``` - -### `bufferUtil.unmask(buffer, mask)` - -Unmasks a buffer using the given masking-key as specified by the WebSocket -protocol. - -#### Arguments - -- `buffer` - The buffer to unmask. -- `mask` - A buffer representing the masking-key. - -#### Example - -```js -'use strict'; - -const bufferUtil = require('bufferutil'); -const crypto = require('crypto'); - -const buffer = crypto.randomBytes(10); -const mask = crypto.randomBytes(4); - -bufferUtil.unmask(buffer, mask); -``` - -## License - -[MIT](LICENSE) diff --git a/server/node_modules/bufferutil/binding.gyp b/server/node_modules/bufferutil/binding.gyp deleted file mode 100644 index cb8bb99..0000000 --- a/server/node_modules/bufferutil/binding.gyp +++ /dev/null @@ -1,32 +0,0 @@ -{ - 'variables': { - 'openssl_fips': '' - }, - 'targets': [ - { - 'target_name': 'bufferutil', - 'sources': ['src/bufferutil.c'], - 'cflags': ['-std=c99'], - 'conditions': [ - ["OS=='mac'", { - 'variables': { - 'clang_version': - '&1 | perl -ne \'print $1 if /clang version ([0-9]+(\\.[0-9]+){2,})/\')' - }, - 'xcode_settings': { - 'MACOSX_DEPLOYMENT_TARGET': '10.7' - }, - 'conditions': [ - # Use Perl v-strings to compare versions. - ['clang_version and { - for (var i = 0; i < length; i++) { - output[offset + i] = source[i] ^ mask[i & 3]; - } -}; - -/** - * Unmasks a buffer using the given mask. - * - * @param {Buffer} buffer The buffer to unmask - * @param {Buffer} mask The mask to use - * @public - */ -const unmask = (buffer, mask) => { - // Required until https://github.com/nodejs/node/issues/9006 is resolved. - const length = buffer.length; - for (var i = 0; i < length; i++) { - buffer[i] ^= mask[i & 3]; - } -}; - -module.exports = { mask, unmask }; diff --git a/server/node_modules/bufferutil/index.js b/server/node_modules/bufferutil/index.js deleted file mode 100644 index 8c30561..0000000 --- a/server/node_modules/bufferutil/index.js +++ /dev/null @@ -1,7 +0,0 @@ -'use strict'; - -try { - module.exports = require('node-gyp-build')(__dirname); -} catch (e) { - module.exports = require('./fallback'); -} diff --git a/server/node_modules/bufferutil/package.json b/server/node_modules/bufferutil/package.json deleted file mode 100644 index 0d77b90..0000000 --- a/server/node_modules/bufferutil/package.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "name": "bufferutil", - "version": "4.0.9", - "description": "WebSocket buffer utils", - "main": "index.js", - "engines": { - "node": ">=6.14.2" - }, - "scripts": { - "install": "node-gyp-build", - "prebuild": "prebuildify --napi --strip --target=8.11.2", - "prebuild-darwin-x64+arm64": "prebuildify --arch x64+arm64 --napi --strip --target=8.11.2", - "test": "mocha" - }, - "repository": { - "type": "git", - "url": "https://github.com/websockets/bufferutil" - }, - "keywords": [ - "bufferutil" - ], - "author": "Einar Otto Stangvik (http://2x.io)", - "license": "MIT", - "bugs": { - "url": "https://github.com/websockets/bufferutil/issues" - }, - "homepage": "https://github.com/websockets/bufferutil", - "dependencies": { - "node-gyp-build": "^4.3.0" - }, - "devDependencies": { - "mocha": "^11.0.1", - "node-gyp": "^11.0.0", - "prebuildify": "^6.0.0" - } -} diff --git a/server/node_modules/bufferutil/prebuilds/darwin-x64+arm64/bufferutil.node b/server/node_modules/bufferutil/prebuilds/darwin-x64+arm64/bufferutil.node deleted file mode 100644 index ad68cd1dd2bcbd6f79cb0e52c786369198f636d8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 66976 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 diff --git a/server/node_modules/bufferutil/prebuilds/win32-ia32/bufferutil.node b/server/node_modules/bufferutil/prebuilds/win32-ia32/bufferutil.node deleted file mode 100644 index 4c93be101d3479c26629fef5a9fbc8ade5d925c3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 126976 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%0AUQ!YX{Ke-s}TU#f?ce=7Y{A7hc5 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 diff --git a/server/node_modules/bufferutil/src/bufferutil.c b/server/node_modules/bufferutil/src/bufferutil.c deleted file mode 100644 index b89f8dd..0000000 --- a/server/node_modules/bufferutil/src/bufferutil.c +++ /dev/null @@ -1,171 +0,0 @@ -#define NAPI_VERSION 1 -#include -#include - -napi_value Mask(napi_env env, napi_callback_info info) { - napi_status status; - size_t argc = 5; - napi_value argv[5]; - - status = napi_get_cb_info(env, info, &argc, argv, NULL, NULL); - assert(status == napi_ok); - - uint8_t *source; - uint8_t *mask; - uint8_t *destination; - uint32_t offset; - uint32_t length; - - status = napi_get_buffer_info(env, argv[0], (void **)&source, NULL); - assert(status == napi_ok); - - status = napi_get_buffer_info(env, argv[1], (void **)&mask, NULL); - assert(status == napi_ok); - - status = napi_get_buffer_info(env, argv[2], (void **)&destination, NULL); - assert(status == napi_ok); - - status = napi_get_value_uint32(env, argv[3], &offset); - assert(status == napi_ok); - - status = napi_get_value_uint32(env, argv[4], &length); - assert(status == napi_ok); - - destination += offset; - uint32_t index = 0; - - // - // Alignment preamble. - // - while (index < length && ((size_t)source % 8)) { - *destination++ = *source++ ^ mask[index % 4]; - index++; - } - - length -= index; - if (!length) - return NULL; - - // - // Realign mask and convert to 64 bit. - // - uint8_t maskAlignedArray[8]; - - for (uint8_t i = 0; i < 8; i++, index++) { - maskAlignedArray[i] = mask[index % 4]; - } - - // - // Apply 64 bit mask in 8 byte chunks. - // - uint32_t loop = length / 8; - uint64_t *pMask8 = (uint64_t *)maskAlignedArray; - - while (loop--) { - uint64_t *pFrom8 = (uint64_t *)source; - uint64_t *pTo8 = (uint64_t *)destination; - *pTo8 = *pFrom8 ^ *pMask8; - source += 8; - destination += 8; - } - - // - // Apply mask to remaining data. - // - uint8_t *pmaskAlignedArray = maskAlignedArray; - - length %= 8; - while (length--) { - *destination++ = *source++ ^ *pmaskAlignedArray++; - } - - return NULL; -} - -napi_value Unmask(napi_env env, napi_callback_info info) { - napi_status status; - size_t argc = 2; - napi_value argv[2]; - - status = napi_get_cb_info(env, info, &argc, argv, NULL, NULL); - assert(status == napi_ok); - - uint8_t *source; - size_t length; - uint8_t *mask; - - status = napi_get_buffer_info(env, argv[0], (void **)&source, &length); - assert(status == napi_ok); - - status = napi_get_buffer_info(env, argv[1], (void **)&mask, NULL); - assert(status == napi_ok); - - uint32_t index = 0; - - // - // Alignment preamble. - // - while (index < length && ((size_t)source % 8)) { - *source++ ^= mask[index % 4]; - index++; - } - - length -= index; - if (!length) - return NULL; - - // - // Realign mask and convert to 64 bit. - // - uint8_t maskAlignedArray[8]; - - for (uint8_t i = 0; i < 8; i++, index++) { - maskAlignedArray[i] = mask[index % 4]; - } - - // - // Apply 64 bit mask in 8 byte chunks. - // - uint32_t loop = length / 8; - uint64_t *pMask8 = (uint64_t *)maskAlignedArray; - - while (loop--) { - uint64_t *pSource8 = (uint64_t *)source; - *pSource8 ^= *pMask8; - source += 8; - } - - // - // Apply mask to remaining data. - // - uint8_t *pmaskAlignedArray = maskAlignedArray; - - length %= 8; - while (length--) { - *source++ ^= *pmaskAlignedArray++; - } - - return NULL; -} - -napi_value Init(napi_env env, napi_value exports) { - napi_status status; - napi_value mask; - napi_value unmask; - - status = napi_create_function(env, NULL, 0, Mask, NULL, &mask); - assert(status == napi_ok); - - status = napi_create_function(env, NULL, 0, Unmask, NULL, &unmask); - assert(status == napi_ok); - - status = napi_set_named_property(env, exports, "mask", mask); - assert(status == napi_ok); - - status = napi_set_named_property(env, exports, "unmask", unmask); - assert(status == napi_ok); - - return exports; -} - -NAPI_MODULE(NODE_GYP_MODULE_NAME, Init) diff --git a/server/node_modules/node-gyp-build/LICENSE b/server/node_modules/node-gyp-build/LICENSE deleted file mode 100644 index 56fce08..0000000 --- a/server/node_modules/node-gyp-build/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2017 Mathias Buus - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. diff --git a/server/node_modules/node-gyp-build/README.md b/server/node_modules/node-gyp-build/README.md deleted file mode 100644 index f712ca6..0000000 --- a/server/node_modules/node-gyp-build/README.md +++ /dev/null @@ -1,58 +0,0 @@ -# node-gyp-build - -> Build tool and bindings loader for [`node-gyp`][node-gyp] that supports prebuilds. - -``` -npm install node-gyp-build -``` - -[![Test](https://github.com/prebuild/node-gyp-build/actions/workflows/test.yml/badge.svg)](https://github.com/prebuild/node-gyp-build/actions/workflows/test.yml) - -Use together with [`prebuildify`][prebuildify] to easily support prebuilds for your native modules. - -## Usage - -> **Note.** Prebuild names have changed in [`prebuildify@3`][prebuildify] and `node-gyp-build@4`. Please see the documentation below. - -`node-gyp-build` works similar to [`node-gyp build`][node-gyp] except that it will check if a build or prebuild is present before rebuilding your project. - -It's main intended use is as an npm install script and bindings loader for native modules that bundle prebuilds using [`prebuildify`][prebuildify]. - -First add `node-gyp-build` as an install script to your native project - -``` js -{ - ... - "scripts": { - "install": "node-gyp-build" - } -} -``` - -Then in your `index.js`, instead of using the [`bindings`](https://www.npmjs.com/package/bindings) module use `node-gyp-build` to load your binding. - -``` js -var binding = require('node-gyp-build')(__dirname) -``` - -If you do these two things and bundle prebuilds with [`prebuildify`][prebuildify] your native module will work for most platforms -without having to compile on install time AND will work in both node and electron without the need to recompile between usage. - -Users can override `node-gyp-build` and force compiling by doing `npm install --build-from-source`. - -Prebuilds will be attempted loaded from `MODULE_PATH/prebuilds/...` and then next `EXEC_PATH/prebuilds/...` (the latter allowing use with `zeit/pkg`) - -## Supported prebuild names - -If so desired you can bundle more specific flavors, for example `musl` builds to support Alpine, or targeting a numbered ARM architecture version. - -These prebuilds can be bundled in addition to generic prebuilds; `node-gyp-build` will try to find the most specific flavor first. Prebuild filenames are composed of _tags_. The runtime tag takes precedence, as does an `abi` tag over `napi`. For more details on tags, please see [`prebuildify`][prebuildify]. - -Values for the `libc` and `armv` tags are auto-detected but can be overridden through the `LIBC` and `ARM_VERSION` environment variables, respectively. - -## License - -MIT - -[prebuildify]: https://github.com/prebuild/prebuildify -[node-gyp]: https://www.npmjs.com/package/node-gyp diff --git a/server/node_modules/node-gyp-build/SECURITY.md b/server/node_modules/node-gyp-build/SECURITY.md deleted file mode 100644 index da9c516..0000000 --- a/server/node_modules/node-gyp-build/SECURITY.md +++ /dev/null @@ -1,5 +0,0 @@ -## Security contact information - -To report a security vulnerability, please use the -[Tidelift security contact](https://tidelift.com/security). -Tidelift will coordinate the fix and disclosure. diff --git a/server/node_modules/node-gyp-build/bin.js b/server/node_modules/node-gyp-build/bin.js deleted file mode 100644 index c778e0a..0000000 --- a/server/node_modules/node-gyp-build/bin.js +++ /dev/null @@ -1,84 +0,0 @@ -#!/usr/bin/env node - -var proc = require('child_process') -var os = require('os') -var path = require('path') - -if (!buildFromSource()) { - proc.exec('node-gyp-build-test', function (err, stdout, stderr) { - if (err) { - if (verbose()) console.error(stderr) - preinstall() - } - }) -} else { - preinstall() -} - -function build () { - var win32 = os.platform() === 'win32' - var shell = win32 - var args = [win32 ? 'node-gyp.cmd' : 'node-gyp', 'rebuild'] - - try { - var pkg = require('node-gyp/package.json') - args = [ - process.execPath, - path.join(require.resolve('node-gyp/package.json'), '..', typeof pkg.bin === 'string' ? pkg.bin : pkg.bin['node-gyp']), - 'rebuild' - ] - shell = false - } catch (_) {} - - proc.spawn(args[0], args.slice(1), { stdio: 'inherit', shell, windowsHide: true }).on('exit', function (code) { - if (code || !process.argv[3]) process.exit(code) - exec(process.argv[3]).on('exit', function (code) { - process.exit(code) - }) - }) -} - -function preinstall () { - if (!process.argv[2]) return build() - exec(process.argv[2]).on('exit', function (code) { - if (code) process.exit(code) - build() - }) -} - -function exec (cmd) { - if (process.platform !== 'win32') { - var shell = os.platform() === 'android' ? 'sh' : true - return proc.spawn(cmd, [], { - shell, - stdio: 'inherit' - }) - } - - return proc.spawn(cmd, [], { - windowsVerbatimArguments: true, - stdio: 'inherit', - shell: true, - windowsHide: true - }) -} - -function buildFromSource () { - return hasFlag('--build-from-source') || process.env.npm_config_build_from_source === 'true' -} - -function verbose () { - return hasFlag('--verbose') || process.env.npm_config_loglevel === 'verbose' -} - -// TODO (next major): remove in favor of env.npm_config_* which works since npm -// 0.1.8 while npm_config_argv will stop working in npm 7. See npm/rfcs#90 -function hasFlag (flag) { - if (!process.env.npm_config_argv) return false - - try { - return JSON.parse(process.env.npm_config_argv).original.indexOf(flag) !== -1 - } catch (_) { - return false - } -} diff --git a/server/node_modules/node-gyp-build/build-test.js b/server/node_modules/node-gyp-build/build-test.js deleted file mode 100644 index b6622a5..0000000 --- a/server/node_modules/node-gyp-build/build-test.js +++ /dev/null @@ -1,19 +0,0 @@ -#!/usr/bin/env node - -process.env.NODE_ENV = 'test' - -var path = require('path') -var test = null - -try { - var pkg = require(path.join(process.cwd(), 'package.json')) - if (pkg.name && process.env[pkg.name.toUpperCase().replace(/-/g, '_')]) { - process.exit(0) - } - test = pkg.prebuild.test -} catch (err) { - // do nothing -} - -if (test) require(path.join(process.cwd(), test)) -else require('./')() diff --git a/server/node_modules/node-gyp-build/index.js b/server/node_modules/node-gyp-build/index.js deleted file mode 100644 index 07eb14f..0000000 --- a/server/node_modules/node-gyp-build/index.js +++ /dev/null @@ -1,6 +0,0 @@ -const runtimeRequire = typeof __webpack_require__ === 'function' ? __non_webpack_require__ : require // eslint-disable-line -if (typeof runtimeRequire.addon === 'function') { // if the platform supports native resolving prefer that - module.exports = runtimeRequire.addon.bind(runtimeRequire) -} else { // else use the runtime version here - module.exports = require('./node-gyp-build.js') -} diff --git a/server/node_modules/node-gyp-build/node-gyp-build.js b/server/node_modules/node-gyp-build/node-gyp-build.js deleted file mode 100644 index 76b96e1..0000000 --- a/server/node_modules/node-gyp-build/node-gyp-build.js +++ /dev/null @@ -1,207 +0,0 @@ -var fs = require('fs') -var path = require('path') -var os = require('os') - -// Workaround to fix webpack's build warnings: 'the request of a dependency is an expression' -var runtimeRequire = typeof __webpack_require__ === 'function' ? __non_webpack_require__ : require // eslint-disable-line - -var vars = (process.config && process.config.variables) || {} -var prebuildsOnly = !!process.env.PREBUILDS_ONLY -var abi = process.versions.modules // TODO: support old node where this is undef -var runtime = isElectron() ? 'electron' : (isNwjs() ? 'node-webkit' : 'node') - -var arch = process.env.npm_config_arch || os.arch() -var platform = process.env.npm_config_platform || os.platform() -var libc = process.env.LIBC || (isAlpine(platform) ? 'musl' : 'glibc') -var armv = process.env.ARM_VERSION || (arch === 'arm64' ? '8' : vars.arm_version) || '' -var uv = (process.versions.uv || '').split('.')[0] - -module.exports = load - -function load (dir) { - return runtimeRequire(load.resolve(dir)) -} - -load.resolve = load.path = function (dir) { - dir = path.resolve(dir || '.') - - try { - var name = runtimeRequire(path.join(dir, 'package.json')).name.toUpperCase().replace(/-/g, '_') - if (process.env[name + '_PREBUILD']) dir = process.env[name + '_PREBUILD'] - } catch (err) {} - - if (!prebuildsOnly) { - var release = getFirst(path.join(dir, 'build/Release'), matchBuild) - if (release) return release - - var debug = getFirst(path.join(dir, 'build/Debug'), matchBuild) - if (debug) return debug - } - - var prebuild = resolve(dir) - if (prebuild) return prebuild - - var nearby = resolve(path.dirname(process.execPath)) - if (nearby) return nearby - - var target = [ - 'platform=' + platform, - 'arch=' + arch, - 'runtime=' + runtime, - 'abi=' + abi, - 'uv=' + uv, - armv ? 'armv=' + armv : '', - 'libc=' + libc, - 'node=' + process.versions.node, - process.versions.electron ? 'electron=' + process.versions.electron : '', - typeof __webpack_require__ === 'function' ? 'webpack=true' : '' // eslint-disable-line - ].filter(Boolean).join(' ') - - throw new Error('No native build was found for ' + target + '\n loaded from: ' + dir + '\n') - - function resolve (dir) { - // Find matching "prebuilds/-" directory - var tuples = readdirSync(path.join(dir, 'prebuilds')).map(parseTuple) - var tuple = tuples.filter(matchTuple(platform, arch)).sort(compareTuples)[0] - if (!tuple) return - - // Find most specific flavor first - var prebuilds = path.join(dir, 'prebuilds', tuple.name) - var parsed = readdirSync(prebuilds).map(parseTags) - var candidates = parsed.filter(matchTags(runtime, abi)) - var winner = candidates.sort(compareTags(runtime))[0] - if (winner) return path.join(prebuilds, winner.file) - } -} - -function readdirSync (dir) { - try { - return fs.readdirSync(dir) - } catch (err) { - return [] - } -} - -function getFirst (dir, filter) { - var files = readdirSync(dir).filter(filter) - return files[0] && path.join(dir, files[0]) -} - -function matchBuild (name) { - return /\.node$/.test(name) -} - -function parseTuple (name) { - // Example: darwin-x64+arm64 - var arr = name.split('-') - if (arr.length !== 2) return - - var platform = arr[0] - var architectures = arr[1].split('+') - - if (!platform) return - if (!architectures.length) return - if (!architectures.every(Boolean)) return - - return { name, platform, architectures } -} - -function matchTuple (platform, arch) { - return function (tuple) { - if (tuple == null) return false - if (tuple.platform !== platform) return false - return tuple.architectures.includes(arch) - } -} - -function compareTuples (a, b) { - // Prefer single-arch prebuilds over multi-arch - return a.architectures.length - b.architectures.length -} - -function parseTags (file) { - var arr = file.split('.') - var extension = arr.pop() - var tags = { file: file, specificity: 0 } - - if (extension !== 'node') return - - for (var i = 0; i < arr.length; i++) { - var tag = arr[i] - - if (tag === 'node' || tag === 'electron' || tag === 'node-webkit') { - tags.runtime = tag - } else if (tag === 'napi') { - tags.napi = true - } else if (tag.slice(0, 3) === 'abi') { - tags.abi = tag.slice(3) - } else if (tag.slice(0, 2) === 'uv') { - tags.uv = tag.slice(2) - } else if (tag.slice(0, 4) === 'armv') { - tags.armv = tag.slice(4) - } else if (tag === 'glibc' || tag === 'musl') { - tags.libc = tag - } else { - continue - } - - tags.specificity++ - } - - return tags -} - -function matchTags (runtime, abi) { - return function (tags) { - if (tags == null) return false - if (tags.runtime && tags.runtime !== runtime && !runtimeAgnostic(tags)) return false - if (tags.abi && tags.abi !== abi && !tags.napi) return false - if (tags.uv && tags.uv !== uv) return false - if (tags.armv && tags.armv !== armv) return false - if (tags.libc && tags.libc !== libc) return false - - return true - } -} - -function runtimeAgnostic (tags) { - return tags.runtime === 'node' && tags.napi -} - -function compareTags (runtime) { - // Precedence: non-agnostic runtime, abi over napi, then by specificity. - return function (a, b) { - if (a.runtime !== b.runtime) { - return a.runtime === runtime ? -1 : 1 - } else if (a.abi !== b.abi) { - return a.abi ? -1 : 1 - } else if (a.specificity !== b.specificity) { - return a.specificity > b.specificity ? -1 : 1 - } else { - return 0 - } - } -} - -function isNwjs () { - return !!(process.versions && process.versions.nw) -} - -function isElectron () { - if (process.versions && process.versions.electron) return true - if (process.env.ELECTRON_RUN_AS_NODE) return true - return typeof window !== 'undefined' && window.process && window.process.type === 'renderer' -} - -function isAlpine (platform) { - return platform === 'linux' && fs.existsSync('/etc/alpine-release') -} - -// Exposed for unit tests -// TODO: move to lib -load.parseTags = parseTags -load.matchTags = matchTags -load.compareTags = compareTags -load.parseTuple = parseTuple -load.matchTuple = matchTuple -load.compareTuples = compareTuples diff --git a/server/node_modules/node-gyp-build/optional.js b/server/node_modules/node-gyp-build/optional.js deleted file mode 100644 index 8daa04a..0000000 --- a/server/node_modules/node-gyp-build/optional.js +++ /dev/null @@ -1,7 +0,0 @@ -#!/usr/bin/env node - -/* -I am only useful as an install script to make node-gyp not compile for purely optional native deps -*/ - -process.exit(0) diff --git a/server/node_modules/node-gyp-build/package.json b/server/node_modules/node-gyp-build/package.json deleted file mode 100644 index 6f6f28b..0000000 --- a/server/node_modules/node-gyp-build/package.json +++ /dev/null @@ -1,43 +0,0 @@ -{ - "name": "node-gyp-build", - "version": "4.8.4", - "description": "Build tool and bindings loader for node-gyp that supports prebuilds", - "main": "index.js", - "imports": { - "fs": { - "bare": "builtin:fs", - "default": "fs" - }, - "path": { - "bare": "builtin:path", - "default": "path" - }, - "os": { - "bare": "builtin:os", - "default": "os" - } - }, - "devDependencies": { - "array-shuffle": "^1.0.1", - "standard": "^14.0.0", - "tape": "^5.0.0" - }, - "scripts": { - "test": "standard && node test" - }, - "bin": { - "node-gyp-build": "./bin.js", - "node-gyp-build-optional": "./optional.js", - "node-gyp-build-test": "./build-test.js" - }, - "repository": { - "type": "git", - "url": "https://github.com/prebuild/node-gyp-build.git" - }, - "author": "Mathias Buus (@mafintosh)", - "license": "MIT", - "bugs": { - "url": "https://github.com/prebuild/node-gyp-build/issues" - }, - "homepage": "https://github.com/prebuild/node-gyp-build" -} diff --git a/server/node_modules/utf-8-validate/LICENSE b/server/node_modules/utf-8-validate/LICENSE deleted file mode 100644 index 710d09f..0000000 --- a/server/node_modules/utf-8-validate/LICENSE +++ /dev/null @@ -1,30 +0,0 @@ -This project is licensed for use as follows: - -""" -Copyright (c) 2011 Einar Otto Stangvik (http://2x.io) - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of -the Software, and to permit persons to whom the Software is furnished to do so, -subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -""" - -This license applies to parts originating from -https://www.cl.cam.ac.uk/~mgk25/ucs/utf8_check.c: - -""" -Markus Kuhn -- 2005-03-30 -License: http://www.cl.cam.ac.uk/~mgk25/short-license.html -""" diff --git a/server/node_modules/utf-8-validate/README.md b/server/node_modules/utf-8-validate/README.md deleted file mode 100644 index 3a95ff8..0000000 --- a/server/node_modules/utf-8-validate/README.md +++ /dev/null @@ -1,50 +0,0 @@ -# utf-8-validate - -[![Version npm](https://img.shields.io/npm/v/utf-8-validate.svg?logo=npm)](https://www.npmjs.com/package/utf-8-validate) -[![Linux/macOS/Windows Build](https://img.shields.io/github/workflow/status/websockets/utf-8-validate/CI/master?label=build&logo=github)](https://github.com/websockets/utf-8-validate/actions?query=workflow%3ACI+branch%3Amaster) - -Check if a buffer contains valid UTF-8 encoded text. - -## Installation - -``` -npm install utf-8-validate --save-optional -``` - -The `--save-optional` flag tells npm to save the package in your package.json -under the -[`optionalDependencies`](https://docs.npmjs.com/files/package.json#optionaldependencies) -key. - -## API - -The module exports a single function which takes one argument. - -### `isValidUTF8(buffer)` - -Checks whether a buffer contains valid UTF-8. - -#### Arguments - -- `buffer` - The buffer to check. - -#### Return value - -`true` if the buffer contains only correct UTF-8, else `false`. - -#### Example - -```js -'use strict'; - -const isValidUTF8 = require('utf-8-validate'); - -const buf = Buffer.from([0xf0, 0x90, 0x80, 0x80]); - -console.log(isValidUTF8(buf)); -// => true -``` - -## License - -[MIT](LICENSE) diff --git a/server/node_modules/utf-8-validate/binding.gyp b/server/node_modules/utf-8-validate/binding.gyp deleted file mode 100644 index 30edf27..0000000 --- a/server/node_modules/utf-8-validate/binding.gyp +++ /dev/null @@ -1,18 +0,0 @@ -{ - 'targets': [ - { - 'target_name': 'validation', - 'sources': ['src/validation.c'], - 'cflags': ['-std=c99'], - 'conditions': [ - ["OS=='mac'", { - 'xcode_settings': { - 'MACOSX_DEPLOYMENT_TARGET': '10.7', - 'OTHER_CFLAGS': ['-arch x86_64', '-arch arm64'], - 'OTHER_LDFLAGS': ['-arch x86_64', '-arch arm64'] - } - }] - ] - } - ] -} diff --git a/server/node_modules/utf-8-validate/fallback.js b/server/node_modules/utf-8-validate/fallback.js deleted file mode 100644 index c493d49..0000000 --- a/server/node_modules/utf-8-validate/fallback.js +++ /dev/null @@ -1,62 +0,0 @@ -'use strict'; - -/** - * Checks if a given buffer contains only correct UTF-8. - * Ported from https://www.cl.cam.ac.uk/%7Emgk25/ucs/utf8_check.c by - * Markus Kuhn. - * - * @param {Buffer} buf The buffer to check - * @return {Boolean} `true` if `buf` contains only correct UTF-8, else `false` - * @public - */ -function isValidUTF8(buf) { - const len = buf.length; - let i = 0; - - while (i < len) { - if ((buf[i] & 0x80) === 0x00) { // 0xxxxxxx - i++; - } else if ((buf[i] & 0xe0) === 0xc0) { // 110xxxxx 10xxxxxx - if ( - i + 1 === len || - (buf[i + 1] & 0xc0) !== 0x80 || - (buf[i] & 0xfe) === 0xc0 // overlong - ) { - return false; - } - - i += 2; - } else if ((buf[i] & 0xf0) === 0xe0) { // 1110xxxx 10xxxxxx 10xxxxxx - if ( - i + 2 >= len || - (buf[i + 1] & 0xc0) !== 0x80 || - (buf[i + 2] & 0xc0) !== 0x80 || - buf[i] === 0xe0 && (buf[i + 1] & 0xe0) === 0x80 || // overlong - buf[i] === 0xed && (buf[i + 1] & 0xe0) === 0xa0 // surrogate (U+D800 - U+DFFF) - ) { - return false; - } - - i += 3; - } else if ((buf[i] & 0xf8) === 0xf0) { // 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx - if ( - i + 3 >= len || - (buf[i + 1] & 0xc0) !== 0x80 || - (buf[i + 2] & 0xc0) !== 0x80 || - (buf[i + 3] & 0xc0) !== 0x80 || - buf[i] === 0xf0 && (buf[i + 1] & 0xf0) === 0x80 || // overlong - buf[i] === 0xf4 && buf[i + 1] > 0x8f || buf[i] > 0xf4 // > U+10FFFF - ) { - return false; - } - - i += 4; - } else { - return false; - } - } - - return true; -} - -module.exports = isValidUTF8; diff --git a/server/node_modules/utf-8-validate/index.js b/server/node_modules/utf-8-validate/index.js deleted file mode 100644 index 8c30561..0000000 --- a/server/node_modules/utf-8-validate/index.js +++ /dev/null @@ -1,7 +0,0 @@ -'use strict'; - -try { - module.exports = require('node-gyp-build')(__dirname); -} catch (e) { - module.exports = require('./fallback'); -} diff --git a/server/node_modules/utf-8-validate/package.json b/server/node_modules/utf-8-validate/package.json deleted file mode 100644 index 149e652..0000000 --- a/server/node_modules/utf-8-validate/package.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "name": "utf-8-validate", - "version": "5.0.10", - "description": "Check if a buffer contains valid UTF-8", - "main": "index.js", - "engines": { - "node": ">=6.14.2" - }, - "scripts": { - "install": "node-gyp-build", - "prebuild": "prebuildify --napi --strip --target=14.0.0", - "prebuild-darwin-x64+arm64": "prebuildify --arch x64+arm64 --napi --strip --target=14.0.0", - "test": "mocha" - }, - "repository": { - "type": "git", - "url": "https://github.com/websockets/utf-8-validate" - }, - "keywords": [ - "utf-8-validate" - ], - "author": "Einar Otto Stangvik (http://2x.io)", - "license": "MIT", - "bugs": { - "url": "https://github.com/websockets/utf-8-validate/issues" - }, - "homepage": "https://github.com/websockets/utf-8-validate", - "dependencies": { - "node-gyp-build": "^4.3.0" - }, - "devDependencies": { - "mocha": "^10.0.0", - "node-gyp": "^9.1.0", - "prebuildify": "^5.0.0" - } -} diff --git a/server/node_modules/utf-8-validate/prebuilds/darwin-x64+arm64/node.napi.node b/server/node_modules/utf-8-validate/prebuilds/darwin-x64+arm64/node.napi.node deleted file mode 100644 index bed98d4a43a56135c659459c59f7e74e0b9ac269..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 116000 zcmeI5e{@vGb;oCS1+0X`3Plb-4Az2;BN=-oxnN`)$OrQ%1;1&u9fB*=900@8p2!H?xfB*=900@8p2!H?xfB*=900@8p2!H?xfB*=9 z00@8p2!H?xfB*=900@8p2!H?xfB*=900@8p2!H?xfB*=900@8p2!H?xfB*=900@A< z|1E*zS1*px!G8-K{1 zejHD>20|MH5%S57_j47mL5*jfuv{;r^7BVykziYk^2m;N*FwExx#~A`BVa~sGD;b5 z+Z=3blEJp-u%>77i>Y|^Dgf)*F^t$Or3|#n=7?`YK(}V+cTB~rP|#RcOJfd`Zu34l zO}bjm|S_UaFMbtB%@n5G=@WRV=Qvhc)VA&;?B&A*OM=@Fp88d zVbiu770>S0Jqy(U*3Iw9@zQfqTgs5{lj&OXqFF)hIKCNK~+r(0STPYC7AfR3(HsNHR&Xlq83pOx4+;|0k6`EyM}Z z$5XAR%Eg$2efb@-S+I{$1}V-&LovzQsm=4exM$|#i_br>XHRMS{Y|3i%Xg8jkp0Hd zYFYBN|HTSY*_Y=NwuAKdWD(`@Xrw$8Y~<>nJ=<03YT8Oo&7b!`+Fz8=7SHrwxiuOK zY;Y}7LpZ9qn<~#+NcplXQ#x}%0Ra#I0T2KI5C8!X009sH0T2KI5C8!X009sH0T2KI z5C8!X009sH0T2KI5C8!X009sH0T2KI5C8!X009sH0T2KI5C8!X009sHf&UGGRi2*r zs#mY{bpA(0UC)ST$C$sTV@{qO!qZcm^c<}n;4@mD-c<)NtgCoJtLj(4|a?UkP`p1 zx(DBMbUjJko&P@4kz$*p>+_`k`Qv$(#IFYuA0`~#OGu|!*7KLCySb0YU+NecBqiSB z>20@q9(=>mc{e%LI9~SVS!#Mtb-q8)F_It$M>l^$n}S)5U?XI8CsKp)BF&Ey(fqpJ z*X@$?+`^b8Yc$J0ATQmG5$ zJUvG*SSwSNSIFje?0kdP?=-JnfL^wHAbziBN9}3Pj)MKPl%5^Ao`)Yz#;1Eae_HYR z>L=D7p=cLgPoAO~le_s5;ztRMbd)5hDR@88W-9db7VN&3N-gbubg1%5<=eD%k}2w@ z_<0n6h~gElJ(7HtOwBH1Z5<_UeSGhNFVN&`&%c+|U8CanE-0fJJ-u^Xnkbk<;>jo0 zB>QjbKTJL3&+A8-<*HOb1G`u|k-|Bmke0{geFNzyc; zFEwi;9XL$QifGT6_S~dBw`k9&wC8quw%$wr=kK9MD<9cB@8s4xZhewl+qsp`t)1MW z0aTXuP9LUes#m6FS;*4Y%Et5Wr&6ibVs5=lt-9!HUntnL%KJ!_*u*VgEEsNc`9(D5 zi^ZeP1q+;QzKuZ{UN7qCAgge>%A*l~d4}tCML)MWjpw0amYflv`<_FRt8s>#+q9l^ zrqU{k_0yM@dOdy14DHkPg6w*+JhehtwiH?l^T*lwf8#DP^BfHy(u?rB=;P>(Clo$o zU0g8sGo3kqLBZLthH8Q~9hdv5trf#hsqDvl_M6HteWvsVemlvpPx;MIyk0 ze4nznDqVF$fB*=900@8p2!H?xfB*=900@8p2!H?xfB*=900@8p2!H?xfB*=900@8p z2!H?xfB*=900@8p2!H?xfB*=900@8p2!H?xfB*=900@8p2!H?xfB*=900@8p2oQmZ zGbT4wuN0!lEv2OU9Q^C0zjeKAiTff=;<0vnpPRmC-9$a{M%hT;pASStAA@V3tc~zR zqk%|FMq+JbZg*xyY4!y}Y%g8tmf8&w{z$+V3us?D=PM+*ufphS3B+V$I2;Q2G<#Ks zJ>J|Lh|p)!o5MWDZSM0ortKcXPTy3IhXOJZXbI9MwzZTkvQCT@R?}4$Q~0imJ8WVg zMz>4!ZPmBKKbLM?Um>;IJ*4?M5ZW}REs(K=w8hV`=$q=sJ3+Ua_khV_TK(%*W8HO2_KJ_% zwGm%a`gj9Ld*?oa<-99h6in9SZMO$xR`7nhvB(>8)+>-XLRlmQCq=uH2~X zA!RJECB`kiWXEfGShvsTgXmOPPak4uLykzWFbZE*5O0hc>Zts7F4Vh>lvy{&v#WUY z?po2~$<{zHXuKEpKshP3KC}q5D zGu^+S-*qrLzZX=z$5jBUcPLlj>@eZZX$VkxN_`5s#3Ou zP0M=Ic3azbT}nF1PcIpaX}3g-idRVEx$r#(Tv%6IM$`Fj19QoIPg74q zwcSc)>E`!j4=F=F8Qr>}F&vT`V-b~?8p|S~x2tra>E^un?gevhQa1TwKEv5qhwFM( zLT}eA6YJ)9%A6Mbo*t@FF0EU(q_(Ec*!Tm=#jT{$o&4jZLO*S-Y6?AOQsxz`4Cw1y zNK(_;M#ViK#6gmmNS2c1eK477>0u%Gw^aI?5GP3Tof7p_xfpY>FTaDC1NWOtlHwGa z4XS-RNuKAnS5IHboAkh!UjBW}J;ixn_=sV3+T&YZYRr>f<3LK1Y4@acJ*>DJ4aR$hIq2jXx`^4g{tavHu~9wf(GJ zc*}A{|EFob#UG`-iz(Ji1=EVoblBPt+l1FeeP^g|&p6=?)BL}s@h8SiEh@2E+bv}K z-3PMjcciB%RtM$y7Ugh=#`-AtGh`baBfN)xp!5!F`#RFg=skJ9BSR_gr)a+Owu1fI z{G{K>^G}>!bmp+F-9>({Sv*%?qdcoVq8J^N$8mZe&M#ph z+euq{HRra#+HNPkY@(iv|8mMp2M8$_`+hpcSIld|Ih~#K+|+Y6ece{kx(!&w+(8?! z`x8UF59*3VLmBM@_O(#FYujq}U0%L;AMKm|0h>HEo5nb)-bR&<^6pG^ij&v2S@vC{ z{cz{SR3XQBkM@Oy=Ce}ey+h{|ckU825ABa@+p71`7%kRJvJVtlwJ~(8y7=0*L$oKU zFHdN;vr5{=iwchW+W5qZ5*lOpC31DY-AW$G)%_M(6Dv4B!_RHk{d`Jx+I7FDEr}I$ z9@Ol&k>{B)PWN9tPWQ7GBvx3+kNfJ!TN{M6O@pA)9`K~uX=wd?69 z<^+28d+B%2ZOW&Z&&zV#PVIH7O@}*+x2ra<=T2&W*RHd>^qE8ZIG=-Kg_awS9ZseA zlkZxbE7UHgw)q3;n|z@lo%E%T-MjoE8uP{CQRjjM&Nko1pbW1U+85PbuJUNaU!LK5 zUD40BPNTTQMmVW*aZ**sMsxVAJfBhJ`ZaY0Wq(00@8p2!H?xfB*=9 z00@8p2!H?xfB*=900@8p2!H?xfB*=900@8p2!H?xfB*=900@8p2!H?xfB*=900@8p z2!H?xfB*=900@8p2!H?xfB*=900@8p2!H?x+=#%$8HJC{6rWqPQgs%&rIgW_&%a*! zTi45$xG&Nq9%~nU?xwAwChCbd%En+@Qy?Pxct}KOBYe?lAQF?2SR0um_N*w)zF>&$ zg$v!X&9^Zq{gHq#7Ld*HHh(M_*2YXW`dR`p*%%Io0zS>|%&^Csn*$LUY-Y-7m~6z&Y8O@_X4TfPm3kUfe}NE3gwrbWm3|B1PWNx(E$8D6 z?`jJ-1;j62*uCW3H|oFg%*FA;d&6rl7Yx5sf8RguUHg!X{BZ1F?WsNRrN8}NL->vJ z%>y~_oIJVSy1ZdbYWw%MKh^zVNCLL$P1Yp8m@(pL=KTH$J#D^ug=% zT$V@Y-S*YQ$O{{C?*7-v{F(N*N*|e@_{jO;<>O!c!K~i+&maEo-nq}WZ2P-+pZhQW zt>XW&{lf8LV&T`HpZf9|$JrNGzcR7&)K~txY;f21F8B9dnf~^oC4X%ETaDj5xXd;A moh8$M>Cdk(J38`D3qSezx4*Nq-u088c_(zgd*vlwxc>oXn2??T diff --git a/server/node_modules/utf-8-validate/prebuilds/linux-x64/node.napi.node b/server/node_modules/utf-8-validate/prebuilds/linux-x64/node.napi.node deleted file mode 100644 index bf547d8a764ac73f8da558f6af8793591467f3b0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6232 zcmc&&Z){W76~DGa2#~}E(Kh_)@H*IFT^|XMHKEO#0D%{jOq3-9tqre^?IbRV&Fp6g zlz}xTv}tCIF*dcGCb6xm(7qH+h^^~~8i82aX_DJ&Q>1NL+O3nVGS%%i76ME5JNMn= zJYGTDhiSXk^SS4D{@(lUJ@3AEytRG1+vO76JmL#NaupWRtOOH_Swo0s(IDpIf4NvD zb?42AKGqwmvLL2H_$5Fw%5fEyyjW%7Oefq@O-w4vcEplhMYScbsP@Ya)0`R#Q#A}x z1}(bAmE1{JOD{q&C0%N}-ZMkgAFh<_$LJ;t7EIahQP@$Q|7r6n#oa32o#w@-=7Xsk zjvU)k`0(J`@x?Cj=&IA1LpS&AtK9l6*UK-R|IFUa?>|N%NKQlH`9GWWdwgZh3kahr zU4m;%>#wiA`o~j8hw7G1PJDIm%9`sZj=qxlu=@SCKTxv{B}e-guIb_2N234*_g%O~y@<39f_ zQZEwniF-uOfd`F1Kt&n~j`_gh4cX$hR{ny&yw?gm{Vs>J8i z`YlNfqi--4H4RCh7fG1mcxT7ffmk%$8R!`ZTe90r zjNnj!90Ud;N5Y~l@nv*EU7gz-L^N<9V)TVgBiMsDy|Fo1rfCR>KKfpF z;W!j}HSelnDe|t`hVf*YegHAl<~>hpjZ@Gxmtlx6%(sSE)jc~oXViU(Mm5L7K0tPv z`mabg>ty6Hg}AT#7s zsgE_C0++uRBgpIcyE3l;-bLmq8qHrX!6n8+>fME28mPs$*1g_Zmj(JIee{N&>6p|r zU0K}42K^VUS-K4&eXMNFT6FZ$)_h$y|K!Z<>`2x-vIqA>A4@{NBL|ytee@6cV@kGC z$~tmzJeC~SUrVW`H(oq=ub$aep*Ox6@76~iE>G^!M{|G=6|8*fuEEy?fM)OME9COG z|FpvW7`fHXZQo3L1tP9rWPrVnGmJh#m_=A?wTuXX# zvL!W@^$uUdFf5=5VA4B0QUay`6qBj;%q~w`;~U;|0#mfjd!fDD)jB#34_U}l-jT;G zcw4!94x{;o>b7#v9JUEqYP#qh{v{%$rvK(0IY*&V*T3m~x&|^#LRrCuj=DeXnPzue z`zH&&C2kH_Y8s2L;2P3_H#yfl-GQ{u{zK@P~ zm4JU2`5*osJ95n>`!ulhyECb2Owm)8p}PVK)u)eDEiCh6v>iqJx}Czh{Rl=Q+2mdNSl1L5 z(NbPS#pEYnzl4N(tcahoBGytwDognnV3!}kpH{kA76Jjo^>+UVJj2d)*KhbSHut*g_sv+bY*2xx*H1t|6amMdkd8lbG?p}MYV5xbGp*A^nm_C@4Bg=-i$TAsh8&d#dxr%2u+Q$3?bYk}I7dZ?FMtf)n0rN(E8%}Sro5H*%~?qsH()5=Vo zRdQZGd{((f;b&DK#-CA%aGrh@Z-LV1cvuQD|Gi2d%T)48T@)3+LCLQxp2wx!{m%)% zH#-BLP!sT7MPE|%f}&Rx{f(l3R@CW-&!0}5d7d9Wk222ZQ0D&~-LZA+X8+o*o@CTa z`XAKlwb}6R?QXNpRSc?wj!1lcFnQ}f9m(~#P zPu`F8JR#p~&vk?;*A1x1#_N!Idhe$_%=Wx*nSNR+a{jExv=wry3Cwd{U`qK>bLMZM zLUbw_+jAXa%5{k2JI7B)4f4H3Ipn%lq6#PbyKp(}`+?D%aDC#s&y?#WRAh7B{~%Di z{Q*@Un5HbV(my{Zm_{A;MP<*F^JNFjGd<+6FAY#B-0w)3ydA2%rkuz7_B|F=jRlE_syvd%j0G{&MOXEQek`k zo-sj5p{=z@>7VVHUWUYOFVs1LKT7N>Sy~;oWBMzHJwFGZPzm-s?EMa&UK_|4=g;2( r$CW+DVKX%y%!&*k2R)_7^IdHbOQ;uy{{ZPe!#}1;;b`1XuVqej< diff --git a/server/node_modules/utf-8-validate/prebuilds/win32-ia32/node.napi.node b/server/node_modules/utf-8-validate/prebuilds/win32-ia32/node.napi.node deleted file mode 100644 index bb40b239d877c876cba0bf7d386d96c091c4a47c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 121856 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%0D* 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 F{{USO@H7Ab diff --git a/server/node_modules/utf-8-validate/src/validation.c b/server/node_modules/utf-8-validate/src/validation.c deleted file mode 100644 index dd260b1..0000000 --- a/server/node_modules/utf-8-validate/src/validation.c +++ /dev/null @@ -1,109 +0,0 @@ -#define NAPI_VERSION 1 -#include -#include -#include - -napi_value IsValidUTF8(napi_env env, napi_callback_info info) { - napi_status status; - size_t argc = 1; - napi_value argv[1]; - - status = napi_get_cb_info(env, info, &argc, argv, NULL, NULL); - assert(status == napi_ok); - - uint8_t *buf; - size_t len; - - status = napi_get_buffer_info(env, argv[0], (void **)&buf, &len); - assert(status == napi_ok); - - size_t i = 0; - - // - // This code has been taken from utf8_check.c which was developed by - // Markus Kuhn . - // - // For original code / licensing please refer to - // https://www.cl.cam.ac.uk/%7Emgk25/ucs/utf8_check.c - // - while (i < len) { - size_t j = i + 8; - - if (j <= len) { - // - // Read 8 bytes and check if they are ASCII. - // - uint64_t chunk; - memcpy(&chunk, buf + i, 8); - - if ((chunk & 0x8080808080808080) == 0x00) { - i = j; - continue; - } - } - - while ((buf[i] & 0x80) == 0x00) { // 0xxxxxxx - if (++i == len) { - goto exit; - } - } - - if ((buf[i] & 0xe0) == 0xc0) { // 110xxxxx 10xxxxxx - if ( - i + 1 == len || - (buf[i + 1] & 0xc0) != 0x80 || - (buf[i] & 0xfe) == 0xc0 // overlong - ) { - break; - } - - i += 2; - } else if ((buf[i] & 0xf0) == 0xe0) { // 1110xxxx 10xxxxxx 10xxxxxx - if ( - i + 2 >= len || - (buf[i + 1] & 0xc0) != 0x80 || - (buf[i + 2] & 0xc0) != 0x80 || - (buf[i] == 0xe0 && (buf[i + 1] & 0xe0) == 0x80) || // overlong - (buf[i] == 0xed && (buf[i + 1] & 0xe0) == 0xa0) // surrogate (U+D800 - U+DFFF) - ) { - break; - } - - i += 3; - } else if ((buf[i] & 0xf8) == 0xf0) { // 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx - if ( - i + 3 >= len || - (buf[i + 1] & 0xc0) != 0x80 || - (buf[i + 2] & 0xc0) != 0x80 || - (buf[i + 3] & 0xc0) != 0x80 || - (buf[i] == 0xf0 && (buf[i + 1] & 0xf0) == 0x80) || // overlong - (buf[i] == 0xf4 && buf[i + 1] > 0x8f) || buf[i] > 0xf4 // > U+10FFFF - ) { - break; - } - - i += 4; - } else { - break; - } - } - -exit:; - napi_value result; - status = napi_get_boolean(env, i == len, &result); - assert(status == napi_ok); - - return result; -} - -napi_value Init(napi_env env, napi_value exports) { - napi_status status; - napi_value isValidUTF8; - - status = napi_create_function(env, NULL, 0, IsValidUTF8, NULL, &isValidUTF8); - assert(status == napi_ok); - - return isValidUTF8; -} - -NAPI_MODULE(NODE_GYP_MODULE_NAME, Init) diff --git a/server/node_modules/ws/LICENSE b/server/node_modules/ws/LICENSE deleted file mode 100644 index a145cd1..0000000 --- a/server/node_modules/ws/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2011 Einar Otto Stangvik - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/server/node_modules/ws/README.md b/server/node_modules/ws/README.md deleted file mode 100644 index 20a6114..0000000 --- a/server/node_modules/ws/README.md +++ /dev/null @@ -1,495 +0,0 @@ -# ws: a Node.js WebSocket library - -[![Version npm](https://img.shields.io/npm/v/ws.svg?logo=npm)](https://www.npmjs.com/package/ws) -[![CI](https://img.shields.io/github/workflow/status/websockets/ws/CI/master?label=CI&logo=github)](https://github.com/websockets/ws/actions?query=workflow%3ACI+branch%3Amaster) -[![Coverage Status](https://img.shields.io/coveralls/websockets/ws/master.svg?logo=coveralls)](https://coveralls.io/github/websockets/ws) - -ws is a simple to use, blazing fast, and thoroughly tested WebSocket client and -server implementation. - -Passes the quite extensive Autobahn test suite: [server][server-report], -[client][client-report]. - -**Note**: This module does not work in the browser. The client in the docs is a -reference to a back end with the role of a client in the WebSocket -communication. Browser clients must use the native -[`WebSocket`](https://developer.mozilla.org/en-US/docs/Web/API/WebSocket) -object. To make the same code work seamlessly on Node.js and the browser, you -can use one of the many wrappers available on npm, like -[isomorphic-ws](https://github.com/heineiuo/isomorphic-ws). - -## Table of Contents - -- [Protocol support](#protocol-support) -- [Installing](#installing) - - [Opt-in for performance](#opt-in-for-performance) -- [API docs](#api-docs) -- [WebSocket compression](#websocket-compression) -- [Usage examples](#usage-examples) - - [Sending and receiving text data](#sending-and-receiving-text-data) - - [Sending binary data](#sending-binary-data) - - [Simple server](#simple-server) - - [External HTTP/S server](#external-https-server) - - [Multiple servers sharing a single HTTP/S server](#multiple-servers-sharing-a-single-https-server) - - [Client authentication](#client-authentication) - - [Server broadcast](#server-broadcast) - - [echo.websocket.org demo](#echowebsocketorg-demo) - - [Use the Node.js streams API](#use-the-nodejs-streams-api) - - [Other examples](#other-examples) -- [FAQ](#faq) - - [How to get the IP address of the client?](#how-to-get-the-ip-address-of-the-client) - - [How to detect and close broken connections?](#how-to-detect-and-close-broken-connections) - - [How to connect via a proxy?](#how-to-connect-via-a-proxy) -- [Changelog](#changelog) -- [License](#license) - -## Protocol support - -- **HyBi drafts 07-12** (Use the option `protocolVersion: 8`) -- **HyBi drafts 13-17** (Current default, alternatively option - `protocolVersion: 13`) - -## Installing - -``` -npm install ws -``` - -### Opt-in for performance - -There are 2 optional modules that can be installed along side with the ws -module. These modules are binary addons which improve certain operations. -Prebuilt binaries are available for the most popular platforms so you don't -necessarily need to have a C++ compiler installed on your machine. - -- `npm install --save-optional bufferutil`: Allows to efficiently perform - operations such as masking and unmasking the data payload of the WebSocket - frames. -- `npm install --save-optional utf-8-validate`: Allows to efficiently check if a - message contains valid UTF-8. - -## API docs - -See [`/doc/ws.md`](./doc/ws.md) for Node.js-like documentation of ws classes and -utility functions. - -## WebSocket compression - -ws supports the [permessage-deflate extension][permessage-deflate] which enables -the client and server to negotiate a compression algorithm and its parameters, -and then selectively apply it to the data payloads of each WebSocket message. - -The extension is disabled by default on the server and enabled by default on the -client. It adds a significant overhead in terms of performance and memory -consumption so we suggest to enable it only if it is really needed. - -Note that Node.js has a variety of issues with high-performance compression, -where increased concurrency, especially on Linux, can lead to [catastrophic -memory fragmentation][node-zlib-bug] and slow performance. If you intend to use -permessage-deflate in production, it is worthwhile to set up a test -representative of your workload and ensure Node.js/zlib will handle it with -acceptable performance and memory usage. - -Tuning of permessage-deflate can be done via the options defined below. You can -also use `zlibDeflateOptions` and `zlibInflateOptions`, which is passed directly -into the creation of [raw deflate/inflate streams][node-zlib-deflaterawdocs]. - -See [the docs][ws-server-options] for more options. - -```js -const WebSocket = require('ws'); - -const wss = new WebSocket.Server({ - port: 8080, - perMessageDeflate: { - zlibDeflateOptions: { - // See zlib defaults. - chunkSize: 1024, - memLevel: 7, - level: 3 - }, - zlibInflateOptions: { - chunkSize: 10 * 1024 - }, - // Other options settable: - clientNoContextTakeover: true, // Defaults to negotiated value. - serverNoContextTakeover: true, // Defaults to negotiated value. - serverMaxWindowBits: 10, // Defaults to negotiated value. - // Below options specified as default values. - concurrencyLimit: 10, // Limits zlib concurrency for perf. - threshold: 1024 // Size (in bytes) below which messages - // should not be compressed. - } -}); -``` - -The client will only use the extension if it is supported and enabled on the -server. To always disable the extension on the client set the -`perMessageDeflate` option to `false`. - -```js -const WebSocket = require('ws'); - -const ws = new WebSocket('ws://www.host.com/path', { - perMessageDeflate: false -}); -``` - -## Usage examples - -### Sending and receiving text data - -```js -const WebSocket = require('ws'); - -const ws = new WebSocket('ws://www.host.com/path'); - -ws.on('open', function open() { - ws.send('something'); -}); - -ws.on('message', function incoming(data) { - console.log(data); -}); -``` - -### Sending binary data - -```js -const WebSocket = require('ws'); - -const ws = new WebSocket('ws://www.host.com/path'); - -ws.on('open', function open() { - const array = new Float32Array(5); - - for (var i = 0; i < array.length; ++i) { - array[i] = i / 2; - } - - ws.send(array); -}); -``` - -### Simple server - -```js -const WebSocket = require('ws'); - -const wss = new WebSocket.Server({ port: 8080 }); - -wss.on('connection', function connection(ws) { - ws.on('message', function incoming(message) { - console.log('received: %s', message); - }); - - ws.send('something'); -}); -``` - -### External HTTP/S server - -```js -const fs = require('fs'); -const https = require('https'); -const WebSocket = require('ws'); - -const server = https.createServer({ - cert: fs.readFileSync('/path/to/cert.pem'), - key: fs.readFileSync('/path/to/key.pem') -}); -const wss = new WebSocket.Server({ server }); - -wss.on('connection', function connection(ws) { - ws.on('message', function incoming(message) { - console.log('received: %s', message); - }); - - ws.send('something'); -}); - -server.listen(8080); -``` - -### Multiple servers sharing a single HTTP/S server - -```js -const http = require('http'); -const WebSocket = require('ws'); -const url = require('url'); - -const server = http.createServer(); -const wss1 = new WebSocket.Server({ noServer: true }); -const wss2 = new WebSocket.Server({ noServer: true }); - -wss1.on('connection', function connection(ws) { - // ... -}); - -wss2.on('connection', function connection(ws) { - // ... -}); - -server.on('upgrade', function upgrade(request, socket, head) { - const pathname = url.parse(request.url).pathname; - - if (pathname === '/foo') { - wss1.handleUpgrade(request, socket, head, function done(ws) { - wss1.emit('connection', ws, request); - }); - } else if (pathname === '/bar') { - wss2.handleUpgrade(request, socket, head, function done(ws) { - wss2.emit('connection', ws, request); - }); - } else { - socket.destroy(); - } -}); - -server.listen(8080); -``` - -### Client authentication - -```js -const http = require('http'); -const WebSocket = require('ws'); - -const server = http.createServer(); -const wss = new WebSocket.Server({ noServer: true }); - -wss.on('connection', function connection(ws, request, client) { - ws.on('message', function message(msg) { - console.log(`Received message ${msg} from user ${client}`); - }); -}); - -server.on('upgrade', function upgrade(request, socket, head) { - // This function is not defined on purpose. Implement it with your own logic. - authenticate(request, (err, client) => { - if (err || !client) { - socket.write('HTTP/1.1 401 Unauthorized\r\n\r\n'); - socket.destroy(); - return; - } - - wss.handleUpgrade(request, socket, head, function done(ws) { - wss.emit('connection', ws, request, client); - }); - }); -}); - -server.listen(8080); -``` - -Also see the provided [example][session-parse-example] using `express-session`. - -### Server broadcast - -A client WebSocket broadcasting to all connected WebSocket clients, including -itself. - -```js -const WebSocket = require('ws'); - -const wss = new WebSocket.Server({ port: 8080 }); - -wss.on('connection', function connection(ws) { - ws.on('message', function incoming(data) { - wss.clients.forEach(function each(client) { - if (client.readyState === WebSocket.OPEN) { - client.send(data); - } - }); - }); -}); -``` - -A client WebSocket broadcasting to every other connected WebSocket clients, -excluding itself. - -```js -const WebSocket = require('ws'); - -const wss = new WebSocket.Server({ port: 8080 }); - -wss.on('connection', function connection(ws) { - ws.on('message', function incoming(data) { - wss.clients.forEach(function each(client) { - if (client !== ws && client.readyState === WebSocket.OPEN) { - client.send(data); - } - }); - }); -}); -``` - -### echo.websocket.org demo - -```js -const WebSocket = require('ws'); - -const ws = new WebSocket('wss://echo.websocket.org/', { - origin: 'https://websocket.org' -}); - -ws.on('open', function open() { - console.log('connected'); - ws.send(Date.now()); -}); - -ws.on('close', function close() { - console.log('disconnected'); -}); - -ws.on('message', function incoming(data) { - console.log(`Roundtrip time: ${Date.now() - data} ms`); - - setTimeout(function timeout() { - ws.send(Date.now()); - }, 500); -}); -``` - -### Use the Node.js streams API - -```js -const WebSocket = require('ws'); - -const ws = new WebSocket('wss://echo.websocket.org/', { - origin: 'https://websocket.org' -}); - -const duplex = WebSocket.createWebSocketStream(ws, { encoding: 'utf8' }); - -duplex.pipe(process.stdout); -process.stdin.pipe(duplex); -``` - -### Other examples - -For a full example with a browser client communicating with a ws server, see the -examples folder. - -Otherwise, see the test cases. - -## FAQ - -### How to get the IP address of the client? - -The remote IP address can be obtained from the raw socket. - -```js -const WebSocket = require('ws'); - -const wss = new WebSocket.Server({ port: 8080 }); - -wss.on('connection', function connection(ws, req) { - const ip = req.socket.remoteAddress; -}); -``` - -When the server runs behind a proxy like NGINX, the de-facto standard is to use -the `X-Forwarded-For` header. - -```js -wss.on('connection', function connection(ws, req) { - const ip = req.headers['x-forwarded-for'].split(',')[0].trim(); -}); -``` - -### How to detect and close broken connections? - -Sometimes the link between the server and the client can be interrupted in a way -that keeps both the server and the client unaware of the broken state of the -connection (e.g. when pulling the cord). - -In these cases ping messages can be used as a means to verify that the remote -endpoint is still responsive. - -```js -const WebSocket = require('ws'); - -function noop() {} - -function heartbeat() { - this.isAlive = true; -} - -const wss = new WebSocket.Server({ port: 8080 }); - -wss.on('connection', function connection(ws) { - ws.isAlive = true; - ws.on('pong', heartbeat); -}); - -const interval = setInterval(function ping() { - wss.clients.forEach(function each(ws) { - if (ws.isAlive === false) return ws.terminate(); - - ws.isAlive = false; - ws.ping(noop); - }); -}, 30000); - -wss.on('close', function close() { - clearInterval(interval); -}); -``` - -Pong messages are automatically sent in response to ping messages as required by -the spec. - -Just like the server example above your clients might as well lose connection -without knowing it. You might want to add a ping listener on your clients to -prevent that. A simple implementation would be: - -```js -const WebSocket = require('ws'); - -function heartbeat() { - clearTimeout(this.pingTimeout); - - // Use `WebSocket#terminate()`, which immediately destroys the connection, - // instead of `WebSocket#close()`, which waits for the close timer. - // Delay should be equal to the interval at which your server - // sends out pings plus a conservative assumption of the latency. - this.pingTimeout = setTimeout(() => { - this.terminate(); - }, 30000 + 1000); -} - -const client = new WebSocket('wss://echo.websocket.org/'); - -client.on('open', heartbeat); -client.on('ping', heartbeat); -client.on('close', function clear() { - clearTimeout(this.pingTimeout); -}); -``` - -### How to connect via a proxy? - -Use a custom `http.Agent` implementation like [https-proxy-agent][] or -[socks-proxy-agent][]. - -## Changelog - -We're using the GitHub [releases][changelog] for changelog entries. - -## License - -[MIT](LICENSE) - -[changelog]: https://github.com/websockets/ws/releases -[client-report]: http://websockets.github.io/ws/autobahn/clients/ -[https-proxy-agent]: https://github.com/TooTallNate/node-https-proxy-agent -[node-zlib-bug]: https://github.com/nodejs/node/issues/8871 -[node-zlib-deflaterawdocs]: - https://nodejs.org/api/zlib.html#zlib_zlib_createdeflateraw_options -[permessage-deflate]: https://tools.ietf.org/html/rfc7692 -[server-report]: http://websockets.github.io/ws/autobahn/servers/ -[session-parse-example]: ./examples/express-session-parse -[socks-proxy-agent]: https://github.com/TooTallNate/node-socks-proxy-agent -[ws-server-options]: - https://github.com/websockets/ws/blob/master/doc/ws.md#new-websocketserveroptions-callback diff --git a/server/node_modules/ws/browser.js b/server/node_modules/ws/browser.js deleted file mode 100644 index ca4f628..0000000 --- a/server/node_modules/ws/browser.js +++ /dev/null @@ -1,8 +0,0 @@ -'use strict'; - -module.exports = function () { - throw new Error( - 'ws does not work in the browser. Browser clients must use the native ' + - 'WebSocket object' - ); -}; diff --git a/server/node_modules/ws/index.js b/server/node_modules/ws/index.js deleted file mode 100644 index 722c786..0000000 --- a/server/node_modules/ws/index.js +++ /dev/null @@ -1,10 +0,0 @@ -'use strict'; - -const WebSocket = require('./lib/websocket'); - -WebSocket.createWebSocketStream = require('./lib/stream'); -WebSocket.Server = require('./lib/websocket-server'); -WebSocket.Receiver = require('./lib/receiver'); -WebSocket.Sender = require('./lib/sender'); - -module.exports = WebSocket; diff --git a/server/node_modules/ws/lib/buffer-util.js b/server/node_modules/ws/lib/buffer-util.js deleted file mode 100644 index 6fd84c3..0000000 --- a/server/node_modules/ws/lib/buffer-util.js +++ /dev/null @@ -1,129 +0,0 @@ -'use strict'; - -const { EMPTY_BUFFER } = require('./constants'); - -/** - * Merges an array of buffers into a new buffer. - * - * @param {Buffer[]} list The array of buffers to concat - * @param {Number} totalLength The total length of buffers in the list - * @return {Buffer} The resulting buffer - * @public - */ -function concat(list, totalLength) { - if (list.length === 0) return EMPTY_BUFFER; - if (list.length === 1) return list[0]; - - const target = Buffer.allocUnsafe(totalLength); - let offset = 0; - - for (let i = 0; i < list.length; i++) { - const buf = list[i]; - target.set(buf, offset); - offset += buf.length; - } - - if (offset < totalLength) return target.slice(0, offset); - - return target; -} - -/** - * Masks a buffer using the given mask. - * - * @param {Buffer} source The buffer to mask - * @param {Buffer} mask The mask to use - * @param {Buffer} output The buffer where to store the result - * @param {Number} offset The offset at which to start writing - * @param {Number} length The number of bytes to mask. - * @public - */ -function _mask(source, mask, output, offset, length) { - for (let i = 0; i < length; i++) { - output[offset + i] = source[i] ^ mask[i & 3]; - } -} - -/** - * Unmasks a buffer using the given mask. - * - * @param {Buffer} buffer The buffer to unmask - * @param {Buffer} mask The mask to use - * @public - */ -function _unmask(buffer, mask) { - // Required until https://github.com/nodejs/node/issues/9006 is resolved. - const length = buffer.length; - for (let i = 0; i < length; i++) { - buffer[i] ^= mask[i & 3]; - } -} - -/** - * Converts a buffer to an `ArrayBuffer`. - * - * @param {Buffer} buf The buffer to convert - * @return {ArrayBuffer} Converted buffer - * @public - */ -function toArrayBuffer(buf) { - if (buf.byteLength === buf.buffer.byteLength) { - return buf.buffer; - } - - return buf.buffer.slice(buf.byteOffset, buf.byteOffset + buf.byteLength); -} - -/** - * Converts `data` to a `Buffer`. - * - * @param {*} data The data to convert - * @return {Buffer} The buffer - * @throws {TypeError} - * @public - */ -function toBuffer(data) { - toBuffer.readOnly = true; - - if (Buffer.isBuffer(data)) return data; - - let buf; - - if (data instanceof ArrayBuffer) { - buf = Buffer.from(data); - } else if (ArrayBuffer.isView(data)) { - buf = Buffer.from(data.buffer, data.byteOffset, data.byteLength); - } else { - buf = Buffer.from(data); - toBuffer.readOnly = false; - } - - return buf; -} - -try { - const bufferUtil = require('bufferutil'); - const bu = bufferUtil.BufferUtil || bufferUtil; - - module.exports = { - concat, - mask(source, mask, output, offset, length) { - if (length < 48) _mask(source, mask, output, offset, length); - else bu.mask(source, mask, output, offset, length); - }, - toArrayBuffer, - toBuffer, - unmask(buffer, mask) { - if (buffer.length < 32) _unmask(buffer, mask); - else bu.unmask(buffer, mask); - } - }; -} catch (e) /* istanbul ignore next */ { - module.exports = { - concat, - mask: _mask, - toArrayBuffer, - toBuffer, - unmask: _unmask - }; -} diff --git a/server/node_modules/ws/lib/constants.js b/server/node_modules/ws/lib/constants.js deleted file mode 100644 index 4082981..0000000 --- a/server/node_modules/ws/lib/constants.js +++ /dev/null @@ -1,10 +0,0 @@ -'use strict'; - -module.exports = { - BINARY_TYPES: ['nodebuffer', 'arraybuffer', 'fragments'], - GUID: '258EAFA5-E914-47DA-95CA-C5AB0DC85B11', - kStatusCode: Symbol('status-code'), - kWebSocket: Symbol('websocket'), - EMPTY_BUFFER: Buffer.alloc(0), - NOOP: () => {} -}; diff --git a/server/node_modules/ws/lib/event-target.js b/server/node_modules/ws/lib/event-target.js deleted file mode 100644 index a6fbe72..0000000 --- a/server/node_modules/ws/lib/event-target.js +++ /dev/null @@ -1,184 +0,0 @@ -'use strict'; - -/** - * Class representing an event. - * - * @private - */ -class Event { - /** - * Create a new `Event`. - * - * @param {String} type The name of the event - * @param {Object} target A reference to the target to which the event was - * dispatched - */ - constructor(type, target) { - this.target = target; - this.type = type; - } -} - -/** - * Class representing a message event. - * - * @extends Event - * @private - */ -class MessageEvent extends Event { - /** - * Create a new `MessageEvent`. - * - * @param {(String|Buffer|ArrayBuffer|Buffer[])} data The received data - * @param {WebSocket} target A reference to the target to which the event was - * dispatched - */ - constructor(data, target) { - super('message', target); - - this.data = data; - } -} - -/** - * Class representing a close event. - * - * @extends Event - * @private - */ -class CloseEvent extends Event { - /** - * Create a new `CloseEvent`. - * - * @param {Number} code The status code explaining why the connection is being - * closed - * @param {String} reason A human-readable string explaining why the - * connection is closing - * @param {WebSocket} target A reference to the target to which the event was - * dispatched - */ - constructor(code, reason, target) { - super('close', target); - - this.wasClean = target._closeFrameReceived && target._closeFrameSent; - this.reason = reason; - this.code = code; - } -} - -/** - * Class representing an open event. - * - * @extends Event - * @private - */ -class OpenEvent extends Event { - /** - * Create a new `OpenEvent`. - * - * @param {WebSocket} target A reference to the target to which the event was - * dispatched - */ - constructor(target) { - super('open', target); - } -} - -/** - * Class representing an error event. - * - * @extends Event - * @private - */ -class ErrorEvent extends Event { - /** - * Create a new `ErrorEvent`. - * - * @param {Object} error The error that generated this event - * @param {WebSocket} target A reference to the target to which the event was - * dispatched - */ - constructor(error, target) { - super('error', target); - - this.message = error.message; - this.error = error; - } -} - -/** - * This provides methods for emulating the `EventTarget` interface. It's not - * meant to be used directly. - * - * @mixin - */ -const EventTarget = { - /** - * Register an event listener. - * - * @param {String} type A string representing the event type to listen for - * @param {Function} listener The listener to add - * @param {Object} [options] An options object specifies characteristics about - * the event listener - * @param {Boolean} [options.once=false] A `Boolean`` indicating that the - * listener should be invoked at most once after being added. If `true`, - * the listener would be automatically removed when invoked. - * @public - */ - addEventListener(type, listener, options) { - if (typeof listener !== 'function') return; - - function onMessage(data) { - listener.call(this, new MessageEvent(data, this)); - } - - function onClose(code, message) { - listener.call(this, new CloseEvent(code, message, this)); - } - - function onError(error) { - listener.call(this, new ErrorEvent(error, this)); - } - - function onOpen() { - listener.call(this, new OpenEvent(this)); - } - - const method = options && options.once ? 'once' : 'on'; - - if (type === 'message') { - onMessage._listener = listener; - this[method](type, onMessage); - } else if (type === 'close') { - onClose._listener = listener; - this[method](type, onClose); - } else if (type === 'error') { - onError._listener = listener; - this[method](type, onError); - } else if (type === 'open') { - onOpen._listener = listener; - this[method](type, onOpen); - } else { - this[method](type, listener); - } - }, - - /** - * Remove an event listener. - * - * @param {String} type A string representing the event type to remove - * @param {Function} listener The listener to remove - * @public - */ - removeEventListener(type, listener) { - const listeners = this.listeners(type); - - for (let i = 0; i < listeners.length; i++) { - if (listeners[i] === listener || listeners[i]._listener === listener) { - this.removeListener(type, listeners[i]); - } - } - } -}; - -module.exports = EventTarget; diff --git a/server/node_modules/ws/lib/extension.js b/server/node_modules/ws/lib/extension.js deleted file mode 100644 index 87a4213..0000000 --- a/server/node_modules/ws/lib/extension.js +++ /dev/null @@ -1,223 +0,0 @@ -'use strict'; - -// -// Allowed token characters: -// -// '!', '#', '$', '%', '&', ''', '*', '+', '-', -// '.', 0-9, A-Z, '^', '_', '`', a-z, '|', '~' -// -// tokenChars[32] === 0 // ' ' -// tokenChars[33] === 1 // '!' -// tokenChars[34] === 0 // '"' -// ... -// -// prettier-ignore -const tokenChars = [ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 0 - 15 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 16 - 31 - 0, 1, 0, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0, 1, 1, 0, // 32 - 47 - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, // 48 - 63 - 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 64 - 79 - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, // 80 - 95 - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 96 - 111 - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0 // 112 - 127 -]; - -/** - * Adds an offer to the map of extension offers or a parameter to the map of - * parameters. - * - * @param {Object} dest The map of extension offers or parameters - * @param {String} name The extension or parameter name - * @param {(Object|Boolean|String)} elem The extension parameters or the - * parameter value - * @private - */ -function push(dest, name, elem) { - if (dest[name] === undefined) dest[name] = [elem]; - else dest[name].push(elem); -} - -/** - * Parses the `Sec-WebSocket-Extensions` header into an object. - * - * @param {String} header The field value of the header - * @return {Object} The parsed object - * @public - */ -function parse(header) { - const offers = Object.create(null); - - if (header === undefined || header === '') return offers; - - let params = Object.create(null); - let mustUnescape = false; - let isEscaping = false; - let inQuotes = false; - let extensionName; - let paramName; - let start = -1; - let end = -1; - let i = 0; - - for (; i < header.length; i++) { - const code = header.charCodeAt(i); - - if (extensionName === undefined) { - if (end === -1 && tokenChars[code] === 1) { - if (start === -1) start = i; - } else if (code === 0x20 /* ' ' */ || code === 0x09 /* '\t' */) { - if (end === -1 && start !== -1) end = i; - } else if (code === 0x3b /* ';' */ || code === 0x2c /* ',' */) { - if (start === -1) { - throw new SyntaxError(`Unexpected character at index ${i}`); - } - - if (end === -1) end = i; - const name = header.slice(start, end); - if (code === 0x2c) { - push(offers, name, params); - params = Object.create(null); - } else { - extensionName = name; - } - - start = end = -1; - } else { - throw new SyntaxError(`Unexpected character at index ${i}`); - } - } else if (paramName === undefined) { - if (end === -1 && tokenChars[code] === 1) { - if (start === -1) start = i; - } else if (code === 0x20 || code === 0x09) { - if (end === -1 && start !== -1) end = i; - } else if (code === 0x3b || code === 0x2c) { - if (start === -1) { - throw new SyntaxError(`Unexpected character at index ${i}`); - } - - if (end === -1) end = i; - push(params, header.slice(start, end), true); - if (code === 0x2c) { - push(offers, extensionName, params); - params = Object.create(null); - extensionName = undefined; - } - - start = end = -1; - } else if (code === 0x3d /* '=' */ && start !== -1 && end === -1) { - paramName = header.slice(start, i); - start = end = -1; - } else { - throw new SyntaxError(`Unexpected character at index ${i}`); - } - } else { - // - // The value of a quoted-string after unescaping must conform to the - // token ABNF, so only token characters are valid. - // Ref: https://tools.ietf.org/html/rfc6455#section-9.1 - // - if (isEscaping) { - if (tokenChars[code] !== 1) { - throw new SyntaxError(`Unexpected character at index ${i}`); - } - if (start === -1) start = i; - else if (!mustUnescape) mustUnescape = true; - isEscaping = false; - } else if (inQuotes) { - if (tokenChars[code] === 1) { - if (start === -1) start = i; - } else if (code === 0x22 /* '"' */ && start !== -1) { - inQuotes = false; - end = i; - } else if (code === 0x5c /* '\' */) { - isEscaping = true; - } else { - throw new SyntaxError(`Unexpected character at index ${i}`); - } - } else if (code === 0x22 && header.charCodeAt(i - 1) === 0x3d) { - inQuotes = true; - } else if (end === -1 && tokenChars[code] === 1) { - if (start === -1) start = i; - } else if (start !== -1 && (code === 0x20 || code === 0x09)) { - if (end === -1) end = i; - } else if (code === 0x3b || code === 0x2c) { - if (start === -1) { - throw new SyntaxError(`Unexpected character at index ${i}`); - } - - if (end === -1) end = i; - let value = header.slice(start, end); - if (mustUnescape) { - value = value.replace(/\\/g, ''); - mustUnescape = false; - } - push(params, paramName, value); - if (code === 0x2c) { - push(offers, extensionName, params); - params = Object.create(null); - extensionName = undefined; - } - - paramName = undefined; - start = end = -1; - } else { - throw new SyntaxError(`Unexpected character at index ${i}`); - } - } - } - - if (start === -1 || inQuotes) { - throw new SyntaxError('Unexpected end of input'); - } - - if (end === -1) end = i; - const token = header.slice(start, end); - if (extensionName === undefined) { - push(offers, token, params); - } else { - if (paramName === undefined) { - push(params, token, true); - } else if (mustUnescape) { - push(params, paramName, token.replace(/\\/g, '')); - } else { - push(params, paramName, token); - } - push(offers, extensionName, params); - } - - return offers; -} - -/** - * Builds the `Sec-WebSocket-Extensions` header field value. - * - * @param {Object} extensions The map of extensions and parameters to format - * @return {String} A string representing the given object - * @public - */ -function format(extensions) { - return Object.keys(extensions) - .map((extension) => { - let configurations = extensions[extension]; - if (!Array.isArray(configurations)) configurations = [configurations]; - return configurations - .map((params) => { - return [extension] - .concat( - Object.keys(params).map((k) => { - let values = params[k]; - if (!Array.isArray(values)) values = [values]; - return values - .map((v) => (v === true ? k : `${k}=${v}`)) - .join('; '); - }) - ) - .join('; '); - }) - .join(', '); - }) - .join(', '); -} - -module.exports = { format, parse }; diff --git a/server/node_modules/ws/lib/limiter.js b/server/node_modules/ws/lib/limiter.js deleted file mode 100644 index 3fd3578..0000000 --- a/server/node_modules/ws/lib/limiter.js +++ /dev/null @@ -1,55 +0,0 @@ -'use strict'; - -const kDone = Symbol('kDone'); -const kRun = Symbol('kRun'); - -/** - * A very simple job queue with adjustable concurrency. Adapted from - * https://github.com/STRML/async-limiter - */ -class Limiter { - /** - * Creates a new `Limiter`. - * - * @param {Number} [concurrency=Infinity] The maximum number of jobs allowed - * to run concurrently - */ - constructor(concurrency) { - this[kDone] = () => { - this.pending--; - this[kRun](); - }; - this.concurrency = concurrency || Infinity; - this.jobs = []; - this.pending = 0; - } - - /** - * Adds a job to the queue. - * - * @param {Function} job The job to run - * @public - */ - add(job) { - this.jobs.push(job); - this[kRun](); - } - - /** - * Removes a job from the queue and runs it if possible. - * - * @private - */ - [kRun]() { - if (this.pending === this.concurrency) return; - - if (this.jobs.length) { - const job = this.jobs.shift(); - - this.pending++; - job(this[kDone]); - } - } -} - -module.exports = Limiter; diff --git a/server/node_modules/ws/lib/permessage-deflate.js b/server/node_modules/ws/lib/permessage-deflate.js deleted file mode 100644 index ce91784..0000000 --- a/server/node_modules/ws/lib/permessage-deflate.js +++ /dev/null @@ -1,518 +0,0 @@ -'use strict'; - -const zlib = require('zlib'); - -const bufferUtil = require('./buffer-util'); -const Limiter = require('./limiter'); -const { kStatusCode, NOOP } = require('./constants'); - -const TRAILER = Buffer.from([0x00, 0x00, 0xff, 0xff]); -const kPerMessageDeflate = Symbol('permessage-deflate'); -const kTotalLength = Symbol('total-length'); -const kCallback = Symbol('callback'); -const kBuffers = Symbol('buffers'); -const kError = Symbol('error'); - -// -// We limit zlib concurrency, which prevents severe memory fragmentation -// as documented in https://github.com/nodejs/node/issues/8871#issuecomment-250915913 -// and https://github.com/websockets/ws/issues/1202 -// -// Intentionally global; it's the global thread pool that's an issue. -// -let zlibLimiter; - -/** - * permessage-deflate implementation. - */ -class PerMessageDeflate { - /** - * Creates a PerMessageDeflate instance. - * - * @param {Object} [options] Configuration options - * @param {Boolean} [options.serverNoContextTakeover=false] Request/accept - * disabling of server context takeover - * @param {Boolean} [options.clientNoContextTakeover=false] Advertise/ - * acknowledge disabling of client context takeover - * @param {(Boolean|Number)} [options.serverMaxWindowBits] Request/confirm the - * use of a custom server window size - * @param {(Boolean|Number)} [options.clientMaxWindowBits] Advertise support - * for, or request, a custom client window size - * @param {Object} [options.zlibDeflateOptions] Options to pass to zlib on - * deflate - * @param {Object} [options.zlibInflateOptions] Options to pass to zlib on - * inflate - * @param {Number} [options.threshold=1024] Size (in bytes) below which - * messages should not be compressed - * @param {Number} [options.concurrencyLimit=10] The number of concurrent - * calls to zlib - * @param {Boolean} [isServer=false] Create the instance in either server or - * client mode - * @param {Number} [maxPayload=0] The maximum allowed message length - */ - constructor(options, isServer, maxPayload) { - this._maxPayload = maxPayload | 0; - this._options = options || {}; - this._threshold = - this._options.threshold !== undefined ? this._options.threshold : 1024; - this._isServer = !!isServer; - this._deflate = null; - this._inflate = null; - - this.params = null; - - if (!zlibLimiter) { - const concurrency = - this._options.concurrencyLimit !== undefined - ? this._options.concurrencyLimit - : 10; - zlibLimiter = new Limiter(concurrency); - } - } - - /** - * @type {String} - */ - static get extensionName() { - return 'permessage-deflate'; - } - - /** - * Create an extension negotiation offer. - * - * @return {Object} Extension parameters - * @public - */ - offer() { - const params = {}; - - if (this._options.serverNoContextTakeover) { - params.server_no_context_takeover = true; - } - if (this._options.clientNoContextTakeover) { - params.client_no_context_takeover = true; - } - if (this._options.serverMaxWindowBits) { - params.server_max_window_bits = this._options.serverMaxWindowBits; - } - if (this._options.clientMaxWindowBits) { - params.client_max_window_bits = this._options.clientMaxWindowBits; - } else if (this._options.clientMaxWindowBits == null) { - params.client_max_window_bits = true; - } - - return params; - } - - /** - * Accept an extension negotiation offer/response. - * - * @param {Array} configurations The extension negotiation offers/reponse - * @return {Object} Accepted configuration - * @public - */ - accept(configurations) { - configurations = this.normalizeParams(configurations); - - this.params = this._isServer - ? this.acceptAsServer(configurations) - : this.acceptAsClient(configurations); - - return this.params; - } - - /** - * Releases all resources used by the extension. - * - * @public - */ - cleanup() { - if (this._inflate) { - this._inflate.close(); - this._inflate = null; - } - - if (this._deflate) { - const callback = this._deflate[kCallback]; - - this._deflate.close(); - this._deflate = null; - - if (callback) { - callback( - new Error( - 'The deflate stream was closed while data was being processed' - ) - ); - } - } - } - - /** - * Accept an extension negotiation offer. - * - * @param {Array} offers The extension negotiation offers - * @return {Object} Accepted configuration - * @private - */ - acceptAsServer(offers) { - const opts = this._options; - const accepted = offers.find((params) => { - if ( - (opts.serverNoContextTakeover === false && - params.server_no_context_takeover) || - (params.server_max_window_bits && - (opts.serverMaxWindowBits === false || - (typeof opts.serverMaxWindowBits === 'number' && - opts.serverMaxWindowBits > params.server_max_window_bits))) || - (typeof opts.clientMaxWindowBits === 'number' && - !params.client_max_window_bits) - ) { - return false; - } - - return true; - }); - - if (!accepted) { - throw new Error('None of the extension offers can be accepted'); - } - - if (opts.serverNoContextTakeover) { - accepted.server_no_context_takeover = true; - } - if (opts.clientNoContextTakeover) { - accepted.client_no_context_takeover = true; - } - if (typeof opts.serverMaxWindowBits === 'number') { - accepted.server_max_window_bits = opts.serverMaxWindowBits; - } - if (typeof opts.clientMaxWindowBits === 'number') { - accepted.client_max_window_bits = opts.clientMaxWindowBits; - } else if ( - accepted.client_max_window_bits === true || - opts.clientMaxWindowBits === false - ) { - delete accepted.client_max_window_bits; - } - - return accepted; - } - - /** - * Accept the extension negotiation response. - * - * @param {Array} response The extension negotiation response - * @return {Object} Accepted configuration - * @private - */ - acceptAsClient(response) { - const params = response[0]; - - if ( - this._options.clientNoContextTakeover === false && - params.client_no_context_takeover - ) { - throw new Error('Unexpected parameter "client_no_context_takeover"'); - } - - if (!params.client_max_window_bits) { - if (typeof this._options.clientMaxWindowBits === 'number') { - params.client_max_window_bits = this._options.clientMaxWindowBits; - } - } else if ( - this._options.clientMaxWindowBits === false || - (typeof this._options.clientMaxWindowBits === 'number' && - params.client_max_window_bits > this._options.clientMaxWindowBits) - ) { - throw new Error( - 'Unexpected or invalid parameter "client_max_window_bits"' - ); - } - - return params; - } - - /** - * Normalize parameters. - * - * @param {Array} configurations The extension negotiation offers/reponse - * @return {Array} The offers/response with normalized parameters - * @private - */ - normalizeParams(configurations) { - configurations.forEach((params) => { - Object.keys(params).forEach((key) => { - let value = params[key]; - - if (value.length > 1) { - throw new Error(`Parameter "${key}" must have only a single value`); - } - - value = value[0]; - - if (key === 'client_max_window_bits') { - if (value !== true) { - const num = +value; - if (!Number.isInteger(num) || num < 8 || num > 15) { - throw new TypeError( - `Invalid value for parameter "${key}": ${value}` - ); - } - value = num; - } else if (!this._isServer) { - throw new TypeError( - `Invalid value for parameter "${key}": ${value}` - ); - } - } else if (key === 'server_max_window_bits') { - const num = +value; - if (!Number.isInteger(num) || num < 8 || num > 15) { - throw new TypeError( - `Invalid value for parameter "${key}": ${value}` - ); - } - value = num; - } else if ( - key === 'client_no_context_takeover' || - key === 'server_no_context_takeover' - ) { - if (value !== true) { - throw new TypeError( - `Invalid value for parameter "${key}": ${value}` - ); - } - } else { - throw new Error(`Unknown parameter "${key}"`); - } - - params[key] = value; - }); - }); - - return configurations; - } - - /** - * Decompress data. Concurrency limited. - * - * @param {Buffer} data Compressed data - * @param {Boolean} fin Specifies whether or not this is the last fragment - * @param {Function} callback Callback - * @public - */ - decompress(data, fin, callback) { - zlibLimiter.add((done) => { - this._decompress(data, fin, (err, result) => { - done(); - callback(err, result); - }); - }); - } - - /** - * Compress data. Concurrency limited. - * - * @param {Buffer} data Data to compress - * @param {Boolean} fin Specifies whether or not this is the last fragment - * @param {Function} callback Callback - * @public - */ - compress(data, fin, callback) { - zlibLimiter.add((done) => { - this._compress(data, fin, (err, result) => { - done(); - callback(err, result); - }); - }); - } - - /** - * Decompress data. - * - * @param {Buffer} data Compressed data - * @param {Boolean} fin Specifies whether or not this is the last fragment - * @param {Function} callback Callback - * @private - */ - _decompress(data, fin, callback) { - const endpoint = this._isServer ? 'client' : 'server'; - - if (!this._inflate) { - const key = `${endpoint}_max_window_bits`; - const windowBits = - typeof this.params[key] !== 'number' - ? zlib.Z_DEFAULT_WINDOWBITS - : this.params[key]; - - this._inflate = zlib.createInflateRaw({ - ...this._options.zlibInflateOptions, - windowBits - }); - this._inflate[kPerMessageDeflate] = this; - this._inflate[kTotalLength] = 0; - this._inflate[kBuffers] = []; - this._inflate.on('error', inflateOnError); - this._inflate.on('data', inflateOnData); - } - - this._inflate[kCallback] = callback; - - this._inflate.write(data); - if (fin) this._inflate.write(TRAILER); - - this._inflate.flush(() => { - const err = this._inflate[kError]; - - if (err) { - this._inflate.close(); - this._inflate = null; - callback(err); - return; - } - - const data = bufferUtil.concat( - this._inflate[kBuffers], - this._inflate[kTotalLength] - ); - - if (this._inflate._readableState.endEmitted) { - this._inflate.close(); - this._inflate = null; - } else { - this._inflate[kTotalLength] = 0; - this._inflate[kBuffers] = []; - - if (fin && this.params[`${endpoint}_no_context_takeover`]) { - this._inflate.reset(); - } - } - - callback(null, data); - }); - } - - /** - * Compress data. - * - * @param {Buffer} data Data to compress - * @param {Boolean} fin Specifies whether or not this is the last fragment - * @param {Function} callback Callback - * @private - */ - _compress(data, fin, callback) { - const endpoint = this._isServer ? 'server' : 'client'; - - if (!this._deflate) { - const key = `${endpoint}_max_window_bits`; - const windowBits = - typeof this.params[key] !== 'number' - ? zlib.Z_DEFAULT_WINDOWBITS - : this.params[key]; - - this._deflate = zlib.createDeflateRaw({ - ...this._options.zlibDeflateOptions, - windowBits - }); - - this._deflate[kTotalLength] = 0; - this._deflate[kBuffers] = []; - - // - // An `'error'` event is emitted, only on Node.js < 10.0.0, if the - // `zlib.DeflateRaw` instance is closed while data is being processed. - // This can happen if `PerMessageDeflate#cleanup()` is called at the wrong - // time due to an abnormal WebSocket closure. - // - this._deflate.on('error', NOOP); - this._deflate.on('data', deflateOnData); - } - - this._deflate[kCallback] = callback; - - this._deflate.write(data); - this._deflate.flush(zlib.Z_SYNC_FLUSH, () => { - if (!this._deflate) { - // - // The deflate stream was closed while data was being processed. - // - return; - } - - let data = bufferUtil.concat( - this._deflate[kBuffers], - this._deflate[kTotalLength] - ); - - if (fin) data = data.slice(0, data.length - 4); - - // - // Ensure that the callback will not be called again in - // `PerMessageDeflate#cleanup()`. - // - this._deflate[kCallback] = null; - - this._deflate[kTotalLength] = 0; - this._deflate[kBuffers] = []; - - if (fin && this.params[`${endpoint}_no_context_takeover`]) { - this._deflate.reset(); - } - - callback(null, data); - }); - } -} - -module.exports = PerMessageDeflate; - -/** - * The listener of the `zlib.DeflateRaw` stream `'data'` event. - * - * @param {Buffer} chunk A chunk of data - * @private - */ -function deflateOnData(chunk) { - this[kBuffers].push(chunk); - this[kTotalLength] += chunk.length; -} - -/** - * The listener of the `zlib.InflateRaw` stream `'data'` event. - * - * @param {Buffer} chunk A chunk of data - * @private - */ -function inflateOnData(chunk) { - this[kTotalLength] += chunk.length; - - if ( - this[kPerMessageDeflate]._maxPayload < 1 || - this[kTotalLength] <= this[kPerMessageDeflate]._maxPayload - ) { - this[kBuffers].push(chunk); - return; - } - - this[kError] = new RangeError('Max payload size exceeded'); - this[kError].code = 'WS_ERR_UNSUPPORTED_MESSAGE_LENGTH'; - this[kError][kStatusCode] = 1009; - this.removeListener('data', inflateOnData); - this.reset(); -} - -/** - * The listener of the `zlib.InflateRaw` stream `'error'` event. - * - * @param {Error} err The emitted error - * @private - */ -function inflateOnError(err) { - // - // There is no need to call `Zlib#close()` as the handle is automatically - // closed when an error is emitted. - // - this[kPerMessageDeflate]._inflate = null; - err[kStatusCode] = 1007; - this[kCallback](err); -} diff --git a/server/node_modules/ws/lib/receiver.js b/server/node_modules/ws/lib/receiver.js deleted file mode 100644 index 1d2af76..0000000 --- a/server/node_modules/ws/lib/receiver.js +++ /dev/null @@ -1,607 +0,0 @@ -'use strict'; - -const { Writable } = require('stream'); - -const PerMessageDeflate = require('./permessage-deflate'); -const { - BINARY_TYPES, - EMPTY_BUFFER, - kStatusCode, - kWebSocket -} = require('./constants'); -const { concat, toArrayBuffer, unmask } = require('./buffer-util'); -const { isValidStatusCode, isValidUTF8 } = require('./validation'); - -const GET_INFO = 0; -const GET_PAYLOAD_LENGTH_16 = 1; -const GET_PAYLOAD_LENGTH_64 = 2; -const GET_MASK = 3; -const GET_DATA = 4; -const INFLATING = 5; - -/** - * HyBi Receiver implementation. - * - * @extends Writable - */ -class Receiver extends Writable { - /** - * Creates a Receiver instance. - * - * @param {String} [binaryType=nodebuffer] The type for binary data - * @param {Object} [extensions] An object containing the negotiated extensions - * @param {Boolean} [isServer=false] Specifies whether to operate in client or - * server mode - * @param {Number} [maxPayload=0] The maximum allowed message length - */ - constructor(binaryType, extensions, isServer, maxPayload) { - super(); - - this._binaryType = binaryType || BINARY_TYPES[0]; - this[kWebSocket] = undefined; - this._extensions = extensions || {}; - this._isServer = !!isServer; - this._maxPayload = maxPayload | 0; - - this._bufferedBytes = 0; - this._buffers = []; - - this._compressed = false; - this._payloadLength = 0; - this._mask = undefined; - this._fragmented = 0; - this._masked = false; - this._fin = false; - this._opcode = 0; - - this._totalPayloadLength = 0; - this._messageLength = 0; - this._fragments = []; - - this._state = GET_INFO; - this._loop = false; - } - - /** - * Implements `Writable.prototype._write()`. - * - * @param {Buffer} chunk The chunk of data to write - * @param {String} encoding The character encoding of `chunk` - * @param {Function} cb Callback - * @private - */ - _write(chunk, encoding, cb) { - if (this._opcode === 0x08 && this._state == GET_INFO) return cb(); - - this._bufferedBytes += chunk.length; - this._buffers.push(chunk); - this.startLoop(cb); - } - - /** - * Consumes `n` bytes from the buffered data. - * - * @param {Number} n The number of bytes to consume - * @return {Buffer} The consumed bytes - * @private - */ - consume(n) { - this._bufferedBytes -= n; - - if (n === this._buffers[0].length) return this._buffers.shift(); - - if (n < this._buffers[0].length) { - const buf = this._buffers[0]; - this._buffers[0] = buf.slice(n); - return buf.slice(0, n); - } - - const dst = Buffer.allocUnsafe(n); - - do { - const buf = this._buffers[0]; - const offset = dst.length - n; - - if (n >= buf.length) { - dst.set(this._buffers.shift(), offset); - } else { - dst.set(new Uint8Array(buf.buffer, buf.byteOffset, n), offset); - this._buffers[0] = buf.slice(n); - } - - n -= buf.length; - } while (n > 0); - - return dst; - } - - /** - * Starts the parsing loop. - * - * @param {Function} cb Callback - * @private - */ - startLoop(cb) { - let err; - this._loop = true; - - do { - switch (this._state) { - case GET_INFO: - err = this.getInfo(); - break; - case GET_PAYLOAD_LENGTH_16: - err = this.getPayloadLength16(); - break; - case GET_PAYLOAD_LENGTH_64: - err = this.getPayloadLength64(); - break; - case GET_MASK: - this.getMask(); - break; - case GET_DATA: - err = this.getData(cb); - break; - default: - // `INFLATING` - this._loop = false; - return; - } - } while (this._loop); - - cb(err); - } - - /** - * Reads the first two bytes of a frame. - * - * @return {(RangeError|undefined)} A possible error - * @private - */ - getInfo() { - if (this._bufferedBytes < 2) { - this._loop = false; - return; - } - - const buf = this.consume(2); - - if ((buf[0] & 0x30) !== 0x00) { - this._loop = false; - return error( - RangeError, - 'RSV2 and RSV3 must be clear', - true, - 1002, - 'WS_ERR_UNEXPECTED_RSV_2_3' - ); - } - - const compressed = (buf[0] & 0x40) === 0x40; - - if (compressed && !this._extensions[PerMessageDeflate.extensionName]) { - this._loop = false; - return error( - RangeError, - 'RSV1 must be clear', - true, - 1002, - 'WS_ERR_UNEXPECTED_RSV_1' - ); - } - - this._fin = (buf[0] & 0x80) === 0x80; - this._opcode = buf[0] & 0x0f; - this._payloadLength = buf[1] & 0x7f; - - if (this._opcode === 0x00) { - if (compressed) { - this._loop = false; - return error( - RangeError, - 'RSV1 must be clear', - true, - 1002, - 'WS_ERR_UNEXPECTED_RSV_1' - ); - } - - if (!this._fragmented) { - this._loop = false; - return error( - RangeError, - 'invalid opcode 0', - true, - 1002, - 'WS_ERR_INVALID_OPCODE' - ); - } - - this._opcode = this._fragmented; - } else if (this._opcode === 0x01 || this._opcode === 0x02) { - if (this._fragmented) { - this._loop = false; - return error( - RangeError, - `invalid opcode ${this._opcode}`, - true, - 1002, - 'WS_ERR_INVALID_OPCODE' - ); - } - - this._compressed = compressed; - } else if (this._opcode > 0x07 && this._opcode < 0x0b) { - if (!this._fin) { - this._loop = false; - return error( - RangeError, - 'FIN must be set', - true, - 1002, - 'WS_ERR_EXPECTED_FIN' - ); - } - - if (compressed) { - this._loop = false; - return error( - RangeError, - 'RSV1 must be clear', - true, - 1002, - 'WS_ERR_UNEXPECTED_RSV_1' - ); - } - - if (this._payloadLength > 0x7d) { - this._loop = false; - return error( - RangeError, - `invalid payload length ${this._payloadLength}`, - true, - 1002, - 'WS_ERR_INVALID_CONTROL_PAYLOAD_LENGTH' - ); - } - } else { - this._loop = false; - return error( - RangeError, - `invalid opcode ${this._opcode}`, - true, - 1002, - 'WS_ERR_INVALID_OPCODE' - ); - } - - if (!this._fin && !this._fragmented) this._fragmented = this._opcode; - this._masked = (buf[1] & 0x80) === 0x80; - - if (this._isServer) { - if (!this._masked) { - this._loop = false; - return error( - RangeError, - 'MASK must be set', - true, - 1002, - 'WS_ERR_EXPECTED_MASK' - ); - } - } else if (this._masked) { - this._loop = false; - return error( - RangeError, - 'MASK must be clear', - true, - 1002, - 'WS_ERR_UNEXPECTED_MASK' - ); - } - - if (this._payloadLength === 126) this._state = GET_PAYLOAD_LENGTH_16; - else if (this._payloadLength === 127) this._state = GET_PAYLOAD_LENGTH_64; - else return this.haveLength(); - } - - /** - * Gets extended payload length (7+16). - * - * @return {(RangeError|undefined)} A possible error - * @private - */ - getPayloadLength16() { - if (this._bufferedBytes < 2) { - this._loop = false; - return; - } - - this._payloadLength = this.consume(2).readUInt16BE(0); - return this.haveLength(); - } - - /** - * Gets extended payload length (7+64). - * - * @return {(RangeError|undefined)} A possible error - * @private - */ - getPayloadLength64() { - if (this._bufferedBytes < 8) { - this._loop = false; - return; - } - - const buf = this.consume(8); - const num = buf.readUInt32BE(0); - - // - // The maximum safe integer in JavaScript is 2^53 - 1. An error is returned - // if payload length is greater than this number. - // - if (num > Math.pow(2, 53 - 32) - 1) { - this._loop = false; - return error( - RangeError, - 'Unsupported WebSocket frame: payload length > 2^53 - 1', - false, - 1009, - 'WS_ERR_UNSUPPORTED_DATA_PAYLOAD_LENGTH' - ); - } - - this._payloadLength = num * Math.pow(2, 32) + buf.readUInt32BE(4); - return this.haveLength(); - } - - /** - * Payload length has been read. - * - * @return {(RangeError|undefined)} A possible error - * @private - */ - haveLength() { - if (this._payloadLength && this._opcode < 0x08) { - this._totalPayloadLength += this._payloadLength; - if (this._totalPayloadLength > this._maxPayload && this._maxPayload > 0) { - this._loop = false; - return error( - RangeError, - 'Max payload size exceeded', - false, - 1009, - 'WS_ERR_UNSUPPORTED_MESSAGE_LENGTH' - ); - } - } - - if (this._masked) this._state = GET_MASK; - else this._state = GET_DATA; - } - - /** - * Reads mask bytes. - * - * @private - */ - getMask() { - if (this._bufferedBytes < 4) { - this._loop = false; - return; - } - - this._mask = this.consume(4); - this._state = GET_DATA; - } - - /** - * Reads data bytes. - * - * @param {Function} cb Callback - * @return {(Error|RangeError|undefined)} A possible error - * @private - */ - getData(cb) { - let data = EMPTY_BUFFER; - - if (this._payloadLength) { - if (this._bufferedBytes < this._payloadLength) { - this._loop = false; - return; - } - - data = this.consume(this._payloadLength); - if (this._masked) unmask(data, this._mask); - } - - if (this._opcode > 0x07) return this.controlMessage(data); - - if (this._compressed) { - this._state = INFLATING; - this.decompress(data, cb); - return; - } - - if (data.length) { - // - // This message is not compressed so its lenght is the sum of the payload - // length of all fragments. - // - this._messageLength = this._totalPayloadLength; - this._fragments.push(data); - } - - return this.dataMessage(); - } - - /** - * Decompresses data. - * - * @param {Buffer} data Compressed data - * @param {Function} cb Callback - * @private - */ - decompress(data, cb) { - const perMessageDeflate = this._extensions[PerMessageDeflate.extensionName]; - - perMessageDeflate.decompress(data, this._fin, (err, buf) => { - if (err) return cb(err); - - if (buf.length) { - this._messageLength += buf.length; - if (this._messageLength > this._maxPayload && this._maxPayload > 0) { - return cb( - error( - RangeError, - 'Max payload size exceeded', - false, - 1009, - 'WS_ERR_UNSUPPORTED_MESSAGE_LENGTH' - ) - ); - } - - this._fragments.push(buf); - } - - const er = this.dataMessage(); - if (er) return cb(er); - - this.startLoop(cb); - }); - } - - /** - * Handles a data message. - * - * @return {(Error|undefined)} A possible error - * @private - */ - dataMessage() { - if (this._fin) { - const messageLength = this._messageLength; - const fragments = this._fragments; - - this._totalPayloadLength = 0; - this._messageLength = 0; - this._fragmented = 0; - this._fragments = []; - - if (this._opcode === 2) { - let data; - - if (this._binaryType === 'nodebuffer') { - data = concat(fragments, messageLength); - } else if (this._binaryType === 'arraybuffer') { - data = toArrayBuffer(concat(fragments, messageLength)); - } else { - data = fragments; - } - - this.emit('message', data); - } else { - const buf = concat(fragments, messageLength); - - if (!isValidUTF8(buf)) { - this._loop = false; - return error( - Error, - 'invalid UTF-8 sequence', - true, - 1007, - 'WS_ERR_INVALID_UTF8' - ); - } - - this.emit('message', buf.toString()); - } - } - - this._state = GET_INFO; - } - - /** - * Handles a control message. - * - * @param {Buffer} data Data to handle - * @return {(Error|RangeError|undefined)} A possible error - * @private - */ - controlMessage(data) { - if (this._opcode === 0x08) { - this._loop = false; - - if (data.length === 0) { - this.emit('conclude', 1005, ''); - this.end(); - } else if (data.length === 1) { - return error( - RangeError, - 'invalid payload length 1', - true, - 1002, - 'WS_ERR_INVALID_CONTROL_PAYLOAD_LENGTH' - ); - } else { - const code = data.readUInt16BE(0); - - if (!isValidStatusCode(code)) { - return error( - RangeError, - `invalid status code ${code}`, - true, - 1002, - 'WS_ERR_INVALID_CLOSE_CODE' - ); - } - - const buf = data.slice(2); - - if (!isValidUTF8(buf)) { - return error( - Error, - 'invalid UTF-8 sequence', - true, - 1007, - 'WS_ERR_INVALID_UTF8' - ); - } - - this.emit('conclude', code, buf.toString()); - this.end(); - } - } else if (this._opcode === 0x09) { - this.emit('ping', data); - } else { - this.emit('pong', data); - } - - this._state = GET_INFO; - } -} - -module.exports = Receiver; - -/** - * Builds an error object. - * - * @param {function(new:Error|RangeError)} ErrorCtor The error constructor - * @param {String} message The error message - * @param {Boolean} prefix Specifies whether or not to add a default prefix to - * `message` - * @param {Number} statusCode The status code - * @param {String} errorCode The exposed error code - * @return {(Error|RangeError)} The error - * @private - */ -function error(ErrorCtor, message, prefix, statusCode, errorCode) { - const err = new ErrorCtor( - prefix ? `Invalid WebSocket frame: ${message}` : message - ); - - Error.captureStackTrace(err, error); - err.code = errorCode; - err[kStatusCode] = statusCode; - return err; -} diff --git a/server/node_modules/ws/lib/sender.js b/server/node_modules/ws/lib/sender.js deleted file mode 100644 index 441171c..0000000 --- a/server/node_modules/ws/lib/sender.js +++ /dev/null @@ -1,409 +0,0 @@ -/* eslint no-unused-vars: ["error", { "varsIgnorePattern": "^net|tls$" }] */ - -'use strict'; - -const net = require('net'); -const tls = require('tls'); -const { randomFillSync } = require('crypto'); - -const PerMessageDeflate = require('./permessage-deflate'); -const { EMPTY_BUFFER } = require('./constants'); -const { isValidStatusCode } = require('./validation'); -const { mask: applyMask, toBuffer } = require('./buffer-util'); - -const mask = Buffer.alloc(4); - -/** - * HyBi Sender implementation. - */ -class Sender { - /** - * Creates a Sender instance. - * - * @param {(net.Socket|tls.Socket)} socket The connection socket - * @param {Object} [extensions] An object containing the negotiated extensions - */ - constructor(socket, extensions) { - this._extensions = extensions || {}; - this._socket = socket; - - this._firstFragment = true; - this._compress = false; - - this._bufferedBytes = 0; - this._deflating = false; - this._queue = []; - } - - /** - * Frames a piece of data according to the HyBi WebSocket protocol. - * - * @param {Buffer} data The data to frame - * @param {Object} options Options object - * @param {Number} options.opcode The opcode - * @param {Boolean} [options.readOnly=false] Specifies whether `data` can be - * modified - * @param {Boolean} [options.fin=false] Specifies whether or not to set the - * FIN bit - * @param {Boolean} [options.mask=false] Specifies whether or not to mask - * `data` - * @param {Boolean} [options.rsv1=false] Specifies whether or not to set the - * RSV1 bit - * @return {Buffer[]} The framed data as a list of `Buffer` instances - * @public - */ - static frame(data, options) { - const merge = options.mask && options.readOnly; - let offset = options.mask ? 6 : 2; - let payloadLength = data.length; - - if (data.length >= 65536) { - offset += 8; - payloadLength = 127; - } else if (data.length > 125) { - offset += 2; - payloadLength = 126; - } - - const target = Buffer.allocUnsafe(merge ? data.length + offset : offset); - - target[0] = options.fin ? options.opcode | 0x80 : options.opcode; - if (options.rsv1) target[0] |= 0x40; - - target[1] = payloadLength; - - if (payloadLength === 126) { - target.writeUInt16BE(data.length, 2); - } else if (payloadLength === 127) { - target.writeUInt32BE(0, 2); - target.writeUInt32BE(data.length, 6); - } - - if (!options.mask) return [target, data]; - - randomFillSync(mask, 0, 4); - - target[1] |= 0x80; - target[offset - 4] = mask[0]; - target[offset - 3] = mask[1]; - target[offset - 2] = mask[2]; - target[offset - 1] = mask[3]; - - if (merge) { - applyMask(data, mask, target, offset, data.length); - return [target]; - } - - applyMask(data, mask, data, 0, data.length); - return [target, data]; - } - - /** - * Sends a close message to the other peer. - * - * @param {Number} [code] The status code component of the body - * @param {String} [data] The message component of the body - * @param {Boolean} [mask=false] Specifies whether or not to mask the message - * @param {Function} [cb] Callback - * @public - */ - close(code, data, mask, cb) { - let buf; - - if (code === undefined) { - buf = EMPTY_BUFFER; - } else if (typeof code !== 'number' || !isValidStatusCode(code)) { - throw new TypeError('First argument must be a valid error code number'); - } else if (data === undefined || data === '') { - buf = Buffer.allocUnsafe(2); - buf.writeUInt16BE(code, 0); - } else { - const length = Buffer.byteLength(data); - - if (length > 123) { - throw new RangeError('The message must not be greater than 123 bytes'); - } - - buf = Buffer.allocUnsafe(2 + length); - buf.writeUInt16BE(code, 0); - buf.write(data, 2); - } - - if (this._deflating) { - this.enqueue([this.doClose, buf, mask, cb]); - } else { - this.doClose(buf, mask, cb); - } - } - - /** - * Frames and sends a close message. - * - * @param {Buffer} data The message to send - * @param {Boolean} [mask=false] Specifies whether or not to mask `data` - * @param {Function} [cb] Callback - * @private - */ - doClose(data, mask, cb) { - this.sendFrame( - Sender.frame(data, { - fin: true, - rsv1: false, - opcode: 0x08, - mask, - readOnly: false - }), - cb - ); - } - - /** - * Sends a ping message to the other peer. - * - * @param {*} data The message to send - * @param {Boolean} [mask=false] Specifies whether or not to mask `data` - * @param {Function} [cb] Callback - * @public - */ - ping(data, mask, cb) { - const buf = toBuffer(data); - - if (buf.length > 125) { - throw new RangeError('The data size must not be greater than 125 bytes'); - } - - if (this._deflating) { - this.enqueue([this.doPing, buf, mask, toBuffer.readOnly, cb]); - } else { - this.doPing(buf, mask, toBuffer.readOnly, cb); - } - } - - /** - * Frames and sends a ping message. - * - * @param {Buffer} data The message to send - * @param {Boolean} [mask=false] Specifies whether or not to mask `data` - * @param {Boolean} [readOnly=false] Specifies whether `data` can be modified - * @param {Function} [cb] Callback - * @private - */ - doPing(data, mask, readOnly, cb) { - this.sendFrame( - Sender.frame(data, { - fin: true, - rsv1: false, - opcode: 0x09, - mask, - readOnly - }), - cb - ); - } - - /** - * Sends a pong message to the other peer. - * - * @param {*} data The message to send - * @param {Boolean} [mask=false] Specifies whether or not to mask `data` - * @param {Function} [cb] Callback - * @public - */ - pong(data, mask, cb) { - const buf = toBuffer(data); - - if (buf.length > 125) { - throw new RangeError('The data size must not be greater than 125 bytes'); - } - - if (this._deflating) { - this.enqueue([this.doPong, buf, mask, toBuffer.readOnly, cb]); - } else { - this.doPong(buf, mask, toBuffer.readOnly, cb); - } - } - - /** - * Frames and sends a pong message. - * - * @param {Buffer} data The message to send - * @param {Boolean} [mask=false] Specifies whether or not to mask `data` - * @param {Boolean} [readOnly=false] Specifies whether `data` can be modified - * @param {Function} [cb] Callback - * @private - */ - doPong(data, mask, readOnly, cb) { - this.sendFrame( - Sender.frame(data, { - fin: true, - rsv1: false, - opcode: 0x0a, - mask, - readOnly - }), - cb - ); - } - - /** - * Sends a data message to the other peer. - * - * @param {*} data The message to send - * @param {Object} options Options object - * @param {Boolean} [options.compress=false] Specifies whether or not to - * compress `data` - * @param {Boolean} [options.binary=false] Specifies whether `data` is binary - * or text - * @param {Boolean} [options.fin=false] Specifies whether the fragment is the - * last one - * @param {Boolean} [options.mask=false] Specifies whether or not to mask - * `data` - * @param {Function} [cb] Callback - * @public - */ - send(data, options, cb) { - const buf = toBuffer(data); - const perMessageDeflate = this._extensions[PerMessageDeflate.extensionName]; - let opcode = options.binary ? 2 : 1; - let rsv1 = options.compress; - - if (this._firstFragment) { - this._firstFragment = false; - if (rsv1 && perMessageDeflate) { - rsv1 = buf.length >= perMessageDeflate._threshold; - } - this._compress = rsv1; - } else { - rsv1 = false; - opcode = 0; - } - - if (options.fin) this._firstFragment = true; - - if (perMessageDeflate) { - const opts = { - fin: options.fin, - rsv1, - opcode, - mask: options.mask, - readOnly: toBuffer.readOnly - }; - - if (this._deflating) { - this.enqueue([this.dispatch, buf, this._compress, opts, cb]); - } else { - this.dispatch(buf, this._compress, opts, cb); - } - } else { - this.sendFrame( - Sender.frame(buf, { - fin: options.fin, - rsv1: false, - opcode, - mask: options.mask, - readOnly: toBuffer.readOnly - }), - cb - ); - } - } - - /** - * Dispatches a data message. - * - * @param {Buffer} data The message to send - * @param {Boolean} [compress=false] Specifies whether or not to compress - * `data` - * @param {Object} options Options object - * @param {Number} options.opcode The opcode - * @param {Boolean} [options.readOnly=false] Specifies whether `data` can be - * modified - * @param {Boolean} [options.fin=false] Specifies whether or not to set the - * FIN bit - * @param {Boolean} [options.mask=false] Specifies whether or not to mask - * `data` - * @param {Boolean} [options.rsv1=false] Specifies whether or not to set the - * RSV1 bit - * @param {Function} [cb] Callback - * @private - */ - dispatch(data, compress, options, cb) { - if (!compress) { - this.sendFrame(Sender.frame(data, options), cb); - return; - } - - const perMessageDeflate = this._extensions[PerMessageDeflate.extensionName]; - - this._bufferedBytes += data.length; - this._deflating = true; - perMessageDeflate.compress(data, options.fin, (_, buf) => { - if (this._socket.destroyed) { - const err = new Error( - 'The socket was closed while data was being compressed' - ); - - if (typeof cb === 'function') cb(err); - - for (let i = 0; i < this._queue.length; i++) { - const callback = this._queue[i][4]; - - if (typeof callback === 'function') callback(err); - } - - return; - } - - this._bufferedBytes -= data.length; - this._deflating = false; - options.readOnly = false; - this.sendFrame(Sender.frame(buf, options), cb); - this.dequeue(); - }); - } - - /** - * Executes queued send operations. - * - * @private - */ - dequeue() { - while (!this._deflating && this._queue.length) { - const params = this._queue.shift(); - - this._bufferedBytes -= params[1].length; - Reflect.apply(params[0], this, params.slice(1)); - } - } - - /** - * Enqueues a send operation. - * - * @param {Array} params Send operation parameters. - * @private - */ - enqueue(params) { - this._bufferedBytes += params[1].length; - this._queue.push(params); - } - - /** - * Sends a frame. - * - * @param {Buffer[]} list The frame to send - * @param {Function} [cb] Callback - * @private - */ - sendFrame(list, cb) { - if (list.length === 2) { - this._socket.cork(); - this._socket.write(list[0]); - this._socket.write(list[1], cb); - this._socket.uncork(); - } else { - this._socket.write(list[0], cb); - } - } -} - -module.exports = Sender; diff --git a/server/node_modules/ws/lib/stream.js b/server/node_modules/ws/lib/stream.js deleted file mode 100644 index 19e1bff..0000000 --- a/server/node_modules/ws/lib/stream.js +++ /dev/null @@ -1,180 +0,0 @@ -'use strict'; - -const { Duplex } = require('stream'); - -/** - * Emits the `'close'` event on a stream. - * - * @param {Duplex} stream The stream. - * @private - */ -function emitClose(stream) { - stream.emit('close'); -} - -/** - * The listener of the `'end'` event. - * - * @private - */ -function duplexOnEnd() { - if (!this.destroyed && this._writableState.finished) { - this.destroy(); - } -} - -/** - * The listener of the `'error'` event. - * - * @param {Error} err The error - * @private - */ -function duplexOnError(err) { - this.removeListener('error', duplexOnError); - this.destroy(); - if (this.listenerCount('error') === 0) { - // Do not suppress the throwing behavior. - this.emit('error', err); - } -} - -/** - * Wraps a `WebSocket` in a duplex stream. - * - * @param {WebSocket} ws The `WebSocket` to wrap - * @param {Object} [options] The options for the `Duplex` constructor - * @return {Duplex} The duplex stream - * @public - */ -function createWebSocketStream(ws, options) { - let resumeOnReceiverDrain = true; - let terminateOnDestroy = true; - - function receiverOnDrain() { - if (resumeOnReceiverDrain) ws._socket.resume(); - } - - if (ws.readyState === ws.CONNECTING) { - ws.once('open', function open() { - ws._receiver.removeAllListeners('drain'); - ws._receiver.on('drain', receiverOnDrain); - }); - } else { - ws._receiver.removeAllListeners('drain'); - ws._receiver.on('drain', receiverOnDrain); - } - - const duplex = new Duplex({ - ...options, - autoDestroy: false, - emitClose: false, - objectMode: false, - writableObjectMode: false - }); - - ws.on('message', function message(msg) { - if (!duplex.push(msg)) { - resumeOnReceiverDrain = false; - ws._socket.pause(); - } - }); - - ws.once('error', function error(err) { - if (duplex.destroyed) return; - - // Prevent `ws.terminate()` from being called by `duplex._destroy()`. - // - // - If the `'error'` event is emitted before the `'open'` event, then - // `ws.terminate()` is a noop as no socket is assigned. - // - Otherwise, the error is re-emitted by the listener of the `'error'` - // event of the `Receiver` object. The listener already closes the - // connection by calling `ws.close()`. This allows a close frame to be - // sent to the other peer. If `ws.terminate()` is called right after this, - // then the close frame might not be sent. - terminateOnDestroy = false; - duplex.destroy(err); - }); - - ws.once('close', function close() { - if (duplex.destroyed) return; - - duplex.push(null); - }); - - duplex._destroy = function (err, callback) { - if (ws.readyState === ws.CLOSED) { - callback(err); - process.nextTick(emitClose, duplex); - return; - } - - let called = false; - - ws.once('error', function error(err) { - called = true; - callback(err); - }); - - ws.once('close', function close() { - if (!called) callback(err); - process.nextTick(emitClose, duplex); - }); - - if (terminateOnDestroy) ws.terminate(); - }; - - duplex._final = function (callback) { - if (ws.readyState === ws.CONNECTING) { - ws.once('open', function open() { - duplex._final(callback); - }); - return; - } - - // If the value of the `_socket` property is `null` it means that `ws` is a - // client websocket and the handshake failed. In fact, when this happens, a - // socket is never assigned to the websocket. Wait for the `'error'` event - // that will be emitted by the websocket. - if (ws._socket === null) return; - - if (ws._socket._writableState.finished) { - callback(); - if (duplex._readableState.endEmitted) duplex.destroy(); - } else { - ws._socket.once('finish', function finish() { - // `duplex` is not destroyed here because the `'end'` event will be - // emitted on `duplex` after this `'finish'` event. The EOF signaling - // `null` chunk is, in fact, pushed when the websocket emits `'close'`. - callback(); - }); - ws.close(); - } - }; - - duplex._read = function () { - if ( - (ws.readyState === ws.OPEN || ws.readyState === ws.CLOSING) && - !resumeOnReceiverDrain - ) { - resumeOnReceiverDrain = true; - if (!ws._receiver._writableState.needDrain) ws._socket.resume(); - } - }; - - duplex._write = function (chunk, encoding, callback) { - if (ws.readyState === ws.CONNECTING) { - ws.once('open', function open() { - duplex._write(chunk, encoding, callback); - }); - return; - } - - ws.send(chunk, callback); - }; - - duplex.on('end', duplexOnEnd); - duplex.on('error', duplexOnError); - return duplex; -} - -module.exports = createWebSocketStream; diff --git a/server/node_modules/ws/lib/validation.js b/server/node_modules/ws/lib/validation.js deleted file mode 100644 index 169ac6f..0000000 --- a/server/node_modules/ws/lib/validation.js +++ /dev/null @@ -1,104 +0,0 @@ -'use strict'; - -/** - * Checks if a status code is allowed in a close frame. - * - * @param {Number} code The status code - * @return {Boolean} `true` if the status code is valid, else `false` - * @public - */ -function isValidStatusCode(code) { - return ( - (code >= 1000 && - code <= 1014 && - code !== 1004 && - code !== 1005 && - code !== 1006) || - (code >= 3000 && code <= 4999) - ); -} - -/** - * Checks if a given buffer contains only correct UTF-8. - * Ported from https://www.cl.cam.ac.uk/%7Emgk25/ucs/utf8_check.c by - * Markus Kuhn. - * - * @param {Buffer} buf The buffer to check - * @return {Boolean} `true` if `buf` contains only correct UTF-8, else `false` - * @public - */ -function _isValidUTF8(buf) { - const len = buf.length; - let i = 0; - - while (i < len) { - if ((buf[i] & 0x80) === 0) { - // 0xxxxxxx - i++; - } else if ((buf[i] & 0xe0) === 0xc0) { - // 110xxxxx 10xxxxxx - if ( - i + 1 === len || - (buf[i + 1] & 0xc0) !== 0x80 || - (buf[i] & 0xfe) === 0xc0 // Overlong - ) { - return false; - } - - i += 2; - } else if ((buf[i] & 0xf0) === 0xe0) { - // 1110xxxx 10xxxxxx 10xxxxxx - if ( - i + 2 >= len || - (buf[i + 1] & 0xc0) !== 0x80 || - (buf[i + 2] & 0xc0) !== 0x80 || - (buf[i] === 0xe0 && (buf[i + 1] & 0xe0) === 0x80) || // Overlong - (buf[i] === 0xed && (buf[i + 1] & 0xe0) === 0xa0) // Surrogate (U+D800 - U+DFFF) - ) { - return false; - } - - i += 3; - } else if ((buf[i] & 0xf8) === 0xf0) { - // 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx - if ( - i + 3 >= len || - (buf[i + 1] & 0xc0) !== 0x80 || - (buf[i + 2] & 0xc0) !== 0x80 || - (buf[i + 3] & 0xc0) !== 0x80 || - (buf[i] === 0xf0 && (buf[i + 1] & 0xf0) === 0x80) || // Overlong - (buf[i] === 0xf4 && buf[i + 1] > 0x8f) || - buf[i] > 0xf4 // > U+10FFFF - ) { - return false; - } - - i += 4; - } else { - return false; - } - } - - return true; -} - -try { - let isValidUTF8 = require('utf-8-validate'); - - /* istanbul ignore if */ - if (typeof isValidUTF8 === 'object') { - isValidUTF8 = isValidUTF8.Validation.isValidUTF8; // utf-8-validate@<3.0.0 - } - - module.exports = { - isValidStatusCode, - isValidUTF8(buf) { - return buf.length < 150 ? _isValidUTF8(buf) : isValidUTF8(buf); - } - }; -} catch (e) /* istanbul ignore next */ { - module.exports = { - isValidStatusCode, - isValidUTF8: _isValidUTF8 - }; -} diff --git a/server/node_modules/ws/lib/websocket-server.js b/server/node_modules/ws/lib/websocket-server.js deleted file mode 100644 index 8ead7d4..0000000 --- a/server/node_modules/ws/lib/websocket-server.js +++ /dev/null @@ -1,449 +0,0 @@ -/* eslint no-unused-vars: ["error", { "varsIgnorePattern": "^net|tls|https$" }] */ - -'use strict'; - -const EventEmitter = require('events'); -const http = require('http'); -const https = require('https'); -const net = require('net'); -const tls = require('tls'); -const { createHash } = require('crypto'); - -const PerMessageDeflate = require('./permessage-deflate'); -const WebSocket = require('./websocket'); -const { format, parse } = require('./extension'); -const { GUID, kWebSocket } = require('./constants'); - -const keyRegex = /^[+/0-9A-Za-z]{22}==$/; - -const RUNNING = 0; -const CLOSING = 1; -const CLOSED = 2; - -/** - * Class representing a WebSocket server. - * - * @extends EventEmitter - */ -class WebSocketServer extends EventEmitter { - /** - * Create a `WebSocketServer` instance. - * - * @param {Object} options Configuration options - * @param {Number} [options.backlog=511] The maximum length of the queue of - * pending connections - * @param {Boolean} [options.clientTracking=true] Specifies whether or not to - * track clients - * @param {Function} [options.handleProtocols] A hook to handle protocols - * @param {String} [options.host] The hostname where to bind the server - * @param {Number} [options.maxPayload=104857600] The maximum allowed message - * size - * @param {Boolean} [options.noServer=false] Enable no server mode - * @param {String} [options.path] Accept only connections matching this path - * @param {(Boolean|Object)} [options.perMessageDeflate=false] Enable/disable - * permessage-deflate - * @param {Number} [options.port] The port where to bind the server - * @param {(http.Server|https.Server)} [options.server] A pre-created HTTP/S - * server to use - * @param {Function} [options.verifyClient] A hook to reject connections - * @param {Function} [callback] A listener for the `listening` event - */ - constructor(options, callback) { - super(); - - options = { - maxPayload: 100 * 1024 * 1024, - perMessageDeflate: false, - handleProtocols: null, - clientTracking: true, - verifyClient: null, - noServer: false, - backlog: null, // use default (511 as implemented in net.js) - server: null, - host: null, - path: null, - port: null, - ...options - }; - - if ( - (options.port == null && !options.server && !options.noServer) || - (options.port != null && (options.server || options.noServer)) || - (options.server && options.noServer) - ) { - throw new TypeError( - 'One and only one of the "port", "server", or "noServer" options ' + - 'must be specified' - ); - } - - if (options.port != null) { - this._server = http.createServer((req, res) => { - const body = http.STATUS_CODES[426]; - - res.writeHead(426, { - 'Content-Length': body.length, - 'Content-Type': 'text/plain' - }); - res.end(body); - }); - this._server.listen( - options.port, - options.host, - options.backlog, - callback - ); - } else if (options.server) { - this._server = options.server; - } - - if (this._server) { - const emitConnection = this.emit.bind(this, 'connection'); - - this._removeListeners = addListeners(this._server, { - listening: this.emit.bind(this, 'listening'), - error: this.emit.bind(this, 'error'), - upgrade: (req, socket, head) => { - this.handleUpgrade(req, socket, head, emitConnection); - } - }); - } - - if (options.perMessageDeflate === true) options.perMessageDeflate = {}; - if (options.clientTracking) this.clients = new Set(); - this.options = options; - this._state = RUNNING; - } - - /** - * Returns the bound address, the address family name, and port of the server - * as reported by the operating system if listening on an IP socket. - * If the server is listening on a pipe or UNIX domain socket, the name is - * returned as a string. - * - * @return {(Object|String|null)} The address of the server - * @public - */ - address() { - if (this.options.noServer) { - throw new Error('The server is operating in "noServer" mode'); - } - - if (!this._server) return null; - return this._server.address(); - } - - /** - * Close the server. - * - * @param {Function} [cb] Callback - * @public - */ - close(cb) { - if (cb) this.once('close', cb); - - if (this._state === CLOSED) { - process.nextTick(emitClose, this); - return; - } - - if (this._state === CLOSING) return; - this._state = CLOSING; - - // - // Terminate all associated clients. - // - if (this.clients) { - for (const client of this.clients) client.terminate(); - } - - const server = this._server; - - if (server) { - this._removeListeners(); - this._removeListeners = this._server = null; - - // - // Close the http server if it was internally created. - // - if (this.options.port != null) { - server.close(emitClose.bind(undefined, this)); - return; - } - } - - process.nextTick(emitClose, this); - } - - /** - * See if a given request should be handled by this server instance. - * - * @param {http.IncomingMessage} req Request object to inspect - * @return {Boolean} `true` if the request is valid, else `false` - * @public - */ - shouldHandle(req) { - if (this.options.path) { - const index = req.url.indexOf('?'); - const pathname = index !== -1 ? req.url.slice(0, index) : req.url; - - if (pathname !== this.options.path) return false; - } - - return true; - } - - /** - * Handle a HTTP Upgrade request. - * - * @param {http.IncomingMessage} req The request object - * @param {(net.Socket|tls.Socket)} socket The network socket between the - * server and client - * @param {Buffer} head The first packet of the upgraded stream - * @param {Function} cb Callback - * @public - */ - handleUpgrade(req, socket, head, cb) { - socket.on('error', socketOnError); - - const key = - req.headers['sec-websocket-key'] !== undefined - ? req.headers['sec-websocket-key'].trim() - : false; - const upgrade = req.headers.upgrade; - const version = +req.headers['sec-websocket-version']; - const extensions = {}; - - if ( - req.method !== 'GET' || - upgrade === undefined || - upgrade.toLowerCase() !== 'websocket' || - !key || - !keyRegex.test(key) || - (version !== 8 && version !== 13) || - !this.shouldHandle(req) - ) { - return abortHandshake(socket, 400); - } - - if (this.options.perMessageDeflate) { - const perMessageDeflate = new PerMessageDeflate( - this.options.perMessageDeflate, - true, - this.options.maxPayload - ); - - try { - const offers = parse(req.headers['sec-websocket-extensions']); - - if (offers[PerMessageDeflate.extensionName]) { - perMessageDeflate.accept(offers[PerMessageDeflate.extensionName]); - extensions[PerMessageDeflate.extensionName] = perMessageDeflate; - } - } catch (err) { - return abortHandshake(socket, 400); - } - } - - // - // Optionally call external client verification handler. - // - if (this.options.verifyClient) { - const info = { - origin: - req.headers[`${version === 8 ? 'sec-websocket-origin' : 'origin'}`], - secure: !!(req.socket.authorized || req.socket.encrypted), - req - }; - - if (this.options.verifyClient.length === 2) { - this.options.verifyClient(info, (verified, code, message, headers) => { - if (!verified) { - return abortHandshake(socket, code || 401, message, headers); - } - - this.completeUpgrade(key, extensions, req, socket, head, cb); - }); - return; - } - - if (!this.options.verifyClient(info)) return abortHandshake(socket, 401); - } - - this.completeUpgrade(key, extensions, req, socket, head, cb); - } - - /** - * Upgrade the connection to WebSocket. - * - * @param {String} key The value of the `Sec-WebSocket-Key` header - * @param {Object} extensions The accepted extensions - * @param {http.IncomingMessage} req The request object - * @param {(net.Socket|tls.Socket)} socket The network socket between the - * server and client - * @param {Buffer} head The first packet of the upgraded stream - * @param {Function} cb Callback - * @throws {Error} If called more than once with the same socket - * @private - */ - completeUpgrade(key, extensions, req, socket, head, cb) { - // - // Destroy the socket if the client has already sent a FIN packet. - // - if (!socket.readable || !socket.writable) return socket.destroy(); - - if (socket[kWebSocket]) { - throw new Error( - 'server.handleUpgrade() was called more than once with the same ' + - 'socket, possibly due to a misconfiguration' - ); - } - - if (this._state > RUNNING) return abortHandshake(socket, 503); - - const digest = createHash('sha1') - .update(key + GUID) - .digest('base64'); - - const headers = [ - 'HTTP/1.1 101 Switching Protocols', - 'Upgrade: websocket', - 'Connection: Upgrade', - `Sec-WebSocket-Accept: ${digest}` - ]; - - const ws = new WebSocket(null); - let protocol = req.headers['sec-websocket-protocol']; - - if (protocol) { - protocol = protocol.split(',').map(trim); - - // - // Optionally call external protocol selection handler. - // - if (this.options.handleProtocols) { - protocol = this.options.handleProtocols(protocol, req); - } else { - protocol = protocol[0]; - } - - if (protocol) { - headers.push(`Sec-WebSocket-Protocol: ${protocol}`); - ws._protocol = protocol; - } - } - - if (extensions[PerMessageDeflate.extensionName]) { - const params = extensions[PerMessageDeflate.extensionName].params; - const value = format({ - [PerMessageDeflate.extensionName]: [params] - }); - headers.push(`Sec-WebSocket-Extensions: ${value}`); - ws._extensions = extensions; - } - - // - // Allow external modification/inspection of handshake headers. - // - this.emit('headers', headers, req); - - socket.write(headers.concat('\r\n').join('\r\n')); - socket.removeListener('error', socketOnError); - - ws.setSocket(socket, head, this.options.maxPayload); - - if (this.clients) { - this.clients.add(ws); - ws.on('close', () => this.clients.delete(ws)); - } - - cb(ws, req); - } -} - -module.exports = WebSocketServer; - -/** - * Add event listeners on an `EventEmitter` using a map of - * pairs. - * - * @param {EventEmitter} server The event emitter - * @param {Object.} map The listeners to add - * @return {Function} A function that will remove the added listeners when - * called - * @private - */ -function addListeners(server, map) { - for (const event of Object.keys(map)) server.on(event, map[event]); - - return function removeListeners() { - for (const event of Object.keys(map)) { - server.removeListener(event, map[event]); - } - }; -} - -/** - * Emit a `'close'` event on an `EventEmitter`. - * - * @param {EventEmitter} server The event emitter - * @private - */ -function emitClose(server) { - server._state = CLOSED; - server.emit('close'); -} - -/** - * Handle premature socket errors. - * - * @private - */ -function socketOnError() { - this.destroy(); -} - -/** - * Close the connection when preconditions are not fulfilled. - * - * @param {(net.Socket|tls.Socket)} socket The socket of the upgrade request - * @param {Number} code The HTTP response status code - * @param {String} [message] The HTTP response body - * @param {Object} [headers] Additional HTTP response headers - * @private - */ -function abortHandshake(socket, code, message, headers) { - if (socket.writable) { - message = message || http.STATUS_CODES[code]; - headers = { - Connection: 'close', - 'Content-Type': 'text/html', - 'Content-Length': Buffer.byteLength(message), - ...headers - }; - - socket.write( - `HTTP/1.1 ${code} ${http.STATUS_CODES[code]}\r\n` + - Object.keys(headers) - .map((h) => `${h}: ${headers[h]}`) - .join('\r\n') + - '\r\n\r\n' + - message - ); - } - - socket.removeListener('error', socketOnError); - socket.destroy(); -} - -/** - * Remove whitespace characters from both ends of a string. - * - * @param {String} str The string - * @return {String} A new string representing `str` stripped of whitespace - * characters from both its beginning and end - * @private - */ -function trim(str) { - return str.trim(); -} diff --git a/server/node_modules/ws/lib/websocket.js b/server/node_modules/ws/lib/websocket.js deleted file mode 100644 index 14f82c8..0000000 --- a/server/node_modules/ws/lib/websocket.js +++ /dev/null @@ -1,1197 +0,0 @@ -/* eslint no-unused-vars: ["error", { "varsIgnorePattern": "^Readable$" }] */ - -'use strict'; - -const EventEmitter = require('events'); -const https = require('https'); -const http = require('http'); -const net = require('net'); -const tls = require('tls'); -const { randomBytes, createHash } = require('crypto'); -const { Readable } = require('stream'); -const { URL } = require('url'); - -const PerMessageDeflate = require('./permessage-deflate'); -const Receiver = require('./receiver'); -const Sender = require('./sender'); -const { - BINARY_TYPES, - EMPTY_BUFFER, - GUID, - kStatusCode, - kWebSocket, - NOOP -} = require('./constants'); -const { addEventListener, removeEventListener } = require('./event-target'); -const { format, parse } = require('./extension'); -const { toBuffer } = require('./buffer-util'); - -const readyStates = ['CONNECTING', 'OPEN', 'CLOSING', 'CLOSED']; -const protocolVersions = [8, 13]; -const closeTimeout = 30 * 1000; - -/** - * Class representing a WebSocket. - * - * @extends EventEmitter - */ -class WebSocket extends EventEmitter { - /** - * Create a new `WebSocket`. - * - * @param {(String|URL)} address The URL to which to connect - * @param {(String|String[])} [protocols] The subprotocols - * @param {Object} [options] Connection options - */ - constructor(address, protocols, options) { - super(); - - this._binaryType = BINARY_TYPES[0]; - this._closeCode = 1006; - this._closeFrameReceived = false; - this._closeFrameSent = false; - this._closeMessage = ''; - this._closeTimer = null; - this._extensions = {}; - this._protocol = ''; - this._readyState = WebSocket.CONNECTING; - this._receiver = null; - this._sender = null; - this._socket = null; - - if (address !== null) { - this._bufferedAmount = 0; - this._isServer = false; - this._redirects = 0; - - if (Array.isArray(protocols)) { - protocols = protocols.join(', '); - } else if (typeof protocols === 'object' && protocols !== null) { - options = protocols; - protocols = undefined; - } - - initAsClient(this, address, protocols, options); - } else { - this._isServer = true; - } - } - - /** - * This deviates from the WHATWG interface since ws doesn't support the - * required default "blob" type (instead we define a custom "nodebuffer" - * type). - * - * @type {String} - */ - get binaryType() { - return this._binaryType; - } - - set binaryType(type) { - if (!BINARY_TYPES.includes(type)) return; - - this._binaryType = type; - - // - // Allow to change `binaryType` on the fly. - // - if (this._receiver) this._receiver._binaryType = type; - } - - /** - * @type {Number} - */ - get bufferedAmount() { - if (!this._socket) return this._bufferedAmount; - - return this._socket._writableState.length + this._sender._bufferedBytes; - } - - /** - * @type {String} - */ - get extensions() { - return Object.keys(this._extensions).join(); - } - - /** - * @type {Function} - */ - /* istanbul ignore next */ - get onclose() { - return undefined; - } - - /* istanbul ignore next */ - set onclose(listener) {} - - /** - * @type {Function} - */ - /* istanbul ignore next */ - get onerror() { - return undefined; - } - - /* istanbul ignore next */ - set onerror(listener) {} - - /** - * @type {Function} - */ - /* istanbul ignore next */ - get onopen() { - return undefined; - } - - /* istanbul ignore next */ - set onopen(listener) {} - - /** - * @type {Function} - */ - /* istanbul ignore next */ - get onmessage() { - return undefined; - } - - /* istanbul ignore next */ - set onmessage(listener) {} - - /** - * @type {String} - */ - get protocol() { - return this._protocol; - } - - /** - * @type {Number} - */ - get readyState() { - return this._readyState; - } - - /** - * @type {String} - */ - get url() { - return this._url; - } - - /** - * Set up the socket and the internal resources. - * - * @param {(net.Socket|tls.Socket)} socket The network socket between the - * server and client - * @param {Buffer} head The first packet of the upgraded stream - * @param {Number} [maxPayload=0] The maximum allowed message size - * @private - */ - setSocket(socket, head, maxPayload) { - const receiver = new Receiver( - this.binaryType, - this._extensions, - this._isServer, - maxPayload - ); - - this._sender = new Sender(socket, this._extensions); - this._receiver = receiver; - this._socket = socket; - - receiver[kWebSocket] = this; - socket[kWebSocket] = this; - - receiver.on('conclude', receiverOnConclude); - receiver.on('drain', receiverOnDrain); - receiver.on('error', receiverOnError); - receiver.on('message', receiverOnMessage); - receiver.on('ping', receiverOnPing); - receiver.on('pong', receiverOnPong); - - socket.setTimeout(0); - socket.setNoDelay(); - - if (head.length > 0) socket.unshift(head); - - socket.on('close', socketOnClose); - socket.on('data', socketOnData); - socket.on('end', socketOnEnd); - socket.on('error', socketOnError); - - this._readyState = WebSocket.OPEN; - this.emit('open'); - } - - /** - * Emit the `'close'` event. - * - * @private - */ - emitClose() { - if (!this._socket) { - this._readyState = WebSocket.CLOSED; - this.emit('close', this._closeCode, this._closeMessage); - return; - } - - if (this._extensions[PerMessageDeflate.extensionName]) { - this._extensions[PerMessageDeflate.extensionName].cleanup(); - } - - this._receiver.removeAllListeners(); - this._readyState = WebSocket.CLOSED; - this.emit('close', this._closeCode, this._closeMessage); - } - - /** - * Start a closing handshake. - * - * +----------+ +-----------+ +----------+ - * - - -|ws.close()|-->|close frame|-->|ws.close()|- - - - * | +----------+ +-----------+ +----------+ | - * +----------+ +-----------+ | - * CLOSING |ws.close()|<--|close frame|<--+-----+ CLOSING - * +----------+ +-----------+ | - * | | | +---+ | - * +------------------------+-->|fin| - - - - - * | +---+ | +---+ - * - - - - -|fin|<---------------------+ - * +---+ - * - * @param {Number} [code] Status code explaining why the connection is closing - * @param {String} [data] A string explaining why the connection is closing - * @public - */ - close(code, data) { - if (this.readyState === WebSocket.CLOSED) return; - if (this.readyState === WebSocket.CONNECTING) { - const msg = 'WebSocket was closed before the connection was established'; - return abortHandshake(this, this._req, msg); - } - - if (this.readyState === WebSocket.CLOSING) { - if ( - this._closeFrameSent && - (this._closeFrameReceived || this._receiver._writableState.errorEmitted) - ) { - this._socket.end(); - } - - return; - } - - this._readyState = WebSocket.CLOSING; - this._sender.close(code, data, !this._isServer, (err) => { - // - // This error is handled by the `'error'` listener on the socket. We only - // want to know if the close frame has been sent here. - // - if (err) return; - - this._closeFrameSent = true; - - if ( - this._closeFrameReceived || - this._receiver._writableState.errorEmitted - ) { - this._socket.end(); - } - }); - - // - // Specify a timeout for the closing handshake to complete. - // - this._closeTimer = setTimeout( - this._socket.destroy.bind(this._socket), - closeTimeout - ); - } - - /** - * Send a ping. - * - * @param {*} [data] The data to send - * @param {Boolean} [mask] Indicates whether or not to mask `data` - * @param {Function} [cb] Callback which is executed when the ping is sent - * @public - */ - ping(data, mask, cb) { - if (this.readyState === WebSocket.CONNECTING) { - throw new Error('WebSocket is not open: readyState 0 (CONNECTING)'); - } - - if (typeof data === 'function') { - cb = data; - data = mask = undefined; - } else if (typeof mask === 'function') { - cb = mask; - mask = undefined; - } - - if (typeof data === 'number') data = data.toString(); - - if (this.readyState !== WebSocket.OPEN) { - sendAfterClose(this, data, cb); - return; - } - - if (mask === undefined) mask = !this._isServer; - this._sender.ping(data || EMPTY_BUFFER, mask, cb); - } - - /** - * Send a pong. - * - * @param {*} [data] The data to send - * @param {Boolean} [mask] Indicates whether or not to mask `data` - * @param {Function} [cb] Callback which is executed when the pong is sent - * @public - */ - pong(data, mask, cb) { - if (this.readyState === WebSocket.CONNECTING) { - throw new Error('WebSocket is not open: readyState 0 (CONNECTING)'); - } - - if (typeof data === 'function') { - cb = data; - data = mask = undefined; - } else if (typeof mask === 'function') { - cb = mask; - mask = undefined; - } - - if (typeof data === 'number') data = data.toString(); - - if (this.readyState !== WebSocket.OPEN) { - sendAfterClose(this, data, cb); - return; - } - - if (mask === undefined) mask = !this._isServer; - this._sender.pong(data || EMPTY_BUFFER, mask, cb); - } - - /** - * Send a data message. - * - * @param {*} data The message to send - * @param {Object} [options] Options object - * @param {Boolean} [options.compress] Specifies whether or not to compress - * `data` - * @param {Boolean} [options.binary] Specifies whether `data` is binary or - * text - * @param {Boolean} [options.fin=true] Specifies whether the fragment is the - * last one - * @param {Boolean} [options.mask] Specifies whether or not to mask `data` - * @param {Function} [cb] Callback which is executed when data is written out - * @public - */ - send(data, options, cb) { - if (this.readyState === WebSocket.CONNECTING) { - throw new Error('WebSocket is not open: readyState 0 (CONNECTING)'); - } - - if (typeof options === 'function') { - cb = options; - options = {}; - } - - if (typeof data === 'number') data = data.toString(); - - if (this.readyState !== WebSocket.OPEN) { - sendAfterClose(this, data, cb); - return; - } - - const opts = { - binary: typeof data !== 'string', - mask: !this._isServer, - compress: true, - fin: true, - ...options - }; - - if (!this._extensions[PerMessageDeflate.extensionName]) { - opts.compress = false; - } - - this._sender.send(data || EMPTY_BUFFER, opts, cb); - } - - /** - * Forcibly close the connection. - * - * @public - */ - terminate() { - if (this.readyState === WebSocket.CLOSED) return; - if (this.readyState === WebSocket.CONNECTING) { - const msg = 'WebSocket was closed before the connection was established'; - return abortHandshake(this, this._req, msg); - } - - if (this._socket) { - this._readyState = WebSocket.CLOSING; - this._socket.destroy(); - } - } -} - -/** - * @constant {Number} CONNECTING - * @memberof WebSocket - */ -Object.defineProperty(WebSocket, 'CONNECTING', { - enumerable: true, - value: readyStates.indexOf('CONNECTING') -}); - -/** - * @constant {Number} CONNECTING - * @memberof WebSocket.prototype - */ -Object.defineProperty(WebSocket.prototype, 'CONNECTING', { - enumerable: true, - value: readyStates.indexOf('CONNECTING') -}); - -/** - * @constant {Number} OPEN - * @memberof WebSocket - */ -Object.defineProperty(WebSocket, 'OPEN', { - enumerable: true, - value: readyStates.indexOf('OPEN') -}); - -/** - * @constant {Number} OPEN - * @memberof WebSocket.prototype - */ -Object.defineProperty(WebSocket.prototype, 'OPEN', { - enumerable: true, - value: readyStates.indexOf('OPEN') -}); - -/** - * @constant {Number} CLOSING - * @memberof WebSocket - */ -Object.defineProperty(WebSocket, 'CLOSING', { - enumerable: true, - value: readyStates.indexOf('CLOSING') -}); - -/** - * @constant {Number} CLOSING - * @memberof WebSocket.prototype - */ -Object.defineProperty(WebSocket.prototype, 'CLOSING', { - enumerable: true, - value: readyStates.indexOf('CLOSING') -}); - -/** - * @constant {Number} CLOSED - * @memberof WebSocket - */ -Object.defineProperty(WebSocket, 'CLOSED', { - enumerable: true, - value: readyStates.indexOf('CLOSED') -}); - -/** - * @constant {Number} CLOSED - * @memberof WebSocket.prototype - */ -Object.defineProperty(WebSocket.prototype, 'CLOSED', { - enumerable: true, - value: readyStates.indexOf('CLOSED') -}); - -[ - 'binaryType', - 'bufferedAmount', - 'extensions', - 'protocol', - 'readyState', - 'url' -].forEach((property) => { - Object.defineProperty(WebSocket.prototype, property, { enumerable: true }); -}); - -// -// Add the `onopen`, `onerror`, `onclose`, and `onmessage` attributes. -// See https://html.spec.whatwg.org/multipage/comms.html#the-websocket-interface -// -['open', 'error', 'close', 'message'].forEach((method) => { - Object.defineProperty(WebSocket.prototype, `on${method}`, { - enumerable: true, - get() { - const listeners = this.listeners(method); - for (let i = 0; i < listeners.length; i++) { - if (listeners[i]._listener) return listeners[i]._listener; - } - - return undefined; - }, - set(listener) { - const listeners = this.listeners(method); - for (let i = 0; i < listeners.length; i++) { - // - // Remove only the listeners added via `addEventListener`. - // - if (listeners[i]._listener) this.removeListener(method, listeners[i]); - } - this.addEventListener(method, listener); - } - }); -}); - -WebSocket.prototype.addEventListener = addEventListener; -WebSocket.prototype.removeEventListener = removeEventListener; - -module.exports = WebSocket; - -/** - * Initialize a WebSocket client. - * - * @param {WebSocket} websocket The client to initialize - * @param {(String|URL)} address The URL to which to connect - * @param {String} [protocols] The subprotocols - * @param {Object} [options] Connection options - * @param {(Boolean|Object)} [options.perMessageDeflate=true] Enable/disable - * permessage-deflate - * @param {Number} [options.handshakeTimeout] Timeout in milliseconds for the - * handshake request - * @param {Number} [options.protocolVersion=13] Value of the - * `Sec-WebSocket-Version` header - * @param {String} [options.origin] Value of the `Origin` or - * `Sec-WebSocket-Origin` header - * @param {Number} [options.maxPayload=104857600] The maximum allowed message - * size - * @param {Boolean} [options.followRedirects=false] Whether or not to follow - * redirects - * @param {Number} [options.maxRedirects=10] The maximum number of redirects - * allowed - * @private - */ -function initAsClient(websocket, address, protocols, options) { - const opts = { - protocolVersion: protocolVersions[1], - maxPayload: 100 * 1024 * 1024, - perMessageDeflate: true, - followRedirects: false, - maxRedirects: 10, - ...options, - createConnection: undefined, - socketPath: undefined, - hostname: undefined, - protocol: undefined, - timeout: undefined, - method: undefined, - host: undefined, - path: undefined, - port: undefined - }; - - if (!protocolVersions.includes(opts.protocolVersion)) { - throw new RangeError( - `Unsupported protocol version: ${opts.protocolVersion} ` + - `(supported versions: ${protocolVersions.join(', ')})` - ); - } - - let parsedUrl; - - if (address instanceof URL) { - parsedUrl = address; - websocket._url = address.href; - } else { - parsedUrl = new URL(address); - websocket._url = address; - } - - const isUnixSocket = parsedUrl.protocol === 'ws+unix:'; - - if (!parsedUrl.host && (!isUnixSocket || !parsedUrl.pathname)) { - const err = new Error(`Invalid URL: ${websocket.url}`); - - if (websocket._redirects === 0) { - throw err; - } else { - emitErrorAndClose(websocket, err); - return; - } - } - - const isSecure = - parsedUrl.protocol === 'wss:' || parsedUrl.protocol === 'https:'; - const defaultPort = isSecure ? 443 : 80; - const key = randomBytes(16).toString('base64'); - const get = isSecure ? https.get : http.get; - let perMessageDeflate; - - opts.createConnection = isSecure ? tlsConnect : netConnect; - opts.defaultPort = opts.defaultPort || defaultPort; - opts.port = parsedUrl.port || defaultPort; - opts.host = parsedUrl.hostname.startsWith('[') - ? parsedUrl.hostname.slice(1, -1) - : parsedUrl.hostname; - opts.headers = { - 'Sec-WebSocket-Version': opts.protocolVersion, - 'Sec-WebSocket-Key': key, - Connection: 'Upgrade', - Upgrade: 'websocket', - ...opts.headers - }; - opts.path = parsedUrl.pathname + parsedUrl.search; - opts.timeout = opts.handshakeTimeout; - - if (opts.perMessageDeflate) { - perMessageDeflate = new PerMessageDeflate( - opts.perMessageDeflate !== true ? opts.perMessageDeflate : {}, - false, - opts.maxPayload - ); - opts.headers['Sec-WebSocket-Extensions'] = format({ - [PerMessageDeflate.extensionName]: perMessageDeflate.offer() - }); - } - if (protocols) { - opts.headers['Sec-WebSocket-Protocol'] = protocols; - } - if (opts.origin) { - if (opts.protocolVersion < 13) { - opts.headers['Sec-WebSocket-Origin'] = opts.origin; - } else { - opts.headers.Origin = opts.origin; - } - } - if (parsedUrl.username || parsedUrl.password) { - opts.auth = `${parsedUrl.username}:${parsedUrl.password}`; - } - - if (isUnixSocket) { - const parts = opts.path.split(':'); - - opts.socketPath = parts[0]; - opts.path = parts[1]; - } - - if (opts.followRedirects) { - if (websocket._redirects === 0) { - websocket._originalUnixSocket = isUnixSocket; - websocket._originalSecure = isSecure; - websocket._originalHostOrSocketPath = isUnixSocket - ? opts.socketPath - : parsedUrl.host; - - const headers = options && options.headers; - - // - // Shallow copy the user provided options so that headers can be changed - // without mutating the original object. - // - options = { ...options, headers: {} }; - - if (headers) { - for (const [key, value] of Object.entries(headers)) { - options.headers[key.toLowerCase()] = value; - } - } - } else { - const isSameHost = isUnixSocket - ? websocket._originalUnixSocket - ? opts.socketPath === websocket._originalHostOrSocketPath - : false - : websocket._originalUnixSocket - ? false - : parsedUrl.host === websocket._originalHostOrSocketPath; - - if (!isSameHost || (websocket._originalSecure && !isSecure)) { - // - // Match curl 7.77.0 behavior and drop the following headers. These - // headers are also dropped when following a redirect to a subdomain. - // - delete opts.headers.authorization; - delete opts.headers.cookie; - - if (!isSameHost) delete opts.headers.host; - - opts.auth = undefined; - } - } - - // - // Match curl 7.77.0 behavior and make the first `Authorization` header win. - // If the `Authorization` header is set, then there is nothing to do as it - // will take precedence. - // - if (opts.auth && !options.headers.authorization) { - options.headers.authorization = - 'Basic ' + Buffer.from(opts.auth).toString('base64'); - } - } - - let req = (websocket._req = get(opts)); - - if (opts.timeout) { - req.on('timeout', () => { - abortHandshake(websocket, req, 'Opening handshake has timed out'); - }); - } - - req.on('error', (err) => { - if (req === null || req.aborted) return; - - req = websocket._req = null; - emitErrorAndClose(websocket, err); - }); - - req.on('response', (res) => { - const location = res.headers.location; - const statusCode = res.statusCode; - - if ( - location && - opts.followRedirects && - statusCode >= 300 && - statusCode < 400 - ) { - if (++websocket._redirects > opts.maxRedirects) { - abortHandshake(websocket, req, 'Maximum redirects exceeded'); - return; - } - - req.abort(); - - let addr; - - try { - addr = new URL(location, address); - } catch (err) { - emitErrorAndClose(websocket, err); - return; - } - - initAsClient(websocket, addr, protocols, options); - } else if (!websocket.emit('unexpected-response', req, res)) { - abortHandshake( - websocket, - req, - `Unexpected server response: ${res.statusCode}` - ); - } - }); - - req.on('upgrade', (res, socket, head) => { - websocket.emit('upgrade', res); - - // - // The user may have closed the connection from a listener of the `upgrade` - // event. - // - if (websocket.readyState !== WebSocket.CONNECTING) return; - - req = websocket._req = null; - - const upgrade = res.headers.upgrade; - - if (upgrade === undefined || upgrade.toLowerCase() !== 'websocket') { - abortHandshake(websocket, socket, 'Invalid Upgrade header'); - return; - } - - const digest = createHash('sha1') - .update(key + GUID) - .digest('base64'); - - if (res.headers['sec-websocket-accept'] !== digest) { - abortHandshake(websocket, socket, 'Invalid Sec-WebSocket-Accept header'); - return; - } - - const serverProt = res.headers['sec-websocket-protocol']; - const protList = (protocols || '').split(/, */); - let protError; - - if (!protocols && serverProt) { - protError = 'Server sent a subprotocol but none was requested'; - } else if (protocols && !serverProt) { - protError = 'Server sent no subprotocol'; - } else if (serverProt && !protList.includes(serverProt)) { - protError = 'Server sent an invalid subprotocol'; - } - - if (protError) { - abortHandshake(websocket, socket, protError); - return; - } - - if (serverProt) websocket._protocol = serverProt; - - const secWebSocketExtensions = res.headers['sec-websocket-extensions']; - - if (secWebSocketExtensions !== undefined) { - if (!perMessageDeflate) { - const message = - 'Server sent a Sec-WebSocket-Extensions header but no extension ' + - 'was requested'; - abortHandshake(websocket, socket, message); - return; - } - - let extensions; - - try { - extensions = parse(secWebSocketExtensions); - } catch (err) { - const message = 'Invalid Sec-WebSocket-Extensions header'; - abortHandshake(websocket, socket, message); - return; - } - - const extensionNames = Object.keys(extensions); - - if (extensionNames.length) { - if ( - extensionNames.length !== 1 || - extensionNames[0] !== PerMessageDeflate.extensionName - ) { - const message = - 'Server indicated an extension that was not requested'; - abortHandshake(websocket, socket, message); - return; - } - - try { - perMessageDeflate.accept(extensions[PerMessageDeflate.extensionName]); - } catch (err) { - const message = 'Invalid Sec-WebSocket-Extensions header'; - abortHandshake(websocket, socket, message); - return; - } - - websocket._extensions[PerMessageDeflate.extensionName] = - perMessageDeflate; - } - } - - websocket.setSocket(socket, head, opts.maxPayload); - }); -} - -/** - * Emit the `'error'` and `'close'` event. - * - * @param {WebSocket} websocket The WebSocket instance - * @param {Error} The error to emit - * @private - */ -function emitErrorAndClose(websocket, err) { - websocket._readyState = WebSocket.CLOSING; - websocket.emit('error', err); - websocket.emitClose(); -} - -/** - * Create a `net.Socket` and initiate a connection. - * - * @param {Object} options Connection options - * @return {net.Socket} The newly created socket used to start the connection - * @private - */ -function netConnect(options) { - options.path = options.socketPath; - return net.connect(options); -} - -/** - * Create a `tls.TLSSocket` and initiate a connection. - * - * @param {Object} options Connection options - * @return {tls.TLSSocket} The newly created socket used to start the connection - * @private - */ -function tlsConnect(options) { - options.path = undefined; - - if (!options.servername && options.servername !== '') { - options.servername = net.isIP(options.host) ? '' : options.host; - } - - return tls.connect(options); -} - -/** - * Abort the handshake and emit an error. - * - * @param {WebSocket} websocket The WebSocket instance - * @param {(http.ClientRequest|net.Socket|tls.Socket)} stream The request to - * abort or the socket to destroy - * @param {String} message The error message - * @private - */ -function abortHandshake(websocket, stream, message) { - websocket._readyState = WebSocket.CLOSING; - - const err = new Error(message); - Error.captureStackTrace(err, abortHandshake); - - if (stream.setHeader) { - stream.abort(); - - if (stream.socket && !stream.socket.destroyed) { - // - // On Node.js >= 14.3.0 `request.abort()` does not destroy the socket if - // called after the request completed. See - // https://github.com/websockets/ws/issues/1869. - // - stream.socket.destroy(); - } - - stream.once('abort', websocket.emitClose.bind(websocket)); - websocket.emit('error', err); - } else { - stream.destroy(err); - stream.once('error', websocket.emit.bind(websocket, 'error')); - stream.once('close', websocket.emitClose.bind(websocket)); - } -} - -/** - * Handle cases where the `ping()`, `pong()`, or `send()` methods are called - * when the `readyState` attribute is `CLOSING` or `CLOSED`. - * - * @param {WebSocket} websocket The WebSocket instance - * @param {*} [data] The data to send - * @param {Function} [cb] Callback - * @private - */ -function sendAfterClose(websocket, data, cb) { - if (data) { - const length = toBuffer(data).length; - - // - // The `_bufferedAmount` property is used only when the peer is a client and - // the opening handshake fails. Under these circumstances, in fact, the - // `setSocket()` method is not called, so the `_socket` and `_sender` - // properties are set to `null`. - // - if (websocket._socket) websocket._sender._bufferedBytes += length; - else websocket._bufferedAmount += length; - } - - if (cb) { - const err = new Error( - `WebSocket is not open: readyState ${websocket.readyState} ` + - `(${readyStates[websocket.readyState]})` - ); - cb(err); - } -} - -/** - * The listener of the `Receiver` `'conclude'` event. - * - * @param {Number} code The status code - * @param {String} reason The reason for closing - * @private - */ -function receiverOnConclude(code, reason) { - const websocket = this[kWebSocket]; - - websocket._closeFrameReceived = true; - websocket._closeMessage = reason; - websocket._closeCode = code; - - if (websocket._socket[kWebSocket] === undefined) return; - - websocket._socket.removeListener('data', socketOnData); - process.nextTick(resume, websocket._socket); - - if (code === 1005) websocket.close(); - else websocket.close(code, reason); -} - -/** - * The listener of the `Receiver` `'drain'` event. - * - * @private - */ -function receiverOnDrain() { - this[kWebSocket]._socket.resume(); -} - -/** - * The listener of the `Receiver` `'error'` event. - * - * @param {(RangeError|Error)} err The emitted error - * @private - */ -function receiverOnError(err) { - const websocket = this[kWebSocket]; - - if (websocket._socket[kWebSocket] !== undefined) { - websocket._socket.removeListener('data', socketOnData); - - // - // On Node.js < 14.0.0 the `'error'` event is emitted synchronously. See - // https://github.com/websockets/ws/issues/1940. - // - process.nextTick(resume, websocket._socket); - - websocket.close(err[kStatusCode]); - } - - websocket.emit('error', err); -} - -/** - * The listener of the `Receiver` `'finish'` event. - * - * @private - */ -function receiverOnFinish() { - this[kWebSocket].emitClose(); -} - -/** - * The listener of the `Receiver` `'message'` event. - * - * @param {(String|Buffer|ArrayBuffer|Buffer[])} data The message - * @private - */ -function receiverOnMessage(data) { - this[kWebSocket].emit('message', data); -} - -/** - * The listener of the `Receiver` `'ping'` event. - * - * @param {Buffer} data The data included in the ping frame - * @private - */ -function receiverOnPing(data) { - const websocket = this[kWebSocket]; - - websocket.pong(data, !websocket._isServer, NOOP); - websocket.emit('ping', data); -} - -/** - * The listener of the `Receiver` `'pong'` event. - * - * @param {Buffer} data The data included in the pong frame - * @private - */ -function receiverOnPong(data) { - this[kWebSocket].emit('pong', data); -} - -/** - * Resume a readable stream - * - * @param {Readable} stream The readable stream - * @private - */ -function resume(stream) { - stream.resume(); -} - -/** - * The listener of the `net.Socket` `'close'` event. - * - * @private - */ -function socketOnClose() { - const websocket = this[kWebSocket]; - - this.removeListener('close', socketOnClose); - this.removeListener('data', socketOnData); - this.removeListener('end', socketOnEnd); - - websocket._readyState = WebSocket.CLOSING; - - let chunk; - - // - // The close frame might not have been received or the `'end'` event emitted, - // for example, if the socket was destroyed due to an error. Ensure that the - // `receiver` stream is closed after writing any remaining buffered data to - // it. If the readable side of the socket is in flowing mode then there is no - // buffered data as everything has been already written and `readable.read()` - // will return `null`. If instead, the socket is paused, any possible buffered - // data will be read as a single chunk. - // - if ( - !this._readableState.endEmitted && - !websocket._closeFrameReceived && - !websocket._receiver._writableState.errorEmitted && - (chunk = websocket._socket.read()) !== null - ) { - websocket._receiver.write(chunk); - } - - websocket._receiver.end(); - - this[kWebSocket] = undefined; - - clearTimeout(websocket._closeTimer); - - if ( - websocket._receiver._writableState.finished || - websocket._receiver._writableState.errorEmitted - ) { - websocket.emitClose(); - } else { - websocket._receiver.on('error', receiverOnFinish); - websocket._receiver.on('finish', receiverOnFinish); - } -} - -/** - * The listener of the `net.Socket` `'data'` event. - * - * @param {Buffer} chunk A chunk of data - * @private - */ -function socketOnData(chunk) { - if (!this[kWebSocket]._receiver.write(chunk)) { - this.pause(); - } -} - -/** - * The listener of the `net.Socket` `'end'` event. - * - * @private - */ -function socketOnEnd() { - const websocket = this[kWebSocket]; - - websocket._readyState = WebSocket.CLOSING; - websocket._receiver.end(); - this.end(); -} - -/** - * The listener of the `net.Socket` `'error'` event. - * - * @private - */ -function socketOnError() { - const websocket = this[kWebSocket]; - - this.removeListener('error', socketOnError); - this.on('error', NOOP); - - if (websocket) { - websocket._readyState = WebSocket.CLOSING; - this.destroy(); - } -} diff --git a/server/node_modules/ws/package.json b/server/node_modules/ws/package.json deleted file mode 100644 index 0417b97..0000000 --- a/server/node_modules/ws/package.json +++ /dev/null @@ -1,56 +0,0 @@ -{ - "name": "ws", - "version": "7.5.10", - "description": "Simple to use, blazing fast and thoroughly tested websocket client and server for Node.js", - "keywords": [ - "HyBi", - "Push", - "RFC-6455", - "WebSocket", - "WebSockets", - "real-time" - ], - "homepage": "https://github.com/websockets/ws", - "bugs": "https://github.com/websockets/ws/issues", - "repository": "websockets/ws", - "author": "Einar Otto Stangvik (http://2x.io)", - "license": "MIT", - "main": "index.js", - "browser": "browser.js", - "engines": { - "node": ">=8.3.0" - }, - "files": [ - "browser.js", - "index.js", - "lib/*.js" - ], - "scripts": { - "test": "nyc --reporter=lcov --reporter=text mocha --throw-deprecation test/*.test.js", - "integration": "mocha --throw-deprecation test/*.integration.js", - "lint": "eslint --ignore-path .gitignore . && prettier --check --ignore-path .gitignore \"**/*.{json,md,yaml,yml}\"" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": "^5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - }, - "devDependencies": { - "benchmark": "^2.1.4", - "bufferutil": "^4.0.1", - "eslint": "^7.2.0", - "eslint-config-prettier": "^8.1.0", - "eslint-plugin-prettier": "^4.0.0", - "mocha": "^7.0.0", - "nyc": "^15.0.0", - "prettier": "^2.0.5", - "utf-8-validate": "^5.0.2" - } -} diff --git a/server/server.js b/server/server.js index 7840668..f098038 100644 --- a/server/server.js +++ b/server/server.js @@ -45,7 +45,7 @@ const config = { wsHost: '127.0.0.1', wsPort: 8088, seenTimeout: 60000, - debug: true + debug: false }; // Create websocket server @@ -617,6 +617,5 @@ const isObject = ( value ) => { setInterval(() => { if (global.gc) { global.gc(); - gcCounter++; } }, 30000); \ No newline at end of file diff --git a/vite.config.js b/vite.config.js index 03265db..5bdf759 100644 --- a/vite.config.js +++ b/vite.config.js @@ -21,15 +21,21 @@ export default defineConfig({ output: { // 使用函数形式的 manualChunks 代替对象形式 manualChunks: (id) => { - if (id.includes('node_modules')) { - if (/aes-js|elliptic|js-chacha20|js-sha256/.test(id)) { + if (id.includes('node_modules')) { if (/aes-js|elliptic|js-chacha20|js-sha256/.test(id)) { return 'crypto-libs'; } if (id.includes('buffer')) { return 'vendor'; } + if (id.includes('emoji-picker-element')) { + return 'emoji-libs'; + } + if (id.includes('@dicebear')) { + return 'avatar-libs'; + } return 'vendor-deps'; // 其他依赖包 } + return undefined; // 添加默认返回值,避免语法错误 }, }, }, @@ -43,14 +49,13 @@ export default defineConfig({ alias: { buffer: 'buffer', // 让 Vite 识别 buffer }, - }, - // 优化开发服务器 + }, // 优化开发服务器 server: { hmr: true, // 热模块替换 open: true, // 自动打开浏览器 }, // 禁用不需要的功能以提高构建速度 optimizeDeps: { - include: ['buffer', 'aes-js', 'elliptic', 'js-chacha20', 'js-sha256'], // 预构建这些依赖 + include: ['buffer', 'aes-js', 'elliptic', 'js-chacha20', 'js-sha256', '@dicebear/core', '@dicebear/micah'], // 预构建这些依赖 }, }); \ No newline at end of file diff --git a/web/NodeCrypt.js b/web/NodeCrypt.js index 12b288f..d3eed9e 100644 --- a/web/NodeCrypt.js +++ b/web/NodeCrypt.js @@ -2,7 +2,7 @@ import { ec as elliptic } from 'elliptic'; import { ModeOfOperation } from 'aes-js'; import chacha from 'js-chacha20'; -import './NodeCrypt.js';import { Buffer } from 'buffer'; +import { Buffer } from 'buffer'; window.Buffer = Buffer; class ChatCrypt { constructor ( config = {}, callbacks = {} ) { diff --git a/web/chat.js b/web/chat.js index 303db1e..7c48342 100644 --- a/web/chat.js +++ b/web/chat.js @@ -133,17 +133,15 @@ export function addOtherMsg(msg, userName = '', avatar = '', isHistory = false, ${contentHtml} ${time} - - `; + `; - createAvatarSVG(userName).then(svg => { - const avatarEl = $('.avatar', bubbleWrap); - if (avatarEl) { - // 清理SVG,移除任何可能的脚本内容 - const cleanSvg = svg.replace(/)<[^<]*)*<\/script>/gi, ''); - avatarEl.innerHTML = cleanSvg; - } - }); + const svg = createAvatarSVG(userName); + const avatarEl = $('.avatar', bubbleWrap); + if (avatarEl) { + // 清理SVG,移除任何可能的脚本内容 + const cleanSvg = svg.replace(/)<[^<]*)*<\/script>/gi, ''); + avatarEl.innerHTML = cleanSvg; + } chatArea.appendChild(bubbleWrap); chatArea.scrollTop = chatArea.scrollHeight; diff --git a/web/index.html b/web/index.html index 9cb30a6..15a4ebb 100644 --- a/web/index.html +++ b/web/index.html @@ -91,6 +91,6 @@ - + \ No newline at end of file diff --git a/web/main.js b/web/main.js index 4205c42..9c25aab 100644 --- a/web/main.js +++ b/web/main.js @@ -3,6 +3,9 @@ * 负责初始化界面、绑定事件及协调各模块功能 */ +// 先导入加密库依赖模块 +import './NodeCrypt.js'; + // === 工具模块导入 === import { processImage, setupImageSend } from './util.image.js'; import { setupEmojiPicker } from './util.emoji.js'; @@ -10,8 +13,6 @@ import { openSettingsPanel, closeSettingsPanel, initSettings, notifyMessage } fr import { escapeHTML, textToHTML } from './util.string.js'; import { $, $$, $id, on, off, addClass, removeClass } from './util.dom.js'; -// import './NodeCrypt.js'; - // === 核心功能模块导入 === import { roomsData, diff --git a/web/room.js b/web/room.js index 0dc86e2..55800d0 100644 --- a/web/room.js +++ b/web/room.js @@ -60,14 +60,13 @@ export function switchRoom(index) { */ export function setSidebarAvatar(userName) { if (!userName) return; - createAvatarSVG(userName).then(svg => { - const el = $id('sidebar-user-avatar'); - if (el) { - // 清理SVG,移除任何可能的脚本内容 - const cleanSvg = svg.replace(/)<[^<]*)*<\/script>/gi, ''); - el.innerHTML = cleanSvg; - } - }); + const svg = createAvatarSVG(userName); + const el = $id('sidebar-user-avatar'); + if (el) { + // 清理SVG,移除任何可能的脚本内容 + const cleanSvg = svg.replace(/)<[^<]*)*<\/script>/gi, ''); + el.innerHTML = cleanSvg; + } } /** diff --git a/web/ui.js b/web/ui.js index 04301be..5cb6808 100644 --- a/web/ui.js +++ b/web/ui.js @@ -162,17 +162,15 @@ export function createUserItem(user, isMe) { const isPrivateTarget = rd && user.clientId === rd.privateChatTargetId; div.className = 'member' + (isMe ? ' me' : '') + (isPrivateTarget ? ' private-chat-active' : ''); - - // 兼容 userName/username/name + // 兼容 userName/username/name const rawName = user.userName || user.username || user.name || ''; const safeUserName = escapeHTML(rawName); // 头像 SVG - createAvatarSVG(rawName).then(svg => { - // svg内容已经通过createAvatarSVG生成,通常是安全的 - // 但为确保安全,仍应当清理任何可能的脚本内容 - const cleanSvg = svg.replace(/)<[^<]*)*<\/script>/gi, ''); - div.querySelector('.avatar').innerHTML = cleanSvg; - }); + const svg = createAvatarSVG(rawName); + // svg内容已经通过createAvatarSVG生成,通常是安全的 + // 但为确保安全,仍应当清理任何可能的脚本内容 + const cleanSvg = svg.replace(/)<[^<]*)*<\/script>/gi, ''); + div.querySelector('.avatar').innerHTML = cleanSvg; div.innerHTML = ` diff --git a/web/util.avatar.js b/web/util.avatar.js index 441c57f..6a6a6a0 100644 --- a/web/util.avatar.js +++ b/web/util.avatar.js @@ -1,15 +1,6 @@ -// 头像生成工具 -let dicebear = null; -let micah = null; - -async function ensureDicebear() { - if (!dicebear || !micah) { - dicebear = await import('https://cdn.jsdelivr.net/npm/@dicebear/core@9.2.2/+esm'); - micah = await import('https://cdn.jsdelivr.net/npm/@dicebear/micah@9.2.2/+esm'); - } -} - -ensureDicebear(); +// util.avatar.js - 头像生成工具 (NPM模式) +import * as dicebearCore from '@dicebear/core'; +import * as dicebearMicah from '@dicebear/micah'; const bgColors = ["f87171","fb923c","09acf4", "fb923c", "f472b6","a78bfa","34d399"]; function pickColor(seed) { @@ -18,9 +9,8 @@ function pickColor(seed) { return bgColors[Math.abs(hash) % bgColors.length]; } -export async function createAvatarSVG(userName) { - await ensureDicebear(); - return dicebear.createAvatar(micah, { +export function createAvatarSVG(userName) { + return dicebearCore.createAvatar(dicebearMicah, { seed: userName, baseColor: ["f7e1c3", "f9c9b6", "f2d6cb", "f8ce8e", "eac393"], backgroundColor: [pickColor(userName)] diff --git a/web/util.emoji.js b/web/util.emoji.js index 947af7a..caf507e 100644 --- a/web/util.emoji.js +++ b/web/util.emoji.js @@ -1,23 +1,7 @@ // util.emoji.js -// 使用emoji-picker-element库的表情选择器模块 +// 使用emoji-picker-element库的表情选择器模块 (NPM模式) import { $, $$, createElement, on } from './util.dom.js'; - -// 加载emoji-picker-element库 -const loadEmojiPickerScript = () => { - return new Promise((resolve, reject) => { - if (document.querySelector('script[src*="emoji-picker-element"]')) { - resolve(); // 如果脚本已加载,直接解析 - return; - } - - const script = document.createElement('script'); - script.type = 'module'; - script.src = 'https://cdn.jsdelivr.net/npm/emoji-picker-element@^1/index.js'; - script.onload = resolve; - script.onerror = reject; - document.head.appendChild(script); - }); -}; +import 'emoji-picker-element'; // 添加emoji-picker元素的默认样式 const addEmojiPickerStyles = () => { @@ -50,13 +34,19 @@ const addEmojiPickerStyles = () => { document.head.appendChild(style); }; -export async function setupEmojiPicker({ btnSelector = '.chat-emoji-btn', inputSelector = '.input-message-input' } = {}) { +/** + * 设置表情选择器 + * @param {Object} options - 配置选项 + * @param {string} options.btnSelector - 表情按钮选择器 + * @param {string} options.inputSelector - 输入框选择器 + * @returns {void} + */ +export function setupEmojiPicker({ btnSelector = '.chat-emoji-btn', inputSelector = '.input-message-input' } = {}) { const btn = $(btnSelector); const input = $(inputSelector); if (!btn || !input) return; try { - await loadEmojiPickerScript(); addEmojiPickerStyles(); // 移除可能存在的旧表情选择器 @@ -96,6 +86,12 @@ export async function setupEmojiPicker({ btnSelector = '.chat-emoji-btn', inputS } } +/** + * 在输入框中插入表情 + * @param {HTMLElement} input - 输入框元素 + * @param {string} emoji - 表情Unicode字符 + * @returns {void} + */ function insertEmoji(input, emoji) { input.focus(); if (document.getSelection && window.getSelection) {