apollo-angular
Version:
Use your GraphQL data in your Angular app, with the Apollo Client
139 lines • 18.5 kB
JavaScript
import { print } from 'graphql';
import { Injectable } from '@angular/core';
import { ApolloLink, Observable as LinkObservable, } from '@apollo/client/core';
import { BatchLink } from '@apollo/client/link/batch';
import { createHeadersWithClientAwareness, 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 {
httpClient;
options;
batcher;
batchInterval;
batchMax;
print = print;
constructor(httpClient, options) {
super();
this.httpClient = httpClient;
this.options = options;
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) {
return operations.reduce((headers, operation) => {
return mergeHeaders(headers, operation.getContext().headers);
}, createHeadersWithClientAwareness({
headers: this.options.headers,
clientAwareness: operations[0]?.getContext()?.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 {
httpClient;
constructor(httpClient) {
this.httpClient = httpClient;
}
create(options) {
return new HttpBatchLinkHandler(this.httpClient, options);
}
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.2", ngImport: i0, type: HttpBatchLink, deps: [{ token: i1.HttpClient }], target: i0.ɵɵFactoryTarget.Injectable });
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.2.2", ngImport: i0, type: HttpBatchLink, providedIn: 'root' });
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.2", ngImport: i0, type: HttpBatchLink, decorators: [{
type: Injectable,
args: [{
providedIn: 'root',
}]
}], ctorParameters: function () { return [{ type: i1.HttpClient }]; } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaHR0cC1iYXRjaC1saW5rLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vaHR0cC9zcmMvaHR0cC1iYXRjaC1saW5rLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFFaEMsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzQyxPQUFPLEVBQ0wsVUFBVSxFQUVWLFVBQVUsSUFBSSxjQUFjLEdBRTdCLE1BQU0scUJBQXFCLENBQUM7QUFDN0IsT0FBTyxFQUFnQixTQUFTLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUVwRSxPQUFPLEVBQUUsZ0NBQWdDLEVBQUUsS0FBSyxFQUFFLFlBQVksRUFBRSxVQUFVLEVBQUUsTUFBTSxTQUFTLENBQUM7OztBQUU1RixNQUFNLFFBQVEsR0FBRztJQUNmLGFBQWEsRUFBRSxFQUFFO0lBQ2pCLFFBQVEsRUFBRSxFQUFFO0lBQ1osR0FBRyxFQUFFLFNBQVM7SUFDZCxNQUFNLEVBQUUsTUFBTTtDQUNmLENBQUM7QUFFRixNQUFNLE9BQU8sb0JBQXFCLFNBQVEsVUFBVTtJQU94QztJQUNBO0lBUEgsT0FBTyxDQUFhO0lBQ25CLGFBQWEsQ0FBUztJQUN0QixRQUFRLENBQVM7SUFDakIsS0FBSyxHQUFxQixLQUFLLENBQUM7SUFFeEMsWUFDVSxVQUFzQixFQUN0QixPQUFxQjtRQUU3QixLQUFLLEVBQUUsQ0FBQztRQUhBLGVBQVUsR0FBVixVQUFVLENBQVk7UUFDdEIsWUFBTyxHQUFQLE9BQU8sQ0FBYztRQUk3QixJQUFJLENBQUMsYUFBYSxHQUFHLE9BQU8sQ0FBQyxhQUFhLElBQUksUUFBUSxDQUFDLGFBQWEsQ0FBQztRQUNyRSxJQUFJLENBQUMsUUFBUSxHQUFHLE9BQU8sQ0FBQyxRQUFRLElBQUksUUFBUSxDQUFDLFFBQVEsQ0FBQztRQUV0RCxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLEVBQUU7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VUFBVSxFQUFFLE1BQU07aUJBQ25CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgcHJpbnQgfSBmcm9tICdncmFwaHFsJztcbmltcG9ydCB7IEh0dHBDbGllbnQsIEh0dHBIZWFkZXJzIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xuaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtcbiAgQXBvbGxvTGluayxcbiAgRmV0Y2hSZXN1bHQsXG4gIE9ic2VydmFibGUgYXMgTGlua09ic2VydmFibGUsXG4gIE9wZXJhdGlvbixcbn0gZnJvbSAnQGFwb2xsby9jbGllbnQvY29yZSc7XG5pbXBvcnQgeyBCYXRjaEhhbmRsZXIsIEJhdGNoTGluayB9IGZyb20gJ0BhcG9sbG8vY2xpZW50L2xpbmsvYmF0Y2gnO1xuaW1wb3J0IHsgQmF0Y2hPcHRpb25zLCBCb2R5LCBDb250ZXh0LCBPcGVyYXRpb25QcmludGVyLCBPcHRpb25zLCBSZXF1ZXN0IH0gZnJvbSAnLi90eXBlcyc7XG5pbXBvcnQgeyBjcmVhdGVIZWFkZXJzV2l0aENsaWVudEF3YXJlbmVzcywgZmV0Y2gsIG1lcmdlSGVhZGVycywgcHJpb3JpdGl6ZSB9IGZyb20gJy4vdXRpbHMnO1xuXG5jb25zdCBkZWZhdWx0cyA9IHtcbiAgYmF0Y2hJbnRlcnZhbDogMTAsXG4gIGJhdGNoTWF4OiAxMCxcbiAgdXJpOiAnZ3JhcGhxbCcsXG4gIG1ldGhvZDogJ1BPU1QnLFxufTtcblxuZXhwb3J0IGNsYXNzIEh0dHBCYXRjaExpbmtIYW5kbGVyIGV4dGVuZHMgQXBvbGxvTGluayB7XG4gIHB1YmxpYyBiYXRjaGVyOiBBcG9sbG9MaW5rO1xuICBwcml2YXRlIGJhdGNoSW50ZXJ2YWw6IG51bWJlcjtcbiAgcHJpdmF0ZSBiYXRjaE1heDogbnVtYmVyO1xuICBwcml2YXRlIHByaW50OiBPcGVyYXRpb25QcmludGVyID0gcHJpbnQ7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBodHRwQ2xpZW50OiBIdHRwQ2xpZW50LFxuICAgIHByaXZhdGUgb3B0aW9uczogQmF0Y2hPcHRpb25zLFxuICApIHtcbiAgICBzdXBlcigpO1xuXG4gICAgdGhpcy5iYXRjaEludGVydmFsID0gb3B0aW9ucy5iYXRjaEludGVydmFsIHx8IGRlZmF1bHRzLmJhdGNoSW50ZXJ2YWw7XG4gICAgdGhpcy5iYXRjaE1heCA9IG9wdGlvbnMuYmF0Y2hNYXggfHwgZGVmYXVsdHMuYmF0Y2hNYXg7XG5cbiAgICBpZiAodGhpcy5vcHRpb25zLm9wZXJhdGlvblByaW50ZXIpIHtcbiAgICAgIHRoaXMucHJpbnQgPSB0aGlzLm9wdGlvbnMub3BlcmF0aW9uUHJpbnRlcjtcbiAgICB9XG5cbiAgICBjb25zdCBiYXRjaEhhbmRsZXI6IEJhdGNoSGFuZGxlciA9IChvcGVyYXRpb25zOiBPcGVyYXRpb25bXSkgPT4ge1xuICAgICAgcmV0dXJuIG5ldyBMaW5rT2JzZXJ2YWJsZSgob2JzZXJ2ZXI6IGFueSkgPT4ge1xuICAgICAgICBjb25zdCBib2R5ID0gdGhpcy5jcmVhdGVCb2R5KG9wZXJhdGlvbnMpO1xuICAgICAgICBjb25zdCBoZWFkZXJzID0gdGhpcy5jcmVhdGVIZWFkZXJzKG9wZXJhdGlvbnMpO1xuICAgICAgICBjb25zdCB7IG1ldGhvZCwgdXJpLCB3aXRoQ3JlZGVudGlhbHMgfSA9IHRoaXMuY3JlYXRlT3B0aW9ucyhvcGVyYXRpb25zKTtcblxuICAgICAgICBpZiAodHlwZW9mIHVyaSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgT3B0aW9uICd1cmknIGlzIGEgZnVuY3Rpb24sIHNob3VsZCBiZSBhIHN0cmluZ2ApO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcmVxOiBSZXF1ZXN0ID0ge1xuICAgICAgICAgIG1ldGhvZCxcbiAgICAgICAgICB1cmw6IHVyaSxcbiAgICAgICAgICBib2R5OiBib2R5LFxuICAgICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICAgIHdpdGhDcmVkZW50aWFscyxcbiAgICAgICAgICAgIGhlYWRlcnMsXG4gICAgICAgICAgfSxcbiAgICAgICAgfTtcblxuICAgICAgICBjb25zdCBzdWIgPSBmZXRjaChyZXEsIHRoaXMuaHR0cENsaWVudCwgKCkgPT4ge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignRmlsZSB1cGxvYWQgaXMgbm90IGF2YWlsYWJsZSB3aGVuIGNvbWJpbmVkIHdpdGggQmF0Y2hpbmcnKTtcbiAgICAgICAgfSkuc3Vic2NyaWJlKHtcbiAgICAgICAgICBuZXh0OiByZXN1bHQgPT4gb2JzZXJ2ZXIubmV4dChyZXN1bHQuYm9keSksXG4gICAgICAgICAgZXJyb3I6IGVyciA9PiBvYnNlcnZlci5lcnJvcihlcnIpLFxuICAgICAgICAgIGNvbXBsZXRlOiAoKSA9PiBvYnNlcnZlci5jb21wbGV0ZSgpLFxuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICAgIGlmICghc3ViLmNsb3NlZCkge1xuICAgICAgICAgICAgc3ViLnVuc3Vic2NyaWJlKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgfSk7XG4gICAgfTtcblxuICAgIGNvbnN0IGJhdGNoS2V5ID1cbiAgICAgIG9wdGlvbnMuYmF0Y2hLZXkgfHxcbiAgICAgICgob3BlcmF0aW9uOiBPcGVyYXRpb24pID0+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY3JlYXRlQmF0Y2hLZXkob3BlcmF0aW9uKTtcbiAgICAgIH0pO1xuXG4gICAgdGhpcy5iYXRjaGVyID0gbmV3IEJhdGNoTGluayh7XG4gICAgICBiYXRjaEludGVydmFsOiB0aGlzLmJhdGNoSW50ZXJ2YWwsXG4gICAgICBiYXRjaE1heDogdGhpcy5iYXRjaE1heCxcbiAgICAgIGJhdGNoS2V5LFxuICAgICAgYmF0Y2hIYW5kbGVyLFxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVPcHRpb25zKG9wZXJhdGlvbnM6IE9wZXJhdGlvbltdKTogT3B0aW9ucyB7XG4gICAgY29uc3QgY29udGV4dDogQ29udGV4dCA9IG9wZXJhdGlvbnNbMF0uZ2V0Q29udGV4dCgpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIG1ldGhvZDogcHJpb3JpdGl6ZShjb250ZXh0Lm1ldGhvZCwgdGhpcy5vcHRpb25zLm1ldGhvZCwgZGVmYXVsdHMubWV0aG9kKSxcbiAgICAgIHVyaTogcHJpb3JpdGl6ZShjb250ZXh0LnVyaSwgdGhpcy5vcHRpb25zLnVyaSwgZGVmYXVsdHMudXJpKSxcbiAgICAgIHdpdGhDcmVkZW50aWFsczogcHJpb3JpdGl6ZShjb250ZXh0LndpdGhDcmVkZW50aWFscywgdGhpcy5vcHRpb25zLndpdGhDcmVkZW50aWFscyksXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlQm9keShvcGVyYXRpb25zOiBPcGVyYXRpb25bXSk6IEJvZHlbXSB7XG4gICAgcmV0dXJuIG9wZXJhdGlvbnMubWFwKG9wZXJhdGlvbiA9PiB7XG4gICAgICBjb25zdCBpbmNsdWRlRXh0ZW5zaW9ucyA9IHByaW9yaXRpemUoXG4gICAgICAgIG9wZXJhdGlvbi5nZXRDb250ZXh0KCkuaW5jbHVkZUV4dGVuc2lvbnMsXG4gICAgICAgIHRoaXMub3B0aW9ucy5pbmNsdWRlRXh0ZW5zaW9ucyxcbiAgICAgICAgZmFsc2UsXG4gICAgICApO1xuICAgICAgY29uc3QgaW5jbHVkZVF1ZXJ5ID0gcHJpb3JpdGl6ZShcbiAgICAgICAgb3BlcmF0aW9uLmdldENvbnRleHQoKS5pbmNsdWRlUXVlcnksXG4gICAgICAgIHRoaXMub3B0aW9ucy5pbmNsdWRlUXVlcnksXG4gICAgICAgIHRydWUsXG4gICAgICApO1xuXG4gICAgICBjb25zdCBib2R5OiBCb2R5ID0ge1xuICAgICAgICBvcGVyYXRpb25OYW1lOiBvcGVyYXRpb24ub3BlcmF0aW9uTmFtZSxcbiAgICAgICAgdmFyaWFibGVzOiBvcGVyYXRpb24udmFyaWFibGVzLFxuICAgICAgfTtcblxuICAgICAgaWYgKGluY2x1ZGVFeHRlbnNpb25zKSB7XG4gICAgICAgIGJvZHkuZXh0ZW5zaW9ucyA9IG9wZXJhdGlvbi5leHRlbnNpb25zO1xuICAgICAgfVxuXG4gICAgICBpZiAoaW5jbHVkZVF1ZXJ5KSB7XG4gICAgICAgIGJvZHkucXVlcnkgPSB0aGlzLnByaW50KG9wZXJhdGlvbi5xdWVyeSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBib2R5O1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVIZWFkZXJzKG9wZXJhdGlvbnM6IE9wZXJhdGlvbltdKTogSHR0cEhlYWRlcnMge1xuICAgIHJldHVybiBvcGVyYXRpb25zLnJlZHVjZShcbiAgICAgIChoZWFkZXJzOiBIdHRwSGVhZGVycywgb3BlcmF0aW9uOiBPcGVyYXRpb24pID0+IHtcbiAgICAgICAgcmV0dXJuIG1lcmdlSGVhZGVycyhoZWFkZXJzLCBvcGVyYXRpb24uZ2V0Q29udGV4dCgpLmhlYWRlcnMpO1xuICAgICAgfSxcbiAgICAgIGNyZWF0ZUhlYWRlcnNXaXRoQ2xpZW50QXdhcmVuZXNzKHtcbiAgICAgICAgaGVhZGVyczogdGhpcy5vcHRpb25zLmhlYWRlcnMsXG4gICAgICAgIGNsaWVudEF3YXJlbmVzczogb3BlcmF0aW9uc1swXT8uZ2V0Q29udGV4dCgpPy5jbGllbnRBd2FyZW5lc3MsXG4gICAgICB9KSxcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVCYXRjaEtleShvcGVyYXRpb246IE9wZXJhdGlvbik6IHN0cmluZyB7XG4gICAgY29uc3QgY29udGV4dDogQ29udGV4dCAmIHsgc2tpcEJhdGNoaW5nPzogYm9vbGVhbiB9ID0gb3BlcmF0aW9uLmdldENvbnRleHQoKTtcblxuICAgIGlmIChjb250ZXh0LnNraXBCYXRjaGluZykge1xuICAgICAgcmV0dXJuIE1hdGgucmFuZG9tKCkudG9TdHJpbmcoMzYpLnN1YnN0cigyLCA5KTtcbiAgICB9XG5cbiAgICBjb25zdCBoZWFkZXJzID1cbiAgICAgIGNvbnRleHQuaGVhZGVycyAmJiBjb250ZXh0LmhlYWRlcnMua2V5cygpLm1hcCgoazogc3RyaW5nKSA9PiBjb250ZXh0LmhlYWRlcnMuZ2V0KGspKTtcblxuICAgIGNvbnN0IG9wdHMgPSBKU09OLnN0cmluZ2lmeSh7XG4gICAgICBpbmNsdWRlUXVlcnk6IGNvbnRleHQuaW5jbHVkZVF1ZXJ5LFxuICAgICAgaW5jbHVkZUV4dGVuc2lvbnM6IGNvbnRleHQuaW5jbHVkZUV4dGVuc2lvbnMsXG4gICAgICBoZWFkZXJzLFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHByaW9yaXRpemUoY29udGV4dC51cmksIHRoaXMub3B0aW9ucy51cmkpICsgb3B0cztcbiAgfVxuXG4gIHB1YmxpYyByZXF1ZXN0KG9wOiBPcGVyYXRpb24pOiBMaW5rT2JzZXJ2YWJsZTxGZXRjaFJlc3VsdD4gfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5iYXRjaGVyLnJlcXVlc3Qob3ApO1xuICB9XG59XG5cbkBJbmplY3RhYmxlKHtcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnLFxufSlcbmV4cG9ydCBjbGFzcyBIdHRwQmF0Y2hMaW5rIHtcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBodHRwQ2xpZW50OiBIdHRwQ2xpZW50KSB7fVxuXG4gIHB1YmxpYyBjcmVhdGUob3B0aW9uczogQmF0Y2hPcHRpb25zKTogSHR0cEJhdGNoTGlua0hhbmRsZXIge1xuICAgIHJldHVybiBuZXcgSHR0cEJhdGNoTGlua0hhbmRsZXIodGhpcy5odHRwQ2xpZW50LCBvcHRpb25zKTtcbiAgfVxufVxuIl19