| 22 | } |
| 23 | |
| 24 | class JsPackagerClient { |
| 25 | constructor(url) { |
| 26 | this.ws = new WebSocket(url); |
| 27 | this.msgCallbacks = new Map(); |
| 28 | |
| 29 | this.openPromise = new Promise((resolve, reject) => { |
| 30 | this.ws.on('error', error => reject(error)); |
| 31 | this.ws.on('open', resolve); |
| 32 | }); |
| 33 | |
| 34 | this.ws.on('message', (data, flags) => { |
| 35 | const message = parseMessage(data, flags.binary); |
| 36 | const msgCallback = this.msgCallbacks.get(message.id); |
| 37 | if (message === undefined || message.id === undefined) { |
| 38 | // gracefully ignore wrong messages or broadcasts |
| 39 | } else if (msgCallback === undefined) { |
| 40 | console.warn(`Response with non-existing message id: '${message.id}'`); |
| 41 | } else { |
| 42 | if (message.error === undefined) { |
| 43 | msgCallback.resolve(message.result); |
| 44 | } else { |
| 45 | msgCallback.reject(message.error); |
| 46 | } |
| 47 | } |
| 48 | }); |
| 49 | } |
| 50 | |
| 51 | sendRequest(method, target, params) { |
| 52 | return this.openPromise.then(() => new Promise((resolve, reject) => { |
| 53 | const messageId = getMessageId(); |
| 54 | this.msgCallbacks.set(messageId, {resolve: resolve, reject: reject}); |
| 55 | this.ws.send( |
| 56 | JSON.stringify({ |
| 57 | version: PROTOCOL_VERSION, |
| 58 | target: target, |
| 59 | method: method, |
| 60 | id: messageId, |
| 61 | params: params, |
| 62 | }), |
| 63 | error => { |
| 64 | if (error !== undefined) { |
| 65 | this.msgCallbacks.delete(messageId); |
| 66 | reject(error); |
| 67 | } |
| 68 | }); |
| 69 | })); |
| 70 | } |
| 71 | |
| 72 | sendNotification(method, target, params) { |
| 73 | return this.openPromise.then(() => new Promise((resolve, reject) => { |
| 74 | this.ws.send( |
| 75 | JSON.stringify({ |
| 76 | version: PROTOCOL_VERSION, |
| 77 | target: target, |
| 78 | method: method, |
| 79 | params: params, |
| 80 | }), |
| 81 | error => { |
nothing calls this directly
no outgoing calls
no test coverage detected
searching dependent graphs…