Browse Source

Minor refactor

pull/265/head
Jerome Wu 6 years ago
parent
commit
3b2b8bd2b8
  1. 18
      src/browser/index.js
  2. 5
      src/browser/worker.js
  3. 100
      src/common/worker.js
  4. 20
      src/node/index.js
  5. 6
      src/node/worker.js

18
src/browser/index.js

@ -28,13 +28,13 @@ exports.defaultOptions = {
corePath: `https://cdn.jsdelivr.net/gh/naptha/tesseract.js-core@v2.0.0-beta.5/tesseract-core${typeof WebAssembly === 'object' ? '' : '.asm'}.js`, corePath: `https://cdn.jsdelivr.net/gh/naptha/tesseract.js-core@v2.0.0-beta.5/tesseract-core${typeof WebAssembly === 'object' ? '' : '.asm'}.js`,
}; };
exports.spawnWorker = (instance, workerOptions) => { exports.spawnWorker = (instance, { workerPath }) => {
let worker; let worker;
if (window.Blob && window.URL) { if (window.Blob && window.URL) {
const blob = new Blob([`importScripts("${workerOptions.workerPath}");`]); const blob = new Blob([`importScripts("${resolveURL(workerPath)}");`]);
worker = new Worker(window.URL.createObjectURL(blob)); worker = new Worker(window.URL.createObjectURL(blob));
} else { } else {
worker = new Worker(workerOptions.workerPath); worker = new Worker(workerPath);
} }
worker.onmessage = ({ data }) => { worker.onmessage = ({ data }) => {
@ -48,16 +48,12 @@ exports.terminateWorker = (instance) => {
instance.worker.terminate(); instance.worker.terminate();
}; };
exports.sendPacket = (instance, packet) => { exports.sendPacket = (instance, iPacket) => {
const packet = { ...iPacket };
loadImage(packet.payload.image) loadImage(packet.payload.image)
.then(buf => new Uint8Array(buf)) .then(buf => new Uint8Array(buf))
.then((img) => { .then((img) => {
instance.worker.postMessage({ packet.payload.image = Array.from(img);
...packet, instance.worker.postMessage(packet);
payload: {
...packet.payload,
image: Array.from(img),
},
});
}); });
}; };

5
src/browser/worker.js

@ -1,3 +1,4 @@
const resolveURL = require('resolve-url');
const workerUtils = require('../common/worker'); const workerUtils = require('../common/worker');
global.addEventListener('message', ({ data }) => { global.addEventListener('message', ({ data }) => {
@ -5,10 +6,10 @@ global.addEventListener('message', ({ data }) => {
}); });
workerUtils.setAdapter({ workerUtils.setAdapter({
getCore: (req, res) => { getCore: (corePath, res) => {
if (!global.TesseractCore) { if (!global.TesseractCore) {
res.progress({ status: 'loading tesseract core', progress: 0 }); res.progress({ status: 'loading tesseract core', progress: 0 });
global.importScripts(req.workerOptions.corePath); global.importScripts(resolveURL(corePath));
global.TesseractCore = typeof WebAssembly === 'object' ? global.TesseractCoreWASM : global.TesseractCoreASM; global.TesseractCore = typeof WebAssembly === 'object' ? global.TesseractCoreWASM : global.TesseractCoreASM;
res.progress({ status: 'loading tesseract core', progress: 1 }); res.progress({ status: 'loading tesseract core', progress: 1 });
} }

100
src/common/worker.js

@ -1,28 +1,28 @@
const { readImage, loadLang } = require('tesseract.js-utils'); const { readImage, loadLang } = require('tesseract.js-utils');
const dump = require('./dump'); const dump = require('./dump');
let Module; let TessModule;
let base; let api;
let latestJob; let latestJob;
let adapter = {}; let adapter = {};
const setImage = (image) => { const setImage = (image) => {
const { const {
w, h, bytesPerPixel, data, pix, w, h, bytesPerPixel, data, pix,
} = readImage(Module, Array.from(image)); } = readImage(TessModule, Array.from(image));
if (data === null) { if (data === null) {
base.SetImage(pix); api.SetImage(pix);
} else { } else {
base.SetImage(data, w, h, bytesPerPixel, w * bytesPerPixel); api.SetImage(data, w, h, bytesPerPixel, w * bytesPerPixel);
} }
base.SetRectangle(0, 0, w, h); api.SetRectangle(0, 0, w, h);
return data; return data;
}; };
const handleInit = (req, res) => { const handleInit = ({ corePath }, res) => {
if (!Module) { if (!TessModule) {
const Core = adapter.getCore(req, res); const Core = adapter.getCore(corePath, res);
res.progress({ status: 'initializing tesseract', progress: 0 }); res.progress({ status: 'initializing tesseract', progress: 0 });
@ -31,9 +31,9 @@ const handleInit = (req, res) => {
latestJob.progress({ status: 'recognizing text', progress: Math.max(0, (percent - 30) / 70) }); latestJob.progress({ status: 'recognizing text', progress: Math.max(0, (percent - 30) / 70) });
}, },
}) })
.then((TessModule) => { .then((tessModule) => {
Module = TessModule; TessModule = tessModule;
base = new Module.TessBaseAPI(); api = new TessModule.TessBaseAPI();
res.progress({ status: 'initialized tesseract', progress: 1 }); res.progress({ status: 'initialized tesseract', progress: 1 });
}); });
} }
@ -46,68 +46,74 @@ const loadLanguage = ({
options: { options: {
langPath, cachePath, cacheMethod, dataPath, langPath, cachePath, cacheMethod, dataPath,
}, },
}) => ( }, res) => {
loadLang({ res.progress({ status: 'loading language traineddata', progress: 0 });
return loadLang({
langs: lang, langs: lang,
tessModule: Module, tessModule: TessModule,
langURI: langPath, langURI: langPath,
cachePath, cachePath,
cacheMethod, cacheMethod,
dataPath, dataPath,
}) }).then((...args) => {
); res.progress({ status: 'loaded language traineddata', progress: 1 });
return args;
});
};
const handleRecognize = (req, res) => ( const handleRecognize = ({
handleInit(req, res) image, lang, options, params,
}, res) => (
handleInit(options, res)
.then(() => ( .then(() => (
loadLanguage(req) loadLanguage({ lang, options }, res)
.then(() => { .then(() => {
const { image, lang, params } = req;
const progressUpdate = (progress) => { const progressUpdate = (progress) => {
res.progress({ status: 'initializing api', progress }); res.progress({ status: 'initializing api', progress });
}; };
progressUpdate(0); progressUpdate(0);
base.Init(null, lang); api.Init(null, lang);
progressUpdate(0.3); progressUpdate(0.3);
Object.keys(params).forEach((key) => { Object.keys(params).forEach((key) => {
base.SetVariable(key, params[key]); api.SetVariable(key, params[key]);
}); });
progressUpdate(0.6); progressUpdate(0.6);
const ptr = setImage(image); const ptr = setImage(image);
progressUpdate(1); progressUpdate(1);
base.Recognize(null); api.Recognize(null);
const result = dump(Module, base); const result = dump(TessModule, api);
base.End(); api.End();
Module._free(ptr); TessModule._free(ptr);
res.resolve(result); res.resolve(result);
}) })
)) ))
); );
const handleDetect = (req, res) => ( const handleDetect = ({
handleInit(req, res) image, lang, options,
}, res) => (
handleInit(options, res)
.then(() => ( .then(() => (
loadLanguage(req) loadLanguage({ lang, options }, res)
.then(() => { .then(() => {
const { image, lang } = req; api.Init(null, lang);
base.Init(null, lang); api.SetPageSegMode(TessModule.PSM_OSD_ONLY);
base.SetPageSegMode(Module.PSM_OSD_ONLY);
const ptr = setImage(image); const ptr = setImage(image);
const results = new Module.OSResults(); const results = new TessModule.OSResults();
if (!base.DetectOS(results)) { if (!api.DetectOS(results)) {
base.End(); api.End();
Module._free(ptr); TessModule._free(ptr);
res.reject('Failed to detect OS'); res.reject('Failed to detect OS');
} else { } else {
const best = results.get_best_result(); const best = results.get_best_result();
const oid = best.get_orientation_id(); const oid = best.get_orientation_id();
const sid = best.get_script_id(); const sid = best.get_script_id();
base.End(); api.End();
Module._free(ptr); TessModule._free(ptr);
res.resolve({ res.resolve({
tesseract_script_id: sid, tesseract_script_id: sid,
@ -121,12 +127,12 @@ const handleDetect = (req, res) => (
)) ))
); );
exports.dispatchHandlers = (packet, send) => { exports.dispatchHandlers = ({ jobId, action, payload }, send) => {
const respond = (status, data) => { const respond = (status, data) => {
send({ send({
jobId: packet.jobId, jobId,
status, status,
action: packet.action, action,
data, data,
}); });
}; };
@ -137,13 +143,13 @@ exports.dispatchHandlers = (packet, send) => {
latestJob = respond; latestJob = respond;
try { try {
if (packet.action === 'recognize') { if (action === 'recognize') {
handleRecognize(packet.payload, respond); handleRecognize(payload, respond);
} else if (packet.action === 'detect') { } else if (action === 'detect') {
handleDetect(packet.payload, respond); handleDetect(payload, respond);
} }
} catch (err) { } catch (err) {
// Prepare exception to travel through postMessage /** Prepare exception to travel through postMessage */
respond.reject(err.toString()); respond.reject(err.toString());
} }
}; };

20
src/node/index.js

@ -8,12 +8,12 @@ const { defaultOptions } = require('../common/options');
const readFile = util.promisify(fs.readFile); const readFile = util.promisify(fs.readFile);
const loadImage = (imageURI) => { const loadImage = (image) => {
if (isURL(imageURI)) { if (isURL(image)) {
return fetch(imageURI) return fetch(image)
.then(resp => resp.arrayBuffer()); .then(resp => resp.arrayBuffer());
} }
return readFile(imageURI); return readFile(image);
}; };
exports.defaultOptions = { exports.defaultOptions = {
@ -33,16 +33,12 @@ exports.terminateWorker = (instance) => {
instance.worker.kill(); instance.worker.kill();
}; };
exports.sendPacket = (instance, packet) => { exports.sendPacket = (instance, iPacket) => {
const packet = { ...iPacket };
loadImage(packet.payload.image) loadImage(packet.payload.image)
.then(buf => new Uint8Array(buf)) .then(buf => new Uint8Array(buf))
.then((img) => { .then((img) => {
instance.worker.send({ packet.payload.image = Array.from(img);
...packet, instance.worker.send(packet);
payload: {
...packet.payload,
image: Array.from(img),
},
});
}); });
}; };

6
src/node/worker.js

@ -8,11 +8,11 @@ process.on('message', (packet) => {
}); });
workerUtils.setAdapter({ workerUtils.setAdapter({
getCore: (req, res) => { getCore: (corePath, res) => {
if (check.null(TesseractCore)) { if (check.null(TesseractCore)) {
res.progress({ status: 'loading tesseract core' }); res.progress({ status: 'loading tesseract core', progress: 0 });
TesseractCore = require('tesseract.js-core'); TesseractCore = require('tesseract.js-core');
res.progress({ status: 'loaded tesseract core' }); res.progress({ status: 'loaded tesseract core', progress: 1 });
} }
return TesseractCore; return TesseractCore;
}, },

Loading…
Cancel
Save