diff --git a/.changeset/moody-yaks-judge.md b/.changeset/moody-yaks-judge.md new file mode 100644 index 0000000..dc0523a --- /dev/null +++ b/.changeset/moody-yaks-judge.md @@ -0,0 +1,9 @@ +--- +'@nest-lab/platform-uws': major +--- + +Adds platform-uws for uWebSockets.js HTTP/WSS Server + +- `UWS` has a much [lower memory footprint](https://socket.io/docs/v4/memory-usage/) +- **socket.io** reintroduced `UWS` in [v4](https://socket.io/docs/v4/server-installation/#usage-with-uwebsockets) (it's back again!) +- Performance is allegedly ["8x that of fastify and at least 10x that of socket.io"](https://github.com/uNetworking/uWebSockets.js#zap-simple-performance) diff --git a/package.json b/package.json index 10f6b8b..c678643 100644 --- a/package.json +++ b/package.json @@ -33,8 +33,10 @@ "@nestjs/core": "10.0.3", "@nestjs/platform-express": "10.0.3", "@nestjs/platform-fastify": "10.0.3", + "@nestjs/platform-socket.io": "10.0.3", "@nestjs/schematics": "10.0.1", "@nestjs/testing": "10.0.3", + "@nestjs/websockets": "10.0.3", "@nrwl/tao": "16.4.0", "@swc/core": "^1.2.218", "@swc/register": "^0.1.10", diff --git a/packages/platform-uws/.eslintrc.json b/packages/platform-uws/.eslintrc.json new file mode 100644 index 0000000..9d9c0db --- /dev/null +++ b/packages/platform-uws/.eslintrc.json @@ -0,0 +1,18 @@ +{ + "extends": ["../../.eslintrc.json"], + "ignorePatterns": ["!**/*"], + "overrides": [ + { + "files": ["*.ts", "*.tsx", "*.js", "*.jsx"], + "rules": {} + }, + { + "files": ["*.ts", "*.tsx"], + "rules": {} + }, + { + "files": ["*.js", "*.jsx"], + "rules": {} + } + ] +} diff --git a/packages/platform-uws/README.md b/packages/platform-uws/README.md new file mode 100644 index 0000000..4416431 --- /dev/null +++ b/packages/platform-uws/README.md @@ -0,0 +1,64 @@ +# ⚡ @nest-lab/platform-uws +> `HttpAdapter` and `IoAdapter` for [uWebSockets.js](https://github.com/uNetworking/uWebSockets.js) (aka UWS) + + +## â„šī¸ Overview + +Replaces the `httpServer` with `UWS`. Overrides `IoAdapter` in [@nextjs/platform-socket.io](https://www.npmjs.com/package/@nestjs/platform-socket.io). + +### 🤔 Reasoning + - `UWS` has a much [lower memory footprint](https://socket.io/docs/v4/memory-usage/) + - **socket.io** reintroduced `UWS` in [v4](https://socket.io/docs/v4/server-installation/#usage-with-uwebsockets) (it's back again!) + - Performance is allegedly ["8x that of fastify and at least 10x that of socket.io"](https://github.com/uNetworking/uWebSockets.js#zap-simple-performance) + +## đŸ“Ļ Installation + +#### npm +```shell +npm i @nest-lab/platform-uws +``` +#### yarn +```shell +yarn add @nest-lab/platform-uws +``` +#### pnpm +```shell +pnpm i @nest-lab/platform-uws +``` + +## âš™ī¸ Usage + +```typescript +// ./src/main.ts +import { NestFactory } from '@nestjs/core'; +import { UwsHttpAdapter, UwsIoAdapter } from '@nest-lab/platform-uws'; +import { AppModule } from './app.module'; + +async function bootstrap() { + const app = await NestFactory.create(AppModule, new UwsHttpAdapter()); + const ioAdapter = new UwsIoAdapter(app); + app.useWebSocketAdapter(ioAdapter); + await app.listen(3000); +} +bootstrap(); +``` +## đŸĨ… Project Goals + +- [x] Provide basic `HTTPAdapter` backed by `UWS` +- [x] Provide `WebSocketAdapter` backed by `UWS` +- [ ] Provide Advanced `HTTPAdapter` features +- [ ] Test Specifications +- [ ] Test performance vs Express, Fastify and Socket.io + + +# đŸ‘Ĩ Credit + - [@jmcdo29]() @nest-lab scope maintainer + - [@TomBebb]() Original author of [UwsHttpAdapter](https://github.com/TomBebb/nestjs-adapter-uws) + - [@PhearZero]() Experimenting with [UWS](https://github.com/PhearZero/nest-uws) + + +## 🔊 Rant + +`uWebSockets.js` has been around for a while, and it's relationship with `socket.io` has been tenuous at best. +With the advent of the `Zig` language and subsequently the `Bun.js` interpreter, `uWebSockets` has become popular +again. This is even more true in the `Cryptocurrency` space with several large exchanges building exclusively on `UWS`. diff --git a/packages/platform-uws/package.json b/packages/platform-uws/package.json new file mode 100644 index 0000000..663291f --- /dev/null +++ b/packages/platform-uws/package.json @@ -0,0 +1,63 @@ +{ + "name": "@nest-lab/platform-uws", + "version": "0.0.0", + "description": "uWebSockets.js HTTP and Io adapters", + "keywords": [ + "uws", + "uWebSockets", + "uWebSockets.js", + "uNetworking", + "socket.io", + "express", + "nestjs" + ], + "license": "MIT", + "author": { + "name": "Michael J Feher", + "email": "mike@telluric.guru" + }, + "publishConfig": { + "access": "public" + }, + "repository": { + "type": "github", + "url": "https://github.com/jmcdo29/nest-lab", + "directory": "packages/platform-uws" + }, + "bugs": { + "url": "https://github.com/jmcdo29/nest-lab/issues" + }, + "type": "commonjs", + "dependencies": { + "http-status-codes": "^2.2.0", + "uWebSockets.js": "github:uNetworking/uWebSockets.js#v20.30.0" + }, + "peerDependencies": { + "@nestjs/common": "^9.0.0 || ^10.0.0", + "@nestjs/core": "^9.0.0 || ^10.0.0", + "@nestjs/platform-express": "^9.0.0 || ^10.0.0", + "@nestjs/platform-socket.io": "^9.0.0 || ^10.0.0", + "@nestjs/websockets": "^9.0.0 || ^10.0.0", + "socket.io": "^4.7.1" + }, + "peerDependenciesMeta": { + "@nestjs/common": { + "optional": false + }, + "@nestjs/core": { + "optional": false + }, + "@nestjs/platform-express": { + "optional": false + }, + "@nestjs/platform-socket.io": { + "optional": false + }, + "@nestjs/websockets": { + "optional": false + }, + "socket.io": { + "optional": false + } + } +} diff --git a/packages/platform-uws/project.json b/packages/platform-uws/project.json new file mode 100644 index 0000000..3d71911 --- /dev/null +++ b/packages/platform-uws/project.json @@ -0,0 +1,52 @@ +{ + "name": "platform-uws", + "$schema": "../../node_modules/nx/schemas/project-schema.json", + "sourceRoot": "packages/platform-uws/src", + "projectType": "library", + "targets": { + "build": { + "executor": "@nrwl/js:tsc", + "outputs": ["{options.outputPath}"], + "options": { + "outputPath": "dist/packages/platform-uws", + "tsConfig": "packages/platform-uws/tsconfig.lib.json", + "packageJson": "packages/platform-uws/package.json", + "main": "packages/platform-uws/src/index.ts", + "assets": ["packages/platform-uws/*.md"], + "updateBuildableProjectDepsInPackageJson": true, + "buildableProjectDepsInPackageJsonType": "dependencies" + } + }, + "publish": { + "executor": "nx:run-commands", + "options": { + "cwd": "dist/packages/platform-uws", + "command": "pnpm publish" + }, + "dependsOn": [ + { + "target": "build" + } + ] + }, + "lint": { + "executor": "@nx/linter:eslint", + "outputs": ["{options.outputFile}"], + "options": { + "lintFilePatterns": ["packages/platform-uws/**/*.ts"] + } + }, + "test": { + "executor": "nx:run-commands", + "options": { + "command": "node -r @swc/register --test packages/platform-uws/test/index.spec.ts" + }, + "configurations": { + "local": { + "command": "node -r @swc/register packages/platform-uws/test/index.spec.ts" + } + } + } + }, + "tags": [] +} diff --git a/packages/platform-uws/src/index.ts b/packages/platform-uws/src/index.ts new file mode 100644 index 0000000..4abd66d --- /dev/null +++ b/packages/platform-uws/src/index.ts @@ -0,0 +1 @@ +export * from './lib/adapters' diff --git a/packages/platform-uws/src/lib/adapters/index.ts b/packages/platform-uws/src/lib/adapters/index.ts new file mode 100644 index 0000000..d37add8 --- /dev/null +++ b/packages/platform-uws/src/lib/adapters/index.ts @@ -0,0 +1,2 @@ +export * from './uws-http-adapter'; +export * from './uws-io-adapter'; diff --git a/packages/platform-uws/src/lib/adapters/uws-http-adapter.ts b/packages/platform-uws/src/lib/adapters/uws-http-adapter.ts new file mode 100644 index 0000000..be96323 --- /dev/null +++ b/packages/platform-uws/src/lib/adapters/uws-http-adapter.ts @@ -0,0 +1,225 @@ +/** + * Modified from: + * @source https://github.com/TomBebb/nestjs-adapter-uws + */ +import * as uws from 'uWebSockets.js'; + +import { getReasonPhrase } from 'http-status-codes'; + +import { + Logger, + NestApplicationOptions, + RequestMethod, + StreamableFile, +} from '@nestjs/common'; +import { + CorsOptions, + CorsOptionsDelegate, +} from '@nestjs/common/interfaces/external/cors-options.interface'; + +import { AbstractHttpAdapter } from '@nestjs/core/adapters/http-adapter'; +export const isUndefined = (obj: any): obj is undefined => + typeof obj === 'undefined'; + +export const isNil = (val: any): val is null | undefined => + isUndefined(val) || val === null; + +export const isObject = (fn: any): fn is object => + !isNil(fn) && typeof fn === 'object'; + +import { createWriteStream } from 'fs'; + +class ServerWrapper { + address(): string { + return '0.0.0.0'; + } + + // eslint-disable-next-line @typescript-eslint/no-empty-function,@typescript-eslint/ban-types + removeListener(name: string, cb: Function) {} + constructor(public readonly inner: uws.TemplatedApp) {} + + // eslint-disable-next-line @typescript-eslint/no-empty-function + once() {} +} +import { RequestHandler, VERSION_NEUTRAL } from '@nestjs/common/interfaces'; + +function setStatus(res: uws.HttpResponse, code: number | string) { + res.writeStatus(`${code} ${getReasonPhrase(code)}`); +} + +// eslint-disable-next-line @typescript-eslint/ban-ts-comment +// @ts-ignore +export class UwsHttpAdapter extends AbstractHttpAdapter< + ServerWrapper, + uws.HttpRequest, + uws.HttpResponse +> { + get server(): uws.TemplatedApp { + return this.httpServer.inner; + } + + public listen(port: string, callback?: unknown): any { + const hostname = '0.0.0.0'; + Logger.log(`🚀 Listening at ${hostname}:${port}`, 'uWebSockets.js'); + this.server.listen( + '0.0.0.0', + (port as unknown as number) | 0, + callback as (listenSocket: uws.us_listen_socket | false) => void, + ); + } + + private injectConstraintsIfVersioned( + routerMethodKey: + | 'get' + | 'post' + | 'put' + | 'delete' + | 'options' + | 'patch' + | 'head', + ...args: any[] + ) { + const path: string = args[0]; + const handlerRef: RequestHandler = args[args.length - 1]; + this.server.get(path, (res, req) => { + handlerRef(req, res); + }); + } + public async close() { + Logger.debug('🚧 close is no-op?', 'uWebSockets.js'); + } + + public get(...args: any[]) { + return this.injectConstraintsIfVersioned('get', ...args); + } + + public post(...args: any[]) { + return this.injectConstraintsIfVersioned('post', ...args); + } + + public head(...args: any[]) { + return this.injectConstraintsIfVersioned('head', ...args); + } + + public delete(...args: any[]) { + return this.injectConstraintsIfVersioned('delete', ...args); + } + + public put(...args: any[]) { + return this.injectConstraintsIfVersioned('put', ...args); + } + + public patch(...args: any[]) { + return this.injectConstraintsIfVersioned('patch', ...args); + } + + public options(...args: any[]) { + return this.injectConstraintsIfVersioned('options', ...args); + } + + async initHttpServer(options: NestApplicationOptions) { + this.httpServer = new ServerWrapper(uws.App({})); + } + useStaticAssets(aPath: string, options: { prefix?: string }) { + throw new Error('Method not implemented.'); + } + setViewEngine(engine: string) { + throw new Error('Method not implemented.'); + } + getRequestHostname(request: uws.HttpRequest): string { + return request.getHeader('Host'); + } + getRequestMethod(request: uws.HttpRequest): string { + return request.getMethod(); + } + getRequestUrl(request: uws.HttpRequest): string { + return request.getUrl(); + } + status(response: uws.HttpResponse, statusCode: number) { + setStatus(response, statusCode); + } + reply( + response: uws.HttpResponse, + body: any, + statusCode?: number | undefined, + ) { + // console.log('reply', { response, body, statusCode }); + if (statusCode) { + setStatus(response, statusCode.toString()); + } + if (isNil(body)) { + response.end(); + } + + if (body instanceof StreamableFile) { + const streamHeaders = body.getHeaders(); + if (streamHeaders.type !== undefined) { + response.writeHeader('Content-Type', streamHeaders.type); + } + if (streamHeaders.disposition !== undefined) { + response.writeHeader('Content-Disposition', streamHeaders.disposition); + } + if (streamHeaders.length !== undefined) { + response.writeHeader('Content-Length', streamHeaders.length.toString()); + } + //TODO : Implement file sending + } + + return isObject(body) + ? response.end(JSON.stringify(body)) + : response.end(String(body)); + } + render(response: uws.HttpResponse, view: string, options: any) { + // TODO + Logger.error( + '🚧 render Method not implemented: ' + JSON.stringify({ view, options }), + 'uWebSockets.js', + ); + } + redirect(response: uws.HttpResponse, statusCode: number, url: string) { + setStatus(response, 301); + response.writeHeader('Location', url); + } + // eslint-disable-next-line @typescript-eslint/ban-types + setErrorHandler(handler: Function, prefix?: string | undefined) {} + // eslint-disable-next-line @typescript-eslint/ban-types + setNotFoundHandler(handler: Function, prefix?: string | undefined) {} + setHeader(response: uws.HttpResponse, name: string, value: string) { + response.writeHeader(name, value); + } + registerParserMiddleware( + prefix?: string | undefined, + rawBody?: boolean | undefined, + ) { + Logger.warn( + '🚧 registerParserMiddleware Method not implemented: ' + + JSON.stringify({ prefix, rawBody }), + 'uWebSockets.js', + ); + } + enableCors( + options: CorsOptions | CorsOptionsDelegate, + prefix?: string | undefined, + ) { + Logger.error( + '🚧 enableCors Method not implemented: ' + + JSON.stringify({ prefix, options }), + 'uWebSockets.js', + ); + } + async createMiddlewareFactory( + requestMethod: RequestMethod, + // eslint-disable-next-line @typescript-eslint/ban-types + ): Promise<(path: string, callback: Function) => any> { + Logger.error( + '🚧 createMiddlewareFactory Method not implemented: ' + + JSON.stringify({ requestMethod }), + 'uWebSockets.js', + ); + + return; + } + getType(): string { + return 'uWS'; + } +} diff --git a/packages/platform-uws/src/lib/adapters/uws-io-adapter.ts b/packages/platform-uws/src/lib/adapters/uws-io-adapter.ts new file mode 100644 index 0000000..8f17758 --- /dev/null +++ b/packages/platform-uws/src/lib/adapters/uws-io-adapter.ts @@ -0,0 +1,20 @@ +import { Server } from 'socket.io'; +import { Logger } from '@nestjs/common'; +import { IoAdapter } from '@nestjs/platform-socket.io'; + +export class UwsIoAdapter extends IoAdapter { + public createIOServer(port: number, options?: any): any { + if (this.httpServer && port === 0) { + const isUWS = this.httpServer.inner.constructor.name === 'uWS.App'; + if (isUWS) { + Logger.debug('⚡ Superpowers enabled', 'uWebSockets.js'); + const _server = new Server(options); + _server.attachApp(this.httpServer.inner); + return _server; + } else { + return new Server(this.httpServer, options); + } + } + return new Server(port, options); + } +} diff --git a/packages/platform-uws/test/index.spec.ts b/packages/platform-uws/test/index.spec.ts new file mode 100644 index 0000000..7980c50 --- /dev/null +++ b/packages/platform-uws/test/index.spec.ts @@ -0,0 +1,5 @@ +import { test } from 'node:test'; +import * as assert from "node:assert/strict"; +test('Skip', ()=>{ + assert.strictEqual(1,1) +}) diff --git a/packages/platform-uws/tsconfig.json b/packages/platform-uws/tsconfig.json new file mode 100644 index 0000000..19b9eec --- /dev/null +++ b/packages/platform-uws/tsconfig.json @@ -0,0 +1,16 @@ +{ + "extends": "../../tsconfig.base.json", + "compilerOptions": { + "module": "commonjs" + }, + "files": [], + "include": [], + "references": [ + { + "path": "./tsconfig.lib.json" + }, + { + "path": "./tsconfig.spec.json" + } + ] +} diff --git a/packages/platform-uws/tsconfig.lib.json b/packages/platform-uws/tsconfig.lib.json new file mode 100644 index 0000000..ad79032 --- /dev/null +++ b/packages/platform-uws/tsconfig.lib.json @@ -0,0 +1,11 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "outDir": "../../dist/out-tsc", + "declaration": true, + "types": [], + "target": "es2021" + }, + "include": ["**/*.ts"], + "exclude": ["jest.config.ts", "**/*.spec.ts", "**/*.test.ts", "test"] +} diff --git a/packages/platform-uws/tsconfig.spec.json b/packages/platform-uws/tsconfig.spec.json new file mode 100644 index 0000000..546f128 --- /dev/null +++ b/packages/platform-uws/tsconfig.spec.json @@ -0,0 +1,9 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "outDir": "../../dist/out-tsc", + "module": "commonjs", + "types": ["jest", "node"] + }, + "include": ["jest.config.ts", "**/*.test.ts", "**/*.spec.ts", "**/*.d.ts"] +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 558bfce..2ec1274 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -16,19 +16,25 @@ importers: version: 10.0.3(reflect-metadata@0.1.13)(rxjs@7.2.0) '@nestjs/core': specifier: 10.0.3 - version: 10.0.3(@nestjs/common@10.0.3)(@nestjs/platform-express@10.0.3)(reflect-metadata@0.1.13)(rxjs@7.2.0) + version: 10.0.3(@nestjs/common@10.0.3)(@nestjs/platform-express@10.0.3)(@nestjs/websockets@10.0.3)(reflect-metadata@0.1.13)(rxjs@7.2.0) '@nestjs/platform-express': specifier: 10.0.3 version: 10.0.3(@nestjs/common@10.0.3)(@nestjs/core@10.0.3) '@nestjs/platform-fastify': specifier: 10.0.3 version: 10.0.3(@nestjs/common@10.0.3)(@nestjs/core@10.0.3) + '@nestjs/platform-socket.io': + specifier: 10.0.3 + version: 10.0.3(@nestjs/common@10.0.3)(@nestjs/websockets@10.0.3)(rxjs@7.2.0) '@nestjs/schematics': specifier: 10.0.1 version: 10.0.1(typescript@5.1.5) '@nestjs/testing': specifier: 10.0.3 version: 10.0.3(@nestjs/common@10.0.3)(@nestjs/core@10.0.3)(@nestjs/platform-express@10.0.3) + '@nestjs/websockets': + specifier: 10.0.3 + version: 10.0.3(@nestjs/common@10.0.3)(@nestjs/core@10.0.3)(@nestjs/platform-socket.io@10.0.3)(reflect-metadata@0.1.13)(rxjs@7.2.0) '@nrwl/tao': specifier: 16.4.0 version: 16.4.0(@swc/core@1.2.218) @@ -145,11 +151,38 @@ importers: version: 10.0.3(reflect-metadata@0.1.13)(rxjs@7.2.0) '@nestjs/core': specifier: ^8.0.0 || ^9.0.0 || ^10.0.0 - version: 10.0.3(@nestjs/common@10.0.3)(@nestjs/platform-express@10.0.3)(reflect-metadata@0.1.13)(rxjs@7.2.0) + version: 10.0.3(@nestjs/common@10.0.3)(@nestjs/platform-express@10.0.3)(@nestjs/websockets@10.0.3)(reflect-metadata@0.1.13)(rxjs@7.2.0) rxjs: specifier: ^7.0.0 version: 7.2.0 + packages/platform-uws: + dependencies: + '@nestjs/common': + specifier: ^9.0.0 || ^10.0.0 + version: 10.0.3(reflect-metadata@0.1.13)(rxjs@7.2.0) + '@nestjs/core': + specifier: ^9.0.0 || ^10.0.0 + version: 10.0.3(@nestjs/common@10.0.3)(@nestjs/platform-express@10.0.3)(@nestjs/websockets@9.4.3)(reflect-metadata@0.1.13)(rxjs@7.2.0) + '@nestjs/platform-express': + specifier: ^9.0.0 || ^10.0.0 + version: 10.0.3(@nestjs/common@10.0.3)(@nestjs/core@10.0.3) + '@nestjs/platform-socket.io': + specifier: ^9.0.0 || ^10.0.0 + version: 9.0.0(@nestjs/common@10.0.3)(@nestjs/websockets@9.4.3)(rxjs@7.2.0) + '@nestjs/websockets': + specifier: ^9.0.0 || ^10.0.0 + version: 9.4.3(@nestjs/common@10.0.3)(@nestjs/core@10.0.3)(@nestjs/platform-socket.io@9.0.0)(reflect-metadata@0.1.13)(rxjs@7.2.0) + http-status-codes: + specifier: ^2.2.0 + version: 2.2.0 + socket.io: + specifier: ^4.7.1 + version: 4.7.1 + uWebSockets.js: + specifier: github:uNetworking/uWebSockets.js#v20.30.0 + version: github.com/uNetworking/uWebSockets.js/d39d4181daf5b670d44cbc1b18f8c28c85fd4142 + packages: /@aashutoshrathi/word-wrap@1.2.6: @@ -2210,7 +2243,39 @@ packages: tslib: 2.5.3 uid: 2.0.2 - /@nestjs/core@10.0.3(@nestjs/common@10.0.3)(@nestjs/platform-express@10.0.3)(reflect-metadata@0.1.13)(rxjs@7.2.0): + /@nestjs/core@10.0.3(@nestjs/common@10.0.3)(@nestjs/platform-express@10.0.3)(@nestjs/websockets@10.0.3)(reflect-metadata@0.1.13)(rxjs@7.2.0): + resolution: {integrity: sha512-LPZrUaGk9ZXXkOOoqNn2EwBN7bBV2+KKbNxkmJKZ/7wMO+qGE1hCLaYuwoPdwUEwmDMchFpUOydfMIeC1s/3bg==} + requiresBuild: true + peerDependencies: + '@nestjs/common': ^10.0.0 + '@nestjs/microservices': ^10.0.0 + '@nestjs/platform-express': ^10.0.0 + '@nestjs/websockets': ^10.0.0 + reflect-metadata: ^0.1.12 + rxjs: ^7.1.0 + peerDependenciesMeta: + '@nestjs/microservices': + optional: true + '@nestjs/platform-express': + optional: true + '@nestjs/websockets': + optional: true + dependencies: + '@nestjs/common': 10.0.3(reflect-metadata@0.1.13)(rxjs@7.2.0) + '@nestjs/platform-express': 10.0.3(@nestjs/common@10.0.3)(@nestjs/core@10.0.3) + '@nestjs/websockets': 10.0.3(@nestjs/common@10.0.3)(@nestjs/core@10.0.3)(@nestjs/platform-socket.io@10.0.3)(reflect-metadata@0.1.13)(rxjs@7.2.0) + '@nuxtjs/opencollective': 0.3.2 + fast-safe-stringify: 2.1.1 + iterare: 1.2.1 + path-to-regexp: 3.2.0 + reflect-metadata: 0.1.13 + rxjs: 7.2.0 + tslib: 2.5.3 + uid: 2.0.2 + transitivePeerDependencies: + - encoding + + /@nestjs/core@10.0.3(@nestjs/common@10.0.3)(@nestjs/platform-express@10.0.3)(@nestjs/websockets@9.4.3)(reflect-metadata@0.1.13)(rxjs@7.2.0): resolution: {integrity: sha512-LPZrUaGk9ZXXkOOoqNn2EwBN7bBV2+KKbNxkmJKZ/7wMO+qGE1hCLaYuwoPdwUEwmDMchFpUOydfMIeC1s/3bg==} requiresBuild: true peerDependencies: @@ -2230,6 +2295,7 @@ packages: dependencies: '@nestjs/common': 10.0.3(reflect-metadata@0.1.13)(rxjs@7.2.0) '@nestjs/platform-express': 10.0.3(@nestjs/common@10.0.3)(@nestjs/core@10.0.3) + '@nestjs/websockets': 9.4.3(@nestjs/common@10.0.3)(@nestjs/core@10.0.3)(@nestjs/platform-socket.io@9.0.0)(reflect-metadata@0.1.13)(rxjs@7.2.0) '@nuxtjs/opencollective': 0.3.2 fast-safe-stringify: 2.1.1 iterare: 1.2.1 @@ -2240,6 +2306,7 @@ packages: uid: 2.0.2 transitivePeerDependencies: - encoding + dev: false /@nestjs/platform-express@10.0.3(@nestjs/common@10.0.3)(@nestjs/core@10.0.3): resolution: {integrity: sha512-8wA4Onhu6/dQrzTsg6n3pe1WbK9vWFPhagX10eGesX2YvgpVT4ccL0lbJbzGM2CY94RkaxBBW46Q3NJ6Bf566g==} @@ -2248,7 +2315,7 @@ packages: '@nestjs/core': ^10.0.0 dependencies: '@nestjs/common': 10.0.3(reflect-metadata@0.1.13)(rxjs@7.2.0) - '@nestjs/core': 10.0.3(@nestjs/common@10.0.3)(@nestjs/platform-express@10.0.3)(reflect-metadata@0.1.13)(rxjs@7.2.0) + '@nestjs/core': 10.0.3(@nestjs/common@10.0.3)(@nestjs/platform-express@10.0.3)(@nestjs/websockets@10.0.3)(reflect-metadata@0.1.13)(rxjs@7.2.0) body-parser: 1.20.2 cors: 2.8.5 express: 4.18.2 @@ -2274,7 +2341,7 @@ packages: '@fastify/formbody': 7.4.0 '@fastify/middie': 8.3.0 '@nestjs/common': 10.0.3(reflect-metadata@0.1.13)(rxjs@7.2.0) - '@nestjs/core': 10.0.3(@nestjs/common@10.0.3)(@nestjs/platform-express@10.0.3)(reflect-metadata@0.1.13)(rxjs@7.2.0) + '@nestjs/core': 10.0.3(@nestjs/common@10.0.3)(@nestjs/platform-express@10.0.3)(@nestjs/websockets@10.0.3)(reflect-metadata@0.1.13)(rxjs@7.2.0) fastify: 4.18.0 light-my-request: 5.10.0 path-to-regexp: 3.2.0 @@ -2282,6 +2349,41 @@ packages: transitivePeerDependencies: - supports-color + /@nestjs/platform-socket.io@10.0.3(@nestjs/common@10.0.3)(@nestjs/websockets@10.0.3)(rxjs@7.2.0): + resolution: {integrity: sha512-yHaPsD3RthtVaBdOEy6wOdRMXWqcGvoxynB/aOE35FXo4d9S4GtgisxjTREiP9jOt70ttvnsuggycWzKUCoiNw==} + peerDependencies: + '@nestjs/common': ^10.0.0 + '@nestjs/websockets': ^10.0.0 + rxjs: ^7.1.0 + dependencies: + '@nestjs/common': 10.0.3(reflect-metadata@0.1.13)(rxjs@7.2.0) + '@nestjs/websockets': 10.0.3(@nestjs/common@10.0.3)(@nestjs/core@10.0.3)(@nestjs/platform-socket.io@10.0.3)(reflect-metadata@0.1.13)(rxjs@7.2.0) + rxjs: 7.2.0 + socket.io: 4.6.2 + tslib: 2.5.3 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + + /@nestjs/platform-socket.io@9.0.0(@nestjs/common@10.0.3)(@nestjs/websockets@9.4.3)(rxjs@7.2.0): + resolution: {integrity: sha512-PLLrfkHo6rUF4Ec84uXaC+zTT8wQltZ3RVPoWzdHimD/hCLLo5c3uzoukAJmprnFm1u8SXpM3zMdqws/tVmPkw==} + peerDependencies: + '@nestjs/common': ^9.0.0 + '@nestjs/websockets': ^9.0.0 + rxjs: ^7.1.0 + dependencies: + '@nestjs/common': 10.0.3(reflect-metadata@0.1.13)(rxjs@7.2.0) + '@nestjs/websockets': 9.4.3(@nestjs/common@10.0.3)(@nestjs/core@10.0.3)(@nestjs/platform-socket.io@9.0.0)(reflect-metadata@0.1.13)(rxjs@7.2.0) + rxjs: 7.2.0 + socket.io: 4.5.1 + tslib: 2.4.0 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + dev: false + /@nestjs/schematics@10.0.1(typescript@5.1.5): resolution: {integrity: sha512-buxpYtSwOmWyf0nUJWJCkCkYITwbOfIEKHTnGS7sDbcfaajrOFXb5pPAGD2E1CUb3C1+NkQIURPKzs0IouZTQg==} peerDependencies: @@ -2325,11 +2427,54 @@ packages: optional: true dependencies: '@nestjs/common': 10.0.3(reflect-metadata@0.1.13)(rxjs@7.2.0) - '@nestjs/core': 10.0.3(@nestjs/common@10.0.3)(@nestjs/platform-express@10.0.3)(reflect-metadata@0.1.13)(rxjs@7.2.0) + '@nestjs/core': 10.0.3(@nestjs/common@10.0.3)(@nestjs/platform-express@10.0.3)(@nestjs/websockets@10.0.3)(reflect-metadata@0.1.13)(rxjs@7.2.0) '@nestjs/platform-express': 10.0.3(@nestjs/common@10.0.3)(@nestjs/core@10.0.3) tslib: 2.5.3 dev: true + /@nestjs/websockets@10.0.3(@nestjs/common@10.0.3)(@nestjs/core@10.0.3)(@nestjs/platform-socket.io@10.0.3)(reflect-metadata@0.1.13)(rxjs@7.2.0): + resolution: {integrity: sha512-2cCKJtcqzM625sgZJ8pULP1USASlmDB4VYFASazNVjKqdhO25SyV8ncnCtM1oeHk3CLhZUtLOFKudEQgRRANDA==} + peerDependencies: + '@nestjs/common': ^10.0.0 + '@nestjs/core': ^10.0.0 + '@nestjs/platform-socket.io': ^10.0.0 + reflect-metadata: ^0.1.12 + rxjs: ^7.1.0 + peerDependenciesMeta: + '@nestjs/platform-socket.io': + optional: true + dependencies: + '@nestjs/common': 10.0.3(reflect-metadata@0.1.13)(rxjs@7.2.0) + '@nestjs/core': 10.0.3(@nestjs/common@10.0.3)(@nestjs/platform-express@10.0.3)(@nestjs/websockets@10.0.3)(reflect-metadata@0.1.13)(rxjs@7.2.0) + '@nestjs/platform-socket.io': 10.0.3(@nestjs/common@10.0.3)(@nestjs/websockets@10.0.3)(rxjs@7.2.0) + iterare: 1.2.1 + object-hash: 3.0.0 + reflect-metadata: 0.1.13 + rxjs: 7.2.0 + tslib: 2.5.3 + + /@nestjs/websockets@9.4.3(@nestjs/common@10.0.3)(@nestjs/core@10.0.3)(@nestjs/platform-socket.io@9.0.0)(reflect-metadata@0.1.13)(rxjs@7.2.0): + resolution: {integrity: sha512-LMLKJWZbWH3VQRxDK/658ynyN1n5lLCIen/dey2y5TzB0RNgxlSso/YJATVVfWNaT2CxPG8TUQMOTdopXCWGQw==} + peerDependencies: + '@nestjs/common': ^9.0.0 + '@nestjs/core': ^9.0.0 + '@nestjs/platform-socket.io': ^9.0.0 + reflect-metadata: ^0.1.12 + rxjs: ^7.1.0 + peerDependenciesMeta: + '@nestjs/platform-socket.io': + optional: true + dependencies: + '@nestjs/common': 10.0.3(reflect-metadata@0.1.13)(rxjs@7.2.0) + '@nestjs/core': 10.0.3(@nestjs/common@10.0.3)(@nestjs/platform-express@10.0.3)(@nestjs/websockets@9.4.3)(reflect-metadata@0.1.13)(rxjs@7.2.0) + '@nestjs/platform-socket.io': 9.0.0(@nestjs/common@10.0.3)(@nestjs/websockets@9.4.3)(rxjs@7.2.0) + iterare: 1.2.1 + object-hash: 3.0.0 + reflect-metadata: 0.1.13 + rxjs: 7.2.0 + tslib: 2.5.3 + dev: false + /@nodelib/fs.scandir@2.1.5: resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} engines: {node: '>= 8'} @@ -2875,6 +3020,9 @@ packages: '@sinonjs/commons': 1.8.6 dev: true + /@socket.io/component-emitter@3.1.0: + resolution: {integrity: sha512-+9jVqKhRSpsc591z5vX+X5Yyw+he/HCB4iQ/RYxw35CEPaY1gnsNE43nf9n9AaYjAQrTiI/mOwKUKdUs9vf7Xg==} + /@swc/core-android-arm-eabi@1.2.218: resolution: {integrity: sha512-Q/uLCh262t3xxNzhCz+ZW9t+g2nWd0gZZO4jMYFWJs7ilKVNsBfRtfnNGGACHzkVuWLNDIWtAS2PSNodl7VUHQ==} engines: {node: '>=10'} @@ -3075,10 +3223,22 @@ packages: '@babel/types': 7.22.5 dev: true + /@types/component-emitter@1.2.11: + resolution: {integrity: sha512-SRXjM+tfsSlA9VuG8hGO2nft2p8zjXCK1VcC6N4NXbBbYbSia9kzCChYQajIjzIqOOOuh5Ock6MmV2oux4jDZQ==} + dev: false + + /@types/cookie@0.4.1: + resolution: {integrity: sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q==} + /@types/cookiejar@2.1.2: resolution: {integrity: sha512-t73xJJrvdTjXrn4jLS9VSGRbz0nUY3cl2DMGDU48lKl+HR9dbbjW2A9r3g40VA++mQpy6uuHg33gy7du2BKpog==} dev: true + /@types/cors@2.8.13: + resolution: {integrity: sha512-RG8AStHlUiV5ysZQKq97copd2UmVYw3/pRMLefISZ3S1hK104Cwm7iLQ3fTKx+lsUH2CE8FlLaYeEA2LSeqYUA==} + dependencies: + '@types/node': 18.0.0 + /@types/graceful-fs@4.1.6: resolution: {integrity: sha512-Sig0SNORX9fdW+bQuTEovKj3uHcUL6LQKbCrrqb1X7J6/ReAbhCXRAhc+SMejhLELFj2QcyuxmUooZ4bt5ReSw==} dependencies: @@ -3136,7 +3296,6 @@ packages: /@types/node@18.0.0: resolution: {integrity: sha512-cHlGmko4gWLVI27cGJntjs/Sj8th9aYwplmZFwmmgYQQvL5NUsgVJG7OddLvNfLqYS31KFN0s3qlaD9qCaxACA==} - dev: true /@types/normalize-package-data@2.4.1: resolution: {integrity: sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==} @@ -3736,6 +3895,10 @@ packages: /base64-js@1.5.1: resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + /base64id@2.0.0: + resolution: {integrity: sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==} + engines: {node: ^4.5.0 || >= 5.9} + /better-path-resolve@1.0.0: resolution: {integrity: sha512-pbnl5XzGBdrFU/wT4jqmJVPn2B6UHPBOhzMQkY/SPUPB6QtUXtmBHBIwCbXJol93mOpGMnQyP/+BB19q04xj7g==} engines: {node: '>=4'} @@ -4061,7 +4224,6 @@ packages: /component-emitter@1.3.0: resolution: {integrity: sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==} - dev: true /concat-map@0.0.1: resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} @@ -4113,6 +4275,10 @@ packages: /cookie-signature@1.0.6: resolution: {integrity: sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==} + /cookie@0.4.2: + resolution: {integrity: sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==} + engines: {node: '>= 0.6'} + /cookie@0.5.0: resolution: {integrity: sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==} engines: {node: '>= 0.6'} @@ -4408,6 +4574,74 @@ packages: once: 1.4.0 dev: true + /engine.io-parser@5.0.7: + resolution: {integrity: sha512-P+jDFbvK6lE3n1OL+q9KuzdOFWkkZ/cMV9gol/SbVfpyqfvrfrFTOFJ6fQm2VC3PZHlU3QPhVwmbsCnauHF2MQ==} + engines: {node: '>=10.0.0'} + + /engine.io-parser@5.1.0: + resolution: {integrity: sha512-enySgNiK5tyZFynt3z7iqBR+Bto9EVVVvDFuTT0ioHCGbzirZVGDGiQjZzEp8hWl6hd5FSVytJGuScX1C1C35w==} + engines: {node: '>=10.0.0'} + dev: false + + /engine.io@6.2.1: + resolution: {integrity: sha512-ECceEFcAaNRybd3lsGQKas3ZlMVjN3cyWwMP25D2i0zWfyiytVbTpRPa34qrr+FHddtpBVOmq4H/DCv1O0lZRA==} + engines: {node: '>=10.0.0'} + dependencies: + '@types/cookie': 0.4.1 + '@types/cors': 2.8.13 + '@types/node': 18.0.0 + accepts: 1.3.8 + base64id: 2.0.0 + cookie: 0.4.2 + cors: 2.8.5 + debug: 4.3.4 + engine.io-parser: 5.0.7 + ws: 8.2.3 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + dev: false + + /engine.io@6.4.2: + resolution: {integrity: sha512-FKn/3oMiJjrOEOeUub2WCox6JhxBXq/Zn3fZOMCBxKnNYtsdKjxhl7yR3fZhM9PV+rdE75SU5SYMc+2PGzo+Tg==} + engines: {node: '>=10.0.0'} + dependencies: + '@types/cookie': 0.4.1 + '@types/cors': 2.8.13 + '@types/node': 18.0.0 + accepts: 1.3.8 + base64id: 2.0.0 + cookie: 0.4.2 + cors: 2.8.5 + debug: 4.3.4 + engine.io-parser: 5.0.7 + ws: 8.11.0 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + + /engine.io@6.5.1: + resolution: {integrity: sha512-mGqhI+D7YxS9KJMppR6Iuo37Ed3abhU8NdfgSvJSDUafQutrN+sPTncJYTyM9+tkhSmWodKtVYGPPHyXJEwEQA==} + engines: {node: '>=10.0.0'} + dependencies: + '@types/cookie': 0.4.1 + '@types/cors': 2.8.13 + '@types/node': 18.0.0 + accepts: 1.3.8 + base64id: 2.0.0 + cookie: 0.4.2 + cors: 2.8.5 + debug: 4.3.4 + engine.io-parser: 5.1.0 + ws: 8.11.0 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + dev: false + /enquirer@2.3.6: resolution: {integrity: sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==} engines: {node: '>=8.6'} @@ -5288,6 +5522,10 @@ packages: - supports-color dev: true + /http-status-codes@2.2.0: + resolution: {integrity: sha512-feERVo9iWxvnejp3SEfm/+oNG517npqL2/PIA8ORjyOZjGC7TwCRQsZylciLS64i6pJ0wRYz3rkXLRwbtFa8Ng==} + dev: false + /https-proxy-agent@5.0.1: resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==} engines: {node: '>= 6'} @@ -6728,6 +6966,10 @@ packages: resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} engines: {node: '>=0.10.0'} + /object-hash@3.0.0: + resolution: {integrity: sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==} + engines: {node: '>= 6'} + /object-inspect@1.12.3: resolution: {integrity: sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==} @@ -7568,6 +7810,86 @@ packages: yargs: 15.4.1 dev: true + /socket.io-adapter@2.4.0: + resolution: {integrity: sha512-W4N+o69rkMEGVuk2D/cvca3uYsvGlMwsySWV447y99gUPghxq42BxqLNMndb+a1mm/5/7NeXVQS7RLa2XyXvYg==} + dev: false + + /socket.io-adapter@2.5.2: + resolution: {integrity: sha512-87C3LO/NOMc+eMcpcxUBebGjkpMDkNBS9tf7KJqcDsmL936EChtVva71Dw2q4tQcuVC+hAUy4an2NO/sYXmwRA==} + dependencies: + ws: 8.11.0 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + + /socket.io-parser@4.0.5: + resolution: {integrity: sha512-sNjbT9dX63nqUFIOv95tTVm6elyIU4RvB1m8dOeZt+IgWwcWklFDOdmGcfo3zSiRsnR/3pJkjY5lfoGqEe4Eig==} + engines: {node: '>=10.0.0'} + dependencies: + '@types/component-emitter': 1.2.11 + component-emitter: 1.3.0 + debug: 4.3.4 + transitivePeerDependencies: + - supports-color + dev: false + + /socket.io-parser@4.2.4: + resolution: {integrity: sha512-/GbIKmo8ioc+NIWIhwdecY0ge+qVBSMdgxGygevmdHj24bsfgtCmcUUcQ5ZzcylGFHsN3k4HB4Cgkl96KVnuew==} + engines: {node: '>=10.0.0'} + dependencies: + '@socket.io/component-emitter': 3.1.0 + debug: 4.3.4 + transitivePeerDependencies: + - supports-color + + /socket.io@4.5.1: + resolution: {integrity: sha512-0y9pnIso5a9i+lJmsCdtmTTgJFFSvNQKDnPQRz28mGNnxbmqYg2QPtJTLFxhymFZhAIn50eHAKzJeiNaKr+yUQ==} + engines: {node: '>=10.0.0'} + dependencies: + accepts: 1.3.8 + base64id: 2.0.0 + debug: 4.3.4 + engine.io: 6.2.1 + socket.io-adapter: 2.4.0 + socket.io-parser: 4.0.5 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + dev: false + + /socket.io@4.6.2: + resolution: {integrity: sha512-Vp+lSks5k0dewYTfwgPT9UeGGd+ht7sCpB7p0e83VgO4X/AHYWhXITMrNk/pg8syY2bpx23ptClCQuHhqi2BgQ==} + engines: {node: '>=10.0.0'} + dependencies: + accepts: 1.3.8 + base64id: 2.0.0 + debug: 4.3.4 + engine.io: 6.4.2 + socket.io-adapter: 2.5.2 + socket.io-parser: 4.2.4 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + + /socket.io@4.7.1: + resolution: {integrity: sha512-W+utHys2w//dhFjy7iQQu9sGd3eokCjGbl2r59tyLqNiJJBdIebn3GAKEXBr3osqHTObJi2die/25bCx2zsaaw==} + engines: {node: '>=10.0.0'} + dependencies: + accepts: 1.3.8 + base64id: 2.0.0 + cors: 2.8.5 + debug: 4.3.4 + engine.io: 6.5.1 + socket.io-adapter: 2.5.2 + socket.io-parser: 4.2.4 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + dev: false + /sonic-boom@3.3.0: resolution: {integrity: sha512-LYxp34KlZ1a2Jb8ZQgFCK3niIHzibdwtwNUWKg0qQRzsDoJ3Gfgkf8KdBTFU3SkejDEIlWwnSnpVdOZIhFMl/g==} dependencies: @@ -8022,7 +8344,6 @@ packages: /tslib@2.4.0: resolution: {integrity: sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==} - dev: true /tslib@2.5.3: resolution: {integrity: sha512-mSxlJJwl3BMEQCUNnxXBU9jP4JBktcEGhURcPR6VQVlnP0FdDEsIaz0C35dXNGLyRfrATNofF0F5p2KPxQgB+w==} @@ -8386,6 +8707,18 @@ packages: signal-exit: 3.0.7 dev: true + /ws@8.11.0: + resolution: {integrity: sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg==} + engines: {node: '>=10.0.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: ^5.0.2 + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + /ws@8.13.0: resolution: {integrity: sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==} engines: {node: '>=10.0.0'} @@ -8399,6 +8732,19 @@ packages: optional: true dev: true + /ws@8.2.3: + resolution: {integrity: sha512-wBuoj1BDpC6ZQ1B7DWQBYVLphPWkm8i9Y0/3YdHjHKHiohOJ1ws+3OccDWtH+PoC9DZD5WOTrJvNbWvjS6JWaA==} + engines: {node: '>=10.0.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: ^5.0.2 + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + dev: false + /xml-name-validator@4.0.0: resolution: {integrity: sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==} engines: {node: '>=12'} @@ -8489,3 +8835,9 @@ packages: resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} engines: {node: '>=10'} dev: true + + github.com/uNetworking/uWebSockets.js/d39d4181daf5b670d44cbc1b18f8c28c85fd4142: + resolution: {tarball: https://codeload.github.com/uNetworking/uWebSockets.js/tar.gz/d39d4181daf5b670d44cbc1b18f8c28c85fd4142} + name: uWebSockets.js + version: 20.30.0 + dev: false