Server-Sent Events
Server-Sent Events (SSE) - bu HTTP ulanishi orqali klientga serverdan avtomatik yangilanishlarni olish imkonini beradigan server push texnologiyasi. Har bir bildirishnoma ikki qato
Server-Sent Events (SSE) - bu HTTP ulanishi orqali klientga serverdan avtomatik yangilanishlarni olish imkonini beradigan server push texnologiyasi. Har bir bildirishnoma ikki qatorli bo'sh qatordan iborat ajratgich bilan yakunlangan matn bloki sifatida yuboriladi (batafsil bu yerda).
Foydalanish
Marshrutda Server-Sent eventsni yoqish uchun (route controller klass ichida ro'yxatdan o'tgan bo'lsa), metod handlerini @Sse() dekoratori bilan belgilang.
1@Sse('sse')
2sse(): Observable<MessageEvent> {
3 return interval(1000).pipe(map((_) => ({ data: { hello: 'world' } })));
4}@Sse() dekoratori va MessageEvent interfeysi @nestjs/common dan, Observable, interval, va map esa rxjs paketidan import qilinadi.
Server-Sent Events marshrutlari Observable stream qaytarishi shart.
Yuqoridagi misolda biz sse nomli route aniqladik, u real-time yangilanishlarni tarqatish imkonini beradi. Bu hodisalarni EventSource API orqali tinglash mumkin.
sse metodi bir nechta MessageEvent ni emit qiladigan Observable qaytaradi (bu misolda u har soniyada yangi MessageEvent emit qiladi). MessageEvent obyekti spetsifikatsiyaga mos kelish uchun quyidagi interfeysga rioya qilishi kerak:
1export interface MessageEvent {
2 data: string | object;
3 id?: string;
4 type?: string;
5 retry?: number;
6}Bular joyida bo'lsa, endi klient tomoni ilovamizda EventSource klassi instansiyasini yaratishimiz mumkin, konstruktor argumenti sifatida /sse route ni uzatib (bu yuqorida @Sse() dekoratoriga uzatilgan endpointga mos keladi).
EventSource instansiyasi HTTP serveriga doimiy ulanishni ochadi, server esa hodisalarni text/event-stream formatida yuboradi. Ulanish EventSource.close() chaqirilgunga qadar ochiq qoladi.
Ulanish ochilgach, serverdan kelayotgan xabarlar kodga hodisalar ko'rinishida yetkaziladi. Agar kiruvchi xabarda event maydoni bo'lsa, ishga tushiriladigan hodisa shu event maydoni qiymatiga teng bo'ladi. Agar event maydoni bo'lmasa, umumiy message hodisasi chaqiriladi (manba).
1const eventSource = new EventSource('/sse');
2eventSource.onmessage = ({ data }) => {
3 console.log('New message', JSON.parse(data));
4};Misol
Ishlaydigan misol bu yerda mavjud.