-
Notifications
You must be signed in to change notification settings - Fork 16
/
pull.js
53 lines (43 loc) · 1.36 KB
/
pull.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
module.exports = pull
var Promise = require('lie')
var toId = require('./utils/to-id')
/**
* pulls one or multiple objects from remote to local database
*
* @param {StringOrObject} docsOrIds object or ID of object or array of objects/ids (all optional)
* @return {Promise}
*/
function pull (state, docsOrIds) {
var pulledObjects = []
var errors = state.db.constructor.Errors
return Promise.resolve(state.remote)
.then(function (remote) {
return new Promise(function (resolve, reject) {
if (Array.isArray(docsOrIds)) {
docsOrIds = docsOrIds.map(toId)
} else {
docsOrIds = docsOrIds && [toId(docsOrIds)]
}
if (docsOrIds && docsOrIds.filter(Boolean).length !== docsOrIds.length) {
return Promise.reject(errors.NOT_AN_OBJECT)
}
var replication = state.db.replicate.from(remote, {
doc_ids: docsOrIds
})
/* istanbul ignore next */
replication.catch(function () {
// handled trough 'error' event
})
replication.on('complete', function () {
resolve(pulledObjects)
})
replication.on('error', reject)
replication.on('change', function (change) {
pulledObjects = pulledObjects.concat(change.docs)
for (var i = 0; i < change.docs.length; i++) {
state.emitter.emit('pull', change.docs[i])
}
})
})
})
}