import Base64 from '../core/base64.js'; // PhantomJS can't create Event objects directly, so we need to use this function make_event(name, props) { const evt = document.createEvent('Event'); evt.initEvent(name, true, true); if (props) { for (let prop in props) { evt[prop] = props[prop]; } } return evt; } export default class FakeWebSocket { constructor(uri, protocols) { this.url = uri; this.binaryType = "arraybuffer"; this.extensions = ""; if (!protocols || typeof protocols === 'string') { this.protocol = protocols; } else { this.protocol = protocols[0]; } this._send_queue = new Uint8Array(20000); this.readyState = FakeWebSocket.CONNECTING; this.bufferedAmount = 0; this.__is_fake = true; } close(code, reason) { this.readyState = FakeWebSocket.CLOSED; if (this.onclose) { this.onclose(make_event("close", { 'code': code, 'reason': reason, 'wasClean': true })); } } send(data) { if (this.protocol == 'base64') { data = Base64.decode(data); } else { data = new Uint8Array(data); } this._send_queue.set(data, this.bufferedAmount); this.bufferedAmount += data.length; } _get_sent_data() { const res = new Uint8Array(this._send_queue.buffer, 0, this.bufferedAmount); this.bufferedAmount = 0; return res; } _open() { this.readyState = FakeWebSocket.OPEN; if (this.onopen) { this.onopen(make_event('open')); } } _receive_data(data) { // Break apart the data to expose bugs where we assume data is // neatly packaged for (let i = 0;i < data.length;i++) { let buf = data.subarray(i, i+1); this.onmessage(make_event("message", { 'data': buf })); } } } FakeWebSocket.OPEN = WebSocket.OPEN; FakeWebSocket.CONNECTING = WebSocket.CONNECTING; FakeWebSocket.CLOSING = WebSocket.CLOSING; FakeWebSocket.CLOSED = WebSocket.CLOSED; FakeWebSocket.__is_fake = true; FakeWebSocket.replace = () => { if (!WebSocket.__is_fake) { const real_version = WebSocket; // eslint-disable-next-line no-global-assign WebSocket = FakeWebSocket; FakeWebSocket.__real_version = real_version; } }; FakeWebSocket.restore = () => { if (WebSocket.__is_fake) { // eslint-disable-next-line no-global-assign WebSocket = WebSocket.__real_version; } };