@mtcute/convert 0.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (154) hide show
  1. package/LICENSE +8 -0
  2. package/README.md +46 -0
  3. package/cjs/dcs.d.ts +4 -0
  4. package/cjs/dcs.js +113 -0
  5. package/cjs/dcs.js.map +1 -0
  6. package/cjs/gramjs/convert.d.ts +4 -0
  7. package/cjs/gramjs/convert.js +29 -0
  8. package/cjs/gramjs/convert.js.map +1 -0
  9. package/cjs/gramjs/index.d.ts +4 -0
  10. package/cjs/gramjs/index.js +21 -0
  11. package/cjs/gramjs/index.js.map +1 -0
  12. package/cjs/gramjs/parse.d.ts +2 -0
  13. package/cjs/gramjs/parse.js +31 -0
  14. package/cjs/gramjs/parse.js.map +1 -0
  15. package/cjs/gramjs/serialize.d.ts +2 -0
  16. package/cjs/gramjs/serialize.js +24 -0
  17. package/cjs/gramjs/serialize.js.map +1 -0
  18. package/cjs/gramjs/types.d.ts +7 -0
  19. package/cjs/gramjs/types.js +3 -0
  20. package/cjs/gramjs/types.js.map +1 -0
  21. package/cjs/index.d.ts +5 -0
  22. package/cjs/index.js +22 -0
  23. package/cjs/index.js.map +1 -0
  24. package/cjs/mtkruto/convert.d.ts +4 -0
  25. package/cjs/mtkruto/convert.js +32 -0
  26. package/cjs/mtkruto/convert.js.map +1 -0
  27. package/cjs/mtkruto/index.d.ts +4 -0
  28. package/cjs/mtkruto/index.js +21 -0
  29. package/cjs/mtkruto/index.js.map +1 -0
  30. package/cjs/mtkruto/parse.d.ts +2 -0
  31. package/cjs/mtkruto/parse.js +28 -0
  32. package/cjs/mtkruto/parse.js.map +1 -0
  33. package/cjs/mtkruto/serialize.d.ts +2 -0
  34. package/cjs/mtkruto/serialize.js +15 -0
  35. package/cjs/mtkruto/serialize.js.map +1 -0
  36. package/cjs/mtkruto/types.d.ts +5 -0
  37. package/cjs/mtkruto/types.js +3 -0
  38. package/cjs/mtkruto/types.js.map +1 -0
  39. package/cjs/package.json +3 -0
  40. package/cjs/pyrogram/convert.d.ts +6 -0
  41. package/cjs/pyrogram/convert.js +41 -0
  42. package/cjs/pyrogram/convert.js.map +1 -0
  43. package/cjs/pyrogram/index.d.ts +4 -0
  44. package/cjs/pyrogram/index.js +21 -0
  45. package/cjs/pyrogram/index.js.map +1 -0
  46. package/cjs/pyrogram/parse.d.ts +2 -0
  47. package/cjs/pyrogram/parse.js +56 -0
  48. package/cjs/pyrogram/parse.js.map +1 -0
  49. package/cjs/pyrogram/serialize.d.ts +2 -0
  50. package/cjs/pyrogram/serialize.js +40 -0
  51. package/cjs/pyrogram/serialize.js.map +1 -0
  52. package/cjs/pyrogram/types.d.ts +8 -0
  53. package/cjs/pyrogram/types.js +3 -0
  54. package/cjs/pyrogram/types.js.map +1 -0
  55. package/cjs/telethon/convert.d.ts +4 -0
  56. package/cjs/telethon/convert.js +45 -0
  57. package/cjs/telethon/convert.js.map +1 -0
  58. package/cjs/telethon/index.d.ts +4 -0
  59. package/cjs/telethon/index.js +21 -0
  60. package/cjs/telethon/index.js.map +1 -0
  61. package/cjs/telethon/parse.d.ts +2 -0
  62. package/cjs/telethon/parse.js +33 -0
  63. package/cjs/telethon/parse.js.map +1 -0
  64. package/cjs/telethon/serialize.d.ts +2 -0
  65. package/cjs/telethon/serialize.js +34 -0
  66. package/cjs/telethon/serialize.js.map +1 -0
  67. package/cjs/telethon/types.d.ts +7 -0
  68. package/cjs/telethon/types.js +3 -0
  69. package/cjs/telethon/types.js.map +1 -0
  70. package/cjs/types.d.ts +1 -0
  71. package/cjs/types.js +3 -0
  72. package/cjs/types.js.map +1 -0
  73. package/cjs/utils/ip.d.ts +3 -0
  74. package/cjs/utils/ip.js +45 -0
  75. package/cjs/utils/ip.js.map +1 -0
  76. package/cjs/utils/rle.d.ts +3 -0
  77. package/cjs/utils/rle.js +55 -0
  78. package/cjs/utils/rle.js.map +1 -0
  79. package/esm/dcs.d.ts +4 -0
  80. package/esm/dcs.js +109 -0
  81. package/esm/dcs.js.map +1 -0
  82. package/esm/gramjs/convert.d.ts +4 -0
  83. package/esm/gramjs/convert.js +24 -0
  84. package/esm/gramjs/convert.js.map +1 -0
  85. package/esm/gramjs/index.d.ts +4 -0
  86. package/esm/gramjs/index.js +5 -0
  87. package/esm/gramjs/index.js.map +1 -0
  88. package/esm/gramjs/parse.d.ts +2 -0
  89. package/esm/gramjs/parse.js +27 -0
  90. package/esm/gramjs/parse.js.map +1 -0
  91. package/esm/gramjs/serialize.d.ts +2 -0
  92. package/esm/gramjs/serialize.js +20 -0
  93. package/esm/gramjs/serialize.js.map +1 -0
  94. package/esm/gramjs/types.d.ts +7 -0
  95. package/esm/gramjs/types.js +2 -0
  96. package/esm/gramjs/types.js.map +1 -0
  97. package/esm/index.d.ts +5 -0
  98. package/esm/index.js +6 -0
  99. package/esm/index.js.map +1 -0
  100. package/esm/mtkruto/convert.d.ts +4 -0
  101. package/esm/mtkruto/convert.js +27 -0
  102. package/esm/mtkruto/convert.js.map +1 -0
  103. package/esm/mtkruto/index.d.ts +4 -0
  104. package/esm/mtkruto/index.js +5 -0
  105. package/esm/mtkruto/index.js.map +1 -0
  106. package/esm/mtkruto/parse.d.ts +2 -0
  107. package/esm/mtkruto/parse.js +24 -0
  108. package/esm/mtkruto/parse.js.map +1 -0
  109. package/esm/mtkruto/serialize.d.ts +2 -0
  110. package/esm/mtkruto/serialize.js +11 -0
  111. package/esm/mtkruto/serialize.js.map +1 -0
  112. package/esm/mtkruto/types.d.ts +5 -0
  113. package/esm/mtkruto/types.js +2 -0
  114. package/esm/mtkruto/types.js.map +1 -0
  115. package/esm/pyrogram/convert.d.ts +6 -0
  116. package/esm/pyrogram/convert.js +36 -0
  117. package/esm/pyrogram/convert.js.map +1 -0
  118. package/esm/pyrogram/index.d.ts +4 -0
  119. package/esm/pyrogram/index.js +5 -0
  120. package/esm/pyrogram/index.js.map +1 -0
  121. package/esm/pyrogram/parse.d.ts +2 -0
  122. package/esm/pyrogram/parse.js +52 -0
  123. package/esm/pyrogram/parse.js.map +1 -0
  124. package/esm/pyrogram/serialize.d.ts +2 -0
  125. package/esm/pyrogram/serialize.js +36 -0
  126. package/esm/pyrogram/serialize.js.map +1 -0
  127. package/esm/pyrogram/types.d.ts +8 -0
  128. package/esm/pyrogram/types.js +2 -0
  129. package/esm/pyrogram/types.js.map +1 -0
  130. package/esm/telethon/convert.d.ts +4 -0
  131. package/esm/telethon/convert.js +40 -0
  132. package/esm/telethon/convert.js.map +1 -0
  133. package/esm/telethon/index.d.ts +4 -0
  134. package/esm/telethon/index.js +5 -0
  135. package/esm/telethon/index.js.map +1 -0
  136. package/esm/telethon/parse.d.ts +2 -0
  137. package/esm/telethon/parse.js +29 -0
  138. package/esm/telethon/parse.js.map +1 -0
  139. package/esm/telethon/serialize.d.ts +2 -0
  140. package/esm/telethon/serialize.js +30 -0
  141. package/esm/telethon/serialize.js.map +1 -0
  142. package/esm/telethon/types.d.ts +7 -0
  143. package/esm/telethon/types.js +2 -0
  144. package/esm/telethon/types.js.map +1 -0
  145. package/esm/types.d.ts +1 -0
  146. package/esm/types.js +2 -0
  147. package/esm/types.js.map +1 -0
  148. package/esm/utils/ip.d.ts +3 -0
  149. package/esm/utils/ip.js +39 -0
  150. package/esm/utils/ip.js.map +1 -0
  151. package/esm/utils/rle.d.ts +3 -0
  152. package/esm/utils/rle.js +49 -0
  153. package/esm/utils/rle.js.map +1 -0
  154. package/package.json +22 -0
