{"_id":"@smartspectra/node-sdk","_rev":"29-41bc7380d249cb28abd400640db7b98c","name":"@smartspectra/node-sdk","dist-tags":{"latest":"3.4.0","rc":"3.4.0-rc.8"},"versions":{"3.3.0-rc.3":{"name":"@smartspectra/node-sdk","version":"3.3.0-rc.3","keywords":["smartspectra","vitals","physiology","electron","nodejs","ffi","koffi"],"author":{"name":"Presage Technologies, Inc."},"license":"SEE LICENSE IN LICENSE","_id":"@smartspectra/node-sdk@3.3.0-rc.3","maintainers":[{"name":"maintainer_presagetech","email":"maintainer@presagetech.com"}],"homepage":"https://smartspectra.presagetech.com/","bugs":{"url":"https://github.com/Presage-Security/SmartSpectra/issues"},"dist":{"shasum":"0dcf6a36e131672f2ab6f9076409b00f68ac27fa","tarball":"https://registry.npmjs.org/@smartspectra/node-sdk/-/node-sdk-3.3.0-rc.3.tgz","fileCount":21,"integrity":"sha512-7aiZyQaiY1hlr9t4DQqACZx8Ezaklj79G7bduf/CE57UDngGpfAAjmrIgUqD0q2G+5pXYQq7DBuXvK82//Wlew==","signatures":[{"sig":"MEYCIQCRdg8WDbFJlEmQHJuTcE1Ruqk2RoZgFLckyJgJlBRZ8gIhAPO7JMGDPECckuBmsJ90AmrFFt0NHIfOJxUGQEVF+Er8","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":561917},"main":"js/index.js","types":"js/index.d.ts","engines":{"node":">=18.0.0"},"exports":{".":{"types":"./js/index.d.ts","default":"./js/index.js"},"./main":{"types":"./js/main/index.d.ts","default":"./js/main/index.js"},"./preload":"./js/preload/index.js","./messages":{"types":"./js/messages/index.d.ts","default":"./js/messages/index.js"},"./renderer":{"types":"./js/renderer/index.d.ts","default":"./js/renderer/index.js"},"./package.json":"./package.json"},"gitHead":"f3b727300005fcb477d67c54a5acd6235c8843c0","scripts":{"test":"node test/log-level-pin.js && node test/smoke.js","prepare":"node scripts/gen-proto.cjs","build:proto":"node scripts/gen-proto.cjs","test:models-allowlist":"node test/models-allowlist.js"},"_npmUser":{"name":"maintainer_presagetech","email":"maintainer@presagetech.com"},"overrides":{"tmp":"0.2.6"},"repository":{"url":"git+https://github.com/Presage-Security/SmartSpectra.git","type":"git"},"_npmVersion":"10.8.2","description":"Node.js (Electron) FFI binding for SmartSpectra vitals measurement","directories":{},"_nodeVersion":"20.20.2","dependencies":{"koffi":"^2.10.0","protobufjs":"^7.5.0","@smartspectra/node-sdk-linux-x64":"3.3.0-rc.3","@smartspectra/node-sdk-win32-x64":"3.3.0-rc.3","@smartspectra/node-sdk-linux-arm64":"3.3.0-rc.3","@smartspectra/node-sdk-darwin-arm64":"3.3.0-rc.3"},"publishConfig":{"registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"@types/node":"^20.0.0","protobufjs-cli":"^1.1.3"},"_npmOperationalInternal":{"tmp":"tmp/node-sdk_3.3.0-rc.3_1784265215299_0.719101393190922","host":"s3://npm-registry-packages-npm-production"}},"3.3.0-rc.4":{"name":"@smartspectra/node-sdk","version":"3.3.0-rc.4","keywords":["smartspectra","vitals","physiology","electron","nodejs","ffi","koffi"],"author":{"name":"Presage Technologies, Inc."},"license":"SEE LICENSE IN LICENSE","_id":"@smartspectra/node-sdk@3.3.0-rc.4","maintainers":[{"name":"maintainer_presagetech","email":"maintainer@presagetech.com"}],"homepage":"https://smartspectra.presagetech.com/","bugs":{"url":"https://github.com/Presage-Security/SmartSpectra/issues"},"dist":{"shasum":"90d89659199c7746fe7313965c82b129d307078c","tarball":"https://registry.npmjs.org/@smartspectra/node-sdk/-/node-sdk-3.3.0-rc.4.tgz","fileCount":23,"integrity":"sha512-KiUtPB4inf2+ZZ/V6Sl29YRbl2VI+FmuKAmoru72aIlhA/g/2zoFKlxsHJJL2Z8rW2ruIpF2PWU/oE5kTKkobA==","signatures":[{"sig":"MEQCIFmewRKmCbxW+mE9pK8GKgbRThphFF8mNXvPhKgTNd4nAiAPksDT3tABYeo1WfbFuguxdjrL5Y26VkKtUt9TaUyd0A==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":679974},"main":"js/index.js","types":"js/index.d.ts","engines":{"node":">=18.0.0"},"exports":{".":{"types":"./js/index.d.ts","default":"./js/index.js"},"./main":{"types":"./js/main/index.d.ts","default":"./js/main/index.js"},"./preload":"./js/preload/index.js","./messages":{"types":"./js/messages/index.d.ts","default":"./js/messages/index.js"},"./renderer":{"types":"./js/renderer/index.d.ts","default":"./js/renderer/index.js"},"./package.json":"./package.json"},"gitHead":"446219724daba42a4eb2e01faa0bb13cfe43a3a6","scripts":{"test":"node test/log-level-pin.js && node test/smoke.js","prepare":"node scripts/gen-proto.cjs","build:proto":"node scripts/gen-proto.cjs","test:models-allowlist":"node test/models-allowlist.js"},"_npmUser":{"name":"maintainer_presagetech","email":"maintainer@presagetech.com"},"overrides":{"tmp":"0.2.6"},"repository":{"url":"git+https://github.com/Presage-Security/SmartSpectra.git","type":"git"},"_npmVersion":"10.8.2","description":"Node.js (Electron) FFI binding for SmartSpectra vitals measurement","directories":{},"_nodeVersion":"20.20.2","dependencies":{"koffi":"^2.10.0","protobufjs":"^7.5.0","@smartspectra/node-sdk-linux-x64":"3.3.0-rc.4","@smartspectra/node-sdk-win32-x64":"3.3.0-rc.4","@smartspectra/node-sdk-linux-arm64":"3.3.0-rc.4","@smartspectra/node-sdk-darwin-arm64":"3.3.0-rc.4"},"publishConfig":{"registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"@types/node":"^20.0.0","protobufjs-cli":"^1.1.3"},"_npmOperationalInternal":{"tmp":"tmp/node-sdk_3.3.0-rc.4_1784741529194_0.8745285297190133","host":"s3://npm-registry-packages-npm-production"}},"3.3.0-rc.6":{"name":"@smartspectra/node-sdk","version":"3.3.0-rc.6","keywords":["smartspectra","vitals","physiology","electron","nodejs","ffi","koffi"],"author":{"name":"Presage Technologies, Inc."},"license":"SEE LICENSE IN LICENSE","_id":"@smartspectra/node-sdk@3.3.0-rc.6","maintainers":[{"name":"maintainer_presagetech","email":"maintainer@presagetech.com"}],"homepage":"https://smartspectra.presagetech.com/","bugs":{"url":"https://github.com/Presage-Security/SmartSpectra/issues"},"dist":{"shasum":"7adba58c539886438f124f18c5c6b3640cd0eb97","tarball":"https://registry.npmjs.org/@smartspectra/node-sdk/-/node-sdk-3.3.0-rc.6.tgz","fileCount":24,"integrity":"sha512-jArZ6fRzW+n1bBZA6dH/eZK+Bp18lmr3cSvc420knmsXzL/f8btLSKgpO1nXtiNi9L8egVD5qcDJK8RXuFZ6Jg==","signatures":[{"sig":"MEQCIEN9wEHkZd7BGw18PLDPokuHCeH7QXOASxr7zGZSdsx1AiAbYs+rvr6ER1ESw5x8Fg/6RvqnF5Rp+0l71jBwkZ0QMw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":687110},"main":"js/index.js","types":"js/index.d.ts","engines":{"node":">=20.0.0"},"exports":{".":{"types":"./js/index.d.ts","default":"./js/index.js"},"./main":{"types":"./js/main/index.d.ts","default":"./js/main/index.js"},"./preload":"./js/preload/index.js","./messages":{"types":"./js/messages/index.d.ts","default":"./js/messages/index.js"},"./renderer":{"types":"./js/renderer/index.d.ts","default":"./js/renderer/index.js"},"./package.json":"./package.json"},"gitHead":"43122ac4903d91a69b02093f5c07df37b01f2472","scripts":{"test":"node test/log-level-pin.js && node test/renderer-timestamp.js && node test/smoke.js","prepare":"node scripts/gen-proto.cjs","build:proto":"node scripts/gen-proto.cjs","test:models-allowlist":"node test/models-allowlist.js"},"_npmUser":{"name":"maintainer_presagetech","email":"maintainer@presagetech.com"},"overrides":{"tmp":"0.2.6"},"repository":{"url":"git+https://github.com/Presage-Security/SmartSpectra.git","type":"git"},"_npmVersion":"11.16.0","description":"Node.js (Electron) FFI binding for SmartSpectra vitals measurement","directories":{},"_nodeVersion":"24.18.0","dependencies":{"koffi":"^2.10.0","protobufjs":"^7.5.0","@smartspectra/node-sdk-linux-x64":"3.3.0-rc.6","@smartspectra/node-sdk-win32-x64":"3.3.0-rc.6","@smartspectra/node-sdk-linux-arm64":"3.3.0-rc.6","@smartspectra/node-sdk-darwin-arm64":"3.3.0-rc.6"},"publishConfig":{"registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"@types/node":"^24.0.0","protobufjs-cli":"^1.1.3"},"_npmOperationalInternal":{"tmp":"tmp/node-sdk_3.3.0-rc.6_1785257156113_0.9997298800336525","host":"s3://npm-registry-packages-npm-production"}},"3.3.0-rc.7":{"name":"@smartspectra/node-sdk","version":"3.3.0-rc.7","keywords":["smartspectra","vitals","physiology","electron","nodejs","ffi","koffi"],"author":{"name":"Presage Technologies, Inc."},"license":"SEE LICENSE IN LICENSE","_id":"@smartspectra/node-sdk@3.3.0-rc.7","maintainers":[{"name":"maintainer_presagetech","email":"maintainer@presagetech.com"}],"homepage":"https://smartspectra.presagetech.com/","bugs":{"url":"https://github.com/Presage-Security/SmartSpectra/issues"},"dist":{"shasum":"454d6dbe7cfdee3798600c38679169e1bee8b806","tarball":"https://registry.npmjs.org/@smartspectra/node-sdk/-/node-sdk-3.3.0-rc.7.tgz","fileCount":24,"integrity":"sha512-ueHvHeq29yT7JYYh1jSLWpPJVLZcKMoUk7G28jA/RW9VhRu+OaA3canLsvwFXSPCPr6yIzxjjHPgXfywUtsGhg==","signatures":[{"sig":"MEUCIGWrbOBls9OrWBLGHcw7kOM3LYupzkZAJWHnMziqjy51AiEAqHAv7I/3Vc1gvFNiBQeLD5BidBPu+GjhcsZDLlOuYmE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":687502},"main":"js/index.js","types":"js/index.d.ts","engines":{"node":">=20.0.0"},"exports":{".":{"types":"./js/index.d.ts","default":"./js/index.js"},"./main":{"types":"./js/main/index.d.ts","default":"./js/main/index.js"},"./preload":"./js/preload/index.js","./messages":{"types":"./js/messages/index.d.ts","default":"./js/messages/index.js"},"./renderer":{"types":"./js/renderer/index.d.ts","default":"./js/renderer/index.js"},"./package.json":"./package.json"},"gitHead":"90b6d43f466b0b737945512c1a0f9c25d30920e5","scripts":{"test":"node --test test/log-level-pin.js test/renderer-timestamp.js test/smoke.js","prepare":"node scripts/gen-proto.cjs","build:proto":"node scripts/gen-proto.cjs","test:models-allowlist":"node test/models-allowlist.js"},"_npmUser":{"name":"maintainer_presagetech","email":"maintainer@presagetech.com"},"overrides":{"tmp":"0.2.7"},"repository":{"url":"git+https://github.com/Presage-Security/SmartSpectra.git","type":"git"},"_npmVersion":"11.16.0","description":"Node.js (Electron) FFI binding for SmartSpectra vitals measurement","directories":{},"_nodeVersion":"24.18.1","dependencies":{"koffi":"^2.10.0","protobufjs":"^7.6.5","@smartspectra/node-sdk-linux-x64":"3.3.0-rc.7","@smartspectra/node-sdk-win32-x64":"3.3.0-rc.7","@smartspectra/node-sdk-linux-arm64":"3.3.0-rc.7","@smartspectra/node-sdk-darwin-arm64":"3.3.0-rc.7"},"publishConfig":{"registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"@types/node":"^24.0.0","protobufjs-cli":"^1.1.3"},"_npmOperationalInternal":{"tmp":"tmp/node-sdk_3.3.0-rc.7_1785835841815_0.06344794128120612","host":"s3://npm-registry-packages-npm-production"}},"3.3.0":{"name":"@smartspectra/node-sdk","version":"3.3.0","keywords":["smartspectra","vitals","physiology","electron","nodejs","ffi","koffi"],"author":{"name":"Presage Technologies, Inc."},"license":"SEE LICENSE IN LICENSE","_id":"@smartspectra/node-sdk@3.3.0","maintainers":[{"name":"maintainer_presagetech","email":"maintainer@presagetech.com"}],"homepage":"https://smartspectra.presagetech.com/","bugs":{"url":"https://github.com/Presage-Security/SmartSpectra/issues"},"dist":{"shasum":"0b5e77db90725d468e98eb76524399a1c7bf5047","tarball":"https://registry.npmjs.org/@smartspectra/node-sdk/-/node-sdk-3.3.0.tgz","fileCount":24,"integrity":"sha512-KBKkd4UCYlf84jgSzdsRJ9gXI2QPR7h2jL1XfUm+8OnH3xZZCg/PjuOo6EJEVh1ZpPC31pscuaIQVGidCLR2zg==","signatures":[{"sig":"MEYCIQDFNdd0k/JGFq5uqJq2x8OcWZrkiq+fj3tAHnwsz5Ve+wIhANqDKGEsoH662B8npWpn+oYGeYw+rqv4tBSJCFrGWRqa","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":688158},"main":"js/index.js","types":"js/index.d.ts","engines":{"node":">=20.0.0"},"exports":{".":{"types":"./js/index.d.ts","default":"./js/index.js"},"./main":{"types":"./js/main/index.d.ts","default":"./js/main/index.js"},"./preload":"./js/preload/index.js","./messages":{"types":"./js/messages/index.d.ts","default":"./js/messages/index.js"},"./renderer":{"types":"./js/renderer/index.d.ts","default":"./js/renderer/index.js"},"./package.json":"./package.json"},"gitHead":"e174d1ed861d8e6eaf912e001ded2cf24c0fbe80","scripts":{"test":"node --test test/log-level-pin.js test/renderer-timestamp.js test/smoke.js","prepare":"node scripts/gen-proto.cjs","build:proto":"node scripts/gen-proto.cjs","test:models-allowlist":"node test/models-allowlist.js"},"_npmUser":{"name":"maintainer_presagetech","email":"maintainer@presagetech.com"},"overrides":{"tmp":"0.2.7"},"repository":{"url":"git+https://github.com/Presage-Security/SmartSpectra.git","type":"git"},"_npmVersion":"11.17.0","description":"Node.js (Electron) FFI binding for SmartSpectra vitals measurement","directories":{},"_nodeVersion":"24.19.0","dependencies":{"koffi":"^2.10.0","protobufjs":"^7.6.5","@smartspectra/node-sdk-linux-x64":"3.3.0","@smartspectra/node-sdk-win32-x64":"3.3.0","@smartspectra/node-sdk-linux-arm64":"3.3.0","@smartspectra/node-sdk-darwin-arm64":"3.3.0"},"publishConfig":{"registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"@types/node":"^24.0.0","protobufjs-cli":"^1.1.3"},"_npmOperationalInternal":{"tmp":"tmp/node-sdk_3.3.0_1786146247243_0.706089700772204","host":"s3://npm-registry-packages-npm-production"}},"3.4.0-rc.2":{"name":"@smartspectra/node-sdk","version":"3.4.0-rc.2","keywords":["smartspectra","vitals","physiology","electron","nodejs","ffi","koffi"],"author":{"name":"Presage Technologies, Inc."},"license":"SEE LICENSE IN LICENSE","_id":"@smartspectra/node-sdk@3.4.0-rc.2","maintainers":[{"name":"maintainer_presagetech","email":"maintainer@presagetech.com"}],"homepage":"https://smartspectra.presagetech.com/","bugs":{"url":"https://github.com/Presage-Security/SmartSpectra/issues"},"dist":{"shasum":"2627303494f5a7722094eaa0b494ea3a452e73d0","tarball":"https://registry.npmjs.org/@smartspectra/node-sdk/-/node-sdk-3.4.0-rc.2.tgz","fileCount":24,"integrity":"sha512-hcXnnFxfMrDsV0bRrcp/gLrN2MGIsRs83JsA5ODGWIMixuNUCKIdqk+RQPDo41Q4udmX0ttAXbXzrbbzL657UA==","signatures":[{"sig":"MEUCIQCTwOSZDISNAZ4aTSeNGv5thshCumzp2ll8QiosdQaFHAIgIJkFADFC1wINRHUjHqDaNiEwUhgReyYOOCd7Ot5umCE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":688794},"main":"js/index.js","types":"js/index.d.ts","engines":{"node":">=20.0.0"},"exports":{".":{"types":"./js/index.d.ts","default":"./js/index.js"},"./main":{"types":"./js/main/index.d.ts","default":"./js/main/index.js"},"./preload":"./js/preload/index.js","./messages":{"types":"./js/messages/index.d.ts","default":"./js/messages/index.js"},"./renderer":{"types":"./js/renderer/index.d.ts","default":"./js/renderer/index.js"},"./package.json":"./package.json"},"gitHead":"58990949cab2d1ff749636e70e049192935c278f","scripts":{"test":"node --test test/log-level-pin.js test/renderer-timestamp.js test/smoke.js","prepare":"node scripts/gen-proto.cjs","build:proto":"node scripts/gen-proto.cjs","test:models-allowlist":"node test/models-allowlist.js"},"_npmUser":{"name":"maintainer_presagetech","email":"maintainer@presagetech.com"},"overrides":{"tmp":"0.2.7"},"repository":{"url":"git+https://github.com/Presage-Security/SmartSpectra.git","type":"git"},"_npmVersion":"11.17.0","description":"Node.js (Electron) FFI binding for SmartSpectra vitals measurement","directories":{},"_nodeVersion":"24.19.0","dependencies":{"koffi":"^2.10.0","protobufjs":"^7.6.5","@smartspectra/node-sdk-linux-x64":"3.4.0-rc.2","@smartspectra/node-sdk-win32-x64":"3.4.0-rc.2","@smartspectra/node-sdk-linux-arm64":"3.4.0-rc.2","@smartspectra/node-sdk-darwin-arm64":"3.4.0-rc.2"},"publishConfig":{"registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"@types/node":"^24.0.0","protobufjs-cli":"^1.1.3"},"_npmOperationalInternal":{"tmp":"tmp/node-sdk_3.4.0-rc.2_1787176126879_0.8165457099204942","host":"s3://npm-registry-packages-npm-production"}},"3.4.0-rc.3":{"name":"@smartspectra/node-sdk","version":"3.4.0-rc.3","keywords":["smartspectra","vitals","physiology","electron","nodejs","ffi","koffi"],"author":{"name":"Presage Technologies, Inc."},"license":"SEE LICENSE IN LICENSE","_id":"@smartspectra/node-sdk@3.4.0-rc.3","maintainers":[{"name":"maintainer_presagetech","email":"maintainer@presagetech.com"}],"homepage":"https://smartspectra.presagetech.com/","bugs":{"url":"https://github.com/Presage-Security/SmartSpectra/issues"},"dist":{"shasum":"262fbd985d40c6e9649ca73de1253ada8acac5b2","tarball":"https://registry.npmjs.org/@smartspectra/node-sdk/-/node-sdk-3.4.0-rc.3.tgz","fileCount":24,"integrity":"sha512-X/Tsr7O3C013njsLhDBAZKH0C0e+WgPdib5fafqFJzkGRaN8Jvsx7wBSMM2Czcqo4cDTGE1AaYjrdHQ+GW6eyw==","signatures":[{"sig":"MEUCIBHm5Ni7bFsJgud7Ej+RiQov7g/6+HTnqqpaOf0XunSNAiEAuBzh6D35QcRzme1uzJ83ftdbQ5/o2jwayGizCoCxYT4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":688794},"main":"js/index.js","types":"js/index.d.ts","engines":{"node":">=20.0.0"},"exports":{".":{"types":"./js/index.d.ts","default":"./js/index.js"},"./main":{"types":"./js/main/index.d.ts","default":"./js/main/index.js"},"./preload":"./js/preload/index.js","./messages":{"types":"./js/messages/index.d.ts","default":"./js/messages/index.js"},"./renderer":{"types":"./js/renderer/index.d.ts","default":"./js/renderer/index.js"},"./package.json":"./package.json"},"gitHead":"02ddb5a58ede4b32901b9245dd5fc6731459283a","scripts":{"test":"node --test test/log-level-pin.js test/renderer-timestamp.js test/smoke.js","prepare":"node scripts/gen-proto.cjs","build:proto":"node scripts/gen-proto.cjs","test:models-allowlist":"node test/models-allowlist.js"},"_npmUser":{"name":"maintainer_presagetech","email":"maintainer@presagetech.com"},"overrides":{"tmp":"0.2.7"},"repository":{"url":"git+https://github.com/Presage-Security/SmartSpectra.git","type":"git"},"_npmVersion":"11.19.0","description":"Node.js (Electron) FFI binding for SmartSpectra vitals measurement","directories":{},"_nodeVersion":"24.20.0","dependencies":{"koffi":"^2.10.0","protobufjs":"^7.6.5","@smartspectra/node-sdk-linux-x64":"3.4.0-rc.3","@smartspectra/node-sdk-win32-x64":"3.4.0-rc.3","@smartspectra/node-sdk-linux-arm64":"3.4.0-rc.3","@smartspectra/node-sdk-darwin-arm64":"3.4.0-rc.3"},"publishConfig":{"registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"@types/node":"^24.0.0","protobufjs-cli":"^1.1.3"},"_npmOperationalInternal":{"tmp":"tmp/node-sdk_3.4.0-rc.3_1788279750218_0.19935642736020265","host":"s3://npm-registry-packages-npm-production"}},"3.4.0-rc.4":{"name":"@smartspectra/node-sdk","version":"3.4.0-rc.4","keywords":["smartspectra","vitals","physiology","electron","nodejs","ffi","koffi"],"author":{"name":"Presage Technologies, Inc."},"license":"SEE LICENSE IN LICENSE","_id":"@smartspectra/node-sdk@3.4.0-rc.4","maintainers":[{"name":"maintainer_presagetech","email":"maintainer@presagetech.com"}],"homepage":"https://smartspectra.presagetech.com/","bugs":{"url":"https://github.com/Presage-Security/SmartSpectra/issues"},"dist":{"shasum":"975633acc7c79c33b2573e6c7149d6683e575b15","tarball":"https://registry.npmjs.org/@smartspectra/node-sdk/-/node-sdk-3.4.0-rc.4.tgz","fileCount":24,"integrity":"sha512-NIChwQ2fDME14P1gfyVFWxU/yMv+GFrh7qpg6o14LcTWq5OmyUgRtGgbE4QxksTk8/y+i/Ni0VE+barWsbfWmw==","signatures":[{"sig":"MEUCIAqls7OAH8BkTa6d0sk+kL9quuf/sWZcjTLj2swCjafAAiEA4/ZHcH4hKh6KlNiipFht9X5sHIWQke6XluRCuvpIld0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":707389},"main":"js/index.js","types":"js/index.d.ts","engines":{"node":">=20.0.0"},"exports":{".":{"types":"./js/index.d.ts","default":"./js/index.js"},"./main":{"types":"./js/main/index.d.ts","default":"./js/main/index.js"},"./preload":"./js/preload/index.js","./messages":{"types":"./js/messages/index.d.ts","default":"./js/messages/index.js"},"./renderer":{"types":"./js/renderer/index.d.ts","default":"./js/renderer/index.js"},"./package.json":"./package.json"},"gitHead":"887f40540e8d05cbd0e5181c416608d85fea83b7","scripts":{"test":"node --test test/log-level-pin.js test/renderer-timestamp.js test/smoke.js","prepare":"node scripts/gen-proto.cjs","build:proto":"node scripts/gen-proto.cjs","test:models-allowlist":"node test/models-allowlist.js"},"_npmUser":{"name":"maintainer_presagetech","email":"maintainer@presagetech.com"},"overrides":{"tmp":"0.2.7"},"repository":{"url":"git+https://github.com/Presage-Security/SmartSpectra.git","type":"git"},"_npmVersion":"11.19.0","description":"Node.js (Electron) FFI binding for SmartSpectra vitals measurement","directories":{},"_nodeVersion":"24.21.0","dependencies":{"koffi":"^2.10.0","protobufjs":"^7.6.5","@smartspectra/node-sdk-linux-x64":"3.4.0-rc.4","@smartspectra/node-sdk-win32-x64":"3.4.0-rc.4","@smartspectra/node-sdk-linux-arm64":"3.4.0-rc.4","@smartspectra/node-sdk-darwin-arm64":"3.4.0-rc.4"},"publishConfig":{"registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"@types/node":"^24.0.0","protobufjs-cli":"^1.1.3"},"_npmOperationalInternal":{"tmp":"tmp/node-sdk_3.4.0-rc.4_1788985937679_0.3240585025496303","host":"s3://npm-registry-packages-npm-production"}},"3.4.0-rc.5":{"name":"@smartspectra/node-sdk","version":"3.4.0-rc.5","keywords":["smartspectra","vitals","physiology","electron","nodejs","ffi","koffi"],"author":{"name":"Presage Technologies, Inc."},"license":"SEE LICENSE IN LICENSE","_id":"@smartspectra/node-sdk@3.4.0-rc.5","maintainers":[{"name":"maintainer_presagetech","email":"maintainer@presagetech.com"}],"homepage":"https://smartspectra.presagetech.com/","bugs":{"url":"https://github.com/Presage-Security/SmartSpectra/issues"},"dist":{"shasum":"b2b1bbb6fe9894279dfa97c1954478da292f483f","tarball":"https://registry.npmjs.org/@smartspectra/node-sdk/-/node-sdk-3.4.0-rc.5.tgz","fileCount":24,"integrity":"sha512-2CICxeKYHR3e8XYhlAWt673ng6pR78T1N6cVA2uMBMnYsiid6TkPSDKMzHdycnSDkK2j9/sNV1I7fhK2vboPHA==","signatures":[{"sig":"MEUCIQDDYu/6WF1yHlE3/8YQqqtNgKSEg0NiJsib0lhXMmVHKwIgPpxeaS/MOU48YpD3P72B3CGEXoy+C0mGmOkUlSyZQlg=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCICZ3NwBL1pfnurIUPROLISfod7dUXSeT8zuvTcN4l/FnAiEAoAwXr17XpBvSPrFYL3csSr2ejDyOKfxX4ctzJIpdp50=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":707389},"main":"js/index.js","types":"js/index.d.ts","engines":{"node":">=20.0.0"},"exports":{".":{"types":"./js/index.d.ts","default":"./js/index.js"},"./main":{"types":"./js/main/index.d.ts","default":"./js/main/index.js"},"./preload":"./js/preload/index.js","./messages":{"types":"./js/messages/index.d.ts","default":"./js/messages/index.js"},"./renderer":{"types":"./js/renderer/index.d.ts","default":"./js/renderer/index.js"},"./package.json":"./package.json"},"gitHead":"fa472641c20d2f3f098cf8bba585f96845ec0ae1","scripts":{"test":"node --test test/log-level-pin.js test/renderer-timestamp.js test/smoke.js","prepare":"node scripts/gen-proto.cjs","build:proto":"node scripts/gen-proto.cjs","test:models-allowlist":"node test/models-allowlist.js"},"_npmUser":{"name":"maintainer_presagetech","email":"maintainer@presagetech.com"},"overrides":{"tmp":"0.2.7"},"repository":{"url":"git+https://github.com/Presage-Security/SmartSpectra.git","type":"git"},"_npmVersion":"11.19.0","description":"Node.js (Electron) FFI binding for SmartSpectra vitals measurement","directories":{},"_nodeVersion":"24.21.0","dependencies":{"koffi":"^2.10.0","protobufjs":"^7.6.5","@smartspectra/node-sdk-linux-x64":"3.4.0-rc.5","@smartspectra/node-sdk-win32-x64":"3.4.0-rc.5","@smartspectra/node-sdk-linux-arm64":"3.4.0-rc.5","@smartspectra/node-sdk-darwin-arm64":"3.4.0-rc.5"},"publishConfig":{"registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"@types/node":"^24.0.0","protobufjs-cli":"^1.1.3"},"_npmOperationalInternal":{"tmp":"tmp/node-sdk_3.4.0-rc.5_1789442372164_0.49342318412668984","host":"s3://npm-registry-packages-npm-production"}},"3.4.0-rc.6":{"name":"@smartspectra/node-sdk","version":"3.4.0-rc.6","keywords":["smartspectra","vitals","physiology","electron","nodejs","ffi","koffi"],"author":{"name":"Presage Technologies, Inc."},"license":"SEE LICENSE IN LICENSE","_id":"@smartspectra/node-sdk@3.4.0-rc.6","maintainers":[{"name":"maintainer_presagetech","email":"maintainer@presagetech.com"}],"homepage":"https://smartspectra.presagetech.com/","bugs":{"url":"https://github.com/Presage-Security/SmartSpectra/issues"},"dist":{"shasum":"782ffeafc5296ec09c6f4ca239495fcc3b75a503","tarball":"https://registry.npmjs.org/@smartspectra/node-sdk/-/node-sdk-3.4.0-rc.6.tgz","fileCount":25,"integrity":"sha512-ZyPvX417xY9uRVUumRgIcRhehg328WvyUpJNtMLasB+J1qvGU9x2x2qAVuT8NqLcryKyr9Hh5zNAhSdLAE7CIw==","signatures":[{"sig":"MEYCIQDqgObcjJrJKtJBhuiDdoHtIaKSQ6s8ePdP6vM09prdBAIhAOd6+40hxzMUbqA9pPJPdVggoslGag4iIX7s6qNg85jS","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIQDaW1bWtCvWNsUgR4RMa8HqU1B1gyXZEvqAIdkSBj0TpAIgWNKrVyMN3E9u8v8iaDKPff7cITfioGd7exUXt6j/k90=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":718081},"main":"js/index.js","types":"js/index.d.ts","engines":{"node":">=20.0.0"},"exports":{".":{"types":"./js/index.d.ts","default":"./js/index.js"},"./main":{"types":"./js/main/index.d.ts","default":"./js/main/index.js"},"./preload":"./js/preload/index.js","./messages":{"types":"./js/messages/index.d.ts","default":"./js/messages/index.js"},"./renderer":{"types":"./js/renderer/index.d.ts","default":"./js/renderer/index.js"},"./package.json":"./package.json"},"gitHead":"dfb07b28bb3ca68f9303b840a358e20e3d42bb81","scripts":{"test":"npm run test:types && node --test test/log-level-pin.js test/renderer-timestamp.js test/camera-selection.js test/reset-lifecycle.js test/smoke.js","prepare":"node scripts/gen-proto.cjs","test:types":"tsc --noEmit --strict --skipLibCheck --target es2022 --module nodenext test/camera-selection-types.ts","build:proto":"node scripts/gen-proto.cjs","test:models-allowlist":"node test/models-allowlist.js"},"_npmUser":{"name":"maintainer_presagetech","email":"maintainer@presagetech.com"},"overrides":{"tmp":"0.2.7"},"repository":{"url":"git+https://github.com/Presage-Security/SmartSpectra.git","type":"git"},"_npmVersion":"11.19.0","description":"Node.js (Electron) FFI binding for SmartSpectra vitals measurement","directories":{},"_nodeVersion":"24.21.0","dependencies":{"koffi":"^2.10.0","protobufjs":"^7.6.5","@smartspectra/node-sdk-linux-x64":"3.4.0-rc.6","@smartspectra/node-sdk-win32-x64":"3.4.0-rc.6","@smartspectra/node-sdk-linux-arm64":"3.4.0-rc.6","@smartspectra/node-sdk-darwin-arm64":"3.4.0-rc.6"},"publishConfig":{"registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"typescript":"^6.0.2","@types/node":"^24.0.0","protobufjs-cli":"^1.1.3"},"_npmOperationalInternal":{"tmp":"tmp/node-sdk_3.4.0-rc.6_1789856877675_0.6178483128549741","host":"s3://npm-registry-packages-npm-production"}},"3.4.0-rc.7":{"name":"@smartspectra/node-sdk","version":"3.4.0-rc.7","keywords":["smartspectra","vitals","physiology","electron","nodejs","ffi","koffi"],"author":{"name":"Presage Technologies, Inc."},"license":"SEE LICENSE IN LICENSE","_id":"@smartspectra/node-sdk@3.4.0-rc.7","maintainers":[{"name":"maintainer_presagetech","email":"maintainer@presagetech.com"}],"homepage":"https://smartspectra.presagetech.com/","bugs":{"url":"https://github.com/Presage-Security/SmartSpectra/issues"},"dist":{"shasum":"11cb2fa1e3289bd59ed46b162cc9c3e32dbab905","tarball":"https://registry.npmjs.org/@smartspectra/node-sdk/-/node-sdk-3.4.0-rc.7.tgz","fileCount":25,"integrity":"sha512-nuRpz3oMWRKCTsGI4j7nnXHxCEXdw/RNnhtYXzw9zOhS8r57QV8I6eqi11W4Mqo4e4vxOpIWY53J27dYYi11YQ==","signatures":[{"sig":"MEYCIQDnr4PQ8OEZ+7ki+5iNnYXcTS5G7ROawtpSEQbs+xgZ+gIhAKlJJVQx5pqD+vehZdVx5879O/HeSZ1LB4NM07zfCUl/","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCICpkfXlOjLxblysAS+s12Mj9Z81oUx3Xf2188LoDtmVRAiEA37Ji1kLT2bt6d0VKxTLMQnEySxPvlTkuhdbzcrj3Bnw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":753648},"main":"js/index.js","types":"js/index.d.ts","engines":{"node":">=20.0.0"},"exports":{".":{"types":"./js/index.d.ts","default":"./js/index.js"},"./main":{"types":"./js/main/index.d.ts","default":"./js/main/index.js"},"./preload":"./js/preload/index.js","./messages":{"types":"./js/messages/index.d.ts","default":"./js/messages/index.js"},"./renderer":{"types":"./js/renderer/index.d.ts","default":"./js/renderer/index.js"},"./package.json":"./package.json"},"gitHead":"fdcc50e9fe6a1454b6f1e6dee5460c9e36814950","scripts":{"test":"npm run test:types && node --test test/log-level-pin.js test/renderer-timestamp.js test/camera-selection.js test/reset-lifecycle.js test/smoke.js","prepare":"node scripts/gen-proto.cjs","test:types":"tsc --noEmit --strict --skipLibCheck --target es2022 --module nodenext test/camera-selection-types.ts","build:proto":"node scripts/gen-proto.cjs","test:models-allowlist":"node test/models-allowlist.js"},"_npmUser":{"name":"maintainer_presagetech","email":"maintainer@presagetech.com"},"overrides":{"tmp":"0.2.7"},"repository":{"url":"git+https://github.com/Presage-Security/SmartSpectra.git","type":"git"},"_npmVersion":"11.19.0","description":"Node.js (Electron) FFI binding for SmartSpectra vitals measurement","directories":{},"_nodeVersion":"24.21.0","dependencies":{"koffi":"^2.10.0","protobufjs":"^7.6.5","@smartspectra/node-sdk-linux-x64":"3.4.0-rc.7","@smartspectra/node-sdk-win32-x64":"3.4.0-rc.7","@smartspectra/node-sdk-linux-arm64":"3.4.0-rc.7","@smartspectra/node-sdk-darwin-arm64":"3.4.0-rc.7"},"publishConfig":{"registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"typescript":"^6.0.2","@types/node":"^24.0.0","protobufjs-cli":"^1.1.3"},"_npmOperationalInternal":{"tmp":"tmp/node-sdk_3.4.0-rc.7_1790252010849_0.3906509142285606","host":"s3://npm-registry-packages-npm-production"}},"3.4.0-rc.8":{"name":"@smartspectra/node-sdk","version":"3.4.0-rc.8","keywords":["smartspectra","vitals","physiology","electron","nodejs","ffi","koffi"],"author":{"name":"Presage Technologies, Inc."},"license":"SEE LICENSE IN LICENSE","_id":"@smartspectra/node-sdk@3.4.0-rc.8","maintainers":[{"name":"maintainer_presagetech","email":"maintainer@presagetech.com"}],"homepage":"https://smartspectra.presagetech.com/","bugs":{"url":"https://github.com/Presage-Security/SmartSpectra/issues"},"dist":{"shasum":"3ef5f1bf60ae25e6be3b7d2a017d8834253ea437","tarball":"https://registry.npmjs.org/@smartspectra/node-sdk/-/node-sdk-3.4.0-rc.8.tgz","fileCount":25,"integrity":"sha512-quKWYHgXUlZoc6t4LRJfdF50j+WwnVem6MQq4OlXCnWhhU2SEwxSyemJxJV+c4G91ZiDO+vzS9GzC/BnWOCEuw==","signatures":[{"sig":"MEUCIDCwki1KavY+eKvTfxG3Yai1LwdwB6USWk7RI6r61XfwAiEAgyH9i+1kpKcyirVAaWu6CP9fsYaMfX7egUPA137hNds=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIQD1HAe0pOocyGin8yNeq3dq6j6AToujgeX1mZbHYSacCAIgV+sfvea6u6vk5kepNLuf+czlsLzxihpnCb1MlqFSWxU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":753648},"main":"js/index.js","types":"js/index.d.ts","engines":{"node":">=20.0.0"},"exports":{".":{"types":"./js/index.d.ts","default":"./js/index.js"},"./main":{"types":"./js/main/index.d.ts","default":"./js/main/index.js"},"./preload":"./js/preload/index.js","./messages":{"types":"./js/messages/index.d.ts","default":"./js/messages/index.js"},"./renderer":{"types":"./js/renderer/index.d.ts","default":"./js/renderer/index.js"},"./package.json":"./package.json"},"gitHead":"2272b36b2b93d4a382ca6c4d6b5640e360fea185","scripts":{"test":"npm run test:types && node --test test/log-level-pin.js test/renderer-timestamp.js test/camera-selection.js test/reset-lifecycle.js test/smoke.js","prepare":"node scripts/gen-proto.cjs","test:types":"tsc --noEmit --strict --skipLibCheck --target es2022 --module nodenext test/camera-selection-types.ts","build:proto":"node scripts/gen-proto.cjs","test:models-allowlist":"node test/models-allowlist.js"},"_npmUser":{"name":"maintainer_presagetech","email":"maintainer@presagetech.com"},"overrides":{"tmp":"0.2.7"},"repository":{"url":"git+https://github.com/Presage-Security/SmartSpectra.git","type":"git"},"_npmVersion":"11.19.0","description":"Node.js (Electron) FFI binding for SmartSpectra vitals measurement","directories":{},"_nodeVersion":"24.21.0","dependencies":{"koffi":"^2.10.0","protobufjs":"^7.6.5","@smartspectra/node-sdk-linux-x64":"3.4.0-rc.8","@smartspectra/node-sdk-win32-x64":"3.4.0-rc.8","@smartspectra/node-sdk-linux-arm64":"3.4.0-rc.8","@smartspectra/node-sdk-darwin-arm64":"3.4.0-rc.8"},"publishConfig":{"registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"typescript":"^6.0.2","@types/node":"^24.0.0","protobufjs-cli":"^1.1.3"},"_npmOperationalInternal":{"tmp":"tmp/node-sdk_3.4.0-rc.8_1790278726174_0.6114445454378645","host":"s3://npm-registry-packages-npm-production"}},"3.4.0":{"_id":"@smartspectra/node-sdk@3.4.0","bugs":{"url":"https://github.com/Presage-Security/SmartSpectra/issues"},"dist":{"shasum":"7785b2f8e39a4a6a6858f95be7c4a1b4764d07d1","tarball":"https://registry.npmjs.org/@smartspectra/node-sdk/-/node-sdk-3.4.0.tgz","fileCount":25,"integrity":"sha512-gl4Nav+MHmzJQQju/uE+zMmwobr08SI9gOHBxPn7HJDAA4SgW7NCb2L5t1vFDdZc2varVCWGLEkP930jpHhD0g==","signatures":[{"sig":"MEQCIF89Fsuca2hI0s3wICdI1XC3ytFyN5RUnacXxmm2CbS6AiAJL3U1F42WQ37sigbDLzFrY4SZ2VV5uGjabq9l8UUXjw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQDvMdFXbO+gAuBuyEM8CBiXZ2wiSH8CI541Xkl+pTqT5wIga1/prBP1D74cxtpuWi4jFjO/VF4AVS2CNeoB9iLAJpQ="}],"unpackedSize":753623},"main":"js/index.js","name":"@smartspectra/node-sdk","types":"js/index.d.ts","author":{"name":"Presage Technologies, Inc."},"engines":{"node":">=20.0.0"},"exports":{".":{"types":"./js/index.d.ts","default":"./js/index.js"},"./main":{"types":"./js/main/index.d.ts","default":"./js/main/index.js"},"./preload":"./js/preload/index.js","./messages":{"types":"./js/messages/index.d.ts","default":"./js/messages/index.js"},"./renderer":{"types":"./js/renderer/index.d.ts","default":"./js/renderer/index.js"},"./package.json":"./package.json"},"gitHead":"bfc2128c7cf1ab49e5f5c5906bccd290929da219","license":"SEE LICENSE IN LICENSE","scripts":{"test":"npm run test:types && node --test test/log-level-pin.js test/renderer-timestamp.js test/camera-selection.js test/reset-lifecycle.js test/smoke.js","prepare":"node scripts/gen-proto.cjs","test:types":"tsc --noEmit --strict --skipLibCheck --target es2022 --module nodenext test/camera-selection-types.ts","build:proto":"node scripts/gen-proto.cjs","test:models-allowlist":"node test/models-allowlist.js"},"version":"3.4.0","_npmUser":{"name":"maintainer_presagetech","email":"maintainer@presagetech.com"},"homepage":"https://smartspectra.presagetech.com/","keywords":["smartspectra","vitals","physiology","electron","nodejs","ffi","koffi"],"overrides":{"tmp":"0.2.7"},"repository":{"url":"git+https://github.com/Presage-Security/SmartSpectra.git","type":"git"},"_npmVersion":"11.19.0","description":"Node.js (Electron) FFI binding for SmartSpectra vitals measurement","directories":{},"maintainers":[{"name":"maintainer_presagetech","email":"maintainer@presagetech.com"}],"_nodeVersion":"24.21.0","dependencies":{"koffi":"^2.10.0","protobufjs":"^7.6.5","@smartspectra/node-sdk-linux-x64":"3.4.0","@smartspectra/node-sdk-win32-x64":"3.4.0","@smartspectra/node-sdk-linux-arm64":"3.4.0","@smartspectra/node-sdk-darwin-arm64":"3.4.0"},"publishConfig":{"registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^6.0.2","@types/node":"^24.0.0","protobufjs-cli":"^1.1.3"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/node-sdk_3.4.0_1790721237420_0.958345707308575"}}},"time":{"created":"2026-06-16T00:54:50.526Z","modified":"2026-09-29T22:33:58.608Z","3.2.0-rc.6":"2026-06-16T00:54:50.835Z","3.2.0-rc.7":"2026-06-23T06:44:49.717Z","3.2.0-rc.8":"2026-06-27T05:46:55.072Z","3.2.0-rc.9":"2026-06-30T02:23:46.831Z","3.2.0":"2026-07-02T09:37:17.228Z","3.2.1":"2026-07-03T14:04:34.916Z","3.3.0-rc.1":"2026-07-06T17:54:36.897Z","3.3.0-rc.2":"2026-07-16T06:45:23.659Z","3.3.0-rc.3":"2026-07-17T05:13:35.470Z","3.3.0-rc.4":"2026-07-22T17:32:09.360Z","3.3.0-rc.6":"2026-07-28T16:45:56.261Z","3.3.0-rc.7":"2026-08-04T09:30:41.958Z","3.3.0":"2026-08-07T23:44:07.387Z","3.4.0-rc.2":"2026-08-19T21:48:47.041Z","3.4.0-rc.3":"2026-09-01T16:22:30.368Z","3.4.0-rc.4":"2026-09-09T20:32:17.825Z","3.4.0-rc.5":"2026-09-15T03:19:32.268Z","3.4.0-rc.6":"2026-09-19T22:27:57.747Z","3.4.0-rc.7":"2026-09-24T12:13:30.970Z","3.4.0-rc.8":"2026-09-24T19:38:46.286Z","3.4.0":"2026-09-29T22:33:57.590Z"},"bugs":{"url":"https://github.com/Presage-Security/SmartSpectra/issues"},"author":{"name":"Presage Technologies, Inc."},"license":"SEE LICENSE IN LICENSE","homepage":"https://smartspectra.presagetech.com/","keywords":["smartspectra","vitals","physiology","electron","nodejs","ffi","koffi"],"repository":{"url":"git+https://github.com/Presage-Security/SmartSpectra.git","type":"git"},"description":"Node.js (Electron) FFI binding for SmartSpectra vitals measurement","maintainers":[{"name":"maintainer_presagetech","email":"maintainer@presagetech.com"}],"readme":"---\ntitle: Node.js and Electron SDK\nsidebarTitle: Overview\ndescription: Build Node.js and Electron apps that measure pulse and breathing from a camera on Linux, macOS, and Windows, using a prebuilt native runtime from npm.\n---\n\n# @smartspectra/node-sdk\n\nPure-FFI Node.js (Electron) binding for SmartSpectra vitals measurement.\n[koffi](https://koffi.dev) loads the SmartSpectra C ABI shim at runtime —\nno native addon, no `binding.gyp`, no `electron-rebuild`, no `node-gyp`.\n\n## Start here\n\n- Electron sample: [electron-quickstart](https://github.com/Presage-Security/SmartSpectra/tree/main/nodejs/samples/electron-quickstart)\n- API reference: <https://smartspectra.presagetech.com/docs/nodejs/api-reference>\n- Metrics guide: <https://smartspectra.presagetech.com/docs/nodejs/metrics>\n\n## Architecture\n\n```text\n┌──────────────────────────┐\n│ your Node / Electron app │\n└───────────┬──────────────┘\n            │ require('@smartspectra/node-sdk')\n┌───────────▼──────────────┐\n│ js/index.js              │  public surface\n│ js/smartspectra.js       │  SmartSpectraSDK class\n│ js/ffi.js                │  koffi types + Session\n│ js/resolve-native.js     │  shim path resolver\n└───────────┬──────────────┘\n            │ koffi.load()\n┌────────────────────────────────────────┐\n│ @smartspectra/node-sdk-<plat>-<arch>/  │  self-contained native runtime,\n│   libsmartspectra_capi.*               │  shipped as a dependency package;\n│   …bundled runtime libraries…          │  load paths pre-relocated to\n│                                        │  @loader_path / $ORIGIN /\n└────────────────────────────────────────┘  adjacent-DLL search\n```\n\nThe native runtime ships in per-platform packages\n(`@smartspectra/node-sdk-<plat>-<arch>`) pulled in as dependencies of the main\npackage. There is **no install script** in the published tarball and no\npostinstall download; the binding loads the package matching your machine at\nruntime. SDK-thread callbacks are marshalled onto the V8 event loop by koffi\nthread-safe trampolines.\n\n## Supported Platforms\n\n| Platform | Status | Notes |\n| --- | --- | --- |\n| macOS Apple Silicon (`darwin-arm64`) | Supported | Electron and headless Node workflows supported |\n| Linux x64 (`linux-x64`) | Supported | Requires glibc 2.35+ |\n| Linux ARM64 (`linux-arm64`) | Supported | Requires glibc 2.35+ |\n| Windows x64 (`win32-x64`) | Supported | Electron and headless Node workflows supported |\n\n## Common Prerequisites\n\n| Requirement | Version |\n| --- | --- |\n| Node.js | >= 20 (Node 24 LTS recommended) |\n| Electron (optional) | >= 28 |\n\nYou also need an API key from\n[physiology.presagetech.com](https://physiology.presagetech.com/auth/login). An AI assistant\nconnected to the [SmartSpectra MCP Server](../docs/mcp-server.md) can fetch it from your account\nfor you.\n\nThe native runtime ships in per-platform npm packages pulled in automatically\nas dependencies — no install script and no system libraries to install.\n\nSupported platforms: `darwin-arm64`, `linux-x64`, `linux-arm64`, `win32-x64`.\n\nOn Linux the native runtime is built on Ubuntu 22.04 (Jammy), so it requires\nglibc >= 2.35 — Ubuntu 22.04+, Debian 12+, or any distribution at least that\nnew. glibc and libstdc++ are provided by your system, not bundled.\n\n## Installation\n\n```bash\nnpm install @smartspectra/node-sdk\n```\n\nEarly adopters can track the latest release candidate with the `rc` dist-tag:\n\n```bash\nnpm install @smartspectra/node-sdk@rc\n```\n\nThe native packages (`@smartspectra/node-sdk-<platform>-<arch>`) come in as\ndependencies and the binding loads the one matching your `platform`/`arch` at\nruntime. Each is self-contained — it bundles everything the binding loads at\nruntime, with paths already rewritten at publish time, so nothing needs to be on\nPATH and no system libraries are required. There is no install script.\n\n> **Note** — `npm install` downloads the native runtime for every supported\n> platform (a few hundred MB total), not just your host's. This is expected;\n> only the package matching your machine is loaded at runtime.\n\nIf your platform is unsupported (no `@smartspectra/node-sdk-<plat>-<arch>` is\npublished for it), the first `require()` fails with an actionable error naming\nthe missing package.\n\n## Pick Your Integration Path\n\n- Electron desktop app: use `@smartspectra/node-sdk/main`,\n  `@smartspectra/node-sdk/preload`, and `@smartspectra/node-sdk/renderer`.\n- Headless Node process with a local camera: use `@smartspectra/node-sdk`\n  directly with `useCamera(CameraSelection.default)`.\n- Headless or server-side Node process with host-provided frames: use\n  `useCustomInput()` / `sendFrame()`.\n- Runnable reference app: [electron-quickstart](https://github.com/Presage-Security/SmartSpectra/tree/main/nodejs/samples/electron-quickstart)\n\n## Camera Quickstart\n\n> The snippets below are ES modules (`import` + top-level `await`) — save them as `.mjs`, or\n> set `\"type\": \"module\"` in your `package.json`. In a CommonJS project, use `require()` and\n> wrap the `await` calls in an `async` function.\n\n```ts\nimport { SmartSpectraSDK, CameraSelection, breathingMetrics, cardioMetrics, decodeMetrics } from '@smartspectra/node-sdk';\n\nconst sdk = new SmartSpectraSDK({\n  apiKey: 'YOUR_API_KEY',\n  requestedMetrics: [...breathingMetrics, ...cardioMetrics],\n});\n\nsdk.on('processingStatus', (status) => console.log('Processing status:', status));\nsdk.on('validationStatus', (code, ts, hint) =>\n  console.log('Validation:', code, hint, 'at', ts, 'µs'));\nsdk.on('metrics', (buf, ts) => {\n  console.log('Metrics at', ts, 'µs:', decodeMetrics(buf));\n});\nsdk.on('error', (code, message, retryable) =>\n  console.error('SmartSpectra error', code, message, 'retryable=', retryable));\n\nsdk.useCamera(CameraSelection.default);\nsdk.start();\n\nconsole.log('Measuring from the default camera. Press Ctrl+C to stop.');\n\n// On shutdown:\nprocess.on('SIGINT', async () => {\n  await sdk.stopAsync();\n  await sdk.destroy();\n  process.exit(0);\n});\n```\n\n`useCamera(CameraSelection.default)` selects the default camera while stopped; capture begins at\n`start()`. You can discover cameras without creating an SDK instance:\n\n```ts\nimport { CameraSelection, SmartSpectraSDK } from '@smartspectra/node-sdk';\n\nconst cameras = SmartSpectraSDK.availableCameras();\nif (cameras.length > 0) {\n  sdk.useCamera(CameraSelection.byId(cameras[0].id), { width: 1280, height: 720 });\n}\n```\n\n`CameraSelection.default`, `.front`, `.back`, and `.byId(id)` share the camera\nselection contract across SDKs. Explicit requests never fall back. Stop/start/reset\nretain the chosen input. Native Node.js supports camera discovery and typed\nselection on macOS, Linux, and Windows. Linux and Windows cameras may report\nunknown facing or lens type, so select those cameras by discovered ID. On\nWindows, `.front` and `.back` fail with `kInputUnavailable` because facing is\nnot reported. See the\n[migration guide](docs/migration-guide.md) and [API reference](docs/api-reference.md#cameraoptions).\n\nElectron renderer capture uses browser-owned streams and `useMediaStream()`;\nbrowser device IDs cannot be used for native camera selection. Use the\ncustom-input path below when your app already owns frame capture.\n\n## Custom Input Quickstart\n\nTo supply frames from another source, replace the camera setup with:\n\n```ts\nimport { FrameTransform, PixelFormat } from '@smartspectra/node-sdk';\n\nsdk.useCustomInput(FrameTransform.kNone);\nsdk.start();\nsdk.sendFrame(rgbBuf, width, height, width * 3, PixelFormat.kRGB, captureTsUs);\n```\n\n## API reference\n\nThe full API — `SmartSpectraSDK` constructor options, methods, events, error\ncodes, and enums — lives in the [API reference](docs/api-reference.md),\ngenerated from the SDK's bundled TypeScript declarations so it tracks the\npublished package. For which metrics to request and how to read the decoded\npayloads, see the [metrics guide](docs/metrics.md).\nFor natural-language analysis of the measured vitals, see the\n[LLM Insights guide](docs/llm-insights.md).\n\n## Electron integration\n\nRunnable sample at [electron-quickstart](https://github.com/Presage-Security/SmartSpectra/tree/main/nodejs/samples/electron-quickstart).\nSee its [README](https://github.com/Presage-Security/SmartSpectra/blob/main/nodejs/samples/electron-quickstart/README.md).\n\nThe package ships these entry points:\n\n```text\n@smartspectra/node-sdk                  → SmartSpectraSDK (low-level, main process)\n@smartspectra/node-sdk/main             → bindSmartSpectraIpc(window)\n@smartspectra/node-sdk/preload          → preload bridge (contextBridge)\n@smartspectra/node-sdk/renderer         → SmartSpectraSDK (renderer-side, MediaStream input)\n@smartspectra/node-sdk/messages         → decodeMetrics(buf) + the generated Metrics class\n```\n\n### Main process\n\n```ts\nimport { app, BrowserWindow } from 'electron';\nimport { bindSmartSpectraIpc } from '@smartspectra/node-sdk/main';\n\napp.whenReady().then(() => {\n  const win = new BrowserWindow({\n    webPreferences: {\n      preload: require.resolve('@smartspectra/node-sdk/preload'),\n      contextIsolation: true,\n      sandbox: true,\n    },\n  });\n  bindSmartSpectraIpc(win);\n  win.loadFile('index.html');\n});\n```\n\n`bindSmartSpectraIpc` listens on a single private IPC channel, accepts the\nMessagePort the preload ships from the renderer, and owns one\n`SmartSpectraSDK` per renderer connection. SDK teardown happens\nautomatically on window close.\n\n### Renderer\n\n```ts\nimport { SmartSpectraSDK } from '@smartspectra/node-sdk/renderer';\nimport { breathingMetrics, cardioMetrics } from '@smartspectra/node-sdk';\n\nconst sdk = new SmartSpectraSDK({\n  apiKey: 'YOUR_KEY',\n  requestedMetrics: [...breathingMetrics, ...cardioMetrics],\n});\n\nsdk.on('streamAvailable',  (stream) => { videoEl.srcObject = stream; });\nsdk.on('metrics',          (buf, ts) => { /* render dashboard */ });\nsdk.on('validationStatus', (code, ts, hint) => { /* show user hint */ });\nsdk.on('error',            (code, msg, retryable) => { /* surface in UI */ });\n\nawait sdk.start();          // SDK acquires the front camera + emits 'streamAvailable'\n\nawait sdk.requestInsight('How is my breathing?');\nawait sdk.stop();           // SDK releases the camera; next start() re-acquires\nsdk.destroy();\n```\n\nDefaults: front-facing camera at 1280x720 / 30 fps, AE/AWB/focus locked\nonce the graph reports `Running`. Call `sdk.useMediaStream(stream)` before\n`sdk.start()` to override with a virtual camera,\n`<canvas>.captureStream()`, `desktopCapturer`, etc. Host-supplied streams\nare managed by the host; SDK-acquired streams are released on\n`stop()` / `reset()` / `destroy()`.\n\nThe renderer uses `MediaStreamTrackProcessor` + `OffscreenCanvas` to\nextract RGBA pixels and ships each frame to the main process via the\nMessagePort. Graph callbacks flow back through the same port.\n\nEach control call (`start` / `stop` / `reset` / `requestInsight`) waits for\nan ack from the main process. If the main process crashes or stalls, the\ncall rejects after `sendTimeoutMs` (default `30000`) with an `Error` whose\n`code` is `'SMARTSPECTRA_IPC_TIMEOUT'`, so the UI surfaces \"main process\nunresponsive\" instead of hanging forever. Pass `sendTimeoutMs` to the\nconstructor to tune it, or `0` to disable.\n\n### Preload\n\nIf the app already has a preload script, require this module from it:\n\n```js\nrequire('@smartspectra/node-sdk/preload');\n```\n\nOtherwise point `webPreferences.preload` directly:\n\n```ts\npreload: require.resolve('@smartspectra/node-sdk/preload')\n```\n\n### Content Security Policy\n\nThe renderer runs a Web Worker from a `blob:` URL. If your app sets a CSP,\nallow `blob:` in `worker-src`:\n\n```html\n<meta http-equiv=\"Content-Security-Policy\"\n      content=\"default-src 'self'; worker-src 'self' blob:;\">\n```\n\nA `Refused to create a worker from 'blob:…'` console error at `start()`\ntime means the policy is blocking the worker.\n\n### Permission flow\n\nCamera permission flows through Electron's native handler — the SDK calls\n`navigator.mediaDevices.getUserMedia()` (or the host's stream, if supplied\nvia `useMediaStream()`) and Electron surfaces the OS prompt + indicator\nLED. To grant programmatically:\n\n```ts\nimport { session } from 'electron';\n\nsession.defaultSession.setPermissionRequestHandler((wc, permission, callback, details) => {\n  // Grant only the camera, and only to your own bundled page — deny everything\n  // else so a window that later loads remote content can't auto-grant the camera.\n  const url = (details && details.requestingUrl) || (wc && wc.getURL()) || '';\n  callback(permission === 'media' && url.startsWith('file://'));\n});\n```\n\nOn macOS, add `NSCameraUsageDescription` to `Info.plist`. Windows and\nLinux need no additional entitlements.\n\n## Electron desktop packaging\n\nThe installed platform package\n`node_modules/@smartspectra/node-sdk-<plat>-<arch>/` ships the full native\nclosure — every library `libsmartspectra_capi` needs at runtime, with\ninstall_names / RPATHs pre-relocated to `@loader_path` (macOS), `$ORIGIN`\n(Linux), or adjacent-directory search (Windows). Include that directory as an\nextra resource and you're done.\n\n### electron-builder\n\nUse one block per target OS. electron-builder's `${platform}` macro expands to\nthe **build host's** platform, not the build target — so a single\n`${platform}` entry ships the wrong (or no) closure on a cross-build\n(e.g. `electron-builder --win` on a Mac). The per-OS `mac`/`win`/`linux` blocks\nare applied only to their matching target and are cross-build-safe:\n\n```jsonc\n// package.json\n{\n  \"build\": {\n    \"mac\":   { \"extraResources\": [{ \"from\": \"node_modules/@smartspectra/node-sdk-darwin-${arch}/\", \"to\": \"smartspectra/\" }] },\n    \"win\":   { \"extraResources\": [{ \"from\": \"node_modules/@smartspectra/node-sdk-win32-${arch}/\",  \"to\": \"smartspectra/\" }] },\n    \"linux\": { \"extraResources\": [{ \"from\": \"node_modules/@smartspectra/node-sdk-linux-${arch}/\",  \"to\": \"smartspectra/\" }] }\n  }\n}\n```\n\n### electron-forge\n\n```js\n// forge.config.js\nmodule.exports = {\n  packagerConfig: {\n    extraResource: [\n      `node_modules/@smartspectra/node-sdk-${process.platform}-${process.arch}/`,\n    ],\n  },\n};\n```\n\n> **Cross-builds:** `process.platform`/`process.arch` resolve at config-load\n> time to the **host**, not the build target — so this single line is correct\n> only for native (per-OS-CI) builds. To cross-build, switch on the target\n> (`--platform`/`--arch` passed to `electron-forge package`) and emit the\n> matching `node_modules/@smartspectra/node-sdk-<target>/` path.\n\n### macOS code signing\n\nThe bundled `.dylib` files are ad-hoc signed so dyld will load them; for\ndistribution you'll want to re-sign with your own identity. With\nelectron-builder:\n\n```jsonc\n{\n  \"build\": {\n    \"mac\": {\n      \"hardenedRuntime\": true,\n      \"entitlements\": \"build/entitlements.mac.plist\",\n      \"extendInfo\": { \"NSCameraUsageDescription\": \"Vitals measurement\" }\n    }\n  }\n}\n```\n\nIn `entitlements.mac.plist`, allow loading the bundled dylibs:\n\n```xml\n<key>com.apple.security.cs.disable-library-validation</key>\n<true/>\n```\n\nAlternative: re-sign every `.dylib` under\n`node_modules/@smartspectra/node-sdk-darwin-arm64/` with your own identity\nbefore packaging (preferable for notarization-strict deployments).\n\n### Windows code signing\n\nAuthenticode-sign each `.dll` under\n`node_modules/@smartspectra/node-sdk-win32-x64/` alongside your app's main\nexecutable. Windows resolves adjacent DLLs first, so\nplacing them in the same directory as `<your-app>.exe` is the simplest\nlayout.\n\n### Linux\n\nNo signing required. The bundled `.so` files have `$ORIGIN` RPATHs so\nthey resolve siblings without any `LD_LIBRARY_PATH` plumbing.\n\n**glibc floor — Ubuntu 22.04 (Jammy, `GLIBC_2.35`).** The runtime closure is\nbuilt on a Jammy base, so a packaged app (e.g. an AppImage) runs on Ubuntu\n22.04 and any newer distribution. glibc and the C++ runtime come from the\nhost system — they are not vendored in the platform package.\n\n## Logging\n\nSDK log verbosity defaults to warnings and errors only. To change it, pass\n`logLevel` in the SDK options:\n\n```js\nconst { SmartSpectraSDK, SmartSpectraLogLevel } = require('@smartspectra/node-sdk');\n\nconst sdk = new SmartSpectraSDK({\n    apiKey: '...',\n    logLevel: SmartSpectraLogLevel.kInfo,\n});\n```\n\nLevels are cumulative — `kDebug`, `kInfo`, `kWarning` (default), `kError`,\n`kNone`. `kDebug` cannot restore debug-only statements compiled out of the\nrelease engine binary.\n\n## Performance notes\n\n- koffi adds ~100 ns per FFI call — negligible for `sendFrame()` at 30 fps.\n- SDK callbacks arrive on worker threads; koffi marshals them onto the V8\n  event loop, so listeners run on the main thread.\n- In Electron, the renderer-side SDK (`@smartspectra/node-sdk/renderer`)\n  captures frames in the renderer and ships them to the main process —\n  simplest to wire and fine for typical use. For the lowest latency at high\n  resolution, capture in the main process instead (`desktopCapturer` or an\n  off-screen renderer), since renderer→main IPC adds frame-time latency that\n  scales with resolution.\n\n## Troubleshooting\n\n| Symptom | Likely cause | Fix |\n| --- | --- | --- |\n| `the native runtime package \"@smartspectra/node-sdk-<plat>-<arch>\" is not installed` on require | platform unsupported, or a partial/offline install dropped the dependency | Confirm your platform is supported, then re-run `npm install` |\n| `Cannot open shared object file` / `LoadLibrary failed` on require | platform package present but its bundled closure is incomplete or corrupt | Reinstall the platform package (`npm install`) |\n| `kAuthenticationFailed` | API key issue | Check the key + the keychain entitlement on macOS |\n| `kNonMonotonicTimestamp` | Wall-clock timestamps | Use `process.hrtime.bigint() / 1000n` (monotonic) |\n\n## Support\n\n- Docs site: <https://smartspectra.presagetech.com/docs/nodejs>\n- GitHub issues: <https://github.com/Presage-Security/SmartSpectra/issues>\n- Email: <support@presagetech.com>\n","readmeFilename":"README.md"}