mirror of
https://github.com/docmost/docmost.git
synced 2026-05-07 14:43:06 +08:00
74e915546b
* feat(collab): better redis extension * move types to own file * debug logging * fix: graceful collab shutdown * rename default prefix * pass wsAdapter to gateway * expose event handler * unique collab serverId generation * uninstall @hocuspocus/extension-redis package * expose more functions * sync with latest * cleanup * fastify router options * cleanup type
52 lines
1.2 KiB
TypeScript
52 lines
1.2 KiB
TypeScript
import { WebSocketServer } from 'ws';
|
|
|
|
export class CollabWsAdapter {
|
|
private readonly wss: WebSocketServer;
|
|
|
|
constructor() {
|
|
this.wss = new WebSocketServer({ noServer: true });
|
|
}
|
|
|
|
handleUpgrade(path: string, httpServer: any) {
|
|
httpServer.on('upgrade', (request: any, socket: any, head: any) => {
|
|
try {
|
|
const baseUrl = 'ws://' + request.headers.host + '/';
|
|
const pathname = new URL(request.url, baseUrl).pathname;
|
|
|
|
if (pathname === path) {
|
|
this.wss.handleUpgrade(request, socket, head, (ws) => {
|
|
this.wss.emit('connection', ws, request);
|
|
});
|
|
} else if (pathname === '/socket.io/') {
|
|
return;
|
|
} else {
|
|
socket.destroy();
|
|
}
|
|
} catch (err) {
|
|
socket.end('HTTP/1.1 400\r\n' + (err as Error).message);
|
|
}
|
|
});
|
|
|
|
return this.wss;
|
|
}
|
|
|
|
public close() {
|
|
try {
|
|
this.wss.close();
|
|
} catch (err) {
|
|
console.error(err);
|
|
}
|
|
}
|
|
|
|
public destroy() {
|
|
try {
|
|
this.wss.close();
|
|
this.wss.clients.forEach((client) => {
|
|
client.terminate();
|
|
});
|
|
} catch (err) {
|
|
console.error(err);
|
|
}
|
|
}
|
|
}
|