1
0
mirror of https://github.com/lensapp/lens.git synced 2025-05-20 05:10:56 +00:00

better use of disposers

Signed-off-by: Sebastian Malton <sebastian@malton.name>
This commit is contained in:
Sebastian Malton 2021-04-14 16:23:38 -04:00
parent 9550f0754c
commit 865e893019
3 changed files with 21 additions and 25 deletions

View File

@ -4,7 +4,9 @@ interface Extendable<T> {
push(...vals: T[]): void; push(...vals: T[]): void;
} }
export function disposer(...args: Disposer[]): Disposer & Extendable<Disposer> { export type ExtendableDisposer = Disposer & Extendable<Disposer>;
export function disposer(...args: Disposer[]): ExtendableDisposer {
const res = () => { const res = () => {
args.forEach(dispose => dispose?.()); args.forEach(dispose => dispose?.());
args.length = 0; args.length = 0;

View File

@ -1,6 +1,6 @@
import { action, computed, observable } from "mobx"; import { action, computed, observable } from "mobx";
import logger from "../../../main/logger"; import logger from "../../../main/logger";
import { disposer, Disposer } from "../../utils"; import { disposer, ExtendableDisposer } from "../../utils";
import * as uuid from "uuid"; import * as uuid from "uuid";
import { broadcastMessage } from "../../../common/ipc"; import { broadcastMessage } from "../../../common/ipc";
import { ipcRenderer } from "electron"; import { ipcRenderer } from "electron";
@ -76,7 +76,7 @@ export class ExtensionInstallationStateStore {
* determined. * determined.
* @returns a disposer which should be called to mark the end of the install phase * @returns a disposer which should be called to mark the end of the install phase
*/ */
@action static startPreInstall(): Disposer { @action static startPreInstall(): ExtendableDisposer {
const preInstallStepId = uuid.v4(); const preInstallStepId = uuid.v4();
logger.debug(`${Prefix}: starting a new preinstall phase: ${preInstallStepId}`); logger.debug(`${Prefix}: starting a new preinstall phase: ${preInstallStepId}`);

View File

@ -6,7 +6,7 @@ import { disposeOnUnmount, observer } from "mobx-react";
import os from "os"; import os from "os";
import path from "path"; import path from "path";
import React from "react"; import React from "react";
import { autobind, disposer, Disposer, downloadFile, downloadJson, extractTar, listTarEntries, noop, readFileFromTar } from "../../../common/utils"; import { autobind, disposer, Disposer, downloadFile, downloadJson, ExtendableDisposer, extractTar, listTarEntries, noop, readFileFromTar } from "../../../common/utils";
import { docsUrl } from "../../../common/vars"; import { docsUrl } from "../../../common/vars";
import { extensionDiscovery, InstalledExtension, manifestFilename } from "../../../extensions/extension-discovery"; import { extensionDiscovery, InstalledExtension, manifestFilename } from "../../../extensions/extension-discovery";
import { extensionLoader } from "../../../extensions/extension-loader"; import { extensionLoader } from "../../../extensions/extension-loader";
@ -166,13 +166,15 @@ async function validatePackage(filePath: string): Promise<LensExtensionManifest>
return manifest; return manifest;
} }
async function createTempFilesAndValidate({ fileName, dataP }: InstallRequest, { showErrors = true } = {}): Promise<InstallRequestValidated | null> { async function createTempFilesAndValidate({ fileName, dataP }: InstallRequest, disposer: ExtendableDisposer): Promise<InstallRequestValidated | null> {
// copy files to temp // copy files to temp
await fse.ensureDir(getExtensionPackageTemp()); await fse.ensureDir(getExtensionPackageTemp());
// validate packages // validate packages
const tempFile = getExtensionPackageTemp(fileName); const tempFile = getExtensionPackageTemp(fileName);
disposer.push(() => fse.unlink(tempFile));
try { try {
const data = await dataP; const data = await dataP;
@ -192,19 +194,15 @@ async function createTempFilesAndValidate({ fileName, dataP }: InstallRequest, {
id, id,
}; };
} catch (error) { } catch (error) {
fse.unlink(tempFile).catch(noop); // remove invalid temp package const message = getMessageFromError(error);
if (showErrors) { logger.info(`[EXTENSION-INSTALLATION]: installing ${fileName} has failed: ${message}`, { error });
const message = getMessageFromError(error); Notifications.error(
<div className="flex column gaps">
logger.info(`[EXTENSION-INSTALLATION]: installing ${fileName} has failed: ${message}`, { error }); <p>Installing <em>{fileName}</em> has failed, skipping.</p>
Notifications.error( <p>Reason: <em>{message}</em></p>
<div className="flex column gaps"> </div>
<p>Installing <em>{fileName}</em> has failed, skipping.</p> );
<p>Reason: <em>{message}</em></p>
</div>
);
}
} }
return null; return null;
@ -317,9 +315,9 @@ export async function attemptInstallByInfo({ name, version, requireConfirmation
return attemptInstall({ fileName, dataP }, disposer); return attemptInstall({ fileName, dataP }, disposer);
} }
async function attemptInstall(request: InstallRequest, d?: Disposer): Promise<void> { async function attemptInstall(request: InstallRequest, d?: ExtendableDisposer): Promise<void> {
const dispose = disposer(ExtensionInstallationStateStore.startPreInstall(), d); const dispose = disposer(ExtensionInstallationStateStore.startPreInstall(), d);
const validatedRequest = await createTempFilesAndValidate(request); const validatedRequest = await createTempFilesAndValidate(request, dispose);
if (!validatedRequest) { if (!validatedRequest) {
return dispose(); return dispose();
@ -366,15 +364,11 @@ async function attemptInstall(request: InstallRequest, d?: Disposer): Promise<vo
await unpackExtension(validatedRequest, dispose); await unpackExtension(validatedRequest, dispose);
} else { } else {
dispose(); dispose();
await fse.unlink(validatedRequest.tempFile).catch(noop);
} }
}} /> }} />
</div>, </div>,
{ {
onClose() { onClose: dispose,
dispose();
fse.unlink(validatedRequest.tempFile).catch(noop);
}
} }
); );
} }
@ -399,7 +393,7 @@ async function installOnDrop(files: File[]) {
} }
async function installFromInput(input: string) { async function installFromInput(input: string) {
let disposer: Disposer; let disposer: ExtendableDisposer | undefined = undefined;
try { try {
// fixme: improve error messages for non-tar-file URLs // fixme: improve error messages for non-tar-file URLs