scandoc-ai-components 0.0.7 → 0.0.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (2) hide show
  1. package/dist/index.js +1 -1
  2. package/package.json +1 -1
package/dist/index.js CHANGED
@@ -156,7 +156,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
156
156
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
157
157
 
158
158
  "use strict";
159
- eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ getExtractionVideo)\n/* harmony export */ });\n/* harmony import */ var _ai_detect_document__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../ai/detect-document */ \"./src/lib/ai/detect-document.js\");\n/* harmony import */ var _requests_extraction__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../requests/extraction */ \"./src/lib/requests/extraction.js\");\n/* harmony import */ var _requests_validation__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../requests/validation */ \"./src/lib/requests/validation.js\");\n/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./utils */ \"./src/lib/components/utils.js\");\n\n\n\n\nconst DOCUMENT_DETECTOR = new _ai_detect_document__WEBPACK_IMPORTED_MODULE_0__[\"default\"]();\nclass ExtractorVideo {\n static FREQUENCY_MS = 10;\n static VALIDATION_BATCH_SIZE = 1;\n static VALIDATION_IMG_WIDTH = 384;\n static VALIDATION_IMG_HEIGHT = 384;\n static VIDEO_SETTINGS = Object.freeze({\n width: {\n ideal: 1920\n },\n height: {\n ideal: 1080\n },\n facingMode: \"environment\"\n });\n constructor(onExtractedResults) {\n this.candidateImages = [];\n this.extractionImages = {};\n this.onExtractedResults = onExtractedResults;\n this.pastBlurValues = [];\n this.isRunning = false;\n }\n async analyzeVideoStream() {\n if (!this.isRunning) {\n return;\n }\n //\n const canvas = document.createElement(\"canvas\");\n let video = document.getElementById(\"ScanDocAIVideoElement\");\n //\n const fullImage = (0,_utils__WEBPACK_IMPORTED_MODULE_3__.videoImgToBase64)(video, canvas, video.videoWidth, video.videoHeight, false);\n const validationImage = (0,_utils__WEBPACK_IMPORTED_MODULE_3__.videoImgToBase64)(video, canvas, ExtractorVideo.VALIDATION_IMG_WIDTH, ExtractorVideo.VALIDATION_IMG_HEIGHT, true);\n DOCUMENT_DETECTOR.isDocumentPresent(video).then(async isPresent => {\n if (isPresent) {\n this.candidateImages.push({\n fullImg: fullImage,\n validationImg: validationImage\n });\n const images = [...this.candidateImages];\n if (images.length >= ExtractorVideo.VALIDATION_BATCH_SIZE) {\n const [isValidationOk, response] = await (0,_requests_validation__WEBPACK_IMPORTED_MODULE_2__[\"default\"])(images.map(e => e[\"validationImg\"]), this.pastBlurValues, {});\n if (isValidationOk) {\n this.showMessage(response[\"Info\"]);\n //\n if (\"DetectedBlurValue\" in response) {\n this.pastBlurValues.push(response[\"DetectedBlurValue\"]);\n } else {\n this.pastBlurValues = [];\n }\n //\n if (response[\"InfoCode\"] === \"1007\") {\n const imageId = response[\"Index\"];\n const imageSide = response[\"Side\"];\n //\n if (this.extractionImages[imageSide] === undefined) {\n this.extractionImages[imageSide] = images[imageId][\"fullImg\"];\n }\n const extractionImages = {\n ...this.extractionImages\n };\n //\n if (Object.keys(extractionImages).length === 1) {\n this.showMessage(\"Turn to the other side\");\n }\n if (Object.keys(extractionImages).length === 2) {\n this.showMessage(\"Validation successful\");\n alert(\"Sending document to analysis\");\n const [isExtractionOk, extractionData] = await (0,_requests_extraction__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(extractionImages[\"FRONT\"], extractionImages[\"BACK\"], {\n IgnoreBackImage: false\n });\n this.onExtraction(isExtractionOk, extractionData);\n return;\n }\n } else if (response[\"InfoCode\"] === \"1000\") {\n this.showMessage(\"Validation successful\");\n this.showMessage(\"Extracting data\");\n const imageId = response[\"Index\"];\n const image = images[imageId][\"fullImg\"];\n const [isExtractionOk, extractionData] = await (0,_requests_extraction__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(image, undefined, {\n IgnoreBackImage: true\n });\n this.onExtraction(isExtractionOk, extractionData);\n return;\n }\n }\n this.candidateImages = [];\n }\n }\n }).finally(() => {\n setTimeout(() => this.analyzeVideoStream(), ExtractorVideo.FREQUENCY_MS);\n });\n }\n onExtraction(isExtractionOk, extractionData) {\n this.candidateImages = [];\n this.extractionImages = {};\n //\n if (isExtractionOk) {\n const shouldStop = this.onExtractedResults(extractionData);\n if (shouldStop === true) {\n setTimeout(() => this.analyzeVideoStream(), ExtractorVideo.FREQUENCY_MS);\n }\n } else {\n setTimeout(() => this.analyzeVideoStream(), ExtractorVideo.FREQUENCY_MS);\n }\n }\n startVideo() {\n const videoElem = document.getElementById(\"ScanDocAIVideoElement\");\n if (videoElem !== undefined) {\n this.video = videoElem;\n this.isRunning = true;\n navigator.mediaDevices.enumerateDevices().then(devices => {\n const environmentCameras = devices.filter(device => device.kind === \"videoinput\" && device.label.toLowerCase().includes(\"back\"));\n checkAutofocusSupport(environmentCameras).then(cameras => {\n console.log(\"Got autofocus camera:\", cameras);\n let deviceId = undefined;\n let deviceFound = false;\n if (cameras.length > 0) {\n deviceId = cameras[0].deviceId;\n deviceFound = true;\n }\n const userMediaConstraints = {\n ...ExtractorVideo.VIDEO_SETTINGS\n };\n if (deviceFound) {\n userMediaConstraints.deviceId = deviceId;\n }\n //\n navigator.mediaDevices.getUserMedia({\n video: userMediaConstraints\n }).then(stream => {\n this.video.srcObject = stream;\n this.video.play().catch(e => {\n console.warn(`Error on video play: ${e}`);\n });\n //\n setTimeout(() => this.analyzeVideoStream(), ExtractorVideo.FREQUENCY_MS);\n }).catch(error => console.log(\"Error accessing the camera: \" + error));\n });\n }).catch(() => console.log(\"Error accessing the camera: \" + error));\n this.showMessage(\"Starting scanning\");\n return true;\n }\n return false;\n }\n stopVideo() {\n this.isRunning = false;\n if (this.video) {\n this.video.pause();\n if (this.video.srcObject !== undefined && this.video.srcObject !== null) {\n this.video.srcObject.getTracks().forEach(t => t.stop());\n }\n this.video.srcObject = null;\n }\n }\n showMessage(message) {\n const messageElement = document.getElementById(\"ScanDocAIMessage\");\n if (messageElement) {\n messageElement.innerText = message;\n }\n }\n getHTML() {\n return `\n\t\t\t<div class=\"desktopFeedback\" id=\"ScanDocAIMessage\"></div>\n\t\t\t<div class=\"desktopVideoArea\">\n\t\t\t\t<div class=\"desktopVideoHolder\">\n\t\t\t\t\t<video id=\"ScanDocAIVideoElement\" class=\"desktopVideo\" autoPlay muted playsInline></video>\n\t\t\t\t\t<div class=\"backgroundOverlay\"></div>\n\t\t\t\t\t<div class=\"desktopRectangle dashedRectangle\"></div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\n\t\t\t<style>\n\t\t\t\t.desktopVideoArea {\n\t\t\t\t\tdisplay: flex;\n\t\t\t\t\tflex-direction: column;\n\t\t\t\t\tgap: 8px;\n\t\t\t\t\tpadding: 16px;\n\t\t\t\t\tbackground-color: rgba(255, 255, 255, 0.05);\n\t\t\t\t\tborder: 1px solid #5078bb;\n\t\t\t\t\tborder-radius: 15px;\n\t\t\t\t\tmargin-left: 20%;\n\t\t\t\t\tmargin-right: 20%;\n\t\t\t\t}\n\t\n\t\t\t\t.desktopVideoHolder {\n\t\t\t\t\tposition: relative;\n\t\t\t\t\tmax-width: 100%;\n\t\t\t\t\toverflow: hidden;\n\t\t\t\t}\n\t\n\t\t\t\t.desktopVideo {\n\t\t\t\t\twidth: 100%;\n\t\t\t\t\theight: auto;\n\t\t\t\t\tmargin-left: auto;\n\t\t\t\t\tmargin-right: auto;\n\t\t\t\t\tmax-width: 100vw;\n\t\t\t\t\tmax-height: 100vh;\n\t\t\t\t}\n\t\n\t\t\t\t.desktopRectangle {\n\t\t\t\t\tposition: absolute;\n\t\t\t\t\ttop: 32px;\n\t\t\t\t\tright: 32px;\n\t\t\t\t\tbottom: 32px;\n\t\t\t\t\tleft: 28px;\n\t\t\t\t\tborder-radius: 30px;\n\t\t\t\t\tdisplay: flex;\n\t\t\t\t\tjustify-content: center;\n\t\t\t\t\talign-items: center;\n\t\t\t\t}\n\t\n\t\t\t\t.dashedRectangle {\n\t\t\t\t\tborder: 5px dashed #5078bb;\n\t\t\t\t}\n\t\n\t\t\t\t.solidRectangle {\n\t\t\t\t\tborder: 5px solid #5078bb;\n\t\t\t\t}\n\t\n\t\t\t\t.backgroundOverlay {\n\t\t\t\t\tposition: absolute;\n\t\t\t\t\ttop: 0;\n\t\t\t\t\tleft: 0;\n\t\t\t\t\twidth: 100%;\n\t\t\t\t\theight: 100%;\n\t\t\t\t\tbackground-color: rgba(0, 0, 0, 0.051);\n\t\t\t\t\tz-index: 2;\n\t\t\t\t\tpointer-events: none;\n\t\t\t\t}\n\t\n\t\t\t\t.desktopFeedback {\n\t\t\t\t\tposition: relative;\n\t\t\t\t\tdisplay: flex;\n\t\t\t\t\tfont-size: 22px;\n\t\t\t\t\tfont-weight: 600;\n\t\t\t\t\tmin-height: 36px;\n\t\t\t\t\tjustify-content: center;\n\t\t\t\t\talign-items: center;\n\t\t\t\t\tcolor: #5078bb;\n\t\t\t\t}\n\t\t\t</style>\n\t\t`;\n }\n}\nlet EXTRACTION_VIDEO = undefined;\nfunction getExtractionVideo(onSuccessfulExtraction) {\n if (EXTRACTION_VIDEO === undefined) {\n EXTRACTION_VIDEO = new ExtractorVideo(onSuccessfulExtraction);\n } else {\n console.error(\"Extraction video already created. Returning existing object.\");\n }\n return EXTRACTION_VIDEO;\n}\nasync function checkAutofocusSupport(environmentCameras) {\n try {\n const camerasWithAutofocus = [];\n for (const camera of environmentCameras) {\n // console.log(camera.deviceId);\n const constraints = {\n video: {\n deviceId: {\n exact: camera.deviceId\n }\n }\n };\n\n // Try to access camera stream with autofocus enabled\n const stream = await navigator.mediaDevices.getUserMedia(constraints);\n const tracks = stream.getVideoTracks();\n\n // Check if autofocus is supported\n const capabilities = tracks[0].getCapabilities();\n // console.log(capabilities);\n if (capabilities.focusMode && capabilities.focusMode.includes(\"continuous\")) {\n camerasWithAutofocus.push(camera);\n }\n\n // Cleanup\n stream.getTracks().forEach(track => track.stop());\n }\n return camerasWithAutofocus;\n } catch (error) {\n console.log(\"Error checking autofocus support:\", error);\n return [];\n }\n}\n\n//# sourceURL=webpack://scandoc-ai-components/./src/lib/components/Video.js?");
159
+ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ getExtractionVideo)\n/* harmony export */ });\n/* harmony import */ var _ai_detect_document__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../ai/detect-document */ \"./src/lib/ai/detect-document.js\");\n/* harmony import */ var _requests_extraction__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../requests/extraction */ \"./src/lib/requests/extraction.js\");\n/* harmony import */ var _requests_validation__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../requests/validation */ \"./src/lib/requests/validation.js\");\n/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./utils */ \"./src/lib/components/utils.js\");\n\n\n\n\nconst DOCUMENT_DETECTOR = new _ai_detect_document__WEBPACK_IMPORTED_MODULE_0__[\"default\"]();\nclass ExtractorVideo {\n static FREQUENCY_MS = 10;\n static VALIDATION_BATCH_SIZE = 1;\n static VALIDATION_IMG_WIDTH = 384;\n static VALIDATION_IMG_HEIGHT = 384;\n static VIDEO_SETTINGS = Object.freeze({\n width: {\n ideal: 1920\n },\n height: {\n ideal: 1080\n },\n facingMode: \"environment\"\n });\n constructor(onExtractedResults) {\n this.candidateImages = [];\n this.extractionImages = {};\n this.onExtractedResults = onExtractedResults;\n this.pastBlurValues = [];\n this.isRunning = false;\n }\n async analyzeVideoStream() {\n if (!this.isRunning) {\n return;\n }\n //\n const canvas = document.createElement(\"canvas\");\n let video = document.getElementById(\"ScanDocAIVideoElement\");\n //\n const fullImage = (0,_utils__WEBPACK_IMPORTED_MODULE_3__.videoImgToBase64)(video, canvas, video.videoWidth, video.videoHeight, false);\n const validationImage = (0,_utils__WEBPACK_IMPORTED_MODULE_3__.videoImgToBase64)(video, canvas, ExtractorVideo.VALIDATION_IMG_WIDTH, ExtractorVideo.VALIDATION_IMG_HEIGHT, true);\n DOCUMENT_DETECTOR.isDocumentPresent(video).then(async isPresent => {\n if (isPresent) {\n this.candidateImages.push({\n fullImg: fullImage,\n validationImg: validationImage\n });\n const images = [...this.candidateImages];\n if (images.length >= ExtractorVideo.VALIDATION_BATCH_SIZE) {\n const [isValidationOk, response] = await (0,_requests_validation__WEBPACK_IMPORTED_MODULE_2__[\"default\"])(images.map(e => e[\"validationImg\"]), this.pastBlurValues, {});\n if (isValidationOk) {\n this.showMessage(response[\"Info\"]);\n //\n if (\"DetectedBlurValue\" in response) {\n this.pastBlurValues.push(response[\"DetectedBlurValue\"]);\n } else {\n this.pastBlurValues = [];\n }\n //\n if (response[\"InfoCode\"] === \"1007\") {\n const imageId = response[\"Index\"];\n const imageSide = response[\"Side\"];\n //\n if (this.extractionImages[imageSide] === undefined) {\n this.extractionImages[imageSide] = images[imageId][\"fullImg\"];\n }\n const extractionImages = {\n ...this.extractionImages\n };\n //\n if (Object.keys(extractionImages).length === 1) {\n this.showMessage(\"Turn to the other side\");\n }\n if (Object.keys(extractionImages).length === 2) {\n this.showMessage(\"Validation successful\");\n alert(\"Sending document to analysis\");\n const [isExtractionOk, extractionData] = await (0,_requests_extraction__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(extractionImages[\"FRONT\"], extractionImages[\"BACK\"], {\n IgnoreBackImage: false\n });\n this.onExtraction(isExtractionOk, extractionData);\n return;\n }\n } else if (response[\"InfoCode\"] === \"1000\") {\n this.showMessage(\"Validation successful\");\n this.showMessage(\"Extracting data\");\n const imageId = response[\"Index\"];\n const image = images[imageId][\"fullImg\"];\n const [isExtractionOk, extractionData] = await (0,_requests_extraction__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(image, undefined, {\n IgnoreBackImage: true\n });\n this.onExtraction(isExtractionOk, extractionData);\n return;\n }\n }\n this.candidateImages = [];\n }\n }\n }).finally(() => {\n setTimeout(() => this.analyzeVideoStream(), ExtractorVideo.FREQUENCY_MS);\n });\n }\n onExtraction(isExtractionOk, extractionData) {\n this.candidateImages = [];\n this.extractionImages = {};\n //\n if (isExtractionOk) {\n this.showMessage(\"Success - data extracted\", \"success\");\n const shouldStop = this.onExtractedResults(extractionData);\n if (shouldStop === true) {\n setTimeout(() => this.analyzeVideoStream(), ExtractorVideo.FREQUENCY_MS);\n }\n } else {\n setTimeout(() => this.analyzeVideoStream(), ExtractorVideo.FREQUENCY_MS);\n }\n }\n startVideo() {\n const videoElem = document.getElementById(\"ScanDocAIVideoElement\");\n if (videoElem !== undefined) {\n this.video = videoElem;\n this.isRunning = true;\n navigator.mediaDevices.enumerateDevices().then(devices => {\n const environmentCameras = devices.filter(device => device.kind === \"videoinput\" && device.label.toLowerCase().includes(\"back\"));\n checkAutofocusSupport(environmentCameras).then(cameras => {\n console.log(\"Got autofocus camera:\", cameras);\n let deviceId = undefined;\n let deviceFound = false;\n if (cameras.length > 0) {\n deviceId = cameras[0].deviceId;\n deviceFound = true;\n }\n const userMediaConstraints = {\n ...ExtractorVideo.VIDEO_SETTINGS\n };\n if (deviceFound) {\n userMediaConstraints.deviceId = deviceId;\n }\n //\n navigator.mediaDevices.getUserMedia({\n video: userMediaConstraints\n }).then(stream => {\n this.video.srcObject = stream;\n this.video.play().catch(e => {\n console.warn(`Error on video play: ${e}`);\n });\n //\n setTimeout(() => this.analyzeVideoStream(), ExtractorVideo.FREQUENCY_MS);\n }).catch(error => console.log(\"Error accessing the camera: \" + error));\n });\n }).catch(() => console.log(\"Error accessing the camera: \" + error));\n this.showMessage(\"Starting scanning\");\n return true;\n }\n return false;\n }\n stopVideo() {\n this.isRunning = false;\n if (this.video) {\n this.video.pause();\n if (this.video.srcObject !== undefined && this.video.srcObject !== null) {\n this.video.srcObject.getTracks().forEach(t => t.stop());\n }\n this.video.srcObject = null;\n }\n }\n showMessage(message) {\n const messageElement = document.getElementById(\"ScanDocAIMessage\");\n if (messageElement) {\n messageElement.innerText = message;\n }\n }\n getHTML() {\n return `\n\t\t\t<div class=\"desktopFeedback\" id=\"ScanDocAIMessage\"></div>\n\t\t\t<div class=\"desktopVideoArea\">\n\t\t\t\t<div class=\"desktopVideoHolder\">\n\t\t\t\t\t<video id=\"ScanDocAIVideoElement\" class=\"desktopVideo\" autoPlay muted playsInline></video>\n\t\t\t\t\t<div class=\"backgroundOverlay\"></div>\n\t\t\t\t\t<div class=\"desktopRectangle dashedRectangle\"></div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\n\t\t\t<style>\n\t\t\t\t.desktopVideoArea {\n\t\t\t\t\tdisplay: flex;\n\t\t\t\t\tflex-direction: column;\n\t\t\t\t\tgap: 8px;\n\t\t\t\t\tpadding: 16px;\n\t\t\t\t\tbackground-color: rgba(255, 255, 255, 0.05);\n\t\t\t\t\tborder: 1px solid #5078bb;\n\t\t\t\t\tborder-radius: 15px;\n\t\t\t\t\tmargin-left: 20%;\n\t\t\t\t\tmargin-right: 20%;\n\t\t\t\t}\n\t\n\t\t\t\t.desktopVideoHolder {\n\t\t\t\t\tposition: relative;\n\t\t\t\t\tmax-width: 100%;\n\t\t\t\t\toverflow: hidden;\n\t\t\t\t}\n\t\n\t\t\t\t.desktopVideo {\n\t\t\t\t\twidth: 100%;\n\t\t\t\t\theight: auto;\n\t\t\t\t\tmargin-left: auto;\n\t\t\t\t\tmargin-right: auto;\n\t\t\t\t\tmax-width: 100vw;\n\t\t\t\t\tmax-height: 100vh;\n\t\t\t\t}\n\t\n\t\t\t\t.desktopRectangle {\n\t\t\t\t\tposition: absolute;\n\t\t\t\t\ttop: 32px;\n\t\t\t\t\tright: 32px;\n\t\t\t\t\tbottom: 32px;\n\t\t\t\t\tleft: 28px;\n\t\t\t\t\tborder-radius: 30px;\n\t\t\t\t\tdisplay: flex;\n\t\t\t\t\tjustify-content: center;\n\t\t\t\t\talign-items: center;\n\t\t\t\t}\n\t\n\t\t\t\t.dashedRectangle {\n\t\t\t\t\tborder: 5px dashed #5078bb;\n\t\t\t\t}\n\t\n\t\t\t\t.solidRectangle {\n\t\t\t\t\tborder: 5px solid #5078bb;\n\t\t\t\t}\n\t\n\t\t\t\t.backgroundOverlay {\n\t\t\t\t\tposition: absolute;\n\t\t\t\t\ttop: 0;\n\t\t\t\t\tleft: 0;\n\t\t\t\t\twidth: 100%;\n\t\t\t\t\theight: 100%;\n\t\t\t\t\tbackground-color: rgba(0, 0, 0, 0.051);\n\t\t\t\t\tz-index: 2;\n\t\t\t\t\tpointer-events: none;\n\t\t\t\t}\n\t\n\t\t\t\t.desktopFeedback {\n\t\t\t\t\tposition: relative;\n\t\t\t\t\tdisplay: flex;\n\t\t\t\t\tfont-size: 22px;\n\t\t\t\t\tfont-weight: 600;\n\t\t\t\t\tmin-height: 36px;\n\t\t\t\t\tjustify-content: center;\n\t\t\t\t\talign-items: center;\n\t\t\t\t\tcolor: #5078bb;\n\t\t\t\t}\n\t\t\t</style>\n\t\t`;\n }\n}\nlet EXTRACTION_VIDEO = undefined;\nfunction getExtractionVideo(onSuccessfulExtraction) {\n if (EXTRACTION_VIDEO === undefined) {\n EXTRACTION_VIDEO = new ExtractorVideo(onSuccessfulExtraction);\n } else {\n console.error(\"Extraction video already created. Returning existing object.\");\n }\n return EXTRACTION_VIDEO;\n}\nasync function checkAutofocusSupport(environmentCameras) {\n try {\n const camerasWithAutofocus = [];\n for (const camera of environmentCameras) {\n // console.log(camera.deviceId);\n const constraints = {\n video: {\n deviceId: {\n exact: camera.deviceId\n }\n }\n };\n\n // Try to access camera stream with autofocus enabled\n const stream = await navigator.mediaDevices.getUserMedia(constraints);\n const tracks = stream.getVideoTracks();\n\n // Check if autofocus is supported\n const capabilities = tracks[0].getCapabilities();\n // console.log(capabilities);\n if (capabilities.focusMode && capabilities.focusMode.includes(\"continuous\")) {\n camerasWithAutofocus.push(camera);\n }\n\n // Cleanup\n stream.getTracks().forEach(track => track.stop());\n }\n return camerasWithAutofocus;\n } catch (error) {\n console.log(\"Error checking autofocus support:\", error);\n return [];\n }\n}\n\n//# sourceURL=webpack://scandoc-ai-components/./src/lib/components/Video.js?");
160
160
 
161
161
  /***/ }),
162
162
 
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "scandoc-ai-components",
3
3
  "author": "ScanDoc-AI",
4
- "version": "0.0.7",
4
+ "version": "0.0.9",
5
5
  "private": false,
6
6
  "description": "Pure JavaScript package for integrating ScanDoc-AI services.",
7
7
  "keywords": [