From 49eda8f0e3b7379ff435bd374b71e6d6abaaf4e3 Mon Sep 17 00:00:00 2001 From: teidesu <86301490+teidesu@users.noreply.github.com> Date: Thu, 19 Aug 2021 23:09:44 +0300 Subject: [PATCH] fix(core): fix bare types and mt_message writing --- .../core/src/utils/binary/binary-writer.ts | 8 +++--- packages/tl/binary/writer.d.ts | 2 +- packages/tl/scripts/generate-binary-reader.js | 25 ++++++++++++------- packages/tl/scripts/generate-binary-writer.js | 18 +++++++------ packages/tl/scripts/generate-types.js | 17 +++++++++---- 5 files changed, 44 insertions(+), 26 deletions(-) diff --git a/packages/core/src/utils/binary/binary-writer.ts b/packages/core/src/utils/binary/binary-writer.ts index d6b9881a..2e5b76e1 100644 --- a/packages/core/src/utils/binary/binary-writer.ts +++ b/packages/core/src/utils/binary/binary-writer.ts @@ -176,7 +176,7 @@ export class SerializationCounter implements ITlBinaryWriter { vector(fn: TlBinaryWriterFunction, items: unknown[], bare?: boolean): void { this.count += bare ? 4 : 8 - items.forEach((it) => fn.call(this, it)) + items.forEach((it) => fn.call(this, it, bare)) } } @@ -301,11 +301,11 @@ export class BinaryWriter implements ITlBinaryWriter { this._objectMap[obj._].call(this, obj, bare) } - vector(fn: TlBinaryWriterFunction, val: unknown[]): void { - this.uint32(0x1cb5c415) + vector(fn: TlBinaryWriterFunction, val: unknown[], bare?: boolean): void { + if (!bare) this.uint32(0x1cb5c415) this.uint32(val.length) - val.forEach((it) => fn.call(this, it)) + val.forEach((it) => fn.call(this, it, bare)) } result(): Buffer { diff --git a/packages/tl/binary/writer.d.ts b/packages/tl/binary/writer.d.ts index 8b92325a..9895c2ed 100644 --- a/packages/tl/binary/writer.d.ts +++ b/packages/tl/binary/writer.d.ts @@ -50,7 +50,7 @@ export interface ITlBinaryWriter { * * @param fn Writer function * @param items Items to be written - * @param bare Whether the vector is bare (i.e. vector ID should not be written) + * @param bare Whether the vector is bare (i.e. object ID should not be written) */ vector(fn: TlBinaryWriterFunction, items: unknown[], bare?: boolean): void } diff --git a/packages/tl/scripts/generate-binary-reader.js b/packages/tl/scripts/generate-binary-reader.js index d3032f42..30582aa2 100644 --- a/packages/tl/scripts/generate-binary-reader.js +++ b/packages/tl/scripts/generate-binary-reader.js @@ -80,6 +80,9 @@ function writeNamespace(nsType) { write(`${cls.id}: function () {`) tab() + let is_mt_message = + nsType === 'mtproto' && cls.name === 'message' + if (cls.arguments?.length) { write(`var ret = {};`) write(`ret._ = '${prefix}${cls.name}';`) @@ -106,15 +109,19 @@ function writeNamespace(nsType) { ) } } else { - write( - `ret.${ - arg.name - } = this.${getFunctionCallByTypeName( - baseTypePrefix, - arg.type, - arg - )};` - ) + if (is_mt_message && arg.name === 'body') { + write('ret.body = this.raw(ret.bytes)') + } else { + write( + `ret.${ + arg.name + } = this.${getFunctionCallByTypeName( + baseTypePrefix, + arg.type, + arg + )};` + ) + } } }) diff --git a/packages/tl/scripts/generate-binary-writer.js b/packages/tl/scripts/generate-binary-writer.js index dbb5201d..7cde3c32 100644 --- a/packages/tl/scripts/generate-binary-writer.js +++ b/packages/tl/scripts/generate-binary-writer.js @@ -120,13 +120,17 @@ function writeNamespace(nsType) { } else { write(`_assert_has(obj, '${arg.name}')`) } - write( - `this.${getFunctionCallByTypeName( - baseTypePrefix, - arg.type, - `obj.${arg.name}` - )}` - ) + if (is_mt_message && arg.name === 'body') { + write('this.raw(obj.body)') + } else { + write( + `this.${getFunctionCallByTypeName( + baseTypePrefix, + arg.type, + `obj.${arg.name}` + )}` + ) + } if (arg.optional) { untab() } diff --git a/packages/tl/scripts/generate-types.js b/packages/tl/scripts/generate-types.js index bacda10d..53ee20e1 100644 --- a/packages/tl/scripts/generate-types.js +++ b/packages/tl/scripts/generate-types.js @@ -162,6 +162,9 @@ const writeSingleSchemaEntry = (type) => { ts.tab() ts.write(`readonly _: '${prefix}${cls.name}',`) + let is_mt_message = + type === 'mtproto' && cls.name === 'message' + if (cls.arguments && cls.arguments.length) { cls.arguments.forEach((arg) => { if (arg.type === '$FlagsBitField') return @@ -170,11 +173,15 @@ const writeSingleSchemaEntry = (type) => { arg.type = 'boolean' if (arg.description) ts.comment(arg.description) - ts.write( - `readonly ${arg.name}${ - arg.optional ? '?' : '' - }: ${fullTypeName(arg.type)};` - ) + if (is_mt_message && arg.name === 'body') { + ts.write('readonly body: Buffer;') + } else { + ts.write( + `readonly ${arg.name}${ + arg.optional ? '?' : '' + }: ${fullTypeName(arg.type)};` + ) + } }) }