@@ -3,6 +3,7 @@ import { randomUUID } from "node:crypto";
3
3
import events from "node:events" ;
4
4
import path from "node:path" ;
5
5
import { LogLevel , Miniflare , Mutex , Response } from "miniflare" ;
6
+ import dedent from "ts-dedent" ;
6
7
import inspectorProxyWorkerPath from "worker:startDevWorker/InspectorProxyWorker" ;
7
8
import proxyWorkerPath from "worker:startDevWorker/ProxyWorker" ;
8
9
import WebSocket from "ws" ;
@@ -103,7 +104,7 @@ export class ProxyController extends Controller<ProxyControllerEventMap> {
103
104
// However, the proxy worker only makes outgoing requests to the user Worker Miniflare instance, which _should_ receive CF-Connecting-IP
104
105
stripCfConnectingIp : false ,
105
106
serviceBindings : {
106
- PROXY_CONTROLLER : async ( req ) : Promise < Response > => {
107
+ PROXY_CONTROLLER : async ( req : Request ) : Promise < Response > => {
107
108
const message =
108
109
( await req . json ( ) ) as ProxyWorkerOutgoingRequestBody ;
109
110
@@ -142,43 +143,76 @@ export class ProxyController extends Controller<ProxyControllerEventMap> {
142
143
} ;
143
144
144
145
if ( this . latestConfig . dev . inspector !== false && ! inVscodeJsDebugTerminal ) {
145
- proxyWorkerOptions . workers . push ( {
146
- name : "InspectorProxyWorker" ,
147
- compatibilityDate : "2023-12-18" ,
148
- compatibilityFlags : [
149
- "nodejs_compat" ,
150
- "increase_websocket_message_size" ,
151
- ] ,
152
- modulesRoot : path . dirname ( inspectorProxyWorkerPath ) ,
153
- modules : [ { type : "ESModule" , path : inspectorProxyWorkerPath } ] ,
154
- durableObjects : {
155
- DURABLE_OBJECT : {
156
- className : "InspectorProxyWorker" ,
157
- unsafePreventEviction : true ,
146
+ proxyWorkerOptions . workers . push (
147
+ {
148
+ name : "InspectorProxyWorker" ,
149
+ compatibilityDate : "2023-12-18" ,
150
+ compatibilityFlags : [
151
+ "nodejs_compat" ,
152
+ "increase_websocket_message_size" ,
153
+ ] ,
154
+ modulesRoot : path . dirname ( inspectorProxyWorkerPath ) ,
155
+ modules : [ { type : "ESModule" , path : inspectorProxyWorkerPath } ] ,
156
+ durableObjects : {
157
+ DURABLE_OBJECT : {
158
+ className : "InspectorProxyWorker" ,
159
+ unsafePreventEviction : true ,
160
+ } ,
158
161
} ,
159
- } ,
160
- serviceBindings : {
161
- PROXY_CONTROLLER : async ( req ) : Promise < Response > => {
162
- const body =
163
- ( await req . json ( ) ) as InspectorProxyWorkerOutgoingRequestBody ;
162
+ serviceBindings : {
163
+ PROXY_CONTROLLER : async ( req : Request ) : Promise < Response > => {
164
+ const body =
165
+ ( await req . json ( ) ) as InspectorProxyWorkerOutgoingRequestBody ;
164
166
165
- return this . onInspectorProxyWorkerRequest ( body ) ;
167
+ return this . onInspectorProxyWorkerRequest ( body ) ;
168
+ } ,
166
169
} ,
170
+ bindings : {
171
+ PROXY_CONTROLLER_AUTH_SECRET : this . secret ,
172
+ } ,
173
+
174
+ unsafeDirectSockets : [
175
+ {
176
+ host : this . latestConfig . dev ?. inspector ?. hostname ,
177
+ port : this . latestConfig . dev ?. inspector ?. port ?? 0 ,
178
+ } ,
179
+ ] ,
180
+ // no need to use file-system, so don't
181
+ cache : false ,
182
+ unsafeEphemeralDurableObjects : true ,
167
183
} ,
168
- bindings : {
169
- PROXY_CONTROLLER_AUTH_SECRET : this . secret ,
170
- } ,
184
+ {
185
+ name : "DevtoolsProxyWorker" ,
186
+ compatibilityDate : "2025-01-01" ,
187
+ modules : [
188
+ {
189
+ type : "ESModule" ,
190
+ contents : dedent /* javascript */ `
191
+ export default {
192
+ fetch(request) {
193
+ const url = new URL(request.url);
194
+ url.host = "devtools.devprod.cloudflare.dev"
195
+ url.protocol = "https"
196
+ url.port = 443
197
+ return fetch(url.toString(), request)
198
+ }
199
+ }
200
+ ` ,
201
+ path : "index.js" ,
202
+ } ,
203
+ ] ,
204
+ unsafeDirectSockets : [
205
+ {
206
+ host : this . latestConfig . dev ?. inspector ?. hostname ,
207
+ port : 0 ,
208
+ } ,
209
+ ] ,
171
210
172
- unsafeDirectSockets : [
173
- {
174
- host : this . latestConfig . dev ?. inspector ?. hostname ,
175
- port : this . latestConfig . dev ?. inspector ?. port ?? 0 ,
176
- } ,
177
- ] ,
178
- // no need to use file-system, so don't
179
- cache : false ,
180
- unsafeEphemeralDurableObjects : true ,
181
- } ) ;
211
+ // no need to use file-system, so don't
212
+ cache : false ,
213
+ unsafeEphemeralDurableObjects : true ,
214
+ }
215
+ ) ;
182
216
}
183
217
184
218
const proxyWorkerOptionsChanged = didMiniflareOptionsChange (
@@ -212,10 +246,13 @@ export class ProxyController extends Controller<ProxyControllerEventMap> {
212
246
this . latestConfig . dev . inspector === false || inVscodeJsDebugTerminal
213
247
? Promise . resolve ( undefined )
214
248
: proxyWorker . unsafeGetDirectURL ( "InspectorProxyWorker" ) ,
249
+ this . latestConfig . dev . inspector === false || inVscodeJsDebugTerminal
250
+ ? Promise . resolve ( undefined )
251
+ : proxyWorker . unsafeGetDirectURL ( "DevtoolsProxyWorker" ) ,
215
252
] )
216
- . then ( ( [ url , inspectorUrl ] ) => {
253
+ . then ( ( [ url , inspectorUrl , devtoolsUrl ] ) => {
217
254
if ( ! inspectorUrl || inVscodeJsDebugTerminal ) {
218
- return [ url , undefined ] ;
255
+ return [ url , undefined , undefined ] ;
219
256
}
220
257
// Don't connect the inspector proxy worker until we have a valid ready Miniflare instance.
221
258
// Otherwise, tearing down the ProxyController immediately after setting it up
@@ -224,11 +261,12 @@ export class ProxyController extends Controller<ProxyControllerEventMap> {
224
261
return this . reconnectInspectorProxyWorker ( ) . then ( ( ) => [
225
262
url ,
226
263
inspectorUrl ,
264
+ devtoolsUrl ,
227
265
] ) ;
228
266
} )
229
- . then ( ( [ url , inspectorUrl ] ) => {
267
+ . then ( ( [ url , inspectorUrl , devtoolsUrl ] ) => {
230
268
assert ( url ) ;
231
- this . emitReadyEvent ( proxyWorker , url , inspectorUrl ) ;
269
+ this . emitReadyEvent ( proxyWorker , url , inspectorUrl , devtoolsUrl ) ;
232
270
} )
233
271
. catch ( ( error ) => {
234
272
if ( this . _torndown ) {
@@ -575,13 +613,15 @@ export class ProxyController extends Controller<ProxyControllerEventMap> {
575
613
emitReadyEvent (
576
614
proxyWorker : Miniflare ,
577
615
url : URL ,
578
- inspectorUrl : URL | undefined
616
+ inspectorUrl : URL | undefined ,
617
+ devtoolsUrl : URL | undefined
579
618
) {
580
619
const data : ReadyEvent = {
581
620
type : "ready" ,
582
621
proxyWorker,
583
622
url,
584
623
inspectorUrl,
624
+ devtoolsUrl,
585
625
} ;
586
626
587
627
this . emit ( "ready" , data ) ;
0 commit comments