oox 0.2.0 → 0.3.0-beta1

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.
Files changed (54) hide show
  1. package/LICENSE +21 -21
  2. package/README.md +32 -29
  3. package/app.js +142 -0
  4. package/bin/argv.js +70 -95
  5. package/bin/cli.js +43 -58
  6. package/bin/configurer.js +49 -78
  7. package/bin/proxyer.js +61 -95
  8. package/bin/register.js +54 -105
  9. package/bin/starter.js +77 -144
  10. package/index.js +149 -6
  11. package/index.mjs +4 -0
  12. package/modules/http/index.js +180 -0
  13. package/modules/http/utils.js +73 -0
  14. package/modules/index.js +88 -0
  15. package/modules/module.js +16 -0
  16. package/modules/socketio/client.js +101 -0
  17. package/modules/socketio/index.js +148 -0
  18. package/modules/socketio/server.js +130 -0
  19. package/modules/socketio/socket.js +4 -0
  20. package/package.json +34 -16
  21. package/types/app.d.ts +37 -0
  22. package/types/bin/argv.d.ts +8 -0
  23. package/types/bin/cli.d.ts +2 -0
  24. package/types/bin/configurer.d.ts +1 -0
  25. package/types/bin/proxyer.d.ts +1 -0
  26. package/types/bin/register.d.ts +1 -0
  27. package/types/bin/starter.d.ts +1 -0
  28. package/types/index.d.ts +70 -0
  29. package/types/modules/http/index.d.ts +47 -0
  30. package/types/modules/http/utils.d.ts +17 -0
  31. package/types/modules/index.d.ts +23 -0
  32. package/types/modules/module.d.ts +11 -0
  33. package/types/modules/socketio/client.d.ts +23 -0
  34. package/types/modules/socketio/index.d.ts +35 -0
  35. package/types/modules/socketio/server.d.ts +35 -0
  36. package/types/modules/socketio/socket.d.ts +11 -0
  37. package/types/utils.d.ts +6 -0
  38. package/utils.js +63 -0
  39. package/.gitattributes +0 -2
  40. package/global.js +0 -118
  41. package/middleware.js +0 -167
  42. package/rpc/config.class.js +0 -48
  43. package/rpc/context.class.js +0 -15
  44. package/rpc/http.class.js +0 -312
  45. package/rpc/rpc.class.js +0 -231
  46. package/rpc/rpc.interface.class.js +0 -119
  47. package/rpc/socketio.class.js +0 -223
  48. package/service/service.class.js +0 -74
  49. package/service/socketio.class.js +0 -145
  50. package/setMap.class.js +0 -67
  51. package/socketio/client.class.js +0 -190
  52. package/socketio/server.class.js +0 -222
  53. package/socketio/socket.class.js +0 -23
  54. 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
- }