diff --git a/.github/workflows/load-test.yml b/.github/workflows/load-test.yml index bddce0c0bb1..e349194843d 100644 --- a/.github/workflows/load-test.yml +++ b/.github/workflows/load-test.yml @@ -46,7 +46,7 @@ jobs: run: src/bin/installDeps.sh - name: Install etherpad-load-test - run: sudo npm install -g etherpad-load-test + run: sudo npm install -g etherpad-load-test-socket-io - name: Run load test run: src/tests/frontend/travis/runnerLoadTest.sh 25 50 @@ -87,7 +87,7 @@ jobs: run: pnpm config set auto-install-peers false - name: Install etherpad-load-test - run: pnpm install -g etherpad-load-test + run: pnpm install -g etherpad-load-test-socket-io - name: Install etherpad plugins # The --legacy-peer-deps flag is required to work around a bug in npm v7: @@ -161,7 +161,7 @@ jobs: run: src/bin/installDeps.sh - name: Install etherpad-load-test - run: sudo npm install -g etherpad-load-test + run: sudo npm install -g etherpad-load-test-socket-io - name: Run load test run: src/tests/frontend/travis/runnerLoadTest.sh 5000 5 diff --git a/settings.json.docker b/settings.json.docker index 79f72f05e5d..7fbda1aefd9 100644 --- a/settings.json.docker +++ b/settings.json.docker @@ -527,7 +527,7 @@ /* * Restrict socket.io transport methods */ - "socketTransportProtocols" : ["xhr-polling", "jsonp-polling", "htmlfile"], + "socketTransportProtocols" : ["websocket", "polling"], "socketIo": { /* diff --git a/settings.json.template b/settings.json.template index 735b9d5e7df..9c9150394e7 100644 --- a/settings.json.template +++ b/settings.json.template @@ -527,7 +527,7 @@ /* * Restrict socket.io transport methods */ - "socketTransportProtocols" : ["xhr-polling", "jsonp-polling", "htmlfile"], + "socketTransportProtocols" : ["websocket", "polling"], "socketIo": { /* diff --git a/src/node/handler/PadMessageHandler.js b/src/node/handler/PadMessageHandler.js index 55894017a11..8b9d6e06827 100644 --- a/src/node/handler/PadMessageHandler.js +++ b/src/node/handler/PadMessageHandler.js @@ -83,7 +83,7 @@ exports.socketio = () => { const sessioninfos = {}; exports.sessioninfos = sessioninfos; -stats.gauge('totalUsers', () => socketio ? Object.keys(socketio.sockets.sockets).length : 0); +stats.gauge('totalUsers', () => socketio ? socketio.sockets.size : 0); stats.gauge('activePads', () => { const padIds = new Set(); for (const {padId} of Object.values(sessioninfos)) { @@ -155,13 +155,13 @@ exports.handleConnect = (socket) => { * Kicks all sessions from a pad */ exports.kickSessionsFromPad = (padID) => { - if (typeof socketio.sockets.clients !== 'function') return; + if (typeof socketio.sockets.clients !== 'object') return; // skip if there is nobody on this pad if (_getRoomSockets(padID).length === 0) return; // disconnect everyone from this pad - socketio.sockets.in(padID).json.send({disconnect: 'deleted'}); + socketio.in(padID).emit('message', {disconnect: 'deleted'}); }; /** @@ -183,7 +183,7 @@ exports.handleDisconnect = async (socket) => { ` authorID:${session.author}` + (user && user.username ? ` username:${user.username}` : '')); /* eslint-enable prefer-template */ - socket.broadcast.to(session.padId).json.send({ + socket.broadcast.to(session.padId).emit('message', { type: 'COLLABROOM', data: { type: 'USER_LEAVE', @@ -216,7 +216,7 @@ exports.handleMessage = async (socket, message) => { messageLogger.warn(`Rate limited IP ${socket.request.ip}. To reduce the amount of rate ` + 'limiting that happens edit the rateLimit values in settings.json'); stats.meter('rateLimited').mark(); - socket.json.send({disconnect: 'rateLimited'}); + socket.emit('message', {disconnect: 'rateLimited'}); throw err; } } @@ -267,11 +267,11 @@ exports.handleMessage = async (socket, message) => { const {accessStatus, authorID} = await securityManager.checkAccess(auth.padID, auth.sessionID, auth.token, user); if (accessStatus !== 'grant') { - socket.json.send({accessStatus}); + socket.emit('message', {accessStatus}); throw new Error('access denied'); } if (thisSession.author != null && thisSession.author !== authorID) { - socket.json.send({disconnect: 'rejected'}); + socket.emit('message', {disconnect: 'rejected'}); throw new Error([ 'Author ID changed mid-session. Bad or missing token or sessionID?', `socket:${socket.id}`, @@ -393,10 +393,10 @@ exports.handleCustomObjectMessage = (msg, sessionID) => { if (msg.data.type === 'CUSTOM') { if (sessionID) { // a sessionID is targeted: directly to this sessionID - socketio.sockets.socket(sessionID).json.send(msg); + socketio.sockets.socket(sessionID).emit('message', msg); } else { // broadcast to all clients on this pad - socketio.sockets.in(msg.data.payload.padId).json.send(msg); + socketio.sockets.in(msg.data.payload.padId).emit('message', msg); } } }; @@ -416,7 +416,7 @@ exports.handleCustomMessage = (padID, msgString) => { time, }, }; - socketio.sockets.in(padID).json.send(msg); + socketio.sockets.in(padID).emit('message', msg); }; /** @@ -453,7 +453,7 @@ exports.sendChatMessageToPadClients = async (mt, puId, text = null, padId = null // authorManager.getAuthorName() to resolve before saving the message to the database. const promise = pad.appendChatMessage(message); message.displayName = await authorManager.getAuthorName(message.authorId); - socketio.sockets.in(padId).json.send({ + socketio.sockets.in(padId).emit('message', { type: 'COLLABROOM', data: {type: 'CHAT_MESSAGE', message}, }); @@ -483,7 +483,7 @@ const handleGetChatMessages = async (socket, {data: {start, end}}) => { }; // send the messages back to the client - socket.json.send(infoMsg); + socket.emit('message', infoMsg); }; /** @@ -500,7 +500,7 @@ const handleSuggestUserName = (socket, message) => { _getRoomSockets(padId).forEach((socket) => { const session = sessioninfos[socket.id]; if (session && session.author === unnamedId) { - socket.json.send(message); + socket.emit('message', message); } }); }; @@ -539,7 +539,7 @@ const handleUserInfoUpdate = async (socket, {data: {userInfo: {name, colorId}}}) }; // Send the other clients on the pad the update message - socket.broadcast.to(padId).json.send(infoMsg); + socket.broadcast.to(padId).emit('message',infoMsg); // Block until the authorManager has stored the new attributes. await p; @@ -654,12 +654,12 @@ const handleUserChanges = async (socket, message) => { // The client assumes that ACCEPT_COMMIT and NEW_CHANGES messages arrive in order. Make sure we // have already sent any previous ACCEPT_COMMIT and NEW_CHANGES messages. assert.equal(thisSession.rev, r); - socket.json.send({type: 'COLLABROOM', data: {type: 'ACCEPT_COMMIT', newRev}}); + socket.emit('message', {type: 'COLLABROOM', data: {type: 'ACCEPT_COMMIT', newRev}}); thisSession.rev = newRev; if (newRev !== r) thisSession.time = await pad.getRevisionDate(newRev); await exports.updatePadClients(pad); } catch (err) { - socket.json.send({disconnect: 'badChangeset'}); + socket.emit('message', {disconnect: 'badChangeset'}); stats.meter('failedChangesets').mark(); messageLogger.warn(`Failed to apply USER_CHANGES from author ${thisSession.author} ` + `(socket ${socket.id}) on pad ${thisSession.padId}: ${err.stack || err}`); @@ -716,7 +716,7 @@ exports.updatePadClients = async (pad) => { }, }; try { - socket.json.send(msg); + socket.emit('message', msg); } catch (err) { messageLogger.error(`Failed to notify user of new revision: ${err.stack || err}`); return; @@ -833,7 +833,7 @@ const handleClientReady = async (socket, message) => { // fix user's counter, works on page refresh or if user closes browser window and then rejoins sessioninfos[otherSocket.id] = {}; otherSocket.leave(sessionInfo.padId); - otherSocket.json.send({disconnect: 'userdup'}); + otherSocket.emit('message', {disconnect: 'userdup'}); } } @@ -899,7 +899,7 @@ const handleClientReady = async (socket, message) => { apool: forWire.pool, author: changesets[r].author, currentTime: changesets[r].timestamp}}; - socket.json.send(wireMsg); + socket.emit('message', wireMsg); } if (startNum === endNum) { @@ -907,7 +907,7 @@ const handleClientReady = async (socket, message) => { data: {type: 'CLIENT_RECONNECT', noChanges: true, newRev: pad.getHeadRevisionNumber()}}; - socket.json.send(Msg); + socket.emit('message', Msg); } } else { // This is a normal first connect @@ -921,7 +921,7 @@ const handleClientReady = async (socket, message) => { atext.attribs = attribsForWire.translated; } catch (e) { messageLogger.error(e.stack || e); - socket.json.send({disconnect: 'corruptPad'}); // pull the brakes + socket.emit('message', {disconnect: 'corruptPad'}); // pull the brakes throw new Error('corrupt pad'); } @@ -1005,14 +1005,14 @@ const handleClientReady = async (socket, message) => { socket.join(sessionInfo.padId); // Send the clientVars to the Client - socket.json.send({type: 'CLIENT_VARS', data: clientVars}); + socket.emit('message', {type: 'CLIENT_VARS', data: clientVars}); // Save the current revision in sessioninfos, should be the same as in clientVars sessionInfo.rev = pad.getHeadRevisionNumber(); } // Notify other users about this new user. - socket.broadcast.to(sessionInfo.padId).json.send({ + socket.broadcast.to(sessionInfo.padId).emit('message', { type: 'COLLABROOM', data: { type: 'USER_NEWINFO', @@ -1062,7 +1062,7 @@ const handleClientReady = async (socket, message) => { }, }; - socket.json.send(msg); + socket.emit('message', msg); })); await hooks.aCallAll('userJoin', { @@ -1092,7 +1092,7 @@ const handleChangesetRequest = async (socket, {data: {granularity, start, reques start = headRev; const data = await getChangesetInfo(pad, start, end, granularity); data.requestID = requestID; - socket.json.send({type: 'CHANGESET_REQ', data}); + socket.emit('message', {type: 'CHANGESET_REQ', data}); }; /** @@ -1236,13 +1236,16 @@ const composePadChangesets = async (pad, startNum, endNum) => { const _getRoomSockets = (padID) => { const ns = socketio.sockets; // Default namespace. - const adapter = ns.adapter; // We could call adapter.clients(), but that method is unnecessarily asynchronous. Replicate what // it does here, but synchronously to avoid a race condition. This code will have to change when // we update to socket.io v3. - const room = adapter.rooms[padID]; + const room = ns.adapter.rooms?.get(padID); + if (!room) return []; - return Object.keys(room.sockets).map((id) => ns.connected[id]).filter((s) => s); + + return Array.from(room) + .map(socketId => ns.sockets.get(socketId)) + .filter(socket => socket); }; /** diff --git a/src/node/hooks/express/socketio.ts b/src/node/hooks/express/socketio.ts index ba1a6a3133f..be360b97330 100644 --- a/src/node/hooks/express/socketio.ts +++ b/src/node/hooks/express/socketio.ts @@ -7,7 +7,7 @@ const express = require('../express'); const log4js = require('log4js'); const proxyaddr = require('proxy-addr'); const settings = require('../../utils/Settings'); -const socketio = require('socket.io'); +const {Server} = require('socket.io'); const socketIORouter = require('../../handler/SocketIORouter'); const hooks = require('../../../static/js/pluginfw/hooks'); const padMessageHandler = require('../../handler/PadMessageHandler'); @@ -48,12 +48,29 @@ exports.expressCloseServer = async () => { logger.info('All socket.io clients have disconnected'); }; +exports.socketSessionMiddleware = (args: any) => (socket: any, next: Function) => { + const req = socket.request; + // Express sets req.ip but socket.io does not. Replicate Express's behavior here. + if (req.ip == null) { + if (settings.trustProxy) { + req.ip = proxyaddr(req, args.app.get('trust proxy fn')); + } else { + req.ip = socket.handshake.address; + } + } + if (!req.headers.cookie) { + // socketio.js-client on node.js doesn't support cookies, so pass them via a query parameter. + req.headers.cookie = socket.handshake.query.cookie; + } + express.sessionMiddleware(req, {}, next); +}; + exports.expressCreateServer = (hookName:string, args:ArgsExpressType, cb:Function) => { // init socket.io and redirect all requests to the MessageHandler // there shouldn't be a browser that isn't compatible to all // transports in this list at once // e.g. XHR is disabled in IE by default, so in IE it should use jsonp-polling - io = socketio({ + io = new Server(args.server, { transports: settings.socketTransportProtocols, }).listen(args.server, { /* @@ -79,33 +96,20 @@ exports.expressCreateServer = (hookName:string, args:ArgsExpressType, cb:Functio maxHttpBufferSize: settings.socketIo.maxHttpBufferSize, }); - io.on('connect', (socket:any) => { + io.on('connection', (socket:any) => { sockets.add(socket); socketsEvents.emit('updated'); + // https://socket.io/docs/v3/faq/index.html + const session = socket.request.session; + session.connections++; + session.save(); socket.on('disconnect', () => { sockets.delete(socket); socketsEvents.emit('updated'); }); }); - io.use((socket:any, next: Function) => { - const req = socket.request; - // Express sets req.ip but socket.io does not. Replicate Express's behavior here. - if (req.ip == null) { - if (settings.trustProxy) { - req.ip = proxyaddr(req, args.app.get('trust proxy fn')); - } else { - req.ip = socket.handshake.address; - } - } - if (!req.headers.cookie) { - // socketio.js-client on node.js doesn't support cookies (see https://git.io/JU8u9), so the - // token and express_sid cookies have to be passed via a query parameter for unit tests. - req.headers.cookie = socket.handshake.query.cookie; - } - // See: https://socket.io/docs/faq/#Usage-with-express-session - express.sessionMiddleware(req, {}, next); - }); + io.use(exports.socketSessionMiddleware(args)); io.use((socket:any, next:Function) => { socket.conn.on('packet', (packet:string) => { diff --git a/src/node/utils/Settings.js b/src/node/utils/Settings.js index 7125607ea7f..48955f29126 100644 --- a/src/node/utils/Settings.js +++ b/src/node/utils/Settings.js @@ -126,7 +126,7 @@ exports.ssl = false; /** * socket.io transport methods **/ -exports.socketTransportProtocols = ['xhr-polling', 'jsonp-polling', 'htmlfile']; +exports.socketTransportProtocols = ['websocket', 'polling']; exports.socketIo = { /** diff --git a/src/package.json b/src/package.json index ff8915b7622..784efd9f6a4 100644 --- a/src/package.json +++ b/src/package.json @@ -36,7 +36,7 @@ "cookie-parser": "^1.4.6", "cross-spawn": "^7.0.3", "ejs": "^3.1.9", - "etherpad-require-kernel": "^1.0.15", + "etherpad-require-kernel": "^1.0.16", "etherpad-yajsml": "0.0.12", "express": "4.18.2", "express-rate-limit": "^7.1.5", @@ -62,12 +62,13 @@ "resolve": "1.22.8", "security": "1.0.0", "semver": "^7.6.0", - "socket.io": "^2.5.0", + "socket.io": "^3.1.2", + "socket.io-client": "^3.1.3", "superagent": "^8.1.2", "terser": "^5.27.1", "threads": "^1.7.0", "tinycon": "0.6.8", - "tsx": "^4.7.0", + "tsx": "^4.7.1", "ueberdb2": "^4.2.56", "underscore": "1.13.6", "unorm": "1.6.0", @@ -78,14 +79,14 @@ "etherpad-lite": "node/server.ts" }, "devDependencies": { - "cypress": "^13.6.4", "@types/async": "^3.2.24", "@types/express": "^4.17.21", "@types/node": "^20.11.19", "@types/underscore": "^1.11.15", + "cypress": "^13.6.4", "eslint": "^8.56.0", "eslint-config-etherpad": "^3.0.22", - "etherpad-cli-client": "^2.0.2", + "etherpad-cli-client": "^3.0.1", "mocha": "^10.3.0", "mocha-froth": "^0.2.10", "nodeify": "^1.0.1", diff --git a/src/pnpm-lock.yaml b/src/pnpm-lock.yaml index e8b14dffe84..72e07cfc69a 100644 --- a/src/pnpm-lock.yaml +++ b/src/pnpm-lock.yaml @@ -24,7 +24,7 @@ dependencies: specifier: ^3.1.9 version: 3.1.9 etherpad-require-kernel: - specifier: ^1.0.15 + specifier: ^1.0.16 version: 1.0.16 etherpad-yajsml: specifier: 0.0.12 @@ -102,8 +102,11 @@ dependencies: specifier: ^7.6.0 version: 7.6.0 socket.io: - specifier: ^2.5.0 - version: 2.5.0 + specifier: ^3.1.2 + version: 3.1.2 + socket.io-client: + specifier: ^3.1.3 + version: 3.1.3 superagent: specifier: ^8.1.2 version: 8.1.2 @@ -117,7 +120,7 @@ dependencies: specifier: 0.6.8 version: 0.6.8 tsx: - specifier: ^4.7.0 + specifier: ^4.7.1 version: 4.7.1 ueberdb2: specifier: ^4.2.56 @@ -155,8 +158,8 @@ devDependencies: specifier: ^3.0.22 version: 3.0.22(eslint@8.56.0)(typescript@5.3.3) etherpad-cli-client: - specifier: ^2.0.2 - version: 2.0.2 + specifier: ^3.0.1 + version: 3.0.1 mocha: specifier: ^10.3.0 version: 10.3.0 @@ -535,8 +538,8 @@ packages: '@jridgewell/trace-mapping': 0.3.22 dev: false - /@jridgewell/resolve-uri@3.1.1: - resolution: {integrity: sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==} + /@jridgewell/resolve-uri@3.1.2: + resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} engines: {node: '>=6.0.0'} dev: false @@ -559,7 +562,7 @@ packages: /@jridgewell/trace-mapping@0.3.22: resolution: {integrity: sha512-Wf963MzWtA2sjrNt+g18IAln9lKnlRp+K2eH4jjIoF1wYeq3aMREpG09xhlhdzS0EjwU7qmUJYangWa+151vZw==} dependencies: - '@jridgewell/resolve-uri': 3.1.1 + '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.4.15 dev: false @@ -633,12 +636,25 @@ packages: '@types/node': 20.11.19 dev: true + /@types/component-emitter@1.2.14: + resolution: {integrity: sha512-lmPil1g82wwWg/qHSxMWkSKyJGQOK+ejXeMAAWyxNtVUD0/Ycj2maL63RAqpxVfdtvTfZkRnqzB0A9ft59y69g==} + /@types/connect@3.4.38: resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==} dependencies: '@types/node': 20.11.19 dev: true + /@types/cookie@0.4.1: + resolution: {integrity: sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q==} + dev: false + + /@types/cors@2.8.17: + resolution: {integrity: sha512-8CGDvrBj1zgo2qE+oS3pOCyYNqCPryMWY2bGfwA0dcfopWGgxs+78df0Rs3rc9THP4JkOhLsAa+15VdpAqkcUA==} + dependencies: + '@types/node': 20.11.19 + dev: false + /@types/debug@4.1.12: resolution: {integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==} dependencies: @@ -738,8 +754,8 @@ packages: resolution: {integrity: sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==} dev: true - /@types/semver@7.5.6: - resolution: {integrity: sha512-dn1l8LaMea/IjDoHNd9J52uBbInB796CDffS6VdIxvqYCPSG0V0DzHp76GpaWnlhg88uYyPbXCDIowa86ybd5A==} + /@types/semver@7.5.7: + resolution: {integrity: sha512-/wdoPq1QqkSj9/QOeKkFquEuPzQbHTWAMPH/PaUMB+JuR31lXhlWXRZ52IpfDYVlDOUBvX09uBrPwxGT1hjNBg==} /@types/send@0.17.4: resolution: {integrity: sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==} @@ -901,7 +917,7 @@ packages: dependencies: '@eslint-community/eslint-utils': 4.4.0(eslint@8.56.0) '@types/json-schema': 7.0.15 - '@types/semver': 7.5.6 + '@types/semver': 7.5.7 '@typescript-eslint/scope-manager': 5.62.0 '@typescript-eslint/types': 5.62.0 '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.3.3) @@ -945,9 +961,6 @@ packages: engines: {node: '>=0.4.0'} hasBin: true - /after@0.8.2: - resolution: {integrity: sha512-QbJ0NTQ/I9DI3uSJA4cbexiwQeRAfjPScqIbSjUDd9TOrcg6pTkdgziesOqxBMBzit8vFCTwrP27t13vFOORRA==} - /agent-base@7.1.0: resolution: {integrity: sha512-o/zjMZRhJxny7OyEF+Op8X+efiELC7k7yOjMzgfzVqOzXqkBkWI79YoTdOtsuWd5BWhAGAuOY/Xa6xpiaWXiNg==} engines: {node: '>= 14'} @@ -1041,7 +1054,7 @@ packages: resolution: {integrity: sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==} engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.6 + call-bind: 1.0.7 is-array-buffer: 3.0.4 dev: true @@ -1053,9 +1066,9 @@ packages: resolution: {integrity: sha512-dlcsNBIiWhPkHdOEEKnehA+RNUWDc4UqFtnIXU4uuYDPtA4LDkr7qip2p0VvFAEXNDr0yWZ9PJyIRiGjRLQzwQ==} engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.6 + call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.22.3 + es-abstract: 1.22.4 get-intrinsic: 1.2.4 is-string: 1.0.7 dev: true @@ -1069,9 +1082,9 @@ packages: resolution: {integrity: sha512-VizNcj/RGJiUyQBgzwxzE5oHdeuXY5hSbbmKMlphj1cy1Vl7Pn2asCGbSrru6hSQjmCzqTBPVWAF/whmEOVHbw==} engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.6 + call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.22.3 + es-abstract: 1.22.4 es-array-method-boxes-properly: 1.0.0 is-string: 1.0.7 dev: true @@ -1080,9 +1093,9 @@ packages: resolution: {integrity: sha512-hzvSHUshSpCflDR1QMUBLHGHP1VIEBegT4pix9H/Z92Xw3ySoy6c2qh7lJWTJnRJ8JCZ9bJNCgTyYaJGcJu6xQ==} engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.6 + call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.22.3 + es-abstract: 1.22.4 es-errors: 1.3.0 es-shim-unscopables: 1.0.2 dev: true @@ -1091,9 +1104,9 @@ packages: resolution: {integrity: sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==} engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.6 + call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.22.3 + es-abstract: 1.22.4 es-shim-unscopables: 1.0.2 dev: true @@ -1101,9 +1114,9 @@ packages: resolution: {integrity: sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==} engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.6 + call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.22.3 + es-abstract: 1.22.4 es-shim-unscopables: 1.0.2 dev: true @@ -1112,18 +1125,15 @@ packages: engines: {node: '>= 0.4'} dependencies: array-buffer-byte-length: 1.0.1 - call-bind: 1.0.6 + call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.22.3 + es-abstract: 1.22.4 es-errors: 1.3.0 get-intrinsic: 1.2.4 is-array-buffer: 3.0.4 is-shared-array-buffer: 1.0.2 dev: true - /arraybuffer.slice@0.0.7: - resolution: {integrity: sha512-wGUIVQXuehL5TCqQun8OW81jGzAWycqzFF8lFp+GOM5BXLYj3bKNsYC4daB7n6XjCqxQA/qgTJ+8ANR3acjrog==} - /asap@2.0.6: resolution: {integrity: sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==} @@ -1223,9 +1233,6 @@ packages: resolution: {integrity: sha512-T7JQa+zsXXEa6/8ZhHcQEW1UFfVM49Ts65uBkFL6fz2QmrElqmbajIDJvuA0tEhRe5eIjpV9ZF+0RfZR9voJFQ==} dev: true - /blob@0.0.5: - resolution: {integrity: sha512-gaqbzQPqOoamawKg0LGVd7SzLgXS+JH61oWprSLH+P+abTczqJbhTR8CmJ2u9/bUYNmHTGJx/UEmn6doAvvuig==} - /bluebird@3.7.2: resolution: {integrity: sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==} dev: true @@ -1308,10 +1315,11 @@ packages: engines: {node: '>=6'} dev: true - /call-bind@1.0.6: - resolution: {integrity: sha512-Mj50FLHtlsoVfRfnHaZvyrooHcrlceNZdL/QBvJJVd9Ta55qCQK0gs4ss2oZDeV9zFCs6ewzYgVE5yfVmfFpVg==} + /call-bind@1.0.7: + resolution: {integrity: sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==} engines: {node: '>= 0.4'} dependencies: + es-define-property: 1.0.0 es-errors: 1.3.0 function-bind: 1.1.2 get-intrinsic: 1.2.4 @@ -1460,19 +1468,9 @@ packages: engines: {node: '>=4.0.0'} dev: true - /component-bind@1.0.0: - resolution: {integrity: sha512-WZveuKPeKAG9qY+FkYDeADzdHyTYdIboXS59ixDeRJL5ZhxpqUnxSOwop4FQjMsiYm3/Or8cegVbpAHNA7pHxw==} - - /component-emitter@1.2.1: - resolution: {integrity: sha512-jPatnhd33viNplKjqXKRkGU345p263OIWzDL2wH3LGIGp5Kojo+uXizHmOADRvhGFFTnJqX3jBAKP6vvmSDKcA==} - dev: false - /component-emitter@1.3.1: resolution: {integrity: sha512-T0+barUSQRTUQASh8bx02dl+DhF54GtIDY13Y3m9oWTklKbb3Wv974meRpeZ3lp1JpLVECWWNHC4vaG2XHXouQ==} - /component-inherit@0.0.3: - resolution: {integrity: sha512-w+LhYREhatpVqTESyGFg3NlP6Iu0kEKUHETY9GoZP/pQyW4mHFZuFWRUCIqVPZ36ueVLtoOEZaAqbCF2RDndaA==} - /concat-map@0.0.1: resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} @@ -1526,6 +1524,14 @@ packages: resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} dev: true + /cors@2.8.5: + resolution: {integrity: sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==} + engines: {node: '>= 0.10'} + dependencies: + object-assign: 4.1.1 + vary: 1.1.2 + dev: false + /cross-spawn@7.0.3: resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} engines: {node: '>= 8'} @@ -1626,16 +1632,6 @@ packages: ms: 2.0.0 dev: false - /debug@3.1.0: - resolution: {integrity: sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - dependencies: - ms: 2.0.0 - /debug@3.2.7(supports-color@8.1.1): resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} peerDependencies: @@ -1648,18 +1644,6 @@ packages: supports-color: 8.1.1 dev: true - /debug@4.1.1: - resolution: {integrity: sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==} - deprecated: Debug versions >=3.2.0 <3.2.7 || >=4 <4.3.1 have a low-severity ReDos regression when used in a Node.js environment. It is recommended you upgrade to 3.2.7 or 4.3.1. (https://github.com/visionmedia/debug/issues/797) - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - dependencies: - ms: 2.1.3 - dev: false - /debug@4.3.4(supports-color@8.1.1): resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} engines: {node: '>=6.0'} @@ -1685,21 +1669,20 @@ packages: resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} dev: true - /define-data-property@1.1.2: - resolution: {integrity: sha512-SRtsSqsDbgpJBbW3pABMCOt6rQyeM8s8RiyeSN8jYG8sYmt/kGJejbydttUsnDs1tadr19tvhT4ShwMyoqAm4g==} + /define-data-property@1.1.4: + resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} engines: {node: '>= 0.4'} dependencies: + es-define-property: 1.0.0 es-errors: 1.3.0 - get-intrinsic: 1.2.4 gopd: 1.0.1 - has-property-descriptors: 1.0.1 /define-properties@1.2.1: resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} engines: {node: '>= 0.4'} dependencies: - define-data-property: 1.1.2 - has-property-descriptors: 1.0.1 + define-data-property: 1.1.4 + has-property-descriptors: 1.0.2 object-keys: 1.1.1 dev: true @@ -1743,8 +1726,8 @@ packages: engines: {node: '>=0.3.1'} dev: true - /diff@5.1.0: - resolution: {integrity: sha512-D+mk+qE8VC/PAUrlAU34N+VfXev0ghe5ywmpqrawphmVZc1bEfn56uo9qpyGp1p4xpzOHkSW4ztBd6L7Xx4ACw==} + /diff@5.2.0: + resolution: {integrity: sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==} engines: {node: '>=0.3.1'} dev: true @@ -1803,15 +1786,14 @@ packages: once: 1.4.0 dev: true - /engine.io-client@3.5.3: - resolution: {integrity: sha512-qsgyc/CEhJ6cgMUwxRRtOndGVhIu5hpL5tR4umSpmX/MvkFoIxUTM7oFMDQumHNzlNLwSVy6qhstFPoWTf7dOw==} + /engine.io-client@4.1.4: + resolution: {integrity: sha512-843fqAdKeUMFqKi1sSjnR11tJ4wi8sIefu6+JC1OzkkJBmjtc/gM/rZ53tJfu5Iae/3gApm5veoS+v+gtT0+Fg==} dependencies: + base64-arraybuffer: 0.1.4 component-emitter: 1.3.1 - component-inherit: 0.0.3 - debug: 3.1.0 - engine.io-parser: 2.2.1 + debug: 4.3.4(supports-color@8.1.1) + engine.io-parser: 4.0.3 has-cors: 1.1.0 - indexof: 0.0.1 parseqs: 0.0.6 parseuri: 0.0.6 ws: 7.4.6 @@ -1822,24 +1804,22 @@ packages: - supports-color - utf-8-validate - /engine.io-parser@2.2.1: - resolution: {integrity: sha512-x+dN/fBH8Ro8TFwJ+rkB2AmuVw9Yu2mockR/p3W8f8YtExwFgDvBDi0GWyb4ZLkpahtDGZgtr3zLovanJghPqg==} + /engine.io-parser@4.0.3: + resolution: {integrity: sha512-xEAAY0msNnESNPc00e19y5heTPX4y/TJ36gr8t1voOaNmTojP9b3oK3BbJLFufW2XFPQaaijpFewm2g2Um3uqA==} + engines: {node: '>=8.0.0'} dependencies: - after: 0.8.2 - arraybuffer.slice: 0.0.7 base64-arraybuffer: 0.1.4 - blob: 0.0.5 - has-binary2: 1.0.3 - /engine.io@3.6.1: - resolution: {integrity: sha512-dfs8EVg/i7QjFsXxn7cCRQ+Wai1G1TlEvHhdYEi80fxn5R1vZ2K661O6v/rezj1FP234SZ14r9CmJke99iYDGg==} - engines: {node: '>=8.0.0'} + /engine.io@4.1.2: + resolution: {integrity: sha512-t5z6zjXuVLhXDMiFJPYsPOWEER8B0tIsD3ETgw19S1yg9zryvUfY3Vhtk3Gf4sihw/bQGIqQ//gjvVlu+Ca0bQ==} + engines: {node: '>=10.0.0'} dependencies: accepts: 1.3.8 base64id: 2.0.0 cookie: 0.4.2 - debug: 4.1.1 - engine.io-parser: 2.2.1 + cors: 2.8.5 + debug: 4.3.4(supports-color@8.1.1) + engine.io-parser: 4.0.3 ws: 7.4.6 transitivePeerDependencies: - bufferutil @@ -1868,14 +1848,16 @@ packages: engines: {node: '>=0.12'} dev: false - /es-abstract@1.22.3: - resolution: {integrity: sha512-eiiY8HQeYfYH2Con2berK+To6GrK2RxbPawDkGq4UiCQQfZHb6wX9qQqkbpPqaxQFcl8d9QzZqo0tGE0VcrdwA==} + /es-abstract@1.22.4: + resolution: {integrity: sha512-vZYJlk2u6qHYxBOTjAeg7qUxHdNfih64Uu2J8QqWgXZ2cri0ZpJAkzDUK/q593+mvKwlxyaxr6F1Q+3LKoQRgg==} engines: {node: '>= 0.4'} dependencies: array-buffer-byte-length: 1.0.1 arraybuffer.prototype.slice: 1.0.3 available-typed-arrays: 1.0.6 - call-bind: 1.0.6 + call-bind: 1.0.7 + es-define-property: 1.0.0 + es-errors: 1.3.0 es-set-tostringtag: 2.0.2 es-to-primitive: 1.2.1 function.prototype.name: 1.1.6 @@ -1883,10 +1865,10 @@ packages: get-symbol-description: 1.0.2 globalthis: 1.0.3 gopd: 1.0.1 - has-property-descriptors: 1.0.1 + has-property-descriptors: 1.0.2 has-proto: 1.0.1 has-symbols: 1.0.3 - hasown: 2.0.0 + hasown: 2.0.1 internal-slot: 1.0.7 is-array-buffer: 3.0.4 is-callable: 1.2.7 @@ -1899,7 +1881,7 @@ packages: object-inspect: 1.13.1 object-keys: 1.1.1 object.assign: 4.1.5 - regexp.prototype.flags: 1.5.1 + regexp.prototype.flags: 1.5.2 safe-array-concat: 1.1.0 safe-regex-test: 1.0.3 string.prototype.trim: 1.2.8 @@ -1917,6 +1899,12 @@ packages: resolution: {integrity: sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA==} dev: true + /es-define-property@1.0.0: + resolution: {integrity: sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==} + engines: {node: '>= 0.4'} + dependencies: + get-intrinsic: 1.2.4 + /es-errors@1.3.0: resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} engines: {node: '>= 0.4'} @@ -1927,13 +1915,13 @@ packages: dependencies: get-intrinsic: 1.2.4 has-tostringtag: 1.0.2 - hasown: 2.0.0 + hasown: 2.0.1 dev: true /es-shim-unscopables@1.0.2: resolution: {integrity: sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==} dependencies: - hasown: 2.0.0 + hasown: 2.0.1 dev: true /es-to-primitive@1.2.1: @@ -2019,7 +2007,7 @@ packages: eslint-plugin-cypress: 2.15.1(eslint@8.56.0) eslint-plugin-eslint-comments: 3.2.0(eslint@8.56.0) eslint-plugin-import: 2.29.1(@typescript-eslint/parser@5.62.0)(eslint-import-resolver-typescript@3.6.1)(eslint@8.56.0) - eslint-plugin-mocha: 10.2.0(eslint@8.56.0) + eslint-plugin-mocha: 10.3.0(eslint@8.56.0) eslint-plugin-n: 16.6.2(eslint@8.56.0) eslint-plugin-prefer-arrow: 1.2.3(eslint@8.56.0) eslint-plugin-promise: 6.1.1(eslint@8.56.0) @@ -2146,7 +2134,7 @@ packages: eslint: 8.56.0 eslint-import-resolver-node: 0.3.9 eslint-module-utils: 2.8.0(@typescript-eslint/parser@5.62.0)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1)(eslint@8.56.0) - hasown: 2.0.0 + hasown: 2.0.1 is-core-module: 2.13.1 is-glob: 4.0.3 minimatch: 3.1.2 @@ -2161,8 +2149,8 @@ packages: - supports-color dev: true - /eslint-plugin-mocha@10.2.0(eslint@8.56.0): - resolution: {integrity: sha512-ZhdxzSZnd1P9LqDPF0DBcFLpRIGdh1zkF2JHnQklKQOvrQtT73kdP5K9V2mzvbLR+cCAO9OI48NXK/Ax9/ciCQ==} + /eslint-plugin-mocha@10.3.0(eslint@8.56.0): + resolution: {integrity: sha512-IWzbg2K6B1Q7h37Ih4zMyW+nhmw1JvUlHlbCUUUu6PfOOAUGCB0gxmvv7/U+TQQ6e8yHUv+q7KMdIIum4bx+PA==} engines: {node: '>=14.0.0'} peerDependencies: eslint: '>=7.0.0' @@ -2349,16 +2337,14 @@ packages: engines: {node: '>= 0.6'} dev: false - /etherpad-cli-client@2.0.2: - resolution: {integrity: sha512-yPsTD7cfGhnfd4fcrIW7Y8/ru+n93YpriP4Av83O35VYzMQVusgIaRWQ4xj+rbZkd5MBE+nmFaxIGkv0joJSSQ==} - engines: {node: '>=12.17.0'} + /etherpad-cli-client@3.0.1: + resolution: {integrity: sha512-eV/HCQIz2atFYKaLh97NvJAbfmQgDmAjx30sNoOJE+wYwEB9nvYimkEiKdukdjp5U9C6lOUqs4ucO5B0wVnmTg==} + engines: {node: '>=18.0.0'} hasBin: true - peerDependencies: - ep_etherpad-lite: '>=1.8.6' dependencies: async: 3.2.5 - socket.io-client: 2.5.0 - superagent: 7.1.5 + socket.io-client: 3.1.3 + superagent: 8.1.2 transitivePeerDependencies: - bufferutil - supports-color @@ -2697,9 +2683,9 @@ packages: resolution: {integrity: sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==} engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.6 + call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.22.3 + es-abstract: 1.22.4 functions-have-names: 1.2.3 dev: true @@ -2720,7 +2706,7 @@ packages: function-bind: 1.1.2 has-proto: 1.0.1 has-symbols: 1.0.3 - hasown: 2.0.0 + hasown: 2.0.1 /get-stream@5.2.0: resolution: {integrity: sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==} @@ -2733,7 +2719,7 @@ packages: resolution: {integrity: sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==} engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.6 + call-bind: 1.0.7 es-errors: 1.3.0 get-intrinsic: 1.2.4 dev: true @@ -2840,11 +2826,6 @@ packages: resolution: {integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==} dev: true - /has-binary2@1.0.3: - resolution: {integrity: sha512-G1LWKhDSvhGeAQ8mPVQlqNcOB2sJdwATtZKl2pDKKHfpf/rYj24lkinxf69blJbnsvtqqNU+L3SL50vzZhXOnw==} - dependencies: - isarray: 2.0.1 - /has-cors@1.1.0: resolution: {integrity: sha512-g5VNKdkFuUuVCP9gYfDJHjK2nqdQJ7aDLTnycnc2+RvsOQbuLdF5pm7vuE5J76SEBIQjs4kQY/BWq74JUmjbXA==} @@ -2852,10 +2833,10 @@ packages: resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} engines: {node: '>=8'} - /has-property-descriptors@1.0.1: - resolution: {integrity: sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==} + /has-property-descriptors@1.0.2: + resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} dependencies: - get-intrinsic: 1.2.4 + es-define-property: 1.0.0 /has-proto@1.0.1: resolution: {integrity: sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==} @@ -2872,8 +2853,8 @@ packages: has-symbols: 1.0.3 dev: true - /hasown@2.0.0: - resolution: {integrity: sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==} + /hasown@2.0.1: + resolution: {integrity: sha512-1/th4MHjnwncwXsIW6QMzlvYL9kG5e/CpVvLRZe4XPa8TOUNbCELqmvhDmnkNsAjwaG4+I8gJJL0JBvTTLO9qA==} engines: {node: '>= 0.4'} dependencies: function-bind: 1.1.2 @@ -3015,8 +2996,8 @@ packages: toidentifier: 1.0.1 dev: false - /http-proxy-agent@7.0.0: - resolution: {integrity: sha512-+ZT+iBxVUQ1asugqnD6oWoRiS25AkjNfG085dKJGtGxkdwLQrMKU5wJr2bOOFAXzKcTuqq+7fZlTMgG3SRfIYQ==} + /http-proxy-agent@7.0.2: + resolution: {integrity: sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==} engines: {node: '>= 14'} dependencies: agent-base: 7.1.0 @@ -3034,8 +3015,8 @@ packages: sshpk: 1.18.0 dev: true - /https-proxy-agent@7.0.2: - resolution: {integrity: sha512-NmLNjm6ucYwtcUmL7JQC1ZQ57LmHP4lT15FQ8D61nak1rO6DH+fz5qNK2Ap5UN4ZapYICE3/0KodcLYSPsPbaA==} + /https-proxy-agent@7.0.4: + resolution: {integrity: sha512-wlwpilI7YdjSkWaQ/7omYBMTliDcmCN8OLihO6I9B86g06lMyAoqgoDpV0XqoaPOKj+0DIdAvnsWfyAAhmimcg==} engines: {node: '>= 14'} dependencies: agent-base: 7.1.0 @@ -3094,9 +3075,6 @@ packages: engines: {node: '>=8'} dev: true - /indexof@0.0.1: - resolution: {integrity: sha512-i0G7hLJ1z0DE8dsqJa2rycj9dBmNKgXBvotXtZYXakU9oivfB9Uj2ZBC27qqef2U58/ZLwalxa1X/RDCdkHtVg==} - /inflight@1.0.6: resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} dependencies: @@ -3117,7 +3095,7 @@ packages: engines: {node: '>= 0.4'} dependencies: es-errors: 1.3.0 - hasown: 2.0.0 + hasown: 2.0.1 side-channel: 1.0.5 dev: true @@ -3130,7 +3108,7 @@ packages: resolution: {integrity: sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==} engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.6 + call-bind: 1.0.7 get-intrinsic: 1.2.4 dev: true @@ -3151,7 +3129,7 @@ packages: resolution: {integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==} engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.6 + call-bind: 1.0.7 has-tostringtag: 1.0.2 dev: true @@ -3177,7 +3155,7 @@ packages: /is-core-module@2.13.1: resolution: {integrity: sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==} dependencies: - hasown: 2.0.0 + hasown: 2.0.1 /is-date-object@1.0.5: resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==} @@ -3260,14 +3238,14 @@ packages: resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==} engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.6 + call-bind: 1.0.7 has-tostringtag: 1.0.2 dev: true /is-shared-array-buffer@1.0.2: resolution: {integrity: sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==} dependencies: - call-bind: 1.0.6 + call-bind: 1.0.7 dev: true /is-stream@2.0.1: @@ -3308,16 +3286,13 @@ packages: /is-weakref@1.0.2: resolution: {integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==} dependencies: - call-bind: 1.0.6 + call-bind: 1.0.7 dev: true /isarray@1.0.0: resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} dev: true - /isarray@2.0.1: - resolution: {integrity: sha512-c2cu3UxbI+b6kR3fy0nRnAhodsvR9dx7U5+znCOzdj6IfP3upFURTr0Xl5BlQZNKZjEtxrmVyfSdeE3O57smoQ==} - /isarray@2.0.5: resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} dev: true @@ -3369,8 +3344,8 @@ packages: decimal.js: 10.4.3 form-data: 4.0.0 html-encoding-sniffer: 4.0.0 - http-proxy-agent: 7.0.0 - https-proxy-agent: 7.0.2 + http-proxy-agent: 7.0.2 + https-proxy-agent: 7.0.4 is-potential-custom-element-name: 1.0.1 nwsapi: 2.2.7 parse5: 7.1.2 @@ -3531,7 +3506,7 @@ packages: '@types/fs-extra': 9.0.13 '@types/lockfile': 1.0.4 '@types/node-fetch': 2.6.11 - '@types/semver': 7.5.6 + '@types/semver': 7.5.7 '@types/tar': 6.1.11 '@types/url-join': 4.0.1 debug: 4.3.4(supports-color@8.1.1) @@ -3812,6 +3787,7 @@ packages: /ms@2.0.0: resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} + dev: false /ms@2.1.2: resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} @@ -3877,6 +3853,11 @@ packages: resolution: {integrity: sha512-ub5E4+FBPKwAZx0UwIQOjYWGHTEq5sPqHQNRN8Z9e4A7u3Tj1weLJsL59yH9vmvqEtBHaOmT6cYQKIZOxp35FQ==} dev: false + /object-assign@4.1.1: + resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} + engines: {node: '>=0.10.0'} + dev: false + /object-inspect@1.13.1: resolution: {integrity: sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==} @@ -3889,7 +3870,7 @@ packages: resolution: {integrity: sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==} engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.6 + call-bind: 1.0.7 define-properties: 1.2.1 has-symbols: 1.0.3 object-keys: 1.1.1 @@ -3899,18 +3880,18 @@ packages: resolution: {integrity: sha512-UPbPHML6sL8PI/mOqPwsH4G6iyXcCGzLin8KvEPenOZN5lpCNBZZQ+V62vdjB1mQHrmqGQt5/OJzemUA+KJmEA==} engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.6 + call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.22.3 + es-abstract: 1.22.4 dev: true /object.groupby@1.0.2: resolution: {integrity: sha512-bzBq58S+x+uo0VjurFT0UktpKHOZmv4/xePiOA1nbB9pMqpGK7rUPNgf+1YC+7mE+0HzhTMqNUuCqvKhj6FnBw==} dependencies: array.prototype.filter: 1.0.3 - call-bind: 1.0.6 + call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.22.3 + es-abstract: 1.22.4 es-errors: 1.3.0 dev: true @@ -3918,9 +3899,9 @@ packages: resolution: {integrity: sha512-aU6xnDFYT3x17e/f0IiiwlGPTy2jzMySGfUB4fq6z7CV8l85CWHDk5ErhyhpfDHhrOMwGFhSQkhMGHaIotA6Ng==} engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.6 + call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.22.3 + es-abstract: 1.22.4 dev: true /observable-fns@0.6.1: @@ -4237,15 +4218,6 @@ packages: util-deprecate: 1.0.2 dev: true - /readable-stream@3.6.2: - resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} - engines: {node: '>= 6'} - dependencies: - inherits: 2.0.4 - string_decoder: 1.3.0 - util-deprecate: 1.0.2 - dev: true - /readdirp@3.6.0: resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} engines: {node: '>=8.10.0'} @@ -4253,12 +4225,13 @@ packages: picomatch: 2.3.1 dev: true - /regexp.prototype.flags@1.5.1: - resolution: {integrity: sha512-sy6TXMN+hnP/wMy+ISxg3krXx7BAtWVO4UouuCN/ziM9UEne0euamVNafDfvC83bRNr95y0V5iijeDQFUNpvrg==} + /regexp.prototype.flags@1.5.2: + resolution: {integrity: sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==} engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.6 + call-bind: 1.0.7 define-properties: 1.2.1 + es-errors: 1.3.0 set-function-name: 2.0.1 dev: true @@ -4375,7 +4348,7 @@ packages: resolution: {integrity: sha512-ZdQ0Jeb9Ofti4hbt5lX3T2JcAamT9hfzYU1MNB+z/jaEbB6wfFfPIR/zEORmZqobkCCJhSjodobH6WHNmJ97dg==} engines: {node: '>=0.4'} dependencies: - call-bind: 1.0.6 + call-bind: 1.0.7 get-intrinsic: 1.2.4 has-symbols: 1.0.3 isarray: 2.0.5 @@ -4392,7 +4365,7 @@ packages: resolution: {integrity: sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==} engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.6 + call-bind: 1.0.7 es-errors: 1.3.0 is-regex: 1.1.4 dev: true @@ -4482,20 +4455,20 @@ packages: resolution: {integrity: sha512-j4t6ccc+VsKwYHso+kElc5neZpjtq9EnRICFZtWyBsLojhmeF/ZBd/elqm22WJh/BziDe/SBiOeAt0m2mfLD0g==} engines: {node: '>= 0.4'} dependencies: - define-data-property: 1.1.2 + define-data-property: 1.1.4 es-errors: 1.3.0 function-bind: 1.1.2 get-intrinsic: 1.2.4 gopd: 1.0.1 - has-property-descriptors: 1.0.1 + has-property-descriptors: 1.0.2 /set-function-name@2.0.1: resolution: {integrity: sha512-tMNCiqYVkXIZgc2Hnoy2IvC/f8ezc5koaRFkCjrpWzGpCd3qbZXPzVy9MAZzK1ch/X0jvSkojys3oqJN0qCmdA==} engines: {node: '>= 0.4'} dependencies: - define-data-property: 1.1.2 + define-data-property: 1.1.4 functions-have-names: 1.2.3 - has-property-descriptors: 1.0.1 + has-property-descriptors: 1.0.2 dev: true /setimmediate@1.0.5: @@ -4520,7 +4493,7 @@ packages: resolution: {integrity: sha512-QcgiIWV4WV7qWExbN5llt6frQB/lBven9pqliLXfGPB+K9ZYXxDozp0wLkHS24kWCm+6YXH/f0HhnObZnZOBnQ==} engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.6 + call-bind: 1.0.7 es-errors: 1.3.0 get-intrinsic: 1.2.4 object-inspect: 1.13.1 @@ -4534,7 +4507,7 @@ packages: '@sinonjs/commons': 3.0.1 '@sinonjs/fake-timers': 11.2.2 '@sinonjs/samsam': 8.0.0 - diff: 5.1.0 + diff: 5.2.0 nise: 5.1.9 supports-color: 7.2.0 dev: true @@ -4562,58 +4535,49 @@ packages: is-fullwidth-code-point: 3.0.0 dev: true - /socket.io-adapter@1.1.2: - resolution: {integrity: sha512-WzZRUj1kUjrTIrUKpZLEzFZ1OLj5FwLlAFQs9kuZJzJi5DKdU7FsWc36SNmA8iDOtwBQyT8FkrriRM8vXLYz8g==} + /socket.io-adapter@2.1.0: + resolution: {integrity: sha512-+vDov/aTsLjViYTwS9fPy5pEtTkrbEKsw2M+oVSoFGw6OD1IpvlV1VPhUzNbofCQ8oyMbdYJqDtGdmHQK6TdPg==} dev: false - /socket.io-client@2.5.0: - resolution: {integrity: sha512-lOO9clmdgssDykiOmVQQitwBAF3I6mYcQAo7hQ7AM6Ny5X7fp8hIJ3HcQs3Rjz4SoggoxA1OgrQyY8EgTbcPYw==} + /socket.io-client@3.1.3: + resolution: {integrity: sha512-4sIGOGOmCg3AOgGi7EEr6ZkTZRkrXwub70bBB/F0JSkMOUFpA77WsL87o34DffQQ31PkbMUIadGOk+3tx1KGbw==} + engines: {node: '>=10.0.0'} dependencies: + '@types/component-emitter': 1.2.14 backo2: 1.0.2 - component-bind: 1.0.0 component-emitter: 1.3.1 - debug: 3.1.0 - engine.io-client: 3.5.3 - has-binary2: 1.0.3 - indexof: 0.0.1 - parseqs: 0.0.6 + debug: 4.3.4(supports-color@8.1.1) + engine.io-client: 4.1.4 parseuri: 0.0.6 - socket.io-parser: 3.3.3 - to-array: 0.1.4 + socket.io-parser: 4.0.5 transitivePeerDependencies: - bufferutil - supports-color - utf-8-validate - /socket.io-parser@3.3.3: - resolution: {integrity: sha512-qOg87q1PMWWTeO01768Yh9ogn7chB9zkKtQnya41Y355S0UmpXgpcrFwAgjYJxu9BdKug5r5e9YtVSeWhKBUZg==} + /socket.io-parser@4.0.5: + resolution: {integrity: sha512-sNjbT9dX63nqUFIOv95tTVm6elyIU4RvB1m8dOeZt+IgWwcWklFDOdmGcfo3zSiRsnR/3pJkjY5lfoGqEe4Eig==} + engines: {node: '>=10.0.0'} dependencies: + '@types/component-emitter': 1.2.14 component-emitter: 1.3.1 - debug: 3.1.0 - isarray: 2.0.1 + debug: 4.3.4(supports-color@8.1.1) transitivePeerDependencies: - supports-color - /socket.io-parser@3.4.3: - resolution: {integrity: sha512-1rE4dZN3kCI/E5wixd393hmbqa78vVpkKmnEJhLeWoS/C5hbFYAbcSfnWoaVH43u9ToUVtzKjguxEZq+1XZfCQ==} + /socket.io@3.1.2: + resolution: {integrity: sha512-JubKZnTQ4Z8G4IZWtaAZSiRP3I/inpy8c/Bsx2jrwGrTbKeVU5xd6qkKMHpChYeM3dWZSO0QACiGK+obhBNwYw==} engines: {node: '>=10.0.0'} dependencies: - component-emitter: 1.2.1 - debug: 4.1.1 - isarray: 2.0.1 - transitivePeerDependencies: - - supports-color - dev: false - - /socket.io@2.5.0: - resolution: {integrity: sha512-gGunfS0od3VpwDBpGwVkzSZx6Aqo9uOcf1afJj2cKnKFAoyl16fvhpsUhmUFd4Ldbvl5JvRQed6eQw6oQp6n8w==} - dependencies: - debug: 4.1.1 - engine.io: 3.6.1 - has-binary2: 1.0.3 - socket.io-adapter: 1.1.2 - socket.io-client: 2.5.0 - socket.io-parser: 3.4.3 + '@types/cookie': 0.4.1 + '@types/cors': 2.8.17 + '@types/node': 20.11.19 + accepts: 1.3.8 + base64id: 2.0.0 + debug: 4.3.4(supports-color@8.1.1) + engine.io: 4.1.2 + socket.io-adapter: 2.1.0 + socket.io-parser: 4.0.5 transitivePeerDependencies: - bufferutil - supports-color @@ -4685,25 +4649,25 @@ packages: resolution: {integrity: sha512-lfjY4HcixfQXOfaqCvcBuOIapyaroTXhbkfJN3gcB1OtyupngWK4sEET9Knd0cXd28kTUqu/kHoV4HKSJdnjiQ==} engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.6 + call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.22.3 + es-abstract: 1.22.4 dev: true /string.prototype.trimend@1.0.7: resolution: {integrity: sha512-Ni79DqeB72ZFq1uH/L6zJ+DKZTkOtPIHovb3YZHQViE+HDouuU4mBrLOLDn5Dde3RF8qw5qVETEjhu9locMLvA==} dependencies: - call-bind: 1.0.6 + call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.22.3 + es-abstract: 1.22.4 dev: true /string.prototype.trimstart@1.0.7: resolution: {integrity: sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg==} dependencies: - call-bind: 1.0.6 + call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.22.3 + es-abstract: 1.22.4 dev: true /string_decoder@1.1.1: @@ -4712,12 +4676,6 @@ packages: safe-buffer: 5.1.2 dev: true - /string_decoder@1.3.0: - resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} - dependencies: - safe-buffer: 5.2.1 - dev: true - /stringify-entities@4.0.3: resolution: {integrity: sha512-BP9nNHMhhfcMbiuQKCqMjhDP5yBCAxsPu4pHFFzJ6Alo9dZgY4VLDPutXqIjpRiMoKdp7Av85Gr73Q5uH9k7+g==} dependencies: @@ -4747,25 +4705,6 @@ packages: engines: {node: '>=8'} dev: true - /superagent@7.1.5: - resolution: {integrity: sha512-HQYyGuDRFGmZ6GNC4hq2f37KnsY9Lr0/R1marNZTgMweVDQLTLJJ6DGQ9Tj/xVVs5HEnop9EMmTbywb5P30aqw==} - engines: {node: '>=6.4.0 <13 || >=14'} - dependencies: - component-emitter: 1.3.1 - cookiejar: 2.1.4 - debug: 4.3.4(supports-color@8.1.1) - fast-safe-stringify: 2.1.1 - form-data: 4.0.0 - formidable: 2.1.2 - methods: 1.1.2 - mime: 2.6.0 - qs: 6.11.2 - readable-stream: 3.6.2 - semver: 7.6.0 - transitivePeerDependencies: - - supports-color - dev: true - /superagent@8.1.2: resolution: {integrity: sha512-6WTxW1EB6yCxV5VFOIPQruWGHqc3yI7hEmZK6h+pyk69Lk/Ut7rLUY6W/ONF2MjBuGjvmMiIpsrVJ2vjrHlslA==} engines: {node: '>=6.4.0 <13 || >=14'} @@ -4889,9 +4828,6 @@ packages: rimraf: 3.0.2 dev: true - /to-array@0.1.4: - resolution: {integrity: sha512-LhVdShQD/4Mk4zXNroIQZJC+Ap3zgLcDuwEdcmLv9CCO73NWockQDwyUnW/m8VX/EElfL6FcYx7EeutN4HJA6A==} - /to-regex-range@5.0.1: resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} engines: {node: '>=8.0'} @@ -5014,7 +4950,7 @@ packages: resolution: {integrity: sha512-RSqu1UEuSlrBhHTWC8O9FnPjOduNs4M7rJ4pRKoEjtx1zUNOPN2sSXHLDX+Y2WPbHIxbvg4JFo2DNAEfPIKWoQ==} engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.6 + call-bind: 1.0.7 es-errors: 1.3.0 is-typed-array: 1.1.13 dev: true @@ -5023,7 +4959,7 @@ packages: resolution: {integrity: sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA==} engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.6 + call-bind: 1.0.7 for-each: 0.3.3 has-proto: 1.0.1 is-typed-array: 1.1.13 @@ -5034,7 +4970,7 @@ packages: engines: {node: '>= 0.4'} dependencies: available-typed-arrays: 1.0.6 - call-bind: 1.0.6 + call-bind: 1.0.7 for-each: 0.3.3 has-proto: 1.0.1 is-typed-array: 1.1.13 @@ -5043,7 +4979,7 @@ packages: /typed-array-length@1.0.4: resolution: {integrity: sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==} dependencies: - call-bind: 1.0.6 + call-bind: 1.0.7 for-each: 0.3.3 is-typed-array: 1.1.13 dev: true @@ -5069,7 +5005,7 @@ packages: /unbox-primitive@1.0.2: resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==} dependencies: - call-bind: 1.0.6 + call-bind: 1.0.7 has-bigints: 1.0.2 has-symbols: 1.0.3 which-boxed-primitive: 1.0.2 @@ -5282,7 +5218,7 @@ packages: engines: {node: '>= 0.4'} dependencies: available-typed-arrays: 1.0.6 - call-bind: 1.0.6 + call-bind: 1.0.7 for-each: 0.3.3 gopd: 1.0.1 has-tostringtag: 1.0.2 diff --git a/src/static/js/collab_client.js b/src/static/js/collab_client.js index 11a3a3dc625..69c8e41f302 100644 --- a/src/static/js/collab_client.js +++ b/src/static/js/collab_client.js @@ -156,7 +156,7 @@ const getCollabClient = (ace2editor, serverVars, initialUserInfo, options, _pad) }; const sendMessage = (msg) => { - getSocket().json.send( + getSocket().emit('message', { type: 'COLLABROOM', component: 'pad', diff --git a/src/static/js/pad.js b/src/static/js/pad.js index 802f1d47672..df409372a39 100644 --- a/src/static/js/pad.js +++ b/src/static/js/pad.js @@ -207,7 +207,7 @@ const sendClientReady = (isReconnect) => { msg.reconnect = true; } - socket.json.send(msg); + socket.emit("message", msg); }; const handshake = async () => { diff --git a/src/static/js/timeslider.js b/src/static/js/timeslider.js index 8c5993145bd..4cc5d45a629 100644 --- a/src/static/js/timeslider.js +++ b/src/static/js/timeslider.js @@ -95,7 +95,7 @@ const init = () => { // sends a message over the socket const sendSocketMsg = (type, data) => { - socket.json.send({ + socket.emit("message", { component: 'pad', // FIXME: Remove this stupidity! type, data, diff --git a/src/templates/pad.html b/src/templates/pad.html index 54e1897d900..69671ca17b1 100644 --- a/src/templates/pad.html +++ b/src/templates/pad.html @@ -442,7 +442,7 @@

