{"version":3,"sources":["jsdelivr-header.js","/npm/youjs@0.0.7/lib/server.js"],"names":[],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA,ACNA,IAAI,SAAW,QAAQ,aACnB,OAAS,QAAQ,UACjB,OAAS,QAAQ,eAEjB,MAAQ,SAAS,GACnB,KAAK,KAAK,EACZ,EAEI,KAAO,CACT,QAAS,SAAS,EAAS,GACzB,IAAI,EAAS,GACb,GAAmB,iBAAR,EACT,IAAK,IAAI,KAAY,EACnB,GAA6B,mBAAlB,EAAI,IAIf,GAA6B,iBAAlB,EAAI,GAEb,IADA,IAAI,EAAO,KAAK,QAAQ,EAAU,IAAM,EAAU,EAAI,IAC7C,EAAE,EAAG,EAAE,EAAK,OAAQ,IAC3B,EAAO,KAAK,EAAK,SANnB,EAAO,KAAK,EAAU,IAAM,GAWlC,OAAO,CACT,EACA,aAAc,SAAS,EAAS,GAC9B,IAAI,EAAO,EAAI,MAAM,KACjB,EAAK,OAAS,GAAwB,IAAnB,EAAK,GAAG,QAAc,EAAK,QAClD,IAAK,IAAI,EAAE,EAAG,EAAE,EAAK,OAAQ,IAAK,CAChC,IAAI,EAAQ,EAAK,GACjB,GAA8B,mBAAnB,EAAQ,GACjB,OAAO,EAAQ,GAEjB,GAA8B,iBAAnB,EAAQ,GAAqB,CACtC,EAAK,QACL,IAAI,EAAS,EAAK,KAAK,KACvB,OAAO,KAAK,aAAa,EAAQ,GAAQ,EAC3C,CACA,OAAO,IACT,CACF,EACA,YAAa,SAAS,EAAQ,GAC5B,EAAO,KAAO,EACd,IAAK,IAAI,EAAE,EAAG,EAAE,EAAK,OAAQ,IAAK,CAChC,IAAI,EAAM,EAAK,GACX,EAAO,EAAI,MAAM,KACrB,GAA0B,iBAAf,EAAO,IAEhB,IADA,IAAI,EAAgB,EAAO,IAClB,EAAE,EAAG,EAAE,EAAK,OAAQ,IAAK,CAChC,IAAI,EAAQ,EAAK,GACjB,GAAqB,iBAAV,GAAuC,IAAjB,EAAM,OAAvC,CACA,IAAI,EAAc,IAAM,EAAK,OAAQ,OACD,IAAzB,EAAc,IACH,IAAhB,GACF,EAAc,GAAS,WACrB,IAAI,EAAK,EAAO,OACZ,EAAO,GACP,EAAK,KACT,IAAK,IAAI,KAAU,UAAW,CAC5B,IAAI,EAAM,UAAU,GACD,mBAAR,EACT,EAAK,KAAK,GAEV,EAAK,CAET,CACA,EAAO,MAAM,GAAM,EACnB,EAAO,OAAO,KAAK,UAAW,CAAC,IAAK,KAAK,IAAK,GAAI,EAAI,KAAM,GAC9D,EAAE,KAAK,CAAC,IAAK,IACb,EAAgB,EAAO,MAEvB,EAAc,GAAS,CAAC,EACxB,EAAgB,EAAc,IAGI,iBAAzB,EAAc,KACvB,EAAgB,EAAc,GA1B2B,CA6B/D,MAEA,QAAQ,IAAI,qCAAsC,EAAO,IAE7D,CACF,EACA,iBAAkB,SAAS,EAAO,GAChC,GAAI,GAAU,EAAO,KAAO,GAAS,EAAM,IACzC,GAAI,EAAM,QAAQ,EAAO,UAEvB,IADA,IAAI,EAAO,EAAO,KACT,EAAE,EAAG,EAAE,EAAK,OAAQ,IAAK,CAChC,IAAI,EAAM,EAAK,GACX,EAAO,EAAI,MAAM,KACjB,EAAgB,EAAM,IAC1B,EAAM,KAAK,EAAK,KAAM,EACtB,IAAK,IAAI,EAAE,EAAG,EAAE,EAAK,OAAQ,IAAK,CAChC,IAAI,EAAQ,EAAK,GACjB,GAAqB,iBAAV,GAAuC,IAAjB,EAAM,OAAvC,CACA,IAAI,EAAc,IAAM,EAAK,OAAQ,OACD,IAAzB,EAAc,IACH,IAAhB,GACF,EAAc,GAAS,WACrB,IAAK,IAAI,KAAY,EAAM,QAAS,CAClC,IAAI,EAAS,EAAM,QAAQ,GACvB,EAAS,UACb,EAAO,MAAM,WACX,IAAI,EAAK,KAAK,aAAa,KAAK,OAAO,IAAK,KAAK,KACjD,GAAkB,mBAAP,EAAmB,CAC5B,IAAI,EAAO,GACX,IAAK,IAAI,KAAU,KAAK,OAAQ,EAAK,KAAK,KAAK,OAAO,IACtD,EAAG,MAAM,EAAQ,EACnB,MACE,QAAQ,IAAI,mBAAqB,KAAK,OAAO,SAAW,oBAAsB,KAAK,MAAQ,UAAY,KAAK,IAAM,2BAA4B,KAAK,OAAO,IAE9J,EAAE,KAAK,CAAC,OAAQ,EAAQ,MAAO,KAAK,MAAO,IAAK,KAAK,IAAK,OAAQ,IACpE,CACF,EAAE,KAAK,CAAC,MAAO,EAAO,IAAK,IAC3B,EAAgB,EAAM,MAEtB,EAAc,GAAS,CAAC,EACxB,EAAgB,EAAc,IAGI,iBAAzB,EAAc,KACvB,EAAgB,EAAc,GA3B2B,CA8B/D,CACF,MAEA,QAAQ,IAAI,4DAA8D,EAAO,SAAW,2BAA6B,EAAM,WAGjI,QAAQ,IAAI,6EAEhB,GAGF,MAAM,UAAY,CAEhB,KAAM,SAAS,GAEb,IAAI,EAAO,KACX,KAAK,YAAY,GACjB,IAAI,EAAK,SAAS,OAAO,GACzB,EAAG,IAAI,YAAa,GACpB,KAAK,OAAS,EACd,KAAK,QAAU,CAAC,EAChB,KAAK,OAAS,CAAC,EACf,KAAK,OAAS,IAAI,OAAO,aAGzB,KAAK,SAAW,KAAK,SAAS,YAE9B,EAAG,QAAQ,GAAG,cAAc,SAAU,GAGpC,IAAI,EAAS,CACX,SAAU,EAAO,GACjB,OAAQ,EACR,IAAK,CAAC,EACN,KAAM,GACN,MAAO,CAAC,EACR,KAAM,EACN,OAAQ,IAAI,OAAO,aACnB,SAAS,EACT,MAAO,SAAS,GACd,GAAI,EACF,IAAqB,IAAjB,KAAK,QACP,QACK,CACL,IAAI,EAAO,KACX,KAAK,OAAO,KAAK,SAAS,WACxB,EAAK,SAAU,EACf,GACF,GACF,CAEJ,GAGF,EAAK,QAAQ,EAAO,UAAY,EAChC,EAAK,SAAS,KAAK,EAAO,UAC1B,EAAK,OAAO,KAAK,UAAW,GAG5B,EAAO,GAAG,cAAc,WACtB,QAAQ,IAAI,iCAAmC,EAAO,GAAK,kBAC3D,EAAK,mBAAmB,EAAO,GACjC,IAGA,EAAO,GAAG,QAAQ,SAAS,GACzB,IAAI,EAAS,EAAK,UAAU,EAAO,IAEvB,MAAR,GAAgB,aAAgB,OAClC,KAAK,YAAY,EAAQ,GACzB,KAAK,iBAAiB,EAAK,SAAU,GACrC,EAAO,SAAU,EACjB,EAAO,OAAO,KAAK,SACnB,EAAK,OAAO,KAAK,cAAe,EAAO,WAEvC,QAAQ,IAAI,0DAEhB,IAEA,EAAO,GAAG,YAAY,SAAS,GAE7B,GAAI,GAAoB,OAAZ,EAAK,IAA6B,OAAd,EAAK,KAAe,CAClD,IAAI,EAAS,EAAK,UAAU,EAAO,IAC/B,EAAO,MAAM,EAAK,KAEpB,EAAO,MAAM,EAAK,IAAI,MAAM,EAAQ,EAAK,KAK7C,CACF,IAGA,EAAO,GAAG,WAAW,SAAS,GAC5B,GAAI,GAAqB,OAAb,EAAK,KAA8B,OAAd,EAAK,KAAe,CAanD,EAAK,KAAK,MAZD,WACP,IAAI,EAAS,CACX,GAAI,EAAK,GACT,KAAM,IAER,IAAK,IAAI,KAAU,UACgB,mBAAtB,UAAU,IACnB,EAAO,KAAK,KAAK,UAAU,IAG/B,EAAO,KAAK,WAAY,EAC1B,IAIA,IAAI,EAAK,KAAK,aAAa,EAAK,OAAO,EAAK,KAAK,IAAK,EAAK,KACvD,EAAQ,EAAK,QAAQ,EAAO,IACd,mBAAP,EACT,EAAG,MAAM,EAAO,EAAK,MAErB,QAAQ,IAAI,kCAAoC,EAAK,IAAM,aAAe,EAAK,IAEnF,CACF,GACF,GACF,EAGA,cAAe,SAAS,GACtB,IAAI,EAAO,KACX,GAAI,EAAK,QAAQ,GAAW,CAC1B,IACI,EADS,KAAK,QAAQ,GACN,OAGpB,IAAK,IAAI,KAAa,EAAK,OAAQ,CACjC,IAAI,EAAS,CAAC,EACV,EAAY,EAAK,OAAO,GAAW,KAEvC,GAAI,EAAK,OAAO,GAAW,QAAQ,GAAW,CAG5C,IAFA,IAAI,EAAO,KAAK,QAAQ,GAAI,EAAK,OAAO,GAAW,KAC/C,EAAS,GACJ,EAAE,EAAG,EAAE,EAAK,OAAQ,KACA,IAAvB,EAAU,EAAK,KAAc,EAAO,KAAK,EAAK,IAEpD,EAAO,GAAa,CACtB,CAGA,EAAO,KAAK,OAAQ,EACtB,CACF,MACE,QAAQ,IAAI,mDAAqD,EAAW,wCAEhF,EAGA,SAAU,SAAS,GACjB,IAAI,EAAO,KACX,IAAK,KAAK,OAAO,GAAY,CAC3B,IAAI,EAAQ,CACV,KAAM,EACN,QAAS,CAAC,EACV,KAAM,CAAC,EACP,IAAK,CAAC,EACN,KAAM,SAAS,GACT,EAAK,QAAQ,KACf,QAAQ,IAAI,iCAAmC,EAAW,qBAAuB,GACjF,EAAK,OAAO,GAAW,QAAQ,GAAY,EAAK,QAAQ,GACxD,KAAK,iBAAiB,EAAK,OAAO,GAAY,EAAK,QAAQ,IAC3D,EAAK,cAAc,GAEvB,EACA,MAAO,SAAS,GACd,KAAK,QAAQ,GAAY,YAClB,KAAK,QAAQ,EACtB,GAEF,EAAK,OAAO,GAAa,CAC3B,CACA,OAAO,KAAK,OAAO,EACrB,EAGA,YAAa,SAAS,GACpB,KAAK,OAAO,GAAa,YAClB,KAAK,OAAO,EACrB,EAGA,UAAW,SAAS,GAClB,QAAsC,IAA3B,KAAK,QAAQ,GACtB,OAAO,KAAK,QAAQ,EAExB,EAGA,mBAAoB,SAAS,GAE3B,IAAK,IAAI,KAAa,KAAK,OACrB,KAAK,OAAO,GAAW,QAAQ,IAAW,KAAK,OAAO,GAAW,MAAM,GACvE,KAAK,QAAQ,KACf,KAAK,QAAQ,GAAY,YAClB,KAAK,QAAQ,GAG1B,EAGA,YAAa,SAAS,GAEpB,QAAI,IAAuB,EAAQ,CAEjC,IAAI,EAAa,UAAY,aACzB,EAAmB,EAAO,UAAU,WACxC,EAAO,mBAAmB,WAE1B,EAAO,GAAG,WAAW,SAAS,EAAK,GACjC,IAA0C,IAAtC,EAAI,IAAI,QAAQ,iBAAyB,CAC3C,IAAI,EAAK,QAAQ,MACjB,EAAG,OAAO,GAAY,SAAS,GACzB,EACF,EAAG,SAAS,GAAY,SAAS,EAAK,GACpC,GAAI,EACF,QAAQ,IAAI,+BAAiC,GAC7C,EAAI,UAAU,KACd,EAAI,WAEJ,IACE,EAAI,UAAU,IAAK,CAAE,eAAgB,oBACrC,EAAI,IAAmB,SAAf,EAAI,QAAqB,EAAU,EAAU,GAAI,QAC3D,CAAE,MAAO,GACP,QAAQ,IAAI,kBAAmB,EACjC,CAGJ,KAEA,EAAI,UAAU,KACd,EAAI,MAER,GACF,MAEE,IAAK,IAAI,KAAK,EACZ,EAAiB,GAAG,KAAK,EAAQ,EAAK,EAG5C,GACF,MACE,QAAQ,IAAI,uCAEhB,GAIF,OAAO,QAAU,CACf,aAAc,SAAS,GACrB,OAAO,IAAI,MAAM,EACnB,EACA,aAAc,SAAS,GACrB,OAAO,OAAO,EAChB","file":"/npm/youjs@0.0.7/lib/server.js","sourceRoot":"","sourcesContent":["/**\n * Minified by jsDelivr using Terser v5.39.0.\n * Original file: /npm/youjs@0.0.7/lib/server.js\n *\n * Do NOT use SRI with dynamically generated files! More information: https://www.jsdelivr.com/using-sri-with-dynamic-files\n */\n","var socketio = require('socket.io');\nvar events = require('events');\nvar client = require('./client.js');\n\nvar youjs = function(server) {\n  this.init(server);\n}\n\nvar util = {\n  getFqns: function(rootFqn, obj) {\n    var result = [];\n    if (typeof obj === 'object') {\n      for (var propName in obj) {\n        if (typeof obj[propName] === 'function') {\n          result.push(rootFqn + '.' + propName);\n          continue;\n        }\n        if (typeof obj[propName] === 'object') {\n          var more = util.getFqns(rootFqn + '.' + propName, obj[propName]);\n          for (var i=0; i<more.length; i++) {\n            result.push(more[i]);\n          }\n        }\n      }\n    }\n    return result;\n  },\n  getFnFromFqn: function(rootObj, fqn) {\n    var path = fqn.split('.');\n    if (path.length > 0 && path[0].length === 0) path.shift();\n    for (var i=0; i<path.length; i++) {\n      var piece = path[i];\n      if (typeof rootObj[piece] === 'function') {\n        return rootObj[piece];\n      }\n      if (typeof rootObj[piece] === 'object') {\n        path.shift();\n        var newFqn = path.join('.');\n        return util.getFnFromFqn(rootObj[piece], newFqn);\n      }\n      return null;\n    }\n  },\n  resolveFqns: function(client, fqns) {\n    client.fqns = fqns;\n    for (var i=0; i<fqns.length; i++) {\n      var fqn = fqns[i];\n      var path = fqn.split('.');\n      if (typeof client.you === 'object') {\n        var activePathObj = client.you;\n        for (var p=0; p<path.length; p++) {\n          var piece = path[p];\n          if (typeof piece !== 'string' || piece.length === 0) continue;\n          var isLastPiece = p === path.length -1;\n          if (typeof activePathObj[piece] === 'undefined') {\n            if (isLastPiece === true) {\n              activePathObj[piece] = function() {\n                var id = client.cbId ++;\n                var args = [];\n                var cb = null;\n                for (var argNum in arguments) {\n                  var arg = arguments[argNum];\n                  if (typeof arg !== 'function') {\n                    args.push(arg);\n                  } else {\n                    cb = arg;\n                  }\n                }\n                client.cbMap[id] = cb;\n                client.socket.emit('execute', {fqn: this.fqn, id: id, args: args});\n              }.bind({fqn: fqn});\n              activePathObj = client.you;\n            } else {\n              activePathObj[piece] = {};\n              activePathObj = activePathObj[piece];\n            }\n          } else {\n            if (typeof activePathObj[piece] === 'object') {\n              activePathObj = activePathObj[piece];\n            }\n          }\n        }\n      } else {\n        console.log('[YOUJS]: invalid client.you object', client.you);\n      }\n    }\n  },\n  refreshGroupFqns: function(group, client) {\n    if (client && client.you && group && group.you) {\n      if (group.members[client.clientId]) {\n        var fqns = client.fqns;\n        for (var i=0; i<fqns.length; i++) {\n          var fqn = fqns[i];\n          var path = fqn.split('.');\n          var activePathObj = group.you;\n          group.fqns[fqns[i]] = true;\n          for (var p=0; p<path.length; p++) {\n            var piece = path[p];\n            if (typeof piece !== 'string' || piece.length === 0) continue;\n            var isLastPiece = p === path.length -1;\n            if (typeof activePathObj[piece] === 'undefined') {\n              if (isLastPiece === true) {\n                activePathObj[piece] = function() {\n                  for (var clientId in group.members) {\n                    var client = group.members[clientId];\n                    var argMap = arguments;\n                    client.ready(function() {\n                      var fn = util.getFnFromFqn(this.client.you, this.fqn);\n                      if (typeof fn === 'function') {\n                        var args = [];\n                        for (var argNum in this.argMap) args.push(this.argMap[argNum]);\n                        fn.apply(client, args);\n                      } else {\n                        console.log('[YOUJS]: client ' + this.client.clientId + ' has no function ' + this.piece + ' (fqn: ' + this.fqn + '). Clients you space is ', this.client.you);\n                      }\n                    }.bind({client: client, piece: this.piece, fqn: this.fqn, argMap: argMap}));\n                  }\n                }.bind({piece: piece, fqn: fqn});\n                activePathObj = group.you;\n              } else {\n                activePathObj[piece] = {};\n                activePathObj = activePathObj[piece];\n              }\n            } else {\n              if (typeof activePathObj[piece] === 'object') {\n                activePathObj = activePathObj[piece];\n              }\n            }\n          }\n        }\n      } else {\n        console.log('[YOUJS]: will not refresh group functions because client ' + client.clientId + ' is not member of group ' + group.name);\n      }\n    } else {\n      console.log('[YOUJS]: cannot refresh group functions because client or group is invalid');\n    }\n  }\n}\n\nyoujs.prototype = {\n\n  init: function(server) {\n\n    var self = this;\n    this.serveClient(server);\n    var io = socketio.listen(server);\n    io.set('log level', 1);\n    this.server = io;\n    this.clients = {};\n    this.groups = {};\n    this.events = new events.EventEmitter();\n\n    // create and register default group (everyone)\n    this.everyone = this.getGroup('everyone');\n\n    io.sockets.on('connection', function (socket) {\n\n      // register client\n      var client = {\n        clientId: socket.id,\n        socket: socket,\n        you: {},\n        fqns: [],\n        cbMap: {},\n        cbId: 0,\n        events: new events.EventEmitter(),\n        isReady: false,\n        ready: function(callback) {\n          if (callback) {\n            if (this.isReady === true) {\n              callback();\n            } else {\n              var self = this;\n              this.events.once('ready', function() {\n                self.isReady = true;\n                callback();\n              });\n            }\n          }\n        }\n\n      }\n      self.clients[client.clientId] = client;\n      self.everyone.join(client.clientId);\n      self.events.emit('connect', socket);\n\n      // socket disconnected\n      socket.on('disconnect', function() {\n        console.log('[YOUJS]: client with clientId ' + socket.id + ' disconnected.');\n        self.clientDisconnected(socket.id);\n      });\n\n      // received functions from clients you space\n      socket.on('fqns', function(fqns) {\n        var client = self.getClient(socket.id);\n        // create a wrapper for the client functions\n        if (fqns != null && fqns instanceof Array) {\n          util.resolveFqns(client, fqns);\n          util.refreshGroupFqns(self.everyone, client);\n          client.isReady = true;\n          client.events.emit('ready');\n          self.events.emit('clientReady', client.clientId);\n        } else {\n          console.log('[YOUJS]: invalid or empty fqns passed. Must be an Array');\n        }\n      });\n\n      socket.on('executed', function(opts) {\n        // client executed the function and called back\n        if (opts && opts.id !== null && opts.args !== null) {\n          var client = self.getClient(socket.id);\n          if (client.cbMap[opts.id]) {\n            // execute the callback\n            client.cbMap[opts.id].apply(client, opts.args);\n            // TODO: figure out a way to execute a callback multiple times without storing the callback function forever in memory\n            // client.cbMap[opts.id] = null;\n            // delete client.cbMap[opts.id];\n          }\n        }\n      });\n\n      // a group function got called from a client\n      socket.on('execute', function(opts) {\n        if (opts && opts.fqn !== null && opts.args !== null) {\n          var cb = function() {\n            var result = {\n              id: opts.id,\n              args: []\n            };\n            for (var argNum in arguments) {\n              if (typeof arguments[argNum] !== 'function') {\n                result.args.push(arguments[argNum]);\n              }\n            }\n            socket.emit('executed', result);\n          }\n          opts.args.push(cb);\n\n          // get the groups the client is member of\n          var fn = util.getFnFromFqn(self.groups[opts.grp].you, opts.fqn);\n          var scope = self.clients[socket.id];\n          if (typeof fn === 'function') {\n            fn.apply(scope, opts.args);\n          } else {\n            console.log('[YOUJS]: could not resolve fqn ' + opts.fqn + ' of group ' + opts.grp);\n          }\n        }\n      });\n    });\n  },\n\n  // send all group functions to the client\n  sendFunctions: function(clientId) {\n    var self = this;\n    if (self.clients[clientId]) {\n      var client = this.clients[clientId];\n      var socket = client.socket;\n\n      // resolve functions for all groups the client is member of\n      for (var groupName in self.groups) {\n        var fqnMap = {};\n        var toExclude = self.groups[groupName].fqns;\n        \n        if (self.groups[groupName].members[clientId]) {\n          var fqns = util.getFqns('', self.groups[groupName].you);\n          var result = [];\n          for (var i=0; i<fqns.length; i++) {\n            if (toExclude[fqns[i]] !== true) result.push(fqns[i]);\n          }\n          fqnMap[groupName] = result;\n        } else {\n          // client is not member of this group (yet)\n        }\n        socket.emit('fqns', fqnMap);\n      }\n    } else {\n      console.log('[YOUJS]: Cannot send server functions to client ' + clientId + ' because the client is not registered');\n    }\n  },\n\n  // gets or creates a group\n  getGroup: function(groupName) {\n    var self = this;\n    if (!this.groups[groupName]) {\n      var group = {\n        name: groupName,\n        members: {},\n        fqns: {},\n        you: {},\n        join: function(clientId) {\n          if (self.clients[clientId]) {\n            console.log('[YOUJS]: client with clientId ' + clientId + ' is joining group ' + groupName);\n            self.groups[groupName].members[clientId] = self.clients[clientId];\n            util.refreshGroupFqns(self.groups[groupName], self.clients[clientId]);\n            self.sendFunctions(clientId);\n          }\n        },\n        leave: function(clientId) {\n          this.members[clientId] = null;\n          delete this.members[clientId];\n        }\n      }\n      self.groups[groupName] = group;\n    }\n    return this.groups[groupName];\n  },\n\n  // removes a group\n  removeGroup: function(groupName) {\n    this.groups[groupName] = null;\n    delete this.groups[groupName];\n  },\n\n  // receive the client object from the clientId (FYI equals socket.id)\n  getClient: function(clientId) {\n    if (typeof this.clients[clientId] !== 'undefined') {\n      return this.clients[clientId];\n    }\n  },\n\n  // a client got disconnected\n  clientDisconnected: function(clientId) {\n    // remove all references to the client\n    for (var groupName in this.groups) {\n      if (this.groups[groupName].members[clientId]) this.groups[groupName].leave(clientId);\n      if (this.clients[clientId]) {\n        this.clients[clientId] = null;\n        delete this.clients[clientId];\n      }\n    }\n  },\n\n  // serve the youjs client file automatically\n  serveClient: function(server) {\n    var self = this;\n    if ('undefined' !== typeof server) {\n      // serve the client file when requested\n      var clientPath = __dirname + '/client.js';\n      var defaultListeners = server.listeners('request');\n      server.removeAllListeners('request');\n\n      server.on('request', function(req, res) {\n        if (req.url.indexOf('/youjs/you.js') !== -1) {\n          var fs = require('fs');\n          fs.exists(clientPath, function(exists) {\n            if (exists) {\n              fs.readFile(clientPath, function(err, content) {\n                if (err) {\n                  console.log('[YOUJS]: error reading file ' + clientPath);\n                  res.writeHead(500);\n                  res.end();\n                } else {\n                  try {\n                    res.writeHead(200, { 'Content-Type': 'text/javascript' });\n                    res.end(req.method !== 'HEAD' && content ? content : '', 'utf-8');\n                  } catch (e) {\n                    console.log('[YOUJS]: error:', e);\n                  }\n\n                }\n              });\n            } else {\n              res.writeHead(404);\n              res.end();\n            }\n          });\n        } else {\n          // handle default listeners\n          for (var i in defaultListeners) {\n            defaultListeners[i].call(server, req, res);\n          }\n        }\n      });\n    } else {\n      console.log('[YOUJS]: http server not initialized');\n    }\n  }\n\n}\n\nmodule.exports = {\n  createServer: function(server) {\n    return new youjs(server);\n  },\n  createClient: function(uri) {\n    return client(uri);\n  }\n}\n"]}