@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,90 @@
1
+ import { afterEach, describe, expect, it, vi } from 'vitest';
2
+ export function fakeAuthKeysRepository() {
3
+ return {
4
+ get: vi.fn(),
5
+ set: vi.fn(),
6
+ getTemp: vi.fn(),
7
+ setTemp: vi.fn(),
8
+ deleteByDc: vi.fn(),
9
+ deleteAll: vi.fn(),
10
+ };
11
+ }
12
+ function fixBuffer(buf) {
13
+ if (!buf)
14
+ return buf;
15
+ // eslint-disable-next-line no-restricted-globals
16
+ return typeof Buffer !== 'undefined' && buf instanceof Buffer ? new Uint8Array(buf) : buf;
17
+ }
18
+ export function testAuthKeysRepository(repo) {
19
+ const key2 = new Uint8Array(256).fill(0x42);
20
+ const key3 = new Uint8Array(256).fill(0x43);
21
+ const key2i0 = new Uint8Array(256).fill(0x44);
22
+ const key2i1 = new Uint8Array(256).fill(0x45);
23
+ const key3i0 = new Uint8Array(256).fill(0x46);
24
+ const key3i1 = new Uint8Array(256).fill(0x47);
25
+ describe('auth keys', () => {
26
+ afterEach(() => repo.deleteAll());
27
+ it('should be empty by default', async () => {
28
+ expect(fixBuffer(await repo.get(2))).toEqual(null);
29
+ expect(fixBuffer(await repo.get(3))).toEqual(null);
30
+ });
31
+ it('should store and retrieve auth keys', async () => {
32
+ await repo.set(2, key2);
33
+ await repo.set(3, key3);
34
+ expect(fixBuffer(await repo.get(2))).toEqual(key2);
35
+ expect(fixBuffer(await repo.get(3))).toEqual(key3);
36
+ });
37
+ it('should delete auth keys', async () => {
38
+ await repo.set(2, key2);
39
+ await repo.set(3, key3);
40
+ await repo.set(2, null);
41
+ await repo.set(3, null);
42
+ expect(fixBuffer(await repo.get(2))).toEqual(null);
43
+ expect(fixBuffer(await repo.get(3))).toEqual(null);
44
+ });
45
+ it('should store and retrieve temp auth keys', async () => {
46
+ await repo.setTemp(2, 0, key2i0, 1);
47
+ await repo.setTemp(2, 1, key2i1, 1);
48
+ await repo.setTemp(3, 0, key3i0, 1);
49
+ await repo.setTemp(3, 1, key3i1, 1);
50
+ expect(fixBuffer(await repo.getTemp(2, 0, 0))).toEqual(key2i0);
51
+ expect(fixBuffer(await repo.getTemp(2, 1, 0))).toEqual(key2i1);
52
+ expect(fixBuffer(await repo.getTemp(3, 0, 0))).toEqual(key3i0);
53
+ expect(fixBuffer(await repo.getTemp(3, 1, 0))).toEqual(key3i1);
54
+ expect(fixBuffer(await repo.getTemp(2, 0, 100))).toEqual(null);
55
+ expect(fixBuffer(await repo.getTemp(2, 1, 100))).toEqual(null);
56
+ expect(fixBuffer(await repo.getTemp(3, 0, 100))).toEqual(null);
57
+ expect(fixBuffer(await repo.getTemp(3, 1, 100))).toEqual(null);
58
+ });
59
+ it('should delete temp auth keys', async () => {
60
+ await repo.setTemp(2, 0, key2i0, 1);
61
+ await repo.setTemp(2, 1, key2i1, 1);
62
+ await repo.setTemp(3, 0, key3i0, 1);
63
+ await repo.setTemp(3, 1, key3i1, 1);
64
+ await repo.setTemp(2, 0, null, 1);
65
+ await repo.setTemp(2, 1, null, 1);
66
+ await repo.setTemp(3, 0, null, 1);
67
+ await repo.setTemp(3, 1, null, 1);
68
+ expect(fixBuffer(await repo.getTemp(2, 0, 0))).toEqual(null);
69
+ expect(fixBuffer(await repo.getTemp(2, 1, 0))).toEqual(null);
70
+ expect(fixBuffer(await repo.getTemp(3, 0, 0))).toEqual(null);
71
+ expect(fixBuffer(await repo.getTemp(3, 1, 0))).toEqual(null);
72
+ });
73
+ it('should delete all auth keys by DC', async () => {
74
+ await repo.set(2, key2);
75
+ await repo.set(3, key3);
76
+ await repo.setTemp(2, 0, key2i0, 1);
77
+ await repo.setTemp(2, 1, key2i1, 1);
78
+ await repo.setTemp(3, 0, key3i0, 1);
79
+ await repo.setTemp(3, 1, key3i1, 1);
80
+ await repo.deleteByDc(2);
81
+ expect(fixBuffer(await repo.get(2))).toEqual(null);
82
+ expect(fixBuffer(await repo.get(3))).toEqual(key3);
83
+ expect(fixBuffer(await repo.getTemp(2, 0, 0))).toEqual(null);
84
+ expect(fixBuffer(await repo.getTemp(2, 1, 0))).toEqual(null);
85
+ expect(fixBuffer(await repo.getTemp(3, 0, 0))).toEqual(key3i0);
86
+ expect(fixBuffer(await repo.getTemp(3, 1, 0))).toEqual(key3i1);
87
+ });
88
+ });
89
+ }
90
+ //# sourceMappingURL=auth-keys.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth-keys.js","sourceRoot":"","sources":["../../../src/storage/auth-keys.ts"],"names":[],"mappings":"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","sourcesContent":["import { afterEach, describe, expect, it, vi } from 'vitest'\n\nimport { IAuthKeysRepository } from '@mtcute/core'\n\nexport function fakeAuthKeysRepository(): IAuthKeysRepository {\n return {\n get: vi.fn(),\n set: vi.fn(),\n getTemp: vi.fn(),\n setTemp: vi.fn(),\n deleteByDc: vi.fn(),\n deleteAll: vi.fn(),\n }\n}\n\nfunction fixBuffer(buf: Uint8Array | null): Uint8Array | null {\n if (!buf) return buf\n\n // eslint-disable-next-line no-restricted-globals\n return typeof Buffer !== 'undefined' && buf instanceof Buffer ? new Uint8Array(buf) : buf\n}\n\nexport function testAuthKeysRepository(repo: IAuthKeysRepository) {\n const key2 = new Uint8Array(256).fill(0x42)\n const key3 = new Uint8Array(256).fill(0x43)\n\n const key2i0 = new Uint8Array(256).fill(0x44)\n const key2i1 = new Uint8Array(256).fill(0x45)\n const key3i0 = new Uint8Array(256).fill(0x46)\n const key3i1 = new Uint8Array(256).fill(0x47)\n\n describe('auth keys', () => {\n afterEach(() => repo.deleteAll())\n\n it('should be empty by default', async () => {\n expect(fixBuffer(await repo.get(2))).toEqual(null)\n expect(fixBuffer(await repo.get(3))).toEqual(null)\n })\n\n it('should store and retrieve auth keys', async () => {\n await repo.set(2, key2)\n await repo.set(3, key3)\n\n expect(fixBuffer(await repo.get(2))).toEqual(key2)\n expect(fixBuffer(await repo.get(3))).toEqual(key3)\n })\n\n it('should delete auth keys', async () => {\n await repo.set(2, key2)\n await repo.set(3, key3)\n\n await repo.set(2, null)\n await repo.set(3, null)\n\n expect(fixBuffer(await repo.get(2))).toEqual(null)\n expect(fixBuffer(await repo.get(3))).toEqual(null)\n })\n\n it('should store and retrieve temp auth keys', async () => {\n await repo.setTemp(2, 0, key2i0, 1)\n await repo.setTemp(2, 1, key2i1, 1)\n await repo.setTemp(3, 0, key3i0, 1)\n await repo.setTemp(3, 1, key3i1, 1)\n\n expect(fixBuffer(await repo.getTemp(2, 0, 0))).toEqual(key2i0)\n expect(fixBuffer(await repo.getTemp(2, 1, 0))).toEqual(key2i1)\n expect(fixBuffer(await repo.getTemp(3, 0, 0))).toEqual(key3i0)\n expect(fixBuffer(await repo.getTemp(3, 1, 0))).toEqual(key3i1)\n\n expect(fixBuffer(await repo.getTemp(2, 0, 100))).toEqual(null)\n expect(fixBuffer(await repo.getTemp(2, 1, 100))).toEqual(null)\n expect(fixBuffer(await repo.getTemp(3, 0, 100))).toEqual(null)\n expect(fixBuffer(await repo.getTemp(3, 1, 100))).toEqual(null)\n })\n\n it('should delete temp auth keys', async () => {\n await repo.setTemp(2, 0, key2i0, 1)\n await repo.setTemp(2, 1, key2i1, 1)\n await repo.setTemp(3, 0, key3i0, 1)\n await repo.setTemp(3, 1, key3i1, 1)\n\n await repo.setTemp(2, 0, null, 1)\n await repo.setTemp(2, 1, null, 1)\n await repo.setTemp(3, 0, null, 1)\n await repo.setTemp(3, 1, null, 1)\n\n expect(fixBuffer(await repo.getTemp(2, 0, 0))).toEqual(null)\n expect(fixBuffer(await repo.getTemp(2, 1, 0))).toEqual(null)\n expect(fixBuffer(await repo.getTemp(3, 0, 0))).toEqual(null)\n expect(fixBuffer(await repo.getTemp(3, 1, 0))).toEqual(null)\n })\n\n it('should delete all auth keys by DC', async () => {\n await repo.set(2, key2)\n await repo.set(3, key3)\n\n await repo.setTemp(2, 0, key2i0, 1)\n await repo.setTemp(2, 1, key2i1, 1)\n await repo.setTemp(3, 0, key3i0, 1)\n await repo.setTemp(3, 1, key3i1, 1)\n\n await repo.deleteByDc(2)\n\n expect(fixBuffer(await repo.get(2))).toEqual(null)\n expect(fixBuffer(await repo.get(3))).toEqual(key3)\n\n expect(fixBuffer(await repo.getTemp(2, 0, 0))).toEqual(null)\n expect(fixBuffer(await repo.getTemp(2, 1, 0))).toEqual(null)\n expect(fixBuffer(await repo.getTemp(3, 0, 0))).toEqual(key3i0)\n expect(fixBuffer(await repo.getTemp(3, 1, 0))).toEqual(key3i1)\n })\n })\n}\n"]}
@@ -0,0 +1,4 @@
1
+ export * from './auth-keys.js';
2
+ export * from './key-value.js';
3
+ export * from './peers.js';
4
+ export * from './ref-messages.js';
@@ -0,0 +1,5 @@
1
+ export * from './auth-keys.js';
2
+ export * from './key-value.js';
3
+ export * from './peers.js';
4
+ export * from './ref-messages.js';
5
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/storage/index.ts"],"names":[],"mappings":"AAAA,cAAc,gBAAgB,CAAA;AAC9B,cAAc,gBAAgB,CAAA;AAC9B,cAAc,YAAY,CAAA;AAC1B,cAAc,mBAAmB,CAAA","sourcesContent":["export * from './auth-keys.js'\nexport * from './key-value.js'\nexport * from './peers.js'\nexport * from './ref-messages.js'\n"]}
@@ -0,0 +1,3 @@
1
+ import { IKeyValueRepository, IStorageDriver } from '@mtcute/core';
2
+ export declare function fakeKeyValueRepository(): IKeyValueRepository;
3
+ export declare function testKeyValueRepository(repo: IKeyValueRepository, driver: IStorageDriver): void;
@@ -0,0 +1,36 @@
1
+ import { afterEach, describe, expect, it, vi } from 'vitest';
2
+ export function fakeKeyValueRepository() {
3
+ return {
4
+ get: vi.fn(),
5
+ set: vi.fn(),
6
+ delete: vi.fn(),
7
+ deleteAll: vi.fn(),
8
+ };
9
+ }
10
+ function fixBuffer(buf) {
11
+ if (!buf)
12
+ return buf;
13
+ // eslint-disable-next-line no-restricted-globals
14
+ return typeof Buffer !== 'undefined' && buf instanceof Buffer ? new Uint8Array(buf) : buf;
15
+ }
16
+ export function testKeyValueRepository(repo, driver) {
17
+ describe('key-value', () => {
18
+ afterEach(() => repo.deleteAll());
19
+ it('should be empty by default', async () => {
20
+ expect(fixBuffer(await repo.get('key'))).toEqual(null);
21
+ });
22
+ it('should store and retrieve values', async () => {
23
+ await repo.set('key', new Uint8Array([1, 2, 3]));
24
+ await driver.save?.();
25
+ expect(fixBuffer(await repo.get('key'))).toEqual(new Uint8Array([1, 2, 3]));
26
+ });
27
+ it('should delete values', async () => {
28
+ await repo.set('key', new Uint8Array([1, 2, 3]));
29
+ await driver.save?.();
30
+ await repo.delete('key');
31
+ await driver.save?.();
32
+ expect(fixBuffer(await repo.get('key'))).toEqual(null);
33
+ });
34
+ });
35
+ }
36
+ //# sourceMappingURL=key-value.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"key-value.js","sourceRoot":"","sources":["../../../src/storage/key-value.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAA;AAI5D,MAAM,UAAU,sBAAsB;IAClC,OAAO;QACH,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE;QACZ,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE;QACZ,MAAM,EAAE,EAAE,CAAC,EAAE,EAAE;QACf,SAAS,EAAE,EAAE,CAAC,EAAE,EAAE;KACrB,CAAA;AACL,CAAC;AAED,SAAS,SAAS,CAAC,GAAsB;IACrC,IAAI,CAAC,GAAG;QAAE,OAAO,GAAG,CAAA;IAEpB,iDAAiD;IACjD,OAAO,OAAO,MAAM,KAAK,WAAW,IAAI,GAAG,YAAY,MAAM,CAAC,CAAC,CAAC,IAAI,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAA;AAC7F,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,IAAyB,EAAE,MAAsB;IACpF,QAAQ,CAAC,WAAW,EAAE,GAAG,EAAE;QACvB,SAAS,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC,CAAA;QAEjC,EAAE,CAAC,4BAA4B,EAAE,KAAK,IAAI,EAAE;YACxC,MAAM,CAAC,SAAS,CAAC,MAAM,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAA;QAC1D,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,kCAAkC,EAAE,KAAK,IAAI,EAAE;YAC9C,MAAM,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAA;YAChD,MAAM,MAAM,CAAC,IAAI,EAAE,EAAE,CAAA;YAErB,MAAM,CAAC,SAAS,CAAC,MAAM,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAA;QAC/E,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,sBAAsB,EAAE,KAAK,IAAI,EAAE;YAClC,MAAM,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAA;YAChD,MAAM,MAAM,CAAC,IAAI,EAAE,EAAE,CAAA;YAErB,MAAM,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;YACxB,MAAM,MAAM,CAAC,IAAI,EAAE,EAAE,CAAA;YAErB,MAAM,CAAC,SAAS,CAAC,MAAM,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAA;QAC1D,CAAC,CAAC,CAAA;IACN,CAAC,CAAC,CAAA;AACN,CAAC","sourcesContent":["import { afterEach, describe, expect, it, vi } from 'vitest'\n\nimport { IKeyValueRepository, IStorageDriver } from '@mtcute/core'\n\nexport function fakeKeyValueRepository(): IKeyValueRepository {\n return {\n get: vi.fn(),\n set: vi.fn(),\n delete: vi.fn(),\n deleteAll: vi.fn(),\n }\n}\n\nfunction fixBuffer(buf: Uint8Array | null): Uint8Array | null {\n if (!buf) return buf\n\n // eslint-disable-next-line no-restricted-globals\n return typeof Buffer !== 'undefined' && buf instanceof Buffer ? new Uint8Array(buf) : buf\n}\n\nexport function testKeyValueRepository(repo: IKeyValueRepository, driver: IStorageDriver) {\n describe('key-value', () => {\n afterEach(() => repo.deleteAll())\n\n it('should be empty by default', async () => {\n expect(fixBuffer(await repo.get('key'))).toEqual(null)\n })\n\n it('should store and retrieve values', async () => {\n await repo.set('key', new Uint8Array([1, 2, 3]))\n await driver.save?.()\n\n expect(fixBuffer(await repo.get('key'))).toEqual(new Uint8Array([1, 2, 3]))\n })\n\n it('should delete values', async () => {\n await repo.set('key', new Uint8Array([1, 2, 3]))\n await driver.save?.()\n\n await repo.delete('key')\n await driver.save?.()\n\n expect(fixBuffer(await repo.get('key'))).toEqual(null)\n })\n })\n}\n"]}
@@ -0,0 +1,3 @@
1
+ import { IPeersRepository, IStorageDriver } from '@mtcute/core';
2
+ export declare function fakePeersRepository(): IPeersRepository;
3
+ export declare function testPeersRepository(repo: IPeersRepository, driver: IStorageDriver): void;
@@ -0,0 +1,70 @@
1
+ import { describe, expect, it, vi } from 'vitest';
2
+ import { TlBinaryWriter } from '@mtcute/core/utils.js';
3
+ import { __tlWriterMap } from '@mtcute/tl/binary/writer.js';
4
+ import { createStub } from '../stub.js';
5
+ export function fakePeersRepository() {
6
+ return {
7
+ getById: vi.fn(),
8
+ getByUsername: vi.fn(),
9
+ getByPhone: vi.fn(),
10
+ store: vi.fn(),
11
+ deleteAll: vi.fn(),
12
+ };
13
+ }
14
+ function fixPeerInfo(peer) {
15
+ if (!peer)
16
+ return peer;
17
+ return {
18
+ ...peer,
19
+ complete:
20
+ // eslint-disable-next-line no-restricted-globals
21
+ typeof Buffer !== 'undefined' && peer.complete instanceof Buffer ?
22
+ new Uint8Array(peer.complete) :
23
+ peer.complete,
24
+ };
25
+ }
26
+ export function testPeersRepository(repo, driver) {
27
+ const stubPeerUser = {
28
+ id: 123123,
29
+ accessHash: '123|456',
30
+ usernames: ['some_user'],
31
+ phone: '78005553535',
32
+ updated: 666,
33
+ complete: TlBinaryWriter.serializeObject(__tlWriterMap, createStub('user', { id: 123123 })),
34
+ };
35
+ const stubPeerChannel = {
36
+ id: -1001183945448,
37
+ accessHash: '666|555',
38
+ usernames: ['some_channel'],
39
+ updated: 777,
40
+ complete: TlBinaryWriter.serializeObject(__tlWriterMap, createStub('channel', { id: 123123 })),
41
+ };
42
+ describe('peers', () => {
43
+ it('should be empty by default', async () => {
44
+ expect(await repo.getById(123123)).toEqual(null);
45
+ expect(await repo.getByUsername('some_user')).toEqual(null);
46
+ expect(await repo.getByPhone('phone')).toEqual(null);
47
+ });
48
+ it('should store and retrieve peers', async () => {
49
+ await repo.store(stubPeerUser);
50
+ await repo.store(stubPeerChannel);
51
+ await driver.save?.();
52
+ expect(fixPeerInfo(await repo.getById(123123))).toEqual(stubPeerUser);
53
+ expect(fixPeerInfo(await repo.getByUsername('some_user'))).toEqual(stubPeerUser);
54
+ expect(fixPeerInfo(await repo.getByPhone('78005553535'))).toEqual(stubPeerUser);
55
+ expect(fixPeerInfo(await repo.getById(-1001183945448))).toEqual(stubPeerChannel);
56
+ expect(fixPeerInfo(await repo.getByUsername('some_channel'))).toEqual(stubPeerChannel);
57
+ });
58
+ it('should update peers usernames', async () => {
59
+ await repo.store(stubPeerUser);
60
+ await driver.save?.();
61
+ const modUser = { ...stubPeerUser, usernames: ['some_user2'] };
62
+ await repo.store(modUser);
63
+ await driver.save?.();
64
+ expect(fixPeerInfo(await repo.getById(123123))).toEqual(modUser);
65
+ expect(await repo.getByUsername('some_user')).toEqual(null);
66
+ expect(fixPeerInfo(await repo.getByUsername('some_user2'))).toEqual(modUser);
67
+ });
68
+ });
69
+ }
70
+ //# sourceMappingURL=peers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"peers.js","sourceRoot":"","sources":["../../../src/storage/peers.ts"],"names":[],"mappings":"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","sourcesContent":["import { describe, expect, it, vi } from 'vitest'\n\nimport { IPeersRepository, IStorageDriver } from '@mtcute/core'\nimport { TlBinaryWriter } from '@mtcute/core/utils.js'\nimport { __tlWriterMap } from '@mtcute/tl/binary/writer.js'\n\nimport { createStub } from '../stub.js'\n\nexport function fakePeersRepository(): IPeersRepository {\n return {\n getById: vi.fn(),\n getByUsername: vi.fn(),\n getByPhone: vi.fn(),\n store: vi.fn(),\n deleteAll: vi.fn(),\n }\n}\n\nfunction fixPeerInfo(peer: IPeersRepository.PeerInfo | null): IPeersRepository.PeerInfo | null {\n if (!peer) return peer\n\n return {\n ...peer,\n complete:\n // eslint-disable-next-line no-restricted-globals\n typeof Buffer !== 'undefined' && peer.complete instanceof Buffer ?\n new Uint8Array(peer.complete) :\n peer.complete,\n }\n}\n\nexport function testPeersRepository(repo: IPeersRepository, driver: IStorageDriver) {\n const stubPeerUser: IPeersRepository.PeerInfo = {\n id: 123123,\n accessHash: '123|456',\n usernames: ['some_user'],\n phone: '78005553535',\n updated: 666,\n complete: TlBinaryWriter.serializeObject(__tlWriterMap, createStub('user', { id: 123123 })),\n }\n\n const stubPeerChannel: IPeersRepository.PeerInfo = {\n id: -1001183945448,\n accessHash: '666|555',\n usernames: ['some_channel'],\n updated: 777,\n complete: TlBinaryWriter.serializeObject(__tlWriterMap, createStub('channel', { id: 123123 })),\n }\n\n describe('peers', () => {\n it('should be empty by default', async () => {\n expect(await repo.getById(123123)).toEqual(null)\n expect(await repo.getByUsername('some_user')).toEqual(null)\n expect(await repo.getByPhone('phone')).toEqual(null)\n })\n\n it('should store and retrieve peers', async () => {\n await repo.store(stubPeerUser)\n await repo.store(stubPeerChannel)\n await driver.save?.()\n\n expect(fixPeerInfo(await repo.getById(123123))).toEqual(stubPeerUser)\n expect(fixPeerInfo(await repo.getByUsername('some_user'))).toEqual(stubPeerUser)\n expect(fixPeerInfo(await repo.getByPhone('78005553535'))).toEqual(stubPeerUser)\n\n expect(fixPeerInfo(await repo.getById(-1001183945448))).toEqual(stubPeerChannel)\n expect(fixPeerInfo(await repo.getByUsername('some_channel'))).toEqual(stubPeerChannel)\n })\n\n it('should update peers usernames', async () => {\n await repo.store(stubPeerUser)\n await driver.save?.()\n\n const modUser = { ...stubPeerUser, usernames: ['some_user2'] }\n await repo.store(modUser)\n await driver.save?.()\n\n expect(fixPeerInfo(await repo.getById(123123))).toEqual(modUser)\n expect(await repo.getByUsername('some_user')).toEqual(null)\n expect(fixPeerInfo(await repo.getByUsername('some_user2'))).toEqual(modUser)\n })\n })\n}\n"]}
@@ -0,0 +1,3 @@
1
+ import { IReferenceMessagesRepository, IStorageDriver } from '@mtcute/core';
2
+ export declare function fakeRefMessagesRepository(): IReferenceMessagesRepository;
3
+ export declare function testRefMessagesRepository(repo: IReferenceMessagesRepository, driver: IStorageDriver): void;
@@ -0,0 +1,64 @@
1
+ import { afterEach, describe, expect, it, vi } from 'vitest';
2
+ export function fakeRefMessagesRepository() {
3
+ return {
4
+ store: vi.fn(),
5
+ getByPeer: vi.fn(),
6
+ delete: vi.fn(),
7
+ deleteByPeer: vi.fn(),
8
+ deleteAll: vi.fn(),
9
+ };
10
+ }
11
+ export function testRefMessagesRepository(repo, driver) {
12
+ describe('IReferenceMessagesRepository', () => {
13
+ afterEach(() => repo.deleteAll());
14
+ it('should be empty by default', async () => {
15
+ expect(await repo.getByPeer(1)).toEqual(null);
16
+ });
17
+ it('should store and retrieve reference messages', async () => {
18
+ await repo.store(1, 2, 3);
19
+ await repo.store(1, 4, 5);
20
+ await repo.store(2, 6, 7);
21
+ await driver.save?.();
22
+ expect(await repo.getByPeer(1)).deep.oneOf([
23
+ [2, 3],
24
+ [4, 5],
25
+ ]);
26
+ expect(await repo.getByPeer(2)).toEqual([6, 7]);
27
+ expect(await repo.getByPeer(3)).toEqual(null);
28
+ expect(await repo.getByPeer(4)).toEqual(null);
29
+ expect(await repo.getByPeer(5)).toEqual(null);
30
+ expect(await repo.getByPeer(6)).toEqual(null);
31
+ expect(await repo.getByPeer(7)).toEqual(null);
32
+ });
33
+ it('should delete reference messages', async () => {
34
+ await repo.store(1, 2, 3);
35
+ await repo.store(1, 4, 5);
36
+ await repo.store(2, 6, 7);
37
+ await driver.save?.();
38
+ await repo.delete(4, [5]);
39
+ await driver.save?.();
40
+ expect(await repo.getByPeer(1)).toEqual([2, 3]);
41
+ await repo.delete(2, [2, 3, 4]);
42
+ await driver.save?.();
43
+ expect(await repo.getByPeer(1)).toEqual(null);
44
+ });
45
+ it('should delete all reference messages for a peer', async () => {
46
+ await repo.store(1, 2, 3);
47
+ await repo.store(1, 4, 5);
48
+ await repo.store(1, 6, 7);
49
+ await repo.store(2, 20, 30);
50
+ await repo.store(2, 40, 50);
51
+ await repo.store(2, 60, 70);
52
+ await driver.save?.();
53
+ await repo.deleteByPeer(1);
54
+ await driver.save?.();
55
+ expect(await repo.getByPeer(1)).toEqual(null);
56
+ expect(await repo.getByPeer(2)).deep.oneOf([
57
+ [20, 30],
58
+ [40, 50],
59
+ [60, 70],
60
+ ]);
61
+ });
62
+ });
63
+ }
64
+ //# sourceMappingURL=ref-messages.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ref-messages.js","sourceRoot":"","sources":["../../../src/storage/ref-messages.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAA;AAI5D,MAAM,UAAU,yBAAyB;IACrC,OAAO;QACH,KAAK,EAAE,EAAE,CAAC,EAAE,EAAE;QACd,SAAS,EAAE,EAAE,CAAC,EAAE,EAAE;QAClB,MAAM,EAAE,EAAE,CAAC,EAAE,EAAE;QACf,YAAY,EAAE,EAAE,CAAC,EAAE,EAAE;QACrB,SAAS,EAAE,EAAE,CAAC,EAAE,EAAE;KACrB,CAAA;AACL,CAAC;AAED,MAAM,UAAU,yBAAyB,CAAC,IAAkC,EAAE,MAAsB;IAChG,QAAQ,CAAC,8BAA8B,EAAE,GAAG,EAAE;QAC1C,SAAS,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC,CAAA;QAEjC,EAAE,CAAC,4BAA4B,EAAE,KAAK,IAAI,EAAE;YACxC,MAAM,CAAC,MAAM,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAA;QACjD,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,8CAA8C,EAAE,KAAK,IAAI,EAAE;YAC1D,MAAM,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAA;YACzB,MAAM,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAA;YACzB,MAAM,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAA;YACzB,MAAM,MAAM,CAAC,IAAI,EAAE,EAAE,CAAA;YAErB,MAAM,CAAC,MAAM,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC;gBACvC,CAAC,CAAC,EAAE,CAAC,CAAC;gBACN,CAAC,CAAC,EAAE,CAAC,CAAC;aACT,CAAC,CAAA;YACF,MAAM,CAAC,MAAM,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA;YAC/C,MAAM,CAAC,MAAM,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAA;YAC7C,MAAM,CAAC,MAAM,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAA;YAC7C,MAAM,CAAC,MAAM,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAA;YAC7C,MAAM,CAAC,MAAM,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAA;YAC7C,MAAM,CAAC,MAAM,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAA;QACjD,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,kCAAkC,EAAE,KAAK,IAAI,EAAE;YAC9C,MAAM,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAA;YACzB,MAAM,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAA;YACzB,MAAM,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAA;YACzB,MAAM,MAAM,CAAC,IAAI,EAAE,EAAE,CAAA;YAErB,MAAM,IAAI,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAA;YACzB,MAAM,MAAM,CAAC,IAAI,EAAE,EAAE,CAAA;YACrB,MAAM,CAAC,MAAM,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA;YAE/C,MAAM,IAAI,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA;YAC/B,MAAM,MAAM,CAAC,IAAI,EAAE,EAAE,CAAA;YACrB,MAAM,CAAC,MAAM,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAA;QACjD,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,iDAAiD,EAAE,KAAK,IAAI,EAAE;YAC7D,MAAM,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAA;YACzB,MAAM,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAA;YACzB,MAAM,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAA;YAEzB,MAAM,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC,CAAA;YAC3B,MAAM,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC,CAAA;YAC3B,MAAM,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC,CAAA;YAC3B,MAAM,MAAM,CAAC,IAAI,EAAE,EAAE,CAAA;YAErB,MAAM,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,CAAA;YAC1B,MAAM,MAAM,CAAC,IAAI,EAAE,EAAE,CAAA;YACrB,MAAM,CAAC,MAAM,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAA;YAC7C,MAAM,CAAC,MAAM,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC;gBACvC,CAAC,EAAE,EAAE,EAAE,CAAC;gBACR,CAAC,EAAE,EAAE,EAAE,CAAC;gBACR,CAAC,EAAE,EAAE,EAAE,CAAC;aACX,CAAC,CAAA;QACN,CAAC,CAAC,CAAA;IACN,CAAC,CAAC,CAAA;AACN,CAAC","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/esm/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/esm/storage.js CHANGED
@@ -1,5 +1,4 @@
1
- import { MtArgumentError } from '@mtcute/core';
2
- import { MemoryStorage } from '@mtcute/core/storage/memory.js';
1
+ import { MemoryStorage, MtArgumentError } from '@mtcute/core';
3
2
  import { createAesIgeForMessage } from '@mtcute/core/utils.js';
