重构 async
This commit is contained in:
@@ -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 => {});
|
||||||
|
|||||||
@@ -1,7 +1,4 @@
|
|||||||
routes:
|
routes:
|
||||||
- path: "sender"
|
|
||||||
js:
|
|
||||||
exec: "sender.js"
|
|
||||||
- path: "event"
|
- path: "event"
|
||||||
js:
|
js:
|
||||||
exec: "event.js"
|
exec: "event.js"
|
||||||
@@ -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();
|
||||||
}
|
}
|
||||||
@@ -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())
|
|
||||||
@@ -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)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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()
|
||||||
|
|||||||
Reference in New Issue
Block a user