UNPKG

react-native-regula-document-reader

Version:

react-native wrapper for Regula Document Reader

67 lines (56 loc) 1.6 kB
const promisify = fn => (...args) => new Promise((resolve, reject) => fn(...args, (err, result) => { if (err) return reject(new Error(err)) if (typeof result === 'string') { result = JSON.parse(result) } resolve(result) })) const memoize = fn => { let val return async (...args) => { if (!val) { val = fn(...args) val.catch(err => { // allow retry after fail val = null }) } return val } } const oneAtATime = (fn, name) => { let promise = Promise.resolve() return (...args) => { const run = () => fn(...args) return promise = promise.then(run, run) } } const promisifyObj = obj => Object.keys(obj).reduce((wrapper, key) => { const val = obj[key] if (typeof val === 'function') { wrapper[key] = promisify(val.bind(obj)) } else { wrapper[key] = val } return wrapper }, {}) const validators = { initialize: opts => { if (!opts.licenseKey) throw new Error('expected base64-encoded string "licenseKey"') }, scan: opts => {}, prepareDatabase: opts => {}, } const wrapWithValidator = (fn, validate) => async (...args) => { validate(...args) return fn(...args) } export const wrap = reader => { const wrapper = promisifyObj(reader) const initialize = memoize(oneAtATime(wrapper.initialize)) const scan = oneAtATime(wrapper.scan) wrapper.initialize = wrapWithValidator(initialize, validators.initialize) wrapper.scan = wrapWithValidator(scan, validators.scan) wrapper.prepareDatabase = wrapWithValidator(wrapper.prepareDatabase, validators.prepareDatabase) return wrapper }