سرور بھیجی جانے والی واقعات (SSE) کا تعارف
سرور-بھیجی جانے والی واقعات (SSE) ایک سرور پش کنولوجی ہے جو کلائنٹس کو HTTP کنکشن کے ذریعے سرور سے خود بخود تازہ کاریاں حاصل کرنے کی اجازت دیتی ہے۔ یہ بیان کرتی ہے کہ سرور نے ابتدائی کلائنٹ کنکشن قائم کرنے کے بعد کلائنٹ کو ڈیٹا کے انتقال کو کیسے آغاز کرتا ہے۔ یہ عام طور پر براؤزر کلائنٹس کو میسج کی تازہ کاریاں یا مسلسل ڈیٹا سٹریمس بھیجنے کے لیے استعمال ہوتی ہیں، جس کا مقصد جاوا اسکرپٹ اے پی آئی کے ذریعے مقامی کراس براؤزر سٹریمس کو بہتر بنانا ہوتا ہے۔ کلائنٹس اس اے پی آئی کو استعمال کرکے کسی مخصوص یو آر ایل کی درخواست کر سکتے ہیں تاکہ وہ واقعات کی سٹریمس حاصل کریں۔ HTML5 کا حصہ ہونے کی حساب سے، EventSource اے پی آئی کو WHATWG نے معیاری بنایا ہے۔ SSE کے لیے میڈیا قسم text/event-stream ہے۔
نوٹ: SSE اور ویب ساکٹ کی سب سے بڑی فرق یہ ہے کہ SSE ایک طرفہ سرور سے کلائنٹ میں میسج بھیجتا ہے، جبکہ ویب ساکٹ دو طرفہ میسج بھیجتا ہے۔ کبھی کبار بزنس مطالبہات پیچیدہ نہ ہونے کی صورت میں، SSE کا ایک طرفہ میسج بھیجنا کافی ہوتا ہے۔ یہ ChatGPT AI conversations میں استعمال ہونے والی ٹیکنالوجی کی طرح ہے۔
فائبر SSE مثال
package main
import (
"bufio"
"fmt"
"log"
"time"
"github.com/gofiber/fiber/v2"
"github.com/gofiber/fiber/v2/middleware/cors"
"github.com/valyala/fasthttp"
)
// HTML کلائنٹ کا نقل بنانا، یہاں فرنٹ اینڈ کو بیک اینڈ سے پش میسجس جس میں جی ایس سے وصول ہو رہے ہیں کا ایک مثال دی گئی ہے، اصل کاروباری سیٹنگس میں، فرنٹ اینڈ اسے مثال کی طرح ہی امپلیمنٹ کرے گا۔
var index = []byte(`<!DOCTYPE html>
<html>
<body>
<h1>SSE Messages</h1>
<div id="result"></div>
<script>
if(typeof(EventSource) !== "undefined") {
var source = new EventSource("http://127.0.0.1:3000/sse");
source.onmessage = function(event) {
document.getElementById("result").innerHTML += event.data + "<br>";
};
} else {
document.getElementById("result").innerHTML = "Sorry, your browser does not support server-sent events...";
}
</script>
</body>
</html>
`)
func main() {
// فائبر انسٹنس
app := fiber.New()
// کورس محدودیتوں، کسی بھی ڈومین سے دسترسی کی اجازت دیتے ہیں
app.Use(cors.New(cors.Config{
AllowOrigins: "*",
AllowHeaders: "Cache-Control",
AllowCredentials: true,
}))
// / راستہ تک رسائی، ہم پہلے فرنٹ اینڈ صفحہ واپس کرتے ہیں، فرنٹ اینڈ کو بیک اینڈ سے SSE میسج بھیجنے کی اجازت دیتے ہیں
app.Get("/", func(c *fiber.Ctx) error {
c.Response().Header.SetContentType(fiber.MIMETextHTMLCharsetUTF8)
return c.Status(fiber.StatusOK).Send(index)
})
// sse میسج بھیجنے والا ایڈریس
app.Get("/sse", func(c *fiber.Ctx) error {
// sse http ہیڈر سیٹ کریں، Content-Type پر توجہ دیں
c.Set("Content-Type", "text/event-stream")
c.Set("Cache-Control", "no-cache")
c.Set("Connection", "keep-alive")
c.Set("Transfer-Encoding", "chunked")
// میسج بھیجنے کی شروعات
c.Context().SetBodyStreamWriter(fasthttp.StreamWriter(func(w *bufio.Writer) {
fmt.Println("WRITER")
var i int
// کلائنٹ کو مثال کی طرح میسجس مسلسل بھیجنے کا نمونہ
for {
i++
msg := fmt.Sprintf("%d - وقت ہے%v - ", i, time.Now())
// کلائنٹ کو میسجس بھیجنے کیلئے writer اور Fprintf فنکشن کا استعمال، اصل کاروباری سیٹنگس میں جیسن ٹیکسٹ کو فرنٹ اینڈ کی سہولت کے لیے بھیجا جاسکتا ہے
fmt.Fprintf(w, "data: Message: %s\n\n", msg)
fmt.Println(msg)
// کلائنٹ کو آؤٹپٹ ڈیٹا منتقل کریں
err := w.Flush()
if err != nil {
// ویب براؤزر میں صفحہ ریفریش کرنا ایک نیا SSE کنکشن قائم کرے گا، لیکن صرف آخری واحد سے رابطہ ہوتا ہے، لہذا یہاں منقوط کنکشنز بند کرنے ہوں گے
fmt.Printf("Flush کرتے وقت خطا: %v. ہٹھائی کنکشن کو بند کریں۔\n", err)
break
}
time.Sleep(2 * time.Second)
}
}))
return nil
})
// سرور شروع کریں
log.Fatal(app.Listen(":3000"))
}