(
client: any,
route: SlackRoute,
text: string,
maxRetries = 3,
)
| 553 | } |
| 554 | |
| 555 | private async sendWithRetry( |
| 556 | client: any, |
| 557 | route: SlackRoute, |
| 558 | text: string, |
| 559 | maxRetries = 3, |
| 560 | ): Promise<SlackPostedMessage> { |
| 561 | for (let attempt = 0; attempt <= maxRetries; attempt++) { |
| 562 | try { |
| 563 | const response = await client.chat.postMessage({ |
| 564 | channel: route.channel, |
| 565 | text: formatSlackMessage(text), |
| 566 | mrkdwn: true, |
| 567 | thread_ts: route.threadTs, |
| 568 | reply_broadcast: false, |
| 569 | }); |
| 570 | if (typeof response.ts !== "string") { |
| 571 | throw new Error("Slack postMessage response missing ts"); |
| 572 | } |
| 573 | return { ts: response.ts }; |
| 574 | } catch (err: any) { |
| 575 | const retryAfter = this.getRetryAfterSeconds(err); |
| 576 | if (retryAfter && attempt < maxRetries) { |
| 577 | console.log( |
| 578 | `[Slack] Rate limited, retrying after ${retryAfter}s...`, |
| 579 | ); |
| 580 | await new Promise((resolve) => |
| 581 | setTimeout(resolve, retryAfter * 1000), |
| 582 | ); |
| 583 | continue; |
| 584 | } |
| 585 | throw err; |
| 586 | } |
| 587 | } |
| 588 | |
| 589 | throw new Error("Slack postMessage failed after retries"); |
| 590 | } |
| 591 | |
| 592 | private async updateMessageSafe( |
| 593 | client: any, |
no test coverage detected