[fix] sending messages
This commit is contained in:
parent
0dfcbf17d8
commit
c59edb71a2
6 changed files with 147 additions and 13 deletions
59
webapp/lsp/jsonrpc.xqm
Normal file
59
webapp/lsp/jsonrpc.xqm
Normal file
|
|
@ -0,0 +1,59 @@
|
|||
(:~
|
||||
: jsonrpc
|
||||
: @author andy bunce
|
||||
:)
|
||||
module namespace lsprpc = 'lsprpc';
|
||||
|
||||
declare variable $lsprpc:methods:=map{
|
||||
"initialize" : lsprpc:method-initialize#1,
|
||||
"initialized" : lsprpc:method-unknown#1,
|
||||
"workspace/didChangeConfiguration" :lsprpc:method-unknown#1,
|
||||
"textDocument/didOpen": lsprpc:method-unknown#1,
|
||||
"textDocument/didClose" : lsprpc:method-unknown#1
|
||||
};
|
||||
|
||||
(:~ return map if $msg is jsonrpc else empty :)
|
||||
declare
|
||||
function lsprpc:parse($msg as xs:string)
|
||||
as map(*)?
|
||||
{
|
||||
try {
|
||||
let $json:=parse-json($msg)
|
||||
return if($json?jsonrpc="2.0" and exists($json?method))
|
||||
then $json
|
||||
else ()
|
||||
} catch *{
|
||||
()
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
(:~ send replay to $json :)
|
||||
declare
|
||||
function lsprpc:reply($json as map(*))
|
||||
as empty-sequence() {
|
||||
let $method := $json?method
|
||||
let $f :=$lsprpc:methods?($method)
|
||||
let $response := $f!.($json)
|
||||
return if(exists($response)) then ws:send($response=>trace("REPLY: "),ws:id())
|
||||
};
|
||||
|
||||
(:~ canned initialize response :)
|
||||
declare
|
||||
function lsprpc:method-initialize($json as map(*))
|
||||
as map(*)?
|
||||
{
|
||||
``[{"jsonrpc":"2.0","id":0,
|
||||
"result":{"capabilities":{"textDocumentSync":2,"completionProvider":{"resolveProvider":false,"triggerCharacters":["\"",":"]},"hoverProvider":true,"documentSymbolProvider":true,"documentRangeFormattingProvider":false,"colorProvider":{},"foldingRangeProvider":true,"selectionRangeProvider":true,"documentLinkProvider":{}}}}]``
|
||||
=>parse-json()
|
||||
};
|
||||
|
||||
(:~ unknown method response :)
|
||||
declare
|
||||
function lsprpc:method-unknown($json as map(*))
|
||||
as map(*)?
|
||||
{
|
||||
let $_:=trace($json?method,"unknown")
|
||||
return ()
|
||||
};
|
||||
|
||||
|
|
@ -1,9 +1,10 @@
|
|||
(:~
|
||||
: Simple WebSocket chat. WebSocket functions.
|
||||
: @author BaseX Team, BSD License
|
||||
: WebSocket LSP
|
||||
: @author Andy Bunce
|
||||
:)
|
||||
module namespace lsp-ws = 'lsp-ws';
|
||||
|
||||
import module namespace lsprpc = 'lsprpc' at 'jsonrpc.xqm';
|
||||
import module namespace chat-util = 'chat/util' at 'lsp-util.xqm';
|
||||
|
||||
declare
|
||||
|
|
@ -18,9 +19,8 @@ function lsp-ws:error($error) {
|
|||
declare
|
||||
%ws:connect('/lsp')
|
||||
function lsp-ws:connect() as empty-sequence() {
|
||||
let $_:=ws:id()=>trace("CONNECT2: ")
|
||||
let $_:=session:get($chat-util:id)=>trace("CONNECTx: ")
|
||||
return ws:set(ws:id()=>trace("CONNECT: "), $chat-util:id, "session:get($chat-util:id)")
|
||||
|
||||
ws:set(ws:id()=>trace("CONNECT: "), $chat-util:id, "session:get($chat-util:id)")
|
||||
(: ,chat-util:users() :)
|
||||
};
|
||||
|
||||
|
|
@ -33,15 +33,14 @@ declare
|
|||
function lsp-ws:message(
|
||||
$message as xs:string
|
||||
) as empty-sequence() {
|
||||
let $json := parse-json($message=>trace("MSG "))
|
||||
let $type := $json?type
|
||||
return if($type = 'message') then (
|
||||
chat-util:message($json?text, $json?to)
|
||||
) else if($type = 'ping') then(
|
||||
(: do nothing :)
|
||||
) else error()
|
||||
|
||||
let $json := lsprpc:parse($message=>trace("MSG "))
|
||||
return if(exists($json))
|
||||
then lsprpc:reply($json)
|
||||
else message($message,"bad RPC: ")
|
||||
};
|
||||
|
||||
|
||||
(:~
|
||||
: Closes a WebSocket connection. Unregisters the user and notifies all clients.
|
||||
:)
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue