Newer
Older
package jrpc
import (
"context"
"encoding/json"
)
type HandlerFunc func(w ResponseWriter, r *Request)
type Handler interface {
ServeRPC(w ResponseWriter, r *Request)
}
}
func (fn HandlerFunc) ServeRPC(w ResponseWriter, r *Request) {
(fn)(w, r)
}
Edward Lee
committed
peer PeerInfo
func NewRequest(ctx context.Context, id string, method string, params any) *Request {
r := &Request{ctx: ctx}
Edward Lee
committed
Edward Lee
committed
func (r *Request) ParamSlice() []any {
var params []any
func (r *Request) ParamArray(a ...any) error {
var params []json.RawMessage
if err != nil {
return err
}
} else {
break
}
}
return nil
}
Edward Lee
committed
func (r *Request) Remote() string {
return r.peer.RemoteAddr
}
func (r *Request) Peer() PeerInfo {
return r.peer
}
func (r *Request) WithContext(ctx context.Context) *Request {
if ctx == nil {
panic("nil context")
}
r.ctx = ctx
r2 := new(Request)
*r2 = *r
r2.ctx = ctx
r2.msg = r.msg
return r2
}
Edward Lee
committed
func (r *Request) Msg() jsonrpcMessage {
return r.msg
}
type ResponseWriterMsg struct {
r *Request
msg *jsonrpcMessage
notifications chan *jsonrpcMessage
switch r.Peer().Transport {
case "http":
default:
rw.notifications = make(chan *jsonrpcMessage, 128)
}
return rw
}
func (w *ResponseWriterMsg) Send(args any, e error) (err error) {
cm := w.r.Msg()
if e != nil {
w.msg = cm.errorResponse(e)
return nil
}
w.msg = cm.response(args)
return nil
}
func (w *ResponseWriterMsg) Notify(args any) (err error) {
if w.notifications == nil {
return nil
}
cm := w.r.Msg()
nf := cm.response(args)
nf.ID = nil
w.notifications <- nf