oox 0.2.0 → 0.3.0-beta3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -21
- package/README.md +32 -29
- package/app.js +142 -0
- package/bin/argv.js +70 -95
- package/bin/cli.js +43 -58
- package/bin/configurer.js +49 -78
- package/bin/proxyer.js +61 -95
- package/bin/register.js +55 -105
- package/bin/starter.js +81 -144
- package/index.js +144 -6
- package/index.mjs +4 -0
- package/modules/http/index.js +180 -0
- package/modules/http/utils.js +73 -0
- package/modules/index.js +81 -0
- package/modules/module.js +16 -0
- package/package.json +34 -16
- package/types/app.d.ts +37 -0
- package/types/bin/argv.d.ts +8 -0
- package/types/bin/cli.d.ts +2 -0
- package/types/bin/configurer.d.ts +1 -0
- package/types/bin/proxyer.d.ts +1 -0
- package/types/bin/register.d.ts +1 -0
- package/types/bin/starter.d.ts +1 -0
- package/types/index.d.ts +70 -0
- package/types/modules/http/index.d.ts +47 -0
- package/types/modules/http/utils.d.ts +17 -0
- package/types/modules/index.d.ts +22 -0
- package/types/modules/module.d.ts +13 -0
- package/types/utils.d.ts +6 -0
- package/utils.js +63 -0
- package/.gitattributes +0 -2
- package/global.js +0 -118
- package/middleware.js +0 -167
- package/rpc/config.class.js +0 -48
- package/rpc/context.class.js +0 -15
- package/rpc/http.class.js +0 -312
- package/rpc/rpc.class.js +0 -231
- package/rpc/rpc.interface.class.js +0 -119
- package/rpc/socketio.class.js +0 -223
- package/service/service.class.js +0 -74
- package/service/socketio.class.js +0 -145
- package/setMap.class.js +0 -67
- package/socketio/client.class.js +0 -190
- package/socketio/server.class.js +0 -222
- package/socketio/socket.class.js +0 -23
- package/util.js +0 -224
package/rpc/http.class.js
DELETED
|
@@ -1,312 +0,0 @@
|
|
|
1
|
-
|
|
2
|
-
const http = require ( 'http' )
|
|
3
|
-
|
|
4
|
-
const { parseHTTPBody, getIPAddress, httpRequest } = require ( '../util' )
|
|
5
|
-
|
|
6
|
-
const Context = require ( './context.class' )
|
|
7
|
-
|
|
8
|
-
const RPC = require ( './rpc.interface.class' )
|
|
9
|
-
|
|
10
|
-
const Global = require ( '../global' )
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
module.exports = class HTTPModule {
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
/**
|
|
19
|
-
* @type {RPC}
|
|
20
|
-
*/
|
|
21
|
-
rpc = null
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
/**
|
|
26
|
-
* listen port
|
|
27
|
-
*/
|
|
28
|
-
port = 0
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
/**
|
|
33
|
-
* socket.io service path
|
|
34
|
-
*/
|
|
35
|
-
path = '/'
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
/**
|
|
40
|
-
* @param {{port:Number, path:String}} config
|
|
41
|
-
*/
|
|
42
|
-
set config ( config ) {
|
|
43
|
-
|
|
44
|
-
if ( !config ) return this.rpc.config.gateway.http = null
|
|
45
|
-
|
|
46
|
-
config = this.rpc.config.gateway.http = Object.assign ( this.config || { }, config )
|
|
47
|
-
|
|
48
|
-
this.port = config.port || 0
|
|
49
|
-
|
|
50
|
-
if ( config.path ) this.path = config.path
|
|
51
|
-
else config.path = this.path
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
get config ( ) {
|
|
57
|
-
|
|
58
|
-
return this.rpc.config.gateway.http
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
/**
|
|
64
|
-
* @type {http.Server}
|
|
65
|
-
*/
|
|
66
|
-
server = null
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
/**
|
|
71
|
-
*
|
|
72
|
-
* @param {RPC} rpc
|
|
73
|
-
*/
|
|
74
|
-
constructor ( rpc ) {
|
|
75
|
-
|
|
76
|
-
this.rpc = rpc
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
/**
|
|
82
|
-
* start http service
|
|
83
|
-
* @returns {http.Server}
|
|
84
|
-
*/
|
|
85
|
-
async serve ( ) {
|
|
86
|
-
|
|
87
|
-
await this.stop ( )
|
|
88
|
-
|
|
89
|
-
const config = this.config
|
|
90
|
-
|
|
91
|
-
if ( !config ) return
|
|
92
|
-
|
|
93
|
-
const { port } = config
|
|
94
|
-
|
|
95
|
-
const isRndPort = 'number' !== typeof port || port === 0
|
|
96
|
-
|
|
97
|
-
const server =
|
|
98
|
-
this.server = http.createServer ( this.call.bind ( this ) )
|
|
99
|
-
|
|
100
|
-
server.listen ( isRndPort ? 0 : port )
|
|
101
|
-
|
|
102
|
-
config.port = server.address ( ).port
|
|
103
|
-
config.path = this.path
|
|
104
|
-
|
|
105
|
-
return server
|
|
106
|
-
}
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
/**
|
|
111
|
-
* stop http service
|
|
112
|
-
*/
|
|
113
|
-
stop ( ) {
|
|
114
|
-
|
|
115
|
-
if ( this.server && this.server.listening )
|
|
116
|
-
return new Promise ( ( resolve, reject ) => {
|
|
117
|
-
|
|
118
|
-
this.server.close ( function ( error ) {
|
|
119
|
-
|
|
120
|
-
if ( error ) reject ( error )
|
|
121
|
-
else resolve ( )
|
|
122
|
-
} )
|
|
123
|
-
} )
|
|
124
|
-
}
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
/**
|
|
129
|
-
* CORS
|
|
130
|
-
* @param {http.IncomingMessage} request
|
|
131
|
-
* @param {http.ServerResponse} response
|
|
132
|
-
*/
|
|
133
|
-
cors ( request, response ) {
|
|
134
|
-
|
|
135
|
-
// origin checking
|
|
136
|
-
if ( this.rpc.config.origin ) {
|
|
137
|
-
|
|
138
|
-
const origin = this.rpc.config.origin
|
|
139
|
-
|
|
140
|
-
const requestOrigin = request.headers.origin
|
|
141
|
-
|
|
142
|
-
if ( origin === '*' ) {
|
|
143
|
-
|
|
144
|
-
response.setHeader ( 'Access-Control-Allow-Origin', '*' )
|
|
145
|
-
} else if ( origin === requestOrigin || Array.isArray ( origin ) && origin.includes ( requestOrigin ) ) {
|
|
146
|
-
|
|
147
|
-
response.setHeader ( 'Access-Control-Allow-Origin', requestOrigin )
|
|
148
|
-
|
|
149
|
-
response.setHeader ( 'Vary', 'Origin' )
|
|
150
|
-
} else {
|
|
151
|
-
|
|
152
|
-
response.statusCode = 403
|
|
153
|
-
|
|
154
|
-
response.end ( )
|
|
155
|
-
|
|
156
|
-
return false
|
|
157
|
-
}
|
|
158
|
-
|
|
159
|
-
response.setHeader ( 'Access-Control-Max-Age', 3600 )
|
|
160
|
-
response.setHeader ( 'Access-Control-Allow-Headers', 'x-caller,content-type' )
|
|
161
|
-
response.setHeader ( 'Access-Control-Allow-Methods', 'POST' )
|
|
162
|
-
}
|
|
163
|
-
|
|
164
|
-
if ( request.method === 'OPTIONS' ) {
|
|
165
|
-
|
|
166
|
-
response.statusCode = 204
|
|
167
|
-
|
|
168
|
-
response.end ( )
|
|
169
|
-
|
|
170
|
-
return false
|
|
171
|
-
}
|
|
172
|
-
|
|
173
|
-
return true
|
|
174
|
-
}
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
/**
|
|
179
|
-
* HTTP-RPC服务器请求监听方法
|
|
180
|
-
* @param {http.IncomingMessage} request
|
|
181
|
-
* @param {http.ServerResponse} response
|
|
182
|
-
*/
|
|
183
|
-
async call ( request, response ) {
|
|
184
|
-
|
|
185
|
-
if ( request.url !== this.path ) {
|
|
186
|
-
|
|
187
|
-
return this.respond ( request, response, new Error ( 'URL Incorrect' ) )
|
|
188
|
-
}
|
|
189
|
-
|
|
190
|
-
if ( !this.cors ( request, response ) ) return
|
|
191
|
-
|
|
192
|
-
let body = Object.create ( null )
|
|
193
|
-
|
|
194
|
-
try {
|
|
195
|
-
|
|
196
|
-
body = await parseHTTPBody ( request )
|
|
197
|
-
|
|
198
|
-
if ( !body || 'object' !== typeof body ) throw new Error ( 'Content Invalid' )
|
|
199
|
-
|
|
200
|
-
} catch ( error ) {
|
|
201
|
-
|
|
202
|
-
return this.respond ( request, response, error )
|
|
203
|
-
}
|
|
204
|
-
|
|
205
|
-
// global unique id
|
|
206
|
-
const traceId = request.headers [ 'x-trace-id' ]
|
|
207
|
-
|
|
208
|
-
// service name, required
|
|
209
|
-
const caller = request.headers [ 'x-caller' ] || 'anonymous'
|
|
210
|
-
|
|
211
|
-
// client ip or caller service ip
|
|
212
|
-
const ip = request.headers [ 'x-ip' ] || request.socket.remoteAddress
|
|
213
|
-
|
|
214
|
-
// startup client ip
|
|
215
|
-
const sourceIP = request.headers [ 'x-real-ip' ]
|
|
216
|
-
|
|
217
|
-
const { action, params = [ ] } = body
|
|
218
|
-
|
|
219
|
-
const context = Global.genContext ( { traceId, caller, sourceIP, ip } )
|
|
220
|
-
|
|
221
|
-
const format = await this.rpc.call ( action, params, context )
|
|
222
|
-
|
|
223
|
-
this.respond ( request, response, format )
|
|
224
|
-
}
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
/**
|
|
229
|
-
* HTTP Response Catch
|
|
230
|
-
* @param {http.IncomingMessage} request
|
|
231
|
-
* @param {http.ServerResponse} response
|
|
232
|
-
* @param {Object} format
|
|
233
|
-
* @param {Boolean} format.success
|
|
234
|
-
* @param {Error} format.error
|
|
235
|
-
* @param {any} format.body
|
|
236
|
-
*/
|
|
237
|
-
respond ( request, response, format ) {
|
|
238
|
-
|
|
239
|
-
let formatString = ''
|
|
240
|
-
|
|
241
|
-
try {
|
|
242
|
-
|
|
243
|
-
formatString = JSON.stringify ( format )
|
|
244
|
-
} catch ( { message, stack } ) {
|
|
245
|
-
|
|
246
|
-
delete format.body
|
|
247
|
-
|
|
248
|
-
format.success = false
|
|
249
|
-
|
|
250
|
-
format.error = {
|
|
251
|
-
message,
|
|
252
|
-
stack
|
|
253
|
-
}
|
|
254
|
-
|
|
255
|
-
formatString = JSON.stringify ( format )
|
|
256
|
-
}
|
|
257
|
-
|
|
258
|
-
response.setHeader ( 'Content-Type', 'application/json' )
|
|
259
|
-
|
|
260
|
-
response.setHeader ( 'Content-Length', Buffer.byteLength ( formatString ) )
|
|
261
|
-
|
|
262
|
-
response.end ( formatString )
|
|
263
|
-
}
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
/**
|
|
268
|
-
* HTTP RPC
|
|
269
|
-
* @param {String|URL|http.RequestOptions} url
|
|
270
|
-
* @param {String} action 函数名称
|
|
271
|
-
* @param {Array} params 参数列表
|
|
272
|
-
* @param {Context} context 上下文
|
|
273
|
-
*/
|
|
274
|
-
static async call ( url, action, params, context ) {
|
|
275
|
-
|
|
276
|
-
if ( !context || !context.traceId ) {
|
|
277
|
-
|
|
278
|
-
context = Global.getContext ( )
|
|
279
|
-
}
|
|
280
|
-
|
|
281
|
-
const { traceId, caller, sourceIP } = context
|
|
282
|
-
|
|
283
|
-
const headers = {
|
|
284
|
-
'Content-Type': 'application/json',
|
|
285
|
-
'x-trace-id': String ( traceId ),
|
|
286
|
-
}
|
|
287
|
-
|
|
288
|
-
if ( caller ) headers [ 'x-caller' ] = String ( caller )
|
|
289
|
-
|
|
290
|
-
if ( sourceIP ) headers [ 'x-real-ip' ] = sourceIP
|
|
291
|
-
|
|
292
|
-
headers [ 'x-ip' ] = getIPAddress ( 4 ) [ 0 ]
|
|
293
|
-
|
|
294
|
-
const format = await httpRequest ( url, {
|
|
295
|
-
headers
|
|
296
|
-
}, JSON.stringify ( { action, params } ) )
|
|
297
|
-
|
|
298
|
-
if ( 'string' === typeof format ) throw new Error ( format )
|
|
299
|
-
|
|
300
|
-
const { error, body } = format
|
|
301
|
-
|
|
302
|
-
if ( error ) {
|
|
303
|
-
|
|
304
|
-
const asyncError = new Error ( error.message )
|
|
305
|
-
|
|
306
|
-
throw asyncError
|
|
307
|
-
} else {
|
|
308
|
-
|
|
309
|
-
return body
|
|
310
|
-
}
|
|
311
|
-
}
|
|
312
|
-
}
|
package/rpc/rpc.class.js
DELETED
|
@@ -1,231 +0,0 @@
|
|
|
1
|
-
|
|
2
|
-
const { genOOXTrace } = require ( '../util' )
|
|
3
|
-
|
|
4
|
-
const Context = require ( './context.class' )
|
|
5
|
-
|
|
6
|
-
const HTTP = require ( './http.class' )
|
|
7
|
-
|
|
8
|
-
const SocketIO = require ( './socketio.class' )
|
|
9
|
-
|
|
10
|
-
const Global = require ( '../global' )
|
|
11
|
-
|
|
12
|
-
const RPCInterface = require ( './rpc.interface.class' )
|
|
13
|
-
|
|
14
|
-
const Middleware = require ( '../middleware' )
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
module.exports = class RPC extends RPCInterface {
|
|
19
|
-
|
|
20
|
-
static Context = Context
|
|
21
|
-
|
|
22
|
-
static HTTP = HTTP
|
|
23
|
-
static SocketIO = SocketIO
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
/**
|
|
28
|
-
* @type {HTTP}
|
|
29
|
-
*/
|
|
30
|
-
http = new this.constructor.HTTP ( this )
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
/**
|
|
35
|
-
* @type {SocketIO}
|
|
36
|
-
*/
|
|
37
|
-
socketio = new this.constructor.SocketIO ( this )
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
/**
|
|
42
|
-
* new RPC service
|
|
43
|
-
* @param {*} methods
|
|
44
|
-
*/
|
|
45
|
-
constructor ( name, methods ) {
|
|
46
|
-
super ( name, methods )
|
|
47
|
-
|
|
48
|
-
Global.instances.push ( this )
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
async serve ( ) {
|
|
54
|
-
|
|
55
|
-
let isShareServer = false
|
|
56
|
-
|
|
57
|
-
if ( this.http.config && this.socketio.config ) {
|
|
58
|
-
|
|
59
|
-
isShareServer = !this.http.config.port && !this.socketio.config.port
|
|
60
|
-
|
|
61
|
-
isShareServer |= this.http.config.port === this.socketio.config.port
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
await this.http.serve ( )
|
|
65
|
-
|
|
66
|
-
if ( isShareServer ) this.socketio.server = this.http.server
|
|
67
|
-
|
|
68
|
-
await this.socketio.serve ( )
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
async stop ( ) {
|
|
74
|
-
|
|
75
|
-
await this.http.stop ( )
|
|
76
|
-
await this.socketio.stop ( )
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
/**
|
|
82
|
-
* 通用RPC调用方法
|
|
83
|
-
* @param {String} action
|
|
84
|
-
* @param {[]} params
|
|
85
|
-
* @param {Context} context
|
|
86
|
-
*/
|
|
87
|
-
async call ( action, params=[], context ) {
|
|
88
|
-
|
|
89
|
-
if ( !Array.isArray ( params ) ) params = [ params ]
|
|
90
|
-
|
|
91
|
-
const { traceId } = context
|
|
92
|
-
|
|
93
|
-
this.emit ( 'request', action, params, context )
|
|
94
|
-
|
|
95
|
-
const format = {
|
|
96
|
-
traceId,
|
|
97
|
-
success: false
|
|
98
|
-
}
|
|
99
|
-
|
|
100
|
-
try {
|
|
101
|
-
|
|
102
|
-
const result = await this.execute ( this.kvMethods, action, [ ...params ], context )
|
|
103
|
-
|
|
104
|
-
format.body = result
|
|
105
|
-
|
|
106
|
-
format.success = true
|
|
107
|
-
|
|
108
|
-
this.emit ( 'success', action, params, context, result )
|
|
109
|
-
} catch ( error ) {
|
|
110
|
-
|
|
111
|
-
format.error = {
|
|
112
|
-
message: error.message,
|
|
113
|
-
stack: error.stack
|
|
114
|
-
}
|
|
115
|
-
|
|
116
|
-
this.emit ( 'fail', action, params, context, error )
|
|
117
|
-
} finally {
|
|
118
|
-
|
|
119
|
-
return format
|
|
120
|
-
}
|
|
121
|
-
}
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
/**
|
|
125
|
-
*
|
|
126
|
-
* @param {Map<String,Function>} methods 服务函数扁平化列表
|
|
127
|
-
* @param {String} action
|
|
128
|
-
* @param {Array} params
|
|
129
|
-
* @param {Context} context
|
|
130
|
-
*/
|
|
131
|
-
async execute ( methods, action, params, context ) {
|
|
132
|
-
|
|
133
|
-
const __proxy = '__proxy', _proxy = '_proxy'
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
// 目标函数
|
|
138
|
-
const target = methods.get ( action )
|
|
139
|
-
|
|
140
|
-
// 目标代理函数
|
|
141
|
-
const targetProxy = methods.get ( action + _proxy )
|
|
142
|
-
|
|
143
|
-
// 即不存在目标也不存在目标代理时, 报错函数不存在
|
|
144
|
-
if ( !target && !targetProxy ) throw new Error ( 'Invalid Action [' + action + ']' )
|
|
145
|
-
|
|
146
|
-
Global.asyncStore.enterWith ( context )
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
// 最顶层代理
|
|
151
|
-
const topProxy = methods.get ( __proxy )
|
|
152
|
-
|
|
153
|
-
if ( topProxy ) {
|
|
154
|
-
|
|
155
|
-
const proxyReturns = await topProxy ( action, params, context )
|
|
156
|
-
|
|
157
|
-
if ( proxyReturns !== undefined ) return proxyReturns
|
|
158
|
-
}
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
// 'x.y.z' => [ 'x', 'y', 'z' ]
|
|
163
|
-
const nameStack = action.split ( '.' ), size = nameStack.length - 1
|
|
164
|
-
|
|
165
|
-
let index = -1, proxyPrefix = ''
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
// 根代理遍历
|
|
170
|
-
while ( ++index < size ) {
|
|
171
|
-
|
|
172
|
-
// x.
|
|
173
|
-
// x.y.
|
|
174
|
-
proxyPrefix += nameStack [ index ] + '.'
|
|
175
|
-
|
|
176
|
-
// x.__proxy
|
|
177
|
-
// x.y.__proxy
|
|
178
|
-
const rootProxy = methods.get ( proxyPrefix + __proxy )
|
|
179
|
-
|
|
180
|
-
// x.__proxy ( 'y.z', ... )
|
|
181
|
-
// x.y.__proxy ( 'z', ... )
|
|
182
|
-
if ( rootProxy ) {
|
|
183
|
-
|
|
184
|
-
const proxyReturns = await rootProxy ( nameStack.slice ( index ).join ( '.' ), params, context )
|
|
185
|
-
|
|
186
|
-
if ( proxyReturns !== undefined ) return proxyReturns
|
|
187
|
-
}
|
|
188
|
-
}
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
// 同级代理
|
|
193
|
-
const layerProxy = methods.get ( proxyPrefix + _proxy )
|
|
194
|
-
|
|
195
|
-
if ( layerProxy ) {
|
|
196
|
-
|
|
197
|
-
const proxyReturns = await layerProxy ( nameStack [ index ], params, context )
|
|
198
|
-
|
|
199
|
-
if ( proxyReturns !== undefined ) return proxyReturns
|
|
200
|
-
}
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
if ( targetProxy ) {
|
|
205
|
-
|
|
206
|
-
const proxyReturns = await targetProxy ( params, context )
|
|
207
|
-
|
|
208
|
-
if ( proxyReturns !== undefined ) return proxyReturns
|
|
209
|
-
}
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
// make sure target action execute after all proxies
|
|
214
|
-
if ( target ) {
|
|
215
|
-
|
|
216
|
-
const sourceMethod = Middleware.wrappedActions.get ( action )
|
|
217
|
-
|
|
218
|
-
const middlewareNames = Middleware.actionMiddlewares.get ( sourceMethod )
|
|
219
|
-
|
|
220
|
-
if ( middlewareNames && middlewareNames.length ) for ( const name of middlewareNames ) {
|
|
221
|
-
|
|
222
|
-
const middleware = Middleware.middlewares.get ( name )
|
|
223
|
-
|
|
224
|
-
await middleware ( action, params, context )
|
|
225
|
-
}
|
|
226
|
-
|
|
227
|
-
return await target ( ...params )
|
|
228
|
-
}
|
|
229
|
-
}
|
|
230
|
-
|
|
231
|
-
}
|
|
@@ -1,119 +0,0 @@
|
|
|
1
|
-
|
|
2
|
-
const { EventEmitter } = require ( 'events' )
|
|
3
|
-
|
|
4
|
-
const { genKVMethods, getIPAddress } = require ( '../util' )
|
|
5
|
-
|
|
6
|
-
const Context = require ( './context.class' )
|
|
7
|
-
|
|
8
|
-
const Config = require ( './config.class' )
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
module.exports = class RPC extends EventEmitter {
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
/**
|
|
17
|
-
* refMethods => methods
|
|
18
|
-
*/
|
|
19
|
-
refMethods = { }
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
/**
|
|
24
|
-
* the kvMethods is all actions refs
|
|
25
|
-
* @type {Map<String,Function>}
|
|
26
|
-
*/
|
|
27
|
-
kvMethods = new Map ( )
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
set methods ( methods ) {
|
|
32
|
-
|
|
33
|
-
this.refMethods = methods
|
|
34
|
-
|
|
35
|
-
this.kvMethods.clear ( )
|
|
36
|
-
|
|
37
|
-
genKVMethods ( methods, this.kvMethods )
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
appendMethods ( methods ) {
|
|
43
|
-
|
|
44
|
-
genKVMethods ( methods, this.kvMethods )
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
get methods ( ) {
|
|
50
|
-
|
|
51
|
-
return this.refMethods
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
/**
|
|
57
|
-
* RPC Node Name
|
|
58
|
-
*/
|
|
59
|
-
name = ''
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
config = new Config
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
/**
|
|
68
|
-
* new RPC service
|
|
69
|
-
* @param {*} methods
|
|
70
|
-
*/
|
|
71
|
-
constructor ( name, methods ) {
|
|
72
|
-
super ( )
|
|
73
|
-
|
|
74
|
-
this.name = name
|
|
75
|
-
|
|
76
|
-
if ( methods )
|
|
77
|
-
this.methods = methods
|
|
78
|
-
|
|
79
|
-
const [ host ] = getIPAddress ( 4 )
|
|
80
|
-
|
|
81
|
-
this.config.host = host
|
|
82
|
-
|
|
83
|
-
this.config.name = name
|
|
84
|
-
}
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
async serve ( ) { }
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
async stop ( ) { }
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
/**
|
|
97
|
-
* RPC事件监听
|
|
98
|
-
* @param {'request'|'success'|'fail'} event
|
|
99
|
-
* @param {(action: String, params: [], context: Context, result: {
|
|
100
|
-
* traceId: String,
|
|
101
|
-
* success: Boolean,
|
|
102
|
-
* body: any,
|
|
103
|
-
* error: Error
|
|
104
|
-
* } | Error) => void} listener
|
|
105
|
-
*/
|
|
106
|
-
on ( event, listener ) {
|
|
107
|
-
return super.on ( event, listener )
|
|
108
|
-
}
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
/**
|
|
113
|
-
* 通用RPC调用方法
|
|
114
|
-
* @param {String} action
|
|
115
|
-
* @param {[]} params
|
|
116
|
-
* @param {Context} context
|
|
117
|
-
*/
|
|
118
|
-
async call ( action, params=[], context ) { }
|
|
119
|
-
}
|