(
sessionID: string,
page: MessagePage,
load: MessageLoadState | undefined,
preserveUnfetched: boolean | ((message: Message) => boolean),
cleanupOrphans: boolean,
)
| 526 | } |
| 527 | |
| 528 | const applyMessagePage = ( |
| 529 | sessionID: string, |
| 530 | page: MessagePage, |
| 531 | load: MessageLoadState | undefined, |
| 532 | preserveUnfetched: boolean | ((message: Message) => boolean), |
| 533 | cleanupOrphans: boolean, |
| 534 | ) => { |
| 535 | const merged = mergeOptimisticPage(page, [...(optimistic.get(sessionID)?.values() ?? [])]) |
| 536 | merged.observed.forEach((item) => { |
| 537 | if (!load?.clearedMessageParts.has(item.messageID)) confirmOptimistic(sessionID, item.messageID, item.parts) |
| 538 | }) |
| 539 | const touchedMessages = new Set([...(load?.touchedMessages ?? []), ...(removedMessages.get(sessionID) ?? [])]) |
| 540 | const messages = reconcileFetched(merged.session, data.message[sessionID] ?? [], { |
| 541 | touched: touchedMessages, |
| 542 | retained: load?.retainedMessages, |
| 543 | preserveUnfetched, |
| 544 | }) |
| 545 | batch(() => { |
| 546 | const messageIDs = replaceMessages(sessionID, messages) |
| 547 | replaceParts(sessionID, merged.part, messageIDs, load) |
| 548 | const orphans = orphanParts.get(sessionID) |
| 549 | if (cleanupOrphans && page.complete && orphans) { |
| 550 | for (const messageID of orphans) { |
| 551 | if (!messageIDs.has(messageID)) setData(produce((draft) => deleteMessageParts(draft, messageID))) |
| 552 | } |
| 553 | orphanParts.delete(sessionID) |
| 554 | } |
| 555 | setMeta("limit", sessionID, messages.length) |
| 556 | setMeta("cursor", sessionID, merged.cursor) |
| 557 | setMeta("complete", sessionID, merged.complete) |
| 558 | setMeta("at", sessionID, Date.now()) |
| 559 | }) |
| 560 | } |
| 561 | |
| 562 | const loadMessages = async (sessionID: string, limit: number, before?: string, mode?: "replace" | "prepend") => { |
| 563 | if (meta.loading[sessionID]) return |
no test coverage detected