{"_id":"@yuuang/ffi-rs-linux-arm-gnueabihf","_rev":"29-b2912e0622ace8397816b19f3b272fda","name":"@yuuang/ffi-rs-linux-arm-gnueabihf","dist-tags":{"latest":"1.3.4"},"versions":{"1.0.93":{"name":"@yuuang/ffi-rs-linux-arm-gnueabihf","version":"1.0.93","license":"MIT","_id":"@yuuang/ffi-rs-linux-arm-gnueabihf@1.0.93","maintainers":[{"name":"zhangyuang","email":"569105585@qq.com"}],"os":["linux"],"cpu":["arm"],"dist":{"shasum":"c4ad6dca220f800df39664f86cdfe1602cf3dcc6","tarball":"https://registry.npmjs.org/@yuuang/ffi-rs-linux-arm-gnueabihf/-/ffi-rs-linux-arm-gnueabihf-1.0.93.tgz","fileCount":2,"integrity":"sha512-hlhomOX95u2Ohe4CBx7xySdBCMaDtzFDpsDx7Ca5wVEnIPicdDimJUX3RzxrjSy2GmZNlV30fNQdfK1Q+r+m9A==","signatures":[{"sig":"MEYCIQCrdYuiqZdKWqyf0eNy265eHQhrwGLHCyGEsFPgWffmSQIhAKUSC8peQ7dW4Z/hs0bGsUuXEI7N19HXYASw/g/EVdBq","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":22488},"main":"ffi-rs.linux-arm-gnueabihf.node","engines":{"node":">= 12"},"gitHead":"65a269adcd9e059c8d40637d6544299d371f999a","_npmUser":{"name":"zhangyuang","email":"569105585@qq.com"},"_npmVersion":"10.7.0","description":"<div> <a href=\"https://github.com/zhangyuang/node-ffi-rs/blob/master/README.md\">English</a> | <a href=\"https://github.com/zhangyuang/node-ffi-rs/blob/master/README_Zh.md\">简体中文</a> </div>","directories":{},"_nodeVersion":"18.20.4","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/ffi-rs-linux-arm-gnueabihf_1.0.93_1726066129203_0.9941853627146344","host":"s3://npm-registry-packages"}},"1.0.94":{"name":"@yuuang/ffi-rs-linux-arm-gnueabihf","version":"1.0.94","license":"MIT","_id":"@yuuang/ffi-rs-linux-arm-gnueabihf@1.0.94","maintainers":[{"name":"zhangyuang","email":"569105585@qq.com"}],"os":["linux"],"cpu":["arm"],"dist":{"shasum":"492d2584534ad4e71bca068b2c3e6f18440195bc","tarball":"https://registry.npmjs.org/@yuuang/ffi-rs-linux-arm-gnueabihf/-/ffi-rs-linux-arm-gnueabihf-1.0.94.tgz","fileCount":3,"integrity":"sha512-91vbRW9E8YJb3rfFxtwsOBQkS2m7xOCOGjVK5p2MyUJX464BYFAYcis33hPLBrXu/HAIIoBVrx8RDlwv31Q6tQ==","signatures":[{"sig":"MEUCIQDkLAIDuGzw8/sf2vohhaG2nvhkwl+LRrAaoCUuH0B/PwIgCxKhWGG1qVZ6jwEIbOCahgIfh6a4w7+mBgpdQEeGs70=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":696220},"main":"ffi-rs.linux-arm-gnueabihf.node","engines":{"node":">= 12"},"gitHead":"6d636964084516d6088b5037261e780fcd407eae","_npmUser":{"name":"zhangyuang","email":"569105585@qq.com"},"_npmVersion":"10.7.0","description":"<div> <a href=\"https://github.com/zhangyuang/node-ffi-rs/blob/master/README.md\">English</a> | <a href=\"https://github.com/zhangyuang/node-ffi-rs/blob/master/README_Zh.md\">简体中文</a> </div>","directories":{},"_nodeVersion":"18.20.4","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/ffi-rs-linux-arm-gnueabihf_1.0.94_1726240542540_0.736226272743395","host":"s3://npm-registry-packages"}},"1.0.95":{"name":"@yuuang/ffi-rs-linux-arm-gnueabihf","version":"1.0.95","license":"MIT","_id":"@yuuang/ffi-rs-linux-arm-gnueabihf@1.0.95","maintainers":[{"name":"zhangyuang","email":"569105585@qq.com"}],"os":["linux"],"cpu":["arm"],"dist":{"shasum":"7056a00bd4826be0665e0684442ade5d769e2108","tarball":"https://registry.npmjs.org/@yuuang/ffi-rs-linux-arm-gnueabihf/-/ffi-rs-linux-arm-gnueabihf-1.0.95.tgz","fileCount":3,"integrity":"sha512-zypO+gvW6Z+1UYXglDFuqfpjZzV0EloSkAtlbL/plwCwsqKzGM92deKrV91rlhMl4Id2l0yn0pPayuPEKw/x+w==","signatures":[{"sig":"MEUCIAszYQDXGlromQD2NUBI4QvTlvnEudG2DWIa9Zp+IXnCAiEA94EhVZwcbQONbPxlknT02VVGRFIhU/eiM9baPnRYBpI=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":696242},"main":"ffi-rs.linux-arm-gnueabihf.node","engines":{"node":">= 12"},"gitHead":"9824498504afb6987d4fcee1dc54991aac48f7dc","_npmUser":{"name":"zhangyuang","email":"569105585@qq.com"},"_npmVersion":"10.7.0","description":"<div> <a href=\"https://github.com/zhangyuang/node-ffi-rs/blob/master/README.md\">English</a> | <a href=\"https://github.com/zhangyuang/node-ffi-rs/blob/master/README_Zh.md\">简体中文</a> </div>","directories":{},"_nodeVersion":"18.20.4","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/ffi-rs-linux-arm-gnueabihf_1.0.95_1726586899095_0.7345193307575331","host":"s3://npm-registry-packages"}},"1.0.96":{"name":"@yuuang/ffi-rs-linux-arm-gnueabihf","version":"1.0.96","license":"MIT","_id":"@yuuang/ffi-rs-linux-arm-gnueabihf@1.0.96","maintainers":[{"name":"zhangyuang","email":"569105585@qq.com"}],"os":["linux"],"cpu":["arm"],"dist":{"shasum":"ffe81af42e6dca65cd8c7be700e54b0873580c56","tarball":"https://registry.npmjs.org/@yuuang/ffi-rs-linux-arm-gnueabihf/-/ffi-rs-linux-arm-gnueabihf-1.0.96.tgz","fileCount":3,"integrity":"sha512-kOoQS0RK2iDM+GrNf/bCR7d7U6HTZR2jThqwDk3qUToc/ww5KGhbHCTJcAljgeYZJNsf5DvlIbKP6XJjUGQ6og==","signatures":[{"sig":"MEYCIQDLSPQSyYhfJ28xSUtwxDoN1tVUhD9iPjRmh4KAii2RnwIhAPnG6LQOV3U85TbZ40B/2xCc2s6vYJzlEVh3jbYafzQG","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":696215},"main":"ffi-rs.linux-arm-gnueabihf.node","engines":{"node":">= 12"},"gitHead":"8adeb2d2cef713249aae29a65dc525501f70aaee","_npmUser":{"name":"zhangyuang","email":"569105585@qq.com"},"_npmVersion":"10.7.0","description":"<div> <a href=\"https://github.com/zhangyuang/node-ffi-rs/blob/master/README.md\">English</a> | <a href=\"https://github.com/zhangyuang/node-ffi-rs/blob/master/README_Zh.md\">简体中文</a> </div>","directories":{},"_nodeVersion":"18.20.4","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/ffi-rs-linux-arm-gnueabihf_1.0.96_1727014398357_0.9575385588152299","host":"s3://npm-registry-packages"}},"1.0.97":{"name":"@yuuang/ffi-rs-linux-arm-gnueabihf","version":"1.0.97","license":"MIT","_id":"@yuuang/ffi-rs-linux-arm-gnueabihf@1.0.97","maintainers":[{"name":"zhangyuang","email":"569105585@qq.com"}],"os":["linux"],"cpu":["arm"],"dist":{"shasum":"ece6c6ae35bb3d5a8df4b61b5bccd057a396a35e","tarball":"https://registry.npmjs.org/@yuuang/ffi-rs-linux-arm-gnueabihf/-/ffi-rs-linux-arm-gnueabihf-1.0.97.tgz","fileCount":3,"integrity":"sha512-YOnPVuu6o9svxjzrnj1g7fA2dNPTc/mnnmylUnd/lVLAJ42vXys2WN0nkOlhDpEgXoyJWi3NzgV5qrfvQaNMjA==","signatures":[{"sig":"MEUCIGcdpRW28xoXKpuX0ia1pdqgP6C1gz1LPn685BwcdnTmAiEAoiBmUGgl9StJq2ICCkYjANIqGRs9FK050zCFzBZzRLI=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":696232},"main":"ffi-rs.linux-arm-gnueabihf.node","engines":{"node":">= 12"},"gitHead":"942486dc39e6696ca40a956e54305d230c35ff9a","_npmUser":{"name":"zhangyuang","email":"569105585@qq.com"},"_npmVersion":"10.7.0","description":"<div> <a href=\"https://github.com/zhangyuang/node-ffi-rs/blob/master/README.md\">English</a> | <a href=\"https://github.com/zhangyuang/node-ffi-rs/blob/master/README_Zh.md\">简体中文</a> </div>","directories":{},"_nodeVersion":"18.20.4","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/ffi-rs-linux-arm-gnueabihf_1.0.97_1729615116579_0.35389781728393266","host":"s3://npm-registry-packages"}},"1.0.98":{"name":"@yuuang/ffi-rs-linux-arm-gnueabihf","version":"1.0.98","license":"MIT","_id":"@yuuang/ffi-rs-linux-arm-gnueabihf@1.0.98","maintainers":[{"name":"zhangyuang","email":"569105585@qq.com"}],"os":["linux"],"cpu":["arm"],"dist":{"shasum":"8c33495d8939a6d0e00c73786115f42e4856e221","tarball":"https://registry.npmjs.org/@yuuang/ffi-rs-linux-arm-gnueabihf/-/ffi-rs-linux-arm-gnueabihf-1.0.98.tgz","fileCount":3,"integrity":"sha512-/Mro9KXrsEGrfOUFavLevUBUF2+9Fe5eQp5ztMaUueXzNtRfvys63JrTKFa+6jBaY8TYmeu/aTWbXUmMIYNlZQ==","signatures":[{"sig":"MEUCIQC15gkat39WUeZIA/fmikij6GeyGZdGX7rlGrJ/zDwPaAIgR28e21vgnQ9EIBVzh95Sp3SkOJ64THjo49MgmSl4bg4=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":696232},"main":"ffi-rs.linux-arm-gnueabihf.node","engines":{"node":">= 12"},"gitHead":"620e87cca8909b2431b4feb4e879ebdeeadc8666","_npmUser":{"name":"zhangyuang","email":"569105585@qq.com"},"_npmVersion":"10.7.0","description":"<div> <a href=\"https://github.com/zhangyuang/node-ffi-rs/blob/master/README.md\">English</a> | <a href=\"https://github.com/zhangyuang/node-ffi-rs/blob/master/README_Zh.md\">简体中文</a> </div>","directories":{},"_nodeVersion":"18.20.4","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/ffi-rs-linux-arm-gnueabihf_1.0.98_1730201382063_0.30603416540562756","host":"s3://npm-registry-packages"}},"1.0.99":{"name":"@yuuang/ffi-rs-linux-arm-gnueabihf","version":"1.0.99","license":"MIT","_id":"@yuuang/ffi-rs-linux-arm-gnueabihf@1.0.99","maintainers":[{"name":"zhangyuang","email":"569105585@qq.com"}],"os":["linux"],"cpu":["arm"],"dist":{"shasum":"11941cefc43863b9bc4950339dbf355d2a143a07","tarball":"https://registry.npmjs.org/@yuuang/ffi-rs-linux-arm-gnueabihf/-/ffi-rs-linux-arm-gnueabihf-1.0.99.tgz","fileCount":3,"integrity":"sha512-9DdLxXK0jVG2aTiiYPWJavSvG7BulFSr+5acudjr/hd7D2i2Jjw7b8O6k0RtZyMrFeee31uRPF4w761n9tQywA==","signatures":[{"sig":"MEUCIHwD6pIzVZbaKB3PbmQwSjvb3B1FzNMb5ez2vwYoPWY4AiEA5PrsiN67L5dLRQHBhFM51PIbo/tUxv4Iwtt7frQ6XFw=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":696232},"main":"ffi-rs.linux-arm-gnueabihf.node","engines":{"node":">= 12"},"gitHead":"465f7d454a8ac1f9f15a95b3fed5f0c2c16e0f31","_npmUser":{"name":"zhangyuang","email":"569105585@qq.com"},"_npmVersion":"10.8.2","description":"<div> <a href=\"https://github.com/zhangyuang/node-ffi-rs/blob/master/README.md\">English</a> | <a href=\"https://github.com/zhangyuang/node-ffi-rs/blob/master/README_Zh.md\">简体中文</a> </div>","directories":{},"_nodeVersion":"18.20.5","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/ffi-rs-linux-arm-gnueabihf_1.0.99_1731849617415_0.16744256755810127","host":"s3://npm-registry-packages"}},"1.1.0":{"name":"@yuuang/ffi-rs-linux-arm-gnueabihf","version":"1.1.0","license":"MIT","_id":"@yuuang/ffi-rs-linux-arm-gnueabihf@1.1.0","maintainers":[{"name":"zhangyuang","email":"569105585@qq.com"}],"os":["linux"],"cpu":["arm"],"dist":{"shasum":"e35cbf31e273e0e089951298929aeb42e837b404","tarball":"https://registry.npmjs.org/@yuuang/ffi-rs-linux-arm-gnueabihf/-/ffi-rs-linux-arm-gnueabihf-1.1.0.tgz","fileCount":3,"integrity":"sha512-Esfh8F8zNdrxcQQunXP4QAqgVsRZGeVgFhhSFmCaAK/l7yCRsNcDnKpdpksDRf0w6pBerepPI4YKHvkO+C0BvQ==","signatures":[{"sig":"MEYCIQCrnWPkhFWISSVZpl1f3bHJegTYeqajakyIESnweD2QcQIhAJmqbp3frDPrnOCvDSMyluw/xgJpi1i3bzJycCq9xWO0","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":696255},"main":"ffi-rs.linux-arm-gnueabihf.node","engines":{"node":">= 12"},"gitHead":"53247d1ec898e78418d676af3f7c478255bef723","_npmUser":{"name":"zhangyuang","email":"569105585@qq.com"},"_npmVersion":"10.8.2","description":"<div> <a href=\"https://github.com/zhangyuang/node-ffi-rs/blob/master/README.md\">English</a> | <a href=\"https://github.com/zhangyuang/node-ffi-rs/blob/master/README_Zh.md\">简体中文</a> </div>","directories":{},"_nodeVersion":"18.20.5","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/ffi-rs-linux-arm-gnueabihf_1.1.0_1731860939711_0.5314590628719418","host":"s3://npm-registry-packages"}},"1.1.1":{"name":"@yuuang/ffi-rs-linux-arm-gnueabihf","version":"1.1.1","license":"MIT","_id":"@yuuang/ffi-rs-linux-arm-gnueabihf@1.1.1","maintainers":[{"name":"zhangyuang","email":"569105585@qq.com"}],"os":["linux"],"cpu":["arm"],"dist":{"shasum":"a8e1a99ccaba2d015d8777466ed47a10df01f16d","tarball":"https://registry.npmjs.org/@yuuang/ffi-rs-linux-arm-gnueabihf/-/ffi-rs-linux-arm-gnueabihf-1.1.1.tgz","fileCount":3,"integrity":"sha512-aSIX8f5MVVoUnc+j1Al2KhbZx1crQVDYVLGtkjLQgV6iWbaH/o6sXGdqo0Jz33b0+GxgUxDCjZMCC7uMvnmnbg==","signatures":[{"sig":"MEUCIQC0gEasb6j4nVfTqt3R6/kMcck7455HT6fiLOxzJ0IQSAIgTtgvUt16LoNaF4tbz9/oyzLsTVeAoK415cHbZvz1bqw=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":696277},"main":"ffi-rs.linux-arm-gnueabihf.node","engines":{"node":">= 12"},"gitHead":"3d68779b51cb513a449f3d4447ac103ea21b8b5a","_npmUser":{"name":"zhangyuang","email":"569105585@qq.com"},"_npmVersion":"10.8.2","description":"<div> <a href=\"https://github.com/zhangyuang/node-ffi-rs/blob/master/README.md\">English</a> | <a href=\"https://github.com/zhangyuang/node-ffi-rs/blob/master/README_Zh.md\">简体中文</a> </div>","directories":{},"_nodeVersion":"18.20.5","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/ffi-rs-linux-arm-gnueabihf_1.1.1_1732004660933_0.0002774227616104685","host":"s3://npm-registry-packages"}},"1.2.0":{"name":"@yuuang/ffi-rs-linux-arm-gnueabihf","version":"1.2.0","license":"MIT","_id":"@yuuang/ffi-rs-linux-arm-gnueabihf@1.2.0","maintainers":[{"name":"zhangyuang","email":"569105585@qq.com"}],"os":["linux"],"cpu":["arm"],"dist":{"shasum":"c2a43567b95ba2e74065c90db0a3dd45645dbde3","tarball":"https://registry.npmjs.org/@yuuang/ffi-rs-linux-arm-gnueabihf/-/ffi-rs-linux-arm-gnueabihf-1.2.0.tgz","fileCount":3,"integrity":"sha512-i6xwSbo6ZWnzzmTqCO/ONh5fxRj3odsiF/Jj4tJe899JJLe2bg9zI8THxZRrGvfN5GKfQTDCA0F8JVzkfaRC/g==","signatures":[{"sig":"MEUCIHlo0LCzLaR2ONhF+vo3RpU1+JmcPOguAUjDJ9vI4USqAiEAqfLwbMeYWGPSqa04TVSMv8M9rOPXETwIzYyY6JZZj1g=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":717859},"main":"ffi-rs.linux-arm-gnueabihf.node","engines":{"node":">= 12"},"gitHead":"ab93b635b55a5c7512f98f86e279d37ae01fea01","_npmUser":{"name":"zhangyuang","email":"569105585@qq.com"},"_npmVersion":"10.8.2","description":"<div> <a href=\"https://github.com/zhangyuang/node-ffi-rs/blob/master/README.md\">English</a> | <a href=\"https://github.com/zhangyuang/node-ffi-rs/blob/master/README_Zh.md\">简体中文</a> </div>","directories":{},"_nodeVersion":"18.20.5","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/ffi-rs-linux-arm-gnueabihf_1.2.0_1734951731917_0.6889511269284365","host":"s3://npm-registry-packages-npm-production"}},"1.2.1":{"name":"@yuuang/ffi-rs-linux-arm-gnueabihf","version":"1.2.1","license":"MIT","_id":"@yuuang/ffi-rs-linux-arm-gnueabihf@1.2.1","maintainers":[{"name":"zhangyuang","email":"569105585@qq.com"}],"os":["linux"],"cpu":["arm"],"dist":{"shasum":"e3137c7252db119587732c34319e1d5f997c2239","tarball":"https://registry.npmjs.org/@yuuang/ffi-rs-linux-arm-gnueabihf/-/ffi-rs-linux-arm-gnueabihf-1.2.1.tgz","fileCount":3,"integrity":"sha512-8Y7VXc2l1614Z/ikfdG2cIR+l+GWX9EUAJHCBSr0DfV+nzb3UUXCKC2RZhcnAAYEtvnTQ8rNgFodtYNLMK97Bg==","signatures":[{"sig":"MEUCIC612XtcL6si+GWo+urOctw/3dBqRZw1C+I2WRC1/HzHAiEAyXe+cn2hklyRz9huDOT7FEpdEvP1ZyXFdrzp5TrsOMI=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":717859},"main":"ffi-rs.linux-arm-gnueabihf.node","engines":{"node":">= 12"},"gitHead":"cc04e47944750b535f1af07630c35405bc71fa89","_npmUser":{"name":"zhangyuang","email":"569105585@qq.com"},"_npmVersion":"10.8.2","description":"<div> <a href=\"https://github.com/zhangyuang/node-ffi-rs/blob/master/README.md\">English</a> | <a href=\"https://github.com/zhangyuang/node-ffi-rs/blob/master/README_Zh.md\">简体中文</a> </div>","directories":{},"_nodeVersion":"18.20.5","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/ffi-rs-linux-arm-gnueabihf_1.2.1_1735031917670_0.8359608578791147","host":"s3://npm-registry-packages-npm-production"}},"1.2.2":{"name":"@yuuang/ffi-rs-linux-arm-gnueabihf","version":"1.2.2","license":"MIT","_id":"@yuuang/ffi-rs-linux-arm-gnueabihf@1.2.2","maintainers":[{"name":"zhangyuang","email":"569105585@qq.com"}],"os":["linux"],"cpu":["arm"],"dist":{"shasum":"f07eecc80567b124e5b3d998423c3f3ae98c0072","tarball":"https://registry.npmjs.org/@yuuang/ffi-rs-linux-arm-gnueabihf/-/ffi-rs-linux-arm-gnueabihf-1.2.2.tgz","fileCount":3,"integrity":"sha512-4ihnhfA+hfMSSxbMW8UvTlmVTi6Sw1D2Le50yG88EVkavWIxaCIIunwmoF25Ar+TOP94tiO+yETfnwvsuAVTLw==","signatures":[{"sig":"MEQCIAEdSfkArTwo+KSMLfu5brcc4Wt+NAyZ96A7tZI/EgsrAiBOPoorOwAMsjMw0FqyAlWLOIHX6PEM6BSHILIEZflAyA==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":717859},"main":"ffi-rs.linux-arm-gnueabihf.node","engines":{"node":">= 12"},"gitHead":"c74968dbb18bda01541d0a86d6e2e2e04e0a407f","_npmUser":{"name":"zhangyuang","email":"569105585@qq.com"},"_npmVersion":"10.8.2","description":"<div> <a href=\"https://github.com/zhangyuang/node-ffi-rs/blob/master/README.md\">English</a> | <a href=\"https://github.com/zhangyuang/node-ffi-rs/blob/master/README_Zh.md\">简体中文</a> </div>","directories":{},"_nodeVersion":"18.20.5","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/ffi-rs-linux-arm-gnueabihf_1.2.2_1736266102883_0.48255715724410275","host":"s3://npm-registry-packages-npm-production"}},"1.2.3":{"name":"@yuuang/ffi-rs-linux-arm-gnueabihf","version":"1.2.3","license":"MIT","_id":"@yuuang/ffi-rs-linux-arm-gnueabihf@1.2.3","maintainers":[{"name":"zhangyuang","email":"569105585@qq.com"}],"os":["linux"],"cpu":["arm"],"dist":{"shasum":"5ef55575195996affc9ceda6b674aa24de8d8c64","tarball":"https://registry.npmjs.org/@yuuang/ffi-rs-linux-arm-gnueabihf/-/ffi-rs-linux-arm-gnueabihf-1.2.3.tgz","fileCount":3,"integrity":"sha512-Y46a6XFmtzp0Yj54EVOhHNyzcF8CVxtymJyFx8ZMAnukpqGZMaas5xhuIRlDX8SEmSUFReGYN1i0pm6Z7Nq+Ww==","signatures":[{"sig":"MEUCIQD31mlyFnx27bZptooEgwBNfQyiJDSBEOaF+1+NNYpbDwIgDTXCNj1k4IpnKBEDQYT6TN4M5mVXlnWE2+wevQQnrHw=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":717859},"main":"ffi-rs.linux-arm-gnueabihf.node","engines":{"node":">= 12"},"gitHead":"62c5e1d1c74dd8c010fde63f7bced7d8abadfa1d","_npmUser":{"name":"zhangyuang","email":"569105585@qq.com"},"_npmVersion":"10.8.2","description":"<div> <a href=\"https://github.com/zhangyuang/node-ffi-rs/blob/master/README.md\">English</a> | <a href=\"https://github.com/zhangyuang/node-ffi-rs/blob/master/README_Zh.md\">简体中文</a> </div>","directories":{},"_nodeVersion":"18.20.5","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/ffi-rs-linux-arm-gnueabihf_1.2.3_1736670332351_0.6266197568193268","host":"s3://npm-registry-packages-npm-production"}},"1.2.4":{"name":"@yuuang/ffi-rs-linux-arm-gnueabihf","version":"1.2.4","license":"MIT","_id":"@yuuang/ffi-rs-linux-arm-gnueabihf@1.2.4","maintainers":[{"name":"zhangyuang","email":"569105585@qq.com"}],"os":["linux"],"cpu":["arm"],"dist":{"shasum":"0916ad6c0f5ddeb64fafe4484476a33c58a794d9","tarball":"https://registry.npmjs.org/@yuuang/ffi-rs-linux-arm-gnueabihf/-/ffi-rs-linux-arm-gnueabihf-1.2.4.tgz","fileCount":3,"integrity":"sha512-ghY9HmSh1irZFAN6HUyM4Fkc5HJ1eCJT8IndouNAO0CNLcbYOS0uCy2lWQOAY+pw8qvGB3gB3CwsFjx8kQi0Uw==","signatures":[{"sig":"MEYCIQCEjklSF9NSk49DT+5Bk8AVcAo+nWUCVuVB81S4nPmCegIhAOil8/ZS0obxICIRkYXW/CRaAVzDIjtVWdmfM/G4tPNb","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":721984},"main":"ffi-rs.linux-arm-gnueabihf.node","engines":{"node":">= 12"},"gitHead":"2c3e37b82b6fb6b63cb1673792764c1af7422d61","_npmUser":{"name":"zhangyuang","email":"569105585@qq.com"},"_npmVersion":"10.8.2","description":"<div> <a href=\"https://github.com/zhangyuang/node-ffi-rs/blob/master/README.md\">English</a> | <a href=\"https://github.com/zhangyuang/node-ffi-rs/blob/master/README_Zh.md\">简体中文</a> </div>","directories":{},"_nodeVersion":"18.20.6","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/ffi-rs-linux-arm-gnueabihf_1.2.4_1737721325055_0.2532533800498311","host":"s3://npm-registry-packages-npm-production"}},"1.2.5":{"name":"@yuuang/ffi-rs-linux-arm-gnueabihf","version":"1.2.5","license":"MIT","_id":"@yuuang/ffi-rs-linux-arm-gnueabihf@1.2.5","maintainers":[{"name":"zhangyuang","email":"569105585@qq.com"}],"os":["linux"],"cpu":["arm"],"dist":{"shasum":"48cb4a51933a53603099340ce07b8bb2bd8a82a8","tarball":"https://registry.npmjs.org/@yuuang/ffi-rs-linux-arm-gnueabihf/-/ffi-rs-linux-arm-gnueabihf-1.2.5.tgz","fileCount":3,"integrity":"sha512-zl4EHNoajNZZ7UXVmpon6TGBKKbpGP7kxMn0+aWJUUxGjPXqIuF2DsA+HSOOozuSmUv7OOVJhksIyGebiHb3OA==","signatures":[{"sig":"MEQCIAKFL9VJb2qSU+AqacKJYkVNPAxqWxPPOMHZ/7YEVAzwAiBxJjGjuVnlaJpalEQ8QB/YSrNmbRgLuEHXxaFWeALV0A==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":721986},"main":"ffi-rs.linux-arm-gnueabihf.node","engines":{"node":">= 12"},"gitHead":"eb8c81c17de167c6f5431bbd67dbe1035425800d","_npmUser":{"name":"zhangyuang","email":"569105585@qq.com"},"_npmVersion":"10.8.2","description":"<div> <a href=\"https://github.com/zhangyuang/node-ffi-rs/blob/master/README.md\">English</a> | <a href=\"https://github.com/zhangyuang/node-ffi-rs/blob/master/README_Zh.md\">简体中文</a> </div>","directories":{},"_nodeVersion":"18.20.6","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/ffi-rs-linux-arm-gnueabihf_1.2.5_1739035639011_0.4882082890659647","host":"s3://npm-registry-packages-npm-production"}},"1.2.6":{"name":"@yuuang/ffi-rs-linux-arm-gnueabihf","version":"1.2.6","license":"MIT","_id":"@yuuang/ffi-rs-linux-arm-gnueabihf@1.2.6","maintainers":[{"name":"zhangyuang","email":"569105585@qq.com"}],"os":["linux"],"cpu":["arm"],"dist":{"shasum":"573d4243b42adf7eb45e1bb1dd8fa1c35143d2c1","tarball":"https://registry.npmjs.org/@yuuang/ffi-rs-linux-arm-gnueabihf/-/ffi-rs-linux-arm-gnueabihf-1.2.6.tgz","fileCount":3,"integrity":"sha512-n5v5yyWIpjrVVVc3qVukkrINYbtTqTUBESun9EPi0y+zrXIUJhb3kFV5yA2y121ZOiLW2U+SdbcEbgt3TTjYgg==","signatures":[{"sig":"MEQCIElUvwgNKSi2gPBxxVDEbetndj/P8eASvd/PxLKWmPeLAiBX5z8QEwO/y/t+wLIN5eCscUU4D6xbwadBJdZnW3Xpaw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":722408},"main":"ffi-rs.linux-arm-gnueabihf.node","engines":{"node":">= 12"},"gitHead":"7ac71bf385381285022c0285949bb827fdd9c3a6","_npmUser":{"name":"zhangyuang","email":"569105585@qq.com"},"_npmVersion":"10.8.2","description":"<div> <a href=\"https://github.com/zhangyuang/node-ffi-rs/blob/master/README.md\">English</a> | <a href=\"https://github.com/zhangyuang/node-ffi-rs/blob/master/README_Zh.md\">简体中文</a> </div>","directories":{},"_nodeVersion":"18.20.7","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/ffi-rs-linux-arm-gnueabihf_1.2.6_1740116441629_0.18526260171405373","host":"s3://npm-registry-packages-npm-production"}},"1.2.8":{"name":"@yuuang/ffi-rs-linux-arm-gnueabihf","version":"1.2.8","license":"MIT","_id":"@yuuang/ffi-rs-linux-arm-gnueabihf@1.2.8","maintainers":[{"name":"zhangyuang","email":"569105585@qq.com"}],"os":["linux"],"cpu":["arm"],"dist":{"shasum":"6aa4b7425c9e45acb458460dba14842147a2e8f5","tarball":"https://registry.npmjs.org/@yuuang/ffi-rs-linux-arm-gnueabihf/-/ffi-rs-linux-arm-gnueabihf-1.2.8.tgz","fileCount":3,"integrity":"sha512-U2tEda5vjluve7AhUdW+tisJty0b8avTK+3Zl71p0R+mW42ODEu3zfj2fo9kqS90WnJeeUr1RL+DeEfjv+KNPg==","signatures":[{"sig":"MEUCIQCCekr34J+IM36ybOK1Msb1auWTj75D/kaj8lZO4ZOH/AIgP9lBpPM04rnN3WgSrAuCOcxWLLX3c3pgyrH1aKZxfTs=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":722424},"main":"ffi-rs.linux-arm-gnueabihf.node","engines":{"node":">= 12"},"gitHead":"5cbf7246b787804cebc5cfce74b31c4f3ef3beba","_npmUser":{"name":"zhangyuang","email":"569105585@qq.com"},"_npmVersion":"10.8.2","description":"<div> <a href=\"https://github.com/zhangyuang/node-ffi-rs/blob/master/README.md\">English</a> | <a href=\"https://github.com/zhangyuang/node-ffi-rs/blob/master/README_Zh.md\">简体中文</a> </div>","directories":{},"_nodeVersion":"18.20.7","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/ffi-rs-linux-arm-gnueabihf_1.2.8_1741242535439_0.4498719862335354","host":"s3://npm-registry-packages-npm-production"}},"1.2.9":{"name":"@yuuang/ffi-rs-linux-arm-gnueabihf","version":"1.2.9","license":"MIT","_id":"@yuuang/ffi-rs-linux-arm-gnueabihf@1.2.9","maintainers":[{"name":"zhangyuang","email":"569105585@qq.com"}],"os":["linux"],"cpu":["arm"],"dist":{"shasum":"21a16c08959a2f909daa7e34d92cdf176cd2c67a","tarball":"https://registry.npmjs.org/@yuuang/ffi-rs-linux-arm-gnueabihf/-/ffi-rs-linux-arm-gnueabihf-1.2.9.tgz","fileCount":3,"integrity":"sha512-eq+hhIZ+jbKIohhkv0dbh5J98xB773vvDoa8O0YdeKCCEelit5OGR7q1gwX6R1NbPUloYq82xwCZNa0Ea7PaLQ==","signatures":[{"sig":"MEUCIQD8068UQznMlvGdjvEmOKIvqBdwRT0RHuSsBncGB40VBgIgett4OK8Gktt7Yv7wccsGtbZQ5Z+YuujwhKZxqXUk8pU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":722541},"main":"ffi-rs.linux-arm-gnueabihf.node","engines":{"node":">= 12"},"gitHead":"2fd41d9a62b327870d1774856743f48a0187ae9b","_npmUser":{"name":"zhangyuang","email":"569105585@qq.com"},"_npmVersion":"10.8.2","description":"<div> <a href=\"https://github.com/zhangyuang/node-ffi-rs/blob/master/README.md\">English</a> | <a href=\"https://github.com/zhangyuang/node-ffi-rs/blob/master/README_Zh.md\">简体中文</a> </div>","directories":{},"_nodeVersion":"18.20.7","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/ffi-rs-linux-arm-gnueabihf_1.2.9_1742304021453_0.11036134574404466","host":"s3://npm-registry-packages-npm-production"}},"1.2.10":{"name":"@yuuang/ffi-rs-linux-arm-gnueabihf","version":"1.2.10","license":"MIT","_id":"@yuuang/ffi-rs-linux-arm-gnueabihf@1.2.10","maintainers":[{"name":"zhangyuang","email":"569105585@qq.com"}],"os":["linux"],"cpu":["arm"],"dist":{"shasum":"ff384ee05f27f4860efb3fc1b97c1b4029f5622b","tarball":"https://registry.npmjs.org/@yuuang/ffi-rs-linux-arm-gnueabihf/-/ffi-rs-linux-arm-gnueabihf-1.2.10.tgz","fileCount":3,"integrity":"sha512-rh8QyQZv/7M13BXIrQeZ1IS32U5R7XUM6fuNalVZhNKw86AsioNWS54S6lwRH+2qtIfMNslw1/KtlchbeOBJSw==","signatures":[{"sig":"MEUCIGzT5DMOjwz7Dp0KdBhs3KPnp+/3w3SH/oniD9XaB4LMAiEAyYYwG84mko464iGi8KJ83sq6uWeSoH9BnYGonMIm6qk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":730734},"main":"ffi-rs.linux-arm-gnueabihf.node","engines":{"node":">= 12"},"gitHead":"69be8c7803040e59848e9a33b367048a010af504","_npmUser":{"name":"zhangyuang","email":"569105585@qq.com"},"_npmVersion":"10.8.2","description":"<div> <a href=\"https://github.com/zhangyuang/node-ffi-rs/blob/master/README.md\">English</a> | <a href=\"https://github.com/zhangyuang/node-ffi-rs/blob/master/README_Zh.md\">简体中文</a> </div>","directories":{},"_nodeVersion":"18.20.8","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/ffi-rs-linux-arm-gnueabihf_1.2.10_1743665587330_0.7480431208455813","host":"s3://npm-registry-packages-npm-production"}},"1.2.11":{"name":"@yuuang/ffi-rs-linux-arm-gnueabihf","version":"1.2.11","license":"MIT","_id":"@yuuang/ffi-rs-linux-arm-gnueabihf@1.2.11","maintainers":[{"name":"zhangyuang","email":"569105585@qq.com"}],"os":["linux"],"cpu":["arm"],"dist":{"shasum":"e73fe42011662b191ecb1cc673c75492130fc077","tarball":"https://registry.npmjs.org/@yuuang/ffi-rs-linux-arm-gnueabihf/-/ffi-rs-linux-arm-gnueabihf-1.2.11.tgz","fileCount":3,"integrity":"sha512-IctE4jrEU2DMHArBOnk6iOhpn8vTvb9m+/hiIEMPhpOOAmFkUlvsLBb4mARxOHjvpLJtkBxFmbVnrq2VI5mQRg==","signatures":[{"sig":"MEUCIQDdzTTC9bRVJCNtuqVvJkIQQCGyFXx+ss/3iPd8IRg72QIgMvWPMW0NzUabnpdAgig3rzkVLJ82iqPKzWAhYawUqq0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":733787},"main":"ffi-rs.linux-arm-gnueabihf.node","engines":{"node":">= 12"},"gitHead":"c6f7817f4b19648bc03ac5f22f5287ee3cfaa378","_npmUser":{"name":"zhangyuang","email":"569105585@qq.com"},"_npmVersion":"10.8.2","description":"<div> <a href=\"https://github.com/zhangyuang/node-ffi-rs/blob/master/README.md\">English</a> | <a href=\"https://github.com/zhangyuang/node-ffi-rs/blob/master/README_Zh.md\">简体中文</a> </div>","directories":{},"_nodeVersion":"18.20.8","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/ffi-rs-linux-arm-gnueabihf_1.2.11_1748863983977_0.05433056940685699","host":"s3://npm-registry-packages-npm-production"}},"1.2.12":{"name":"@yuuang/ffi-rs-linux-arm-gnueabihf","version":"1.2.12","license":"MIT","_id":"@yuuang/ffi-rs-linux-arm-gnueabihf@1.2.12","maintainers":[{"name":"zhangyuang","email":"569105585@qq.com"}],"os":["linux"],"cpu":["arm"],"dist":{"shasum":"1de5f4d4c255d42ff792f75b1ff5c86211c8d97f","tarball":"https://registry.npmjs.org/@yuuang/ffi-rs-linux-arm-gnueabihf/-/ffi-rs-linux-arm-gnueabihf-1.2.12.tgz","fileCount":3,"integrity":"sha512-Q9u9YKr2Ev1wLFNC3Pao+c1kDzwBn+FrEHQJdgmiByml/kbKkUhKcre/tOx3cix6VFIRk0TyKIdYZ72vKzU9Ng==","signatures":[{"sig":"MEUCIQCh2FHLdtWMno0HM+1T5ZNmg+jLXQaKMlocVlwfQIwlJAIgWu/aAOp++MMggVyH477l+UihLmx0u6s+ki/fzm+kdCE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":733787},"main":"ffi-rs.linux-arm-gnueabihf.node","engines":{"node":">= 12"},"gitHead":"0ad9b690e8f68f0cccdbb8435327a7eda7e351e8","_npmUser":{"name":"zhangyuang","email":"569105585@qq.com"},"_npmVersion":"10.8.2","description":"<div> <a href=\"https://github.com/zhangyuang/node-ffi-rs/blob/master/README.md\">English</a> | <a href=\"https://github.com/zhangyuang/node-ffi-rs/blob/master/README_Zh.md\">简体中文</a> </div>","directories":{},"_nodeVersion":"18.20.8","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/ffi-rs-linux-arm-gnueabihf_1.2.12_1749024236069_0.1218276093057955","host":"s3://npm-registry-packages-npm-production"}},"1.2.13":{"name":"@yuuang/ffi-rs-linux-arm-gnueabihf","version":"1.2.13","license":"MIT","_id":"@yuuang/ffi-rs-linux-arm-gnueabihf@1.2.13","maintainers":[{"name":"zhangyuang","email":"569105585@qq.com"}],"os":["linux"],"cpu":["arm"],"dist":{"shasum":"89176a7de587a76c5d68a995b668d0953a2517c5","tarball":"https://registry.npmjs.org/@yuuang/ffi-rs-linux-arm-gnueabihf/-/ffi-rs-linux-arm-gnueabihf-1.2.13.tgz","fileCount":3,"integrity":"sha512-zQIR1cWEyMhc22j4JYG9Dd84ouet/5RxF8o7WSP9H3kLx9bgdsVQdgsUKegSFzHZojFXbwAjerXAPOWZeBlIaA==","signatures":[{"sig":"MEUCIB8XwhB7mIdQ9aEVdyOPNlCt6mJrk75jwNPqUeHTer8uAiEA2O8vCc1bSGBaPOP4BPIybnxzoX0C8W8DJELFtQLpDdA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":725595},"main":"ffi-rs.linux-arm-gnueabihf.node","engines":{"node":">= 12"},"gitHead":"d6d2cc68e1d0a6bf23a17a71e6dec17eebbc947c","_npmUser":{"name":"zhangyuang","actor":{"name":"zhangyuang","type":"user","email":"569105585@qq.com"},"email":"569105585@qq.com"},"_npmVersion":"10.8.2","description":"<div> <a href=\"https://github.com/zhangyuang/node-ffi-rs/blob/master/README.md\">English</a> | <a href=\"https://github.com/zhangyuang/node-ffi-rs/blob/master/README_Zh.md\">简体中文</a> </div>","directories":{},"_nodeVersion":"18.20.8","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/ffi-rs-linux-arm-gnueabihf_1.2.13_1751742478720_0.0558486606119033","host":"s3://npm-registry-packages-npm-production"}},"1.2.14":{"name":"@yuuang/ffi-rs-linux-arm-gnueabihf","version":"1.2.14","license":"MIT","_id":"@yuuang/ffi-rs-linux-arm-gnueabihf@1.2.14","maintainers":[{"name":"zhangyuang","email":"569105585@qq.com"}],"os":["linux"],"cpu":["arm"],"dist":{"shasum":"961643397a432e66f0e42adb341c0e34970e3aa6","tarball":"https://registry.npmjs.org/@yuuang/ffi-rs-linux-arm-gnueabihf/-/ffi-rs-linux-arm-gnueabihf-1.2.14.tgz","fileCount":3,"integrity":"sha512-7jWiy6x3/roGz7Rc1It+agu6ftYNJl5fPtHYX2X3qtdbgkKKuNPlLj8EE4jGOdeBzXLrUxJGFGoC2Y2AmSwZiA==","signatures":[{"sig":"MEQCIBbq3M6Y15fIPOAfLmNHV/gMu4SLuUZzCcFq/q2alWl9AiAAzuSy01cKx2SYLudhIo0Ioh5DsPJ/k9y4j4RoEaLndA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":729691},"main":"ffi-rs.linux-arm-gnueabihf.node","engines":{"node":">= 12"},"gitHead":"1eecf24ce53f2dd93c2e13d9060065c931fd37d9","_npmUser":{"name":"zhangyuang","email":"569105585@qq.com"},"_npmVersion":"10.8.2","description":"<div> <a href=\"https://github.com/zhangyuang/node-ffi-rs/blob/master/README.md\">English</a> | <a href=\"https://github.com/zhangyuang/node-ffi-rs/blob/master/README_Zh.md\">简体中文</a> </div>","directories":{},"_nodeVersion":"18.20.8","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/ffi-rs-linux-arm-gnueabihf_1.2.14_1752232285146_0.17201345082921082","host":"s3://npm-registry-packages-npm-production"}},"1.2.15":{"name":"@yuuang/ffi-rs-linux-arm-gnueabihf","version":"1.2.15","license":"MIT","_id":"@yuuang/ffi-rs-linux-arm-gnueabihf@1.2.15","maintainers":[{"name":"zhangyuang","email":"569105585@qq.com"}],"os":["linux"],"cpu":["arm"],"dist":{"shasum":"2c3dedc72b4182c00dd0f59c39c34a5d17cc59b5","tarball":"https://registry.npmjs.org/@yuuang/ffi-rs-linux-arm-gnueabihf/-/ffi-rs-linux-arm-gnueabihf-1.2.15.tgz","fileCount":3,"integrity":"sha512-EaoJrZ90aQJkblR4Q0Naceek7BSJNDYi6O0GKYzqkWrWM9NCZovn3bptP3t/w+pUtdQE2kIEgoZkVVI0oXqoVg==","signatures":[{"sig":"MEYCIQCEqApvK1REVH2TqDwAQe8vPTATMQ6Er2ElL1jSl/Bj2AIhAPOjqNOZbnGcpDc2FKcqwixB0E9TdbgLeIT4dSjIhwRJ","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":725595},"main":"ffi-rs.linux-arm-gnueabihf.node","engines":{"node":">= 12"},"gitHead":"5adf85c27bf6b1481fe61a349f1150485840ea49","_npmUser":{"name":"zhangyuang","email":"569105585@qq.com"},"_npmVersion":"10.8.2","description":"<div> <a href=\"https://github.com/zhangyuang/node-ffi-rs/blob/master/README.md\">English</a> | <a href=\"https://github.com/zhangyuang/node-ffi-rs/blob/master/README_Zh.md\">简体中文</a> </div>","directories":{},"_nodeVersion":"18.20.8","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/ffi-rs-linux-arm-gnueabihf_1.2.15_1752232603098_0.15390539307086204","host":"s3://npm-registry-packages-npm-production"}},"1.2.16":{"name":"@yuuang/ffi-rs-linux-arm-gnueabihf","version":"1.2.16","license":"MIT","_id":"@yuuang/ffi-rs-linux-arm-gnueabihf@1.2.16","maintainers":[{"name":"zhangyuang","email":"569105585@qq.com"}],"os":["linux"],"cpu":["arm"],"dist":{"shasum":"6d51e506242f82649ad862636b9cccf2bf252578","tarball":"https://registry.npmjs.org/@yuuang/ffi-rs-linux-arm-gnueabihf/-/ffi-rs-linux-arm-gnueabihf-1.2.16.tgz","fileCount":3,"integrity":"sha512-AzFYSGNNyzpiUY8DazDO+kHzoqjoPoPalDWw2M7qBxAFmLEymWV0FZ2DW50E+av2TciTuS0FeChj86MhhiYpyQ==","signatures":[{"sig":"MEUCIQD262REsvbsDW+ABJl67f/UyYihyjwGGtsQ5ap9qoPKCgIgJi2smG/b9NAKhO/Io9X0Lof98djJ49KhdKcDSXkiUNI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":725595},"main":"ffi-rs.linux-arm-gnueabihf.node","engines":{"node":">= 12"},"gitHead":"ece2b6695a8049594190f334b2a4b830da801122","_npmUser":{"name":"zhangyuang","email":"569105585@qq.com"},"_npmVersion":"10.8.2","description":"<div> <a href=\"https://github.com/zhangyuang/node-ffi-rs/blob/master/README.md\">English</a> | <a href=\"https://github.com/zhangyuang/node-ffi-rs/blob/master/README_Zh.md\">简体中文</a> </div>","directories":{},"_nodeVersion":"18.20.8","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/ffi-rs-linux-arm-gnueabihf_1.2.16_1752676849262_0.2524806034958773","host":"s3://npm-registry-packages-npm-production"}},"1.3.0":{"name":"@yuuang/ffi-rs-linux-arm-gnueabihf","version":"1.3.0","license":"MIT","_id":"@yuuang/ffi-rs-linux-arm-gnueabihf@1.3.0","maintainers":[{"name":"zhangyuang","email":"569105585@qq.com"}],"os":["linux"],"cpu":["arm"],"dist":{"shasum":"ef68468ce29a6bad4e76fae4178ab7c9729cf7db","tarball":"https://registry.npmjs.org/@yuuang/ffi-rs-linux-arm-gnueabihf/-/ffi-rs-linux-arm-gnueabihf-1.3.0.tgz","fileCount":3,"integrity":"sha512-RZOU9PcYpaE920dDoDSEL+UQ19CU9MEf9Gm3kKSpb161TPeKzqMZPUEMpbRaww18pPBN1aWbe2BHiyKAO6tTcg==","signatures":[{"sig":"MEUCIQCNfP9qK2oH0AoVYUFBaJm9yyxOCov2lKPwoCbMy4hJ9AIgXPLrGIxIXrLFAIsCTZtEqvNXrMY8CCJmwxrAJEN2rhg=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":729690},"main":"ffi-rs.linux-arm-gnueabihf.node","engines":{"node":">= 12"},"gitHead":"78632e0f92a558122232ae5a5bb42da31c291c36","_npmUser":{"name":"zhangyuang","email":"569105585@qq.com"},"_npmVersion":"10.8.2","description":"<div> <a href=\"https://github.com/zhangyuang/node-ffi-rs/blob/master/README.md\">English</a> | <a href=\"https://github.com/zhangyuang/node-ffi-rs/blob/master/README_Zh.md\">简体中文</a> </div>","directories":{},"_nodeVersion":"18.20.8","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/ffi-rs-linux-arm-gnueabihf_1.3.0_1752772290710_0.5973072440499516","host":"s3://npm-registry-packages-npm-production"}},"1.3.1":{"name":"@yuuang/ffi-rs-linux-arm-gnueabihf","version":"1.3.1","license":"MIT","_id":"@yuuang/ffi-rs-linux-arm-gnueabihf@1.3.1","maintainers":[{"name":"zhangyuang","email":"569105585@qq.com"}],"os":["linux"],"cpu":["arm"],"dist":{"shasum":"031d25adaa01ef192a413025689891cb57d2cb06","tarball":"https://registry.npmjs.org/@yuuang/ffi-rs-linux-arm-gnueabihf/-/ffi-rs-linux-arm-gnueabihf-1.3.1.tgz","fileCount":3,"integrity":"sha512-1WkcGkJTlwh4ZA59htKI+RXhiL3oKiYwLv7PO8LUf6FuADK73s5GcXp67iakKu243uYu+qGYr4RHco4ySddYhQ==","signatures":[{"sig":"MEUCIQCnbGjj3bf6zr4OnI5y9zk9By1GeYlwPeTCfdVCBFhG9AIgctl3Eh8osRouv1kf4xCG3rAi9F0BOa46fwOtTUXatxk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":719029},"main":"ffi-rs.linux-arm-gnueabihf.node","engines":{"node":">= 12"},"gitHead":"200f811de514f1d3f588789b327e57e13fb4d550","_npmUser":{"name":"zhangyuang","email":"569105585@qq.com"},"_npmVersion":"10.8.2","description":"<div> <a href=\"https://github.com/zhangyuang/node-ffi-rs/blob/master/README.md\">English</a> | <a href=\"https://github.com/zhangyuang/node-ffi-rs/blob/master/README_Zh.md\">简体中文</a> </div>","directories":{},"_nodeVersion":"18.20.8","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/ffi-rs-linux-arm-gnueabihf_1.3.1_1763913701689_0.42529855012765894","host":"s3://npm-registry-packages-npm-production"}},"1.3.2":{"name":"@yuuang/ffi-rs-linux-arm-gnueabihf","version":"1.3.2","license":"MIT","_id":"@yuuang/ffi-rs-linux-arm-gnueabihf@1.3.2","maintainers":[{"name":"zhangyuang","email":"569105585@qq.com"}],"os":["linux"],"cpu":["arm"],"dist":{"shasum":"29e59c82e4c720e0a0c6287197f23ce7f47f3e37","tarball":"https://registry.npmjs.org/@yuuang/ffi-rs-linux-arm-gnueabihf/-/ffi-rs-linux-arm-gnueabihf-1.3.2.tgz","fileCount":3,"integrity":"sha512-IXiNdTbIcTCPny5eeElijFWYeKSJjQWSjt9ZyJNdLHYiB1Np+XD6K7wNZS6EOMgMelhW1kQE62T654skGkVDIA==","signatures":[{"sig":"MEYCIQDEqRrXXzu51sA2MMeoOMVL/Hv53mZ3fEWf93nOXM3pEAIhAO12lHzqCvtEE5ayK3lNp+4xvpQHfu2G3EExBjb4eP0w","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":726971},"main":"ffi-rs.linux-arm-gnueabihf.node","engines":{"node":">= 12"},"gitHead":"9c5ba3452d8cedbb0b30c7ce4dd0138135bd06ea","_npmUser":{"name":"zhangyuang","email":"569105585@qq.com"},"_npmVersion":"10.8.2","description":"<div> <a href=\"./README.md\">English</a> | <a href=\"./README_Zh.md\">简体中文</a> </div>","directories":{},"_nodeVersion":"18.20.8","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/ffi-rs-linux-arm-gnueabihf_1.3.2_1776952009989_0.890970863713201","host":"s3://npm-registry-packages-npm-production"}},"1.3.4":{"name":"@yuuang/ffi-rs-linux-arm-gnueabihf","version":"1.3.4","os":["linux"],"cpu":["arm"],"main":"ffi-rs.linux-arm-gnueabihf.node","license":"MIT","engines":{"node":">= 12"},"publishConfig":{"access":"public"},"_id":"@yuuang/ffi-rs-linux-arm-gnueabihf@1.3.4","gitHead":"9ac441b58637d310948115be477ca6973268c0a0","description":"<div> <a href=\"./README.md\">English</a> | <a href=\"./README_Zh.md\">简体中文</a> </div>","_nodeVersion":"18.20.8","_npmVersion":"10.8.2","dist":{"integrity":"sha512-9Alv4r8uZ/kZN6PKqIUoqrtWcpOD/iq3R/w31dEM2aQ8XaftZVD5oANO8IP9lFROb8QmJwDpyW1mfG1GQ0WJjA==","shasum":"666725cc4a6b3564290e594a8083c3338cdea2ca","tarball":"https://registry.npmjs.org/@yuuang/ffi-rs-linux-arm-gnueabihf/-/ffi-rs-linux-arm-gnueabihf-1.3.4.tgz","fileCount":3,"unpackedSize":726971,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIFOdwCMDnsLKWRxCUzusfu0r8UwsBPn6fE3J6sOJ0LtNAiEA+twFQkxwgVzR6OCm0NwYaqiP2Kg8MtSMjuIu9m/PB2Q="}]},"_npmUser":{"name":"zhangyuang","email":"569105585@qq.com"},"directories":{},"maintainers":[{"name":"zhangyuang","email":"569105585@qq.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/ffi-rs-linux-arm-gnueabihf_1.3.4_1784828025043_0.005512052477772311"},"_hasShrinkwrap":false}},"time":{"created":"2024-09-11T14:48:49.088Z","modified":"2026-07-23T17:33:45.371Z","1.0.93":"2024-09-11T14:48:49.325Z","1.0.94":"2024-09-13T15:15:42.751Z","1.0.95":"2024-09-17T15:28:19.298Z","1.0.96":"2024-09-22T14:13:18.618Z","1.0.97":"2024-10-22T16:38:36.755Z","1.0.98":"2024-10-29T11:29:42.254Z","1.0.99":"2024-11-17T13:20:17.645Z","1.1.0":"2024-11-17T16:28:59.947Z","1.1.1":"2024-11-19T08:24:21.271Z","1.2.0":"2024-12-23T11:02:12.189Z","1.2.1":"2024-12-24T09:18:37.879Z","1.2.2":"2025-01-07T16:08:23.141Z","1.2.3":"2025-01-12T08:25:32.582Z","1.2.4":"2025-01-24T12:22:05.283Z","1.2.5":"2025-02-08T17:27:19.249Z","1.2.6":"2025-02-21T05:40:41.857Z","1.2.8":"2025-03-06T06:28:55.625Z","1.2.9":"2025-03-18T13:20:21.702Z","1.2.10":"2025-04-03T07:33:07.607Z","1.2.11":"2025-06-02T11:33:04.192Z","1.2.12":"2025-06-04T08:03:56.250Z","1.2.13":"2025-07-05T19:07:58.914Z","1.2.14":"2025-07-11T11:11:25.400Z","1.2.15":"2025-07-11T11:16:43.334Z","1.2.16":"2025-07-16T14:40:49.544Z","1.3.0":"2025-07-17T17:11:30.906Z","1.3.1":"2025-11-23T16:01:41.933Z","1.3.2":"2026-04-23T13:46:50.184Z","1.3.4":"2026-07-23T17:33:45.202Z"},"license":"MIT","description":"<div> <a href=\"./README.md\">English</a> | <a href=\"./README_Zh.md\">简体中文</a> </div>","maintainers":[{"name":"zhangyuang","email":"569105585@qq.com"}],"readme":"# ffi-rs\n\n<div>\n<a href=\"./README.md\">English</a> | <a href=\"./README_Zh.md\">简体中文</a>\n</div>\n\nA module written in Rust and N-API provides interface (FFI) features for Node.js\n\n<div align=\"\">\n<a href=\"https://github.com/zhangyuang/node-ffi-rs/actions\" target=\"_blank\"><img src=\"https://github.com/zhangyuang/node-ffi-rs/workflows/CI/badge.svg\" alt=\"githubActions\" /></a>\n<a href=\"https://www.npmjs.com/package/ffi-rs\" target=\"_blank\"><img src=\"https://img.shields.io/npm/dm/ffi-rs\">\n</a>\n<a href=\"https://www.npmjs.com/package/ffi-rs\" target=\"_blank\"><img src=\"https://img.shields.io/npm/unpacked-size/@yuuang/ffi-rs-linux-x64-gnu\">\n</a>\n</div>\n\n## Description\n\n[ffi-rs](https://github.com/zhangyuang/node-ffi-rs) is a high-performance module with small binary size written in Rust and N-API that provides FFI (Foreign Function Interface) features for Node.js. It allows developers to call functions written in other languages such as C++, C, and Rust directly from JavaScript without writing any C++ code.\n\nThis module aims to provide similar functionality to the node-ffi module but with a completely rewritten underlying codebase. The node-ffi module has been unmaintained for several years and is no longer usable, so ffi-rs was developed to fill that void.\n\n## Features\n\n* High performance ✨\n* Small binary size\n* Better type hints 🧐\n* Simpler data description and API interface 💗\n* Support more different data types between `Node.js` and `C` 😊\n* Support modifying data in place 🥸\n* Provide many ways to handle pointer type directly 🐮\n* Support running ffi task [in a new thread](#runInNewThread) 🤩️\n* Support output [errno](#errno) info 🤔️\n* No need to use [ref](https://www.npmjs.com/package/ref) to handle pointer 🤫\n\n## Benchmark\n\n```bash\n$ node bench/bench.js\nRunning \"ffi\" suite...\nProgress: 100%\n\n  ffi-napi:\n    2 028 ops/s, ±4.87%     | slowest, 99.24% slower\n\n  ffi-rs:\n    318 467 ops/s, ±0.17%   | fastest\n\nFinished 2 cases!\n  Fastest: ffi-rs\n  Slowest: ffi-napi\n```\n\n### How to sponsor me\n\nThere are two ways to sponsor me both Alipay and WeChat\n\nEth address: 0x87a2575a5d4dbD5f965e3e3a3d20641BC9a5d192\n\n<div style=\"display:flex\">\n  <img src=\"https://doc.ssr-fc.com/images/wepay.jpg\" width=200>\n  <img src=\"https://doc.ssr-fc.com/images/alipay.jpg\" width=200>\n</div>\n\n## Changelog\n\nSee [CHANGELOG.md](./CHANGELOG.md)\n\n## Ecosystem\n\n[abstract-socket-rs](https://github.com/zhangyuang/abstract-socket-rs)\n\n## Install\n\n```bash\n$ npm i ffi-rs\n```\n\n## Supported Types\n\nCurrently, ffi-rs only supports these types of parameters and return values. However, support for more types may be added in the future based on actual usage scenarios.\n\n### Basic Types\n\n* [string](#basic-types)\n* [wideString|wstring](#basic-types)\n* [u8](#basic-types)\n* [i16](#basic-types)\n* [i32](#basic-types)\n* [i64](#basic-types)\n* [bigInt](#basic-types)\n* [u64](#basic-types)\n* [u32](#basic-types)\n* [void](#basic-types) (like js undefined)\n* [float](#basic-types) (can only be used as paramsType instead of retType)\n* [double](#basic-types)\n* [boolean](#basic-types)\n\n### Reference Types\n\n* [pointer](#pointer)\n* [u8Array](#buffer) (buffer)\n* [i16Array](#array)\n* [i32Array](#array)\n* [stringArray](#array)\n* [doubleArray](#array)\n* [floatArray](#array) (can only be used as paramsType instead of retType)\n* [structArray](#array)\n* [object](#struct) (Nested object is also supported in the latest version)\n* [function](#function)\n\n### C++ Class\n\nIf you want to call a C++ function whose argument type is a class, you can use the `pointer` type. See [tutorial](#C++)\n\n## Supported Platforms\n\nNote: You need to make sure that the compilation environment of the dynamic library is the same as the installation and runtime environment of the `ffi-rs` call.\n\n* darwin-x64\n* darwin-arm64\n* linux-x64-gnu\n* linux-x64-musl\n* win32-x64-msvc\n* win32-ia32-msvc\n* win32-arm64-msvc\n* linux-arm64-gnu\n* linux-arm64-musl\n* linux-arm-gnueabihf\n* android-arm64\n\n## Usage\n\nView [tests/index.ts](./tests/index.ts) for the latest usage\n\nHere is an example of how to use ffi-rs:\n\nFor the following C++ code, we compile this file into a dynamic library\n\n### Write Foreign Function Code\n\nNote: The return value type of a function must be of type C\n\n```cpp\n#include <cstdio>\n#include <cstring>\n#include <iostream>\n#include <string>\n\nextern \"C\" int sum(int a, int b) { return a + b; }\n\nextern \"C\" double doubleSum(double a, double b) { return a + b; }\n\nextern \"C\" const char *concatenateStrings(const char *str1, const char *str2) {\n  std::string result = std::string(str1) + std::string(str2);\n  char *cstr = new char[result.length() + 1];\n  strcpy(cstr, result.c_str());\n  return cstr;\n}\n\nextern \"C\" void noRet() { printf(\"%s\", \"hello world\"); }\nextern \"C\" bool return_opposite(bool input) { return !input; }\nextern \"C\" uint32_t testU32(uint32_t a, uint32_t b) { return a + b; }\n```\n\n### Compile C Code into a Dynamic Library\n\n```bash\n$ g++ -dynamiclib -o libsum.so cpp/sum.cpp # macOS\n$ g++ -shared -o libsum.so cpp/sum.cpp # Linux\n$ g++ -shared -o sum.dll cpp/sum.cpp # Windows\n```\n\n### Call Dynamic Library Using ffi-rs\n\nThen you can use `ffi-rs` to invoke the dynamic library file that contains functions.\n\n### Initialization\n\nIt's suggested to develop with TypeScript to get type hints\n\n```js\nconst {\n    equal\n} = require('assert')\nconst {\n    load,\n    DataType,\n    open,\n    close,\n    arrayConstructor,\n    define\n} = require('ffi-rs')\nconst a = 1\nconst b = 100\nconst dynamicLib = platform === 'win32' ? './sum.dll' : \"./libsum.so\"\n// First open dynamic library with key for close\n// It only needs to be opened once.\nopen({\n    library: 'libsum', // key\n    path: dynamicLib // path\n})\nconst r = load({\n    library: \"libsum\", // path to the dynamic library file\n    funcName: 'sum', // the name of the function to call\n    retType: DataType.I32, // the return value type\n    paramsType: [DataType.I32, DataType.I32], // the parameter types\n    paramsValue: [a, b] // the actual parameter values\n    // freeResultMemory: true, // whether or not need to free the result of return value memory automatically, default is false\n})\nequal(r, a + b)\n// Release library memory when you're not using it.\nclose('libsum')\n\n// Use define function to define a function signature\nconst res = define({\n    sum: {\n        library: \"libsum\",\n        retType: DataType.I32,\n        paramsType: [DataType.I32, DataType.I32],\n    },\n    atoi: {\n        library: \"libnative\",\n        retType: DataType.I32,\n        paramsType: [DataType.String],\n    }\n})\nequal(res.sum([1, 2]), 3)\nequal(res.atoi([\"1000\"]), 1000)\n```\n\n### Load Main Program Handle\n\nYou can also pass an empty path string in the `open` function like [ffi-napi](https://github.com/node-ffi-napi/node-ffi-napi?tab=readme-ov-file#example) to get the main program handle. Refer to [dlopen](https://man7.org/linux/man-pages/man3/dlopen.3.html)\n\n```js\nopen({\n    library: \"libnative\",\n    path: \"\",\n});\n// In Darwin/Linux, you can call the atoi function which is included in the basic C library\nequal(\n    load({\n        library: \"libnative\",\n        funcName: \"atoi\",\n        retType: DataType.I32,\n        paramsType: [DataType.String],\n        paramsValue: [\"1000\"],\n    }),\n    1000,\n);\n```\n\n### Basic Types\n\n`number|string|boolean|double|void` are basic types\n\n```js\nconst c = \"foo\"\nconst d = c.repeat(200)\n\nequal(c + d, load({\n    library: 'libsum',\n    funcName: 'concatenateStrings',\n    retType: DataType.String,\n    paramsType: [DataType.String, DataType.String],\n    paramsValue: [c, d]\n}))\n\nequal(undefined, load({\n    library: 'libsum',\n    funcName: 'noRet',\n    retType: DataType.Void,\n    paramsType: [],\n    paramsValue: []\n}))\n\nequal(1.1 + 2.2, load({\n    library: 'libsum',\n    funcName: 'doubleSum',\n    retType: DataType.Double,\n    paramsType: [DataType.Double, DataType.Double],\n    paramsValue: [1.1, 2.2]\n}))\nconst bool_val = true\nequal(!bool_val, load({\n    library: 'libsum',\n    funcName: 'return_opposite',\n    retType: DataType.Boolean,\n    paramsType: [DataType.Boolean],\n    paramsValue: [bool_val],\n}))\n\n// U32 type usage\nequal(3147483647, load({\n    library: 'libsum',\n    funcName: 'testU32',\n    retType: DataType.U32,\n    paramsType: [DataType.U32, DataType.U32],\n    paramsValue: [2147483647, 1000000000],\n}))\n```\n\n### Buffer\n\nIn the latest version, `ffi-rs` supports modifying data in place.\n\nThe sample code is as follows\n\n```c\nextern int modifyData(char* buffer) {\n    // modify buffer data in place\n}\n```\n\n```js\nconst arr = Buffer.alloc(200) // create buffer\nconst res = load({\n    library: \"libsum\",\n    funcName: \"modifyData\",\n    retType: DataType.I32,\n    paramsType: [\n        DataType.U8Array\n    ],\n    paramsValue: [arr]\n})\nconsole.log(arr) // buffer data can be updated\n```\n\n### Array\n\nWhen using `array` as `retType` , you should use `arrayConstructor` to specify the array type with a legal length which is important.\n\nIf the length is incorrect, the program may exit abnormally\n\n```cpp\nextern \"C\" int *createArrayi32(const int *arr, int size) {\n  int *vec = (int *)malloc((size) * sizeof(int));\n\n  for (int i = 0; i < size; i++) {\n    vec[i] = arr[i];\n  }\n  return vec;\n}\nextern \"C\" double *createArrayDouble(const double *arr, int size) {\n  double *vec = (double *)malloc((size) * sizeof(double));\n  for (int i = 0; i < size; i++) {\n    vec[i] = arr[i];\n  }\n  return vec;\n}\n\nextern \"C\" char **createArrayString(char **arr, int size) {\n  char **vec = (char **)malloc((size) * sizeof(char *));\n  for (int i = 0; i < size; i++) {\n    vec[i] = arr[i];\n  }\n  return vec;\n}\n```\n\n```js\nlet bigArr = new Array(100).fill(100)\ndeepStrictEqual(bigArr, load({\n    library: 'libsum',\n    funcName: 'createArrayi32',\n    retType: arrayConstructor({\n        type: DataType.I32Array,\n        length: bigArr.length\n    }),\n    paramsType: [DataType.I32Array, DataType.I32],\n    paramsValue: [bigArr, bigArr.length],\n}))\n\nlet bigDoubleArr = new Array(5).fill(1.1)\ndeepStrictEqual(bigDoubleArr, load({\n    library: 'libsum',\n    funcName: 'createArrayDouble',\n    retType: arrayConstructor({\n        type: DataType.DoubleArray,\n        length: bigDoubleArr.length\n    }),\n    paramsType: [DataType.DoubleArray, DataType.I32],\n    paramsValue: [bigDoubleArr, bigDoubleArr.length],\n}))\nlet stringArr = [c, c.repeat(20)]\n\ndeepStrictEqual(stringArr, load({\n    library: 'libsum',\n    funcName: 'createArrayString',\n    retType: arrayConstructor({\n        type: DataType.StringArray,\n        length: stringArr.length\n    }),\n    paramsType: [DataType.StringArray, DataType.I32],\n    paramsValue: [stringArr, stringArr.length],\n}))\n```\n\n### Pointer\n\nThese functions are used to handle pointer types in `ffi-rs` . We use `DataType.External` to pass pointers between `Node.js` and `C` .\n\n#### Create Pointer\n\nUse `createPointer` to create a pointer for specific type in the code as follows:\n\n```js\nextern \"C\"\nvoid receiveNumPointer(const int * num)\n\n// use the rust type expression the pointer type is *const i32\nconst pointer: JsExternal[] = createPointer({\n    paramsType: [DataType.I32],\n    paramsValue: [100],\n})\n\nload({\n    library: \"libsum\",\n    funcName: \"receiveNumPointer\",\n    paramsType: [DataType.External],\n    paramsValue: pointer,\n    retType: DataType.Void,\n})\n```\n\n#### unwrapPointer\n\nUse `createPointer` to create a data type which store in heap will receive a double pointer means a pointer to a pointer.\nSo we need to use `unwrapPointer` to get the inner pointer when call foreign function.\n\n```js\nextern \"C\"\nvoid receiveStringPointer(const char * str)\n\n// because of string is a pointer, so the pointer is a double pointer means a pointer to a string pointer\n// use the rust type expression pointer type is *mut *const char\nconst pointer: JsExternal[] = createPointer({\n    paramsType: [DataType.String],\n    paramsValue: [\"hello\"],\n})\n\nload({\n    library: \"libsum\",\n    funcName: \"receiveStringPointer\",\n    paramsType: [DataType.External],\n    paramsValue: unwrapPointer(pointer), // use the unwrapPointer to get the inner *mut *const char pointer, which points to a *const char value\n    retType: DataType.Void,\n})\n```\n\n#### restorePointer\n\nIf you want to restore the pointer to the original value, you can use the `restorePointer` function. Corresponds to `createPointer` ,\nit can receive the result of `createPointer` and return the original pointer directly without `wrapPointer` or `unwrapPointer` .\n\n```js\nconst pointer: JsExternal[] = createPointer({\n    paramsType: [DataType.String],\n    paramsValue: [\"hello\"],\n})\nconst str = restorePointer({\n    retType: [DataType.String],\n    paramsValue: pointer,\n})\nequal(str, \"hello\")\n```\n\n#### wrapPointer\n\nUse `wrapPointer` when you want to restore the foreign function return value.\n\n```js\nextern \"C\" const char * returnStringPointer() {\n    char * str = new char[6];\n    strcpy(str, \"hello\");\n    return str;\n}\n// the stringPointer type is *const char, we need to convert it to *mut *const char before call restorePointer\nconst stringPointer = load({\n    library: \"libsum\",\n    funcName: \"returnStringPointer\",\n    retType: DataType.External,\n    paramsType: [DataType.String],\n    paramsValue: [\"hello\"],\n})\n\nconst wrapStringPointer = wrapPointer([stringPointer])\n\nconst str = restorePointer({\n    retType: [DataType.String],\n    paramsValue: wrapStringPointer,\n})\nequal(str, \"hello\")\n```\n\n#### freePointer\n\nUse `freePointer` to free the pointer when it is no longer in use.\n\n```js\nconst i32Ptr = createPointer({\n    paramsType: [DataType.I32],\n    paramsValue: [100]\n})\nconst i32Data = restorePointer({\n    paramsValue: i32Ptr\n    retType: [DataType.I32],\n})\nfreePointer({\n    paramsType: [DataType.I32],\n    paramsValue: i32Ptr,\n    pointerType: PointerType.RsPointer\n})\n\nextern \"C\" const char * returnStringPointer() {\n    char * str = new char[6];\n    strcpy(str, \"hello\");\n    return str;\n}\nconst stringPointer = load({\n    library: \"libsum\",\n    funcName: \"returnStringPointer\",\n    retType: DataType.External,\n    paramsType: [DataType.String],\n    paramsValue: [\"hello\"],\n})\nfreePointer({\n    paramsType: [DataType.External],\n    paramsValue: [stringPointer],\n    pointerType: PointerType.CPointer // will use libc::free to free the memory\n})\n```\n\n### Struct\n\nTo create a C struct or get a C struct as a return type, you need to define the types of the parameters strictly in the order in which the fields of the C structure are defined.\n\n`ffi-rs` provides a C struct named `Person` with many types of fields in [sum.cpp](./cpp/sum.cpp#L48)\n\nThe example call method about how to call a foreign function to create a `Person` struct or use `Person` struct as a return value is [here](./tests/struct.ts#L27)\n\n#### Use array in struct\n\nThere are two types of arrays in C language like `int* array` and `int array[100]` that have some different usages.\n\nThe first type `int* array` is a pointer type storing the first address of the array.\n\nThe second type `int array[100]` is a fixed-length array and each element in the array has a continuous address.\n\nIf you use an array as a function parameter, this usually passes an array pointer regardless of which type you define. But if the array type is defined in a struct, the two types of array definitions will cause different sizes and alignments of the struct.\n\nSo, `ffi-rs` needs to distinguish between the two types.\n\nBy default, `ffi-rs` uses dynamic arrays to calculate struct. If you confirm there is a static array, you can define it in this way:\n\n```c\ntypedef struct Person {\n  //...\n  uint8_t staticBytes[16];\n  //...\n} Person;\n\n// use arrayConstructor and set ffiTypeTag field to DataType.StackArray\nstaticBytes: arrayConstructor({\n  type: DataType.U8Array,\n  length: parent.staticBytes.length,\n  ffiTypeTag: FFITypeTag.StackArray\n}),\n```\n\n## Function\n\n`ffi-rs` supports passing JS function pointers to C functions, like this:\n\n```cpp\ntypedef const void (*FunctionPointer)(int a, bool b, char *c, double d,\n                                      char **e, int *f, Person *g);\n\nextern \"C\" void callFunction(FunctionPointer func) {\n  printf(\"callFunction\\n\");\n\n  for (int i = 0; i < 2; i++) {\n    int a = 100;\n    bool b = false;\n    double d = 100.11;\n    char *c = (char *)malloc(14 * sizeof(char));\n    strcpy(c, \"Hello, World!\");\n\n    char **stringArray = (char **)malloc(sizeof(char *) * 2);\n    stringArray[0] = strdup(\"Hello\");\n    stringArray[1] = strdup(\"world\");\n\n    int *i32Array = (int *)malloc(sizeof(int) * 3);\n    i32Array[0] = 101;\n    i32Array[1] = 202;\n    i32Array[2] = 303;\n\n    Person *p = createPerson();\n    func(a, b, c, d, stringArray, i32Array, p);\n  }\n}\n```\n\nCorresponding to the code above, you can use `ffi-rs` like this:\n\n```js\nconst testFunction = () => {\n    const func = (a, b, c, d, e, f, g) => {\n        equal(a, 100);\n        equal(b, false);\n        equal(c, \"Hello, World!\");\n        equal(d, \"100.11\");\n        deepStrictEqual(e, [\"Hello\", \"world\"]);\n        deepStrictEqual(f, [101, 202, 303]);\n        deepStrictEqual(g, person);\n        logGreen(\"test function succeed\");\n        // free function memory when it is not in use\n        freePointer({\n            paramsType: [funcConstructor({\n                paramsType: [\n                    DataType.I32,\n                    DataType.Boolean,\n                    DataType.String,\n                    DataType.Double,\n                    arrayConstructor({\n                        type: DataType.StringArray,\n                        length: 2\n                    }),\n                    arrayConstructor({\n                        type: DataType.I32Array,\n                        length: 3\n                    }),\n                    personType,\n                ],\n                retType: DataType.Void,\n            })],\n            paramsValue: funcExternal\n        })\n        if (!process.env.MEMORY) {\n            close(\"libsum\");\n        }\n    };\n    // suggest using createPointer to create a function pointer for manual memory management\n    const funcExternal = createPointer({\n        paramsType: [funcConstructor({\n            paramsType: [\n                DataType.I32,\n                DataType.Boolean,\n                DataType.String,\n                DataType.Double,\n                arrayConstructor({\n                    type: DataType.StringArray,\n                    length: 2\n                }),\n                arrayConstructor({\n                    type: DataType.I32Array,\n                    length: 3\n                }),\n                personType,\n            ],\n            retType: DataType.Void,\n        })],\n        paramsValue: [func]\n    })\n    load({\n        library: \"libsum\",\n        funcName: \"callFunction\",\n        retType: DataType.Void,\n        paramsType: [\n            DataType.External,\n        ],\n        paramsValue: unwrapPointer(funcExternal),\n    });\n}\n```\n\nThe function parameters support all types in the example above.\n\nAttention: since the vast majority of scenarios developers pass JS functions to C as callbacks, `ffi-rs` will create [threadsafe_function](https://nodejs.org/api/n-api.html#napi_threadsafe_function) from JS functions which means the JS function will be called asynchronously, and the Node.js process will not exit automatically.\n\n## C++\n\nWe'll provide more examples from real-world scenarios. If you have any ideas, please submit an issue.\n\n### Class type\n\nIn C++ scenarios, we can use `DataType.External` to get a class type pointer.\n\nIn the code below, we use C types to wrap C++ types such as converting `char *` to `std::string` and returning a class pointer:\n\n```cpp\nMyClass *createMyClass(std::string name, int age) {\n  return new MyClass(name, age);\n}\n\nextern \"C\" MyClass *createMyClassFromC(const char *name, int age) {\n  return createMyClass(std::string(name), age);\n}\n\nextern \"C\" void printMyClass(MyClass *instance) { instance->print(); }\n```\n\nAnd then, it can be called by the following code:\n\n```js\nconst classPointer = load({\n    library: \"libsum\",\n    funcName: \"createMyClassFromC\",\n    retType: DataType.External,\n    paramsType: [\n        DataType.String,\n        DataType.I32\n    ],\n    paramsValue: [\"classString\", 26],\n});\nload({\n    library: \"libsum\",\n    funcName: \"printMyClass\",\n    retType: DataType.External,\n    paramsType: [\n        DataType.External,\n    ],\n    paramsValue: [classPointer],\n})\nfreePointer({\n    paramsType: [DataType.External],\n    paramsValue: [classPointer],\n    pointerType: PointerType.CPointer\n})\n```\n\n## errno\n\nBy default, `ffi-rs` will not output [errno](https://man7.org/linux/man-pages/man3/errno.3.html) info. Developers can get it by passing `errno: true` when calling the open method like:\n\n```js\nload({\n    library: 'libnative',\n    funcName: 'setsockopt',\n    retType: DataType.I32,\n    paramsType: [DataType.I32, DataType.I32, DataType.I32, DataType.External, DataType.I32],\n    paramsValue: [socket._handle.fd, level, option, pointer[0], 4],\n    errno: true // set errno as true\n})\n\n// The above code will return an object including three fields: errnoCode, errnoMessage, and the foreign function return value\n// { errnoCode: 22, errnoMessage: 'Invalid argument (os error 22)', value: -1 }\n```\n\n## Memory Management\n\nIt's important to free the memory allocations during a single ffi call to prevent memory leaks.\n\nWhat kinds of data memory are allocated in this?\n\n* Call parameters in the Rust environment which are allocated in the heap like `String`\n* Return value which in the C environment which are allocated in the heap like `char*`\n\nBy default, `ffi-rs` will free call parameters memory which are allocated in Rust.\n\nBut it will not free the return value from the C side since some C dynamic libraries will manage their memory automatically (when ffi-rs >= 1.0.79)\n\nThere are two ways to prevent `ffi-rs` from releasing memory:\n\n* Set `freeResultMemory: false` when calling `load` method, the default value is false\n\nIf you set freeResultMemory to false, `ffi-rs` will not release the return result memory which was allocated in the C environment\n\n* Use `DataType.External` as paramsType or retType\n\nIf developers use `DataType.External` as paramsType or retType, please use `freePointer` to release the memory of the pointer when this memory is no longer in use. ref [tests/index.ts](./tests/index.ts#L212)\n\n## runInNewThread\n\n`ffi-rs` supports running ffi tasks in a new thread without blocking the main thread, which is useful for CPU-intensive tasks.\n\nTo use this feature, you can pass the `runInNewThread` option to the load method:\n\n```js\nconst testRunInNewThread = async () => {\n    // will return a promise but the task will run in a new thread\n    load({\n        library: \"libsum\",\n        funcName: \"sum\",\n        retType: DataType.I32,\n        paramsType: [DataType.I32, DataType.I32],\n        paramsValue: [1, 2],\n        runInNewThread: true,\n    }).then(res => {\n        equal(res, 3)\n    })\n}\n```\n","readmeFilename":"README.md"}