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" import * as packager from "electron-packager"
const pkg = require('../package.json'); 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 fs from "fs-extra";
import * as path_helper from "path"; import * as path_helper from "path";
import {parseVersion} from "../modules/shared/version"; 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({ const request_url = updateServerUrl() + "/api.php?" + querystring.stringify({
type: "update-info" type: "update-info"
}); });
console.log("request: %s", request_url);
console.log("Fetching update data from: %s", request_url);
request.get(request_url, { request.get(request_url, {
timeout: 2000 timeout: 2000
}, (error, response, body) => { }, (error, response, body) => {
if(response.statusCode !== 200) { if(error) {
setImmediate(reject, "Invalid status code (" + response.statusCode + (response.statusMessage ? "/" + response.statusMessage : "") + ")"); console.error("Failed to query the update server for update information: %o", error);
setImmediate(reject, "failed to query update server");
return; return;
} }
if(!response) { if(!response) {
setImmediate(reject, "Missing response object"); setImmediate(reject, "Missing response object");
return; return;
} }
if(response.statusCode !== 200) {
setImmediate(reject, "Invalid status code (" + response.statusCode + (response.statusMessage ? "/" + response.statusMessage : "") + ")");
return;
}
let data: any; let data: any;
try { try {
data = JSON.parse(body); data = JSON.parse(body);
@ -201,6 +209,12 @@ export async function downloadClientVersion(channel: string, version: Version, s
let stream = progress(request.get(requestUrl, { let stream = progress(request.get(requestUrl, {
timeout: 10_000 timeout: 10_000
}, (error, response, _body) => { }, (error, response, _body) => {
if(error) {
console.error("Failed to download new client version: %o", error);
fireFailed("Download failed");
return;
}
if(!response) { if(!response) {
fireFailed("Missing response object"); fireFailed("Missing response object");
return; return;

View File

@ -12,6 +12,7 @@ let _save_timer: number;
export async function initialize() { export async function initialize() {
await fs.mkdirp(SETTINGS_DIR); await fs.mkdirp(SETTINGS_DIR);
console.error("Load local storage from: %o", SETTINGS_DIR);
const files = await fs.readdir(SETTINGS_DIR); const files = await fs.readdir(SETTINGS_DIR);
for(const file of files) { for(const file of files) {
const key = decodeURIComponent(file); const key = decodeURIComponent(file);

View File

@ -13,8 +13,8 @@ import {tr} from "tc-shared/i18n/localize";
import {Registry} from "tc-shared/events"; import {Registry} from "tc-shared/events";
import {Filter, FilterType, FilterTypeClass} from "tc-shared/voice/Filter"; import {Filter, FilterType, FilterTypeClass} from "tc-shared/voice/Filter";
import {NativeFilter, NStateFilter, NThresholdFilter, NVoiceLevelFilter} from "./AudioFilter"; import {NativeFilter, NStateFilter, NThresholdFilter, NVoiceLevelFilter} from "./AudioFilter";
import {IDevice} from "tc-shared/audio/recorder"; import {getRecorderBackend, IDevice} from "tc-shared/audio/recorder";
import {LogCategory, logTrace, logWarn} from "tc-shared/log"; import {LogCategory, logError, logTrace, logWarn} from "tc-shared/log";
import {Settings, settings} from "tc-shared/settings"; import {Settings, settings} from "tc-shared/settings";
import NativeFilterMode = audio.record.FilterMode; import NativeFilterMode = audio.record.FilterMode;
@ -79,8 +79,16 @@ export class NativeInput implements AbstractInput {
this.setState(InputState.INITIALIZING); this.setState(InputState.INITIALIZING);
logTrace(LogCategory.AUDIO, tr("Starting input for device %o", this.deviceId)); logTrace(LogCategory.AUDIO, tr("Starting input for device %o", this.deviceId));
try { 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 !== "success") {
if(state === "invalid-device") { if(state === "invalid-device") {
return InputStartError.EDEVICEUNKNOWN; return InputStartError.EDEVICEUNKNOWN;
@ -88,8 +96,8 @@ export class NativeInput implements AbstractInput {
throw tr("invalid set device result state"); throw tr("invalid set device result state");
} }
/* FIXME! */ logError(LogCategory.AUDIO, tr("Native audio driver returned invalid device set result: %o"), state);
throw state; throw tr("unknown device change result");
} }
await new Promise((resolve, reject) => this.nativeHandle.start(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> { async setConsumer(consumer: InputConsumer): Promise<void> {
if(typeof(consumer) !== "undefined") { 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; return;
@ -273,6 +281,7 @@ export class NativeLevelMeter implements LevelMeter {
constructor(device: IDevice) { constructor(device: IDevice) {
this.targetDevice = device; this.targetDevice = device;
this.callback = () => {};
} }
async initialize() { async initialize() {
@ -305,10 +314,7 @@ export class NativeLevelMeter implements LevelMeter {
} }
/* references this variable, needs a destroy() call, else memory leak */ /* references this variable, needs a destroy() call, else memory leak */
this.nativeFilter.set_analyze_filter(value => { this.nativeFilter.set_analyze_filter(value => this.callback(value));
if(this.callback) this.callback(value);
});
NativeLevelMeter.instances.push(this); NativeLevelMeter.instances.push(this);
} }
@ -340,6 +346,6 @@ export class NativeLevelMeter implements LevelMeter {
} }
setObserver(callback: (value: number) => any) { 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(); const nativeDeviceList = audio.available_devices();
logTrace(LogCategory.AUDIO, tr("Native device list: %o"), nativeDeviceList); logTrace(LogCategory.AUDIO, tr("Native device list: %o"), nativeDeviceList);
this.cachedDevices = nativeDeviceList this.cachedDevices = nativeDeviceList
.filter(e => e.input_supported || e.input_default) .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.... */ /* If we're using WDM-KS and opening the microphone view, for some reason the channels get blocked an never release.... */
.map(device => { .filter(e => e.driver !== "Windows WDM-KS")
return { .map(device => {
deviceId: device.device_id, return {
name: device.name, deviceId: device.device_id,
driver: device.driver, name: device.name,
isDefault: device.input_default driver: device.driver,
} isDefault: device.input_default
}); }
});
this.setState("healthy"); this.setState("healthy");
return this.cachedDevices; return this.cachedDevices;
} }

View File

@ -12,7 +12,6 @@ import {
} from "tc-shared/file/Transfer"; } from "tc-shared/file/Transfer";
import * as native from "tc-native/connection"; import * as native from "tc-native/connection";
import {tr} from "tc-shared/i18n/localize"; import {tr} from "tc-shared/i18n/localize";
import * as log from "tc-shared/log";
import {LogCategory, logError} from "tc-shared/log"; import {LogCategory, logError} from "tc-shared/log";
import {base64_encode_ab} from "tc-shared/utils/buffers"; import {base64_encode_ab} from "tc-shared/utils/buffers";
import * as path from "path"; import * as path from "path";
@ -52,8 +51,9 @@ const executeTransfer = (transfer: FileTransfer, object: native.ft.TransferObjec
}; };
ntransfer.callback_failed = error => { ntransfer.callback_failed = error => {
if(transfer.isFinished()) if(transfer.isFinished()) {
return; return;
}
transfer.lastStateUpdate = Date.now(); transfer.lastStateUpdate = Date.now();
transfer.setFailed({ transfer.setFailed({
@ -64,8 +64,9 @@ const executeTransfer = (transfer: FileTransfer, object: native.ft.TransferObjec
}; };
ntransfer.callback_finished = aborted => { ntransfer.callback_finished = aborted => {
if(transfer.isFinished()) if(transfer.isFinished()) {
return; return;
}
callbackFinished(); callbackFinished();
transfer.setTransferState(aborted ? FileTransferState.CANCELED : FileTransferState.FINISHED); transfer.setTransferState(aborted ? FileTransferState.CANCELED : FileTransferState.FINISHED);
@ -73,13 +74,15 @@ const executeTransfer = (transfer: FileTransfer, object: native.ft.TransferObjec
}; };
ntransfer.callback_progress = (current, max) => { ntransfer.callback_progress = (current, max) => {
if(transfer.isFinished()) if(transfer.isFinished()) {
return; return;
}
const transferInfo = transfer.lastProgressInfo(); const transferInfo = transfer.lastProgressInfo();
/* ATTENTION: transferInfo.timestamp | 0 does not work since 1591875114970 > 2^32 (1591875114970 | 0 => -1557751846) */ /* 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; return;
}
transfer.updateProgress({ transfer.updateProgress({
network_current_speed: 0, network_current_speed: 0,
@ -100,8 +103,9 @@ const executeTransfer = (transfer: FileTransfer, object: native.ft.TransferObjec
}; };
try { try {
if(!ntransfer.start()) if(!ntransfer.start()) {
throw tr("failed to start transfer"); throw tr("failed to start transfer");
}
} catch (error) { } catch (error) {
if(typeof error !== "string") { if(typeof error !== "string") {
logError(LogCategory.FILE_TRANSFER, tr("Failed to start file transfer: %o"), error); 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 { TransferProvider.setProvider(new class extends TransferProvider {
executeFileDownload(transfer: FileDownloadTransfer) { executeFileDownload(transfer: FileDownloadTransfer) {
try { try {
if(!transfer.target) throw tr("transfer target is undefined"); if(!transfer.target) {
throw tr("transfer target is undefined");
}
transfer.setTransferState(FileTransferState.CONNECTING); transfer.setTransferState(FileTransferState.CONNECTING);
let nativeTarget: native.ft.FileTransferTarget; let nativeTarget: native.ft.FileTransferTarget;
@ -137,8 +143,9 @@ TransferProvider.setProvider(new class extends TransferProvider {
} }
executeTransfer(transfer, nativeTarget, () => { executeTransfer(transfer, nativeTarget, () => {
if(transfer.target instanceof ResponseTransferTargetImpl) if(transfer.target instanceof ResponseTransferTargetImpl) {
transfer.target.createResponseFromBuffer(); transfer.target.createResponseFromBuffer();
}
}); });
} catch (error) { } catch (error) {
if(typeof error !== "string") { if(typeof error !== "string") {
@ -155,7 +162,9 @@ TransferProvider.setProvider(new class extends TransferProvider {
executeFileUpload(transfer: FileUploadTransfer) { executeFileUpload(transfer: FileUploadTransfer) {
try { try {
if(!transfer.source) throw tr("transfer source is undefined"); if(!transfer.source) {
throw tr("transfer source is undefined");
}
let nativeSource: native.ft.FileTransferSource; let nativeSource: native.ft.FileTransferSource;
if(transfer.source instanceof BrowserFileTransferSourceImpl) { if(transfer.source instanceof BrowserFileTransferSourceImpl) {
@ -165,7 +174,6 @@ TransferProvider.setProvider(new class extends TransferProvider {
} else if(transfer.source instanceof BufferTransferSourceImpl) { } else if(transfer.source instanceof BufferTransferSourceImpl) {
nativeSource = transfer.source.getNativeSource(); nativeSource = transfer.source.getNativeSource();
} else { } else {
console.log(transfer.source);
transfer.setFailed({ transfer.setFailed({
error: "io", error: "io",
reason: "unsupported-target" reason: "unsupported-target"
@ -367,15 +375,18 @@ class FileTransferTargetImpl extends FileTransferTarget {
} }
async requestPath() { async requestPath() {
if(typeof this.path === "string") if(typeof this.path === "string") {
return; return;
}
const result = await electron.remote.dialog.showSaveDialog({ defaultPath: this.name }); const result = await electron.remote.dialog.showSaveDialog({ defaultPath: this.name });
if(result.canceled) if(result.canceled) {
throw tr("download canceled"); throw tr("download canceled");
}
if(!result.filePath) if(!result.filePath) {
throw tr("invalid result path"); throw tr("invalid result path");
}
this.path = path.dirname(result.filePath); this.path = path.dirname(result.filePath);
this.name = path.basename(result.filePath); this.name = path.basename(result.filePath);

View File

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