{"_id":"@ashnazg/yog","_rev":"16-01b85818f4c6ca021aa10d50f92714ca","name":"@ashnazg/yog","dist-tags":{"latest":"0.3.2"},"versions":{"0.0.1":{"name":"@ashnazg/yog","version":"0.0.1","description":"a websocket server message bus lib with per client filtering","main":"src/yog.js","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"keywords":["websocket"],"author":{"name":"Xander","email":"xander@ashnazg.com","url":"ashnazg.com"},"license":"MIT","dependencies":{"bufferutil":"^4.0.1","q":"^1.5.1","utf-8-validate":"^5.0.2","ws":"^7.2.1"},"_id":"@ashnazg/yog@0.0.1","_nodeVersion":"12.14.1","_npmVersion":"6.13.4","dist":{"integrity":"sha512-qFtD+4Oy2aid3IUV8SY6InGcb6bcyXsydayvLSlT2vafvlw6ET4uMOii6ZFRZsspxzQst7/eZdQ3k0zFPoZxdA==","shasum":"ef532e69a7075fc85bdb550f07760425b131c814","tarball":"https://registry.npmjs.org/@ashnazg/yog/-/yog-0.0.1.tgz","fileCount":5,"unpackedSize":9568,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJeI6q4CRA9TVsSAnZWagAATBcP/R2omUpEMiV/GA3omVhQ\nXqaDBqNRO/rPDctqx2jMpnmwPQfOkOgU+ZQW5Z5qKFM+2OBS2KzFMx8MkjoX\nb+g+BSQWp64K9Rzs3JAq8H8rdnuTe3DdDpk435BixWC1egloBtvUV8FEZQc3\np0ZCkzBtANN+VT2RV/M/hcuHWlY/h6KGc69qRpEA9jv1aEAEzRiS/2k7s6pV\nXPmpSAHfBzxylFWjlCa4Omc/RGJCo0jQG9tMdNzvw8WFdLfA8m213z3gtfA+\nyR7BbP6B9lLDq5zZkLNpDIOU45MTlSnuJHKIwOC4WzvtF8n7ghH0vvwrVJnU\nmkCHvvWzaArx4nqSwoWiEprOiboZc77F1WElpDSKRZn2za7VflIhs789pu9X\nOB0A6VG3dq+hotdwxVFg+7DJ8MLvmn46hJdmpEmrnThV8l0e505MAYvJP1A1\nf/l+Q/Jgg1dSkQGtCZt0wxadQOxII4KftOsjK20i0pgrK7aFFHBIG/MJl9Wl\n1l3iHpZrJkh/GF6W76ZCXt03aRyiR2c9Buw8tQGH0LzSedVJz9xmd3SpYwE0\nU/dWxI76OMC7CWWAb+y89WVnvg7jB/h6mD/bELTLYma7A5sB7VlQLn7LQDZr\n9AB+qmIqvRWSVBsWMvsgje9RJ6aXSSw//vs35mCpvH44cuNLdG0vImmQohRD\nmZ+B\r\n=R9g8\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCICN7V9a/ELxWTpImitwaoXI1r4bg5wVezqrSi09I4aWpAiAxx7DORIKL4AP3DVlC9ezcp9ojI3oPJ/K6LhnxlwMuYQ=="}]},"maintainers":[{"name":"xander","email":"xander@ashnazg.com"}],"_npmUser":{"name":"xander","email":"xander@ashnazg.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/yog_0.0.1_1579395767568_0.21684705817965222"},"_hasShrinkwrap":false},"0.0.2":{"name":"@ashnazg/yog","version":"0.0.2","description":"a websocket server message bus lib with per client filtering","main":"yog.js","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"keywords":["websocket"],"author":{"name":"Xander","email":"xander@ashnazg.com","url":"ashnazg.com"},"license":"MIT","dependencies":{"bufferutil":"^4.0.1","q":"^1.5.1","utf-8-validate":"^5.0.2","ws":"^7.2.1"},"_id":"@ashnazg/yog@0.0.2","_nodeVersion":"12.14.1","_npmVersion":"6.13.4","dist":{"integrity":"sha512-DnkeZGKJiwvGlHwQbUWELJ7rNrDEesyh/EqEXGpAmBi85kcERWqnObkxthQtsWtyufkLKjth7yodHYxp/+KNpw==","shasum":"7e7375480ad8751b95978bb157b01c52dd5ff941","tarball":"https://registry.npmjs.org/@ashnazg/yog/-/yog-0.0.2.tgz","fileCount":5,"unpackedSize":10185,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJeI8b1CRA9TVsSAnZWagAA2mYP/2K+EKX8ng1SDXZHxJ70\nVdOPMTtgnr9Y/0Cu2je575C0AqborDvaxFwb7S2pVlBRjTzZqf6b/kyEi9DC\nWD7ZjU/y1z32JC4dp0t+eN8+4TbQnQoiuWK4h++OZBZmnPOg+slAVbq4hKX3\ni7QHxdDAIpSE8eTKLXk7Qin4BTwwfwivN8EBMQq0NghUDnU8aGGrbbmrZAlZ\nbjXQsgxwP4udKshWPiji9GNnewRe/XSXKZEhQy6y7gecEqfBTxqUAIdDkWeg\nRb/Sfm8akahksIUIP01BUTBr7NhCzg7Q1oUcXFJ5p0VkK6J10nCKdvb/jvkr\nx85XV7IyoIDENqvs32wTQoxj0jPs0D+2Dsgk/d5VLuzJCzvMw0rXoekvZJoW\nZBwR+mrM5OdjN0r9SMEGIcjXnjm7Eg6A3TKPDommWOCnl/Icykcq0cravy36\n+diECuVA7FVLMOCSIERgOMdTuC66iOVUN7+zX4BetB6hoTDSxsBf8iSOveZo\n/PZoM8dL4LPczyzoS9oSL8G7RAWjVcg8Ad+eTwR4t3bmV0C7OeDobvuBNpQe\n26UPxvWiAFMZLA9QZUXWFzZ/c+tBy/pv4SR9uqFnZtbPsM25/+qYSMhNRbLW\nsI2llzktMHRYwyb6gEpAfidr/vbYM39xoVgck1DHyOEdbfnwI9Iage+2YHCh\n+0t6\r\n=ttZs\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIAzlpVvE29DUhT3l0vYgkSOJHGCDmOvD5OnZIvrfl6TSAiEAsTb8VuA0pNQh2B7qm1rZweWnYzBFevpmHs/OWRaGbRs="}]},"maintainers":[{"name":"xander","email":"xander@ashnazg.com"}],"_npmUser":{"name":"xander","email":"xander@ashnazg.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/yog_0.0.2_1579402997210_0.6218023185146662"},"_hasShrinkwrap":false},"0.0.3":{"name":"@ashnazg/yog","version":"0.0.3","description":"a websocket server message bus lib with per client filtering","main":"yog.js","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"keywords":["websocket"],"author":{"name":"Xander","email":"xander@ashnazg.com","url":"ashnazg.com"},"license":"MIT","dependencies":{"bufferutil":"^4.0.1","q":"^1.5.1","utf-8-validate":"^5.0.2","ws":"^7.2.1"},"_id":"@ashnazg/yog@0.0.3","_nodeVersion":"12.14.1","_npmVersion":"6.13.4","dist":{"integrity":"sha512-MHs5EA4gXLH1nA6sMQns1Glyq+5QW77VVxFtbcRDPAQnR1M7NgHj6+ohHa9lbBM/faNSqW5GEoDXEljau1g3qw==","shasum":"0c282d32c34e17441e63cefb05cdce993e0bc676","tarball":"https://registry.npmjs.org/@ashnazg/yog/-/yog-0.0.3.tgz","fileCount":6,"unpackedSize":10414,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJeI9TMCRA9TVsSAnZWagAAR10P/2YjP7Ru8VZcQVf6OVyP\nNpg4D+rH1bsLUDmnE/eyDM0gUjBVz7jwN82yA3WEPGcEEt0+U1IBkGCv2qQW\n/KZZtttKEZTjSnKTwZ/Z12iyysoxgehBwP+V5DJrIqPjTMWw7eoSQH5EIpGT\ngXan6c/PKqWhmjseZFnnywTIu0zVnqtdbu134wKAIiGrR3zwEtUOWgMOWy6e\no3xlHVa0sgf8mQHJt5V0rvdY5+yCxz3ZEPr1zGDKS0xFOWsZdW/66aNe9qXs\nL6d0v9uHSq8k/gBILT/g/D9fSl/RekHkDsoPr1OA0lxG6hQoFDbjFf9vKVPM\nS0Qd/V+Wq6VBf8wxE/LBm9farObcYIuFd1ucJqhAHU38becbXcAwdVKmJdwQ\ns3DQf9kgYMIUQ+lLvu8fPxc7WLJsgtxmaGH0dpChFzbl8k5fcXTMi9Pnk7pj\n4IfiT/bYKuycYXoZzMV2XclcFhEXW9fmeW20r5/wh0AMDKcZf+TpMvE6OM3D\njvsfrpnSSzsE3TBffME4A2p7fPyPl0x1GsfWLCQEe4N51PQEgZH+dN/OIxnQ\nE/2C1MlbK3Na6z+HoERvq8LVbggAb0rvspVwzOjqUhkadoy65FKZaPty/JmZ\niLCjZeUWStU8OUWuix4en1a9STCVuttdWbhvOEJ7N8AdEXoaQ3+tens0okNB\nRcYz\r\n=EWBo\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDUhkyFODAEjG6IqQPxpx0C/x8apVYv/p9tnuEbD90rpgIgf7kw9ItTELrywfsoxQuRFGZDUvead9AMYY92BVBW3T0="}]},"maintainers":[{"name":"xander","email":"xander@ashnazg.com"}],"_npmUser":{"name":"xander","email":"xander@ashnazg.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/yog_0.0.3_1579406539567_0.8437644310668013"},"_hasShrinkwrap":false},"0.0.4":{"name":"@ashnazg/yog","version":"0.0.4","description":"a websocket server/client message bus","main":"auth-server.js","author":{"name":"Alexander Mathews xander@ashnazg.com"},"license":"MIT","scripts":{"serve":"nodemon demo-server.js"},"dependencies":{"bufferutil":"^4.0.1","markdown-toc":"^1.2.0","nodemon":"^2.0.3","q":"^1.5.1","utf-8-validate":"^5.0.2","ws":"^7.2.3","yaml":"^1.9.2"},"_id":"@ashnazg/yog@0.0.4","dist":{"shasum":"5841c8859af500dcda398655d3883b6be91f6047","integrity":"sha512-x1UkMpZv77nj5orM5V0d74MAFS01KyJEjW+2Pz57la4Dxs3edmxhDKieY9h3Mt2ecdRe2ANeQLwv5cBpCjGZMQ==","tarball":"https://registry.npmjs.org/@ashnazg/yog/-/yog-0.0.4.tgz","fileCount":15,"unpackedSize":32757,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJeqc2NCRA9TVsSAnZWagAAingP/iHtk6VwqVylbnIEKQcj\nXfE6BOjxU57+xZOAqo/BddPhbMAEr/fNNZffX/wuYd1vKSTJ9cQFJsNIjbj6\nwasN99AHbXslNvu3tcSwmWhdOPDAYuTyJnatlYRuokYLRp+OMEk5i6z4U/Zp\nw+uqwMB1KdnqXfD+a7/fQNB6kHTy/PDzgc46aB3Hi5ovEp5ieiQ90FeWRY6g\nhZ3R1nb1vfvMxSTiOo2KIhAjTN9umZClONtR6F7LzuyzAhVUS7QNQDO4yhN3\nqOZ0bJtcW2JLniOH5i5JU9UqVEvcYftRcuJvkeftW5IMp2f1ezm3P8j6gvIU\n+CBcMzO0hhVc4hXqAGvi1ZhGGHObK1JxZJTpfXnaMrE2XdxdNWc7XvyHCS6b\nM10DrVIT1hX2FGN1v8mL6ZCBQFC9Xhwaq1l6TjWyJWZfmoJOoqX+huoGVH59\njy6mZD+PNtLGNyllDoSrSIzMym/bXec8JRsRi7cofOYHNwqs8/Z7AXb9rVTk\nRyeioYMI2RDXtQy3vvfqvDs52dNsgcRTrHqEl3FvqJVacuTNI9JXe48epVHn\nS3g4rk/kWDtlcK4fGRdEfw9WEPgN8LbfVx2T6LU3wfLFDBGZRdbmr3PJPDti\naoyr2ayff8YQoTdffugVQgQP/BAQCXyazPCa1rbQgn9ewdqyVQBz5xYWKqDF\nVK6H\r\n=jLCl\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIDxmukHrpTr2cQ1C8XC8fav8NuAQvleS0F7cF7MQaQFoAiBaM6cgUtZdcjfJnYQ+QIYgmj9kAdC9W76Shxdhiihljg=="}]},"maintainers":[{"name":"xander","email":"xander@ashnazg.com"}],"_npmUser":{"name":"xander","email":"xander@ashnazg.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/yog_0.0.4_1588186509481_0.2622313377890324"},"_hasShrinkwrap":false},"0.0.5":{"name":"@ashnazg/yog","version":"0.0.5","description":"a websocket server/client message bus","main":"auth-server.js","author":{"name":"Alexander Mathews xander@ashnazg.com"},"license":"MIT","scripts":{"serve":"nodemon demo-server.js"},"dependencies":{"bufferutil":"^4.0.1","markdown-toc":"^1.2.0","nodemon":"^2.0.3","q":"^1.5.1","utf-8-validate":"^5.0.2","ws":"^7.2.3","yaml":"^1.9.2"},"_id":"@ashnazg/yog@0.0.5","dist":{"shasum":"0901a29bfd6e5e15b0c09b719ab6e7090e05cd59","integrity":"sha512-tnevIus2qNBU1fAFWt0k0bxHOK2InMMI0764Xi21otnH2wuHScT47/yvuLHAGjKJ7r2i0Ymof1tqZIMkSxaB0A==","tarball":"https://registry.npmjs.org/@ashnazg/yog/-/yog-0.0.5.tgz","fileCount":15,"unpackedSize":32823,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJet3ZBCRA9TVsSAnZWagAAoJMP+gMMzBzH5qjAI4nt7HyX\nsAVgaXmvmWslcPYo4/t46wMHelPLp377MOBbClxmlnOVAsWTZ+1FWC0t915H\n6PjDb15qqH3P0jY3F4DcgEi9m0GEJ1yQ/fncobvv0+YRAmqsgDSDPPP4Ngl3\n78HkNvyZQPKz7LO2qKV1PXIpqd3vfnuU4oYvw9ZRMywELlj1VPQGtT9/lWdy\nokx+QskYdFIAkXAmSYK1cS7Q/Lyj162p2tTrJq6uXe2zuwLp0PfBI+Ld/96K\noLtUY9xzqhKozldl/FUWo3au7FMijPzWq1PgM3X2QhUXlbifUbuHpcGKwi43\nlVaS/9UVpkDIm4peExeksTRBYv2c0d6OYmJiyeLVV8cXKVrIFf7fwu/qqX0P\novcHE9uahPUOyapLTwObczV5agMCa2cw8ytfxsWeg0o+zinmCwE7yJ3U9UqB\nCi/RS6nzaIJKKkHOG6ynD5bEmuuWCxnn0F1GHXFZ24WboCfg/wYr5AFPT72H\ny8BfjzjBx+nCl6DHYs4dC1t5+1WFTDccuenCpWvh6SNxbYpB6/GyCVxoY8T7\nTXmGqJohnOp1Kv7hd+Qq2wB4NJKdJZiv/vxNr9y/f/yv2lP09+h6NJUs253F\nu65ZwGmW3IkpYb0qNPXFEOZppHNxkvmNyHB+GOo+HawYUbir0fG2a5mivv7e\nmMa9\r\n=Mcce\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDlDKlAKmjHb8B1BI8PsvmUjTp8gFfUxRc96s57705NQwIgco4Jhd7ck+CEIraZTj7vIW9Zph0JvfUZEFUI1N2kEGw="}]},"maintainers":[{"name":"xander","email":"xander@ashnazg.com"}],"_npmUser":{"name":"xander","email":"xander@ashnazg.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/yog_0.0.5_1589081664959_0.19997889599056617"},"_hasShrinkwrap":false},"0.0.6":{"name":"@ashnazg/yog","version":"0.0.6","description":"a websocket server/client message bus","main":"auth-server.js","author":{"name":"Alexander Mathews xander@ashnazg.com"},"license":"MIT","scripts":{"serve":"nodemon demo-server.js"},"dependencies":{"bufferutil":"^4.0.1","markdown-toc":"^1.2.0","nodemon":"^2.0.3","q":"^1.5.1","utf-8-validate":"^5.0.2","ws":"^7.2.3","yaml":"^1.9.2"},"_id":"@ashnazg/yog@0.0.6","dist":{"shasum":"a45d11a44da80cded7a36d5f65931f8964b636cf","integrity":"sha512-YMhpeXL3YagWcNvI7HWPFtkqLMAJdZHgZo4TNi685ETi9E/5WKbOz3o+7ME635WcNZhp/KzfjGoWV70Qil3Pog==","tarball":"https://registry.npmjs.org/@ashnazg/yog/-/yog-0.0.6.tgz","fileCount":15,"unpackedSize":33423,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJewh0TCRA9TVsSAnZWagAAAlQP/jmVHOu1UoMutYdcWkU3\nrAEaGgNCgD2VPybmzWNke/EoJOE46fQz9weBu5le59Jn5TioYlGUWoEeGVPL\nD1SypHy2em1TsADkTaDRM3Vz8ndbQtl36oYtuAajI/6ogdO8I4WXHQ1ObsXJ\nRq0vGGZs+UbrC4kU8MjY8kEMQmVCjqMsRZSkS7wdpFYec8nyl5qaRdYNlKKB\nA5BIcBdzicrLI/61uTzfxiZDJ7QBjRWhG0zUWAjfc9Y1+7mRpCax87WUsd5W\n0HyrvjDX8l/CCrbp91B4m1Xt4EMueeu1zfwC5n5aYBLZ986vZF4nnwb8IiwI\n/hBAJ33aNFaOq/ZnqsdQIea7hA7qE+wJv5PlYeV0hOu8fZNcqUFg4ueW2wLB\nDhYBIHapC4aD7/tOhMyK4/ch7OKrO8993bU5+xe9fjC2ZW1S/LGhpK6nZi8K\nmfrYNuk8zpBC4eifwoTEh85nsS/Eyb0tq5CVJEqlHHj/iA9YqQJpYDkkycuB\nbnJ9x5TJW9X1IhaP3mEq9ImONT1kpqnJ99r5P8L41dfNg1hmqIMakknms5Ma\n+RkRG6EOZ45ihFBRA/TZqzg3Q8s4bb0smnglfbLZW4XY0+iSAU7PygT0LvUe\ngAI5pfP5q5ZmTtPiRlOMxu3Ub4TZXdX/kfQY5DSeFsTEhJGEqfz0BB9TNgRo\nTmor\r\n=0SBI\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDP4HEf5/5ns15rjkS5M3mF1TGG+ZWT4/6VBN/TbYzDQQIgafH3J8qy4Mw/kjFZFsTZ8rrZ+4CsDI6FqqM/BqVNfpI="}]},"maintainers":[{"name":"xander","email":"xander@ashnazg.com"}],"_npmUser":{"name":"xander","email":"xander@ashnazg.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/yog_0.0.6_1589779731320_0.2821219748952706"},"_hasShrinkwrap":false},"0.0.7":{"name":"@ashnazg/yog","version":"0.0.7","description":"a websocket server/client message bus","main":"auth-server.js","author":{"name":"Alexander Mathews xander@ashnazg.com"},"license":"MIT","scripts":{"serve":"nodemon demo-server.js"},"dependencies":{"bufferutil":"^4.0.1","markdown-toc":"^1.2.0","nodemon":"^2.0.3","q":"^1.5.1","utf-8-validate":"^5.0.2","ws":"^7.2.3","yaml":"^1.9.2"},"_id":"@ashnazg/yog@0.0.7","dist":{"shasum":"345f0bd29c5980f886ceb3f7936f2c0cd5c2a0b0","integrity":"sha512-vY/ZgVXVpL89+Xo0EcLNalfTJZE5kNojn55fXVlhEQnTidmCrV/ha11HEMSS0cIDgYaiRDZKItVRW0i1RUSYdg==","tarball":"https://registry.npmjs.org/@ashnazg/yog/-/yog-0.0.7.tgz","fileCount":15,"unpackedSize":33592,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJew1IyCRA9TVsSAnZWagAAFBsQAJJbfMQdPsJL36QNVh9M\n6sOJDux3Z3993C62wXyy6R2mef+euSt0YnsjNrhlOb7SvsK4X0hnBMb5N9TO\niDta+SprXZS94EA5CBamV9tCN2KOpgBgYJawNLfs/x0Bn3SZqG7GY3jtFSzT\nro0EOPCEB2nQp/nUaExAfrF6/Nq5ZsAq0/mb6FYQX0nvYNAiicBhBlCRf4k8\no51jiT+7hT/JKWDwD+1Vy37FdYZYstkmxPQwbwrzAAg0L6rub/m5m2+IhUWE\nSLJQzrzdDoFjDXFrgYwQrkw5kK4BtnEBXz7lnunO1tVWDTWGt6x4Wu9IG6J4\nAOZipLHEDIZKu6T4COic/PCYW+WOaYbqbAWipr/opRfUmzICo1xw0tEYOf+y\nE353xnOJixSW0SqEjNgNwt/5oQTnGtbmoSuOmrPFilaGVBvsBWVRvsiM3Z8O\nlVNxrHY5wqkhxxncq0IofGRWScaLssRtGjCFIevsLHGVsyJoDHqOxdej11AP\nsBT6RSeuTfy9BEKWRRN4RMLnARj+w0i6oFjETWBhgroPPt9x2aJj+29BBg9Q\nAGTGjegyWXSA+H8xMRycV8eBPGy3nundWsxXB3tnep3Lm7QmEy/WSJXIvD1f\n26xYK25j+97W1apJU9Ajo0qPDFX+ppMWcGLz1FdTQ82sJzYOzxp40Clv32zn\nERsE\r\n=/dXD\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIF45Ozlgf2TVs8q2ejq8WfV0fARX4Qn5PvQc+lpmpf6KAiBtq7JUTRx+L/9M8vJpthp6NFuv+zKMD9DqoEfisycH9A=="}]},"maintainers":[{"name":"xander","email":"xander@ashnazg.com"}],"_npmUser":{"name":"xander","email":"xander@ashnazg.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/yog_0.0.7_1589858865633_0.6388770915414896"},"_hasShrinkwrap":false},"0.0.8":{"name":"@ashnazg/yog","version":"0.0.8","description":"a websocket server/client message bus","main":"auth-server.js","author":{"name":"Alexander Mathews xander@ashnazg.com"},"license":"MIT","scripts":{"serve":"nodemon demo-server.js"},"dependencies":{"bufferutil":"^4.0.1","markdown-toc":"^1.2.0","nodemon":"^2.0.3","q":"^1.5.1","utf-8-validate":"^5.0.2","ws":"^7.2.3","yaml":"^1.9.2"},"_id":"@ashnazg/yog@0.0.8","dist":{"shasum":"0e3851e8f5498ee10b56b4ba4bfbadc116964c4a","integrity":"sha512-SZXPJBm+fpC1NEn5TayB2eSNRpQBaEOYVfeJLeliULeyA5WxXFx3CSsH7K/IEI/3SL0bzs95GvRmTfF/vglsCQ==","tarball":"https://registry.npmjs.org/@ashnazg/yog/-/yog-0.0.8.tgz","fileCount":15,"unpackedSize":33733,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJew/ljCRA9TVsSAnZWagAA1ooP/2loOKweLGEIVnXpYHuc\ngVya64yfbBwcEFoXWociDQSvpNS/mCjMo/iODSam5p4yTI71a/rqQP9uWGT+\nzOZUV8vV0gYSRgEMWet6SOK7WwPq8m5i9ijRdkSLA3NTdRvqB+OIWgsQNbtF\n1SLOIlJIhnWZMGnkOfAKMo61u9HBrREYcKvRtK9A4LPBeNX6Shtjsy1IX7cy\n9eiRrCdB9Um6YBldQECmIvQ4CQYiQTKP041Bp9VXj57FFJiJhs8l1ZzNsjYc\nSZPPxtib+XopNWBQ1/z44VHA10FiJ6ynHvWST/JS3Bf1TlkBsAPb3D3HOZ9N\nmA92Y4KCBpup6HBEV8zx3cEVdk3LrxZgKAatLWi5mmvTqXzYo5raBeF7g8nE\nCh6lXP/ZxJ4TMIHpyvsOcluJnllZjADdDS3a3WU7YhSMdqzDUyOQTApLuW23\nN0O4kUIVxKNFQYY+2+xrKFxL8cnFf8EawEMTbpLI2Cv7+q7Ln8EptHCa4WwG\nYn5xVYTkaVHuZ1+hLCy7K27fzkzBaKKfJclibZSDDIg7aLEKNGYU4XlCBBIm\nh2TlXCuofYMQ0zdeknHO/X5LL9UKCJg+MyAx2KlwTFwArr/5cJpDFTjr1adw\niNrq0rkDNxWt52fQbkWVLiwTQk0Vag+R8zg/rR/WpKhPyaeL5vUk2koTaqQf\nMy4e\r\n=58pN\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQC+9olGl+gbONXdh9LTXO/uUarWueyOk7Hl3FGqvsp1bwIhAOcG4JQ1pSTAeq/87l5pIVPmmHmIHY5Eg1xulfbnVHGa"}]},"maintainers":[{"name":"xander","email":"xander@ashnazg.com"}],"_npmUser":{"name":"xander","email":"xander@ashnazg.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/yog_0.0.8_1589901666656_0.13358847270492102"},"_hasShrinkwrap":false},"0.0.9":{"name":"@ashnazg/yog","version":"0.0.9","description":"a websocket server/client message bus","main":"auth-server.js","author":{"name":"Alexander Mathews xander@ashnazg.com"},"license":"MIT","scripts":{"serve":"nodemon demo-server.js"},"dependencies":{"bufferutil":"^4.0.1","markdown-toc":"^1.2.0","nodemon":"^2.0.3","q":"^1.5.1","utf-8-validate":"^5.0.2","ws":"^7.2.3","yaml":"^1.9.2"},"_id":"@ashnazg/yog@0.0.9","dist":{"shasum":"a427b789ecbb1a3f3b99d136cdd465a6d0e82ed8","integrity":"sha512-vpmPI3E66lwrwA5GMwoXesIkmquercG2hCYqEVsq3/8enbJ9ZIGZlCvelbmHEYZx425We/qjDlPo/3HVidwbMQ==","tarball":"https://registry.npmjs.org/@ashnazg/yog/-/yog-0.0.9.tgz","fileCount":15,"unpackedSize":34442,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJexAAJCRA9TVsSAnZWagAAooAP/17D3cgaRhrvSypQxxje\n+ZqSs2I885LH3JLtgUSYE+Glkcire23A6/A+S/NfYs0yWbejr9aKlYydE42k\nKLGWBHMb/s6I1HmBmZ/lgb+enzZ1f1lJKJEKaAQ/HiEV6Z1FpEJKOC0quURT\nnMwA4taZcCU6g7eogeeRXQzp1B/pGqbWTfzoabW8Y5J5yh7gf97sWHvuy4lo\n8cDvoUOZR7QcPMTxI0WI/dBUO5IGLPdD1Tn8i1lrSU6AoC4ro4tVFMM81dg1\nXmZ2aJtFf0y1jdqShfv7yFxSCBP57nmpM712yWH6vMNFxFzburfAnXLrxtmO\n629uV6h55frk++RP4Ry6T1lvEMwjQ6WOBD4rtiRgSe+2Jkuo1SGUuVOtjQ/D\nFzI9Pq3n3iFsGWbkAuetaRfM/wgtTymUttESZofpBgPiRkL4l6SMp2b1pZX0\noH86h0a72N5clWQs2U8MROCu8WV44/flJo5m3qPzs/5LbOj8egHZkdZQmICC\nURmEP4QNvpcnIyzq616bWEg33itp//eliZGOK0jMG66QR13XE5RnKMQI9161\n60K20vdBi5tcEIqIOtkyUnT1BwfDnLXDAJl6pyfi2JnK7zzNqyOioeU/WWHu\nVD67C7h3nbA60vN/7Wb+5+7wwQsMrZ3QSNgH5h1HOGyM5L6uyPIXw0ReLvLn\nHSnn\r\n=vX27\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIAaCj27dQoZZhcHUkI4fD55xgDt4rVww+wmvniL70OJYAiEA5BFpdaFhabJrIh56B6wPcdAYwMYSrGNGgywo0f1+Ttc="}]},"maintainers":[{"name":"xander","email":"xander@ashnazg.com"}],"_npmUser":{"name":"xander","email":"xander@ashnazg.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/yog_0.0.9_1589903369247_0.36030490927596737"},"_hasShrinkwrap":false},"0.0.10":{"name":"@ashnazg/yog","version":"0.0.10","description":"a websocket server/client message bus","main":"auth-server.js","author":{"name":"Alexander Mathews xander@ashnazg.com"},"license":"MIT","dependencies":{"bufferutil":"^4.0.1","q":"^1.5.1","utf-8-validate":"^5.0.2","ws":"^7.2.3"},"_id":"@ashnazg/yog@0.0.10","dist":{"shasum":"1e00764f52cb1e3ff10473f62a7363442363eae4","integrity":"sha512-VFYY4h4/eWtY87RQ4TdiBEGFmxZRxZW2NKPeDrsxVTifpw+aLwloaexPi4MPMp3/aWtBIZj23BB15gdsiMOc1A==","tarball":"https://registry.npmjs.org/@ashnazg/yog/-/yog-0.0.10.tgz","fileCount":18,"unpackedSize":49933,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJe0cIhCRA9TVsSAnZWagAAt5oP/j20kFmkd+nytvLtkz5F\nRBK9TiE9KoSMjRjCPCheurwCWLj5PM7+w2xlqA+ARZPC6r/X5nJHPtFBBG3A\nfBE9hL5itR9dRx114hOpgelDi/IFS9fm5Bcn6wbwwGNAJFeyX4SIldh4f5L/\nR7HGHlYFG91TUlkaydCnSpkBmYiCy9qBI6W66YYJPxoHE54FIx3BXYXCEBAq\nJArBDWwxWOIVqszzUPiUV9ZZREm3Pc9u3LxScSWZaU6/N3LwJCtrRphOeS2V\nMOXcD1fEEkivphUR9zaibMRTZxJLNACDhRzFINgk6T5znoQl2PBbF+5kF0M2\nKai66WX5cejdl/+TPr0RWRp62wSrsk0y+fzXLQq5pcazD2mhz1OxVCa2uTig\ncER/Xmg7WMrWTHhTSDbX5QXLHUXMG0OprCuC4RZLwd4J2lUud4PUwNzZsJ40\nLP/qWQy+LEfHJ9DBsdwo76qwAxc1kY45xZeXftCSGzXQyr2smepFMvvP7vXC\nd0TIa0prIDfEqdlefPAUQa6LdDUSY9FxXn3ez9ZJDf9tjRvFtPfTAqGK6EUH\n9Lldu+Qq1bLFObLjaQY8hGhBczf8p1INIzrfF8GpkTqn7/EHJet5L4SSWMSJ\n5yG2ZoMPDtqCZ5HQd0hpI37jsYA23GP3n8e+N0rgfqr8m/feucQtrjmjrgpN\n54Qa\r\n=A58S\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCeZi1WiGm+KHIZ2Zn0L3QwgBSJTJkgVZMGy4drWmz7xAIhAOEdgKo0VqNZounIRkamKkKQYpQn7LGkP+jZVMJE8AIF"}]},"maintainers":[{"name":"xander","email":"xander@ashnazg.com"}],"_npmUser":{"name":"xander","email":"xander@ashnazg.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/yog_0.0.10_1590805024998_0.20702217434966008"},"_hasShrinkwrap":false},"0.1.0":{"name":"@ashnazg/yog","version":"0.1.0","description":"a websocket server/client message bus","main":"auth-server.js","author":{"name":"Alexander Mathews xander@ashnazg.com"},"license":"MIT","dependencies":{"bufferutil":"^4.0.1","q":"^1.5.1","utf-8-validate":"^5.0.2","ws":"^7.2.3"},"_id":"@ashnazg/yog@0.1.0","dist":{"shasum":"1cb8b55e6f641fb7da9eba09950a85a8c41a04e9","integrity":"sha512-vZV5oyCD6ji5ZBfPhmjpZjlr4pnhX8Run+6EM6ihZsRuGUq0MaDwuhjg/IpDjTEnfnN2eQLP2pFRleVlq8VGkQ==","tarball":"https://registry.npmjs.org/@ashnazg/yog/-/yog-0.1.0.tgz","fileCount":19,"unpackedSize":59131,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJe3qAZCRA9TVsSAnZWagAA3DkP/RF+lKpBvZ2nj/WPclzU\ntpiGST53FI9fNpTiOuB2eJHdw7xnpw20pkNyPumNyJyQvIz1l4TiAhMaYqB8\nUpRPAMTho6KQwlvW5+W3p+PCtt6WpWYeBguUgkKdavff4upIH7NrFWTenhAY\nyoLQUKsCewyaCNN2dVPWchJjx7bOMGzi16CkI+m5iS0QpuFTKRsq90zIKzJZ\ngZ7+vA2zQxgtU3NkJMFMD6nAZF1NIcKtzsTW13Ui+lMk7DA35L1OtkzqtZGg\ni5aBtkRSinym/kd5Y8xXc1ZIw0Tcg19iiWuuBoKxNIamszIV/ZDsF5KUa2o+\nhoiaizyr6Rrn+zac0qN43zvB8Fa9kojYxcs/OyrMI/itwKIpm4HXtiIxoM79\n77MGnOZ7bccMe5JYugAaU19AEov6PcdpANFYcetaAAqETHKLUxhzjUNxBvSK\n/+czenjBA2s9Pdsx6MWacjX4buR/be3rF2Zn6JL/hV/YjuifnHYb4KRJHAew\n4psj+n0qqPQvb2v8rjQ/xKKwlFrU+TNJupA3HpA1n+fT3Atcyl+M7UmJm2Fy\nXtDucIhZmcWEa877Je+5oAhZN0UxMCLk7dNuJj6GnpG3lYZ5cHYEyAtJGpTq\nQ745/h1Dy+6WgLLCN0m1HiX68Gd8zdXgITdF76lgxRRu3x8hiJBJDy8YFU8S\nGcAT\r\n=M+Z0\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIEQBcvxd4tVv0x+DWA0eFfdr8oReik4AhNxeRb2I0k2yAiBydlyEIzPPKPrfWISExEpEjbBSlMIsg5u3CtV5PFAJ5A=="}]},"maintainers":[{"name":"xander","email":"xander@ashnazg.com"}],"_npmUser":{"name":"xander","email":"xander@ashnazg.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/yog_0.1.0_1591648280691_0.88744840732887"},"_hasShrinkwrap":false},"0.1.1":{"name":"@ashnazg/yog","version":"0.1.1","description":"a websocket server/client message bus","main":"auth-server.js","author":{"name":"Alexander Mathews xander@ashnazg.com"},"license":"MIT","dependencies":{"bufferutil":"^4.0.1","q":"^1.5.1","utf-8-validate":"^5.0.2","ws":"^7.2.3"},"_id":"@ashnazg/yog@0.1.1","dist":{"shasum":"bb2614818ad6570be5160576eea88bbfe17aae1b","integrity":"sha512-e6Pl26O9OmHGoHmsVtaKT8DunzCntwNf0JSmf529H6t+Dor98Lf3m9sYD2UdY3nA+VPWQR11xAXozisFl9d1nA==","tarball":"https://registry.npmjs.org/@ashnazg/yog/-/yog-0.1.1.tgz","fileCount":19,"unpackedSize":59133,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJe6PLrCRA9TVsSAnZWagAA0DkP/0B4nLfxgiiFLHo+97+E\n2ppAj0GdS/PggMK8ueIZVZVEVjDhm3MuIEKQr7EkWm0V0+FiwWIfL2VaJn8q\nPnwb4ZqIjeBo3ud/TT9mim+7AAD/SvfnSP63rgA/WJqZA+qPfZb4DHlP1MXF\n0faJO7gSNThyv2EGWnbxS3/jTDXeP4yLJuw8IZkxvT4lsUQ5DGm5B1z5AbNK\naAD4s/yPMFTzN2BC8vfMPhVWmaHO75KoGeIl7Ekzxx9LVI3CxBUTmO1KguDf\n3NU/miq+37fq4leILpyo68/v0mkwiasHuPx9yfrE6ehM1DHyBegob0IOx3IS\ncJ9Ku6cCRSe9jSbWjP6+klJ+EXuWvC0C65kzZi22/9+W3/kev5nj4GXIOdzx\nhCYiBus1UVJtMTjLeRmsaFdrE58DGe0qHQDBWAKBfaUwGCLcp56pXLFqtzD8\n+JSze6v2RqaOW5WZ6XjKiFvTutZkCvga1mgPQti/voey+pBakkI3XuX2pURw\nhtEXgB6aeIgRnR1l6vmZ2pH7oyK4hzIRWwUzWAV2yBHds2KngdjUCbr7y6Nw\n/K4xSySFs9Wrp3s4QrktS+vdfdV7bs2AFYyfvBWqeFHAwpzTwZhCvRr5QkmB\nrVjMsXDN6/qXXsmWTHucuPQt0+NwK94zG8PHQ8XQHfbUodRAXrBq94ddJw1M\nSQWo\r\n=ncDo\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIAh4mPkgkV9hslsL3g6t1DOqgFfzRpkMuUaKcDSUvmbmAiEAwJsJJzqhvMFcQRU7tMesRwSUPN1P3A3TKVJnff8hQ2Y="}]},"maintainers":[{"name":"xander","email":"xander@ashnazg.com"}],"_npmUser":{"name":"xander","email":"xander@ashnazg.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/yog_0.1.1_1592324843367_0.00469822735474712"},"_hasShrinkwrap":false},"0.2.0":{"name":"@ashnazg/yog","version":"0.2.0","description":"a websocket server/client message bus","main":"auth-server.js","author":{"name":"Alexander Mathews xander@ashnazg.com"},"license":"MIT","dependencies":{"@ashnazg/dumbfile":"^1.1.0","bufferutil":"^4.0.1","q":"^1.5.1","utf-8-validate":"^5.0.2","ws":"^7.2.3"},"_id":"@ashnazg/yog@0.2.0","dist":{"shasum":"9bd977f15afc0cca723dd2c9f6639a441996e7c4","integrity":"sha512-qWMYJRDpsTDPMMl6zq/SwWCxhVV4n1gzyIuULIdtDbxKOUzjmT/hGfbA/t5xshQL+KNFlTndIGQqAehsw2kBVw==","tarball":"https://registry.npmjs.org/@ashnazg/yog/-/yog-0.2.0.tgz","fileCount":20,"unpackedSize":64205,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJe6vL2CRA9TVsSAnZWagAAqygP/jDi8hdFRw5BBf3RnwD6\n52e01mJpdU5k/hh3DvUg+rOzputxRAPLmiHG+HJBfjHqbRm9KhYXwt3VjYQF\n5pCv6fGERq5lLTZiy+iRcn0DHo0z4Tm2ytlRarKgzU52SR+rTa9KpOXg+7Pl\nLUc4B59Grw7mfiufUwR5f1QspBLBq+FYzD2xkWp7oObGzcKk49Nx35CPx7kC\nKmoYzLDoPsaodNGBP9hvTbz5SyVqw+szYViF5jBnjRr2NAHXsiTsHRM3Rc5s\nK9ZVMswEiEDwuXKWt/iKA9FVQmZmL6RzIwBNX/E1gjy75Jlg53qA2c7ydwAH\n8ZWYSjpt7kcDSuN45aynPL6JfitOVGPWzleP0z7HRelm3e3yKZvH1Mj0jRnH\nzYANnWgKKUdbv2Q5oVmiDAgkUfkM/qocvvyTYqdIDhCjwk0KC7LKJvuF8KZP\n2b65mT1ZqIcS33itsGThEGiKnGvc634Z367BW0rvJwYthyVwLDH9Ta7s6fZ5\nMdJrPjuvCYtgRG/4Bb0ltB03bOrX1p6hJGAY3tb7hjya+8gGlAaL5d0Bq9fZ\nFjV2iJuZcVTus1A6dq7vOeFvG97FTKmOX5ZJaFGCt5VRXBC6m5fG7y/F1IeM\nR2TCxHGAnGYGgvuQz23oQnBQGmIIVJsCgT/ey95ltMcsQSJk+3gtG5DSz8PM\nSdbp\r\n=+7H0\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCeDYdjc84HBODSt4f39OFmoxgb7fBnlWOlI502lmYsiwIhAKzjsDA1VdOpgzCdRXndFSCLyiriVSIpMOqNCoZr+WjU"}]},"maintainers":[{"name":"xander","email":"xander@ashnazg.com"}],"_npmUser":{"name":"xander","email":"xander@ashnazg.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/yog_0.2.0_1592455926036_0.47928158374941177"},"_hasShrinkwrap":false},"0.3.0":{"name":"@ashnazg/yog","version":"0.3.0","description":"a websocket server/client message bus","main":"auth-server.js","author":{"name":"Alexander Mathews xander@ashnazg.com"},"license":"MIT","dependencies":{"@ashnazg/dumbfile":"^1.1.0","bufferutil":"^4.0.1","q":"^1.5.1","utf-8-validate":"^5.0.2","ws":"^7.2.3"},"_id":"@ashnazg/yog@0.3.0","dist":{"shasum":"575af1f116696b41a2775484d586b5b89f95cd61","integrity":"sha512-ooHDfd7E0UanmqVVfFnD6Bm+4j5K81AKM86JBM2XkHpvhtD79Cb5ksoznTjlNQ9K5m0tDBUo+23+olBz6qpypg==","tarball":"https://registry.npmjs.org/@ashnazg/yog/-/yog-0.3.0.tgz","fileCount":20,"unpackedSize":64276,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJe8aXNCRA9TVsSAnZWagAAGA0P/j4SpWv7ojJW96w8XFoi\nj9ZKT/z+6BjSPPgDkD8srvBRKwV+0cCxp8xY/69FG7ES4Pr2a2iVWrzwkMhw\nd92ISRUepM2gtfdfbWLLEE9hkU7gyYac9Hfuhp9H1yoZx5Rd5bqI0VCbE1vQ\nmUt6sIMtT8wOvhr/ZXE6doLJtPsaEdnGQINQ66Wn6OEmNJc3eG1+899u/mH1\neFsNTmHrsTboPW1OQ5AMwXe9i8eegHFHZCAdYk1Q/cv1jtnmaxufY17t4ucZ\n/ct2iViqobTPFPpZUTcoEUAJ7u53WBZX1F3JcP0WAGARYSHZCFLdvB5vK8Eb\nh2HEqgMKALmkEhgNYSHyTOIEvrd32MubOMvgdzHrtIzP60L85mUZamBH/s73\nk7GsAUOUgwuXMBz+dq0TGsE0AMPS+NxjPz7xErldldb+ZE3hSKaCj2+Xpnm9\nkHgVJlQpjWT/tAwjGbKx4kEOODN0qebJhJvUY3UJejRR8ecgdtIEQ9gR6oA9\nLqZ5dD4avOm80vGexfUvDD1nYNXHjm6pf67tzm6/XEJe+L7teRdh0VwId41n\ne/BWZBZ6ycF+gGDCnEtEL7MYeM7JGRjR5hYd0fbLP1TjsU9RRCEt0m4s+Y97\ngOTV6bEapOGRfakyd7kmS8kt9dZULSfVj3g7mqMqcd8983wA5DdU6v7okH+z\n17WR\r\n=Vv4b\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCICvmwVB3eR5rAdB+Sd1Iyqqi43iurqQqG3Fl9P3ifdzMAiEAoxq0T+h2anN8VlzEejZ3V2V33WEnp5ZTGMDs55iQ/0k="}]},"maintainers":[{"name":"xander","email":"xander@ashnazg.com"}],"_npmUser":{"name":"xander","email":"xander@ashnazg.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/yog_0.3.0_1592894924645_0.8280031988777592"},"_hasShrinkwrap":false},"0.3.1":{"name":"@ashnazg/yog","version":"0.3.1","description":"a websocket server/client message bus","main":"auth-server.js","author":{"name":"Alexander Mathews xander@ashnazg.com"},"license":"MIT","dependencies":{"@ashnazg/dumbfile":"^1.1.4","@ashnazg/utils":"^0.3.6","bufferutil":"^4.0.1","q":"^1.5.1","utf-8-validate":"^5.0.2","ws":"^7.2.3"},"_id":"@ashnazg/yog@0.3.1","dist":{"shasum":"9913da9c78c58885f8bc1b118619894829b39a2f","integrity":"sha512-4dhW+/h2kiHXAAhxqfalD6fdFrJ5u5Ip2DNrPByejv5SWPWaD3/TPmEroKwX4BOcR5rMAsy6TkPWJhhqhxB4Ig==","tarball":"https://registry.npmjs.org/@ashnazg/yog/-/yog-0.3.1.tgz","fileCount":22,"unpackedSize":71446,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJh3NiFCRA9TVsSAnZWagAABxYP/2L55YqDhHdRtbXhQHtA\nPYbxfbvwcLeT0cdyUTbKMLoCk0hAgfISHUNkOBwcxonxS0clbHIrfsILhfBA\n9Afc/JoBQotL7axV56X6o5M5iRW8G/Z5kWTQrLGOzFOiq2lym5VPgRe/f2aJ\ntC2/Cls2dDQHj0tFcJoCXg1D7VJRt4GxowEBH9/nf6OcIyNExgbwCjH0ZFdV\nfpUL61wssnzSrkBDMkS14+DNLgn2jcpP3f2aLAiNaxwzib8KAfF2VVQPV3X2\njDlbPRHDlG62MCC9TlddjoZbclYuC8IeJnXgbeo7xfe2JVADPL0Yl3nZoYlM\nOC47a4R7i/yJhX4eQ5JBCtsM3q9fxzDcNBZhTttBEVyXrhTXhTTrrS973ASN\nUGZ7M9CzKRSD/3pByUlbkfrKsss2X+IfQYtx6XMLopLMiO1rOQ7g0qQtaHIS\neylCHFBjH6GlYIM8NrCwHAXNUMzjrfWpBS7NG8EdBVUtuPmuZlY+iIMrdJ/T\n1mg2BN45T0aGJdQ/bFOCQ/BYvKT0NiluH53+d5rQ8hjnogm6fHzd6DcxfXyQ\nVC8a5JdmkVPG0SbIfZLqjm23Bafnn42Dcp/j6vFXV7juF7EvQxU0mq6qQ28x\n5EXuE7QPUD6h0KWQ1Jo62xz0XgjQCVF5PbR2OSrc4ZyfNMBattAP3tS6rImA\nstnz\r\n=rUbD\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDRufkRK6aZbiITsQeNs4sOjZWp09Da0s64AOF3ES6u9AIhAJsZthO7Z6Y5Eh0nZ4QOUE9UqzOBt5g92DID4N5uTKUQ"}]},"_npmUser":{"name":"xander","email":"xander@ashnazg.com"},"directories":{},"maintainers":[{"name":"xander","email":"xander@ashnazg.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/yog_0.3.1_1641863301207_0.22321673786681218"},"_hasShrinkwrap":false},"0.3.2":{"name":"@ashnazg/yog","version":"0.3.2","description":"a websocket server/client message bus","main":"auth-server.js","author":{"name":"Alexander Mathews xander@ashnazg.com"},"license":"MIT","dependencies":{"@ashnazg/dumbfile":"^1.1.4","@ashnazg/utils":"^0.3.6","bufferutil":"^4.0.1","q":"^1.5.1","utf-8-validate":"^5.0.2","ws":"^7.2.3"},"_id":"@ashnazg/yog@0.3.2","dist":{"shasum":"8fbcdf70f67113e631ae09b22c6e027bd469f04b","integrity":"sha512-sCXknmx16CfVOtOEkWCFkaq8utl7jcKZCBvgeFvzr8vbPjAyyF1S4pXolHKLevi89NoY3AJYiriIhaoX8Y/YWA==","tarball":"https://registry.npmjs.org/@ashnazg/yog/-/yog-0.3.2.tgz","fileCount":22,"unpackedSize":71710,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJh4Q21CRA9TVsSAnZWagAAB6QP+wZNRhMgY+XftbqKnOLT\n7e+SOoHYSWIauQrptp4p+BVtbz/9p+eFvE1jU1fAgA3bXIZEVtd83CGd4JCO\nv3qma4RGAd7Sph84O8ZrPM8gcCqTs9gyccZ3trgThl2LhfMeClSDB5Vu45/M\na+D6y5IcENQmQvJE4XoUY7WVOtLAnYbR6mN66v7rPCuoTudBpnkh+b3Hiuhj\no796c6xBR7ZWO0mUk7Jefiug2gEFUswIOHaHe6XJoR+oMxBSG7UdeN0nfoQ4\nO1Nfz77mQI6St3PPiu9AJsi8BlmfDWaqCquWEGyypC0JmbZk9MXsRl4IuqJU\n+SoXbTJQoeh4adYtq0TmlX5Rd7gL6+X5e+9hCtpwWD+C3Es63CTqwPMSAHX6\nqBibeP9e4vP+zzFCGAmH9Eo/v5gsL6JMsISOlFKL21p9VQJ3LgvkPS957DtO\n8RNxBicqsYYwC7IDQvGg4dzsVOmA6rSfDa0VrOHCcw43iPWLy0ONts08XjBo\nybrm1zC8RhsYHf6IUiidweIKb7RSpHC9iNM8etvWOP8LIoePlGvQNincMWvq\nyQEGgRwoTS+2SGA+43C1KKN74iiO/93tw7Xumw/XjEpa4gxxaBQcQe3rFnWS\nOmDkcwb0PZaSU1xpCUyTn7l4IY/jR7fN0/W9zNKtLu0EdLM97Jk7/Coc5lzu\nizNA\r\n=Db6o\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCPUZbTGMOVvLtawnID0ePFNjA+KHpH/oi9TqlF6UZb+wIhAPzCntATuEyZGToyEyYvdiHqQJV1GsOr6CJ3kFntfCab"}]},"_npmUser":{"name":"xander","email":"xander@ashnazg.com"},"directories":{},"maintainers":[{"name":"xander","email":"xander@ashnazg.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/yog_0.3.2_1642139061120_0.3288867708498784"},"_hasShrinkwrap":false}},"time":{"created":"2020-01-19T01:02:47.423Z","0.0.1":"2020-01-19T01:02:47.720Z","modified":"2022-04-04T15:45:56.302Z","0.0.2":"2020-01-19T03:03:17.351Z","0.0.3":"2020-01-19T04:02:19.765Z","0.0.4":"2020-04-29T18:55:09.576Z","0.0.5":"2020-05-10T03:34:25.102Z","0.0.6":"2020-05-18T05:28:51.544Z","0.0.7":"2020-05-19T03:27:45.773Z","0.0.8":"2020-05-19T15:21:06.898Z","0.0.9":"2020-05-19T15:49:29.371Z","0.0.10":"2020-05-30T02:17:05.254Z","0.1.0":"2020-06-08T20:31:20.810Z","0.1.1":"2020-06-16T16:27:23.491Z","0.2.0":"2020-06-18T04:52:06.158Z","0.3.0":"2020-06-23T06:48:44.781Z","0.3.1":"2022-01-11T01:08:21.359Z","0.3.2":"2022-01-14T05:44:21.286Z"},"maintainers":[{"name":"xander","email":"xander@ashnazg.com"}],"description":"a websocket server/client message bus","author":{"name":"Alexander Mathews xander@ashnazg.com"},"license":"MIT","readme":"---\ntitle: \"@ashnazg/yog\"\nsidebar_label: yog\n---\nit's an auth / interruption-resilient / RPC / broadcast library for browser <-> node.js server that provides a high level interface over the low level websockets protocol.\n# new\n## Client\nIt decorates the client pubsub implementation:\n```\nconst pubsub = require('@ashnazg/pubsub'); // ~/projects/ashnazg-npm/pubsub/pubsub.js\nconst yog = require('@ashnazg/yog/bare-client2'); // ~/projects/ashnazg-npm/yog/bare-client2.js\nconst myhub = pubsub();\nyog.bare(myhub);\n\n// not returning promises from (re)connect() as this is just the bottom layer of a repeatable-reconnect system\nmyhub.bare.connect('ws://localhost:5000', 'foo');\nmyhub.on('bare:open', () => {\n\tmyhub.bare.send({t:\"hello world\"});\n});\nmyhub.on('answer', msg => {\n\tconsole.log(\"they answered with\", msg);\n});\n```\nOther bare-level members: reconnect(), close(), send({tuple}), state() === 'OPEN', async request({tuple})\n\n# old\n\n## server side\n### io layer: bare server sockets\nturns socket events into a server stream of: io:open, io:close, io:error, and actual data tuples that have a \"t\" field (of type string or number)\n\n### RPC and register\nIf you use `server.register({hooks...})` to make your singleton handlers for inbound events, your hooks gain:\n1. the ability to respond RPC style by just returning fields\n2. access to each other: `server.hooks[other_responder]`\n\n```\nserver.register({\n\tshowRoom({ctx, room_id}) {\n\t\treturn {room_contents: []};\n\t},\n\tplayer_joined({ctx}) {\n\t\tconst uid = ctx.account.uid;\n\t\tconst avatar = process(uid);\n\t\tconst room = server.hooks.showRoom({ctx, room_id: avatar.room_id});\n\t\troom.your_uid = uid;\n\t\treturn room;\n\t}\n});\n```\n\nRPC support:\n```\nclient.request('player_joined').then(resp => {\n\tconsole.log('my uid', resp.your_uid);\n\tconsole.log('I see in the room', resp.room_contents);\n});\n```\n\n### auth layer: server auth and security tricks\nblocks all requests til auth:login packet has been accepted by replying with auth:open\n\nauth:attack reports brute force blocking statistics\nauth:pending means that the client will be granted access after the delay\nauth:open (posted internally and externally) means the client is allowed to talk\n\nbecause all auth:login field validation is passed to the caller, the auth() config can be whatever, {user,pass} for a bare system up to fancy stuff like {user,pass,token,nonce}\n\n### session: takes auth and adds token-based steps for creation/expiration/auth\n```\nconst session = require('@ashnazg/yog/session-server.js');\nconst server = session.listen({\n\tsession_manager,\n\tlifespan: milliseconds, //a this param is only used if session_manager is using pattern 2 below. it defaults to 24 hours.\n\tcheckPass(user, pass) { return user_id; },\n\tgetUid(username) { return user_id; } // defaults to 'username'. this is like checkPass but is only used to perform the user->id mapping for token-handling, in which we don't have a password in the request.\n});\n```\n\nsession takes a state storage interface -- there are two options you can use:\n1. if your provided DB supplies these two functions, I'll just use them.\n```\nconst session_manager = {\n\tgenerateSessionToken(user) { return new token; },\n\tisValidSession(user, token) { return true ; }\n};\n```\n2. or a plain old JSON \"db\" and a save() method:\n```\nconst session_manager = {\n\tdb: {}, // yog/session will create a tokens map on this object\n\tsave() { persist the above db however you want; }\n}\n```\nConveniently, dumbfile has exactly that interface:\n```\nconst dumb = require('@ashnazg/dumbfile'); // ~/projects/ashnazg-npm/dumbfile/json.js\nconst session_manager = dumb.load(process.env.HOME + '/.socks-tokens.json');\n```\nImportant thing to remember about user ids and the optional support for anonymous connections. (And the fact that I have to say that means this design is being too clever -- but I'm not going to slow down\nright _now_ over that.)\n\nif your checkPass(user, pass) returns zero, that means to accept the connection but not bother creating a token for it -- anonymous connections will always just pass the publically shared user/password.\n\n## auth-client\n<!--\n~/projects/ashnazg-npm/yog/auth-client.js\n-->\nThis util wraps bounce-client in an auth system that can manage session cookies and prompt the user for credentials.\n\nAll of these utils will decorate the pubsub you give them with the [websocket-wrapper](#bare-client) methods.\nf\n\n* All functions provided by manager return promises.\n\t* if successful, it resolves to an auth response.\n\t* it resolves to {success: false, evt: {reason,code}} (not a rejection) for stopping points that are not logic errors:\n\t\t* connection lost before auth handshake completed\n\t\t* connection not attempted because session state was not found\n\t\t* can't start connecting, no network\n\t\t* server rejected creds\n\nThe library init() needs 4 to 7 parameters:\n1. a pubsub (which could be the engine from a project using mischievous -- that's the way I use this lib.)\n2. a callback: `promptForCreds({user, pass, error})=>promise({user,pass})` It's given any known creds (such as a username stored in localStorage) and must return either:\n\t* a promise for ({user,pass}) when the user submits them\n\t* a promise for the string \"cancelled\" if the user backs out\n\t* the error parameter is undefined in the first round of prompting; on later rounds, it's set to the server's response on an auth fail so the UI can display it to the user.\n3. a callback `showSpinner()` for telling the UI that an auth attempt is in progress.\n4. a callback `hideSpinner()` that will be called before the auth attempt takes the next step, whether that's to show the login prompt again, or to resolving the auth attempt's promise.\n5. a server-local api path to use in prod: if you give it `/yog` then in production, the websocket will connect to `wss://{current dns name}:{current port}/yog`\n6. a dev endpoint in the form of either a port number, or a full URL like `ws://localhost:5000` (that's the default if dev is undefined.)\n7. an optional websocket protocol name\n\n**Prod vs dev**: since NODE_ENV isn't directly available in the browser, connect() determines 'is prod' by seeing if the webserver is using https.\n```\nimport {init} from '@ashnazg/yog/auth-client';\nconst pub = require('@ashnazg/yog/pubsub.js').pubsub();\n\nfunction prompt({user, pass, error}) {\n\tif (error) console.error(error);\n\treturn q({user: \"anony\", pass: \"mouse\");\n}\nfunction spin() {\n\tconsole.log(\"look busy! auth is in progress\");\n}\nfunction fin() {\n\tconsole.log(\"clear out the busy indicator\");\n}\nconst prod_path = '/yog';\nconst dev_port = 5000;\nconst protocol = 'sample-protocol';\nconst manager = init(pub, prompt, spin, fin, prod_path, dev_port, protocol);\n```\n\n### login\nThis prompts the user, and for as many attempts as it takes til either the server accepts the creds, or the user hits cancel in your prompt UI, login will call `connect(...)`.\n\nLogin will read/write browser state to make reconnecting easier:\n1. on start, pull \"user\" from localStorage if it's available.\n1. on successful auth, set \"user\" into localStorage and re\n\t1. if that auth response includes \"token\", store that token in cookie \"session\" so tryCookie() can find it late.\n1. if user cancels the prompt UI, login will clear the above two storage fields and return false\n\n```\nconst auth_response = await manager.login();\nif (auth_response === false) {\n\treturn 'user gave up';\n}\nconsole.log(auth_response.user_name); // or whatever your server responds with\n```\n\n### tryCookie\nThis is for background reconnection after a network event or browser-reset; if the user/session fields from a successful login() are there, tryCookie will try to auth to the server with {user,token}\n\nIf either field is unavailable, tryCookie will invoke login()\n\nIf you want to just test in the background without risking a login() popup, pass it false: `tryCookie(false)` will just return false if there's no session.\n\n```\nconst auth_response = await manager.tryCookie(false);\nif (auth_response === false) {\n\tconsole.log(\"I can either push the user to login by calling manager.login, or maybe my app has a login button to enable at this point.\");\n} else {\n\tconsole.log(auth_response.user_name); // or whatever your server responds with\n}\n```\n\n### connect\nThis is the programmatic way to directly supply {user, pass}. In the envisioned flow, you don't need to call this, as tryCookie and login do this, but it's exported to the app as I've found it useful.\n(For example, in one app, there's a public {user,pass} pair for readonly access to the API.)\n\nIf the server auth response includes {reason: 'token expired'}, then connect() will auto-launch login().\n```\nconst auth_response = await manager.connect({user: 'anony', pass: 'mouse'});\nif (auth_response === false) {\n\tconsole.log(\"could not connect\");\n} else {\n\tconsole.log(auth_response.user_name); // or whatever your server responds with\n}\n```\n\n## bare-client\nThis provides the base layer for websockets. It adds these functions to your pubsub:\n\n### send\n`con.send('type', {fields})` works much like a pubsub(type, {fields})\nlike pubsub, you can skip the 2nd parameter if event 'type' needs no other fields.\n\n### request\nThis has the same two params as send, but request adds a 'q' field to the network packet; the yog server uses 'q' as a RPC ID. If your server-side endpoint function returns a message body, yog will\nadd the same 'q' value that the client picked and send that body back to the client. The goal of this is to allow the client to easily distinguish which request goes with which response.\n\n```\n// client side\ncon.request('readfile', {name: '/etc/passwd'}).then(resp => console.log(\"user entries:\", resp);\ncon.request('readfile', {name: '/etc/nginx/nginx.conf'}).then(resp => console.log(\"nginx conf:\", resp);\n\n// server side\nserver.register({\n\treadfile({name, ctx}) {\n\t\treturn {errors:[{code: 404, message: \"I'm not going to give you \"+name}]};\n\t}\n});\n```\nSince the above readfile() returned a body with no {t:'type'} field, the RPC handler will default it to the request's type.\n\nIf the server really has to send a different type back in response, add a third parameter string to your request call:\n```\ncon.request('readfile', {fields}, 'response-event-type').then(resp => {});\n```\n\n### close\n`con.close()` closes and deletes the socket. This does not impact your on() listeners.\n\n### reconnect\nCloses any existing connection, and then reattempt.\n\n### isOpen\n`con.isOpen()` returns a bool\n\n### readyState\n`con.readyState()` allows you to look at the connection's current lifecycle step.\n\n```\nconst bounce = require('./bounce-client.js');\nif (con.readyState() === bounce.CLOSING) {\n\t// too late to send anything or bother calling close()\n}\n```\n\n## bounce: is a client-side layer that repeats auth cookies to resume connectivity\nstate: never connected, connected, retrying\ngave_up\nretrying,\nresume\n\n1012 is the close code for \"I'm bouncing the server\"\n\n## queue layer:\nif a message can't be sent, it's queued until it can.\n\n## state layer:\nversions the world, xfers world deltas\n\n## server side notes\nio.listen(port...)\n\nauth.listen(... auth() checker)\n\n## close codes\nhttps://developer.mozilla.org/en-US/docs/Web/API/CloseEvent\nvs\nhttp codes\nhttps://developer.mozilla.org/en-US/docs/Web/HTTP/Status\n\n## future\n* FYI https://developer.mozilla.org/en-US/docs/Web/API/WebSocket/readyState\n\n* TODO: move to node-buffer on both ends, here's a browser-version:\n* https://github.com/feross/buffer\n\n* but find out what mobiles support.\n* https://developer.mozilla.org/en-US/docs/Web/API/WebSocket/send\n* * https://developer.mozilla.org/en-US/docs/Web/API/WebSocket/binaryType\n* * https://developer.mozilla.org/en-US/docs/Web/API/Blob\n* * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/TypedArray\n* OOH!\n* https://blog.mgechev.com/2015/02/06/parsing-binary-protocol-data-javascript-typedarrays-blobs/\n\n* responding in binary is straightforward:\n* https://github.com/websockets/ws#sending-binary-data\n","readmeFilename":"README.md"}