diff --git a/packages/bots/signal/src/index.test.ts b/packages/bots/signal/src/index.test.ts index 388c1887..4a479d93 100644 --- a/packages/bots/signal/src/index.test.ts +++ b/packages/bots/signal/src/index.test.ts @@ -1,6 +1,6 @@ import { describe, expect, it } from 'vitest'; import { contractTestBot } from '@profullstack/sh1pt-core/testing'; -import bot, { loadConfig } from './index.js'; +import bot, { loadConfig, toBotEvent } from './index.js'; contractTestBot(bot, { sampleConfig: {}, sampleChannel: '+15551234567' }); @@ -50,3 +50,17 @@ describe('loadConfig', () => { expect(config.maxConcurrentSessions).toBe(5); }); }); + +describe('toBotEvent', () => { + it('falls back when Signal provides an out-of-range timestamp', () => { + expect(toBotEvent({ + source: 'user-1', + sourceName: 'User', + text: 'hello', + timestamp: Number.POSITIVE_INFINITY, + groupId: undefined, + attachments: [], + raw: {}, + }).timestamp).toBe('1970-01-01T00:00:00.000Z'); + }); +}); diff --git a/packages/bots/signal/src/index.ts b/packages/bots/signal/src/index.ts index 5469b22b..a9bec189 100644 --- a/packages/bots/signal/src/index.ts +++ b/packages/bots/signal/src/index.ts @@ -118,7 +118,8 @@ function parsePositiveSafeIntegerEnv(value: string | undefined, fallback: number return Number.isSafeInteger(parsed) && parsed > 0 ? parsed : fallback; } -function toBotEvent(msg: IncomingMessage): BotEvent { +export function toBotEvent(msg: IncomingMessage): BotEvent { + const date = new Date(msg.timestamp); return { type: "message", channel: msg.groupId ?? msg.source, @@ -128,7 +129,7 @@ function toBotEvent(msg: IncomingMessage): BotEvent { }, text: msg.text, attachments: msg.attachments.map((a) => ({ url: a.url, filename: a.filename })), - timestamp: new Date(msg.timestamp).toISOString(), + timestamp: Number.isNaN(date.getTime()) ? new Date(0).toISOString() : date.toISOString(), }; }