avoid deep proxying message info

This commit is contained in:
Shantur Rathore
2025-11-26 10:29:14 +00:00
parent f13feb3062
commit b54db28fb1
2 changed files with 17 additions and 7 deletions

View File

@@ -22,7 +22,7 @@ function createInitialState(instanceId: string): InstanceMessageState {
sessions: {}, sessions: {},
sessionOrder: [], sessionOrder: [],
messages: {}, messages: {},
messageInfo: {}, messageInfoVersion: {},
pendingParts: {}, pendingParts: {},
permissions: { permissions: {
queue: [], queue: [],
@@ -164,6 +164,7 @@ export interface InstanceMessageStore {
export function createInstanceMessageStore(instanceId: string): InstanceMessageStore { export function createInstanceMessageStore(instanceId: string): InstanceMessageStore {
const [state, setState] = createStore<InstanceMessageState>(createInitialState(instanceId)) const [state, setState] = createStore<InstanceMessageState>(createInitialState(instanceId))
const messageInfoCache = new Map<string, MessageInfo>()
function withUsageState(sessionId: string, updater: (draft: SessionUsageState) => void) { function withUsageState(sessionId: string, updater: (draft: SessionUsageState) => void) {
setState("usage", sessionId, (current) => { setState("usage", sessionId, (current) => {
@@ -370,10 +371,13 @@ export function createInstanceMessageStore(instanceId: string): InstanceMessageS
}) })
}) })
const infoEntry = state.messageInfo[options.oldId] const infoEntry = messageInfoCache.get(options.oldId)
if (infoEntry) { if (infoEntry) {
setState("messageInfo", options.newId, infoEntry) messageInfoCache.set(options.newId, infoEntry)
setState("messageInfo", (prev) => { messageInfoCache.delete(options.oldId)
const version = state.messageInfoVersion[options.oldId] ?? 0
setState("messageInfoVersion", options.newId, version)
setState("messageInfoVersion", (prev) => {
const next = { ...prev } const next = { ...prev }
delete next[options.oldId] delete next[options.oldId]
return next return next
@@ -405,12 +409,15 @@ export function createInstanceMessageStore(instanceId: string): InstanceMessageS
function setMessageInfo(messageId: string, info: MessageInfo) { function setMessageInfo(messageId: string, info: MessageInfo) {
if (!messageId) return if (!messageId) return
setState("messageInfo", messageId, info) messageInfoCache.set(messageId, info)
const nextVersion = (state.messageInfoVersion[messageId] ?? 0) + 1
setState("messageInfoVersion", messageId, nextVersion)
updateUsageWithInfo(info) updateUsageWithInfo(info)
} }
function getMessageInfo(messageId: string) { function getMessageInfo(messageId: string) {
return state.messageInfo[messageId] void state.messageInfoVersion[messageId]
return messageInfoCache.get(messageId)
} }
function upsertPermission(entry: PermissionEntry) { function upsertPermission(entry: PermissionEntry) {
@@ -492,6 +499,7 @@ export function createInstanceMessageStore(instanceId: string): InstanceMessageS
} }
function clearInstance() { function clearInstance() {
messageInfoCache.clear()
setState(reconcile(createInitialState(instanceId))) setState(reconcile(createInitialState(instanceId)))
} }

View File

@@ -93,8 +93,10 @@ export interface InstanceMessageState {
sessions: Record<string, SessionRecord> sessions: Record<string, SessionRecord>
sessionOrder: string[] sessionOrder: string[]
messages: Record<string, MessageRecord> messages: Record<string, MessageRecord>
messageInfo: Record<string, MessageInfo> messageInfoVersion: Record<string, number>
pendingParts: Record<string, PendingPartEntry[]> pendingParts: Record<string, PendingPartEntry[]>
permissions: InstancePermissionState permissions: InstancePermissionState
usage: Record<string, SessionUsageState> usage: Record<string, SessionUsageState>
scrollState: Record<string, ScrollSnapshot> scrollState: Record<string, ScrollSnapshot>