diff --git a/CHANGELOG.md b/CHANGELOG.md index e133a32a9c..04ebcff386 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,7 +7,7 @@ - ### Server -- +- Fix: ID生成アルゴリズムにULIDを使用している場合に通知が約10秒遅延する問題を修正 ## 2026.5.0 diff --git a/packages/backend/src/core/NotificationService.ts b/packages/backend/src/core/NotificationService.ts index 310ffec7ce..670cecf01e 100644 --- a/packages/backend/src/core/NotificationService.ts +++ b/packages/backend/src/core/NotificationService.ts @@ -246,7 +246,8 @@ export class NotificationService implements OnApplicationShutdown { private toXListId(id: string): string { const { date, additional } = this.idService.parseFull(id); - return date.toString() + '-' + additional.toString(); + // Redis Stream sequenceはunit64制約があるため、収まらない場合は下位64bitを取る + return date.toString() + '-' + BigInt.asUintN(64, additional).toString(); } @bindThis diff --git a/packages/backend/test/unit/misc/ulid.ts b/packages/backend/test/unit/misc/ulid.ts index 4dbcc2b7e8..debca9bde9 100644 --- a/packages/backend/test/unit/misc/ulid.ts +++ b/packages/backend/test/unit/misc/ulid.ts @@ -38,4 +38,12 @@ describe('misc:ulid', () => { // id[16] = Z expect(() => parseUlidFull('01KPS7S300ABCDEFZ000000000')).not.toThrow(); }); + + test('parseUlidFull - additional exceeds uint64 max (all-Z randomness)', () => { + // All 16 random chars = 'Z' (Crockford max) → 80-bit value > uint64 max + const { additional } = parseUlidFull('01ARZ3NDEKZZZZZZZZZZZZZZZZ'); + const uint64Max = 2n ** 64n - 1n; + expect(additional > uint64Max).toBe(true); + expect(BigInt.asUintN(64, additional) <= uint64Max).toBe(true); + }); });