@mtcute/core 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.
- package/cjs/network/auth-key.test.d.ts +1 -0
- package/cjs/network/auth-key.test.js +111 -0
- package/cjs/network/auth-key.test.js.map +1 -0
- package/cjs/network/config-manager.js +2 -1
- package/cjs/network/config-manager.js.map +1 -1
- package/cjs/network/config-manager.test.d.ts +1 -0
- package/cjs/network/config-manager.test.js +170 -0
- package/cjs/network/config-manager.test.js.map +1 -0
- package/cjs/network/network-manager.js +1 -1
- package/cjs/network/persistent-connection.test.d.ts +1 -0
- package/cjs/network/persistent-connection.test.js +157 -0
- package/cjs/network/persistent-connection.test.js.map +1 -0
- package/cjs/network/session-connection.js +3 -2
- package/cjs/network/session-connection.js.map +1 -1
- package/cjs/network/transports/intermediate.test.d.ts +1 -0
- package/cjs/network/transports/intermediate.test.js +86 -0
- package/cjs/network/transports/intermediate.test.js.map +1 -0
- package/cjs/network/transports/obfuscated.js +1 -1
- package/cjs/network/transports/obfuscated.js.map +1 -1
- package/cjs/network/transports/obfuscated.test.d.ts +1 -0
- package/cjs/network/transports/obfuscated.test.js +131 -0
- package/cjs/network/transports/obfuscated.test.js.map +1 -0
- package/cjs/network/transports/tcp.js +1 -1
- package/cjs/network/transports/tcp.js.map +1 -1
- package/cjs/network/transports/tcp.test.d.ts +1 -0
- package/cjs/network/transports/tcp.test.js +97 -0
- package/cjs/network/transports/tcp.test.js.map +1 -0
- package/cjs/network/transports/websocket.test.d.ts +1 -0
- package/cjs/network/transports/websocket.test.js +91 -0
- package/cjs/network/transports/websocket.test.js.map +1 -0
- package/cjs/storage/json.test.d.ts +1 -0
- package/cjs/storage/json.test.js +37 -0
- package/cjs/storage/json.test.js.map +1 -0
- package/cjs/storage/localstorage.test.d.ts +1 -0
- package/cjs/storage/localstorage.test.js +23 -0
- package/cjs/storage/localstorage.test.js.map +1 -0
- package/cjs/storage/memory.test.d.ts +1 -0
- package/cjs/storage/memory.test.js +47 -0
- package/cjs/storage/memory.test.js.map +1 -0
- package/cjs/utils/async-lock.test.d.ts +1 -0
- package/cjs/utils/async-lock.test.js +25 -0
- package/cjs/utils/async-lock.test.js.map +1 -0
- package/cjs/utils/bigint-utils.test.d.ts +1 -0
- package/cjs/utils/bigint-utils.test.js +150 -0
- package/cjs/utils/bigint-utils.test.js.map +1 -0
- package/cjs/utils/buffer-utils.test.d.ts +1 -0
- package/cjs/utils/buffer-utils.test.js +69 -0
- package/cjs/utils/buffer-utils.test.js.map +1 -0
- package/cjs/utils/condition-variable.test.d.ts +1 -0
- package/cjs/utils/condition-variable.test.js +27 -0
- package/cjs/utils/condition-variable.test.js.map +1 -0
- package/cjs/utils/controllable-promise.test.d.ts +1 -0
- package/cjs/utils/controllable-promise.test.js +17 -0
- package/cjs/utils/controllable-promise.test.js.map +1 -0
- package/cjs/utils/crypto/keys.test.d.ts +1 -0
- package/cjs/utils/crypto/keys.test.js +40 -0
- package/cjs/utils/crypto/keys.test.js.map +1 -0
- package/cjs/utils/crypto/miller-rabin.test.d.ts +1 -0
- package/cjs/utils/crypto/miller-rabin.test.js +60 -0
- package/cjs/utils/crypto/miller-rabin.test.js.map +1 -0
- package/cjs/utils/crypto/mtproto.test.d.ts +1 -0
- package/cjs/utils/crypto/mtproto.test.js +47 -0
- package/cjs/utils/crypto/mtproto.test.js.map +1 -0
- package/cjs/utils/crypto/node.test.d.ts +1 -0
- package/cjs/utils/crypto/node.test.js +13 -0
- package/cjs/utils/crypto/node.test.js.map +1 -0
- package/cjs/utils/crypto/password.test.d.ts +1 -0
- package/cjs/utils/crypto/password.test.js +95 -0
- package/cjs/utils/crypto/password.test.js.map +1 -0
- package/cjs/utils/crypto/utils.test.d.ts +1 -0
- package/cjs/utils/crypto/utils.test.js +49 -0
- package/cjs/utils/crypto/utils.test.js.map +1 -0
- package/cjs/utils/crypto/web.test.d.ts +1 -0
- package/cjs/utils/crypto/web.test.js +17 -0
- package/cjs/utils/crypto/web.test.js.map +1 -0
- package/cjs/utils/deque.test.d.ts +1 -0
- package/cjs/utils/deque.test.js +128 -0
- package/cjs/utils/deque.test.js.map +1 -0
- package/cjs/utils/function-utils.test.d.ts +1 -0
- package/cjs/utils/function-utils.test.js +23 -0
- package/cjs/utils/function-utils.test.js.map +1 -0
- package/cjs/utils/linked-list.test.d.ts +1 -0
- package/cjs/utils/linked-list.test.js +36 -0
- package/cjs/utils/linked-list.test.js.map +1 -0
- package/cjs/utils/links/bots.test.d.ts +1 -0
- package/cjs/utils/links/bots.test.js +152 -0
- package/cjs/utils/links/bots.test.js.map +1 -0
- package/cjs/utils/links/chat.test.d.ts +1 -0
- package/cjs/utils/links/chat.test.js +84 -0
- package/cjs/utils/links/chat.test.js.map +1 -0
- package/cjs/utils/links/misc.test.d.ts +1 -0
- package/cjs/utils/links/misc.test.js +153 -0
- package/cjs/utils/links/misc.test.js.map +1 -0
- package/cjs/utils/links/proxy.test.d.ts +1 -0
- package/cjs/utils/links/proxy.test.js +74 -0
- package/cjs/utils/links/proxy.test.js.map +1 -0
- package/cjs/utils/links/user.test.d.ts +1 -0
- package/cjs/utils/links/user.test.js +63 -0
- package/cjs/utils/links/user.test.js.map +1 -0
- package/cjs/utils/logger.test.d.ts +1 -0
- package/cjs/utils/logger.test.js +125 -0
- package/cjs/utils/logger.test.js.map +1 -0
- package/cjs/utils/long-utils.test.d.ts +1 -0
- package/cjs/utils/long-utils.test.js +158 -0
- package/cjs/utils/long-utils.test.js.map +1 -0
- package/cjs/utils/lru-map.test.d.ts +1 -0
- package/cjs/utils/lru-map.test.js +96 -0
- package/cjs/utils/lru-map.test.js.map +1 -0
- package/cjs/utils/lru-set.test.d.ts +1 -0
- package/cjs/utils/lru-set.test.js +77 -0
- package/cjs/utils/lru-set.test.js.map +1 -0
- package/cjs/utils/peer-utils.test.d.ts +1 -0
- package/cjs/utils/peer-utils.test.js +122 -0
- package/cjs/utils/peer-utils.test.js.map +1 -0
- package/cjs/utils/sorted-array.test.d.ts +1 -0
- package/cjs/utils/sorted-array.test.js +66 -0
- package/cjs/utils/sorted-array.test.js.map +1 -0
- package/cjs/utils/string-session.test.d.ts +1 -0
- package/cjs/utils/string-session.test.js +106 -0
- package/cjs/utils/string-session.test.js.map +1 -0
- package/cjs/utils/tl-json.test.d.ts +1 -0
- package/cjs/utils/tl-json.test.js +83 -0
- package/cjs/utils/tl-json.test.js.map +1 -0
- package/cjs/utils/type-assertions.test.d.ts +1 -0
- package/cjs/utils/type-assertions.test.js +67 -0
- package/cjs/utils/type-assertions.test.js.map +1 -0
- package/esm/network/auth-key.test.d.ts +1 -0
- package/esm/network/auth-key.test.js +106 -0
- package/esm/network/auth-key.test.js.map +1 -0
- package/esm/network/config-manager.js +2 -1
- package/esm/network/config-manager.js.map +1 -1
- package/esm/network/config-manager.test.d.ts +1 -0
- package/esm/network/config-manager.test.js +168 -0
- package/esm/network/config-manager.test.js.map +1 -0
- package/esm/network/network-manager.js +1 -1
- package/esm/network/persistent-connection.test.d.ts +1 -0
- package/esm/network/persistent-connection.test.js +155 -0
- package/esm/network/persistent-connection.test.js.map +1 -0
- package/esm/network/session-connection.js +3 -2
- package/esm/network/session-connection.js.map +1 -1
- package/esm/network/transports/intermediate.test.d.ts +1 -0
- package/esm/network/transports/intermediate.test.js +84 -0
- package/esm/network/transports/intermediate.test.js.map +1 -0
- package/esm/network/transports/obfuscated.js +1 -1
- package/esm/network/transports/obfuscated.js.map +1 -1
- package/esm/network/transports/obfuscated.test.d.ts +1 -0
- package/esm/network/transports/obfuscated.test.js +129 -0
- package/esm/network/transports/obfuscated.test.js.map +1 -0
- package/esm/network/transports/tcp.js +1 -1
- package/esm/network/transports/tcp.js.map +1 -1
- package/esm/network/transports/tcp.test.d.ts +1 -0
- package/esm/network/transports/tcp.test.js +95 -0
- package/esm/network/transports/tcp.test.js.map +1 -0
- package/esm/network/transports/websocket.test.d.ts +1 -0
- package/esm/network/transports/websocket.test.js +89 -0
- package/esm/network/transports/websocket.test.js.map +1 -0
- package/esm/storage/json.test.d.ts +1 -0
- package/esm/storage/json.test.js +35 -0
- package/esm/storage/json.test.js.map +1 -0
- package/esm/storage/localstorage.test.d.ts +1 -0
- package/esm/storage/localstorage.test.js +21 -0
- package/esm/storage/localstorage.test.js.map +1 -0
- package/esm/storage/memory.test.d.ts +1 -0
- package/esm/storage/memory.test.js +45 -0
- package/esm/storage/memory.test.js.map +1 -0
- package/esm/utils/async-lock.test.d.ts +1 -0
- package/esm/utils/async-lock.test.js +23 -0
- package/esm/utils/async-lock.test.js.map +1 -0
- package/esm/utils/bigint-utils.test.d.ts +1 -0
- package/esm/utils/bigint-utils.test.js +148 -0
- package/esm/utils/bigint-utils.test.js.map +1 -0
- package/esm/utils/buffer-utils.test.d.ts +1 -0
- package/esm/utils/buffer-utils.test.js +67 -0
- package/esm/utils/buffer-utils.test.js.map +1 -0
- package/esm/utils/condition-variable.test.d.ts +1 -0
- package/esm/utils/condition-variable.test.js +25 -0
- package/esm/utils/condition-variable.test.js.map +1 -0
- package/esm/utils/controllable-promise.test.d.ts +1 -0
- package/esm/utils/controllable-promise.test.js +15 -0
- package/esm/utils/controllable-promise.test.js.map +1 -0
- package/esm/utils/crypto/keys.test.d.ts +1 -0
- package/esm/utils/crypto/keys.test.js +38 -0
- package/esm/utils/crypto/keys.test.js.map +1 -0
- package/esm/utils/crypto/miller-rabin.test.d.ts +1 -0
- package/esm/utils/crypto/miller-rabin.test.js +58 -0
- package/esm/utils/crypto/miller-rabin.test.js.map +1 -0
- package/esm/utils/crypto/mtproto.test.d.ts +1 -0
- package/esm/utils/crypto/mtproto.test.js +45 -0
- package/esm/utils/crypto/mtproto.test.js.map +1 -0
- package/esm/utils/crypto/node.test.d.ts +1 -0
- package/esm/utils/crypto/node.test.js +11 -0
- package/esm/utils/crypto/node.test.js.map +1 -0
- package/esm/utils/crypto/password.test.d.ts +1 -0
- package/esm/utils/crypto/password.test.js +90 -0
- package/esm/utils/crypto/password.test.js.map +1 -0
- package/esm/utils/crypto/utils.test.d.ts +1 -0
- package/esm/utils/crypto/utils.test.js +47 -0
- package/esm/utils/crypto/utils.test.js.map +1 -0
- package/esm/utils/crypto/web.test.d.ts +1 -0
- package/esm/utils/crypto/web.test.js +15 -0
- package/esm/utils/crypto/web.test.js.map +1 -0
- package/esm/utils/deque.test.d.ts +1 -0
- package/esm/utils/deque.test.js +126 -0
- package/esm/utils/deque.test.js.map +1 -0
- package/esm/utils/function-utils.test.d.ts +1 -0
- package/esm/utils/function-utils.test.js +21 -0
- package/esm/utils/function-utils.test.js.map +1 -0
- package/esm/utils/linked-list.test.d.ts +1 -0
- package/esm/utils/linked-list.test.js +34 -0
- package/esm/utils/linked-list.test.js.map +1 -0
- package/esm/utils/links/bots.test.d.ts +1 -0
- package/esm/utils/links/bots.test.js +150 -0
- package/esm/utils/links/bots.test.js.map +1 -0
- package/esm/utils/links/chat.test.d.ts +1 -0
- package/esm/utils/links/chat.test.js +82 -0
- package/esm/utils/links/chat.test.js.map +1 -0
- package/esm/utils/links/misc.test.d.ts +1 -0
- package/esm/utils/links/misc.test.js +151 -0
- package/esm/utils/links/misc.test.js.map +1 -0
- package/esm/utils/links/proxy.test.d.ts +1 -0
- package/esm/utils/links/proxy.test.js +72 -0
- package/esm/utils/links/proxy.test.js.map +1 -0
- package/esm/utils/links/user.test.d.ts +1 -0
- package/esm/utils/links/user.test.js +61 -0
- package/esm/utils/links/user.test.js.map +1 -0
- package/esm/utils/logger.test.d.ts +1 -0
- package/esm/utils/logger.test.js +120 -0
- package/esm/utils/logger.test.js.map +1 -0
- package/esm/utils/long-utils.test.d.ts +1 -0
- package/esm/utils/long-utils.test.js +153 -0
- package/esm/utils/long-utils.test.js.map +1 -0
- package/esm/utils/lru-map.test.d.ts +1 -0
- package/esm/utils/lru-map.test.js +94 -0
- package/esm/utils/lru-map.test.js.map +1 -0
- package/esm/utils/lru-set.test.d.ts +1 -0
- package/esm/utils/lru-set.test.js +72 -0
- package/esm/utils/lru-set.test.js.map +1 -0
- package/esm/utils/peer-utils.test.d.ts +1 -0
- package/esm/utils/peer-utils.test.js +117 -0
- package/esm/utils/peer-utils.test.js.map +1 -0
- package/esm/utils/sorted-array.test.d.ts +1 -0
- package/esm/utils/sorted-array.test.js +64 -0
- package/esm/utils/sorted-array.test.js.map +1 -0
- package/esm/utils/string-session.test.d.ts +1 -0
- package/esm/utils/string-session.test.js +104 -0
- package/esm/utils/string-session.test.js.map +1 -0
- package/esm/utils/tl-json.test.d.ts +1 -0
- package/esm/utils/tl-json.test.js +81 -0
- package/esm/utils/tl-json.test.js.map +1 -0
- package/esm/utils/type-assertions.test.d.ts +1 -0
- package/esm/utils/type-assertions.test.js +65 -0
- package/esm/utils/type-assertions.test.js.map +1 -0
- package/package.json +2 -2
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const vitest_1 = require("vitest");
|
|
4
|
+
const test_1 = require("@mtcute/test");
|
|
5
|
+
const tl_runtime_1 = require("@mtcute/tl-runtime");
|
|
6
|
+
const index_js_1 = require("../../index.js");
|
|
7
|
+
const index_js_2 = require("../../utils/index.js");
|
|
8
|
+
(0, vitest_1.describe)('IntermediatePacketCodec', () => {
|
|
9
|
+
(0, vitest_1.it)('should return correct tag', () => {
|
|
10
|
+
(0, vitest_1.expect)((0, tl_runtime_1.hexEncode)(new index_js_1.IntermediatePacketCodec().tag())).eq('eeeeeeee');
|
|
11
|
+
});
|
|
12
|
+
(0, vitest_1.it)('should correctly parse immediate framing', () => new Promise((done) => {
|
|
13
|
+
const codec = new index_js_1.IntermediatePacketCodec();
|
|
14
|
+
codec.on('packet', (data) => {
|
|
15
|
+
(0, vitest_1.expect)([...data]).eql([5, 1, 2, 3, 4]);
|
|
16
|
+
done();
|
|
17
|
+
});
|
|
18
|
+
codec.feed((0, tl_runtime_1.hexDecodeToBuffer)('050000000501020304'));
|
|
19
|
+
}));
|
|
20
|
+
(0, vitest_1.it)('should correctly parse incomplete framing', () => new Promise((done) => {
|
|
21
|
+
const codec = new index_js_1.IntermediatePacketCodec();
|
|
22
|
+
codec.on('packet', (data) => {
|
|
23
|
+
(0, vitest_1.expect)([...data]).eql([5, 1, 2, 3, 4]);
|
|
24
|
+
done();
|
|
25
|
+
});
|
|
26
|
+
codec.feed((0, tl_runtime_1.hexDecodeToBuffer)('050000000501'));
|
|
27
|
+
codec.feed((0, tl_runtime_1.hexDecodeToBuffer)('020304'));
|
|
28
|
+
}));
|
|
29
|
+
(0, vitest_1.it)('should correctly parse multiple streamed packets', () => new Promise((done) => {
|
|
30
|
+
const codec = new index_js_1.IntermediatePacketCodec();
|
|
31
|
+
let number = 0;
|
|
32
|
+
codec.on('packet', (data) => {
|
|
33
|
+
if (number === 0) {
|
|
34
|
+
(0, vitest_1.expect)([...data]).eql([5, 1, 2, 3, 4]);
|
|
35
|
+
number = 1;
|
|
36
|
+
}
|
|
37
|
+
else {
|
|
38
|
+
(0, vitest_1.expect)([...data]).eql([3, 1, 2, 3, 1]);
|
|
39
|
+
done();
|
|
40
|
+
}
|
|
41
|
+
});
|
|
42
|
+
codec.feed((0, tl_runtime_1.hexDecodeToBuffer)('050000000501'));
|
|
43
|
+
codec.feed((0, tl_runtime_1.hexDecodeToBuffer)('020304050000'));
|
|
44
|
+
codec.feed((0, tl_runtime_1.hexDecodeToBuffer)('000301020301'));
|
|
45
|
+
}));
|
|
46
|
+
(0, vitest_1.it)('should correctly parse transport errors', () => new Promise((done) => {
|
|
47
|
+
const codec = new index_js_1.IntermediatePacketCodec();
|
|
48
|
+
codec.on('error', (err) => {
|
|
49
|
+
(0, vitest_1.expect)(err).to.have.instanceOf(index_js_1.TransportError);
|
|
50
|
+
(0, vitest_1.expect)(err.code).eq(404);
|
|
51
|
+
done();
|
|
52
|
+
});
|
|
53
|
+
codec.feed((0, tl_runtime_1.hexDecodeToBuffer)('040000006cfeffff'));
|
|
54
|
+
}));
|
|
55
|
+
(0, vitest_1.it)('should reset when called reset()', () => new Promise((done) => {
|
|
56
|
+
const codec = new index_js_1.IntermediatePacketCodec();
|
|
57
|
+
codec.on('packet', (data) => {
|
|
58
|
+
(0, vitest_1.expect)([...data]).eql([1, 2, 3, 4, 5]);
|
|
59
|
+
done();
|
|
60
|
+
});
|
|
61
|
+
codec.feed((0, tl_runtime_1.hexDecodeToBuffer)('ff0000001234567812345678'));
|
|
62
|
+
codec.reset();
|
|
63
|
+
codec.feed((0, tl_runtime_1.hexDecodeToBuffer)('050000000102030405'));
|
|
64
|
+
}));
|
|
65
|
+
(0, vitest_1.it)('should correctly frame packets', () => {
|
|
66
|
+
const data = (0, tl_runtime_1.hexDecodeToBuffer)('6cfeffff');
|
|
67
|
+
// eslint-disable-next-line no-restricted-globals
|
|
68
|
+
(0, vitest_1.expect)(Buffer.from(new index_js_1.IntermediatePacketCodec().encode(data))).toEqual((0, index_js_2.concatBuffers)([new Uint8Array([0x04, 0x00, 0x00, 0x00]), data]));
|
|
69
|
+
});
|
|
70
|
+
});
|
|
71
|
+
(0, vitest_1.describe)('PaddedIntermediatePacketCodec', () => {
|
|
72
|
+
(0, test_1.useFakeMathRandom)();
|
|
73
|
+
const create = async () => {
|
|
74
|
+
const codec = new index_js_1.PaddedIntermediatePacketCodec();
|
|
75
|
+
codec.setup(await (0, test_1.defaultTestCryptoProvider)());
|
|
76
|
+
return codec;
|
|
77
|
+
};
|
|
78
|
+
(0, vitest_1.it)('should return correct tag', async () => {
|
|
79
|
+
(0, vitest_1.expect)((0, tl_runtime_1.hexEncode)((await create()).tag())).eq('dddddddd');
|
|
80
|
+
});
|
|
81
|
+
(0, vitest_1.it)('should correctly frame packets', async () => {
|
|
82
|
+
const data = (0, tl_runtime_1.hexDecodeToBuffer)('6cfeffff');
|
|
83
|
+
(0, vitest_1.expect)((0, tl_runtime_1.hexEncode)((await create()).encode(data))).toEqual('0a0000006cfeffff29afd26df40f');
|
|
84
|
+
});
|
|
85
|
+
});
|
|
86
|
+
//# sourceMappingURL=intermediate.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"intermediate.test.js","sourceRoot":"","sources":["../../../../src/network/transports/intermediate.test.ts"],"names":[],"mappings":"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","sourcesContent":["import { describe, expect, it } from 'vitest'\n\nimport { defaultTestCryptoProvider, useFakeMathRandom } from '@mtcute/test'\nimport { hexDecodeToBuffer, hexEncode } from '@mtcute/tl-runtime'\n\nimport { IntermediatePacketCodec, PaddedIntermediatePacketCodec, TransportError } from '../../index.js'\nimport { concatBuffers } from '../../utils/index.js'\n\ndescribe('IntermediatePacketCodec', () => {\n it('should return correct tag', () => {\n expect(hexEncode(new IntermediatePacketCodec().tag())).eq('eeeeeeee')\n })\n\n it('should correctly parse immediate framing', () =>\n new Promise<void>((done) => {\n const codec = new IntermediatePacketCodec()\n codec.on('packet', (data: Uint8Array) => {\n expect([...data]).eql([5, 1, 2, 3, 4])\n done()\n })\n codec.feed(hexDecodeToBuffer('050000000501020304'))\n }))\n\n it('should correctly parse incomplete framing', () =>\n new Promise<void>((done) => {\n const codec = new IntermediatePacketCodec()\n codec.on('packet', (data: Uint8Array) => {\n expect([...data]).eql([5, 1, 2, 3, 4])\n done()\n })\n codec.feed(hexDecodeToBuffer('050000000501'))\n codec.feed(hexDecodeToBuffer('020304'))\n }))\n\n it('should correctly parse multiple streamed packets', () =>\n new Promise<void>((done) => {\n const codec = new IntermediatePacketCodec()\n\n let number = 0\n\n codec.on('packet', (data: Uint8Array) => {\n if (number === 0) {\n expect([...data]).eql([5, 1, 2, 3, 4])\n number = 1\n } else {\n expect([...data]).eql([3, 1, 2, 3, 1])\n done()\n }\n })\n codec.feed(hexDecodeToBuffer('050000000501'))\n codec.feed(hexDecodeToBuffer('020304050000'))\n codec.feed(hexDecodeToBuffer('000301020301'))\n }))\n\n it('should correctly parse transport errors', () =>\n new Promise<void>((done) => {\n const codec = new IntermediatePacketCodec()\n\n codec.on('error', (err: TransportError) => {\n expect(err).to.have.instanceOf(TransportError)\n expect(err.code).eq(404)\n done()\n })\n\n codec.feed(hexDecodeToBuffer('040000006cfeffff'))\n }))\n\n it('should reset when called reset()', () =>\n new Promise<void>((done) => {\n const codec = new IntermediatePacketCodec()\n\n codec.on('packet', (data: Uint8Array) => {\n expect([...data]).eql([1, 2, 3, 4, 5])\n done()\n })\n\n codec.feed(hexDecodeToBuffer('ff0000001234567812345678'))\n codec.reset()\n codec.feed(hexDecodeToBuffer('050000000102030405'))\n }))\n\n it('should correctly frame packets', () => {\n const data = hexDecodeToBuffer('6cfeffff')\n\n // eslint-disable-next-line no-restricted-globals\n expect(Buffer.from(new IntermediatePacketCodec().encode(data))).toEqual(\n concatBuffers([new Uint8Array([0x04, 0x00, 0x00, 0x00]), data]),\n )\n })\n})\n\ndescribe('PaddedIntermediatePacketCodec', () => {\n useFakeMathRandom()\n\n const create = async () => {\n const codec = new PaddedIntermediatePacketCodec()\n codec.setup!(await defaultTestCryptoProvider())\n\n return codec\n }\n\n it('should return correct tag', async () => {\n expect(hexEncode((await create()).tag())).eq('dddddddd')\n })\n\n it('should correctly frame packets', async () => {\n const data = hexDecodeToBuffer('6cfeffff')\n\n expect(hexEncode((await create()).encode(data))).toEqual('0a0000006cfeffff29afd26df40f')\n })\n})\n"]}
|
|
@@ -16,7 +16,7 @@ class ObfuscatedPacketCodec extends wrapped_js_1.WrappedCodec {
|
|
|
16
16
|
if (random[0] === 0xef)
|
|
17
17
|
continue;
|
|
18
18
|
dv = (0, buffer_utils_js_1.dataViewFromBuffer)(random);
|
|
19
|
-
const firstInt = dv.
|
|
19
|
+
const firstInt = dv.getUint32(0, true);
|
|
20
20
|
if (firstInt === 0x44414548 || // HEAD
|
|
21
21
|
firstInt === 0x54534f50 || // POST
|
|
22
22
|
firstInt === 0x20544547 || // GET(space)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"obfuscated.js","sourceRoot":"","sources":["../../../../src/network/transports/obfuscated.ts"],"names":[],"mappings":";;;AAAA,iEAAiG;AAGjG,6CAA2C;AAS3C,MAAa,qBAAsB,SAAQ,yBAAY;IAMnD,YAAY,KAAmB,EAAE,KAAmB;QAChD,KAAK,CAAC,KAAK,CAAC,CAAA;QACZ,IAAI,CAAC,MAAM,GAAG,KAAK,CAAA;IACvB,CAAC;IAED,KAAK,CAAC,GAAG;QACL,IAAI,MAAkB,CAAA;QACtB,IAAI,EAAY,CAAA;QAEhB,SAAS;YACL,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE,CAAC,CAAA;YACrC,IAAI,MAAM,CAAC,CAAC,CAAC,KAAK,IAAI;gBAAE,SAAQ;YAEhC,EAAE,GAAG,IAAA,oCAAkB,EAAC,MAAM,CAAC,CAAA;YAC/B,MAAM,QAAQ,GAAG,EAAE,CAAC,
|
|
1
|
+
{"version":3,"file":"obfuscated.js","sourceRoot":"","sources":["../../../../src/network/transports/obfuscated.ts"],"names":[],"mappings":"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","sourcesContent":["import { bufferToReversed, concatBuffers, dataViewFromBuffer } from '../../utils/buffer-utils.js'\nimport { IAesCtr } from '../../utils/index.js'\nimport { IPacketCodec } from './abstract.js'\nimport { WrappedCodec } from './wrapped.js'\n\nexport interface MtProxyInfo {\n dcId: number\n secret: Uint8Array\n test: boolean\n media: boolean\n}\n\nexport class ObfuscatedPacketCodec extends WrappedCodec implements IPacketCodec {\n private _encryptor?: IAesCtr\n private _decryptor?: IAesCtr\n\n private _proxy?: MtProxyInfo\n\n constructor(inner: IPacketCodec, proxy?: MtProxyInfo) {\n super(inner)\n this._proxy = proxy\n }\n\n async tag(): Promise<Uint8Array> {\n let random: Uint8Array\n let dv: DataView\n\n for (;;) {\n random = this._crypto.randomBytes(64)\n if (random[0] === 0xef) continue\n\n dv = dataViewFromBuffer(random)\n const firstInt = dv.getUint32(0, true)\n\n if (\n firstInt === 0x44414548 || // HEAD\n firstInt === 0x54534f50 || // POST\n firstInt === 0x20544547 || // GET(space)\n firstInt === 0x4954504f || // OPTI\n firstInt === 0xdddddddd || // padded intermediate\n firstInt === 0xeeeeeeee || // intermediate\n firstInt === 0x02010316 // no idea, taken from tdlib\n ) {\n continue\n }\n if (dv.getInt32(4, true) === 0) continue\n\n break\n }\n\n let innerTag = await this._inner.tag()\n\n if (innerTag.length !== 4) {\n const b = innerTag[0]\n innerTag = new Uint8Array([b, b, b, b])\n }\n random.set(innerTag, 56)\n\n if (this._proxy) {\n let dcId = this._proxy.dcId\n if (this._proxy.test) dcId += 10000\n if (this._proxy.media) dcId = -dcId\n\n dv.setInt16(60, dcId, true)\n }\n\n const randomRev = bufferToReversed(random, 8, 56)\n\n let encryptKey = random.subarray(8, 40)\n const encryptIv = random.subarray(40, 56)\n\n let decryptKey = randomRev.subarray(0, 32)\n const decryptIv = randomRev.subarray(32, 48)\n\n if (this._proxy) {\n encryptKey = this._crypto.sha256(concatBuffers([encryptKey, this._proxy.secret]))\n decryptKey = this._crypto.sha256(concatBuffers([decryptKey, this._proxy.secret]))\n }\n\n this._encryptor = this._crypto.createAesCtr(encryptKey, encryptIv, true)\n this._decryptor = this._crypto.createAesCtr(decryptKey, decryptIv, false)\n\n const encrypted = this._encryptor.process(random)\n random.set(encrypted.subarray(56, 64), 56)\n\n return random\n }\n\n async encode(packet: Uint8Array): Promise<Uint8Array> {\n return this._encryptor!.process(await this._inner.encode(packet))\n }\n\n feed(data: Uint8Array): void {\n const dec = this._decryptor!.process(data)\n\n this._inner.feed(dec)\n }\n\n reset(): void {\n this._inner.reset()\n this._encryptor?.close?.()\n this._decryptor?.close?.()\n\n this._encryptor = undefined\n this._decryptor = undefined\n }\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const vitest_1 = require("vitest");
|
|
4
|
+
const test_1 = require("@mtcute/test");
|
|
5
|
+
const index_js_1 = require("../../utils/index.js");
|
|
6
|
+
const intermediate_js_1 = require("./intermediate.js");
|
|
7
|
+
const obfuscated_js_1 = require("./obfuscated.js");
|
|
8
|
+
(0, vitest_1.describe)('ObfuscatedPacketCodec', () => {
|
|
9
|
+
const create = async (randomSource, proxy) => {
|
|
10
|
+
const codec = new obfuscated_js_1.ObfuscatedPacketCodec(new intermediate_js_1.IntermediatePacketCodec(), proxy);
|
|
11
|
+
const crypto = await (0, test_1.defaultTestCryptoProvider)(randomSource);
|
|
12
|
+
codec.setup(crypto, new index_js_1.LogManager());
|
|
13
|
+
return [codec, crypto];
|
|
14
|
+
};
|
|
15
|
+
(0, vitest_1.describe)('tag', () => {
|
|
16
|
+
(0, vitest_1.it)('should correctly generate random initial payload', async () => {
|
|
17
|
+
const random = 'ff'.repeat(64);
|
|
18
|
+
const [codec] = await create(random);
|
|
19
|
+
const tag = await codec.tag();
|
|
20
|
+
(0, vitest_1.expect)((0, index_js_1.hexEncode)(tag)).toEqual('ff'.repeat(56) + 'fce8ab2203db2bff');
|
|
21
|
+
});
|
|
22
|
+
(0, vitest_1.describe)('mtproxy', () => {
|
|
23
|
+
(0, vitest_1.it)('should correctly generate random initial payload for prod dc', async () => {
|
|
24
|
+
const random = 'ff'.repeat(64);
|
|
25
|
+
const proxy = {
|
|
26
|
+
dcId: 1,
|
|
27
|
+
secret: new Uint8Array(16),
|
|
28
|
+
test: false,
|
|
29
|
+
media: false,
|
|
30
|
+
};
|
|
31
|
+
const [codec] = await create(random, proxy);
|
|
32
|
+
const tag = await codec.tag();
|
|
33
|
+
(0, vitest_1.expect)((0, index_js_1.hexEncode)(tag)).toEqual('ff'.repeat(56) + 'ecec4cbda8bb188b');
|
|
34
|
+
});
|
|
35
|
+
(0, vitest_1.it)('should correctly generate random initial payload for test dc', async () => {
|
|
36
|
+
const random = 'ff'.repeat(64);
|
|
37
|
+
const proxy = {
|
|
38
|
+
dcId: 1,
|
|
39
|
+
secret: new Uint8Array(16),
|
|
40
|
+
test: true,
|
|
41
|
+
media: false,
|
|
42
|
+
};
|
|
43
|
+
const [codec] = await create(random, proxy);
|
|
44
|
+
const tag = await codec.tag();
|
|
45
|
+
(0, vitest_1.expect)((0, index_js_1.hexEncode)(tag)).toEqual('ff'.repeat(56) + 'ecec4cbdb89c188b');
|
|
46
|
+
});
|
|
47
|
+
(0, vitest_1.it)('should correctly generate random initial payload for media dc', async () => {
|
|
48
|
+
const random = 'ff'.repeat(64);
|
|
49
|
+
const proxy = {
|
|
50
|
+
dcId: 1,
|
|
51
|
+
secret: new Uint8Array(16),
|
|
52
|
+
test: false,
|
|
53
|
+
media: true,
|
|
54
|
+
};
|
|
55
|
+
const [codec] = await create(random, proxy);
|
|
56
|
+
const tag = await codec.tag();
|
|
57
|
+
(0, vitest_1.expect)((0, index_js_1.hexEncode)(tag)).toEqual('ff'.repeat(56) + 'ecec4cbd5644188b');
|
|
58
|
+
});
|
|
59
|
+
});
|
|
60
|
+
vitest_1.it.each([
|
|
61
|
+
['ef'],
|
|
62
|
+
['48454144'],
|
|
63
|
+
['504f5354'],
|
|
64
|
+
['47455420'],
|
|
65
|
+
['4f505449'],
|
|
66
|
+
['dddddddd'],
|
|
67
|
+
['eeeeeeee'],
|
|
68
|
+
['16030102'],
|
|
69
|
+
])('should correctly retry for %s prefix', async (prefix) => {
|
|
70
|
+
const random = prefix + 'ff'.repeat(64 - prefix.length / 2);
|
|
71
|
+
const [codec] = await create(random);
|
|
72
|
+
// generating random payload requires 64 bytes of entropy, so
|
|
73
|
+
// if it asks for more, it means it tried to generate it again
|
|
74
|
+
await (0, vitest_1.expect)(() => codec.tag()).rejects.toThrow('not enough entropy');
|
|
75
|
+
});
|
|
76
|
+
});
|
|
77
|
+
(0, vitest_1.it)('should correctly create aes ctr', async () => {
|
|
78
|
+
const [codec, crypto] = await create();
|
|
79
|
+
const spyCreateAesCtr = vitest_1.vi.spyOn(crypto, 'createAesCtr');
|
|
80
|
+
await codec.tag();
|
|
81
|
+
(0, vitest_1.expect)(spyCreateAesCtr).toHaveBeenCalledTimes(2);
|
|
82
|
+
(0, vitest_1.expect)(spyCreateAesCtr).toHaveBeenNthCalledWith(1, (0, test_1.u8HexDecode)('10b6b4ad6d56ef5df9453f88e6ee6adb6e0544ba635dc6a8a990c9b8b980c343'), (0, test_1.u8HexDecode)('936b33fa7f97bae025102532233abb26'), true);
|
|
83
|
+
(0, vitest_1.expect)(spyCreateAesCtr).toHaveBeenNthCalledWith(2, (0, test_1.u8HexDecode)('26bb3a2332251025e0ba977ffa336b9343c380b9b8c990a9a8c65d63ba44056e'), (0, test_1.u8HexDecode)('db6aeee6883f45f95def566dadb4b610'), false);
|
|
84
|
+
});
|
|
85
|
+
(0, vitest_1.it)('should correctly create aes ctr for mtproxy', async () => {
|
|
86
|
+
const proxy = {
|
|
87
|
+
dcId: 1,
|
|
88
|
+
secret: (0, index_js_1.hexDecodeToBuffer)('00112233445566778899aabbccddeeff'),
|
|
89
|
+
test: true,
|
|
90
|
+
media: false,
|
|
91
|
+
};
|
|
92
|
+
const [codec, crypto] = await create(undefined, proxy);
|
|
93
|
+
const spyCreateAesCtr = vitest_1.vi.spyOn(crypto, 'createAesCtr');
|
|
94
|
+
await codec.tag();
|
|
95
|
+
(0, vitest_1.expect)(spyCreateAesCtr).toHaveBeenCalledTimes(2);
|
|
96
|
+
(0, vitest_1.expect)(spyCreateAesCtr).toHaveBeenNthCalledWith(1, (0, index_js_1.hexDecodeToBuffer)('dd03188944590983e28dad14d97d0952389d118af4ffcbdb28d56a6a612ef7a6'), (0, test_1.u8HexDecode)('936b33fa7f97bae025102532233abb26'), true);
|
|
97
|
+
(0, vitest_1.expect)(spyCreateAesCtr).toHaveBeenNthCalledWith(2, (0, index_js_1.hexDecodeToBuffer)('413b8e08021fbb08a2962b6d7187194fe46565c6b329d3bbdfcffd4870c16119'), (0, test_1.u8HexDecode)('db6aeee6883f45f95def566dadb4b610'), false);
|
|
98
|
+
});
|
|
99
|
+
(0, vitest_1.it)('should correctly encrypt the underlying codec', async () => {
|
|
100
|
+
const data = (0, index_js_1.hexDecodeToBuffer)('6cfeffff');
|
|
101
|
+
const msg1 = 'a1020630a410e940';
|
|
102
|
+
const msg2 = 'f53ff53f371db495';
|
|
103
|
+
const [codec] = await create();
|
|
104
|
+
await codec.tag();
|
|
105
|
+
(0, vitest_1.expect)((0, index_js_1.hexEncode)(await codec.encode(data))).toEqual(msg1);
|
|
106
|
+
(0, vitest_1.expect)((0, index_js_1.hexEncode)(await codec.encode(data))).toEqual(msg2);
|
|
107
|
+
});
|
|
108
|
+
(0, vitest_1.it)('should correctly decrypt the underlying codec', async () => {
|
|
109
|
+
const msg1 = 'e8027df708ab3b5c';
|
|
110
|
+
const msg2 = '1854be76d2df4949';
|
|
111
|
+
const [codec] = await create();
|
|
112
|
+
await codec.tag();
|
|
113
|
+
const log = [];
|
|
114
|
+
codec.on('error', (e) => {
|
|
115
|
+
log.push(e.toString());
|
|
116
|
+
});
|
|
117
|
+
codec.feed((0, index_js_1.hexDecodeToBuffer)(msg1));
|
|
118
|
+
codec.feed((0, index_js_1.hexDecodeToBuffer)(msg2));
|
|
119
|
+
await vitest_1.vi.waitFor(() => (0, vitest_1.expect)(log).toEqual(['Error: Transport error: 404', 'Error: Transport error: 404']));
|
|
120
|
+
});
|
|
121
|
+
(0, vitest_1.it)('should correctly reset', async () => {
|
|
122
|
+
const inner = new intermediate_js_1.IntermediatePacketCodec();
|
|
123
|
+
const spyInnerReset = vitest_1.vi.spyOn(inner, 'reset');
|
|
124
|
+
const codec = new obfuscated_js_1.ObfuscatedPacketCodec(inner);
|
|
125
|
+
codec.setup(await (0, test_1.defaultTestCryptoProvider)(), new index_js_1.LogManager());
|
|
126
|
+
await codec.tag();
|
|
127
|
+
codec.reset();
|
|
128
|
+
(0, vitest_1.expect)(spyInnerReset).toHaveBeenCalledTimes(1);
|
|
129
|
+
});
|
|
130
|
+
});
|
|
131
|
+
//# sourceMappingURL=obfuscated.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"obfuscated.test.js","sourceRoot":"","sources":["../../../../src/network/transports/obfuscated.test.ts"],"names":[],"mappings":"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","sourcesContent":["import { describe, expect, it, vi } from 'vitest'\n\nimport { defaultTestCryptoProvider, u8HexDecode } from '@mtcute/test'\n\nimport { hexDecodeToBuffer, hexEncode, LogManager } from '../../utils/index.js'\nimport { IntermediatePacketCodec } from './intermediate.js'\nimport { MtProxyInfo, ObfuscatedPacketCodec } from './obfuscated.js'\n\ndescribe('ObfuscatedPacketCodec', () => {\n const create = async (randomSource?: string, proxy?: MtProxyInfo) => {\n const codec = new ObfuscatedPacketCodec(new IntermediatePacketCodec(), proxy)\n const crypto = await defaultTestCryptoProvider(randomSource)\n codec.setup(crypto, new LogManager())\n\n return [codec, crypto] as const\n }\n\n describe('tag', () => {\n it('should correctly generate random initial payload', async () => {\n const random = 'ff'.repeat(64)\n const [codec] = await create(random)\n\n const tag = await codec.tag()\n\n expect(hexEncode(tag)).toEqual(\n 'ff'.repeat(56) + 'fce8ab2203db2bff', // encrypted part\n )\n })\n\n describe('mtproxy', () => {\n it('should correctly generate random initial payload for prod dc', async () => {\n const random = 'ff'.repeat(64)\n const proxy: MtProxyInfo = {\n dcId: 1,\n secret: new Uint8Array(16),\n test: false,\n media: false,\n }\n const [codec] = await create(random, proxy)\n\n const tag = await codec.tag()\n\n expect(hexEncode(tag)).toEqual(\n 'ff'.repeat(56) + 'ecec4cbda8bb188b', // encrypted part with dcId = 1\n )\n })\n\n it('should correctly generate random initial payload for test dc', async () => {\n const random = 'ff'.repeat(64)\n const proxy: MtProxyInfo = {\n dcId: 1,\n secret: new Uint8Array(16),\n test: true,\n media: false,\n }\n const [codec] = await create(random, proxy)\n\n const tag = await codec.tag()\n\n expect(hexEncode(tag)).toEqual(\n 'ff'.repeat(56) + 'ecec4cbdb89c188b', // encrypted part with dcId = 10001\n )\n })\n\n it('should correctly generate random initial payload for media dc', async () => {\n const random = 'ff'.repeat(64)\n const proxy: MtProxyInfo = {\n dcId: 1,\n secret: new Uint8Array(16),\n test: false,\n media: true,\n }\n const [codec] = await create(random, proxy)\n\n const tag = await codec.tag()\n\n expect(hexEncode(tag)).toEqual(\n 'ff'.repeat(56) + 'ecec4cbd5644188b', // encrypted part with dcId = -1\n )\n })\n })\n\n it.each([\n ['ef'],\n ['48454144'],\n ['504f5354'],\n ['47455420'],\n ['4f505449'],\n ['dddddddd'],\n ['eeeeeeee'],\n ['16030102'],\n ])('should correctly retry for %s prefix', async (prefix) => {\n const random = prefix + 'ff'.repeat(64 - prefix.length / 2)\n const [codec] = await create(random)\n\n // generating random payload requires 64 bytes of entropy, so\n // if it asks for more, it means it tried to generate it again\n await expect(() => codec.tag()).rejects.toThrow('not enough entropy')\n })\n })\n\n it('should correctly create aes ctr', async () => {\n const [codec, crypto] = await create()\n\n const spyCreateAesCtr = vi.spyOn(crypto, 'createAesCtr')\n\n await codec.tag()\n\n expect(spyCreateAesCtr).toHaveBeenCalledTimes(2)\n expect(spyCreateAesCtr).toHaveBeenNthCalledWith(\n 1,\n u8HexDecode('10b6b4ad6d56ef5df9453f88e6ee6adb6e0544ba635dc6a8a990c9b8b980c343'),\n u8HexDecode('936b33fa7f97bae025102532233abb26'),\n true,\n )\n expect(spyCreateAesCtr).toHaveBeenNthCalledWith(\n 2,\n u8HexDecode('26bb3a2332251025e0ba977ffa336b9343c380b9b8c990a9a8c65d63ba44056e'),\n u8HexDecode('db6aeee6883f45f95def566dadb4b610'),\n false,\n )\n })\n\n it('should correctly create aes ctr for mtproxy', async () => {\n const proxy: MtProxyInfo = {\n dcId: 1,\n secret: hexDecodeToBuffer('00112233445566778899aabbccddeeff'),\n test: true,\n media: false,\n }\n const [codec, crypto] = await create(undefined, proxy)\n\n const spyCreateAesCtr = vi.spyOn(crypto, 'createAesCtr')\n\n await codec.tag()\n\n expect(spyCreateAesCtr).toHaveBeenCalledTimes(2)\n expect(spyCreateAesCtr).toHaveBeenNthCalledWith(\n 1,\n hexDecodeToBuffer('dd03188944590983e28dad14d97d0952389d118af4ffcbdb28d56a6a612ef7a6'),\n u8HexDecode('936b33fa7f97bae025102532233abb26'),\n true,\n )\n expect(spyCreateAesCtr).toHaveBeenNthCalledWith(\n 2,\n hexDecodeToBuffer('413b8e08021fbb08a2962b6d7187194fe46565c6b329d3bbdfcffd4870c16119'),\n u8HexDecode('db6aeee6883f45f95def566dadb4b610'),\n false,\n )\n })\n\n it('should correctly encrypt the underlying codec', async () => {\n const data = hexDecodeToBuffer('6cfeffff')\n const msg1 = 'a1020630a410e940'\n const msg2 = 'f53ff53f371db495'\n\n const [codec] = await create()\n\n await codec.tag()\n\n expect(hexEncode(await codec.encode(data))).toEqual(msg1)\n expect(hexEncode(await codec.encode(data))).toEqual(msg2)\n })\n\n it('should correctly decrypt the underlying codec', async () => {\n const msg1 = 'e8027df708ab3b5c'\n const msg2 = '1854be76d2df4949'\n\n const [codec] = await create()\n\n await codec.tag()\n\n const log: string[] = []\n\n codec.on('error', (e: Error) => {\n log.push(e.toString())\n })\n\n codec.feed(hexDecodeToBuffer(msg1))\n codec.feed(hexDecodeToBuffer(msg2))\n\n await vi.waitFor(() => expect(log).toEqual(['Error: Transport error: 404', 'Error: Transport error: 404']))\n })\n\n it('should correctly reset', async () => {\n const inner = new IntermediatePacketCodec()\n const spyInnerReset = vi.spyOn(inner, 'reset')\n\n const codec = new ObfuscatedPacketCodec(inner)\n codec.setup(await defaultTestCryptoProvider(), new LogManager())\n\n await codec.tag()\n\n codec.reset()\n\n expect(spyInnerReset).toHaveBeenCalledTimes(1)\n })\n})\n"]}
|
|
@@ -103,10 +103,10 @@ class BaseTcpTransport extends events_1.default {
|
|
|
103
103
|
.catch((err) => this.emit('error', err));
|
|
104
104
|
}
|
|
105
105
|
async send(bytes) {
|
|
106
|
+
const framed = await this._packetCodec.encode(bytes);
|
|
106
107
|
if (this._state !== abstract_js_1.TransportState.Ready) {
|
|
107
108
|
throw new errors_js_1.MtcuteError('Transport is not READY');
|
|
108
109
|
}
|
|
109
|
-
const framed = await this._packetCodec.encode(bytes);
|
|
110
110
|
return new Promise((resolve, reject) => {
|
|
111
111
|
this._socket.write(framed, (error) => {
|
|
112
112
|
if (error) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tcp.js","sourceRoot":"","sources":["../../../../src/network/transports/tcp.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"tcp.js","sourceRoot":"","sources":["../../../../src/network/transports/tcp.ts"],"names":[],"mappings":"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","sourcesContent":["import EventEmitter from 'events'\nimport { connect, Socket } from 'net'\n\nimport { tl } from '@mtcute/tl'\n\nimport { MtcuteError } from '../../types/errors.js'\nimport { ICryptoProvider, Logger } from '../../utils/index.js'\nimport { IPacketCodec, ITelegramTransport, TransportState } from './abstract.js'\nimport { IntermediatePacketCodec } from './intermediate.js'\n\n/**\n * Base for TCP transports.\n * Subclasses must provide packet codec in `_packetCodec` property\n */\nexport abstract class BaseTcpTransport extends EventEmitter implements ITelegramTransport {\n protected _currentDc: tl.RawDcOption | null = null\n protected _state: TransportState = TransportState.Idle\n protected _socket: Socket | null = null\n\n abstract _packetCodec: IPacketCodec\n protected _crypto!: ICryptoProvider\n protected log!: Logger\n\n packetCodecInitialized = false\n\n private _updateLogPrefix() {\n if (this._currentDc) {\n this.log.prefix = `[TCP:${this._currentDc.ipAddress}:${this._currentDc.port}] `\n } else {\n this.log.prefix = '[TCP:disconnected] '\n }\n }\n\n setup(crypto: ICryptoProvider, log: Logger): void {\n this._crypto = crypto\n this.log = log.create('tcp')\n this._updateLogPrefix()\n }\n\n state(): TransportState {\n return this._state\n }\n\n currentDc(): tl.RawDcOption | null {\n return this._currentDc\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n connect(dc: tl.RawDcOption, testMode: boolean): void {\n if (this._state !== TransportState.Idle) {\n throw new MtcuteError('Transport is not IDLE')\n }\n\n if (!this.packetCodecInitialized) {\n this._packetCodec.setup?.(this._crypto, this.log)\n this._packetCodec.on('error', (err) => this.emit('error', err))\n this._packetCodec.on('packet', (buf) => this.emit('message', buf))\n this.packetCodecInitialized = true\n }\n\n this._state = TransportState.Connecting\n this._currentDc = dc\n this._updateLogPrefix()\n\n this.log.debug('connecting to %j', dc)\n\n this._socket = connect(dc.port, dc.ipAddress, this.handleConnect.bind(this))\n\n this._socket.on('data', (data) => {\n this._packetCodec.feed(data)\n })\n this._socket.on('error', this.handleError.bind(this))\n this._socket.on('close', this.close.bind(this))\n }\n\n close(): void {\n if (this._state === TransportState.Idle) return\n this.log.info('connection closed')\n\n this.emit('close')\n this._state = TransportState.Idle\n this._socket!.removeAllListeners()\n this._socket!.destroy()\n this._socket = null\n this._currentDc = null\n this._packetCodec.reset()\n }\n\n handleError(error: Error): void {\n this.log.error('error: %s', error.stack)\n this.emit('error', error)\n }\n\n handleConnect(): void {\n this.log.info('connected')\n\n Promise.resolve(this._packetCodec.tag())\n .then((initialMessage) => {\n if (initialMessage.length) {\n this._socket!.write(initialMessage, (err) => {\n if (err) {\n this.log.error('failed to write initial message: %s', err.stack)\n this.emit('error')\n this.close()\n } else {\n this._state = TransportState.Ready\n this.emit('ready')\n }\n })\n } else {\n this._state = TransportState.Ready\n this.emit('ready')\n }\n })\n .catch((err) => this.emit('error', err))\n }\n\n async send(bytes: Uint8Array): Promise<void> {\n const framed = await this._packetCodec.encode(bytes)\n\n if (this._state !== TransportState.Ready) {\n throw new MtcuteError('Transport is not READY')\n }\n\n return new Promise((resolve, reject) => {\n this._socket!.write(framed, (error) => {\n if (error) {\n reject(error)\n } else {\n resolve()\n }\n })\n })\n }\n}\n\nexport class TcpTransport extends BaseTcpTransport {\n _packetCodec = new IntermediatePacketCodec()\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const vitest_1 = require("vitest");
|
|
4
|
+
const test_1 = require("@mtcute/test");
|
|
5
|
+
const index_js_1 = require("../../utils/index.js");
|
|
6
|
+
const abstract_js_1 = require("./abstract.js");
|
|
7
|
+
const tcp_js_1 = require("./tcp.js");
|
|
8
|
+
vitest_1.vi.mock('net', () => ({
|
|
9
|
+
connect: vitest_1.vi.fn().mockImplementation((port, ip, cb) => {
|
|
10
|
+
cb();
|
|
11
|
+
return {
|
|
12
|
+
on: vitest_1.vi.fn(),
|
|
13
|
+
write: vitest_1.vi.fn().mockImplementation((data, cb) => {
|
|
14
|
+
cb();
|
|
15
|
+
}),
|
|
16
|
+
end: vitest_1.vi.fn(),
|
|
17
|
+
removeAllListeners: vitest_1.vi.fn(),
|
|
18
|
+
destroy: vitest_1.vi.fn(),
|
|
19
|
+
};
|
|
20
|
+
}),
|
|
21
|
+
}));
|
|
22
|
+
(0, vitest_1.describe)('TcpTransport', async () => {
|
|
23
|
+
const net = await import('net');
|
|
24
|
+
const connect = vitest_1.vi.mocked(net.connect);
|
|
25
|
+
const getLastSocket = () => {
|
|
26
|
+
return connect.mock.results[connect.mock.results.length - 1].value;
|
|
27
|
+
};
|
|
28
|
+
const create = async () => {
|
|
29
|
+
const transport = new tcp_js_1.TcpTransport();
|
|
30
|
+
const logger = new index_js_1.LogManager();
|
|
31
|
+
logger.level = 0;
|
|
32
|
+
transport.setup(await (0, test_1.defaultTestCryptoProvider)(), logger);
|
|
33
|
+
return transport;
|
|
34
|
+
};
|
|
35
|
+
(0, vitest_1.it)('should initiate a tcp connection to the given dc', async () => {
|
|
36
|
+
const t = await create();
|
|
37
|
+
t.connect(index_js_1.defaultProductionDc.main, false);
|
|
38
|
+
(0, vitest_1.expect)(connect).toHaveBeenCalledOnce();
|
|
39
|
+
(0, vitest_1.expect)(connect).toHaveBeenCalledWith(index_js_1.defaultProductionDc.main.port, index_js_1.defaultProductionDc.main.ipAddress, vitest_1.expect.any(Function));
|
|
40
|
+
await vitest_1.vi.waitFor(() => (0, vitest_1.expect)(t.state()).toEqual(abstract_js_1.TransportState.Ready));
|
|
41
|
+
});
|
|
42
|
+
(0, vitest_1.it)('should set up event handlers', async () => {
|
|
43
|
+
const t = await create();
|
|
44
|
+
t.connect(index_js_1.defaultProductionDc.main, false);
|
|
45
|
+
const socket = getLastSocket();
|
|
46
|
+
(0, vitest_1.expect)(socket.on).toHaveBeenCalledTimes(3);
|
|
47
|
+
(0, vitest_1.expect)(socket.on).toHaveBeenCalledWith('data', vitest_1.expect.any(Function));
|
|
48
|
+
(0, vitest_1.expect)(socket.on).toHaveBeenCalledWith('error', vitest_1.expect.any(Function));
|
|
49
|
+
(0, vitest_1.expect)(socket.on).toHaveBeenCalledWith('close', vitest_1.expect.any(Function));
|
|
50
|
+
});
|
|
51
|
+
(0, vitest_1.it)('should write packet codec tag once connected', async () => {
|
|
52
|
+
const t = await create();
|
|
53
|
+
t.connect(index_js_1.defaultProductionDc.main, false);
|
|
54
|
+
const socket = getLastSocket();
|
|
55
|
+
await vitest_1.vi.waitFor(() => (0, vitest_1.expect)(socket.write).toHaveBeenCalledWith((0, test_1.u8HexDecode)('eeeeeeee'), // intermediate
|
|
56
|
+
vitest_1.expect.any(Function)));
|
|
57
|
+
});
|
|
58
|
+
(0, vitest_1.it)('should write to the underlying socket', async () => {
|
|
59
|
+
const t = await create();
|
|
60
|
+
t.connect(index_js_1.defaultProductionDc.main, false);
|
|
61
|
+
await vitest_1.vi.waitFor(() => (0, vitest_1.expect)(t.state()).toEqual(abstract_js_1.TransportState.Ready));
|
|
62
|
+
await t.send((0, index_js_1.hexDecodeToBuffer)('00010203040506070809'));
|
|
63
|
+
const socket = getLastSocket();
|
|
64
|
+
(0, vitest_1.expect)(socket.write).toHaveBeenCalledWith((0, test_1.u8HexDecode)('0a00000000010203040506070809'), vitest_1.expect.any(Function));
|
|
65
|
+
});
|
|
66
|
+
(0, vitest_1.it)('should correctly close', async () => {
|
|
67
|
+
const t = await create();
|
|
68
|
+
t.connect(index_js_1.defaultProductionDc.main, false);
|
|
69
|
+
await vitest_1.vi.waitFor(() => (0, vitest_1.expect)(t.state()).toEqual(abstract_js_1.TransportState.Ready));
|
|
70
|
+
t.close();
|
|
71
|
+
const socket = getLastSocket();
|
|
72
|
+
(0, vitest_1.expect)(socket.removeAllListeners).toHaveBeenCalledOnce();
|
|
73
|
+
(0, vitest_1.expect)(socket.destroy).toHaveBeenCalledOnce();
|
|
74
|
+
});
|
|
75
|
+
(0, vitest_1.it)('should feed data to the packet codec', async () => {
|
|
76
|
+
const t = await create();
|
|
77
|
+
const codec = t._packetCodec;
|
|
78
|
+
const spyFeed = vitest_1.vi.spyOn(codec, 'feed');
|
|
79
|
+
t.connect(index_js_1.defaultProductionDc.main, false);
|
|
80
|
+
await vitest_1.vi.waitFor(() => (0, vitest_1.expect)(t.state()).toEqual(abstract_js_1.TransportState.Ready));
|
|
81
|
+
const socket = getLastSocket();
|
|
82
|
+
const onDataCall = socket.on.mock.calls.find((c) => c[0] === 'data');
|
|
83
|
+
onDataCall[1]((0, test_1.u8HexDecode)('00010203040506070809'));
|
|
84
|
+
(0, vitest_1.expect)(spyFeed).toHaveBeenCalledWith((0, test_1.u8HexDecode)('00010203040506070809'));
|
|
85
|
+
});
|
|
86
|
+
(0, vitest_1.it)('should propagate errors', async () => {
|
|
87
|
+
const t = await create();
|
|
88
|
+
const spyEmit = vitest_1.vi.spyOn(t, 'emit').mockImplementation(() => true);
|
|
89
|
+
t.connect(index_js_1.defaultProductionDc.main, false);
|
|
90
|
+
await vitest_1.vi.waitFor(() => (0, vitest_1.expect)(t.state()).toEqual(abstract_js_1.TransportState.Ready));
|
|
91
|
+
const socket = getLastSocket();
|
|
92
|
+
const onErrorCall = socket.on.mock.calls.find((c) => c[0] === 'error');
|
|
93
|
+
onErrorCall[1](new Error('test error'));
|
|
94
|
+
(0, vitest_1.expect)(spyEmit).toHaveBeenCalledWith('error', new Error('test error'));
|
|
95
|
+
});
|
|
96
|
+
});
|
|
97
|
+
//# sourceMappingURL=tcp.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tcp.test.js","sourceRoot":"","sources":["../../../../src/network/transports/tcp.test.ts"],"names":[],"mappings":";;AACA,mCAA+D;AAE/D,uCAAqE;AAErE,mDAAyF;AACzF,+CAA8C;AAC9C,qCAAuC;AAEvC,WAAE,CAAC,IAAI,CAAC,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC;IAClB,OAAO,EAAE,WAAE,CAAC,EAAE,EAAE,CAAC,kBAAkB,CAAC,CAAC,IAAY,EAAE,EAAU,EAAE,EAAc,EAAE,EAAE;QAC7E,EAAE,EAAE,CAAA;QAEJ,OAAO;YACH,EAAE,EAAE,WAAE,CAAC,EAAE,EAAE;YACX,KAAK,EAAE,WAAE,CAAC,EAAE,EAAE,CAAC,kBAAkB,CAAC,CAAC,IAAgB,EAAE,EAAc,EAAE,EAAE;gBACnE,EAAE,EAAE,CAAA;YACR,CAAC,CAAC;YACF,GAAG,EAAE,WAAE,CAAC,EAAE,EAAE;YACZ,kBAAkB,EAAE,WAAE,CAAC,EAAE,EAAE;YAC3B,OAAO,EAAE,WAAE,CAAC,EAAE,EAAE;SACnB,CAAA;IACL,CAAC,CAAC;CACL,CAAC,CAAC,CAAA;AAEH,IAAA,iBAAQ,EAAC,cAAc,EAAE,KAAK,IAAI,EAAE;IAChC,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,KAAK,CAAC,CAAA;IAC/B,MAAM,OAAO,GAAG,WAAE,CAAC,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,CAAA;IAEtC,MAAM,aAAa,GAAG,GAAG,EAAE;QACvB,OAAO,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,KAA6B,CAAA;IAC9F,CAAC,CAAA;IAED,MAAM,MAAM,GAAG,KAAK,IAAI,EAAE;QACtB,MAAM,SAAS,GAAG,IAAI,qBAAY,EAAE,CAAA;QACpC,MAAM,MAAM,GAAG,IAAI,qBAAU,EAAE,CAAA;QAC/B,MAAM,CAAC,KAAK,GAAG,CAAC,CAAA;QAChB,SAAS,CAAC,KAAK,CAAC,MAAM,IAAA,gCAAyB,GAAE,EAAE,MAAM,CAAC,CAAA;QAE1D,OAAO,SAAS,CAAA;IACpB,CAAC,CAAA;IAED,IAAA,WAAE,EAAC,kDAAkD,EAAE,KAAK,IAAI,EAAE;QAC9D,MAAM,CAAC,GAAG,MAAM,MAAM,EAAE,CAAA;QAExB,CAAC,CAAC,OAAO,CAAC,8BAAmB,CAAC,IAAI,EAAE,KAAK,CAAC,CAAA;QAE1C,IAAA,eAAM,EAAC,OAAO,CAAC,CAAC,oBAAoB,EAAE,CAAA;QACtC,IAAA,eAAM,EAAC,OAAO,CAAC,CAAC,oBAAoB,CAChC,8BAAmB,CAAC,IAAI,CAAC,IAAI,EAC7B,8BAAmB,CAAC,IAAI,CAAC,SAAS,EAClC,eAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,CACvB,CAAA;QACD,MAAM,WAAE,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,IAAA,eAAM,EAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,OAAO,CAAC,4BAAc,CAAC,KAAK,CAAC,CAAC,CAAA;IAC3E,CAAC,CAAC,CAAA;IAEF,IAAA,WAAE,EAAC,8BAA8B,EAAE,KAAK,IAAI,EAAE;QAC1C,MAAM,CAAC,GAAG,MAAM,MAAM,EAAE,CAAA;QAExB,CAAC,CAAC,OAAO,CAAC,8BAAmB,CAAC,IAAI,EAAE,KAAK,CAAC,CAAA;QAE1C,MAAM,MAAM,GAAG,aAAa,EAAE,CAAA;QAE9B,IAAA,eAAM,EAAC,MAAM,CAAC,EAAE,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAA;QAC1C,IAAA,eAAM,EAAC,MAAM,CAAC,EAAE,CAAC,CAAC,oBAAoB,CAAC,MAAM,EAAE,eAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAA;QACpE,IAAA,eAAM,EAAC,MAAM,CAAC,EAAE,CAAC,CAAC,oBAAoB,CAAC,OAAO,EAAE,eAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAA;QACrE,IAAA,eAAM,EAAC,MAAM,CAAC,EAAE,CAAC,CAAC,oBAAoB,CAAC,OAAO,EAAE,eAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAA;IACzE,CAAC,CAAC,CAAA;IAEF,IAAA,WAAE,EAAC,8CAA8C,EAAE,KAAK,IAAI,EAAE;QAC1D,MAAM,CAAC,GAAG,MAAM,MAAM,EAAE,CAAA;QAExB,CAAC,CAAC,OAAO,CAAC,8BAAmB,CAAC,IAAI,EAAE,KAAK,CAAC,CAAA;QAE1C,MAAM,MAAM,GAAG,aAAa,EAAE,CAAA;QAE9B,MAAM,WAAE,CAAC,OAAO,CAAC,GAAG,EAAE,CAClB,IAAA,eAAM,EAAC,MAAM,CAAC,KAAK,CAAC,CAAC,oBAAoB,CACrC,IAAA,kBAAW,EAAC,UAAU,CAAC,EAAE,eAAe;QACxC,eAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,CACvB,CACJ,CAAA;IACL,CAAC,CAAC,CAAA;IAEF,IAAA,WAAE,EAAC,uCAAuC,EAAE,KAAK,IAAI,EAAE;QACnD,MAAM,CAAC,GAAG,MAAM,MAAM,EAAE,CAAA;QAExB,CAAC,CAAC,OAAO,CAAC,8BAAmB,CAAC,IAAI,EAAE,KAAK,CAAC,CAAA;QAC1C,MAAM,WAAE,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,IAAA,eAAM,EAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,OAAO,CAAC,4BAAc,CAAC,KAAK,CAAC,CAAC,CAAA;QAEvE,MAAM,CAAC,CAAC,IAAI,CAAC,IAAA,4BAAiB,EAAC,sBAAsB,CAAC,CAAC,CAAA;QAEvD,MAAM,MAAM,GAAG,aAAa,EAAE,CAAA;QAE9B,IAAA,eAAM,EAAC,MAAM,CAAC,KAAK,CAAC,CAAC,oBAAoB,CAAC,IAAA,kBAAW,EAAC,8BAA8B,CAAC,EAAE,eAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAA;IAChH,CAAC,CAAC,CAAA;IAEF,IAAA,WAAE,EAAC,wBAAwB,EAAE,KAAK,IAAI,EAAE;QACpC,MAAM,CAAC,GAAG,MAAM,MAAM,EAAE,CAAA;QAExB,CAAC,CAAC,OAAO,CAAC,8BAAmB,CAAC,IAAI,EAAE,KAAK,CAAC,CAAA;QAC1C,MAAM,WAAE,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,IAAA,eAAM,EAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,OAAO,CAAC,4BAAc,CAAC,KAAK,CAAC,CAAC,CAAA;QAEvE,CAAC,CAAC,KAAK,EAAE,CAAA;QAET,MAAM,MAAM,GAAG,aAAa,EAAE,CAAA;QAE9B,IAAA,eAAM,EAAC,MAAM,CAAC,kBAAkB,CAAC,CAAC,oBAAoB,EAAE,CAAA;QACxD,IAAA,eAAM,EAAC,MAAM,CAAC,OAAO,CAAC,CAAC,oBAAoB,EAAE,CAAA;IACjD,CAAC,CAAC,CAAA;IAEF,IAAA,WAAE,EAAC,sCAAsC,EAAE,KAAK,IAAI,EAAE;QAClD,MAAM,CAAC,GAAG,MAAM,MAAM,EAAE,CAAA;QACxB,MAAM,KAAK,GAAG,CAAC,CAAC,YAAY,CAAA;QAE5B,MAAM,OAAO,GAAG,WAAE,CAAC,KAAK,CAAC,KAAK,EAAE,MAAM,CAAC,CAAA;QAEvC,CAAC,CAAC,OAAO,CAAC,8BAAmB,CAAC,IAAI,EAAE,KAAK,CAAC,CAAA;QAC1C,MAAM,WAAE,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,IAAA,eAAM,EAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,OAAO,CAAC,4BAAc,CAAC,KAAK,CAAC,CAAC,CAAA;QAEvE,MAAM,MAAM,GAAG,aAAa,EAAE,CAAA;QAE9B,MAAM,UAAU,GAAG,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAE,CAAc,CAAC,CAAC,CAAC,KAAK,MAAM,CAGhF,CAAA;QACD,UAAU,CAAC,CAAC,CAAC,CAAC,IAAA,kBAAW,EAAC,sBAAsB,CAAC,CAAC,CAAA;QAElD,IAAA,eAAM,EAAC,OAAO,CAAC,CAAC,oBAAoB,CAAC,IAAA,kBAAW,EAAC,sBAAsB,CAAC,CAAC,CAAA;IAC7E,CAAC,CAAC,CAAA;IAEF,IAAA,WAAE,EAAC,yBAAyB,EAAE,KAAK,IAAI,EAAE;QACrC,MAAM,CAAC,GAAG,MAAM,MAAM,EAAE,CAAA;QAExB,MAAM,OAAO,GAAG,WAAE,CAAC,KAAK,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,kBAAkB,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAA;QAElE,CAAC,CAAC,OAAO,CAAC,8BAAmB,CAAC,IAAI,EAAE,KAAK,CAAC,CAAA;QAC1C,MAAM,WAAE,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,IAAA,eAAM,EAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,OAAO,CAAC,4BAAc,CAAC,KAAK,CAAC,CAAC,CAAA;QAEvE,MAAM,MAAM,GAAG,aAAa,EAAE,CAAA;QAE9B,MAAM,WAAW,GAAG,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAE,CAAc,CAAC,CAAC,CAAC,KAAK,OAAO,CAGlF,CAAA;QACD,WAAW,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,YAAY,CAAC,CAAC,CAAA;QAEvC,IAAA,eAAM,EAAC,OAAO,CAAC,CAAC,oBAAoB,CAAC,OAAO,EAAE,IAAI,KAAK,CAAC,YAAY,CAAC,CAAC,CAAA;IAC1E,CAAC,CAAC,CAAA;AACN,CAAC,CAAC,CAAA","sourcesContent":["import { Socket } from 'net'\nimport { describe, expect, it, MockedObject, vi } from 'vitest'\n\nimport { defaultTestCryptoProvider, u8HexDecode } from '@mtcute/test'\n\nimport { defaultProductionDc, hexDecodeToBuffer, LogManager } from '../../utils/index.js'\nimport { TransportState } from './abstract.js'\nimport { TcpTransport } from './tcp.js'\n\nvi.mock('net', () => ({\n connect: vi.fn().mockImplementation((port: number, ip: string, cb: () => void) => {\n cb()\n\n return {\n on: vi.fn(),\n write: vi.fn().mockImplementation((data: Uint8Array, cb: () => void) => {\n cb()\n }),\n end: vi.fn(),\n removeAllListeners: vi.fn(),\n destroy: vi.fn(),\n }\n }),\n}))\n\ndescribe('TcpTransport', async () => {\n const net = await import('net')\n const connect = vi.mocked(net.connect)\n\n const getLastSocket = () => {\n return connect.mock.results[connect.mock.results.length - 1].value as MockedObject<Socket>\n }\n\n const create = async () => {\n const transport = new TcpTransport()\n const logger = new LogManager()\n logger.level = 0\n transport.setup(await defaultTestCryptoProvider(), logger)\n\n return transport\n }\n\n it('should initiate a tcp connection to the given dc', async () => {\n const t = await create()\n\n t.connect(defaultProductionDc.main, false)\n\n expect(connect).toHaveBeenCalledOnce()\n expect(connect).toHaveBeenCalledWith(\n defaultProductionDc.main.port,\n defaultProductionDc.main.ipAddress,\n expect.any(Function),\n )\n await vi.waitFor(() => expect(t.state()).toEqual(TransportState.Ready))\n })\n\n it('should set up event handlers', async () => {\n const t = await create()\n\n t.connect(defaultProductionDc.main, false)\n\n const socket = getLastSocket()\n\n expect(socket.on).toHaveBeenCalledTimes(3)\n expect(socket.on).toHaveBeenCalledWith('data', expect.any(Function))\n expect(socket.on).toHaveBeenCalledWith('error', expect.any(Function))\n expect(socket.on).toHaveBeenCalledWith('close', expect.any(Function))\n })\n\n it('should write packet codec tag once connected', async () => {\n const t = await create()\n\n t.connect(defaultProductionDc.main, false)\n\n const socket = getLastSocket()\n\n await vi.waitFor(() =>\n expect(socket.write).toHaveBeenCalledWith(\n u8HexDecode('eeeeeeee'), // intermediate\n expect.any(Function),\n ),\n )\n })\n\n it('should write to the underlying socket', async () => {\n const t = await create()\n\n t.connect(defaultProductionDc.main, false)\n await vi.waitFor(() => expect(t.state()).toEqual(TransportState.Ready))\n\n await t.send(hexDecodeToBuffer('00010203040506070809'))\n\n const socket = getLastSocket()\n\n expect(socket.write).toHaveBeenCalledWith(u8HexDecode('0a00000000010203040506070809'), expect.any(Function))\n })\n\n it('should correctly close', async () => {\n const t = await create()\n\n t.connect(defaultProductionDc.main, false)\n await vi.waitFor(() => expect(t.state()).toEqual(TransportState.Ready))\n\n t.close()\n\n const socket = getLastSocket()\n\n expect(socket.removeAllListeners).toHaveBeenCalledOnce()\n expect(socket.destroy).toHaveBeenCalledOnce()\n })\n\n it('should feed data to the packet codec', async () => {\n const t = await create()\n const codec = t._packetCodec\n\n const spyFeed = vi.spyOn(codec, 'feed')\n\n t.connect(defaultProductionDc.main, false)\n await vi.waitFor(() => expect(t.state()).toEqual(TransportState.Ready))\n\n const socket = getLastSocket()\n\n const onDataCall = socket.on.mock.calls.find((c) => (c as string[])[0] === 'data') as unknown as [\n string,\n (data: Uint8Array) => void,\n ]\n onDataCall[1](u8HexDecode('00010203040506070809'))\n\n expect(spyFeed).toHaveBeenCalledWith(u8HexDecode('00010203040506070809'))\n })\n\n it('should propagate errors', async () => {\n const t = await create()\n\n const spyEmit = vi.spyOn(t, 'emit').mockImplementation(() => true)\n\n t.connect(defaultProductionDc.main, false)\n await vi.waitFor(() => expect(t.state()).toEqual(TransportState.Ready))\n\n const socket = getLastSocket()\n\n const onErrorCall = socket.on.mock.calls.find((c) => (c as string[])[0] === 'error') as unknown as [\n string,\n (error: Error) => void,\n ]\n onErrorCall[1](new Error('test error'))\n\n expect(spyEmit).toHaveBeenCalledWith('error', new Error('test error'))\n })\n})\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const vitest_1 = require("vitest");
|
|
4
|
+
const test_1 = require("@mtcute/test");
|
|
5
|
+
const index_js_1 = require("../../utils/index.js");
|
|
6
|
+
const abstract_js_1 = require("./abstract.js");
|
|
7
|
+
const websocket_js_1 = require("./websocket.js");
|
|
8
|
+
(0, vitest_1.describe)('WebSocketTransport', () => {
|
|
9
|
+
const create = async () => {
|
|
10
|
+
const fakeWs = vitest_1.vi.fn().mockImplementation(() => ({
|
|
11
|
+
addEventListener: vitest_1.vi.fn().mockImplementation((event, cb) => {
|
|
12
|
+
if (event === 'open') {
|
|
13
|
+
cb();
|
|
14
|
+
}
|
|
15
|
+
}),
|
|
16
|
+
removeEventListener: vitest_1.vi.fn(),
|
|
17
|
+
close: vitest_1.vi.fn(),
|
|
18
|
+
send: vitest_1.vi.fn(),
|
|
19
|
+
}));
|
|
20
|
+
const transport = new websocket_js_1.WebSocketTransport({ ws: fakeWs });
|
|
21
|
+
const logger = new index_js_1.LogManager();
|
|
22
|
+
logger.level = 0;
|
|
23
|
+
transport.setup(await (0, test_1.defaultTestCryptoProvider)(), logger);
|
|
24
|
+
return [transport, fakeWs];
|
|
25
|
+
};
|
|
26
|
+
const getLastSocket = (ws) => {
|
|
27
|
+
return ws.mock.results[ws.mock.results.length - 1].value;
|
|
28
|
+
};
|
|
29
|
+
(0, vitest_1.it)('should initiate a websocket connection to the given dc', async () => {
|
|
30
|
+
const [t, ws] = await create();
|
|
31
|
+
t.connect(index_js_1.defaultProductionDc.main, false);
|
|
32
|
+
(0, vitest_1.expect)(ws).toHaveBeenCalledOnce();
|
|
33
|
+
(0, vitest_1.expect)(ws).toHaveBeenCalledWith('wss://venus.web.telegram.org/apiws', 'binary');
|
|
34
|
+
await vitest_1.vi.waitFor(() => (0, vitest_1.expect)(t.state()).toEqual(abstract_js_1.TransportState.Ready));
|
|
35
|
+
});
|
|
36
|
+
(0, vitest_1.it)('should set up event handlers', async () => {
|
|
37
|
+
const [t, ws] = await create();
|
|
38
|
+
t.connect(index_js_1.defaultProductionDc.main, false);
|
|
39
|
+
const socket = getLastSocket(ws);
|
|
40
|
+
(0, vitest_1.expect)(socket.addEventListener).toHaveBeenCalledWith('message', vitest_1.expect.any(Function));
|
|
41
|
+
(0, vitest_1.expect)(socket.addEventListener).toHaveBeenCalledWith('error', vitest_1.expect.any(Function));
|
|
42
|
+
(0, vitest_1.expect)(socket.addEventListener).toHaveBeenCalledWith('close', vitest_1.expect.any(Function));
|
|
43
|
+
});
|
|
44
|
+
(0, vitest_1.it)('should write packet codec tag to the socket', async () => {
|
|
45
|
+
const [t, ws] = await create();
|
|
46
|
+
t.connect(index_js_1.defaultProductionDc.main, false);
|
|
47
|
+
const socket = getLastSocket(ws);
|
|
48
|
+
await vitest_1.vi.waitFor(() => (0, vitest_1.expect)(socket.send).toHaveBeenCalledWith((0, test_1.u8HexDecode)('29afd26df40fb8ed10b6b4ad6d56ef5df9453f88e6ee6adb6e0544ba635dc6a8a990c9b8b980c343936b33fa7f97bae025102532233abb26d4a1fe6d34f1ba08')));
|
|
49
|
+
});
|
|
50
|
+
(0, vitest_1.it)('should write to the underlying socket', async () => {
|
|
51
|
+
const [t, ws] = await create();
|
|
52
|
+
t.connect(index_js_1.defaultProductionDc.main, false);
|
|
53
|
+
const socket = getLastSocket(ws);
|
|
54
|
+
await vitest_1.vi.waitFor(() => (0, vitest_1.expect)(t.state()).toEqual(abstract_js_1.TransportState.Ready));
|
|
55
|
+
await t.send((0, index_js_1.hexDecodeToBuffer)('00010203040506070809'));
|
|
56
|
+
(0, vitest_1.expect)(socket.send).toHaveBeenCalledWith((0, index_js_1.hexDecodeToBuffer)('af020630c8ef14bcf53af33853ea'));
|
|
57
|
+
});
|
|
58
|
+
(0, vitest_1.it)('should correctly close', async () => {
|
|
59
|
+
const [t, ws] = await create();
|
|
60
|
+
t.connect(index_js_1.defaultProductionDc.main, false);
|
|
61
|
+
const socket = getLastSocket(ws);
|
|
62
|
+
await vitest_1.vi.waitFor(() => (0, vitest_1.expect)(t.state()).toEqual(abstract_js_1.TransportState.Ready));
|
|
63
|
+
t.close();
|
|
64
|
+
(0, vitest_1.expect)(socket.removeEventListener).toHaveBeenCalled();
|
|
65
|
+
(0, vitest_1.expect)(socket.close).toHaveBeenCalled();
|
|
66
|
+
});
|
|
67
|
+
(0, vitest_1.it)('should correctly handle incoming messages', async () => {
|
|
68
|
+
const [t, ws] = await create();
|
|
69
|
+
const feedSpy = vitest_1.vi.spyOn(t._packetCodec, 'feed');
|
|
70
|
+
t.connect(index_js_1.defaultProductionDc.main, false);
|
|
71
|
+
const socket = getLastSocket(ws);
|
|
72
|
+
await vitest_1.vi.waitFor(() => (0, vitest_1.expect)(t.state()).toEqual(abstract_js_1.TransportState.Ready));
|
|
73
|
+
const data = (0, index_js_1.hexDecodeToBuffer)('00010203040506070809');
|
|
74
|
+
const message = new MessageEvent('message', { data });
|
|
75
|
+
const onMessageCall = socket.addEventListener.mock.calls.find(([event]) => event === 'message');
|
|
76
|
+
onMessageCall[1](message);
|
|
77
|
+
(0, vitest_1.expect)(feedSpy).toHaveBeenCalledWith((0, test_1.u8HexDecode)('00010203040506070809'));
|
|
78
|
+
});
|
|
79
|
+
(0, vitest_1.it)('should propagate errors', async () => {
|
|
80
|
+
const [t, ws] = await create();
|
|
81
|
+
const spyEmit = vitest_1.vi.spyOn(t, 'emit').mockImplementation(() => true);
|
|
82
|
+
t.connect(index_js_1.defaultProductionDc.main, false);
|
|
83
|
+
const socket = getLastSocket(ws);
|
|
84
|
+
await vitest_1.vi.waitFor(() => (0, vitest_1.expect)(t.state()).toEqual(abstract_js_1.TransportState.Ready));
|
|
85
|
+
const error = new Error('test');
|
|
86
|
+
const onErrorCall = socket.addEventListener.mock.calls.find(([event]) => event === 'error');
|
|
87
|
+
onErrorCall[1]({ error });
|
|
88
|
+
(0, vitest_1.expect)(spyEmit).toHaveBeenCalledWith('error', error);
|
|
89
|
+
});
|
|
90
|
+
});
|
|
91
|
+
//# sourceMappingURL=websocket.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"websocket.test.js","sourceRoot":"","sources":["../../../../src/network/transports/websocket.test.ts"],"names":[],"mappings":"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","sourcesContent":["import { describe, expect, it, Mock, MockedObject, vi } from 'vitest'\n\nimport { defaultTestCryptoProvider, u8HexDecode } from '@mtcute/test'\n\nimport { defaultProductionDc, hexDecodeToBuffer, LogManager } from '../../utils/index.js'\nimport { TransportState } from './abstract.js'\nimport { WebSocketTransport } from './websocket.js'\n\ndescribe('WebSocketTransport', () => {\n const create = async () => {\n const fakeWs = vi.fn().mockImplementation(() => ({\n addEventListener: vi.fn().mockImplementation((event: string, cb: () => void) => {\n if (event === 'open') {\n cb()\n }\n }),\n removeEventListener: vi.fn(),\n close: vi.fn(),\n send: vi.fn(),\n }))\n\n const transport = new WebSocketTransport({ ws: fakeWs })\n const logger = new LogManager()\n logger.level = 0\n transport.setup(await defaultTestCryptoProvider(), logger)\n\n return [transport, fakeWs] as const\n }\n\n const getLastSocket = (ws: Mock) => {\n return ws.mock.results[ws.mock.results.length - 1].value as MockedObject<WebSocket>\n }\n\n it('should initiate a websocket connection to the given dc', async () => {\n const [t, ws] = await create()\n\n t.connect(defaultProductionDc.main, false)\n\n expect(ws).toHaveBeenCalledOnce()\n expect(ws).toHaveBeenCalledWith('wss://venus.web.telegram.org/apiws', 'binary')\n await vi.waitFor(() => expect(t.state()).toEqual(TransportState.Ready))\n })\n\n it('should set up event handlers', async () => {\n const [t, ws] = await create()\n\n t.connect(defaultProductionDc.main, false)\n const socket = getLastSocket(ws)\n\n expect(socket.addEventListener).toHaveBeenCalledWith('message', expect.any(Function))\n expect(socket.addEventListener).toHaveBeenCalledWith('error', expect.any(Function))\n expect(socket.addEventListener).toHaveBeenCalledWith('close', expect.any(Function))\n })\n\n it('should write packet codec tag to the socket', async () => {\n const [t, ws] = await create()\n\n t.connect(defaultProductionDc.main, false)\n const socket = getLastSocket(ws)\n\n await vi.waitFor(() =>\n expect(socket.send).toHaveBeenCalledWith(\n u8HexDecode(\n '29afd26df40fb8ed10b6b4ad6d56ef5df9453f88e6ee6adb6e0544ba635dc6a8a990c9b8b980c343936b33fa7f97bae025102532233abb26d4a1fe6d34f1ba08',\n ),\n ),\n )\n })\n\n it('should write to the underlying socket', async () => {\n const [t, ws] = await create()\n\n t.connect(defaultProductionDc.main, false)\n const socket = getLastSocket(ws)\n await vi.waitFor(() => expect(t.state()).toEqual(TransportState.Ready))\n\n await t.send(hexDecodeToBuffer('00010203040506070809'))\n\n expect(socket.send).toHaveBeenCalledWith(hexDecodeToBuffer('af020630c8ef14bcf53af33853ea'))\n })\n\n it('should correctly close', async () => {\n const [t, ws] = await create()\n\n t.connect(defaultProductionDc.main, false)\n const socket = getLastSocket(ws)\n await vi.waitFor(() => expect(t.state()).toEqual(TransportState.Ready))\n\n t.close()\n\n expect(socket.removeEventListener).toHaveBeenCalled()\n expect(socket.close).toHaveBeenCalled()\n })\n\n it('should correctly handle incoming messages', async () => {\n const [t, ws] = await create()\n\n const feedSpy = vi.spyOn(t._packetCodec, 'feed')\n\n t.connect(defaultProductionDc.main, false)\n const socket = getLastSocket(ws)\n await vi.waitFor(() => expect(t.state()).toEqual(TransportState.Ready))\n\n const data = hexDecodeToBuffer('00010203040506070809')\n const message = new MessageEvent('message', { data })\n\n const onMessageCall = socket.addEventListener.mock.calls.find(([event]) => event === 'message') as unknown as [\n string,\n (evt: MessageEvent) => void,\n ]\n onMessageCall[1](message)\n\n expect(feedSpy).toHaveBeenCalledWith(u8HexDecode('00010203040506070809'))\n })\n\n it('should propagate errors', async () => {\n const [t, ws] = await create()\n\n const spyEmit = vi.spyOn(t, 'emit').mockImplementation(() => true)\n\n t.connect(defaultProductionDc.main, false)\n const socket = getLastSocket(ws)\n await vi.waitFor(() => expect(t.state()).toEqual(TransportState.Ready))\n\n const error = new Error('test')\n const onErrorCall = socket.addEventListener.mock.calls.find(([event]) => event === 'error') as unknown as [\n string,\n (evt: { error: Error }) => void,\n ]\n onErrorCall[1]({ error })\n\n expect(spyEmit).toHaveBeenCalledWith('error', error)\n })\n})\n"]}
|