From 41ffaacd62fa888bd729705293964c8118aa56f4 Mon Sep 17 00:00:00 2001 From: Will Hunt Date: Thu, 20 Aug 2020 14:32:01 +0100 Subject: [PATCH] Typescriptify ClientRequestCache --- spec/unit/client-request-cache.spec.js | 2 +- ...quest-cache.js => client-request-cache.ts} | 33 +++++++++---------- src/components/intent.ts | 8 ++--- 3 files changed, 20 insertions(+), 23 deletions(-) rename src/components/{client-request-cache.js => client-request-cache.ts} (75%) diff --git a/spec/unit/client-request-cache.spec.js b/spec/unit/client-request-cache.spec.js index 08f1655a..547ca36b 100644 --- a/spec/unit/client-request-cache.spec.js +++ b/spec/unit/client-request-cache.spec.js @@ -1,4 +1,4 @@ -const ClientRequestCache = require("../../lib/components/client-request-cache"); +const { ClientRequestCache } = require("../../lib/components/client-request-cache"); const Bluebird = require("bluebird"); describe("ClientRequestCache", function() { diff --git a/src/components/client-request-cache.js b/src/components/client-request-cache.ts similarity index 75% rename from src/components/client-request-cache.js rename to src/components/client-request-cache.ts index 87196560..1e0b53ea 100644 --- a/src/components/client-request-cache.js +++ b/src/components/client-request-cache.ts @@ -17,26 +17,25 @@ limitations under the License. /** * Caches requests in memory and handles expiring them. */ -class ClientRequestCache { +export class ClientRequestCache { + private requestContent = new Map(); /** * @param ttl {Number} How old a result can be before it gets expired. * @param size {Number} How many results to store before we trim. * @param requestFunc The function to use on cache miss. */ - constructor (ttl, size, requestFunc) { + constructor (private readonly ttl: number, private readonly maxSize: number, private readonly requestFunc: (...args: any[])=>Promise) { if (!Number.isInteger(ttl) || ttl <= 0) { throw Error("'ttl' must be greater than 0"); } - if (!Number.isInteger(size) || ttl <= 0) { + if (!Number.isInteger(maxSize) || ttl <= 0) { throw Error("'size' must be greater than 0"); } if (typeof(requestFunc) !== "function") { throw Error("'requestFunc' must be a function"); } - this._requestContent = new Map(); // key => {ts, content} this.requestFunc = requestFunc; this.ttl = ttl; - this.maxSize = size; } /** @@ -48,27 +47,27 @@ class ClientRequestCache { * @returns {Promise} The request, or undefined if not retrievable. * @throws {Error} If the key is not a string. */ - get(key, ...args) { + get(key: string, ...args: any[]) { if (typeof(key) !== "string") { throw Error("'key' must be a string"); } - const cachedResult = this._requestContent.get(key); + const cachedResult = this.requestContent.get(key); if (cachedResult !== undefined && cachedResult.ts >= Date.now() - this.ttl) { return cachedResult.content; } // Delete the old req. - this._requestContent.delete(key); - return new Promise((resolve, reject) => { - resolve(this.requestFunc.apply(null, [key].concat(args))) + this.requestContent.delete(key); + return new Promise((resolve) => { + resolve(this.requestFunc.apply(null, [key, ...args])) }).then((result) => { if (result !== undefined) { - this._requestContent.set(key, { + this.requestContent.set(key, { ts: Date.now(), content: result, }); - if (this._requestContent.size > this.maxSize) { - const oldKey = this._requestContent.keys().next().value; - this._requestContent.delete(oldKey); + if (this.requestContent.size > this.maxSize) { + const oldKey = this.requestContent.keys().next().value; + this.requestContent.delete(oldKey); } } return result; @@ -82,7 +81,7 @@ class ClientRequestCache { * @returns {Map} */ getCachedResults() { - return new Map(this._requestContent); + return new Map(this.requestContent); } /** @@ -90,6 +89,4 @@ class ClientRequestCache { * @param {any[]} args A set of arguments passed from get(). * @param {string} key The key for the cached item. */ -} - -module.exports = ClientRequestCache; +} \ No newline at end of file diff --git a/src/components/intent.ts b/src/components/intent.ts index be9d258f..6a936abf 100644 --- a/src/components/intent.ts +++ b/src/components/intent.ts @@ -18,7 +18,7 @@ import JsSdk from "matrix-js-sdk"; // eslint-disable-next-line @typescript-eslint/no-explicit-any const { MatrixEvent, RoomMember } = JsSdk as any; -import ClientRequestCache from "./client-request-cache"; +import { ClientRequestCache } from "./client-request-cache"; import { defer } from "../utils/promiseutil"; @@ -82,9 +82,9 @@ type PowerLevelContent = { export class Intent { private _requestCaches: { - profile: ClientRequestCache, - roomstate: ClientRequestCache, - event: ClientRequestCache + profile: ClientRequestCache, + roomstate: ClientRequestCache, + event: ClientRequestCache } private opts: { backingStore: BackingStore,