diff --git a/app/javascript/packages/document-capture/context/acuant.jsx b/app/javascript/packages/document-capture/context/acuant.jsx index 7548799fe12..aae41d7c7b8 100644 --- a/app/javascript/packages/document-capture/context/acuant.jsx +++ b/app/javascript/packages/document-capture/context/acuant.jsx @@ -4,6 +4,15 @@ import AnalyticsContext from './analytics'; /** @typedef {import('react').ReactNode} ReactNode */ +/** + * @typedef AcuantConfig + * + * @prop {string=} path Path from which to load SDK service worker. + * + * @see https://github.com/Acuant/JavascriptWebSDKV11/blob/11.4.3/SimpleHTMLApp/webSdk/dist/AcuantJavascriptWebSdk.js#L1025-L1027 + * @see https://github.com/Acuant/JavascriptWebSDKV11/blob/11.4.3/SimpleHTMLApp/webSdk/dist/AcuantJavascriptWebSdk.js#L1049 + */ + /** * @typedef AcuantCamera * @@ -40,8 +49,9 @@ import AnalyticsContext from './analytics'; /** * @typedef AcuantGlobals * - * @prop {()=>void} onAcuantSdkLoaded Acuant initialization callback. - * @prop {AcuantCamera} AcuantCamera Acuant camera API. + * @prop {AcuantConfig=} acuantConfig Acuant configuration. + * @prop {()=>void} onAcuantSdkLoaded Acuant initialization callback. + * @prop {AcuantCamera} AcuantCamera Acuant camera API. * @prop {AcuantJavaScriptWebSDK} AcuantJavascriptWebSdk Acuant web SDK. */ @@ -74,6 +84,15 @@ export const DEFAULT_ACCEPTABLE_GLARE_SCORE = 30; */ export const DEFAULT_ACCEPTABLE_SHARPNESS_SCORE = 30; +/** + * Returns the containing directory of the given file, including a trailing slash. + * + * @param {string} file + * + * @return {string} + */ +export const dirname = (file) => file.split('/').slice(0, -1).concat('').join('/'); + const AcuantContext = createContext({ isReady: false, isAcuantLoaded: false, @@ -175,6 +194,9 @@ function AcuantContextProvider({ ); }; + const originalAcuantConfig = /** @type {AcuantGlobal} */ (window).acuantConfig; + /** @type {AcuantGlobal} */ (window).acuantConfig = { path: dirname(sdkSrc) }; + const script = document.createElement('script'); script.async = true; script.src = sdkSrc; @@ -183,6 +205,7 @@ function AcuantContextProvider({ return () => { /** @type {AcuantGlobal} */ (window).onAcuantSdkLoaded = originalOnAcuantSdkLoaded; + /** @type {AcuantGlobal} */ (window).acuantConfig = originalAcuantConfig; document.body.removeChild(script); }; }, []); diff --git a/config/initializers/secure_headers.rb b/config/initializers/secure_headers.rb index 5cc94bda25a..4104a24fdd6 100644 --- a/config/initializers/secure_headers.rb +++ b/config/initializers/secure_headers.rb @@ -110,7 +110,10 @@ def call(env) product(%w[doc_auth capture_doc]). map do |locale, flow| File.join('/', *locale, '/verify', flow, worker_js) - end.to_set.freeze + end. + push('/acuant/11.4.3/AcuantImageProcessingWorker.min.js'). + to_set. + freeze config.middleware.insert_before( SecureHeaders::Middleware, diff --git a/spec/javascripts/packages/document-capture/context/acuant-spec.jsx b/spec/javascripts/packages/document-capture/context/acuant-spec.jsx index 0cef17df87b..f4f8e900f16 100644 --- a/spec/javascripts/packages/document-capture/context/acuant-spec.jsx +++ b/spec/javascripts/packages/document-capture/context/acuant-spec.jsx @@ -3,6 +3,7 @@ import { useContext } from 'react'; import { renderHook } from '@testing-library/react-hooks'; import { DeviceContext, AnalyticsContext } from '@18f/identity-document-capture'; import AcuantContext, { + dirname, Provider as AcuantContextProvider, DEFAULT_ACCEPTABLE_GLARE_SCORE, DEFAULT_ACCEPTABLE_SHARPNESS_SCORE, @@ -15,6 +16,15 @@ describe('document-capture/context/acuant', () => { delete window.AcuantCamera; }); + describe('dirname', () => { + it('returns the containing directory with trailing slash', () => { + const file = '/acuant/AcuantJavascriptWebSdk.min.js'; + const result = dirname(file); + + expect(result).to.equal('/acuant/'); + }); + }); + it('provides default context value', () => { const { result } = renderHook(() => useContext(AcuantContext)); diff --git a/spec/requests/acuant_sdk_spec.rb b/spec/requests/acuant_sdk_spec.rb index b3094c3338c..cf2afb5e2bd 100644 --- a/spec/requests/acuant_sdk_spec.rb +++ b/spec/requests/acuant_sdk_spec.rb @@ -6,9 +6,11 @@ # - /en/verify/capture_doc/AcuantImageProcessingWorker.min.js [nil, *I18n.available_locales]. product(%w[doc_auth capture_doc]). - each do |locale, verify_path| + map do |locale, verify_path| base_url = "#{locale && "/#{locale}"}/verify/#{verify_path}" - + end. + push('/acuant/11.4.3'). + each do |base_url| min_js = "#{base_url}/AcuantImageProcessingWorker.min.js" context min_js do before { get min_js }