171 lines
5.5 KiB
JavaScript
171 lines
5.5 KiB
JavaScript
|
"use strict";
|
||
|
Object.defineProperty(exports, "__esModule", { value: true });
|
||
|
exports.TmpDir = exports.getTempName = void 0;
|
||
|
const fs_extra_1 = require("fs-extra");
|
||
|
const os_1 = require("os");
|
||
|
const path = require("path");
|
||
|
let tmpFileCounter = 0;
|
||
|
const tmpDirManagers = new Set();
|
||
|
// add date to avoid use stale temp dir
|
||
|
const tempDirPrefix = `${process.pid.toString(36)}-${Date.now().toString(36)}`;
|
||
|
function getTempName(prefix) {
|
||
|
return `${prefix == null ? "" : `${prefix}-`}${tempDirPrefix}-${(tmpFileCounter++).toString(36)}`;
|
||
|
}
|
||
|
exports.getTempName = getTempName;
|
||
|
let tempDirPromise;
|
||
|
let tempBaseDir;
|
||
|
function getBaseTempDir() {
|
||
|
if (tempDirPromise != null) {
|
||
|
return tempDirPromise;
|
||
|
}
|
||
|
if (tempBaseDir != null) {
|
||
|
return Promise.resolve(tempBaseDir);
|
||
|
}
|
||
|
const systemTmpDir = process.env.APP_BUILDER_TMP_DIR || os_1.tmpdir();
|
||
|
const isEnsureRemovedOnExit = process.env.TMP_DIR_MANAGER_ENSURE_REMOVED_ON_EXIT !== "false";
|
||
|
tempDirPromise = fs_extra_1.mkdtemp(path.join(systemTmpDir, "t-"))
|
||
|
.then(it => fs_extra_1.realpath(it))
|
||
|
.then(dir => {
|
||
|
if (isEnsureRemovedOnExit) {
|
||
|
addExitHook(dir);
|
||
|
}
|
||
|
tempBaseDir = dir;
|
||
|
return dir;
|
||
|
});
|
||
|
return tempDirPromise;
|
||
|
}
|
||
|
function addExitHook(dir) {
|
||
|
require("async-exit-hook")((callback) => {
|
||
|
const managers = Array.from(tmpDirManagers);
|
||
|
tmpDirManagers.clear();
|
||
|
if (callback == null) {
|
||
|
for (const manager of managers) {
|
||
|
manager.cleanupSync();
|
||
|
}
|
||
|
try {
|
||
|
fs_extra_1.removeSync(dir);
|
||
|
}
|
||
|
catch (e) {
|
||
|
handleError(e, dir);
|
||
|
}
|
||
|
return;
|
||
|
}
|
||
|
Promise.all(managers.map(it => it.cleanup()))
|
||
|
.then(() => fs_extra_1.remove(dir))
|
||
|
.then(() => callback())
|
||
|
.catch(e => {
|
||
|
try {
|
||
|
handleError(e, dir);
|
||
|
}
|
||
|
finally {
|
||
|
callback();
|
||
|
}
|
||
|
});
|
||
|
});
|
||
|
}
|
||
|
function handleError(e, file) {
|
||
|
if (e.code !== "EPERM" && e.code !== "ENOENT") {
|
||
|
// use only console.* instead of our warn on exit (otherwise nodeEmoji can be required on request)
|
||
|
console.warn(`Cannot delete temporary "${file}": ${(e.stack || e).toString()}`);
|
||
|
}
|
||
|
}
|
||
|
class TmpDir {
|
||
|
constructor(debugName = "") {
|
||
|
this.debugName = debugName;
|
||
|
this.tempFiles = [];
|
||
|
this.registered = false;
|
||
|
}
|
||
|
// noinspection JSMethodCanBeStatic,JSUnusedGlobalSymbols
|
||
|
get rootTempDir() {
|
||
|
return getBaseTempDir();
|
||
|
}
|
||
|
getTempDir(options) {
|
||
|
return this.getTempFile(options, true);
|
||
|
}
|
||
|
createTempDir(options) {
|
||
|
return this.getTempFile(options, true)
|
||
|
.then(it => fs_extra_1.ensureDir(it).then(() => it));
|
||
|
}
|
||
|
getTempFile(options, isDir = false) {
|
||
|
return getBaseTempDir()
|
||
|
.then(baseTempDir => {
|
||
|
if (!this.registered) {
|
||
|
this.registered = true;
|
||
|
tmpDirManagers.add(this);
|
||
|
}
|
||
|
const prefix = nullize(options == null ? null : options.prefix);
|
||
|
const suffix = nullize(options == null ? null : options.suffix);
|
||
|
const namePrefix = prefix == null ? "" : `${prefix}-`;
|
||
|
const nameSuffix = suffix == null ? "" : (suffix.startsWith(".") ? suffix : `-${suffix}`);
|
||
|
const result = `${baseTempDir}${path.sep}${namePrefix}${(tmpFileCounter++).toString(36)}${nameSuffix}`;
|
||
|
this.tempFiles.push({
|
||
|
path: result,
|
||
|
isDir,
|
||
|
disposer: options == null ? null : options.disposer,
|
||
|
});
|
||
|
return result;
|
||
|
});
|
||
|
}
|
||
|
cleanupSync() {
|
||
|
const tempFiles = this.tempFiles;
|
||
|
tmpDirManagers.delete(this);
|
||
|
this.registered = false;
|
||
|
if (tempFiles.length === 0) {
|
||
|
return;
|
||
|
}
|
||
|
this.tempFiles = [];
|
||
|
for (const file of tempFiles) {
|
||
|
if (file.disposer != null) {
|
||
|
// noinspection JSIgnoredPromiseFromCall
|
||
|
file.disposer(file.path);
|
||
|
continue;
|
||
|
}
|
||
|
try {
|
||
|
if (file.isDir) {
|
||
|
fs_extra_1.removeSync(file.path);
|
||
|
}
|
||
|
else {
|
||
|
fs_extra_1.unlinkSync(file.path);
|
||
|
}
|
||
|
}
|
||
|
catch (e) {
|
||
|
handleError(e, file.path);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
cleanup() {
|
||
|
const tempFiles = this.tempFiles;
|
||
|
tmpDirManagers.delete(this);
|
||
|
this.registered = false;
|
||
|
if (tempFiles.length === 0) {
|
||
|
return Promise.resolve();
|
||
|
}
|
||
|
this.tempFiles = [];
|
||
|
if (tmpDirManagers.size === 0) {
|
||
|
const dir = tempBaseDir;
|
||
|
if (dir == null) {
|
||
|
return Promise.resolve();
|
||
|
}
|
||
|
tempBaseDir = null;
|
||
|
tempDirPromise = null;
|
||
|
return fs_extra_1.remove(dir);
|
||
|
}
|
||
|
return Promise.all(tempFiles.map(it => {
|
||
|
if (it.disposer != null) {
|
||
|
return it.disposer(it.path);
|
||
|
}
|
||
|
return (it.isDir ? fs_extra_1.remove(it.path) : fs_extra_1.unlink(it.path))
|
||
|
.catch(e => {
|
||
|
handleError(e, it.path);
|
||
|
});
|
||
|
}));
|
||
|
}
|
||
|
toString() {
|
||
|
return this.debugName;
|
||
|
}
|
||
|
}
|
||
|
exports.TmpDir = TmpDir;
|
||
|
function nullize(s) {
|
||
|
return s == null || s.length === 0 ? null : s;
|
||
|
}
|
||
|
//# sourceMappingURL=main.js.map
|