{"_id":"@yz-social/kdht","_rev":"51-589661a827fc9ec5169352017e4843e6","name":"@yz-social/kdht","dist-tags":{"latest":"0.1.53"},"versions":{"0.1.0":{"name":"@yz-social/kdht","version":"0.1.0","_id":"@yz-social/kdht@0.1.0","maintainers":[{"name":"howard.stearns","email":"stearns@alum.mit.edu"}],"homepage":"https://github.com/YZ-social/kdht#readme","bugs":{"url":"https://github.com/YZ-social/kdht/issues"},"dist":{"shasum":"5d576f52f27697a49877998656920e4940e21057","tarball":"https://registry.npmjs.org/@yz-social/kdht/-/kdht-0.1.0.tgz","fileCount":34,"integrity":"sha512-D8iDEU945KzHfOUiCnajlL6mKdf+ozOTcBKI8oDQzo3OVVCapiqpxxDIAqL2B0PyeHmj60LsCK6XlzKtT2hJCg==","signatures":[{"sig":"MEUCIBVjNxrOPyXENAQXO6Q5Y7moDbQqsr527VAdXP/Fog7OAiEApmK7F9L3XtPX082X+yqcA26vTIQ2Ot1eO3U8oJMuSm8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":133459},"type":"module","exports":{".":"./index.js","./portal":"./portals/node.js","./router":"./portals/router.js"},"gitHead":"9c1f0b0c834a8e246dd4b449fe704ae0bb3965b3","scripts":{"test":"npx jasmine","smoke":"node spec/portal.js --nPortals 5 --nBots 5 --thrash --nWrites 10","load30":"node spec/portal.js --nPortals 10 --nBots 20 --nWrites 100","load50":"node spec/portal.js --nPortals 10 --nBots 65 --nWrites 100","load75":"node spec/portal.js --nPortals 10 --nBots 40 --nWrites 100","load100":"node spec/portal.js --nPortals 10 --nBots 90 --nWrites 100","load150":"node spec/portal.js --nPortals 15 --nBots 135 --nWrites 100","load200":"node spec/portal.js --nPortals 20 --nBots 180 --nWrites 100","smoke20":"node spec/portal.js --nPortals 10 --nBots 10 --thrash --nWrites 10","thrash30":"node spec/portal.js --nPortals 10 --nBots 20 --thrash true --nWrites 100","thrash50":"node spec/portal.js --nPortals 10 --nBots 40 --thrash true --nWrites 100","thrash100":"node spec/portal.js --nPortals 10 --nBots 90 --thrash true --nWrites 100","thrash150":"node spec/portal.js --nPortals 15 --nBots 135 --thrash true --nWrites 100","thrash200":"node spec/portal.js --nPortals 20 --nBots 180 --thrash true --nWrites 100","serverTest":"node spec/portal.js --nPortals 20 --nWrites 40","serverTestLight":"node spec/portal.js --nPortals 10 --nWrites 40"},"_npmUser":{"name":"howard.stearns","email":"stearns@alum.mit.edu"},"repository":{"url":"git+https://github.com/YZ-social/kdht.git","type":"git"},"_npmVersion":"10.9.4","description":"Pure Kademlia base, for testing variations.","directories":{},"_nodeVersion":"22.21.1","dependencies":{"uuid":"^13.0.0","@yz-social/webrtc":"^0.1.0"},"publishConfig":{"registry":"https://registry.npmjs.org"},"_hasShrinkwrap":false,"devDependencies":{"yargs":"^18.0.0","morgan":"^1.10.1","express":"^5.2.1","jasmine":"^5.12.0"},"_npmOperationalInternal":{"tmp":"tmp/kdht_0.1.0_1767578461532_0.4247312320033474","host":"s3://npm-registry-packages-npm-production"}},"0.1.1":{"name":"@yz-social/kdht","version":"0.1.1","_id":"@yz-social/kdht@0.1.1","maintainers":[{"name":"howard.stearns","email":"stearns@alum.mit.edu"}],"homepage":"https://github.com/YZ-social/kdht#readme","bugs":{"url":"https://github.com/YZ-social/kdht/issues"},"dist":{"shasum":"0aa47d814433089ddffac127089c95db211a4ab5","tarball":"https://registry.npmjs.org/@yz-social/kdht/-/kdht-0.1.1.tgz","fileCount":30,"integrity":"sha512-lZ1tyWk9H7bderXSW5JhHukbYof/ebyJRVmfCEGynzJRNWg7B7o4kdGg1S6EaFEA795x6ZEN439mqtmA8ZLPkA==","signatures":[{"sig":"MEUCIHqY+9XWIBoe6v8vNkRGLeaMqquyhIM1575P9zOMOhrnAiEAl/d7PioYOK4+zd/d6Ib7on5igOLq8X+zji+DlFKOCJQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":118403},"type":"module","exports":{".":"./index.js","./portal":"./portals/node.js","./router":"./portals/router.js"},"gitHead":"de04d36dca602e203cb8e49e8fbb2672bbcd8257","scripts":{"test":"npx jasmine","smoke":"node spec/portal.js --nPortals 5 --nBots 5 --thrash --nWrites 10","load30":"node spec/portal.js --nPortals 10 --nBots 20 --nWrites 100","load50":"node spec/portal.js --nPortals 10 --nBots 65 --nWrites 100","load75":"node spec/portal.js --nPortals 10 --nBots 40 --nWrites 100","load100":"node spec/portal.js --nPortals 10 --nBots 90 --nWrites 100","load150":"node spec/portal.js --nPortals 15 --nBots 135 --nWrites 100","load200":"node spec/portal.js --nPortals 20 --nBots 180 --nWrites 100","smoke20":"node spec/portal.js --nPortals 10 --nBots 10 --thrash --nWrites 10","thrash30":"node spec/portal.js --nPortals 10 --nBots 20 --thrash true --nWrites 100","thrash50":"node spec/portal.js --nPortals 10 --nBots 40 --thrash true --nWrites 100","thrash100":"node spec/portal.js --nPortals 10 --nBots 90 --thrash true --nWrites 100","thrash150":"node spec/portal.js --nPortals 15 --nBots 135 --thrash true --nWrites 100","thrash200":"node spec/portal.js --nPortals 20 --nBots 180 --thrash true --nWrites 100","serverTest":"node spec/portal.js --nPortals 20 --nWrites 40","serverTestLight":"node spec/portal.js --nPortals 10 --nWrites 40"},"_npmUser":{"name":"howard.stearns","email":"stearns@alum.mit.edu"},"repository":{"url":"git+https://github.com/YZ-social/kdht.git","type":"git"},"_npmVersion":"10.9.4","description":"Pure Kademlia base, for testing variations.","directories":{},"_nodeVersion":"22.21.1","dependencies":{"uuid":"^13.0.0","@yz-social/webrtc":"^0.1.0"},"publishConfig":{"registry":"https://registry.npmjs.org"},"_hasShrinkwrap":false,"devDependencies":{"yargs":"^18.0.0","morgan":"^1.10.1","express":"^5.2.1","jasmine":"^5.12.0"},"_npmOperationalInternal":{"tmp":"tmp/kdht_0.1.1_1767633106830_0.26036797780629484","host":"s3://npm-registry-packages-npm-production"}},"0.1.2":{"name":"@yz-social/kdht","version":"0.1.2","_id":"@yz-social/kdht@0.1.2","maintainers":[{"name":"howard.stearns","email":"stearns@alum.mit.edu"}],"homepage":"https://github.com/YZ-social/kdht#readme","bugs":{"url":"https://github.com/YZ-social/kdht/issues"},"dist":{"shasum":"3956a79fb608886b267b7c7e19792db08601dd3c","tarball":"https://registry.npmjs.org/@yz-social/kdht/-/kdht-0.1.2.tgz","fileCount":30,"integrity":"sha512-VHplVZqrWUtUKQwz+5FDZb/sNYZirbkaHjsHt0exj34kCLrm+lQ0JlhWLWb3sJ2aSvk6OU4s1mqK0OXywJs5PQ==","signatures":[{"sig":"MEYCIQCnhrbY/3lGAFIojLyj418kTvFZL6FRPeKkoxhC8dH0FgIhAImt4g3zmwY82HwDNVwckTIYORvpNJcUruQYoJgnXQLI","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":118514},"type":"module","exports":{".":"./index.js","./portal":"./portals/node.js","./router":"./portals/router.js"},"gitHead":"55aea6fb9f723d9aed2edb9beaac40a2bec7256a","scripts":{"test":"npx jasmine","smoke":"node spec/portal.js --nPortals 5 --nBots 5 --thrash --nWrites 10","load30":"node spec/portal.js --nPortals 10 --nBots 20 --nWrites 100","load50":"node spec/portal.js --nPortals 10 --nBots 65 --nWrites 100","load75":"node spec/portal.js --nPortals 10 --nBots 40 --nWrites 100","load100":"node spec/portal.js --nPortals 10 --nBots 90 --nWrites 100","load150":"node spec/portal.js --nPortals 15 --nBots 135 --nWrites 100","load200":"node spec/portal.js --nPortals 20 --nBots 180 --nWrites 100","smoke20":"node spec/portal.js --nPortals 10 --nBots 10 --thrash --nWrites 10","thrash30":"node spec/portal.js --nPortals 10 --nBots 20 --thrash true --nWrites 100","thrash50":"node spec/portal.js --nPortals 10 --nBots 40 --thrash true --nWrites 100","thrash100":"node spec/portal.js --nPortals 10 --nBots 90 --thrash true --nWrites 100","thrash150":"node spec/portal.js --nPortals 15 --nBots 135 --thrash true --nWrites 100","thrash200":"node spec/portal.js --nPortals 20 --nBots 180 --thrash true --nWrites 100","serverTest":"node spec/portal.js --nPortals 20 --nWrites 40","serverTestLight":"node spec/portal.js --nPortals 10 --nWrites 40"},"_npmUser":{"name":"howard.stearns","email":"stearns@alum.mit.edu"},"repository":{"url":"git+https://github.com/YZ-social/kdht.git","type":"git"},"_npmVersion":"10.9.4","description":"Pure Kademlia base, for testing variations.","directories":{},"_nodeVersion":"22.21.1","dependencies":{"uuid":"^13.0.0","@yz-social/webrtc":"^0.1.0"},"publishConfig":{"registry":"https://registry.npmjs.org"},"_hasShrinkwrap":false,"devDependencies":{"yargs":"^18.0.0","morgan":"^1.10.1","express":"^5.2.1","jasmine":"^5.12.0"},"_npmOperationalInternal":{"tmp":"tmp/kdht_0.1.2_1767640118774_0.7306633126183093","host":"s3://npm-registry-packages-npm-production"}},"0.1.3":{"name":"@yz-social/kdht","version":"0.1.3","_id":"@yz-social/kdht@0.1.3","maintainers":[{"name":"howard.stearns","email":"stearns@alum.mit.edu"}],"homepage":"https://github.com/YZ-social/kdht#readme","bugs":{"url":"https://github.com/YZ-social/kdht/issues"},"dist":{"shasum":"7f38a75182baa4874bd0d8389229cdfad2148235","tarball":"https://registry.npmjs.org/@yz-social/kdht/-/kdht-0.1.3.tgz","fileCount":30,"integrity":"sha512-dKis87K9ZX1B8X39tEuQ9Q0AIbSF4trw1uTQO5cx3sqmTcKDy32Z1YG66CQFSpHYsOzh03mVpUkZHQrgfe5Q5g==","signatures":[{"sig":"MEUCIFf1ycAgk13rOpwpsVFXvADve1DU8lJfgNH+rhG6UUA7AiEAi2zydMGiT6ZLwK6SovheLBd0X5NHRGDHLJ4ycIqnAzQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":118843},"type":"module","exports":{".":"./index.js","./portal":"./portals/node.js","./router":"./portals/router.js"},"gitHead":"a5ea1d41aba0fd173df4e13b574e377834ff8d19","scripts":{"test":"npx jasmine","smoke":"node spec/portal.js --nPortals 5 --nBots 5 --thrash --nWrites 10","load30":"node spec/portal.js --nPortals 10 --nBots 20 --nWrites 100","load50":"node spec/portal.js --nPortals 10 --nBots 65 --nWrites 100","load75":"node spec/portal.js --nPortals 10 --nBots 40 --nWrites 100","load100":"node spec/portal.js --nPortals 10 --nBots 90 --nWrites 100","load150":"node spec/portal.js --nPortals 15 --nBots 135 --nWrites 100","load200":"node spec/portal.js --nPortals 20 --nBots 180 --nWrites 100","smoke20":"node spec/portal.js --nPortals 10 --nBots 10 --thrash --nWrites 10","thrash30":"node spec/portal.js --nPortals 10 --nBots 20 --thrash true --nWrites 100","thrash50":"node spec/portal.js --nPortals 10 --nBots 40 --thrash true --nWrites 100","thrash100":"node spec/portal.js --nPortals 10 --nBots 90 --thrash true --nWrites 100","thrash150":"node spec/portal.js --nPortals 15 --nBots 135 --thrash true --nWrites 100","thrash200":"node spec/portal.js --nPortals 20 --nBots 180 --thrash true --nWrites 100","serverTest":"node spec/portal.js --nPortals 20 --nWrites 40","serverTestLight":"node spec/portal.js --nPortals 10 --nWrites 40"},"_npmUser":{"name":"howard.stearns","email":"stearns@alum.mit.edu"},"repository":{"url":"git+https://github.com/YZ-social/kdht.git","type":"git"},"_npmVersion":"10.9.4","description":"Pure Kademlia base, for testing variations.","directories":{},"_nodeVersion":"22.21.1","dependencies":{"uuid":"^13.0.0","@yz-social/webrtc":"^0.1.0"},"publishConfig":{"registry":"https://registry.npmjs.org"},"_hasShrinkwrap":false,"devDependencies":{"yargs":"^18.0.0","morgan":"^1.10.1","express":"^5.2.1","jasmine":"^5.12.0"},"_npmOperationalInternal":{"tmp":"tmp/kdht_0.1.3_1767643689911_0.4899334841319174","host":"s3://npm-registry-packages-npm-production"}},"0.1.4":{"name":"@yz-social/kdht","version":"0.1.4","_id":"@yz-social/kdht@0.1.4","maintainers":[{"name":"howard.stearns","email":"stearns@alum.mit.edu"}],"homepage":"https://github.com/YZ-social/kdht#readme","bugs":{"url":"https://github.com/YZ-social/kdht/issues"},"dist":{"shasum":"cc434379790e40a252a1cf81a5ba5dbac0dcab59","tarball":"https://registry.npmjs.org/@yz-social/kdht/-/kdht-0.1.4.tgz","fileCount":31,"integrity":"sha512-YohG5ndoqoAE8rOva6jTILklndcDYPDyn/Kdwjs5DBrwHAMd0o2OEJbveMcEy8CgnxcyyZ3BcTnHDuQQOLGFiw==","signatures":[{"sig":"MEQCIBhyUBGIt0FYlvFoxX6azqe0orkjjmtdNml/uA59z1PdAiBicv0LJWbXK6PKzbozyjzkeOXp7EXPLe6QtlqL7s8P5w==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":149346},"type":"module","exports":{".":"./index.js","./portal":"./portals/node.js","./router":"./portals/router.js"},"gitHead":"29564738d965ffae457b00c67973d20afe31b05e","scripts":{"bots":"node spec/bots.js","stop":"pkill kdht","test":"npx jasmine && echo '-- SUCCESS --' || echo '**** FAIL ****'","start":"node spec/portal.js","background":"npm stop; (npm start 1>server.log 2>&1 &); sleep 1","thrashbots":"node spec/bots.js --thrash"},"_npmUser":{"name":"howard.stearns","email":"stearns@alum.mit.edu"},"repository":{"url":"git+https://github.com/YZ-social/kdht.git","type":"git"},"_npmVersion":"10.9.4","description":"Pure Kademlia base, for testing variations.","directories":{},"_nodeVersion":"22.21.1","dependencies":{"uuid":"^13.0.0","@yz-social/webrtc":"^0.1.1"},"publishConfig":{"registry":"https://registry.npmjs.org"},"_hasShrinkwrap":false,"devDependencies":{"yargs":"^18.0.0","morgan":"^1.10.1","express":"^5.2.1","jasmine":"^5.12.0"},"_npmOperationalInternal":{"tmp":"tmp/kdht_0.1.4_1768958928450_0.6324036847011989","host":"s3://npm-registry-packages-npm-production"}},"0.1.5":{"name":"@yz-social/kdht","version":"0.1.5","_id":"@yz-social/kdht@0.1.5","maintainers":[{"name":"howard.stearns","email":"stearns@alum.mit.edu"}],"homepage":"https://github.com/YZ-social/kdht#readme","bugs":{"url":"https://github.com/YZ-social/kdht/issues"},"dist":{"shasum":"f76e9f6b71520a340f5eacf47be3c10fc0df7b41","tarball":"https://registry.npmjs.org/@yz-social/kdht/-/kdht-0.1.5.tgz","fileCount":31,"integrity":"sha512-8M/dm8IA5KLKp5Xd262Dx4H+y+BoN5j4q3BsmbLjz57miRBXsAu3cOK9y/Ho8kWunvoP+IUdMtZdWqLKOqvGwg==","signatures":[{"sig":"MEYCIQDqm2WVSzK0iXKb914ESwxelNpAKhT9WW0sc4lCTB8AKwIhAJB7VKg3xbCiig79qsU/4I0B3mJNQhMeypQEAq3jtyNc","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":149388},"type":"module","exports":{".":"./index.js","./portal":"./portals/node.js","./router":"./portals/router.js"},"gitHead":"7dcd16381a833bdeed4c04a5bd69867923d6ffce","scripts":{"bots":"node spec/bots.js","stop":"pkill kdht","test":"npx jasmine && echo '-- SUCCESS --' || echo '**** FAIL ****'","start":"node spec/portal.js --externalBaseURL https://yz.social/kdht","background":"npm stop; (npm start 1>server.log 2>&1 &); sleep 1","thrashbots":"node spec/bots.js --thrash"},"_npmUser":{"name":"howard.stearns","email":"stearns@alum.mit.edu"},"repository":{"url":"git+https://github.com/YZ-social/kdht.git","type":"git"},"_npmVersion":"10.9.4","description":"Pure Kademlia base, for testing variations.","directories":{},"_nodeVersion":"22.21.1","dependencies":{"uuid":"^13.0.0","@yz-social/webrtc":"^0.1.1"},"publishConfig":{"registry":"https://registry.npmjs.org"},"_hasShrinkwrap":false,"devDependencies":{"yargs":"^18.0.0","morgan":"^1.10.1","express":"^5.2.1","jasmine":"^5.12.0"},"_npmOperationalInternal":{"tmp":"tmp/kdht_0.1.5_1768969259172_0.780101504424201","host":"s3://npm-registry-packages-npm-production"}},"0.1.6":{"name":"@yz-social/kdht","version":"0.1.6","_id":"@yz-social/kdht@0.1.6","maintainers":[{"name":"howard.stearns","email":"stearns@alum.mit.edu"}],"homepage":"https://github.com/YZ-social/kdht#readme","bugs":{"url":"https://github.com/YZ-social/kdht/issues"},"dist":{"shasum":"3216b6b90f90c489ca545fdb52368b4c7d8cf451","tarball":"https://registry.npmjs.org/@yz-social/kdht/-/kdht-0.1.6.tgz","fileCount":32,"integrity":"sha512-FQ6UzipZxgWac33ulmgP621y7bdpdj6uG2RGRe7ZZni24m8zNjDgq0By/v1VIlxoi15+a1xhae5JE/N7s6xXMQ==","signatures":[{"sig":"MEUCICFqTrTTgsWCPZwdfI55bIPv3EQPpFUxl/dNMxFNgPwSAiEAiovWcxsM9B3iWAHU5UvkEGeR1w1n77W5hzblp4br0yY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":172488},"type":"module","exports":{".":"./index.js","./portal":"./portals/node.js","./router":"./portals/router.js"},"gitHead":"110b954085b9a9a16c5de5d2f272af3b6d7b50bb","scripts":{"bots":"node spec/bots.js","stop":"pkill kdht","test":"npx jasmine && echo '-- SUCCESS --' || echo '**** FAIL ****'","start":"node spec/portal.js --externalBaseURL https://ki1r0y.com/kdht","background":"npm stop; (npm start 1>server.log 2>&1 &); sleep 1","thrashbots":"node spec/bots.js --thrash"},"_npmUser":{"name":"howard.stearns","email":"stearns@alum.mit.edu"},"repository":{"url":"git+https://github.com/YZ-social/kdht.git","type":"git"},"_npmVersion":"10.9.4","description":"Pure Kademlia base, for testing variations.","directories":{},"_nodeVersion":"22.21.1","dependencies":{"uuid":"^13.0.0","@yz-social/webrtc":"^0.1.1"},"publishConfig":{"registry":"https://registry.npmjs.org"},"_hasShrinkwrap":false,"devDependencies":{"yargs":"^18.0.0","morgan":"^1.10.1","express":"^5.2.1","jasmine":"^5.12.0"},"_npmOperationalInternal":{"tmp":"tmp/kdht_0.1.6_1769022443810_0.7074550182198904","host":"s3://npm-registry-packages-npm-production"}},"0.1.7":{"name":"@yz-social/kdht","version":"0.1.7","_id":"@yz-social/kdht@0.1.7","maintainers":[{"name":"howard.stearns","email":"stearns@alum.mit.edu"}],"homepage":"https://github.com/YZ-social/kdht#readme","bugs":{"url":"https://github.com/YZ-social/kdht/issues"},"dist":{"shasum":"ba8f6b3851c024a3f2e3d9bbd6d6ade8b4c87c52","tarball":"https://registry.npmjs.org/@yz-social/kdht/-/kdht-0.1.7.tgz","fileCount":31,"integrity":"sha512-pVQhHg7VH6x5HLICWw0jAKyMZLO097oZGxxZcvLjEfZcU6gI2nBUm1TgodRrcVTKQVFG2IBgDxhHeu9A5DsFlQ==","signatures":[{"sig":"MEQCIDE51MWYEzx/IOvGJrMns93wVAkFka+txDEviyxHpXcgAiA/vZmrjz9ui2806LtGvW2oV8SVZG8WMl2mfYhwW33WDQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":149143},"type":"module","exports":{".":"./index.js","./portal":"./portals/node.js","./router":"./portals/router.js"},"gitHead":"682b9be5f2b779ca4466f0b9c6e55771fbef82e5","scripts":{"bots":"node spec/bots.js","stop":"pkill kdht","test":"npx jasmine && echo '-- SUCCESS --' || echo '**** FAIL ****'","start":"node spec/portal.js --externalBaseURL https://ki1r0y.com/kdht","background":"npm stop; (npm start 1>server.log 2>&1 &); sleep 1","thrashbots":"node spec/bots.js --thrash"},"_npmUser":{"name":"howard.stearns","email":"stearns@alum.mit.edu"},"repository":{"url":"git+https://github.com/YZ-social/kdht.git","type":"git"},"_npmVersion":"10.9.4","description":"Pure Kademlia base, for testing variations.","directories":{},"_nodeVersion":"22.21.1","dependencies":{"uuid":"^13.0.0","@yz-social/webrtc":"^0.1.1"},"publishConfig":{"registry":"https://registry.npmjs.org"},"_hasShrinkwrap":false,"devDependencies":{"yargs":"^18.0.0","morgan":"^1.10.1","express":"^5.2.1","jasmine":"^5.12.0"},"_npmOperationalInternal":{"tmp":"tmp/kdht_0.1.7_1769026662023_0.5172272005370151","host":"s3://npm-registry-packages-npm-production"}},"0.1.8":{"name":"@yz-social/kdht","version":"0.1.8","_id":"@yz-social/kdht@0.1.8","maintainers":[{"name":"howard.stearns","email":"stearns@alum.mit.edu"}],"homepage":"https://github.com/YZ-social/kdht#readme","bugs":{"url":"https://github.com/YZ-social/kdht/issues"},"dist":{"shasum":"13458d8ad2675211cba6c620495588a97f37d1c2","tarball":"https://registry.npmjs.org/@yz-social/kdht/-/kdht-0.1.8.tgz","fileCount":31,"integrity":"sha512-l3MfAWfwu9/jq4z5eeB+fH8LKJg56AqRD4NdZdF4xiqkq6VGMVbd8UPBi6mQT4iDEAqha9wmGusuDRpidm8qUA==","signatures":[{"sig":"MEUCIQCE10qR+BvynJ9Sf/Uy923PuW3a4wne3P8dT4aK7PbLEAIgQJ6bic6cCICS8g37ZyKrvpV6jzxhvUUYn79OnPRar68=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":149319},"type":"module","exports":{".":"./index.js","./portal":"./portals/node.js","./router":"./portals/router.js"},"gitHead":"8a44524d39bc1beafd044adc56ed14c77ede8e18","scripts":{"bots":"node spec/bots.js","stop":"pkill kdht","test":"npx jasmine && echo '-- SUCCESS --' || echo '**** FAIL ****'","start":"node spec/portal.js --externalBaseURL https://ki1r0y.com/kdht","background":"npm stop; (npm start 1>server.log 2>&1 &); sleep 1","thrashbots":"node spec/bots.js --thrash"},"_npmUser":{"name":"howard.stearns","email":"stearns@alum.mit.edu"},"repository":{"url":"git+https://github.com/YZ-social/kdht.git","type":"git"},"_npmVersion":"10.9.4","description":"Pure Kademlia base, for testing variations.","directories":{},"_nodeVersion":"22.21.1","dependencies":{"uuid":"^13.0.0","@yz-social/webrtc":"^0.1.1"},"publishConfig":{"registry":"https://registry.npmjs.org"},"_hasShrinkwrap":false,"devDependencies":{"yargs":"^18.0.0","morgan":"^1.10.1","express":"^5.2.1","jasmine":"^5.12.0"},"_npmOperationalInternal":{"tmp":"tmp/kdht_0.1.8_1769033085373_0.8889905612168647","host":"s3://npm-registry-packages-npm-production"}},"0.1.9":{"name":"@yz-social/kdht","version":"0.1.9","_id":"@yz-social/kdht@0.1.9","maintainers":[{"name":"howard.stearns","email":"stearns@alum.mit.edu"}],"homepage":"https://github.com/YZ-social/kdht#readme","bugs":{"url":"https://github.com/YZ-social/kdht/issues"},"dist":{"shasum":"56fc2af6dc0c309d55b899c982de001b1f191654","tarball":"https://registry.npmjs.org/@yz-social/kdht/-/kdht-0.1.9.tgz","fileCount":30,"integrity":"sha512-aZutYImzqkn9YFzoS5tb4VZPBR1C3E9ITEwv01iRl6hmhl3ca/VWkQkHq6bmMiKIEqNj2/GOziAmky3aMCNouA==","signatures":[{"sig":"MEYCIQDVhAqs7yq/wpaS0jwowqa2fUI6nOR/UzguQzmWW7K8ZwIhAMuGNSXeBXssfXbvoLnZjSjjaWSMUuFkCNUJkWN65+Kj","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":149306},"type":"module","exports":{".":"./index.js","./portal":"./portals/node.js","./router":"./portals/router.js"},"gitHead":"aae14d6c48c899db9a259ce09ae9ffdf0dca8735","scripts":{"bots":"node spec/bots.js","stop":"pkill kdht","test":"npx jasmine && npx jasmine spec/webrtcTests.js && echo '-- SUCCESS --' || echo '**** FAIL ****'","start":"node spec/portal.js --externalBaseURL https://ki1r0y.com/kdht","background":"npm stop; (npm start 1>server.log 2>&1 &); sleep 1","thrashbots":"node spec/bots.js --thrash"},"_npmUser":{"name":"howard.stearns","email":"stearns@alum.mit.edu"},"repository":{"url":"git+https://github.com/YZ-social/kdht.git","type":"git"},"_npmVersion":"10.9.4","description":"Pure Kademlia base, for testing variations.","directories":{},"_nodeVersion":"22.21.1","dependencies":{"uuid":"^13.0.0","@yz-social/webrtc":"^0.1.2"},"publishConfig":{"registry":"https://registry.npmjs.org"},"_hasShrinkwrap":false,"devDependencies":{"yargs":"^18.0.0","morgan":"^1.10.1","express":"^5.2.1","jasmine":"^5.12.0"},"_npmOperationalInternal":{"tmp":"tmp/kdht_0.1.9_1769578030410_0.07844888413077178","host":"s3://npm-registry-packages-npm-production"}},"0.1.10":{"name":"@yz-social/kdht","version":"0.1.10","_id":"@yz-social/kdht@0.1.10","maintainers":[{"name":"howard.stearns","email":"stearns@alum.mit.edu"}],"homepage":"https://github.com/YZ-social/kdht#readme","bugs":{"url":"https://github.com/YZ-social/kdht/issues"},"dist":{"shasum":"c7fbc03c1fe8b69ed98eca70140e28b77e4d16d4","tarball":"https://registry.npmjs.org/@yz-social/kdht/-/kdht-0.1.10.tgz","fileCount":30,"integrity":"sha512-xRqTYTet86QDsq6KHFbvWSHOm/I1Y72RrHDLghdOHpKsVVgvOgpGOypP5xHWqNVy/JCnMIbhrFD1a2Jw59cZZg==","signatures":[{"sig":"MEYCIQC/2wyf2hC1x1K7rLrVCa7YcHf5jzJnSdSOc8rJyo+TWgIhAP981DCL0/aUl9YxrTkDU4JmcqWMT3keu+vKq1C+w4ah","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":150031},"type":"module","exports":{".":"./index.js","./portal":"./portals/node.js","./router":"./portals/router.js"},"gitHead":"ae4f25a935b23071c4414d52c68fa91c63162a90","scripts":{"bots":"node spec/bots.js","stop":"pkill kdht","test":"npx jasmine && npm run testWebrtc && echo '-- SUCCESS --' || echo '**** FAIL ****'","start":"node spec/portal.js --externalBaseURL https://ki1r0y.com/kdht","background":"npm stop; (npm start 1>server.log 2>&1 &); sleep 1","testWebrtc":"npx jasmine spec/testWebrtc.js","thrashbots":"node spec/bots.js --thrash"},"_npmUser":{"name":"howard.stearns","email":"stearns@alum.mit.edu"},"repository":{"url":"git+https://github.com/YZ-social/kdht.git","type":"git"},"_npmVersion":"10.9.4","description":"Pure Kademlia base, for testing variations.","directories":{},"_nodeVersion":"22.21.1","dependencies":{"uuid":"^13.0.0","@yz-social/webrtc":"^0.1.3"},"publishConfig":{"registry":"https://registry.npmjs.org"},"_hasShrinkwrap":false,"devDependencies":{"yargs":"^18.0.0","morgan":"^1.10.1","express":"^5.2.1","jasmine":"^5.12.0"},"_npmOperationalInternal":{"tmp":"tmp/kdht_0.1.10_1769655850406_0.18835379668099494","host":"s3://npm-registry-packages-npm-production"}},"0.1.11":{"name":"@yz-social/kdht","version":"0.1.11","_id":"@yz-social/kdht@0.1.11","maintainers":[{"name":"howard.stearns","email":"stearns@alum.mit.edu"}],"homepage":"https://github.com/YZ-social/kdht#readme","bugs":{"url":"https://github.com/YZ-social/kdht/issues"},"dist":{"shasum":"ec5ae0336b6e0808ffbfc48b90819ededdb6ed41","tarball":"https://registry.npmjs.org/@yz-social/kdht/-/kdht-0.1.11.tgz","fileCount":30,"integrity":"sha512-7Lq3PoIAFPtRdlm+vNnR3xW3uOzO/P3YNEsqqdPBYfurhQrtuWpdhEF/6r+pOa2HMWcLzISjXN2k4zKqWaRmwg==","signatures":[{"sig":"MEYCIQCYCNkpnBbY1AOc9AN4e3/HJlw/pnknn5uJIU2pTTYgggIhAK+SSHuUIIhfltTmgeIjCYSt9lf50w/eP8I438dPM99y","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":150741},"type":"module","exports":{".":"./index.js","./portal":"./portals/node.js","./router":"./portals/router.js"},"gitHead":"6f16f408ead86d4f043ef52361efad7c28f962de","scripts":{"bots":"node spec/bots.js","stop":"pkill kdht","test":"npx jasmine && npm run testWebrtc && echo '-- SUCCESS --' || echo '**** FAIL ****'","start":"node spec/portal.js --externalBaseURL https://ki1r0y.com/kdht","background":"npm stop; (npm start 1>server.log 2>&1 &); sleep 1","testWebrtc":"npx jasmine spec/testWebrtc.js","thrashbots":"node spec/bots.js --thrash"},"_npmUser":{"name":"howard.stearns","email":"stearns@alum.mit.edu"},"repository":{"url":"git+https://github.com/YZ-social/kdht.git","type":"git"},"_npmVersion":"10.9.4","description":"Pure Kademlia base, for testing variations.","directories":{},"_nodeVersion":"22.21.1","dependencies":{"uuid":"^13.0.0","@yz-social/webrtc":"^0.1.3"},"publishConfig":{"registry":"https://registry.npmjs.org"},"_hasShrinkwrap":false,"devDependencies":{"yargs":"^18.0.0","morgan":"^1.10.1","express":"^5.2.1","jasmine":"^5.12.0"},"_npmOperationalInternal":{"tmp":"tmp/kdht_0.1.11_1769740942674_0.2588160172770666","host":"s3://npm-registry-packages-npm-production"}},"0.1.12":{"name":"@yz-social/kdht","version":"0.1.12","_id":"@yz-social/kdht@0.1.12","maintainers":[{"name":"howard.stearns","email":"stearns@alum.mit.edu"}],"homepage":"https://github.com/YZ-social/kdht#readme","bugs":{"url":"https://github.com/YZ-social/kdht/issues"},"dist":{"shasum":"fc1605f5e7b6bb5950945e7ead320f967a26e81a","tarball":"https://registry.npmjs.org/@yz-social/kdht/-/kdht-0.1.12.tgz","fileCount":30,"integrity":"sha512-LD2We8x3P/cDjjiIUBmmn0FELbwXt2mGWVEKKeftGHS1hR2WPw6ya2BOWNPvyJScYuhabfYr9Gg0dSzlVuaEyg==","signatures":[{"sig":"MEQCIAUw8pLZ1djxpmtVmUZH0fr6G7fFXQHI6oC3OQZg446ZAiBA+/zyFLfuSbmhU1u3vcC/lFQNiatUF4Ofs8dFxTNxvQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":151061},"type":"module","exports":{".":"./index.js","./portal":"./portals/node.js","./router":"./portals/router.js"},"gitHead":"b8eb772721413163b5a3d58bd74b37e1b3f91ea6","scripts":{"bots":"node spec/bots.js","stop":"pkill kdht","test":"npx jasmine && npm run testWebrtc && echo '-- SUCCESS --' || echo '**** FAIL ****'","start":"node spec/portal.js --externalBaseURL https://ki1r0y.com/kdht","background":"npm stop; (npm start 1>server.log 2>&1 &); sleep 1","testWebrtc":"npx jasmine spec/testWebrtc.js","thrashbots":"node spec/bots.js --thrash","withoutExternal":"node spec/portal.js"},"_npmUser":{"name":"howard.stearns","email":"stearns@alum.mit.edu"},"repository":{"url":"git+https://github.com/YZ-social/kdht.git","type":"git"},"_npmVersion":"10.9.4","description":"Pure Kademlia base, for testing variations.","directories":{},"_nodeVersion":"22.21.1","dependencies":{"uuid":"^13.0.0","@yz-social/webrtc":"^0.1.3"},"publishConfig":{"registry":"https://registry.npmjs.org"},"_hasShrinkwrap":false,"devDependencies":{"yargs":"^18.0.0","morgan":"^1.10.1","express":"^5.2.1","jasmine":"^5.12.0"},"_npmOperationalInternal":{"tmp":"tmp/kdht_0.1.12_1769793465533_0.8468759053372501","host":"s3://npm-registry-packages-npm-production"}},"0.1.13":{"name":"@yz-social/kdht","version":"0.1.13","_id":"@yz-social/kdht@0.1.13","maintainers":[{"name":"howard.stearns","email":"stearns@alum.mit.edu"}],"homepage":"https://github.com/YZ-social/kdht#readme","bugs":{"url":"https://github.com/YZ-social/kdht/issues"},"dist":{"shasum":"366187bdd2379e623932b61d3698e4db3ff4989d","tarball":"https://registry.npmjs.org/@yz-social/kdht/-/kdht-0.1.13.tgz","fileCount":31,"integrity":"sha512-Om3lVH5vFece0C1oWpS/KdEFjLKa4OoMeSyyFem+BKbVCmZZ6hDe/pTe4megOswkZF8Ng3nV51advdMuZx1thw==","signatures":[{"sig":"MEQCIAK+W6xijtLCFC4oCVnzG/bt2s6XJC0jqyAxKkHuLFf+AiACcq5nWHbHppa4FlX8FNfBXc61OscQ/xgOmDwkbUAoWg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":159398},"type":"module","exports":{".":"./index.js","./portal":"./portals/node.js","./router":"./portals/router.js"},"gitHead":"b3d8cebb0f78ba90feb9b163fdbc0cbcb9a730be","scripts":{"bots":"node scripts/bots.js","stop":"pkill kdht","test":"npx jasmine && npm run testWebrtc && echo '-- SUCCESS --' || echo '**** FAIL ****'","start":"node scripts/portal.js --externalBaseURL https://ki1r0y.com/kdht","background":"npm stop; (npm start 1>server.log 2>&1 &); sleep 1","testWebrtc":"npx jasmine spec/testWebrtc.js","thrashbots":"node scripts/bots.js --thrash","withoutExternal":"node scripts/portal.js"},"_npmUser":{"name":"howard.stearns","email":"stearns@alum.mit.edu"},"repository":{"url":"git+https://github.com/YZ-social/kdht.git","type":"git"},"_npmVersion":"10.9.4","description":"Pure Kademlia base, for testing variations.","directories":{},"_nodeVersion":"22.21.1","dependencies":{"uuid":"^13.0.0","@yz-social/webrtc":"^0.1.3"},"publishConfig":{"registry":"https://registry.npmjs.org"},"_hasShrinkwrap":false,"devDependencies":{"yargs":"^18.0.0","morgan":"^1.10.1","express":"^5.2.1","jasmine":"^5.12.0"},"_npmOperationalInternal":{"tmp":"tmp/kdht_0.1.13_1770052978347_0.11062050856660588","host":"s3://npm-registry-packages-npm-production"}},"0.1.14":{"name":"@yz-social/kdht","version":"0.1.14","_id":"@yz-social/kdht@0.1.14","maintainers":[{"name":"howard.stearns","email":"stearns@alum.mit.edu"}],"homepage":"https://github.com/YZ-social/kdht#readme","bugs":{"url":"https://github.com/YZ-social/kdht/issues"},"dist":{"shasum":"84a94fb559e3bb2cbbcf4a7381d2aecfc433191b","tarball":"https://registry.npmjs.org/@yz-social/kdht/-/kdht-0.1.14.tgz","fileCount":32,"integrity":"sha512-fK1V3HBgS032kA6/ytBZ0Xh0iLgKfPVsOljqdtDDVouYxjPxa6VVRJeltuPYpFrySBsMUBv07/ghrKoFlcg1ZA==","signatures":[{"sig":"MEYCIQDG6ToPnAgrDvsLzSZMudkuA31+cxWkObfa4JEAqJdZcwIhAOwvJBD83HHzyJHgHplmsbdJ+/KfPMcgItlZ6zpDfbu8","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":166007},"type":"module","exports":{".":"./index.js","./portal":"./scripts/node.js","./router":"./scripts/router.js"},"gitHead":"d3387f121c81668192646c95127348010880d09c","scripts":{"bots":"node scripts/bots.js","stop":"pkill kdht","test":"npx jasmine && npm run testWebrtc && echo '-- SUCCESS --' || echo '**** FAIL ****'","start":"node scripts/portal.js --externalBaseURL https://ki1r0y.com/kdht","background":"npm stop; (npm start 1>server.log 2>&1 &); sleep 1","testWebrtc":"npx jasmine spec/testWebrtc.js","thrashbots":"node scripts/bots.js --thrash","withoutExternal":"node scripts/portal.js"},"_npmUser":{"name":"howard.stearns","email":"stearns@alum.mit.edu"},"repository":{"url":"git+https://github.com/YZ-social/kdht.git","type":"git"},"_npmVersion":"10.9.4","description":"Pure Kademlia base, for testing variations.","directories":{},"_nodeVersion":"22.21.1","dependencies":{"uuid":"^13.0.0","@yz-social/webrtc":"^0.1.3"},"publishConfig":{"registry":"https://registry.npmjs.org"},"_hasShrinkwrap":false,"devDependencies":{"yargs":"^18.0.0","morgan":"^1.10.1","express":"^5.2.1","jasmine":"^5.12.0"},"_npmOperationalInternal":{"tmp":"tmp/kdht_0.1.14_1770054434108_0.2231540600724471","host":"s3://npm-registry-packages-npm-production"}},"0.1.15":{"name":"@yz-social/kdht","version":"0.1.15","_id":"@yz-social/kdht@0.1.15","maintainers":[{"name":"howard.stearns","email":"stearns@alum.mit.edu"}],"homepage":"https://github.com/YZ-social/kdht#readme","bugs":{"url":"https://github.com/YZ-social/kdht/issues"},"dist":{"shasum":"5a889298d5004e26f89ce63b59c559eb15b15929","tarball":"https://registry.npmjs.org/@yz-social/kdht/-/kdht-0.1.15.tgz","fileCount":29,"integrity":"sha512-ylXyHPjn2hXD6SQ9ijbsZRISSsunb2vH3uNOa69692lMcfPIV1MyaDamu3iOIzbItD+/0c6LVrbbWZnXeb2O9g==","signatures":[{"sig":"MEUCIDppbecFDp3GoW0fvfk1VojXRlrAzJ2CfKi9nPGmyTExAiEAnb5/QEQ+nfQhXBKQEUH3fqd4PgNQXb44BAUZ9x5oQww=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":155704},"type":"module","exports":{".":"./index.js","./portal":"./scripts/node.js","./router":"./scripts/router.js"},"gitHead":"69c7edbfd21fbd57f472d3014582cd69829bfa27","scripts":{"bots":"node scripts/bots.js","stop":"pkill kdht","test":"npx jasmine && npm run testWebrtc && echo '-- SUCCESS --' || echo '**** FAIL ****'","start":"node scripts/portal.js --externalBaseURL https://ki1r0y.com/kdht","background":"npm stop; (npm start 1>server.log 2>&1 &); sleep 1","testWebrtc":"npx jasmine spec/testWebrtc.js","thrashbots":"node scripts/bots.js --thrash","withoutExternal":"node scripts/portal.js"},"_npmUser":{"name":"howard.stearns","email":"stearns@alum.mit.edu"},"repository":{"url":"git+https://github.com/YZ-social/kdht.git","type":"git"},"_npmVersion":"10.9.4","description":"Pure Kademlia base, for testing variations.","directories":{},"_nodeVersion":"22.21.1","dependencies":{"uuid":"^13.0.0","@yz-social/webrtc":"^0.1.3"},"publishConfig":{"registry":"https://registry.npmjs.org"},"_hasShrinkwrap":false,"devDependencies":{"yargs":"^18.0.0","morgan":"^1.10.1","express":"^5.2.1","jasmine":"^5.12.0"},"_npmOperationalInternal":{"tmp":"tmp/kdht_0.1.15_1770154634000_0.22469471800735907","host":"s3://npm-registry-packages-npm-production"}},"0.1.16":{"name":"@yz-social/kdht","version":"0.1.16","_id":"@yz-social/kdht@0.1.16","maintainers":[{"name":"howard.stearns","email":"stearns@alum.mit.edu"}],"homepage":"https://github.com/YZ-social/kdht#readme","bugs":{"url":"https://github.com/YZ-social/kdht/issues"},"dist":{"shasum":"d8bb00ab9b6edf33e57df3c3d69f9b18266441a2","tarball":"https://registry.npmjs.org/@yz-social/kdht/-/kdht-0.1.16.tgz","fileCount":29,"integrity":"sha512-70fbmPoStlXqJ25mxsX96xHRTQnnHjbgbOoz5LNaisrseLrIDM1exPR6IEOvf9npsJyZPDAYWVVejL4ZT6LfDA==","signatures":[{"sig":"MEYCIQC/jE7U0l7grg0yRGbmMg5jIYPP0e7XsJRN721PvPTXGQIhAO0w+2wHpT2kyznTmAJPzW/5GKnyHGpM2lf9+wUjvP6d","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":155709},"type":"module","exports":{".":"./index.js","./portal":"./scripts/node.js","./router":"./scripts/router.js"},"gitHead":"81556d0099a0de175bbcc8f944f00e92db5abfac","scripts":{"bots":"node scripts/bots.js","stop":"pkill kdht","test":"npx jasmine && npm run testWebrtc && echo '-- SUCCESS --' || echo '**** FAIL ****'","start":"node scripts/portal.js --externalBaseURL https://ki1r0y.com/kdht","background":"npm stop; (npm start 1>server.log 2>&1 &); sleep 1","testWebrtc":"npx jasmine spec/testWebrtc.js","thrashbots":"node scripts/bots.js --thrash","withoutExternal":"node scripts/portal.js"},"_npmUser":{"name":"howard.stearns","email":"stearns@alum.mit.edu"},"repository":{"url":"git+https://github.com/YZ-social/kdht.git","type":"git"},"_npmVersion":"10.9.4","description":"Pure Kademlia base, for testing variations.","directories":{},"_nodeVersion":"22.21.1","dependencies":{"uuid":"^13.0.0","@yz-social/webrtc":"^0.1.3"},"publishConfig":{"registry":"https://registry.npmjs.org"},"_hasShrinkwrap":false,"devDependencies":{"yargs":"^18.0.0","morgan":"^1.10.1","express":"^5.2.1","jasmine":"^5.12.0"},"_npmOperationalInternal":{"tmp":"tmp/kdht_0.1.16_1770159142341_0.28323593463545693","host":"s3://npm-registry-packages-npm-production"}},"0.1.17":{"name":"@yz-social/kdht","version":"0.1.17","_id":"@yz-social/kdht@0.1.17","maintainers":[{"name":"howard.stearns","email":"stearns@alum.mit.edu"}],"homepage":"https://github.com/YZ-social/kdht#readme","bugs":{"url":"https://github.com/YZ-social/kdht/issues"},"dist":{"shasum":"b60bff680dfc26b3dc751bb6a83013eca582ea6c","tarball":"https://registry.npmjs.org/@yz-social/kdht/-/kdht-0.1.17.tgz","fileCount":34,"integrity":"sha512-ctUnn8jGfEnezDKmunT+b37nnyBnDsBC8ENirZMvDwG6I39sLdjF3o9mYi/ryj9BtcnQpjFqhbIwdZnB4OinYA==","signatures":[{"sig":"MEQCID3c1I74uZoWQpTBMsJ3Evz2KmyuIxi2CdxKLE4pW/ApAiAX/ogYBff0Kn250CpgKMhMUsrIDtS1Whx9r3MtCy0ffw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":203382},"type":"module","exports":{".":"./index.js","./portal":"./scripts/node.js","./router":"./scripts/router.js"},"gitHead":"d24c97a942af98c2d3b2e66ce7253f4aa92b2c74","scripts":{"bots":"node scripts/bots.js","stop":"pkill kdht","test":"npx jasmine && npm run testWebrtc && echo '-- SUCCESS --' || echo '**** FAIL ****'","start":"node scripts/portal.js --externalBaseURL https://dorado.ngrok.io/kdht","background":"npm stop; (npm start 1>server.log 2>&1 &); sleep 1","testWebrtc":"npx jasmine spec/testWebrtc.js","thrashbots":"node scripts/bots.js --thrash","withoutExternal":"node scripts/portal.js"},"_npmUser":{"name":"howard.stearns","email":"stearns@alum.mit.edu"},"repository":{"url":"git+https://github.com/YZ-social/kdht.git","type":"git"},"_npmVersion":"10.9.4","description":"Pure Kademlia base, for testing variations.","directories":{},"_nodeVersion":"22.21.1","dependencies":{"uuid":"^13.0.0","@yz-social/webrtc":"^0.1.4"},"publishConfig":{"registry":"https://registry.npmjs.org"},"_hasShrinkwrap":false,"devDependencies":{"yargs":"^18.0.0","morgan":"^1.10.1","express":"^5.2.1","jasmine":"^5.12.0"},"_npmOperationalInternal":{"tmp":"tmp/kdht_0.1.17_1770828224497_0.7652094029775673","host":"s3://npm-registry-packages-npm-production"}},"0.1.18":{"name":"@yz-social/kdht","version":"0.1.18","_id":"@yz-social/kdht@0.1.18","maintainers":[{"name":"howard.stearns","email":"stearns@alum.mit.edu"}],"homepage":"https://github.com/YZ-social/kdht#readme","bugs":{"url":"https://github.com/YZ-social/kdht/issues"},"dist":{"shasum":"51ec2dd18e6f80dbda0cabb158c52d13eff5e7f2","tarball":"https://registry.npmjs.org/@yz-social/kdht/-/kdht-0.1.18.tgz","fileCount":32,"integrity":"sha512-q8v3ylb6rMkUOvAiB74PgsfcBcwHhZXXcj1pcKtwYHEtvTeE75EemtgTzZcdKc+MkG+7z7VO43ajPFMp3CRAGg==","signatures":[{"sig":"MEYCIQDRhLt6KpmnGX2QBfafBGldz8fCVk1XwdLI3Wo8pg3qrwIhAKWUPYQupCYBnz7+iMUkQ9h+/8liz4u5M1ZYHB0iUu2r","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":178960},"type":"module","exports":{".":"./index.js","./portal":"./scripts/node.js","./router":"./scripts/router.js"},"gitHead":"63d3eac900f7ec9455b9e7ad375d686d8c7a7c59","scripts":{"bots":"node scripts/bots.js","stop":"pkill kdht","test":"npx jasmine && npm run testWebrtc && echo '-- SUCCESS --' || echo '**** FAIL ****'","start":"node scripts/portal.js --externalBaseURL https://dorado.ngrok.io/kdht","background":"npm stop; (npm start 1>server.log 2>&1 &); sleep 1","testWebrtc":"npm stop; npx jasmine spec/testWebrtc.js","thrashbots":"node scripts/bots.js --thrash","withoutExternal":"node scripts/portal.js"},"_npmUser":{"name":"howard.stearns","email":"stearns@alum.mit.edu"},"repository":{"url":"git+https://github.com/YZ-social/kdht.git","type":"git"},"_npmVersion":"10.9.4","description":"Pure Kademlia base, for testing variations.","directories":{},"_nodeVersion":"22.21.1","dependencies":{"uuid":"^13.0.0","@yz-social/webrtc":"^0.1.4"},"publishConfig":{"registry":"https://registry.npmjs.org"},"_hasShrinkwrap":false,"devDependencies":{"yargs":"^18.0.0","morgan":"^1.10.1","express":"^5.2.1","jasmine":"^5.12.0"},"_npmOperationalInternal":{"tmp":"tmp/kdht_0.1.18_1771965765774_0.5520622516561382","host":"s3://npm-registry-packages-npm-production"}},"0.1.19":{"name":"@yz-social/kdht","version":"0.1.19","_id":"@yz-social/kdht@0.1.19","maintainers":[{"name":"howard.stearns","email":"stearns@alum.mit.edu"}],"homepage":"https://github.com/YZ-social/kdht#readme","bugs":{"url":"https://github.com/YZ-social/kdht/issues"},"dist":{"shasum":"a0e7e4006da970fc3a6bab1933ea6fe3508f647f","tarball":"https://registry.npmjs.org/@yz-social/kdht/-/kdht-0.1.19.tgz","fileCount":32,"integrity":"sha512-rwumiJdWum4mtw9a5aQOEJiJUlgPDjz047HiduPiRICLkBrNDsAveroukm3oIg+9EU4pYrLML2JiVhK8jmMurA==","signatures":[{"sig":"MEUCIQDhpRM/O7rPnypqNZvajgFy4vlPzQSonFlDxWdMP/DBCQIgWkFLLjHBagiO0lLnfEp0DDPwxz+NdX1hRF8azDDijJ8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":183585},"type":"module","exports":{".":"./index.js","./portal":"./scripts/node.js","./router":"./scripts/router.js"},"gitHead":"a9c74c79fc856d01b4f609cdde46d7ac55e04a8f","scripts":{"bots":"node scripts/bots.js","stop":"pkill kdht","test":"npx jasmine && npm run testWebrtc && echo '-- SUCCESS --' || echo '**** FAIL ****'","start":"node scripts/portal.js --externalBaseURL https://dorado.ngrok.io/kdht","background":"npm stop; (npm start 1>server.log 2>&1 &); sleep 1","testWebrtc":"npm stop; npx jasmine spec/testWebrtc.js","thrashbots":"node scripts/bots.js --thrash","withoutExternal":"node scripts/portal.js"},"_npmUser":{"name":"howard.stearns","email":"stearns@alum.mit.edu"},"repository":{"url":"git+https://github.com/YZ-social/kdht.git","type":"git"},"_npmVersion":"10.9.4","description":"Pure Kademlia base, for testing variations.","directories":{},"_nodeVersion":"22.21.1","dependencies":{"uuid":"^13.0.0","@yz-social/webrtc":"^0.1.4"},"publishConfig":{"registry":"https://registry.npmjs.org"},"_hasShrinkwrap":false,"devDependencies":{"yargs":"^18.0.0","morgan":"^1.10.1","express":"^5.2.1","jasmine":"^5.12.0"},"_npmOperationalInternal":{"tmp":"tmp/kdht_0.1.19_1773016345291_0.5966599668128678","host":"s3://npm-registry-packages-npm-production"}},"0.1.20":{"name":"@yz-social/kdht","version":"0.1.20","_id":"@yz-social/kdht@0.1.20","maintainers":[{"name":"howard.stearns","email":"stearns@alum.mit.edu"}],"homepage":"https://github.com/YZ-social/kdht#readme","bugs":{"url":"https://github.com/YZ-social/kdht/issues"},"dist":{"shasum":"323153be7ac3c296d927610e7429853325d25d72","tarball":"https://registry.npmjs.org/@yz-social/kdht/-/kdht-0.1.20.tgz","fileCount":32,"integrity":"sha512-4HOXkU1FIkP2XcQCZIiprVDObpBUaCKB55CFz92J9lx7fxQ3hLOHzJJcbNCofOFIdPdUTP/FflEqv8xaEreYBQ==","signatures":[{"sig":"MEYCIQC8dAv+CAh9IDsvGFcj5PtCOuvu8ZtzcjAS2w4QwW2+5wIhAKDW4uP1upjQbM2ZYa/VrGFXbub+S1n9lwCDTqWOKsP4","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":185518},"type":"module","exports":{".":"./index.js","./portal":"./scripts/node.js","./router":"./scripts/router.js"},"gitHead":"cd739afe1cf1f06148916a3ea4e9785dcef81741","scripts":{"bots":"node scripts/bots.js","stop":"pkill kdht","test":"npx jasmine && npm run testWebrtc && echo '-- SUCCESS --' || echo '**** FAIL ****'","start":"node scripts/portal.js --externalBaseURL https://dorado.ngrok.io/kdht","background":"npm stop; (npm start 1>server.log 2>&1 &); sleep 1","testWebrtc":"npm stop; npx jasmine spec/testWebrtc.js","thrashbots":"node scripts/bots.js --thrash","withoutExternal":"node scripts/portal.js"},"_npmUser":{"name":"howard.stearns","email":"stearns@alum.mit.edu"},"repository":{"url":"git+https://github.com/YZ-social/kdht.git","type":"git"},"_npmVersion":"10.9.4","description":"Pure Kademlia base, for testing variations.","directories":{},"_nodeVersion":"22.21.1","dependencies":{"uuid":"^13.0.0","@yz-social/webrtc":"^0.1.4"},"publishConfig":{"registry":"https://registry.npmjs.org"},"_hasShrinkwrap":false,"devDependencies":{"yargs":"^18.0.0","morgan":"^1.10.1","express":"^5.2.1","jasmine":"^5.12.0"},"_npmOperationalInternal":{"tmp":"tmp/kdht_0.1.20_1773086282617_0.3063840361359427","host":"s3://npm-registry-packages-npm-production"}},"0.1.21":{"name":"@yz-social/kdht","version":"0.1.21","_id":"@yz-social/kdht@0.1.21","maintainers":[{"name":"howard.stearns","email":"stearns@alum.mit.edu"}],"homepage":"https://github.com/YZ-social/kdht#readme","bugs":{"url":"https://github.com/YZ-social/kdht/issues"},"dist":{"shasum":"949640a565b1566cf1f2bb6bcc289a8e47e677a4","tarball":"https://registry.npmjs.org/@yz-social/kdht/-/kdht-0.1.21.tgz","fileCount":32,"integrity":"sha512-AYELlURSKaP6x0xx/zb4kuyOFxMTsxGNY+53xsyik5CLfQM6J38/oiOHSNJhxxf/eRfFBaAq3iVg9ExKIhWPeA==","signatures":[{"sig":"MEUCICXasWnSLk2LNsZCY8ZuVxYArledCyvlhUThMTrXKL0MAiEAtcjlF1HvADghmFrhhvFxnb5rnBnKwfeWXtjetzcGvkU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":185765},"type":"module","exports":{".":"./index.js","./portal":"./scripts/node.js","./router":"./scripts/router.js"},"gitHead":"131d8fb33832b04d658a11ced4a72b41d73aac9f","scripts":{"bots":"node scripts/bots.js","stop":"pkill kdht","test":"npx jasmine && npm run testWebrtc && echo '-- SUCCESS --' || echo '**** FAIL ****'","start":"node scripts/portal.js --externalBaseURL https://dorado.ngrok.io/kdht","background":"npm stop; (npm start 1>server.log 2>&1 &); sleep 1","testWebrtc":"npm stop; npx jasmine spec/testWebrtc.js","thrashbots":"node scripts/bots.js --thrash","withoutExternal":"node scripts/portal.js"},"_npmUser":{"name":"howard.stearns","email":"stearns@alum.mit.edu"},"repository":{"url":"git+https://github.com/YZ-social/kdht.git","type":"git"},"_npmVersion":"10.9.4","description":"Pure Kademlia base, for testing variations.","directories":{},"_nodeVersion":"22.21.1","dependencies":{"uuid":"^13.0.0","@yz-social/webrtc":"^0.1.5"},"publishConfig":{"registry":"https://registry.npmjs.org"},"_hasShrinkwrap":false,"devDependencies":{"yargs":"^18.0.0","morgan":"^1.10.1","express":"^5.2.1","jasmine":"^5.12.0"},"_npmOperationalInternal":{"tmp":"tmp/kdht_0.1.21_1773259444131_0.9194704412455998","host":"s3://npm-registry-packages-npm-production"}},"0.1.22":{"name":"@yz-social/kdht","version":"0.1.22","_id":"@yz-social/kdht@0.1.22","maintainers":[{"name":"howard.stearns","email":"stearns@alum.mit.edu"}],"homepage":"https://github.com/YZ-social/kdht#readme","bugs":{"url":"https://github.com/YZ-social/kdht/issues"},"dist":{"shasum":"7b7fe10ecca5c7043e769385eab3632a4aafa8bc","tarball":"https://registry.npmjs.org/@yz-social/kdht/-/kdht-0.1.22.tgz","fileCount":35,"integrity":"sha512-DYGUQPbWurUKkB+DJ3dpDrbhdrILYuzj5IGA9hCzyS9m9WIhnVT7asLf9H4x0DlZ0PiLOhbjXvtgCcfi8WZ5Qw==","signatures":[{"sig":"MEUCIQCuKGjf6ZIzgCcN4SNFzbx6JmWqGg9lBMzeMYFY/6NbSAIgCTqp7RP1l1uMFSk4e13sqrED0/IGUCAj8cN+Q/ELPuc=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":260834},"type":"module","exports":{".":"./index.js","./portal":"./scripts/node.js","./router":"./scripts/router.js"},"gitHead":"0c84fb6ea85f87c638272a8a552167c1c6ecc882","scripts":{"bots":"node scripts/bots.js","stop":"pkill kdht","test":"npx jasmine && npm run testWebrtc && echo '-- SUCCESS --' || echo '**** FAIL ****'","start":"node scripts/portal.js --externalBaseURL https://dorado.ngrok.io/kdht","background":"npm stop; (npm start 1>server.log 2>&1 &); sleep 1","testWebrtc":"npm stop; npx jasmine spec/testWebrtc.js","thrashbots":"node scripts/bots.js --thrash","withoutExternal":"node scripts/portal.js"},"_npmUser":{"name":"howard.stearns","email":"stearns@alum.mit.edu"},"repository":{"url":"git+https://github.com/YZ-social/kdht.git","type":"git"},"_npmVersion":"10.9.4","description":"Pure Kademlia base, for testing variations.","directories":{},"_nodeVersion":"22.21.1","dependencies":{"uuid":"^13.0.0","node-turn":"^0.0.6","@yz-social/webrtc":"^0.1.6"},"publishConfig":{"registry":"https://registry.npmjs.org"},"_hasShrinkwrap":false,"devDependencies":{"yargs":"^18.0.0","morgan":"^1.10.1","express":"^5.2.1","jasmine":"^5.12.0"},"_npmOperationalInternal":{"tmp":"tmp/kdht_0.1.22_1773608872950_0.7890280930208542","host":"s3://npm-registry-packages-npm-production"}},"0.1.23":{"name":"@yz-social/kdht","version":"0.1.23","_id":"@yz-social/kdht@0.1.23","maintainers":[{"name":"howard.stearns","email":"stearns@alum.mit.edu"}],"homepage":"https://github.com/YZ-social/kdht#readme","bugs":{"url":"https://github.com/YZ-social/kdht/issues"},"dist":{"shasum":"cbc090d79a7c9db13fa882fa7883881fe9ae2eb3","tarball":"https://registry.npmjs.org/@yz-social/kdht/-/kdht-0.1.23.tgz","fileCount":35,"integrity":"sha512-BhFDgR9Yvk4Ox/fkQeqFmhUWPlPjfL83cPvcm8Ms+/srdT74fqmbora4j0ntxLcTfW4jvYPYgTcgPO9J8b4tIw==","signatures":[{"sig":"MEUCIBjD5JNuyE5AfctqNGWyhCYp4hYBJWv3Dr4BiqVaLKMSAiEAuDEh7jWgXpXQ2SVd1lRhH8/LNZwkAdqche72kJBMZ7g=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":260972},"type":"module","exports":{".":"./index.js","./portal":"./scripts/node.js","./router":"./scripts/router.js"},"gitHead":"40cb62c8722d3ec6eebd43150d80c84efca5c1d7","scripts":{"bots":"node scripts/bots.js","stop":"pkill kdht","test":"npx jasmine && npm run testWebrtc && echo '-- SUCCESS --' || echo '**** FAIL ****'","start":"node scripts/portal.js --externalBaseURL https://dorado.ngrok.io/kdht","background":"npm stop; (npm start 1>server.log 2>&1 &); sleep 1","testWebrtc":"npm stop; npx jasmine spec/testWebrtc.js","thrashbots":"node scripts/bots.js --thrash","withoutExternal":"node scripts/portal.js"},"_npmUser":{"name":"howard.stearns","email":"stearns@alum.mit.edu"},"repository":{"url":"git+https://github.com/YZ-social/kdht.git","type":"git"},"_npmVersion":"10.9.4","description":"Pure Kademlia base, for testing variations.","directories":{},"_nodeVersion":"22.21.1","dependencies":{"uuid":"^13.0.0","node-turn":"^0.0.6","@yz-social/webrtc":"^0.1.6"},"publishConfig":{"registry":"https://registry.npmjs.org"},"_hasShrinkwrap":false,"devDependencies":{"yargs":"^18.0.0","morgan":"^1.10.1","express":"^5.2.1","jasmine":"^5.12.0"},"_npmOperationalInternal":{"tmp":"tmp/kdht_0.1.23_1773613270075_0.6240177009728216","host":"s3://npm-registry-packages-npm-production"}},"0.1.24":{"name":"@yz-social/kdht","version":"0.1.24","_id":"@yz-social/kdht@0.1.24","maintainers":[{"name":"howard.stearns","email":"stearns@alum.mit.edu"}],"homepage":"https://github.com/YZ-social/kdht#readme","bugs":{"url":"https://github.com/YZ-social/kdht/issues"},"dist":{"shasum":"6c28b7b8e2c161897ba1379a5da22fd2a0f64249","tarball":"https://registry.npmjs.org/@yz-social/kdht/-/kdht-0.1.24.tgz","fileCount":35,"integrity":"sha512-YEAYABpz59Jyfu6CPTOUy3uDYScmBiCqMFMtYvutgzswhfCwtoAu/KPaeSswF3+4AmXe0UpnQxIuFLiR9alvzw==","signatures":[{"sig":"MEUCIQCRGKdtD1h3qdHd19JQ1c/u3gJXnk2hgPLKtm1qad2MUwIgLF1sfw1M5uBfq1MueyAekXm0hTcjytodySIXRzly47s=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":261471},"type":"module","exports":{".":"./index.js","./portal":"./scripts/node.js","./router":"./scripts/router.js"},"gitHead":"0847065bbf02509478f14352a32236bc7908ea85","scripts":{"bots":"node scripts/bots.js","stop":"pkill kdht","test":"npx jasmine && npm run testWebrtc && echo '-- SUCCESS --' || echo '**** FAIL ****'","start":"node scripts/portal.js --externalBaseURL https://dorado.ngrok.io/kdht","background":"npm stop; (npm start 1>server.log 2>&1 &); sleep 1","testWebrtc":"npm stop; npx jasmine spec/testWebrtc.js","thrashbots":"node scripts/bots.js --thrash","withoutExternal":"node scripts/portal.js"},"_npmUser":{"name":"howard.stearns","email":"stearns@alum.mit.edu"},"repository":{"url":"git+https://github.com/YZ-social/kdht.git","type":"git"},"_npmVersion":"10.9.4","description":"Pure Kademlia base, for testing variations.","directories":{},"_nodeVersion":"22.21.1","dependencies":{"uuid":"^13.0.0","node-turn":"^0.0.6","@yz-social/webrtc":"^0.1.6"},"publishConfig":{"registry":"https://registry.npmjs.org"},"_hasShrinkwrap":false,"devDependencies":{"yargs":"^18.0.0","morgan":"^1.10.1","express":"^5.2.1","jasmine":"^5.12.0"},"_npmOperationalInternal":{"tmp":"tmp/kdht_0.1.24_1773619528124_0.3263883433519712","host":"s3://npm-registry-packages-npm-production"}},"0.1.25":{"name":"@yz-social/kdht","version":"0.1.25","_id":"@yz-social/kdht@0.1.25","maintainers":[{"name":"howard.stearns","email":"stearns@alum.mit.edu"}],"homepage":"https://github.com/YZ-social/kdht#readme","bugs":{"url":"https://github.com/YZ-social/kdht/issues"},"dist":{"shasum":"b67632ce4eb4808f1477996a37d36bd988427208","tarball":"https://registry.npmjs.org/@yz-social/kdht/-/kdht-0.1.25.tgz","fileCount":35,"integrity":"sha512-nw4esCbz+CVLYApHWAXuZ7cWUv0KEFJhh0oWkxZmEzTghPf7b/ja21mufCI0NoUPOrpcYMIjBySrmqfhaDcMIQ==","signatures":[{"sig":"MEYCIQDzF6KQR6DY/W+EasLHNYUqg/SN9TwtmjbPFnazVgx5iQIhALlMr2xKsM3YM5Jnv5aa/s/oRS3qp2OuCcqY/ti6HbbN","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":261476},"type":"module","exports":{".":"./index.js","./portal":"./scripts/node.js","./router":"./scripts/router.js"},"gitHead":"422fd98cdcc9332dc6cc05b471e98ba41c50d05d","scripts":{"bots":"node scripts/bots.js","stop":"pkill kdht","test":"npx jasmine && npm run testWebrtc && echo '-- SUCCESS --' || echo '**** FAIL ****'","start":"node scripts/portal.js --externalBaseURL https://dorado.ngrok.io/kdht","background":"npm stop; (npm start 1>server.log 2>&1 &); sleep 1","testWebrtc":"npm stop; npx jasmine spec/testWebrtc.js","thrashbots":"node scripts/bots.js --thrash","withoutExternal":"node scripts/portal.js"},"_npmUser":{"name":"howard.stearns","email":"stearns@alum.mit.edu"},"repository":{"url":"git+https://github.com/YZ-social/kdht.git","type":"git"},"_npmVersion":"10.9.4","description":"Pure Kademlia base, for testing variations.","directories":{},"_nodeVersion":"22.21.1","dependencies":{"uuid":"^13.0.0","node-turn":"^0.0.6","@yz-social/webrtc":"^0.1.6"},"publishConfig":{"registry":"https://registry.npmjs.org"},"_hasShrinkwrap":false,"devDependencies":{"yargs":"^18.0.0","morgan":"^1.10.1","express":"^5.2.1","jasmine":"^5.12.0"},"_npmOperationalInternal":{"tmp":"tmp/kdht_0.1.25_1773620257407_0.7372889334498534","host":"s3://npm-registry-packages-npm-production"}},"0.1.26":{"name":"@yz-social/kdht","version":"0.1.26","_id":"@yz-social/kdht@0.1.26","maintainers":[{"name":"howard.stearns","email":"stearns@alum.mit.edu"}],"homepage":"https://github.com/YZ-social/kdht#readme","bugs":{"url":"https://github.com/YZ-social/kdht/issues"},"dist":{"shasum":"0e81150fdd5a6a1a1901e9a24d017ed0df006e48","tarball":"https://registry.npmjs.org/@yz-social/kdht/-/kdht-0.1.26.tgz","fileCount":35,"integrity":"sha512-MtIpiRZVXaOu++N3L6dKDAyqozoqYIQDSHOf0zr+P/e1ynRP1YwVIpp4WsizgnqFdr75JURJvdJkiNHq356Uxw==","signatures":[{"sig":"MEYCIQDTy0FNLO6H4oHFfN/OPNZPpudPkraAXp20LQLinuPKzgIhAJhM0j2t2l3zoN9NeJ3c8YhZ+is4HpIlDaMkJiba4+Td","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":261685},"type":"module","exports":{".":"./index.js","./portal":"./scripts/node.js","./router":"./scripts/router.js"},"gitHead":"778d222d473d236c9563ce08a4522aaf063567a9","scripts":{"bots":"node scripts/bots.js","stop":"pkill kdht","test":"npx jasmine && npm run testWebrtc && echo '-- SUCCESS --' || echo '**** FAIL ****'","start":"node scripts/portal.js --externalBaseURL https://dorado.ngrok.io/kdht","background":"npm stop; (npm start 1>server.log 2>&1 &); sleep 1","testWebrtc":"npm stop; npx jasmine spec/testWebrtc.js","thrashbots":"node scripts/bots.js --thrash","withoutExternal":"node scripts/portal.js"},"_npmUser":{"name":"howard.stearns","email":"stearns@alum.mit.edu"},"repository":{"url":"git+https://github.com/YZ-social/kdht.git","type":"git"},"_npmVersion":"10.9.4","description":"Pure Kademlia base, for testing variations.","directories":{},"_nodeVersion":"22.21.1","dependencies":{"uuid":"^13.0.0","node-turn":"^0.0.6","@yz-social/webrtc":"^0.1.6"},"publishConfig":{"registry":"https://registry.npmjs.org"},"_hasShrinkwrap":false,"devDependencies":{"yargs":"^18.0.0","morgan":"^1.10.1","express":"^5.2.1","jasmine":"^5.12.0"},"_npmOperationalInternal":{"tmp":"tmp/kdht_0.1.26_1773682501621_0.7036958213325941","host":"s3://npm-registry-packages-npm-production"}},"0.1.27":{"name":"@yz-social/kdht","version":"0.1.27","_id":"@yz-social/kdht@0.1.27","maintainers":[{"name":"howard.stearns","email":"stearns@alum.mit.edu"}],"homepage":"https://github.com/YZ-social/kdht#readme","bugs":{"url":"https://github.com/YZ-social/kdht/issues"},"dist":{"shasum":"88ee5bc6ccd7e756b78ea2dbd5dfd9f0650e6e79","tarball":"https://registry.npmjs.org/@yz-social/kdht/-/kdht-0.1.27.tgz","fileCount":35,"integrity":"sha512-t38AbDXb3K8I+T8cB+Glpc4duRZywHB2QEmO0Cmxn3NdfSrhe7reZM58FOZA8dTOt94qIywwNk9yHPZIJ3zpNw==","signatures":[{"sig":"MEUCIQDg35PhlJuEsXhc6ViTwFDJH8h+2fIezO5s84lpEx/6mQIgDB65qIPxpMGuR0nN8DNZU2cLcDt3Hoy9Ma21N+tQlFw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":261969},"type":"module","exports":{".":"./index.js","./portal":"./scripts/node.js","./router":"./scripts/router.js"},"gitHead":"1a7d1a7e21904d1cad933537cef878708e484601","scripts":{"bots":"node scripts/bots.js","stop":"pkill kdht","test":"npx jasmine && npm run testWebrtc && echo '-- SUCCESS --' || echo '**** FAIL ****'","start":"node scripts/portal.js --externalBaseURL https://dorado.ngrok.io/kdht","background":"npm stop; (npm start 1>server.log 2>&1 &); sleep 1","testWebrtc":"npm stop; npx jasmine spec/testWebrtc.js","thrashbots":"node scripts/bots.js --thrash","withoutExternal":"node scripts/portal.js"},"_npmUser":{"name":"howard.stearns","email":"stearns@alum.mit.edu"},"repository":{"url":"git+https://github.com/YZ-social/kdht.git","type":"git"},"_npmVersion":"10.9.4","description":"Pure Kademlia base, for testing variations.","directories":{},"_nodeVersion":"22.21.1","dependencies":{"uuid":"^13.0.0","node-turn":"^0.0.6","@yz-social/webrtc":"^0.1.6"},"publishConfig":{"registry":"https://registry.npmjs.org"},"_hasShrinkwrap":false,"devDependencies":{"yargs":"^18.0.0","morgan":"^1.10.1","express":"^5.2.1","jasmine":"^5.12.0"},"_npmOperationalInternal":{"tmp":"tmp/kdht_0.1.27_1773869039069_0.5429983528090037","host":"s3://npm-registry-packages-npm-production"}},"0.1.28":{"name":"@yz-social/kdht","version":"0.1.28","_id":"@yz-social/kdht@0.1.28","maintainers":[{"name":"howard.stearns","email":"stearns@alum.mit.edu"}],"homepage":"https://github.com/YZ-social/kdht#readme","bugs":{"url":"https://github.com/YZ-social/kdht/issues"},"dist":{"shasum":"bd3fbbcb5fedd857ac91f769378fae9f788136f8","tarball":"https://registry.npmjs.org/@yz-social/kdht/-/kdht-0.1.28.tgz","fileCount":35,"integrity":"sha512-DRg9HofMcOiJNiMUn+THp+eq+JB2FL59NEkAQcvi3ojWerUsjaaJm4a68wdnqR0DFsStc1jgl0IqzxgJsjP1IQ==","signatures":[{"sig":"MEYCIQD09P4095JVSGmUyfYI1ZIsPNQjhCh/kbrwzes968FJowIhAIt28Eic6I1XzBwuCkJ0uFW5/9rc69jrM3OXS82AjbA2","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":261791},"type":"module","exports":{".":"./index.js","./portal":"./scripts/node.js","./router":"./scripts/router.js"},"gitHead":"60dc6f6d12853696c0c8d7f652961f531639734f","scripts":{"bots":"node scripts/bots.js","stop":"pkill kdht","test":"npx jasmine && npm run testWebrtc && echo '-- SUCCESS --' || echo '**** FAIL ****'","start":"node scripts/portal.js --externalBaseURL https://dorado.ngrok.io/kdht","background":"npm stop; (npm start 1>server.log 2>&1 &); sleep 1","testWebrtc":"npm stop; npx jasmine spec/testWebrtc.js","thrashbots":"node scripts/bots.js --thrash","withoutExternal":"node scripts/portal.js"},"_npmUser":{"name":"howard.stearns","email":"stearns@alum.mit.edu"},"repository":{"url":"git+https://github.com/YZ-social/kdht.git","type":"git"},"_npmVersion":"10.9.4","description":"Pure Kademlia base, for testing variations.","directories":{},"_nodeVersion":"22.21.1","dependencies":{"uuid":"^13.0.0","node-turn":"^0.0.6","@yz-social/webrtc":"^0.1.6"},"publishConfig":{"registry":"https://registry.npmjs.org"},"_hasShrinkwrap":false,"devDependencies":{"yargs":"^18.0.0","morgan":"^1.10.1","express":"^5.2.1","jasmine":"^5.12.0"},"_npmOperationalInternal":{"tmp":"tmp/kdht_0.1.28_1774055343926_0.5595292826916676","host":"s3://npm-registry-packages-npm-production"}},"0.1.30":{"name":"@yz-social/kdht","version":"0.1.30","_id":"@yz-social/kdht@0.1.30","maintainers":[{"name":"howard.stearns","email":"stearns@alum.mit.edu"}],"homepage":"https://github.com/YZ-social/kdht#readme","bugs":{"url":"https://github.com/YZ-social/kdht/issues"},"dist":{"shasum":"0d1b51e5dc355fe16dea2872ba76024f115bb2a8","tarball":"https://registry.npmjs.org/@yz-social/kdht/-/kdht-0.1.30.tgz","fileCount":35,"integrity":"sha512-zM2Mldv/IsXSUe61z+cXGebK1lxcg6n6ocb+pq2q807Th4ZGE6/CIWQYMBXOpDIUQ++KyUmJh4K6AJw4Nh+gdQ==","signatures":[{"sig":"MEYCIQCx11kerKumqAB54rphyM9nfY7sfa7LZHQlHsEP0gYnegIhAOpzSLE4HUOtDEntYX2QSGu5VHuuLwefiTZVgpCDZshP","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":265006},"type":"module","exports":{".":"./index.js","./portal":"./scripts/node.js","./router":"./scripts/router.js"},"gitHead":"a89bbc9cea62ebcaa0af35a2c882ac2f3d069363","scripts":{"bots":"node scripts/bots.js","stop":"pkill kdht","test":"npx jasmine && npm run testWebrtc && echo '-- SUCCESS --' || echo '**** FAIL ****'","start":"node scripts/portal.js --externalBaseURL https://dorado.ngrok.io/kdht","background":"npm stop; (npm start 1>server.log 2>&1 &); sleep 1","testWebrtc":"npm stop; npx jasmine spec/testWebrtc.js","thrashbots":"node scripts/bots.js --thrash","withoutExternal":"node scripts/portal.js"},"_npmUser":{"name":"howard.stearns","email":"stearns@alum.mit.edu"},"repository":{"url":"git+https://github.com/YZ-social/kdht.git","type":"git"},"_npmVersion":"10.9.4","description":"Pure Kademlia base, for testing variations.","directories":{},"_nodeVersion":"22.21.1","dependencies":{"uuid":"^13.0.0","node-turn":"^0.0.6","@yz-social/webrtc":"^0.1.7"},"publishConfig":{"registry":"https://registry.npmjs.org"},"_hasShrinkwrap":false,"devDependencies":{"yargs":"^18.0.0","morgan":"^1.10.1","express":"^5.2.1","jasmine":"^5.12.0"},"_npmOperationalInternal":{"tmp":"tmp/kdht_0.1.30_1774452405213_0.5061718017526584","host":"s3://npm-registry-packages-npm-production"}},"0.1.31":{"name":"@yz-social/kdht","version":"0.1.31","_id":"@yz-social/kdht@0.1.31","maintainers":[{"name":"howard.stearns","email":"stearns@alum.mit.edu"}],"homepage":"https://github.com/YZ-social/kdht#readme","bugs":{"url":"https://github.com/YZ-social/kdht/issues"},"dist":{"shasum":"4eed56e7492c561bb7ce6b20731a241d92d1541b","tarball":"https://registry.npmjs.org/@yz-social/kdht/-/kdht-0.1.31.tgz","fileCount":35,"integrity":"sha512-4gUlBJmwGSxQQyuqvUFvaDAMLmuT4FO9k1+9hA8sexofK9X2o/AseltwTHQYRaAtEcQWYXyoU9lNjw8ZaI9q2w==","signatures":[{"sig":"MEUCIFUGxiK4rTtpyP5kZtli/5thFLPkhpRzM7icCkza3n+/AiEA8pu9hWSdaaPrY7XLSFP3fkxMdiaxTXgXRMN9FU2a3xk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":265037},"type":"module","exports":{".":"./index.js","./portal":"./scripts/node.js","./router":"./scripts/router.js"},"gitHead":"0a170f9acd6753753c23f636c4b4a504d4f16a20","scripts":{"bots":"node scripts/bots.js","stop":"pkill kdht","test":"npx jasmine && npm run testWebrtc && echo '-- SUCCESS --' || echo '**** FAIL ****'","start":"node scripts/portal.js --externalBaseURL https://dorado.ngrok.io/kdht","background":"npm stop; (npm start 1>server.log 2>&1 &); sleep 1","testWebrtc":"npm stop; npx jasmine spec/testWebrtc.js","thrashbots":"node scripts/bots.js --thrash","withoutExternal":"node scripts/portal.js"},"_npmUser":{"name":"howard.stearns","email":"stearns@alum.mit.edu"},"repository":{"url":"git+https://github.com/YZ-social/kdht.git","type":"git"},"_npmVersion":"10.9.4","description":"Pure Kademlia base, for testing variations.","directories":{},"_nodeVersion":"22.21.1","dependencies":{"uuid":"^13.0.0","node-turn":"^0.0.6","@yz-social/webrtc":"^0.1.7"},"publishConfig":{"registry":"https://registry.npmjs.org"},"_hasShrinkwrap":false,"devDependencies":{"yargs":"^18.0.0","morgan":"^1.10.1","express":"^5.2.1","jasmine":"^5.12.0"},"_npmOperationalInternal":{"tmp":"tmp/kdht_0.1.31_1774736878516_0.9734826765339952","host":"s3://npm-registry-packages-npm-production"}},"0.1.32":{"name":"@yz-social/kdht","version":"0.1.32","_id":"@yz-social/kdht@0.1.32","maintainers":[{"name":"howard.stearns","email":"stearns@alum.mit.edu"}],"homepage":"https://github.com/YZ-social/kdht#readme","bugs":{"url":"https://github.com/YZ-social/kdht/issues"},"dist":{"shasum":"f0f32e99f5e8d09eba287b43da5d0cf789e92693","tarball":"https://registry.npmjs.org/@yz-social/kdht/-/kdht-0.1.32.tgz","fileCount":35,"integrity":"sha512-YbGGQ8jjFiqCw+OTArQx4R7/Fclr10I/V6XcR/KenABBSfVeMxdNgeU9EsEL3NMp2g/Hl6OqSOM3pKvWxt6UmA==","signatures":[{"sig":"MEYCIQCPXm5kWTX/2BAP2y1nLGxl7CYpqHYy+QFcWJW4SkzKWwIhAO0PdKlHSH0gMlOZ79/6wkjC7m1w2KlrJfTgFOSAwNI4","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":265528},"type":"module","exports":{".":"./index.js","./portal":"./scripts/node.js","./router":"./scripts/router.js"},"gitHead":"c83c70411d5e0133dc2ee90ce7a9b55fe44d6f31","scripts":{"bots":"node scripts/bots.js","stop":"pkill kdht","test":"npx jasmine && npm run testWebrtc && echo '-- SUCCESS --' || echo '**** FAIL ****'","start":"node scripts/portal.js --externalBaseURL https://dorado.ngrok.io/kdht","background":"npm stop; (npm start 1>server.log 2>&1 &); sleep 1","testWebrtc":"npm stop; npx jasmine spec/testWebrtc.js","thrashbots":"node scripts/bots.js --thrash","withoutExternal":"node scripts/portal.js"},"_npmUser":{"name":"howard.stearns","email":"stearns@alum.mit.edu"},"repository":{"url":"git+https://github.com/YZ-social/kdht.git","type":"git"},"_npmVersion":"10.9.4","description":"Pure Kademlia base, for testing variations.","directories":{},"_nodeVersion":"22.21.1","dependencies":{"uuid":"^13.0.0","node-turn":"^0.0.6","@yz-social/webrtc":"^0.1.7"},"publishConfig":{"registry":"https://registry.npmjs.org"},"_hasShrinkwrap":false,"devDependencies":{"cors":"^2.8.6","yargs":"^18.0.0","morgan":"^1.10.1","express":"^5.2.1","jasmine":"^5.12.0"},"_npmOperationalInternal":{"tmp":"tmp/kdht_0.1.32_1774828178571_0.5563207054324286","host":"s3://npm-registry-packages-npm-production"}},"0.1.33":{"name":"@yz-social/kdht","version":"0.1.33","_id":"@yz-social/kdht@0.1.33","maintainers":[{"name":"howard.stearns","email":"stearns@alum.mit.edu"}],"homepage":"https://github.com/YZ-social/kdht#readme","bugs":{"url":"https://github.com/YZ-social/kdht/issues"},"dist":{"shasum":"0d227dc031dda6e348ce748b51f15fe4a7293044","tarball":"https://registry.npmjs.org/@yz-social/kdht/-/kdht-0.1.33.tgz","fileCount":35,"integrity":"sha512-mzaDVo0dJdqyXchJuNJ4odVcBXz4d8m+uA2wQrmBRNlnhKoKuSriZMwOq/rgTxJnK0DB6HcfOmiBeEbUzLx1rg==","signatures":[{"sig":"MEUCIQDQYe/VtiRKKY/Jw9qhNk/YTEUsoPDelodwP5S2KjK8yQIgLxJX0t5VL8l3ThJMvR8sc3DtgG1w2oeIRNCe18Z5iJ8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":265573},"type":"module","exports":{".":"./index.js","./portal":"./scripts/node.js","./router":"./scripts/router.js"},"gitHead":"d944816c153985665a2db124daec28d62247e58a","scripts":{"bots":"node scripts/bots.js","stop":"pkill kdht","test":"npx jasmine && npm run testWebrtc && echo '-- SUCCESS --' || echo '**** FAIL ****'","start":"node scripts/portal.js --externalBaseURL https://dorado.ngrok.io/kdht","background":"npm stop; (npm start 1>server.log 2>&1 &); sleep 1","testWebrtc":"npm stop; npx jasmine spec/testWebrtc.js","thrashbots":"node scripts/bots.js --thrash","withoutExternal":"node scripts/portal.js"},"_npmUser":{"name":"howard.stearns","email":"stearns@alum.mit.edu"},"overrides":{"log4js":"^6.9.1"},"repository":{"url":"git+https://github.com/YZ-social/kdht.git","type":"git"},"_npmVersion":"10.9.4","description":"Pure Kademlia base, for testing variations.","directories":{},"_nodeVersion":"22.21.1","dependencies":{"uuid":"^13.0.0","node-turn":"^0.0.6","@yz-social/webrtc":"^0.1.7"},"publishConfig":{"registry":"https://registry.npmjs.org"},"_hasShrinkwrap":false,"devDependencies":{"cors":"^2.8.6","yargs":"^18.0.0","morgan":"^1.10.1","express":"^5.2.1","jasmine":"^5.12.0"},"_npmOperationalInternal":{"tmp":"tmp/kdht_0.1.33_1774829918588_0.696989116727363","host":"s3://npm-registry-packages-npm-production"}},"0.1.34":{"name":"@yz-social/kdht","version":"0.1.34","_id":"@yz-social/kdht@0.1.34","maintainers":[{"name":"howard.stearns","email":"stearns@alum.mit.edu"}],"homepage":"https://github.com/YZ-social/kdht#readme","bugs":{"url":"https://github.com/YZ-social/kdht/issues"},"dist":{"shasum":"ca8ccfb3beb1b8844defcc5bce856267e2963e96","tarball":"https://registry.npmjs.org/@yz-social/kdht/-/kdht-0.1.34.tgz","fileCount":35,"integrity":"sha512-bHhm7v0+ueRwgYJq5VpotirkoEJsQsefNMuikJWRb8Flh2TZV6Eufa8hYr67JN8PyA+O4H3zqtcZ0gmdIONP6Q==","signatures":[{"sig":"MEUCIHCNh7L5L8ZV4BY4iK0S8V3MizXe8eN22x7VYYCodp9iAiEA5AAHRncjWgzZ3y1ul+rVqWUE+Qa4TcgYlGVNpwSNnnQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":265785},"type":"module","exports":{".":"./index.js","./portal":"./scripts/node.js","./router":"./scripts/router.js"},"gitHead":"5a53183678ba17440a0fcf236bf5113a4f3ace16","scripts":{"bots":"node scripts/bots.js","stop":"pkill kdht","test":"npx jasmine && npm run testWebrtc && echo '-- SUCCESS --' || echo '**** FAIL ****'","start":"node scripts/portal.js --externalBaseURL https://dorado.ngrok.io/kdht","background":"npm stop; (npm start 1>server.log 2>&1 &); sleep 1","testWebrtc":"npm stop; npx jasmine spec/testWebrtc.js","thrashbots":"node scripts/bots.js --thrash","withoutExternal":"node scripts/portal.js"},"_npmUser":{"name":"howard.stearns","email":"stearns@alum.mit.edu"},"overrides":{"log4js":"^6.9.1"},"repository":{"url":"git+https://github.com/YZ-social/kdht.git","type":"git"},"_npmVersion":"10.9.4","description":"Pure Kademlia base, for testing variations.","directories":{},"_nodeVersion":"22.21.1","dependencies":{"uuid":"^13.0.0","node-turn":"^0.0.6","@yz-social/webrtc":"^0.1.7"},"publishConfig":{"registry":"https://registry.npmjs.org"},"_hasShrinkwrap":false,"devDependencies":{"cors":"^2.8.6","yargs":"^18.0.0","morgan":"^1.10.1","express":"^5.2.1","jasmine":"^5.12.0"},"_npmOperationalInternal":{"tmp":"tmp/kdht_0.1.34_1774894972658_0.3022470439060223","host":"s3://npm-registry-packages-npm-production"}},"0.1.35":{"name":"@yz-social/kdht","version":"0.1.35","_id":"@yz-social/kdht@0.1.35","maintainers":[{"name":"howard.stearns","email":"stearns@alum.mit.edu"}],"homepage":"https://github.com/YZ-social/kdht#readme","bugs":{"url":"https://github.com/YZ-social/kdht/issues"},"dist":{"shasum":"699eb915f615bda0c0f0221d85b9907482c76648","tarball":"https://registry.npmjs.org/@yz-social/kdht/-/kdht-0.1.35.tgz","fileCount":35,"integrity":"sha512-pOvCwX2O8ih+vNhpT8q26o4WYuIekmsdncC6EeBNUusyjyvIJh0sGlLY0mJyGdFsAe9C2jH5l+uWyUhNjhp/nA==","signatures":[{"sig":"MEUCIQDAmEVmzlLF3lhv2BzbwX3r9MDEAe1m/drMmzygcbozOwIgWXLaq9f9yq4gL+egC1lZOaGFLHXhJEZJ0RuyGZHyZnc=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":265832},"type":"module","exports":{".":"./index.js","./portal":"./scripts/node.js","./router":"./scripts/router.js"},"gitHead":"6fc3a6402425ca701342e3e67696ca526adfad1e","scripts":{"bots":"node scripts/bots.js","stop":"pkill kdht","test":"npx jasmine && npm run testWebrtc && echo '-- SUCCESS --' || echo '**** FAIL ****'","start":"node scripts/portal.js --externalBaseURL https://dorado.ngrok.io/kdht","background":"npm stop; (npm start 1>server.log 2>&1 &); sleep 1","testWebrtc":"npm stop; npx jasmine spec/testWebrtc.js","thrashbots":"node scripts/bots.js --thrash","withoutExternal":"node scripts/portal.js"},"_npmUser":{"name":"howard.stearns","email":"stearns@alum.mit.edu"},"overrides":{"log4js":"^6.9.1"},"repository":{"url":"git+https://github.com/YZ-social/kdht.git","type":"git"},"_npmVersion":"10.9.4","description":"Pure Kademlia base, for testing variations.","directories":{},"_nodeVersion":"22.21.1","dependencies":{"uuid":"^13.0.0","node-turn":"^0.0.6","@yz-social/webrtc":"^0.1.7"},"publishConfig":{"registry":"https://registry.npmjs.org"},"_hasShrinkwrap":false,"devDependencies":{"cors":"^2.8.6","yargs":"^18.0.0","morgan":"^1.10.1","express":"^5.2.1","jasmine":"^5.12.0"},"_npmOperationalInternal":{"tmp":"tmp/kdht_0.1.35_1774903005053_0.32046265239561866","host":"s3://npm-registry-packages-npm-production"}},"0.1.36":{"name":"@yz-social/kdht","version":"0.1.36","_id":"@yz-social/kdht@0.1.36","maintainers":[{"name":"howard.stearns","email":"stearns@alum.mit.edu"}],"homepage":"https://github.com/YZ-social/kdht#readme","bugs":{"url":"https://github.com/YZ-social/kdht/issues"},"dist":{"shasum":"e19f2988757730d38d3f8b94942882a1c0b410e2","tarball":"https://registry.npmjs.org/@yz-social/kdht/-/kdht-0.1.36.tgz","fileCount":35,"integrity":"sha512-6zvNGaimSphpSgniEO/yDwCycxyQ06QYRlv7KjKuIgLrlWmDCYCM9FPFjsvS9vl1QrYTSgf0TZBZdI7zoidp2Q==","signatures":[{"sig":"MEUCIEW99O65ugk6HFkcWYc+XKCBi1JcFCe3okuIaCjOfrEBAiEAg3uCaeLowk3Dftozok8+q/DHKh3O4SOvgvTIW41lpc8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":266038},"type":"module","exports":{".":"./index.js","./portal":"./scripts/node.js","./router":"./scripts/router.js"},"gitHead":"51cda8273d57b25bbed94c42e641712838151240","scripts":{"bots":"node scripts/bots.js","stop":"pkill kdht","test":"npx jasmine && npm run testWebrtc && echo '-- SUCCESS --' || echo '**** FAIL ****'","start":"node scripts/portal.js --externalBaseURL https://dorado.ngrok.io/kdht","background":"npm stop; (npm start 1>server.log 2>&1 &); sleep 1","testWebrtc":"npm stop; npx jasmine spec/testWebrtc.js","thrashbots":"node scripts/bots.js --thrash","withoutExternal":"node scripts/portal.js"},"_npmUser":{"name":"howard.stearns","email":"stearns@alum.mit.edu"},"overrides":{"log4js":"^6.9.1"},"repository":{"url":"git+https://github.com/YZ-social/kdht.git","type":"git"},"_npmVersion":"10.9.4","description":"Pure Kademlia base, for testing variations.","directories":{},"_nodeVersion":"22.21.1","dependencies":{"uuid":"^13.0.0","node-turn":"^0.0.6","@yz-social/webrtc":"^0.1.7"},"publishConfig":{"registry":"https://registry.npmjs.org"},"_hasShrinkwrap":false,"devDependencies":{"cors":"^2.8.6","yargs":"^18.0.0","morgan":"^1.10.1","express":"^5.2.1","jasmine":"^5.12.0"},"_npmOperationalInternal":{"tmp":"tmp/kdht_0.1.36_1774904641835_0.8130222881397655","host":"s3://npm-registry-packages-npm-production"}},"0.1.37":{"name":"@yz-social/kdht","version":"0.1.37","_id":"@yz-social/kdht@0.1.37","maintainers":[{"name":"howard.stearns","email":"stearns@alum.mit.edu"}],"homepage":"https://github.com/YZ-social/kdht#readme","bugs":{"url":"https://github.com/YZ-social/kdht/issues"},"dist":{"shasum":"7759a5e35ca8c9a5ff226639e6f7aa1a0660d740","tarball":"https://registry.npmjs.org/@yz-social/kdht/-/kdht-0.1.37.tgz","fileCount":35,"integrity":"sha512-a0GxY8niSGjtYY/6q8Pu7vx6hBeWSu1q16T328+kzshpg4uK8cuyoW7vf5VjWW4JqzJePywia3o9sx//+5hDxg==","signatures":[{"sig":"MEQCIFgcyB/9KhSm2BkgO1LnOqBTHkxALxDrz8TlupI+eOq/AiA90tkcV74j3wP28QwOreRK62V0MO4mPOw4rDgNiXbZcA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":266138},"type":"module","exports":{".":"./index.js","./portal":"./scripts/node.js","./router":"./scripts/router.js"},"gitHead":"8e89466972bf3c21dccda30bbfd498ee9df7da69","scripts":{"bots":"node scripts/bots.js","stop":"pkill kdht","test":"npx jasmine && npm run testWebrtc && echo '-- SUCCESS --' || echo '**** FAIL ****'","start":"node scripts/portal.js --externalBaseURL https://dorado.ngrok.io/kdht","background":"npm stop; (npm start 1>server.log 2>&1 &); sleep 1","testWebrtc":"npm stop; npx jasmine spec/testWebrtc.js","thrashbots":"node scripts/bots.js --thrash","withoutExternal":"node scripts/portal.js"},"_npmUser":{"name":"howard.stearns","email":"stearns@alum.mit.edu"},"overrides":{"log4js":"^6.9.1"},"repository":{"url":"git+https://github.com/YZ-social/kdht.git","type":"git"},"_npmVersion":"10.9.4","description":"Pure Kademlia base, for testing variations.","directories":{},"_nodeVersion":"22.21.1","dependencies":{"uuid":"^13.0.0","node-turn":"^0.0.6","@yz-social/webrtc":"^0.1.8"},"publishConfig":{"registry":"https://registry.npmjs.org"},"_hasShrinkwrap":false,"devDependencies":{"cors":"^2.8.6","yargs":"^18.0.0","morgan":"^1.10.1","express":"^5.2.1","jasmine":"^5.12.0"},"_npmOperationalInternal":{"tmp":"tmp/kdht_0.1.37_1774997175713_0.697574595122167","host":"s3://npm-registry-packages-npm-production"}},"0.1.38":{"name":"@yz-social/kdht","version":"0.1.38","_id":"@yz-social/kdht@0.1.38","maintainers":[{"name":"howard.stearns","email":"stearns@alum.mit.edu"}],"homepage":"https://github.com/YZ-social/kdht#readme","bugs":{"url":"https://github.com/YZ-social/kdht/issues"},"dist":{"shasum":"772f088e7c93a461128d5105f1942c6510cff8dd","tarball":"https://registry.npmjs.org/@yz-social/kdht/-/kdht-0.1.38.tgz","fileCount":35,"integrity":"sha512-iuYNVGP3ynckkcWvN1LAZeRt5di0TjXagWRMaHd8l0hRVtqIzSOaK3B/jXbgTojZIf4Rla7rmTD3KLbwUBBwJA==","signatures":[{"sig":"MEUCIQDKczcq1yiAT9gED6zy8qRFAA+66m5kGNgdDZUe3zvW4gIgVSYywwIZ1QjWAV1JZXDOlV1Bno0BDX5JxiHmm8W15U0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":265907},"type":"module","exports":{".":"./index.js","./portal":"./scripts/node.js","./router":"./scripts/router.js"},"gitHead":"0de9f279b254b7e4bcf4fd753d15a6ce1e20a3a7","scripts":{"bots":"node scripts/bots.js","stop":"pkill kdht","test":"npx jasmine && npm run testWebrtc && echo '-- SUCCESS --' || echo '**** FAIL ****'","start":"node scripts/portal.js --externalBaseURL https://dorado.ngrok.io/kdht","background":"npm stop; (npm start 1>server.log 2>&1 &); sleep 1","testWebrtc":"npm stop; npx jasmine spec/testWebrtc.js","thrashbots":"node scripts/bots.js --thrash","withoutExternal":"node scripts/portal.js"},"_npmUser":{"name":"howard.stearns","email":"stearns@alum.mit.edu"},"overrides":{"log4js":"^6.9.1"},"repository":{"url":"git+https://github.com/YZ-social/kdht.git","type":"git"},"_npmVersion":"10.9.4","description":"Pure Kademlia base, for testing variations.","directories":{},"_nodeVersion":"22.21.1","dependencies":{"uuid":"^13.0.0","node-turn":"^0.0.6","@yz-social/webrtc":"^0.1.8"},"publishConfig":{"registry":"https://registry.npmjs.org"},"_hasShrinkwrap":false,"devDependencies":{"cors":"^2.8.6","yargs":"^18.0.0","morgan":"^1.10.1","express":"^5.2.1","jasmine":"^5.12.0"},"_npmOperationalInternal":{"tmp":"tmp/kdht_0.1.38_1775000920773_0.6695061932960922","host":"s3://npm-registry-packages-npm-production"}},"0.1.39":{"name":"@yz-social/kdht","version":"0.1.39","_id":"@yz-social/kdht@0.1.39","maintainers":[{"name":"howard.stearns","email":"stearns@alum.mit.edu"}],"homepage":"https://github.com/YZ-social/kdht#readme","bugs":{"url":"https://github.com/YZ-social/kdht/issues"},"dist":{"shasum":"be0297db56d01b9afda70443ab2df0e5157629e6","tarball":"https://registry.npmjs.org/@yz-social/kdht/-/kdht-0.1.39.tgz","fileCount":35,"integrity":"sha512-jDnPyCSxdoitcAj4e8g5PHOpU1kDmSjfdNu4Ijw3JRrNX7j6JEykGMEl3scq1uQQJo5UcNmBO8jJnPDazG299g==","signatures":[{"sig":"MEUCIQCmcltJeORJf21aJ5W/SKRF9wTYFCmRASzNWH37aNKTcgIge+0vbd+Tjf4lTWiFK11Gx72Jz5ORZcIKHr9CevzdYJs=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":266238},"type":"module","exports":{".":"./index.js","./portal":"./scripts/node.js","./router":"./scripts/router.js"},"gitHead":"298886f14ecb167b74b567eae152a155f38d1677","scripts":{"bots":"node scripts/bots.js","stop":"pkill kdht","test":"npx jasmine && npm run testWebrtc && echo '-- SUCCESS --' || echo '**** FAIL ****'","start":"node scripts/portal.js --externalBaseURL https://dorado.ngrok.io/kdht","background":"npm stop; (npm start 1>server.log 2>&1 &); sleep 1","testWebrtc":"npm stop; npx jasmine spec/testWebrtc.js","thrashbots":"node scripts/bots.js --thrash","withoutExternal":"node scripts/portal.js"},"_npmUser":{"name":"howard.stearns","email":"stearns@alum.mit.edu"},"overrides":{"log4js":"^6.9.1"},"repository":{"url":"git+https://github.com/YZ-social/kdht.git","type":"git"},"_npmVersion":"10.9.4","description":"Pure Kademlia base, for testing variations.","directories":{},"_nodeVersion":"22.21.1","dependencies":{"uuid":"^13.0.0","node-turn":"^0.0.6","@yz-social/webrtc":"^0.1.8"},"publishConfig":{"registry":"https://registry.npmjs.org"},"_hasShrinkwrap":false,"devDependencies":{"cors":"^2.8.6","yargs":"^18.0.0","morgan":"^1.10.1","express":"^5.2.1","jasmine":"^5.12.0"},"_npmOperationalInternal":{"tmp":"tmp/kdht_0.1.39_1775157051089_0.5601936887370995","host":"s3://npm-registry-packages-npm-production"}},"0.1.40":{"name":"@yz-social/kdht","version":"0.1.40","_id":"@yz-social/kdht@0.1.40","maintainers":[{"name":"howard.stearns","email":"stearns@alum.mit.edu"}],"homepage":"https://github.com/YZ-social/kdht#readme","bugs":{"url":"https://github.com/YZ-social/kdht/issues"},"dist":{"shasum":"00afed52568ee8eeb9fe244020216d8b80977891","tarball":"https://registry.npmjs.org/@yz-social/kdht/-/kdht-0.1.40.tgz","fileCount":35,"integrity":"sha512-Zv+tjWjcSaQKz8JBg+IgiTnwkqZCy0vGXBgwNDgk30h3mNmG1Fo0CGkTVUxPS1U+FFTdxH8txJO9hc1RJDzHdQ==","signatures":[{"sig":"MEUCIQD0ZZK4ZItvsNuIDy/Up9c8IJPlOdAB0CtR0/GpTFsiywIgSkkgH9/i5LdxLhgxTZleJyli7c0QGcnGp9HhaMdZt+Q=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":266255},"type":"module","exports":{".":"./index.js","./portal":"./scripts/node.js","./router":"./scripts/router.js"},"gitHead":"2144a0abf186ed14d760f1d79ed12ad94ea6f78b","scripts":{"bots":"node scripts/bots.js","stop":"pkill kdht","test":"npx jasmine && npm run testWebrtc && echo '-- SUCCESS --' || echo '**** FAIL ****'","start":"node scripts/portal.js --externalBaseURL https://dorado.ngrok.io/kdht","background":"npm stop; (npm start 1>server.log 2>&1 &); sleep 1","testWebrtc":"npm stop; npx jasmine spec/testWebrtc.js","thrashbots":"node scripts/bots.js --thrash","withoutExternal":"node scripts/portal.js"},"_npmUser":{"name":"howard.stearns","email":"stearns@alum.mit.edu"},"overrides":{"log4js":"^6.9.1"},"repository":{"url":"git+https://github.com/YZ-social/kdht.git","type":"git"},"_npmVersion":"10.9.4","description":"Pure Kademlia base, for testing variations.","directories":{},"_nodeVersion":"22.21.1","dependencies":{"uuid":"^13.0.0","node-turn":"^0.0.6","@yz-social/webrtc":"^0.1.8"},"publishConfig":{"registry":"https://registry.npmjs.org"},"_hasShrinkwrap":false,"devDependencies":{"cors":"^2.8.6","yargs":"^18.0.0","morgan":"^1.10.1","express":"^5.2.1","jasmine":"^5.12.0"},"_npmOperationalInternal":{"tmp":"tmp/kdht_0.1.40_1775165965058_0.03378321849050647","host":"s3://npm-registry-packages-npm-production"}},"0.1.41":{"name":"@yz-social/kdht","version":"0.1.41","_id":"@yz-social/kdht@0.1.41","maintainers":[{"name":"howard.stearns","email":"stearns@alum.mit.edu"}],"homepage":"https://github.com/YZ-social/kdht#readme","bugs":{"url":"https://github.com/YZ-social/kdht/issues"},"dist":{"shasum":"98c04c2ff4c1563665508f6fee3bc142c8e243b4","tarball":"https://registry.npmjs.org/@yz-social/kdht/-/kdht-0.1.41.tgz","fileCount":35,"integrity":"sha512-XdacGhn7YSTQOukFKmjwEgpOXszcD6bJi8sijSifjUpvg0CNKmr2KBSl7w5EK6nkLhDeNIjsMWoqKKXOivB1Zg==","signatures":[{"sig":"MEUCICG0HX4fiRe4Qt53X5iO2sj01xpR5t3I3MTmYtiW8hG9AiEAzVEL5CCdwcOCwRL8JaYCm8dCmlrYiNEhKmKLj/EQ07E=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":266698},"type":"module","exports":{".":"./index.js","./portal":"./scripts/node.js","./router":"./scripts/router.js"},"gitHead":"96e249290ef6929c4efa06318976101992fef68f","scripts":{"bots":"node scripts/bots.js","stop":"pkill kdht","test":"npx jasmine && npm run testWebrtc && echo '-- SUCCESS --' || echo '**** FAIL ****'","start":"node scripts/portal.js --externalBaseURL https://dorado.ngrok.io/kdht","background":"npm stop; (npm start 1>server.log 2>&1 &); sleep 1","testWebrtc":"npm stop; npx jasmine spec/testWebrtc.js","thrashbots":"node scripts/bots.js --thrash","withoutExternal":"node scripts/portal.js"},"_npmUser":{"name":"howard.stearns","email":"stearns@alum.mit.edu"},"overrides":{"log4js":"^6.9.1"},"repository":{"url":"git+https://github.com/YZ-social/kdht.git","type":"git"},"_npmVersion":"10.9.4","description":"Pure Kademlia base, for testing variations.","directories":{},"_nodeVersion":"22.21.1","dependencies":{"uuid":"^13.0.0","node-turn":"^0.0.6","@yz-social/webrtc":"^0.1.8"},"publishConfig":{"registry":"https://registry.npmjs.org"},"_hasShrinkwrap":false,"devDependencies":{"cors":"^2.8.6","yargs":"^18.0.0","morgan":"^1.10.1","express":"^5.2.1","jasmine":"^5.12.0"},"_npmOperationalInternal":{"tmp":"tmp/kdht_0.1.41_1775853327470_0.25144750504160474","host":"s3://npm-registry-packages-npm-production"}},"0.1.42":{"name":"@yz-social/kdht","version":"0.1.42","_id":"@yz-social/kdht@0.1.42","maintainers":[{"name":"howard.stearns","email":"stearns@alum.mit.edu"}],"homepage":"https://github.com/YZ-social/kdht#readme","bugs":{"url":"https://github.com/YZ-social/kdht/issues"},"dist":{"shasum":"8f40b01b3e7247276de222c8b2e4e6bd5894fc2b","tarball":"https://registry.npmjs.org/@yz-social/kdht/-/kdht-0.1.42.tgz","fileCount":36,"integrity":"sha512-MIERqIejMZVC3zDnZs7yRrn1eHU0r6KnkRdcSHlTW7krVqcduEsVJQnH7G/dtjsjJqVjKANeoloL3/yYGGus6A==","signatures":[{"sig":"MEQCIAEsOOmdWjKSZ3tJ6QJr9Ld/c8zc1wvldmT4kWd5B9ZSAiA9XBWG2gcmtlK6OvKfJbvw1sgCJUrl5W5xlxMagauI3Q==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":269101},"type":"module","exports":{".":"./index.js","./portal":"./scripts/node.js","./router":"./scripts/router.js"},"gitHead":"6d60c40e7b431d400043d76f241a836cf7f06096","scripts":{"bots":"node scripts/bots.js","stop":"pkill kdht","test":"npx jasmine && npm run testWebrtc && echo '-- SUCCESS --' || echo '**** FAIL ****'","start":"node scripts/portal.js --externalBaseURL https://dorado.ngrok.io/kdht","background":"npm stop; (npm start 1>server.log 2>&1 &); sleep 1","testWebrtc":"npm stop; npx jasmine spec/testWebrtc.js","thrashbots":"node scripts/bots.js --thrash","withoutExternal":"node scripts/portal.js"},"_npmUser":{"name":"howard.stearns","email":"stearns@alum.mit.edu"},"overrides":{"log4js":"^6.9.1"},"repository":{"url":"git+https://github.com/YZ-social/kdht.git","type":"git"},"_npmVersion":"10.9.4","description":"Pure Kademlia base, for testing variations.","directories":{},"_nodeVersion":"22.21.1","dependencies":{"uuid":"^13.0.0","node-turn":"^0.0.6","@yz-social/webrtc":"^0.1.8"},"publishConfig":{"registry":"https://registry.npmjs.org"},"_hasShrinkwrap":false,"devDependencies":{"cors":"^2.8.6","yargs":"^18.0.0","morgan":"^1.10.1","express":"^5.2.1","jasmine":"^5.12.0"},"_npmOperationalInternal":{"tmp":"tmp/kdht_0.1.42_1776220034205_0.2305244345613442","host":"s3://npm-registry-packages-npm-production"}},"0.1.44":{"name":"@yz-social/kdht","version":"0.1.44","_id":"@yz-social/kdht@0.1.44","maintainers":[{"name":"howard.stearns","email":"stearns@alum.mit.edu"}],"homepage":"https://github.com/YZ-social/kdht#readme","bugs":{"url":"https://github.com/YZ-social/kdht/issues"},"dist":{"shasum":"bb3db5b66801b7615a55a8c58ac78e00d07dc0f6","tarball":"https://registry.npmjs.org/@yz-social/kdht/-/kdht-0.1.44.tgz","fileCount":38,"integrity":"sha512-5P9gBqYEiQiOwRN4eMQspjPFSH1Jtcb7zIh30jwunHLwkdEKBkVikKJq4l+E669SBxojBKeqCYXqomPPGd9KKg==","signatures":[{"sig":"MEUCIF7sbWM7rdLyIp2vn6F+1sCOVCQb8BeTg6NVAYcIMjirAiEA7Hw60w0pWz+08E2AalvwO+WE1t+79Lt8ORHfHh43psw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":363584},"type":"module","exports":{".":"./index.js","./portal":"./scripts/node.js","./router":"./scripts/router.js"},"gitHead":"1109fd003a28a4c64b41fad70e58588ed64e3649","scripts":{"bots":"node scripts/bots.js","stop":"pkill kdht","test":"npx jasmine && npm run testWebrtc && echo '-- SUCCESS --' || echo '**** FAIL ****'","start":"node scripts/portal.js --externalBaseURL https://dorado.ngrok.io/kdht","background":"npm stop; (npm start 1>server.log 2>&1 &); sleep 1","testWebrtc":"npm stop; npx jasmine spec/testWebrtc.js","thrashbots":"node scripts/bots.js --thrash","withoutExternal":"node scripts/portal.js"},"_npmUser":{"name":"howard.stearns","email":"stearns@alum.mit.edu"},"overrides":{"log4js":"^6.9.1"},"repository":{"url":"git+https://github.com/YZ-social/kdht.git","type":"git"},"_npmVersion":"10.9.4","description":"Pure Kademlia base, for testing variations.","directories":{},"_nodeVersion":"22.21.1","dependencies":{"uuid":"^13.0.0","node-turn":"^0.0.6","@yz-social/webrtc":"^0.1.8"},"publishConfig":{"registry":"https://registry.npmjs.org"},"_hasShrinkwrap":false,"devDependencies":{"cors":"^2.8.6","yargs":"^18.0.0","morgan":"^1.10.1","express":"^5.2.1","jasmine":"^5.12.0"},"_npmOperationalInternal":{"tmp":"tmp/kdht_0.1.44_1776385180273_0.680488668405876","host":"s3://npm-registry-packages-npm-production"}},"0.1.45":{"name":"@yz-social/kdht","version":"0.1.45","_id":"@yz-social/kdht@0.1.45","maintainers":[{"name":"howard.stearns","email":"stearns@alum.mit.edu"}],"homepage":"https://github.com/YZ-social/kdht#readme","bugs":{"url":"https://github.com/YZ-social/kdht/issues"},"dist":{"shasum":"08bef9e39da7aa911c0019b4d227c81396fc5cc5","tarball":"https://registry.npmjs.org/@yz-social/kdht/-/kdht-0.1.45.tgz","fileCount":38,"integrity":"sha512-ekFvopfhqI32NZiLZhjEZ9NJiADS1BrHtxXVfUNiTJpXuRbTmy2mfJtg71YahZGmD7A4mW19q922oFsgTMDA5A==","signatures":[{"sig":"MEUCIFNnO7w+DNfIUHW/wgk1h9a8lpT2NkygyCjfym0KmBNgAiEAt/2DxqprS9GofgELtfak6VDbcTMhf65rXOANlaShZLs=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":363661},"type":"module","exports":{".":"./index.js","./portal":"./scripts/node.js","./router":"./scripts/router.js"},"gitHead":"7a59dd13b99c003d76f62a310503b9fb283a4898","scripts":{"bots":"node scripts/bots.js","stop":"pkill kdht","test":"npx jasmine && npm run testWebrtc && echo '-- SUCCESS --' || echo '**** FAIL ****'","local":"node scripts/portal.js","start":"npm stop; npm run shared","shared":"node scripts/portal.js  --externalBaseURL https://ki1r0y.com/kdht","background":"npm stop; (npm start 1>server.log 2>&1 &); sleep 1","testWebrtc":"npm stop; npx jasmine spec/testWebrtc.js","thrashbots":"node scripts/bots.js --thrash","withoutExternal":"node scripts/portal.js"},"_npmUser":{"name":"howard.stearns","email":"stearns@alum.mit.edu"},"overrides":{"log4js":"^6.9.1"},"repository":{"url":"git+https://github.com/YZ-social/kdht.git","type":"git"},"_npmVersion":"10.9.4","description":"Pure Kademlia base, for testing variations.","directories":{},"_nodeVersion":"22.21.1","dependencies":{"uuid":"^13.0.0","node-turn":"^0.0.6","@yz-social/webrtc":"^0.1.8"},"publishConfig":{"registry":"https://registry.npmjs.org"},"_hasShrinkwrap":false,"devDependencies":{"cors":"^2.8.6","yargs":"^18.0.0","morgan":"^1.10.1","express":"^5.2.1","jasmine":"^5.12.0"},"_npmOperationalInternal":{"tmp":"tmp/kdht_0.1.45_1776707390546_0.1677308393985193","host":"s3://npm-registry-packages-npm-production"}},"0.1.46":{"name":"@yz-social/kdht","version":"0.1.46","_id":"@yz-social/kdht@0.1.46","maintainers":[{"name":"howard.stearns","email":"stearns@alum.mit.edu"}],"homepage":"https://github.com/YZ-social/kdht#readme","bugs":{"url":"https://github.com/YZ-social/kdht/issues"},"dist":{"shasum":"5d1be180ba74a26638e53f175341800f296d0c69","tarball":"https://registry.npmjs.org/@yz-social/kdht/-/kdht-0.1.46.tgz","fileCount":38,"integrity":"sha512-Xt15XFMclTC3n+wb0/V+jLKsI31H1WM13QVgqWeTQcn+RI0gntAF2NTOxDPGZrlVLfUuPfgSixBtyIXPs2aNJA==","signatures":[{"sig":"MEUCIQDiShLgdcLDSthFczby1NybxDq5I/X2sW8Bru5BzUF8/wIgEl6P0KpcBFkxGin7df7Yo0MaeLx2o1a3IFSKf20htIE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":365899},"type":"module","exports":{".":"./index.js","./portal":"./scripts/node.js","./router":"./scripts/router.js"},"gitHead":"ecc8b818ad70fbcd58b969b945eb7d9f740558e6","scripts":{"bots":"node scripts/bots.js","stop":"pkill kdht","test":"npx jasmine && npm run testWebrtc && echo '-- SUCCESS --' || echo '**** FAIL ****'","local":"node scripts/portal.js","start":"npm stop; npm run shared","ki1r0y":"node scripts/portal.js  --externalBaseURL https://ki1r0y.com/kdht","shared":"node scripts/portal.js  --externalBaseURL https://ki1r0y.com/kdht","background":"npm stop; (npm start 1>server.log 2>&1 &); sleep 1","testWebrtc":"npm stop; npx jasmine spec/testWebrtc.js","thrashbots":"node scripts/bots.js --thrash","withoutExternal":"node scripts/portal.js"},"_npmUser":{"name":"howard.stearns","email":"stearns@alum.mit.edu"},"overrides":{"log4js":"^6.9.1"},"repository":{"url":"git+https://github.com/YZ-social/kdht.git","type":"git"},"_npmVersion":"10.9.4","description":"Pure Kademlia base, for testing variations.","directories":{},"_nodeVersion":"22.21.1","dependencies":{"uuid":"^13.0.0","node-turn":"^0.0.6","@yz-social/webrtc":"^0.1.8"},"publishConfig":{"registry":"https://registry.npmjs.org"},"_hasShrinkwrap":false,"devDependencies":{"cors":"^2.8.6","yargs":"^18.0.0","morgan":"^1.10.1","express":"^5.2.1","jasmine":"^5.12.0"},"_npmOperationalInternal":{"tmp":"tmp/kdht_0.1.46_1777321336514_0.790279262782454","host":"s3://npm-registry-packages-npm-production"}},"0.1.47":{"name":"@yz-social/kdht","version":"0.1.47","_id":"@yz-social/kdht@0.1.47","maintainers":[{"name":"howard.stearns","email":"stearns@alum.mit.edu"}],"homepage":"https://github.com/YZ-social/kdht#readme","bugs":{"url":"https://github.com/YZ-social/kdht/issues"},"dist":{"shasum":"0c0b66ad6734e39eae6de434d319dc5a537cb890","tarball":"https://registry.npmjs.org/@yz-social/kdht/-/kdht-0.1.47.tgz","fileCount":38,"integrity":"sha512-cdLq5yxpbJNMNiaVlMHor8zDfdYNK1tv8iU8vVD5xD2CEjqucG0GGlh1yNSwvlFLT42YS6EFmH3xDjeWIBpwlA==","signatures":[{"sig":"MEUCIQCI5ey6d3kuxUnroHy03AN73D3y7fq5PPG34M7DoAOW9wIgcAfLZbRSW1XUb8XkS1hEF+bF9x0n+J9+Rop3DZ1z2Ow=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":366802},"type":"module","exports":{".":"./index.js","./portal":"./scripts/node.js","./router":"./scripts/router.js"},"gitHead":"169ca9dd5d58d637a59785714de33feb37e81dca","scripts":{"bots":"node scripts/bots.js","stop":"pkill kdht","test":"npx jasmine && npm run testWebrtc && echo '-- SUCCESS --' || echo '**** FAIL ****'","local":"node scripts/portal.js","start":"npm stop; npm run shared","ki1r0y":"node scripts/portal.js  --externalBaseURL https://ki1r0y.com/kdht","shared":"node scripts/portal.js  --externalBaseURL https://ki1r0y.com/kdht","background":"npm stop; (npm start 1>server.log 2>&1 &); sleep 1","testWebrtc":"npm stop; npx jasmine spec/testWebrtc.js","thrashbots":"node scripts/bots.js --thrash","withoutExternal":"node scripts/portal.js"},"_npmUser":{"name":"howard.stearns","email":"stearns@alum.mit.edu"},"overrides":{"log4js":"^6.9.1"},"repository":{"url":"git+https://github.com/YZ-social/kdht.git","type":"git"},"_npmVersion":"10.9.4","description":"Pure Kademlia base, for testing variations.","directories":{},"_nodeVersion":"22.21.1","dependencies":{"uuid":"^13.0.0","node-turn":"^0.0.6","@yz-social/webrtc":"^0.1.9"},"publishConfig":{"registry":"https://registry.npmjs.org"},"_hasShrinkwrap":false,"devDependencies":{"cors":"^2.8.6","yargs":"^18.0.0","morgan":"^1.10.1","express":"^5.2.1","jasmine":"^5.12.0"},"_npmOperationalInternal":{"tmp":"tmp/kdht_0.1.47_1777425957335_0.2505524866137223","host":"s3://npm-registry-packages-npm-production"}},"0.1.48":{"name":"@yz-social/kdht","version":"0.1.48","_id":"@yz-social/kdht@0.1.48","maintainers":[{"name":"howard.stearns","email":"stearns@alum.mit.edu"}],"homepage":"https://github.com/YZ-social/kdht#readme","bugs":{"url":"https://github.com/YZ-social/kdht/issues"},"dist":{"shasum":"dd46776214ddba8dcf11b778af9e28feffcf71f1","tarball":"https://registry.npmjs.org/@yz-social/kdht/-/kdht-0.1.48.tgz","fileCount":38,"integrity":"sha512-0a5sxOZZDn7FPq3cUEWiFdwshPnwb05VIvl4HwgOOIbrB7PlOcAR2tMXtWxDi823qNoWyIjxcKSfFg3cxEH0cw==","signatures":[{"sig":"MEYCIQCqStsHcnmdao9NDNTwcMMxp4fqwShZRyh7jWXeAoSrxAIhAKQeJf2w0SbzDG/HG0vko9MUg8bc7BoWhgX0966sZhEn","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":366973},"type":"module","exports":{".":"./index.js","./portal":"./scripts/node.js","./router":"./scripts/router.js"},"gitHead":"89d3122f0c0566a58f9836acc27301a0bf1fae67","scripts":{"bots":"node scripts/bots.js","stop":"pkill kdht","test":"npx jasmine && npm run testWebrtc && echo '-- SUCCESS --' || echo '**** FAIL ****'","local":"node scripts/portal.js","start":"npm stop; npm run shared","ki1r0y":"node scripts/portal.js  --externalBaseURL https://ki1r0y.com/kdht","shared":"node scripts/portal.js  --externalBaseURL https://ki1r0y.com/kdht","background":"npm stop; (npm start 1>server.log 2>&1 &); sleep 1","testWebrtc":"npm stop; npx jasmine spec/testWebrtc.js","thrashbots":"node scripts/bots.js --thrash","withoutExternal":"node scripts/portal.js"},"_npmUser":{"name":"howard.stearns","email":"stearns@alum.mit.edu"},"overrides":{"log4js":"^6.9.1"},"repository":{"url":"git+https://github.com/YZ-social/kdht.git","type":"git"},"_npmVersion":"10.9.4","description":"Pure Kademlia base, for testing variations.","directories":{},"_nodeVersion":"22.21.1","dependencies":{"uuid":"^13.0.0","node-turn":"^0.0.6","@yz-social/webrtc":"^0.1.9"},"publishConfig":{"registry":"https://registry.npmjs.org"},"_hasShrinkwrap":false,"devDependencies":{"cors":"^2.8.6","yargs":"^18.0.0","morgan":"^1.10.1","express":"^5.2.1","jasmine":"^5.12.0"},"_npmOperationalInternal":{"tmp":"tmp/kdht_0.1.48_1777485719134_0.19946797365228752","host":"s3://npm-registry-packages-npm-production"}},"0.1.49":{"name":"@yz-social/kdht","version":"0.1.49","_id":"@yz-social/kdht@0.1.49","maintainers":[{"name":"howard.stearns","email":"stearns@alum.mit.edu"}],"homepage":"https://github.com/YZ-social/kdht#readme","bugs":{"url":"https://github.com/YZ-social/kdht/issues"},"dist":{"shasum":"54ee8c4728529401001c263b9176169de3dbb297","tarball":"https://registry.npmjs.org/@yz-social/kdht/-/kdht-0.1.49.tgz","fileCount":38,"integrity":"sha512-puy3iubmzch4njEmXwRWAdItIMIkErGk0hFJyomukUttm8NNWRIxkk2X+/uweNT+tYnzWlWys7EHIFVxLZb16A==","signatures":[{"sig":"MEUCIEufxv9daM2hHzJMTRZYSt1s7lv6QuVLd+rUmNSqHHpxAiEAnfNvWW1FqhoS/2o/taoByhrGnYCkdvEhl5EvsU6vDsw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":367349},"type":"module","exports":{".":"./index.js","./portal":"./scripts/node.js","./router":"./scripts/router.js"},"gitHead":"b0db0d4c5cdd7c08c2ea90a905e755f8def2f928","scripts":{"bots":"node scripts/bots.js","stop":"pkill kdht","test":"npx jasmine && npm run testWebrtc && echo '-- SUCCESS --' || echo '**** FAIL ****'","local":"node scripts/portal.js","start":"npm stop; npm run shared","ki1r0y":"node scripts/portal.js  --externalBaseURL https://ki1r0y.com/kdht","shared":"node scripts/portal.js  --externalBaseURL https://ki1r0y.com/kdht","background":"npm stop; (npm start 1>server.log 2>&1 &); sleep 1","testWebrtc":"npm stop; npx jasmine spec/testWebrtc.js","thrashbots":"node scripts/bots.js --thrash","withoutExternal":"node scripts/portal.js"},"_npmUser":{"name":"howard.stearns","email":"stearns@alum.mit.edu"},"overrides":{"log4js":"^6.9.1"},"repository":{"url":"git+https://github.com/YZ-social/kdht.git","type":"git"},"_npmVersion":"10.9.4","description":"Pure Kademlia base, for testing variations.","directories":{},"_nodeVersion":"22.21.1","dependencies":{"uuid":"^13.0.0","node-turn":"^0.0.6","@yz-social/webrtc":"^0.1.10"},"publishConfig":{"registry":"https://registry.npmjs.org"},"_hasShrinkwrap":false,"devDependencies":{"cors":"^2.8.6","yargs":"^18.0.0","morgan":"^1.10.1","express":"^5.2.1","jasmine":"^5.12.0"},"_npmOperationalInternal":{"tmp":"tmp/kdht_0.1.49_1777579350932_0.18282000969551238","host":"s3://npm-registry-packages-npm-production"}},"0.1.51":{"name":"@yz-social/kdht","version":"0.1.51","_id":"@yz-social/kdht@0.1.51","maintainers":[{"name":"howard.stearns","email":"stearns@alum.mit.edu"}],"homepage":"https://github.com/YZ-social/kdht#readme","bugs":{"url":"https://github.com/YZ-social/kdht/issues"},"dist":{"shasum":"eafd268452fd232e7e45124c3f652343654db593","tarball":"https://registry.npmjs.org/@yz-social/kdht/-/kdht-0.1.51.tgz","fileCount":43,"integrity":"sha512-ZB0+kADjiidIZMfql8D3MD+cWAaN2UM9G9WWchCW094B+Dx8SBYm2EkIiJK6MxAfoJrISOhHYgg5DTXcnTEUIA==","signatures":[{"sig":"MEQCIB0oYHMxGPP/3p6DrJjiPNfBxflDktubXmuBHDbbEWg4AiBYWv2r31GwKTnom4Dx34Jc/OcCJnm0xuiP1xJH/bIfKQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":376419},"type":"module","exports":{".":"./index.js","./portal":"./scripts/node.js","./router":"./scripts/router.js"},"gitHead":"80ccf9e86c7f95a4f89b87f38d6b70b833fbcc1e","scripts":{"bots":"node scripts/bots.js","stop":"pkill kdht","test":"npx jasmine && npm run testWebrtc && echo '-- SUCCESS --' || echo '**** FAIL ****'","local":"node scripts/portal.js","start":"npm stop; npm run shared","ki1r0y":"node scripts/portal.js  --externalBaseURL https://ki1r0y.com/kdht","shared":"node scripts/portal.js  --externalBaseURL https://ki1r0y.com/kdht","background":"npm stop; (npm start 1>server.log 2>&1 &); sleep 1","testWebrtc":"npm stop; npx jasmine spec/testWebrtc.js","thrashbots":"node scripts/bots.js --thrash","withoutExternal":"node scripts/portal.js"},"_npmUser":{"name":"howard.stearns","email":"stearns@alum.mit.edu"},"overrides":{"log4js":"^6.9.1"},"repository":{"url":"git+https://github.com/YZ-social/kdht.git","type":"git"},"_npmVersion":"10.9.7","description":"Pure Kademlia base, for testing variations.","directories":{},"_nodeVersion":"22.22.2","dependencies":{"uuid":"^14.0.0","node-turn":"^0.0.6","turn-server":"^0.2.1","@yz-social/webrtc":"^0.1.13"},"publishConfig":{"registry":"https://registry.npmjs.org"},"_hasShrinkwrap":false,"devDependencies":{"cors":"^2.8.6","yargs":"^18.0.0","morgan":"^1.10.1","express":"^5.2.1","jasmine":"^5.12.0"},"_npmOperationalInternal":{"tmp":"tmp/kdht_0.1.51_1778618593096_0.2157130510802241","host":"s3://npm-registry-packages-npm-production"}},"0.1.52":{"name":"@yz-social/kdht","version":"0.1.52","_id":"@yz-social/kdht@0.1.52","maintainers":[{"name":"howard.stearns","email":"stearns@alum.mit.edu"}],"homepage":"https://github.com/YZ-social/kdht#readme","bugs":{"url":"https://github.com/YZ-social/kdht/issues"},"dist":{"shasum":"9097ba28775a0262a031f8c3fe1e53811bec5810","tarball":"https://registry.npmjs.org/@yz-social/kdht/-/kdht-0.1.52.tgz","fileCount":43,"integrity":"sha512-DMzwwOdEQe/WT6tcekdEnvjbALbktQWNbTDNExaRTfFckiLJbfA7nuAzZJWmN44TtbXLUa+Bi/lIYnqx6VfSOA==","signatures":[{"sig":"MEUCIHTBJ6wypdIZIS/Cidv8Ta6KP6GcNFgGzX4lUEIkj51TAiEAggPrQ05Z58HNTShFe29gVgZc/hP2VYltMWyn8toKsgo=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":376961},"type":"module","exports":{".":"./index.js","./portal":"./scripts/node.js","./router":"./scripts/router.js"},"gitHead":"ebef32a98fd26c8829467af8f4291f1f641da15e","scripts":{"bots":"node scripts/bots.js","stop":"pkill kdht","test":"npx jasmine && npm run testWebrtc && echo '-- SUCCESS --' || echo '**** FAIL ****'","local":"node scripts/portal.js","start":"npm stop; npm run shared","ki1r0y":"node scripts/portal.js  --externalBaseURL https://ki1r0y.com/kdht","shared":"node scripts/portal.js  --externalBaseURL https://ki1r0y.com/kdht","background":"npm stop; (npm start 1>server.log 2>&1 &); sleep 1","testWebrtc":"npm stop; npx jasmine spec/testWebrtc.js","thrashbots":"node scripts/bots.js --thrash","withoutExternal":"node scripts/portal.js"},"_npmUser":{"name":"howard.stearns","email":"stearns@alum.mit.edu"},"overrides":{"log4js":"^6.9.1"},"repository":{"url":"git+https://github.com/YZ-social/kdht.git","type":"git"},"_npmVersion":"10.9.7","description":"Pure Kademlia base, for testing variations.","directories":{},"_nodeVersion":"22.22.2","dependencies":{"uuid":"^14.0.0","node-turn":"^0.0.6","turn-server":"^0.2.1","@yz-social/webrtc":"^0.1.14"},"publishConfig":{"registry":"https://registry.npmjs.org"},"_hasShrinkwrap":false,"devDependencies":{"cors":"^2.8.6","yargs":"^18.0.0","morgan":"^1.10.1","express":"^5.2.1","jasmine":"^5.12.0"},"_npmOperationalInternal":{"tmp":"tmp/kdht_0.1.52_1778699324894_0.6004079780416363","host":"s3://npm-registry-packages-npm-production"}},"0.1.53":{"name":"@yz-social/kdht","version":"0.1.53","description":"Pure Kademlia base, for testing variations.","exports":{".":"./index.js","./router":"./scripts/router.js","./portal":"./scripts/node.js"},"type":"module","scripts":{"start":"npm stop; npm run shared","stop":"pkill kdht","local":"node scripts/portal.js","ki1r0y":"node scripts/portal.js  --externalBaseURL https://ki1r0y.com/kdht","shared":"node scripts/portal.js  --externalBaseURL https://ki1r0y.com/kdht","background":"npm stop; (npm start 1>server.log 2>&1 &); sleep 1","withoutExternal":"node scripts/portal.js","bots":"node scripts/bots.js","thrashbots":"node scripts/bots.js --thrash","testWebrtc":"npm stop; npx jasmine spec/testWebrtc.js","test":"npx jasmine && npm run testWebrtc && echo '-- SUCCESS --' || echo '**** FAIL ****'"},"dependencies":{"@yz-social/webrtc":"^0.1.15","node-turn":"^0.0.6","turn-server":"^0.2.1","uuid":"^14.0.0"},"overrides":{"log4js":"^6.9.1"},"devDependencies":{"cors":"^2.8.6","express":"^5.2.1","jasmine":"^5.12.0","morgan":"^1.10.1","yargs":"^18.0.0"},"repository":{"type":"git","url":"git+https://github.com/YZ-social/kdht.git"},"publishConfig":{"registry":"https://registry.npmjs.org"},"_id":"@yz-social/kdht@0.1.53","gitHead":"cf3ca90f717f149e1af74418ae84e48752ba499c","bugs":{"url":"https://github.com/YZ-social/kdht/issues"},"homepage":"https://github.com/YZ-social/kdht#readme","_nodeVersion":"22.22.2","_npmVersion":"10.9.7","dist":{"integrity":"sha512-mfe4HPfxKWFT9E6AO4OomThwJ7yBGfdYb9d8e/1at0L5fTd2A82LtBu+ZpU2JM8e4E37MePt0twV+If3IB5imA==","shasum":"b836bcfbaab5e766c64faba7edc8037c867a84e5","tarball":"https://registry.npmjs.org/@yz-social/kdht/-/kdht-0.1.53.tgz","fileCount":43,"unpackedSize":377112,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQCV+Cyid3ivViXXJHIyFyRRxjbr1gOzC/OjQanshif74QIhAK7k7oF6kaGPO7NCTmu+jSJoZ30C4XDixVPZxJLRzLZn"}]},"_npmUser":{"name":"howard.stearns","email":"stearns@alum.mit.edu"},"directories":{},"maintainers":[{"name":"howard.stearns","email":"stearns@alum.mit.edu"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/kdht_0.1.53_1778714048809_0.8182779911579738"},"_hasShrinkwrap":false}},"time":{"created":"2026-01-05T02:01:01.367Z","modified":"2026-05-13T23:14:09.074Z","0.1.0":"2026-01-05T02:01:01.665Z","0.1.1":"2026-01-05T17:11:46.975Z","0.1.2":"2026-01-05T19:08:38.904Z","0.1.3":"2026-01-05T20:08:10.055Z","0.1.4":"2026-01-21T01:28:48.621Z","0.1.5":"2026-01-21T04:20:59.334Z","0.1.6":"2026-01-21T19:07:23.962Z","0.1.7":"2026-01-21T20:17:42.218Z","0.1.8":"2026-01-21T22:04:45.529Z","0.1.9":"2026-01-28T05:27:10.591Z","0.1.10":"2026-01-29T03:04:10.555Z","0.1.11":"2026-01-30T02:42:22.835Z","0.1.12":"2026-01-30T17:17:45.707Z","0.1.13":"2026-02-02T17:22:58.512Z","0.1.14":"2026-02-02T17:47:14.288Z","0.1.15":"2026-02-03T21:37:14.146Z","0.1.16":"2026-02-03T22:52:22.498Z","0.1.17":"2026-02-11T16:43:44.676Z","0.1.18":"2026-02-24T20:42:45.913Z","0.1.19":"2026-03-09T00:32:25.436Z","0.1.20":"2026-03-09T19:58:02.765Z","0.1.21":"2026-03-11T20:04:04.291Z","0.1.22":"2026-03-15T21:07:53.114Z","0.1.23":"2026-03-15T22:21:10.244Z","0.1.24":"2026-03-16T00:05:28.306Z","0.1.25":"2026-03-16T00:17:37.593Z","0.1.26":"2026-03-16T17:35:01.796Z","0.1.27":"2026-03-18T21:23:59.252Z","0.1.28":"2026-03-21T01:09:04.072Z","0.1.30":"2026-03-25T15:26:45.391Z","0.1.31":"2026-03-28T22:27:58.663Z","0.1.32":"2026-03-29T23:49:38.715Z","0.1.33":"2026-03-30T00:18:38.762Z","0.1.34":"2026-03-30T18:22:52.898Z","0.1.35":"2026-03-30T20:36:45.231Z","0.1.36":"2026-03-30T21:04:02.014Z","0.1.37":"2026-03-31T22:46:15.872Z","0.1.38":"2026-03-31T23:48:40.901Z","0.1.39":"2026-04-02T19:10:51.258Z","0.1.40":"2026-04-02T21:39:25.210Z","0.1.41":"2026-04-10T20:35:27.619Z","0.1.42":"2026-04-15T02:27:14.372Z","0.1.44":"2026-04-17T00:19:40.412Z","0.1.45":"2026-04-20T17:49:50.693Z","0.1.46":"2026-04-27T20:22:16.675Z","0.1.47":"2026-04-29T01:25:57.505Z","0.1.48":"2026-04-29T18:01:59.308Z","0.1.49":"2026-04-30T20:02:31.083Z","0.1.51":"2026-05-12T20:43:13.257Z","0.1.52":"2026-05-13T19:08:45.356Z","0.1.53":"2026-05-13T23:14:08.953Z"},"bugs":{"url":"https://github.com/YZ-social/kdht/issues"},"homepage":"https://github.com/YZ-social/kdht#readme","repository":{"type":"git","url":"git+https://github.com/YZ-social/kdht.git"},"description":"Pure Kademlia base, for testing variations.","maintainers":[{"name":"howard.stearns","email":"stearns@alum.mit.edu"}],"readme":"# KDHT\n\nA Kademlia Distributed Hash Table.\nSee [original paper](https://www.scs.stanford.edu/~dm/home/papers/kpos.pdf) and [wikipedia](https://en.wikipedia.org/wiki/Kademlia)\n\nOur system works in browsers (and in NodeJS), using WebRTC data channels to pass information from one node to another. (WebRTC is the only peer-to-peer messaging mechanism built into every browser.) This is different from the original Kademlia, in which information was passed over connectionless UDP. A node kept a small set of data about the other nodes that it knew of, such as IP address and port number, and no long-lived limited resources such as sockets.\n\nFor testing and development, our system also allows the data channel connection to be simulated, so that large number of nodes can run directly in the same Javascript process, invoking RPC on each other directly rather than over the wire.\n\nKDHT is used in the [YZ p2p network](https://yz.social/).\n\n## Basic API\n\n`import { WebContact } from '@yz-social/kdht';`\n\nclass `WebContact`\n\nstatic method `create({name = uuidv4(), info = true, debug = false} = {})`\nPromises a `WebContact` instance with the `name` property set. It is recommended for both security and robustness that you let the name be generated by the default means each session. For example, other nodes in the network may not wish to interact with a node name that has just recently disconnected. The `info` and `debug` parameters can be set to log information about what the instance is doing.\n\nproperty `name`\nThe name of the node within the DHT network.\n\nproperty `attachment`\nA promise that resolves to the `WebContact` instance once it is connected to the network. This can be used to, e.g., change the user interface when the node is connected and ready.\n\nproperty `detachment`\nA promise that resolves once it has disconnected from the network, either by explicit `disconnect()` by the application and returning truthy, or from network conditions (such as the other side closing) and returning falsy. This can be use to, e.g., change the user interface or create a new `WebContact` when the ability to interact with the network goes away.\n\nmethod `connect(baseURL = new URL('/kdht', globalThis.location).href)`\nConnects through the portal at the specified baseURL. Returns a promise that resolves when connected and `attachement` has resolved. The portal is used only for initial WebRTC signaling to connect to the first other node, after which subsequent connections are made through the network itself. Note that the default is meaningless in NodeJS applications, and must be explicitly supplied.\n\nmethod `disconnect()`\nAsynchronously disconnects from all other nodes. Returns a promise that resolves when disconnected and `detachement` has resolved.\n\nmethod `disconnectTransports()`\nSynchronously terminates every connection. Use this if your application is being shutdown and you are not being given time to asynchronously disconnect.\n\nmethod `replicateStorage()`\nAsynchronously copies and stored data to other nodes. Use this if your application is not disconnecting, but may be shutdown by the operating system, such as when a browser document visibility changes to hidden.\n\n\nmethod `subscribe({eventName, key, handler, expiration = 60 * 60e3, autoRenewal = false})`\nArranges with the network to call `handler(item, key)` when someone on the network publishes to the key. The subscription lasts only for `expiration` milliseconds (clamped to one hour), after which the subscription is removed from the network and the instance, and must be renewed if needed. The `autoRenewal` parameter can be specified truthy to automatically renew the subscription before expiration, for as long as the instance is attached to the network.\n\nThe subscription can be explicitly cancelled by supplying a `null` `handler`.\n\n`key` is 128-bit BigInt that defaults to be a hash of `eventName.toString()`. There are no special semantics for eventName, so if an application needs, e.g., distinct portions of a complex eventName to map to different portions of the DHT address space, the application will need to construct an explictit key.\n\nmethod `publish({eventName, key, payload, subject = payload.toString(), issuedTime = Date.now(), expiration = 10 * 60e3, immediate = false})`\nArranges with the network for each subscribed node to call `handler({payload, subject, issuedTime}, key)` in all subscribed DHT nodes. `key` is as for `subscribe`.\n\nIf `immediate` is truthy and the Contact has subscribed to the specified `key`, then the `handler` is called immediately and synchronously within the `publish()`, and not called again when the information gets reflected through the network. Otherwise, the `handler` is not called until the publication \"comes back\".\n\nEach published datum is individually expired at the `issuedTime + expiration`, and removed from the network. Data may be republished by publishing to the same `key` and `subject`, or cancelled by doing the same with a `null payload`. Subscribed nodes do have the `handler` called with the updated or explicitly cancelled payloads, but not for expired data. A newly subscribed node receives previously published data that has not expired or been cancelled.\n\nThe `payload` may also be omitted, which does not change any existing payload data, but extends the expiration time based on the other parameters, with the limitation that the new expiration is never earlier than has been the case before.\n\nThe `subject` property is used to allow multiple publications to the same `key`. The network fires the `handler` for published data when it receives data whose `issuedTime` is strictly newer than any data that it already has for that `subject + key`. For example, to have multiple nodes publish, update, or cancel their own data to the same `key`, and to have every node receive the latest such value from all, then the application can have each node publish with, e.g., their `contact.name` as the `subject`.\n\n\n## Implementation\n\n### Classes\n\nA [`Node`](./nodes/node.js) is an actor in the DHT, and it has a `key` - a [BigInt](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/BigInt) of `Node.keySize` bits. The `key` is computed as a hash of a `name` string, which is typically a GUID, but in any case unique among the nodes of the network to which the node is connected.\n- A typical client will have one `Node` instance through which it interacts with one DHT.\n- A server or simulation might have many Node instances to each interact with the same DHT.\n- In any case, there is one `Node` class for all uses. For ease of development, it is broken into linear chain of small classes that live in the nodes directory of the repo.\n\nA `Node` has a `Contact` object to represent itself to another `Node`. A `Node` maintains [`KBuckets`](./nodes/kbucket.js), which each have a list of `Contacts` to other `Node`s.\n\nA [`Contact`](./contacts/contact.js) is the means through which a `Node` interacts with another `Node` instance:\n- When sending an RPC request, the `Contact` will \"serialize\" the sender `Nodes`'s contact.\n- When receiving an RPC response, the sender \"deserializes\" a string (maybe using a cache) to produce the `Contact` instance to be noted in the receiver's `KBucket`s.\n- In classic UDP Kademlia, a `Contact` would serialize as {key, ip, port}.\n- Our `WebContact` subclass wraps around a WebRTC connection.\n- Our `SimulatedConnectionContact` subclass directly contains the \"far\" `Node` object itself.\n- In both cases, a `Contact` has two `Node` objects, the \"host\" that owns this `Contact` (in the node's `KBucket`s), and a (possibly empty) representation of the far `Node` (to maintain, e.g., it's `key` and `name`). A `Contact` also has customizable methods to `connect` and to `sendRPC`.\n\nWhile a `Node` maintains several `Contacts` in its `KBucket`s, these are organized based on the distance from the `Contact`'s key to the `Node`'s key. However, each network-probing operation requires the ephermal creation of `Contact` information that is based on the distance to the target key being probed for. For this purpose, we wrap the `Contacts` in a [`Helper`](./nodes/helper.js) object that caches the distance to the target.\n\n### Connecting\n\nNodes learn about other node `name`s through those that with which they are already connected. In Kademlia, the node will, from time to time, directly connect to these newly discovered nodes.\n\nBrowsers do not allow pages to listen for incoming connections. Instead, two WebRTC peers must exchange \"signal\" information that allows them to simultaneously find each other on the Internet.\nWhen a node A needs to directly connect to another node B, A sends signals to B, which responds with its own signals back to A. This happens a couple of times until agreement is reached on how to directly connect. Obviously, these signals messages cannot go directly between two unconnected peers, but must be carried through some intermediary. Once connected to any node in the network, the signals can pass as network messages through the already connected node.\n\nTo form that initial connection to another node, a new unconnected node must go through a \"portal\" server. This consists of an ordinary Web server that handles a GET request that answers the `name` of one of the nodes that are run by that server and with which the server can directly communicate. The joining node then makes a POST to that same server, specifying its own name and that of the portal's node, as well as the signals. The server passes those signals to the specified portal node, and responds with that portal node's answering signals.  As long as the joined node remains connected to any other node in the network, it will connect to other nodes by passing the signals through the network itsef, rather than the portal web server, even if connecting to a node that happens to be on the portal server.\n\nWhen a node initiates a WebRTC connection to another node, the second node might not have a `Contact` for the incoming node, and the receiving node should not make one until the connection is established. Further, the appopriate `KBucket` might already be full, and yet we still need to keep this new `Contact`. For these reasons, a `Node` maintains a list of `Contacts` for which a `connection` has been or is being made, called `looseContacts`. (This is somewhat similar to the \"replacement cache\" used in some DHT, but we do not yet use it for that specific purpose.)\n\nThe number of open WebRTC connections is capped to a platform-specific number based on experimental findings. When that number has been exceeded in a node, the node finds a connection to drop from among its `looseContacts` and its `KBucket`s.\n\nIn the original Kademlia, a `ping` RPC was sent to nodes during `KBucket` maintenance to see if they were still alive. In our case, we have a long-lived connection that closes. Further, browsers usually give us a chance to \"clean up\" when the page is closed, and so we have the opportunity to send an appropriate message when leaving. Thus we don't have to wait for WebRTC to time out. When we receive such closures, we delete the `Contact` `connection`, and we check for this rather than sending a `ping` RPC.\n\n### Scripts\n\nThe [NodeJS](https://nodejs.org/) script [`portal.js`](./scripts/portal.js) runs a little [ExpressJS](https://expressjs.com/) Web server and associated portal nodes. (See [Connecting](#connecting), above.). Each portal node is run its own NodeJS sub-process (using NodeJS's [`cluster`](https://nodejs.org/api/cluster.html) mechanism). By default, it runs one portal node for each CPU core but one, allowing one core for the Web server process. The portal nodes are started one at a time, with each after the first connecting to one of the previous portal nodes through the script's own Web server at `http://localhost:3000/kdht`.\n- If an `externalBaseURL` is specified, the first portal node will connect to the compatible portal server running at the specified URL, forming one big network. Otherwise, the portal nodes and any other nodes that connect to it will be distinct.\n- `npm start` runs the script to connect with ki1r0y.com/kdht, while `npm run withoutExternal` runs separately.\n- The ExpressJS routing parts of `portal.js` is also available separately as `router.js`, so that it can be used as middleware within existing ExpressJS applications.\n- A very basic Web page is also servered at `http://localhost:3000/node.html` that joins the same network.\n\nOnce one instance of `portal.js` is running, the script [`bots.js`](./scripts/bots.js) can be run any number of times (subject to what the computer can handle). Each invocation launches more nodes that connect through the local portal server. These bots can be stable, or they can be told to periodically disconnect and reconnect for testing. The default number of bots is half the number of logical cores on the computer. The script can be run with `npm run bots` and `npm run thrashbots`.\n\n### Testing\n\nWe use the [https://jasmine.github.io/](Jasmine) test framework:\n- `npx jasmine` runs all the test that use only simulated network connections. In particular, `npx jasmine spec/dhtSimulationsSpec.js` runs several customizable variations of network behavior.\n- `npx jasmine spec/testWebrtc.js` runs the portals and bots scripts, creates a node that interacts with them, and shuts down the portals and bots.\n- `npm test` runs all of these.\n\n### Future Work\n\nWe currently follow the original Kademlia, in which each node probes the network by iteratively connecting with nodes successively closer to a target key, and asking each for better information before contacting the next. Subsequent work (e.g., [R5N](https://grothoff.org/christian/nss2011.pdf)) uses recursive routing, where one node asks a connected contact for information, who asks another, etc., with the response _and_ information about the network comming back to the callers. This indirect connection mechanism is more private, like onion-routing, and we would like to move to this. We already have a weak form of this for passing signals to a target with which we want to connect.\n","readmeFilename":"README.md"}