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:
parent
9550f0754c
commit
865e893019
@ -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;
|
||||||
|
|||||||
@ -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}`);
|
||||||
|
|||||||
@ -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
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user