* Probes a transport. * * @param {String} name - transport name * @private
(name: string)
| 1004 | * @private |
| 1005 | */ |
| 1006 | private _probe(name: string) { |
| 1007 | debug('probing transport "%s"', name); |
| 1008 | let transport = this.createTransport(name); |
| 1009 | let failed = false; |
| 1010 | |
| 1011 | SocketWithoutUpgrade.priorWebsocketSuccess = false; |
| 1012 | |
| 1013 | const onTransportOpen = () => { |
| 1014 | if (failed) return; |
| 1015 | |
| 1016 | debug('probe transport "%s" opened', name); |
| 1017 | transport.send([{ type: "ping", data: "probe" }]); |
| 1018 | transport.once("packet", (msg) => { |
| 1019 | if (failed) return; |
| 1020 | if ("pong" === msg.type && "probe" === msg.data) { |
| 1021 | debug('probe transport "%s" pong', name); |
| 1022 | this.upgrading = true; |
| 1023 | this.emitReserved("upgrading", transport); |
| 1024 | if (!transport) return; |
| 1025 | SocketWithoutUpgrade.priorWebsocketSuccess = |
| 1026 | "websocket" === transport.name; |
| 1027 | |
| 1028 | debug('pausing current transport "%s"', this.transport.name); |
| 1029 | this.transport.pause(() => { |
| 1030 | if (failed) return; |
| 1031 | if ("closed" === this.readyState) return; |
| 1032 | debug("changing transport and sending upgrade packet"); |
| 1033 | |
| 1034 | cleanup(); |
| 1035 | |
| 1036 | this.setTransport(transport); |
| 1037 | transport.send([{ type: "upgrade" }]); |
| 1038 | this.emitReserved("upgrade", transport); |
| 1039 | transport = null; |
| 1040 | this.upgrading = false; |
| 1041 | this.flush(); |
| 1042 | }); |
| 1043 | } else { |
| 1044 | debug('probe transport "%s" failed', name); |
| 1045 | const err = new Error("probe error"); |
| 1046 | // @ts-ignore |
| 1047 | err.transport = transport.name; |
| 1048 | this.emitReserved("upgradeError", err); |
| 1049 | } |
| 1050 | }); |
| 1051 | }; |
| 1052 | |
| 1053 | function freezeTransport() { |
| 1054 | if (failed) return; |
| 1055 | |
| 1056 | // Any callback called by transport should be ignored since now |
| 1057 | failed = true; |
| 1058 | |
| 1059 | cleanup(); |
| 1060 | |
| 1061 | transport.close(); |
| 1062 | transport = null; |
| 1063 | } |
no test coverage detected