avoid deep proxying message info
This commit is contained in:
@@ -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)))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
Reference in New Issue
Block a user