From 817eac29235cfafc4f774e16b40e8bb680e26221 Mon Sep 17 00:00:00 2001 From: undefined Date: Sat, 3 Sep 2022 14:29:25 +0800 Subject: [PATCH] core: optimize record connection --- packages/hydrooj/package.json | 2 +- packages/hydrooj/src/handler/record.ts | 21 ++++++++++++++------- 2 files changed, 15 insertions(+), 8 deletions(-) diff --git a/packages/hydrooj/package.json b/packages/hydrooj/package.json index 919c2161..94c56c0b 100644 --- a/packages/hydrooj/package.json +++ b/packages/hydrooj/package.json @@ -1,6 +1,6 @@ { "name": "hydrooj", - "version": "3.16.8", + "version": "3.16.9", "bin": "bin/hydrooj.js", "main": "src/loader", "module": "src/loader", diff --git a/packages/hydrooj/src/handler/record.ts b/packages/hydrooj/src/handler/record.ts index b2115225..6f2d7eaf 100644 --- a/packages/hydrooj/src/handler/record.ts +++ b/packages/hydrooj/src/handler/record.ts @@ -1,3 +1,4 @@ +import { debounce, omit } from 'lodash'; import { FilterQuery, ObjectID } from 'mongodb'; import { ContestNotAttendedError, ContestNotFoundError, PermissionError, @@ -275,7 +276,7 @@ class RecordMainConnectionHandler extends ConnectionHandler { if (!problem.canViewBy(pdoc, this.user)) pdoc = null; if (!this.user.hasPerm(PERM.PERM_VIEW_PROBLEM)) pdoc = null; } - if (this.pretest) this.send({ rdoc }); + if (this.pretest) this.send({ rdoc: omit(rdoc, ['code', 'input']) }); else { this.send({ html: await this.renderHTML('record_main_tr.html', { @@ -290,6 +291,7 @@ class RecordDetailConnectionHandler extends ConnectionHandler { cleanup: bus.Disposable = () => { }; rid: string = ''; disconnectTimeout: NodeJS.Timeout; + debounceSend: any; @param('rid', Types.ObjectID) async prepare(domainId: string, rid: ObjectID) { @@ -320,11 +322,19 @@ class RecordDetailConnectionHandler extends ConnectionHandler { if (!problem.canViewBy(pdoc, this.user)) throw new PermissionError(PERM.PERM_VIEW_PROBLEM_HIDDEN); } + this.debounceSend = debounce(this.send, 1000); this.rid = rid.toString(); this.cleanup = bus.on('record/change', this.onRecordChange.bind(this)); this.onRecordChange(rdoc); } + async sendUpdate(rdoc: RecordDoc) { + this.send({ + status_html: await this.renderHTML('record_detail_status.html', { rdoc }), + summary_html: await this.renderHTML('record_detail_summary.html', { rdoc }), + }); + } + // eslint-disable-next-line async onRecordChange(rdoc: RecordDoc, $set?: any, $push?: any) { if (rdoc._id.toString() !== this.rid) return; @@ -334,13 +344,10 @@ class RecordDetailConnectionHandler extends ConnectionHandler { } // TODO: frontend doesn't support incremental update // if ($set) this.send({ $set, $push }); - this.send({ - status_html: await this.renderHTML('record_detail_status.html', { rdoc }), - summary_html: await this.renderHTML('record_detail_summary.html', { rdoc }), - }); if (![STATUS.STATUS_WAITING, STATUS.STATUS_JUDGING, STATUS.STATUS_COMPILING, STATUS.STATUS_FETCHED].includes(rdoc.status)) { - this.disconnectTimeout = setTimeout(() => this.close(4001, 'Ended'), 10000); - } + this.sendUpdate(rdoc); + this.disconnectTimeout = setTimeout(() => this.close(4001, 'Ended'), 30000); + } else this.debounceSend(rdoc); } }