Secure your code as it's written. Use Snyk Code to scan source code in minutes - no build needed - and fix issues immediately.
}
while (true) {
if (this.readState === ReadState.BODY) {
this.readState = ReadState.INIT
}
else {
this.partIndex++
let taskIndex = this.partIndexToTaskIndex.get(this.partIndex)
if (taskIndex == null) {
if (this.isFinished) {
taskIndex = this.options.end
}
else {
throw newError("taskIndex is null", "ERR_DATA_SPLITTER_TASK_INDEX_IS_NULL")
}
}
const prevTaskIndex = this.partIndex === 0 ? this.options.start : (this.partIndexToTaskIndex.get(this.partIndex - 1)!! + 1 /* prev part is download, next maybe copy */)
if (prevTaskIndex < taskIndex) {
await this.copyExistingData(prevTaskIndex, taskIndex)
}
else if (prevTaskIndex > taskIndex) {
throw newError("prevTaskIndex must be < taskIndex", "ERR_DATA_SPLITTER_TASK_INDEX_ASSERT_FAILED")
}
if (this.isFinished) {
this.onPartEnd()
this.finishHandler()
return
}
async getLatestVersion(): Promise {
const cancellationToken = new CancellationToken()
const channelFile = getChannelFilename(this.getDefaultChannelName())
const releaseInfo = await this.getLatestVersionInfo(cancellationToken)
const asset = releaseInfo.assets.find(it => it.name === channelFile)
if (asset == null) {
// html_url must be always, but just to be sure
throw newError(`Cannot find ${channelFile} in the release ${releaseInfo.html_url || releaseInfo.name}`, "ERR_UPDATER_CHANNEL_FILE_NOT_FOUND")
}
const url = new URL(asset.url)
let result: any
try {
result = safeLoad((await this.httpRequest(url, this.configureHeaders("application/octet-stream"), cancellationToken))!!)
}
catch (e) {
if (e instanceof HttpError && e.statusCode === 404) {
throw newError(`Cannot find ${channelFile} in the latest release artifacts (${url}): ${e.stack || e.message}`, "ERR_UPDATER_CHANNEL_FILE_NOT_FOUND")
}
throw e
}
(result as PrivateGitHubUpdateInfo).assets = releaseInfo.assets
return result
let taskIndex = this.partIndexToTaskIndex.get(this.partIndex)
if (taskIndex == null) {
if (this.isFinished) {
taskIndex = this.options.end
}
else {
throw newError("taskIndex is null", "ERR_DATA_SPLITTER_TASK_INDEX_IS_NULL")
}
}
const prevTaskIndex = this.partIndex === 0 ? this.options.start : (this.partIndexToTaskIndex.get(this.partIndex - 1)!! + 1 /* prev part is download, next maybe copy */)
if (prevTaskIndex < taskIndex) {
await this.copyExistingData(prevTaskIndex, taskIndex)
}
else if (prevTaskIndex > taskIndex) {
throw newError("prevTaskIndex must be < taskIndex", "ERR_DATA_SPLITTER_TASK_INDEX_ASSERT_FAILED")
}
if (this.isFinished) {
this.onPartEnd()
this.finishHandler()
return
}
start = this.searchHeaderListEnd(chunk, start)
if (start === -1) {
this.readState = ReadState.HEADER
return
}
}
private githubRequest(path: string, token: string | null, data: {[name: string]: any; } | null = null, method?: "GET" | "DELETE" | "PUT"): Promise {
// host can contains port, but node http doesn't support host as url does
const baseUrl = parseUrl(`https://${this.info.host || "api.github.com"}`)
return parseJson(httpExecutor.request(configureRequestOptions({
hostname: baseUrl.hostname,
port: baseUrl.port as any,
path: (this.info.host != null && this.info.host !== "github.com") ? `/api/v3${path.startsWith("/") ? path : `/${path}`}` : path,
headers: {accept: "application/vnd.github.v3+json"}
}, token, method), this.context.cancellationToken, data))
}
createRequestOptions(): RequestOptions {
const result = {
headers: {
...this.options.requestHeaders,
accept: "*/*",
},
}
configureRequestUrl(this.options.newUrl, result)
// user-agent, cache-control and other common options
configureRequestOptions(result)
return result
}
async getLatestVersion(): Promise {
const cancellationToken = new CancellationToken()
const feedXml: string = (await this.httpRequest(newUrlFromBase(`${this.basePath}.atom`, this.baseUrl), {
accept: "application/xml, application/atom+xml, text/xml, */*",
}, cancellationToken))!
const feed = parseXml(feedXml)
let latestRelease = feed.element("entry", false, `No published versions on GitHub`)
let version: string | null
try {
if (this.updater.allowPrerelease) {
// noinspection TypeScriptValidateJSTypes
version = latestRelease.element("link").attribute("href").match(hrefRegExp)!![1]
}
else {
version = await this.getLatestVersionString(cancellationToken)
for (const element of feed.getElements("entry")) {
async getLatestVersion(): Promise {
const cancellationToken = new CancellationToken()
const channelFile = getChannelFilename(this.getDefaultChannelName())
const releaseInfo = await this.getLatestVersionInfo(cancellationToken)
const asset = releaseInfo.assets.find(it => it.name === channelFile)
if (asset == null) {
// html_url must be always, but just to be sure
throw newError(`Cannot find ${channelFile} in the release ${releaseInfo.html_url || releaseInfo.name}`, "ERR_UPDATER_CHANNEL_FILE_NOT_FOUND")
}
const url = new URL(asset.url)
let result: any
try {
result = safeLoad((await this.httpRequest(url, this.configureHeaders("application/octet-stream"), cancellationToken))!!)
}
catch (e) {
if (e instanceof HttpError && e.statusCode === 404) {
createRequestOptions(): RequestOptions {
const result = {
headers: {
...this.options.requestHeaders,
accept: "*/*",
},
}
configureRequestUrl(this.options.newUrl, result)
// user-agent, cache-control and other common options
configureRequestOptions(result)
return result
}
if (!companyName) {
log.warn(`Manufacturer is not set for MSI — please set "author" in the package.json`)
}
const compression = this.packager.compression
const options = this.options
const iconPath = await this.packager.getIconPath()
return (await projectTemplate.value)({
...commonOptions,
isCreateDesktopShortcut: commonOptions.isCreateDesktopShortcut !== DesktopShortcutCreationPolicy.NEVER,
isRunAfterFinish: options.runAfterFinish !== false,
iconPath: iconPath == null ? null : this.vm.toVmFile(iconPath),
compressionLevel: compression === "store" ? "none" : "high",
version: appInfo.getVersionInWeirdWindowsForm(),
productName: appInfo.productName,
upgradeCode: (options.upgradeCode || UUID.v5(appInfo.id, ELECTRON_BUILDER_UPGRADE_CODE_NS_UUID)).toUpperCase(),
manufacturer: companyName || appInfo.productName,
appDescription: appInfo.description,
// https://stackoverflow.com/questions/1929038/compilation-error-ice80-the-64bitcomponent-uses-32bitdirectory
programFilesId: arch === Arch.x64 ? "ProgramFiles64Folder" : "ProgramFilesFolder",
// wix in the name because special wix format can be used in the name
installationDirectoryWixName: getWindowsInstallationDirName(appInfo, commonOptions.isPerMachine === true),
dirs,
files,
})
}
file: log.filePath(installerPath),
archs: Array.from(this.archs.keys()).map(it => Arch[it]).join(", "),
}
const isPerMachine = options.perMachine === true
if (!this.isPortable) {
logFields.oneClick = oneClick
logFields.perMachine = isPerMachine
}
await packager.info.callArtifactBuildStarted({
targetPresentableName: this.name,
file: installerPath,
arch: null,
}, logFields)
const guid = options.guid || UUID.v5(appInfo.id, ELECTRON_BUILDER_NS_UUID)
const uninstallAppKey = guid.replace(/\\/g, " - ")
const defines: any = {
APP_ID: appInfo.id,
APP_GUID: guid,
// Windows bug - entry in Software\Microsoft\Windows\CurrentVersion\Uninstall cannot have \ symbols (dir)
UNINSTALL_APP_KEY: uninstallAppKey,
PRODUCT_NAME: appInfo.productName,
PRODUCT_FILENAME: appInfo.productFilename,
APP_FILENAME: getWindowsInstallationDirName(appInfo, !oneClick || isPerMachine),
APP_DESCRIPTION: appInfo.description,
VERSION: appInfo.version,
PROJECT_DIR: packager.projectDir,
BUILD_RESOURCES_DIR: packager.info.buildResourcesDir,
APP_PACKAGE_NAME: appInfo.name