Some minor bugfixing
This commit is contained in:
parent
37e3cfc30e
commit
d06d350ded
2
github
2
github
@ -1 +1 @@
|
|||||||
Subproject commit 1e2220d20cc98a6fb3ee75264ecc6f4b95cfa4fb
|
Subproject commit 7f89167600c72eadf1c31be0dad3b7563561699e
|
@ -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";
|
||||||
|
@ -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;
|
||||||
|
@ -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);
|
||||||
|
@ -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 || (() => {});
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -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;
|
||||||
}
|
}
|
||||||
|
@ -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);
|
||||||
|
@ -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",
|
||||||
|
Loading…
x
Reference in New Issue
Block a user