good morning!!!!

Skip to content
Snippets Groups Projects
main.go 1.67 KiB
Newer Older
a's avatar
a committed
package main

import (
	"context"
	"log"
	"net/http"
	"time"

a's avatar
a committed
	"gfx.cafe/open/jrpc/contrib/codecs"
	"gfx.cafe/open/jrpc/contrib/extension/subscription"
	"gfx.cafe/open/jrpc/contrib/jmux"
	"gfx.cafe/open/jrpc/contrib/middleware"
a's avatar
a committed
	"gfx.cafe/open/jrpc/pkg/jsonrpc"
a's avatar
a committed
	"gfx.cafe/open/jrpc/pkg/server"

a's avatar
a committed
	"gfx.cafe/open/jrpc"
)

func main() {
a's avatar
a committed
	engine := subscription.NewEngine()
	r := jmux.NewRouter()
a's avatar
a committed
	r.Use(middleware.Logger)
a's avatar
a committed
	srv := server.NewServer(r)
a's avatar
a committed
	r.HandleFunc("echo", func(w jsonrpc.ResponseWriter, r *jsonrpc.Request) {
a's avatar
a committed
		w.Send(r.Params, nil)
a's avatar
a committed
	})
a's avatar
a committed
	r.Group(func(r jmux.Router) {
		r.Use(engine.Middleware())
a's avatar
a committed
		r.HandleFunc("testservice/subscribe", func(w jsonrpc.ResponseWriter, r *jsonrpc.Request) {
a's avatar
a committed
			notifier, ok := subscription.NotifierFromContext(r.Context())
			if !ok {
				w.Send(nil, subscription.ErrNotificationsUnsupported)
				return
a's avatar
a committed
			}
a's avatar
ok  
a committed
			idx := 0
			for {
				select {
				case <-r.Context().Done():
					return
				case <-notifier.Err():
					return
				default:
a's avatar
a committed
				}
a's avatar
ok  
a committed
				notifier.Notify(idx)
				time.Sleep(1 * time.Second)
				idx = idx + 1
			}
a's avatar
a committed
		})
a's avatar
a committed
	})
	go func() {
		err := client()
		if err != nil {
			panic(err)
		}
	}()
	log.Println("running on 8855")
a's avatar
a committed

	handler := codecs.HttpWebsocketHandler(srv, []string{"*"})
	err := http.ListenAndServe(":8855", handler)
	if err != nil {
		log.Println(err)
	}
a's avatar
a committed
}

func client() error {
a's avatar
a committed
	cl, err := subscription.UpgradeConn(jrpc.Dial("ws://localhost:8855"))
a's avatar
a committed
	if err != nil {
		return err
	}
	out := make(chan int, 1)
a's avatar
a committed
	jcs, err := cl.Subscribe(context.TODO(), "testservice", out, []any{"swag"})
a's avatar
a committed
	if err != nil {
		return err
	}
	go func() {
		log.Println(<-jcs.Err())
	}()
	defer jcs.Unsubscribe()
	for {
a's avatar
a committed
		//log.Println("receiving", <-out)
a's avatar
a committed
	}
}