Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: Move WAD server installation into a driver script #277

Merged
merged 14 commits into from
Sep 16, 2024
63 changes: 55 additions & 8 deletions scripts/install-wad.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ const API_ROOT = `https://api.github.com/repos/${OWNER}/${REPO}`;
const DOWNLOAD_TIMEOUT_MS = 45 * 1000;
const STABLE_VERSION = 'stable';
const EXT_MSI = '.msi';
const EXT_EXE = '.exe';

/**
*
Expand Down Expand Up @@ -55,16 +56,27 @@ async function listReleases() {
const isDraft = !!releaseInfo.draft;
const isPrerelease = !!releaseInfo.prerelease;
const version = semver.coerce(releaseInfo.tag_name?.replace(/^v/, ''));
const downloadUrl = releaseInfo.assets?.[0]?.browser_download_url;
const assetName = releaseInfo.assets?.[0]?.name;
if (!version || !downloadUrl || !_.endsWith(assetName, EXT_MSI)) {
if (!version) {
continue;
}
/** @type {ReleaseAsset[]} */
const releaseAssets = [];
for (const asset of (releaseInfo.assets ?? [])) {
const assetName = asset?.name;
const downloadUrl = asset?.browser_download_url;
if (!(_.endsWith(assetName, EXT_MSI) || _.endsWith(assetName, EXT_EXE)) || !downloadUrl) {
continue;
}
releaseAssets.push({
name: assetName,
url: downloadUrl,
});
}
result.push({
version,
isDraft,
isPrerelease,
downloadUrl,
assets: releaseAssets,
});
}
return result;
Expand Down Expand Up @@ -100,26 +112,55 @@ function selectRelease(releases, version) {
return dstRelease;
}

/**
*
* @param {ReleaseInfo} release
* @returns {ReleaseAsset}
*/
function selectAsset(release) {
if (_.isEmpty(release.assets)) {
throw new Error(`WinAppDriver v${release.version} does not contain any matching releases`);
}
if (release.assets.length === 1) {
return release.assets[0];
}
// Since v 1.2.99 installers for multiple OS architectures are provided
for (const asset of release.assets) {
if (_.includes(asset.name, `win-${process.arch}.`)) {
mykola-mokhnach marked this conversation as resolved.
Show resolved Hide resolved
return asset;
}
}
throw new Error(
`WinAppDriver v${release.version} does not contain any release matching the ` +
`current OS architecture ${process.arch}`
);
}

/**
*
* @param {string} version
* @returns {Promise<void>}
*/
async function installWad(version) {
if (process.platform !== 'win32') {
throw new Error('WinAppDriver is only supported on Windows');
}
log.debug(`Retrieving releases from ${API_ROOT}`);
const releases = await listReleases();
if (!releases.length) {
throw new Error(`Cannot retrieve any valid WinAppDriver releases from GitHub`);
}
log.debug(`Retrieved ${releases.length} GitHub releases`);
const release = selectRelease(releases, version);
const asset = selectAsset(release);
const parsedName = path.parse(asset.name);
const installerPath = path.join(
tmpdir(),
`wad_setup_${(Math.random() + 1).toString(36).substring(7)}${EXT_MSI}`
`${parsedName.name}_${(Math.random() + 1).toString(36).substring(7)}${parsedName.ext}`
);
log.info(`Will download and install v${release.version} from ${release.downloadUrl}`);
log.info(`Will download and install v${release.version} from ${asset.url}`);
try {
await downloadToFile(release.downloadUrl, installerPath);
await downloadToFile(asset.url, installerPath);
await shellExec(installerPath, ['/install', '/quiet', '/norestart']);
} finally {
try {
Expand All @@ -130,10 +171,16 @@ async function installWad(version) {

(async () => await installWad(process.argv[2] ?? STABLE_VERSION))();

/**
* @typedef {Object} ReleaseAsset
* @property {string} name
* @property {string} url
*/

/**
* @typedef {Object} ReleaseInfo
* @property {import('semver').SemVer} version
* @property {boolean} isDraft
* @property {boolean} isPrerelease
* @property {string} downloadUrl
* @property {ReleaseAsset[]} assets
*/
Loading