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 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) {
|
||||
|
||||
Reference in New Issue
Block a user