import {type SanityDocument} from '@sanity/types' import {decodeText, type JSONParser, parse} from '../../it-utils/index.js' import {safeJsonParser} from '../../sources/fromExportEndpoint.js' import {type MigrationContext} from '../../types.js' import {streamToAsyncIterator} from '../../utils/streamToAsyncIterator.js' export function createFilteredDocumentsClient( getFilteredDocumentsReadableStream: () => globalThis.ReadableStream, ): MigrationContext['filtered'] { function getAllDocumentsFromBuffer() { return parse(decodeText(streamToAsyncIterator(getFilteredDocumentsReadableStream())), { parse: safeJsonParser as JSONParser, }) } async function getDocumentsFromBuffer(ids: string[]): Promise { const found: {[id: string]: T} = {} let remaining = ids.length for await (const doc of getAllDocumentsFromBuffer()) { if (ids.includes(doc._id)) { remaining-- found[doc._id] = doc } if (remaining === 0) break } return ids.map((id) => found[id]).filter((item): item is T => item !== undefined) } async function getDocumentFromBuffer( id: string, ): Promise { return (await getDocumentsFromBuffer([id]))[0] } return { getDocument: getDocumentFromBuffer, getDocuments: getDocumentsFromBuffer, } }