Ana içeriğe geç

Özelleştirilmiş ayrıştırıcı

Socket.IO v2.0.0'dan itibaren, paketlerin marshalling / unmarshalling'ını kontrol etmek için kendi ayrıştırıcınızı sağlamanız artık mümkündür.

Sunucu

import { Server } from "socket.io";

const io = new Server({
parser: myParser
});

İstemci

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

const socket = io({
parser: myParser
});

Mevcut ayrıştırıcılar

varsayılan ayrıştırıcı dışında, burada mevcut ayrıştırıcıların listesi:

PaketAçıklama
socket.io-circular-parserVarsayılan ayrıştırıcıya benzer, ancak döngüsel referansları işleme alır.
socket.io-msgpack-parserPaketleri kodlamak için MessagePack kullanır ( notepack.io paketine dayanmaktadır).
@skgdev/socket.io-msgpack-javascriptPaketleri kodlamak için MessagePack kullanır ( @msgpack/msgpack paketine dayanmaktadır).
socket.io-json-parserPaketleri kodlamak için JSON.stringify() ve JSON.parse() kullanır.
socket.io-cbor-x-parserPaketleri kodlamak için cbor-x kullanır.
@socket.io/devalue-parserPaketleri kodlamak için devalue kullanır.

Kendi ayrıştırıcınızı uygulama

JSON.stringify() ve JSON.parse() yöntemlerini kullanan bir ayrıştırıcı ile basit bir örnek:

import { Emitter } from "@socket.io/component-emitter"; // tarayıcıda Node.js EventEmitter polyfill'i

class Encoder {
/**
* Bir paketi dize/buffer listesine kodla
*/
encode(packet) {
return [JSON.stringify(packet)];
}
}

function isObject(value) {
return Object.prototype.toString.call(value) === "[object Object]";
}

class Decoder extends Emitter {
/**
* Bir parça (dize veya buffer) al ve isteğe bağlı olarak yeniden yapılandırılmış paketi içeren "decode" olayını yayınla
*/
add(chunk) {
const packet = JSON.parse(chunk);
if (this.isPacketValid(packet)) {
this.emit("decoded", packet);
} else {
throw new Error("geçersiz format");
}
}
isPacketValid({ type, data, nsp, id }) {
const isNamespaceValid = typeof nsp === "string";
const isAckIdValid = id === undefined || Number.isInteger(id);
if (!isNamespaceValid || !isAckIdValid) {
return false;
}
switch (type) {
case 0: // BAĞLAN
return data === undefined || isObject(data);
case 1: // BAĞLANTIDAN AYRIL
return data === undefined;
case 2: // OLAY
return Array.isArray(data) && typeof data[0] === "string";
case 3: // ONAY
return Array.isArray(data);
case 4: // BAĞLANMA_HATASI
return isObject(data);
default:
return false;
}
}
/**
* Dahili buffer'ları temizle
*/
destroy() {}
}

export const parser = { Encoder, Decoder };

Varsayılan ayrıştırıcı

Varsayılan ayrıştırıcının kaynak kodu ( socket.io-parser paketi) burada bulunabilir: https://github.com/socketio/socket.io-parser

Çıktı örneği:

  • temel yayma
socket.emit("test", 42);

şu şekilde kodlanacaktır:

2["test",42]
||
|└─ JSON'la kodlanmış yük
└─ paket türü (2 => OLAY)
  • ikili, onay ve özel ad alanı ile yayma
socket.emit("test", Uint8Array.from([42]), () => {
console.log("onay alındı");
});

şu şekilde kodlanacaktır:

51-/admin,13["test",{"_placeholder":true,"num":0}]
|||| || └─ ikili ekler için yer tutucular içeren JSON'la kodlanmış yük
|||| |└─ onay id'si
|||| └─ ayırıcı
|||└─ ad alanı (ana ad alanı olduğunda dahil edilmez)
||└─ ayırıcı
|└─ ikili ek sayısı
└─ paket türü (5 => İKİLİ OLAY)

ve bir ek (çıkarılan Uint8Array)

Artılar:

  • ikili ekler daha sonra base64 ile kodlandığı için bu ayrıştırıcı, Arraybuffer'ı desteklemeyen tarayıcılarla uyumludur, örneğin IE9

Eksiler:

  • ikili içeriğe sahip paketler iki ayrı WebSocket çerçevesi olarak gönderilir (WebSocket bağlantısı kurulduysa)

Msgpack Ayrıştırıcısı

Bu ayrıştırıcı, MessagePack serileştirme formatını kullanır.

Bu ayrıştırıcının kaynak kodu burada bulunabilir: https://github.com/socketio/socket.io-msgpack-parser

Örnek kullanım:

Sunucu

import { Server } from "socket.io";
import customParser from "socket.io-msgpack-parser";

const io = new Server({
parser: customParser
});

İstemci (Node.js)

import { io } from "socket.io-client";
import customParser from "socket.io-msgpack-parser";

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

Tarayıcıda, bu ayrıştırıcıyı içeren resmi bir paket bulunmaktadır:

Bu durumda, parser seçeneğini belirtmenize gerek yoktur.

Artılar:

  • ikili içeriğe sahip paketler tek bir WebSocket çerçevesi olarak gönderilir (WebSocket bağlantısı kurulduysa)
  • daha küçük yüklerin sonucunu verebilir (özellikle çok sayıda sayı kullanıldığında)

Eksiler:

bilgi

Lütfen socket.io-msgpack-parser'ın notepack.io MessagePack uygulamasına bağlı olduğunu unutmayın. Bu uygulama, esas olarak performansa ve minimal paket boyutuna odaklanır ve bu nedenle genişletme türleri gibi özellikleri desteklemez. Resmi JavaScript uygulamasına dayanan bir ayrıştırıcı için, bu pakete göz atabilirsiniz.