20
20
* abstract representations.
21
21
*/
22
22
23
- import { start , stop , id as backoffId } from './backoff' ;
24
- import {
25
- StorageError ,
26
- unknown ,
27
- appDeleted ,
28
- canceled ,
29
- retryLimitExceeded
30
- } from './error' ;
31
- import { RequestHandler , RequestInfo } from './requestinfo' ;
23
+ import { id as backoffId , start , stop } from './backoff' ;
24
+ import { appDeleted , canceled , retryLimitExceeded , unknown } from './error' ;
25
+ import { ErrorHandler , RequestHandler , RequestInfo } from './requestinfo' ;
32
26
import { isJustDef } from './type' ;
33
27
import { makeQueryString } from './url' ;
34
- import { Headers , Connection , ErrorCode } from './connection' ;
28
+ import { Connection , ErrorCode , Headers , ConnectionType } from './connection' ;
35
29
36
30
export interface Request < T > {
37
31
getPromise ( ) : Promise < T > ;
@@ -46,15 +40,23 @@ export interface Request<T> {
46
40
cancel ( appDelete ?: boolean ) : void ;
47
41
}
48
42
49
- class NetworkRequest < T > implements Request < T > {
50
- private pendingConnection_ : Connection | null = null ;
43
+ /**
44
+ * Handles network logic for all Storage Requests, including error reporting and
45
+ * retries with backoff.
46
+ *
47
+ * @param I - the type of the backend's network response.
48
+ * @param - O the output type used by the rest of the SDK. The conversion
49
+ * happens in the specified `callback_`.
50
+ */
51
+ class NetworkRequest < I extends ConnectionType , O > implements Request < O > {
52
+ private pendingConnection_ : Connection < I > | null = null ;
51
53
private backoffId_ : backoffId | null = null ;
52
- private resolve_ ! : ( value ?: T | PromiseLike < T > ) => void ;
54
+ private resolve_ ! : ( value ?: O | PromiseLike < O > ) => void ;
53
55
// eslint-disable-next-line @typescript-eslint/no-explicit-any
54
56
private reject_ ! : ( reason ?: any ) => void ;
55
57
private canceled_ : boolean = false ;
56
58
private appDelete_ : boolean = false ;
57
- promise_ : Promise < T > ;
59
+ private promise_ : Promise < O > ;
58
60
59
61
constructor (
60
62
private url_ : string ,
@@ -63,14 +65,14 @@ class NetworkRequest<T> implements Request<T> {
63
65
private body_ : string | Blob | Uint8Array | null ,
64
66
private successCodes_ : number [ ] ,
65
67
private additionalRetryCodes_ : number [ ] ,
66
- private callback_ : RequestHandler < string , T > ,
67
- private errorCallback_ : RequestHandler < StorageError , StorageError > | null ,
68
+ private callback_ : RequestHandler < I , O > ,
69
+ private errorCallback_ : ErrorHandler | null ,
68
70
private timeout_ : number ,
69
71
private progressCallback_ : ( ( p1 : number , p2 : number ) => void ) | null ,
70
- private connectionFactory_ : ( ) => Connection
72
+ private connectionFactory_ : ( ) => Connection < I >
71
73
) {
72
74
this . promise_ = new Promise ( ( resolve , reject ) => {
73
- this . resolve_ = resolve as ( value ?: T | PromiseLike < T > ) => void ;
75
+ this . resolve_ = resolve as ( value ?: O | PromiseLike < O > ) => void ;
74
76
this . reject_ = reject ;
75
77
this . start_ ( ) ;
76
78
} ) ;
@@ -135,17 +137,14 @@ class NetworkRequest<T> implements Request<T> {
135
137
*/
136
138
const backoffDone : (
137
139
requestWentThrough : boolean ,
138
- status : RequestEndStatus
140
+ status : RequestEndStatus < I >
139
141
) => void = ( requestWentThrough , status ) => {
140
142
const resolve = this . resolve_ ;
141
143
const reject = this . reject_ ;
142
- const connection = status . connection as Connection ;
144
+ const connection = status . connection as Connection < I > ;
143
145
if ( status . wasSuccessCode ) {
144
146
try {
145
- const result = this . callback_ (
146
- connection ,
147
- connection . getResponseText ( )
148
- ) ;
147
+ const result = this . callback_ ( connection , connection . getResponse ( ) ) ;
149
148
if ( isJustDef ( result ) ) {
150
149
resolve ( result ) ;
151
150
} else {
@@ -157,7 +156,7 @@ class NetworkRequest<T> implements Request<T> {
157
156
} else {
158
157
if ( connection !== null ) {
159
158
const err = unknown ( ) ;
160
- err . serverResponse = connection . getResponseText ( ) ;
159
+ err . serverResponse = connection . getErrorText ( ) ;
161
160
if ( this . errorCallback_ ) {
162
161
reject ( this . errorCallback_ ( connection , err ) ) ;
163
162
} else {
@@ -182,7 +181,7 @@ class NetworkRequest<T> implements Request<T> {
182
181
}
183
182
184
183
/** @inheritDoc */
185
- getPromise ( ) : Promise < T > {
184
+ getPromise ( ) : Promise < O > {
186
185
return this . promise_ ;
187
186
}
188
187
@@ -219,15 +218,15 @@ class NetworkRequest<T> implements Request<T> {
219
218
* A collection of information about the result of a network request.
220
219
* @param opt_canceled - Defaults to false.
221
220
*/
222
- export class RequestEndStatus {
221
+ export class RequestEndStatus < I extends ConnectionType > {
223
222
/**
224
223
* True if the request was canceled.
225
224
*/
226
225
canceled : boolean ;
227
226
228
227
constructor (
229
228
public wasSuccessCode : boolean ,
230
- public connection : Connection | null ,
229
+ public connection : Connection < I > | null ,
231
230
canceled ?: boolean
232
231
) {
233
232
this . canceled = ! ! canceled ;
@@ -266,22 +265,22 @@ export function addAppCheckHeader_(
266
265
}
267
266
}
268
267
269
- export function makeRequest < T > (
270
- requestInfo : RequestInfo < T > ,
268
+ export function makeRequest < I extends ConnectionType , O > (
269
+ requestInfo : RequestInfo < I , O > ,
271
270
appId : string | null ,
272
271
authToken : string | null ,
273
272
appCheckToken : string | null ,
274
- requestFactory : ( ) => Connection ,
273
+ requestFactory : ( ) => Connection < I > ,
275
274
firebaseVersion ?: string
276
- ) : Request < T > {
275
+ ) : Request < O > {
277
276
const queryPart = makeQueryString ( requestInfo . urlParams ) ;
278
277
const url = requestInfo . url + queryPart ;
279
278
const headers = Object . assign ( { } , requestInfo . headers ) ;
280
279
addGmpidHeader_ ( headers , appId ) ;
281
280
addAuthHeader_ ( headers , authToken ) ;
282
281
addVersionHeader_ ( headers , firebaseVersion ) ;
283
282
addAppCheckHeader_ ( headers , appCheckToken ) ;
284
- return new NetworkRequest < T > (
283
+ return new NetworkRequest < I , O > (
285
284
url ,
286
285
requestInfo . method ,
287
286
headers ,
0 commit comments