retry logic for when mpv doesnt start right away

This commit is contained in:
2026-02-18 17:57:42 -08:00
parent 9b0f6e2123
commit 5b3787f19f

View File

@@ -129,21 +129,27 @@ export class MediaPlayer {
let socketReady!: (s: Socket) => void;
let socketPromise = new Promise<Socket>(resolve => {
let socketFailed!: (reason?: unknown) => void;
let socketPromise = new Promise<Socket>((resolve, reject) => {
socketReady = resolve;
socketFailed = reject;
});
this.playerProcess.on("spawn", () => {
console.log(`Player process spawned, opening socket @ ${socketPath}`);
setTimeout(() => {
let socket = this.connectToSocket(socketPath);
socketReady(socket);
}, 500);
this.connectToSocket(socketPath)
.then(socket => socketReady(socket))
.catch((error: unknown) => {
console.error(`Failed to connect to mpv socket @ ${socketPath}:`, error);
console.log("Continuing without mpv player...");
socketFailed(error);
});
});
this.playerProcess.on("error", (error) => {
this.playerProcess.on("error", (error: unknown) => {
console.error("Player process error:", error);
console.log("Continuing without mpv player...");
socketFailed(error);
});
return socketPromise;
@@ -397,7 +403,7 @@ export class MediaPlayer {
socket.write(commandObject + '\n');
} catch (e: any) {
console.error(`Error writing to socket: ${e}. Trying to respawn.`)
this.tryRespawnPlayerProcess();
this.socket = this.tryRespawnPlayerProcess();
}
// Add timeout to prevent hanging promises
@@ -436,12 +442,44 @@ export class MediaPlayer {
}
}
private connectToSocket(path: string): Socket {
let socket = new Socket();
socket.connect(path);
socket.on("data", data => this.receiveData(data.toString()));
private connectToSocket(path: string): Promise<Socket> {
const retryDelayMs = 100;
const maxAttempts = 50;
return socket;
return new Promise((resolve, reject) => {
type SocketError = Error & { code?: string };
const attemptConnection = (attempt: number) => {
const socket = new Socket();
const onError = (error: SocketError) => {
socket.removeAllListeners();
socket.destroy();
const shouldRetry = (error.code === "ENOENT" || error.code === "ECONNREFUSED") && attempt < maxAttempts;
if (shouldRetry) {
setTimeout(() => attemptConnection(attempt + 1), retryDelayMs);
return;
}
reject(error);
};
socket.once("connect", () => {
socket.removeListener("error", onError);
socket.on("data", (data: unknown) => this.receiveData(String(data)));
socket.on("error", (error: unknown) => {
console.error("MPV socket error:", error);
});
resolve(socket);
});
socket.once("error", onError);
socket.connect(path);
};
attemptConnection(1);
});
}
private handleEvent(event: string, data: any) {