Простые типы
Пользовательские типы работают точно также как и встроенные. Для их создания используйте функцию customType()
.
Danger
Encodexx не контролирует выход за границы записанных типом данных, поэтому очень важно читать ровно те данные, которые были записали ранее.
Параметры
customType<T>(params: TUserCustomType<T>): TCustomType<T>
params
- Объект для настройки и создания пользовательского типа.
Использование
import { customType } from "encodexx";const MIN = -(2 ** 23);const MAX = 2 ** 23 - 1;
export const int24 = customType<number>({ decode(buffer) { const b0 = buffer.readUint8(); const b1 = buffer.readUint8(); const b2 = buffer.readUint8();
// Combine bytes into a 24-bit value: let val24 = (b0 << 16) | (b1 << 8) | b2; // We can set sign by shifting left and then right with sign: val24 = (val24 << 8) >> 8;
return val24; }, encode(val, buffer) { // Convert negative numbers to their two's complement representation in 24 bits. if (val < 0) { val += 2 ** 24; } // Store the 40-bit value in Big Endian order (most significant byte first). buffer.writeUint8(Number((val >> 16) & 0xff)); buffer.writeUint8(Number((val >> 8) & 0xff)); buffer.writeUint8(Number(val & 0xff)); }, guard(data): data is number { if (typeof data !== "number") return false; return data <= MAX && data >= MIN; }, name: "int24",});
encode(val: T, buffer: Buffer)
- Функция кодирования значения. Принимает значение, которое нужно закодировать и экземплярBuffer
.decode(buffer: Buffer): T
- Функция декодирования значения. ПринимаетBuffer
и возвращает готовое значение.
guard(data): data is T
- Используется в реализацииt.or()
и вstrict mode
. Функция должна определить, принадлежит ли значение данному типу.
Tip
Рекомендуем по возможности точно проверять соответствие типу, чтобы внутренние механизмы работали максимально корректно.
name
- Имя типа в формате строки. Должно быть уникально.
Сериализация
Пользовательский тип можно использовать также, как и другие, что открывает новые возможности для сериализации.
import { t, Serializer } from "encodexx"
import { int24 } from "./custom-types/my-type.ts"
const serializer = new Serializer({ values: [t.or(t.str, int24)],});
const encoded = serializer.encode({ values: [ 122_254, "hello" ],});
console.log(serializer.decode(encoded))
Info
Все встроенные типы сделаны с помощью customType()
. Их реализацию вы можете увидеть в github