Skin Builder

<% e.begin_block("scripts"); %> - + diff --git a/src/templates/timeslider.html b/src/templates/timeslider.html index e26cd11e7cb..ee45f457556 100644 --- a/src/templates/timeslider.html +++ b/src/templates/timeslider.html @@ -250,7 +250,7 @@

- + diff --git a/src/tests/backend/common.js b/src/tests/backend/common.js index b331cf05dd6..8172e1e8738 100644 --- a/src/tests/backend/common.js +++ b/src/tests/backend/common.js @@ -147,7 +147,6 @@ exports.connect = async (res = null) => { } const socket = io(`${exports.baseUrl}/`, { forceNew: true, // Different tests will have different query parameters. - path: '/socket.io', // socketio.js-client on node.js doesn't support cookies (see https://git.io/JU8u9), so the // express_sid cookie must be passed as a query parameter. query: {cookie: reqCookieHdr, padId}, @@ -172,7 +171,7 @@ exports.connect = async (res = null) => { */ exports.handshake = async (socket, padId, token = padutils.generateAuthorToken()) => { logger.debug('sending CLIENT_READY...'); - socket.send({ + socket.emit('message', { component: 'pad', type: 'CLIENT_READY', padId, @@ -189,7 +188,7 @@ exports.handshake = async (socket, padId, token = padutils.generateAuthorToken() * Convenience wrapper around `socket.send()` that waits for acknowledgement. */ exports.sendMessage = async (socket, message) => await new Promise((resolve, reject) => { - socket.send(message, (errInfo) => { + socket.emit('message', message, (errInfo) => { if (errInfo != null) { const {name, message} = errInfo; const err = new Error(message); diff --git a/src/tests/backend/specs/chat.js b/src/tests/backend/specs/chat.js index aefa64183f6..88fda9d07a3 100644 --- a/src/tests/backend/specs/chat.js +++ b/src/tests/backend/specs/chat.js @@ -32,7 +32,7 @@ const checkHook = async (hookName, checkFn) => { }; const sendMessage = (socket, data) => { - socket.send({ + socket.emit('message', { type: 'COLLABROOM', component: 'pad', data, diff --git a/src/tests/backend/specs/messages.js b/src/tests/backend/specs/messages.js index 643005f124d..827f7358854 100644 --- a/src/tests/backend/specs/messages.js +++ b/src/tests/backend/specs/messages.js @@ -38,6 +38,7 @@ describe(__filename, function () { res = await agent.get(`/p/${roPadId}`).expect(200); roSocket = await common.connect(res); await common.handshake(roSocket, roPadId); + await new Promise(resolve => setTimeout(resolve, 1000)); }); afterEach(async function () { diff --git a/src/tests/backend/specs/socketio.js b/src/tests/backend/specs/socketio.js index 15f56177499..8a65213f8eb 100644 --- a/src/tests/backend/specs/socketio.js +++ b/src/tests/backend/specs/socketio.js @@ -390,7 +390,7 @@ describe(__filename, function () { handleMessage(socket, message) { assert.fail('wrong handler called'); } }()); socket = await common.connect(); - socket.send(want); + socket.emit('message', want); assert.deepEqual(await got, want); }); @@ -398,7 +398,7 @@ describe(__filename, function () { const AckErr = class extends Error { constructor(name, ...args) { super(...args); this.name = name; } }; - socket.send(message, + socket.emit('message', message, (errj, val) => errj != null ? reject(new AckErr(errj.name, errj.message)) : resolve(val)); });