@mtcute/test 0.1.1 → 0.1.2

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 (55) hide show
  1. package/cjs/client.d.ts +8 -3
  2. package/cjs/client.js +20 -21
  3. package/cjs/client.js.map +1 -1
  4. package/cjs/client.test.d.ts +1 -0
  5. package/cjs/client.test.js +32 -0
  6. package/cjs/client.test.js.map +1 -0
  7. package/cjs/crypto.d.ts +6 -0
  8. package/cjs/crypto.js +162 -0
  9. package/cjs/crypto.js.map +1 -0
  10. package/cjs/index.d.ts +2 -0
  11. package/cjs/index.js +2 -0
  12. package/cjs/index.js.map +1 -1
  13. package/cjs/storage-test.d.ts +24 -0
  14. package/cjs/storage-test.js +302 -0
  15. package/cjs/storage-test.js.map +1 -0
  16. package/cjs/storage.test.d.ts +1 -0
  17. package/cjs/storage.test.js +43 -0
  18. package/cjs/storage.test.js.map +1 -0
  19. package/cjs/stub.test.d.ts +1 -0
  20. package/cjs/stub.test.js +55 -0
  21. package/cjs/stub.test.js.map +1 -0
  22. package/cjs/transport.test.d.ts +1 -0
  23. package/cjs/transport.test.js +35 -0
  24. package/cjs/transport.test.js.map +1 -0
  25. package/cjs/utils.test.d.ts +1 -0
  26. package/cjs/utils.test.js +16 -0
  27. package/cjs/utils.test.js.map +1 -0
  28. package/esm/client.d.ts +8 -3
  29. package/esm/client.js +21 -22
  30. package/esm/client.js.map +1 -1
  31. package/esm/client.test.d.ts +1 -0
  32. package/esm/client.test.js +30 -0
  33. package/esm/client.test.js.map +1 -0
  34. package/esm/crypto.d.ts +6 -0
  35. package/esm/crypto.js +154 -0
  36. package/esm/crypto.js.map +1 -0
  37. package/esm/index.d.ts +2 -0
  38. package/esm/index.js +2 -0
  39. package/esm/index.js.map +1 -1
  40. package/esm/storage-test.d.ts +24 -0
  41. package/esm/storage-test.js +294 -0
  42. package/esm/storage-test.js.map +1 -0
  43. package/esm/storage.test.d.ts +1 -0
  44. package/esm/storage.test.js +41 -0
  45. package/esm/storage.test.js.map +1 -0
  46. package/esm/stub.test.d.ts +1 -0
  47. package/esm/stub.test.js +50 -0
  48. package/esm/stub.test.js.map +1 -0
  49. package/esm/transport.test.d.ts +1 -0
  50. package/esm/transport.test.js +33 -0
  51. package/esm/transport.test.js.map +1 -0
  52. package/esm/utils.test.d.ts +1 -0
  53. package/esm/utils.test.js +14 -0
  54. package/esm/utils.test.js.map +1 -0
  55. package/package.json +4 -3
