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))