diff --git a/.gitignore b/.gitignore index 1a8ddc59..f90e2cb8 100644 --- a/.gitignore +++ b/.gitignore @@ -12,6 +12,7 @@ dist/ .coverage globalConfig.json *.out +.clinic/ # Config Files /config.yaml diff --git a/packages/hydrooj/package.json b/packages/hydrooj/package.json index 4937b9c2..a9f1a522 100644 --- a/packages/hydrooj/package.json +++ b/packages/hydrooj/package.json @@ -25,7 +25,6 @@ "koa-router": "^10.0.0", "koa-static-cache": "^5.1.3", "lodash": "^4.17.21", - "lru-cache": "^6.0.0", "minio": "7.0.17", "moment-timezone": "^0.5.32", "mongodb": "^3.6.5", @@ -36,7 +35,6 @@ "sockjs": "^0.3.20", "superagent": "^6.1.0", "systeminformation": "5.6.8", - "wtfnode": "^0.8.4", "yargs": "^16.2.0" }, "devDependencies": { @@ -48,14 +46,12 @@ "@types/koa-router": "^7.4.1", "@types/koa-static-cache": "^5.1.0", "@types/lodash": "^4.14.168", - "@types/lru-cache": "^5.1.0", "@types/minio": "^7.0.7", "@types/mongodb": "^3.6.10", "@types/nodemailer": "^6.4.1", "@types/serialize-javascript": "^5.0.0", "@types/sockjs": "^0.3.32", "@types/superagent": "^4.1.8", - "@types/wtfnode": "^0.7.0", "@types/yargs": "^16.0.0", "formidable": "^1.2.2" }, diff --git a/packages/hydrooj/src/loader.ts b/packages/hydrooj/src/loader.ts index 4499fe5f..bfecff0e 100644 --- a/packages/hydrooj/src/loader.ts +++ b/packages/hydrooj/src/loader.ts @@ -41,7 +41,6 @@ import path from 'path'; import cluster from 'cluster'; import fs from 'fs-extra'; import { argv } from 'yargs'; -import wtfnode from 'wtfnode'; import './utils'; import { Logger } from './logger'; import './ui'; @@ -50,14 +49,6 @@ import * as bus from './service/bus'; export * from './interface'; const logger = new Logger('loader'); logger.debug('%o', argv); -bus.on('app/exit', () => { - if (argv.debug) { - wtfnode.setLogger('info', logger.info.bind(logger)); - wtfnode.setLogger('warn', logger.warn.bind(logger)); - wtfnode.setLogger('error', logger.error.bind(logger)); - wtfnode.dump(); - } -}); async function fork(args: string[] = []) { const _args = process.argv.slice(2); @@ -100,8 +91,12 @@ async function stopWorker() { } async function startWorker(cnt: number, createFirst = true) { - await fork(createFirst ? ['--firstWorker'] : undefined); - for (let i = 1; i < cnt; i++) await fork(); + if (argv.single) { + await entry({ entry: 'worker' }); + } else { + await fork(createFirst ? ['--firstWorker'] : undefined); + for (let i = 1; i < cnt; i++) await fork(); + } } async function reload(count = 1) { diff --git a/packages/hydrooj/src/model/oauth.ts b/packages/hydrooj/src/model/oauth.ts index 3d8db6ba..216f13fe 100644 --- a/packages/hydrooj/src/model/oauth.ts +++ b/packages/hydrooj/src/model/oauth.ts @@ -1,4 +1,3 @@ -import Lru from 'lru-cache'; import { Collection } from 'mongodb'; import db from '../service/db'; @@ -8,21 +7,15 @@ interface OauthMap { } const coll: Collection = db.collection('oauth'); -const cache = new Lru({ - maxAge: 5000, -}); class OauthModel { static async get(_id: string) { - const res = cache.get(_id); - if (res !== undefined) return res; const doc = await coll.findOne({ _id }); if (doc) return doc.uid; return null; } static async set(_id: string, value: number) { - cache.set(_id, value); const res = await coll.findOneAndUpdate( { _id }, { $set: { value } }, diff --git a/packages/hydrooj/src/service/server.ts b/packages/hydrooj/src/service/server.ts index c29ed602..f1469971 100644 --- a/packages/hydrooj/src/service/server.ts +++ b/packages/hydrooj/src/service/server.ts @@ -18,8 +18,9 @@ import sockjs from 'sockjs'; import type { SetOption } from 'cookies'; import serialize, { SerializeJSOptions } from 'serialize-javascript'; import { argv } from 'yargs'; +import { createHash } from 'crypto'; import * as bus from './bus'; -import { errorMessage, lrucache } from '../utils'; +import { errorMessage } from '../utils'; import { User, DomainDoc } from '../interface'; import { Logger } from '../logger'; import { @@ -422,10 +423,9 @@ export class Handler extends HandlerCommon { if (xff) this.request.ip = this.request.headers[xff.toLowerCase()] || this.request.ip; } - @lrucache // eslint-disable-next-line class-methods-use-this getCsrfToken(id: string) { - return hash('csrf_token', id); + return createHash('md5').update(`csrf_token${id}`).digest('hex'); } async render(name: string, context: any) { @@ -457,10 +457,10 @@ export class Handler extends HandlerCommon { } async init({ domainId }) { + if (!argv.benchmark) await this.limitRate('global', 10, 50); const [absoluteDomain, inferDomain] = await Promise.all([ domain.get(domainId), domain.getByHost(this.request.host), - this.limitRate('global', 10, 50), this.getSession(), this.getBdoc(), ]); diff --git a/packages/hydrooj/src/utils.ts b/packages/hydrooj/src/utils.ts index 82bd8e20..985cbed5 100644 --- a/packages/hydrooj/src/utils.ts +++ b/packages/hydrooj/src/utils.ts @@ -2,8 +2,6 @@ import fs from 'fs'; import { Duplex } from 'stream'; import cluster from 'cluster'; import path, { sep } from 'path'; -import serialize from 'serialize-javascript'; -import Lru from 'lru-cache'; import { ObjectID } from 'mongodb'; import { isMoment } from 'moment'; import type { Moment } from 'moment-timezone'; @@ -29,21 +27,6 @@ declare global { } } -const lru = new Lru(1000); - -export function lrucache(target: any, funcName: string, obj: any) { - const originalMethod = obj.value; - obj.value = function func(...args: any[]) { - const key = serialize({ funcName, args }); - let val = lru.get(key); - if (val) return val; - val = originalMethod.call(this, ...args); - lru.set(key, val); - return val; - }; - return obj; -} - if (!cluster.worker) { // @ts-ignore cluster.worker = { id: 0 };