feat :migrate socket.io 2 -> 3

This commit is contained in:
hossein 2024-02-11 20:35:16 +03:30
parent 04cc3c8d54
commit e7bfd0d9b1
8 changed files with 249 additions and 0 deletions

13
.vscode/settings.json vendored Normal file
View file

@ -0,0 +1,13 @@
{
"eslint.enable": false,
"prettier.enable": false,
"javascript.format.enable": false,
"editor.formatOnSave": false,
"eslint.autoFixOnSave": false,
"[javascript]": {
"editor.formatOnSave": false
},
"[typescript]": {
"editor.formatOnSave": false
}
}

View file

@ -161,7 +161,11 @@ exports.handleConnect = (socket:any) => {
/**
* Kicks all sessions from a pad
*/
<<<<<<< HEAD:src/node/handler/PadMessageHandler.ts
exports.kickSessionsFromPad = (padID: string) => {
=======
exports.kickSessionsFromPad = (padID) => {
>>>>>>> 53a847ce4 (feat :migrate socket.io 2 -> 3):src/node/handler/PadMessageHandler.js
if (typeof socketio.sockets.clients !== 'object') return;
// skip if there is nobody on this pad
@ -665,7 +669,11 @@ const handleUserChanges = async (socket:any, message: typeof ChatMessage) => {
thisSession.rev = newRev;
if (newRev !== r) thisSession.time = await pad.getRevisionDate(newRev);
await exports.updatePadClients(pad);
<<<<<<< HEAD:src/node/handler/PadMessageHandler.ts
} catch (err:any) {
=======
} catch (err) {
>>>>>>> 53a847ce4 (feat :migrate socket.io 2 -> 3):src/node/handler/PadMessageHandler.js
socket.emit('message', {disconnect: 'badChangeset'});
stats.meter('failedChangesets').mark();
messageLogger.warn(`Failed to apply USER_CHANGES from author ${thisSession.author} ` +
@ -724,7 +732,11 @@ exports.updatePadClients = async (pad: PadType) => {
};
try {
socket.emit('message', msg);
<<<<<<< HEAD:src/node/handler/PadMessageHandler.ts
} catch (err:any) {
=======
} catch (err) {
>>>>>>> 53a847ce4 (feat :migrate socket.io 2 -> 3):src/node/handler/PadMessageHandler.js
messageLogger.error(`Failed to notify user of new revision: ${err.stack || err}`);
return;
}
@ -1250,7 +1262,11 @@ const _getRoomSockets = (padID: string) => {
// 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 = ns.adapter.rooms?.get(padID);
<<<<<<< HEAD:src/node/handler/PadMessageHandler.ts
=======
>>>>>>> 53a847ce4 (feat :migrate socket.io 2 -> 3):src/node/handler/PadMessageHandler.js
if (!room) return [];
return Array.from(room)

View file

@ -7,7 +7,11 @@ const express = require('../express');
const log4js = require('log4js');
const proxyaddr = require('proxy-addr');
const settings = require('../../utils/Settings');
<<<<<<< HEAD
import {Server} from 'socket.io'
=======
const {Server} = require('socket.io');
>>>>>>> 53a847ce4 (feat :migrate socket.io 2 -> 3)
const socketIORouter = require('../../handler/SocketIORouter');
const hooks = require('../../../static/js/pluginfw/hooks');
const padMessageHandler = require('../../handler/PadMessageHandler');
@ -48,7 +52,11 @@ exports.expressCloseServer = async () => {
logger.info('All socket.io clients have disconnected');
};
<<<<<<< HEAD
exports.socketSessionMiddleware = (args: any) => (socket: any, next: Function) => {
=======
exports.socketSessionMiddleware = (socket: any, next: Function) => {
>>>>>>> 53a847ce4 (feat :migrate socket.io 2 -> 3)
const req = socket.request;
// Express sets req.ip but socket.io does not. Replicate Express's behavior here.
if (req.ip == null) {
@ -59,9 +67,17 @@ exports.socketSessionMiddleware = (args: any) => (socket: any, next: Function) =
}
}
if (!req.headers.cookie) {
<<<<<<< HEAD
// socketio.js-client on node.js doesn't support cookies, so pass them via a query parameter.
req.headers.cookie = socket.handshake.query.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
>>>>>>> 53a847ce4 (feat :migrate socket.io 2 -> 3)
express.sessionMiddleware(req, {}, next);
};
@ -74,9 +90,21 @@ exports.expressCreateServer = (hookName:string, args:ArgsExpressType, cb:Functio
transports: settings.socketTransportProtocols,
})
<<<<<<< HEAD
function handleConnection() {
return (socket: any) => {
sockets.add(socket);
=======
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);
>>>>>>> 53a847ce4 (feat :migrate socket.io 2 -> 3)
socketsEvents.emit('updated');
// https://socket.io/docs/v3/faq/index.html
const session = socket.request.session;
@ -89,6 +117,7 @@ exports.expressCreateServer = (hookName:string, args:ArgsExpressType, cb:Functio
};
}
<<<<<<< HEAD
io.on('connection', handleConnection);
io.use(exports.socketSessionMiddleware(args));
@ -96,6 +125,9 @@ exports.expressCreateServer = (hookName:string, args:ArgsExpressType, cb:Functio
// Temporary workaround so all clients go through middleware and handle connection
io.of('/pluginfw/installer').use(exports.socketSessionMiddleware(args))
io.of('/settings').use(exports.socketSessionMiddleware(args))
=======
io.use(exports.socketSessionMiddleware);
>>>>>>> 53a847ce4 (feat :migrate socket.io 2 -> 3)
io.use((socket:any, next:Function) => {
socket.conn.on('packet', (packet:string) => {

View file

@ -63,7 +63,11 @@
"security": "1.0.0",
"semver": "^7.6.0",
"socket.io": "^3.1.2",
<<<<<<< HEAD
"socket.io-client": "^4.7.4",
=======
"socket.io-client": "^3.1.2",
>>>>>>> 53a847ce4 (feat :migrate socket.io 2 -> 3)
"superagent": "^8.1.2",
"terser": "^5.28.1",
"threads": "^1.7.0",
@ -88,6 +92,7 @@
"@types/sinon": "^17.0.3",
"@types/supertest": "^6.0.2",
"@types/underscore": "^1.11.15",
"cypress": "^13.6.4",
"eslint": "^8.56.0",
"eslint-config-etherpad": "^3.0.22",
"etherpad-cli-client": "^3.0.1",
@ -113,8 +118,13 @@
},
"scripts": {
"lint": "eslint .",
<<<<<<< HEAD
"test": "mocha --import=tsx --timeout 120000 --recursive tests/backend/specs/**.ts tests/backend/specs/**/*.ts ../node_modules/ep_*/static/tests/backend/specs",
"test-container": "mocha --import=tsx --timeout 5000 tests/container/specs/api",
=======
"test": "mocha --import=tsx --timeout 990000 --recursive tests/backend/specs ../node_modules/ep_*/static/tests/backend/specs",
"test-container": "mocha --import=tsx --timeout 99000 tests/container/specs/api",
>>>>>>> 53a847ce4 (feat :migrate socket.io 2 -> 3)
"dev": "node --import tsx node/server.ts",
"prod": "node --import tsx node/server.ts",
"ts-check": "tsc --noEmit",

164
src/pnpm-lock.yaml generated
View file

@ -105,8 +105,13 @@ dependencies:
specifier: ^3.1.2
version: 3.1.2
socket.io-client:
<<<<<<< HEAD
specifier: ^3.1.3
version: 3.1.3
=======
specifier: ^3.1.2
version: 3.1.2
>>>>>>> 53a847ce4 (feat :migrate socket.io 2 -> 3)
superagent:
specifier: ^8.1.2
version: 8.1.2
@ -638,6 +643,10 @@ packages:
/@types/component-emitter@1.2.14:
resolution: {integrity: sha512-lmPil1g82wwWg/qHSxMWkSKyJGQOK+ejXeMAAWyxNtVUD0/Ycj2maL63RAqpxVfdtvTfZkRnqzB0A9ft59y69g==}
<<<<<<< HEAD
=======
dev: false
>>>>>>> 53a847ce4 (feat :migrate socket.io 2 -> 3)
/@types/connect@3.4.38:
resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==}
@ -652,7 +661,11 @@ packages:
/@types/cors@2.8.17:
resolution: {integrity: sha512-8CGDvrBj1zgo2qE+oS3pOCyYNqCPryMWY2bGfwA0dcfopWGgxs+78df0Rs3rc9THP4JkOhLsAa+15VdpAqkcUA==}
dependencies:
<<<<<<< HEAD
'@types/node': 20.11.19
=======
'@types/node': 20.11.17
>>>>>>> 53a847ce4 (feat :migrate socket.io 2 -> 3)
dev: false
/@types/debug@4.1.12:
@ -961,6 +974,13 @@ packages:
engines: {node: '>=0.4.0'}
hasBin: true
<<<<<<< HEAD
=======
/after@0.8.2:
resolution: {integrity: sha512-QbJ0NTQ/I9DI3uSJA4cbexiwQeRAfjPScqIbSjUDd9TOrcg6pTkdgziesOqxBMBzit8vFCTwrP27t13vFOORRA==}
dev: true
>>>>>>> 53a847ce4 (feat :migrate socket.io 2 -> 3)
/agent-base@7.1.0:
resolution: {integrity: sha512-o/zjMZRhJxny7OyEF+Op8X+efiELC7k7yOjMzgfzVqOzXqkBkWI79YoTdOtsuWd5BWhAGAuOY/Xa6xpiaWXiNg==}
engines: {node: '>= 14'}
@ -1134,6 +1154,13 @@ packages:
is-shared-array-buffer: 1.0.2
dev: true
<<<<<<< HEAD
=======
/arraybuffer.slice@0.0.7:
resolution: {integrity: sha512-wGUIVQXuehL5TCqQun8OW81jGzAWycqzFF8lFp+GOM5BXLYj3bKNsYC4daB7n6XjCqxQA/qgTJ+8ANR3acjrog==}
dev: true
>>>>>>> 53a847ce4 (feat :migrate socket.io 2 -> 3)
/asap@2.0.6:
resolution: {integrity: sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==}
@ -1233,6 +1260,13 @@ packages:
resolution: {integrity: sha512-T7JQa+zsXXEa6/8ZhHcQEW1UFfVM49Ts65uBkFL6fz2QmrElqmbajIDJvuA0tEhRe5eIjpV9ZF+0RfZR9voJFQ==}
dev: true
<<<<<<< HEAD
=======
/blob@0.0.5:
resolution: {integrity: sha512-gaqbzQPqOoamawKg0LGVd7SzLgXS+JH61oWprSLH+P+abTczqJbhTR8CmJ2u9/bUYNmHTGJx/UEmn6doAvvuig==}
dev: true
>>>>>>> 53a847ce4 (feat :migrate socket.io 2 -> 3)
/bluebird@3.7.2:
resolution: {integrity: sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==}
dev: true
@ -1468,9 +1502,23 @@ packages:
engines: {node: '>=4.0.0'}
dev: true
<<<<<<< HEAD
/component-emitter@1.3.1:
resolution: {integrity: sha512-T0+barUSQRTUQASh8bx02dl+DhF54GtIDY13Y3m9oWTklKbb3Wv974meRpeZ3lp1JpLVECWWNHC4vaG2XHXouQ==}
=======
/component-bind@1.0.0:
resolution: {integrity: sha512-WZveuKPeKAG9qY+FkYDeADzdHyTYdIboXS59ixDeRJL5ZhxpqUnxSOwop4FQjMsiYm3/Or8cegVbpAHNA7pHxw==}
dev: true
/component-emitter@1.3.1:
resolution: {integrity: sha512-T0+barUSQRTUQASh8bx02dl+DhF54GtIDY13Y3m9oWTklKbb3Wv974meRpeZ3lp1JpLVECWWNHC4vaG2XHXouQ==}
/component-inherit@0.0.3:
resolution: {integrity: sha512-w+LhYREhatpVqTESyGFg3NlP6Iu0kEKUHETY9GoZP/pQyW4mHFZuFWRUCIqVPZ36ueVLtoOEZaAqbCF2RDndaA==}
dev: true
>>>>>>> 53a847ce4 (feat :migrate socket.io 2 -> 3)
/concat-map@0.0.1:
resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==}
@ -1632,6 +1680,20 @@ packages:
ms: 2.0.0
dev: false
<<<<<<< HEAD
=======
/debug@3.1.0:
resolution: {integrity: sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==}
peerDependencies:
supports-color: '*'
peerDependenciesMeta:
supports-color:
optional: true
dependencies:
ms: 2.0.0
dev: true
>>>>>>> 53a847ce4 (feat :migrate socket.io 2 -> 3)
/debug@3.2.7(supports-color@8.1.1):
resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==}
peerDependencies:
@ -1803,12 +1865,49 @@ packages:
- bufferutil
- supports-color
- utf-8-validate
dev: true
/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
debug: 4.3.4(supports-color@8.1.1)
engine.io-parser: 4.0.3
has-cors: 1.1.0
parseqs: 0.0.6
parseuri: 0.0.6
ws: 7.4.6
xmlhttprequest-ssl: 1.6.3
yeast: 0.1.2
transitivePeerDependencies:
- bufferutil
- supports-color
- utf-8-validate
dev: false
<<<<<<< HEAD
=======
/engine.io-parser@2.2.1:
resolution: {integrity: sha512-x+dN/fBH8Ro8TFwJ+rkB2AmuVw9Yu2mockR/p3W8f8YtExwFgDvBDi0GWyb4ZLkpahtDGZgtr3zLovanJghPqg==}
dependencies:
after: 0.8.2
arraybuffer.slice: 0.0.7
base64-arraybuffer: 0.1.4
blob: 0.0.5
has-binary2: 1.0.3
dev: true
>>>>>>> 53a847ce4 (feat :migrate socket.io 2 -> 3)
/engine.io-parser@4.0.3:
resolution: {integrity: sha512-xEAAY0msNnESNPc00e19y5heTPX4y/TJ36gr8t1voOaNmTojP9b3oK3BbJLFufW2XFPQaaijpFewm2g2Um3uqA==}
engines: {node: '>=8.0.0'}
dependencies:
base64-arraybuffer: 0.1.4
<<<<<<< HEAD
=======
dev: false
>>>>>>> 53a847ce4 (feat :migrate socket.io 2 -> 3)
/engine.io@4.1.2:
resolution: {integrity: sha512-t5z6zjXuVLhXDMiFJPYsPOWEER8B0tIsD3ETgw19S1yg9zryvUfY3Vhtk3Gf4sihw/bQGIqQ//gjvVlu+Ca0bQ==}
@ -2826,6 +2925,15 @@ packages:
resolution: {integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==}
dev: true
<<<<<<< HEAD
=======
/has-binary2@1.0.3:
resolution: {integrity: sha512-G1LWKhDSvhGeAQ8mPVQlqNcOB2sJdwATtZKl2pDKKHfpf/rYj24lkinxf69blJbnsvtqqNU+L3SL50vzZhXOnw==}
dependencies:
isarray: 2.0.1
dev: true
>>>>>>> 53a847ce4 (feat :migrate socket.io 2 -> 3)
/has-cors@1.1.0:
resolution: {integrity: sha512-g5VNKdkFuUuVCP9gYfDJHjK2nqdQJ7aDLTnycnc2+RvsOQbuLdF5pm7vuE5J76SEBIQjs4kQY/BWq74JUmjbXA==}
@ -3075,6 +3183,13 @@ packages:
engines: {node: '>=8'}
dev: true
<<<<<<< HEAD
=======
/indexof@0.0.1:
resolution: {integrity: sha512-i0G7hLJ1z0DE8dsqJa2rycj9dBmNKgXBvotXtZYXakU9oivfB9Uj2ZBC27qqef2U58/ZLwalxa1X/RDCdkHtVg==}
dev: true
>>>>>>> 53a847ce4 (feat :migrate socket.io 2 -> 3)
/inflight@1.0.6:
resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==}
dependencies:
@ -3293,6 +3408,13 @@ packages:
resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==}
dev: true
<<<<<<< HEAD
=======
/isarray@2.0.1:
resolution: {integrity: sha512-c2cu3UxbI+b6kR3fy0nRnAhodsvR9dx7U5+znCOzdj6IfP3upFURTr0Xl5BlQZNKZjEtxrmVyfSdeE3O57smoQ==}
dev: true
>>>>>>> 53a847ce4 (feat :migrate socket.io 2 -> 3)
/isarray@2.0.5:
resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==}
dev: true
@ -4554,7 +4676,38 @@ packages:
- bufferutil
- supports-color
- utf-8-validate
dev: true
/socket.io-client@3.1.2:
resolution: {integrity: sha512-fXhF8plHrd7U14A7K0JPOmZzpmGkLpIS6623DzrBZqYzI/yvlP4fA3LnxwthEVgiHmn2uJ4KjdnQD8A03PuBWQ==}
engines: {node: '>=10.0.0'}
dependencies:
'@types/component-emitter': 1.2.14
backo2: 1.0.2
component-emitter: 1.3.1
debug: 4.3.4(supports-color@8.1.1)
engine.io-client: 4.1.4
parseuri: 0.0.6
socket.io-parser: 4.0.5
transitivePeerDependencies:
- bufferutil
- supports-color
- utf-8-validate
dev: false
<<<<<<< HEAD
=======
/socket.io-parser@3.3.3:
resolution: {integrity: sha512-qOg87q1PMWWTeO01768Yh9ogn7chB9zkKtQnya41Y355S0UmpXgpcrFwAgjYJxu9BdKug5r5e9YtVSeWhKBUZg==}
dependencies:
component-emitter: 1.3.1
debug: 3.1.0
isarray: 2.0.1
transitivePeerDependencies:
- supports-color
dev: true
>>>>>>> 53a847ce4 (feat :migrate socket.io 2 -> 3)
/socket.io-parser@4.0.5:
resolution: {integrity: sha512-sNjbT9dX63nqUFIOv95tTVm6elyIU4RvB1m8dOeZt+IgWwcWklFDOdmGcfo3zSiRsnR/3pJkjY5lfoGqEe4Eig==}
engines: {node: '>=10.0.0'}
@ -4571,7 +4724,11 @@ packages:
dependencies:
'@types/cookie': 0.4.1
'@types/cors': 2.8.17
<<<<<<< HEAD
'@types/node': 20.11.19
=======
'@types/node': 20.11.17
>>>>>>> 53a847ce4 (feat :migrate socket.io 2 -> 3)
accepts: 1.3.8
base64id: 2.0.0
debug: 4.3.4(supports-color@8.1.1)
@ -4828,6 +4985,13 @@ packages:
rimraf: 3.0.2
dev: true
<<<<<<< HEAD
=======
/to-array@0.1.4:
resolution: {integrity: sha512-LhVdShQD/4Mk4zXNroIQZJC+Ap3zgLcDuwEdcmLv9CCO73NWockQDwyUnW/m8VX/EElfL6FcYx7EeutN4HJA6A==}
dev: true
>>>>>>> 53a847ce4 (feat :migrate socket.io 2 -> 3)
/to-regex-range@5.0.1:
resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==}
engines: {node: '>=8.0'}

View file

@ -191,11 +191,17 @@ exports.handshake = async (socket: any, padId:string, token = padutils.generateA
/**
* Convenience wrapper around `socket.send()` that waits for acknowledgement.
*/
<<<<<<< HEAD:src/tests/backend/common.ts
exports.sendMessage = async (socket: any, message:any) => await new Promise<void>((resolve, reject) => {
socket.emit('message', message, (errInfo:{
name: string,
message: string,
}) => {
=======
exports.sendMessage = async (socket, message) => await new Promise((resolve, reject) => {
if(message.type === "CHANGESET_REQ")
socket.emit('message', message, (errInfo) => {
>>>>>>> 53a847ce4 (feat :migrate socket.io 2 -> 3):src/tests/backend/common.js
if (errInfo != null) {
const {name, message} = errInfo;
const err = new Error(message);

View file

@ -41,7 +41,11 @@ const checkHook = async (hookName: string, checkFn?:CheckFN) => {
});
};
<<<<<<< HEAD:src/tests/backend/specs/chat.ts
const sendMessage = (socket: any, data:any) => {
=======
const sendMessage = (socket, data) => {
>>>>>>> 53a847ce4 (feat :migrate socket.io 2 -> 3):src/tests/backend/specs/chat.js
socket.emit('message', {
type: 'COLLABROOM',
component: 'pad',

View file

@ -404,10 +404,14 @@ describe(__filename, function () {
constructor(name: string, ...args:any) { super(...args); this.name = name; }
};
socket.emit('message', message,
<<<<<<< HEAD:src/tests/backend/specs/socketio.ts
(errj: {
message: string,
name: string,
}, val: any) => errj != null ? reject(new AckErr(errj.name, errj.message)) : resolve(val));
=======
(errj, val) => errj != null ? reject(new AckErr(errj.name, errj.message)) : resolve(val));
>>>>>>> 53a847ce4 (feat :migrate socket.io 2 -> 3):src/tests/backend/specs/socketio.js
});
it('handleMessage with ack (success)', async function () {