mirror of
https://github.com/docmost/docmost.git
synced 2026-08-27 16:57:05 +08:00
* WIP 1 * complete v4 migration * add flushDelay * feat: multiplexing * fix: survive hocuspocus v4 message timeout * fix: searchTerm type error
47 lines
1.1 KiB
TypeScript
47 lines
1.1 KiB
TypeScript
import {
|
|
HocuspocusProviderWebsocket,
|
|
WebSocketStatus,
|
|
} from "@hocuspocus/provider";
|
|
import { getCollaborationUrl } from "@/lib/config.ts";
|
|
|
|
const RELEASE_GRACE_MS = 5000;
|
|
|
|
let socket: HocuspocusProviderWebsocket | null = null;
|
|
let editorCount = 0;
|
|
let releaseTimer: ReturnType<typeof setTimeout> | null = null;
|
|
|
|
export function getCollabSocket(): HocuspocusProviderWebsocket {
|
|
if (!socket) {
|
|
socket = new HocuspocusProviderWebsocket({
|
|
url: getCollaborationUrl(),
|
|
autoConnect: false,
|
|
});
|
|
}
|
|
return socket;
|
|
}
|
|
|
|
export function acquireCollabSocket(): void {
|
|
editorCount++;
|
|
if (releaseTimer) {
|
|
clearTimeout(releaseTimer);
|
|
releaseTimer = null;
|
|
}
|
|
const collabSocket = getCollabSocket();
|
|
collabSocket.shouldConnect = true;
|
|
if (collabSocket.status === WebSocketStatus.Disconnected) {
|
|
collabSocket.connect();
|
|
}
|
|
}
|
|
|
|
export function releaseCollabSocket(): void {
|
|
editorCount--;
|
|
if (editorCount > 0) return;
|
|
if (releaseTimer) clearTimeout(releaseTimer);
|
|
releaseTimer = setTimeout(() => {
|
|
releaseTimer = null;
|
|
if (editorCount === 0) {
|
|
socket?.disconnect();
|
|
}
|
|
}, RELEASE_GRACE_MS);
|
|
}
|