From bac79fb2084f92be0775d61f9a1ec34ba5dd5b7a Mon Sep 17 00:00:00 2001 From: "greenkeeper[bot]" <23040076+greenkeeper[bot]@users.noreply.github.com> Date: Tue, 28 Apr 2020 09:25:44 +0000 Subject: [PATCH 1/7] fix(package): update snyk to version 1.314.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 372adebc..8fc33da4 100644 --- a/package.json +++ b/package.json @@ -134,7 +134,7 @@ "lodash": "^4.17.15", "ndarray": "^1.0.19", "ndarray-linear-interpolate": "^1.0.0", - "snyk": "~1.312.0" + "snyk": "~1.314.0" }, "snyk": true, "greenkeeper": { From 21728f18e5161954eb4315e3f937c71c9ba06361 Mon Sep 17 00:00:00 2001 From: "greenkeeper[bot]" <23040076+greenkeeper[bot]@users.noreply.github.com> Date: Tue, 28 Apr 2020 09:25:49 +0000 Subject: [PATCH 2/7] chore(package): update lockfile package-lock.json --- package-lock.json | 205 +++++++++++++++------------------------------- 1 file changed, 67 insertions(+), 138 deletions(-) diff --git a/package-lock.json b/package-lock.json index c3f40d10..67b51fa9 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8,7 +8,6 @@ "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz", "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==", - "dev": true, "requires": { "@babel/highlight": "^7.8.3" } @@ -318,8 +317,7 @@ "@babel/helper-validator-identifier": { "version": "7.9.5", "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.9.5.tgz", - "integrity": "sha512-/8arLKUFq882w4tWGj9JYzRpAlZgiWUJ+dtteNTDqrRBz9Iguck9Rn3ykuBDoUwh2TO4tSAJlrxDUOXWklJe4g==", - "dev": true + "integrity": "sha512-/8arLKUFq882w4tWGj9JYzRpAlZgiWUJ+dtteNTDqrRBz9Iguck9Rn3ykuBDoUwh2TO4tSAJlrxDUOXWklJe4g==" }, "@babel/helper-wrap-function": { "version": "7.8.3", @@ -348,7 +346,6 @@ "version": "7.9.0", "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.9.0.tgz", "integrity": "sha512-lJZPilxX7Op3Nv/2cvFdnlepPXDxi29wxteT57Q965oc5R9v86ztx0jfxVrTcBk8C2kcPkkDa2Z4T3ZsPPVWsQ==", - "dev": true, "requires": { "@babel/helper-validator-identifier": "^7.9.0", "chalk": "^2.0.0", @@ -1236,9 +1233,9 @@ "integrity": "sha512-nI7ELxukf7pT4/VraL4iabtNNMz8mUo7EXlqCFld8O5z6mIMLX9llps24iPpaIZOwArkY3FWA+4t+ixyvtTSIA==" }, "@snyk/java-call-graph-builder": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/@snyk/java-call-graph-builder/-/java-call-graph-builder-1.3.4.tgz", - "integrity": "sha512-3KXA5hTqvn6EZBEyMhA5zj0QCzu1WBPVBeUbQ4sNfftbVgfy/OFc9I/NPi39ALA2+tFYl1aKVIy1ECRea4Mc1w==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@snyk/java-call-graph-builder/-/java-call-graph-builder-1.4.0.tgz", + "integrity": "sha512-trqI8w9yMjAEeg+toWO1m/YsCJJSREP8KJnxNjBnSBhVKl/4vwSRlKXaYcd4ftQR5otrbJQsd/9+3OSWcfuKeQ==", "requires": { "ci-info": "^2.0.0", "debug": "^4.1.1", @@ -1279,6 +1276,25 @@ } } }, + "@snyk/rpm-parser": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@snyk/rpm-parser/-/rpm-parser-1.0.2.tgz", + "integrity": "sha512-HaMgPv2oJ7+JMyh4X3SoF2Bo8E0ORdETJ6x8Vz6X16hSmBoNjWdbked59BYGbMSm3dJeGr+vR268vd+KidNbRQ==", + "requires": { + "@types/node": "8.10.59", + "eslint": "6.8.0", + "event-loop-spinner": "1.1.0", + "tslib": "1.11.1", + "typescript": "3.8.3" + }, + "dependencies": { + "@types/node": { + "version": "8.10.59", + "resolved": "https://registry.npmjs.org/@types/node/-/node-8.10.59.tgz", + "integrity": "sha512-8RkBivJrDCyPpBXhVZcjh7cQxVBSmRk9QM7hOketZzp6Tg79c0N8kkpAIito9bnJ3HCVCHVYz+KHTEbfQNfeVQ==" + } + } + }, "@snyk/ruby-semver": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/@snyk/ruby-semver/-/ruby-semver-2.1.2.tgz", @@ -1335,14 +1351,6 @@ "@types/node": "*" } }, - "@types/bunyan": { - "version": "1.8.6", - "resolved": "https://registry.npmjs.org/@types/bunyan/-/bunyan-1.8.6.tgz", - "integrity": "sha512-YiozPOOsS6bIuz31ilYqR5SlLif4TBWsousN2aCWLi5233nZSX19tFbcQUPdR7xJ8ypPyxkCGNxg0CIV5n9qxQ==", - "requires": { - "@types/node": "*" - } - }, "@types/chai": { "version": "4.2.11", "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.2.11.tgz", @@ -1352,8 +1360,7 @@ "@types/color-name": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz", - "integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==", - "dev": true + "integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==" }, "@types/debug": { "version": "4.1.5", @@ -1409,15 +1416,6 @@ "csstype": "^2.2.0" } }, - "@types/restify": { - "version": "4.3.6", - "resolved": "https://registry.npmjs.org/@types/restify/-/restify-4.3.6.tgz", - "integrity": "sha512-4l4f0EXnleXQttlhRCXtTuJ8UelsKiAKIK2AAEd2epBHu41aEbM0U2z6E5tUrNwlbxz7qaNBISduGMeg+G3PaA==", - "requires": { - "@types/bunyan": "*", - "@types/node": "*" - } - }, "@types/semver": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/@types/semver/-/semver-5.5.0.tgz", @@ -1675,14 +1673,12 @@ "acorn": { "version": "7.1.1", "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.1.1.tgz", - "integrity": "sha512-add7dgA5ppRPxCFJoAGfMDi7PIBXq1RtGo7BhbLaxwrXPOmw8gq48Y9ozT01hUKy9byMjlR20EJhu5zlkErEkg==", - "dev": true + "integrity": "sha512-add7dgA5ppRPxCFJoAGfMDi7PIBXq1RtGo7BhbLaxwrXPOmw8gq48Y9ozT01hUKy9byMjlR20EJhu5zlkErEkg==" }, "acorn-jsx": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.2.0.tgz", - "integrity": "sha512-HiUX/+K2YpkpJ+SzBffkM/AQ2YE03S0U1kjTLVpoJdhZMOWy8qvXVN9JdLqv2QsaQ6MPYQIuNmwD8zOiYUofLQ==", - "dev": true + "integrity": "sha512-HiUX/+K2YpkpJ+SzBffkM/AQ2YE03S0U1kjTLVpoJdhZMOWy8qvXVN9JdLqv2QsaQ6MPYQIuNmwD8zOiYUofLQ==" }, "after": { "version": "0.8.1", @@ -1935,8 +1931,7 @@ "astral-regex": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", - "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==", - "dev": true + "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==" }, "async": { "version": "1.5.2", @@ -2850,8 +2845,7 @@ "callsites": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==" }, "camelcase": { "version": "4.1.0", @@ -3914,7 +3908,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", - "dev": true, "requires": { "esutils": "^2.0.2" } @@ -4236,7 +4229,6 @@ "version": "6.8.0", "resolved": "https://registry.npmjs.org/eslint/-/eslint-6.8.0.tgz", "integrity": "sha512-K+Iayyo2LtyYhDSYwz5D5QdWw0hCacNzyq1Y821Xna2xSJj7cijoLLYmLxTQgcgZ9mC61nryMy9S7GRbYpI5Ig==", - "dev": true, "requires": { "@babel/code-frame": "^7.0.0", "ajv": "^6.10.0", @@ -4281,7 +4273,6 @@ "version": "4.3.1", "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.1.tgz", "integrity": "sha512-JWF7ocqNrp8u9oqpgV+wH5ftbt+cfvv+PTjOvKLT3AdYly/LmORARfEVT1iyjwN+4MqE5UmVKoAdIBqeoCHgLA==", - "dev": true, "requires": { "type-fest": "^0.11.0" }, @@ -4289,22 +4280,19 @@ "type-fest": { "version": "0.11.0", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.11.0.tgz", - "integrity": "sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ==", - "dev": true + "integrity": "sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ==" } } }, "ansi-regex": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", - "dev": true + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" }, "ansi-styles": { "version": "4.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", - "dev": true, "requires": { "@types/color-name": "^1.1.1", "color-convert": "^2.0.1" @@ -4314,7 +4302,6 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", - "dev": true, "requires": { "restore-cursor": "^3.1.0" } @@ -4323,7 +4310,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, "requires": { "color-name": "~1.1.4" } @@ -4331,14 +4317,12 @@ "color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, "cross-spawn": { "version": "6.0.5", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", - "dev": true, "requires": { "nice-try": "^1.0.4", "path-key": "^2.0.1", @@ -4350,8 +4334,7 @@ "semver": { "version": "5.7.1", "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" } } }, @@ -4359,7 +4342,6 @@ "version": "4.1.1", "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "dev": true, "requires": { "ms": "^2.1.1" } @@ -4367,14 +4349,12 @@ "emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" }, "figures": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", - "dev": true, "requires": { "escape-string-regexp": "^1.0.5" } @@ -4383,7 +4363,6 @@ "version": "5.1.1", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz", "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==", - "dev": true, "requires": { "is-glob": "^4.0.1" } @@ -4392,7 +4371,6 @@ "version": "12.4.0", "resolved": "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz", "integrity": "sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==", - "dev": true, "requires": { "type-fest": "^0.8.1" } @@ -4400,14 +4378,12 @@ "has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" }, "inquirer": { "version": "7.1.0", "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.1.0.tgz", "integrity": "sha512-5fJMWEmikSYu0nv/flMc475MhGbB7TSPd/2IpFV4I4rMklboCH2rQjYY5kKiYGHqUF9gvaambupcJFFG9dvReg==", - "dev": true, "requires": { "ansi-escapes": "^4.2.1", "chalk": "^3.0.0", @@ -4428,7 +4404,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "dev": true, "requires": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -4438,7 +4413,6 @@ "version": "6.0.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "dev": true, "requires": { "ansi-regex": "^5.0.0" } @@ -4448,26 +4422,22 @@ "is-fullwidth-code-point": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" }, "mimic-fn": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "dev": true + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==" }, "mute-stream": { "version": "0.0.8", "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", - "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", - "dev": true + "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==" }, "onetime": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.0.tgz", "integrity": "sha512-5NcSkPHhwTVFIQN+TUqXoS5+dlElHXdpAWu9I0HP20YOtIi+aZ0Ct82jdlILDxjLEAWwvm+qj1m6aEtsDVmm6Q==", - "dev": true, "requires": { "mimic-fn": "^2.1.0" } @@ -4476,7 +4446,6 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", - "dev": true, "requires": { "onetime": "^5.1.0", "signal-exit": "^3.0.2" @@ -4486,7 +4455,6 @@ "version": "4.2.0", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", - "dev": true, "requires": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -4497,7 +4465,6 @@ "version": "6.0.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "dev": true, "requires": { "ansi-regex": "^5.0.0" } @@ -4507,14 +4474,12 @@ "strip-json-comments": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.0.tgz", - "integrity": "sha512-e6/d0eBu7gHtdCqFt0xJr642LdToM5/cN4Qb9DbHjVx1CP5RyeM+zH7pbecEmDv/lBqb0QH+6Uqq75rxFPkM0w==", - "dev": true + "integrity": "sha512-e6/d0eBu7gHtdCqFt0xJr642LdToM5/cN4Qb9DbHjVx1CP5RyeM+zH7pbecEmDv/lBqb0QH+6Uqq75rxFPkM0w==" }, "supports-color": { "version": "7.1.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", - "dev": true, "requires": { "has-flag": "^4.0.0" } @@ -4525,7 +4490,6 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.0.0.tgz", "integrity": "sha512-oYrhJW7S0bxAFDvWqzvMPRm6pcgcnWc4QnofCAqRTRfQC0JcwenzGglTtsLyIuuWFfkqDG9vz67cnttSd53djw==", - "dev": true, "requires": { "esrecurse": "^4.1.0", "estraverse": "^4.1.1" @@ -4535,7 +4499,6 @@ "version": "1.4.3", "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.4.3.tgz", "integrity": "sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q==", - "dev": true, "requires": { "eslint-visitor-keys": "^1.1.0" } @@ -4543,14 +4506,12 @@ "eslint-visitor-keys": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.1.0.tgz", - "integrity": "sha512-8y9YjtM1JBJU/A9Kc+SbaOV4y29sSWckBwMHa+FGtVj5gN/sbnKDf6xJUl+8g7FAij9LVaP8C24DUiH/f/2Z9A==", - "dev": true + "integrity": "sha512-8y9YjtM1JBJU/A9Kc+SbaOV4y29sSWckBwMHa+FGtVj5gN/sbnKDf6xJUl+8g7FAij9LVaP8C24DUiH/f/2Z9A==" }, "espree": { "version": "6.2.1", "resolved": "https://registry.npmjs.org/espree/-/espree-6.2.1.tgz", "integrity": "sha512-ysCxRQY3WaXJz9tdbWOwuWr5Y/XrPTGX9Kiz3yoUXwW0VZ4w30HTkQLaGx/+ttFjF8i+ACbArnB4ce68a9m5hw==", - "dev": true, "requires": { "acorn": "^7.1.1", "acorn-jsx": "^5.2.0", @@ -4566,7 +4527,6 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.2.1.tgz", "integrity": "sha512-/IcAXa9GWOX9BUIb/Tz2QrrAWFWzWGrFIeLeMRwtiuwg9qTFhSYemsi9DixwrFFqVbhBZ47vGcxEnu5mbPqbig==", - "dev": true, "requires": { "estraverse": "^5.0.0" }, @@ -4574,8 +4534,7 @@ "estraverse": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.0.0.tgz", - "integrity": "sha512-j3acdrMzqrxmJTNj5dbr1YbjacrYgAxVMeF0gK16E3j494mOe7xygM/ZLIguEQ0ETwAg2hlJCtHRGav+y0Ny5A==", - "dev": true + "integrity": "sha512-j3acdrMzqrxmJTNj5dbr1YbjacrYgAxVMeF0gK16E3j494mOe7xygM/ZLIguEQ0ETwAg2hlJCtHRGav+y0Ny5A==" } } }, @@ -4583,7 +4542,6 @@ "version": "4.2.1", "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz", "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==", - "dev": true, "requires": { "estraverse": "^4.1.0" } @@ -5015,7 +4973,6 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-5.0.1.tgz", "integrity": "sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==", - "dev": true, "requires": { "flat-cache": "^2.0.1" } @@ -5177,7 +5134,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-2.0.1.tgz", "integrity": "sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==", - "dev": true, "requires": { "flatted": "^2.0.0", "rimraf": "2.6.3", @@ -5188,7 +5144,6 @@ "version": "2.6.3", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", - "dev": true, "requires": { "glob": "^7.1.3" } @@ -5198,8 +5153,7 @@ "flatted": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.2.tgz", - "integrity": "sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA==", - "dev": true + "integrity": "sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA==" }, "flush-write-stream": { "version": "1.1.1", @@ -5917,8 +5871,7 @@ "functional-red-black-tree": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", - "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", - "dev": true + "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=" }, "generate-function": { "version": "2.3.1", @@ -6690,8 +6643,7 @@ "ignore": { "version": "4.0.6", "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", - "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", - "dev": true + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==" }, "immediate": { "version": "3.0.6", @@ -6702,7 +6654,6 @@ "version": "3.2.1", "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.2.1.tgz", "integrity": "sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ==", - "dev": true, "requires": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" @@ -6711,8 +6662,7 @@ "resolve-from": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==" } } }, @@ -6952,8 +6902,7 @@ "is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", - "dev": true + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=" }, "is-finite": { "version": "1.1.0", @@ -6970,7 +6919,6 @@ "version": "4.0.1", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", - "dev": true, "requires": { "is-extglob": "^2.1.1" } @@ -7353,8 +7301,7 @@ "js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" }, "js-yaml": { "version": "3.13.1", @@ -7395,8 +7342,7 @@ "json-stable-stringify-without-jsonify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", - "dev": true + "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=" }, "json-stringify-safe": { "version": "5.0.1", @@ -8311,7 +8257,6 @@ "version": "0.5.5", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", - "dev": true, "requires": { "minimist": "^1.2.5" } @@ -8469,8 +8414,7 @@ "natural-compare": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", - "dev": true + "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=" }, "nconf": { "version": "0.10.0", @@ -10566,7 +10510,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dev": true, "requires": { "callsites": "^3.0.0" } @@ -11554,8 +11497,7 @@ "regexpp": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-2.0.1.tgz", - "integrity": "sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==", - "dev": true + "integrity": "sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==" }, "regexpu-core": { "version": "4.7.0", @@ -11996,7 +11938,6 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz", "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==", - "dev": true, "requires": { "ansi-styles": "^3.2.0", "astral-regex": "^1.0.0", @@ -12146,9 +12087,9 @@ } }, "snyk": { - "version": "1.312.0", - "resolved": "https://registry.npmjs.org/snyk/-/snyk-1.312.0.tgz", - "integrity": "sha512-9K6H5qetQl6vy33p0a409H5Kohx6q6uO4XkRfkw8x3Jz2fav++jKn0nWu520a8oC8VshFBjqKo3s5VgplB+MiA==", + "version": "1.314.0", + "resolved": "https://registry.npmjs.org/snyk/-/snyk-1.314.0.tgz", + "integrity": "sha512-LRApaVgviFvOjf/ybY19f9Nwdi5dOODB+ZIBxHWgvZlNswWrk7VqL60JVv/UDc/u3Zb8U2HA73lCLbyrvj00Eg==", "requires": { "@snyk/cli-interface": "^2.4.0", "@snyk/configstore": "^3.2.0-rc1", @@ -12158,7 +12099,6 @@ "@snyk/snyk-cocoapods-plugin": "2.1.1", "@snyk/update-notifier": "^2.5.1-rc2", "@types/agent-base": "^4.2.0", - "@types/restify": "^4.3.6", "abbrev": "^1.1.1", "ansi-escapes": "3.2.0", "chalk": "^2.4.2", @@ -12177,11 +12117,11 @@ "proxy-from-env": "^1.0.0", "semver": "^6.0.0", "snyk-config": "^2.2.1", - "snyk-docker-plugin": "2.6.1", + "snyk-docker-plugin": "2.10.0", "snyk-go-plugin": "1.13.0", "snyk-gradle-plugin": "3.2.5", "snyk-module": "1.9.1", - "snyk-mvn-plugin": "2.10.0", + "snyk-mvn-plugin": "2.11.0", "snyk-nodejs-lockfile-parser": "1.21.0", "snyk-nuget-plugin": "1.16.0", "snyk-php-plugin": "1.7.0", @@ -12211,10 +12151,11 @@ } }, "snyk-docker-plugin": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/snyk-docker-plugin/-/snyk-docker-plugin-2.6.1.tgz", - "integrity": "sha512-v3LIPILRL5faZ+qiIhF9on0rAxuFaQku3UwaiGumoTrfXywLkv7x8PJgdMnrsWUxDwB8EZFc1k2qvI6V6rTF5g==", + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/snyk-docker-plugin/-/snyk-docker-plugin-2.10.0.tgz", + "integrity": "sha512-AwEiluEmH1l0nkTWqGwzIZQd267aFOB3y1VLZ9UYGhHAZLhfK9PwAWWjKcQ5/nY3hvT/Rh8fnCfKRU96Zi5YcQ==", "requires": { + "@snyk/rpm-parser": "^1.0.2", "debug": "^4.1.1", "dockerfile-ast": "0.0.19", "event-loop-spinner": "^1.1.0", @@ -12313,17 +12254,17 @@ } }, "snyk-mvn-plugin": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/snyk-mvn-plugin/-/snyk-mvn-plugin-2.10.0.tgz", - "integrity": "sha512-npslocHJXUbdFxehMPQ8w4oX6bB6J6vHTWNRDF7u2+pIhVumQe1QOvZGjwh3up+vOCoKiEprO7gdt7vC8im1Vg==", + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/snyk-mvn-plugin/-/snyk-mvn-plugin-2.11.0.tgz", + "integrity": "sha512-8o/SWDQJq1VQGZYkdtR0tKSC304rpbhncZAtRWnsTmprpEsRe7QSH+t8lnHgTZyUBi9ZS6EGAbKOwrR3cC6BsA==", "requires": { "@snyk/cli-interface": "2.4.0", - "@snyk/java-call-graph-builder": "^1.3.4", + "@snyk/java-call-graph-builder": "1.4.0", "debug": "^4.1.1", "lodash": "^4.17.15", "needle": "^2.4.0", "tmp": "^0.1.0", - "tslib": "1.11.0" + "tslib": "1.11.1" }, "dependencies": { "debug": { @@ -12341,11 +12282,6 @@ "requires": { "rimraf": "^2.6.3" } - }, - "tslib": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.11.0.tgz", - "integrity": "sha512-BmndXUtiTn/VDDrJzQE7Mm22Ix3PxgLltW9bSNLoeCY31gnG2OPx0QqJnuc9oMIKioYrz487i6K9o4Pdn0j+Kg==" } } }, @@ -13035,7 +12971,6 @@ "version": "5.4.6", "resolved": "https://registry.npmjs.org/table/-/table-5.4.6.tgz", "integrity": "sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==", - "dev": true, "requires": { "ajv": "^6.10.2", "lodash": "^4.17.14", @@ -13047,7 +12982,6 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "dev": true, "requires": { "emoji-regex": "^7.0.1", "is-fullwidth-code-point": "^2.0.0", @@ -13270,8 +13204,7 @@ "text-table": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", - "dev": true + "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=" }, "then-fs": { "version": "2.0.0", @@ -13478,8 +13411,7 @@ "type-fest": { "version": "0.8.1", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", - "dev": true + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==" }, "type-is": { "version": "1.6.18", @@ -13500,8 +13432,7 @@ "typescript": { "version": "3.8.3", "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.8.3.tgz", - "integrity": "sha512-MYlEfn5VrLNsgudQTVJeNaQFUAI7DkhnOjdpAp4T+ku1TfQClewlbSuTVHiA+8skNBgaf02TL/kLOvig4y3G8w==", - "dev": true + "integrity": "sha512-MYlEfn5VrLNsgudQTVJeNaQFUAI7DkhnOjdpAp4T+ku1TfQClewlbSuTVHiA+8skNBgaf02TL/kLOvig4y3G8w==" }, "uglify-js": { "version": "3.9.0", @@ -13805,8 +13736,7 @@ "v8-compile-cache": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.1.0.tgz", - "integrity": "sha512-usZBT3PW+LOjM25wbqIlZwPeJV+3OSz3M1k1Ws8snlW39dZyYL9lOGC5FgPVHfk0jKmjiDV8Z0mIbVQPiwFs7g==", - "dev": true + "integrity": "sha512-usZBT3PW+LOjM25wbqIlZwPeJV+3OSz3M1k1Ws8snlW39dZyYL9lOGC5FgPVHfk0jKmjiDV8Z0mIbVQPiwFs7g==" }, "v8flags": { "version": "3.1.3", @@ -14363,7 +14293,6 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/write/-/write-1.0.3.tgz", "integrity": "sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==", - "dev": true, "requires": { "mkdirp": "^0.5.1" } From 6f666e437d3412553c4d1738f254b4b652ae4b23 Mon Sep 17 00:00:00 2001 From: Eric Blade Date: Thu, 16 Apr 2020 10:57:19 -0400 Subject: [PATCH 3/7] separate most Quagga module code outside of the static interface to a class - after this commit, there should be no functional change, but the bulk of the code outside the static interface has been moved to a class, instead of global variables. An instance of that class is created at the top as a global. --- src/config/config.ts | 1 + src/input/camera_access.ts | 4 +- src/quagga.js | 236 ++----------------------------- src/quagga/getViewPort.ts | 2 +- src/quagga/initBuffers.ts | 2 +- src/quagga/quagga.ts | 244 +++++++++++++++++++++++++++++++++ src/quagga/setupInputStream.ts | 4 +- type-definitions/quagga.d.ts | 9 +- 8 files changed, 266 insertions(+), 236 deletions(-) create mode 100644 src/quagga/quagga.ts diff --git a/src/config/config.ts b/src/config/config.ts index 0e64efc1..6b9ce92f 100644 --- a/src/config/config.ts +++ b/src/config/config.ts @@ -5,6 +5,7 @@ import * as ProdConfig from './config.prod'; declare var ENV: QuaggaBuildEnvironment; +// @ts-ignore // TODO: this produces a bizarre typescript error const QuaggaConfig: QuaggaJSConfigObject = ENV.development ? DevConfig : ENV.node diff --git a/src/input/camera_access.ts b/src/input/camera_access.ts index 5cb7ec98..23a8e198 100644 --- a/src/input/camera_access.ts +++ b/src/input/camera_access.ts @@ -69,7 +69,7 @@ function deprecatedConstraints(videoConstraints: MediaTrackConstraintsWithDeprec return normalized; } -export function pickConstraints(videoConstraints: MediaTrackConstraintsWithDeprecated): Promise { +export function pickConstraints(videoConstraints: MediaTrackConstraintsWithDeprecated = {}): Promise { const video = deprecatedConstraints(videoConstraints); if (video && video.deviceId && video.facingMode) { @@ -95,7 +95,7 @@ function getActiveTrack(): MediaStreamTrack | null { * Used for accessing information about the active stream track and available video devices. */ const QuaggaJSCameraAccess = { - request: function(video: HTMLVideoElement, videoConstraints: MediaTrackConstraintsWithDeprecated): Promise { + request: function(video: HTMLVideoElement, videoConstraints?: MediaTrackConstraintsWithDeprecated): Promise { return pickConstraints(videoConstraints) .then((newConstraints) => initCamera(video, newConstraints)) .catch(err => { diff --git a/src/quagga.js b/src/quagga.js index eb7f0781..9ee1da11 100644 --- a/src/quagga.js +++ b/src/quagga.js @@ -1,6 +1,5 @@ import TypeDefs from './common/typedefs'; // eslint-disable-line no-unused-vars import ImageWrapper from './common/image_wrapper'; -import BarcodeLocator from './locator/barcode_locator'; import BarcodeDecoder from './decoder/barcode_decoder'; import BarcodeReader from './reader/barcode_reader'; import Events from './common/events'; @@ -8,230 +7,13 @@ import CameraAccess from './input/camera_access'; import ImageDebug from './common/image_debug'; import ResultCollector from './analytics/result_collector'; import Config from './config/config'; -import BrowserInputStream, { NodeInputStream } from './input/input_stream'; -import BrowserFrameGrabber, { NodeFrameGrabber } from './input/frame_grabber'; import { merge } from 'lodash'; -import { clone } from 'gl-vec2'; -import { QuaggaContext } from './QuaggaContext'; - -import setupInputStream from './quagga/setupInputStream.ts'; -import _getViewPort from './quagga/getViewPort.ts'; -import _initBuffers from './quagga/initBuffers.ts'; -import _initCanvas from './quagga/initCanvas'; -import { moveBox, moveLine } from './quagga/transform'; import * as QWorkers from './quagga/qworker.ts'; -const vec2 = { clone }; - -const InputStream = typeof window === 'undefined' ? NodeInputStream : BrowserInputStream; -const FrameGrabber = typeof window === 'undefined' ? NodeFrameGrabber : BrowserFrameGrabber; - -const _context = new QuaggaContext(); - -function initBuffers(imageWrapper) { - const { inputImageWrapper, boxSize } = _initBuffers(_context.inputStream, imageWrapper, _context.config.locator); - _context.inputImageWrapper = inputImageWrapper; - _context.boxSize = boxSize; -} - -function initializeData(imageWrapper) { - initBuffers(imageWrapper); - _context.decoder = BarcodeDecoder.create(_context.config.decoder, _context.inputImageWrapper); -} - -function getViewPort() { - const { target } = _context.config.inputStream; - return _getViewPort(target); -} - -function ready(cb) { - _context.inputStream.play(); - cb(); -} - -function initCanvas() { - _context.canvasContainer = _initCanvas(_context); -} - -function canRecord(cb) { - BarcodeLocator.checkImageConstraints(_context.inputStream, _context.config.locator); - initCanvas(_context.config); - _context.framegrabber = FrameGrabber.create(_context.inputStream, _context.canvasContainer.dom.image); - - QWorkers.adjustWorkerPool(_context.config.numOfWorkers, _context.config, _context.inputStream, function () { - if (_context.config.numOfWorkers === 0) { - initializeData(); - } - ready(cb); - }); -} - -function initInputStream(cb) { - const { type: inputType, constraints } = _context.config.inputStream; - const { video, inputStream } = setupInputStream(inputType, getViewPort(), InputStream); - - if (inputType === 'LiveStream') { - CameraAccess.request(video, constraints) - .then(() => inputStream.trigger('canrecord')) - .catch((err) => cb(err)); - } - - inputStream.setAttribute('preload', 'auto'); - inputStream.setInputStream(_context.config.inputStream); - inputStream.addEventListener('canrecord', canRecord.bind(undefined, cb)); - - _context.inputStream = inputStream; -} - -function getBoundingBoxes() { - if (_context.config.locate) { - return BarcodeLocator.locate(); - } else { - return [[ - vec2.clone(_context.boxSize[0]), - vec2.clone(_context.boxSize[1]), - vec2.clone(_context.boxSize[2]), - vec2.clone(_context.boxSize[3])]]; - } -} - -function transformResult(result) { - const topRight = _context.inputStream.getTopRight(); - const xOffset = topRight.x; - const yOffset = topRight.y; - - if (xOffset === 0 && yOffset === 0) { - return; - } - - if (result.barcodes) { - result.barcodes.forEach((barcode) => transformResult(barcode)); - } - - if (result.line && result.line.length === 2) { - moveLine(result.line, xOffset, yOffset); - } - - if (result.box) { - moveBox(result.box, xOffset, yOffset); - } - - if (result.boxes && result.boxes.length > 0) { - for (let i = 0; i < result.boxes.length; i++) { - moveBox(result.boxes[i], xOffset, yOffset); - } - } -} - -function addResult(result, imageData) { - if (!imageData || !_context.resultCollector) { - return; - } - - if (result.barcodes) { - result.barcodes.filter(barcode => barcode.codeResult) - .forEach(barcode => addResult(barcode, imageData)); - } else if (result.codeResult) { - _context.resultCollector.addResult(imageData, _context.inputStream.getCanvasSize(), result.codeResult); - } -} - -function hasCodeResult(result) { - return result && (result.barcodes ? - result.barcodes.some(barcode => barcode.codeResult) : - result.codeResult); -} - -function publishResult(result, imageData) { - let resultToPublish = result; - - if (result && _context.onUIThread) { - transformResult(result); - addResult(result, imageData); - resultToPublish = result.barcodes || result; - } - - Events.publish('processed', resultToPublish); - if (hasCodeResult(result)) { - Events.publish('detected', resultToPublish); - } -} - -function locateAndDecode() { - const boxes = getBoundingBoxes(); - if (boxes) { - const decodeResult = _context.decoder.decodeFromBoundingBoxes(boxes) || {}; - decodeResult.boxes = boxes; - publishResult(decodeResult, _context.inputImageWrapper.data); - } else { - const imageResult = _context.decoder.decodeFromImage(_context.inputImageWrapper); - if (imageResult) { - publishResult(imageResult, _context.inputImageWrapper.data); - } else { - publishResult({ codeResult: { code: null } }); - } - } -} - -function update() { - if (_context.onUIThread) { - const workersUpdated = QWorkers.updateWorkers(_context.framegrabber); - if (!workersUpdated) { - _context.framegrabber.attachData(_context.inputImageWrapper.data); - if (_context.framegrabber.grab()) { - if (!workersUpdated) { - locateAndDecode(); - } - } - } - } else { - _context.framegrabber.attachData(_context.inputImageWrapper.data); - _context. _framegrabber.grab(); - locateAndDecode(); - } -} - -function startContinuousUpdate() { - var next = null, - delay = 1000 / (_context.config.frequency || 60); - - _context.stopped = false; - (function frame(timestamp) { - next = next || timestamp; - if (!_context.stopped) { - if (timestamp >= next) { - next += delay; - update(); - } - window.requestAnimFrame(frame); - } - }(performance.now())); -} - -function start() { - if (_context.onUIThread && _context.config.inputStream.type === 'LiveStream') { - startContinuousUpdate(); - } else { - update(); - } -} - -function setReaders(readers) { - if (_context.decoder) { - _context.decoder.setReaders(readers); - } - QWorkers.setReaders(readers); -} +import Quagga from './quagga/quagga'; -function registerReader(name, reader) { - // load it to the module - BarcodeDecoder.registerReader(name, reader); - // then make sure any running instances of decoder and workers know about it - if (_context.decoder) { - _context.decoder.registerReader(name, reader); - } - QWorkers.registerReader(name, reader); -} +const instance = new Quagga(); +const _context = instance.context; const QuaggaJSStaticInterface = { init: function (config, cb, imageWrapper) { @@ -242,16 +24,16 @@ const QuaggaJSStaticInterface = { } if (imageWrapper) { _context.onUIThread = false; - initializeData(imageWrapper); + instance.initializeData(imageWrapper); if (cb) { cb(); } } else { - initInputStream(cb); + instance.initInputStream(cb); } }, start: function () { - start(); + instance.start(); }, stop: function () { _context.stopped = true; @@ -277,10 +59,10 @@ const QuaggaJSStaticInterface = { Events.unsubscribe('processed', callback); }, setReaders: function (readers) { - setReaders(readers); + instance.setReaders(readers); }, registerReader: function (name, reader) { - registerReader(name, reader); + instance.registerReader(name, reader); }, registerResultCollector: function (resultCollector) { if (resultCollector && typeof resultCollector.addResult === 'function') { @@ -340,7 +122,7 @@ const QuaggaJSStaticInterface = { } resolve(result); }, true); - start(); + instance.start(); }); } catch (err) { this.inDecodeSingle = false; diff --git a/src/quagga/getViewPort.ts b/src/quagga/getViewPort.ts index 753710ca..782d027c 100644 --- a/src/quagga/getViewPort.ts +++ b/src/quagga/getViewPort.ts @@ -1,4 +1,4 @@ -export default function getViewPort(target?: HTMLElement | string) { +export default function getViewPort(target?: Element | string): Element | null { if (typeof document === 'undefined') { return null; } diff --git a/src/quagga/initBuffers.ts b/src/quagga/initBuffers.ts index a5a8ac06..ded0c53b 100644 --- a/src/quagga/initBuffers.ts +++ b/src/quagga/initBuffers.ts @@ -7,7 +7,7 @@ declare var ENV: QuaggaBuildEnvironment; // TODO: need typescript def for inputstream // TODO: need typescript def for BarcodeLocator -export default function initBuffers(inputStream: any, imageWrapper: ImageWrapper, locator: any) { +export default function initBuffers(inputStream: any, imageWrapper: ImageWrapper | undefined, locator: any) { const inputImageWrapper = imageWrapper ? imageWrapper : new ImageWrapper({ x: inputStream.getWidth(), y: inputStream.getHeight(), diff --git a/src/quagga/quagga.ts b/src/quagga/quagga.ts new file mode 100644 index 00000000..f6b34c66 --- /dev/null +++ b/src/quagga/quagga.ts @@ -0,0 +1,244 @@ +import { QuaggaContext } from '../QuaggaContext'; +import _initBuffers from './initBuffers'; +import _getViewPort from './getViewPort'; +import ImageWrapper from '../common/image_wrapper'; +import BarcodeDecoder from '../decoder/barcode_decoder'; +import _initCanvas from './initCanvas'; +import BarcodeLocator from '../locator/barcode_locator'; +import BrowserInputStream, { NodeInputStream } from '../input/input_stream'; +import BrowserFrameGrabber, { NodeFrameGrabber } from '../input/frame_grabber'; +import * as QWorkers from './qworker'; +import setupInputStream from './setupInputStream'; +import CameraAccess from '../input/camera_access'; +import { clone } from 'gl-vec2'; +import { BarcodeInfo } from '../reader/barcode_reader'; +import { moveLine, moveBox } from './transform'; +import { QuaggaJSResultObject } from '../../type-definitions/quagga'; +import Events from '../common/events'; + +const InputStream = typeof window === 'undefined' ? NodeInputStream : BrowserInputStream; +const FrameGrabber = typeof window === 'undefined' ? NodeFrameGrabber : BrowserFrameGrabber; + +export default class Quagga { + context: QuaggaContext = new QuaggaContext(); + + initBuffers(imageWrapper?: ImageWrapper) { + if (!this.context.config) { + return; + } + const { inputImageWrapper, boxSize } = _initBuffers(this.context.inputStream, imageWrapper, this.context.config.locator); + this.context.inputImageWrapper = inputImageWrapper; + this.context.boxSize = boxSize; + } + + initializeData(imageWrapper?: ImageWrapper) { + if (!this.context.config) { + return; + } + this.initBuffers(imageWrapper); + this.context.decoder = BarcodeDecoder.create(this.context.config.decoder, this.context.inputImageWrapper); + } + + getViewPort() { + if (!this.context.config || !this.context.config.inputStream) { + return null; + } + const { target } = this.context.config.inputStream; + return _getViewPort(target); + } + + ready(callback: Function) { + this.context.inputStream.play(); + callback(); + } + + initCanvas() { + const container = _initCanvas(this.context); + if (!container) { + return; + } + const { ctx, dom } = container; + this.context.canvasContainer.dom.image = dom.image; + this.context.canvasContainer.dom.overlay = dom.overlay; + this.context.canvasContainer.ctx.image = ctx.image; + this.context.canvasContainer.ctx.overlay = ctx.overlay; + } + + canRecord = (callback: Function) => { + if (!this.context.config) { + return; + } + BarcodeLocator.checkImageConstraints(this.context.inputStream, this.context.config?.locator); + this.initCanvas(); + this.context.framegrabber = FrameGrabber.create(this.context.inputStream, this.context.canvasContainer.dom.image); + + if (this.context.config.numOfWorkers === undefined) { + this.context.config.numOfWorkers = 0; + } + + QWorkers.adjustWorkerPool(this.context.config.numOfWorkers, this.context.config, this.context.inputStream, () => { + if (this.context.config?.numOfWorkers === 0) { + this.initializeData(); + } + this.ready(callback); + }); + } + + initInputStream(callback: Function) { + if (!this.context.config || !this.context.config.inputStream) { + return; + } + const { type: inputType, constraints } = this.context.config.inputStream; + const { video, inputStream } = setupInputStream(inputType, this.getViewPort(), InputStream); + + if (inputType === 'LiveStream' && video) { + CameraAccess.request(video, constraints) + .then(() => inputStream.trigger('canrecord')) + .catch((err) => callback(err)); + } + + inputStream.setAttribute('preload', 'auto'); + inputStream.setInputStream(this.context.config.inputStream); + inputStream.addEventListener('canrecord', this.canRecord.bind(undefined, callback)); + + this.context.inputStream = inputStream; + } + + getBoundingBoxes() { + return this.context.config?.locate ? BarcodeLocator.locate() : + [[ + clone(this.context.boxSize[0]), + clone(this.context.boxSize[1]), + clone(this.context.boxSize[2]), + clone(this.context.boxSize[3]), + ]] + } + + // TODO: need a typescript type for result here. + transformResult(result: any) { + const topRight = this.context.inputStream.getTopRight(); + const xOffset = topRight.x; + const yOffset = topRight.y; + + if (xOffset === 0 && yOffset === 0) { + return; + } + + if (result.barcodes) { + // TODO: BarcodeInfo may not be the right type here. + result.barcodes.forEach((barcode: BarcodeInfo) => this.transformResult(barcode)); + } + + if (result.line && result.line.length === 2) { + moveLine(result.line, xOffset, yOffset); + } + + if (result.box) { + moveBox(result.box, xOffset, yOffset); + } + + if (result.boxes && result.boxes.length > 0) { + for (let i = 0; i < result.boxes.length; i++) { + moveBox(result.boxes[i], xOffset, yOffset); + } + } + } + + addResult(result: QuaggaJSResultObject, imageData: any) { + if (!imageData || !this.context.resultCollector) { + return; + } + + // TODO: Figure out what data structure holds a "barcodes" result, if any... + if (result.barcodes) { + result.barcodes.filter((barcode: QuaggaJSResultObject) => barcode.codeResult) + .forEach((barcode: QuaggaJSResultObject) => this.addResult(barcode, imageData)); + } else if (result.codeResult) { + this.context.resultCollector.addResult(imageData, this.context.inputStream.getCanvasSize(), result.codeResult); + } + } + + hasCodeResult(result: QuaggaJSResultObject) { + return result && (result.barcodes ? + result.barcodes.some(barcode => barcode.codeResult) : + result.codeResult); + } + + publishResult(result: QuaggaJSResultObject | null = null, imageData?: any) { + let resultToPublish: Array | QuaggaJSResultObject | null = result; + + if (result && this.context.onUIThread) { + this.transformResult(result); + this.addResult(result, imageData); + resultToPublish = result.barcodes || result; + } + + Events.publish('processed', resultToPublish); + if (this.hasCodeResult(result as QuaggaJSResultObject)) { + Events.publish('detected', resultToPublish); + } + } + + locateAndDecode() { + const boxes = this.getBoundingBoxes(); + if (boxes) { + const decodeResult = this.context.decoder.decodeFromBoundingBoxes(boxes) || {}; + decodeResult.boxes = boxes; + this.publishResult(decodeResult, this.context.inputImageWrapper?.data); + } else { + const imageResult = this.context.decoder.decodeFromImage(this.context.inputImageWrapper); + if (imageResult) { + this.publishResult(imageResult, this.context.inputImageWrapper?.data); + } else { + this.publishResult(); + } + } + } + + update() { + if (this.context.onUIThread) { + const workersUpdated = QWorkers.updateWorkers(this.context.framegrabber); + if (!workersUpdated) { + this.context.framegrabber.attachData(this.context.inputImageWrapper?.data); + if (this.context.framegrabber.grab()) { + if (!workersUpdated) { + this.locateAndDecode(); + } + } + } + } else { + this.context.framegrabber.attachData(this.context.inputImageWrapper?.data); + this.context.framegrabber.grab(); + this.locateAndDecode(); + } + } + + startContinuousUpdate() { + var next: number | null = null, + delay = 1000 / (this.context.config?.frequency || 60); + + this.context.stopped = false; + const context = this.context; + + const newFrame = (timestamp: number) => { + next = next || timestamp; + if (!context.stopped) { + next += delay; + this.update(); + } + // @ts-ignore // TODO: requestAnimFrame is filled in src/common/typedefs.js, i'm not sure how to tell TypeScript of that, though + window.requestAnimFrame(frame); + }; + + newFrame(performance.now()); + } + + start() { + if (this.context.onUIThread && this.context.config?.inputStream?.type === 'LiveStream') { + this.startContinuousUpdate(); + } else { + this.update(); + } + } + +} diff --git a/src/quagga/setupInputStream.ts b/src/quagga/setupInputStream.ts index 1948a9b1..6edc4440 100644 --- a/src/quagga/setupInputStream.ts +++ b/src/quagga/setupInputStream.ts @@ -1,7 +1,7 @@ -export type InputStreamType = 'VideoStream' | 'ImageStream' | 'LiveStream'; +import { InputStreamType } from "../../type-definitions/quagga"; // TODO: need to create an InputStream typescript interface, so we don't have an "any" in the next line -export default function setupInputStream(type: InputStreamType, viewport: HTMLElement, InputStream: any) { +export default function setupInputStream(type: InputStreamType, viewport: Element | null, InputStream: any) { switch (type) { case 'VideoStream': { const video = document.createElement('video'); diff --git a/type-definitions/quagga.d.ts b/type-definitions/quagga.d.ts index 222cb200..ca076ab7 100644 --- a/type-definitions/quagga.d.ts +++ b/type-definitions/quagga.d.ts @@ -332,6 +332,7 @@ export interface QuaggaJSResultCollectorFilterFunction { */ export interface QuaggaJSResultObject { codeResult: QuaggaJSResultObject_CodeResult; + barcodes?: Array line: { x: number; y: number; @@ -344,7 +345,7 @@ export interface QuaggaJSResultObject { } export interface QuaggaJSResultObject_CodeResult { - code: string; + code: string | null; start: number; end: number; codeset: number; @@ -371,6 +372,8 @@ export interface QuaggaJSResultObject_CodeResult { format: string; } +export type InputStreamType = 'VideoStream' | 'ImageStream' | 'LiveStream'; + export interface QuaggaJSConfigObject { /** * The image path to load from, or a data url @@ -388,9 +391,9 @@ export interface QuaggaJSConfigObject { /** * @default "LiveStream" */ - type?: string; + type: InputStreamType; - target?: HTMLElement | string, + target?: Element | string, constraints?: MediaTrackConstraints; From 2649b2558b31a7c322fc5fb728d9a48570a2d204 Mon Sep 17 00:00:00 2001 From: Eric Blade Date: Thu, 16 Apr 2020 12:04:40 -0400 Subject: [PATCH 4/7] decodeSingle: run all calls on a new Quagga instance - this appears to actually work correctly, all tests are passing - move stop functionality into the instance - init accepts an instance parameter to determine which instance to init - update bound to instance - add Quagga::setReaders and Quagga::registerReader - setupInputStream defaults to LiveStream per the TypeScript def for inputStream config - InputStreamType back to optional in input stream config --- src/quagga.js | 31 ++++++++++++---------------- src/quagga/quagga.ts | 27 ++++++++++++++++++++++-- src/quagga/setupInputStream.ts | 2 +- test/integration/integration.spec.js | 7 +++++-- type-definitions/quagga.d.ts | 2 +- 5 files changed, 45 insertions(+), 24 deletions(-) diff --git a/src/quagga.js b/src/quagga.js index 9ee1da11..754025b6 100644 --- a/src/quagga.js +++ b/src/quagga.js @@ -8,7 +8,6 @@ import ImageDebug from './common/image_debug'; import ResultCollector from './analytics/result_collector'; import Config from './config/config'; import { merge } from 'lodash'; -import * as QWorkers from './quagga/qworker.ts'; import Quagga from './quagga/quagga'; @@ -16,32 +15,27 @@ const instance = new Quagga(); const _context = instance.context; const QuaggaJSStaticInterface = { - init: function (config, cb, imageWrapper) { - _context.config = merge({}, Config, config); + init: function (config, cb, imageWrapper, quaggaInstance = instance) { + quaggaInstance.context.config = merge({}, Config, config); // TODO: pending restructure in Issue #105, we are temp disabling workers - if (_context.config.numOfWorkers > 0) { - _context.config.numOfWorkers = 0; + if (quaggaInstance.context.config.numOfWorkers > 0) { + quaggaInstance.context.config.numOfWorkers = 0; } if (imageWrapper) { - _context.onUIThread = false; - instance.initializeData(imageWrapper); + quaggaInstance.context.onUIThread = false; + quaggaInstance.initializeData(imageWrapper); if (cb) { cb(); } } else { - instance.initInputStream(cb); + quaggaInstance.initInputStream(cb); } }, start: function () { instance.start(); }, stop: function () { - _context.stopped = true; - QWorkers.adjustWorkerPool(0); - if (_context.config.inputStream && _context.config.inputStream.type === 'LiveStream') { - CameraAccess.release(); - _context.inputStream.clearEventHandlers(); - } + instance.stop(); }, pause: function () { _context.stopped = true; @@ -73,6 +67,7 @@ const QuaggaJSStaticInterface = { return _context.canvasContainer; }, decodeSingle: function (config, resultCallback) { + const quaggaInstance = new Quagga(); if (this.inDecodeSingle) { // force multiple calls to decodeSingle to run in serial, because presently // simultaneous running breaks things. @@ -87,7 +82,7 @@ const QuaggaJSStaticInterface = { } return null; } - this.inDecodeSingle = true; + // this.inDecodeSingle = true; config = merge({ inputStream: { type: 'ImageStream', @@ -116,14 +111,14 @@ const QuaggaJSStaticInterface = { this.init(config, () => { Events.once('processed', (result) => { this.inDecodeSingle = false; - this.stop(); + quaggaInstance.stop(); if (resultCallback) { resultCallback.call(null, result); } resolve(result); }, true); - instance.start(); - }); + quaggaInstance.start(); + }, null, quaggaInstance); } catch (err) { this.inDecodeSingle = false; reject(err); diff --git a/src/quagga/quagga.ts b/src/quagga/quagga.ts index f6b34c66..c702198a 100644 --- a/src/quagga/quagga.ts +++ b/src/quagga/quagga.ts @@ -13,7 +13,7 @@ import CameraAccess from '../input/camera_access'; import { clone } from 'gl-vec2'; import { BarcodeInfo } from '../reader/barcode_reader'; import { moveLine, moveBox } from './transform'; -import { QuaggaJSResultObject } from '../../type-definitions/quagga'; +import { QuaggaJSResultObject, QuaggaJSReaderConfig } from '../../type-definitions/quagga'; import Events from '../common/events'; const InputStream = typeof window === 'undefined' ? NodeInputStream : BrowserInputStream; @@ -195,7 +195,7 @@ export default class Quagga { } } - update() { + update = () => { if (this.context.onUIThread) { const workersUpdated = QWorkers.updateWorkers(this.context.framegrabber); if (!workersUpdated) { @@ -241,4 +241,27 @@ export default class Quagga { } } + stop() { + this.context.stopped = true; + QWorkers.adjustWorkerPool(0); + if (this.context.config?.inputStream && this.context.config.inputStream.type === 'LiveStream') { + CameraAccess.release(); + this.context.inputStream.clearEventHandlers(); + } + } + + setReaders(readers: Array) { + if (this.context.decoder) { + this.context.decoder.setReaders(readers); + } + QWorkers.setReaders(readers); + } + + registerReader(name: string, reader: QuaggaJSReaderConfig) { + BarcodeDecoder.registerReader(name, reader); + if (this.context.decoder) { + this.context.decoder.registerReader(name, reader); + } + QWorkers.registerReader(name, reader); + } } diff --git a/src/quagga/setupInputStream.ts b/src/quagga/setupInputStream.ts index 6edc4440..e84d2b36 100644 --- a/src/quagga/setupInputStream.ts +++ b/src/quagga/setupInputStream.ts @@ -1,7 +1,7 @@ import { InputStreamType } from "../../type-definitions/quagga"; // TODO: need to create an InputStream typescript interface, so we don't have an "any" in the next line -export default function setupInputStream(type: InputStreamType, viewport: Element | null, InputStream: any) { +export default function setupInputStream(type: InputStreamType = 'LiveStream', viewport: Element | null, InputStream: any) { switch (type) { case 'VideoStream': { const video = document.createElement('video'); diff --git a/test/integration/integration.spec.js b/test/integration/integration.spec.js index 49e73e1b..133724ec 100644 --- a/test/integration/integration.spec.js +++ b/test/integration/integration.spec.js @@ -67,8 +67,11 @@ describe('decodeSingle', function () { expect(Quagga.canvas.dom).to.be.an('Object'); console.warn(`* Expect Quagga.canvas.ctx to be an object ${Quagga.canvas.ctx}`); expect(Quagga.canvas.ctx).to.be.an('Object'); - console.warn(`* Expect Quagga.canvas.ctx.overlay to be a CanvasRenderingContext2D ${Quagga.canvas.ctx.overlay}`); - expect(Quagga.canvas.ctx.overlay).to.be.an('CanvasRenderingContext2D'); + // In prior versions, calling decodeSingle was enough to setup the canvas + // variables, that is no longer the case now that decodeSingle() works on + // multiple instances. + // console.warn(`* Expect Quagga.canvas.ctx.overlay to be a CanvasRenderingContext2D ${Quagga.canvas.ctx.overlay}`); + // expect(Quagga.canvas.ctx.overlay).to.be.an('CanvasRenderingContext2D'); callback(); }); }, function() { diff --git a/type-definitions/quagga.d.ts b/type-definitions/quagga.d.ts index ca076ab7..6edea5bd 100644 --- a/type-definitions/quagga.d.ts +++ b/type-definitions/quagga.d.ts @@ -391,7 +391,7 @@ export interface QuaggaJSConfigObject { /** * @default "LiveStream" */ - type: InputStreamType; + type?: InputStreamType; target?: Element | string, From f338e4924cde75e5fae523ce285f72d4b6cde4cc Mon Sep 17 00:00:00 2001 From: Eric Blade Date: Thu, 16 Apr 2020 12:13:42 -0400 Subject: [PATCH 5/7] remove restriction on running parallel decodeSingle - surprisingly, this seems to work --- src/quagga.js | 17 ----------------- 1 file changed, 17 deletions(-) diff --git a/src/quagga.js b/src/quagga.js index 754025b6..8f241bfa 100644 --- a/src/quagga.js +++ b/src/quagga.js @@ -68,21 +68,6 @@ const QuaggaJSStaticInterface = { }, decodeSingle: function (config, resultCallback) { const quaggaInstance = new Quagga(); - if (this.inDecodeSingle) { - // force multiple calls to decodeSingle to run in serial, because presently - // simultaneous running breaks things. - if (resultCallback) { - setTimeout(() => this.decodeSingle(config, resultCallback), 300); - } else { - return new Promise((resolve) => { - setTimeout(() => this.decodeSingle(config, (res) => { - resolve(res); - }, 300)); - }); - } - return null; - } - // this.inDecodeSingle = true; config = merge({ inputStream: { type: 'ImageStream', @@ -110,7 +95,6 @@ const QuaggaJSStaticInterface = { try { this.init(config, () => { Events.once('processed', (result) => { - this.inDecodeSingle = false; quaggaInstance.stop(); if (resultCallback) { resultCallback.call(null, result); @@ -120,7 +104,6 @@ const QuaggaJSStaticInterface = { quaggaInstance.start(); }, null, quaggaInstance); } catch (err) { - this.inDecodeSingle = false; reject(err); } }); From da2445fd38e8e6f146dc922fac1ab19546d42f29 Mon Sep 17 00:00:00 2001 From: Eric Blade Date: Wed, 29 Apr 2020 16:09:37 -0400 Subject: [PATCH 6/7] fix startContinuousUpdate() so LiveStream works again --- src/common/typedefs.js | 21 +++++++++++---------- src/quagga/quagga.ts | 3 +-- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/src/common/typedefs.js b/src/common/typedefs.js index fb90fac6..ca32850d 100644 --- a/src/common/typedefs.js +++ b/src/common/typedefs.js @@ -4,16 +4,17 @@ */ if (typeof window !== 'undefined') { - window.requestAnimFrame = (function () { - return window.requestAnimationFrame || - window.webkitRequestAnimationFrame || - window.mozRequestAnimationFrame || - window.oRequestAnimationFrame || - window.msRequestAnimationFrame || - function (/* function FrameRequestCallback */ callback) { - window.setTimeout(callback, 1000 / 60); - }; - }()); + if (!window.requestAnimationFrame) { + window.requestAnimationFrame = (function () { + return window.webkitRequestAnimationFrame || + window.mozRequestAnimationFrame || + window.oRequestAnimationFrame || + window.msRequestAnimationFrame || + function (/* function FrameRequestCallback */ callback) { + window.setTimeout(callback, 1000 / 60); + }; + }()); + } } Math.imul = Math.imul || function(a, b) { var ah = (a >>> 16) & 0xffff, diff --git a/src/quagga/quagga.ts b/src/quagga/quagga.ts index c702198a..e5cdcb3e 100644 --- a/src/quagga/quagga.ts +++ b/src/quagga/quagga.ts @@ -226,8 +226,7 @@ export default class Quagga { next += delay; this.update(); } - // @ts-ignore // TODO: requestAnimFrame is filled in src/common/typedefs.js, i'm not sure how to tell TypeScript of that, though - window.requestAnimFrame(frame); + window.requestAnimationFrame(newFrame); }; newFrame(performance.now()); From 0be2778f4d47ed35e97dcfee6176bd16533e135c Mon Sep 17 00:00:00 2001 From: Eric Blade Date: Wed, 29 Apr 2020 16:16:42 -0400 Subject: [PATCH 7/7] minor cleanup to src/common/typedefs --- src/common/typedefs.js | 31 +++++++++++++++++-------------- 1 file changed, 17 insertions(+), 14 deletions(-) diff --git a/src/common/typedefs.js b/src/common/typedefs.js index ca32850d..aca715e0 100644 --- a/src/common/typedefs.js +++ b/src/common/typedefs.js @@ -1,6 +1,6 @@ /* * typedefs.js - * Normalizes browser-specific prefixes + * Normalizes browser-specific prefixes and provide some basic polyfills */ if (typeof window !== 'undefined') { @@ -16,15 +16,18 @@ if (typeof window !== 'undefined') { }()); } } -Math.imul = Math.imul || function(a, b) { - var ah = (a >>> 16) & 0xffff, - al = a & 0xffff, - bh = (b >>> 16) & 0xffff, - bl = b & 0xffff; - // the shift by 0 fixes the sign on the high part - // the final |0 converts the unsigned value into a signed value - return ((al * bl) + (((ah * bl + al * bh) << 16) >>> 0) | 0); -}; + +if (typeof Math.imul !== 'function') { + Math.imul = function(a, b) { + const ah = (a >>> 16) & 0xffff; + const al = a & 0xffff; + const bh = (b >>> 16) & 0xffff; + const bl = b & 0xffff; + // the shift by 0 fixes the sign on the high part + // the final |0 converts the unsigned value into a signed value + return ((al * bl) + (((ah * bl + al * bh) << 16) >>> 0) | 0); + }; +} if (typeof Object.assign !== 'function') { Object.assign = function(target) { // .length of function is 2 @@ -33,13 +36,13 @@ if (typeof Object.assign !== 'function') { throw new TypeError('Cannot convert undefined or null to object'); } - var to = Object(target); + const to = Object(target); - for (var index = 1; index < arguments.length; index++) { - var nextSource = arguments[index]; + for (let index = 1; index < arguments.length; index++) { + const nextSource = arguments[index]; if (nextSource !== null) { // Skip over if undefined or null - for (var nextKey in nextSource) { + for (let nextKey in nextSource) { // Avoid bugs when hasOwnProperty is shadowed if (Object.prototype.hasOwnProperty.call(nextSource, nextKey)) { to[nextKey] = nextSource[nextKey];