2020 * abstract representations.
2121 */
2222
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' ;
3226import { isJustDef } from './type' ;
3327import { makeQueryString } from './url' ;
34- import { Headers , Connection , ErrorCode } from './connection' ;
28+ import { Connection , ErrorCode , Headers , ConnectionType } from './connection' ;
3529
3630export interface Request < T > {
3731 getPromise ( ) : Promise < T > ;
@@ -46,15 +40,23 @@ export interface Request<T> {
4640 cancel ( appDelete ?: boolean ) : void ;
4741}
4842
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 ;
5153 private backoffId_ : backoffId | null = null ;
52- private resolve_ ! : ( value ?: T | PromiseLike < T > ) => void ;
54+ private resolve_ ! : ( value ?: O | PromiseLike < O > ) => void ;
5355 // eslint-disable-next-line @typescript-eslint/no-explicit-any
5456 private reject_ ! : ( reason ?: any ) => void ;
5557 private canceled_ : boolean = false ;
5658 private appDelete_ : boolean = false ;
57- promise_ : Promise < T > ;
59+ private promise_ : Promise < O > ;
5860
5961 constructor (
6062 private url_ : string ,
@@ -63,14 +65,14 @@ class NetworkRequest<T> implements Request<T> {
6365 private body_ : string | Blob | Uint8Array | null ,
6466 private successCodes_ : number [ ] ,
6567 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 ,
6870 private timeout_ : number ,
6971 private progressCallback_ : ( ( p1 : number , p2 : number ) => void ) | null ,
70- private connectionFactory_ : ( ) => Connection
72+ private connectionFactory_ : ( ) => Connection < I >
7173 ) {
7274 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 ;
7476 this . reject_ = reject ;
7577 this . start_ ( ) ;
7678 } ) ;
@@ -135,17 +137,14 @@ class NetworkRequest<T> implements Request<T> {
135137 */
136138 const backoffDone : (
137139 requestWentThrough : boolean ,
138- status : RequestEndStatus
140+ status : RequestEndStatus < I >
139141 ) => void = ( requestWentThrough , status ) => {
140142 const resolve = this . resolve_ ;
141143 const reject = this . reject_ ;
142- const connection = status . connection as Connection ;
144+ const connection = status . connection as Connection < I > ;
143145 if ( status . wasSuccessCode ) {
144146 try {
145- const result = this . callback_ (
146- connection ,
147- connection . getResponseText ( )
148- ) ;
147+ const result = this . callback_ ( connection , connection . getResponse ( ) ) ;
149148 if ( isJustDef ( result ) ) {
150149 resolve ( result ) ;
151150 } else {
@@ -157,7 +156,7 @@ class NetworkRequest<T> implements Request<T> {
157156 } else {
158157 if ( connection !== null ) {
159158 const err = unknown ( ) ;
160- err . serverResponse = connection . getResponseText ( ) ;
159+ err . serverResponse = connection . getErrorText ( ) ;
161160 if ( this . errorCallback_ ) {
162161 reject ( this . errorCallback_ ( connection , err ) ) ;
163162 } else {
@@ -182,7 +181,7 @@ class NetworkRequest<T> implements Request<T> {
182181 }
183182
184183 /** @inheritDoc */
185- getPromise ( ) : Promise < T > {
184+ getPromise ( ) : Promise < O > {
186185 return this . promise_ ;
187186 }
188187
@@ -219,15 +218,15 @@ class NetworkRequest<T> implements Request<T> {
219218 * A collection of information about the result of a network request.
220219 * @param opt_canceled - Defaults to false.
221220 */
222- export class RequestEndStatus {
221+ export class RequestEndStatus < I extends ConnectionType > {
223222 /**
224223 * True if the request was canceled.
225224 */
226225 canceled : boolean ;
227226
228227 constructor (
229228 public wasSuccessCode : boolean ,
230- public connection : Connection | null ,
229+ public connection : Connection < I > | null ,
231230 canceled ?: boolean
232231 ) {
233232 this . canceled = ! ! canceled ;
@@ -266,22 +265,22 @@ export function addAppCheckHeader_(
266265 }
267266}
268267
269- export function makeRequest < T > (
270- requestInfo : RequestInfo < T > ,
268+ export function makeRequest < I extends ConnectionType , O > (
269+ requestInfo : RequestInfo < I , O > ,
271270 appId : string | null ,
272271 authToken : string | null ,
273272 appCheckToken : string | null ,
274- requestFactory : ( ) => Connection ,
273+ requestFactory : ( ) => Connection < I > ,
275274 firebaseVersion ?: string
276- ) : Request < T > {
275+ ) : Request < O > {
277276 const queryPart = makeQueryString ( requestInfo . urlParams ) ;
278277 const url = requestInfo . url + queryPart ;
279278 const headers = Object . assign ( { } , requestInfo . headers ) ;
280279 addGmpidHeader_ ( headers , appId ) ;
281280 addAuthHeader_ ( headers , authToken ) ;
282281 addVersionHeader_ ( headers , firebaseVersion ) ;
283282 addAppCheckHeader_ ( headers , appCheckToken ) ;
284- return new NetworkRequest < T > (
283+ return new NetworkRequest < I , O > (
285284 url ,
286285 requestInfo . method ,
287286 headers ,
0 commit comments