@@ -3,6 +3,7 @@ import { randomUUID } from "node:crypto";
33import  events  from  "node:events" ; 
44import  path  from  "node:path" ; 
55import  {  LogLevel ,  Miniflare ,  Mutex ,  Response  }  from  "miniflare" ; 
6+ import  dedent  from  "ts-dedent" ; 
67import  inspectorProxyWorkerPath  from  "worker:startDevWorker/InspectorProxyWorker" ; 
78import  proxyWorkerPath  from  "worker:startDevWorker/ProxyWorker" ; 
89import  WebSocket  from  "ws" ; 
@@ -103,7 +104,7 @@ export class ProxyController extends Controller<ProxyControllerEventMap> {
103104					// However, the proxy worker only makes outgoing requests to the user Worker Miniflare instance, which _should_ receive CF-Connecting-IP 
104105					stripCfConnectingIp : false , 
105106					serviceBindings : { 
106- 						PROXY_CONTROLLER : async  ( req ) : Promise < Response >  =>  { 
107+ 						PROXY_CONTROLLER : async  ( req :  Request ) : Promise < Response >  =>  { 
107108							const  message  = 
108109								( await  req . json ( ) )  as  ProxyWorkerOutgoingRequestBody ; 
109110
@@ -142,43 +143,76 @@ export class ProxyController extends Controller<ProxyControllerEventMap> {
142143		} ; 
143144
144145		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+ 						} , 
158161					} , 
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 ; 
164166
165- 						return  this . onInspectorProxyWorkerRequest ( body ) ; 
167+ 							return  this . onInspectorProxyWorkerRequest ( body ) ; 
168+ 						} , 
166169					} , 
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 , 
167183				} , 
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+ 					] , 
171210
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+ 			) ; 
182216		} 
183217
184218		const  proxyWorkerOptionsChanged  =  didMiniflareOptionsChange ( 
@@ -212,10 +246,13 @@ export class ProxyController extends Controller<ProxyControllerEventMap> {
212246				this . latestConfig . dev . inspector  ===  false  ||  inVscodeJsDebugTerminal 
213247					? Promise . resolve ( undefined ) 
214248					: proxyWorker . unsafeGetDirectURL ( "InspectorProxyWorker" ) , 
249+ 				this . latestConfig . dev . inspector  ===  false  ||  inVscodeJsDebugTerminal 
250+ 					? Promise . resolve ( undefined ) 
251+ 					: proxyWorker . unsafeGetDirectURL ( "DevtoolsProxyWorker" ) , 
215252			] ) 
216- 				. then ( ( [ url ,  inspectorUrl ] )  =>  { 
253+ 				. then ( ( [ url ,  inspectorUrl ,   devtoolsUrl ] )  =>  { 
217254					if  ( ! inspectorUrl  ||  inVscodeJsDebugTerminal )  { 
218- 						return  [ url ,  undefined ] ; 
255+ 						return  [ url ,  undefined ,   undefined ] ; 
219256					} 
220257					// Don't connect the inspector proxy worker until we have a valid ready Miniflare instance. 
221258					// Otherwise, tearing down the ProxyController immediately after setting it up 
@@ -224,11 +261,12 @@ export class ProxyController extends Controller<ProxyControllerEventMap> {
224261					return  this . reconnectInspectorProxyWorker ( ) . then ( ( )  =>  [ 
225262						url , 
226263						inspectorUrl , 
264+ 						devtoolsUrl , 
227265					] ) ; 
228266				} ) 
229- 				. then ( ( [ url ,  inspectorUrl ] )  =>  { 
267+ 				. then ( ( [ url ,  inspectorUrl ,   devtoolsUrl ] )  =>  { 
230268					assert ( url ) ; 
231- 					this . emitReadyEvent ( proxyWorker ,  url ,  inspectorUrl ) ; 
269+ 					this . emitReadyEvent ( proxyWorker ,  url ,  inspectorUrl ,   devtoolsUrl ) ; 
232270				} ) 
233271				. catch ( ( error )  =>  { 
234272					if  ( this . _torndown )  { 
@@ -575,13 +613,15 @@ export class ProxyController extends Controller<ProxyControllerEventMap> {
575613	emitReadyEvent ( 
576614		proxyWorker : Miniflare , 
577615		url : URL , 
578- 		inspectorUrl : URL  |  undefined 
616+ 		inspectorUrl : URL  |  undefined , 
617+ 		devtoolsUrl : URL  |  undefined 
579618	)  { 
580619		const  data : ReadyEvent  =  { 
581620			type : "ready" , 
582621			proxyWorker, 
583622			url, 
584623			inspectorUrl, 
624+ 			devtoolsUrl, 
585625		} ; 
586626
587627		this . emit ( "ready" ,  data ) ; 
0 commit comments