Type Language
Type Language serialization and deserialization for JavaScript.
Installation
NPM:
npm install @telegramv/tl
Yarn:
yarn add @telegramv/tl
You also should install some library for GZIP manipulations. I recommend pako
.
yarn add pako
Usage
Constructors:
Serializer(schema: Schema, options?: SerializationOptions);
Deserializer(schema: Schema, data: Uint8Array, options?: DeserializationOptions);
Example:
You can install
@telegramv/schema
or use your own schema.
import {Serializer, Deserializer, JsonSchema} from "@telegramv/tl";
import schema from "@telegramv/schema";
import pako from "pako";
const jsonSchema = new JsonSchema(schema);
/**
* Note: `data` is Uint8Array and method should return Uint8Array.
* @property {(data: Uint8Array) => Uint8Array} gzip
* @property {(data: Uint8Array) => Uint8Array} ungzip
*/
const gzip = {
gzip: (data) => pako.gzip(data),
ungzip: (data) => pako.ungzip(data),
};
const serializer = new Serializer(jsonSchema, {gzip})
.int(69)
.string("victory")
.bytes(new Uint8Array([1, 2, 3, 4]), 4)
.long(new Uint8Array(8))
.object({
_: "inputFile",
id: new Uint8Array([210, 4, 0, 0, 0, 0, 0, 0]),
parts: 2,
name: "xxx.png",
md5_checksum: "ha.sh",
});
console.log(serializer.getBytes());
const deserializer = new Deserializer(jsonSchema, serializer.getBytes(), {gzip});
const int = deserializer.int();
const string = deserializer.string();
const bytes = deserializer.bytes();
const long = deserializer.long();
const inputFile = deserializer.object();
console.log({
int,
string,
bytes,
long,
inputFile,
})
It is very convenient to use factory pattern here.
File TLFactory.js
:
import {Serializer, Deserializer, JsonSchema} from "@telegramv/tl";
import schema from "@telegramv/schema";
import pako from "pako";
const jsonSchema = new JsonSchema(schema);
const gzip = {
gzip: (data) => pako.gzip(data),
ungzip: (data) => pako.ungzip(data),
};
const createSerializer = (options = {}) => new Serializer(jsonSchema, {gzip, ...options})
const createDeserializer = (data, options = {}) => new Deserializer(jsonSchema, data, {gzip, ...options})
const TLFactory = {
serializer: createSerializer,
deserializer: createDeserializer,
};
export default TLFactory;
File example.js
:
import TLFactory from "./TLFactory";
const serializer = TLFactory.serializer();
const deserializer = TLFactory.deserializer(serializer.getBytes());