Skip to content

Commit 413a59d

Browse files
authored
feat: python, java autocomplete and gzip (#6)
* feat: python autocomplete * fix: dockerfile for pyslp * feat: gzip compression * fix: pylsp command * feat: java autocomplete * fix: prod build image * refactor: repeated code
1 parent 408c6ce commit 413a59d

File tree

9 files changed

+94
-26
lines changed

9 files changed

+94
-26
lines changed

Diff for: Dockerfile

+16-8
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,5 @@
1-
## Base
2-
FROM golang:1.18-alpine AS base
3-
4-
RUN apk add --no-cache build-base ccls py3-lsp-server
5-
61
## Build
7-
FROM base AS build
2+
FROM golang:1.18-alpine AS build
83

94
WORKDIR /app
105

@@ -18,6 +13,12 @@ RUN go build -o server
1813
## Dev
1914
FROM build AS dev
2015

16+
RUN apk add --no-cache build-base ccls py3-lsp-server curl openjdk17
17+
18+
WORKDIR /jdt
19+
RUN curl https://download.eclipse.org/jdtls/milestones/1.9.0/jdt-language-server-1.9.0-202203031534.tar.gz --output jdt.tar.gz
20+
RUN tar -xvf ./jdt.tar.gz
21+
2122
WORKDIR /app
2223

2324
RUN apk add --no-cache make
@@ -29,11 +30,18 @@ CMD ["make watch"]
2930

3031

3132
## Prod
32-
FROM base AS prod
33+
FROM alpine:latest AS prod
34+
35+
RUN apk add --no-cache build-base ccls py3-lsp-server curl openjdk17
36+
37+
WORKDIR /jdt
38+
RUN curl https://download.eclipse.org/jdtls/milestones/1.9.0/jdt-language-server-1.9.0-202203031534.tar.gz --output jdt.tar.gz
39+
RUN tar -xvf ./jdt.tar.gz
3340

3441
WORKDIR /
3542

36-
COPY --from=build /app/server /app/entry.sh /app/.env /
43+
COPY --from=build /app/server /app/entry.sh /app/.env ./
44+
COPY --from=build /app/player_code ./player_code/
3745

3846
ENTRYPOINT ["/entry.sh"]
3947
CMD ["./server"]

Diff for: controllers/jsonrpc.go

+9
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ func StreamReader(ws *models.WebsocketConnection) {
2121
var contentLengthHeader string
2222
contentLengthHeader = string(contentLengthLine)
2323
if err != nil {
24+
// If the process has exited, we should stop reading and exit the go routine
2425
if err.Error() == "EOF" {
2526
return
2627
}
@@ -31,9 +32,17 @@ func StreamReader(ws *models.WebsocketConnection) {
3132
contentLengthHeader = strings.TrimPrefix(contentLengthHeader, prefix)
3233
contentLengthHeader = strings.TrimSuffix(contentLengthHeader, suffix)
3334
contentLength, err := strconv.Atoi(contentLengthHeader)
35+
if ws.Language == models.Python {
36+
// pyls sends an extra Content-Type header after the Content-Length header
37+
_, err = reader.ReadBytes('\n')
38+
if err != nil {
39+
continue
40+
}
41+
}
3442
if err != nil {
3543
continue
3644
}
45+
// Reading redundant newline after headers
3746
_, err = reader.ReadBytes('\n')
3847
if err != nil {
3948
continue

Diff for: docker-compose.yml

+1
Original file line numberDiff line numberDiff line change
@@ -12,3 +12,4 @@ services:
1212
volumes:
1313
- .:/app
1414
- ./workspaces:/app/workspaces
15+
- ./workspaces:/workspaces

Diff for: main.go

+1
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ func main() {
1818
AllowOrigins: []string{config.FrontendURL},
1919
AllowHeaders: []string{echo.HeaderOrigin, echo.HeaderContentType, echo.HeaderAccept},
2020
}))
21+
server.Use(middleware.Gzip())
2122
router.InitRoutes(server)
2223

2324
server.Logger.Fatal(server.Start(":" + config.ServerPort))

Diff for: servers/ccls.go

+1-13
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@ package servers
33
import (
44
"fmt"
55
"io/ioutil"
6-
"os"
76
"os/exec"
87

98
"github.com/delta/codecharacter-lsp-2023/models"
@@ -29,18 +28,7 @@ func createCppServer(ws *models.WebsocketConnection) error {
2928
"onSave":1500
3029
}
3130
}`)
32-
ws.LSPServer.Stdin, err = ws.LSPServer.Process.StdinPipe()
33-
if err != nil {
34-
return err
35-
}
36-
ws.LSPServer.Stdout, err = ws.LSPServer.Process.StdoutPipe()
37-
if err != nil {
38-
return err
39-
}
40-
devnull, _ := os.OpenFile(os.DevNull, os.O_WRONLY, 0755)
41-
ws.LSPServer.Process.Stderr = devnull
42-
ws.LSPServer.DevNullFd = devnull
43-
return ws.LSPServer.Process.Start()
31+
return createPipes(ws)
4432
}
4533

4634
func createCompileCommands(ws *models.WebsocketConnection) string {

Diff for: servers/jdt.go

+28
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
package servers
2+
3+
import (
4+
"os/exec"
5+
"path/filepath"
6+
7+
"github.com/delta/codecharacter-lsp-2023/models"
8+
)
9+
10+
func createJavaServer(ws *models.WebsocketConnection) error {
11+
workspaceDir, _ := filepath.Abs(ws.WorkspacePath)
12+
ws.LSPServer.Process = exec.Command("java",
13+
"-Declipse.application=org.eclipse.jdt.ls.core.id1",
14+
"-Dosgi.bundles.defaultStartLevel=4",
15+
"-Dosgi.bundles.defaultStartLevel=4",
16+
"-Declipse.product=org.eclipse.jdt.ls.core.product",
17+
"-Dlog.level=ERROR",
18+
"-noverify",
19+
"-Xmx100M",
20+
"-jar",
21+
"/jdt/plugins/org.eclipse.equinox.launcher_1.6.400.v20210924-0641.jar",
22+
"-configuration",
23+
"/jdt/config_linux",
24+
"-data",
25+
workspaceDir,
26+
)
27+
return createPipes(ws)
28+
}

Diff for: servers/pylsp.go

+12
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
package servers
2+
3+
import (
4+
"os/exec"
5+
6+
"github.com/delta/codecharacter-lsp-2023/models"
7+
)
8+
9+
func createPythonServer(ws *models.WebsocketConnection) error {
10+
ws.LSPServer.Process = exec.Command("pylsp")
11+
return createPipes(ws)
12+
}

Diff for: servers/servers.go

+22-4
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,35 @@
11
package servers
22

33
import (
4+
"os"
5+
46
"github.com/delta/codecharacter-lsp-2023/models"
57
)
68

79
func CreateLSPServer(ws *models.WebsocketConnection) error {
810
switch ws.Language {
911
case models.Cpp:
1012
return createCppServer(ws)
11-
// case models.Python:
12-
// return createPythonServer(ws)
13-
// case models.Java:
14-
// return createPythonServer(ws)
13+
case models.Python:
14+
return createPythonServer(ws)
15+
case models.Java:
16+
return createJavaServer(ws)
1517
}
1618
return nil
1719
}
20+
21+
func createPipes(ws *models.WebsocketConnection) error {
22+
var err error
23+
ws.LSPServer.Stdin, err = ws.LSPServer.Process.StdinPipe()
24+
if err != nil {
25+
return err
26+
}
27+
ws.LSPServer.Stdout, err = ws.LSPServer.Process.StdoutPipe()
28+
if err != nil {
29+
return err
30+
}
31+
devnull, _ := os.OpenFile(os.DevNull, os.O_WRONLY, 0755)
32+
ws.LSPServer.Process.Stderr = devnull
33+
ws.LSPServer.DevNullFd = devnull
34+
return ws.LSPServer.Process.Start()
35+
}

Diff for: utils/websocket.go

+4-1
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,9 @@ import (
1414
"github.com/labstack/echo/v4"
1515
)
1616

17-
var upgrader = websocket.Upgrader{}
17+
var upgrader = websocket.Upgrader{
18+
EnableCompression: true,
19+
}
1820

1921
func CheckOrigin(r *http.Request) bool {
2022
origin := r.Header.Get("Origin")
@@ -39,6 +41,7 @@ func InitWebsocket(c echo.Context) error {
3941
c.Echo().Logger.Info("WS Connection Created with ID : ", ws.ID, " and Language : ", language)
4042
upgrader.CheckOrigin = CheckOrigin
4143
wsConn, err := upgrader.Upgrade(c.Response(), c.Request(), nil)
44+
wsConn.EnableWriteCompression(true)
4245
if err != nil {
4346
return c.String(http.StatusBadRequest, "Error Upgrading to Websocket Connection")
4447
}

0 commit comments

Comments
 (0)