@livestore/utils-dev 0.0.0-snapshot-43a9bb31189777ec76f8fed08224565878d182cc → 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":"AAGA,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
+ {"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 client = yield* HttpClient.HttpClient;
81
+ const parsedUrl = new URL(url);
82
+ const shouldBypassProxy = isLoopbackHostname(parsedUrl.hostname);
80
83
  if (showLogs) {
81
- yield* Effect.logDebug(`Verifying HTTP connectivity to ${url}`);
84
+ const suffix = shouldBypassProxy ? ' (proxy bypass for loopback)' : '';
85
+ yield* Effect.logDebug(`Verifying HTTP connectivity to ${url}${suffix}`);
82
86
  }
83
- // Try to connect with retries using exponential backoff
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":"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"}
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-43a9bb31189777ec76f8fed08224565878d182cc",
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-43a9bb31189777ec76f8fed08224565878d182cc"
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 client = yield* HttpClient.HttpClient
155
+ const parsedUrl = new URL(url)
156
+ const shouldBypassProxy = isLoopbackHostname(parsedUrl.hostname)
154
157
 
155
158
  if (showLogs) {
156
- yield* Effect.logDebug(`Verifying HTTP connectivity to ${url}`)
159
+ const suffix = shouldBypassProxy ? ' (proxy bypass for loopback)' : ''
160
+ yield* Effect.logDebug(`Verifying HTTP connectivity to ${url}${suffix}`)
157
161
  }
158
162
 
159
- // Try to connect with retries using exponential backoff
160
- yield* client.get(url).pipe(
161
- Effect.retryOrElse(
162
- Schedule.exponential('50 millis', 2).pipe(
163
- Schedule.jittered,
164
- Schedule.intersect(Schedule.elapsed.pipe(Schedule.whileOutput(Duration.lessThanOrEqualTo(connectTimeout)))),
165
- Schedule.compose(Schedule.count),
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
- Effect.tap(() => (showLogs ? Effect.logDebug(`HTTP connectivity verified for ${url}`) : Effect.void)),
177
- Effect.asVoid,
178
- Effect.withSpan('verifyHttpConnectivity'),
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
+ }