feat: updated extension according to new glue

This commit is contained in:
frelodev 2024-08-21 18:56:48 +02:00
parent 26f2c3b836
commit f5261b6a71
6 changed files with 43 additions and 60 deletions

View file

@ -1,3 +0,0 @@
all rights reserved -- alemi <me@alemi.dev>
no permission is granted to use or distribuite this code

View file

@ -1,10 +1,9 @@
# codemp vscode # codemp vscode
This repository contains the vscode extension for codemp This repository contains the vscode extension for codemp
## Building ## Bundling
Just compiling is not enough: neon requires us to run `npm install` to produce a `*.node` file, loadable from nodejs.
A vscode extension is basically a zip archive with a `.vsix` estension. A vscode extension is basically a zip archive with a `.vsix` estension.
If you're on Linux, the `.bundle.sh` script will produce a barebones extension bundle. Use 'npm run bundle' to bundle the extension and create a .vsix file to manually import it into vscode.
## Installing ## Installing
From VSCode extensions tab, press the menu button and choose "install from vsix", then pick the previously built file. From VSCode extensions tab, press the menu button and choose "install from vsix", then pick the previously built file.

View file

@ -23,14 +23,6 @@
"command": "codempvscode.connect", "command": "codempvscode.connect",
"title": "Connect to a codemp host" "title": "Connect to a codemp host"
}, },
{
"command": "codempvscode.login",
"title": "Log into a codemp account"
},
{
"command": "codempvscode.join",
"title": "Join a codemp workspace"
},
{ {
"command": "codempvscode.createBuffer", "command": "codempvscode.createBuffer",
"title": "Create a codemp buffer" "title": "Create a codemp buffer"
@ -67,9 +59,7 @@
"pretest": "npm run compile && npm run lint", "pretest": "npm run compile && npm run lint",
"lint": "eslint src --ext ts", "lint": "eslint src --ext ts",
"test": "node ./out/test/runTest.js", "test": "node ./out/test/runTest.js",
"compile": "napi build && tsc -p ./", "compile": "tsc -p ./",
"build": "napi build --release",
"build:debug": "napi build",
"bundle": "vsce package" "bundle": "vsce package"
}, },
"devDependencies": { "devDependencies": {
@ -86,6 +76,8 @@
"typescript": "^5.1.6" "typescript": "^5.1.6"
}, },
"dependencies": { "dependencies": {
"@vscode/vsce": "^2.22.0" "@codemp/codemp" : "0.0.4",
"@vscode/vsce": "^2.22.0",
"npx": "^10.2.2"
} }
} }

View file

