11import { print } from 'graphql' ;
2- import { HttpClient } from '@angular/common/http' ;
2+ import { HttpClient , HttpResponse , HttpEvent , HttpEventType } from '@angular/common/http' ;
33import { Injectable } from '@angular/core' ;
44import {
55 ApolloLink ,
66 FetchResult ,
77 Observable as LinkObservable ,
8- Operation ,
8+ Operation
99} from '@apollo/client/core' ;
1010import { pick } from './http-batch-link' ;
11- import { Body , Context , OperationPrinter , Options , Request } from './types' ;
11+ import { Body , Context , HttpClientReturn , OperationPrinter , Options , Request } from './types' ;
1212import { createHeadersWithClientAwareness , fetch , mergeHeaders } from './utils' ;
1313
1414// XXX find a better name for it
@@ -57,6 +57,9 @@ export class HttpLinkHandler extends ApolloLink {
5757 withCredentials,
5858 useMultipart,
5959 headers : this . options . headers ,
60+ observe : context . observe ,
61+ reportProgress : context . reportProgress ,
62+ responseType : context . responseType
6063 } ,
6164 } ;
6265
@@ -73,9 +76,23 @@ export class HttpLinkHandler extends ApolloLink {
7376 req . options . headers = mergeHeaders ( req . options . headers , headers ) ;
7477
7578 const sub = fetch ( req , this . httpClient , this . options . extractFiles ) . subscribe ( {
76- next : response => {
79+ next : ( response : HttpClientReturn ) => {
7780 operation . setContext ( { response } ) ;
78- observer . next ( response . body ) ;
81+
82+ if ( context . responseType === 'blob' ||
83+ context . responseType === 'arraybuffer' ||
84+ context . responseType === 'text' ) {
85+ observer . next ( response ) ;
86+ return ;
87+ }
88+
89+ if ( response instanceof HttpResponse ) {
90+ observer . next ( response . body ) ;
91+ } else if ( this . isHttpEvent ( response ) ) {
92+ this . handleHttpEvent ( response , observer ) ;
93+ } else {
94+ observer . next ( response ) ;
95+ }
7996 } ,
8097 error : err => observer . error ( err ) ,
8198 complete : ( ) => observer . complete ( ) ,
@@ -92,6 +109,42 @@ export class HttpLinkHandler extends ApolloLink {
92109 public request ( op : Operation ) : LinkObservable < FetchResult > | null {
93110 return this . requester ( op ) ;
94111 }
112+
113+ private isHttpEvent ( response : HttpClientReturn ) : response is HttpEvent < any > {
114+ return typeof response === 'object' && response !== null && 'type' in response ;
115+ }
116+
117+ private handleHttpEvent ( event : HttpEvent < any > , observer : any ) {
118+ switch ( event . type ) {
119+ case HttpEventType . Response :
120+ if ( event instanceof HttpResponse ) {
121+ observer . next ( event . body ) ;
122+ }
123+ break ;
124+ case HttpEventType . DownloadProgress :
125+ case HttpEventType . UploadProgress :
126+ observer . next ( {
127+ data : null ,
128+ extensions : {
129+ httpEvent : {
130+ type : event . type ,
131+ loaded : 'loaded' in event ? event . loaded : undefined ,
132+ total : 'total' in event ? event . total : undefined
133+ }
134+ }
135+ } ) ;
136+ break ;
137+ default :
138+ observer . next ( {
139+ data : null ,
140+ extensions : {
141+ httpEvent : {
142+ type : event . type
143+ }
144+ }
145+ } ) ;
146+ }
147+ }
95148}
96149
97150@Injectable ( {
0 commit comments