/// import assert from 'node:assert/strict'; import { readFileSync } from 'node:fs'; import { test } from 'node:test'; import { parseJetstreamMessage, subscribeUrl, WANTED_COLLECTIONS } from '../src/index/jetstream.ts'; /** * Frames captured read-only from wss://jetstream.us-east.bsky.network/xrpc/ * network.bsky.jetstream.subscribeEvents on 2026-11-06. `app-bsky-*`, `identity`, and `account` * are byte-for-byte as received. `like-create`, `like-delete`, and `project-create` keep a * captured envelope and change only `collection` and `record` to dev.nibling.* shapes, since * nobody writes dev.nibling.* yet. */ function fixture(name: string): { $type: string; payload: Record } { return JSON.parse(readFileSync(`${import.meta.dirname}/fixtures/jetstream/${name}.json`, 'utf8')); } const NOW = () => '2026-11-06T06:23:22.000Z'; test('subscribeUrl builds the v2 live-tail URL with repeated collections and kinds=commit', () => { const url = new URL(subscribeUrl('wss://jetstream.us-east.bsky.network')); assert.equal(url.pathname, '/xrpc/network.bsky.jetstream.subscribeEvents'); assert.deepStrictEqual(url.searchParams.getAll('collections'), [...WANTED_COLLECTIONS]); assert.equal(url.searchParams.get('kinds'), 'commit'); assert.equal(url.searchParams.has('cursor'), false); }); test('subscribeUrl threads the cursor through when given one', () => { const url = new URL(subscribeUrl('wss://jetstream.us-east.bsky.network', '1793946099886000')); assert.equal(url.searchParams.get('cursor'), '1793946099886000'); }); test('parses a captured like create into a put event', () => { assert.deepStrictEqual(parseJetstreamMessage(fixture('like-create'), NOW), { action: 'put', collection: 'dev.nibling.feed.like', uri: 'at://did:plc:6mjqiiyd6crl57wl3pfypqjr/dev.nibling.feed.like/3mzmqn3cvzz2c', cid: 'bafyreihjpamtabgxzbb3r3ghmdx23ruqwztqgprpqppkzsnzvnldrqa5fa', did: 'did:plc:6mjqiiyd6crl57wl3pfypqjr', record: { $type: 'dev.nibling.feed.like', createdAt: '2026-11-06T06:23:21.775Z', subject: { cid: 'bafyreic3jcnyd4qzzxn6mipk3do2be4efi7u43kcmr4ubrk7h2u5larpse', uri: 'at://did:plc:rfqxrozvm5in5cyw2vr3rnej/dev.nibling.project/3mzmpslzg722e', }, }, indexedAt: '2026-11-06T06:23:22.000Z', }); }); test('parses a captured project create into a put event', () => { const event = parseJetstreamMessage(fixture('project-create'), NOW); assert.ok(event && event.action === 'put' && event.collection === 'dev.nibling.project'); assert.equal(event.uri, 'at://did:plc:6mjqiiyd6crl57wl3pfypqjr/dev.nibling.project/3mzmqn3cvzz2c'); assert.equal(event.record.name, 'Captured envelope'); }); test('a captured delete carries no record and needs no validation', () => { assert.deepStrictEqual(parseJetstreamMessage(fixture('like-delete')), { action: 'delete', collection: 'dev.nibling.feed.like', uri: 'at://did:plc:zpmeobhmhfhz4clqwknac5gp/dev.nibling.feed.like/3mzmqmt2eb72k', }); }); test('drops a record that fails lexicon validation', () => { const frame = fixture('project-create'); frame.payload.record = { $type: 'dev.nibling.project', files: [], createdAt: '2026-11-06T06:23:21.775Z' }; assert.equal(parseJetstreamMessage(frame), undefined); }); test('drops captured app.bsky commits, a collection it does not care about', () => { assert.equal(parseJetstreamMessage(fixture('app-bsky-like-create')), undefined); assert.equal(parseJetstreamMessage(fixture('app-bsky-like-delete')), undefined); }); test('drops captured identity and account events', () => { assert.equal(parseJetstreamMessage(fixture('identity')), undefined); assert.equal(parseJetstreamMessage(fixture('account')), undefined); }); test('the URI and did come from the frame envelope, never the record body', () => { const frame = fixture('project-create'); frame.payload.record = { ...(frame.payload.record as object), did: 'did:plc:victim', uri: 'at://did:plc:victim/dev.nibling.project/3mzmqn3cvzz2c', }; const event = parseJetstreamMessage(frame); assert.ok(event && event.action === 'put'); assert.equal(event.uri, 'at://did:plc:6mjqiiyd6crl57wl3pfypqjr/dev.nibling.project/3mzmqn3cvzz2c'); assert.equal(event.did, 'did:plc:6mjqiiyd6crl57wl3pfypqjr'); });