UNPKG

3.07 kBJavaScriptView Raw
1"use strict";
2var __importDefault = (this && this.__importDefault) || function (mod) {
3 return (mod && mod.__esModule) ? mod : { "default": mod };
4};
5Object.defineProperty(exports, "__esModule", { value: true });
6exports.createInflightCacheMiddleware = void 0;
7const clone_1 = __importDefault(require("clone"));
8const json_rpc_engine_1 = require("json-rpc-engine");
9const cache_1 = require("./utils/cache");
10function createInflightCacheMiddleware() {
11 const inflightRequests = {};
12 return json_rpc_engine_1.createAsyncMiddleware(async (req, res, next) => {
13 // allow cach to be skipped if so specified
14 if (req.skipCache) {
15 return next();
16 }
17 // get cacheId, if cacheable
18 const cacheId = cache_1.cacheIdentifierForPayload(req);
19 // if not cacheable, skip
20 if (!cacheId) {
21 return next();
22 }
23 // check for matching requests
24 let activeRequestHandlers = inflightRequests[cacheId];
25 // if found, wait for the active request to be handled
26 if (activeRequestHandlers) {
27 // setup the response listener and wait for it to be called
28 // it will handle copying the result and request fields
29 await createActiveRequestHandler(res, activeRequestHandlers);
30 return undefined;
31 }
32 // setup response handler array for subsequent requests
33 activeRequestHandlers = [];
34 inflightRequests[cacheId] = activeRequestHandlers;
35 // allow request to be handled normally
36 // eslint-disable-next-line node/callback-return
37 await next();
38 // clear inflight requests
39 delete inflightRequests[cacheId];
40 // schedule activeRequestHandlers to be handled
41 handleActiveRequest(res, activeRequestHandlers);
42 // complete
43 return undefined;
44 });
45 function createActiveRequestHandler(res, activeRequestHandlers) {
46 const { resolve, promise } = deferredPromise();
47 activeRequestHandlers.push((handledRes) => {
48 // append a copy of the result and error to the response
49 res.result = clone_1.default(handledRes.result);
50 res.error = clone_1.default(handledRes.error);
51 resolve();
52 });
53 return promise;
54 }
55 function handleActiveRequest(res, activeRequestHandlers) {
56 // use setTimeout so we can resolve our original request first
57 setTimeout(() => {
58 activeRequestHandlers.forEach((handler) => {
59 try {
60 handler(res);
61 }
62 catch (err) {
63 // catch error so all requests are handled correctly
64 console.error(err);
65 }
66 });
67 });
68 }
69}
70exports.createInflightCacheMiddleware = createInflightCacheMiddleware;
71function deferredPromise() {
72 let resolve;
73 const promise = new Promise((_resolve) => {
74 resolve = _resolve;
75 });
76 return { resolve, promise };
77}
78//# sourceMappingURL=inflight-cache.js.map
\No newline at end of file