smoke_detector 1.1.6 → 1.1.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/lib/smoke_detector/providers/rollbar.rb +2 -1
- data/lib/smoke_detector/version.rb +1 -1
- metadata +2 -61
- data/lib/smoke_detector/providers/js/rollbar.js +0 -2343
- data/spec/dummy/config/initializers/rollbar.rb +0 -52
- data/spec/dummy/db/test.sqlite3 +0 -0
- data/spec/dummy/log/development.log +0 -0
- data/spec/dummy/log/test.log +0 -2004
- data/spec/dummy/tmp/cache/assets/test/sprockets/v3.0/-x18hqI9UW005FhNgtUabDb_BX9T417ldrWDmDWNPX8.cache +0 -0
- data/spec/dummy/tmp/cache/assets/test/sprockets/v3.0/05tGgfvaIZB2WhxiwJDDsK1qSSp8q5z2w0oizhbu63g.cache +0 -2
- data/spec/dummy/tmp/cache/assets/test/sprockets/v3.0/2P9IKzmeq2XFDLIYjg2LNFyWtCBLF-ln0JiHUCrbW0c.cache +0 -0
- data/spec/dummy/tmp/cache/assets/test/sprockets/v3.0/3gSuQ9W4PxO4smIQPaFSvUPwbTje0ytOAk_48728k8Y.cache +0 -0
- data/spec/dummy/tmp/cache/assets/test/sprockets/v3.0/4PHfvRiCq9kVrQqfDNAGhcaBoauNSBACR3-CAhb4GdE.cache +0 -2
- data/spec/dummy/tmp/cache/assets/test/sprockets/v3.0/538rWEA_3I2ZHauSM8pcOJP_kWuj6FSnitAiiJbiPN0.cache +0 -1
- data/spec/dummy/tmp/cache/assets/test/sprockets/v3.0/7o1iNT7bl-ROe5-bYVQCS28fllTA5i6Z0iyjdFvIPIg.cache +0 -3
- data/spec/dummy/tmp/cache/assets/test/sprockets/v3.0/9SY9VqlZtb0EDo8-J83s1Qiq7pTRujc3n2WkrHriGuM.cache +0 -1
- data/spec/dummy/tmp/cache/assets/test/sprockets/v3.0/Dz7ku8U7vd16P6NMo09ywNulRPottH7H_s-hegc2gus.cache +0 -0
- data/spec/dummy/tmp/cache/assets/test/sprockets/v3.0/GvpVw77ArWRTSddCmX65HDkzmlE290UZLiRcyQEuSBM.cache +0 -1
- data/spec/dummy/tmp/cache/assets/test/sprockets/v3.0/Il1yRkc2D9nqrvnlyJyxvRsqpXTMXR5OVueD15805GA.cache +0 -1
- data/spec/dummy/tmp/cache/assets/test/sprockets/v3.0/J_G_CP7Cl7finRnUkPE3NoWigAsaYpkc0Be7CEYGFjs.cache +0 -0
- data/spec/dummy/tmp/cache/assets/test/sprockets/v3.0/NbHl6A1212F35_idivtDkIfodWqvEXmqF2xIc5JPMx0.cache +0 -1
- data/spec/dummy/tmp/cache/assets/test/sprockets/v3.0/O_DOE8ZL1tv6KAmcCD3FcQSefNad6Tvw2hAB-WAYxyE.cache +0 -1
- data/spec/dummy/tmp/cache/assets/test/sprockets/v3.0/Pz8e-g6mv0m0X3uFkpVwjOTGZEjibszt85vhL5SJdNg.cache +0 -1
- data/spec/dummy/tmp/cache/assets/test/sprockets/v3.0/SJkrF8Ralh_HhbmvfAKbq_Td3J8UflhAnpsNhon52kE.cache +0 -0
- data/spec/dummy/tmp/cache/assets/test/sprockets/v3.0/T3VbPBrfBG_M2mtqVvjyaZMp4LETT3VvuvKxp1U56Cc.cache +0 -0
- data/spec/dummy/tmp/cache/assets/test/sprockets/v3.0/Yt2RZ834NN6kGkm4udDJ-Wtnx2-_14ujv8hQX_OZmOc.cache +0 -1
- data/spec/dummy/tmp/cache/assets/test/sprockets/v3.0/ZO-3opaC2Gt8QYT5nm1mzL2Jwf4zs_9gVMegU6WWfUY.cache +0 -1
- data/spec/dummy/tmp/cache/assets/test/sprockets/v3.0/awMEDS383IkYHC7JTIqI6sXg7kzzZv2sQHwjulX0HUs.cache +0 -2
- data/spec/dummy/tmp/cache/assets/test/sprockets/v3.0/q6b8zxMi44GVQTl-GJRWpogdyUFouWI8u09uhqHktSw.cache +0 -0
- data/spec/dummy/tmp/cache/assets/test/sprockets/v3.0/qO4DbjTAlq45h5i51BWY4m2LXiwxyc9fqhOKcupr4uU.cache +0 -2
- data/spec/dummy/tmp/cache/assets/test/sprockets/v3.0/sJf6s34rz4gdJxfsPCjHDaRkRGCYAp0EujRjwsRI8w0.cache +0 -1
- data/spec/dummy/tmp/cache/assets/test/sprockets/v3.0/scElb_WiPaZv7rRpGIgZyVh9vDRRojRi_OGL3S2jnHk.cache +0 -1
- data/spec/dummy/tmp/cache/assets/test/sprockets/v3.0/xMXJ3vour8ycAz_YitjWxbg7iWE5yqDS7ExE6YmICsE.cache +0 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 9913d381da9a715fd0983ffc3c41a4e2685813ea
|
4
|
+
data.tar.gz: c37ddf039706ab14ac6293b544c9a27f43062bd6
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: bf68a21d933c76fd218a143642b3c8fe66c2dd1b74e31c932774ea6f0dc12e7a6148cba6821532056dada87f33f06fde5aed97a5791e3a9efabc4542aad40895
|
7
|
+
data.tar.gz: 82bda3de457f4b392e42a90528310133959f5b6f555a88580dec4de392c642f9f06dca5a4f1d12c5d8312b7bb8ea855b85d773b07cdc2179d36977f9952bc0e9
|
@@ -45,10 +45,11 @@ module SmokeDetector::Providers
|
|
45
45
|
return '' if client_settings[:api_key].blank?
|
46
46
|
client_settings[:accessToken] = client_settings.delete(:api_key)
|
47
47
|
return @client_monitoring_code if @client_monitoring_code
|
48
|
-
@client_monitoring_code ||= <<-JS.freeze
|
48
|
+
@client_monitoring_code ||= (<<-RBC + <<-'JS').freeze
|
49
49
|
<script>
|
50
50
|
var _rollbarConfig = #{client_settings.to_json};
|
51
51
|
</script>
|
52
|
+
RBC
|
52
53
|
<script>
|
53
54
|
!function(e,t){if("object"==typeof exports&&"object"==typeof module)module.exports=t();else if("function"==typeof define&&define.amd)define(t);else{var r=t();for(var n in r)("object"==typeof exports?exports:e)[n]=r[n]}}(this,function(){return function(e){function t(n){if(r[n])return r[n].exports;var o=r[n]={exports:{},id:n,loaded:!1};return e[n].call(o.exports,o,o.exports,t),o.loaded=!0,o.exports}var r={};return t.m=e,t.c=r,t.p="",t(0)}([function(e,t,r){e.exports=r(1)},function(e,t,r){"use strict";function n(){var e="undefined"==typeof JSON?{}:JSON,t=r(4),n={};t(n),e=n,o.setupJSON(e)}var o=r(2),i=r(3);n();var a=window._rollbarConfig,s=a&&a.globalAlias||"Rollbar",u=window[s]&&"undefined"!=typeof window[s].shimId;!u&&a?o.wrapper.init(a):(window.Rollbar=o.wrapper,window.RollbarNotifier=i.Notifier),e.exports=o.wrapper},function(e,t,r){"use strict";function n(e){a.setupJSON(e)}function o(e,t,r){!r[4]&&window._rollbarWrappedError&&(r[4]=window._rollbarWrappedError,window._rollbarWrappedError=null),e.uncaughtError.apply(e,r),t&&t.apply(window,r)}function i(e,t){if(t.hasOwnProperty&&t.hasOwnProperty("addEventListener")){var r=t.addEventListener;t.addEventListener=function(t,n,o){r.call(this,t,e.wrap(n),o)};var n=t.removeEventListener;t.removeEventListener=function(e,t,r){n.call(this,e,t&&t._wrapped||t,r)}}}var a=r(3),s=a.Notifier;window._rollbarWrappedError=null;var u={};u.init=function(e,t){var r=new s(t);if(r.configure(e),e.captureUncaught){var n=window.onerror;window.onerror=function(){var e=Array.prototype.slice.call(arguments,0);o(r,n,e)};var a,u,c=["EventTarget","Window","Node","ApplicationCache","AudioTrackList","ChannelMergerNode","CryptoOperation","EventSource","FileReader","HTMLUnknownElement","IDBDatabase","IDBRequest","IDBTransaction","KeyOperation","MediaController","MessagePort","ModalWindow","Notification","SVGElementInstance","Screen","TextTrack","TextTrackCue","TextTrackList","WebSocket","WebSocketWorker","Worker","XMLHttpRequest","XMLHttpRequestEventTarget","XMLHttpRequestUpload"];for(a=0;a<c.length;++a)u=c[a],window[u]&&window[u].prototype&&i(r,window[u].prototype)}return window.Rollbar=r,s.processPayloads(),r},e.exports={wrapper:u,setupJSON:n}},function(e,t,r){"use strict";function n(e){h=e,g.setupJSON(e)}function o(){return m}function i(e){m=m||this;var t=window.location.protocol;0!==t.indexOf("http")&&(t="https:");var r=t+"//"+i.DEFAULT_ENDPOINT;this.options={enabled:!0,endpoint:r,environment:"production",scrubFields:f.copy(i.DEFAULT_SCRUB_FIELDS),checkIgnore:null,logLevel:i.DEFAULT_LOG_LEVEL,reportLevel:i.DEFAULT_REPORT_LEVEL,uncaughtErrorLevel:i.DEFAULT_UNCAUGHT_ERROR_LEVEL,payload:{}},this.lastError=null,this.plugins={},this.parentNotifier=e,this.logger=function(){if(window.console&&"function"==typeof window.console.log){var e=["Rollbar:"].concat(Array.prototype.slice.call(arguments,0));window.console.log(e)}},e&&(e.hasOwnProperty("shimId")?e.notifier=this:(this.logger=e.logger,this.configure(e.options)))}function a(e,t){return function(){var r=t||this;try{return e.apply(r,arguments)}catch(n){r&&r.logger(n)}}}function s(e){if(!e)return["Unknown error. There was no error message to display.",""];var t=e.match(v),r="(unknown)";return t&&(r=t[t.length-1],e=e.replace((t[t.length-2]||"")+r+":",""),e=e.replace(/(^[\s]+|[\s]+$)/g,"")),[r,e]}function u(){w||(w=setTimeout(c,1e3))}function c(){var e;try{for(;e=window._rollbarPayloadQueue.shift();)l(e.endpointUrl,e.accessToken,e.payload,e.callback)}finally{w=void 0}}function l(e,t,r,n){n=n||function(){};var o=(new Date).getTime();o-y>=6e4&&(y=o,_=0);var i=window._globalRollbarOptions.maxItems,a=window._globalRollbarOptions.itemsPerMinute,s=function(){return!r.ignoreRateLimit&&i>=1&&b>=i},u=function(){return!r.ignoreRateLimit&&a>=1&&_>=a};return s()?void n(new Error(i+" max items reached")):u()?void n(new Error(a+" items per minute reached")):(b++,_++,s()&&m._log(m.options.uncaughtErrorLevel,"maxItems has been hit. Ignoring errors for the remainder of the current page load.",null,{maxItems:i},null,!1,!0),r.ignoreRateLimit&&delete r.ignoreRateLimit,void d.post(e,t,r,function(e,t){return e?n(e):n(null,t)}))}var p=r(5),f=r(6),g=r(7),d=g.XHR,h=null;i.NOTIFIER_VERSION="1.3.0",i.DEFAULT_ENDPOINT="api.rollbar.com/api/1/",i.DEFAULT_SCRUB_FIELDS=["pw","pass","passwd","password","secret","confirm_password","confirmPassword","password_confirmation","passwordConfirmation","access_token","accessToken","secret_key","secretKey","secretToken"],i.DEFAULT_LOG_LEVEL="debug",i.DEFAULT_REPORT_LEVEL="debug",i.DEFAULT_UNCAUGHT_ERROR_LEVEL="warning",i.DEFAULT_ITEMS_PER_MIN=60,i.DEFAULT_MAX_ITEMS=0,i.LEVELS={debug:0,info:1,warning:2,error:3,critical:4},window._rollbarPayloadQueue=[],window._globalRollbarOptions={startTime:(new Date).getTime(),maxItems:i.DEFAULT_MAX_ITEMS,itemsPerMinute:i.DEFAULT_ITEMS_PER_MIN};var m;i._generateLogFn=function(e){return a(function(){var t=this._getLogArgs(arguments);return this._log(e||t.level||this.options.logLevel||i.DEFAULT_LOG_LEVEL,t.message,t.err,t.custom,t.callback)})},i.prototype._getLogArgs=function(e){for(var t,r,n,o,s,u,c,l=this.options.logLevel||i.DEFAULT_LOG_LEVEL,p=0;p<e.length;++p)c=e[p],u=typeof c,"string"===u?r=c:"function"===u?s=a(c,this):c&&"object"===u&&("Date"===c.constructor.name?t=c:c instanceof Error||c.prototype===Error.prototype||c.hasOwnProperty("stack")||"undefined"!=typeof DOMException&&c instanceof DOMException?n=c:o=c);return{level:l,message:r,err:n,custom:o,callback:s}},i.prototype._route=function(e){var t=this.options.endpoint,r=/\/$/.test(t),n=/^\//.test(e);return r&&n?e=e.substring(1):r||n||(e="/"+e),t+e},i.prototype._processShimQueue=function(e){for(var t,r,n,o,a,s,u,c={};r=e.shift();)t=r.shim,n=r.method,o=r.args,a=t.parentShim,u=c[t.shimId],u||(a?(s=c[a.shimId],u=new i(s)):u=this,c[t.shimId]=u),u[n]&&"function"==typeof u[n]&&u[n].apply(u,o)},i.prototype._buildPayload=function(e,t,r,n,o){var a=this.options.accessToken,s=this.options.environment,u=f.copy(this.options.payload),c=f.uuid4();if(void 0===i.LEVELS[t])throw new Error("Invalid level");if(!r&&!n&&!o)throw new Error("No message, stack info or custom data");var l={environment:s,endpoint:this.options.endpoint,uuid:c,level:t,platform:"browser",framework:"browser-js",language:"javascript",body:this._buildBody(r,n,o),request:{url:window.location.href,query_string:window.location.search,user_ip:"$remote_ip"},client:{runtime_ms:e.getTime()-window._globalRollbarOptions.startTime,timestamp:Math.round(e.getTime()/1e3),javascript:{browser:window.navigator.userAgent,language:window.navigator.language,cookie_enabled:window.navigator.cookieEnabled,screen:{width:window.screen.width,height:window.screen.height},plugins:this._getBrowserPlugins()}},server:{},notifier:{name:"rollbar-browser-js",version:i.NOTIFIER_VERSION}};u.body&&delete u.body;var p={access_token:a,data:f.merge(l,u)};return this._scrub(p.data),p},i.prototype._buildBody=function(e,t,r){var n;return n=t?this._buildPayloadBodyTrace(e,t,r):this._buildPayloadBodyMessage(e,r)},i.prototype._buildPayloadBodyMessage=function(e,t){e||(e=t?h.stringify(t):"");var r={body:e};return t&&(r.extra=f.copy(t)),{message:r}},i.prototype._buildPayloadBodyTrace=function(e,t,r){var n=s(t.message),o=t.name||n[0],i=n[1],a={exception:{"class":o,message:i}};if(e&&(a.exception.description=e||"uncaught exception"),t.stack){var u,c,l,p,g,d,h,m;for(a.frames=[],h=0;h<t.stack.length;++h)u=t.stack[h],c={filename:u.url?f.sanitizeUrl(u.url):"(unknown)",lineno:u.line||null,method:u.func&&"?"!==u.func?u.func:"[anonymous]",colno:u.column},l=p=g=null,d=u.context?u.context.length:0,d&&(m=Math.floor(d/2),p=u.context.slice(0,m),l=u.context[m],g=u.context.slice(m)),l&&(c.code=l),(p||g)&&(c.context={},p&&p.length&&(c.context.pre=p),g&&g.length&&(c.context.post=g)),u.args&&(c.args=u.args),a.frames.push(c);return a.frames.reverse(),r&&(a.extra=f.copy(r)),{trace:a}}return this._buildPayloadBodyMessage(o+": "+i,r)},i.prototype._getBrowserPlugins=function(){if(!this._browserPlugins){var e,t,r=window.navigator.plugins||[],n=r.length,o=[];for(t=0;n>t;++t)e=r[t],o.push({name:e.name,description:e.description});this._browserPlugins=o}return this._browserPlugins},i.prototype._scrub=function(e){function t(e,t,r,n,o,i,a,s){return t+f.redact(i)}function r(e){var r;if("string"==typeof e)for(r=0;r<s.length;++r)e=e.replace(s[r],t);return e}function n(e,t){var r;for(r=0;r<a.length;++r)if(a[r].test(e)){t=f.redact(t);break}return t}function o(e,t){var o=n(e,t);return o===t?r(o):o}var i=this.options.scrubFields,a=this._getScrubFieldRegexs(i),s=this._getScrubQueryParamRegexs(i);return f.traverse(e,o),e},i.prototype._getScrubFieldRegexs=function(e){for(var t,r=[],n=0;n<e.length;++n)t="\\[?(%5[bB])?"+e[n]+"\\[?(%5[bB])?\\]?(%5[dD])?",r.push(new RegExp(t,"i"));return r},i.prototype._getScrubQueryParamRegexs=function(e){for(var t,r=[],n=0;n<e.length;++n)t="\\[?(%5[bB])?"+e[n]+"\\[?(%5[bB])?\\]?(%5[dD])?",r.push(new RegExp("("+t+"=)([^&\\n]+)","igm"));return r},i.prototype._urlIsWhitelisted=function(e){var t,r,n,o,i,a,s,u,c,l;try{if(t=this.options.hostWhiteList,r=e.data.body.trace,!t||0===t.length)return!0;if(!r)return!0;for(s=t.length,i=r.frames.length,c=0;i>c;c++){if(n=r.frames[c],o=n.filename,"string"!=typeof o)return!0;for(l=0;s>l;l++)if(a=t[l],u=new RegExp(a),u.test(o))return!0}}catch(p){return this.configure({hostWhiteList:null}),this.error("Error while reading your configuration's hostWhiteList option. Removing custom hostWhiteList.",p),!0}return!1},i.prototype._messageIsIgnored=function(e){var t,r,n,o,i,a,s;try{if(i=!1,n=this.options.ignoredMessages,s=e.data.body.trace,!n||0===n.length)return!1;if(!s)return!1;for(t=s.exception.message,o=n.length,r=0;o>r&&(a=new RegExp(n[r],"gi"),!(i=a.test(t)));r++);}catch(u){this.configure({ignoredMessages:null}),this.error("Error while reading your configuration's ignoredMessages option. Removing custom ignoredMessages.")}return i},i.prototype._enqueuePayload=function(e,t,r,n){var o={callback:n,accessToken:this.options.accessToken,endpointUrl:this._route("item/"),payload:e},i=function(){if(n){var e="This item was not sent to Rollbar because it was ignored. This can happen if a custom checkIgnore() function was used or if the item's level was less than the notifier' reportLevel. See https://rollbar.com/docs/notifier/rollbar.js/configuration for more details.";n(null,{err:0,result:{id:null,uuid:null,message:e}})}};if(this._internalCheckIgnore(t,r,e))return void i();try{if(this.options.checkIgnore&&"function"==typeof this.options.checkIgnore&&this.options.checkIgnore(t,r,e))return void i()}catch(a){this.configure({checkIgnore:null}),this.error("Error while calling custom checkIgnore() function. Removing custom checkIgnore().",a)}if(this._urlIsWhitelisted(e)&&!this._messageIsIgnored(e)){if(this.options.verbose){if(e.data&&e.data.body&&e.data.body.trace){var s=e.data.body.trace,c=s.exception.message;this.logger(c)}this.logger("Sending payload -",o)}"function"==typeof this.options.logFunction&&this.options.logFunction(o);try{"function"==typeof this.options.transform&&this.options.transform(e)}catch(a){this.configure({transform:null}),this.error("Error while calling custom transform() function. Removing custom transform().",a)}this.options.enabled&&(window._rollbarPayloadQueue.push(o),u())}},i.prototype._internalCheckIgnore=function(e,t,r){var n=t[0],o=i.LEVELS[n]||0,a=i.LEVELS[this.options.reportLevel]||0;if(a>o)return!0;var s=this.options?this.options.plugins:{};return s&&s.jquery&&s.jquery.ignoreAjaxErrors&&r.body.message?r.body.messagejquery_ajax_error:!1},i.prototype._log=function(e,t,r,n,o,i,a){var s=null;if(r){if(s=r._savedStackTrace?r._savedStackTrace:p.parse(r),r===this.lastError)return;this.lastError=r}var u=this._buildPayload(new Date,e,t,s,n);a&&(u.ignoreRateLimit=!0),this._enqueuePayload(u,i?!0:!1,[e,t,r,n],o)},i.prototype.log=i._generateLogFn(),i.prototype.debug=i._generateLogFn("debug"),i.prototype.info=i._generateLogFn("info"),i.prototype.warn=i._generateLogFn("warning"),i.prototype.warning=i._generateLogFn("warning"),i.prototype.error=i._generateLogFn("error"),i.prototype.critical=i._generateLogFn("critical"),i.prototype.uncaughtError=a(function(e,t,r,n,o,i){if(i=i||null,o&&o.stack)return void this._log(this.options.uncaughtErrorLevel,e,o,i,null,!0);if(t&&t.stack)return void this._log(this.options.uncaughtErrorLevel,e,t,i,null,!0);var a={url:t||"",line:r};a.func=p.guessFunctionName(a.url,a.line),a.context=p.gatherContext(a.url,a.line);var s={mode:"onerror",message:e||"uncaught exception",url:document.location.href,stack:[a],useragent:navigator.userAgent};o&&(s=o._savedStackTrace||p.parse(o));var u=this._buildPayload(new Date,this.options.uncaughtErrorLevel,e,s);this._enqueuePayload(u,!0,[this.options.uncaughtErrorLevel,e,t,r,n,o])}),i.prototype.global=a(function(e){e=e||{},f.merge(window._globalRollbarOptions,e),void 0!==e.maxItems&&(b=0),void 0!==e.itemsPerMinute&&(_=0)}),i.prototype.configure=a(function(e){f.merge(this.options,e),this.global(e)}),i.prototype.scope=a(function(e){var t=new i(this);return f.merge(t.options.payload,e),t}),i.prototype.wrap=function(e,t){var r;if(r="function"==typeof t?t:function(){return t||{}},"function"!=typeof e)return e;if(e._isWrap)return e;if(!e._wrapped){e._wrapped=function(){try{return e.apply(this,arguments)}catch(t){throw t.stack||(t._savedStackTrace=p.parse(t)),t._rollbarContext=r()||{},t._rollbarContext._wrappedSource=e.toString(),window._rollbarWrappedError=t,t}},e._wrapped._isWrap=!0;for(var n in e)e.hasOwnProperty(n)&&(e._wrapped[n]=e[n])}return e._wrapped};var w,v=new RegExp("^(([a-zA-Z0-9-_$ ]*): *)?(Uncaught )?([a-zA-Z0-9-_$ ]*): ");i.processPayloads=function(e){return e?void c():void u()};var y=(new Date).getTime(),b=0,_=0;e.exports={Notifier:i,setupJSON:n,topLevelNotifier:o}},function(module,exports,__webpack_require__){var setupCustomJSON=function(JSON){function f(e){return 10>e?"0"+e:e}function quote(e){return escapable.lastIndex=0,escapable.test(e)?'"'+e.replace(escapable,function(e){var t=meta[e];return"string"==typeof t?t:"\\u"+("0000"+e.charCodeAt(0).toString(16)).slice(-4)})+'"':'"'+e+'"'}function str(e,t){var r,n,o,i,a,s=gap,u=t[e];switch("function"==typeof rep&&(u=rep.call(t,e,u)),typeof u){case"string":return quote(u);case"number":return isFinite(u)?String(u):"null";case"boolean":case"null":return String(u);case"object":if(!u)return"null";if(gap+=indent,a=[],"[object Array]"===Object.prototype.toString.apply(u)){for(i=u.length,r=0;i>r;r+=1)a[r]=str(r,u)||"null";return o=0===a.length?"[]":gap?"[\n"+gap+a.join(",\n"+gap)+"\n"+s+"]":"["+a.join(",")+"]",gap=s,o}if(rep&&"object"==typeof rep)for(i=rep.length,r=0;i>r;r+=1)"string"==typeof rep[r]&&(n=rep[r],o=str(n,u),o&&a.push(quote(n)+(gap?": ":":")+o));else for(n in u)Object.prototype.hasOwnProperty.call(u,n)&&(o=str(n,u),o&&a.push(quote(n)+(gap?": ":":")+o));return o=0===a.length?"{}":gap?"{\n"+gap+a.join(",\n"+gap)+"\n"+s+"}":"{"+a.join(",")+"}",gap=s,o}}"function"!=typeof Date.prototype.toJSON&&(Date.prototype.toJSON=function(){return isFinite(this.valueOf())?this.getUTCFullYear()+"-"+f(this.getUTCMonth()+1)+"-"+f(this.getUTCDate())+"T"+f(this.getUTCHours())+":"+f(this.getUTCMinutes())+":"+f(this.getUTCSeconds())+"Z":null},String.prototype.toJSON=Number.prototype.toJSON=Boolean.prototype.toJSON=function(){return this.valueOf()});var cx=/[\u0000\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g,escapable=/[\\\"\x00-\x1f\x7f-\x9f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g,gap,indent,meta={"\b":"\\b"," ":"\\t","\n":"\\n","\f":"\\f","\r":"\\r",'"':'\\"',"\\":"\\\\"},rep;"function"!=typeof JSON.stringify&&(JSON.stringify=function(e,t,r){var n;if(gap="",indent="","number"==typeof r)for(n=0;r>n;n+=1)indent+=" ";else"string"==typeof r&&(indent=r);if(rep=t,t&&"function"!=typeof t&&("object"!=typeof t||"number"!=typeof t.length))throw new Error("JSON.stringify");return str("",{"":e})}),"function"!=typeof JSON.parse&&(JSON.parse=function(text,reviver){function walk(e,t){var r,n,o=e[t];if(o&&"object"==typeof o)for(r in o)Object.prototype.hasOwnProperty.call(o,r)&&(n=walk(o,r),void 0!==n?o[r]=n:delete o[r]);return reviver.call(e,t,o)}var j;if(text=String(text),cx.lastIndex=0,cx.test(text)&&(text=text.replace(cx,function(e){return"\\u"+("0000"+e.charCodeAt(0).toString(16)).slice(-4)})),/^[\],:{}\s]*$/.test(text.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,"@").replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,"]").replace(/(?:^|:|,)(?:\s*\[)+/g,"")))return j=eval("("+text+")"),"function"==typeof reviver?walk({"":j},""):j;throw new SyntaxError("JSON.parse")})};module.exports=setupCustomJSON},function(e,t,r){"use strict";function n(e,t){return c}function o(e,t){return null}function i(e){var t={};return t._stackFrame=e,t.url=e.fileName,t.line=e.lineNumber,t.func=e.functionName,t.column=e.columnNumber,t.args=e.args,t.context=o(t.url,t.line),t}function a(e){function t(){var t=[];try{t=u.parse(e)}catch(r){t=[]}for(var n=[],o=0;o<t.length;o++)n.push(new i(t[o]));return n}return{stack:t(),message:e.message,name:e.name}}function s(e){return new a(e)}var u=r(8),c="?";e.exports={guessFunctionName:n,gatherContext:o,parse:s,Stack:a,Frame:i}},function(e,t,r){"use strict";var n={merge:function(){var e,t,r,o,i,a,s=arguments[0]||{},u=1,c=arguments.length,l=!0;for("object"!=typeof s&&"function"!=typeof s&&(s={});c>u;u++)if(null!==(e=arguments[u]))for(t in e)e.hasOwnProperty(t)&&(r=s[t],o=e[t],s!==o&&(l&&o&&(o.constructor===Object||(i=o.constructor===Array))?(i?(i=!1,a=[]):a=r&&r.constructor===Object?r:{},s[t]=n.merge(a,o)):void 0!==o&&(s[t]=o)));return s},copy:function(e){var t;return"object"==typeof e&&(e.constructor===Object?t={}:e.constructor===Array&&(t=[])),n.merge(t,e),t},parseUriOptions:{strictMode:!1,key:["source","protocol","authority","userInfo","user","password","host","port","relative","path","directory","file","query","anchor"],q:{name:"queryKey",parser:/(?:^|&)([^&=]*)=?([^&]*)/g},parser:{strict:/^(?:([^:\/?#]+):)?(?:\/\/((?:(([^:@]*)(?::([^:@]*))?)?@)?([^:\/?#]*)(?::(\d*))?))?((((?:[^?#\/]*\/)*)([^?#]*))(?:\?([^#]*))?(?:#(.*))?)/,loose:/^(?:(?![^:@]+:[^:@\/]*@)([^:\/?#.]+):)?(?:\/\/)?((?:(([^:@]*)(?::([^:@]*))?)?@)?([^:\/?#]*)(?::(\d*))?)(((\/(?:[^?#](?![^?#\/]*\.[^?#\/.]+(?:[?#]|$)))*\/?)?([^?#\/]*))(?:\?([^#]*))?(?:#(.*))?)/}},parseUri:function(e){if(!e||"string"!=typeof e&&!(e instanceof String))throw new Error("Util.parseUri() received invalid input");for(var t=n.parseUriOptions,r=t.parser[t.strictMode?"strict":"loose"].exec(e),o={},i=14;i--;)o[t.key[i]]=r[i]||"";return o[t.q.name]={},o[t.key[12]].replace(t.q.parser,function(e,r,n){r&&(o[t.q.name][r]=n)}),o},sanitizeUrl:function(e){if(!e||"string"!=typeof e&&!(e instanceof String))throw new Error("Util.sanitizeUrl() received invalid input");var t=n.parseUri(e);return""===t.anchor&&(t.source=t.source.replace("#","")),e=t.source.replace("?"+t.query,"")},traverse:function(e,t){var r,o,i,a="object"==typeof e,s=[];if(a)if(e.constructor===Object)for(r in e)e.hasOwnProperty(r)&&s.push(r);else if(e.constructor===Array)for(i=0;i<e.length;++i)s.push(i);for(i=0;i<s.length;++i)r=s[i],o=e[r],a="object"==typeof o,a?null===o?e[r]=t(r,o):o.constructor===Object?e[r]=n.traverse(o,t):o.constructor===Array?e[r]=n.traverse(o,t):e[r]=t(r,o):e[r]=t(r,o);return e},redact:function(e){return e=String(e),new Array(e.length+1).join("*")},uuid4:function(){var e=(new Date).getTime(),t="xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,function(t){var r=(e+16*Math.random())%16|0;return e=Math.floor(e/16),("x"===t?r:7&r|8).toString(16)});return t}};e.exports=n},function(e,t,r){"use strict";function n(e){o=e}var o=null,i={XMLHttpFactories:[function(){return new XMLHttpRequest},function(){return new ActiveXObject("Msxml2.XMLHTTP")},function(){return new ActiveXObject("Msxml3.XMLHTTP")},function(){return new ActiveXObject("Microsoft.XMLHTTP")}],createXMLHTTPObject:function(){var e,t=!1,r=i.XMLHttpFactories,n=r.length;for(e=0;n>e;e++)try{t=r[e]();break}catch(o){}return t},post:function(e,t,r,n){if("object"!=typeof r)throw new Error("Expected an object to POST");r=o.stringify(r),n=n||function(){};var a=i.createXMLHTTPObject();if(a)try{try{var s=function(e){try{s&&4===a.readyState&&(s=void 0,200===a.status?n(null,o.parse(a.responseText)):n("number"==typeof a.status&&a.status>=400&&a.status<600?new Error(a.status.toString()):new Error))}catch(t){var r;r="object"==typeof t&&t.stack?t:new Error(t),n(r)}};a.open("POST",e,!0),a.setRequestHeader&&(a.setRequestHeader("Content-Type","application/json"),a.setRequestHeader("X-Rollbar-Access-Token",t)),a.onreadystatechange=s,a.send(r)}catch(u){if("undefined"!=typeof XDomainRequest){var c=function(e){n(new Error)},l=function(e){n(new Error)},p=function(e){n(null,o.parse(a.responseText))};a=new XDomainRequest,a.onprogress=function(){},a.ontimeout=c,a.onerror=l,a.onload=p,a.open("POST",e,!0),a.send(r)}}}catch(f){n(f)}}};e.exports={XHR:i,setupJSON:n}},function(e,t,r){var n,o,i;!function(a,s){"use strict";o=[r(9)],n=s,i="function"==typeof n?n.apply(t,o):n,!(void 0!==i&&(e.exports=i))}(this,function(e){"use strict";var t,r,n=/\S+\:\d+/,o=/\s+at /;return t=Array.prototype.map?function(e,t){return e.map(t)}:function(e,t){var r,n=e.length,o=[];for(r=0;n>r;++r)o.push(t(e[r]));return o},r=Array.prototype.filter?function(e,t){return e.filter(t)}:function(e,t){var r,n=e.length,o=[];for(r=0;n>r;++r)t(e[r])&&o.push(e[r]);return o},{parse:function(e){if("undefined"!=typeof e.stacktrace||"undefined"!=typeof e["opera#sourceloc"])return this.parseOpera(e);if(e.stack&&e.stack.match(o))return this.parseV8OrIE(e);if(e.stack&&e.stack.match(n))return this.parseFFOrSafari(e);throw new Error("Cannot parse given Error object")},extractLocation:function(e){if(-1===e.indexOf(":"))return[e];var t=e.replace(/[\(\)\s]/g,"").split(":"),r=t.pop(),n=t[t.length-1];if(!isNaN(parseFloat(n))&&isFinite(n)){var o=t.pop();return[t.join(":"),o,r]}return[t.join(":"),r,void 0]},parseV8OrIE:function(r){var n=this.extractLocation,o=t(r.stack.split("\n").slice(1),function(t){var r=t.replace(/^\s+/,"").split(/\s+/).slice(1),o=n(r.pop()),i=r[0]&&"Anonymous"!==r[0]?r[0]:void 0;return new e(i,void 0,o[0],o[1],o[2])});return o},parseFFOrSafari:function(o){var i=r(o.stack.split("\n"),function(e){return!!e.match(n)}),a=this.extractLocation,s=t(i,function(t){var r=t.split("@"),n=a(r.pop()),o=r.shift()||void 0;return new e(o,void 0,n[0],n[1],n[2])});return s},parseOpera:function(e){return!e.stacktrace||e.message.indexOf("\n")>-1&&e.message.split("\n").length>e.stacktrace.split("\n").length?this.parseOpera9(e):e.stack?this.parseOpera11(e):this.parseOpera10(e)},parseOpera9:function(t){for(var r=/Line (\d+).*script (?:in )?(\S+)/i,n=t.message.split("\n"),o=[],i=2,a=n.length;a>i;i+=2){var s=r.exec(n[i]);s&&o.push(new e(void 0,void 0,s[2],s[1]))}return o},parseOpera10:function(t){for(var r=/Line (\d+).*script (?:in )?(\S+)(?:: In function (\S+))?$/i,n=t.stacktrace.split("\n"),o=[],i=0,a=n.length;a>i;i+=2){var s=r.exec(n[i]);s&&o.push(new e(s[3]||void 0,void 0,s[2],s[1]))}return o},parseOpera11:function(o){var i=r(o.stack.split("\n"),function(e){return!!e.match(n)&&!e.match(/^Error created at/)}),a=this.extractLocation,s=t(i,function(t){var r,n=t.split("@"),o=a(n.pop()),i=n.shift()||"",s=i.replace(/<anonymous function(: (\w+))?>/,"$2").replace(/\([^\)]*\)/g,"")||void 0;i.match(/\(([^\)]*)\)/)&&(r=i.replace(/^[^\(]+\(([^\)]*)\)$/,"$1"));var u=void 0===r||"[arguments not available]"===r?void 0:r.split(",");return new e(s,u,o[0],o[1],o[2])});return s}}})},function(e,t,r){var n,o,i;!function(r,a){"use strict";o=[],n=a,i="function"==typeof n?n.apply(t,o):n,!(void 0!==i&&(e.exports=i))}(this,function(){"use strict";function e(e){return!isNaN(parseFloat(e))&&isFinite(e)}function t(e,t,r,n,o){void 0!==e&&this.setFunctionName(e),void 0!==t&&this.setArgs(t),void 0!==r&&this.setFileName(r),void 0!==n&&this.setLineNumber(n),void 0!==o&&this.setColumnNumber(o)}return t.prototype={getFunctionName:function(){return this.functionName},setFunctionName:function(e){this.functionName=String(e)},getArgs:function(){return this.args},setArgs:function(e){if("[object Array]"!==Object.prototype.toString.call(e))throw new TypeError("Args must be an Array");this.args=e},getFileName:function(){return this.fileName},setFileName:function(e){this.fileName=String(e)},getLineNumber:function(){return this.lineNumber},setLineNumber:function(t){if(!e(t))throw new TypeError("Line Number must be a Number");this.lineNumber=Number(t)},getColumnNumber:function(){return this.columnNumber},setColumnNumber:function(t){if(!e(t))throw new TypeError("Column Number must be a Number");this.columnNumber=Number(t)},toString:function(){var t=this.getFunctionName()||"{anonymous}",r="("+(this.getArgs()||[]).join(",")+")",n=this.getFileName()?"@"+this.getFileName():"",o=e(this.getLineNumber())?":"+this.getLineNumber():"",i=e(this.getColumnNumber())?":"+this.getColumnNumber():"";return t+r+n+o+i}},t})}])});
|
54
55
|
</script>
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: smoke_detector
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.1.
|
4
|
+
version: 1.1.7
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Chris Friedrich
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-08-
|
11
|
+
date: 2015-08-24 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rails
|
@@ -191,7 +191,6 @@ files:
|
|
191
191
|
- lib/smoke_detector/exceptions.rb
|
192
192
|
- lib/smoke_detector/middleware/javascript_monitors.rb
|
193
193
|
- lib/smoke_detector/providers/airbrake.rb
|
194
|
-
- lib/smoke_detector/providers/js/rollbar.js
|
195
194
|
- lib/smoke_detector/providers/provider.rb
|
196
195
|
- lib/smoke_detector/providers/rollbar.rb
|
197
196
|
- lib/smoke_detector/providers.rb
|
@@ -219,7 +218,6 @@ files:
|
|
219
218
|
- spec/dummy/config/initializers/backtrace_silencers.rb
|
220
219
|
- spec/dummy/config/initializers/inflections.rb
|
221
220
|
- spec/dummy/config/initializers/mime_types.rb
|
222
|
-
- spec/dummy/config/initializers/rollbar.rb
|
223
221
|
- spec/dummy/config/initializers/secret_token.rb
|
224
222
|
- spec/dummy/config/initializers/session_store.rb
|
225
223
|
- spec/dummy/config/initializers/smoke_detector.rb
|
@@ -228,9 +226,6 @@ files:
|
|
228
226
|
- spec/dummy/config/routes.rb
|
229
227
|
- spec/dummy/config.ru
|
230
228
|
- spec/dummy/db/schema.rb
|
231
|
-
- spec/dummy/db/test.sqlite3
|
232
|
-
- spec/dummy/log/development.log
|
233
|
-
- spec/dummy/log/test.log
|
234
229
|
- spec/dummy/public/404.html
|
235
230
|
- spec/dummy/public/422.html
|
236
231
|
- spec/dummy/public/500.html
|
@@ -238,31 +233,6 @@ files:
|
|
238
233
|
- spec/dummy/Rakefile
|
239
234
|
- spec/dummy/README.rdoc
|
240
235
|
- spec/dummy/script/rails
|
241
|
-
- spec/dummy/tmp/cache/assets/test/sprockets/v3.0/-x18hqI9UW005FhNgtUabDb_BX9T417ldrWDmDWNPX8.cache
|
242
|
-
- spec/dummy/tmp/cache/assets/test/sprockets/v3.0/05tGgfvaIZB2WhxiwJDDsK1qSSp8q5z2w0oizhbu63g.cache
|
243
|
-
- spec/dummy/tmp/cache/assets/test/sprockets/v3.0/2P9IKzmeq2XFDLIYjg2LNFyWtCBLF-ln0JiHUCrbW0c.cache
|
244
|
-
- spec/dummy/tmp/cache/assets/test/sprockets/v3.0/3gSuQ9W4PxO4smIQPaFSvUPwbTje0ytOAk_48728k8Y.cache
|
245
|
-
- spec/dummy/tmp/cache/assets/test/sprockets/v3.0/4PHfvRiCq9kVrQqfDNAGhcaBoauNSBACR3-CAhb4GdE.cache
|
246
|
-
- spec/dummy/tmp/cache/assets/test/sprockets/v3.0/538rWEA_3I2ZHauSM8pcOJP_kWuj6FSnitAiiJbiPN0.cache
|
247
|
-
- spec/dummy/tmp/cache/assets/test/sprockets/v3.0/7o1iNT7bl-ROe5-bYVQCS28fllTA5i6Z0iyjdFvIPIg.cache
|
248
|
-
- spec/dummy/tmp/cache/assets/test/sprockets/v3.0/9SY9VqlZtb0EDo8-J83s1Qiq7pTRujc3n2WkrHriGuM.cache
|
249
|
-
- spec/dummy/tmp/cache/assets/test/sprockets/v3.0/awMEDS383IkYHC7JTIqI6sXg7kzzZv2sQHwjulX0HUs.cache
|
250
|
-
- spec/dummy/tmp/cache/assets/test/sprockets/v3.0/Dz7ku8U7vd16P6NMo09ywNulRPottH7H_s-hegc2gus.cache
|
251
|
-
- spec/dummy/tmp/cache/assets/test/sprockets/v3.0/GvpVw77ArWRTSddCmX65HDkzmlE290UZLiRcyQEuSBM.cache
|
252
|
-
- spec/dummy/tmp/cache/assets/test/sprockets/v3.0/Il1yRkc2D9nqrvnlyJyxvRsqpXTMXR5OVueD15805GA.cache
|
253
|
-
- spec/dummy/tmp/cache/assets/test/sprockets/v3.0/J_G_CP7Cl7finRnUkPE3NoWigAsaYpkc0Be7CEYGFjs.cache
|
254
|
-
- spec/dummy/tmp/cache/assets/test/sprockets/v3.0/NbHl6A1212F35_idivtDkIfodWqvEXmqF2xIc5JPMx0.cache
|
255
|
-
- spec/dummy/tmp/cache/assets/test/sprockets/v3.0/O_DOE8ZL1tv6KAmcCD3FcQSefNad6Tvw2hAB-WAYxyE.cache
|
256
|
-
- spec/dummy/tmp/cache/assets/test/sprockets/v3.0/Pz8e-g6mv0m0X3uFkpVwjOTGZEjibszt85vhL5SJdNg.cache
|
257
|
-
- spec/dummy/tmp/cache/assets/test/sprockets/v3.0/q6b8zxMi44GVQTl-GJRWpogdyUFouWI8u09uhqHktSw.cache
|
258
|
-
- spec/dummy/tmp/cache/assets/test/sprockets/v3.0/qO4DbjTAlq45h5i51BWY4m2LXiwxyc9fqhOKcupr4uU.cache
|
259
|
-
- spec/dummy/tmp/cache/assets/test/sprockets/v3.0/scElb_WiPaZv7rRpGIgZyVh9vDRRojRi_OGL3S2jnHk.cache
|
260
|
-
- spec/dummy/tmp/cache/assets/test/sprockets/v3.0/sJf6s34rz4gdJxfsPCjHDaRkRGCYAp0EujRjwsRI8w0.cache
|
261
|
-
- spec/dummy/tmp/cache/assets/test/sprockets/v3.0/SJkrF8Ralh_HhbmvfAKbq_Td3J8UflhAnpsNhon52kE.cache
|
262
|
-
- spec/dummy/tmp/cache/assets/test/sprockets/v3.0/T3VbPBrfBG_M2mtqVvjyaZMp4LETT3VvuvKxp1U56Cc.cache
|
263
|
-
- spec/dummy/tmp/cache/assets/test/sprockets/v3.0/xMXJ3vour8ycAz_YitjWxbg7iWE5yqDS7ExE6YmICsE.cache
|
264
|
-
- spec/dummy/tmp/cache/assets/test/sprockets/v3.0/Yt2RZ834NN6kGkm4udDJ-Wtnx2-_14ujv8hQX_OZmOc.cache
|
265
|
-
- spec/dummy/tmp/cache/assets/test/sprockets/v3.0/ZO-3opaC2Gt8QYT5nm1mzL2Jwf4zs_9gVMegU6WWfUY.cache
|
266
236
|
- spec/models/providers/airbrake_spec.rb
|
267
237
|
- spec/models/providers/provider_spec.rb
|
268
238
|
- spec/models/providers/rollbar_spec.rb
|
@@ -317,7 +287,6 @@ test_files:
|
|
317
287
|
- spec/dummy/config/initializers/backtrace_silencers.rb
|
318
288
|
- spec/dummy/config/initializers/inflections.rb
|
319
289
|
- spec/dummy/config/initializers/mime_types.rb
|
320
|
-
- spec/dummy/config/initializers/rollbar.rb
|
321
290
|
- spec/dummy/config/initializers/secret_token.rb
|
322
291
|
- spec/dummy/config/initializers/session_store.rb
|
323
292
|
- spec/dummy/config/initializers/smoke_detector.rb
|
@@ -326,9 +295,6 @@ test_files:
|
|
326
295
|
- spec/dummy/config/routes.rb
|
327
296
|
- spec/dummy/config.ru
|
328
297
|
- spec/dummy/db/schema.rb
|
329
|
-
- spec/dummy/db/test.sqlite3
|
330
|
-
- spec/dummy/log/development.log
|
331
|
-
- spec/dummy/log/test.log
|
332
298
|
- spec/dummy/public/404.html
|
333
299
|
- spec/dummy/public/422.html
|
334
300
|
- spec/dummy/public/500.html
|
@@ -336,31 +302,6 @@ test_files:
|
|
336
302
|
- spec/dummy/Rakefile
|
337
303
|
- spec/dummy/README.rdoc
|
338
304
|
- spec/dummy/script/rails
|
339
|
-
- spec/dummy/tmp/cache/assets/test/sprockets/v3.0/-x18hqI9UW005FhNgtUabDb_BX9T417ldrWDmDWNPX8.cache
|
340
|
-
- spec/dummy/tmp/cache/assets/test/sprockets/v3.0/05tGgfvaIZB2WhxiwJDDsK1qSSp8q5z2w0oizhbu63g.cache
|
341
|
-
- spec/dummy/tmp/cache/assets/test/sprockets/v3.0/2P9IKzmeq2XFDLIYjg2LNFyWtCBLF-ln0JiHUCrbW0c.cache
|
342
|
-
- spec/dummy/tmp/cache/assets/test/sprockets/v3.0/3gSuQ9W4PxO4smIQPaFSvUPwbTje0ytOAk_48728k8Y.cache
|
343
|
-
- spec/dummy/tmp/cache/assets/test/sprockets/v3.0/4PHfvRiCq9kVrQqfDNAGhcaBoauNSBACR3-CAhb4GdE.cache
|
344
|
-
- spec/dummy/tmp/cache/assets/test/sprockets/v3.0/538rWEA_3I2ZHauSM8pcOJP_kWuj6FSnitAiiJbiPN0.cache
|
345
|
-
- spec/dummy/tmp/cache/assets/test/sprockets/v3.0/7o1iNT7bl-ROe5-bYVQCS28fllTA5i6Z0iyjdFvIPIg.cache
|
346
|
-
- spec/dummy/tmp/cache/assets/test/sprockets/v3.0/9SY9VqlZtb0EDo8-J83s1Qiq7pTRujc3n2WkrHriGuM.cache
|
347
|
-
- spec/dummy/tmp/cache/assets/test/sprockets/v3.0/awMEDS383IkYHC7JTIqI6sXg7kzzZv2sQHwjulX0HUs.cache
|
348
|
-
- spec/dummy/tmp/cache/assets/test/sprockets/v3.0/Dz7ku8U7vd16P6NMo09ywNulRPottH7H_s-hegc2gus.cache
|
349
|
-
- spec/dummy/tmp/cache/assets/test/sprockets/v3.0/GvpVw77ArWRTSddCmX65HDkzmlE290UZLiRcyQEuSBM.cache
|
350
|
-
- spec/dummy/tmp/cache/assets/test/sprockets/v3.0/Il1yRkc2D9nqrvnlyJyxvRsqpXTMXR5OVueD15805GA.cache
|
351
|
-
- spec/dummy/tmp/cache/assets/test/sprockets/v3.0/J_G_CP7Cl7finRnUkPE3NoWigAsaYpkc0Be7CEYGFjs.cache
|
352
|
-
- spec/dummy/tmp/cache/assets/test/sprockets/v3.0/NbHl6A1212F35_idivtDkIfodWqvEXmqF2xIc5JPMx0.cache
|
353
|
-
- spec/dummy/tmp/cache/assets/test/sprockets/v3.0/O_DOE8ZL1tv6KAmcCD3FcQSefNad6Tvw2hAB-WAYxyE.cache
|
354
|
-
- spec/dummy/tmp/cache/assets/test/sprockets/v3.0/Pz8e-g6mv0m0X3uFkpVwjOTGZEjibszt85vhL5SJdNg.cache
|
355
|
-
- spec/dummy/tmp/cache/assets/test/sprockets/v3.0/q6b8zxMi44GVQTl-GJRWpogdyUFouWI8u09uhqHktSw.cache
|
356
|
-
- spec/dummy/tmp/cache/assets/test/sprockets/v3.0/qO4DbjTAlq45h5i51BWY4m2LXiwxyc9fqhOKcupr4uU.cache
|
357
|
-
- spec/dummy/tmp/cache/assets/test/sprockets/v3.0/scElb_WiPaZv7rRpGIgZyVh9vDRRojRi_OGL3S2jnHk.cache
|
358
|
-
- spec/dummy/tmp/cache/assets/test/sprockets/v3.0/sJf6s34rz4gdJxfsPCjHDaRkRGCYAp0EujRjwsRI8w0.cache
|
359
|
-
- spec/dummy/tmp/cache/assets/test/sprockets/v3.0/SJkrF8Ralh_HhbmvfAKbq_Td3J8UflhAnpsNhon52kE.cache
|
360
|
-
- spec/dummy/tmp/cache/assets/test/sprockets/v3.0/T3VbPBrfBG_M2mtqVvjyaZMp4LETT3VvuvKxp1U56Cc.cache
|
361
|
-
- spec/dummy/tmp/cache/assets/test/sprockets/v3.0/xMXJ3vour8ycAz_YitjWxbg7iWE5yqDS7ExE6YmICsE.cache
|
362
|
-
- spec/dummy/tmp/cache/assets/test/sprockets/v3.0/Yt2RZ834NN6kGkm4udDJ-Wtnx2-_14ujv8hQX_OZmOc.cache
|
363
|
-
- spec/dummy/tmp/cache/assets/test/sprockets/v3.0/ZO-3opaC2Gt8QYT5nm1mzL2Jwf4zs_9gVMegU6WWfUY.cache
|
364
305
|
- spec/models/providers/airbrake_spec.rb
|
365
306
|
- spec/models/providers/provider_spec.rb
|
366
307
|
- spec/models/providers/rollbar_spec.rb
|
@@ -1,2343 +0,0 @@
|
|
1
|
-
(function webpackUniversalModuleDefinition(root, factory) {
|
2
|
-
if(typeof exports === 'object' && typeof module === 'object')
|
3
|
-
module.exports = factory();
|
4
|
-
else if(typeof define === 'function' && define.amd)
|
5
|
-
define(factory);
|
6
|
-
else {
|
7
|
-
var a = factory();
|
8
|
-
for(var i in a) (typeof exports === 'object' ? exports : root)[i] = a[i];
|
9
|
-
}
|
10
|
-
})(this, function() {
|
11
|
-
return /******/ (function(modules) { // webpackBootstrap
|
12
|
-
/******/ // The module cache
|
13
|
-
/******/ var installedModules = {};
|
14
|
-
/******/
|
15
|
-
/******/ // The require function
|
16
|
-
/******/ function __webpack_require__(moduleId) {
|
17
|
-
/******/
|
18
|
-
/******/ // Check if module is in cache
|
19
|
-
/******/ if(installedModules[moduleId])
|
20
|
-
/******/ return installedModules[moduleId].exports;
|
21
|
-
/******/
|
22
|
-
/******/ // Create a new module (and put it into the cache)
|
23
|
-
/******/ var module = installedModules[moduleId] = {
|
24
|
-
/******/ exports: {},
|
25
|
-
/******/ id: moduleId,
|
26
|
-
/******/ loaded: false
|
27
|
-
/******/ };
|
28
|
-
/******/
|
29
|
-
/******/ // Execute the module function
|
30
|
-
/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
|
31
|
-
/******/
|
32
|
-
/******/ // Flag the module as loaded
|
33
|
-
/******/ module.loaded = true;
|
34
|
-
/******/
|
35
|
-
/******/ // Return the exports of the module
|
36
|
-
/******/ return module.exports;
|
37
|
-
/******/ }
|
38
|
-
/******/
|
39
|
-
/******/
|
40
|
-
/******/ // expose the modules object (__webpack_modules__)
|
41
|
-
/******/ __webpack_require__.m = modules;
|
42
|
-
/******/
|
43
|
-
/******/ // expose the module cache
|
44
|
-
/******/ __webpack_require__.c = installedModules;
|
45
|
-
/******/
|
46
|
-
/******/ // __webpack_public_path__
|
47
|
-
/******/ __webpack_require__.p = "";
|
48
|
-
/******/
|
49
|
-
/******/ // Load entry module and return exports
|
50
|
-
/******/ return __webpack_require__(0);
|
51
|
-
/******/ })
|
52
|
-
/************************************************************************/
|
53
|
-
/******/ ([
|
54
|
-
/* 0 */
|
55
|
-
/***/ function(module, exports, __webpack_require__) {
|
56
|
-
|
57
|
-
module.exports = __webpack_require__(1);
|
58
|
-
|
59
|
-
|
60
|
-
/***/ },
|
61
|
-
/* 1 */
|
62
|
-
/***/ function(module, exports, __webpack_require__) {
|
63
|
-
|
64
|
-
/* globals __USE_JSON__ */
|
65
|
-
/* globals JSON */
|
66
|
-
|
67
|
-
"use strict";
|
68
|
-
|
69
|
-
var globalnotifier = __webpack_require__(2);
|
70
|
-
var notifier = __webpack_require__(3);
|
71
|
-
|
72
|
-
function setupJSON() {
|
73
|
-
var JSONObject = typeof JSON === 'undefined' ? {} : JSON;
|
74
|
-
|
75
|
-
if (true) {
|
76
|
-
// This adds the script to this context. We need it since this library
|
77
|
-
// is not a CommonJs or AMD module.
|
78
|
-
var setupCustomJSON = __webpack_require__(4);
|
79
|
-
|
80
|
-
var customJSON = {};
|
81
|
-
setupCustomJSON(customJSON);
|
82
|
-
|
83
|
-
JSONObject = customJSON;
|
84
|
-
}
|
85
|
-
|
86
|
-
globalnotifier.setupJSON(JSONObject);
|
87
|
-
}
|
88
|
-
|
89
|
-
setupJSON();
|
90
|
-
|
91
|
-
var config = window._rollbarConfig;
|
92
|
-
var alias = config && config.globalAlias || 'Rollbar';
|
93
|
-
var shimRunning = window[alias] && typeof window[alias].shimId !== 'undefined';
|
94
|
-
|
95
|
-
/* We must not initialize the full notifier here if the
|
96
|
-
* shim is loaded, snippet_callback will do that for us
|
97
|
-
*/
|
98
|
-
if (!shimRunning && config) {
|
99
|
-
globalnotifier.wrapper.init(config);
|
100
|
-
} else {
|
101
|
-
window.Rollbar = globalnotifier.wrapper;
|
102
|
-
// We need to expose Notifier for the snippet
|
103
|
-
window.RollbarNotifier = notifier.Notifier;
|
104
|
-
}
|
105
|
-
|
106
|
-
module.exports = globalnotifier.wrapper;
|
107
|
-
|
108
|
-
|
109
|
-
/***/ },
|
110
|
-
/* 2 */
|
111
|
-
/***/ function(module, exports, __webpack_require__) {
|
112
|
-
|
113
|
-
"use strict";
|
114
|
-
|
115
|
-
var notifier = __webpack_require__(3);
|
116
|
-
|
117
|
-
var Notifier = notifier.Notifier;
|
118
|
-
// Stub out the wrapped error which is set
|
119
|
-
window._rollbarWrappedError = null;
|
120
|
-
|
121
|
-
function setupJSON(JSON) {
|
122
|
-
notifier.setupJSON(JSON);
|
123
|
-
}
|
124
|
-
|
125
|
-
// Global window.onerror handler
|
126
|
-
function _rollbarWindowOnError(client, old, args) {
|
127
|
-
if (!args[4] && window._rollbarWrappedError) {
|
128
|
-
args[4] = window._rollbarWrappedError;
|
129
|
-
window._rollbarWrappedError = null;
|
130
|
-
}
|
131
|
-
|
132
|
-
client.uncaughtError.apply(client, args);
|
133
|
-
if (old) {
|
134
|
-
old.apply(window, args);
|
135
|
-
}
|
136
|
-
}
|
137
|
-
|
138
|
-
function _extendListenerPrototype(client, prototype) {
|
139
|
-
if (prototype.hasOwnProperty && prototype.hasOwnProperty('addEventListener')) {
|
140
|
-
var oldAddEventListener = prototype.addEventListener;
|
141
|
-
prototype.addEventListener = function(event, callback, bubble) {
|
142
|
-
oldAddEventListener.call(this, event, client.wrap(callback), bubble);
|
143
|
-
};
|
144
|
-
|
145
|
-
var oldRemoveEventListener = prototype.removeEventListener;
|
146
|
-
prototype.removeEventListener = function(event, callback, bubble) {
|
147
|
-
oldRemoveEventListener.call(this, event, callback && callback._wrapped || callback, bubble);
|
148
|
-
};
|
149
|
-
}
|
150
|
-
}
|
151
|
-
|
152
|
-
// Add an init() method to do the same things that the shim would do
|
153
|
-
var wrapper = {};
|
154
|
-
wrapper.init = function(config, parent) {
|
155
|
-
var notifier = new Notifier(parent);
|
156
|
-
notifier.configure(config);
|
157
|
-
|
158
|
-
if (config.captureUncaught) {
|
159
|
-
// Set the global onerror handler
|
160
|
-
var old = window.onerror;
|
161
|
-
|
162
|
-
window.onerror = function() {
|
163
|
-
var args = Array.prototype.slice.call(arguments, 0);
|
164
|
-
_rollbarWindowOnError(notifier, old, args);
|
165
|
-
};
|
166
|
-
|
167
|
-
// Adapted from https://github.com/bugsnag/bugsnag-js
|
168
|
-
var globals = ['EventTarget', 'Window', 'Node', 'ApplicationCache', 'AudioTrackList', 'ChannelMergerNode', 'CryptoOperation', 'EventSource',
|
169
|
-
'FileReader', 'HTMLUnknownElement', 'IDBDatabase', 'IDBRequest', 'IDBTransaction', 'KeyOperation', 'MediaController',
|
170
|
-
'MessagePort', 'ModalWindow', 'Notification', 'SVGElementInstance', 'Screen', 'TextTrack', 'TextTrackCue',
|
171
|
-
'TextTrackList', 'WebSocket', 'WebSocketWorker', 'Worker', 'XMLHttpRequest', 'XMLHttpRequestEventTarget',
|
172
|
-
'XMLHttpRequestUpload'];
|
173
|
-
|
174
|
-
var i;
|
175
|
-
var global;
|
176
|
-
for (i = 0; i < globals.length; ++i) {
|
177
|
-
global = globals[i];
|
178
|
-
|
179
|
-
if (window[global] && window[global].prototype) {
|
180
|
-
_extendListenerPrototype(notifier, window[global].prototype);
|
181
|
-
}
|
182
|
-
}
|
183
|
-
}
|
184
|
-
|
185
|
-
window.Rollbar = notifier;
|
186
|
-
// Finally, start processing payloads using the global notifier
|
187
|
-
Notifier.processPayloads();
|
188
|
-
return notifier;
|
189
|
-
};
|
190
|
-
|
191
|
-
|
192
|
-
module.exports = {
|
193
|
-
wrapper: wrapper,
|
194
|
-
setupJSON: setupJSON
|
195
|
-
};
|
196
|
-
|
197
|
-
|
198
|
-
/***/ },
|
199
|
-
/* 3 */
|
200
|
-
/***/ function(module, exports, __webpack_require__) {
|
201
|
-
|
202
|
-
/* globals __NOTIFIER_VERSION__ */
|
203
|
-
/* globals __DEFAULT_ENDPOINT__ */
|
204
|
-
/* globals __DEFAULT_SCRUB_FIELDS__ */
|
205
|
-
/* globals __DEFAULT_LOG_LEVEL__ */
|
206
|
-
/* globals __DEFAULT_REPORT_LEVEL__ */
|
207
|
-
/* globals __DEFAULT_UNCAUGHT_ERROR_LEVEL */
|
208
|
-
/* globals __DEFAULT_ITEMS_PER_MIN__ */
|
209
|
-
/* globals __DEFAULT_MAX_ITEMS__ */
|
210
|
-
/* globals DOMException */
|
211
|
-
|
212
|
-
"use strict";
|
213
|
-
|
214
|
-
var error_parser = __webpack_require__(5);
|
215
|
-
var Util = __webpack_require__(6);
|
216
|
-
var xhr = __webpack_require__(7);
|
217
|
-
|
218
|
-
var XHR = xhr.XHR;
|
219
|
-
var RollbarJSON = null;
|
220
|
-
|
221
|
-
function setupJSON(JSON) {
|
222
|
-
RollbarJSON = JSON;
|
223
|
-
xhr.setupJSON(JSON);
|
224
|
-
}
|
225
|
-
|
226
|
-
// Updated by the build process to match package.json
|
227
|
-
Notifier.NOTIFIER_VERSION = ("1.3.0");
|
228
|
-
Notifier.DEFAULT_ENDPOINT = ("api.rollbar.com/api/1/");
|
229
|
-
Notifier.DEFAULT_SCRUB_FIELDS = (["pw","pass","passwd","password","secret","confirm_password","confirmPassword","password_confirmation","passwordConfirmation","access_token","accessToken","secret_key","secretKey","secretToken"]);
|
230
|
-
Notifier.DEFAULT_LOG_LEVEL = ("debug");
|
231
|
-
Notifier.DEFAULT_REPORT_LEVEL = ("debug");
|
232
|
-
Notifier.DEFAULT_UNCAUGHT_ERROR_LEVEL = ("warning");
|
233
|
-
Notifier.DEFAULT_ITEMS_PER_MIN = (60);
|
234
|
-
Notifier.DEFAULT_MAX_ITEMS = (0);
|
235
|
-
|
236
|
-
Notifier.LEVELS = {
|
237
|
-
debug: 0,
|
238
|
-
info: 1,
|
239
|
-
warning: 2,
|
240
|
-
error: 3,
|
241
|
-
critical: 4
|
242
|
-
};
|
243
|
-
|
244
|
-
// This is the global queue where all notifiers will put their
|
245
|
-
// payloads to be sent to Rollbar.
|
246
|
-
window._rollbarPayloadQueue = [];
|
247
|
-
|
248
|
-
// This contains global options for all Rollbar notifiers.
|
249
|
-
window._globalRollbarOptions = {
|
250
|
-
startTime: (new Date()).getTime(),
|
251
|
-
maxItems: Notifier.DEFAULT_MAX_ITEMS,
|
252
|
-
itemsPerMinute: Notifier.DEFAULT_ITEMS_PER_MIN
|
253
|
-
};
|
254
|
-
|
255
|
-
var _topLevelNotifier;
|
256
|
-
|
257
|
-
function topLevelNotifier() {
|
258
|
-
return _topLevelNotifier;
|
259
|
-
}
|
260
|
-
|
261
|
-
function Notifier(parentNotifier) {
|
262
|
-
// Save the first notifier so we can use it to send system messages like
|
263
|
-
// when the rate limit is reached.
|
264
|
-
_topLevelNotifier = _topLevelNotifier || this;
|
265
|
-
|
266
|
-
var protocol = window.location.protocol;
|
267
|
-
if (protocol.indexOf('http') !== 0) {
|
268
|
-
protocol = 'https:';
|
269
|
-
}
|
270
|
-
var endpoint = protocol + '//' + Notifier.DEFAULT_ENDPOINT;
|
271
|
-
this.options = {
|
272
|
-
enabled: true,
|
273
|
-
endpoint: endpoint,
|
274
|
-
environment: 'production',
|
275
|
-
scrubFields: Util.copy(Notifier.DEFAULT_SCRUB_FIELDS),
|
276
|
-
checkIgnore: null,
|
277
|
-
logLevel: Notifier.DEFAULT_LOG_LEVEL,
|
278
|
-
reportLevel: Notifier.DEFAULT_REPORT_LEVEL,
|
279
|
-
uncaughtErrorLevel: Notifier.DEFAULT_UNCAUGHT_ERROR_LEVEL,
|
280
|
-
payload: {}
|
281
|
-
};
|
282
|
-
|
283
|
-
this.lastError = null;
|
284
|
-
this.plugins = {};
|
285
|
-
this.parentNotifier = parentNotifier;
|
286
|
-
this.logger = function() {
|
287
|
-
if (window.console && typeof window.console.log === 'function') {
|
288
|
-
var args = ['Rollbar:'].concat(Array.prototype.slice.call(arguments, 0));
|
289
|
-
window.console.log(args);
|
290
|
-
}
|
291
|
-
};
|
292
|
-
|
293
|
-
if (parentNotifier) {
|
294
|
-
// If the parent notifier has the shimId
|
295
|
-
// property it means that it's a Rollbar shim.
|
296
|
-
if (parentNotifier.hasOwnProperty('shimId')) {
|
297
|
-
// After we set this, the shim is just a proxy to this
|
298
|
-
// Notifier instance.
|
299
|
-
parentNotifier.notifier = this;
|
300
|
-
} else {
|
301
|
-
this.logger = parentNotifier.logger;
|
302
|
-
this.configure(parentNotifier.options);
|
303
|
-
}
|
304
|
-
}
|
305
|
-
}
|
306
|
-
|
307
|
-
|
308
|
-
Notifier._generateLogFn = function(level) {
|
309
|
-
return _wrapNotifierFn(function _logFn() {
|
310
|
-
var args = this._getLogArgs(arguments);
|
311
|
-
|
312
|
-
return this._log(level || args.level || this.options.logLevel || Notifier.DEFAULT_LOG_LEVEL,
|
313
|
-
args.message, args.err, args.custom, args.callback);
|
314
|
-
});
|
315
|
-
};
|
316
|
-
|
317
|
-
|
318
|
-
/*
|
319
|
-
* Returns an Object with keys:
|
320
|
-
* {
|
321
|
-
* message: String,
|
322
|
-
* err: Error,
|
323
|
-
* custom: Object
|
324
|
-
* }
|
325
|
-
*/
|
326
|
-
Notifier.prototype._getLogArgs = function(args) {
|
327
|
-
var level = this.options.logLevel || Notifier.DEFAULT_LOG_LEVEL;
|
328
|
-
var ts;
|
329
|
-
var message;
|
330
|
-
var err;
|
331
|
-
var custom;
|
332
|
-
var callback;
|
333
|
-
|
334
|
-
var argT;
|
335
|
-
var arg;
|
336
|
-
for (var i = 0; i < args.length; ++i) {
|
337
|
-
arg = args[i];
|
338
|
-
argT = typeof arg;
|
339
|
-
if (argT === 'string') {
|
340
|
-
message = arg;
|
341
|
-
} else if (argT === 'function') {
|
342
|
-
callback = _wrapNotifierFn(arg, this); // wrap the callback in a try/catch block
|
343
|
-
} else if (arg && argT === 'object') {
|
344
|
-
if (arg.constructor.name === 'Date') {
|
345
|
-
ts = arg;
|
346
|
-
} else if (arg instanceof Error ||
|
347
|
-
arg.prototype === Error.prototype ||
|
348
|
-
arg.hasOwnProperty('stack') ||
|
349
|
-
(typeof DOMException !== "undefined" && arg instanceof DOMException)) {
|
350
|
-
err = arg;
|
351
|
-
} else {
|
352
|
-
custom = arg;
|
353
|
-
}
|
354
|
-
}
|
355
|
-
}
|
356
|
-
|
357
|
-
// TODO(cory): somehow pass in timestamp too...
|
358
|
-
|
359
|
-
return {
|
360
|
-
level: level,
|
361
|
-
message: message,
|
362
|
-
err: err,
|
363
|
-
custom: custom,
|
364
|
-
callback: callback
|
365
|
-
};
|
366
|
-
};
|
367
|
-
|
368
|
-
|
369
|
-
Notifier.prototype._route = function(path) {
|
370
|
-
var endpoint = this.options.endpoint;
|
371
|
-
|
372
|
-
var endpointTrailingSlash = /\/$/.test(endpoint);
|
373
|
-
var pathBeginningSlash = /^\//.test(path);
|
374
|
-
|
375
|
-
if (endpointTrailingSlash && pathBeginningSlash) {
|
376
|
-
path = path.substring(1);
|
377
|
-
} else if (!endpointTrailingSlash && !pathBeginningSlash) {
|
378
|
-
path = '/' + path;
|
379
|
-
}
|
380
|
-
|
381
|
-
return endpoint + path;
|
382
|
-
};
|
383
|
-
|
384
|
-
|
385
|
-
/*
|
386
|
-
* Given a queue containing each call to the shim, call the
|
387
|
-
* corresponding method on this instance.
|
388
|
-
*
|
389
|
-
* shim queue contains:
|
390
|
-
*
|
391
|
-
* {shim: Rollbar, method: 'info', args: ['hello world', exc], ts: Date}
|
392
|
-
*/
|
393
|
-
Notifier.prototype._processShimQueue = function(shimQueue) {
|
394
|
-
// implement me
|
395
|
-
var shim;
|
396
|
-
var obj;
|
397
|
-
var tmp;
|
398
|
-
var method;
|
399
|
-
var args;
|
400
|
-
var shimToNotifier = {};
|
401
|
-
var parentShim;
|
402
|
-
var parentNotifier;
|
403
|
-
var notifier;
|
404
|
-
|
405
|
-
// For each of the messages in the shimQueue we need to:
|
406
|
-
// 1. get/create the notifier for that shim
|
407
|
-
// 2. apply the message to the notifier
|
408
|
-
while ((obj = shimQueue.shift())) {
|
409
|
-
shim = obj.shim;
|
410
|
-
method = obj.method;
|
411
|
-
args = obj.args;
|
412
|
-
parentShim = shim.parentShim;
|
413
|
-
|
414
|
-
// Get the current notifier based on the shimId
|
415
|
-
notifier = shimToNotifier[shim.shimId];
|
416
|
-
if (!notifier) {
|
417
|
-
|
418
|
-
// If there is no notifier associated with the shimId
|
419
|
-
// Check to see if there's a parent shim
|
420
|
-
if (parentShim) {
|
421
|
-
|
422
|
-
// If there is a parent shim, get the parent notifier
|
423
|
-
// and create a new notifier for the current shim.
|
424
|
-
parentNotifier = shimToNotifier[parentShim.shimId];
|
425
|
-
|
426
|
-
// Create a new Notifier which will process all of the shim's
|
427
|
-
// messages
|
428
|
-
notifier = new Notifier(parentNotifier);
|
429
|
-
} else {
|
430
|
-
// If there is no parent, assume the shim is the top
|
431
|
-
// level shim and thus, should use this as the notifier.
|
432
|
-
notifier = this;
|
433
|
-
}
|
434
|
-
|
435
|
-
// Save off the shimId->notifier mapping
|
436
|
-
shimToNotifier[shim.shimId] = notifier;
|
437
|
-
}
|
438
|
-
|
439
|
-
if (notifier[method] && typeof notifier[method] === 'function') {
|
440
|
-
notifier[method].apply(notifier, args);
|
441
|
-
}
|
442
|
-
}
|
443
|
-
};
|
444
|
-
|
445
|
-
|
446
|
-
/*
|
447
|
-
* Builds and returns an Object that will be enqueued onto the
|
448
|
-
* window._rollbarPayloadQueue array to be sent to Rollbar.
|
449
|
-
*/
|
450
|
-
Notifier.prototype._buildPayload = function(ts, level, message, stackInfo, custom) {
|
451
|
-
var accessToken = this.options.accessToken;
|
452
|
-
|
453
|
-
// NOTE(cory): DEPRECATED
|
454
|
-
// Pass in {payload: {environment: 'production'}} instead of just {environment: 'production'}
|
455
|
-
var environment = this.options.environment;
|
456
|
-
|
457
|
-
var notifierOptions = Util.copy(this.options.payload);
|
458
|
-
var uuid = Util.uuid4();
|
459
|
-
|
460
|
-
if (Notifier.LEVELS[level] === undefined) {
|
461
|
-
throw new Error('Invalid level');
|
462
|
-
}
|
463
|
-
|
464
|
-
if (!message && !stackInfo && !custom) {
|
465
|
-
throw new Error('No message, stack info or custom data');
|
466
|
-
}
|
467
|
-
|
468
|
-
var payloadData = {
|
469
|
-
environment: environment,
|
470
|
-
endpoint: this.options.endpoint,
|
471
|
-
uuid: uuid,
|
472
|
-
level: level,
|
473
|
-
platform: 'browser',
|
474
|
-
framework: 'browser-js',
|
475
|
-
language: 'javascript',
|
476
|
-
body: this._buildBody(message, stackInfo, custom),
|
477
|
-
request: {
|
478
|
-
url: window.location.href,
|
479
|
-
query_string: window.location.search,
|
480
|
-
user_ip: "$remote_ip"
|
481
|
-
},
|
482
|
-
client: {
|
483
|
-
runtime_ms: ts.getTime() - window._globalRollbarOptions.startTime,
|
484
|
-
timestamp: Math.round(ts.getTime() / 1000),
|
485
|
-
javascript: {
|
486
|
-
browser: window.navigator.userAgent,
|
487
|
-
language: window.navigator.language,
|
488
|
-
cookie_enabled: window.navigator.cookieEnabled,
|
489
|
-
screen: {
|
490
|
-
width: window.screen.width,
|
491
|
-
height: window.screen.height
|
492
|
-
},
|
493
|
-
plugins: this._getBrowserPlugins()
|
494
|
-
}
|
495
|
-
},
|
496
|
-
server: {},
|
497
|
-
notifier: {
|
498
|
-
name: 'rollbar-browser-js',
|
499
|
-
version: Notifier.NOTIFIER_VERSION
|
500
|
-
}
|
501
|
-
};
|
502
|
-
|
503
|
-
if (notifierOptions.body) {
|
504
|
-
delete notifierOptions.body;
|
505
|
-
}
|
506
|
-
|
507
|
-
// Overwrite the options from configure() with the payload
|
508
|
-
// data.
|
509
|
-
var payload = {
|
510
|
-
access_token: accessToken,
|
511
|
-
data: Util.merge(payloadData, notifierOptions)
|
512
|
-
};
|
513
|
-
|
514
|
-
// Only scrub the data section since we never want to scrub "access_token"
|
515
|
-
// even if it's in the scrub fields
|
516
|
-
this._scrub(payload.data);
|
517
|
-
|
518
|
-
return payload;
|
519
|
-
};
|
520
|
-
|
521
|
-
|
522
|
-
Notifier.prototype._buildBody = function(message, stackInfo, custom) {
|
523
|
-
var body;
|
524
|
-
if (stackInfo) {
|
525
|
-
body = this._buildPayloadBodyTrace(message, stackInfo, custom);
|
526
|
-
} else {
|
527
|
-
body = this._buildPayloadBodyMessage(message, custom);
|
528
|
-
}
|
529
|
-
return body;
|
530
|
-
};
|
531
|
-
|
532
|
-
|
533
|
-
Notifier.prototype._buildPayloadBodyMessage = function(message, custom) {
|
534
|
-
if (!message) {
|
535
|
-
if (custom) {
|
536
|
-
message = RollbarJSON.stringify(custom);
|
537
|
-
} else {
|
538
|
-
message = '';
|
539
|
-
}
|
540
|
-
}
|
541
|
-
var result = {
|
542
|
-
body: message
|
543
|
-
};
|
544
|
-
|
545
|
-
if (custom) {
|
546
|
-
result.extra = Util.copy(custom);
|
547
|
-
}
|
548
|
-
|
549
|
-
return {
|
550
|
-
message: result
|
551
|
-
};
|
552
|
-
};
|
553
|
-
|
554
|
-
|
555
|
-
Notifier.prototype._buildPayloadBodyTrace = function(description, stackInfo, custom) {
|
556
|
-
var guess = _guessErrorClass(stackInfo.message);
|
557
|
-
var className = stackInfo.name || guess[0];
|
558
|
-
var message = guess[1];
|
559
|
-
var trace = {
|
560
|
-
exception: {
|
561
|
-
'class': className,
|
562
|
-
message: message
|
563
|
-
}
|
564
|
-
};
|
565
|
-
|
566
|
-
if (description) {
|
567
|
-
trace.exception.description = description || 'uncaught exception';
|
568
|
-
}
|
569
|
-
|
570
|
-
// Transform a TraceKit stackInfo object into a Rollbar trace
|
571
|
-
if (stackInfo.stack) {
|
572
|
-
var stackFrame;
|
573
|
-
var frame;
|
574
|
-
var code;
|
575
|
-
var pre;
|
576
|
-
var post;
|
577
|
-
var contextLength;
|
578
|
-
var i, j, mid;
|
579
|
-
|
580
|
-
trace.frames = [];
|
581
|
-
for (i = 0; i < stackInfo.stack.length; ++i) {
|
582
|
-
stackFrame = stackInfo.stack[i];
|
583
|
-
frame = {
|
584
|
-
filename: stackFrame.url ? Util.sanitizeUrl(stackFrame.url) : '(unknown)',
|
585
|
-
lineno: stackFrame.line || null,
|
586
|
-
method: (!stackFrame.func || stackFrame.func === '?') ? '[anonymous]' : stackFrame.func,
|
587
|
-
colno: stackFrame.column
|
588
|
-
};
|
589
|
-
|
590
|
-
code = pre = post = null;
|
591
|
-
contextLength = stackFrame.context ? stackFrame.context.length : 0;
|
592
|
-
if (contextLength) {
|
593
|
-
mid = Math.floor(contextLength / 2);
|
594
|
-
pre = stackFrame.context.slice(0, mid);
|
595
|
-
code = stackFrame.context[mid];
|
596
|
-
post = stackFrame.context.slice(mid);
|
597
|
-
}
|
598
|
-
|
599
|
-
if (code) {
|
600
|
-
frame.code = code;
|
601
|
-
}
|
602
|
-
|
603
|
-
if (pre || post) {
|
604
|
-
frame.context = {};
|
605
|
-
if (pre && pre.length) {
|
606
|
-
frame.context.pre = pre;
|
607
|
-
}
|
608
|
-
if (post && post.length) {
|
609
|
-
frame.context.post = post;
|
610
|
-
}
|
611
|
-
}
|
612
|
-
|
613
|
-
if (stackFrame.args) {
|
614
|
-
frame.args = stackFrame.args;
|
615
|
-
}
|
616
|
-
|
617
|
-
trace.frames.push(frame);
|
618
|
-
}
|
619
|
-
|
620
|
-
// NOTE(cory): reverse the frames since rollbar.com expects the most recent call last
|
621
|
-
trace.frames.reverse();
|
622
|
-
|
623
|
-
if (custom) {
|
624
|
-
trace.extra = Util.copy(custom);
|
625
|
-
}
|
626
|
-
return {trace: trace};
|
627
|
-
} else {
|
628
|
-
// no frames - not useful as a trace. just report as a message.
|
629
|
-
return this._buildPayloadBodyMessage(className + ': ' + message, custom);
|
630
|
-
}
|
631
|
-
};
|
632
|
-
|
633
|
-
|
634
|
-
Notifier.prototype._getBrowserPlugins = function() {
|
635
|
-
if (!this._browserPlugins) {
|
636
|
-
var navPlugins = window.navigator.plugins || [];
|
637
|
-
var cur;
|
638
|
-
var numPlugins = navPlugins.length;
|
639
|
-
var plugins = [];
|
640
|
-
var i;
|
641
|
-
for (i = 0; i < numPlugins; ++i) {
|
642
|
-
cur = navPlugins[i];
|
643
|
-
plugins.push({name: cur.name, description: cur.description});
|
644
|
-
}
|
645
|
-
this._browserPlugins = plugins;
|
646
|
-
}
|
647
|
-
return this._browserPlugins;
|
648
|
-
};
|
649
|
-
|
650
|
-
|
651
|
-
/*
|
652
|
-
* Does an in-place modification of obj such that:
|
653
|
-
* 1. All keys that match the notifier's options.scrubFields
|
654
|
-
* list will be normalized into all '*'
|
655
|
-
* 2. Any query string params that match the same criteria will have
|
656
|
-
* their values normalized as well.
|
657
|
-
*/
|
658
|
-
Notifier.prototype._scrub = function(obj) {
|
659
|
-
function redactQueryParam(match, paramPart, dummy1,
|
660
|
-
dummy2, dummy3, valPart, offset, string) {
|
661
|
-
return paramPart + Util.redact(valPart);
|
662
|
-
}
|
663
|
-
|
664
|
-
function paramScrubber(v) {
|
665
|
-
var i;
|
666
|
-
if (typeof v === 'string') {
|
667
|
-
for (i = 0; i < queryRes.length; ++i) {
|
668
|
-
v = v.replace(queryRes[i], redactQueryParam);
|
669
|
-
}
|
670
|
-
}
|
671
|
-
return v;
|
672
|
-
}
|
673
|
-
|
674
|
-
function valScrubber(k, v) {
|
675
|
-
var i;
|
676
|
-
for (i = 0; i < paramRes.length; ++i) {
|
677
|
-
if (paramRes[i].test(k)) {
|
678
|
-
v = Util.redact(v);
|
679
|
-
break;
|
680
|
-
}
|
681
|
-
}
|
682
|
-
return v;
|
683
|
-
}
|
684
|
-
|
685
|
-
function scrubber(k, v) {
|
686
|
-
var tmpV = valScrubber(k, v);
|
687
|
-
if (tmpV === v) {
|
688
|
-
return paramScrubber(tmpV);
|
689
|
-
} else {
|
690
|
-
return tmpV;
|
691
|
-
}
|
692
|
-
}
|
693
|
-
|
694
|
-
var scrubFields = this.options.scrubFields;
|
695
|
-
var paramRes = this._getScrubFieldRegexs(scrubFields);
|
696
|
-
var queryRes = this._getScrubQueryParamRegexs(scrubFields);
|
697
|
-
|
698
|
-
Util.traverse(obj, scrubber);
|
699
|
-
return obj;
|
700
|
-
};
|
701
|
-
|
702
|
-
|
703
|
-
Notifier.prototype._getScrubFieldRegexs = function(scrubFields) {
|
704
|
-
var ret = [];
|
705
|
-
var pat;
|
706
|
-
for (var i = 0; i < scrubFields.length; ++i) {
|
707
|
-
pat = '\\[?(%5[bB])?' + scrubFields[i] + '\\[?(%5[bB])?\\]?(%5[dD])?';
|
708
|
-
ret.push(new RegExp(pat, 'i'));
|
709
|
-
}
|
710
|
-
return ret;
|
711
|
-
};
|
712
|
-
|
713
|
-
|
714
|
-
Notifier.prototype._getScrubQueryParamRegexs = function(scrubFields) {
|
715
|
-
var ret = [];
|
716
|
-
var pat;
|
717
|
-
for (var i = 0; i < scrubFields.length; ++i) {
|
718
|
-
pat = '\\[?(%5[bB])?' + scrubFields[i] + '\\[?(%5[bB])?\\]?(%5[dD])?';
|
719
|
-
ret.push(new RegExp('(' + pat + '=)([^&\\n]+)', 'igm'));
|
720
|
-
}
|
721
|
-
return ret;
|
722
|
-
};
|
723
|
-
|
724
|
-
Notifier.prototype._urlIsWhitelisted = function(payload){
|
725
|
-
var whitelist, trace, frame, filename, frameLength, url, listLength, urlRegex;
|
726
|
-
var i, j;
|
727
|
-
|
728
|
-
try {
|
729
|
-
whitelist = this.options.hostWhiteList;
|
730
|
-
trace = payload.data.body.trace;
|
731
|
-
|
732
|
-
if (!whitelist || whitelist.length === 0) { return true; }
|
733
|
-
if (!trace) { return true; }
|
734
|
-
|
735
|
-
listLength = whitelist.length;
|
736
|
-
frameLength = trace.frames.length;
|
737
|
-
for (i = 0; i < frameLength; i++) {
|
738
|
-
frame = trace.frames[i];
|
739
|
-
filename = frame.filename;
|
740
|
-
if (typeof filename !== "string") { return true; }
|
741
|
-
for (j = 0; j < listLength; j++) {
|
742
|
-
url = whitelist[j];
|
743
|
-
urlRegex = new RegExp(url);
|
744
|
-
|
745
|
-
if (urlRegex.test(filename)){
|
746
|
-
return true;
|
747
|
-
}
|
748
|
-
}
|
749
|
-
}
|
750
|
-
} catch (e) {
|
751
|
-
this.configure({hostWhiteList: null});
|
752
|
-
this.error("Error while reading your configuration's hostWhiteList option. Removing custom hostWhiteList.", e);
|
753
|
-
return true;
|
754
|
-
}
|
755
|
-
|
756
|
-
return false;
|
757
|
-
};
|
758
|
-
|
759
|
-
Notifier.prototype._messageIsIgnored = function(payload){
|
760
|
-
var exceptionMessage, i, ignoredMessages, len, messageIsIgnored, rIgnoredMessage, trace;
|
761
|
-
try {
|
762
|
-
messageIsIgnored = false;
|
763
|
-
ignoredMessages = this.options.ignoredMessages;
|
764
|
-
trace = payload.data.body.trace;
|
765
|
-
|
766
|
-
if(!ignoredMessages || ignoredMessages.length === 0) { return false; }
|
767
|
-
if(!trace) { return false; }
|
768
|
-
exceptionMessage = trace.exception.message;
|
769
|
-
|
770
|
-
len = ignoredMessages.length;
|
771
|
-
for(i=0; i < len; i++) {
|
772
|
-
rIgnoredMessage = new RegExp(ignoredMessages[i], "gi");
|
773
|
-
messageIsIgnored = rIgnoredMessage.test(exceptionMessage);
|
774
|
-
|
775
|
-
if(messageIsIgnored){
|
776
|
-
break;
|
777
|
-
}
|
778
|
-
}
|
779
|
-
}
|
780
|
-
catch(e) {
|
781
|
-
this.configure({ignoredMessages: null});
|
782
|
-
this.error("Error while reading your configuration's ignoredMessages option. Removing custom ignoredMessages.");
|
783
|
-
}
|
784
|
-
|
785
|
-
return messageIsIgnored;
|
786
|
-
};
|
787
|
-
|
788
|
-
Notifier.prototype._enqueuePayload = function(payload, isUncaught, callerArgs, callback) {
|
789
|
-
|
790
|
-
var payloadToSend = {
|
791
|
-
callback: callback,
|
792
|
-
accessToken: this.options.accessToken,
|
793
|
-
endpointUrl: this._route('item/'),
|
794
|
-
payload: payload
|
795
|
-
};
|
796
|
-
|
797
|
-
var ignoredCallback = function() {
|
798
|
-
if (callback) {
|
799
|
-
// If the item was ignored call the callback anyway
|
800
|
-
var msg = 'This item was not sent to Rollbar because it was ignored. ' +
|
801
|
-
'This can happen if a custom checkIgnore() function was used ' +
|
802
|
-
'or if the item\'s level was less than the notifier\' reportLevel. ' +
|
803
|
-
'See https://rollbar.com/docs/notifier/rollbar.js/configuration for more details.';
|
804
|
-
|
805
|
-
callback(null, {err: 0, result: {id: null, uuid: null, message: msg}});
|
806
|
-
}
|
807
|
-
};
|
808
|
-
|
809
|
-
// Internal checkIgnore will check the level against the minimum
|
810
|
-
// report level from this.options
|
811
|
-
if (this._internalCheckIgnore(isUncaught, callerArgs, payload)) {
|
812
|
-
ignoredCallback();
|
813
|
-
return;
|
814
|
-
}
|
815
|
-
|
816
|
-
// Users can set their own ignore criteria using this.options.checkIgnore()
|
817
|
-
try {
|
818
|
-
if (this.options.checkIgnore &&
|
819
|
-
typeof this.options.checkIgnore === 'function' &&
|
820
|
-
this.options.checkIgnore(isUncaught, callerArgs, payload)) {
|
821
|
-
ignoredCallback();
|
822
|
-
return;
|
823
|
-
}
|
824
|
-
} catch (e) {
|
825
|
-
// Disable the custom checkIgnore and report errors in the checkIgnore function
|
826
|
-
this.configure({checkIgnore: null});
|
827
|
-
this.error('Error while calling custom checkIgnore() function. Removing custom checkIgnore().', e);
|
828
|
-
}
|
829
|
-
|
830
|
-
if (!this._urlIsWhitelisted(payload)) {
|
831
|
-
return;
|
832
|
-
}
|
833
|
-
|
834
|
-
if (this._messageIsIgnored(payload)) {
|
835
|
-
return;
|
836
|
-
}
|
837
|
-
|
838
|
-
if (this.options.verbose) {
|
839
|
-
if (payload.data && payload.data.body && payload.data.body.trace) {
|
840
|
-
var trace = payload.data.body.trace;
|
841
|
-
var exceptionMessage = trace.exception.message;
|
842
|
-
this.logger(exceptionMessage);
|
843
|
-
}
|
844
|
-
|
845
|
-
// FIXME: Some browsers do not output objects as json to the console, and
|
846
|
-
// instead write [object Object], so let's write the message first to ensure that is logged.
|
847
|
-
this.logger('Sending payload -', payloadToSend);
|
848
|
-
}
|
849
|
-
|
850
|
-
if (typeof this.options.logFunction === "function") {
|
851
|
-
this.options.logFunction(payloadToSend);
|
852
|
-
}
|
853
|
-
|
854
|
-
try {
|
855
|
-
if (typeof this.options.transform === 'function') {
|
856
|
-
this.options.transform(payload);
|
857
|
-
}
|
858
|
-
} catch (e) {
|
859
|
-
this.configure({transform: null});
|
860
|
-
this.error('Error while calling custom transform() function. Removing custom transform().', e);
|
861
|
-
}
|
862
|
-
|
863
|
-
if (!!this.options.enabled) {
|
864
|
-
window._rollbarPayloadQueue.push(payloadToSend);
|
865
|
-
|
866
|
-
_notifyPayloadAvailable();
|
867
|
-
}
|
868
|
-
};
|
869
|
-
|
870
|
-
|
871
|
-
Notifier.prototype._internalCheckIgnore = function(isUncaught, callerArgs, payload) {
|
872
|
-
var level = callerArgs[0];
|
873
|
-
var levelVal = Notifier.LEVELS[level] || 0;
|
874
|
-
var reportLevel = Notifier.LEVELS[this.options.reportLevel] || 0;
|
875
|
-
|
876
|
-
if (levelVal < reportLevel) {
|
877
|
-
return true;
|
878
|
-
}
|
879
|
-
|
880
|
-
var plugins = this.options ? this.options.plugins : {};
|
881
|
-
if (plugins && plugins.jquery && plugins.jquery.ignoreAjaxErrors &&
|
882
|
-
payload.body.message) {
|
883
|
-
return payload.body.messagejquery_ajax_error;
|
884
|
-
}
|
885
|
-
|
886
|
-
return false;
|
887
|
-
};
|
888
|
-
|
889
|
-
|
890
|
-
/*
|
891
|
-
* Logs stuff to Rollbar using the default
|
892
|
-
* logging level.
|
893
|
-
*
|
894
|
-
* Can be called with the following, (order doesn't matter but type does):
|
895
|
-
* - message: String
|
896
|
-
* - err: Error object, must have a .stack property or it will be
|
897
|
-
* treated as custom data
|
898
|
-
* - custom: Object containing custom data to be sent along with
|
899
|
-
* the item
|
900
|
-
* - callback: Function to call once the item is reported to Rollbar
|
901
|
-
* - isUncaught: True if this error originated from an uncaught exception handler
|
902
|
-
* - ignoreRateLimit: True if this item should be allowed despite rate limit checks
|
903
|
-
*/
|
904
|
-
Notifier.prototype._log = function(level, message, err, custom, callback, isUncaught, ignoreRateLimit) {
|
905
|
-
var stackInfo = null;
|
906
|
-
if (err) {
|
907
|
-
// If we've already calculated the stack trace for the error, use it.
|
908
|
-
// This can happen for wrapped errors that don't have a "stack" property.
|
909
|
-
stackInfo = err._savedStackTrace ? err._savedStackTrace : error_parser.parse(err);
|
910
|
-
|
911
|
-
// Don't report the same error more than once
|
912
|
-
if (err === this.lastError) {
|
913
|
-
return;
|
914
|
-
}
|
915
|
-
|
916
|
-
this.lastError = err;
|
917
|
-
}
|
918
|
-
|
919
|
-
var payload = this._buildPayload(new Date(), level, message, stackInfo, custom);
|
920
|
-
if (ignoreRateLimit) {
|
921
|
-
payload.ignoreRateLimit = true;
|
922
|
-
}
|
923
|
-
this._enqueuePayload(payload, isUncaught ? true : false, [level, message, err, custom], callback);
|
924
|
-
};
|
925
|
-
|
926
|
-
Notifier.prototype.log = Notifier._generateLogFn();
|
927
|
-
Notifier.prototype.debug = Notifier._generateLogFn('debug');
|
928
|
-
Notifier.prototype.info = Notifier._generateLogFn('info');
|
929
|
-
Notifier.prototype.warn = Notifier._generateLogFn('warning'); // for console.warn() compatibility
|
930
|
-
Notifier.prototype.warning = Notifier._generateLogFn('warning');
|
931
|
-
Notifier.prototype.error = Notifier._generateLogFn('error');
|
932
|
-
Notifier.prototype.critical = Notifier._generateLogFn('critical');
|
933
|
-
|
934
|
-
// Adapted from tracekit.js
|
935
|
-
Notifier.prototype.uncaughtError = _wrapNotifierFn(function(message, url, lineNo, colNo, err, context) {
|
936
|
-
context = context || null;
|
937
|
-
if (err && err.stack) {
|
938
|
-
this._log(this.options.uncaughtErrorLevel, message, err, context, null, true);
|
939
|
-
return;
|
940
|
-
}
|
941
|
-
|
942
|
-
// NOTE(cory): sometimes users will trigger an "error" event
|
943
|
-
// on the window object directly which will result in errMsg
|
944
|
-
// being an Object instead of a string.
|
945
|
-
//
|
946
|
-
if (url && url.stack) {
|
947
|
-
this._log(this.options.uncaughtErrorLevel, message, url, context, null, true);
|
948
|
-
return;
|
949
|
-
}
|
950
|
-
|
951
|
-
var location = {
|
952
|
-
'url': url || '',
|
953
|
-
'line': lineNo
|
954
|
-
};
|
955
|
-
location.func = error_parser.guessFunctionName(location.url, location.line);
|
956
|
-
location.context = error_parser.gatherContext(location.url, location.line);
|
957
|
-
var stack = {
|
958
|
-
'mode': 'onerror',
|
959
|
-
'message': message || 'uncaught exception',
|
960
|
-
'url': document.location.href,
|
961
|
-
'stack': [location],
|
962
|
-
'useragent': navigator.userAgent
|
963
|
-
};
|
964
|
-
if (err) {
|
965
|
-
stack = err._savedStackTrace || error_parser.parse(err);
|
966
|
-
}
|
967
|
-
|
968
|
-
var payload = this._buildPayload(new Date(), this.options.uncaughtErrorLevel, message, stack);
|
969
|
-
this._enqueuePayload(payload, true, [this.options.uncaughtErrorLevel, message, url, lineNo, colNo, err]);
|
970
|
-
});
|
971
|
-
|
972
|
-
|
973
|
-
Notifier.prototype.global = _wrapNotifierFn(function(options) {
|
974
|
-
options = options || {};
|
975
|
-
|
976
|
-
Util.merge(window._globalRollbarOptions, options);
|
977
|
-
|
978
|
-
if (options.maxItems !== undefined) {
|
979
|
-
rateLimitCounter = 0;
|
980
|
-
}
|
981
|
-
|
982
|
-
if (options.itemsPerMinute !== undefined) {
|
983
|
-
rateLimitPerMinCounter = 0;
|
984
|
-
}
|
985
|
-
});
|
986
|
-
|
987
|
-
|
988
|
-
Notifier.prototype.configure = _wrapNotifierFn(function(options) {
|
989
|
-
// TODO(cory): only allow non-payload keys that we understand
|
990
|
-
|
991
|
-
// Make a copy of the options object for this notifier
|
992
|
-
Util.merge(this.options, options);
|
993
|
-
this.global(options);
|
994
|
-
});
|
995
|
-
|
996
|
-
/*
|
997
|
-
* Create a new Notifier instance which has the same options
|
998
|
-
* as the current notifier + options to override them.
|
999
|
-
*/
|
1000
|
-
Notifier.prototype.scope = _wrapNotifierFn(function(payloadOptions) {
|
1001
|
-
var scopedNotifier = new Notifier(this);
|
1002
|
-
Util.merge(scopedNotifier.options.payload, payloadOptions);
|
1003
|
-
return scopedNotifier;
|
1004
|
-
});
|
1005
|
-
|
1006
|
-
Notifier.prototype.wrap = function(f, context) {
|
1007
|
-
var _this = this;
|
1008
|
-
var ctxFn;
|
1009
|
-
if (typeof context === 'function') {
|
1010
|
-
ctxFn = context;
|
1011
|
-
} else {
|
1012
|
-
ctxFn = function() { return context || {}; };
|
1013
|
-
}
|
1014
|
-
|
1015
|
-
if (typeof f !== 'function') {
|
1016
|
-
return f;
|
1017
|
-
}
|
1018
|
-
|
1019
|
-
// If the given function is already a wrapped function, just
|
1020
|
-
// return it instead of wrapping twice
|
1021
|
-
if (f._isWrap) {
|
1022
|
-
return f;
|
1023
|
-
}
|
1024
|
-
|
1025
|
-
if (!f._wrapped) {
|
1026
|
-
f._wrapped = function () {
|
1027
|
-
try {
|
1028
|
-
return f.apply(this, arguments);
|
1029
|
-
} catch(e) {
|
1030
|
-
if (!e.stack) {
|
1031
|
-
e._savedStackTrace = error_parser.parse(e);
|
1032
|
-
}
|
1033
|
-
e._rollbarContext = ctxFn() || {};
|
1034
|
-
e._rollbarContext._wrappedSource = f.toString();
|
1035
|
-
|
1036
|
-
window._rollbarWrappedError = e;
|
1037
|
-
throw e;
|
1038
|
-
}
|
1039
|
-
};
|
1040
|
-
|
1041
|
-
f._wrapped._isWrap = true;
|
1042
|
-
|
1043
|
-
for (var prop in f) {
|
1044
|
-
if (f.hasOwnProperty(prop)) {
|
1045
|
-
f._wrapped[prop] = f[prop];
|
1046
|
-
}
|
1047
|
-
}
|
1048
|
-
}
|
1049
|
-
|
1050
|
-
return f._wrapped;
|
1051
|
-
};
|
1052
|
-
|
1053
|
-
/***** Misc *****/
|
1054
|
-
|
1055
|
-
function _wrapNotifierFn(fn, ctx) {
|
1056
|
-
return function() {
|
1057
|
-
var self = ctx || this;
|
1058
|
-
try {
|
1059
|
-
return fn.apply(self, arguments);
|
1060
|
-
} catch (e) {
|
1061
|
-
if (self) {
|
1062
|
-
self.logger(e);
|
1063
|
-
}
|
1064
|
-
}
|
1065
|
-
};
|
1066
|
-
}
|
1067
|
-
|
1068
|
-
|
1069
|
-
var ERR_CLASS_REGEXP = new RegExp('^(([a-zA-Z0-9-_$ ]*): *)?(Uncaught )?([a-zA-Z0-9-_$ ]*): ');
|
1070
|
-
function _guessErrorClass(errMsg) {
|
1071
|
-
if (!errMsg) {
|
1072
|
-
return ["Unknown error. There was no error message to display.", ""];
|
1073
|
-
}
|
1074
|
-
var errClassMatch = errMsg.match(ERR_CLASS_REGEXP);
|
1075
|
-
var errClass = '(unknown)';
|
1076
|
-
|
1077
|
-
if (errClassMatch) {
|
1078
|
-
errClass = errClassMatch[errClassMatch.length - 1];
|
1079
|
-
errMsg = errMsg.replace((errClassMatch[errClassMatch.length - 2] || '') + errClass + ':', '');
|
1080
|
-
errMsg = errMsg.replace(/(^[\s]+|[\s]+$)/g, '');
|
1081
|
-
}
|
1082
|
-
return [errClass, errMsg];
|
1083
|
-
}
|
1084
|
-
|
1085
|
-
/***** Payload processor *****/
|
1086
|
-
|
1087
|
-
var payloadProcessorTimeout;
|
1088
|
-
Notifier.processPayloads = function(immediate) {
|
1089
|
-
if (immediate) {
|
1090
|
-
_deferredPayloadProcess();
|
1091
|
-
|
1092
|
-
return;
|
1093
|
-
}
|
1094
|
-
|
1095
|
-
_notifyPayloadAvailable();
|
1096
|
-
};
|
1097
|
-
|
1098
|
-
function _notifyPayloadAvailable() {
|
1099
|
-
if (!payloadProcessorTimeout) {
|
1100
|
-
payloadProcessorTimeout = setTimeout(_deferredPayloadProcess, 1000);
|
1101
|
-
}
|
1102
|
-
}
|
1103
|
-
|
1104
|
-
function _deferredPayloadProcess() {
|
1105
|
-
var payloadObj;
|
1106
|
-
|
1107
|
-
try {
|
1108
|
-
while ((payloadObj = window._rollbarPayloadQueue.shift())) {
|
1109
|
-
_processPayload(payloadObj.endpointUrl, payloadObj.accessToken, payloadObj.payload, payloadObj.callback);
|
1110
|
-
}
|
1111
|
-
} finally {
|
1112
|
-
payloadProcessorTimeout = undefined;
|
1113
|
-
}
|
1114
|
-
}
|
1115
|
-
|
1116
|
-
|
1117
|
-
var rateLimitStartTime = new Date().getTime();
|
1118
|
-
var rateLimitCounter = 0;
|
1119
|
-
var rateLimitPerMinCounter = 0;
|
1120
|
-
function _processPayload(url, accessToken, payload, callback) {
|
1121
|
-
callback = callback || function cb() {};
|
1122
|
-
var now = new Date().getTime();
|
1123
|
-
if (now - rateLimitStartTime >= 60000) {
|
1124
|
-
rateLimitStartTime = now;
|
1125
|
-
rateLimitPerMinCounter = 0;
|
1126
|
-
}
|
1127
|
-
|
1128
|
-
// Check to see if we have a rate limit set or if
|
1129
|
-
// the rate limit has been met/exceeded.
|
1130
|
-
var globalRateLimit = window._globalRollbarOptions.maxItems;
|
1131
|
-
var globalRateLimitPerMin = window._globalRollbarOptions.itemsPerMinute;
|
1132
|
-
var checkOverRateLimit = function() { return !payload.ignoreRateLimit && globalRateLimit >= 1 && rateLimitCounter >= globalRateLimit; };
|
1133
|
-
var checkOverRateLimitPerMin = function() { return !payload.ignoreRateLimit && globalRateLimitPerMin >= 1 && rateLimitPerMinCounter >= globalRateLimitPerMin; };
|
1134
|
-
|
1135
|
-
if (checkOverRateLimit()) {
|
1136
|
-
callback(new Error(globalRateLimit + ' max items reached'));
|
1137
|
-
return;
|
1138
|
-
} else if (checkOverRateLimitPerMin()) {
|
1139
|
-
callback(new Error(globalRateLimitPerMin + ' items per minute reached'));
|
1140
|
-
return;
|
1141
|
-
} else {
|
1142
|
-
rateLimitCounter++;
|
1143
|
-
rateLimitPerMinCounter++;
|
1144
|
-
|
1145
|
-
// Check to see if we have just reached the rate limit. If so, notify the customer.
|
1146
|
-
if (checkOverRateLimit()) {
|
1147
|
-
_topLevelNotifier._log(_topLevelNotifier.options.uncaughtErrorLevel, //level
|
1148
|
-
'maxItems has been hit. Ignoring errors for the remainder of the current page load.', // message
|
1149
|
-
null, // err
|
1150
|
-
{maxItems: globalRateLimit}, // custom
|
1151
|
-
null, // callback
|
1152
|
-
false, // isUncaught
|
1153
|
-
true); // ignoreRateLimit
|
1154
|
-
}
|
1155
|
-
// remove this key since it's only used for internal notifier logic
|
1156
|
-
if (payload.ignoreRateLimit) {
|
1157
|
-
delete payload.ignoreRateLimit;
|
1158
|
-
}
|
1159
|
-
}
|
1160
|
-
|
1161
|
-
// There's either no rate limit or we haven't met it yet so
|
1162
|
-
// go ahead and send it.
|
1163
|
-
XHR.post(url, accessToken, payload, function xhrCallback(err, resp) {
|
1164
|
-
if (err) {
|
1165
|
-
return callback(err);
|
1166
|
-
}
|
1167
|
-
|
1168
|
-
// TODO(cory): parse resp as JSON
|
1169
|
-
return callback(null, resp);
|
1170
|
-
});
|
1171
|
-
|
1172
|
-
}
|
1173
|
-
|
1174
|
-
module.exports = {
|
1175
|
-
Notifier: Notifier,
|
1176
|
-
setupJSON: setupJSON,
|
1177
|
-
topLevelNotifier: topLevelNotifier
|
1178
|
-
};
|
1179
|
-
|
1180
|
-
|
1181
|
-
|
1182
|
-
/***/ },
|
1183
|
-
/* 4 */
|
1184
|
-
/***/ function(module, exports, __webpack_require__) {
|
1185
|
-
|
1186
|
-
/*
|
1187
|
-
json2.js
|
1188
|
-
2013-05-26
|
1189
|
-
|
1190
|
-
Public Domain.
|
1191
|
-
|
1192
|
-
NO WARRANTY EXPRESSED OR IMPLIED. USE AT YOUR OWN RISK.
|
1193
|
-
|
1194
|
-
See http://www.JSON.org/js.html
|
1195
|
-
|
1196
|
-
|
1197
|
-
This code should be minified before deployment.
|
1198
|
-
See http://javascript.crockford.com/jsmin.html
|
1199
|
-
|
1200
|
-
USE YOUR OWN COPY. IT IS EXTREMELY UNWISE TO LOAD CODE FROM SERVERS YOU DO
|
1201
|
-
NOT CONTROL.
|
1202
|
-
|
1203
|
-
|
1204
|
-
This file creates a global JSON object containing two methods: stringify
|
1205
|
-
and parse.
|
1206
|
-
|
1207
|
-
JSON.stringify(value, replacer, space)
|
1208
|
-
value any JavaScript value, usually an object or array.
|
1209
|
-
|
1210
|
-
replacer an optional parameter that determines how object
|
1211
|
-
values are stringified for objects. It can be a
|
1212
|
-
function or an array of strings.
|
1213
|
-
|
1214
|
-
space an optional parameter that specifies the indentation
|
1215
|
-
of nested structures. If it is omitted, the text will
|
1216
|
-
be packed without extra whitespace. If it is a number,
|
1217
|
-
it will specify the number of spaces to indent at each
|
1218
|
-
level. If it is a string (such as '\t' or ' '),
|
1219
|
-
it contains the characters used to indent at each level.
|
1220
|
-
|
1221
|
-
This method produces a JSON text from a JavaScript value.
|
1222
|
-
|
1223
|
-
When an object value is found, if the object contains a toJSON
|
1224
|
-
method, its toJSON method will be called and the result will be
|
1225
|
-
stringified. A toJSON method does not serialize: it returns the
|
1226
|
-
value represented by the name/value pair that should be serialized,
|
1227
|
-
or undefined if nothing should be serialized. The toJSON method
|
1228
|
-
will be passed the key associated with the value, and this will be
|
1229
|
-
bound to the value
|
1230
|
-
|
1231
|
-
For example, this would serialize Dates as ISO strings.
|
1232
|
-
|
1233
|
-
Date.prototype.toJSON = function (key) {
|
1234
|
-
function f(n) {
|
1235
|
-
// Format integers to have at least two digits.
|
1236
|
-
return n < 10 ? '0' + n : n;
|
1237
|
-
}
|
1238
|
-
|
1239
|
-
return this.getUTCFullYear() + '-' +
|
1240
|
-
f(this.getUTCMonth() + 1) + '-' +
|
1241
|
-
f(this.getUTCDate()) + 'T' +
|
1242
|
-
f(this.getUTCHours()) + ':' +
|
1243
|
-
f(this.getUTCMinutes()) + ':' +
|
1244
|
-
f(this.getUTCSeconds()) + 'Z';
|
1245
|
-
};
|
1246
|
-
|
1247
|
-
You can provide an optional replacer method. It will be passed the
|
1248
|
-
key and value of each member, with this bound to the containing
|
1249
|
-
object. The value that is returned from your method will be
|
1250
|
-
serialized. If your method returns undefined, then the member will
|
1251
|
-
be excluded from the serialization.
|
1252
|
-
|
1253
|
-
If the replacer parameter is an array of strings, then it will be
|
1254
|
-
used to select the members to be serialized. It filters the results
|
1255
|
-
such that only members with keys listed in the replacer array are
|
1256
|
-
stringified.
|
1257
|
-
|
1258
|
-
Values that do not have JSON representations, such as undefined or
|
1259
|
-
functions, will not be serialized. Such values in objects will be
|
1260
|
-
dropped; in arrays they will be replaced with null. You can use
|
1261
|
-
a replacer function to replace those with JSON values.
|
1262
|
-
JSON.stringify(undefined) returns undefined.
|
1263
|
-
|
1264
|
-
The optional space parameter produces a stringification of the
|
1265
|
-
value that is filled with line breaks and indentation to make it
|
1266
|
-
easier to read.
|
1267
|
-
|
1268
|
-
If the space parameter is a non-empty string, then that string will
|
1269
|
-
be used for indentation. If the space parameter is a number, then
|
1270
|
-
the indentation will be that many spaces.
|
1271
|
-
|
1272
|
-
Example:
|
1273
|
-
|
1274
|
-
text = JSON.stringify(['e', {pluribus: 'unum'}]);
|
1275
|
-
// text is '["e",{"pluribus":"unum"}]'
|
1276
|
-
|
1277
|
-
|
1278
|
-
text = JSON.stringify(['e', {pluribus: 'unum'}], null, '\t');
|
1279
|
-
// text is '[\n\t"e",\n\t{\n\t\t"pluribus": "unum"\n\t}\n]'
|
1280
|
-
|
1281
|
-
text = JSON.stringify([new Date()], function (key, value) {
|
1282
|
-
return this[key] instanceof Date ?
|
1283
|
-
'Date(' + this[key] + ')' : value;
|
1284
|
-
});
|
1285
|
-
// text is '["Date(---current time---)"]'
|
1286
|
-
|
1287
|
-
|
1288
|
-
JSON.parse(text, reviver)
|
1289
|
-
This method parses a JSON text to produce an object or array.
|
1290
|
-
It can throw a SyntaxError exception.
|
1291
|
-
|
1292
|
-
The optional reviver parameter is a function that can filter and
|
1293
|
-
transform the results. It receives each of the keys and values,
|
1294
|
-
and its return value is used instead of the original value.
|
1295
|
-
If it returns what it received, then the structure is not modified.
|
1296
|
-
If it returns undefined then the member is deleted.
|
1297
|
-
|
1298
|
-
Example:
|
1299
|
-
|
1300
|
-
// Parse the text. Values that look like ISO date strings will
|
1301
|
-
// be converted to Date objects.
|
1302
|
-
|
1303
|
-
myData = JSON.parse(text, function (key, value) {
|
1304
|
-
var a;
|
1305
|
-
if (typeof value === 'string') {
|
1306
|
-
a =
|
1307
|
-
/^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2}(?:\.\d*)?)Z$/.exec(value);
|
1308
|
-
if (a) {
|
1309
|
-
return new Date(Date.UTC(+a[1], +a[2] - 1, +a[3], +a[4],
|
1310
|
-
+a[5], +a[6]));
|
1311
|
-
}
|
1312
|
-
}
|
1313
|
-
return value;
|
1314
|
-
});
|
1315
|
-
|
1316
|
-
myData = JSON.parse('["Date(09/09/2001)"]', function (key, value) {
|
1317
|
-
var d;
|
1318
|
-
if (typeof value === 'string' &&
|
1319
|
-
value.slice(0, 5) === 'Date(' &&
|
1320
|
-
value.slice(-1) === ')') {
|
1321
|
-
d = new Date(value.slice(5, -1));
|
1322
|
-
if (d) {
|
1323
|
-
return d;
|
1324
|
-
}
|
1325
|
-
}
|
1326
|
-
return value;
|
1327
|
-
});
|
1328
|
-
|
1329
|
-
|
1330
|
-
This is a reference implementation. You are free to copy, modify, or
|
1331
|
-
redistribute.
|
1332
|
-
*/
|
1333
|
-
|
1334
|
-
/*jslint evil: true, regexp: true */
|
1335
|
-
|
1336
|
-
/*members "", "\b", "\t", "\n", "\f", "\r", "\"", JSON, "\\", apply,
|
1337
|
-
call, charCodeAt, getUTCDate, getUTCFullYear, getUTCHours,
|
1338
|
-
getUTCMinutes, getUTCMonth, getUTCSeconds, hasOwnProperty, join,
|
1339
|
-
lastIndex, length, parse, prototype, push, replace, slice, stringify,
|
1340
|
-
test, toJSON, toString, valueOf
|
1341
|
-
*/
|
1342
|
-
|
1343
|
-
var setupCustomJSON = function(JSON) {
|
1344
|
-
function f(n) {
|
1345
|
-
// Format integers to have at least two digits.
|
1346
|
-
return n < 10 ? '0' + n : n;
|
1347
|
-
}
|
1348
|
-
|
1349
|
-
if (typeof Date.prototype.toJSON !== 'function') {
|
1350
|
-
|
1351
|
-
Date.prototype.toJSON = function () {
|
1352
|
-
|
1353
|
-
return isFinite(this.valueOf())
|
1354
|
-
? this.getUTCFullYear() + '-' +
|
1355
|
-
f(this.getUTCMonth() + 1) + '-' +
|
1356
|
-
f(this.getUTCDate()) + 'T' +
|
1357
|
-
f(this.getUTCHours()) + ':' +
|
1358
|
-
f(this.getUTCMinutes()) + ':' +
|
1359
|
-
f(this.getUTCSeconds()) + 'Z'
|
1360
|
-
: null;
|
1361
|
-
};
|
1362
|
-
|
1363
|
-
String.prototype.toJSON =
|
1364
|
-
Number.prototype.toJSON =
|
1365
|
-
Boolean.prototype.toJSON = function () {
|
1366
|
-
return this.valueOf();
|
1367
|
-
};
|
1368
|
-
}
|
1369
|
-
|
1370
|
-
var cx = /[\u0000\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g,
|
1371
|
-
escapable = /[\\\"\x00-\x1f\x7f-\x9f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g,
|
1372
|
-
gap,
|
1373
|
-
indent,
|
1374
|
-
meta = { // table of character substitutions
|
1375
|
-
'\b': '\\b',
|
1376
|
-
'\t': '\\t',
|
1377
|
-
'\n': '\\n',
|
1378
|
-
'\f': '\\f',
|
1379
|
-
'\r': '\\r',
|
1380
|
-
'"' : '\\"',
|
1381
|
-
'\\': '\\\\'
|
1382
|
-
},
|
1383
|
-
rep;
|
1384
|
-
|
1385
|
-
|
1386
|
-
function quote(string) {
|
1387
|
-
|
1388
|
-
// If the string contains no control characters, no quote characters, and no
|
1389
|
-
// backslash characters, then we can safely slap some quotes around it.
|
1390
|
-
// Otherwise we must also replace the offending characters with safe escape
|
1391
|
-
// sequences.
|
1392
|
-
|
1393
|
-
escapable.lastIndex = 0;
|
1394
|
-
return escapable.test(string) ? '"' + string.replace(escapable, function (a) {
|
1395
|
-
var c = meta[a];
|
1396
|
-
return typeof c === 'string'
|
1397
|
-
? c
|
1398
|
-
: '\\u' + ('0000' + a.charCodeAt(0).toString(16)).slice(-4);
|
1399
|
-
}) + '"' : '"' + string + '"';
|
1400
|
-
}
|
1401
|
-
|
1402
|
-
|
1403
|
-
function str(key, holder) {
|
1404
|
-
|
1405
|
-
// Produce a string from holder[key].
|
1406
|
-
|
1407
|
-
var i, // The loop counter.
|
1408
|
-
k, // The member key.
|
1409
|
-
v, // The member value.
|
1410
|
-
length,
|
1411
|
-
mind = gap,
|
1412
|
-
partial,
|
1413
|
-
value = holder[key];
|
1414
|
-
|
1415
|
-
// If we were called with a replacer function, then call the replacer to
|
1416
|
-
// obtain a replacement value.
|
1417
|
-
|
1418
|
-
if (typeof rep === 'function') {
|
1419
|
-
value = rep.call(holder, key, value);
|
1420
|
-
}
|
1421
|
-
|
1422
|
-
// What happens next depends on the value's type.
|
1423
|
-
|
1424
|
-
switch (typeof value) {
|
1425
|
-
case 'string':
|
1426
|
-
return quote(value);
|
1427
|
-
|
1428
|
-
case 'number':
|
1429
|
-
|
1430
|
-
// JSON numbers must be finite. Encode non-finite numbers as null.
|
1431
|
-
|
1432
|
-
return isFinite(value) ? String(value) : 'null';
|
1433
|
-
|
1434
|
-
case 'boolean':
|
1435
|
-
case 'null':
|
1436
|
-
|
1437
|
-
// If the value is a boolean or null, convert it to a string. Note:
|
1438
|
-
// typeof null does not produce 'null'. The case is included here in
|
1439
|
-
// the remote chance that this gets fixed someday.
|
1440
|
-
|
1441
|
-
return String(value);
|
1442
|
-
|
1443
|
-
// If the type is 'object', we might be dealing with an object or an array or
|
1444
|
-
// null.
|
1445
|
-
|
1446
|
-
case 'object':
|
1447
|
-
|
1448
|
-
// Due to a specification blunder in ECMAScript, typeof null is 'object',
|
1449
|
-
// so watch out for that case.
|
1450
|
-
|
1451
|
-
if (!value) {
|
1452
|
-
return 'null';
|
1453
|
-
}
|
1454
|
-
|
1455
|
-
// Make an array to hold the partial results of stringifying this object value.
|
1456
|
-
|
1457
|
-
gap += indent;
|
1458
|
-
partial = [];
|
1459
|
-
|
1460
|
-
// Is the value an array?
|
1461
|
-
|
1462
|
-
if (Object.prototype.toString.apply(value) === '[object Array]') {
|
1463
|
-
|
1464
|
-
// The value is an array. Stringify every element. Use null as a placeholder
|
1465
|
-
// for non-JSON values.
|
1466
|
-
|
1467
|
-
length = value.length;
|
1468
|
-
for (i = 0; i < length; i += 1) {
|
1469
|
-
partial[i] = str(i, value) || 'null';
|
1470
|
-
}
|
1471
|
-
|
1472
|
-
// Join all of the elements together, separated with commas, and wrap them in
|
1473
|
-
// brackets.
|
1474
|
-
|
1475
|
-
v = partial.length === 0
|
1476
|
-
? '[]'
|
1477
|
-
: gap
|
1478
|
-
? '[\n' + gap + partial.join(',\n' + gap) + '\n' + mind + ']'
|
1479
|
-
: '[' + partial.join(',') + ']';
|
1480
|
-
gap = mind;
|
1481
|
-
return v;
|
1482
|
-
}
|
1483
|
-
|
1484
|
-
// If the replacer is an array, use it to select the members to be stringified.
|
1485
|
-
|
1486
|
-
if (rep && typeof rep === 'object') {
|
1487
|
-
length = rep.length;
|
1488
|
-
for (i = 0; i < length; i += 1) {
|
1489
|
-
if (typeof rep[i] === 'string') {
|
1490
|
-
k = rep[i];
|
1491
|
-
v = str(k, value);
|
1492
|
-
if (v) {
|
1493
|
-
partial.push(quote(k) + (gap ? ': ' : ':') + v);
|
1494
|
-
}
|
1495
|
-
}
|
1496
|
-
}
|
1497
|
-
} else {
|
1498
|
-
|
1499
|
-
// Otherwise, iterate through all of the keys in the object.
|
1500
|
-
|
1501
|
-
for (k in value) {
|
1502
|
-
if (Object.prototype.hasOwnProperty.call(value, k)) {
|
1503
|
-
v = str(k, value);
|
1504
|
-
if (v) {
|
1505
|
-
partial.push(quote(k) + (gap ? ': ' : ':') + v);
|
1506
|
-
}
|
1507
|
-
}
|
1508
|
-
}
|
1509
|
-
}
|
1510
|
-
|
1511
|
-
// Join all of the member texts together, separated with commas,
|
1512
|
-
// and wrap them in braces.
|
1513
|
-
|
1514
|
-
v = partial.length === 0
|
1515
|
-
? '{}'
|
1516
|
-
: gap
|
1517
|
-
? '{\n' + gap + partial.join(',\n' + gap) + '\n' + mind + '}'
|
1518
|
-
: '{' + partial.join(',') + '}';
|
1519
|
-
gap = mind;
|
1520
|
-
return v;
|
1521
|
-
}
|
1522
|
-
}
|
1523
|
-
|
1524
|
-
// If the JSON object does not yet have a stringify method, give it one.
|
1525
|
-
|
1526
|
-
if (typeof JSON.stringify !== 'function') {
|
1527
|
-
JSON.stringify = function (value, replacer, space) {
|
1528
|
-
|
1529
|
-
// The stringify method takes a value and an optional replacer, and an optional
|
1530
|
-
// space parameter, and returns a JSON text. The replacer can be a function
|
1531
|
-
// that can replace values, or an array of strings that will select the keys.
|
1532
|
-
// A default replacer method can be provided. Use of the space parameter can
|
1533
|
-
// produce text that is more easily readable.
|
1534
|
-
|
1535
|
-
var i;
|
1536
|
-
gap = '';
|
1537
|
-
indent = '';
|
1538
|
-
|
1539
|
-
// If the space parameter is a number, make an indent string containing that
|
1540
|
-
// many spaces.
|
1541
|
-
|
1542
|
-
if (typeof space === 'number') {
|
1543
|
-
for (i = 0; i < space; i += 1) {
|
1544
|
-
indent += ' ';
|
1545
|
-
}
|
1546
|
-
|
1547
|
-
// If the space parameter is a string, it will be used as the indent string.
|
1548
|
-
|
1549
|
-
} else if (typeof space === 'string') {
|
1550
|
-
indent = space;
|
1551
|
-
}
|
1552
|
-
|
1553
|
-
// If there is a replacer, it must be a function or an array.
|
1554
|
-
// Otherwise, throw an error.
|
1555
|
-
|
1556
|
-
rep = replacer;
|
1557
|
-
if (replacer && typeof replacer !== 'function' &&
|
1558
|
-
(typeof replacer !== 'object' ||
|
1559
|
-
typeof replacer.length !== 'number')) {
|
1560
|
-
throw new Error('JSON.stringify');
|
1561
|
-
}
|
1562
|
-
|
1563
|
-
// Make a fake root object containing our value under the key of ''.
|
1564
|
-
// Return the result of stringifying the value.
|
1565
|
-
|
1566
|
-
return str('', {'': value});
|
1567
|
-
};
|
1568
|
-
}
|
1569
|
-
|
1570
|
-
|
1571
|
-
// If the JSON object does not yet have a parse method, give it one.
|
1572
|
-
|
1573
|
-
if (typeof JSON.parse !== 'function') {
|
1574
|
-
JSON.parse = function (text, reviver) {
|
1575
|
-
|
1576
|
-
// The parse method takes a text and an optional reviver function, and returns
|
1577
|
-
// a JavaScript value if the text is a valid JSON text.
|
1578
|
-
|
1579
|
-
var j;
|
1580
|
-
|
1581
|
-
function walk(holder, key) {
|
1582
|
-
|
1583
|
-
// The walk method is used to recursively walk the resulting structure so
|
1584
|
-
// that modifications can be made.
|
1585
|
-
|
1586
|
-
var k, v, value = holder[key];
|
1587
|
-
if (value && typeof value === 'object') {
|
1588
|
-
for (k in value) {
|
1589
|
-
if (Object.prototype.hasOwnProperty.call(value, k)) {
|
1590
|
-
v = walk(value, k);
|
1591
|
-
if (v !== undefined) {
|
1592
|
-
value[k] = v;
|
1593
|
-
} else {
|
1594
|
-
delete value[k];
|
1595
|
-
}
|
1596
|
-
}
|
1597
|
-
}
|
1598
|
-
}
|
1599
|
-
return reviver.call(holder, key, value);
|
1600
|
-
}
|
1601
|
-
|
1602
|
-
|
1603
|
-
// Parsing happens in four stages. In the first stage, we replace certain
|
1604
|
-
// Unicode characters with escape sequences. JavaScript handles many characters
|
1605
|
-
// incorrectly, either silently deleting them, or treating them as line endings.
|
1606
|
-
|
1607
|
-
text = String(text);
|
1608
|
-
cx.lastIndex = 0;
|
1609
|
-
if (cx.test(text)) {
|
1610
|
-
text = text.replace(cx, function (a) {
|
1611
|
-
return '\\u' +
|
1612
|
-
('0000' + a.charCodeAt(0).toString(16)).slice(-4);
|
1613
|
-
});
|
1614
|
-
}
|
1615
|
-
|
1616
|
-
// In the second stage, we run the text against regular expressions that look
|
1617
|
-
// for non-JSON patterns. We are especially concerned with '()' and 'new'
|
1618
|
-
// because they can cause invocation, and '=' because it can cause mutation.
|
1619
|
-
// But just to be safe, we want to reject all unexpected forms.
|
1620
|
-
|
1621
|
-
// We split the second stage into 4 regexp operations in order to work around
|
1622
|
-
// crippling inefficiencies in IE's and Safari's regexp engines. First we
|
1623
|
-
// replace the JSON backslash pairs with '@' (a non-JSON character). Second, we
|
1624
|
-
// replace all simple value tokens with ']' characters. Third, we delete all
|
1625
|
-
// open brackets that follow a colon or comma or that begin the text. Finally,
|
1626
|
-
// we look to see that the remaining characters are only whitespace or ']' or
|
1627
|
-
// ',' or ':' or '{' or '}'. If that is so, then the text is safe for eval.
|
1628
|
-
|
1629
|
-
if (/^[\],:{}\s]*$/
|
1630
|
-
.test(text.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g, '@')
|
1631
|
-
.replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, ']')
|
1632
|
-
.replace(/(?:^|:|,)(?:\s*\[)+/g, ''))) {
|
1633
|
-
|
1634
|
-
// In the third stage we use the eval function to compile the text into a
|
1635
|
-
// JavaScript structure. The '{' operator is subject to a syntactic ambiguity
|
1636
|
-
// in JavaScript: it can begin a block or an object literal. We wrap the text
|
1637
|
-
// in parens to eliminate the ambiguity.
|
1638
|
-
|
1639
|
-
j = eval('(' + text + ')');
|
1640
|
-
|
1641
|
-
// In the optional fourth stage, we recursively walk the new structure, passing
|
1642
|
-
// each name/value pair to a reviver function for possible transformation.
|
1643
|
-
|
1644
|
-
return typeof reviver === 'function'
|
1645
|
-
? walk({'': j}, '')
|
1646
|
-
: j;
|
1647
|
-
}
|
1648
|
-
|
1649
|
-
// If the text is not JSON parseable, then a SyntaxError is thrown.
|
1650
|
-
|
1651
|
-
throw new SyntaxError('JSON.parse');
|
1652
|
-
};
|
1653
|
-
}
|
1654
|
-
}
|
1655
|
-
|
1656
|
-
module.exports = setupCustomJSON;
|
1657
|
-
|
1658
|
-
|
1659
|
-
/***/ },
|
1660
|
-
/* 5 */
|
1661
|
-
/***/ function(module, exports, __webpack_require__) {
|
1662
|
-
|
1663
|
-
"use strict";
|
1664
|
-
|
1665
|
-
var ErrorStackParser = __webpack_require__(8);
|
1666
|
-
|
1667
|
-
var UNKNOWN_FUNCTION = '?';
|
1668
|
-
|
1669
|
-
|
1670
|
-
function guessFunctionName(url, line) {
|
1671
|
-
return UNKNOWN_FUNCTION;
|
1672
|
-
}
|
1673
|
-
|
1674
|
-
function gatherContext(url, line) {
|
1675
|
-
return null;
|
1676
|
-
}
|
1677
|
-
|
1678
|
-
function Frame(stackFrame) {
|
1679
|
-
var data = {};
|
1680
|
-
|
1681
|
-
data._stackFrame = stackFrame;
|
1682
|
-
|
1683
|
-
data.url = stackFrame.fileName;
|
1684
|
-
data.line = stackFrame.lineNumber;
|
1685
|
-
data.func = stackFrame.functionName;
|
1686
|
-
data.column = stackFrame.columnNumber;
|
1687
|
-
data.args = stackFrame.args;
|
1688
|
-
|
1689
|
-
data.context = gatherContext(data.url, data.line);
|
1690
|
-
|
1691
|
-
return data;
|
1692
|
-
}
|
1693
|
-
|
1694
|
-
function Stack(exception) {
|
1695
|
-
function getStack() {
|
1696
|
-
var parserStack = [];
|
1697
|
-
|
1698
|
-
try {
|
1699
|
-
parserStack = ErrorStackParser.parse(exception);
|
1700
|
-
} catch(e) {
|
1701
|
-
parserStack = [];
|
1702
|
-
}
|
1703
|
-
|
1704
|
-
var stack = [];
|
1705
|
-
|
1706
|
-
for (var i = 0; i < parserStack.length; i++) {
|
1707
|
-
stack.push(new Frame(parserStack[i]));
|
1708
|
-
}
|
1709
|
-
|
1710
|
-
return stack;
|
1711
|
-
}
|
1712
|
-
|
1713
|
-
return {
|
1714
|
-
stack: getStack(),
|
1715
|
-
message: exception.message,
|
1716
|
-
name: exception.name
|
1717
|
-
};
|
1718
|
-
}
|
1719
|
-
|
1720
|
-
function parse(e) {
|
1721
|
-
return new Stack(e);
|
1722
|
-
}
|
1723
|
-
|
1724
|
-
module.exports = {
|
1725
|
-
guessFunctionName: guessFunctionName,
|
1726
|
-
gatherContext: gatherContext,
|
1727
|
-
parse: parse,
|
1728
|
-
Stack: Stack,
|
1729
|
-
Frame: Frame
|
1730
|
-
};
|
1731
|
-
|
1732
|
-
|
1733
|
-
/***/ },
|
1734
|
-
/* 6 */
|
1735
|
-
/***/ function(module, exports, __webpack_require__) {
|
1736
|
-
|
1737
|
-
"use strict";
|
1738
|
-
|
1739
|
-
var Util = {
|
1740
|
-
// modified from https://github.com/jquery/jquery/blob/master/src/core.js#L127
|
1741
|
-
merge: function() {
|
1742
|
-
var options, name, src, copy, copyIsArray, clone,
|
1743
|
-
target = arguments[0] || {},
|
1744
|
-
i = 1,
|
1745
|
-
length = arguments.length,
|
1746
|
-
deep = true;
|
1747
|
-
|
1748
|
-
// Handle case when target is a string or something (possible in deep copy)
|
1749
|
-
if (typeof target !== "object" && typeof target !== 'function') {
|
1750
|
-
target = {};
|
1751
|
-
}
|
1752
|
-
|
1753
|
-
for (; i < length; i++) {
|
1754
|
-
// Only deal with non-null/undefined values
|
1755
|
-
if ((options = arguments[i]) !== null) {
|
1756
|
-
// Extend the base object
|
1757
|
-
for (name in options) {
|
1758
|
-
// IE8 will iterate over properties of objects like "indexOf"
|
1759
|
-
if (!options.hasOwnProperty(name)) {
|
1760
|
-
continue;
|
1761
|
-
}
|
1762
|
-
|
1763
|
-
src = target[name];
|
1764
|
-
copy = options[name];
|
1765
|
-
|
1766
|
-
// Prevent never-ending loop
|
1767
|
-
if (target === copy) {
|
1768
|
-
continue;
|
1769
|
-
}
|
1770
|
-
|
1771
|
-
// Recurse if we're merging plain objects or arrays
|
1772
|
-
if (deep && copy && (copy.constructor === Object || (copyIsArray = (copy.constructor === Array)))) {
|
1773
|
-
if (copyIsArray) {
|
1774
|
-
copyIsArray = false;
|
1775
|
-
// Overwrite the source with a copy of the array to merge in
|
1776
|
-
clone = [];
|
1777
|
-
} else {
|
1778
|
-
clone = src && src.constructor === Object ? src : {};
|
1779
|
-
}
|
1780
|
-
|
1781
|
-
// Never move original objects, clone them
|
1782
|
-
target[name] = Util.merge(clone, copy);
|
1783
|
-
|
1784
|
-
// Don't bring in undefined values
|
1785
|
-
} else if (copy !== undefined) {
|
1786
|
-
target[name] = copy;
|
1787
|
-
}
|
1788
|
-
}
|
1789
|
-
}
|
1790
|
-
}
|
1791
|
-
|
1792
|
-
// Return the modified object
|
1793
|
-
return target;
|
1794
|
-
},
|
1795
|
-
|
1796
|
-
copy: function(obj) {
|
1797
|
-
var dest;
|
1798
|
-
if (typeof obj === 'object') {
|
1799
|
-
if (obj.constructor === Object) {
|
1800
|
-
dest = {};
|
1801
|
-
} else if (obj.constructor === Array) {
|
1802
|
-
dest = [];
|
1803
|
-
}
|
1804
|
-
}
|
1805
|
-
|
1806
|
-
Util.merge(dest, obj);
|
1807
|
-
return dest;
|
1808
|
-
},
|
1809
|
-
|
1810
|
-
parseUriOptions: {
|
1811
|
-
strictMode: false,
|
1812
|
-
key: ["source","protocol","authority","userInfo","user","password","host","port","relative","path","directory","file","query","anchor"],
|
1813
|
-
q: {
|
1814
|
-
name: "queryKey",
|
1815
|
-
parser: /(?:^|&)([^&=]*)=?([^&]*)/g
|
1816
|
-
},
|
1817
|
-
parser: {
|
1818
|
-
strict: /^(?:([^:\/?#]+):)?(?:\/\/((?:(([^:@]*)(?::([^:@]*))?)?@)?([^:\/?#]*)(?::(\d*))?))?((((?:[^?#\/]*\/)*)([^?#]*))(?:\?([^#]*))?(?:#(.*))?)/,
|
1819
|
-
loose: /^(?:(?![^:@]+:[^:@\/]*@)([^:\/?#.]+):)?(?:\/\/)?((?:(([^:@]*)(?::([^:@]*))?)?@)?([^:\/?#]*)(?::(\d*))?)(((\/(?:[^?#](?![^?#\/]*\.[^?#\/.]+(?:[?#]|$)))*\/?)?([^?#\/]*))(?:\?([^#]*))?(?:#(.*))?)/
|
1820
|
-
}
|
1821
|
-
},
|
1822
|
-
|
1823
|
-
parseUri: function(str) {
|
1824
|
-
if (!str || (typeof str !== 'string' && !(str instanceof String))) {
|
1825
|
-
throw new Error('Util.parseUri() received invalid input');
|
1826
|
-
}
|
1827
|
-
|
1828
|
-
var o = Util.parseUriOptions;
|
1829
|
-
var m = o.parser[o.strictMode ? "strict" : "loose"].exec(str);
|
1830
|
-
var uri = {};
|
1831
|
-
var i = 14;
|
1832
|
-
|
1833
|
-
while (i--) {
|
1834
|
-
uri[o.key[i]] = m[i] || "";
|
1835
|
-
}
|
1836
|
-
|
1837
|
-
uri[o.q.name] = {};
|
1838
|
-
uri[o.key[12]].replace(o.q.parser, function ($0, $1, $2) {
|
1839
|
-
if ($1) {
|
1840
|
-
uri[o.q.name][$1] = $2;
|
1841
|
-
}
|
1842
|
-
});
|
1843
|
-
|
1844
|
-
return uri;
|
1845
|
-
},
|
1846
|
-
|
1847
|
-
sanitizeUrl: function(url) {
|
1848
|
-
if (!url || (typeof url !== 'string' && !(url instanceof String))) {
|
1849
|
-
throw new Error('Util.sanitizeUrl() received invalid input');
|
1850
|
-
}
|
1851
|
-
|
1852
|
-
var baseUrlParts = Util.parseUri(url);
|
1853
|
-
// remove a trailing # if there is no anchor
|
1854
|
-
if (baseUrlParts.anchor === '') {
|
1855
|
-
baseUrlParts.source = baseUrlParts.source.replace('#', '');
|
1856
|
-
}
|
1857
|
-
|
1858
|
-
url = baseUrlParts.source.replace('?' + baseUrlParts.query, '');
|
1859
|
-
return url;
|
1860
|
-
},
|
1861
|
-
|
1862
|
-
traverse: function(obj, func) {
|
1863
|
-
var k;
|
1864
|
-
var v;
|
1865
|
-
var i;
|
1866
|
-
var isObj = typeof obj === 'object';
|
1867
|
-
var keys = [];
|
1868
|
-
|
1869
|
-
if (isObj) {
|
1870
|
-
if (obj.constructor === Object) {
|
1871
|
-
for (k in obj) {
|
1872
|
-
if (obj.hasOwnProperty(k)) {
|
1873
|
-
keys.push(k);
|
1874
|
-
}
|
1875
|
-
}
|
1876
|
-
} else if (obj.constructor === Array) {
|
1877
|
-
for (i = 0; i < obj.length; ++i) {
|
1878
|
-
keys.push(i);
|
1879
|
-
}
|
1880
|
-
}
|
1881
|
-
}
|
1882
|
-
|
1883
|
-
for (i = 0; i < keys.length; ++i) {
|
1884
|
-
k = keys[i];
|
1885
|
-
v = obj[k];
|
1886
|
-
isObj = typeof v === 'object';
|
1887
|
-
if (isObj) {
|
1888
|
-
if (v === null) {
|
1889
|
-
obj[k] = func(k, v);
|
1890
|
-
} else if (v.constructor === Object) {
|
1891
|
-
obj[k] = Util.traverse(v, func);
|
1892
|
-
} else if (v.constructor === Array) {
|
1893
|
-
obj[k] = Util.traverse(v, func);
|
1894
|
-
} else {
|
1895
|
-
obj[k] = func(k, v);
|
1896
|
-
}
|
1897
|
-
} else {
|
1898
|
-
obj[k] = func(k, v);
|
1899
|
-
}
|
1900
|
-
}
|
1901
|
-
|
1902
|
-
return obj;
|
1903
|
-
|
1904
|
-
},
|
1905
|
-
|
1906
|
-
redact: function(val) {
|
1907
|
-
val = String(val);
|
1908
|
-
return new Array(val.length + 1).join('*');
|
1909
|
-
},
|
1910
|
-
|
1911
|
-
// from http://stackoverflow.com/a/8809472/1138191
|
1912
|
-
uuid4: function() {
|
1913
|
-
var d = new Date().getTime();
|
1914
|
-
var uuid = 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {
|
1915
|
-
var r = (d + Math.random() * 16) % 16 | 0;
|
1916
|
-
d = Math.floor(d / 16);
|
1917
|
-
return (c === 'x' ? r : (r & 0x7 | 0x8)).toString(16);
|
1918
|
-
});
|
1919
|
-
return uuid;
|
1920
|
-
}
|
1921
|
-
};
|
1922
|
-
|
1923
|
-
module.exports = Util;
|
1924
|
-
|
1925
|
-
|
1926
|
-
/***/ },
|
1927
|
-
/* 7 */
|
1928
|
-
/***/ function(module, exports, __webpack_require__) {
|
1929
|
-
|
1930
|
-
/* globals ActiveXObject */
|
1931
|
-
|
1932
|
-
"use strict";
|
1933
|
-
|
1934
|
-
var RollbarJSON = null;
|
1935
|
-
|
1936
|
-
function setupJSON(JSON) {
|
1937
|
-
RollbarJSON = JSON;
|
1938
|
-
}
|
1939
|
-
|
1940
|
-
var XHR = {
|
1941
|
-
XMLHttpFactories: [
|
1942
|
-
function () {return new XMLHttpRequest();},
|
1943
|
-
function () {return new ActiveXObject("Msxml2.XMLHTTP");},
|
1944
|
-
function () {return new ActiveXObject("Msxml3.XMLHTTP");},
|
1945
|
-
function () {return new ActiveXObject("Microsoft.XMLHTTP");}
|
1946
|
-
],
|
1947
|
-
createXMLHTTPObject: function() {
|
1948
|
-
var xmlhttp = false;
|
1949
|
-
var factories = XHR.XMLHttpFactories;
|
1950
|
-
var i;
|
1951
|
-
var numFactories = factories.length;
|
1952
|
-
for (i = 0; i < numFactories; i++) {
|
1953
|
-
try {
|
1954
|
-
xmlhttp = factories[i]();
|
1955
|
-
break;
|
1956
|
-
} catch (e) {
|
1957
|
-
// pass
|
1958
|
-
}
|
1959
|
-
}
|
1960
|
-
return xmlhttp;
|
1961
|
-
},
|
1962
|
-
post: function(url, accessToken, payload, callback) {
|
1963
|
-
if (typeof payload !== 'object') {
|
1964
|
-
throw new Error('Expected an object to POST');
|
1965
|
-
}
|
1966
|
-
payload = RollbarJSON.stringify(payload);
|
1967
|
-
callback = callback || function() {};
|
1968
|
-
var request = XHR.createXMLHTTPObject();
|
1969
|
-
if (request) {
|
1970
|
-
try {
|
1971
|
-
try {
|
1972
|
-
var onreadystatechange = function(args) {
|
1973
|
-
try {
|
1974
|
-
if (onreadystatechange && request.readyState === 4) {
|
1975
|
-
onreadystatechange = undefined;
|
1976
|
-
|
1977
|
-
// TODO(cory): have the notifier log an internal error on non-200 response codes
|
1978
|
-
if (request.status === 200) {
|
1979
|
-
callback(null, RollbarJSON.parse(request.responseText));
|
1980
|
-
} else if (typeof request.status === "number" &&
|
1981
|
-
request.status >= 400 && request.status < 600) {
|
1982
|
-
// return valid http status codes
|
1983
|
-
callback(new Error(request.status.toString()));
|
1984
|
-
} else {
|
1985
|
-
// IE will return a status 12000+ on some sort of connection failure,
|
1986
|
-
// so we return a blank error
|
1987
|
-
// http://msdn.microsoft.com/en-us/library/aa383770%28VS.85%29.aspx
|
1988
|
-
callback(new Error());
|
1989
|
-
}
|
1990
|
-
}
|
1991
|
-
} catch (ex) {
|
1992
|
-
//jquery source mentions firefox may error out while accessing the
|
1993
|
-
//request members if there is a network error
|
1994
|
-
//https://github.com/jquery/jquery/blob/a938d7b1282fc0e5c52502c225ae8f0cef219f0a/src/ajax/xhr.js#L111
|
1995
|
-
var exc;
|
1996
|
-
if (typeof ex === 'object' && ex.stack) {
|
1997
|
-
exc = ex;
|
1998
|
-
} else {
|
1999
|
-
exc = new Error(ex);
|
2000
|
-
}
|
2001
|
-
callback(exc);
|
2002
|
-
}
|
2003
|
-
};
|
2004
|
-
|
2005
|
-
request.open('POST', url, true);
|
2006
|
-
if (request.setRequestHeader) {
|
2007
|
-
request.setRequestHeader('Content-Type', 'application/json');
|
2008
|
-
request.setRequestHeader('X-Rollbar-Access-Token', accessToken);
|
2009
|
-
}
|
2010
|
-
request.onreadystatechange = onreadystatechange;
|
2011
|
-
request.send(payload);
|
2012
|
-
} catch (e1) {
|
2013
|
-
// Sending using the normal xmlhttprequest object didn't work, try XDomainRequest
|
2014
|
-
if (typeof XDomainRequest !== "undefined") {
|
2015
|
-
var ontimeout = function(args) {
|
2016
|
-
callback(new Error());
|
2017
|
-
};
|
2018
|
-
|
2019
|
-
var onerror = function(args) {
|
2020
|
-
callback(new Error());
|
2021
|
-
};
|
2022
|
-
|
2023
|
-
var onload = function(args) {
|
2024
|
-
callback(null, RollbarJSON.parse(request.responseText));
|
2025
|
-
};
|
2026
|
-
|
2027
|
-
request = new XDomainRequest();
|
2028
|
-
request.onprogress = function() {};
|
2029
|
-
request.ontimeout = ontimeout;
|
2030
|
-
request.onerror = onerror;
|
2031
|
-
request.onload = onload;
|
2032
|
-
request.open('POST', url, true);
|
2033
|
-
request.send(payload);
|
2034
|
-
}
|
2035
|
-
}
|
2036
|
-
} catch (e2) {
|
2037
|
-
callback(e2);
|
2038
|
-
}
|
2039
|
-
}
|
2040
|
-
}
|
2041
|
-
};
|
2042
|
-
|
2043
|
-
module.exports = {
|
2044
|
-
XHR: XHR,
|
2045
|
-
setupJSON: setupJSON
|
2046
|
-
};
|
2047
|
-
|
2048
|
-
|
2049
|
-
/***/ },
|
2050
|
-
/* 8 */
|
2051
|
-
/***/ function(module, exports, __webpack_require__) {
|
2052
|
-
|
2053
|
-
var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;(function (root, factory) {
|
2054
|
-
'use strict';
|
2055
|
-
// Universal Module Definition (UMD) to support AMD, CommonJS/Node.js, Rhino, and browsers.
|
2056
|
-
if (true) {
|
2057
|
-
!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(9)], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory), __WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ? (__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));
|
2058
|
-
} else if (typeof exports === 'object') {
|
2059
|
-
module.exports = factory(require('stackframe'));
|
2060
|
-
} else {
|
2061
|
-
root.ErrorStackParser = factory(root.StackFrame);
|
2062
|
-
}
|
2063
|
-
}(this, function ErrorStackParser(StackFrame) {
|
2064
|
-
'use strict';
|
2065
|
-
|
2066
|
-
var FIREFOX_SAFARI_STACK_REGEXP = /\S+\:\d+/;
|
2067
|
-
var CHROME_IE_STACK_REGEXP = /\s+at /;
|
2068
|
-
var map, filter;
|
2069
|
-
|
2070
|
-
if (Array.prototype.map) {
|
2071
|
-
map = function (arr, fn) {
|
2072
|
-
return arr.map(fn);
|
2073
|
-
};
|
2074
|
-
} else {
|
2075
|
-
map = function (arr, fn) {
|
2076
|
-
var i;
|
2077
|
-
var len = arr.length;
|
2078
|
-
var ret = [];
|
2079
|
-
|
2080
|
-
for (i = 0; i < len; ++i) {
|
2081
|
-
ret.push(fn(arr[i]));
|
2082
|
-
}
|
2083
|
-
return ret;
|
2084
|
-
};
|
2085
|
-
}
|
2086
|
-
|
2087
|
-
if (Array.prototype.filter) {
|
2088
|
-
filter = function (arr, fn) {
|
2089
|
-
return arr.filter(fn);
|
2090
|
-
};
|
2091
|
-
} else {
|
2092
|
-
filter = function (arr, fn) {
|
2093
|
-
var i;
|
2094
|
-
var len = arr.length;
|
2095
|
-
var ret = [];
|
2096
|
-
for (i = 0; i < len; ++i) {
|
2097
|
-
if (fn(arr[i])) {
|
2098
|
-
ret.push(arr[i]);
|
2099
|
-
}
|
2100
|
-
}
|
2101
|
-
return ret;
|
2102
|
-
};
|
2103
|
-
}
|
2104
|
-
|
2105
|
-
return {
|
2106
|
-
/**
|
2107
|
-
* Given an Error object, extract the most information from it.
|
2108
|
-
* @param error {Error}
|
2109
|
-
* @return Array[StackFrame]
|
2110
|
-
*/
|
2111
|
-
parse: function ErrorStackParser$$parse(error) {
|
2112
|
-
if (typeof error.stacktrace !== 'undefined' || typeof error['opera#sourceloc'] !== 'undefined') {
|
2113
|
-
return this.parseOpera(error);
|
2114
|
-
} else if (error.stack && error.stack.match(CHROME_IE_STACK_REGEXP)) {
|
2115
|
-
return this.parseV8OrIE(error);
|
2116
|
-
} else if (error.stack && error.stack.match(FIREFOX_SAFARI_STACK_REGEXP)) {
|
2117
|
-
return this.parseFFOrSafari(error);
|
2118
|
-
} else {
|
2119
|
-
throw new Error('Cannot parse given Error object');
|
2120
|
-
}
|
2121
|
-
},
|
2122
|
-
|
2123
|
-
/**
|
2124
|
-
* Separate line and column numbers from a URL-like string.
|
2125
|
-
* @param urlLike String
|
2126
|
-
* @return Array[String]
|
2127
|
-
*/
|
2128
|
-
extractLocation: function ErrorStackParser$$extractLocation(urlLike) {
|
2129
|
-
// Fail-fast but return locations like "(native)"
|
2130
|
-
if (urlLike.indexOf(':') === -1) {
|
2131
|
-
return [urlLike];
|
2132
|
-
}
|
2133
|
-
|
2134
|
-
var locationParts = urlLike.replace(/[\(\)\s]/g, '').split(':');
|
2135
|
-
var lastNumber = locationParts.pop();
|
2136
|
-
var possibleNumber = locationParts[locationParts.length - 1];
|
2137
|
-
if (!isNaN(parseFloat(possibleNumber)) && isFinite(possibleNumber)) {
|
2138
|
-
var lineNumber = locationParts.pop();
|
2139
|
-
return [locationParts.join(':'), lineNumber, lastNumber];
|
2140
|
-
} else {
|
2141
|
-
return [locationParts.join(':'), lastNumber, undefined];
|
2142
|
-
}
|
2143
|
-
},
|
2144
|
-
|
2145
|
-
parseV8OrIE: function ErrorStackParser$$parseV8OrIE(error) {
|
2146
|
-
var extractLocation = this.extractLocation;
|
2147
|
-
var mapped = map(error.stack.split('\n').slice(1), function (line) {
|
2148
|
-
var tokens = line.replace(/^\s+/, '').split(/\s+/).slice(1);
|
2149
|
-
var locationParts = extractLocation(tokens.pop());
|
2150
|
-
var functionName = (!tokens[0] || tokens[0] === 'Anonymous') ? undefined : tokens[0];
|
2151
|
-
return new StackFrame(functionName, undefined, locationParts[0], locationParts[1], locationParts[2]);
|
2152
|
-
});
|
2153
|
-
return mapped;
|
2154
|
-
},
|
2155
|
-
|
2156
|
-
parseFFOrSafari: function ErrorStackParser$$parseFFOrSafari(error) {
|
2157
|
-
var filtered = filter(error.stack.split('\n'), function (line) {
|
2158
|
-
return !!line.match(FIREFOX_SAFARI_STACK_REGEXP);
|
2159
|
-
});
|
2160
|
-
var extractLocation = this.extractLocation;
|
2161
|
-
var mapped = map(filtered, function (line) {
|
2162
|
-
var tokens = line.split('@');
|
2163
|
-
var locationParts = extractLocation(tokens.pop());
|
2164
|
-
var functionName = tokens.shift() || undefined;
|
2165
|
-
return new StackFrame(functionName, undefined, locationParts[0], locationParts[1], locationParts[2]);
|
2166
|
-
});
|
2167
|
-
return mapped;
|
2168
|
-
},
|
2169
|
-
|
2170
|
-
parseOpera: function ErrorStackParser$$parseOpera(e) {
|
2171
|
-
if (!e.stacktrace || (e.message.indexOf('\n') > -1 &&
|
2172
|
-
e.message.split('\n').length > e.stacktrace.split('\n').length)) {
|
2173
|
-
return this.parseOpera9(e);
|
2174
|
-
} else if (!e.stack) {
|
2175
|
-
return this.parseOpera10(e);
|
2176
|
-
} else {
|
2177
|
-
return this.parseOpera11(e);
|
2178
|
-
}
|
2179
|
-
},
|
2180
|
-
|
2181
|
-
parseOpera9: function ErrorStackParser$$parseOpera9(e) {
|
2182
|
-
var lineRE = /Line (\d+).*script (?:in )?(\S+)/i;
|
2183
|
-
var lines = e.message.split('\n');
|
2184
|
-
var result = [];
|
2185
|
-
|
2186
|
-
for (var i = 2, len = lines.length; i < len; i += 2) {
|
2187
|
-
var match = lineRE.exec(lines[i]);
|
2188
|
-
if (match) {
|
2189
|
-
result.push(new StackFrame(undefined, undefined, match[2], match[1]));
|
2190
|
-
}
|
2191
|
-
}
|
2192
|
-
|
2193
|
-
return result;
|
2194
|
-
},
|
2195
|
-
|
2196
|
-
parseOpera10: function ErrorStackParser$$parseOpera10(e) {
|
2197
|
-
var lineRE = /Line (\d+).*script (?:in )?(\S+)(?:: In function (\S+))?$/i;
|
2198
|
-
var lines = e.stacktrace.split('\n');
|
2199
|
-
var result = [];
|
2200
|
-
|
2201
|
-
for (var i = 0, len = lines.length; i < len; i += 2) {
|
2202
|
-
var match = lineRE.exec(lines[i]);
|
2203
|
-
if (match) {
|
2204
|
-
result.push(new StackFrame(match[3] || undefined, undefined, match[2], match[1]));
|
2205
|
-
}
|
2206
|
-
}
|
2207
|
-
|
2208
|
-
return result;
|
2209
|
-
},
|
2210
|
-
|
2211
|
-
// Opera 10.65+ Error.stack very similar to FF/Safari
|
2212
|
-
parseOpera11: function ErrorStackParser$$parseOpera11(error) {
|
2213
|
-
var filtered = filter(error.stack.split('\n'), function (line) {
|
2214
|
-
return !!line.match(FIREFOX_SAFARI_STACK_REGEXP) && !line.match(/^Error created at/);
|
2215
|
-
});
|
2216
|
-
var extractLocation = this.extractLocation;
|
2217
|
-
var mapped = map(filtered, function (line) {
|
2218
|
-
var tokens = line.split('@');
|
2219
|
-
var locationParts = extractLocation(tokens.pop());
|
2220
|
-
var functionCall = (tokens.shift() || '');
|
2221
|
-
var functionName = functionCall
|
2222
|
-
.replace(/<anonymous function(: (\w+))?>/, '$2')
|
2223
|
-
.replace(/\([^\)]*\)/g, '') || undefined;
|
2224
|
-
var argsRaw;
|
2225
|
-
if (functionCall.match(/\(([^\)]*)\)/)) {
|
2226
|
-
argsRaw = functionCall.replace(/^[^\(]+\(([^\)]*)\)$/, '$1');
|
2227
|
-
}
|
2228
|
-
var args = (argsRaw === undefined || argsRaw === '[arguments not available]') ? undefined : argsRaw.split(',');
|
2229
|
-
return new StackFrame(functionName, args, locationParts[0], locationParts[1], locationParts[2]);
|
2230
|
-
});
|
2231
|
-
return mapped;
|
2232
|
-
}
|
2233
|
-
};
|
2234
|
-
}));
|
2235
|
-
|
2236
|
-
|
2237
|
-
|
2238
|
-
/***/ },
|
2239
|
-
/* 9 */
|
2240
|
-
/***/ function(module, exports, __webpack_require__) {
|
2241
|
-
|
2242
|
-
var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;(function (root, factory) {
|
2243
|
-
'use strict';
|
2244
|
-
// Universal Module Definition (UMD) to support AMD, CommonJS/Node.js, Rhino, and browsers.
|
2245
|
-
if (true) {
|
2246
|
-
!(__WEBPACK_AMD_DEFINE_ARRAY__ = [], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory), __WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ? (__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));
|
2247
|
-
} else if (typeof exports === 'object') {
|
2248
|
-
module.exports = factory();
|
2249
|
-
} else {
|
2250
|
-
root.StackFrame = factory();
|
2251
|
-
}
|
2252
|
-
}(this, function () {
|
2253
|
-
'use strict';
|
2254
|
-
function _isNumber(n) {
|
2255
|
-
return !isNaN(parseFloat(n)) && isFinite(n);
|
2256
|
-
}
|
2257
|
-
|
2258
|
-
function StackFrame(functionName, args, fileName, lineNumber, columnNumber) {
|
2259
|
-
if (functionName !== undefined) {
|
2260
|
-
this.setFunctionName(functionName);
|
2261
|
-
}
|
2262
|
-
if (args !== undefined) {
|
2263
|
-
this.setArgs(args);
|
2264
|
-
}
|
2265
|
-
if (fileName !== undefined) {
|
2266
|
-
this.setFileName(fileName);
|
2267
|
-
}
|
2268
|
-
if (lineNumber !== undefined) {
|
2269
|
-
this.setLineNumber(lineNumber);
|
2270
|
-
}
|
2271
|
-
if (columnNumber !== undefined) {
|
2272
|
-
this.setColumnNumber(columnNumber);
|
2273
|
-
}
|
2274
|
-
}
|
2275
|
-
|
2276
|
-
StackFrame.prototype = {
|
2277
|
-
getFunctionName: function () {
|
2278
|
-
return this.functionName;
|
2279
|
-
},
|
2280
|
-
setFunctionName: function (v) {
|
2281
|
-
this.functionName = String(v);
|
2282
|
-
},
|
2283
|
-
|
2284
|
-
getArgs: function () {
|
2285
|
-
return this.args;
|
2286
|
-
},
|
2287
|
-
setArgs: function (v) {
|
2288
|
-
if (Object.prototype.toString.call(v) !== '[object Array]') {
|
2289
|
-
throw new TypeError('Args must be an Array');
|
2290
|
-
}
|
2291
|
-
this.args = v;
|
2292
|
-
},
|
2293
|
-
|
2294
|
-
// NOTE: Property name may be misleading as it includes the path,
|
2295
|
-
// but it somewhat mirrors V8's JavaScriptStackTraceApi
|
2296
|
-
// https://code.google.com/p/v8/wiki/JavaScriptStackTraceApi and Gecko's
|
2297
|
-
// http://mxr.mozilla.org/mozilla-central/source/xpcom/base/nsIException.idl#14
|
2298
|
-
getFileName: function () {
|
2299
|
-
return this.fileName;
|
2300
|
-
},
|
2301
|
-
setFileName: function (v) {
|
2302
|
-
this.fileName = String(v);
|
2303
|
-
},
|
2304
|
-
|
2305
|
-
getLineNumber: function () {
|
2306
|
-
return this.lineNumber;
|
2307
|
-
},
|
2308
|
-
setLineNumber: function (v) {
|
2309
|
-
if (!_isNumber(v)) {
|
2310
|
-
throw new TypeError('Line Number must be a Number');
|
2311
|
-
}
|
2312
|
-
this.lineNumber = Number(v);
|
2313
|
-
},
|
2314
|
-
|
2315
|
-
getColumnNumber: function () {
|
2316
|
-
return this.columnNumber;
|
2317
|
-
},
|
2318
|
-
setColumnNumber: function (v) {
|
2319
|
-
if (!_isNumber(v)) {
|
2320
|
-
throw new TypeError('Column Number must be a Number');
|
2321
|
-
}
|
2322
|
-
this.columnNumber = Number(v);
|
2323
|
-
},
|
2324
|
-
|
2325
|
-
toString: function() {
|
2326
|
-
var functionName = this.getFunctionName() || '{anonymous}';
|
2327
|
-
var args = '(' + (this.getArgs() || []).join(',') + ')';
|
2328
|
-
var fileName = this.getFileName() ? ('@' + this.getFileName()) : '';
|
2329
|
-
var lineNumber = _isNumber(this.getLineNumber()) ? (':' + this.getLineNumber()) : '';
|
2330
|
-
var columnNumber = _isNumber(this.getColumnNumber()) ? (':' + this.getColumnNumber()) : '';
|
2331
|
-
return functionName + args + fileName + lineNumber + columnNumber;
|
2332
|
-
}
|
2333
|
-
};
|
2334
|
-
|
2335
|
-
return StackFrame;
|
2336
|
-
}));
|
2337
|
-
|
2338
|
-
|
2339
|
-
/***/ }
|
2340
|
-
/******/ ])
|
2341
|
-
});
|
2342
|
-
;
|
2343
|
-
//# sourceMappingURL=rollbar.umd.js.map
|