[mod] improve sock err handling

This commit is contained in:
Andy Bunce 2025-08-21 18:29:41 +01:00
parent 9c805c2a21
commit b7d0d8e03d
11 changed files with 108 additions and 71 deletions

View file

@ -1,21 +1,28 @@
{
"capabilities": {
"textDocumentSync": 2,
"completionProvider": {
"resolveProvider": false,
"triggerCharacters": [ "\"", ":" ],
"documentSelector": [{ "language": "xquery" }]
},
"hoverProvider": true,
"documentSymbolProvider": false,
"documentRangeFormattingProvider": false,
"colorProvider": {},
"foldingRangeProvider": false,
"selectionRangeProvider": false,
"documentLinkProvider": {},
"serverInfo": {
"name": "XQuery 4.0b Language Server",
"version": "0.0.1"
"capabilities": {
"textDocumentSync": 2,
"completionProvider": {
"resolveProvider": false,
"triggerCharacters": [
"\"",
":"
],
"documentSelector": [
{
"language": "xquery"
}
]
},
"hoverProvider": false,
"documentSymbolProvider": false,
"documentRangeFormattingProvider": false,
"colorProvider": false,
"foldingRangeProvider": false,
"selectionRangeProvider": false,
"documentLinkProvider": {},
"serverInfo": {
"name": "XQuery 4.0b Language Server",
"version": "0.0.1"
}
}
}
}

View file

@ -0,0 +1,7 @@
{
"tabSize": 2,
"insertSpaces": true,
"trimTrailingWhitespace": true,
"insertFinalNewline": true,
"trimFinalNewlines": true
}

View file

@ -3,6 +3,7 @@ positions in text
:)
module namespace pos="lsp/position";
(:~ json numbers :)
declare type pos:num as (xs:integer|xs:double);
(:~
@ -89,7 +90,7 @@ as xs:integer
return $s?max
};
(:~ position text for display :)
(:~ format position for text display :)
declare function pos:ln-col($pos as pos:Position,$offset as xs:integer:=1)
{
`Ln { $pos?line + $offset}, Col { $pos?character + $offset}`

View file

@ -20,7 +20,7 @@
<form class="d-flex">
<span id="state">🔴</span>
<input id="iServer" type="text" value="ws://localhost:3000/ws/lsp" style="width:25em" />
<input id="iServer" type="text" value="ws://localhost:3000/ws/lsp2" style="width:25em" />
<button id="connect">connect</button>
</form>
<div class="row">
@ -45,6 +45,7 @@
<div class="container-fluid">
<div class="row " style="overflow:hidden">
<div class="col-2">
<div id="msg"> </div>
<select id="load">
<option selected value="">load..</option>
<optgroup label="XQuery3">
@ -61,7 +62,7 @@
</optgroup>
</select>
<label for="symbols">Symbols:</label><select id="symbols" disabled="disabled"></select>
<ul id="msg" style="overflow: scroll;">
<ul id="traffic" style="overflow: scroll;">
<li>-</li>
</ul>
</div>

View file

@ -31375,18 +31375,18 @@ ${text}</tr>
// no error checking
function simpleWebSocketTransport(uri) {
let handlers = [];
let sock = new WebSocket(uri);
sock.addEventListener("close", (event) => { alert("sock gone!");});
sock.addEventListener("error", (event) => { alert("sock error!");});
sock.onmessage = e => { for (let h of handlers) h(e.data.toString()); };
return new Promise(resolve => {
return new Promise(function (resolve, reject) {
let sock = new WebSocket(uri);
sock.onmessage = e => { for (let h of handlers) h(e.data.toString()); };
sock.onerror = e => reject(e);
sock.onopen = () => resolve({
socket: sock,
send: (message) => sock.send(message),
subscribe: (handler) => handlers.push(handler),
unsubscribe: (handler) => handlers = handlers.filter(h => h != handler)
});
});
}
);
}
const baseExts = [
lineNumbers(),
@ -31421,8 +31421,8 @@ ${text}</tr>
syntaxHighlighting(defaultHighlightStyle, { fallback: true })
];
function createEditorState(initialContents, extensions,options = {}) {
function createEditorState(initialContents, extensions, options = {}) {
if (options.oneDark)
extensions.push(oneDark);
@ -31437,7 +31437,7 @@ ${text}</tr>
}
class xqLinter {
constructor(parameters) {
this.fred=parameters;
this.fred = parameters;
}
}

File diff suppressed because one or more lines are too long

View file

@ -1,4 +1,9 @@
const view = lsp.createEditorView(undefined, document.getElementById("editor"));
let doc = `3+1`;
var client;
var extLint;
function $(id){return document.getElementById(id)};
// Load saved content from localStorage when the page loads
window.addEventListener('load', () => {
const savedText = localStorage.getItem('code');
@ -8,14 +13,6 @@ window.addEventListener('load', () => {
view.setState(lsp.createEditorState(doc, lsp.baseExts));
connect();
});
const view = lsp.createEditorView(undefined, document.getElementById("editor"));
let doc = `3+1`;
var client;
var extLint;
// Save content to localStorage when the page is about to unload
window.addEventListener('beforeunload', () => {
const doc = view.state.doc.toString();
@ -68,9 +65,13 @@ function connect() {
lsp.simpleWebSocketTransport(server)
.then(transport => {
transport.subscribe(incoming);
transport.socket.onclose=(event) => $("msg").innerText="sock gone!";
transport.socket.oneror=(event) => $("msg").innerText="sock error!";
client = new lsp.LSPClient().connect(transport);
let extLsp=lsp.languageServerSupport(client,file,"xquery");
extLint=lsp.linter(null,{autoPanel:true});
extLint=lsp.linter(
view=>{ client.sync();return [];},
{autoPanel:true});
const doc = view.state.doc.toString();
const state = lsp.createEditorState(doc, [...lsp.baseExts, extLsp,extLint]);
view.setState(state);
@ -96,10 +97,8 @@ function log(rpc){
if(rpc.id) return
const text=rpc.method;
const li = document.createElement("li");
li.appendChild(document.createTextNode(text));
const ol=document.getElementById("msg");
ol.insertBefore(li,ol.firstChild)
$("traffic").insertBefore(li,$("traffic").firstChild)
};
function diags(params){