@@ -73,7 +73,7 @@ var OfflineFirstAPI = (function () {
73
73
}
74
74
OfflineFirstAPI . prototype . fetch = function ( service , options ) {
75
75
return __awaiter ( this , void 0 , void 0 , function ( ) {
76
- var serviceDefinition , fullPath , middlewares , fetchOptions , fetchHeaders , shouldCache , requestId , expiration , _sha , expirationDelay , cachedData , parsedRes , res , err_1 ;
76
+ var serviceDefinition , fullPath , middlewares , fetchOptions , fetchHeaders , shouldCache , requestId , expiration , _sha , expirationDelay , cachedData , parsedResponseData , res , err_1 ;
77
77
return __generator ( this , function ( _a ) {
78
78
switch ( _a . label ) {
79
79
case 0 :
@@ -84,7 +84,7 @@ var OfflineFirstAPI = (function () {
84
84
fullPath = this . _constructPath ( serviceDefinition , options ) ;
85
85
_a . label = 1 ;
86
86
case 1 :
87
- _a . trys . push ( [ 1 , 9 , , 10 ] ) ;
87
+ _a . trys . push ( [ 1 , 8 , , 9 ] ) ;
88
88
return [ 4 /*yield*/ , this . _applyMiddlewares ( serviceDefinition , options ) ] ;
89
89
case 2 :
90
90
middlewares = _a . sent ( ) ;
@@ -94,43 +94,51 @@ var OfflineFirstAPI = (function () {
94
94
! ( serviceDefinition . disableCache || ( options && options . disableCache ) ) ;
95
95
requestId = void 0 ;
96
96
expiration = void 0 ;
97
- if ( ! shouldCache ) return [ 3 /*break*/ , 4 ] ;
98
97
_sha = new sha ( 'SHA-1' , 'TEXT' ) ;
99
98
_sha . update ( fullPath + ":" + ( fetchHeaders ? 'headersOnly' : '' ) + ":" + JSON . stringify ( fetchOptions ) ) ;
100
99
requestId = _sha . getHash ( 'HEX' ) ;
101
100
expirationDelay = ( options && options . expiration ) || serviceDefinition . expiration || this . _APIOptions . cacheExpiration ;
102
101
expiration = Date . now ( ) + expirationDelay ;
103
- return [ 4 /*yield*/ , this . _getCachedData ( service , requestId ) ] ;
102
+ return [ 4 /*yield*/ , this . _getCachedData ( service , requestId , fullPath ) ] ;
104
103
case 3 :
105
104
cachedData = _a . sent ( ) ;
106
- if ( cachedData ) {
107
- return [ 2 /*return*/ , cachedData ] ;
105
+ if ( cachedData . success && cachedData . fresh ) {
106
+ this . _log ( "Using fresh cache for " + fullPath ) ;
107
+ return [ 2 /*return*/ , cachedData . data ] ;
108
108
}
109
- _a . label = 4 ;
110
- case 4 :
111
109
// Network fetch
112
110
this . _logNetwork ( serviceDefinition , fetchHeaders , options ) ;
113
111
this . _log ( 'full URL for request' , fullPath ) ;
114
112
this . _log ( 'full fetch options for request' , fetchOptions ) ;
115
- parsedRes = void 0 ;
116
- return [ 4 /*yield*/ , fetch ( fullPath , fetchOptions ) ] ;
117
- case 5 :
113
+ parsedResponseData = void 0 ;
114
+ return [ 4 /*yield*/ , this . _fetch ( fullPath , fetchOptions ) ] ;
115
+ case 4 :
118
116
res = _a . sent ( ) ;
117
+ if ( ! res . success ) {
118
+ if ( cachedData . success && cachedData . data ) {
119
+ this . _log ( "Using stale cache for " + fullPath + " (network request failed)" ) ;
120
+ return [ 2 /*return*/ , cachedData . data ] ;
121
+ }
122
+ else {
123
+ throw new Error ( "Cannot fetch data for " + service + " online, no cache either." ) ;
124
+ }
125
+ }
119
126
this . _log ( 'raw network response' , res ) ;
120
- if ( ! fetchHeaders ) return [ 3 /*break*/ , 6 ] ;
121
- parsedRes = res . headers && res . headers . map ? res . headers . map : { } ;
122
- return [ 3 /*break*/ , 8 ] ;
123
- case 6 : return [ 4 /*yield*/ , res . json ( ) ] ;
127
+ if ( ! fetchHeaders ) return [ 3 /*break*/ , 5 ] ;
128
+ parsedResponseData = res . data . headers && res . data . headers . map ? res . data . headers . map : { } ;
129
+ return [ 3 /*break*/ , 7 ] ;
130
+ case 5 : return [ 4 /*yield*/ , res . data . json ( ) ] ;
131
+ case 6 :
132
+ parsedResponseData = _a . sent ( ) ;
133
+ _a . label = 7 ;
124
134
case 7 :
125
- parsedRes = _a . sent ( ) ;
126
- _a . label = 8 ;
135
+ res . data . ok && shouldCache && this . _cache ( service , requestId , parsedResponseData , expiration ) ;
136
+ this . _log ( 'parsed network response' , parsedResponseData ) ;
137
+ return [ 2 /*return*/ , parsedResponseData ] ;
127
138
case 8 :
128
- res . ok && shouldCache && this . _cache ( service , requestId , parsedRes , expiration ) ;
129
- return [ 2 /*return*/ , parsedRes ] ;
130
- case 9 :
131
139
err_1 = _a . sent ( ) ;
132
140
throw new Error ( err_1 ) ;
133
- case 10 : return [ 2 /*return*/ ] ;
141
+ case 9 : return [ 2 /*return*/ ] ;
134
142
}
135
143
} ) ;
136
144
} ) ;
@@ -168,9 +176,27 @@ var OfflineFirstAPI = (function () {
168
176
this . _APIDriver = driver ;
169
177
this . _log ( 'custom driver set' ) ;
170
178
} ;
179
+ OfflineFirstAPI . prototype . _fetch = function ( url , options ) {
180
+ return __awaiter ( this , void 0 , void 0 , function ( ) {
181
+ var _a , err_3 ;
182
+ return __generator ( this , function ( _b ) {
183
+ switch ( _b . label ) {
184
+ case 0 :
185
+ _b . trys . push ( [ 0 , 2 , , 3 ] ) ;
186
+ _a = { success : true } ;
187
+ return [ 4 /*yield*/ , fetch ( url , options ) ] ;
188
+ case 1 : return [ 2 /*return*/ , ( _a . data = _b . sent ( ) , _a ) ] ;
189
+ case 2 :
190
+ err_3 = _b . sent ( ) ;
191
+ return [ 2 /*return*/ , { success : false } ] ;
192
+ case 3 : return [ 2 /*return*/ ] ;
193
+ }
194
+ } ) ;
195
+ } ) ;
196
+ } ;
171
197
OfflineFirstAPI . prototype . _cache = function ( service , requestId , response , expiration ) {
172
198
return __awaiter ( this , void 0 , void 0 , function ( ) {
173
- var err_3 ;
199
+ var err_4 ;
174
200
return __generator ( this , function ( _a ) {
175
201
switch ( _a . label ) {
176
202
case 0 :
@@ -187,50 +213,54 @@ var OfflineFirstAPI = (function () {
187
213
this . _log ( "Updated cache for request " + requestId ) ;
188
214
return [ 2 /*return*/ , true ] ;
189
215
case 4 :
190
- err_3 = _a . sent ( ) ;
216
+ err_4 = _a . sent ( ) ;
191
217
throw new Error ( "Error while caching API response for " + requestId ) ;
192
218
case 5 : return [ 2 /*return*/ ] ;
193
219
}
194
220
} ) ;
195
221
} ) ;
196
222
} ;
197
- OfflineFirstAPI . prototype . _getCachedData = function ( service , requestId ) {
223
+ OfflineFirstAPI . prototype . _getCachedData = function ( service , requestId , fullPath ) {
198
224
return __awaiter ( this , void 0 , void 0 , function ( ) {
199
- var serviceDictionary , expiration , cachedData , err_4 ;
225
+ var serviceDictionary , expiration , rawCachedData , parsedCachedData , err_5 ;
200
226
return __generator ( this , function ( _a ) {
201
227
switch ( _a . label ) {
202
228
case 0 : return [ 4 /*yield*/ , this . _APIDriver . getItem ( this . _getServiceDictionaryKey ( service ) ) ] ;
203
229
case 1 :
204
230
serviceDictionary = _a . sent ( ) ;
205
231
serviceDictionary = JSON . parse ( serviceDictionary ) || { } ;
206
232
expiration = serviceDictionary [ requestId ] ;
207
- if ( ! expiration ) return [ 3 /*break*/ , 8 ] ;
208
- this . _log ( requestId + " already cached, expiring at : " + expiration ) ;
209
- if ( ! ( expiration > Date . now ( ) ) ) return [ 3 /*break*/ , 6 ] ;
233
+ if ( ! expiration ) return [ 3 /*break*/ , 6 ] ;
234
+ this . _log ( fullPath + " already cached, expiring at : " + expiration ) ;
210
235
_a . label = 2 ;
211
236
case 2 :
212
237
_a . trys . push ( [ 2 , 4 , , 5 ] ) ;
213
238
return [ 4 /*yield*/ , this . _APIDriver . getItem ( this . _getCacheObjectKey ( requestId ) ) ] ;
214
239
case 3 :
215
- cachedData = _a . sent ( ) ;
216
- return [ 2 /*return*/ , JSON . parse ( cachedData ) ] ;
240
+ rawCachedData = _a . sent ( ) ;
241
+ parsedCachedData = JSON . parse ( rawCachedData ) ;
242
+ if ( expiration > Date . now ( ) ) {
243
+ return [ 2 /*return*/ , { success : true , fresh : true , data : parsedCachedData } ] ;
244
+ }
245
+ else {
246
+ return [ 2 /*return*/ , { success : true , fresh : false , data : parsedCachedData } ] ;
247
+ }
248
+ return [ 3 /*break*/ , 5 ] ;
217
249
case 4 :
218
- err_4 = _a . sent ( ) ;
219
- throw new Error ( err_4 ) ;
250
+ err_5 = _a . sent ( ) ;
251
+ throw new Error ( err_5 ) ;
220
252
case 5 : return [ 3 /*break*/ , 7 ] ;
221
- case 6 : return [ 2 /*return*/ , false ] ;
222
- case 7 : return [ 3 /*break*/ , 9 ] ;
223
- case 8 :
224
- this . _log ( requestId + " not yet cached" ) ;
225
- return [ 2 /*return*/ , false ] ;
226
- case 9 : return [ 2 /*return*/ ] ;
253
+ case 6 :
254
+ this . _log ( fullPath + " not yet cached" ) ;
255
+ return [ 2 /*return*/ , { success : false } ] ;
256
+ case 7 : return [ 2 /*return*/ ] ;
227
257
}
228
258
} ) ;
229
259
} ) ;
230
260
} ;
231
261
OfflineFirstAPI . prototype . _addKeyToServiceDictionary = function ( service , requestId , expiration ) {
232
262
return __awaiter ( this , void 0 , void 0 , function ( ) {
233
- var serviceDictionaryKey , dictionary , err_5 ;
263
+ var serviceDictionaryKey , dictionary , err_6 ;
234
264
return __generator ( this , function ( _a ) {
235
265
switch ( _a . label ) {
236
266
case 0 :
@@ -249,8 +279,8 @@ var OfflineFirstAPI = (function () {
249
279
this . _APIDriver . setItem ( serviceDictionaryKey , JSON . stringify ( dictionary ) ) ;
250
280
return [ 2 /*return*/ , true ] ;
251
281
case 2 :
252
- err_5 = _a . sent ( ) ;
253
- throw new Error ( err_5 ) ;
282
+ err_6 = _a . sent ( ) ;
283
+ throw new Error ( err_6 ) ;
254
284
case 3 : return [ 2 /*return*/ ] ;
255
285
}
256
286
} ) ;
@@ -264,7 +294,7 @@ var OfflineFirstAPI = (function () {
264
294
} ;
265
295
OfflineFirstAPI . prototype . _applyMiddlewares = function ( serviceDefinition , options ) {
266
296
return __awaiter ( this , void 0 , void 0 , function ( ) {
267
- var middlewares , resolvedMiddlewares , err_6 ;
297
+ var middlewares , resolvedMiddlewares , err_7 ;
268
298
return __generator ( this , function ( _a ) {
269
299
switch ( _a . label ) {
270
300
case 0 :
@@ -279,8 +309,8 @@ var OfflineFirstAPI = (function () {
279
309
resolvedMiddlewares = _a . sent ( ) ;
280
310
return [ 2 /*return*/ , _merge . apply ( void 0 , resolvedMiddlewares ) ] ;
281
311
case 3 :
282
- err_6 = _a . sent ( ) ;
283
- throw new Error ( "Error while applying middlewares for " + serviceDefinition . path + " : " + err_6 ) ;
312
+ err_7 = _a . sent ( ) ;
313
+ throw new Error ( "Error while applying middlewares for " + serviceDefinition . path + " : " + err_7 ) ;
284
314
case 4 : return [ 3 /*break*/ , 6 ] ;
285
315
case 5 : return [ 2 /*return*/ , { } ] ;
286
316
case 6 : return [ 2 /*return*/ ] ;
0 commit comments