javascript - JavaScript WebSocket 类
问题描述
我需要记录 WebSocket 流量,所以我要编写一个 Chrome 扩展程序,它会注入一些应该起到作用的 JavaScript 代码。
WebSocket = new Proxy(WebSocket, {
construct: (target, args) => {
console.log('new WebSocket instance');
return new target(...args);
}
})
我需要覆盖什么方法来记录发送和接收的消息?
如何修改发送/接收的此类消息?一个简单的工作代码将不胜感激。
解决方案
而不是代理,我将构造并返回一个普通的 WebSocket,并根据需要附加您自己的自定义方法:
const origWebSocket = window.WebSocket;
window.WebSocket = function(url) {
const socket = new origWebSocket(url);
socket.send = (msg) => {
console.log('intercepted send:', msg);
origWebSocket.prototype.send.call(socket, msg);
};
socket.addEventListener('message', (event) => {
console.log('intercepted receive:', event.data);
});
return socket;
};
// patching done
const socket = new WebSocket('wss://echo.websocket.org');
socket.onopen = () => {
socket.send('hi');
};
要同时修改传入消息,您可以修补onmessage
实例的addEventListener
属性(如果需要,还可以修补属性),以便在收到消息时,在用户的回调运行之前首先通过您的自定义函数:
const origWebSocket = window.WebSocket;
const origOnMessage = Object.getOwnPropertyDescriptor(WebSocket.prototype, 'onmessage').set;
window.WebSocket = function(url) {
const socket = new origWebSocket(url);
Object.defineProperty(socket, 'onmessage', {
set(cb) {
origOnMessage.call(socket, (e) => {
// Have to use defineProperty because `data` is a getter on the prototype
Object.defineProperty(e, 'data', { value: e.data + ' modified' });
cb(e);
});
}
});
socket.send = (msg) => {
console.log('intercepted send:', msg);
origWebSocket.prototype.send.call(socket, msg);
};
socket.addEventListener('message', (event) => {
console.log('intercepted receive:', event.data);
event.data = 'foobar';
});
return socket;
};
// patching done
const socket = new WebSocket('wss://echo.websocket.org');
socket.onopen = () => {
socket.send('hi');
};
socket.onmessage = e => console.log('consumer sees message:', e.data);
推荐阅读
- javascript - Firebase 函数无法读取未定义的属性“val”
- python - 使用 bs4 在一个元素中单独取出元素
- google-apps-script - 谷歌脚本将消息标记为已读不起作用
- ajax - VueJS - 迭代从 AJAX 调用返回的数据
- c# - 有没有办法使用 C# 使用特殊文件夹名称作为字符串访问特殊文件夹路径
- android - 使用领域和 kotlin 构建 android 应用程序时任务“:app:kaptGenerateStubsDebugKotlin”执行失败
- android - 如何获取由 NavHostFragment(导航架构组件)加载的片段(SupportMapFragment)的引用
- sql - 如何使用 Delphi 解决日期之间的 SQLite SUM()?
- angular - Angular 5:找不到 csv 文件
- xml - 当属性和文本内容匹配时,使用 xslt 2.0 从 xml 中的节点或节点中删除元素