@@ -4,6 +4,9 @@ const chalk = require('chalk');
4
4
const vm = require ( 'vm' ) ;
5
5
const sourceMapSupport = require ( 'source-map-support' ) ;
6
6
7
+ const httpRegex = / ^ h t t p s ? : \/ \/ / ;
8
+ const protocolRelativeRegex = / ^ \/ \/ / ;
9
+
7
10
module . exports = class Sandbox {
8
11
constructor ( globals ) {
9
12
this . globals = globals ;
@@ -56,27 +59,82 @@ module.exports = class Sandbox {
56
59
}
57
60
58
61
buildFetch ( ) {
62
+ let globals ;
63
+
59
64
if ( globalThis . fetch ) {
60
- return {
65
+ globals = {
61
66
fetch : globalThis . fetch ,
62
67
Request : globalThis . Request ,
63
68
Response : globalThis . Response ,
64
69
Headers : globalThis . Headers ,
65
70
AbortController : globalThis . AbortController ,
66
71
} ;
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
+ } ;
67
90
}
68
91
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
+ if ( input && input . href ) {
95
+ input . url = globals . fetch . __fastbootBuildAbsoluteURL ( input . href ) ;
96
+ } else if ( typeof input === 'string' ) {
97
+ input = globals . fetch . __fastbootBuildAbsoluteURL ( input ) ;
98
+ }
99
+ return originalFetch ( input , init ) ;
100
+ } ;
72
101
73
- return {
74
- fetch,
75
- Request,
76
- Response : nodeFetch . Response ,
77
- Headers : nodeFetch . Headers ,
78
- AbortController,
102
+ globals . fetch . __fastbootBuildAbsoluteURL = function __fastbootBuildAbsoluteURL ( url ) {
103
+ if ( protocolRelativeRegex . test ( url ) ) {
104
+ let [ host ] = globals . fetch . __fastbootParseRequest ( url , fetch . __fastbootRequest ) ;
105
+ url = `${ host } ${ url } ` ;
106
+ } else if ( ! httpRegex . test ( url ) ) {
107
+ let [ host , protocol ] = globals . fetch . __fastbootParseRequest ( url , fetch . __fastbootRequest ) ;
108
+ url = `${ protocol } //${ host } ${ url } ` ;
109
+ }
110
+ return url ;
79
111
} ;
112
+
113
+ globals . fetch . __fastbootParseRequest = function __fastbootParseRequest ( url , request ) {
114
+ if ( ! request ) {
115
+ throw new Error (
116
+ `Using fetch with relative URL ${ url } , but application instance has not been initialized yet.`
117
+ ) ;
118
+ }
119
+ // Old Prember version is not sending protocol
120
+ const protocol = request . protocol === 'undefined:' ? 'http:' : request . protocol ;
121
+ return [ request . host , protocol ] ;
122
+ } ;
123
+
124
+ let OriginalRequest = globals . Request ;
125
+ globals . Request = class __FastBootRequest extends OriginalRequest {
126
+ constructor ( input , init ) {
127
+ if ( typeof input === 'string' ) {
128
+ input = globals . fetch . __fastbootBuildAbsoluteURL ( input ) ;
129
+ } else if ( input && input . href ) {
130
+ // WHATWG URL or Node.js Url Object
131
+ input = globals . fetch . __fastbootBuildAbsoluteURL ( input . href ) ;
132
+ }
133
+ super ( input , init ) ;
134
+ }
135
+ } ;
136
+
137
+ return globals ;
80
138
}
81
139
82
140
runScript ( script ) {
0 commit comments