mirror of
https://github.com/docmost/docmost.git
synced 2026-08-27 08:47:06 +08:00
43 lines
1.1 KiB
TypeScript
43 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() });
|
|
}
|
|
return socket;
|
|
}
|
|
|
|
export function acquireCollabSocket(): void {
|
|
editorCount++;
|
|
if (releaseTimer) {
|
|
clearTimeout(releaseTimer);
|
|
releaseTimer = null;
|
|
}
|
|
const collabSocket = getCollabSocket();
|
|
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);
|
|
}
|