@@ -78,20 +78,52 @@ export default class DocsStoreService extends Service {
7878 let url = `${ protocol } ://${ host } /docs/${ id } .json` ;
7979
8080 let data = await new Promise ( ( resolve , reject ) => {
81- http
82- . get ( url , ( res ) => {
83- let body = '' ;
84- res . on ( 'data' , ( chunk ) => ( body += chunk ) ) ;
85- res . on ( 'end' , ( ) => resolve ( body ) ) ;
86- } )
87- . on ( 'error' , reject ) ;
81+ let req = http . get ( url , ( res ) => {
82+ res . setEncoding ( 'utf8' ) ;
83+ let body = '' ;
84+ res . on ( 'data' , ( chunk ) => {
85+ body += chunk ;
86+ } ) ;
87+ res . on ( 'end' , ( ) => {
88+ let statusCode = res . statusCode || 0 ;
89+ if ( statusCode >= 200 && statusCode < 300 ) {
90+ resolve ( body ) ;
91+ } else {
92+ reject (
93+ new Error (
94+ `Request to ${ url } failed with status ${ statusCode } `
95+ )
96+ ) ;
97+ }
98+ } ) ;
99+ res . on ( 'error' , reject ) ;
100+ } ) ;
101+
102+ req . on ( 'error' , reject ) ;
103+ // Basic timeout so prember/fastboot failures don't hang indefinitely
104+ req . setTimeout ( 10000 , ( ) => {
105+ req . abort ( ) ;
106+ reject ( new Error ( `Request to ${ url } timed out` ) ) ;
107+ } ) ;
88108 } ) ;
89109
90110 payload = JSON . parse ( data ) ;
91111 } else {
92112 let namespace = `${ getRootURL ( this ) . replace ( / \/ $ / , '' ) } /docs` ;
93113 let url = `${ namespace } /${ id } .json` ;
94- let response = await fetch ( url ) ;
114+ let response ;
115+ try {
116+ response = await fetch ( url ) ;
117+ } catch ( e ) {
118+ throw new Error (
119+ `Network error while fetching ${ url } : ${ e && e . message } `
120+ ) ;
121+ }
122+ if ( ! response . ok ) {
123+ throw new Error (
124+ `Request to ${ url } failed with status ${ response . status } `
125+ ) ;
126+ }
95127 payload = await response . json ( ) ;
96128 }
97129
0 commit comments