UNPKG

apollo-link-dedup

Version:

Deduplicates queries that are currently on the wire

1 lines 4.81 kB
{"version":3,"file":"bundle.umd.js","sources":["../src/dedupLink.ts"],"sourcesContent":["import {\n ApolloLink,\n Operation,\n NextLink,\n FetchResult,\n Observable,\n} from 'apollo-link';\n\n/*\n * Expects context to contain the forceFetch field if no dedup\n */\nexport class DedupLink extends ApolloLink {\n private inFlightRequestObservables: Map<\n string,\n Observable<FetchResult>\n > = new Map();\n private subscribers: Map<string, any> = new Map();\n\n public request(\n operation: Operation,\n forward: NextLink,\n ): Observable<FetchResult> {\n // sometimes we might not want to deduplicate a request, for example when we want to force fetch it.\n if (operation.getContext().forceFetch) {\n return forward(operation);\n }\n\n const key = operation.toKey();\n\n if (!this.inFlightRequestObservables.get(key)) {\n // this is a new request, i.e. we haven't deduplicated it yet\n // call the next link\n const singleObserver = forward(operation);\n let subscription;\n\n const sharedObserver = new Observable(observer => {\n // this will still be called by each subscriber regardless of\n // deduplication status\n if (!this.subscribers.has(key)) this.subscribers.set(key, new Set());\n\n this.subscribers.get(key).add(observer);\n\n if (!subscription) {\n subscription = singleObserver.subscribe({\n next: result => {\n const subscribers = this.subscribers.get(key);\n this.subscribers.delete(key);\n this.inFlightRequestObservables.delete(key);\n if (subscribers) {\n subscribers.forEach(obs => obs.next(result));\n subscribers.forEach(obs => obs.complete());\n }\n },\n error: error => {\n const subscribers = this.subscribers.get(key);\n this.subscribers.delete(key);\n this.inFlightRequestObservables.delete(key);\n if (subscribers) {\n subscribers.forEach(obs => obs.error(error));\n }\n },\n });\n }\n\n return () => {\n if (this.subscribers.has(key)) {\n this.subscribers.get(key).delete(observer);\n if (this.subscribers.get(key).size === 0) {\n this.inFlightRequestObservables.delete(key);\n if (subscription) subscription.unsubscribe();\n }\n }\n };\n });\n\n this.inFlightRequestObservables.set(key, sharedObserver);\n }\n\n // return shared Observable\n return this.inFlightRequestObservables.get(key);\n }\n}\n"],"names":["tslib_1.__extends","Observable","ApolloLink"],"mappings":"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"}