通过原型监听WebSocket连接

时间:2015-11-14 20:10:00

标签: javascript html5 google-chrome-extension websocket google-chrome-devtools

我在这个问题上花了几个星期,似乎无法找到解决方案。这是用例。我正在开发一个chrome扩展,这个扩展的主要目的之一是检测WebSocket何时打开或关闭。我查看了WebSockets的HTML5规范,它们公开了以下相关的方法/事件:

WebSocket.prototype.readyState = 0;
WebSocket.prototype.onopen = 0;
WebSocket.prototype.onerror = 0;
WebSocket.prototype.onclose = 0;
function WebSocket(url,protocols) {}
WebSocket.prototype.close = function(code,reason) {};

由于我无法访问扩展中的单个实例,因此我必须依赖这些原型来查找它们的调用时间。例如:

WebSocket.prototype.close = function (close) {
    console.log("Closing socket....");
    return function (code, reason) {
        return close.apply(this, arguments);
    };
}(WebSocket.prototype.close);

然而,我真正想做的是以某种方式包装或注册onopen,onerror或onclose的监听器。不幸的是我不知道该怎么做。我尝试了一堆不同的方法。上述方法适用于“关闭”,但它们不提供“开放式”,我依赖它。最有希望的想法是不可行的,如下:

WebSocket.prototype.constructor = function (constructor) {
    debugger;
    console.log("Register all my events here!");
    constructor.apply(this, arguments);
}(WebSocket.prototype.constructor);

不幸的是,我从未打过断点,或看到控制台日志,这让我相信我做错了什么。

作为最后的手段,我试图使用Object.Observe(),但无法观察原型:

Object.observe(WebSocket.prototype.readyState, function (changes) {
    console.log("Ready state");
});

Object.observe(WebSocket.prototype.onopen, function (changes) {
    console.log("On open");
});

所以,总而言之,我尝试了一些不同的方法,但最终我遇到了障碍。最后,我的目标是通过侦听任何公开的方法或事件来检测WebSocket何时打开或关闭。任何帮助将不胜感激。

更新 这是一个小提琴,包括以下建议:

http://jsfiddle.net/s35zpfq9/1/

谢谢!

1 个答案:

答案 0 :(得分:4)

你可以将WebSocket包装在窥探切换后创建的所有实例上:

(function(){

var ws = window.WebSocket;

window.WebSocket = function (a, b) {
   var that = b ? new ws(a, b) : new ws(a);
   that.addEventListener("open", console.info.bind(console, "socket open"));
   that.addEventListener("close", console.info.bind(console, "socket close"));
   that.addEventListener("message", console.info.bind(console, "socket msg"));
   return that;
};

window.WebSocket.prototype=ws.prototype; 

}());