(session: Electron.Session, url: string)
| 79 | } |
| 80 | |
| 81 | function getUrlInSession(session: Electron.Session, url: string): Promise<UrlInSessionResult> { |
| 82 | return new Promise((resolve, reject) => { |
| 83 | if (url.startsWith("data:")) { |
| 84 | try { |
| 85 | const parsed = parseDataUrl(url); |
| 86 | const buffer = Buffer.from(parsed.buffer); |
| 87 | const readable = Readable.from(buffer); |
| 88 | resolve({ stream: readable, mimeType: parsed.mimeType, fileName: "image" }); |
| 89 | } catch (err) { |
| 90 | return reject(err); |
| 91 | } |
| 92 | return; |
| 93 | } |
| 94 | const request = electron.net.request({ |
| 95 | url, |
| 96 | method: "GET", |
| 97 | session, |
| 98 | }); |
| 99 | const readable = new Readable({ |
| 100 | read() {}, |
| 101 | }); |
| 102 | request.on("response", (response) => { |
| 103 | const statusCode = response.statusCode; |
| 104 | if (statusCode < 200 || statusCode >= 300) { |
| 105 | readable.destroy(); |
| 106 | request.abort(); |
| 107 | reject(new Error(`HTTP request failed with status ${statusCode}: ${response.statusMessage || ""}`)); |
| 108 | return; |
| 109 | } |
| 110 | |
| 111 | const mimeType = cleanMimeType(getSingleHeaderVal(response.headers, "content-type")); |
| 112 | const fileName = getFileNameFromUrl(url) || "image"; |
| 113 | response.on("data", (chunk) => { |
| 114 | readable.push(chunk); |
| 115 | }); |
| 116 | response.on("end", () => { |
| 117 | readable.push(null); |
| 118 | resolve({ stream: readable, mimeType, fileName }); |
| 119 | }); |
| 120 | response.on("error", (err) => { |
| 121 | readable.destroy(err); |
| 122 | reject(err); |
| 123 | }); |
| 124 | }); |
| 125 | request.on("error", (err) => { |
| 126 | readable.destroy(err); |
| 127 | reject(err); |
| 128 | }); |
| 129 | request.end(); |
| 130 | }); |
| 131 | } |
| 132 | |
| 133 | function saveImageFileWithNativeDialog( |
| 134 | sender: electron.WebContents, |
no test coverage detected