11local subprocess = require ' bee.subprocess'
2+ local socket = require ' bee.socket'
23local util = require ' utility'
34local await = require ' await'
45local pub = require ' pub'
56local jsonrpc = require ' jsonrpc'
67local define = require ' proto.define'
78local json = require ' json'
89local inspect = require ' inspect'
10+ local thread = require ' bee.thread'
911
1012local reqCounter = util .counter ()
1113
@@ -29,6 +31,9 @@ local m = {}
2931m .ability = {}
3032m .waiting = {}
3133m .holdon = {}
34+ m .mode = ' stdio'
35+ --- @type bee.socket.fd
36+ m .fd = nil
3237
3338function m .getMethodName (proto )
3439 if proto .method :sub (1 , 2 ) == ' $/' then
4651function m .send (data )
4752 local buf = jsonrpc .encode (data )
4853 logSend (buf )
49- io.write (buf )
54+ if m .mode == ' stdio' then
55+ io.write (buf )
56+ elseif m .mode == ' socket' then
57+ m .fd :send (buf )
58+ end
5059end
5160
5261function m .response (id , res )
@@ -219,12 +228,20 @@ function m.doResponse(proto)
219228 waiting .resume (proto .result )
220229end
221230
222- function m .listen ()
223- subprocess .filemode (io.stdin , ' b' )
224- subprocess .filemode (io.stdout , ' b' )
225- io.stdin :setvbuf ' no'
226- io.stdout :setvbuf ' no'
227- pub .task (' loadProto' )
231+ function m .listen (mode , socketPort )
232+ m .mode = mode
233+ if mode == ' stdio' then
234+ subprocess .filemode (io.stdin , ' b' )
235+ subprocess .filemode (io.stdout , ' b' )
236+ io.stdin :setvbuf ' no'
237+ io.stdout :setvbuf ' no'
238+ pub .task (' loadProtoByStdio' )
239+ elseif mode == ' socket' then
240+ local fd = assert (socket (' tcp' ))
241+ fd :connect (' 127.0.0.1' , socketPort )
242+ m .fd = fd
243+ pub .task (' loadProtoBySocket' , fd :handle ())
244+ end
228245end
229246
230247return m
0 commit comments