সার্ভার-প্রেরিত ইভেন্ট (SSE) এর পরিচিতি

সার্ভার-প্রেরিত ইভেন্ট (SSE) হল একটি সার্ভার পুশ প্রযুক্তি, যা গ্রাহকদেরকে HTTP সংযোগের মাধ্যমে সার্ভার থেকে স্বয়ংক্রিয়ভাবে আপডেট পাওয়ার সুযোগ দেয়। এটি বর্ণনা করে কীভাবে সার্ভার প্রাথমিক গ্রাহক সংযোগ স্থাপন করার পরে গ্রাহক তারো ডেটা পাঠানোর নির্দেশ দেয়। এটি সাধারণভাবে এমন জন্য ব্যবহৃত হয় যাতে ব্রাউজার গ্রাহকদের প্রলোভন কে সংবাদের আপডেট বা অবিরত ডেটা স্ট্রিম পাঠানো যায়, যা JavaScript API নামে EventSource কে মাধ্যমে নিজস্বতান্ত্রভাবে বা দিয়ে। গ্রাহকরা এই API ব্যবহার করে একটি নির্দিষ্ট URL কে চালিয়ে ইভেন্ট স্ট্রীম পেতে পারে। HTML5 এর অংশ হিসাবে, EventSource API টি কীভাবে চল চিহ্নিত করা হয়েছে, তা তার আওতাধীন করা হয়েছে WHATWG দ্বারা। SSE এর মিডিয়া প্রকার text/event-stream এলোক্য করা হয়েছে।

লক্ষ্য করুন: SSE এবং ওয়েবসকেট এর মধ্যে বৃহত্তম পার্থক্য হ'ল, SSE একদিকে সার্ভার-থেকে-গ্রাহক মেসেজ পুশ, যেখানে ওয়েবসকেট দুইদিকে মেসেজ পুশ। সময়ের প্রয়োজনের অনুসারে, যদি ব্যাবসায়িক প্রয়োজন এতটাই জটিল না হয়, তবে SSE এর একদিকে মেসেজ পুশ পর্যায়ক্রমে যথেষ্ট হয়। এটা একটি ChatGPT এআই অবদানের সংগতিক ধরণ ব্যবহার করা হ'য়।

ফাইবার SSE উধাহরণ

প্যাকেজ 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()

	// CORS প্রতিবন্ধন, যেকোন ডোমেইন থেকে প্রবেশ দেওয়ার অনুমতি দেয়
	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())
				// গ্রাহককে মেসেজ পুশের জন্য রাইটার এবং Fprintf কাজ করানোর জন্য, ব্যবসায়িক ঘটনাগুলিতে, জনসংযোগের সুবিধার জন্য JSON টেক্সট পাঠানো যেতে পারে।
				fmt.Fprintf(w, "data: মেসেজ: %s\n\n", msg)
				fmt.Println(msg)

				// ক্লায়েন্টে আউটপুট যথেষ্টেরস্ববূদ্ধভাবে ফ্লাস করুন
				err := w.Flush()
				if err != nil {
					// ওয়েব ব্রাউজারে পৃষ্ঠাতে পর্যাপ্ত সময়ি সম্পৃত্যা হবে একটি নতুন SSE সংযোগ স্থাপন করবে, তবে শুধুমাত্র শেষটি অবস্থা চলছে, তাই মৃত সংযোগগুলি এখানে বন্ধ করা আবশ্যক।
					fmt.Printf("ফ্লাশ করা যাচ্ছেনি: %v. পরবর্তী http সংযোগ বন্ধ।\n", err)
					break
				}
				time.Sleep(2 * time.Second)
			}
		}))

		return nil
	})

	// সার্ভার চালু করুন
	log.Fatal(app.Listen(":3000"))
}