@@ -0,0 +1,302 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.testStateStorage = exports.testStorage = exports.stubPeerUser = void 0;
7
+ const long_1 = __importDefault(require("long"));
8
+ const vitest_1 = require("vitest");
9
+ const utils_js_1 = require("@mtcute/core/utils.js");
10
+ const reader_js_1 = require("@mtcute/tl/binary/reader.js");
11
+ const writer_js_1 = require("@mtcute/tl/binary/writer.js");
12
+ const stub_js_1 = require("./stub.js");
13
+ exports.stubPeerUser = {
14
+ id: 123123,
15
+ accessHash: long_1.default.fromBits(123, 456),
16
+ type: 'user',
17
+ username: 'some_user',
18
+ phone: '78005553535',
19
+ full: (0, stub_js_1.createStub)('user', { id: 123123 }),
20
+ };
21
+ const peerUserInput = {
22
+ _: 'inputPeerUser',
23
+ userId: 123123,
24
+ accessHash: long_1.default.fromBits(123, 456),
25
+ };
26
+ const peerChannel = {
27
+ id: -1001183945448,
28
+ accessHash: long_1.default.fromBits(666, 555),
29
+ type: 'channel',
30
+ username: 'some_channel',
31
+ full: (0, stub_js_1.createStub)('channel', { id: 123123 }),
32
+ };
33
+ const peerChannelInput = {
34
+ _: 'inputPeerChannel',
35
+ channelId: 1183945448,
36
+ accessHash: long_1.default.fromBits(666, 555),
37
+ };
38
+ function maybeHexEncode(x) {
39
+ if (x == null)
40
+ return null;
41
+ return (0, utils_js_1.hexEncode)(x);
42
+ }
43
+ function testStorage(s, params) {
44
+ (0, vitest_1.beforeAll)(async () => {
45
+ const logger = new utils_js_1.LogManager();
46
+ logger.level = 0;
47
+ s.setup?.(logger, reader_js_1.__tlReaderMap, writer_js_1.__tlWriterMap);
48
+ await s.load?.();
49
+ });
50
+ (0, vitest_1.afterAll)(() => s.destroy?.());
51
+ (0, vitest_1.beforeEach)(() => s.reset(true));
52
+ (0, vitest_1.describe)('default dc', () => {
53
+ (0, vitest_1.it)('should store', async () => {
54
+ await s.setDefaultDcs(utils_js_1.defaultProductionDc);
55
+ (0, vitest_1.expect)(await s.getDefaultDcs()).toEqual(utils_js_1.defaultProductionDc);
56
+ });
57
+ (0, vitest_1.it)('should remove', async () => {
58
+ await s.setDefaultDcs(null);
59
+ (0, vitest_1.expect)(await s.getDefaultDcs()).toBeNull();
60
+ });
61
+ });
62
+ (0, vitest_1.describe)('auth keys', () => {
63
+ (0, vitest_1.beforeAll)(() => void vitest_1.vi.useFakeTimers());
64
+ (0, vitest_1.afterAll)(() => void vitest_1.vi.useRealTimers());
65
+ const key2 = new Uint8Array(256).fill(0x42);
66
+ const key3 = new Uint8Array(256).fill(0x43);
67
+ const key2i0 = new Uint8Array(256).fill(0x44);
68
+ const key2i1 = new Uint8Array(256).fill(0x45);
69
+ const key3i0 = new Uint8Array(256).fill(0x46);
70
+ const key3i1 = new Uint8Array(256).fill(0x47);
71
+ (0, vitest_1.it)('should store perm auth key', async () => {
72
+ await s.setAuthKeyFor(2, key2);
73
+ await s.setAuthKeyFor(3, key3);
74
+ (0, vitest_1.expect)(maybeHexEncode(await s.getAuthKeyFor(2))).toEqual((0, utils_js_1.hexEncode)(key2));
75
+ (0, vitest_1.expect)(maybeHexEncode(await s.getAuthKeyFor(3))).toEqual((0, utils_js_1.hexEncode)(key3));
76
+ });
77
+ (0, vitest_1.it)('should store temp auth keys', async () => {
78
+ const expire = Date.now() + 1000;
79
+ await s.setTempAuthKeyFor(2, 0, key2i0, expire);
80
+ await s.setTempAuthKeyFor(2, 1, key2i1, expire);
81
+ await s.setTempAuthKeyFor(3, 0, key3i0, expire);
82
+ await s.setTempAuthKeyFor(3, 1, key3i1, expire);
83
+ (0, vitest_1.expect)(maybeHexEncode(await s.getAuthKeyFor(2, 0))).toEqual((0, utils_js_1.hexEncode)(key2i0));
84
+ (0, vitest_1.expect)(maybeHexEncode(await s.getAuthKeyFor(2, 1))).toEqual((0, utils_js_1.hexEncode)(key2i1));
85
+ (0, vitest_1.expect)(maybeHexEncode(await s.getAuthKeyFor(3, 0))).toEqual((0, utils_js_1.hexEncode)(key3i0));
86
+ (0, vitest_1.expect)(maybeHexEncode(await s.getAuthKeyFor(3, 1))).toEqual((0, utils_js_1.hexEncode)(key3i1));
87
+ });
88
+ (0, vitest_1.it)('should expire temp auth keys', async () => {
89
+ const expire = Date.now() + 1000;
90
+ await s.setTempAuthKeyFor(2, 0, key2i0, expire);
91
+ await s.setTempAuthKeyFor(2, 1, key2i1, expire);
92
+ await s.setTempAuthKeyFor(3, 0, key3i0, expire);
93
+ await s.setTempAuthKeyFor(3, 1, key3i1, expire);
94
+ vitest_1.vi.advanceTimersByTime(10000);
95
+ (0, vitest_1.expect)(await s.getAuthKeyFor(2, 0)).toBeNull();
96
+ (0, vitest_1.expect)(await s.getAuthKeyFor(2, 1)).toBeNull();
97
+ (0, vitest_1.expect)(await s.getAuthKeyFor(3, 0)).toBeNull();
98
+ (0, vitest_1.expect)(await s.getAuthKeyFor(3, 1)).toBeNull();
99
+ });
100
+ (0, vitest_1.it)('should remove auth keys', async () => {
101
+ const expire = Date.now() + 1000;
102
+ await s.setTempAuthKeyFor(2, 0, key2i0, expire);
103
+ await s.setTempAuthKeyFor(2, 1, key2i1, expire);
104
+ await s.setAuthKeyFor(2, key2);
105
+ await s.setAuthKeyFor(3, key3);
106
+ await s.setAuthKeyFor(2, null);
107
+ await s.setTempAuthKeyFor(2, 0, null, 0);
108
+ await s.setTempAuthKeyFor(2, 1, null, 0);
109
+ (0, vitest_1.expect)(await s.getAuthKeyFor(2)).toBeNull();
110
+ (0, vitest_1.expect)(await s.getAuthKeyFor(2, 0)).toBeNull();
111
+ (0, vitest_1.expect)(await s.getAuthKeyFor(2, 1)).toBeNull();
112
+ (0, vitest_1.expect)(maybeHexEncode(await s.getAuthKeyFor(3))).toEqual((0, utils_js_1.hexEncode)(key3)); // should not be removed
113
+ });
114
+ (0, vitest_1.it)('should remove all auth keys with dropAuthKeysFor', async () => {
115
+ const expire = Date.now() + 1000;
116
+ await s.setTempAuthKeyFor(2, 0, key2i0, expire);
117
+ await s.setTempAuthKeyFor(2, 1, key2i1, expire);
118
+ await s.setAuthKeyFor(2, key2);
119
+ await s.setAuthKeyFor(3, key3);
120
+ await s.dropAuthKeysFor(2);
121
+ (0, vitest_1.expect)(await s.getAuthKeyFor(2)).toBeNull();
122
+ (0, vitest_1.expect)(await s.getAuthKeyFor(2, 0)).toBeNull();
123
+ (0, vitest_1.expect)(await s.getAuthKeyFor(2, 1)).toBeNull();
124
+ (0, vitest_1.expect)(maybeHexEncode(await s.getAuthKeyFor(3))).toEqual((0, utils_js_1.hexEncode)(key3)); // should not be removed
125
+ });
126
+ (0, vitest_1.it)('should not reset auth keys on reset()', async () => {
127
+ await s.setAuthKeyFor(2, key2);
128
+ await s.setAuthKeyFor(3, key3);
129
+ s.reset();
130
+ (0, vitest_1.expect)(maybeHexEncode(await s.getAuthKeyFor(2))).toEqual((0, utils_js_1.hexEncode)(key2));
131
+ (0, vitest_1.expect)(maybeHexEncode(await s.getAuthKeyFor(3))).toEqual((0, utils_js_1.hexEncode)(key3));
132
+ });
133
+ (0, vitest_1.it)('should reset auth keys on reset(true)', async () => {
134
+ await s.setAuthKeyFor(2, key2);
135
+ await s.setAuthKeyFor(3, key3);
136
+ s.reset(true);
137
+ (0, vitest_1.expect)(await s.getAuthKeyFor(2)).toBeNull();
138
+ (0, vitest_1.expect)(await s.getAuthKeyFor(3)).toBeNull();
139
+ });
140
+ });
141
+ (0, vitest_1.describe)('peers', () => {
142
+ (0, vitest_1.it)('should cache and return peers', async () => {
143
+ await s.updatePeers([exports.stubPeerUser, peerChannel]);
144
+ await s.save?.(); // update-related methods are batched, so we need to save
145
+ (0, vitest_1.expect)(await s.getPeerById(exports.stubPeerUser.id)).toEqual(peerUserInput);
146
+ (0, vitest_1.expect)(await s.getPeerById(peerChannel.id)).toEqual(peerChannelInput);
147
+ });
148
+ (0, vitest_1.it)('should cache and return peers by username', async () => {
149
+ await s.updatePeers([exports.stubPeerUser, peerChannel]);
150
+ await s.save?.(); // update-related methods are batched, so we need to save
151
+ (0, vitest_1.expect)(await s.getPeerByUsername(exports.stubPeerUser.username)).toEqual(peerUserInput);
152
+ (0, vitest_1.expect)(await s.getPeerByUsername(peerChannel.username)).toEqual(peerChannelInput);
153
+ });
154
+ (0, vitest_1.it)('should cache and return peers by phone', async () => {
155
+ await s.updatePeers([exports.stubPeerUser]);
156
+ await s.save?.(); // update-related methods are batched, so we need to save
157
+ (0, vitest_1.expect)(await s.getPeerByPhone(exports.stubPeerUser.phone)).toEqual(peerUserInput);
158
+ });
159
+ if (!params?.skipEntityOverwrite) {
160
+ (0, vitest_1.it)('should overwrite existing cached peers', async () => {
161
+ await s.updatePeers([exports.stubPeerUser]);
162
+ await s.updatePeers([{ ...exports.stubPeerUser, username: 'whatever' }]);
163
+ await s.save?.(); // update-related methods are batched, so we need to save
164
+ (0, vitest_1.expect)(await s.getPeerById(exports.stubPeerUser.id)).toEqual(peerUserInput);
165
+ (0, vitest_1.expect)(await s.getPeerByUsername(exports.stubPeerUser.username)).toBeNull();
166
+ (0, vitest_1.expect)(await s.getPeerByUsername('whatever')).toEqual(peerUserInput);
167
+ });
168
+ }
169
+ (0, vitest_1.it)('should cache full peer info', async () => {
170
+ await s.updatePeers([exports.stubPeerUser, peerChannel]);
171
+ await s.save?.(); // update-related methods are batched, so we need to save
172
+ (0, vitest_1.expect)(await s.getFullPeerById(exports.stubPeerUser.id)).toEqual(exports.stubPeerUser.full);
173
+ (0, vitest_1.expect)(await s.getFullPeerById(peerChannel.id)).toEqual(peerChannel.full);
174
+ });
175
+ });
176
+ (0, vitest_1.describe)('current user', () => {
177
+ const self = {
178
+ userId: 123123,
179
+ isBot: false,
180
+ };
181
+ (0, vitest_1.it)('should store and return self info', async () => {
182
+ await s.setSelf(self);
183
+ (0, vitest_1.expect)(await s.getSelf()).toEqual(self);
184
+ });
185
+ (0, vitest_1.it)('should remove self info', async () => {
186
+ await s.setSelf(self);
187
+ await s.setSelf(null);
188
+ (0, vitest_1.expect)(await s.getSelf()).toBeNull();
189
+ });
190
+ });
191
+ (0, vitest_1.describe)('updates state', () => {
192
+ (0, vitest_1.it)('should store and return updates state', async () => {
193
+ await s.setUpdatesPts(1);
194
+ await s.setUpdatesQts(2);
195
+ await s.setUpdatesDate(3);
196
+ await s.setUpdatesSeq(4);
197
+ await s.save?.(); // update-related methods are batched, so we need to save
198
+ (0, vitest_1.expect)(await s.getUpdatesState()).toEqual([1, 2, 3, 4]);
199
+ });
200
+ (0, vitest_1.it)('should store and return channel pts', async () => {
201
+ await s.setManyChannelPts(new Map([
202
+ [1, 2],
203
+ [3, 4],
204
+ ]));
205
+ await s.save?.(); // update-related methods are batched, so we need to save
206
+ (0, vitest_1.expect)(await s.getChannelPts(1)).toEqual(2);
207
+ (0, vitest_1.expect)(await s.getChannelPts(3)).toEqual(4);
208
+ (0, vitest_1.expect)(await s.getChannelPts(2)).toBeNull();
209
+ });
210
+ (0, vitest_1.it)('should be null after reset', async () => {
211
+ (0, vitest_1.expect)(await s.getUpdatesState()).toBeNull();
212
+ });
213
+ });
214
+ params?.customTests?.(s);
215
+ }
216
+ exports.testStorage = testStorage;
217
+ function testStateStorage(s) {
218
+ (0, vitest_1.beforeAll)(async () => {
219
+ const logger = new utils_js_1.LogManager();
220
+ logger.level = 0;
221
+ s.setup?.(logger, reader_js_1.__tlReaderMap, writer_js_1.__tlWriterMap);
222
+ await s.load?.();
223
+ });
224
+ (0, vitest_1.afterAll)(() => s.destroy?.());
225
+ (0, vitest_1.beforeEach)(() => s.reset());
226
+ (0, vitest_1.describe)('key-value state', () => {
227
+ (0, vitest_1.beforeAll)(() => void vitest_1.vi.useFakeTimers());
228
+ (0, vitest_1.afterAll)(() => void vitest_1.vi.useRealTimers());
229
+ (0, vitest_1.it)('should store and return state', async () => {
230
+ await s.setState('a', 'b');
231
+ await s.setState('c', 'd');
232
+ await s.setState('e', 'f');
233
+ (0, vitest_1.expect)(await s.getState('a')).toEqual('b');
234
+ (0, vitest_1.expect)(await s.getState('c')).toEqual('d');
235
+ (0, vitest_1.expect)(await s.getState('e')).toEqual('f');
236
+ });
237
+ (0, vitest_1.it)('should remove state', async () => {
238
+ await s.setState('a', 'b');
239
+ await s.setState('c', 'd');
240
+ await s.setState('e', 'f');
241
+ await s.deleteState('a');
242
+ await s.deleteState('c');
243
+ await s.deleteState('e');
244
+ (0, vitest_1.expect)(await s.getState('a')).toBeNull();
245
+ (0, vitest_1.expect)(await s.getState('c')).toBeNull();
246
+ (0, vitest_1.expect)(await s.getState('e')).toBeNull();
247
+ });
248
+ (0, vitest_1.it)('should expire state', async () => {
249
+ await s.setState('a', 'b', 1);
250
+ await s.setState('c', 'd', 1);
251
+ await s.setState('e', 'f', 1);
252
+ vitest_1.vi.advanceTimersByTime(10000);
253
+ (0, vitest_1.expect)(await s.getState('a')).toBeNull();
254
+ (0, vitest_1.expect)(await s.getState('c')).toBeNull();
255
+ (0, vitest_1.expect)(await s.getState('e')).toBeNull();
256
+ });
257
+ });
258
+ (0, vitest_1.describe)('scenes', () => {
259
+ (0, vitest_1.it)('should store and return scenes', async () => {
260
+ await s.setCurrentScene('a', 'b');
261
+ await s.setCurrentScene('c', 'd');
262
+ await s.setCurrentScene('e', 'f');
263
+ (0, vitest_1.expect)(await s.getCurrentScene('a')).toEqual('b');
264
+ (0, vitest_1.expect)(await s.getCurrentScene('c')).toEqual('d');
265
+ (0, vitest_1.expect)(await s.getCurrentScene('e')).toEqual('f');
266
+ });
267
+ (0, vitest_1.it)('should remove scenes', async () => {
268
+ await s.setCurrentScene('a', 'b');
269
+ await s.setCurrentScene('c', 'd');
270
+ await s.setCurrentScene('e', 'f');
271
+ await s.deleteCurrentScene('a');
272
+ await s.deleteCurrentScene('c');
273
+ await s.deleteCurrentScene('e');
274
+ (0, vitest_1.expect)(await s.getCurrentScene('a')).toBeNull();
275
+ (0, vitest_1.expect)(await s.getCurrentScene('c')).toBeNull();
276
+ (0, vitest_1.expect)(await s.getCurrentScene('e')).toBeNull();
277
+ });
278
+ });
279
+ (0, vitest_1.describe)('rate limit', () => {
280
+ (0, vitest_1.beforeAll)(() => void vitest_1.vi.useFakeTimers());
281
+ (0, vitest_1.afterAll)(() => void vitest_1.vi.useRealTimers());
282
+ const check = () => s.getRateLimit('test', 3, 1);
283
+ (0, vitest_1.it)('should implement basic rate limiting', async () => {
284
+ vitest_1.vi.setSystemTime(0);
285
+ (0, vitest_1.expect)(await check()).toEqual([3, 1000]);
286
+ (0, vitest_1.expect)(await check()).toEqual([2, 1000]);
287
+ (0, vitest_1.expect)(await check()).toEqual([1, 1000]);
288
+ (0, vitest_1.expect)(await check()).toEqual([0, 1000]);
289
+ vitest_1.vi.setSystemTime(1001);
290
+ (0, vitest_1.expect)(await check()).toEqual([3, 2001]);
291
+ });
292
+ (0, vitest_1.it)('should allow resetting rate limit', async () => {
293
+ vitest_1.vi.setSystemTime(0);
294
+ await check();
295
+ await check();
296
+ await s.resetRateLimit('test');
297
+ (0, vitest_1.expect)(await check()).toEqual([3, 1000]);
298
+ });
299
+ });
300
+ }
301
+ exports.testStateStorage = testStateStorage;
302
+ //# sourceMappingURL=storage-test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"storage-test.js","sourceRoot":"","sources":["../../src/storage-test.ts"],"names":[],"mappings":"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","sourcesContent":["import Long from 'long'\nimport { afterAll, beforeAll, beforeEach, describe, expect, it, vi } from 'vitest'\n\nimport { ITelegramStorage, MaybeAsync } from '@mtcute/core'\nimport { defaultProductionDc, hexEncode, Logger, LogManager, TlReaderMap, TlWriterMap } from '@mtcute/core/utils.js'\nimport { tl } from '@mtcute/tl'\nimport { __tlReaderMap } from '@mtcute/tl/binary/reader.js'\nimport { __tlWriterMap } from '@mtcute/tl/binary/writer.js'\n\nimport { createStub } from './stub.js'\n\nexport const stubPeerUser: ITelegramStorage.PeerInfo = {\n id: 123123,\n accessHash: Long.fromBits(123, 456),\n type: 'user',\n username: 'some_user',\n phone: '78005553535',\n full: createStub('user', { id: 123123 }),\n}\nconst peerUserInput: tl.TypeInputPeer = {\n _: 'inputPeerUser',\n userId: 123123,\n accessHash: Long.fromBits(123, 456),\n}\n\nconst peerChannel: ITelegramStorage.PeerInfo = {\n id: -1001183945448,\n accessHash: Long.fromBits(666, 555),\n type: 'channel',\n username: 'some_channel',\n full: createStub('channel', { id: 123123 }),\n}\n\nconst peerChannelInput: tl.TypeInputPeer = {\n _: 'inputPeerChannel',\n channelId: 1183945448,\n accessHash: Long.fromBits(666, 555),\n}\n\nfunction maybeHexEncode(x: Uint8Array | null): string | null {\n if (x == null) return null\n\n return hexEncode(x)\n}\n\nexport function testStorage<T extends ITelegramStorage>(\n s: T,\n params?: {\n skipEntityOverwrite?: boolean\n customTests?: (s: T) => void\n },\n): void {\n beforeAll(async () => {\n const logger = new LogManager()\n logger.level = 0\n s.setup?.(logger, __tlReaderMap, __tlWriterMap)\n\n await s.load?.()\n })\n\n afterAll(() => s.destroy?.())\n beforeEach(() => s.reset(true))\n\n describe('default dc', () => {\n it('should store', async () => {\n await s.setDefaultDcs(defaultProductionDc)\n expect(await s.getDefaultDcs()).toEqual(defaultProductionDc)\n })\n\n it('should remove', async () => {\n await s.setDefaultDcs(null)\n expect(await s.getDefaultDcs()).toBeNull()\n })\n })\n\n describe('auth keys', () => {\n beforeAll(() => void vi.useFakeTimers())\n afterAll(() => void vi.useRealTimers())\n\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 it('should store perm auth key', async () => {\n await s.setAuthKeyFor(2, key2)\n await s.setAuthKeyFor(3, key3)\n\n expect(maybeHexEncode(await s.getAuthKeyFor(2))).toEqual(hexEncode(key2))\n expect(maybeHexEncode(await s.getAuthKeyFor(3))).toEqual(hexEncode(key3))\n })\n\n it('should store temp auth keys', async () => {\n const expire = Date.now() + 1000\n\n await s.setTempAuthKeyFor(2, 0, key2i0, expire)\n await s.setTempAuthKeyFor(2, 1, key2i1, expire)\n await s.setTempAuthKeyFor(3, 0, key3i0, expire)\n await s.setTempAuthKeyFor(3, 1, key3i1, expire)\n\n expect(maybeHexEncode(await s.getAuthKeyFor(2, 0))).toEqual(hexEncode(key2i0))\n expect(maybeHexEncode(await s.getAuthKeyFor(2, 1))).toEqual(hexEncode(key2i1))\n expect(maybeHexEncode(await s.getAuthKeyFor(3, 0))).toEqual(hexEncode(key3i0))\n expect(maybeHexEncode(await s.getAuthKeyFor(3, 1))).toEqual(hexEncode(key3i1))\n })\n\n it('should expire temp auth keys', async () => {\n const expire = Date.now() + 1000\n\n await s.setTempAuthKeyFor(2, 0, key2i0, expire)\n await s.setTempAuthKeyFor(2, 1, key2i1, expire)\n await s.setTempAuthKeyFor(3, 0, key3i0, expire)\n await s.setTempAuthKeyFor(3, 1, key3i1, expire)\n\n vi.advanceTimersByTime(10000)\n\n expect(await s.getAuthKeyFor(2, 0)).toBeNull()\n expect(await s.getAuthKeyFor(2, 1)).toBeNull()\n expect(await s.getAuthKeyFor(3, 0)).toBeNull()\n expect(await s.getAuthKeyFor(3, 1)).toBeNull()\n })\n\n it('should remove auth keys', async () => {\n const expire = Date.now() + 1000\n\n await s.setTempAuthKeyFor(2, 0, key2i0, expire)\n await s.setTempAuthKeyFor(2, 1, key2i1, expire)\n await s.setAuthKeyFor(2, key2)\n await s.setAuthKeyFor(3, key3)\n\n await s.setAuthKeyFor(2, null)\n await s.setTempAuthKeyFor(2, 0, null, 0)\n await s.setTempAuthKeyFor(2, 1, null, 0)\n\n expect(await s.getAuthKeyFor(2)).toBeNull()\n expect(await s.getAuthKeyFor(2, 0)).toBeNull()\n expect(await s.getAuthKeyFor(2, 1)).toBeNull()\n expect(maybeHexEncode(await s.getAuthKeyFor(3))).toEqual(hexEncode(key3)) // should not be removed\n })\n\n it('should remove all auth keys with dropAuthKeysFor', async () => {\n const expire = Date.now() + 1000\n\n await s.setTempAuthKeyFor(2, 0, key2i0, expire)\n await s.setTempAuthKeyFor(2, 1, key2i1, expire)\n await s.setAuthKeyFor(2, key2)\n await s.setAuthKeyFor(3, key3)\n\n await s.dropAuthKeysFor(2)\n\n expect(await s.getAuthKeyFor(2)).toBeNull()\n expect(await s.getAuthKeyFor(2, 0)).toBeNull()\n expect(await s.getAuthKeyFor(2, 1)).toBeNull()\n expect(maybeHexEncode(await s.getAuthKeyFor(3))).toEqual(hexEncode(key3)) // should not be removed\n })\n\n it('should not reset auth keys on reset()', async () => {\n await s.setAuthKeyFor(2, key2)\n await s.setAuthKeyFor(3, key3)\n s.reset()\n\n expect(maybeHexEncode(await s.getAuthKeyFor(2))).toEqual(hexEncode(key2))\n expect(maybeHexEncode(await s.getAuthKeyFor(3))).toEqual(hexEncode(key3))\n })\n\n it('should reset auth keys on reset(true)', async () => {\n await s.setAuthKeyFor(2, key2)\n await s.setAuthKeyFor(3, key3)\n s.reset(true)\n\n expect(await s.getAuthKeyFor(2)).toBeNull()\n expect(await s.getAuthKeyFor(3)).toBeNull()\n })\n })\n\n describe('peers', () => {\n it('should cache and return peers', async () => {\n await s.updatePeers([stubPeerUser, peerChannel])\n await s.save?.() // update-related methods are batched, so we need to save\n\n expect(await s.getPeerById(stubPeerUser.id)).toEqual(peerUserInput)\n expect(await s.getPeerById(peerChannel.id)).toEqual(peerChannelInput)\n })\n\n it('should cache and return peers by username', async () => {\n await s.updatePeers([stubPeerUser, peerChannel])\n await s.save?.() // update-related methods are batched, so we need to save\n\n expect(await s.getPeerByUsername(stubPeerUser.username!)).toEqual(peerUserInput)\n expect(await s.getPeerByUsername(peerChannel.username!)).toEqual(peerChannelInput)\n })\n\n it('should cache and return peers by phone', async () => {\n await s.updatePeers([stubPeerUser])\n await s.save?.() // update-related methods are batched, so we need to save\n\n expect(await s.getPeerByPhone(stubPeerUser.phone!)).toEqual(peerUserInput)\n })\n\n if (!params?.skipEntityOverwrite) {\n it('should overwrite existing cached peers', async () => {\n await s.updatePeers([stubPeerUser])\n await s.updatePeers([{ ...stubPeerUser, username: 'whatever' }])\n await s.save?.() // update-related methods are batched, so we need to save\n\n expect(await s.getPeerById(stubPeerUser.id)).toEqual(peerUserInput)\n expect(await s.getPeerByUsername(stubPeerUser.username!)).toBeNull()\n expect(await s.getPeerByUsername('whatever')).toEqual(peerUserInput)\n })\n }\n\n it('should cache full peer info', async () => {\n await s.updatePeers([stubPeerUser, peerChannel])\n await s.save?.() // update-related methods are batched, so we need to save\n\n expect(await s.getFullPeerById(stubPeerUser.id)).toEqual(stubPeerUser.full)\n expect(await s.getFullPeerById(peerChannel.id)).toEqual(peerChannel.full)\n })\n })\n\n describe('current user', () => {\n const self: ITelegramStorage.SelfInfo = {\n userId: 123123,\n isBot: false,\n }\n\n it('should store and return self info', async () => {\n await s.setSelf(self)\n expect(await s.getSelf()).toEqual(self)\n })\n\n it('should remove self info', async () => {\n await s.setSelf(self)\n await s.setSelf(null)\n expect(await s.getSelf()).toBeNull()\n })\n })\n\n describe('updates state', () => {\n it('should store and return updates state', async () => {\n await s.setUpdatesPts(1)\n await s.setUpdatesQts(2)\n await s.setUpdatesDate(3)\n await s.setUpdatesSeq(4)\n await s.save?.() // update-related methods are batched, so we need to save\n\n expect(await s.getUpdatesState()).toEqual([1, 2, 3, 4])\n })\n\n it('should store and return channel pts', async () => {\n await s.setManyChannelPts(\n new Map([\n [1, 2],\n [3, 4],\n ]),\n )\n await s.save?.() // update-related methods are batched, so we need to save\n\n expect(await s.getChannelPts(1)).toEqual(2)\n expect(await s.getChannelPts(3)).toEqual(4)\n expect(await s.getChannelPts(2)).toBeNull()\n })\n\n it('should be null after reset', async () => {\n expect(await s.getUpdatesState()).toBeNull()\n })\n })\n\n params?.customTests?.(s)\n}\n\ninterface IStateStorage {\n setup?(log: Logger, readerMap: TlReaderMap, writerMap: TlWriterMap): void\n\n load?(): MaybeAsync<void>\n\n save?(): MaybeAsync<void>\n\n destroy?(): MaybeAsync<void>\n\n reset(): MaybeAsync<void>\n\n getState(key: string): MaybeAsync<unknown>\n\n setState(key: string, state: unknown, ttl?: number): MaybeAsync<void>\n\n deleteState(key: string): MaybeAsync<void>\n\n getCurrentScene(key: string): MaybeAsync<string | null>\n\n setCurrentScene(key: string, scene: string, ttl?: number): MaybeAsync<void>\n\n deleteCurrentScene(key: string): MaybeAsync<void>\n\n getRateLimit(key: string, limit: number, window: number): MaybeAsync<[number, number]>\n\n resetRateLimit(key: string): MaybeAsync<void>\n}\n\nexport function testStateStorage(s: IStateStorage) {\n beforeAll(async () => {\n const logger = new LogManager()\n logger.level = 0\n s.setup?.(logger, __tlReaderMap, __tlWriterMap)\n\n await s.load?.()\n })\n\n afterAll(() => s.destroy?.())\n beforeEach(() => s.reset())\n\n describe('key-value state', () => {\n beforeAll(() => void vi.useFakeTimers())\n afterAll(() => void vi.useRealTimers())\n\n it('should store and return state', async () => {\n await s.setState('a', 'b')\n await s.setState('c', 'd')\n await s.setState('e', 'f')\n\n expect(await s.getState('a')).toEqual('b')\n expect(await s.getState('c')).toEqual('d')\n expect(await s.getState('e')).toEqual('f')\n })\n\n it('should remove state', async () => {\n await s.setState('a', 'b')\n await s.setState('c', 'd')\n await s.setState('e', 'f')\n\n await s.deleteState('a')\n await s.deleteState('c')\n await s.deleteState('e')\n\n expect(await s.getState('a')).toBeNull()\n expect(await s.getState('c')).toBeNull()\n expect(await s.getState('e')).toBeNull()\n })\n\n it('should expire state', async () => {\n await s.setState('a', 'b', 1)\n await s.setState('c', 'd', 1)\n await s.setState('e', 'f', 1)\n\n vi.advanceTimersByTime(10000)\n\n expect(await s.getState('a')).toBeNull()\n expect(await s.getState('c')).toBeNull()\n expect(await s.getState('e')).toBeNull()\n })\n })\n\n describe('scenes', () => {\n it('should store and return scenes', async () => {\n await s.setCurrentScene('a', 'b')\n await s.setCurrentScene('c', 'd')\n await s.setCurrentScene('e', 'f')\n\n expect(await s.getCurrentScene('a')).toEqual('b')\n expect(await s.getCurrentScene('c')).toEqual('d')\n expect(await s.getCurrentScene('e')).toEqual('f')\n })\n\n it('should remove scenes', async () => {\n await s.setCurrentScene('a', 'b')\n await s.setCurrentScene('c', 'd')\n await s.setCurrentScene('e', 'f')\n\n await s.deleteCurrentScene('a')\n await s.deleteCurrentScene('c')\n await s.deleteCurrentScene('e')\n\n expect(await s.getCurrentScene('a')).toBeNull()\n expect(await s.getCurrentScene('c')).toBeNull()\n expect(await s.getCurrentScene('e')).toBeNull()\n })\n })\n\n describe('rate limit', () => {\n beforeAll(() => void vi.useFakeTimers())\n afterAll(() => void vi.useRealTimers())\n\n const check = () => s.getRateLimit('test', 3, 1)\n\n it('should implement basic rate limiting', async () => {\n vi.setSystemTime(0)\n\n expect(await check()).toEqual([3, 1000])\n expect(await check()).toEqual([2, 1000])\n expect(await check()).toEqual([1, 1000])\n expect(await check()).toEqual([0, 1000])\n\n vi.setSystemTime(1001)\n\n expect(await check()).toEqual([3, 2001])\n })\n\n it('should allow resetting rate limit', async () => {\n vi.setSystemTime(0)\n\n await check()\n await check()\n\n await s.resetRateLimit('test')\n expect(await check()).toEqual([3, 1000])\n })\n })\n}\n"]}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,43 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const vitest_1 = require("vitest");
4
+ const core_1 = require("@mtcute/core");
5
+ const storage_js_1 = require("./storage.js");
6
+ const stub_js_1 = require("./stub.js");
7
+ const transport_js_1 = require("./transport.js");
8
+ (0, vitest_1.describe)('storage stub', () => {
9
+ (0, vitest_1.it)('should correctly intercept calls', async () => {
10
+ const log = [];
11
+ const client = new core_1.BaseTelegramClient({
12
+ apiId: 0,
13
+ apiHash: '',
14
+ logLevel: 0,
15
+ defaultDcs: {
16
+ main: (0, stub_js_1.createStub)('dcOption', { ipAddress: '1.2.3.4', port: 1234 }),
17
+ media: (0, stub_js_1.createStub)('dcOption', { ipAddress: '1.2.3.4', port: 5678 }),
18
+ },
19
+ transport: () => new transport_js_1.StubTelegramTransport({
20
+ onMessage: (msg) => {
21
+ if (msg.slice(0, 8).reduce((a, b) => a + b, 0) === 0) {
22
+ // should not happen, since we're providing stub keys
23
+ log.push('unauthed_message');
24
+ }
25
+ setTimeout(() => {
26
+ client.close().catch(() => { });
27
+ }, 10);
28
+ },
29
+ }),
30
+ storage: new storage_js_1.StubMemoryTelegramStorage({
31
+ hasKeys: true,
32
+ onLoad: () => log.push('load'),
33
+ onSave: () => log.push('save'),
34
+ onDestroy: () => log.push('destroy'),
35
+ onReset: () => log.push('reset'),
36
+ }),
37
+ });
38
+ await client.connect();
39
+ await client.call({ _: 'help.getConfig' }).catch(() => { }); // ignore "client closed" error
40
+ (0, vitest_1.expect)(log).toEqual(['load', 'save', 'destroy']);
41
+ });
42
+ });
43
+ //# sourceMappingURL=storage.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"storage.test.js","sourceRoot":"","sources":["../../src/storage.test.ts"],"names":[],"mappings":";;AAAA,mCAA6C;AAE7C,uCAAiD;AAEjD,6CAAwD;AACxD,uCAAsC;AACtC,iDAAsD;AAEtD,IAAA,iBAAQ,EAAC,cAAc,EAAE,GAAG,EAAE;IAC1B,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,SAAS,EAAE,GAAG,EAAE,CACZ,IAAI,oCAAqB,CAAC;gBACtB,SAAS,EAAE,CAAC,GAAG,EAAE,EAAE;oBACf,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,EAAE;wBAClD,qDAAqD;wBACrD,GAAG,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAA;qBAC/B;oBACD,UAAU,CAAC,GAAG,EAAE;wBACZ,MAAM,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAA;oBAClC,CAAC,EAAE,EAAE,CAAC,CAAA;gBACV,CAAC;aACJ,CAAC;YACN,OAAO,EAAE,IAAI,sCAAyB,CAAC;gBACnC,OAAO,EAAE,IAAI;gBACb,MAAM,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC;gBAC9B,MAAM,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC;gBAC9B,SAAS,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC;gBACpC,OAAO,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC;aACnC,CAAC;SACL,CAAC,CAAA;QAEF,MAAM,MAAM,CAAC,OAAO,EAAE,CAAA;QACtB,MAAM,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,gBAAgB,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAA,CAAC,+BAA+B;QAE1F,IAAA,eAAM,EAAC,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC,CAAA;IACpD,CAAC,CAAC,CAAA;AACN,CAAC,CAAC,CAAA","sourcesContent":["import { describe, expect, it } from 'vitest'\n\nimport { BaseTelegramClient } from '@mtcute/core'\n\nimport { StubMemoryTelegramStorage } from './storage.js'\nimport { createStub } from './stub.js'\nimport { StubTelegramTransport } from './transport.js'\n\ndescribe('storage 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 transport: () =>\n new StubTelegramTransport({\n onMessage: (msg) => {\n if (msg.slice(0, 8).reduce((a, b) => a + b, 0) === 0) {\n // should not happen, since we're providing stub keys\n log.push('unauthed_message')\n }\n setTimeout(() => {\n client.close().catch(() => {})\n }, 10)\n },\n }),\n storage: new StubMemoryTelegramStorage({\n hasKeys: true,\n onLoad: () => log.push('load'),\n onSave: () => log.push('save'),\n onDestroy: () => log.push('destroy'),\n onReset: () => log.push('reset'),\n }),\n })\n\n await client.connect()\n await client.call({ _: 'help.getConfig' }).catch(() => {}) // ignore \"client closed\" error\n\n expect(log).toEqual(['load', 'save', 'destroy'])\n })\n})\n"]}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,55 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const long_1 = __importDefault(require("long"));
7
+ const vitest_1 = require("vitest");
8
+ const index_js_1 = require("./index.js");
9
+ (0, vitest_1.describe)('stub', () => {
10
+ (0, vitest_1.it)('should correctly generate simple stubs', () => {
11
+ (0, vitest_1.expect)((0, index_js_1.createStub)('inputUser', { userId: 123 })).toEqual({
12
+ _: 'inputUser',
13
+ userId: 123,
14
+ accessHash: long_1.default.ZERO,
15
+ });
16
+ });
17
+ (0, vitest_1.it)('should correctly generate stubs for optional fields', () => {
18
+ (0, vitest_1.expect)((0, index_js_1.createStub)('updateChannelTooLong')).toEqual({
19
+ _: 'updateChannelTooLong',
20
+ channelId: 0,
21
+ pts: undefined,
22
+ });
23
+ });
24
+ (0, vitest_1.it)('should correctly generate stubs for boolean flags', () => {
25
+ (0, vitest_1.expect)((0, index_js_1.createStub)('account.finishTakeoutSession')).toEqual({
26
+ _: 'account.finishTakeoutSession',
27
+ success: false,
28
+ });
29
+ });
30
+ (0, vitest_1.it)('should correctly generate stubs for vectors', () => {
31
+ (0, vitest_1.expect)((0, index_js_1.createStub)('messageActionChatAddUser')).toEqual({
32
+ _: 'messageActionChatAddUser',
33
+ users: [],
34
+ });
35
+ });
36
+ (0, vitest_1.it)('should correctly generate stubs for optional vectors', () => {
37
+ (0, vitest_1.expect)((0, index_js_1.createStub)('updateChannelPinnedTopics')).toEqual({
38
+ _: 'updateChannelPinnedTopics',
39
+ channelId: 0,
40
+ order: [],
41
+ });
42
+ });
43
+ (0, vitest_1.it)('should correctly generate stubs for nested types', () => {
44
+ (0, vitest_1.expect)((0, index_js_1.createStub)('messageActionGroupCallScheduled', { scheduleDate: 123 })).toEqual({
45
+ _: 'messageActionGroupCallScheduled',
46
+ call: {
47
+ _: 'inputGroupCall',
48
+ id: long_1.default.ZERO,
49
+ accessHash: long_1.default.ZERO,
50
+ },
51
+ scheduleDate: 123,
52
+ });
53
+ });
54
+ });
55
+ //# sourceMappingURL=stub.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stub.test.js","sourceRoot":"","sources":["../../src/stub.test.ts"],"names":[],"mappings":";;;;;AAAA,gDAAuB;AACvB,mCAA6C;AAE7C,yCAAuC;AAEvC,IAAA,iBAAQ,EAAC,MAAM,EAAE,GAAG,EAAE;IAClB,IAAA,WAAE,EAAC,wCAAwC,EAAE,GAAG,EAAE;QAC9C,IAAA,eAAM,EAAC,IAAA,qBAAU,EAAC,WAAW,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC;YACrD,CAAC,EAAE,WAAW;YACd,MAAM,EAAE,GAAG;YACX,UAAU,EAAE,cAAI,CAAC,IAAI;SACxB,CAAC,CAAA;IACN,CAAC,CAAC,CAAA;IAEF,IAAA,WAAE,EAAC,qDAAqD,EAAE,GAAG,EAAE;QAC3D,IAAA,eAAM,EAAC,IAAA,qBAAU,EAAC,sBAAsB,CAAC,CAAC,CAAC,OAAO,CAAC;YAC/C,CAAC,EAAE,sBAAsB;YACzB,SAAS,EAAE,CAAC;YACZ,GAAG,EAAE,SAAS;SACjB,CAAC,CAAA;IACN,CAAC,CAAC,CAAA;IAEF,IAAA,WAAE,EAAC,mDAAmD,EAAE,GAAG,EAAE;QACzD,IAAA,eAAM,EAAC,IAAA,qBAAU,EAAC,8BAA8B,CAAC,CAAC,CAAC,OAAO,CAAC;YACvD,CAAC,EAAE,8BAA8B;YACjC,OAAO,EAAE,KAAK;SACjB,CAAC,CAAA;IACN,CAAC,CAAC,CAAA;IAEF,IAAA,WAAE,EAAC,6CAA6C,EAAE,GAAG,EAAE;QACnD,IAAA,eAAM,EAAC,IAAA,qBAAU,EAAC,0BAA0B,CAAC,CAAC,CAAC,OAAO,CAAC;YACnD,CAAC,EAAE,0BAA0B;YAC7B,KAAK,EAAE,EAAE;SACZ,CAAC,CAAA;IACN,CAAC,CAAC,CAAA;IAEF,IAAA,WAAE,EAAC,sDAAsD,EAAE,GAAG,EAAE;QAC5D,IAAA,eAAM,EAAC,IAAA,qBAAU,EAAC,2BAA2B,CAAC,CAAC,CAAC,OAAO,CAAC;YACpD,CAAC,EAAE,2BAA2B;YAC9B,SAAS,EAAE,CAAC;YACZ,KAAK,EAAE,EAAE;SACZ,CAAC,CAAA;IACN,CAAC,CAAC,CAAA;IAEF,IAAA,WAAE,EAAC,kDAAkD,EAAE,GAAG,EAAE;QACxD,IAAA,eAAM,EAAC,IAAA,qBAAU,EAAC,iCAAiC,EAAE,EAAE,YAAY,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC;YACjF,CAAC,EAAE,iCAAiC;YACpC,IAAI,EAAE;gBACF,CAAC,EAAE,gBAAgB;gBACnB,EAAE,EAAE,cAAI,CAAC,IAAI;gBACb,UAAU,EAAE,cAAI,CAAC,IAAI;aACxB;YACD,YAAY,EAAE,GAAG;SACpB,CAAC,CAAA;IACN,CAAC,CAAC,CAAA;AACN,CAAC,CAAC,CAAA","sourcesContent":["import Long from 'long'\nimport { describe, expect, it } from 'vitest'\n\nimport { createStub } from './index.js'\n\ndescribe('stub', () => {\n it('should correctly generate simple stubs', () => {\n expect(createStub('inputUser', { userId: 123 })).toEqual({\n _: 'inputUser',\n userId: 123,\n accessHash: Long.ZERO,\n })\n })\n\n it('should correctly generate stubs for optional fields', () => {\n expect(createStub('updateChannelTooLong')).toEqual({\n _: 'updateChannelTooLong',\n channelId: 0,\n pts: undefined,\n })\n })\n\n it('should correctly generate stubs for boolean flags', () => {\n expect(createStub('account.finishTakeoutSession')).toEqual({\n _: 'account.finishTakeoutSession',\n success: false,\n })\n })\n\n it('should correctly generate stubs for vectors', () => {\n expect(createStub('messageActionChatAddUser')).toEqual({\n _: 'messageActionChatAddUser',\n users: [],\n })\n })\n\n it('should correctly generate stubs for optional vectors', () => {\n expect(createStub('updateChannelPinnedTopics')).toEqual({\n _: 'updateChannelPinnedTopics',\n channelId: 0,\n order: [],\n })\n })\n\n it('should correctly generate stubs for nested types', () => {\n expect(createStub('messageActionGroupCallScheduled', { scheduleDate: 123 })).toEqual({\n _: 'messageActionGroupCallScheduled',\n call: {\n _: 'inputGroupCall',\n id: Long.ZERO,\n accessHash: Long.ZERO,\n },\n scheduleDate: 123,\n })\n })\n})\n"]}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,35 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const vitest_1 = require("vitest");
4
+ const core_1 = require("@mtcute/core");
5
+ const stub_js_1 = require("./stub.js");
6
+ const transport_js_1 = require("./transport.js");
7
+ (0, vitest_1.describe)('transport stub', () => {
8
+ (0, vitest_1.it)('should correctly intercept calls', async () => {
9
+ const log = [];
10
+ const client = new core_1.BaseTelegramClient({
11
+ apiId: 0,
12
+ apiHash: '',
13
+ logLevel: 0,
14
+ defaultDcs: {
15
+ main: (0, stub_js_1.createStub)('dcOption', { ipAddress: '1.2.3.4', port: 1234 }),
16
+ media: (0, stub_js_1.createStub)('dcOption', { ipAddress: '1.2.3.4', port: 5678 }),
17
+ },
18
+ transport: () => new transport_js_1.StubTelegramTransport({
19
+ onConnect: (dc, testMode) => {
20
+ log.push(`connect ${dc.ipAddress}:${dc.port} test=${testMode}`);
21
+ client.close().catch(() => { });
22
+ },
23
+ onMessage(msg) {
24
+ log.push(`message size=${msg.length}`);
25
+ },
26
+ }),
27
+ });
28
+ await client.connect().catch(() => { }); // ignore "client closed" error
29
+ (0, vitest_1.expect)(log).toEqual([
30
+ 'message size=40',
31
+ 'connect 1.2.3.4:1234 test=false',
32
+ ]);
33
+ });
34
+ });
35
+ //# sourceMappingURL=transport.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transport.test.js","sourceRoot":"","sources":["../../src/transport.test.ts"],"names":[],"mappings":";;AAAA,mCAA6C;AAE7C,uCAAiD;AAEjD,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,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,MAAM,CAAC,OAAO,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAA,CAAC,+BAA+B;QAEtE,IAAA,eAAM,EAAC,GAAG,CAAC,CAAC,OAAO,CAAC;YAChB,iBAAiB;YACjB,iCAAiC;SACpC,CAAC,CAAA;IACN,CAAC,CAAC,CAAA;AACN,CAAC,CAAC,CAAA","sourcesContent":["import { describe, expect, it } from 'vitest'\n\nimport { BaseTelegramClient } 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 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 await client.connect().catch(() => {}) // ignore \"client closed\" error\n\n expect(log).toEqual([\n 'message size=40', // req_pq_multi\n 'connect 1.2.3.4:1234 test=false',\n ])\n })\n})\n"]}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,16 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const vitest_1 = require("vitest");
4
+ const utils_js_1 = require("./utils.js");
5
+ (0, vitest_1.describe)('markedIdToPeer', () => {
6
+ (0, vitest_1.it)('should correctly convert user ids', () => {
7
+ (0, vitest_1.expect)((0, utils_js_1.markedIdToPeer)(12345)).toEqual({ _: 'peerUser', userId: 12345 });
8
+ });
9
+ (0, vitest_1.it)('should correctly convert chat ids', () => {
10
+ (0, vitest_1.expect)((0, utils_js_1.markedIdToPeer)(-12345)).toEqual({ _: 'peerChat', chatId: 12345 });
11
+ });
12
+ (0, vitest_1.it)('should correctly convert channel ids', () => {
13
+ (0, vitest_1.expect)((0, utils_js_1.markedIdToPeer)(-1000000012345)).toEqual({ _: 'peerChannel', channelId: 12345 });
14
+ });
15
+ });
16
+ //# sourceMappingURL=utils.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.test.js","sourceRoot":"","sources":["../../src/utils.test.ts"],"names":[],"mappings":";;AAAA,mCAA6C;AAE7C,yCAA2C;AAE3C,IAAA,iBAAQ,EAAC,gBAAgB,EAAE,GAAG,EAAE;IAC5B,IAAA,WAAE,EAAC,mCAAmC,EAAE,GAAG,EAAE;QACzC,IAAA,eAAM,EAAC,IAAA,yBAAc,EAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAA;IAC3E,CAAC,CAAC,CAAA;IAEF,IAAA,WAAE,EAAC,mCAAmC,EAAE,GAAG,EAAE;QACzC,IAAA,eAAM,EAAC,IAAA,yBAAc,EAAC,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAA;IAC5E,CAAC,CAAC,CAAA;IAEF,IAAA,WAAE,EAAC,sCAAsC,EAAE,GAAG,EAAE;QAC5C,IAAA,eAAM,EAAC,IAAA,yBAAc,EAAC,CAAC,aAAa,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE,aAAa,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,CAAA;IAC1F,CAAC,CAAC,CAAA;AACN,CAAC,CAAC,CAAA","sourcesContent":["import { describe, expect, it } from 'vitest'\n\nimport { markedIdToPeer } from './utils.js'\n\ndescribe('markedIdToPeer', () => {\n it('should correctly convert user ids', () => {\n expect(markedIdToPeer(12345)).toEqual({ _: 'peerUser', userId: 12345 })\n })\n\n it('should correctly convert chat ids', () => {\n expect(markedIdToPeer(-12345)).toEqual({ _: 'peerChat', chatId: 12345 })\n })\n\n it('should correctly convert channel ids', () => {\n expect(markedIdToPeer(-1000000012345)).toEqual({ _: 'peerChannel', channelId: 12345 })\n })\n})\n"]}
package/esm/client.d.ts CHANGED
@@ -7,11 +7,16 @@ interface MessageBox {
7
7
  type InputPeerId = number | tl.TypePeer | false | undefined;
8
8
  export declare class StubTelegramClient extends BaseTelegramClient {
9
9
  constructor(params?: Partial<BaseTelegramClientOptions>);
10
+ /**
11
+ * Create a fake client that may not actually be used for API calls
12
+ *
13
+ * Useful for testing "offline" methods
14
+ */
15
+ static offline(): StubTelegramClient;
10
16
  readonly _knownChats: Map<number, tl.TypeChat>;
11
17
  readonly _knownUsers: Map<number, tl.TypeUser>;
12
18
  _selfId: number;
13
- registerChat(chat: tl.TypeChat | tl.TypeChat[]): void;
14
- registerUser(user: tl.TypeUser | tl.TypeUser[]): void;
19
+ registerPeers(...peers: (tl.TypeUser | tl.TypeChat)[]): Promise<void>;
15
20
  getPeers(ids: InputPeerId[]): {
16
21
  users: tl.TypeUser[];
17
22
  chats: tl.TypeChat[];
@@ -20,7 +25,7 @@ export declare class StubTelegramClient extends BaseTelegramClient {
20
25
  onRawMessage(fn: (data: Uint8Array) => void): void;
21
26
  private _responders;
22
27
  addResponder<T extends tl.RpcMethod['_']>(responders: InputResponder<T>): void;
23
- respondWith<T extends tl.RpcMethod['_']>(method: T, response: tl.RpcCallReturn[T] | ((data: tl.FindByName<tl.RpcMethod, T>) => tl.RpcCallReturn[T])): void;
28
+ respondWith<T extends tl.RpcMethod['_'], Fn extends (data: tl.FindByName<tl.RpcMethod, T>) => MaybeAsync<tl.RpcCallReturn[T]>>(method: T, response: Fn): Fn;
24
29
  call<T extends tl.RpcMethod>(message: MustEqual<T, tl.RpcMethod>, params?: RpcCallOptions): Promise<tl.RpcCallReturn[T['_']]>;
25
30
  private _fakeMessageBoxes;
26
31
  private _lastQts;