diff --git a/packages/collaborator-client/src/client.ts b/packages/collaborator-client/src/client.ts index bca4a8c0b1..c7ffa716a4 100644 --- a/packages/collaborator-client/src/client.ts +++ b/packages/collaborator-client/src/client.ts @@ -69,6 +69,10 @@ class CollaboratorClientImpl implements CollaboratorClient { body: JSON.stringify({ method, documentId, payload }) }) + if (!res.ok) { + throw new Error('HTTP error ' + res.status) + } + const result = await res.json() if (result.error != null) { @@ -79,12 +83,24 @@ class CollaboratorClientImpl implements CollaboratorClient { } async getContent (document: CollaborativeDoc): Promise> { - const res = (await this.rpc(document, 'getContent', {})) as GetContentResponse + const res = await retry( + 3, + async () => { + return (await this.rpc(document, 'getContent', {})) as GetContentResponse + }, + 50 + ) return res.content ?? {} } async updateContent (document: CollaborativeDoc, content: Record): Promise { - await this.rpc(document, 'updateContent', { content }) + await retry( + 3, + async () => { + await this.rpc(document, 'updateContent', { content }) + }, + 50 + ) } async copyContent (source: CollaborativeDoc, target: CollaborativeDoc): Promise { @@ -92,3 +108,19 @@ class CollaboratorClientImpl implements CollaboratorClient { await this.updateContent(target, content) } } + +async function retry (retries: number, op: () => Promise, delay: number = 100): Promise { + let error: any + while (retries > 0) { + retries-- + try { + return await op() + } catch (err: any) { + error = err + if (retries !== 0) { + await new Promise((resolve) => setTimeout(resolve, delay)) + } + } + } + throw error +}