fix: send file-done before closing file DC to avoid control channel race
Closing the file DataChannel can trigger SCTP/ICE cleanup before the file-done control message is flushed, causing a 15 s timeout on the receiver. Send file-done first on both the Go and TS sender paths. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -758,11 +758,12 @@ func (s *Session) SendFile(path string) error {
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
// §9: send file-done before closing the file DC so the control channel
|
||||||
|
// is still reachable when the message is delivered.
|
||||||
|
s.controlSend(map[string]string{"type": "file-done", "xid": xid, "sha256": sha256hex})
|
||||||
if err := dc.Close(); err != nil {
|
if err := dc.Close(); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
// §9: send file-done with the pre-computed hash so the receiver can verify.
|
|
||||||
s.controlSend(map[string]string{"type": "file-done", "xid": xid, "sha256": sha256hex})
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -510,9 +510,10 @@ export class PeerConn {
|
|||||||
this.events.fileSendProgress?.({ peer: this.peerId, xid, name: file.name, sent: resumeOffset + localOffset, total: file.size })
|
this.events.fileSendProgress?.({ peer: this.peerId, xid, name: file.name, sent: resumeOffset + localOffset, total: file.size })
|
||||||
await new Promise(r => setTimeout(r, 0))
|
await new Promise(r => setTimeout(r, 0))
|
||||||
}
|
}
|
||||||
dc.close()
|
// §9: send file-done before closing the file DC so the control channel
|
||||||
// §9: send file-done with sha256 so receiver can verify integrity.
|
// is still healthy when the message is dispatched.
|
||||||
this._dc({ type: 'file-done', xid, sha256: hash })
|
this._dc({ type: 'file-done', xid, sha256: hash })
|
||||||
|
dc.close()
|
||||||
this.events.fileSent?.({ peer: this.peerId, xid, name: file.name })
|
this.events.fileSent?.({ peer: this.peerId, xid, name: file.name })
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user