apollo-link-dedup
Version:
Deduplicates queries that are currently on the wire
1 lines • 4.77 kB
Source Map (JSON)
{"version":3,"file":"bundle.esm.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"],"mappings":"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"}