browser-main.ts 2.1 KB
import { EventEmitter } from 'events';
import { ServiceLocator } from './service-locator';

export * from './service-locator';

export function loadBsyncPlugin (PouchDB) {
    let pouchReplicate = PouchDB.replicate;   

    PouchDB.plugin((PouchDB) => {
        PouchDB.replicate = function() {
            let eventEmitter = new EventEmitter();
            let emitter = pouchReplicate.apply(this, arguments);
            let replicator = ServiceLocator.getFileReplicator();
            let db = arguments[1];         
            
            replicator.once('final', event => { 
                eventEmitter.emit('complete');
                eventEmitter.removeAllListeners();
            });

            replicator.on('error', event => {
                eventEmitter.emit('file-replicator-error', event);
            });

            replicator.on('complete', event => {
                eventEmitter.emit('file-replicator-complete', event);
            });

            replicator.on('progress', event => {
                eventEmitter.emit('file-replicator-progress', event);
            });
                        
            emitter.once('change', info => {          
                eventEmitter.emit('change', info);
            });

            emitter.once('complete', info => {                
                db.query('index_type/type',{
                    include_docs : true,
                    key : replicator.itemValue
                }).then((res) => { 
                    let docs = { docs : [] };                      
                    for (let r of res.rows) {
                        docs.docs.push(r.doc);
                    }

                    replicator.pushChanges(docs);
                    replicator.start();
                }).catch(error => {
                    eventEmitter.emit('error', error);
                });
            });

            emitter.once('error', (error) => {
                eventEmitter.emit('error', error);
            });

            return eventEmitter;
        };
    });
};

if (typeof window !== 'undefined' && window['PouchDB']) {
    loadBsyncPlugin(window['PouchDB']);
}