@@ -111,45 +111,51 @@ const pendingRequests = {};
111111 * @param {ResourceType } resourceType Type of resource to load.
112112 * @param {string } url Url of the resource.
113113 * @param {Options } [options] Options.
114- * @param {{request ?: Request } } [metadata] Object to be filled with the request.
114+ * @param {{url ?: string } } [metadata] Object to be filled with the request.
115115 * @return {Promise<Object|Response> } Promise that resolves with the loaded resource
116116 * or rejects with the Response object.
117117 * @private
118118 */
119119export function fetchResource ( resourceType , url , options = { } , metadata ) {
120120 if ( url in pendingRequests ) {
121121 if ( metadata ) {
122- metadata . request = pendingRequests [ url ] [ 0 ] ;
122+ metadata . url = pendingRequests [ url ] [ 0 ] . url ;
123123 }
124124 return pendingRequests [ url ] [ 1 ] ;
125125 }
126126 const transformedRequest = options . transformRequest
127127 ? options . transformRequest ( url , resourceType ) || url
128128 : url ;
129- const pendingRequest = toPromise ( ( ) => transformedRequest ) . then (
130- ( transformedRequest ) => {
129+ const handleError = function ( error ) {
130+ delete pendingRequests [ url ] ;
131+ return Promise . reject ( new Error ( 'Error fetching source ' + url ) ) ;
132+ } ;
133+ const handleResponse = function ( response ) {
134+ delete pendingRequests [ url ] ;
135+ return response . ok
136+ ? response . json ( )
137+ : Promise . reject ( new Error ( 'Error fetching source ' + url ) ) ;
138+ } ;
139+ const pendingRequest = toPromise ( ( ) => transformedRequest )
140+ . then ( ( transformedRequest ) => {
141+ if ( transformedRequest instanceof Response ) {
142+ if ( metadata ) {
143+ metadata . url = transformedRequest . url ;
144+ }
145+ return handleResponse ( transformedRequest ) ;
146+ }
131147 if ( ! ( transformedRequest instanceof Request ) ) {
132148 transformedRequest = new Request ( transformedRequest ) ;
133149 }
134150 if ( ! transformedRequest . headers . get ( 'Accept' ) ) {
135151 transformedRequest . headers . set ( 'Accept' , 'application/json' ) ;
136152 }
137153 if ( metadata ) {
138- metadata . request = transformedRequest ;
154+ metadata . url = transformedRequest . url ;
139155 }
140- return fetch ( transformedRequest )
141- . then ( function ( response ) {
142- delete pendingRequests [ url ] ;
143- return response . ok
144- ? response . json ( )
145- : Promise . reject ( new Error ( 'Error fetching source ' + url ) ) ;
146- } )
147- . catch ( function ( error ) {
148- delete pendingRequests [ url ] ;
149- return Promise . reject ( new Error ( 'Error fetching source ' + url ) ) ;
150- } ) ;
151- } ,
152- ) ;
156+ return fetch ( transformedRequest ) . then ( handleResponse ) . catch ( handleError ) ;
157+ } )
158+ . catch ( handleError ) ;
153159 pendingRequests [ url ] = [ transformedRequest , pendingRequest ] ;
154160 return pendingRequest ;
155161}
@@ -191,38 +197,51 @@ export function getTileJson(glSource, styleUrl, options = {}) {
191197 : src ;
192198 if ( tile instanceof VectorTile ) {
193199 tile . setLoader ( ( extent , resolution , projection ) => {
194- toPromise ( ( ) => transformedRequest ) . then ( ( transformedRequest ) => {
195- fetch ( transformedRequest )
196- . then ( ( response ) => response . arrayBuffer ( ) )
197- . then ( ( data ) => {
198- const format = tile . getFormat ( ) ;
199- const features = format . readFeatures ( data , {
200- extent : extent ,
201- featureProjection : projection ,
202- } ) ;
203- // @ts -ignore
204- tile . setFeatures ( features ) ;
205- } )
206- . catch ( ( e ) => tile . setState ( TileState . ERROR ) ) ;
207- } ) ;
200+ const handleResponse = function ( response ) {
201+ response . arrayBuffer ( ) . then ( ( data ) => {
202+ const format = tile . getFormat ( ) ;
203+ const features = format . readFeatures ( data , {
204+ extent : extent ,
205+ featureProjection : projection ,
206+ } ) ;
207+ // @ts -ignore
208+ tile . setFeatures ( features ) ;
209+ } ) ;
210+ } ;
211+ toPromise ( ( ) => transformedRequest )
212+ . then ( ( transformedRequest ) => {
213+ if ( transformedRequest instanceof Response ) {
214+ return handleResponse ( transformedRequest ) ;
215+ }
216+ fetch ( transformedRequest )
217+ . then ( handleResponse )
218+ . catch ( ( e ) => tile . setState ( TileState . ERROR ) ) ;
219+ } )
220+ . catch ( ( e ) => tile . setState ( TileState . ERROR ) ) ;
208221 } ) ;
209222 } else {
210223 const img = tile . getImage ( ) ;
211- toPromise ( ( ) => transformedRequest ) . then ( ( transformedRequest ) => {
212- if ( transformedRequest instanceof Request ) {
213- fetch ( transformedRequest )
214- . then ( ( response ) => response . blob ( ) )
215- . then ( ( blob ) => {
224+ toPromise ( ( ) => transformedRequest )
225+ . then ( ( transformedRequest ) => {
226+ if ( typeof transformedRequest === 'string' ) {
227+ img . src = transformedRequest ;
228+ return ;
229+ }
230+ const handleResponse = ( response ) =>
231+ response . blob ( ) . then ( ( blob ) => {
216232 const url = URL . createObjectURL ( blob ) ;
217233 img . addEventListener ( 'load' , ( ) => URL . revokeObjectURL ( url ) ) ;
218234 img . addEventListener ( 'error' , ( ) => URL . revokeObjectURL ( url ) ) ;
219235 img . src = url ;
220- } )
236+ } ) ;
237+ if ( transformedRequest instanceof Response ) {
238+ return handleResponse ( transformedRequest ) ;
239+ }
240+ fetch ( transformedRequest )
241+ . then ( handleResponse )
221242 . catch ( ( e ) => tile . setState ( TileState . ERROR ) ) ;
222- } else {
223- img . src = transformedRequest ;
224- }
225- } ) ;
243+ } )
244+ . catch ( ( e ) => tile . setState ( TileState . ERROR ) ) ;
226245 }
227246 } ;
228247 }
@@ -258,7 +277,7 @@ export function getTileJson(glSource, styleUrl, options = {}) {
258277 tileUrl ,
259278 options . accessToken ,
260279 options . accessTokenParam || 'access_token' ,
261- metadata . request . url ,
280+ metadata . url ,
262281 ) [ 0 ] ;
263282 } ) ;
264283 return Promise . resolve ( { tileJson, tileLoadFunction} ) ;
0 commit comments