aboutsummaryrefslogtreecommitdiffhomepage
path: root/internal/pipewire
diff options
context:
space:
mode:
authorOphestra <cat@gensokyo.uk>2025-12-02 21:17:22 +0900
committerOphestra <cat@gensokyo.uk>2025-12-02 21:17:46 +0900
commit32fb137bb2e6eed465e94fd791abfaaab40bf674 (patch)
treef2d43faaecb1fb9e56909844c3d7a4700cd02d7f /internal/pipewire
parente7a665e043a2b82cad2d61189935898d1d46f0ff (diff)
internal/pipewire: fail on unacknowledged proxies
These proxies (with special cases documented in the implementation) are only safe for use after acknowledgement from the server. Signed-off-by: Ophestra <cat@gensokyo.uk>
Diffstat (limited to 'internal/pipewire')
-rw-r--r--internal/pipewire/pipewire.go13
1 files changed, 13 insertions, 0 deletions
diff --git a/internal/pipewire/pipewire.go b/internal/pipewire/pipewire.go
index b537d394..f1a950c9 100644
--- a/internal/pipewire/pipewire.go
+++ b/internal/pipewire/pipewire.go
@@ -18,6 +18,7 @@ import (
"encoding/binary"
"fmt"
"io"
+ "maps"
"net"
"slices"
"strconv"
@@ -424,6 +425,14 @@ func (e DanglingFilesError) Error() string {
return "received " + strconv.Itoa(len(e)) + " dangling files"
}
+// An UnacknowledgedProxyError holds newly allocated proxy ids that the server failed
+// to acknowledge after an otherwise successful [Context.Roundtrip].
+type UnacknowledgedProxyError []Int
+
+func (e UnacknowledgedProxyError) Error() string {
+ return "server did not acknowledge " + strconv.Itoa(len(e)) + " proxies"
+}
+
// roundtripSyncID is the id passed to Context.coreSync during a [Context.Roundtrip].
const roundtripSyncID = 0
@@ -489,6 +498,10 @@ func (ctx *Context) Roundtrip() (err error) {
if len(ctx.receivedFiles) < receivedHeaderFiles {
return DanglingFilesError(ctx.receivedFiles[len(ctx.receivedFiles)-receivedHeaderFiles:])
}
+
+ if len(ctx.pendingIds) != 0 {
+ return UnacknowledgedProxyError(slices.Collect(maps.Keys(ctx.pendingIds)))
+ }
return
}