@@ -129,7 +129,7 @@ export class PHPWorker implements LimitedPHPApi, AsyncDisposable {
129129 * a warning.
130130 */
131131 protected __internal_getRequestHandler ( ) {
132- return _private . get ( this ) ! . requestHandler ;
132+ return this . getRequestHandler ( ) ;
133133 }
134134
135135 async setPrimaryPHP ( php : PHP ) {
@@ -141,14 +141,12 @@ export class PHPWorker implements LimitedPHPApi, AsyncDisposable {
141141
142142 /** @inheritDoc @php -wasm/universal!PHPRequestHandler.pathToInternalUrl */
143143 pathToInternalUrl ( path : string ) : string {
144- return _private . get ( this ) ! . requestHandler ! . pathToInternalUrl ( path ) ;
144+ return this . getRequestHandler ( ) . pathToInternalUrl ( path ) ;
145145 }
146146
147147 /** @inheritDoc @php -wasm/universal!PHPRequestHandler.internalUrlToPath */
148148 internalUrlToPath ( internalUrl : string ) : string {
149- return _private
150- . get ( this ) !
151- . requestHandler ! . internalUrlToPath ( internalUrl ) ;
149+ return this . getRequestHandler ( ) . internalUrlToPath ( internalUrl ) ;
152150 }
153151
154152 /**
@@ -174,7 +172,7 @@ export class PHPWorker implements LimitedPHPApi, AsyncDisposable {
174172
175173 /** @inheritDoc @php -wasm/universal!PHPRequestHandler.request */
176174 async request ( request : PHPRequest ) : Promise < PHPResponse > {
177- const requestHandler = _private . get ( this ) ! . requestHandler ! ;
175+ const requestHandler = this . getRequestHandler ( ) ;
178176 return await requestHandler . request ( request ) ;
179177 }
180178
@@ -189,12 +187,21 @@ export class PHPWorker implements LimitedPHPApi, AsyncDisposable {
189187 * @param request - PHP Request data.
190188 */
191189 async requestStreamed ( request : PHPRequest ) : Promise < StreamedPHPResponse > {
192- const requestHandler = _private . get ( this ) ! . requestHandler ! ;
190+ const requestHandler = this . getRequestHandler ( ) ;
193191 return await requestHandler . requestStreamed ( request ) ;
194192 }
195193
196194 /** @inheritDoc @php -wasm/universal!/PHP.run */
197195 async run ( request : PHPRunOptions ) : Promise < PHPResponse > {
196+ const state = _private . get ( this ) ! ;
197+ const primaryPhp = state . php ;
198+ if (
199+ ! state . requestHandler &&
200+ ! primaryPhp ?. requestHandler &&
201+ primaryPhp
202+ ) {
203+ return await primaryPhp . run ( request ) ;
204+ }
198205 const { php, reap } = await this . acquirePHPInstance ( ) ;
199206 try {
200207 return await php . run ( request ) ;
@@ -208,6 +215,15 @@ export class PHPWorker implements LimitedPHPApi, AsyncDisposable {
208215 argv : string [ ] ,
209216 options ?: { env ?: Record < string , string > }
210217 ) : Promise < StreamedPHPResponse > {
218+ const state = _private . get ( this ) ! ;
219+ const primaryPhp = state . php ;
220+ if (
221+ ! state . requestHandler &&
222+ ! primaryPhp ?. requestHandler &&
223+ primaryPhp
224+ ) {
225+ return await primaryPhp . cli ( argv , options ) ;
226+ }
211227 const { php, reap } = await this . acquirePHPInstance ( ) ;
212228 let response : StreamedPHPResponse ;
213229 try {
@@ -244,9 +260,8 @@ export class PHPWorker implements LimitedPHPApi, AsyncDisposable {
244260 * @returns A PHP instance with a consistent chroot.
245261 */
246262 private async acquirePHPInstance ( ) {
247- const { php, reap } = await _private
248- . get ( this ) !
249- . requestHandler ! . instanceManager . acquirePHPInstance ( ) ;
263+ const { php, reap } =
264+ await this . getRequestHandler ( ) . instanceManager . acquirePHPInstance ( ) ;
250265 if ( this . chroot !== null ) {
251266 php . chdir ( this . chroot ) ;
252267 }
@@ -373,6 +388,23 @@ export class PHPWorker implements LimitedPHPApi, AsyncDisposable {
373388 }
374389
375390 async [ Symbol . asyncDispose ] ( ) {
376- await _private . get ( this ) ! . requestHandler ?. [ Symbol . asyncDispose ] ( ) ;
391+ await this . getRequestHandler ( false ) ?. [ Symbol . asyncDispose ] ( ) ;
392+ }
393+
394+ protected getRequestHandler ( required ?: true ) : PHPRequestHandler ;
395+ protected getRequestHandler ( required : false ) : PHPRequestHandler | undefined ;
396+ protected getRequestHandler ( required = true ) {
397+ const state = _private . get ( this ) ! ;
398+ if ( state . requestHandler ) {
399+ return state . requestHandler ;
400+ }
401+ if ( state . php ?. requestHandler ) {
402+ this . __internal_setRequestHandler ( state . php . requestHandler ) ;
403+ return state . php . requestHandler ;
404+ }
405+ if ( ! required ) {
406+ return undefined ;
407+ }
408+ throw new Error ( 'PHPWorker is not connected to a request handler.' ) ;
377409 }
378410}
0 commit comments