{"version":3,"file":"pubsub.min.js","sources":["pubsub.js"],"sourcesContent":["/*\r\nCopyright (c) 2010,2011,2012 Morgan Roderick http://roderick.dk\r\nLicense: MIT - http://mrgnrdrck.mit-license.org\r\n\r\nhttps://github.com/mroderick/PubSubJS\r\n*/\r\n/*jslint white:true, plusplus:true, stupid:true*/\r\n/*global\r\n\tsetTimeout,\r\n\tmodule,\r\n\texports,\r\n\tdefine,\r\n\trequire,\r\n\twindow\r\n*/\r\n\r\n(function(root, factory){\r\n\t'use strict';\r\n\r\n\t// CommonJS\r\n\tif (typeof exports === 'object'){\r\n\t\tmodule.exports = factory();\r\n\r\n\t// AMD\r\n\t} else if (typeof define === 'function' && define.amd){\r\n\t\tdefine(factory);\r\n\t// Browser\r\n\t} else {\r\n\t\troot.PubSub = factory();\r\n\t}\r\n}( ( typeof window === 'object' && window ) || this, function(){\r\n\r\n\t'use strict';\r\n\r\n\tvar PubSub = {\r\n\t\t\tname: 'PubSubJS',\r\n\t\t\tversion: '1.3.4'\r\n\t\t},\r\n\t\tmessages = {},\r\n\t\tlastUid = -1;\r\n\r\n\t/**\r\n\t *\tReturns a function that throws the passed exception, for use as argument for setTimeout\r\n\t *\t@param { Object } ex An Error object\r\n\t */\r\n\tfunction throwException( ex ){\r\n\t\treturn function reThrowException(){\r\n\t\t\tthrow ex;\r\n\t\t};\r\n\t}\r\n\r\n\tfunction callSubscriberWithDelayedExceptions( subscriber, message, data ){\r\n\t\ttry {\r\n\t\t\tsubscriber( message, data );\r\n\t\t} catch( ex ){\r\n\t\t\tsetTimeout( throwException( ex ), 0);\r\n\t\t}\r\n\t}\r\n\r\n\tfunction callSubscriberWithImmediateExceptions( subscriber, message, data ){\r\n\t\tsubscriber( message, data );\r\n\t}\r\n\r\n\tfunction deliverMessage( originalMessage, matchedMessage, data, immediateExceptions ){\r\n\t\tvar subscribers = messages[matchedMessage],\r\n\t\t\tcallSubscriber = immediateExceptions ? callSubscriberWithImmediateExceptions : callSubscriberWithDelayedExceptions,\r\n\t\t\ti, j;\r\n\r\n\t\tif ( !messages.hasOwnProperty( matchedMessage ) ) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tfor ( i = 0, j = subscribers.length; i < j; i++ ){\r\n\t\t\tcallSubscriber( subscribers[i].func, originalMessage, data );\r\n\t\t}\r\n\t}\r\n\r\n\tfunction createDeliveryFunction( message, data, immediateExceptions ){\r\n\t\treturn function deliverNamespaced(){\r\n\t\t\tvar topic = String( message ),\r\n\t\t\t\tposition = topic.lastIndexOf( '.' );\r\n\r\n\t\t\t// deliver the message as it is now\r\n\t\t\tdeliverMessage(message, message, data, immediateExceptions);\r\n\r\n\t\t\t// trim the hierarchy and deliver message to each level\r\n\t\t\twhile( position !== -1 ){\r\n\t\t\t\ttopic = topic.substr( 0, position );\r\n\t\t\t\tposition = topic.lastIndexOf('.');\r\n\t\t\t\tdeliverMessage( message, topic, data );\r\n\t\t\t}\r\n\t\t};\r\n\t}\r\n\r\n\tfunction messageHasSubscribers( message ){\r\n\t\tvar topic = String( message ),\r\n\t\t\tfound = messages.hasOwnProperty( topic ),\r\n\t\t\tposition = topic.lastIndexOf( '.' );\r\n\r\n\t\twhile ( !found && position !== -1 ){\r\n\t\t\ttopic = topic.substr( 0, position );\r\n\t\t\tposition = topic.lastIndexOf('.');\r\n\t\t\tfound = messages.hasOwnProperty( topic );\r\n\t\t}\r\n\r\n\t\treturn found;\r\n\t}\r\n\r\n\tfunction publish( message, data, sync, immediateExceptions ){\r\n\t\tvar deliver = createDeliveryFunction( message, data, immediateExceptions ),\r\n\t\t\thasSubscribers = messageHasSubscribers( message );\r\n\r\n\t\tif ( !hasSubscribers ){\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\tif ( sync === true ){\r\n\t\t\tdeliver();\r\n\t\t} else {\r\n\t\t\tsetTimeout( deliver, 0 );\r\n\t\t}\r\n\t\treturn true;\r\n\t}\r\n\r\n\t/**\r\n\t *\tPubSub.publish( message[, data] ) -> Boolean\r\n\t *\t- message (String): The message to publish\r\n\t *\t- data: The data to pass to subscribers\r\n\t *\tPublishes the the message, passing the data to it's subscribers\r\n\t**/\r\n\tPubSub.publish = function( message, data ){\r\n\t\treturn publish( message, data, false, PubSub.immediateExceptions );\r\n\t};\r\n\r\n\t/**\r\n\t *\tPubSub.publishSync( message[, data] ) -> Boolean\r\n\t *\t- message (String): The message to publish\r\n\t *\t- data: The data to pass to subscribers\r\n\t *\tPublishes the the message synchronously, passing the data to it's subscribers\r\n\t**/\r\n\tPubSub.publishSync = function( message, data ){\r\n\t\treturn publish( message, data, true, PubSub.immediateExceptions );\r\n\t};\r\n\r\n\t/**\r\n\t *\tPubSub.subscribe( message, func ) -> String\r\n\t *\t- message (String): The message to subscribe to\r\n\t *\t- func (Function): The function to call when a new message is published\r\n\t *\tSubscribes the passed function to the passed message. Every returned token is unique and should be stored if\r\n\t *\tyou need to unsubscribe\r\n\t**/\r\n\tPubSub.subscribe = function( message, func ){\r\n\t\t// message is not registered yet\r\n\t\tif ( !messages.hasOwnProperty( message ) ){\r\n\t\t\tmessages[message] = [];\r\n\t\t}\r\n\r\n\t\t// forcing token as String, to allow for future expansions without breaking usage\r\n\t\t// and allow for easy use as key names for the 'messages' object\r\n\t\tvar token = String(++lastUid);\r\n\t\tmessages[message].push( { token : token, func : func } );\r\n\r\n\t\t// return token for unsubscribing\r\n\t\treturn token;\r\n\t};\r\n\r\n\t/**\r\n\t *\tPubSub.unsubscribe( tokenOrFunction ) -> String | Boolean\r\n\t * - tokenOrFunction (String|Function): The token of the function to unsubscribe or func passed in on subscribe\r\n\t * Unsubscribes a specific subscriber from a specific message using the unique token\r\n\t * or if using Function as argument, it will remove all subscriptions with that function\r\n\t**/\r\n\tPubSub.unsubscribe = function( tokenOrFunction ){\r\n\t\tvar isToken = typeof tokenOrFunction === 'string',\r\n\t\t\tkey = isToken ? 'token' : 'func',\r\n\t\t\tsuccesfulReturnValue = isToken ? tokenOrFunction : true,\r\n\r\n\t\t\tresult = false,\r\n\t\t\tm, i;\r\n\r\n\t\tfor ( m in messages ){\r\n\t\t\tif ( messages.hasOwnProperty( m ) ){\r\n\t\t\t\tfor ( i = messages[m].length-1 ; i >= 0; i-- ){\r\n\t\t\t\t\tif ( messages[m][i][key] === tokenOrFunction ){\r\n\t\t\t\t\t\tmessages[m].splice( i, 1 );\r\n\t\t\t\t\t\tresult = succesfulReturnValue;\r\n\r\n\t\t\t\t\t\t// tokens are unique, so we can just return here\r\n\t\t\t\t\t\tif ( isToken ){\r\n\t\t\t\t\t\t\treturn result;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn result;\r\n\t};\r\n\r\n\treturn PubSub;\r\n}));"],"names":["root","factory","exports","module","define","amd","PubSub","window","this","name","version","messages","lastUid","callSubscriberWithDelayedExceptions","subscriber","message","data","ex","setTimeout","callSubscriberWithImmediateExceptions","deliverMessage","originalMessage","matchedMessage","immediateExceptions","i","j","subscribers","callSubscriber","hasOwnProperty","length","func","publish","sync","deliver","topic","String","position","lastIndexOf","substr","found","messageHasSubscribers","publishSync","subscribe","token","push","unsubscribe","tokenOrFunction","m","isToken","key","succesfulReturnValue","result","splice"],"mappings":"CAgBC,SAASA,EAAMC,gBAIQ,iBAAZC,QACVC,OAAOD,QAAUD,IAGW,mBAAXG,QAAyBA,OAAOC,IACjDD,OAAOH,GAGPD,EAAKM,OAASL,IAZhB,CAcuB,iBAAXM,QAAuBA,QAAYC,KAAM,wBAIpD,IAAIF,EAAS,CACXG,KAAM,WACNC,QAAS,SAEVC,EAAW,GACXC,GAAW,EAYZ,SAASC,EAAqCC,EAAYC,EAASC,GAClE,IACCF,EAAYC,EAASC,GACpB,MAAOC,GACRC,YAVuBD,EAUKA,EATtB,WACN,MAAMA,IAQ4B,GAVpC,IAAyBA,EAczB,SAASE,EAAuCL,EAAYC,EAASC,GACpEF,EAAYC,EAASC,GAGtB,SAASI,EAAgBC,EAAiBC,EAAgBN,EAAMO,GAC/D,IAECC,EAAGC,EAFAC,EAAcf,EAASW,GAC1BK,EAAiBJ,EAAsBJ,EAAwCN,EAGhF,GAAMF,EAASiB,eAAgBN,GAI/B,IAAME,EAAI,EAAGC,EAAIC,EAAYG,OAAQL,EAAIC,EAAGD,IAC3CG,EAAgBD,EAAYF,GAAGM,KAAMT,EAAiBL,GAmCxD,SAASe,EAAShB,EAASC,EAAMgB,EAAMT,GA/BGP,EAgCMA,EAhCAO,EAgCMA,EAArD,IAhCgCR,EAASC,EAAMO,EAgC3CU,EA/BG,WACN,IAAIC,EAAQC,OAAQpB,GACnBqB,EAAWF,EAAMG,YAAa,KAM/B,IAHAjB,EAAeL,EAASA,EAASC,EAAMO,IAGlB,IAAda,GAENA,GADAF,EAAQA,EAAMI,OAAQ,EAAGF,IACRC,YAAY,KAC7BjB,EAAgBL,EAASmB,EAAOlB,IAuBlC,QAlBD,SAAgCD,GAK/B,IAJA,IAAImB,EAAQC,OAAQpB,GACnBwB,EAAQ5B,EAASiB,eAAgBM,GACjCE,EAAWF,EAAMG,YAAa,MAEtBE,IAAuB,IAAdH,GAEjBA,GADAF,EAAQA,EAAMI,OAAQ,EAAGF,IACRC,YAAY,KAC7BE,EAAQ5B,EAASiB,eAAgBM,GAGlC,OAAOK,EAKWC,CAjCczB,EAgCMA,MAOxB,IAATiB,EACJC,IAEAf,WAAYe,EAAS,IAEf,GA8ER,OArEA3B,EAAOyB,QAAU,SAAUhB,EAASC,GACnC,OAAOe,EAAShB,EAASC,GAAM,EAAOV,EAAOiB,sBAS9CjB,EAAOmC,YAAc,SAAU1B,EAASC,GACvC,OAAOe,EAAShB,EAASC,GAAM,EAAMV,EAAOiB,sBAU7CjB,EAAOoC,UAAY,SAAU3B,EAASe,GAE/BnB,EAASiB,eAAgBb,KAC9BJ,EAASI,GAAW,IAKrB,IAAI4B,EAAQR,SAASvB,GAIrB,OAHAD,EAASI,GAAS6B,KAAM,CAAED,MAAQA,EAAOb,KAAOA,IAGzCa,GASRrC,EAAOuC,YAAc,SAAUC,GAC9B,IAKCC,EAAGvB,EALAwB,EAAqC,iBAApBF,EACpBG,EAAMD,EAAU,QAAU,OAC1BE,GAAuBF,GAAUF,EAEjCK,GAAS,EAGV,IAAMJ,KAAKpC,EACV,GAAKA,EAASiB,eAAgBmB,GAC7B,IAAMvB,EAAIb,EAASoC,GAAGlB,OAAO,EAAS,GAALL,EAAQA,IACxC,GAAKb,EAASoC,GAAGvB,GAAGyB,KAASH,IAC5BnC,EAASoC,GAAGK,OAAQ5B,EAAG,GACvB2B,EAASD,EAGJF,GACJ,OAAOG,EAOZ,OAAOA,GAGD7C"}