]>
Commit | Line | Data |
---|---|---|
8727f598 JD |
1 | import Base64 from '../core/base64.js'; |
2 | ||
dfae3209 SR |
3 | // PhantomJS can't create Event objects directly, so we need to use this |
4 | function make_event(name, props) { | |
2b5f94fa | 5 | const evt = document.createEvent('Event'); |
dfae3209 SR |
6 | evt.initEvent(name, true, true); |
7 | if (props) { | |
2b5f94fa | 8 | for (let prop in props) { |
dfae3209 | 9 | evt[prop] = props[prop]; |
2cccf753 | 10 | } |
2cccf753 | 11 | } |
dfae3209 SR |
12 | return evt; |
13 | } | |
2cccf753 | 14 | |
0e4808bf JD |
15 | export default class FakeWebSocket { |
16 | constructor(uri, protocols) { | |
17 | this.url = uri; | |
18 | this.binaryType = "arraybuffer"; | |
19 | this.extensions = ""; | |
2cccf753 | 20 | |
0e4808bf JD |
21 | if (!protocols || typeof protocols === 'string') { |
22 | this.protocol = protocols; | |
23 | } else { | |
24 | this.protocol = protocols[0]; | |
25 | } | |
2cccf753 | 26 | |
0e4808bf | 27 | this._send_queue = new Uint8Array(20000); |
2cccf753 | 28 | |
0e4808bf JD |
29 | this.readyState = FakeWebSocket.CONNECTING; |
30 | this.bufferedAmount = 0; | |
2cccf753 | 31 | |
0e4808bf JD |
32 | this.__is_fake = true; |
33 | } | |
2cccf753 | 34 | |
0e4808bf | 35 | close(code, reason) { |
dfae3209 SR |
36 | this.readyState = FakeWebSocket.CLOSED; |
37 | if (this.onclose) { | |
38 | this.onclose(make_event("close", { 'code': code, 'reason': reason, 'wasClean': true })); | |
39 | } | |
0e4808bf | 40 | } |
2cccf753 | 41 | |
0e4808bf | 42 | send(data) { |
dfae3209 SR |
43 | if (this.protocol == 'base64') { |
44 | data = Base64.decode(data); | |
45 | } else { | |
46 | data = new Uint8Array(data); | |
47 | } | |
48 | this._send_queue.set(data, this.bufferedAmount); | |
49 | this.bufferedAmount += data.length; | |
0e4808bf | 50 | } |
2cccf753 | 51 | |
0e4808bf | 52 | _get_sent_data() { |
2b5f94fa | 53 | const res = new Uint8Array(this._send_queue.buffer, 0, this.bufferedAmount); |
dfae3209 SR |
54 | this.bufferedAmount = 0; |
55 | return res; | |
0e4808bf | 56 | } |
2cccf753 | 57 | |
0e4808bf | 58 | _open() { |
dfae3209 SR |
59 | this.readyState = FakeWebSocket.OPEN; |
60 | if (this.onopen) { | |
61 | this.onopen(make_event('open')); | |
2cccf753 | 62 | } |
0e4808bf | 63 | } |
2cccf753 | 64 | |
0e4808bf | 65 | _receive_data(data) { |
dfae3209 SR |
66 | this.onmessage(make_event("message", { 'data': data })); |
67 | } | |
0e4808bf | 68 | } |
2cccf753 | 69 | |
dfae3209 SR |
70 | FakeWebSocket.OPEN = WebSocket.OPEN; |
71 | FakeWebSocket.CONNECTING = WebSocket.CONNECTING; | |
72 | FakeWebSocket.CLOSING = WebSocket.CLOSING; | |
73 | FakeWebSocket.CLOSED = WebSocket.CLOSED; | |
2cccf753 | 74 | |
dfae3209 | 75 | FakeWebSocket.__is_fake = true; |
2cccf753 | 76 | |
651c23ec | 77 | FakeWebSocket.replace = () => { |
dfae3209 | 78 | if (!WebSocket.__is_fake) { |
2b5f94fa | 79 | const real_version = WebSocket; |
8727f598 | 80 | // eslint-disable-next-line no-global-assign |
dfae3209 SR |
81 | WebSocket = FakeWebSocket; |
82 | FakeWebSocket.__real_version = real_version; | |
83 | } | |
84 | }; | |
85 | ||
651c23ec | 86 | FakeWebSocket.restore = () => { |
dfae3209 | 87 | if (WebSocket.__is_fake) { |
8727f598 | 88 | // eslint-disable-next-line no-global-assign |
dfae3209 SR |
89 | WebSocket = WebSocket.__real_version; |
90 | } | |
91 | }; |