From 55fdbc7399c601a8867ae2517165a16083cef000 Mon Sep 17 00:00:00 2001 From: Eric Bailey Date: Thu, 9 May 2024 16:31:36 -0500 Subject: [PATCH] Add retries to all handlers (#3935) --- src/state/messages/convo/agent.ts | 122 ++++++++++++++++------------- src/state/messages/events/agent.ts | 41 +++++----- 2 files changed, 90 insertions(+), 73 deletions(-) diff --git a/src/state/messages/convo/agent.ts b/src/state/messages/convo/agent.ts index a8529349..25e138fb 100644 --- a/src/state/messages/convo/agent.ts +++ b/src/state/messages/convo/agent.ts @@ -7,6 +7,7 @@ import { } from '@atproto-labs/api' import {nanoid} from 'nanoid/non-secure' +import {networkRetry} from '#/lib/async/retry' import {logger} from '#/logger' import {isNative} from '#/platform/detection' import { @@ -459,16 +460,18 @@ export class Convo { recipients: AppBskyActorDefs.ProfileViewBasic[] }>(async (resolve, reject) => { try { - const response = await this.agent.api.chat.bsky.convo.getConvo( - { - convoId: this.convoId, - }, - { - headers: { - Authorization: this.__tempFromUserDid, + const response = await networkRetry(2, () => { + return this.agent.api.chat.bsky.convo.getConvo( + { + convoId: this.convoId, }, - }, - ) + { + headers: { + Authorization: this.__tempFromUserDid, + }, + }, + ) + }) const convo = response.data.convo @@ -544,18 +547,21 @@ export class Convo { // throw new Error('UNCOMMENT TO TEST RETRY') } - const response = await this.agent.api.chat.bsky.convo.getMessages( - { - cursor: this.oldestRev, - convoId: this.convoId, - limit: isNative ? 25 : 50, - }, - { - headers: { - Authorization: this.__tempFromUserDid, + const nextCursor = this.oldestRev // for TS + const response = await networkRetry(2, () => { + return this.agent.api.chat.bsky.convo.getMessages( + { + cursor: nextCursor, + convoId: this.convoId, + limit: isNative ? 40 : 60, }, - }, - ) + { + headers: { + Authorization: this.__tempFromUserDid, + }, + }, + ) + }) const {cursor, messages} = response.data this.oldestRev = cursor ?? null @@ -736,18 +742,20 @@ export class Convo { // throw new Error('UNCOMMENT TO TEST RETRY') const {id, message} = pendingMessage - const response = await this.agent.api.chat.bsky.convo.sendMessage( - { - convoId: this.convoId, - message, - }, - { - encoding: 'application/json', - headers: { - Authorization: this.__tempFromUserDid, + const response = await networkRetry(2, () => { + return this.agent.api.chat.bsky.convo.sendMessage( + { + convoId: this.convoId, + message, }, - }, - ) + { + encoding: 'application/json', + headers: { + Authorization: this.__tempFromUserDid, + }, + }, + ) + }) const res = response.data /* @@ -786,20 +794,22 @@ export class Convo { try { const messageArray = Array.from(this.pendingMessages.values()) - const {data} = await this.agent.api.chat.bsky.convo.sendMessageBatch( - { - items: messageArray.map(({message}) => ({ - convoId: this.convoId, - message, - })), - }, - { - encoding: 'application/json', - headers: { - Authorization: this.__tempFromUserDid, + const {data} = await networkRetry(2, () => { + return this.agent.api.chat.bsky.convo.sendMessageBatch( + { + items: messageArray.map(({message}) => ({ + convoId: this.convoId, + message, + })), }, - }, - ) + { + encoding: 'application/json', + headers: { + Authorization: this.__tempFromUserDid, + }, + }, + ) + }) const {items} = data /* @@ -838,18 +848,20 @@ export class Convo { this.commit() try { - await this.agent.api.chat.bsky.convo.deleteMessageForSelf( - { - convoId: this.convoId, - messageId, - }, - { - encoding: 'application/json', - headers: { - Authorization: this.__tempFromUserDid, + await networkRetry(2, () => { + return this.agent.api.chat.bsky.convo.deleteMessageForSelf( + { + convoId: this.convoId, + messageId, }, - }, - ) + { + encoding: 'application/json', + headers: { + Authorization: this.__tempFromUserDid, + }, + }, + ) + }) } catch (e) { this.deletedMessages.delete(messageId) this.commit() diff --git a/src/state/messages/events/agent.ts b/src/state/messages/events/agent.ts index eea61a61..061337d3 100644 --- a/src/state/messages/events/agent.ts +++ b/src/state/messages/events/agent.ts @@ -2,6 +2,7 @@ import {BskyAgent, ChatBskyConvoGetLog} from '@atproto-labs/api' import EventEmitter from 'eventemitter3' import {nanoid} from 'nanoid/non-secure' +import {networkRetry} from '#/lib/async/retry' import {logger} from '#/logger' import {DEFAULT_POLL_INTERVAL} from '#/state/messages/events/const' import { @@ -265,16 +266,18 @@ export class MessagesEventBus { logger.debug(`${LOGGER_CONTEXT}: init`, {}, logger.DebugContext.convo) try { - const response = await this.agent.api.chat.bsky.convo.listConvos( - { - limit: 1, - }, - { - headers: { - Authorization: this.__tempFromUserDid, + const response = await networkRetry(2, () => { + return this.agent.api.chat.bsky.convo.listConvos( + { + limit: 1, }, - }, - ) + { + headers: { + Authorization: this.__tempFromUserDid, + }, + }, + ) + }) // throw new Error('UNCOMMENT TO TEST INIT FAILURE') const {convos} = response.data @@ -358,16 +361,18 @@ export class MessagesEventBus { // ) try { - const response = await this.agent.api.chat.bsky.convo.getLog( - { - cursor: this.latestRev, - }, - { - headers: { - Authorization: this.__tempFromUserDid, + const response = await networkRetry(2, () => { + return this.agent.api.chat.bsky.convo.getLog( + { + cursor: this.latestRev, }, - }, - ) + { + headers: { + Authorization: this.__tempFromUserDid, + }, + }, + ) + }) // throw new Error('UNCOMMENT TO TEST POLL FAILURE')