Clean up temporary directories
This commit is contained in:
parent
9ec5ecc224
commit
e9ff1d92d3
|
@ -13,14 +13,19 @@ export class Session {
|
||||||
config: LangConfig;
|
config: LangConfig;
|
||||||
term: { pty: IPty | null; live: boolean };
|
term: { pty: IPty | null; live: boolean };
|
||||||
ws: WebSocket;
|
ws: WebSocket;
|
||||||
|
tmpdir: string | null;
|
||||||
|
tmpdirCleanup: (() => void) | null;
|
||||||
|
|
||||||
constructor(ws: WebSocket, lang: string) {
|
constructor(ws: WebSocket, lang: string) {
|
||||||
this.ws = ws;
|
this.ws = ws;
|
||||||
this.config = langs[lang];
|
this.config = langs[lang];
|
||||||
this.term = { pty: null, live: false };
|
this.term = { pty: null, live: false };
|
||||||
this.code = "";
|
this.code = "";
|
||||||
this.run().catch(console.error);
|
this.tmpdir = null;
|
||||||
|
this.tmpdirCleanup = null;
|
||||||
ws.on("message", this.handleClientMessage);
|
ws.on("message", this.handleClientMessage);
|
||||||
|
ws.on("close", this.cleanup);
|
||||||
|
this.run().catch(console.error);
|
||||||
}
|
}
|
||||||
handleClientMessage = (event: string) => {
|
handleClientMessage = (event: string) => {
|
||||||
let msg: any;
|
let msg: any;
|
||||||
|
@ -64,15 +69,18 @@ export class Session {
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
//
|
//
|
||||||
}
|
}
|
||||||
const tmpdir: string = await new Promise((resolve, reject) =>
|
if (this.tmpdir == null) {
|
||||||
tmp.dir({ unsafeCleanup: true }, (err, path) => {
|
({ path: this.tmpdir, cleanup: this.tmpdirCleanup } = await new Promise(
|
||||||
if (err) {
|
(resolve, reject) =>
|
||||||
reject(err);
|
tmp.dir({ unsafeCleanup: true }, (err, path, cleanup) => {
|
||||||
} else {
|
if (err) {
|
||||||
resolve(path);
|
reject(err);
|
||||||
}
|
} else {
|
||||||
})
|
resolve({ path, cleanup });
|
||||||
);
|
}
|
||||||
|
})
|
||||||
|
));
|
||||||
|
}
|
||||||
let cmdline: string;
|
let cmdline: string;
|
||||||
if (!run) {
|
if (!run) {
|
||||||
cmdline = `echo 'Support for ${this.config.name} is not yet implemented.'`;
|
cmdline = `echo 'Support for ${this.config.name} is not yet implemented.'`;
|
||||||
|
@ -82,10 +90,10 @@ export class Session {
|
||||||
code += suffix;
|
code += suffix;
|
||||||
}
|
}
|
||||||
if (main.includes("/")) {
|
if (main.includes("/")) {
|
||||||
await mkdirp(path.dirname(path.resolve(tmpdir, main)));
|
await mkdirp(path.dirname(path.resolve(this.tmpdir!, main)));
|
||||||
}
|
}
|
||||||
await new Promise((resolve, reject) =>
|
await new Promise((resolve, reject) =>
|
||||||
fs.writeFile(path.resolve(tmpdir, main), code, (err) => {
|
fs.writeFile(path.resolve(this.tmpdir!, main), code, (err) => {
|
||||||
if (err) {
|
if (err) {
|
||||||
reject(err);
|
reject(err);
|
||||||
} else {
|
} else {
|
||||||
|
@ -106,7 +114,7 @@ export class Session {
|
||||||
if (this.code) {
|
if (this.code) {
|
||||||
const contents = ":load Main\nmain\n";
|
const contents = ":load Main\nmain\n";
|
||||||
await new Promise((resolve, reject) => {
|
await new Promise((resolve, reject) => {
|
||||||
fs.writeFile(path.resolve(tmpdir, ".ghci"), contents, (err) => {
|
fs.writeFile(path.resolve(this.tmpdir!, ".ghci"), contents, (err) => {
|
||||||
if (err) {
|
if (err) {
|
||||||
reject(err);
|
reject(err);
|
||||||
} else {
|
} else {
|
||||||
|
@ -116,7 +124,7 @@ export class Session {
|
||||||
});
|
});
|
||||||
} else {
|
} else {
|
||||||
await new Promise((resolve, reject) =>
|
await new Promise((resolve, reject) =>
|
||||||
fs.unlink(path.resolve(tmpdir, ".ghci"), (err) => {
|
fs.unlink(path.resolve(this.tmpdir!, ".ghci"), (err) => {
|
||||||
if (err && err.code !== "ENOENT") {
|
if (err && err.code !== "ENOENT") {
|
||||||
reject(err);
|
reject(err);
|
||||||
} else {
|
} else {
|
||||||
|
@ -129,7 +137,7 @@ export class Session {
|
||||||
const term = {
|
const term = {
|
||||||
pty: pty.spawn("bash", ["-c", cmdline], {
|
pty: pty.spawn("bash", ["-c", cmdline], {
|
||||||
name: "xterm-color",
|
name: "xterm-color",
|
||||||
cwd: tmpdir,
|
cwd: this.tmpdir!,
|
||||||
env: process.env as { [key: string]: string },
|
env: process.env as { [key: string]: string },
|
||||||
}),
|
}),
|
||||||
live: true,
|
live: true,
|
||||||
|
@ -149,4 +157,9 @@ export class Session {
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
cleanup = () => {
|
||||||
|
if (this.tmpdirCleanup) {
|
||||||
|
this.tmpdirCleanup();
|
||||||
|
}
|
||||||
|
};
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue