From 03eaa652ce25796d89f112a340a46183a0f6a26d Mon Sep 17 00:00:00 2001 From: Julien Fontanet Date: Thu, 14 Apr 2016 17:55:41 +0200 Subject: [PATCH] Optional debounce for events. --- packages/xen-api/src/cli.js | 2 ++ packages/xen-api/src/index.js | 17 +++++++++++++---- 2 files changed, 15 insertions(+), 4 deletions(-) diff --git a/packages/xen-api/src/cli.js b/packages/xen-api/src/cli.js index 5c4d275b2..f906ca0f3 100755 --- a/packages/xen-api/src/cli.js +++ b/packages/xen-api/src/cli.js @@ -41,6 +41,7 @@ const main = coroutine(function * (args) { boolean: ['help', 'read-only', 'verbose'], alias: { + debounce: 'd', help: 'h', 'read-only': 'ro', verbose: 'v' @@ -74,6 +75,7 @@ const main = coroutine(function * (args) { const xapi = createClient({ url, auth: { user, password }, + debounce: opts.debounce != null ? +opts.debounce : null, readOnly: opts.ro }) yield xapi.connect() diff --git a/packages/xen-api/src/index.js b/packages/xen-api/src/index.js index c297a1b12..6d40cea3f 100644 --- a/packages/xen-api/src/index.js +++ b/packages/xen-api/src/index.js @@ -207,6 +207,9 @@ export class Xapi extends EventEmitter { const objects = this._objects = new Collection() objects.getKey = getKey + this._debounce = opts.debounce == null + ? 200 + : opts.debounce this._fromToken = '' this.on('connected', this._watchEvents) this.on('disconnected', () => { @@ -556,6 +559,8 @@ export class Xapi extends EventEmitter { } _watchEvents () { + const debounce = this._debounce + const loop = ((onSucess, onFailure) => { return () => this._sessionCall('event.from', [ ['*'], @@ -567,7 +572,9 @@ export class Xapi extends EventEmitter { this._fromToken = token this._processEvents(events) - return loop() + return debounce != null + ? Bluebird.delay(debounce).then(loop) + : loop() }, error => { if (areEventsLost(error)) { @@ -636,10 +643,12 @@ export class Xapi extends EventEmitter { const loop = ((onSuccess, onFailure) => { return () => this._sessionCall('event.next', []).then(onSuccess, onFailure) })( - events => { + (debounce => events => { this._processEvents(events) - return loop() - }, + return debounce == null + ? loop() + : Bluebird.delay(debounce).then(loop) + })(this._debounce), error => { if (areEventsLost(error)) { return this._sessionCall('event.unregister', [ ['*'] ]).then(watchEvents)