| /*globals cordova */ |
| "use strict"; |
| |
| var Adapter = require('./adapter'); |
| var utils = require('./utils'); |
| var TaskQueue = require('./taskqueue'); |
| var Promise = utils.Promise; |
| |
| function defaultCallback(err) { |
| if (err && global.debug) { |
| console.error(err); |
| } |
| } |
| |
| utils.inherits(PouchDB, Adapter); |
| function PouchDB(name, opts, callback) { |
| |
| if (!(this instanceof PouchDB)) { |
| return new PouchDB(name, opts, callback); |
| } |
| var self = this; |
| if (typeof opts === 'function' || typeof opts === 'undefined') { |
| callback = opts; |
| opts = {}; |
| } |
| |
| if (name && typeof name === 'object') { |
| opts = name; |
| name = undefined; |
| } |
| if (typeof callback === 'undefined') { |
| callback = defaultCallback; |
| } |
| opts = opts || {}; |
| var oldCB = callback; |
| self.auto_compaction = opts.auto_compaction; |
| self.prefix = PouchDB.prefix; |
| Adapter.call(self); |
| self.taskqueue = new TaskQueue(); |
| var promise = new Promise(function (fulfill, reject) { |
| callback = function (err, resp) { |
| if (err) { |
| return reject(err); |
| } |
| delete resp.then; |
| fulfill(resp); |
| }; |
| |
| opts = utils.clone(opts); |
| var originalName = opts.name || name; |
| var backend, error; |
| (function () { |
| try { |
| |
| if (typeof originalName !== 'string') { |
| error = new Error('Missing/invalid DB name'); |
| error.code = 400; |
| throw error; |
| } |
| |
| backend = PouchDB.parseAdapter(originalName, opts); |
| |
| opts.originalName = originalName; |
| opts.name = backend.name; |
| if (opts.prefix) { |
| opts.name = opts.prefix + opts.name; |
| } |
| opts.adapter = opts.adapter || backend.adapter; |
| self._adapter = opts.adapter; |
| self._db_name = originalName; |
| if (!PouchDB.adapters[opts.adapter]) { |
| error = new Error('Adapter is missing'); |
| error.code = 404; |
| throw error; |
| } |
| |
| if (!PouchDB.adapters[opts.adapter].valid()) { |
| error = new Error('Invalid Adapter'); |
| error.code = 404; |
| throw error; |
| } |
| } catch (err) { |
| self.taskqueue.fail(err); |
| self.changes = utils.toPromise(function (opts) { |
| if (opts.complete) { |
| opts.complete(err); |
| } |
| }); |
| } |
| }()); |
| if (error) { |
| return reject(error); // constructor error, see above |
| } |
| self.adapter = opts.adapter; |
| |
| // needs access to PouchDB; |
| self.replicate = {}; |
| |
| self.replicate.from = function (url, opts, callback) { |
| return PouchDB.replicate(url, self, opts, callback); |
| }; |
| |
| self.replicate.to = function (url, opts, callback) { |
| return PouchDB.replicate(self, url, opts, callback); |
| }; |
| |
| self.sync = function (dbName, opts, callback) { |
| return PouchDB.sync(self, dbName, opts, callback); |
| }; |
| |
| self.replicate.sync = self.sync; |
| |
| self.destroy = utils.adapterFun('destroy', function (callback) { |
| var self = this; |
| self.info(function (err, info) { |
| if (err) { |
| return callback(err); |
| } |
| PouchDB.destroy(info.db_name, callback); |
| }); |
| }); |
| |
| PouchDB.adapters[opts.adapter].call(self, opts, function (err, db) { |
| if (err) { |
| if (callback) { |
| self.taskqueue.fail(err); |
| callback(err); |
| } |
| return; |
| } |
| function destructionListener(event) { |
| if (event === 'destroyed') { |
| self.emit('destroyed'); |
| PouchDB.removeListener(originalName, destructionListener); |
| } |
| } |
| PouchDB.on(originalName, destructionListener); |
| self.emit('created', self); |
| PouchDB.emit('created', opts.originalName); |
| self.taskqueue.ready(self); |
| callback(null, self); |
| |
| }); |
| if (opts.skipSetup) { |
| self.taskqueue.ready(self); |
| } |
| |
| if (utils.isCordova()) { |
| //to inform websql adapter that we can use api |
| cordova.fireWindowEvent(opts.name + "_pouch", {}); |
| } |
| }); |
| promise.then(function (resp) { |
| oldCB(null, resp); |
| }, oldCB); |
| self.then = promise.then.bind(promise); |
| self.catch = promise.catch.bind(promise); |
| |
| } |
| |
| module.exports = PouchDB; |