{"_id":"wasmcart","_rev":"30-1de305058b27cd73d8a5b830d0ebb2db","name":"wasmcart","dist-tags":{"latest":"0.25.1"},"versions":{"0.2.0":{"name":"wasmcart","version":"0.2.0","keywords":["wasm","webassembly","cartridge","game","sandbox","emulator","retro"],"author":{"name":"Luis Montes"},"license":"MIT","_id":"wasmcart@0.2.0","maintainers":[{"name":"monteslu","email":"monteslu@gmail.com"}],"homepage":"https://github.com/monteslu/wasmcart#readme","bugs":{"url":"https://github.com/monteslu/wasmcart/issues"},"bin":{"wasmcart-pack":"bin/wasmcart-pack.js"},"dist":{"shasum":"e7529b597dacb2f8549d9810137e59cf2563ddb8","tarball":"https://registry.npmjs.org/wasmcart/-/wasmcart-0.2.0.tgz","fileCount":27,"integrity":"sha512-QYEFBRxodGRkTvX7nVjI1UeO5Mi0Bxzdqo7nOF0RoFgOpDTMqqC04X542LAx0xo8/NVysASHCkNvxynSdljkHg==","signatures":[{"sig":"MEYCIQCT2TZlGGoRUEhsyZhwZ6YkAMcMc/FeffG+nyz+TgOMUQIhAKYGPR1v/HplnzmOAf64C7fvkXhPB/pHnxNkUZJzyPwn","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":324926},"main":"index.js","type":"module","engines":{"node":">=22.0.0"},"exports":{".":{"browser":"./web.js","default":"./index.js"},"./web":"./web.js"},"gitHead":"087375c1922457339b4942bed3983b8bde53681e","scripts":{"test":"node --test 'test/**/*.test.js'","prepublishOnly":"npm test"},"_npmUser":{"name":"monteslu","email":"monteslu@gmail.com"},"repository":{"url":"git+https://github.com/monteslu/wasmcart.git","type":"git"},"_npmVersion":"11.13.0","description":"WASM cartridge host - load and run sandboxed .wasm and .wasc game carts","directories":{},"_nodeVersion":"24.16.0","dependencies":{"yazl":"^2.5.1","yauzl":"^3.2.0","fflate":"^0.8.3"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/wasmcart_0.2.0_1782916779537_0.6530049141957297","host":"s3://npm-registry-packages-npm-production"}},"0.3.0":{"name":"wasmcart","version":"0.3.0","keywords":["wasm","webassembly","cartridge","game","sandbox","emulator","retro"],"author":{"name":"Luis Montes"},"license":"MIT","_id":"wasmcart@0.3.0","maintainers":[{"name":"monteslu","email":"monteslu@gmail.com"}],"homepage":"https://github.com/monteslu/wasmcart#readme","bugs":{"url":"https://github.com/monteslu/wasmcart/issues"},"bin":{"wasmcart-pack":"bin/wasmcart-pack.js"},"dist":{"shasum":"106dce0f81df2d7fe05cc6b981a2be7cf298d036","tarball":"https://registry.npmjs.org/wasmcart/-/wasmcart-0.3.0.tgz","fileCount":27,"integrity":"sha512-1YVO04a3pc7jCmT3vpu9wasdGNo0gPXs9oxdMeFOHFAZBvXk32dAfX7qxD9PMEDHXin83Sk5sqUKFkk4CX0bIw==","signatures":[{"sig":"MEYCIQDYwEiq5z6QHUVdTBQ91fMQvj/BWIs8vhoLHrYLneX5WgIhAJ7091ukvbJIgVm9PKhD9iHfeKCvuqX4a12c/b/R4c7x","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":326384},"main":"index.js","type":"module","engines":{"node":">=22.0.0"},"exports":{".":{"browser":"./web.js","default":"./index.js"},"./web":"./web.js"},"gitHead":"1f95e114fc7375e4a4712faab646f6518a832025","scripts":{"test":"node --test 'test/**/*.test.js'","prepublishOnly":"npm test"},"_npmUser":{"name":"monteslu","email":"monteslu@gmail.com"},"repository":{"url":"git+https://github.com/monteslu/wasmcart.git","type":"git"},"_npmVersion":"11.13.0","description":"WASM cartridge host - load and run sandboxed .wasm and .wasc game carts","directories":{},"_nodeVersion":"24.16.0","dependencies":{"yazl":"^2.5.1","yauzl":"^3.2.0","fflate":"^0.8.3"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/wasmcart_0.3.0_1782931290493_0.45984578592240233","host":"s3://npm-registry-packages-npm-production"}},"0.4.0":{"name":"wasmcart","version":"0.4.0","keywords":["wasm","webassembly","cartridge","game","sandbox","emulator","retro"],"author":{"name":"Luis Montes"},"license":"MIT","_id":"wasmcart@0.4.0","maintainers":[{"name":"monteslu","email":"monteslu@gmail.com"}],"homepage":"https://github.com/monteslu/wasmcart#readme","bugs":{"url":"https://github.com/monteslu/wasmcart/issues"},"bin":{"wasmcart-pack":"bin/wasmcart-pack.js"},"dist":{"shasum":"3713ef355cd6036bd6144e0c562ef7fb1915835b","tarball":"https://registry.npmjs.org/wasmcart/-/wasmcart-0.4.0.tgz","fileCount":27,"integrity":"sha512-pzO5l1gelAntGPpVK/QMKt5YDm+xczFyNK92J9pp/8KQPHodILXfOYbMIWjos5s2406EMl0o3s2SYT0t9tS8kQ==","signatures":[{"sig":"MEQCICTYySAGs2VggnZrwgaHH6a/0Jxn2FTuYpxirRv7DTfOAiB7GqVRxfTtxwJMByGrkSlmNWvmH4QF4D/4jI5DBzWsyA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":337622},"main":"index.js","type":"module","engines":{"node":">=22.0.0"},"exports":{".":{"browser":"./web.js","default":"./index.js"},"./web":"./web.js"},"gitHead":"df876856e4ff277d8ed965e5edafeb3c7adec148","scripts":{"test":"node --test 'test/**/*.test.js'","prepublishOnly":"npm test"},"_npmUser":{"name":"monteslu","email":"monteslu@gmail.com"},"repository":{"url":"git+https://github.com/monteslu/wasmcart.git","type":"git"},"_npmVersion":"11.13.0","description":"WASM cartridge host - load and run sandboxed .wasm and .wasc game carts","directories":{},"_nodeVersion":"24.16.0","dependencies":{"yazl":"^2.5.1","yauzl":"^3.2.0","fflate":"^0.8.3"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/wasmcart_0.4.0_1784837909139_0.7366545718622952","host":"s3://npm-registry-packages-npm-production"}},"0.5.0":{"name":"wasmcart","version":"0.5.0","keywords":["wasm","webassembly","cartridge","game","sandbox","emulator","retro"],"author":{"name":"Luis Montes"},"license":"MIT","_id":"wasmcart@0.5.0","maintainers":[{"name":"monteslu","email":"monteslu@gmail.com"}],"homepage":"https://github.com/monteslu/wasmcart#readme","bugs":{"url":"https://github.com/monteslu/wasmcart/issues"},"bin":{"wasmcart":"bin/wasmcart.js","wasmcart-pack":"bin/wasmcart-pack.js","wasmcart-play":"bin/wasmcart-play.js"},"dist":{"shasum":"aacde2183e1555c22481a9c5f83b51e22865280b","tarball":"https://registry.npmjs.org/wasmcart/-/wasmcart-0.5.0.tgz","fileCount":31,"integrity":"sha512-YnXKBisiIMIU/fgmMyFgJh2dhlDTdS8A5uDOprNe0sQpkqL4zMam1yQIyZ9klNgSDVxvft6McZdf+7J56IZJHg==","signatures":[{"sig":"MEQCIDwJK5TIad6d8TV4WVWydU6g2KJKjgkCM5UGKBujBzbwAiAlxz07OhPDYX4DY94685D/xcBKQHvoN+wuil5KGOIhuA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":378479},"main":"index.js","type":"module","engines":{"node":">=22.0.0"},"exports":{".":{"browser":"./web.js","default":"./index.js"},"./web":"./web.js"},"gitHead":"a2603939f567180e55559f01707b7eb52759ef0a","scripts":{"test":"node --test 'test/**/*.test.js'","prepublishOnly":"npm test"},"_npmUser":{"name":"monteslu","email":"monteslu@gmail.com"},"repository":{"url":"git+https://github.com/monteslu/wasmcart.git","type":"git"},"_npmVersion":"11.13.0","description":"WASM cartridge host - load and run sandboxed .wasm and .wasc game carts","directories":{},"_nodeVersion":"24.16.0","dependencies":{"yazl":"^2.5.1","yauzl":"^3.2.0","fflate":"^0.8.3","webgl-node":"^1.2.0","@kmamal/sdl":"^0.11.13"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/wasmcart_0.5.0_1784859380042_0.7757866479466355","host":"s3://npm-registry-packages-npm-production"}},"0.6.0":{"name":"wasmcart","version":"0.6.0","keywords":["wasm","webassembly","cartridge","game","sandbox","emulator","retro"],"author":{"name":"Luis Montes"},"license":"MIT","_id":"wasmcart@0.6.0","maintainers":[{"name":"monteslu","email":"monteslu@gmail.com"}],"homepage":"https://github.com/monteslu/wasmcart#readme","bugs":{"url":"https://github.com/monteslu/wasmcart/issues"},"bin":{"wasmcart":"bin/wasmcart.js","wasmcart-pack":"bin/wasmcart-pack.js","wasmcart-play":"bin/wasmcart-play.js"},"dist":{"shasum":"03130dd9fd6b13219ba26048e057ffeb2538f5aa","tarball":"https://registry.npmjs.org/wasmcart/-/wasmcart-0.6.0.tgz","fileCount":31,"integrity":"sha512-Z970iEnvblV7f344T54XMZ1id3grVlfKgzHZ8AfQxg2ZKxz0hkq6IrOtVJOsQooYsJhrq48aI6qFW941kMp5xA==","signatures":[{"sig":"MEUCIGstd+6KVs8pe1htnR/0NUJahO2lohUXWMVZHbmKn82UAiEA4RElRTWBGguVi7Fao48kkqFFL8b2WZERcZzTGMMGd5g=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":383685},"main":"index.js","type":"module","engines":{"node":">=22.0.0"},"exports":{".":{"browser":"./web.js","default":"./index.js"},"./web":"./web.js"},"gitHead":"a1b61506fdf9331e706a9eca3de9fbd6de51aafb","scripts":{"test":"node --test 'test/**/*.test.js'","prepublishOnly":"npm test"},"_npmUser":{"name":"monteslu","email":"monteslu@gmail.com"},"repository":{"url":"git+https://github.com/monteslu/wasmcart.git","type":"git"},"_npmVersion":"11.13.0","description":"WASM cartridge host - load and run sandboxed .wasm and .wasc game carts","directories":{},"_nodeVersion":"24.16.0","dependencies":{"yazl":"^2.5.1","yauzl":"^3.2.0","fflate":"^0.8.3","webgl-node":"^1.2.0","@kmamal/sdl":"^0.11.13"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/wasmcart_0.6.0_1785030185513_0.8090150601706216","host":"s3://npm-registry-packages-npm-production"}},"0.7.0":{"name":"wasmcart","version":"0.7.0","keywords":["wasm","webassembly","cartridge","game","sandbox","emulator","retro"],"author":{"name":"Luis Montes"},"license":"MIT","_id":"wasmcart@0.7.0","maintainers":[{"name":"monteslu","email":"monteslu@gmail.com"}],"homepage":"https://github.com/monteslu/wasmcart#readme","bugs":{"url":"https://github.com/monteslu/wasmcart/issues"},"bin":{"wasmcart":"bin/wasmcart.js","wasmcart-pack":"bin/wasmcart-pack.js","wasmcart-play":"bin/wasmcart-play.js"},"dist":{"shasum":"87aaef746bd06c824f0c0e55f58e8965949b7e9a","tarball":"https://registry.npmjs.org/wasmcart/-/wasmcart-0.7.0.tgz","fileCount":33,"integrity":"sha512-ZOFED6NzcFCmza864Xf7opy/nUHs28yxn8AwUyI5weO0yVFzeS1qvL6ESa5uqNt5lvCe8zmu8z42u+/0I8gOFA==","signatures":[{"sig":"MEQCID96soMbkuJrUzNtb+HaIl5SvQ6ZyaJnrbZ7qU93BR8bAiAlnmtZyDWVUUsI9TwPg9h8VL40RIjVVFT1Y1x/CGFcqQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":428702},"main":"index.js","type":"module","engines":{"node":">=22.0.0"},"exports":{".":{"browser":"./web.js","default":"./index.js"},"./web":"./web.js"},"gitHead":"3759b9bc13f3f50e7277e3c5709c5bc30f4103cd","scripts":{"test":"node --test 'test/**/*.test.js'","prepublishOnly":"npm test"},"_npmUser":{"name":"monteslu","email":"monteslu@gmail.com"},"repository":{"url":"git+https://github.com/monteslu/wasmcart.git","type":"git"},"_npmVersion":"11.13.0","description":"WASM cartridge host - load and run sandboxed .wasm and .wasc game carts","directories":{},"_nodeVersion":"24.16.0","dependencies":{"yazl":"^2.5.1","yauzl":"^3.2.0","fflate":"^0.8.3","webgl-node":"^1.2.0","@kmamal/sdl":"^0.11.13"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/wasmcart_0.7.0_1785263710355_0.4995700381675261","host":"s3://npm-registry-packages-npm-production"}},"0.8.0":{"name":"wasmcart","version":"0.8.0","keywords":["wasm","webassembly","cartridge","game","sandbox","emulator","retro"],"author":{"name":"Luis Montes"},"license":"MIT","_id":"wasmcart@0.8.0","maintainers":[{"name":"monteslu","email":"monteslu@gmail.com"}],"homepage":"https://github.com/monteslu/wasmcart#readme","bugs":{"url":"https://github.com/monteslu/wasmcart/issues"},"bin":{"wasmcart":"bin/wasmcart.js","wasmcart-pack":"bin/wasmcart-pack.js","wasmcart-play":"bin/wasmcart-play.js"},"dist":{"shasum":"3675b930e7eac46a8e8a2af7ae5e886c7912acd7","tarball":"https://registry.npmjs.org/wasmcart/-/wasmcart-0.8.0.tgz","fileCount":33,"integrity":"sha512-d/B2iTQ2Va/rdF6mUiRRS2r/kwRhJAPocbsEq0C8TZcG9cGEZ5u8H8e9cvGXYb9MSl24178irMDof/c/SVv2kg==","signatures":[{"sig":"MEQCIDD4JGd93htltaJCxynFayMm8VJGKHpsJqh1h1wn1y4eAiAHxraBRbeogl/+CaZI7tjXL48XAUdVmrlc1m1/2VDA1Q==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":435648},"main":"index.js","type":"module","engines":{"node":">=22.0.0"},"exports":{".":{"browser":"./web.js","default":"./index.js"},"./web":"./web.js"},"gitHead":"5a2d9f3ec318827f0d44a5c61154c75bb3954c30","scripts":{"test":"node --test 'test/**/*.test.js'","prepublishOnly":"npm test"},"_npmUser":{"name":"monteslu","email":"monteslu@gmail.com"},"repository":{"url":"git+https://github.com/monteslu/wasmcart.git","type":"git"},"_npmVersion":"11.13.0","description":"WASM cartridge host - load and run sandboxed .wasm and .wasc game carts","directories":{},"_nodeVersion":"24.16.0","dependencies":{"yazl":"^2.5.1","yauzl":"^3.2.0","fflate":"^0.8.3","webgl-node":"^1.2.0","@kmamal/sdl":"^0.11.13"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/wasmcart_0.8.0_1785265273354_0.06356708124033528","host":"s3://npm-registry-packages-npm-production"}},"0.9.0":{"name":"wasmcart","version":"0.9.0","keywords":["wasm","webassembly","cartridge","game","sandbox","emulator","retro"],"author":{"name":"Luis Montes"},"license":"MIT","_id":"wasmcart@0.9.0","maintainers":[{"name":"monteslu","email":"monteslu@gmail.com"}],"homepage":"https://github.com/monteslu/wasmcart#readme","bugs":{"url":"https://github.com/monteslu/wasmcart/issues"},"bin":{"wasmcart":"bin/wasmcart.js","wasmcart-pack":"bin/wasmcart-pack.js","wasmcart-play":"bin/wasmcart-play.js"},"dist":{"shasum":"01a5e29e7e0d8aa1f4d06d75ed94161ee07602f3","tarball":"https://registry.npmjs.org/wasmcart/-/wasmcart-0.9.0.tgz","fileCount":33,"integrity":"sha512-PmAV847jmts696zFlcktWhQhMgy0x+qUl2wgjihIEPf2FGkGt93njHl//rLdyB6RuljaNL8y2i8r9VlO0joc7g==","signatures":[{"sig":"MEYCIQDcldEI6uf7qelzvKi+RuTvx6d1QQNfZLrL2ZYFWKswpwIhAKml8//AvR4PXEoqb6cd15v6D0IEnvH2GXzFvDCzfHGe","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":438381},"main":"index.js","type":"module","engines":{"node":">=22.0.0"},"exports":{".":{"browser":"./web.js","default":"./index.js"},"./web":"./web.js"},"gitHead":"6b57069eb7795a78ba4e98b74d2a8345c79b8179","scripts":{"test":"node --test 'test/**/*.test.js'","prepublishOnly":"npm test"},"_npmUser":{"name":"monteslu","email":"monteslu@gmail.com"},"repository":{"url":"git+https://github.com/monteslu/wasmcart.git","type":"git"},"_npmVersion":"11.13.0","description":"WASM cartridge host - load and run sandboxed .wasm and .wasc game carts","directories":{},"_nodeVersion":"24.16.0","dependencies":{"yazl":"^2.5.1","yauzl":"^3.2.0","fflate":"^0.8.3","webgl-node":"^1.2.0","@kmamal/sdl":"^0.11.13"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/wasmcart_0.9.0_1785266348096_0.6428039645309698","host":"s3://npm-registry-packages-npm-production"}},"0.9.1":{"name":"wasmcart","version":"0.9.1","keywords":["wasm","webassembly","cartridge","game","sandbox","emulator","retro"],"author":{"name":"Luis Montes"},"license":"MIT","_id":"wasmcart@0.9.1","maintainers":[{"name":"monteslu","email":"monteslu@gmail.com"}],"homepage":"https://github.com/monteslu/wasmcart#readme","bugs":{"url":"https://github.com/monteslu/wasmcart/issues"},"bin":{"wasmcart":"bin/wasmcart.js","wasmcart-pack":"bin/wasmcart-pack.js","wasmcart-play":"bin/wasmcart-play.js"},"dist":{"shasum":"8d9edcc77fbbce247d4c45884aafd120449a53cc","tarball":"https://registry.npmjs.org/wasmcart/-/wasmcart-0.9.1.tgz","fileCount":33,"integrity":"sha512-hyTJ6gOyukIc5z3GfmHJfP4wjPb1iagnPJ8qPhcOBmaz0pGNRXFYr14YdQvQmd8sYfKHm86Dex1Y6nX2uvt4uA==","signatures":[{"sig":"MEYCIQCBTSM/HEwsYTJs7a/BXp/oNq8K/rq7uamAW3NaYq+PeAIhAOvFWEPwSR2DslME7WlPDXbql/y8mqO4vAzQ3ugUGRFE","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":440825},"main":"index.js","type":"module","engines":{"node":">=22.0.0"},"exports":{".":{"browser":"./web.js","default":"./index.js"},"./web":"./web.js"},"gitHead":"8e2c2e43088133b10943d3754e9ab8a251d76960","scripts":{"test":"node --test 'test/**/*.test.js'","prepublishOnly":"npm test"},"_npmUser":{"name":"monteslu","email":"monteslu@gmail.com"},"repository":{"url":"git+https://github.com/monteslu/wasmcart.git","type":"git"},"_npmVersion":"11.13.0","description":"WASM cartridge host - load and run sandboxed .wasm and .wasc game carts","directories":{},"_nodeVersion":"24.16.0","dependencies":{"yazl":"^2.5.1","yauzl":"^3.2.0","fflate":"^0.8.3","webgl-node":"^1.2.0","@kmamal/sdl":"^0.11.13"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/wasmcart_0.9.1_1785266713513_0.6529385436121431","host":"s3://npm-registry-packages-npm-production"}},"0.10.0":{"name":"wasmcart","version":"0.10.0","keywords":["wasm","webassembly","cartridge","game","sandbox","emulator","retro"],"author":{"name":"Luis Montes"},"license":"MIT","_id":"wasmcart@0.10.0","maintainers":[{"name":"monteslu","email":"monteslu@gmail.com"}],"homepage":"https://github.com/monteslu/wasmcart#readme","bugs":{"url":"https://github.com/monteslu/wasmcart/issues"},"bin":{"wasmcart":"bin/wasmcart.js","wasmcart-pack":"bin/wasmcart-pack.js","wasmcart-play":"bin/wasmcart-play.js"},"dist":{"shasum":"423e8c68985ae5bb0d097b712d0321f8c94dc771","tarball":"https://registry.npmjs.org/wasmcart/-/wasmcart-0.10.0.tgz","fileCount":34,"integrity":"sha512-O32YqANK/CDJOR4fD6rAMVYHaPXSxtxX2d7REcoVFgG0/DPo4J3TIPVoynk3WPUzjj2e7a1ks7ZUW4IXPpbs9g==","signatures":[{"sig":"MEQCIGjHXUpRF9uOL4m33mmENgi8Zzj8H9owjIl2MGiwX8rSAiA5dI+TOjF2H4M82qdXoZyRWjsSP78bjUHe0/EtL3WEqQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":450061},"main":"index.js","type":"module","engines":{"node":">=22.0.0"},"exports":{".":{"browser":"./web.js","default":"./index.js"},"./web":"./web.js"},"gitHead":"3d40ac528c74f1d933e348ecf90622c52b78f9a3","scripts":{"test":"node --test 'test/**/*.test.js'","prepublishOnly":"npm test"},"_npmUser":{"name":"monteslu","email":"monteslu@gmail.com"},"repository":{"url":"git+https://github.com/monteslu/wasmcart.git","type":"git"},"_npmVersion":"11.13.0","description":"WASM cartridge host - load and run sandboxed .wasm and .wasc game carts","directories":{},"_nodeVersion":"24.16.0","dependencies":{"yazl":"^2.5.1","yauzl":"^3.2.0","fflate":"^0.8.3","webgl-node":"^1.2.0","@kmamal/sdl":"^0.11.13"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/wasmcart_0.10.0_1785279069868_0.9066837410740927","host":"s3://npm-registry-packages-npm-production"}},"0.10.1":{"name":"wasmcart","version":"0.10.1","keywords":["wasm","webassembly","cartridge","game","sandbox","emulator","retro"],"author":{"name":"Luis Montes"},"license":"MIT","_id":"wasmcart@0.10.1","maintainers":[{"name":"monteslu","email":"monteslu@gmail.com"}],"homepage":"https://github.com/monteslu/wasmcart#readme","bugs":{"url":"https://github.com/monteslu/wasmcart/issues"},"bin":{"wasmcart":"bin/wasmcart.js","wasmcart-pack":"bin/wasmcart-pack.js","wasmcart-play":"bin/wasmcart-play.js"},"dist":{"shasum":"0430068d0122e72dc6310cf2139c58a349284d82","tarball":"https://registry.npmjs.org/wasmcart/-/wasmcart-0.10.1.tgz","fileCount":34,"integrity":"sha512-ldxAJLPmPfljAMLGQ9jdWL3azvBGDdLz9rkfEhZ427+mbaNWCjSAut3W/EXrVlh80Y8GLwEBlpCgeaR2vff5cg==","signatures":[{"sig":"MEYCIQD/MLWxHObDW3JwDoodZ23lnRf34UwUxzi78n01SG27vQIhAOaFLrzOM/pXzGJEDNKR6eCAxNlyL6AoKZia8/+9t/Qm","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":455760},"main":"index.js","type":"module","engines":{"node":">=22.0.0"},"exports":{".":{"browser":"./web.js","default":"./index.js"},"./web":"./web.js"},"gitHead":"b0ecfaf1cadadbf8d3bf75369955e259413bcea0","scripts":{"test":"node --test 'test/**/*.test.js'","prepublishOnly":"npm test"},"_npmUser":{"name":"monteslu","email":"monteslu@gmail.com"},"repository":{"url":"git+https://github.com/monteslu/wasmcart.git","type":"git"},"_npmVersion":"11.13.0","description":"WASM cartridge host - load and run sandboxed .wasm and .wasc game carts","directories":{},"_nodeVersion":"24.16.0","dependencies":{"yazl":"^2.5.1","yauzl":"^3.2.0","fflate":"^0.8.3","webgl-node":"^1.2.0","@kmamal/sdl":"^0.11.13"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/wasmcart_0.10.1_1785280538980_0.17266503149012125","host":"s3://npm-registry-packages-npm-production"}},"0.12.2":{"name":"wasmcart","version":"0.12.2","keywords":["wasm","webassembly","cartridge","game","sandbox","emulator","retro"],"author":{"name":"Luis Montes"},"license":"MIT","_id":"wasmcart@0.12.2","maintainers":[{"name":"monteslu","email":"monteslu@gmail.com"}],"homepage":"https://github.com/monteslu/wasmcart#readme","bugs":{"url":"https://github.com/monteslu/wasmcart/issues"},"bin":{"wasmcart":"bin/wasmcart.js","wasmcart-pack":"bin/wasmcart-pack.js","wasmcart-play":"bin/wasmcart-play.js"},"dist":{"shasum":"d298a41beb497de830e647b805f8cf0292eee1d2","tarball":"https://registry.npmjs.org/wasmcart/-/wasmcart-0.12.2.tgz","fileCount":35,"integrity":"sha512-j5psV2Z3inmOZUQPtN8f5OV901reWir5fyxo8Xlp5UH5vFlafQx59u7p03tHAkmnSrzR13Vln+LIVXpyAfiNBg==","signatures":[{"sig":"MEYCIQCxjPSREAwo3IefYKhIRr6Y3LLsKR50WLAUkHtnqQoldQIhAJg0StyB0TSu+I343GjZZO+jsksQQaR19FqmJTsVwBE6","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":491417},"main":"index.js","type":"module","engines":{"node":">=22.0.0"},"exports":{".":{"browser":"./web.js","default":"./index.js"},"./web":"./web.js"},"gitHead":"73777f55f749e3be6980ec17036332bedb97e12a","scripts":{"test":"node --test 'test/**/*.test.js'","prepublishOnly":"npm test"},"_npmUser":{"name":"monteslu","email":"monteslu@gmail.com"},"repository":{"url":"git+https://github.com/monteslu/wasmcart.git","type":"git"},"_npmVersion":"11.13.0","description":"WASM cartridge host - load and run sandboxed .wasm and .wasc game carts","directories":{},"_nodeVersion":"24.16.0","dependencies":{"yazl":"^2.5.1","yauzl":"^3.2.0","fflate":"^0.8.3","webgl-node":"^1.2.0","@kmamal/sdl":"^0.11.13"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/wasmcart_0.12.2_1785290389366_0.8108775767166687","host":"s3://npm-registry-packages-npm-production"}},"0.13.1":{"name":"wasmcart","version":"0.13.1","keywords":["wasm","webassembly","cartridge","game","sandbox","emulator","retro"],"author":{"name":"Luis Montes"},"license":"MIT","_id":"wasmcart@0.13.1","maintainers":[{"name":"monteslu","email":"monteslu@gmail.com"}],"homepage":"https://github.com/monteslu/wasmcart#readme","bugs":{"url":"https://github.com/monteslu/wasmcart/issues"},"bin":{"wasmcart":"bin/wasmcart.js","wasmcart-pack":"bin/wasmcart-pack.js","wasmcart-play":"bin/wasmcart-play.js"},"dist":{"shasum":"8913ce0c06cd3f14dea0b24060a95792f0a5b103","tarball":"https://registry.npmjs.org/wasmcart/-/wasmcart-0.13.1.tgz","fileCount":35,"integrity":"sha512-6QgSjYp3RKDdJ2saGqZl4+a7J2NWiBc8fgl+04lmTRaycmT9otzMIQF93SmEdkO3TZUlYIdkCOKhaZ5B5usHZQ==","signatures":[{"sig":"MEUCIQDImvSmep9edgAp6818BDspB4Nqt9ekiASyGp1dJA11EAIgZ4kNQudL9hiSbLxrnlcUB2t4nhZn5+vJYmij/kGCcpg=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":503083},"main":"index.js","type":"module","engines":{"node":">=22.0.0"},"exports":{".":{"browser":"./web.js","default":"./index.js"},"./web":"./web.js"},"gitHead":"d1e729caea379c23d8b3b9cbe17f49ff881e5d2a","scripts":{"test":"node --test 'test/**/*.test.js'","prepublishOnly":"npm test"},"_npmUser":{"name":"monteslu","email":"monteslu@gmail.com"},"repository":{"url":"git+https://github.com/monteslu/wasmcart.git","type":"git"},"_npmVersion":"11.13.0","description":"WASM cartridge host - load and run sandboxed .wasm and .wasc game carts","directories":{},"_nodeVersion":"24.16.0","dependencies":{"yazl":"^2.5.1","yauzl":"^3.2.0","fflate":"^0.8.3","webgl-node":"^1.2.0","@kmamal/sdl":"^0.11.13"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/wasmcart_0.13.1_1785302149172_0.9418016733881092","host":"s3://npm-registry-packages-npm-production"}},"0.13.2":{"name":"wasmcart","version":"0.13.2","keywords":["wasm","webassembly","cartridge","game","sandbox","emulator","retro"],"author":{"name":"Luis Montes"},"license":"MIT","_id":"wasmcart@0.13.2","maintainers":[{"name":"monteslu","email":"monteslu@gmail.com"}],"homepage":"https://github.com/monteslu/wasmcart#readme","bugs":{"url":"https://github.com/monteslu/wasmcart/issues"},"bin":{"wasmcart":"bin/wasmcart.js","wasmcart-pack":"bin/wasmcart-pack.js","wasmcart-play":"bin/wasmcart-play.js"},"dist":{"shasum":"ab5197f63152cfd20029ef80acf935c7ca437dd6","tarball":"https://registry.npmjs.org/wasmcart/-/wasmcart-0.13.2.tgz","fileCount":35,"integrity":"sha512-2xfUzS/yeAeg5W57g5uJCwyAc1xxh7uvVmGj0n8MKvqu/a1nCJGvdFHor0ehIwoRv25IT861erV4o8yVQv+qxw==","signatures":[{"sig":"MEQCIBgnZInPQYDzHquBozQhF7duuoWK8TR2ByBrNQNoVxevAiBtDaiMvovt3ny+iyyy2lDz+Pa1pzDlZ6UJP4OIuFT/zQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":506322},"main":"index.js","type":"module","engines":{"node":">=22.0.0"},"exports":{".":{"browser":"./web.js","default":"./index.js"},"./web":"./web.js"},"gitHead":"55a73834ca910eeef13177f5fb1855afcc411986","scripts":{"test":"node --test 'test/**/*.test.js'","prepublishOnly":"npm test"},"_npmUser":{"name":"monteslu","email":"monteslu@gmail.com"},"repository":{"url":"git+https://github.com/monteslu/wasmcart.git","type":"git"},"_npmVersion":"11.13.0","description":"WASM cartridge host - load and run sandboxed .wasm and .wasc game carts","directories":{},"_nodeVersion":"24.16.0","dependencies":{"yazl":"^2.5.1","yauzl":"^3.2.0","fflate":"^0.8.3","webgl-node":"^1.2.0","@kmamal/sdl":"^0.11.13"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/wasmcart_0.13.2_1785307001706_0.7950884107989269","host":"s3://npm-registry-packages-npm-production"}},"0.16.0":{"name":"wasmcart","version":"0.16.0","keywords":["wasm","webassembly","cartridge","game","sandbox","emulator","retro"],"author":{"name":"Luis Montes"},"license":"MIT","_id":"wasmcart@0.16.0","maintainers":[{"name":"monteslu","email":"monteslu@gmail.com"}],"homepage":"https://github.com/monteslu/wasmcart#readme","bugs":{"url":"https://github.com/monteslu/wasmcart/issues"},"bin":{"wasmcart":"bin/wasmcart.js","wasmcart-pack":"bin/wasmcart-pack.js","wasmcart-play":"bin/wasmcart-play.js"},"dist":{"shasum":"a9ffe06a4a3e2dba6b4b5ec3d273d93db676b82f","tarball":"https://registry.npmjs.org/wasmcart/-/wasmcart-0.16.0.tgz","fileCount":35,"integrity":"sha512-c8zlyYZb/vxWLtvjnCCWsKZdj8CxQc1pwsONBVdtR3YGJAK50me03Jbxp4keMn4lUKvGRrfrzb8qUY3N+PyCzA==","signatures":[{"sig":"MEYCIQDWefSN7jjUx17n/vvpq9bsaILVs/1GHKbeaVsI+lxtzgIhAJiUE818GmXBCc0KofpZKpSdFX9hzbXJG5f/9RfQ1uDi","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":562728},"main":"index.js","type":"module","engines":{"node":">=22.0.0"},"exports":{".":{"browser":"./web.js","default":"./index.js"},"./web":"./web.js"},"gitHead":"c4d971de9b624d0b330a4e07ea36c09a1cacd1ad","scripts":{"test":"node --test 'test/**/*.test.js'","prepublishOnly":"npm test"},"_npmUser":{"name":"monteslu","email":"monteslu@gmail.com"},"repository":{"url":"git+https://github.com/monteslu/wasmcart.git","type":"git"},"_npmVersion":"11.13.0","description":"WASM cartridge host - load and run sandboxed .wasm and .wasc game carts","directories":{},"_nodeVersion":"24.16.0","dependencies":{"yazl":"^2.5.1","yauzl":"^3.2.0","fflate":"^0.8.3","webgl-node":"^1.2.0","@kmamal/sdl":"^0.11.13"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/wasmcart_0.16.0_1785348160143_0.8049935192163171","host":"s3://npm-registry-packages-npm-production"}},"0.16.1":{"name":"wasmcart","version":"0.16.1","keywords":["wasm","webassembly","cartridge","game","sandbox","emulator","retro"],"author":{"name":"Luis Montes"},"license":"MIT","_id":"wasmcart@0.16.1","maintainers":[{"name":"monteslu","email":"monteslu@gmail.com"}],"homepage":"https://github.com/monteslu/wasmcart#readme","bugs":{"url":"https://github.com/monteslu/wasmcart/issues"},"bin":{"wasmcart":"bin/wasmcart.js","wasmcart-pack":"bin/wasmcart-pack.js","wasmcart-play":"bin/wasmcart-play.js"},"dist":{"shasum":"5c9377eaacef3027ee8ccdf62ef5a399bbc414c3","tarball":"https://registry.npmjs.org/wasmcart/-/wasmcart-0.16.1.tgz","fileCount":35,"integrity":"sha512-Ltxz25t4IgwEY/lIq0IepycIPEc/hRru69Fiz3YBgWoxBs9MF/Op+K1tc6wuRAlpMyDEiQ3M6JmtQwz/RJIbNg==","signatures":[{"sig":"MEUCIHFPdS8lPqKl5c8oSxGnYCc3+spj03NXrijnIgwN9qyoAiEA67aY7obV7YjC5n2TvUtmf64sNKzaKGLnTXRyddqAhig=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":569675},"main":"index.js","type":"module","engines":{"node":">=22.0.0"},"exports":{".":{"browser":"./web.js","default":"./index.js"},"./web":"./web.js"},"gitHead":"968b32bf120c7464524eb4a4e2f525a3217bb012","scripts":{"test":"node --test 'test/**/*.test.js'","test:browser":"node test/browser.test.mjs","prepublishOnly":"npm test"},"_npmUser":{"name":"monteslu","email":"monteslu@gmail.com"},"repository":{"url":"git+https://github.com/monteslu/wasmcart.git","type":"git"},"_npmVersion":"11.13.0","description":"WASM cartridge host - load and run sandboxed .wasm and .wasc game carts","directories":{},"_nodeVersion":"24.16.0","dependencies":{"yazl":"^2.5.1","yauzl":"^3.2.0","fflate":"^0.8.3","webgl-node":"^1.2.0","@kmamal/sdl":"^0.11.13"},"_hasShrinkwrap":false,"devDependencies":{"playwright":"^1.62.0"},"_npmOperationalInternal":{"tmp":"tmp/wasmcart_0.16.1_1785352175976_0.20084298349306096","host":"s3://npm-registry-packages-npm-production"}},"0.16.2":{"name":"wasmcart","version":"0.16.2","keywords":["wasm","webassembly","cartridge","game","sandbox","emulator","retro"],"author":{"name":"Luis Montes"},"license":"MIT","_id":"wasmcart@0.16.2","maintainers":[{"name":"monteslu","email":"monteslu@gmail.com"}],"homepage":"https://github.com/monteslu/wasmcart#readme","bugs":{"url":"https://github.com/monteslu/wasmcart/issues"},"bin":{"wasmcart":"bin/wasmcart.js","wasmcart-pack":"bin/wasmcart-pack.js","wasmcart-play":"bin/wasmcart-play.js"},"dist":{"shasum":"9ac7481ea2d921d9418b7773a5ed4d7b9e98f079","tarball":"https://registry.npmjs.org/wasmcart/-/wasmcart-0.16.2.tgz","fileCount":35,"integrity":"sha512-mO8AV1IbIR5kqLq+jVnnPzWYmp3sA535/+nQOztkerdBcZTe53vGWQWzMhIYrf7vqk6uuezYahL0kp09U+jRnA==","signatures":[{"sig":"MEQCIFcnaCHz7D2btg1O9ks3NOghdXypKsFZN9HCs6UEugYNAiB0gBHIHTmVoxHq6NmZ9zo7YdqObgGkdT2NYLQPGMzuwQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":577064},"main":"index.js","type":"module","engines":{"node":">=22.0.0"},"exports":{".":{"browser":"./web.js","default":"./index.js"},"./web":"./web.js"},"gitHead":"e7e05a83b0e95a488e51be0596d742d865cca90e","scripts":{"test":"node --test 'test/**/*.test.js'","test:browser":"node test/browser.test.mjs","prepublishOnly":"npm test"},"_npmUser":{"name":"monteslu","email":"monteslu@gmail.com"},"repository":{"url":"git+https://github.com/monteslu/wasmcart.git","type":"git"},"_npmVersion":"11.13.0","description":"WASM cartridge host - load and run sandboxed .wasm and .wasc game carts","directories":{},"_nodeVersion":"24.16.0","dependencies":{"yazl":"^2.5.1","yauzl":"^3.2.0","fflate":"^0.8.3","webgl-node":"^1.2.0","@kmamal/sdl":"^0.11.13"},"_hasShrinkwrap":false,"devDependencies":{"playwright":"^1.62.0"},"_npmOperationalInternal":{"tmp":"tmp/wasmcart_0.16.2_1785368781825_0.4782066012074526","host":"s3://npm-registry-packages-npm-production"}},"0.16.3":{"name":"wasmcart","version":"0.16.3","keywords":["wasm","webassembly","cartridge","game","sandbox","emulator","retro"],"author":{"name":"Luis Montes"},"license":"MIT","_id":"wasmcart@0.16.3","maintainers":[{"name":"monteslu","email":"monteslu@gmail.com"}],"homepage":"https://github.com/monteslu/wasmcart#readme","bugs":{"url":"https://github.com/monteslu/wasmcart/issues"},"bin":{"wasmcart":"bin/wasmcart.js","wasmcart-pack":"bin/wasmcart-pack.js","wasmcart-play":"bin/wasmcart-play.js"},"dist":{"shasum":"d27d044319b71b4d7747bef5fa85fb63b520bca0","tarball":"https://registry.npmjs.org/wasmcart/-/wasmcart-0.16.3.tgz","fileCount":35,"integrity":"sha512-Vnb2qf08DUnMMPuhozaN++l5dYJSVNI6bT+u4BMP4VApYOx8NN/l8Mcv6QNfxfRmqudEBFDxnwBOtR/LXJMjLQ==","signatures":[{"sig":"MEYCIQCCEfgD8TBbpCYa/f2Ou56lQ8iG8QznvRKi0d8KKhkBFgIhAN9qw8l1p8f4RNCSsuC/sTAnwx1GzF8KNZcZQlTWCAHD","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":580765},"main":"index.js","type":"module","engines":{"node":">=22.0.0"},"exports":{".":{"browser":"./web.js","default":"./index.js"},"./web":"./web.js"},"gitHead":"0240bb396bc9125dfe7f0b654cfeeaa3d57f7db1","scripts":{"test":"node --test 'test/**/*.test.js'","test:browser":"node test/browser.test.mjs","prepublishOnly":"npm test"},"_npmUser":{"name":"monteslu","email":"monteslu@gmail.com"},"repository":{"url":"git+https://github.com/monteslu/wasmcart.git","type":"git"},"_npmVersion":"11.13.0","description":"WASM cartridge host - load and run sandboxed .wasm and .wasc game carts","directories":{},"_nodeVersion":"24.16.0","dependencies":{"yazl":"^2.5.1","yauzl":"^3.2.0","fflate":"^0.8.3","webgl-node":"^1.2.0","@kmamal/sdl":"^0.11.13"},"_hasShrinkwrap":false,"devDependencies":{"playwright":"^1.62.0"},"_npmOperationalInternal":{"tmp":"tmp/wasmcart_0.16.3_1785452935454_0.21598844364572867","host":"s3://npm-registry-packages-npm-production"}},"0.17.0":{"name":"wasmcart","version":"0.17.0","keywords":["wasm","webassembly","cartridge","game","sandbox","emulator","retro"],"author":{"name":"Luis Montes"},"license":"MIT","_id":"wasmcart@0.17.0","maintainers":[{"name":"monteslu","email":"monteslu@gmail.com"}],"homepage":"https://github.com/monteslu/wasmcart#readme","bugs":{"url":"https://github.com/monteslu/wasmcart/issues"},"bin":{"wasmcart":"bin/wasmcart.js","wasmcart-pack":"bin/wasmcart-pack.js","wasmcart-play":"bin/wasmcart-play.js"},"dist":{"shasum":"af08526bd10e2cf8ea9f1058a753ef0cf8e89072","tarball":"https://registry.npmjs.org/wasmcart/-/wasmcart-0.17.0.tgz","fileCount":35,"integrity":"sha512-GqUxKDlkE4FvygUTnPskhNBkQClN/Hg7sPboaS9dzXQdt2anspE847kHRIIPjOg9GG52hetZOlL2RHgIh6l/Wg==","signatures":[{"sig":"MEYCIQDcbl6pbNjrTEgNMUEfDwyTqOcaViGr6p4D1vy5ux1uOgIhAMDjTCGityYX38TcVYNeOuJcI8crRChaxYpa1MXjMEli","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":598658},"main":"index.js","type":"module","engines":{"node":">=22.0.0"},"exports":{".":{"browser":"./web.js","default":"./index.js"},"./web":"./web.js"},"gitHead":"1b6f3cfb44faaf49932b5a2fb558d1c5c32e64d2","scripts":{"test":"node --test 'test/**/*.test.js'","test:browser":"node test/browser.test.mjs","prepublishOnly":"npm test"},"_npmUser":{"name":"monteslu","email":"monteslu@gmail.com"},"repository":{"url":"git+https://github.com/monteslu/wasmcart.git","type":"git"},"_npmVersion":"10.9.2","description":"WASM cartridge host - load and run sandboxed .wasm and .wasc game carts","directories":{},"_nodeVersion":"22.16.0","dependencies":{"yazl":"^2.5.1","yauzl":"^3.2.0","fflate":"^0.8.3","webgl-node":"^1.2.0","@kmamal/sdl":"^0.11.13"},"_hasShrinkwrap":false,"devDependencies":{"playwright":"^1.62.0"},"_npmOperationalInternal":{"tmp":"tmp/wasmcart_0.17.0_1785958900181_0.17371420149435246","host":"s3://npm-registry-packages-npm-production"}},"0.18.0":{"name":"wasmcart","version":"0.18.0","keywords":["wasm","webassembly","cartridge","game","sandbox","emulator","retro"],"author":{"name":"Luis Montes"},"license":"MIT","_id":"wasmcart@0.18.0","maintainers":[{"name":"monteslu","email":"monteslu@gmail.com"}],"homepage":"https://github.com/monteslu/wasmcart#readme","bugs":{"url":"https://github.com/monteslu/wasmcart/issues"},"bin":{"wasmcart":"bin/wasmcart.js","wasmcart-pack":"bin/wasmcart-pack.js","wasmcart-play":"bin/wasmcart-play.js"},"dist":{"shasum":"ab59a2658bb91458055ce80eee05a4b8a9f48be9","tarball":"https://registry.npmjs.org/wasmcart/-/wasmcart-0.18.0.tgz","fileCount":35,"integrity":"sha512-+mSVnq77gnCo4k8G6Rq0X0i+Cv8S0kdsZfja75P9dCaKhB+8CjIQovRj26hrLRdLCoRLVxoBkMIwgDNyOBxCCA==","signatures":[{"sig":"MEYCIQCz2a0ycBUzZeIFL8yQTJsrD8/ahz2mATHiPzjUTXF/TQIhALyVmd3YT9+71kk89fVqPdKR++fiUq8BdvV25HK1xgKY","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":600091},"main":"index.js","type":"module","engines":{"node":">=22.0.0"},"exports":{".":{"browser":"./web.js","default":"./index.js"},"./web":"./web.js"},"gitHead":"3ee9ee04447a7386e642a9ddef4bee136ed25a2b","scripts":{"test":"node --test 'test/**/*.test.js'","test:browser":"node test/browser.test.mjs","prepublishOnly":"npm test"},"_npmUser":{"name":"monteslu","email":"monteslu@gmail.com"},"repository":{"url":"git+https://github.com/monteslu/wasmcart.git","type":"git"},"_npmVersion":"11.13.0","description":"WASM cartridge host - load and run sandboxed .wasm and .wasc game carts","directories":{},"_nodeVersion":"24.16.0","dependencies":{"yazl":"^2.5.1","yauzl":"^3.2.0","fflate":"^0.8.3","webgl-node":"^1.3.0","@kmamal/sdl":"^0.11.13"},"_hasShrinkwrap":false,"devDependencies":{"playwright":"^1.62.0"},"_npmOperationalInternal":{"tmp":"tmp/wasmcart_0.18.0_1786143443181_0.6184436834761837","host":"s3://npm-registry-packages-npm-production"}},"0.19.0":{"name":"wasmcart","version":"0.19.0","keywords":["wasm","webassembly","cartridge","game","sandbox","emulator","retro"],"author":{"name":"Luis Montes"},"license":"MIT","_id":"wasmcart@0.19.0","maintainers":[{"name":"monteslu","email":"monteslu@gmail.com"}],"homepage":"https://github.com/monteslu/wasmcart#readme","bugs":{"url":"https://github.com/monteslu/wasmcart/issues"},"bin":{"wasmcart":"bin/wasmcart.js","wasmcart-pack":"bin/wasmcart-pack.js","wasmcart-play":"bin/wasmcart-play.js"},"dist":{"shasum":"a45921a450e0ebb4b0e78419ea1c150b78f4071b","tarball":"https://registry.npmjs.org/wasmcart/-/wasmcart-0.19.0.tgz","fileCount":35,"integrity":"sha512-4TB6apyF4Baksr4sycsldVcBMFHNeVn5ZxSwNa1BsvY6YR5e1ZseLXnD0ybyRuGBn/HOapKT54Gt5HdNDOgpLg==","signatures":[{"sig":"MEUCIQCe+qnx0VtZGqSxnOQoIiGYRve1S8vzhxSlLzVJS0sMSgIgJnPTl/IlNjopjz4fJTfKzb4mgISqXEXoqbDEWTcBYOk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":604373},"main":"index.js","type":"module","engines":{"node":">=22.0.0"},"exports":{".":{"browser":"./web.js","default":"./index.js"},"./web":"./web.js"},"gitHead":"d1bc4e2068919cbc03b77930fe38572f9740e9fe","scripts":{"test":"node --test 'test/**/*.test.js'","test:browser":"node test/browser.test.mjs","prepublishOnly":"npm test"},"_npmUser":{"name":"monteslu","email":"monteslu@gmail.com"},"repository":{"url":"git+https://github.com/monteslu/wasmcart.git","type":"git"},"_npmVersion":"11.13.0","description":"WASM cartridge host - load and run sandboxed .wasm and .wasc game carts","directories":{},"_nodeVersion":"24.16.0","dependencies":{"yazl":"^2.5.1","yauzl":"^3.2.0","fflate":"^0.8.3","webgl-node":"^1.3.0","@kmamal/sdl":"^0.11.13"},"_hasShrinkwrap":false,"devDependencies":{"playwright":"^1.62.0"},"_npmOperationalInternal":{"tmp":"tmp/wasmcart_0.19.0_1786413247589_0.5655377427750838","host":"s3://npm-registry-packages-npm-production"}},"0.21.0":{"name":"wasmcart","version":"0.21.0","keywords":["wasm","webassembly","cartridge","game","sandbox","emulator","retro"],"author":{"name":"Luis Montes"},"license":"MIT","_id":"wasmcart@0.21.0","maintainers":[{"name":"monteslu","email":"monteslu@gmail.com"}],"homepage":"https://github.com/monteslu/wasmcart#readme","bugs":{"url":"https://github.com/monteslu/wasmcart/issues"},"bin":{"wasmcart":"bin/wasmcart.js","wasmcart-pack":"bin/wasmcart-pack.js","wasmcart-play":"bin/wasmcart-play.js"},"dist":{"shasum":"e40477d01041dfad4dd08a00cc2e9b95a1fdd04e","tarball":"https://registry.npmjs.org/wasmcart/-/wasmcart-0.21.0.tgz","fileCount":35,"integrity":"sha512-c0OXzYSxRt37EMRfVkC5OiSFvXNdpFw3v9lHT5TTzFopqYAfNMhYMwLckew/fabIEQ+1qg3QLl7EqZLE+OtPmw==","signatures":[{"sig":"MEUCIBB1x4IdFPFG6I93CuAz+XSQSrLF5lQsJRFGjiVF3dxrAiEAwI91dbne6zUG0OTVwK8s7EWvaizSxAGhnfYE+t9pZSQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":614785},"main":"index.js","type":"module","engines":{"node":">=22.0.0"},"exports":{".":{"browser":"./web.js","default":"./index.js"},"./web":"./web.js"},"gitHead":"88d108facd3d7fc1a5b5b1eedbb1ed0cd0cb1972","scripts":{"test":"node --test 'test/**/*.test.js'","test:browser":"node test/browser.test.mjs","prepublishOnly":"npm test"},"_npmUser":{"name":"monteslu","email":"monteslu@gmail.com"},"repository":{"url":"git+https://github.com/monteslu/wasmcart.git","type":"git"},"_npmVersion":"11.13.0","description":"WASM cartridge host - load and run sandboxed .wasm and .wasc game carts","directories":{},"_nodeVersion":"24.16.0","dependencies":{"yazl":"^2.5.1","yauzl":"^3.2.0","fflate":"^0.8.3","webgl-node":"^1.3.0","@kmamal/sdl":"^0.11.13"},"_hasShrinkwrap":false,"devDependencies":{"playwright":"^1.62.0"},"_npmOperationalInternal":{"tmp":"tmp/wasmcart_0.21.0_1786483350479_0.6032276670213748","host":"s3://npm-registry-packages-npm-production"}},"0.21.1":{"name":"wasmcart","version":"0.21.1","keywords":["wasm","webassembly","cartridge","game","sandbox","emulator","retro"],"author":{"name":"Luis Montes"},"license":"MIT","_id":"wasmcart@0.21.1","maintainers":[{"name":"monteslu","email":"monteslu@gmail.com"}],"homepage":"https://github.com/monteslu/wasmcart#readme","bugs":{"url":"https://github.com/monteslu/wasmcart/issues"},"bin":{"wasmcart":"bin/wasmcart.js","wasmcart-pack":"bin/wasmcart-pack.js","wasmcart-play":"bin/wasmcart-play.js"},"dist":{"shasum":"a579027277daeb863079e299994eeb251ad3d976","tarball":"https://registry.npmjs.org/wasmcart/-/wasmcart-0.21.1.tgz","fileCount":35,"integrity":"sha512-xZhRIQEheCxhZ2apsJSan6GfT9xTdZNj8tpwF+OmJ4MhFzuAcxAdey22fbsk3pBk0QLSztzDVft9hhBXwKq6jw==","signatures":[{"sig":"MEQCID2nJ9OBGnALgGTThnbxyI8Dikq4qHETJoM56dn8/GwDAiB5UcK49RM70CoUZ0Ypj2dHZxcZlfrcEe82lOffKRe2hw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":615560},"main":"index.js","type":"module","engines":{"node":">=22.0.0"},"exports":{".":{"browser":"./web.js","default":"./index.js"},"./web":"./web.js"},"gitHead":"13d79fef0c26bc83608cb9da2f036e61f5aa530a","scripts":{"test":"node --test 'test/**/*.test.js'","test:browser":"node test/browser.test.mjs","prepublishOnly":"npm test"},"_npmUser":{"name":"monteslu","email":"monteslu@gmail.com"},"repository":{"url":"git+https://github.com/monteslu/wasmcart.git","type":"git"},"_npmVersion":"11.13.0","description":"WASM cartridge host - load and run sandboxed .wasm and .wasc game carts","directories":{},"_nodeVersion":"24.16.0","dependencies":{"yazl":"^2.5.1","yauzl":"^3.2.0","fflate":"^0.8.3","webgl-node":"^1.3.0","@kmamal/sdl":"^0.11.13"},"_hasShrinkwrap":false,"devDependencies":{"playwright":"^1.62.0"},"_npmOperationalInternal":{"tmp":"tmp/wasmcart_0.21.1_1786485172761_0.7636327193693655","host":"s3://npm-registry-packages-npm-production"}},"0.21.2":{"name":"wasmcart","version":"0.21.2","keywords":["wasm","webassembly","cartridge","game","sandbox","emulator","retro"],"author":{"name":"Luis Montes"},"license":"MIT","_id":"wasmcart@0.21.2","maintainers":[{"name":"monteslu","email":"monteslu@gmail.com"}],"homepage":"https://github.com/monteslu/wasmcart#readme","bugs":{"url":"https://github.com/monteslu/wasmcart/issues"},"bin":{"wasmcart":"bin/wasmcart.js","wasmcart-pack":"bin/wasmcart-pack.js","wasmcart-play":"bin/wasmcart-play.js"},"dist":{"shasum":"301ee32142874368042babf9a1ec3c8861639934","tarball":"https://registry.npmjs.org/wasmcart/-/wasmcart-0.21.2.tgz","fileCount":35,"integrity":"sha512-Znnrw00+hQA3A0GbzkkqfEO9ykuHK6yDTqkCA4sGNp+i5flyH96akUFjXRaWYJr70bn1XAa427jmKgm2Z94L6A==","signatures":[{"sig":"MEUCIGGdvMeck8Fzx2jeITki+OdypRepuuRMVJAOn9Qgqkh3AiEAsU3VsWSj3c4wxtDstAX9zXZYwambkvPuRpZXaADKOuc=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":616608},"main":"index.js","type":"module","engines":{"node":">=22.0.0"},"exports":{".":{"browser":"./web.js","default":"./index.js"},"./web":"./web.js"},"gitHead":"7a0fcd1d13193270924a5a1c4e6d88ddafac353c","scripts":{"test":"node --test 'test/**/*.test.js'","test:browser":"node test/browser.test.mjs","prepublishOnly":"npm test"},"_npmUser":{"name":"monteslu","email":"monteslu@gmail.com"},"repository":{"url":"git+https://github.com/monteslu/wasmcart.git","type":"git"},"_npmVersion":"11.13.0","description":"WASM cartridge host - load and run sandboxed .wasm and .wasc game carts","directories":{},"_nodeVersion":"24.16.0","dependencies":{"yazl":"^2.5.1","yauzl":"^3.2.0","fflate":"^0.8.3","webgl-node":"^1.3.0","@kmamal/sdl":"^0.11.13"},"_hasShrinkwrap":false,"devDependencies":{"playwright":"^1.62.0"},"_npmOperationalInternal":{"tmp":"tmp/wasmcart_0.21.2_1786496456884_0.734041753698905","host":"s3://npm-registry-packages-npm-production"}},"0.22.0":{"name":"wasmcart","version":"0.22.0","keywords":["wasm","webassembly","cartridge","game","sandbox","emulator","retro"],"author":{"name":"Luis Montes"},"license":"MIT","_id":"wasmcart@0.22.0","maintainers":[{"name":"monteslu","email":"monteslu@gmail.com"}],"homepage":"https://github.com/monteslu/wasmcart#readme","bugs":{"url":"https://github.com/monteslu/wasmcart/issues"},"bin":{"wasmcart":"bin/wasmcart.js","wasmcart-pack":"bin/wasmcart-pack.js","wasmcart-play":"bin/wasmcart-play.js"},"dist":{"shasum":"2908052bea6a646138bd288bfab9dfc594c065d3","tarball":"https://registry.npmjs.org/wasmcart/-/wasmcart-0.22.0.tgz","fileCount":35,"integrity":"sha512-4b92ZozliH4XyZqPBnTsij2gD0aJLrBmK7RYtOANRXX/Bc1Fx26X6jj8cVxVrWDPvdNE9n4/1J9jci9LhUU9fA==","signatures":[{"sig":"MEUCIQDLpgMHAiPn+jHiqdIyXO1/CaHgHOnupIrq9CUW5NruRAIgYvtigTA+KVeKhkIcPSnb5+SKP1JpBMFfrZtqgDBY2dM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":632008},"main":"index.js","type":"module","engines":{"node":">=22.0.0"},"exports":{".":{"browser":"./web.js","default":"./index.js"},"./web":"./web.js"},"gitHead":"5f933dde1a5680b1ad2a6d0edc6f4db0f4684a6b","scripts":{"test":"node --test 'test/**/*.test.js'","test:browser":"node test/browser.test.mjs","prepublishOnly":"npm test"},"_npmUser":{"name":"monteslu","email":"monteslu@gmail.com"},"repository":{"url":"git+https://github.com/monteslu/wasmcart.git","type":"git"},"_npmVersion":"11.13.0","description":"WASM cartridge host - load and run sandboxed .wasm and .wasc game carts","directories":{},"_nodeVersion":"24.16.0","dependencies":{"yazl":"^2.5.1","yauzl":"^3.2.0","fflate":"^0.8.3","webgl-node":"^1.3.0","@kmamal/sdl":"^0.11.13"},"_hasShrinkwrap":false,"devDependencies":{"playwright":"^1.62.0"},"_npmOperationalInternal":{"tmp":"tmp/wasmcart_0.22.0_1786998340385_0.46656695774331736","host":"s3://npm-registry-packages-npm-production"}},"0.22.1":{"name":"wasmcart","version":"0.22.1","keywords":["wasm","webassembly","cartridge","game","sandbox","emulator","retro"],"author":{"name":"Luis Montes"},"license":"MIT","_id":"wasmcart@0.22.1","maintainers":[{"name":"monteslu","email":"monteslu@gmail.com"}],"homepage":"https://github.com/monteslu/wasmcart#readme","bugs":{"url":"https://github.com/monteslu/wasmcart/issues"},"bin":{"wasmcart":"bin/wasmcart.js","wasmcart-pack":"bin/wasmcart-pack.js","wasmcart-play":"bin/wasmcart-play.js"},"dist":{"shasum":"4803f4c18b357905370fe7354de09216146d4ad6","tarball":"https://registry.npmjs.org/wasmcart/-/wasmcart-0.22.1.tgz","fileCount":35,"integrity":"sha512-VsEb6uTEGKjxhQta9dNr7J2gm0J5jKfxLLJ7BD2Agt1sEPjXLg5ZyYcpnXDEuxQZ+Re5MHqa7gtrWIS+yWnnvg==","signatures":[{"sig":"MEUCICbsR20TOhe7XEc9T4lzQ/dZNBb+SjnhgAq2XSdvmBFqAiEA6X/+LmgcYdHdnt7lykSgBek+rVg5qbILJidnhHqLSAI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":642940},"main":"index.js","type":"module","engines":{"node":">=22.0.0"},"exports":{".":{"browser":"./web.js","default":"./index.js"},"./web":"./web.js"},"gitHead":"7f0f086203202cb267ea9859b21e7530185d1e16","scripts":{"test":"node --test 'test/**/*.test.js'","test:browser":"node test/browser.test.mjs","prepublishOnly":"npm test"},"_npmUser":{"name":"monteslu","email":"monteslu@gmail.com"},"repository":{"url":"git+https://github.com/monteslu/wasmcart.git","type":"git"},"_npmVersion":"11.13.0","description":"WASM cartridge host - load and run sandboxed .wasm and .wasc game carts","directories":{},"_nodeVersion":"24.16.0","dependencies":{"yazl":"^2.5.1","yauzl":"^3.2.0","fflate":"^0.8.3","webgl-node":"^1.3.0","@kmamal/sdl":"^0.11.13"},"_hasShrinkwrap":false,"devDependencies":{"playwright":"^1.62.0"},"_npmOperationalInternal":{"tmp":"tmp/wasmcart_0.22.1_1787006138178_0.5673373684311813","host":"s3://npm-registry-packages-npm-production"}},"0.23.0":{"name":"wasmcart","version":"0.23.0","keywords":["wasm","webassembly","cartridge","game","sandbox","emulator","retro"],"author":{"name":"Luis Montes"},"license":"MIT","_id":"wasmcart@0.23.0","maintainers":[{"name":"monteslu","email":"monteslu@gmail.com"}],"homepage":"https://github.com/monteslu/wasmcart#readme","bugs":{"url":"https://github.com/monteslu/wasmcart/issues"},"bin":{"wasmcart":"bin/wasmcart.js","wasmcart-pack":"bin/wasmcart-pack.js","wasmcart-play":"bin/wasmcart-play.js"},"dist":{"shasum":"33aa2b399cb928fd5db81a0e71491fb05ed87a7a","tarball":"https://registry.npmjs.org/wasmcart/-/wasmcart-0.23.0.tgz","fileCount":35,"integrity":"sha512-FprNq9eMYrZeul/ZDhl5dq4B9gnJzFl2lgflHyItuLFwkKxXVrgpTiH7SBjZDKAT/eDh+U9oILTWdUCNLRJg/Q==","signatures":[{"sig":"MEUCIEPtTcL0+HxHNZG3d73yyM25D+UkVdabS6G0Y5E78GfmAiEAyT1cQwu308QcicpyAlBNrCpQW13ZKp7NwE44VcIUrPQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIHBMGmaKZ+jueBxk742tQMhLSm2v8wdEjO+Lx0qVJZ47AiEAq89LV6lHLZkIwdtLD9dnaZRMAdRoBB7AL5O+4rZzrNY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":649122},"main":"index.js","type":"module","engines":{"node":">=22.0.0"},"exports":{".":{"browser":"./web.js","default":"./index.js"},"./web":"./web.js"},"gitHead":"8f10d49e866d35c71c6e215ab93fa025efbf8ee6","scripts":{"test":"node --test 'test/**/*.test.js'","test:browser":"node test/browser.test.mjs","prepublishOnly":"npm test"},"_npmUser":{"name":"monteslu","email":"monteslu@gmail.com"},"repository":{"url":"git+https://github.com/monteslu/wasmcart.git","type":"git"},"_npmVersion":"11.13.0","description":"WASM cartridge host - load and run sandboxed .wasm and .wasc game carts","directories":{},"_nodeVersion":"24.16.0","dependencies":{"yazl":"^2.5.1","yauzl":"^3.2.0","fflate":"^0.8.3","webgl-node":"^1.3.0","@kmamal/sdl":"^0.11.13"},"_hasShrinkwrap":false,"devDependencies":{"playwright":"^1.62.0"},"_npmOperationalInternal":{"tmp":"tmp/wasmcart_0.23.0_1787265061539_0.9330732157095452","host":"s3://npm-registry-packages-npm-production"}},"0.24.0":{"name":"wasmcart","version":"0.24.0","keywords":["wasm","webassembly","cartridge","game","sandbox","emulator","retro"],"author":{"name":"Luis Montes"},"license":"MIT","_id":"wasmcart@0.24.0","maintainers":[{"name":"monteslu","email":"monteslu@gmail.com"}],"homepage":"https://github.com/monteslu/wasmcart#readme","bugs":{"url":"https://github.com/monteslu/wasmcart/issues"},"bin":{"wasmcart":"bin/wasmcart.js","wasmcart-pack":"bin/wasmcart-pack.js","wasmcart-play":"bin/wasmcart-play.js"},"dist":{"shasum":"45ea23821e136337f6e1f2db78c8c3ba36f99457","tarball":"https://registry.npmjs.org/wasmcart/-/wasmcart-0.24.0.tgz","fileCount":35,"integrity":"sha512-dP5slbuNb8Du/VA66Ky3uvEbGlRRRdzgyMhMyngnVV5fX2FXC115s20Qpn9HkOmYdnY3j2/nu99qh+XzbGaNBw==","signatures":[{"sig":"MEUCIQDI/ykk/0at1/ibQa/5j1HTer4lZO8v66wmRDujAOqUagIgGkfKd549scncZct34tQbzYK7CdHjOuKaSWUd31Yezcg=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIG6+0uJPDGv6tRnAlX6VDQb8jtkzur8IEgypce+b5J6sAiEAnq6jwLpZpUgNsxjCvk0UAKDdfDNUdTqfaCO0kvD2U0U=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":656369},"main":"index.js","type":"module","engines":{"node":">=22.0.0"},"exports":{".":{"browser":"./web.js","default":"./index.js"},"./web":"./web.js"},"gitHead":"d32be3f23b40f07f2f31d1e00e468796833a475e","scripts":{"test":"node --test 'test/**/*.test.js'","test:browser":"node test/browser.test.mjs","prepublishOnly":"npm test"},"_npmUser":{"name":"monteslu","email":"monteslu@gmail.com"},"repository":{"url":"git+https://github.com/monteslu/wasmcart.git","type":"git"},"_npmVersion":"11.13.0","description":"WASM cartridge host - load and run sandboxed .wasm and .wasc game carts","directories":{},"_nodeVersion":"24.16.0","dependencies":{"yazl":"^2.5.1","yauzl":"^3.2.0","fflate":"^0.8.3","webgl-node":"^1.5.1","@kmamal/sdl":"^0.11.13"},"_hasShrinkwrap":false,"devDependencies":{"playwright":"^1.62.0"},"_npmOperationalInternal":{"tmp":"tmp/wasmcart_0.24.0_1787435535340_0.7779517402415599","host":"s3://npm-registry-packages-npm-production"}},"0.25.0":{"name":"wasmcart","version":"0.25.0","keywords":["wasm","webassembly","cartridge","game","sandbox","emulator","retro"],"author":{"name":"Luis Montes"},"license":"MIT","_id":"wasmcart@0.25.0","maintainers":[{"name":"monteslu","email":"monteslu@gmail.com"}],"homepage":"https://github.com/monteslu/wasmcart#readme","bugs":{"url":"https://github.com/monteslu/wasmcart/issues"},"bin":{"wasmcart":"bin/wasmcart.js","wasmcart-pack":"bin/wasmcart-pack.js","wasmcart-play":"bin/wasmcart-play.js"},"dist":{"shasum":"b2eddd4c6880ccb63b19972e1d25bc289536313b","tarball":"https://registry.npmjs.org/wasmcart/-/wasmcart-0.25.0.tgz","fileCount":36,"integrity":"sha512-05X6R+smsr49/mXQ0qaqjyFSIyqmf4+lDd9ZYaTO2aac+e/5x9qE5bPUQeQhJEPfvVL6xM9Qpx/AkxDbdhe6ZA==","signatures":[{"sig":"MEUCIQDED3G/OrKvW/ueUa1bS7nJWLVDsPF70lvCw2PKebjO2gIgAal48ZbpxWH6R+JQoL4jpfvJY9TlbmEJUj5P0erBygM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIQDfujKQp8c3TEC674A5zRiUuRe9nrozFEn/N9mAPi+osgIgLWbNGXwWYWgFd0Rwa0VapjBTQHWEFN4HukK6TEhBTN0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":663485},"main":"index.js","type":"module","engines":{"node":">=22.0.0"},"exports":{".":{"browser":"./web.js","default":"./index.js"},"./web":"./web.js"},"gitHead":"75b47f1f21fce24942f1b759686c77e20e1fb390","scripts":{"test":"node --test 'test/**/*.test.js'","test:browser":"node test/browser.test.mjs","prepublishOnly":"npm test"},"_npmUser":{"name":"monteslu","email":"monteslu@gmail.com"},"repository":{"url":"git+https://github.com/monteslu/wasmcart.git","type":"git"},"_npmVersion":"11.13.0","description":"WASM cartridge host - load and run sandboxed .wasm and .wasc game carts","directories":{},"_nodeVersion":"24.16.0","dependencies":{"yazl":"^2.5.1","yauzl":"^3.2.0","fflate":"^0.8.3","webgl-node":"^1.5.1","@kmamal/sdl":"^0.11.13"},"_hasShrinkwrap":false,"devDependencies":{"playwright":"^1.62.0"},"_npmOperationalInternal":{"tmp":"tmp/wasmcart_0.25.0_1789481493630_0.8780694745616948","host":"s3://npm-registry-packages-npm-production"}},"0.25.1":{"_id":"wasmcart@0.25.1","bin":{"wasmcart":"bin/wasmcart.js","wasmcart-pack":"bin/wasmcart-pack.js","wasmcart-play":"bin/wasmcart-play.js"},"bugs":{"url":"https://github.com/monteslu/wasmcart/issues"},"dist":{"shasum":"7b65c61190e6b3dc682e505a8b1df803c5329a3b","tarball":"https://registry.npmjs.org/wasmcart/-/wasmcart-0.25.1.tgz","fileCount":36,"integrity":"sha512-NZ+dXsGFHJF5ssZjV4dqkVYwd6dvnkpd3pnJPdcSzJKTqfkf4vinuaaofACYOiMrs1f3sVDCag2o3sHI3COu9Q==","signatures":[{"sig":"MEQCIA5GgEmNP/JSADXSH9XL49Jk1W+BdVvqJm7bqcNtVdPQAiAjA3TzM2tSsajpxI2o0qb1fwJLExLN6ls2up4v4Gl4ig==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQDhLQxnkngVOrqPEBknxPh78S16/w5y9Ni/jryQavldkAIhAKQPwQoMXN/nm5xI0YREUfO/a5q/Sw6j0zz4UcAnwPwK"}],"unpackedSize":663485},"main":"index.js","name":"wasmcart","type":"module","author":{"name":"Luis Montes"},"engines":{"node":">=22.0.0"},"exports":{".":{"browser":"./web.js","default":"./index.js"},"./web":"./web.js"},"gitHead":"9f2dacb650e2a0a523f709a02ac6318d445f21f9","license":"MIT","scripts":{"test":"node --test 'test/**/*.test.js'","test:browser":"node test/browser.test.mjs","prepublishOnly":"npm test"},"version":"0.25.1","_npmUser":{"name":"monteslu","email":"monteslu@gmail.com"},"homepage":"https://github.com/monteslu/wasmcart#readme","keywords":["wasm","webassembly","cartridge","game","sandbox","emulator","retro"],"repository":{"url":"git+https://github.com/monteslu/wasmcart.git","type":"git"},"_npmVersion":"11.13.0","description":"WASM cartridge host - load and run sandboxed .wasm and .wasc game carts","directories":{},"maintainers":[{"name":"monteslu","email":"monteslu@gmail.com"}],"_nodeVersion":"24.16.0","dependencies":{"yazl":"^2.5.1","yauzl":"^3.2.0","fflate":"^0.8.3","webgl-node":"^1.5.1","@kmamal/sdl":"^0.11.13"},"_hasShrinkwrap":false,"devDependencies":{"playwright":"^1.62.0"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/wasmcart_0.25.1_1789482602490_0.509881365819074"}}},"time":{"created":"2026-07-01T14:39:39.471Z","modified":"2026-09-15T14:30:02.748Z","0.2.0":"2026-07-01T14:39:39.690Z","0.3.0":"2026-07-01T18:41:30.668Z","0.4.0":"2026-07-23T20:18:29.284Z","0.5.0":"2026-07-24T02:16:20.211Z","0.6.0":"2026-07-26T01:43:05.669Z","0.7.0":"2026-07-28T18:35:10.533Z","0.8.0":"2026-07-28T19:01:13.514Z","0.9.0":"2026-07-28T19:19:08.295Z","0.9.1":"2026-07-28T19:25:13.647Z","0.10.0":"2026-07-28T22:51:10.018Z","0.10.1":"2026-07-28T23:15:39.119Z","0.12.2":"2026-07-29T01:59:49.586Z","0.13.1":"2026-07-29T05:15:49.342Z","0.13.2":"2026-07-29T06:36:41.876Z","0.16.0":"2026-07-29T18:02:40.308Z","0.16.1":"2026-07-29T19:09:36.143Z","0.16.2":"2026-07-29T23:46:22.007Z","0.16.3":"2026-07-30T23:08:55.668Z","0.17.0":"2026-08-05T19:41:40.350Z","0.18.0":"2026-08-07T22:57:23.362Z","0.19.0":"2026-08-11T01:54:07.757Z","0.21.0":"2026-08-11T21:22:30.665Z","0.21.1":"2026-08-11T21:52:52.910Z","0.21.2":"2026-08-12T01:00:57.095Z","0.22.0":"2026-08-17T20:25:40.548Z","0.22.1":"2026-08-17T22:35:38.356Z","0.23.0":"2026-08-20T22:31:01.635Z","0.24.0":"2026-08-22T21:52:15.444Z","0.25.0":"2026-09-15T14:11:33.782Z","0.25.1":"2026-09-15T14:30:02.569Z"},"bugs":{"url":"https://github.com/monteslu/wasmcart/issues"},"author":{"name":"Luis Montes"},"license":"MIT","homepage":"https://github.com/monteslu/wasmcart#readme","keywords":["wasm","webassembly","cartridge","game","sandbox","emulator","retro"],"repository":{"url":"git+https://github.com/monteslu/wasmcart.git","type":"git"},"description":"WASM cartridge host - load and run sandboxed .wasm and .wasc game carts","maintainers":[{"name":"monteslu","email":"monteslu@gmail.com"}],"readme":"# wasmcart\n\n**A virtual cartridge format for safe, portable games.** A wasmcart cart is a\nstandalone WebAssembly module - a self-contained game that owns its own memory and\ntalks to the outside world only through a tiny, well-defined contract: the host\nwrites input + timing, calls `wc_render()` each frame, and reads back pixels and\naudio. No filesystem, no syscalls, no ambient authority. Just pixels, sound, input,\nand opt-in networking.\n\nBecause a cart is only WebAssembly + a fixed ABI, **the same cart runs anywhere a\nconforming host exists** - Node.js, the browser, a libretro core in [RetroArch](https://www.retroarch.com), a\nnative player, a terminal - on any OS and any hardware with enough power. Write the\ngame once; it runs on all of them, sandboxed.\n\nThis repository is the **specification** and its **reference implementations**.\n\n- 📄 **[SPEC.md](SPEC.md)** - the normative host↔cart contract (current ABI: v3)\n- 🧩 **[`src/abi.js`](src/abi.js)** - the machine-readable contract (constants, layouts)\n- 🖥️ **[`include/wasmcart.h`](include/wasmcart.h)** - the C ABI header (structs, flags, GL + host imports)\n- 🧰 **[`include/wc_cart.h`](include/wc_cart.h)** - cart boilerplate macros on top of it\n- 📚 **[`docs/`](docs/)** - per-subsystem guides (input, networking, GL, framebuffer, fetch, porting)\n- 🧭 **[docs/positioning.md](docs/positioning.md)** - ship the artifact you debugged: `.wasc` primary, native backends optional, observability by construction\n\n## Reference implementations\n\nTwo reference hosts ship in this package - they define, by example, what a\nconforming host does. Both are pure JavaScript (MIT).\n\n| Import | Class | Runs on |\n|--------|-------|---------|\n| `wasmcart`       | `CartHost`    | Node.js (native GLES3 via a supplied WebGL2 context) |\n| `wasmcart/web`   | `CartHostWeb` | Browsers (WebGL2 from a `<canvas>`) |\n\n```js\nimport { CartHost } from 'wasmcart';        // Node\nimport { CartHostWeb } from 'wasmcart/web';  // browser\n```\n\n**Browser note:** `wasmcart/web` imports `fflate` by bare specifier, which a\nbrowser cannot resolve on its own. Bundle it, or supply an import map:\n\n```html\n<script type=\"importmap\">\n{ \"imports\": { \"fflate\": \"/node_modules/fflate/esm/browser.js\" } }\n</script>\n```\n\nLoading `wasmcart/web` as a raw module without one fails with\n`Failed to resolve module specifier \"fflate\"`. Note the **browser** ESM build\n(`esm/browser.js`) -- `fflate`'s Node entry point pulls in `node:zlib`.\n\nOther hosts in the wasmcart org (own repos) run the *same* carts: a libretro core\n([`wasmcart-libretro`](https://github.com/wasmcart/wasmcart-libretro)), a native\nplayer ([`wasmcart-native`](https://github.com/wasmcart/wasmcart-native)), and the\nterminal emulator ([`retroemu`](https://github.com/monteslu/retroemu)). See\n**[The wasmcart org](#the-wasmcart-org)** below.\n\n## Installation\n\n```bash\nnpm install wasmcart\n```\n\n## Play a cart\n\n```bash\nnpx wasmcart game.wasc              # SDL window + audio + gamepad (the default)\nnpx wasmcart https://example.com/games/game.wasc # fetch a remote cart and play it\nnpx wasmcart game.wasc              # GL carts too - auto-detected, OpenGL window via webgl-node\nnpx wasmcart my-cart-dir/           # dev mode: manifest.json + cart.wasm + assets, straight off disk\nnpx wasmcart game.wasc --term       # ANSI terminal player (GL carts too, via offscreen readback)\nnpx wasmcart game.wasc --frames 300 --shot out.png --wav out.wav   # headless: step, dump, exit\nnpx wasmcart game.wasc --seed 7 --frames 60 --shot a.png           # deterministic replay run\nnpx wasmcart game.wasc --no-resize  # pin the window to the cart's declared size\nnpx wasmcart game.wasc --stretch    # fill the window, distorting the aspect ratio\nnpx wasmcart pack --wasm cart.wasm -o game.wasc                    # packing, same front door\n```\n\nHTTP and HTTPS carts are streamed to a temporary file so packed assets remain\nlazy-loaded instead of occupying memory for the whole session. Redirects are\nfollowed. Save data for a remote cart is keyed by its URL and stored under\n`$XDG_DATA_HOME/wasmcart/saves` (or `~/.local/share/wasmcart/saves`).\n\n### Window sizing\n\nThe window opens at the size the **cart** declares — that is the cart's call,\nnot the player's — and is **resizable** from there. As you resize, the frame is\nscaled up to the largest rect that still fits and **letterboxed**: black bars\nfill whatever is left over, so a cart's aspect ratio survives any window shape.\nA cart that declares 480x600 stays portrait in a wide window instead of being\nstretched into one.\n\n| flag | effect |\n| --- | --- |\n| *(default)* | window opens at the cart's size (2× when the cart is 400px tall or less), resizable, letterboxed |\n| `--zoom n` | open at n× the cart's size (still resizable) |\n| `--width px --height px` | open the window at an explicit size instead |\n| `--window` / `--gl` | force the SDL window / force the GL window up front (both are auto-detected; `--gl` is for hybrid carts and debugging) |\n| `--fullscreen`, `-f` | fill the display; the frame is letterboxed into it |\n| `--no-resize` | pin the window to the cart's size; no bars, no scaling |\n| `--stretch` | scale to fill the window, distorting the aspect ratio |\n\nThe **cart** decides its resolution: the host may ask for a size via\n`preferredWidth`/`preferredHeight`, but whatever `wc_get_info` reports wins,\nand wasmcart dictates neither a resolution nor an aspect ratio. Window size\nis a separate, host-side decision, and letterboxing is what reconciles the\ntwo — which is why fullscreen needs no special handling.\n\nLetterboxing applies to both rendering paths: 2D carts are scaled on blit, and\nGL carts get a viewport fitted inside the drawable with the surrounding area\ncleared to black.\n\nThe windowed player runs on the org's own stack —\n[`@kmamal/sdl`](https://github.com/kmamal/node-sdl) (window, keyboard, audio\nqueue, game controllers) and [`webgl-node`](https://github.com/monteslu/webgl-node)\n(WebGL2-over-native GLES for GL carts, auto-detected from the wasm imports) — with\naudio-paced frame stepping so sound never\nstutters. Keys: arrows/WASD d-pad, `x`/`z` = A/B, Enter = Start, Tab = Select,\nEsc/`q` quits; the first plugged-in controller maps automatically. No display?\nIt falls back to the terminal player, and headless mode is scriptable: same\nseed → byte-identical PNG, so a shell loop is a regression test. Hosts that\nembed `CartHost` (harnesses like [romdevtools](https://www.npmjs.com/package/romdevtools))\nkeep supplying their OWN backends via `load(..., { glBackend })` — these\ndependencies power the CLI, they are not required by the embedding API.\n\nRequires Node.js >= 22.\n\n## RNG seeding: entropy by default, determinism by request\n\nOn every **normal** load, a spec-compliant host rolls a fresh random `u32`\nand calls the cart's `wc_set_seed` export (if present) before `wc_init` —\nso a cart that draws all its randomness from `wc_rand()` deals a different\ngame every power-on, with **zero cart-side effort**.\n\nDeterminism is the opt-in: `load(cart, { deterministic: { seed } })` (CLI:\n`--seed n`) pins that seed AND fixes the virtual clock, giving identical\nframe sequences for replays, goldens, and regression loops. Same seed +\nsame input script = byte-identical run.\n\n| Layer | Responsibility |\n|---|---|\n| **Host** (`CartHost`) | random seed per normal load; pinned seed + fixed clock in deterministic mode |\n| **Cart/engine** | export `wc_set_seed(u32)` (the `wc_cart.h` macro provides it) and use `wc_rand()` as the only entropy source |\n| **Game code** | nothing — or mix in human input timing as belt-and-braces on pre-fix hosts |\n\nBoth bundled hosts implement this: **`CartHost`** (Node) rolls a random\nu32 per normal load and pins it in `deterministic:{seed}` mode;\n**`CartHostWeb`** (browser, `wasmcart/web`) seeds from\n`crypto.getRandomValues` on every page load (it has no deterministic mode\n— replay tooling is Node-side).\n\nHistory: before wasmcart 0.17.0, `CartHost` called `wc_set_seed` only in\ndeterministic mode and `CartHostWeb` never called it at all, so normal\nruns booted from the compile-time constant and dealt the same \"random\"\nsequence every load. If a game repeats itself identically on power-on,\nthe host is running a pre-0.17.0 wasmcart.\n\n## Cart Formats\n\n| Format | Description |\n|--------|-------------|\n| `.wasm` | Standalone WASM file, assets embedded as C arrays |\n| `.wasc` | ZIP archive: `manifest.json` + `cart.wasm` + `assets/` (recommended for games with assets) |\n\n## The ABI\n\nEvery cart exports three functions:\n\n- **`wc_get_info()`** - returns a pointer to a struct describing the cart's memory layout (framebuffer, audio ring, input pads, save data, timing)\n- **`wc_init()`** - called once at startup\n- **`wc_render()`** - called every frame (~60fps)\n\nThe cart declares all buffers as static globals. The host reads their locations from `wc_get_info()`, writes input/timing before each frame, and reads pixels/audio after `wc_render()` returns.\n\nSee [SPEC.md](SPEC.md) for the normative struct layouts, [`src/abi.js`](src/abi.js)\nfor the machine-readable constants, and [`include/wc_cart.h`](include/wc_cart.h) for\nthe C-side boilerplate that fills the struct for you.\n\n### Rendering Mode\n\nEvery cart declares its rendering mode via `wc_info_t.gpu_api`:\n\n| Value | Mode | Description |\n|-------|------|-------------|\n| 0 | **2D Framebuffer** | Cart writes ARGB8888 pixels to the framebuffer. Host reads and displays them. *(legacy - prefer gpu_api=1)* |\n| 1 | **WebGL2 / GLES3** | Cart renders via GL function imports. The GPU output is the primary display. **Recommended for all carts.** |\n| 2 | **WebGPU** | *(reserved for future use)* |\n| 3 | **Vulkan** | *(reserved for future use)* |\n\n**Rendering mode is declared once** in `wc_get_info()` and does not change during the cart's lifetime.\n\n### Recommended: All Carts Use GPU (gpu_api = 1)\n\n**Every wasmcart host has OpenGL.** The recommended approach is for all carts to set `gpu_api = 1` and render all output through GL - even 2D pixel-buffer carts.\n\nFor carts that render pixels to a CPU buffer (software renderers, SDL2 2D games), use the `wc_gl_blit()` helper to upload the pixel buffer as a GL texture and draw a fullscreen quad:\n\n```c\n#define WC_USE_GL\n#include \"wasmcart.h\"\n#include \"wc_gl_blit.h\"   // single-header GL blit library\n\n// In wc_get_info():\ninfo.gpu_api = 1;\n\n// In wc_render(), after drawing to your pixel buffer:\nwc_gl_blit(my_pixels, width, height);  // uploads as GL texture + draws quad\n```\n\nThis eliminates the host-side complexity of detecting 2D vs GL carts and managing two display paths. One rendering path for all carts, all hosts.\n\n**Performance:** `glTexImage2D` is a DMA transfer - the GPU pulls pixel data without CPU waiting. At 1080p, this is significantly faster than the old CPU-side pixel copy + format conversion. 2D games that previously ran at 30fps at 1080p now run at 60fps with this approach.\n\n**SDL2 carts** using the `sdl2_wc` backend can enable GL blit automatically:\n```c\ninfo.gpu_api = 1;                    // in wc_get_info()\nSDL_WASMCART_SetGLBlit(1);           // in wc_init(), after SDL_Init\n// Link with: sdl2_wc/sdl2_gl_blit.c\n```\n\nSDL's software renderer draws pixels as usual. The `sdl2_wc` backend uploads them to GL on `SDL_RenderPresent`. No game code changes needed.\n\n### Legacy: 2D Framebuffer (gpu_api = 0)\n\nStill supported for simplicity. The cart writes ARGB8888 pixels to a framebuffer, the host reads and displays them. No GL imports needed.\n\n- Simplest possible cart - just write pixels to a buffer\n- Host handles format conversion and display\n- Performance limited by CPU pixel copy at high resolutions\n\n### GPU Carts (gpu_api = 1)\n\n- Render via GL function imports (`\"gl\"` WASM module)\n- The host displays GL output directly (swapBuffers)\n- If the host needs pixels (terminal rendering, screenshots), the **host** performs readback (`glReadPixels`) at whatever frequency it chooses\n- 2D and 3D content can coexist on the same GL context\n\n**Compositing** (e.g., 2D HUD over 3D scene) is the cart's responsibility within its chosen GPU API. There is no hybrid mode - a cart that uses GL for 3D and wants a 2D overlay renders both through GL.\n\n**Hosts should reject carts with unsupported gpu_api values** gracefully (e.g., \"This host does not support WebGPU carts\").\n\n### Resolution Negotiation\n\nThe host and cart negotiate resolution through a two-step process:\n\n1. **Host → Cart**: Before calling `wc_init()`, the host writes its preferred resolution to `wc_host_info_t.preferred_width` and `preferred_height`. This is a *suggestion* - the host's display capability, not a requirement. A value of 0 means \"no preference.\"\n\n2. **Cart → Host**: the cart reads the host's preference and decides its actual rendering resolution, writing it to `wc_info_t.width` / `wc_info_t.height`. It may use the preference directly, scale it, clamp it, or ignore it entirely.\n\nThe host reads those dimensions from `wc_get_info()`, which it calls **before** `wc_init()` (it needs `save_size` to stage save data first). A cart whose resolution depends on work done in `wc_init` — an interpreted cart whose script calls something like `set_mode()`, say — must therefore report a sensible size from `wc_get_info` up front, or declare `width`/`height` in its manifest; a host cannot wait for `wc_init` to size a window or a GL context that has to exist before the cart is even instantiated.\n\nThese dimensions define:\n- **2D carts**: the framebuffer size in pixels (ARGB8888, `width × height × 4` bytes)\n- **GL carts**: the viewport/render target dimensions for GL calls\n\n**Display scaling** is the host's responsibility:\n- The host creates its display surface at whatever size it wants (its own preferred resolution, fullscreen, user-resizable window, etc.)\n- The host scales the cart's output to fit the display, **preserving the cart's aspect ratio** with letterboxing/pillarboxing as needed\n- The cart never knows or cares about the actual display size\n\n**If no preferred resolution is specified** (both 0), the host should create its window at the cart's returned dimensions so pixels map 1:1. (The bundled player additionally opens small carts -- 400px tall or less -- at 2x so they are legible on modern displays; the frame itself is still rendered at the cart's resolution.)\n\nExample flow:\n```\nHost sets preferred: 1920×1080\nCart reads preference, decides: 640×360 (16:9, manageable for this engine)\nHost creates window: 1920×1080\nHost scales 640×360 → 1920×1080 (exact 3x, no letterboxing needed)\n```\n\n```\nHost sets preferred: 0×0 (no preference)\nCart uses its default: 320×240\nHost creates window: 320×240 (1:1 match)\n```\n\n```\nHost sets preferred: 1920×1080\nCart ignores it, uses fixed: 960×540\nHost creates window: 1920×1080\nHost scales 960×540 → 1920×1080 (exact 2x)\n```\n\nThis design means:\n- The same `.wasc` cart works on any display size - phone, desktop, 4K TV, RetroArch\n- The cart controls its rendering budget - a simple game can render at 320×240, a complex game at 1080p\n- The host controls the display - letterboxing, fullscreen, window resize all work without cart cooperation\n\n### Manifest (`.wasc` carts)\n\nThe `manifest.json` inside a `.wasc` archive describes the cart:\n\n```json\n{\n  \"name\": \"My Game\",\n  \"version\": \"1.0.0\",\n  \"abi\": 3,\n  \"entry\": \"cart.wasm\",\n  \"width\": 640,\n  \"height\": 480,\n  \"players\": 2,\n  \"net\": {\n    \"domains\": [\"api.mygame.com\"],\n  }\n}\n```\n\n**The manifest as a whole is optional.** A `.wasc` with no `manifest.json` loads\nand runs: `entry` falls back to `cart.wasm` and every other field takes its\ndefault. A host must not refuse a cart for lacking one.\n\nEvery field is optional, and none of them gate a capability the cart declares\nabout itself. Pointer and keyboard input are governed *only* by `WC_FLAG_POINTER`\nand `WC_FLAG_KEYBOARD` in the cart's own `wc_info_t` — there are no `\"pointer\"` /\n`\"keyboard\"` manifest fields any more. A field that had to agree with the cart\ncould only ever disagree with it, and the failure was silent: input simply\nstopped arriving. Gamepad input is always available regardless.\n\n`net` is the exception, and deliberately so. It is not a restatement of a cart\nflag, it is a *permission* the cart cannot grant itself, so it fails closed: no\nmanifest, or no `net` entry, means no network access.\n\n`width` / `height` declare the cart's resolution *ahead of time*. `wc_get_info()`\nremains authoritative — this does not override it — but a host has to size a\nwindow, and a GL context, **before** the cart is instantiated, and at that\npoint nothing has run yet. Without a declaration the host guesses, and a\nwrong guess strands a GL cart's frame in a corner of an undersized drawable.\nDeclare it whenever the cart's resolution is not the host's default, and\nalways for a cart whose script picks the resolution at init time.\n`wasmcart pack --width W --height H` writes these fields.\n\n### ABI v3: Networking & Extended Input\n\nABI v3 adds opt-in features beyond the core framebuffer/audio/gamepad loop:\n\n- **Pointer input** (`WC_FLAG_POINTER`) - host writes `wc_pointer_t[10]` state (unified mouse + multitouch) and optionally calls `wc_ptr_on_down`, `wc_ptr_on_move`, `wc_ptr_on_up` exports\n- **Keyboard input** (`WC_FLAG_KEYBOARD`) - host writes `uint8_t[32]` key state bitmask (USB HID scancodes) and optionally calls `wc_kb_on_down`, `wc_kb_on_up` exports\n- **Rumble** (no flag needed) - cart calls `wc_pad_rumble(pad, low, high, ms)`; query support per device with `wc_pad_has_rumble(pad)`. Maps to SDL rumble natively and W3C `dual-rumble` in the browser\n- **Text input** (no flag needed) - optional `wc_on_text(utf8, len)` export plus `wc_text_input_begin` / `end` imports. The host delivers characters the OS already composed (layout, dead keys, IME), so a cart never implements a keyboard layout\n- **Lifecycle** (no flag needed) - optional `wc_on_suspend` / `wc_on_resume` / `wc_on_focus_lost` / `wc_on_focus_gained` exports. The host stops calling `wc_render` while suspended and rebases the clock on resume, so a cart that ignores them is still correct\n- **Loop inversion** (no flag needed) - for ported engines that own their main loop: call `wc_frame_yield()` from inside your existing `while` loop and the host suspends the whole engine stack out of `wc_render()`, resuming it next frame. Requires an asyncify build; see [docs/porting.md](docs/porting.md)\n- **Peer connections** (`\"net\": {\"domains\": [...]}`) - cart calls `wc_peer_open`/`send`/`close`; the host delivers events via `wc_peer_on_open`/`on_message`/`on_close`. Only connections the CART opens are allowlisted\n- **Host-supplied peers** (no manifest grant needed) - the host may hand the cart a peer it established itself (data channel, LAN socket, serial link). The cart sees it through the same `wc_peer_*` family and cannot tell which transport it is\n\nAll v3 exports are optional - the host silently skips events if the cart doesn't export the callbacks. Existing v2 carts work unchanged.\n\n## GPU ABI\n\nThere is **one GPU ABI: WebGL2 (OpenGL ES 3.0)**. All hosts present the same ES 3.0 GL surface. This is the ceiling - no host may expose ES 3.1+ or desktop GL features.\n\nA cart that doesn't use the GPU at all can write pixels directly to a shared-memory framebuffer (ARGB8888). This is not a second GPU ABI - it's just pixels in a buffer, no GL involved.\n\n### Rules for GPU carts\n\n1. **ES 3.0 core only.** Do not use ES 3.1+ features (compute shaders, SSBO, image load/store). The browser host is WebGL2 which is ES 3.0. Native hosts cap `GL_VERSION` to ES 3.0.\n\n2. **Declare all GL functions as WASM imports at compile time.** There is no `eglGetProcAddress` or runtime function discovery in WASM. If a function isn't in the cart's import table, it cannot be called.\n\n3. **Extensions are informational, not guaranteed.** Hosts pass through real driver extensions via `GL_EXTENSIONS` (some carts like Godot need them for format detection). But extension *function pointers* are only available if the cart declares them as WASM imports. Calling an undeclared extension function traps.\n\n4. **GPU engines with getProcAddress callbacks** (Skia Ganesh, ANGLE, etc.) must override `glGetString(GL_EXTENSIONS)` in their callback to return empty - preventing the engine from probing for extension function pointers that don't exist as WASM imports. The engine then falls back to its core-GL path, which is all the cart can import anyway. See [`docs/gl-surface.md`](docs/gl-surface.md) for what the GL surface guarantees, and the porting guide in [wasmcart-sdl2](https://github.com/wasmcart/wasmcart-sdl2) for the full pattern.\n\n5. **Same `.wasc` runs everywhere.** If a cart works in the browser, it must work on Node.js, native, and RetroArch hosts. Staying within ES 3.0 core guarantees this.\n\n## Features\n\n- **2D framebuffer** - ARGB8888 pixel buffer for software-rendered carts (no GL)\n- **WebGL2 GPU** - one GL ABI everywhere. Cart imports WebGL2 functions, host provides them (native GLES3 on Node.js, WebGL2 in browser). Emscripten's GL output works directly.\n- **Stereo audio** - Float32 or Int16 ring buffer, cart-declared sample rate\n- **Gamepad input** - 4 pads with buttons, analog sticks, triggers (always available)\n- **Pointer input** - unified mouse + touch via shared memory state + event callbacks (opt-in)\n- **Keyboard input** - 256-bit key state bitmask (USB HID scancodes) + event callbacks (opt-in)\n- **WebSocket networking** - event-driven WebSocket API with domain allowlist (opt-in)\n- **Data channels** - peer-to-peer communication via host-managed connections (opt-in)\n- **Save data** - persistent save blob (host manages storage)\n- **Asset loading** - `.wasc` carts load files at runtime via `wc_asset_size()` / `wc_load_asset()`\n- **WASI threads** - carts compiled with wasi-sdk `-pthread` can spawn background threads via pthreads\n- **WebAssembly exceptions** - standardized Wasm EH, including wasi-sdk's native `setjmp`/`longjmp`\n\n## Node.js API\n\n```js\nimport { CartHost } from 'wasmcart';\n\nconst cart = new CartHost();\nawait cart.load('game.wasc');\n\n// Main loop\nconst gamepads = [];  // array of { buttons, axes, ... }\nconst frame = cart.runFrame(gamepads);\n\n// frame.framebuffer - Uint8Array of ARGB pixels (for 2D carts)\n// frame.audio - Int16Array of stereo PCM samples\n// frame.saveData - Uint8Array (if cart uses save)\n\ncart.destroy();\n```\n\n### Options\n\n```js\nawait cart.load('game.wasc', {\n  glBackend: gl,                // OPTIONAL override: render into THIS context\n                                // (a WebGL2 context, or a factory returning one)\n                                // instead of the one the host makes itself\n  preferredWidth: 800,          // hint for resolution negotiation\n  preferredHeight: 600,\n  saveData: existingSaveBuffer,  // restore previous save\n});\n```\n\n### GL Carts\n\nGL carts import functions from the `\"gl\"` WASM module. The host provides a\nWebGL2-compatible context — either directly, or (since 0.6.0) as a **factory**\nthat CartHost invokes exactly once, and only if the cart's wasm actually\nimports GL. The factory form means a launcher never needs to know what kind\nof cart it's loading (this is how `npx wasmcart` auto-detects GL carts; the\ndetection ground truth is the wasm import section, never a manifest field):\n\n```js\n// Factory (recommended): runs only for GL carts, may be async\nawait cart.load('game.wasc', {\n  glBackend: () => {\n    const canvas = document.createElement('canvas');   // browser\n    return canvas.getContext('webgl2');\n  },\n});\n\n// Node.js factory — offscreen context (headless harnesses) or a\n// window-bound one (see bin/play-window.js for the SDL wiring)\nawait cart.load('game.wasc', {\n  glBackend: async () => (await import('webgl-node')).createWebGL2Context(1280, 720).gl,\n});\n\n// Plain context still works (created up front, GL cart or not)\nawait cart.load('gl_game.wasm', { glBackend: glContext });\n```\n\nA GL cart never runs on stubs. If a context cannot be obtained, the load is a\n**load error** — never a silent success that renders black:\n\n```js\n// Either host: no glBackend needed, the host makes its own context.\nawait cart.load('gl_game.wasc', {});\n\n// Where GL genuinely cannot be obtained (no driver, headless box with no\n// EGL, ancient browser, blocklisted driver):\n// Error: ... a WebGL2 context could not be created.\n```\n\nStubbing looks harmless because a hybrid cart can still fill its 2D\nframebuffer, but for a cart that *renders* through GL every call becomes a\nno-op, `load()` reports success, and the player sees a black screen with no\nerror anywhere.\n\nThere is **no opt-out**. GL is part of the host contract, not a capability a\nhost advertises: a cart author writes against the guarantee that if their cart\nimports `gl`, any conformant host can run it. Most carts never import `gl` and\nnever create a context — the factory form below exists precisely so a 2D-only\nsession pays nothing.\n\n**You do not have to pass anything on either host.** `CartHostWeb` creates its\nown WebGL2 context (offscreen where available); `CartHost` creates one through\n`webgl-node`, a regular dependency. `glBackend` is an **override** meaning\n\"render into THIS context instead of one you make\" — the common case being an\non-screen canvas or an SDL window — not the host's only source of GL.\n\n## CLI Tools\n\n### wasmcart-pack\n\nCreate `.wasc` archives from a `.wasm` file and an assets directory:\n\n```bash\nnpx wasmcart-pack --wasm cart.wasm --assets assets/ -o game.wasc\nnpx wasmcart-pack --wasm cart.wasm --assets assets/ -o game.wasc --name \"My Game\" --version \"1.0\"\n\n# Manifest extras: multiplayer, a network grant, an on-screen-controls hint\nnpx wasmcart-pack --wasm cart.wasm -o game.wasc --players 4 --ws api.mygame.com\nnpx wasmcart-pack --wasm cart.wasm -o game.wasc --controls dpad,a,b,start\n# (pointer/keyboard need NO flag: the cart declares WC_FLAG_POINTER /\n#  WC_FLAG_KEYBOARD in its own wc_info_t, and that is the only gate)\n```\n\nOr pack a **dev directory** that already has its own `manifest.json` — the\nsame layout `npx wasmcart <dir>` runs — keeping that manifest verbatim:\n\n```bash\nnpx wasmcart-pack --source my-game/ -o game.wasc\n```\n\nThe flag form above *generates* a manifest, so it cannot express a cart whose\nmanifest already says something specific (a custom `assets` root, a field\nwith no flag). `--source` resolves the wasm through the manifest's own\n`entry`, packs every other file at its original path, and rewrites only\n`entry` to the archive's `cart.wasm`.\n\nAll flags: `--wasm`, `--assets`, `--source`, `--output`/`-o`, `--name`,\n`--version` (flag form only; a `--source` manifest's own version wins),\n`--width`/`--height`, `--players`, `--controls` (comma-separated or\nrepeatable), `--ws`/`--websocket` (repeatable). Bare positional arguments are\ntaken as the wasm path, then the output path. `--pointer`, `--keyboard`, and\n`--data-channel` are accepted, warning no-ops from the double-gate era.\n\n## Writing Carts\n\nThe ABI is three exported functions and a struct, so the language question is\nreally two questions: does your toolchain emit standalone WASM, and are you\nwilling to compile at all?\n\n**If you would rather not compile**, the engine is already built and ships as\nWASM - a language runtime that happens to satisfy the ABI. Your game is source,\npacked into the cart as an asset:\n\n| | Repo |\n|---|---|\n| Lua | [wasmcart-lua](https://github.com/wasmcart/wasmcart-lua) - LÖVE-style API |\n| Python | [wasmcart-pygame](https://github.com/wasmcart/wasmcart-pygame) - CPython 3.13 + pygame-ce |\n| Ruby | [wasmcart-mruby](https://github.com/wasmcart/wasmcart-mruby) - DragonRuby-style API |\n| JavaScript | [wasmcart-jsgame](https://github.com/wasmcart/wasmcart-jsgame) - Canvas 2D, WebGL2, Web Audio |\n| GDScript | [wasmcart-godot](https://github.com/wasmcart/wasmcart-godot) - Godot 4 |\n\n**If you compile**, you pay nothing for it: no interpreter, no GC, and the\nsmallest carts anyone can produce. A complete Zig cart that fills the screen is\n432 bytes with zero imports.\n\n| | Repo |\n|---|---|\n| Rust | [wasmcart-rust](https://github.com/wasmcart/wasmcart-rust) - `no_std` bindings, `wc_cart!` macro |\n| Zig | [wasmcart-zig](https://github.com/wasmcart/wasmcart-zig) - freestanding bindings, comptime `Cart(.{...})` |\n| C / C++ | this repo's [`include/`](include/), or [wasmcart-sdl2](https://github.com/wasmcart/wasmcart-sdl2) to port an existing SDL game |\n\nThe rest of this section is the C path, which is also the reference for what any\nbinding has to do.\n\n### Minimal 2D cart (C + [Emscripten](https://emscripten.org))\n\n```c\n#include \"wasmcart.h\"\n#include <string.h>\n\n#define WIDTH 320\n#define HEIGHT 240\n\nstatic uint32_t framebuffer[WIDTH * HEIGHT];\nstatic wc_info_t info;\n\n__attribute__((export_name(\"wc_get_info\")))\nwc_info_t* wc_get_info(void) {\n    info.version = 3;\n    info.width = WIDTH;\n    info.height = HEIGHT;\n    info.fb_ptr = (uint32_t)(uintptr_t)framebuffer;\n    return &info;\n}\n\n__attribute__((export_name(\"wc_init\")))\nvoid wc_init(void) {}\n\n__attribute__((export_name(\"wc_render\")))\nvoid wc_render(void) {\n    // Fill screen red\n    for (int i = 0; i < WIDTH * HEIGHT; i++)\n        framebuffer[i] = 0xFFFF0000;\n}\n```\n\n```bash\nemcc -sSTANDALONE_WASM=1 -sALLOW_MEMORY_GROWTH=1 --no-entry -O2 -o cart.wasm cart.c\n```\n\n### Shared cart-author libraries\n\nThe [`include/`](include/) directory ships reusable C headers:\n\n| Header | Purpose |\n|--------|---------|\n| `wasmcart.h` | **The ABI header** - `wc_info_t`/`wc_pad_t` structs, flags, GL + host imports. Include this first. |\n| `wc_cart.h` | Cart boilerplate - buffer declarations + `WC_FILL_INFO`, plus the opt-in `WC_DEBUG_FIELDS` |\n| `wc_fb.h` | 2D drawing (fill_rect, blit, alpha blend) |\n| `wc_gl.h` / `wc_gl_blit.h` | Shader compile/link, VAO/VBO helpers, CPU→GPU blit |\n| `wc_math.h` | sin, cos, sqrt, atan2 (no libm) |\n| `wc_mat4.h` / `wc_vec3.h` | 4x4 matrix + 3D vector ops |\n| `wc_pcm_mixer.h` | Multi-channel PCM mixer + WAV parser |\n\nFor porting *existing* C/SDL games, [`docs/porting.md`](docs/porting.md) is the\nshort version; the [**wasmcart-sdl2**](https://github.com/wasmcart/wasmcart-sdl2)\nrepo has the SDL2 backend itself plus the full porting guide.\n\n### Threading ([wasi-sdk](https://github.com/WebAssembly/wasi-sdk))\n\nCarts can spawn background threads using standard pthreads. Requires wasi-sdk (not Emscripten):\n\n```bash\n${WASI_SDK}/bin/clang --target=wasm32-wasip1-threads -pthread \\\n  -Wl,--import-memory,--shared-memory,--max-memory=67108864 \\\n  -Wl,--no-entry -nostartfiles -O2 -o cart.wasm cart.c\n```\n\nThe host detects a threaded cart from its wasm imports (shared memory) and wires\nup the worker pool itself - no manifest field, and no change to the three-export\ncontract.\n\n### `setjmp` / `longjmp` ([wasi-sdk](https://github.com/WebAssembly/wasi-sdk))\n\nwasmcart hosts support standardized WebAssembly exception handling. With\nwasi-sdk 33, opt into its Wasm-native SjLj implementation at compile time and\nlink `libsetjmp`:\n\n```bash\n${WASI_SDK}/bin/clang --target=wasm32-wasip1-threads -pthread \\\n  -mllvm -wasm-enable-sjlj -O2 -Wl,--no-entry \\\n  -o cart.wasm cart.c -lsetjmp\n```\n\nUse the same SjLj setting for every translation unit participating in the\noperation. No wasmcart manifest field or host import is required; this is a\nruntime-engine feature. The Node.js and browser test suites both execute a\nnative SjLj fixture.\n\n## Examples\n\nExample carts range from minimal (`hello`) to full game ports. They live outside\nthis repo - the game ports are upstream forks on a `wasmcart` branch, each\nshipping its `.wasc` as a Release artifact:\n\n| Example | Type | Description |\n|---------|------|-------------|\n| `hello` | 2D | Minimal ABI demo |\n| `hello_gl` | GL | Minimal GL triangle |\n| `hello_threads` | 2D + threads | WASI threads demo |\n| `snake`, `breakout`, `tetris` | 2D | Classic arcade games |\n| `doom` | 2D | DOOM (doomgeneric) |\n| `neverball`, `neverputt` | GL | GL1.x via [gl4es](https://github.com/ptitSeb/gl4es) |\n| `chromium_bsu` | GL | GL1.x shoot-em-up |\n| `etr` | GL | Extreme Tux Racer (SFML port) |\n| `openarena2` | GL | Quake III Arena (ioquake3) |\n| `flare`, `flare_es` | 2D | FLARE RPG (hand-port and SDL2 backend) |\n\n## Documentation\n\n- **[SPEC.md](SPEC.md)** - the normative specification\n- **[`docs/`](docs/)** - per-subsystem guides: [input](docs/input.md), [networking](docs/networking.md), [GL surface](docs/gl-surface.md), [framebuffer](docs/bind_framebuffer.md), [fetch](docs/fetch.md), [porting](docs/porting.md)\n- **[`include/`](include/)** - C headers for cart authors (`wc_cart.h` is the contract; `wc_fb.h`/`wc_gl.h`/math/mixer are a lightweight SDK)\n\n## Vendored headers\n\nSeveral SDKs and ports copy `include/*.h` rather than depending on the npm\npackage -- reasonable, since a C toolchain should not need node -- but a copy\nrots every time the ABI moves. That has happened: thirteen copies of\n`wasmcart.h` had drifted into four different versions, one of them empty, still\ndeclaring the `wc_ws_*` / `wc_dc_*` families the `wc_peer_*` merge removed.\n\n```sh\n./scripts/sync-headers.sh          # report drift, change nothing\n./scripts/sync-headers.sh --write  # overwrite drifted copies from include/\n```\n\nIt searches sibling directories, so run it from a tree with the other repos\nchecked out, before releasing an ABI change. A copy carrying declarations the\ncanonical header lacks is reported as a `FORK` and never overwritten.\n\n## The wasmcart org\n\nwasmcart is a small ecosystem. This repo is the spec + JS reference hosts; the rest\nare separate repos, all running the *same* carts. Full list:\n**[github.com/orgs/wasmcart/repositories](https://github.com/orgs/wasmcart/repositories)**\n\n| Repo | What it is |\n|------|------------|\n| [**wasmcart**](https://github.com/wasmcart/wasmcart) (this repo) | Spec, JS reference hosts (`CartHost`, `CartHostWeb`), the `wasmcart` CLI + packer |\n| [**wasmcart-sdl2**](https://github.com/wasmcart/wasmcart-sdl2) | SDL2 backend + `stb_*` helpers + the full porting guide - for porting existing C/SDL games |\n| [**wasmcart-mruby**](https://github.com/wasmcart/wasmcart-mruby) | write games in Ruby (mruby runtime, DragonRuby-style API) - prebuilt engine, games ship only Ruby |\n| [**wasmcart-lua**](https://github.com/wasmcart/wasmcart-lua) | write games in Lua (Lua 5.4, LÖVE-style API, batched GL2D renderer) - prebuilt engine, games ship only Lua |\n| [**wasmcart-pygame**](https://github.com/wasmcart/wasmcart-pygame) | write games in Python (CPython 3.13 + pygame-ce) - one reusable runtime, games ship only Python and assets |\n| [**wasmcart-jsgame**](https://github.com/wasmcart/wasmcart-jsgame) | write games in JavaScript - sandboxed QuickJS runtime with Canvas 2D, WebGL2 and Web Audio |\n| [**wasmcart-godot**](https://github.com/wasmcart/wasmcart-godot) | write games in GDScript - Godot 4 compiled to standalone WebAssembly |\n| [**wasmcart-rust**](https://github.com/wasmcart/wasmcart-rust) | write games in Rust - `no_std` bindings + a `wc_cart!` macro, no runtime and no allocator |\n| [**wasmcart-zig**](https://github.com/wasmcart/wasmcart-zig) | write games in Zig - freestanding bindings + a comptime `Cart(.{...})` helper |\n| [**wasmcart-libretro**](https://github.com/wasmcart/wasmcart-libretro) | libretro core - run carts in RetroArch / RetroDECK |\n| [**wasmcart-native**](https://github.com/wasmcart/wasmcart-native) | native host built on libnode - a standalone player with no Node install |\n| [**build-libnode**](https://github.com/wasmcart/build-libnode) | precompiled libnode for V8-WASM use, the substrate the native host builds on |\n| [**retroemu**](https://github.com/monteslu/retroemu) | terminal + SDL host (libretro cores *and* wasmcart carts) |\n| game port forks | each an upstream game fork on a `wasmcart` branch (`.wasc` shipped as Release artifacts) |\n\n## License\n\nMIT - see [LICENSE](LICENSE). Compatible with all dependencies\n([fflate](https://github.com/101arrowz/fflate),\n[yauzl](https://github.com/thejoshwolfe/yauzl),\n[yazl](https://github.com/thejoshwolfe/yazl) - all MIT).\n","readmeFilename":"README.md"}