UNPKG

path-loader

Version:

Utility that provides a single API for loading the content of a path/URL.

98 lines (87 loc) 3.6 kB
/* eslint-env node, browser */ /* * The MIT License (MIT) * * Copyright (c) 2015 Jeremy Whitlock * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. */ 'use strict'; var request = require('superagent'); var supportedHttpMethods = ['delete', 'get', 'head', 'patch', 'post', 'put']; /** * Loads a file from an http or https URL. * * @param {string} location - The document URL (If relative, location is relative to window.location.origin). * @param {object} options - The loader options * @param {string} [options.method=get] - The HTTP method to use for the request * @param {module:PathLoader~PrepareRequestCallback} [options.prepareRequest] - The callback used to prepare a request * @param {module:PathLoader~ProcessResponseCallback} [options.processContent] - The callback used to process the * response * @param {function} callback - The error-first callback */ module.exports.load = function (location, options, callback) { var realMethod = options.method ? options.method.toLowerCase() : 'get'; var err; var realRequest; function makeRequest (err, req) { if (err) { callback(err); } else { // buffer() is only available in Node.js if (Object.prototype.toString.call(typeof process !== 'undefined' ? process : 0) === '[object process]' && typeof req.buffer === 'function') { req.buffer(true); } req .end(function (err2, res) { if (err2) { callback(err2); } else { callback(undefined, res); } }); } } if (typeof options.method !== 'undefined') { if (typeof options.method !== 'string') { err = new TypeError('options.method must be a string'); } else if (supportedHttpMethods.indexOf(options.method) === -1) { err = new TypeError('options.method must be one of the following: ' + supportedHttpMethods.slice(0, supportedHttpMethods.length - 1).join(', ') + ' or ' + supportedHttpMethods[supportedHttpMethods.length - 1]); } } else if (typeof options.prepareRequest !== 'undefined' && typeof options.prepareRequest !== 'function') { err = new TypeError('options.prepareRequest must be a function'); } if (!err) { realRequest = request[realMethod === 'delete' ? 'del' : realMethod](location); if (options.prepareRequest) { try { options.prepareRequest(realRequest, makeRequest); } catch (err2) { callback(err2); } } else { makeRequest(undefined, realRequest); } } else { callback(err); } };