Skip to main content

DataBuffer

Класс DataBuffer представляет собой обертку над DateView с дополнительным функционалом по отслеживанию курсора, автоматическому расширению буфера и другого.

Tip

DataBuffer автоматически изменяет положение курсора при записи и чтении. На практике, при создании пользовательских типов, вам не нужно думать об этом.

Использование

index.ts
import { DataBuffer } from "encodexx"
const buf = new DataBuffer()
buf.writeFloat64(12.4325);
buf.resetCursor();
console.log(buf.readFloat64());

Danger

Не используйте resetCursor в экземплярах DataBuffer, которые вы получаете создавая, пользовательские типы. Это может привести к ошибкам в сериализации и перезаписи данных.

Применение

Encodexx возвращает DataBuffer в качестве буфера для сериализации и десериализации данных. Вы можете также использовать его для создания пользовательских типов, которые будут работать с буфером напрямую.

Создание DataBuffer из ArrayBuffer

Вы можете передать в конструктор класса ArrayBuffer.

fetch.ts
import { DataBuffer } from "encodexx"
import { serializer } from "./schema.ts"
const arrayBuffer = new ArrayBuffer(200)
// Do something with arrayBuffer
const buffer = new DataBuffer(arrayBuffer)

Отправка DataBuffer по сети

Для того, чтобы отправить DataBuffer по сети, вам необходимо его конвертировать в ArrayBuffer или Uint8Array.

client.ts
import { serializer } from "./schema.ts"
const body = serializer.encode(data).buffer; // Получаем ArrayBuffer
fetch(url, {
method: "POST",
body,
headers: {
// Указываем, что отправляем бинарные данные
"Content-Type": "application/octet-stream",
},
})

Для того, чтобы отправить данные с сервера, к примеру использующего express, необхоидмо использовать встроенный в NodeJs класс Buffer

server.ts
import { serializer, getResponse } from "./schema.ts"
app.post("/", (req, res) => {
const response = getResponse();
// Получаем результат в Uint8Array и конвертируем в Buffer
const encoded = Buffer.from(serializer.encode(response).uint8Array);
res.set("Content-Type", "application/octet-stream");
res.send(encoded);
});

API

  • constructor(newBuffer?: ArrayBuffer, size?: number) - Конструктор нового экземпляра. Можно указать начальный буфер или начальный размер

По умолчанию DataBuffer сразу выделяет 1 Кб после увеличивая размер при необходимости. Вы можете изменить этот размер

new DataBuffer(undefined, 1024 * 1024) // Выделяем сразу 1 Мб

Info

Еncodexx автоматически обрезает буфер до нужного размера

  • get length(): number; - Получение длины заполненной части буфера
  • get buffer(): ArrayBuffer; - Получение заполненной части буфера
  • get uint8Array(): Uint8Array<ArrayBuffer>; - Получение заполненной части буфера в виде Uint8Array
  • get cursor(): number; - Получение байта на котором стоит курсор
  • resetCursor(): void; - Устанавливает курсор в 0 позицию
  • writeBuffer(buffer: ArrayBuffer | Uint8Array): void; - Запись ArrayBuffer произвольной длины
  • readBuffer(length: number): ArrayBuffer; - Чтение ArrayBuffer определенной длины
  • writeUleb128(value: bigint): void; - Запись числа в формате uleb128
  • readUleb128(): bigint; - Чтение числа в формате uleb128
  • writeSleb128(value: bigint): void; - Запись числа в формате sleb128
  • readSleb128(): bigint; - Чтение числа в формате sleb128
  • writeInt8(val: number): void; - Запись числа в формате int8
  • readInt8(): number; - Чтение числа в формате int8
  • writeUint8(val: number): void; - Запись числа в формате uint8
  • readUint8(): number; - Чтение числа в формате uint8
  • writeInt16(val: number): void; - Запись числа в формате int16
  • readInt16(): number; - Чтение числа в формате int16
  • writeUint16(val: number): void; - Запись числа в формате uint16
  • readUint16(): number; - Чтение числа в формате uint16
  • writeInt32(val: number): void; - Запись числа в формате int32
  • readInt32(): number; - Чтение числа в формате int32
  • writeUint32(val: number): void; - Запись числа в формате uint32
  • readUint32(): number; - Чтение числа в формате uint32
  • writeFloat32(val: number): void; - Запись числа в формате float32
  • readFloat32(): number; - Чтение числа в формате float32
  • writeFloat64(val: number): void; - Запись числа в формате float64
  • readFloat64(): number; - Чтение числа в формате float64
  • writeBigInt64(val: bigint): void; - Запись числа в формате bigint64
  • readBigInt64(): bigint; - Чтение числа в формате bigint64
  • writeBigUint64(val: bigint): void; - Запись числа в формате biguint64
  • readBigUint64(): bigint; - Чтение числа в формате biguint64
  • writeString(val: string): void; - Запись строки
  • readString(): string; - Чтение строки
  • writeBoolean(val: boolean): void; - Запись булева значения FF если true и 00 если false
  • readBoolean(): boolean; - Чтение булева значения
  • writeDate(val: Date): void; - Запись даты
  • readDate(): Date; - Чтение даты