Do you mind looking into Fiber adaptor for net/http interface to make this library work with fiber applications?
Closed this issue · 6 comments
here's the link: https://docs.gofiber.io/api/middleware/adaptor/
`go
package main
import (
"fmt"
"os"
"github.com/danielAsaboro/controllers"
"github.com/gofiber/fiber/v2"
"github.com/gofiber/fiber/v2/middleware/adaptor"
"github.com/gofiber/fiber/v2/middleware/cors"
"github.com/zishang520/engine.io/types"
"github.com/zishang520/socket.io/socket"
)
type Message struct {
Name string json:"name"
Message string json:"message"
}
func main() {
app := fiber.New()
var opts *socket.ServerOptions = socket.DefaultServerOptions()
var _ = &socket.ServerOptions{
// cors: {
// origin: "http://localhost:8100",
// methods: ["GET", "POST"],
// credentials: true
// },
// transports: ['websocket', 'polling'],
// allowEIO3: true
}
_ = &types.Cors{
Origin: "*",
Methods: []string{"GET", "POST"},
Credentials: false,
}
// opts.SetCors(corsOptions)
app.Use(cors.New())
fmt.Print("printing addresses")
fmt.Println(opts)
io := socket.NewServer(nil, opts)
// io.of
// http.
app.Use("/socket.io/", adaptor.HTTPHandler(io.ServeHandler(opts)))
// http.Handle("/socket.io/", io.ServeHandler(nil))
// go http.ListenAndServe(":3000", nil)
io.On("connection", func(clients ...any) {
client := clients[0].(*socket.Socket)
client.On("event", func(datas ...any) {
})
client.On("disconnect", func(...any) {
})
})
app.Get("/", controllers.HomeRouteHandler)
app.Listen(":" + os.Getenv("PORT"))
`
printing opts gave me nil all through...
&{{ 0xc0001703f0 } { } }
This is part of the plan and will be a refactored branch.
that would be much appreciated @zishang520 as this would allow me serve both rest and websocket on the same port
is there any way to help? would love to document as I can tell your schedule doesn't accommodate it
Thank you for your support. I will try to prioritize the implementation of this plan in the near future. After all, the plan has been on hold for some time. I am really sorry.
Sorry, due to technical issues, I cannot solve this problem: valyala/fasthttp#965. Currently, this requirement will be updated after fasthttp has a next step plan.
Currently, the submitted engine.io-server-go-fasthttp project and socket.io-server-go-fasthttp project cannot be used normally
New progress: Currently it can only be implemented based on the Websocket transport
interface, and the Polling transport
interface will be abandoned.
New research finds that it is now available, However, I also made a fasthttp related adaptation, but it only supports websocket: socket.io-server-go-fasthttp
Fasthttp has been updated not long ago (valyala/fasthttp@9c12719), and it was found to work properly in the test case:
package main
import (
"os"
"os/signal"
"syscall"
"time"
"github.com/gofiber/fiber/v2"
"github.com/gofiber/fiber/v2/middleware/adaptor"
"github.com/zishang520/engine.io/v2/log"
"github.com/zishang520/engine.io/v2/types"
"github.com/zishang520/socket.io/v2/socket"
)
func main() {
log.DEBUG = true
c := socket.DefaultServerOptions()
c.SetServeClient(true)
// c.SetConnectionStateRecovery(&socket.ConnectionStateRecovery{})
// c.SetAllowEIO3(true)
c.SetPingInterval(300 * time.Millisecond)
c.SetPingTimeout(200 * time.Millisecond)
c.SetMaxHttpBufferSize(1000000)
c.SetConnectTimeout(1000 * time.Millisecond)
c.SetCors(&types.Cors{
Origin: "*",
Credentials: true,
})
socketio := socket.NewServer(nil, nil)
socketio.On("connection", func(clients ...interface{}) {
client := clients[0].(*socket.Socket)
client.On("message", func(args ...interface{}) {
client.Emit("message-back", args...)
})
client.Emit("auth", client.Handshake().Auth)
client.On("message-with-ack", func(args ...interface{}) {
ack := args[len(args)-1].(func([]any, error))
ack(args[:len(args)-1], nil)
})
})
socketio.Of("/custom", nil).On("connection", func(clients ...interface{}) {
client := clients[0].(*socket.Socket)
client.Emit("auth", client.Handshake().Auth)
})
app := fiber.New()
// app.Put("/socket.io", adaptor.HTTPHandler(socketio.ServeHandler(c))) // test
app.Get("/socket.io", adaptor.HTTPHandler(socketio.ServeHandler(c)))
app.Post("/socket.io", adaptor.HTTPHandler(socketio.ServeHandler(c)))
go app.Listen(":3000")
exit := make(chan struct{})
SignalC := make(chan os.Signal)
signal.Notify(SignalC, syscall.SIGHUP, syscall.SIGINT, syscall.SIGTERM, syscall.SIGQUIT)
go func() {
for s := range SignalC {
switch s {
case syscall.SIGHUP, syscall.SIGINT, syscall.SIGTERM, syscall.SIGQUIT:
close(exit)
return
}
}
}()
<-exit
socketio.Close(nil)
os.Exit(0)
}