@@ -0,0 +1,29 @@
1
+ import { MtArgumentError } from '@mtcute/core';
2
+ import { getPlatform } from '@mtcute/core/platform.js';
3
+ import { dataViewFromBuffer } from '@mtcute/core/utils.js';
4
+ import { parseIpFromBytes } from '../utils/ip.js';
5
+ export function parseTelethonSession(session) {
6
+ if (session[0] !== '1') {
7
+ // version
8
+ throw new MtArgumentError(`Invalid session string (version = ${session[0]})`);
9
+ }
10
+ session = session.slice(1);
11
+ const data = getPlatform().base64Decode(session, true);
12
+ const dv = dataViewFromBuffer(data);
13
+ const dcId = dv.getUint8(0);
14
+ const ipSize = session.length === 352 ? 4 : 16;
15
+ let pos = 1 + ipSize;
16
+ const ipBytes = data.subarray(1, pos);
17
+ const port = dv.getUint16(pos);
18
+ pos += 2;
19
+ const authKey = data.subarray(pos, pos + 256);
20
+ const ip = parseIpFromBytes(ipBytes);
21
+ return {
22
+ dcId,
23
+ ipAddress: ip,
24
+ ipv6: ipSize === 16,
25
+ port,
26
+ authKey,
27
+ };
28
+ }
29
+ //# sourceMappingURL=parse.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parse.js","sourceRoot":"","sources":["../../../src/telethon/parse.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAA;AAC9C,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAA;AACtD,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAA;AAE1D,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAA;AAGjD,MAAM,UAAU,oBAAoB,CAAC,OAAe;IAChD,IAAI,OAAO,CAAC,CAAC,CAAC,KAAK,GAAG,EAAE;QACpB,UAAU;QACV,MAAM,IAAI,eAAe,CAAC,qCAAqC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAA;KAChF;IAED,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;IAE1B,MAAM,IAAI,GAAG,WAAW,EAAE,CAAC,YAAY,CAAC,OAAO,EAAE,IAAI,CAAC,CAAA;IACtD,MAAM,EAAE,GAAG,kBAAkB,CAAC,IAAI,CAAC,CAAA;IAEnC,MAAM,IAAI,GAAG,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAA;IAE3B,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAA;IAC9C,IAAI,GAAG,GAAG,CAAC,GAAG,MAAM,CAAA;IAEpB,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAA;IACrC,MAAM,IAAI,GAAG,EAAE,CAAC,SAAS,CAAC,GAAG,CAAC,CAAA;IAC9B,GAAG,IAAI,CAAC,CAAA;IACR,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,GAAG,GAAG,GAAG,CAAC,CAAA;IAE7C,MAAM,EAAE,GAAG,gBAAgB,CAAC,OAAO,CAAC,CAAA;IAEpC,OAAO;QACH,IAAI;QACJ,SAAS,EAAE,EAAE;QACb,IAAI,EAAE,MAAM,KAAK,EAAE;QACnB,IAAI;QACJ,OAAO;KACV,CAAA;AACL,CAAC","sourcesContent":["import { MtArgumentError } from '@mtcute/core'\nimport { getPlatform } from '@mtcute/core/platform.js'\nimport { dataViewFromBuffer } from '@mtcute/core/utils.js'\n\nimport { parseIpFromBytes } from '../utils/ip.js'\nimport { TelethonSession } from './types.js'\n\nexport function parseTelethonSession(session: string): TelethonSession {\n if (session[0] !== '1') {\n // version\n throw new MtArgumentError(`Invalid session string (version = ${session[0]})`)\n }\n\n session = session.slice(1)\n\n const data = getPlatform().base64Decode(session, true)\n const dv = dataViewFromBuffer(data)\n\n const dcId = dv.getUint8(0)\n\n const ipSize = session.length === 352 ? 4 : 16\n let pos = 1 + ipSize\n\n const ipBytes = data.subarray(1, pos)\n const port = dv.getUint16(pos)\n pos += 2\n const authKey = data.subarray(pos, pos + 256)\n\n const ip = parseIpFromBytes(ipBytes)\n\n return {\n dcId,\n ipAddress: ip,\n ipv6: ipSize === 16,\n port,\n authKey,\n }\n}\n"]}
@@ -0,0 +1,2 @@
1
+ import { TelethonSession } from './types.js';
2
+ export declare function serializeTelethonSession(session: TelethonSession): string;
@@ -0,0 +1,30 @@
1
+ import { MtArgumentError } from '@mtcute/core';
2
+ import { getPlatform } from '@mtcute/core/platform.js';
3
+ import { dataViewFromBuffer } from '@mtcute/core/utils.js';
4
+ import { serializeIpv4ToBytes, serializeIpv6ToBytes } from '../utils/ip.js';
5
+ export function serializeTelethonSession(session) {
6
+ if (session.authKey.length !== 256) {
7
+ throw new MtArgumentError('authKey must be 256 bytes long');
8
+ }
9
+ const ipSize = session.ipv6 ? 16 : 4;
10
+ const u8 = new Uint8Array(259 + ipSize);
11
+ const dv = dataViewFromBuffer(u8);
12
+ dv.setUint8(0, session.dcId);
13
+ let pos;
14
+ if (session.ipv6) {
15
+ serializeIpv6ToBytes(session.ipAddress, u8.subarray(1, 17));
16
+ pos = 17;
17
+ }
18
+ else {
19
+ serializeIpv4ToBytes(session.ipAddress, u8.subarray(1, 5));
20
+ pos = 5;
21
+ }
22
+ dv.setUint16(pos, session.port);
23
+ pos += 2;
24
+ u8.set(session.authKey, pos);
25
+ let b64 = getPlatform().base64Encode(u8, true);
26
+ while (b64.length % 4 !== 0)
27
+ b64 += '='; // for some reason telethon uses padding
28
+ return '1' + b64;
29
+ }
30
+ //# sourceMappingURL=serialize.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"serialize.js","sourceRoot":"","sources":["../../../src/telethon/serialize.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAA;AAC9C,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAA;AACtD,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAA;AAE1D,OAAO,EAAE,oBAAoB,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAA;AAG3E,MAAM,UAAU,wBAAwB,CAAC,OAAwB;IAC7D,IAAI,OAAO,CAAC,OAAO,CAAC,MAAM,KAAK,GAAG,EAAE;QAChC,MAAM,IAAI,eAAe,CAAC,gCAAgC,CAAC,CAAA;KAC9D;IAED,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAA;IACpC,MAAM,EAAE,GAAG,IAAI,UAAU,CAAC,GAAG,GAAG,MAAM,CAAC,CAAA;IACvC,MAAM,EAAE,GAAG,kBAAkB,CAAC,EAAE,CAAC,CAAA;IAEjC,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,OAAO,CAAC,IAAI,CAAC,CAAA;IAE5B,IAAI,GAAG,CAAA;IAEP,IAAI,OAAO,CAAC,IAAI,EAAE;QACd,oBAAoB,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAA;QAC3D,GAAG,GAAG,EAAE,CAAA;KACX;SAAM;QACH,oBAAoB,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA;QAC1D,GAAG,GAAG,CAAC,CAAA;KACV;IAED,EAAE,CAAC,SAAS,CAAC,GAAG,EAAE,OAAO,CAAC,IAAI,CAAC,CAAA;IAC/B,GAAG,IAAI,CAAC,CAAA;IACR,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,CAAA;IAE5B,IAAI,GAAG,GAAG,WAAW,EAAE,CAAC,YAAY,CAAC,EAAE,EAAE,IAAI,CAAC,CAAA;IAC9C,OAAO,GAAG,CAAC,MAAM,GAAG,CAAC,KAAK,CAAC;QAAE,GAAG,IAAI,GAAG,CAAA,CAAC,wCAAwC;IAEhF,OAAO,GAAG,GAAG,GAAG,CAAA;AACpB,CAAC","sourcesContent":["import { MtArgumentError } from '@mtcute/core'\nimport { getPlatform } from '@mtcute/core/platform.js'\nimport { dataViewFromBuffer } from '@mtcute/core/utils.js'\n\nimport { serializeIpv4ToBytes, serializeIpv6ToBytes } from '../utils/ip.js'\nimport { TelethonSession } from './types.js'\n\nexport function serializeTelethonSession(session: TelethonSession) {\n if (session.authKey.length !== 256) {\n throw new MtArgumentError('authKey must be 256 bytes long')\n }\n\n const ipSize = session.ipv6 ? 16 : 4\n const u8 = new Uint8Array(259 + ipSize)\n const dv = dataViewFromBuffer(u8)\n\n dv.setUint8(0, session.dcId)\n\n let pos\n\n if (session.ipv6) {\n serializeIpv6ToBytes(session.ipAddress, u8.subarray(1, 17))\n pos = 17\n } else {\n serializeIpv4ToBytes(session.ipAddress, u8.subarray(1, 5))\n pos = 5\n }\n\n dv.setUint16(pos, session.port)\n pos += 2\n u8.set(session.authKey, pos)\n\n let b64 = getPlatform().base64Encode(u8, true)\n while (b64.length % 4 !== 0) b64 += '=' // for some reason telethon uses padding\n\n return '1' + b64\n}\n"]}
@@ -0,0 +1,7 @@
1
+ export interface TelethonSession {
2
+ dcId: number;
3
+ ipAddress: string;
4
+ ipv6: boolean;
5
+ port: number;
6
+ authKey: Uint8Array;
7
+ }
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/telethon/types.ts"],"names":[],"mappings":"","sourcesContent":["export interface TelethonSession {\n dcId: number\n ipAddress: string\n ipv6: boolean\n port: number\n authKey: Uint8Array\n}\n"]}
package/esm/types.d.ts ADDED
@@ -0,0 +1 @@
1
+ export {};
package/esm/types.js ADDED
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":"","sourcesContent":[""]}
@@ -0,0 +1,3 @@
1
+ export declare function parseIpFromBytes(data: Uint8Array): string;
2
+ export declare function serializeIpv4ToBytes(ip: string, buf: Uint8Array): void;
3
+ export declare function serializeIpv6ToBytes(ip: string, buf: Uint8Array): void;
@@ -0,0 +1,39 @@
1
+ import { MtArgumentError } from '@mtcute/core';
2
+ export function parseIpFromBytes(data) {
3
+ if (data.length === 4) {
4
+ return `${data[0]}.${data[1]}.${data[2]}.${data[3]}`;
5
+ }
6
+ if (data.length === 16) {
7
+ let res = '';
8
+ for (let i = 0; i < 16; i += 2) {
9
+ res += data[i].toString(16).padStart(2, '0');
10
+ res += data[i + 1].toString(16).padStart(2, '0');
11
+ if (i < 14)
12
+ res += ':';
13
+ }
14
+ return res;
15
+ }
16
+ throw new MtArgumentError('Invalid IP address length');
17
+ }
18
+ export function serializeIpv4ToBytes(ip, buf) {
19
+ const parts = ip.split('.');
20
+ if (parts.length !== 4) {
21
+ throw new MtArgumentError('Invalid IPv4 address');
22
+ }
23
+ buf[0] = Number(parts[0]);
24
+ buf[1] = Number(parts[1]);
25
+ buf[2] = Number(parts[2]);
26
+ buf[3] = Number(parts[3]);
27
+ }
28
+ export function serializeIpv6ToBytes(ip, buf) {
29
+ const parts = ip.split(':');
30
+ if (parts.length !== 8) {
31
+ throw new MtArgumentError('Invalid IPv6 address');
32
+ }
33
+ for (let i = 0; i < 8; i++) {
34
+ const val = parseInt(parts[i], 16);
35
+ buf[i * 2] = val >> 8;
36
+ buf[i * 2 + 1] = val & 0xff;
37
+ }
38
+ }
39
+ //# sourceMappingURL=ip.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ip.js","sourceRoot":"","sources":["../../../src/utils/ip.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAA;AAE9C,MAAM,UAAU,gBAAgB,CAAC,IAAgB;IAC7C,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE;QACnB,OAAO,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,EAAE,CAAA;KACvD;IAED,IAAI,IAAI,CAAC,MAAM,KAAK,EAAE,EAAE;QACpB,IAAI,GAAG,GAAG,EAAE,CAAA;QAEZ,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE;YAC5B,GAAG,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAA;YAC5C,GAAG,IAAI,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAA;YAChD,IAAI,CAAC,GAAG,EAAE;gBAAE,GAAG,IAAI,GAAG,CAAA;SACzB;QAED,OAAO,GAAG,CAAA;KACb;IAED,MAAM,IAAI,eAAe,CAAC,2BAA2B,CAAC,CAAA;AAC1D,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,EAAU,EAAE,GAAe;IAC5D,MAAM,KAAK,GAAG,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;IAE3B,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE;QACpB,MAAM,IAAI,eAAe,CAAC,sBAAsB,CAAC,CAAA;KACpD;IAED,GAAG,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAA;IACzB,GAAG,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAA;IACzB,GAAG,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAA;IACzB,GAAG,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAA;AAC7B,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,EAAU,EAAE,GAAe;IAC5D,MAAM,KAAK,GAAG,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;IAE3B,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE;QACpB,MAAM,IAAI,eAAe,CAAC,sBAAsB,CAAC,CAAA;KACpD;IAED,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE;QACxB,MAAM,GAAG,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAA;QAClC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,GAAG,IAAI,CAAC,CAAA;QACrB,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,GAAG,GAAG,IAAI,CAAA;KAC9B;AACL,CAAC","sourcesContent":["import { MtArgumentError } from '@mtcute/core'\n\nexport function parseIpFromBytes(data: Uint8Array): string {\n if (data.length === 4) {\n return `${data[0]}.${data[1]}.${data[2]}.${data[3]}`\n }\n\n if (data.length === 16) {\n let res = ''\n\n for (let i = 0; i < 16; i += 2) {\n res += data[i].toString(16).padStart(2, '0')\n res += data[i + 1].toString(16).padStart(2, '0')\n if (i < 14) res += ':'\n }\n\n return res\n }\n\n throw new MtArgumentError('Invalid IP address length')\n}\n\nexport function serializeIpv4ToBytes(ip: string, buf: Uint8Array) {\n const parts = ip.split('.')\n\n if (parts.length !== 4) {\n throw new MtArgumentError('Invalid IPv4 address')\n }\n\n buf[0] = Number(parts[0])\n buf[1] = Number(parts[1])\n buf[2] = Number(parts[2])\n buf[3] = Number(parts[3])\n}\n\nexport function serializeIpv6ToBytes(ip: string, buf: Uint8Array) {\n const parts = ip.split(':')\n\n if (parts.length !== 8) {\n throw new MtArgumentError('Invalid IPv6 address')\n }\n\n for (let i = 0; i < 8; i++) {\n const val = parseInt(parts[i], 16)\n buf[i * 2] = val >> 8\n buf[i * 2 + 1] = val & 0xff\n }\n}\n"]}
@@ -0,0 +1,3 @@
1
+ export declare function telegramRleEncode(buf: Uint8Array): Uint8Array;
2
+ export declare function telegramRleDecode(buf: Uint8Array): Uint8Array;
3
+ export declare function assertNever(_: never): never;
@@ -0,0 +1,49 @@
1
+ // tdlib's RLE only encodes consecutive \x00
2
+ export function telegramRleEncode(buf) {
3
+ const len = buf.length;
4
+ const ret = [];
5
+ let count = 0;
6
+ for (let i = 0; i < len; i++) {
7
+ const cur = buf[i];
8
+ if (cur === 0) {
9
+ count += 1;
10
+ }
11
+ else {
12
+ if (count > 0) {
13
+ ret.push(0, count);
14
+ count = 0;
15
+ }
16
+ ret.push(cur);
17
+ }
18
+ }
19
+ if (count > 0) {
20
+ ret.push(0, count);
21
+ }
22
+ return new Uint8Array(ret);
23
+ }
24
+ export function telegramRleDecode(buf) {
25
+ const len = buf.length;
26
+ const ret = [];
27
+ let prev = -1;
28
+ for (let i = 0; i < len; i++) {
29
+ const cur = buf[i];
30
+ if (prev === 0) {
31
+ for (let j = 0; j < cur; j++) {
32
+ ret.push(prev);
33
+ }
34
+ prev = -1;
35
+ }
36
+ else {
37
+ if (prev !== -1)
38
+ ret.push(prev);
39
+ prev = cur;
40
+ }
41
+ }
42
+ if (prev !== -1)
43
+ ret.push(prev);
44
+ return new Uint8Array(ret);
45
+ }
46
+ export function assertNever(_) {
47
+ throw new Error('unreachable');
48
+ }
49
+ //# sourceMappingURL=rle.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rle.js","sourceRoot":"","sources":["../../../src/utils/rle.ts"],"names":[],"mappings":"AAAA,4CAA4C;AAE5C,MAAM,UAAU,iBAAiB,CAAC,GAAe;IAC7C,MAAM,GAAG,GAAG,GAAG,CAAC,MAAM,CAAA;IACtB,MAAM,GAAG,GAAa,EAAE,CAAA;IACxB,IAAI,KAAK,GAAG,CAAC,CAAA;IAEb,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,EAAE,EAAE;QAC1B,MAAM,GAAG,GAAG,GAAG,CAAC,CAAC,CAAC,CAAA;QAElB,IAAI,GAAG,KAAK,CAAC,EAAE;YACX,KAAK,IAAI,CAAC,CAAA;SACb;aAAM;YACH,IAAI,KAAK,GAAG,CAAC,EAAE;gBACX,GAAG,CAAC,IAAI,CAAC,CAAC,EAAE,KAAK,CAAC,CAAA;gBAClB,KAAK,GAAG,CAAC,CAAA;aACZ;YAED,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;SAChB;KACJ;IAED,IAAI,KAAK,GAAG,CAAC,EAAE;QACX,GAAG,CAAC,IAAI,CAAC,CAAC,EAAE,KAAK,CAAC,CAAA;KACrB;IAED,OAAO,IAAI,UAAU,CAAC,GAAG,CAAC,CAAA;AAC9B,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,GAAe;IAC7C,MAAM,GAAG,GAAG,GAAG,CAAC,MAAM,CAAA;IACtB,MAAM,GAAG,GAAa,EAAE,CAAA;IACxB,IAAI,IAAI,GAAG,CAAC,CAAC,CAAA;IAEb,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,EAAE,EAAE;QAC1B,MAAM,GAAG,GAAG,GAAG,CAAC,CAAC,CAAC,CAAA;QAElB,IAAI,IAAI,KAAK,CAAC,EAAE;YACZ,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,EAAE,EAAE;gBAC1B,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;aACjB;YACD,IAAI,GAAG,CAAC,CAAC,CAAA;SACZ;aAAM;YACH,IAAI,IAAI,KAAK,CAAC,CAAC;gBAAE,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;YAC/B,IAAI,GAAG,GAAG,CAAA;SACb;KACJ;IAED,IAAI,IAAI,KAAK,CAAC,CAAC;QAAE,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IAE/B,OAAO,IAAI,UAAU,CAAC,GAAG,CAAC,CAAA;AAC9B,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,CAAQ;IAChC,MAAM,IAAI,KAAK,CAAC,aAAa,CAAC,CAAA;AAClC,CAAC","sourcesContent":["// tdlib's RLE only encodes consecutive \\x00\n\nexport function telegramRleEncode(buf: Uint8Array): Uint8Array {\n const len = buf.length\n const ret: number[] = []\n let count = 0\n\n for (let i = 0; i < len; i++) {\n const cur = buf[i]\n\n if (cur === 0) {\n count += 1\n } else {\n if (count > 0) {\n ret.push(0, count)\n count = 0\n }\n\n ret.push(cur)\n }\n }\n\n if (count > 0) {\n ret.push(0, count)\n }\n\n return new Uint8Array(ret)\n}\n\nexport function telegramRleDecode(buf: Uint8Array): Uint8Array {\n const len = buf.length\n const ret: number[] = []\n let prev = -1\n\n for (let i = 0; i < len; i++) {\n const cur = buf[i]\n\n if (prev === 0) {\n for (let j = 0; j < cur; j++) {\n ret.push(prev)\n }\n prev = -1\n } else {\n if (prev !== -1) ret.push(prev)\n prev = cur\n }\n }\n\n if (prev !== -1) ret.push(prev)\n\n return new Uint8Array(ret)\n}\n\nexport function assertNever(_: never): never {\n throw new Error('unreachable')\n}\n"]}
package/package.json ADDED
@@ -0,0 +1,22 @@
1
+ {
2
+ "name": "@mtcute/convert",
3
+ "version": "0.8.0",
4
+ "description": "Cross-library session conversion utilities",
5
+ "author": "Alina Sireneva <alina@tei.su>",
6
+ "license": "MIT",
7
+ "main": "cjs/index.js",
8
+ "type": "module",
9
+ "sideEffects": false,
10
+ "scripts": {},
11
+ "dependencies": {
12
+ "@mtcute/core": "^0.8.0",
13
+ "@mtcute/tl": "*"
14
+ },
15
+ "module": "esm/index.js",
16
+ "exports": {
17
+ ".": {
18
+ "import": "./esm/index.js",
19
+ "require": "./cjs/index.js"
20
+ }
21
+ }
22
+ }