UnsafeCachePlugin.js 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. /*
  2. MIT License http://www.opensource.org/licenses/mit-license.php
  3. Author Tobias Koppers @sokra
  4. */
  5. "use strict";
  6. /** @typedef {import("./Resolver")} Resolver */
  7. /** @typedef {import("./Resolver").ResolveRequest} ResolveRequest */
  8. /** @typedef {import("./Resolver").ResolveStepHook} ResolveStepHook */
  9. /** @typedef {{[k: string]: any}} Cache */
  10. function getCacheId(request, withContext) {
  11. return JSON.stringify({
  12. context: withContext ? request.context : "",
  13. path: request.path,
  14. query: request.query,
  15. fragment: request.fragment,
  16. request: request.request
  17. });
  18. }
  19. module.exports = class UnsafeCachePlugin {
  20. /**
  21. * @param {string | ResolveStepHook} source source
  22. * @param {function(ResolveRequest): boolean} filterPredicate filterPredicate
  23. * @param {Cache} cache cache
  24. * @param {boolean} withContext withContext
  25. * @param {string | ResolveStepHook} target target
  26. */
  27. constructor(source, filterPredicate, cache, withContext, target) {
  28. this.source = source;
  29. this.filterPredicate = filterPredicate;
  30. this.withContext = withContext;
  31. this.cache = cache;
  32. this.target = target;
  33. }
  34. /**
  35. * @param {Resolver} resolver the resolver
  36. * @returns {void}
  37. */
  38. apply(resolver) {
  39. const target = resolver.ensureHook(this.target);
  40. resolver
  41. .getHook(this.source)
  42. .tapAsync("UnsafeCachePlugin", (request, resolveContext, callback) => {
  43. if (!this.filterPredicate(request)) return callback();
  44. const cacheId = getCacheId(request, this.withContext);
  45. const cacheEntry = this.cache[cacheId];
  46. if (cacheEntry) {
  47. return callback(null, cacheEntry);
  48. }
  49. resolver.doResolve(
  50. target,
  51. request,
  52. null,
  53. resolveContext,
  54. (err, result) => {
  55. if (err) return callback(err);
  56. if (result) return callback(null, (this.cache[cacheId] = result));
  57. callback();
  58. }
  59. );
  60. });
  61. }
  62. };