(sessionID: string, limit: number, before?: string, mode?: "replace" | "prepend")
| 560 | } |
| 561 | |
| 562 | const loadMessages = async (sessionID: string, limit: number, before?: string, mode?: "replace" | "prepend") => { |
| 563 | if (meta.loading[sessionID]) return |
| 564 | const active = generation(sessionID) |
| 565 | const load: MessageLoadState = { |
| 566 | touchedMessages: new Set(), |
| 567 | removedMessages: new Set(), |
| 568 | retainedMessages: new Set(), |
| 569 | touchedParts: new Map(), |
| 570 | deltaParts: new Map(), |
| 571 | carriedDeltaParts: new Map(), |
| 572 | removedParts: new Map(), |
| 573 | optimisticParts: new Map(), |
| 574 | orphanParents: new Set(), |
| 575 | clearedMessageParts: new Set(), |
| 576 | } |
| 577 | messageLoads.set(sessionID, load) |
| 578 | setMeta("loading", sessionID, true) |
| 579 | let applied = false |
| 580 | await fetchMessages(sessionID, limit, before, () => resetMessageLoad(sessionID, load)) |
| 581 | .then((page) => { |
| 582 | if (generations.get(sessionID) !== active) return |
| 583 | const first = page.session.reduce<Message | undefined>( |
| 584 | (oldest, message) => (!oldest || cmpMessage(message, oldest) < 0 ? message : oldest), |
| 585 | undefined, |
| 586 | ) |
| 587 | const preserveUnfetched = |
| 588 | mode === "prepend" || (!page.complete && (!first || ((message: Message) => cmpMessage(message, first) < 0))) |
| 589 | applyMessagePage( |
| 590 | sessionID, |
| 591 | page, |
| 592 | messageLoads.get(sessionID) === load ? load : undefined, |
| 593 | preserveUnfetched, |
| 594 | mode !== "prepend", |
| 595 | ) |
| 596 | applied = true |
| 597 | }) |
| 598 | .finally(() => { |
| 599 | if (!applied && generations.get(sessionID) === active && messageLoads.get(sessionID) === load) { |
| 600 | for (const messageID of load.orphanParents) { |
| 601 | if (!orphanParts.get(sessionID)?.has(messageID)) continue |
| 602 | setData(produce((draft) => deleteMessageParts(draft, messageID))) |
| 603 | orphanParts.get(sessionID)?.delete(messageID) |
| 604 | } |
| 605 | if (orphanParts.get(sessionID)?.size === 0) orphanParts.delete(sessionID) |
| 606 | } |
| 607 | if (messageLoads.get(sessionID) === load) messageLoads.delete(sessionID) |
| 608 | if (generations.get(sessionID) === active) setMeta("loading", sessionID, false) |
| 609 | }) |
| 610 | } |
| 611 | |
| 612 | const sync = (sessionID: string, options?: { force?: boolean; messageLimit?: number }) => { |
| 613 | touch(sessionID) |
no test coverage detected