diff --git a/packages/bots/slack/src/index.test.ts b/packages/bots/slack/src/index.test.ts index 8b17a427..e0dcec80 100644 --- a/packages/bots/slack/src/index.test.ts +++ b/packages/bots/slack/src/index.test.ts @@ -1,7 +1,7 @@ import { contractTestBot } from '@profullstack/sh1pt-core/testing'; import { request, type Server } from 'node:http'; import { describe, expect, it } from 'vitest'; -import bot, { slackSignature, type FetchLike } from './index.js'; +import bot, { slackSignature, slackTimestamp, type FetchLike } from './index.js'; import type { BotCtx, BotEvent, BotHandler } from '@profullstack/sh1pt-core'; contractTestBot(bot, { sampleConfig: {}, sampleChannel: 'C0123456789' }); @@ -75,6 +75,10 @@ function serverPort(server: Server): number { } describe('Slack bot adapter', () => { + it('falls back for out-of-range event timestamps', () => { + expect(slackTimestamp('1e20')).toBe('1970-01-01T00:00:00.000Z'); + }); + it('posts proactive messages with Slack Web API JSON and bearer auth', async () => { const { calls, fetcher } = captureFetch([{ ok: true, ts: '1700000000.123456' }]); diff --git a/packages/bots/slack/src/index.ts b/packages/bots/slack/src/index.ts index babed8e3..ace323e7 100644 --- a/packages/bots/slack/src/index.ts +++ b/packages/bots/slack/src/index.ts @@ -451,10 +451,12 @@ function firstHeader(value: string | string[] | undefined): string | undefined { return Array.isArray(value) ? value[0] : value; } -function slackTimestamp(value: string | undefined): string { +export function slackTimestamp(value: string | undefined): string { if (!value) return new Date().toISOString(); const timestamp = Number(value); - return Number.isFinite(timestamp) ? new Date(timestamp * 1000).toISOString() : new Date().toISOString(); + if (!Number.isFinite(timestamp)) return new Date().toISOString(); + const date = new Date(timestamp * 1000); + return Number.isNaN(date.getTime()) ? new Date(0).toISOString() : date.toISOString(); } async function readBody(req: IncomingMessage): Promise {