{"_id":"@rest-vir/host","_rev":"15-cce472b2f461566d1ed86267753a5cde","name":"@rest-vir/host","dist-tags":{"beta":"2.0.0-beta.4","latest":"2.3.3"},"versions":{"2.0.0-beta.0":{"name":"@rest-vir/host","version":"2.0.0-beta.0","keywords":["rest","api","fastify","service","backend","server","websocket","vir"],"author":{"url":"https://github.com/electrovir","name":"electrovir"},"license":"(MIT or CC0 1.0)","_id":"@rest-vir/host@2.0.0-beta.0","maintainers":[{"name":"electrovir","email":"pithy.gut0a@icloud.com"}],"homepage":"https://github.com/electrovir/rest-vir","bugs":{"url":"https://github.com/electrovir/rest-vir/issues"},"dist":{"shasum":"77cafe6564529dfb8e5495d09ebce344b068aaea","tarball":"https://registry.npmjs.org/@rest-vir/host/-/host-2.0.0-beta.0.tgz","fileCount":56,"integrity":"sha512-SsrwSV6bWy0oRApTNd8PyFYqxjvmPU05QXMKKX6YOkzGuBNQYNd6/PF2JUVBrJqaQeiUhwfqLtvdfjEkMlU84g==","signatures":[{"sig":"MEUCIQDZ/fNa872TqWnAghUZ2oY9viBXzzOehZldTqaBeDdWMQIgDU/oORd15PErrO+DUavBYQU7Ac59WKvYiSC66KVfL3k=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":141520},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","module":"dist/index.js","engines":{"node":">=22"},"gitHead":"913bf3171c87f4c827aa0cd9b18dc482056b598f","scripts":{"test":"virmator test node","start":"virmator frontend","compile":"virmator compile","test:docs":"exit 0","test:update":"npm test update","test:coverage":"npm run test coverage"},"_npmUser":{"name":"electrovir","email":"pithy.gut0a@icloud.com"},"repository":{"url":"git+https://github.com/electrovir/rest-vir.git","type":"git"},"_npmVersion":"11.14.1","description":"Implement a declarative and type safe REST API and host it.","directories":{},"_nodeVersion":"22.19.0","dependencies":{"fastify":"^5.8.5","url-vir":"^2.1.9","date-vir":"^8.3.2","@types/ws":"^8.18.1","type-fest":"^5.6.0","portfinder":"^1.0.38","cluster-vir":"^1.0.1","@rest-vir/api":"^2.0.0-beta.0","light-my-request":"^6.6.0","@augment-vir/node":"^31.71.0","@augment-vir/test":"^31.71.0","@fastify/compress":"^8.3.1","@fastify/multipart":"^10.0.0","@fastify/websocket":"^11.2.0","@augment-vir/assert":"^31.71.0","@augment-vir/common":"^31.71.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"c8":"^11.0.0","@types/node":"^25.7.0","istanbul-smart-text-reporter":"^1.1.5"},"peerDependencies":{"object-shape-tester":">=5"},"_npmOperationalInternal":{"tmp":"tmp/host_2.0.0-beta.0_1779806816852_0.23270661870871323","host":"s3://npm-registry-packages-npm-production"}},"2.0.0-beta.1":{"name":"@rest-vir/host","version":"2.0.0-beta.1","keywords":["rest","api","fastify","service","backend","server","websocket","vir"],"author":{"url":"https://github.com/electrovir","name":"electrovir"},"license":"(MIT or CC0 1.0)","_id":"@rest-vir/host@2.0.0-beta.1","maintainers":[{"name":"electrovir","email":"pithy.gut0a@icloud.com"}],"homepage":"https://github.com/electrovir/rest-vir","bugs":{"url":"https://github.com/electrovir/rest-vir/issues"},"dist":{"shasum":"e93c091945c005f82938c55d55f879667c6e6baf","tarball":"https://registry.npmjs.org/@rest-vir/host/-/host-2.0.0-beta.1.tgz","fileCount":62,"integrity":"sha512-vRSNyy6TxP+aaGQeRlxXKbC3NbSeE6Z52kUe+UATbQLB8yeKzZ0DjWuKF85y8yzXBwhceElzHIDnYCGykE5V9Q==","signatures":[{"sig":"MEUCIC+GDb5qY4I8EjKdZgSO1tM5wNx+ciRrA/yzXQLBNK+RAiEA1HXxapiCcMg3nkyxQuRsFNRvBnCX05EbhuWXT8QbnYI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":176354},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","module":"dist/index.js","engines":{"node":">=22"},"gitHead":"e0b582d6b8098c2d5c2c467b4a85e4dbe722e924","scripts":{"test":"virmator test node","start":"virmator frontend","compile":"virmator compile","test:docs":"exit 0","test:update":"npm test update","test:coverage":"npm run test coverage"},"_npmUser":{"name":"electrovir","email":"pithy.gut0a@icloud.com"},"repository":{"url":"git+https://github.com/electrovir/rest-vir.git","type":"git"},"_npmVersion":"11.15.0","description":"Implement a declarative and type safe REST API and host it.","directories":{},"_nodeVersion":"22.19.0","dependencies":{"fastify":"^5.8.5","url-vir":"^2.1.9","date-vir":"^8.3.2","@types/ws":"^8.18.1","type-fest":"^5.6.0","portfinder":"^1.0.38","cluster-vir":"^1.0.1","@rest-vir/api":"^2.0.0-beta.0","light-my-request":"^6.6.0","@augment-vir/node":"^31.71.0","@augment-vir/test":"^31.71.0","@fastify/compress":"^8.3.1","@fastify/multipart":"^10.0.0","@fastify/websocket":"^11.2.0","@augment-vir/assert":"^31.71.0","@augment-vir/common":"^31.71.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"c8":"^11.0.0","@types/node":"^25.7.0","istanbul-smart-text-reporter":"^1.1.5"},"peerDependencies":{"object-shape-tester":">=5"},"_npmOperationalInternal":{"tmp":"tmp/host_2.0.0-beta.1_1779819120387_0.20209040517488952","host":"s3://npm-registry-packages-npm-production"}},"2.0.0-beta.2":{"name":"@rest-vir/host","version":"2.0.0-beta.2","keywords":["rest","api","fastify","service","backend","server","websocket","vir"],"author":{"url":"https://github.com/electrovir","name":"electrovir"},"license":"(MIT or CC0 1.0)","_id":"@rest-vir/host@2.0.0-beta.2","maintainers":[{"name":"electrovir","email":"pithy.gut0a@icloud.com"}],"homepage":"https://github.com/electrovir/rest-vir","bugs":{"url":"https://github.com/electrovir/rest-vir/issues"},"dist":{"shasum":"fa4fbc3e74d8b216fa10171fe7fbd25bc231775c","tarball":"https://registry.npmjs.org/@rest-vir/host/-/host-2.0.0-beta.2.tgz","fileCount":62,"integrity":"sha512-Mm0pjRQ5/aQOvnb6loOXcySesgOIJAywuo4Pb7UUI+HmMTbg21qnnxJb7ZfGsXJuuZnq0/5NF1qtuii/JgDdtQ==","signatures":[{"sig":"MEUCIQCJy/n7m+byxXYuXM2CilEIf+FExYDbXkLoOpEF5W5TtQIgQum0Y19moEWxGQYslPwuCd0IinxR+mvHs6EEVJiUR7s=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":176976},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","module":"dist/index.js","engines":{"node":">=22"},"gitHead":"f01b4136a8fa332f413cbbeff3615aa0075e9a00","scripts":{"test":"virmator test node","start":"virmator frontend","compile":"virmator compile","test:docs":"exit 0","test:update":"npm test update","test:coverage":"npm run test coverage"},"_npmUser":{"name":"electrovir","email":"pithy.gut0a@icloud.com"},"repository":{"url":"git+https://github.com/electrovir/rest-vir.git","type":"git"},"_npmVersion":"11.15.0","description":"Implement a declarative and type safe REST API and host it.","directories":{},"_nodeVersion":"22.19.0","dependencies":{"fastify":"^5.8.5","url-vir":"^2.1.9","date-vir":"^8.3.2","@types/ws":"^8.18.1","type-fest":"^5.6.0","portfinder":"^1.0.38","cluster-vir":"^1.0.1","@rest-vir/api":"^2.0.0-beta.2","light-my-request":"^6.6.0","@augment-vir/node":"^31.71.0","@augment-vir/test":"^31.71.0","@fastify/compress":"^8.3.1","@fastify/multipart":"^10.0.0","@fastify/websocket":"^11.2.0","@augment-vir/assert":"^31.71.0","@augment-vir/common":"^31.71.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"c8":"^11.0.0","@types/node":"^25.7.0","istanbul-smart-text-reporter":"^1.1.5"},"peerDependencies":{"object-shape-tester":">=5"},"_npmOperationalInternal":{"tmp":"tmp/host_2.0.0-beta.2_1779915649066_0.7210986202829073","host":"s3://npm-registry-packages-npm-production"}},"2.0.0-beta.3":{"name":"@rest-vir/host","version":"2.0.0-beta.3","keywords":["rest","api","fastify","service","backend","server","websocket","vir"],"author":{"url":"https://github.com/electrovir","name":"electrovir"},"license":"(MIT or CC0 1.0)","_id":"@rest-vir/host@2.0.0-beta.3","maintainers":[{"name":"electrovir","email":"pithy.gut0a@icloud.com"}],"homepage":"https://github.com/electrovir/rest-vir","bugs":{"url":"https://github.com/electrovir/rest-vir/issues"},"dist":{"shasum":"ff29308c6e24167c117bde89a1942d067e537c2a","tarball":"https://registry.npmjs.org/@rest-vir/host/-/host-2.0.0-beta.3.tgz","fileCount":62,"integrity":"sha512-2memb3M3kOuZ8j0fgse7nV2DVWE6q/T84RRp+DCzns74sYH6r4NCljAKLGI0c6CCuNsvL5BJ7FOzb7RUOPe/JA==","signatures":[{"sig":"MEUCIQC8DPeTA75jsvQJS89LKy97k1WYJQGLwrEXXsnnKxvBewIgQtlYTHHWqlFrU313Usfsbraw3QJW/kcwUf7KCU4XcVg=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":178568},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","module":"dist/index.js","engines":{"node":">=22"},"gitHead":"8105b9f56dcbfb0dafc493eb80f438b4417843c2","scripts":{"test":"virmator test node","start":"virmator frontend","compile":"virmator compile","test:docs":"exit 0","test:update":"npm test update","test:coverage":"npm run test coverage"},"_npmUser":{"name":"electrovir","email":"pithy.gut0a@icloud.com"},"repository":{"url":"git+https://github.com/electrovir/rest-vir.git","type":"git"},"_npmVersion":"11.15.0","description":"Implement a declarative and type safe REST API and host it.","directories":{},"_nodeVersion":"22.19.0","dependencies":{"fastify":"^5.8.5","url-vir":"^2.1.9","date-vir":"^8.3.2","@types/ws":"^8.18.1","type-fest":"^5.6.0","portfinder":"^1.0.38","cluster-vir":"^1.0.1","@rest-vir/api":"^2.0.0-beta.3","light-my-request":"^6.6.0","@augment-vir/node":"^31.71.0","@augment-vir/test":"^31.71.0","@fastify/compress":"^8.3.1","@fastify/multipart":"^10.0.0","@fastify/websocket":"^11.2.0","@augment-vir/assert":"^31.71.0","@augment-vir/common":"^31.71.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"c8":"^11.0.0","@types/node":"^25.7.0","istanbul-smart-text-reporter":"^1.1.5"},"peerDependencies":{"object-shape-tester":">=5"},"_npmOperationalInternal":{"tmp":"tmp/host_2.0.0-beta.3_1779919435095_0.2634509431441008","host":"s3://npm-registry-packages-npm-production"}},"2.0.0-beta.4":{"name":"@rest-vir/host","version":"2.0.0-beta.4","keywords":["rest","api","fastify","service","backend","server","websocket","vir"],"author":{"url":"https://github.com/electrovir","name":"electrovir"},"license":"(MIT or CC0 1.0)","_id":"@rest-vir/host@2.0.0-beta.4","maintainers":[{"name":"electrovir","email":"pithy.gut0a@icloud.com"}],"homepage":"https://github.com/electrovir/rest-vir","bugs":{"url":"https://github.com/electrovir/rest-vir/issues"},"dist":{"shasum":"4378e73d23afebf7680b6628183d5e05bbd14213","tarball":"https://registry.npmjs.org/@rest-vir/host/-/host-2.0.0-beta.4.tgz","fileCount":62,"integrity":"sha512-fN4Wzvqx01VLgrfIXIb3Oyn52XYLJnt6yE5kIs+LZhtKkLq10XfYJYxKZbTitek9NOudEDix9O90h/k/pbqXyA==","signatures":[{"sig":"MEUCIGTGoZ919Yste+frU2I4/ZvLySy4N460drJ7h9rZiJMEAiEAwFZQnXZDTQ8RoSTylVqJihBIPVJG6zTnwOzDx9PITOI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":178568},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","module":"dist/index.js","engines":{"node":">=22"},"gitHead":"1f91fbf60133bb8a40eb5670f7b2246ec6b6baac","scripts":{"test":"virmator test node","start":"virmator frontend","compile":"virmator compile","test:docs":"exit 0","test:update":"npm test update","test:coverage":"npm run test coverage"},"_npmUser":{"name":"electrovir","email":"pithy.gut0a@icloud.com"},"repository":{"url":"git+https://github.com/electrovir/rest-vir.git","type":"git"},"_npmVersion":"11.15.0","description":"Implement a declarative and type safe REST API and host it.","directories":{},"_nodeVersion":"22.19.0","dependencies":{"fastify":"^5.8.5","url-vir":"^2.1.9","date-vir":"^8.3.2","@types/ws":"^8.18.1","type-fest":"^5.6.0","portfinder":"^1.0.38","cluster-vir":"^1.0.1","@rest-vir/api":"^2.0.0-beta.4","light-my-request":"^6.6.0","@augment-vir/node":"^31.71.0","@augment-vir/test":"^31.71.0","@fastify/compress":"^8.3.1","@fastify/multipart":"^10.0.0","@fastify/websocket":"^11.2.0","@augment-vir/assert":"^31.71.0","@augment-vir/common":"^31.71.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"c8":"^11.0.0","@types/node":"^25.7.0","istanbul-smart-text-reporter":"^1.1.5"},"peerDependencies":{"object-shape-tester":">=5"},"_npmOperationalInternal":{"tmp":"tmp/host_2.0.0-beta.4_1780074053238_0.20950965058505422","host":"s3://npm-registry-packages-npm-production"}},"2.0.0":{"name":"@rest-vir/host","version":"2.0.0","keywords":["rest","api","fastify","service","backend","server","websocket","vir"],"author":{"url":"https://github.com/electrovir","name":"electrovir"},"license":"(MIT or CC0 1.0)","_id":"@rest-vir/host@2.0.0","maintainers":[{"name":"electrovir","email":"pithy.gut0a@icloud.com"}],"homepage":"https://github.com/electrovir/rest-vir","bugs":{"url":"https://github.com/electrovir/rest-vir/issues"},"dist":{"shasum":"ceb2c0553747243541f2d183340087dd6451a354","tarball":"https://registry.npmjs.org/@rest-vir/host/-/host-2.0.0.tgz","fileCount":62,"integrity":"sha512-WLk2HKKUBvxS3DAvjxxlA/vi+7ifuiqlY3yLTXoi50wC7TM54KM0U/yM+CGqbNVkjRoKfL89ymQHhl7OMenGJQ==","signatures":[{"sig":"MEYCIQD+VxPyzR/HDZoFSsBX8+yoLViO5KSzv80n/Y7A7xPq+wIhAKWnf5IWFZx20EQIPoV2pN9rd210JfRcLeCCLKsbmIpc","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":185683},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","module":"dist/index.js","engines":{"node":">=22"},"gitHead":"f13043cafcb78f9d8b59e2bc98205e9df6128f3b","scripts":{"test":"virmator test node","start":"virmator frontend","compile":"virmator compile","test:docs":"exit 0","test:update":"npm test update","test:coverage":"npm run test coverage"},"_npmUser":{"name":"electrovir","email":"pithy.gut0a@icloud.com"},"repository":{"url":"git+https://github.com/electrovir/rest-vir.git","type":"git"},"_npmVersion":"11.15.0","description":"Implement a declarative and type safe REST API and host it.","directories":{},"_nodeVersion":"22.19.0","dependencies":{"fastify":"^5.8.5","url-vir":"^2.1.9","date-vir":"^8.3.2","@types/ws":"^8.18.1","type-fest":"^5.6.0","portfinder":"^1.0.38","cluster-vir":"^1.0.1","@rest-vir/api":"^2.0.0","light-my-request":"^6.6.0","@augment-vir/node":"^31.71.0","@augment-vir/test":"^31.71.0","@fastify/compress":"^8.3.1","@fastify/multipart":"^10.0.0","@fastify/websocket":"^11.2.0","@augment-vir/assert":"^31.71.0","@augment-vir/common":"^31.71.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"c8":"^11.0.0","@types/node":"^25.7.0","istanbul-smart-text-reporter":"^1.1.5"},"peerDependencies":{"object-shape-tester":">=5"},"_npmOperationalInternal":{"tmp":"tmp/host_2.0.0_1780152784306_0.8049412843230599","host":"s3://npm-registry-packages-npm-production"}},"2.1.0":{"name":"@rest-vir/host","version":"2.1.0","keywords":["rest","api","fastify","service","backend","server","websocket","vir"],"author":{"url":"https://github.com/electrovir","name":"electrovir"},"license":"(MIT or CC0 1.0)","_id":"@rest-vir/host@2.1.0","maintainers":[{"name":"electrovir","email":"pithy.gut0a@icloud.com"}],"homepage":"https://github.com/electrovir/rest-vir","bugs":{"url":"https://github.com/electrovir/rest-vir/issues"},"dist":{"shasum":"bdfc272e2df2eae06684b1458c33fddc53738d34","tarball":"https://registry.npmjs.org/@rest-vir/host/-/host-2.1.0.tgz","fileCount":64,"integrity":"sha512-8Fo6YiJ+KoBdhqFrRU1eLLmRU/t8KsOUrYe9jU35U9OQJ8XISr87DnPUM84QXa1dm1m5tG4HZz7NwNx3vbGTGg==","signatures":[{"sig":"MEYCIQDuvGwufXbn/NqBP1tbiOdvZJTm8RIfv5EyVamgHlyLpwIhAMyufSIg8Xq2dZOgUPuNsirj5MztTkBn8sVcVH+q5eC2","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":183637},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","module":"dist/index.js","engines":{"node":">=22"},"gitHead":"981305104d1d81541b80e599a621c412bc06d461","scripts":{"test":"virmator test node","start":"virmator frontend","compile":"virmator compile","test:docs":"exit 0","test:update":"npm test update","test:coverage":"npm run test coverage"},"_npmUser":{"name":"electrovir","email":"pithy.gut0a@icloud.com"},"repository":{"url":"git+https://github.com/electrovir/rest-vir.git","type":"git"},"_npmVersion":"11.15.0","description":"Implement a declarative and type safe REST API and host it.","directories":{},"_nodeVersion":"22.19.0","dependencies":{"fastify":"^5.8.5","url-vir":"^2.1.9","date-vir":"^8.3.2","@types/ws":"^8.18.1","type-fest":"^5.6.0","portfinder":"^1.0.38","cluster-vir":"^1.0.1","@rest-vir/api":"^2.1.0","light-my-request":"^6.6.0","@augment-vir/node":"^31.71.0","@augment-vir/test":"^31.71.0","@fastify/compress":"^8.3.1","@fastify/multipart":"^10.0.0","@fastify/websocket":"^11.2.0","@augment-vir/assert":"^31.71.0","@augment-vir/common":"^31.71.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"c8":"^11.0.0","@types/node":"^25.7.0","istanbul-smart-text-reporter":"^1.1.5"},"peerDependencies":{"object-shape-tester":">=5"},"_npmOperationalInternal":{"tmp":"tmp/host_2.1.0_1780409642606_0.9295207423709824","host":"s3://npm-registry-packages-npm-production"}},"2.1.1":{"name":"@rest-vir/host","version":"2.1.1","keywords":["rest","api","fastify","service","backend","server","websocket","vir"],"author":{"url":"https://github.com/electrovir","name":"electrovir"},"license":"(MIT or CC0 1.0)","_id":"@rest-vir/host@2.1.1","maintainers":[{"name":"electrovir","email":"pithy.gut0a@icloud.com"}],"homepage":"https://github.com/electrovir/rest-vir","bugs":{"url":"https://github.com/electrovir/rest-vir/issues"},"dist":{"shasum":"dd6b8e3b97854b06cc2089d7576bddfe9cb91695","tarball":"https://registry.npmjs.org/@rest-vir/host/-/host-2.1.1.tgz","fileCount":64,"integrity":"sha512-CHHsPgoRj/dMeZziAxen3y9d71gPLygI9B9palOuOoVIi2LaNKF7Ol0YHQsa8LsYd1gaLAiKC2kIa/vfvrNkHw==","signatures":[{"sig":"MEUCIDKxLCJVw72uho88stfry1Txp1WbQX4Ywrpup0lILYjSAiEA3XoP6p8GB4dyuJWRj9agTr9eof54w70IMIKAwoNW5bk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":183637},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","module":"dist/index.js","engines":{"node":">=22"},"gitHead":"a3e46f8599cb27ab6ea942aa6e210dca37606941","scripts":{"test":"virmator test node","start":"virmator frontend","compile":"virmator compile","test:docs":"exit 0","test:update":"npm test update","test:coverage":"npm run test coverage"},"_npmUser":{"name":"electrovir","email":"pithy.gut0a@icloud.com"},"repository":{"url":"git+https://github.com/electrovir/rest-vir.git","type":"git"},"_npmVersion":"11.15.0","description":"Implement a declarative and type safe REST API and host it.","directories":{},"_nodeVersion":"22.19.0","dependencies":{"fastify":"^5.8.5","url-vir":"^2.1.9","date-vir":"^8.3.2","@types/ws":"^8.18.1","type-fest":"^5.6.0","portfinder":"^1.0.38","cluster-vir":"^1.0.1","@rest-vir/api":"^2.1.1","light-my-request":"^6.6.0","@augment-vir/node":"^31.71.0","@augment-vir/test":"^31.71.0","@fastify/compress":"^8.3.1","@fastify/multipart":"^10.0.0","@fastify/websocket":"^11.2.0","@augment-vir/assert":"^31.71.0","@augment-vir/common":"^31.71.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"c8":"^11.0.0","@types/node":"^25.7.0","istanbul-smart-text-reporter":"^1.1.5"},"peerDependencies":{"object-shape-tester":">=5"},"_npmOperationalInternal":{"tmp":"tmp/host_2.1.1_1780413295946_0.5410956261399189","host":"s3://npm-registry-packages-npm-production"}},"2.2.0":{"name":"@rest-vir/host","version":"2.2.0","keywords":["rest","api","fastify","service","backend","server","websocket","vir"],"author":{"url":"https://github.com/electrovir","name":"electrovir"},"license":"(MIT OR CC0-1.0)","_id":"@rest-vir/host@2.2.0","maintainers":[{"name":"electrovir","email":"pithy.gut0a@icloud.com"}],"homepage":"https://github.com/electrovir/rest-vir","bugs":{"url":"https://github.com/electrovir/rest-vir/issues"},"dist":{"shasum":"2c508f2787935c2d9cf0ca793f5fe394ad528046","tarball":"https://registry.npmjs.org/@rest-vir/host/-/host-2.2.0.tgz","fileCount":64,"integrity":"sha512-rQCIsnrK5Di+jZ14FuXnuGxCEBgzFtUFa11d3FvCqJTbM+vgeeKkUTL2AfQLYLJWd9sZodQFycOltOku8CrTlg==","signatures":[{"sig":"MEQCIHLK0P8bNgcarlVS8SXdKZyUkBWX1IQ6R+9FCKv96MbaAiAMvB7SfEUVDK1NuEwHAlMO08K5DnwZDM/NGy+IuKQ94w==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":192919},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","module":"dist/index.js","engines":{"node":">=22"},"gitHead":"7de5c48349df40d4b27444625813439b6c30ab10","scripts":{"test":"virmator test node","start":"virmator frontend","compile":"virmator compile","test:update":"npm test update","test:coverage":"npm run test coverage"},"_npmUser":{"name":"electrovir","email":"pithy.gut0a@icloud.com"},"repository":{"url":"git+https://github.com/electrovir/rest-vir.git","type":"git"},"_npmVersion":"11.15.0","description":"Implement a declarative and type safe REST API and host it.","directories":{},"_nodeVersion":"22.19.0","dependencies":{"fastify":"^5.8.5","url-vir":"^2.1.9","date-vir":"^8.3.2","@types/ws":"^8.18.1","type-fest":"^5.6.0","portfinder":"^1.0.38","cluster-vir":"^1.0.1","@rest-vir/api":"^2.2.0","light-my-request":"^6.6.0","@augment-vir/node":"^31.71.0","@augment-vir/test":"^31.71.0","@fastify/compress":"^8.3.1","@fastify/multipart":"^10.0.0","@fastify/websocket":"^11.2.0","@augment-vir/assert":"^31.71.0","@augment-vir/common":"^31.71.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"c8":"^11.0.0","typedoc":"^0.28.19","@types/node":"^25.7.0","istanbul-smart-text-reporter":"^1.1.5","markdown-code-example-inserter":"^3.0.5"},"peerDependencies":{"object-shape-tester":">=5"},"_npmOperationalInternal":{"tmp":"tmp/host_2.2.0_1780626855865_0.6584141345826908","host":"s3://npm-registry-packages-npm-production"}},"2.2.1":{"name":"@rest-vir/host","version":"2.2.1","keywords":["rest","api","fastify","service","backend","server","websocket","vir"],"author":{"url":"https://github.com/electrovir","name":"electrovir"},"license":"(MIT OR CC0-1.0)","_id":"@rest-vir/host@2.2.1","maintainers":[{"name":"electrovir","email":"pithy.gut0a@icloud.com"}],"homepage":"https://github.com/electrovir/rest-vir","bugs":{"url":"https://github.com/electrovir/rest-vir/issues"},"dist":{"shasum":"acc7d6a3f17b55514c56afe4c5d704fcb7f48015","tarball":"https://registry.npmjs.org/@rest-vir/host/-/host-2.2.1.tgz","fileCount":64,"integrity":"sha512-ON87nZiksVh+Hi0IEqzyO6chSW8C5DCTEBmO63dqbHxUmi3JhM4ymrLmu2ReJx2r+35DL/dJZHQ0B5FBo1F+lg==","signatures":[{"sig":"MEUCIQCtlOIGH0Ph5rqq/CxNiFHlvc7nHWPZtNLTQAZXOm9yXgIgH/mz5C/nQIcnCq3FFpDY6kWTpdySoN96TlmOUVldlEI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":193700},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","module":"dist/index.js","engines":{"node":">=22"},"gitHead":"9b6fe5e0a4d3697537dc651c147bda7532aad265","scripts":{"test":"virmator test node","start":"virmator frontend","compile":"virmator compile","test:update":"npm test update","test:coverage":"npm run test coverage"},"_npmUser":{"name":"electrovir","email":"pithy.gut0a@icloud.com"},"repository":{"url":"git+https://github.com/electrovir/rest-vir.git","type":"git"},"_npmVersion":"11.17.0","description":"Implement a declarative and type safe REST API and host it.","directories":{},"_nodeVersion":"22.22.3","dependencies":{"fastify":"^5.10.0","url-vir":"^2.1.9","date-vir":"^8.6.2","@types/ws":"^8.18.1","portfinder":"^1.0.38","cluster-vir":"^1.0.1","@rest-vir/api":"^2.2.1","light-my-request":"^6.6.0","@augment-vir/node":"^32.2.1","@augment-vir/test":"^32.2.1","@fastify/compress":"^9.0.0","@fastify/multipart":"^10.0.0","@fastify/websocket":"^11.2.0","@augment-vir/assert":"^32.2.1","@augment-vir/common":"^32.2.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"c8":"^12.0.0","typedoc":"^0.28.20","@types/node":"^26.1.1","istanbul-smart-text-reporter":"^1.1.5","markdown-code-example-inserter":"^3.0.6"},"peerDependencies":{"object-shape-tester":">=5"},"_npmOperationalInternal":{"tmp":"tmp/host_2.2.1_1785185205789_0.5545974506264539","host":"s3://npm-registry-packages-npm-production"}},"2.3.0":{"name":"@rest-vir/host","version":"2.3.0","keywords":["rest","api","fastify","service","backend","server","websocket","vir"],"author":{"url":"https://github.com/electrovir","name":"electrovir"},"license":"(MIT OR CC0-1.0)","_id":"@rest-vir/host@2.3.0","maintainers":[{"name":"electrovir","email":"pithy.gut0a@icloud.com"}],"homepage":"https://github.com/electrovir/rest-vir","bugs":{"url":"https://github.com/electrovir/rest-vir/issues"},"dist":{"shasum":"d568510e95eae14c28dfd19332c05b083a455c05","tarball":"https://registry.npmjs.org/@rest-vir/host/-/host-2.3.0.tgz","fileCount":64,"integrity":"sha512-BCaEpPzegvxAz9/nIJFIFuMDQncfdg8RRMcKC0p8beGqhSt0w8qKI0Buwzh63pLFC05tmXonANeJlneiAEbj0A==","signatures":[{"sig":"MEUCIQDaoP5OFfp7TuKdysJVcbC3oHQyBNM2lXkytkgRS376JQIgOcjtOxg3ZI74IyW++jir3CjPXiig7SR4ekbRihJ4mlM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":193766},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","module":"dist/index.js","engines":{"node":">=22"},"gitHead":"68419eb8de741e1b92aca48fc403629090e53788","scripts":{"test":"virmator test node","start":"virmator frontend","compile":"virmator compile","test:update":"npm test update","test:coverage":"npm run test coverage"},"_npmUser":{"name":"electrovir","email":"pithy.gut0a@icloud.com"},"repository":{"url":"git+https://github.com/electrovir/rest-vir.git","type":"git"},"_npmVersion":"11.17.0","description":"Implement a declarative and type safe REST API and host it.","directories":{},"sideEffects":false,"_nodeVersion":"22.22.3","dependencies":{"fastify":"^5.11.2","url-vir":"^2.2.1","date-vir":"^9.0.0","@types/ws":"^8.18.1","portfinder":"^1.0.38","cluster-vir":"^1.0.2","@rest-vir/api":"^2.3.0","light-my-request":"^6.6.0","@augment-vir/node":"^32.2.1","@augment-vir/test":"^32.2.1","@fastify/compress":"^9.1.1","@fastify/multipart":"^10.1.0","@fastify/websocket":"^11.3.0","@augment-vir/assert":"^32.2.1","@augment-vir/common":"^32.2.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"c8":"^12.0.0","typedoc":"^0.28.20","@types/node":"^26.2.0","istanbul-smart-text-reporter":"^1.1.5","markdown-code-example-inserter":"^3.0.6"},"peerDependencies":{"object-shape-tester":">=5"},"_npmOperationalInternal":{"tmp":"tmp/host_2.3.0_1786592297100_0.5562102649698009","host":"s3://npm-registry-packages-npm-production"}},"2.3.1":{"name":"@rest-vir/host","version":"2.3.1","keywords":["rest","api","fastify","service","backend","server","websocket","vir"],"author":{"url":"https://github.com/electrovir","name":"electrovir"},"license":"(MIT OR CC0-1.0)","_id":"@rest-vir/host@2.3.1","maintainers":[{"name":"electrovir","email":"pithy.gut0a@icloud.com"}],"homepage":"https://github.com/electrovir/rest-vir","bugs":{"url":"https://github.com/electrovir/rest-vir/issues"},"dist":{"shasum":"85e191fe1afdf382db439e504e2c269226bbe45f","tarball":"https://registry.npmjs.org/@rest-vir/host/-/host-2.3.1.tgz","fileCount":64,"integrity":"sha512-KIKdFp5UTF3Gf7g48Nv2hSOGKN5hwZgYasU6cqvkks3THBXxvFjK+VbClCpbBULKysAWdOAKPOvQKA7LcYP+mQ==","signatures":[{"sig":"MEUCIQCNPA3RHFn3wtGP35vZQTVF8IXne5Es4wXBIE7svIRzJgIgIZ1/nwt59BXnTQTNriykFLQ9L1AMlic2f2DJ55fytdk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":193766},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","module":"dist/index.js","engines":{"node":">=22"},"gitHead":"9ee9d41a1778fe042f7d16604d1f30512221b92b","scripts":{"test":"virmator test node","start":"virmator frontend","compile":"virmator compile","test:update":"npm test update","test:coverage":"npm run test coverage"},"_npmUser":{"name":"electrovir","email":"pithy.gut0a@icloud.com"},"repository":{"url":"git+https://github.com/electrovir/rest-vir.git","type":"git"},"_npmVersion":"11.17.0","description":"Implement a declarative and type safe REST API and host it.","directories":{},"sideEffects":false,"_nodeVersion":"22.22.3","dependencies":{"fastify":"^5.11.2","url-vir":"^2.2.1","date-vir":"^9.0.0","@types/ws":"^8.18.1","portfinder":"^1.0.38","cluster-vir":"^1.0.2","@rest-vir/api":"^2.3.1","light-my-request":"^6.6.0","@augment-vir/node":"^32.2.1","@augment-vir/test":"^32.2.1","@fastify/compress":"^9.1.1","@fastify/multipart":"^10.1.0","@fastify/websocket":"^11.3.0","@augment-vir/assert":"^32.2.1","@augment-vir/common":"^32.2.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"c8":"^12.0.0","typedoc":"^0.28.20","@types/node":"^26.2.0","istanbul-smart-text-reporter":"^1.1.5","markdown-code-example-inserter":"^3.0.6"},"peerDependencies":{"object-shape-tester":">=5"},"_npmOperationalInternal":{"tmp":"tmp/host_2.3.1_1786593872612_0.7811301345110144","host":"s3://npm-registry-packages-npm-production"}},"2.3.2":{"name":"@rest-vir/host","version":"2.3.2","keywords":["rest","api","fastify","service","backend","server","websocket","vir"],"author":{"url":"https://github.com/electrovir","name":"electrovir"},"license":"(MIT OR CC0-1.0)","_id":"@rest-vir/host@2.3.2","maintainers":[{"name":"electrovir","email":"pithy.gut0a@icloud.com"}],"homepage":"https://github.com/electrovir/rest-vir","bugs":{"url":"https://github.com/electrovir/rest-vir/issues"},"dist":{"shasum":"813bf5c4b118be0c4d15108b5706e51c9aa6070a","tarball":"https://registry.npmjs.org/@rest-vir/host/-/host-2.3.2.tgz","fileCount":66,"integrity":"sha512-gWTo6t6PD+CBhI6mYtYZ+uq0EkiHVoyk8evyzw8JDDCT3/Ts5xPW+qkEWpcryF/eehI3vTGiujXs6sPbvxqUWA==","signatures":[{"sig":"MEUCIQDgrN5DYRguOUBODm4NVD1Lw1pPHjDQb43JgWDQf+qOdQIgBSjYKDxZJgWlFTfp9OzgrYLpcAkZpAjCWx3PJ9v20TY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":203283},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","module":"dist/index.js","engines":{"node":">=22"},"gitHead":"1edc8a667f7056347c193f9dbba96c68008e74e2","scripts":{"test":"virmator test node","start":"virmator frontend","compile":"virmator compile","test:update":"npm test update","test:coverage":"npm run test coverage"},"_npmUser":{"name":"electrovir","email":"pithy.gut0a@icloud.com"},"repository":{"url":"git+https://github.com/electrovir/rest-vir.git","type":"git"},"_npmVersion":"11.17.0","description":"Implement a declarative and type safe REST API and host it.","directories":{},"sideEffects":false,"_nodeVersion":"24.16.0","dependencies":{"fastify":"^5.12.1","url-vir":"^2.2.1","date-vir":"^9.1.1","@types/ws":"^8.18.1","portfinder":"^1.0.38","cluster-vir":"^1.0.2","find-my-way":"^9.9.0","@rest-vir/api":"^2.3.2","light-my-request":"^6.6.0","@augment-vir/node":"^32.2.3","@augment-vir/test":"^32.2.3","@fastify/compress":"^9.2.0","@fastify/multipart":"^10.1.1","@fastify/websocket":"^11.3.0","@augment-vir/assert":"^32.2.3","@augment-vir/common":"^32.2.3"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"c8":"^12.0.0","typedoc":"^0.28.20","@types/node":"^26.3.0","istanbul-smart-text-reporter":"^1.1.5","markdown-code-example-inserter":"^3.0.6"},"peerDependencies":{"object-shape-tester":">=5"},"_npmOperationalInternal":{"tmp":"tmp/host_2.3.2_1788204391289_0.22631668245762704","host":"s3://npm-registry-packages-npm-production"}},"2.3.3":{"_id":"@rest-vir/host@2.3.3","bugs":{"url":"https://github.com/electrovir/rest-vir/issues"},"dist":{"shasum":"5d34aab2119a5afeb34ed4f0c773edb79f586543","tarball":"https://registry.npmjs.org/@rest-vir/host/-/host-2.3.3.tgz","fileCount":66,"integrity":"sha512-GLteWs3bR+TrVrd6V9NQqTBGRLqO/Dg35UI8R1Rahx4qK9boetAAcDSBMLZ5ViEYf1dmsGok750c8Rooeo1IHw==","signatures":[{"sig":"MEUCIFMT9Lv+xc70TnmKMM4/q4QPtz2HX1zw9AhU6Veds4z1AiEA33jY7hp3LM8qorIbl+Lsecuy7zrzah0mNMgez//twH4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQD+aXzEdLfdN6ixMuNOfoTJPXGcFVMPuylOQSa5gKS0aAIgQUgv9Yvx5Z0Y24mYOtBjVoJ0lDGsBaMyfm6PDi8PAXI="}],"unpackedSize":206930},"main":"dist/index.js","name":"@rest-vir/host","type":"module","types":"dist/index.d.ts","author":{"url":"https://github.com/electrovir","name":"electrovir"},"module":"dist/index.js","engines":{"node":">=22"},"gitHead":"f9a0beaff26600952195108cb228eb37c9139290","license":"(MIT OR CC0-1.0)","scripts":{"test":"virmator test node","start":"virmator frontend","compile":"virmator compile","test:update":"npm test update","test:coverage":"npm run test coverage"},"version":"2.3.3","_npmUser":{"name":"electrovir","email":"pithy.gut0a@icloud.com"},"homepage":"https://github.com/electrovir/rest-vir","keywords":["rest","api","fastify","service","backend","server","websocket","vir"],"repository":{"url":"git+https://github.com/electrovir/rest-vir.git","type":"git"},"_npmVersion":"11.17.0","description":"Implement a declarative and type safe REST API and host it.","directories":{},"maintainers":[{"name":"electrovir","email":"pithy.gut0a@icloud.com"}],"sideEffects":false,"_nodeVersion":"24.16.0","dependencies":{"fastify":"^5.12.5","url-vir":"^2.2.2","date-vir":"^9.1.1","@types/ws":"^8.18.1","portfinder":"^1.0.38","cluster-vir":"^1.0.2","find-my-way":"^9.9.0","@rest-vir/api":"^2.3.3","light-my-request":"^6.6.0","@augment-vir/node":"^32.3.1","@augment-vir/test":"^32.3.1","@fastify/compress":"^9.2.0","@fastify/multipart":"^10.1.1","@fastify/websocket":"^11.3.0","@augment-vir/assert":"^32.3.1","@augment-vir/common":"^32.3.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"c8":"^12.0.0","typedoc":"^0.28.20","@types/node":"^26.6.1","istanbul-smart-text-reporter":"^1.1.5","markdown-code-example-inserter":"^3.0.6"},"peerDependencies":{"object-shape-tester":">=5"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/host_2.3.3_1790019811543_0.3893653052655093"}}},"time":{"created":"2026-05-26T14:46:56.704Z","modified":"2026-09-21T19:43:31.830Z","2.0.0-beta.0":"2026-05-26T14:46:56.994Z","2.0.0-beta.1":"2026-05-26T18:12:00.612Z","2.0.0-beta.2":"2026-05-27T21:00:49.285Z","2.0.0-beta.3":"2026-05-27T22:03:55.255Z","2.0.0-beta.4":"2026-05-29T17:00:53.398Z","2.0.0":"2026-05-30T14:53:04.448Z","2.1.0":"2026-06-02T14:14:02.748Z","2.1.1":"2026-06-02T15:14:56.086Z","2.2.0":"2026-06-05T02:34:16.010Z","2.2.1":"2026-07-27T20:46:45.931Z","2.3.0":"2026-08-13T03:38:17.244Z","2.3.1":"2026-08-13T04:04:32.758Z","2.3.2":"2026-08-31T19:26:31.411Z","2.3.3":"2026-09-21T19:43:31.640Z"},"bugs":{"url":"https://github.com/electrovir/rest-vir/issues"},"author":{"url":"https://github.com/electrovir","name":"electrovir"},"license":"(MIT OR CC0-1.0)","homepage":"https://github.com/electrovir/rest-vir","keywords":["rest","api","fastify","service","backend","server","websocket","vir"],"repository":{"url":"git+https://github.com/electrovir/rest-vir.git","type":"git"},"description":"Implement a declarative and type safe REST API and host it.","maintainers":[{"name":"electrovir","email":"pithy.gut0a@icloud.com"}],"readme":"# @rest-vir/host\n\n`@rest-vir/host` is the Fastify runtime for an API defined with `@rest-vir/api`.\n\nUse it to:\n\n-   implement typed endpoint methods and WebSocket listeners\n-   create per-request host context\n-   validate request bodies, search params, headers, and WebSocket messages\n-   run a new Fastify server or attach routes to an existing one\n-   test implementations with real request and response objects\n\nSee the full reference docs at https://electrovir.github.io/rest-vir.\n\nFor a working package example, see\n[`packages/demo`](https://github.com/electrovir/rest-vir/tree/dev/packages/demo) on GitHub.\n\n## Install\n\n```sh\nnpm i @rest-vir/host @rest-vir/api object-shape-tester\n```\n\n`@rest-vir/api` provides the shared API definition. `object-shape-tester` provides the runtime shapes used by that definition.\n\n## Implement And Run An API\n\n<!-- example-link: src/examples/start-api-server.example.ts -->\n\n```TypeScript\nimport {defineApi, defineEndpoint, HttpMethod, HttpStatus} from '@rest-vir/api';\nimport {createApiImplementor, implementApi, startApiServer} from '@rest-vir/host';\nimport {defineShape} from 'object-shape-tester';\n\nexport const healthEndpoint = defineEndpoint({\n    path: '/health',\n    requests: {\n        [HttpMethod.Get]: {\n            responses: {\n                [HttpStatus.Ok]: {\n                    responseData: defineShape({\n                        status: '',\n                    }),\n                },\n            },\n        },\n    },\n});\n\nconst myApi = defineApi({\n    apiName: 'my-api',\n    endpoints: [\n        healthEndpoint,\n    ],\n    webSockets: [],\n});\n\nconst {implementEndpoint} = createApiImplementor<undefined>()(myApi);\n\nexport const healthImplementation = implementEndpoint(healthEndpoint, {\n    [HttpMethod.Get]() {\n        return {\n            [HttpStatus.Ok]: {\n                responseData: {\n                    status: 'ok',\n                },\n            },\n        };\n    },\n});\n\nexport const apiImplementation = implementApi<undefined>()(myApi, {\n    createHostContext: () => ({\n        context: undefined,\n    }),\n    endpoints: [healthImplementation],\n});\n\nconst {kill} = await startApiServer(apiImplementation, {\n    port: 3000,\n    externalOrigin: 'http://localhost:3000',\n});\n\n// later, to shut down:\nawait kill();\n```\n\n`implementApi` accepts arrays of implementations. It validates that every endpoint and WebSocket declared by the API definition has exactly one matching implementation.\n\n## Host Context\n\n`createHostContext` runs before endpoint and WebSocket handlers. Return `{context}` to pass typed context into every implementation callback.\n\n<!-- example-link: src/examples/host-context.example.ts -->\n\n```TypeScript\nimport {defineApi, defineEndpoint, HttpMethod, HttpStatus} from '@rest-vir/api';\nimport {createApiImplementor, implementApi} from '@rest-vir/host';\nimport {defineShape} from 'object-shape-tester';\n\nconst healthEndpoint = defineEndpoint({\n    path: '/health',\n    requests: {\n        [HttpMethod.Get]: {\n            responses: {\n                [HttpStatus.Ok]: {\n                    responseData: defineShape({\n                        requestId: '',\n                    }),\n                },\n            },\n        },\n    },\n});\n\nconst myApi = defineApi({\n    apiName: 'my-api',\n    endpoints: [\n        healthEndpoint,\n    ],\n    webSockets: [],\n});\n\ntype HostContext = {\n    requestId: string;\n};\n\nconst {implementEndpoint} = createApiImplementor<HostContext>()(myApi);\n\nconst healthImplementation = implementEndpoint(healthEndpoint, {\n    [HttpMethod.Get]({context}) {\n        return {\n            [HttpStatus.Ok]: {\n                responseData: {\n                    requestId: context.requestId,\n                },\n            },\n        };\n    },\n});\n\nexport const apiImplementation = implementApi<HostContext>()(myApi, {\n    createHostContext() {\n        return {\n            context: {\n                requestId: crypto.randomUUID(),\n            },\n        };\n    },\n    endpoints: [\n        healthImplementation,\n    ],\n});\n```\n\n`createHostContext` can also reject a request by returning `{reject}` with a status code, response data, and optional headers.\n\n## WebSocket Implementations\n\n<!-- example-link: src/examples/web-socket-implementation.example.ts -->\n\n```TypeScript\nimport {defineApi, defineWebSocket} from '@rest-vir/api';\nimport {createApiImplementor, implementApi} from '@rest-vir/host';\nimport {defineShape} from 'object-shape-tester';\n\nconst echoWebSocket = defineWebSocket({\n    path: '/ws/echo',\n    clientMessage: defineShape({\n        value: '',\n    }),\n    hostMessage: defineShape({\n        value: '',\n    }),\n});\n\nconst api = defineApi({\n    apiName: 'socket-api',\n    endpoints: [],\n    webSockets: [\n        echoWebSocket,\n    ],\n});\n\nconst implementor = createApiImplementor<undefined>()(api);\n\nconst echoImplementation = implementor.implementWebSocket(echoWebSocket, {\n    message({message, webSocket}) {\n        webSocket.send({\n            value: message.value,\n        });\n    },\n});\n\nexport const apiImplementation = implementApi<undefined>()(api, {\n    createHostContext() {\n        return {\n            context: undefined,\n        };\n    },\n    webSockets: [\n        echoImplementation,\n    ],\n});\n```\n\nWebSocket listeners may implement `open`, `message`, and `close`. Incoming client messages are validated before `message` runs.\n\n## Attach To An Existing Fastify Server\n\n<!-- example-link: src/examples/attach-api.example.ts -->\n\n```TypeScript\nimport {attachApi} from '@rest-vir/host';\nimport fastify from 'fastify';\nimport {apiImplementation} from './basic-api-implementation.example.js';\n\nconst server = fastify();\n\nawait attachApi(server, apiImplementation, {\n    externalOrigin: 'http://localhost:3000',\n});\n\nawait server.listen({\n    port: 3000,\n});\n```\n\n`attachApi` registers compression and WebSocket support automatically. Multipart support is registered only when an endpoint uses `formDataShape()`.\n\n## CORS And Origins\n\nIf no `clientOriginRequirement` is set on a route or on `implementApi`, all origins are allowed. Set `clientOriginRequirement` for production APIs.\n\nAccepted origin requirements come from `@rest-vir/api`:\n\n-   exact origin string\n-   `RegExp`\n-   callback returning `true` or `false`\n-   `AnyOrigin`\n-   `{anyOrigin: true}`\n-   `{anyOriginWithCredentials: true}`\n\nPer-route requirements override the API-level requirement.\n\n## Runtime Options\n\n`startApiServer(api, options)` requires `externalOrigin`, which is the public origin clients use to reach the API. Common options include:\n\n-   `port`: listen port, defaulting to `3000`\n-   `host`: listen host, defaulting to `localhost`\n-   `workerCount`: number of worker processes, defaulting to CPU count minus one\n-   `bodyLimit`: maximum HTTP request body size\n-   `webSocketMaxPayload`: maximum inbound WebSocket message size\n-   `connectionTimeout`, `keepAliveTimeout`, and `requestTimeout`\n-   `trustProxy`: Fastify proxy trust configuration\n\n`startApiServer` serves plaintext HTTP. Terminate TLS in a reverse proxy or configure your own Fastify instance and use `attachApi`.\n\n## Testing\n\nUse `testApi` for integration tests without manually managing a server:\n\n<!-- example-link: src/examples/test-api.example.ts -->\n\n```TypeScript\nimport {HttpMethod} from '@rest-vir/api';\nimport {condenseResponse, testApi} from '@rest-vir/host';\nimport {apiImplementation, healthEndpoint} from './basic-api-implementation.example.js';\n\nconst {fetchEndpoint, kill} = await testApi(apiImplementation);\n\nconst response = await fetchEndpoint(healthEndpoint, HttpMethod.Get);\n\nconsole.info(await condenseResponse(response));\n\nawait kill();\n```\n\n`describeEndpoint` wraps `testEndpoint` in table-driven tests:\n\n<!-- example-link: src/examples/describe-endpoint.example.ts -->\n\n```TypeScript\nimport {HttpStatus} from '@rest-vir/api';\nimport {describeEndpoint} from '@rest-vir/host';\nimport {healthImplementation} from './basic-api-implementation.example.js';\n\nfunction createHostContext() {\n    return {\n        context: undefined,\n    };\n}\n\ndescribeEndpoint(healthImplementation, ({endpointCases}) => {\n    endpointCases.GET({createHostContext}, [\n        {\n            it: 'responds with ok',\n            input: {},\n            expect: {\n                response: {\n                    [HttpStatus.Ok]: {\n                        body: {\n                            status: 'ok',\n                        },\n                    },\n                },\n            },\n        },\n    ]);\n});\n```\n\n`testApi` uses Fastify request injection by default, so it does not need a real port. Pass a `port` option when you need full network behavior. `describeApi`, `describeEndpoint`, `testEndpoint`, and `testWebSocket` are also exported for focused tests.\n","readmeFilename":"README.md"}