重构 async

This commit is contained in:
ExplodingDragon
2025-11-20 12:42:05 +08:00
parent d6440ebb02
commit dedcd58f8e
6 changed files with 73 additions and 55 deletions

View File

@@ -1,7 +1,8 @@
let ws = websocket(); async function run() {
let shouldExit = false; let ws = websocket();
while (!shouldExit) { let shouldExit = false;
let data = ws.readText(); while (!shouldExit) {
let data = await ws.readText();
switch (data) { switch (data) {
case "exit": case "exit":
shouldExit = true; shouldExit = true;
@@ -15,4 +16,6 @@ while (!shouldExit) {
ws.writeText("收到信息:" + data) ws.writeText("收到信息:" + data)
break; break;
} }
}
} }
run().then(r => {});

View File

@@ -1,7 +1,4 @@
routes: routes:
- path: "sender"
js:
exec: "sender.js"
- path: "event" - path: "event"
js: js:
exec: "event.js" exec: "event.js"

View File

@@ -1,23 +1,28 @@
let name=request.getQuery("name") const name = (await request.getQuery("name"))?.trim();
if (name===""){
throw Error(`Missing name "${name}"`) if (!name) {
throw new Error(`Missing or empty name parameter`);
} }
let ws = websocket();
event.subscribe("messages").on(function (msg){ const ws = websocket();
ws.writeText(msg)
}) try {
let shouldExit = false; // 事件处理
while (!shouldExit) { event.subscribe("messages").on((msg) => {
let data = ws.readText(); ws.writeText(msg);
switch (data) { });
case "exit":
shouldExit = true; // 主循环
break; for await (const data of ws.readText()) {
default: if (data === "exit") break;
event.put("messages",JSON.stringify({
name:name, if (data?.trim()) {
data:data await event.put("messages", JSON.stringify({
name,
data: data.trim()
})); }));
break;
} }
}
} finally {
ws.close();
} }

View File

@@ -1,8 +0,0 @@
let name=request.getQuery("name")
let message=request.getQuery("data")
event.put("messages", JSON.stringify({
name:name,
data:message
}));
// response.write(event.subscribe("messages").get())

View File

@@ -89,7 +89,7 @@ func FilterInstGoJa(gl core.Params) (core.FilterInstance, error) {
} }
if global.EnableWebsocket { if global.EnableWebsocket {
var closer io.Closer var closer io.Closer
closer, err = WebsocketInject(ctx, vm, debug, request, timeoutCancelFunc) closer, err = WebsocketInject(ctx, vm, debug, request, loop, timeoutCancelFunc)
if err != nil { if err != nil {
panic(err) panic(err)
} }

View File

@@ -7,13 +7,14 @@ import (
"time" "time"
"github.com/dop251/goja" "github.com/dop251/goja"
"github.com/dop251/goja_nodejs/eventloop"
"github.com/gorilla/websocket" "github.com/gorilla/websocket"
"github.com/pkg/errors" "github.com/pkg/errors"
"go.uber.org/zap" "go.uber.org/zap"
"gopkg.d7z.net/gitea-pages/pkg/core" "gopkg.d7z.net/gitea-pages/pkg/core"
) )
func WebsocketInject(ctx core.FilterContext, jsCtx *goja.Runtime, w http.ResponseWriter, request *http.Request, cancelFunc context.CancelFunc) (io.Closer, error) { func WebsocketInject(ctx core.FilterContext, jsCtx *goja.Runtime, w http.ResponseWriter, request *http.Request, loop *eventloop.EventLoop, cancelFunc context.CancelFunc) (io.Closer, error) {
closers := NewClosers() closers := NewClosers()
return closers, jsCtx.GlobalObject().Set("websocket", func() (any, error) { return closers, jsCtx.GlobalObject().Set("websocket", func() (any, error) {
upgrader := websocket.Upgrader{} upgrader := websocket.Upgrader{}
@@ -62,12 +63,32 @@ func WebsocketInject(ctx core.FilterContext, jsCtx *goja.Runtime, w http.Respons
}, },
"TypeTextMessage": websocket.TextMessage, "TypeTextMessage": websocket.TextMessage,
"TypeBinaryMessage": websocket.BinaryMessage, "TypeBinaryMessage": websocket.BinaryMessage,
"readText": func() (string, error) { "readText": func() goja.Value {
_, p, err := conn.ReadMessage() promise, resolve, reject := jsCtx.NewPromise()
if err != nil { go func() {
return "", err select {
case <-ctx.Done():
return
default:
} }
return string(p), nil defer func() {
if r := recover(); r != nil {
zap.L().Debug("websocket panic", zap.Any("panic", r))
loop.Run(func(runtime *goja.Runtime) {
_ = reject(runtime.ToValue(r))
})
}
}()
_, p, err := conn.ReadMessage()
loop.Run(func(runtime *goja.Runtime) {
if err != nil {
_ = reject(runtime.ToValue(err))
} else {
_ = resolve(runtime.ToValue(string(p)))
}
})
}()
return promise.Result()
}, },
"read": func() (any, error) { "read": func() (any, error) {
messageType, p, err := conn.ReadMessage() messageType, p, err := conn.ReadMessage()