retry logic for when mpv doesnt start right away
This commit is contained in:
@@ -129,21 +129,27 @@ export class MediaPlayer {
|
|||||||
|
|
||||||
|
|
||||||
let socketReady!: (s: Socket) => void;
|
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;
|
socketReady = resolve;
|
||||||
|
socketFailed = reject;
|
||||||
});
|
});
|
||||||
|
|
||||||
this.playerProcess.on("spawn", () => {
|
this.playerProcess.on("spawn", () => {
|
||||||
console.log(`Player process spawned, opening socket @ ${socketPath}`);
|
console.log(`Player process spawned, opening socket @ ${socketPath}`);
|
||||||
setTimeout(() => {
|
this.connectToSocket(socketPath)
|
||||||
let socket = this.connectToSocket(socketPath);
|
.then(socket => socketReady(socket))
|
||||||
socketReady(socket);
|
.catch((error: unknown) => {
|
||||||
}, 500);
|
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.error("Player process error:", error);
|
||||||
console.log("Continuing without mpv player...");
|
console.log("Continuing without mpv player...");
|
||||||
|
socketFailed(error);
|
||||||
});
|
});
|
||||||
|
|
||||||
return socketPromise;
|
return socketPromise;
|
||||||
@@ -397,7 +403,7 @@ export class MediaPlayer {
|
|||||||
socket.write(commandObject + '\n');
|
socket.write(commandObject + '\n');
|
||||||
} catch (e: any) {
|
} catch (e: any) {
|
||||||
console.error(`Error writing to socket: ${e}. Trying to respawn.`)
|
console.error(`Error writing to socket: ${e}. Trying to respawn.`)
|
||||||
this.tryRespawnPlayerProcess();
|
this.socket = this.tryRespawnPlayerProcess();
|
||||||
}
|
}
|
||||||
|
|
||||||
// Add timeout to prevent hanging promises
|
// Add timeout to prevent hanging promises
|
||||||
@@ -436,12 +442,44 @@ export class MediaPlayer {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private connectToSocket(path: string): Socket {
|
private connectToSocket(path: string): Promise<Socket> {
|
||||||
let socket = new Socket();
|
const retryDelayMs = 100;
|
||||||
socket.connect(path);
|
const maxAttempts = 50;
|
||||||
socket.on("data", data => this.receiveData(data.toString()));
|
|
||||||
|
|
||||||
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) {
|
private handleEvent(event: string, data: any) {
|
||||||
|
|||||||
Reference in New Issue
Block a user