Skip to main content

Простые типы

Пользовательские типы работают точно также как и встроенные. Для их создания используйте функцию customType().

Danger

Encodexx не контролирует выход за границы записанных типом данных, поэтому очень важно читать ровно те данные, которые были записали ранее.

Параметры

customType<T>(params: TUserCustomType<T>): TCustomType<T>
  • params - Объект для настройки и создания пользовательского типа.

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

./custom-types/int24.ts
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 - Имя типа в формате строки. Должно быть уникально.

Сериализация

Пользовательский тип можно использовать также, как и другие, что открывает новые возможности для сериализации.

index.ts
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