{"_id":"igropyr","_rev":"44-00073d5be7941f5b7e085d64c2de804e","name":"igropyr","dist-tags":{"latest":"1.8.2"},"versions":{"1.0.0":{"name":"igropyr","version":"1.0.0","keywords":["scheme","chez-scheme","r6rs","http","server","web-framework","libuv","actor-model","erlang","websocket"],"author":{"name":"guenchi"},"license":"MIT","_id":"igropyr@1.0.0","maintainers":[{"name":"guenchi","email":"louis.deguenchy@gmail.com"}],"homepage":"https://igropyr.com","bugs":{"url":"https://github.com/guenchi/Igropyr/issues"},"dist":{"shasum":"bf09cf8c60a8559097cd97921cdbd04c863a6146","tarball":"https://registry.npmjs.org/igropyr/-/igropyr-1.0.0.tgz","fileCount":43,"integrity":"sha512-LtMbNM97YkFWmmCLQQESFb6I6+ZRqqTTZg3IHOdRe6qxzmCBRo8I1uk05+Mfaqnr6EjayUi38fV648q5j3Heeg==","signatures":[{"sig":"MEYCIQDnruNTrXc43Jl3WHUK4licvnm+s5IxSNR33G/45oxDwAIhAKB225wk8OF3WCxVGsd3B8qtjjAIY940XAN2nxNm4gUY","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":391126},"gitHead":"0b09a207081a866aec3603eb36cc5d049614e1d1","_npmUser":{"name":"guenchi","email":"louis.deguenchy@gmail.com"},"repository":{"url":"git+https://github.com/guenchi/Igropyr.git","type":"git"},"_npmVersion":"11.5.2","description":"High-concurrency HTTP server framework for Chez Scheme on libuv: Erlang-style green processes, a Let-It-Crash worker pool, process-per-dialogue conversations, and s-expression RPC.","directories":{},"_nodeVersion":"23.7.0","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/igropyr_1.0.0_1783862445726_0.9305616347611709","host":"s3://npm-registry-packages-npm-production"}},"1.0.1":{"name":"igropyr","version":"1.0.1","keywords":["scheme","chez-scheme","r6rs","http","server","web-framework","libuv","actor-model","erlang","websocket"],"author":{"name":"guenchi"},"license":"MIT","_id":"igropyr@1.0.1","maintainers":[{"name":"guenchi","email":"louis.deguenchy@gmail.com"}],"homepage":"https://igropyr.com","bugs":{"url":"https://github.com/guenchi/Igropyr/issues"},"dist":{"shasum":"f3a576e689788422e8c5b33f696a4439640efc0d","tarball":"https://registry.npmjs.org/igropyr/-/igropyr-1.0.1.tgz","fileCount":43,"integrity":"sha512-PyXvkgKlLXRqpTYjRHwTeFHyMk6jWb8THC5tfU+zvOIIKvBId75xOonF1aMvGE/eHK1+Z6qInP358qlhv0Dffw==","signatures":[{"sig":"MEQCID6oXWYysH09BpBeG62SQDIkTROjqFJPc/RM3scwrWpvAiA04FfVB3SkZ4SGZVvJOLRxieB7+TXIrxc9XaUzZMeGLw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":391348},"gitHead":"d7bc70414f756f414638bf040156d089c3e0767e","scripts":{"test":"bash test/run-all.sh","start":"CHEZSCHEMELIBDIRS=.. CHEZSCHEMELIBEXTS=.chezscheme.sls::.chezscheme.so:.ss::.so:.sls::.so:.scm::.so:.sch::.so:.sc::.so scheme --script test/run-otp.sc"},"_npmUser":{"name":"guenchi","email":"louis.deguenchy@gmail.com"},"repository":{"url":"git+https://github.com/guenchi/Igropyr.git","type":"git"},"_npmVersion":"11.5.2","description":"High-concurrency HTTP server framework for Chez Scheme on libuv: Erlang-style green processes, a Let-It-Crash worker pool, process-per-dialogue conversations, and s-expression RPC.","directories":{},"_nodeVersion":"23.7.0","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/igropyr_1.0.1_1783865263314_0.19817091399430775","host":"s3://npm-registry-packages-npm-production"}},"1.0.2":{"name":"igropyr","version":"1.0.2","keywords":["scheme","chez-scheme","r6rs","http","server","web-framework","libuv","actor-model","erlang","websocket"],"author":{"name":"guenchi"},"license":"MIT","_id":"igropyr@1.0.2","maintainers":[{"name":"guenchi","email":"louis.deguenchy@gmail.com"}],"homepage":"https://igropyr.com","bugs":{"url":"https://github.com/guenchi/Igropyr/issues"},"dist":{"shasum":"dfa5b77fa59db6f89c2e9fd848f3ab4c52ee0fd6","tarball":"https://registry.npmjs.org/igropyr/-/igropyr-1.0.2.tgz","fileCount":44,"integrity":"sha512-7iw7QaJ9xymkrHepU92nedJawH17JEwCp3Zt7fOWTJovVS7eviQO/JdvrmWzrmx0H7LrNVq+8bOsU0S5zWg/1Q==","signatures":[{"sig":"MEQCICfby/qdzBGz5fTPi1YtNykfriQQUNxEMY+QgeirGMzSAiBuLUMZ2IEMsMSawfBOShqMbJPqOEtKPAPJtFN6APp1HQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":427605},"gitHead":"acef9c034640adaf369e9a7a1bbdc93d249f0af9","scripts":{"test":"bash test/run-all.sh","start":"CHEZSCHEMELIBDIRS=.. CHEZSCHEMELIBEXTS=.chezscheme.sls::.chezscheme.so:.ss::.so:.sls::.so:.scm::.so:.sch::.so:.sc::.so scheme --script test/run-otp.sc"},"_npmUser":{"name":"guenchi","email":"louis.deguenchy@gmail.com"},"repository":{"url":"git+https://github.com/guenchi/Igropyr.git","type":"git"},"_npmVersion":"11.5.2","description":"High-concurrency HTTP server framework for Chez Scheme on libuv: Erlang-style green processes, a Let-It-Crash worker pool, process-per-dialogue conversations, and s-expression RPC.","directories":{},"_nodeVersion":"23.7.0","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/igropyr_1.0.2_1783925544923_0.26281115678081224","host":"s3://npm-registry-packages-npm-production"}},"1.0.3":{"name":"igropyr","version":"1.0.3","keywords":["scheme","chez-scheme","r6rs","http","server","web-framework","libuv","actor-model","erlang","websocket"],"author":{"name":"guenchi"},"license":"MIT","_id":"igropyr@1.0.3","maintainers":[{"name":"guenchi","email":"louis.deguenchy@gmail.com"}],"homepage":"https://igropyr.com","bugs":{"url":"https://github.com/guenchi/Igropyr/issues"},"dist":{"shasum":"b1a9c38b69122d2a03695c1eddff63ed77b631f3","tarball":"https://registry.npmjs.org/igropyr/-/igropyr-1.0.3.tgz","fileCount":53,"integrity":"sha512-cKQsaRu+o0BAtYwxJBGi0DUO628zL/LT2jfjiYRGxuJU7y1Y+ii6wXX0mYam/Ev8wXjFW2RFbmB9hqv0A8rvNA==","signatures":[{"sig":"MEYCIQCpXHkVOzf73RUyiSELWwRBHZY3PBg1oGlwRAyMz2aN0gIhAM4nVrVppSu7pqcT0xa8vfs6/AA9lOuiDxAu5P2OjFJD","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":513115},"gitHead":"8ffc7c09437e17f96a2e125feb96314fc42903ee","scripts":{"test":"bash test/run-all.sh","start":"CHEZSCHEMELIBDIRS=.. CHEZSCHEMELIBEXTS=.chezscheme.sls::.chezscheme.so:.ss::.so:.sls::.so:.scm::.so:.sch::.so:.sc::.so scheme --script test/run-otp.sc"},"_npmUser":{"name":"guenchi","email":"louis.deguenchy@gmail.com"},"repository":{"url":"git+https://github.com/guenchi/Igropyr.git","type":"git"},"_npmVersion":"11.5.2","description":"High-concurrency HTTP server framework for Chez Scheme on libuv: Erlang-style green processes, a Let-It-Crash worker pool, process-per-dialogue conversations, and s-expression RPC.","directories":{},"_nodeVersion":"23.7.0","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/igropyr_1.0.3_1783935966747_0.5043547474254677","host":"s3://npm-registry-packages-npm-production"}},"1.1.0":{"name":"igropyr","version":"1.1.0","keywords":["scheme","chez-scheme","r6rs","http","server","web-framework","libuv","actor-model","erlang","websocket"],"author":{"name":"guenchi"},"license":"MIT","_id":"igropyr@1.1.0","maintainers":[{"name":"guenchi","email":"louis.deguenchy@gmail.com"}],"homepage":"https://igropyr.com","bugs":{"url":"https://github.com/guenchi/Igropyr/issues"},"dist":{"shasum":"8d717a6743457fdc7cbace901f6755f08e40a95d","tarball":"https://registry.npmjs.org/igropyr/-/igropyr-1.1.0.tgz","fileCount":54,"integrity":"sha512-lCbBwUYz5GOEfuH88GxSHJEpHWpPXWGbydyMPIKPwXmXiIJYYs6JpvzmGp4Qn/mmmTKK6JrQXt/7NntqrlyNIw==","signatures":[{"sig":"MEQCIBEqvKo+PW+lVwf+dkrf7GZBjca/VDyPJwxz9PP5TsEmAiBlhHGgSyohqXxaf4YsNjUgX8W0wSWtQ4iKwLvAuPVoIA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":534348},"gitHead":"8d1c6e6f652212b57cc9472899d153fa878955ed","scripts":{"test":"bash test/run-all.sh","start":"CHEZSCHEMELIBDIRS=.. CHEZSCHEMELIBEXTS=.chezscheme.sls::.chezscheme.so:.ss::.so:.sls::.so:.scm::.so:.sch::.so:.sc::.so scheme --script test/run-otp.sc"},"_npmUser":{"name":"guenchi","email":"louis.deguenchy@gmail.com"},"repository":{"url":"git+https://github.com/guenchi/Igropyr.git","type":"git"},"_npmVersion":"11.5.2","description":"High-concurrency HTTP server framework for Chez Scheme on libuv: Erlang-style green processes, a Let-It-Crash worker pool, process-per-dialogue conversations, and s-expression RPC.","directories":{},"_nodeVersion":"23.7.0","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/igropyr_1.1.0_1783946613427_0.7202614618667271","host":"s3://npm-registry-packages-npm-production"}},"1.1.1":{"name":"igropyr","version":"1.1.1","keywords":["scheme","chez-scheme","r6rs","http","server","web-framework","libuv","actor-model","erlang","websocket"],"author":{"name":"guenchi"},"license":"MIT","_id":"igropyr@1.1.1","maintainers":[{"name":"guenchi","email":"louis.deguenchy@gmail.com"}],"homepage":"https://igropyr.com","bugs":{"url":"https://github.com/guenchi/Igropyr/issues"},"dist":{"shasum":"b5d6458d378e8ce518de91504920723f65efa2af","tarball":"https://registry.npmjs.org/igropyr/-/igropyr-1.1.1.tgz","fileCount":54,"integrity":"sha512-Tm/mEGp7gUGjTZifBB6iAFQFCgZ4Wuvnp9dE1cNLs5DhIUzZjB1/OEVuCFJp+mH6V4Qp/KRT7O9YYgocOKTs7Q==","signatures":[{"sig":"MEUCIQD+evobmkAERNYpGPX7ZiM20a7MCzIQtXsze7dPTJrx/AIgPmkEEIuP452EKPzQAAaGUtI2kmAdcX8lgQUHPIoEtmI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":534393},"gitHead":"a5b280ede1738c9eea33dc545655788069b39545","scripts":{"test":"bash test/run-all.sh","start":"CHEZSCHEMELIBDIRS=.. CHEZSCHEMELIBEXTS=.chezscheme.sls::.chezscheme.so:.ss::.so:.sls::.so:.scm::.so:.sch::.so:.sc::.so scheme --script test/run-otp.sc"},"_npmUser":{"name":"guenchi","email":"louis.deguenchy@gmail.com"},"repository":{"url":"git+https://github.com/guenchi/Igropyr.git","type":"git"},"_npmVersion":"11.5.2","description":"High-concurrency HTTP server framework for Chez Scheme on libuv: Erlang-style green processes, a Let-It-Crash worker pool, process-per-dialogue conversations, and s-expression RPC.","directories":{},"_nodeVersion":"23.7.0","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/igropyr_1.1.1_1783974011671_0.44517014198857274","host":"s3://npm-registry-packages-npm-production"}},"1.1.2":{"name":"igropyr","version":"1.1.2","keywords":["scheme","chez-scheme","r6rs","http","server","web-framework","libuv","actor-model","erlang","websocket"],"author":{"name":"guenchi"},"license":"MIT","_id":"igropyr@1.1.2","maintainers":[{"name":"guenchi","email":"louis.deguenchy@gmail.com"}],"homepage":"https://igropyr.com","bugs":{"url":"https://github.com/guenchi/Igropyr/issues"},"dist":{"shasum":"17038a1983bb9e82ae8ac3d56384518e38c6a8d8","tarball":"https://registry.npmjs.org/igropyr/-/igropyr-1.1.2.tgz","fileCount":54,"integrity":"sha512-HWCruYkdWhSPnysdGfZFSTmwL/EWrFKfYsE7SsciXBZvlqcb2MPWndeSFlIYXmizmW9ERlNCyVLexqzDdgw+dw==","signatures":[{"sig":"MEUCIEsG6Q2ydE5ydSiDMnXpkjaMyyriUVR4VLLjQfRRvVz+AiEAyod/uQa+n0DMiP5AzI0aCCVDiYCaNLFi2XuvoB7YlRE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":536563},"gitHead":"935bd8d3a36f361ea4d27ea8abf13faffc2db882","scripts":{"test":"bash test/run-all.sh","start":"CHEZSCHEMELIBDIRS=.. CHEZSCHEMELIBEXTS=.chezscheme.sls::.chezscheme.so:.ss::.so:.sls::.so:.scm::.so:.sch::.so:.sc::.so scheme --script test/run-otp.sc"},"_npmUser":{"name":"guenchi","email":"louis.deguenchy@gmail.com"},"repository":{"url":"git+https://github.com/guenchi/Igropyr.git","type":"git"},"_npmVersion":"11.5.2","description":"High-concurrency HTTP server framework for Chez Scheme on libuv: Erlang-style green processes, a Let-It-Crash worker pool, process-per-dialogue conversations, and s-expression RPC.","directories":{},"_nodeVersion":"23.7.0","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/igropyr_1.1.2_1784018828820_0.179566072151222","host":"s3://npm-registry-packages-npm-production"}},"1.1.3":{"name":"igropyr","version":"1.1.3","keywords":["scheme","chez-scheme","r6rs","http","server","web-framework","libuv","actor-model","erlang","websocket"],"author":{"name":"guenchi"},"license":"MIT","_id":"igropyr@1.1.3","maintainers":[{"name":"guenchi","email":"louis.deguenchy@gmail.com"}],"homepage":"https://igropyr.com","bugs":{"url":"https://github.com/guenchi/Igropyr/issues"},"dist":{"shasum":"855baa83b77fa41fa9745f0bd697c0358fcaf821","tarball":"https://registry.npmjs.org/igropyr/-/igropyr-1.1.3.tgz","fileCount":56,"integrity":"sha512-mK6pChf/GMe/gPxkcdG8UTqDt7KNUSw72hzcteIGqjznZj0nEIr8Is86/csnKGetjheFWWzbPMR4XBSRWawSww==","signatures":[{"sig":"MEQCIEjJ1EuXo07JR2Ef+z991/fHy1P6xcoJOTGCOgtg8+izAiA7PGPNY+hE+1vQPHSaDvplxNNxvPVYb/7E0chlc3fNIg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":545993},"gitHead":"4caf26c9fa3e11674406785ff7531b25287f0f9f","scripts":{"test":"bash test/run-all.sh","start":"CHEZSCHEMELIBDIRS=.. CHEZSCHEMELIBEXTS=.chezscheme.sls::.chezscheme.so:.ss::.so:.sls::.so:.scm::.so:.sch::.so:.sc::.so scheme --script test/run-otp.sc"},"_npmUser":{"name":"guenchi","email":"louis.deguenchy@gmail.com"},"repository":{"url":"git+https://github.com/guenchi/Igropyr.git","type":"git"},"_npmVersion":"11.5.2","description":"High-concurrency HTTP server framework for Chez Scheme on libuv: Erlang-style green processes, a Let-It-Crash worker pool, process-per-dialogue conversations, and s-expression RPC.","directories":{},"_nodeVersion":"23.7.0","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/igropyr_1.1.3_1784025071846_0.1458393915388254","host":"s3://npm-registry-packages-npm-production"}},"1.1.5":{"name":"igropyr","version":"1.1.5","keywords":["scheme","chez-scheme","r6rs","http","server","web-framework","libuv","actor-model","erlang","websocket"],"author":{"name":"guenchi"},"license":"MIT","_id":"igropyr@1.1.5","maintainers":[{"name":"guenchi","email":"louis.deguenchy@gmail.com"}],"homepage":"https://igropyr.com","bugs":{"url":"https://github.com/guenchi/Igropyr/issues"},"dist":{"shasum":"f93bc1e5595adca1cfc6a97a2ef951aaba5fa91b","tarball":"https://registry.npmjs.org/igropyr/-/igropyr-1.1.5.tgz","fileCount":59,"integrity":"sha512-tM/Q+fSLnoJq5WnETiNkY8HlcmUY6sTRBhZyfcN48mC1hDTFn60R/2yIIw9WMnbCS16wcFKawWzZAPJTb5Kozg==","signatures":[{"sig":"MEUCIDshUktelwlfkawyuMgHWg/rP7P+LqSqoAF1RDRgbBn8AiEAmsjNjmOpG1x2HGCKFCPPZbgGR6Gcxtp13x8YiIS98gY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":572917},"gitHead":"d2cb2ae28267f4b75f2de738ac0880049264c0a6","scripts":{"test":"bash test/run-all.sh","start":"CHEZSCHEMELIBDIRS=.. CHEZSCHEMELIBEXTS=.chezscheme.sls::.chezscheme.so:.ss::.so:.sls::.so:.scm::.so:.sch::.so:.sc::.so scheme --script test/run-otp.sc"},"_npmUser":{"name":"guenchi","email":"louis.deguenchy@gmail.com"},"repository":{"url":"git+https://github.com/guenchi/Igropyr.git","type":"git"},"_npmVersion":"11.5.2","description":"High-concurrency HTTP server framework for Chez Scheme on libuv: Erlang-style green processes, a Let-It-Crash worker pool, process-per-dialogue conversations, and s-expression RPC.","directories":{},"_nodeVersion":"23.7.0","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/igropyr_1.1.5_1784085837405_0.5595865851810422","host":"s3://npm-registry-packages-npm-production"}},"1.1.6":{"name":"igropyr","version":"1.1.6","keywords":["scheme","chez-scheme","r6rs","http","server","web-framework","libuv","actor-model","erlang","websocket"],"author":{"name":"guenchi"},"license":"MIT","_id":"igropyr@1.1.6","maintainers":[{"name":"guenchi","email":"louis.deguenchy@gmail.com"}],"homepage":"https://igropyr.com","bugs":{"url":"https://github.com/guenchi/Igropyr/issues"},"dist":{"shasum":"d222ce45ee0919e303d43cf322e63821740fdaf9","tarball":"https://registry.npmjs.org/igropyr/-/igropyr-1.1.6.tgz","fileCount":63,"integrity":"sha512-dVJbAcldGVL4AvVGVUQxri9OfpEIowHTTfFTa9F27wvMp2IH0jh7IjArDL2d2VE7AeyEQhp0qwu4bYV5CyObAw==","signatures":[{"sig":"MEYCIQCSLn49gX6rItAWSc9/reUSb4Hk0rfMAC39JTZ3p0DJlQIhAKGTwAqto7gjmex2N3ILjnjg50WlTF/OnHNp+WGXmAbP","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":595114},"gitHead":"d9e43d78c4a59ed93ed50ec9691efefefa4dd332","scripts":{"test":"bash test/run-all.sh","start":"CHEZSCHEMELIBDIRS=.. CHEZSCHEMELIBEXTS=.chezscheme.sls::.chezscheme.so:.ss::.so:.sls::.so:.scm::.so:.sch::.so:.sc::.so scheme --script test/run-otp.sc"},"_npmUser":{"name":"guenchi","email":"louis.deguenchy@gmail.com"},"repository":{"url":"git+https://github.com/guenchi/Igropyr.git","type":"git"},"_npmVersion":"11.5.2","description":"High-concurrency HTTP server framework for Chez Scheme on libuv: Erlang-style green processes, a Let-It-Crash worker pool, process-per-dialogue conversations, and s-expression RPC.","directories":{},"_nodeVersion":"23.7.0","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/igropyr_1.1.6_1784191216335_0.26613222918762935","host":"s3://npm-registry-packages-npm-production"}},"1.1.7":{"name":"igropyr","version":"1.1.7","keywords":["scheme","chez-scheme","r6rs","http","server","web-framework","libuv","actor-model","erlang","websocket"],"author":{"name":"guenchi"},"license":"MIT","_id":"igropyr@1.1.7","maintainers":[{"name":"guenchi","email":"louis.deguenchy@gmail.com"}],"homepage":"https://igropyr.com","bugs":{"url":"https://github.com/guenchi/Igropyr/issues"},"dist":{"shasum":"976046e882f8754797daacd3554d8d56b307affd","tarball":"https://registry.npmjs.org/igropyr/-/igropyr-1.1.7.tgz","fileCount":67,"integrity":"sha512-E0UL3FuFBiyEvUES2EzuEgYfcdW5qXV4VZse83VOenh7nTRpA2ebnqToU0xb0iJW9pQYJkOggKfUbE685/vX6w==","signatures":[{"sig":"MEUCIB2kr6L7lSVYXz0UPXNIx9WmjKpT7Qbq/skM6NewkovAAiEA1PIpVqDewOpDfW5pOo66esdRD58rwGExDQCrBzN3L1A=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":639371},"gitHead":"7aca4320afc003b1d210de1a8ec25d265ca513bd","scripts":{"test":"bash test/run-all.sh","start":"CHEZSCHEMELIBDIRS=.. CHEZSCHEMELIBEXTS=.chezscheme.sls::.chezscheme.so:.ss::.so:.sls::.so:.scm::.so:.sch::.so:.sc::.so scheme --script test/run-otp.sc"},"_npmUser":{"name":"guenchi","email":"louis.deguenchy@gmail.com"},"repository":{"url":"git+https://github.com/guenchi/Igropyr.git","type":"git"},"_npmVersion":"11.5.2","description":"High-concurrency HTTP server framework for Chez Scheme on libuv: Erlang-style green processes, a Let-It-Crash worker pool, process-per-dialogue conversations, and s-expression RPC.","directories":{},"_nodeVersion":"23.7.0","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/igropyr_1.1.7_1784196072186_0.6842023240857653","host":"s3://npm-registry-packages-npm-production"}},"1.1.8":{"name":"igropyr","version":"1.1.8","keywords":["scheme","chez-scheme","r6rs","http","server","web-framework","libuv","actor-model","erlang","websocket"],"author":{"name":"guenchi"},"license":"MIT","_id":"igropyr@1.1.8","maintainers":[{"name":"guenchi","email":"louis.deguenchy@gmail.com"}],"homepage":"https://igropyr.com","bugs":{"url":"https://github.com/guenchi/Igropyr/issues"},"dist":{"shasum":"3ad0e9de8f3bdaec6ac1cb5216db8d71edd965ab","tarball":"https://registry.npmjs.org/igropyr/-/igropyr-1.1.8.tgz","fileCount":68,"integrity":"sha512-NH6C+JMKl8F3OReo8GYyDIyLqmX68kgj8WpQ0gdWJALxxTwHYIubLtj3NSJuXY9EM6BsGFQZCC3UhniyO8EhUg==","signatures":[{"sig":"MEQCIDU4R/0brjWHrgQ73xfzz8np3yDnyWwuMeKP+AY6cV4BAiAtfWi+msqkI2H30tX1VXKym2rWNju2hAdtI+AE6sbD7A==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":660975},"gitHead":"f9cccdab25df50a144dd223d3a180bbdd460613f","scripts":{"test":"bash test/run-all.sh","start":"CHEZSCHEMELIBDIRS=.. CHEZSCHEMELIBEXTS=.chezscheme.sls::.chezscheme.so:.ss::.so:.sls::.so:.scm::.so:.sch::.so:.sc::.so scheme --script test/run-otp.sc"},"_npmUser":{"name":"guenchi","email":"louis.deguenchy@gmail.com"},"repository":{"url":"git+https://github.com/guenchi/Igropyr.git","type":"git"},"_npmVersion":"11.5.2","description":"High-concurrency HTTP server framework for Chez Scheme on libuv: Erlang-style green processes, a Let-It-Crash worker pool, process-per-dialogue conversations, and s-expression RPC.","directories":{},"_nodeVersion":"23.7.0","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/igropyr_1.1.8_1784205424717_0.44545165156794764","host":"s3://npm-registry-packages-npm-production"}},"1.1.9":{"name":"igropyr","version":"1.1.9","keywords":["scheme","chez-scheme","r6rs","http","server","web-framework","libuv","actor-model","erlang","websocket"],"author":{"name":"guenchi"},"license":"MIT","_id":"igropyr@1.1.9","maintainers":[{"name":"guenchi","email":"louis.deguenchy@gmail.com"}],"homepage":"https://igropyr.com","bugs":{"url":"https://github.com/guenchi/Igropyr/issues"},"dist":{"shasum":"77ef81b127f88bb24373b6940ec5d40749ac4e3f","tarball":"https://registry.npmjs.org/igropyr/-/igropyr-1.1.9.tgz","fileCount":69,"integrity":"sha512-lKgZzbkVPf5gDcB00/y+4dfApMlhDdB7chmcVB7m0gDb2N8U37Wpb/dGwFRe+epCaVaiBiAkwxyNM7hZ0wtk9A==","signatures":[{"sig":"MEUCID2a69t0MwsGJpGASpL8ldNqfVVP+81CBntTkZ63TEvGAiEAuR+IwwCS5mArS/Pfa8uSqjmOUi+yfBwSgVnlm6pBguQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":669361},"gitHead":"ea0c2f57bfbe9d9499525a144a14e5e98bb0a1b3","scripts":{"test":"bash test/run-all.sh","start":"CHEZSCHEMELIBDIRS=.. CHEZSCHEMELIBEXTS=.chezscheme.sls::.chezscheme.so:.ss::.so:.sls::.so:.scm::.so:.sch::.so:.sc::.so scheme --script test/run-otp.sc"},"_npmUser":{"name":"guenchi","email":"louis.deguenchy@gmail.com"},"repository":{"url":"git+https://github.com/guenchi/Igropyr.git","type":"git"},"_npmVersion":"11.5.2","description":"High-concurrency HTTP server framework for Chez Scheme on libuv: Erlang-style green processes, a Let-It-Crash worker pool, process-per-dialogue conversations, and s-expression RPC.","directories":{},"_nodeVersion":"23.7.0","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/igropyr_1.1.9_1784249608086_0.43732356621293067","host":"s3://npm-registry-packages-npm-production"}},"1.1.10":{"name":"igropyr","version":"1.1.10","keywords":["scheme","chez-scheme","r6rs","http","server","web-framework","libuv","actor-model","erlang","websocket"],"author":{"name":"guenchi"},"license":"MIT","_id":"igropyr@1.1.10","maintainers":[{"name":"guenchi","email":"louis.deguenchy@gmail.com"}],"homepage":"https://igropyr.com","bugs":{"url":"https://github.com/guenchi/Igropyr/issues"},"dist":{"shasum":"b392879c56c78216670a5846b86341f7447a29f5","tarball":"https://registry.npmjs.org/igropyr/-/igropyr-1.1.10.tgz","fileCount":76,"integrity":"sha512-4IPm6Ajbzx9hc3h6xUCE7/bWruxL7K8Czk+nBa+TGWkP+njnYJAJV0p0SyNnSfiEtw3sxb+sAovKZX6m4mBluQ==","signatures":[{"sig":"MEUCIBSmv7Xzg3wu5JOmDyXandbZHAEYE7XeWWMGzlU28EL4AiEA8YBbHGLC0ZMN9RwTKcW7SxKIm7TZASTlMsglAzs42X0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":739396},"gitHead":"4948a0b1e54506cd282b335fe35233f32030832f","scripts":{"test":"bash test/run-all.sh","start":"CHEZSCHEMELIBDIRS=.. CHEZSCHEMELIBEXTS=.chezscheme.sls::.chezscheme.so:.ss::.so:.sls::.so:.scm::.so:.sch::.so:.sc::.so scheme --script test/run-otp.sc"},"_npmUser":{"name":"guenchi","email":"louis.deguenchy@gmail.com"},"repository":{"url":"git+https://github.com/guenchi/Igropyr.git","type":"git"},"_npmVersion":"11.5.2","description":"High-concurrency HTTP server framework for Chez Scheme on libuv: Erlang-style green processes, a Let-It-Crash worker pool, process-per-dialogue conversations, and s-expression RPC.","directories":{},"_nodeVersion":"23.7.0","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/igropyr_1.1.10_1784309596617_0.18759289724530448","host":"s3://npm-registry-packages-npm-production"}},"1.1.11":{"name":"igropyr","version":"1.1.11","keywords":["scheme","chez-scheme","r6rs","http","server","web-framework","libuv","actor-model","erlang","websocket"],"author":{"name":"guenchi"},"license":"MIT","_id":"igropyr@1.1.11","maintainers":[{"name":"guenchi","email":"louis.deguenchy@gmail.com"}],"homepage":"https://igropyr.com","bugs":{"url":"https://github.com/guenchi/Igropyr/issues"},"dist":{"shasum":"8f18808a810f74affc8e3e414698313ed8360887","tarball":"https://registry.npmjs.org/igropyr/-/igropyr-1.1.11.tgz","fileCount":78,"integrity":"sha512-pbQh3bIrw0ahdljhqD7WRJ5qaOoUBkiIzBY/rW0j38PvxkVLtPn1WOcaMEZ1P78BozI92GU7kA/hdKAY/8qf3Q==","signatures":[{"sig":"MEUCIHOXFmnpa1zs5BmoneZhrZMSOqvctIThjLKzuH5WijV5AiEA6l7vVF9S9L2h8+CaBLBnYKPnF8DsIW9ze78p2LbqLxI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":773508},"gitHead":"4b4add9918f915b0ac08ba632d90ef47cfec8d5a","scripts":{"test":"bash test/run-all.sh","start":"CHEZSCHEMELIBDIRS=.. CHEZSCHEMELIBEXTS=.chezscheme.sls::.chezscheme.so:.ss::.so:.sls::.so:.scm::.so:.sch::.so:.sc::.so scheme --script test/run-otp.sc"},"_npmUser":{"name":"guenchi","email":"louis.deguenchy@gmail.com"},"repository":{"url":"git+https://github.com/guenchi/Igropyr.git","type":"git"},"_npmVersion":"11.5.2","description":"High-concurrency HTTP server framework for Chez Scheme on libuv: Erlang-style green processes, a Let-It-Crash worker pool, process-per-dialogue conversations, and s-expression RPC.","directories":{},"_nodeVersion":"23.7.0","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/igropyr_1.1.11_1784343592555_0.3589543567788791","host":"s3://npm-registry-packages-npm-production"}},"1.1.12":{"name":"igropyr","version":"1.1.12","keywords":["scheme","chez-scheme","r6rs","http","server","web-framework","libuv","actor-model","erlang","websocket"],"author":{"name":"guenchi"},"license":"MIT","_id":"igropyr@1.1.12","maintainers":[{"name":"guenchi","email":"louis.deguenchy@gmail.com"}],"homepage":"https://igropyr.com","bugs":{"url":"https://github.com/guenchi/Igropyr/issues"},"dist":{"shasum":"086993080f517b72a4daca77d38360e49ebc08ed","tarball":"https://registry.npmjs.org/igropyr/-/igropyr-1.1.12.tgz","fileCount":80,"integrity":"sha512-7RRgdI5/XfPf29136clCzw4u8QZ7CVyELYETPf51Q+6xph0h8yxUw7EfdV6NZSx2f/Oabmxzu25bgUOX3NQthQ==","signatures":[{"sig":"MEQCIG/p+e+S/BIAjtMzqkSM0CLq9a0Zz0Yp2kkdL6jivLvDAiAQq8zi5SvCVbXEN5fChc9MV33txh6b3UH9lH70kEaPfA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":783845},"gitHead":"0697d1bd5fdf0542aa93c12ffef0800b35f981ff","scripts":{"test":"bash test/run-all.sh","start":"CHEZSCHEMELIBDIRS=.. CHEZSCHEMELIBEXTS=.chezscheme.sls::.chezscheme.so:.ss::.so:.sls::.so:.scm::.so:.sch::.so:.sc::.so scheme --script test/run-otp.sc"},"_npmUser":{"name":"guenchi","email":"louis.deguenchy@gmail.com"},"repository":{"url":"git+https://github.com/guenchi/Igropyr.git","type":"git"},"_npmVersion":"11.5.2","description":"High-concurrency HTTP server framework for Chez Scheme on libuv: Erlang-style green processes, a Let-It-Crash worker pool, process-per-dialogue conversations, and s-expression RPC.","directories":{},"_nodeVersion":"23.7.0","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/igropyr_1.1.12_1784343728137_0.40270930287785256","host":"s3://npm-registry-packages-npm-production"}},"1.1.13":{"name":"igropyr","version":"1.1.13","keywords":["scheme","chez-scheme","r6rs","http","server","web-framework","libuv","actor-model","erlang","websocket"],"author":{"name":"guenchi"},"license":"MIT","_id":"igropyr@1.1.13","maintainers":[{"name":"guenchi","email":"louis.deguenchy@gmail.com"}],"homepage":"https://igropyr.com","bugs":{"url":"https://github.com/guenchi/Igropyr/issues"},"dist":{"shasum":"085b69fae5d701dc293e2e3f90bdc6fc11ec8abe","tarball":"https://registry.npmjs.org/igropyr/-/igropyr-1.1.13.tgz","fileCount":82,"integrity":"sha512-vLBNcno7iDMFpTVzIi0uR0Dy8BWr9sA++PFZolWYcUbeNOlEfNdhC6ybCWcaXfqSwRSm0VTSKXOSBPSkIyVD8A==","signatures":[{"sig":"MEQCIBMN+NfT31InfTFisjvkjCJEwQcQT84SyuoVmOFQoD+0AiB40ErZkmBe6PiYaCYWrFOgVK9TwElm+/nEtlabLZboUA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":795920},"gitHead":"3ce7ec0bdcdeb195747687d04da2c11f8ab19978","scripts":{"test":"bash test/run-all.sh","start":"CHEZSCHEMELIBDIRS=.. CHEZSCHEMELIBEXTS=.chezscheme.sls::.chezscheme.so:.ss::.so:.sls::.so:.scm::.so:.sch::.so:.sc::.so scheme --script test/run-otp.sc"},"_npmUser":{"name":"guenchi","email":"louis.deguenchy@gmail.com"},"repository":{"url":"git+https://github.com/guenchi/Igropyr.git","type":"git"},"_npmVersion":"11.5.2","description":"High-concurrency HTTP server framework for Chez Scheme on libuv: Erlang-style green processes, a Let-It-Crash worker pool, process-per-dialogue conversations, and s-expression RPC.","directories":{},"_nodeVersion":"23.7.0","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/igropyr_1.1.13_1784343803870_0.8740645800165867","host":"s3://npm-registry-packages-npm-production"}},"1.1.15":{"name":"igropyr","version":"1.1.15","keywords":["scheme","chez-scheme","r6rs","http","server","web-framework","libuv","actor-model","erlang","websocket"],"author":{"name":"guenchi"},"license":"MIT","_id":"igropyr@1.1.15","maintainers":[{"name":"guenchi","email":"louis.deguenchy@gmail.com"}],"homepage":"https://igropyr.com","bugs":{"url":"https://github.com/guenchi/Igropyr/issues"},"dist":{"shasum":"5388c642e9c3fa757b5ec4a6ff25676fbb36ee92","tarball":"https://registry.npmjs.org/igropyr/-/igropyr-1.1.15.tgz","fileCount":82,"integrity":"sha512-XyyVsmBul+pisvUliP9JuL12Ea12KEo2JJ4SW4G90G6Nmddyw3y/8+WHkfcLfkB8inMXSinB9uoRUQaKMF7XLQ==","signatures":[{"sig":"MEYCIQDmM/lzcXQFWZoG/t4Fjco63vdk9jPHtgk22PFrvPZ2PgIhAPplkHSuDt3JkcdAtuPknkui25v3+ohmxp4nQTAC9Ia3","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":810953},"gitHead":"7030a72c3f996b0ffaca9d2a555cbc7a78d651ab","scripts":{"test":"bash test/run-all.sh","start":"CHEZSCHEMELIBDIRS=.. CHEZSCHEMELIBEXTS=.chezscheme.sls::.chezscheme.so:.ss::.so:.sls::.so:.scm::.so:.sch::.so:.sc::.so scheme --script test/run-otp.sc"},"_npmUser":{"name":"guenchi","email":"louis.deguenchy@gmail.com"},"repository":{"url":"git+https://github.com/guenchi/Igropyr.git","type":"git"},"_npmVersion":"11.5.2","description":"High-concurrency HTTP server framework for Chez Scheme on libuv: Erlang-style green processes, a Let-It-Crash worker pool, process-per-dialogue conversations, and s-expression RPC.","directories":{},"_nodeVersion":"23.7.0","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/igropyr_1.1.15_1784347025640_0.05781507060262392","host":"s3://npm-registry-packages-npm-production"}},"1.1.16":{"name":"igropyr","version":"1.1.16","keywords":["scheme","chez-scheme","r6rs","http","server","web-framework","libuv","actor-model","erlang","websocket"],"author":{"name":"guenchi"},"license":"MIT","_id":"igropyr@1.1.16","maintainers":[{"name":"guenchi","email":"louis.deguenchy@gmail.com"}],"homepage":"https://igropyr.com","bugs":{"url":"https://github.com/guenchi/Igropyr/issues"},"dist":{"shasum":"7dcb639adf5f7938446f61bf7b064d2e1e18be4f","tarball":"https://registry.npmjs.org/igropyr/-/igropyr-1.1.16.tgz","fileCount":82,"integrity":"sha512-VTOBtBf/ajEuVS5wejHerQxEj11DjsHpxNNnCfsgdQxjlojdoovBV3gNQ3BJ/7j+dNsxymGLO/O+CLZr6Ues5g==","signatures":[{"sig":"MEYCIQDrthjEQ8zLpa8C0NVGIGC9QAgTkBB46i3FrXKexWVPDwIhAPXGJFaUpxNTYexxnU0YE2Izjio9E7lmbNzDZgHiUwWX","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":811977},"gitHead":"786fc32850087b0740bf2bb3dab734e6482f3def","scripts":{"test":"bash test/run-all.sh","start":"CHEZSCHEMELIBDIRS=.. CHEZSCHEMELIBEXTS=.chezscheme.sls::.chezscheme.so:.ss::.so:.sls::.so:.scm::.so:.sch::.so:.sc::.so scheme --script test/run-otp.sc"},"_npmUser":{"name":"guenchi","email":"louis.deguenchy@gmail.com"},"repository":{"url":"git+https://github.com/guenchi/Igropyr.git","type":"git"},"_npmVersion":"11.5.2","description":"High-concurrency HTTP server framework for Chez Scheme on libuv: Erlang-style green processes, a Let-It-Crash worker pool, process-per-dialogue conversations, and s-expression RPC.","directories":{},"_nodeVersion":"23.7.0","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/igropyr_1.1.16_1784458674110_0.10114069436956652","host":"s3://npm-registry-packages-npm-production"}},"1.1.17":{"name":"igropyr","version":"1.1.17","keywords":["scheme","chez-scheme","r6rs","http","server","web-framework","libuv","actor-model","erlang","websocket"],"author":{"name":"guenchi"},"license":"MIT","_id":"igropyr@1.1.17","maintainers":[{"name":"guenchi","email":"louis.deguenchy@gmail.com"}],"homepage":"https://igropyr.com","bugs":{"url":"https://github.com/guenchi/Igropyr/issues"},"dist":{"shasum":"3b17d841c8e8b5654d13bd0fe417e8629d46aa04","tarball":"https://registry.npmjs.org/igropyr/-/igropyr-1.1.17.tgz","fileCount":89,"integrity":"sha512-yV13Nn4lVuepWBhi21nCavzbJzIkFBmazlHRQ6QL/NFZIgBkX/VgMXpZgDVQsvnNYTT2H5Bi7Ajk5xLbd7wdiQ==","signatures":[{"sig":"MEUCIDA7HmWEC4PGd+Q2sVlKvOLFwN1EIcxAT1zF2YO2YnsZAiEAlbgTyErKEwO9viRxlhfy0Ou7pzLD2r3MUq/Lv2nrVos=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":852898},"gitHead":"67d06722564c5ed3161b42e75fbe2e6cba1c819a","scripts":{"test":"bash test/run-all.sh","start":"CHEZSCHEMELIBDIRS=.. CHEZSCHEMELIBEXTS=.chezscheme.sls::.chezscheme.so:.ss::.so:.sls::.so:.scm::.so:.sch::.so:.sc::.so scheme --script test/run-otp.sc"},"_npmUser":{"name":"guenchi","email":"louis.deguenchy@gmail.com"},"repository":{"url":"git+https://github.com/guenchi/Igropyr.git","type":"git"},"_npmVersion":"11.5.2","description":"High-concurrency HTTP server framework for Chez Scheme on libuv: Erlang-style green processes, a Let-It-Crash worker pool, process-per-dialogue conversations, and s-expression RPC.","directories":{},"_nodeVersion":"23.7.0","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/igropyr_1.1.17_1784487445459_0.41433822711262347","host":"s3://npm-registry-packages-npm-production"}},"1.1.18":{"name":"igropyr","version":"1.1.18","keywords":["scheme","chez-scheme","r6rs","http","server","web-framework","libuv","actor-model","erlang","websocket"],"author":{"name":"guenchi"},"license":"MIT","_id":"igropyr@1.1.18","maintainers":[{"name":"guenchi","email":"louis.deguenchy@gmail.com"}],"homepage":"https://igropyr.com","bugs":{"url":"https://github.com/guenchi/Igropyr/issues"},"dist":{"shasum":"1a14867dbfe38b97064d684a16cf87f624d6d27c","tarball":"https://registry.npmjs.org/igropyr/-/igropyr-1.1.18.tgz","fileCount":95,"integrity":"sha512-EEourMY9vDqR9hy17q5kSHEy+AJALAVassAAYEZCj8UjqJ8C9sO/b4wXgLQr+WgLLzAcCalKQxOYm2i/rHA6bA==","signatures":[{"sig":"MEUCICOnaebn2aPSQKqGxrs25hkpkJL6jOm/7QxiFrg3HpczAiEAogDVF8Fjjsq3lnLTrih6JOQliAOAObZ/4Wh5cDTN54E=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":913333},"gitHead":"cd3e5e84852108d6ce7984909a81c1f1696c4eb7","scripts":{"test":"bash test/run-all.sh","start":"CHEZSCHEMELIBDIRS=.. CHEZSCHEMELIBEXTS=.chezscheme.sls::.chezscheme.so:.ss::.so:.sls::.so:.scm::.so:.sch::.so:.sc::.so scheme --script test/run-otp.sc"},"_npmUser":{"name":"guenchi","email":"louis.deguenchy@gmail.com"},"repository":{"url":"git+https://github.com/guenchi/Igropyr.git","type":"git"},"_npmVersion":"11.5.2","description":"High-concurrency HTTP server framework for Chez Scheme on libuv: Erlang-style green processes, a Let-It-Crash worker pool, process-per-dialogue conversations, and s-expression RPC.","directories":{},"_nodeVersion":"23.7.0","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/igropyr_1.1.18_1784577672416_0.7893504275532992","host":"s3://npm-registry-packages-npm-production"}},"1.1.19":{"name":"igropyr","version":"1.1.19","keywords":["scheme","chez-scheme","r6rs","http","server","web-framework","libuv","actor-model","erlang","websocket"],"author":{"name":"guenchi"},"license":"MIT","_id":"igropyr@1.1.19","maintainers":[{"name":"guenchi","email":"louis.deguenchy@gmail.com"}],"homepage":"https://igropyr.dev","bugs":{"url":"https://github.com/guenchi/Igropyr/issues"},"dist":{"shasum":"df70eb4067f119a480984cc20c16a5edd39badad","tarball":"https://registry.npmjs.org/igropyr/-/igropyr-1.1.19.tgz","fileCount":93,"integrity":"sha512-ow/9E3x9QqM/mdd1elnW2nZSvYmzfVG6OoNjSuTvdEvJNrcOsAdozwIPsMPTHe+pUZqBvOQI+CUgTHz3opXRZg==","signatures":[{"sig":"MEYCIQDEATHd8Z7gNszCuUmwLEu2wtyGZ0HHpElBSIiz86iibQIhAOqFbs26QXKHIzH5di2PwR5Xqhoc9sxx0rDEAFFJJtba","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":922805},"gitHead":"4b32b5616ed6f4fcc727bb8edcc1c0be833b17ee","scripts":{"test":"bash test/run-all.sh","start":"CHEZSCHEMELIBDIRS=.. CHEZSCHEMELIBEXTS=.chezscheme.sls::.chezscheme.so:.ss::.so:.sls::.so:.scm::.so:.sch::.so:.sc::.so scheme --script test/run-otp.sc"},"_npmUser":{"name":"guenchi","email":"louis.deguenchy@gmail.com"},"repository":{"url":"git+https://github.com/guenchi/Igropyr.git","type":"git"},"_npmVersion":"11.5.2","description":"High-concurrency HTTP server framework for Chez Scheme on libuv: Erlang-style green processes, a Let-It-Crash worker pool, process-per-dialogue conversations, and s-expression RPC.","directories":{},"_nodeVersion":"23.7.0","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/igropyr_1.1.19_1784638114548_0.4498105246580335","host":"s3://npm-registry-packages-npm-production"}},"1.1.20":{"name":"igropyr","version":"1.1.20","keywords":["scheme","chez-scheme","r6rs","http","server","web-framework","libuv","actor-model","erlang","websocket"],"author":{"name":"guenchi"},"license":"MIT","_id":"igropyr@1.1.20","maintainers":[{"name":"guenchi","email":"louis.deguenchy@gmail.com"}],"homepage":"https://igropyr.dev","bugs":{"url":"https://github.com/guenchi/Igropyr/issues"},"dist":{"shasum":"dbcf71bd2a1d133b50a31d2556862e68c11f2da0","tarball":"https://registry.npmjs.org/igropyr/-/igropyr-1.1.20.tgz","fileCount":93,"integrity":"sha512-mw9yinilxCsRSASqe/Vg2n8vN0M+MoKQ6zNeqRJX+fB6RcDEDk6Ep5Osfr/9rvG/Ve3fWienHFXLO7dayG+AnQ==","signatures":[{"sig":"MEYCIQDbQse631XfhsGk8UqW5pr1lHqpJpjJ8SP+5x8G+7fRKgIhAMne6DIoiPSz94UcuYojB66Ib0pBxj8vM8+1DyNASTi3","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":929068},"gitHead":"9baa2ccee0d364635c5e015a117dc514e0ae6968","scripts":{"test":"bash test/run-all.sh","start":"CHEZSCHEMELIBDIRS=.. CHEZSCHEMELIBEXTS=.chezscheme.sls::.chezscheme.so:.ss::.so:.sls::.so:.scm::.so:.sch::.so:.sc::.so scheme --script test/run-otp.sc"},"_npmUser":{"name":"guenchi","email":"louis.deguenchy@gmail.com"},"repository":{"url":"git+https://github.com/guenchi/Igropyr.git","type":"git"},"_npmVersion":"11.5.2","description":"High-concurrency HTTP server framework for Chez Scheme on libuv: Erlang-style green processes, a Let-It-Crash worker pool, process-per-dialogue conversations, and s-expression RPC.","directories":{},"_nodeVersion":"23.7.0","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/igropyr_1.1.20_1784809076538_0.7164214022037105","host":"s3://npm-registry-packages-npm-production"}},"1.2.1":{"name":"igropyr","version":"1.2.1","keywords":["scheme","chez-scheme","r6rs","http","server","web-framework","libuv","actor-model","erlang","websocket"],"author":{"name":"guenchi"},"license":"MIT","_id":"igropyr@1.2.1","maintainers":[{"name":"guenchi","email":"louis.deguenchy@gmail.com"}],"homepage":"https://igropyr.dev","bugs":{"url":"https://github.com/guenchi/Igropyr/issues"},"dist":{"shasum":"073b0e44b4a36ec38d61b1742e3375b73a6aaae5","tarball":"https://registry.npmjs.org/igropyr/-/igropyr-1.2.1.tgz","fileCount":103,"integrity":"sha512-FJDFgcTm4bI/UVfLTW86dGcJdBcBlF2fJUS+nEN5YjLxKEm0ZqQAjrw5PcAQgAR6fdBHD4IxZCVud2MXVgJMbw==","signatures":[{"sig":"MEUCIGlDQ6WK2lQ6xmxtF2LEhuIHep8A20WQgIQM9vDIC7RtAiEAsTcjPs9ECiwv86aaAfm+2Teq80dX4mI5reaAt8LpYwU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1058904},"gitHead":"02c08fcf1c1e227a4d10c359a679734bd3816576","scripts":{"test":"bash test/run-all.sh","start":"CHEZSCHEMELIBDIRS=.. CHEZSCHEMELIBEXTS=.chezscheme.sls::.chezscheme.so:.ss::.so:.sls::.so:.scm::.so:.sch::.so:.sc::.so scheme --script test/run-otp.sc"},"_npmUser":{"name":"guenchi","email":"louis.deguenchy@gmail.com"},"repository":{"url":"git+https://github.com/guenchi/Igropyr.git","type":"git"},"_npmVersion":"11.5.2","description":"High-concurrency HTTP server framework for Chez Scheme on libuv: Erlang-style green processes, a Let-It-Crash worker pool, process-per-dialogue conversations, and s-expression RPC.","directories":{},"_nodeVersion":"23.7.0","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/igropyr_1.2.1_1784941033460_0.24324953512939085","host":"s3://npm-registry-packages-npm-production"}},"1.2.2":{"name":"igropyr","version":"1.2.2","keywords":["scheme","chez-scheme","r6rs","http","server","web-framework","libuv","actor-model","erlang","websocket"],"author":{"name":"guenchi"},"license":"MIT","_id":"igropyr@1.2.2","maintainers":[{"name":"guenchi","email":"louis.deguenchy@gmail.com"}],"homepage":"https://igropyr.dev","bugs":{"url":"https://github.com/guenchi/Igropyr/issues"},"dist":{"shasum":"8b7aded7c96bbd0f0f6a4d40dfd75ad2bd04e152","tarball":"https://registry.npmjs.org/igropyr/-/igropyr-1.2.2.tgz","fileCount":110,"integrity":"sha512-6d8pGiD0C8M8Lpjax+9b41ZkxA+XqNQY8zybMRCBJPCmHy9wzrtZuGAvQox+IUAVzutdJX3HskJc9ANTmV4nrA==","signatures":[{"sig":"MEQCIGt6nYTD1i8WRAN94ty0E6ep0TBDVzC0EahLTBKkk07nAiB80K+2WCosO2KXmQzI5SBbM+DdXZN5qqpeAIHyZ+hPFQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1163947},"gitHead":"752b0ba90702f1e823d65139889fed7200787648","scripts":{"test":"bash test/run-all.sh","start":"CHEZSCHEMELIBDIRS=.. CHEZSCHEMELIBEXTS=.chezscheme.sls::.chezscheme.so:.ss::.so:.sls::.so:.scm::.so:.sch::.so:.sc::.so scheme --script test/run-otp.sc"},"_npmUser":{"name":"guenchi","email":"louis.deguenchy@gmail.com"},"repository":{"url":"git+https://github.com/guenchi/Igropyr.git","type":"git"},"_npmVersion":"11.5.2","description":"High-concurrency HTTP server framework for Chez Scheme on libuv: Erlang-style green processes, a Let-It-Crash worker pool, process-per-dialogue conversations, and s-expression RPC.","directories":{},"_nodeVersion":"23.7.0","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/igropyr_1.2.2_1785034531385_0.8058741434352226","host":"s3://npm-registry-packages-npm-production"}},"1.2.3":{"name":"igropyr","version":"1.2.3","keywords":["scheme","chez-scheme","r6rs","http","server","web-framework","libuv","actor-model","erlang","websocket"],"author":{"name":"guenchi"},"license":"MIT","_id":"igropyr@1.2.3","maintainers":[{"name":"guenchi","email":"louis.deguenchy@gmail.com"}],"homepage":"https://igropyr.dev","bugs":{"url":"https://github.com/guenchi/Igropyr/issues"},"dist":{"shasum":"ff8b9dbcfcd84b93941f31eaca6e169d84ec4bb9","tarball":"https://registry.npmjs.org/igropyr/-/igropyr-1.2.3.tgz","fileCount":117,"integrity":"sha512-HMIv9fkkzzPNg6NCuzxSjwM4fhVv2VrxUphjrce/I/tShYW35LIeesIzi0ggBcFpXkRSlJzX4p0mu2sqPAZyfw==","signatures":[{"sig":"MEQCIQCIOAGA1whv+ONqRnqTEj9NBIzmT5jcQllfk12gPW5KnAIfB5ypipvjUYzAGOADcZk4zNFpOqtGduFUmuUSXHtzKA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1311774},"gitHead":"9a5798634d546a2cc64059f543481507ef3f2e48","scripts":{"test":"bash test/run-all.sh","start":"CHEZSCHEMELIBDIRS=.. CHEZSCHEMELIBEXTS=.chezscheme.sls::.chezscheme.so:.ss::.so:.sls::.so:.scm::.so:.sch::.so:.sc::.so scheme --script test/run-otp.sc"},"_npmUser":{"name":"guenchi","email":"louis.deguenchy@gmail.com"},"repository":{"url":"git+https://github.com/guenchi/Igropyr.git","type":"git"},"_npmVersion":"11.5.2","description":"High-concurrency HTTP server framework for Chez Scheme on libuv: Erlang-style green processes, a Let-It-Crash worker pool, process-per-dialogue conversations, and s-expression RPC.","directories":{},"_nodeVersion":"23.7.0","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/igropyr_1.2.3_1785469774587_0.23342256911184767","host":"s3://npm-registry-packages-npm-production"}},"1.2.5":{"name":"igropyr","version":"1.2.5","keywords":["scheme","chez-scheme","r6rs","http","server","web-framework","libuv","actor-model","erlang","websocket"],"author":{"name":"guenchi"},"license":"MIT","_id":"igropyr@1.2.5","maintainers":[{"name":"guenchi","email":"louis.deguenchy@gmail.com"}],"homepage":"https://igropyr.dev","bugs":{"url":"https://github.com/guenchi/Igropyr/issues"},"dist":{"shasum":"bb1d348d2be0906a5cbe0a97c1d0ec951b7a2483","tarball":"https://registry.npmjs.org/igropyr/-/igropyr-1.2.5.tgz","fileCount":119,"integrity":"sha512-HRfCV2Rup97RRiGJkhjkIiYPlfEAnEdMQpaS26T8vvFwftcuxHoDXnsacdmOHMx1dYnmYDTrbwN/Xmxsw6Y9ew==","signatures":[{"sig":"MEUCIGPT52NQ+JogPnYDcLqZnYiyakzAAGmHudQPIGvc+LpcAiEA4uC2ZpOln8KBYRp4u7GTYQMzK3Pqw819iKxrrPkmPi8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1346399},"gitHead":"4106e6932b31be627f6e760dacdc084fec6278b3","scripts":{"test":"bash test/run-all.sh","start":"CHEZSCHEMELIBDIRS=.. CHEZSCHEMELIBEXTS=.chezscheme.sls::.chezscheme.so:.ss::.so:.sls::.so:.scm::.so:.sch::.so:.sc::.so scheme --script test/run-otp.sc"},"_npmUser":{"name":"guenchi","email":"louis.deguenchy@gmail.com"},"repository":{"url":"git+https://github.com/guenchi/Igropyr.git","type":"git"},"_npmVersion":"11.5.2","description":"High-concurrency HTTP server framework for Chez Scheme on libuv: Erlang-style green processes, a Let-It-Crash worker pool, process-per-dialogue conversations, and s-expression RPC.","directories":{},"_nodeVersion":"23.7.0","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/igropyr_1.2.5_1785536765340_0.7912562626921376","host":"s3://npm-registry-packages-npm-production"}},"1.2.6":{"name":"igropyr","version":"1.2.6","keywords":["scheme","chez-scheme","r6rs","http","server","web-framework","libuv","actor-model","erlang","websocket"],"author":{"name":"guenchi"},"license":"MIT","_id":"igropyr@1.2.6","maintainers":[{"name":"guenchi","email":"louis.deguenchy@gmail.com"}],"homepage":"https://igropyr.dev","bugs":{"url":"https://github.com/guenchi/Igropyr/issues"},"dist":{"shasum":"138eee3d21ee5d69773ad8f56582777758a83bda","tarball":"https://registry.npmjs.org/igropyr/-/igropyr-1.2.6.tgz","fileCount":121,"integrity":"sha512-Jv3LWDuV0VvkrdQ8WxUk1BT4ZqBvVvYynZuFZeoai5D4gP9xBDR17GH3YO39JQ2BZOCG1bJe9XttNl5Y9VsULw==","signatures":[{"sig":"MEYCIQCFLW2JltHDv6O+84Jt+4hToRdIOzH6BwEQEeaaDXdeCQIhAKLkJRsQaPjAV9giR2VucKhWxNGXw8NAB3cPG9MJHuxq","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1376859},"gitHead":"944d873fbac157d940d8d066419da2299d564a83","scripts":{"test":"bash test/run-all.sh","start":"CHEZSCHEMELIBDIRS=.. CHEZSCHEMELIBEXTS=.chezscheme.sls::.chezscheme.so:.ss::.so:.sls::.so:.scm::.so:.sch::.so:.sc::.so scheme --script test/run-otp.sc"},"_npmUser":{"name":"guenchi","email":"louis.deguenchy@gmail.com"},"repository":{"url":"git+https://github.com/guenchi/Igropyr.git","type":"git"},"_npmVersion":"11.5.2","description":"High-concurrency HTTP server framework for Chez Scheme on libuv: Erlang-style green processes, a Let-It-Crash worker pool, process-per-dialogue conversations, and s-expression RPC.","directories":{},"_nodeVersion":"23.7.0","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/igropyr_1.2.6_1785726319111_0.6817947948334961","host":"s3://npm-registry-packages-npm-production"}},"1.2.7":{"name":"igropyr","version":"1.2.7","keywords":["scheme","chez-scheme","r6rs","http","server","web-framework","libuv","actor-model","erlang","websocket"],"author":{"name":"guenchi"},"license":"MIT","_id":"igropyr@1.2.7","maintainers":[{"name":"guenchi","email":"louis.deguenchy@gmail.com"}],"homepage":"https://igropyr.dev","bugs":{"url":"https://github.com/guenchi/Igropyr/issues"},"dist":{"shasum":"78e82c0ed84965155770b22fc9b1534bbdd10d29","tarball":"https://registry.npmjs.org/igropyr/-/igropyr-1.2.7.tgz","fileCount":146,"integrity":"sha512-d2m5KIhz8wuYPDPheZebeRzZvFy7H608bahppokWXWgNg74TwoEbyePT+hMd6xyfb4O6UbDWQjy0Ya1kNNmRPw==","signatures":[{"sig":"MEUCIQCJbK+o/k5h1RXDDTTeDjXSNTg9z3dZ5QPCT0Y5Xw8WQQIgb2l6SwiIwz43WwclJyXV4AjTIcla/tMGI8kzKcFB87A=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":2097313},"gitHead":"41077e247bd6c2ac5ec781620f90ea1b508a4c1e","scripts":{"test":"bash test/run-all.sh","start":"CHEZSCHEMELIBDIRS=.. CHEZSCHEMELIBEXTS=.chezscheme.sls::.chezscheme.so:.ss::.so:.sls::.so:.scm::.so:.sch::.so:.sc::.so scheme --script test/run-otp.sc"},"_npmUser":{"name":"guenchi","email":"louis.deguenchy@gmail.com"},"repository":{"url":"git+https://github.com/guenchi/Igropyr.git","type":"git"},"_npmVersion":"11.5.2","description":"High-concurrency HTTP server framework for Chez Scheme on libuv: Erlang-style green processes, a Let-It-Crash worker pool, process-per-dialogue conversations, and s-expression RPC.","directories":{},"_nodeVersion":"23.7.0","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/igropyr_1.2.7_1786069577938_0.23627588621663986","host":"s3://npm-registry-packages-npm-production"}},"1.2.8":{"name":"igropyr","version":"1.2.8","keywords":["scheme","chez-scheme","r6rs","http","server","web-framework","libuv","actor-model","erlang","websocket"],"author":{"name":"guenchi"},"license":"MIT","_id":"igropyr@1.2.8","maintainers":[{"name":"guenchi","email":"louis.deguenchy@gmail.com"}],"homepage":"https://igropyr.dev","bugs":{"url":"https://github.com/guenchi/Igropyr/issues"},"dist":{"shasum":"e0865548ca96fb0ec41ed841cc7a302ebb7480b9","tarball":"https://registry.npmjs.org/igropyr/-/igropyr-1.2.8.tgz","fileCount":151,"integrity":"sha512-iw+BPLRj0XFIvO6ftXdVzIVPcMC8N87fh8bVfQfpxdX2Sf24sPa2hTr/QjgBYJyIrmlIBmGFCTjxfs3Od5tVbQ==","signatures":[{"sig":"MEYCIQDhlTj0xjXpH6GGvYf/3vzOwgahFhc+e2D1+aNVoEUJOQIhAL0TB2rugJgHjjC+EneurmwtlGqUL+24w9jsX4uPdDP3","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":2286874},"gitHead":"2b42e6ed7be543cb45ad8841b8670ef405681d2a","scripts":{"test":"bash test/run-all.sh","start":"CHEZSCHEMELIBDIRS=.. CHEZSCHEMELIBEXTS=.chezscheme.sls::.chezscheme.so:.ss::.so:.sls::.so:.scm::.so:.sch::.so:.sc::.so scheme --script test/run-otp.sc"},"_npmUser":{"name":"guenchi","email":"louis.deguenchy@gmail.com"},"repository":{"url":"git+https://github.com/guenchi/Igropyr.git","type":"git"},"_npmVersion":"11.5.2","description":"High-concurrency HTTP server framework for Chez Scheme on libuv: Erlang-style green processes, a Let-It-Crash worker pool, process-per-dialogue conversations, and s-expression RPC.","directories":{},"_nodeVersion":"23.7.0","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/igropyr_1.2.8_1786645386159_0.5245265285655476","host":"s3://npm-registry-packages-npm-production"}},"1.2.9":{"name":"igropyr","version":"1.2.9","keywords":["scheme","chez-scheme","r6rs","http","server","web-framework","libuv","actor-model","erlang","websocket"],"author":{"name":"guenchi"},"license":"MIT","_id":"igropyr@1.2.9","maintainers":[{"name":"guenchi","email":"louis.deguenchy@gmail.com"}],"homepage":"https://igropyr.dev","bugs":{"url":"https://github.com/guenchi/Igropyr/issues"},"dist":{"shasum":"472097164d30f6a1eec1a6bc38ddb27961951e94","tarball":"https://registry.npmjs.org/igropyr/-/igropyr-1.2.9.tgz","fileCount":157,"integrity":"sha512-nLXdvLgYUbhQiZsdZh+Y2ASN81LuqZ0PLS1VCEXGrlwcz/BUKXEYAJ+DXza5FfKacmpYLcjoWtyLtpzIxzf5eA==","signatures":[{"sig":"MEUCICluCI5IA04rS9XVPNEZEVHs27BwolHiXC7a5BJduD2rAiEAoyCN+HpJnJk2T2ltrmUYAnZ+GJZOiYfe/ilxf9EDkVE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":2739562},"gitHead":"255e7c94da636057fd5cf878043ccdc31b6635aa","scripts":{"test":"bash test/run-all.sh","start":"CHEZSCHEMELIBDIRS=.. CHEZSCHEMELIBEXTS=.chezscheme.sls::.chezscheme.so:.ss::.so:.sls::.so:.scm::.so:.sch::.so:.sc::.so scheme --script test/run-otp.sc"},"_npmUser":{"name":"guenchi","email":"louis.deguenchy@gmail.com"},"repository":{"url":"git+https://github.com/guenchi/Igropyr.git","type":"git"},"_npmVersion":"11.5.2","description":"High-concurrency HTTP server framework for Chez Scheme on libuv: Erlang-style green processes, a Let-It-Crash worker pool, process-per-dialogue conversations, and s-expression RPC.","directories":{},"_nodeVersion":"23.7.0","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/igropyr_1.2.9_1787024980238_0.5265716126285598","host":"s3://npm-registry-packages-npm-production"}},"1.3.0":{"name":"igropyr","version":"1.3.0","keywords":["scheme","chez-scheme","r6rs","http","server","web-framework","libuv","actor-model","erlang","websocket"],"author":{"name":"guenchi"},"license":"MIT","_id":"igropyr@1.3.0","maintainers":[{"name":"guenchi","email":"louis.deguenchy@gmail.com"}],"homepage":"https://igropyr.dev","bugs":{"url":"https://github.com/guenchi/Igropyr/issues"},"dist":{"shasum":"e32a32f14472fb82c5c6203729b05c93edbfcf9b","tarball":"https://registry.npmjs.org/igropyr/-/igropyr-1.3.0.tgz","fileCount":167,"integrity":"sha512-DvWz+UTgtKSo2hvSm5obSpe5DaCkijQLhSQs8mZP9PXhbRyPUrnVsrsqccQiOJrUvlAV20KsE+ThSLEihas7MA==","signatures":[{"sig":"MEUCIQCH1DL8SU2SwFaq1+Nbk5IvDPoPSsizw8jHvZZZVLAFvQIgYC7+aqpb2+EqC4RddJhSuBdhpItosB5+iX7l5xWzeXM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":2932115},"gitHead":"78cf6b7c46251083b070f95cd3b10c01587d1a40","scripts":{"test":"bash test/run-all.sh","start":"CHEZSCHEMELIBDIRS=.. CHEZSCHEMELIBEXTS=.chezscheme.sls::.chezscheme.so:.ss::.so:.sls::.so:.scm::.so:.sch::.so:.sc::.so scheme --script test/run-otp.sc"},"_npmUser":{"name":"guenchi","email":"louis.deguenchy@gmail.com"},"repository":{"url":"git+https://github.com/guenchi/Igropyr.git","type":"git"},"_npmVersion":"11.5.2","description":"High-concurrency HTTP server framework for Chez Scheme on libuv: Erlang-style green processes, a Let-It-Crash worker pool, process-per-dialogue conversations, and s-expression RPC.","directories":{},"_nodeVersion":"23.7.0","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/igropyr_1.3.0_1787095475029_0.9470435895814415","host":"s3://npm-registry-packages-npm-production"}},"1.3.1":{"name":"igropyr","version":"1.3.1","keywords":["scheme","chez-scheme","r6rs","http","server","web-framework","libuv","actor-model","erlang","websocket"],"author":{"name":"guenchi"},"license":"MIT","_id":"igropyr@1.3.1","maintainers":[{"name":"guenchi","email":"louis.deguenchy@gmail.com"}],"homepage":"https://igropyr.dev","bugs":{"url":"https://github.com/guenchi/Igropyr/issues"},"dist":{"shasum":"2601eeacdad1a17826e2252f70a491cc52b9b5d3","tarball":"https://registry.npmjs.org/igropyr/-/igropyr-1.3.1.tgz","fileCount":169,"integrity":"sha512-9xa7QSVtMzYNVwwqdM090PG2eao7V9dpjFyECnc7EBaFpBPKMkmbBhgDHJLsa5nMzKj+XaJidHhVvnXbWwV5iA==","signatures":[{"sig":"MEYCIQDCaa0rMAAl6f9a+oz0QVcQe1Uk0SKa3MVcXO32L+O03AIhAL0/tFWttEaM6//nofANTL5Ja0JEEETgAs06BTJYna2F","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":2991986},"gitHead":"32a97735c719308cd1df9e0003e93e6a97a58cf0","scripts":{"test":"bash test/run-all.sh","start":"CHEZSCHEMELIBDIRS=.. CHEZSCHEMELIBEXTS=.chezscheme.sls::.chezscheme.so:.ss::.so:.sls::.so:.scm::.so:.sch::.so:.sc::.so scheme --script test/run-otp.sc"},"_npmUser":{"name":"guenchi","email":"louis.deguenchy@gmail.com"},"repository":{"url":"git+https://github.com/guenchi/Igropyr.git","type":"git"},"_npmVersion":"11.5.2","description":"High-concurrency HTTP server framework for Chez Scheme on libuv: Erlang-style green processes, a Let-It-Crash worker pool, process-per-dialogue conversations, and s-expression RPC.","directories":{},"_nodeVersion":"23.7.0","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/igropyr_1.3.1_1787108436099_0.8377457023197097","host":"s3://npm-registry-packages-npm-production"}},"1.3.2":{"name":"igropyr","version":"1.3.2","keywords":["scheme","chez-scheme","r6rs","http","server","web-framework","libuv","actor-model","erlang","websocket"],"author":{"name":"guenchi"},"license":"MIT","_id":"igropyr@1.3.2","maintainers":[{"name":"guenchi","email":"louis.deguenchy@gmail.com"}],"homepage":"https://igropyr.dev","bugs":{"url":"https://github.com/guenchi/Igropyr/issues"},"dist":{"shasum":"35c802d64c2ef1b8d6a6c33b312d70d6d94b16da","tarball":"https://registry.npmjs.org/igropyr/-/igropyr-1.3.2.tgz","fileCount":173,"integrity":"sha512-iJYwL7RsIMQlUtg1BZVg06rBBK1/FH5gsWbXOFnVzf89dt3d/UllcYGA8fX4AUDvlGBvDCRi8bfetZGKi4UMyA==","signatures":[{"sig":"MEUCIQD0vIsqrRE+QtVs30aG8IHL5TCO57cMp6Bq8oiuJqAR6wIgcqulWGqWg2BQ3Zp+Tr95WtBUbHtq6JNliM4Q7d7Fyh0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":3407334},"gitHead":"62b07f9518942bda41d11f0f04dad0811f2f9bfe","scripts":{"test":"bash test/run-all.sh","start":"CHEZSCHEMELIBDIRS=.. CHEZSCHEMELIBEXTS=.chezscheme.sls::.chezscheme.so:.ss::.so:.sls::.so:.scm::.so:.sch::.so:.sc::.so scheme --script test/run-otp.sc"},"_npmUser":{"name":"guenchi","email":"louis.deguenchy@gmail.com"},"repository":{"url":"git+https://github.com/guenchi/Igropyr.git","type":"git"},"_npmVersion":"11.5.2","description":"High-concurrency HTTP server framework for Chez Scheme on libuv: Erlang-style green processes, a Let-It-Crash worker pool, process-per-dialogue conversations, and s-expression RPC.","directories":{},"_nodeVersion":"23.7.0","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/igropyr_1.3.2_1787329559457_0.9268177264906821","host":"s3://npm-registry-packages-npm-production"}},"1.3.3":{"name":"igropyr","version":"1.3.3","keywords":["scheme","chez-scheme","r6rs","http","server","web-framework","libuv","actor-model","erlang","websocket"],"author":{"name":"guenchi"},"license":"MIT","_id":"igropyr@1.3.3","maintainers":[{"name":"guenchi","email":"louis.deguenchy@gmail.com"}],"homepage":"https://igropyr.dev","bugs":{"url":"https://github.com/guenchi/Igropyr/issues"},"dist":{"shasum":"075791c5079363827a8d540200deaf0fd087052c","tarball":"https://registry.npmjs.org/igropyr/-/igropyr-1.3.3.tgz","fileCount":174,"integrity":"sha512-z8wWXQkL5RSEOXkuBjQGM/gmPJJfyTd0VbfQMnU7t9V0FplF2Kp0I0MLngU+RTRIJtTKVIDClWEUUAmUINp1bw==","signatures":[{"sig":"MEUCIDtW0lpCeO+P6MMNGL0xjzBIhR1qg7zWFtRGnUgtmGJZAiEAwIwSJ3iTCWqBPfA+mhvKES0eUM9nh8sQu7RzTFIlcPo=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":3437416},"gitHead":"2c301a6ead4828a0c2bd03a3f860fa05f0549d46","scripts":{"test":"bash test/run-all.sh","start":"CHEZSCHEMELIBDIRS=.. CHEZSCHEMELIBEXTS=.chezscheme.sls::.chezscheme.so:.ss::.so:.sls::.so:.scm::.so:.sch::.so:.sc::.so scheme --script test/run-otp.sc"},"_npmUser":{"name":"guenchi","email":"louis.deguenchy@gmail.com"},"repository":{"url":"git+https://github.com/guenchi/Igropyr.git","type":"git"},"_npmVersion":"11.5.2","description":"High-concurrency HTTP server framework for Chez Scheme on libuv: Erlang-style green processes, a Let-It-Crash worker pool, process-per-dialogue conversations, and s-expression RPC.","directories":{},"_nodeVersion":"23.7.0","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/igropyr_1.3.3_1787368596768_0.23518437707441286","host":"s3://npm-registry-packages-npm-production"}},"1.5.0":{"name":"igropyr","version":"1.5.0","keywords":["scheme","chez-scheme","r6rs","http","server","web-framework","libuv","actor-model","erlang","websocket"],"author":{"name":"guenchi"},"license":"MIT","_id":"igropyr@1.5.0","maintainers":[{"name":"guenchi","email":"louis.deguenchy@gmail.com"}],"homepage":"https://igropyr.dev","bugs":{"url":"https://github.com/guenchi/Igropyr/issues"},"dist":{"shasum":"a0fddf52eaa2156a854eecc93664e822be26f9e3","tarball":"https://registry.npmjs.org/igropyr/-/igropyr-1.5.0.tgz","fileCount":180,"integrity":"sha512-KCskCY/ux0e2Ciukt8drfQlKksDeLI9Az2aTIwZto3Kvcx4ChERI53fB06fgGmVX7FaOGFabDpbmyhNdBxfECg==","signatures":[{"sig":"MEUCIQDV8MgET9wiJoKeXktX39g6wFrOpPF9AVwcvhkJWGIHtAIgMxDPQLKQNV3ARsiZnriaAa/R7kknsptWpsgTwhqvWzU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":3648345},"gitHead":"1a187a8a951937bd378e8a3e8f7dd9ad9766e5b2","scripts":{"test":"bash test/run-all.sh","start":"CHEZSCHEMELIBDIRS=.. CHEZSCHEMELIBEXTS=.chezscheme.sls::.chezscheme.so:.ss::.so:.sls::.so:.scm::.so:.sch::.so:.sc::.so scheme --script test/run-otp.sc"},"_npmUser":{"name":"guenchi","email":"louis.deguenchy@gmail.com"},"repository":{"url":"git+https://github.com/guenchi/Igropyr.git","type":"git"},"_npmVersion":"11.5.2","description":"High-concurrency HTTP server framework for Chez Scheme on libuv: Erlang-style green processes, a Let-It-Crash worker pool, process-per-dialogue conversations, and s-expression RPC.","directories":{},"_nodeVersion":"23.7.0","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/igropyr_1.5.0_1787869244306_0.860039621448399","host":"s3://npm-registry-packages-npm-production"}},"1.5.1":{"name":"igropyr","version":"1.5.1","keywords":["scheme","chez-scheme","r6rs","http","server","web-framework","libuv","actor-model","erlang","websocket"],"author":{"name":"guenchi"},"license":"MIT","_id":"igropyr@1.5.1","maintainers":[{"name":"guenchi","email":"louis.deguenchy@gmail.com"}],"homepage":"https://igropyr.dev","bugs":{"url":"https://github.com/guenchi/Igropyr/issues"},"dist":{"shasum":"aa44f4cf3f9facab62380ec847ed292a45f0a63b","tarball":"https://registry.npmjs.org/igropyr/-/igropyr-1.5.1.tgz","fileCount":184,"integrity":"sha512-8xGe0wp5fBPd5HTVmRPyxQytz+bQjWwMurcH+FxUhJHLTOtNGZ7GBjKrv+LaE2EwkKRVsHZMGAb3k0o/PKWNlg==","signatures":[{"sig":"MEUCIQDvWXqswkr87WQ1nRP9LZTr443/zp94nK/xtExVay6shwIgaEk9J7wVSOR7FiOC8SqLghIOgpITvLoadSq4bxEjjNY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":3875069},"gitHead":"7e1a4959368fa6719df61c35ab6708286469ab1b","scripts":{"test":"bash test/run-all.sh","start":"CHEZSCHEMELIBDIRS=.. CHEZSCHEMELIBEXTS=.chezscheme.sls::.chezscheme.so:.ss::.so:.sls::.so:.scm::.so:.sch::.so:.sc::.so scheme --script test/run-otp.sc"},"_npmUser":{"name":"guenchi","email":"louis.deguenchy@gmail.com"},"repository":{"url":"git+https://github.com/guenchi/Igropyr.git","type":"git"},"_npmVersion":"11.5.2","description":"High-concurrency HTTP server framework for Chez Scheme on libuv: Erlang-style green processes, a Let-It-Crash worker pool, process-per-dialogue conversations, and s-expression RPC.","directories":{},"_nodeVersion":"23.7.0","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/igropyr_1.5.1_1788035414390_0.053568819399234746","host":"s3://npm-registry-packages-npm-production"}},"1.5.2":{"name":"igropyr","version":"1.5.2","keywords":["scheme","chez-scheme","r6rs","http","server","web-framework","libuv","actor-model","erlang","websocket"],"author":{"name":"guenchi"},"license":"MIT","_id":"igropyr@1.5.2","maintainers":[{"name":"guenchi","email":"louis.deguenchy@gmail.com"}],"homepage":"https://igropyr.dev","bugs":{"url":"https://github.com/guenchi/Igropyr/issues"},"dist":{"shasum":"f7a707dba22421f87ad0bb6049de11303d63aa23","tarball":"https://registry.npmjs.org/igropyr/-/igropyr-1.5.2.tgz","fileCount":214,"integrity":"sha512-dqvrP7897+zFShgMaYSDjvStIcXSZpTkWnCfUTK4PnJROECfAFbRyPOzHW6lEBi1cC255gseLXvR1OeUSqYSpw==","signatures":[{"sig":"MEYCIQCtyC3WcUq83fH4c1XZHhWuHHl6jd2bxzO4b2oq/XL4nwIhANVCIPtI8OcEQE2SbrJD6NWr66rXiQVEsWAuDBCSlnUa","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":4926667},"gitHead":"4acf3f36ccc0d724371e1ed7dc070c23ec155bc8","scripts":{"test":"bash test/run-all.sh","start":"CHEZSCHEMELIBDIRS=.. CHEZSCHEMELIBEXTS=.chezscheme.sls::.chezscheme.so:.ss::.so:.sls::.so:.scm::.so:.sch::.so:.sc::.so scheme --script test/run-otp.sc"},"_npmUser":{"name":"guenchi","email":"louis.deguenchy@gmail.com"},"repository":{"url":"git+https://github.com/guenchi/Igropyr.git","type":"git"},"_npmVersion":"11.5.2","description":"High-concurrency HTTP server framework for Chez Scheme on libuv: Erlang-style green processes, a Let-It-Crash worker pool, process-per-dialogue conversations, and s-expression RPC.","directories":{},"_nodeVersion":"23.7.0","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/igropyr_1.5.2_1788491258936_0.7817312918485384","host":"s3://npm-registry-packages-npm-production"}},"1.6.0":{"name":"igropyr","version":"1.6.0","keywords":["scheme","chez-scheme","r6rs","http","server","web-framework","libuv","actor-model","erlang","websocket"],"author":{"name":"guenchi"},"license":"MIT","_id":"igropyr@1.6.0","maintainers":[{"name":"guenchi","email":"louis.deguenchy@gmail.com"}],"homepage":"https://igropyr.dev","bugs":{"url":"https://github.com/guenchi/Igropyr/issues"},"dist":{"shasum":"5c94ea0285b8ed7dc9040719890f7968a2f69cb1","tarball":"https://registry.npmjs.org/igropyr/-/igropyr-1.6.0.tgz","fileCount":222,"integrity":"sha512-8bvoi/Xs9mVm//t4hw/mjEQ7Y5aL98rmJCHr7pRBDXoiUPGzeo4RX70i5fbWtZEe1xK7ZSIk9BTl+V8ugTq9zw==","signatures":[{"sig":"MEUCIQDjLabuuHvJgR1Yh5dGXxNPknIODnQ99WNa5dIPrgtSdgIgU9cmxjIP9PXsmJE13vF112ZTguhP8L8otNbd/NzFJ4Y=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":5047539},"gitHead":"b2415e92015674c53db37fd8a1edadb945d23272","scripts":{"test":"bash test/run-all.sh","start":"CHEZSCHEMELIBDIRS=.. CHEZSCHEMELIBEXTS=.chezscheme.sls::.chezscheme.so:.ss::.so:.sls::.so:.scm::.so:.sch::.so:.sc::.so scheme --script test/run-otp.sc"},"_npmUser":{"name":"guenchi","email":"louis.deguenchy@gmail.com"},"repository":{"url":"git+https://github.com/guenchi/Igropyr.git","type":"git"},"_npmVersion":"11.5.2","description":"High-concurrency HTTP server framework for Chez Scheme on libuv: Erlang-style green processes, a Let-It-Crash worker pool, process-per-dialogue conversations, and s-expression RPC.","directories":{},"_nodeVersion":"23.7.0","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/igropyr_1.6.0_1788676530253_0.10295346492430024","host":"s3://npm-registry-packages-npm-production"}},"1.7.0":{"name":"igropyr","version":"1.7.0","keywords":["scheme","chez-scheme","r6rs","http","server","web-framework","libuv","actor-model","erlang","websocket"],"author":{"name":"guenchi"},"license":"Apache-2.0","_id":"igropyr@1.7.0","maintainers":[{"name":"guenchi","email":"louis.deguenchy@gmail.com"}],"homepage":"https://igropyr.dev","bugs":{"url":"https://github.com/guenchi/Igropyr/issues"},"dist":{"shasum":"748eba92d1fa200eccc1079927cdef4fa1cab6c9","tarball":"https://registry.npmjs.org/igropyr/-/igropyr-1.7.0.tgz","fileCount":258,"integrity":"sha512-EEgd+Q+a8d1Qol3Z2TyMNhd6vzbJztqX9RyZonJ0twSmehqZgsz8pq4fz04UiHn4qrzmb015cSZF/7rRh9lwsg==","signatures":[{"sig":"MEUCIE3xkZgu9EEJrZTiJstVRwFfdpaoq00xPNnS8IJVF+YOAiEA2KPmo/KoY1asuyeapwEmiDXzjpZ7xeTkBXKTUworf4E=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":5612237},"gitHead":"05e3789561f77755e2afac84da76a766f5f5d509","scripts":{"test":"bash test/run-all.sh","start":"CHEZSCHEMELIBDIRS=.. CHEZSCHEMELIBEXTS=.chezscheme.sls::.chezscheme.so:.ss::.so:.sls::.so:.scm::.so:.sch::.so:.sc::.so scheme --script test/run-otp.sc"},"_npmUser":{"name":"guenchi","email":"louis.deguenchy@gmail.com"},"repository":{"url":"git+https://github.com/guenchi/Igropyr.git","type":"git"},"_npmVersion":"11.5.2","description":"High-concurrency HTTP server framework for Chez Scheme on libuv: Erlang-style green processes, a Let-It-Crash worker pool, process-per-dialogue conversations, and s-expression RPC.","directories":{},"_nodeVersion":"23.7.0","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/igropyr_1.7.0_1789104512034_0.42202048422053373","host":"s3://npm-registry-packages-npm-production"}},"1.7.1":{"name":"igropyr","version":"1.7.1","keywords":["scheme","chez-scheme","r6rs","http","server","web-framework","libuv","actor-model","erlang","websocket"],"author":{"name":"guenchi"},"license":"Apache-2.0","_id":"igropyr@1.7.1","maintainers":[{"name":"guenchi","email":"louis.deguenchy@gmail.com"}],"homepage":"https://igropyr.dev","bugs":{"url":"https://github.com/guenchi/Igropyr/issues"},"dist":{"shasum":"13d17faf47dfa6a41305635ae2c57e85c8e56ed4","tarball":"https://registry.npmjs.org/igropyr/-/igropyr-1.7.1.tgz","fileCount":259,"integrity":"sha512-CbXhSoXTg3ULufX/36XLnhFCGT224vqEu/WZdRoB7Q8UAixa7bkybJOZ5utJsk68aK+aMfzx+5kWSJwV+lxf5w==","signatures":[{"sig":"MEYCIQCwzk9kg39EtAYr/BiAIyKFDURf3m1F1NZJryIu/z7jqAIhALQ7ULlIGrHxKeEamgNPu26kEWkXXQ492d2NLkw4Le+x","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":5625218},"gitHead":"772031d83d68299839e805aee31239a89effb66b","scripts":{"test":"bash test/run-all.sh","start":"CHEZSCHEMELIBDIRS=.. CHEZSCHEMELIBEXTS=.chezscheme.sls::.chezscheme.so:.ss::.so:.sls::.so:.scm::.so:.sch::.so:.sc::.so scheme --script test/run-otp.sc"},"_npmUser":{"name":"guenchi","email":"louis.deguenchy@gmail.com"},"repository":{"url":"git+https://github.com/guenchi/Igropyr.git","type":"git"},"_npmVersion":"11.5.2","description":"High-concurrency HTTP server framework for Chez Scheme on libuv: Erlang-style green processes, a Let-It-Crash worker pool, process-per-dialogue conversations, and s-expression RPC.","directories":{},"_nodeVersion":"23.7.0","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/igropyr_1.7.1_1789179438619_0.34065816223298695","host":"s3://npm-registry-packages-npm-production"}},"1.8.0":{"name":"igropyr","version":"1.8.0","keywords":["scheme","chez-scheme","r6rs","http","server","web-framework","libuv","actor-model","erlang","websocket"],"author":{"name":"guenchi"},"license":"Apache-2.0","_id":"igropyr@1.8.0","maintainers":[{"name":"guenchi","email":"louis.deguenchy@gmail.com"}],"homepage":"https://igropyr.dev","bugs":{"url":"https://github.com/guenchi/Igropyr/issues"},"dist":{"shasum":"30f09bfc726fc0eb0d54669f3fe3eddd5ddc2d80","tarball":"https://registry.npmjs.org/igropyr/-/igropyr-1.8.0.tgz","fileCount":268,"integrity":"sha512-N7FPS8sppRwnF/HBqS8MPL2dQuZu51w+QWPivbDqLcuaGfcK6rFU4nGfPXffSatzeEt7sMW0iBcZ+EF7lI9ucg==","signatures":[{"sig":"MEYCIQC6Zp92M1scNWJ5MZd7JPKvfECdQJ+oI1JNtsAa97J+FwIhAJuCsahvH+p1qTZYZr5xp6ts74zq9O5rWwrr0FrwvlqY","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEYCIQC4ekvasjsNjbhfBNlknBYVQu/qjzFWGXWOcOdGVuz/EgIhAKTZH2EHv6UxgX1Ow2buPHDXvDhgVNUq15LcpqzOkBtA","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":5857515},"gitHead":"f5a9679485fbf4ac87abd91f9dced4970aa06b24","scripts":{"test":"bash test/run-all.sh","start":"CHEZSCHEMELIBDIRS=.. CHEZSCHEMELIBEXTS=.chezscheme.sls::.chezscheme.so:.ss::.so:.sls::.so:.scm::.so:.sch::.so:.sc::.so scheme --script test/run-otp.sc"},"_npmUser":{"name":"guenchi","email":"louis.deguenchy@gmail.com"},"repository":{"url":"git+https://github.com/guenchi/Igropyr.git","type":"git"},"_npmVersion":"11.5.2","description":"High-concurrency HTTP server framework for Chez Scheme on libuv: Erlang-style green processes, a Let-It-Crash worker pool, process-per-dialogue conversations, and s-expression RPC.","directories":{},"_nodeVersion":"23.7.0","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/igropyr_1.8.0_1790460802904_0.5996409498846096","host":"s3://npm-registry-packages-npm-production"}},"1.8.1":{"name":"igropyr","version":"1.8.1","keywords":["scheme","chez-scheme","r6rs","http","server","web-framework","libuv","actor-model","erlang","websocket"],"author":{"name":"guenchi"},"license":"Apache-2.0","_id":"igropyr@1.8.1","maintainers":[{"name":"guenchi","email":"louis.deguenchy@gmail.com"}],"homepage":"https://igropyr.dev","bugs":{"url":"https://github.com/guenchi/Igropyr/issues"},"dist":{"shasum":"2492016febb71aecff679e84442b67099f456ef4","tarball":"https://registry.npmjs.org/igropyr/-/igropyr-1.8.1.tgz","fileCount":268,"integrity":"sha512-WiebPxXB4AoZapCSm3JX3ufeh7LCkIO7x5eT2QOLU9w16P1OzClhLeaQb39waqXW5iIvB+S0vwHMnShFxiZUlw==","signatures":[{"sig":"MEQCICiPsIQgLUB/o494F76F3J7JzHHdCFhVW+SOqSeTLWJRAiAQ3+5QSgcuZDFByzmk8H0Ah2hrCyNUO9f8vb0D9pVmXQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIHL+il+hF6UGHLDY1YAyObQ4Xhd9U9cMMwDWQBIKcDZBAiEA7SEcqD0ibKf+VYAH7BtZzLPPpnjBS3i6dvH1Ow9PhIE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":5873494},"gitHead":"8db79ad78fedcc4accac7435b582e478418dafc8","scripts":{"test":"bash test/run-all.sh","start":"CHEZSCHEMELIBDIRS=.. CHEZSCHEMELIBEXTS=.chezscheme.sls::.chezscheme.so:.ss::.so:.sls::.so:.scm::.so:.sch::.so:.sc::.so scheme --script test/run-otp.sc"},"_npmUser":{"name":"guenchi","email":"louis.deguenchy@gmail.com"},"repository":{"url":"git+https://github.com/guenchi/Igropyr.git","type":"git"},"_npmVersion":"11.5.2","description":"High-concurrency HTTP server framework for Chez Scheme on libuv: Erlang-style green processes, a Let-It-Crash worker pool, process-per-dialogue conversations, and s-expression RPC.","directories":{},"_nodeVersion":"23.7.0","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/igropyr_1.8.1_1790509696653_0.23048369864559493","host":"s3://npm-registry-packages-npm-production"}},"1.8.2":{"_id":"igropyr@1.8.2","bugs":{"url":"https://github.com/guenchi/Igropyr/issues"},"dist":{"shasum":"638828aa542cfb639c5111350be83f3754c842ea","tarball":"https://registry.npmjs.org/igropyr/-/igropyr-1.8.2.tgz","fileCount":270,"integrity":"sha512-LyBoXDv2UHe9zsovJZvkSSg8vxf4twDcbwmkidAM315gvWYFsyEuITU10mhYETOwBZ/nju3UlaWiNHmz27lgkQ==","signatures":[{"sig":"MEQCIAuN0p71wTCXNV4yDIzEX5JNm8UqGqn1GGg0XGmxz+53AiBZPJobeJqE3x7GFMxW9/wtAR2xm4chLxYuwC00ZLs8nQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEQCIEkhrGvQF2tKnlT0GyHmtI/DakOr1l+Q5jOtcLfoSwN8AiAI9jB3s09AkE3I2nKolNmQETW7wOsZbpTlhS0hQJGBeA=="}],"unpackedSize":5894599},"name":"igropyr","author":{"name":"guenchi"},"gitHead":"1ef294c261121e6f98c8e8f500c90ac2aae5edc9","license":"Apache-2.0","scripts":{"test":"bash test/run-all.sh","start":"CHEZSCHEMELIBDIRS=.. CHEZSCHEMELIBEXTS=.chezscheme.sls::.chezscheme.so:.ss::.so:.sls::.so:.scm::.so:.sch::.so:.sc::.so scheme --script test/run-otp.sc"},"version":"1.8.2","_npmUser":{"name":"guenchi","email":"louis.deguenchy@gmail.com"},"homepage":"https://igropyr.dev","keywords":["scheme","chez-scheme","r6rs","http","server","web-framework","libuv","actor-model","erlang","websocket"],"repository":{"url":"git+https://github.com/guenchi/Igropyr.git","type":"git"},"_npmVersion":"11.5.2","description":"High-concurrency HTTP server framework for Chez Scheme on libuv: Erlang-style green processes, a Let-It-Crash worker pool, process-per-dialogue conversations, and s-expression RPC.","directories":{},"maintainers":[{"name":"guenchi","email":"louis.deguenchy@gmail.com"}],"_nodeVersion":"23.7.0","_hasShrinkwrap":false,"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/igropyr_1.8.2_1790976816971_0.2857650256075597"}}},"time":{"created":"2026-07-12T13:20:45.682Z","modified":"2026-10-02T21:33:37.265Z","1.0.0":"2026-07-12T13:20:45.878Z","1.0.1":"2026-07-12T14:07:43.448Z","1.0.2":"2026-07-13T06:52:25.056Z","1.0.3":"2026-07-13T09:46:06.919Z","1.1.0":"2026-07-13T12:43:33.626Z","1.1.1":"2026-07-13T20:20:11.873Z","1.1.2":"2026-07-14T08:47:08.959Z","1.1.3":"2026-07-14T10:31:11.992Z","1.1.5":"2026-07-15T03:23:57.570Z","1.1.6":"2026-07-16T08:40:16.505Z","1.1.7":"2026-07-16T10:01:12.478Z","1.1.8":"2026-07-16T12:37:04.844Z","1.1.9":"2026-07-17T00:53:28.295Z","1.1.10":"2026-07-17T17:33:16.767Z","1.1.11":"2026-07-18T02:59:52.698Z","1.1.12":"2026-07-18T03:02:08.351Z","1.1.13":"2026-07-18T03:03:24.107Z","1.1.15":"2026-07-18T03:57:05.803Z","1.1.16":"2026-07-19T10:57:54.267Z","1.1.17":"2026-07-19T18:57:25.592Z","1.1.18":"2026-07-20T20:01:12.662Z","1.1.19":"2026-07-21T12:48:34.717Z","1.1.20":"2026-07-23T12:17:56.817Z","1.2.1":"2026-07-25T00:57:13.610Z","1.2.2":"2026-07-26T02:55:31.601Z","1.2.3":"2026-07-31T03:49:34.791Z","1.2.5":"2026-07-31T22:26:05.521Z","1.2.6":"2026-08-03T03:05:19.291Z","1.2.7":"2026-08-07T02:26:18.105Z","1.2.8":"2026-08-13T18:23:06.380Z","1.2.9":"2026-08-18T03:49:40.429Z","1.3.0":"2026-08-18T23:24:35.247Z","1.3.1":"2026-08-19T03:00:36.252Z","1.3.2":"2026-08-21T16:25:59.654Z","1.3.3":"2026-08-22T03:16:36.966Z","1.5.0":"2026-08-27T22:20:44.479Z","1.5.1":"2026-08-29T20:30:14.553Z","1.5.2":"2026-09-04T03:07:39.145Z","1.6.0":"2026-09-06T06:35:30.440Z","1.7.0":"2026-09-11T05:28:32.242Z","1.7.1":"2026-09-12T02:17:18.837Z","1.8.0":"2026-09-26T22:13:23.036Z","1.8.1":"2026-09-27T11:48:16.785Z","1.8.2":"2026-10-02T21:33:37.105Z"},"bugs":{"url":"https://github.com/guenchi/Igropyr/issues"},"author":{"name":"guenchi"},"license":"Apache-2.0","homepage":"https://igropyr.dev","keywords":["scheme","chez-scheme","r6rs","http","server","web-framework","libuv","actor-model","erlang","websocket"],"repository":{"url":"git+https://github.com/guenchi/Igropyr.git","type":"git"},"description":"High-concurrency HTTP server framework for Chez Scheme on libuv: Erlang-style green processes, a Let-It-Crash worker pool, process-per-dialogue conversations, and s-expression RPC.","maintainers":[{"name":"guenchi","email":"louis.deguenchy@gmail.com"}],"readme":"# Igropyr\n\nA distributed, fault-tolerant, high-concurrency backend framework with continuation-based web programming and a remote retry ring, built on [Chez Scheme](https://scheme.com/).\n\n**[igropyr.dev](https://igropyr.dev)** · **[Manual](https://igropyr.dev/manual.html)** · **[Changelog](https://igropyr.dev/changelog.html)**\n\n- **Core / framework split, like Node and Express** — the core exposes one\n  entry point, `(http-listen port (lambda (req res) ...))`; the bundled\n  `(igropyr express)` layer (`create-app`, `app-get`, `send-json!`, ...) is\n  optional, and alternative frameworks can be built on the same core\n- **Green processes** — thousands of lightweight processes scheduled over one\n  OS thread; continuation-based context switching with preemption, so even a\n  CPU-spinning handler cannot freeze the system\n- **Pure message passing** — `spawn` / `send` / `receive` / `link` / `monitor`;\n  no shared state between processes\n- **Fault tolerant by default** — a fixed worker pool behind a supervisor:\n  crashed workers are replaced and the task retried (at most 3 times, then\n  the client gets a 500); workers stuck for more than 30 s are killed and\n  replaced; a slow or half-sent request only ever blocks its own reader process\n- **Failure hook (remote retry ring)** — when retries are exhausted or a\n  stuck worker is killed (killed first, so no execution is in flight), an\n  optional `on-failure` handler answers a structured JSON fault instead\n  of the plain 500, on the same keep-alive connection — the client\n  resubmits (changed parameters, carried state) and gets a fresh retry\n  round; unset, the plain 500 remains\n- **Conversations (process-per-dialogue)** — a multi-request dialogue\n  (wizard, booking, transfer) runs as one green process holding live\n  state — even an open database transaction — across rounds; `suspend!`\n  answers and parks, `conversation-resume!` continues with a token\n  naming the reply it answers, so a repeat replays that answer instead\n  of taking a step nobody asked for. Failure speaks a protocol — six\n  outcomes, each naming its evidence and its remedy: the answer itself\n  when it finished, retry only on `gone` (the rollback provably ran),\n  the replay on `stale`, reconcile on `unknown` and `unreachable`, come\n  back later on `overloaded`. The record outlives the process, so a\n  restart does not turn history into `unknown`\n- **Hot code swapping** — replace the handler (or individual routes) on a\n  live server: the listener, open connections and worker pool stay up,\n  in-flight requests finish on the old code\n- **WebSocket** — RFC 6455 upgrade on the same port; each socket is its own\n  green process, so server push is just a message send. Upgrades can be\n  guarded before the handshake — `app-ws` takes an optional auth guard, so\n  an unauthenticated peer never gets a socket\n- **Streaming responses & SSE** — chunked response body via\n  `res-begin!`/`res-write!`/`res-end!`; Server-Sent Events helpers on top\n- **OTP building blocks** — `gen-server` (call/cast/info), a process\n  registry (`register`/`whereis`), and topic PubSub with automatic\n  cleanup of dead subscribers\n- **JSON** — a safe recursive-descent parser (no `read`; full escape and\n  surrogate handling) and writer\n- **Forms & cookies** — `req-form` parses urlencoded and multipart bodies\n  (file uploads included); `req-cookie` / `set-cookie!`\n- **Middleware suite** — cookie sessions (gen-server store, CSPRNG sids),\n  CORS with preflight, security headers, and an access logger\n- **Authentication** — `(igropyr auth)` is the format-neutral *auth role*.\n  The `auth` middleware guards HTTP routes with a `Bearer` token (any\n  verifier — `(jwt-verifier key)` today — 401 otherwise), `token-guard` /\n  `session-guard` guard WebSocket upgrades before the handshake, and\n  `app-rpc` takes a guard like the WebSocket one. **The shapes differ and\n  none of them is interchangeable**: `auth` and `token-guard` take a\n  *token verifier* `(lambda (token) …)`; `app-ws` and `app-rpc` take a\n  *request guard* `(lambda (req) …)`; `app-use` and `admin-listen`'s\n  `auth` option take *middleware* `(lambda (req res next))`, which is what\n  `auth` returns. All are procedures, so the wrong one is installed\n  without complaint and fails on the first request that reaches it. And\n  these are separate doors: guarding one is not guarding another, nor does\n  any of it reach an app you built yourself with a second `app-listen` /\n  `admin-listen`, or a raw `http-listen`.\n  `session-guard` takes an `origins` allow-list:\n  the same-origin policy does not cover WebSockets and the browser attaches\n  the session cookie whatever page opened the socket, so that list is what\n  keeps a hostile page from holding an authenticated session. Browser\n  origins fail closed until the application configures the list; clients\n  without an Origin header remain supported\n- **JWT and JWS** — `(igropyr jwt)` signs and verifies HS256 tokens (algorithm\n  pinned, constant-time compare, strict base64url, fail-closed), the\n  credential format plugged into `(igropyr auth)`; `(igropyr jwks)` signs\n  RS256 and verifies against a fetched JWKS; `(igropyr apple-jws)` verifies\n  x5c-signed JWS (App Store Server notifications) with OpenSSL path\n  validation to a pinned root. All three refuse a header carrying `crit`\n- **Password hashing** — `(igropyr kdf)` derives and verifies passwords\n  over libcrypto (PBKDF2-HMAC-SHA256, scrypt, argon2id) with\n  self-describing hashes, so an app can migrate algorithms on login;\n  a verify-time cost ceiling keeps a crafted stored hash from stalling\n  the single-threaded scheduler. `(igropyr crypto)` exposes the\n  primitives underneath (SHA-1/256, HMAC, base64, hex)\n- **Chunked transfer-encoding** — `Transfer-Encoding: chunked` request\n  bodies are decoded transparently\n- **Non-blocking Redis, MySQL and PostgreSQL clients** — pure Scheme,\n  same event loop; callers park their green process while the OS thread\n  keeps serving. MySQL and PostgreSQL share a self-healing connection\n  pool; the PostgreSQL client authenticates with SCRAM-SHA-256, upgrades\n  to optional TLS (`(igropyr tls)`, certificate verified, automatic\n  channel binding via SCRAM-SHA-256-PLUS), and offers\n  both the simple query protocol and the extended protocol with\n  server-side parameter binding (`$1..$n`, injection impossible)\n- **Non-blocking HTTP & WebSocket clients** — outbound `http-get` /\n  `http-post` and `ws-connect`, both with async DNS (libuv thread pool)\n  and the same park-the-caller model; `https://` via the optional\n  `(igropyr tls)` library (OpenSSL as a byte codec, certificates verified —\n  the core stays dependency-free). Outbound `wss://` is not supported\n- **Static file serving** — hot files come from an in-memory cache (a\n  hashtable lookup: no disk read, no `stat` syscall; mtime re-checked at\n  most once a second). A cache miss opens the file beneath its root with\n  `openat`, one component at a time and never following a symlink, then\n  reads it on libuv's thread pool; files over 1 MiB stream in bounded\n  chunks with backpressure, never read whole\n- **gzip compression** — responses negotiated via `Accept-Encoding`;\n  static files cache their compressed form\n- **S3 object storage & AWS service clients** — `(igropyr sigv4)` signs\n  requests (AWS Signature V4, pinned by the AWS documented test vectors);\n  `(igropyr s3)` speaks the S3 REST API over the HTTP client (put / get /\n  head / server-side copy / delete / paginated list / restore — AWS S3,\n  Cloudflare R2, MinIO); `(igropyr sts)` vends scoped temporary\n  credentials (GetFederationToken), `(igropyr ses)` sends email\n  (SES v2), `(igropyr sns)` fans a message out to a topic's\n  subscribers (SNS Publish) and `(igropyr cloudwatch)` publishes a\n  custom metric data point (CloudWatch PutMetricData), all over the\n  same non-blocking signer\n- **Vector scoring for embedding search** — `(igropyr blas)`: one call\n  scores a query against a row-major float32 matrix at memory bandwidth\n  (Accelerate / OpenBLAS via FFI), with a pure-Scheme fallback so it\n  runs — slower but correct — on hosts with no BLAS at all\n- **Embedded JavaScript** — `(igropyr quickjs)` runs a fixed JS bundle\n  in-process via QuickJS (memory/stack/time capped, crash-only rebuild);\n  user input is data, never code\n- **Cached server-side rendering** — `(igropyr ssr)` runs a baked JS\n  render bundle through QuickJS behind a key/TTL cache, so the blocking\n  render fires once per (key, ttl) instead of once per request; memory\n  or shared-Redis backend, with single-flight collapse of a cold-key\n  herd to a single render\n- **Ops-ready** — rate limiting, a global error handler, metrics as\n  Prometheus / JSON / sexpr with app-defined business counters\n  (`metrics-count!`), and a self-contained browser dashboard with a\n  cluster view on a loopback-by-default admin port\n- **Runtime introspection & graceful shutdown** — `http-stats` (live\n  connection/request/pool counters), `http-shutdown!` (drain in-flight\n  requests, refuse new connections)\n- **Multi-process scaling** — `SO_REUSEPORT` bind option for\n  kernel-balanced multi-process listening on Linux (pair with\n  pm2 or systemd)\n- **OS signals as messages** — `signal-watch!` delivers `SIGHUP`, `SIGTERM`,\n  `SIGUSR1`, `SIGUSR2` and `SIGWINCH` to a green process as\n  `#(signal SIGTERM)`, from the event loop, with no polling; the signals whose\n  disposition the runtime depends on (`SIGPIPE`, `SIGINT`, `SIGQUIT`, the\n  fault signals) are refused\n- **Unix-domain sockets** — `pipe-listen!` / `pipe-connect!` hand over the\n  same connections as TCP, so the read, write and close calls are unchanged\n- **Distributed actors** — connect nodes into a mesh (`(igropyr node)`):\n  `rsend`/`rcall` to a process registered on another node,\n  `monitor-node`/`monitor-remote`, cluster-wide PubSub, a distributed\n  task pool (`(igropyr dpool)`), and automatic discovery (`(igropyr\n  cluster)`, static, gossip, or Redis — gossip is decentralized\n  membership over the node links themselves: configure a few seed\n  addresses and every other member's address arrives inside the records)\n- **S-expression RPC** — when both ends are Scheme, `(igropyr sexpr)` is\n  a safe whitelisted codec (no `read`, depth-limited); `app-rpc` /\n  `send-sexpr!` / `ws-send-sexpr!` carry one datum per message. Its\n  extended wire mode — used by the node-to-node links and by browser\n  clients ([Goeteia](https://goeteia.dev)) — carries vectors, bytevectors\n  (`#vu8\"…\"`, base64) and **every IEEE double bit-exact** (`#f8\"…\"`, the\n  8 IEEE-754 bytes; inf and nan included), so binary and floats cross\n  Chez ↔ WebAssembly with no loss and no decimal-printing rounding\n- **HTTP/1.1 keep-alive & pipelining** — persistent connections by default\n  on 1.1; each connection's reader process loops over successive requests\n- **Dev-time contracts** — `(igropyr checked)` adds `define-checked` /\n  `define-checked-record` for internal invariants, gated on\n  `IGROPYR_CONTRACTS` at compile time: `off` (the default) compiles to\n  nothing with zero residue, `full` injects checks that blame the\n  offending procedure/argument. The bundled libraries carry boundary\n  contracts on their exports under a debug build\n- **Fast** — ~35 k req/s at 500 concurrent connections on an Apple Silicon\n  laptop (`ab -n 50000 -c 500`, zero failed requests)\n\n## Architecture\n\nA layered stack, each layer a thin surface over the one below:\n\n- **`(igropyr express)`** — routing, middleware, and the `req-*` / `send-*!`\n  request and response helpers; optional, and alternative frameworks can be\n  built on the core.\n- **HTTP core + WebSocket** — HTTP/1.1 parsing, keep-alive and pipelining,\n  chunked bodies, and the RFC 6455 upgrade.\n- **Actor scheduler** — thousands of green processes over one OS thread,\n  continuation-based context switches with preemption; `spawn` / `send` /\n  `receive` / `link` / `monitor`, no shared state.\n- **libuv FFI** — one event loop, reached through Chez's FFI (no C shim);\n  DNS, file reads and socket I/O park the calling process, never the thread.\n\nFault tolerance is a **supervised worker pool**: a crashed worker is replaced\nand its task retried (at most 3 times, then a 500); a worker stuck past 30 s\nis killed and replaced; a slow request only ever blocks its own reader\nprocess. `gen-server`, `link` / `monitor` and topic PubSub are the OTP\nbuilding blocks — isolation is by process, not by locks.\n\nFor the actor model, the libuv-callback invariant, and contribution\nguidelines, see [the manual](https://igropyr.dev/manual.html).\n\n## Requirements\n\n- Chez Scheme 9.5.8 or newer\n- libuv 1.x\n- zlib 1.x\n- macOS or Linux on x86_64/arm64\n\n```sh\nbrew install chezscheme libuv        # macOS\n# apt install chezscheme libuv1-dev zlib1g-dev  # Debian/Ubuntu\n```\n\nIgropyr selects the platform ABI and loads libuv, zlib, and the system C\nlibrary automatically; on macOS, libuv is looked for under both Homebrew\nprefixes, `/opt/homebrew` (Apple silicon) and `/usr/local` (x86_64).\nSupported Chez machine types are macOS, Linux and FreeBSD on x86_64 and\narm64; an unsupported host fails at import time with a clear error.\n\n### Portability\n\nChez Scheme is a requirement, not a preference: the actor runtime is\nbuilt directly on Chez compiler internals that have no counterpart in\nGambit, Loko, Guile or other Scheme implementations, so the lower\nlayers do not port.\n\n- `#%$current-winders` — reads and swaps the `dynamic-wind` winder\n  stack. Each green process carries its own winder chain, and \"kill\n  discards winders\" is a semantic the whole library leans on:\n  conversation's `on-killed`, connpool's broken check-in and durable's\n  fd release are all built against it.\n- `#%$current-stack-link` / `#%$null-continuation` — cut the stack\n  chain when a new process starts.\n- `current-exception-state` / `create-exception-state` — a per-process\n  exception-state object, swapped on every context switch.\n- `set-timer` and the timer-interrupt handler — Chez's engine ticks,\n  the basis of preemptive scheduling.\n- The FFI — `foreign-procedure`, `foreign-alloc`, `lock-object` — and\n  helpers such as `procedure-arity-mask` are Chez's shapes throughout.\n\nPorting to another implementation would mean rebuilding the scheduler\non that engine's own internals, not porting this one.\n\n## Getting started\n\nClone the repository into a directory named `igropyr` (the R6RS library name\nis lowercase; on case-sensitive file systems the directory name must match):\n\n```sh\ngit clone https://github.com/guenchi/Igropyr igropyr\nexport CHEZSCHEMELIBDIRS=.\nexport CHEZSCHEMELIBEXTS=.chezscheme.sls::.chezscheme.so:.ss::.so:.sls::.so:.scm::.so:.sch::.so:.sc::.so\nscheme --script igropyr/test/run-otp.sc   # `chez` also works on some distros\n```\n\nThen:\n\n```sh\ncurl localhost:8080/\ncurl localhost:8080/users/42?verbose=1\ncurl -X POST -d 'hello' localhost:8080/echo\n```\n\n## Writing an application\n\nWith the bundled Express-style layer. `(igropyr http)` is the core and\nre-exports the app-facing actor surface (`start-scheduler`, `spawn`,\n`receive`, ...); express, websocket and the other batteries plug in on\ndemand:\n\n```scheme\n(import (chezscheme)\n        (igropyr http)\n        (igropyr express))\n\n(define app (create-app))\n\n;; routes: GET/POST/PUT/DELETE, :param path segments\n(app-get app \"/hello/:name\"\n  (lambda (req res)\n    (send-text! res (string-append \"hello \" (req-param req \"name\")))))\n\n(app-post app \"/api/data\"\n  (lambda (req res)\n    (send-json! res (list (cons \"received\" (utf8->string (req-body req)))))))\n\n;; middleware: call (next) to continue the chain\n(app-use app\n  (lambda (req res next)\n    (if (req-header req 'authorization)\n        (next)\n        (begin (set-status! res 403) (send-text! res \"Forbidden\")))))\n\n;; static files: /assets/style.css -> ./public/style.css. Files are read\n;; once and cached in memory (re-read only when their mtime changes; the\n;; mtime itself is re-checked at most once per second), so serving a hot\n;; asset is a hashtable lookup -- no disk read, no stat syscall.\n;; Responses carry a weak ETag and Cache-Control, and a matching\n;; If-None-Match gets 304 Not Modified. Files over 1 MiB are never\n;; buffered whole: they stream as a fixed-length response in 64 KiB\n;; chunks with backpressure -- each chunk is read from disk only after\n;; the previous one drained to the client, so a 10 GB download to a\n;; slow peer costs one chunk of memory, and the pool worker is released\n;; immediately (the pump runs in its own process). Path components are\n;; opened atomically beneath the root without following symlinks. The\n;; cache is bounded to 4096 entries and 64 MiB, including cached gzip\n;; representations, and is keyed by the name the OS resolves to -- so on\n;; a case-insensitive filesystem the many spellings of one file share one\n;; entry instead of letting a caller mint an entry per spelling. Both\n;; ceilings are adjustable: (static-cache-limits! entries bytes), #f to\n;; leave either.\n(app-static app \"/assets\" \"./public\")\n\n;; enter the scheduler and listen; never returns\n(start-scheduler\n  (lambda ()\n    (app-listen app 8080 8)))   ; port 8080, 8 workers (default 8)\n```\n\nThe pool and its fault tolerance are configurable — pass an alist instead\nof the worker count (any key may be omitted; values below are the\ndefaults):\n\n```scheme\n(app-listen app 8080\n  '((workers . 8)         ; pool size\n    (max-retries . 3)     ; crash retries per task, then 500\n    (stuck-ms . 30000)    ; busy longer than this => killed & replaced\n    (check-ms . 5000)))   ; how often the ticker checks for stuck workers\n```\n\n### Request accessors\n\n| Procedure | Result |\n|---|---|\n| `(req-method req)` | method symbol: `GET`, `POST`, ... |\n| `(req-path req)` | decoded path string |\n| `(req-param req \"id\")` | `:param` path segment value, or `#f` |\n| `(req-query req)` | query string as an alist of strings |\n| `(req-header req 'content-type)` | header value (keys are lowercase symbols), or `#f` |\n| `(req-body req)` | request body as a bytevector |\n| `(req-local req key)` | value stashed on this request by earlier middleware, or `#f` |\n| `(req-set-local! req key val)` | stash a value for later middleware and the handler |\n\n`req-local` is how middleware hands something to the handler — a session, an\nauthenticated user, a tenant. Use it rather than a `parameterize`d global:\nparameters do **not** isolate concurrent requests here, for the reason in\n[Dynamic state and `parameterize`](#dynamic-state-and-parameterize).\n\n### Response helpers\n\nSet status and extra headers first, then send exactly once:\n\n```scheme\n(set-status! res 201)               ; core primitive\n(set-header! res \"X-Request-Id\" \"abc\")\n(send-text! res \"created\")     ; text/plain        (express)\n(send-html! res \"<h1>hi</h1>\") ; text/html         (express)\n(send-json! res obj)           ; alist (string keys) -> object,\n                               ; vector -> array              (express)\n(send-file! res \"path/to/f\")   ; MIME type from extension       (express)\n```\n\nA second send on the same request is ignored, so a supervisor fallback can\nnever corrupt a response that already went out.\n\nEvery encoder also accepts a bytevector, taken as the already-encoded\nbody. For a response that never changes, do the encoding **once at\nstartup with `define`** instead of re-encoding the same constant on\nevery request — the handler then just hands the framework a pointer:\n\n```scheme\n(define home-page (string->utf8 \"<h1>hi</h1>\"))          ; encoded once\n(define info-json (string->utf8 (json->string my-alist))) ; serialized once\n\n(app-get app \"/\"     (lambda (req res) (send-html! res home-page)))\n(app-get app \"/info\" (lambda (req res) (send-json! res info-json)))\n```\n\nThe same applies to anything derivable at startup (rendered templates,\nlookup tables, composed strings): compute it in a `define` at top level,\nnot inside the handler.\n\n## The core API (build your own framework)\n\nThe core is framework-agnostic, like Node's `http` module: it owns\nparsing, connections, the worker pool and response encoding, and takes a\nsingle handler. It re-exports the app-facing actor surface, so it is a\nsingle import too. Everything express does is expressible in user space:\n\n```scheme\n(import (chezscheme) (igropyr http))\n\n(start-scheduler\n  (lambda ()\n    (http-listen 8080\n      (lambda (req res)\n        (case (req-method req)\n          ((GET)\n           (set-header! res \"Content-Type\" \"text/plain\")\n           (res-send! res (string->utf8 (req-path req))))\n          (else\n           (set-status! res 405)\n           (res-send! res (string->utf8 \"Method Not Allowed\"))))))))\n```\n\nCore primitives: `set-status!`, `set-header!`, `res-send!` (body\nbytevector; Content-Length, Connection and the one-shot guard are handled\nfor you). Request accessors as above, minus `req-param` (route params are\na framework concern; the core request carries a free `req-params` slot\nfor layers to use). The fault-tolerance semantics below come with the\ncore, whatever layer you put on top.\n\n## Hot code swapping\n\nTwo levels, both zero-downtime (listener, open connections and the worker\npool are untouched; requests already executing finish on the old code):\n\n- **Route level (express)**: registering a route that already exists\n  *replaces* it on the live app. Re-evaluating a routes file against a\n  running app is a hot reload:\n\n  ```scheme\n  (app-get app \"/version\" v2-handler)   ; replaces the old /version\n  ```\n\n- **Handler level (core)**: `app-listen` / `http-listen` return the server;\n  swap the entire handler — even a different framework layer — atomically:\n\n  ```scheme\n  (define srv (app-listen app 8080))\n  (http-swap! srv (app->handler another-app))\n  (http-set-ws! srv another-ws-resolver)\n  ```\n\nTry it on the demo server: `GET /version` answers `v1`; `GET /upgrade`\nreplaces the route; `GET /version` now answers `v2 (hot swapped)`.\n\n## WebSocket\n\nServed on the same port via the standard upgrade handshake. Each\nconnection runs in its own green process; `ws-recv` blocks only that\nprocess. Pings are answered and fragmented messages reassembled\nautomatically.\n\n```scheme\n(import (igropyr websocket))\n\n(app-ws app \"/ws\"                      ; :param segments work here too\n  (lambda (ws req)\n    (ws-send-text! ws \"welcome\")\n    (let loop ()\n      (let ((m (ws-recv ws)))          ; #(text s) | #(binary bv) | #(close)\n        (case (vector-ref m 0)\n          ((text) (ws-send-text! ws (vector-ref m 1)) (loop))\n          ((binary) (ws-send-binary! ws (vector-ref m 1)) (loop))\n          (else 'closed))))))\n```\n\nServer push from other processes: hand them the `ws` (or its pid) and\ncall `ws-send-text!` — writes are safe from any green process. On the\nbare core, register a resolver with `(http-set-ws! srv (lambda (req)\nsession-or-#f))`.\n\n## Streaming responses and SSE\n\nStream a body with chunked transfer-encoding. Detach a long stream from\nthe pool worker by spawning a producer process, so the worker returns to\nthe pool immediately:\n\n```scheme\n(app-get app \"/sse\"\n  (lambda (req res)\n    (sse-start! res)                      ; text/event-stream, chunked\n    (spawn\n      (lambda ()\n        (let loop ((i 1))\n          ;; sse-send! returns #f once the client disconnects\n          (if (and (<= i 5) (sse-send! res (string-append \"tick \" (number->string i))))\n              (begin (sleep-ms 300) (loop (+ i 1)))\n              (res-end! res)))))))\n```\n\nThe lower-level primitives are `res-begin!`, `res-write!` (string or\nbytevector; returns `#f` if the client is gone), and `res-end!`.\n\n### Slow consumers\n\n`res-write!` waits for each chunk to reach the peer, so a producer runs at\nthe client's pace rather than queueing chunks in memory. That wait is\nbounded: a write whose bytes the peer never accepts gives up after\n`write-timeout-ms` (default 30 s), closes the connection, and returns\n`#f` — which is already the \"stop the loop\" answer every producer handles,\nso no caller changes.\n\nThe bound matters most for exactly the shape recommended above. A stream\ndetached into its own process is **not** a pool worker, so the pool's\n`stuck-ms` never applied to it; before this, one client that opened an SSE\nstream and stopped reading held its writer process for the life of the\nprocess, while whatever fed the stream kept sending into an unbounded\nmailbox.\n\n```scheme\n(http-write-timeout! 30000)   ; process-global; 0 restores the unbounded wait\n```\n\nThis is not a liveness timer for the stream. An SSE connection with nothing\nto say is normal and costs no write; only a write whose bytes the kernel\nwill not take can expire — which means the peer's receive window has been\nshut for the whole period. A live consumer drains a chunk in milliseconds,\nand a bad mobile link in seconds.\n\nThe default matches `read-timeout-ms`, which bounds a peer that will not\n*send*, and the pool's `stuck-ms`, so a detached stream is bounded exactly\nlike the pooled handler it was detached from. Whatever feeds the stream\nkeeps queueing for this long, so the value is also the ceiling on that\nbacklog.\n\n## JSON\n\n`(igropyr json)` is a safe recursive-descent parser — it never calls\n`read`, so it is safe on untrusted request bodies — plus a writer.\nObjects map to alists (string keys), arrays to vectors, `null` to\n`'null`.\n\n```scheme\n(import (igropyr json))\n(string->json \"{\\\"a\\\":[1,2],\\\"b\\\":\\\"x\\\"}\")   ; => ((\"a\" . #(1 2)) (\"b\" . \"x\"))\n(json->string '((\"ok\" . #t) (\"n\" . 42)))     ; => \"{\\\"ok\\\":true,\\\"n\\\":42}\"\n(json-ref (string->json \"{\\\"a\\\":{\\\"b\\\":9}}\") \"a\" \"b\")  ; => 9\n```\n\n**One spelling per shape.** An array is a vector and nothing else, and a\nkey or a string is a string and nothing else. A list where an array was\nmeant, and a symbol where a key or a string was meant, are refused rather\nthan converted — two Scheme values that reached the same document could\nnot both be read back, so the writer says so instead of choosing:\n\n```scheme\n(json->string '(1 2 3))     ; \"a JSON array is a vector, not a list: use list->vector\"\n(json->string '((k . 1)))   ; \"an object key must be a string, not k: an object member is (\"k\" . v), a nested array is #(#(...))\"\n```\n\nRefusals name the offending value where it is small — a symbol, a key —\nand otherwise name its KIND, never the value itself, since a value\nreaching a refusal may be circular or enormous:\n\n```scheme\n(json->string #\\a)          ; \"not a JSON value: a character\"\n(json->string 1+2i)         ; \"not a JSON value: a complex number\"\n(string->json 42)           ; \"string->json takes a string, not a number\"\n```\n\nErrors are `#(json-error message position)`. **The position says which\nside raised**: reading errors carry an index into the input, writing\nerrors carry `#f`. `(string->json 42)` reports `0` — nothing was\nconsumed — rather than `#f`, so a handler can still dispatch on it.\n\n### Reading and rewriting paths\n\nSix verbs, each in two layers. The trailing `*` marks the **lower**\nlayer, not an enhanced one: a starred procedure takes one locator and can\nbe applied, while the macro takes a path written at the call site and\nflattens it. A locator is a string, a symbol, or an exact non-negative\nindex; a symbol locator is spelled to a string for the lookup, so nothing\nsymbolic is ever stored.\n\n| one locator, applicable | over a path |\n| --- | --- |\n| `(json-ref* x k [absent])` | `(json-ref x k ... [absent])` |\n| `(json-set* x k v)` | `(json-set x k ... v)` |\n| `(json-drop* x sel)` | `(json-drop x k ... sel)` |\n| `(json-update* x sel p)` | `(json-update x k ... sel p)` |\n| `(json-push* x member)` | `(json-push x k ... member)` |\n| `(json-insert* x k member)` | `(json-insert x k ... loc member)` |\n\n```scheme\n(define doc (string->json \"{\\\"a\\\":{\\\"b\\\":[10,20]}}\"))\n(json-ref doc \"a\" \"b\" 1)                      ; => 20\n(json-ref doc \"a\" \"z\" (lambda () 'missing))   ; => missing\n(json-set doc \"a\" \"b\" 0 99)                   ; => ((\"a\" (\"b\" . #(99 20))))\n(json-set doc \"a\" \"z\" 0 99)                   ; => #f\n```\n\n`sel` selects: a locator, a predicate on the key, `#t` for every member,\nor `#f` for none. Selecting nothing is not failing — the container comes\nback, having had zero members changed — while `#f` means the operation\ndid not complete. The macros read down and rebuild on the way out, so a\nbreak anywhere answers `#f` for the whole expression and the original is\nleft alone; the container and every locator are evaluated exactly once.\nOnly `json-ref` takes a trailing thunk, because the other verbs end in a\nvalue and a value may well be a procedure.\n\n`json-object?`, `json-array?` and `json-null?` classify a value in this\nrepresentation. They are cheap and non-recursive, so they are not\nwritability checks: a value can satisfy `json-object?` and still be\nrefused by `json->string`, which validates all the way down.\n\nIn a handler, `req-json` parses the request body (returns `#f` on\ninvalid JSON) and `send-json!` serializes:\n\n```scheme\n(app-post app \"/api\"\n  (lambda (req res)\n    (let ((j (req-json req)))\n      (send-json! res (list (cons \"echo\" (json-ref j \"name\")))))))\n```\n\n## Forms and cookies\n\n`req-form` parses both `application/x-www-form-urlencoded` and\n`multipart/form-data`; text fields are strings and uploads are\n`#(file ,filename ,content-type ,bytevector)`.\n\n```scheme\n(app-post app \"/upload\"\n  (lambda (req res)\n    (for-each\n      (lambda (kv)\n        (let ((v (cdr kv)))\n          (when (vector? v)               ; a file part\n            (save-file (vector-ref v 1) (vector-ref v 3)))))\n      (req-form req))\n    (send-text! res \"ok\")))\n\n(app-get app \"/login\"\n  (lambda (req res)\n    (set-cookie! res \"sid\" \"abc123\" \"Path=/\" \"HttpOnly\")\n    (send-text! res (or (req-cookie req \"sid\") \"no session\"))))\n```\n\n## OTP building blocks\n\nBeyond raw `spawn`/`send`/`receive`, OTP-style building blocks make\nstateful services and fan-out easy: `(igropyr gen-server)` for stateful\nservices, `(igropyr otp)` for a supervised worker pool, `(igropyr pubsub)`\nfor fan-out, and `(igropyr dpool)` lifting the worker pool across a mesh.\nThe process registry is not a library of its own — it is `register` /\n`unregister` / `whereis` in `(igropyr actor)` itself.\n\nA `gen-server` is a stateful service reduced to callbacks; calls carry a\nunique tag and monitor the server, so a crash surfaces immediately\ninstead of hanging:\n\n```scheme\n(import (igropyr gen-server))\n(gen-server-start-named 'counter\n  (lambda () 0)                                  ; init -> state\n  (lambda (msg from state) (values (+ state 1) (+ state 1)))  ; handle-call\n  (lambda (msg state) state))                    ; handle-cast\n(gen-server-call 'counter 'incr)                 ; => 1  (by registered name)\n```\n\nThe process registry decouples a name from the pid behind it, so a\nsupervised service can be found again after a restart:\n`(register 'db pid)`, `(whereis 'db)`.\n\nPubSub is topic fan-out; dead subscribers are pruned automatically, which\npairs naturally with one-process-per-WebSocket chat rooms:\n\n```scheme\n(import (igropyr pubsub))\n(start-pubsub!)                                  ; once, at boot\n(app-ws app \"/chat/:room\"\n  (lambda (ws req)\n    (let ((topic (string->symbol (req-param req \"room\"))))\n      (subscribe topic)\n      (spawn (lambda ()                          ; relay room traffic to this socket\n               (let lp () (receive (`#(pub ,t ,m) (ws-send-text! ws m) (lp))))))\n      (let lp ()\n        (let ((m (ws-recv ws)))\n          (if (eq? (vector-ref m 0) 'text)\n              (begin (publish topic (vector-ref m 1)) (lp))\n              'closed))))))\n```\n\n## Redis and MySQL\n\nBoth clients ride the same libuv loop and actor model: each database\nconnection is one green process; a caller sends it a message and parks\nin `receive` until the reply lands. No OS thread ever blocks — a\nhundred workers can wait on the database while other requests keep\nbeing served.\n\n```scheme\n(import (igropyr redis) (igropyr mysql))\n\n;; Redis (RESP2): concurrent commands are pipelined over one connection\n(define r (redis-connect \"127.0.0.1\" 6379))\n(redis r \"SET\" \"greeting\" \"hello\")     ; -> \"OK\"\n(redis r \"GET\" \"greeting\")             ; -> \"hello\"\n(redis r \"GET\" \"missing\")              ; -> #f        (nil)\n(redis r \"LRANGE\" \"l\" 0 -1)            ; -> (\"a\" \"b\") (arrays -> lists)\n\n;; MySQL (text protocol; caching_sha2_password, both fast and full\n;; RSA paths, so it works against MySQL 8/9 out of the box)\n(define db (mysql-connect \"127.0.0.1\" 3306 \"user\" \"password\" \"mydb\"))\n(mysql-query db \"SELECT id, name FROM users\")\n  ;; -> #(rows (\"id\" \"name\") ((\"1\" \"Alice\") (\"2\" \"Bob\")))  NULL -> #f\n(mysql-query db \"INSERT INTO users (name) VALUES ('Eve')\")\n  ;; -> #(ok 1 3)   ; affected rows, last insert id\n\n;; MySQL pool: n real connections behind one dispatcher; queries run in\n;; parallel, dead connections are replaced automatically, and the pool\n;; is used exactly like a single connection\n(define pool (mysql-pool 8 \"127.0.0.1\" 3306 \"user\" \"password\" \"mydb\"))\n(mysql-query pool \"SELECT ...\")\n```\n\nServer errors raise `#(redis-error msg)` / `#(mysql-error code msg)` in\nthe caller — inside a route handler that means Let It Crash: the worker\ndies, the supervisor retries, the service keeps running.\nRedis bulk strings are binary-safe: valid UTF-8 comes back as a string,\nand non-UTF-8 data comes back as a bytevector.\n\nMySQL's `caching_sha2_password` fast path (challenge-response, no\npassword on the wire) needs no configuration. The *full* auth path sends\nthe password RSA-encrypted; doing that over a plaintext connection is\nrefused by default (a MITM could substitute the key). Enable it by\npinning the server key or opting in explicitly:\n\n```scheme\n(mysql-connect host port user pw \"db\"\n  '((server-public-key . \"-----BEGIN PUBLIC KEY-----...\")))   ; pinned key\n(mysql-connect host port user pw \"db\"\n  '((allow-insecure-auth . #t)))                              ; TLS/trusted net only\n```\n\n## Outbound HTTP\n\nThe HTTP *client* rides the same model: each request runs in its own\ngreen process (async DNS via libuv's thread pool, then connect/send/\nread) while the caller parks. Handy for calling other services from\ninside a handler.\n\n```scheme\n(import (igropyr http-client))\n\n(let ((r (http-get \"http://api.internal/users/42\")))\n  (response-status r)                       ; -> 200\n  (response-header r 'content-type)         ; -> \"application/json\"\n  (utf8->string (response-body r)))          ; body is a bytevector\n\n(http-post \"http://api.internal/events\" \"{\\\"type\\\":\\\"click\\\"}\"\n           '((headers . ((\"Content-Type\" . \"application/json\")))\n             (timeout . 5000)))\n```\n\nConnections are reused: after a response that leaves the connection framed\nand drained, it is kept for the next request to the same host, port and\nscheme, which saves a TCP handshake (and over TLS a full TLS handshake). Pass\n`(reuse . #f)` to opt one request out; `http-client-pool!` sizes the pool,\n`http-client-close-idle!` empties it and `http-client-pool-stats` reports it.\nA transport failure or timeout raises `#(http-client-error msg)`.\n\n**`https://`** works once you enable the optional `(igropyr tls)`\nlibrary — one import plus one call at startup, and every `http-get` /\n`http-request` can reach TLS endpoints:\n\n```scheme\n(import (igropyr http-client) (igropyr tls))\n(tls-enable!)                                 ; once, before the first https request\n\n(let ((r (http-get \"https://api.github.com/zen\"\n                   '((headers . ((\"User-Agent\" . \"igropyr\")))))))\n  (response-status r)                          ; -> 200\n  (utf8->string (response-body r)))\n```\n\nTLS lives in its own library so the core stays dependency-free: nothing\nloads OpenSSL unless you import it. It runs as a pure byte codec in\nmemory-BIO mode — libuv keeps owning the socket, the event loop, and\ntimeouts; OpenSSL only transforms bytes, and the handshake is driven\ninside the request's own green process, so nothing blocks. Certificates\nare **verified by default** (peer chain, hostname/IP SANs, TLS ≥ 1.2,\nsystem trust roots — `SSL_CERT_FILE` / `SSL_CERT_DIR` honored); a\nverification failure raises `#(http-client-error \"tls: …\")`. Needs\nOpenSSL 3 or 1.1 (or LibreSSL) present as a shared library. See\n**Outbound TLS** below.\n\n## Vector scoring\n\n`(igropyr blas)` is the compute kernel for embedding search: one call\nfills `scores[i] = row_i · query` over a flat row-major float32 matrix,\nvia `cblas_sgemv` when a native BLAS loads (Accelerate on macOS,\nOpenBLAS on Linux/FreeBSD) and via a pure-Scheme loop otherwise —\n`blas-available?` tells you which, correctness never depends on it.\nTop-k, thresholds and storage stay yours; this is the scan, at memory\nbandwidth.\n\n```scheme\n(import (igropyr blas))\n(blas-scores! base n dim query scores)   ; base [n x dim] f32, scores [n] f32\n```\n\nOne scheduling note: an FFI call cannot be preempted, so a full scan\nstalls the calling scheduler for its duration (~0.2 ms at 5k×512 f32,\n~5 ms at 100k). Spread those stalls — every process scanning its own\nreplica inline keeps the per-process stall duty cycle `q·s/N`\nnegligible; don't funnel searches into a few dedicated processes. If\nthat duty cycle ever grows, tile the scan and yield between tiles, or\nshard the corpus and scatter-gather — spread out, never centralize.\n\n## Embedded JavaScript\n\n`(igropyr quickjs)` embeds a JavaScript engine (QuickJS) in-process for\nrunning a **fixed** JS bundle baked at build time — a reference\nimplementation you must match byte-for-byte, a sandboxed expression\nevaluator, a JS template. User input is the string **argument**, never\ncode:\n\n```scheme\n(import (igropyr quickjs))\n(qjs-boot! \"function slugify(s){ return s.toLowerCase().replace(/\\\\s+/g,'-') }\")\n(qjs-call! \"slugify\" \"Hello World\")   ; -> \"hello-world\"\n```\n\nIt runs in **pure Scheme** over a stock shared **quickjs-ng** (`libqjs`),\nbound directly through the FFI (no custom C): a memory cap, a stack cap, a wall-clock\ninterrupt deadline, and **crash-only rebuild** — a throwing or runaway call\ndiscards the whole JS heap and reboots it from the bundle (`qjs-generation`\ncounts rebuilds), so one bad call can't poison the next. The engine is\nserialized on the single OS thread and each call runs with interrupts\ndisabled, so a call blocks the scheduler for its duration (sub-millisecond\ntypically, `timeout-ms` worst case) — cap input size on latency-sensitive\npaths. `qjs-boot!` reports if no library is found, and refuses to bind\nunless `JS_FreeValue` resolves as a real function -- which bellard's\n`libquickjs` does not export, so a process loading only that one will not\nstart. Point it at a\nlibrary with `IGROPYR_LIBQUICKJS_SO` or `(so-path . \"...\")`.\n\nA **C-shim binding with identical exports** — self-contained, with QuickJS\nstatically linked and version-pinned — is a drop-in fallback at\n[guenchi/igropyr-quickjs](https://github.com/guenchi/igropyr-quickjs),\nfor when a stock shared library is awkward to obtain (e.g. Homebrew ships only a\nstatic archive).\n\n## Cached SSR\n\n`(igropyr ssr)` puts a key/TTL cache in front of QuickJS so server-side\nrendering — good for SEO, but the pages that need it are public and\nslow-changing — runs the *blocking* render once per (key, ttl) instead\nof once per request. A hit is a lookup that never touches the engine; a\nmiss renders once and caches the HTML.\n\n```scheme\n(import (igropyr ssr))\n;; at boot: ONE bundle per process (the engine is process-global)\n(define r (make-ssr \"\n  function renderPost(j){ var p = JSON.parse(j);\n    return '<article><h1>'+p.title+'</h1>'+p.body+'</article>'; }\"))\n\n;; in a handler: props (any Scheme value) is JSON-encoded and handed to\n;; the JS function; the returned string is the HTML, cached under key\n(send-html! res (ssr-render r \"renderPost\"\n                  '((\"title\" . \"Hi\") (\"body\" . \"<p>…</p>\"))\n                  '((key . \"/blog/42\"))))     ; explicit key = the URL\n\n(ssr-invalidate! r \"/blog/42\")   ; drop one entry on a content change\n(ssr-clear! r)                   ; drop all (e.g. after a deploy)\n(ssr-stats r)                    ; ((hits . N) (misses . M) (renders . K) …)\n```\n\nThe backend is `memory` by default — an in-process gen-server (TTL\nticker, size cap, exact stats) shared across the process's workers. Pass\n`(cache . (redis <conn> \"ssr:\"))` and the HTML lives in Redis (`SET … PX`\nfor server-side TTL), so a render on one node is a hit on the others.\n**Single-flight** is on by default: N concurrent misses on the same cold\nkey collapse to one render — the first claimant renders, the rest wait\nfor its result — so a thundering herd on a cold key renders once, not N\ntimes (`(single-flight . #f)` disables it). Other options: `(ttl-ms . …)`,\n`(max-entries . …)`, and `(quickjs . …)` passed through to the engine.\n`ssr-render` re-raises a JS throw/timeout (let-it-crash, never cached);\n`ssr-try-render` returns `(values ok? text)` instead for a non-raising\npath.\n\n## Object storage and AWS\n\n`(igropyr sigv4)` signs requests with AWS Signature V4 (pinned to the AWS\ndocumented test vectors); the service libraries build on it over the\nnon-blocking HTTP client, so they park the calling process like any other\nrequest and work against AWS or any compatible endpoint.\n\n```scheme\n(import (igropyr s3))\n(define bkt (make-s3 '((endpoint . \"https://s3.us-east-1.amazonaws.com\")\n                       (bucket . \"assets\") (region . \"us-east-1\")\n                       (access-key . \"…\") (secret . \"…\"))))   ; other endpoint = R2 / MinIO\n(s3-put! bkt \"k/logo.png\" bytes \"image/png\")   ; -> etag\n(s3-get bkt \"k/logo.png\")                       ; -> bytevector | #f on 404\n(s3-copy! bkt \"k/logo.png\" \"k/logo-bak.png\")    ; server-side copy\n(s3-delete! bkt \"k/logo.png\")                   ; idempotent\n(s3-list bkt \"k/\")                              ; -> (key …), follows continuation tokens\n```\n\n`(igropyr sts)` vends **scoped, temporary** credentials for a client\n(GetFederationToken with a caller-supplied session policy — e.g. narrow\nS3 access), and `(igropyr ses)` sends one already-rendered email (SES v2\nSendEmail; a non-ASCII From display name is RFC 2047 mime-word encoded so\nclients show it, not just the address):\n\n```scheme\n(import (igropyr sts) (igropyr ses))\n(define sts (make-sts '((region . \"us-east-1\") (access-key . \"…\") (secret . \"…\"))))\n(sts-get-federation-token sts \"u-abc\" policy-json 3600)\n;;   -> ((access-key-id . \"…\") (secret-access-key . \"…\")\n;;       (session-token . \"…\") (expiration . \"2026-…Z\"))\n\n(define ses (make-ses '((region . \"eu-west-3\") (access-key . \"…\") (secret . \"…\"))))\n(ses-send-email ses \"noreply@example.com\" \"Example\" \"u@x.com\" subject html)  ; -> MessageId\n```\n\n`(igropyr sns)` fans one message out to a topic's subscribers (SNS\nPublish — email / SMS / SQS / Lambda / HTTP; the topic and its\nsubscriptions are provisioned out of band), returning the MessageId. The\n`subject` only reaches email delivery, so pass `#f` or `\"\"` to omit it.\n`(igropyr cloudwatch)` publishes one custom metric data point (CloudWatch\nPutMetricData) — build it as a counter or gauge and alarm on it in\nCloudWatch; the unit defaults to `\"Count\"` and `dims` is an alist of\n`(name . value)`. PutMetricData answers a 2xx with an empty body, so it\nreturns `#t` rather than an id:\n\n```scheme\n(import (igropyr sns) (igropyr cloudwatch))\n(define sns (make-sns '((region . \"us-east-1\") (access-key . \"…\") (secret . \"…\"))))\n(sns-publish sns \"arn:aws:sns:us-east-1:123:alerts\" \"subject\" \"body\")  ; -> MessageId\n(sns-publish sns \"arn:aws:sns:us-east-1:123:alerts\" #f \"body\")        ; no subject\n\n(define cw (make-cloudwatch '((region . \"us-east-1\") (access-key . \"…\") (secret . \"…\"))))\n(cloudwatch-put-metric cw \"myapp\" \"requests\" 1)                        ; -> #t, unit \"Count\"\n(cloudwatch-put-metric cw \"myapp\" \"latency_ms\" 42 \"Milliseconds\"\n                       '((\"route\" . \"/checkout\")))                     ; unit + a dimension\n```\n\nEach raises a structured `#(s3-error …)` / `#(sts-error …)` / `#(ses-error\n…)` / `#(sns-error …)` / `#(cloudwatch-error …)` on a non-2xx response, so\na caller can catch and retry.\n\n## Password hashing\n\n`(igropyr kdf)` derives and verifies passwords over the already-loaded\nlibcrypto (the same OpenSSL `(igropyr tls)` uses), offered as\ninfrastructure so an app **chooses** its algorithm — and migrates between\nthem without a flag day. Self-describing hashes carry the algorithm and\ncost params in the string, so one `password-verify` dispatches across all\nthree and a login can rehash to a stronger algorithm transparently.\n\n```scheme\n(import (igropyr kdf))\n(password-hash \"hunter2\" 'scrypt   '())   ; -> \"scrypt$32768$8$1$<salt>$<dk>\"\n(password-hash \"hunter2\" 'pbkdf2   '())   ; -> \"pbkdf2-sha256$600000$<salt>$<dk>\"\n(password-hash \"hunter2\" 'argon2id '())   ; -> \"argon2id$2$19456$1$<salt>$<dk>\" (OWASP min)\n(password-verify \"hunter2\" stored)        ; -> #t | #f, constant-time compare\n\n;; raw derivations too, when you pick the cost params yourself:\n(kdf-pbkdf2-sha256 pw salt iterations dk-len)\n(kdf-scrypt        pw salt N r p dk-len)\n(kdf-argon2id      pw salt t m p dk-len)\n\n;; argon2id needs OpenSSL 3.2+; scrypt and pbkdf2 do not. There is no\n;; default algorithm, so an older libcrypto costs you that one choice:\n(kdf-argon2id-available?)                 ; -> #t | #f\n```\n\nA blocking KDF freezes the single-threaded scheduler for its duration, so\n`password-verify` enforces a cost ceiling (~one 256 MiB fill, ~0.1–0.2 s)\nbefore running: a **crafted** stored hash with an enormous cost is\nrejected fast (`#f`) instead of turning a login into a multi-second\nstall. Defaults track OWASP minimums; the parameters are validated\nstrictly (a non-string password or a malformed hash returns `#f`, never a\ncrash). `(igropyr crypto)` keeps a pure-Scheme PBKDF2 for hosts without\nlibcrypto.\n\n## Middleware suite\n\nReady-made middleware for common needs. Register them with `app-use`;\norder matters (outermost first).\n\n```scheme\n(import (igropyr session) (igropyr middleware))\n\n(app-use app (error-handler))              ; outermost: catch -> 500 JSON\n(app-use app (logger))                     ; \"GET /path -> 200 (3ms)\"\n(app-use app (security-headers '((hsts . #t))))  ; X-Frame-Options, nosniff, ...\n(app-use app (cors '((origin . \"https://app.example.com\")\n                     (credentials . #t))))       ; + 204 OPTIONS preflight\n(app-use app (rate-limit '((max . 100) (window . 60000))))  ; 429 over limit\n\n;; cookie-based sessions backed by a gen-server store (sids from the OS\n;; CSPRNG, TTL-pruned); the session is loaded onto the request and saved\n;; after the handler if it changed\n(define store (make-session-store))         ; at boot\n(app-use app (session-middleware store))\n\n(app-get app \"/visits\"\n  (lambda (req res)\n    (let* ((s (req-session req))\n           (n (+ 1 (or (session-get s 'visits) 0))))\n      (session-set! s 'visits n)             ; persisted automatically\n      (send-json! res (list (cons \"visits\" n))))))\n\n;; Rotate an established anonymous id when authentication/privilege changes.\n;; Must happen BEFORE the response goes out -- the replacement arrives as a\n;; Set-Cookie header, so afterwards it could not reach the client. Called\n;; on an answered response it raises rather than dropping the live id.\n(app-post app \"/login\"\n  (lambda (req res)\n    ;; ...verify the submitted credential first...\n    (let ((s (req-session req)))\n      (session-regenerate! s)                 ; prevents session fixation\n      (session-set! s 'user \"alice\")\n      (send-json! res '((\"ok\" . #t))))))\n```\n\nMiddleware can also stash arbitrary values on the request for later\nhandlers with `req-set-local!` / `req-local` (this is how sessions ride\nalong). Writing your own is just `(lambda (req res next) ...)` — call\n`(next)` to continue, or respond and return to short-circuit.\n\nMetrics: a middleware records every request into one collector, which\n`(igropyr metrics)` then renders three ways off the same numbers — the\nsignal is format-agnostic and does not care whether the reader is\nPrometheus, a browser, or a Scheme program:\n\n```scheme\n(import (igropyr metrics))\n(define m (make-metrics))                   ; at boot\n(app-use app (metrics-middleware m))\n;; after app-listen returns the server:\n(app-get app \"/metrics\"     (metrics-endpoint m srv))  ; Prometheus text\n(app-get app \"/stats.json\"  (metrics-json m srv))      ; JSON snapshot\n(app-get app \"/stats.sexpr\" (metrics-sexpr m srv))     ; sexpr snapshot\n;;   igropyr_requests_total{status=\"200\"} 1234\n;;   igropyr_request_duration_ms_sum 45210  ...  igropyr_pool_busy 3\n```\n\n`metrics-snapshot` returns that same datum as a Scheme value for\nin-process callers. Business counters ride the collector too — register\nnothing, just `(metrics-count! m \"jobs_done_total\" '() 5)`.\n\nThe presentation layer is a separate library, `(igropyr dashboard)`,\nso the page never couples to the signal. It ships a self-contained\nbrowser dashboard (inline CSS/JS, no external assets, works air-gapped:\nrequests/s and latency sparklines, connection/pool gauges, per-status\ncounts, every counter family, refreshed every 2 s) and — since the\nmonitoring surface exposes operational detail — a turnkey admin\nlistener that binds **loopback by default**:\n\n```scheme\n(import (igropyr dashboard))\n;; mount onto an app you already have (guard it yourself):\n(mount-dashboard! app m srv)                 ; GET /dash , /dash/data[.sexpr]\n;; or a dedicated admin port, 127.0.0.1 by default, with a guard:\n(admin-listen m srv `((port . 9090) (auth . ,(auth verify))))\n;; NOT (token-guard verify): this slot is app-use middleware, and a\n;; request guard installed here raises on the first admin request.\n```\n\nThe front-end is swappable: pass `(html . <string|procedure>)` to serve\nyour own page — a file kept outside the web root via `send-file!`, or a\n[Goeteia](https://github.com/guenchi/Goeteia) app reading the sexpr\nendpoint — decoupled from the data routes, so its source can live\nanywhere and render however you like.\n\nOn a node (after `node-start!`), announce the local summary once and\nevery peer that did the same appears in the snapshot's `cluster` member\n(uptime, connections, requests, 5xx, pool) — gathered over the existing\nnode links by `rcall`, so no peer needs to expose HTTP:\n\n```scheme\n(metrics-announce! m srv)\n```\n\nThe data routes expose operational detail. `admin-listen` defaults to\nloopback for that reason; mounting onto a public app instead, guard the\nroutes like `/metrics` (an `(auth . …)`, a reverse proxy, or network\npolicy). Any listener's bind interface is now configurable —\n`(app-listen app port '((host . \"127.0.0.1\")))` keeps it off-box.\n\n## Outbound WebSocket\n\n`ws-connect` dials a `ws://` URL, does the upgrade handshake, and returns\na client-role session — the same object the server side uses, so\n`ws-recv` / `ws-send-text!` / `ws-close!` work unchanged (outbound frames\nare masked as RFC 6455 requires).\n\n```scheme\n(import (igropyr ws-client))\n(let ((w (ws-connect \"ws://127.0.0.1:8080/chat/42\")))\n  (ws-send-text! w \"hello\")\n  (ws-recv w)                 ; -> #(text s) | #(binary bv) | #(close)\n  (ws-close! w))\n```\n\n`wss` is refused — reach TLS-only endpoints through a proxy.\n\n## Design model\n\nFour commitments shape the concurrency and distribution layers. They are\ndeliberate: a review comparing this library to Erlang/OTP or Swish will\nfind several OTP mechanisms missing, and each absence traces to one of\nthese.\n\n1. **Crash-only, with the real supervisor outside the process.** Inside\n   the process: let-it-crash workers, resource reclamation through owner\n   monitors, task-level retry that knows its side effects. At the process\n   level: die loudly and let the service manager (rc.d, `daemon -r`,\n   systemd) restart the whole image. Recovery means rebuilding from\n   durable state, not surgically restarting a subtree in place — so there\n   is no in-process supervision tree, and its absence is a decision, not\n   a gap.\n\n2. **A single scheduler means an in-process supervision tree could not\n   help with the hardest failures anyway.** A supervisor process shares\n   the scheduler with everything it supervises: when the scheduler itself\n   stalls — a foreign call that never returns — the tree stalls with it.\n   The only supervisor that survives that failure class lives outside the\n   process, and it is already there.\n\n3. **The node mesh is a control plane: names, small messages,\n   fail-closed, slow-is-dead.** Registered names cross the wire, pids do\n   not. A protocol confusion closes the connection rather than guessing.\n   A peer that cannot keep up is treated as dead — close and reconnect —\n   never paused: pausing a control link delays heartbeats and monitor\n   traffic, and turns one slow peer into cascading false failures. Bulk\n   data never rides the control link; it gets its own connection.\n\n4. **The mesh is small and fully trusted, and that is a feature.** A\n   shared secret, a full mesh, and a modest node ceiling assume a cluster\n   administered as one unit and upgraded in lockstep. Scaling is\n   processes times machines under that assumption, not a thousand-node\n   substrate.\n\n### Lineage: ChezErlang\n\nIgropyr's actor runtime descends from ChezErlang, a Swish fork, rewritten\nfrom scratch after the fork collapsed under high-concurrency load. The\ndivergence from Swish's design is therefore half philosophy and half scar\ntissue. Four pitfalls were diagnosed and verified on the fork before the\nrewrite:\n\n1. **`receive`'s `after` clause only took effect in first position** — placed\n   after other clauses it silently became a pattern that never matches: a\n   semantic trap with no signal at all.\n2. **The listener was held only weakly** — an accept loop that did not keep it\n   alive by hand was silently collected, and the server died faster the\n   busier it got: the root cause of the high-concurrency collapse.\n3. **A blocking TCP read stalled the calling process** — parsing had to live in\n   a per-connection reader process, or one slow-dripping client wedged the\n   whole server.\n4. **An fd had to be closed exactly once** — including connections that reached\n   EOF without ever carrying data — or fds leaked one-to-one with\n   connections.\n\nEach shaped a rule here, and the rules were checked against the code rather\nthan remembered:\n\n1. `after` is **structural, not a pattern**. Its clause is recognised at\n   expansion, and the clause that handles a plain pattern list carries a\n   fender rejecting any list containing `after`. So `after` in a later\n   position matches neither clause and is a compile error — *invalid\n   syntax*, at expansion, not a pattern that quietly never fires.\n2. Listener handles are kept in a strong table whose stated job includes\n   rooting them for the collector. Nothing is required of the accept loop,\n   and the only thing that removes a listener is stopping it on purpose.\n3. Bytes arrive as messages to the connection's owner process, which parks\n   in `receive` — so a read never blocks the caller, and the pitfall is\n   gone. It does **not** follow that a slow peer costs nothing but its own\n   process: delivery *can* be stopped, which closes the kernel's receive\n   window and slows the sender, but stopping it is a call an owner has to\n   make, and the node link does not make it. An owner that consumes more\n   slowly than its peer sends accumulates an unbounded mailbox. The\n   mechanism exists; it is not automatically in force.\n4. Closing is idempotent by construction: the close guard tests the\n   connection's own state and the handle's closing flag, so every path that\n   can reach a close — EOF, error, owner death, explicit close — may call\n   it without closing twice. That is **at most once**, which is the half\n   the guard can prove. Not at least once: EOF and error only deliver a\n   message, and an owner that ignores it leaves the connection open. The\n   node link's own paths do close, so exactly-once holds there; it is not a\n   property of the underlying layer.\n\n## Fault tolerance semantics\n\nThese apply to pooled routes (the default); nothing to configure:\n\n- **Crash**: a handler that raises kills its worker. The supervisor spawns a\n  replacement and retries the task, at most 3 times (4 executions total);\n  after that the client receives `500` and the task is dropped. Service is\n  never interrupted.\n- **Stuck**: a ticker checks the pool every 5 s; any worker busy for more\n  than 30 s is killed and replaced. Stuck tasks are *not* retried (retrying\n  an infinite loop would re-stick the pool). Even with every worker stuck,\n  the service recovers by itself within ~35 s.\n- **Slow clients**: each connection is owned by its own reader process; a\n  half-sent request parks only that reader and is reaped after 30 s.\n\n## Dynamic state and `parameterize`\n\n**`make-parameter` does not give you per-request state.** Reach for\n`req-set-local!` / `req-local` instead, or pass the value as an argument.\n\nChez implements `parameterize` by swapping a *global* cell and registering a\nwinder to swap it back — printing one shows it plainly:\n\n```\n#[critical-winder #<procedure swap> #<procedure swap> ()]\n``` The scheduler saves and restores each process's winder\nlist across a switch but never runs the hooks — correct for `dynamic-wind`,\nwhose after-thunk must not fire merely because a process yielded, and wrong for\n`parameterize`, whose whole mechanism *is* that hook. Whoever wrote the cell\nlast owns it, for everyone.\n\nThree processes, each either setting or reading one parameter across a yield:\n\n| process | expected | actual |\n|---|---|---|\n| set `alice`, yield, read | `alice` | **`bob`** |\n| set `bob`, yield, read | `bob` | **`nobody`** |\n| never parameterized, read | `nobody` | **`bob`** |\n\nNote the middle row: a process cannot even read back *its own* binding. And the\nlast: a process that never touched the parameter sees another's value. So the\nfailure is not only a leak between requests — it is that the binding means\nnothing at all once anything yields, and every handler yields (any I/O does).\n\nThere is no clean fix available. Running the winders on every switch would\nbreak `dynamic-wind`; saving and restoring the values instead would require\nenumerating every live parameter, which Chez does not expose. So this is a\ndocumented limitation rather than a bug to be filed.\n\nNothing warns you. A guard that reads the wrong identity usually *denies*, so\nthe visible symptom is an occasional unexplained `401` under concurrency —\nwhich is a rough thing to chase, and the reason this section exists.\n\n## Runtime introspection and graceful shutdown\n\n`app-listen` / `http-listen` return the server. `http-stats` gives a live\nsnapshot; `http-shutdown!` stops accepting and drains in-flight requests\nbefore returning (call it from a detached process, never from a pool\nworker):\n\n```scheme\n(define srv (app-listen app 8080))\n(app-get app \"/stats\" (lambda (req res) (send-json! res (http-stats-json srv))))\n;;   => {\"connections\":12,\"requests\":34210,\"uptime-ms\":90000,\n;;       \"idle\":5,\"busy\":3,\"pending\":0}\n;; http-stats itself keys by symbol, for Scheme callers reading it with\n;; assq; http-stats-json is the same snapshot with the keys spelled out,\n;; because a JSON object key is a string.\n(spawn (lambda () (http-shutdown! srv) (exit 0)))   ; graceful stop\n```\n\n## Multi-process scaling\n\nChez runs on one OS thread, so a single process saturates one core. To\nuse all cores, run N processes bound to the same port with\n`SO_REUSEPORT` and let the kernel balance connections (Linux 3.9+ /\nFreeBSD 12+; not macOS):\n\n```scheme\n(app-listen app 8080 '((reuseport . #t)))\n```\n\nLaunch and supervise the N processes with pm2 (fork mode) or systemd.\nBecause processes share nothing, per-process state (the worker pool, the\nroute table, PubSub topics, WebSocket rooms) is local to each — share\nacross processes through Redis, or connect them into an actor mesh with\nthe distribution layer below.\n\n## Distribution across nodes\n\n`SO_REUSEPORT` scales stateless HTTP but leaves each process an island.\n`(igropyr node)` connects instances — other cores over loopback, other\nmachines over the network — into a mesh where a process on one node can\nmessage a **registered name** on another. The semantics deliberately\nmirror Erlang distribution.\n\n```scheme\n(import (igropyr node))\n\n;; node b: identity + listener (127.0.0.1 unless a host is given)\n(node-start! 'b \"shared-secret\" 4100)\n(register 'worker self)\n\n;; node a: dial b (auto-reconnects), then talk to it\n(node-start! 'a \"shared-secret\")\n(node-connect! 'b \"10.0.0.2\" 4100)\n(rsend 'b 'worker (vector 'job 42))       ; fire-and-forget -> #t / #f\n(rcall 'b 'calc  (vector 'square 7))      ; synchronous gen-server call -> 49\n(monitor-node 'b)                         ; -> #(node-up b) / #(node-down b)\n(monitor-node/token 'b)                   ; -> #(node-up b token seq)\n(monitor-remote 'b 'worker)               ; -> #(remote-down b worker reason)\n```\n\n`node-connect!` and `node-disconnect!` **return once the request is\naccepted, not once it has taken effect.** Both hand the change to an\ninternal registrar whose mailbox orders such changes against each other,\nand return immediately. The promise has always been \"start dialling\",\nnever \"the link is up\" — reconnection is a background loop. Wait for\n`#(node-up peer)` from `monitor-node` if you need the link, rather than\nfor the call to return.\n\n> **Upgrading:** this narrowed in the same release as wire version 4. A\n> caller that dialled and then immediately inspected node state may now\n> observe it a moment earlier than the connector exists; nothing that\n> waited for `node-up` is affected.\n\n**Topology notices are delivered at least once.** A single supervised\nprocess delivers them, and an event leaves its queue only once it has\nbeen handed to every subscriber — a delivery interrupted half way\nthrough is started again rather than dropped. A subscriber can therefore\nsee the same notice twice.\n\n`monitor-node/token` is the form that lets you tell. It returns a\nsubscription token, and its notices are `#(node-up peer token seq)`,\nwhere `seq` rises across all notices: ignore anything whose token is not\nthe one you hold, then ignore a sequence number you have already passed.\n`demonitor-node/token` cancels that subscription and nothing else.\n\nThe two-element form is unchanged and stays unchanged, which is the\npoint of it — but it carries neither a token nor a sequence number, so a\nreceiver using it cannot distinguish a repeat from a new event. If that\nmatters, use the token form; if it does not, nothing needs to change.\n\n> **Upgrading:** delivery of these notices changed, and the message did\n> not, so nothing about a two-element subscription looks different until\n> a notice arrives twice. Previously a delivery interrupted part way\n> through was lost; now it is started again, which is why the same\n> `#(node-up peer)` or `#(node-down peer)` can reach a subscriber more\n> than once. Code that treats a notice as an edge — incrementing a\n> counter, appending to a list, launching one piece of work per event —\n> sees the repeat; code that treats it as a state, setting a flag or\n> re-reading `node-peers`, receives it too but is not affected by it. `monitor-node/token` is the\n> migration if you need to tell the two apart, and switching to it means\n> changing the `receive` pattern as well as the subscription call, since\n> its notices carry two more fields.\n\n**Node names are wire syntax, not a local label.** A node name is\nnon-empty, at most 255 characters, and drawn from `[0-9a-z-]` — lowercase\nletters, digits and the hyphen, which is legal in any position including\nfirst and last. The rule is enforced at `node-start!` and `node-connect!`\nas well as against the name a peer claims, so a name this node would\naccept is always one it can also dial. Anything outside that set is\nrefused at startup with an `assertion-violation`, not later as a link\nthat mysteriously never comes up.\n\n> **Upgrading from a wire version 3 node:** this narrowed in wire\n> version 4. Names carrying uppercase, `_` or `.` used to start and now\n> fail in `node-start!` immediately. A mesh must be upgraded as a\n> whole in any case: a version 4 node refuses a version 3 one, saying why\n> on the side that dialled it and closing without a word on the side that\n> was dialled — a stranger reaching the listener is told nothing on\n> purpose. Rename while planning that upgrade.\n\nAddressing is by registered name (pids are memory objects; names survive\nrestarts). `rsend` is fire-and-forget with per-pair ordering; `rcall` is\nits synchronous counterpart. Payloads cross in the extended s-expression\nwire mode, so vectors, bytevectors and finite flonums arrive intact and\nexact integers/ratios stay exact. `(igropyr pubsub)` becomes cluster-wide\nautomatically once nodes are linked — a `publish` reaches subscribers on\nevery node, so the chat-room example works across the mesh unchanged.\n\n**Distributed task pool** — spread work across nodes with the local\nworker pool's Let-It-Crash story lifted to node level:\n\n```scheme\n(import (igropyr dpool))\n(dpool-worker-start 'render (lambda (job) (resize job)))   ; on each member\n(define pool (dpool-start '(b c) 'render))                 ; on the submitter\n(dpool-await pool (dpool-submit pool (vector 'resize \"x.png\" 800)))\n```\n\nFailure mode is per pool, overridable per task: **at-least-once**\n(default; a node death re-dispatches the task — completes for sure, may\nrun twice, needs idempotent tasks) or **at-most-once** (a node death\nfails it — never re-run). Exactly-once isn't offered: no message-passing\nsystem gives both across a crash.\n\n**Automatic discovery** — instead of dialing every peer by hand,\n`(igropyr cluster)` periodically asks a strategy for the member list and\ndial","readmeFilename":"README.md"}