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" | ||||
| 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"; | ||||
|  | ||||
| @ -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; | ||||
|  | ||||
| @ -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); | ||||
|  | ||||
| @ -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 || (() => {}); | ||||
|     } | ||||
| } | ||||
| @ -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; | ||||
|     } | ||||
|  | ||||
| @ -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); | ||||
|  | ||||
| @ -1,5 +1,5 @@ | ||||
| { | ||||
|   "name": "teaspeak_client", | ||||
|   "name": "TeaClient", | ||||
|   "version": "1.5.0-9", | ||||
|   "description": "", | ||||
|   "main": "main.js", | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user