@mtcute/core 0.1.0 → 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/base-client.js +4 -1
- package/cjs/base-client.js.map +1 -1
- package/cjs/network/auth-key.d.ts +3 -3
- package/cjs/network/auth-key.js +12 -12
- package/cjs/network/auth-key.js.map +1 -1
- 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/authorization.js +62 -57
- package/cjs/network/authorization.js.map +1 -1
- 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/mtproto-session.d.ts +2 -2
- package/cjs/network/mtproto-session.js +2 -2
- package/cjs/network/mtproto-session.js.map +1 -1
- package/cjs/network/multi-session-connection.d.ts +1 -1
- package/cjs/network/multi-session-connection.js +2 -2
- package/cjs/network/multi-session-connection.js.map +1 -1
- package/cjs/network/network-manager.d.ts +1 -0
- package/cjs/network/network-manager.js +21 -27
- package/cjs/network/network-manager.js.map +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.d.ts +2 -1
- package/cjs/network/session-connection.js +51 -37
- package/cjs/network/session-connection.js.map +1 -1
- package/cjs/network/transports/intermediate.d.ts +3 -0
- package/cjs/network/transports/intermediate.js +5 -3
- package/cjs/network/transports/intermediate.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 +15 -19
- 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/abstract.d.ts +23 -2
- package/cjs/storage/abstract.js.map +1 -1
- package/cjs/storage/json.js +8 -9
- package/cjs/storage/json.js.map +1 -1
- 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.js +5 -2
- package/cjs/storage/localstorage.js.map +1 -1
- 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.d.ts +7 -8
- package/cjs/storage/memory.js +7 -7
- package/cjs/storage/memory.js.map +1 -1
- 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.d.ts +18 -11
- package/cjs/utils/bigint-utils.js +148 -47
- package/cjs/utils/bigint-utils.js.map +1 -1
- 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.d.ts +7 -1
- package/cjs/utils/buffer-utils.js +16 -3
- package/cjs/utils/buffer-utils.js.map +1 -1
- 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/abstract.d.ts +16 -9
- package/cjs/utils/crypto/abstract.js +6 -9
- package/cjs/utils/crypto/abstract.js.map +1 -1
- package/cjs/utils/crypto/factorization.d.ts +2 -1
- package/cjs/utils/crypto/factorization.js +28 -36
- package/cjs/utils/crypto/factorization.js.map +1 -1
- package/cjs/utils/crypto/index.d.ts +4 -0
- package/cjs/utils/crypto/index.js +4 -0
- package/cjs/utils/crypto/index.js.map +1 -1
- package/cjs/utils/crypto/keys.d.ts +2 -2
- package/cjs/utils/crypto/keys.js +4 -4
- package/cjs/utils/crypto/keys.js.map +1 -1
- 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.d.ts +2 -2
- package/cjs/utils/crypto/miller-rabin.js +20 -22
- package/cjs/utils/crypto/miller-rabin.js.map +1 -1
- 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.d.ts +3 -3
- package/cjs/utils/crypto/mtproto.js +12 -12
- package/cjs/utils/crypto/mtproto.js.map +1 -1
- 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.d.ts +21 -0
- package/cjs/utils/crypto/node.js +74 -0
- package/cjs/utils/crypto/node.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.js +22 -33
- package/cjs/utils/crypto/password.js.map +1 -1
- 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/wasm.d.ts +22 -0
- package/cjs/utils/crypto/wasm.js +41 -0
- package/cjs/utils/crypto/wasm.js.map +1 -0
- package/cjs/utils/crypto/web.d.ts +11 -0
- package/cjs/utils/crypto/web.js +40 -0
- package/cjs/utils/crypto/web.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.d.ts +1 -1
- package/cjs/utils/deque.js +9 -3
- package/cjs/utils/deque.js.map +1 -1
- 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.d.ts +4 -1
- package/cjs/utils/function-utils.js +8 -1
- package/cjs/utils/function-utils.js.map +1 -1
- 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/index.d.ts +0 -1
- package/cjs/utils/index.js +0 -1
- package/cjs/utils/index.js.map +1 -1
- 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.d.ts +0 -1
- package/cjs/utils/logger.js +3 -4
- package/cjs/utils/logger.js.map +1 -1
- 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.d.ts +1 -0
- package/cjs/utils/lru-map.js +6 -0
- package/cjs/utils/lru-map.js.map +1 -1
- 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.js +5 -1
- package/cjs/utils/peer-utils.js.map +1 -1
- 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/platform/crypto.js +2 -2
- package/cjs/utils/platform/crypto.js.map +1 -1
- package/cjs/utils/platform/crypto.web.js +2 -2
- package/cjs/utils/platform/crypto.web.js.map +1 -1
- 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.js +4 -2
- package/cjs/utils/string-session.js.map +1 -1
- 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/base-client.js +4 -1
- package/esm/base-client.js.map +1 -1
- package/esm/network/auth-key.d.ts +3 -3
- package/esm/network/auth-key.js +13 -13
- package/esm/network/auth-key.js.map +1 -1
- 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/authorization.js +64 -59
- package/esm/network/authorization.js.map +1 -1
- 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/mtproto-session.d.ts +2 -2
- package/esm/network/mtproto-session.js +2 -2
- package/esm/network/mtproto-session.js.map +1 -1
- package/esm/network/multi-session-connection.d.ts +1 -1
- package/esm/network/multi-session-connection.js +2 -2
- package/esm/network/multi-session-connection.js.map +1 -1
- package/esm/network/network-manager.d.ts +1 -0
- package/esm/network/network-manager.js +21 -27
- package/esm/network/network-manager.js.map +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.d.ts +2 -1
- package/esm/network/session-connection.js +53 -39
- package/esm/network/session-connection.js.map +1 -1
- package/esm/network/transports/intermediate.d.ts +3 -0
- package/esm/network/transports/intermediate.js +6 -4
- package/esm/network/transports/intermediate.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 +16 -20
- 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/abstract.d.ts +23 -2
- package/esm/storage/abstract.js.map +1 -1
- package/esm/storage/json.js +8 -9
- package/esm/storage/json.js.map +1 -1
- 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.js +5 -2
- package/esm/storage/localstorage.js.map +1 -1
- 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.d.ts +7 -8
- package/esm/storage/memory.js +7 -7
- package/esm/storage/memory.js.map +1 -1
- 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.d.ts +18 -11
- package/esm/utils/bigint-utils.js +142 -44
- package/esm/utils/bigint-utils.js.map +1 -1
- 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.d.ts +7 -1
- package/esm/utils/buffer-utils.js +14 -1
- package/esm/utils/buffer-utils.js.map +1 -1
- 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/abstract.d.ts +16 -9
- package/esm/utils/crypto/abstract.js +6 -9
- package/esm/utils/crypto/abstract.js.map +1 -1
- package/esm/utils/crypto/factorization.d.ts +2 -1
- package/esm/utils/crypto/factorization.js +29 -34
- package/esm/utils/crypto/factorization.js.map +1 -1
- package/esm/utils/crypto/index.d.ts +4 -0
- package/esm/utils/crypto/index.js +4 -0
- package/esm/utils/crypto/index.js.map +1 -1
- package/esm/utils/crypto/keys.d.ts +2 -2
- package/esm/utils/crypto/keys.js +4 -4
- package/esm/utils/crypto/keys.js.map +1 -1
- 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.d.ts +2 -2
- package/esm/utils/crypto/miller-rabin.js +21 -20
- package/esm/utils/crypto/miller-rabin.js.map +1 -1
- 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.d.ts +3 -3
- package/esm/utils/crypto/mtproto.js +12 -12
- package/esm/utils/crypto/mtproto.js.map +1 -1
- 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.d.ts +21 -0
- package/esm/utils/crypto/node.js +69 -0
- package/esm/utils/crypto/node.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.js +24 -32
- package/esm/utils/crypto/password.js.map +1 -1
- 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/wasm.d.ts +22 -0
- package/esm/utils/crypto/wasm.js +37 -0
- package/esm/utils/crypto/wasm.js.map +1 -0
- package/esm/utils/crypto/web.d.ts +11 -0
- package/esm/utils/crypto/web.js +36 -0
- package/esm/utils/crypto/web.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.d.ts +1 -1
- package/esm/utils/deque.js +9 -3
- package/esm/utils/deque.js.map +1 -1
- 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.d.ts +4 -1
- package/esm/utils/function-utils.js +8 -1
- package/esm/utils/function-utils.js.map +1 -1
- 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/index.d.ts +0 -1
- package/esm/utils/index.js +0 -1
- package/esm/utils/index.js.map +1 -1
- 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.d.ts +0 -1
- package/esm/utils/logger.js +3 -4
- package/esm/utils/logger.js.map +1 -1
- 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.d.ts +1 -0
- package/esm/utils/lru-map.js +6 -0
- package/esm/utils/lru-map.js.map +1 -1
- 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.js +5 -1
- package/esm/utils/peer-utils.js.map +1 -1
- 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/platform/crypto.js +1 -1
- package/esm/utils/platform/crypto.js.map +1 -1
- package/esm/utils/platform/crypto.web.js +2 -2
- package/esm/utils/platform/crypto.web.js.map +1 -1
- 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.js +4 -2
- package/esm/utils/string-session.js.map +1 -1
- 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 +4 -5
- package/cjs/utils/crypto/common.d.ts +0 -12
- package/cjs/utils/crypto/common.js +0 -54
- package/cjs/utils/crypto/common.js.map +0 -1
- package/cjs/utils/crypto/node-crypto.d.ts +0 -10
- package/cjs/utils/crypto/node-crypto.js +0 -46
- package/cjs/utils/crypto/node-crypto.js.map +0 -1
- package/cjs/utils/crypto/subtle.d.ts +0 -12
- package/cjs/utils/crypto/subtle.js +0 -86
- package/cjs/utils/crypto/subtle.js.map +0 -1
- package/cjs/utils/flood-control.d.ts +0 -14
- package/cjs/utils/flood-control.js +0 -65
- package/cjs/utils/flood-control.js.map +0 -1
- package/cjs/utils/platform/random.d.ts +0 -1
- package/cjs/utils/platform/random.js +0 -7
- package/cjs/utils/platform/random.js.map +0 -1
- package/cjs/utils/platform/random.web.d.ts +0 -1
- package/cjs/utils/platform/random.web.js +0 -10
- package/cjs/utils/platform/random.web.js.map +0 -1
- package/esm/utils/crypto/common.d.ts +0 -12
- package/esm/utils/crypto/common.js +0 -50
- package/esm/utils/crypto/common.js.map +0 -1
- package/esm/utils/crypto/node-crypto.d.ts +0 -10
- package/esm/utils/crypto/node-crypto.js +0 -42
- package/esm/utils/crypto/node-crypto.js.map +0 -1
- package/esm/utils/crypto/subtle.d.ts +0 -12
- package/esm/utils/crypto/subtle.js +0 -59
- package/esm/utils/crypto/subtle.js.map +0 -1
- package/esm/utils/flood-control.d.ts +0 -14
- package/esm/utils/flood-control.js +0 -61
- package/esm/utils/flood-control.js.map +0 -1
- package/esm/utils/platform/random.d.ts +0 -1
- package/esm/utils/platform/random.js +0 -4
- package/esm/utils/platform/random.js.map +0 -1
- package/esm/utils/platform/random.web.d.ts +0 -1
- package/esm/utils/platform/random.web.js +0 -6
- package/esm/utils/platform/random.web.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"intermediate.js","sourceRoot":"","sources":["../../../../src/network/transports/intermediate.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,
|
|
1
|
+
{"version":3,"file":"intermediate.js","sourceRoot":"","sources":["../../../../src/network/transports/intermediate.ts"],"names":[],"mappings":"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","sourcesContent":["import { dataViewFromBuffer, getRandomInt, ICryptoProvider } from '../../utils/index.js'\nimport { IPacketCodec, TransportError } from './abstract.js'\nimport { StreamedCodec } from './streamed.js'\n\nconst TAG = new Uint8Array([0xee, 0xee, 0xee, 0xee])\nconst PADDED_TAG = new Uint8Array([0xdd, 0xdd, 0xdd, 0xdd])\n\n/**\n * Intermediate packet codec.\n * See https://core.telegram.org/mtproto/mtproto-transports#intermediate\n */\nexport class IntermediatePacketCodec extends StreamedCodec implements IPacketCodec {\n tag(): Uint8Array {\n return TAG\n }\n\n encode(packet: Uint8Array): Uint8Array {\n const ret = new Uint8Array(packet.length + 4)\n const dv = dataViewFromBuffer(ret)\n dv.setUint32(0, packet.length, true)\n ret.set(packet, 4)\n\n return ret\n }\n\n protected _packetAvailable(): boolean {\n return this._stream.length >= 8\n }\n\n protected _handlePacket(): boolean {\n const dv = dataViewFromBuffer(this._stream)\n const payloadLength = dv.getUint32(0, true)\n\n if (payloadLength <= this._stream.length - 4) {\n if (payloadLength === 4) {\n const code = dv.getInt32(4, true) * -1\n this.emit('error', new TransportError(code))\n } else {\n const payload = this._stream.subarray(4, payloadLength + 4)\n this.emit('packet', payload)\n }\n\n this._stream = this._stream.subarray(payloadLength + 4)\n\n return true\n }\n\n return false\n }\n}\n\n/**\n * Padded intermediate packet codec.\n * See https://core.telegram.org/mtproto/mtproto-transports#padded-intermediate\n */\nexport class PaddedIntermediatePacketCodec extends IntermediatePacketCodec {\n tag(): Uint8Array {\n return PADDED_TAG\n }\n\n private _crypto!: ICryptoProvider\n setup?(crypto: ICryptoProvider) {\n this._crypto = crypto\n }\n\n encode(packet: Uint8Array): Uint8Array {\n // padding size, 0-15\n const padSize = getRandomInt(16)\n\n const ret = new Uint8Array(packet.length + 4 + padSize)\n const dv = dataViewFromBuffer(ret)\n dv.setUint32(0, packet.length + padSize, true)\n ret.set(packet, 4)\n this._crypto.randomFill(ret.subarray(4 + packet.length))\n\n return ret\n }\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import { describe, expect, it } from 'vitest';
|
|
2
|
+
import { defaultTestCryptoProvider, useFakeMathRandom } from '@mtcute/test';
|
|
3
|
+
import { hexDecodeToBuffer, hexEncode } from '@mtcute/tl-runtime';
|
|
4
|
+
import { IntermediatePacketCodec, PaddedIntermediatePacketCodec, TransportError } from '../../index.js';
|
|
5
|
+
import { concatBuffers } from '../../utils/index.js';
|
|
6
|
+
describe('IntermediatePacketCodec', () => {
|
|
7
|
+
it('should return correct tag', () => {
|
|
8
|
+
expect(hexEncode(new IntermediatePacketCodec().tag())).eq('eeeeeeee');
|
|
9
|
+
});
|
|
10
|
+
it('should correctly parse immediate framing', () => new Promise((done) => {
|
|
11
|
+
const codec = new IntermediatePacketCodec();
|
|
12
|
+
codec.on('packet', (data) => {
|
|
13
|
+
expect([...data]).eql([5, 1, 2, 3, 4]);
|
|
14
|
+
done();
|
|
15
|
+
});
|
|
16
|
+
codec.feed(hexDecodeToBuffer('050000000501020304'));
|
|
17
|
+
}));
|
|
18
|
+
it('should correctly parse incomplete framing', () => new Promise((done) => {
|
|
19
|
+
const codec = new IntermediatePacketCodec();
|
|
20
|
+
codec.on('packet', (data) => {
|
|
21
|
+
expect([...data]).eql([5, 1, 2, 3, 4]);
|
|
22
|
+
done();
|
|
23
|
+
});
|
|
24
|
+
codec.feed(hexDecodeToBuffer('050000000501'));
|
|
25
|
+
codec.feed(hexDecodeToBuffer('020304'));
|
|
26
|
+
}));
|
|
27
|
+
it('should correctly parse multiple streamed packets', () => new Promise((done) => {
|
|
28
|
+
const codec = new IntermediatePacketCodec();
|
|
29
|
+
let number = 0;
|
|
30
|
+
codec.on('packet', (data) => {
|
|
31
|
+
if (number === 0) {
|
|
32
|
+
expect([...data]).eql([5, 1, 2, 3, 4]);
|
|
33
|
+
number = 1;
|
|
34
|
+
}
|
|
35
|
+
else {
|
|
36
|
+
expect([...data]).eql([3, 1, 2, 3, 1]);
|
|
37
|
+
done();
|
|
38
|
+
}
|
|
39
|
+
});
|
|
40
|
+
codec.feed(hexDecodeToBuffer('050000000501'));
|
|
41
|
+
codec.feed(hexDecodeToBuffer('020304050000'));
|
|
42
|
+
codec.feed(hexDecodeToBuffer('000301020301'));
|
|
43
|
+
}));
|
|
44
|
+
it('should correctly parse transport errors', () => new Promise((done) => {
|
|
45
|
+
const codec = new IntermediatePacketCodec();
|
|
46
|
+
codec.on('error', (err) => {
|
|
47
|
+
expect(err).to.have.instanceOf(TransportError);
|
|
48
|
+
expect(err.code).eq(404);
|
|
49
|
+
done();
|
|
50
|
+
});
|
|
51
|
+
codec.feed(hexDecodeToBuffer('040000006cfeffff'));
|
|
52
|
+
}));
|
|
53
|
+
it('should reset when called reset()', () => new Promise((done) => {
|
|
54
|
+
const codec = new IntermediatePacketCodec();
|
|
55
|
+
codec.on('packet', (data) => {
|
|
56
|
+
expect([...data]).eql([1, 2, 3, 4, 5]);
|
|
57
|
+
done();
|
|
58
|
+
});
|
|
59
|
+
codec.feed(hexDecodeToBuffer('ff0000001234567812345678'));
|
|
60
|
+
codec.reset();
|
|
61
|
+
codec.feed(hexDecodeToBuffer('050000000102030405'));
|
|
62
|
+
}));
|
|
63
|
+
it('should correctly frame packets', () => {
|
|
64
|
+
const data = hexDecodeToBuffer('6cfeffff');
|
|
65
|
+
// eslint-disable-next-line no-restricted-globals
|
|
66
|
+
expect(Buffer.from(new IntermediatePacketCodec().encode(data))).toEqual(concatBuffers([new Uint8Array([0x04, 0x00, 0x00, 0x00]), data]));
|
|
67
|
+
});
|
|
68
|
+
});
|
|
69
|
+
describe('PaddedIntermediatePacketCodec', () => {
|
|
70
|
+
useFakeMathRandom();
|
|
71
|
+
const create = async () => {
|
|
72
|
+
const codec = new PaddedIntermediatePacketCodec();
|
|
73
|
+
codec.setup(await defaultTestCryptoProvider());
|
|
74
|
+
return codec;
|
|
75
|
+
};
|
|
76
|
+
it('should return correct tag', async () => {
|
|
77
|
+
expect(hexEncode((await create()).tag())).eq('dddddddd');
|
|
78
|
+
});
|
|
79
|
+
it('should correctly frame packets', async () => {
|
|
80
|
+
const data = hexDecodeToBuffer('6cfeffff');
|
|
81
|
+
expect(hexEncode((await create()).encode(data))).toEqual('0a0000006cfeffff29afd26df40f');
|
|
82
|
+
});
|
|
83
|
+
});
|
|
84
|
+
//# 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"]}
|
|
@@ -1,5 +1,4 @@
|
|
|
1
|
-
import { concatBuffers, dataViewFromBuffer } from '../../utils/buffer-utils.js';
|
|
2
|
-
import { randomBytes } from '../../utils/index.js';
|
|
1
|
+
import { bufferToReversed, concatBuffers, dataViewFromBuffer } from '../../utils/buffer-utils.js';
|
|
3
2
|
import { WrappedCodec } from './wrapped.js';
|
|
4
3
|
export class ObfuscatedPacketCodec extends WrappedCodec {
|
|
5
4
|
constructor(inner, proxy) {
|
|
@@ -10,11 +9,11 @@ export class ObfuscatedPacketCodec extends WrappedCodec {
|
|
|
10
9
|
let random;
|
|
11
10
|
let dv;
|
|
12
11
|
for (;;) {
|
|
13
|
-
random = randomBytes(64);
|
|
12
|
+
random = this._crypto.randomBytes(64);
|
|
14
13
|
if (random[0] === 0xef)
|
|
15
14
|
continue;
|
|
16
15
|
dv = dataViewFromBuffer(random);
|
|
17
|
-
const firstInt = dv.
|
|
16
|
+
const firstInt = dv.getUint32(0, true);
|
|
18
17
|
if (firstInt === 0x44414548 || // HEAD
|
|
19
18
|
firstInt === 0x54534f50 || // POST
|
|
20
19
|
firstInt === 0x20544547 || // GET(space)
|
|
@@ -43,37 +42,34 @@ export class ObfuscatedPacketCodec extends WrappedCodec {
|
|
|
43
42
|
dcId = -dcId;
|
|
44
43
|
dv.setInt16(60, dcId, true);
|
|
45
44
|
}
|
|
46
|
-
|
|
47
|
-
const randomRev = Uint8Array.prototype.slice.call(random, 8, 56).reverse();
|
|
45
|
+
const randomRev = bufferToReversed(random, 8, 56);
|
|
48
46
|
let encryptKey = random.subarray(8, 40);
|
|
49
47
|
const encryptIv = random.subarray(40, 56);
|
|
50
48
|
let decryptKey = randomRev.subarray(0, 32);
|
|
51
49
|
const decryptIv = randomRev.subarray(32, 48);
|
|
52
50
|
if (this._proxy) {
|
|
53
|
-
encryptKey =
|
|
54
|
-
decryptKey =
|
|
51
|
+
encryptKey = this._crypto.sha256(concatBuffers([encryptKey, this._proxy.secret]));
|
|
52
|
+
decryptKey = this._crypto.sha256(concatBuffers([decryptKey, this._proxy.secret]));
|
|
55
53
|
}
|
|
56
|
-
this._encryptor =
|
|
57
|
-
this._decryptor =
|
|
58
|
-
const encrypted =
|
|
54
|
+
this._encryptor = this._crypto.createAesCtr(encryptKey, encryptIv, true);
|
|
55
|
+
this._decryptor = this._crypto.createAesCtr(decryptKey, decryptIv, false);
|
|
56
|
+
const encrypted = this._encryptor.process(random);
|
|
59
57
|
random.set(encrypted.subarray(56, 64), 56);
|
|
60
58
|
return random;
|
|
61
59
|
}
|
|
62
60
|
async encode(packet) {
|
|
63
|
-
return this._encryptor.
|
|
61
|
+
return this._encryptor.process(await this._inner.encode(packet));
|
|
64
62
|
}
|
|
65
63
|
feed(data) {
|
|
66
|
-
const dec = this._decryptor.
|
|
67
|
-
|
|
68
|
-
this._inner.feed(dec);
|
|
69
|
-
else {
|
|
70
|
-
dec.then((dec) => this._inner.feed(dec)).catch((err) => this.emit('error', err));
|
|
71
|
-
}
|
|
64
|
+
const dec = this._decryptor.process(data);
|
|
65
|
+
this._inner.feed(dec);
|
|
72
66
|
}
|
|
73
67
|
reset() {
|
|
74
68
|
this._inner.reset();
|
|
75
|
-
|
|
76
|
-
|
|
69
|
+
this._encryptor?.close?.();
|
|
70
|
+
this._decryptor?.close?.();
|
|
71
|
+
this._encryptor = undefined;
|
|
72
|
+
this._decryptor = undefined;
|
|
77
73
|
}
|
|
78
74
|
}
|
|
79
75
|
//# sourceMappingURL=obfuscated.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"obfuscated.js","sourceRoot":"","sources":["../../../../src/network/transports/obfuscated.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,kBAAkB,EAAE,MAAM,6BAA6B,CAAA;
|
|
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,129 @@
|
|
|
1
|
+
import { describe, expect, it, vi } from 'vitest';
|
|
2
|
+
import { defaultTestCryptoProvider, u8HexDecode } from '@mtcute/test';
|
|
3
|
+
import { hexDecodeToBuffer, hexEncode, LogManager } from '../../utils/index.js';
|
|
4
|
+
import { IntermediatePacketCodec } from './intermediate.js';
|
|
5
|
+
import { ObfuscatedPacketCodec } from './obfuscated.js';
|
|
6
|
+
describe('ObfuscatedPacketCodec', () => {
|
|
7
|
+
const create = async (randomSource, proxy) => {
|
|
8
|
+
const codec = new ObfuscatedPacketCodec(new IntermediatePacketCodec(), proxy);
|
|
9
|
+
const crypto = await defaultTestCryptoProvider(randomSource);
|
|
10
|
+
codec.setup(crypto, new LogManager());
|
|
11
|
+
return [codec, crypto];
|
|
12
|
+
};
|
|
13
|
+
describe('tag', () => {
|
|
14
|
+
it('should correctly generate random initial payload', async () => {
|
|
15
|
+
const random = 'ff'.repeat(64);
|
|
16
|
+
const [codec] = await create(random);
|
|
17
|
+
const tag = await codec.tag();
|
|
18
|
+
expect(hexEncode(tag)).toEqual('ff'.repeat(56) + 'fce8ab2203db2bff');
|
|
19
|
+
});
|
|
20
|
+
describe('mtproxy', () => {
|
|
21
|
+
it('should correctly generate random initial payload for prod dc', async () => {
|
|
22
|
+
const random = 'ff'.repeat(64);
|
|
23
|
+
const proxy = {
|
|
24
|
+
dcId: 1,
|
|
25
|
+
secret: new Uint8Array(16),
|
|
26
|
+
test: false,
|
|
27
|
+
media: false,
|
|
28
|
+
};
|
|
29
|
+
const [codec] = await create(random, proxy);
|
|
30
|
+
const tag = await codec.tag();
|
|
31
|
+
expect(hexEncode(tag)).toEqual('ff'.repeat(56) + 'ecec4cbda8bb188b');
|
|
32
|
+
});
|
|
33
|
+
it('should correctly generate random initial payload for test dc', async () => {
|
|
34
|
+
const random = 'ff'.repeat(64);
|
|
35
|
+
const proxy = {
|
|
36
|
+
dcId: 1,
|
|
37
|
+
secret: new Uint8Array(16),
|
|
38
|
+
test: true,
|
|
39
|
+
media: false,
|
|
40
|
+
};
|
|
41
|
+
const [codec] = await create(random, proxy);
|
|
42
|
+
const tag = await codec.tag();
|
|
43
|
+
expect(hexEncode(tag)).toEqual('ff'.repeat(56) + 'ecec4cbdb89c188b');
|
|
44
|
+
});
|
|
45
|
+
it('should correctly generate random initial payload for media dc', async () => {
|
|
46
|
+
const random = 'ff'.repeat(64);
|
|
47
|
+
const proxy = {
|
|
48
|
+
dcId: 1,
|
|
49
|
+
secret: new Uint8Array(16),
|
|
50
|
+
test: false,
|
|
51
|
+
media: true,
|
|
52
|
+
};
|
|
53
|
+
const [codec] = await create(random, proxy);
|
|
54
|
+
const tag = await codec.tag();
|
|
55
|
+
expect(hexEncode(tag)).toEqual('ff'.repeat(56) + 'ecec4cbd5644188b');
|
|
56
|
+
});
|
|
57
|
+
});
|
|
58
|
+
it.each([
|
|
59
|
+
['ef'],
|
|
60
|
+
['48454144'],
|
|
61
|
+
['504f5354'],
|
|
62
|
+
['47455420'],
|
|
63
|
+
['4f505449'],
|
|
64
|
+
['dddddddd'],
|
|
65
|
+
['eeeeeeee'],
|
|
66
|
+
['16030102'],
|
|
67
|
+
])('should correctly retry for %s prefix', async (prefix) => {
|
|
68
|
+
const random = prefix + 'ff'.repeat(64 - prefix.length / 2);
|
|
69
|
+
const [codec] = await create(random);
|
|
70
|
+
// generating random payload requires 64 bytes of entropy, so
|
|
71
|
+
// if it asks for more, it means it tried to generate it again
|
|
72
|
+
await expect(() => codec.tag()).rejects.toThrow('not enough entropy');
|
|
73
|
+
});
|
|
74
|
+
});
|
|
75
|
+
it('should correctly create aes ctr', async () => {
|
|
76
|
+
const [codec, crypto] = await create();
|
|
77
|
+
const spyCreateAesCtr = vi.spyOn(crypto, 'createAesCtr');
|
|
78
|
+
await codec.tag();
|
|
79
|
+
expect(spyCreateAesCtr).toHaveBeenCalledTimes(2);
|
|
80
|
+
expect(spyCreateAesCtr).toHaveBeenNthCalledWith(1, u8HexDecode('10b6b4ad6d56ef5df9453f88e6ee6adb6e0544ba635dc6a8a990c9b8b980c343'), u8HexDecode('936b33fa7f97bae025102532233abb26'), true);
|
|
81
|
+
expect(spyCreateAesCtr).toHaveBeenNthCalledWith(2, u8HexDecode('26bb3a2332251025e0ba977ffa336b9343c380b9b8c990a9a8c65d63ba44056e'), u8HexDecode('db6aeee6883f45f95def566dadb4b610'), false);
|
|
82
|
+
});
|
|
83
|
+
it('should correctly create aes ctr for mtproxy', async () => {
|
|
84
|
+
const proxy = {
|
|
85
|
+
dcId: 1,
|
|
86
|
+
secret: hexDecodeToBuffer('00112233445566778899aabbccddeeff'),
|
|
87
|
+
test: true,
|
|
88
|
+
media: false,
|
|
89
|
+
};
|
|
90
|
+
const [codec, crypto] = await create(undefined, proxy);
|
|
91
|
+
const spyCreateAesCtr = vi.spyOn(crypto, 'createAesCtr');
|
|
92
|
+
await codec.tag();
|
|
93
|
+
expect(spyCreateAesCtr).toHaveBeenCalledTimes(2);
|
|
94
|
+
expect(spyCreateAesCtr).toHaveBeenNthCalledWith(1, hexDecodeToBuffer('dd03188944590983e28dad14d97d0952389d118af4ffcbdb28d56a6a612ef7a6'), u8HexDecode('936b33fa7f97bae025102532233abb26'), true);
|
|
95
|
+
expect(spyCreateAesCtr).toHaveBeenNthCalledWith(2, hexDecodeToBuffer('413b8e08021fbb08a2962b6d7187194fe46565c6b329d3bbdfcffd4870c16119'), u8HexDecode('db6aeee6883f45f95def566dadb4b610'), false);
|
|
96
|
+
});
|
|
97
|
+
it('should correctly encrypt the underlying codec', async () => {
|
|
98
|
+
const data = hexDecodeToBuffer('6cfeffff');
|
|
99
|
+
const msg1 = 'a1020630a410e940';
|
|
100
|
+
const msg2 = 'f53ff53f371db495';
|
|
101
|
+
const [codec] = await create();
|
|
102
|
+
await codec.tag();
|
|
103
|
+
expect(hexEncode(await codec.encode(data))).toEqual(msg1);
|
|
104
|
+
expect(hexEncode(await codec.encode(data))).toEqual(msg2);
|
|
105
|
+
});
|
|
106
|
+
it('should correctly decrypt the underlying codec', async () => {
|
|
107
|
+
const msg1 = 'e8027df708ab3b5c';
|
|
108
|
+
const msg2 = '1854be76d2df4949';
|
|
109
|
+
const [codec] = await create();
|
|
110
|
+
await codec.tag();
|
|
111
|
+
const log = [];
|
|
112
|
+
codec.on('error', (e) => {
|
|
113
|
+
log.push(e.toString());
|
|
114
|
+
});
|
|
115
|
+
codec.feed(hexDecodeToBuffer(msg1));
|
|
116
|
+
codec.feed(hexDecodeToBuffer(msg2));
|
|
117
|
+
await vi.waitFor(() => expect(log).toEqual(['Error: Transport error: 404', 'Error: Transport error: 404']));
|
|
118
|
+
});
|
|
119
|
+
it('should correctly reset', async () => {
|
|
120
|
+
const inner = new IntermediatePacketCodec();
|
|
121
|
+
const spyInnerReset = vi.spyOn(inner, 'reset');
|
|
122
|
+
const codec = new ObfuscatedPacketCodec(inner);
|
|
123
|
+
codec.setup(await defaultTestCryptoProvider(), new LogManager());
|
|
124
|
+
await codec.tag();
|
|
125
|
+
codec.reset();
|
|
126
|
+
expect(spyInnerReset).toHaveBeenCalledTimes(1);
|
|
127
|
+
});
|
|
128
|
+
});
|
|
129
|
+
//# 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"]}
|
|
@@ -97,10 +97,10 @@ export class BaseTcpTransport extends EventEmitter {
|
|
|
97
97
|
.catch((err) => this.emit('error', err));
|
|
98
98
|
}
|
|
99
99
|
async send(bytes) {
|
|
100
|
+
const framed = await this._packetCodec.encode(bytes);
|
|
100
101
|
if (this._state !== TransportState.Ready) {
|
|
101
102
|
throw new MtcuteError('Transport is not READY');
|
|
102
103
|
}
|
|
103
|
-
const framed = await this._packetCodec.encode(bytes);
|
|
104
104
|
return new Promise((resolve, reject) => {
|
|
105
105
|
this._socket.write(framed, (error) => {
|
|
106
106
|
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,95 @@
|
|
|
1
|
+
import { describe, expect, it, vi } from 'vitest';
|
|
2
|
+
import { defaultTestCryptoProvider, u8HexDecode } from '@mtcute/test';
|
|
3
|
+
import { defaultProductionDc, hexDecodeToBuffer, LogManager } from '../../utils/index.js';
|
|
4
|
+
import { TransportState } from './abstract.js';
|
|
5
|
+
import { TcpTransport } from './tcp.js';
|
|
6
|
+
vi.mock('net', () => ({
|
|
7
|
+
connect: vi.fn().mockImplementation((port, ip, cb) => {
|
|
8
|
+
cb();
|
|
9
|
+
return {
|
|
10
|
+
on: vi.fn(),
|
|
11
|
+
write: vi.fn().mockImplementation((data, cb) => {
|
|
12
|
+
cb();
|
|
13
|
+
}),
|
|
14
|
+
end: vi.fn(),
|
|
15
|
+
removeAllListeners: vi.fn(),
|
|
16
|
+
destroy: vi.fn(),
|
|
17
|
+
};
|
|
18
|
+
}),
|
|
19
|
+
}));
|
|
20
|
+
describe('TcpTransport', async () => {
|
|
21
|
+
const net = await import('net');
|
|
22
|
+
const connect = vi.mocked(net.connect);
|
|
23
|
+
const getLastSocket = () => {
|
|
24
|
+
return connect.mock.results[connect.mock.results.length - 1].value;
|
|
25
|
+
};
|
|
26
|
+
const create = async () => {
|
|
27
|
+
const transport = new TcpTransport();
|
|
28
|
+
const logger = new LogManager();
|
|
29
|
+
logger.level = 0;
|
|
30
|
+
transport.setup(await defaultTestCryptoProvider(), logger);
|
|
31
|
+
return transport;
|
|
32
|
+
};
|
|
33
|
+
it('should initiate a tcp connection to the given dc', async () => {
|
|
34
|
+
const t = await create();
|
|
35
|
+
t.connect(defaultProductionDc.main, false);
|
|
36
|
+
expect(connect).toHaveBeenCalledOnce();
|
|
37
|
+
expect(connect).toHaveBeenCalledWith(defaultProductionDc.main.port, defaultProductionDc.main.ipAddress, expect.any(Function));
|
|
38
|
+
await vi.waitFor(() => expect(t.state()).toEqual(TransportState.Ready));
|
|
39
|
+
});
|
|
40
|
+
it('should set up event handlers', async () => {
|
|
41
|
+
const t = await create();
|
|
42
|
+
t.connect(defaultProductionDc.main, false);
|
|
43
|
+
const socket = getLastSocket();
|
|
44
|
+
expect(socket.on).toHaveBeenCalledTimes(3);
|
|
45
|
+
expect(socket.on).toHaveBeenCalledWith('data', expect.any(Function));
|
|
46
|
+
expect(socket.on).toHaveBeenCalledWith('error', expect.any(Function));
|
|
47
|
+
expect(socket.on).toHaveBeenCalledWith('close', expect.any(Function));
|
|
48
|
+
});
|
|
49
|
+
it('should write packet codec tag once connected', async () => {
|
|
50
|
+
const t = await create();
|
|
51
|
+
t.connect(defaultProductionDc.main, false);
|
|
52
|
+
const socket = getLastSocket();
|
|
53
|
+
await vi.waitFor(() => expect(socket.write).toHaveBeenCalledWith(u8HexDecode('eeeeeeee'), // intermediate
|
|
54
|
+
expect.any(Function)));
|
|
55
|
+
});
|
|
56
|
+
it('should write to the underlying socket', async () => {
|
|
57
|
+
const t = await create();
|
|
58
|
+
t.connect(defaultProductionDc.main, false);
|
|
59
|
+
await vi.waitFor(() => expect(t.state()).toEqual(TransportState.Ready));
|
|
60
|
+
await t.send(hexDecodeToBuffer('00010203040506070809'));
|
|
61
|
+
const socket = getLastSocket();
|
|
62
|
+
expect(socket.write).toHaveBeenCalledWith(u8HexDecode('0a00000000010203040506070809'), expect.any(Function));
|
|
63
|
+
});
|
|
64
|
+
it('should correctly close', async () => {
|
|
65
|
+
const t = await create();
|
|
66
|
+
t.connect(defaultProductionDc.main, false);
|
|
67
|
+
await vi.waitFor(() => expect(t.state()).toEqual(TransportState.Ready));
|
|
68
|
+
t.close();
|
|
69
|
+
const socket = getLastSocket();
|
|
70
|
+
expect(socket.removeAllListeners).toHaveBeenCalledOnce();
|
|
71
|
+
expect(socket.destroy).toHaveBeenCalledOnce();
|
|
72
|
+
});
|
|
73
|
+
it('should feed data to the packet codec', async () => {
|
|
74
|
+
const t = await create();
|
|
75
|
+
const codec = t._packetCodec;
|
|
76
|
+
const spyFeed = vi.spyOn(codec, 'feed');
|
|
77
|
+
t.connect(defaultProductionDc.main, false);
|
|
78
|
+
await vi.waitFor(() => expect(t.state()).toEqual(TransportState.Ready));
|
|
79
|
+
const socket = getLastSocket();
|
|
80
|
+
const onDataCall = socket.on.mock.calls.find((c) => c[0] === 'data');
|
|
81
|
+
onDataCall[1](u8HexDecode('00010203040506070809'));
|
|
82
|
+
expect(spyFeed).toHaveBeenCalledWith(u8HexDecode('00010203040506070809'));
|
|
83
|
+
});
|
|
84
|
+
it('should propagate errors', async () => {
|
|
85
|
+
const t = await create();
|
|
86
|
+
const spyEmit = vi.spyOn(t, 'emit').mockImplementation(() => true);
|
|
87
|
+
t.connect(defaultProductionDc.main, false);
|
|
88
|
+
await vi.waitFor(() => expect(t.state()).toEqual(TransportState.Ready));
|
|
89
|
+
const socket = getLastSocket();
|
|
90
|
+
const onErrorCall = socket.on.mock.calls.find((c) => c[0] === 'error');
|
|
91
|
+
onErrorCall[1](new Error('test error'));
|
|
92
|
+
expect(spyEmit).toHaveBeenCalledWith('error', new Error('test error'));
|
|
93
|
+
});
|
|
94
|
+
});
|
|
95
|
+
//# 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":"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","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 {};
|