@mtcute/test 0.7.1 → 0.9.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 (54) hide show
  1. package/LICENSE +1 -1
  2. package/cjs/client.d.ts +2 -1
  3. package/cjs/client.js +4 -1
  4. package/cjs/client.js.map +1 -1
  5. package/cjs/crypto.js +52 -42
  6. package/cjs/crypto.js.map +1 -1
  7. package/cjs/index.d.ts +1 -0
  8. package/cjs/index.js +1 -0
  9. package/cjs/index.js.map +1 -1
  10. package/cjs/platform.d.ts +3 -0
  11. package/cjs/platform.js +7 -0
  12. package/cjs/platform.js.map +1 -0
  13. package/cjs/platform.web.d.ts +3 -0
  14. package/cjs/platform.web.js +7 -0
  15. package/cjs/platform.web.js.map +1 -0
  16. package/esm/client.d.ts +2 -1
  17. package/esm/client.js +4 -1
  18. package/esm/client.js.map +1 -1
  19. package/esm/crypto.js +53 -43
  20. package/esm/crypto.js.map +1 -1
  21. package/esm/index.d.ts +1 -0
  22. package/esm/index.js +1 -0
  23. package/esm/index.js.map +1 -1
  24. package/esm/platform.d.ts +3 -0
  25. package/esm/platform.js +4 -0
  26. package/esm/platform.js.map +1 -0
  27. package/esm/platform.web.d.ts +3 -0
  28. package/esm/platform.web.js +4 -0
  29. package/esm/platform.web.js.map +1 -0
  30. package/package.json +19 -4
  31. package/cjs/client.test.d.ts +0 -1
  32. package/cjs/client.test.js +0 -32
  33. package/cjs/client.test.js.map +0 -1
  34. package/cjs/stub.test.d.ts +0 -1
  35. package/cjs/stub.test.js +0 -55
  36. package/cjs/stub.test.js.map +0 -1
  37. package/cjs/transport.test.d.ts +0 -1
  38. package/cjs/transport.test.js +0 -36
  39. package/cjs/transport.test.js.map +0 -1
  40. package/cjs/utils.test.d.ts +0 -1
  41. package/cjs/utils.test.js +0 -16
  42. package/cjs/utils.test.js.map +0 -1
  43. package/esm/client.test.d.ts +0 -1
  44. package/esm/client.test.js +0 -30
  45. package/esm/client.test.js.map +0 -1
  46. package/esm/stub.test.d.ts +0 -1
  47. package/esm/stub.test.js +0 -50
  48. package/esm/stub.test.js.map +0 -1
  49. package/esm/transport.test.d.ts +0 -1
  50. package/esm/transport.test.js +0 -34
  51. package/esm/transport.test.js.map +0 -1
  52. package/esm/utils.test.d.ts +0 -1
  53. package/esm/utils.test.js +0 -14
  54. package/esm/utils.test.js.map +0 -1
package/esm/crypto.js CHANGED
@@ -1,6 +1,8 @@
1
1
  import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from 'vitest';
2
2
  import { gzipSync, inflateSync } from 'zlib';
3
- import { dataViewFromBuffer, defaultCryptoProviderFactory, hexDecodeToBuffer, hexEncode, utf8EncodeToBuffer, } from '@mtcute/core/utils.js';
3
+ import { getPlatform } from '@mtcute/core/platform.js';
4
+ import { dataViewFromBuffer } from '@mtcute/core/utils.js';
5
+ import { defaultCryptoProvider } from './platform.js';
4
6
  // some random 1024 bytes of entropy
5
7
  const DEFAULT_ENTROPY = `
6
8
  29afd26df40fb8ed10b6b4ad6d56ef5df9453f88e6ee6adb6e0544ba635dc6a8a990c9b8b980c343936b33fa7f97bae025102532233abb269c489920ef99021b
@@ -21,7 +23,7 @@ da91539fcc7b03d2b8b1381bd6023fff20278344ad944d364ba684842db3901c346335f0d455eda4
21
23
  fa3de8e50aac96c1275591a1221c32a60a1513370a33a228e00894341b10cf44a6ae6ac250d17a364e956ab1a17b068df3fb2d5b5a672d8a409eeb8b6ca1ade6
22
24
  `.replace(/\s/g, '');
