@@ -197,25 +197,26 @@ const portableEvents = new WeakMap<H3Event, RequestEvent>()
197197 *
198198 * Both shapes are served from one object: `req`, `res`, `url` and `~app` resolve to the web
199199 * view, everything else to the h3 v1 event, so h3's own helpers work on it too (they read
200- * `event.node`, not its deprecated `req`/`res` aliases). Cached per event.
200+ * `event.node`, not its deprecated `req`/`res` aliases). Cached per event, with the web view
201+ * built on first access. `resolveURL` replaces how `url` is derived from the event's path.
201202 */
202- export function toPortableEvent ( event : H3Event ) : RequestEvent {
203+ export function toPortableEvent ( event : H3Event , resolveURL ?: ( ) => URL ) : RequestEvent {
203204 const cached = portableEvents . get ( event )
204205 if ( cached ) { return cached }
205206
206- const web = toWebView ( event )
207+ let web : RendererEvent | undefined
207208 const portable = new Proxy ( event , {
208209 get ( target , property ) {
209210 if ( property === PORTABLE_EVENT ) {
210211 return true
211212 }
212213 return WEB_PROPERTIES . has ( property as string )
213- ? web [ property as keyof RendererEvent ]
214+ ? ( web ??= toWebView ( event , resolveURL ) ) [ property as keyof RendererEvent ]
214215 : Reflect . get ( target , property , target )
215216 } ,
216217 set ( target , property , value ) {
217218 if ( property === 'url' ) {
218- web . url = value
219+ ( web ??= toWebView ( event , resolveURL ) ) . url = value
219220 return true
220221 }
221222 return Reflect . set ( target , property , value , target )
@@ -260,7 +261,7 @@ export function toRequestEvent (event: H3Event): RendererEvent {
260261 * than a copy of it, so a header the application sets through h3 and a header the renderer
261262 * sets are the same header.
262263 */
263- function toWebView ( event : H3Event ) : RendererEvent {
264+ function toWebView ( event : H3Event , resolveURL = ( ) => new URL ( encodeEventPath ( event . path ) , ` ${ getRequestProtocol ( event ) } :// ${ getRequestHost ( event ) } ` ) ) : RendererEvent {
264265 const node = event . node
265266 let request : Request | undefined
266267 let url : URL | undefined
@@ -286,7 +287,7 @@ function toWebView (event: H3Event): RendererEvent {
286287 return ( request ??= toWebRequest ( event ) )
287288 } ,
288289 get url ( ) {
289- return ( url ??= new URL ( encodeEventPath ( event . path ) , ` ${ getRequestProtocol ( event ) } :// ${ getRequestHost ( event ) } ` ) )
290+ return ( url ??= resolveURL ( ) )
290291 } ,
291292 // the renderer rewrites the URL when a payload request renders the page it belongs to
292293 set url ( value : URL ) {
0 commit comments