apollo-angular
Version:
Use your GraphQL data in your Angular app, with the Apollo Client
137 lines • 18.4 kB
JavaScript
import { Injectable } from '@angular/core';
import { HttpClient } from '@angular/common/http';
import { ApolloLink, Observable as LinkObservable, } from '@apollo/client/core';
import { BatchLink } from '@apollo/client/link/batch';
import { print } from 'graphql';
import { createHeadersWithClientAwereness, fetch, mergeHeaders, prioritize, } from './utils';
import * as i0 from "@angular/core";
import * as i1 from "@angular/common/http";
const defaults = {
batchInterval: 10,
batchMax: 10,
uri: 'graphql',
method: 'POST',
};
export class HttpBatchLinkHandler extends ApolloLink {
constructor(httpClient, options) {
super();
this.httpClient = httpClient;
this.options = options;
this.print = print;
this.batchInterval = options.batchInterval || defaults.batchInterval;
this.batchMax = options.batchMax || defaults.batchMax;
if (this.options.operationPrinter) {
this.print = this.options.operationPrinter;
}
const batchHandler = (operations) => {
return new LinkObservable((observer) => {
const body = this.createBody(operations);
const headers = this.createHeaders(operations);
const { method, uri, withCredentials } = this.createOptions(operations);
if (typeof uri === 'function') {
throw new Error(`Option 'uri' is a function, should be a string`);
}
const req = {
method,
url: uri,
body: body,
options: {
withCredentials,
headers,
},
};
const sub = fetch(req, this.httpClient, () => {
throw new Error('File upload is not available when combined with Batching');
}).subscribe({
next: (result) => observer.next(result.body),
error: (err) => observer.error(err),
complete: () => observer.complete(),
});
return () => {
if (!sub.closed) {
sub.unsubscribe();
}
};
});
};
const batchKey = options.batchKey ||
((operation) => {
return this.createBatchKey(operation);
});
this.batcher = new BatchLink({
batchInterval: this.batchInterval,
batchMax: this.batchMax,
batchKey,
batchHandler,
});
}
createOptions(operations) {
const context = operations[0].getContext();
return {
method: prioritize(context.method, this.options.method, defaults.method),
uri: prioritize(context.uri, this.options.uri, defaults.uri),
withCredentials: prioritize(context.withCredentials, this.options.withCredentials),
};
}
createBody(operations) {
return operations.map((operation) => {
const includeExtensions = prioritize(operation.getContext().includeExtensions, this.options.includeExtensions, false);
const includeQuery = prioritize(operation.getContext().includeQuery, this.options.includeQuery, true);
const body = {
operationName: operation.operationName,
variables: operation.variables,
};
if (includeExtensions) {
body.extensions = operation.extensions;
}
if (includeQuery) {
body.query = this.print(operation.query);
}
return body;
});
}
createHeaders(operations) {
var _a, _b;
return operations.reduce((headers, operation) => {
return mergeHeaders(headers, operation.getContext().headers);
}, createHeadersWithClientAwereness({
headers: this.options.headers,
clientAwareness: (_b = (_a = operations[0]) === null || _a === void 0 ? void 0 : _a.getContext()) === null || _b === void 0 ? void 0 : _b.clientAwareness,
}));
}
createBatchKey(operation) {
const context = operation.getContext();
if (context.skipBatching) {
return Math.random().toString(36).substr(2, 9);
}
const headers = context.headers &&
context.headers.keys().map((k) => context.headers.get(k));
const opts = JSON.stringify({
includeQuery: context.includeQuery,
includeExtensions: context.includeExtensions,
headers,
});
return prioritize(context.uri, this.options.uri) + opts;
}
request(op) {
return this.batcher.request(op);
}
}
export class HttpBatchLink {
constructor(httpClient) {
this.httpClient = httpClient;
}
create(options) {
return new HttpBatchLinkHandler(this.httpClient, options);
}
}
HttpBatchLink.ɵprov = i0.ɵɵdefineInjectable({ factory: function HttpBatchLink_Factory() { return new HttpBatchLink(i0.ɵɵinject(i1.HttpClient)); }, token: HttpBatchLink, providedIn: "root" });
HttpBatchLink.decorators = [
{ type: Injectable, args: [{
providedIn: 'root',
},] }
];
HttpBatchLink.ctorParameters = () => [
{ type: HttpClient }
];
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaHR0cC1iYXRjaC1saW5rLmpzIiwic291cmNlUm9vdCI6Ii93b3Jrc3BhY2VzL2Fwb2xsby1hbmd1bGFyL3BhY2thZ2VzL2Fwb2xsby1hbmd1bGFyL2h0dHAvc3JjLyIsInNvdXJjZXMiOlsiaHR0cC1iYXRjaC1saW5rLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBQyxVQUFVLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDekMsT0FBTyxFQUFDLFVBQVUsRUFBYyxNQUFNLHNCQUFzQixDQUFDO0FBQzdELE9BQU8sRUFDTCxVQUFVLEVBQ1YsVUFBVSxJQUFJLGNBQWMsR0FHN0IsTUFBTSxxQkFBcUIsQ0FBQztBQUM3QixPQUFPLEVBQUMsU0FBUyxFQUFlLE1BQU0sMkJBQTJCLENBQUM7QUFDbEUsT0FBTyxFQUFDLEtBQUssRUFBQyxNQUFNLFNBQVMsQ0FBQztBQUU5QixPQUFPLEVBQ0wsZ0NBQWdDLEVBQ2hDLEtBQUssRUFDTCxZQUFZLEVBQ1osVUFBVSxHQUNYLE1BQU0sU0FBUyxDQUFDOzs7QUFJakIsTUFBTSxRQUFRLEdBQUc7SUFDZixhQUFhLEVBQUUsRUFBRTtJQUNqQixRQUFRLEVBQUUsRUFBRTtJQUNaLEdBQUcsRUFBRSxTQUFTO0lBQ2QsTUFBTSxFQUFFLE1BQU07Q0FDZixDQUFDO0FBRUYsTUFBTSxPQUFPLG9CQUFxQixTQUFRLFVBQVU7SUFNbEQsWUFBb0IsVUFBc0IsRUFBVSxPQUFxQjtRQUN2RSxLQUFLLEVBQUUsQ0FBQztRQURVLGVBQVUsR0FBVixVQUFVLENBQVk7UUFBVSxZQUFPLEdBQVAsT0FBTyxDQUFjO1FBRmpFLFVBQUssR0FBcUIsS0FBSyxDQUFDO1FBS3RDLElBQUksQ0FBQyxhQUFhLEdBQUcsT0FBTyxDQUFDLGFBQWEsSUFBSSxRQUFRLENBQUMsYUFBYSxDQUFDO1FBQ3JFLElBQUksQ0FBQyxRQUFRLEdBQUcsT0FBTyxDQUFDLFFBQVEsSUFBSSxRQUFRLENBQUMsUUFBUSxDQUFDO1FBRXRELElBQUksSUFBSSxD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RSxNQUFNO2FBQ25COzs7WUFoTE8sVUFBVSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7SW5qZWN0YWJsZX0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge0h0dHBDbGllbnQsIEh0dHBIZWFkZXJzfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XG5pbXBvcnQge1xuICBBcG9sbG9MaW5rLFxuICBPYnNlcnZhYmxlIGFzIExpbmtPYnNlcnZhYmxlLFxuICBPcGVyYXRpb24sXG4gIEZldGNoUmVzdWx0LFxufSBmcm9tICdAYXBvbGxvL2NsaWVudC9jb3JlJztcbmltcG9ydCB7QmF0Y2hMaW5rLCBCYXRjaEhhbmRsZXJ9IGZyb20gJ0BhcG9sbG8vY2xpZW50L2xpbmsvYmF0Y2gnO1xuaW1wb3J0IHtwcmludH0gZnJvbSAnZ3JhcGhxbCc7XG5pbXBvcnQge0JvZHksIENvbnRleHQsIFJlcXVlc3QsIE9wdGlvbnMsIE9wZXJhdGlvblByaW50ZXJ9IGZyb20gJy4vdHlwZXMnO1xuaW1wb3J0IHtcbiAgY3JlYXRlSGVhZGVyc1dpdGhDbGllbnRBd2VyZW5lc3MsXG4gIGZldGNoLFxuICBtZXJnZUhlYWRlcnMsXG4gIHByaW9yaXRpemUsXG59IGZyb20gJy4vdXRpbHMnO1xuXG5pbXBvcnQge0JhdGNoT3B0aW9uc30gZnJvbSAnLi90eXBlcyc7XG5cbmNvbnN0IGRlZmF1bHRzID0ge1xuICBiYXRjaEludGVydmFsOiAxMCxcbiAgYmF0Y2hNYXg6IDEwLFxuICB1cmk6ICdncmFwaHFsJyxcbiAgbWV0aG9kOiAnUE9TVCcsXG59O1xuXG5leHBvcnQgY2xhc3MgSHR0cEJhdGNoTGlua0hhbmRsZXIgZXh0ZW5kcyBBcG9sbG9MaW5rIHtcbiAgcHVibGljIGJhdGNoZXI6IEFwb2xsb0xpbms7XG4gIHByaXZhdGUgYmF0Y2hJbnRlcnZhbDogbnVtYmVyO1xuICBwcml2YXRlIGJhdGNoTWF4OiBudW1iZXI7XG4gIHByaXZhdGUgcHJpbnQ6IE9wZXJhdGlvblByaW50ZXIgPSBwcmludDtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGh0dHBDbGllbnQ6IEh0dHBDbGllbnQsIHByaXZhdGUgb3B0aW9uczogQmF0Y2hPcHRpb25zKSB7XG4gICAgc3VwZXIoKTtcblxuICAgIHRoaXMuYmF0Y2hJbnRlcnZhbCA9IG9wdGlvbnMuYmF0Y2hJbnRlcnZhbCB8fCBkZWZhdWx0cy5iYXRjaEludGVydmFsO1xuICAgIHRoaXMuYmF0Y2hNYXggPSBvcHRpb25zLmJhdGNoTWF4IHx8IGRlZmF1bHRzLmJhdGNoTWF4O1xuXG4gICAgaWYgKHRoaXMub3B0aW9ucy5vcGVyYXRpb25QcmludGVyKSB7XG4gICAgICB0aGlzLnByaW50ID0gdGhpcy5vcHRpb25zLm9wZXJhdGlvblByaW50ZXI7XG4gICAgfVxuXG4gICAgY29uc3QgYmF0Y2hIYW5kbGVyOiBCYXRjaEhhbmRsZXIgPSAob3BlcmF0aW9uczogT3BlcmF0aW9uW10pID0+IHtcbiAgICAgIHJldHVybiBuZXcgTGlua09ic2VydmFibGUoKG9ic2VydmVyOiBhbnkpID0+IHtcbiAgICAgICAgY29uc3QgYm9keSA9IHRoaXMuY3JlYXRlQm9keShvcGVyYXRpb25zKTtcbiAgICAgICAgY29uc3QgaGVhZGVycyA9IHRoaXMuY3JlYXRlSGVhZGVycyhvcGVyYXRpb25zKTtcbiAgICAgICAgY29uc3Qge21ldGhvZCwgdXJpLCB3aXRoQ3JlZGVudGlhbHN9ID0gdGhpcy5jcmVhdGVPcHRpb25zKG9wZXJhdGlvbnMpO1xuXG4gICAgICAgIGlmICh0eXBlb2YgdXJpID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBPcHRpb24gJ3VyaScgaXMgYSBmdW5jdGlvbiwgc2hvdWxkIGJlIGEgc3RyaW5nYCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCByZXE6IFJlcXVlc3QgPSB7XG4gICAgICAgICAgbWV0aG9kLFxuICAgICAgICAgIHVybDogdXJpLFxuICAgICAgICAgIGJvZHk6IGJvZHksXG4gICAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgICAgd2l0aENyZWRlbnRpYWxzLFxuICAgICAgICAgICAgaGVhZGVycyxcbiAgICAgICAgICB9LFxuICAgICAgICB9O1xuXG4gICAgICAgIGNvbnN0IHN1YiA9IGZldGNoKHJlcSwgdGhpcy5odHRwQ2xpZW50LCAoKSA9PiB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgJ0ZpbGUgdXBsb2FkIGlzIG5vdCBhdmFpbGFibGUgd2hlbiBjb21iaW5lZCB3aXRoIEJhdGNoaW5nJyxcbiAgICAgICAgICApO1xuICAgICAgICB9KS5zdWJzY3JpYmUoe1xuICAgICAgICAgIG5leHQ6IChyZXN1bHQpID0+IG9ic2VydmVyLm5leHQocmVzdWx0LmJvZHkpLFxuICAgICAgICAgIGVycm9yOiAoZXJyKSA9PiBvYnNlcnZlci5lcnJvcihlcnIpLFxuICAgICAgICAgIGNvbXBsZXRlOiAoKSA9PiBvYnNlcnZlci5jb21wbGV0ZSgpLFxuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICAgIGlmICghc3ViLmNsb3NlZCkge1xuICAgICAgICAgICAgc3ViLnVuc3Vic2NyaWJlKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgfSk7XG4gICAgfTtcblxuICAgIGNvbnN0IGJhdGNoS2V5ID1cbiAgICAgIG9wdGlvbnMuYmF0Y2hLZXkgfHxcbiAgICAgICgob3BlcmF0aW9uOiBPcGVyYXRpb24pID0+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY3JlYXRlQmF0Y2hLZXkob3BlcmF0aW9uKTtcbiAgICAgIH0pO1xuXG4gICAgdGhpcy5iYXRjaGVyID0gbmV3IEJhdGNoTGluayh7XG4gICAgICBiYXRjaEludGVydmFsOiB0aGlzLmJhdGNoSW50ZXJ2YWwsXG4gICAgICBiYXRjaE1heDogdGhpcy5iYXRjaE1heCxcbiAgICAgIGJhdGNoS2V5LFxuICAgICAgYmF0Y2hIYW5kbGVyLFxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVPcHRpb25zKG9wZXJhdGlvbnM6IE9wZXJhdGlvbltdKTogT3B0aW9ucyB7XG4gICAgY29uc3QgY29udGV4dDogQ29udGV4dCA9IG9wZXJhdGlvbnNbMF0uZ2V0Q29udGV4dCgpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIG1ldGhvZDogcHJpb3JpdGl6ZShjb250ZXh0Lm1ldGhvZCwgdGhpcy5vcHRpb25zLm1ldGhvZCwgZGVmYXVsdHMubWV0aG9kKSxcbiAgICAgIHVyaTogcHJpb3JpdGl6ZShjb250ZXh0LnVyaSwgdGhpcy5vcHRpb25zLnVyaSwgZGVmYXVsdHMudXJpKSxcbiAgICAgIHdpdGhDcmVkZW50aWFsczogcHJpb3JpdGl6ZShcbiAgICAgICAgY29udGV4dC53aXRoQ3JlZGVudGlhbHMsXG4gICAgICAgIHRoaXMub3B0aW9ucy53aXRoQ3JlZGVudGlhbHMsXG4gICAgICApLFxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZUJvZHkob3BlcmF0aW9uczogT3BlcmF0aW9uW10pOiBCb2R5W10ge1xuICAgIHJldHVybiBvcGVyYXRpb25zLm1hcCgob3BlcmF0aW9uKSA9PiB7XG4gICAgICBjb25zdCBpbmNsdWRlRXh0ZW5zaW9ucyA9IHByaW9yaXRpemUoXG4gICAgICAgIG9wZXJhdGlvbi5nZXRDb250ZXh0KCkuaW5jbHVkZUV4dGVuc2lvbnMsXG4gICAgICAgIHRoaXMub3B0aW9ucy5pbmNsdWRlRXh0ZW5zaW9ucyxcbiAgICAgICAgZmFsc2UsXG4gICAgICApO1xuICAgICAgY29uc3QgaW5jbHVkZVF1ZXJ5ID0gcHJpb3JpdGl6ZShcbiAgICAgICAgb3BlcmF0aW9uLmdldENvbnRleHQoKS5pbmNsdWRlUXVlcnksXG4gICAgICAgIHRoaXMub3B0aW9ucy5pbmNsdWRlUXVlcnksXG4gICAgICAgIHRydWUsXG4gICAgICApO1xuXG4gICAgICBjb25zdCBib2R5OiBCb2R5ID0ge1xuICAgICAgICBvcGVyYXRpb25OYW1lOiBvcGVyYXRpb24ub3BlcmF0aW9uTmFtZSxcbiAgICAgICAgdmFyaWFibGVzOiBvcGVyYXRpb24udmFyaWFibGVzLFxuICAgICAgfTtcblxuICAgICAgaWYgKGluY2x1ZGVFeHRlbnNpb25zKSB7XG4gICAgICAgIGJvZHkuZXh0ZW5zaW9ucyA9IG9wZXJhdGlvbi5leHRlbnNpb25zO1xuICAgICAgfVxuXG4gICAgICBpZiAoaW5jbHVkZVF1ZXJ5KSB7XG4gICAgICAgIGJvZHkucXVlcnkgPSB0aGlzLnByaW50KG9wZXJhdGlvbi5xdWVyeSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBib2R5O1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVIZWFkZXJzKG9wZXJhdGlvbnM6IE9wZXJhdGlvbltdKTogSHR0cEhlYWRlcnMge1xuICAgIHJldHVybiBvcGVyYXRpb25zLnJlZHVjZShcbiAgICAgIChoZWFkZXJzOiBIdHRwSGVhZGVycywgb3BlcmF0aW9uOiBPcGVyYXRpb24pID0+IHtcbiAgICAgICAgcmV0dXJuIG1lcmdlSGVhZGVycyhoZWFkZXJzLCBvcGVyYXRpb24uZ2V0Q29udGV4dCgpLmhlYWRlcnMpO1xuICAgICAgfSxcbiAgICAgIGNyZWF0ZUhlYWRlcnNXaXRoQ2xpZW50QXdlcmVuZXNzKHtcbiAgICAgICAgaGVhZGVyczogdGhpcy5vcHRpb25zLmhlYWRlcnMsXG4gICAgICAgIGNsaWVudEF3YXJlbmVzczogb3BlcmF0aW9uc1swXT8uZ2V0Q29udGV4dCgpPy5jbGllbnRBd2FyZW5lc3MsXG4gICAgICB9KSxcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVCYXRjaEtleShvcGVyYXRpb246IE9wZXJhdGlvbik6IHN0cmluZyB7XG4gICAgY29uc3QgY29udGV4dDogQ29udGV4dCAmIHtza2lwQmF0Y2hpbmc/OiBib29sZWFufSA9IG9wZXJhdGlvbi5nZXRDb250ZXh0KCk7XG5cbiAgICBpZiAoY29udGV4dC5za2lwQmF0Y2hpbmcpIHtcbiAgICAgIHJldHVybiBNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKDM2KS5zdWJzdHIoMiwgOSk7XG4gICAgfVxuXG4gICAgY29uc3QgaGVhZGVycyA9XG4gICAgICBjb250ZXh0LmhlYWRlcnMgJiZcbiAgICAgIGNvbnRleHQuaGVhZGVycy5rZXlzKCkubWFwKChrOiBzdHJpbmcpID0+IGNvbnRleHQuaGVhZGVycy5nZXQoaykpO1xuXG4gICAgY29uc3Qgb3B0cyA9IEpTT04uc3RyaW5naWZ5KHtcbiAgICAgIGluY2x1ZGVRdWVyeTogY29udGV4dC5pbmNsdWRlUXVlcnksXG4gICAgICBpbmNsdWRlRXh0ZW5zaW9uczogY29udGV4dC5pbmNsdWRlRXh0ZW5zaW9ucyxcbiAgICAgIGhlYWRlcnMsXG4gICAgfSk7XG5cbiAgICByZXR1cm4gcHJpb3JpdGl6ZShjb250ZXh0LnVyaSwgdGhpcy5vcHRpb25zLnVyaSkgKyBvcHRzO1xuICB9XG5cbiAgcHVibGljIHJlcXVlc3Qob3A6IE9wZXJhdGlvbik6IExpbmtPYnNlcnZhYmxlPEZldGNoUmVzdWx0PiB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLmJhdGNoZXIucmVxdWVzdChvcCk7XG4gIH1cbn1cblxuQEluamVjdGFibGUoe1xuICBwcm92aWRlZEluOiAncm9vdCcsXG59KVxuZXhwb3J0IGNsYXNzIEh0dHBCYXRjaExpbmsge1xuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGh0dHBDbGllbnQ6IEh0dHBDbGllbnQpIHt9XG5cbiAgcHVibGljIGNyZWF0ZShvcHRpb25zOiBCYXRjaE9wdGlvbnMpOiBIdHRwQmF0Y2hMaW5rSGFuZGxlciB7XG4gICAgcmV0dXJuIG5ldyBIdHRwQmF0Y2hMaW5rSGFuZGxlcih0aGlzLmh0dHBDbGllbnQsIG9wdGlvbnMpO1xuICB9XG59XG4iXX0=