{"_id":"kickapp","_rev":"38-bef3803c38b01a316e343a781e6dd06f","name":"kickapp","description":"Application architecture framework with pluggable services","dist-tags":{"latest":"1.0.7-0"},"versions":{"0.0.1":{"name":"kickapp","description":"Application architecture framework with pluggable services","version":"0.0.1","author":{"name":"kolypto","email":"kolypto@gmail.com"},"license":"MIT","maintainers":[{"name":"kolypto","email":"kolypto@gmail.com"}],"repository":{"type":"git","url":"git@github.com:kolypto/nodejs-kickapp.git"},"main":"./lib/index","keywords":["application","services","architecture"],"dependencies":{"async":"0.2.x","underscore":"1.4.x"},"devDependencies":{"vows":"0.7.x"},"engines":{"node":">= 0.9.0"},"scripts":{"test":"vows tests/*-test.js tests/**/*-test.js --spec"},"bugs":{"url":"https://github.com/kolypto/nodejs-kickapp/issues"},"_id":"kickapp@0.0.1","dist":{"shasum":"f4a5263836c082c2a109f69b8e88cb034381ca63","tarball":"https://registry.npmjs.org/kickapp/-/kickapp-0.0.1.tgz","integrity":"sha512-ZgSZLiEfIxDfga6LSl5iWQvNwaWlGFniI3k5a8l2th0IOWSAGLO4rrnOvkyp6wCzcDEFvd+XMglsv4F4FegNXg==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIDePS/CyITJPL6Rk0Gpnj4f1fUFqrMpc9Wrh8x+2BVisAiB6LDAYQQHZPazz4Njpkv8+aXxGwVIsUM6SDQZygnfe3Q=="}]},"_from":".","_npmVersion":"1.2.25","_npmUser":{"name":"kolypto","email":"kolypto@gmail.com"},"directories":{}},"0.0.2":{"name":"kickapp","description":"Application architecture framework with pluggable services","version":"0.0.2","author":{"name":"kolypto","email":"kolypto@gmail.com"},"license":"MIT","maintainers":[{"name":"kolypto","email":"kolypto@gmail.com"}],"repository":{"type":"git","url":"git@github.com:kolypto/nodejs-kickapp.git"},"main":"./lib/index","keywords":["application","services","architecture"],"dependencies":{"async":"0.2.x","underscore":"1.4.x"},"devDependencies":{"vows":"0.7.x"},"engines":{"node":">= 0.9.0"},"scripts":{"test":"vows tests/*-test.js tests/**/*-test.js --spec"},"bugs":{"url":"https://github.com/kolypto/nodejs-kickapp/issues"},"_id":"kickapp@0.0.2","dist":{"shasum":"4ae5144ef417679cad64eb24b23c388d9fc3befa","tarball":"https://registry.npmjs.org/kickapp/-/kickapp-0.0.2.tgz","integrity":"sha512-rUAb55W0YyAZR4axP1tP/z1syW9S1sUQFmM5NzHbiU2mPg30EnPIL/0+VjuDCq4bXUqH48MgJcBTLKsnAYjOqQ==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDpm6uWs6Fw01BiD6C2b3F2UDqtXVqzj6j3s3LTFzywFwIhAItAd0bVGFi12dMpy/k9dW7iZng3Ku35JACuU7Q2+9x8"}]},"_from":".","_npmVersion":"1.2.25","_npmUser":{"name":"kolypto","email":"kolypto@gmail.com"},"directories":{}},"0.0.3":{"name":"kickapp","description":"Application architecture framework with pluggable services","version":"0.0.3","author":{"name":"kolypto","email":"kolypto@gmail.com"},"license":"MIT","maintainers":[{"name":"kolypto","email":"kolypto@gmail.com"}],"repository":{"type":"git","url":"git@github.com:kolypto/nodejs-kickapp.git"},"main":"./lib/index","keywords":["application","services","architecture"],"dependencies":{"async":"0.2.x","underscore":"1.4.x"},"devDependencies":{"vows":"0.7.x"},"engines":{"node":">= 0.9.0"},"scripts":{"test":"vows tests/*-test.js tests/**/*-test.js --spec"},"bugs":{"url":"https://github.com/kolypto/nodejs-kickapp/issues"},"_id":"kickapp@0.0.3","dist":{"shasum":"4063f0c32cf79649b351253877518fdca25dae54","tarball":"https://registry.npmjs.org/kickapp/-/kickapp-0.0.3.tgz","integrity":"sha512-liafznc1xvKZ2RY1junrYHtUNWcH0VuBe7r3j67qsUG3ldAtZnh1gwouzuPZPs/ZdnVCsYNK/gGhQNI2W51O2Q==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCu6BKM//JfQGafYw1pEOb03rBpwqUqiExRO4mqEqwRRwIhAJ3ggajNk78o2lR4I8v4L0Ef2wwt2igWfwPWkATH72Hs"}]},"_from":".","_npmVersion":"1.2.25","_npmUser":{"name":"kolypto","email":"kolypto@gmail.com"},"directories":{}},"0.0.4":{"name":"kickapp","description":"Application architecture framework with pluggable services","version":"0.0.4","author":{"name":"kolypto","email":"kolypto@gmail.com"},"license":"MIT","maintainers":[{"name":"kolypto","email":"kolypto@gmail.com"}],"repository":{"type":"git","url":"git@github.com:kolypto/nodejs-kickapp.git"},"main":"./lib/index","keywords":["application","services","architecture"],"dependencies":{"async":"0.2.x","underscore":"1.4.x"},"devDependencies":{"vows":"0.7.x"},"engines":{"node":">= 0.9.0"},"scripts":{"test":"vows tests/*-test.js tests/**/*-test.js --spec"},"bugs":{"url":"https://github.com/kolypto/nodejs-kickapp/issues"},"_id":"kickapp@0.0.4","dist":{"shasum":"6cf75286af0222c94ed91235ab65a267e170637d","tarball":"https://registry.npmjs.org/kickapp/-/kickapp-0.0.4.tgz","integrity":"sha512-y6CQ9xkFzcnUq/9aVTfhio/6O3G7yoj7dpObA64FWvET0mnag8fljmOZDd19if3vqWyYK3VVDanIhQWgPEYWkw==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDrg5LFFUS9Mxhf5cBLVDYBIoh8Nae53aVpwufszthXUgIhAOYC4wJJpHPDJa9lBj4KYiYcMuqEYISAFda7Vry8QtOL"}]},"_from":".","_npmVersion":"1.2.25","_npmUser":{"name":"kolypto","email":"kolypto@gmail.com"},"directories":{}},"0.0.5":{"name":"kickapp","description":"Application architecture framework with pluggable services","version":"0.0.5","author":{"name":"kolypto","email":"kolypto@gmail.com"},"license":"MIT","maintainers":[{"name":"kolypto","email":"kolypto@gmail.com"}],"repository":{"type":"git","url":"git@github.com:kolypto/nodejs-kickapp.git"},"main":"./lib/index","keywords":["application","services","architecture"],"dependencies":{"async":"0.2.x","underscore":"1.4.x"},"devDependencies":{"vows":"0.7.x"},"engines":{"node":">= 0.9.0"},"scripts":{"test":"vows tests/*-test.js tests/**/*-test.js --spec"},"bugs":{"url":"https://github.com/kolypto/nodejs-kickapp/issues"},"_id":"kickapp@0.0.5","dist":{"shasum":"20596026fb203b7156bf5ba517f9bafc73a3b56a","tarball":"https://registry.npmjs.org/kickapp/-/kickapp-0.0.5.tgz","integrity":"sha512-JkjBzd2GKjk9qh0hJ0NH+l7+fJ/x7VTbcro0lyR3QFl8REthV/2/W5pnVKystKm5bhM496SDpxpKin01uEakFA==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCP1kqZ39UwEypaaOM317y39Z3dirZxIk1nvpEoYeXUnAIhANU0XBUqGEb4vSBLx+HK5nQ8++tyh8UUUpxZ4IjJgZig"}]},"_from":".","_npmVersion":"1.2.25","_npmUser":{"name":"kolypto","email":"kolypto@gmail.com"},"directories":{}},"0.0.6":{"name":"kickapp","description":"Application architecture framework with pluggable services","version":"0.0.6","author":{"name":"kolypto","email":"kolypto@gmail.com"},"license":"MIT","maintainers":[{"name":"kolypto","email":"kolypto@gmail.com"}],"repository":{"type":"git","url":"git@github.com:kolypto/nodejs-kickapp.git"},"main":"./lib/index","keywords":["application","services","architecture"],"dependencies":{"async":"0.2.x","underscore":"1.4.x"},"devDependencies":{"vows":"0.7.x"},"engines":{"node":">= 0.9.0"},"scripts":{"test":"vows tests/*-test.js tests/**/*-test.js --spec"},"bugs":{"url":"https://github.com/kolypto/nodejs-kickapp/issues"},"_id":"kickapp@0.0.6","dist":{"shasum":"62ec9753e568bf115adbc3268644d1e769165a9e","tarball":"https://registry.npmjs.org/kickapp/-/kickapp-0.0.6.tgz","integrity":"sha512-OI/7NpSKIwv8CXbmlo/2Sx2C8d+nKrX9ra2zyCObwvCfnkxMdh6WdwjcElqHDELyWSyf8zwzdqpbii+O5nkXhA==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCICvDvcqlHk42Ij24gnNfFFySvSrggN0Y28+Sqw+tcP4VAiAVvoEBHuXzPMRgmktRcq8BkAVXOTrONghIxZ74iuhqrg=="}]},"_from":".","_npmVersion":"1.2.25","_npmUser":{"name":"kolypto","email":"kolypto@gmail.com"},"directories":{}},"0.0.7":{"name":"kickapp","description":"Application architecture framework with pluggable services","version":"0.0.7","author":{"name":"kolypto","email":"kolypto@gmail.com"},"license":"MIT","maintainers":[{"name":"kolypto","email":"kolypto@gmail.com"}],"repository":{"type":"git","url":"git@github.com:kolypto/nodejs-kickapp.git"},"main":"./lib/index","keywords":["application","services","architecture"],"dependencies":{"async":"0.2.x","lodash":"2.4.x"},"devDependencies":{"vows":"0.7.x"},"engines":{"node":">= 0.9.0"},"scripts":{"test":"vows tests/*-test.js tests/**/*-test.js --spec"},"bugs":{"url":"https://github.com/kolypto/nodejs-kickapp/issues"},"homepage":"https://github.com/kolypto/nodejs-kickapp","_id":"kickapp@0.0.7","dist":{"shasum":"72a471366b5d4f7d1c13572b4df4e7cfd09be22b","tarball":"https://registry.npmjs.org/kickapp/-/kickapp-0.0.7.tgz","integrity":"sha512-vck6HFA0ksQT1LnuE1wPuMgLZbDh9tVoSHBnj1nHKOucJG9cCql8o+MFBEASnpsb/o6y17du1RW/wPVo6RlaPQ==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIHyhtYUnEfZ+jHtIFBiBZRkaWwPAsrksePYBJp2ScXbTAiEAoRR2mnUnWLUjkRfZH+H56ADZZs2URWRYX9a0TkeQskc="}]},"_from":".","_npmVersion":"1.3.14","_npmUser":{"name":"kolypto","email":"kolypto@gmail.com"},"directories":{}},"1.0.0":{"name":"kickapp","description":"Application architecture framework with pluggable services","version":"1.0.0","author":{"name":"kolypto","email":"kolypto@gmail.com"},"license":"MIT","maintainers":[{"name":"kolypto","email":"kolypto@gmail.com"}],"repository":{"type":"git","url":"git@github.com:kolypto/nodejs-kickapp.git"},"main":"./lib/index","keywords":["application","services","architecture"],"dependencies":{"q":"0.9.x","lodash":"2.4.x"},"devDependencies":{"nodeunit":"0.8.2"},"engines":{"node":">= 0.9.0"},"scripts":{"test":"./node_modules/.bin/nodeunit tests/*-test.js"},"bugs":{"url":"https://github.com/kolypto/nodejs-kickapp/issues"},"homepage":"https://github.com/kolypto/nodejs-kickapp","_id":"kickapp@1.0.0","dist":{"shasum":"0cc9720493eaf23bce3b7bfbec5ffe358b22a2b5","tarball":"https://registry.npmjs.org/kickapp/-/kickapp-1.0.0.tgz","integrity":"sha512-tNUEashjlF2QXcbx4rrk/p0msMSaBHDW9OmyiF/fcJjCZabEewK4r49fn2wn7PJtTycnsmFpR0Innt0YDxr66w==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIEDqYT40Kp//gfk4INUsGJoMALl2UAaDhUrujqxYeTtmAiEAiBazIXqTRvW7G+Ya2qB+2h4bGl41cD9jQJnsg6oRZPA="}]},"_from":".","_npmVersion":"1.3.17","_npmUser":{"name":"kolypto","email":"kolypto@gmail.com"},"directories":{}},"1.0.1":{"name":"kickapp","description":"Application architecture framework with pluggable services","version":"1.0.1","author":{"name":"kolypto","email":"kolypto@gmail.com"},"license":"MIT","maintainers":[{"name":"kolypto","email":"kolypto@gmail.com"}],"repository":{"type":"git","url":"git@github.com:kolypto/nodejs-kickapp.git"},"main":"./lib/index","keywords":["application","services","architecture"],"dependencies":{"q":"0.9.x","lodash":"2.4.x"},"devDependencies":{"nodeunit":"0.8.2"},"engines":{"node":">= 0.9.0"},"scripts":{"test":"./node_modules/.bin/nodeunit tests/*-test.js"},"bugs":{"url":"https://github.com/kolypto/nodejs-kickapp/issues"},"homepage":"https://github.com/kolypto/nodejs-kickapp","_id":"kickapp@1.0.1","dist":{"shasum":"a826a2b834ffd0e7ab5c5e54ef81d51857216702","tarball":"https://registry.npmjs.org/kickapp/-/kickapp-1.0.1.tgz","integrity":"sha512-D3SnhWpSZbYrQ51fgFsS0r7MFiXpWzpM7PYVaYPJ+4pUsuq0vfM0kWFjU7zX4YX7KPgmm2Mle5gvD3ZY13S/LA==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIGs2PJMDJYmjfc3NcsNhLcWI3r5M9+ZaTwtkh8ipQY55AiBTMSGdOQKCMJ/gwScODwFkxcl2ds+tKkDrxI8jLusGig=="}]},"_from":".","_npmVersion":"1.3.17","_npmUser":{"name":"kolypto","email":"kolypto@gmail.com"},"directories":{}},"1.0.2":{"name":"kickapp","description":"Application architecture framework with pluggable services","version":"1.0.2","author":{"name":"kolypto","email":"kolypto@gmail.com"},"license":"MIT","maintainers":[{"name":"kolypto","email":"kolypto@gmail.com"}],"repository":{"type":"git","url":"git@github.com:kolypto/nodejs-kickapp.git"},"main":"./lib/index","keywords":["application","services","architecture"],"dependencies":{"q":"0.9.x","lodash":"2.4.x"},"devDependencies":{"nodeunit":"0.8.2"},"engines":{"node":">= 0.9.0"},"scripts":{"test":"./node_modules/.bin/nodeunit tests/*-test.js"},"bugs":{"url":"https://github.com/kolypto/nodejs-kickapp/issues"},"homepage":"https://github.com/kolypto/nodejs-kickapp","_id":"kickapp@1.0.2","dist":{"shasum":"adeb35f036a7c38a03f88532eba2cd4e1f1ce1f2","tarball":"https://registry.npmjs.org/kickapp/-/kickapp-1.0.2.tgz","integrity":"sha512-VDUpkHjviJzA91UkETW3OtI63wqfx0Q798+io9vLK+R0uSPe6NWtWPGuqldCvYckgIssu9AefvNxfqhKRV8AXA==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIC5Xl2yCmvqVLr5YHhZHhTIqoHwk1BrIuSRt1G0CmdObAiEAmaifwbSY98Xi9J1l/VhEfhFu6cFcWCLX/OTKOUmYTdU="}]},"_from":".","_npmVersion":"1.3.17","_npmUser":{"name":"kolypto","email":"kolypto@gmail.com"},"directories":{}},"1.0.3":{"name":"kickapp","description":"Application architecture framework with pluggable services","version":"1.0.3","author":{"name":"kolypto","email":"kolypto@gmail.com"},"license":"MIT","maintainers":[{"name":"kolypto","email":"kolypto@gmail.com"}],"repository":{"type":"git","url":"git@github.com:kolypto/nodejs-kickapp.git"},"main":"./lib/index","keywords":["application","services","architecture"],"dependencies":{"q":"0.9.x","lodash":"2.4.x"},"devDependencies":{"nodeunit":"0.8.2"},"engines":{"node":">= 0.9.0"},"scripts":{"test":"./node_modules/.bin/nodeunit tests/*-test.js"},"bugs":{"url":"https://github.com/kolypto/nodejs-kickapp/issues"},"homepage":"https://github.com/kolypto/nodejs-kickapp","_id":"kickapp@1.0.3","dist":{"shasum":"2f87625e2d34057fc7f2810bf215bd585eb88187","tarball":"https://registry.npmjs.org/kickapp/-/kickapp-1.0.3.tgz","integrity":"sha512-bzlQEAwD+UtGxUvT9irfKT/iGNtzuAcqNPF+dkYtNOhyb9bLIvAADjyqQtlTwxXT0iT9mvR1JqusLJNcStyfjw==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQD8UYV/x6h+23relRIWev8QGR7Hf+Uf0QDOIoI+krnqSwIgUtP2RQDj8waSPJbBizICLh+y4VbD35l0D0qpXUiCJi8="}]},"_from":".","_npmVersion":"1.3.21","_npmUser":{"name":"kolypto","email":"kolypto@gmail.com"}},"1.0.5":{"name":"kickapp","description":"Application architecture framework with pluggable services","version":"1.0.5","author":{"name":"kolypto","email":"kolypto@gmail.com"},"license":"MIT","maintainers":[{"name":"kolypto","email":"kolypto@gmail.com"}],"repository":{"type":"git","url":"git@github.com:kolypto/nodejs-kickapp.git"},"main":"./lib/index","keywords":["application","services","architecture"],"dependencies":{"q":"1.0.x","lodash":"2.4.x"},"devDependencies":{"nodeunit":"0.8.2"},"engines":{"node":">= 0.9.0"},"scripts":{"test":"nodeunit tests/*-test.js"},"gitHead":"27198d47c743cb73347d9a6d51d09fe4472a15b9","bugs":{"url":"https://github.com/kolypto/nodejs-kickapp/issues"},"homepage":"https://github.com/kolypto/nodejs-kickapp","_id":"kickapp@1.0.5","_shasum":"57614a9459ef16e52dde53ece8cb750b0dc59018","_from":".","_npmVersion":"1.4.14","_npmUser":{"name":"kolypto","email":"kolypto@gmail.com"},"dist":{"shasum":"57614a9459ef16e52dde53ece8cb750b0dc59018","tarball":"https://registry.npmjs.org/kickapp/-/kickapp-1.0.5.tgz","integrity":"sha512-lEAVW4XjFRl+IfEydnjv939k/iyYHIoBo6ePPZQ3JjL3DKzU1jqQ2Idib7ZispL8j0CLq2U8oHvCM536V4xxUg==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCw8GMPXi21c3Pgwpp7Kle10jgyCj8jqklisf5G/ptJ8wIhAJrv/nm+9/xsuJoh/o/0LigqmwOPFmts59ZdwCz580HB"}]}},"1.0.6-0":{"name":"kickapp","description":"Application architecture framework with pluggable services","version":"1.0.6-0","author":{"name":"kolypto","email":"kolypto@gmail.com"},"license":"MIT","maintainers":[{"name":"kolypto","email":"kolypto@gmail.com"}],"repository":{"type":"git","url":"git@github.com:kolypto/nodejs-kickapp.git"},"main":"./lib/index","keywords":["application","services","architecture"],"dependencies":{"q":"1.0.x","lodash":"2.4.x"},"devDependencies":{"nodeunit":"0.9.x"},"engines":{"node":">= 0.9.0"},"scripts":{"test":"nodeunit tests/*-test.js"},"gitHead":"7ccb8694e5d432ed6a25a010598d56d2b0b6985e","bugs":{"url":"https://github.com/kolypto/nodejs-kickapp/issues"},"homepage":"https://github.com/kolypto/nodejs-kickapp","_id":"kickapp@1.0.6-0","_shasum":"928c9879c8b49cf4e8a7b26d9db3d3380c9577a2","_from":".","_npmVersion":"1.4.23","_npmUser":{"name":"kolypto","email":"kolypto@gmail.com"},"dist":{"shasum":"928c9879c8b49cf4e8a7b26d9db3d3380c9577a2","tarball":"https://registry.npmjs.org/kickapp/-/kickapp-1.0.6-0.tgz","integrity":"sha512-5IKuVOWiPy6F+HTQD0dY8HI/oSerbOi//XqqTPzYp+0U+onbqEO3b8g0S/I7d+S3yLTKPXA1KBKsjjwhosXmoQ==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIEWIY+Zyoj4d+gRVUc2WoEDRINvqxtvG6BNPfka2Ss7PAiBCTUeKE/OSMukKW+hK/KCz3KKtO2A089BPbnd1hp44hw=="}]}},"1.0.7-0":{"name":"kickapp","description":"Application architecture framework with pluggable services","version":"1.0.7-0","author":{"name":"kolypto","email":"kolypto@gmail.com"},"license":"MIT","maintainers":[{"name":"kolypto","email":"kolypto@gmail.com"}],"repository":{"type":"git","url":"git@github.com:kolypto/nodejs-kickapp.git"},"main":"./lib/index","keywords":["application","services","architecture"],"dependencies":{"q":"1.0.x","lodash":"2.4.x"},"devDependencies":{"mocha":"1.21.x","chai":"1.9.x"},"engines":{"node":">= 0.9.0"},"scripts":{"test":"./node_modules/mocha/bin/mocha tests/*-test.js"},"gitHead":"7d2500d040b8c10ebcfc8f31d9544453f0d1ae12","bugs":{"url":"https://github.com/kolypto/nodejs-kickapp/issues"},"homepage":"https://github.com/kolypto/nodejs-kickapp","_id":"kickapp@1.0.7-0","_shasum":"2a279bcdc8ab401817c0e2820b4388d7a29fd198","_from":".","_npmVersion":"1.4.23","_npmUser":{"name":"kolypto","email":"kolypto@gmail.com"},"dist":{"shasum":"2a279bcdc8ab401817c0e2820b4388d7a29fd198","tarball":"https://registry.npmjs.org/kickapp/-/kickapp-1.0.7-0.tgz","integrity":"sha512-dpqRsjrxTiLMvXLCUgR8t6Gcd/maPrfqA1GTf7iRsoAKY94NuNxeeaRmMFL3WZVIa+0bdGDCSbnehNhijpB3ag==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCLGT94m2TTmgMfchWJGDtCKXwHgcHzidarv5gOFuoJ6wIhAN1vll9L6Un5IqgWu4aTJ1NqL5Sr/v2qJQE8exqHpSfH"}]}}},"readme":"[![Version](https://badge.fury.io/js/kickapp.png)](https://npmjs.org/package/kickapp)\n[![Dependency Status](https://gemnasium.com/kolypto/nodejs-kickapp.png)](https://gemnasium.com/kolypto/nodejs-kickapp)\n[![Build Status](https://travis-ci.org/kolypto/nodejs-kickapp.png?branch=master)](https://travis-ci.org/kolypto/nodejs-kickapp)\n\nKickApp\n=======\n\nKickApp is an application architecture framework for organizing the logic into runnable services.\n\nSplit your logical components into services contained in a top-level Applicaton object,\ndefine service dependencies and launch them all with a single `app.start()`!\n\nKey features:\n\n* Structured application architecture approach\n* Service workflow: `init()`, `start()`, `stop()`\n* Service dependencies resolution\n* Can deal with hierarchical services\n* Promise-based: using the [q](https://npmjs.org/package/q) package\n* Unit-tested\n\n\n\nTable of Contents\n=================\n\n* <a href=\"#kickapp\">KickApp</a>\n* <a href=\"#table-of-contents\">Table of Contents</a>\n* <a href=\"#core-components\">Core Components</a>\n    * <a href=\"#service\">Service</a>\n        * <a href=\"#object-service\">Object Service</a>\n    * <a href=\"#application\">Application</a>\n        * <a href=\"#applicationapp-args\">Application(App, ...args)</a>\n        * <a href=\"#structure\">Structure</a>\n            * <a href=\"#applicationaddservicename-serviceconstructor-argsapplication\">Application.addService(name, serviceConstructor, ...args):Application</a>\n            * <a href=\"#applicationdependsonname-namesapplication\">Application.dependsOn(name, ...names):Application</a>\n            * <a href=\"#applicationgetservicenameiservice\">Application.get(serviceName):IService</a>\n            * <a href=\"#applicationgetservicewrapperservicenameservicewrapper\">Application.getServiceWrapper(serviceName):ServiceWrapper</a>\n            * <a href=\"#applicationgetservicenamesarray\">Application.getServiceNames():Array.</a>\n            * <a href=\"#applicationisrunningboolean\">Application.isRunning():Boolean</a>\n        * <a href=\"#workflow\">Workflow</a>\n            * <a href=\"#applicationinit\">Application.init()</a>\n            * <a href=\"#applicationstart\">Application.start()</a>\n            * <a href=\"#applicationstop\">Application.stop()</a>\n        * <a href=\"#events\">Events</a>\n    * <a href=\"#servicewrapper\">ServiceWrapper</a>\n* <a href=\"#full-example\">Full Example</a>\n* <a href=\"#promise-haters\">Promise-Haters</a>\n* <a href=\"#application-as-a-service\">Application as a Service</a>\n* <a href=\"#bundled-services\">Bundled Services</a>\n    * <a href=\"#netservice\">NetService</a>\n    * <a href=\"#timerservice\">TimerService</a>\n\n\n\n\n\n\nCore Components\n===============\n\nService\n-------\n\nA Service is an arbitrary constructor function or an object that implements the [`IService`](lib/IService.js) interface:\n\n* Its constructor function gets an `Application` as the first argument.\n    More arguments can be provided with the `Application.addService()` method.\n* It can optionally have the `init()` method: here you can perform some preparation steps\n* It must have the `start()` and `stop()` methods which bring your service up and down respectively.\n\nConsider an example:\n\n```js\n/** Database service\n * @param {Application} app\n *     The parent Application\n * @param {String} url\n *     Connection string\n * @constructor\n * @implements {IService}\n */\nvar DbService = function(app, url){\n    this.app = app;\n    this.url = url;\n    this.client = undefined;\n};\n\nDbService.prototype.init = function(){\n    this.client = new DatabaseClient(this.url); // init some imaginary client\n};\n\nDbService.prototype.start = function(){\n    return this.client.connect(); // assuming it's promise-based\n};\n\nDbService.prototype.stop = function(){\n    return this.client.disconnect();\n};\n```\n\nHaving such a service, you can:\n\n* Add it to an Application\n* Define service dependencies\n* Launch them all in the correct order\n\n### Object Service\n\nIf your service is simple, you don't have to implement the constructor and everything. Use an object instead, which is also\na valid service:\n\n```js\nvar DbService = {\n    app: undefined,\n    client: new DatabaseClient('db://localhost/'),\n    start: function(){\n        return this.client.connect();\n    },\n    stop: function(){\n        return this.client.disconnect();\n    },\n};\n```\n\nIt will automatically get the `app` property when added to the Application.\n\n\n\nApplication\n-----------\n\nAn `Application` is the container for your services.\n\nYou define an application by creating an instance of it, providing a constructor function as an argument:\n\n```js\nvar kickapp = require('kickapp');\n\nvar App = new kickapp.Application(function(configFile){\n    this.config = require(configFile); // init the configuraton\n\n}, 'app/config.js');\n```\n\nBy design, an `Application` does not have custom start/stop behavior: instead, it wraps services.\n\n### Application(App, ...args)\n\n### Structure\n\n#### Application.addService(name, serviceConstructor, ...args):Application\nAdd a service to the application.\n\n* `name: String`: Name of the service. Use any reasonable string.\n* `serviceConstructor: Function`: Constructor function for an object that implements the [`IService`](lib/IService.js) interface.\n* `...args`: Variadic arguments for the service constructor\n\nReturns: an instance of [`ServiceWrapper`](#servicewrapper) (see below).\n\nThis function can also be called inside the Application constructor:\n\n```js\nvar kickapp = require('kickapp');\n\nvar App = new kickapp.Application(function(configFile){\n    // Load the configuration\n    this.config = require(configFile);\n\n    // Add services\n    this.addService('db', require('./services/db.js'), this.config.db );\n\n    this.addService('web', require('./services/web.js'), this.config.web )\n        .dependsOn('db'); // Define a dependency on other services\n\n}, 'app/config.js');\n```\n\n#### Application.dependsOn(name, ...names):Application\nAdd dependencies for the recently added Service.\n\nWhen a Service depends on other services, they will be started before starting this one.\n\nDependencies can be given either as arguments, or as a single array argument.\n\n#### Application.get(serviceName):IService\nGet the Service object by name:\n\n```js\napp.get('db').client; // get the Service property\n```\n\n#### Application.getServiceWrapper(serviceName):ServiceWrapper\nGet the `ServiceWrapper` object by name.\n\nSee: [ServiceWrapper](#servicewrapper)\n\n#### Application.getServiceNames():Array.<String>\nGet the list of service names added to this Application object.\n\n#### Application.isRunning():Boolean\nCheck whether the Application is running.\n\nAn Application is running if all its services are running.\n\n### Workflow\n\nService methods are run in the following fashion:\n\n* Service constructors are called immediately whilst you add your services to the Application\n* `init()`, `start()`, `stop()` methods are called when the corresponding Application method is called.\n  Unlike the constructor, these honor the service dependencies.\n\n#### Application.init()\nCall `init()` on all services, honoring the dependencies. Returns a promise.\n\nNote that `IService.init` is optional.\n\n#### Application.start()\nCall `start()` on all services, honoring the dependencies. Returns a promise.\n\nIf some services were not yet initialized with `init()`, Application does that.\n\n#### Application.stop()\nCall `stop()` on all services, honoring the dependencies in reverse order. Returns a promise.\n\n### Events\n\n`Application` is an `EventEmitter` which fires the following events:\n\n* 'init': All services have been initialized\n* 'start': All services have been started\n* 'stop': All services have been stopped\n\n\n\nServiceWrapper\n--------------\n\nEach Service is internally wrapped in `ServiceWrapper` which controls the service state.\n\n* `ServiceWrapper` is an `EventEmitter` which fires the 'init', 'start', 'stop' events of the service\n* Contains metainformation about the Service: service, initialized, running, dependencies\n\nUsually, you won't need it. See the source code: [`ServiceWrapper`](lib/kickapp/ServiceWrapper.js).\n\n\n\n\n\n\nFull Example\n============\n```js\nvar kickapp = require('kickapp');\n\n// Application\nvar App = new kickapp.Application(function(configFile){ // Application constructor\n    // Load the configuration\n    this.config = require(configFile);\n\n    // Services\n    this.addService(\n        'db', // Service name\n        require('./services/db.js'), // Service constructor with init()/start()/stop() methods\n        this.config.db // Arguments for the Service constructor\n    );\n\n    this.addService('web', require('./services/web.js'), this.config.web )\n        .dependsOn('db'); // Dependencies on other services\n\n}, 'app/config.js'); // Arguments for the Application constructor\n\n// Launch it\nApp.start()\n    .then(function(){\n        console.log('Application initialized and started!');\n    })\n    .catch(function(err){\n        console.error('Application.start failed:', err.stack);\n    });\n\n// Stop the services properly when the application exitsq\nprocess.on('SIGINT', process.exit);\nprocess.on('exit', function(){\n    App.stop()\n        .catch(function(err){\n            console.error('Application.stop failed:', err.stack);\n        });\n});\n```\n\n\n\n\n\n\nPromise-Haters\n==============\n\nIf you dislike promises, you can always get back to the old good NodeJS-style callbacks:\n\n```js\nvar App = new kickapp.Application(function(){\n});\n\nApp.start().nodeify(function(err){\n    if (err)\n        console.error('Application.start failed:', err.stack);\n    else\n        console.log('Application initialized and started!');\n});\n```\n\n\n\n\n\n\nApplication as a Service\n========================\n\nThe `Application` object can be used as a service as it implements the `IService` interface.\nThis allows creating reusable components from sustainable application parts and add them to other applications as a service:\n\n```js\nvar app = new kickapp.Application(function(){\n    // ... init some services\n});\n\nvar top = new kickapp.Application(function(){\n    this.addService('app', app); // added as a service\n});\n```\n\n\n\n\n\n\nBundled Services\n================\n\nKickApp comes with some handy bundled services.\n\nNetService\n----------\n\nNetService is a helper to wrap `net.Server`, `http.Server`, `https.Server`, `tls.Server`, `dgram.createSocket`\nnetwork servers in a KickApp service. It also supports static configuration with generalized interface.\n\nNetService accepts two arguments:\n\n* `config: Object`: Server configuration object:\n\n    * `config.lib: String`: The server type to create.\n      Supported values: `'net'` (TCP socket), `'tls'` (TLS socket), `'http'` (HTTP server), `'https'` (HTTPS server),\n      `'udp4'` (UDP IPv4 socket), `'udp6'` (UDP IPv6 socket).\n    * `config.listen: Array`: Array of arguments for the `listen()` function.\n\n        For `'net'`, `'http'`, `'https'`: port, [hostname], [backlog]\n\n        For `'tls'`: port, [host]\n\n        For `'udp4'`, `'udp6'`: port, [address]\n\n    * `config.options: Object`: Options for the `createServer()` function. See [NodeJS Manual](http://nodejs.org/api/index.html).\n\n        Note: for `'tls'` and `'https'` certificates & stuff, you can optionally specify filenames for the following keys:\n        `'pfx', 'key', 'cert', 'ca', 'crl'`.\n\n* `accept: Function`: Method used to accept the incoming connections.\n\n        For `'net', 'tls'`: `function(sock: net.Socket)`\n\n        For `'http'`, `'https'`: `function(req: http.ClientRequest, res: http.ServerResponse)`\n\n        For `'udp4'`, `'udp6'`: `function(msg: String|Buffer, rinfo: Object)`\n\nWielding the service, you can start/stop it an get error handling:\n\n```js\nvar app = new kickapp.Application(function(){\n    this.addService('net', kickapp.services.NetService,\n        { lib: 'net', listen: [6001, 'localhost'] },\n        function(sock){\n            sock.end('hi');\n        }\n    );\n    this.addService('http', kickapp.services.NetService,\n        { lib: 'http', listen: [6080, 'localhost'] },\n        function(req, res){\n            res.end('hi');\n        }\n    );\n});\n```\n\nNetService has the following properties:\n\n* `config`: Server configuration object\n* `server`: The created server\n\nTimerService\n------------\n\nTimerService handles timers as a Service, which are stopped together with the application.\n\nThe service provides the following methods which wrap global counterparts:\n\n* `setTimeout()`, `clearTimeout()`\n* `setInterval()`, `clearInterval()`\n\nBy using the `set*()` family of methods, you add the timer to the internal service registry, and when the server\nis stopped -- it clears the timers automatically.\n\nThis is especially important with unit-tests: when unit-testing an application which uses timers -- these continue to\nfunction even after the tested application was restarted for a new test case.\n\nThese public methods have same signatures with the methods they wrap, except for the requirement to use these through\nthe service:\n\n```js\n// Define the application\nvar app = new kickapp.Application(function(){\n    // Timers\n    this.addService('timer', kickapp.services.TimerService);\n    // Custom service that depends on timers\n    this.addService('my-service', MyService)\n        .dependsOn('timer');\n});\n\n// Custom service\nfunction MyService(app){\n    this.app = app;\n};\n\nMyService.prototype.start = function(){\n    // Get the 'timer' service\n    this.app.get('timer')\n        // beep every second :)\n        .setInterval(function(){\n            console.log('beep!');\n        }, 1000);\n};\n```\n\nWhen the application is started with `app.start()`, it starts its services.\nThe custom service \"my-service\" sets a timer through the \"timers\" service.\n\nNow, when the application is stopped through `app.stop()`, the timers service will clear all timers that were set on it.\n","maintainers":[{"name":"kolypto","email":"kolypto@gmail.com"}],"time":{"modified":"2022-06-19T08:40:44.938Z","created":"2013-06-12T15:09:28.992Z","0.0.1":"2013-06-12T15:09:32.521Z","0.0.2":"2013-06-17T09:53:23.824Z","0.0.3":"2013-06-17T16:45:03.055Z","0.0.4":"2013-06-17T22:18:44.530Z","0.0.5":"2013-06-18T01:20:14.493Z","0.0.6":"2013-06-20T13:56:51.441Z","0.0.7":"2013-12-12T00:42:00.093Z","0.0.8":"2013-12-12T22:48:03.176Z","1.0.0":"2013-12-13T21:31:58.299Z","1.0.1":"2013-12-13T22:46:18.977Z","1.0.2":"2013-12-14T01:20:43.387Z","1.0.3":"2013-12-27T21:52:42.377Z","1.0.4":"2014-07-17T13:44:51.605Z","1.0.5":"2014-07-17T13:52:45.838Z","1.0.6-0":"2014-09-05T00:33:01.578Z","1.0.7-0":"2014-09-14T16:03:27.691Z"},"author":{"name":"kolypto","email":"kolypto@gmail.com"},"repository":{"type":"git","url":"git@github.com:kolypto/nodejs-kickapp.git"},"homepage":"https://github.com/kolypto/nodejs-kickapp","keywords":["application","services","architecture"],"bugs":{"url":"https://github.com/kolypto/nodejs-kickapp/issues"},"license":"MIT","readmeFilename":"README.md"}