From bfa203f28b44eb5f37d6a5333ec404f5276167c1 Mon Sep 17 00:00:00 2001 From: Audric Ackermann Date: Tue, 25 May 2021 13:44:06 +1000 Subject: [PATCH] retry posting message to opengroupv2 --- ts/opengroup/opengroupV2/OpenGroupAPIV2.ts | 30 +++++++++++++++++++++- 1 file changed, 29 insertions(+), 1 deletion(-) diff --git a/ts/opengroup/opengroupV2/OpenGroupAPIV2.ts b/ts/opengroup/opengroupV2/OpenGroupAPIV2.ts index 482c3c1db..c39c40cc2 100644 --- a/ts/opengroup/opengroupV2/OpenGroupAPIV2.ts +++ b/ts/opengroup/opengroupV2/OpenGroupAPIV2.ts @@ -18,6 +18,7 @@ import { OpenGroupMessageV2 } from './OpenGroupMessageV2'; import { isOpenGroupV2Request } from '../../fileserver/FileServerApiV2'; import { getAuthToken } from './ApiAuth'; +import pRetry from 'p-retry'; /** * This function returns a base url to this room @@ -195,7 +196,8 @@ export async function openGroupV2GetRoomInfo({ * If an error happens, this function throws it * */ -export const postMessage = async ( + +const postMessageRetryable = async ( message: OpenGroupMessageV2, room: OpenGroupRequestCommonType ) => { @@ -210,7 +212,9 @@ export const postMessage = async ( isAuthRequired: true, endpoint: 'messages', }; + const result = await sendApiV2Request(request); + const statusCode = parseStatusCodeFromOnionRequest(result); if (statusCode !== 200) { @@ -224,6 +228,30 @@ export const postMessage = async ( return OpenGroupMessageV2.fromJson(rawMessage); }; +export const postMessage = async ( + message: OpenGroupMessageV2, + room: OpenGroupRequestCommonType +) => { + const result = await pRetry( + async () => { + return postMessageRetryable(message, room); + }, + { + retries: 3, // each path can fail 3 times before being dropped, we have 3 paths at most + factor: 2, + minTimeout: 1000, + maxTimeout: 4000, + onFailedAttempt: e => { + window?.log?.warn( + `postMessageRetryable attempt #${e.attemptNumber} failed. ${e.retriesLeft} retries left...` + ); + }, + } + ); + return result; + // errors are saved on the message itself if this pRetry fails too many times +}; + export const banUser = async ( userToBan: PubKey, roomInfos: OpenGroupRequestCommonType