Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 3 additions & 1 deletion app/controllers/acuant_sdk_controller.rb
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ class AcuantSdkController < ApplicationController
skip_before_action :verify_authenticity_token

ACUANT_SDK_STATIC_FILES = %w[
AcuantImageProcessingService.wasm
AcuantImageProcessingService.js.mem
AcuantImageProcessingWorker.min.js
AcuantImageProcessingWorker.wasm
AcuantJavascriptWebSdk.min.js
Expand Down Expand Up @@ -40,6 +40,8 @@ def response_content_type
'application/javascript'
when '.wasm'
'application/wasm'
when '.mem'
'application/octet-stream'
end
end
end
21 changes: 19 additions & 2 deletions app/javascript/app/acuant/document_capture.js
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,24 @@ const {
export const imageCaptureButtonClicked = (event) => {
event.preventDefault();
acuantImageCaptureStarted();
window.AcuantCameraUI.start(acuantImageCaptureSuccess, acuantImageCaptureFailed);

const start = window.AcuantCamera.isCameraSupported
? window.AcuantCameraUI.start.bind(window.AcuantCameraUI)
: window.AcuantCamera.startManualCapture.bind(window.AcuantCamera);

start(
{
onCaptured() {},
onCropped(response) {
if (response) {
acuantImageCaptureSuccess(response);
} else {
acuantImageCaptureFailed();
}
},
},
acuantImageCaptureFailed,
);
};

export const initializeAcuantSdk = (credentials = null, endpoint = null) => {
Expand All @@ -33,7 +50,7 @@ export const loadAndInitializeAcuantSdk = () => {
window.onAcuantSdkLoaded = initializeAcuantSdk;

const sdk = document.createElement('script');
sdk.src = 'AcuantJavascriptWebSdk.min.js';
sdk.src = '11.4.1/AcuantJavascriptWebSdk.min.js';
sdk.async = true;

document.body.appendChild(sdk);
Expand Down
2 changes: 1 addition & 1 deletion app/javascript/app/acuant/selfie_capture.js
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@ export const loadAndInitializeAcuantSdk = () => {
window.onAcuantSdkLoaded = initializeAcuantSdk;

const sdk = document.createElement('script');
sdk.src = 'AcuantJavascriptWebSdk.min.js';
sdk.src = '11.4.1/AcuantJavascriptWebSdk.min.js';
sdk.async = true;

document.body.appendChild(sdk);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,33 @@ import React, { useContext, useEffect } from 'react';
import AcuantContext from '../context/acuant';
import useAsset from '../hooks/use-asset';

/**
* Document type.
*
* 0 = None
* 1 = ID
* 2 = Passport
*
* @typedef {0|1|2} AcuantDocumentType
*/

/**
* @typedef AcuantCameraUICallbacks
*
* @prop {(response: AcuantCaptureImage)=>void} onCaptured Document captured callback.
* @prop {(response: AcuantSuccessResponse?)=>void} onCropped Document cropped callback. Null if
* cropping error.
* @prop {(response: object)=>void=} onFrameAvailable Optional frame available callback.
*/

/**
* @typedef AcuantCameraUI
*
* @prop {(AcuantSuccessCallback,AcuantFailureCallback)=>void} start Start capture.
* @prop {()=>void} end End capture.
* @prop {(
* callbacks: AcuantCameraUICallbacks,
* onError: AcuantFailureCallback
* )=>void} start Start capture.
* @prop {()=>void} end End capture.
*/

/**
Expand All @@ -20,31 +42,39 @@ import useAsset from '../hooks/use-asset';
*/

/**
* @typedef AcuantImage
* @typedef AcuantCaptureImage
*
* @prop {string} data Base64-encoded image data.
* @prop {Blob} data Pre-cropped image data.
* @prop {number} width Image width.
* @prop {number} height Image height.
*/

/**
* @typedef AcuantImage
*
* @prop {string} data Base64-encoded image data.
* @prop {number} width Image width.
* @prop {number} height Image height.
*/

/**
* @typedef AcuantSuccessResponse
*
* @prop {AcuantImage} image Image object.
* @prop {boolean} isPassport Whether document is passport.
* @prop {number} glare Detected image glare.
* @prop {number} sharpness Detected image sharpness.
* @prop {number} dpi Detected image resolution.
* @prop {AcuantImage} image Image object.
* @prop {AcuantDocumentType} cardType Document type.
* @prop {number} glare Detected image glare.
* @prop {number} sharpness Detected image sharpness.
* @prop {number} dpi Detected image resolution.
*
* @see https://github.com/Acuant/JavascriptWebSDKV11/tree/11.3.3/SimpleHTMLApp#acuantcamera
* @see https://github.com/Acuant/JavascriptWebSDKV11/tree/11.4.1/SimpleHTMLApp#acuantcameraui
*/

/**
* @typedef {(response:AcuantSuccessResponse)=>void} AcuantSuccessCallback
*/

/**
* @typedef {(error:Error)=>void} AcuantFailureCallback
* @typedef {(error?:Error)=>void} AcuantFailureCallback
*/

/**
Expand All @@ -67,7 +97,16 @@ function AcuantCaptureCanvas({
useEffect(() => {
if (isReady) {
/** @type {AcuantGlobal} */ (window).AcuantCameraUI.start(
onImageCaptureSuccess,
{
onCaptured() {},
onCropped(response) {
if (response) {
onImageCaptureSuccess(response);
} else {
onImageCaptureFailure();
}
},
},
onImageCaptureFailure,
);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,7 @@ const AcuantContext = createContext({
* @param {AcuantContextProviderProps} props Props object.
*/
function AcuantContextProvider({
sdkSrc = '/AcuantJavascriptWebSdk.min.js',
sdkSrc = '11.4.1/AcuantJavascriptWebSdk.min.js',
credentials = null,
endpoint = null,
children,
Expand Down
8 changes: 5 additions & 3 deletions config/routes.rb
Original file line number Diff line number Diff line change
Expand Up @@ -261,9 +261,11 @@
delete '/users' => 'users#destroy', as: :destroy_user

AcuantSdkController::ACUANT_SDK_STATIC_FILES.each do |acuant_sdk_file|
get "/verify/doc_auth/#{acuant_sdk_file}" => 'acuant_sdk#show'
get "/verify/capture_doc/#{acuant_sdk_file}" => 'acuant_sdk#show'
get "/verify/capture-doc/#{acuant_sdk_file}" => 'acuant_sdk#show'
constraints version: /\d+\.\d+\.\d+/ do
get "/verify/doc_auth(/:version)/#{acuant_sdk_file}" => 'acuant_sdk#show'
get "/verify/capture_doc(/:version)/#{acuant_sdk_file}" => 'acuant_sdk#show'
get "/verify/capture-doc(/:version)/#{acuant_sdk_file}" => 'acuant_sdk#show'
end
end

scope '/verify', as: 'idv' do
Expand Down
Binary file added public/AcuantImageProcessingService.js.mem
Binary file not shown.
Binary file removed public/AcuantImageProcessingService.wasm
Binary file not shown.
2 changes: 1 addition & 1 deletion public/AcuantImageProcessingWorker.min.js

Large diffs are not rendered by default.

Binary file modified public/AcuantImageProcessingWorker.wasm
Binary file not shown.
4 changes: 1 addition & 3 deletions public/AcuantJavascriptWebSdk.min.js

Large diffs are not rendered by default.

13 changes: 8 additions & 5 deletions spec/javascripts/app/acuant/document_capture_spec.js
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,7 @@ describe('acuant/document_capture', () => {
loadAndInitializeAcuantSdk();

const script = document.querySelector('script');
expect(script.src).to.eq('AcuantJavascriptWebSdk.min.js');
expect(script.src).to.eq('11.4.1/AcuantJavascriptWebSdk.min.js');
expect(script.async).to.eq(true);
expect(window.onAcuantSdkLoaded).to.eq(initializeAcuantSdk);
});
Expand Down Expand Up @@ -120,6 +120,7 @@ describe('acuant/document_capture', () => {
const event = { preventDefault: () => {} };

beforeEach(() => {
window.AcuantCamera = { isCameraSupported: true };
window.AcuantCameraUI = {
start: sinon.spy(),
end: sinon.spy(),
Expand Down Expand Up @@ -154,8 +155,9 @@ describe('acuant/document_capture', () => {

expect(window.AcuantCameraUI.end.calledOnce).to.eq(false);

const successCallback = window.AcuantCameraUI.start.lastCall.args[0];
successCallback(response);
const callbacks = window.AcuantCameraUI.start.lastCall.args[0];
callbacks.onCaptured();
callbacks.onCropped(response);

expect(window.AcuantCameraUI.end.calledOnce).to.eq(true);

Expand All @@ -178,8 +180,9 @@ describe('acuant/document_capture', () => {

expect(window.AcuantCameraUI.end.calledOnce).to.eq(false);

const successCallback = window.AcuantCameraUI.start.lastCall.args[0];
successCallback(response);
const callbacks = window.AcuantCameraUI.start.lastCall.args[0];
callbacks.onCaptured();
callbacks.onCropped(response);

expect(window.AcuantCameraUI.end.calledOnce).to.eq(true);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -156,12 +156,17 @@ describe('document-capture/components/acuant-capture', () => {
);

initialize({
start: sinon.stub().callsArgWithAsync(0, {
glare: 70,
sharpness: 70,
image: {
data: 'data:image/svg+xml,%3Csvg xmlns="http://www.w3.org/2000/svg"/%3E',
},
start: sinon.stub().callsFake(async (callbacks) => {
await Promise.resolve();
callbacks.onCaptured();
await Promise.resolve();
callbacks.onCropped({
glare: 70,
sharpness: 70,
image: {
data: 'data:image/svg+xml,%3Csvg xmlns="http://www.w3.org/2000/svg"/%3E',
},
});
}),
});

Expand Down Expand Up @@ -245,12 +250,17 @@ describe('document-capture/components/acuant-capture', () => {
);

initialize({
start: sinon.stub().callsArgWithAsync(0, {
glare: 38,
sharpness: 70,
image: {
data: 'data:image/svg+xml,%3Csvg xmlns="http://www.w3.org/2000/svg"/%3E',
},
start: sinon.stub().callsFake(async (callbacks) => {
await Promise.resolve();
callbacks.onCaptured();
await Promise.resolve();
callbacks.onCropped({
glare: 38,
sharpness: 70,
image: {
data: 'data:image/svg+xml,%3Csvg xmlns="http://www.w3.org/2000/svg"/%3E',
},
});
}),
});

Expand All @@ -272,12 +282,17 @@ describe('document-capture/components/acuant-capture', () => {
);

initialize({
start: sinon.stub().callsArgWithAsync(0, {
glare: 70,
sharpness: 20,
image: {
data: 'data:image/svg+xml,%3Csvg xmlns="http://www.w3.org/2000/svg"/%3E',
},
start: sinon.stub().callsFake(async (callbacks) => {
await Promise.resolve();
callbacks.onCaptured();
await Promise.resolve();
callbacks.onCropped({
glare: 70,
sharpness: 20,
image: {
data: 'data:image/svg+xml,%3Csvg xmlns="http://www.w3.org/2000/svg"/%3E',
},
});
}),
});

Expand All @@ -299,12 +314,17 @@ describe('document-capture/components/acuant-capture', () => {
);

initialize({
start: sinon.stub().callsArgWithAsync(0, {
glare: 70,
sharpness: 20,
image: {
data: 'data:image/svg+xml,%3Csvg xmlns="http://www.w3.org/2000/svg"/%3E',
},
start: sinon.stub().callsFake(async (callbacks) => {
await Promise.resolve();
callbacks.onCaptured();
await Promise.resolve();
callbacks.onCropped({
glare: 70,
sharpness: 20,
image: {
data: 'data:image/svg+xml,%3Csvg xmlns="http://www.w3.org/2000/svg"/%3E',
},
});
}),
});

Expand Down Expand Up @@ -335,20 +355,30 @@ describe('document-capture/components/acuant-capture', () => {
start: sinon
.stub()
.onFirstCall()
.callsArgWithAsync(0, {
glare: 70,
sharpness: 20,
image: {
data: 'data:image/svg+xml,%3Csvg xmlns="http://www.w3.org/2000/svg"/%3E',
},
.callsFake(async (callbacks) => {
await Promise.resolve();
callbacks.onCaptured();
await Promise.resolve();
callbacks.onCropped({
glare: 70,
sharpness: 20,
image: {
data: 'data:image/svg+xml,%3Csvg xmlns="http://www.w3.org/2000/svg"/%3E',
},
});
})
.onSecondCall()
.callsArgWithAsync(0, {
glare: 70,
sharpness: 70,
image: {
data: 'data:image/svg+xml,%3Csvg xmlns="http://www.w3.org/2000/svg"/%3E',
},
.callsFake(async (callbacks) => {
await Promise.resolve();
callbacks.onCaptured();
await Promise.resolve();
callbacks.onCropped({
glare: 70,
sharpness: 70,
image: {
data: 'data:image/svg+xml,%3Csvg xmlns="http://www.w3.org/2000/svg"/%3E',
},
});
}),
});

Expand All @@ -371,12 +401,17 @@ describe('document-capture/components/acuant-capture', () => {
);

initialize({
start: sinon.stub().callsArgWithAsync(0, {
glare: 70,
sharpness: 38,
image: {
data: 'data:image/svg+xml,%3Csvg xmlns="http://www.w3.org/2000/svg"/%3E',
},
start: sinon.stub().callsFake(async (callbacks) => {
await Promise.resolve();
callbacks.onCaptured();
await Promise.resolve();
callbacks.onCropped({
glare: 70,
sharpness: 38,
image: {
data: 'data:image/svg+xml,%3Csvg xmlns="http://www.w3.org/2000/svg"/%3E',
},
});
}),
});

Expand Down
Loading