From 6229ac365effd0f97686b3ec1cfb8140788b2355 Mon Sep 17 00:00:00 2001 From: mq1 <74494945+chan-mai@users.noreply.github.com> Date: Sat, 2 May 2026 20:23:10 +0900 Subject: [PATCH] =?UTF-8?q?fix(backend):=20ULID=E4=BD=BF=E7=94=A8=E6=99=82?= =?UTF-8?q?=E3=81=ABnotificationTimeline=E3=81=B8=E3=81=AEXADD=E3=81=8C?= =?UTF-8?q?=E5=A4=B1=E6=95=97=E3=81=97=E7=B6=9A=E3=81=91=E3=80=81=E9=80=9A?= =?UTF-8?q?=E7=9F=A5=E3=81=8C=E7=B4=8410=E7=A7=92=E9=81=85=E5=BB=B6?= =?UTF-8?q?=E3=81=99=E3=82=8B=E5=95=8F=E9=A1=8C=E3=82=92=E4=BF=AE=E6=AD=A3?= =?UTF-8?q?=20(#17358)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CHANGELOG.md | 2 +- packages/backend/src/core/NotificationService.ts | 3 ++- packages/backend/test/unit/misc/ulid.ts | 8 ++++++++ 3 files changed, 11 insertions(+), 2 deletions(-) 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); + }); });