pubnub
Version:
Publish & Subscribe Real-time Messaging with PubNub
150 lines (118 loc) • 3.28 kB
JavaScript
/* @flow */
/* global XMLHttpRequest */
import {
EndpointDefinition,
StatusAnnouncement,
} from '../../core/flow_interfaces';
import { buildUrl } from '../utils';
declare var Ti: any;
function log(url, qs, res) {
let _pickLogger = () => {
if (Ti && Ti.API && Ti.API.log) return Ti.API;
return console;
};
let start = new Date().getTime();
let timestamp = new Date().toISOString();
let logger = _pickLogger();
logger.log('<<<<<'); // eslint-disable-line no-console
logger.log(`[${timestamp}]`, '\n', url, '\n', qs); // eslint-disable-line no-console
logger.log('-----'); // eslint-disable-line no-console
let now = new Date().getTime();
let elapsed = now - start;
let timestampDone = new Date().toISOString();
logger.log('>>>>>>'); // eslint-disable-line no-console
logger.log(`[${timestampDone} / ${elapsed}]`, '\n', url, '\n', qs, '\n', res); // eslint-disable-line no-console
logger.log('-----');
}
function getHttpClient(): any {
if (Ti.Platform.osname === 'mobileweb') {
return new XMLHttpRequest();
} else {
return Ti.Network.createHTTPClient();
}
}
function keepAlive(xhr: any): void {
if (Ti.Platform.osname !== 'mobileweb' && this._config.keepAlive) {
xhr.enableKeepAlive = true;
}
}
function xdr(
xhr: any,
method: string,
url: string,
params: Object,
body: Object,
endpoint: EndpointDefinition,
callback: Function
): void {
let status: StatusAnnouncement = {};
status.operation = endpoint.operation;
xhr.open(method, buildUrl(url, params), true);
keepAlive.call(this, xhr);
xhr.onload = () => {
status.error = false;
if (xhr.status) {
status.statusCode = xhr.status;
}
let resp = JSON.parse(xhr.responseText);
if (this._config.logVerbosity) {
log(url, params, xhr.responseText);
}
return callback(status, resp);
};
xhr.onerror = (e) => {
status.error = true;
status.errorData = e.error;
status.category = this._detectErrorCategory(e.error);
return callback(status, null);
};
xhr.timeout = Ti.Platform.osname === 'android' ? 2147483647 : Infinity;
xhr.send(body);
}
export function get(
params: Object,
endpoint: EndpointDefinition,
callback: Function
) {
let xhr = getHttpClient();
let url = this.getStandardOrigin() + endpoint.url;
return xdr.call(this, xhr, 'GET', url, params, {}, endpoint, callback);
}
export function post(
params: Object,
body: string,
endpoint: EndpointDefinition,
callback: Function
) {
let xhr = getHttpClient();
let url = this.getStandardOrigin() + endpoint.url;
return xdr.call(
this,
xhr,
'POST',
url,
params,
JSON.parse(body),
endpoint,
callback
);
}
export function patch(
params: Object,
body: string,
endpoint: EndpointDefinition,
callback: Function
) {
let xhr = getHttpClient();
let url = this.getStandardOrigin() + endpoint.url;
return xdr.call(this, xhr, 'PATCH', url, params, JSON.parse(body), endpoint, callback);
}
export function del(
params: Object,
endpoint: EndpointDefinition,
callback: Function
) {
let xhr = getHttpClient();
let url = this.getStandardOrigin() + endpoint.url;
return xdr.call(this, xhr, 'DELETE', url, params, {}, endpoint, callback);
}