@jaak.ai/stamps 2.2.0 → 2.3.0-dev.3
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.
- package/dist/cjs/jaak-stamps.cjs.entry.js +59 -4
- package/dist/cjs/jaak-stamps.cjs.entry.js.map +1 -1
- package/dist/cjs/jaak-stamps.entry.cjs.js.map +1 -1
- package/dist/collection/components/my-component/my-component.js +20 -4
- package/dist/collection/components/my-component/my-component.js.map +1 -1
- package/dist/collection/services/factories/DeviceStrategyFactory.js +7 -0
- package/dist/collection/services/factories/DeviceStrategyFactory.js.map +1 -1
- package/dist/collection/services/strategies/IOSSafariStrategy.js +33 -0
- package/dist/collection/services/strategies/IOSSafariStrategy.js.map +1 -0
- package/dist/components/jaak-stamps.js +59 -4
- package/dist/components/jaak-stamps.js.map +1 -1
- package/dist/esm/jaak-stamps.entry.js +59 -4
- package/dist/esm/jaak-stamps.entry.js.map +1 -1
- package/dist/jaak-stamps-webcomponent/jaak-stamps-webcomponent.esm.js +1 -1
- package/dist/jaak-stamps-webcomponent/jaak-stamps.entry.esm.js.map +1 -1
- package/dist/jaak-stamps-webcomponent/p-e91f65fd.entry.js +7 -0
- package/dist/jaak-stamps-webcomponent/p-e91f65fd.entry.js.map +1 -0
- package/dist/types/services/strategies/IOSSafariStrategy.d.ts +12 -0
- package/package.json +1 -1
- package/dist/jaak-stamps-webcomponent/p-34bcebb1.entry.js +0 -7
- package/dist/jaak-stamps-webcomponent/p-34bcebb1.entry.js.map +0 -1
|
@@ -727,9 +727,48 @@ class HighPerformanceDeviceStrategy {
|
|
|
727
727
|
}
|
|
728
728
|
}
|
|
729
729
|
|
|
730
|
+
/**
|
|
731
|
+
* Strategy for iOS Safari to prevent jetsam memory kills.
|
|
732
|
+
* WebKit 26+ has a known bug with ONNX Runtime JSEP mode that causes memory exhaustion.
|
|
733
|
+
* This strategy forces pure WASM execution without GPU acceleration.
|
|
734
|
+
* See: https://github.com/microsoft/onnxruntime/issues/26827
|
|
735
|
+
*/
|
|
736
|
+
class IOSSafariStrategy {
|
|
737
|
+
getDeviceInfo() {
|
|
738
|
+
return {
|
|
739
|
+
estimatedRAM: 3,
|
|
740
|
+
isLowMemory: true,
|
|
741
|
+
isSlowConnection: false
|
|
742
|
+
};
|
|
743
|
+
}
|
|
744
|
+
getSessionOptions(_debug) {
|
|
745
|
+
return {
|
|
746
|
+
// Force pure WASM - no WebGL, no WebGPU, no JSEP
|
|
747
|
+
executionProviders: ['wasm'],
|
|
748
|
+
graphOptimizationLevel: 'disabled', // Disable graph optimization to reduce memory
|
|
749
|
+
logSeverityLevel: 4,
|
|
750
|
+
logVerbosityLevel: 0,
|
|
751
|
+
enableCpuMemArena: false, // Don't use CPU memory arena
|
|
752
|
+
enableMemPattern: false, // Don't use memory pattern optimization
|
|
753
|
+
executionMode: 'sequential', // Sequential execution uses less memory
|
|
754
|
+
interOpNumThreads: 1, // Single thread
|
|
755
|
+
intraOpNumThreads: 1, // Single thread
|
|
756
|
+
};
|
|
757
|
+
}
|
|
758
|
+
shouldUseSequentialLoading() {
|
|
759
|
+
return true;
|
|
760
|
+
}
|
|
761
|
+
}
|
|
762
|
+
|
|
730
763
|
class DeviceStrategyFactory {
|
|
731
764
|
static createStrategy() {
|
|
732
765
|
const nav = navigator;
|
|
766
|
+
const ua = navigator.userAgent;
|
|
767
|
+
// All iOS browsers use WebKit, which has memory constraints
|
|
768
|
+
const isIOS = /iPad|iPhone|iPod/.test(ua);
|
|
769
|
+
if (isIOS) {
|
|
770
|
+
return new IOSSafariStrategy();
|
|
771
|
+
}
|
|
733
772
|
const memory = nav.deviceMemory || nav.hardwareConcurrency || 4;
|
|
734
773
|
const isLowMemory = memory <= 4;
|
|
735
774
|
if (isLowMemory) {
|
|
@@ -18874,10 +18913,26 @@ const JaakStamps = class {
|
|
|
18874
18913
|
if (!window.ort) {
|
|
18875
18914
|
this.updateStatus('Preparando herramientas...', 'Configurando funciones de captura', 'initializing');
|
|
18876
18915
|
const script = document.createElement('script');
|
|
18877
|
-
|
|
18916
|
+
// iOS devices use WASM-only build to prevent memory issues (WebKit 26+ bug)
|
|
18917
|
+
// All iOS browsers use WebKit, so this applies to Safari, Chrome, Firefox, etc.
|
|
18918
|
+
const ua = navigator.userAgent;
|
|
18919
|
+
const isIOS = /iPad|iPhone|iPod/.test(ua);
|
|
18920
|
+
if (isIOS) {
|
|
18921
|
+
script.src = 'https://cdn.jsdelivr.net/npm/onnxruntime-web@1.23.0/dist/ort.wasm.min.js';
|
|
18922
|
+
}
|
|
18923
|
+
else {
|
|
18924
|
+
script.src = 'https://cdn.jsdelivr.net/npm/onnxruntime-web@1.23.0/dist/ort.min.js';
|
|
18925
|
+
}
|
|
18878
18926
|
document.head.appendChild(script);
|
|
18879
18927
|
await new Promise((resolve) => {
|
|
18880
18928
|
script.onload = () => {
|
|
18929
|
+
// Configure ONNX for iOS low memory mode
|
|
18930
|
+
if (isIOS && window.ort?.env) {
|
|
18931
|
+
const ort = window.ort;
|
|
18932
|
+
ort.env.wasm.simd = false;
|
|
18933
|
+
ort.env.wasm.numThreads = 1;
|
|
18934
|
+
ort.env.wasm.proxy = false;
|
|
18935
|
+
}
|
|
18881
18936
|
setTimeout(async () => {
|
|
18882
18937
|
await this.finalizeInitialization();
|
|
18883
18938
|
resolve(undefined);
|
|
@@ -19734,7 +19789,7 @@ const JaakStamps = class {
|
|
|
19734
19789
|
isCapturing: false
|
|
19735
19790
|
};
|
|
19736
19791
|
const cameraInfo = this.cameraInfoWithAutofocus;
|
|
19737
|
-
return (h("div", { key: '
|
|
19792
|
+
return (h("div", { key: 'c5af80713fb108ab73d086f2acbdd11277d7d52c', class: "detector-container" }, !this.licenseValid && this.licenseError && (h("div", { key: '99c886b52f58e667f76dce00f09828b9962b3606', class: "license-error-container" }, h("div", { key: 'ffd643ef41b3a4b1aa8f40075232a1d70695d566', class: "license-error-card" }, h("svg", { key: '90e628f4e6e20ac8b27560833ada7486aac1c9fb', class: "license-error-icon", width: "64", height: "64", viewBox: "0 0 24 24", fill: "none", xmlns: "http://www.w3.org/2000/svg" }, h("path", { key: 'cb442fe342c6c0ffb50dfcda42d0af43adedf143', d: "M12 22C12 22 20 18 20 12V5L12 2L4 5V12C4 18 12 22 12 22Z", stroke: "currentColor", "stroke-width": "2", "stroke-linecap": "round", "stroke-linejoin": "round" }), h("path", { key: '6b29651b70273f585d9870e71811c0cdb57ea659', d: "M12 8V12", stroke: "currentColor", "stroke-width": "2", "stroke-linecap": "round" }), h("circle", { key: '9ec1e61c3bc9e6f7046a49e45e7ef87880d8a443', cx: "12", cy: "16", r: "0.5", fill: "currentColor", stroke: "currentColor", "stroke-width": "1" })), h("h2", { key: '56de8037a70da2c0b185029d4a9da0c935fd8c2b', class: "license-error-title" }, "Licencia Requerida"), h("p", { key: 'b6634818db630b62c8a5aa6152adc8e6da5f329f', class: "license-error-message" }, this.licenseError), h("p", { key: '8c0b404805c2515912416b9a62d66680e6d4b411', class: "license-error-help" }, "Contacte a soporte: ", h("a", { key: '1cd69e09c282353548ad9b14985054e47b6ff218', href: "mailto:support@jaak.ai" }, "support@jaak.ai")), h("div", { key: 'c2d13002c8f91a35b647199c77eb78b5643316df', class: "license-error-footer" }, "JAAK Stamps")))), this.licenseValid && (h("div", { key: '094f1c85b06758399520cb85a461e1af755e3d45', class: "video-container" }, h("video", { key: 'e7973937fa0d77c9793e984d063ec29a80d464eb', ref: el => this.videoRef = el, autoplay: true, muted: true, playsinline: true, class: this.shouldMirrorVideo ? 'mirror' : '', style: { display: captureState.isVideoActive ? 'block' : 'none' } }), h("div", { key: 'fb86b9eb362e13902d31803c187f5d2b6c5ac664', ref: el => this.detectionContainer = el, class: `detection-overlay ${this.shouldMirrorVideo ? 'mirror' : ''}` }, this.debug && this.detectionBoxes.map((box, index) => (h("div", { key: index, class: "detection-box", style: {
|
|
19738
19793
|
position: 'absolute',
|
|
19739
19794
|
left: `${box.x}px`,
|
|
19740
19795
|
top: `${box.y}px`,
|
|
@@ -19743,9 +19798,9 @@ const JaakStamps = class {
|
|
|
19743
19798
|
border: '2px solid #32406C',
|
|
19744
19799
|
pointerEvents: 'none',
|
|
19745
19800
|
boxSizing: 'border-box'
|
|
19746
|
-
} })))), this.isMaskReady && (h("div", { key: '
|
|
19801
|
+
} })))), this.isMaskReady && (h("div", { key: '28a8d52ace75ee2dc3f4cd31275f2feae0db31e3', class: "overlay-mask" }, h("div", { key: '16c956f26a514c67ae178da5db2c0d19b53acdac', class: "card-outline" }, h("div", { key: '578f111f358c0b66968b389f99235d1361ff035c', class: "side side-top" }), h("div", { key: 'e7854fd3363f340fd2c832815e7c8aaf8935e5f4', class: "side side-right" }), h("div", { key: 'c6f58f1c03506ec8920b914b76679730d1944b0e', class: "side side-bottom" }), h("div", { key: 'a1af9d6777819d2c941ff99b985c3430d673e534', class: "side side-left" })), !captureState.showFlipAnimation && !captureState.showSuccessAnimation && (h("div", { key: 'fc9ec8cf13eb9b25140ebb9cfddd6636dc3b6e99', class: `guide-text ${this.showPerformanceMessage ? 'performance-warning-text' : ''}` }, this.getGuideText(captureState.step))), captureState.step === 'back' && !captureState.showFlipAnimation && !captureState.showSuccessAnimation && (h("div", { key: '078ce12f5f2d24928d3f66eedac97f8c4bae3717', class: "back-capture-section" }, h("div", { key: '9bf0528cc9fc691c212cf413bafdfeb999b47682', class: "back-capture-buttons" }, (!this.useDocumentDetector || this.performanceDegradedMode || this.showManualCaptureButton) && (h("button", { key: '8d5613bda9e823293181f4551dfc5a49683a0e3e', class: "capture-button primary-button", onClick: () => this.takeManualScreenshot(), type: "button", disabled: this.processingButton !== null }, this.processingButton === 'capture-back' && (h("span", { key: '19909120ab9576d4b820e528c1456f8ba5f17fb9', class: "button-spinner" })), "Capturar Reverso")), h("button", { key: '6e1cfac4e73ace6a2e59ed601e82c3f5b2770681', class: "skip-button", onClick: () => this.skipBackCapture(), type: "button", disabled: this.processingButton !== null }, this.processingButton === 'skip-back' && (h("span", { key: '4aa6846d76295a428185ef3a83d15554eb2d9d00', class: "button-spinner" })), this.enableBackDocumentTimer && this.backDocumentTimerRemaining > 0
|
|
19747
19802
|
? `Saltar reverso (${this.backDocumentTimerRemaining}s)`
|
|
19748
|
-
: 'Saltar reverso')))), captureState.isVideoActive && (h("div", { key: '
|
|
19803
|
+
: 'Saltar reverso')))), captureState.isVideoActive && (h("div", { key: '1c2ca195f159238c1b234e97dd3871d0a1caa3c8', class: "camera-controls" }, h("button", { key: '085795c9083606fde64aeb211c242c031ebaf66a', class: `camera-selector-button ${this.isSwitchingCamera ? 'loading' : ''}`, onClick: () => this.toggleCameraSelector(), type: "button", title: "Seleccionar c\u00E1mara", disabled: this.isSwitchingCamera }, this.isSwitchingCamera ? (h("div", { class: "button-spinner" })) : ('Cámaras')))), this.showCameraSelector && cameraInfo.availableCameras.length > 0 && (h("div", { key: 'e153c9e786afc0e911c32056351fa358eca45d21', class: "camera-selector-dropdown" }, h("div", { key: 'cb611c0d0b3170da382cb54895888d465ac4bd0a', class: "camera-selector-header" }, h("span", { key: '200f7cdf43ec10163e573fbc00b077d75cc703ae' }, "Seleccionar C\u00E1mara"), h("button", { key: '86cd2942c5a499053e64d2432dfbaa2bf9612777', class: "close-selector", onClick: () => this.toggleCameraSelector(), type: "button" }, "\u00D7")), h("div", { key: '1085775e191c43105ac4c645bb8fa227f1a230f5', class: "camera-list" }, cameraInfo.availableCameras.map((camera) => (h("button", { key: camera.id, class: `camera-option ${cameraInfo.selectedCameraId === camera.id ? 'selected' : ''}`, onClick: () => this.handleCameraSwitch(camera.id), type: "button" }, h("span", { class: "camera-label" }, camera.label || `Cámara ${cameraInfo.availableCameras.indexOf(camera) + 1}`, camera.hasAutofocus && (h("span", { class: "autofocus-icon", title: "Autofoco disponible" }, "\u29BF"))), cameraInfo.selectedCameraId === camera.id && (h("span", { class: "selected-indicator" }, "\u2713")))))), h("div", { key: 'b7465daa8357fce5192ba4800b03fc200e065145', class: "device-info" }, h("small", { key: '2c824e7585afd324cefd071cdda380f3df5ada1b' }, "Dispositivo: ", cameraInfo.deviceType)))), this.showManualCaptureButton && captureState.step === 'front' && !captureState.showFlipAnimation && !captureState.showSuccessAnimation && (h("div", { key: '703f54145582191eaddcecd22a718dd72e16f977', class: "manual-capture-section" }, h("button", { key: 'dcbaa7e780c4bdb0703653e25146b17248a2d8c9', class: "manual-capture-button", onClick: () => this.takeManualScreenshot(), type: "button", disabled: this.processingButton !== null }, this.processingButton === 'capture-front' && (h("span", { key: 'cb989324a41f502ae740941ad75e6240051d8273', class: "button-spinner" })), "Capturar Frente"))))), captureState.isCapturing && (h("div", { key: 'c3567ccbd287c39f72cbca897e5f643c68624b5e', class: "capture-animation" })), captureState.showFlipAnimation && (h("div", { key: 'b16f56f7fc7c710a4b41760515b2b8054d2aad4c', class: "flip-animation" }, h("div", { key: 'df905809f04bece3856545f8a6a1dcce89377377', class: "id-card-icon" }), h("div", { key: 'daa09f264bf3708e535a3be580b86145568d4f66', class: "flip-text" }, "\u00A1Voltea tu identificaci\u00F3n!"))), captureState.showSuccessAnimation && (h("div", { key: '1be7277ef588b42060808b575670872a6aa08925', class: "success-animation" }, h("div", { key: 'ce18848121423499a4bc7b2e95586f3a01bc6ceb', class: "check-icon" }), h("div", { key: '2e2ae20c3e4bffbf3ec45f2fd7016a485ea380c1', class: "success-text" }, "\u00A1Proceso completado!"))), h("div", { key: '951f37ba2b6366aa44e15c1dcf17b2ec6975131d', class: `component-status status-${this.currentStatus.type}` }, (this.currentStatus.type === 'loading' || this.currentStatus.type === 'initializing') && (h("div", { key: '1718aa68ed5db592183696bc212c7066f35bf789', class: "status-spinner" })), h("div", { key: '45bf0d9ee7786578b34d25623667ee8336720270', class: "status-content" }, h("div", { key: '4fa2c1f9ddc62981cefbd63c19e04d14a503a406', class: "status-message" }, this.currentStatus.message), this.currentStatus.description && (h("div", { key: '7f38fb0096a15467a63362979137981e84df55f9', class: "status-description" }, this.currentStatus.description)))), this.debug && (h("div", { key: '692e49518f3f78960b74f47741f2051e95ce9280', class: "performance-monitor" }, h("div", { key: 'be9f96048e16510203d8abc3b2b09ea9a0e91fe1', class: "performance-expanded" }, h("div", { key: 'ca19a5467a8bba02be34e3515af3f92839a4397a', class: "metrics-row" }, h("div", { key: '54a6b187da25a3a6af0c8fbfc023fb16b45bb606', class: "metric-compact" }, h("span", { key: '52b9bd1bbb8542011139b4556af213f64cc62c1f', class: "metric-label" }, "FPS"), h("span", { key: 'eff3acd45c407866e9c67205a4b4f0727b47afc8', class: `metric-value ${this.performanceData.fps < 15 ? 'warning' : this.performanceData.fps < 10 ? 'danger' : 'good'}` }, this.performanceData.fps)), h("div", { key: 'fad4f7c5603ba7c2a95544d37f9d4b61c1840dca', class: "metric-compact" }, h("span", { key: 'e01386e6898c3f036f66795e71e65dad4d11366a', class: "metric-label" }, "MEM"), h("span", { key: '71cb13b49656c869be920080f7b53ce2e709a4c0', class: `metric-value ${this.performanceData.memoryUsage > 100 ? 'warning' : this.performanceData.memoryUsage > 200 ? 'danger' : 'good'}` }, this.performanceData.memoryUsage, "MB"))), h("div", { key: '61fa2c277a2226f68d9dc036450dc086a1409b62', class: "metrics-row" }, h("div", { key: '752052d1cdc68a5d65c3ec3f0b85241527d251ae', class: "metric-compact" }, h("span", { key: 'de5fae8f627df6347e5569d31433a96476bba22d', class: "metric-label" }, "INF"), h("span", { key: '841c1a1b42e63e9fc4c56c72b54e07e47997f8be', class: `metric-value ${this.performanceData.inferenceTime > 100 ? 'warning' : this.performanceData.inferenceTime > 200 ? 'danger' : 'good'}` }, this.performanceData.inferenceTime, "ms")), h("div", { key: '194d01303155cda7b58a3bca1bd34795eac31556', class: "metric-compact" }, h("span", { key: '73f023e1de8b6fbc8976bc3fe1d9655d3d5f3c92', class: "metric-label" }, "FRAME"), h("span", { key: 'ddb8d7fa99b83f477bd8cbfe4ca856d2baa7a493', class: `metric-value ${this.performanceData.frameProcessingTime > 50 ? 'warning' : this.performanceData.frameProcessingTime > 100 ? 'danger' : 'good'}` }, this.performanceData.frameProcessingTime, "ms"))), h("div", { key: '37eb5780cd09e3c056e7094b6b028789529112e3', class: "metrics-row" }, h("div", { key: '236828977e1a634fddda1fef079c7780e469b815', class: "metric-compact" }, h("span", { key: 'd704dd8ba1e2080159a932c87208d2747feeb030', class: "metric-label" }, "DET"), h("span", { key: 'e0ceaf4cc91c00835bf92fdd3744a26958f39105', class: "metric-value good" }, this.performanceData.successfulDetections, "/", this.performanceData.totalDetections)), h("div", { key: '96ad9e60657306f20efc285fd6eb5a83c3b8ee32', class: "metric-compact" }, h("span", { key: '25e0ea0b4f16118b0bf7b9b974997b9bf832d2f8', class: "metric-label" }, "RATE"), h("span", { key: '3f6f5370611d6fa6a927bc8ec1e03d0c262a3466', class: `metric-value ${this.performanceData.detectionRate < 30 ? 'danger' : this.performanceData.detectionRate < 60 ? 'warning' : 'good'}` }, this.performanceData.detectionRate, "%")))))), h("div", { key: '429a70ff02a2a2de127cb6cfe3426df1fdc4bbae', class: "watermark" }, h("img", { key: 'cc4174740e58367b2e66b6029dcca8404a3dccee', src: "https://storage.googleapis.com/jaak-static/commons/powered-by-jaak.png", alt: "Powered by Jaak" }))))));
|
|
19749
19804
|
}
|
|
19750
19805
|
// Utility methods
|
|
19751
19806
|
updateDetectionBoxes(boxes) {
|