Перехватить вызов video.js xhr и изменить ответ xhr - PullRequest
0 голосов
/ 13 сентября 2018

У меня есть рабочий способ перехватить вызов xhr и изменить ответ video.js xhr.Но есть проблема.

Мой обходной путь для изменения ответа video.js xhr

  1. Я изменяю основной прототип xhr и добавляю свою асинхронную функциюдля прослушивателя событий « readystatechange »
  2. Моя пользовательская асинхронная функция запущена.Эта пользовательская функция выполняет многократные вызовы xhr для обещаний, присоединяет контент и заменяет ответ video.js xhr на мой пользовательский ответ.

    (function (proxied) {
            XMLHttpRequest = function () {
    
            //cannot use apply directly since we want a 'new' version
            var wrapped = new (Function.prototype.bind.apply(proxied, arguments));
    
            // Here we can subscribe to the xhr.send to save the xhr events to local variable, remove the events from xhr
    
            // ---------------- Add custom onreadystatechange event so we will be able to modify the response --------------
            wrapped.addEventListener("readystatechange", async function () {
    
                    console.log(this.readyState);
    
                    // When download completed
                    if (this.readyState === 4) {
    
                        console.log(this.onreadystatechange);
    
                        var customContent = await GetCustomContent();
    
                        // Update the value of the response object
                        Object.defineProperty(this, 'response', {
                            value: customContent,
                            writable: false
                        });
    
                        // Update the value of the response text
                        Object.defineProperty(this, 'responseText', {
                            value: customContent,
                            writable: false
                        });
    
                        // As we have successfully modify the response now we can add back the events to the xhr and trigger it here.
    
                    }
    
                    //this.responseText = "Customized response";
    
                }, false);
    
                // -----------------------------------------------------------------------------------------------------------
    
            return wrapped;
        };
    })(XMLHttpRequest);
    

Проблема, с которой я сталкиваюсь

Поскольку для вызова video.js xhr функция on включена для события " readystatechange ".Поскольку я также добавил свою собственную функцию, мои функции вызываются первыми.Но из-за того, что во время работы моей функции это характерно, функция события video.js xhr сработала, и поэтому изменение ответа не имеет никакого эффекта.

Так что я думаю, если это возможно, если мы перечислимxhr запрашивает события «readystatechange», сохраняет их в локальных переменных, а затем, когда возвращается мое обещание функции asy, мы добавляем обратно события, которые мы сохранили в локальной переменной, и затем запускаем их.

Таким образом, мы будемвозможность изменить ответ и затем вызвать события video.js.

Но я не знал, как сохранить события в переменной, удалить из xhr и снова добавить обратно в xhr (если это возможно).Подскажите, пожалуйста, как я могу это сделать?

Я имею в виду вышеупомянутый обходной путь, чтобы изменить ответ, если у вас есть какой-то лучший способ, пожалуйста, дайте мне знать.

Спасибо!

...