From 0b77ed6b763bd3e7beeb2b97c8975adbf39898e8 Mon Sep 17 00:00:00 2001 From: undefined Date: Fri, 8 Apr 2022 23:04:15 +0800 Subject: [PATCH] core: auto disconnect inactive session --- package.json | 1 + packages/hydrooj/package.json | 2 +- packages/hydrooj/src/handler/record.ts | 8 ++++++++ packages/ui-default/pages/record_detail.page.ts | 1 + 4 files changed, 11 insertions(+), 1 deletion(-) diff --git a/package.json b/package.json index e22b91e1..d0062630 100644 --- a/package.json +++ b/package.json @@ -32,6 +32,7 @@ "devDependencies": { "@types/autocannon": "^7.6.1", "@types/cross-spawn": "^6.0.2", + "@types/mocha": "^9.1.0", "@types/node": "^17.0.23", "@types/semver": "^7.3.9", "@types/supertest": "^2.0.12", diff --git a/packages/hydrooj/package.json b/packages/hydrooj/package.json index f6315694..28994f72 100644 --- a/packages/hydrooj/package.json +++ b/packages/hydrooj/package.json @@ -1,6 +1,6 @@ { "name": "hydrooj", - "version": "3.11.12", + "version": "3.11.13", "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 0a7ea9bc..88ae5feb 100644 --- a/packages/hydrooj/src/handler/record.ts +++ b/packages/hydrooj/src/handler/record.ts @@ -284,6 +284,7 @@ class RecordMainConnectionHandler extends ConnectionHandler { class RecordDetailConnectionHandler extends ConnectionHandler { cleanup: bus.Disposable = () => { }; rid: string = ''; + disconnectTimeout: NodeJS.Timeout; @param('rid', Types.ObjectID) async prepare(domainId: string, rid: ObjectID) { @@ -322,12 +323,19 @@ class RecordDetailConnectionHandler extends ConnectionHandler { // eslint-disable-next-line async onRecordChange(rdoc: RecordDoc, $set?: any, $push?: any) { if (rdoc._id.toString() !== this.rid) return; + if (this.disconnectTimeout) { + clearTimeout(this.disconnectTimeout); + this.disconnectTimeout = null; + } // 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); + } } } diff --git a/packages/ui-default/pages/record_detail.page.ts b/packages/ui-default/pages/record_detail.page.ts index f04af978..defeb6f8 100644 --- a/packages/ui-default/pages/record_detail.page.ts +++ b/packages/ui-default/pages/record_detail.page.ts @@ -1,6 +1,7 @@ import { NamedPage } from 'vj/misc/Page'; const page = new NamedPage('record_detail', async () => { + if (!UiContext.socketUrl) return; const [{ default: SockJs }, { DiffDOM }] = await Promise.all([ import('../components/socket'), import('diff-dom'),