mirror of
https://github.com/Zagrios/bs-manager.git
synced 2026-07-03 14:08:25 +02:00
[feature-274] handle irrelevant oculus download errors
Ignore errors such as "no token" when auto download or "window closed by user" in the ui
This commit is contained in:
@@ -1,6 +1,6 @@
|
||||
import { ChildProcessWithoutNullStreams, SpawnOptionsWithoutStdio, spawn } from "child_process";
|
||||
import { Observable, ReplaySubject, Subscriber, filter, map, share } from "rxjs";
|
||||
import { DepotDownloaderArgsOptions, DepotDownloaderErrorEvent, DepotDownloaderEvent, DepotDownloaderEventType, DepotDownloaderEventTypes, DepotDownloaderInfoEvent, DepotDownloaderWarningEvent } from "../../shared/models/depot-downloader.model";
|
||||
import { DepotDownloaderArgsOptions, DepotDownloaderErrorEvent, DepotDownloaderEvent, DepotDownloaderEventType, DepotDownloaderEventTypes, DepotDownloaderInfoEvent, DepotDownloaderWarningEvent } from "../../shared/models/bs-version-download/depot-downloader.model";
|
||||
|
||||
export class DepotDownloader {
|
||||
|
||||
|
||||
@@ -123,7 +123,7 @@ export class BsOculusDownloaderService {
|
||||
this.clearAuthToken();
|
||||
}
|
||||
|
||||
if(window.isClosable() && !window.isDestroyed()){
|
||||
if(!window.isDestroyed() && window.isClosable()){
|
||||
window.close();
|
||||
}
|
||||
});
|
||||
@@ -146,12 +146,6 @@ export class BsOculusDownloaderService {
|
||||
public downloadVersion(downloadInfo: DownloadInfo): Observable<Progression<BSVersion>>{
|
||||
|
||||
return from(this.getUserTokenFromMetaAuth(downloadInfo.stay)).pipe(
|
||||
map(token => {
|
||||
if(!token){
|
||||
throw new CustomError("No token has been found while try to auto download Beat Saber from Oculus", "OCULUS_TOKEN_NEEDED");
|
||||
}
|
||||
return token;
|
||||
}),
|
||||
switchMap(token => {
|
||||
if(!downloadInfo.isVerification){
|
||||
return this.createDownloadVersion(downloadInfo.bsVersion).then(({version, dest}) => ({token, version, dest}))
|
||||
@@ -175,7 +169,7 @@ export class BsOculusDownloaderService {
|
||||
return from(this.getAuthToken()).pipe(
|
||||
map(token => {
|
||||
if(!token){
|
||||
throw new CustomError("No token has been found while try to auto download Beat Saber from Oculus", "OCULUS_TOKEN_NEEDED");
|
||||
throw new CustomError("No Meta auth token was found in cookies for auto download", "NO_META_AUTH_TOKEN");
|
||||
}
|
||||
return token;
|
||||
}),
|
||||
|
||||
@@ -9,7 +9,7 @@ import { BSLocalVersionService } from "../bs-local-version.service";
|
||||
import { ensureDir } from "fs-extra";
|
||||
import { ensurePathNotAlreadyExist } from "../../helpers/fs.helpers";
|
||||
import { Observable, catchError, finalize, map, throwError } from "rxjs";
|
||||
import { DepotDownloaderArgsOptions, DepotDownloaderErrorEvent, DepotDownloaderEvent, DepotDownloaderEventType, DepotDownloaderInfoEvent } from "../../../shared/models/depot-downloader.model";
|
||||
import { DepotDownloaderArgsOptions, DepotDownloaderErrorEvent, DepotDownloaderEvent, DepotDownloaderEventType, DepotDownloaderInfoEvent } from "../../../shared/models/bs-version-download/depot-downloader.model";
|
||||
import { DepotDownloader } from "../../models/depot-downloader.class";
|
||||
import { app } from "electron";
|
||||
import { BsStore } from "../../../shared/models/bs-store.enum";
|
||||
|
||||
@@ -3,6 +3,7 @@ import { BrowserWindow, ipcMain } from "electron";
|
||||
import { Observable } from "rxjs";
|
||||
import { IpcCompleteChannel, IpcErrorChannel, IpcTearDownChannel } from "shared/models/ipc/ipc-response.interface";
|
||||
import { IpcReplier } from "shared/models/ipc/ipc-request.interface";
|
||||
import { serializeError } from 'serialize-error';
|
||||
import log from "electron-log";
|
||||
|
||||
export class IpcService {
|
||||
@@ -47,7 +48,7 @@ export class IpcService {
|
||||
next: data => this.send(channel, window, data),
|
||||
error: error => {
|
||||
log.error(error);
|
||||
this.send(this.getErrorChannel(channel), window, error);
|
||||
this.send(this.getErrorChannel(channel), window, serializeError(error));
|
||||
},
|
||||
complete: () => this.send(this.getCompleteChannel(channel), window)
|
||||
})
|
||||
|
||||
@@ -11,6 +11,7 @@ import { useService } from "renderer/hooks/use-service.hook";
|
||||
import { BSVersion } from "shared/bs-version.interface";
|
||||
import { useObservable } from "renderer/hooks/use-observable.hook";
|
||||
import { BsDownloaderService } from "renderer/services/bs-version-download/bs-downloader.service";
|
||||
import { BsStore } from "shared/models/bs-store.enum";
|
||||
|
||||
export const AvailableVersionsContext = createContext<{ selectedVersion: BSVersion; setSelectedVersion: (version: BSVersion) => void }>(null);
|
||||
|
||||
@@ -27,7 +28,10 @@ export function AvailableVersionsList() {
|
||||
|
||||
const startDownload = async () => {
|
||||
|
||||
const store = bsDownloader.getLastStoreDownloadedFrom() ?? await bsDownloader.chooseStoreToDownloadFrom().catch(() => null);
|
||||
const store = await (async () => {
|
||||
if(!selectedVersion.OculusBinaryId) { return BsStore.STEAM; }
|
||||
return bsDownloader.getLastStoreDownloadedFrom() ?? await bsDownloader.chooseStoreToDownloadFrom().catch(() => null);
|
||||
})();
|
||||
|
||||
if(!store){ return; }
|
||||
|
||||
|
||||
@@ -10,6 +10,7 @@ import { LoginToMetaModal } from "renderer/components/modal/modal-types/bs-downg
|
||||
import { DownloaderServiceInterface } from "./bs-store-downloader.interface";
|
||||
import { AbstractBsDownloaderService } from "./abstract-bs-downloader.service";
|
||||
import { DownloadInfo } from "main/services/bs-version-download/bs-steam-downloader.service";
|
||||
import { MetaAuthErrorCodes } from "shared/models/bs-version-download/oculus-download.model";
|
||||
|
||||
export class OculusDownloaderService extends AbstractBsDownloaderService implements DownloaderServiceInterface{
|
||||
|
||||
@@ -44,33 +45,40 @@ export class OculusDownloaderService extends AbstractBsDownloaderService impleme
|
||||
this.notifications.notifyError({title: err.code});
|
||||
}
|
||||
|
||||
private handleDownload(download: Observable<Progression<BSVersion>>): Observable<Progression<BSVersion>> {
|
||||
private handleDownload(download: Observable<Progression<BSVersion>>, ingoreErrorCodes?: string[]): Observable<Progression<BSVersion>> {
|
||||
const progress$ = download.pipe(map(progress => (progress.current / progress.total) * 100), catchError(() => of(0)));
|
||||
this.progressBar.show(progress$, true);
|
||||
|
||||
const subs: Subscription[] = [];
|
||||
|
||||
subs.push(
|
||||
download.pipe(take(1), catchError(() => of(null))).subscribe(data => data && this._downloadingVersion$.next(data.data))
|
||||
download.pipe(take(1)).subscribe({ next: data => data && this._downloadingVersion$.next(data.data), error: () => {} })
|
||||
)
|
||||
|
||||
return download.pipe(
|
||||
tap({
|
||||
error: err => this.handleDownloadErrors(err),
|
||||
error: (err: CustomError) => {
|
||||
if(ingoreErrorCodes?.includes(err.code)){ return; }
|
||||
this.handleDownloadErrors(err);
|
||||
},
|
||||
}),
|
||||
finalize(() => subs.forEach(sub => sub.unsubscribe()))
|
||||
);
|
||||
}
|
||||
|
||||
private tryAutoDownload(downloadInfo: DownloadInfo): Observable<Progression<BSVersion>>{
|
||||
const ignoreCode = [MetaAuthErrorCodes.NO_META_AUTH_TOKEN];
|
||||
return this.handleDownload(
|
||||
this.ipc.sendV2<Progression<BSVersion>>("bs-oculus-auto-download", { args: downloadInfo })
|
||||
this.ipc.sendV2<Progression<BSVersion>>("bs-oculus-auto-download", { args: downloadInfo }),
|
||||
ignoreCode
|
||||
);
|
||||
}
|
||||
|
||||
private startDownloadBsVersion(downloadInfo: DownloadInfo): Observable<Progression<BSVersion>>{
|
||||
const ignoreCode = [MetaAuthErrorCodes.OCULUS_LOGIN_WINDOW_CLOSED_BY_USER];
|
||||
return this.handleDownload(
|
||||
this.ipc.sendV2<Progression<BSVersion>>("bs-oculus-download", { args: downloadInfo })
|
||||
this.ipc.sendV2<Progression<BSVersion>>("bs-oculus-download", { args: downloadInfo }),
|
||||
ignoreCode
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
@@ -9,7 +9,7 @@ import { ProgressBarService } from "../progress-bar.service";
|
||||
import { LoginToSteamModal } from "renderer/components/modal/modal-types/bs-downgrade/login-to-steam-modal.component";
|
||||
import { SteamGuardModal } from "renderer/components/modal/modal-types/bs-downgrade/steam-guard-modal.component";
|
||||
import { LinkOpenerService } from "../link-opener.service";
|
||||
import { DepotDownloaderErrorEvent, DepotDownloaderEvent, DepotDownloaderEventType, DepotDownloaderInfoEvent, DepotDownloaderWarningEvent } from "../../../shared/models/depot-downloader.model";
|
||||
import { DepotDownloaderErrorEvent, DepotDownloaderEvent, DepotDownloaderEventType, DepotDownloaderInfoEvent, DepotDownloaderWarningEvent } from "../../../shared/models/bs-version-download/depot-downloader.model";
|
||||
import { SteamMobileApproveModal } from "renderer/components/modal/modal-types/bs-downgrade/steam-mobile-approve-modal.component";
|
||||
import { DownloaderServiceInterface } from "./bs-store-downloader.interface";
|
||||
import { AbstractBsDownloaderService } from "./abstract-bs-downloader.service";
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
import { defaultIfEmpty, share } from "rxjs/operators";
|
||||
import { Observable, ReplaySubject, identity } from "rxjs";
|
||||
import { IpcRequest, IpcResponse } from "shared/models/ipc";
|
||||
import { deserializeError } from 'serialize-error';
|
||||
import { IpcCompleteChannel, IpcErrorChannel, IpcTearDownChannel } from "shared/models/ipc/ipc-response.interface";
|
||||
|
||||
export class IpcService {
|
||||
@@ -77,7 +78,7 @@ export class IpcService {
|
||||
|
||||
const obs = new Observable<T>(observer => {
|
||||
window.electron.ipcRenderer.on(request.responceChannel, (res: T) => observer.next(res));
|
||||
window.electron.ipcRenderer.on(errorChannel, (err: Error) => observer.error(err));
|
||||
window.electron.ipcRenderer.on(errorChannel, (err) => observer.error(deserializeError(err)));
|
||||
window.electron.ipcRenderer.on(completeChannel, () => observer.complete());
|
||||
|
||||
window.electron.ipcRenderer.sendMessage(channel, request);
|
||||
|
||||
@@ -0,0 +1,16 @@
|
||||
|
||||
export enum OculusDownloaderErrorCodes {
|
||||
DOWNLOAD_MANIFEST_ZIP_FAILED = "DOWNLOAD_MANIFEST_ZIP_FAILED",
|
||||
MANIFEST_FILE_NOT_FOUND = "MANIFEST_FILE_NOT_FOUND",
|
||||
PARSE_MANIFEST_FILE_FAILED = "PARSE_MANIFEST_FILE_FAILED",
|
||||
ALREADY_DOWNLOADING = "ALREADY_DOWNLOADING",
|
||||
UNABLE_TO_GET_MANIFEST = "UNABLE_TO_GET_MANIFEST",
|
||||
VERIFY_INTEGRITY_FAILED = "VERIFY_INTEGRITY_FAILED",
|
||||
SOME_FILES_FAILED_TO_DOWNLOAD = "SOME_FILES_FAILED_TO_DOWNLOAD",
|
||||
}
|
||||
|
||||
export enum MetaAuthErrorCodes {
|
||||
OCULUS_LOGIN_TIMED_OUT = "OCULUS_LOGIN_TIMED_OUT",
|
||||
OCULUS_LOGIN_WINDOW_CLOSED_BY_USER = "OCULUS_LOGIN_WINDOW_CLOSED_BY_USER",
|
||||
NO_META_AUTH_TOKEN = "NO_META_AUTH_TOKEN",
|
||||
}
|
||||
@@ -12,14 +12,25 @@ export class CustomError extends Error {
|
||||
public get code(): string { return this._code; }
|
||||
public get data(): unknown { return this._data; }
|
||||
|
||||
public static fromError(error: Error, code: string, data?: unknown): CustomError{
|
||||
public static fromError(error: Error, code?: string, data?: unknown): CustomError{
|
||||
|
||||
if(error instanceof CustomError){
|
||||
return error;
|
||||
}
|
||||
|
||||
code ||= (error as unknown as {code: string}).code || CustomErrorCodes.UNKNOWN_ERROR;
|
||||
|
||||
const customError = new CustomError(error.message ?? error.toString(), code, data);
|
||||
customError.stack = error.stack;
|
||||
return customError;
|
||||
}
|
||||
|
||||
public static throw(error: Error, code: string, data?: unknown): never{
|
||||
public static throw(error: Error, code?: string, data?: unknown): never{
|
||||
throw CustomError.fromError(error, code, data);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
export enum CustomErrorCodes {
|
||||
UNKNOWN_ERROR = "UNKNOWN_ERROR",
|
||||
}
|
||||
Reference in New Issue
Block a user