Merge pull request #789 from bucko13/indexer-listeners
add ability to track listeners and remove them on close for indexer
This commit is contained in:
commit
fed7f2997b
@ -52,6 +52,7 @@ class Indexer extends EventEmitter {
|
|||||||
|
|
||||||
this.db = null;
|
this.db = null;
|
||||||
this.batch = null;
|
this.batch = null;
|
||||||
|
this.bound = [];
|
||||||
this.syncing = false;
|
this.syncing = false;
|
||||||
this.height = 0;
|
this.height = 0;
|
||||||
}
|
}
|
||||||
@ -122,12 +123,17 @@ class Indexer extends EventEmitter {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Close the indexer, wait for the database to close.
|
* Close the indexer, wait for the database to close,
|
||||||
|
* unbind all events.
|
||||||
* @returns {Promise}
|
* @returns {Promise}
|
||||||
*/
|
*/
|
||||||
|
|
||||||
async close() {
|
async close() {
|
||||||
return this.db.close();
|
await this.db.close();
|
||||||
|
for (const [event, listener] of this.bound)
|
||||||
|
this.chain.removeListener(event, listener);
|
||||||
|
|
||||||
|
this.bound.length = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -187,7 +193,7 @@ class Indexer extends EventEmitter {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Bind to chain events.
|
* Bind to chain events and save listeners for removal on close
|
||||||
* @private
|
* @private
|
||||||
*/
|
*/
|
||||||
|
|
||||||
@ -202,9 +208,10 @@ class Indexer extends EventEmitter {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
this.chain.on('connect', listener);
|
for (const event of ['connect', 'disconnect', 'reset']) {
|
||||||
this.chain.on('disconnect', listener);
|
this.bound.push([event, listener]);
|
||||||
this.chain.on('reset', listener);
|
this.chain.on(event, listener);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@ -4,6 +4,7 @@
|
|||||||
'use strict';
|
'use strict';
|
||||||
|
|
||||||
const assert = require('bsert');
|
const assert = require('bsert');
|
||||||
|
const EventEmitter = require('events');
|
||||||
const reorg = require('./util/reorg');
|
const reorg = require('./util/reorg');
|
||||||
const Script = require('../lib/script/script');
|
const Script = require('../lib/script/script');
|
||||||
const Opcode = require('../lib/script/opcode');
|
const Opcode = require('../lib/script/opcode');
|
||||||
@ -320,6 +321,25 @@ describe('Indexer', function() {
|
|||||||
message: 'Limit above max of 10.'
|
message: 'Limit above max of 10.'
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it('should track bound chain events and remove on close', async () => {
|
||||||
|
const indexer = new AddrIndexer({
|
||||||
|
blocks: {},
|
||||||
|
chain: new EventEmitter()
|
||||||
|
});
|
||||||
|
|
||||||
|
const events = ['connect', 'disconnect', 'reset'];
|
||||||
|
|
||||||
|
await indexer.open();
|
||||||
|
|
||||||
|
for (const event of events)
|
||||||
|
assert.equal(indexer.chain.listeners(event).length, 1);
|
||||||
|
|
||||||
|
await indexer.close();
|
||||||
|
|
||||||
|
for (const event of events)
|
||||||
|
assert.equal(indexer.chain.listeners(event).length, 0);
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
describe('Index 10 blocks', function() {
|
describe('Index 10 blocks', function() {
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user