var _ = require('../utility'); var makeFetchRequest = require('./transport/fetch'); var makeXhrRequest = require('./transport/xhr'); /* * accessToken may be embedded in payload but that should not * be assumed * * options: { * hostname * protocol * path * port * method * transport ('xhr' | 'fetch') * } * * params is an object containing key/value pairs. These * will be appended to the path as 'key=value&key=value' * * payload is an unserialized object */ function Transport(truncation) { this.truncation = truncation; } Transport.prototype.get = function ( accessToken, options, params, callback, requestFactory, ) { if (!callback || !_.isFunction(callback)) { callback = function () {}; } _.addParamsAndAccessTokenToPath(accessToken, options, params); var method = 'GET'; var url = _.formatUrl(options); this._makeZoneRequest( accessToken, url, method, null, callback, requestFactory, options.timeout, options.transport, ); }; Transport.prototype.post = function ( accessToken, options, payload, callback, requestFactory, ) { if (!callback || !_.isFunction(callback)) { callback = function () {}; } if (!payload) { return callback(new Error('Cannot send empty request')); } var stringifyResult; if (this.truncation) { stringifyResult = this.truncation.truncate(payload); } else { stringifyResult = _.stringify(payload); } if (stringifyResult.error) { return callback(stringifyResult.error); } var writeData = stringifyResult.value; var method = 'POST'; var url = _.formatUrl(options); this._makeZoneRequest( accessToken, url, method, writeData, callback, requestFactory, options.timeout, options.transport, ); }; Transport.prototype.postJsonPayload = function ( accessToken, options, jsonPayload, callback, requestFactory, ) { if (!callback || !_.isFunction(callback)) { callback = function () {}; } var method = 'POST'; var url = _.formatUrl(options); this._makeZoneRequest( accessToken, url, method, jsonPayload, callback, requestFactory, options.timeout, options.transport, ); }; // Wraps _makeRequest and if Angular 2+ Zone.js is detected, changes scope // so Angular change detection isn't triggered on each API call. // This is the equivalent of runOutsideAngular(). // Transport.prototype._makeZoneRequest = function () { var gWindow = (typeof window != 'undefined' && window) || (typeof self != 'undefined' && self); var currentZone = gWindow && gWindow.Zone && gWindow.Zone.current; var args = Array.prototype.slice.call(arguments); if (currentZone && currentZone._name === 'angular') { var rootZone = currentZone._parent; var self = this; rootZone.run(function () { self._makeRequest.apply(undefined, args); }); } else { this._makeRequest.apply(undefined, args); } }; Transport.prototype._makeRequest = function ( accessToken, url, method, data, callback, requestFactory, timeout, transport, ) { if (typeof RollbarProxy !== 'undefined') { return _proxyRequest(data, callback); } if (transport === 'fetch') { makeFetchRequest(accessToken, url, method, data, callback, timeout); } else { makeXhrRequest( accessToken, url, method, data, callback, requestFactory, timeout, ); } }; /* global RollbarProxy */ function _proxyRequest(json, callback) { var rollbarProxy = new RollbarProxy(); rollbarProxy.sendJsonPayload( json, function (_msg) { /* do nothing */ }, // eslint-disable-line no-unused-vars function (err) { callback(new Error(err)); }, ); } module.exports = Transport;