Some minor bugfixing

This commit is contained in:
WolverinDEV 2021-02-15 16:08:17 +01:00
parent 37e3cfc30e
commit d06d350ded
8 changed files with 76 additions and 39 deletions

2
github

@ -1 +1 @@
Subproject commit 1e2220d20cc98a6fb3ee75264ecc6f4b95cfa4fb
Subproject commit 7f89167600c72eadf1c31be0dad3b7563561699e

View File

@ -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";

View File

@ -56,19 +56,27 @@ export async function fetchRemoteUpdateData() : Promise<UpdateData> {
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;

View File

@ -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);

View File

@ -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<audio.record.DeviceSetResult>(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<audio.record.DeviceSetResult>(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<void> {
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 || (() => {});
}
}

View File

@ -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;
}

View File

@ -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);

View File

@ -1,5 +1,5 @@
{
"name": "teaspeak_client",
"name": "TeaClient",
"version": "1.5.0-9",
"description": "",
"main": "main.js",