@mtcute/test 0.6.0 → 0.7.1

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 (73) hide show
  1. package/cjs/client.d.ts +3 -4
  2. package/cjs/client.js +5 -8
  3. package/cjs/client.js.map +1 -1
  4. package/cjs/crypto.js +1 -1
  5. package/cjs/crypto.js.map +1 -1
  6. package/cjs/index.d.ts +1 -1
  7. package/cjs/index.js +1 -1
  8. package/cjs/index.js.map +1 -1
  9. package/cjs/storage/auth-keys.d.ts +3 -0
  10. package/cjs/storage/auth-keys.js +95 -0
  11. package/cjs/storage/auth-keys.js.map +1 -0
  12. package/cjs/storage/index.d.ts +4 -0
  13. package/cjs/storage/index.js +21 -0
  14. package/cjs/storage/index.js.map +1 -0
  15. package/cjs/storage/key-value.d.ts +3 -0
  16. package/cjs/storage/key-value.js +41 -0
  17. package/cjs/storage/key-value.js.map +1 -0
  18. package/cjs/storage/peers.d.ts +3 -0
  19. package/cjs/storage/peers.js +75 -0
  20. package/cjs/storage/peers.js.map +1 -0
  21. package/cjs/storage/ref-messages.d.ts +3 -0
  22. package/cjs/storage/ref-messages.js +69 -0
  23. package/cjs/storage/ref-messages.js.map +1 -0
  24. package/cjs/storage.d.ts +2 -16
  25. package/cjs/storage.js +18 -29
  26. package/cjs/storage.js.map +1 -1
  27. package/cjs/transport.test.js +1 -2
  28. package/cjs/transport.test.js.map +1 -1
  29. package/cjs/utils.js +1 -2
  30. package/cjs/utils.js.map +1 -1
  31. package/esm/client.d.ts +3 -4
  32. package/esm/client.js +6 -9
  33. package/esm/client.js.map +1 -1
  34. package/esm/crypto.js +1 -1
  35. package/esm/crypto.js.map +1 -1
  36. package/esm/index.d.ts +1 -1
  37. package/esm/index.js +1 -1
  38. package/esm/index.js.map +1 -1
  39. package/esm/storage/auth-keys.d.ts +3 -0
  40. package/esm/storage/auth-keys.js +90 -0
  41. package/esm/storage/auth-keys.js.map +1 -0
  42. package/esm/storage/index.d.ts +4 -0
  43. package/esm/storage/index.js +5 -0
  44. package/esm/storage/index.js.map +1 -0
  45. package/esm/storage/key-value.d.ts +3 -0
  46. package/esm/storage/key-value.js +36 -0
  47. package/esm/storage/key-value.js.map +1 -0
  48. package/esm/storage/peers.d.ts +3 -0
  49. package/esm/storage/peers.js +70 -0
  50. package/esm/storage/peers.js.map +1 -0
  51. package/esm/storage/ref-messages.d.ts +3 -0
  52. package/esm/storage/ref-messages.js +64 -0
  53. package/esm/storage/ref-messages.js.map +1 -0
  54. package/esm/storage.d.ts +2 -16
  55. package/esm/storage.js +18 -29
  56. package/esm/storage.js.map +1 -1
  57. package/esm/transport.test.js +1 -2
  58. package/esm/transport.test.js.map +1 -1
  59. package/esm/utils.js +2 -3
  60. package/esm/utils.js.map +1 -1
  61. package/package.json +2 -2
  62. package/cjs/storage-test.d.ts +0 -24
  63. package/cjs/storage-test.js +0 -365
  64. package/cjs/storage-test.js.map +0 -1
  65. package/cjs/storage.test.d.ts +0 -1
  66. package/cjs/storage.test.js +0 -43
  67. package/cjs/storage.test.js.map +0 -1
  68. package/esm/storage-test.d.ts +0 -24
  69. package/esm/storage-test.js +0 -357
  70. package/esm/storage-test.js.map +0 -1
  71. package/esm/storage.test.d.ts +0 -1
  72. package/esm/storage.test.js +0 -41
  73. package/esm/storage.test.js.map +0 -1
