const fetch = require('isomorphic-fetch'), isURL = require('is-url'), fork = require('child_process').fork, fs = require('fs'); exports.defaultOptions = { workerPath: require('path').join(__dirname, 'worker.js'), langPath: 'http://cdn.rawgit.com/naptha/tessdata/gh-pages/3.02/', } exports.spawnWorker = function spawnWorker(instance, workerOptions){ var cp = fork(workerOptions.workerPath); cp.on('message', packet => { instance._recv(packet); }); return cp; } exports.terminateWorker = function(instance){ instance.worker.kill(); } exports.sendPacket = function sendPacket(instance, packet){ loadImage(packet.payload.image, img => { packet.payload.image = img; instance.worker.send(packet); }); } function loadImage(image, cb){ if(isURL(image)) { fetch(image) .then(resp => resp.buffer()) .then(buffer => loadImage(buffer, cb)) .catch(err => console.error(err)); } if(typeof image === 'string'){ fs.readFile(image, function(err, buffer){ if (err) throw err; loadImage(buffer, cb); }); return; } else if (image instanceof Buffer){ var mime = require('file-type')(image).mime if(mime === 'image/png'){ var PNGReader = require('png.js'); var reader = new PNGReader(image); reader.parse(function(err, png){ if (err) throw err; var image = { width: png.getWidth(), height: png.getHeight() } image.data = new Uint8Array(image.width * image.height * 4) for(var j = 0; j < image.height; j++){ for(var i = 0; i < image.width; i++){ var offset = 4 * (i + j * image.width), pix = png.getPixel(i, j); image.data[offset] = pix[0]; image.data[offset + 1] = pix[1]; image.data[offset + 2] = pix[2]; image.data[offset + 3] = pix[3]; } } loadImage(image, cb); }); return; } else if (mime === 'image/jpeg'){ loadImage(require('jpeg-js').decode(image), cb); return; } // TODO: support for TIFF, NetPBM, BMP, etc. } // node uses json.stringify for ipc which means we need to turn // fancy arrays into raw arrays if(image && image.data && image.data.length && !Array.isArray(image.data)){ image.data = Array.from(image.data); return loadImage(image, cb) } cb(image); }