diff --git a/package.json b/package.json index e22b91e13..d00626301 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 f63156948..28994f72e 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 0a7ea9bc7..88ae5feb5 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 f04af9787..defeb6f8f 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'),