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

chore(refactor): electron-updater cyclical imports #8913

Merged
merged 2 commits into from
Feb 27, 2025
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions .changeset/khaki-sheep-bake.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"electron-updater": patch
---

chore(refactor): refactoring code to reduce cyclical imports in order to migrate to rollup + vite (which have much more strict module resolutions)
2 changes: 1 addition & 1 deletion packages/electron-updater/src/AppImageUpdater.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,8 @@ import { DownloadUpdateOptions } from "./AppUpdater"
import { BaseUpdater, InstallOptions } from "./BaseUpdater"
import { DifferentialDownloaderOptions } from "./differentialDownloader/DifferentialDownloader"
import { FileWithEmbeddedBlockMapDifferentialDownloader } from "./differentialDownloader/FileWithEmbeddedBlockMapDifferentialDownloader"
import { DOWNLOAD_PROGRESS, ResolvedUpdateFileInfo } from "./main"
import { findFile, Provider } from "./providers/Provider"
import { DOWNLOAD_PROGRESS, ResolvedUpdateFileInfo } from "./exports"

export class AppImageUpdater extends BaseUpdater {
constructor(options?: AllPublishOptions | null, app?: any) {
Expand Down
15 changes: 3 additions & 12 deletions packages/electron-updater/src/AppUpdater.ts
Original file line number Diff line number Diff line change
Expand Up @@ -26,26 +26,17 @@ import { createTempUpdateFile, DownloadedUpdateHelper } from "./DownloadedUpdate
import { ElectronAppAdapter } from "./ElectronAppAdapter"
import { ElectronHttpExecutor, getNetSession, LoginCallback } from "./electronHttpExecutor"
import { GenericProvider } from "./providers/GenericProvider"
import {
DOWNLOAD_PROGRESS,
Logger,
Provider,
ResolvedUpdateFileInfo,
UPDATE_DOWNLOADED,
UpdateCheckResult,
UpdateDownloadedEvent,
UpdaterSignal,
VerifyUpdateSupport,
} from "./main"
import { createClient, isUrlProbablySupportMultiRangeRequests } from "./providerFactory"
import { ProviderPlatform } from "./providers/Provider"
import { Provider, ProviderPlatform } from "./providers/Provider"
import type { TypedEmitter } from "tiny-typed-emitter"
import Session = Electron.Session
import type { AuthInfo } from "electron"
import { gunzipSync } from "zlib"
import { blockmapFiles } from "./util"
import { DifferentialDownloaderOptions } from "./differentialDownloader/DifferentialDownloader"
import { GenericDifferentialDownloader } from "./differentialDownloader/GenericDifferentialDownloader"
import { DOWNLOAD_PROGRESS, Logger, ResolvedUpdateFileInfo, UPDATE_DOWNLOADED, UpdateCheckResult, UpdateDownloadedEvent, UpdaterSignal } from "./exports"
import { VerifyUpdateSupport } from "./main"

export type AppUpdaterEvents = {
error: (error: Error, message?: string) => void
Expand Down
2 changes: 1 addition & 1 deletion packages/electron-updater/src/DebUpdater.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,8 @@ import { AllPublishOptions } from "builder-util-runtime"
import { AppAdapter } from "./AppAdapter"
import { DownloadUpdateOptions } from "./AppUpdater"
import { BaseUpdater, InstallOptions } from "./BaseUpdater"
import { DOWNLOAD_PROGRESS } from "./main"
import { findFile } from "./providers/Provider"
import { DOWNLOAD_PROGRESS } from "./exports"

export class DebUpdater extends BaseUpdater {
constructor(options?: AllPublishOptions | null, app?: AppAdapter) {
Expand Down
3 changes: 2 additions & 1 deletion packages/electron-updater/src/DownloadedUpdateHelper.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,8 @@ import { createHash } from "crypto"
import { createReadStream } from "fs"
// @ts-ignore
import * as isEqual from "lodash.isequal"
import { Logger, ResolvedUpdateFileInfo } from "./main"
import { ResolvedUpdateFileInfo } from "./exports"
import { Logger } from "./exports"
import { pathExists, readJson, emptyDir, outputJson, unlink } from "fs-extra"
import * as path from "path"

Expand Down
3 changes: 2 additions & 1 deletion packages/electron-updater/src/MacUpdater.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,8 @@ import * as path from "path"
import { createServer, IncomingMessage, Server, ServerResponse } from "http"
import { AppAdapter } from "./AppAdapter"
import { AppUpdater, DownloadUpdateOptions } from "./AppUpdater"
import { ResolvedUpdateFileInfo, UpdateDownloadedEvent } from "./main"
import { ResolvedUpdateFileInfo } from "./main"
import { UpdateDownloadedEvent } from "./exports"
import { findFile } from "./providers/Provider"
import AutoUpdater = Electron.AutoUpdater
import { execFileSync } from "child_process"
Expand Down
3 changes: 2 additions & 1 deletion packages/electron-updater/src/NsisUpdater.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,8 @@ import { DownloadUpdateOptions } from "./AppUpdater"
import { BaseUpdater, InstallOptions } from "./BaseUpdater"
import { DifferentialDownloaderOptions } from "./differentialDownloader/DifferentialDownloader"
import { FileWithEmbeddedBlockMapDifferentialDownloader } from "./differentialDownloader/FileWithEmbeddedBlockMapDifferentialDownloader"
import { DOWNLOAD_PROGRESS, VerifyUpdateCodeSignature } from "./main"
import { DOWNLOAD_PROGRESS } from "./exports"
import { VerifyUpdateCodeSignature } from "./main"
import { findFile, Provider } from "./providers/Provider"
import { unlink } from "fs-extra"
import { verifySignature } from "./windowsExecutableCodeSignatureVerifier"
Expand Down
2 changes: 1 addition & 1 deletion packages/electron-updater/src/PacmanUpdater.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ import { AllPublishOptions } from "builder-util-runtime"
import { AppAdapter } from "./AppAdapter"
import { DownloadUpdateOptions } from "./AppUpdater"
import { BaseUpdater, InstallOptions } from "./BaseUpdater"
import { DOWNLOAD_PROGRESS } from "./main"
import { DOWNLOAD_PROGRESS } from "./exports"
import { findFile } from "./providers/Provider"

export class PacmanUpdater extends BaseUpdater {
Expand Down
2 changes: 1 addition & 1 deletion packages/electron-updater/src/RpmUpdater.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ import { AllPublishOptions } from "builder-util-runtime"
import { AppAdapter } from "./AppAdapter"
import { DownloadUpdateOptions } from "./AppUpdater"
import { BaseUpdater, InstallOptions } from "./BaseUpdater"
import { DOWNLOAD_PROGRESS } from "./main"
import { DOWNLOAD_PROGRESS } from "./exports"
import { findFile } from "./providers/Provider"

export class RpmUpdater extends BaseUpdater {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import { close, open } from "fs-extra"
import { createWriteStream } from "fs"
import { OutgoingHttpHeaders, RequestOptions } from "http"
import { ProgressInfo, CancellationToken } from "builder-util-runtime"
import { Logger } from "../main"
import { Logger } from "../exports"
import { copyData } from "./DataSplitter"
import { URL } from "url"
import { computeOperations, Operation, OperationKind } from "./downloadPlanBuilder"
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { BlockMap, BlockMapFile } from "builder-util-runtime/out/blockMapApi"
import { Logger } from "../main"
import { Logger } from "../exports"

export enum OperationKind {
COPY,
Expand Down
81 changes: 81 additions & 0 deletions packages/electron-updater/src/exports.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,81 @@
import { CancellationToken, PackageFileInfo, ProgressInfo, UpdateFileInfo, UpdateInfo } from "builder-util-runtime"
import { EventEmitter } from "events"
import { URL } from "url"
import { LoginCallback } from "./electronHttpExecutor"

export const DOWNLOAD_PROGRESS = "download-progress"
export const UPDATE_DOWNLOADED = "update-downloaded"

export interface Logger {
info(message?: any): void

warn(message?: any): void

error(message?: any): void

debug?(message: string): void
}

export class UpdaterSignal {
constructor(private emitter: EventEmitter) {}

/**
* Emitted when an authenticating proxy is [asking for user credentials](https://github.com/electron/electron/blob/master/docs/api/client-request.md#event-login).
*/
login(handler: LoginHandler): void {
addHandler(this.emitter, "login", handler)
}

progress(handler: (info: ProgressInfo) => void): void {
addHandler(this.emitter, DOWNLOAD_PROGRESS, handler)
}

updateDownloaded(handler: (info: UpdateDownloadedEvent) => void): void {
addHandler(this.emitter, UPDATE_DOWNLOADED, handler)
}

updateCancelled(handler: (info: UpdateInfo) => void): void {
addHandler(this.emitter, "update-cancelled", handler)
}
}

const isLogEvent = false

export function addHandler(emitter: EventEmitter, event: UpdaterEvents, handler: (...args: Array<any>) => void): void {
if (isLogEvent) {
emitter.on(event, (...args: Array<any>) => {
console.log("%s %s", event, args)
handler(...args)
})
} else {
emitter.on(event, handler)
}
}

export interface UpdateCheckResult {
readonly isUpdateAvailable: boolean

readonly updateInfo: UpdateInfo

readonly downloadPromise?: Promise<Array<string>> | null

readonly cancellationToken?: CancellationToken

/** @deprecated */
readonly versionInfo: UpdateInfo
}

export interface UpdateDownloadedEvent extends UpdateInfo {
downloadedFile: string
}

export interface ResolvedUpdateFileInfo {
readonly url: URL
readonly info: UpdateFileInfo

packageInfo?: PackageFileInfo
}

export type UpdaterEvents = "login" | "checking-for-update" | "update-available" | "update-not-available" | "update-cancelled" | "download-progress" | "update-downloaded" | "error"

export type LoginHandler = (authInfo: any, callback: LoginCallback) => void
85 changes: 3 additions & 82 deletions packages/electron-updater/src/main.ts
Original file line number Diff line number Diff line change
@@ -1,14 +1,10 @@
import { CancellationToken, PackageFileInfo, ProgressInfo, UpdateFileInfo, UpdateInfo } from "builder-util-runtime"
import { EventEmitter } from "events"
import { existsSync, readFileSync } from "fs-extra"
import * as path from "path"
import { URL } from "url"
import { AppUpdater } from "./AppUpdater"
import { LoginCallback } from "./electronHttpExecutor"
import { UpdateInfo } from "builder-util-runtime"

export { BaseUpdater } from "./BaseUpdater"
export { AppUpdater, NoOpLogger } from "./AppUpdater"
export { CancellationToken, PackageFileInfo, ProgressInfo, UpdateFileInfo, UpdateInfo }
export { Provider } from "./providers/Provider"
export { AppImageUpdater } from "./AppImageUpdater"
export { DebUpdater } from "./DebUpdater"
Expand All @@ -17,6 +13,8 @@ export { RpmUpdater } from "./RpmUpdater"
export { MacUpdater } from "./MacUpdater"
export { NsisUpdater } from "./NsisUpdater"

export * from "./exports"

// autoUpdater to mimic electron bundled autoUpdater
let _autoUpdater: any

Expand Down Expand Up @@ -69,83 +67,6 @@ Object.defineProperty(exports, "autoUpdater", {
},
})

export interface ResolvedUpdateFileInfo {
readonly url: URL
readonly info: UpdateFileInfo

packageInfo?: PackageFileInfo
}

export interface UpdateCheckResult {
readonly isUpdateAvailable: boolean

readonly updateInfo: UpdateInfo

readonly downloadPromise?: Promise<Array<string>> | null

readonly cancellationToken?: CancellationToken

/** @deprecated */
readonly versionInfo: UpdateInfo
}

export type UpdaterEvents = "login" | "checking-for-update" | "update-available" | "update-not-available" | "update-cancelled" | "download-progress" | "update-downloaded" | "error"

export const DOWNLOAD_PROGRESS = "download-progress"
export const UPDATE_DOWNLOADED = "update-downloaded"

export type LoginHandler = (authInfo: any, callback: LoginCallback) => void

export class UpdaterSignal {
constructor(private emitter: EventEmitter) {}

/**
* Emitted when an authenticating proxy is [asking for user credentials](https://github.com/electron/electron/blob/master/docs/api/client-request.md#event-login).
*/
login(handler: LoginHandler): void {
addHandler(this.emitter, "login", handler)
}

progress(handler: (info: ProgressInfo) => void): void {
addHandler(this.emitter, DOWNLOAD_PROGRESS, handler)
}

updateDownloaded(handler: (info: UpdateDownloadedEvent) => void): void {
addHandler(this.emitter, UPDATE_DOWNLOADED, handler)
}

updateCancelled(handler: (info: UpdateInfo) => void): void {
addHandler(this.emitter, "update-cancelled", handler)
}
}

export interface UpdateDownloadedEvent extends UpdateInfo {
downloadedFile: string
}

const isLogEvent = false

function addHandler(emitter: EventEmitter, event: UpdaterEvents, handler: (...args: Array<any>) => void): void {
if (isLogEvent) {
emitter.on(event, (...args: Array<any>) => {
console.log("%s %s", event, args)
handler(...args)
})
} else {
emitter.on(event, handler)
}
}

export interface Logger {
info(message?: any): void

warn(message?: any): void

error(message?: any): void

debug?(message: string): void
}

/**
* return null if verify signature succeed
* return error message if verify signature failed
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { CancellationToken, BitbucketOptions, newError, UpdateInfo } from "builder-util-runtime"
import { AppUpdater } from "../AppUpdater"
import { ResolvedUpdateFileInfo } from "../main"
import { ResolvedUpdateFileInfo } from "../exports"
import { getChannelFilename, newBaseUrl, newUrlFromBase } from "../util"
import { parseUpdateInfo, Provider, ProviderRuntimeOptions, resolveFiles } from "./Provider"

Expand Down
2 changes: 1 addition & 1 deletion packages/electron-updater/src/providers/GenericProvider.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { GenericServerOptions, HttpError, newError, UpdateInfo } from "builder-util-runtime"
import { AppUpdater } from "../AppUpdater"
import { ResolvedUpdateFileInfo } from "../main"
import { ResolvedUpdateFileInfo } from "../exports"
import { getChannelFilename, newBaseUrl, newUrlFromBase } from "../util"
import { parseUpdateInfo, Provider, ProviderRuntimeOptions, resolveFiles } from "./Provider"

Expand Down
2 changes: 1 addition & 1 deletion packages/electron-updater/src/providers/GitHubProvider.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ import { CancellationToken, GithubOptions, githubUrl, HttpError, newError, parse
import * as semver from "semver"
import { URL } from "url"
import { AppUpdater } from "../AppUpdater"
import { ResolvedUpdateFileInfo } from "../main"
import { ResolvedUpdateFileInfo } from "../exports"
import { getChannelFilename, newBaseUrl, newUrlFromBase } from "../util"
import { parseUpdateInfo, Provider, ProviderRuntimeOptions, resolveFiles } from "./Provider"

Expand Down
2 changes: 1 addition & 1 deletion packages/electron-updater/src/providers/KeygenProvider.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { CancellationToken, KeygenOptions, newError, UpdateInfo } from "builder-util-runtime"
import { AppUpdater } from "../AppUpdater"
import { ResolvedUpdateFileInfo } from "../main"
import { ResolvedUpdateFileInfo } from "../exports"
import { getChannelFilename, newBaseUrl, newUrlFromBase } from "../util"
import { parseUpdateInfo, Provider, ProviderRuntimeOptions, resolveFiles } from "./Provider"

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ import { AppUpdater } from "../AppUpdater"
import { URL } from "url"
import { getChannelFilename, newUrlFromBase } from "../util"
import { BaseGitHubProvider } from "./GitHubProvider"
import { ResolvedUpdateFileInfo } from "../main"
import { ResolvedUpdateFileInfo } from "../exports"
import { getFileList, ProviderRuntimeOptions } from "./Provider"

export interface PrivateGitHubUpdateInfo extends UpdateInfo {
Expand Down
2 changes: 1 addition & 1 deletion packages/electron-updater/src/providers/Provider.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ import { OutgoingHttpHeaders, RequestOptions } from "http"
import { load } from "js-yaml"
import { URL } from "url"
import { ElectronHttpExecutor } from "../electronHttpExecutor"
import { ResolvedUpdateFileInfo } from "../main"
import { ResolvedUpdateFileInfo } from "../exports"
import { newUrlFromBase } from "../util"

export type ProviderPlatform = "darwin" | "linux" | "win32"
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import { parseDn } from "builder-util-runtime"
import { execFile, execFileSync } from "child_process"
import * as os from "os"
import { Logger } from "./main"
import { Logger } from "./exports"
import * as path from "path"

// $certificateInfo = (Get-AuthenticodeSignature 'xxx\yyy.exe'
Expand Down
Loading