scandit-sdk
Version:
Scandit Barcode Scanner SDK for the Web
975 lines • 43.3 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.dataCaptureWorkerBlob = exports.dataCapture = void 0;
var tslib_1 = require("tslib");
/**
* @hidden
*
* @returns DataCapture
*/
// tslint:disable-next-line:max-func-body-length
function dataCapture() {
var writableDataPathPreload = "/scandit_sync_folder_preload";
var writableDataPathStandard = "/scandit_sync_folder";
var resourceFilesSubfolder = "resources";
var scanQueue = [];
var parseQueue = [];
var gpuAccelerationAvailable = typeof self.OffscreenCanvas === "function";
var originalFSSyncfs;
var imageBufferPointer;
var imageBufferSize;
var preloading;
var writableDataPath;
var resourceFilesDataPath;
var delayedRegistration;
var highEndBlurryRecognition;
var licenseKey;
var scanSettings;
var imageSettings;
var recognitionMode;
var cameraProperties;
var deviceName;
var blurryRecognitionAvailable = false;
var workSubmitted = false;
var loadingInProgress = false;
var fileSystemSynced = false;
var runtimeLoaded = false;
var wasmReady = false;
var scannerSettingsReady = false;
var scannerImageSettingsReady = false;
var contextAvailable = false;
var fsSyncPromise = Promise.resolve();
var fsSyncInProgress = false;
var fsSyncScheduled = false;
// Public
// Promise result is used only during testing
// tslint:disable-next-line: parameters-max-number
function loadLibrary(deviceId, libraryLocation, locationPath, preload, newDelayedRegistration, newHighEndBlurryRecognition, textRecognition, newLicenseKey, deviceModelName, writableDataPathOverride) {
function reportLoadSuccess() {
postMessage(["library-loaded"]);
createContext(newDelayedRegistration, newHighEndBlurryRecognition, newLicenseKey);
}
function start() {
if (!wasmReady && fileSystemSynced && runtimeLoaded) {
loadingInProgress = false;
Module.callMain();
wasmReady = true;
reportLoadSuccess();
if (!newDelayedRegistration) {
workOnScanQueue();
workOnParseQueue();
}
}
}
if (loadingInProgress) {
return Promise.resolve();
}
if (wasmReady) {
reportLoadSuccess();
return Promise.resolve();
}
loadingInProgress = true;
// Sample WebAssembly WAT SIMD Program, containing i8x16.popcnt as part of one of the latest SIMD opcodes
// (module
// (func (result v128)
// i32.const 1
// i8x16.splat
// i8x16.popcnt
// )
// )
var simdSupport = WebAssembly.validate(new Uint8Array([
0, 97, 115, 109, 1, 0, 0, 0, 1, 5, 1, 96, 0, 1, 123, 3, 2, 1, 0, 10, 10, 1, 8, 0, 65, 1, 253, 15, 253, 98, 11,
]));
var _a = getLibraryLocationURIs(libraryLocation, textRecognition, simdSupport), jsURI = _a.jsURI, wasmURI = _a.wasmURI;
preloading = preload;
if (preload) {
writableDataPath = writableDataPathPreload;
}
else {
if (writableDataPathOverride != null) {
log("debug", "IndexedDB database name override in use to recover from blocked standard database: ".concat(writableDataPathOverride));
writableDataPath = writableDataPathOverride;
}
else {
writableDataPath = writableDataPathStandard;
}
}
resourceFilesDataPath = "".concat(libraryLocation).concat(resourceFilesSubfolder, "/");
highEndBlurryRecognition = newHighEndBlurryRecognition;
self.window = self.document = self; // Fix some Emscripten quirks
self.path = locationPath; // Used by the Scandit Data Capture library
self.deviceModelName = deviceModelName; // Used by the Scandit Data Capture library
Module = {
arguments: [deviceId],
canvas: gpuAccelerationAvailable
? new self.OffscreenCanvas(32, 32)
: /* istanbul ignore next */ {
getContext: function () {
return null;
},
},
instantiateWasm: function (importObject, successCallback) {
var _a;
// wasmJSVersion is globally defined inside scandit-engine-sdk.min.js
var wasmJSVersion = (_a = self.wasmJSVersion) !== null && _a !== void 0 ? _a : "undefined";
// istanbul ignore if
if (wasmJSVersion !== "5.15.0") {
log("error", "The Scandit Data Capture library JS file found at ".concat(jsURI, " seems invalid: ") +
"expected version doesn't match (received: ".concat(wasmJSVersion, ", expected: ").concat("5.15.0", "). ") +
"Please ensure the correct Scandit Data Capture file (with correct version) is retrieved.");
}
if (typeof self.WebAssembly.instantiateStreaming === "function") {
instantiateWebAssemblyStreaming(importObject, wasmURI, textRecognition, simdSupport, successCallback);
}
else {
instantiateWebAssembly(importObject, wasmURI, textRecognition, simdSupport, successCallback);
}
return {};
},
noInitialRun: true,
preRun: [
function () {
return setupFS()
.catch(function (error) {
log("debug", "No IndexedDB support, some data will not be persisted:", error);
})
.then(function () {
fileSystemSynced = true;
start();
});
},
],
onRuntimeInitialized: function () {
runtimeLoaded = true;
start();
},
// tslint:disable-next-line: no-any
print: function () {
var data = [];
for (var _i = 0; _i < arguments.length; _i++) {
data[_i] = arguments[_i];
}
log.apply(void 0, tslib_1.__spreadArray(["info"], tslib_1.__read(data), false));
},
// tslint:disable-next-line: no-any
printErr: function () {
var data = [];
for (var _i = 0; _i < arguments.length; _i++) {
data[_i] = arguments[_i];
}
log.apply(void 0, tslib_1.__spreadArray(["error"], tslib_1.__read(data), false));
},
};
function tryImportScripts() {
var _a;
try {
return (_a = importScripts(jsURI)) !== null && _a !== void 0 ? _a : Promise.resolve();
}
catch (error) {
return Promise.reject(error);
}
}
return retryWithExponentialBackoff(tryImportScripts, 250, 4000, function (error) {
log("warn", error);
log("warn", "Couldn't retrieve Scandit Data Capture library at ".concat(jsURI, ", retrying..."));
}).catch(function (error) {
log("error", error);
log("error", "Couldn't retrieve Scandit Data Capture library at ".concat(jsURI, ", did you configure the path for it correctly?"));
return Promise.resolve(error); // Promise is used only during testing
});
}
function createContext(
// tslint:disable-next-line: bool-param-default
newDelayedRegistration,
// tslint:disable-next-line: bool-param-default
newHighEndBlurryRecognition, newLicenseKey) {
function completeCreateContext() {
postMessage([
"context-created",
{
hiddenScanditLogoAllowed: Module._can_hide_logo() === 1,
},
]);
}
if (contextAvailable) {
return completeCreateContext();
}
if (newDelayedRegistration != null) {
delayedRegistration = newDelayedRegistration;
}
if (newHighEndBlurryRecognition != null) {
highEndBlurryRecognition = newHighEndBlurryRecognition;
}
if (newLicenseKey != null) {
licenseKey = newLicenseKey;
}
if (!wasmReady ||
delayedRegistration == null ||
highEndBlurryRecognition == null ||
(!workSubmitted && !delayedRegistration) ||
licenseKey == null) {
return;
}
var licenseKeyLength = lengthBytesUTF8(licenseKey) + 1;
var licenseKeyPointer = Module._malloc(licenseKeyLength);
stringToUTF8(licenseKey, licenseKeyPointer, licenseKeyLength);
var writableDataPathLength = lengthBytesUTF8(writableDataPath) + 1;
var writableDataPathPointer = Module._malloc(writableDataPathLength);
stringToUTF8(writableDataPath, writableDataPathPointer, writableDataPathLength);
var resourceFilesDataPathLength = lengthBytesUTF8(resourceFilesDataPath) + 1;
var resourceFilesDataPathPointer = Module._malloc(resourceFilesDataPathLength);
stringToUTF8(resourceFilesDataPath, resourceFilesDataPathPointer, resourceFilesDataPathLength);
Module._create_context(licenseKeyPointer, writableDataPathPointer, delayedRegistration, highEndBlurryRecognition, resourceFilesDataPathPointer, false);
Module._free(licenseKeyPointer);
Module._free(writableDataPathPointer);
Module._free(resourceFilesDataPathPointer);
contextAvailable = true;
reportCameraProperties();
reportDeviceName();
completeCreateContext();
}
function setScanSettings(newScanSettings, newBlurryRecognitionAvailable, blurryRecognitionRequiresUpdate) {
function completeSetScanSettings() {
scanSettings = newScanSettings;
blurryRecognitionAvailable = newBlurryRecognitionAvailable;
applyScanSettings();
workOnScanQueue();
}
scanSettings = undefined;
scannerSettingsReady = false;
if (newBlurryRecognitionAvailable && blurryRecognitionRequiresUpdate) {
syncFS(true, false, true).then(completeSetScanSettings).catch(completeSetScanSettings);
}
else {
completeSetScanSettings();
}
}
function setImageSettings(newImageSettings) {
imageSettings = newImageSettings;
applyImageSettings();
workOnScanQueue();
}
function augmentErrorInformation(error) {
var _a;
if (error.errorCode === 260) {
var hostname = void 0;
// istanbul ignore if
if (((_a = location.href) === null || _a === void 0 ? void 0 : _a.indexOf("blob:null/")) === 0) {
hostname = "localhost";
}
else {
hostname = new URL(location.pathname != null && location.pathname !== "" && !location.pathname.startsWith("/")
? /* istanbul ignore next */ location.pathname
: location.origin).hostname;
}
// istanbul ignore next
if (hostname.startsWith("[") && hostname.endsWith("]")) {
hostname = hostname.slice(1, -1);
}
error.errorMessage = error.errorMessage.replace("domain name", "domain name (".concat(hostname, ")"));
}
// License Key related error codes from 6 to 25 and 260
if ([6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 260].includes(error.errorCode) &&
licenseKey != null &&
licenseKey.length > 0) {
error.errorMessage += " License Key: ".concat(licenseKey.slice(0, 15), "...");
}
}
function processScanWorkUnit(scanWorkUnit) {
if (scanWorkUnit.highQualitySingleFrameMode) {
applyScanSettings(true);
}
var resultData = scanImage(scanWorkUnit.data);
if (scanWorkUnit.highQualitySingleFrameMode) {
applyScanSettings(false);
}
var result = JSON.parse(resultData);
if (result.error != null) {
augmentErrorInformation(result.error);
postMessage([
"work-error",
{
requestId: scanWorkUnit.requestId,
error: result.error,
},
scanWorkUnit.data,
], [scanWorkUnit.data.buffer]);
}
else {
// istanbul ignore else
if (result.barcodeResult != null && result.textResult != null) {
postMessage([
"work-result",
{
requestId: scanWorkUnit.requestId,
result: {
barcodes: result.barcodeResult,
texts: result.textResult,
},
},
scanWorkUnit.data,
], [scanWorkUnit.data.buffer]);
}
}
}
function workOnScanQueue() {
if (!wasmReady || scanQueue.length === 0) {
return;
}
// Initialization for first submitted work unit
if (!contextAvailable) {
createContext();
}
if (!scannerSettingsReady) {
applyScanSettings();
}
if (!scannerImageSettingsReady) {
applyImageSettings();
}
if (!contextAvailable || !scannerSettingsReady || !scannerImageSettingsReady) {
return;
}
while (scanQueue.length !== 0) {
if (scanQueue[0].highQualitySingleFrameMode &&
// TODO: For now it's not possible to use imported variables as the worker doesn't have access at runtime
(recognitionMode === null || recognitionMode === void 0 ? void 0 : recognitionMode.includes("code")) === true &&
!blurryRecognitionAvailable) {
break;
}
processScanWorkUnit(scanQueue.shift());
}
}
function processParseWorkUnit(parseWorkUnit) {
var resultData = parse(parseWorkUnit.dataFormat, parseWorkUnit.data, parseWorkUnit.options);
var result = JSON.parse(resultData);
if (result.error != null) {
augmentErrorInformation(result.error);
postMessage([
"parse-error",
{
requestId: parseWorkUnit.requestId,
error: result.error,
},
]);
}
else {
// istanbul ignore else
if (result.result != null) {
postMessage([
"parse-result",
{
requestId: parseWorkUnit.requestId,
result: result.result,
},
]);
}
}
}
function workOnParseQueue() {
if (!wasmReady || parseQueue.length === 0) {
return;
}
// Initialization for first submitted work unit
if (!contextAvailable) {
createContext();
if (!contextAvailable) {
return;
}
}
while (parseQueue.length !== 0) {
processParseWorkUnit(parseQueue.shift());
}
}
function addScanWorkUnit(scanWorkUnit) {
workSubmitted = true;
scanQueue.push(scanWorkUnit);
workOnScanQueue();
}
function addParseWorkUnit(parseWorkUnit) {
workSubmitted = true;
parseQueue.push(parseWorkUnit);
workOnParseQueue();
}
function clearSession() {
if (scannerSettingsReady) {
Module._scanner_session_clear();
}
}
function setCameraProperties(cameraType, autofocus) {
cameraProperties = {
cameraType: cameraType,
autofocus: autofocus,
};
reportCameraProperties();
}
function setDeviceName(newDeviceName) {
if (deviceName !== newDeviceName) {
deviceName = newDeviceName;
reportDeviceName();
}
}
function reset() {
clearSession();
scanQueue.length = 0;
parseQueue.length = 0;
scanSettings = undefined;
imageSettings = undefined;
workSubmitted = false;
scannerSettingsReady = false;
scannerImageSettingsReady = false;
}
// Private
// TODO: For now it's not possible to use imported variables as the worker doesn't have access at runtime
// tslint:disable-next-line: no-any
function log(level) {
var data = [];
for (var _i = 1; _i < arguments.length; _i++) {
data[_i - 1] = arguments[_i];
}
data.forEach(function (dataArgument, index) {
if (dataArgument instanceof Error) {
var errorObject = {
name: dataArgument.name,
message: dataArgument.message,
stack: dataArgument.stack,
};
data[index] = errorObject;
}
});
postMessage([
"log",
{
level: level,
data: data,
},
]);
}
function retryWithExponentialBackoff(handler, backoffMs, maxBackoffMs, singleTryRejectionCallback) {
return new Promise(function (resolve, reject) {
handler()
.then(resolve)
.catch(function (error) {
var newBackoffMs = backoffMs * 2;
if (newBackoffMs > maxBackoffMs) {
return reject(error);
}
singleTryRejectionCallback(error);
setTimeout(function () {
retryWithExponentialBackoff(handler, newBackoffMs, maxBackoffMs, singleTryRejectionCallback)
.then(resolve)
.catch(reject);
}, backoffMs);
});
});
}
function getLibraryLocationURIs(libraryLocation, textRecognition, simdSupport) {
var cdnURI = false;
if (/^https?:\/\/([^\/.]*\.)*cdn.jsdelivr.net\//.test(libraryLocation)) {
libraryLocation = "https://cdn.jsdelivr.net/npm/scandit-sdk@5.15.0/build/";
cdnURI = true;
}
else if (/^https?:\/\/([^\/.]*\.)*unpkg.com\//.test(libraryLocation)) {
libraryLocation = "https://unpkg.com/scandit-sdk@5.15.0/build/";
cdnURI = true;
}
var fileExtension = "";
if (textRecognition) {
fileExtension += "-ocr";
if (simdSupport) {
fileExtension += "-simd";
}
}
if (cdnURI) {
return {
jsURI: "".concat(libraryLocation, "scandit-engine-sdk").concat(fileExtension, ".min.js"),
wasmURI: "".concat(libraryLocation, "scandit-engine-sdk").concat(fileExtension, ".wasm"),
};
}
return {
jsURI: "".concat(libraryLocation, "scandit-engine-sdk").concat(fileExtension, ".min.js?v=5.15.0"),
wasmURI: "".concat(libraryLocation, "scandit-engine-sdk").concat(fileExtension, ".wasm?v=5.15.0"),
};
}
function arrayBufferToHexString(arrayBuffer) {
return Array.from(new Uint8Array(arrayBuffer))
.map(function (byteNumber) {
var byteHex = byteNumber.toString(16);
return byteHex.length === 1 ? /* istanbul ignore next */ "0".concat(byteHex) : byteHex;
})
.join("");
}
function applyScanSettings(highQualitySingleFrameMode) {
var _a, _b;
if (highQualitySingleFrameMode === void 0) { highQualitySingleFrameMode = false; }
if (!wasmReady || !contextAvailable || !workSubmitted || scanSettings == null) {
return;
}
scannerSettingsReady = false;
var parsedSettings = JSON.parse(scanSettings);
recognitionMode = parsedSettings.recognitionMode;
(_a = parsedSettings.textRecognitionSettings) !== null && _a !== void 0 ? _a : (parsedSettings.textRecognitionSettings = JSON.stringify({}));
var scanSettingsLength = lengthBytesUTF8(scanSettings) + 1;
var scanSettingsPointer = Module._malloc(scanSettingsLength);
stringToUTF8(scanSettings, scanSettingsPointer, scanSettingsLength);
var textRecognitionSettingsLength = lengthBytesUTF8(parsedSettings.textRecognitionSettings) + 1;
var textRecognitionSettingsPointer = Module._malloc(textRecognitionSettingsLength);
stringToUTF8(parsedSettings.textRecognitionSettings, textRecognitionSettingsPointer, textRecognitionSettingsLength);
var resultPointer = Module._scanner_settings_new_from_json(scanSettingsPointer, textRecognitionSettingsPointer,
// TODO: For now it's not possible to use imported variables as the worker doesn't have access at runtime
(recognitionMode === null || recognitionMode === void 0 ? void 0 : recognitionMode.includes("code")) === true, (recognitionMode === null || recognitionMode === void 0 ? void 0 : recognitionMode.includes("text")) === true, parsedSettings.blurryRecognition === true && blurryRecognitionAvailable, (_b = parsedSettings.matrixScanEnabled) !== null && _b !== void 0 ? _b : false, highQualitySingleFrameMode, parsedSettings.gpuAcceleration === true && gpuAccelerationAvailable);
Module._free(scanSettingsPointer);
var result = UTF8ToString(resultPointer);
if (result !== "") {
scannerSettingsReady = true;
log("debug", "External Scandit Data Capture scan settings:", JSON.parse(result));
}
}
function applyImageSettings() {
if (!wasmReady || !contextAvailable || !workSubmitted || imageSettings == null) {
return;
}
scannerImageSettingsReady = false;
var channels;
// TODO: For now it's not possible to use imported variables as the worker doesn't have access at runtime
if (imageSettings.format.valueOf() === 1) {
// RGB_8U
channels = 3;
}
else if (imageSettings.format.valueOf() === 2) {
// RGBA_8U
channels = 4;
}
else {
// GRAY_8U
channels = 1;
}
Module._scanner_image_settings_new(imageSettings.width, imageSettings.height, channels);
if (imageBufferPointer != null) {
Module._free(imageBufferPointer);
}
imageBufferSize = imageSettings.width * imageSettings.height * channels;
imageBufferPointer = Module._malloc(imageBufferSize);
scannerImageSettingsReady = true;
}
function reportCameraProperties() {
if (!wasmReady || !contextAvailable || cameraProperties == null) {
return;
}
// TODO: For now it's not possible to use imported variables as the worker doesn't have access at runtime
Module._report_camera_properties(cameraProperties.cameraType === "front", cameraProperties.autofocus);
}
function reportDeviceName() {
if (!wasmReady || !contextAvailable || deviceName == null) {
return;
}
var deviceNameLength = lengthBytesUTF8(deviceName) + 1;
var deviceNamePointer = Module._malloc(deviceNameLength);
stringToUTF8(deviceName, deviceNamePointer, deviceNameLength);
Module._set_device_name(deviceNamePointer);
Module._free(deviceNamePointer);
}
function scanImage(imageData) {
if (imageData.byteLength !== imageBufferSize) {
// This could happen in unexpected situations and should be temporary
return JSON.stringify({ barcodeResult: [], textResult: [] });
}
Module.HEAPU8.set(imageData, imageBufferPointer);
return UTF8ToString(Module._scanner_scan(imageBufferPointer));
}
function parse(dataFormat, data, options) {
var dataLength = typeof data === "string" ? lengthBytesUTF8(data) + 1 : data.byteLength;
var dataPointer = Module._malloc(dataLength);
if (typeof data === "string") {
stringToUTF8(data, dataPointer, dataLength);
}
else {
Module.HEAPU8.set(data, dataPointer);
}
var optionsLength = lengthBytesUTF8(options) + 1;
var optionsPointer = Module._malloc(optionsLength);
stringToUTF8(options, optionsPointer, optionsLength);
var resultPointer = Module._parser_parse_string(dataFormat.valueOf(), dataPointer, dataLength - 1, optionsPointer);
Module._free(dataPointer);
Module._free(optionsPointer);
return UTF8ToString(resultPointer);
}
function verifiedWasmFetch(wasmURI, textRecognition, simdSupport, awaitFullResponse) {
function verifyResponseData(responseData) {
var _a;
// istanbul ignore else
if (typeof ((_a = crypto === null || crypto === void 0 ? void 0 : crypto.subtle) === null || _a === void 0 ? void 0 : _a.digest) === "function") {
crypto.subtle
.digest("SHA-256", responseData)
.then(function (hash) {
var hashString = arrayBufferToHexString(hash);
var expectedHashString = "9381f51f2e47730a322fda5ae18fc4b27da5b35477c78b440f762a19e65c2567";
if (textRecognition) {
expectedHashString = simdSupport ? "f66f36ada4369d161a55dd0efcfb1dc290b907f2a3ea3588b86d489cf9e79873" : "900b975dc7c0e8973dac38464fd7f7bfac8e5543693bc0ed0dfd8e0e2bd09272";
}
// istanbul ignore if
if (hashString !== expectedHashString) {
log("error", "The Scandit Data Capture library WASM file found at ".concat(wasmURI, " seems invalid: ") +
"expected file hash doesn't match (received: ".concat(hashString, ", ") +
"expected: ".concat(expectedHashString, "). ") +
"Please ensure the correct Scandit Data Capture file (with correct version) is retrieved.");
}
})
.catch(
/* istanbul ignore next */ function () {
// Ignored
});
}
else {
log("warn", "Insecure context (see https://developer.mozilla.org/en-US/docs/Web/Security/Secure_Contexts): " +
"The hash of the Scandit Data Capture library WASM file found at ".concat(wasmURI, " could not be verified"));
}
}
function tryFetch() {
return new Promise(function (resolve, reject) {
fetch(wasmURI)
.then(function (response) {
// istanbul ignore else
if (response.ok) {
response
.clone()
.arrayBuffer()
.then(function (responseData) {
if (awaitFullResponse) {
resolve(response);
}
verifyResponseData(responseData);
})
.catch(
// istanbul ignore next
function (error) {
if (awaitFullResponse) {
reject(error);
}
});
if (!awaitFullResponse) {
resolve(response);
}
}
else {
reject(new Error("HTTP status code is not ok"));
}
})
.catch(function (error) {
reject(error);
});
});
}
return retryWithExponentialBackoff(tryFetch, 250, 4000, function (error) {
log("warn", error);
log("warn", "Couldn't retrieve Scandit Data Capture library at ".concat(wasmURI, ", retrying..."));
}).catch(function (error) {
log("error", error);
log("error", "Couldn't retrieve/instantiate Scandit Data Capture library at ".concat(wasmURI, ", ") +
"did you configure the path for it correctly?");
return Promise.reject(error);
});
}
function instantiateWebAssembly(importObject, wasmURI, textRecognition, simdSupport, successCallback, existingResponse) {
(existingResponse != null
? Promise.resolve(existingResponse)
: verifiedWasmFetch(wasmURI, textRecognition, simdSupport, true))
.then(function (response) {
return response.arrayBuffer();
})
.then(function (bytes) {
return self.WebAssembly.instantiate(bytes, importObject)
.then(function (results) {
successCallback(results.instance);
})
.catch(function (error) {
log("error", error);
log("error", "Couldn't instantiate Scandit Data Capture library at ".concat(wasmURI, ", ") +
"did you configure the path for it correctly?");
});
})
.catch(
/* istanbul ignore next */ function () {
// Ignored
});
}
function instantiateWebAssemblyStreaming(importObject, wasmURI, textRecognition, simdSupport, successCallback) {
verifiedWasmFetch(wasmURI, textRecognition, simdSupport, false)
.then(function (response) {
self.WebAssembly.instantiateStreaming(response, importObject)
.then(function (results) {
successCallback(results.instance);
})
.catch(function (error) {
log("warn", error);
log("warn", "WebAssembly streaming compile failed. " +
"Falling back to ArrayBuffer instantiation (this will make things slower)");
instantiateWebAssembly(importObject, wasmURI, textRecognition, simdSupport, successCallback, response);
});
})
.catch(
/* istanbul ignore next */ function () {
// Ignored
});
}
// tslint:disable-next-line: max-func-body-length
function syncFSMergePreloadedData() {
// Note that this function is only executed by the non-preload WebWorker
// (i.e.the one not created to only generate blurry tables)
// This means that writableDataPath will always be defined to be writableDataPathStandard or its override
var fsObjectStoreName = "FILE_DATA";
var resolveCallback;
var openDbSourceRequest;
var openDbTargetRequest;
var targetTransactionCompleteTimeout;
function handleError() {
var _a, _b;
clearTimeout(targetTransactionCompleteTimeout);
(_a = openDbSourceRequest === null || openDbSourceRequest === void 0 ? void 0 : openDbSourceRequest.result) === null || _a === void 0 ? void 0 : _a.close();
(_b = openDbTargetRequest === null || openDbTargetRequest === void 0 ? void 0 : openDbTargetRequest.result) === null || _b === void 0 ? void 0 : _b.close();
// this.error
resolveCallback(0);
}
function performMerge() {
try {
var objects_1 = [];
var sourceTransaction = openDbSourceRequest.result.transaction(fsObjectStoreName, "readonly");
sourceTransaction.onerror = sourceTransaction.onabort = handleError;
var cursorRequest_1 = sourceTransaction
.objectStore(fsObjectStoreName)
.openCursor();
cursorRequest_1.onsuccess = function () {
var e_1, _a;
var cursor = cursorRequest_1.result;
if (cursor == null) {
try {
var mergedObjectsCount_1 = 0;
var targetTransaction = openDbTargetRequest.result.transaction(fsObjectStoreName, "readwrite");
var targetObjectStore_1 = targetTransaction.objectStore(fsObjectStoreName);
targetTransaction.onerror = targetTransaction.onabort = handleError;
targetTransaction.oncomplete = function () {
clearTimeout(targetTransactionCompleteTimeout);
openDbSourceRequest.result.close();
openDbTargetRequest.result.close();
return resolveCallback(mergedObjectsCount_1);
};
var _loop_1 = function (object) {
var countRequest = targetObjectStore_1.count(object.primaryKey);
countRequest.onsuccess = function () {
if (countRequest.result === 0) {
++mergedObjectsCount_1;
targetObjectStore_1.add(object.value, object.primaryKey);
}
};
// Due to Safari browser bugs, it can rarely happen that the transaction is never marked as complete,
// when that happens the database is unfortunately completely stuck and can also not be deleted.
// We then reset the library and use a completely new database with a new randomly generated name.
clearTimeout(targetTransactionCompleteTimeout);
targetTransactionCompleteTimeout = self.setTimeout(function () {
log("warn", "IndexedDB database is blocked! Resetting Scandit Data Capture library...");
postMessage(["reset"]);
}, 500);
};
try {
for (var objects_2 = tslib_1.__values(objects_1), objects_2_1 = objects_2.next(); !objects_2_1.done; objects_2_1 = objects_2.next()) {
var object = objects_2_1.value;
_loop_1(object);
}
}
catch (e_1_1) { e_1 = { error: e_1_1 }; }
finally {
try {
if (objects_2_1 && !objects_2_1.done && (_a = objects_2.return)) _a.call(objects_2);
}
finally { if (e_1) throw e_1.error; }
}
}
catch (error) {
// istanbul ignore next
handleError.call({ error: error });
}
}
else {
objects_1.push({
value: cursor.value,
primaryKey: cursor.primaryKey.toString().replace("".concat(writableDataPathPreload, "/"), "".concat(writableDataPath, "/")),
});
cursor.continue();
}
};
cursorRequest_1.onerror = handleError;
}
catch (error) {
// istanbul ignore next
handleError.call({ error: error });
}
}
return new Promise(function (resolve) {
resolveCallback = resolve;
openDbSourceRequest = indexedDB.open(writableDataPathPreload);
openDbSourceRequest.onupgradeneeded = function () {
try {
openDbSourceRequest.result.createObjectStore(fsObjectStoreName);
}
catch (error) {
// Ignored
}
};
openDbSourceRequest.onsuccess = function () {
if (!Array.from(openDbSourceRequest.result.objectStoreNames).includes(fsObjectStoreName)) {
return resolve(0);
}
openDbTargetRequest = indexedDB.open(writableDataPath);
openDbTargetRequest.onupgradeneeded = function () {
try {
openDbTargetRequest.result.createObjectStore(fsObjectStoreName);
}
catch (error) {
// Ignored
}
};
openDbTargetRequest.onsuccess = function () {
performMerge();
};
openDbTargetRequest.onblocked = openDbTargetRequest.onerror = handleError;
};
openDbSourceRequest.onblocked = openDbSourceRequest.onerror = handleError;
});
}
function syncFSPromisified(populate, initialPopulation) {
// istanbul ignore if
if (originalFSSyncfs == null) {
return Promise.resolve();
}
fsSyncInProgress = true;
return new Promise(function (resolve, reject) {
// Merge with data coming from preloading workers if needed
(!preloading && populate ? syncFSMergePreloadedData() : Promise.resolve(0))
.then(function (mergedObjects) {
if (!preloading && populate && !initialPopulation && mergedObjects === 0) {
fsSyncInProgress = false;
return resolve();
}
// tslint:disable-next-line: no-non-null-assertion
originalFSSyncfs(populate, function (error) {
fsSyncInProgress = false;
// istanbul ignore if
if (error != null) {
return reject(error);
}
resolve();
});
})
.catch(reject);
});
}
function syncFS(populate, initialPopulation, forceScheduling) {
if (initialPopulation === void 0) { initialPopulation = false; }
if (forceScheduling === void 0) { forceScheduling = false; }
if (!fsSyncScheduled || forceScheduling) {
if (fsSyncInProgress) {
fsSyncScheduled = true;
fsSyncPromise = fsSyncPromise.then(function () {
fsSyncScheduled = false;
return syncFSPromisified(populate, initialPopulation);
});
}
else {
fsSyncPromise = syncFSPromisified(populate, initialPopulation);
}
}
return fsSyncPromise;
}
function setupFS() {
// FS.syncfs is also called by data capture on file storage, ensure everything is coordinated nicely
originalFSSyncfs = FS.syncfs;
FS.syncfs = (function (populate, callback) {
var originalCallback = callback;
callback = function (error) {
originalCallback(error);
};
syncFS(populate).then(callback).catch(callback);
});
try {
FS.mkdir(writableDataPath);
}
catch (error) {
// istanbul ignore next
if (error.code !== "EEXIST") {
originalFSSyncfs = undefined;
return Promise.reject(error);
}
}
FS.mount(IDBFS, {}, writableDataPath);
return syncFS(true, true);
}
return {
loadLibrary: loadLibrary,
setScanSettings: setScanSettings,
setImageSettings: setImageSettings,
workOnScanQueue: workOnScanQueue,
workOnParseQueue: workOnParseQueue,
addScanWorkUnit: addScanWorkUnit,
addParseWorkUnit: addParseWorkUnit,
clearSession: clearSession,
setCameraProperties: setCameraProperties,
setDeviceName: setDeviceName,
reset: reset,
};
}
exports.dataCapture = dataCapture;
// istanbul ignore next
function edataCaptureWorkerFunction() {
var dataCaptureInstance = dataCapture();
onmessage = function (e) {
// Creating context triggers license key verification and activation: delay until first frame processed
var data = e.data;
switch (data.type) {
case "load-library":
// tslint:disable-next-line: no-floating-promises
dataCaptureInstance.loadLibrary(data.deviceId, data.libraryLocation, data.path, data.preload, data.delayedRegistration, data.highEndBlurryRecognition, data.textRecognition, data.licenseKey, data.deviceModelName, data.writableDataPathOverride);
break;
case "scan-settings":
dataCaptureInstance.setScanSettings(data.settings, data.blurryRecognitionAvailable, data.blurryRecognitionRequiresUpdate);
break;
case "image-settings":
dataCaptureInstance.setImageSettings(data.imageSettings);
break;
case "scan-image":
dataCaptureInstance.addScanWorkUnit({
requestId: data.requestId,
data: data.data,
highQualitySingleFrameMode: data.highQualitySingleFrameMode,
});
break;
case "parse":
dataCaptureInstance.addParseWorkUnit({
requestId: data.requestId,
dataFormat: data.dataFormat,
data: data.data,
options: data.options,
});
break;
case "clear-session":
dataCaptureInstance.clearSession();
break;
case "camera-properties":
dataCaptureInstance.setCameraProperties(data.cameraType, data.autofocus);
break;
case "device-name":
dataCaptureInstance.setDeviceName(data.deviceName);
break;
case "reset":
dataCaptureInstance.reset();
break;
default:
break;
}
};
}
/**
* @hidden
*/
exports.dataCaptureWorkerBlob = new Blob(["var Module;".concat(dataCapture.toString(), "(").concat(edataCaptureWorkerFunction.toString(), ")()")], {
type: "text/javascript",
});
//# sourceMappingURL=dataCaptureWorker.js.map