@@ -0,0 +1,69 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.testRefMessagesRepository = exports.fakeRefMessagesRepository = void 0;
4
+ const vitest_1 = require("vitest");
5
+ function fakeRefMessagesRepository() {
6
+ return {
7
+ store: vitest_1.vi.fn(),
8
+ getByPeer: vitest_1.vi.fn(),
9
+ delete: vitest_1.vi.fn(),
10
+ deleteByPeer: vitest_1.vi.fn(),
11
+ deleteAll: vitest_1.vi.fn(),
12
+ };
13
+ }
14
+ exports.fakeRefMessagesRepository = fakeRefMessagesRepository;
15
+ function testRefMessagesRepository(repo, driver) {
16
+ (0, vitest_1.describe)('IReferenceMessagesRepository', () => {
17
+ (0, vitest_1.afterEach)(() => repo.deleteAll());
18
+ (0, vitest_1.it)('should be empty by default', async () => {
19
+ (0, vitest_1.expect)(await repo.getByPeer(1)).toEqual(null);
20
+ });
21
+ (0, vitest_1.it)('should store and retrieve reference messages', async () => {
22
+ await repo.store(1, 2, 3);
23
+ await repo.store(1, 4, 5);
24
+ await repo.store(2, 6, 7);
25
+ await driver.save?.();
26
+ (0, vitest_1.expect)(await repo.getByPeer(1)).deep.oneOf([
27
+ [2, 3],
28
+ [4, 5],
29
+ ]);
30
+ (0, vitest_1.expect)(await repo.getByPeer(2)).toEqual([6, 7]);
31
+ (0, vitest_1.expect)(await repo.getByPeer(3)).toEqual(null);
32
+ (0, vitest_1.expect)(await repo.getByPeer(4)).toEqual(null);
33
+ (0, vitest_1.expect)(await repo.getByPeer(5)).toEqual(null);
34
+ (0, vitest_1.expect)(await repo.getByPeer(6)).toEqual(null);
35
+ (0, vitest_1.expect)(await repo.getByPeer(7)).toEqual(null);
36
+ });
37
+ (0, vitest_1.it)('should delete reference messages', async () => {
38
+ await repo.store(1, 2, 3);
39
+ await repo.store(1, 4, 5);
40
+ await repo.store(2, 6, 7);
41
+ await driver.save?.();
42
+ await repo.delete(4, [5]);
43
+ await driver.save?.();
44
+ (0, vitest_1.expect)(await repo.getByPeer(1)).toEqual([2, 3]);
45
+ await repo.delete(2, [2, 3, 4]);
46
+ await driver.save?.();
47
+ (0, vitest_1.expect)(await repo.getByPeer(1)).toEqual(null);
48
+ });
49
+ (0, vitest_1.it)('should delete all reference messages for a peer', async () => {
50
+ await repo.store(1, 2, 3);
51
+ await repo.store(1, 4, 5);
52
+ await repo.store(1, 6, 7);
53
+ await repo.store(2, 20, 30);
54
+ await repo.store(2, 40, 50);
55
+ await repo.store(2, 60, 70);
56
+ await driver.save?.();
57
+ await repo.deleteByPeer(1);
58
+ await driver.save?.();
59
+ (0, vitest_1.expect)(await repo.getByPeer(1)).toEqual(null);
60
+ (0, vitest_1.expect)(await repo.getByPeer(2)).deep.oneOf([
61
+ [20, 30],
62
+ [40, 50],
63
+ [60, 70],
64
+ ]);
65
+ });
66
+ });
67
+ }
68
+ exports.testRefMessagesRepository = testRefMessagesRepository;
69
+ //# sourceMappingURL=ref-messages.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ref-messages.js","sourceRoot":"","sources":["../../../src/storage/ref-messages.ts"],"names":[],"mappings":"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","sourcesContent":["import { afterEach, describe, expect, it, vi } from 'vitest'\n\nimport { IReferenceMessagesRepository, IStorageDriver } from '@mtcute/core'\n\nexport function fakeRefMessagesRepository(): IReferenceMessagesRepository {\n return {\n store: vi.fn(),\n getByPeer: vi.fn(),\n delete: vi.fn(),\n deleteByPeer: vi.fn(),\n deleteAll: vi.fn(),\n }\n}\n\nexport function testRefMessagesRepository(repo: IReferenceMessagesRepository, driver: IStorageDriver) {\n describe('IReferenceMessagesRepository', () => {\n afterEach(() => repo.deleteAll())\n\n it('should be empty by default', async () => {\n expect(await repo.getByPeer(1)).toEqual(null)\n })\n\n it('should store and retrieve reference messages', async () => {\n await repo.store(1, 2, 3)\n await repo.store(1, 4, 5)\n await repo.store(2, 6, 7)\n await driver.save?.()\n\n expect(await repo.getByPeer(1)).deep.oneOf([\n [2, 3],\n [4, 5],\n ])\n expect(await repo.getByPeer(2)).toEqual([6, 7])\n expect(await repo.getByPeer(3)).toEqual(null)\n expect(await repo.getByPeer(4)).toEqual(null)\n expect(await repo.getByPeer(5)).toEqual(null)\n expect(await repo.getByPeer(6)).toEqual(null)\n expect(await repo.getByPeer(7)).toEqual(null)\n })\n\n it('should delete reference messages', async () => {\n await repo.store(1, 2, 3)\n await repo.store(1, 4, 5)\n await repo.store(2, 6, 7)\n await driver.save?.()\n\n await repo.delete(4, [5])\n await driver.save?.()\n expect(await repo.getByPeer(1)).toEqual([2, 3])\n\n await repo.delete(2, [2, 3, 4])\n await driver.save?.()\n expect(await repo.getByPeer(1)).toEqual(null)\n })\n\n it('should delete all reference messages for a peer', async () => {\n await repo.store(1, 2, 3)\n await repo.store(1, 4, 5)\n await repo.store(1, 6, 7)\n\n await repo.store(2, 20, 30)\n await repo.store(2, 40, 50)\n await repo.store(2, 60, 70)\n await driver.save?.()\n\n await repo.deleteByPeer(1)\n await driver.save?.()\n expect(await repo.getByPeer(1)).toEqual(null)\n expect(await repo.getByPeer(2)).deep.oneOf([\n [20, 30],\n [40, 50],\n [60, 70],\n ])\n })\n })\n}\n"]}
package/cjs/storage.d.ts CHANGED
@@ -1,7 +1,6 @@
1
- import { ITelegramStorage } from '@mtcute/core';
2
- import { MemoryStorage } from '@mtcute/core/storage/memory.js';
1
+ import { MemoryStorage } from '@mtcute/core';
3
2
  import { ICryptoProvider } from '@mtcute/core/utils.js';
