Когда ты ловишь "play" событие от сокета, ты вызываешь метод play() на своем плеере. Это побуждает плеер кинуть событие "play", которое ты тоже ловишь и отправляешь обратно на сервер. В итоге это зацикливается и бесконечно продолжается.
Но это можно пофиксить. Введи какой-нибудь флаг, который будет показывать, вызван ли метод play() (или другие) твоим кодом или же пользователем. Потом этот флаг ты будешь проверять перед тем, как отправить событие на сервер.
$(document).ready(function() {
var socketio = io();
let player = new Playerjs({
id: "player",
file: JSON.parse($("#player").attr("data-links"))
});
const playerFrame = $("#player"),
messagesBox = $(".chat-box .messages"),
messagesScroll = $(".chat-box"),
chatInputs = $(".chat-inputs");
let isApiCall = false; // флаг для отслеживания источника вызова
socketio.on("play", (data) => {
if (!player.api("playing")) {
isApiCall = true; // устанавливаем флаг, что это вызов через API
player.api("play");
isApiCall = false; // сбрасываем флаг
}
player.api("seek", data.time);
});
socketio.on("pause", (data) => {
if (player.api("playing")) {
isApiCall = true; // устанавливаем флаг, что это вызов через API
player.api("pause");
isApiCall = false; // сбрасываем флаг
}
});
socketio.on("seek", (data) => {
isApiCall = true; // устанавливаем флаг, что это вызов через API
player.api("seek", data.time);
isApiCall = false; // сбрасываем флаг
});
playerFrame.on("play", (event) => {
console.log(event.type)
if(!isApiCall){ // отправляем событие только если это не вызов через API
socketio.emit("play", { time: player.api("time") });
}
});
playerFrame.on("pause", (event) => {
console.log(event.type)
if(!isApiCall){ // отправляем событие только если это не вызов через API
socketio.emit("pause", {});
}
});
playerFrame.on("seek", (event) => {
console.log(event.type)
if(!isApiCall){ // отправляем событие только если это не вызов через API
socketio.emit("seek", { time: player.api("time") });
}
});
});