summaryrefslogtreecommitdiff
path: root/script/brave/work.lua
diff options
context:
space:
mode:
author最萌小汐 <sumneko@hotmail.com>2023-05-22 18:03:56 +0800
committer最萌小汐 <sumneko@hotmail.com>2023-05-22 18:04:01 +0800
commitd8f2ce4a7e7068f0d81cd48a4589226eec249415 (patch)
tree6ec1054ef804d658f67f8daa74f16c78c6b52478 /script/brave/work.lua
parent86e2d589c30e73198226b11c4248a31fada4e620 (diff)
downloadlua-language-server-d8f2ce4a7e7068f0d81cd48a4589226eec249415.zip
better socket
Diffstat (limited to 'script/brave/work.lua')
-rw-r--r--script/brave/work.lua57
1 files changed, 35 insertions, 22 deletions
diff --git a/script/brave/work.lua b/script/brave/work.lua
index 3b82b452..b3e79272 100644
--- a/script/brave/work.lua
+++ b/script/brave/work.lua
@@ -13,34 +13,47 @@ brave.on('loadProtoByStdio', function ()
end
end)
-brave.on('loadProtoBySocket', function (fdHandle)
+brave.on('loadProtoBySocket', function (param)
local jsonrpc = require 'jsonrpc'
local socket = require 'bee.socket'
- local thread = require 'bee.thread'
- local fd = socket.fd(fdHandle)
+ local rfd = socket.fd(param.rfd)
+ local wfd = socket.fd(param.wfd)
local buf = ''
- while true do
- local proto, err = jsonrpc.decode(function (len)
- while true do
- if #buf >= len then
- local res = buf:sub(1, len)
- buf = buf:sub(len + 1)
- return res
- end
- local data = fd:recv()
- if data then
- buf = buf .. data
- else
- thread.sleep(0.01)
+
+ ---@async
+ local parser = coroutine.create(function ()
+ while true do
+ ---@async
+ local proto, err = jsonrpc.decode(function (len)
+ while true do
+ if #buf >= len then
+ local res = buf:sub(1, len)
+ buf = buf:sub(len + 1)
+ return res
+ end
+ coroutine.yield()
end
+ end)
+ --log.debug('loaded proto', proto.method)
+ if not proto then
+ brave.push('protoerror', err)
+ return
end
- end)
- --log.debug('loaded proto', proto.method)
- if not proto then
- brave.push('protoerror', err)
- return
+ brave.push('proto', proto)
end
- brave.push('proto', proto)
+ end)
+
+ while true do
+ socket.select({rfd, wfd}, nil, 10)
+ local needSend = wfd:recv()
+ if needSend then
+ rfd:send(needSend)
+ end
+ local recved = rfd:recv()
+ if recved then
+ buf = buf .. recved
+ end
+ coroutine.resume(parser)
end
end)