@ -1,5 +1,5 @@
import * as vscode from 'vscode'; import * as vscode from 'vscode';
import * as codemp from '../index'; // TODO why won't it work with a custom name??? import * as codemp from '@codemp/codemp'; // TODO why won't it work with a custom name???
import * as mapping from "./mapping"; import * as mapping from "./mapping";
import { LOGGER } from './extension'; import { LOGGER } from './extension';
@ -7,26 +7,16 @@ import { LOGGER } from './extension';
let CACHE = new codemp.OpCache(); let CACHE = new codemp.OpCache();
let MAPPINGS = new mapping.BufferMappingContainer(); let MAPPINGS = new mapping.BufferMappingContainer();
let smallNumberDecorationType = vscode.window.createTextEditorDecorationType({}); let smallNumberDecorationType = vscode.window.createTextEditorDecorationType({});
let client : codemp.JsCodempClient | null = null; let client : codemp.Client | null = null;
let workspace : codemp.JsWorkspace | null = null; let workspace : codemp.Workspace | null = null;
let username : string;
export async function connect() {
/*let host = await vscode.window.showInputBox({prompt: "server host (default to http://codemp.alemi.dev:50053)"});
if(host===null) host="http://codemp.alemi.dev:50053";
client = await codemp.connect(host);
vscode.window.showInformationMessage(`Connected to codemp @[${host}]`);*/
client = await codemp.connect();
vscode.window.showInformationMessage('Connected to codemp with default host');
}
export async function login(){ export async function connect(){
let username = await vscode.window.showInputBox({prompt: "enter username"}); let username = await vscode.window.showInputBox({prompt: "enter username"});
let workspace_name = await vscode.window.showInputBox({prompt: "enter workspace name"}); if(username===null) throw "choose an username";
if(client===null) throw "connect first"; client = await codemp.connect("http://codemp.alemi.dev:50053", username!, "lmaodefaultpassword");
if(workspace_name===null) workspace_name="asd";
await client.login(username!,"lmaodefaultpassword",workspace_name);
vscode.window.showInformationMessage("Logged with username " + username + " into workspace " + workspace_name);
} }
@ -38,11 +28,11 @@ export async function join() {
if(client===null) throw "connect first"; if(client===null) throw "connect first";
workspace = await client.joinWorkspace(workspace_id) workspace = await client.join_workspace(workspace_id)
let controller = workspace.cursor(); let controller = workspace.cursor();
controller.callback((event: codemp.JsCursorEvent) => { controller.callback((event: codemp.Cursor) => {
let range_start : vscode.Position = new vscode.Position(event.start.row , event.start.col); // -1? let range_start : vscode.Position = new vscode.Position(event.startRow , event.startCol); // -1?
let range_end : vscode.Position = new vscode.Position(event.end.row, event.end.col); // -1? idk if this works it's kinda funny, should test with someone with a working version of codemp let range_end : vscode.Position = new vscode.Position(event.endRow, event.endCol); // -1? idk if this works it's kinda funny, should test with someone with a working version of codemp
const decorationRange = new vscode.Range(range_start, range_end); const decorationRange = new vscode.Range(range_start, range_end);
smallNumberDecorationType.dispose(); smallNumberDecorationType.dispose();
smallNumberDecorationType = vscode.window.createTextEditorDecorationType({ smallNumberDecorationType = vscode.window.createTextEditorDecorationType({
@ -74,7 +64,15 @@ export async function join() {
let position : [number, number] = [selection.active.line, selection.active.character+1]; let position : [number, number] = [selection.active.line, selection.active.character+1];
let n = MAPPINGS.get_by_editor(buf) let n = MAPPINGS.get_by_editor(buf)
if (n===null) return; if (n===null) return;
controller.send(n.buffer.getName(),anchor,position); let cursor : codemp.Cursor = {
startRow: selection.anchor.line,
startCol: selection.anchor.character,
endRow: selection.active.line,
endCol: selection.active.character+1,
buffer: n.buffer.get_name(),
user: username
}
controller.send(cursor);
}); });
console.log("workspace id \n"); console.log("workspace id \n");
console.log(workspace.id()); console.log(workspace.id());
@ -96,7 +94,7 @@ export async function createBuffer() {
export async function attach() { export async function attach() {
let buffer_name : any = (await vscode.window.showInputBox({prompt: "buffer to attach to"}))!; let buffer_name : any = (await vscode.window.showInputBox({prompt: "buffer to attach to"}))!;
if(workspace===null) throw "join a workspace first" if(workspace===null) throw "join a workspace first"
let buffer : codemp.JsBufferController = await workspace.attach(buffer_name); let buffer : codemp.BufferController = await workspace.attach(buffer_name);
console.log("attached to buffer", buffer_name); console.log("attached to buffer", buffer_name);
console.log("buffer", buffer); console.log("buffer", buffer);
let editor = vscode.window.activeTextEditor; let editor = vscode.window.activeTextEditor;
@ -128,23 +126,21 @@ export async function attach() {
if (CACHE.get(buffer_name, change.rangeOffset, change.text, change.rangeOffset + change.rangeLength)) continue; if (CACHE.get(buffer_name, change.rangeOffset, change.text, change.rangeOffset + change.rangeLength)) continue;
LOGGER.info(`onDidChangeTextDocument(event: [${change.rangeOffset}, ${change.text}, ${change.rangeOffset + change.rangeLength}])`); LOGGER.info(`onDidChangeTextDocument(event: [${change.rangeOffset}, ${change.text}, ${change.rangeOffset + change.rangeLength}])`);
buffer.send({ buffer.send({
span: {
start: change.rangeOffset, start: change.rangeOffset,
end: change.rangeOffset+change.rangeLength end: change.rangeOffset+change.rangeLength,
}, content: change.text
content: change.text
}); });
} }
}); });
buffer.callback((event: codemp.JsTextChange) => { buffer.callback((event: codemp.TextChange) => {
LOGGER.info(`buffer.callback(event: [${event.span.start}, ${event.content}, ${event.span.end}])`) LOGGER.info(`buffer.callback(event: [${event.start}, ${event.content}, ${event.end}])`)
CACHE.put(buffer_name, event.span.start, event.content, event.span.end); CACHE.put(buffer_name, event.start, event.content, event.end);
if (editor === undefined) { throw "Open an editor first" } if (editor === undefined) { throw "Open an editor first" }
let range = new vscode.Range( let range = new vscode.Range(
editor.document.positionAt(event.span.start), editor.document.positionAt(event.start),
editor.document.positionAt(event.span.end) editor.document.positionAt(event.end)
) )
editor.edit(editBuilder => { editor.edit(editBuilder => {
editBuilder editBuilder
@ -165,17 +161,17 @@ export async function sync() {
if (editor === undefined) throw "no active editor to sync"; if (editor === undefined) throw "no active editor to sync";
let k = MAPPINGS.get_by_editor(editor.document.uri); let k = MAPPINGS.get_by_editor(editor.document.uri);
if(k === null) throw "No such buffer managed by codemp" if(k === null) throw "No such buffer managed by codemp"
let buffer = workspace.bufferByName(k.buffer.getName()); let buffer = workspace.buffer_by_name(k.buffer.get_name());
if (buffer==null) throw "This buffer does not exist anymore"; if (buffer==null) throw "This buffer does not exist anymore";
let content = buffer.content(); let content = await buffer.content();
let doc_len = editor.document.getText().length; let doc_len = editor.document.getText().length;
let range = new vscode.Range( let range = new vscode.Range(
editor.document.positionAt(0), editor.document.positionAt(0),
editor.document.positionAt(doc_len) editor.document.positionAt(doc_len)
); );
CACHE.put(k.buffer.getName(), 0, content, doc_len); CACHE.put(k.buffer.get_name(), 0, content, doc_len);
editor.edit(editBuilder => editBuilder.replace(range, content)); editor.edit(editBuilder => editBuilder.replace(range, content));
} }

View file

@ -1,5 +1,5 @@
import * as vscode from 'vscode'; import * as vscode from 'vscode';
import * as codemp from '../index'; // TODO why won't it work with a custom name??? import * as codemp from '@codemp/codemp'; // TODO why won't it work with a custom name???
import * as codemplogic from './codemp'; import * as codemplogic from './codemp';
export let LOGGER = vscode.window.createOutputChannel("codemp", {log: true}); export let LOGGER = vscode.window.createOutputChannel("codemp", {log: true});
@ -15,7 +15,6 @@ export function activate(context: vscode.ExtensionContext) {
// register commands: the commandId parameter must match the command field in package.json // register commands: the commandId parameter must match the command field in package.json
for (let cmd of [ for (let cmd of [
vscode.commands.registerCommand('codempvscode.connect', codemplogic.connect), vscode.commands.registerCommand('codempvscode.connect', codemplogic.connect),
vscode.commands.registerCommand('codempvscode.login', codemplogic.login),
vscode.commands.registerCommand('codempvscode.join', codemplogic.join), vscode.commands.registerCommand('codempvscode.join', codemplogic.join),
vscode.commands.registerCommand('codempvscode.attach', codemplogic.attach), vscode.commands.registerCommand('codempvscode.attach', codemplogic.attach),
vscode.commands.registerCommand('codempvscode.createBuffer', codemplogic.createBuffer), vscode.commands.registerCommand('codempvscode.createBuffer', codemplogic.createBuffer),

View file

@ -1,11 +1,11 @@
import * as vscode from 'vscode'; import * as vscode from 'vscode';
import * as codemp from '../index'; // TODO why won't it work with a custom name??? import * as codemp from '@codemp/codemp'; // TODO why won't it work with a custom name???
export class BufferMapping { export class BufferMapping {
buffer: codemp.JsBufferController; buffer: codemp.BufferController;
editor: vscode.TextEditor; editor: vscode.TextEditor;
constructor(codemp_buffer: codemp.JsBufferController, editor: vscode.TextEditor) { constructor(codemp_buffer: codemp.BufferController, editor: vscode.TextEditor) {
this.buffer = codemp_buffer; this.buffer = codemp_buffer;
this.editor = editor; this.editor = editor;
} }
@ -32,7 +32,7 @@ export class BufferMappingContainer {
get_by_buffer(path: string) : BufferMapping | null { get_by_buffer(path: string) : BufferMapping | null {
for (let mapping of this.store) { for (let mapping of this.store) {
if (mapping.buffer.getName() === path) if (mapping.buffer.get_name() === path)
return mapping; return mapping;
} }
return null; return null;