From bc517550593e6dcab59cec714e0264173e097beb Mon Sep 17 00:00:00 2001 From: undefined Date: Thu, 2 Sep 2021 20:35:15 +0800 Subject: [PATCH] ui: handle multi-worker cache --- packages/ui-default/handler.ts | 15 ++++++++++++++- packages/ui-default/package.json | 2 +- 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/packages/ui-default/handler.ts b/packages/ui-default/handler.ts index 9f5c93f7b..eecd94a0d 100644 --- a/packages/ui-default/handler.ts +++ b/packages/ui-default/handler.ts @@ -7,6 +7,7 @@ import { tmpdir } from 'os'; import { ObjectID } from 'mongodb'; import * as bus from 'hydrooj/src/service/bus'; import { Route, Handler } from 'hydrooj/src/service/server'; +import * as db from 'hydrooj/src/service/db'; import { PERM } from 'hydrooj/src/model/builtin'; import markdown from './backendlib/markdown'; @@ -19,7 +20,17 @@ interface ConstantArgs { domainId: string; } +declare module 'hydrooj/src/interface' { + interface Collections { + cache: { + _id: string; + value: any; + } + } +} + const cache = {}; +const coll = db.collection('cache'); const basedir = join(tmpdir(), 'hydro', 'public'); async function constant(args: ConstantArgs) { @@ -63,6 +74,7 @@ async function constant(args: ConstantArgs) { c.update(JSON.stringify(payload)); const version = c.digest('hex'); cache[version] = { version, payload }; + await coll.updateOne({ _id: version }, { $set: { value: { version, payload } } }, { upsert: true }); return version; } @@ -124,7 +136,8 @@ class UiConstantsHandler extends Handler { noCheckPermView = true; async get({ version }) { - this.response.body = cache[version]; + this.response.body = cache[version] + || (await coll.findOne({ _id: version }))?.value; } } diff --git a/packages/ui-default/package.json b/packages/ui-default/package.json index 25e861f6a..d7a04a37e 100644 --- a/packages/ui-default/package.json +++ b/packages/ui-default/package.json @@ -1,6 +1,6 @@ { "name": "@hydrooj/ui-default", - "version": "4.19.1", + "version": "4.19.2", "author": "undefined ", "license": "AGPL-3.0", "main": "hydro.js",