mirror of
https://github.com/tinode/chat.git
synced 2026-06-06 20:18:25 +00:00
99 lines
2.1 KiB
Go
99 lines
2.1 KiB
Go
// Package stdout is a sample implementation of a push plugin.
|
|
// If enabled, it writes every notification to stdout.
|
|
package stdout
|
|
|
|
import (
|
|
"encoding/json"
|
|
"errors"
|
|
"fmt"
|
|
"os"
|
|
|
|
"github.com/tinode/chat/server/push"
|
|
)
|
|
|
|
var handler stdoutPush
|
|
|
|
// How much to buffer the input channel.
|
|
const defaultBuffer = 32
|
|
|
|
type stdoutPush struct {
|
|
initialized bool
|
|
input chan *push.Receipt
|
|
channel chan *push.ChannelReq
|
|
stop chan bool
|
|
}
|
|
|
|
type configType struct {
|
|
Enabled bool `json:"enabled"`
|
|
Buffer int `json:"buffer"`
|
|
}
|
|
|
|
// Init initializes the handler
|
|
func (stdoutPush) Init(jsonconf json.RawMessage) (bool, error) {
|
|
|
|
// Check if the handler is already initialized
|
|
if handler.initialized {
|
|
return false, errors.New("already initialized")
|
|
}
|
|
|
|
var config configType
|
|
if err := json.Unmarshal([]byte(jsonconf), &config); err != nil {
|
|
return false, errors.New("failed to parse config: " + err.Error())
|
|
}
|
|
|
|
handler.initialized = true
|
|
|
|
if !config.Enabled {
|
|
return false, nil
|
|
}
|
|
|
|
if config.Buffer <= 0 {
|
|
config.Buffer = defaultBuffer
|
|
}
|
|
|
|
handler.input = make(chan *push.Receipt, config.Buffer)
|
|
handler.channel = make(chan *push.ChannelReq, config.Buffer)
|
|
handler.stop = make(chan bool, 1)
|
|
|
|
go func() {
|
|
for {
|
|
select {
|
|
case msg := <-handler.input:
|
|
fmt.Fprintln(os.Stdout, msg)
|
|
case msg := <-handler.channel:
|
|
fmt.Fprintln(os.Stdout, msg)
|
|
case <-handler.stop:
|
|
return
|
|
}
|
|
}
|
|
}()
|
|
|
|
return true, nil
|
|
}
|
|
|
|
// IsReady checks if the handler is initialized.
|
|
func (stdoutPush) IsReady() bool {
|
|
return handler.input != nil
|
|
}
|
|
|
|
// Push returns a channel that the server will use to send messages to.
|
|
// If the adapter blocks, the message will be dropped.
|
|
func (stdoutPush) Push() chan<- *push.Receipt {
|
|
return handler.input
|
|
}
|
|
|
|
// Channel returns a channel that caller can use to subscribe/unsubscribe devices to channels (FCM topics).
|
|
// If the adapter blocks, the message will be dropped.
|
|
func (stdoutPush) Channel() chan<- *push.ChannelReq {
|
|
return handler.channel
|
|
}
|
|
|
|
// Stop terminates the handler's worker and stops sending pushes.
|
|
func (stdoutPush) Stop() {
|
|
handler.stop <- true
|
|
}
|
|
|
|
func init() {
|
|
push.Register("stdout", &handler)
|
|
}
|