diff --git a/services/discord-gateway/src/goLive/BaseMediaConnection.ts b/services/discord-gateway/src/goLive/BaseMediaConnection.ts index b568d6a..0f3e9c3 100644 --- a/services/discord-gateway/src/goLive/BaseMediaConnection.ts +++ b/services/discord-gateway/src/goLive/BaseMediaConnection.ts @@ -262,6 +262,9 @@ a=ice-lite [audioSection, videoSection, videoRtpMap].join("\n"), "answer", ); + console.log( + `[goLive:${this.constructor.name}] SELECT_PROTOCOL_ACK processed — remote answer set (${[audioSection, videoSection].join("\n").length}B)`, + ); this.emit("select_protocol_ack"); } @@ -519,10 +522,14 @@ a=ice-lite const reconnect = () => { const webRtcConn = this._webRtcWrapper.initWebRtc(); webRtcConn.onStateChange((state) => { + console.log(`[goLive:${this.constructor.name}] pc state => ${state}`); if (state === "closed" && !this._closed) reconnect(); }); this._webRtcWrapper.onLocalDescription = (sdp) => { const rtc_connection_id = randomUUID(); + console.log( + `[goLive:${this.constructor.name}] sending SELECT_PROTOCOL (offer ${sdp.length}B, rtc_connection_id=${rtc_connection_id.slice(0, 8)})`, + ); this.sendOpcode(VoiceOpCodes.SELECT_PROTOCOL, { protocol: "webrtc", codecs: Object.values(CodecPayloadType), diff --git a/services/discord-gateway/src/goLive/Streamer.ts b/services/discord-gateway/src/goLive/Streamer.ts index e86d5c4..1725ae1 100644 --- a/services/discord-gateway/src/goLive/Streamer.ts +++ b/services/discord-gateway/src/goLive/Streamer.ts @@ -48,7 +48,19 @@ export class Streamer { this._client = client; // listen for gateway dispatch events this.client.on("raw", (packet) => { - this._gatewayEmitter.emit(packet.t, packet.d); + const t = packet.t as string; + if ( + t === "STREAM_CREATE" || + t === "STREAM_SERVER_UPDATE" || + t === "VOICE_STATE_UPDATE" || + t === "VOICE_SERVER_UPDATE" + ) { + console.log( + `[goLive:Streamer] raw dispatch ${t}`, + JSON.stringify(packet.d).slice(0, 220), + ); + } + this._gatewayEmitter.emit(t, packet.d); }); } @@ -142,6 +154,13 @@ export class Streamer { return; } this.signalStream(); + const streamTimeout = setTimeout(() => { + reject( + new Error( + "Timed out waiting for STREAM_CREATE/STREAM_SERVER_UPDATE from Discord (stream handshake) — voice media session may not be active", + ), + ); + }, 12_000); const { guildId: clientGuildId, channelId: clientChannelId, @@ -155,6 +174,7 @@ export class Streamer { clientUserId, clientChannelId, (conn) => { + clearTimeout(streamTimeout); resolve(conn); }, );