apollo-angular-link-http
Version:
An Apollo Link to allow sending a single http request per operation.
82 lines • 10.7 kB
JavaScript
import * as tslib_1 from "tslib";
import { Injectable } from '@angular/core';
import { HttpClient } from '@angular/common/http';
import { ApolloLink, Observable as LinkObservable, } from 'apollo-link';
import { print } from 'graphql';
import { fetch, mergeHeaders, prioritize, } from 'apollo-angular-link-http-common';
import { extractFiles } from 'extract-files';
// XXX find a better name for it
export class HttpLinkHandler extends ApolloLink {
constructor(httpClient, options) {
super();
this.httpClient = httpClient;
this.options = options;
this.requester = (operation) => new LinkObservable((observer) => {
const context = operation.getContext();
// decides which value to pick, Context, Options or to just use the default
const pick = (key, init) => {
return prioritize(context[key], this.options[key], init);
};
const includeQuery = pick('includeQuery', true);
const includeExtensions = pick('includeExtensions', false);
const method = pick('method', 'POST');
const url = pick('uri', 'graphql');
const withCredentials = pick('withCredentials');
const useMultipart = pick('useMultipart');
const req = {
method,
url: typeof url === 'function' ? url(operation) : url,
body: {
operationName: operation.operationName,
variables: operation.variables,
},
options: {
withCredentials,
useMultipart,
headers: this.options.headers,
},
};
if (includeExtensions) {
req.body.extensions = operation.extensions;
}
if (includeQuery) {
req.body.query = print(operation.query);
}
if (context.headers) {
req.options.headers = mergeHeaders(req.options.headers, context.headers);
}
const sub = fetch(req, this.httpClient, extractFiles).subscribe({
next: response => {
operation.setContext({ response });
observer.next(response.body);
},
error: err => observer.error(err),
complete: () => observer.complete(),
});
return () => {
if (!sub.closed) {
sub.unsubscribe();
}
};
});
}
request(op) {
return this.requester(op);
}
}
let HttpLink = class HttpLink {
constructor(httpClient) {
this.httpClient = httpClient;
}
create(options) {
return new HttpLinkHandler(this.httpClient, options);
}
};
HttpLink.ctorParameters = () => [
{ type: HttpClient }
];
HttpLink = tslib_1.__decorate([
Injectable()
], HttpLink);
export { HttpLink };
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiSHR0cExpbmsuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9hcG9sbG8tYW5ndWxhci1saW5rLWh0dHAvIiwic291cmNlcyI6WyJIdHRwTGluay50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFDLFVBQVUsRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUN6QyxPQUFPLEVBQUMsVUFBVSxFQUFDLE1BQU0sc0JBQXNCLENBQUM7QUFDaEQsT0FBTyxFQUNMLFVBQVUsRUFDVixVQUFVLElBQUksY0FBYyxHQUc3QixNQUFNLGFBQWEsQ0FBQztBQUNyQixPQUFPLEVBQUMsS0FBSyxFQUFDLE1BQU0sU0FBUyxDQUFDO0FBQzlCLE9BQU8sRUFDTCxLQUFLLEVBS0wsWUFBWSxFQUNaLFVBQVUsR0FDWCxNQUFNLGlDQUFpQyxDQUFDO0FBQ3pDLE9BQU8sRUFBQyxZQUFZLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFFM0MsZ0NBQWdDO0FBQ2hDLE1BQU0sT0FBTyxlQUFnQixTQUFRLFVBQVU7SUFLN0MsWUFBb0IsVUFBc0IsRUFBVSxPQUFnQjtRQUNsRSxLQUFLLEVBQUUsQ0FBQztRQURVLGVBQVUsR0FBVixVQUFVLENBQVk7UUFBVSxZQUFPLEdBQVAsT0FBTyxDQUFTO1FBR2xFLElBQUksQ0FBQyxTQUFTLEdBQUcsQ0FBQyxTQUFvQixFQUFFLEVBQUUsQ0FDeEMsSUFBSSxjQUFjLENBQUMsQ0FBQyxRQUFhLEVBQUUsRUFBRTtZQUNuQyxNQUFNLE9BQU8sR0FBWSxTQUFTLENBQUMsVUFBVSxFQUFFLENBQUM7WUFFaEQsMkVBQTJFO1lBQzNFLE1BQU0sSUFBSSxHQUFHLENBQ1gsR0FBTSxFQUNOLElBQThCLEVBQ0wsRUFBRTtnQkFDM0IsT0FBTyxVQUFVLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUM7WUFDM0QsQ0FBQyxDQUFDO1lBRUYsTUFBTSxZQUFZLEdBQUcsSUFB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ZWN0YWJsZX0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge0h0dHBDbGllbnR9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcbmltcG9ydCB7XG4gIEFwb2xsb0xpbmssXG4gIE9ic2VydmFibGUgYXMgTGlua09ic2VydmFibGUsXG4gIE9wZXJhdGlvbixcbiAgRmV0Y2hSZXN1bHQsXG59IGZyb20gJ2Fwb2xsby1saW5rJztcbmltcG9ydCB7cHJpbnR9IGZyb20gJ2dyYXBocWwnO1xuaW1wb3J0IHtcbiAgZmV0Y2gsXG4gIE9wdGlvbnMsXG4gIEJvZHksXG4gIFJlcXVlc3QsXG4gIENvbnRleHQsXG4gIG1lcmdlSGVhZGVycyxcbiAgcHJpb3JpdGl6ZSxcbn0gZnJvbSAnYXBvbGxvLWFuZ3VsYXItbGluay1odHRwLWNvbW1vbic7XG5pbXBvcnQge2V4dHJhY3RGaWxlc30gZnJvbSAnZXh0cmFjdC1maWxlcyc7XG5cbi8vIFhYWCBmaW5kIGEgYmV0dGVyIG5hbWUgZm9yIGl0XG5leHBvcnQgY2xhc3MgSHR0cExpbmtIYW5kbGVyIGV4dGVuZHMgQXBvbGxvTGluayB7XG4gIHB1YmxpYyByZXF1ZXN0ZXI6IChcbiAgICBvcGVyYXRpb246IE9wZXJhdGlvbixcbiAgKSA9PiBMaW5rT2JzZXJ2YWJsZTxGZXRjaFJlc3VsdD4gfCBudWxsO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgaHR0cENsaWVudDogSHR0cENsaWVudCwgcHJpdmF0ZSBvcHRpb25zOiBPcHRpb25zKSB7XG4gICAgc3VwZXIoKTtcblxuICAgIHRoaXMucmVxdWVzdGVyID0gKG9wZXJhdGlvbjogT3BlcmF0aW9uKSA9PlxuICAgICAgbmV3IExpbmtPYnNlcnZhYmxlKChvYnNlcnZlcjogYW55KSA9PiB7XG4gICAgICAgIGNvbnN0IGNvbnRleHQ6IENvbnRleHQgPSBvcGVyYXRpb24uZ2V0Q29udGV4dCgpO1xuXG4gICAgICAgIC8vIGRlY2lkZXMgd2hpY2ggdmFsdWUgdG8gcGljaywgQ29udGV4dCwgT3B0aW9ucyBvciB0byBqdXN0IHVzZSB0aGUgZGVmYXVsdFxuICAgICAgICBjb25zdCBwaWNrID0gPEsgZXh0ZW5kcyBrZXlvZiBDb250ZXh0IHwga2V5b2YgT3B0aW9ucz4oXG4gICAgICAgICAga2V5OiBLLFxuICAgICAgICAgIGluaXQ/OiBDb250ZXh0W0tdIHwgT3B0aW9uc1tLXSxcbiAgICAgICAgKTogQ29udGV4dFtLXSB8IE9wdGlvbnNbS10gPT4ge1xuICAgICAgICAgIHJldHVybiBwcmlvcml0aXplKGNvbnRleHRba2V5XSwgdGhpcy5vcHRpb25zW2tleV0sIGluaXQpO1xuICAgICAgICB9O1xuXG4gICAgICAgIGNvbnN0IGluY2x1ZGVRdWVyeSA9IHBpY2soJ2luY2x1ZGVRdWVyeScsIHRydWUpO1xuICAgICAgICBjb25zdCBpbmNsdWRlRXh0ZW5zaW9ucyA9IHBpY2soJ2luY2x1ZGVFeHRlbnNpb25zJywgZmFsc2UpO1xuICAgICAgICBjb25zdCBtZXRob2QgPSBwaWNrKCdtZXRob2QnLCAnUE9TVCcpO1xuICAgICAgICBjb25zdCB1cmwgPSBwaWNrKCd1cmknLCAnZ3JhcGhxbCcpO1xuICAgICAgICBjb25zdCB3aXRoQ3JlZGVudGlhbHMgPSBwaWNrKCd3aXRoQ3JlZGVudGlhbHMnKTtcbiAgICAgICAgY29uc3QgdXNlTXVsdGlwYXJ0ID0gcGljaygndXNlTXVsdGlwYXJ0Jyk7XG5cbiAgICAgICAgY29uc3QgcmVxOiBSZXF1ZXN0ID0ge1xuICAgICAgICAgIG1ldGhvZCxcbiAgICAgICAgICB1cmw6IHR5cGVvZiB1cmwgPT09ICdmdW5jdGlvbicgPyB1cmwob3BlcmF0aW9uKSA6IHVybCxcbiAgICAgICAgICBib2R5OiB7XG4gICAgICAgICAgICBvcGVyYXRpb25OYW1lOiBvcGVyYXRpb24ub3BlcmF0aW9uTmFtZSxcbiAgICAgICAgICAgIHZhcmlhYmxlczogb3BlcmF0aW9uLnZhcmlhYmxlcyxcbiAgICAgICAgICB9LFxuICAgICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICAgIHdpdGhDcmVkZW50aWFscyxcbiAgICAgICAgICAgIHVzZU11bHRpcGFydCxcbiAgICAgICAgICAgIGhlYWRlcnM6IHRoaXMub3B0aW9ucy5oZWFkZXJzLFxuICAgICAgICAgIH0sXG4gICAgICAgIH07XG5cbiAgICAgICAgaWYgKGluY2x1ZGVFeHRlbnNpb25zKSB7XG4gICAgICAgICAgKHJlcS5ib2R5IGFzIEJvZHkpLmV4dGVuc2lvbnMgPSBvcGVyYXRpb24uZXh0ZW5zaW9ucztcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChpbmNsdWRlUXVlcnkpIHtcbiAgICAgICAgICAocmVxLmJvZHkgYXMgQm9keSkucXVlcnkgPSBwcmludChvcGVyYXRpb24ucXVlcnkpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNvbnRleHQuaGVhZGVycykge1xuICAgICAgICAgIHJlcS5vcHRpb25zLmhlYWRlcnMgPSBtZXJnZUhlYWRlcnMoXG4gICAgICAgICAgICByZXEub3B0aW9ucy5oZWFkZXJzLFxuICAgICAgICAgICAgY29udGV4dC5oZWFkZXJzLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBzdWIgPSBmZXRjaChyZXEsIHRoaXMuaHR0cENsaWVudCwgZXh0cmFjdEZpbGVzKS5zdWJzY3JpYmUoe1xuICAgICAgICAgIG5leHQ6IHJlc3BvbnNlID0+IHtcbiAgICAgICAgICAgIG9wZXJhdGlvbi5zZXRDb250ZXh0KHtyZXNwb25zZX0pO1xuICAgICAgICAgICAgb2JzZXJ2ZXIubmV4dChyZXNwb25zZS5ib2R5KTtcbiAgICAgICAgICB9LFxuICAgICAgICAgIGVycm9yOiBlcnIgPT4gb2JzZXJ2ZXIuZXJyb3IoZXJyKSxcbiAgICAgICAgICBjb21wbGV0ZTogKCkgPT4gb2JzZXJ2ZXIuY29tcGxldGUoKSxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgICBpZiAoIXN1Yi5jbG9zZWQpIHtcbiAgICAgICAgICAgIHN1Yi51bnN1YnNjcmliZSgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgIH0pO1xuICB9XG5cbiAgcHVibGljIHJlcXVlc3Qob3A6IE9wZXJhdGlvbik6IExpbmtPYnNlcnZhYmxlPEZldGNoUmVzdWx0PiB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLnJlcXVlc3RlcihvcCk7XG4gIH1cbn1cblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIEh0dHBMaW5rIHtcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBodHRwQ2xpZW50OiBIdHRwQ2xpZW50KSB7fVxuXG4gIHB1YmxpYyBjcmVhdGUob3B0aW9uczogT3B0aW9ucyk6IEh0dHBMaW5rSGFuZGxlciB7XG4gICAgcmV0dXJuIG5ldyBIdHRwTGlua0hhbmRsZXIodGhpcy5odHRwQ2xpZW50LCBvcHRpb25zKTtcbiAgfVxufVxuIl19