Skip to content

Commit dedcd58

Browse files
重构 async
1 parent d6440eb commit dedcd58

File tree

6 files changed

+73
-55
lines changed

6 files changed

+73
-55
lines changed

examples/js_ws/index.js

Lines changed: 20 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,21 @@
1-
let ws = websocket();
2-
let shouldExit = false;
3-
while (!shouldExit) {
4-
let data = ws.readText();
5-
switch (data) {
6-
case "exit":
7-
shouldExit = true;
8-
break;
9-
case "panic":
10-
throw Error("错误");
11-
case "date":
12-
ws.writeText(new Date().toJSON())
13-
break
14-
default:
15-
ws.writeText("收到信息:" + data)
16-
break;
1+
async function run() {
2+
let ws = websocket();
3+
let shouldExit = false;
4+
while (!shouldExit) {
5+
let data = await ws.readText();
6+
switch (data) {
7+
case "exit":
8+
shouldExit = true;
9+
break;
10+
case "panic":
11+
throw Error("错误");
12+
case "date":
13+
ws.writeText(new Date().toJSON())
14+
break
15+
default:
16+
ws.writeText("收到信息:" + data)
17+
break;
18+
}
1719
}
18-
}
20+
}
21+
run().then(r => {});

examples/js_ws_event/.pages.yaml

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,4 @@
11
routes:
2-
- path: "sender"
3-
js:
4-
exec: "sender.js"
52
- path: "event"
63
js:
74
exec: "event.js"

examples/js_ws_event/event.js

Lines changed: 24 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,28 @@
1-
let name=request.getQuery("name")
2-
if (name===""){
3-
throw Error(`Missing name "${name}"`)
1+
const name = (await request.getQuery("name"))?.trim();
2+
3+
if (!name) {
4+
throw new Error(`Missing or empty name parameter`);
45
}
5-
let ws = websocket();
6-
event.subscribe("messages").on(function (msg){
7-
ws.writeText(msg)
8-
})
9-
let shouldExit = false;
10-
while (!shouldExit) {
11-
let data = ws.readText();
12-
switch (data) {
13-
case "exit":
14-
shouldExit = true;
15-
break;
16-
default:
17-
event.put("messages",JSON.stringify({
18-
name:name,
19-
data:data
6+
7+
const ws = websocket();
8+
9+
try {
10+
// 事件处理
11+
event.subscribe("messages").on((msg) => {
12+
ws.writeText(msg);
13+
});
14+
15+
// 主循环
16+
for await (const data of ws.readText()) {
17+
if (data === "exit") break;
18+
19+
if (data?.trim()) {
20+
await event.put("messages", JSON.stringify({
21+
name,
22+
data: data.trim()
2023
}));
21-
break;
24+
}
2225
}
26+
} finally {
27+
ws.close();
2328
}

examples/js_ws_event/sender.js

Lines changed: 0 additions & 8 deletions
This file was deleted.

pkg/filters/goja/goja.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,7 @@ func FilterInstGoJa(gl core.Params) (core.FilterInstance, error) {
8989
}
9090
if global.EnableWebsocket {
9191
var closer io.Closer
92-
closer, err = WebsocketInject(ctx, vm, debug, request, timeoutCancelFunc)
92+
closer, err = WebsocketInject(ctx, vm, debug, request, loop, timeoutCancelFunc)
9393
if err != nil {
9494
panic(err)
9595
}

pkg/filters/goja/var_websocket.go

Lines changed: 28 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -7,13 +7,14 @@ import (
77
"time"
88

99
"github.com/dop251/goja"
10+
"github.com/dop251/goja_nodejs/eventloop"
1011
"github.com/gorilla/websocket"
1112
"github.com/pkg/errors"
1213
"go.uber.org/zap"
1314
"gopkg.d7z.net/gitea-pages/pkg/core"
1415
)
1516

16-
func WebsocketInject(ctx core.FilterContext, jsCtx *goja.Runtime, w http.ResponseWriter, request *http.Request, cancelFunc context.CancelFunc) (io.Closer, error) {
17+
func WebsocketInject(ctx core.FilterContext, jsCtx *goja.Runtime, w http.ResponseWriter, request *http.Request, loop *eventloop.EventLoop, cancelFunc context.CancelFunc) (io.Closer, error) {
1718
closers := NewClosers()
1819
return closers, jsCtx.GlobalObject().Set("websocket", func() (any, error) {
1920
upgrader := websocket.Upgrader{}
@@ -62,12 +63,32 @@ func WebsocketInject(ctx core.FilterContext, jsCtx *goja.Runtime, w http.Respons
6263
},
6364
"TypeTextMessage": websocket.TextMessage,
6465
"TypeBinaryMessage": websocket.BinaryMessage,
65-
"readText": func() (string, error) {
66-
_, p, err := conn.ReadMessage()
67-
if err != nil {
68-
return "", err
69-
}
70-
return string(p), nil
66+
"readText": func() goja.Value {
67+
promise, resolve, reject := jsCtx.NewPromise()
68+
go func() {
69+
select {
70+
case <-ctx.Done():
71+
return
72+
default:
73+
}
74+
defer func() {
75+
if r := recover(); r != nil {
76+
zap.L().Debug("websocket panic", zap.Any("panic", r))
77+
loop.Run(func(runtime *goja.Runtime) {
78+
_ = reject(runtime.ToValue(r))
79+
})
80+
}
81+
}()
82+
_, p, err := conn.ReadMessage()
83+
loop.Run(func(runtime *goja.Runtime) {
84+
if err != nil {
85+
_ = reject(runtime.ToValue(err))
86+
} else {
87+
_ = resolve(runtime.ToValue(string(p)))
88+
}
89+
})
90+
}()
91+
return promise.Result()
7192
},
7293
"read": func() (any, error) {
7394
messageType, p, err := conn.ReadMessage()

0 commit comments

Comments
 (0)