Ana içeriğe geç

Versiyon 4.6.0

7 Şubat 2023

Sunucu

Hata Düzeltmeleri

  • uzaktan soket için zaman aşımı yöntemi ekleyin (#4558) (0c0eb00)
  • tipler: zaman aşımı ile doğru emit türü belirleme (f3ada7d)

Özellikler

:::info Promise Tabanlı Onaylar

Bu commit, onaylarla ilgili bazı sözdizimsel şekiller ekler:

  • emitWithAck()
try {
const responses = await io.timeout(1000).emitWithAck("some-event");
console.log(responses); // her istemci için bir yanıt
} catch (e) {
// bazı istemciler belirtilen gecikmede olayı onaylamadı
}

io.on("connection", async (socket) => {
const response = await socket.emitWithAck("hello", "world");

try {
const response = await socket.timeout(1000).emitWithAck("hello", "world");
} catch (err) {
// istemci belirtilen gecikmede olayı onaylamadı
}
});
  • serverSideEmitWithAck()
try {
const responses = await io.timeout(1000).serverSideEmitWithAck("some-event");
console.log(responses); // sunucu başına bir yanıt (kendisi hariç)
} catch (e) {
// bazı sunucular belirtilen gecikmede olayı onaylamadı
}

184f3cf eklenmiştir.

:::note Bağlantı Durumu Kurtarma

Bu özellik, bir istemcinin geçici bir bağlantı kopmasından sonra yeniden bağlanmasını ve durumunu geri yüklemesini sağlar:

  • kimlik
  • odalar
  • veri
  • kaçırılan paketler

Kullanım:

import { Server } from "socket.io";

const io = new Server({
connectionStateRecovery: {
maxDisconnectionDuration: 2 * 60 * 1000,
skipMiddlewares: true,
},
});

io.on("connection", (socket) => {
console.log(socket.recovered); // durumun kurtarılıp kurtarılmadığı
});

Nasıl çalıştığına dair bilgiler:

  • sunucu el sıkışma sırasında bir oturum kimliği gönderir (bu, mevcut id niteliğinden farklıdır, bu açık ve serbestçe paylaşılabilir)
  • sunucu her pakete bir offset de ekler (veri dizisinin sonunda eklenen, geriye dönük uyumluluk için)
  • geçici bir bağlantı kopması durumunda, sunucu belirli bir gecikme süresi boyunca istemci durumunu saklar (adaptör düzeyinde uygulanmıştır)
  • yeniden bağlanıldığında, istemci hem oturum kimliğini hem de işlediği son offset'i gönderir ve sunucu durumu geri yüklemeye çalışır

Bellek içi adaptör bu özelliği zaten desteklemekte ve Postgres ile MongoDB adaptörlerini yakında güncelleyerek bu özelliği destekleyeceğiz. Ayrıca, bu özelliği destekleyecek yeni bir adaptör oluşturacağız: Redis Streams.

54d5ee0 eklenmiştir.

:::tip Express Ara Katmanları ile Gerçek Uyumluluk

Bu özellik, Socket.IO ara katmanları klasik bir HTTP istek/yanıt döngüsü sırasında çalışmadığından, Engine.IO düzeyinde ara katmanları uygular ve Socket.IO ara katmanları ad alanı yetkilendirme için tasarlanmıştır.

Sözdizimi:

io.engine.use((req, res, next) => {
// bir şey yap
next();
});

// express-session ile
import session from "express-session";

io.engine.use(session({
secret: "keyboard cat",
resave: false,
saveUninitialized: true,
cookie: { secure: true }
}));

// helmet ile
import helmet from "helmet";

io.engine.use(helmet());

allowRequest seçeneği ve "headers" olayı kullanılarak bir geçici çözüm mümkün olmuştu, ancak bu çok daha düzenli hissettiriyor ve yükseltme istekleriyle de çalışıyor.

24786e7 eklenmiştir.

:::warning Bağlantı Kesilmesi ve Ayrılma Olaylarındaki Hata Ayrıntıları

disconnect olayı artık bağlantının kesilme nedenine dair ek ayrıntılar içerecektir.

io.on("connection", (socket) => {
socket.on("disconnect", (reason, description) => {
console.log(description);
});
});

8aa9499 eklenmiştir.

:::note Boş Alt Ad Alanlarının Otomatik Olarak Kaldırılması

Bu commit, "cleanupEmptyChildNamespaces" adlı yeni bir seçenek ekler. Bu seçenek etkinleştirildiğinde (varsayılan olarak devre dışı), bir soket dinamik bir ad alanından bağlantısını kestiğinde ve başka hiçbir soket bağlı değilse, ad alanı temizlenecek ve adaptörü kapatılacaktır.

import { createServer } from "node:http";
import { Server } from "socket.io";

const httpServer = createServer();
const io = new Server(httpServer, {
cleanupEmptyChildNamespaces: true
});

5d9220b eklenmiştir.

:::info Yeni "addTrailingSlash" Seçeneği

Varsayılan olarak eklenen son çarpraz, artık devre dışı bırakılabilir:

import { createServer } from "node:http";
import { Server } from "socket.io";

const httpServer = createServer();
const io = new Server(httpServer, {
addTrailingSlash: false
});

Yukarıdaki örnekte, istemciler son çarprazı atlayabilir ve /socket.io yerine /socket.io/ kullanabilir.

d0fd474 eklenmiştir.

Performans İyileştirmeleri

  • yayılma sırasında WebSocket çerçevelerini önceden hesaplayın (da2b542)

Bağımlılıklar

İstemci

Hata Düzeltmeleri

  • tipler: tarayıcıya özgü türleri açığa çıkarmayın (4d6d95e)
  • manager.socket()'in etkin bir soket döndürmesini sağlayın (b7dd891)
  • tipler: zaman aşımı ile doğru emit türü belirleme (#1570) (33e4172)

Özellikler

:::info Yeni "addTrailingSlash" Seçeneği

Varsayılan olarak eklenen son çarpraz, artık devre dışı bırakılabilir:

import { io } from "socket.io-client";

const socket = io("https://example.com", {
addTrailingSlash: false
});

Yukarıdaki örnekte, istek URL'si https://example.com/socket.io yerine https://example.com/socket.io/ olacaktır.

21a6e12 eklenmiştir.

:::note Promise Tabanlı Onaylar

Bu commit, onaylarla ilgili bazı sözdizimsel şekiller ekler:

// zaman aşımı olmadan
const response = await socket.emitWithAck("hello", "world");

// belirli bir zaman aşımı ile
try {
const response = await socket.timeout(1000).emitWithAck("hello", "world");
} catch (err) {
// sunucu belirtilen gecikmede olayı onaylamadı
}

Not: Promise desteklemeyen ortamlarda, bu özelliği kullanmak için bir polyfill eklenmesi gerekecektir.

47b979d eklenmiştir.

:::tip Bağlantı Durumu Kurtarma

Bu özellik, bir istemcinin geçici bir bağlantı kopmasından sonra yeniden bağlanmasını ve kimliğini geri yüklemesini sağlar ve bağlantı kopma süresi boyunca kaçırılan paketleri alır. Sunucu tarafında etkinleştirilmesi gerekir.

socket nesnesine yeni bir boolean niteliği olan recovered eklenmiştir:

socket.on("connect", () => {
console.log(socket.recovered); // kurtarmanın başarılı olup olmadığı
});

54d5ee0 (sunucu) ve b4e20c5 (istemci) eklenmiştir.

:::warning Yeniden Deneme Mekanizması

İki yeni seçenek mevcuttur:

  • retries: maksimum yeniden deneme sayısı. Limitin üzerinde, paket atılacaktır.
  • ackTimeout: onaylama beklerken kullanılan varsayılan zaman aşımı, milisaniye cinsindendir (zaten mevcut timeout seçeneği ile karıştırılmamalıdır, bu seçeneği Yöneticinin bağlantı sırasında kullanır)
const socket = io({
retries: 3,
ackTimeout: 10000
});

// örtük onay
socket.emit("my-event");

// açık onay
socket.emit("my-event", (err, val) => { /* ... */ });

// özel zaman aşımı (bu durumda ackTimeout isteğe bağlıdır)
socket.timeout(5000).emit("my-event", (err, val) => { /* ... */ });

Yukarıdaki tüm örneklerde, "my-event" en fazla 4 kez (1 + 3) gönderilecektir, sunucu bir onay gönderene kadar.

Her pakete benzersiz bir kimlik atamak, sunucu tarafında tekrar etmeyi önlemek için kullanıcıya aittir.

655dce9 eklenmiştir.

Bağımlılıklar