@@ -4,6 +4,9 @@ const chalk = require('chalk');
44const vm = require ( 'vm' ) ;
55const sourceMapSupport = require ( 'source-map-support' ) ;
66
7+ const httpRegex = / ^ h t t p s ? : \/ \/ / ;
8+ const protocolRelativeRegex = / ^ \/ \/ / ;
9+
710module . exports = class Sandbox {
811 constructor ( globals ) {
912 this . globals = globals ;
@@ -56,27 +59,86 @@ module.exports = class Sandbox {
5659 }
5760
5861 buildFetch ( ) {
62+ let globals ;
63+
5964 if ( globalThis . fetch ) {
60- return {
65+ globals = {
6166 fetch : globalThis . fetch ,
6267 Request : globalThis . Request ,
6368 Response : globalThis . Response ,
6469 Headers : globalThis . Headers ,
6570 AbortController : globalThis . AbortController ,
6671 } ;
72+ } else {
73+ let nodeFetch = require ( 'node-fetch' ) ;
74+ let {
75+ AbortController,
76+ abortableFetch,
77+ } = require ( 'abortcontroller-polyfill/dist/cjs-ponyfill' ) ;
78+ let { fetch, Request } = abortableFetch ( {
79+ fetch : nodeFetch ,
80+ Request : nodeFetch . Request ,
81+ } ) ;
82+
83+ globals = {
84+ fetch,
85+ Request,
86+ Response : nodeFetch . Response ,
87+ Headers : nodeFetch . Headers ,
88+ AbortController,
89+ } ;
6790 }
6891
69- let nodeFetch = require ( 'node-fetch' ) ;
70- let { AbortController, abortableFetch } = require ( 'abortcontroller-polyfill/dist/cjs-ponyfill' ) ;
71- let { fetch, Request } = abortableFetch ( { fetch : nodeFetch , Request : nodeFetch . Request } ) ;
92+ let originalFetch = globals . fetch ;
93+ globals . fetch = function __fastbootFetch ( input , init ) {
94+ input = globals . fetch . __fastbootBuildAbsoluteURL ( input ) ;
95+ return originalFetch ( input , init ) ;
96+ } ;
7297
73- return {
74- fetch,
75- Request,
76- Response : nodeFetch . Response ,
77- Headers : nodeFetch . Headers ,
78- AbortController,
98+ globals . fetch . __fastbootBuildAbsoluteURL = function __fastbootBuildAbsoluteURL ( input ) {
99+ if ( input && input . href ) {
100+ // WHATWG URL or Node.js Url Object
101+ input = input . href ;
102+ }
103+
104+ if ( typeof input !== 'string' ) {
105+ return input ;
106+ }
107+
108+ if ( protocolRelativeRegex . test ( input ) ) {
109+ let request = globals . fetch . __fastbootRequest ;
110+ let [ protocol ] = globals . fetch . __fastbootParseRequest ( input , request ) ;
111+ input = `${ protocol } //${ input } ` ;
112+ } else if ( ! httpRegex . test ( input ) ) {
113+ let request = globals . fetch . __fastbootRequest ;
114+ let [ protocol , host ] = globals . fetch . __fastbootParseRequest ( input , request ) ;
115+ input = `${ protocol } //${ host } ${ input } ` ;
116+ }
117+
118+ return input ;
79119 } ;
120+
121+ globals . fetch . __fastbootParseRequest = function __fastbootParseRequest ( url , request ) {
122+ if ( ! request ) {
123+ throw new Error (
124+ `Using fetch with relative URL ${ url } , but application instance has not been initialized yet.`
125+ ) ;
126+ }
127+
128+ // Old Prember version is not sending protocol
129+ const protocol = request . protocol === 'undefined:' ? 'http:' : request . protocol ;
130+ return [ protocol , request . host ] ;
131+ } ;
132+
133+ let OriginalRequest = globals . Request ;
134+ globals . Request = class __FastBootRequest extends OriginalRequest {
135+ constructor ( input , init ) {
136+ input = globals . fetch . __fastbootBuildAbsoluteURL ( input ) ;
137+ super ( input , init ) ;
138+ }
139+ } ;
140+
141+ return globals ;
80142 }
81143
82144 runScript ( script ) {
0 commit comments