pubnub
Version:
Publish & Subscribe Real-time Messaging with PubNub
128 lines (105 loc) • 3.28 kB
JavaScript
/* @flow */
/* global FormData */
/* global fetch */
import { EndpointDefinition, StatusAnnouncement } from '../../core/flow_interfaces';
import { postfile as postfilewebnode } from './web-node';
async function postfileuri(
url: string,
fields: $ReadOnlyArray<{ key: string, value: string }>,
fileInput: any
): Promise<any> {
const formData = new FormData();
fields.forEach(({ key, value }) => {
formData.append(key, value);
});
formData.append('file', fileInput);
const result = await fetch(url, {
method: 'POST',
body: formData
});
return result;
}
export async function postfile(
url: string,
fields: $ReadOnlyArray<{ key: string, value: string }>,
fileInput: any
): Promise<any> {
if (!fileInput.uri) {
return postfilewebnode(url, fields, fileInput);
} else {
return postfileuri(url, fields, fileInput);
}
}
export function getfile(params: Object, endpoint: EndpointDefinition, callback: Function): Promise<any> {
let url = this.getStandardOrigin() + endpoint.url;
if (params && Object.keys(params).length > 0) {
let searchParams = new URLSearchParams(params);
if (endpoint.url.indexOf('?') > -1) {
url += '&';
} else {
url += '?';
}
url += searchParams.toString();
}
let fetchResult = fetch(url, { method: 'GET', headers: endpoint.headers });
fetchResult.then(async (resp) => {
let parsedResponse;
let status: StatusAnnouncement = {};
status.error = false;
status.operation = endpoint.operation;
if (resp && resp.status) {
status.statusCode = resp.status;
}
if (endpoint.ignoreBody) {
parsedResponse = {
headers: resp.headers,
redirects: [],
response: resp,
};
} else {
try {
parsedResponse = JSON.parse(await resp.text());
} catch (e) {
status.errorData = resp;
status.error = true;
return callback(status, null);
}
}
if (
parsedResponse.error &&
parsedResponse.error === 1 &&
parsedResponse.status &&
parsedResponse.message &&
parsedResponse.service
) {
status.errorData = parsedResponse;
status.statusCode = parsedResponse.status;
status.error = true;
status.category = this._detectErrorCategory(status);
return callback(status, null);
} else if (parsedResponse.error && parsedResponse.error.message) {
status.errorData = parsedResponse.error;
}
// returning the entire response in order to use response methods for
// reading the body in react native because the response.body
// is a ReadableStream which doesn't seem to be reliable on ios and android
return callback(status, { response: { body: resp } });
});
fetchResult.catch((err) => {
let status: StatusAnnouncement = {};
status.error = true;
status.operation = endpoint.operation;
if (err.response && err.response.text && !this._config.logVerbosity) {
try {
status.errorData = JSON.parse(err.response.text);
} catch (e) {
status.errorData = err;
}
} else {
status.errorData = err;
}
status.category = this._detectErrorCategory(err);
return callback(status, null);
});
return fetchResult;
}