@livestore/utils-dev 0.0.0-snapshot-4f04ed1600de42c0c638a17bf448da6f56d6ac41 → 0.0.0-snapshot-785d927ad644da4e856ea5d73244571f23ede77e
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"WranglerDevServer.d.ts","sourceRoot":"","sources":["../../src/wrangler/WranglerDevServer.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"WranglerDevServer.d.ts","sourceRoot":"","sources":["../../src/wrangler/WranglerDevServer.ts"],"names":[],"mappings":"AAKA,OAAO,EAAS,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,UAAU,EAAY,MAAM,EAAE,MAAM,yBAAyB,CAAA;;;;;;;;AAI3G;;GAEG;AACH,qBAAa,sBAAuB,SAAQ,2BAI1C;CAAG;AAEL;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAA;CAErB;AAED;;GAEG;AACH,MAAM,WAAW,0BAA0B;IACzC,kBAAkB,CAAC,EAAE,MAAM,CAAA;IAC3B,GAAG,EAAE,MAAM,CAAA;IACX,sFAAsF;IACtF,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,qBAAqB;IACrB,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,cAAc,CAAC,EAAE,QAAQ,CAAC,aAAa,CAAA;CACxC;;4BAYgB,0BAA0B;;;;;AAV3C;;;;;;;;GAQG;AACH,qBAAa,wBAAyB,SAAQ,6BAyF5C;CAAG"}
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import * as http from 'node:http';
|
|
2
|
+
import * as https from 'node:https';
|
|
1
3
|
import * as path from 'node:path';
|
|
2
4
|
import * as Toml from '@iarna/toml';
|
|
3
5
|
import { IS_CI } from '@livestore/utils';
|
|
@@ -76,15 +78,78 @@ export class WranglerDevServerService extends Effect.Service()('WranglerDevServe
|
|
|
76
78
|
* Verifies the server is actually accepting HTTP connections by making a test request
|
|
77
79
|
*/
|
|
78
80
|
const verifyHttpConnectivity = ({ url, showLogs, connectTimeout, }) => Effect.gen(function* () {
|
|
79
|
-
const
|
|
81
|
+
const parsedUrl = new URL(url);
|
|
82
|
+
const shouldBypassProxy = isLoopbackHostname(parsedUrl.hostname);
|
|
80
83
|
if (showLogs) {
|
|
81
|
-
|
|
84
|
+
const suffix = shouldBypassProxy ? ' (proxy bypass for loopback)' : '';
|
|
85
|
+
yield* Effect.logDebug(`Verifying HTTP connectivity to ${url}${suffix}`);
|
|
82
86
|
}
|
|
83
|
-
|
|
84
|
-
yield* client.get(url).pipe(Effect.retryOrElse(Schedule.exponential('50 millis', 2).pipe(Schedule.jittered, Schedule.intersect(Schedule.elapsed.pipe(Schedule.whileOutput(Duration.lessThanOrEqualTo(connectTimeout)))), Schedule.compose(Schedule.count)), (error, attemptCount) => Effect.fail(new WranglerDevServerError({
|
|
87
|
+
const withRetries = (effect) => effect.pipe(Effect.retryOrElse(Schedule.exponential('50 millis', 2).pipe(Schedule.jittered, Schedule.intersect(Schedule.elapsed.pipe(Schedule.whileOutput(Duration.lessThanOrEqualTo(connectTimeout)))), Schedule.compose(Schedule.count)), (error, attemptCount) => Effect.fail(new WranglerDevServerError({
|
|
85
88
|
cause: error,
|
|
86
89
|
message: `Failed to establish HTTP connection to Wrangler server at ${url} after ${attemptCount} attempts (timeout: ${Duration.toMillis(connectTimeout)}ms)`,
|
|
87
90
|
port: 0,
|
|
88
91
|
}))), Effect.tap(() => (showLogs ? Effect.logDebug(`HTTP connectivity verified for ${url}`) : Effect.void)), Effect.asVoid, Effect.withSpan('verifyHttpConnectivity'));
|
|
92
|
+
if (shouldBypassProxy) {
|
|
93
|
+
// When connecting to loopback, bypass HTTP(S)_PROXY entirely
|
|
94
|
+
yield* withRetries(loopbackConnectivityAttempt(parsedUrl, connectTimeout));
|
|
95
|
+
return;
|
|
96
|
+
}
|
|
97
|
+
const client = yield* HttpClient.HttpClient;
|
|
98
|
+
// Try to connect with retries using exponential backoff
|
|
99
|
+
yield* withRetries(client.get(url));
|
|
100
|
+
});
|
|
101
|
+
const loopbackConnectivityAttempt = (url, connectTimeout) => Effect.tryPromise({
|
|
102
|
+
try: () => {
|
|
103
|
+
const protocol = url.protocol;
|
|
104
|
+
const isHttps = protocol === 'https:';
|
|
105
|
+
const hostname = resolveLoopbackHostname(url.hostname);
|
|
106
|
+
const port = url.port === '' ? (isHttps ? 443 : 80) : Number(url.port);
|
|
107
|
+
const pathWithQuery = `${url.pathname}${url.search}` || '/';
|
|
108
|
+
const perAttemptTimeoutMillis = Math.min(Duration.toMillis(connectTimeout), 1_000);
|
|
109
|
+
return new Promise((resolve, reject) => {
|
|
110
|
+
const request = (isHttps ? https : http).request({
|
|
111
|
+
hostname,
|
|
112
|
+
port,
|
|
113
|
+
path: pathWithQuery,
|
|
114
|
+
method: 'GET',
|
|
115
|
+
timeout: perAttemptTimeoutMillis,
|
|
116
|
+
}, (response) => {
|
|
117
|
+
response.resume();
|
|
118
|
+
resolve();
|
|
119
|
+
});
|
|
120
|
+
request.on('error', reject);
|
|
121
|
+
request.on('timeout', () => {
|
|
122
|
+
request.destroy(new Error(`Request timed out after ${perAttemptTimeoutMillis}ms`));
|
|
123
|
+
});
|
|
124
|
+
request.end();
|
|
125
|
+
});
|
|
126
|
+
},
|
|
127
|
+
catch: (error) => error,
|
|
89
128
|
});
|
|
129
|
+
const isLoopbackHostname = (hostname) => {
|
|
130
|
+
const normalized = hostname.toLowerCase();
|
|
131
|
+
if (normalized === 'localhost') {
|
|
132
|
+
return true;
|
|
133
|
+
}
|
|
134
|
+
if (normalized === '0.0.0.0' || normalized === '::') {
|
|
135
|
+
return true;
|
|
136
|
+
}
|
|
137
|
+
if (normalized === '::1' || normalized === '0:0:0:0:0:0:0:1') {
|
|
138
|
+
return true;
|
|
139
|
+
}
|
|
140
|
+
if (normalized === '127.0.0.1' || normalized.startsWith('127.')) {
|
|
141
|
+
return true;
|
|
142
|
+
}
|
|
143
|
+
return false;
|
|
144
|
+
};
|
|
145
|
+
const resolveLoopbackHostname = (hostname) => {
|
|
146
|
+
const normalized = hostname.toLowerCase();
|
|
147
|
+
if (normalized === '0.0.0.0') {
|
|
148
|
+
return '127.0.0.1';
|
|
149
|
+
}
|
|
150
|
+
if (normalized === '::') {
|
|
151
|
+
return '::1';
|
|
152
|
+
}
|
|
153
|
+
return hostname;
|
|
154
|
+
};
|
|
90
155
|
//# sourceMappingURL=WranglerDevServer.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"WranglerDevServer.js","sourceRoot":"","sources":["../../src/wrangler/WranglerDevServer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,IAAI,MAAM,WAAW,CAAA;AACjC,OAAO,KAAK,IAAI,MAAM,aAAa,CAAA;AACnC,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAA;AACxC,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAA;AAC3G,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAA;AACnD,OAAO,KAAK,QAAQ,MAAM,UAAU,CAAA;AAEpC;;GAEG;AACH,MAAM,OAAO,sBAAuB,SAAQ,MAAM,CAAC,WAAW,EAA0B,CAAC,wBAAwB,EAAE;IACjH,KAAK,EAAE,MAAM,CAAC,OAAO;IACrB,OAAO,EAAE,MAAM,CAAC,MAAM;IACtB,IAAI,EAAE,MAAM,CAAC,MAAM;CACpB,CAAC;CAAG;AAyBL;;;;;;;;GAQG;AACH,MAAM,OAAO,wBAAyB,SAAQ,MAAM,CAAC,OAAO,EAA4B,CAAC,0BAA0B,EAAE;IACnH,MAAM,EAAE,CAAC,IAAgC,EAAE,EAAE,CAC3C,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;QAClB,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,IAAI,KAAK,CAAA;QAEvC,6EAA6E;QAC7E,MAAM,aAAa,GACjB,IAAI,CAAC,aAAa;YAClB,CAAC,KAAK,CAAC,CAAC,WAAW,CAAC,IAAI,CACtB,MAAM,CAAC,QAAQ,CACb,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,sBAAsB,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,yBAAyB,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,CAC/F,CACF,CAAC,CAAA;QAEJ,KAAK,CAAC,CAAC,MAAM,CAAC,mBAAmB,CAAC,EAAE,aAAa,EAAE,CAAC,CAAA;QAEpD,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,kBAAkB,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,eAAe,CAAC,CAAC,CAAA;QAEhG,MAAM,EAAE,GAAG,KAAK,CAAC,CAAC,UAAU,CAAC,UAAU,CAAA;QACvC,MAAM,aAAa,GAAG,KAAK,CAAC,CAAC,EAAE,CAAC,cAAc,CAAC,UAAU,CAAC,CAAA;QAC1D,MAAM,YAAY,GAAG,KAAK,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAC1E,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAC5E,MAAM,CAAC,QAAQ,CACb,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,sBAAsB,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,iCAAiC,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,CAC9G,CACF,CAAA;QACD,MAAM,gBAAgB,GAAG,KAAK,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,YAAY,CAAC,IAAI,CAAC,CAAC,CAAA;QAE3F,MAAM,SAAS,GAAG,KAAK,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,EAAE,CAC3C,QAAQ,CAAC,YAAY,CAAC,gBAAgB,EAAE;YACtC,MAAM,EAAE,UAAU;YAClB,IAAI,EAAE,aAAa;YACnB,aAAa,EAAE,IAAI,CAAC,aAAa,IAAI,CAAC;YACtC,SAAS,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,iBAAiB,CAAC;YACjD,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM;YACpC,YAAY,EAAE;gBACZ,0BAA0B,EAAE,IAAI;aACjC;SACF,CAAC,CACH,CAAA;QAED,KAAK,CAAC,CAAC,MAAM,CAAC,YAAY,CACxB,MAAM,CAAC,EAAE,CACP,QAAQ,CAAC,EAAE,IAAI;YACb,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS,IAAI,KAAK,CAAC,iBAAiB,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,KAAK,EAAE,CAAC;gBAC7E,KAAK,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,wCAAwC,EAAE,IAAI,CAAC,KAAK,CAAC,CAAA;YAC9E,CAAC;YAED,KAAK,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC,KAAK,IAAI,EAAE;gBAClC,MAAM,SAAS,CAAC,IAAI,EAAE,CAAA;gBACtB,qGAAqG;gBACrG,kCAAkC;YACpC,CAAC,CAAC,CAAA;QACJ,CAAC,EACD,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,EAC3B,MAAM,CAAC,KAAK,EACZ,MAAM,CAAC,iBAAiB,EACxB,MAAM,CAAC,QAAQ,CAAC,wCAAwC,CAAC,CAC1D,CACF,CAAA;QAED,MAAM,UAAU,GAAG,SAAS,CAAC,IAAI,CAAA;QACjC,MAAM,UAAU,GAAG,SAAS,CAAC,OAAO,CAAA;QACpC,MAAM,GAAG,GAAG,UAAU,UAAU,IAAI,UAAU,EAAE,CAAA;QAEhD,4EAA4E;QAC5E,MAAM,cAAc,GAAG,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;QAEvD,KAAK,CAAC,CAAC,sBAAsB,CAAC,EAAE,GAAG,EAAE,QAAQ,EAAE,cAAc,EAAE,IAAI,CAAC,cAAc,IAAI,cAAc,EAAE,CAAC,CAAA;QAEvG,IAAI,QAAQ,EAAE,CAAC;YACb,KAAK,CAAC,CAAC,MAAM,CAAC,QAAQ,CACpB,+DAA+D,UAAU,gBAAgB,aAAa,GAAG,CAC1G,CAAA;QACH,CAAC;QAED,OAAO;YACL,IAAI,EAAE,UAAU;YAChB,GAAG;SACwB,CAAA;IAC/B,CAAC,CAAC,CAAC,IAAI,CACL,MAAM,CAAC,QAAQ,CACb,CAAC,KAAK,EAAE,EAAE,CACR,IAAI,sBAAsB,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,qCAAqC,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,CACzG,EACD,MAAM,CAAC,QAAQ,CAAC,0BAA0B,EAAE;QAC1C,UAAU,EAAE,EAAE,aAAa,EAAE,IAAI,CAAC,aAAa,IAAI,MAAM,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE;KAC3E,CAAC,CACH;CACJ,CAAC;CAAG;AAEL;;GAEG;AACH,MAAM,sBAAsB,GAAG,CAAC,EAC9B,GAAG,EACH,QAAQ,EACR,cAAc,GAKf,EAAsE,EAAE,CACvE,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;IAClB,MAAM,MAAM,GAAG,
|
|
1
|
+
{"version":3,"file":"WranglerDevServer.js","sourceRoot":"","sources":["../../src/wrangler/WranglerDevServer.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@livestore/utils-dev",
|
|
3
|
-
"version": "0.0.0-snapshot-
|
|
3
|
+
"version": "0.0.0-snapshot-785d927ad644da4e856ea5d73244571f23ede77e",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"sideEffects": [
|
|
6
6
|
"./src/node-vitest/global.ts",
|
|
@@ -22,7 +22,7 @@
|
|
|
22
22
|
"@opentelemetry/sdk-trace-base": "2.0.1",
|
|
23
23
|
"@opentelemetry/sdk-trace-node": "2.0.1",
|
|
24
24
|
"wrangler": "4.32.0",
|
|
25
|
-
"@livestore/utils": "0.0.0-snapshot-
|
|
25
|
+
"@livestore/utils": "0.0.0-snapshot-785d927ad644da4e856ea5d73244571f23ede77e"
|
|
26
26
|
},
|
|
27
27
|
"devDependencies": {},
|
|
28
28
|
"files": [
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import * as http from 'node:http'
|
|
2
|
+
import * as https from 'node:https'
|
|
1
3
|
import * as path from 'node:path'
|
|
2
4
|
import * as Toml from '@iarna/toml'
|
|
3
5
|
import { IS_CI } from '@livestore/utils'
|
|
@@ -150,31 +152,119 @@ const verifyHttpConnectivity = ({
|
|
|
150
152
|
connectTimeout: Duration.DurationInput
|
|
151
153
|
}): Effect.Effect<void, WranglerDevServerError, HttpClient.HttpClient> =>
|
|
152
154
|
Effect.gen(function* () {
|
|
153
|
-
const
|
|
155
|
+
const parsedUrl = new URL(url)
|
|
156
|
+
const shouldBypassProxy = isLoopbackHostname(parsedUrl.hostname)
|
|
154
157
|
|
|
155
158
|
if (showLogs) {
|
|
156
|
-
|
|
159
|
+
const suffix = shouldBypassProxy ? ' (proxy bypass for loopback)' : ''
|
|
160
|
+
yield* Effect.logDebug(`Verifying HTTP connectivity to ${url}${suffix}`)
|
|
157
161
|
}
|
|
158
162
|
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
),
|
|
167
|
-
(error, attemptCount) =>
|
|
168
|
-
Effect.fail(
|
|
169
|
-
new WranglerDevServerError({
|
|
170
|
-
cause: error,
|
|
171
|
-
message: `Failed to establish HTTP connection to Wrangler server at ${url} after ${attemptCount} attempts (timeout: ${Duration.toMillis(connectTimeout)}ms)`,
|
|
172
|
-
port: 0,
|
|
173
|
-
}),
|
|
163
|
+
const withRetries = <A, R>(effect: Effect.Effect<A, unknown, R>) =>
|
|
164
|
+
effect.pipe(
|
|
165
|
+
Effect.retryOrElse(
|
|
166
|
+
Schedule.exponential('50 millis', 2).pipe(
|
|
167
|
+
Schedule.jittered,
|
|
168
|
+
Schedule.intersect(Schedule.elapsed.pipe(Schedule.whileOutput(Duration.lessThanOrEqualTo(connectTimeout)))),
|
|
169
|
+
Schedule.compose(Schedule.count),
|
|
174
170
|
),
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
171
|
+
(error, attemptCount) =>
|
|
172
|
+
Effect.fail(
|
|
173
|
+
new WranglerDevServerError({
|
|
174
|
+
cause: error,
|
|
175
|
+
message: `Failed to establish HTTP connection to Wrangler server at ${url} after ${attemptCount} attempts (timeout: ${Duration.toMillis(connectTimeout)}ms)`,
|
|
176
|
+
port: 0,
|
|
177
|
+
}),
|
|
178
|
+
),
|
|
179
|
+
),
|
|
180
|
+
Effect.tap(() => (showLogs ? Effect.logDebug(`HTTP connectivity verified for ${url}`) : Effect.void)),
|
|
181
|
+
Effect.asVoid,
|
|
182
|
+
Effect.withSpan('verifyHttpConnectivity'),
|
|
183
|
+
)
|
|
184
|
+
|
|
185
|
+
if (shouldBypassProxy) {
|
|
186
|
+
// When connecting to loopback, bypass HTTP(S)_PROXY entirely
|
|
187
|
+
yield* withRetries(loopbackConnectivityAttempt(parsedUrl, connectTimeout))
|
|
188
|
+
return
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
const client = yield* HttpClient.HttpClient
|
|
192
|
+
|
|
193
|
+
// Try to connect with retries using exponential backoff
|
|
194
|
+
yield* withRetries(client.get(url))
|
|
195
|
+
})
|
|
196
|
+
|
|
197
|
+
const loopbackConnectivityAttempt = (
|
|
198
|
+
url: URL,
|
|
199
|
+
connectTimeout: Duration.DurationInput,
|
|
200
|
+
): Effect.Effect<void, unknown> =>
|
|
201
|
+
Effect.tryPromise({
|
|
202
|
+
try: () => {
|
|
203
|
+
const protocol = url.protocol
|
|
204
|
+
const isHttps = protocol === 'https:'
|
|
205
|
+
const hostname = resolveLoopbackHostname(url.hostname)
|
|
206
|
+
const port = url.port === '' ? (isHttps ? 443 : 80) : Number(url.port)
|
|
207
|
+
const pathWithQuery = `${url.pathname}${url.search}` || '/'
|
|
208
|
+
const perAttemptTimeoutMillis = Math.min(Duration.toMillis(connectTimeout), 1_000)
|
|
209
|
+
|
|
210
|
+
return new Promise<void>((resolve, reject) => {
|
|
211
|
+
const request = (isHttps ? https : http).request(
|
|
212
|
+
{
|
|
213
|
+
hostname,
|
|
214
|
+
port,
|
|
215
|
+
path: pathWithQuery,
|
|
216
|
+
method: 'GET',
|
|
217
|
+
timeout: perAttemptTimeoutMillis,
|
|
218
|
+
},
|
|
219
|
+
(response) => {
|
|
220
|
+
response.resume()
|
|
221
|
+
resolve()
|
|
222
|
+
},
|
|
223
|
+
)
|
|
224
|
+
|
|
225
|
+
request.on('error', reject)
|
|
226
|
+
request.on('timeout', () => {
|
|
227
|
+
request.destroy(new Error(`Request timed out after ${perAttemptTimeoutMillis}ms`))
|
|
228
|
+
})
|
|
229
|
+
|
|
230
|
+
request.end()
|
|
231
|
+
})
|
|
232
|
+
},
|
|
233
|
+
catch: (error) => error as unknown,
|
|
180
234
|
})
|
|
235
|
+
|
|
236
|
+
const isLoopbackHostname = (hostname: string): boolean => {
|
|
237
|
+
const normalized = hostname.toLowerCase()
|
|
238
|
+
|
|
239
|
+
if (normalized === 'localhost') {
|
|
240
|
+
return true
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
if (normalized === '0.0.0.0' || normalized === '::') {
|
|
244
|
+
return true
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
if (normalized === '::1' || normalized === '0:0:0:0:0:0:0:1') {
|
|
248
|
+
return true
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
if (normalized === '127.0.0.1' || normalized.startsWith('127.')) {
|
|
252
|
+
return true
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
return false
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
const resolveLoopbackHostname = (hostname: string): string => {
|
|
259
|
+
const normalized = hostname.toLowerCase()
|
|
260
|
+
|
|
261
|
+
if (normalized === '0.0.0.0') {
|
|
262
|
+
return '127.0.0.1'
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
if (normalized === '::') {
|
|
266
|
+
return '::1'
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
return hostname
|
|
270
|
+
}
|