23
25
  export function withFakeRandom(provider, source = DEFAULT_ENTROPY) {
24
- const sourceBytes = hexDecodeToBuffer(source);
26
+ const sourceBytes = getPlatform().hexDecode(source);
25
27
  let offset = 0;
26
28
  function getRandomValues(buf) {
27
29
  if (offset + buf.length > sourceBytes.length) {
@@ -30,15 +32,22 @@ export function withFakeRandom(provider, source = DEFAULT_ENTROPY) {
30
32
  buf.set(sourceBytes.subarray(offset, offset + buf.length));
31
33
  offset += buf.length;
32
34
  }
33
- provider.randomFill = getRandomValues;
34
- return provider;
35
+ return new Proxy(provider, {
36
+ get(target, prop, receiver) {
37
+ if (prop === 'randomFill')
38
+ return getRandomValues;
39
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-return
40
+ return Reflect.get(target, prop, receiver);
41
+ },
42
+ });
35
43
  }
36
44
  export function useFakeMathRandom(source = DEFAULT_ENTROPY) {
45
+ const sourceBytes = getPlatform().hexDecode(source);
46
+ const dv = dataViewFromBuffer(sourceBytes);
37
47
  beforeEach(() => {
38
- const sourceBytes = hexDecodeToBuffer(source);
39
48
  let offset = 0;
40
49
  vi.spyOn(globalThis.Math, 'random').mockImplementation(() => {
41
- const ret = dataViewFromBuffer(sourceBytes).getUint32(offset, true) / 0xffffffff;
50
+ const ret = dv.getUint32(offset, true) / 0xffffffff;
42
51
  offset += 4;
43
52
  return ret;
44
53
  });
@@ -48,12 +57,13 @@ export function useFakeMathRandom(source = DEFAULT_ENTROPY) {
48
57
  });
49
58
  }
50
59
  export async function defaultTestCryptoProvider(source = DEFAULT_ENTROPY) {
51
- const prov = withFakeRandom(defaultCryptoProviderFactory(), source);
60
+ const prov = withFakeRandom(defaultCryptoProvider, source);
52
61
  await prov.initialize?.();
53
62
  return prov;
54
63
  }
55
64
  export function testCryptoProvider(c) {
56
65
  beforeAll(() => c.initialize?.());
66
+ const p = getPlatform();
57
67
  function gzipSyncWrap(data) {
58
68
  if (import.meta.env.TEST_ENV === 'browser') {
59
69
  // @ts-expect-error fucking crutch because @jspm/core uses Buffer.isBuffer for some reason
@@ -71,53 +81,53 @@ export function testCryptoProvider(c) {
71
81
  return inflateSync(data);
72
82
  }
73
83
  it('should calculate sha1', () => {
74
- expect(hexEncode(c.sha1(utf8EncodeToBuffer('')))).to.eq('da39a3ee5e6b4b0d3255bfef95601890afd80709');
75
- expect(hexEncode(c.sha1(utf8EncodeToBuffer('hello')))).to.eq('aaf4c61ddcc5e8a2dabede0f3b482cd9aea9434d');
76
- expect(hexEncode(c.sha1(hexDecodeToBuffer('aebb1f')))).to.eq('62849d15c5dea495916c5eea8dba5f9551288850');
84
+ expect(p.hexEncode(c.sha1(p.utf8Encode('')))).to.eq('da39a3ee5e6b4b0d3255bfef95601890afd80709');
85
+ expect(p.hexEncode(c.sha1(p.utf8Encode('hello')))).to.eq('aaf4c61ddcc5e8a2dabede0f3b482cd9aea9434d');
86
+ expect(p.hexEncode(c.sha1(p.hexDecode('aebb1f')))).to.eq('62849d15c5dea495916c5eea8dba5f9551288850');
77
87
  });
78
88
  it('should calculate sha256', () => {
79
- expect(hexEncode(c.sha256(utf8EncodeToBuffer('')))).to.eq('e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855');
80
- expect(hexEncode(c.sha256(utf8EncodeToBuffer('hello')))).to.eq('2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824');
81
- expect(hexEncode(c.sha256(hexDecodeToBuffer('aebb1f')))).to.eq('2d29658aba48f2b286fe8bbddb931b7ad297e5adb5b9a6fc3aab67ef7fbf4e80');
89
+ expect(p.hexEncode(c.sha256(p.utf8Encode('')))).to.eq('e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855');
90
+ expect(p.hexEncode(c.sha256(p.utf8Encode('hello')))).to.eq('2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824');
91
+ expect(p.hexEncode(c.sha256(p.hexDecode('aebb1f')))).to.eq('2d29658aba48f2b286fe8bbddb931b7ad297e5adb5b9a6fc3aab67ef7fbf4e80');
82
92
  });
83
93
  it('should calculate hmac-sha256', async () => {
84
- const key = hexDecodeToBuffer('aaeeff');
85
- expect(hexEncode(await c.hmacSha256(utf8EncodeToBuffer(''), key))).to.eq('642711307c9e4437df09d6ebaa6bdc1b3a810c7f15c50fd1d0f8d7d5490f44dd');
86
- expect(hexEncode(await c.hmacSha256(utf8EncodeToBuffer('hello'), key))).to.eq('39b00bab151f9868e6501655c580b5542954711181243474d46b894703b1c1c2');
87
- expect(hexEncode(await c.hmacSha256(hexDecodeToBuffer('aebb1f'), key))).to.eq('a3a7273871808711cab17aba14f58e96f63f3ccfc5097d206f0f00ead2c3dd35');
94
+ const key = p.hexDecode('aaeeff');
95
+ expect(p.hexEncode(await c.hmacSha256(p.utf8Encode(''), key))).to.eq('642711307c9e4437df09d6ebaa6bdc1b3a810c7f15c50fd1d0f8d7d5490f44dd');
96
+ expect(p.hexEncode(await c.hmacSha256(p.utf8Encode('hello'), key))).to.eq('39b00bab151f9868e6501655c580b5542954711181243474d46b894703b1c1c2');
97
+ expect(p.hexEncode(await c.hmacSha256(p.hexDecode('aebb1f'), key))).to.eq('a3a7273871808711cab17aba14f58e96f63f3ccfc5097d206f0f00ead2c3dd35');
88
98
  });
89
99
  it('should derive pbkdf2 key', async () => {
90
- expect(hexEncode(await c.pbkdf2(utf8EncodeToBuffer('pbkdf2 test'), utf8EncodeToBuffer('some salt'), 10))).to.eq('e43276cfa27f135f261cec8ddcf593fd74ec251038e459c165461f2308f3a7235e0744ee1aed9710b00db28d1a2112e20fea3601c60e770ac57ffe6b33ca8be1');
100
+ expect(p.hexEncode(await c.pbkdf2(p.utf8Encode('pbkdf2 test'), p.utf8Encode('some salt'), 10))).to.eq('e43276cfa27f135f261cec8ddcf593fd74ec251038e459c165461f2308f3a7235e0744ee1aed9710b00db28d1a2112e20fea3601c60e770ac57ffe6b33ca8be1');
91
101
  });
92
102
  it('should encrypt and decrypt aes-ctr', () => {
93
- let aes = c.createAesCtr(hexDecodeToBuffer('d450aae0bf0060a4af1044886b42a13f7c506b35255d134a7e87ab3f23a9493b'), hexDecodeToBuffer('0182de2bd789c295c3c6c875c5e9e190'), true);
94
- const data = hexDecodeToBuffer('7baae571e4c2f4cfadb1931d5923aca7');
95
- expect(hexEncode(aes.process(data))).eq('df5647dbb70bc393f2fb05b72f42286f');
96
- expect(hexEncode(aes.process(data))).eq('3917147082672516b3177150129bc579');
97
- expect(hexEncode(aes.process(data))).eq('2a7a9089270a5de45d5e3dd399cac725');
98
- expect(hexEncode(aes.process(data))).eq('56d085217771398ac13583de4d677dd8');
99
- expect(hexEncode(aes.process(data))).eq('cc639b488126cf36e79c4515e8012b92');
100
- expect(hexEncode(aes.process(data))).eq('01384d100646cd562cc5586ec3f8f8c4');
103
+ let aes = c.createAesCtr(p.hexDecode('d450aae0bf0060a4af1044886b42a13f7c506b35255d134a7e87ab3f23a9493b'), p.hexDecode('0182de2bd789c295c3c6c875c5e9e190'), true);
104
+ const data = p.hexDecode('7baae571e4c2f4cfadb1931d5923aca7');
105
+ expect(p.hexEncode(aes.process(data))).eq('df5647dbb70bc393f2fb05b72f42286f');
106
+ expect(p.hexEncode(aes.process(data))).eq('3917147082672516b3177150129bc579');
107
+ expect(p.hexEncode(aes.process(data))).eq('2a7a9089270a5de45d5e3dd399cac725');
108
+ expect(p.hexEncode(aes.process(data))).eq('56d085217771398ac13583de4d677dd8');
109
+ expect(p.hexEncode(aes.process(data))).eq('cc639b488126cf36e79c4515e8012b92');
110
+ expect(p.hexEncode(aes.process(data))).eq('01384d100646cd562cc5586ec3f8f8c4');
101
111
  aes.close?.();
102
- aes = c.createAesCtr(hexDecodeToBuffer('d450aae0bf0060a4af1044886b42a13f7c506b35255d134a7e87ab3f23a9493b'), hexDecodeToBuffer('0182de2bd789c295c3c6c875c5e9e190'), false);
103
- expect(hexEncode(aes.process(hexDecodeToBuffer('df5647dbb70bc393f2fb05b72f42286f')))).eq(hexEncode(data));
104
- expect(hexEncode(aes.process(hexDecodeToBuffer('3917147082672516b3177150129bc579')))).eq(hexEncode(data));
105
- expect(hexEncode(aes.process(hexDecodeToBuffer('2a7a9089270a5de45d5e3dd399cac725')))).eq(hexEncode(data));
106
- expect(hexEncode(aes.process(hexDecodeToBuffer('56d085217771398ac13583de4d677dd8')))).eq(hexEncode(data));
107
- expect(hexEncode(aes.process(hexDecodeToBuffer('cc639b488126cf36e79c4515e8012b92')))).eq(hexEncode(data));
108
- expect(hexEncode(aes.process(hexDecodeToBuffer('01384d100646cd562cc5586ec3f8f8c4')))).eq(hexEncode(data));
112
+ aes = c.createAesCtr(p.hexDecode('d450aae0bf0060a4af1044886b42a13f7c506b35255d134a7e87ab3f23a9493b'), p.hexDecode('0182de2bd789c295c3c6c875c5e9e190'), false);
113
+ expect(p.hexEncode(aes.process(p.hexDecode('df5647dbb70bc393f2fb05b72f42286f')))).eq(p.hexEncode(data));
114
+ expect(p.hexEncode(aes.process(p.hexDecode('3917147082672516b3177150129bc579')))).eq(p.hexEncode(data));
115
+ expect(p.hexEncode(aes.process(p.hexDecode('2a7a9089270a5de45d5e3dd399cac725')))).eq(p.hexEncode(data));
116
+ expect(p.hexEncode(aes.process(p.hexDecode('56d085217771398ac13583de4d677dd8')))).eq(p.hexEncode(data));
117
+ expect(p.hexEncode(aes.process(p.hexDecode('cc639b488126cf36e79c4515e8012b92')))).eq(p.hexEncode(data));
118
+ expect(p.hexEncode(aes.process(p.hexDecode('01384d100646cd562cc5586ec3f8f8c4')))).eq(p.hexEncode(data));
109
119
  aes.close?.();
110
120
  });
111
121
  it('should encrypt and decrypt aes-ige', () => {
112
- const aes = c.createAesIge(hexDecodeToBuffer('5468697320697320616E20696D706C655468697320697320616E20696D706C65'), hexDecodeToBuffer('6D656E746174696F6E206F6620494745206D6F646520666F72204F70656E5353'));
113
- expect(hexEncode(aes.encrypt(hexDecodeToBuffer('99706487a1cde613bc6de0b6f24b1c7aa448c8b9c3403e3467a8cad89340f53b')))).to.eq('792ea8ae577b1a66cb3bd92679b8030ca54ee631976bd3a04547fdcb4639fa69');
114
- expect(hexEncode(aes.decrypt(hexDecodeToBuffer('792ea8ae577b1a66cb3bd92679b8030ca54ee631976bd3a04547fdcb4639fa69')))).to.eq('99706487a1cde613bc6de0b6f24b1c7aa448c8b9c3403e3467a8cad89340f53b');
122
+ const aes = c.createAesIge(p.hexDecode('5468697320697320616E20696D706C655468697320697320616E20696D706C65'), p.hexDecode('6D656E746174696F6E206F6620494745206D6F646520666F72204F70656E5353'));
123
+ expect(p.hexEncode(aes.encrypt(p.hexDecode('99706487a1cde613bc6de0b6f24b1c7aa448c8b9c3403e3467a8cad89340f53b')))).to.eq('792ea8ae577b1a66cb3bd92679b8030ca54ee631976bd3a04547fdcb4639fa69');
124
+ expect(p.hexEncode(aes.decrypt(p.hexDecode('792ea8ae577b1a66cb3bd92679b8030ca54ee631976bd3a04547fdcb4639fa69')))).to.eq('99706487a1cde613bc6de0b6f24b1c7aa448c8b9c3403e3467a8cad89340f53b');
115
125
  });
116
126
  it('should decompose PQ to prime factors P and Q', async () => {
117
- const testFactorization = async (pq, p, q) => {
118
- const [p1, q1] = await c.factorizePQ(hexDecodeToBuffer(pq));
119
- expect(hexEncode(p1)).eq(p.toLowerCase());
120
- expect(hexEncode(q1)).eq(q.toLowerCase());
127
+ const testFactorization = async (pq, p_, q) => {
128
+ const [p1, q1] = await c.factorizePQ(p.hexDecode(pq));
129
+ expect(p.hexEncode(p1)).eq(p_.toLowerCase());
130
+ expect(p.hexEncode(q1)).eq(q.toLowerCase());
121
131
  };
122
132
  // from samples at https://core.telegram.org/mtproto/samples-auth_key
123
133
  await testFactorization('17ED48941A08F981', '494C553B', '53911073');
@@ -132,13 +142,13 @@ export function testCryptoProvider(c) {
132
142
  expect(compressed).not.toBeNull();
133
143
  const decompressed = inflateSyncWrap(compressed);
134
144
  expect(compressed.length).toBeLessThan(data.length);
135
- expect(hexEncode(decompressed)).toEqual(hexEncode(data));
145
+ expect(p.hexEncode(decompressed)).toEqual(p.hexEncode(data));
136
146
  });
137
147
  it('should correctly gunzip', () => {
138
148
  const data = new Uint8Array(1000).fill(0x42);
139
149
  const compressed = gzipSyncWrap(data);
140
150
  const decompressed = c.gunzip(compressed);
141
- expect(hexEncode(decompressed)).toEqual(hexEncode(data));
151
+ expect(p.hexEncode(decompressed)).toEqual(p.hexEncode(data));
142
152
  });
143
153
  describe('randomBytes', () => {
144
154
  it('should return exactly N bytes', () => {
@@ -158,7 +168,7 @@ export function testCryptoProvider(c) {
158
168
  });
159
169
  }
160
170
  export function u8HexDecode(hex) {
161
- const buf = hexDecodeToBuffer(hex);
171
+ const buf = getPlatform().hexDecode(hex);
162
172
  // eslint-disable-next-line no-restricted-globals
163
173
  if ((import.meta.env.TEST_ENV === 'node' || import.meta.env.TEST_ENV === 'bun') && Buffer.isBuffer(buf)) {
164
174
  return new Uint8Array(buf);
package/esm/crypto.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"crypto.js","sourceRoot":"","sources":["../../src/crypto.ts"],"names":[],"mappings":"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","sourcesContent":["import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from 'vitest'\nimport { gzipSync, inflateSync } from 'zlib'\n\nimport {\n dataViewFromBuffer,\n defaultCryptoProviderFactory,\n hexDecodeToBuffer,\n hexEncode,\n ICryptoProvider,\n utf8EncodeToBuffer,\n} from '@mtcute/core/utils.js'\n\n// some random 1024 bytes of entropy\nconst DEFAULT_ENTROPY = `\n29afd26df40fb8ed10b6b4ad6d56ef5df9453f88e6ee6adb6e0544ba635dc6a8a990c9b8b980c343936b33fa7f97bae025102532233abb269c489920ef99021b\n259ce3a2c964c5c8972b4a84ff96f3375a94b535a9468f2896e2080ac7a32ed58e910474a4b02415e07671cbb5bdd58a5dd26fd137c4c98b8c346571fae6ead3\n9dfd612bd6b480b6723433f5218e9d6e271591153fb3ffefc089f7e848d3f4633459fff66b33cf939e5655813149fa34be8625f9bc4814d1ee6cf40e4d0de229\n1aa22e68c8ad8cc698103734f9aaf79f2bdc052a787a7a9b3629d1ed38750f88cb0481c0ba30a9c611672f9a4d1dc02637abb4e98913ee810a3b152d3d75f25d\n7efdc263c08833569968b1771ebbe843d187e2c917d9ad8e8865e44b69f7b74d72ab86a4ef1891dce196ee11a7c9d7d8074fc0450e745bd3a827d77bb0820b90\n3055dc15f0abd897ea740a99606b64d28968d770b5e43492ddbf07a7c75104d3e522be9b72050c0fdae8412cdf49014be21105b87a06cb7202dd580387adc007\n6280d98b015a1a413819d817f007939d1490467a1ef85a345584c7e594bb729c12a1233f806e515e7088360219dfa109264310ba84777b93eb1ad3c40727a25a\na5d9cdd6748c6ab2ca0bd4daa2ba8225bce2b066a163bcacf05609fc84055bb86a4742c28addd7d7ab8d87b64cfde0b3f4b3bc8e05f3d0a1a2fadb294860e099\na10b3721b0d5b28918b8fb49a18a82a0fde6680a64ed915637805e35ffe8b2c1d4177ec10d10eaaf24425e0351b6a89e794944e1aa82eb5c0210a37da66cccac\n895398cf915a8aa141f611521fc258514a99c02721113942c66f2c9a8f9601ff0044a953d17a47b07ad1b5f8725cc020a1a5239be65db0a43d42c206903740f0\n27c3f749ecfff2e646570118cd54db2fec392b44d8eb8377309f3e4d164dbc0530914b117b9d278b06db8359d97442d4dcbcaff93cd9a08a6b06a5ba8725d0d7\n06b313a5d792be254d33e087b7a4fafcdf819941b9bec4c6057d4c050bd01eb243efd4e6b707281b127820a2b734c6d8f6b2131bf0b5b215c7a798ff3fe90ceb\nda91539fcc7b03d2b8b1381bd6023fff20278344ad944d364ba684842db3901c346335f0d455eda414f99c1e794a86aa3a90bcc6e085eecb0b4bf61198d16ed3\n89cfa495f977a37a51502b2f60649f2efd7d89c757b6366776ba4c0612017bf1fbfc682dd62e9960d39cbea854d2dcc708b1db5d268192954d13ee72c0bb1bd8\n558a3cf3b02b1cd795b40f7a57780391bb8724883d3f7764846c3823e165b3f8c025f59d896905f9a955478586ce57f820d958a01aa59a4cace7ecdf125df334\nfa3de8e50aac96c1275591a1221c32a60a1513370a33a228e00894341b10cf44a6ae6ac250d17a364e956ab1a17b068df3fb2d5b5a672d8a409eeb8b6ca1ade6\n`.replace(/\\s/g, '')\n\nexport function withFakeRandom(provider: ICryptoProvider, source = DEFAULT_ENTROPY): ICryptoProvider {\n const sourceBytes = hexDecodeToBuffer(source)\n let offset = 0\n\n function getRandomValues(buf: Uint8Array) {\n if (offset + buf.length > sourceBytes.length) {\n throw new Error('not enough entropy')\n }\n\n buf.set(sourceBytes.subarray(offset, offset + buf.length))\n offset += buf.length\n }\n\n provider.randomFill = getRandomValues\n\n return provider\n}\n\nexport function useFakeMathRandom(source = DEFAULT_ENTROPY): void {\n beforeEach(() => {\n const sourceBytes = hexDecodeToBuffer(source)\n let offset = 0\n\n vi.spyOn(globalThis.Math, 'random').mockImplementation(() => {\n const ret = dataViewFromBuffer(sourceBytes).getUint32(offset, true) / 0xffffffff\n offset += 4\n\n return ret\n })\n })\n afterEach(() => {\n vi.spyOn(globalThis.Math, 'random').mockRestore()\n })\n}\n\nexport async function defaultTestCryptoProvider(source = DEFAULT_ENTROPY): Promise<ICryptoProvider> {\n const prov = withFakeRandom(defaultCryptoProviderFactory(), source)\n await prov.initialize?.()\n\n return prov\n}\n\nexport function testCryptoProvider(c: ICryptoProvider): void {\n beforeAll(() => c.initialize?.())\n\n function gzipSyncWrap(data: Uint8Array) {\n if (import.meta.env.TEST_ENV === 'browser') {\n // @ts-expect-error fucking crutch because @jspm/core uses Buffer.isBuffer for some reason\n data._isBuffer = true\n\n return new Uint8Array(gzipSync(data))\n }\n\n return gzipSync(data)\n }\n\n function inflateSyncWrap(data: Uint8Array) {\n if (import.meta.env.TEST_ENV === 'browser') {\n // @ts-expect-error fucking crutch because @jspm/core uses Buffer.isBuffer for some reason\n data._isBuffer = true\n\n return new Uint8Array(inflateSync(data))\n }\n\n return inflateSync(data)\n }\n\n it('should calculate sha1', () => {\n expect(hexEncode(c.sha1(utf8EncodeToBuffer('')))).to.eq('da39a3ee5e6b4b0d3255bfef95601890afd80709')\n expect(hexEncode(c.sha1(utf8EncodeToBuffer('hello')))).to.eq('aaf4c61ddcc5e8a2dabede0f3b482cd9aea9434d')\n expect(hexEncode(c.sha1(hexDecodeToBuffer('aebb1f')))).to.eq('62849d15c5dea495916c5eea8dba5f9551288850')\n })\n\n it('should calculate sha256', () => {\n expect(hexEncode(c.sha256(utf8EncodeToBuffer('')))).to.eq(\n 'e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855',\n )\n expect(hexEncode(c.sha256(utf8EncodeToBuffer('hello')))).to.eq(\n '2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824',\n )\n expect(hexEncode(c.sha256(hexDecodeToBuffer('aebb1f')))).to.eq(\n '2d29658aba48f2b286fe8bbddb931b7ad297e5adb5b9a6fc3aab67ef7fbf4e80',\n )\n })\n\n it('should calculate hmac-sha256', async () => {\n const key = hexDecodeToBuffer('aaeeff')\n\n expect(hexEncode(await c.hmacSha256(utf8EncodeToBuffer(''), key))).to.eq(\n '642711307c9e4437df09d6ebaa6bdc1b3a810c7f15c50fd1d0f8d7d5490f44dd',\n )\n expect(hexEncode(await c.hmacSha256(utf8EncodeToBuffer('hello'), key))).to.eq(\n '39b00bab151f9868e6501655c580b5542954711181243474d46b894703b1c1c2',\n )\n expect(hexEncode(await c.hmacSha256(hexDecodeToBuffer('aebb1f'), key))).to.eq(\n 'a3a7273871808711cab17aba14f58e96f63f3ccfc5097d206f0f00ead2c3dd35',\n )\n })\n\n it('should derive pbkdf2 key', async () => {\n expect(hexEncode(await c.pbkdf2(utf8EncodeToBuffer('pbkdf2 test'), utf8EncodeToBuffer('some salt'), 10))).to.eq(\n 'e43276cfa27f135f261cec8ddcf593fd74ec251038e459c165461f2308f3a7235e0744ee1aed9710b00db28d1a2112e20fea3601c60e770ac57ffe6b33ca8be1',\n )\n })\n\n it('should encrypt and decrypt aes-ctr', () => {\n let aes = c.createAesCtr(\n hexDecodeToBuffer('d450aae0bf0060a4af1044886b42a13f7c506b35255d134a7e87ab3f23a9493b'),\n hexDecodeToBuffer('0182de2bd789c295c3c6c875c5e9e190'),\n true,\n )\n\n const data = hexDecodeToBuffer('7baae571e4c2f4cfadb1931d5923aca7')\n expect(hexEncode(aes.process(data))).eq('df5647dbb70bc393f2fb05b72f42286f')\n expect(hexEncode(aes.process(data))).eq('3917147082672516b3177150129bc579')\n expect(hexEncode(aes.process(data))).eq('2a7a9089270a5de45d5e3dd399cac725')\n expect(hexEncode(aes.process(data))).eq('56d085217771398ac13583de4d677dd8')\n expect(hexEncode(aes.process(data))).eq('cc639b488126cf36e79c4515e8012b92')\n expect(hexEncode(aes.process(data))).eq('01384d100646cd562cc5586ec3f8f8c4')\n\n aes.close?.()\n aes = c.createAesCtr(\n hexDecodeToBuffer('d450aae0bf0060a4af1044886b42a13f7c506b35255d134a7e87ab3f23a9493b'),\n hexDecodeToBuffer('0182de2bd789c295c3c6c875c5e9e190'),\n false,\n )\n\n expect(hexEncode(aes.process(hexDecodeToBuffer('df5647dbb70bc393f2fb05b72f42286f')))).eq(hexEncode(data))\n expect(hexEncode(aes.process(hexDecodeToBuffer('3917147082672516b3177150129bc579')))).eq(hexEncode(data))\n expect(hexEncode(aes.process(hexDecodeToBuffer('2a7a9089270a5de45d5e3dd399cac725')))).eq(hexEncode(data))\n expect(hexEncode(aes.process(hexDecodeToBuffer('56d085217771398ac13583de4d677dd8')))).eq(hexEncode(data))\n expect(hexEncode(aes.process(hexDecodeToBuffer('cc639b488126cf36e79c4515e8012b92')))).eq(hexEncode(data))\n expect(hexEncode(aes.process(hexDecodeToBuffer('01384d100646cd562cc5586ec3f8f8c4')))).eq(hexEncode(data))\n\n aes.close?.()\n })\n\n it('should encrypt and decrypt aes-ige', () => {\n const aes = c.createAesIge(\n hexDecodeToBuffer('5468697320697320616E20696D706C655468697320697320616E20696D706C65'),\n hexDecodeToBuffer('6D656E746174696F6E206F6620494745206D6F646520666F72204F70656E5353'),\n )\n expect(\n hexEncode(\n aes.encrypt(hexDecodeToBuffer('99706487a1cde613bc6de0b6f24b1c7aa448c8b9c3403e3467a8cad89340f53b')),\n ),\n ).to.eq('792ea8ae577b1a66cb3bd92679b8030ca54ee631976bd3a04547fdcb4639fa69')\n expect(\n hexEncode(\n aes.decrypt(hexDecodeToBuffer('792ea8ae577b1a66cb3bd92679b8030ca54ee631976bd3a04547fdcb4639fa69')),\n ),\n ).to.eq('99706487a1cde613bc6de0b6f24b1c7aa448c8b9c3403e3467a8cad89340f53b')\n })\n\n it(\n 'should decompose PQ to prime factors P and Q',\n async () => {\n const testFactorization = async (pq: string, p: string, q: string) => {\n const [p1, q1] = await c.factorizePQ(hexDecodeToBuffer(pq))\n expect(hexEncode(p1)).eq(p.toLowerCase())\n expect(hexEncode(q1)).eq(q.toLowerCase())\n }\n\n // from samples at https://core.telegram.org/mtproto/samples-auth_key\n await testFactorization('17ED48941A08F981', '494C553B', '53911073')\n // random example\n await testFactorization('14fcab4dfc861f45', '494c5c99', '494c778d')\n },\n // since PQ factorization relies on RNG, it may take a while (or may not!)\n { timeout: 10000 },\n )\n\n it('should correctly gzip', () => {\n const data = new Uint8Array(1000).fill(0x42)\n\n const compressed = c.gzip(data, 100)\n\n expect(compressed).not.toBeNull()\n\n const decompressed = inflateSyncWrap(compressed!)\n\n expect(compressed!.length).toBeLessThan(data.length)\n expect(hexEncode(decompressed)).toEqual(hexEncode(data))\n })\n\n it('should correctly gunzip', () => {\n const data = new Uint8Array(1000).fill(0x42)\n\n const compressed = gzipSyncWrap(data)\n const decompressed = c.gunzip(compressed)\n\n expect(hexEncode(decompressed)).toEqual(hexEncode(data))\n })\n\n describe('randomBytes', () => {\n it('should return exactly N bytes', () => {\n expect(c.randomBytes(0).length).eq(0)\n expect(c.randomBytes(5).length).eq(5)\n expect(c.randomBytes(10).length).eq(10)\n expect(c.randomBytes(256).length).eq(256)\n })\n\n it('should not be deterministic', () => {\n expect([...c.randomBytes(8)]).not.eql([...c.randomBytes(8)])\n })\n\n it('should use randomFill', () => {\n const spy = vi.spyOn(c, 'randomFill')\n c.randomBytes(8)\n\n expect(spy).toHaveBeenCalled()\n })\n })\n}\n\nexport function u8HexDecode(hex: string) {\n const buf = hexDecodeToBuffer(hex)\n\n // eslint-disable-next-line no-restricted-globals\n if ((import.meta.env.TEST_ENV === 'node' || import.meta.env.TEST_ENV === 'bun') && Buffer.isBuffer(buf)) {\n return new Uint8Array(buf)\n }\n\n return buf\n}\n"]}
1
+ {"version":3,"file":"crypto.js","sourceRoot":"","sources":["../../src/crypto.ts"],"names":[],"mappings":"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","sourcesContent":["import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from 'vitest'\nimport { gzipSync, inflateSync } from 'zlib'\n\nimport { getPlatform } from '@mtcute/core/platform.js'\nimport { dataViewFromBuffer, ICryptoProvider } from '@mtcute/core/utils.js'\n\nimport { defaultCryptoProvider } from './platform.js'\n\n// some random 1024 bytes of entropy\nconst DEFAULT_ENTROPY = `\n29afd26df40fb8ed10b6b4ad6d56ef5df9453f88e6ee6adb6e0544ba635dc6a8a990c9b8b980c343936b33fa7f97bae025102532233abb269c489920ef99021b\n259ce3a2c964c5c8972b4a84ff96f3375a94b535a9468f2896e2080ac7a32ed58e910474a4b02415e07671cbb5bdd58a5dd26fd137c4c98b8c346571fae6ead3\n9dfd612bd6b480b6723433f5218e9d6e271591153fb3ffefc089f7e848d3f4633459fff66b33cf939e5655813149fa34be8625f9bc4814d1ee6cf40e4d0de229\n1aa22e68c8ad8cc698103734f9aaf79f2bdc052a787a7a9b3629d1ed38750f88cb0481c0ba30a9c611672f9a4d1dc02637abb4e98913ee810a3b152d3d75f25d\n7efdc263c08833569968b1771ebbe843d187e2c917d9ad8e8865e44b69f7b74d72ab86a4ef1891dce196ee11a7c9d7d8074fc0450e745bd3a827d77bb0820b90\n3055dc15f0abd897ea740a99606b64d28968d770b5e43492ddbf07a7c75104d3e522be9b72050c0fdae8412cdf49014be21105b87a06cb7202dd580387adc007\n6280d98b015a1a413819d817f007939d1490467a1ef85a345584c7e594bb729c12a1233f806e515e7088360219dfa109264310ba84777b93eb1ad3c40727a25a\na5d9cdd6748c6ab2ca0bd4daa2ba8225bce2b066a163bcacf05609fc84055bb86a4742c28addd7d7ab8d87b64cfde0b3f4b3bc8e05f3d0a1a2fadb294860e099\na10b3721b0d5b28918b8fb49a18a82a0fde6680a64ed915637805e35ffe8b2c1d4177ec10d10eaaf24425e0351b6a89e794944e1aa82eb5c0210a37da66cccac\n895398cf915a8aa141f611521fc258514a99c02721113942c66f2c9a8f9601ff0044a953d17a47b07ad1b5f8725cc020a1a5239be65db0a43d42c206903740f0\n27c3f749ecfff2e646570118cd54db2fec392b44d8eb8377309f3e4d164dbc0530914b117b9d278b06db8359d97442d4dcbcaff93cd9a08a6b06a5ba8725d0d7\n06b313a5d792be254d33e087b7a4fafcdf819941b9bec4c6057d4c050bd01eb243efd4e6b707281b127820a2b734c6d8f6b2131bf0b5b215c7a798ff3fe90ceb\nda91539fcc7b03d2b8b1381bd6023fff20278344ad944d364ba684842db3901c346335f0d455eda414f99c1e794a86aa3a90bcc6e085eecb0b4bf61198d16ed3\n89cfa495f977a37a51502b2f60649f2efd7d89c757b6366776ba4c0612017bf1fbfc682dd62e9960d39cbea854d2dcc708b1db5d268192954d13ee72c0bb1bd8\n558a3cf3b02b1cd795b40f7a57780391bb8724883d3f7764846c3823e165b3f8c025f59d896905f9a955478586ce57f820d958a01aa59a4cace7ecdf125df334\nfa3de8e50aac96c1275591a1221c32a60a1513370a33a228e00894341b10cf44a6ae6ac250d17a364e956ab1a17b068df3fb2d5b5a672d8a409eeb8b6ca1ade6\n`.replace(/\\s/g, '')\n\nexport function withFakeRandom(provider: ICryptoProvider, source = DEFAULT_ENTROPY): ICryptoProvider {\n const sourceBytes = getPlatform().hexDecode(source)\n let offset = 0\n\n function getRandomValues(buf: Uint8Array) {\n if (offset + buf.length > sourceBytes.length) {\n throw new Error('not enough entropy')\n }\n\n buf.set(sourceBytes.subarray(offset, offset + buf.length))\n offset += buf.length\n }\n\n return new Proxy<ICryptoProvider>(provider, {\n get(target, prop, receiver) {\n if (prop === 'randomFill') return getRandomValues\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n return Reflect.get(target, prop, receiver)\n },\n })\n}\n\nexport function useFakeMathRandom(source = DEFAULT_ENTROPY): void {\n const sourceBytes = getPlatform().hexDecode(source)\n const dv = dataViewFromBuffer(sourceBytes)\n\n beforeEach(() => {\n let offset = 0\n\n vi.spyOn(globalThis.Math, 'random').mockImplementation(() => {\n const ret = dv.getUint32(offset, true) / 0xffffffff\n offset += 4\n\n return ret\n })\n })\n afterEach(() => {\n vi.spyOn(globalThis.Math, 'random').mockRestore()\n })\n}\n\nexport async function defaultTestCryptoProvider(source = DEFAULT_ENTROPY): Promise<ICryptoProvider> {\n const prov = withFakeRandom(defaultCryptoProvider, source)\n await prov.initialize?.()\n\n return prov\n}\n\nexport function testCryptoProvider(c: ICryptoProvider): void {\n beforeAll(() => c.initialize?.())\n\n const p = getPlatform()\n\n function gzipSyncWrap(data: Uint8Array) {\n if (import.meta.env.TEST_ENV === 'browser') {\n // @ts-expect-error fucking crutch because @jspm/core uses Buffer.isBuffer for some reason\n data._isBuffer = true\n\n return new Uint8Array(gzipSync(data))\n }\n\n return gzipSync(data)\n }\n\n function inflateSyncWrap(data: Uint8Array) {\n if (import.meta.env.TEST_ENV === 'browser') {\n // @ts-expect-error fucking crutch because @jspm/core uses Buffer.isBuffer for some reason\n data._isBuffer = true\n\n return new Uint8Array(inflateSync(data))\n }\n\n return inflateSync(data)\n }\n\n it('should calculate sha1', () => {\n expect(p.hexEncode(c.sha1(p.utf8Encode('')))).to.eq('da39a3ee5e6b4b0d3255bfef95601890afd80709')\n expect(p.hexEncode(c.sha1(p.utf8Encode('hello')))).to.eq('aaf4c61ddcc5e8a2dabede0f3b482cd9aea9434d')\n expect(p.hexEncode(c.sha1(p.hexDecode('aebb1f')))).to.eq('62849d15c5dea495916c5eea8dba5f9551288850')\n })\n\n it('should calculate sha256', () => {\n expect(p.hexEncode(c.sha256(p.utf8Encode('')))).to.eq(\n 'e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855',\n )\n expect(p.hexEncode(c.sha256(p.utf8Encode('hello')))).to.eq(\n '2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824',\n )\n expect(p.hexEncode(c.sha256(p.hexDecode('aebb1f')))).to.eq(\n '2d29658aba48f2b286fe8bbddb931b7ad297e5adb5b9a6fc3aab67ef7fbf4e80',\n )\n })\n\n it('should calculate hmac-sha256', async () => {\n const key = p.hexDecode('aaeeff')\n\n expect(p.hexEncode(await c.hmacSha256(p.utf8Encode(''), key))).to.eq(\n '642711307c9e4437df09d6ebaa6bdc1b3a810c7f15c50fd1d0f8d7d5490f44dd',\n )\n expect(p.hexEncode(await c.hmacSha256(p.utf8Encode('hello'), key))).to.eq(\n '39b00bab151f9868e6501655c580b5542954711181243474d46b894703b1c1c2',\n )\n expect(p.hexEncode(await c.hmacSha256(p.hexDecode('aebb1f'), key))).to.eq(\n 'a3a7273871808711cab17aba14f58e96f63f3ccfc5097d206f0f00ead2c3dd35',\n )\n })\n\n it('should derive pbkdf2 key', async () => {\n expect(p.hexEncode(await c.pbkdf2(p.utf8Encode('pbkdf2 test'), p.utf8Encode('some salt'), 10))).to.eq(\n 'e43276cfa27f135f261cec8ddcf593fd74ec251038e459c165461f2308f3a7235e0744ee1aed9710b00db28d1a2112e20fea3601c60e770ac57ffe6b33ca8be1',\n )\n })\n\n it('should encrypt and decrypt aes-ctr', () => {\n let aes = c.createAesCtr(\n p.hexDecode('d450aae0bf0060a4af1044886b42a13f7c506b35255d134a7e87ab3f23a9493b'),\n p.hexDecode('0182de2bd789c295c3c6c875c5e9e190'),\n true,\n )\n\n const data = p.hexDecode('7baae571e4c2f4cfadb1931d5923aca7')\n expect(p.hexEncode(aes.process(data))).eq('df5647dbb70bc393f2fb05b72f42286f')\n expect(p.hexEncode(aes.process(data))).eq('3917147082672516b3177150129bc579')\n expect(p.hexEncode(aes.process(data))).eq('2a7a9089270a5de45d5e3dd399cac725')\n expect(p.hexEncode(aes.process(data))).eq('56d085217771398ac13583de4d677dd8')\n expect(p.hexEncode(aes.process(data))).eq('cc639b488126cf36e79c4515e8012b92')\n expect(p.hexEncode(aes.process(data))).eq('01384d100646cd562cc5586ec3f8f8c4')\n\n aes.close?.()\n aes = c.createAesCtr(\n p.hexDecode('d450aae0bf0060a4af1044886b42a13f7c506b35255d134a7e87ab3f23a9493b'),\n p.hexDecode('0182de2bd789c295c3c6c875c5e9e190'),\n false,\n )\n\n expect(p.hexEncode(aes.process(p.hexDecode('df5647dbb70bc393f2fb05b72f42286f')))).eq(p.hexEncode(data))\n expect(p.hexEncode(aes.process(p.hexDecode('3917147082672516b3177150129bc579')))).eq(p.hexEncode(data))\n expect(p.hexEncode(aes.process(p.hexDecode('2a7a9089270a5de45d5e3dd399cac725')))).eq(p.hexEncode(data))\n expect(p.hexEncode(aes.process(p.hexDecode('56d085217771398ac13583de4d677dd8')))).eq(p.hexEncode(data))\n expect(p.hexEncode(aes.process(p.hexDecode('cc639b488126cf36e79c4515e8012b92')))).eq(p.hexEncode(data))\n expect(p.hexEncode(aes.process(p.hexDecode('01384d100646cd562cc5586ec3f8f8c4')))).eq(p.hexEncode(data))\n\n aes.close?.()\n })\n\n it('should encrypt and decrypt aes-ige', () => {\n const aes = c.createAesIge(\n p.hexDecode('5468697320697320616E20696D706C655468697320697320616E20696D706C65'),\n p.hexDecode('6D656E746174696F6E206F6620494745206D6F646520666F72204F70656E5353'),\n )\n expect(\n p.hexEncode(aes.encrypt(p.hexDecode('99706487a1cde613bc6de0b6f24b1c7aa448c8b9c3403e3467a8cad89340f53b'))),\n ).to.eq('792ea8ae577b1a66cb3bd92679b8030ca54ee631976bd3a04547fdcb4639fa69')\n expect(\n p.hexEncode(aes.decrypt(p.hexDecode('792ea8ae577b1a66cb3bd92679b8030ca54ee631976bd3a04547fdcb4639fa69'))),\n ).to.eq('99706487a1cde613bc6de0b6f24b1c7aa448c8b9c3403e3467a8cad89340f53b')\n })\n\n it(\n 'should decompose PQ to prime factors P and Q',\n async () => {\n const testFactorization = async (pq: string, p_: string, q: string) => {\n const [p1, q1] = await c.factorizePQ(p.hexDecode(pq))\n expect(p.hexEncode(p1)).eq(p_.toLowerCase())\n expect(p.hexEncode(q1)).eq(q.toLowerCase())\n }\n\n // from samples at https://core.telegram.org/mtproto/samples-auth_key\n await testFactorization('17ED48941A08F981', '494C553B', '53911073')\n // random example\n await testFactorization('14fcab4dfc861f45', '494c5c99', '494c778d')\n },\n // since PQ factorization relies on RNG, it may take a while (or may not!)\n { timeout: 10000 },\n )\n\n it('should correctly gzip', () => {\n const data = new Uint8Array(1000).fill(0x42)\n\n const compressed = c.gzip(data, 100)\n\n expect(compressed).not.toBeNull()\n\n const decompressed = inflateSyncWrap(compressed!)\n\n expect(compressed!.length).toBeLessThan(data.length)\n expect(p.hexEncode(decompressed)).toEqual(p.hexEncode(data))\n })\n\n it('should correctly gunzip', () => {\n const data = new Uint8Array(1000).fill(0x42)\n\n const compressed = gzipSyncWrap(data)\n const decompressed = c.gunzip(compressed)\n\n expect(p.hexEncode(decompressed)).toEqual(p.hexEncode(data))\n })\n\n describe('randomBytes', () => {\n it('should return exactly N bytes', () => {\n expect(c.randomBytes(0).length).eq(0)\n expect(c.randomBytes(5).length).eq(5)\n expect(c.randomBytes(10).length).eq(10)\n expect(c.randomBytes(256).length).eq(256)\n })\n\n it('should not be deterministic', () => {\n expect([...c.randomBytes(8)]).not.eql([...c.randomBytes(8)])\n })\n\n it('should use randomFill', () => {\n const spy = vi.spyOn(c, 'randomFill')\n c.randomBytes(8)\n\n expect(spy).toHaveBeenCalled()\n })\n })\n}\n\nexport function u8HexDecode(hex: string) {\n const buf = getPlatform().hexDecode(hex)\n\n // eslint-disable-next-line no-restricted-globals\n if ((import.meta.env.TEST_ENV === 'node' || import.meta.env.TEST_ENV === 'bun') && Buffer.isBuffer(buf)) {\n return new Uint8Array(buf)\n }\n\n return buf\n}\n"]}
package/esm/index.d.ts CHANGED
@@ -1,5 +1,6 @@
1
1
  export * from './client.js';
2
2
  export * from './crypto.js';
3
+ export * from './platform.js';
3
4
  export * from './storage.js';
4
5
  export * from './storage/index.js';
5
6
  export * from './stub.js';
package/esm/index.js CHANGED
@@ -1,5 +1,6 @@
1
1
  export * from './client.js';
2
2
  export * from './crypto.js';
3
+ export * from './platform.js';
3
4
  export * from './storage.js';
4
5
  export * from './storage/index.js';
5
6
  export * from './stub.js';
package/esm/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAA;AAC3B,cAAc,aAAa,CAAA;AAC3B,cAAc,cAAc,CAAA;AAC5B,cAAc,oBAAoB,CAAA;AAClC,cAAc,WAAW,CAAA;AACzB,cAAc,gBAAgB,CAAA;AAC9B,cAAc,YAAY,CAAA","sourcesContent":["export * from './client.js'\nexport * from './crypto.js'\nexport * from './storage.js'\nexport * from './storage/index.js'\nexport * from './stub.js'\nexport * from './transport.js'\nexport * from './types.js'\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAA;AAC3B,cAAc,aAAa,CAAA;AAC3B,cAAc,eAAe,CAAA;AAC7B,cAAc,cAAc,CAAA;AAC5B,cAAc,oBAAoB,CAAA;AAClC,cAAc,WAAW,CAAA;AACzB,cAAc,gBAAgB,CAAA;AAC9B,cAAc,YAAY,CAAA","sourcesContent":["export * from './client.js'\nexport * from './crypto.js'\nexport * from './platform.js'\nexport * from './storage.js'\nexport * from './storage/index.js'\nexport * from './stub.js'\nexport * from './transport.js'\nexport * from './types.js'\n"]}
@@ -0,0 +1,3 @@
1
+ import { NodeCryptoProvider, NodePlatform } from '@mtcute/node';
2
+ export declare const defaultPlatform: NodePlatform;
3
+ export declare const defaultCryptoProvider: NodeCryptoProvider;
@@ -0,0 +1,4 @@
1
+ import { NodeCryptoProvider, NodePlatform } from '@mtcute/node';
2
+ export const defaultPlatform = new NodePlatform();
3
+ export const defaultCryptoProvider = new NodeCryptoProvider();
4
+ //# sourceMappingURL=platform.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"platform.js","sourceRoot":"","sources":["../../src/platform.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,YAAY,EAAE,MAAM,cAAc,CAAA;AAE/D,MAAM,CAAC,MAAM,eAAe,GAAG,IAAI,YAAY,EAAE,CAAA;AACjD,MAAM,CAAC,MAAM,qBAAqB,GAAG,IAAI,kBAAkB,EAAE,CAAA","sourcesContent":["import { NodeCryptoProvider, NodePlatform } from '@mtcute/node'\n\nexport const defaultPlatform = new NodePlatform()\nexport const defaultCryptoProvider = new NodeCryptoProvider()\n"]}
@@ -0,0 +1,3 @@
1
+ import { WebCryptoProvider, WebPlatform } from '@mtcute/web';
2
+ export declare const defaultPlatform: WebPlatform;
3
+ export declare const defaultCryptoProvider: WebCryptoProvider;
@@ -0,0 +1,4 @@
1
+ import { WebCryptoProvider, WebPlatform } from '@mtcute/web';
2
+ export const defaultPlatform = new WebPlatform();
3
+ export const defaultCryptoProvider = new WebCryptoProvider();
4
+ //# sourceMappingURL=platform.web.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"platform.web.js","sourceRoot":"","sources":["../../src/platform.web.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AAE5D,MAAM,CAAC,MAAM,eAAe,GAAG,IAAI,WAAW,EAAE,CAAA;AAChD,MAAM,CAAC,MAAM,qBAAqB,GAAG,IAAI,iBAAiB,EAAE,CAAA","sourcesContent":["import { WebCryptoProvider, WebPlatform } from '@mtcute/web'\n\nexport const defaultPlatform = new WebPlatform()\nexport const defaultCryptoProvider = new WebCryptoProvider()\n"]}
package/package.json CHANGED
@@ -1,19 +1,34 @@
1
1
  {
2
2
  "name": "@mtcute/test",
3
- "version": "0.7.1",
3
+ "version": "0.9.0",
4
4
  "description": "Test utilities for mtcute",
5
- "author": "Alina Sireneva <alina@tei.su>",
5
+ "author": "alina sireneva <alina@tei.su>",
6
6
  "license": "MIT",
7
7
  "main": "cjs/index.js",
8
8
  "type": "module",
9
+ "sideEffects": false,
9
10
  "scripts": {},
10
11
  "dependencies": {
11
12
  "long": "5.2.3"
12
13
  },
13
14
  "peerDependencies": {
14
- "@mtcute/core": "^0.7.1",
15
+ "@mtcute/core": "^0.9.0",
16
+ "@mtcute/node": "^0.9.0",
17
+ "@mtcute/web": "^0.9.0",
15
18
  "@mtcute/tl": "^*",
16
- "vitest": "^0.34.6"
19
+ "vitest": "1.4.0"
20
+ },
21
+ "peerDependenciesMeta": {
22
+ "@mtcute/node": {
23
+ "optional": true
24
+ },
25
+ "@mtcute/web": {
26
+ "optional": true
27
+ }
28
+ },
29
+ "browser": {
30
+ "./esm/platform.js": "./esm/platform.web.js",
31
+ "./cjs/platform.js": "./cjs/platform.web.js"
17
32
  },
18
33
  "module": "esm/index.js",
19
34
  "exports": {
@@ -1 +0,0 @@
1
- export {};
@@ -1,32 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- const vitest_1 = require("vitest");
4
- const utils_js_1 = require("@mtcute/core/utils.js");
5
- const client_js_1 = require("./client.js");
6
- const stub_js_1 = require("./stub.js");
7
- (0, vitest_1.describe)('client stub', () => {
8
- (0, vitest_1.it)('should correctly intercept rpc calls', async () => {
9
- const client = new client_js_1.StubTelegramClient();
10
- const stubConfig = (0, stub_js_1.createStub)('config');
11
- client.respondWith('help.getConfig', () => stubConfig);
12
- await client.with(async () => {
13
- const result = await client.call({ _: 'help.getConfig' });
14
- (0, vitest_1.expect)(result).toEqual(stubConfig);
15
- });
16
- });
17
- (0, vitest_1.it)('should correctly decrypt intercepted raw messages', async () => {
18
- const log = [];
19
- const client = new client_js_1.StubTelegramClient();
20
- client.onRawMessage((msg) => {
21
- log.push(`message ctor=${(0, utils_js_1.hexEncode)(msg.subarray(0, 4))}`);
22
- client.close().catch(() => { });
23
- });
24
- await client.with(async () => {
25
- await client.call({ _: 'help.getConfig' }).catch(() => { }); // ignore "client closed" error
26
- (0, vitest_1.expect)(log).toEqual([
27
- 'message ctor=dcf8f173', // msg_container
28
- ]);
29
- });
30
- });
31
- });
32
- //# sourceMappingURL=client.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"client.test.js","sourceRoot":"","sources":["../../src/client.test.ts"],"names":[],"mappings":";;AAAA,mCAA6C;AAE7C,oDAAiD;AAEjD,2CAAgD;AAChD,uCAAsC;AAEtC,IAAA,iBAAQ,EAAC,aAAa,EAAE,GAAG,EAAE;IACzB,IAAA,WAAE,EAAC,sCAAsC,EAAE,KAAK,IAAI,EAAE;QAClD,MAAM,MAAM,GAAG,IAAI,8BAAkB,EAAE,CAAA;QAEvC,MAAM,UAAU,GAAG,IAAA,oBAAU,EAAC,QAAQ,CAAC,CAAA;QACvC,MAAM,CAAC,WAAW,CAAC,gBAAgB,EAAE,GAAG,EAAE,CAAC,UAAU,CAAC,CAAA;QAEtD,MAAM,MAAM,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE;YACzB,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,gBAAgB,EAAE,CAAC,CAAA;YACzD,IAAA,eAAM,EAAC,MAAM,CAAC,CAAC,OAAO,CAAC,UAAU,CAAC,CAAA;QACtC,CAAC,CAAC,CAAA;IACN,CAAC,CAAC,CAAA;IAEF,IAAA,WAAE,EAAC,mDAAmD,EAAE,KAAK,IAAI,EAAE;QAC/D,MAAM,GAAG,GAAa,EAAE,CAAA;QAExB,MAAM,MAAM,GAAG,IAAI,8BAAkB,EAAE,CAAA;QAEvC,MAAM,CAAC,YAAY,CAAC,CAAC,GAAG,EAAE,EAAE;YACxB,GAAG,CAAC,IAAI,CAAC,gBAAgB,IAAA,oBAAS,EAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAA;YACzD,MAAM,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAA;QAClC,CAAC,CAAC,CAAA;QAEF,MAAM,MAAM,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE;YACzB,MAAM,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,gBAAgB,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAA,CAAC,+BAA+B;YAE1F,IAAA,eAAM,EAAC,GAAG,CAAC,CAAC,OAAO,CAAC;gBAChB,uBAAuB,EAAE,gBAAgB;aAC5C,CAAC,CAAA;QACN,CAAC,CAAC,CAAA;IACN,CAAC,CAAC,CAAA;AACN,CAAC,CAAC,CAAA","sourcesContent":["import { describe, expect, it } from 'vitest'\n\nimport { hexEncode } from '@mtcute/core/utils.js'\n\nimport { StubTelegramClient } from './client.js'\nimport { createStub } from './stub.js'\n\ndescribe('client stub', () => {\n it('should correctly intercept rpc calls', async () => {\n const client = new StubTelegramClient()\n\n const stubConfig = createStub('config')\n client.respondWith('help.getConfig', () => stubConfig)\n\n await client.with(async () => {\n const result = await client.call({ _: 'help.getConfig' })\n expect(result).toEqual(stubConfig)\n })\n })\n\n it('should correctly decrypt intercepted raw messages', async () => {\n const log: string[] = []\n\n const client = new StubTelegramClient()\n\n client.onRawMessage((msg) => {\n log.push(`message ctor=${hexEncode(msg.subarray(0, 4))}`)\n client.close().catch(() => {})\n })\n\n await client.with(async () => {\n await client.call({ _: 'help.getConfig' }).catch(() => {}) // ignore \"client closed\" error\n\n expect(log).toEqual([\n 'message ctor=dcf8f173', // msg_container\n ])\n })\n })\n})\n"]}
@@ -1 +0,0 @@
1
- export {};
package/cjs/stub.test.js DELETED
@@ -1,55 +0,0 @@
1
- "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- const long_1 = __importDefault(require("long"));
7
- const vitest_1 = require("vitest");
8
- const index_js_1 = require("./index.js");
9
- (0, vitest_1.describe)('stub', () => {
10
- (0, vitest_1.it)('should correctly generate simple stubs', () => {
11
- (0, vitest_1.expect)((0, index_js_1.createStub)('inputUser', { userId: 123 })).toEqual({
12
- _: 'inputUser',
13
- userId: 123,
14
- accessHash: long_1.default.ZERO,
15
- });
16
- });
17
- (0, vitest_1.it)('should correctly generate stubs for optional fields', () => {
18
- (0, vitest_1.expect)((0, index_js_1.createStub)('updateChannelTooLong')).toEqual({
19
- _: 'updateChannelTooLong',
20
- channelId: 0,
21
- pts: undefined,
22
- });
23
- });
24
- (0, vitest_1.it)('should correctly generate stubs for boolean flags', () => {
25
- (0, vitest_1.expect)((0, index_js_1.createStub)('account.finishTakeoutSession')).toEqual({
26
- _: 'account.finishTakeoutSession',
27
- success: false,
28
- });
29
- });
30
- (0, vitest_1.it)('should correctly generate stubs for vectors', () => {
31
- (0, vitest_1.expect)((0, index_js_1.createStub)('messageActionChatAddUser')).toEqual({
32
- _: 'messageActionChatAddUser',
33
- users: [],
34
- });
35
- });
36
- (0, vitest_1.it)('should correctly generate stubs for optional vectors', () => {
37
- (0, vitest_1.expect)((0, index_js_1.createStub)('updateChannelPinnedTopics')).toEqual({
38
- _: 'updateChannelPinnedTopics',
39
- channelId: 0,
40
- order: [],
41
- });
42
- });
43
- (0, vitest_1.it)('should correctly generate stubs for nested types', () => {
44
- (0, vitest_1.expect)((0, index_js_1.createStub)('messageActionGroupCallScheduled', { scheduleDate: 123 })).toEqual({
45
- _: 'messageActionGroupCallScheduled',
46
- call: {
47
- _: 'inputGroupCall',
48
- id: long_1.default.ZERO,
49
- accessHash: long_1.default.ZERO,
50
- },
51
- scheduleDate: 123,
52
- });
53
- });
54
- });
55
- //# sourceMappingURL=stub.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"stub.test.js","sourceRoot":"","sources":["../../src/stub.test.ts"],"names":[],"mappings":";;;;;AAAA,gDAAuB;AACvB,mCAA6C;AAE7C,yCAAuC;AAEvC,IAAA,iBAAQ,EAAC,MAAM,EAAE,GAAG,EAAE;IAClB,IAAA,WAAE,EAAC,wCAAwC,EAAE,GAAG,EAAE;QAC9C,IAAA,eAAM,EAAC,IAAA,qBAAU,EAAC,WAAW,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC;YACrD,CAAC,EAAE,WAAW;YACd,MAAM,EAAE,GAAG;YACX,UAAU,EAAE,cAAI,CAAC,IAAI;SACxB,CAAC,CAAA;IACN,CAAC,CAAC,CAAA;IAEF,IAAA,WAAE,EAAC,qDAAqD,EAAE,GAAG,EAAE;QAC3D,IAAA,eAAM,EAAC,IAAA,qBAAU,EAAC,sBAAsB,CAAC,CAAC,CAAC,OAAO,CAAC;YAC/C,CAAC,EAAE,sBAAsB;YACzB,SAAS,EAAE,CAAC;YACZ,GAAG,EAAE,SAAS;SACjB,CAAC,CAAA;IACN,CAAC,CAAC,CAAA;IAEF,IAAA,WAAE,EAAC,mDAAmD,EAAE,GAAG,EAAE;QACzD,IAAA,eAAM,EAAC,IAAA,qBAAU,EAAC,8BAA8B,CAAC,CAAC,CAAC,OAAO,CAAC;YACvD,CAAC,EAAE,8BAA8B;YACjC,OAAO,EAAE,KAAK;SACjB,CAAC,CAAA;IACN,CAAC,CAAC,CAAA;IAEF,IAAA,WAAE,EAAC,6CAA6C,EAAE,GAAG,EAAE;QACnD,IAAA,eAAM,EAAC,IAAA,qBAAU,EAAC,0BAA0B,CAAC,CAAC,CAAC,OAAO,CAAC;YACnD,CAAC,EAAE,0BAA0B;YAC7B,KAAK,EAAE,EAAE;SACZ,CAAC,CAAA;IACN,CAAC,CAAC,CAAA;IAEF,IAAA,WAAE,EAAC,sDAAsD,EAAE,GAAG,EAAE;QAC5D,IAAA,eAAM,EAAC,IAAA,qBAAU,EAAC,2BAA2B,CAAC,CAAC,CAAC,OAAO,CAAC;YACpD,CAAC,EAAE,2BAA2B;YAC9B,SAAS,EAAE,CAAC;YACZ,KAAK,EAAE,EAAE;SACZ,CAAC,CAAA;IACN,CAAC,CAAC,CAAA;IAEF,IAAA,WAAE,EAAC,kDAAkD,EAAE,GAAG,EAAE;QACxD,IAAA,eAAM,EAAC,IAAA,qBAAU,EAAC,iCAAiC,EAAE,EAAE,YAAY,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC;YACjF,CAAC,EAAE,iCAAiC;YACpC,IAAI,EAAE;gBACF,CAAC,EAAE,gBAAgB;gBACnB,EAAE,EAAE,cAAI,CAAC,IAAI;gBACb,UAAU,EAAE,cAAI,CAAC,IAAI;aACxB;YACD,YAAY,EAAE,GAAG;SACpB,CAAC,CAAA;IACN,CAAC,CAAC,CAAA;AACN,CAAC,CAAC,CAAA","sourcesContent":["import Long from 'long'\nimport { describe, expect, it } from 'vitest'\n\nimport { createStub } from './index.js'\n\ndescribe('stub', () => {\n it('should correctly generate simple stubs', () => {\n expect(createStub('inputUser', { userId: 123 })).toEqual({\n _: 'inputUser',\n userId: 123,\n accessHash: Long.ZERO,\n })\n })\n\n it('should correctly generate stubs for optional fields', () => {\n expect(createStub('updateChannelTooLong')).toEqual({\n _: 'updateChannelTooLong',\n channelId: 0,\n pts: undefined,\n })\n })\n\n it('should correctly generate stubs for boolean flags', () => {\n expect(createStub('account.finishTakeoutSession')).toEqual({\n _: 'account.finishTakeoutSession',\n success: false,\n })\n })\n\n it('should correctly generate stubs for vectors', () => {\n expect(createStub('messageActionChatAddUser')).toEqual({\n _: 'messageActionChatAddUser',\n users: [],\n })\n })\n\n it('should correctly generate stubs for optional vectors', () => {\n expect(createStub('updateChannelPinnedTopics')).toEqual({\n _: 'updateChannelPinnedTopics',\n channelId: 0,\n order: [],\n })\n })\n\n it('should correctly generate stubs for nested types', () => {\n expect(createStub('messageActionGroupCallScheduled', { scheduleDate: 123 })).toEqual({\n _: 'messageActionGroupCallScheduled',\n call: {\n _: 'inputGroupCall',\n id: Long.ZERO,\n accessHash: Long.ZERO,\n },\n scheduleDate: 123,\n })\n })\n})\n"]}
@@ -1 +0,0 @@
1
- export {};
@@ -1,36 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- const vitest_1 = require("vitest");
4
- const core_1 = require("@mtcute/core");
5
- const stub_js_1 = require("./stub.js");
6
- const transport_js_1 = require("./transport.js");
7
- (0, vitest_1.describe)('transport stub', () => {
8
- (0, vitest_1.it)('should correctly intercept calls', async () => {
9
- const log = [];
10
- const client = new core_1.BaseTelegramClient({
11
- apiId: 0,
12
- apiHash: '',
13
- logLevel: 0,
14
- defaultDcs: {
15
- main: (0, stub_js_1.createStub)('dcOption', { ipAddress: '1.2.3.4', port: 1234 }),
16
- media: (0, stub_js_1.createStub)('dcOption', { ipAddress: '1.2.3.4', port: 5678 }),
17
- },
18
- storage: new core_1.MemoryStorage(),
19
- transport: () => new transport_js_1.StubTelegramTransport({
20
- onConnect: (dc, testMode) => {
21
- log.push(`connect ${dc.ipAddress}:${dc.port} test=${testMode}`);
22
- client.close().catch(() => { });
23
- },
24
- onMessage(msg) {
25
- log.push(`message size=${msg.length}`);
26
- },
27
- }),
28
- });
29
- client.connect().catch(() => { }); // ignore "client closed" error
30
- await vitest_1.vi.waitFor(() => (0, vitest_1.expect)(log).toEqual([
31
- 'message size=40',
32
- 'connect 1.2.3.4:1234 test=false',
33
- ]));
34
- });
35
- });
36
- //# sourceMappingURL=transport.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"transport.test.js","sourceRoot":"","sources":["../../src/transport.test.ts"],"names":[],"mappings":";;AAAA,mCAAiD;AAEjD,uCAAgE;AAEhE,uCAAsC;AACtC,iDAAsD;AAEtD,IAAA,iBAAQ,EAAC,gBAAgB,EAAE,GAAG,EAAE;IAC5B,IAAA,WAAE,EAAC,kCAAkC,EAAE,KAAK,IAAI,EAAE;QAC9C,MAAM,GAAG,GAAa,EAAE,CAAA;QAExB,MAAM,MAAM,GAAG,IAAI,yBAAkB,CAAC;YAClC,KAAK,EAAE,CAAC;YACR,OAAO,EAAE,EAAE;YACX,QAAQ,EAAE,CAAC;YACX,UAAU,EAAE;gBACR,IAAI,EAAE,IAAA,oBAAU,EAAC,UAAU,EAAE,EAAE,SAAS,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;gBAClE,KAAK,EAAE,IAAA,oBAAU,EAAC,UAAU,EAAE,EAAE,SAAS,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;aACtE;YACD,OAAO,EAAE,IAAI,oBAAa,EAAE;YAC5B,SAAS,EAAE,GAAG,EAAE,CACZ,IAAI,oCAAqB,CAAC;gBACtB,SAAS,EAAE,CAAC,EAAE,EAAE,QAAQ,EAAE,EAAE;oBACxB,GAAG,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,SAAS,IAAI,EAAE,CAAC,IAAI,SAAS,QAAQ,EAAE,CAAC,CAAA;oBAC/D,MAAM,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAA;gBAClC,CAAC;gBACD,SAAS,CAAC,GAAG;oBACT,GAAG,CAAC,IAAI,CAAC,gBAAgB,GAAG,CAAC,MAAM,EAAE,CAAC,CAAA;gBAC1C,CAAC;aACJ,CAAC;SACT,CAAC,CAAA;QAEF,MAAM,CAAC,OAAO,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAA,CAAC,+BAA+B;QAEhE,MAAM,WAAE,CAAC,OAAO,CAAC,GAAG,EAAE,CAClB,IAAA,eAAM,EAAC,GAAG,CAAC,CAAC,OAAO,CAAC;YAChB,iBAAiB;YACjB,iCAAiC;SACpC,CAAC,CACL,CAAA;IACL,CAAC,CAAC,CAAA;AACN,CAAC,CAAC,CAAA","sourcesContent":["import { describe, expect, it, vi } from 'vitest'\n\nimport { BaseTelegramClient, MemoryStorage } from '@mtcute/core'\n\nimport { createStub } from './stub.js'\nimport { StubTelegramTransport } from './transport.js'\n\ndescribe('transport stub', () => {\n it('should correctly intercept calls', async () => {\n const log: string[] = []\n\n const client = new BaseTelegramClient({\n apiId: 0,\n apiHash: '',\n logLevel: 0,\n defaultDcs: {\n main: createStub('dcOption', { ipAddress: '1.2.3.4', port: 1234 }),\n media: createStub('dcOption', { ipAddress: '1.2.3.4', port: 5678 }),\n },\n storage: new MemoryStorage(),\n transport: () =>\n new StubTelegramTransport({\n onConnect: (dc, testMode) => {\n log.push(`connect ${dc.ipAddress}:${dc.port} test=${testMode}`)\n client.close().catch(() => {})\n },\n onMessage(msg) {\n log.push(`message size=${msg.length}`)\n },\n }),\n })\n\n client.connect().catch(() => {}) // ignore \"client closed\" error\n\n await vi.waitFor(() =>\n expect(log).toEqual([\n 'message size=40', // req_pq_multi\n 'connect 1.2.3.4:1234 test=false',\n ]),\n )\n })\n})\n"]}
@@ -1 +0,0 @@
1
- export {};
package/cjs/utils.test.js DELETED
@@ -1,16 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- const vitest_1 = require("vitest");
4
- const utils_js_1 = require("./utils.js");
5
- (0, vitest_1.describe)('markedIdToPeer', () => {
6
- (0, vitest_1.it)('should correctly convert user ids', () => {
7
- (0, vitest_1.expect)((0, utils_js_1.markedIdToPeer)(12345)).toEqual({ _: 'peerUser', userId: 12345 });
8
- });
9
- (0, vitest_1.it)('should correctly convert chat ids', () => {
10
- (0, vitest_1.expect)((0, utils_js_1.markedIdToPeer)(-12345)).toEqual({ _: 'peerChat', chatId: 12345 });
11
- });
12
- (0, vitest_1.it)('should correctly convert channel ids', () => {
13
- (0, vitest_1.expect)((0, utils_js_1.markedIdToPeer)(-1000000012345)).toEqual({ _: 'peerChannel', channelId: 12345 });
14
- });
15
- });
16
- //# sourceMappingURL=utils.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"utils.test.js","sourceRoot":"","sources":["../../src/utils.test.ts"],"names":[],"mappings":";;AAAA,mCAA6C;AAE7C,yCAA2C;AAE3C,IAAA,iBAAQ,EAAC,gBAAgB,EAAE,GAAG,EAAE;IAC5B,IAAA,WAAE,EAAC,mCAAmC,EAAE,GAAG,EAAE;QACzC,IAAA,eAAM,EAAC,IAAA,yBAAc,EAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAA;IAC3E,CAAC,CAAC,CAAA;IAEF,IAAA,WAAE,EAAC,mCAAmC,EAAE,GAAG,EAAE;QACzC,IAAA,eAAM,EAAC,IAAA,yBAAc,EAAC,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAA;IAC5E,CAAC,CAAC,CAAA;IAEF,IAAA,WAAE,EAAC,sCAAsC,EAAE,GAAG,EAAE;QAC5C,IAAA,eAAM,EAAC,IAAA,yBAAc,EAAC,CAAC,aAAa,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE,aAAa,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,CAAA;IAC1F,CAAC,CAAC,CAAA;AACN,CAAC,CAAC,CAAA","sourcesContent":["import { describe, expect, it } from 'vitest'\n\nimport { markedIdToPeer } from './utils.js'\n\ndescribe('markedIdToPeer', () => {\n it('should correctly convert user ids', () => {\n expect(markedIdToPeer(12345)).toEqual({ _: 'peerUser', userId: 12345 })\n })\n\n it('should correctly convert chat ids', () => {\n expect(markedIdToPeer(-12345)).toEqual({ _: 'peerChat', chatId: 12345 })\n })\n\n it('should correctly convert channel ids', () => {\n expect(markedIdToPeer(-1000000012345)).toEqual({ _: 'peerChannel', channelId: 12345 })\n })\n})\n"]}
@@ -1 +0,0 @@
1
- export {};
@@ -1,30 +0,0 @@
1
- import { describe, expect, it } from 'vitest';
2
- import { hexEncode } from '@mtcute/core/utils.js';
3
- import { StubTelegramClient } from './client.js';
4
- import { createStub } from './stub.js';
5
- describe('client stub', () => {
6
- it('should correctly intercept rpc calls', async () => {
7
- const client = new StubTelegramClient();
8
- const stubConfig = createStub('config');
9
- client.respondWith('help.getConfig', () => stubConfig);
10
- await client.with(async () => {
11
- const result = await client.call({ _: 'help.getConfig' });
12
- expect(result).toEqual(stubConfig);
13
- });
14
- });
15
- it('should correctly decrypt intercepted raw messages', async () => {
16
- const log = [];
17
- const client = new StubTelegramClient();
18
- client.onRawMessage((msg) => {
19
- log.push(`message ctor=${hexEncode(msg.subarray(0, 4))}`);
20
- client.close().catch(() => { });
21
- });
22
- await client.with(async () => {
23
- await client.call({ _: 'help.getConfig' }).catch(() => { }); // ignore "client closed" error
24
- expect(log).toEqual([
25
- 'message ctor=dcf8f173', // msg_container
26
- ]);
27
- });
28
- });
29
- });
30
- //# sourceMappingURL=client.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"client.test.js","sourceRoot":"","sources":["../../src/client.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAA;AAE7C,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAA;AAEjD,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAA;AAChD,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAA;AAEtC,QAAQ,CAAC,aAAa,EAAE,GAAG,EAAE;IACzB,EAAE,CAAC,sCAAsC,EAAE,KAAK,IAAI,EAAE;QAClD,MAAM,MAAM,GAAG,IAAI,kBAAkB,EAAE,CAAA;QAEvC,MAAM,UAAU,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAA;QACvC,MAAM,CAAC,WAAW,CAAC,gBAAgB,EAAE,GAAG,EAAE,CAAC,UAAU,CAAC,CAAA;QAEtD,MAAM,MAAM,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE;YACzB,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,gBAAgB,EAAE,CAAC,CAAA;YACzD,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,UAAU,CAAC,CAAA;QACtC,CAAC,CAAC,CAAA;IACN,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,mDAAmD,EAAE,KAAK,IAAI,EAAE;QAC/D,MAAM,GAAG,GAAa,EAAE,CAAA;QAExB,MAAM,MAAM,GAAG,IAAI,kBAAkB,EAAE,CAAA;QAEvC,MAAM,CAAC,YAAY,CAAC,CAAC,GAAG,EAAE,EAAE;YACxB,GAAG,CAAC,IAAI,CAAC,gBAAgB,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAA;YACzD,MAAM,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAA;QAClC,CAAC,CAAC,CAAA;QAEF,MAAM,MAAM,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE;YACzB,MAAM,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,gBAAgB,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAA,CAAC,+BAA+B;YAE1F,MAAM,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC;gBAChB,uBAAuB,EAAE,gBAAgB;aAC5C,CAAC,CAAA;QACN,CAAC,CAAC,CAAA;IACN,CAAC,CAAC,CAAA;AACN,CAAC,CAAC,CAAA","sourcesContent":["import { describe, expect, it } from 'vitest'\n\nimport { hexEncode } from '@mtcute/core/utils.js'\n\nimport { StubTelegramClient } from './client.js'\nimport { createStub } from './stub.js'\n\ndescribe('client stub', () => {\n it('should correctly intercept rpc calls', async () => {\n const client = new StubTelegramClient()\n\n const stubConfig = createStub('config')\n client.respondWith('help.getConfig', () => stubConfig)\n\n await client.with(async () => {\n const result = await client.call({ _: 'help.getConfig' })\n expect(result).toEqual(stubConfig)\n })\n })\n\n it('should correctly decrypt intercepted raw messages', async () => {\n const log: string[] = []\n\n const client = new StubTelegramClient()\n\n client.onRawMessage((msg) => {\n log.push(`message ctor=${hexEncode(msg.subarray(0, 4))}`)\n client.close().catch(() => {})\n })\n\n await client.with(async () => {\n await client.call({ _: 'help.getConfig' }).catch(() => {}) // ignore \"client closed\" error\n\n expect(log).toEqual([\n 'message ctor=dcf8f173', // msg_container\n ])\n })\n })\n})\n"]}
@@ -1 +0,0 @@
1
- export {};