* Connect to the server * * @param {object} callbacks Callbacks * * @returns {object} A pair of ReadWriter which can be used to read and * send data to the underlaying websocket connection *
(callbacks)
| 128 | * |
| 129 | */ |
| 130 | async dial(callbacks) { |
| 131 | let ws = await this.connect(this.timeout), |
| 132 | rd = new reader.Reader(new reader.Multiple(() => {}), data => { |
| 133 | return new Promise(resolve => { |
| 134 | let bufferReader = new FileReader(); |
| 135 | |
| 136 | bufferReader.onload = event => { |
| 137 | let d = new Uint8Array(event.target.result); |
| 138 | |
| 139 | resolve(d); |
| 140 | |
| 141 | callbacks.inboundUnpacked(d); |
| 142 | }; |
| 143 | |
| 144 | bufferReader.readAsArrayBuffer(data); |
| 145 | }); |
| 146 | }), |
| 147 | sdDataConvert = rawData => { |
| 148 | return rawData; |
| 149 | }, |
| 150 | sd = new sender.Sender( |
| 151 | async rawData => { |
| 152 | let data = await sdDataConvert(rawData); |
| 153 | |
| 154 | ws.send(data.buffer); |
| 155 | callbacks.outbound(data); |
| 156 | }, |
| 157 | 15, |
| 158 | 4096 - 64 // Server has a 4096 bytes receive buffer, can be no greater |
| 159 | ); |
| 160 | |
| 161 | ws.addEventListener("message", event => { |
| 162 | callbacks.inbound(event.data); |
| 163 | |
| 164 | rd.feed(event.data); |
| 165 | }); |
| 166 | |
| 167 | ws.addEventListener("error", event => { |
| 168 | rd.close(); |
| 169 | }); |
| 170 | |
| 171 | ws.addEventListener("close", event => { |
| 172 | rd.close(); |
| 173 | }); |
| 174 | |
| 175 | let senderNonce = crypt.generateNonce(); |
| 176 | sd.send(senderNonce); |
| 177 | |
| 178 | let receiverNonce = await reader.readN(rd, crypt.GCMNonceSize); |
| 179 | |
| 180 | let key = await this.buildKey(); |
| 181 | |
| 182 | sdDataConvert = async rawData => { |
| 183 | let encoded = await crypt.encryptGCM(key, senderNonce, rawData); |
| 184 | |
| 185 | crypt.increaseNonce(senderNonce); |
| 186 | |
| 187 | let dataToSend = new Uint8Array(encoded.byteLength + 2); |
no test coverage detected