UNPKG

tns-core-modules

Version:

Telerik NativeScript Core Modules

157 lines (156 loc) 5.21 kB
var types = require("utils/types"); var http = require("http"); var requestIdCounter = 0; var pendingRequests = {}; var utils; function ensureUtils() { if (!utils) { utils = require("utils/utils"); } } var imageSource; function ensureImageSource() { if (!imageSource) { imageSource = require("image-source"); } } var platform; function ensurePlatform() { if (!platform) { platform = require("platform"); } } var completeCallback; function ensureCompleteCallback() { if (completeCallback) { return; } completeCallback = new com.tns.Async.CompleteCallback({ onComplete: function (result, context) { onRequestComplete(context, result); } }); } function onRequestComplete(requestId, result) { var callbacks = pendingRequests[requestId]; delete pendingRequests[requestId]; if (result.error) { callbacks.rejectCallback(new Error(result.error.toString())); return; } var headers = {}; if (result.headers) { var jHeaders = result.headers; var length = jHeaders.size(); var i; var pair; for (i = 0; i < length; i++) { pair = jHeaders.get(i); http.addHeader(headers, pair.key, pair.value); } } callbacks.resolveCallback({ content: { raw: result.raw, toString: function () { if (types.isString(result.responseAsString)) { return result.responseAsString; } else { throw new Error("Response content may not be converted to string"); } }, toJSON: function () { ensureUtils(); return utils.parseJSON(result.responseAsString); }, toImage: function () { ensureImageSource(); return new Promise(function (resolveImage, rejectImage) { if (result.responseAsImage != null) { resolveImage(imageSource.fromNativeSource(result.responseAsImage)); } else { rejectImage(new Error("Response content may not be converted to an Image")); } }); }, toFile: function (destinationFilePath) { var fs = require("file-system"); var fileName = callbacks.url; if (!destinationFilePath) { destinationFilePath = fs.path.join(fs.knownFolders.documents().path, fileName.substring(fileName.lastIndexOf('/') + 1)); } var stream; try { var javaFile = new java.io.File(destinationFilePath); stream = new java.io.FileOutputStream(javaFile); stream.write(result.raw.toByteArray()); return fs.File.fromPath(destinationFilePath); } catch (exception) { throw new Error("Cannot save file with path: " + destinationFilePath + "."); } finally { if (stream) { stream.close(); } } } }, statusCode: result.statusCode, headers: headers }); } function buildJavaOptions(options) { if (!types.isString(options.url)) { throw new Error("Http request must provide a valid url."); } var javaOptions = new com.tns.Async.Http.RequestOptions(); javaOptions.url = options.url; if (types.isString(options.method)) { javaOptions.method = options.method; } if (types.isString(options.content) || options.content instanceof FormData) { javaOptions.content = options.content.toString(); } if (types.isNumber(options.timeout)) { javaOptions.timeout = options.timeout; } if (options.headers) { var arrayList = new java.util.ArrayList(); var pair = com.tns.Async.Http.KeyValuePair; for (var key in options.headers) { arrayList.add(new pair(key, options.headers[key] + "")); } javaOptions.headers = arrayList; } ensurePlatform(); var screen = platform.screen.mainScreen; javaOptions.screenWidth = screen.widthPixels; javaOptions.screenHeight = screen.heightPixels; return javaOptions; } function request(options) { if (!types.isDefined(options)) { return; } return new Promise(function (resolve, reject) { try { var javaOptions = buildJavaOptions(options); var callbacks = { url: options.url, resolveCallback: resolve, rejectCallback: reject }; pendingRequests[requestIdCounter] = callbacks; ensureCompleteCallback(); com.tns.Async.Http.MakeRequest(javaOptions, completeCallback, new java.lang.Integer(requestIdCounter)); requestIdCounter++; } catch (ex) { reject(ex); } }); } exports.request = request;