1- import { loadPHPRuntime , PHP } from "@php-wasm/universal"
1+ import { loadPHPRuntime , PHP , type PHPRequestHandler } from "@php-wasm/universal"
22import { decodeRemoteZip , decodeZip } from "@php-wasm/stream-compression"
33import { bootWordPressAndRequestHandler , type WordPressInstallMode } from "@wp-playground/wordpress"
44// The PHP-WASM package publishes this Emscripten loader without TypeScript declarations.
55// @ts -expect-error The adjacent Wasm declaration covers the compiled binary import.
66import { dependenciesTotalSize , init } from "../../../node_modules/@php-wasm/web-8-5/asyncify/php_8_5.js"
77import phpWasmModule from "../../../node_modules/@php-wasm/web-8-5/asyncify/8_5_8/php_8_5.wasm"
88import { CLOUDFLARE_RUNTIME_HEALTH_MARKER , CLOUDFLARE_RUNTIME_HEALTH_SCHEMA , cloudflareRuntimeHealthResponse } from "./health-envelope.js"
9+ import { routeWorkerRequest } from "./request-routing.js"
10+ import { toFetchResponse , toPHPRequest } from "./request-translation.js"
911import markdownDatabaseIntegrationRuntime from "../assets/markdown-database-integration-runtime.zip"
1012import markdownPrimaryBootstrapIndex from "../assets/markdown-primary-bootstrap-index.sqlite"
1113import wordpressInstallSeed from "../assets/wordpress-install-seed.sqlite"
@@ -60,7 +62,7 @@ if (empty($option_rows)) {
6062}
6163$changes = $runtime->flush();
6264echo json_encode(['revisionValue' => $value, 'previousPostFound' => !empty($previous_rows), 'postId' => $post_id, 'wordpressVersion' => $wp_version, 'canonicalChanges' => $changes]);`
63- let bootPromise : Promise < { php : PHP ; wordpressVersion : string } > | undefined
65+ let bootPromise : Promise < { php : PHP ; requestHandler : PHPRequestHandler ; wordpressVersion : string } > | undefined
6466
6567interface Env {
6668 WORDPRESS_STATE : DurableObjectNamespace
@@ -69,25 +71,29 @@ interface Env {
6971
7072export default {
7173 async fetch ( request : Request , env : Env ) : Promise < Response > {
72- const phase = new URL ( request . url ) . searchParams . get ( "phase" )
73- if ( phase === "r2-state" || phase === "r2-mutate" ) {
74- const expectedMethod = phase === "r2-mutate" ? "POST" : "GET"
74+ const route = routeWorkerRequest ( request )
75+ if ( route . kind === "r2-state" || route . kind === "r2-mutate" ) {
76+ const expectedMethod = route . kind === "r2-mutate" ? "POST" : "GET"
7577 if ( request . method !== expectedMethod ) {
76- return new Response ( `WordPress state ${ phase === "r2-mutate" ? "mutation" : "read" } requires ${ expectedMethod } .` , { status : 405 } )
78+ return new Response ( `WordPress state ${ route . kind === "r2-mutate" ? "mutation" : "read" } requires ${ expectedMethod } .` , { status : 405 } )
7779 }
7880 const coordinator = env . WORDPRESS_STATE . getByName ( "default" )
79- return phase === "r2-state"
81+ return route . kind === "r2-state"
8082 ? coordinator . fetch ( new Request ( "https://coordinator/state" ) )
8183 : runSerializedMarkdownMutation ( env , coordinator )
8284 }
83- if ( phase ) return runBootProbe ( phase )
85+ if ( route . kind === "probe" ) return runBootProbe ( route . phase )
8486
8587 const runtime = await ( bootPromise ??= bootWordPressRuntime (
8688 "do-not-attempt-installing" ,
8789 true ,
88- true ,
90+ false ,
8991 new Uint8Array ( wordpressInstallSeed ) ,
92+ undefined ,
93+ undefined ,
94+ new URL ( request . url ) . origin ,
9095 ) )
96+ if ( route . kind === "wordpress" ) return toFetchResponse ( request , await runtime . requestHandler . request ( await toPHPRequest ( request ) ) )
9197 const phpVersion = ( await runtime . php . run ( { code : "<?php echo PHP_VERSION;" } ) ) . text . trim ( )
9298 return cloudflareRuntimeHealthResponse ( {
9399 schema : CLOUDFLARE_RUNTIME_HEALTH_SCHEMA ,
@@ -517,7 +523,8 @@ async function bootWordPressRuntime(
517523 databaseSeed ?: Uint8Array ,
518524 markdownFiles ?: RuntimeFile [ ] ,
519525 markdownIndexSeed ?: Uint8Array ,
520- ) : Promise < { php : PHP ; wordpressVersion : string } > {
526+ siteUrl = SITE_URL ,
527+ ) : Promise < { php : PHP ; requestHandler : PHPRequestHandler ; wordpressVersion : string } > {
521528 const requestHandler = await bootWordPressAndRequestHandler ( {
522529 createPhpRuntime,
523530 constants : {
@@ -550,15 +557,15 @@ async function bootWordPressRuntime(
550557 } : undefined ,
551558 maxPhpInstances : 1 ,
552559 phpVersion : "8.5" ,
553- siteUrl : SITE_URL ,
560+ siteUrl,
554561 wordPressZip : streamWordPressFiles ? undefined : fetchArchive ( WORDPRESS_ARCHIVE_URL , "wordpress.zip" ) ,
555562 sqliteIntegrationPluginZip : includeSqlite ? fetchArchive ( SQLITE_INTEGRATION_ARCHIVE_URL , "sqlite-database-integration.zip" ) : undefined ,
556563 wordpressInstallMode,
557564 } )
558565 const php = await requestHandler . getPrimaryPhp ( )
559566 const wordpressVersion = ( await php . run ( { code : "<?php require '/wordpress/wp-includes/version.php'; echo $wp_version;" } ) ) . text . trim ( )
560567 if ( ! wordpressVersion ) throw new Error ( "WordPress boot completed without a detected version." )
561- return { php, wordpressVersion }
568+ return { php, requestHandler , wordpressVersion }
562569}
563570
564571function initialMarkdownFiles ( ) : RuntimeFile [ ] {
0 commit comments