/
apibase.min.js
1 lines (1 loc) · 7.04 KB
/
apibase.min.js
1
!function(){"use strict";var e,t,n=0,o=1,i=2;if(e=function(e){var o,i=this;"string"==typeof e&&(i._ref=new t.Firebase(e)),"object"==typeof e&&(i._ref=e),i._attributes=[],i._online=!1,i._authState=n,i._pendingResolutions=[],i._methods={},i._user={},i._isServer=!1,i._cleanUpInterval=6e4,i._context={},i._autoAnonymousLogin=!0;for(o in i)i._attributes.push(o);i._ref.child("_meta/online").on("value",function(e){i._online=e.val()?!0:!1})},e.prototype.publish=function(){var e=this._defer(),t=this;t._isServer=!0,this._ref.child("_meta/online").once("value",function(n){if(n.val())throw"A APIBase server is already running at "+t._ref.toString();t._pendingResolutions.push(e.resolve.bind(e)),t._progress()}),e.promise.then(function(){var e,n,o;for(e in t)-1===t._attributes.indexOf(e)&&(t._methods[e]=!0);for(n in t._methods)o=t._ref.child("queue").child("request"),o.child(n).on("child_added",t._handleQueueItem.bind(t)),setInterval(t._cleanUp.bind(t,n),t._cleanUpInterval);t._ref.child("queue").child("request").on("child_added",t._handleMethodType.bind(t)),t._ref.child("_meta/online").on("value",function(e){var n=e.val();n&&t._log("APIBase is listening for requests...")}),t._publicizeStatus()})},e.prototype.get=function(e){return this._createFunction(e)},e.prototype.retrieve=function(){var e={},t=this._defer(),o=this;return this._ref.child("_meta/methods").once("value",function(r){r.forEach(function(t){var n=t.name();e[n]=o._createFunction(n)}),o._authState==n&&o._autoAnonymousLogin&&o._anonymousLogin(),o._authState!==i?(o._pendingResolutions.push(t.resolve.bind(t,e)),o._progress()):t.resolve(e)}),t.promise},e.prototype.auth=function(e,t){var n=this;n._authState=o,n._ref.root().child(".info/authenticated").once("value",function(o){var r=o.val();(!r||t)&&n._ref.auth(e.toString(),function(e,t){if(e)throw e;n._authState=i,n._user=t.auth,n._progress()})})},e.prototype.setUserData=function(e){var t=this;t._ref.root().child(".info/authenticated").once("value",function(n){var o=n.val();if(!o)throw"setUserData should only be called after you've manually authenticated.";t._authState=i,t._user=e,t._progress()})},e.prototype.context=function(e){this._context=e},e.prototype.enableAutoAnonymousLogin=function(e){this._autoAnonymousLogin=e},e.prototype._publicizeStatus=function(){var e=this;e._ref.child("_meta/methods").on("value",function(t){t.ref().set(e._methods)}),e._ref.child("_meta/methods").onDisconnect().remove(),e._ref.child("_meta/online").on("value",function(e){e.ref().set(!0)}),e._ref.child("_meta/online").onDisconnect().set(!1)},e.prototype._progress=function(){var e;if(this._authState!==i)return!1;for(e=0;e<this._pendingResolutions.length;e+=1)this._pendingResolutions[e]();return this._pendingResolutions=[],!0},e.prototype._handleMethodType=function(e){var t=e.name();this._methods[t]||(this._log('Unknown method "'+t+'" was called. Cleaning up...'),e.ref().remove())},e.prototype._handleQueueItem=function(e){var n,o,i=(e.val(),e.ref().parent().name()),r=e.ref().name(),s=this,a=function(n){u.setWithPriority(n,t.Firebase.ServerValue.TIMESTAMP),e.ref().remove()},u=this._ref.child("queue/response").child(i).child(r),l=e.val().args,c=e.val().ctx,h=e.val().uid,f=[];if(!l)return void s._log("ERROR: Request Queue ticket has malformed or no arguments field.");if(!h)return void s._log("ERROR: Request Queue ticket has no UID field.");for("\\apibase.empty\\"==l&&(l=[]),n=0;n<l.length;n+=1)o=l[n],f.push("\\apibase.undefined\\"==o?void 0:"\\apibase.null\\"==o?null:o);this._apply(i,f,c).then(function(e){a({success:e,uid:h})},function(e){s._log("ERROR: "+e),a({error:e,uid:h})})},e.prototype._apply=function(e,n,o){var i,r=t.domain.create(),s=this._defer();return n=n||[],n.push(s.resolve),r.run(function(t){try{i=this[e].apply({ctx:t},n),void 0!==i&&s.resolve(i)}catch(o){s.cancel(o)}}.bind(this,o)),r.on("error",function(e){s.cancel(e)}),s.promise},e.prototype._createFunction=function(e){return this._isServer?this._localFunction.bind(this,e):this._remoteFunction.bind(this,e)},e.prototype._remoteFunction=function(e){var t,o,r=this._defer(),s=Array.prototype.slice.call(arguments,1),a=[];for(o=0;o<s.length;o+=1)t=s[o],a.push("undefined"==typeof t?"\\apibase.undefined\\":null==t?"\\apibase.null\\":t);return a.length||(a="\\apibase.empty\\"),self._authState==n&&self._autoAnonymousLogin&&self._anonymousLogin(),self._authState!==i?(self._pendingResolutions.push(this._triggerRemote.bind(this,e,a,r)),self._progress()):this._triggerRemote(e,a,r),r.promise},e.prototype._triggerRemote=function(e,n,o){var i=this._ref.child("queue/request").child(e).push();i.setWithPriority({args:n,ctx:this._context,uid:this._user.uid},t.Firebase.ServerValue.TIMESTAMP),this._ref.child("queue/response").child(e).child(i.name()).on("value",function(e){var t=e.val();return t?(t.success&&o.resolve.apply(this,[e.val().success]),t.error&&o.cancel.apply(this,[e.val().error]),e.ref().off(),void e.ref().remove()):!1})},e.prototype._localFunction=function(e){{var t=this._defer(),n=Array.prototype.slice.call(arguments,1);this._context}n.push(t.resolve);var o=function(t){var n=t[t.length-1],o=this[e].apply({ctx:this._context},t);void 0!==o&&n(o)}.bind(this,n);return"undefined"!=typeof process?process.nextTick(o):setTimeout(o,0),t.promise},e.prototype._anonymousLogin=function(){var e=this,t=e._ref.toString().match(/https:\/\/(.+)\.firebaseio.com/)[1],n="https://auth.firebase.com/auth/anonymous?transport=jsonp&firebase="+t;e._autoAnonymousLogin&&(e._authState=o,e._fetch(n).then(function(t){if(t.error)throw"Please enable Anonymous Login on your Firebase. (https://www.firebase.com/docs/security/simple-login-anonymous.html)";e.auth(t.token)}))},e.prototype._cleanUp=function(e){this._ref.child("queue/response").child(e).endAt((new Date).valueOf()-this._cleanUpInterval).once("value",function(e){e.numChildren()&&e.forEach(function(e){e.ref().remove()})})},e.prototype._fetch=function(e){var n=this._defer();if(t.request)t.request(e,function(e,t,o){n.resolve(JSON.parse(o))});else{var o=(this._ref.toString().match(/https:\/\/(.+)\.firebaseio.com/)[1],"apibase_"+this._ref.push().name().replace(/-/g,""));window[o]=function(e){n.resolve(e)};var i=document.createElement("script"),r=e+"&callback="+o;i.setAttribute("type","text/javascript"),i.setAttribute("src",r),document.getElementsByTagName("head")[0].appendChild(i)}return n.promise},e.prototype._defer=function(e){var t={};return t._status=0,t.promise={then:function(e,n){t.successCallback=e,t.errorCallback=n,t._status&&t._finish()}},t.resolve=function(){t.args=arguments,t._status=1,t.successCallback&&t._finish()},t.cancel=function(){t.args=arguments,t._status=2,t.errorCallback&&t._finish()},t._finish=function(){1===t._status?t.successCallback.apply(e,t.args):2===t._status&&t.errorCallback.apply(e,t.args)},t},e.prototype._log=function(){("undefined"!=typeof window||"undefined"!=typeof module)&&console.log.apply(this,Array.prototype.slice.call(arguments))},t=this||{},"undefined"!=typeof module&&module.exports)module.exports=function(t){return new e(t)},t.Firebase=require("firebase"),t.domain=require("domain"),t.request=require("request");else{if(t=window,!t.Firebase)throw"Please include Firebase.js";t.APIBase=e}}();