4
3
  export class StubMemoryTelegramStorage extends MemoryStorage {
5
4
  constructor(params = {
@@ -8,37 +7,27 @@ export class StubMemoryTelegramStorage extends MemoryStorage {
8
7
  }) {
9
8
  super();
10
9
  this.params = params;
11
- }
12
- getAuthKeyFor(dcId, tempIndex) {
13
- if (tempIndex === undefined && this.params.hasKeys) {
14
- if (this.params.hasKeys === true || this.params.hasKeys.includes(dcId)) {
15
- return new Uint8Array(256);
10
+ const _origGet = this.authKeys.get;
11
+ this.authKeys.get = (dcId) => {
12
+ if (this.params.hasKeys) {
13
+ if (this.params.hasKeys === true || this.params.hasKeys.includes(dcId)) {
14
+ return new Uint8Array(256);
15
+ }
16
16
  }
17
- }
18
- if (tempIndex === undefined && this.params.hasTempKeys) {
19
- if (this.params.hasTempKeys === true || this.params.hasTempKeys.includes(dcId)) {
20
- return new Uint8Array(256);
17
+ return _origGet.call(this.authKeys, dcId);
18
+ };
19
+ const _origGetTemp = this.authKeys.getTemp;
20
+ this.authKeys.getTemp = (dcId, idx, now) => {
21
+ if (this.params.hasTempKeys) {
22
+ if (this.params.hasTempKeys === true || this.params.hasTempKeys.includes(dcId)) {
23
+ return new Uint8Array(256);
24
+ }
21
25
  }
22
- }
23
- return super.getAuthKeyFor(dcId, tempIndex);
24
- }
25
- load() {
26
- this.params.onLoad?.();
27
- super.load();
28
- }
29
- save() {
30
- this.params.onSave?.();
31
- }
32
- destroy() {
33
- this.params.onDestroy?.();
34
- super.destroy();
35
- }
36
- reset(withKeys = false) {
37
- this.params?.onReset?.();
38
- super.reset(withKeys);
26
+ return _origGetTemp.call(this.authKeys, dcId, idx, now);
27
+ };
39
28
  }
40
29
  decryptOutgoingMessage(crypto, data, dcId, tempIndex) {
41
- const key = this.getAuthKeyFor(dcId, tempIndex);
30
+ const key = tempIndex ? this.authKeys.getTemp(dcId, tempIndex, Date.now()) : this.authKeys.get(dcId);
42
31
  if (!key) {
43
32
  throw new MtArgumentError(`No auth key for DC ${dcId}`);
44
33
  }
@@ -1 +1 @@
1
- {"version":3,"file":"storage.js","sourceRoot":"","sources":["../../src/storage.ts"],"names":[],"mappings":"AAAA,OAAO,EAAoB,eAAe,EAAE,MAAM,cAAc,CAAA;AAChE,OAAO,EAAE,aAAa,EAAE,MAAM,oCAAoC,CAAA;AAClE,OAAO,EAAE,sBAAsB,EAAmB,MAAM,uBAAuB,CAAA;AAE/E,MAAM,OAAO,yBAA0B,SAAQ,aAAa;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,eAAe,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,sBAAsB,CAAC,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","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,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,cAAc,CAAA;AAC7D,OAAO,EAAE,sBAAsB,EAAmB,MAAM,uBAAuB,CAAA;AAE/E,MAAM,OAAO,yBAA0B,SAAQ,aAAa;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,eAAe,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,sBAAsB,CAAC,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","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"]}
@@ -1,6 +1,5 @@
1
1
  import { describe, expect, it, vi } from 'vitest';
2
- import { BaseTelegramClient } from '@mtcute/core';
3
- import { MemoryStorage } from '@mtcute/core/storage/memory.js';
2
+ import { BaseTelegramClient, MemoryStorage } from '@mtcute/core';
4
3
  import { createStub } from './stub.js';
5
4
  import { StubTelegramTransport } from './transport.js';
6
5
  describe('transport stub', () => {
@@ -1 +1 @@
1
- {"version":3,"file":"transport.test.js","sourceRoot":"","sources":["../../src/transport.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAA;AAEjD,OAAO,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAA;AACjD,OAAO,EAAE,aAAa,EAAE,MAAM,oCAAoC,CAAA;AAElE,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAA;AACtC,OAAO,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAA;AAEtD,QAAQ,CAAC,gBAAgB,EAAE,GAAG,EAAE;IAC5B,EAAE,CAAC,kCAAkC,EAAE,KAAK,IAAI,EAAE;QAC9C,MAAM,GAAG,GAAa,EAAE,CAAA;QAExB,MAAM,MAAM,GAAG,IAAI,kBAAkB,CAAC;YAClC,KAAK,EAAE,CAAC;YACR,OAAO,EAAE,EAAE;YACX,QAAQ,EAAE,CAAC;YACX,UAAU,EAAE;gBACR,IAAI,EAAE,UAAU,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;gBAClE,KAAK,EAAE,UAAU,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;aACtE;YACD,OAAO,EAAE,IAAI,aAAa,EAAE;YAC5B,SAAS,EAAE,GAAG,EAAE,CACZ,IAAI,qBAAqB,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,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,CAClB,MAAM,CAAC,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,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAA;AAEjD,OAAO,EAAE,kBAAkB,EAAE,aAAa,EAAE,MAAM,cAAc,CAAA;AAEhE,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAA;AACtC,OAAO,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAA;AAEtD,QAAQ,CAAC,gBAAgB,EAAE,GAAG,EAAE;IAC5B,EAAE,CAAC,kCAAkC,EAAE,KAAK,IAAI,EAAE;QAC9C,MAAM,GAAG,GAAa,EAAE,CAAA;QAExB,MAAM,MAAM,GAAG,IAAI,kBAAkB,CAAC;YAClC,KAAK,EAAE,CAAC;YACR,OAAO,EAAE,EAAE;YACX,QAAQ,EAAE,CAAC;YACX,UAAU,EAAE;gBACR,IAAI,EAAE,UAAU,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;gBAClE,KAAK,EAAE,UAAU,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;aACtE;YACD,OAAO,EAAE,IAAI,aAAa,EAAE;YAC5B,SAAS,EAAE,GAAG,EAAE,CACZ,IAAI,qBAAqB,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,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,CAClB,MAAM,CAAC,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/esm/utils.js CHANGED
@@ -1,7 +1,6 @@
1
- import { getBasicPeerType, markedPeerIdToBare } from '@mtcute/core';
1
+ import { parseMarkedPeerId } from '@mtcute/core';
2
2
  export function markedIdToPeer(id) {
3
- const type = getBasicPeerType(id);
4
- const bareId = markedPeerIdToBare(id);
3
+ const [type, bareId] = parseMarkedPeerId(id);
5
4
  switch (type) {
6
5
  case 'user':
7
6
  return { _: 'peerUser', userId: bareId };
package/esm/utils.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,kBAAkB,EAAM,MAAM,cAAc,CAAA;AAEvE,MAAM,UAAU,cAAc,CAAC,EAAU;IACrC,MAAM,IAAI,GAAG,gBAAgB,CAAC,EAAE,CAAC,CAAA;IACjC,MAAM,MAAM,GAAG,kBAAkB,CAAC,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","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,OAAO,EAAE,iBAAiB,EAAM,MAAM,cAAc,CAAA;AAEpD,MAAM,UAAU,cAAc,CAAC,EAAU;IACrC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,GAAG,iBAAiB,CAAC,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","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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mtcute/test",
3
- "version": "0.6.0",
3
+ "version": "0.7.1",
4
4
  "description": "Test utilities for mtcute",
5
5
  "author": "Alina Sireneva <alina@tei.su>",
6
6
  "license": "MIT",
@@ -11,7 +11,7 @@
11
11
  "long": "5.2.3"
12
12
  },
13
13
  "peerDependencies": {
14
- "@mtcute/core": "^0.6.0",
14
+ "@mtcute/core": "^0.7.1",
15
15
  "@mtcute/tl": "^*",
16
16
  "vitest": "^0.34.6"
17
17
  },
@@ -1,24 +0,0 @@
1
- import { ITelegramStorage, MaybeAsync } from '@mtcute/core';
2
- import { Logger, TlReaderMap, TlWriterMap } from '@mtcute/core/utils.js';
3
- export declare const stubPeerUser: ITelegramStorage.PeerInfo;
4
- export declare function testStorage<T extends ITelegramStorage>(s: T, params?: {
5
- skipEntityOverwrite?: boolean;
6
- customTests?: (s: T) => void;
7
- }): void;
8
- interface IStateStorage {
9
- setup?(log: Logger, readerMap: TlReaderMap, writerMap: TlWriterMap): void;
10
- load?(): MaybeAsync<void>;
11
- save?(): MaybeAsync<void>;
12
- destroy?(): MaybeAsync<void>;
13
- reset(): MaybeAsync<void>;
14
- getState(key: string): MaybeAsync<unknown>;
15
- setState(key: string, state: unknown, ttl?: number): MaybeAsync<void>;
16
- deleteState(key: string): MaybeAsync<void>;
17
- getCurrentScene(key: string): MaybeAsync<string | null>;
18
- setCurrentScene(key: string, scene: string, ttl?: number): MaybeAsync<void>;
19
- deleteCurrentScene(key: string): MaybeAsync<void>;
20
- getRateLimit(key: string, limit: number, window: number): MaybeAsync<[number, number]>;
21
- resetRateLimit(key: string): MaybeAsync<void>;
22
- }
23
- export declare function testStateStorage(s: IStateStorage): void;
24
- export {};