1.0.0 • Published 8 years ago
@nhz.io/pouch-db-sync-job v1.0.0
PouchDB sync job (control)
Install
npm i -S @nhz.io/pouch-db-sync-jobUsage
Intended to be used with pouchdb-job-scheduler
const PouchDB = require 'pouchdb'
const sync = require('@nhz.io/pouch-db-sync-job')
const startJob = sync { /* PouchDb sync options */}, databaseA, databaseB
const job = startJob { PouchDB }
...
const res = await job
...Literate Source
Imports
curryN = require 'curry-n'Helpers
assign = (sources...) -> Object.assign {}, sources...
isString = (maybeString) -> typeof maybeString is 'string'
getter = (obj, name, fn) -> Object.defineProperty obj, name, {
configurable: true, enumerable: true, get: fn
}Definitions
Global Job UID
uid = 0Sync defaults
def = {
live: false
retry: false
since: 0
}Job generator
pouchDbSyncJob = (options, databaseA, databaseB, ctx) ->Hoist
stopandsync(for Promise below)
stop = sync = nullGet pouch from context or global (context comes from queue manager, if any)
PouchDB = ctx.PouchDB or PouchDBPreload databases
databaseA = new PouchDB databaseA if isString databaseA
databaseB = new PouchDB databaseB if isString databaseBAssign defaults
options = assign def, optionsCreate and start the job
Job is actually a promise extended with extra properties.
Promise states meaning:
- Promise resolved → sync has finished (Connection might still be open)
- Promise rejected
erris empty → sync was cancelled- otherwise,
errcontains the reason and will be set tojob.error
job = new Promise (resolve, reject) ->
sync = ctx.PouchDB.sync databaseA, databaseB, assign optionsJob stopper (
erris optional - noerrmeans manual stop)
stop = (err) ->
sync.cancel()
return if job.done
job.done = true
job.error = err or false
reject job.error
return jobJob completer
complete = (info) ->
job.info = info if info
return if job.done
job.done = true
job.error = falseCreate result by stripping promise from the job and aliasing job.info
resolve getter (assign job), 'info', () -> job.infoPouchDB sync events
sync.on 'error', stop
sync.on 'denied', stopLive syncs fire
completeonly when cancelled
sync.on 'complete', completeApplies only to
retrysyncs
sync.on 'active', -> job.started = true
sync.on 'paused', (err) -> if err then stop err else complete()
sync.then(complete).catch(stop)Extend the promise and return
uid = uid + 1
Object.assign job, {
uid, options, stop, sync, databases: [ databaseA, databaseB ]
}Exports (Curried)
module.exports = curryN 4, pouchDbSyncJobTests
test = require 'tape-async'
PouchDB = require 'pouchdb-memory'
pouchDbSyncJob = module.exports
mkdb = (s = 1, e = 3) ->
db = new PouchDB "db-#{ Math.random().toString().slice 2 }"
await db.put { _id: "doc-#{ i }" } for i in [s..e]
dbJob completion
test 'job completion', (t) ->One-Shot
dbA = await mkdb 1, 3
dbB = await mkdb 4, 6
startJob = pouchDbSyncJob {}, dbA, dbB
job = startJob { PouchDB }
res = await job
t.equals res.info, job.info
t.deepEqual (await dbA.allDocs()), (await dbB.allDocs()), 'docs match'
job.stop()
t.equals res.info, job.info
t.equals res.info.push.status, 'complete'
t.equals res.info.pull.status, 'complete'Live
dbA = await mkdb 1, 3
dbB = await mkdb 4, 6
startJob = pouchDbSyncJob { live: true, retry: true }, dbA, dbB
res = await job = startJob { PouchDB }
t.equals res.info, job.info
t.deepEqual (await dbA.allDocs()), (await dbB.allDocs()), 'docs match'
t.equals job.started, true
t.false job.sync.canceled
job.stop()
t.true job.sync.canceledJob failure
test 'job failure', (t) ->
db = await mkdb 1, 3
startJob = pouchDbSyncJob { live: true, retry: false }, 'http://foo-not-found', db
try
await job = startJob { PouchDB }
t.fail()
catch err
t.equals err.status, 500Version 1.0.0
License MIT
1.0.0
8 years ago