diff --git a/common/package-lock.json b/common/package-lock.json index c810d903a..f9827f31b 100644 --- a/common/package-lock.json +++ b/common/package-lock.json @@ -10,7 +10,8 @@ "license": "ISC", "dependencies": { "@scrypted/sdk": "file:../sdk", - "typescript": "^4.4.3" + "typescript": "^4.4.3", + "werift": "^0.14.5" }, "devDependencies": { "@types/node": "^16.9.0" @@ -18,7 +19,7 @@ }, "../sdk": { "name": "@scrypted/sdk", - "version": "0.0.133", + "version": "0.0.144", "license": "ISC", "dependencies": { "@babel/plugin-proposal-class-properties": "^7.14.5", @@ -28,7 +29,6 @@ "@babel/plugin-transform-modules-commonjs": "^7.15.4", "@babel/plugin-transform-typescript": "^7.15.8", "@babel/preset-typescript": "^7.15.0", - "@types/node": "^16.11.1", "adm-zip": "^0.4.13", "axios": "^0.21.4", "babel-loader": "^8.2.3", @@ -37,11 +37,8 @@ "ncp": "^2.0.0", "raw-loader": "^4.0.2", "rimraf": "^3.0.2", - "stringify-object": "^3.3.0", "tmp": "^0.2.1", "ts-loader": "^9.2.6", - "typedoc": "^0.22.8", - "typescript-json-schema": "^0.50.1", "webpack": "^5.59.0" }, "bin": { @@ -53,20 +50,504 @@ "scrypted-webpack": "bin/scrypted-webpack.js" }, "devDependencies": { + "@types/node": "^16.11.1", "@types/stringify-object": "^4.0.0", - "ts-node": "^10.4.0" + "stringify-object": "^3.3.0", + "ts-node": "^10.4.0", + "typedoc": "^0.22.8", + "typescript-json-schema": "^0.50.1", + "webpack-bundle-analyzer": "^4.5.0" + } + }, + "node_modules/@fidm/asn1": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@fidm/asn1/-/asn1-1.0.4.tgz", + "integrity": "sha512-esd1jyNvRb2HVaQGq2Gg8Z0kbQPXzV9Tq5Z14KNIov6KfFD6PTaRIO8UpcsYiTNzOqJpmyzWgVTrUwFV3UF4TQ==", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@fidm/x509": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@fidm/x509/-/x509-1.2.1.tgz", + "integrity": "sha512-nwc2iesjyc9hkuzcrMCBXQRn653XuAUKorfWM8PZyJawiy1QzLj4vahwzaI25+pfpwOLvMzbJ0uKpWLDNmo16w==", + "dependencies": { + "@fidm/asn1": "^1.0.4", + "tweetnacl": "^1.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@minhducsun2002/leb128": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/@minhducsun2002/leb128/-/leb128-0.2.0.tgz", + "integrity": "sha512-XckPQO6CDP0LAg3ZHIBZcjIWXgdM5vGhwhixZU78UEwaXwc33LXPl1KfvV8jCyrdU2YzplCvaNK3Mm0MDh6t1Q==" + }, + "node_modules/@peculiar/asn1-cms": { + "version": "2.0.44", + "resolved": "https://registry.npmjs.org/@peculiar/asn1-cms/-/asn1-cms-2.0.44.tgz", + "integrity": "sha512-CzjCz8VZqG2jqRI/4YKCk3D9WS8V9cezt0tftWT5zmYxeZvAWOmtInj013zSooHEn1Oi65rzdDZ1m+wgascmiw==", + "dependencies": { + "@peculiar/asn1-schema": "^2.0.44", + "@peculiar/asn1-x509": "^2.0.44", + "@peculiar/asn1-x509-attr": "^2.0.44", + "asn1js": "^2.1.1", + "tslib": "^2.3.0" + } + }, + "node_modules/@peculiar/asn1-csr": { + "version": "2.0.44", + "resolved": "https://registry.npmjs.org/@peculiar/asn1-csr/-/asn1-csr-2.0.44.tgz", + "integrity": "sha512-9FG9ySzLyYIlk/W3o/mpE+ukn/XMokv+BysqyhNGifUet362slp+uF4XliKGLt53TO53uYCsQimVyTK4vwe/yg==", + "dependencies": { + "@peculiar/asn1-schema": "^2.0.44", + "@peculiar/asn1-x509": "^2.0.44", + "asn1js": "^2.1.1", + "tslib": "^2.3.0" + } + }, + "node_modules/@peculiar/asn1-ecc": { + "version": "2.0.44", + "resolved": "https://registry.npmjs.org/@peculiar/asn1-ecc/-/asn1-ecc-2.0.44.tgz", + "integrity": "sha512-GvfifE5xCZjEz9EsOl9gqTVgex9m7ATLloTaSE3Go+iG8bc7C/VDK8lOnFb3/UsCqfI46Gwh4Q3RQCP2JB3GDQ==", + "dependencies": { + "@peculiar/asn1-schema": "^2.0.44", + "@peculiar/asn1-x509": "^2.0.44", + "asn1js": "^2.1.1", + "tslib": "^2.3.0" + } + }, + "node_modules/@peculiar/asn1-pfx": { + "version": "2.0.44", + "resolved": "https://registry.npmjs.org/@peculiar/asn1-pfx/-/asn1-pfx-2.0.44.tgz", + "integrity": "sha512-rVsGoZWMtensS9+AEtU97cImHXEu+Oi6K31/EzzzdqfUx/aF49RYCVKOyuCjUg5cwIOE93WsNm0hQFYB2pYwVQ==", + "dependencies": { + "@peculiar/asn1-cms": "^2.0.44", + "@peculiar/asn1-pkcs8": "^2.0.44", + "@peculiar/asn1-rsa": "^2.0.44", + "@peculiar/asn1-schema": "^2.0.44", + "asn1js": "^2.1.1", + "tslib": "^2.3.0" + } + }, + "node_modules/@peculiar/asn1-pkcs8": { + "version": "2.0.44", + "resolved": "https://registry.npmjs.org/@peculiar/asn1-pkcs8/-/asn1-pkcs8-2.0.44.tgz", + "integrity": "sha512-cs/zGEv/6Jxx14tZ6NS82PNJFMCb4aFOiAFzv+I1I1ud7o5wyDGOOAIiIs4vI+Z6xtkoSyF+hWH51kRutdFV4A==", + "dependencies": { + "@peculiar/asn1-schema": "^2.0.44", + "@peculiar/asn1-x509": "^2.0.44", + "asn1js": "^2.1.1", + "tslib": "^2.3.0" + } + }, + "node_modules/@peculiar/asn1-pkcs9": { + "version": "2.0.44", + "resolved": "https://registry.npmjs.org/@peculiar/asn1-pkcs9/-/asn1-pkcs9-2.0.44.tgz", + "integrity": "sha512-b54VRWsM5NdIOlSuBbfBeximwVQIHcUoUdx10mHM6QuvZlXKciVP/nkerxg0ytQzC5BvPbohfYuiq46gYCPZSA==", + "dependencies": { + "@peculiar/asn1-cms": "^2.0.44", + "@peculiar/asn1-pfx": "^2.0.44", + "@peculiar/asn1-pkcs8": "^2.0.44", + "@peculiar/asn1-schema": "^2.0.44", + "@peculiar/asn1-x509": "^2.0.44", + "@peculiar/asn1-x509-attr": "^2.0.44", + "asn1js": "^2.1.1", + "tslib": "^2.3.0" + } + }, + "node_modules/@peculiar/asn1-rsa": { + "version": "2.0.44", + "resolved": "https://registry.npmjs.org/@peculiar/asn1-rsa/-/asn1-rsa-2.0.44.tgz", + "integrity": "sha512-DYfo33Yl3y4Bu8V0RrAhKBZJDy1ESEGQzKVl7DxCUJna164/U/JB767W9ze0Vlq7quTawUJLMX3RRfesEFGigA==", + "dependencies": { + "@peculiar/asn1-schema": "^2.0.44", + "@peculiar/asn1-x509": "^2.0.44", + "asn1js": "^2.1.1", + "tslib": "^2.3.0" + } + }, + "node_modules/@peculiar/asn1-schema": { + "version": "2.0.44", + "resolved": "https://registry.npmjs.org/@peculiar/asn1-schema/-/asn1-schema-2.0.44.tgz", + "integrity": "sha512-uaCnjQ9A9WwQSMuDJcNOCYEPXTahgKbFMvI7eMOMd8lXgx0J1eU7F3BoMsK5PFxa3dVUxjSQbaOjfgGoeHGgoQ==", + "dependencies": { + "@types/asn1js": "^2.0.2", + "asn1js": "^2.1.1", + "pvtsutils": "^1.2.1", + "tslib": "^2.3.0" + } + }, + "node_modules/@peculiar/asn1-x509": { + "version": "2.0.44", + "resolved": "https://registry.npmjs.org/@peculiar/asn1-x509/-/asn1-x509-2.0.44.tgz", + "integrity": "sha512-jKGy+7Ew1PADjzInblBaQWVdh9kTiy49lkTko/MiYg5lHyCi/N9xPtQCuincpY1UeNPwXaeoT2DXRJOuN6U/8A==", + "dependencies": { + "@peculiar/asn1-schema": "^2.0.44", + "asn1js": "^2.1.1", + "ipaddr.js": "^2.0.1", + "pvtsutils": "^1.2.1", + "tslib": "^2.3.0" + } + }, + "node_modules/@peculiar/asn1-x509-attr": { + "version": "2.0.44", + "resolved": "https://registry.npmjs.org/@peculiar/asn1-x509-attr/-/asn1-x509-attr-2.0.44.tgz", + "integrity": "sha512-mYyf1fMT1JVrmPInjqVC3O2Vm3LBm7sd75Mg2hKB0A/zPKIYZ5WRz396lliucHagg17PalMjDOxtIQFOqs1WGg==", + "dependencies": { + "@peculiar/asn1-schema": "^2.0.44", + "@peculiar/asn1-x509": "^2.0.44", + "asn1js": "^2.1.1", + "tslib": "^2.3.0" + } + }, + "node_modules/@peculiar/json-schema": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/@peculiar/json-schema/-/json-schema-1.1.12.tgz", + "integrity": "sha512-coUfuoMeIB7B8/NMekxaDzLhaYmp0HZNPEjYRm9goRou8UZIC3z21s0sL9AWoCw4EG876QyO3kYrc61WNF9B/w==", + "dependencies": { + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@peculiar/webcrypto": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@peculiar/webcrypto/-/webcrypto-1.2.3.tgz", + "integrity": "sha512-q7wDfZy3k/tpnsYB23/MyyDkjn6IdHh8w+xwoVMS5cu6CjVoFzngXDZEOOuSE4zus2yO6ciQhhHxd4XkLpwVnQ==", + "dependencies": { + "@peculiar/asn1-schema": "^2.0.44", + "@peculiar/json-schema": "^1.1.12", + "pvtsutils": "^1.2.1", + "tslib": "^2.3.1", + "webcrypto-core": "^1.4.0" + }, + "engines": { + "node": ">=10.12.0" + } + }, + "node_modules/@peculiar/x509": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/@peculiar/x509/-/x509-1.6.1.tgz", + "integrity": "sha512-C4oxpCuYasfjuhy6QRFJhs0R6gyeQSRsB7MsT6JkO3qaFi4b75mm8hNEKa+sIJPtTjXCC94tW9rHx1hw5dOvnQ==", + "dependencies": { + "@peculiar/asn1-cms": "^2.0.44", + "@peculiar/asn1-csr": "^2.0.44", + "@peculiar/asn1-ecc": "^2.0.44", + "@peculiar/asn1-pkcs9": "^2.0.44", + "@peculiar/asn1-rsa": "^2.0.44", + "@peculiar/asn1-schema": "^2.0.44", + "@peculiar/asn1-x509": "^2.0.44", + "pvtsutils": "^1.2.1", + "reflect-metadata": "^0.1.13", + "tslib": "^2.3.1", + "tsyringe": "^4.6.0" } }, "node_modules/@scrypted/sdk": { "resolved": "../sdk", "link": true }, + "node_modules/@shinyoshiaki/ebml-builder": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/@shinyoshiaki/ebml-builder/-/ebml-builder-0.0.1.tgz", + "integrity": "sha512-rz1LklnlZ0yvVIt924yRGu+R87Fhfa06BdRIZR6GF6SXVSBTD9wCQmN6opXQLuSkoKXleWJwF3PW1ls8DGZjtw==", + "dependencies": { + "lodash.memoize": "^4.1.2" + } + }, + "node_modules/@types/asn1js": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@types/asn1js/-/asn1js-2.0.2.tgz", + "integrity": "sha512-t4YHCgtD+ERvH0FyxvNlYwJ2ezhqw7t+Ygh4urQ7dJER8i185JPv6oIM3ey5YQmGN6Zp9EMbpohkjZi9t3UxwA==" + }, "node_modules/@types/node": { "version": "16.9.0", "resolved": "https://registry.npmjs.org/@types/node/-/node-16.9.0.tgz", "integrity": "sha512-nmP+VR4oT0pJUPFbKE4SXj3Yb4Q/kz3M9dSAO1GGMebRKWHQxLfDNmU/yh3xxCJha3N60nQ/JwXWwOE/ZSEVag==", "dev": true }, + "node_modules/aes-js": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/aes-js/-/aes-js-3.1.2.tgz", + "integrity": "sha512-e5pEa2kBnBOgR4Y/p20pskXI74UEz7de8ZGVo58asOtvSVG5YAbJeELPZxOmt+Bnz3rX753YKhfIn4X4l1PPRQ==" + }, + "node_modules/asn1js": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/asn1js/-/asn1js-2.2.0.tgz", + "integrity": "sha512-oagLNqpfNv7CvmyMoexMDNyVDSiq1rya0AEUgcLlNHdHgNl6U/hi8xY370n5y+ZIFEXOx0J4B1qF2NDjMRxklA==", + "dependencies": { + "pvutils": "latest" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/big-integer": { + "version": "1.6.51", + "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.51.tgz", + "integrity": "sha512-GPEid2Y9QU1Exl1rpO9B2IPJGHPSupF5GnVIP0blYvNOMer2bTvSWs1jGOUg04hTmu67nmLsQ9TBo1puaotBHg==", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/binary-data": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/binary-data/-/binary-data-0.6.0.tgz", + "integrity": "sha512-HGiT0ir03tS1u7iWdW5xjJfbPpvxH2qJbPFxXW0I3P5iOzkbjN/cJy5GlpAwmjHW5CiayGOxZ/ytLzXmYgdgqQ==", + "dependencies": { + "generate-function": "^2.3.1", + "is-plain-object": "^2.0.3" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" + }, + "node_modules/brorand": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", + "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=" + }, + "node_modules/buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=", + "engines": { + "node": "*" + } + }, + "node_modules/date-fns": { + "version": "2.28.0", + "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.28.0.tgz", + "integrity": "sha512-8d35hViGYx/QH0icHYCeLmsLmMUheMmTyV9Fcm6gvNwdw31yXXH+O85sOBJ+OLnLQMKZowvpKb6FgMIQjcpvQw==", + "engines": { + "node": ">=0.11" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/date-fns" + } + }, + "node_modules/debug": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", + "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/elliptic": { + "version": "6.5.4", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz", + "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==", + "dependencies": { + "bn.js": "^4.11.9", + "brorand": "^1.1.0", + "hash.js": "^1.0.0", + "hmac-drbg": "^1.0.1", + "inherits": "^2.0.4", + "minimalistic-assert": "^1.0.1", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "node_modules/generate-function": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.3.1.tgz", + "integrity": "sha512-eeB5GfMNeevm/GRYq20ShmsaGcmI81kIX2K9XQx5miC8KdHaC6Jm0qQ8ZNeGOi7wYB8OsdxKs+Y2oVuTFuVwKQ==", + "dependencies": { + "is-property": "^1.0.2" + } + }, + "node_modules/hash.js": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", + "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", + "dependencies": { + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.1" + } + }, + "node_modules/hmac-drbg": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", + "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", + "dependencies": { + "hash.js": "^1.0.3", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "node_modules/int64-buffer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/int64-buffer/-/int64-buffer-1.0.1.tgz", + "integrity": "sha512-+3azY4pXrjAupJHU1V9uGERWlhoqNswJNji6aD/02xac7oxol508AsMC5lxKhEqyZeDFy3enq5OGWXF4u75hiw==", + "engines": { + "node": ">= 4.5.0" + } + }, + "node_modules/ip": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", + "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=" + }, + "node_modules/ipaddr.js": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.0.1.tgz", + "integrity": "sha512-1qTgH9NG+IIJ4yfKs2e6Pp1bZg8wbDbKHT21HrLIeYBTRLgMYKnMTPAuI3Lcs61nfx5h1xlXnbJtH1kX5/d/ng==", + "engines": { + "node": ">= 10" + } + }, + "node_modules/is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-property": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz", + "integrity": "sha1-V/4cTkhHTt1lsJkR8msc1Ald2oQ=" + }, + "node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/jspack": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/jspack/-/jspack-0.0.4.tgz", + "integrity": "sha1-Mt01x/3LPjRWwY+7fvntC8YjgXc=" + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + }, + "node_modules/lodash.memoize": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", + "integrity": "sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=" + }, + "node_modules/minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==" + }, + "node_modules/minimalistic-crypto-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", + "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=" + }, + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/nano-time": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/nano-time/-/nano-time-1.0.0.tgz", + "integrity": "sha1-sFVPaa2J4i0JB/ehKwmTpdlhN+8=", + "dependencies": { + "big-integer": "^1.6.16" + } + }, + "node_modules/p-cancelable": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-2.1.1.tgz", + "integrity": "sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/pvtsutils": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/pvtsutils/-/pvtsutils-1.2.1.tgz", + "integrity": "sha512-Q867jEr30lBR2YSFFLZ0/XsEvpweqH6Kj096wmlRAFXrdRGPCNq2iz9B5Tk085EZ+OBZyYAVA5UhPkjSHGrUzQ==", + "dependencies": { + "tslib": "^2.3.1" + } + }, + "node_modules/pvutils": { + "version": "1.0.17", + "resolved": "https://registry.npmjs.org/pvutils/-/pvutils-1.0.17.tgz", + "integrity": "sha512-wLHYUQxWaXVQvKnwIDWFVKDJku9XDCvyhhxoq8dc5MFdIlRenyPI9eSfEtcvgHgD7FlvCyGAlWgOzRnZD99GZQ==", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/reflect-metadata": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.13.tgz", + "integrity": "sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg==" + }, + "node_modules/rx.mini": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/rx.mini/-/rx.mini-1.1.0.tgz", + "integrity": "sha512-SgejtK4cAYpORQeIfwY8DWkanwhi8DAmlJKaUjmcPjNlq6OLBix0qVTYtj2aXxh7tsvO34hd4PQpP263ZrcwYg==" + }, + "node_modules/tslib": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", + "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==" + }, + "node_modules/tsyringe": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/tsyringe/-/tsyringe-4.6.0.tgz", + "integrity": "sha512-BMQAZamSfEmIQzH8WJeRu1yZGQbPSDuI9g+yEiKZFIcO46GPZuMOC2d0b52cVBdw1d++06JnDSIIZvEnogMdAw==", + "dependencies": { + "tslib": "^1.9.3" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/tsyringe/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + }, + "node_modules/turbo-crc32": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/turbo-crc32/-/turbo-crc32-1.0.1.tgz", + "integrity": "sha512-8yyRd1ZdNp+AQLGqi3lTaA2k81JjlIZOyFQEsi7GQWBgirnQOxjqVtDEbYHM2Z4yFdJ5AQw0fxBLLnDCl6RXoQ==", + "engines": { + "node": ">=6" + } + }, + "node_modules/tweetnacl": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-1.0.3.tgz", + "integrity": "sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw==" + }, "node_modules/typescript": { "version": "4.4.3", "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.4.3.tgz", @@ -78,9 +559,235 @@ "engines": { "node": ">=4.2.0" } + }, + "node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/webcrypto-core": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/webcrypto-core/-/webcrypto-core-1.4.0.tgz", + "integrity": "sha512-HY3Zo0GcRIQUUDnlZ/shGjN+4f7LVMkdJZoGPog+oHhJsJdMz6iM8Za5xZ0t6qg7Fx/JXXz+oBv2J2p982hGTQ==", + "dependencies": { + "@peculiar/asn1-schema": "^2.0.44", + "@peculiar/json-schema": "^1.1.12", + "asn1js": "^2.1.1", + "pvtsutils": "^1.2.0", + "tslib": "^2.3.1" + } + }, + "node_modules/werift": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/werift/-/werift-0.14.5.tgz", + "integrity": "sha512-aUAMUJc3WKXqiXn7Qgs4xSj2dDHdPCDQ+keQieoOrBVtZP0T6icWR1i6Vom+ZAO4RQE2lR3kz3cTd4M8DT2opw==", + "dependencies": { + "@fidm/x509": "^1.2.1", + "@minhducsun2002/leb128": "^0.2.0", + "@peculiar/webcrypto": "^1.1.6", + "@peculiar/x509": "^1.2.2", + "@shinyoshiaki/ebml-builder": "^0.0.1", + "aes-js": "^3.1.2", + "binary-data": "^0.6.0", + "buffer-crc32": "^0.2.13", + "date-fns": "^2.27.0", + "debug": "^4.3.3", + "elliptic": "^6.5.3", + "int64-buffer": "^1.0.1", + "ip": "^1.1.5", + "jspack": "^0.0.4", + "lodash": "^4.17.20", + "nano-time": "^1.0.0", + "p-cancelable": "^2.1.1", + "rx.mini": "^1.1.0", + "turbo-crc32": "^1.0.1", + "tweetnacl": "^1.0.3", + "uuid": "^8.3.2" + }, + "engines": { + "node": ">=15" + } } }, "dependencies": { + "@fidm/asn1": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@fidm/asn1/-/asn1-1.0.4.tgz", + "integrity": "sha512-esd1jyNvRb2HVaQGq2Gg8Z0kbQPXzV9Tq5Z14KNIov6KfFD6PTaRIO8UpcsYiTNzOqJpmyzWgVTrUwFV3UF4TQ==" + }, + "@fidm/x509": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@fidm/x509/-/x509-1.2.1.tgz", + "integrity": "sha512-nwc2iesjyc9hkuzcrMCBXQRn653XuAUKorfWM8PZyJawiy1QzLj4vahwzaI25+pfpwOLvMzbJ0uKpWLDNmo16w==", + "requires": { + "@fidm/asn1": "^1.0.4", + "tweetnacl": "^1.0.1" + } + }, + "@minhducsun2002/leb128": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/@minhducsun2002/leb128/-/leb128-0.2.0.tgz", + "integrity": "sha512-XckPQO6CDP0LAg3ZHIBZcjIWXgdM5vGhwhixZU78UEwaXwc33LXPl1KfvV8jCyrdU2YzplCvaNK3Mm0MDh6t1Q==" + }, + "@peculiar/asn1-cms": { + "version": "2.0.44", + "resolved": "https://registry.npmjs.org/@peculiar/asn1-cms/-/asn1-cms-2.0.44.tgz", + "integrity": "sha512-CzjCz8VZqG2jqRI/4YKCk3D9WS8V9cezt0tftWT5zmYxeZvAWOmtInj013zSooHEn1Oi65rzdDZ1m+wgascmiw==", + "requires": { + "@peculiar/asn1-schema": "^2.0.44", + "@peculiar/asn1-x509": "^2.0.44", + "@peculiar/asn1-x509-attr": "^2.0.44", + "asn1js": "^2.1.1", + "tslib": "^2.3.0" + } + }, + "@peculiar/asn1-csr": { + "version": "2.0.44", + "resolved": "https://registry.npmjs.org/@peculiar/asn1-csr/-/asn1-csr-2.0.44.tgz", + "integrity": "sha512-9FG9ySzLyYIlk/W3o/mpE+ukn/XMokv+BysqyhNGifUet362slp+uF4XliKGLt53TO53uYCsQimVyTK4vwe/yg==", + "requires": { + "@peculiar/asn1-schema": "^2.0.44", + "@peculiar/asn1-x509": "^2.0.44", + "asn1js": "^2.1.1", + "tslib": "^2.3.0" + } + }, + "@peculiar/asn1-ecc": { + "version": "2.0.44", + "resolved": "https://registry.npmjs.org/@peculiar/asn1-ecc/-/asn1-ecc-2.0.44.tgz", + "integrity": "sha512-GvfifE5xCZjEz9EsOl9gqTVgex9m7ATLloTaSE3Go+iG8bc7C/VDK8lOnFb3/UsCqfI46Gwh4Q3RQCP2JB3GDQ==", + "requires": { + "@peculiar/asn1-schema": "^2.0.44", + "@peculiar/asn1-x509": "^2.0.44", + "asn1js": "^2.1.1", + "tslib": "^2.3.0" + } + }, + "@peculiar/asn1-pfx": { + "version": "2.0.44", + "resolved": "https://registry.npmjs.org/@peculiar/asn1-pfx/-/asn1-pfx-2.0.44.tgz", + "integrity": "sha512-rVsGoZWMtensS9+AEtU97cImHXEu+Oi6K31/EzzzdqfUx/aF49RYCVKOyuCjUg5cwIOE93WsNm0hQFYB2pYwVQ==", + "requires": { + "@peculiar/asn1-cms": "^2.0.44", + "@peculiar/asn1-pkcs8": "^2.0.44", + "@peculiar/asn1-rsa": "^2.0.44", + "@peculiar/asn1-schema": "^2.0.44", + "asn1js": "^2.1.1", + "tslib": "^2.3.0" + } + }, + "@peculiar/asn1-pkcs8": { + "version": "2.0.44", + "resolved": "https://registry.npmjs.org/@peculiar/asn1-pkcs8/-/asn1-pkcs8-2.0.44.tgz", + "integrity": "sha512-cs/zGEv/6Jxx14tZ6NS82PNJFMCb4aFOiAFzv+I1I1ud7o5wyDGOOAIiIs4vI+Z6xtkoSyF+hWH51kRutdFV4A==", + "requires": { + "@peculiar/asn1-schema": "^2.0.44", + "@peculiar/asn1-x509": "^2.0.44", + "asn1js": "^2.1.1", + "tslib": "^2.3.0" + } + }, + "@peculiar/asn1-pkcs9": { + "version": "2.0.44", + "resolved": "https://registry.npmjs.org/@peculiar/asn1-pkcs9/-/asn1-pkcs9-2.0.44.tgz", + "integrity": "sha512-b54VRWsM5NdIOlSuBbfBeximwVQIHcUoUdx10mHM6QuvZlXKciVP/nkerxg0ytQzC5BvPbohfYuiq46gYCPZSA==", + "requires": { + "@peculiar/asn1-cms": "^2.0.44", + "@peculiar/asn1-pfx": "^2.0.44", + "@peculiar/asn1-pkcs8": "^2.0.44", + "@peculiar/asn1-schema": "^2.0.44", + "@peculiar/asn1-x509": "^2.0.44", + "@peculiar/asn1-x509-attr": "^2.0.44", + "asn1js": "^2.1.1", + "tslib": "^2.3.0" + } + }, + "@peculiar/asn1-rsa": { + "version": "2.0.44", + "resolved": "https://registry.npmjs.org/@peculiar/asn1-rsa/-/asn1-rsa-2.0.44.tgz", + "integrity": "sha512-DYfo33Yl3y4Bu8V0RrAhKBZJDy1ESEGQzKVl7DxCUJna164/U/JB767W9ze0Vlq7quTawUJLMX3RRfesEFGigA==", + "requires": { + "@peculiar/asn1-schema": "^2.0.44", + "@peculiar/asn1-x509": "^2.0.44", + "asn1js": "^2.1.1", + "tslib": "^2.3.0" + } + }, + "@peculiar/asn1-schema": { + "version": "2.0.44", + "resolved": "https://registry.npmjs.org/@peculiar/asn1-schema/-/asn1-schema-2.0.44.tgz", + "integrity": "sha512-uaCnjQ9A9WwQSMuDJcNOCYEPXTahgKbFMvI7eMOMd8lXgx0J1eU7F3BoMsK5PFxa3dVUxjSQbaOjfgGoeHGgoQ==", + "requires": { + "@types/asn1js": "^2.0.2", + "asn1js": "^2.1.1", + "pvtsutils": "^1.2.1", + "tslib": "^2.3.0" + } + }, + "@peculiar/asn1-x509": { + "version": "2.0.44", + "resolved": "https://registry.npmjs.org/@peculiar/asn1-x509/-/asn1-x509-2.0.44.tgz", + "integrity": "sha512-jKGy+7Ew1PADjzInblBaQWVdh9kTiy49lkTko/MiYg5lHyCi/N9xPtQCuincpY1UeNPwXaeoT2DXRJOuN6U/8A==", + "requires": { + "@peculiar/asn1-schema": "^2.0.44", + "asn1js": "^2.1.1", + "ipaddr.js": "^2.0.1", + "pvtsutils": "^1.2.1", + "tslib": "^2.3.0" + } + }, + "@peculiar/asn1-x509-attr": { + "version": "2.0.44", + "resolved": "https://registry.npmjs.org/@peculiar/asn1-x509-attr/-/asn1-x509-attr-2.0.44.tgz", + "integrity": "sha512-mYyf1fMT1JVrmPInjqVC3O2Vm3LBm7sd75Mg2hKB0A/zPKIYZ5WRz396lliucHagg17PalMjDOxtIQFOqs1WGg==", + "requires": { + "@peculiar/asn1-schema": "^2.0.44", + "@peculiar/asn1-x509": "^2.0.44", + "asn1js": "^2.1.1", + "tslib": "^2.3.0" + } + }, + "@peculiar/json-schema": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/@peculiar/json-schema/-/json-schema-1.1.12.tgz", + "integrity": "sha512-coUfuoMeIB7B8/NMekxaDzLhaYmp0HZNPEjYRm9goRou8UZIC3z21s0sL9AWoCw4EG876QyO3kYrc61WNF9B/w==", + "requires": { + "tslib": "^2.0.0" + } + }, + "@peculiar/webcrypto": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@peculiar/webcrypto/-/webcrypto-1.2.3.tgz", + "integrity": "sha512-q7wDfZy3k/tpnsYB23/MyyDkjn6IdHh8w+xwoVMS5cu6CjVoFzngXDZEOOuSE4zus2yO6ciQhhHxd4XkLpwVnQ==", + "requires": { + "@peculiar/asn1-schema": "^2.0.44", + "@peculiar/json-schema": "^1.1.12", + "pvtsutils": "^1.2.1", + "tslib": "^2.3.1", + "webcrypto-core": "^1.4.0" + } + }, + "@peculiar/x509": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/@peculiar/x509/-/x509-1.6.1.tgz", + "integrity": "sha512-C4oxpCuYasfjuhy6QRFJhs0R6gyeQSRsB7MsT6JkO3qaFi4b75mm8hNEKa+sIJPtTjXCC94tW9rHx1hw5dOvnQ==", + "requires": { + "@peculiar/asn1-cms": "^2.0.44", + "@peculiar/asn1-csr": "^2.0.44", + "@peculiar/asn1-ecc": "^2.0.44", + "@peculiar/asn1-pkcs9": "^2.0.44", + "@peculiar/asn1-rsa": "^2.0.44", + "@peculiar/asn1-schema": "^2.0.44", + "@peculiar/asn1-x509": "^2.0.44", + "pvtsutils": "^1.2.1", + "reflect-metadata": "^0.1.13", + "tslib": "^2.3.1", + "tsyringe": "^4.6.0" + } + }, "@scrypted/sdk": { "version": "file:../sdk", "requires": { @@ -107,19 +814,308 @@ "ts-node": "^10.4.0", "typedoc": "^0.22.8", "typescript-json-schema": "^0.50.1", - "webpack": "^5.59.0" + "webpack": "^5.59.0", + "webpack-bundle-analyzer": "^4.5.0" } }, + "@shinyoshiaki/ebml-builder": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/@shinyoshiaki/ebml-builder/-/ebml-builder-0.0.1.tgz", + "integrity": "sha512-rz1LklnlZ0yvVIt924yRGu+R87Fhfa06BdRIZR6GF6SXVSBTD9wCQmN6opXQLuSkoKXleWJwF3PW1ls8DGZjtw==", + "requires": { + "lodash.memoize": "^4.1.2" + } + }, + "@types/asn1js": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@types/asn1js/-/asn1js-2.0.2.tgz", + "integrity": "sha512-t4YHCgtD+ERvH0FyxvNlYwJ2ezhqw7t+Ygh4urQ7dJER8i185JPv6oIM3ey5YQmGN6Zp9EMbpohkjZi9t3UxwA==" + }, "@types/node": { "version": "16.9.0", "resolved": "https://registry.npmjs.org/@types/node/-/node-16.9.0.tgz", "integrity": "sha512-nmP+VR4oT0pJUPFbKE4SXj3Yb4Q/kz3M9dSAO1GGMebRKWHQxLfDNmU/yh3xxCJha3N60nQ/JwXWwOE/ZSEVag==", "dev": true }, + "aes-js": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/aes-js/-/aes-js-3.1.2.tgz", + "integrity": "sha512-e5pEa2kBnBOgR4Y/p20pskXI74UEz7de8ZGVo58asOtvSVG5YAbJeELPZxOmt+Bnz3rX753YKhfIn4X4l1PPRQ==" + }, + "asn1js": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/asn1js/-/asn1js-2.2.0.tgz", + "integrity": "sha512-oagLNqpfNv7CvmyMoexMDNyVDSiq1rya0AEUgcLlNHdHgNl6U/hi8xY370n5y+ZIFEXOx0J4B1qF2NDjMRxklA==", + "requires": { + "pvutils": "latest" + } + }, + "big-integer": { + "version": "1.6.51", + "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.51.tgz", + "integrity": "sha512-GPEid2Y9QU1Exl1rpO9B2IPJGHPSupF5GnVIP0blYvNOMer2bTvSWs1jGOUg04hTmu67nmLsQ9TBo1puaotBHg==" + }, + "binary-data": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/binary-data/-/binary-data-0.6.0.tgz", + "integrity": "sha512-HGiT0ir03tS1u7iWdW5xjJfbPpvxH2qJbPFxXW0I3P5iOzkbjN/cJy5GlpAwmjHW5CiayGOxZ/ytLzXmYgdgqQ==", + "requires": { + "generate-function": "^2.3.1", + "is-plain-object": "^2.0.3" + } + }, + "bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" + }, + "brorand": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", + "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=" + }, + "buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=" + }, + "date-fns": { + "version": "2.28.0", + "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.28.0.tgz", + "integrity": "sha512-8d35hViGYx/QH0icHYCeLmsLmMUheMmTyV9Fcm6gvNwdw31yXXH+O85sOBJ+OLnLQMKZowvpKb6FgMIQjcpvQw==" + }, + "debug": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", + "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", + "requires": { + "ms": "2.1.2" + } + }, + "elliptic": { + "version": "6.5.4", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz", + "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==", + "requires": { + "bn.js": "^4.11.9", + "brorand": "^1.1.0", + "hash.js": "^1.0.0", + "hmac-drbg": "^1.0.1", + "inherits": "^2.0.4", + "minimalistic-assert": "^1.0.1", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "generate-function": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.3.1.tgz", + "integrity": "sha512-eeB5GfMNeevm/GRYq20ShmsaGcmI81kIX2K9XQx5miC8KdHaC6Jm0qQ8ZNeGOi7wYB8OsdxKs+Y2oVuTFuVwKQ==", + "requires": { + "is-property": "^1.0.2" + } + }, + "hash.js": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", + "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", + "requires": { + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.1" + } + }, + "hmac-drbg": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", + "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", + "requires": { + "hash.js": "^1.0.3", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "int64-buffer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/int64-buffer/-/int64-buffer-1.0.1.tgz", + "integrity": "sha512-+3azY4pXrjAupJHU1V9uGERWlhoqNswJNji6aD/02xac7oxol508AsMC5lxKhEqyZeDFy3enq5OGWXF4u75hiw==" + }, + "ip": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", + "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=" + }, + "ipaddr.js": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.0.1.tgz", + "integrity": "sha512-1qTgH9NG+IIJ4yfKs2e6Pp1bZg8wbDbKHT21HrLIeYBTRLgMYKnMTPAuI3Lcs61nfx5h1xlXnbJtH1kX5/d/ng==" + }, + "is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "requires": { + "isobject": "^3.0.1" + } + }, + "is-property": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz", + "integrity": "sha1-V/4cTkhHTt1lsJkR8msc1Ald2oQ=" + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=" + }, + "jspack": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/jspack/-/jspack-0.0.4.tgz", + "integrity": "sha1-Mt01x/3LPjRWwY+7fvntC8YjgXc=" + }, + "lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + }, + "lodash.memoize": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", + "integrity": "sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=" + }, + "minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==" + }, + "minimalistic-crypto-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", + "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=" + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "nano-time": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/nano-time/-/nano-time-1.0.0.tgz", + "integrity": "sha1-sFVPaa2J4i0JB/ehKwmTpdlhN+8=", + "requires": { + "big-integer": "^1.6.16" + } + }, + "p-cancelable": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-2.1.1.tgz", + "integrity": "sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==" + }, + "pvtsutils": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/pvtsutils/-/pvtsutils-1.2.1.tgz", + "integrity": "sha512-Q867jEr30lBR2YSFFLZ0/XsEvpweqH6Kj096wmlRAFXrdRGPCNq2iz9B5Tk085EZ+OBZyYAVA5UhPkjSHGrUzQ==", + "requires": { + "tslib": "^2.3.1" + } + }, + "pvutils": { + "version": "1.0.17", + "resolved": "https://registry.npmjs.org/pvutils/-/pvutils-1.0.17.tgz", + "integrity": "sha512-wLHYUQxWaXVQvKnwIDWFVKDJku9XDCvyhhxoq8dc5MFdIlRenyPI9eSfEtcvgHgD7FlvCyGAlWgOzRnZD99GZQ==" + }, + "reflect-metadata": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.13.tgz", + "integrity": "sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg==" + }, + "rx.mini": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/rx.mini/-/rx.mini-1.1.0.tgz", + "integrity": "sha512-SgejtK4cAYpORQeIfwY8DWkanwhi8DAmlJKaUjmcPjNlq6OLBix0qVTYtj2aXxh7tsvO34hd4PQpP263ZrcwYg==" + }, + "tslib": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", + "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==" + }, + "tsyringe": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/tsyringe/-/tsyringe-4.6.0.tgz", + "integrity": "sha512-BMQAZamSfEmIQzH8WJeRu1yZGQbPSDuI9g+yEiKZFIcO46GPZuMOC2d0b52cVBdw1d++06JnDSIIZvEnogMdAw==", + "requires": { + "tslib": "^1.9.3" + }, + "dependencies": { + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + } + } + }, + "turbo-crc32": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/turbo-crc32/-/turbo-crc32-1.0.1.tgz", + "integrity": "sha512-8yyRd1ZdNp+AQLGqi3lTaA2k81JjlIZOyFQEsi7GQWBgirnQOxjqVtDEbYHM2Z4yFdJ5AQw0fxBLLnDCl6RXoQ==" + }, + "tweetnacl": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-1.0.3.tgz", + "integrity": "sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw==" + }, "typescript": { "version": "4.4.3", "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.4.3.tgz", "integrity": "sha512-4xfscpisVgqqDfPaJo5vkd+Qd/ItkoagnHpufr+i2QCHBsNYp+G7UAoyFl8aPtx879u38wPV65rZ8qbGZijalA==" + }, + "uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==" + }, + "webcrypto-core": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/webcrypto-core/-/webcrypto-core-1.4.0.tgz", + "integrity": "sha512-HY3Zo0GcRIQUUDnlZ/shGjN+4f7LVMkdJZoGPog+oHhJsJdMz6iM8Za5xZ0t6qg7Fx/JXXz+oBv2J2p982hGTQ==", + "requires": { + "@peculiar/asn1-schema": "^2.0.44", + "@peculiar/json-schema": "^1.1.12", + "asn1js": "^2.1.1", + "pvtsutils": "^1.2.0", + "tslib": "^2.3.1" + } + }, + "werift": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/werift/-/werift-0.14.5.tgz", + "integrity": "sha512-aUAMUJc3WKXqiXn7Qgs4xSj2dDHdPCDQ+keQieoOrBVtZP0T6icWR1i6Vom+ZAO4RQE2lR3kz3cTd4M8DT2opw==", + "requires": { + "@fidm/x509": "^1.2.1", + "@minhducsun2002/leb128": "^0.2.0", + "@peculiar/webcrypto": "^1.1.6", + "@peculiar/x509": "^1.2.2", + "@shinyoshiaki/ebml-builder": "^0.0.1", + "aes-js": "^3.1.2", + "binary-data": "^0.6.0", + "buffer-crc32": "^0.2.13", + "date-fns": "^2.27.0", + "debug": "^4.3.3", + "elliptic": "^6.5.3", + "int64-buffer": "^1.0.1", + "ip": "^1.1.5", + "jspack": "^0.0.4", + "lodash": "^4.17.20", + "nano-time": "^1.0.0", + "p-cancelable": "^2.1.1", + "rx.mini": "^1.1.0", + "turbo-crc32": "^1.0.1", + "tweetnacl": "^1.0.3", + "uuid": "^8.3.2" + } } } } diff --git a/common/package.json b/common/package.json index 6123491db..0a9f0a032 100644 --- a/common/package.json +++ b/common/package.json @@ -10,7 +10,8 @@ "license": "ISC", "dependencies": { "@scrypted/sdk": "file:../sdk", - "typescript": "^4.4.3" + "typescript": "^4.4.3", + "werift": "^0.14.5" }, "devDependencies": { "@types/node": "^16.9.0" diff --git a/common/src/wrtc-convertors.ts b/common/src/wrtc-convertors.ts index f542ff3b1..89370fa05 100644 --- a/common/src/wrtc-convertors.ts +++ b/common/src/wrtc-convertors.ts @@ -1,303 +1,409 @@ import { RTCAVMessage, FFMpegInput, MediaManager, ScryptedMimeTypes } from "@scrypted/sdk/types"; import child_process from 'child_process'; import net from 'net'; -import { listenZero } from "./listen-cluster"; +import { listenZero, listenZeroSingleClient } from "./listen-cluster"; import { ffmpegLogInitialOutput } from "./media-helpers"; let wrtc: any; function initalizeWebRtc() { - if (wrtc) - return; - try { - wrtc = require('wrtc'); - } - catch (e) { - console.warn('loading wrtc failed. trying @koush/wrtc fallback.'); - wrtc = require('@koush/wrtc'); - } + if (wrtc) + return; + try { + wrtc = require('wrtc'); + } + catch (e) { + console.warn('loading wrtc failed. trying @koush/wrtc fallback.'); + wrtc = require('@koush/wrtc'); + } - Object.assign(global, wrtc); + Object.assign(global, wrtc); } interface RTCSession { - pc: RTCPeerConnection; - pendingCandidates: RTCIceCandidate[]; - resolve?: (value: any) => void; + pc: RTCPeerConnection; + pendingCandidates: RTCIceCandidate[]; + resolve?: (value: any) => void; } -const rtcSessions: { [id: string]: RTCSession } = {}; - export function addBuiltins(console: Console, mediaManager: MediaManager) { - // older scrypted runtime won't have this property, and wrtc will be built in. - if (!mediaManager.builtinConverters) - return; + // older scrypted runtime won't have this property, and wrtc will be built in. + if (!mediaManager.builtinConverters) + return; - mediaManager.builtinConverters.push({ - fromMimeType: ScryptedMimeTypes.RTCAVAnswer, - toMimeType: ScryptedMimeTypes.RTCAVOffer, - async convert(data: string | Buffer, fromMimeType: string): Promise { - const rtcInput: RTCAVMessage = JSON.parse(data.toString()); - const { id } = rtcInput; - const session = rtcSessions[id]; - const pc = rtcSessions[id].pc; - let pendingCandidates: RTCIceCandidateInit[] = []; + const rtcSessions: { [id: string]: RTCSession } = {}; + mediaManager.builtinConverters.push({ + fromMimeType: ScryptedMimeTypes.RTCAVAnswer, + toMimeType: ScryptedMimeTypes.RTCAVOffer, + async convert(data: string | Buffer, fromMimeType: string): Promise { + const rtcInput: RTCAVMessage = JSON.parse(data.toString()); + const { id } = rtcInput; + const session = rtcSessions[id]; + const pc = rtcSessions[id].pc; + let pendingCandidates: RTCIceCandidateInit[] = []; - // safari sends the candidates before the RTC Answer? watch for that. - if (!pc.remoteDescription) { - if (!rtcInput.description) { - // can't do anything with this yet, candidates out of order. - pendingCandidates.push(...(rtcInput.candidates || [])); - } - else { - await pc.setRemoteDescription(rtcInput.description); - if (!rtcInput.candidates) - rtcInput.candidates = []; - rtcInput.candidates.push(...pendingCandidates); - pendingCandidates = []; - } - } - - if (pc.remoteDescription && rtcInput.candidates?.length) { - for (const candidate of rtcInput.candidates) { - pc.addIceCandidate(candidate); - } - } - else if (!session.pendingCandidates.length) { - // wait for candidates to come in. - await new Promise(resolve => session.resolve = resolve); - } - const ret: RTCAVMessage = { - id, - candidates: session.pendingCandidates, - description: null, - configuration: null, - }; - session.pendingCandidates = []; - return Buffer.from(JSON.stringify(ret)); + // safari sends the candidates before the RTC Answer? watch for that. + if (!pc.remoteDescription) { + if (!rtcInput.description) { + // can't do anything with this yet, candidates out of order. + pendingCandidates.push(...(rtcInput.candidates || [])); } - }); - - mediaManager.builtinConverters.push({ - fromMimeType: ScryptedMimeTypes.FFmpegInput, - toMimeType: ScryptedMimeTypes.RTCAVOffer, - async convert(ffInputBuffer: string | Buffer, fromMimeType: string): Promise { - const ffInput: FFMpegInput = JSON.parse(ffInputBuffer.toString()); - - const configuration: RTCConfiguration = { - iceServers: [ - { - urls: ["turn:turn0.clockworkmod.com", "turn:n0.clockworkmod.com", "turn:n1.clockworkmod.com"], - username: "foo", - credential: "bar", - }, - ], - }; - - initalizeWebRtc(); - const pc = new RTCPeerConnection(configuration); - const id = Math.random().toString(); - const session: RTCSession = { - pc, - pendingCandidates: [], - }; - rtcSessions[id] = session; - - pc.onicecandidate = evt => { - if (evt.candidate) { - // console.log('local candidate', evt.candidate); - session.pendingCandidates.push(evt.candidate); - session.resolve?.(null); - } - } - - const { RTCVideoSource, RTCAudioSource } = wrtc.nonstandard; - - const videoSource = new RTCVideoSource(); - pc.addTrack(videoSource.createTrack()); - - - let audioPort: number; - - // wrtc causes browser to hang if there's no audio track? so always make sure one exists. - const noAudio = ffInput.mediaStreamOptions && ffInput.mediaStreamOptions.audio === null; - - let audioServer: net.Server; - if (!noAudio) { - const audioSource = new RTCAudioSource(); - pc.addTrack(audioSource.createTrack()); - - audioServer = net.createServer(async (socket) => { - audioServer.close() - const { sample_rate, channels } = await sampleInfo; - const bitsPerSample = 16; - const channelCount = channels[1] === 'mono' ? 1 : 2; - const sampleRate = parseInt(sample_rate[1]); - - const toRead = sampleRate / 100 * channelCount * 2; - socket.on('readable', () => { - while (true) { - const buffer: Buffer = socket.read(toRead); - if (!buffer) - return; - - const ab = buffer.buffer.slice(buffer.byteOffset, buffer.byteOffset + toRead) - const samples = new Int16Array(ab); // 10 ms of 16-bit mono audio - - const data = { - samples, - sampleRate, - bitsPerSample, - channelCount, - }; - try { - audioSource.onData(data); - } - catch (e) { - cp.kill(); - console.error(e); - } - } - }); - }); - audioPort = await listenZero(audioServer); - } - - const videoServer = net.createServer(async (socket) => { - videoServer.close() - const res = await resolution; - const width = parseInt(res[2]); - const height = parseInt(res[3]); - const toRead = parseInt(res[2]) * parseInt(res[3]) * 1.5; - socket.on('readable', () => { - while (true) { - const buffer: Buffer = socket.read(toRead); - if (!buffer) - return; - const data = new Uint8ClampedArray(buffer); - const frame = { width, height, data }; - try { - videoSource.onFrame(frame) - } - catch (e) { - cp.kill(); - console.error(e); - } - } - }); - }); - const videoPort = await listenZero(videoServer); - - const args = [ - '-hide_banner', - // don't think this is actually necessary but whatever. - '-y', - ]; - - args.push(...ffInput.inputArguments); - - if (!noAudio) { - // create a dummy audio track if none actually exists. - // this track will only be used if no audio track is available. - // https://stackoverflow.com/questions/37862432/ffmpeg-output-silent-audio-track-if-source-has-no-audio-or-audio-is-shorter-th - args.push('-f', 'lavfi', '-i', 'anullsrc=cl=1', '-shortest'); - - args.push('-vn'); - args.push('-acodec', 'pcm_s16le'); - args.push('-f', 's16le'); - args.push(`tcp://127.0.0.1:${audioPort}`); - } - - args.push('-an'); - // chromecast seems to crap out on higher than 15fps??? is there - // some webrtc video negotiation that is failing here? - args.push('-r', '15'); - args.push('-vcodec', 'rawvideo'); - args.push('-pix_fmt', 'yuv420p'); - args.push('-f', 'rawvideo'); - args.push(`tcp://127.0.0.1:${videoPort}`); - - console.log(ffInput); - console.log(args); - - const cp = child_process.spawn(await mediaManager.getFFmpegPath(), args, { - // DO NOT IGNORE STDIO, NEED THE DATA FOR RESOLUTION PARSING, ETC. - }); - ffmpegLogInitialOutput(console, cp); - cp.on('error', e => console.error('ffmpeg error', e)); - - cp.on('exit', () => { - videoServer.close(); - audioServer?.close(); - pc.close(); - }); - - const resolution = new Promise>(resolve => { - cp.stdout.on('data', data => { - const stdout = data.toString(); - const res = /(([0-9]{2,5})x([0-9]{2,5}))/.exec(stdout); - if (res) - resolve(res); - }); - cp.stderr.on('data', data => { - const stdout = data.toString(); - const res = /(([0-9]{2,5})x([0-9]{2,5}))/.exec(stdout); - if (res) - resolve(res); - }); - }); - - interface SampleInfo { - sample_rate: string[]; - channels: string[]; - } - - const sampleInfo = new Promise(resolve => { - const parser = (data: Buffer) => { - const stdout = data.toString(); - const sample_rate = /([0-9]+) Hz/i.exec(stdout) - const channels = /Audio:.* (stereo|mono)/.exec(stdout) - if (sample_rate && channels) { - resolve({ - sample_rate, channels, - }); - } - }; - cp.stdout.on('data', parser); - cp.stderr.on('data', parser); - }); - - const checkConn = () => { - if (pc.iceConnectionState === 'failed' || pc.connectionState === 'failed') { - delete rtcSessions[id]; - cp.kill(); - } - } - - pc.onconnectionstatechange = checkConn; - pc.oniceconnectionstatechange = checkConn; - - setTimeout(() => { - if (pc.connectionState !== 'connected') { - pc.close(); - cp.kill(); - } - }, 60000); - - const offer = await pc.createOffer({ - offerToReceiveAudio: false, - offerToReceiveVideo: false, - }); - await pc.setLocalDescription(offer); - - const ret: RTCAVMessage = { - id, - candidates: [], - description: offer, - configuration, - } - - return Buffer.from(JSON.stringify(ret)); + else { + await pc.setRemoteDescription(rtcInput.description); + if (!rtcInput.candidates) + rtcInput.candidates = []; + rtcInput.candidates.push(...pendingCandidates); + pendingCandidates = []; } - }) + } + + if (pc.remoteDescription && rtcInput.candidates?.length) { + for (const candidate of rtcInput.candidates) { + pc.addIceCandidate(candidate); + } + } + else if (!session.pendingCandidates.length) { + // wait for candidates to come in. + await new Promise(resolve => session.resolve = resolve); + } + const ret: RTCAVMessage = { + id, + candidates: session.pendingCandidates, + description: null, + configuration: null, + }; + session.pendingCandidates = []; + return Buffer.from(JSON.stringify(ret)); + } + }); + + mediaManager.builtinConverters.push({ + fromMimeType: ScryptedMimeTypes.FFmpegInput, + toMimeType: ScryptedMimeTypes.RTCAVOffer, + async convert(ffInputBuffer: string | Buffer, fromMimeType: string): Promise { + const ffInput: FFMpegInput = JSON.parse(ffInputBuffer.toString()); + + const configuration: RTCConfiguration = { + iceServers: [ + { + urls: ["turn:turn0.clockworkmod.com", "turn:n0.clockworkmod.com", "turn:n1.clockworkmod.com"], + username: "foo", + credential: "bar", + }, + ], + }; + + initalizeWebRtc(); + const pc = new RTCPeerConnection(configuration); + const id = Math.random().toString(); + const session: RTCSession = { + pc, + pendingCandidates: [], + }; + rtcSessions[id] = session; + + pc.onicecandidate = evt => { + if (evt.candidate) { + // console.log('local candidate', evt.candidate); + session.pendingCandidates.push(evt.candidate); + session.resolve?.(null); + } + } + + const { RTCVideoSource, RTCAudioSource } = wrtc.nonstandard; + + const videoSource = new RTCVideoSource(); + pc.addTrack(videoSource.createTrack()); + + + let audioPort: number; + + // wrtc causes browser to hang if there's no audio track? so always make sure one exists. + const noAudio = ffInput.mediaStreamOptions && ffInput.mediaStreamOptions.audio === null; + + let audioServer: net.Server; + if (!noAudio) { + const audioSource = new RTCAudioSource(); + pc.addTrack(audioSource.createTrack()); + + audioServer = net.createServer(async (socket) => { + audioServer.close() + const { sample_rate, channels } = await sampleInfo; + const bitsPerSample = 16; + const channelCount = channels[1] === 'mono' ? 1 : 2; + const sampleRate = parseInt(sample_rate[1]); + + const toRead = sampleRate / 100 * channelCount * 2; + socket.on('readable', () => { + while (true) { + const buffer: Buffer = socket.read(toRead); + if (!buffer) + return; + + const ab = buffer.buffer.slice(buffer.byteOffset, buffer.byteOffset + toRead) + const samples = new Int16Array(ab); // 10 ms of 16-bit mono audio + + const data = { + samples, + sampleRate, + bitsPerSample, + channelCount, + }; + try { + audioSource.onData(data); + } + catch (e) { + cp.kill(); + console.error(e); + } + } + }); + }); + audioPort = await listenZero(audioServer); + } + + const videoServer = net.createServer(async (socket) => { + videoServer.close() + const res = await resolution; + const width = parseInt(res[2]); + const height = parseInt(res[3]); + const toRead = parseInt(res[2]) * parseInt(res[3]) * 1.5; + socket.on('readable', () => { + while (true) { + const buffer: Buffer = socket.read(toRead); + if (!buffer) + return; + const data = new Uint8ClampedArray(buffer); + const frame = { width, height, data }; + try { + videoSource.onFrame(frame) + } + catch (e) { + cp.kill(); + console.error(e); + } + } + }); + }); + const videoPort = await listenZero(videoServer); + + const args = [ + '-hide_banner', + // don't think this is actually necessary but whatever. + '-y', + ]; + + args.push(...ffInput.inputArguments); + + if (!noAudio) { + // create a dummy audio track if none actually exists. + // this track will only be used if no audio track is available. + // https://stackoverflow.com/questions/37862432/ffmpeg-output-silent-audio-track-if-source-has-no-audio-or-audio-is-shorter-th + args.push('-f', 'lavfi', '-i', 'anullsrc=cl=1', '-shortest'); + + args.push('-vn'); + args.push('-acodec', 'pcm_s16le'); + args.push('-f', 's16le'); + args.push(`tcp://127.0.0.1:${audioPort}`); + } + + args.push('-an'); + // chromecast seems to crap out on higher than 15fps??? is there + // some webrtc video negotiation that is failing here? + args.push('-r', '15'); + args.push('-vcodec', 'rawvideo'); + args.push('-pix_fmt', 'yuv420p'); + args.push('-f', 'rawvideo'); + args.push(`tcp://127.0.0.1:${videoPort}`); + + console.log(ffInput); + console.log(args); + + const cp = child_process.spawn(await mediaManager.getFFmpegPath(), args, { + // DO NOT IGNORE STDIO, NEED THE DATA FOR RESOLUTION PARSING, ETC. + }); + ffmpegLogInitialOutput(console, cp); + cp.on('error', e => console.error('ffmpeg error', e)); + + cp.on('exit', () => { + videoServer.close(); + audioServer?.close(); + pc.close(); + }); + + const resolution = new Promise>(resolve => { + cp.stdout.on('data', data => { + const stdout = data.toString(); + const res = /(([0-9]{2,5})x([0-9]{2,5}))/.exec(stdout); + if (res) + resolve(res); + }); + cp.stderr.on('data', data => { + const stdout = data.toString(); + const res = /(([0-9]{2,5})x([0-9]{2,5}))/.exec(stdout); + if (res) + resolve(res); + }); + }); + + interface SampleInfo { + sample_rate: string[]; + channels: string[]; + } + + const sampleInfo = new Promise(resolve => { + const parser = (data: Buffer) => { + const stdout = data.toString(); + const sample_rate = /([0-9]+) Hz/i.exec(stdout) + const channels = /Audio:.* (stereo|mono)/.exec(stdout) + if (sample_rate && channels) { + resolve({ + sample_rate, channels, + }); + } + }; + cp.stdout.on('data', parser); + cp.stderr.on('data', parser); + }); + + const checkConn = () => { + if (pc.iceConnectionState === 'failed' || pc.connectionState === 'failed') { + delete rtcSessions[id]; + cp.kill(); + } + } + + pc.onconnectionstatechange = checkConn; + pc.oniceconnectionstatechange = checkConn; + + setTimeout(() => { + if (pc.connectionState !== 'connected') { + pc.close(); + cp.kill(); + } + }, 60000); + + const offer = await pc.createOffer({ + offerToReceiveAudio: false, + offerToReceiveVideo: false, + }); + await pc.setLocalDescription(offer); + + const ret: RTCAVMessage = { + id, + candidates: [], + description: offer, + configuration, + } + + return Buffer.from(JSON.stringify(ret)); + } + }) } +export async function createRTCPeerConnectionSink(console: Console, mediaManager: MediaManager, sendOffer: (offer: RTCAVMessage) => Promise): Promise<{ + ffmpegInput: FFMpegInput, + peerConnection: RTCPeerConnection, +}> { + initalizeWebRtc(); + const { RTCVideoSink, RTCAudioSink } = wrtc.nonstandard; + + const pc = new RTCPeerConnection(); + pc.createDataChannel("dataSendChannel"); + pc.addTransceiver("audio", { + direction: 'recvonly' + }); + pc.addTransceiver("video", { + direction: 'recvonly', + }); + const offer = await pc.createOffer(); + await pc.setLocalDescription(offer); + + pc.onicecandidate = async (evt) => { + if (evt.candidate) + return; + const offer = await pc.createOffer({ + offerToReceiveAudio: true, + offerToReceiveVideo: true, + }); + // await pc.setLocalDescription(offer); + + const offerWithCandidates: RTCAVMessage = { + id: undefined, + candidates: [], + description: { + sdp: offer.sdp, + type: 'offer', + }, + configuration: {}, + }; + const answer = await sendOffer(offerWithCandidates); + await pc.setRemoteDescription(answer.description); + }; + + await pc.setLocalDescription(offer); + + pc.onconnectionstatechange = () => console.log(pc.connectionState); + pc.onsignalingstatechange = () => console.log(pc.connectionState); + + return new Promise(resolve => { + let audioSink: any; + let videoSink: any; + + pc.ontrack = async (ev) => { + const { track } = ev; + const {url: videoUrl, clientPromise: videoClientPromise} = await listenZeroSingleClient(); + // const {url: audioUrl, clientPromise: audioClientPromise} = await listenZeroSingleClient(); + + const cleanup = () => { + console.log('peer connection cleaned up'); + // audioSink?.stop(); + // videoSink?.stop(); + // pc.close() + }; + videoClientPromise.catch(cleanup); + // audioClientPromise.catch(cleanup); + videoClientPromise.then(videoClient => { + videoSink.onframe = (frame: any) => { + videoClient.write(frame.frame.data); + } + videoClient.once('close', cleanup); + }); + // audioClientPromise.then(audioClient => { + // audioSink.ondata = (data: any) => { + // audioClient.write(data.frame.data); + // } + // audioClient.once('close', cleanup); + // }); + + if (track.kind === 'audio') { + audioSink = new RTCAudioSink(track); + audioSink.ondata = () => {}; + } + if (track.kind === 'video') { + videoSink = new RTCVideoSink(track); + videoSink.onframe = (frame: any) => { + if (!audioSink) + return; + + videoSink.onframe = () => {}; + resolve({ + peerConnection: pc, + ffmpegInput: { + url: undefined, + inputArguments: [ + // '-acodec', 'pcm_s16be', + // '-f', 's16be', + // '-i', audioUrl, + '-vcodec', 'rawvideo', + '-s', `${frame.frame.width}x${frame.frame.height}`, + '-pix_fmt', 'yuv420p', + '-f', 'rawvideo', + '-i', videoUrl, + ] + }, + }); + } + } + }; + }) +} diff --git a/plugins/google-device-access/package-lock.json b/plugins/google-device-access/package-lock.json index edb6acec4..781c49ce9 100644 --- a/plugins/google-device-access/package-lock.json +++ b/plugins/google-device-access/package-lock.json @@ -13,7 +13,8 @@ "client-oauth2": "^4.3.3", "lodash": "^4.17.21", "query-string": "^7.0.0", - "url-parse": "^1.5.1" + "url-parse": "^1.5.1", + "werift": "^0.14.5" }, "devDependencies": { "@scrypted/sdk": "file:../../sdk", @@ -25,7 +26,7 @@ }, "../../sdk": { "name": "@scrypted/sdk", - "version": "0.0.134", + "version": "0.0.144", "dev": true, "license": "ISC", "dependencies": { @@ -62,12 +63,33 @@ "stringify-object": "^3.3.0", "ts-node": "^10.4.0", "typedoc": "^0.22.8", - "typescript-json-schema": "^0.50.1" + "typescript-json-schema": "^0.50.1", + "webpack-bundle-analyzer": "^4.5.0" } }, "../sdk": { "extraneous": true }, + "node_modules/@fidm/asn1": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@fidm/asn1/-/asn1-1.0.4.tgz", + "integrity": "sha512-esd1jyNvRb2HVaQGq2Gg8Z0kbQPXzV9Tq5Z14KNIov6KfFD6PTaRIO8UpcsYiTNzOqJpmyzWgVTrUwFV3UF4TQ==", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@fidm/x509": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@fidm/x509/-/x509-1.2.1.tgz", + "integrity": "sha512-nwc2iesjyc9hkuzcrMCBXQRn653XuAUKorfWM8PZyJawiy1QzLj4vahwzaI25+pfpwOLvMzbJ0uKpWLDNmo16w==", + "dependencies": { + "@fidm/asn1": "^1.0.4", + "tweetnacl": "^1.0.1" + }, + "engines": { + "node": ">= 8" + } + }, "node_modules/@googleapis/smartdevicemanagement": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/@googleapis/smartdevicemanagement/-/smartdevicemanagement-0.2.0.tgz", @@ -79,6 +101,173 @@ "node": ">=10.0.0" } }, + "node_modules/@minhducsun2002/leb128": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/@minhducsun2002/leb128/-/leb128-0.2.0.tgz", + "integrity": "sha512-XckPQO6CDP0LAg3ZHIBZcjIWXgdM5vGhwhixZU78UEwaXwc33LXPl1KfvV8jCyrdU2YzplCvaNK3Mm0MDh6t1Q==" + }, + "node_modules/@peculiar/asn1-cms": { + "version": "2.0.44", + "resolved": "https://registry.npmjs.org/@peculiar/asn1-cms/-/asn1-cms-2.0.44.tgz", + "integrity": "sha512-CzjCz8VZqG2jqRI/4YKCk3D9WS8V9cezt0tftWT5zmYxeZvAWOmtInj013zSooHEn1Oi65rzdDZ1m+wgascmiw==", + "dependencies": { + "@peculiar/asn1-schema": "^2.0.44", + "@peculiar/asn1-x509": "^2.0.44", + "@peculiar/asn1-x509-attr": "^2.0.44", + "asn1js": "^2.1.1", + "tslib": "^2.3.0" + } + }, + "node_modules/@peculiar/asn1-csr": { + "version": "2.0.44", + "resolved": "https://registry.npmjs.org/@peculiar/asn1-csr/-/asn1-csr-2.0.44.tgz", + "integrity": "sha512-9FG9ySzLyYIlk/W3o/mpE+ukn/XMokv+BysqyhNGifUet362slp+uF4XliKGLt53TO53uYCsQimVyTK4vwe/yg==", + "dependencies": { + "@peculiar/asn1-schema": "^2.0.44", + "@peculiar/asn1-x509": "^2.0.44", + "asn1js": "^2.1.1", + "tslib": "^2.3.0" + } + }, + "node_modules/@peculiar/asn1-ecc": { + "version": "2.0.44", + "resolved": "https://registry.npmjs.org/@peculiar/asn1-ecc/-/asn1-ecc-2.0.44.tgz", + "integrity": "sha512-GvfifE5xCZjEz9EsOl9gqTVgex9m7ATLloTaSE3Go+iG8bc7C/VDK8lOnFb3/UsCqfI46Gwh4Q3RQCP2JB3GDQ==", + "dependencies": { + "@peculiar/asn1-schema": "^2.0.44", + "@peculiar/asn1-x509": "^2.0.44", + "asn1js": "^2.1.1", + "tslib": "^2.3.0" + } + }, + "node_modules/@peculiar/asn1-pfx": { + "version": "2.0.44", + "resolved": "https://registry.npmjs.org/@peculiar/asn1-pfx/-/asn1-pfx-2.0.44.tgz", + "integrity": "sha512-rVsGoZWMtensS9+AEtU97cImHXEu+Oi6K31/EzzzdqfUx/aF49RYCVKOyuCjUg5cwIOE93WsNm0hQFYB2pYwVQ==", + "dependencies": { + "@peculiar/asn1-cms": "^2.0.44", + "@peculiar/asn1-pkcs8": "^2.0.44", + "@peculiar/asn1-rsa": "^2.0.44", + "@peculiar/asn1-schema": "^2.0.44", + "asn1js": "^2.1.1", + "tslib": "^2.3.0" + } + }, + "node_modules/@peculiar/asn1-pkcs8": { + "version": "2.0.44", + "resolved": "https://registry.npmjs.org/@peculiar/asn1-pkcs8/-/asn1-pkcs8-2.0.44.tgz", + "integrity": "sha512-cs/zGEv/6Jxx14tZ6NS82PNJFMCb4aFOiAFzv+I1I1ud7o5wyDGOOAIiIs4vI+Z6xtkoSyF+hWH51kRutdFV4A==", + "dependencies": { + "@peculiar/asn1-schema": "^2.0.44", + "@peculiar/asn1-x509": "^2.0.44", + "asn1js": "^2.1.1", + "tslib": "^2.3.0" + } + }, + "node_modules/@peculiar/asn1-pkcs9": { + "version": "2.0.44", + "resolved": "https://registry.npmjs.org/@peculiar/asn1-pkcs9/-/asn1-pkcs9-2.0.44.tgz", + "integrity": "sha512-b54VRWsM5NdIOlSuBbfBeximwVQIHcUoUdx10mHM6QuvZlXKciVP/nkerxg0ytQzC5BvPbohfYuiq46gYCPZSA==", + "dependencies": { + "@peculiar/asn1-cms": "^2.0.44", + "@peculiar/asn1-pfx": "^2.0.44", + "@peculiar/asn1-pkcs8": "^2.0.44", + "@peculiar/asn1-schema": "^2.0.44", + "@peculiar/asn1-x509": "^2.0.44", + "@peculiar/asn1-x509-attr": "^2.0.44", + "asn1js": "^2.1.1", + "tslib": "^2.3.0" + } + }, + "node_modules/@peculiar/asn1-rsa": { + "version": "2.0.44", + "resolved": "https://registry.npmjs.org/@peculiar/asn1-rsa/-/asn1-rsa-2.0.44.tgz", + "integrity": "sha512-DYfo33Yl3y4Bu8V0RrAhKBZJDy1ESEGQzKVl7DxCUJna164/U/JB767W9ze0Vlq7quTawUJLMX3RRfesEFGigA==", + "dependencies": { + "@peculiar/asn1-schema": "^2.0.44", + "@peculiar/asn1-x509": "^2.0.44", + "asn1js": "^2.1.1", + "tslib": "^2.3.0" + } + }, + "node_modules/@peculiar/asn1-schema": { + "version": "2.0.44", + "resolved": "https://registry.npmjs.org/@peculiar/asn1-schema/-/asn1-schema-2.0.44.tgz", + "integrity": "sha512-uaCnjQ9A9WwQSMuDJcNOCYEPXTahgKbFMvI7eMOMd8lXgx0J1eU7F3BoMsK5PFxa3dVUxjSQbaOjfgGoeHGgoQ==", + "dependencies": { + "@types/asn1js": "^2.0.2", + "asn1js": "^2.1.1", + "pvtsutils": "^1.2.1", + "tslib": "^2.3.0" + } + }, + "node_modules/@peculiar/asn1-x509": { + "version": "2.0.44", + "resolved": "https://registry.npmjs.org/@peculiar/asn1-x509/-/asn1-x509-2.0.44.tgz", + "integrity": "sha512-jKGy+7Ew1PADjzInblBaQWVdh9kTiy49lkTko/MiYg5lHyCi/N9xPtQCuincpY1UeNPwXaeoT2DXRJOuN6U/8A==", + "dependencies": { + "@peculiar/asn1-schema": "^2.0.44", + "asn1js": "^2.1.1", + "ipaddr.js": "^2.0.1", + "pvtsutils": "^1.2.1", + "tslib": "^2.3.0" + } + }, + "node_modules/@peculiar/asn1-x509-attr": { + "version": "2.0.44", + "resolved": "https://registry.npmjs.org/@peculiar/asn1-x509-attr/-/asn1-x509-attr-2.0.44.tgz", + "integrity": "sha512-mYyf1fMT1JVrmPInjqVC3O2Vm3LBm7sd75Mg2hKB0A/zPKIYZ5WRz396lliucHagg17PalMjDOxtIQFOqs1WGg==", + "dependencies": { + "@peculiar/asn1-schema": "^2.0.44", + "@peculiar/asn1-x509": "^2.0.44", + "asn1js": "^2.1.1", + "tslib": "^2.3.0" + } + }, + "node_modules/@peculiar/json-schema": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/@peculiar/json-schema/-/json-schema-1.1.12.tgz", + "integrity": "sha512-coUfuoMeIB7B8/NMekxaDzLhaYmp0HZNPEjYRm9goRou8UZIC3z21s0sL9AWoCw4EG876QyO3kYrc61WNF9B/w==", + "dependencies": { + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@peculiar/webcrypto": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@peculiar/webcrypto/-/webcrypto-1.2.3.tgz", + "integrity": "sha512-q7wDfZy3k/tpnsYB23/MyyDkjn6IdHh8w+xwoVMS5cu6CjVoFzngXDZEOOuSE4zus2yO6ciQhhHxd4XkLpwVnQ==", + "dependencies": { + "@peculiar/asn1-schema": "^2.0.44", + "@peculiar/json-schema": "^1.1.12", + "pvtsutils": "^1.2.1", + "tslib": "^2.3.1", + "webcrypto-core": "^1.4.0" + }, + "engines": { + "node": ">=10.12.0" + } + }, + "node_modules/@peculiar/x509": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/@peculiar/x509/-/x509-1.6.1.tgz", + "integrity": "sha512-C4oxpCuYasfjuhy6QRFJhs0R6gyeQSRsB7MsT6JkO3qaFi4b75mm8hNEKa+sIJPtTjXCC94tW9rHx1hw5dOvnQ==", + "dependencies": { + "@peculiar/asn1-cms": "^2.0.44", + "@peculiar/asn1-csr": "^2.0.44", + "@peculiar/asn1-ecc": "^2.0.44", + "@peculiar/asn1-pkcs9": "^2.0.44", + "@peculiar/asn1-rsa": "^2.0.44", + "@peculiar/asn1-schema": "^2.0.44", + "@peculiar/asn1-x509": "^2.0.44", + "pvtsutils": "^1.2.1", + "reflect-metadata": "^0.1.13", + "tslib": "^2.3.1", + "tsyringe": "^4.6.0" + } + }, "node_modules/@scrypted/sdk": { "resolved": "../../sdk", "link": true @@ -88,6 +277,19 @@ "resolved": "https://registry.npmjs.org/@servie/events/-/events-1.0.0.tgz", "integrity": "sha512-sBSO19KzdrJCM3gdx6eIxV8M9Gxfgg6iDQmH5TIAGaUu+X9VDdsINXJOnoiZ1Kx3TrHdH4bt5UVglkjsEGBcvw==" }, + "node_modules/@shinyoshiaki/ebml-builder": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/@shinyoshiaki/ebml-builder/-/ebml-builder-0.0.1.tgz", + "integrity": "sha512-rz1LklnlZ0yvVIt924yRGu+R87Fhfa06BdRIZR6GF6SXVSBTD9wCQmN6opXQLuSkoKXleWJwF3PW1ls8DGZjtw==", + "dependencies": { + "lodash.memoize": "^4.1.2" + } + }, + "node_modules/@types/asn1js": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@types/asn1js/-/asn1js-2.0.2.tgz", + "integrity": "sha512-t4YHCgtD+ERvH0FyxvNlYwJ2ezhqw7t+Ygh4urQ7dJER8i185JPv6oIM3ey5YQmGN6Zp9EMbpohkjZi9t3UxwA==" + }, "node_modules/@types/debug": { "version": "4.1.5", "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.5.tgz", @@ -128,6 +330,11 @@ "node": ">=6.5" } }, + "node_modules/aes-js": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/aes-js/-/aes-js-3.1.2.tgz", + "integrity": "sha512-e5pEa2kBnBOgR4Y/p20pskXI74UEz7de8ZGVo58asOtvSVG5YAbJeELPZxOmt+Bnz3rX753YKhfIn4X4l1PPRQ==" + }, "node_modules/agent-base": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", @@ -147,6 +354,17 @@ "node": ">=8" } }, + "node_modules/asn1js": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/asn1js/-/asn1js-2.2.0.tgz", + "integrity": "sha512-oagLNqpfNv7CvmyMoexMDNyVDSiq1rya0AEUgcLlNHdHgNl6U/hi8xY370n5y+ZIFEXOx0J4B1qF2NDjMRxklA==", + "dependencies": { + "pvutils": "latest" + }, + "engines": { + "node": ">=6.0.0" + } + }, "node_modules/axios": { "version": "0.21.4", "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.4.tgz", @@ -174,6 +392,14 @@ } ] }, + "node_modules/big-integer": { + "version": "1.6.51", + "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.51.tgz", + "integrity": "sha512-GPEid2Y9QU1Exl1rpO9B2IPJGHPSupF5GnVIP0blYvNOMer2bTvSWs1jGOUg04hTmu67nmLsQ9TBo1puaotBHg==", + "engines": { + "node": ">=0.6" + } + }, "node_modules/bignumber.js": { "version": "9.0.2", "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.0.2.tgz", @@ -182,6 +408,36 @@ "node": "*" } }, + "node_modules/binary-data": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/binary-data/-/binary-data-0.6.0.tgz", + "integrity": "sha512-HGiT0ir03tS1u7iWdW5xjJfbPpvxH2qJbPFxXW0I3P5iOzkbjN/cJy5GlpAwmjHW5CiayGOxZ/ytLzXmYgdgqQ==", + "dependencies": { + "generate-function": "^2.3.1", + "is-plain-object": "^2.0.3" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" + }, + "node_modules/brorand": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", + "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=" + }, + "node_modules/buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=", + "engines": { + "node": "*" + } + }, "node_modules/buffer-equal-constant-time": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", @@ -213,6 +469,18 @@ "node": ">=4.2.0" } }, + "node_modules/date-fns": { + "version": "2.28.0", + "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.28.0.tgz", + "integrity": "sha512-8d35hViGYx/QH0icHYCeLmsLmMUheMmTyV9Fcm6gvNwdw31yXXH+O85sOBJ+OLnLQMKZowvpKb6FgMIQjcpvQw==", + "engines": { + "node": ">=0.11" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/date-fns" + } + }, "node_modules/debug": { "version": "4.3.3", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", @@ -245,6 +513,20 @@ "safe-buffer": "^5.0.1" } }, + "node_modules/elliptic": { + "version": "6.5.4", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz", + "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==", + "dependencies": { + "bn.js": "^4.11.9", + "brorand": "^1.1.0", + "hash.js": "^1.0.0", + "hmac-drbg": "^1.0.1", + "inherits": "^2.0.4", + "minimalistic-assert": "^1.0.1", + "minimalistic-crypto-utils": "^1.0.1" + } + }, "node_modules/event-target-shim": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", @@ -272,9 +554,9 @@ } }, "node_modules/follow-redirects": { - "version": "1.14.6", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.6.tgz", - "integrity": "sha512-fhUl5EwSJbbl8AR+uYL2KQDxLkdSjZGR36xy46AO7cOMTrCMON6Sa28FmAnC2tRTDbd/Uuzz3aJBv7EBN7JH8A==", + "version": "1.14.7", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.7.tgz", + "integrity": "sha512-+hbxoLbFMbRKDwohX8GkTataGqO6Jb7jGwpAlwgy2bIz25XtRm7KEzJM76R1WiNT5SwZkX4Y75SwBolkpmE7iQ==", "funding": [ { "type": "individual", @@ -322,6 +604,14 @@ "node": ">=10" } }, + "node_modules/generate-function": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.3.1.tgz", + "integrity": "sha512-eeB5GfMNeevm/GRYq20ShmsaGcmI81kIX2K9XQx5miC8KdHaC6Jm0qQ8ZNeGOi7wYB8OsdxKs+Y2oVuTFuVwKQ==", + "dependencies": { + "is-property": "^1.0.2" + } + }, "node_modules/get-intrinsic": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.0.1.tgz", @@ -352,11 +642,11 @@ } }, "node_modules/google-p12-pem": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/google-p12-pem/-/google-p12-pem-3.1.2.tgz", - "integrity": "sha512-tjf3IQIt7tWCDsa0ofDQ1qqSCNzahXDxdAGJDbruWqu3eCg5CKLYKN+hi0s6lfvzYZ1GDVr+oDF9OOWlDSdf0A==", + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/google-p12-pem/-/google-p12-pem-3.1.3.tgz", + "integrity": "sha512-MC0jISvzymxePDVembypNefkAQp+DRP7dBE+zNUPaIjEspIlYg0++OrsNr248V9tPbz6iqtZ7rX1hxWA5B8qBQ==", "dependencies": { - "node-forge": "^0.10.0" + "node-forge": "^1.0.0" }, "bin": { "gp12-pem": "build/src/bin/gp12-pem.js" @@ -413,6 +703,25 @@ "node": ">= 0.4" } }, + "node_modules/hash.js": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", + "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", + "dependencies": { + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.1" + } + }, + "node_modules/hmac-drbg": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", + "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", + "dependencies": { + "hash.js": "^1.0.3", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.1" + } + }, "node_modules/https-proxy-agent": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz", @@ -425,6 +734,24 @@ "node": ">= 6" } }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "node_modules/int64-buffer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/int64-buffer/-/int64-buffer-1.0.1.tgz", + "integrity": "sha512-+3azY4pXrjAupJHU1V9uGERWlhoqNswJNji6aD/02xac7oxol508AsMC5lxKhEqyZeDFy3enq5OGWXF4u75hiw==", + "engines": { + "node": ">= 4.5.0" + } + }, + "node_modules/ip": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", + "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=" + }, "node_modules/ip-regex": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-2.1.0.tgz", @@ -433,6 +760,30 @@ "node": ">=4" } }, + "node_modules/ipaddr.js": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.0.1.tgz", + "integrity": "sha512-1qTgH9NG+IIJ4yfKs2e6Pp1bZg8wbDbKHT21HrLIeYBTRLgMYKnMTPAuI3Lcs61nfx5h1xlXnbJtH1kX5/d/ng==", + "engines": { + "node": ">= 10" + } + }, + "node_modules/is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-property": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz", + "integrity": "sha1-V/4cTkhHTt1lsJkR8msc1Ald2oQ=" + }, "node_modules/is-stream": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", @@ -444,6 +795,14 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/json-bigint": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/json-bigint/-/json-bigint-1.0.0.tgz", @@ -452,6 +811,11 @@ "bignumber.js": "^9.0.0" } }, + "node_modules/jspack": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/jspack/-/jspack-0.0.4.tgz", + "integrity": "sha1-Mt01x/3LPjRWwY+7fvntC8YjgXc=" + }, "node_modules/jwa": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/jwa/-/jwa-2.0.0.tgz", @@ -476,6 +840,11 @@ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" }, + "node_modules/lodash.memoize": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", + "integrity": "sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=" + }, "node_modules/lru-cache": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", @@ -500,28 +869,54 @@ "make-error": "^1.3.5" } }, + "node_modules/minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==" + }, + "node_modules/minimalistic-crypto-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", + "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=" + }, "node_modules/ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, + "node_modules/nano-time": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/nano-time/-/nano-time-1.0.0.tgz", + "integrity": "sha1-sFVPaa2J4i0JB/ehKwmTpdlhN+8=", + "dependencies": { + "big-integer": "^1.6.16" + } + }, "node_modules/node-fetch": { - "version": "2.6.6", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.6.tgz", - "integrity": "sha512-Z8/6vRlTUChSdIgMa51jxQ4lrw/Jy5SOW10ObaA47/RElsAN2c5Pn8bTgFGWn/ibwzXTE8qwr1Yzx28vsecXEA==", + "version": "2.6.7", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", + "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", "dependencies": { "whatwg-url": "^5.0.0" }, "engines": { "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } } }, "node_modules/node-forge": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.10.0.tgz", - "integrity": "sha512-PPmu8eEeG9saEUvI97fm4OYxXVB6bFvyNTyiUOBichBpFG8A1Ljw3bY62+5oOjDEMHRnd0Y7HQ+x7uzxOzC6JA==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.2.1.tgz", + "integrity": "sha512-Fcvtbb+zBcZXbTTVwqGA5W+MKBj56UjVRevvchv5XrcyXbmNdesfZL37nlcWOfpgHhgmxApw3tQbTr4CqNmX4w==", "engines": { - "node": ">= 6.0.0" + "node": ">= 6.13.0" } }, "node_modules/object-inspect": { @@ -529,6 +924,14 @@ "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.9.0.tgz", "integrity": "sha512-i3Bp9iTqwhaLZBxGkRfo5ZbE07BQRT7MGu8+nNgwW9ItGp1TzCTw2DLEoWwjClxBjOFI/hWljTAmYGCEwmtnOw==" }, + "node_modules/p-cancelable": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-2.1.1.tgz", + "integrity": "sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==", + "engines": { + "node": ">=8" + } + }, "node_modules/popsicle": { "version": "12.1.0", "resolved": "https://registry.npmjs.org/popsicle/-/popsicle-12.1.0.tgz", @@ -612,6 +1015,22 @@ "node": ">=6" } }, + "node_modules/pvtsutils": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/pvtsutils/-/pvtsutils-1.2.1.tgz", + "integrity": "sha512-Q867jEr30lBR2YSFFLZ0/XsEvpweqH6Kj096wmlRAFXrdRGPCNq2iz9B5Tk085EZ+OBZyYAVA5UhPkjSHGrUzQ==", + "dependencies": { + "tslib": "^2.3.1" + } + }, + "node_modules/pvutils": { + "version": "1.0.17", + "resolved": "https://registry.npmjs.org/pvutils/-/pvutils-1.0.17.tgz", + "integrity": "sha512-wLHYUQxWaXVQvKnwIDWFVKDJku9XDCvyhhxoq8dc5MFdIlRenyPI9eSfEtcvgHgD7FlvCyGAlWgOzRnZD99GZQ==", + "engines": { + "node": ">=6.0.0" + } + }, "node_modules/qs": { "version": "6.10.0", "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.0.tgz", @@ -642,11 +1061,21 @@ "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==" }, + "node_modules/reflect-metadata": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.13.tgz", + "integrity": "sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg==" + }, "node_modules/requires-port": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=" }, + "node_modules/rx.mini": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/rx.mini/-/rx.mini-1.1.0.tgz", + "integrity": "sha512-SgejtK4cAYpORQeIfwY8DWkanwhi8DAmlJKaUjmcPjNlq6OLBix0qVTYtj2aXxh7tsvO34hd4PQpP263ZrcwYg==" + }, "node_modules/safe-buffer": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", @@ -740,6 +1169,40 @@ "resolved": "https://registry.npmjs.org/ts-expect/-/ts-expect-1.3.0.tgz", "integrity": "sha512-e4g0EJtAjk64xgnFPD6kTBUtpnMVzDrMb12N1YZV0VvSlhnVT3SGxiYTLdGy8Q5cYHOIC/FAHmZ10eGrAguicQ==" }, + "node_modules/tslib": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", + "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==" + }, + "node_modules/tsyringe": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/tsyringe/-/tsyringe-4.6.0.tgz", + "integrity": "sha512-BMQAZamSfEmIQzH8WJeRu1yZGQbPSDuI9g+yEiKZFIcO46GPZuMOC2d0b52cVBdw1d++06JnDSIIZvEnogMdAw==", + "dependencies": { + "tslib": "^1.9.3" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/tsyringe/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + }, + "node_modules/turbo-crc32": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/turbo-crc32/-/turbo-crc32-1.0.1.tgz", + "integrity": "sha512-8yyRd1ZdNp+AQLGqi3lTaA2k81JjlIZOyFQEsi7GQWBgirnQOxjqVtDEbYHM2Z4yFdJ5AQw0fxBLLnDCl6RXoQ==", + "engines": { + "node": ">=6" + } + }, + "node_modules/tweetnacl": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-1.0.3.tgz", + "integrity": "sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw==" + }, "node_modules/url-parse": { "version": "1.5.4", "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.4.tgz", @@ -762,11 +1225,54 @@ "uuid": "dist/bin/uuid" } }, + "node_modules/webcrypto-core": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/webcrypto-core/-/webcrypto-core-1.4.0.tgz", + "integrity": "sha512-HY3Zo0GcRIQUUDnlZ/shGjN+4f7LVMkdJZoGPog+oHhJsJdMz6iM8Za5xZ0t6qg7Fx/JXXz+oBv2J2p982hGTQ==", + "dependencies": { + "@peculiar/asn1-schema": "^2.0.44", + "@peculiar/json-schema": "^1.1.12", + "asn1js": "^2.1.1", + "pvtsutils": "^1.2.0", + "tslib": "^2.3.1" + } + }, "node_modules/webidl-conversions": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", "integrity": "sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE=" }, + "node_modules/werift": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/werift/-/werift-0.14.5.tgz", + "integrity": "sha512-aUAMUJc3WKXqiXn7Qgs4xSj2dDHdPCDQ+keQieoOrBVtZP0T6icWR1i6Vom+ZAO4RQE2lR3kz3cTd4M8DT2opw==", + "dependencies": { + "@fidm/x509": "^1.2.1", + "@minhducsun2002/leb128": "^0.2.0", + "@peculiar/webcrypto": "^1.1.6", + "@peculiar/x509": "^1.2.2", + "@shinyoshiaki/ebml-builder": "^0.0.1", + "aes-js": "^3.1.2", + "binary-data": "^0.6.0", + "buffer-crc32": "^0.2.13", + "date-fns": "^2.27.0", + "debug": "^4.3.3", + "elliptic": "^6.5.3", + "int64-buffer": "^1.0.1", + "ip": "^1.1.5", + "jspack": "^0.0.4", + "lodash": "^4.17.20", + "nano-time": "^1.0.0", + "p-cancelable": "^2.1.1", + "rx.mini": "^1.1.0", + "turbo-crc32": "^1.0.1", + "tweetnacl": "^1.0.3", + "uuid": "^8.3.2" + }, + "engines": { + "node": ">=15" + } + }, "node_modules/whatwg-url": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", @@ -783,6 +1289,20 @@ } }, "dependencies": { + "@fidm/asn1": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@fidm/asn1/-/asn1-1.0.4.tgz", + "integrity": "sha512-esd1jyNvRb2HVaQGq2Gg8Z0kbQPXzV9Tq5Z14KNIov6KfFD6PTaRIO8UpcsYiTNzOqJpmyzWgVTrUwFV3UF4TQ==" + }, + "@fidm/x509": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@fidm/x509/-/x509-1.2.1.tgz", + "integrity": "sha512-nwc2iesjyc9hkuzcrMCBXQRn653XuAUKorfWM8PZyJawiy1QzLj4vahwzaI25+pfpwOLvMzbJ0uKpWLDNmo16w==", + "requires": { + "@fidm/asn1": "^1.0.4", + "tweetnacl": "^1.0.1" + } + }, "@googleapis/smartdevicemanagement": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/@googleapis/smartdevicemanagement/-/smartdevicemanagement-0.2.0.tgz", @@ -791,6 +1311,167 @@ "googleapis-common": "^5.0.1" } }, + "@minhducsun2002/leb128": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/@minhducsun2002/leb128/-/leb128-0.2.0.tgz", + "integrity": "sha512-XckPQO6CDP0LAg3ZHIBZcjIWXgdM5vGhwhixZU78UEwaXwc33LXPl1KfvV8jCyrdU2YzplCvaNK3Mm0MDh6t1Q==" + }, + "@peculiar/asn1-cms": { + "version": "2.0.44", + "resolved": "https://registry.npmjs.org/@peculiar/asn1-cms/-/asn1-cms-2.0.44.tgz", + "integrity": "sha512-CzjCz8VZqG2jqRI/4YKCk3D9WS8V9cezt0tftWT5zmYxeZvAWOmtInj013zSooHEn1Oi65rzdDZ1m+wgascmiw==", + "requires": { + "@peculiar/asn1-schema": "^2.0.44", + "@peculiar/asn1-x509": "^2.0.44", + "@peculiar/asn1-x509-attr": "^2.0.44", + "asn1js": "^2.1.1", + "tslib": "^2.3.0" + } + }, + "@peculiar/asn1-csr": { + "version": "2.0.44", + "resolved": "https://registry.npmjs.org/@peculiar/asn1-csr/-/asn1-csr-2.0.44.tgz", + "integrity": "sha512-9FG9ySzLyYIlk/W3o/mpE+ukn/XMokv+BysqyhNGifUet362slp+uF4XliKGLt53TO53uYCsQimVyTK4vwe/yg==", + "requires": { + "@peculiar/asn1-schema": "^2.0.44", + "@peculiar/asn1-x509": "^2.0.44", + "asn1js": "^2.1.1", + "tslib": "^2.3.0" + } + }, + "@peculiar/asn1-ecc": { + "version": "2.0.44", + "resolved": "https://registry.npmjs.org/@peculiar/asn1-ecc/-/asn1-ecc-2.0.44.tgz", + "integrity": "sha512-GvfifE5xCZjEz9EsOl9gqTVgex9m7ATLloTaSE3Go+iG8bc7C/VDK8lOnFb3/UsCqfI46Gwh4Q3RQCP2JB3GDQ==", + "requires": { + "@peculiar/asn1-schema": "^2.0.44", + "@peculiar/asn1-x509": "^2.0.44", + "asn1js": "^2.1.1", + "tslib": "^2.3.0" + } + }, + "@peculiar/asn1-pfx": { + "version": "2.0.44", + "resolved": "https://registry.npmjs.org/@peculiar/asn1-pfx/-/asn1-pfx-2.0.44.tgz", + "integrity": "sha512-rVsGoZWMtensS9+AEtU97cImHXEu+Oi6K31/EzzzdqfUx/aF49RYCVKOyuCjUg5cwIOE93WsNm0hQFYB2pYwVQ==", + "requires": { + "@peculiar/asn1-cms": "^2.0.44", + "@peculiar/asn1-pkcs8": "^2.0.44", + "@peculiar/asn1-rsa": "^2.0.44", + "@peculiar/asn1-schema": "^2.0.44", + "asn1js": "^2.1.1", + "tslib": "^2.3.0" + } + }, + "@peculiar/asn1-pkcs8": { + "version": "2.0.44", + "resolved": "https://registry.npmjs.org/@peculiar/asn1-pkcs8/-/asn1-pkcs8-2.0.44.tgz", + "integrity": "sha512-cs/zGEv/6Jxx14tZ6NS82PNJFMCb4aFOiAFzv+I1I1ud7o5wyDGOOAIiIs4vI+Z6xtkoSyF+hWH51kRutdFV4A==", + "requires": { + "@peculiar/asn1-schema": "^2.0.44", + "@peculiar/asn1-x509": "^2.0.44", + "asn1js": "^2.1.1", + "tslib": "^2.3.0" + } + }, + "@peculiar/asn1-pkcs9": { + "version": "2.0.44", + "resolved": "https://registry.npmjs.org/@peculiar/asn1-pkcs9/-/asn1-pkcs9-2.0.44.tgz", + "integrity": "sha512-b54VRWsM5NdIOlSuBbfBeximwVQIHcUoUdx10mHM6QuvZlXKciVP/nkerxg0ytQzC5BvPbohfYuiq46gYCPZSA==", + "requires": { + "@peculiar/asn1-cms": "^2.0.44", + "@peculiar/asn1-pfx": "^2.0.44", + "@peculiar/asn1-pkcs8": "^2.0.44", + "@peculiar/asn1-schema": "^2.0.44", + "@peculiar/asn1-x509": "^2.0.44", + "@peculiar/asn1-x509-attr": "^2.0.44", + "asn1js": "^2.1.1", + "tslib": "^2.3.0" + } + }, + "@peculiar/asn1-rsa": { + "version": "2.0.44", + "resolved": "https://registry.npmjs.org/@peculiar/asn1-rsa/-/asn1-rsa-2.0.44.tgz", + "integrity": "sha512-DYfo33Yl3y4Bu8V0RrAhKBZJDy1ESEGQzKVl7DxCUJna164/U/JB767W9ze0Vlq7quTawUJLMX3RRfesEFGigA==", + "requires": { + "@peculiar/asn1-schema": "^2.0.44", + "@peculiar/asn1-x509": "^2.0.44", + "asn1js": "^2.1.1", + "tslib": "^2.3.0" + } + }, + "@peculiar/asn1-schema": { + "version": "2.0.44", + "resolved": "https://registry.npmjs.org/@peculiar/asn1-schema/-/asn1-schema-2.0.44.tgz", + "integrity": "sha512-uaCnjQ9A9WwQSMuDJcNOCYEPXTahgKbFMvI7eMOMd8lXgx0J1eU7F3BoMsK5PFxa3dVUxjSQbaOjfgGoeHGgoQ==", + "requires": { + "@types/asn1js": "^2.0.2", + "asn1js": "^2.1.1", + "pvtsutils": "^1.2.1", + "tslib": "^2.3.0" + } + }, + "@peculiar/asn1-x509": { + "version": "2.0.44", + "resolved": "https://registry.npmjs.org/@peculiar/asn1-x509/-/asn1-x509-2.0.44.tgz", + "integrity": "sha512-jKGy+7Ew1PADjzInblBaQWVdh9kTiy49lkTko/MiYg5lHyCi/N9xPtQCuincpY1UeNPwXaeoT2DXRJOuN6U/8A==", + "requires": { + "@peculiar/asn1-schema": "^2.0.44", + "asn1js": "^2.1.1", + "ipaddr.js": "^2.0.1", + "pvtsutils": "^1.2.1", + "tslib": "^2.3.0" + } + }, + "@peculiar/asn1-x509-attr": { + "version": "2.0.44", + "resolved": "https://registry.npmjs.org/@peculiar/asn1-x509-attr/-/asn1-x509-attr-2.0.44.tgz", + "integrity": "sha512-mYyf1fMT1JVrmPInjqVC3O2Vm3LBm7sd75Mg2hKB0A/zPKIYZ5WRz396lliucHagg17PalMjDOxtIQFOqs1WGg==", + "requires": { + "@peculiar/asn1-schema": "^2.0.44", + "@peculiar/asn1-x509": "^2.0.44", + "asn1js": "^2.1.1", + "tslib": "^2.3.0" + } + }, + "@peculiar/json-schema": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/@peculiar/json-schema/-/json-schema-1.1.12.tgz", + "integrity": "sha512-coUfuoMeIB7B8/NMekxaDzLhaYmp0HZNPEjYRm9goRou8UZIC3z21s0sL9AWoCw4EG876QyO3kYrc61WNF9B/w==", + "requires": { + "tslib": "^2.0.0" + } + }, + "@peculiar/webcrypto": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@peculiar/webcrypto/-/webcrypto-1.2.3.tgz", + "integrity": "sha512-q7wDfZy3k/tpnsYB23/MyyDkjn6IdHh8w+xwoVMS5cu6CjVoFzngXDZEOOuSE4zus2yO6ciQhhHxd4XkLpwVnQ==", + "requires": { + "@peculiar/asn1-schema": "^2.0.44", + "@peculiar/json-schema": "^1.1.12", + "pvtsutils": "^1.2.1", + "tslib": "^2.3.1", + "webcrypto-core": "^1.4.0" + } + }, + "@peculiar/x509": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/@peculiar/x509/-/x509-1.6.1.tgz", + "integrity": "sha512-C4oxpCuYasfjuhy6QRFJhs0R6gyeQSRsB7MsT6JkO3qaFi4b75mm8hNEKa+sIJPtTjXCC94tW9rHx1hw5dOvnQ==", + "requires": { + "@peculiar/asn1-cms": "^2.0.44", + "@peculiar/asn1-csr": "^2.0.44", + "@peculiar/asn1-ecc": "^2.0.44", + "@peculiar/asn1-pkcs9": "^2.0.44", + "@peculiar/asn1-rsa": "^2.0.44", + "@peculiar/asn1-schema": "^2.0.44", + "@peculiar/asn1-x509": "^2.0.44", + "pvtsutils": "^1.2.1", + "reflect-metadata": "^0.1.13", + "tslib": "^2.3.1", + "tsyringe": "^4.6.0" + } + }, "@scrypted/sdk": { "version": "file:../../sdk", "requires": { @@ -817,7 +1498,8 @@ "ts-node": "^10.4.0", "typedoc": "^0.22.8", "typescript-json-schema": "^0.50.1", - "webpack": "^5.59.0" + "webpack": "^5.59.0", + "webpack-bundle-analyzer": "^4.5.0" } }, "@servie/events": { @@ -825,6 +1507,19 @@ "resolved": "https://registry.npmjs.org/@servie/events/-/events-1.0.0.tgz", "integrity": "sha512-sBSO19KzdrJCM3gdx6eIxV8M9Gxfgg6iDQmH5TIAGaUu+X9VDdsINXJOnoiZ1Kx3TrHdH4bt5UVglkjsEGBcvw==" }, + "@shinyoshiaki/ebml-builder": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/@shinyoshiaki/ebml-builder/-/ebml-builder-0.0.1.tgz", + "integrity": "sha512-rz1LklnlZ0yvVIt924yRGu+R87Fhfa06BdRIZR6GF6SXVSBTD9wCQmN6opXQLuSkoKXleWJwF3PW1ls8DGZjtw==", + "requires": { + "lodash.memoize": "^4.1.2" + } + }, + "@types/asn1js": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@types/asn1js/-/asn1js-2.0.2.tgz", + "integrity": "sha512-t4YHCgtD+ERvH0FyxvNlYwJ2ezhqw7t+Ygh4urQ7dJER8i185JPv6oIM3ey5YQmGN6Zp9EMbpohkjZi9t3UxwA==" + }, "@types/debug": { "version": "4.1.5", "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.5.tgz", @@ -862,6 +1557,11 @@ "event-target-shim": "^5.0.0" } }, + "aes-js": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/aes-js/-/aes-js-3.1.2.tgz", + "integrity": "sha512-e5pEa2kBnBOgR4Y/p20pskXI74UEz7de8ZGVo58asOtvSVG5YAbJeELPZxOmt+Bnz3rX753YKhfIn4X4l1PPRQ==" + }, "agent-base": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", @@ -875,6 +1575,14 @@ "resolved": "https://registry.npmjs.org/arrify/-/arrify-2.0.1.tgz", "integrity": "sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==" }, + "asn1js": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/asn1js/-/asn1js-2.2.0.tgz", + "integrity": "sha512-oagLNqpfNv7CvmyMoexMDNyVDSiq1rya0AEUgcLlNHdHgNl6U/hi8xY370n5y+ZIFEXOx0J4B1qF2NDjMRxklA==", + "requires": { + "pvutils": "latest" + } + }, "axios": { "version": "0.21.4", "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.4.tgz", @@ -888,11 +1596,40 @@ "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==" }, + "big-integer": { + "version": "1.6.51", + "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.51.tgz", + "integrity": "sha512-GPEid2Y9QU1Exl1rpO9B2IPJGHPSupF5GnVIP0blYvNOMer2bTvSWs1jGOUg04hTmu67nmLsQ9TBo1puaotBHg==" + }, "bignumber.js": { "version": "9.0.2", "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.0.2.tgz", "integrity": "sha512-GAcQvbpsM0pUb0zw1EI0KhQEZ+lRwR5fYaAp3vPOYuP7aDvGy6cVN6XHLauvF8SOga2y0dcLcjt3iQDTSEliyw==" }, + "binary-data": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/binary-data/-/binary-data-0.6.0.tgz", + "integrity": "sha512-HGiT0ir03tS1u7iWdW5xjJfbPpvxH2qJbPFxXW0I3P5iOzkbjN/cJy5GlpAwmjHW5CiayGOxZ/ytLzXmYgdgqQ==", + "requires": { + "generate-function": "^2.3.1", + "is-plain-object": "^2.0.3" + } + }, + "bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" + }, + "brorand": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", + "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=" + }, + "buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=" + }, "buffer-equal-constant-time": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", @@ -921,6 +1658,11 @@ "safe-buffer": "^5.2.0" } }, + "date-fns": { + "version": "2.28.0", + "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.28.0.tgz", + "integrity": "sha512-8d35hViGYx/QH0icHYCeLmsLmMUheMmTyV9Fcm6gvNwdw31yXXH+O85sOBJ+OLnLQMKZowvpKb6FgMIQjcpvQw==" + }, "debug": { "version": "4.3.3", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", @@ -942,6 +1684,20 @@ "safe-buffer": "^5.0.1" } }, + "elliptic": { + "version": "6.5.4", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz", + "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==", + "requires": { + "bn.js": "^4.11.9", + "brorand": "^1.1.0", + "hash.js": "^1.0.0", + "hmac-drbg": "^1.0.1", + "inherits": "^2.0.4", + "minimalistic-assert": "^1.0.1", + "minimalistic-crypto-utils": "^1.0.1" + } + }, "event-target-shim": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", @@ -963,9 +1719,9 @@ "integrity": "sha1-mzERErxsYSehbgFsbF1/GeCAXFs=" }, "follow-redirects": { - "version": "1.14.6", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.6.tgz", - "integrity": "sha512-fhUl5EwSJbbl8AR+uYL2KQDxLkdSjZGR36xy46AO7cOMTrCMON6Sa28FmAnC2tRTDbd/Uuzz3aJBv7EBN7JH8A==" + "version": "1.14.7", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.7.tgz", + "integrity": "sha512-+hbxoLbFMbRKDwohX8GkTataGqO6Jb7jGwpAlwgy2bIz25XtRm7KEzJM76R1WiNT5SwZkX4Y75SwBolkpmE7iQ==" }, "function-bind": { "version": "1.1.1", @@ -993,6 +1749,14 @@ "json-bigint": "^1.0.0" } }, + "generate-function": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.3.1.tgz", + "integrity": "sha512-eeB5GfMNeevm/GRYq20ShmsaGcmI81kIX2K9XQx5miC8KdHaC6Jm0qQ8ZNeGOi7wYB8OsdxKs+Y2oVuTFuVwKQ==", + "requires": { + "is-property": "^1.0.2" + } + }, "get-intrinsic": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.0.1.tgz", @@ -1020,11 +1784,11 @@ } }, "google-p12-pem": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/google-p12-pem/-/google-p12-pem-3.1.2.tgz", - "integrity": "sha512-tjf3IQIt7tWCDsa0ofDQ1qqSCNzahXDxdAGJDbruWqu3eCg5CKLYKN+hi0s6lfvzYZ1GDVr+oDF9OOWlDSdf0A==", + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/google-p12-pem/-/google-p12-pem-3.1.3.tgz", + "integrity": "sha512-MC0jISvzymxePDVembypNefkAQp+DRP7dBE+zNUPaIjEspIlYg0++OrsNr248V9tPbz6iqtZ7rX1hxWA5B8qBQ==", "requires": { - "node-forge": "^0.10.0" + "node-forge": "^1.0.0" } }, "googleapis-common": { @@ -1063,6 +1827,25 @@ "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==" }, + "hash.js": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", + "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", + "requires": { + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.1" + } + }, + "hmac-drbg": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", + "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", + "requires": { + "hash.js": "^1.0.3", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.1" + } + }, "https-proxy-agent": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz", @@ -1072,16 +1855,54 @@ "debug": "4" } }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "int64-buffer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/int64-buffer/-/int64-buffer-1.0.1.tgz", + "integrity": "sha512-+3azY4pXrjAupJHU1V9uGERWlhoqNswJNji6aD/02xac7oxol508AsMC5lxKhEqyZeDFy3enq5OGWXF4u75hiw==" + }, + "ip": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", + "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=" + }, "ip-regex": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-2.1.0.tgz", "integrity": "sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk=" }, + "ipaddr.js": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.0.1.tgz", + "integrity": "sha512-1qTgH9NG+IIJ4yfKs2e6Pp1bZg8wbDbKHT21HrLIeYBTRLgMYKnMTPAuI3Lcs61nfx5h1xlXnbJtH1kX5/d/ng==" + }, + "is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "requires": { + "isobject": "^3.0.1" + } + }, + "is-property": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz", + "integrity": "sha1-V/4cTkhHTt1lsJkR8msc1Ald2oQ=" + }, "is-stream": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==" }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=" + }, "json-bigint": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/json-bigint/-/json-bigint-1.0.0.tgz", @@ -1090,6 +1911,11 @@ "bignumber.js": "^9.0.0" } }, + "jspack": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/jspack/-/jspack-0.0.4.tgz", + "integrity": "sha1-Mt01x/3LPjRWwY+7fvntC8YjgXc=" + }, "jwa": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/jwa/-/jwa-2.0.0.tgz", @@ -1114,6 +1940,11 @@ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" }, + "lodash.memoize": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", + "integrity": "sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=" + }, "lru-cache": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", @@ -1135,29 +1966,52 @@ "make-error": "^1.3.5" } }, + "minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==" + }, + "minimalistic-crypto-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", + "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=" + }, "ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, + "nano-time": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/nano-time/-/nano-time-1.0.0.tgz", + "integrity": "sha1-sFVPaa2J4i0JB/ehKwmTpdlhN+8=", + "requires": { + "big-integer": "^1.6.16" + } + }, "node-fetch": { - "version": "2.6.6", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.6.tgz", - "integrity": "sha512-Z8/6vRlTUChSdIgMa51jxQ4lrw/Jy5SOW10ObaA47/RElsAN2c5Pn8bTgFGWn/ibwzXTE8qwr1Yzx28vsecXEA==", + "version": "2.6.7", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", + "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", "requires": { "whatwg-url": "^5.0.0" } }, "node-forge": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.10.0.tgz", - "integrity": "sha512-PPmu8eEeG9saEUvI97fm4OYxXVB6bFvyNTyiUOBichBpFG8A1Ljw3bY62+5oOjDEMHRnd0Y7HQ+x7uzxOzC6JA==" + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.2.1.tgz", + "integrity": "sha512-Fcvtbb+zBcZXbTTVwqGA5W+MKBj56UjVRevvchv5XrcyXbmNdesfZL37nlcWOfpgHhgmxApw3tQbTr4CqNmX4w==" }, "object-inspect": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.9.0.tgz", "integrity": "sha512-i3Bp9iTqwhaLZBxGkRfo5ZbE07BQRT7MGu8+nNgwW9ItGp1TzCTw2DLEoWwjClxBjOFI/hWljTAmYGCEwmtnOw==" }, + "p-cancelable": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-2.1.1.tgz", + "integrity": "sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==" + }, "popsicle": { "version": "12.1.0", "resolved": "https://registry.npmjs.org/popsicle/-/popsicle-12.1.0.tgz", @@ -1224,6 +2078,19 @@ "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" }, + "pvtsutils": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/pvtsutils/-/pvtsutils-1.2.1.tgz", + "integrity": "sha512-Q867jEr30lBR2YSFFLZ0/XsEvpweqH6Kj096wmlRAFXrdRGPCNq2iz9B5Tk085EZ+OBZyYAVA5UhPkjSHGrUzQ==", + "requires": { + "tslib": "^2.3.1" + } + }, + "pvutils": { + "version": "1.0.17", + "resolved": "https://registry.npmjs.org/pvutils/-/pvutils-1.0.17.tgz", + "integrity": "sha512-wLHYUQxWaXVQvKnwIDWFVKDJku9XDCvyhhxoq8dc5MFdIlRenyPI9eSfEtcvgHgD7FlvCyGAlWgOzRnZD99GZQ==" + }, "qs": { "version": "6.10.0", "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.0.tgz", @@ -1248,11 +2115,21 @@ "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==" }, + "reflect-metadata": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.13.tgz", + "integrity": "sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg==" + }, "requires-port": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=" }, + "rx.mini": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/rx.mini/-/rx.mini-1.1.0.tgz", + "integrity": "sha512-SgejtK4cAYpORQeIfwY8DWkanwhi8DAmlJKaUjmcPjNlq6OLBix0qVTYtj2aXxh7tsvO34hd4PQpP263ZrcwYg==" + }, "safe-buffer": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", @@ -1325,6 +2202,36 @@ "resolved": "https://registry.npmjs.org/ts-expect/-/ts-expect-1.3.0.tgz", "integrity": "sha512-e4g0EJtAjk64xgnFPD6kTBUtpnMVzDrMb12N1YZV0VvSlhnVT3SGxiYTLdGy8Q5cYHOIC/FAHmZ10eGrAguicQ==" }, + "tslib": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", + "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==" + }, + "tsyringe": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/tsyringe/-/tsyringe-4.6.0.tgz", + "integrity": "sha512-BMQAZamSfEmIQzH8WJeRu1yZGQbPSDuI9g+yEiKZFIcO46GPZuMOC2d0b52cVBdw1d++06JnDSIIZvEnogMdAw==", + "requires": { + "tslib": "^1.9.3" + }, + "dependencies": { + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + } + } + }, + "turbo-crc32": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/turbo-crc32/-/turbo-crc32-1.0.1.tgz", + "integrity": "sha512-8yyRd1ZdNp+AQLGqi3lTaA2k81JjlIZOyFQEsi7GQWBgirnQOxjqVtDEbYHM2Z4yFdJ5AQw0fxBLLnDCl6RXoQ==" + }, + "tweetnacl": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-1.0.3.tgz", + "integrity": "sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw==" + }, "url-parse": { "version": "1.5.4", "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.4.tgz", @@ -1344,11 +2251,51 @@ "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==" }, + "webcrypto-core": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/webcrypto-core/-/webcrypto-core-1.4.0.tgz", + "integrity": "sha512-HY3Zo0GcRIQUUDnlZ/shGjN+4f7LVMkdJZoGPog+oHhJsJdMz6iM8Za5xZ0t6qg7Fx/JXXz+oBv2J2p982hGTQ==", + "requires": { + "@peculiar/asn1-schema": "^2.0.44", + "@peculiar/json-schema": "^1.1.12", + "asn1js": "^2.1.1", + "pvtsutils": "^1.2.0", + "tslib": "^2.3.1" + } + }, "webidl-conversions": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", "integrity": "sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE=" }, + "werift": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/werift/-/werift-0.14.5.tgz", + "integrity": "sha512-aUAMUJc3WKXqiXn7Qgs4xSj2dDHdPCDQ+keQieoOrBVtZP0T6icWR1i6Vom+ZAO4RQE2lR3kz3cTd4M8DT2opw==", + "requires": { + "@fidm/x509": "^1.2.1", + "@minhducsun2002/leb128": "^0.2.0", + "@peculiar/webcrypto": "^1.1.6", + "@peculiar/x509": "^1.2.2", + "@shinyoshiaki/ebml-builder": "^0.0.1", + "aes-js": "^3.1.2", + "binary-data": "^0.6.0", + "buffer-crc32": "^0.2.13", + "date-fns": "^2.27.0", + "debug": "^4.3.3", + "elliptic": "^6.5.3", + "int64-buffer": "^1.0.1", + "ip": "^1.1.5", + "jspack": "^0.0.4", + "lodash": "^4.17.20", + "nano-time": "^1.0.0", + "p-cancelable": "^2.1.1", + "rx.mini": "^1.1.0", + "turbo-crc32": "^1.0.1", + "tweetnacl": "^1.0.3", + "uuid": "^8.3.2" + } + }, "whatwg-url": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", diff --git a/plugins/google-device-access/package.json b/plugins/google-device-access/package.json index 4ea880b17..9304f9c57 100644 --- a/plugins/google-device-access/package.json +++ b/plugins/google-device-access/package.json @@ -22,6 +22,7 @@ "name": "Google Device Access", "type": "DeviceProvider", "interfaces": [ + "BufferConverter", "OauthClient", "DeviceProvider", "HttpRequestHandler", @@ -34,7 +35,8 @@ "client-oauth2": "^4.3.3", "lodash": "^4.17.21", "query-string": "^7.0.0", - "url-parse": "^1.5.1" + "url-parse": "^1.5.1", + "werift": "^0.14.5" }, "devDependencies": { "@scrypted/sdk": "file:../../sdk", diff --git a/plugins/google-device-access/src/main.ts b/plugins/google-device-access/src/main.ts index bd856f7d6..433068b7a 100644 --- a/plugins/google-device-access/src/main.ts +++ b/plugins/google-device-access/src/main.ts @@ -1,17 +1,20 @@ -import sdk, { DeviceManifest, DeviceProvider, HttpRequest, HttpRequestHandler, HttpResponse, HumiditySensor, MediaObject, MotionSensor, OauthClient, Refresh, ScryptedDeviceType, ScryptedInterface, Setting, Settings, TemperatureSetting, TemperatureUnit, Thermometer, ThermostatMode, VideoCamera, MediaStreamOptions, BinarySensor, DeviceInformation, ScryptedInterfaceProperty, BufferConverter, ScryptedMimeTypes } from '@scrypted/sdk'; +import sdk, { DeviceManifest, DeviceProvider, HttpRequest, HttpRequestHandler, HttpResponse, HumiditySensor, MediaObject, MotionSensor, OauthClient, Refresh, ScryptedDeviceType, ScryptedInterface, Setting, Settings, TemperatureSetting, TemperatureUnit, Thermometer, ThermostatMode, VideoCamera, MediaStreamOptions, BinarySensor, DeviceInformation, ScryptedInterfaceProperty, BufferConverter, ScryptedMimeTypes, RTCAVMessage, ScryptedDevice } from '@scrypted/sdk'; import { ScryptedDeviceBase } from '@scrypted/sdk'; import qs from 'query-string'; import ClientOAuth2 from 'client-oauth2'; import { URL } from 'url'; import axios from 'axios'; import throttle from 'lodash/throttle'; -import {} from '../../../common/src/wrtc-convertors'; +import { createRTCPeerConnectionSink } from '../../../common/src/wrtc-convertors'; import { randomBytes } from 'crypto'; const { deviceManager, mediaManager, endpointManager } = sdk; const refreshFrequency = 60; +const SdmSignalingPrefix = ScryptedMimeTypes.RTCAVSignalingPrefix + 'gda/'; +const SdmDeviceSignalingPrefix = ScryptedMimeTypes.RTCAVSignalingPrefix + 'gda/x-'; + function fromNestMode(mode: string): ThermostatMode { switch (mode) { case 'HEAT': @@ -48,23 +51,54 @@ function toNestMode(mode: ThermostatMode): string { } class NestCamera extends ScryptedDeviceBase implements VideoCamera, MotionSensor, BinarySensor, BufferConverter { + signalingMime: string; + constructor(public provider: GoogleSmartDeviceAccess, public device: any) { super(device.name.split('/').pop()); this.provider = provider; this.device = device; - // this plugin will return a media object mime that indicates it is an rtc signalling - // endpoint. + this.signalingMime = SdmDeviceSignalingPrefix + this.nativeId; - // create random mimes so signaling is directed to this camera. + // create a mime unique to this this camera. if (!this.fromMimeType || !this.toMimeType) { - this.fromMimeType = ScryptedMimeTypes.RTCAVServerPrefix + this.nativeId; - this.toMimeType = '*/*'; + this.fromMimeType = ScryptedMimeTypes.RTCAVOffer; + this.toMimeType = this.signalingMime; } } - convert(data: string | Buffer, fromMimeType: string): Promise { - throw new Error('Method not implemented.'); + async convert(data: string | Buffer, fromMimeType: string): Promise { + const offer: RTCAVMessage = JSON.parse(data.toString()); + const offerSdp = offer.description.sdp; + const offerParts = offerSdp.split('m='); + const audioPartIndex = offerParts.findIndex(part => part.startsWith('audio')); + const [audioPart] = offerParts.splice(audioPartIndex, 1); + offerParts.splice(1, 0, audioPart); + offer.description.sdp = offerParts.join('m='); + const answer = await this.sendOffer(offer); + return Buffer.from(JSON.stringify(answer)); + } + + async sendOffer(offer: RTCAVMessage): Promise { + const offerSdp = offer.description.sdp.replace('a=ice-options:trickle\r\n', ''); + + const result = await this.provider.authPost(`/devices/${this.nativeId}:executeCommand`, { + command: "sdm.devices.commands.CameraLiveStream.GenerateWebRtcStream", + params: { + offerSdp, + }, + }); + const {answerSdp} = result.data.results; + const answer: RTCAVMessage = { + id: undefined, + description: { + sdp: answerSdp, + type: 'answer', + }, + candidates: [], + configuration: undefined, + } + return answer; } createFFmpegMediaObject(result: any) { @@ -99,9 +133,11 @@ class NestCamera extends ScryptedDeviceBase implements VideoCamera, MotionSensor }); } - async getVideoStream(options?: MediaStreamOptions): Promise { - const isWebRtc = this.device?.traits?.['sdm.devices.traits.CameraLiveStream']?.supportedProtocols?.includes('WEB_RTC'); + get isWebRtc() { + return this.device?.traits?.['sdm.devices.traits.CameraLiveStream']?.supportedProtocols?.includes('WEB_RTC'); + } + async getVideoStream(options?: MediaStreamOptions): Promise { if (options?.metadata?.streamExtensionToken) { const { streamExtensionToken } = options?.metadata; const result = await this.provider.authPost(`/devices/${this.nativeId}:executeCommand`, { @@ -114,12 +150,8 @@ class NestCamera extends ScryptedDeviceBase implements VideoCamera, MotionSensor return this.createFFmpegMediaObject(result); } - if (isWebRtc) { - const result = await this.provider.authPost(`/devices/${this.nativeId}:executeCommand`, { - command: "sdm.devices.commands.CameraLiveStream.GenerateWebRtcStream", - params: {} - }); - this.console.log(result); + if (this.isWebRtc) { + return mediaManager.createMediaObject(Buffer.alloc(0), this.signalingMime); } else { const result = await this.provider.authPost(`/devices/${this.nativeId}:executeCommand`, { @@ -130,7 +162,31 @@ class NestCamera extends ScryptedDeviceBase implements VideoCamera, MotionSensor } } async getVideoStreamOptions(): Promise { - return; + if (!this.isWebRtc) { + return [ + { + container: 'rtsp', + video: { + codec: 'h264', + }, + audio: { + codec: 'aac', + }, + }, + ] + } + + return [ + { + container: this.signalingMime, + video: { + codec: 'h264', + }, + audio: { + codec: 'pcm', + }, + } + ] } } @@ -311,9 +367,10 @@ class NestThermostat extends ScryptedDeviceBase implements HumiditySensor, Therm } } -class GoogleSmartDeviceAccess extends ScryptedDeviceBase implements OauthClient, DeviceProvider, Settings, HttpRequestHandler { +class GoogleSmartDeviceAccess extends ScryptedDeviceBase implements OauthClient, DeviceProvider, Settings, HttpRequestHandler, BufferConverter { token: ClientOAuth2.Token; - devices = new Map(); + nestDevices = new Map(); + devices = new Map(); clientId: string; clientSecret: string; @@ -355,7 +412,7 @@ class GoogleSmartDeviceAccess extends ScryptedDeviceBase implements OauthClient, super(); this.updateClient(); - this.startup = (async() => { + this.startup = (async () => { while (true) { try { await this.discoverDevices(0); @@ -366,6 +423,22 @@ class GoogleSmartDeviceAccess extends ScryptedDeviceBase implements OauthClient, } } })(); + + this.fromMimeType = SdmSignalingPrefix + '*'; + this.toMimeType = ScryptedMimeTypes.FFmpegInput; + } + + async convert(data: string | Buffer, fromMimeType: string): Promise { + const nativeId = fromMimeType.substring(SdmDeviceSignalingPrefix.length); + let device: NestCamera; + for (const d of this.devices.values()) { + if (d.nativeId.toLowerCase() === nativeId) { + device = d as NestCamera; + break; + } + } + const result = await createRTCPeerConnectionSink(device.console, mediaManager, offer => device.sendOffer(offer)); + return Buffer.from(JSON.stringify(result.ffmpegInput)); } async onRequest(request: HttpRequest, response: HttpResponse): Promise { @@ -376,7 +449,7 @@ class GoogleSmartDeviceAccess extends ScryptedDeviceBase implements OauthClient, const events = payload.resourceUpdate?.events; const nativeId = payload.resourceUpdate?.name.split('/').pop(); - const device = this.devices.get(nativeId); + const device = this.nestDevices.get(nativeId); if (device) { if (traits) { Object.assign(device.traits, traits); @@ -539,14 +612,14 @@ class GoogleSmartDeviceAccess extends ScryptedDeviceBase implements OauthClient, const deviceManifest: DeviceManifest = { devices: [], }; - this.devices.clear(); + this.nestDevices.clear(); for (const device of data.devices) { const nativeId = device.name.split('/').pop(); const info: DeviceInformation = { manufacturer: 'Nest', }; if (device.type === 'sdm.devices.types.THERMOSTAT') { - this.devices.set(nativeId, device); + this.nestDevices.set(nativeId, device); deviceManifest.devices.push({ name: device.traits?.['sdm.devices.traits.Info']?.customName || device.parentRelations?.[0]?.displayName, @@ -562,9 +635,10 @@ class GoogleSmartDeviceAccess extends ScryptedDeviceBase implements OauthClient, }) } else if (device.type === 'sdm.devices.types.CAMERA' || device.type === 'sdm.devices.types.DOORBELL') { - this.devices.set(nativeId, device); + this.nestDevices.set(nativeId, device); const interfaces = [ + ScryptedInterface.BufferConverter, ScryptedInterface.VideoCamera, ScryptedInterface.MotionSensor, ]; @@ -590,15 +664,19 @@ class GoogleSmartDeviceAccess extends ScryptedDeviceBase implements OauthClient, async getDevice(nativeId: string) { await this.startup; - const device = this.devices.get(nativeId); + let found = this.devices.get(nativeId); + if (found) + return found; + const device = this.nestDevices.get(nativeId); if (!device) return; - if (device.type === 'sdm.devices.types.THERMOSTAT') { - return new NestThermostat(this, device); - } - else if (device.type === 'sdm.devices.types.CAMERA' || device.type === 'sdm.devices.types.DOORBELL') { - return new NestCamera(this, device); - } + if (device.type === 'sdm.devices.types.THERMOSTAT') + found = new NestThermostat(this, device); + else if (device.type === 'sdm.devices.types.CAMERA' || device.type === 'sdm.devices.types.DOORBELL') + found = new NestCamera(this, device); + + this.devices.set(nativeId, found); + return found; } }