Fiber WebSocket کا مثال
فائبر کے Fasthttp WebSocket جز، *fiber.Ctx
ترکیب کا استعمال کیا جاتا ہے، مثلاً Locals، Params، Query، اور Cookies۔ یہاں فائبر میں ویب ساکٹ کا استعمال کا ایک مثال دی گئی ہے۔
نوٹ: گو ورژن 1.18 اور اس سے اوپر کی ضرورت ہے۔
انسٹالیشن
go get -u github.com/gofiber/fiber/v2
go get -u github.com/gofiber/contrib/websocket
فنکشن سگنیچر
func New(handler func(*websocket.Conn), config ...websocket.Config) fiber.Handler {
تشکیل
خصوصیت | قسم | تفصیل | پہلی قیمت |
---|---|---|---|
Filter | func(*fiber.Ctx) bool |
مِڈل ویئر کو چھوڑنے کے لئے فنکشن کا تعین کرتا ہے۔ | nil |
HandshakeTimeout | time.Duration |
HandshakeTimeout سب بنانے کے لیے وقت کے مدت کو محدود کرتا ہے۔ | 0 (کوئی ٹائم آؤٹ نہیں) |
Subprotocols | []string |
سبپروٹوکولز کلائنٹ کی درخواست شدہ سب پروٹوکولز کو معین کرتے ہیں۔ | nil |
Origins | []string |
Origin ہیڈر کے مطابقت سے اجازت دی گئی ابتدائیات۔ اگر خالی ہو، تو یہ کسی بھی ابتدائیات کو اجازت دیتا ہے۔ | nil |
ReadBufferSize | int |
ReadBufferSize دریافت کرنے والے پیغامات کے لئے I/O بفر سائز کو معین کرتا ہے (بائٹس میں)۔ | 0 (اصل سائز) |
WriteBufferSize | int |
WriteBufferSize بھیجنے والے پیغامات کے لیے I/O بفر سائز کو معین کرتا ہے (بائٹس میں)۔ | 0 (اصل سائز) |
WriteBufferPool | websocket.BufferPool |
WriteBufferPool ورائٹ کرنے والے آپریشنز کے لیے استعمال ہونے والا بفر پول ہے۔ | nil |
EnableCompression | bool |
EnableCompression متاثر ہونے والے ہر میسج کے لیے کلائنٹ کی زورکشی کرنا چاہئے یا نہیں (RFC 7692) کو معین کرتا ہے۔ | false |
RecoverHandler | func(*websocket.Conn) void |
RecoverHandler ایک پینیک سے بحران سے بحران سے بحران سے متاثر ہونے والی فنکشن ہیں۔ | defaultRecover |
مثال
package main
import (
"log"
"github.com/gofiber/fiber/v2"
"github.com/gofiber/contrib/websocket"
)
func main() {
app := fiber.New()
app.Use("/ws", func(c *fiber.Ctx) error {
// WebSocket پروٹوکول کے اپگریڈ کو کلائنٹ کی درخواست کرنے کی صورت میں true واپس کرو
if websocket.IsWebSocketUpgrade(c) {
c.Locals("allowed", true)
return c.Next()
}
return fiber.ErrUpgradeRequired
})
app.Get("/ws/:id", websocket.New(func(c *websocket.Conn) {
// c.Locals کو *websocket.Conn میں شامل کیا گیا ہے
log.Println(c.Locals("allowed")) // سچا
log.Println(c.Params("id")) // 123
log.Println(c.Query("v")) // 1.0
log.Println(c.Cookies("session")) // ""
var (
mt int
msg []byte
err error
)
for {
if mt, msg, err = c.ReadMessage(); err != nil {
log.Println("read:", err)
break
}
log.Printf("recv: %s", msg)
if err = c.WriteMessage(mt, msg); err != nil {
log.Println("write:", err)
break
}
}
}))
log.Fatal(app.Listen(":3000"))
// WebSocket سرور تک رسائی: ws://localhost:3000/ws/123?v=1.0
// https://www.websocket.org/echo.html
}
کیش مِڈل ویئر کا استعمال کے بارے میں نوٹس
اگر آپ کیش مِڈل ویئر کا استعمال کرتے ہوئے websocket: bad handshake
خطا کا سامنا کریں تو WebSocket راستہ گزرانی کے لئے config.Next
کا استعمال کریں۔
app := fiber.New()
app.Use(cache.New(cache.Config{
Next: func(c *fiber.Ctx) bool {
return strings.Contains(c.Route().Path, "/ws")
},
}))
app.Get("/ws/:id", websocket.New(func(c *websocket.Conn) {}))
حاشیہ استعادہ کے استعمال کے لئے غور کرنے والے فکری معاملات
آندرونی تنظیم کے سبب سے، حالیہ میڈل ویئر ویب ساکٹ میڈل ویئر کے ساتھ موافق نہیں ہے۔ براہ کرم ویب ساکٹ انڈ پوائنٹس کے لئے ایک استعادہ ہینڈلر شامل کرنے کے لیے config.RecoverHandler
استعمال کریں۔ ڈیفالٹ طور پر، RecoverHandler
تشکیل سے پینکس سے بازیابی کرتا ہے، سٹیک ٹریس کو stderr پر لکھتا ہے، اور بھی پینک کے پیغام کو error فیلڈ میں شامل کر کے ایک جواب بھی واپس بھیجتا ہے۔
app := fiber.New()
app.Use(cache.New(cache.Config{
Next: func(c *fiber.Ctx) bool {
return strings.Contains(c.Route().Path, "/ws")
},
}))
cfg := Config{
RecoverHandler: func(conn *Conn) {
if err := recover(); err != nil {
conn.WriteJSON(fiber.Map{"customError": "error occurred"})
}
},
}
app.Get("/ws/:id", websocket.New(func(c *websocket.Conn) {}, cfg))