///
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');
});