From d06d350ded5586f6ea48d4e77376536d691173ee Mon Sep 17 00:00:00 2001 From: WolverinDEV Date: Mon, 15 Feb 2021 16:08:17 +0100 Subject: [PATCH] Some minor bugfixing --- github | 2 +- installer/build.ts | 4 +++ modules/core/app-updater/index.ts | 20 +++++++++-- modules/renderer/PersistentLocalStorage.ts | 1 + modules/renderer/audio/AudioRecorder.ts | 28 ++++++++++------ modules/renderer/audio/InputDeviceList.ts | 21 ++++++------ modules/renderer/connection/FileTransfer.ts | 37 +++++++++++++-------- package.json | 2 +- 8 files changed, 76 insertions(+), 39 deletions(-) diff --git a/github b/github index 1e2220d..7f89167 160000 --- a/github +++ b/github @@ -1 +1 @@ -Subproject commit 1e2220d20cc98a6fb3ee75264ecc6f4b95cfa4fb +Subproject commit 7f89167600c72eadf1c31be0dad3b7563561699e diff --git a/installer/build.ts b/installer/build.ts index f5be8ef..735854e 100644 --- a/installer/build.ts +++ b/installer/build.ts @@ -2,6 +2,10 @@ import {Options} from "electron-packager"; import * as packager from "electron-packager" const pkg = require('../package.json'); +if(pkg.name !== "TeaClient") { + throw "The package name determines where the app data folder will be! Don't change that!" +} + import * as fs from "fs-extra"; import * as path_helper from "path"; import {parseVersion} from "../modules/shared/version"; diff --git a/modules/core/app-updater/index.ts b/modules/core/app-updater/index.ts index 9e6e6d9..5bc0e77 100644 --- a/modules/core/app-updater/index.ts +++ b/modules/core/app-updater/index.ts @@ -56,19 +56,27 @@ export async function fetchRemoteUpdateData() : Promise { const request_url = updateServerUrl() + "/api.php?" + querystring.stringify({ type: "update-info" }); - console.log("request: %s", request_url); + + console.log("Fetching update data from: %s", request_url); request.get(request_url, { timeout: 2000 }, (error, response, body) => { - if(response.statusCode !== 200) { - setImmediate(reject, "Invalid status code (" + response.statusCode + (response.statusMessage ? "/" + response.statusMessage : "") + ")"); + if(error) { + console.error("Failed to query the update server for update information: %o", error); + setImmediate(reject, "failed to query update server"); return; } + if(!response) { setImmediate(reject, "Missing response object"); return; } + if(response.statusCode !== 200) { + setImmediate(reject, "Invalid status code (" + response.statusCode + (response.statusMessage ? "/" + response.statusMessage : "") + ")"); + return; + } + let data: any; try { data = JSON.parse(body); @@ -201,6 +209,12 @@ export async function downloadClientVersion(channel: string, version: Version, s let stream = progress(request.get(requestUrl, { timeout: 10_000 }, (error, response, _body) => { + if(error) { + console.error("Failed to download new client version: %o", error); + fireFailed("Download failed"); + return; + } + if(!response) { fireFailed("Missing response object"); return; diff --git a/modules/renderer/PersistentLocalStorage.ts b/modules/renderer/PersistentLocalStorage.ts index 76bbbb3..abd9a06 100644 --- a/modules/renderer/PersistentLocalStorage.ts +++ b/modules/renderer/PersistentLocalStorage.ts @@ -12,6 +12,7 @@ let _save_timer: number; export async function initialize() { await fs.mkdirp(SETTINGS_DIR); + console.error("Load local storage from: %o", SETTINGS_DIR); const files = await fs.readdir(SETTINGS_DIR); for(const file of files) { const key = decodeURIComponent(file); diff --git a/modules/renderer/audio/AudioRecorder.ts b/modules/renderer/audio/AudioRecorder.ts index 6d36d1e..ce486e7 100644 --- a/modules/renderer/audio/AudioRecorder.ts +++ b/modules/renderer/audio/AudioRecorder.ts @@ -13,8 +13,8 @@ import {tr} from "tc-shared/i18n/localize"; import {Registry} from "tc-shared/events"; import {Filter, FilterType, FilterTypeClass} from "tc-shared/voice/Filter"; import {NativeFilter, NStateFilter, NThresholdFilter, NVoiceLevelFilter} from "./AudioFilter"; -import {IDevice} from "tc-shared/audio/recorder"; -import {LogCategory, logTrace, logWarn} from "tc-shared/log"; +import {getRecorderBackend, IDevice} from "tc-shared/audio/recorder"; +import {LogCategory, logError, logTrace, logWarn} from "tc-shared/log"; import {Settings, settings} from "tc-shared/settings"; import NativeFilterMode = audio.record.FilterMode; @@ -79,8 +79,16 @@ export class NativeInput implements AbstractInput { this.setState(InputState.INITIALIZING); logTrace(LogCategory.AUDIO, tr("Starting input for device %o", this.deviceId)); try { - const state = await new Promise(resolve => this.nativeHandle.set_device(this.deviceId, resolve)); + let deviceId; + if(this.deviceId === IDevice.NoDeviceId) { + throw tr("no device selected"); + } else if(this.deviceId === IDevice.DefaultDeviceId) { + deviceId = getRecorderBackend().getDeviceList().getDefaultDeviceId(); + } else { + deviceId = this.deviceId; + } + const state = await new Promise(resolve => this.nativeHandle.set_device(deviceId, resolve)); if(state !== "success") { if(state === "invalid-device") { return InputStartError.EDEVICEUNKNOWN; @@ -88,8 +96,8 @@ export class NativeInput implements AbstractInput { throw tr("invalid set device result state"); } - /* FIXME! */ - throw state; + logError(LogCategory.AUDIO, tr("Native audio driver returned invalid device set result: %o"), state); + throw tr("unknown device change result"); } await new Promise((resolve, reject) => this.nativeHandle.start(result => { @@ -206,7 +214,7 @@ export class NativeInput implements AbstractInput { async setConsumer(consumer: InputConsumer): Promise { if(typeof(consumer) !== "undefined") { - throw "we only support native consumers!"; // TODO: May create a general wrapper? + throw tr("we only support native consumers!"); // TODO: May create a general wrapper? } return; @@ -273,6 +281,7 @@ export class NativeLevelMeter implements LevelMeter { constructor(device: IDevice) { this.targetDevice = device; + this.callback = () => {}; } async initialize() { @@ -305,10 +314,7 @@ export class NativeLevelMeter implements LevelMeter { } /* references this variable, needs a destroy() call, else memory leak */ - this.nativeFilter.set_analyze_filter(value => { - if(this.callback) this.callback(value); - }); - + this.nativeFilter.set_analyze_filter(value => this.callback(value)); NativeLevelMeter.instances.push(this); } @@ -340,6 +346,6 @@ export class NativeLevelMeter implements LevelMeter { } setObserver(callback: (value: number) => any) { - this.callback = callback; + this.callback = callback || (() => {}); } } \ No newline at end of file diff --git a/modules/renderer/audio/InputDeviceList.ts b/modules/renderer/audio/InputDeviceList.ts index f296497..f0b9701 100644 --- a/modules/renderer/audio/InputDeviceList.ts +++ b/modules/renderer/audio/InputDeviceList.ts @@ -43,16 +43,17 @@ class InputDeviceList extends AbstractDeviceList { const nativeDeviceList = audio.available_devices(); logTrace(LogCategory.AUDIO, tr("Native device list: %o"), nativeDeviceList); this.cachedDevices = nativeDeviceList - .filter(e => e.input_supported || e.input_default) - .filter(e => e.driver !== "Windows WDM-KS") /* If we're using WDM-KS and opening the microphone view, for some reason the channels get blocked an never release.... */ - .map(device => { - return { - deviceId: device.device_id, - name: device.name, - driver: device.driver, - isDefault: device.input_default - } - }); + .filter(e => e.input_supported || e.input_default) + /* If we're using WDM-KS and opening the microphone view, for some reason the channels get blocked an never release.... */ + .filter(e => e.driver !== "Windows WDM-KS") + .map(device => { + return { + deviceId: device.device_id, + name: device.name, + driver: device.driver, + isDefault: device.input_default + } + }); this.setState("healthy"); return this.cachedDevices; } diff --git a/modules/renderer/connection/FileTransfer.ts b/modules/renderer/connection/FileTransfer.ts index 0a47f2d..1597f1b 100644 --- a/modules/renderer/connection/FileTransfer.ts +++ b/modules/renderer/connection/FileTransfer.ts @@ -12,7 +12,6 @@ import { } from "tc-shared/file/Transfer"; import * as native from "tc-native/connection"; import {tr} from "tc-shared/i18n/localize"; -import * as log from "tc-shared/log"; import {LogCategory, logError} from "tc-shared/log"; import {base64_encode_ab} from "tc-shared/utils/buffers"; import * as path from "path"; @@ -52,8 +51,9 @@ const executeTransfer = (transfer: FileTransfer, object: native.ft.TransferObjec }; ntransfer.callback_failed = error => { - if(transfer.isFinished()) + if(transfer.isFinished()) { return; + } transfer.lastStateUpdate = Date.now(); transfer.setFailed({ @@ -64,8 +64,9 @@ const executeTransfer = (transfer: FileTransfer, object: native.ft.TransferObjec }; ntransfer.callback_finished = aborted => { - if(transfer.isFinished()) + if(transfer.isFinished()) { return; + } callbackFinished(); transfer.setTransferState(aborted ? FileTransferState.CANCELED : FileTransferState.FINISHED); @@ -73,13 +74,15 @@ const executeTransfer = (transfer: FileTransfer, object: native.ft.TransferObjec }; ntransfer.callback_progress = (current, max) => { - if(transfer.isFinished()) + if(transfer.isFinished()) { return; + } const transferInfo = transfer.lastProgressInfo(); /* ATTENTION: transferInfo.timestamp | 0 does not work since 1591875114970 > 2^32 (1591875114970 | 0 => -1557751846) */ - if(transferInfo && Date.now() - (typeof transferInfo.timestamp === "number" ? transferInfo.timestamp : 0) < 2000 && !(transferInfo as any).native_info) + if(transferInfo && Date.now() - (typeof transferInfo.timestamp === "number" ? transferInfo.timestamp : 0) < 2000 && !(transferInfo as any).native_info) { return; + } transfer.updateProgress({ network_current_speed: 0, @@ -100,8 +103,9 @@ const executeTransfer = (transfer: FileTransfer, object: native.ft.TransferObjec }; try { - if(!ntransfer.start()) + if(!ntransfer.start()) { throw tr("failed to start transfer"); + } } catch (error) { if(typeof error !== "string") { logError(LogCategory.FILE_TRANSFER, tr("Failed to start file transfer: %o"), error); @@ -119,7 +123,9 @@ const executeTransfer = (transfer: FileTransfer, object: native.ft.TransferObjec TransferProvider.setProvider(new class extends TransferProvider { executeFileDownload(transfer: FileDownloadTransfer) { try { - if(!transfer.target) throw tr("transfer target is undefined"); + if(!transfer.target) { + throw tr("transfer target is undefined"); + } transfer.setTransferState(FileTransferState.CONNECTING); let nativeTarget: native.ft.FileTransferTarget; @@ -137,8 +143,9 @@ TransferProvider.setProvider(new class extends TransferProvider { } executeTransfer(transfer, nativeTarget, () => { - if(transfer.target instanceof ResponseTransferTargetImpl) + if(transfer.target instanceof ResponseTransferTargetImpl) { transfer.target.createResponseFromBuffer(); + } }); } catch (error) { if(typeof error !== "string") { @@ -155,7 +162,9 @@ TransferProvider.setProvider(new class extends TransferProvider { executeFileUpload(transfer: FileUploadTransfer) { try { - if(!transfer.source) throw tr("transfer source is undefined"); + if(!transfer.source) { + throw tr("transfer source is undefined"); + } let nativeSource: native.ft.FileTransferSource; if(transfer.source instanceof BrowserFileTransferSourceImpl) { @@ -165,7 +174,6 @@ TransferProvider.setProvider(new class extends TransferProvider { } else if(transfer.source instanceof BufferTransferSourceImpl) { nativeSource = transfer.source.getNativeSource(); } else { - console.log(transfer.source); transfer.setFailed({ error: "io", reason: "unsupported-target" @@ -367,15 +375,18 @@ class FileTransferTargetImpl extends FileTransferTarget { } async requestPath() { - if(typeof this.path === "string") + if(typeof this.path === "string") { return; + } const result = await electron.remote.dialog.showSaveDialog({ defaultPath: this.name }); - if(result.canceled) + if(result.canceled) { throw tr("download canceled"); + } - if(!result.filePath) + if(!result.filePath) { throw tr("invalid result path"); + } this.path = path.dirname(result.filePath); this.name = path.basename(result.filePath); diff --git a/package.json b/package.json index 7b47ba4..4f28bc3 100644 --- a/package.json +++ b/package.json @@ -1,5 +1,5 @@ { - "name": "teaspeak_client", + "name": "TeaClient", "version": "1.5.0-9", "description": "", "main": "main.js",