Newer
Older
import {
CheckConfig,
NetworkRequestTestResult,
UnitAndPlayerContainer,
SysCheckReport
} from './sys-check.interfaces';
import { HttpClient } from '@angular/common/http';
import { catchError, map } from 'rxjs/operators';
import { ErrorHandler, ServerError } from 'iqb-components';
@Injectable({
providedIn: 'root'
})
export class BackendService {

Martin Mechtel
committed
@Inject('SERVER_URL') private readonly serverUrl: string,
public getCheckConfigData(workspaceId: number, sysCheckName: string): Observable<CheckConfig> {
.get<CheckConfig>(this.serverUrl + `workspace/${workspaceId}/sys-check/${sysCheckName}`)
.pipe(
catchError(() => {
const myreturn: CheckConfig = null;
public saveReport(workspaceId: number, sysCheckName: string, sysCheckReport: SysCheckReport): Observable<Boolean|ServerError> {
.put<boolean>(this.serverUrl + `workspace/${workspaceId}/sys-check/${sysCheckName}/report`, {...sysCheckReport});
public getUnitAndPlayer(workspaceId: number, sysCheckName: string): Observable<UnitAndPlayerContainer|ServerError> {
const startingTime = BackendService.getMostPreciseTimestampBrowserCanProvide();
.get<UnitAndPlayerContainer>(this.serverUrl + `workspace/${workspaceId}/sys-check/${sysCheckName}/unit-and-player`)
.pipe(map(data => {
data.duration = BackendService.getMostPreciseTimestampBrowserCanProvide() - startingTime;
return data;

Martin Mechtel
committed
catchError(ErrorHandler.handle)
public benchmarkDownloadRequest(requestedDownloadSize: number): Promise<NetworkRequestTestResult> {
const cacheKiller = '&uid=' + (new Date().getTime());
const testResult: NetworkRequestTestResult = {
type: 'downloadTest',
size: requestedDownloadSize,
xhr.open('GET', serverUrl + `speed-test/random-package/${requestedDownloadSize}${cacheKiller}`, true);
xhr.timeout = 45000;
xhr.onload = () => {
if (xhr.status !== 200) {
testResult.error = `Error ${xhr.statusText} (${xhr.status}) `;

Martin Mechtel
committed
if (xhr.response.toString().length != requestedDownloadSize) {
testResult.error = `Error: Data package has wrong size! ${requestedDownloadSize} ` + xhr.response.toString().length;
}
const currentTime = testResult.duration = BackendService.getMostPreciseTimestampBrowserCanProvide();
// console.log({'c': currentTime, 's': startingTime});
testResult.duration = currentTime - startingTime;
};
xhr.onerror = () => {
testResult.error = `Network Error ${xhr.statusText} (${xhr.status}) `;
resolve(testResult);
};
xhr.ontimeout = () => {
testResult.duration = xhr.timeout;
testResult.error = 'timeout';
resolve(testResult);
};
const startingTime = BackendService.getMostPreciseTimestampBrowserCanProvide();
xhr.setRequestHeader('Content-Type', 'application/json');
xhr.send(`{"size":"${requestedDownloadSize}"}`);
public benchmarkUploadRequest(requestedUploadSize: number): Promise<NetworkRequestTestResult> {
const serverUrl = this.serverUrl;
const randomContent = BackendService.generateRandomContent(requestedUploadSize);
const testResult: NetworkRequestTestResult = {
type: 'uploadTest',
size: requestedUploadSize,
duration: 10000,
error: null,
speedInBPS: 0
};
xhr.open('POST', serverUrl + 'speed-test/random-package', true);
xhr.timeout = 10000;
xhr.setRequestHeader('Content-Type', 'text/plain');
xhr.onload = () => {
if (xhr.status !== 200) {
testResult.error = `Error ${xhr.statusText} (${xhr.status}) `;
}
const currentTime = BackendService.getMostPreciseTimestampBrowserCanProvide();
testResult.duration = currentTime - startingTime;
try {
const response = JSON.parse(xhr.response);
const arrivingSize = parseFloat(response['packageReceivedSize']);

Martin Mechtel
committed
if (arrivingSize != requestedUploadSize) {
testResult.error = `Error: Data package has wrong size! ${requestedUploadSize} != ${arrivingSize}`;
}
} catch (e) {
testResult.error = `bogus server response`;
}
// console.log({ 'c': currentTime, 's': startingTime });
resolve(testResult);
};
xhr.onerror = () => {
testResult.error = `Network Error ${xhr.statusText} (${xhr.status}) `;
resolve(testResult);
};
xhr.ontimeout = () => {
testResult.duration = xhr.timeout;
testResult.error = 'timeout';
resolve(testResult);
};
const startingTime = BackendService.getMostPreciseTimestampBrowserCanProvide();
xhr.send(randomContent);
});
}
// tslint:disable-next-line:member-ordering
private static getMostPreciseTimestampBrowserCanProvide(): number {
if (typeof performance !== 'undefined') {
const timeOrigin = (typeof performance.timeOrigin !== 'undefined') ? performance.timeOrigin : performance.timing.navigationStart;
if (typeof timeOrigin !== 'undefined' && timeOrigin) {
return timeOrigin + performance.now();
}
}
// tslint:disable-next-line:member-ordering
private static generateRandomContent(length: number): string {
const base64Characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcefghijklmnopqrstuvwxyz0123456789+/';
let randomString = '';
const randomCharacterID = Math.floor(Math.random() * 63);
randomString += base64Characters[randomCharacterID];
}
return randomString;
}