From 61559a43320054b2ea7adf2bb408ebe16a3def32 Mon Sep 17 00:00:00 2001 From: kurten Date: Wed, 4 Apr 2018 00:43:41 +0800 Subject: [PATCH 1/4] feat: listener add async function support --- index.js | 9 ++++++--- package.json | 2 +- test/index.test.js | 43 +++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 50 insertions(+), 4 deletions(-) diff --git a/index.js b/index.js index 6fddb06..c021b59 100644 --- a/index.js +++ b/index.js @@ -39,12 +39,15 @@ class Base extends EventEmitter { } _wrapListener(eventName, listener) { - if (is.generatorFunction(listener)) { - assert(eventName !== 'error', '[sdk-base] `error` event should not have a generator listener.'); + if (is.generatorFunction(listener) || is.asyncFunction(listener)) { + assert(eventName !== 'error', '[sdk-base] `error` event should not have a generator/async listener.'); const newListener = (...args) => { co(function* () { - yield listener(...args); + const ret = yield listener(...args); + if (is.promise(ret)) { + yield ret; + } }).catch(err => { err.name = 'EventListenerProcessError'; this.emit('error', err); diff --git a/package.json b/package.json index c04080b..151abec 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "sdk-base", - "version": "3.4.0", + "version": "3.4.1", "description": "a base class for sdk with default error handler", "main": "index.js", "scripts": { diff --git a/test/index.test.js b/test/index.test.js index 64c62c8..2b40b06 100644 --- a/test/index.test.js +++ b/test/index.test.js @@ -242,6 +242,49 @@ describe('sdk-base', () => { client.emit('event_code', 1, 2); }); + it('should add async listener', done => { + done = pedding(done, 8); + const client = new SomeServiceClient(); + + client.addListener('event_code_async', async function(a, b) { + console.log('event_code_async in addListener'); + assert(a === 1); + assert(b === 2); + done(); + }); + + client.on('event_code_async', async function(a, b) { + console.log('event_code_async in on'); + assert(a === 1); + assert(b === 2); + done(); + }); + + client.once('event_code_async', async function(a, b) { + console.log('event_code_async in once'); + assert(a === 1); + assert(b === 2); + done(); + }); + + client.prependListener('event_code_async', async function(a, b) { + console.log('event_code_async in prependListener'); + assert(a === 1); + assert(b === 2); + done(); + }); + + client.prependOnceListener('event_code_async', async function(a, b) { + console.log('event_code_async in prependOnceListener'); + assert(a === 1); + assert(b === 2); + done(); + }); + + client.emit('event_code_async', 1, 2); + client.emit('event_code_async', 1, 2); + }); + it('should catch generator exception and emit on error event', done => { done = pedding(done, 2); const client = new SomeServiceClient(); From 45fe07005a49d2d5c9f6d83e16912a58e2993841 Mon Sep 17 00:00:00 2001 From: kurten Date: Wed, 4 Apr 2018 10:56:06 +0800 Subject: [PATCH 2/4] refactor and add babel to support node 6 --- .babelrc | 11 +++++++++++ index.js | 15 +++++++++------ package.json | 12 +++++++++--- 3 files changed, 29 insertions(+), 9 deletions(-) create mode 100644 .babelrc diff --git a/.babelrc b/.babelrc new file mode 100644 index 0000000..1f315c0 --- /dev/null +++ b/.babelrc @@ -0,0 +1,11 @@ +{ + "sourceMaps": "inline", + "presets": ["es2015", "stage-1"], + "plugins": [ + "transform-runtime", + ["transform-async-to-module-method", { + "module": "bluebird", + "method": "coroutine" + }] + ] +} diff --git a/index.js b/index.js index c021b59..c30d727 100644 --- a/index.js +++ b/index.js @@ -43,12 +43,15 @@ class Base extends EventEmitter { assert(eventName !== 'error', '[sdk-base] `error` event should not have a generator/async listener.'); const newListener = (...args) => { - co(function* () { - const ret = yield listener(...args); - if (is.promise(ret)) { - yield ret; - } - }).catch(err => { + let promise; + if (is.asyncFunction(listener)) { + promise = listener(...args); + } else { + promise = co(function* () { + yield listener(...args); + }); + } + promise.catch(err => { err.name = 'EventListenerProcessError'; this.emit('error', err); }); diff --git a/package.json b/package.json index 151abec..3331cdd 100644 --- a/package.json +++ b/package.json @@ -1,12 +1,12 @@ { "name": "sdk-base", - "version": "3.4.1", + "version": "3.4.0", "description": "a base class for sdk with default error handler", "main": "index.js", "scripts": { "lint": "eslint --ext .js .", "test": "npm run lint && npm run test-local", - "test-local": "egg-bin test", + "test-local": "egg-bin test --require babel-register", "cov": "egg-bin cov", "ci": "npm run autod -- --check && npm run pkgfiles && npm run lint && npm run cov", "autod": "autod", @@ -41,7 +41,13 @@ "egg-ci": "^1.8.0", "eslint": "^4.11.0", "eslint-config-egg": "^5.1.1", - "pedding": "^1.1.0" + "pedding": "^1.1.0", + "babel-plugin-transform-async-to-module-method": "^6.24.0", + "babel-plugin-transform-runtime": "^6.23.0", + "babel-preset-es2015": "^6.24.0", + "babel-preset-stage-1": "^6.24.0", + "babel-register": "^6.26.0", + "bluebird": "^3.3.5" }, "engine": { "node": ">= 6.0.0" From 73e09a158866dd18377507ac3f994ddd176f3a3e Mon Sep 17 00:00:00 2001 From: kurten Date: Wed, 4 Apr 2018 11:43:12 +0800 Subject: [PATCH 3/4] fix node 6 test --- package.json | 2 +- test/.setup.js | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) create mode 100644 test/.setup.js diff --git a/package.json b/package.json index 3331cdd..04a68e0 100644 --- a/package.json +++ b/package.json @@ -6,7 +6,7 @@ "scripts": { "lint": "eslint --ext .js .", "test": "npm run lint && npm run test-local", - "test-local": "egg-bin test --require babel-register", + "test-local": "egg-bin test", "cov": "egg-bin cov", "ci": "npm run autod -- --check && npm run pkgfiles && npm run lint && npm run cov", "autod": "autod", diff --git a/test/.setup.js b/test/.setup.js new file mode 100644 index 0000000..f6142d1 --- /dev/null +++ b/test/.setup.js @@ -0,0 +1,3 @@ +'use strict'; + +require('babel-register'); From 5e5c415a99414b34c218c93a05e1a1a1f0af2cec Mon Sep 17 00:00:00 2001 From: kurten Date: Thu, 5 Apr 2018 16:24:11 +0800 Subject: [PATCH 4/4] change and add test case --- index.js | 2 +- test/.setup.js | 8 +++++++- test/index.test.js | 19 +++++++++++++++++++ 3 files changed, 27 insertions(+), 2 deletions(-) diff --git a/index.js b/index.js index c30d727..0b59c02 100644 --- a/index.js +++ b/index.js @@ -84,7 +84,7 @@ class Base extends EventEmitter { removeListener(eventName, listener) { let target = listener; - if (is.generatorFunction(listener)) { + if (is.generatorFunction(listener) || is.asyncFunction(listener)) { const listeners = this.listeners(eventName); for (const fn of listeners) { if (fn.original === listener) { diff --git a/test/.setup.js b/test/.setup.js index f6142d1..c6fe580 100644 --- a/test/.setup.js +++ b/test/.setup.js @@ -1,3 +1,9 @@ 'use strict'; -require('babel-register'); +const ver = process.version; +let major = ver.split('.')[0]; +major = parseInt(major.substr(1), 10); +// below node 8 +if (major < 8) { + require('babel-register'); +} diff --git a/test/index.test.js b/test/index.test.js index 2b40b06..d9c4cab 100644 --- a/test/index.test.js +++ b/test/index.test.js @@ -321,6 +321,25 @@ describe('sdk-base', () => { assert(client.listeners('event_code').length === 0); }); + it('should remove async listener', done => { + done = pedding(done, 1); + const client = new SomeServiceClient(); + const handler = async function(data) { + assert(data === 1); + console.log('async listener'); + done(); + }; + client.on('event_code', data => { + assert(data === 1); + console.log('normal listener'); + }); + client.on('event_code_async', handler); + client.emit('event_code', 1); + client.emit('event_code_async', 1); + client.removeListener('event_code_async', handler); + assert(client.listeners('event_code_async').length === 0); + }); + it('should not allow to add generator listener on error event', () => { const client = new SomeServiceClient(); assert.throws(() => {