@@ -121,6 +121,16 @@ function createSync() {
121121 }
122122}
123123
124+ // Apply local admissions and promotions that arrived while the server snapshot was loading.
125+ function reconcilePendingInputs ( baseline : string [ ] , current : string [ ] , server : string [ ] ) {
126+ const result = new Set ( server )
127+ const before = new Set ( baseline )
128+ const now = new Set ( current )
129+ baseline . filter ( ( id ) => ! now . has ( id ) ) . forEach ( ( id ) => result . delete ( id ) )
130+ current . filter ( ( id ) => ! before . has ( id ) ) . forEach ( ( id ) => result . add ( id ) )
131+ return [ ...result ]
132+ }
133+
124134export const { use : useData , provider : DataProvider } = createSimpleContext ( {
125135 name : "Data" ,
126136 init : ( ) => {
@@ -985,26 +995,30 @@ export const { use: useData, provider: DataProvider } = createSimpleContext({
985995 } ,
986996 sync ( sessionID : string ) {
987997 return sync . run ( `session.message:${ sessionID } ` , async ( ) => {
988- const inputsBeforeSync = new Set ( store . session . input [ sessionID ] ?? [ ] )
998+ const localInputs = store . session . input [ sessionID ] ?? [ ]
989999 const [ projected , pending ] = await Promise . all ( [
9901000 client . api . message . list ( { sessionID, limit : 200 , order : "desc" } ) ,
9911001 client . api . session . pending . list ( { sessionID } ) ,
9921002 ] )
993- const messages = projected . data . toReversed ( )
994- const projectedIDs = new Set ( messages . map ( ( message ) => message . id ) )
995- const pendingMessages = pending . filter ( ( item ) => ! projectedIDs . has ( item . id ) ) . map ( message . fromPending )
996- const next = [ ...messages , ...pendingMessages ]
997- messageIndex . set ( sessionID , new Map ( next . map ( ( message , index ) => [ message . id , index ] ) ) )
998- const inputsAfterSync = new Set ( store . session . input [ sessionID ] ?? [ ] )
1003+ const pendingMessages = pending . map ( message . fromPending )
1004+ const next = projected . data . toReversed ( )
1005+ const index = new Map ( next . map ( ( message , index ) => [ message . id , index ] ) )
1006+ const localInputIDs = new Set ( localInputs )
1007+ store . session . message [ sessionID ]
1008+ ?. filter ( ( message ) => localInputIDs . has ( message . id ) )
1009+ . forEach ( ( item ) => message . append ( next , index , item ) )
1010+ pendingMessages . forEach ( ( item ) => message . append ( next , index , item ) )
1011+ messageIndex . set ( sessionID , index )
9991012 setStore (
10001013 "session" ,
10011014 "input" ,
10021015 sessionID ,
1003- pendingMessages . flatMap ( ( message ) =>
1004- ( message . type === "user" || message . type === "synthetic" ) &&
1005- ( ! inputsBeforeSync . has ( message . id ) || inputsAfterSync . has ( message . id ) )
1006- ? [ message . id ]
1007- : [ ] ,
1016+ reconcilePendingInputs (
1017+ localInputs ,
1018+ store . session . input [ sessionID ] ?? [ ] ,
1019+ pendingMessages . flatMap ( ( message ) =>
1020+ message . type === "user" || message . type === "synthetic" ? [ message . id ] : [ ] ,
1021+ ) ,
10081022 ) ,
10091023 )
10101024 setStore ( "session" , "message" , sessionID , reconcile ( next ) )
0 commit comments