{"_id":"di-async","_rev":"37-dd5b0e393cbc4c8f74d8fd11ca074e02","name":"di-async","dist-tags":{"latest":"1.0.22"},"versions":{"1.0.12":{"name":"di-async","version":"1.0.12","description":"Async lazy loading DI-Container","main":"di-async.js","repository":{"type":"git","url":"git+https://github.com/Kobdik/di-app.git"},"scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"keywords":["Dependency Injection","DI Container","Async DI Container","Lazy Loading","Nodejs"],"author":{"name":"Kobdikov Tulegen","email":"ndi89@mail.ru"},"license":"MIT","dependencies":{},"bugs":{"url":"https://github.com/Kobdik/di-app/issues"},"homepage":"https://github.com/Kobdik/di-app#readme","_id":"di-async@1.0.12","_npmVersion":"6.4.1","_nodeVersion":"10.15.3","_npmUser":{"name":"tulegen","email":"ndi89@mail.ru"},"dist":{"integrity":"sha512-ykyogabRdWnxPq4GYKJAKhcKefP9d96v7JrpXMOqcOHYxm/AFXQQKdB555V6sn9pLJFqhRrM2weERYklxIB/PQ==","shasum":"b31482e1162035b9dd7e485748128a08759b9567","tarball":"https://registry.npmjs.org/di-async/-/di-async-1.0.12.tgz","fileCount":4,"unpackedSize":17813,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJf4F9RCRA9TVsSAnZWagAA8QQP/RvFPPrrE4uJCt8RStWl\nNZMltZVDxDMxsz7QWFG6pMPq7VPKo7o1rxz0zThzNObzOl75fJgYR1srOyej\nx8Mub3m2LdX360ZLKGleHZgoQnCPgQ/tSZQqjQLBpeSI/us1gil3UZ078g09\nft3vESjmG5De18yW/EZy5iAcWRtGiEHbCVG3Oq3JuuiRUHMRCjlDUMqixcVS\n4uh1Af8YJ+hixZffoKrIUbdXgMKJVnhWLJdo7jjRv78C9EmCtKhFL2CNOyWR\njGazXaJQv4AqllqiVnm671F+80QA0FeAePVPI8FYVI9g9OH/a8p/Curu8yXx\n8q0CPu8fCTWEXv3zAGPkYo0wr1dAcgEoBqldfZneIfPdBhWHtZD9Rkt1/wJ3\n9F+PvgS7YxpMEGVWMiiw3cF0T+P8Q8vAQWYu5EFjIUE0PyBihkg3v1ZpkkFC\nwBoDra2NdqVyRA034Ez00lboOPnoIY2XRWlMxrctt87IlDIbsiFCphpn/0QP\n4qzRyihOT+dyDCIPsp/8NVrU27YsB5cX3zUFMAKyNOsylLqTrNX1r8qPLL4q\n4zGk9nmTqk3hx4UMnEzcr9oGhvqhWPKK2pJw3Gbe6tEg6g4wAqiatAbsekrR\nuOISscFnfhW6ijkiSb/Phmr90D1o+kfj4irgcGZH4j2bgbCQE5/PjA4M0mWv\nguig\r\n=TVeD\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQD/mD9AU0A76HxXBuo1Zf3spbLRH9x0IC5XqQTikWhcHgIhAI4+4GCAwZZCVBWyTHuWlWEcE83OAow6C0rxbYSeLz6B"}]},"directories":{},"maintainers":[{"name":"tulegen","email":"ndi89@mail.ru"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/di-async_1.0.12_1608539985455_0.6606352256333343"},"_hasShrinkwrap":false},"1.0.15":{"name":"di-async","version":"1.0.15","description":"Asynchronous lazy loading dependency injection container for JavaScript","main":"di-async.js","repository":{"type":"git","url":"git+https://github.com/Kobdik/di-app.git"},"scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"keywords":["dependency injection","di","container","async","lazy loading","Nodejs"],"author":{"name":"Kobdikov Tulegen","email":"ndi89@mail.ru"},"license":"MIT","dependencies":{},"bugs":{"url":"https://github.com/Kobdik/di-app/issues"},"homepage":"https://github.com/Kobdik/di-app#readme","_id":"di-async@1.0.15","_npmVersion":"6.4.1","_nodeVersion":"10.15.3","_npmUser":{"name":"tulegen","email":"ndi89@mail.ru"},"dist":{"integrity":"sha512-UNSj5EPUp8gtB9MPd6iJxGrM1GuIkOImDvmzJ2BNbsZqEea3ZX/hkFLjpJt8ZBXOoEMw0knIiXkG17QHPtgwAQ==","shasum":"a27f78c0b162b5ee38877152a8a7962b50683c1a","tarball":"https://registry.npmjs.org/di-async/-/di-async-1.0.15.tgz","fileCount":4,"unpackedSize":19790,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJf5RTvCRA9TVsSAnZWagAAv+sP/jG7ReoWYTZVO9AUBgtg\nIdei6oZ9C5vy+o14/+LUqX+1BnoK+1EwA23qvnmj/IHL4EZEc5EdMD7dPnZB\n9ks3nw8VC4L1xmr8noYvj6P5wXTEoM9TQfEoYRy1mtwou0iDTfNyuUMaeQCd\nEJ547rK9dn8xZHpDDRBJ8cEAOqLofRijcEN+shRrw1FrTmNdMAPSPhbtIjsD\nMJ9C7VSKPf3RRIL+NwI34ioSAyfjwY1yl4kbvocQCmVLHFRKRaVe59h5fjSO\nVzJs37+7CRnUflCakJ6awB+QXiSd1+bXHdpmYJ6BJPVYvsiPELfSDz4BLhDR\naTiulHXUM0BI2IlIemxvRYuN/Mw60vyjQGgXaGTHkfobUbbyuBZmRBTsG16u\nYJamPU9AiH73t2lgorkgXWnO6VzwcEaUQD2jALENnwE1/FwI233fO3dY8AQS\ncYbFA7gr/viizRakWV1EAleHNji8Z9STyaybnFVQzrKFYoCrnB+PdTPZHpnj\neDwX1WVBWcUaWPnvaMp0ZmlDMkz9qxFS0zaNpjnD8nXhQoB5tCjNgryhb2v0\n47O4Hjb8z1T4ehO0NwPIUXgd8JYkv4cuaSUNc+k1cL7C1ZXdWshT0FJSjYQq\nGnKtLVAn7KT9NUSBeZ7iHWXqBf4FgNqU5yxGWjY8YtDgGygJodl8seMBD5EU\njtyb\r\n=XmPk\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDm8ioqLkwh4KlBRU81n5pZf1xLokwGOzHpgTgW1G5GKgIhAJDU48veTEPYdJVJpWgIXe++a8FPs5t/FV2ltdzasc5/"}]},"directories":{},"maintainers":[{"name":"tulegen","email":"ndi89@mail.ru"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/di-async_1.0.15_1608848623231_0.8967269016150772"},"_hasShrinkwrap":false},"1.0.16":{"name":"di-async","version":"1.0.16","description":"Asynchronous lazy loading dependency injection container for JavaScript","main":"di-async.js","repository":{"type":"git","url":"git+https://github.com/Kobdik/di-app.git"},"scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"keywords":["dependency injection","di","container","async","lazy loading","Nodejs"],"author":{"name":"Kobdikov Tulegen","email":"ndi89@mail.ru"},"license":"MIT","dependencies":{},"bugs":{"url":"https://github.com/Kobdik/di-app/issues"},"homepage":"https://github.com/Kobdik/di-app#readme","_id":"di-async@1.0.16","_npmVersion":"6.4.1","_nodeVersion":"10.15.3","_npmUser":{"name":"tulegen","email":"ndi89@mail.ru"},"dist":{"integrity":"sha512-LrWzqhjiA/iBt4fLX3w7jsB9FopkALgvGsiQs3VVwFEODPgk4EgtWNjfwL8n6LXaSrnVIBFUJg5U/wFFkugC+w==","shasum":"da5dc6277d93bb3f31cab36e3376dbd3e648b017","tarball":"https://registry.npmjs.org/di-async/-/di-async-1.0.16.tgz","fileCount":4,"unpackedSize":19796,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJf5RiYCRA9TVsSAnZWagAAgbMP/iMHTtpsJuj+T1JWkGIQ\nMFTx0xfQ6v8676w8lCWFjWFm3Vgk/lJSleQgk28l/ygEx/dyjftL9hQeb5et\nid7BOtEcydqaAXuJvc5pjID07F6SnZeWStogUV5bCQ72VVjY//hQZodq6YYu\nHC/6oAyFCN7eUp887UXVxtrCc323NFFEZZTzQNa5/cpIfLJ3+EtyC01ZkCQo\nxUlJAmG2yDWo5jLe+p2kwVSTKQvlUI1F7goKFOpZ9xGWk5bbwKy5aPt62BDY\n3Y1mkwlpaE/cwiq7BpWRq5z5pOrFuD9XoO6mKBeF2PTX8+UCWVcHgLH7+aBW\nYmtmCzRwUkf4hizE9C28WjQJ2vzfGQ0nPXgsi8RNDL3popxhOk9+fAecRYRz\nD4Odj1VyFl0TDqsR1w1C/tjY0UN/qpfdRPYcaNPJpVnyEf1nCEfleNxDJpxr\nMPfBB0MABHIJzV2C3OC9zLLaZbOKBa916DW1L0pYVTvxKaBKaMCttbFqBkef\nl2bNF2N85f4Al1/w4gL9hY5RIA/b/+SH8yQQw+zQ1YGnOcMxbOXRfUFZ9OqL\nn5kr3+ZLrCvS80xVXEjJ+0eLTa8ya87UnKi8EQm56j4vzSHKVV+ALs3lUbWo\nhzCCJvKW+PMI2XNb3/qcLZXtqquWHYSJp1iXnBSu92q6eTMXEtB3qGWsLrUQ\nfa47\r\n=5TP0\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDI58xD9Yi2O1K2lzreZJvkXtV0T42cSzYVflk4AfKWhwIhANbz0Pu0PWQDtmMgSSO1di/DtnGBe24lXcu1bxBV1dvi"}]},"directories":{},"maintainers":[{"name":"tulegen","email":"ndi89@mail.ru"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/di-async_1.0.16_1608849560194_0.2159529945546479"},"_hasShrinkwrap":false},"1.0.17":{"name":"di-async","version":"1.0.17","description":"Asynchronous lazy loading dependency injection container for JavaScript","main":"di-async.js","repository":{"type":"git","url":"git+https://github.com/Kobdik/di-app.git"},"scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"keywords":["dependency injection","di","container","async","lazy loading","Nodejs"],"author":{"name":"Kobdikov Tulegen","email":"ndi89@mail.ru"},"license":"MIT","dependencies":{},"bugs":{"url":"https://github.com/Kobdik/di-app/issues"},"homepage":"https://github.com/Kobdik/di-app#readme","_id":"di-async@1.0.17","_npmVersion":"6.4.1","_nodeVersion":"10.15.3","_npmUser":{"name":"tulegen","email":"ndi89@mail.ru"},"dist":{"integrity":"sha512-nvbM6VEeGSRrnH12gBdEgTx+5bRU5sfitUvEZoiIf7fTd9gSJjb7mwwL2R66kerFierrechvTzpJYuJOE6Pzzw==","shasum":"4cbc2399f1f272b12dfebeb768b619f606f2b20a","tarball":"https://registry.npmjs.org/di-async/-/di-async-1.0.17.tgz","fileCount":4,"unpackedSize":20302,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJf5ShmCRA9TVsSAnZWagAAeY8P/29EH78YWcomrPW2tsUg\nj5QuL89qO8ZVaAxu+58rVPx+Ri4k+Z8qcXu9pCqq8Rn0jCmh7XMQI1FIJwYD\nVVi8X8f+fOGY/1dBBVdHo3p+r7XcYr03thD0XiYjbGDBsFSA6Ieqwo5Kitkt\nJdC/JeqfFjTJQ5G+r/XzZyUWU8AVtbgiPtc344QSF6U/SY7ZZX+KshJO49Rh\nYIA8FuweUJJLNz/NZHYRTpSHGiSwofFObIwueV0kMn3fvSdsmDSVsywGyc/1\nd1xQSbVrvFbunUf1+Q8vTLZT3usjt1JDLRaqcmaAyeFoatH3I5Yy60iMC5Fr\naAlK8kMgqHkpjRJizUAT2D6AlFJ9Gvmrj7ecS2OeC9+IMGDZ2xT//IituOoR\n7F2uleF0V0/ORQMdpBonvxsyQPMwl6cpRu7uQu54rpnqXE9iGGGPPbmgEuPo\nMRCrh/p77G8Yr+UPPAMG4TEXYm7azDroFxGR4tleeyyPKUVN9KGoAz2HUMR4\nSc9Acw0voki+G5x9hAAUiWY8y8C/rGULdevU49S0hVmBaAAH0Vt/KL9cHIqc\ntWBi8i6Euc99hCcp+QkX8A/Go5DpNmjugzdEJYMVnNmJYNPd3pTbDH5MMHaF\nrSZIidOAQbU/zC2YNfbRy3FCSW902DtKSb7fuUYbrNQNus5rRCdGYxISTh4+\n8SmS\r\n=d0DU\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCICeu5kngPVVxVihS8P29oXGLP9gojpI6tmaMqkdOFQAaAiAlPH3jbIUgpXmpsseFQNkY2EIvuIOct1TUTIOqAmrNgw=="}]},"directories":{},"maintainers":[{"name":"tulegen","email":"ndi89@mail.ru"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/di-async_1.0.17_1608853605988_0.22069721002946507"},"_hasShrinkwrap":false},"1.0.18":{"name":"di-async","version":"1.0.18","description":"Asynchronous lazy loading dependency injection container for JavaScript","main":"di-async.js","repository":{"type":"git","url":"git+https://github.com/Kobdik/di-app.git"},"scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"keywords":["dependency injection","di","container","async","lazy loading","Nodejs"],"author":{"name":"Kobdikov Tulegen","email":"ndi89@mail.ru"},"license":"MIT","dependencies":{},"bugs":{"url":"https://github.com/Kobdik/di-app/issues"},"homepage":"https://github.com/Kobdik/di-app#readme","_id":"di-async@1.0.18","_npmVersion":"6.4.1","_nodeVersion":"10.15.3","_npmUser":{"name":"tulegen","email":"ndi89@mail.ru"},"dist":{"integrity":"sha512-Bo/TeHrjwy25KYN1ygz+napZIIgN2G3jsqPusM6PR4E26ESP42dLaRPlHtP3MPtnVgW07cWQFpqTPLWGDDoZcw==","shasum":"ca5eee1210333c4f2b3bd2ee0cec0d128015e134","tarball":"https://registry.npmjs.org/di-async/-/di-async-1.0.18.tgz","fileCount":4,"unpackedSize":21087,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJf5xkVCRA9TVsSAnZWagAAdKIP/1HYMOaYd8y2b7oh3Arf\nryZE7LCTYJvjwldb/5ldkqAnEx/EBAcokyjZDv6Ey5hVbmuwXuLz2smsyI4D\nvtQNdwml2A63zfF/NDi7IMuy1fsAh4T1lWvDFJUo2pKtxoUSZwIokqzKFRZu\ntUFNQC0qZitkXkFguMvF/YQdcARvHzQ8sXFbACbFBC7rhuQi8MXRrGXjrgOL\ndH1zuHSUWDUuo033S6pJtoWAFi6ylpquBFv94XHLCptTUpgNXLdUYAIr4mek\n5MT2e1lRMgpOIOqr74l7iN7KQ04dBZczbYEYdZ+uOYlbVYa5TrxqblCaTm9e\n2ae5Wn5T4e4d6Bjiz+cHe2NciJUKTsgyNZAEeeiQw07lyWCPDUWxJHPGJWcY\n67rTwmh/bcEfH2MDjg9ol6/4tlTUdImvPFeigsHJfZxHGiFpx1vF15Tvg5N3\njhUHmMenkgpH22rCdw2mtKbU5qB0/vX3jStRRfZAjsFIxQyLeThZVZ1onLtx\nDzLE6VU5UBndWiqXAxgTxhdIbtnn/IwnqDW2sD0lwiOKQ8euhpArMempPmao\n1Kx/ifzsWanDCI9hOmnH0+uFP+JQf5HgR8Mg8ox4Rkw5cs3oCSRMdxPXcPPv\nfI7AwE8EjbaUxoBtfske4ZcusU/Jt4un5JDVj1O2iyL3R1861fd+T3IiYT46\nPekC\r\n=cPjo\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDWzQv90Ywq7/v0cqof5/sBPbjCgyN29vlE0UrgtTyg6gIhAOWSXTPA3h8Xz26GkZEmjExpV7uqYcWKPC82G9U+TSl1"}]},"directories":{},"maintainers":[{"name":"tulegen","email":"ndi89@mail.ru"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/di-async_1.0.18_1608980756542_0.5395757881485237"},"_hasShrinkwrap":false},"1.0.19":{"name":"di-async","version":"1.0.19","description":"Asynchronous lazy loading dependency injection container for JavaScript","main":"di-async.js","repository":{"type":"git","url":"git+https://github.com/Kobdik/di-app.git"},"scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"keywords":["dependency injection","di","container","async","lazy loading","Nodejs"],"author":{"name":"Kobdikov Tulegen","email":"ndi89@mail.ru"},"license":"MIT","dependencies":{},"bugs":{"url":"https://github.com/Kobdik/di-app/issues"},"homepage":"https://github.com/Kobdik/di-app#readme","_id":"di-async@1.0.19","_npmVersion":"6.4.1","_nodeVersion":"10.15.3","_npmUser":{"name":"tulegen","email":"ndi89@mail.ru"},"dist":{"integrity":"sha512-ifGMDZH8twrgAGypmpYr8vCwMQ8RKDnAG5QbDU2kBP5TV4uD58NfOULhQoFb+4k0VWKjKmk0ZflJZm3otjea9A==","shasum":"1f1ed511b9836f18fa791780ea6e8bcef8d6fb9e","tarball":"https://registry.npmjs.org/di-async/-/di-async-1.0.19.tgz","fileCount":4,"unpackedSize":21121,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJf6Gx9CRA9TVsSAnZWagAA5fsP/1vb3w+VPzZq+SHVtZz1\nl4UjU8bAyjMi1LhaTCLjfJxDWVEV/ioY2vwAB9FZWMpBJyCPr5Vs+e0WqpTN\nqUxMAXvuMdprnBNWqT2pPiGZd6HB3yLDtFBP8NRcf45ewwNBGMQdzdbwSi7I\nDD+niyAx5BSlUVfsNdnmxQuIvuu7wIJhr2zJ45h2pfC3/ymuJhqMyuuG+b0N\n8TbP9TdZsA1LFQCR2Cd5lg7qoZkSOq9xxL2xfhxLU12n1pvLXJVoKwkdCVi1\nHYfCWlCRpGV3aZ/BVtyFxhiHvyK9770m8HSt8pAK7VaeJ8c5TUGR2BBApxFD\nUhn5+f9fNtWhxoNeXEEx0qTNkT5p439zAqVSERprJhkXojufIpYwLXISwvWE\nMvTpXzc/cIUEowvkMmVbeSGaKyNDRdO7vOuHUkaIpizADLeZSsaHxqiH1Jaq\nXfHTx3TxdVQGSVAE+RL6BoKkWxReOD8Atx69+MsWVPRtisEXC7t/uy7F0ZBH\nfgSEfROQxyFBt0gwLNMzvQIAd6U1vvqdVz0hQrGcovlr2pCnnQNaPdbOKOkG\nyF6kOji7KQbyel3PyWzV71EC+KvC61o+PLO4yIkoxhEZsvQBYrOHme3QDK6E\nHCS4cEKm7wRyktZZkwriZwNlAA3xNTzhcAY6SrMtmf1iMNqgpt+AFeNmS/BA\nt600\r\n=DZcp\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIHJ1DwCr/0eQrRotov9uYZy6xKKwY4E5gEJIKrSN0zQXAiBsW2P3jPWrM7aoz2Vsi1nWKdUOrY8ZWLsCLsJFlOHIBg=="}]},"directories":{},"maintainers":[{"name":"tulegen","email":"ndi89@mail.ru"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/di-async_1.0.19_1609067645157_0.5000234713728557"},"_hasShrinkwrap":false},"1.0.20":{"name":"di-async","version":"1.0.20","description":"Asynchronous lazy loading dependency injection container for JavaScript","main":"di-async.js","repository":{"type":"git","url":"git+https://github.com/Kobdik/di-app.git"},"scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"keywords":["dependency injection","di","container","async","lazy loading","Nodejs"],"author":{"name":"Kobdikov Tulegen","email":"ndi89@mail.ru"},"license":"MIT","dependencies":{},"bugs":{"url":"https://github.com/Kobdik/di-app/issues"},"homepage":"https://github.com/Kobdik/di-app#readme","_id":"di-async@1.0.20","_npmVersion":"6.4.1","_nodeVersion":"10.15.3","_npmUser":{"name":"tulegen","email":"ndi89@mail.ru"},"dist":{"integrity":"sha512-c0Bz4uIb9WNjcgbyySdsC0jwajDVByXYypiHxCry4sP7D2OrMoJ6ep5nsgOlyiI6rfaTH1QP1iA7SmBxtODljA==","shasum":"70ba7786ff78cd1795f71d73c4a7dfad8c837543","tarball":"https://registry.npmjs.org/di-async/-/di-async-1.0.20.tgz","fileCount":4,"unpackedSize":21224,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJf6OTsCRA9TVsSAnZWagAAnwsQAIfH69r1bS9MwfkUkLW3\nqUi3rG5xz+JKpsW/fbgpgzdUXpvOILA2gRUcxZq4sEmoz0q/OPTTbiE0ndXX\nlsQ+0y9HWmBTxbJaynCdAlN7V5g01HCArIESnDN+31qdnpVnXYLXBEWZneB/\n5CB2IrCIzF0TGvlxO4aPqXMV7rIM7+I2t10WG7PRETGnxe8YFSu59XoP44VV\nhbH0iuLzERuUMWm78X4WrNCR4st3VxS6bWholHwO7hsFIJS+kRR6wA1fw5X7\nQDjIXjPCNMxZtlf7YXxQAaS3O7qHKgnUsyH0cPGu2Ix/sTbCsdSRQh7aP6Ro\ncr26boTHGWZjvGs5Gj5nOsK+ePex1mjDkRxniyjQQTVvxIllrAaidRPz62k5\n/Lr50IfzrWiWqVt0SMMUHEgYTAXtagGP0Wm4i/n35WeXkpH27nYJxXVb8nAx\np/SBxYPIrW2PV1Yz3BN7Aot1dd+OG3ektWccW7Bsa3yKtZhx+95FpK9ZcELX\nytT+8k97pPF6lqLDRonzapMvjt7/CuVK5mEeWT9N7DFPE2fqmfPW0CiFrES+\nR+GDcmkP+ogI8D42ys9R3Pabg9rcCvnC+80VmaMRtQkRb0+HXjv8QO8RPOYt\naGjj7rVoqSQ7MKX2gbqmMeOBznJtTfGd/gI6N1RjuvY7Epori4AewxAh5nbg\nzQdp\r\n=xSn8\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDXeD5S+XGhLggH/ZDODkuH2McIdBEncASm85+FsJ+DlgIhAMSpKfQXJl/CdLrxlxp4+nRDpKQM/NGoAPpBY1J4O7/4"}]},"directories":{},"maintainers":[{"name":"tulegen","email":"ndi89@mail.ru"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/di-async_1.0.20_1609098475650_0.4290361745540756"},"_hasShrinkwrap":false},"1.0.21":{"name":"di-async","version":"1.0.21","description":"Asynchronous lazy loading dependency injection container for JavaScript","main":"di-async.js","repository":{"type":"git","url":"git+https://github.com/Kobdik/di-app.git"},"scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"keywords":["dependency injection","di","container","async","lazy loading","Nodejs"],"author":{"name":"Kobdikov Tulegen","email":"ndi89@mail.ru"},"license":"MIT","dependencies":{},"bugs":{"url":"https://github.com/Kobdik/di-app/issues"},"homepage":"https://github.com/Kobdik/di-app#readme","_id":"di-async@1.0.21","_npmVersion":"6.4.1","_nodeVersion":"10.15.3","_npmUser":{"name":"tulegen","email":"ndi89@mail.ru"},"dist":{"integrity":"sha512-NUaUOF0oTERGdkP8oTyn+b+Yjbcrn48zJj8wJeRHKRJ24JSWgU23nJ/0g5EMsKkvrNZhZELoDFHJn2iiTT4iiA==","shasum":"cf6ce00eaf0c8334a1241e7976f0e15b9e78264d","tarball":"https://registry.npmjs.org/di-async/-/di-async-1.0.21.tgz","fileCount":4,"unpackedSize":21271,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgAdn/CRA9TVsSAnZWagAAfR0P/RxyVDphL4a92X1MrmWO\nDItwND7mSrfq0lMQFMRJdBAirsr0XZkYnmBybbIYxO+vdMNz9n5HNsH4KK14\nHMkljzrjC4P9NtiqSH6F74sAv1BnXFc1X85hRNkfw3yb6FXMpUj3a5O9UEVy\n96Dt2SQpwSujHlsOg0oqP+z03jRKK0iAjSlkwq0n3gX9cKXsZPlX1G2KL2K+\nP0fDPHgQlb1Qcm4B4lmkdKRyI6YijJIRvWUxKEGWpEXJKhVaYlzAyoujIqyH\n04Aie3j/2v1oECLWladPTwnLHgDVndAwYxDPlMarwoaSsP8N2zNE0yYtRW7N\na/58EIJQqC8w5z7CyBT2p5hgCswkPUeg82aquqZYEUW4IJixLmv4QGwp/9SG\nNuwX+p3J5eFzjJJTQXUOS9LJpcKLVFC32U1B7Kjpt7D74xrPlSwOzzEsMtE1\nYY6F3Fbb8KInEPcHhItet9+6u/HhDxyQrE5njjfhP8DKiL7B9W05JMeXQm2e\ndmNNqpZxkY+2XP68rAtrVJNkthbfpAHmzoDMAgaBuAGhwt153RoRBESi8fIb\nJP78QXomZX93QgS8Abo2Qa3zhsoPUHFUM8bbLRiQJS7nlXlmXRNyPz2oVX45\nUKXn+F71Xjv5xXJiwnq277xP10DqJc6jlWUTlM64VBe6ZgQXTymwSwdMWHvT\nY1L2\r\n=DHXS\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIC0bCXljpcmutwa9KdwQ+Y6aSwTSOPqi4LlrpFkSIQq7AiEAhpMbYriVY4WEucAygfg+06W0XTWlFhfLXCHJfXw3T/c="}]},"directories":{},"maintainers":[{"name":"tulegen","email":"ndi89@mail.ru"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/di-async_1.0.21_1610734078739_0.7267941905191597"},"_hasShrinkwrap":false},"1.0.22":{"name":"di-async","version":"1.0.22","description":"Asynchronous lazy loading dependency injection container for JavaScript","main":"di-async.js","repository":{"type":"git","url":"git+https://github.com/Kobdik/di-app.git"},"scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"keywords":["dependency injection","di","container","async","lazy loading","Nodejs"],"author":{"name":"Kobdikov Tulegen","email":"ndi89@mail.ru"},"license":"MIT","dependencies":{},"bugs":{"url":"https://github.com/Kobdik/di-app/issues"},"homepage":"https://github.com/Kobdik/di-app#readme","_id":"di-async@1.0.22","_npmVersion":"6.4.1","_nodeVersion":"10.15.3","_npmUser":{"name":"tulegen","email":"ndi89@mail.ru"},"dist":{"integrity":"sha512-4HDjvf0kcq0XQO6pW0qSxp3b97fSsigb1N/ShT4YCWZ29whN02P6XI1kP45HNEUwX+uKHhRZ/aXxnKXO+tT8Lw==","shasum":"76f1c4235d21bcb784cc2b6a902f3fc9888ac78b","tarball":"https://registry.npmjs.org/di-async/-/di-async-1.0.22.tgz","fileCount":4,"unpackedSize":21460,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgA01qCRA9TVsSAnZWagAA+TEP/0wRBAcczWs+2iFLP64W\n/C+2Oad4tJB7M2sU1lEHJUqfRfCu5B+9xR/0DZQVCXFjDUIYXc/HqHRT+QZx\n/VfHttCQzEXhCOsGBQB2RHTavWikArd1n4wsOrGaNHynYGCb4GcVAO80evAK\nco+HOJHcx5hEBGUkg+T97FssrxNvIOjYmDw8hzIgaVv4txTSInHg6KoyxOGN\n0Qx0Kaj9geNnyL31K7buyAjx+uMVb61I3cHqqv5fO1AEEnDXwypqA9WsFs3m\nvZ+KVMmt7K7Jh9bpndfsVPJDJS0DsDF1sqkqI3RzcLLz4kXwS0JDAFtq4IgD\nFkA6jejwsfZg6puhGTbRuX7u5BEPXq+DBw5i7sUF9gA3DDkKUfhnzbtXsv9Z\nRP1qWG6mzyXeStbzRBC9X1fcN0mJIgTmCjEWldt1XsnZ+9Q4xMCZspVqdyvD\nMw6U0tPOXJ3KonGm4GXCtkaCcOHMEUGtczRJWrJHYUZ6hLvDRettarXRvgfl\nKqQ+yoff72zeVqxAESJBvLffapuDJMCw2T4XM4aOxFA03sGDl5fyFi6T8wIP\n2vPJwq87baXiL9wNdS3wUkFbQ3Yvw6/JOmqJ3+gcayFcNGBze6bcJw+VFaZA\nxinTELChgl91LZWQiMNnLpVmXeIxX8jqDJ1XCHHLpQ93IAzDdUQJaJ2I4KaC\n1AMq\r\n=HUUh\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIF/HnTn6wwDUhvWg/pjDw12LS0Jpe0PZthmESJovBfmRAiBsBml5gn+zVnYv2+xbq4xqmDdE5vpk/tVsmsf+TuEqzg=="}]},"directories":{},"maintainers":[{"name":"tulegen","email":"ndi89@mail.ru"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/di-async_1.0.22_1610829161938_0.14567689948452278"},"_hasShrinkwrap":false}},"time":{"created":"2020-12-20T20:08:05.307Z","1.0.0":"2020-12-20T20:08:05.411Z","modified":"2022-04-28T12:14:41.766Z","1.0.1":"2020-12-20T20:21:16.439Z","1.0.2":"2020-12-20T20:30:41.215Z","1.0.3":"2020-12-20T20:33:32.078Z","1.0.4":"2020-12-20T20:34:47.822Z","1.0.5":"2020-12-20T20:37:30.376Z","1.0.6":"2020-12-20T20:55:55.429Z","1.0.7":"2020-12-20T20:57:27.183Z","1.0.8":"2020-12-20T21:02:21.961Z","1.0.9":"2020-12-20T21:11:31.816Z","1.0.10":"2020-12-20T21:21:58.104Z","1.0.11":"2020-12-21T08:28:15.052Z","1.0.12":"2020-12-21T08:39:45.583Z","1.0.13":"2020-12-22T15:52:51.105Z","1.0.14":"2020-12-22T15:59:35.825Z","1.0.15":"2020-12-24T22:23:43.399Z","1.0.16":"2020-12-24T22:39:20.338Z","1.0.17":"2020-12-24T23:46:46.105Z","1.0.18":"2020-12-26T11:05:56.740Z","1.0.19":"2020-12-27T11:14:05.323Z","1.0.20":"2020-12-27T19:47:55.814Z","1.0.21":"2021-01-15T18:07:58.887Z","1.0.22":"2021-01-16T20:32:42.084Z"},"maintainers":[{"name":"tulegen","email":"ndi89@mail.ru"}],"description":"Asynchronous lazy loading dependency injection container for JavaScript","keywords":["dependency injection","di","container","async","lazy loading","Nodejs"],"author":{"name":"Kobdikov Tulegen","email":"ndi89@mail.ru"},"license":"MIT","readme":"# DI-Async Container\r\n\r\nLaconic Asynchronous Dependency Injection container for JavaScript\r\n\r\n+ Declarative configuration and **Lazy Loading** of modules\r\n+ Asynchronous resolution of services\r\n+ Tiny size and flexible clear API\r\n+ Ability to inject the same dependencies concurrently\r\n+ **Lifetime Management**: Singleton, Transient and Scoped lifetime\r\n\r\nImagine a web server that has dozens of services. If its startup speed is critical, then asynchronous **Lazy Loading** of services solves that problem. It will allow the application to launch faster, with the minimal count of necessary services. Even while loading dependencies graph the server stays still responsive.\r\n[Lazy loading Express middleware](https://github.com/Kobdik/di-app/blob/master/middleware.md)\r\n\r\n## Table of contents\r\n\r\n+ [Installation](#installation)\r\n+ [Usage](#usage)\r\n+ [Dependencies graph](#dependencies-graph)\r\n+ [Dependency Injection pattern](#dependency-injection-pattern)\r\n+ [Registering modules](#registering-modules)\r\n+ [Dependency Injection Container](#dependency-injection-container)\r\n\r\n## Installation\r\n\r\nInstall with `npm`\r\n\r\n``` cmd\r\nnpm install di-async --save\r\n```\r\n\r\n## Usage\r\n\r\nDI-Async has a simple clear API. You need to do few things:\r\n\r\n+ Refactor your modules leveraging the [DI pattern](#dependency-injection-pattern)\r\n+ Create a [DI Container](#dependency-injection-container)\r\n+ [Register](#registering-modules) some modules in it\r\n+ Resolve services and use\r\n\r\n``` js\r\n// simple-sync.js\r\n// create container\r\nconst DI = require('di-async');\r\nconst di = DI();\r\n// register services\r\ndi.join(require('./modules.json'));\r\ndi.set('logger', console );\r\n// synchronous services resolving and use\r\ntry {\r\n    \r\n    const a1 = di.getSync('accumulator');\r\n    a1.add(1);\r\n    a1.add(4);\r\n    console.info('Amount is %d', a1.tot);\r\n\r\n    const a2 = di.getSync('accumulator');\r\n    a2.add(10);\r\n    a2.add(40);\r\n    console.info('Amount is %d', a2.tot);\r\n\r\n    const a3 = di.getSync('accumulator');\r\n    a3.add(100);\r\n    a3.add(400);\r\n    console.info('Amount is %d', a3.tot);\r\n\r\n    const s = di.getSync('storage');\r\n    console.info('Total amount is %d', s.tot);\r\n\r\n    const D = di.getSync('DerivedA');\r\n    const d = new D('Den');\r\n    console.info(d.name, d.sum(8, 2));\r\n\r\n}\r\ncatch (err) {\r\n    console.error(`Catch: ${err}`)\r\n};\r\n\r\n// modules.json\r\n{\r\n    \"storage\": { \"path\": \"./services/storage\" },\r\n    \"thresshold\": { \"path\": \"./services/thresshold\" },\r\n    \"accumulator\": { \"path\": \"./services/accumulator\", \"transient\": true },\r\n    \"ClassA\": { \"path\": \"./services/class-a\" },\r\n    \"DerivedA\": { \"path\": \"./services/derived-a\" }\r\n}\r\n```\r\n\r\nApplication stays responsive, resolving services with asynchronous approach.\r\n\r\n``` js\r\n// simple.js\r\n// create container\r\nconst DI = require('di-async');\r\nconst di = DI();\r\n// register services\r\ndi.join(require('./modules.json'));\r\ndi.set('logger', console );\r\n// sequential services resolving and use\r\nconst run = async () => {\r\n    \r\n    const a1 = await di.get('accumulator');\r\n    a1.add(1);\r\n    a1.add(4);\r\n    console.info('Amount is %d', a1.tot);\r\n\r\n    const a2 = await di.get('accumulator');\r\n    a2.add(10);\r\n    a2.add(40);\r\n    console.info('Amount is %d', a2.tot);\r\n\r\n    const a3 = await di.get('accumulator');\r\n    a3.add(100);\r\n    a3.add(400);\r\n    console.info('Amount is %d', a3.tot);\r\n\r\n    const s = await di.get('storage');\r\n    console.info('Total amount is %d', s.tot);\r\n\r\n    const D = await di.get('DerivedA');\r\n    const d = new D('Den');\r\n    console.info(d.name, d.sum(8, 2));\r\n\r\n};\r\n\r\nrun().catch(err => console.error(`Catch: ${err}`));\r\n```\r\n\r\nBoth outputs are the same.\r\n\r\n``` log\r\n1 added to 0\r\n4 added to 1\r\nAmount is 5\r\n10 added to 0\r\n40 added to 10\r\nAmount is 50\r\n100 added to 0\r\n400 added to 100\r\nStorage limit 500 exceeded by 55 !\r\nAmount is 500\r\nTotal amount is 555\r\nDen saccessfully created\r\nDen 10\r\n```\r\n\r\nYou can try services resolution concurrently.\r\n\r\n``` js\r\n// concurrent.js\r\n// create container\r\nconst DI = require('di-async');\r\nconst di = DI();\r\n// register services\r\ndi.join(require('./modules.json'));\r\ndi.set('logger', console);\r\n// concurrently services resolving and use\r\nconst p1 = di.get('accumulator').then(a1 => {\r\n    a1.add(1);\r\n    a1.add(4);\r\n    logger.info('Amount is %d', a1.tot);\r\n});\r\n\r\nconst p2 = di.get('accumulator').then(a2 => {\r\n    a2.add(10);\r\n    a2.add(40);\r\n    logger.info('Amount is %d', a2.tot);\r\n});\r\n\r\nconst p3 = di.get('accumulator').then(a3 => {\r\n    a3.add(100);\r\n    a3.add(400);\r\n    logger.info('Amount is %d', a3.tot);\r\n});\r\n\r\nconst p0 = di.get('storage');\r\n\r\nPromise.all([p0, p1, p2, p3]).then(r => {\r\n    logger.info('Total amount is %d', r[0].tot)\r\n}).catch(err => logger.error(`Catch on Total amount: ${err}`));\r\n\r\ndi.get('DerivedA').then(D => {\r\n    const d = new D('Den');\r\n    logger.info(d.name, d.sum(8, 2));\r\n}).catch(err => logger.error(`Catch on DerivedA: ${err}`));\r\n```\r\n\r\nOutput shows that Den shifted forward by three positions.\r\n\r\n``` js\r\n1 added to 0\r\n4 added to 1\r\nAmount is 5\r\nDen saccessfully created\r\nDen 10\r\n10 added to 0\r\n40 added to 10\r\nAmount is 50\r\n100 added to 0\r\n400 added to 100\r\nStorage limit 500 exceeded by 55 !\r\nAmount is 500\r\nTotal amount is 555\r\n```\r\n\r\n## Dependencies graph\r\n\r\n![Example of the Dependencies graph](https://github.com/Kobdik/di-app/blob/master/graph.svg)\r\n\r\nThe example of the Dependencies graph represent dependencies of several services towards each other. Directions of graph links assumed from bottom to top.\r\n\r\n## Dependency Injection pattern\r\n\r\nDependency Injection (DI) is a pattern where the dependencies\r\nof a service component are provided as input by the external entity often called the injector.\r\n\r\nRefactor your modules to accomplish DI patterns as shown below. Every service module exports a fabric function with *deps* property set to an array of dependencies names.\r\n\r\n``` js\r\n// accumulator.js \r\n// fabric function of accumulator service\r\nmodule.exports = (storage, logger) => {\r\n    let acc = 0;\r\n    // returned instance\r\n    return {\r\n        add(a) {\r\n            acc += a;\r\n            logger.info(`${a} added to ${acc}`);\r\n            storage.add(a);\r\n            if (storage.exceeded)\r\n                logger.info(`Storage limit ${storage.limit} exceeded by ${storage.tot - storage.limit} !`);\r\n        },\r\n        get tot() {\r\n            return acc;\r\n        },\r\n    }\r\n}\r\nmodule.exports.sname = \"Accumulator service\";\r\nmodule.exports.deps = [\"storage\", \"logger\"];\r\n\r\n// storage.js\r\n// fabric function of storage service\r\nmodule.exports = (thresshold) => {\r\n    let acc = 0;\r\n    return {\r\n        add(a) {\r\n            acc += a;\r\n        },\r\n        get exceeded() {\r\n            return acc > thresshold.val;\r\n        },\r\n        get limit() {\r\n            return thresshold.val;\r\n        },\r\n        get tot() {\r\n            return acc;\r\n        }\r\n    }\r\n};\r\nmodule.exports.sname = \"Storage service\";\r\nmodule.exports.deps = [\"thresshold\"];\r\n\r\n// thresshold.js\r\n// fabric function without dependencies\r\nmodule.exports = () => {\r\n    let limit = 500;\r\n    return {\r\n        set val(a) {\r\n            limit = a;\r\n        },\r\n        get val() {\r\n            return limit;\r\n        },\r\n    }\r\n};\r\nmodule.exports.sname = \"Thresshold\";\r\n```\r\n\r\nAs said in my favorite book (**Node.js Design Patterns** ISBN 978-1-83921-411-0):\r\n> The nature of JavaScript affects traditional design patterns. There are so many ways in which traditional design patterns can be implemented in JavaScript that the traditional, strongly object-oriented implementation stops being relevant.\r\n\r\nClass as a service is a more flexible approach than using a constructor as a dependency injection function. Constructor arguments stay free from dependencies. There is no need to register constants as input services.\r\n\r\n``` js\r\n// class-a.js\r\n// class defined inside factory function\r\nmodule.exports = (logger) => {\r\n    class ClassA {\r\n\r\n        constructor(name) {\r\n            this._name = name;\r\n            logger.info(`${this.name} saccessfully created`);\r\n        }\r\n\r\n        get name() {\r\n            return this._name;\r\n        }\r\n    }\r\n    return ClassA;\r\n};\r\nmodule.exports.sname = \"class A\";\r\nmodule.exports.deps = [\"logger\"];\r\n\r\n// derived-a.js\r\n// derived class defined inside factory function\r\nmodule.exports = (ClassA) => {\r\n\r\n    class DerivedA extends ClassA {\r\n        constructor(name) {\r\n            super(name);\r\n        }\r\n\r\n        sum(a, b) {\r\n            return a + b;\r\n        }\r\n    }\r\n    return DerivedA;\r\n};\r\n\r\nmodule.exports.sname = \"derived A\";\r\nmodule.exports.deps = [\"ClassA\"];\r\n```\r\n\r\nJust for example, *DerivedA* service was rewritten in asynchronous manner.\r\n\r\n``` js\r\nmodule.exports = (ClassA) => {\r\n\r\n    class DerivedA extends ClassA {\r\n\r\n        constructor(name) {\r\n            super(name);\r\n        }\r\n\r\n        sum(a, b) {\r\n            return a + b;\r\n        }\r\n\r\n    }\r\n    return new Promise(resolve => setTimeout(resolve, 2000, DerivedA));\r\n};\r\n\r\nmodule.exports.sname = \"derived A\";\r\nmodule.exports.deps = [\"ClassA\"];\r\n```\r\n\r\nTherefore, service would be available two seconds later.\r\n\r\n## Registering modules\r\n\r\n**Lifetime Management** is the concept of regulating the number of returned instances and the duration of the lifetime of those instances.\r\n\r\nBy default, container returns *Singleton* instance and holds on reference to it. The container always returns that same instance.\r\n\r\nRegistering service as *Transient* lead to another outcome. Returned instance is not cached in the container. A new instance of the component will be created each time the service is requested from the container.\r\n\r\nRegistering *Singleton* service instance.\r\n\r\n``` js\r\ndi.set('logger', console);\r\n// or equivalently\r\ndi.setEntry('logger', { inst: console });\r\n```\r\n\r\nRegistering multiple services. The *accumulator* service registered as *Transient*.\r\n\r\n``` js\r\ndi.join({\r\n    \"storage\": { \"path\": \"./services/storage\" },\r\n    \"thresshold\": { \"path\": \"./services/thresshold\" },\r\n    \"accumulator\": { \"path\": \"./services/accumulator\", \"transient\": true },\r\n    \"ClassA\": { \"path\": \"./services/class-a\" },\r\n    \"DerivedA\": { \"path\": \"./services/derived-a\" }\r\n});\r\n// or from external JSON-file\r\ndi.join(require('./modules.json'));\r\n```\r\n\r\nThe *Scoped* service behaves much like the *Singleton* service within a single, well-defined scope.\r\n\r\nTo obtain *Scoped* service behavior create new container as well-defined scope and register appropriate *Singleton* services. To optimize execution performance should share service factories and instances within a dedicated container.\r\n\r\n``` js\r\nconst DI = require('di-async');\r\nconst shared = DI();\r\nshared.join(require('./modules.json'));\r\n// singleton instance shared with scoped containers\r\nshared.set('logger', console );\r\n```\r\n\r\nThen create new scoped containers through method *newScope* of shared container and do some actions. And now, the *storage* dependency of the *accumulator* service behaves as *Scoped*.\r\n\r\n``` js\r\nconst run = async () => {\r\n    // singleton instance shared with scoped containers\r\n    const lim = await shared.get('thresshold');\r\n\r\n    lim.val = 50;\r\n    const scope1 = shared.newScope();\r\n    \r\n    const a11 = await scope1.get('accumulator');\r\n    a11.add(1);\r\n    a11.add(4);\r\n    console.info('Amount is %d', a11.tot);\r\n\r\n    const a12 = await scope1.get('accumulator');\r\n    a12.add(10);\r\n    a12.add(40);\r\n    console.info('Amount is %d', a12.tot);\r\n\r\n    // Singleton instance within scope1\r\n    const s1 = await scope1.get('storage');\r\n    console.info('Total amount is %d', s1.tot);\r\n\r\n    lim.val = 100;\r\n    const scope2 = shared.newScope();\r\n    \r\n    const a21 = await scope2.get('accumulator');\r\n    a21.add(1);\r\n    a21.add(9);\r\n    console.info('Amount is %d', a21.tot);\r\n\r\n    const a22 = await scope2.get('accumulator');\r\n    a22.add(10);\r\n    a22.add(90);\r\n    console.info('Amount is %d', a22.tot);\r\n\r\n    // Singleton instance within scope2\r\n    const s2 = await scope2.get('storage');\r\n    console.info('Total amount is %d', s2.tot);\r\n\r\n};\r\n\r\nrun().catch(err => console.error(`Catch: ${err}`));\r\n\r\n```\r\n\r\nEach instances of the *storage* service have they own scope. Both share the same instance of *threshold*.\r\n\r\n``` log\r\n1 added to 0\r\n4 added to 1\r\nAmount is 5\r\n10 added to 0\r\n40 added to 10\r\nStorage limit 50 exceeded by 5 !\r\nAmount is 50\r\nTotal amount is 55\r\n1 added to 0\r\n9 added to 1\r\nAmount is 10\r\n10 added to 0\r\n90 added to 10\r\nStorage limit 100 exceeded by 10 !\r\nAmount is 100\r\nTotal amount is 110\r\n```\r\n\r\nSimplified example of scoped service used in middleware.\r\n\r\n``` js\r\nconst DI = require('di-async');\r\nconst shared = DI();\r\n// register services\r\nshared.join({\r\n    \"ClassA\": { \"path\": \"./services/class-a\" },\r\n    \"student\": { \"path\": \"./services/student\" }\r\n});\r\nshared.set('logger', console );\r\n// register middleware function\r\n// in which create the scoped container\r\napp.use((req, res, next) => {\r\n    shared.get('ClassA').then(A => {\r\n        // new scope per request\r\n        req.scope = shared.newScope();\r\n        // provide constructor arguments\r\n        const person = new A(req.user.name);\r\n        // register scoped service instance\r\n        req.scope.set('person', person);\r\n        next();\r\n    }).catch(next);\r\n});\r\n// somewhere obtain from scope and use it\r\napp.get('/api/me', (req, res) => {\r\n    const person = req.scope.getSync('person');\r\n    // Do some work with that person\r\n    res.end(person.name);\r\n});\r\n// or obtain from scope and use dependent service\r\napp.get('/api/student', (req, res) => {\r\n    const student = req.scope.getSync('student');\r\n    res.end(student.ask());\r\n});\r\n\r\n// student.js - used as scoped service\r\nmodule.exports = (person) => {\r\n\r\n    return {\r\n        ask() {\r\n            return `My name is ${person.name}`;\r\n        }\r\n    }    \r\n};\r\nmodule.exports.sname = \"student service\";\r\nmodule.exports.deps = [\"person\"];\r\n```\r\n\r\nThe *person* service implicitly depends on *ClassA* service, there is no module with service definition, but you can explicitly define dependents chain of that service.\r\n\r\n## Dependency Injection Container\r\n\r\nDI-Async loads service modules in an asynchronous manner only when needed, therefore performs **Lazy Loading** strategy. No module loading before service have been requested.\r\n\r\nContainer implementation allows concurrently loading the same *Singleton* dependency. In example program *concurrent.js*, shown above, there are three implicit and one explicit concurrent requests to *storage* dependency. Only first request loads factory and create service instance within method *get*, the other three awaits the same promise, that will return resolved instance.\r\n\r\n[See examples and the source code on GitHub](https://github.com/Kobdik/di-app)\r\n[Lazy loading Express middleware](https://github.com/Kobdik/di-app/blob/master/middleware.md)\r\n","readmeFilename":"readme.md","homepage":"https://github.com/Kobdik/di-app#readme","repository":{"type":"git","url":"git+https://github.com/Kobdik/di-app.git"},"bugs":{"url":"https://github.com/Kobdik/di-app/issues"}}