4
- export declare class StubMemoryTelegramStorage extends MemoryStorage implements ITelegramStorage {
3
+ export declare class StubMemoryTelegramStorage extends MemoryStorage {
5
4
  readonly params: {
6
5
  /**
7
6
  * IDs of the DCs for which the storage should have auth keys,
@@ -17,10 +16,6 @@ export declare class StubMemoryTelegramStorage extends MemoryStorage implements
17
16
  * @default true
18
17
  */
19
18
  hasTempKeys?: boolean | number[];
20
- onLoad?: () => void;
21
- onSave?: () => void;
22
- onDestroy?: () => void;
23
- onReset?: () => void;
24
19
  };
25
20
  constructor(params?: {
26
21
  /**
@@ -37,15 +32,6 @@ export declare class StubMemoryTelegramStorage extends MemoryStorage implements
37
32
  * @default true
38
33
  */
39
34
  hasTempKeys?: boolean | number[];
40
- onLoad?: () => void;
41
- onSave?: () => void;
42
- onDestroy?: () => void;
43
- onReset?: () => void;
44
35
  });
45
- getAuthKeyFor(dcId: number, tempIndex?: number | undefined): Uint8Array | null;
46
- load(): void;
47
- save(): void;
48
- destroy(): void;
49
- reset(withKeys?: boolean): void;
50
36
  decryptOutgoingMessage(crypto: ICryptoProvider, data: Uint8Array, dcId: number, tempIndex?: number | undefined): Uint8Array;
51
37
  }
package/cjs/storage.js CHANGED
@@ -2,46 +2,35 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.StubMemoryTelegramStorage = void 0;
4
4
  const core_1 = require("@mtcute/core");
5
- const memory_js_1 = require("@mtcute/core/storage/memory.js");
6
5
  const utils_js_1 = require("@mtcute/core/utils.js");
7
- class StubMemoryTelegramStorage extends memory_js_1.MemoryStorage {
6
+ class StubMemoryTelegramStorage extends core_1.MemoryStorage {
8
7
  constructor(params = {
9
8
  hasKeys: true,
10
9
  hasTempKeys: true,
11
10
  }) {
12
11
  super();
13
12
  this.params = params;
14
- }
15
- getAuthKeyFor(dcId, tempIndex) {
16
- if (tempIndex === undefined && this.params.hasKeys) {
17
- if (this.params.hasKeys === true || this.params.hasKeys.includes(dcId)) {
18
- return new Uint8Array(256);
13
+ const _origGet = this.authKeys.get;
14
+ this.authKeys.get = (dcId) => {
15
+ if (this.params.hasKeys) {
16
+ if (this.params.hasKeys === true || this.params.hasKeys.includes(dcId)) {
17
+ return new Uint8Array(256);
18
+ }
19
19
  }
20
- }
21
- if (tempIndex === undefined && this.params.hasTempKeys) {
22
- if (this.params.hasTempKeys === true || this.params.hasTempKeys.includes(dcId)) {
23
- return new Uint8Array(256);
20
+ return _origGet.call(this.authKeys, dcId);
21
+ };
22
+ const _origGetTemp = this.authKeys.getTemp;
23
+ this.authKeys.getTemp = (dcId, idx, now) => {
24
+ if (this.params.hasTempKeys) {
25
+ if (this.params.hasTempKeys === true || this.params.hasTempKeys.includes(dcId)) {
26
+ return new Uint8Array(256);
27
+ }
24
28
  }
25
- }
26
- return super.getAuthKeyFor(dcId, tempIndex);
27
- }
28
- load() {
29
- this.params.onLoad?.();
30
- super.load();
31
- }
32
- save() {
33
- this.params.onSave?.();
34
- }
35
- destroy() {
36
- this.params.onDestroy?.();
37
- super.destroy();
38
- }
39
- reset(withKeys = false) {
40
- this.params?.onReset?.();
41
- super.reset(withKeys);
29
+ return _origGetTemp.call(this.authKeys, dcId, idx, now);
30
+ };
42
31
  }
43
32
  decryptOutgoingMessage(crypto, data, dcId, tempIndex) {
44
- const key = this.getAuthKeyFor(dcId, tempIndex);
33
+ const key = tempIndex ? this.authKeys.getTemp(dcId, tempIndex, Date.now()) : this.authKeys.get(dcId);
45
34
  if (!key) {
46
35
  throw new core_1.MtArgumentError(`No auth key for DC ${dcId}`);
47
36
  }
@@ -1 +1 @@
1
- {"version":3,"file":"storage.js","sourceRoot":"","sources":["../../src/storage.ts"],"names":[],"mappings":";;;AAAA,uCAAgE;AAChE,kEAAkE;AAClE,oDAA+E;AAE/E,MAAa,yBAA0B,SAAQ,yBAAa;IACxD,YACa,SAqBL;QACA,OAAO,EAAE,IAAI;QACb,WAAW,EAAE,IAAI;KACpB;QAED,KAAK,EAAE,CAAA;QA1BE,WAAM,GAAN,MAAM,CAwBd;IAGL,CAAC;IAED,aAAa,CAAC,IAAY,EAAE,SAA8B;QACtD,IAAI,SAAS,KAAK,SAAS,IAAI,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE;YAChD,IAAI,IAAI,CAAC,MAAM,CAAC,OAAO,KAAK,IAAI,IAAI,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE;gBACpE,OAAO,IAAI,UAAU,CAAC,GAAG,CAAC,CAAA;aAC7B;SACJ;QAED,IAAI,SAAS,KAAK,SAAS,IAAI,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE;YACpD,IAAI,IAAI,CAAC,MAAM,CAAC,WAAW,KAAK,IAAI,IAAI,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE;gBAC5E,OAAO,IAAI,UAAU,CAAC,GAAG,CAAC,CAAA;aAC7B;SACJ;QAED,OAAO,KAAK,CAAC,aAAa,CAAC,IAAI,EAAE,SAAS,CAAC,CAAA;IAC/C,CAAC;IAED,IAAI;QACA,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,EAAE,CAAA;QACtB,KAAK,CAAC,IAAI,EAAE,CAAA;IAChB,CAAC;IAED,IAAI;QACA,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,EAAE,CAAA;IAC1B,CAAC;IAED,OAAO;QACH,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,EAAE,CAAA;QACzB,KAAK,CAAC,OAAO,EAAE,CAAA;IACnB,CAAC;IAED,KAAK,CAAC,QAAQ,GAAG,KAAK;QAClB,IAAI,CAAC,MAAM,EAAE,OAAO,EAAE,EAAE,CAAA;QACxB,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAA;IACzB,CAAC;IAED,sBAAsB,CAAC,MAAuB,EAAE,IAAgB,EAAE,IAAY,EAAE,SAA8B;QAC1G,MAAM,GAAG,GAAG,IAAI,CAAC,aAAa,CAAC,IAAI,EAAE,SAAS,CAAC,CAAA;QAE/C,IAAI,CAAC,GAAG,EAAE;YACN,MAAM,IAAI,sBAAe,CAAC,sBAAsB,IAAI,EAAE,CAAC,CAAA;SAC1D;QAED,MAAM,UAAU,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,EAAE,EAAE,CAAC,CAAA;QACvC,MAAM,aAAa,GAAG,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAA;QAEvC,MAAM,GAAG,GAAG,IAAA,iCAAsB,EAAC,MAAM,EAAE,GAAG,EAAE,UAAU,EAAE,IAAI,CAAC,CAAA;QACjE,MAAM,SAAS,GAAG,GAAG,CAAC,OAAO,CAAC,aAAa,CAAC,CAAA;QAE5C,wCAAwC;QACxC,MAAM,EAAE,GAAG,IAAI,QAAQ,CAAC,SAAS,CAAC,MAAM,EAAE,SAAS,CAAC,UAAU,EAAE,SAAS,CAAC,UAAU,CAAC,CAAA;QACrF,MAAM,MAAM,GAAG,EAAE,CAAC,SAAS,CAAC,EAAE,EAAE,IAAI,CAAC,CAAA;QAErC,OAAO,SAAS,CAAC,QAAQ,CAAC,EAAE,EAAE,EAAE,GAAG,MAAM,CAAC,CAAA;IAC9C,CAAC;CACJ;AArFD,8DAqFC","sourcesContent":["import { ITelegramStorage, MtArgumentError } from '@mtcute/core'\nimport { MemoryStorage } from '@mtcute/core/src/storage/memory.js'\nimport { createAesIgeForMessage, ICryptoProvider } from '@mtcute/core/utils.js'\n\nexport class StubMemoryTelegramStorage extends MemoryStorage implements ITelegramStorage {\n constructor(\n readonly params: {\n /**\n * IDs of the DCs for which the storage should have auth keys,\n * or `true` to have keys for all DCs\n *\n * @default true\n */\n hasKeys?: boolean | number[]\n\n /**\n * IDs of the DCs for which the storage should have temp auth keys,\n * or `true` to have keys for all DCs\n *\n * @default true\n */\n hasTempKeys?: boolean | number[]\n\n onLoad?: () => void\n onSave?: () => void\n onDestroy?: () => void\n onReset?: () => void\n } = {\n hasKeys: true,\n hasTempKeys: true,\n },\n ) {\n super()\n }\n\n getAuthKeyFor(dcId: number, tempIndex?: number | undefined): Uint8Array | null {\n if (tempIndex === undefined && this.params.hasKeys) {\n if (this.params.hasKeys === true || this.params.hasKeys.includes(dcId)) {\n return new Uint8Array(256)\n }\n }\n\n if (tempIndex === undefined && this.params.hasTempKeys) {\n if (this.params.hasTempKeys === true || this.params.hasTempKeys.includes(dcId)) {\n return new Uint8Array(256)\n }\n }\n\n return super.getAuthKeyFor(dcId, tempIndex)\n }\n\n load(): void {\n this.params.onLoad?.()\n super.load()\n }\n\n save(): void {\n this.params.onSave?.()\n }\n\n destroy(): void {\n this.params.onDestroy?.()\n super.destroy()\n }\n\n reset(withKeys = false): void {\n this.params?.onReset?.()\n super.reset(withKeys)\n }\n\n decryptOutgoingMessage(crypto: ICryptoProvider, data: Uint8Array, dcId: number, tempIndex?: number | undefined) {\n const key = this.getAuthKeyFor(dcId, tempIndex)\n\n if (!key) {\n throw new MtArgumentError(`No auth key for DC ${dcId}`)\n }\n\n const messageKey = data.subarray(8, 24)\n const encryptedData = data.subarray(24)\n\n const ige = createAesIgeForMessage(crypto, key, messageKey, true)\n const innerData = ige.decrypt(encryptedData)\n\n // skipping all checks because who cares\n const dv = new DataView(innerData.buffer, innerData.byteOffset, innerData.byteLength)\n const length = dv.getUint32(28, true)\n\n return innerData.subarray(32, 32 + length)\n }\n}\n"]}
1
+ {"version":3,"file":"storage.js","sourceRoot":"","sources":["../../src/storage.ts"],"names":[],"mappings":";;;AAAA,uCAA6D;AAC7D,oDAA+E;AAE/E,MAAa,yBAA0B,SAAQ,oBAAa;IACxD,YACa,SAgBL;QACA,OAAO,EAAE,IAAI;QACb,WAAW,EAAE,IAAI;KACpB;QAED,KAAK,EAAE,CAAA;QArBE,WAAM,GAAN,MAAM,CAmBd;QAID,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAA;QAElC,IAAI,CAAC,QAAQ,CAAC,GAAG,GAAG,CAAC,IAAI,EAAE,EAAE;YACzB,IAAI,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE;gBACrB,IAAI,IAAI,CAAC,MAAM,CAAC,OAAO,KAAK,IAAI,IAAI,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE;oBACpE,OAAO,IAAI,UAAU,CAAC,GAAG,CAAC,CAAA;iBAC7B;aACJ;YAED,OAAO,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAA;QAC7C,CAAC,CAAA;QAED,MAAM,YAAY,GAAG,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAA;QAE1C,IAAI,CAAC,QAAQ,CAAC,OAAO,GAAG,CAAC,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE;YACvC,IAAI,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE;gBACzB,IAAI,IAAI,CAAC,MAAM,CAAC,WAAW,KAAK,IAAI,IAAI,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE;oBAC5E,OAAO,IAAI,UAAU,CAAC,GAAG,CAAC,CAAA;iBAC7B;aACJ;YAED,OAAO,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,CAAC,CAAA;QAC3D,CAAC,CAAA;IACL,CAAC;IAED,sBAAsB,CAAC,MAAuB,EAAE,IAAgB,EAAE,IAAY,EAAE,SAA8B;QAC1G,MAAM,GAAG,GAAG,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,EAAE,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;QAEpG,IAAI,CAAC,GAAG,EAAE;YACN,MAAM,IAAI,sBAAe,CAAC,sBAAsB,IAAI,EAAE,CAAC,CAAA;SAC1D;QAED,MAAM,UAAU,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,EAAE,EAAE,CAAC,CAAA;QACvC,MAAM,aAAa,GAAG,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAA;QAEvC,MAAM,GAAG,GAAG,IAAA,iCAAsB,EAAC,MAAM,EAAE,GAAG,EAAE,UAAU,EAAE,IAAI,CAAC,CAAA;QACjE,MAAM,SAAS,GAAG,GAAG,CAAC,OAAO,CAAC,aAAa,CAAC,CAAA;QAE5C,wCAAwC;QACxC,MAAM,EAAE,GAAG,IAAI,QAAQ,CAAC,SAAS,CAAC,MAAM,EAAE,SAAS,CAAC,UAAU,EAAE,SAAS,CAAC,UAAU,CAAC,CAAA;QACrF,MAAM,MAAM,GAAG,EAAE,CAAC,SAAS,CAAC,EAAE,EAAE,IAAI,CAAC,CAAA;QAErC,OAAO,SAAS,CAAC,QAAQ,CAAC,EAAE,EAAE,EAAE,GAAG,MAAM,CAAC,CAAA;IAC9C,CAAC;CACJ;AArED,8DAqEC","sourcesContent":["import { MemoryStorage, MtArgumentError } from '@mtcute/core'\nimport { createAesIgeForMessage, ICryptoProvider } from '@mtcute/core/utils.js'\n\nexport class StubMemoryTelegramStorage extends MemoryStorage {\n constructor(\n readonly params: {\n /**\n * IDs of the DCs for which the storage should have auth keys,\n * or `true` to have keys for all DCs\n *\n * @default true\n */\n hasKeys?: boolean | number[]\n\n /**\n * IDs of the DCs for which the storage should have temp auth keys,\n * or `true` to have keys for all DCs\n *\n * @default true\n */\n hasTempKeys?: boolean | number[]\n } = {\n hasKeys: true,\n hasTempKeys: true,\n },\n ) {\n super()\n\n const _origGet = this.authKeys.get\n\n this.authKeys.get = (dcId) => {\n if (this.params.hasKeys) {\n if (this.params.hasKeys === true || this.params.hasKeys.includes(dcId)) {\n return new Uint8Array(256)\n }\n }\n\n return _origGet.call(this.authKeys, dcId)\n }\n\n const _origGetTemp = this.authKeys.getTemp\n\n this.authKeys.getTemp = (dcId, idx, now) => {\n if (this.params.hasTempKeys) {\n if (this.params.hasTempKeys === true || this.params.hasTempKeys.includes(dcId)) {\n return new Uint8Array(256)\n }\n }\n\n return _origGetTemp.call(this.authKeys, dcId, idx, now)\n }\n }\n\n decryptOutgoingMessage(crypto: ICryptoProvider, data: Uint8Array, dcId: number, tempIndex?: number | undefined) {\n const key = tempIndex ? this.authKeys.getTemp(dcId, tempIndex, Date.now()) : this.authKeys.get(dcId)\n\n if (!key) {\n throw new MtArgumentError(`No auth key for DC ${dcId}`)\n }\n\n const messageKey = data.subarray(8, 24)\n const encryptedData = data.subarray(24)\n\n const ige = createAesIgeForMessage(crypto, key, messageKey, true)\n const innerData = ige.decrypt(encryptedData)\n\n // skipping all checks because who cares\n const dv = new DataView(innerData.buffer, innerData.byteOffset, innerData.byteLength)\n const length = dv.getUint32(28, true)\n\n return innerData.subarray(32, 32 + length)\n }\n}\n"]}
@@ -2,7 +2,6 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  const vitest_1 = require("vitest");
4
4
  const core_1 = require("@mtcute/core");
5
- const memory_js_1 = require("@mtcute/core/storage/memory.js");
6
5
  const stub_js_1 = require("./stub.js");
7
6
  const transport_js_1 = require("./transport.js");
8
7
  (0, vitest_1.describe)('transport stub', () => {
@@ -16,7 +15,7 @@ const transport_js_1 = require("./transport.js");
16
15
  main: (0, stub_js_1.createStub)('dcOption', { ipAddress: '1.2.3.4', port: 1234 }),
17
16
  media: (0, stub_js_1.createStub)('dcOption', { ipAddress: '1.2.3.4', port: 5678 }),
18
17
  },
19
- storage: new memory_js_1.MemoryStorage(),
18
+ storage: new core_1.MemoryStorage(),
20
19
  transport: () => new transport_js_1.StubTelegramTransport({
21
20
  onConnect: (dc, testMode) => {
22
21
  log.push(`connect ${dc.ipAddress}:${dc.port} test=${testMode}`);
@@ -1 +1 @@
1
- {"version":3,"file":"transport.test.js","sourceRoot":"","sources":["../../src/transport.test.ts"],"names":[],"mappings":";;AAAA,mCAAiD;AAEjD,uCAAiD;AACjD,kEAAkE;AAElE,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,yBAAa,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 } from '@mtcute/core'\nimport { MemoryStorage } from '@mtcute/core/src/storage/memory.js'\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
+ {"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"]}
package/cjs/utils.js CHANGED
@@ -3,8 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.markedIdToPeer = void 0;
4
4
  const core_1 = require("@mtcute/core");
5
5
  function markedIdToPeer(id) {
6
- const type = (0, core_1.getBasicPeerType)(id);
7
- const bareId = (0, core_1.markedPeerIdToBare)(id);
6
+ const [type, bareId] = (0, core_1.parseMarkedPeerId)(id);
8
7
  switch (type) {
9
8
  case 'user':
10
9
  return { _: 'peerUser', userId: bareId };
package/cjs/utils.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/utils.ts"],"names":[],"mappings":";;;AAAA,uCAAuE;AAEvE,SAAgB,cAAc,CAAC,EAAU;IACrC,MAAM,IAAI,GAAG,IAAA,uBAAgB,EAAC,EAAE,CAAC,CAAA;IACjC,MAAM,MAAM,GAAG,IAAA,yBAAkB,EAAC,EAAE,CAAC,CAAA;IAErC,QAAQ,IAAI,EAAE;QACV,KAAK,MAAM;YACP,OAAO,EAAE,CAAC,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,CAAA;QAC5C,KAAK,MAAM;YACP,OAAO,EAAE,CAAC,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,CAAA;QAC5C,KAAK,SAAS;YACV,OAAO,EAAE,CAAC,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,EAAE,CAAA;KACrD;AACL,CAAC;AAZD,wCAYC","sourcesContent":["import { getBasicPeerType, markedPeerIdToBare, tl } from '@mtcute/core'\n\nexport function markedIdToPeer(id: number): tl.TypePeer {\n const type = getBasicPeerType(id)\n const bareId = markedPeerIdToBare(id)\n\n switch (type) {\n case 'user':\n return { _: 'peerUser', userId: bareId }\n case 'chat':\n return { _: 'peerChat', chatId: bareId }\n case 'channel':\n return { _: 'peerChannel', channelId: bareId }\n }\n}\n"]}
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/utils.ts"],"names":[],"mappings":";;;AAAA,uCAAoD;AAEpD,SAAgB,cAAc,CAAC,EAAU;IACrC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,GAAG,IAAA,wBAAiB,EAAC,EAAE,CAAC,CAAA;IAE5C,QAAQ,IAAI,EAAE;QACV,KAAK,MAAM;YACP,OAAO,EAAE,CAAC,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,CAAA;QAC5C,KAAK,MAAM;YACP,OAAO,EAAE,CAAC,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,CAAA;QAC5C,KAAK,SAAS;YACV,OAAO,EAAE,CAAC,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,EAAE,CAAA;KACrD;AACL,CAAC;AAXD,wCAWC","sourcesContent":["import { parseMarkedPeerId, tl } from '@mtcute/core'\n\nexport function markedIdToPeer(id: number): tl.TypePeer {\n const [type, bareId] = parseMarkedPeerId(id)\n\n switch (type) {\n case 'user':\n return { _: 'peerUser', userId: bareId }\n case 'chat':\n return { _: 'peerChat', chatId: bareId }\n case 'channel':\n return { _: 'peerChannel', channelId: bareId }\n }\n}\n"]}
package/esm/client.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { BaseTelegramClient, BaseTelegramClientOptions, MaybeAsync, MustEqual, RpcCallOptions, tl } from '@mtcute/core';
1
+ import { BaseTelegramClient, BaseTelegramClientOptions, MaybePromise, MustEqual, RpcCallOptions, tl } from '@mtcute/core';
2
2
  import { InputResponder } from './types.js';
3
3
  interface MessageBox {
4
4
  pts: number;
@@ -31,7 +31,7 @@ export declare class StubTelegramClient extends BaseTelegramClient {
31
31
  onRawMessage(fn: (data: Uint8Array) => void): void;
32
32
  private _responders;
33
33
  addResponder<T extends tl.RpcMethod['_']>(responders: InputResponder<T>): void;
34
- respondWith<T extends tl.RpcMethod['_'], Fn extends (data: tl.FindByName<tl.RpcMethod, T>) => MaybeAsync<tl.RpcCallReturn[T]>>(method: T, response: Fn): Fn;
34
+ respondWith<T extends tl.RpcMethod['_'], Fn extends (data: tl.FindByName<tl.RpcMethod, T>) => MaybePromise<tl.RpcCallReturn[T]>>(method: T, response: Fn): Fn;
35
35
  call<T extends tl.RpcMethod>(message: MustEqual<T, tl.RpcMethod>, params?: RpcCallOptions): Promise<tl.RpcCallReturn[T['_']]>;
36
36
  private _fakeMessageBoxes;
37
37
  private _lastQts;
@@ -48,7 +48,6 @@ export declare class StubTelegramClient extends BaseTelegramClient {
48
48
  seq?: number;
49
49
  seqCount?: number;
50
50
  }): tl.TypeUpdates;
51
- connectAndWait(): Promise<void>;
52
- with(fn: () => MaybeAsync<void>): Promise<void>;
51
+ with(fn: () => MaybePromise<void>): Promise<void>;
53
52
  }
54
53
  export {};
package/esm/client.js CHANGED
@@ -1,4 +1,4 @@
1
- import { BaseTelegramClient, tl } from '@mtcute/core';
1
+ import { BaseTelegramClient, tl, } from '@mtcute/core';
2
2
  import { StubMemoryTelegramStorage } from './storage.js';
3
3
  import { StubTelegramTransport } from './transport.js';
4
4
  import { markedIdToPeer } from './utils.js';
@@ -13,17 +13,18 @@ export class StubTelegramClient extends BaseTelegramClient {
13
13
  apiHash: '',
14
14
  logLevel: 0,
15
15
  storage,
16
+ disableUpdates: true,
16
17
  transport: () => {
17
18
  const transport = new StubTelegramTransport({
18
19
  onMessage: (data) => {
19
20
  if (!this._onRawMessage) {
20
21
  if (this._responders.size) {
21
- this._emitError(new Error('Unexpected outgoing message'));
22
+ this.emitError(new Error('Unexpected outgoing message'));
22
23
  }
23
24
  return;
24
25
  }
25
26
  const dcId = transport._currentDc.id;
26
- const key = storage.getAuthKeyFor(dcId);
27
+ const key = storage.authKeys.get(dcId);
27
28
  if (key) {
28
29
  this._onRawMessage(storage.decryptOutgoingMessage(transport._crypto, data, dcId));
29
30
  }
@@ -84,7 +85,7 @@ export class StubTelegramClient extends BaseTelegramClient {
84
85
  else {
85
86
  this._knownChats.set(peer.id, peer);
86
87
  }
87
- await this._cachePeersFrom(peer);
88
+ await this.storage.peers.updatePeersFrom(peer);
88
89
  }
89
90
  }
90
91
  getPeers(ids) {
@@ -205,12 +206,8 @@ export class StubTelegramClient extends BaseTelegramClient {
205
206
  };
206
207
  }
207
208
  // helpers //
208
- async connectAndWait() {
209
- await this.connect();
210
- await new Promise((resolve) => this.once('usable', resolve));
211
- }
212
209
  async with(fn) {
213
- await this.connectAndWait();
210
+ await this.connect();
214
211
  let error;
215
212
  this.onError((err) => {
216
213
  error = err;
package/esm/client.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/client.ts"],"names":[],"mappings":"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","sourcesContent":["import { BaseTelegramClient, BaseTelegramClientOptions, MaybeAsync, MustEqual, RpcCallOptions, tl } from '@mtcute/core'\n\nimport { StubMemoryTelegramStorage } from './storage.js'\nimport { StubTelegramTransport } from './transport.js'\nimport { InputResponder } from './types.js'\nimport { markedIdToPeer } from './utils.js'\n\ninterface MessageBox {\n pts: number\n lastMessageId: number\n}\n\ntype InputPeerId = number | tl.TypePeer | false | undefined\n\nexport class StubTelegramClient extends BaseTelegramClient {\n constructor(params?: Partial<BaseTelegramClientOptions>) {\n const storage = new StubMemoryTelegramStorage({\n hasKeys: true,\n hasTempKeys: true,\n })\n\n super({\n apiId: 0,\n apiHash: '',\n logLevel: 0,\n storage,\n transport: () => {\n const transport = new StubTelegramTransport({\n onMessage: (data) => {\n if (!this._onRawMessage) {\n if (this._responders.size) {\n this._emitError(new Error('Unexpected outgoing message'))\n }\n\n return\n }\n\n const dcId = transport._currentDc!.id\n const key = storage.getAuthKeyFor(dcId)\n\n if (key) {\n this._onRawMessage(storage.decryptOutgoingMessage(transport._crypto, data, dcId))\n }\n },\n })\n\n return transport\n },\n ...params,\n })\n }\n\n /**\n * Create a fake client that may not actually be used for API calls\n *\n * Useful for testing \"offline\" methods\n */\n static offline() {\n const client = new StubTelegramClient()\n\n client.call = (obj) => {\n throw new Error(`Expected offline client to not make any API calls (method called: ${obj._})`)\n }\n\n return client\n }\n\n /**\n * Create a fake \"full\" client (i.e. TelegramClient)\n *\n * Basically a proxy that returns an empty function for every unknown method\n */\n static full() {\n const client = new StubTelegramClient()\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n return new Proxy(client, {\n get(target, prop) {\n if (typeof prop === 'string' && !(prop in target)) {\n return () => {}\n }\n\n return target[prop as keyof typeof target]\n },\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n }) as any\n // i don't want to type this properly since it would require depending test utils on client\n }\n\n // some fake peers handling //\n\n readonly _knownChats = new Map<number, tl.TypeChat>()\n readonly _knownUsers = new Map<number, tl.TypeUser>()\n _selfId = 0\n\n async registerPeers(...peers: (tl.TypeUser | tl.TypeChat)[]): Promise<void> {\n for (const peer of peers) {\n if (tl.isAnyUser(peer)) {\n this._knownUsers.set(peer.id, peer)\n } else {\n this._knownChats.set(peer.id, peer)\n }\n\n await this._cachePeersFrom(peer)\n }\n }\n\n getPeers(ids: InputPeerId[]) {\n const users: tl.TypeUser[] = []\n const chats: tl.TypeChat[] = []\n\n for (let id of ids) {\n if (!id) continue\n\n if (typeof id === 'number') {\n id = markedIdToPeer(id)\n }\n\n switch (id._) {\n case 'peerUser': {\n const user = this._knownUsers.get(id.userId)\n if (!user) throw new Error(`Unknown user with ID ${id.userId}`)\n\n users.push(user)\n break\n }\n case 'peerChat': {\n const chat = this._knownChats.get(id.chatId)\n if (!chat) throw new Error(`Unknown chat with ID ${id.chatId}`)\n\n chats.push(chat)\n break\n }\n case 'peerChannel': {\n const chat = this._knownChats.get(id.channelId)\n if (!chat) throw new Error(`Unknown channel with ID ${id.channelId}`)\n\n chats.push(chat)\n break\n }\n }\n }\n\n return { users, chats }\n }\n\n // method calls intercepting //\n\n private _onRawMessage?: (data: Uint8Array) => void\n onRawMessage(fn: (data: Uint8Array) => void): void {\n this._onRawMessage = fn\n }\n\n // eslint-disable-next-line func-call-spacing\n private _responders = new Map<string, (data: unknown) => unknown>()\n\n addResponder<T extends tl.RpcMethod['_']>(responders: InputResponder<T>): void {\n if (Array.isArray(responders)) {\n for (const responder of responders) {\n this.addResponder(responder as InputResponder<tl.RpcMethod['_']>)\n }\n\n return\n }\n\n if (typeof responders === 'function') {\n responders = responders(this)\n }\n\n const [method, responder] = responders\n this.respondWith(method, responder)\n }\n\n respondWith<\n T extends tl.RpcMethod['_'],\n Fn extends(data: tl.FindByName<tl.RpcMethod, T>) => MaybeAsync<tl.RpcCallReturn[T]>,\n >(method: T, response: Fn): Fn {\n // eslint-disable-next-line\n this._responders.set(method, response as any)\n\n return response\n }\n\n async call<T extends tl.RpcMethod>(\n message: MustEqual<T, tl.RpcMethod>,\n params?: RpcCallOptions,\n ): Promise<tl.RpcCallReturn[T['_']]> {\n if (this._responders.has(message._)) {\n // eslint-disable-next-line\n return Promise.resolve(this._responders.get(message._)!(message)) as any\n }\n\n return super.call(message, params)\n }\n\n // some fake updates mechanism //\n\n private _fakeMessageBoxes = new Map<number, MessageBox>()\n private _lastQts = 0\n private _lastDate = Math.floor(Date.now() / 1000)\n private _lastSeq = 0\n\n getMessageBox(chatId = 0): MessageBox {\n const state = this._fakeMessageBoxes.get(chatId)\n\n if (!state) {\n const newState = { pts: 0, lastMessageId: 0 }\n this._fakeMessageBoxes.set(chatId, newState)\n\n return newState\n }\n\n return state\n }\n\n getNextMessageId(chatId = 0) {\n const state = this.getMessageBox(chatId)\n\n const nextId = state.lastMessageId + 1\n state.lastMessageId = nextId\n\n return nextId\n }\n\n getNextPts(chatId = 0, count = 1) {\n const state = this.getMessageBox(chatId)\n\n const nextPts = state.pts + count\n state.pts = nextPts\n\n return nextPts\n }\n\n getNextQts() {\n return this._lastQts++\n }\n\n getNextDate() {\n return (this._lastDate = Math.floor(Date.now() / 1000))\n }\n\n createStubUpdates(params: {\n updates: tl.TypeUpdate[]\n peers?: (number | tl.TypePeer)[]\n seq?: number\n seqCount?: number\n }): tl.TypeUpdates {\n const { peers, updates, seq = 0, seqCount = 1 } = params\n\n const { users, chats } = this.getPeers(peers ?? [])\n\n const seqStart = seq - seqCount + 1\n\n if (seq !== 0) {\n this._lastSeq = seq + seqCount\n }\n\n if (seqStart !== seq) {\n return {\n _: 'updatesCombined',\n updates,\n users,\n chats,\n date: this.getNextDate(),\n seq,\n seqStart,\n }\n }\n\n return {\n _: 'updates',\n updates,\n users,\n chats,\n date: this.getNextDate(),\n seq,\n }\n }\n\n // helpers //\n\n async connectAndWait() {\n await this.connect()\n await new Promise((resolve) => this.once('usable', resolve))\n }\n\n async with(fn: () => MaybeAsync<void>): Promise<void> {\n await this.connectAndWait()\n\n let error: unknown\n\n this.onError((err) => {\n error = err\n })\n\n try {\n await fn()\n } catch (e) {\n error = e\n }\n\n await this.close()\n\n if (error) {\n // eslint-disable-next-line @typescript-eslint/no-throw-literal\n throw error\n }\n }\n}\n"]}
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/client.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n BaseTelegramClient,\n BaseTelegramClientOptions,\n MaybePromise,\n MustEqual,\n RpcCallOptions,\n tl,\n} from '@mtcute/core'\n\nimport { StubMemoryTelegramStorage } from './storage.js'\nimport { StubTelegramTransport } from './transport.js'\nimport { InputResponder } from './types.js'\nimport { markedIdToPeer } from './utils.js'\n\ninterface MessageBox {\n pts: number\n lastMessageId: number\n}\n\ntype InputPeerId = number | tl.TypePeer | false | undefined\n\nexport class StubTelegramClient extends BaseTelegramClient {\n constructor(params?: Partial<BaseTelegramClientOptions>) {\n const storage = new StubMemoryTelegramStorage({\n hasKeys: true,\n hasTempKeys: true,\n })\n\n super({\n apiId: 0,\n apiHash: '',\n logLevel: 0,\n storage,\n disableUpdates: true,\n transport: () => {\n const transport = new StubTelegramTransport({\n onMessage: (data) => {\n if (!this._onRawMessage) {\n if (this._responders.size) {\n this.emitError(new Error('Unexpected outgoing message'))\n }\n\n return\n }\n\n const dcId = transport._currentDc!.id\n const key = storage.authKeys.get(dcId)\n\n if (key) {\n this._onRawMessage(storage.decryptOutgoingMessage(transport._crypto, data, dcId))\n }\n },\n })\n\n return transport\n },\n ...params,\n })\n }\n\n /**\n * Create a fake client that may not actually be used for API calls\n *\n * Useful for testing \"offline\" methods\n */\n static offline() {\n const client = new StubTelegramClient()\n\n client.call = (obj) => {\n throw new Error(`Expected offline client to not make any API calls (method called: ${obj._})`)\n }\n\n return client\n }\n\n /**\n * Create a fake \"full\" client (i.e. TelegramClient)\n *\n * Basically a proxy that returns an empty function for every unknown method\n */\n static full() {\n const client = new StubTelegramClient()\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n return new Proxy(client, {\n get(target, prop) {\n if (typeof prop === 'string' && !(prop in target)) {\n return () => {}\n }\n\n return target[prop as keyof typeof target]\n },\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n }) as any\n // i don't want to type this properly since it would require depending test utils on client\n }\n\n // some fake peers handling //\n\n readonly _knownChats = new Map<number, tl.TypeChat>()\n readonly _knownUsers = new Map<number, tl.TypeUser>()\n _selfId = 0\n\n async registerPeers(...peers: (tl.TypeUser | tl.TypeChat)[]): Promise<void> {\n for (const peer of peers) {\n if (tl.isAnyUser(peer)) {\n this._knownUsers.set(peer.id, peer)\n } else {\n this._knownChats.set(peer.id, peer)\n }\n\n await this.storage.peers.updatePeersFrom(peer)\n }\n }\n\n getPeers(ids: InputPeerId[]) {\n const users: tl.TypeUser[] = []\n const chats: tl.TypeChat[] = []\n\n for (let id of ids) {\n if (!id) continue\n\n if (typeof id === 'number') {\n id = markedIdToPeer(id)\n }\n\n switch (id._) {\n case 'peerUser': {\n const user = this._knownUsers.get(id.userId)\n if (!user) throw new Error(`Unknown user with ID ${id.userId}`)\n\n users.push(user)\n break\n }\n case 'peerChat': {\n const chat = this._knownChats.get(id.chatId)\n if (!chat) throw new Error(`Unknown chat with ID ${id.chatId}`)\n\n chats.push(chat)\n break\n }\n case 'peerChannel': {\n const chat = this._knownChats.get(id.channelId)\n if (!chat) throw new Error(`Unknown channel with ID ${id.channelId}`)\n\n chats.push(chat)\n break\n }\n }\n }\n\n return { users, chats }\n }\n\n // method calls intercepting //\n\n private _onRawMessage?: (data: Uint8Array) => void\n onRawMessage(fn: (data: Uint8Array) => void): void {\n this._onRawMessage = fn\n }\n\n // eslint-disable-next-line func-call-spacing\n private _responders = new Map<string, (data: unknown) => unknown>()\n\n addResponder<T extends tl.RpcMethod['_']>(responders: InputResponder<T>): void {\n if (Array.isArray(responders)) {\n for (const responder of responders) {\n this.addResponder(responder as InputResponder<tl.RpcMethod['_']>)\n }\n\n return\n }\n\n if (typeof responders === 'function') {\n responders = responders(this)\n }\n\n const [method, responder] = responders\n this.respondWith(method, responder)\n }\n\n respondWith<\n T extends tl.RpcMethod['_'],\n Fn extends(data: tl.FindByName<tl.RpcMethod, T>) => MaybePromise<tl.RpcCallReturn[T]>,\n >(method: T, response: Fn): Fn {\n // eslint-disable-next-line\n this._responders.set(method, response as any)\n\n return response\n }\n\n async call<T extends tl.RpcMethod>(\n message: MustEqual<T, tl.RpcMethod>,\n params?: RpcCallOptions,\n ): Promise<tl.RpcCallReturn[T['_']]> {\n if (this._responders.has(message._)) {\n // eslint-disable-next-line\n return Promise.resolve(this._responders.get(message._)!(message)) as any\n }\n\n return super.call(message, params)\n }\n\n // some fake updates mechanism //\n\n private _fakeMessageBoxes = new Map<number, MessageBox>()\n private _lastQts = 0\n private _lastDate = Math.floor(Date.now() / 1000)\n private _lastSeq = 0\n\n getMessageBox(chatId = 0): MessageBox {\n const state = this._fakeMessageBoxes.get(chatId)\n\n if (!state) {\n const newState = { pts: 0, lastMessageId: 0 }\n this._fakeMessageBoxes.set(chatId, newState)\n\n return newState\n }\n\n return state\n }\n\n getNextMessageId(chatId = 0) {\n const state = this.getMessageBox(chatId)\n\n const nextId = state.lastMessageId + 1\n state.lastMessageId = nextId\n\n return nextId\n }\n\n getNextPts(chatId = 0, count = 1) {\n const state = this.getMessageBox(chatId)\n\n const nextPts = state.pts + count\n state.pts = nextPts\n\n return nextPts\n }\n\n getNextQts() {\n return this._lastQts++\n }\n\n getNextDate() {\n return (this._lastDate = Math.floor(Date.now() / 1000))\n }\n\n createStubUpdates(params: {\n updates: tl.TypeUpdate[]\n peers?: (number | tl.TypePeer)[]\n seq?: number\n seqCount?: number\n }): tl.TypeUpdates {\n const { peers, updates, seq = 0, seqCount = 1 } = params\n\n const { users, chats } = this.getPeers(peers ?? [])\n\n const seqStart = seq - seqCount + 1\n\n if (seq !== 0) {\n this._lastSeq = seq + seqCount\n }\n\n if (seqStart !== seq) {\n return {\n _: 'updatesCombined',\n updates,\n users,\n chats,\n date: this.getNextDate(),\n seq,\n seqStart,\n }\n }\n\n return {\n _: 'updates',\n updates,\n users,\n chats,\n date: this.getNextDate(),\n seq,\n }\n }\n\n // helpers //\n\n async with(fn: () => MaybePromise<void>): Promise<void> {\n await this.connect()\n\n let error: unknown\n\n this.onError((err) => {\n error = err\n })\n\n try {\n await fn()\n } catch (e) {\n error = e\n }\n\n await this.close()\n\n if (error) {\n // eslint-disable-next-line @typescript-eslint/no-throw-literal\n throw error\n }\n }\n}\n"]}
package/esm/crypto.js CHANGED
@@ -160,7 +160,7 @@ export function testCryptoProvider(c) {
160
160
  export function u8HexDecode(hex) {
161
161
  const buf = hexDecodeToBuffer(hex);
162
162
  // eslint-disable-next-line no-restricted-globals
163
- if (import.meta.env.TEST_ENV === 'node' && Buffer.isBuffer(buf)) {
163
+ if ((import.meta.env.TEST_ENV === 'node' || import.meta.env.TEST_ENV === 'bun') && Buffer.isBuffer(buf)) {
164
164
  return new Uint8Array(buf);
165
165
  }
166
166
  return 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' && 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 {\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"]}
package/esm/index.d.ts CHANGED
@@ -1,7 +1,7 @@
1
1
  export * from './client.js';
2
2
  export * from './crypto.js';
3
3
  export * from './storage.js';
4
- export * from './storage-test.js';
4
+ export * from './storage/index.js';
5
5
  export * from './stub.js';
6
6
  export * from './transport.js';
7
7
  export * from './types.js';
package/esm/index.js CHANGED
@@ -1,7 +1,7 @@
1
1
  export * from './client.js';
2
2
  export * from './crypto.js';
3
3
  export * from './storage.js';
4
- export * from './storage-test.js';
4
+ export * from './storage/index.js';
5
5
  export * from './stub.js';
6
6
  export * from './transport.js';
7
7
  export * from './types.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,mBAAmB,CAAA;AACjC,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-test.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,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"]}
@@ -0,0 +1,3 @@
1
+ import { IAuthKeysRepository } from '@mtcute/core';
2
+ export declare function fakeAuthKeysRepository(): IAuthKeysRepository;
3
+ export declare function testAuthKeysRepository(repo: IAuthKeysRepository): void;