{"_id":"meteor-job","_rev":"50-110b71da2f6c95678c6be494269937d1","name":"meteor-job","description":"Class for Meteor jobCollection for use both within meteor.js and with pure node.js workers","dist-tags":{"latest":"1.5.2"},"versions":{"0.0.0":{"name":"meteor-job","version":"0.0.0","description":"WIP! Class for Meteor jobCollection jobs for use both within Meteori.js and with pure node.js workers","main":"lib/job_class.js","dependencies":{},"devDependencies":{"coffee-script":">=1.7.1","mocha":"1.18.2"},"scripts":{"prepublish":"coffee --compile --output lib/ src/","test":"echo \"Error: no tests specified yet, requires Meteor.js to test.\" && exit 1"},"repository":{"type":"git","url":"github.com:vsivsi/meteor-job.git"},"keywords":[],"engine":{"node":">=0.10.28"},"bugs":{"url":"https://github.com/vsivsi/meteor-job/issues"},"author":{"name":"Vaughn Iverson"},"license":"MIT/X11","homepage":"https://github.com/vsivsi/meteor-job","_id":"meteor-job@0.0.0","_shasum":"ed38d0a6917fcb046a1a7cdffb4d4992f9635320","_from":".","_npmVersion":"1.4.10","_npmUser":{"name":"vsivsi","email":"vsivsi@yahoo.com"},"maintainers":[{"name":"vsivsi","email":"vsivsi@yahoo.com"}],"dist":{"shasum":"ed38d0a6917fcb046a1a7cdffb4d4992f9635320","tarball":"https://registry.npmjs.org/meteor-job/-/meteor-job-0.0.0.tgz","integrity":"sha512-jYbck6kyvnt6/gWMSiLXYlXNPLhWImxg+tCIkAUXcLFLWnp2hfK9egb+V3sQte9hBdhsQ/tBOPytDLXs1YxaJg==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIHgJxMB1jgrSJ3yo+a7HrVpa6AJP0AeNh5u/b6PAj4qUAiEAmCNi5PuAiBxONDF7+uGW4oXiLm2MQCAnfYvHyH5oQ5Q="}]}},"0.0.1":{"name":"meteor-job","version":"0.0.1","description":"WIP! Class for Meteor jobCollection jobs for use both within meteor.js and with pure node.js workers","main":"lib/job_class.js","dependencies":{},"devDependencies":{"coffee-script":">=1.7.1","mocha":"1.20.0"},"scripts":{"prepublish":"coffee --compile --output lib/ src/","test":"echo \"Error: no tests specified yet, requires Meteor.js to test.\" && exit 1"},"repository":{"type":"git","url":"https://github.com:vsivsi/meteor-job.git"},"keywords":[],"engine":{"node":">=0.10.28"},"bugs":{"url":"https://github.com/vsivsi/meteor-job/issues"},"author":{"name":"Vaughn Iverson"},"license":"MIT/X11","gitHead":"c294c44dd5a1a654e9424b8612e88bab596c2af4","homepage":"https://github.com/vsivsi/meteor-job","_id":"meteor-job@0.0.1","_shasum":"599fe8bc89796f94b04a4d895d5a48da8a6069f3","_from":"meteor-job/","_npmVersion":"1.4.13","_npmUser":{"name":"vsivsi","email":"vsivsi@yahoo.com"},"maintainers":[{"name":"vsivsi","email":"vsivsi@yahoo.com"}],"dist":{"shasum":"599fe8bc89796f94b04a4d895d5a48da8a6069f3","tarball":"https://registry.npmjs.org/meteor-job/-/meteor-job-0.0.1.tgz","integrity":"sha512-O+R4uNRYL/9rt5lZviZlAwIHbwuWuBu2pKiLjOuEUBi8cU564gcUm4dBaZZa+Lrr5WKyMq5VVk6LrQkb2znSzg==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIBD92Ma4ZiR89Ci+wkEWDCyZv8lwVuUnIZPnDs+r3a55AiAKCYXOezeXHXQR+XW1D0tzCsT4gdnYL35YFyLT8Etj2A=="}]}},"0.0.2":{"name":"meteor-job","version":"0.0.2","description":"Class for Meteor jobCollection jobs for use both within meteor.js and with pure node.js workers","main":"lib/job_class.js","dependencies":{},"devDependencies":{"coffee-script":">=1.7.1","mocha":"1.20.1","rewire":"2.0.1","sinon":"1.10.2","chai":"1.9.1"},"scripts":{"prepublish":"coffee --compile --output lib/ src/","test":"make test"},"repository":{"type":"git","url":"https://github.com:vsivsi/meteor-job.git"},"keywords":[],"engine":{"node":">=0.10.28"},"bugs":{"url":"https://github.com/vsivsi/meteor-job/issues"},"author":{"name":"Vaughn Iverson"},"license":"MIT/X11","gitHead":"b9e6311008f76bc4cff3c90f7fc48ca830392be6","homepage":"https://github.com/vsivsi/meteor-job","_id":"meteor-job@0.0.2","_shasum":"00423fbfa5f513797ffe99656bc330800308c865","_from":"./meteor-job","_npmVersion":"1.4.13","_npmUser":{"name":"vsivsi","email":"vsivsi@yahoo.com"},"maintainers":[{"name":"vsivsi","email":"vsivsi@yahoo.com"}],"dist":{"shasum":"00423fbfa5f513797ffe99656bc330800308c865","tarball":"https://registry.npmjs.org/meteor-job/-/meteor-job-0.0.2.tgz","integrity":"sha512-jPoJ8oB2oqwWnrU2IFLk86jMqyEDxXtw4kDv/oOhfl802Q00+u7sz5WccnWCBT/DrX/77hp90CD/l/E6fjvevQ==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIGQyaamriHo11XgA4UY1PMqVkQYq8Rt1xp+TCSZ3AxR1AiAhnvKqkIdwivJ+t6ggyuHcQRthXHIfT8mAl9SdpCKaQw=="}]}},"0.0.3":{"name":"meteor-job","version":"0.0.3","description":"Class for Meteor jobCollection jobs for use both within meteor.js and with pure node.js workers","main":"lib/job_class.js","dependencies":{},"devDependencies":{"coffee-script":">=1.7.1","mocha":"1.20.1","rewire":"2.0.1","sinon":"1.10.2","chai":"1.9.1"},"scripts":{"prepublish":"coffee --compile --output lib/ src/","test":"make test"},"repository":{"type":"git","url":"https://github.com:vsivsi/meteor-job.git"},"keywords":[],"engine":{"node":">=0.10.28"},"bugs":{"url":"https://github.com/vsivsi/meteor-job/issues"},"author":{"name":"Vaughn Iverson"},"license":"MIT/X11","gitHead":"fecedd2846a4aa79bf6eb7a617ea5e292f18e147","homepage":"https://github.com/vsivsi/meteor-job","_id":"meteor-job@0.0.3","_shasum":"9b63243dcdd3eb9149b26eebc444e1aab711bb5e","_from":"./meteor-job","_npmVersion":"1.4.13","_npmUser":{"name":"vsivsi","email":"vsivsi@yahoo.com"},"maintainers":[{"name":"vsivsi","email":"vsivsi@yahoo.com"}],"dist":{"shasum":"9b63243dcdd3eb9149b26eebc444e1aab711bb5e","tarball":"https://registry.npmjs.org/meteor-job/-/meteor-job-0.0.3.tgz","integrity":"sha512-7X5c2040BDIv0DJARpjKTyqpz+HrS5uA7374a+CvUDBUxYL4oTuAGAqK1MJvyn3JwD0U4gZhTB4yBNqeefvpBw==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDFQGQBQLb451OAhc8kXhKquVASc3goKgfaVBO6/OQfsgIhAL0aZITofR/7wwe7Xi+Rir13JTo+C4jjKP2kEpMRIPmW"}]}},"0.0.4":{"name":"meteor-job","version":"0.0.4","description":"Class for Meteor jobCollection jobs for use both within meteor.js and with pure node.js workers","main":"lib/job_class.js","dependencies":{},"devDependencies":{"coffee-script":">=1.7.1","mocha":"1.20.1","rewire":"2.0.1","sinon":"1.10.2","chai":"1.9.1"},"scripts":{"prepublish":"coffee --compile --output lib/ src/","test":"make test"},"repository":{"type":"git","url":"https://github.com:vsivsi/meteor-job.git"},"keywords":[],"engine":{"node":">=0.10.28"},"bugs":{"url":"https://github.com/vsivsi/meteor-job/issues"},"author":{"name":"Vaughn Iverson"},"license":"MIT/X11","gitHead":"0bdfe724459346d45339878bd71e5cfecbb6e6e3","homepage":"https://github.com/vsivsi/meteor-job","_id":"meteor-job@0.0.4","_shasum":"075902486f9ec8a97c3535e2f8e960dbc51217fd","_from":"./meteor-job","_npmVersion":"1.4.14","_npmUser":{"name":"vsivsi","email":"vsivsi@yahoo.com"},"maintainers":[{"name":"vsivsi","email":"vsivsi@yahoo.com"}],"dist":{"shasum":"075902486f9ec8a97c3535e2f8e960dbc51217fd","tarball":"https://registry.npmjs.org/meteor-job/-/meteor-job-0.0.4.tgz","integrity":"sha512-VQLSCJLeiMrqTIc8zUgLeFgIJkBUCWqY85Ah8GQhOtUHoexuvMkKwpR0MpRq8wlj8onY+kindbJhWsYroiucbA==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDN2YO2KU1wUwJvTzPLJy4OaZphYB1qRZgN7YXc/9PLjgIgW4hQr1ugXy3eYoc5oDVIwpGRw4vp+haW88Tk1qJ1TEw="}]}},"0.0.5":{"name":"meteor-job","version":"0.0.5","description":"Class for Meteor jobCollection jobs for use both within meteor.js and with pure node.js workers","main":"lib/job_class.js","dependencies":{},"devDependencies":{"coffee-script":">=1.7.1","mocha":"1.20.1","rewire":"2.0.1","sinon":"1.10.2","chai":"1.9.1"},"scripts":{"prepublish":"coffee --compile --output lib/ src/","test":"make test"},"repository":{"type":"git","url":"https://github.com:vsivsi/meteor-job.git"},"keywords":[],"engine":{"node":">=0.10.28"},"bugs":{"url":"https://github.com/vsivsi/meteor-job/issues"},"author":{"name":"Vaughn Iverson"},"license":"MIT/X11","gitHead":"b7c634f88fd764eff4daac99d1391cea4ccac3cc","homepage":"https://github.com/vsivsi/meteor-job","_id":"meteor-job@0.0.5","_shasum":"e2e6fd9b1b89097ae71269e71391f250fbf1b041","_from":"./meteor-job","_npmVersion":"1.4.14","_npmUser":{"name":"vsivsi","email":"vsivsi@yahoo.com"},"maintainers":[{"name":"vsivsi","email":"vsivsi@yahoo.com"}],"dist":{"shasum":"e2e6fd9b1b89097ae71269e71391f250fbf1b041","tarball":"https://registry.npmjs.org/meteor-job/-/meteor-job-0.0.5.tgz","integrity":"sha512-Jm9ojnX2b8iXKAXL3nXlE+7eW2DyQJJB56aDwnN/cHpSAF6k+cs53vOey6YYK4Pokn1XX1Rpx8paV+/O4JcXKg==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIAt1KpWTgXNU42k9a3pXUPkf9O5pmeAn8uldKjFJICKfAiAM0VAZv69UE3n5tVArftcsmUUOAtMB/FKQGJfco6nQ7Q=="}]}},"0.0.6":{"name":"meteor-job","version":"0.0.6","description":"Class for Meteor jobCollection for use both within meteor.js and with pure node.js workers","main":"lib/job_class.js","dependencies":{},"devDependencies":{"coffee-script":">=1.7.1","mocha":"1.20.1","rewire":"2.0.1","sinon":"1.10.2","chai":"1.9.1"},"scripts":{"prepublish":"coffee --compile --output lib/ src/","test":"make test"},"repository":{"type":"git","url":"https://github.com:vsivsi/meteor-job.git"},"keywords":[],"engine":{"node":">=0.10.28"},"bugs":{"url":"https://github.com/vsivsi/meteor-job/issues"},"author":{"name":"Vaughn Iverson"},"license":"MIT/X11","gitHead":"20106e82b3db01c325f924006956ac7f7cfa1925","homepage":"https://github.com/vsivsi/meteor-job","_id":"meteor-job@0.0.6","_shasum":"d80d8821c98cc503cc1c64f9aecba96246edc6cf","_from":"./meteor-job","_npmVersion":"1.4.14","_npmUser":{"name":"vsivsi","email":"vsivsi@yahoo.com"},"maintainers":[{"name":"vsivsi","email":"vsivsi@yahoo.com"}],"dist":{"shasum":"d80d8821c98cc503cc1c64f9aecba96246edc6cf","tarball":"https://registry.npmjs.org/meteor-job/-/meteor-job-0.0.6.tgz","integrity":"sha512-ygobJpE6fM1LKwA2NVLZvEZbR5dh3+bM2W/UuFJkl78Z/Sd5DqgUHgdKxtRRGEi/BfVewHCVmhe7hOian1+fQg==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDvBgvhRqT7Vst2MytL08Q7lKS2Z6Ck3sGIrACGbC/y1wIhAPSyeTvxfaJHtTXqO3m74z/W15prlv7/CFj5gi5xM+CN"}]}},"0.0.7":{"name":"meteor-job","version":"0.0.7","description":"Class for Meteor jobCollection for use both within meteor.js and with pure node.js workers","main":"lib/job_class.js","dependencies":{},"devDependencies":{"coffee-script":">=1.7.1","mocha":"1.20.1","rewire":"2.0.1","sinon":"1.10.2","chai":"1.9.1"},"scripts":{"prepublish":"coffee --compile --output lib/ src/","test":"make test"},"repository":{"type":"git","url":"https://github.com:vsivsi/meteor-job.git"},"keywords":[],"engine":{"node":">=0.10.28"},"bugs":{"url":"https://github.com/vsivsi/meteor-job/issues"},"author":{"name":"Vaughn Iverson"},"license":"MIT/X11","gitHead":"20106e82b3db01c325f924006956ac7f7cfa1925","homepage":"https://github.com/vsivsi/meteor-job","_id":"meteor-job@0.0.7","_shasum":"f313d66371455c1d43e2dc1d5e8c632fd4509a3c","_from":"meteor-job/","_npmVersion":"1.4.14","_npmUser":{"name":"vsivsi","email":"vsivsi@yahoo.com"},"maintainers":[{"name":"vsivsi","email":"vsivsi@yahoo.com"}],"dist":{"shasum":"f313d66371455c1d43e2dc1d5e8c632fd4509a3c","tarball":"https://registry.npmjs.org/meteor-job/-/meteor-job-0.0.7.tgz","integrity":"sha512-Y0/QeM3gtH9/KD+HFKd3vy0r0CGzrCs49tc6M+OeoDhY/QFU1zx8wZyCNJ2IUSnZOp5RorLnosU5qitv5+Uf0g==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIEIvpv+aqrH/oqsD/1cA/ARnMTKeP6wfRLLT7CQjm1qnAiEA2t6dvYJ3J2HvnKXoz8GlzMZyouyqHGxNBY8Qh85Wa+A="}]}},"0.0.8":{"name":"meteor-job","version":"0.0.8","description":"Class for Meteor jobCollection for use both within meteor.js and with pure node.js workers","main":"lib/job_class.js","dependencies":{},"devDependencies":{"coffee-script":">=1.7.1","mocha":"1.20.1","rewire":"2.0.1","sinon":"1.10.2","chai":"1.9.1"},"scripts":{"prepublish":"coffee --compile --output lib/ src/","test":"make test"},"repository":{"type":"git","url":"https://github.com:vsivsi/meteor-job.git"},"keywords":[],"engine":{"node":">=0.10.28"},"bugs":{"url":"https://github.com/vsivsi/meteor-job/issues"},"author":{"name":"Vaughn Iverson"},"license":"MIT/X11","gitHead":"3ffe4db2d28ce83fa72f212f3cabd6c53633eb88","homepage":"https://github.com/vsivsi/meteor-job","_id":"meteor-job@0.0.8","_shasum":"52473b6c85d923c2bb01a8b39368fe6a7d514347","_from":"meteor-job/","_npmVersion":"1.4.14","_npmUser":{"name":"vsivsi","email":"vsivsi@yahoo.com"},"maintainers":[{"name":"vsivsi","email":"vsivsi@yahoo.com"}],"dist":{"shasum":"52473b6c85d923c2bb01a8b39368fe6a7d514347","tarball":"https://registry.npmjs.org/meteor-job/-/meteor-job-0.0.8.tgz","integrity":"sha512-3qEXY3PCwxL5g3gIgatD7svgOBa1JeJg4Ji6LfeeLwqzKadHm2IoOMG2IW4aaNLRO6DIEmXlvo50R0+LWI7z4g==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCsfwD8WrR8Tpd43qHMI1UJjFOCwKhZqI3s+p2QzjlP6AIgcigWnxAiRYjJ+shaVZ1DiHHqHOxCa1ro6rC92qbTtPA="}]}},"0.0.9":{"name":"meteor-job","version":"0.0.9","description":"Class for Meteor jobCollection for use both within meteor.js and with pure node.js workers","main":"lib/job_class.js","dependencies":{},"devDependencies":{"coffee-script":">=1.7.1","mocha":"1.20.1","rewire":"2.0.1","sinon":"1.10.2","chai":"1.9.1"},"scripts":{"prepublish":"coffee --compile --output lib/ src/","test":"make test"},"repository":{"type":"git","url":"https://github.com:vsivsi/meteor-job.git"},"keywords":[],"engine":{"node":">=0.10.28"},"bugs":{"url":"https://github.com/vsivsi/meteor-job/issues"},"author":{"name":"Vaughn Iverson"},"license":"MIT/X11","gitHead":"cf808a9300bb6ee4f84d4347e3beeef5b3bd5204","homepage":"https://github.com/vsivsi/meteor-job","_id":"meteor-job@0.0.9","_shasum":"394a7886aead019fdd41dc3ffd0bea83d7d6cd4a","_from":"meteor-job/","_npmVersion":"1.4.14","_npmUser":{"name":"vsivsi","email":"vsivsi@yahoo.com"},"maintainers":[{"name":"vsivsi","email":"vsivsi@yahoo.com"}],"dist":{"shasum":"394a7886aead019fdd41dc3ffd0bea83d7d6cd4a","tarball":"https://registry.npmjs.org/meteor-job/-/meteor-job-0.0.9.tgz","integrity":"sha512-QzE8/h91nRbgtrhzcpflu4L1c81pHT30jwooQX+VWGKwglbV5tw6S0EWA9FDQDfYCXxi06y3fO/bU6533Nrbcw==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCSiDPM7DJgXvkuYM5sWku3e3Iri1as+FtRkSuuvWq7bgIgC3lBj49lYzktgEJIkyBX7OliLrdUcMISXSMPcXhmC2I="}]}},"0.0.10":{"name":"meteor-job","version":"0.0.10","description":"Class for Meteor jobCollection for use both within meteor.js and with pure node.js workers","main":"lib/job_class.js","dependencies":{},"devDependencies":{"coffee-script":">=1.7.1","mocha":"1.20.1","rewire":"2.0.1","sinon":"1.10.2","chai":"1.9.1"},"scripts":{"prepublish":"coffee --compile --output lib/ src/","test":"make test"},"repository":{"type":"git","url":"https://github.com:vsivsi/meteor-job.git"},"keywords":[],"engine":{"node":">=0.10.28"},"bugs":{"url":"https://github.com/vsivsi/meteor-job/issues"},"author":{"name":"Vaughn Iverson"},"license":"MIT/X11","gitHead":"272f8adedddc6c6894a7a124fba7237409d55028","homepage":"https://github.com/vsivsi/meteor-job","_id":"meteor-job@0.0.10","_shasum":"537c5ed704263b5d1edd6463a196fb05b931cc75","_from":"meteor-job/","_npmVersion":"1.4.15","_npmUser":{"name":"vsivsi","email":"vsivsi@yahoo.com"},"maintainers":[{"name":"vsivsi","email":"vsivsi@yahoo.com"}],"dist":{"shasum":"537c5ed704263b5d1edd6463a196fb05b931cc75","tarball":"https://registry.npmjs.org/meteor-job/-/meteor-job-0.0.10.tgz","integrity":"sha512-dqtGQEJ0hnbZKjY4SI5ifO0d9VNha6xUNeHkG/gJJJ4ysawulXHRhLOevgcdgz+qZ3nV0RP5TuusIYn6GGLAnA==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDTzCGk8iH26vctFvIfQHcbT9AesDlR3BaQjUnlRY8sRwIhANv9Qg3e3xJ+VgAcTnYxAX/eMPbQXm7CQjeKLdO1xoBD"}]}},"0.0.11":{"name":"meteor-job","version":"0.0.11","description":"Class for Meteor jobCollection for use both within meteor.js and with pure node.js workers","main":"lib/job_class.js","dependencies":{},"devDependencies":{"coffee-script":">=1.7.1","mocha":"1.20.1","rewire":"2.0.1","sinon":"1.10.2","chai":"1.9.1"},"scripts":{"prepublish":"coffee --compile --output lib/ src/","test":"make test"},"repository":{"type":"git","url":"https://github.com:vsivsi/meteor-job.git"},"keywords":[],"engine":{"node":">=0.10.28"},"bugs":{"url":"https://github.com/vsivsi/meteor-job/issues"},"author":{"name":"Vaughn Iverson"},"license":"MIT/X11","gitHead":"7642e8ea7c1f7caa79e3b1499d0a3bc7a2f24902","homepage":"https://github.com/vsivsi/meteor-job","_id":"meteor-job@0.0.11","_shasum":"64254e27317e3ac87ae0868a60c36794805f1fee","_from":"meteor-job/","_npmVersion":"1.4.15","_npmUser":{"name":"vsivsi","email":"vsivsi@yahoo.com"},"maintainers":[{"name":"vsivsi","email":"vsivsi@yahoo.com"}],"dist":{"shasum":"64254e27317e3ac87ae0868a60c36794805f1fee","tarball":"https://registry.npmjs.org/meteor-job/-/meteor-job-0.0.11.tgz","integrity":"sha512-aSOoJStvLE4s0WX5dWE2BofMd4Xqtb7RYZ1KJqCcCSgcWWcJXwaFYBRA+Qmy5CU7+NwsaMeBQcZ/spCdoom3xQ==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIFHCyeeYCAw3POgy1Q3SVDDUTLL6AYMEuH6H+oqzrMVjAiEA3guxk4u6gPSrfjKoX8FuKZImvdfRRqBCRkSLDEVHM6A="}]}},"0.0.12":{"name":"meteor-job","version":"0.0.12","description":"Class for Meteor jobCollection for use both within meteor.js and with pure node.js workers","main":"lib/job_class.js","dependencies":{},"devDependencies":{"coffee-script":">=1.7.1","mocha":"1.21.0","rewire":"2.1.0","sinon":"1.10.3","chai":"1.9.1"},"scripts":{"prepublish":"coffee --compile --output lib/ src/","test":"make test"},"repository":{"type":"git","url":"https://github.com:vsivsi/meteor-job.git"},"keywords":[],"engine":{"node":">=0.10.28"},"bugs":{"url":"https://github.com/vsivsi/meteor-job/issues"},"author":{"name":"Vaughn Iverson"},"license":"MIT/X11","gitHead":"5117a4cd0262d0181a8119377f244e9d7177c814","homepage":"https://github.com/vsivsi/meteor-job","_id":"meteor-job@0.0.12","_shasum":"b25007dad13269b181b04abe921f816da3631466","_from":"./meteor-job","_npmVersion":"1.4.20","_npmUser":{"name":"vsivsi","email":"vsivsi@yahoo.com"},"maintainers":[{"name":"vsivsi","email":"vsivsi@yahoo.com"}],"dist":{"shasum":"b25007dad13269b181b04abe921f816da3631466","tarball":"https://registry.npmjs.org/meteor-job/-/meteor-job-0.0.12.tgz","integrity":"sha512-YaZcBEMk67q4K042U2HWO0eme0c63Qlem2NK1PzAhWYkiT6K9/uhI2APEO9EgVc0DkR2VU2+DpcyRmCy6zEBbQ==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDxDwIEZOfXp8UbBibbOJ8rcVGA0ly5lpE3jEPe4S9FzQIhAJ7meq/4201XGZc+ksnZyE0feaAeeLEyzLICxO2Gzhey"}]}},"0.0.13":{"name":"meteor-job","version":"0.0.13","description":"Class for Meteor jobCollection for use both within meteor.js and with pure node.js workers","main":"lib/job_class.js","dependencies":{},"devDependencies":{"coffee-script":">=1.7.1","mocha":"1.21.0","rewire":"2.1.0","sinon":"1.10.3","chai":"1.9.1"},"scripts":{"prepublish":"coffee --compile --output lib/ src/","test":"make test"},"repository":{"type":"git","url":"https://github.com:vsivsi/meteor-job.git"},"keywords":[],"engine":{"node":">=0.10.28"},"bugs":{"url":"https://github.com/vsivsi/meteor-job/issues"},"author":{"name":"Vaughn Iverson"},"license":"MIT/X11","gitHead":"0884d5a179852cffcc624f8afb8e91dc36525091","homepage":"https://github.com/vsivsi/meteor-job","_id":"meteor-job@0.0.13","_shasum":"8ea14aba8501fb16ec2841d6315dd0f8d1472c5f","_from":"./meteor-job","_npmVersion":"1.4.20","_npmUser":{"name":"vsivsi","email":"vsivsi@yahoo.com"},"maintainers":[{"name":"vsivsi","email":"vsivsi@yahoo.com"}],"dist":{"shasum":"8ea14aba8501fb16ec2841d6315dd0f8d1472c5f","tarball":"https://registry.npmjs.org/meteor-job/-/meteor-job-0.0.13.tgz","integrity":"sha512-oTyf1wNrg6oKM9lxE0Gd62xIUGTTvcefrOdL4JWwCyGDYmm17Lh3fq8KHsXMU28s7S+Yo5IeWCfPzvqlajBg5A==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIGfWtvYGiY5y8OqkAqy2NLHD9lW/EtEInShYG9mNPmcWAiBgG1nTUYLJ+IXTyR7CNy0rkCyB85OU+law7Bbf0HK1Gg=="}]}},"0.0.14":{"name":"meteor-job","version":"0.0.14","description":"Class for Meteor jobCollection for use both within meteor.js and with pure node.js workers","main":"lib/job_class.js","dependencies":{},"devDependencies":{"coffee-script":">=1.7.1","mocha":"1.21.0","rewire":"2.1.0","sinon":"1.10.3","chai":"1.9.1"},"scripts":{"prepublish":"coffee --compile --output lib/ src/","test":"make test"},"repository":{"type":"git","url":"https://github.com:vsivsi/meteor-job.git"},"keywords":[],"engine":{"node":">=0.10.28"},"bugs":{"url":"https://github.com/vsivsi/meteor-job/issues"},"author":{"name":"Vaughn Iverson"},"license":"MIT/X11","gitHead":"afd98eede2d7a7a1f8ef4a369e9baafd7b447738","homepage":"https://github.com/vsivsi/meteor-job","_id":"meteor-job@0.0.14","_shasum":"c3967035ccb5feda86f545ad58911f2fc79109f8","_from":".","_npmVersion":"1.4.20","_npmUser":{"name":"vsivsi","email":"vsivsi@yahoo.com"},"maintainers":[{"name":"vsivsi","email":"vsivsi@yahoo.com"}],"dist":{"shasum":"c3967035ccb5feda86f545ad58911f2fc79109f8","tarball":"https://registry.npmjs.org/meteor-job/-/meteor-job-0.0.14.tgz","integrity":"sha512-APA8B+HAQRkBNzCiflbSBhWMTVxMl1B0797RDR596+7Q4XeFvhCuuZ6/U5QdoS4BZc4yi7B2CHhIR3cU3p0TjQ==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDzm1XwRqYBJevi8ucKkXtvETV4i9cnqFf5/r/hoqKHTQIhAL0Wlu/TzuQDWgGf6m+reIX+ZPvC/4ZNC184DzSaZbgn"}]}},"0.0.15":{"name":"meteor-job","version":"0.0.15","description":"Class for Meteor jobCollection for use both within meteor.js and with pure node.js workers","main":"lib/job_class.js","dependencies":{},"devDependencies":{"coffee-script":"~1.8.0","mocha":"2.0.1","rewire":"2.1.3","sinon":"1.11.1","chai":"1.10.0"},"scripts":{"prepublish":"coffee --compile --output lib/ src/","test":"make test"},"repository":{"type":"git","url":"https://github.com:vsivsi/meteor-job.git"},"keywords":[],"engine":{"node":">=0.10.28"},"bugs":{"url":"https://github.com/vsivsi/meteor-job/issues"},"author":{"name":"Vaughn Iverson"},"license":"MIT/X11","gitHead":"453ea0eec8f5b5e3a9c1325ea1465d3dec400906","homepage":"https://github.com/vsivsi/meteor-job","_id":"meteor-job@0.0.15","_shasum":"2120b828be482fcd5ddd8e8511683465ae3db04a","_from":".","_npmVersion":"2.1.7","_nodeVersion":"0.10.33","_npmUser":{"name":"vsivsi","email":"vsivsi@yahoo.com"},"maintainers":[{"name":"vsivsi","email":"vsivsi@yahoo.com"}],"dist":{"shasum":"2120b828be482fcd5ddd8e8511683465ae3db04a","tarball":"https://registry.npmjs.org/meteor-job/-/meteor-job-0.0.15.tgz","integrity":"sha512-kM6ZP/fgUi96jxSrVp2HLMFi6i7Nl5wip1LKO0pshxA30ftDamydL4MsOW39HtT7ff+d5OqhW3iry0Jw6GtCHg==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIBntIZIvZUMz/TkMo07J1mqOf7Ky1IXOhyMjsQ+on4loAiEAks2Vj4RJMLxQ25COM00ipLqlS6X+vvW2GhuDp7t1gw0="}]}},"1.0.0":{"name":"meteor-job","version":"1.0.0","description":"Class for Meteor jobCollection for use both within meteor.js and with pure node.js workers","main":"lib/job_class.js","dependencies":{},"devDependencies":{"coffee-script":"1.9.1","mocha":"2.2.1","rewire":"2.3.1","sinon":"1.14.1","chai":"2.1.2","fibers":"1.0.5"},"scripts":{"prepublish":"coffee --compile --output lib/ src/","test":"make test"},"repository":{"type":"git","url":"https://github.com:vsivsi/meteor-job.git"},"keywords":[],"engine":{"node":">=0.10.36"},"bugs":{"url":"https://github.com/vsivsi/meteor-job/issues"},"author":{"name":"Vaughn Iverson"},"license":"MIT/X11","gitHead":"97716b881325929e0dfef0fd14142ff44cc1a966","homepage":"https://github.com/vsivsi/meteor-job","_id":"meteor-job@1.0.0","_shasum":"ca7627ef26a708952ac4ca2ca722237ecccc6bb8","_from":".","_npmVersion":"2.7.3","_nodeVersion":"0.10.36","_npmUser":{"name":"vsivsi","email":"vsivsi@yahoo.com"},"maintainers":[{"name":"vsivsi","email":"vsivsi@yahoo.com"}],"dist":{"shasum":"ca7627ef26a708952ac4ca2ca722237ecccc6bb8","tarball":"https://registry.npmjs.org/meteor-job/-/meteor-job-1.0.0.tgz","integrity":"sha512-Gg75+e0q8vfEOStjyAEqxDnk8xbLIgfqdt79kLwBkhdJLNEOzoC/xGzwNYWk2LQVLuP/dipWoNPowJYQkexSUw==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIH17IasPwADAYhNqDs1bdIk/l4Rk90DV/raMXk6Aa+FWAiEA5C+D2sp4X1LnEK0NplObGP0ujWCp8EtyOGo0RKVNNTQ="}]}},"1.1.0":{"name":"meteor-job","version":"1.1.0","description":"Class for Meteor jobCollection for use both within meteor.js and with pure node.js workers","main":"lib/job_class.js","dependencies":{},"devDependencies":{"coffee-script":"1.9.1","mocha":"2.2.1","rewire":"2.3.1","sinon":"1.14.1","chai":"2.2.0","fibers":"1.0.5"},"scripts":{"prepublish":"coffee --compile --output lib/ src/","test":"make test"},"repository":{"type":"git","url":"https://github.com:vsivsi/meteor-job.git"},"keywords":[],"engine":{"node":">=0.10.36"},"bugs":{"url":"https://github.com/vsivsi/meteor-job/issues"},"author":{"name":"Vaughn Iverson"},"license":"MIT/X11","gitHead":"cdf696538566fd5d38c261371e8b3667692c6949","homepage":"https://github.com/vsivsi/meteor-job","_id":"meteor-job@1.1.0","_shasum":"53d62293f1be77da78e8716c748b0f60f8c34925","_from":".","_npmVersion":"2.7.4","_nodeVersion":"0.12.2","_npmUser":{"name":"vsivsi","email":"vsivsi@yahoo.com"},"maintainers":[{"name":"vsivsi","email":"vsivsi@yahoo.com"}],"dist":{"shasum":"53d62293f1be77da78e8716c748b0f60f8c34925","tarball":"https://registry.npmjs.org/meteor-job/-/meteor-job-1.1.0.tgz","integrity":"sha512-pbxWIE/oWlqpM6s+cEqdrAg1fMp3YEMQTvdo1CKtyCzQ+HqmAqyMHQUJ76eLawkUGPmIC9bRMSlMqkTPoXNy5w==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIDC3cl8DjDceZK2K75xCkLuiSMnLQR1VvN23YKJHdsn6AiEA+4Yk5WhKjSg9x4hUSVUp95gHttvQYCqUqbjGYtSViyA="}]}},"1.1.1":{"name":"meteor-job","version":"1.1.1","description":"Class for Meteor jobCollection for use both within meteor.js and with pure node.js workers","main":"lib/job_class.js","dependencies":{},"devDependencies":{"coffee-script":"1.9.2","mocha":"2.2.4","rewire":"2.3.1","sinon":"1.14.1","chai":"2.2.0","fibers":"1.0.5"},"scripts":{"prepublish":"coffee --compile --output lib/ src/","test":"make test"},"repository":{"type":"git","url":"git+https://github.com/%3Avsivsi/meteor-job.git"},"keywords":[],"engine":{"node":">=0.10.36"},"bugs":{"url":"https://github.com/vsivsi/meteor-job/issues"},"author":{"name":"Vaughn Iverson"},"license":"MIT/X11","gitHead":"143a2817677947ef63b4eddad7b3c51efb97102c","homepage":"https://github.com/%3Avsivsi/meteor-job#readme","_id":"meteor-job@1.1.1","_shasum":"d27a0494c780f1d2013cb050d631e04a45e3e431","_from":".","_npmVersion":"2.8.3","_nodeVersion":"0.12.2","_npmUser":{"name":"vsivsi","email":"vsivsi@yahoo.com"},"maintainers":[{"name":"vsivsi","email":"vsivsi@yahoo.com"}],"dist":{"shasum":"d27a0494c780f1d2013cb050d631e04a45e3e431","tarball":"https://registry.npmjs.org/meteor-job/-/meteor-job-1.1.1.tgz","integrity":"sha512-sxahMVZ4h1UhcBfSRAv3FX27mbAvZteqJ6Eqnhox99SVVNI5tP2xAExU0pM6cxNr65ADc/BaGAQvi5abdKpnOg==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIGUo2/b+kYbzyRD7OYKEgbuarvp/gC0nKKofihtooFkIAiAZgp9xQbQXtQz0+VhpOBnLwI+TVndOgd6Wm76no+/tkA=="}]}},"1.2.0":{"name":"meteor-job","version":"1.2.0","description":"Class for Meteor jobCollection for use both within meteor.js and with pure node.js workers","main":"lib/job_class.js","dependencies":{},"devDependencies":{"coffee-script":"1.9.3","mocha":"2.2.5","rewire":"2.3.4","sinon":"1.15.3","chai":"3.0.0","fibers":"1.0.5"},"scripts":{"prepublish":"coffee --compile --output lib/ src/","test":"make test"},"repository":{"type":"git","url":"git+https://github.com/%3Avsivsi/meteor-job.git"},"keywords":[],"engine":{"node":">=0.10.36"},"bugs":{"url":"https://github.com/vsivsi/meteor-job/issues"},"author":{"name":"Vaughn Iverson"},"license":"MIT","gitHead":"321d1d3c7e48a9652b9a833b8208ff54ce72847d","homepage":"https://github.com/%3Avsivsi/meteor-job#readme","_id":"meteor-job@1.2.0","_shasum":"6d890fb77005fcb051456b0a5ffcdac2e47720dc","_from":".","_npmVersion":"2.11.1","_nodeVersion":"0.12.4","_npmUser":{"name":"vsivsi","email":"vsivsi@yahoo.com"},"maintainers":[{"name":"vsivsi","email":"vsivsi@yahoo.com"}],"dist":{"shasum":"6d890fb77005fcb051456b0a5ffcdac2e47720dc","tarball":"https://registry.npmjs.org/meteor-job/-/meteor-job-1.2.0.tgz","integrity":"sha512-hTCGQC69ALlVOVg7S9fJItGGLRnup3WiFcXlQfLGRPEuKyPONRZ1AAnx1tLsqyAHrNP5rpBi9DSjqSOblzaxtg==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIGs94EhlGONOGQpnZBzwRyEj0Pl36KBEP950bYQba8MyAiEA0HHoHLI4aoyeD0WhRrfrFXYMXPv9By9Bq+nSE6xpa7Y="}]}},"1.3.0":{"name":"meteor-job","version":"1.3.0","description":"Class for Meteor jobCollection for use both within meteor.js and with pure node.js workers","main":"lib/job_class.js","dependencies":{},"devDependencies":{"coffee-script":"^1.9.3","mocha":"^2.2.5","rewire":"^2.3.4","sinon":"^1.15.4","chai":"^3.2.0","fibers":"^1.0.6"},"scripts":{"prepublish":"coffee --compile --output lib/ src/","test":"make test"},"repository":{"type":"git","url":"git+https://github.com/vsivsi/meteor-job.git"},"keywords":[],"engine":{"node":">=0.10.36"},"bugs":{"url":"https://github.com/vsivsi/meteor-job/issues"},"author":{"name":"Vaughn Iverson"},"license":"MIT","gitHead":"dd6f246758aa1f36e97ed3d6419028788171d727","homepage":"https://github.com/vsivsi/meteor-job#readme","_id":"meteor-job@1.3.0","_shasum":"db860dcdad3f76922b3f91eab7ae05a5953e73b1","_from":".","_npmVersion":"2.13.0","_nodeVersion":"0.12.7","_npmUser":{"name":"vsivsi","email":"vsivsi@yahoo.com"},"maintainers":[{"name":"vsivsi","email":"vsivsi@yahoo.com"}],"dist":{"shasum":"db860dcdad3f76922b3f91eab7ae05a5953e73b1","tarball":"https://registry.npmjs.org/meteor-job/-/meteor-job-1.3.0.tgz","integrity":"sha512-I30JDEaHBXT4a1A8TfzUFaM53fbHkTR6PYnx60ZFsEsQS8fgXoA9kZSRjciuOgPp9GastKtIGFv2FnLPihXDcQ==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIEENhF6kO/DQ+31O+MPpbEDg9ATjEIDjhO2fM4Bd8G+bAiEA53Gc5HlSeJB+4j7avAQ1Kh40xuFoTinILlnqCmZfQJI="}]}},"1.3.1":{"name":"meteor-job","version":"1.3.1","description":"Class for Meteor jobCollection for use both within meteor.js and with pure node.js workers","main":"lib/job_class.js","dependencies":{},"devDependencies":{"coffee-script":"^1.9.3","mocha":"^2.2.5","rewire":"^2.3.4","sinon":"^1.15.4","chai":"^3.2.0","fibers":"^1.0.6"},"scripts":{"prepublish":"coffee --compile --output lib/ src/","test":"make test"},"repository":{"type":"git","url":"git+https://github.com/vsivsi/meteor-job.git"},"keywords":[],"engine":{"node":">=0.10.36"},"bugs":{"url":"https://github.com/vsivsi/meteor-job/issues"},"author":{"name":"Vaughn Iverson"},"license":"MIT","gitHead":"f6f856f9b52c565c41ebe2bf35b28a4eb6efb5db","homepage":"https://github.com/vsivsi/meteor-job#readme","_id":"meteor-job@1.3.1","_shasum":"926464be501902bbe519857eeee7218eabd5df28","_from":".","_npmVersion":"2.13.0","_nodeVersion":"0.12.7","_npmUser":{"name":"vsivsi","email":"vsivsi@yahoo.com"},"maintainers":[{"name":"vsivsi","email":"vsivsi@yahoo.com"}],"dist":{"shasum":"926464be501902bbe519857eeee7218eabd5df28","tarball":"https://registry.npmjs.org/meteor-job/-/meteor-job-1.3.1.tgz","integrity":"sha512-vRJUfdubNHaR8+w3zTm80VnJPRtT80ZqHHpDzIw3eLBhdgRR4G1ljL9T6Ia7nDIhKhJPT1i2dxDvTEQNYPy9mA==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCcPtjPJ5Th21VDGxgw8j20dxWNnExU5us5nZl4PzGd5QIgXzd99ih80u8RidTNLlIzRITB74QuvHX9lZvYo2+RkaU="}]}},"1.3.2":{"name":"meteor-job","version":"1.3.2","description":"Class for Meteor jobCollection for use both within meteor.js and with pure node.js workers","main":"lib/job_class.js","dependencies":{},"devDependencies":{"coffee-script":"^1.10.0","mocha":"^2.4.5","rewire":"^2.5.1","sinon":"^1.17.3","chai":"^3.5.0","fibers":"^1.0.8"},"scripts":{"prepublish":"coffee --compile --output lib/ src/","test":"make test"},"repository":{"type":"git","url":"git+https://github.com/vsivsi/meteor-job.git"},"keywords":[],"engine":{"node":">=0.10.40"},"bugs":{"url":"https://github.com/vsivsi/meteor-job/issues"},"author":{"name":"Vaughn Iverson"},"license":"MIT","gitHead":"576392e9745a738940919574a10be053cc72f724","homepage":"https://github.com/vsivsi/meteor-job#readme","_id":"meteor-job@1.3.2","_shasum":"95106f83229c6671e5e001876d9282fee1302cae","_from":".","_npmVersion":"2.14.15","_nodeVersion":"4.2.6","_npmUser":{"name":"vsivsi","email":"vsivsi@yahoo.com"},"maintainers":[{"name":"vsivsi","email":"vsivsi@yahoo.com"}],"dist":{"shasum":"95106f83229c6671e5e001876d9282fee1302cae","tarball":"https://registry.npmjs.org/meteor-job/-/meteor-job-1.3.2.tgz","integrity":"sha512-FyBSpKozu1fSZDILhfHnbj/CXgtxiarO3kkxkmRzc7YtZZ3Ec+JFLt02jEbxYHlR2Tl2iGqSHn7g2M4/XRGxYA==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIGMk5HA4GsZrtNT4ZuVD5E3dT9zh1SExDyuqDlVR2HrVAiEA4wjaicpsodK8kx+MvfbElA8Rpm8S4APoHh23cvlrHxQ="}]}},"1.3.3":{"name":"meteor-job","version":"1.3.3","description":"Class for Meteor jobCollection for use both within meteor.js and with pure node.js workers","main":"lib/job_class.js","dependencies":{},"devDependencies":{"coffee-script":"^1.10.0","mocha":"^2.4.5","rewire":"^2.5.1","sinon":"^1.17.3","chai":"^3.5.0","fibers":"^1.0.10"},"scripts":{"prepublish":"coffee --compile --output lib/ src/","test":"make test"},"repository":{"type":"git","url":"git+https://github.com/vsivsi/meteor-job.git"},"keywords":[],"engine":{"node":">=0.10.40"},"bugs":{"url":"https://github.com/vsivsi/meteor-job/issues"},"author":{"name":"Vaughn Iverson"},"license":"MIT","gitHead":"234245b066d86da47cc620606633577c5f8113ed","homepage":"https://github.com/vsivsi/meteor-job#readme","_id":"meteor-job@1.3.3","_shasum":"c5c0bae98cb25907ff44efd99f53f1fa10557641","_from":".","_npmVersion":"2.15.2","_nodeVersion":"4.4.3","_npmUser":{"name":"vsivsi","email":"vsivsi@yahoo.com"},"maintainers":[{"name":"vsivsi","email":"vsivsi@yahoo.com"}],"dist":{"shasum":"c5c0bae98cb25907ff44efd99f53f1fa10557641","tarball":"https://registry.npmjs.org/meteor-job/-/meteor-job-1.3.3.tgz","integrity":"sha512-rYDZLBMDRdQ4PMR7pZZyP3c/TNaKqjMbCsrpu/vNfD8m0LAGgtpEKfgu07bEPVjIfC+INwmZJQHDcxfYkXXhZQ==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIG6Ni/wqaQRv5O1JKSAFJ70fONddwOWPeXjmr9WSBMSUAiBCXHDpdRY6HHi2jdcmpe+b3FUJRQD0RqE+j4vtk1BFIg=="}]},"_npmOperationalInternal":{"host":"packages-16-east.internal.npmjs.com","tmp":"tmp/meteor-job-1.3.3.tgz_1460574143113_0.09170502750203013"}},"1.4.0":{"name":"meteor-job","version":"1.4.0","description":"Class for Meteor jobCollection for use both within meteor.js and with pure node.js workers","main":"lib/job_class.js","dependencies":{},"devDependencies":{"coffee-script":"^1.10.0","mocha":"^2.4.5","rewire":"^2.5.1","sinon":"^1.17.3","chai":"^3.5.0","fibers":"^1.0.10"},"scripts":{"prepublish":"coffee --compile --output lib/ src/","test":"make test"},"repository":{"type":"git","url":"git+https://github.com/vsivsi/meteor-job.git"},"keywords":[],"engine":{"node":">=0.10.40"},"bugs":{"url":"https://github.com/vsivsi/meteor-job/issues"},"author":{"name":"Vaughn Iverson"},"license":"MIT","gitHead":"b7b87d0d81f38f4eac5d67f0e8280277adc954a2","homepage":"https://github.com/vsivsi/meteor-job#readme","_id":"meteor-job@1.4.0","_shasum":"227a0869e8a472b75ba68a9414a265a0283c8249","_from":".","_npmVersion":"2.15.3","_nodeVersion":"4.4.3","_npmUser":{"name":"vsivsi","email":"vsivsi@yahoo.com"},"maintainers":[{"name":"vsivsi","email":"vsivsi@yahoo.com"}],"dist":{"shasum":"227a0869e8a472b75ba68a9414a265a0283c8249","tarball":"https://registry.npmjs.org/meteor-job/-/meteor-job-1.4.0.tgz","integrity":"sha512-02lJ69Vd6odtEaSRde5akDPsP5Pfrs4rzgA3G1ZDe7zQUAj70h01xnr+Yrd/f0i5B9OLXlOIFr+AjjmHUy12BA==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIQC7Dg6MwaizF0afl5AmPygcm2dGeNWu8d21ZWdVOMOjXQIfZhih9KY6biJHEM78mb5frHirvZ2mPAMWgAWIgHkb8g=="}]},"_npmOperationalInternal":{"host":"packages-12-west.internal.npmjs.com","tmp":"tmp/meteor-job-1.4.0.tgz_1464221963100_0.7686153645627201"}},"1.5.0":{"name":"meteor-job","version":"1.5.0","description":"Class for Meteor jobCollection for use both within meteor.js and with pure node.js workers","main":"lib/job_class.js","dependencies":{},"devDependencies":{"coffee-script":"^1.12.5","mocha":"^3.2.0","rewire":"^2.5.2","sinon":"^1.17.7","chai":"^3.5.0","fibers":"^1.0.15"},"scripts":{"prepare":"coffee --compile --output lib/ src/","test":"make test"},"repository":{"type":"git","url":"git+https://github.com/vsivsi/meteor-job.git"},"keywords":[],"engine":{"node":">=0.10.40"},"bugs":{"url":"https://github.com/vsivsi/meteor-job/issues"},"author":{"name":"Vaughn Iverson"},"license":"MIT","gitHead":"55ca8f6012b26545bad6c9482948a038833a9806","homepage":"https://github.com/vsivsi/meteor-job#readme","_id":"meteor-job@1.5.0","_shasum":"b1ae336411b6d0d2ed25f2979144657f295352a3","_from":".","_npmVersion":"4.2.0","_nodeVersion":"7.9.0","_npmUser":{"name":"vsivsi","email":"vsivsi@yahoo.com"},"maintainers":[{"name":"vsivsi","email":"vsivsi@yahoo.com"}],"dist":{"shasum":"b1ae336411b6d0d2ed25f2979144657f295352a3","tarball":"https://registry.npmjs.org/meteor-job/-/meteor-job-1.5.0.tgz","integrity":"sha512-cLcTxY/a/68MXJLYA7Rp7eQqAUCD90cwRqbQZzyKBw/Gy8TpDdZgnM07X5E+bqidq3avrT8zvJfUbDZlFC6mTg==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDcGQrZHRqNoI+v3kDFe1yqLIeHuZVm6cFZu+ztLQoQagIhAIJ8oqH4sAdyB7EYjneU0pFGaoWC6pC4lTMUllX0N+BA"}]},"_npmOperationalInternal":{"host":"packages-12-west.internal.npmjs.com","tmp":"tmp/meteor-job-1.5.0.tgz_1492904262165_0.37629267130978405"}},"1.5.1":{"name":"meteor-job","version":"1.5.1","description":"Class for Meteor jobCollection for use both within meteor.js and with pure node.js workers","main":"lib/job_class.js","dependencies":{},"devDependencies":{"coffee-script":"^1.12.5","mocha":"^3.2.0","rewire":"^2.5.2","sinon":"^1.17.7","chai":"^3.5.0","fibers":"^1.0.15"},"scripts":{"prepare":"coffee --compile --output lib/ src/","test":"make test"},"repository":{"type":"git","url":"git+https://github.com/vsivsi/meteor-job.git"},"keywords":[],"engine":{"node":">=0.10.40"},"bugs":{"url":"https://github.com/vsivsi/meteor-job/issues"},"author":{"name":"Vaughn Iverson"},"license":"MIT","gitHead":"1b3638fb4b7f63846d2ee08ec3f06d8df2577dd6","homepage":"https://github.com/vsivsi/meteor-job#readme","_id":"meteor-job@1.5.1","_shasum":"5b1960abe9011092653ea1fb0222014de5de773d","_from":".","_npmVersion":"4.2.0","_nodeVersion":"7.9.0","_npmUser":{"name":"vsivsi","email":"vsivsi@yahoo.com"},"maintainers":[{"name":"vsivsi","email":"vsivsi@yahoo.com"}],"dist":{"shasum":"5b1960abe9011092653ea1fb0222014de5de773d","tarball":"https://registry.npmjs.org/meteor-job/-/meteor-job-1.5.1.tgz","integrity":"sha512-Xe4m2PmLW63OLI8ioQiUiJQlt7ZWnQLuBWqB3ghjY3zi9kG9n7EOBDkqxje4+wVL8sx7MgEzmnKrShVV5t+p7Q==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIH/NuZIGKzzcCtT1NCO3Cytmd8rTX3EcJ6pc+NNecK8OAiA2Q34ooELcH+SO3hZNRHyyQ6w8+CxiqaP4qCgdTH24ag=="}]},"_npmOperationalInternal":{"host":"packages-12-west.internal.npmjs.com","tmp":"tmp/meteor-job-1.5.1.tgz_1493058874680_0.3801710191182792"}},"1.5.2":{"name":"meteor-job","version":"1.5.2","description":"Class for Meteor jobCollection for use both within meteor.js and with pure node.js workers","main":"lib/job_class.js","dependencies":{},"devDependencies":{"coffee-script":"^1.12.6","mocha":"^3.4.2","rewire":"^2.5.2","sinon":"^2.3.5","chai":"^4.0.2","fibers":"^2.0.0"},"scripts":{"prepare":"coffee --compile --output lib/ src/","test":"make test"},"repository":{"type":"git","url":"git+https://github.com/vsivsi/meteor-job.git"},"keywords":[],"engine":{"node":">=0.10.40"},"bugs":{"url":"https://github.com/vsivsi/meteor-job/issues"},"author":{"name":"Vaughn Iverson"},"license":"MIT","gitHead":"b0dda057136d9b942b099958f3f474d089dc4af8","homepage":"https://github.com/vsivsi/meteor-job#readme","_id":"meteor-job@1.5.2","_npmVersion":"5.0.3","_nodeVersion":"8.1.3","_npmUser":{"name":"vsivsi","email":"vsivsi@yahoo.com"},"maintainers":[{"name":"vsivsi","email":"vsivsi@yahoo.com"}],"dist":{"integrity":"sha512-BOLmB0bQ4XPCB5IOvd5pFiXf5pJCQaCTwFWIozcTPkaUlk95aj8q4Dtjg3tIVFKNw6zcGCOkGCbXQAtVT6omYg==","shasum":"8c2eff12cccdd021f832dd618301ae13d5c6084c","tarball":"https://registry.npmjs.org/meteor-job/-/meteor-job-1.5.2.tgz","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIFUJsMTRSCNE9nmlKrD+7zrzOWz+ywcP8Bwz/NNLHz/VAiEA0zZMVHAPUxAcDhofPSEnUdoDzMBtd6NdKuMQEicW97A="}]},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/meteor-job-1.5.2.tgz_1499453954706_0.3081567785702646"}}},"readme":"meteor-job\n======================================\n\n[![Build Status](https://travis-ci.org/vsivsi/meteor-job.svg)](https://travis-ci.org/vsivsi/meteor-job)\n\n## Intro\n\nMeteor Job is a pure Javascript implementation of the `Job` and `JobQueue` classes that form the foundation of the [`job-collection` Atmosphere package](https://atmospherejs.com/vsivsi/job-collection) for Meteor. This package is used internally by `job-collection` on Meteor, but you should also use it for any job workers you would like to run outside of the Meteor environment as ordinary node.js programs.\n\nHere's a very basic example that ignores authentication and connection error handling:\n\n```javascript\nvar DDP = require('ddp');\nvar Job = require('meteor-job')\n\n// In this case a local Meteor instance, could be anywhere...\nvar ddp = new DDP({\n  host: \"127.0.0.1\",\n  port: 3000,\n  use_ejson: true\n});\n\n// Job uses DDP Method calls to communicate with the Meteor jobCollection.\n// Within Meteor, it can make those calls directly, but outside of Meteor\n// you need to hook it up with a working DDP connection it can use.\nJob.setDDP(ddp);\n\n// Once we have a valid connection, we're in business\nddp.connect(function (err) {\n  if (err) throw err;\n\n  // Worker function for jobs of type 'somejob'\n  var somejobWorker = function (job, cb) {\n    job.log(\"Some message\");\n    // Work on job...\n    job.progress(50, 100);  // Half done!\n    // Work some more...\n    var jobError = (Math.random() > 0.9); // Could fail!\n    if (jobError) {\n      job.fail(\"Some error happened...\");\n    } else {\n      job.done();\n    }\n    cb(null); // Don't forget!\n  };\n\n  // Get jobs of type 'somejob' available in the\n  // 'jobPile' jobCollection for somejobWorker\n  var workers = Job.processJobs('jobPile', 'somejob', somejobWorker);\n});\n```\n\n## Installation\n\n`npm install meteor-job`\n\nUnit tests may be run from within the node_modules/meteor-job directory by:\n```bash\nnpm test\n# or\nmake test\n```\n\n## Usage\n\n### Getting connected\n\nFirst you need to establish a [DDP connection](https://github.com/oortcloud/node-ddp-client) with the Meteor server hosting the jobCollection you wish to work on. You will probably need to authenticate as well unless the Meteor server is wide open for unauthenticated DDP Method calls, which it really shouldn't be. I have written another npm package [ddp-login](https://www.npmjs.org/package/ddp-login) which makes secure authentication with Meteor from node.js a snap.\n\n```javascript\nvar DDP = require('ddp');\nvar DDPlogin = require('ddp-login');\nvar Job = require('meteor-job')\n\n// See DDP package docs for options here...\nvar ddp = new DDP({\n  host: \"127.0.0.1\",\n  port: 3000,\n  use_ejson: true\n});\n\nJob.setDDP(ddp);\n\nddp.connect(function (err) {\n  if (err) throw err;\n\n  // The call below will look for an existing authentication token in\n  // process.env.METEOR_TOKEN. If it find one and it is still valid,\n  // authentication will be transparent. If not, the user will be prompted\n  // for the e-mail and password to an account on the connected Meteor\n  // server. This is the default case... ddp-login has other options\n  // documented at https://www.npmjs.org/package/ddp-login\n  DDPlogin(ddp, function (err, token) {\n    if (err) throw err;\n\n    // From here we can get to work, as long as the DDP connection is good.\n    // See the DDP package for details on DDP auto_reconnect, and handling\n    // socket events.\n\n    // Do stuff!!!\n\n  });\n}\n```\n\n### Job workers\n\nOkay, so you've got an authenticated DDP connection, and you'd like to get to work, now what?\n\n```javascript\n// 'jobQueue' is the name of the jobCollection on the server\n// 'jobType' is the name of the kind of job you'd like to work on\nJob.getWork('jobQueue', 'jobType', function (err, job) {\n  if (job) {\n     // You got a job!!!  Better work on it!\n     // At this point the jobCollection has changed the job status to\n     // 'running' so you are now responsible to eventually call either\n     // job.done() or job.fail()\n  }\n});\n```\n\nHowever, `Job.getWork()` is kind of low-level. It only makes one request for a job. What you probably really want is to get some work whenever it becomes available and you aren't too busy:\n\n```javascript\nvar workers = Job.processJobs('jobQueue', 'jobType', { concurrency: 4 },\n  function (job, cb) {\n    // This will only be called if a job is obtained from Job.getWork()\n    // Up to four of these worker functions can be outstanding at\n    // a time based on the concurrency option...\n\n    // Be sure to invoke the callback when this job has been\n    // completed or failed.\n    cb();\n\n  }\n);\n```\n\nOnce you have a job, you can work on it, log messages, indicate progress and either succeed or fail.\n\n```javascript\n// This code assumed to be running in a Job.processJobs() callback\nvar count = 0;\n\n// In this example, assume that each job may contain\n// multiple emails to be sent within the job's data.\nvar total = job.data.emailsToSend.length;\nvar retryLater = [];\n\n// Most job methods have optional callbacks if you really want to be sure...\njob.log(\"Attempting to send \" + total + \" emails\",\n  function(err, result) {\n    // err would be a DDP or server error\n    // If no error, the result will indicate what happened in jobCollection\n  }\n);\n\njob.progress(count, total);\n\nif (networkDown()) {\n  // You can add a string message to a failing job\n  job.fail(\"Network is down!!!\");\n  cb();\n} else {\n  job.data.emailsToSend.forEach(function (email) {\n    sendEmail(email.address, email.subject, email.message,\n      function(err) {\n        count++;\n        job.progress(count, total);\n        if (err) {\n          job.log(\"Sending to \" + email.address + \"failed\",\n                  {level: 'warning'});\n          retryLater.push(email);\n        }\n        if (count === total) {\n          // You can attach a result object to a successful job\n          job.done({ retry: retryLater });\n          cb();\n        }\n      }\n    );\n  });\n}\n```\n\nThe error handling mechanism in the above code seems pretty clunky... How do those failed messages get retried?\nThis approach probably will probably be easier to manage:\n\n```javascript\nvar workers = Job.processJobs('jobQueue', 'jobType', { payload: 20 },\n  function (jobs, cb) {\n    // jobs is an array of jobs, between 1 and 20 long,\n    // triggered by the option payload being > 1\n    var count = 0;\n\n    jobs.forEach(function (job) {\n      var email = job.data.email // Only one email per job\n      sendEmail(email.address, email.subject, email.message, function(err) {\n        count++;\n        if (err) {\n          job.log(\"Sending failed with error\" + err, {level: 'warning'});\n          job.fail(\"\" + err);\n        } else {\n          job.done();\n        }\n        if (count === jobs.length) {\n          cb();  // Tells the processJobs we're done\n        }\n      });\n    });\n  }\n);\n```\n\nWith the above logic, each email can succeed or fail individually, and retrying later can be directly handled by the jobCollection itself.\n\nThe jobQueue object returned by `Job.processJobs()` has methods that can be used to determine its status and control its behavior. See the jobQueue API reference for more detail.\n\n### Job creators\n\nIf you'd like to create an entirely new job and submit it to a jobCollection, here's how:\n\n```javascript\nvar job = new Job('jobQueue', 'jobType', { work: \"to\", be: \"done\" });\n\n// Set some options on the new job before submitting it. These option setting\n// methods do not take callbacks because they only affect the local job object.\n// See also: job.repeat(), job.after(), job.depends()\n\njob.priority('normal')     // These methods return job and so are chainable.\n   .retry({retries: 5,         // Retry up to five times\n           wait: 15*60*1000})  //waiting 15 minutes per attempt\n   .delay(15000);          // Don't run until 15 seconds have passed\n\n// Save the job to be added to the Meteor jobCollection via DDP\njob.save(function (err, result) {\n  if (!err && result) {\n    console.log(\"New job saved with Id: \" + result);\n  }\n});\n```\n\n**Note:** It's likely that you'll want to think carefully about whether node.js programs should be allowed to create and manage jobs. Meteor jobCollection provides an extremely flexible mechanism to allow or deny specific actions that are attempted outside of trusted server code. As such, the code above (specifically the `job.save()`) may be rejected by the Meteor server depending on how it is configured. The same caveat applies to all of the job management methods described below.\n\n### Job managers\n\nManagement of the jobCollection itself is accomplished using a mixture of Job class methods and methods on individual job objects:\n\n```javascript\n// Get a job object by Id\nJob.getJob('jobQueue', id, function (err, job) {\n  // Note, this is NOT the same a Job.getWork()\n  // This call returns a job object, but does not change\n  // the status to 'running'.\n  // So you can't work on this job.\n});\n\n// If your job object's information gets stale, you can refresh it\njob.refresh(function (err, result) {\n  // job is refreshed\n});\n\n// Make a job object from a job document (which you\n// can obtain by subscribing to a jobCollection)\njob = new Job('jobQueue', jobDoc);  // No callback!\n\n// Note that jobCollections are reactive, just like any\n// other Meteor collection. So if you are subscribed,\n// the job documents in the collection will auto-update.\n// Then you can use new Job() to turn a job doc into a\n// job object whenever necessary without another DDP round trip\n\n// Once you have a job object you can change many of its\n// settings (but only while it's paused)\njob.pause(function (err, result) {   // Prohibit the job from running\n  job.priority('low');   // Change its priority\n  job.save();            // Update its priority in the jobCollection\n                         // This also automatically triggers a job.resume()\n                         // which is how you'd otherwise get it running again.\n});\n\n// You can also cancel jobs that are running or are waiting to run.\njob.cancel();\n\n// You can restart a cancelled or failed job\njob.restart();\n\n// Or re-run a job that has already completed successfully\njob.rerun();\n\n// And you can remove a job, so long as it's cancelled,\n// completed or failed. If it's running or in any other state,\n// you'll need to cancel it before you can remove it.\njob.remove();\n\n// For bulk operations on acting on more than one job at a time,\n// there are also Class methods that take arrays of job Ids.\n// For example, cancelling a whole batch of jobs at once:\nJob.cancelJobs('jobQueue', Ids, function(err, result) {\n  // Operation complete. result is true if any jobs were\n  // cancelled (assuming no error)\n});\n```\n\n# API\n\n## class Job\n\n`Job` has a bunch of Class methods and properties to help with creating and managing Jobs and getting work for them.\n\n### `Job.setDDP(ddp, [collectionName], [Fiber])`\n\nThis class method binds `Job` to a specific instance of `DDPClient`. See [node-ddp-client](https://github.com/oortcloud/node-ddp-client) for more details. Currently it's only possible to use a single DDP connection at a time.\n\n```javascript\nvar ddp = new DDP({\n  host: \"127.0.0.1\",\n  port: 3000,\n  use_ejson: true\n});\n\nJob.setDDP(ddp);\n```\n\nIf you will be running multiple DDP connections, then you must run `setDDP()` for each collection using the `collectionName` parameter, to tell `Job` which collection corresponds to which DDP connection:\n\n```javascript\n// Provide the name for each collection as a string\n// Each named collection may only use one DDP connection\nJob.setDDP(ddp1, 'JC1');\nJob.setDDP(ddp2, 'JC2'); // Two collections on ddp2 must each register\nJob.setDDP(ddp2, 'JC3');\n// For convenience, the above two lines may also be expressed in one call:\nJob.setDDP(ddp2, ['JC2','JC3']);\n```\n\nIf you would like to use [Fibers](https://www.npmjs.com/package/fibers) to write non-Meteor node.js in a synchronous style as you can on a Meteor Server, you can enable this support by providing the `Fiber` object to this method, and then running your code within one or more active fibers:\n\n```javascript\nFiber = require('fibers');\n\nJob.setDDP(ddp, Fiber);\n\nFiber(function () {\n   j = new Job('myJob', {...});\n   try {\n      result = j.save();\n   } catch (err) {\n      // Do something\n   }\n});\n```\n\n\n### `Job.getWork(root, type, [options], [callback])`\n\nGet one or more jobs from the job Collection, setting status to `'running'`.\n\n`options`:\n\n* `maxJobs` -- Maximum number of jobs to get. Default `1`  If `maxJobs > 1` the result will be an array of job objects, otherwise it is a single job object, or `undefined` if no jobs were available.\n\n* `workTimeout` -- Tells the server to automatically fail the requested job(s) if more than `workTimeout` milliseconds elapses between updates (`job.progress()`, `job.log()`) from the worker before processing on the job is completed. This is optional, and allows the server to automatically demote and retry running jobs that may never finish because a worker went down or lost connectivity. Default: `undefined`\n\n`callback(error, result)` -- Result will be an array or single value depending on `options.maxJobs`. Optional only on Meteor Server or with Fiber support, in which case errors will throw and the result is the return value.\n\n```javascript\nif (Meteor.isServer) {\n  job = Job.getWork(  // Job will be undefined or contain a Job object\n    'jobQueue',  // name of job Collection\n    'jobType',   // type of job to request\n    {\n      maxJobs: 1 // Default, only get one job, returned as a single object\n    }\n  );\n} else {\n  Job.getWork(\n    'jobQueue',                 // root name of job Collection\n    [ 'jobType1', 'jobType2' ]  // can request multiple types in array\n    {\n      maxJobs: 5 // If maxJobs > 1, result is an array of jobs\n    },\n    function (err, jobs) {\n      // jobs contains between 0 and maxJobs jobs, depending on availability\n      // job type is available as\n      if (job[0].type === 'jobType1') {\n        // Work on jobType1...\n      } else if (job[0].type === 'jobType2') {\n        // Work on jobType2...\n      } else {\n        // Sadness\n      }\n    }\n  );\n}\n```\n\n### `Job.processJobs(root, type, [options], worker)`\n\nSee documentation below for `JobQueue`\n\n### `Job.getJob(root, id, [options], [callback])`\n\nCreates a job object by id from the server job Collection, returns `undefined` if no such job exists.\n\n`options`:\n\n* `getLog` -- If `true`, get the current log of the job. Default is `false` to save bandwidth since logs can be large.\n\n`callback(error, result)` -- `result` is a job object or `undefined`. Optional only on Meteor Server or with Fiber support, in which case errors will throw and the result is the return value.\n\n```javascript\nif (Meteor.isServer) {\n  job = Job.getJob(  // Job will be undefined or contain a Job object\n    'jobQueue',  // name of job Collection\n    id,          // job id of type EJSON.ObjectID()\n    {\n      getLog: false  // Default, don't include the log information\n    }\n  );\n  // Job may be null\n} else {\n  Job.getJob(\n    'jobQueue',    // root name of job Collection\n    id,            // job id of type EJSON.ObjectID()\n    {\n      getLog: true  // include the log information\n    },\n    function (err, job) {\n      if (job) {\n        // Here's your job\n      }\n    }\n  );\n}\n```\n\n### `Job.getJobs(root, ids, [options], [callback])`\n\nLike `Job.getJob` except it takes an array of ids and is much more efficient than calling `job.getJob()` in a loop because it gets Jobs from the server in batches.\n\n### `Job.readyJobs(root, [ids], [options], [callback])`\n\nLike `job.ready()` except it readies a list of jobs by id. It is valid to call `Job.readyJobs()` without `ids` (or with an empty array), in which case all `'waiting'` jobs that are ready to run (any waiting period has passed) and have no dependencies will have their status changed to `'ready'`. This call uses the `force` and `time` options just the same as `job.ready()`. This is  much more efficient than calling `job.ready()` in a loop because it gets Jobs from the server in batches.\n\n### `Job.pauseJobs(root, ids, [options], [callback])`\n\nLike `job.pause()` except it pauses a list of jobs by id and is much more efficient than calling `job.pause()` in a loop because it gets Jobs from the server in batches.\n\n### `Job.resumeJobs(root, ids, [options], [callback])`\n\nLike `job.resume()` except it resumes a list of jobs by id and is much more efficient than calling `job.resume()` in a loop because it gets Jobs from the server in batches.\n\n### `Job.cancelJobs(root, ids, [options], [callback])`\n\nLike `job.cancel()` except it cancels a list of jobs by id and is much more efficient than calling `job.cancel()` in a loop because it gets Jobs from the server in batches.\n\n### `Job.restartJobs(root, ids, [options], [callback])`\n\nLike `job.restart()` except it restarts a list of jobs by id and is much more efficient than calling `job.restart()` in a loop because it gets Jobs from the server in batches.\n\n### `Job.removeJobs(root, ids, [options], [callback])`\n\nLike `job.remove()` except it removes a list of jobs by id and is much more efficient than calling `job.remove()` in a loop because it gets Jobs from the server in batches.\n\n### `Job.startJobServer(root, [options], [callback])`\n\nStarts the server job Collection.\n\n`options`: No options currently\n\n`callback(error, result)` -- Result is true if successful. On Meteor Server or with Fiber support, errors will throw and the return value is the result.\n\n```javascript\nJob.startJobServer('jobQueue');  // Callback is optional\n```\n\n### `Job.shutdownJobServer(root, [options], [callback])`\n\nShuts down the server job Collection.\n\n`options`:\n\n* `timeout`: In ms, how long until the server forcibly fails all still running jobs. Default: `60*1000` (1 minute)\n\n`callback(error, result)` -- Result is true if successful.\n\n```javascript\nJob.shutdownJobServer(\n  'jobQueue',\n  {\n    timeout: 60000\n  }\n);  // Callback is optional\n```\n\n### `Job.forever`\n\nConstant value used to indicate the count of something should repeat forever.\n\n```javascript\njob = new Job('jobQueue', 'jobType', { work: \"to\", be: \"done\" })\n   .retry({ retries: Job.forever })    // Default for .retry()\n   .repeat({ repeats: Job.forever });  // Default for .repeat()\n```\n\n### `Job.foreverDate`\n\nConstant value used to indicate a future Date that will never arrive.\n\n```javascript\njob = new Job('jobQueue', 'jobType', { work: \"to\", be: \"done\" })\n   .retry({ until: Job.foreverDate })    // Default for .retry()\n   .repeat({ until: Job.foreverDate });  // Default for .repeat()\n```\n\n### `Job.jobPriorities`\n\nValid non-numeric job priorities.\n\n```javascript\nJob.jobPriorities = { low: 10, normal: 0, medium: -5,\n                      high: -10, critical: -15 };\n```\n\n### `Job.jobRetryBackoffMethods`\n\nValid retry backoff methods.\n\n```javascript\njobRetryBackoffMethods = [ 'constant', 'exponential' ];\n```\n\n### `Job.jobStatuses`\n\nPossible states for the status of a job in the job collection.\n\n```javascript\nJob.jobStatuses = [ 'waiting', 'paused', 'ready', 'running',\n                    'failed', 'cancelled', 'completed' ];\n```\n\n### `Job.jobLogLevels`\n\nValid log levels. If these look familiar, it's because they correspond to some the Bootstrap [context](http://getbootstrap.com/css/#helper-classes) and [alert](http://getbootstrap.com/components/#alerts) classes.\n\n```javascript\nJob.jobLogLevels = [ 'info', 'success', 'warning', 'danger' ];\n```\n\n### `Job.jobStatusCancellable`\n\nJob status states that can be cancelled.\n\n```javascript\nJob.jobStatusCancellable = [ 'running', 'ready', 'waiting', 'paused' ];\n```\n\n### `Job.jobStatusPausable`\n\nJob status states that can be paused.\n\n```javascript\nJob.jobStatusPausable = [ 'ready', 'waiting' ];\n```\n\n### `Job.jobStatusRemovable`\n\nJob status states that can be removed.\n\n```javascript\nJob.jobStatusRemovable = [ 'cancelled', 'completed', 'failed' ];\n```\n\n### `Job.jobStatusRestartable`\n\nJob status states that can be restarted.\n\n```javascript\nJob.jobStatusRestartable = [ 'cancelled', 'failed' ];\n```\n\n### `Job.ddpMethods`\n\nArray of the names of all DDP methods used by `Job`\n\n```javascript\nJob.ddpMethods = [\n    'startJobServer', 'stopJobServer', 'jobRemove', 'jobPause',\n    'jobResume', 'jobCancel', 'jobRestart', 'jobSave', 'jobRerun',\n    'getWork', 'getJob', 'jobLog', 'jobProgress', 'jobDone',\n    'jobFail' ];\n```\n\n### `Job.ddpPermissionLevels`\n\nArray of the predefined DDP method permission levels\n\n```javascript\nJob.ddpPermissionLevels = [ 'admin', 'manager', 'creator', 'worker' ];\n```\n\n### `Job.ddpMethodPermissions`\n\nObject mapping permission levels to DDP method names.\n\n```javascript\nJob.ddpMethodPermissions = {\n    'startJobServer': ['startJobServer', 'admin'],\n    'shutdownJobServer': ['shutdownJobServer', 'admin'],\n    'jobRemove': ['jobRemove', 'admin', 'manager'],\n    'jobPause': ['jobPause', 'admin', 'manager'],\n    'jobResume': ['jobResume', 'admin', 'manager'],\n    'jobCancel': ['jobCancel', 'admin', 'manager'],\n    'jobRestart': ['jobRestart', 'admin', 'manager'],\n    'jobSave': ['jobSave', 'admin', 'creator'],\n    'jobRerun': ['jobRerun', 'admin', 'creator'],\n    'getWork': ['getWork', 'admin', 'worker'],\n    'getJob': ['getJob', 'admin', 'worker'],\n    'jobLog': [ 'jobLog', 'admin', 'worker'],\n    'jobProgress': ['jobProgress', 'admin', 'worker'],\n    'jobDone': ['jobDone', 'admin', 'worker'],\n    'jobFail': ['jobFail', 'admin', 'worker']\n};\n```\n\n## Instances of Job\n\n### `j = new Job(root, type, data)`\n\nCreate a new `Job` object.  Data should be reasonably small, if worker requires a lot of data (e.g. video, image or sound files), they should be included by reference (e.g. with a URL pointing to the data, and another to where the result should be saved).\n\n```javascript\njob = new Job(  // new is optional\n  'jobQueue',   // job collection name\n  'jobType',    // type of the job\n  { /* ... */ } // Data for the worker, any valid EJSON object\n);\n```\n\n### `j = new Job(root, jobDoc)`\n\nMake a Job object from a job Collection document. Creates a new `Job` object. This is used in cases where a valid Job document is obtained from another source, such as a database lookup.\n\n```javascript\njob = new Job(  // new is optional\n  'jobQueue',   // job collection name\n  { /* ... */ } // any valid Job document\n);\n```\n\n### `j.depends([dependencies])`\n\nAdds jobs that this job depends upon (antecedents). This job will not run until these jobs have successfully completed. Defaults to an empty array (no dependencies). Returns `job`, so it is chainable.\nAdded jobs must have already had `.save()` run on them, so they will have the `_id` attribute that is used to form the dependency. Calling `j.depends()` with a falsy value will clear any existing dependencies for this job.\n\n```javascript\n // job1 and job2 are Job objects, and they both\n // must successfully complete before job will run\njob.depends([job1, job2]);\njob.depends();  // Clear any dependencies previously added on this job\n```\n\n### `j.priority([priority])`\n\nSets the priority of this job. Can be integer numeric or one of `Job.jobPriorities`. Defaults to `'normal'` priority, which is priority `0`. Returns `job`, so it is chainable.\n\n```javascript\njob.priority('high');  // Maps to -10\njob.priority(-10);     // Same as above\n```\n\n### `j.retry([options])`\n\nSet how failing jobs are rescheduled and retried by the job Collection. Returns `job`, so it is chainable.\n\n`options:`\n\n* `retries` -- Number of times to retry a failing job. Default: `Job.forever`\n* `until` -- Keep retrying until this `Date`, or until the number of retries is exhausted, whichever comes first. Default: `Job.foreverDate`. Note that if you specify a value for `until` on a repeating job, it will only apply to the first run of the job. Any repeated runs of the job will use the repeat `until` value for all retries.\n* `wait` -- Initial value for how long to wait between attempts, in ms. Default: `300000` (5 minutes)\n* `backoff` -- Method to use in determining how to calculate wait value for each retry:\n    * `'constant'`:  Always delay retrying by `wait` ms. Default value.\n    * `'exponential'`:  Delay by twice as long for each subsequent retry, e.g. `wait`, `2*wait`, `4*wait` ...\n\n`[options]` may also be a non-negative integer, which is interpreted as `{ retries: [options] }`\n\nNote that the above stated defaults are those when `.retry()` is explicitly called. When a new job is created, the default number of `retries` is `0`.\n\n```javascript\njob.retry({\n  retries: 5,   // Retry 5 times,\n  wait: 20000,  // waiting 20 seconds between attempts\n  backoff: 'constant'  // wait constant amount of time between each retry\n});\n```\n\n### `j.repeat([options])`\n\nSet how many times this job will be automatically re-run by the job Collection. Each time it is re-run, a new job is created in the job collection. This is equivalent to running `job.rerun()`. Only `'completed'` jobs are repeated. Failing jobs that exhaust their retries will not repeat. By default, if an infinitely repeating job is added to the job Collection, any existing repeating jobs of the same type will also continue to repeat.  See `option.cancelRepeats` for `job.save()` for more info on how to override this behavior. Returns `job`, so it is chainable.\n\n`options:`\n\n* `repeats` -- Number of times to rerun the job. Default: `Job.forever`\n* `until` -- Keep repeating until this `Date`, or until the number of repeats is exhausted, whichever comes first. Default: `Job.foreverDate`\n* `wait`  -- How long to wait between re-runs, in ms. Default: `300000` (5 minutes)\n* `schedule` -- Repeat using a valid [later.js](https://github.com/bunkat/later) schedule. The first run of this job will occur at the first valid scheduled time unless `.after()` or `.delay()` have been called, in which case it will run at the first scheduled time thereafter. Note: `schedule` and `wait` are mutually exclusive.\n\n`[options]` may also be a non-negative integer, which is interpreted as `{ repeats: [options] }`\n\nNote that the above stated defaults are those when `.repeat()` is explicitly called. When a new job is created, the default number of `repeats` is `0`.\n\n```javascript\njob.repeat({\n  repeats: 5,   // Rerun this job 5 times,\n  wait: 20000   // wait 20 seconds between each re-run.\n});\n\n// Using later.js\njob.repeat({\n  // Note that you need to install the later npm package yourself when running under pure node.js\n  schedule: later.parse.text('every 5 mins');   // Rerun this job every 5 minutes\n});\n```\n\n### `j.delay([milliseconds])`\n\nHow long to wait until this job can be run, counting from when it is initially saved to the job Collection. Returns `job`, so it is chainable.\n\n```javascript\njob.delay(0);   // Do not wait. This is the default.\n```\n\n### `j.after([time])`\n\n`time` is a date object. This sets the time after which a job may be run. It is not guaranteed to run \"at\" this time because there may be no workers available when it is reached. Returns `job`, so it is chainable.\n\n```javascript\n// Run the job anytime after right now. This is the default.\njob.after(new Date());\n```\n\n### `j.log(message, [options], [callback])`\n\nAdd an entry to this job's log. May be called before a new job is saved. `message` must be a string.\n\n`options:`\n\n* `level`: One of `Jobs.jobLogLevels`: `'info'`, `'success'`, `'warning'`, or `'danger'`.  Default is `'info'`.\n* `echo`: Echo this log entry to the console. `'danger'` and `'warning'` level messages are echoed using `console.error()` and `console.warn()` respectively. Others are echoed using `console.log()`. If echo is `true` all messages will be echoed. If `echo` is one of the `Job.jobLogLevels` levels, only messages of that level or higher will be echoed.\n\n`callback(error, result)` -- Result is true if logging was successful. When running on Meteor Server or with Fibers, for a saved object the callback may be omitted, and then errors will throw and the return value is the result. If called on an unsaved object, the result is `job` and can be chained.\n\n```javascript\njob.log(\n  \"This is a message\",\n  {\n    level: 'warning'\n    echo: true   // Default is false\n  },\n  function (err, result) {\n    if (result) {\n      // The log method worked!\n    }\n  }\n);\n\nvar verbosityLevel = 'warning';\njob.log(\"Don't echo this\", { level: 'info', echo: verbosityLevel } );\n```\n\n### `j.progress(completed, total, [options], [cb])`\n\nUpdate the progress of a running job. May be called before a new job is saved. `completed` must be a number `>= 0` and `total` must be a number `> 0` with `total >= completed`.\n\n`options:`\n\n* `echo`: Echo this progress update to the console using `console.log()`.\n\n`callback(error, result)` -- Result is true if progress update was successful. When running on Meteor Server or with Fibers, for a saved object the callback may be omitted, and then errors will throw and the return value is the result. If called on an unsaved object, the result is `job` and can be chained.\n\n```javascript\njob.progress(\n  50,\n  100,    // Half done!\n  {\n    echo: true   // Default is false\n  },\n  function (err, result) {\n    if (result) {\n      // The progress method worked!\n    }\n  }\n);\n```\n\n### `j.save([options], [callback])`\n\nSubmits this job to the job Collection. Only valid if this is a new job, or if the job is currently paused in the job Collection. If the job is already saved and paused, then most properties of the job may change (but not all, e.g. the jobType may not be changed.)\n\n`options:`\n\n* `cancelRepeats`: If true and this job is an infinitely repeating job, will cancel any existing jobs of the same job type. This is useful for background maintenance jobs that may get added on each server restart (potentially with new parameters). Default is `false`.\n\n`callback(error, result)` -- Result is the job `_id` value if save was successful. When running on Meteor Server or with Fibers, the callback may be omitted, and then errors will throw and the return value is the result.\n\n```javascript\njob.save(\n  {\n    // Cancel any jobs of the same type,\n    // if this job repeats forever.\n    // Default: false.\n    cancelRepeats: true\n  }\n);\n```\n### `j.refresh([options], [callback])`\n\nRefreshes the current job object state with the state on the remote job Collection. Note that if you subscribe to the job Collection, the job documents will stay in sync with the server automatically via Meteor reactivity.\n\n`options:`\n\n* `getLog` -- If true, also refresh the jobs log data (which may be large).  Default: `false`\n* `getFailures` -- If true, also refresh the jobs failure results (which may be large).  Default: `false`\n\n`callback(error, result)` -- Result is the Job object if refresh was successful. When running as `Meteor.isServer` or with Fibers, the callback may be omitted and the return value is the result, so in this case this method is chainable and any errors will cause a throw.\n\n```javascript\njob.refresh(function (err, result) {\n  if (result) {\n    // Refreshed\n  }\n});\n```\n\n### `j.done(result, [options], [callback])`\n\nChange the state of a running job to `'completed'`. `result` is any EJSON object.  If this job is configured to repeat, a new job will automatically be cloned to rerun in the future. Result will be saved as an object. If passed result is not an object, it will be wrapped in one.\n\n`options:`\n\n* `repeatId` -- If true, changes the return value of successful call from `true` to be the `_id` of a newly scheduled job if this is a repeating job. Default: `false`\n\n* `delayDeps` -- Integer. If defined, this sets the number of milliseconds before dependent jobs will run. It is equivalent to setting `job.delay(delayDeps)` on each dependent job, with a check to ensure that such jobs will not run sooner than they would have otherwise. Default: undefined.\n\n`callback(error, result)` -- Result is true if completion was successful. When running on Meteor Server or with Fibers, the callback may be omitted, and then errors will throw and the return value is the result.\n\n```javascript\njob.done(someResult, { repeatId: true }, function (err, newId) {\n  if (newId && newId !== true) {\n    // Next repeat job scheduled with _id = newId\n  }\n});\n\n// Pass a non-object result\njob.done(\"Done!\");\n// This will be saved as:\n// { \"value\": \"Done!\" }\n```\n\n### `j.fail(error, [options], [callback])`\n\nCause this job to fail. It's next state depends on how the job's `job.retry()` settings are configured. It will either become `'failed'` or go to `'waiting'` for the next retry. `error` is any EJSON object. Error will be saved as an object. If passed error is not an object, it will be wrapped in one. If the job becomes 'failed', all dependent jobs will be cancelled.\n\n`options:`\n\n* `fatal` -- If true, no additional retries will be attempted and this job will go to a `'failed'` state. Default: `false`\n\n`callback(error, result)` -- Result is true if failure was successful (heh). When running on Meteor Server or with Fibers, the callback may be omitted, and then errors will throw and the return value is the result.\n\n```javascript\njob.fail(\n  {\n    reason: 'This job has failed again!',\n    code: 44\n  }\n  {\n    fatal: false  // Default case\n  },\n  function (err, result) {\n    if (result) {\n      // Status updated\n    }\n  }\n});\n\n// Pass a non-object error\njob.fail(\"Error!\");\n// This will be saved as:\n// { \"value\": \"Error!\" }\n```\n\n### `j.pause([options], [callback])`\n\nChange the state of a job to `'paused'`. Only `'ready'` and `'waiting'` jobs may be paused. This specifically does nothing to affect running jobs. To stop a running job, you must use `job.cancel()`. Unsaved objects my be paused so that start out in that state when saved.\n\n`options:` -- None currently.\n\n`callback(error, result)` -- Result is true if pausing was successful. When running on Meteor Server or with Fibers, the callback may be omitted, and then errors will throw and the return value is the result.\n\n```javascript\njob.pause(function (err, result) {\n  if (result) {\n    // Status updated\n  }\n});\n```\n\n### `j.resume([options], [callback])`\n\nChange the state of a job from `'paused'` to `'waiting'`.\n\n`options:` -- None currently.\n\n`callback(error, result)` -- Result is true if resuming was successful. When running on Meteor Server or with Fibers, the callback may be omitted, and then errors will throw and the return value is the result.\n\n```javascript\njob.resume(function (err, result) {\n  if (result) {\n    // Status updated\n  }\n});\n```\n\n### `j.ready([options], [callback])`\n\nChange the state of a job to `'ready'`. Any job that is `'waiting'` may be readied. Jobs with unsatisfied dependencies will not be changed to `'ready'` unless the `force` option is used.\n\n`options:`\n\n* `time` -- A `Date` object. If the job was set to run before the specified time, it will be set to `'ready'` now. Default: the current time\n* `force` -- Force all remaining dependencies to be satisfied. Default: `false`\n\n`callback(error, result)` -- Result is true if state was changed to ready. When running on Meteor Server or with Fibers, the callback may be omitted, and then errors will throw and the return value is the result.\n\n```javascript\njob.ready(\n  {\n    time: new Date(), // Job.foreverDate would make this unconditional\n    force: false\n  },\n  function (err, result) {\n    if (result) {\n      // Status updated\n    }\n  }\n);\n```\n\n### `j.cancel([options], [callback])`\n\nChange the state of a job to `'cancelled'`. Any job that isn't `'completed'`, `'failed'` or already `'cancelled'` may be cancelled. Cancelled jobs retain any remaining retries and/or repeats if they are later restarted.\n\n`options:`\n\n* `antecedents` -- Also cancel all cancellable jobs that this job depends on.  Default: `false`\n* `dependents` -- Also cancel all cancellable jobs that depend on this job.  Default: `true`\n\n`callback(error, result)` -- Result is true if cancellation was successful. When running on Meteor Server or with Fibers, the callback may be omitted, and then errors will throw and the return value is the result.\n\n```javascript\njob.cancel(\n  {\n    antecedents: false,\n    dependents: true    // Also cancel all jobs that will never run without this one.\n  },\n  function (err, result) {\n    if (result) {\n      // Status updated\n    }\n  }\n);\n```\n\n### `j.restart([options], [callback])`\n\nChange the state of a `'failed'` or `'cancelled'` job to `'waiting'` to be retried. A restarted job will retain any repeat count state it had when it failed or was cancelled.\n\n`options:`\n\n* `retries` -- Number of additional retries to attempt before failing with `job.retry()`. These retries add to any remaining retries already on the job (such as if it was cancelled). Can be any non-negative Integer. Default: `1`.\n* `until` -- Keep retrying until this `Date`, or until the number of retries is exhausted, whichever comes first. Default: Prior value of `until`. Note that if you specify a value for `until` when restarting a repeating job, it will only apply to the first run of the job. Any repeated runs of the job will use the repeat `until` value for all retries.\n* `antecedents` -- Also restart all `'cancelled'` or `'failed'` jobs that this job depends on.  Default: `true`\n* `dependents` -- Also restart all `'cancelled'` or `'failed'` jobs that depend on this job.  Default: `false`\n\n`callback(error, result)` -- Result is true if restart was successful. When running on Meteor Server or with Fibers, the callback may be omitted, and then errors will throw and the return value is the result.\n\n```javascript\njob.restart(\n  {\n    antecedents: true,  // Also restart all jobs that must\n                        // complete before this job can run.\n    dependents: false,\n    retries: 0          // Only try one more time. This is the default.\n  },\n  function (err, result) {\n    if (result) {\n      // Status updated\n    }\n  }\n);\n```\n\n### `j.rerun([options], [callback])`\n\nClone a completed job and run it again.\n\n`options:`\n\n* `repeats` -- Number of times to repeat the job, as with `job.repeat()`.\n* `until` -- Keep repeating until this `Date`, or until the number of repeats is exhausted, whichever comes first. Default: prior value of `until`\n* `wait` -- Time to wait between reruns. Default is the existing `job.repeat({ wait: ms }) setting for the job.\n\n`callback(error, result)` -- Result is true if rerun was successful. When running on Meteor Server or with Fibers, the callback may be omitted, and then errors will throw and the return value is the result.\n\n```javascript\njob.rerun(\n  {\n    repeats: 0,         // Only repeat this once. This is the default.\n    wait: 60000         // Wait a minute between repeats.\n                        // Default is value from job being rerun.\n  },\n  function (err, result) {\n    if (result) {\n      // Status updated\n    }\n  }\n);\n```\n\n### `j.remove([options], [callback])`\n\nPermanently remove this job from the job collection. The job must be `'completed'`, `'failed'`, or `'cancelled'` to be removed.\n\n`options:` -- None currently.\n\n`callback(error, result)` -- Result is true if removal was successful. When running on Meteor Server or with Fibers, the callback may be omitted, and then errors will throw and the return value is the result.\n\n```javascript\njob.remove(function (err, result) {\n  if (result) {\n    // Job removed from server.\n  }\n});\n```\n\n### `j.type`\n\nAlways a string. Returns the type of a job. Useful for when `getWork` or `processJobs` are configured to accept multiple job types. This may not be changed after a job is created.\n\n### `j.data`\n\nAlways an object, contains the job data needed by the worker to complete a job of a given type. This may not be changed after a job is created.\n\n### `j.doc`\n\nAlways an object, contains the full job document as stored in a JobCollection. This may not be changed after a job is created.\n\n## class JobQueue\n\nJobQueue is similar in spirit to the [async.js](https://github.com/caolan/async) [queue](https://github.com/caolan/async#queue) and [cargo]([queue](https://github.com/caolan/async#cargo)) except that it gets its work from the Meteor jobCollection via calls to `Job.getWork()`\n\n### `q = Job.processJobs(root, type, [options], worker)`\n\nCreate a `JobQueue` to automatically get work from the job Collection, and asynchronously call the worker function.\n\nNote, if you are running in a non-Meteor node.js environment with Fiber support, the worker function will not automatically be run within a fiber. You are responsible for setting this up yourself.\n\n`options:`\n\n* `concurrency` -- Maximum number of async calls to `worker` that can be outstanding at a time. Default: `1`\n* `payload` -- Maximum number of job objects to provide to each worker, Default: `1` If `payload > 1` the first paramter to `worker` will be an array of job objects rather than a single job object.\n* `pollInterval` -- How often to ask the remote job Collection for more work, in ms. Any falsy value for this parameter will completely disable polling (see `q.trigger()` for an alternative way to drive the queue), and any truthy, non-numeric value will yield the default poll interval. Default: `5000` (5 seconds)\n* `prefetch` -- How many extra jobs to request beyond the capacity of all workers (`concurrency * payload`) to compensate for latency getting more work.\n* `workTimeout` -- When requesting work, tells the server to automatically fail the requested job(s) if more than `workTimeout` milliseconds elapses between updates (`job.progress()`, `job.log()`) from the worker, before processing on the job is completed. This is optional, and allows the server to automatically demote and retry running jobs that may never finish because a worker went down or lost connectivity. Default: `undefined`\n* `callbackStrict` -- When `true` throws an error if a worker function calls its callback more than once. Even when false, a message will be written to stderr when multiple callbacks are invoked. Default: `false`\n* `errorCallback` -- An optional function (`ec(err)`) that is called anytime an error occurs within the running JobQueue object. If not provided a default function is provided that writes errors to `console.error`.\n\n`worker(result, callback)`\n\n* `result` -- either a single job object or an array of job objects depending on `options.payload`.\n* `callback` -- must be eventually called exactly once when `job.done()` or `job.fail()` has been called on all jobs in result.\n\n```javascript\nqueue = Job.processJobs(\n  'jobQueue',   // name of job Collection\n  'jobType',    // type of job to request, can also be an array of job types\n  {\n    concurrency: 4,\n    payload: 1,\n    pollInterval: 5000,\n    prefetch: 1\n  },\n  function (job, callback) {\n    // Only called when there is a valid job\n    job.done();\n    callback();\n  }\n);\n\n// The job queue has methods... See JobQueue documentation for details.\nqueue.pause();\nqueue.resume();\nqueue.shutdown();\n```\n\n### `q.pause()`\n\nPause the JobQueue. This means that no more work will be requested from the job collection, and no new workers will be called with jobs that already exist in this local queue. Jobs that are already running locally will run to completion. Note that a JobQueue may be created in the paused state by running `q.pause()` immediately on the returned new jobQueue.\n\n```javascript\nq.pause()\n```\n\n### `q.resume()`\n\nUndoes a `q.pause()`, returning the queue to the normal running state.\n\n```javascript\nq.resume()\n```\n\n### `q.trigger()`\n\nThis method manually causes the same action that expiration of the `pollInterval` does internally within JobQueue. This is useful for creating responsive JobQueues that are triggered by a Meteor [observe](http://docs.meteor.com/#/full/observe) or DDP [observe](https://www.npmjs.com/package/ddp) based mechanisms, rather than time based polling.\n\n```javascript\n// Simple observe based queue\nvar q = jc.processJobs(\n  // Type of job to request\n  // Can also be an array of job types\n  'jobType',\n  {\n    pollInterval: 1000000000, // Don't poll\n  },\n  function (job, callback) {\n    // Only called when there is a valid job\n    job.done();\n    callback();\n  }\n);\n\nvar observer = ddp.observe(\"myJobs\");\nobserver.added = function () { q.trigger(); };\n```\n\n### `q.shutdown([options], [callback])`\n\n`options:`\n\n* `level` -- May be 'hard' or 'soft'. Any other value will lead to a \"normal\" shutdown.\n* `quiet` -- true or false. False by default, which leads to a \"Shutting down...\" message on stderr.\n\n`callback()` -- Invoked once the requested shutdown conditions have been achieved.\n\nShutdown levels:\n\n* `'soft'` -- Allow all local jobs in the queue to start and run to a finish, but do not request any more work. Normal program exit should be possible.\n* `'normal'` -- Allow all running jobs to finish, but do not request any more work and fail any jobs that are in the local queue but haven't started to run. Normal program exit should be possible.\n* `'hard'` -- Fail all local jobs, running or not. Return as soon as the server has been updated. Note: after a hard shutdown, there may still be outstanding work in the event loop. To exit immediately may require `process.exit()` depending on how often asynchronous workers invoke `'job.progress()'` and whether they die when it fails.\n\n```javascript\nq.shutdown({ quiet: true, level: 'soft' }, function () {\n  // shutdown complete\n});\n```\n\n### `q.length()`\n\nNumber of tasks ready to run.\n\n### `q.full()`\n\n`true` if all of the concurrent workers are currently running.\n\n### `q.running()`\n\nNumber of concurrent workers currently running.\n\n### `q.idle()`\n\n`true` if no work is currently running.\n","maintainers":[{"name":"vsivsi","email":"vsivsi@yahoo.com"}],"time":{"modified":"2022-06-19T18:24:45.390Z","created":"2014-05-15T02:28:00.553Z","0.0.0":"2014-05-15T02:28:00.553Z","0.0.1":"2014-05-31T18:30:56.022Z","0.0.2":"2014-06-05T01:04:53.764Z","0.0.3":"2014-06-05T06:01:56.499Z","0.0.4":"2014-06-10T19:41:58.533Z","0.0.5":"2014-06-11T23:14:56.754Z","0.0.6":"2014-06-15T08:56:08.334Z","0.0.7":"2014-06-16T06:15:04.444Z","0.0.8":"2014-06-16T06:18:43.420Z","0.0.9":"2014-06-16T07:04:45.499Z","0.0.10":"2014-06-17T18:44:00.064Z","0.0.11":"2014-06-28T20:15:35.313Z","0.0.12":"2014-07-24T21:34:13.818Z","0.0.13":"2014-07-24T21:44:52.405Z","0.0.14":"2014-07-24T21:59:55.931Z","0.0.15":"2014-11-14T00:37:51.290Z","1.0.0":"2015-03-24T00:31:16.793Z","1.1.0":"2015-04-07T06:55:30.282Z","1.1.1":"2015-04-24T08:23:44.050Z","1.2.0":"2015-06-15T16:38:41.818Z","1.3.0":"2015-07-22T20:08:31.963Z","1.3.1":"2015-07-27T18:28:21.266Z","1.3.2":"2016-01-29T19:53:19.996Z","1.3.3":"2016-04-13T19:02:26.574Z","1.4.0":"2016-05-26T00:19:23.559Z","1.5.0":"2017-04-22T23:37:42.436Z","1.5.1":"2017-04-24T18:34:34.985Z","1.5.2":"2017-07-07T18:59:15.949Z"},"homepage":"https://github.com/vsivsi/meteor-job#readme","keywords":[],"repository":{"type":"git","url":"git+https://github.com/vsivsi/meteor-job.git"},"author":{"name":"Vaughn Iverson"},"bugs":{"url":"https://github.com/vsivsi/meteor-job/issues"},"license":"MIT","readmeFilename":"README.md","users":{"matthewforr":true,"rhyslbw":true,"nachbar90":true}}