Tons of Solutions Engineering work done today for the rest of the CS team! Headway, Howard Hanna, Engels, Brighton, etc. Also completed Datasnippers auth flow and worked on Anthology's script. Cloned Anthology's courses (900..) and will clone Full Story on Monday.

This commit is contained in:
Norm Rasmussen
2024-01-05 17:07:59 -05:00
parent ce261975ca
commit a5fe4bd2c8
3157 changed files with 554269 additions and 16 deletions

View File

@ -0,0 +1,117 @@
/**
* @license
* Copyright 2017 Google Inc.
* SPDX-License-Identifier: Apache-2.0
*/
import assert from 'assert';
import { existsSync } from 'fs';
import { mkdir, unlink } from 'fs/promises';
import os from 'os';
import path from 'path';
import { downloadUrls, } from './browser-data/browser-data.js';
import { Cache, InstalledBrowser } from './Cache.js';
import { debug } from './debug.js';
import { detectBrowserPlatform } from './detectPlatform.js';
import { unpackArchive } from './fileUtil.js';
import { downloadFile, headHttpRequest } from './httpUtil.js';
const debugInstall = debug('puppeteer:browsers:install');
const times = new Map();
function debugTime(label) {
times.set(label, process.hrtime());
}
function debugTimeEnd(label) {
const end = process.hrtime();
const start = times.get(label);
if (!start) {
return;
}
const duration = end[0] * 1000 + end[1] / 1e6 - (start[0] * 1000 + start[1] / 1e6); // calculate duration in milliseconds
debugInstall(`Duration for ${label}: ${duration}ms`);
}
export async function install(options) {
options.platform ??= detectBrowserPlatform();
options.unpack ??= true;
if (!options.platform) {
throw new Error(`Cannot download a binary for the provided platform: ${os.platform()} (${os.arch()})`);
}
const url = getDownloadUrl(options.browser, options.platform, options.buildId, options.baseUrl);
const fileName = url.toString().split('/').pop();
assert(fileName, `A malformed download URL was found: ${url}.`);
const cache = new Cache(options.cacheDir);
const browserRoot = cache.browserRoot(options.browser);
const archivePath = path.join(browserRoot, `${options.buildId}-${fileName}`);
if (!existsSync(browserRoot)) {
await mkdir(browserRoot, { recursive: true });
}
if (!options.unpack) {
if (existsSync(archivePath)) {
return archivePath;
}
debugInstall(`Downloading binary from ${url}`);
debugTime('download');
await downloadFile(url, archivePath, options.downloadProgressCallback);
debugTimeEnd('download');
return archivePath;
}
const outputPath = cache.installationDir(options.browser, options.platform, options.buildId);
if (existsSync(outputPath)) {
return new InstalledBrowser(cache, options.browser, options.buildId, options.platform);
}
try {
debugInstall(`Downloading binary from ${url}`);
try {
debugTime('download');
await downloadFile(url, archivePath, options.downloadProgressCallback);
}
finally {
debugTimeEnd('download');
}
debugInstall(`Installing ${archivePath} to ${outputPath}`);
try {
debugTime('extract');
await unpackArchive(archivePath, outputPath);
}
finally {
debugTimeEnd('extract');
}
}
finally {
if (existsSync(archivePath)) {
await unlink(archivePath);
}
}
return new InstalledBrowser(cache, options.browser, options.buildId, options.platform);
}
/**
*
* @public
*/
export async function uninstall(options) {
options.platform ??= detectBrowserPlatform();
if (!options.platform) {
throw new Error(`Cannot detect the browser platform for: ${os.platform()} (${os.arch()})`);
}
new Cache(options.cacheDir).uninstall(options.browser, options.platform, options.buildId);
}
/**
* Returns metadata about browsers installed in the cache directory.
*
* @public
*/
export async function getInstalledBrowsers(options) {
return new Cache(options.cacheDir).getInstalledBrowsers();
}
/**
* @public
*/
export async function canDownload(options) {
options.platform ??= detectBrowserPlatform();
if (!options.platform) {
throw new Error(`Cannot download a binary for the provided platform: ${os.platform()} (${os.arch()})`);
}
return await headHttpRequest(getDownloadUrl(options.browser, options.platform, options.buildId, options.baseUrl));
}
function getDownloadUrl(browser, platform, buildId, baseUrl) {
return new URL(downloadUrls[browser](platform, buildId, baseUrl));
}
//# sourceMappingURL=install.js.map