@mtcute/core 0.1.0
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/LICENSE +8 -0
- package/README.md +26 -0
- package/cjs/base-client.d.ts +297 -0
- package/cjs/base-client.js +324 -0
- package/cjs/base-client.js.map +1 -0
- package/cjs/index.d.ts +10 -0
- package/cjs/index.js +30 -0
- package/cjs/index.js.map +1 -0
- package/cjs/network/auth-key.d.ts +21 -0
- package/cjs/network/auth-key.js +101 -0
- package/cjs/network/auth-key.js.map +1 -0
- package/cjs/network/authorization.d.ts +9 -0
- package/cjs/network/authorization.js +332 -0
- package/cjs/network/authorization.js.map +1 -0
- package/cjs/network/config-manager.d.ts +33 -0
- package/cjs/network/config-manager.js +93 -0
- package/cjs/network/config-manager.js.map +1 -0
- package/cjs/network/index.d.ts +4 -0
- package/cjs/network/index.js +20 -0
- package/cjs/network/index.js.map +1 -0
- package/cjs/network/mtproto-session.d.ts +116 -0
- package/cjs/network/mtproto-session.js +209 -0
- package/cjs/network/mtproto-session.js.map +1 -0
- package/cjs/network/multi-session-connection.d.ts +33 -0
- package/cjs/network/multi-session-connection.js +243 -0
- package/cjs/network/multi-session-connection.js.map +1 -0
- package/cjs/network/network-manager.d.ts +190 -0
- package/cjs/network/network-manager.js +547 -0
- package/cjs/network/network-manager.js.map +1 -0
- package/cjs/network/persistent-connection.d.ts +51 -0
- package/cjs/network/persistent-connection.js +173 -0
- package/cjs/network/persistent-connection.js.map +1 -0
- package/cjs/network/reconnection.d.ts +11 -0
- package/cjs/network/reconnection.js +18 -0
- package/cjs/network/reconnection.js.map +1 -0
- package/cjs/network/session-connection.d.ts +72 -0
- package/cjs/network/session-connection.js +1363 -0
- package/cjs/network/session-connection.js.map +1 -0
- package/cjs/network/transports/abstract.d.ts +99 -0
- package/cjs/network/transports/abstract.js +38 -0
- package/cjs/network/transports/abstract.js.map +1 -0
- package/cjs/network/transports/index.d.ts +8 -0
- package/cjs/network/transports/index.js +26 -0
- package/cjs/network/transports/index.js.map +1 -0
- package/cjs/network/transports/intermediate.d.ts +20 -0
- package/cjs/network/transports/intermediate.js +67 -0
- package/cjs/network/transports/intermediate.js.map +1 -0
- package/cjs/network/transports/obfuscated.d.ts +18 -0
- package/cjs/network/transports/obfuscated.js +83 -0
- package/cjs/network/transports/obfuscated.js.map +1 -0
- package/cjs/network/transports/streamed.d.ts +24 -0
- package/cjs/network/transports/streamed.js +32 -0
- package/cjs/network/transports/streamed.js.map +1 -0
- package/cjs/network/transports/tcp.d.ts +33 -0
- package/cjs/network/transports/tcp.js +130 -0
- package/cjs/network/transports/tcp.js.map +1 -0
- package/cjs/network/transports/websocket.d.ts +47 -0
- package/cjs/network/transports/websocket.js +124 -0
- package/cjs/network/transports/websocket.js.map +1 -0
- package/cjs/network/transports/wrapped.d.ts +11 -0
- package/cjs/network/transports/wrapped.js +26 -0
- package/cjs/network/transports/wrapped.js.map +1 -0
- package/cjs/package.json +3 -0
- package/cjs/storage/abstract.d.ts +174 -0
- package/cjs/storage/abstract.js +3 -0
- package/cjs/storage/abstract.js.map +1 -0
- package/cjs/storage/index.d.ts +5 -0
- package/cjs/storage/index.js +22 -0
- package/cjs/storage/index.js.map +1 -0
- package/cjs/storage/json-file.d.ts +31 -0
- package/cjs/storage/json-file.js +90 -0
- package/cjs/storage/json-file.js.map +1 -0
- package/cjs/storage/json.d.ts +9 -0
- package/cjs/storage/json.js +65 -0
- package/cjs/storage/json.js.map +1 -0
- package/cjs/storage/localstorage.d.ts +7 -0
- package/cjs/storage/localstorage.js +25 -0
- package/cjs/storage/localstorage.js.map +1 -0
- package/cjs/storage/memory.d.ts +98 -0
- package/cjs/storage/memory.js +299 -0
- package/cjs/storage/memory.js.map +1 -0
- package/cjs/types/errors.d.ts +53 -0
- package/cjs/types/errors.js +58 -0
- package/cjs/types/errors.js.map +1 -0
- package/cjs/types/index.d.ts +3 -0
- package/cjs/types/index.js +20 -0
- package/cjs/types/index.js.map +1 -0
- package/cjs/types/peers.d.ts +4 -0
- package/cjs/types/peers.js +3 -0
- package/cjs/types/peers.js.map +1 -0
- package/cjs/types/utils.d.ts +6 -0
- package/cjs/types/utils.js +9 -0
- package/cjs/types/utils.js.map +1 -0
- package/cjs/utils/async-lock.d.ts +10 -0
- package/cjs/utils/async-lock.js +43 -0
- package/cjs/utils/async-lock.js.map +1 -0
- package/cjs/utils/bigint-utils.d.ts +40 -0
- package/cjs/utils/bigint-utils.js +104 -0
- package/cjs/utils/bigint-utils.js.map +1 -0
- package/cjs/utils/binary/asn1-parser.d.ts +17 -0
- package/cjs/utils/binary/asn1-parser.js +121 -0
- package/cjs/utils/binary/asn1-parser.js.map +1 -0
- package/cjs/utils/buffer-utils.d.ts +21 -0
- package/cjs/utils/buffer-utils.js +63 -0
- package/cjs/utils/buffer-utils.js.map +1 -0
- package/cjs/utils/condition-variable.d.ts +9 -0
- package/cjs/utils/condition-variable.js +28 -0
- package/cjs/utils/condition-variable.js.map +1 -0
- package/cjs/utils/controllable-promise.d.ts +16 -0
- package/cjs/utils/controllable-promise.js +25 -0
- package/cjs/utils/controllable-promise.js.map +1 -0
- package/cjs/utils/crypto/abstract.d.ts +23 -0
- package/cjs/utils/crypto/abstract.js +19 -0
- package/cjs/utils/crypto/abstract.js.map +1 -0
- package/cjs/utils/crypto/common.d.ts +12 -0
- package/cjs/utils/crypto/common.js +54 -0
- package/cjs/utils/crypto/common.js.map +1 -0
- package/cjs/utils/crypto/factorization.d.ts +5 -0
- package/cjs/utils/crypto/factorization.js +69 -0
- package/cjs/utils/crypto/factorization.js.map +1 -0
- package/cjs/utils/crypto/index.d.ts +5 -0
- package/cjs/utils/crypto/index.js +23 -0
- package/cjs/utils/crypto/index.js.map +1 -0
- package/cjs/utils/crypto/keys.d.ts +27 -0
- package/cjs/utils/crypto/keys.js +70 -0
- package/cjs/utils/crypto/keys.js.map +1 -0
- package/cjs/utils/crypto/miller-rabin.d.ts +2 -0
- package/cjs/utils/crypto/miller-rabin.js +44 -0
- package/cjs/utils/crypto/miller-rabin.js.map +1 -0
- package/cjs/utils/crypto/mtproto.d.ts +31 -0
- package/cjs/utils/crypto/mtproto.js +66 -0
- package/cjs/utils/crypto/mtproto.js.map +1 -0
- package/cjs/utils/crypto/node-crypto.d.ts +10 -0
- package/cjs/utils/crypto/node-crypto.js +46 -0
- package/cjs/utils/crypto/node-crypto.js.map +1 -0
- package/cjs/utils/crypto/password.d.ts +29 -0
- package/cjs/utils/crypto/password.js +106 -0
- package/cjs/utils/crypto/password.js.map +1 -0
- package/cjs/utils/crypto/subtle.d.ts +12 -0
- package/cjs/utils/crypto/subtle.js +86 -0
- package/cjs/utils/crypto/subtle.js.map +1 -0
- package/cjs/utils/crypto/utils.d.ts +14 -0
- package/cjs/utils/crypto/utils.js +30 -0
- package/cjs/utils/crypto/utils.js.map +1 -0
- package/cjs/utils/default-dcs.d.ts +7 -0
- package/cjs/utils/default-dcs.js +76 -0
- package/cjs/utils/default-dcs.js.map +1 -0
- package/cjs/utils/deque.d.ts +29 -0
- package/cjs/utils/deque.js +210 -0
- package/cjs/utils/deque.js.map +1 -0
- package/cjs/utils/early-timer.d.ts +42 -0
- package/cjs/utils/early-timer.js +79 -0
- package/cjs/utils/early-timer.js.map +1 -0
- package/cjs/utils/flood-control.d.ts +14 -0
- package/cjs/utils/flood-control.js +65 -0
- package/cjs/utils/flood-control.js.map +1 -0
- package/cjs/utils/function-utils.d.ts +13 -0
- package/cjs/utils/function-utils.js +30 -0
- package/cjs/utils/function-utils.js.map +1 -0
- package/cjs/utils/index.d.ts +24 -0
- package/cjs/utils/index.js +41 -0
- package/cjs/utils/index.js.map +1 -0
- package/cjs/utils/linked-list.d.ts +21 -0
- package/cjs/utils/linked-list.js +73 -0
- package/cjs/utils/linked-list.js.map +1 -0
- package/cjs/utils/links/bots.d.ts +71 -0
- package/cjs/utils/links/bots.js +259 -0
- package/cjs/utils/links/bots.js.map +1 -0
- package/cjs/utils/links/bundle.d.ts +7 -0
- package/cjs/utils/links/bundle.js +24 -0
- package/cjs/utils/links/bundle.js.map +1 -0
- package/cjs/utils/links/calls.d.ts +16 -0
- package/cjs/utils/links/calls.js +59 -0
- package/cjs/utils/links/calls.js.map +1 -0
- package/cjs/utils/links/chat.d.ts +46 -0
- package/cjs/utils/links/chat.js +160 -0
- package/cjs/utils/links/chat.js.map +1 -0
- package/cjs/utils/links/common.d.ts +31 -0
- package/cjs/utils/links/common.js +60 -0
- package/cjs/utils/links/common.js.map +1 -0
- package/cjs/utils/links/index.d.ts +2 -0
- package/cjs/utils/links/index.js +29 -0
- package/cjs/utils/links/index.js.map +1 -0
- package/cjs/utils/links/misc.d.ts +19 -0
- package/cjs/utils/links/misc.js +77 -0
- package/cjs/utils/links/misc.js.map +1 -0
- package/cjs/utils/links/proxy.d.ts +17 -0
- package/cjs/utils/links/proxy.js +61 -0
- package/cjs/utils/links/proxy.js.map +1 -0
- package/cjs/utils/links/stickers.d.ts +9 -0
- package/cjs/utils/links/stickers.js +28 -0
- package/cjs/utils/links/stickers.js.map +1 -0
- package/cjs/utils/links/user.d.ts +27 -0
- package/cjs/utils/links/user.js +81 -0
- package/cjs/utils/links/user.js.map +1 -0
- package/cjs/utils/logger.d.ts +54 -0
- package/cjs/utils/logger.js +158 -0
- package/cjs/utils/logger.js.map +1 -0
- package/cjs/utils/long-utils.d.ts +75 -0
- package/cjs/utils/long-utils.js +161 -0
- package/cjs/utils/long-utils.js.map +1 -0
- package/cjs/utils/lru-map.d.ts +21 -0
- package/cjs/utils/lru-map.js +107 -0
- package/cjs/utils/lru-map.js.map +1 -0
- package/cjs/utils/lru-set.d.ts +22 -0
- package/cjs/utils/lru-set.js +48 -0
- package/cjs/utils/lru-set.js.map +1 -0
- package/cjs/utils/misc-utils.d.ts +7 -0
- package/cjs/utils/misc-utils.js +15 -0
- package/cjs/utils/misc-utils.js.map +1 -0
- package/cjs/utils/peer-utils.d.ts +35 -0
- package/cjs/utils/peer-utils.js +188 -0
- package/cjs/utils/peer-utils.js.map +1 -0
- package/cjs/utils/platform/crypto.d.ts +1 -0
- package/cjs/utils/platform/crypto.js +8 -0
- package/cjs/utils/platform/crypto.js.map +1 -0
- package/cjs/utils/platform/crypto.web.d.ts +1 -0
- package/cjs/utils/platform/crypto.web.js +14 -0
- package/cjs/utils/platform/crypto.web.js.map +1 -0
- package/cjs/utils/platform/error-reporting.d.ts +3 -0
- package/cjs/utils/platform/error-reporting.js +22 -0
- package/cjs/utils/platform/error-reporting.js.map +1 -0
- package/cjs/utils/platform/logging.d.ts +1 -0
- package/cjs/utils/platform/logging.js +35 -0
- package/cjs/utils/platform/logging.js.map +1 -0
- package/cjs/utils/platform/logging.web.d.ts +1 -0
- package/cjs/utils/platform/logging.web.js +35 -0
- package/cjs/utils/platform/logging.web.js.map +1 -0
- package/cjs/utils/platform/random.d.ts +1 -0
- package/cjs/utils/platform/random.js +7 -0
- package/cjs/utils/platform/random.js.map +1 -0
- package/cjs/utils/platform/random.web.d.ts +1 -0
- package/cjs/utils/platform/random.web.js +10 -0
- package/cjs/utils/platform/random.web.js.map +1 -0
- package/cjs/utils/platform/transport.d.ts +1 -0
- package/cjs/utils/platform/transport.js +8 -0
- package/cjs/utils/platform/transport.js.map +1 -0
- package/cjs/utils/platform/transport.web.d.ts +1 -0
- package/cjs/utils/platform/transport.web.js +15 -0
- package/cjs/utils/platform/transport.web.js.map +1 -0
- package/cjs/utils/sorted-array.d.ts +17 -0
- package/cjs/utils/sorted-array.js +83 -0
- package/cjs/utils/sorted-array.js.map +1 -0
- package/cjs/utils/string-session.d.ts +11 -0
- package/cjs/utils/string-session.js +73 -0
- package/cjs/utils/string-session.js.map +1 -0
- package/cjs/utils/tl-json.d.ts +13 -0
- package/cjs/utils/tl-json.js +62 -0
- package/cjs/utils/tl-json.js.map +1 -0
- package/cjs/utils/type-assertions.d.ts +37 -0
- package/cjs/utils/type-assertions.js +70 -0
- package/cjs/utils/type-assertions.js.map +1 -0
- package/esm/base-client.d.ts +297 -0
- package/esm/base-client.js +317 -0
- package/esm/base-client.js.map +1 -0
- package/esm/index.d.ts +10 -0
- package/esm/index.js +11 -0
- package/esm/index.js.map +1 -0
- package/esm/network/auth-key.d.ts +21 -0
- package/esm/network/auth-key.js +97 -0
- package/esm/network/auth-key.js.map +1 -0
- package/esm/network/authorization.d.ts +9 -0
- package/esm/network/authorization.js +325 -0
- package/esm/network/authorization.js.map +1 -0
- package/esm/network/config-manager.d.ts +33 -0
- package/esm/network/config-manager.js +89 -0
- package/esm/network/config-manager.js.map +1 -0
- package/esm/network/index.d.ts +4 -0
- package/esm/network/index.js +4 -0
- package/esm/network/index.js.map +1 -0
- package/esm/network/mtproto-session.d.ts +116 -0
- package/esm/network/mtproto-session.js +202 -0
- package/esm/network/mtproto-session.js.map +1 -0
- package/esm/network/multi-session-connection.d.ts +33 -0
- package/esm/network/multi-session-connection.js +236 -0
- package/esm/network/multi-session-connection.js.map +1 -0
- package/esm/network/network-manager.d.ts +190 -0
- package/esm/network/network-manager.js +542 -0
- package/esm/network/network-manager.js.map +1 -0
- package/esm/network/persistent-connection.d.ts +51 -0
- package/esm/network/persistent-connection.js +166 -0
- package/esm/network/persistent-connection.js.map +1 -0
- package/esm/network/reconnection.d.ts +11 -0
- package/esm/network/reconnection.js +14 -0
- package/esm/network/reconnection.js.map +1 -0
- package/esm/network/session-connection.d.ts +72 -0
- package/esm/network/session-connection.js +1356 -0
- package/esm/network/session-connection.js.map +1 -0
- package/esm/network/transports/abstract.d.ts +99 -0
- package/esm/network/transports/abstract.js +34 -0
- package/esm/network/transports/abstract.js.map +1 -0
- package/esm/network/transports/index.d.ts +8 -0
- package/esm/network/transports/index.js +9 -0
- package/esm/network/transports/index.js.map +1 -0
- package/esm/network/transports/intermediate.d.ts +20 -0
- package/esm/network/transports/intermediate.js +62 -0
- package/esm/network/transports/intermediate.js.map +1 -0
- package/esm/network/transports/obfuscated.d.ts +18 -0
- package/esm/network/transports/obfuscated.js +79 -0
- package/esm/network/transports/obfuscated.js.map +1 -0
- package/esm/network/transports/streamed.d.ts +24 -0
- package/esm/network/transports/streamed.js +25 -0
- package/esm/network/transports/streamed.js.map +1 -0
- package/esm/network/transports/tcp.d.ts +33 -0
- package/esm/network/transports/tcp.js +122 -0
- package/esm/network/transports/tcp.js.map +1 -0
- package/esm/network/transports/websocket.d.ts +47 -0
- package/esm/network/transports/websocket.js +116 -0
- package/esm/network/transports/websocket.js.map +1 -0
- package/esm/network/transports/wrapped.d.ts +11 -0
- package/esm/network/transports/wrapped.js +19 -0
- package/esm/network/transports/wrapped.js.map +1 -0
- package/esm/storage/abstract.d.ts +174 -0
- package/esm/storage/abstract.js +2 -0
- package/esm/storage/abstract.js.map +1 -0
- package/esm/storage/index.d.ts +5 -0
- package/esm/storage/index.js +6 -0
- package/esm/storage/index.js.map +1 -0
- package/esm/storage/json-file.d.ts +31 -0
- package/esm/storage/json-file.js +63 -0
- package/esm/storage/json-file.js.map +1 -0
- package/esm/storage/json.d.ts +9 -0
- package/esm/storage/json.js +61 -0
- package/esm/storage/json.js.map +1 -0
- package/esm/storage/localstorage.d.ts +7 -0
- package/esm/storage/localstorage.js +21 -0
- package/esm/storage/localstorage.js.map +1 -0
- package/esm/storage/memory.d.ts +98 -0
- package/esm/storage/memory.js +295 -0
- package/esm/storage/memory.js.map +1 -0
- package/esm/types/errors.d.ts +53 -0
- package/esm/types/errors.js +49 -0
- package/esm/types/errors.js.map +1 -0
- package/esm/types/index.d.ts +3 -0
- package/esm/types/index.js +4 -0
- package/esm/types/index.js.map +1 -0
- package/esm/types/peers.d.ts +4 -0
- package/esm/types/peers.js +2 -0
- package/esm/types/peers.js.map +1 -0
- package/esm/types/utils.d.ts +6 -0
- package/esm/types/utils.js +5 -0
- package/esm/types/utils.js.map +1 -0
- package/esm/utils/async-lock.d.ts +10 -0
- package/esm/utils/async-lock.js +39 -0
- package/esm/utils/async-lock.js.map +1 -0
- package/esm/utils/bigint-utils.d.ts +40 -0
- package/esm/utils/bigint-utils.js +92 -0
- package/esm/utils/bigint-utils.js.map +1 -0
- package/esm/utils/binary/asn1-parser.d.ts +17 -0
- package/esm/utils/binary/asn1-parser.js +116 -0
- package/esm/utils/binary/asn1-parser.js.map +1 -0
- package/esm/utils/buffer-utils.d.ts +21 -0
- package/esm/utils/buffer-utils.js +55 -0
- package/esm/utils/buffer-utils.js.map +1 -0
- package/esm/utils/condition-variable.d.ts +9 -0
- package/esm/utils/condition-variable.js +24 -0
- package/esm/utils/condition-variable.js.map +1 -0
- package/esm/utils/controllable-promise.d.ts +16 -0
- package/esm/utils/controllable-promise.js +20 -0
- package/esm/utils/controllable-promise.js.map +1 -0
- package/esm/utils/crypto/abstract.d.ts +23 -0
- package/esm/utils/crypto/abstract.js +15 -0
- package/esm/utils/crypto/abstract.js.map +1 -0
- package/esm/utils/crypto/common.d.ts +12 -0
- package/esm/utils/crypto/common.js +50 -0
- package/esm/utils/crypto/common.js.map +1 -0
- package/esm/utils/crypto/factorization.d.ts +5 -0
- package/esm/utils/crypto/factorization.js +62 -0
- package/esm/utils/crypto/factorization.js.map +1 -0
- package/esm/utils/crypto/index.d.ts +5 -0
- package/esm/utils/crypto/index.js +6 -0
- package/esm/utils/crypto/index.js.map +1 -0
- package/esm/utils/crypto/keys.d.ts +27 -0
- package/esm/utils/crypto/keys.js +64 -0
- package/esm/utils/crypto/keys.js.map +1 -0
- package/esm/utils/crypto/miller-rabin.d.ts +2 -0
- package/esm/utils/crypto/miller-rabin.js +37 -0
- package/esm/utils/crypto/miller-rabin.js.map +1 -0
- package/esm/utils/crypto/mtproto.d.ts +31 -0
- package/esm/utils/crypto/mtproto.js +60 -0
- package/esm/utils/crypto/mtproto.js.map +1 -0
- package/esm/utils/crypto/node-crypto.d.ts +10 -0
- package/esm/utils/crypto/node-crypto.js +42 -0
- package/esm/utils/crypto/node-crypto.js.map +1 -0
- package/esm/utils/crypto/password.d.ts +29 -0
- package/esm/utils/crypto/password.js +97 -0
- package/esm/utils/crypto/password.js.map +1 -0
- package/esm/utils/crypto/subtle.d.ts +12 -0
- package/esm/utils/crypto/subtle.js +59 -0
- package/esm/utils/crypto/subtle.js.map +1 -0
- package/esm/utils/crypto/utils.d.ts +14 -0
- package/esm/utils/crypto/utils.js +25 -0
- package/esm/utils/crypto/utils.js.map +1 -0
- package/esm/utils/default-dcs.d.ts +7 -0
- package/esm/utils/default-dcs.js +73 -0
- package/esm/utils/default-dcs.js.map +1 -0
- package/esm/utils/deque.d.ts +29 -0
- package/esm/utils/deque.js +206 -0
- package/esm/utils/deque.js.map +1 -0
- package/esm/utils/early-timer.d.ts +42 -0
- package/esm/utils/early-timer.js +75 -0
- package/esm/utils/early-timer.js.map +1 -0
- package/esm/utils/flood-control.d.ts +14 -0
- package/esm/utils/flood-control.js +61 -0
- package/esm/utils/flood-control.js.map +1 -0
- package/esm/utils/function-utils.d.ts +13 -0
- package/esm/utils/function-utils.js +26 -0
- package/esm/utils/function-utils.js.map +1 -0
- package/esm/utils/index.d.ts +24 -0
- package/esm/utils/index.js +25 -0
- package/esm/utils/index.js.map +1 -0
- package/esm/utils/linked-list.d.ts +21 -0
- package/esm/utils/linked-list.js +69 -0
- package/esm/utils/linked-list.js.map +1 -0
- package/esm/utils/links/bots.d.ts +71 -0
- package/esm/utils/links/bots.js +256 -0
- package/esm/utils/links/bots.js.map +1 -0
- package/esm/utils/links/bundle.d.ts +7 -0
- package/esm/utils/links/bundle.js +8 -0
- package/esm/utils/links/bundle.js.map +1 -0
- package/esm/utils/links/calls.d.ts +16 -0
- package/esm/utils/links/calls.js +56 -0
- package/esm/utils/links/calls.js.map +1 -0
- package/esm/utils/links/chat.d.ts +46 -0
- package/esm/utils/links/chat.js +157 -0
- package/esm/utils/links/chat.js.map +1 -0
- package/esm/utils/links/common.d.ts +31 -0
- package/esm/utils/links/common.js +56 -0
- package/esm/utils/links/common.js.map +1 -0
- package/esm/utils/links/index.d.ts +2 -0
- package/esm/utils/links/index.js +3 -0
- package/esm/utils/links/index.js.map +1 -0
- package/esm/utils/links/misc.d.ts +19 -0
- package/esm/utils/links/misc.js +74 -0
- package/esm/utils/links/misc.js.map +1 -0
- package/esm/utils/links/proxy.d.ts +17 -0
- package/esm/utils/links/proxy.js +58 -0
- package/esm/utils/links/proxy.js.map +1 -0
- package/esm/utils/links/stickers.d.ts +9 -0
- package/esm/utils/links/stickers.js +25 -0
- package/esm/utils/links/stickers.js.map +1 -0
- package/esm/utils/links/user.d.ts +27 -0
- package/esm/utils/links/user.js +78 -0
- package/esm/utils/links/user.js.map +1 -0
- package/esm/utils/logger.d.ts +54 -0
- package/esm/utils/logger.js +154 -0
- package/esm/utils/logger.js.map +1 -0
- package/esm/utils/long-utils.d.ts +75 -0
- package/esm/utils/long-utils.js +148 -0
- package/esm/utils/long-utils.js.map +1 -0
- package/esm/utils/lru-map.d.ts +21 -0
- package/esm/utils/lru-map.js +103 -0
- package/esm/utils/lru-map.js.map +1 -0
- package/esm/utils/lru-set.d.ts +22 -0
- package/esm/utils/lru-set.js +44 -0
- package/esm/utils/lru-set.js.map +1 -0
- package/esm/utils/misc-utils.d.ts +7 -0
- package/esm/utils/misc-utils.js +10 -0
- package/esm/utils/misc-utils.js.map +1 -0
- package/esm/utils/peer-utils.d.ts +35 -0
- package/esm/utils/peer-utils.js +179 -0
- package/esm/utils/peer-utils.js.map +1 -0
- package/esm/utils/platform/crypto.d.ts +1 -0
- package/esm/utils/platform/crypto.js +4 -0
- package/esm/utils/platform/crypto.js.map +1 -0
- package/esm/utils/platform/crypto.web.d.ts +1 -0
- package/esm/utils/platform/crypto.web.js +10 -0
- package/esm/utils/platform/crypto.web.js.map +1 -0
- package/esm/utils/platform/error-reporting.d.ts +3 -0
- package/esm/utils/platform/error-reporting.js +18 -0
- package/esm/utils/platform/error-reporting.js.map +1 -0
- package/esm/utils/platform/logging.d.ts +1 -0
- package/esm/utils/platform/logging.js +32 -0
- package/esm/utils/platform/logging.js.map +1 -0
- package/esm/utils/platform/logging.web.d.ts +1 -0
- package/esm/utils/platform/logging.web.js +31 -0
- package/esm/utils/platform/logging.web.js.map +1 -0
- package/esm/utils/platform/random.d.ts +1 -0
- package/esm/utils/platform/random.js +4 -0
- package/esm/utils/platform/random.js.map +1 -0
- package/esm/utils/platform/random.web.d.ts +1 -0
- package/esm/utils/platform/random.web.js +6 -0
- package/esm/utils/platform/random.web.js.map +1 -0
- package/esm/utils/platform/transport.d.ts +1 -0
- package/esm/utils/platform/transport.js +4 -0
- package/esm/utils/platform/transport.js.map +1 -0
- package/esm/utils/platform/transport.web.d.ts +1 -0
- package/esm/utils/platform/transport.web.js +12 -0
- package/esm/utils/platform/transport.web.js.map +1 -0
- package/esm/utils/sorted-array.d.ts +17 -0
- package/esm/utils/sorted-array.js +79 -0
- package/esm/utils/sorted-array.js.map +1 -0
- package/esm/utils/string-session.d.ts +11 -0
- package/esm/utils/string-session.js +68 -0
- package/esm/utils/string-session.js.map +1 -0
- package/esm/utils/tl-json.d.ts +13 -0
- package/esm/utils/tl-json.js +57 -0
- package/esm/utils/tl-json.js.map +1 -0
- package/esm/utils/type-assertions.d.ts +37 -0
- package/esm/utils/type-assertions.js +61 -0
- package/esm/utils/type-assertions.js.map +1 -0
- package/package.json +50 -0
|
@@ -0,0 +1,295 @@
|
|
|
1
|
+
import { LruMap, toggleChannelIdMark } from '../utils/index.js';
|
|
2
|
+
const CURRENT_VERSION = 1;
|
|
3
|
+
const USERNAME_TTL = 86400000; // 24 hours
|
|
4
|
+
export class MemoryStorage {
|
|
5
|
+
constructor(params) {
|
|
6
|
+
this._cachedInputPeers = new LruMap(100);
|
|
7
|
+
this.reset();
|
|
8
|
+
this._cachedFull = new LruMap(params?.cacheSize ?? 100);
|
|
9
|
+
this._vacuumInterval = params?.vacuumInterval ?? 300000;
|
|
10
|
+
}
|
|
11
|
+
load() {
|
|
12
|
+
this._vacuumTimeout = setInterval(this._vacuum.bind(this), this._vacuumInterval);
|
|
13
|
+
}
|
|
14
|
+
destroy() {
|
|
15
|
+
clearInterval(this._vacuumTimeout);
|
|
16
|
+
}
|
|
17
|
+
reset() {
|
|
18
|
+
this._state = {
|
|
19
|
+
$version: CURRENT_VERSION,
|
|
20
|
+
defaultDcs: null,
|
|
21
|
+
authKeys: new Map(),
|
|
22
|
+
authKeysTemp: new Map(),
|
|
23
|
+
authKeysTempExpiry: new Map(),
|
|
24
|
+
entities: new Map(),
|
|
25
|
+
phoneIndex: new Map(),
|
|
26
|
+
usernameIndex: new Map(),
|
|
27
|
+
gpts: null,
|
|
28
|
+
pts: new Map(),
|
|
29
|
+
fsm: new Map(),
|
|
30
|
+
rl: new Map(),
|
|
31
|
+
self: null,
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Set a given object as an underlying state.
|
|
36
|
+
*
|
|
37
|
+
* Note that this object will be used as-is, so if
|
|
38
|
+
* you plan on using it somewhere else, be sure to copy it beforehand.
|
|
39
|
+
*/
|
|
40
|
+
_setStateFrom(obj) {
|
|
41
|
+
if (obj.$version !== CURRENT_VERSION)
|
|
42
|
+
return;
|
|
43
|
+
// populate indexes if needed
|
|
44
|
+
let populate = false;
|
|
45
|
+
if (!obj.phoneIndex) {
|
|
46
|
+
obj.phoneIndex = new Map();
|
|
47
|
+
populate = true;
|
|
48
|
+
}
|
|
49
|
+
if (!obj.usernameIndex) {
|
|
50
|
+
obj.usernameIndex = new Map();
|
|
51
|
+
populate = true;
|
|
52
|
+
}
|
|
53
|
+
if (populate) {
|
|
54
|
+
Object.values(obj.entities).forEach((ent) => {
|
|
55
|
+
if (ent.phone)
|
|
56
|
+
obj.phoneIndex.set(ent.phone, ent.id);
|
|
57
|
+
if (ent.username) {
|
|
58
|
+
obj.usernameIndex.set(ent.username, ent.id);
|
|
59
|
+
}
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
this._state = obj;
|
|
63
|
+
}
|
|
64
|
+
_vacuum() {
|
|
65
|
+
// remove expired entities from fsm and rate limit storages
|
|
66
|
+
const now = Date.now();
|
|
67
|
+
// make references in advance to avoid lookups
|
|
68
|
+
const state = this._state;
|
|
69
|
+
const fsm = state.fsm;
|
|
70
|
+
const rl = state.rl;
|
|
71
|
+
for (const [key, item] of fsm) {
|
|
72
|
+
if (item.e && item.e < now) {
|
|
73
|
+
fsm.delete(key);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
for (const [key, item] of rl) {
|
|
77
|
+
if (item.res < now) {
|
|
78
|
+
rl.delete(key);
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
getDefaultDcs() {
|
|
83
|
+
return this._state.defaultDcs;
|
|
84
|
+
}
|
|
85
|
+
setDefaultDcs(dcs) {
|
|
86
|
+
this._state.defaultDcs = dcs;
|
|
87
|
+
}
|
|
88
|
+
setTempAuthKeyFor(dcId, index, key, expiresAt) {
|
|
89
|
+
const k = `${dcId}:${index}`;
|
|
90
|
+
if (key) {
|
|
91
|
+
this._state.authKeysTemp.set(k, key);
|
|
92
|
+
this._state.authKeysTempExpiry.set(k, expiresAt);
|
|
93
|
+
}
|
|
94
|
+
else {
|
|
95
|
+
this._state.authKeysTemp.delete(k);
|
|
96
|
+
this._state.authKeysTempExpiry.delete(k);
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
setAuthKeyFor(dcId, key) {
|
|
100
|
+
if (key) {
|
|
101
|
+
this._state.authKeys.set(dcId, key);
|
|
102
|
+
}
|
|
103
|
+
else {
|
|
104
|
+
this._state.authKeys.delete(dcId);
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
getAuthKeyFor(dcId, tempIndex) {
|
|
108
|
+
if (tempIndex !== undefined) {
|
|
109
|
+
const k = `${dcId}:${tempIndex}`;
|
|
110
|
+
if (Date.now() > (this._state.authKeysTempExpiry.get(k) ?? 0)) {
|
|
111
|
+
return null;
|
|
112
|
+
}
|
|
113
|
+
return this._state.authKeysTemp.get(k) ?? null;
|
|
114
|
+
}
|
|
115
|
+
return this._state.authKeys.get(dcId) ?? null;
|
|
116
|
+
}
|
|
117
|
+
dropAuthKeysFor(dcId) {
|
|
118
|
+
this._state.authKeys.delete(dcId);
|
|
119
|
+
for (const key of this._state.authKeysTemp.keys()) {
|
|
120
|
+
if (key.startsWith(`${dcId}:`)) {
|
|
121
|
+
this._state.authKeysTemp.delete(key);
|
|
122
|
+
this._state.authKeysTempExpiry.delete(key);
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
updatePeers(peers) {
|
|
127
|
+
for (const peer of peers) {
|
|
128
|
+
this._cachedFull.set(peer.id, peer.full);
|
|
129
|
+
peer.updated = Date.now();
|
|
130
|
+
const old = this._state.entities.get(peer.id);
|
|
131
|
+
if (old) {
|
|
132
|
+
// delete old index entries if needed
|
|
133
|
+
if (old.username && peer.username !== old.username) {
|
|
134
|
+
this._state.usernameIndex.delete(old.username);
|
|
135
|
+
}
|
|
136
|
+
if (old.phone && old.phone !== peer.phone) {
|
|
137
|
+
this._state.phoneIndex.delete(old.phone);
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
if (peer.username) {
|
|
141
|
+
this._state.usernameIndex.set(peer.username, peer.id);
|
|
142
|
+
}
|
|
143
|
+
if (peer.phone)
|
|
144
|
+
this._state.phoneIndex.set(peer.phone, peer.id);
|
|
145
|
+
this._state.entities.set(peer.id, peer);
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
_getInputPeer(peerInfo) {
|
|
149
|
+
if (!peerInfo)
|
|
150
|
+
return null;
|
|
151
|
+
switch (peerInfo.type) {
|
|
152
|
+
case 'user':
|
|
153
|
+
return {
|
|
154
|
+
_: 'inputPeerUser',
|
|
155
|
+
userId: peerInfo.id,
|
|
156
|
+
accessHash: peerInfo.accessHash,
|
|
157
|
+
};
|
|
158
|
+
case 'chat':
|
|
159
|
+
return {
|
|
160
|
+
_: 'inputPeerChat',
|
|
161
|
+
chatId: -peerInfo.id,
|
|
162
|
+
};
|
|
163
|
+
case 'channel':
|
|
164
|
+
return {
|
|
165
|
+
_: 'inputPeerChannel',
|
|
166
|
+
channelId: toggleChannelIdMark(peerInfo.id),
|
|
167
|
+
accessHash: peerInfo.accessHash,
|
|
168
|
+
};
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
getPeerById(peerId) {
|
|
172
|
+
if (this._cachedInputPeers.has(peerId)) {
|
|
173
|
+
return this._cachedInputPeers.get(peerId);
|
|
174
|
+
}
|
|
175
|
+
const peer = this._getInputPeer(this._state.entities.get(peerId));
|
|
176
|
+
if (peer)
|
|
177
|
+
this._cachedInputPeers.set(peerId, peer);
|
|
178
|
+
return peer;
|
|
179
|
+
}
|
|
180
|
+
getPeerByPhone(phone) {
|
|
181
|
+
const peerId = this._state.phoneIndex.get(phone);
|
|
182
|
+
if (!peerId)
|
|
183
|
+
return null;
|
|
184
|
+
return this._getInputPeer(this._state.entities.get(peerId));
|
|
185
|
+
}
|
|
186
|
+
getPeerByUsername(username) {
|
|
187
|
+
const id = this._state.usernameIndex.get(username.toLowerCase());
|
|
188
|
+
if (!id)
|
|
189
|
+
return null;
|
|
190
|
+
const peer = this._state.entities.get(id);
|
|
191
|
+
if (!peer)
|
|
192
|
+
return null;
|
|
193
|
+
if (Date.now() - peer.updated > USERNAME_TTL)
|
|
194
|
+
return null;
|
|
195
|
+
return this._getInputPeer(peer);
|
|
196
|
+
}
|
|
197
|
+
getSelf() {
|
|
198
|
+
return this._state.self;
|
|
199
|
+
}
|
|
200
|
+
setSelf(self) {
|
|
201
|
+
this._state.self = self;
|
|
202
|
+
}
|
|
203
|
+
setManyChannelPts(values) {
|
|
204
|
+
for (const [id, pts] of values) {
|
|
205
|
+
this._state.pts.set(id, pts);
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
getChannelPts(entityId) {
|
|
209
|
+
return this._state.pts.get(entityId) ?? null;
|
|
210
|
+
}
|
|
211
|
+
getUpdatesState() {
|
|
212
|
+
return this._state.gpts ?? null;
|
|
213
|
+
}
|
|
214
|
+
setUpdatesPts(val) {
|
|
215
|
+
if (!this._state.gpts)
|
|
216
|
+
this._state.gpts = [0, 0, 0, 0];
|
|
217
|
+
this._state.gpts[0] = val;
|
|
218
|
+
}
|
|
219
|
+
setUpdatesQts(val) {
|
|
220
|
+
if (!this._state.gpts)
|
|
221
|
+
this._state.gpts = [0, 0, 0, 0];
|
|
222
|
+
this._state.gpts[1] = val;
|
|
223
|
+
}
|
|
224
|
+
setUpdatesDate(val) {
|
|
225
|
+
if (!this._state.gpts)
|
|
226
|
+
this._state.gpts = [0, 0, 0, 0];
|
|
227
|
+
this._state.gpts[2] = val;
|
|
228
|
+
}
|
|
229
|
+
setUpdatesSeq(val) {
|
|
230
|
+
if (!this._state.gpts)
|
|
231
|
+
this._state.gpts = [0, 0, 0, 0];
|
|
232
|
+
this._state.gpts[3] = val;
|
|
233
|
+
}
|
|
234
|
+
getFullPeerById(id) {
|
|
235
|
+
return this._cachedFull.get(id) ?? null;
|
|
236
|
+
}
|
|
237
|
+
// IStateStorage implementation
|
|
238
|
+
getState(key) {
|
|
239
|
+
const val = this._state.fsm.get(key);
|
|
240
|
+
if (!val)
|
|
241
|
+
return null;
|
|
242
|
+
if (val.e && val.e < Date.now()) {
|
|
243
|
+
// expired
|
|
244
|
+
this._state.fsm.delete(key);
|
|
245
|
+
return null;
|
|
246
|
+
}
|
|
247
|
+
return val.v;
|
|
248
|
+
}
|
|
249
|
+
setState(key, state, ttl) {
|
|
250
|
+
this._state.fsm.set(key, {
|
|
251
|
+
v: state,
|
|
252
|
+
e: ttl ? Date.now() + ttl * 1000 : undefined,
|
|
253
|
+
});
|
|
254
|
+
}
|
|
255
|
+
deleteState(key) {
|
|
256
|
+
this._state.fsm.delete(key);
|
|
257
|
+
}
|
|
258
|
+
getCurrentScene(key) {
|
|
259
|
+
return this.getState(`$current_scene_${key}`);
|
|
260
|
+
}
|
|
261
|
+
setCurrentScene(key, scene, ttl) {
|
|
262
|
+
return this.setState(`$current_scene_${key}`, scene, ttl);
|
|
263
|
+
}
|
|
264
|
+
deleteCurrentScene(key) {
|
|
265
|
+
this._state.fsm.delete(`$current_scene_${key}`);
|
|
266
|
+
}
|
|
267
|
+
getRateLimit(key, limit, window) {
|
|
268
|
+
// leaky bucket
|
|
269
|
+
const now = Date.now();
|
|
270
|
+
const item = this._state.rl.get(key);
|
|
271
|
+
if (!item) {
|
|
272
|
+
const state = {
|
|
273
|
+
res: now + window * 1000,
|
|
274
|
+
rem: limit,
|
|
275
|
+
};
|
|
276
|
+
this._state.rl.set(key, state);
|
|
277
|
+
return [state.rem, state.res];
|
|
278
|
+
}
|
|
279
|
+
if (item.res < now) {
|
|
280
|
+
// expired
|
|
281
|
+
const state = {
|
|
282
|
+
res: now + window * 1000,
|
|
283
|
+
rem: limit,
|
|
284
|
+
};
|
|
285
|
+
this._state.rl.set(key, state);
|
|
286
|
+
return [state.rem, state.res];
|
|
287
|
+
}
|
|
288
|
+
item.rem = item.rem > 0 ? item.rem - 1 : 0;
|
|
289
|
+
return [item.rem, item.res];
|
|
290
|
+
}
|
|
291
|
+
resetRateLimit(key) {
|
|
292
|
+
this._state.rl.delete(key);
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
//# sourceMappingURL=memory.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory.js","sourceRoot":"","sources":["../../../src/storage/memory.ts"],"names":[],"mappings":"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","sourcesContent":["import { tl } from '@mtcute/tl'\n\nimport { MaybeAsync } from '../types/index.js'\nimport { LruMap, toggleChannelIdMark } from '../utils/index.js'\nimport { ITelegramStorage } from './abstract.js'\n\nconst CURRENT_VERSION = 1\n\ntype PeerInfoWithUpdated = ITelegramStorage.PeerInfo & { updated: number }\n\nexport interface MemorySessionState {\n // forwards compatibility for persistent storages\n $version: typeof CURRENT_VERSION\n\n defaultDcs: ITelegramStorage.DcOptions | null\n authKeys: Map<number, Uint8Array>\n authKeysTemp: Map<string, Uint8Array>\n authKeysTempExpiry: Map<string, number>\n\n // marked peer id -> entity info\n entities: Map<number, PeerInfoWithUpdated>\n // phone number -> peer id\n phoneIndex: Map<string, number>\n // username -> peer id\n usernameIndex: Map<string, number>\n\n // common pts, date, seq, qts\n gpts: [number, number, number, number] | null\n // channel pts\n pts: Map<number, number>\n\n // state for fsm\n fsm: Map<\n string,\n {\n // value\n v: unknown\n // expires\n e?: number\n }\n >\n\n // state for rate limiter\n rl: Map<\n string,\n {\n // reset\n res: number\n // remaining\n rem: number\n }\n >\n\n self: ITelegramStorage.SelfInfo | null\n}\n\nconst USERNAME_TTL = 86400000 // 24 hours\n\nexport class MemoryStorage implements ITelegramStorage /*, IStateStorage*/ {\n protected _state!: MemorySessionState\n private _cachedInputPeers: LruMap<number, tl.TypeInputPeer> = new LruMap(100)\n\n private _cachedFull: LruMap<number, tl.TypeUser | tl.TypeChat>\n\n private _vacuumTimeout?: NodeJS.Timeout\n private _vacuumInterval: number\n\n constructor(params?: {\n /**\n * Maximum number of cached full entities.\n *\n * Note that full entities are **NOT** persisted\n * to the disk (in case this storage is backed\n * by a local storage), and only available within\n * the current runtime.\n *\n * @default `100`, use `0` to disable\n */\n cacheSize?: number\n\n /**\n * Interval in milliseconds for vacuuming the storage.\n *\n * When vacuuming, the storage will remove expired FSM\n * states to reduce memory usage.\n *\n * @default `300_000` (5 minutes)\n */\n vacuumInterval?: number\n }) {\n this.reset()\n this._cachedFull = new LruMap(params?.cacheSize ?? 100)\n this._vacuumInterval = params?.vacuumInterval ?? 300_000\n }\n\n load(): void {\n this._vacuumTimeout = setInterval(this._vacuum.bind(this), this._vacuumInterval)\n }\n\n destroy(): void {\n clearInterval(this._vacuumTimeout)\n }\n\n reset(): void {\n this._state = {\n $version: CURRENT_VERSION,\n defaultDcs: null,\n authKeys: new Map(),\n authKeysTemp: new Map(),\n authKeysTempExpiry: new Map(),\n entities: new Map(),\n phoneIndex: new Map(),\n usernameIndex: new Map(),\n gpts: null,\n pts: new Map(),\n fsm: new Map(),\n rl: new Map(),\n self: null,\n }\n }\n\n /**\n * Set a given object as an underlying state.\n *\n * Note that this object will be used as-is, so if\n * you plan on using it somewhere else, be sure to copy it beforehand.\n */\n protected _setStateFrom(obj: MemorySessionState): void {\n if (obj.$version !== CURRENT_VERSION) return\n\n // populate indexes if needed\n let populate = false\n\n if (!obj.phoneIndex) {\n obj.phoneIndex = new Map()\n populate = true\n }\n if (!obj.usernameIndex) {\n obj.usernameIndex = new Map()\n populate = true\n }\n\n if (populate) {\n Object.values(obj.entities).forEach((ent: ITelegramStorage.PeerInfo) => {\n if (ent.phone) obj.phoneIndex.set(ent.phone, ent.id)\n\n if (ent.username) {\n obj.usernameIndex.set(ent.username, ent.id)\n }\n })\n }\n\n this._state = obj\n }\n\n private _vacuum(): void {\n // remove expired entities from fsm and rate limit storages\n\n const now = Date.now()\n\n // make references in advance to avoid lookups\n const state = this._state\n const fsm = state.fsm\n const rl = state.rl\n\n for (const [key, item] of fsm) {\n if (item.e && item.e < now) {\n fsm.delete(key)\n }\n }\n\n for (const [key, item] of rl) {\n if (item.res < now) {\n rl.delete(key)\n }\n }\n }\n\n getDefaultDcs(): ITelegramStorage.DcOptions | null {\n return this._state.defaultDcs\n }\n\n setDefaultDcs(dcs: ITelegramStorage.DcOptions | null): void {\n this._state.defaultDcs = dcs\n }\n\n setTempAuthKeyFor(dcId: number, index: number, key: Uint8Array | null, expiresAt: number): void {\n const k = `${dcId}:${index}`\n\n if (key) {\n this._state.authKeysTemp.set(k, key)\n this._state.authKeysTempExpiry.set(k, expiresAt)\n } else {\n this._state.authKeysTemp.delete(k)\n this._state.authKeysTempExpiry.delete(k)\n }\n }\n\n setAuthKeyFor(dcId: number, key: Uint8Array | null): void {\n if (key) {\n this._state.authKeys.set(dcId, key)\n } else {\n this._state.authKeys.delete(dcId)\n }\n }\n\n getAuthKeyFor(dcId: number, tempIndex?: number): Uint8Array | null {\n if (tempIndex !== undefined) {\n const k = `${dcId}:${tempIndex}`\n\n if (Date.now() > (this._state.authKeysTempExpiry.get(k) ?? 0)) {\n return null\n }\n\n return this._state.authKeysTemp.get(k) ?? null\n }\n\n return this._state.authKeys.get(dcId) ?? null\n }\n\n dropAuthKeysFor(dcId: number): void {\n this._state.authKeys.delete(dcId)\n\n for (const key of this._state.authKeysTemp.keys()) {\n if (key.startsWith(`${dcId}:`)) {\n this._state.authKeysTemp.delete(key)\n this._state.authKeysTempExpiry.delete(key)\n }\n }\n }\n\n updatePeers(peers: PeerInfoWithUpdated[]): MaybeAsync<void> {\n for (const peer of peers) {\n this._cachedFull.set(peer.id, peer.full)\n\n peer.updated = Date.now()\n const old = this._state.entities.get(peer.id)\n\n if (old) {\n // delete old index entries if needed\n if (old.username && peer.username !== old.username) {\n this._state.usernameIndex.delete(old.username)\n }\n if (old.phone && old.phone !== peer.phone) {\n this._state.phoneIndex.delete(old.phone)\n }\n }\n\n if (peer.username) {\n this._state.usernameIndex.set(peer.username, peer.id)\n }\n\n if (peer.phone) this._state.phoneIndex.set(peer.phone, peer.id)\n\n this._state.entities.set(peer.id, peer)\n }\n }\n\n protected _getInputPeer(peerInfo?: ITelegramStorage.PeerInfo): tl.TypeInputPeer | null {\n if (!peerInfo) return null\n\n switch (peerInfo.type) {\n case 'user':\n return {\n _: 'inputPeerUser',\n userId: peerInfo.id,\n accessHash: peerInfo.accessHash,\n }\n case 'chat':\n return {\n _: 'inputPeerChat',\n chatId: -peerInfo.id,\n }\n case 'channel':\n return {\n _: 'inputPeerChannel',\n channelId: toggleChannelIdMark(peerInfo.id),\n accessHash: peerInfo.accessHash,\n }\n }\n }\n\n getPeerById(peerId: number): tl.TypeInputPeer | null {\n if (this._cachedInputPeers.has(peerId)) {\n return this._cachedInputPeers.get(peerId)!\n }\n const peer = this._getInputPeer(this._state.entities.get(peerId))\n if (peer) this._cachedInputPeers.set(peerId, peer)\n\n return peer\n }\n\n getPeerByPhone(phone: string): tl.TypeInputPeer | null {\n const peerId = this._state.phoneIndex.get(phone)\n if (!peerId) return null\n\n return this._getInputPeer(this._state.entities.get(peerId))\n }\n\n getPeerByUsername(username: string): tl.TypeInputPeer | null {\n const id = this._state.usernameIndex.get(username.toLowerCase())\n if (!id) return null\n const peer = this._state.entities.get(id)\n if (!peer) return null\n\n if (Date.now() - peer.updated > USERNAME_TTL) return null\n\n return this._getInputPeer(peer)\n }\n\n getSelf(): ITelegramStorage.SelfInfo | null {\n return this._state.self\n }\n\n setSelf(self: ITelegramStorage.SelfInfo | null): void {\n this._state.self = self\n }\n\n setManyChannelPts(values: Map<number, number>): void {\n for (const [id, pts] of values) {\n this._state.pts.set(id, pts)\n }\n }\n\n getChannelPts(entityId: number): number | null {\n return this._state.pts.get(entityId) ?? null\n }\n\n getUpdatesState(): MaybeAsync<[number, number, number, number] | null> {\n return this._state.gpts ?? null\n }\n\n setUpdatesPts(val: number): MaybeAsync<void> {\n if (!this._state.gpts) this._state.gpts = [0, 0, 0, 0]\n this._state.gpts[0] = val\n }\n\n setUpdatesQts(val: number): MaybeAsync<void> {\n if (!this._state.gpts) this._state.gpts = [0, 0, 0, 0]\n this._state.gpts[1] = val\n }\n\n setUpdatesDate(val: number): MaybeAsync<void> {\n if (!this._state.gpts) this._state.gpts = [0, 0, 0, 0]\n this._state.gpts[2] = val\n }\n\n setUpdatesSeq(val: number): MaybeAsync<void> {\n if (!this._state.gpts) this._state.gpts = [0, 0, 0, 0]\n this._state.gpts[3] = val\n }\n\n getFullPeerById(id: number): tl.TypeUser | tl.TypeChat | null {\n return this._cachedFull.get(id) ?? null\n }\n\n // IStateStorage implementation\n\n getState(key: string): unknown {\n const val = this._state.fsm.get(key)\n if (!val) return null\n\n if (val.e && val.e < Date.now()) {\n // expired\n this._state.fsm.delete(key)\n\n return null\n }\n\n return val.v\n }\n\n setState(key: string, state: unknown, ttl?: number): void {\n this._state.fsm.set(key, {\n v: state,\n e: ttl ? Date.now() + ttl * 1000 : undefined,\n })\n }\n\n deleteState(key: string): void {\n this._state.fsm.delete(key)\n }\n\n getCurrentScene(key: string): string | null {\n return this.getState(`$current_scene_${key}`) as string | null\n }\n\n setCurrentScene(key: string, scene: string, ttl?: number): void {\n return this.setState(`$current_scene_${key}`, scene, ttl)\n }\n\n deleteCurrentScene(key: string): void {\n this._state.fsm.delete(`$current_scene_${key}`)\n }\n\n getRateLimit(key: string, limit: number, window: number): [number, number] {\n // leaky bucket\n const now = Date.now()\n\n const item = this._state.rl.get(key)\n\n if (!item) {\n const state = {\n res: now + window * 1000,\n rem: limit,\n }\n\n this._state.rl.set(key, state)\n\n return [state.rem, state.res]\n }\n\n if (item.res < now) {\n // expired\n\n const state = {\n res: now + window * 1000,\n rem: limit,\n }\n\n this._state.rl.set(key, state)\n\n return [state.rem, state.res]\n }\n\n item.rem = item.rem > 0 ? item.rem - 1 : 0\n\n return [item.rem, item.res]\n }\n\n resetRateLimit(key: string): void {\n this._state.rl.delete(key)\n }\n}\n"]}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Base class for all mtcute errors
|
|
3
|
+
*/
|
|
4
|
+
export declare class MtcuteError extends Error {
|
|
5
|
+
}
|
|
6
|
+
/**
|
|
7
|
+
* Method invocation was invalid because some argument
|
|
8
|
+
* passed was invalid.
|
|
9
|
+
*/
|
|
10
|
+
export declare class MtArgumentError extends MtcuteError {
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Something isn't right with security of the connection.
|
|
14
|
+
*/
|
|
15
|
+
export declare class MtSecurityError extends MtcuteError {
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Either you requested or the server returned something
|
|
19
|
+
* that is not (yet) supported.
|
|
20
|
+
*
|
|
21
|
+
* Stay tuned for future updates!
|
|
22
|
+
*
|
|
23
|
+
* In some cases, this error may mean that you are missing some
|
|
24
|
+
* optional peer dependencies, or that the feature is not supported
|
|
25
|
+
* in the current environment.
|
|
26
|
+
*/
|
|
27
|
+
export declare class MtUnsupportedError extends MtcuteError {
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Server returned something of an unexpected type.
|
|
31
|
+
*
|
|
32
|
+
* This is usually a problem on library side.
|
|
33
|
+
* Feel free to open an issue about this!
|
|
34
|
+
*/
|
|
35
|
+
export declare class MtTypeAssertionError extends MtcuteError {
|
|
36
|
+
/**
|
|
37
|
+
* Context at which the error occurred.
|
|
38
|
+
* Usually a user-friendly string containing name
|
|
39
|
+
* of the high-level API method, name of the TL
|
|
40
|
+
* RPC method, and path of the entity,
|
|
41
|
+
* like this: `signIn (@ auth.signIn -> user)`
|
|
42
|
+
*/
|
|
43
|
+
context: string;
|
|
44
|
+
/** Expected TL type */
|
|
45
|
+
expected: string;
|
|
46
|
+
/** Actual TL type */
|
|
47
|
+
actual: string;
|
|
48
|
+
constructor(context: string, expected: string, actual: string);
|
|
49
|
+
}
|
|
50
|
+
export declare class MtTimeoutError extends MtcuteError {
|
|
51
|
+
readonly timeout?: number | undefined;
|
|
52
|
+
constructor(timeout?: number | undefined);
|
|
53
|
+
}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Base class for all mtcute errors
|
|
3
|
+
*/
|
|
4
|
+
export class MtcuteError extends Error {
|
|
5
|
+
}
|
|
6
|
+
/**
|
|
7
|
+
* Method invocation was invalid because some argument
|
|
8
|
+
* passed was invalid.
|
|
9
|
+
*/
|
|
10
|
+
export class MtArgumentError extends MtcuteError {
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Something isn't right with security of the connection.
|
|
14
|
+
*/
|
|
15
|
+
export class MtSecurityError extends MtcuteError {
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Either you requested or the server returned something
|
|
19
|
+
* that is not (yet) supported.
|
|
20
|
+
*
|
|
21
|
+
* Stay tuned for future updates!
|
|
22
|
+
*
|
|
23
|
+
* In some cases, this error may mean that you are missing some
|
|
24
|
+
* optional peer dependencies, or that the feature is not supported
|
|
25
|
+
* in the current environment.
|
|
26
|
+
*/
|
|
27
|
+
export class MtUnsupportedError extends MtcuteError {
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Server returned something of an unexpected type.
|
|
31
|
+
*
|
|
32
|
+
* This is usually a problem on library side.
|
|
33
|
+
* Feel free to open an issue about this!
|
|
34
|
+
*/
|
|
35
|
+
export class MtTypeAssertionError extends MtcuteError {
|
|
36
|
+
constructor(context, expected, actual) {
|
|
37
|
+
super(`Type assertion error at ${context}: expected ${expected}, but got ${actual}`);
|
|
38
|
+
this.context = context;
|
|
39
|
+
this.expected = expected;
|
|
40
|
+
this.actual = actual;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
export class MtTimeoutError extends MtcuteError {
|
|
44
|
+
constructor(timeout) {
|
|
45
|
+
super(`Request timed out${timeout ? ` after ${timeout}ms` : ''}`);
|
|
46
|
+
this.timeout = timeout;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
//# sourceMappingURL=errors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../../src/types/errors.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,OAAO,WAAY,SAAQ,KAAK;CAAG;AAEzC;;;GAGG;AACH,MAAM,OAAO,eAAgB,SAAQ,WAAW;CAAG;AAEnD;;GAEG;AACH,MAAM,OAAO,eAAgB,SAAQ,WAAW;CAAG;AAEnD;;;;;;;;;GASG;AACH,MAAM,OAAO,kBAAmB,SAAQ,WAAW;CAAG;AAEtD;;;;;GAKG;AACH,MAAM,OAAO,oBAAqB,SAAQ,WAAW;IAgBjD,YAAY,OAAe,EAAE,QAAgB,EAAE,MAAc;QACzD,KAAK,CAAC,2BAA2B,OAAO,cAAc,QAAQ,aAAa,MAAM,EAAE,CAAC,CAAA;QACpF,IAAI,CAAC,OAAO,GAAG,OAAO,CAAA;QACtB,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAA;QACxB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAA;IACxB,CAAC;CACJ;AAED,MAAM,OAAO,cAAe,SAAQ,WAAW;IAC3C,YAAqB,OAAgB;QACjC,KAAK,CAAC,oBAAoB,OAAO,CAAC,CAAC,CAAC,UAAU,OAAO,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAA;QADhD,YAAO,GAAP,OAAO,CAAS;IAErC,CAAC;CACJ","sourcesContent":["/**\n * Base class for all mtcute errors\n */\nexport class MtcuteError extends Error {}\n\n/**\n * Method invocation was invalid because some argument\n * passed was invalid.\n */\nexport class MtArgumentError extends MtcuteError {}\n\n/**\n * Something isn't right with security of the connection.\n */\nexport class MtSecurityError extends MtcuteError {}\n\n/**\n * Either you requested or the server returned something\n * that is not (yet) supported.\n *\n * Stay tuned for future updates!\n *\n * In some cases, this error may mean that you are missing some\n * optional peer dependencies, or that the feature is not supported\n * in the current environment.\n */\nexport class MtUnsupportedError extends MtcuteError {}\n\n/**\n * Server returned something of an unexpected type.\n *\n * This is usually a problem on library side.\n * Feel free to open an issue about this!\n */\nexport class MtTypeAssertionError extends MtcuteError {\n /**\n * Context at which the error occurred.\n * Usually a user-friendly string containing name\n * of the high-level API method, name of the TL\n * RPC method, and path of the entity,\n * like this: `signIn (@ auth.signIn -> user)`\n */\n context: string\n\n /** Expected TL type */\n expected: string\n\n /** Actual TL type */\n actual: string\n\n constructor(context: string, expected: string, actual: string) {\n super(`Type assertion error at ${context}: expected ${expected}, but got ${actual}`)\n this.context = context\n this.expected = expected\n this.actual = actual\n }\n}\n\nexport class MtTimeoutError extends MtcuteError {\n constructor(readonly timeout?: number) {\n super(`Request timed out${timeout ? ` after ${timeout}ms` : ''}`)\n }\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/types/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAA;AAC3B,cAAc,YAAY,CAAA;AAC1B,cAAc,YAAY,CAAA","sourcesContent":["export * from './errors.js'\nexport * from './peers.js'\nexport * from './utils.js'\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"peers.js","sourceRoot":"","sources":["../../../src/types/peers.ts"],"names":[],"mappings":"","sourcesContent":["/**\n * Peer types that have one-to-one relation to `tl.Peer*` types.\n */\nexport type BasicPeerType = 'user' | 'chat' | 'channel'\n"]}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export type MaybeAsync<T> = T | Promise<T>;
|
|
2
|
+
export type PartialExcept<T, K extends keyof T> = Partial<Omit<T, K>> & Pick<T, K>;
|
|
3
|
+
export type PartialOnly<T, K extends keyof T> = Partial<Pick<T, K>> & Omit<T, K>;
|
|
4
|
+
export type MaybeArray<T> = T | T[];
|
|
5
|
+
export type MustEqual<T, V> = T extends V ? (V extends T ? T : V) : V;
|
|
6
|
+
export declare function assertNever(x: never): never;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../src/types/utils.ts"],"names":[],"mappings":"AAQA,6DAA6D;AAC7D,MAAM,UAAU,WAAW,CAAC,CAAQ;IAChC,MAAM,IAAI,KAAK,CAAC,eAAe,CAAC,CAAA;AACpC,CAAC","sourcesContent":["export type MaybeAsync<T> = T | Promise<T>\nexport type PartialExcept<T, K extends keyof T> = Partial<Omit<T, K>> & Pick<T, K>\nexport type PartialOnly<T, K extends keyof T> = Partial<Pick<T, K>> & Omit<T, K>\n\nexport type MaybeArray<T> = T | T[]\n\nexport type MustEqual<T, V> = T extends V ? (V extends T ? T : V) : V\n\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nexport function assertNever(x: never): never {\n throw new Error('Illegal state')\n}\n"]}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { Deque } from './deque.js';
|
|
2
|
+
/**
|
|
3
|
+
* Simple class implementing a semaphore like
|
|
4
|
+
* behaviour.
|
|
5
|
+
*/
|
|
6
|
+
export class AsyncLock {
|
|
7
|
+
constructor() {
|
|
8
|
+
this._queue = new Deque();
|
|
9
|
+
}
|
|
10
|
+
async acquire() {
|
|
11
|
+
let info;
|
|
12
|
+
while ((info = this._queue.peekFront())) {
|
|
13
|
+
await info[0];
|
|
14
|
+
}
|
|
15
|
+
let unlock;
|
|
16
|
+
const prom = new Promise((resolve) => {
|
|
17
|
+
unlock = resolve;
|
|
18
|
+
});
|
|
19
|
+
this._queue.pushBack([prom, unlock]);
|
|
20
|
+
}
|
|
21
|
+
release() {
|
|
22
|
+
if (!this._queue.length)
|
|
23
|
+
throw new Error('Nothing to release');
|
|
24
|
+
this._queue.popFront()[1]();
|
|
25
|
+
}
|
|
26
|
+
with(func) {
|
|
27
|
+
let err = null;
|
|
28
|
+
return this.acquire()
|
|
29
|
+
.then(() => func())
|
|
30
|
+
.catch((e) => void (err = e))
|
|
31
|
+
.then(() => {
|
|
32
|
+
this.release();
|
|
33
|
+
// eslint-disable-next-line @typescript-eslint/no-throw-literal
|
|
34
|
+
if (err)
|
|
35
|
+
throw err;
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=async-lock.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"async-lock.js","sourceRoot":"","sources":["../../../src/utils/async-lock.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAA;AAIlC;;;GAGG;AACH,MAAM,OAAO,SAAS;IAAtB;QACY,WAAM,GAAG,IAAI,KAAK,EAAY,CAAA;IAmC1C,CAAC;IAjCG,KAAK,CAAC,OAAO;QACT,IAAI,IAAI,CAAA;QAER,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC,EAAE;YACrC,MAAM,IAAI,CAAC,CAAC,CAAC,CAAA;SAChB;QAED,IAAI,MAAkB,CAAA;QACtB,MAAM,IAAI,GAAG,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE;YACvC,MAAM,GAAG,OAAO,CAAA;QACpB,CAAC,CAAC,CAAA;QAEF,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,IAAI,EAAE,MAAO,CAAC,CAAC,CAAA;IACzC,CAAC;IAED,OAAO;QACH,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM;YAAE,MAAM,IAAI,KAAK,CAAC,oBAAoB,CAAC,CAAA;QAE9D,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAG,CAAC,CAAC,CAAC,EAAE,CAAA;IAChC,CAAC;IAED,IAAI,CAAC,IAAyB;QAC1B,IAAI,GAAG,GAAY,IAAI,CAAA;QAEvB,OAAO,IAAI,CAAC,OAAO,EAAE;aAChB,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,EAAE,CAAC;aAClB,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;aAC5B,IAAI,CAAC,GAAG,EAAE;YACP,IAAI,CAAC,OAAO,EAAE,CAAA;YACd,+DAA+D;YAC/D,IAAI,GAAG;gBAAE,MAAM,GAAG,CAAA;QACtB,CAAC,CAAC,CAAA;IACV,CAAC;CACJ","sourcesContent":["import { Deque } from './deque.js'\n\ntype LockInfo = [Promise<void>, () => void]\n\n/**\n * Simple class implementing a semaphore like\n * behaviour.\n */\nexport class AsyncLock {\n private _queue = new Deque<LockInfo>()\n\n async acquire(): Promise<void> {\n let info\n\n while ((info = this._queue.peekFront())) {\n await info[0]\n }\n\n let unlock: () => void\n const prom = new Promise<void>((resolve) => {\n unlock = resolve\n })\n\n this._queue.pushBack([prom, unlock!])\n }\n\n release(): void {\n if (!this._queue.length) throw new Error('Nothing to release')\n\n this._queue.popFront()![1]()\n }\n\n with(func: () => Promise<void>): Promise<void> {\n let err: unknown = null\n\n return this.acquire()\n .then(() => func())\n .catch((e) => void (err = e))\n .then(() => {\n this.release()\n // eslint-disable-next-line @typescript-eslint/no-throw-literal\n if (err) throw err\n })\n }\n}\n"]}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import bigInt, { BigInteger } from 'big-integer';
|
|
2
|
+
/**
|
|
3
|
+
* Convert a big integer to a buffer
|
|
4
|
+
*
|
|
5
|
+
* @param value Value to convert
|
|
6
|
+
* @param length Length of the resulting buffer (by default it's computed automatically)
|
|
7
|
+
* @param le Whether to use little-endian encoding
|
|
8
|
+
*/
|
|
9
|
+
export declare function bigIntToBuffer(value: BigInteger, length?: number, le?: boolean): Uint8Array;
|
|
10
|
+
/**
|
|
11
|
+
* Convert a buffer to a big integer
|
|
12
|
+
*
|
|
13
|
+
* @param buffer Buffer to convert
|
|
14
|
+
* @param offset Offset to start reading from
|
|
15
|
+
* @param length Length to read
|
|
16
|
+
* @param le Whether to use little-endian encoding
|
|
17
|
+
*/
|
|
18
|
+
export declare function bufferToBigInt(buffer: Uint8Array, offset?: number, length?: number, le?: boolean): BigInteger;
|
|
19
|
+
/**
|
|
20
|
+
* Generate a random big integer of the given size (in bytes)
|
|
21
|
+
* @param size Size in bytes
|
|
22
|
+
*/
|
|
23
|
+
export declare function randomBigInt(size: number): BigInteger;
|
|
24
|
+
/**
|
|
25
|
+
* Generate a random big integer of the given size (in bits)
|
|
26
|
+
* @param bits
|
|
27
|
+
*/
|
|
28
|
+
export declare function randomBigIntBits(bits: number): BigInteger;
|
|
29
|
+
/**
|
|
30
|
+
* Generate a random big integer in the range [min, max)
|
|
31
|
+
*
|
|
32
|
+
* @param max Maximum value (exclusive)
|
|
33
|
+
* @param min Minimum value (inclusive)
|
|
34
|
+
*/
|
|
35
|
+
export declare function randomBigIntInRange(max: BigInteger, min?: bigInt.BigInteger): BigInteger;
|
|
36
|
+
/**
|
|
37
|
+
* Compute the multiplicity of 2 in the prime factorization of n
|
|
38
|
+
* @param n
|
|
39
|
+
*/
|
|
40
|
+
export declare function twoMultiplicity(n: BigInteger): BigInteger;
|