Skip to content

Commit 17fbd44

Browse files
committed
remove domain dependency
1 parent 97305da commit 17fbd44

File tree

6 files changed

+118
-89
lines changed

6 files changed

+118
-89
lines changed

README-EN.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,8 @@
1313

1414

1515
## Version Feature Updates
16+
- Version: 5.6.0
17+
- Remove domain dependency.
1618
- Version: 5.5.1
1719
- Bug fix in _parseSearchHit function.
1820
- Version: 5.5.0

README.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,8 @@
1313

1414

1515
## 版本特性
16+
- 版本: 5.6.0
17+
- Remove domain dependency.
1618
- 版本: 5.5.1
1719
- Bug fix in _parseSearchHit function.
1820
- 版本: 5.5.0

lib/request.js

Lines changed: 54 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
var TableStore = require('./core');
22
var inherit = TableStore.util.inherit;
3-
var domain = TableStore.util.nodeRequire('domain');
43

54
var hardErrorStates = { success: 1, error: 1, complete: 1 };
65

@@ -13,28 +12,32 @@ function AcceptorStateMachine(states, state) {
1312
this.states = states || {};
1413
}
1514

16-
AcceptorStateMachine.prototype.runTo = function runTo(finalState, done, bindObject, inputError) {
15+
AcceptorStateMachine.prototype.runTo = async function runTo(finalState, done, bindObject, inputError) {
1716
if (typeof finalState === 'function') {
1817
inputError = bindObject; bindObject = done;
1918
done = finalState; finalState = null;
2019
}
2120

22-
var self = this;
23-
var state = self.states[self.currentState];
24-
state.fn.call(bindObject || self, inputError, function (err) {
25-
if (err) {
26-
if (bindObject.logger) bindObject.logger.log(self.currentState, '->', state.fail, err);
27-
if (state.fail) self.currentState = state.fail;
28-
else return done ? done(err) : null;
29-
} else {
30-
if (bindObject.logger) bindObject.logger.log(self.currentState, '->', state.accept);
31-
if (state.accept) self.currentState = state.accept;
32-
else return done ? done() : null;
33-
}
34-
if (self.currentState === finalState) return done ? done(err) : null;
21+
try {
22+
var self = this;
23+
var state = self.states[self.currentState];
24+
await state.fn.call(bindObject || self, inputError, async (err) => {
25+
if (err) {
26+
if (bindObject.logger) bindObject.logger.log(self.currentState, '->', state.fail, err);
27+
if (state.fail) self.currentState = state.fail;
28+
else return done ? done(err) : null;
29+
} else {
30+
if (bindObject.logger) bindObject.logger.log(self.currentState, '->', state.accept);
31+
if (state.accept) self.currentState = state.accept;
32+
else return done ? done() : null;
33+
}
34+
if (self.currentState === finalState) return done ? done(err) : null;
3535

36-
self.runTo(finalState, done, bindObject, err);
37-
});
36+
await self.runTo(finalState, done, bindObject, err);
37+
});
38+
} catch (err) {
39+
if (done) done(err);
40+
}
3841
};
3942

4043
AcceptorStateMachine.prototype.addState = function addState(name, acceptState, failState, fn) {
@@ -51,31 +54,33 @@ AcceptorStateMachine.prototype.addState = function addState(name, acceptState, f
5154

5255
var fsm = new AcceptorStateMachine();
5356
fsm.setupStates = function () {
54-
var transition = function transition(_, done) {
57+
var transition = async function transition(_, done) {
5558
var self = this;
5659
var origError = self.response.error;
57-
self.emit(self._asm.currentState, function (err) {
58-
if (err) {
59-
if (isTerminalState(self)) {
60-
if (domain && self.domain instanceof domain.Domain) {
61-
err.domainEmitter = self;
62-
err.domain = self.domain;
63-
err.domainThrown = false;
64-
self.domain.emit('error', err);
65-
} else {
60+
try {
61+
await self.emit(self._asm.currentState, async (err) => {
62+
if (err) {
63+
if (isTerminalState(self)) {
6664
throw err;
65+
} else {
66+
self.response.error = err;
67+
done(err);
6768
}
6869
} else {
69-
self.response.error = err;
70-
done(err);
70+
done(self.response.error);
7171
}
72+
});
73+
} catch (err) {
74+
if (isTerminalState(self)) {
75+
throw err;
7276
} else {
73-
done(self.response.error);
77+
self.response.error = err;
78+
done(err);
7479
}
75-
});
80+
}
7681
};
7782

78-
this.addState('restart', 'build', 'error', function (err, done) {
83+
this.addState('restart', 'build', 'error', async function (err, done) {
7984
err = this.response.error;
8085
if (!err) return done();
8186
err.retryable = TableStore.DefaultRetryPolicy.shouldRetry(this.response.retryCount, this.response.error, this.response.request.operation);
@@ -122,8 +127,6 @@ TableStore.Request = inherit({
122127
if (config.maxRetries !== undefined) {
123128
TableStore.DefaultRetryPolicy.maxRetryTimes = config.maxRetries;
124129
}
125-
//如果在sdk外部包装了一层domain,就把它传到this.domain
126-
this.domain = domain && domain.active;
127130
this.operation = operation;
128131
this.params = params || {};
129132
this.httpRequest = new TableStore.HttpRequest(endpoint, region);
@@ -156,23 +159,23 @@ TableStore.Request = inherit({
156159
* request = client.listTable({Bucket: 'bucket', Key: 'key'});
157160
* request.send(function(err, data) { console.log(err, data); });
158161
*/
159-
send: function send(callback) {
162+
send: async function send(callback) {
160163
if (callback) {
161164
this.on('complete', function (resp) {
162165
callback.call(resp, resp.error, resp.data);
163166
});
164167
}
165-
this.runTo();
168+
await this.runTo();
166169

167170
return this.response;
168171
},
169172

170-
build: function build(callback) {
171-
return this.runTo('send', callback);
173+
build: async function build(callback) {
174+
await this.runTo('send', callback);
172175
},
173176

174-
runTo: function runTo(state, done) {
175-
this._asm.runTo(state, done, this);
177+
runTo: async function runTo(state, done) {
178+
await this._asm.runTo(state, done, this);
176179
return this;
177180
},
178181

@@ -181,15 +184,19 @@ TableStore.Request = inherit({
181184
* or an array of args to send to the event.
182185
* @api private
183186
*/
184-
emitEvent: function emit(eventName, args, done) {
187+
emitEvent: async function emit(eventName, args, done) {
185188
if (typeof args === 'function') { done = args; args = null; }
186-
if (!done) done = function () { }//this.unhandledErrorCallback;
189+
if (!done) done = function () { };
187190
if (!args) args = this.eventParameters(eventName, this.response);
188191
var origEmit = TableStore.SequentialExecutor.prototype.emit;
189-
origEmit.call(this, eventName, args, function (err) {
190-
if (err) this.response.error = err;
191-
done.call(this, err);
192-
});
192+
try {
193+
await origEmit.call(this, eventName, args, async (err) => {
194+
if (err) this.response.error = err;
195+
done.call(this, err);
196+
});
197+
} catch (err) {
198+
if (done) done(err);
199+
}
193200
},
194201

195202
/**
@@ -225,4 +232,4 @@ TableStore.Response = inherit({
225232
this.httpResponse = new TableStore.HttpResponse();
226233
}
227234

228-
});
235+
});

lib/sequential_executor.js

Lines changed: 27 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
var TableStore = require('./core');
2-
var domain = TableStore.util.nodeRequire('domain');
32

43
/**
54
* @!method on(eventName, callback)
@@ -14,7 +13,6 @@ var domain = TableStore.util.nodeRequire('domain');
1413
TableStore.SequentialExecutor = TableStore.util.inherit({
1514

1615
constructor: function SequentialExecutor() {
17-
this.domain = domain && domain.active;
1816
this._events = {};
1917
},
2018

@@ -68,54 +66,59 @@ TableStore.SequentialExecutor = TableStore.util.inherit({
6866
/**
6967
* @api private
7068
*/
71-
emit: function emit(eventName, eventArgs, doneCallback) {
69+
emit: async function emit(eventName, eventArgs, doneCallback) {
7270
if (!doneCallback) doneCallback = this.unhandledErrorCallback;
73-
if (domain && this.domain instanceof domain.Domain)
74-
this.domain.enter();
7571

76-
if(process.env.DEBUG == 'aliyun') {
72+
if (process.env.DEBUG == 'aliyun') {
7773
console.log('emit', eventName);
7874
}
75+
7976
var listeners = this.listeners(eventName);
8077
var count = listeners.length;
81-
this.callListeners(listeners, eventArgs, doneCallback);
78+
79+
try {
80+
await this.callListeners(listeners, eventArgs, doneCallback);
81+
} catch (err) {
82+
doneCallback.call(this, err);
83+
}
84+
8285
return count > 0;
8386
},
8487

8588
/**
8689
* @api private
8790
*/
88-
callListeners: function callListeners(listeners, args, doneCallback) {
91+
callListeners: async function callListeners(listeners, args, doneCallback) {
8992
if (listeners.length === 0) {
9093
doneCallback.call(this);
91-
if (domain && this.domain instanceof domain.Domain)
92-
this.domain.exit();
9394
} else {
9495
var listener = listeners.shift();
9596
if (listener._isAsync) {
9697

9798
// asynchronous listener
98-
var callNextListener = function(err) {
99-
if (err) {
100-
doneCallback.call(this, err);
101-
if (domain && this.domain instanceof domain.Domain)
102-
this.domain.exit();
103-
} else {
104-
this.callListeners(listeners, args, doneCallback);
105-
}
106-
}.bind(this);
107-
listener.apply(this, args.concat([callNextListener]));
99+
try {
100+
await new Promise((resolve, reject) => {
101+
listener.apply(this, args.concat([function(err) {
102+
if (err) {
103+
reject(err);
104+
} else {
105+
resolve();
106+
}
107+
}]));
108+
});
109+
await this.callListeners(listeners, args, doneCallback);
110+
} catch (err) {
111+
doneCallback.call(this, err);
112+
}
108113

109114
} else {
110115

111116
// synchronous listener
112117
try {
113118
listener.apply(this, args);
114-
this.callListeners(listeners, args, doneCallback);
119+
await this.callListeners(listeners, args, doneCallback);
115120
} catch (err) {
116121
doneCallback.call(this, err);
117-
if (domain && this.domain instanceof domain.Domain)
118-
this.domain.exit();
119122
}
120123

121124
}
@@ -230,7 +233,7 @@ TableStore.SequentialExecutor = TableStore.util.inherit({
230233
});
231234

232235
/**
233-
* {on} is the prefered method.
236+
* {on} is the preferred method.
234237
* @api private
235238
*/
236239
TableStore.SequentialExecutor.prototype.addListener = TableStore.SequentialExecutor.prototype.on;

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
"name": "tablestore",
33
"main": "index.js",
44
"description": "TableStore SDK for JavaScript",
5-
"version": "5.5.1",
5+
"version": "5.6.0",
66
"devDependencies": {
77
"mocha": "^3.2.0",
88
"coveralls": "^2.13.1",

samples/domainError.js

Lines changed: 32 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,34 @@
1-
var client = require('./client');
2-
var domain = TableStore.util.nodeRequire('domain');
1+
const client = require('./client');
32

4-
//https://nodejs.org/api/domain.html#domain_domain_enter
5-
//https://shapeshed.com/uncaught-exceptions-in-node/
6-
domainSample = domain.create();
7-
domainSample.on('error', function (err) {
8-
console.log('error:', err);
9-
console.log('Exit your application!')
10-
})
11-
domainSample.run(function () {
12-
client.listTable({}, function (err, data) {
13-
if (err) {
14-
console.log('error:', err);
15-
return;
16-
}
17-
throw new Error('test')
3+
const listTablePromise = (params) => {
4+
return new Promise((resolve, reject) => {
5+
client.listTable(params, (err, data) => {
6+
if (err) return reject(err);
7+
resolve(data);
188
});
19-
})
9+
});
10+
};
11+
12+
async function run() {
13+
try {
14+
const data = await listTablePromise({});
15+
console.log('Data:', data);
16+
throw new Error('test');
17+
} catch (err) {
18+
console.log('error:', err);
19+
console.log('Exit your application!');
20+
process.exit(1);
21+
}
22+
}
23+
24+
process.on('unhandledRejection', (err) => {
25+
console.error('Unhandled Promise Rejection:', err);
26+
process.exit(1);
27+
});
28+
29+
process.on('uncaughtException', (err) => {
30+
console.error('Uncaught Exception:', err);
31+
process.exit(1);
32+
});
33+
34+
run();

0 commit comments

Comments
 (0)