From 27d2132bfa2e059026d5568864ecd92d7dfd4b89 Mon Sep 17 00:00:00 2001 From: orosmatthew Date: Tue, 19 Dec 2023 16:59:34 -0500 Subject: [PATCH] [sandbox] Update deps --- sandbox/package-lock.json | 40 ++++++++++++++--------------- sandbox/package.json | 10 ++++---- sandbox/src/index.ts | 53 +++++++++++++++++++++++---------------- sandbox/src/run/java.ts | 27 ++++++++++++-------- 4 files changed, 74 insertions(+), 56 deletions(-) diff --git a/sandbox/package-lock.json b/sandbox/package-lock.json index 2caa235..2680ce1 100644 --- a/sandbox/package-lock.json +++ b/sandbox/package-lock.json @@ -10,16 +10,16 @@ "license": "ISC", "dependencies": { "dotenv": "^16.3.1", - "fs-extra": "^11.1.1", - "simple-git": "^3.20.0", + "fs-extra": "^11.2.0", + "simple-git": "^3.21.0", "url-join": "^5.0.0", "zod": "^3.22.4" }, "devDependencies": { "@types/fs-extra": "^11.0.4", - "@types/node": "^20.9.2", - "prettier": "^3.1.0", - "typescript": "^5.2.2" + "@types/node": "^20.10.5", + "prettier": "^3.1.1", + "typescript": "^5.3.3" } }, "node_modules/@kwsites/file-exists": { @@ -55,9 +55,9 @@ } }, "node_modules/@types/node": { - "version": "20.9.2", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.9.2.tgz", - "integrity": "sha512-WHZXKFCEyIUJzAwh3NyyTHYSR35SevJ6mZ1nWwJafKtiQbqRTIKSRcw3Ma3acqgsent3RRDqeVwpHntMk+9irg==", + "version": "20.10.5", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.10.5.tgz", + "integrity": "sha512-nNPsNE65wjMxEKI93yOP+NPGGBJz/PoN3kZsVLee0XMiJolxSekEVD8wRwBUBqkwc7UWop0edW50yrCQW4CyRw==", "dev": true, "dependencies": { "undici-types": "~5.26.4" @@ -91,9 +91,9 @@ } }, "node_modules/fs-extra": { - "version": "11.1.1", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.1.1.tgz", - "integrity": "sha512-MGIE4HOvQCeUCzmlHs0vXpih4ysz4wg9qiSAu6cd42lVwPbTM1TjV7RusoyQqMmk/95gdQZX72u+YW+c3eEpFQ==", + "version": "11.2.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz", + "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==", "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", @@ -125,9 +125,9 @@ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, "node_modules/prettier": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.1.0.tgz", - "integrity": "sha512-TQLvXjq5IAibjh8EpBIkNKxO749UEWABoiIZehEPiY4GNpVdhaFKqSTu+QrlU6D2dPAfubRmtJTi4K4YkQ5eXw==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.1.1.tgz", + "integrity": "sha512-22UbSzg8luF4UuZtzgiUOfcGM8s4tjBv6dJRT7j275NXsy2jb4aJa4NNveul5x4eqlF1wuhuR2RElK71RvmVaw==", "dev": true, "bin": { "prettier": "bin/prettier.cjs" @@ -140,9 +140,9 @@ } }, "node_modules/simple-git": { - "version": "3.20.0", - "resolved": "https://registry.npmjs.org/simple-git/-/simple-git-3.20.0.tgz", - "integrity": "sha512-ozK8tl2hvLts8ijTs18iFruE+RoqmC/mqZhjs/+V7gS5W68JpJ3+FCTmLVqmR59MaUQ52MfGQuWsIqfsTbbJ0Q==", + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/simple-git/-/simple-git-3.21.0.tgz", + "integrity": "sha512-oTzw9248AF5bDTMk9MrxsRzEzivMlY+DWH0yWS4VYpMhNLhDWnN06pCtaUyPnqv/FpsdeNmRqmZugMABHRPdDA==", "dependencies": { "@kwsites/file-exists": "^1.1.1", "@kwsites/promise-deferred": "^1.1.1", @@ -154,9 +154,9 @@ } }, "node_modules/typescript": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.2.2.tgz", - "integrity": "sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==", + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.3.3.tgz", + "integrity": "sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==", "dev": true, "bin": { "tsc": "bin/tsc", diff --git a/sandbox/package.json b/sandbox/package.json index 72fa6d0..adefd4d 100644 --- a/sandbox/package.json +++ b/sandbox/package.json @@ -13,14 +13,14 @@ "license": "ISC", "devDependencies": { "@types/fs-extra": "^11.0.4", - "@types/node": "^20.9.2", - "prettier": "^3.1.0", - "typescript": "^5.2.2" + "@types/node": "^20.10.5", + "prettier": "^3.1.1", + "typescript": "^5.3.3" }, "dependencies": { "dotenv": "^16.3.1", - "fs-extra": "^11.1.1", - "simple-git": "^3.20.0", + "fs-extra": "^11.2.0", + "simple-git": "^3.21.0", "url-join": "^5.0.0", "zod": "^3.22.4" } diff --git a/sandbox/src/index.ts b/sandbox/src/index.ts index d517139..0243fc2 100644 --- a/sandbox/src/index.ts +++ b/sandbox/src/index.ts @@ -9,9 +9,9 @@ import { runJava } from './run/java.js'; export const timeoutSeconds = 30; -const RunResultKind = z.enum(["CompileFailed", "TimeLimitExceeded", "Completed", "SandboxError"]); +const RunResultKind = z.enum(['CompileFailed', 'TimeLimitExceeded', 'Completed', 'SandboxError']); export type RunResultKind = z.infer; - + const RunResult = z .object({ kind: RunResultKind, @@ -63,7 +63,9 @@ enum SubmissionProcessingResult { async function fetchQueuedSubmission(): Promise { const res = await fetch(submissionApiUrl, { method: 'GET' }); if (res.status !== 200) { - console.error(`Failed to fetch from ${submissionApiUrl} with status: ${res.status} ${res.statusText}`); + console.error( + `Failed to fetch from ${submissionApiUrl} with status: ${res.status} ${res.statusText}` + ); return undefined; } @@ -95,10 +97,7 @@ async function cloneAndRun(submissionData: SubmissionGetData) { console.log(`- CLONE: from ${teamRepoUrl}`); const git: SimpleGit = simpleGit({ baseDir: repoDir }); - await git.clone( - teamRepoUrl, - '.' - ); + await git.clone(teamRepoUrl, '.'); await git.checkout(submissionData.submission.commitHash); const problemName = submissionData.submission.problem.pascalName; let runResult: RunResult; @@ -113,20 +112,24 @@ async function cloneAndRun(submissionData: SubmissionGetData) { ); } catch (error) { runResult = { - kind: 'SandboxError', - resultKindReason: `An unexpected error occurred: ${EOL} ${error}`}; + kind: 'SandboxError', + resultKindReason: `An unexpected error occurred: ${EOL} ${error}` + }; } printRunResult(runResult); - const postBodyObject: SubmissionPostData = { submissionId: submissionData.submission.id, result: runResult }; + const postBodyObject: SubmissionPostData = { + submissionId: submissionData.submission.id, + result: runResult + }; const res = await fetch(urlJoin(adminUrl, 'api/submission'), { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(postBodyObject) }); if (res.status !== 200) { - console.error('- POST: Failed with error code: ' + res.status + " " + res.statusText); + console.error('- POST: Failed with error code: ' + res.status + ' ' + res.statusText); return; } @@ -144,11 +147,11 @@ function printRunResult(runResult: RunResult) { function getRunResultDisplayText() { if (runResult.kind == 'SandboxError') { - return "Sandbox error: " + runResult.resultKindReason; + return 'Sandbox error: ' + runResult.resultKindReason; } if (runResult.kind == 'CompileFailed') { - return "Failed to compile"; + return 'Failed to compile'; } if (runResult.kind == 'TimeLimitExceeded') { @@ -196,7 +199,7 @@ async function processNextSubmission(): Promise { if (!submissionData.submission) { return SubmissionProcessingResult.NoSubmissions; } - + printSubmissionHeader(submissionData); let processingResult: SubmissionProcessingResult; @@ -219,10 +222,12 @@ function printSubmissionHeader(submissionData: SubmissionGetData) { } console.log(`--- Submission ${submission.id} ---`); - console.log(`- INFO: Contest ${submission.contestId} '${submission.contestName}', ` + - `Team ${submission.teamId} '${submission.teamName}', ` + - `Problem ${submission.problem.id} '${submission.problem.pascalName}', ` + - `SHA '${submission.commitHash}'`); + console.log( + `- INFO: Contest ${submission.contestId} '${submission.contestName}', ` + + `Team ${submission.teamId} '${submission.teamName}', ` + + `Problem ${submission.problem.id} '${submission.problem.pascalName}', ` + + `SHA '${submission.commitHash}'` + ); } function printSubmissionFooter(submissionData: SubmissionGetData) { @@ -235,7 +240,7 @@ function printSubmissionFooter(submissionData: SubmissionGetData) { } async function run() { - console.log("Sandbox started. Periodically checking for submissions."); + console.log('Sandbox started. Periodically checking for submissions.'); let iterationsSinceProcessedSubmission = 0; let anySubmissionsProcessed = false; @@ -248,8 +253,14 @@ async function run() { case SubmissionProcessingResult.NoSubmissions: if (iterationsSinceProcessedSubmission > 0 && iterationsSinceProcessedSubmission % 6 == 0) { const numMinutes = iterationsSinceProcessedSubmission / 6; - console.log(`${numMinutes} minute${(numMinutes > 1 ? 's' : '')} since ` + - `${(anySubmissionsProcessed ? `last submission processed` : `sandbox startup with no submissions`)}`); + console.log( + `${numMinutes} minute${numMinutes > 1 ? 's' : ''} since ` + + `${ + anySubmissionsProcessed + ? `last submission processed` + : `sandbox startup with no submissions` + }` + ); } await new Promise((resolve) => setTimeout(resolve, 10000)); diff --git a/sandbox/src/run/java.ts b/sandbox/src/run/java.ts index d5c5c1a..7905f51 100644 --- a/sandbox/src/run/java.ts +++ b/sandbox/src/run/java.ts @@ -20,10 +20,10 @@ export async function runJava( try { await execPromise(compileCommand); - } catch(e) { - const buildErrorText = e?.toString() ?? "Unknown build errors."; - console.log("Build errors: " + buildErrorText); - return {kind: 'CompileFailed', resultKindReason: buildErrorText}; + } catch (e) { + const buildErrorText = e?.toString() ?? 'Unknown build errors.'; + console.log('Build errors: ' + buildErrorText); + return { kind: 'CompileFailed', resultKindReason: buildErrorText }; } console.log(`- RUN: ${mainClass}`); @@ -46,7 +46,7 @@ export async function runJava( let timeLimitExceeded = false; let completedNormally = false; - + child.on('close', () => { completedNormally = !timeLimitExceeded; @@ -55,12 +55,19 @@ export async function runJava( if (completedNormally) { clearTimeout(timeoutHandle); - resolve({kind: 'Completed', output: outputBuffer, - exitCode: child.exitCode!, runtimeMilliseconds}); - } - else { + resolve({ + kind: 'Completed', + output: outputBuffer, + exitCode: child.exitCode!, + runtimeMilliseconds + }); + } else { console.log(`Process terminated, total sandbox time: ${runtimeMilliseconds}ms`); - resolve({kind: 'TimeLimitExceeded', output: outputBuffer, resultKindReason: `Timeout after ${timeoutSeconds} seconds`}); + resolve({ + kind: 'TimeLimitExceeded', + output: outputBuffer, + resultKindReason: `Timeout after ${timeoutSeconds} seconds` + }); } });