1
- import type { ClientRequest , IncomingMessage , Session } from "electron/main" ;
2
- import { app , net } from "electron/main" ;
1
+ import type { Session } from "electron/main" ;
2
+ import { app } from "electron/main" ;
3
3
import fs from "node:fs" ;
4
4
import path from "node:path" ;
5
- import stream from "node:stream" ;
6
- import util from "node:util" ;
5
+ import { Readable } from "node:stream" ;
6
+ import { pipeline } from "node:stream/promises" ;
7
+ import type { ReadableStream } from "node:stream/web" ;
7
8
8
9
import * as Sentry from "@sentry/electron" ;
9
- import getStream from "get-stream" ;
10
10
import { z } from "zod" ;
11
11
12
12
import Logger from "../common/logger-util.js" ;
13
13
import * as Messages from "../common/messages.js" ;
14
14
import type { ServerConf } from "../common/types.js" ;
15
15
16
- export async function fetchResponse (
17
- request : ClientRequest ,
18
- ) : Promise < IncomingMessage > {
19
- return new Promise ( ( resolve , reject ) => {
20
- request . on ( "response" , resolve ) ;
21
- request . on ( "abort" , ( ) => {
22
- reject ( new Error ( "Request aborted" ) ) ;
23
- } ) ;
24
- request . on ( "error" , reject ) ;
25
- request . end ( ) ;
26
- } ) ;
27
- }
28
-
29
- const pipeline = util . promisify ( stream . pipeline ) ;
30
-
31
16
/* Request: domain-util */
32
17
33
18
const logger = new Logger ( {
@@ -59,17 +44,12 @@ export const _getServerSettings = async (
59
44
domain : string ,
60
45
session : Session ,
61
46
) : Promise < ServerConf > => {
62
- const response = await fetchResponse (
63
- net . request ( {
64
- url : domain + "/api/v1/server_settings" ,
65
- session,
66
- } ) ,
67
- ) ;
68
- if ( response . statusCode !== 200 ) {
47
+ const response = await session . fetch ( domain + "/api/v1/server_settings" ) ;
48
+ if ( ! response . ok ) {
69
49
throw new Error ( Messages . invalidZulipServerError ( domain ) ) ;
70
50
}
71
51
72
- const data : unknown = JSON . parse ( await getStream ( response ) ) ;
52
+ const data : unknown = await response . json ( ) ;
73
53
/* eslint-disable @typescript-eslint/naming-convention */
74
54
const {
75
55
realm_name,
@@ -104,14 +84,17 @@ export const _saveServerIcon = async (
104
84
session : Session ,
105
85
) : Promise < string | null > => {
106
86
try {
107
- const response = await fetchResponse ( net . request ( { url, session } ) ) ;
108
- if ( response . statusCode !== 200 ) {
87
+ const response = await session . fetch ( url ) ;
88
+ if ( ! response . ok ) {
109
89
logger . log ( "Could not get server icon." ) ;
110
90
return null ;
111
91
}
112
92
113
93
const filePath = generateFilePath ( url ) ;
114
- await pipeline ( response , fs . createWriteStream ( filePath ) ) ;
94
+ await pipeline (
95
+ Readable . fromWeb ( response . body as ReadableStream < Uint8Array > ) ,
96
+ fs . createWriteStream ( filePath ) ,
97
+ ) ;
115
98
return filePath ;
116
99
} catch ( error : unknown ) {
117
100
logger . log ( "Could not get server icon." ) ;
@@ -128,16 +111,10 @@ export const _isOnline = async (
128
111
session : Session ,
129
112
) : Promise < boolean > => {
130
113
try {
131
- const response = await fetchResponse (
132
- net . request ( {
133
- method : "HEAD" ,
134
- url : `${ url } /api/v1/server_settings` ,
135
- session,
136
- } ) ,
137
- ) ;
138
- const isValidResponse =
139
- response . statusCode >= 200 && response . statusCode < 400 ;
140
- return isValidResponse ;
114
+ const response = await session . fetch ( `${ url } /api/v1/server_settings` , {
115
+ method : "HEAD" ,
116
+ } ) ;
117
+ return response . ok ;
141
118
} catch ( error : unknown ) {
142
119
logger . log ( error ) ;
143
120
return false ;
0 commit comments