From 55f21bfbb3177e3eb6f1424eb30354ab6053d148 Mon Sep 17 00:00:00 2001 From: Tom Moor Date: Wed, 3 Dec 2025 20:25:12 -0500 Subject: [PATCH] fix: Rapid retry behavior (#10776) --- .../Document/components/MultiplayerEditor.tsx | 28 +++++++++++++------ .../slack/server/processors/SlackProcessor.ts | 2 +- .../ConnectionLimitExtension.test.ts | 2 +- server/utils/ShutdownHelper.ts | 2 +- {server => shared}/utils/timers.ts | 0 5 files changed, 22 insertions(+), 12 deletions(-) rename {server => shared}/utils/timers.ts (100%) diff --git a/app/scenes/Document/components/MultiplayerEditor.tsx b/app/scenes/Document/components/MultiplayerEditor.tsx index c7ce44520c..643ff0f390 100644 --- a/app/scenes/Document/components/MultiplayerEditor.tsx +++ b/app/scenes/Document/components/MultiplayerEditor.tsx @@ -6,6 +6,7 @@ import { useMemo, useEffect, forwardRef, + useRef, } from "react"; import { useTranslation } from "react-i18next"; import { useHistory } from "react-router-dom"; @@ -26,6 +27,7 @@ import useStores from "~/hooks/useStores"; import { AwarenessChangeEvent } from "~/types"; import Logger from "~/utils/Logger"; import { homePath } from "~/utils/routeHelpers"; +import { sleep } from "@shared/utils/timers"; type Props = EditorProps & { id: string; @@ -52,6 +54,7 @@ function MultiplayerEditor({ onSynced, ...props }: Props, ref: any) { const history = useHistory(); const { t } = useTranslation(); const currentUser = useCurrentUser(); + const retryCount = useRef(0); const { presence, auth, ui } = useStores(); const [editorVersionBehind, setEditorVersionBehind] = useState(false); const [showCursorNames, setShowCursorNames] = useState(false); @@ -105,15 +108,21 @@ function MultiplayerEditor({ onSynced, ...props }: Props, ref: any) { ); provider.on("authenticationFailed", () => { - void auth - .fetchAuth() - .then(() => { - provider.setConfiguration({ token: auth.collaborationToken }); - provider.connect(); - }) - .catch(() => { - history.replace(homePath()); - }); + provider.shouldConnect = false; + retryCount.current++; + + sleep(retryCount.current * 1000 - 1000).then(() => + auth + .fetchAuth() + .then(() => { + provider.setConfiguration({ token: auth.collaborationToken }); + provider.connect(); + provider.shouldConnect = true; + }) + .catch(() => { + history.replace(homePath()); + }) + ); }); provider.on("awarenessChange", (event: AwarenessChangeEvent) => { @@ -153,6 +162,7 @@ function MultiplayerEditor({ onSynced, ...props }: Props, ref: any) { provider.on("synced", () => { presence.touch(documentId, currentUser.id, false); setRemoteSynced(true); + retryCount.current = 0; }); provider.on("close", (ev: MessageEvent) => { diff --git a/plugins/slack/server/processors/SlackProcessor.ts b/plugins/slack/server/processors/SlackProcessor.ts index 4ebc33ea2d..ca36597040 100644 --- a/plugins/slack/server/processors/SlackProcessor.ts +++ b/plugins/slack/server/processors/SlackProcessor.ts @@ -11,7 +11,7 @@ import { Event, } from "@server/types"; import fetch from "@server/utils/fetch"; -import { sleep } from "@server/utils/timers"; +import { sleep } from "@shared/utils/timers"; import env from "../env"; import { presentMessageAttachment } from "../presenters/messageAttachment"; diff --git a/server/collaboration/ConnectionLimitExtension.test.ts b/server/collaboration/ConnectionLimitExtension.test.ts index e3027acb48..42d9cf96cf 100644 --- a/server/collaboration/ConnectionLimitExtension.test.ts +++ b/server/collaboration/ConnectionLimitExtension.test.ts @@ -1,7 +1,7 @@ import { Server } from "@hocuspocus/server"; import WebSocket from "ws"; import EDITOR_VERSION from "@shared/editor/version"; -import { sleep } from "@server/utils/timers"; +import { sleep } from "@shared/utils/timers"; import { ConnectionLimitExtension } from "./ConnectionLimitExtension"; import { EditorVersionExtension } from "./EditorVersionExtension"; diff --git a/server/utils/ShutdownHelper.ts b/server/utils/ShutdownHelper.ts index 4ab8028487..876257a2c5 100644 --- a/server/utils/ShutdownHelper.ts +++ b/server/utils/ShutdownHelper.ts @@ -1,6 +1,6 @@ import groupBy from "lodash/groupBy"; import Logger from "@server/logging/Logger"; -import { sleep } from "./timers"; +import { sleep } from "@shared/utils/timers"; export enum ShutdownOrder { first = 0, diff --git a/server/utils/timers.ts b/shared/utils/timers.ts similarity index 100% rename from server/utils/timers.ts rename to shared/utils/timers.ts