crossmate

A collaborative crossword app for iOS
Log | Files | Refs | LICENSE

commit c6e457af0c9f6a39bab6050cd8ad8ac5633e13ba
parent 5fd79e83b1d92a6fb76b8fcd0d6d0325b5a0d618
Author: Michael Camilleri <[email protected]>
Date:   Mon, 25 May 2026 23:07:19 +0900

Add additional instrumentation to WebRTC bridge

Diffstat:
MCrossmate/Services/EngagementHost.html | 37+++++++++++++++++++++++++++++++++++--
1 file changed, 35 insertions(+), 2 deletions(-)

diff --git a/Crossmate/Services/EngagementHost.html b/Crossmate/Services/EngagementHost.html @@ -21,6 +21,14 @@ }); } + function postDiagnostic(engagementID, message) { + post({ + type: "onDiagnostic", + engagementID, + message + }); + } + function defaultIceServers() { return [{ urls: "stun:stun.cloudflare.com:3478" }]; } @@ -43,6 +51,7 @@ peers.set(engagementID, peer); pc.ondatachannel = (event) => { + postDiagnostic(engagementID, "data channel received label=" + event.channel.label); attachChannel(engagementID, event.channel); }; pc.onconnectionstatechange = () => { @@ -70,7 +79,17 @@ } peer.channel = channel; channel.binaryType = "arraybuffer"; - channel.onopen = () => post({ type: "onChannelOpen", engagementID }); + postDiagnostic( + engagementID, + "data channel attached label=" + channel.label + " state=" + channel.readyState + ); + channel.onopen = () => { + postDiagnostic( + engagementID, + "data channel open label=" + channel.label + " buffered=" + channel.bufferedAmount + ); + post({ type: "onChannelOpen", engagementID }); + }; channel.onclose = () => postClose(engagementID, "dataChannel"); channel.onerror = (event) => postError(engagementID, event.error || "Data channel error"); channel.onmessage = async (event) => { @@ -83,6 +102,10 @@ } else { bytes = new TextEncoder().encode(String(event.data)); } + postDiagnostic( + engagementID, + "data channel receive bytes=" + bytes.byteLength + " state=" + channel.readyState + ); post({ type: "onChannelMessage", engagementID, @@ -218,9 +241,19 @@ function send(engagementID, base64Message) { const peer = peers.get(engagementID); if (!peer || !peer.channel || peer.channel.readyState !== "open") { + postDiagnostic( + engagementID, + "data channel send rejected state=" + (peer && peer.channel ? peer.channel.readyState : "missing") + ); throw new Error("Engagement channel is not open"); } - peer.channel.send(base64ToBytes(base64Message)); + const bytes = base64ToBytes(base64Message); + peer.channel.send(bytes); + postDiagnostic( + engagementID, + "data channel send accepted bytes=" + bytes.byteLength + + " buffered=" + peer.channel.bufferedAmount + ); return true; }