c8osdkvuejs
Version:
convertigo's MBaaS client API service
325 lines (308 loc) • 12.5 kB
text/typescript
import {C8oHttpInterfaceCore} from "c8osdkjscore/src/c8o/c8oHttpInterfaceCore";
import {C8oProgress} from "c8osdkjscore/src/c8o/c8oProgress";
import {C8oResponseJsonListener, C8oResponseListener} from "c8osdkjscore/src/c8o/c8oResponse";
import {C8oExceptionMessage} from "c8osdkjscore/src/c8o/Exception/c8oExceptionMessage";
import {C8oHttpRequestException} from "c8osdkjscore/src/c8o/Exception/c8oHttpRequestException";
import {C8o} from "./c8o.service";
export class C8oHttpInterface extends C8oHttpInterfaceCore {
constructor(c8o: C8o) {
super(c8o);
}
/**
* Check type of file given in parameters
* 0 : No file to upload
* 1 : FileList
* 2 : url when running in cordova
* @param {Object} parameters
* @return {number}
*/
public checkFile(parameters: any): number {
for (const p in parameters) {
if (parameters[p] instanceof Array) {
for (const p1 in parameters[p]) {
//noinspection JSUnfilteredForInLoop
if (parameters[p][p1] instanceof FileList) {
return 1;
} else if (this.isCordova()) {
if (parameters[p][p1] instanceof URL) {
return 2;
}
}
}
} else {
if (parameters[p] instanceof FileList) {
return 1;
} else if (this.isCordova()) {
if (parameters[p] instanceof URL) {
return 2;
}
}
}
}
return 0;
}
/**
* Url encode parameters
* @param {Object} parameters
* @return {string}
*/
public transformRequest(parameters: any): string {
const str = [];
for (const p in parameters) {
if (parameters[p] instanceof Array) {
for (const p1 in parameters[p]) {
if (parameters[p].hasOwnProperty(p1)) {
//noinspection JSUnfilteredForInLoop
str.push(encodeURIComponent(p) + "=" + encodeURIComponent(parameters[p][p1]));
}
}
} else {
str.push(encodeURIComponent(p) + "=" + encodeURIComponent(parameters[p]));
}
}
const query = str.join("&");
// Add this to instruct Convertigo server to remove any name space in the jSON keys
// to prevent keys like this: 'namespace:key'
return (query + "&__removeNamespaces=true");
}
/**
* Transform FormData parameters
* @param {Object} parameters
* @return {FormData}
*/
public transformRequestformdata(parameters: any): FormData {
const formdata: FormData = new FormData();
for (const p in parameters) {
if (parameters[p] instanceof Array) {
for (const p1 in parameters[p]) {
if (parameters[p][p1] instanceof FileList) {
for (const i of parameters[p][p1]) {
formdata.append(p, parameters[p][p1][i], parameters[p][p1][i].name);
}
} else {
formdata.append(p, parameters[p][p1]);
}
}
} else {
if (parameters[p] instanceof FileList) {
for (const j of parameters[p]) {
formdata.append(p, parameters[p][j], parameters[p][j].name);
}
} else {
formdata.append(p, parameters[p]);
}
}
}
return formdata;
}
/**
* Extract file from parameters and return and array containing a file and params
* @param {Object} parameters
* @return {any}
*/
public transformRequestfileNative(parameters: any): any {
const file: any[] = new Array();
const params: any = new Object();
for (const p in parameters) {
if (parameters[p] instanceof Array) {
for (const p1 in parameters[p]) {
if (parameters[p][p1] instanceof URL) {
file.push([p1, parameters[p][p1]]);
} else {
params[p1] = parameters[p][p1]["href"];
}
}
} else {
if (parameters[p] instanceof URL) {
file.push([p, parameters[p]["href"]]);
} else {
params[p] = parameters[p];
}
}
}
return [file, params];
}
/**
* Handle the request
* @param {string} url
* @param {Object} parameters
* @param {C8oResponseListener} c8oResponseListener
* @return {Promise<any>}
*/
public async handleRequest(url: string, parameters: any, c8oResponseListener?: C8oResponseListener): Promise<any> {
if (parameters["__sequence"] !== undefined) {
if (parameters["__sequence"].indexOf("#") !== -1) {
parameters["__sequence"] = parameters["__sequence"].substring(0, parameters["__sequence"].indexOf("#"));
}
}
switch (this.checkFile(parameters)) {
case 0: {
return this.httpPost(url, parameters);
}
case 1: {
const form = this.transformRequestformdata(parameters);
return this.uploadFileHttp(url, form, parameters, c8oResponseListener);
}
case 2: {
return this.uploadFilePluginNative(url, parameters, c8oResponseListener);
}
}
}
/**
* Upload file with native plugin
* @param {string} url
* @param {Object} parameters
* @param {C8oResponseListener} c8oResponseListener
* @return {Promise<any>}
*/
public uploadFilePluginNative(url: string, parameters: any,
c8oResponseListener: C8oResponseListener): Promise<any> {
const progress: C8oProgress = new C8oProgress();
progress.pull = false;
const varNull: JSON = null;
const data = this.transformRequestfileNative(parameters);
const files = data[0];
const options = new window["FileUploadOptions"]();
options.fileKey = files[0][0];
options.fileName = files[0][1].substr(files[0][1].lastIndexOf("/") + 1);
options.params = data[1];
const headersObject = {"Accept": "application/json", "x-convertigo-sdk": this.c8o.sdkVersion};
Object.assign(headersObject, this.c8o.headers);
options.headers = headersObject;
return new Promise((resolve, reject) => {
Promise.all([this.p1]).then(() => {
const ft = new window["FileTransfer"]();
ft.onprogress = (progressEvent) => {
if (progressEvent.lengthComputable) {
this.handleProgress(progressEvent, progress, parameters, c8oResponseListener, varNull);
}
};
ft.upload(files[0][1], encodeURI(url), (((resp) => {
resolve(resp);
})), ((err) => {
reject(err);
}), options);
});
});
}
/**
* Make an http post
* @param {string} url
* @param {Object} parameters
* @return {Promise<any>}
*/
public httpPost(url: string, parameters: any): Promise<any> {
parameters = this.transformRequest(parameters);
const headersObject = {"Content-Type": "application/x-www-form-urlencoded",
"x-convertigo-sdk": this.c8o.sdkVersion};
Object.assign(headersObject, this.c8o.headers);
const headers = {headers: (headersObject)};
if (this.firstCall) {
this.p1 = new Promise((resolve, reject) => {
this.firstCall = false;
this.c8o.httpPublic.post(url, parameters, {
headers,
withCredentials: true,
}).then((response) =>
resolve(response.data),
).catch((error) => {
resolve({error : (new C8oHttpRequestException(C8oExceptionMessage.runHttpRequest(), error)),
});
});
});
return this.p1;
} else {
return new Promise((resolve, reject) => {
Promise.all([this.p1]).then(() => {
this.c8o.httpPublic.post(url, parameters, {
headers,
withCredentials: true,
}).then((response) =>
resolve(response.data),
).catch((error) => {
resolve({error : (new C8oHttpRequestException(C8oExceptionMessage.runHttpRequest(), error)),
});
});
}).catch((error) => {
reject(error);
});
});
}
}
/**
* Upload File using an Http client
* @param {string} url
* @param {FormData} form
* @param {Object} parameters
* @param {C8oResponseListener} c8oResponseListener
* @return {Promise<any>}
*/
public uploadFileHttp(url: string, form: FormData, parameters: any,
c8oResponseListener: C8oResponseListener): Promise<any> {
const headersObject = {"Accept": "application/json", "x-convertigo-sdk": this.c8o.sdkVersion};
Object.assign(headersObject, this.c8o.headers);
const headers = {headers: headersObject};
const progress: C8oProgress = new C8oProgress();
progress.pull = false;
const varNull: JSON = null;
if (this.firstCall) {
this.p1 = new Promise((resolve) => {
this.firstCall = false;
this.c8o.httpPublic.post({url, data: form, withCredentials: true, headers, onUploadProgress(event) {
this.handleProgress(event, progress, parameters, c8oResponseListener, varNull);
}}, {
headers,
withCredentials: true,
}).then((response) =>
resolve(response.data),
).catch((error) => {
resolve({error : (new C8oHttpRequestException(C8oExceptionMessage.runHttpRequest(), error)),
});
});
});
return this.p1;
} else {
return new Promise((resolve) => {
Promise.all([this.p1]).then(() => {
this.c8o.httpPublic.post({url, data: form, withCredentials: true, headers, onUploadProgress(event) {
this.handleProgress(event, progress, parameters, c8oResponseListener, varNull);
}}, {
headers,
withCredentials: true,
}).then((response) =>
resolve(response.data),
).catch((error) => {
resolve({error : (new C8oHttpRequestException(C8oExceptionMessage.runHttpRequest(), error)),
});
});
});
});
}
}
/**
* Handle progress
* @param event
* @param {C8oProgress} progress
* @param parameters
* @param {C8oResponseListener} c8oResponseListener
* @param {JSON} varNull
*/
public handleProgress(event: any, progress: C8oProgress, parameters: any,
c8oResponseListener: C8oResponseListener, varNull: JSON): void {
progress.current = event.loaded;
progress.total = event.total;
progress.finished = event.loaded === event.total;
parameters[C8o.ENGINE_PARAMETER_PROGRESS] = progress;
(c8oResponseListener as C8oResponseJsonListener).onJsonResponse(varNull, parameters);
}
/**
* Check if we are in cordova environment
* @return {boolean}
*/
private isCordova(): boolean {
if (this._isCordova == null) {
this._isCordova = window["cordova"] !== undefined;
}
return this._isCordova;
}
}