(request, senderTabId, sendResponse)
| 85 | } |
| 86 | |
| 87 | function connectWebsocket(request, senderTabId, sendResponse) { |
| 88 | const wsId = Math.random().toString(36).substring(2, 15) + Math.random().toString(36).substring(2, 15); |
| 89 | let ws; |
| 90 | try { |
| 91 | const headers = request.request.headers?.reduce((acc, el) => { |
| 92 | acc[el.key] = el.value; |
| 93 | return acc; |
| 94 | }, {}) ?? {}; |
| 95 | ws = new WebSocket(request.request.data.uri, [], { |
| 96 | headers |
| 97 | }); |
| 98 | } catch (err) { |
| 99 | console.error("error connecting to websocket", err); |
| 100 | sendResponse({ status: "error", err: err.message }); |
| 101 | return; |
| 102 | } |
| 103 | |
| 104 | const connectionTimeout = setTimeout(() => { |
| 105 | if (ws.readyState !== WebSocket.OPEN) { |
| 106 | ws.close(); |
| 107 | websockets.delete(wsId); |
| 108 | console.error("websocket connection timeout", wsId); |
| 109 | sendResponse({ status: "error", err: "Connection timeout" }); |
| 110 | } |
| 111 | }, 3000); |
| 112 | |
| 113 | ws.onclose = () => { |
| 114 | if (websockets.has(wsId)) { |
| 115 | websockets.delete(wsId); |
| 116 | clearTimeout(connectionTimeout); |
| 117 | chrome.tabs.sendMessage(senderTabId, { |
| 118 | type: "ws-close", |
| 119 | result: { |
| 120 | status: "error", |
| 121 | err: "WebSocket closed unexpectedly", |
| 122 | wsId: wsId, |
| 123 | } |
| 124 | }); |
| 125 | } |
| 126 | }; |
| 127 | ws.onerror = (e) => { |
| 128 | ws.close(); |
| 129 | clearTimeout(connectionTimeout); |
| 130 | sendResponse({ status: "error", err: "WebSocket error", wsId, metaData: request.metaData }); |
| 131 | }; |
| 132 | ws.onopen = () => { |
| 133 | websockets.set(wsId, ws); |
| 134 | sendResponse({ status: "success", wsId, metaData: request.metaData }); |
| 135 | }; |
| 136 | ws.onmessage = (event) => { |
| 137 | let parsedData = event.data; |
| 138 | if (typeof event.data === 'object') { |
| 139 | parsedData = JSON.stringify(event.data); |
| 140 | } |
| 141 | chrome.tabs.sendMessage(senderTabId, { |
| 142 | type: "ws-read", |
| 143 | result: { |
| 144 | wsId: wsId, |
no test coverage detected