11import { print } from 'graphql' ;
2- import { HttpClient } from '@angular/common/http' ;
2+ import { HttpClient , HttpEvent , HttpEventType , HttpResponse } from '@angular/common/http' ;
33import { Injectable } from '@angular/core' ;
44import {
55 ApolloLink ,
88 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,25 @@ 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 (
83+ context . responseType === 'blob' ||
84+ context . responseType === 'arraybuffer' ||
85+ context . responseType === 'text'
86+ ) {
87+ observer . next ( response ) ;
88+ return ;
89+ }
90+
91+ if ( response instanceof HttpResponse ) {
92+ observer . next ( response . body ) ;
93+ } else if ( this . isHttpEvent ( response ) ) {
94+ this . handleHttpEvent ( response , observer ) ;
95+ } else {
96+ observer . next ( response ) ;
97+ }
7998 } ,
8099 error : err => observer . error ( err ) ,
81100 complete : ( ) => observer . complete ( ) ,
@@ -92,6 +111,42 @@ export class HttpLinkHandler extends ApolloLink {
92111 public request ( op : Operation ) : LinkObservable < FetchResult > | null {
93112 return this . requester ( op ) ;
94113 }
114+
115+ private isHttpEvent ( response : HttpClientReturn ) : response is HttpEvent < any > {
116+ return typeof response === 'object' && response !== null && 'type' in response ;
117+ }
118+
119+ private handleHttpEvent ( event : HttpEvent < any > , observer : any ) {
120+ switch ( event . type ) {
121+ case HttpEventType . Response :
122+ if ( event instanceof HttpResponse ) {
123+ observer . next ( event . body ) ;
124+ }
125+ break ;
126+ case HttpEventType . DownloadProgress :
127+ case HttpEventType . UploadProgress :
128+ observer . next ( {
129+ data : null ,
130+ extensions : {
131+ httpEvent : {
132+ type : event . type ,
133+ loaded : 'loaded' in event ? event . loaded : undefined ,
134+ total : 'total' in event ? event . total : undefined ,
135+ } ,
136+ } ,
137+ } ) ;
138+ break ;
139+ default :
140+ observer . next ( {
141+ data : null ,
142+ extensions : {
143+ httpEvent : {
144+ type : event . type ,
145+ } ,
146+ } ,
147+ } ) ;
148+ }
149+ }
95150}
96151
97152@Injectable ( {
0 commit comments