()
| 312 | } |
| 313 | |
| 314 | async #createSocket(): Promise<net.Socket | tls.TLSSocket> { |
| 315 | const socket = this.#socketFactory.create(); |
| 316 | |
| 317 | let onTimeout; |
| 318 | if (this.#connectTimeout !== undefined) { |
| 319 | onTimeout = () => socket.destroy(new ConnectionTimeoutError()); |
| 320 | socket.once('timeout', onTimeout); |
| 321 | socket.setTimeout(this.#connectTimeout); |
| 322 | } |
| 323 | |
| 324 | if (this.#isSocketUnrefed) { |
| 325 | socket.unref(); |
| 326 | } |
| 327 | |
| 328 | await once(socket, this.#socketFactory.event); |
| 329 | |
| 330 | if (onTimeout) { |
| 331 | socket.removeListener('timeout', onTimeout); |
| 332 | } |
| 333 | |
| 334 | if (this.#socketTimeout) { |
| 335 | socket.once('timeout', () => { |
| 336 | const error = this.#maintenanceTimeout |
| 337 | ? new SocketTimeoutDuringMaintenanceError(this.#maintenanceTimeout) |
| 338 | : new SocketTimeoutError(this.#socketTimeout!) |
| 339 | socket.destroy(error); |
| 340 | }); |
| 341 | socket.setTimeout(this.#socketTimeout); |
| 342 | } |
| 343 | |
| 344 | socket |
| 345 | .once('error', err => this.#onSocketError(err)) |
| 346 | .once('close', hadError => { |
| 347 | if (hadError || !this.#isOpen || this.#socket !== socket) return; |
| 348 | this.#onSocketError(new SocketClosedUnexpectedlyError()); |
| 349 | }) |
| 350 | .on('drain', () => this.emit('drain')) |
| 351 | .on('data', data => this.emit('data', data)); |
| 352 | |
| 353 | return socket; |
| 354 | } |
| 355 | |
| 356 | #onSocketError(err: Error): void { |
| 357 | const wasReady = this.#isReady; |
no test coverage detected