mirror of
https://github.com/appium/appium.git
synced 2026-10-19 23:29:34 +08:00
132 lines
3.5 KiB
JavaScript
132 lines
3.5 KiB
JavaScript
/* This library is originated from temp.js at http://github.com/bruce/node-temp */
|
|
import {fs} from './fs';
|
|
import os from 'node:os';
|
|
import nodePath from 'node:path';
|
|
import {constants} from 'node:fs';
|
|
import log from './logger';
|
|
|
|
const RDWR_EXCL = constants.O_CREAT | constants.O_TRUNC | constants.O_RDWR | constants.O_EXCL;
|
|
|
|
/**
|
|
* Generate a temporary directory in os.tempdir() or process.env.APPIUM_TMP_DIR.
|
|
* e.g.
|
|
* - No `process.env.APPIUM_TMP_DIR`: `/var/folders/34/2222sh8n27d6rcp7jqlkw8km0000gn/T/xxxxxxxx.yyyy`
|
|
* - With `process.env.APPIUM_TMP_DIR = '/path/to/root'`: `/path/to/root/xxxxxxxx.yyyy`
|
|
*
|
|
* @returns {Promise<string>} A path to the temporary directory
|
|
*/
|
|
async function tempDir() {
|
|
const now = new Date();
|
|
const filePath = nodePath.join(
|
|
process.env.APPIUM_TMP_DIR || os.tmpdir(),
|
|
[
|
|
now.getFullYear(),
|
|
now.getMonth(),
|
|
now.getDate(),
|
|
'-',
|
|
process.pid,
|
|
'-',
|
|
(Math.random() * 0x100000000 + 1).toString(36),
|
|
].join('')
|
|
);
|
|
// creates a temp directory using the date and a random string
|
|
|
|
await fs.mkdir(filePath, {recursive: true});
|
|
|
|
return filePath;
|
|
}
|
|
|
|
/**
|
|
* @typedef Affixes
|
|
* @property {string} [prefix] - prefix of the temp directory name
|
|
* @property {string} [suffix] - suffix of the temp directory name
|
|
*/
|
|
|
|
/**
|
|
* Generate a temporary directory in os.tempdir() or process.env.APPIUM_TMP_DIR
|
|
* with arbitrary prefix/suffix for the directory name.
|
|
*
|
|
* @param {string|Affixes} rawAffixes
|
|
* @param {string} [defaultPrefix]
|
|
* @returns {Promise<string>} A path to the temporary directory with rawAffixes and defaultPrefix
|
|
*/
|
|
async function path(rawAffixes, defaultPrefix) {
|
|
const affixes = parseAffixes(rawAffixes, defaultPrefix);
|
|
const name = `${affixes.prefix || ''}${affixes.suffix || ''}`;
|
|
const tempDirectory = await tempDir();
|
|
return nodePath.join(tempDirectory, name);
|
|
}
|
|
|
|
/**
|
|
* @typedef OpenedAffixes
|
|
* @property {string} path - The path to file
|
|
* @property {number} fd - The file descriptor opened
|
|
*/
|
|
|
|
/**
|
|
* Generate a temporary directory in os.tempdir() or process.env.APPIUM_TMP_DIR
|
|
* with arbitrary prefix/suffix for the directory name and return it as open.
|
|
*
|
|
* @param {Affixes} affixes
|
|
* @returns {Promise<OpenedAffixes>}
|
|
*/
|
|
async function open(affixes) {
|
|
const filePath = await path(affixes, 'f-');
|
|
try {
|
|
let fd = await fs.open(filePath, RDWR_EXCL, 0o600);
|
|
// opens the file in mode 384
|
|
return {path: filePath, fd};
|
|
} catch (err) {
|
|
throw log.errorWithException(err);
|
|
}
|
|
}
|
|
|
|
/**
|
|
*
|
|
* Returns prefix/suffix object
|
|
*
|
|
* @param {string|Affixes} rawAffixes
|
|
* @param {string} [defaultPrefix]
|
|
* @returns {Affixes}
|
|
*/
|
|
function parseAffixes(rawAffixes, defaultPrefix) {
|
|
/** @type {Affixes} */
|
|
let affixes = {};
|
|
if (rawAffixes) {
|
|
switch (typeof rawAffixes) {
|
|
case 'string':
|
|
affixes.prefix = rawAffixes;
|
|
break;
|
|
case 'object':
|
|
affixes = rawAffixes;
|
|
break;
|
|
default:
|
|
throw new Error(`Unknown affix declaration: ${affixes}`);
|
|
}
|
|
} else {
|
|
affixes.prefix = defaultPrefix;
|
|
}
|
|
return affixes;
|
|
}
|
|
|
|
const _static = tempDir();
|
|
|
|
/**
|
|
* Returns a new path to a temporary directory
|
|
*
|
|
* @returns {string} A new tempDir() if tempRootDirectory is not provided
|
|
*/
|
|
const openDir = tempDir;
|
|
|
|
/**
|
|
* Returns a path to a temporary directory which is defined as static in the same process
|
|
*
|
|
* @returns {Promise<string>} A temp directory path which is defined as static in the same process
|
|
*/
|
|
|
|
async function staticDir() {
|
|
return _static;
|
|
}
|
|
|
|
export {open, path, openDir, staticDir};
|