From 2d38a9394a368b5a249d3b80e11996f5fec96aad Mon Sep 17 00:00:00 2001 From: Bassel Date: Fri, 19 May 2023 15:30:29 +0300 Subject: [PATCH] push retry sending messages if no response was recieved --- .../src/strapi/providers/utils.ts | 19 +++++++++++++++++++ .../src/strapi/remote/handlers/abstract.ts | 6 ++++++ .../src/strapi/remote/handlers/push.ts | 7 ++++++- .../src/strapi/remote/handlers/utils.ts | 9 +++++++++ 4 files changed, 40 insertions(+), 1 deletion(-) diff --git a/packages/core/data-transfer/src/strapi/providers/utils.ts b/packages/core/data-transfer/src/strapi/providers/utils.ts index 7fa744c2c8..7be7157c50 100644 --- a/packages/core/data-transfer/src/strapi/providers/utils.ts +++ b/packages/core/data-transfer/src/strapi/providers/utils.ts @@ -30,6 +30,8 @@ export const createDispatcher = (ws: WebSocket) => { return new Promise((resolve, reject) => { const uuid = randomUUID(); const payload = { ...message, uuid }; + let numberOfTimesMessageWasSent = 0; + let responseWasReceived = false; if (options.attachTransfer) { Object.assign(payload, { transferID: state.transfer?.id }); @@ -43,7 +45,23 @@ export const createDispatcher = (ws: WebSocket) => { } }); + const sendPeriodically = () => { + setTimeout(() => { + if (!responseWasReceived) { + if (numberOfTimesMessageWasSent < 5) { + numberOfTimesMessageWasSent += 1; + ws.send(stringifiedPayload); + sendPeriodically(); + } else { + reject(new ProviderError('error', 'Request timed out')); + } + } + }, 50000); + }; + const onResponse = (raw: RawData) => { + responseWasReceived = true; + numberOfTimesMessageWasSent = 0; const response: server.Message = JSON.parse(raw.toString()); if (response.uuid === uuid) { if (response.error) { @@ -57,6 +75,7 @@ export const createDispatcher = (ws: WebSocket) => { }; ws.once('message', onResponse); + sendPeriodically(); }); }; diff --git a/packages/core/data-transfer/src/strapi/remote/handlers/abstract.ts b/packages/core/data-transfer/src/strapi/remote/handlers/abstract.ts index 14a8e910ed..b85ce85f4e 100644 --- a/packages/core/data-transfer/src/strapi/remote/handlers/abstract.ts +++ b/packages/core/data-transfer/src/strapi/remote/handlers/abstract.ts @@ -19,6 +19,12 @@ export interface Handler { get startedAt(): TransferState['startedAt']; set startedAt(id: TransferState['startedAt']); + // Add message UUIDs + addUUID(uuid: string): void; + + // Check if a message UUID exists + hasUUID(uuid: string): boolean; + /** * Returns whether a transfer is currently in progress or not */ diff --git a/packages/core/data-transfer/src/strapi/remote/handlers/push.ts b/packages/core/data-transfer/src/strapi/remote/handlers/push.ts index 2f54b0ef01..efc1df9dfd 100644 --- a/packages/core/data-transfer/src/strapi/remote/handlers/push.ts +++ b/packages/core/data-transfer/src/strapi/remote/handlers/push.ts @@ -205,8 +205,13 @@ export const createPushController = handlerControllerFactory { handleWSUpgrade(wss, ctx, (ws) => { const state: TransferState = { id: undefined }; + const messageuuids = new Set(); const prototype: Handler = { // Transfer ID @@ -99,6 +100,14 @@ export const handlerControllerFactory = state.startedAt = timestamp; }, + addUUID(uuid) { + messageuuids.add(uuid); + }, + + hasUUID(uuid) { + return messageuuids.has(uuid); + }, + isTransferStarted() { return this.transferID !== undefined && this.startedAt !== undefined; },