dt_automate/vendor/github.com/playwright-community/playwright-go/jsonPipe.go
2025-02-19 18:30:19 +08:00

65 lines
1.3 KiB
Go

package playwright
import (
"encoding/json"
"errors"
"fmt"
)
type jsonPipe struct {
channelOwner
msgChan chan *message
}
func (j *jsonPipe) Send(message map[string]interface{}) error {
_, err := j.channel.Send("send", map[string]interface{}{
"message": message,
})
return err
}
func (j *jsonPipe) Close() error {
_, err := j.channel.Send("close")
return err
}
func (j *jsonPipe) Poll() (*message, error) {
msg := <-j.msgChan
if msg == nil {
return nil, errors.New("jsonPipe closed")
}
return msg, nil
}
func newJsonPipe(parent *channelOwner, objectType string, guid string, initializer map[string]interface{}) *jsonPipe {
j := &jsonPipe{
msgChan: make(chan *message, 2),
}
j.createChannelOwner(j, parent, objectType, guid, initializer)
j.channel.On("message", func(ev map[string]interface{}) {
var msg message
m, err := json.Marshal(ev["message"])
if err == nil {
err = json.Unmarshal(m, &msg)
}
if err != nil {
msg = message{
Error: &struct {
Error Error "json:\"error\""
}{
Error: Error{
Name: "Error",
Message: fmt.Sprintf("jsonPipe: could not decode message: %s", err.Error()),
},
},
}
}
j.msgChan <- &msg
})
j.channel.Once("closed", func() {
j.Emit("closed")
close(j.msgChan)
})
return j
}