UNPKG

coldsky

Version:

Library and the app for BlueSky

60 lines (50 loc) 1.75 kB
// @ts-check import { firehose as rawFirehose } from 'bski'; /** @typedef {import('..').CompactPost} CompactPost */ /** @typedef {import('..').CompactProfile} CompactProfile */ /** * @param {ReturnType<typeof import('../define-cache-indexedDB-store').defineCacheIndexedDBStore>} dbStore * @returns {AsyncGenerator<import('..').CompactFirehoseBlock>} */ export async function* firehose(dbStore) { for await (const block of rawFirehose()) { /** @type {Map<string, CompactPost>} */ const updatedPosts = new Map(); /** @type {Map<string, CompactProfile>} */ const updatedProfiles = new Map(); /** @type {import('bski').FirehoseRecord[]} */ const all = []; /** @type {import('bski').FirehoseRecord[]} */ const records = []; /** @type {import('bski').FirehoseDeleteRecord[] | undefined} */ let deletes; /** @type {import('bski').FirehoseErrorRecord[] | undefined} */ let errors; for (const rec of block) { all.push(rec); if (rec.$type === 'error') { if (!errors) errors = []; errors.push(rec); } else if (rec.action === 'delete') { dbStore.deleteRecord(rec); if (!deletes) deletes = []; deletes.push(rec); } else if (rec.action === 'create' || rec.action === 'update') { records.push(rec); const updated = dbStore.captureRecord(rec, rec.receiveTimestamp); if (updated) { if ('uri' in updated) updatedPosts.set(updated.uri, updated); else updatedProfiles.set(updated.shortDID, updated); } } } yield { records, posts: [...updatedPosts.values()], profiles: [...updatedProfiles.values()], all, deletes, errors }; } }