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,