Explorar o código

fix(app): ignore stale part deltas

adamelmore hai 1 mes
pai
achega
68cf011fd3
Modificáronse 1 ficheiros con 13 adicións e 0 borrados
  1. 13 0
      packages/app/src/context/global-sdk.tsx

+ 13 - 0
packages/app/src/context/global-sdk.tsx

@@ -49,9 +49,12 @@ export const { use: useGlobalSDK, provider: GlobalSDKProvider } = createSimpleCo
     let queue: Queued[] = []
     let buffer: Queued[] = []
     const coalesced = new Map<string, number>()
+    const staleDeltas = new Set<string>()
     let timer: ReturnType<typeof setTimeout> | undefined
     let last = 0
 
+    const deltaKey = (directory: string, messageID: string, partID: string) => `${directory}:${messageID}:${partID}`
+
     const key = (directory: string, payload: Event) => {
       if (payload.type === "session.status") return `session.status:${directory}:${payload.properties.sessionID}`
       if (payload.type === "lsp.updated") return `lsp.updated:${directory}`
@@ -68,14 +71,20 @@ export const { use: useGlobalSDK, provider: GlobalSDKProvider } = createSimpleCo
       if (queue.length === 0) return
 
       const events = queue
+      const skip = staleDeltas.size > 0 ? new Set(staleDeltas) : undefined
       queue = buffer
       buffer = events
       queue.length = 0
       coalesced.clear()
+      staleDeltas.clear()
 
       last = Date.now()
       batch(() => {
         for (const event of events) {
+          if (skip && event.payload.type === "message.part.delta") {
+            const props = event.payload.properties
+            if (skip.has(deltaKey(event.directory, props.messageID, props.partID))) continue
+          }
           emitter.emit(event.directory, event.payload)
         }
       })
@@ -144,6 +153,10 @@ export const { use: useGlobalSDK, provider: GlobalSDKProvider } = createSimpleCo
               const i = coalesced.get(k)
               if (i !== undefined) {
                 queue[i] = { directory, payload }
+                if (payload.type === "message.part.updated") {
+                  const part = payload.properties.part
+                  staleDeltas.add(deltaKey(directory, part.messageID, part.id))
+                }
                 continue
               }
               coalesced.set(k, queue.length)