From ee73fd650497f2e6997cbcc2d1fe3a4bb1caf593 Mon Sep 17 00:00:00 2001 From: Guido X Jansen Date: Thu, 26 Feb 2026 20:18:16 +0100 Subject: [PATCH] fix(ozone): handle Blob data from Node.js 24 native WebSocket (#93) Node.js 24's undici WebSocket delivers messages as Blob objects by default. The previous String(data) fallback produced "[object Blob]", causing JSON.parse to fail ~1/sec and silently dropping all label events. Fixes barazo-forum/barazo-workspace#51 --- src/services/ozone.ts | 3 ++- tests/unit/services/ozone.test.ts | 22 ++++++++++++++++++++++ 2 files changed, 24 insertions(+), 1 deletion(-) diff --git a/src/services/ozone.ts b/src/services/ozone.ts index 74d3cca..a6b77b9 100644 --- a/src/services/ozone.ts +++ b/src/services/ozone.ts @@ -104,7 +104,8 @@ export class OzoneService { private async handleMessage(data: unknown): Promise { try { - const text = typeof data === 'string' ? data : String(data) + const text = + data instanceof Blob ? await data.text() : typeof data === 'string' ? data : String(data) const event = JSON.parse(text) as LabelEvent if (!Array.isArray(event.labels)) return diff --git a/tests/unit/services/ozone.test.ts b/tests/unit/services/ozone.test.ts index d8f9d93..ef31d5d 100644 --- a/tests/unit/services/ozone.test.ts +++ b/tests/unit/services/ozone.test.ts @@ -735,6 +735,28 @@ describe('OzoneService', () => { ) }) + it('handleMessage handles Blob data from Node.js native WebSocket', async () => { + const labelEvent = { + seq: 1, + labels: [ + { + src: 'did:plc:labeler1', + uri: 'did:plc:user1', + val: 'spam', + neg: false, + cts: '2026-01-15T12:00:00.000Z', + }, + ], + } + const blob = new Blob([JSON.stringify(labelEvent)], { type: 'application/json' }) + + // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/no-unsafe-call, @typescript-eslint/no-unsafe-member-access + await (service as any).handleMessage(blob) + + expect(db.insert).toHaveBeenCalled() + expect(logger.warn).not.toHaveBeenCalled() + }) + it('handleMessage handles non-string data by converting to string', async () => { const event = { seq: 1, -- 2.51.2