{"_id":"resilient-consumer","_rev":"50-67abc7bfaa26042e36057d870142a9bf","name":"resilient-consumer","description":"A worker lib designed to pull-and-process messages from different queue brokers","dist-tags":{"latest":"2.1.1","rc":"2.1.0-rc.1","legacy":"1.2.4"},"versions":{"1.0.0":{"name":"resilient-consumer","version":"1.0.0","description":"resilient consumer prof","main":"index.js","scripts":{"test":"NODE_ENV=test mocha"},"keywords":["resiliense","consumer","ampq"],"repository":{"type":"git","url":"git+https://github.com/admatic-tool/resilient-worker.git"},"author":{"name":"Luiz Zamboni"},"license":"ISC","dependencies":{"amqp":"^0.2.6","amqplib":"^0.5.1","co":"^4.6.0","uuid":"^3.1.0"},"devDependencies":{"chai":"^4.1.2","mocha-co":"^1.17.2","rabbit-test-helper":"^1.0.1","sinon":"^4.0.2"},"gitHead":"871ee91c66bb696bf7e1963ab396b7a21fc21728","bugs":{"url":"https://github.com/admatic-tool/resilient-worker/issues"},"homepage":"https://github.com/admatic-tool/resilient-worker#readme","_id":"resilient-consumer@1.0.0","_shasum":"0c5c9fd6400e3c3f79c18d8d2241ee0f0bb18d60","_from":".","_npmVersion":"3.9.5","_nodeVersion":"6.2.2","_npmUser":{"name":"luizzamboni","email":"luizamboni2002@hotmail.com"},"dist":{"shasum":"0c5c9fd6400e3c3f79c18d8d2241ee0f0bb18d60","tarball":"https://registry.npmjs.org/resilient-consumer/-/resilient-consumer-1.0.0.tgz","integrity":"sha512-Vv1txjZxMVJ693DvdfVo2baFEPo5impBu5jyEi12wie+8fSVXq2H/J38pvSOi/BaQEuHX805++I6xmUJWkc/RQ==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCICYR204OpQ37xgqxiFL4O3tQfFkinskVlYFYeLVDhgOWAiBXPnlSkmNgijqlpCLChcB7YKlv/R4IMH0h9sTu8Z1wQQ=="}]},"maintainers":[{"name":"luizzamboni","email":"luizamboni2002@hotmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/resilient-consumer-1.0.0.tgz_1509474489360_0.4105062410235405"},"directories":{}},"1.0.1":{"name":"resilient-consumer","version":"1.0.1","description":"resilient consumer prof","main":"index.js","scripts":{"test":"NODE_ENV=test mocha"},"keywords":["resiliense","consumer","ampq"],"repository":{"type":"git","url":"git+https://github.com/admatic-tool/resilient-worker.git"},"author":{"name":"Luiz Zamboni"},"license":"ISC","dependencies":{"amqp":"^0.2.6","amqplib":"^0.5.1","co":"^4.6.0","uuid":"^3.1.0"},"devDependencies":{"chai":"^4.1.2","mocha-co":"^1.17.2","rabbit-test-helper":"^1.0.1","sinon":"^4.0.2"},"gitHead":"d977b0c35400b84c42996954e14067baca5f63be","bugs":{"url":"https://github.com/admatic-tool/resilient-worker/issues"},"homepage":"https://github.com/admatic-tool/resilient-worker#readme","_id":"resilient-consumer@1.0.1","_shasum":"e168a098a5706fc2f0be9066ca9298d96eeeff52","_from":".","_npmVersion":"3.9.5","_nodeVersion":"6.2.2","_npmUser":{"name":"luizzamboni","email":"luizamboni2002@hotmail.com"},"dist":{"shasum":"e168a098a5706fc2f0be9066ca9298d96eeeff52","tarball":"https://registry.npmjs.org/resilient-consumer/-/resilient-consumer-1.0.1.tgz","integrity":"sha512-UQQRDC8PaHI+nQFOQDnpDLn/tY0EQG3cNHjRjjDwIojq+qqB0CasiWtyzsRaggWsfSU9CoP/ZMdJ7maqwN4nNg==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIHefFNHQ02nWmLcRNMzfaUBInGmCSx9K7Lo7B1umwzQxAiEAwJ+BElWkR8yJ+n7NhGL0HYsMr6FkPKTa7LMLy4em250="}]},"maintainers":[{"name":"luizzamboni","email":"luizamboni2002@hotmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/resilient-consumer-1.0.1.tgz_1510175917861_0.12867345847189426"},"directories":{}},"1.0.2":{"name":"resilient-consumer","version":"1.0.2","description":"resilient consumer prof","main":"index.js","scripts":{"test":"NODE_ENV=test mocha"},"keywords":["resiliense","consumer","ampq"],"repository":{"type":"git","url":"git+https://github.com/admatic-tool/resilient-worker.git"},"author":{"name":"Luiz Zamboni"},"license":"ISC","dependencies":{"amqp":"^0.2.6","amqplib":"^0.5.1","co":"^4.6.0","uuid":"^3.1.0"},"devDependencies":{"chai":"^4.1.2","mocha-co":"^1.17.2","rabbit-test-helper":"^1.0.1","sinon":"^4.0.2"},"gitHead":"bede0a336ff0d7923f6f4bd2ca8c1b9344603229","bugs":{"url":"https://github.com/admatic-tool/resilient-worker/issues"},"homepage":"https://github.com/admatic-tool/resilient-worker#readme","_id":"resilient-consumer@1.0.2","_shasum":"bd0a0b96e0734925aa40664edf82272fc362751f","_from":".","_npmVersion":"3.9.5","_nodeVersion":"6.2.2","_npmUser":{"name":"luizzamboni","email":"luizamboni2002@hotmail.com"},"dist":{"shasum":"bd0a0b96e0734925aa40664edf82272fc362751f","tarball":"https://registry.npmjs.org/resilient-consumer/-/resilient-consumer-1.0.2.tgz","integrity":"sha512-D73nK1hCkFsCTW60O8oWZt/9RU8pKG1mK/vrT+nDCumRYmEeTbW6INRQZmbNqqJqDRTrLNPFqSb8VxPzLZevdg==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCV55fGmyjbHinfWri+PkhffVfG2JyvRHMFi4vlEBjqsAIgOV8D7H56rV4x5bzSL1hJl2QbnHHqKdi30izXKUKCd2M="}]},"maintainers":[{"name":"luizzamboni","email":"luizamboni2002@hotmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/resilient-consumer-1.0.2.tgz_1511814036659_0.8834090433083475"},"directories":{}},"1.0.4":{"name":"resilient-consumer","version":"1.0.4","description":"resilient consumer prof","main":"index.js","scripts":{"test":"NODE_ENV=test mocha"},"keywords":["resiliense","consumer","ampq"],"repository":{"type":"git","url":"git+https://github.com/admatic-tool/resilient-worker.git"},"author":{"name":"Luiz Zamboni"},"license":"ISC","dependencies":{"amqp":"^0.2.6","amqplib":"^0.5.1","co":"^4.6.0","uuid":"^3.1.0"},"devDependencies":{"chai":"^4.1.2","mocha-co":"^1.17.2","rabbit-test-helper":"^1.0.1","sinon":"^4.0.2"},"gitHead":"02459b77141687c4b4e46364b9536d34bbe7a3cd","bugs":{"url":"https://github.com/admatic-tool/resilient-worker/issues"},"homepage":"https://github.com/admatic-tool/resilient-worker#readme","_id":"resilient-consumer@1.0.4","_shasum":"e2e447c2c037bed35c2cfbd3eede6261c1aae26f","_from":".","_npmVersion":"3.9.5","_nodeVersion":"6.2.2","_npmUser":{"name":"luizzamboni","email":"luizamboni2002@hotmail.com"},"dist":{"shasum":"e2e447c2c037bed35c2cfbd3eede6261c1aae26f","tarball":"https://registry.npmjs.org/resilient-consumer/-/resilient-consumer-1.0.4.tgz","integrity":"sha512-1kt8UenPGLt9/A2QXqd08+71A2UvSGRX1tJReGdkDS5xidZF1PD4PqehOqOolmVF8G5S1qx8hJaJuYL22dvrhA==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQD+zgpBqsPvC46oOY6ccAdXY8oRfng8yXsrHh5g20wcuwIhAIjlAwdhFgKWi3tSjZ40SnKSCfJdvRfLjXMmQqOmIh59"}]},"maintainers":[{"name":"luizzamboni","email":"luizamboni2002@hotmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/resilient-consumer-1.0.4.tgz_1517407960226_0.6973121925257146"},"directories":{}},"1.1.0":{"name":"resilient-consumer","version":"1.1.0","description":"resilient consumer prof","main":"index.js","scripts":{"test":"NODE_ENV=test mocha"},"keywords":["resiliense","consumer","ampq"],"repository":{"type":"git","url":"git+https://github.com/admatic-tool/resilient-worker.git"},"author":{"name":"Luiz Zamboni"},"license":"ISC","dependencies":{"amqp":"^0.2.6","amqp-connection-manager":"^1.3.7","amqplib":"^0.5.2","co":"^4.6.0","uuid":"^3.1.0"},"devDependencies":{"chai":"^4.1.2","mocha-co":"^1.17.2","rabbit-test-helper":"^1.0.1","sinon":"^4.0.2"},"gitHead":"952f8642ec903699e88208199ef9a8c237fc357f","bugs":{"url":"https://github.com/admatic-tool/resilient-worker/issues"},"homepage":"https://github.com/admatic-tool/resilient-worker#readme","_id":"resilient-consumer@1.1.0","_shasum":"9283c478cfadf5f06d2840c08584c2251f8c8d47","_from":".","_npmVersion":"3.9.5","_nodeVersion":"6.2.2","_npmUser":{"name":"luizzamboni","email":"luizamboni2002@hotmail.com"},"dist":{"shasum":"9283c478cfadf5f06d2840c08584c2251f8c8d47","tarball":"https://registry.npmjs.org/resilient-consumer/-/resilient-consumer-1.1.0.tgz","fileCount":16,"unpackedSize":21421,"integrity":"sha512-rg/9pydu7cM/hgFkcubcgxks9F+RrnBjAnbdj5PWxT5NqpI6YEoQjxUUenSnPS5LjpLsqmkPY4+W2MnbKomMZQ==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCHy008xRS+0Wu7nqiVLZ8VyDwjYLlp9hjrYXgT9P58NMCIQDDPL9w2ho0obS5BqPMAQjCq0NsFJH2LoWa74t2Y6X2sw=="}]},"maintainers":[{"name":"luizzamboni","email":"luizamboni2002@hotmail.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/resilient-consumer_1.1.0_1520605615936_0.9331474997945788"},"_hasShrinkwrap":false},"1.1.1":{"name":"resilient-consumer","version":"1.1.1","description":"resilient consumer prof","main":"index.js","scripts":{"test":"NODE_ENV=test mocha"},"keywords":["resiliense","consumer","ampq"],"repository":{"type":"git","url":"git+https://github.com/admatic-tool/resilient-worker.git"},"author":{"name":"Luiz Zamboni"},"license":"ISC","dependencies":{"amqp":"^0.2.6","amqp-connection-manager":"^1.3.7","amqplib":"^0.5.2","co":"^4.6.0","uuid":"^3.1.0"},"devDependencies":{"chai":"^4.1.2","mocha-co":"^1.17.2","rabbit-test-helper":"^1.0.1","sinon":"^4.0.2"},"gitHead":"168693de5f51ca34306f7dd69a576c8725a6afd5","bugs":{"url":"https://github.com/admatic-tool/resilient-worker/issues"},"homepage":"https://github.com/admatic-tool/resilient-worker#readme","_id":"resilient-consumer@1.1.1","_shasum":"2528ab7b071a43e791070485d3c2a93036246cca","_from":".","_npmVersion":"3.9.5","_nodeVersion":"6.2.2","_npmUser":{"name":"luizzamboni","email":"luizamboni2002@hotmail.com"},"dist":{"shasum":"2528ab7b071a43e791070485d3c2a93036246cca","tarball":"https://registry.npmjs.org/resilient-consumer/-/resilient-consumer-1.1.1.tgz","fileCount":16,"unpackedSize":21192,"integrity":"sha512-fVBmF09iDUDNly5fLU8VvFPAC2AnWHcB9hxLexg+tPTfIano3c53LviaRuBfCNPwFFR4jOtOn4/LdCCxAjz5JQ==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIDIL8zgPPQjdZd3zvG22o+LNB1w3PdAzMQL/nCTSybKJAiEAnatgk/GK9EUPLZOASju3dCpLSQEwWFmfDjM/9hUCspo="}]},"maintainers":[{"name":"luizzamboni","email":"luizamboni2002@hotmail.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/resilient-consumer_1.1.1_1520606425358_0.09899445066828627"},"_hasShrinkwrap":false},"1.1.2":{"name":"resilient-consumer","version":"1.1.2","description":"resilient consumer prof","main":"index.js","scripts":{"test":"NODE_ENV=test mocha"},"keywords":["resiliense","consumer","ampq"],"repository":{"type":"git","url":"git+https://github.com/admatic-tool/resilient-worker.git"},"author":{"name":"Luiz Zamboni"},"license":"ISC","dependencies":{"amqp":"^0.2.6","amqplib":"^0.5.1","co":"^4.6.0","uuid":"^3.1.0"},"devDependencies":{"chai":"^4.1.2","mocha-co":"^1.17.2","rabbit-test-helper":"^1.0.1","sinon":"^4.0.2"},"gitHead":"8ed88b15e794bdf7a6467e30603383eec90e15a2","bugs":{"url":"https://github.com/admatic-tool/resilient-worker/issues"},"homepage":"https://github.com/admatic-tool/resilient-worker#readme","_id":"resilient-consumer@1.1.2","_shasum":"4bf6c9b6286e684a4801beaa438198bb29d71f3b","_from":".","_npmVersion":"3.9.5","_nodeVersion":"6.2.2","_npmUser":{"name":"luizzamboni","email":"luizamboni2002@hotmail.com"},"dist":{"shasum":"4bf6c9b6286e684a4801beaa438198bb29d71f3b","tarball":"https://registry.npmjs.org/resilient-consumer/-/resilient-consumer-1.1.2.tgz","fileCount":16,"unpackedSize":21121,"integrity":"sha512-mZep9RNA0HXxkinkdbcdxPh1CUlyd6d8nTwFGchQFZ2znx7CY6MflpVLWffp6iuGIawvvYD1eDI1+BAdy64n0A==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIE21jLUfetXxX0W86wWt6JjPDS57sC9Sm8SlaYclEYiTAiA3+8ZJY/w/Zt6NMtF8UR0CnAgsSMEYtUqr2G+RwD7tAg=="}]},"maintainers":[{"name":"luizzamboni","email":"luizamboni2002@hotmail.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/resilient-consumer_1.1.2_1521057959110_0.49510315618505074"},"_hasShrinkwrap":false},"1.1.3":{"name":"resilient-consumer","version":"1.1.3","description":"resilient consumer prof","main":"index.js","scripts":{"test":"NODE_ENV=test mocha"},"keywords":["resiliense","consumer","ampq"],"repository":{"type":"git","url":"git+https://github.com/admatic-tool/resilient-worker.git"},"author":{"name":"Luiz Zamboni"},"license":"ISC","dependencies":{"amqp":"^0.2.6","amqplib":"^0.5.1","co":"^4.6.0","uuid":"^3.1.0"},"devDependencies":{"chai":"^4.1.2","mocha-co":"^1.17.2","rabbit-test-helper":"^1.0.1","sinon":"^4.0.2"},"gitHead":"3419b6e527fe87b217556f83d364299f00543c13","bugs":{"url":"https://github.com/admatic-tool/resilient-worker/issues"},"homepage":"https://github.com/admatic-tool/resilient-worker#readme","_id":"resilient-consumer@1.1.3","_shasum":"ab54fa15597916061b675bfc076b045c9fc0f987","_from":".","_npmVersion":"3.9.5","_nodeVersion":"6.2.2","_npmUser":{"name":"luizzamboni","email":"luizamboni2002@hotmail.com"},"dist":{"shasum":"ab54fa15597916061b675bfc076b045c9fc0f987","tarball":"https://registry.npmjs.org/resilient-consumer/-/resilient-consumer-1.1.3.tgz","fileCount":16,"unpackedSize":21117,"integrity":"sha512-PIFG0zvcjq1pdsp3EIbFUINDGg65xOF78Ga5oUa8LNUl7QQxQ2Qc90EvBAPLPi29mCLWHElvZ58x4ZE0FyP7qA==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCNlbzQA1CmN1yD0F4N/6SHOh5TI5NJxgmpIQZ1NcYPkAIgRaBRh4oGWO2zm2AqD0x6FGFklHaOYmRLuCxAid64oQM="}]},"maintainers":[{"name":"luizzamboni","email":"luizamboni2002@hotmail.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/resilient-consumer_1.1.3_1521148759707_0.6033860669183246"},"_hasShrinkwrap":false},"1.2.3":{"name":"resilient-consumer","version":"1.2.3","description":"resilient consumer prof","main":"index.js","scripts":{"test":"NODE_ENV=test mocha"},"keywords":["resiliense","consumer","ampq"],"repository":{"type":"git","url":"git+https://github.com/admatic-tool/resilient-worker.git"},"author":{"name":"Luiz Zamboni"},"license":"ISC","dependencies":{"amqp":"^0.2.6","amqplib":"^0.5.1","co":"^4.6.0","uuid":"^3.1.0"},"devDependencies":{"chai":"^4.1.2","mocha-co":"^1.17.2","rabbit-test-helper":"^1.0.1","sinon":"^4.0.2"},"gitHead":"ed809fe286da004cdf300dc0f2609f03c059632d","bugs":{"url":"https://github.com/admatic-tool/resilient-worker/issues"},"homepage":"https://github.com/admatic-tool/resilient-worker#readme","_id":"resilient-consumer@1.2.3","_shasum":"f75377d40c0b0427f517394b68057bde338a6d3a","_from":".","_npmVersion":"3.9.5","_nodeVersion":"6.2.2","_npmUser":{"name":"luizzamboni","email":"luizamboni2002@hotmail.com"},"dist":{"shasum":"f75377d40c0b0427f517394b68057bde338a6d3a","tarball":"https://registry.npmjs.org/resilient-consumer/-/resilient-consumer-1.2.3.tgz","fileCount":16,"unpackedSize":21192,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJa1jjyCRA9TVsSAnZWagAAKMYP+QH71wev310CqrAxY1/A\ndQmLXMRNZxxem/soC14vTbHvkoGhxhfQ1zxDHGqaFvbii0jchdWB/Wpe6rCc\n/RLUcRg1L6hMSYQxBgKon23Z1cT7mTbILvqxQiUcUDPJuq7o+HrRClbRy21W\nLAY96m3EDGpNhsHhVatd+8zGvp1PFXGVXHwg1EkvBXJw4hx49CeaGCd4SLYY\nJ2mXSn5oYHJYOLJPeOdDpptgrfe0ii+AsogIvZvvlmPOlF6hq9ryOLUkGnJz\nCeMEv6zfSVz6g913pVhP9ezFg7BgRi3Enidxtjo8TgOhVlUpc4PlqAXPpI3u\nNtfKqeV5BUDJs0s+VKo9ltmRJvKXs0TazQgDrFwJ0yR4JveurG8iRJTAKPjU\nVn+4iVXebKVNbyL4i+c650pJqpX8eRIcWYQ1/tZg1o12pbbVZysNEwIAp4wj\nw0kBQLGTJNiKViMy162cEcxs6u2akdx7hRtn25+8aTRk48WOvfD8z9rcWBvG\nMZq4Rfby3uvg9bnGBsfDi31LQNunbuTJLlosPkUA/aCpBIqe9GefP0luB16u\n1uTOxeNyeLwdOg9BsrT/NnyXEcopBBHv/Whjo+x/Oue4VHcayC/62xEThNvZ\nytMJA6rGgZ7lyT0RNqpA8u/RElJ6Ivw21ClOY5D4gRh3FSIN+85XMjUPnWvd\nmMZ8\r\n=ZnvS\r\n-----END PGP SIGNATURE-----\r\n","integrity":"sha512-42Wv6647WxXWgCCQ1dHxRFZc+ouaawDrTyXe8Uy/vFCNY7OY9RW3soeKhbvGtqHHe4XoNan/iEug1cI0GbcpKA==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCB3WBCEpVxNmEXbM5+GCnwvM57q2h9A8JNBik1KNVuKAIhAOEXldmsWlJZc5gFCl6t+d267yuMQMF5qIRQ72fuYz/6"}]},"maintainers":[{"name":"luizzamboni","email":"luizamboni2002@hotmail.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/resilient-consumer_1.2.3_1523988721754_0.5133411573132725"},"_hasShrinkwrap":false},"2.0.0-rc1":{"name":"resilient-consumer","version":"2.0.0-rc1","description":"resilient consumer prof","main":"index.js","scripts":{"test":"NODE_ENV=test mocha"},"keywords":["resiliense","consumer","ampq"],"repository":{"type":"git","url":"git+https://github.com/admatic-tool/resilient-worker.git"},"author":{"name":"Luiz Zamboni"},"license":"ISC","dependencies":{"amqp":"^0.2.6","amqplib":"^0.5.1","aws-sdk":"^2.254.1","co":"^4.6.0","underscore":"^1.9.1","uuid":"^3.1.0"},"devDependencies":{"chai":"^4.1.2","co-mocha":"^1.2.2","mocha":"^5.2.0","rabbit-test-helper":"^1.0.1","sinon":"^4.0.2"},"readme":"Resilient Worker\n===\nIs a worker library designed to works with different queue brokers (actualy **RabbitMQ** and  **AWS SQS**), offerting a common interface to **retry policy**, **successCallbacks**, **failCallbacks** , **ignore messages** and **bulk processing**.\n\n\n# Table of Contents\n - [Install](#install)\n - [Usage](#usage)\n   * [Example](#example)\n   * [Log](#log)\n   * [Do not Retry](#do-not-retry)\n   * [Idempotency](#idempotency)\n   * [SQL](#sqs)\n - [Roadmap](#roadmap)\n\n\n# Install\n```bash\n$ npm install resilient-consumer --save\n```\n\n# Usage\n\n## Example\n```javascript\nconst WorkerFactory = require(\"resilient-consumer\")\n\n\n/**\n * gen worker/publish pair\n*/ \n\nconst { worker, publish } = WorkerFactory.createWorker({\n\n  /**\n   * identity of worker\n  */\n  name: \"RandomWorker\",\n\n  /**\n   * (default: rabbit)\n  */\n  broker: \"rabbit\",\n\n  /**\n   * (Only for rabbitMq)\n   */\n  connectUrl: \"amqp://localhost\",\n\n  /**\n   * The target Queue that worker will consume\n   */\n  queue: \"job_example_queue\",\n  \n  /** \n    * (default: 1)\n    * Is a size of bulk messages that need be filled before worker begin to proccess messages\n    * (obs: If bulk not be filled in 10 seconds, it will be flushed too)\n  */\n  bulkSize: 10,\n\n  /**\n  * (optional)\n  * (Only for rabbitMq)\n  */ \n  publishIn: {\n    routingKey: \"jobs_key\",\n    exchange: \"test\",\n  },\n\n  /**\n   * max_try: max number of executing callback per message\n   */\n  max_try: 4,\n  \n  /** \n   * (optional) \n   * If setted the retry proccess will smooth by waiting this value in milisseconds before resend message to queue\n  */\n  retry_timeout: 1000,\n\n  /**\n   * (optional)\n   * (Only for rabbitMq)\n   * queueOptions: If is setted are useds to assert queue, create queue if it not exists\n   * or confirm these properties in target queue before start()\n  */\n  queueOptions: {\n    durable: true,\n    messageTtl: 60*1000,\n    maxLength: 50,\n    deadLetterExchange: \"job_example_deads\"\n  },\n\n  /**\n   * callback(messages):\n   * In this method the messages will be processed by your business logic\n   * and marked with some flags wich updates it internal state\n   */\n  callback(mesages) {\n    const [ min, max ] = [ 1 , 10 ]\n    const chanceOfFail = 8\n\n    for(const msg of messages) {\n      try {\n        const event = Math.random() * (max - min) + min\n\n        if(event <= chanceOfFail)\n          throw Error(\"random error\")\n\n        // get message content already parsed in object\n        const { value } = msg.getParserdContent()\n\n        // mark message as success end deliver to it a payload\n        msg.setSuccess({ newValue: event + value })\n\n      } catch(err) {\n        // mark message as failed and deliver to it a error\n        msg.setFailed(err)\n      }\n    }\n  },\n\n\n  /**\n   * failCallback(messages):\n   * (optional) \n   * If setted is called to messages that fails (markeds by msg#setFailed()) in a bulk and can not be retryed\n   */\n  failCallback(messages)  {\n    console.error(\"fail callback for\", messages)\n  }),\n\n  /**\n   * successCallback(messages):\n   * (optional) \n   * If setted is called to messages that success in a bulk (or without errors)\n   */\n  successCallback(messages) {\n    console.log(\"sucess callback for\", messages)\n  })\n})\n\n/**\n * use publishIn(if setted) or queue to send a message to your destin\n*/\npublish({ value: 1 })\npublish({ value: 3 })\npublish({ value: 4 })\npublish({ value: 5 })\n\n/**\n * start worker to consume target queue\n */\nworker.start()\n```\n\n\n## Log\n**Resilient-Consumer** is agnostic of logger method, but it emits events\nthat can be tracked by `worker.on(eventName, callback(...params))` method\n\n\n```javascript\nworker.start()\n\n/**\n * tack all \"log\" events, and works on these events\n*/\nworker.on(\"log\", (workerName, ...data) => {\n  const [ level, messages, action ] = data\n\n  switch (level) {\n    case \"debug\":\n      messages.forEach(msg => {\n        logger.debug(...[ workerName, msg.messageId(), msg.tryCount(), msg.getParsedContent(), action ])\n      })\n      break\n\n    case \"error\":\n      messages.forEach(msg => {\n        logger.error(...[ workerName, msg.messageId(), msg.tryCount(), msg.getParsedContent(), action ])\n      })\n      break\n  }\n})\n```\n\n## Do Not Retry\n\nIn some cases the message payload have problems (missing fields and others when not works more retries).\nFor these cases use `msg.doNotContinueTry()` to mark message to not continue retry.\n\n\n```javascript\ncallback(messages) {\n  for(const msg of messages) {\n    const values = msg.getParsedContent()\n      apiClient.add(values)\n                .then(res => msg.setSuccess({ msg: \"ok\" }))\n                .catch(err => {\n                  msg.setFail(err)\n                  // statusCode 4xx represents in http api a problem with client\n                  if(err.statusCode => 400 && err.statusCode > 500) {\n                    // this message not will be retryed\n                    msg.doNotContinueTry()\n                  }\n                })\n  }\n}\n```\n\n## Idempotency\nSome workers need to be idempotent and do not proccess same type of message twice,\nuse `msg.setIgnore()` to mark message to be ignored and it not will pass by `worker.successCallback()` or `worker.failCallback()` and not will be retried too.\n\n```javascript\ncallback(messages) {\n\n  for(const msg of messages) {\n    try {\n      if(alreadyProcessed(msg.getMessageId())) {\n        // mark message to be ignored\n        msg.setIgnore()\n      } else {\n        /** works on message **/\n      }\n    }\n  }\n}\n```\n\n## SQS \n**Experimental**\nThe sqs worker will load your credendials by your **aws credential file** or by envvars:\n  - AWS_ACCESS_KEY_ID\n  - AWS_SECRET_ACCESS_KEY\n\n\n```javascript\n\nconst { worker, publish } = WorkerFactory.createWorker({\n\n  \n  name: \"SqsWorker\",\n\n  /**\n   * set \"sqs\" value to broker attribute\n  */\n  broker: \"sqs\",\n\n  /**\n   * set region in aws\n  */\n  aws: {\n    region: \"us-east-1\",\n  },\n  /**\n   * specify a queue name in AWS sqs\n   * (obs: today this will be a queue where a publish() will deliver message )\n  */\n  queue: \"development-worker.fifo\",\n\n  bulkSize: 10,\n  max_try: 4,\n  callback(mesages) {\n    // business logic ...\n  },\n})\n```\n\n# Roadmap\n  - suport publish in **AWS SNS Topic** to aws `publish()` , using `publishIn` attribute","readmeFilename":"README.md","gitHead":"6426796b8d34109de62ab3b9a65f53bcdd826d88","bugs":{"url":"https://github.com/admatic-tool/resilient-worker/issues"},"homepage":"https://github.com/admatic-tool/resilient-worker#readme","_id":"resilient-consumer@2.0.0-rc1","_shasum":"cb63d90df4bd14ae890b5886f96ac6f31b307a9f","_from":".","_npmVersion":"3.10.10","_nodeVersion":"6.10.1","_npmUser":{"name":"dentxinho","email":"raul_baldner_junior@hotmail.com"},"dist":{"shasum":"cb63d90df4bd14ae890b5886f96ac6f31b307a9f","tarball":"https://registry.npmjs.org/resilient-consumer/-/resilient-consumer-2.0.0-rc1.tgz","fileCount":21,"unpackedSize":44532,"integrity":"sha512-cz7Gj1in/DE7lkE7oaNbXjlmYlu439twcY9+0paMb/CGAng0SvWs1unTSet1mbie2Frg9ZH7ST35wRmuZMRfdw==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIEjSpUwDmijrnP+qnugyxmsve0+6RLzZuMohn/xnczoyAiEAwEfMpOlvrUybhLUVpRvYNW5dde135jm1DJXevvED0P8="}]},"maintainers":[{"email":"raul_baldner_junior@hotmail.com","name":"dentxinho"},{"email":"luizamboni2002@hotmail.com","name":"luizzamboni"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/resilient-consumer_2.0.0-rc1_1533236586823_0.37398200864198716"},"_hasShrinkwrap":false},"2.0.0-rc2":{"name":"resilient-consumer","version":"2.0.0-rc2","description":"resilient consumer prof","main":"index.js","scripts":{"test":"NODE_ENV=test mocha"},"keywords":["resiliense","consumer","ampq"],"repository":{"type":"git","url":"git+https://github.com/admatic-tool/resilient-worker.git"},"author":{"name":"Luiz Zamboni"},"license":"ISC","dependencies":{"amqp":"^0.2.6","amqplib":"^0.5.1","aws-sdk":"^2.254.1","co":"^4.6.0","underscore":"^1.9.1","uuid":"^3.1.0"},"devDependencies":{"chai":"^4.1.2","co-mocha":"^1.2.2","mocha":"^5.2.0","rabbit-test-helper":"^1.0.1","sinon":"^4.0.2"},"readme":"Resilient Worker\n===\nA worker lib designed to pull-and-process messages from different queue brokers (actually supporting **RabbitMQ** and  **AWS SQS**), which offers a common interface to **retry policy**, **successCallbacks**, **failCallbacks** , **ignore messages** and **bulk processing**.\n\n\n# Table of Contents\n - [Install](#install)\n - [Usage](#usage)\n   * [Example](#example)\n   * [Log](#log)\n   * [Do not Retry](#do-not-retry)\n   * [Idempotency](#idempotency)\n   * [SQL](#sqs)\n - [Roadmap](#roadmap)\n\n\n# Install\n```bash\n$ npm install resilient-consumer --save\n```\n\n# Usage\n\n## Example\n```javascript\nconst WorkerFactory = require(\"resilient-consumer\")\n\n\n/**\n * gen worker/publish pair\n*/ \n\nconst { worker, publish } = WorkerFactory.createWorker({\n\n  /**\n   * identity of worker\n  */\n  name: \"RandomWorker\",\n\n  /**\n   * (default: rabbit)\n  */\n  broker: \"rabbit\",\n\n  /**\n   * (Only for rabbitMq)\n   */\n  connectUrl: \"amqp://localhost\",\n\n  /**\n   * The target Queue that worker will consume\n   */\n  queue: \"job_example_queue\",\n  \n  /** \n    * (default: 1)\n    * Is a size of bulk messages that need be filled before worker begin to proccess messages\n    * (obs: If bulk not be filled in 10 seconds, it will be flushed too)\n  */\n  bulkSize: 10,\n\n  /**\n  * (optional)\n  * (Only for rabbitMq)\n  */ \n  publishIn: {\n    routingKey: \"jobs_key\",\n    exchange: \"test\",\n  },\n\n  /**\n   * max_try: max number of executing callback per message\n   */\n  max_try: 4,\n  \n  /** \n   * (optional) \n   * If setted the retry proccess will smooth by waiting this value in milisseconds before resend message to queue\n  */\n  retry_timeout: 1000,\n\n  /**\n   * (optional)\n   * (Only for rabbitMq)\n   * queueOptions: If is setted are useds to assert queue, create queue if it not exists\n   * or confirm these properties in target queue before start()\n  */\n  queueOptions: {\n    durable: true,\n    messageTtl: 60*1000,\n    maxLength: 50,\n    deadLetterExchange: \"job_example_deads\"\n  },\n\n  /**\n   * callback(messages):\n   * In this method the messages will be processed by your business logic\n   * and marked with some flags wich updates it internal state\n   */\n  callback(mesages) {\n    const [ min, max ] = [ 1 , 10 ]\n    const chanceOfFail = 8\n\n    for(const msg of messages) {\n      try {\n        const event = Math.random() * (max - min) + min\n\n        if(event <= chanceOfFail)\n          throw Error(\"random error\")\n\n        // get message content already parsed in object\n        const { value } = msg.getParserdContent()\n\n        // mark message as success end deliver to it a payload\n        msg.setSuccess({ newValue: event + value })\n\n      } catch(err) {\n        // mark message as failed and deliver to it a error\n        msg.setFailed(err)\n      }\n    }\n  },\n\n\n  /**\n   * failCallback(messages):\n   * (optional) \n   * If setted is called to messages that fails (markeds by msg#setFailed()) in a bulk and can not be retryed\n   */\n  failCallback(messages)  {\n    console.error(\"fail callback for\", messages)\n  }),\n\n  /**\n   * successCallback(messages):\n   * (optional) \n   * If setted is called to messages that success in a bulk (or without errors)\n   */\n  successCallback(messages) {\n    console.log(\"sucess callback for\", messages)\n  })\n})\n\n/**\n * use publishIn(if setted) or queue to send a message to your destin\n*/\npublish({ value: 1 })\npublish({ value: 3 })\npublish({ value: 4 })\npublish({ value: 5 })\n\n/**\n * start worker to consume target queue\n */\nworker.start()\n```\n\n\n## Log\n**Resilient-Consumer** is agnostic in terms of logging strategy, but it does emit trackable log events, implemented by the pattern `worker.on(eventName, callback(...params))`\n\n\n```javascript\nworker.start()\n\n/**\n * tack all \"log\" events, and works on these events\n */\nworker.on(\"log\", (workerName, ...data) => {\n  const [ level, messages, action ] = data\n\n  switch (level) {\n    case \"debug\":\n      messages.forEach(msg => {\n        logger.debug(...[ workerName, msg.messageId(), msg.tryCount(), msg.getParsedContent(), action ])\n      })\n      break\n\n    case \"error\":\n      messages.forEach(msg => {\n        logger.error(...[ workerName, msg.messageId(), msg.tryCount(), msg.getParsedContent(), action ])\n      })\n      break\n  }\n})\n```\n\n## Do Not Retry\n\nThe message payload may have errors sometimes (such as missing fields or other problems which doesn't worth a retry). For those cases you can use `msg.doNotContinueTry()` and mark the message to prevent the worker from retrying to process it.\n\n\n```javascript\ncallback(messages) {\n  for(const msg of messages) {\n    const values = msg.getParsedContent()\n      apiClient.add(values)\n                .then(res => msg.setSuccess({ msg: \"ok\" }))\n                .catch(err => {\n                  msg.setFail(err)\n                  // statusCode 4xx represents in http api a problem with client\n                  if(err.statusCode => 400 && err.statusCode > 500) {\n                    // this message not will be retryed\n                    msg.doNotContinueTry()\n                  }\n                })\n  }\n}\n```\n\n## Idempotency\nYou may need a worker with idempotent behavior for some types of messages, which means that it won't retry to process them twice. Mark those messages with `msg.setIgnore()` and they will also bypass `worker.successCallback()` and `worker.failCallback()` methods.\n\n```javascript\ncallback(messages) {\n\n  for(const msg of messages) {\n    try {\n      if(alreadyProcessed(msg.getMessageId())) {\n        // mark message to be ignored\n        msg.setIgnore()\n      } else {\n        /** works on message **/\n      }\n    }\n  }\n}\n```\n\n## SQS \n**Experimental**\n\nThe SQS worker will load your credendials from an **aws credential file** or from envvars:\n  - AWS_ACCESS_KEY_ID\n  - AWS_SECRET_ACCESS_KEY\n\n\n```javascript\n\nconst { worker, publish } = WorkerFactory.createWorker({\n\n  \n  name: \"SqsWorker\",\n\n  /**\n   * set \"sqs\" value to broker attribute\n  */\n  broker: \"sqs\",\n\n  /**\n   * set region in aws\n  */\n  aws: {\n    region: \"us-east-1\",\n  },\n  /**\n   * specify a queue name in AWS sqs\n   * (obs: today this will be a queue where a publish() will deliver message )\n  */\n  queue: \"development-worker.fifo\",\n\n  bulkSize: 10,\n  max_try: 4,\n  callback(mesages) {\n    // business logic ...\n  },\n})\n```\n\n# Roadmap\n  - Support for publishing in **AWS SNS Topic** to aws `publish()`, using the worker's `publishIn` attribute. << não entendi","readmeFilename":"README.md","gitHead":"0aa5a0f84d2d2aca5b6911f2e252591e3fae0111","bugs":{"url":"https://github.com/admatic-tool/resilient-worker/issues"},"homepage":"https://github.com/admatic-tool/resilient-worker#readme","_id":"resilient-consumer@2.0.0-rc2","_shasum":"582295c37d7ef68a68894caef10c5463ab6b9b2d","_from":".","_npmVersion":"3.10.10","_nodeVersion":"6.10.1","_npmUser":{"name":"dentxinho","email":"raul_baldner_junior@hotmail.com"},"dist":{"shasum":"582295c37d7ef68a68894caef10c5463ab6b9b2d","tarball":"https://registry.npmjs.org/resilient-consumer/-/resilient-consumer-2.0.0-rc2.tgz","fileCount":21,"unpackedSize":45006,"integrity":"sha512-88eFq3vJBmw0Ejpqsau2tXVpPDqx5HVwY+J5lC+Be/MCngOlS5oG568LHlI2EVY12mgDoLpXj+biGRgtaK19eA==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDntAydVuYiT7piBq2sEGnt7GyNIt3FY6DdDNU3KjeM1wIhAO99pjRHuv0ZDt+DmcpHCdYTDgbe9e2ADjeVfCQiI2jY"}]},"maintainers":[{"email":"raul_baldner_junior@hotmail.com","name":"dentxinho"},{"email":"luizamboni2002@hotmail.com","name":"luizzamboni"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/resilient-consumer_2.0.0-rc2_1533247908591_0.782620602714025"},"_hasShrinkwrap":false},"2.0.0-rc3":{"name":"resilient-consumer","version":"2.0.0-rc3","description":"resilient consumer prof","main":"index.js","scripts":{"test":"NODE_ENV=test mocha"},"keywords":["resiliense","consumer","ampq"],"repository":{"type":"git","url":"git+https://github.com/admatic-tool/resilient-worker.git"},"author":{"name":"Luiz Zamboni"},"license":"ISC","dependencies":{"amqp":"^0.2.6","amqplib":"^0.5.2","aws-sdk":"^2.254.1","co":"^4.6.0","underscore":"^1.9.1","uuid":"^3.1.0"},"devDependencies":{"chai":"^4.1.2","co-mocha":"^1.2.2","mocha":"^5.2.0","rabbit-test-helper":"^1.0.1","sinon":"^4.0.2"},"readme":"Resilient Worker\n===\nA worker lib designed to pull-and-process messages from different queue brokers (actually supporting **RabbitMQ** and  **AWS SQS**), which offers a common interface to **retry policy**, **successCallbacks**, **failCallbacks** , **ignore messages** and **bulk processing**.\n\n\n# Table of Contents\n - [Install](#install)\n - [Usage](#usage)\n   * [Example](#example)\n   * [Log](#log)\n   * [Do not Retry](#do-not-retry)\n   * [Idempotency](#idempotency)\n   * [SQL](#sqs)\n - [Roadmap](#roadmap)\n\n\n# Install\n```bash\n$ npm install resilient-consumer --save\n```\n\n# Usage\n\n## Example\n```javascript\nconst WorkerFactory = require(\"resilient-consumer\")\n\n\n/**\n * gen worker/publish pair\n*/ \n\nconst { worker, publish } = WorkerFactory.createWorker({\n\n  /**\n   * identity of worker\n  */\n  name: \"RandomWorker\",\n\n  /**\n   * (default: rabbit)\n  */\n  broker: \"rabbit\",\n\n  /**\n   * (Only for rabbitMq)\n   */\n  connectUrl: \"amqp://localhost\",\n\n  /**\n   * The target Queue that worker will consume\n   */\n  queue: \"job_example_queue\",\n  \n  /** \n    * (default: 1)\n    * Is a size of bulk messages that need be filled before worker begin to proccess messages\n    * (obs: If bulk not be filled in 10 seconds, it will be flushed too)\n  */\n  bulkSize: 10,\n\n  /**\n  * (optional)\n  * (Only for rabbitMq)\n  */ \n  publishIn: {\n    routingKey: \"jobs_key\",\n    exchange: \"test\",\n  },\n\n  /**\n   * max_try: max number of executing callback per message\n   */\n  max_try: 4,\n  \n  /** \n   * (optional) \n   * If setted the retry proccess will smooth by waiting this value in milisseconds before resend message to queue\n  */\n  retry_timeout: 1000,\n\n  /**\n   * (optional)\n   * (Only for rabbitMq)\n   * queueOptions: If is setted are useds to assert queue, create queue if it not exists\n   * or confirm these properties in target queue before start()\n  */\n  queueOptions: {\n    durable: true,\n    messageTtl: 60*1000,\n    maxLength: 50,\n    deadLetterExchange: \"job_example_deads\"\n  },\n\n  /**\n   * callback(messages):\n   * In this method the messages will be processed by your business logic\n   * and marked with some flags wich updates it internal state\n   */\n  callback(mesages) {\n    const [ min, max ] = [ 1 , 10 ]\n    const chanceOfFail = 8\n\n    for(const msg of messages) {\n      try {\n        const event = Math.random() * (max - min) + min\n\n        if(event <= chanceOfFail)\n          throw Error(\"random error\")\n\n        // get message content already parsed in object\n        const { value } = msg.getParserdContent()\n\n        // mark message as success end deliver to it a payload\n        msg.setSuccess({ newValue: event + value })\n\n      } catch(err) {\n        // mark message as failed and deliver to it a error\n        msg.setFailed(err)\n      }\n    }\n  },\n\n\n  /**\n   * failCallback(messages):\n   * (optional) \n   * If setted is called to messages that fails (markeds by msg#setFailed()) in a bulk and can not be retryed\n   */\n  failCallback(messages)  {\n    console.error(\"fail callback for\", messages)\n  }),\n\n  /**\n   * successCallback(messages):\n   * (optional) \n   * If setted is called to messages that success in a bulk (or without errors)\n   */\n  successCallback(messages) {\n    console.log(\"sucess callback for\", messages)\n  })\n})\n\n/**\n * use publishIn(if setted) or queue to send a message to your destin\n*/\npublish({ value: 1 })\npublish({ value: 3 })\npublish({ value: 4 })\npublish({ value: 5 })\n\n/**\n * start worker to consume target queue\n */\nworker.start()\n```\n\n\n## Log\n**Resilient-Consumer** is agnostic in terms of logging strategy, but it does emit trackable log events, implemented by the pattern `worker.on(eventName, callback(...params))`\n\n\n```javascript\nworker.start()\n\n/**\n * tack all \"log\" events, and works on these events\n */\nworker.on(\"log\", (workerName, ...data) => {\n  const [ level, messages, action ] = data\n\n  switch (level) {\n    case \"debug\":\n      messages.forEach(msg => {\n        logger.debug(...[ workerName, msg.messageId(), msg.tryCount(), msg.getParsedContent(), action ])\n      })\n      break\n\n    case \"error\":\n      messages.forEach(msg => {\n        logger.error(...[ workerName, msg.messageId(), msg.tryCount(), msg.getParsedContent(), action ])\n      })\n      break\n  }\n})\n```\n\n## Do Not Retry\n\nThe message payload may have errors sometimes (such as missing fields or other problems which doesn't worth a retry). For those cases you can use `msg.doNotContinueTry()` and mark the message to prevent the worker from retrying to process it.\n\n\n```javascript\ncallback(messages) {\n  for(const msg of messages) {\n    const values = msg.getParsedContent()\n      apiClient.add(values)\n                .then(res => msg.setSuccess({ msg: \"ok\" }))\n                .catch(err => {\n                  msg.setFail(err)\n                  // statusCode 4xx represents in http api a problem with client\n                  if(err.statusCode => 400 && err.statusCode > 500) {\n                    // this message not will be retryed\n                    msg.doNotContinueTry()\n                  }\n                })\n  }\n}\n```\n\n## Idempotency\nYou may need a worker with idempotent behavior for some types of messages, which means that it won't retry to process them twice. Mark those messages with `msg.setIgnore()` and they will also bypass `worker.successCallback()` and `worker.failCallback()` methods.\n\n```javascript\ncallback(messages) {\n\n  for(const msg of messages) {\n    try {\n      if(alreadyProcessed(msg.getMessageId())) {\n        // mark message to be ignored\n        msg.setIgnore()\n      } else {\n        /** works on message **/\n      }\n    }\n  }\n}\n```\n\n## SQS \n**Experimental**\n\nThe SQS worker will load your credendials from an **aws credential file** or from envvars:\n  - AWS_ACCESS_KEY_ID\n  - AWS_SECRET_ACCESS_KEY\n\n\n```javascript\n\nconst { worker, publish } = WorkerFactory.createWorker({\n\n  \n  name: \"SqsWorker\",\n\n  /**\n   * set \"sqs\" value to broker attribute\n  */\n  broker: \"sqs\",\n\n  /**\n   * set region in aws\n  */\n  aws: {\n    region: \"us-east-1\",\n  },\n  /**\n   * specify a queue name in AWS sqs\n   * (obs: today this will be a queue where a publish() will deliver message )\n  */\n  queue: \"development-worker.fifo\",\n\n  bulkSize: 10,\n  max_try: 4,\n  callback(mesages) {\n    // business logic ...\n  },\n})\n```\n\n# Roadmap\n  - Support for publishing in **AWS SNS Topic** to aws `publish()`, using the worker's `publishIn` attribute. << não entendi","readmeFilename":"README.md","gitHead":"6c6035ff2e9dc2997b647daf4000ecf75466b9b9","bugs":{"url":"https://github.com/admatic-tool/resilient-worker/issues"},"homepage":"https://github.com/admatic-tool/resilient-worker#readme","_id":"resilient-consumer@2.0.0-rc3","_shasum":"71501dad4d9c8250fee6fcc5f038a373f7373c81","_from":".","_npmVersion":"3.10.10","_nodeVersion":"6.10.1","_npmUser":{"name":"dentxinho","email":"raul_baldner_junior@hotmail.com"},"dist":{"shasum":"71501dad4d9c8250fee6fcc5f038a373f7373c81","tarball":"https://registry.npmjs.org/resilient-consumer/-/resilient-consumer-2.0.0-rc3.tgz","integrity":"sha512-I5PTUXlfqCI6sN2EjY61u+U+cDnM1ncBGzYXmpYBFI4GF6ydmBTDW9uFCNJKGC+27J01AsdiXowauVLSQY7PeA==","fileCount":21,"unpackedSize":49324,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbaePFCRA9TVsSAnZWagAAhSYP+we1xBTfwGnyo+6b1U17\n9i9i+m/PL43tWtkTfdX2IDieDw9gVEjeUJTjbBovwCJS9DNqqfZBRHDgkOKv\nZmqoefDyjNQssvmswdOzdTACUhZZU3JU+3anFLKdocb5rOlWqfVFBZqLBDaa\noJb0pcgzPc9hVaVNaHL+X/Wxiazh4sodA2cvgM1uru+RkeDbaZKQATlHGN9J\nC/B+IuwI4SdEc/muBHRY84NuUO9hPy5XoEz5Z1luB1kOw4CaNwCn4Zk72k5o\ncvQn2dBF3n878cLTu8m+/UWlFKaET5UNO0+aPlcVZHl6x+frbz5Yi0yuMf5k\ndb1BLJGGfNqICb1dcKYW1XnPmimWEwm5c8FZA6ZhakEwS2DME6QarV+/n5gG\n0G1d/67vG/4+HN4PPXYPUpKolh/HugxZqumd9IMU+n2OOCTX2YNJk+uE9G7Q\nog3QjYVuEZtl/gLCjLjvnKk1dkPRwkfRkLWN3EYoF7AKtKKXGf6puEIlccvA\nJ1MNAzrQLhE2rHX1yF4z+0ap5gd6Oz2dnpGC+lpYDPtJx1bGqrARp1RuWWUn\nrzCmVrVfBNhM8sr3mmmt8ViHXAxw0r10IW3u8EFImwbfFthcO5cfXZ1lkViy\nX06/DZG+exF4rgQmqMgftsibRUYGZlpAYl5g/1ekGDUWmRXgRaTgNSI/N1vp\nKz5V\r\n=tr1g\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIEZbdegR8QPG+DOmqJKyBUz2h9lJ/DZzbLNiBFUzTCSYAiAqfLBm2GLXjV4N8G0vyeUjwsdoWH8SzxUm1XdIcXD9hg=="}]},"maintainers":[{"email":"raul_baldner_junior@hotmail.com","name":"dentxinho"},{"email":"luizamboni2002@hotmail.com","name":"luizzamboni"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/resilient-consumer_2.0.0-rc3_1533666244954_0.5471400104597739"},"_hasShrinkwrap":false},"2.0.0":{"name":"resilient-consumer","version":"2.0.0","description":"A worker lib designed to pull-and-process messages from different queue brokers","main":"index.js","scripts":{"test":"NODE_ENV=test mocha"},"keywords":["resiliense","worker","consumer","ampq"],"repository":{"type":"git","url":"git+https://github.com/admatic-tool/resilient-worker.git"},"author":{"name":"Luiz Zamboni"},"license":"ISC","dependencies":{"amqp":"^0.2.6","amqplib":"^0.5.2","aws-sdk":"^2.254.1","co":"^4.6.0","underscore":"^1.9.1","uuid":"^3.1.0"},"devDependencies":{"chai":"^4.1.2","co-mocha":"^1.2.2","mocha":"^5.2.0","rabbit-test-helper":"^1.0.1","sinon":"^4.0.2"},"gitHead":"9e7c10e45e0f19845dfbf70983de2df4e8a5f23a","bugs":{"url":"https://github.com/admatic-tool/resilient-worker/issues"},"homepage":"https://github.com/admatic-tool/resilient-worker#readme","_id":"resilient-consumer@2.0.0","_shasum":"907bdec663f4ca393776e0ad2f29e03c95dc7774","_from":".","_npmVersion":"4.2.0","_nodeVersion":"7.10.1","_npmUser":{"name":"dentxinho","email":"raul_baldner_junior@hotmail.com"},"dist":{"shasum":"907bdec663f4ca393776e0ad2f29e03c95dc7774","tarball":"https://registry.npmjs.org/resilient-consumer/-/resilient-consumer-2.0.0.tgz","integrity":"sha512-zeYifJy2ugiLXJNzSVsmxKDXPV1PNiBW8wNzMM440+pbpQzyYAx3NiYUE0ZTG9k4RcWEFCAkYabL01icAMXOIA==","fileCount":21,"unpackedSize":49474,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbdcQpCRA9TVsSAnZWagAAmVkQAKRAJaiM8d1N44xEvb1X\nV4javjYdb6SzPzjZz+f3+3QABWnEyCQJ2caImC7Ic14Q3AiFJQ4eU8eOVeR4\nRaWA8l0UpgBeoY5hCq7UqEb8wbugdC2AL1jT8xZuA2mm33aWdlh/nynbfHdZ\nDssVzmHIa0ZWkRtsHq49Y8n46NhlmSMmWWriNZnw2rrTTT3BYnIH4D3v+COv\nDvAwREZxfwXaCg2TnLAgMrMMM1AAO9ZFRrpzuIZnAMl7j6jkW/EILM7AuUFh\nzSUerimz8WQqReC3dDMwaZlitgBxAPatDwdJJJgta1CYMe6goHwq+6kjzs2/\nrkDnJH7N07SrvaTUP3IcBrfcmNg4U/5RGp/Vlishag2WiDYgXBiOt5qPns+A\nVZkULbFP0O2qn/rIY196oBeNLKbcIQAeVYSzoKEaq5CJ6/8fYChSAaYrSqJg\nsaQx1k0UrkCGSkexO3zCSqseLP/B+n9uHNqDUXRCJkC+G8S2fZle7A7ESW15\nTIff7MX64k0KY1ifhzVcCPD8EmPgCclhFqjdRcKnvqHYm0J/SQcEMZuFeyqJ\n4JQvG+YnWhd3byiIlEksEmjDQdbRFiVhgCuKJsXiGFGIprrodTQq8Bmg6+rr\nXclZ0+gWWcXDy7SYTU+n7JwnxFkzOq3UGTsitaG95Sha6WUJIA11JYda/v1L\niXWC\r\n=nmwZ\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDvW5xhPXw//GR6ChbddsQ3nli705s0WU5pBAeWqiuQaAIgJVzqhXONtUL9jtdUpHBSw8TgpJxLgpMlREvGRXXXJoc="}]},"maintainers":[{"email":"raul_baldner_junior@hotmail.com","name":"dentxinho"},{"email":"george.veras.valentim@gmail.com","name":"george-veras"},{"email":"luizamboni2002@hotmail.com","name":"luizzamboni"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/resilient-consumer_2.0.0_1534444584574_0.35264261271491737"},"_hasShrinkwrap":false},"2.0.1":{"name":"resilient-consumer","version":"2.0.1","description":"A worker lib designed to pull-and-process messages from different queue brokers","main":"index.js","scripts":{"test":"NODE_ENV=test mocha"},"keywords":["resiliense","worker","consumer","ampq"],"repository":{"type":"git","url":"git+https://github.com/admatic-tool/resilient-worker.git"},"author":{"name":"Luiz Zamboni"},"license":"ISC","dependencies":{"amqp":"^0.2.6","amqplib":"^0.5.2","aws-sdk":"^2.254.1","co":"^4.6.0","underscore":"^1.9.1","uuid":"^3.1.0"},"devDependencies":{"chai":"^4.1.2","co-mocha":"^1.2.2","mocha":"^5.2.0","rabbit-test-helper":"^1.0.1","sinon":"^4.0.2"},"gitHead":"1062bad0d6bc0566d2a6477e3d81936fd12cd2ab","bugs":{"url":"https://github.com/admatic-tool/resilient-worker/issues"},"homepage":"https://github.com/admatic-tool/resilient-worker#readme","_id":"resilient-consumer@2.0.1","_shasum":"f8be05e5625516ef51d0fa1659b4dfd887e041e9","_from":".","_npmVersion":"4.2.0","_nodeVersion":"7.10.1","_npmUser":{"name":"dentxinho","email":"raul_baldner_junior@hotmail.com"},"dist":{"shasum":"f8be05e5625516ef51d0fa1659b4dfd887e041e9","tarball":"https://registry.npmjs.org/resilient-consumer/-/resilient-consumer-2.0.1.tgz","integrity":"sha512-ljPd5Hj95y5lwbppX8ItorvwEyhBLk/QTtro7XSRwNNs0fhQgnv+mpnsniCAFHwvOQlfW26PliAyaMdLfnAapw==","fileCount":21,"unpackedSize":49591,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbhYOyCRA9TVsSAnZWagAAfwoP/A1zK7+a/uM5CCLgUolm\nFXaufWtiUqx/GdiF8zHjmia1vDfBMPhzhSRTB77N0nj6H+2j+3b0QJ8YL1rg\n3+w7XRdHdCnyxMe0bBFdb+jbCDJYTLj2orvUtpD60wfuiOtLfOhmVJQHADFS\nMXl6LTTpodmEgToje88/8KGkJBsqB8fk1EJ6EvJe24UFE7gW9ZttPmpJSvnT\nrYL8z37EkjbUnVihRGz2zyFzMpDpk2Tj/4ON8zyoanyFKY77fvkmtR6+90b6\nbH8ByigH2Gti0w0MvRiHCaLqaQq18+tnwEWEERTN4/3j5I0dY9+AAa+H0YSh\n1aAzWqaKro3o5rQ2R3uYENUlh4Hjurqn4WvL8JxV1gVK1/u5Jr+0ZmvTQ2/v\ncXhhnL6gF5uSbbhG5hNEtdV4UTxp/ft01x9bAvL/NRBLAY2qV98vwhDqYipi\nIFyzHJBWw/f41vOMuk7m+E/qm6DP0A3UxN9E5gbbhQPjhDp1NOAx5oZ7lpY5\ndnoxaAUu4tpAMXue3pvUcB+eNvt50RDU0JuOVnyW/d4PYR7Mm5RsM7c0tZ8i\nzPeGFgarg0TTIgQYOXchIGBPBy437liuUSkRVw4kh1PptCStydnzC3vJG/d9\nFyotKM/ePL1mevkmvvAfytaCP3v8jc/Xt3eZqIOZkiMTTSmid1wuMvEiNGOy\n92Zr\r\n=AsKu\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIGSU8+oTnw378LfMGLE9D6+txFgzmb4uXaCZN9C2CxePAiEAu9jyYJXM6aeej3Wc8h3Gc3hvfULuGcxmW1cBz6fulIc="}]},"maintainers":[{"email":"raul_baldner_junior@hotmail.com","name":"dentxinho"},{"email":"george.veras.valentim@gmail.com","name":"george-veras"},{"email":"luizamboni2002@hotmail.com","name":"luizzamboni"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/resilient-consumer_2.0.1_1535476657273_0.8181273505615632"},"_hasShrinkwrap":false},"2.0.2":{"name":"resilient-consumer","version":"2.0.2","description":"A worker lib designed to pull-and-process messages from different queue brokers","main":"index.js","scripts":{"test":"NODE_ENV=test mocha"},"keywords":["resiliense","worker","consumer","ampq"],"repository":{"type":"git","url":"git+https://github.com/admatic-tool/resilient-worker.git"},"author":{"name":"Luiz Zamboni"},"license":"ISC","dependencies":{"amqp":"^0.2.6","amqplib":"^0.5.2","aws-sdk":"^2.254.1","co":"^4.6.0","underscore":"^1.9.1","uuid":"^3.1.0"},"devDependencies":{"chai":"^4.1.2","co-mocha":"^1.2.2","mocha":"^5.2.0","rabbit-test-helper":"^1.0.1","sinon":"^4.0.2"},"gitHead":"ee92707086470ae24c0503c4a1dff41ea1afae02","bugs":{"url":"https://github.com/admatic-tool/resilient-worker/issues"},"homepage":"https://github.com/admatic-tool/resilient-worker#readme","_id":"resilient-consumer@2.0.2","_nodeVersion":"10.16.3","_npmVersion":"6.12.0","dist":{"integrity":"sha512-fK3tT3RG21xi1eoDs21jAIUU2UVEEtJa4udQensf7Ai6TQ6p0qLszvVHml1Nxy9Y5IxmrbU2jBkLFzCe309GvA==","shasum":"bbf826dc5fac00901f3c7bad51caa8cf3e99747a","tarball":"https://registry.npmjs.org/resilient-consumer/-/resilient-consumer-2.0.2.tgz","fileCount":22,"unpackedSize":51717,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJd292WCRA9TVsSAnZWagAA86YQAJHxPqjzAT4227Vhm90a\npSEaYOPX9vaHKekjMijVqCubQiwaO7gJe7d0/LPg3VnJYr/Dksp7HksybN5W\nT0JSH1kPlcldfCKlWItXETQUtalHlWRs/UbvDhPKba4Ye5okiNNiVNq13PiV\nIhleYMp3sh/kXeH80NfpbJCwCAOFg+tqGmHJaCwmRP47I3k/y9eSh3tx08Li\n9iCpyYAyCnKxe6QvhAwRrfO9lR1nfTEY5HrYsE0B2knbw/PSQ0+PhwFnoTWL\nUPtGsOb2/ggOqLRAafzQblWeM2GK70ZealczGjs1nHi/1jzck9OhJHcfYtUL\nzq4dT1nrMQ7F5a2psn0pgr7YR7THa9p4X5vicnEzXY0E8aRc7k6s1V/Fsrra\nmpDA6IailwUIpueneOqTr3UqoUZz2QnGvJfDu1ucC5OgpWlQG1fAaWAdTvPQ\neiDzn9tMTWz7OEwG5fiI/o88jLtqaSMhq9eHeETtjDSxgqf3T3c7j4AVbWQg\nCHejhToUxv0ovAYV4GS07fudr05y2kKQm9tGGwkJzcC/weKYiH1Qks4opB22\nApwSTUOLbcXXi8RkCV8+UkW8Pvv3Y9yU07TW3VcjQxqIDpac4uKdvYKpADxQ\nEJjc2ZdPi8/ZSx0xPU4QE6aOFVgXD1MP+KBrhKMFLFN53ZLNFMAPY0vh7n2M\np1Ad\r\n=gsB/\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIGdMOt7rj640/ESLwo1kBrpOHt6lqln9ZkPLspUHJilpAiEA0uH/8JKrH0OTATl8vFuni4YeyT6CPXgAdx9LfVaRBL0="}]},"maintainers":[{"email":"apfzvd@gmail.com","name":"apfzvd"},{"email":"raul_baldner_junior@hotmail.com","name":"dentxinho"},{"email":"george.veras.valentim@gmail.com","name":"george-veras"},{"email":"igorgabriel@outlook.com","name":"igorgcosta"},{"email":"luizamboni2002@hotmail.com","name":"luizzamboni"},{"email":"paulo.alfredo.barros@gmail.com","name":"pabarros"}],"_npmUser":{"name":"dentxinho","email":"raul_baldner_junior@hotmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/resilient-consumer_2.0.2_1574690198041_0.30871660739225804"},"_hasShrinkwrap":false},"2.1.0-rc.1":{"name":"resilient-consumer","version":"2.1.0-rc.1","description":"A worker lib designed to pull-and-process messages from different queue brokers","main":"index.js","scripts":{"eslint":"eslint --fix .","eslint:check":"eslint .","fmt":"npm run prettier && npm run eslint","fmt:check":"npm run prettier:check && npm run eslint:check","prettier":"prettier --write \"**/{*.js,*.json,bin/**}\"","prettier:check":"prettier --check \"**/{*.js,*.json,bin/**}\"","test":"nyc mocha --reporter spec","test:coverage-report":"nyc report --reporter=text-lcov > coverage.lcov","test:acceptance":"npm t test/acceptance/*","test:integration":"npm t test/integration/*","test:unit":"npm t test/unit/*"},"keywords":["resiliense","worker","consumer","ampq"],"repository":{"type":"git","url":"git+https://github.com/b2wads/resilient-worker.git"},"author":{"name":"Luiz Zamboni"},"license":"ISC","dependencies":{"amqplib":"0.5.5","aws-sdk":"^2.254.1","co":"^4.6.0","underscore":"^1.9.1","uuid":"^3.1.0"},"devDependencies":{"chai":"^4.2.0","co-mocha":"^1.2.2","eslint":"5.16.0","eslint-config-airbnb":"18.0.1","eslint-config-prettier":"6.1.0","eslint-plugin-chai-friendly":"^0.4.1","eslint-plugin-import":"2.18.2","eslint-plugin-jsx-a11y":"6.2.3","eslint-plugin-no-unsafe-regex":"1.0.0","eslint-plugin-prettier":"3.1.0","eslint-plugin-react":"7.14.3","eslint-plugin-security":"1.4.0","eslint-plugin-you-dont-need-lodash-underscore":"6.6.0","mocha":"^6.2.1","nyc":"14.1.1","prettier":"1.17.1","rabbit-test-helper":"^1.0.1","sinon":"8.0.4"},"readme":"Resilient Worker\n===\n[![CircleCI](https://circleci.com/gh/b2wads/resilient-worker/tree/master.svg?style=svg)](https://circleci.com/gh/admatic-tool/resilient-worker/tree/master)\n\nA worker lib designed to pull-and-process messages from different queue brokers (actually supporting **RabbitMQ** and  **AWS SQS**), which offers a common interface to **retry policy**, **successCallbacks**, **failCallbacks** , **ignore messages** and **bulk processing**.\n\n\n# Table of Contents\n - [Install](#install)\n - [Usage](#usage)\n   * [Example](#example)\n   * [Log](#log)\n   * [Do not Retry](#do-not-retry)\n   * [Idempotency](#idempotency)\n   * [SQL](#sqs)\n - [Roadmap](#roadmap)\n\n\n# Install\n```bash\n$ npm install resilient-consumer --save\n```\n\n# Usage\n\n## Example\n```javascript\nconst WorkerFactory = require(\"resilient-consumer\")\n\n\n/**\n * gen worker/publish pair\n*/ \n\nconst { worker, publish } = WorkerFactory.createWorker({\n\n  /**\n   * identity of worker\n  */\n  name: \"RandomWorker\",\n\n  /**\n   * (default: rabbit)\n  */\n  broker: \"rabbit\",\n\n  /**\n   * (Only for rabbitMq)\n   */\n  connectUrl: \"amqp://localhost\",\n\n  /**\n   * The target Queue that worker will consume\n   */\n  queue: \"job_example_queue\",\n\n  /**\n   * (default: bulkSize)\n   * How many messages will be received at once from the broker\n   */\n  prefetch: 10,\n  \n  /** \n    * (default: 1)\n    * Is a size of bulk messages that need be filled before worker begin to proccess messages\n    * (obs: If bulk not be filled in 10 seconds, it will be flushed too)\n  */\n  bulkSize: 10,\n\n  /**\n  * (optional)\n  * (Only for rabbitMq)\n  */ \n  publishIn: {\n    routingKey: \"jobs_key\",\n    exchange: \"test\",\n  },\n\n  /**\n   * max_try: max number of executing callback per message\n   */\n  max_try: 4,\n  \n  /** \n   * (optional) \n   * If setted the retry proccess will smooth by waiting this value in milisseconds before resend message to queue\n  */\n  retry_timeout: 1000,\n\n  /**\n   * (optional)\n   * (Only for rabbitMq)\n   * queueOptions: Used to assert queue, create queue if it doesn't exist\n   * or confirm these properties in target queue before start()\n  */\n  queueOptions: {\n    durable: true,\n    messageTtl: 60*1000,\n    maxLength: 50,\n    deadLetterExchange: \"job_example_deads\"\n  },\n\n  /**\n   * callback(messages):\n   * In this method the messages will be processed by your business logic\n   * and marked with some flags wich updates it internal state\n   */\n  callback(mesages) {\n    const [ min, max ] = [ 1 , 10 ]\n    const chanceOfFail = 8\n\n    for(const msg of messages) {\n      try {\n        const event = Math.random() * (max - min) + min\n\n        if(event <= chanceOfFail)\n          throw Error(\"random error\")\n\n        // get message content already parsed in object\n        const { value } = msg.getParserdContent()\n\n        // mark message as success end deliver to it a payload\n        msg.setSuccess({ newValue: event + value })\n\n      } catch(err) {\n        // mark message as failed and deliver to it a error\n        msg.setFailed(err)\n      }\n    }\n  },\n\n\n  /**\n   * failCallback(messages):\n   * (optional) \n   * If setted is called to messages that fails (markeds by msg#setFailed()) in a bulk and can not be retryed\n   */\n  failCallback(messages)  {\n    console.error(\"fail callback for\", messages)\n  }),\n\n  /**\n   * successCallback(messages):\n   * (optional) \n   * If setted is called to messages that success in a bulk (or without errors)\n   */\n  successCallback(messages) {\n    console.log(\"sucess callback for\", messages)\n  })\n})\n\n/**\n * use publishIn(if setted) or queue to send a message to your destin\n*/\npublish({ value: 1 })\npublish({ value: 3 })\npublish({ value: 4 })\npublish({ value: 5 })\n\n/**\n * start worker to consume target queue\n */\nworker.start()\n```\n\n\n## Log\n**Resilient-Consumer** is agnostic in terms of logging strategy, but it does emit trackable log events, implemented by the pattern `worker.on(eventName, callback(...params))`\n\n\n```javascript\nworker.start()\n\n/**\n * tack all \"log\" events, and works on these events\n */\nworker.on(\"log\", (workerName, ...data) => {\n  const [ level, messages, action ] = data\n\n  switch (level) {\n    case \"debug\":\n      messages.forEach(msg => {\n        logger.debug(...[ workerName, msg.messageId(), msg.tryCount(), msg.getParsedContent(), action ])\n      })\n      break\n\n    case \"error\":\n      messages.forEach(msg => {\n        logger.error(...[ workerName, msg.messageId(), msg.tryCount(), msg.getParsedContent(), action ])\n      })\n      break\n  }\n})\n```\n\n## Do Not Retry\n\nThe message payload may have errors sometimes (such as missing fields or other problems which doesn't worth a retry). For those cases you can use `msg.doNotContinueTry()` and mark the message to prevent the worker from retrying to process it.\n\n\n```javascript\ncallback(messages) {\n  for(const msg of messages) {\n    const values = msg.getParsedContent()\n      apiClient.add(values)\n                .then(res => msg.setSuccess({ msg: \"ok\" }))\n                .catch(err => {\n                  msg.setFail(err)\n                  // statusCode 4xx represents in http api a problem with client\n                  if(err.statusCode => 400 && err.statusCode > 500) {\n                    // this message not will be retryed\n                    msg.doNotContinueTry()\n                  }\n                })\n  }\n}\n```\n\n## Idempotency\nYou may need a worker with idempotent behavior for some types of messages, which means that it won't retry to process them twice. Mark those messages with `msg.setIgnore()` and they will also bypass `worker.successCallback()` and `worker.failCallback()` methods.\n\n```javascript\ncallback(messages) {\n\n  for(const msg of messages) {\n    try {\n      if(alreadyProcessed(msg.getMessageId())) {\n        // mark message to be ignored\n        msg.setIgnore()\n      } else {\n        /** works on message **/\n      }\n    }\n  }\n}\n```\n\n## SQS \n**Experimental**\n\nThe SQS worker will load your credendials from an **aws credential file** or from envvars:\n  - AWS_ACCESS_KEY_ID\n  - AWS_SECRET_ACCESS_KEY\n\n\n```javascript\n\nconst { worker, publish } = WorkerFactory.createWorker({\n\n  \n  name: \"SqsWorker\",\n\n  /**\n   * set \"sqs\" value to broker attribute\n  */\n  broker: \"sqs\",\n\n  /**\n   * set region in aws\n  */\n  aws: {\n    region: \"us-east-1\",\n  },\n  /**\n   * specify a queue name in AWS sqs\n   * (obs: today this will be a queue where a publish() will deliver message )\n  */\n  queue: \"development-worker.fifo\",\n\n  bulkSize: 10,\n  max_try: 4,\n  callback(mesages) {\n    // business logic ...\n  },\n})\n```\n\n# Roadmap\n  - [sqs broker] Support for publishing in a **AWS SNS Topic**, using the worker's `publishIn` attribute.\n  - [logging] Add own logger\n  - [brokers] Add publisher retries\n  - [brokers] Use backoff factor for retries\n  - [**Breaking Change**] [lib] Drop ES5 support\n  - [**Breaking Change**] [rabbit broker] Throw errors on `stop()`","readmeFilename":"README.md","gitHead":"156f39f003fccfa8765922ce6f046b0316f50a43","bugs":{"url":"https://github.com/b2wads/resilient-worker/issues"},"homepage":"https://github.com/b2wads/resilient-worker#readme","_id":"resilient-consumer@2.1.0-rc.1","_nodeVersion":"12.14.1","_npmVersion":"6.13.4","dist":{"integrity":"sha512-MgEv+9SgLBe6PcjQuX9EQvWVjg3VFE5tVVeBSD20DfltqrSnwHGKP6XqsC7JwNKEvHiO2Oj+Ry5gPlDMTGfM4w==","shasum":"c1c9ce56be48920621356e7025a8c0e4fe9c35ac","tarball":"https://registry.npmjs.org/resilient-consumer/-/resilient-consumer-2.1.0-rc.1.tgz","fileCount":29,"unpackedSize":90744,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJeHfv5CRA9TVsSAnZWagAAv/YP/i4f/YSYNkuiD2GpyipS\nwXzmS8cyABseRaV9M2bL9vKz80M+4E7cb68Y0zhchB9GS7ecogR7j6puuHq+\nc9WYuiZgPbhx8ocrzimMrSO5zQEwKKnO+VNwtLN3kSSSuxbsXTiphqLRBn9J\nH+oymMlcCUjqUjN8XuSf8bYWGUEId5UJqMH6doB/rfkXDficjBwRn5chyXBQ\n5b7/LNe/i3hv8kgCv0jVgG3K6w64loFn+STehKK/nP57zlOeradzsfhJuEWR\npXwmVi1gkyrcqJEUduUdDz8OdXWUa7EVycde+tunwy8pH3wAYDLtobkv1nal\nhzlAM3qS/bIR2tK9OvcRH375b5WScYVu3+hbqnLaiVYjt2PgsZfLPGDyMDEN\nUPPb0w470qn8VzgjdGRoHA88DVYywly19jj3r+NJcsygzOrBwy6zSa4K5f7X\nylE6Bkwswcv2BXScwZvQ9Ge+4i9wPKEnAGq1/pRQ+BwipAgtt3qA6j76FoUC\nPigsfhtJ0Zynfe9cYIFQEmVE29sTZQtocihbPp1Ja7r9qFwllpFZbxoK0zDg\nZ5hqsHElRe+tpt8hX+G+UF5Bilk3ANUWN7A+u631nr3ovT0XbeNNTwVtP36d\nL1fRf4z8/1mpE8pP0NP2MNcjX1+9coP0+UJ3eSof542WDm0UmA+sqHLwww/E\nIIjR\r\n=BQS/\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIB5eCF+n1TB7K07TGHQ5MrignqlETYyj6mDYUyhU4tRDAiBkltuOIygBHXk/hcctwKQ5wHL6VyLzzK4KhmmPFupQRA=="}]},"maintainers":[{"email":"apfzvd@gmail.com","name":"apfzvd"},{"email":"dehmirandac2@gmail.com","name":"dehmirandac2"},{"email":"raul_baldner_junior@hotmail.com","name":"dentxinho"},{"email":"george.veras.valentim@gmail.com","name":"george-veras"},{"email":"igorgabriel@outlook.com","name":"igorgcosta"},{"email":"lucasdomi@gmail.com","name":"lucasdomi"},{"email":"luizamboni2002@hotmail.com","name":"luizzamboni"},{"email":"paulo.alfredo.barros@gmail.com","name":"pabarros"}],"_npmUser":{"name":"dentxinho","email":"raul_baldner_junior@hotmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/resilient-consumer_2.1.0-rc.1_1579023352815_0.469773604490374"},"_hasShrinkwrap":false},"2.1.0":{"name":"resilient-consumer","version":"2.1.0","description":"A worker lib designed to pull-and-process messages from different queue brokers","main":"index.js","scripts":{"eslint":"eslint --fix .","eslint:check":"eslint .","fmt":"npm run prettier && npm run eslint","fmt:check":"npm run prettier:check && npm run eslint:check","prettier":"prettier --write \"**/{*.js,*.json,bin/**}\"","prettier:check":"prettier --check \"**/{*.js,*.json,bin/**}\"","test":"nyc mocha --reporter spec","test:coverage-report":"nyc report --reporter=text-lcov > coverage.lcov","test:acceptance":"npm t test/acceptance/*","test:integration":"npm t test/integration/*","test:unit":"npm t test/unit/*"},"keywords":["resiliense","worker","consumer","ampq"],"repository":{"type":"git","url":"git+https://github.com/b2wads/resilient-worker.git"},"author":{"name":"Luiz Zamboni"},"license":"ISC","dependencies":{"amqplib":"0.5.5","aws-sdk":"^2.254.1","co":"^4.6.0","underscore":"^1.9.1","uuid":"^3.1.0"},"devDependencies":{"chai":"^4.2.0","co-mocha":"^1.2.2","eslint":"5.16.0","eslint-config-airbnb":"18.0.1","eslint-config-prettier":"6.1.0","eslint-plugin-chai-friendly":"^0.4.1","eslint-plugin-import":"2.18.2","eslint-plugin-jsx-a11y":"6.2.3","eslint-plugin-no-unsafe-regex":"1.0.0","eslint-plugin-prettier":"3.1.0","eslint-plugin-react":"7.14.3","eslint-plugin-security":"1.4.0","eslint-plugin-you-dont-need-lodash-underscore":"6.6.0","mocha":"^6.2.1","nyc":"14.1.1","prettier":"1.17.1","rabbit-test-helper":"^1.0.1","sinon":"8.0.4"},"gitHead":"422cc92c54ed53c93b1929b17900bdeded1a6a92","bugs":{"url":"https://github.com/b2wads/resilient-worker/issues"},"homepage":"https://github.com/b2wads/resilient-worker#readme","_id":"resilient-consumer@2.1.0","_nodeVersion":"12.14.1","_npmVersion":"6.13.4","dist":{"integrity":"sha512-IVH/62d83C9hoSgHWS9FbG+6/pBzHNPJFm4NfPf9zWthnaABK1sozxKgsKK3LRZI8ooxjJKNQs5oGDiFEYl3Aw==","shasum":"842151a0c840295634293ce528dacf5933d8755a","tarball":"https://registry.npmjs.org/resilient-consumer/-/resilient-consumer-2.1.0.tgz","fileCount":30,"unpackedSize":90756,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJeH2ftCRA9TVsSAnZWagAAmvAP/0++7LtTtjhwcetRN8dn\n92Q+kI8HTVsAbhHHUAq8NiJtc6KIHv/k6+MlJEbRHSUycWsvAJ7H3XpJInBe\nnih1rvranJH0Ad53ewZgHURK08dJpiyNwbQBN2+eEpYCYwPs0N8rzBWDYMfC\nY3mYH4brfvYR31TYrszTT6J3gx9dBCrU1G5RvaWRekhYUEykV9Sk1voIAvUr\n+Gdx1XvjbA/9EHcBaSoMKbsaFasgBVjedvzxI9BOrXDdzyPiMikGZqslL5Tg\n5QVIfeT4QSgNmQQaJ3COV2aYcso5MsBn3aZKrxP84ZSQonXouKVF4SoQpkCL\nooh7qX7CubGHyHi4ejS++fzFuAf1cAHZkSPo1jNGf3xPGoTgkAK/tKdGNjU6\n0s/eqBqTE2E27tLdEZAa8adjyZaqdrPRPfxE/Iz18n3SM6fzbyHGtslg+hDJ\nRbAqToIur6FJzul7AiIVPw9SoDDukFoSFBjpH97MSsiJxWZiNY6PvpLwsTdK\nOQuXbx4gYqMMUCq/pcjQOUQdsS/o5fszZf9b+RFLL3VhdtBcWZTxl08vqC8J\nZRMDDWYFcus7T36qXQfB3wYekITMzA3ViNxeB+9xugIht2ftEFNPi7TQU6y5\npokMcWSW6RRWkAVqTKpBdKu20/PRQFy12k8XpoYdxVZBogcCQtUk9QqXYu8z\nYws4\r\n=8PJb\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEMCH0v681tmnPmQN7sTj5f+atlZTucH0oYVkDSXnGSYjn0CIA3kecFCTSNUt7gf9xKky0f1+5iQh7Awkv5A5LpcXX8n"}]},"maintainers":[{"email":"apfzvd@gmail.com","name":"apfzvd"},{"email":"dehmirandac2@gmail.com","name":"dehmirandac2"},{"email":"raul_baldner_junior@hotmail.com","name":"dentxinho"},{"email":"george.veras.valentim@gmail.com","name":"george-veras"},{"email":"igorgabriel@outlook.com","name":"igorgcosta"},{"email":"lucasdomi@gmail.com","name":"lucasdomi"},{"email":"luizamboni2002@hotmail.com","name":"luizzamboni"},{"email":"paulo.alfredo.barros@gmail.com","name":"pabarros"}],"_npmUser":{"name":"dentxinho","email":"raul_baldner_junior@hotmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/resilient-consumer_2.1.0_1579116525350_0.21612143775921644"},"_hasShrinkwrap":false},"1.2.4":{"name":"resilient-consumer","version":"1.2.4","description":"resilient consumer prof","main":"index.js","scripts":{"test":"NODE_ENV=test mocha"},"keywords":["resiliense","consumer","ampq"],"repository":{"type":"git","url":"git+https://github.com/admatic-tool/resilient-worker.git"},"author":{"name":"Luiz Zamboni"},"license":"ISC","dependencies":{"amqp":"^0.2.6","amqplib":"^0.5.1","co":"^4.6.0","uuid":"^3.1.0"},"devDependencies":{"chai":"^4.1.2","mocha-co":"^1.17.2","rabbit-test-helper":"^1.0.1","sinon":"^4.0.2"},"readme":"Resilient Worker\n===\n\nproof of concept to a resilient worker using ampq client\n\n# features\n - use a rabbitmq to control the flux\n - return `worker` and an `publish` hedged in a same queue\n - control retries\n - callback on fail\n - callback on success\n - timeout a executin when fail to smoth retries\n\n# install\n```shell\n$ npm install resilient-consumer --save\n```\n\n# Usage\n```javascript\nconst co = require(\"co\")\nconst WorkerFactory = require(\"resilient-consumer\")\n\n// factory\nconst chanceOfFail = 8\n\n// connect factory to amqp server\nconst workerFactory = WorkerFactory('amqp://localhost')\n\n// gen worker \nconst { worker, publish } = workerFactory.createWorker({\n  \n  // control queue\n  queue: \"job_example_queue\",\n  \n  // max number of executing callback per message \n  max_try: 4,\n  \n  // smoth process of retry\n  retry_timeout: 1000,\n\n  // callback need return a promise\n  callback: co.wrap(function*(doc) {\n    const [ min, max ] = [ 1 , 10 ]\n    const event = Math.random() * (max - min) + min\n    console.log(event)\n    if(event <= chanceOfFail)\n      throw Error(\"random error\")\n  }),\n\n  // need return a Promise\n  // doc is a body message\n  failCallback: co.wrap(function*(doc) {\n    console.error(\"fail callback for\", doc)\n  }),\n\n  // need return a Promise\n  // doc is a body message\n  successCallback: co.wrap(function*(doc) {\n    console.error(\"sucess callback for\", doc)\n  })\n})\n\n\nco(function*() {\n  publish({ a: 1 })\n  publish({ a: 3 })\n  publish({ a: 4 })\n  publish({ a: 5 })\n  \n\n  worker.start()\n})\n```\n\n# Helpers\n### executeNext(arguments, middlewareActions, stepN = 1)\n```javascript\n// supose that we have a chain of actions to be performed, like a middleware\nconst middlewareActions = [\n  { \n    order: 1, \n    call: name => Promise.resolve([ name, \"hello\" ]) \n  },\n  { \n    order: 2, \n    call: ([ name, message ]) =>\n      Promise.resolve([ name, message ].join(\", \")) \n  },\n]\n\nexecuteNext(\"luiz\", middlewareActions ).then(res =>\n  console.log(res)\n)\n// \"luiz, hello\"\n```\nbut if this fail\n```javascript\n// supose that we have a chain of actions to be performed, like a middleware\nconst middlewareActions = [\n  { \n    order: 1, \n    call: names => Promise.resolve([ names, \"hello\" ]) \n  },\n  { \n    order: 2, \n    call: ([ names, message ]) =>\n      Promise.resolve([ names.join(), message ].join(\", \")) \n  },\n]\n\n// the argument is a string, wich no have .join() method\nexecuteNext(\"luiz\", middlewareActions ).then(res =>\n  console.log(res)\n).catch(err => {\n  /* error has a aditional metadata,about a \n    - step that error occurs\n    - the arguments that step worker\n\n    with this, it can be restarted\n  */\n  console.error(err.step, err.arguments)\n  const [ name, message ] = err.arguments\n  executeNext([[name], message], middlewareActions, err.step).then(res => {\n    console.log(res)\n   // \"luiz, hello\"\n  })\n})\n```\n\n# TODO\n - ampq configs (prefetch, ...)\n - options, assertion of queue","readmeFilename":"README.md","gitHead":"f42e2f3b75b8fa1351701203945424fc1ee40d99","bugs":{"url":"https://github.com/admatic-tool/resilient-worker/issues"},"homepage":"https://github.com/admatic-tool/resilient-worker#readme","_id":"resilient-consumer@1.2.4","_nodeVersion":"6.17.1","_npmVersion":"6.13.4","dist":{"integrity":"sha512-2GkDVEaJdKUEkDUZbrHF3UswU1mFu1xG88LvCzO98vB4NposNRJnlS8JBNHVM0kEV5ud+HIDcKc+n5wngcGXrw==","shasum":"e15c5a6e059bcd6acdeaa7644fcdfcfbe4baf68f","tarball":"https://registry.npmjs.org/resilient-consumer/-/resilient-consumer-1.2.4.tgz","fileCount":15,"unpackedSize":21189,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJeZqWECRA9TVsSAnZWagAAjmoP/0SuQJGfCHGvxoWJc0vU\n2Y6VeHXYert/ECe8WUOKJJK/QEU3RmK34QY1Q7gJKFRFX2xswzIey1RGrwEF\nFqiNaxwKJa0IfIuEWAVCZ+WiryZhzCkumvjpDH3CyrrgEpCIY16Ussog3n17\nL9D5Y3EyB8jDDWsA5X8m+KCsWffWHZzgXKEPp2nYj6Tm2Nf9BnhnlKViFviE\nPmK1PHPjCOrGruL9P2Q4G+r2HgwpSKE0/Sr7azxdN3FB7msVRBpthA60bAph\npRf5opQDlR2fSD7Y4bvpy2sJSk6saEGrPdgyiVfXLQl9aqg9Tg0ddNaVQ9JV\nL7JNMC8LEo4/7WO3hqceBwcIWk3T68MTT1hDIiW8la0oH3i3+CVbQYG01vjU\nFYPf8hKQzUf1AX7afWYezaoBK/TM/ApE99xjB23HwpxqSWyCL/x6SafwmtWp\neBkqoohsaZPRKLN+zxOTTSXFN4IsMTCFvsbXtosD4lcnnkjNUw3KeykZawfD\nYHpYI+krNPb4bAqobC6sPLorg9b9sMvelOyQEjVVFMbt1oQUsX1YXQFlASIj\nH4XyHxm5bMFYSswNQjYKUYioBiVS4ujM6rgQ8vHGWLgz3+lR8ReNpKJo5tT4\nRKa7JJoYZLwvjJojQOrp+SFwtgv0wKnVF2B7lk/rpyp/w1QlmTK9wfYTG4++\nmbgo\r\n=YVU+\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIF6sN2nK4De6KhSNqDAmXhwMhS6EiEaNuv8L2FKbRZ4HAiEA3CPBsJQWTUmiLmKx0R1Cgii5NLVev+050NZ+uodKWZU="}]},"maintainers":[{"email":"apfzvd@gmail.com","name":"apfzvd"},{"email":"dehmirandac2@gmail.com","name":"dehmirandac2"},{"email":"raul_baldner_junior@hotmail.com","name":"dentxinho"},{"email":"george.veras.valentim@gmail.com","name":"george-veras"},{"email":"igorgabriel@outlook.com","name":"igorgcosta"},{"email":"lucasdomi@gmail.com","name":"lucasdomi"},{"email":"luizamboni2002@hotmail.com","name":"luizzamboni"},{"email":"paulo.alfredo.barros@gmail.com","name":"pabarros"}],"_npmUser":{"name":"dentxinho","email":"raul_baldner_junior@hotmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/resilient-consumer_1.2.4_1583785347628_0.2739505139374905"},"_hasShrinkwrap":false},"2.1.1":{"name":"resilient-consumer","version":"2.1.1","description":"A worker lib designed to pull-and-process messages from different queue brokers","main":"index.js","scripts":{"eslint":"eslint --fix .","eslint:check":"eslint .","fmt":"npm run prettier && npm run eslint","fmt:check":"npm run prettier:check && npm run eslint:check","prettier":"prettier --write \"**/{*.js,*.json,bin/**}\"","prettier:check":"prettier --check \"**/{*.js,*.json,bin/**}\"","test":"nyc mocha --reporter spec","test:coverage-report":"nyc report --reporter=text-lcov > coverage.lcov","test:acceptance":"npm t test/acceptance/*","test:integration":"npm t test/integration/*","test:unit":"npm t test/unit/*"},"keywords":["resiliense","worker","consumer","ampq"],"repository":{"type":"git","url":"git+https://github.com/b2wads/resilient-worker.git"},"author":{"name":"Luiz Zamboni"},"license":"ISC","dependencies":{"amqplib":"^0.7.1","aws-sdk":"^2.254.1","co":"^4.6.0","underscore":"^1.9.1","uuid":"^3.1.0"},"devDependencies":{"chai":"^4.2.0","co-mocha":"^1.2.2","eslint":"5.16.0","eslint-config-airbnb":"18.0.1","eslint-config-prettier":"6.1.0","eslint-plugin-chai-friendly":"^0.4.1","eslint-plugin-import":"2.18.2","eslint-plugin-jsx-a11y":"6.2.3","eslint-plugin-no-unsafe-regex":"1.0.0","eslint-plugin-prettier":"3.1.0","eslint-plugin-react":"7.14.3","eslint-plugin-security":"1.4.0","eslint-plugin-you-dont-need-lodash-underscore":"6.6.0","mocha":"^6.2.1","nyc":"14.1.1","prettier":"1.17.1","rabbit-test-helper":"^1.0.1","sinon":"8.0.4"},"gitHead":"f7eb38769dfeb0e3f2296af4c5720dd14056ec97","bugs":{"url":"https://github.com/b2wads/resilient-worker/issues"},"homepage":"https://github.com/b2wads/resilient-worker#readme","_id":"resilient-consumer@2.1.1","_nodeVersion":"12.22.12","_npmVersion":"8.19.3","dist":{"integrity":"sha512-t9k+5XRxUxkqQhIFnxAOJzSxyK1D7Qdhf7IoUDaFN8WWwI+2JBeJ2dIXP7nXbmSqXwQ2XQZSLD2WDw+ka6A2nQ==","shasum":"5a950add185acfaf310b912973dd6c39c608c5e6","tarball":"https://registry.npmjs.org/resilient-consumer/-/resilient-consumer-2.1.1.tgz","fileCount":31,"unpackedSize":90788,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCtWvcYtrk978/AmWOZvNdYAseX3yY2yzR+hwhfqlK8sgIgWdRFRG9Kj9FQgZ7ZgzRKn5N/uq3brpIwL0CijXUp3j4="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjkj1WACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmo7ohAAjwoCGh3IitU3qupJLjMQ4RueT+1IdrqhVOywk4FIjl2p+FBn\r\nbga8cN+X+5iXrB0vejAfp9C8X0yfGp2Su+Hkr1SmUkcIVNdzFm0Z6gyXeLH9\r\ntcrke9QlJATjyg5Gl+jjOI551CDp9IhTQ8uj7JuwJup3dUhDV3v917lqG/Kl\r\nesIbEXPFEG7hGeho0viNNJfncMboI60enPRYpM0bZPlrsXTSMIa/YkPr1cgP\r\nlhZHJnzNuGZadXw4fXayOR7bUZlS8h+imAOhboUpr7otwy+2rDSVdNM0HVFP\r\nLQLzgCtjsSip+RfGkBvaRiZWD09BkHO/GwK7oKibNIfhLaxfMYVASJ7hBWQ7\r\nGTEU0sSXwEAw4rpPpLGzAT0mKZxEHBEygJcbe0OK1Cvz4uMojehV5LOt7LbV\r\nse4EqFJuucXZFd/pUWMre1U4LIDPDpVKwGy/iGIUtYYAQEfMaxLVwOF/N1T1\r\n4IpydYZCIHTv0VBkEi4Kagt9GpIFJrTpCqtL7oBi6di1lnrBVU4rNZ9tJozR\r\nBQVjiyUhyXSZbpqrkW2xeJpmqFmJMZPq1QkZGtJGdp8Z9Zjz2nbKByFuQRMR\r\nu7RpU1kR6hxQf5sAH3mZ3B8QvISerSPiAoL2aIdo65UeDl6FoExcnWb31e5k\r\nVr5Hq/YY8GW7qnp2/nocCm2yIzhowHITAYQ=\r\n=zK8A\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"gabrielhenriques","email":"gabriel.hssantos@b2wdigital.com"},"directories":{},"maintainers":[{"name":"dentxinho","email":"raul_baldner_junior@hotmail.com"},{"name":"atila.santos","email":"atila.santos@b2wdigital.com"},{"name":"erovereb2w","email":"eduardo.rovere@b2wdigital.com"},{"name":"gabrielhenriques","email":"gabriel.hssantos@b2wdigital.com"},{"name":"carlosmeloads","email":"carlos.cmelo@b2wdigital.com"},{"name":"viniciusfariaresende","email":"vinicius.resende@b2wdigital.com"},{"name":"vitorhnn","email":"victor.chiletto@b2wdigital.com"},{"name":"nlaranjeira01","email":"nlaranjeira01@gmail.com"},{"name":"luizzamboni","email":"luizamboni2002@hotmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/resilient-consumer_2.1.1_1670528342308_0.6473149551636641"},"_hasShrinkwrap":false}},"readme":"Resilient Worker\n===\n[![CircleCI](https://circleci.com/gh/b2wads/resilient-worker/tree/master.svg?style=svg)](https://circleci.com/gh/admatic-tool/resilient-worker/tree/master)\n\nA worker lib designed to pull-and-process messages from different queue brokers (actually supporting **RabbitMQ** and  **AWS SQS**), which offers a common interface to **retry policy**, **successCallbacks**, **failCallbacks** , **ignore messages** and **bulk processing**.\n\n\n# Table of Contents\n - [Install](#install)\n - [Usage](#usage)\n   * [Example](#example)\n   * [Log](#log)\n   * [Do not Retry](#do-not-retry)\n   * [Idempotency](#idempotency)\n   * [SQL](#sqs)\n - [Roadmap](#roadmap)\n\n\n# Install\n```bash\n$ npm install resilient-consumer --save\n```\n\n# Usage\n\n## Example\n```javascript\nconst WorkerFactory = require(\"resilient-consumer\")\n\n\n/**\n * gen worker/publish pair\n*/ \n\nconst { worker, publish } = WorkerFactory.createWorker({\n\n  /**\n   * identity of worker\n  */\n  name: \"RandomWorker\",\n\n  /**\n   * (default: rabbit)\n  */\n  broker: \"rabbit\",\n\n  /**\n   * (Only for rabbitMq)\n   */\n  connectUrl: \"amqp://localhost\",\n\n  /**\n   * The target Queue that worker will consume\n   */\n  queue: \"job_example_queue\",\n\n  /**\n   * (default: bulkSize)\n   * How many messages will be received at once from the broker\n   */\n  prefetch: 10,\n  \n  /** \n    * (default: 1)\n    * Is a size of bulk messages that need be filled before worker begin to proccess messages\n    * (obs: If bulk not be filled in 10 seconds, it will be flushed too)\n  */\n  bulkSize: 10,\n\n  /**\n  * (optional)\n  * (Only for rabbitMq)\n  */ \n  publishIn: {\n    routingKey: \"jobs_key\",\n    exchange: \"test\",\n  },\n\n  /**\n   * max_try: max number of executing callback per message\n   */\n  max_try: 4,\n  \n  /** \n   * (optional) \n   * If setted the retry proccess will smooth by waiting this value in milisseconds before resend message to queue\n  */\n  retry_timeout: 1000,\n\n  /**\n   * (optional)\n   * (Only for rabbitMq)\n   * queueOptions: Used to assert queue, create queue if it doesn't exist\n   * or confirm these properties in target queue before start()\n  */\n  queueOptions: {\n    durable: true,\n    messageTtl: 60*1000,\n    maxLength: 50,\n    deadLetterExchange: \"job_example_deads\"\n  },\n\n  /**\n   * callback(messages):\n   * In this method the messages will be processed by your business logic\n   * and marked with some flags wich updates it internal state\n   */\n  callback(mesages) {\n    const [ min, max ] = [ 1 , 10 ]\n    const chanceOfFail = 8\n\n    for(const msg of messages) {\n      try {\n        const event = Math.random() * (max - min) + min\n\n        if(event <= chanceOfFail)\n          throw Error(\"random error\")\n\n        // get message content already parsed in object\n        const { value } = msg.getParserdContent()\n\n        // mark message as success end deliver to it a payload\n        msg.setSuccess({ newValue: event + value })\n\n      } catch(err) {\n        // mark message as failed and deliver to it a error\n        msg.setFailed(err)\n      }\n    }\n  },\n\n\n  /**\n   * failCallback(messages):\n   * (optional) \n   * If setted is called to messages that fails (markeds by msg#setFailed()) in a bulk and can not be retryed\n   */\n  failCallback(messages)  {\n    console.error(\"fail callback for\", messages)\n  }),\n\n  /**\n   * successCallback(messages):\n   * (optional) \n   * If setted is called to messages that success in a bulk (or without errors)\n   */\n  successCallback(messages) {\n    console.log(\"sucess callback for\", messages)\n  })\n})\n\n/**\n * use publishIn(if setted) or queue to send a message to your destin\n*/\npublish({ value: 1 })\npublish({ value: 3 })\npublish({ value: 4 })\npublish({ value: 5 })\n\n/**\n * start worker to consume target queue\n */\nworker.start()\n```\n\n\n## Log\n**Resilient-Consumer** is agnostic in terms of logging strategy, but it does emit trackable log events, implemented by the pattern `worker.on(eventName, callback(...params))`\n\n\n```javascript\nworker.start()\n\n/**\n * tack all \"log\" events, and works on these events\n */\nworker.on(\"log\", (workerName, ...data) => {\n  const [ level, messages, action ] = data\n\n  switch (level) {\n    case \"debug\":\n      messages.forEach(msg => {\n        logger.debug(...[ workerName, msg.messageId(), msg.tryCount(), msg.getParsedContent(), action ])\n      })\n      break\n\n    case \"error\":\n      messages.forEach(msg => {\n        logger.error(...[ workerName, msg.messageId(), msg.tryCount(), msg.getParsedContent(), action ])\n      })\n      break\n  }\n})\n```\n\n## Do Not Retry\n\nThe message payload may have errors sometimes (such as missing fields or other problems which doesn't worth a retry). For those cases you can use `msg.doNotContinueTry()` and mark the message to prevent the worker from retrying to process it.\n\n\n```javascript\ncallback(messages) {\n  for(const msg of messages) {\n    const values = msg.getParsedContent()\n      apiClient.add(values)\n                .then(res => msg.setSuccess({ msg: \"ok\" }))\n                .catch(err => {\n                  msg.setFail(err)\n                  // statusCode 4xx represents in http api a problem with client\n                  if(err.statusCode => 400 && err.statusCode > 500) {\n                    // this message not will be retryed\n                    msg.doNotContinueTry()\n                  }\n                })\n  }\n}\n```\n\n## Idempotency\nYou may need a worker with idempotent behavior for some types of messages, which means that it won't retry to process them twice. Mark those messages with `msg.setIgnore()` and they will also bypass `worker.successCallback()` and `worker.failCallback()` methods.\n\n```javascript\ncallback(messages) {\n\n  for(const msg of messages) {\n    try {\n      if(alreadyProcessed(msg.getMessageId())) {\n        // mark message to be ignored\n        msg.setIgnore()\n      } else {\n        /** works on message **/\n      }\n    }\n  }\n}\n```\n\n## SQS \n**Experimental**\n\nThe SQS worker will load your credendials from an **aws credential file** or from envvars:\n  - AWS_ACCESS_KEY_ID\n  - AWS_SECRET_ACCESS_KEY\n\n\n```javascript\n\nconst { worker, publish } = WorkerFactory.createWorker({\n\n  \n  name: \"SqsWorker\",\n\n  /**\n   * set \"sqs\" value to broker attribute\n  */\n  broker: \"sqs\",\n\n  /**\n   * set region in aws\n  */\n  aws: {\n    region: \"us-east-1\",\n  },\n  /**\n   * specify a queue name in AWS sqs\n   * (obs: today this will be a queue where a publish() will deliver message )\n  */\n  queue: \"development-worker.fifo\",\n\n  bulkSize: 10,\n  max_try: 4,\n  callback(mesages) {\n    // business logic ...\n  },\n})\n```\n\n# Roadmap\n  - [sqs broker] Support for publishing in a **AWS SNS Topic**, using the worker's `publishIn` attribute.\n  - [logging] Add own logger\n  - [brokers] Add publisher retries\n  - [brokers] Use backoff factor for retries\n  - [**Breaking Change**] [lib] Drop ES5 support\n  - [**Breaking Change**] [rabbit broker] Throw errors on `stop()`","maintainers":[{"email":"jean.michel@americanas.io","name":"mikeofic"},{"email":"raul_baldner_junior@hotmail.com","name":"dentxinho"},{"email":"atila.santos@b2wdigital.com","name":"atila.santos"},{"email":"gabriel.hssantos@b2wdigital.com","name":"gabrielhenriques"},{"email":"carlos.cmelo@b2wdigital.com","name":"carlosmeloads"},{"email":"luizamboni2002@hotmail.com","name":"luizzamboni"}],"time":{"modified":"2023-05-29T14:24:29.988Z","created":"2017-10-31T18:28:10.363Z","1.0.0":"2017-10-31T18:28:10.363Z","1.0.1":"2017-11-08T21:18:38.808Z","1.0.2":"2017-11-27T20:20:37.519Z","1.0.4":"2018-01-31T14:12:41.151Z","1.1.0":"2018-03-09T14:26:56.004Z","1.1.1":"2018-03-09T14:40:25.408Z","1.1.2":"2018-03-14T20:06:00.508Z","1.1.3":"2018-03-15T21:19:20.032Z","1.2.3":"2018-04-17T18:12:01.855Z","2.0.0-rc1":"2018-08-02T19:03:06.971Z","2.0.0-rc2":"2018-08-02T22:11:48.652Z","2.0.0-rc3":"2018-08-07T18:24:05.190Z","2.0.0":"2018-08-16T18:36:24.690Z","2.0.1":"2018-08-28T17:17:37.410Z","2.0.2":"2019-11-25T13:56:38.245Z","2.1.0-rc.1":"2020-01-14T17:35:52.998Z","2.1.0":"2020-01-15T19:28:45.540Z","1.2.4":"2020-03-09T20:22:27.781Z","2.1.1":"2022-12-08T19:39:02.451Z"},"homepage":"https://github.com/b2wads/resilient-worker#readme","keywords":["resiliense","worker","consumer","ampq"],"repository":{"type":"git","url":"git+https://github.com/b2wads/resilient-worker.git"},"author":{"name":"Luiz Zamboni"},"bugs":{"url":"https://github.com/b2wads/resilient-worker/issues"},"license":"ISC","readmeFilename":"README.md"}