UNPKG

@vector-im/matrix-bot-sdk

Version:

TypeScript/JavaScript SDK for Matrix bots and appservices

46 lines (39 loc) 1.74 kB
import { extractRequestError, LogService } from ".."; export interface IJoinRoomStrategy { joinRoom(roomIdOrAlias: string, userId: string, apiCall: (targetRoomIdOrAlias: string) => Promise<string>): Promise<string>; } /** * A join strategy that keeps trying to join the room on a set interval. * @category Join strategies */ export class SimpleRetryJoinStrategy implements IJoinRoomStrategy { // Note: The schedule must not have duplicate values to avoid problems in positioning. private schedule = [ 0, // Right away 1000, // 1 second 30 * 1000, // 30 seconds 5 * 60 * 1000, // 5 minutes 15 * 60 * 1000, // 15 minutes ]; public joinRoom(roomIdOrAlias: string, userId: string, apiCall: (targetRoomIdOrAlias: string) => Promise<string>): Promise<string> { let currentSchedule = this.schedule[0]; const doJoin = () => waitPromise(currentSchedule).then(() => apiCall(roomIdOrAlias)); const errorHandler = err => { LogService.error("SimpleRetryJoinStrategy", extractRequestError(err)); const idx = this.schedule.indexOf(currentSchedule); if (idx === this.schedule.length - 1) { LogService.warn("SimpleRetryJoinStrategy", "Failed to join room " + roomIdOrAlias); return Promise.reject(err); } else { currentSchedule = this.schedule[idx + 1]; return doJoin().catch(errorHandler); } }; return doJoin().catch(errorHandler); } } function waitPromise(interval: number): Promise<any> { return new Promise((resolve, reject) => { setTimeout(resolve, interval); }); }