{"_id":"@2bad/tvt","_rev":"10-a3037201f6ed757c4fa5774a9b40139e","name":"@2bad/tvt","dist-tags":{"latest":"2.1.0"},"versions":{"1.0.1":{"name":"@2bad/tvt","version":"1.0.1","keywords":["tvt","ipc","cctv"],"author":{"url":"https://github.com/2BAD","name":"2BAD"},"license":"MIT","_id":"@2bad/tvt@1.0.1","maintainers":[{"name":"grasword","email":"grasword6@gmail.com"},{"name":"mrhyde","email":"npm@2bad.me"},{"name":"armordarks","email":"npm@lavrins.com"}],"contributors":[{"url":"https://github.com/mrhyde","name":"Jason Hyde","email":"github@2bad.me"}],"homepage":"https://github.com/2BAD/tvt#readme","bugs":{"url":"https://github.com/2BAD/tvt/issues"},"dist":{"shasum":"25a3e93bdafca7640464991fcb2aafeb4f14fd6e","tarball":"https://registry.npmjs.org/@2bad/tvt/-/tvt-1.0.1.tgz","fileCount":29,"integrity":"sha512-RbHHvq//SSdtRMD0bmbC8UkjEINytWJoroT1s5HgGqoeOY+KzaxLX+xzxOV8WJ/xvNI6wYnIzns36/xWM+bxFg==","signatures":[{"sig":"MEUCIHC0xAwqr1mHzvFR4Y07sj6CS+lsbKHzHHF+b7PX0XUfAiEA1aQATtJOE5q4gGHTWStknHIbPx3OgaHAIBc8MzZpqQA=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@2bad%2ftvt@1.0.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":60002},"type":"module","volta":{"npm":"10.8.0","node":"22.2.0"},"engines":{"node":">=20"},"exports":"./build/device.js","gitHead":"405c9d4fdc555f3b198d83090762be9704f68fd0","scripts":{"fix":"run-s fix:code fix:format","test":"vitest run","build":"run-p build:*","check":"run-p check:*","fix:ext":"./fix-ext.sh","fix:code":"run-s 'check:code -- --fix'","prebuild":"rimraf build","build:swc":"swc ./source -d ./build --strip-leading-paths","fix:alias":"tsc-alias -p tsconfig.build.json","postbuild":"run-s fix:alias fix:ext","test:unit":"vitest run unit --coverage","check:code":"eslint . --report-unused-disable-directives --max-warnings 0","fix:format":"prettier --write 'source/**/*.ts'","preversion":"run-s check test build","build:types":"tsc --project tsconfig.build.json","check:format":"prettier --check 'source/**/*.ts'","prepublishOnly":"run-s build","test:integration":"vitest run integration --coverage"},"typings":"./build/device.d.ts","_npmUser":{"name":"mrhyde","email":"npm@2bad.me"},"prettier":{"semi":false,"printWidth":120,"singleQuote":true,"trailingComma":"none"},"repository":{"url":"git+https://github.com/2BAD/tvt.git","type":"git"},"_npmVersion":"10.7.0","description":"This repository is the result of extensive research, disassembling, and reverse engineering efforts focused on CCTV cameras produced by Tongwei Video Technology Co., Ltd. (TVT). Our aim is to document and facilitate a deep understanding and interaction wi","directories":{},"_nodeVersion":"22.2.0","dependencies":{"debug":"4.3.4","koffi":"2.8.9","roarr":"7.21.1","easy-buffer":"1.2.0"},"_hasShrinkwrap":false,"packageManager":"npm@10.8.0","devDependencies":{"rimraf":"5.0.7","vitest":"1.6.0","@swc/cli":"0.3.12","prettier":"3.2.5","@swc/core":"1.5.7","tsc-alias":"1.8.10","typescript":"5.4.5","@types/node":"20.12.12","npm-run-all2":"6.2.0","@2bad/tsconfig":"3.0.1","eslint-config-love":"47.0.0","@vitest/coverage-v8":"1.6.0","eslint-plugin-jsdoc":"48.2.6","vite-tsconfig-paths":"4.3.2","eslint-plugin-vitest":"0.5.4","eslint-config-prettier":"9.1.0","eslint-plugin-prettier":"5.1.3","eslint-import-resolver-typescript":"3.6.1"},"_npmOperationalInternal":{"tmp":"tmp/tvt_1.0.1_1716884466514_0.009603391211197465","host":"s3://npm-registry-packages"}},"1.0.2":{"name":"@2bad/tvt","version":"1.0.2","keywords":["tvt","ipc","cctv"],"author":{"url":"https://github.com/2BAD","name":"2BAD"},"license":"MIT","_id":"@2bad/tvt@1.0.2","maintainers":[{"name":"grasword","email":"grasword6@gmail.com"},{"name":"mrhyde","email":"npm@2bad.me"},{"name":"armordarks","email":"npm@lavrins.com"}],"contributors":[{"url":"https://github.com/mrhyde","name":"Jason Hyde","email":"github@2bad.me"}],"homepage":"https://github.com/2BAD/tvt#readme","bugs":{"url":"https://github.com/2BAD/tvt/issues"},"dist":{"shasum":"d3173214c4d3f7748b515f0b7cb03fc9bea9f605","tarball":"https://registry.npmjs.org/@2bad/tvt/-/tvt-1.0.2.tgz","fileCount":34,"integrity":"sha512-Ua4acXpZXeTBtRpgDNHmToWMJ7b8lUzXkQ2XbiKnMoqh8Ye0k1u4bQvBsm4NfzZ/qBptl1x9Ql5+fLL74HAlIg==","signatures":[{"sig":"MEYCIQDzV36wm/d+PfBv5Y8dV/na2WMElfzwT0HCuWflxV+VdAIhANQb5ssEhogk58veLkzRME94L72oqHlWnBGTp3AHMvxs","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@2bad%2ftvt@1.0.2","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":7925178},"type":"module","volta":{"npm":"10.8.0","node":"22.2.0"},"engines":{"node":">=20"},"exports":"./build/device.js","gitHead":"bd81a01748890f84cab63056c024d75782918eca","scripts":{"fix":"run-s fix:code fix:format","test":"vitest run","build":"run-p build:*","check":"run-p check:*","fix:ext":"./fix-ext.sh","fix:code":"run-s 'check:code -- --fix'","prebuild":"rimraf build","build:swc":"swc ./source -d ./build --strip-leading-paths","fix:alias":"tsc-alias -p tsconfig.build.json","postbuild":"run-s fix:alias fix:ext","test:unit":"vitest run unit --coverage","check:code":"eslint . --report-unused-disable-directives --max-warnings 0","fix:format":"prettier --write 'source/**/*.ts'","preversion":"run-s check test build","build:types":"tsc --project tsconfig.build.json","check:format":"prettier --check 'source/**/*.ts'","prepublishOnly":"run-s build","test:integration":"vitest run integration --coverage"},"typings":"./build/device.d.ts","_npmUser":{"name":"mrhyde","email":"npm@2bad.me"},"prettier":{"semi":false,"printWidth":120,"singleQuote":true,"trailingComma":"none"},"repository":{"url":"git+https://github.com/2BAD/tvt.git","type":"git"},"_npmVersion":"10.7.0","description":"This repository is the result of extensive research, disassembling, and reverse engineering efforts focused on CCTV cameras produced by Tongwei Video Technology Co., Ltd. (TVT). Our aim is to document and facilitate a deep understanding and interaction wi","directories":{},"_nodeVersion":"22.2.0","dependencies":{"debug":"4.3.4","koffi":"2.8.9","roarr":"7.21.1","easy-buffer":"1.2.0"},"_hasShrinkwrap":false,"packageManager":"npm@10.8.0","devDependencies":{"rimraf":"5.0.7","vitest":"1.6.0","@swc/cli":"0.3.12","prettier":"3.2.5","@swc/core":"1.5.7","tsc-alias":"1.8.10","typescript":"5.4.5","@types/node":"20.12.12","npm-run-all2":"6.2.0","@2bad/tsconfig":"3.0.1","eslint-config-love":"51.0.1","@vitest/coverage-v8":"1.6.0","eslint-plugin-jsdoc":"48.2.6","vite-tsconfig-paths":"4.3.2","eslint-plugin-vitest":"0.5.4","eslint-config-prettier":"9.1.0","eslint-plugin-prettier":"5.1.3","eslint-import-resolver-typescript":"3.6.1"},"_npmOperationalInternal":{"tmp":"tmp/tvt_1.0.2_1716975055048_0.1273318814044644","host":"s3://npm-registry-packages"}},"1.0.3":{"name":"@2bad/tvt","version":"1.0.3","keywords":["tvt","ipc","cctv"],"author":{"url":"https://github.com/2BAD","name":"2BAD"},"license":"MIT","_id":"@2bad/tvt@1.0.3","maintainers":[{"name":"grasword","email":"grasword6@gmail.com"},{"name":"mrhyde","email":"npm@2bad.me"},{"name":"armordarks","email":"npm@lavrins.com"}],"contributors":[{"url":"https://github.com/mrhyde","name":"Jason Hyde","email":"github@2bad.me"}],"homepage":"https://github.com/2BAD/tvt#readme","bugs":{"url":"https://github.com/2BAD/tvt/issues"},"dist":{"shasum":"ae790fb913d8972cd560b778a48569e791174f94","tarball":"https://registry.npmjs.org/@2bad/tvt/-/tvt-1.0.3.tgz","fileCount":36,"integrity":"sha512-PDWlRQdxh9+uOEN6fqIpxMsKYK2a7a287swrxujw0RMG6HIaPIngT+UUsUAGkhdipnv5wT2FznRr2GGzKrraXQ==","signatures":[{"sig":"MEUCIQChyX/8lMBWafVOdpqh5K4r4gj+VBxBSZwvfDrqsLGcQgIgEZfWkGYTf8J+w1hgMZHhTzHiEcYSl/B6TQo94odtmWw=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@2bad%2ftvt@1.0.3","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":7925693},"type":"module","volta":{"npm":"10.8.1","node":"22.2.0"},"engines":{"node":">=20"},"exports":"./build/device.js","gitHead":"64369d92dca750bc260950972d248d8061de4a44","scripts":{"fix":"run-s fix:code fix:format","test":"vitest run","build":"run-p build:*","check":"run-p check:*","fix:ext":"./fix-ext.sh","fix:code":"run-s 'check:code -- --fix'","prebuild":"rimraf build","build:swc":"swc ./source -d ./build --strip-leading-paths","fix:alias":"tsc-alias -p tsconfig.build.json","postbuild":"run-s fix:alias fix:ext","test:unit":"vitest run unit --coverage","check:code":"eslint . --report-unused-disable-directives --max-warnings 0","fix:format":"prettier --write 'source/**/*.ts'","preversion":"run-s check test build","build:types":"tsc --project tsconfig.build.json","check:format":"prettier --check 'source/**/*.ts'","prepublishOnly":"run-s build","test:integration":"vitest run integration --coverage"},"typings":"./build/device.d.ts","_npmUser":{"name":"mrhyde","email":"npm@2bad.me"},"prettier":{"semi":false,"printWidth":120,"singleQuote":true,"trailingComma":"none"},"repository":{"url":"git+https://github.com/2BAD/tvt.git","type":"git"},"_npmVersion":"10.7.0","description":"This repository is the result of extensive research, disassembling, and reverse engineering efforts focused on CCTV cameras produced by Tongwei Video Technology Co., Ltd. (TVT). Our aim is to document and facilitate a deep understanding and interaction wi","directories":{},"_nodeVersion":"22.2.0","dependencies":{"debug":"4.3.5","koffi":"2.8.9","roarr":"7.21.1","easy-buffer":"1.2.0"},"_hasShrinkwrap":false,"packageManager":"npm@10.8.0","devDependencies":{"rimraf":"5.0.7","vitest":"1.6.0","@swc/cli":"0.3.12","prettier":"3.2.5","@swc/core":"1.5.24","tsc-alias":"1.8.10","typescript":"5.4.5","@types/node":"20.12.13","@types/debug":"4.1.12","npm-run-all2":"6.2.0","@2bad/tsconfig":"3.0.1","eslint-config-love":"52.0.0","@vitest/coverage-v8":"1.6.0","eslint-plugin-jsdoc":"48.2.7","vite-tsconfig-paths":"4.3.2","eslint-plugin-vitest":"0.5.4","eslint-config-prettier":"9.1.0","eslint-plugin-prettier":"5.1.3","eslint-import-resolver-typescript":"3.6.1"},"_npmOperationalInternal":{"tmp":"tmp/tvt_1.0.3_1717932354916_0.050296679613029305","host":"s3://npm-registry-packages"}},"1.0.4":{"name":"@2bad/tvt","version":"1.0.4","keywords":["tvt","ipc","cctv"],"author":{"url":"https://github.com/2BAD","name":"2BAD"},"license":"MIT","_id":"@2bad/tvt@1.0.4","maintainers":[{"name":"mrhyde","email":"npm@2bad.me"},{"name":"armordarks","email":"npm@lavrins.com"}],"contributors":[{"url":"https://github.com/mrhyde","name":"Jason Hyde","email":"github@2bad.me"}],"homepage":"https://github.com/2BAD/tvt#readme","bugs":{"url":"https://github.com/2BAD/tvt/issues"},"dist":{"shasum":"33a085e834a1ab7a2cd515bfe208d7c0fd3420a3","tarball":"https://registry.npmjs.org/@2bad/tvt/-/tvt-1.0.4.tgz","fileCount":36,"integrity":"sha512-mniXPSCjzSK3JIz50T1GyoiYyWIQ8lKmcrv9Ap8it0zYM5VC0YY1P9jILi9AV6SPd7cKx9D3lrJzpPd9lhjzhQ==","signatures":[{"sig":"MEUCIQCCYIeX6PNSm3buCxnfQ8K8drslLr5usZ3c2nJhMMoUWAIgb/amf1swx+67z44l0o2Y/jiFbaOT0gH63vRxeQ1OgCg=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@2bad%2ftvt@1.0.4","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":7925382},"type":"module","volta":{"npm":"10.8.2","node":"22.6.0"},"engines":{"node":">=20"},"exports":"./build/device.js","gitHead":"37873069215c1d1afe667d6060309b01522960a5","scripts":{"fix":"run-s fix:code fix:format","test":"vitest run","build":"run-p build:*","check":"run-p check:*","fix:ext":"./fix-ext.sh","fix:code":"run-s 'check:code -- --fix'","prebuild":"rimraf build","build:swc":"swc ./source -d ./build --strip-leading-paths","fix:alias":"tsc-alias -p tsconfig.build.json","postbuild":"run-s fix:alias fix:ext","test:unit":"vitest run unit --coverage","check:code":"eslint . --report-unused-disable-directives --max-warnings 0","fix:format":"prettier --write 'source/**/*.ts'","preversion":"run-s check test build","build:types":"tsc --project tsconfig.build.json","check:format":"prettier --check 'source/**/*.ts'","prepublishOnly":"run-s build","test:integration":"vitest run integration --coverage"},"typings":"./build/device.d.ts","_npmUser":{"name":"mrhyde","email":"npm@2bad.me"},"prettier":{"semi":false,"printWidth":120,"singleQuote":true,"trailingComma":"none"},"repository":{"url":"git+https://github.com/2BAD/tvt.git","type":"git"},"_npmVersion":"10.8.2","description":"This repository is the result of extensive research, disassembling, and reverse engineering efforts focused on CCTV cameras produced by Tongwei Video Technology Co., Ltd. (TVT). Our aim is to document and facilitate a deep understanding and interaction wi","directories":{},"_nodeVersion":"22.6.0","dependencies":{"debug":"4.3.6","koffi":"2.9.0","roarr":"7.21.1","easy-buffer":"1.2.0"},"_hasShrinkwrap":false,"packageManager":"npm@10.8.2","devDependencies":{"rimraf":"6.0.1","vitest":"2.0.5","@swc/cli":"0.4.0","prettier":"3.3.3","@swc/core":"1.7.10","tsc-alias":"1.8.10","typescript":"5.5.4","@types/node":"20.14.15","@types/debug":"4.1.12","npm-run-all2":"6.2.2","@2bad/tsconfig":"3.0.1","eslint-config-love":"62.0.0","@vitest/coverage-v8":"2.0.5","eslint-plugin-jsdoc":"50.0.1","vite-tsconfig-paths":"5.0.1","eslint-plugin-vitest":"0.5.4","eslint-config-prettier":"9.1.0","eslint-plugin-prettier":"5.2.1","eslint-import-resolver-typescript":"3.6.1"},"_npmOperationalInternal":{"tmp":"tmp/tvt_1.0.4_1723391505660_0.6311307445934597","host":"s3://npm-registry-packages"}},"1.0.5":{"name":"@2bad/tvt","version":"1.0.5","keywords":["tvt","ipc","cctv"],"author":{"url":"https://github.com/2BAD","name":"2BAD"},"license":"MIT","_id":"@2bad/tvt@1.0.5","maintainers":[{"name":"mrhyde","email":"npm@2bad.me"},{"name":"armordarks","email":"npm@lavrins.com"}],"contributors":[{"url":"https://github.com/mrhyde","name":"Jason Hyde","email":"github@2bad.me"}],"homepage":"https://github.com/2BAD/tvt#readme","bugs":{"url":"https://github.com/2BAD/tvt/issues"},"dist":{"shasum":"63c9d79323acac4a337edbee1f910dcd8a9b8cc0","tarball":"https://registry.npmjs.org/@2bad/tvt/-/tvt-1.0.5.tgz","fileCount":36,"integrity":"sha512-T0ADMibXmgB/zsnWWMI3XF7RIGmmSrm3/VoEQCcPI0Itw7w4arYT1WeRdgn91yyClMRICH3xrhcE6YjtwN+Ykg==","signatures":[{"sig":"MEQCIHj0mZpwZQ+/nU/kH/9Ll4ss+2PWAoxjIwoXKPXZtRXFAiA9NGEUdCQZbKUuZkvuMjqbKLuRlZc9UrUqEyq1kAaF3A==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@2bad%2ftvt@1.0.5","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":7925041},"type":"module","volta":{"npm":"10.8.3","node":"22.7.0"},"engines":{"node":">=20"},"exports":"./build/device.js","gitHead":"01882529bda2c37387c73a9642aa1d7312e7c951","scripts":{"fix":"run-s fix:code fix:format","test":"vitest run","build":"run-p build:*","check":"run-p check:*","fix:ext":"tsfix","fix:code":"run-s 'check:eslint -- --fix'","prebuild":"rimraf build","build:swc":"swc ./source -d ./build --strip-leading-paths","fix:alias":"tsc-alias -p tsconfig.build.json","postbuild":"run-s fix:alias fix:ext","test:unit":"vitest run unit --coverage","fix:format":"biome format --write ./source","preversion":"run-s check test build","build:types":"tsc --project tsconfig.build.json","check:biome":"biome check ./source","check:eslint":"eslint . --report-unused-disable-directives --max-warnings 0","prepublishOnly":"run-s build","test:integration":"vitest run integration --coverage"},"typings":"./build/device.d.ts","_npmUser":{"name":"mrhyde","email":"npm@2bad.me"},"repository":{"url":"git+https://github.com/2BAD/tvt.git","type":"git"},"_npmVersion":"10.8.2","description":"This repository is the result of extensive research, disassembling, and reverse engineering efforts focused on CCTV cameras produced by Tongwei Video Technology Co., Ltd. (TVT). Our aim is to document and facilitate a deep understanding and interaction wi","directories":{},"_nodeVersion":"22.7.0","dependencies":{"debug":"4.3.6","koffi":"2.9.0","roarr":"7.21.1","easy-buffer":"1.2.0"},"_hasShrinkwrap":false,"packageManager":"npm@10.8.3","devDependencies":{"rimraf":"6.0.1","vitest":"2.0.5","@swc/cli":"0.4.0","@swc/core":"1.7.23","tsc-alias":"1.8.10","typescript":"5.5.4","@2bad/axiom":"1.0.0-beta.5","@2bad/tsfix":"0.1.0","@types/node":"22.5.3","@types/debug":"4.1.12","npm-run-all2":"6.2.2","@2bad/tsconfig":"3.0.1","@biomejs/biome":"1.8.3","@vitest/coverage-v8":"2.0.5","vite-tsconfig-paths":"5.0.1"},"_npmOperationalInternal":{"tmp":"tmp/tvt_1.0.5_1725434755698_0.15037056557785533","host":"s3://npm-registry-packages"}},"1.0.6":{"name":"@2bad/tvt","version":"1.0.6","keywords":["tvt","ipc","cctv"],"author":{"url":"https://github.com/2BAD","name":"2BAD"},"license":"MIT","_id":"@2bad/tvt@1.0.6","maintainers":[{"name":"mrhyde","email":"npm@2bad.me"},{"name":"armordarks","email":"npm@lavrins.com"}],"contributors":[{"url":"https://github.com/mrhyde","name":"Jason Hyde","email":"github@2bad.me"}],"homepage":"https://github.com/2BAD/tvt#readme","bugs":{"url":"https://github.com/2BAD/tvt/issues"},"dist":{"shasum":"f838da51d29ec52fb4caf6af38fc5cbb2f2250a4","tarball":"https://registry.npmjs.org/@2bad/tvt/-/tvt-1.0.6.tgz","fileCount":36,"integrity":"sha512-mzaPxxFR9hazTXbFUS21zVUPYbfyzK2VjP3/nWgl+LZ3OtK/NdI/D/gsDvuwF0f1JZaUQs68Ww9uUeUQuCe2kA==","signatures":[{"sig":"MEQCIDdlx1+S7H8kne0FB3Knl2D1zJWhO0lV/C9zxS/il2CkAiAcpE7LsBI/YS6E9auFH+/Csuox4+uaBNxDpAeezZGRZA==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@2bad%2ftvt@1.0.6","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":7925072},"type":"module","types":"./build/device.d.ts","volta":{"npm":"10.8.3","node":"22.7.0"},"engines":{"node":">=20"},"exports":"./build/device.js","gitHead":"5bed06506f410631efed3ccb626a6ac10008b3f5","scripts":{"fix":"run-s fix:code fix:format","test":"vitest run","build":"run-p build:*","check":"run-p check:*","fix:ext":"tsfix","fix:code":"run-s 'check:eslint -- --fix'","prebuild":"rimraf build","build:swc":"swc ./source -d ./build --strip-leading-paths","fix:alias":"tsc-alias -p tsconfig.build.json","postbuild":"run-s fix:alias fix:ext","test:unit":"vitest run unit --coverage","fix:format":"biome format --write ./source","preversion":"run-s check test build","build:types":"tsc --project tsconfig.build.json","check:biome":"biome check ./source","check:eslint":"eslint . --report-unused-disable-directives --max-warnings 0","prepublishOnly":"run-s build","test:integration":"vitest run integration --coverage"},"_npmUser":{"name":"mrhyde","email":"npm@2bad.me"},"repository":{"url":"git+https://github.com/2BAD/tvt.git","type":"git"},"_npmVersion":"10.8.2","description":"This repository is the result of extensive research, disassembling, and reverse engineering efforts focused on CCTV cameras produced by Tongwei Video Technology Co., Ltd. (TVT). Our aim is to document and facilitate a deep understanding and interaction wi","directories":{},"_nodeVersion":"22.7.0","dependencies":{"debug":"4.3.6","koffi":"2.9.0","roarr":"7.21.1","easy-buffer":"1.2.0"},"_hasShrinkwrap":false,"packageManager":"npm@10.8.3","devDependencies":{"rimraf":"6.0.1","vitest":"2.0.5","@swc/cli":"0.4.0","@swc/core":"1.7.23","tsc-alias":"1.8.10","typescript":"5.5.4","@2bad/axiom":"1.0.0-beta.5","@2bad/tsfix":"0.1.0","@types/node":"22.5.3","@types/debug":"4.1.12","npm-run-all2":"6.2.2","@2bad/tsconfig":"3.0.1","@biomejs/biome":"1.8.3","@vitest/coverage-v8":"2.0.5","vite-tsconfig-paths":"5.0.1"},"_npmOperationalInternal":{"tmp":"tmp/tvt_1.0.6_1725435990861_0.8315085241442579","host":"s3://npm-registry-packages"}},"1.1.0":{"name":"@2bad/tvt","version":"1.1.0","keywords":["tvt","ipc","cctv"],"author":{"url":"https://github.com/2BAD","name":"2BAD"},"license":"MIT","_id":"@2bad/tvt@1.1.0","maintainers":[{"name":"mrhyde","email":"npm@2bad.me"},{"name":"armordarks","email":"npm@lavrins.com"}],"contributors":[{"url":"https://github.com/mrhyde","name":"Jason Hyde","email":"github@2bad.me"}],"homepage":"https://github.com/2BAD/tvt#readme","bugs":{"url":"https://github.com/2BAD/tvt/issues"},"dist":{"shasum":"6aa3bba8a4f1d4db1b49a95ef9ed3fb18e28e99f","tarball":"https://registry.npmjs.org/@2bad/tvt/-/tvt-1.1.0.tgz","fileCount":36,"integrity":"sha512-xPoMqRBl5fDCClzyhEuXU+z5DX4NfURgKgvFtTFlNsruUdqrFN6CbjFRKoAmcs5zxgUtcek66NzzhmNhlSXqsA==","signatures":[{"sig":"MEUCIHjzh/SHL1b1n5El43H300GyXmJbcESNJCh5hx/KrGsEAiEA3wnEs48WZXylp7U2VhZteswjjVVqC/kv/+XCHFtkU+E=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@2bad%2ftvt@1.1.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":7934938},"type":"module","types":"./build/device.d.ts","volta":{"npm":"10.9.0","node":"22.10.0"},"engines":{"node":">=20"},"exports":"./build/device.js","gitHead":"79cf5f3719ae0cfe0bd1a652acd162b500f665bd","scripts":{"fix":"run-s fix:code fix:format","test":"vitest run","build":"run-p build:*","check":"run-p check:*","fix:ext":"tsfix","fix:code":"run-s 'check:eslint -- --fix'","prebuild":"rimraf build","build:swc":"swc ./source -d ./build --strip-leading-paths","fix:alias":"tsc-alias -p tsconfig.build.json","postbuild":"run-s fix:alias fix:ext","test:unit":"vitest run unit --coverage","fix:format":"biome format --write ./source","preversion":"run-s check test build","build:types":"tsc --project tsconfig.build.json","check:biome":"biome check ./source","check:eslint":"eslint . --report-unused-disable-directives --max-warnings 0","prepublishOnly":"run-s build","test:integration":"vitest run integration --coverage"},"_npmUser":{"name":"mrhyde","email":"npm@2bad.me"},"repository":{"url":"git+https://github.com/2BAD/tvt.git","type":"git"},"_npmVersion":"10.9.0","description":"[![NPM version](https://img.shields.io/npm/v/@2bad/tvt)](https://www.npmjs.com/package/@2bad/tvt) [![License](https://img.shields.io/npm/l/@2bad/tvt)](https://opensource.org/license/MIT) [![GitHub Build Status](https://img.shields.io/github/actions/workfl","directories":{},"_nodeVersion":"22.10.0","dependencies":{"debug":"4.3.7","koffi":"2.9.1"},"_hasShrinkwrap":false,"packageManager":"npm@10.9.0","devDependencies":{"rimraf":"6.0.1","vitest":"2.1.3","@swc/cli":"0.4.0","@swc/core":"1.7.39","tsc-alias":"1.8.10","typescript":"5.6.3","@2bad/axiom":"1.0.0-beta.8","@2bad/tsfix":"0.1.0","@types/node":"22.7.8","@types/debug":"4.1.12","npm-run-all2":"7.0.0","@2bad/tsconfig":"3.0.1","@biomejs/biome":"1.9.4","@vitest/coverage-v8":"2.1.3","vite-tsconfig-paths":"5.0.1"},"_npmOperationalInternal":{"tmp":"tmp/tvt_1.1.0_1729627339189_0.8364660311450314","host":"s3://npm-registry-packages"}},"2.0.0":{"name":"@2bad/tvt","version":"2.0.0","keywords":["tvt","ipc","cctv"],"author":{"url":"https://github.com/2BAD","name":"2BAD"},"license":"MIT","_id":"@2bad/tvt@2.0.0","maintainers":[{"name":"mrhyde","email":"npm@2bad.me"},{"name":"armordarks","email":"npm@lavrins.com"}],"contributors":[{"url":"https://github.com/mrhyde","name":"Jason Hyde","email":"github@2bad.me"}],"homepage":"https://github.com/2BAD/tvt#readme","bugs":{"url":"https://github.com/2BAD/tvt/issues"},"dist":{"shasum":"8e8c3e8c14ea76d38d0a76ad6b3ad3ccd4e36744","tarball":"https://registry.npmjs.org/@2bad/tvt/-/tvt-2.0.0.tgz","fileCount":36,"integrity":"sha512-gcgyuosZjwMdl9DARFfYb3xfP3YZj8b3KZcXVpi96T9SVBqIy/CU2kKpc54Sx1NWWyBZwj4Jjn0PEzofpGmhkw==","signatures":[{"sig":"MEUCIQDjC7OmHU59jLW/HMXvTzfnxP7ZbFC4VaEYMv2FIddCLwIgbk4tobzkNd1VAaO+27ouHuN2RDSNmYtxX4ZXInZPd5c=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@2bad%2ftvt@2.0.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":7944888},"type":"module","types":"./build/device.d.ts","volta":{"npm":"10.9.0","node":"22.10.0"},"engines":{"node":">=20"},"exports":"./build/device.js","gitHead":"ea1fe9841c1644a882422a57e15abab4726ddaf9","scripts":{"fix":"run-s fix:code fix:format","test":"vitest run","build":"run-p build:*","check":"run-p check:*","fix:ext":"tsfix","fix:code":"run-s 'check:eslint -- --fix'","prebuild":"rimraf build","build:swc":"swc ./source -d ./build --strip-leading-paths","fix:alias":"tsc-alias -p tsconfig.build.json","postbuild":"run-s fix:alias fix:ext","test:unit":"vitest run unit --coverage","fix:format":"biome format --write ./source","preversion":"run-s check test build","build:types":"tsc --project tsconfig.build.json","check:biome":"biome check ./source","check:eslint":"eslint . --report-unused-disable-directives --max-warnings 0","prepublishOnly":"run-s build","test:integration":"vitest run integration --coverage"},"_npmUser":{"name":"mrhyde","email":"npm@2bad.me"},"repository":{"url":"git+https://github.com/2BAD/tvt.git","type":"git"},"_npmVersion":"10.9.0","description":"[![NPM version](https://img.shields.io/npm/v/@2bad/tvt)](https://www.npmjs.com/package/@2bad/tvt) [![License](https://img.shields.io/npm/l/@2bad/tvt)](https://opensource.org/license/MIT) [![GitHub Build Status](https://img.shields.io/github/actions/workfl","directories":{},"_nodeVersion":"22.10.0","dependencies":{"debug":"4.3.7","koffi":"2.9.1","p-series":"3.0.0"},"_hasShrinkwrap":false,"packageManager":"npm@10.9.0","devDependencies":{"rimraf":"6.0.1","vitest":"2.1.3","@swc/cli":"0.4.0","@swc/core":"1.7.39","tsc-alias":"1.8.10","typescript":"5.6.3","@2bad/axiom":"1.0.0-beta.8","@2bad/tsfix":"0.1.0","@types/node":"22.7.8","@types/debug":"4.1.12","npm-run-all2":"7.0.0","@2bad/tsconfig":"3.0.1","@biomejs/biome":"1.9.4","@vitest/coverage-v8":"2.1.3","vite-tsconfig-paths":"5.0.1"},"_npmOperationalInternal":{"tmp":"tmp/tvt_2.0.0_1729634759087_0.6653638104539876","host":"s3://npm-registry-packages"}},"2.1.0":{"name":"@2bad/tvt","version":"2.1.0","description":"TypeScript SDK for TVT and rebadged OEM CCTV devices: login, live H.264 streaming, snapshots, alarm monitoring, RTSP, and device control over the NET_SDK protocol","keywords":["tvt","ipc","cctv","nvr","dvr","ip-camera","surveillance","rtsp","net-sdk","live-stream","h264","snapshot","alarm","koffi","ffi"],"homepage":"https://github.com/2BAD/tvt#readme","bugs":{"url":"https://github.com/2BAD/tvt/issues"},"repository":{"type":"git","url":"git+https://github.com/2BAD/tvt.git"},"license":"MIT","author":"2BAD (https://github.com/2BAD)","contributors":[{"name":"Jason Hyde","email":"github@2bad.me","url":"https://github.com/mrhyde"}],"type":"module","exports":{".":{"import":{"types":"./build/device.d.ts","default":"./build/device.js"}}},"dependencies":{"debug":"4.4.3","koffi":"2.16.3","p-series":"3.0.0"},"devDependencies":{"@2bad/axiom":"2.1.0","@2bad/tsconfig":"4.0.0","@arethetypeswrong/cli":"0.18.5","@types/debug":"4.1.13","@types/node":"26.3.0","@vitest/coverage-v8":"4.1.11","npm-run-all2":"9.0.3","oxfmt":"0.65.0","oxlint":"1.80.0","publint":"0.3.24","tsdown":"0.22.14","typescript":"7.0.2","vitest":"4.1.11"},"engines":{"node":">=26"},"volta":{"node":"26.8.1","pnpm":"11.24.0"},"scripts":{"build":"tsdown","check":"run-p check:**","check:code":"oxlint ./source","check:format":"oxfmt --check ./source","check:types":"tsc --noEmit","fix":"run-p fix:**","fix:code":"oxlint --fix ./source","fix:format":"oxfmt ./source","preversion":"run-s check test build","test":"vitest run","test:integration":"vitest run integration --coverage","test:unit":"vitest run unit --coverage"},"_nodeVersion":"26.8.1","_id":"@2bad/tvt@2.1.0","dist":{"integrity":"sha512-gE/LW/gZKcr+si3/UQBufeE0VgoOpFfMoyy3trjkQAVCZDFPdyYOR0vGXvNTucznklX2IhSs5p0ucFDsICKM4g==","shasum":"4342e810b3ba8fa1b62e5c5de1c0f5fbd37f5b4c","tarball":"https://registry.npmjs.org/@2bad/tvt/-/tvt-2.1.0.tgz","fileCount":46,"unpackedSize":7992141,"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@2bad%2ftvt@2.1.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQCUxENn582Mj/iSwqJ5mCnW4dux/oKxtcEG5ZP8/DlASQIgP6mToShQwF5M8n7h2NCy4yAG2FPS5r2lTTcU5aafTKY="}]},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:2da79142-74a6-4c8f-bad8-70915c8812b3"}},"directories":{},"maintainers":[{"name":"mrhyde","email":"npm@2bad.me"},{"name":"armordarks","email":"npm@lavrins.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/tvt_2.1.0_1788050443021_0.8140975419486953"},"_hasShrinkwrap":false}},"time":{"created":"2024-05-28T08:21:06.397Z","modified":"2026-08-30T00:40:43.659Z","1.0.1":"2024-05-28T08:21:06.702Z","1.0.2":"2024-05-29T09:30:55.265Z","1.0.3":"2024-06-09T11:25:55.251Z","1.0.4":"2024-08-11T15:51:45.945Z","1.0.5":"2024-09-04T07:25:55.989Z","1.0.6":"2024-09-04T07:46:31.203Z","1.1.0":"2024-10-22T20:02:19.823Z","2.0.0":"2024-10-22T22:05:59.381Z","2.1.0":"2026-08-30T00:40:43.337Z"},"bugs":{"url":"https://github.com/2BAD/tvt/issues"},"author":"2BAD (https://github.com/2BAD)","license":"MIT","homepage":"https://github.com/2BAD/tvt#readme","keywords":["tvt","ipc","cctv","nvr","dvr","ip-camera","surveillance","rtsp","net-sdk","live-stream","h264","snapshot","alarm","koffi","ffi"],"repository":{"type":"git","url":"git+https://github.com/2BAD/tvt.git"},"description":"TypeScript SDK for TVT and rebadged OEM CCTV devices: login, live H.264 streaming, snapshots, alarm monitoring, RTSP, and device control over the NET_SDK protocol","contributors":[{"name":"Jason Hyde","email":"github@2bad.me","url":"https://github.com/mrhyde"}],"maintainers":[{"name":"mrhyde","email":"npm@2bad.me"},{"name":"armordarks","email":"npm@lavrins.com"}],"readme":"# TVT Device SDK\n\n[![NPM version](https://img.shields.io/npm/v/@2bad/tvt)](https://www.npmjs.com/package/@2bad/tvt)\n[![License](https://img.shields.io/npm/l/@2bad/tvt)](https://opensource.org/license/MIT)\n[![GitHub Build Status](https://img.shields.io/github/actions/workflow/status/2BAD/tvt/build.yml)](https://github.com/2BAD/tvt/actions/workflows/build.yml)\n[![Code coverage](https://img.shields.io/codecov/c/github/2BAD/tvt)](https://codecov.io/gh/2BAD/tvt)\n[![Written in TypeScript](https://img.shields.io/github/languages/top/2BAD/tvt)](https://www.typescriptlang.org/)\n\nTypeScript bindings for TVT (Tongwei Video Technology) CCTV devices: IP cameras, NVRs, DVRs. Talks the proprietary NET_SDK protocol through the vendor's `libdvrnetsdk.so` via [koffi](https://koffi.dev/) FFI. There's no usable English documentation, so this was built by disassembling the vendor SDK and reverse engineering the wire protocol from packet captures. The Wireshark dissectors from that work are in `proto/`.\n\nEverything is async. Native calls don't block the event loop, and callbacks from the SDK's own threads get marshalled back into JS properly.\n\n## Requirements\n\n- Linux x86_64\n- Node.js >= 26\n\nThe required `.so` files ship with the package under `bin/linux` and are loaded automatically. No system-wide installation, no `LD_LIBRARY_PATH` stuff.\n\n## Compatibility\n\nTVT is mostly a white-label manufacturer, so their hardware gets sold under a lot of other names. If a device answers on port 9008 or works with TVT's SuperLive/SuperCam apps, it's almost certainly a rebadged TVT and this SDK should talk to it.\n\nBrands known to sell rebadged TVT devices:\n\n- Digital Watchdog (some product lines)\n- Q-See\n- CP Plus\n- Provision-ISR\n- Avycon\n- TeleEye\n- NoVus\n- Meriva Security\n- InVid Tech\n- Alibi (Observint)\n- TecVoz\n- JFL Alarmes\n- Gazer\n- Questek\n- Technomate\n\nThe long tail is much bigger: pulling the OEM logo files out of TVT firmware turned up 79 brands ([IPVM has the list](https://ipvm.com/discussions/a-list-of-tvt-s-79-dvr-oems)). Most of these brands source from several manufacturers though, so not every product they sell is TVT. And GE's TruVision \"TVT-xxxx\" model numbers have nothing to do with TVT, that's just a product-line prefix.\n\n## Install\n\n```bash\nnpm install @2bad/tvt\n```\n\n## Quick start\n\n```typescript\nimport { Device } from '@2bad/tvt'\n\n// 9008 port for cameras, 6036 for NVRs\nconst device = await Device.create('192.168.1.100', 9008)\nawait device.login('admin', 'password')\n\nconst info = await device.getInfo()\nconsole.log(`${info.deviceName} (${info.deviceProduct}), ${info.videoInputNum} video inputs`)\n\nawait device.saveSnapshot(0, '/tmp/ch0.jpg')\n\nawait device.dispose()\n```\n\n`dispose()` stops any running streams and alarm monitoring, logs out, and releases the SDK. Call it exactly once, at the end.\n\n## Examples\n\nRunnable examples live in [`docs/examples`](docs/examples):\n\n- [Live streaming](docs/examples/live-streaming.md) - pull frames or record to an AVI\n- [Alarm monitoring](docs/examples/alarm-monitoring.md) - subscribe to the device's alarm events\n- [Recordings](docs/examples/recordings.md) - search and download recorded footage\n- [Playback](docs/examples/playback.md) - stream a recording with transport controls\n- [Snapshots](docs/examples/snapshots.md) - capture a JPEG to disk or memory\n- [RTSP](docs/examples/rtsp.md) - get an RTSP URL for ffmpeg or GStreamer\n- [Device control](docs/examples/device-control.md) - time, image, power, and version\n\n## API\n\n```typescript\nclass Device {\n  static create(ip: string, port?: number, settings?: Settings): Promise<Device>\n\n  login(user: string, pass: string): Promise<boolean>\n  logout(): Promise<boolean>\n  getInfo(): Promise<DeviceInfo>\n  get version(): VersionInfo\n\n  startLiveStream(channel?: number, streamType?: STREAM_TYPE): Promise<LiveStream>\n  saveSnapshot(channel: number, filePath: string): Promise<boolean>\n  captureSnapshot(channel?: number, bufferSize?: number): Promise<Buffer>\n  getRtspUrl(channel?: number, streamType?: STREAM_TYPE, options?: RtspUrlOptions): Promise<string>\n  getStreamCount(channel?: number): Promise<number>\n\n  searchRecordings(channel: number, start: Date, stop: Date): Promise<RecFile[]>\n  downloadRecording(\n    channel: number,\n    start: Date,\n    stop: Date,\n    filePath: string,\n    options?: { format?: RECORDING_FORMAT; streamType?: STREAM_TYPE; onProgress?: (percent: number) => void }\n  ): Promise<boolean>\n  startPlayback(channel: number, start: Date, stop: Date): Promise<PlaybackStream>\n\n  startAlarmMonitoring(onAlarm: AlarmCallback): Promise<boolean>\n  stopAlarmMonitoring(): Promise<boolean>\n  triggerAlarm(value: boolean): Promise<boolean>\n\n  getTime(): Promise<Date>\n  setTime(time?: Date): Promise<boolean>\n  getVideoEffect(channel?: number): Promise<VideoEffect>\n  setVideoEffect(channel: number, effect: VideoEffect): Promise<boolean>\n\n  reboot(): Promise<boolean>\n  shutdown(): Promise<boolean>\n\n  getLastError(): Promise<string>\n  dispose(): Promise<boolean>\n}\n\nclass LiveStream {\n  frames(): AsyncGenerator<LiveFrame>\n  recordTo(filePath: string): Promise<boolean>\n  stopRecording(): Promise<boolean>\n  stop(): Promise<boolean>\n  get stopped(): boolean\n}\n\nclass PlaybackStream {\n  frames(): AsyncGenerator<PlaybackFrame>\n  recordTo(filePath: string): Promise<boolean>\n  stopRecording(): Promise<boolean>\n  pause(): Promise<boolean>\n  resume(): Promise<boolean>\n  fastForward(): Promise<boolean>\n  rewind(): Promise<boolean>\n  frameStep(): Promise<boolean>\n  normalSpeed(): Promise<boolean>\n  stop(): Promise<boolean>\n  get stopped(): boolean\n}\n```\n\n`Settings` on `Device.create` controls the native connection behavior: `connectionTimeoutMs` (5000), `maxRetries` (3), `reconnectIntervalMs` (30000), `isReconnectEnabled` (true).\n\nEvery method except `create`, `login`, and `getLastError` requires a prior successful `login` and throws otherwise.\n\n### Error semantics\n\nMethods that return data (`getInfo`, `captureSnapshot`, `getTime`, `getRtspUrl`, `getVideoEffect`, `startLiveStream`, `searchRecordings`, `startPlayback`, `downloadRecording`, `login`) throw on failure with the decoded NET_SDK error name. Methods that perform an action (`saveSnapshot`, `triggerAlarm`, `setTime`, `logout`, ...) resolve `false` on failure. `getLastError()` returns the name of the most recent SDK error; the full table is exported as `NET_SDK_ERROR`.\n\n### Debug logging\n\nNamespaced under [debug](https://github.com/debug-js/debug):\n\n```bash\nDEBUG=tvt:* node app.js       # everything\nDEBUG=tvt:perf node app.js    # native call timings only\n```\n\n## Repository layout\n\n```\nbin/       vendor .so libraries (libdvrnetsdk.so and dependencies)\ndocs/\n  examples/       usage examples\n  vendor/         vendor SDK reference: NET_SDK manuals (PDF/CHM), C headers, demo sources\nproto/     Wireshark dissectors (Lua) for the wire protocol\nsource/    the TypeScript implementation\n  device.ts       Device class, public entry point\n  stream.ts       LiveStream\n  playback.ts     PlaybackStream\n  lib/sdk.ts      typed FFI layer over libdvrnetsdk.so\n  lib/struct/     koffi struct definitions mirroring the C headers\n```\n\n`proto/ipc.lua` dissects the device protocol in Wireshark. Useful if you're extending the bindings or poking at firmware behavior.\n\n## Development\n\n```bash\ngit clone https://github.com/2BAD/tvt.git\ncd tvt\npnpm install\npnpm build          # tsdown\npnpm check          # oxlint + oxfmt + tsc\npnpm test:unit      # vitest, no hardware needed\npnpm test:integration   # requires a real device on the network\n```\n\n## Migration from v1.x\n\nConstruction is now a factory and async: `new Device(ip)` becomes `await Device.create(ip)`. Every SDK call returns a Promise: `device.info` becomes `await device.getInfo()`.\n\n## License\n\nMIT. See [LICENSE](LICENSE).\n\n## Disclaimer\n\nNot affiliated with or endorsed by TVT Digital Technology Co., Ltd. This is an independent implementation built on reverse engineering. The vendor libraries in `bin/` are redistributed as-is. Point it only at devices you own or are authorized to manage.\n","readmeFilename":""}