@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,157 @@
|
|
|
1
|
+
/* eslint-disable indent,func-call-spacing */
|
|
2
|
+
import { deeplinkBuilder } from './common.js';
|
|
3
|
+
/**
|
|
4
|
+
* Chat invite links
|
|
5
|
+
*
|
|
6
|
+
* Used to invite users to private groups and channels
|
|
7
|
+
*/
|
|
8
|
+
export const chatInvite = deeplinkBuilder({
|
|
9
|
+
internalBuild: ({ hash }) => ['join', { invite: hash }],
|
|
10
|
+
internalParse: (path, query) => {
|
|
11
|
+
if (path !== 'join')
|
|
12
|
+
return null;
|
|
13
|
+
const invite = query.get('invite');
|
|
14
|
+
if (!invite)
|
|
15
|
+
return null;
|
|
16
|
+
return { hash: invite };
|
|
17
|
+
},
|
|
18
|
+
externalBuild: ({ hash }) => [`+${hash}`, null],
|
|
19
|
+
externalParse: (path) => {
|
|
20
|
+
const m = path.match(/^(?:\+|joinchat\/)([a-zA-Z0-9_-]+)$/);
|
|
21
|
+
if (!m)
|
|
22
|
+
return null;
|
|
23
|
+
if (m[1].match(/^[0-9]+$/)) {
|
|
24
|
+
// phone number
|
|
25
|
+
return null;
|
|
26
|
+
}
|
|
27
|
+
return { hash: m[1] };
|
|
28
|
+
},
|
|
29
|
+
});
|
|
30
|
+
/**
|
|
31
|
+
* Chat folder links
|
|
32
|
+
*/
|
|
33
|
+
export const chatFolder = deeplinkBuilder({
|
|
34
|
+
internalBuild: ({ slug }) => ['addlist', { slug }],
|
|
35
|
+
internalParse: (path, query) => {
|
|
36
|
+
if (path !== 'addlist')
|
|
37
|
+
return null;
|
|
38
|
+
const slug = query.get('slug');
|
|
39
|
+
if (!slug)
|
|
40
|
+
return null;
|
|
41
|
+
return { slug };
|
|
42
|
+
},
|
|
43
|
+
externalBuild: ({ slug }) => [`addlist/${slug}`, null],
|
|
44
|
+
externalParse: (path) => {
|
|
45
|
+
const [prefix, slug] = path.split('/');
|
|
46
|
+
if (prefix !== 'addlist')
|
|
47
|
+
return null;
|
|
48
|
+
return { slug };
|
|
49
|
+
},
|
|
50
|
+
});
|
|
51
|
+
function parseMediaTimestamp(timestamp) {
|
|
52
|
+
let m;
|
|
53
|
+
if ((m = timestamp.match(/^(\d+)$/))) {
|
|
54
|
+
return Number(m[1]);
|
|
55
|
+
}
|
|
56
|
+
if ((m = timestamp.match(/^(\d+):(\d{1,2})$/))) {
|
|
57
|
+
return Number(m[1]) * 60 + Number(m[2]);
|
|
58
|
+
}
|
|
59
|
+
if ((m = timestamp.match(/^(?:(\d+)h)?(?:(\d{1,2})m)?(?:(\d{1,2})s)$/))) {
|
|
60
|
+
return (Number(m[1]) || 0) * 3600 + (Number(m[2]) || 0) * 60 + (Number(m[3]) || 0);
|
|
61
|
+
}
|
|
62
|
+
return undefined;
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Message links
|
|
66
|
+
*
|
|
67
|
+
* Used to link to specific messages in public or private groups and channels.
|
|
68
|
+
*
|
|
69
|
+
* Note: `channelId` is a non-marked channel ID
|
|
70
|
+
*/
|
|
71
|
+
export const message = deeplinkBuilder({
|
|
72
|
+
internalBuild: (params) => {
|
|
73
|
+
const common = {
|
|
74
|
+
post: params.id,
|
|
75
|
+
thread: params.threadId,
|
|
76
|
+
comment: params.commentId,
|
|
77
|
+
t: params.mediaTimestamp,
|
|
78
|
+
single: params.single ? '' : undefined,
|
|
79
|
+
};
|
|
80
|
+
if ('username' in params) {
|
|
81
|
+
return ['resolve', { domain: params.username, ...common }];
|
|
82
|
+
}
|
|
83
|
+
return ['privatepost', { channel: params.channelId, ...common }];
|
|
84
|
+
},
|
|
85
|
+
internalParse: (path, query) => {
|
|
86
|
+
const common = {
|
|
87
|
+
id: Number(query.get('post')),
|
|
88
|
+
threadId: query.has('thread') ? Number(query.get('thread')) : undefined,
|
|
89
|
+
commentId: query.has('comment') ? Number(query.get('comment')) : undefined,
|
|
90
|
+
mediaTimestamp: query.has('t') ? parseMediaTimestamp(query.get('t')) : undefined,
|
|
91
|
+
single: query.has('single'),
|
|
92
|
+
};
|
|
93
|
+
if (path === 'resolve') {
|
|
94
|
+
const username = query.get('domain');
|
|
95
|
+
if (!username)
|
|
96
|
+
return null;
|
|
97
|
+
return { username, ...common };
|
|
98
|
+
}
|
|
99
|
+
if (path === 'privatepost') {
|
|
100
|
+
const channelId = Number(query.get('channel'));
|
|
101
|
+
if (!channelId)
|
|
102
|
+
return null;
|
|
103
|
+
return { channelId, ...common };
|
|
104
|
+
}
|
|
105
|
+
return null;
|
|
106
|
+
},
|
|
107
|
+
externalBuild: (params) => {
|
|
108
|
+
const common = {
|
|
109
|
+
comment: params.commentId,
|
|
110
|
+
t: params.mediaTimestamp,
|
|
111
|
+
single: params.single ? '' : undefined,
|
|
112
|
+
};
|
|
113
|
+
if ('username' in params) {
|
|
114
|
+
if (params.threadId) {
|
|
115
|
+
return [`${params.username}/${params.threadId}/${params.id}`, common];
|
|
116
|
+
}
|
|
117
|
+
return [`${params.username}/${params.id}`, common];
|
|
118
|
+
}
|
|
119
|
+
if (params.threadId) {
|
|
120
|
+
return [`c/${params.channelId}/${params.threadId}/${params.id}`, common];
|
|
121
|
+
}
|
|
122
|
+
return [`c/${params.channelId}/${params.id}`, common];
|
|
123
|
+
},
|
|
124
|
+
externalParse: (path, query) => {
|
|
125
|
+
const chunks = path.split('/');
|
|
126
|
+
if (chunks.length < 2)
|
|
127
|
+
return null;
|
|
128
|
+
const id = Number(chunks[chunks.length - 1]);
|
|
129
|
+
if (isNaN(id))
|
|
130
|
+
return null;
|
|
131
|
+
const common = {
|
|
132
|
+
id,
|
|
133
|
+
commentId: query.has('comment') ? Number(query.get('comment')) : undefined,
|
|
134
|
+
mediaTimestamp: query.has('t') ? parseMediaTimestamp(query.get('t')) : undefined,
|
|
135
|
+
single: query.has('single'),
|
|
136
|
+
};
|
|
137
|
+
if (chunks[0] === 'c') {
|
|
138
|
+
const channelId = Number(chunks[1]);
|
|
139
|
+
if (isNaN(channelId))
|
|
140
|
+
return null;
|
|
141
|
+
return {
|
|
142
|
+
channelId,
|
|
143
|
+
threadId: chunks[3] ? Number(chunks[2]) : undefined,
|
|
144
|
+
...common,
|
|
145
|
+
};
|
|
146
|
+
}
|
|
147
|
+
const username = chunks[0];
|
|
148
|
+
if (username[0] === '+')
|
|
149
|
+
return null;
|
|
150
|
+
return {
|
|
151
|
+
username,
|
|
152
|
+
threadId: chunks[2] ? Number(chunks[1]) : undefined,
|
|
153
|
+
...common,
|
|
154
|
+
};
|
|
155
|
+
},
|
|
156
|
+
});
|
|
157
|
+
//# sourceMappingURL=chat.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chat.js","sourceRoot":"","sources":["../../../../src/utils/links/chat.ts"],"names":[],"mappings":"AAAA,6CAA6C;AAC7C,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAA;AAE7C;;;;GAIG;AACH,MAAM,CAAC,MAAM,UAAU,GAAG,eAAe,CAAmB;IACxD,aAAa,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;IACvD,aAAa,EAAE,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE;QAC3B,IAAI,IAAI,KAAK,MAAM;YAAE,OAAO,IAAI,CAAA;QAEhC,MAAM,MAAM,GAAG,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAA;QAClC,IAAI,CAAC,MAAM;YAAE,OAAO,IAAI,CAAA;QAExB,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,CAAA;IAC3B,CAAC;IACD,aAAa,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC,IAAI,IAAI,EAAE,EAAE,IAAI,CAAC;IAC/C,aAAa,EAAE,CAAC,IAAI,EAAE,EAAE;QACpB,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,qCAAqC,CAAC,CAAA;QAC3D,IAAI,CAAC,CAAC;YAAE,OAAO,IAAI,CAAA;QAEnB,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,UAAU,CAAC,EAAE;YACxB,eAAe;YACf,OAAO,IAAI,CAAA;SACd;QAED,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAA;IACzB,CAAC;CACJ,CAAC,CAAA;AAEF;;GAEG;AACH,MAAM,CAAC,MAAM,UAAU,GAAG,eAAe,CAAmB;IACxD,aAAa,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC,SAAS,EAAE,EAAE,IAAI,EAAE,CAAC;IAClD,aAAa,EAAE,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE;QAC3B,IAAI,IAAI,KAAK,SAAS;YAAE,OAAO,IAAI,CAAA;QAEnC,MAAM,IAAI,GAAG,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,CAAA;QAC9B,IAAI,CAAC,IAAI;YAAE,OAAO,IAAI,CAAA;QAEtB,OAAO,EAAE,IAAI,EAAE,CAAA;IACnB,CAAC;IACD,aAAa,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC,WAAW,IAAI,EAAE,EAAE,IAAI,CAAC;IACtD,aAAa,EAAE,CAAC,IAAI,EAAE,EAAE;QACpB,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;QACtC,IAAI,MAAM,KAAK,SAAS;YAAE,OAAO,IAAI,CAAA;QAErC,OAAO,EAAE,IAAI,EAAE,CAAA;IACnB,CAAC;CACJ,CAAC,CAAA;AAEF,SAAS,mBAAmB,CAAC,SAAiB;IAC1C,IAAI,CAAC,CAAA;IAEL,IAAI,CAAC,CAAC,GAAG,SAAS,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,EAAE;QAClC,OAAO,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;KACtB;IAED,IAAI,CAAC,CAAC,GAAG,SAAS,CAAC,KAAK,CAAC,mBAAmB,CAAC,CAAC,EAAE;QAC5C,OAAO,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;KAC1C;IAED,IAAI,CAAC,CAAC,GAAG,SAAS,CAAC,KAAK,CAAC,4CAA4C,CAAC,CAAC,EAAE;QACrE,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAA;KACrF;IAED,OAAO,SAAS,CAAA;AACpB,CAAC;AAED;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,OAAO,GAAG,eAAe,CAyBpC;IACE,aAAa,EAAE,CAAC,MAAM,EAAE,EAAE;QACtB,MAAM,MAAM,GAAG;YACX,IAAI,EAAE,MAAM,CAAC,EAAE;YACf,MAAM,EAAE,MAAM,CAAC,QAAQ;YACvB,OAAO,EAAE,MAAM,CAAC,SAAS;YACzB,CAAC,EAAE,MAAM,CAAC,cAAc;YACxB,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS;SACzC,CAAA;QAED,IAAI,UAAU,IAAI,MAAM,EAAE;YACtB,OAAO,CAAC,SAAS,EAAE,EAAE,MAAM,EAAE,MAAM,CAAC,QAAQ,EAAE,GAAG,MAAM,EAAE,CAAC,CAAA;SAC7D;QAED,OAAO,CAAC,aAAa,EAAE,EAAE,OAAO,EAAE,MAAM,CAAC,SAAS,EAAE,GAAG,MAAM,EAAE,CAAC,CAAA;IACpE,CAAC;IACD,aAAa,EAAE,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE;QAC3B,MAAM,MAAM,GAAG;YACX,EAAE,EAAE,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;YAC7B,QAAQ,EAAE,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS;YACvE,SAAS,EAAE,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS;YAC1E,cAAc,EAAE,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,mBAAmB,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAE,CAAC,CAAC,CAAC,CAAC,SAAS;YACjF,MAAM,EAAE,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC;SAC9B,CAAA;QAED,IAAI,IAAI,KAAK,SAAS,EAAE;YACpB,MAAM,QAAQ,GAAG,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAA;YACpC,IAAI,CAAC,QAAQ;gBAAE,OAAO,IAAI,CAAA;YAE1B,OAAO,EAAE,QAAQ,EAAE,GAAG,MAAM,EAAE,CAAA;SACjC;QAED,IAAI,IAAI,KAAK,aAAa,EAAE;YACxB,MAAM,SAAS,GAAG,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAA;YAC9C,IAAI,CAAC,SAAS;gBAAE,OAAO,IAAI,CAAA;YAE3B,OAAO,EAAE,SAAS,EAAE,GAAG,MAAM,EAAE,CAAA;SAClC;QAED,OAAO,IAAI,CAAA;IACf,CAAC;IAED,aAAa,EAAE,CAAC,MAAM,EAAE,EAAE;QACtB,MAAM,MAAM,GAAG;YACX,OAAO,EAAE,MAAM,CAAC,SAAS;YACzB,CAAC,EAAE,MAAM,CAAC,cAAc;YACxB,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS;SACzC,CAAA;QAED,IAAI,UAAU,IAAI,MAAM,EAAE;YACtB,IAAI,MAAM,CAAC,QAAQ,EAAE;gBACjB,OAAO,CAAC,GAAG,MAAM,CAAC,QAAQ,IAAI,MAAM,CAAC,QAAQ,IAAI,MAAM,CAAC,EAAE,EAAE,EAAE,MAAM,CAAC,CAAA;aACxE;YAED,OAAO,CAAC,GAAG,MAAM,CAAC,QAAQ,IAAI,MAAM,CAAC,EAAE,EAAE,EAAE,MAAM,CAAC,CAAA;SACrD;QAED,IAAI,MAAM,CAAC,QAAQ,EAAE;YACjB,OAAO,CAAC,KAAK,MAAM,CAAC,SAAS,IAAI,MAAM,CAAC,QAAQ,IAAI,MAAM,CAAC,EAAE,EAAE,EAAE,MAAM,CAAC,CAAA;SAC3E;QAED,OAAO,CAAC,KAAK,MAAM,CAAC,SAAS,IAAI,MAAM,CAAC,EAAE,EAAE,EAAE,MAAM,CAAC,CAAA;IACzD,CAAC;IACD,aAAa,EAAE,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE;QAC3B,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;QAE9B,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC;YAAE,OAAO,IAAI,CAAA;QAElC,MAAM,EAAE,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAA;QAC5C,IAAI,KAAK,CAAC,EAAE,CAAC;YAAE,OAAO,IAAI,CAAA;QAE1B,MAAM,MAAM,GAAG;YACX,EAAE;YACF,SAAS,EAAE,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS;YAC1E,cAAc,EAAE,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,mBAAmB,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAE,CAAC,CAAC,CAAC,CAAC,SAAS;YACjF,MAAM,EAAE,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC;SAC9B,CAAA;QAED,IAAI,MAAM,CAAC,CAAC,CAAC,KAAK,GAAG,EAAE;YACnB,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAA;YACnC,IAAI,KAAK,CAAC,SAAS,CAAC;gBAAE,OAAO,IAAI,CAAA;YAEjC,OAAO;gBACH,SAAS;gBACT,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS;gBACnD,GAAG,MAAM;aACZ,CAAA;SACJ;QAED,MAAM,QAAQ,GAAG,MAAM,CAAC,CAAC,CAAC,CAAA;QAC1B,IAAI,QAAQ,CAAC,CAAC,CAAC,KAAK,GAAG;YAAE,OAAO,IAAI,CAAA;QAEpC,OAAO;YACH,QAAQ;YACR,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS;YACnD,GAAG,MAAM;SACZ,CAAA;IACL,CAAC;CACJ,CAAC,CAAA","sourcesContent":["/* eslint-disable indent,func-call-spacing */\nimport { deeplinkBuilder } from './common.js'\n\n/**\n * Chat invite links\n *\n * Used to invite users to private groups and channels\n */\nexport const chatInvite = deeplinkBuilder<{ hash: string }>({\n internalBuild: ({ hash }) => ['join', { invite: hash }],\n internalParse: (path, query) => {\n if (path !== 'join') return null\n\n const invite = query.get('invite')\n if (!invite) return null\n\n return { hash: invite }\n },\n externalBuild: ({ hash }) => [`+${hash}`, null],\n externalParse: (path) => {\n const m = path.match(/^(?:\\+|joinchat\\/)([a-zA-Z0-9_-]+)$/)\n if (!m) return null\n\n if (m[1].match(/^[0-9]+$/)) {\n // phone number\n return null\n }\n\n return { hash: m[1] }\n },\n})\n\n/**\n * Chat folder links\n */\nexport const chatFolder = deeplinkBuilder<{ slug: string }>({\n internalBuild: ({ slug }) => ['addlist', { slug }],\n internalParse: (path, query) => {\n if (path !== 'addlist') return null\n\n const slug = query.get('slug')\n if (!slug) return null\n\n return { slug }\n },\n externalBuild: ({ slug }) => [`addlist/${slug}`, null],\n externalParse: (path) => {\n const [prefix, slug] = path.split('/')\n if (prefix !== 'addlist') return null\n\n return { slug }\n },\n})\n\nfunction parseMediaTimestamp(timestamp: string) {\n let m\n\n if ((m = timestamp.match(/^(\\d+)$/))) {\n return Number(m[1])\n }\n\n if ((m = timestamp.match(/^(\\d+):(\\d{1,2})$/))) {\n return Number(m[1]) * 60 + Number(m[2])\n }\n\n if ((m = timestamp.match(/^(?:(\\d+)h)?(?:(\\d{1,2})m)?(?:(\\d{1,2})s)$/))) {\n return (Number(m[1]) || 0) * 3600 + (Number(m[2]) || 0) * 60 + (Number(m[3]) || 0)\n }\n\n return undefined\n}\n\n/**\n * Message links\n *\n * Used to link to specific messages in public or private groups and channels.\n *\n * Note: `channelId` is a non-marked channel ID\n */\nexport const message = deeplinkBuilder<\n ({ username: string } | { channelId: number }) & {\n /** Message ID */\n id: number\n /** Thread ID */\n threadId?: number\n\n /**\n * For comments, `id` will contain the message ID of the channel message that started\n * the comment section and this field will contain the message ID of the comment in\n * the discussion group.\n */\n commentId?: number\n\n /**\n * Timestamp at which to start playing the media file present\n * in the body or in the webpage preview of the message\n */\n mediaTimestamp?: number\n\n /**\n * Whether this is a link to a specific message in the album or to the entire album\n */\n single?: boolean\n }\n>({\n internalBuild: (params) => {\n const common = {\n post: params.id,\n thread: params.threadId,\n comment: params.commentId,\n t: params.mediaTimestamp,\n single: params.single ? '' : undefined,\n }\n\n if ('username' in params) {\n return ['resolve', { domain: params.username, ...common }]\n }\n\n return ['privatepost', { channel: params.channelId, ...common }]\n },\n internalParse: (path, query) => {\n const common = {\n id: Number(query.get('post')),\n threadId: query.has('thread') ? Number(query.get('thread')) : undefined,\n commentId: query.has('comment') ? Number(query.get('comment')) : undefined,\n mediaTimestamp: query.has('t') ? parseMediaTimestamp(query.get('t')!) : undefined,\n single: query.has('single'),\n }\n\n if (path === 'resolve') {\n const username = query.get('domain')\n if (!username) return null\n\n return { username, ...common }\n }\n\n if (path === 'privatepost') {\n const channelId = Number(query.get('channel'))\n if (!channelId) return null\n\n return { channelId, ...common }\n }\n\n return null\n },\n\n externalBuild: (params) => {\n const common = {\n comment: params.commentId,\n t: params.mediaTimestamp,\n single: params.single ? '' : undefined,\n }\n\n if ('username' in params) {\n if (params.threadId) {\n return [`${params.username}/${params.threadId}/${params.id}`, common]\n }\n\n return [`${params.username}/${params.id}`, common]\n }\n\n if (params.threadId) {\n return [`c/${params.channelId}/${params.threadId}/${params.id}`, common]\n }\n\n return [`c/${params.channelId}/${params.id}`, common]\n },\n externalParse: (path, query) => {\n const chunks = path.split('/')\n\n if (chunks.length < 2) return null\n\n const id = Number(chunks[chunks.length - 1])\n if (isNaN(id)) return null\n\n const common = {\n id,\n commentId: query.has('comment') ? Number(query.get('comment')) : undefined,\n mediaTimestamp: query.has('t') ? parseMediaTimestamp(query.get('t')!) : undefined,\n single: query.has('single'),\n }\n\n if (chunks[0] === 'c') {\n const channelId = Number(chunks[1])\n if (isNaN(channelId)) return null\n\n return {\n channelId,\n threadId: chunks[3] ? Number(chunks[2]) : undefined,\n ...common,\n }\n }\n\n const username = chunks[0]\n if (username[0] === '+') return null\n\n return {\n username,\n threadId: chunks[2] ? Number(chunks[1]) : undefined,\n ...common,\n }\n },\n})\n"]}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
export interface CommonDeeplinkOptions {
|
|
2
|
+
/**
|
|
3
|
+
* Protocol to use for deeplink
|
|
4
|
+
* - `tg` - use `tg://` protocol links (default)
|
|
5
|
+
* - `http` - use `http://` protocol
|
|
6
|
+
* - `https` - use `https://` protocol
|
|
7
|
+
* - `none` - don't use any protocol
|
|
8
|
+
*
|
|
9
|
+
* @default 'https'
|
|
10
|
+
*/
|
|
11
|
+
protocol?: 'tg' | 'http' | 'https' | 'none';
|
|
12
|
+
/**
|
|
13
|
+
* For protocols except `tg://`, domain to use
|
|
14
|
+
*
|
|
15
|
+
* @default 't.me'
|
|
16
|
+
*/
|
|
17
|
+
domain?: string;
|
|
18
|
+
}
|
|
19
|
+
type InputQuery = Record<string, string | number | true | undefined> | null;
|
|
20
|
+
interface BuildDeeplinkOptions<T> {
|
|
21
|
+
internalBuild?: (options: T) => [string, InputQuery];
|
|
22
|
+
internalParse?: (path: string, query: URLSearchParams) => T | null;
|
|
23
|
+
externalBuild?: (options: T) => [string, InputQuery];
|
|
24
|
+
externalParse?: (path: string, query: URLSearchParams) => T | null;
|
|
25
|
+
}
|
|
26
|
+
export type Deeplink<T> = {
|
|
27
|
+
(options: T & CommonDeeplinkOptions): string;
|
|
28
|
+
parse: (url: string) => T | null;
|
|
29
|
+
};
|
|
30
|
+
export declare function deeplinkBuilder<T>(params: BuildDeeplinkOptions<T>): Deeplink<T>;
|
|
31
|
+
export {};
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
function writeQuery(query) {
|
|
2
|
+
if (!query)
|
|
3
|
+
return '';
|
|
4
|
+
let str = '';
|
|
5
|
+
for (const [key, value] of Object.entries(query)) {
|
|
6
|
+
// eslint-disable-next-line eqeqeq
|
|
7
|
+
if (value == undefined)
|
|
8
|
+
continue;
|
|
9
|
+
if (str)
|
|
10
|
+
str += '&';
|
|
11
|
+
if (value === true) {
|
|
12
|
+
str += `${key}`;
|
|
13
|
+
continue;
|
|
14
|
+
}
|
|
15
|
+
str += `${key}=${encodeURIComponent(value)}`;
|
|
16
|
+
}
|
|
17
|
+
if (!str)
|
|
18
|
+
return '';
|
|
19
|
+
return `?${str}`;
|
|
20
|
+
}
|
|
21
|
+
export function deeplinkBuilder(params) {
|
|
22
|
+
const { internalBuild, internalParse, externalBuild, externalParse } = params;
|
|
23
|
+
const fn_ = (options) => {
|
|
24
|
+
const { protocol = 'https', domain = 't.me', ...rest } = options;
|
|
25
|
+
if (protocol === 'tg') {
|
|
26
|
+
if (!internalBuild)
|
|
27
|
+
throw new Error('tg:// deeplink is not supported');
|
|
28
|
+
const [path, query] = internalBuild(rest);
|
|
29
|
+
return `tg://${path}${writeQuery(query)}`;
|
|
30
|
+
}
|
|
31
|
+
if (!externalBuild)
|
|
32
|
+
throw new Error('t.me deeplink is not supported');
|
|
33
|
+
const [path, query] = externalBuild(rest);
|
|
34
|
+
return `${protocol}://${domain}/${path}${writeQuery(query)}`;
|
|
35
|
+
};
|
|
36
|
+
const fn = fn_;
|
|
37
|
+
fn.parse = (url) => {
|
|
38
|
+
const isInternal = url.startsWith('tg://');
|
|
39
|
+
// URL with non-standard protocols has bad behavior across environments
|
|
40
|
+
if (isInternal)
|
|
41
|
+
url = `https://fake/${url.slice(5)}`;
|
|
42
|
+
const parsed = new URL(url);
|
|
43
|
+
if (isInternal) {
|
|
44
|
+
if (!internalParse)
|
|
45
|
+
throw new Error('tg:// deeplink is not supported');
|
|
46
|
+
const path = parsed.pathname.slice(1);
|
|
47
|
+
return internalParse(path, parsed.searchParams);
|
|
48
|
+
}
|
|
49
|
+
if (!externalParse)
|
|
50
|
+
throw new Error('t.me deeplink is not supported');
|
|
51
|
+
const path = parsed.pathname.slice(1);
|
|
52
|
+
return externalParse(path, parsed.searchParams);
|
|
53
|
+
};
|
|
54
|
+
return fn;
|
|
55
|
+
}
|
|
56
|
+
//# sourceMappingURL=common.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"common.js","sourceRoot":"","sources":["../../../../src/utils/links/common.ts"],"names":[],"mappings":"AAmCA,SAAS,UAAU,CAAC,KAAiB;IACjC,IAAI,CAAC,KAAK;QAAE,OAAO,EAAE,CAAA;IAErB,IAAI,GAAG,GAAG,EAAE,CAAA;IAEZ,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;QAC9C,kCAAkC;QAClC,IAAI,KAAK,IAAI,SAAS;YAAE,SAAQ;QAEhC,IAAI,GAAG;YAAE,GAAG,IAAI,GAAG,CAAA;QAEnB,IAAI,KAAK,KAAK,IAAI,EAAE;YAChB,GAAG,IAAI,GAAG,GAAG,EAAE,CAAA;YACf,SAAQ;SACX;QAED,GAAG,IAAI,GAAG,GAAG,IAAI,kBAAkB,CAAC,KAAK,CAAC,EAAE,CAAA;KAC/C;IAED,IAAI,CAAC,GAAG;QAAE,OAAO,EAAE,CAAA;IAEnB,OAAO,IAAI,GAAG,EAAE,CAAA;AACpB,CAAC;AAED,MAAM,UAAU,eAAe,CAAI,MAA+B;IAC9D,MAAM,EAAE,aAAa,EAAE,aAAa,EAAE,aAAa,EAAE,aAAa,EAAE,GAAG,MAAM,CAAA;IAE7E,MAAM,GAAG,GAAG,CAAC,OAAkC,EAAE,EAAE;QAC/C,MAAM,EAAE,QAAQ,GAAG,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,IAAI,EAAE,GAAG,OAAO,CAAA;QAEhE,IAAI,QAAQ,KAAK,IAAI,EAAE;YACnB,IAAI,CAAC,aAAa;gBAAE,MAAM,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAA;YAEtE,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,GAAG,aAAa,CAAC,IAAS,CAAC,CAAA;YAE9C,OAAO,QAAQ,IAAI,GAAG,UAAU,CAAC,KAAK,CAAC,EAAE,CAAA;SAC5C;QAED,IAAI,CAAC,aAAa;YAAE,MAAM,IAAI,KAAK,CAAC,gCAAgC,CAAC,CAAA;QAErE,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,GAAG,aAAa,CAAC,IAAS,CAAC,CAAA;QAE9C,OAAO,GAAG,QAAQ,MAAM,MAAM,IAAI,IAAI,GAAG,UAAU,CAAC,KAAK,CAAC,EAAE,CAAA;IAChE,CAAC,CAAA;IAED,MAAM,EAAE,GAAG,GAAkB,CAAA;IAE7B,EAAE,CAAC,KAAK,GAAG,CAAC,GAAW,EAAE,EAAE;QACvB,MAAM,UAAU,GAAG,GAAG,CAAC,UAAU,CAAC,OAAO,CAAC,CAAA;QAE1C,uEAAuE;QACvE,IAAI,UAAU;YAAE,GAAG,GAAG,gBAAgB,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAA;QAEpD,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAA;QAE3B,IAAI,UAAU,EAAE;YACZ,IAAI,CAAC,aAAa;gBAAE,MAAM,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAA;YAEtE,MAAM,IAAI,GAAG,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;YAErC,OAAO,aAAa,CAAC,IAAI,EAAE,MAAM,CAAC,YAAY,CAAC,CAAA;SAClD;QAED,IAAI,CAAC,aAAa;YAAE,MAAM,IAAI,KAAK,CAAC,gCAAgC,CAAC,CAAA;QAErE,MAAM,IAAI,GAAG,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;QAErC,OAAO,aAAa,CAAC,IAAI,EAAE,MAAM,CAAC,YAAY,CAAC,CAAA;IACnD,CAAC,CAAA;IAED,OAAO,EAAE,CAAA;AACb,CAAC","sourcesContent":["export interface CommonDeeplinkOptions {\n /**\n * Protocol to use for deeplink\n * - `tg` - use `tg://` protocol links (default)\n * - `http` - use `http://` protocol\n * - `https` - use `https://` protocol\n * - `none` - don't use any protocol\n *\n * @default 'https'\n */\n protocol?: 'tg' | 'http' | 'https' | 'none'\n\n /**\n * For protocols except `tg://`, domain to use\n *\n * @default 't.me'\n */\n domain?: string\n}\n\ntype InputQuery = Record<string, string | number | true | undefined> | null\n\ninterface BuildDeeplinkOptions<T> {\n internalBuild?: (options: T) => [string, InputQuery]\n internalParse?: (path: string, query: URLSearchParams) => T | null\n\n externalBuild?: (options: T) => [string, InputQuery]\n externalParse?: (path: string, query: URLSearchParams) => T | null\n}\n\nexport type Deeplink<T> = {\n (options: T & CommonDeeplinkOptions): string\n parse: (url: string) => T | null\n}\n\nfunction writeQuery(query: InputQuery) {\n if (!query) return ''\n\n let str = ''\n\n for (const [key, value] of Object.entries(query)) {\n // eslint-disable-next-line eqeqeq\n if (value == undefined) continue\n\n if (str) str += '&'\n\n if (value === true) {\n str += `${key}`\n continue\n }\n\n str += `${key}=${encodeURIComponent(value)}`\n }\n\n if (!str) return ''\n\n return `?${str}`\n}\n\nexport function deeplinkBuilder<T>(params: BuildDeeplinkOptions<T>): Deeplink<T> {\n const { internalBuild, internalParse, externalBuild, externalParse } = params\n\n const fn_ = (options: T & CommonDeeplinkOptions) => {\n const { protocol = 'https', domain = 't.me', ...rest } = options\n\n if (protocol === 'tg') {\n if (!internalBuild) throw new Error('tg:// deeplink is not supported')\n\n const [path, query] = internalBuild(rest as T)\n\n return `tg://${path}${writeQuery(query)}`\n }\n\n if (!externalBuild) throw new Error('t.me deeplink is not supported')\n\n const [path, query] = externalBuild(rest as T)\n\n return `${protocol}://${domain}/${path}${writeQuery(query)}`\n }\n\n const fn = fn_ as Deeplink<T>\n\n fn.parse = (url: string) => {\n const isInternal = url.startsWith('tg://')\n\n // URL with non-standard protocols has bad behavior across environments\n if (isInternal) url = `https://fake/${url.slice(5)}`\n\n const parsed = new URL(url)\n\n if (isInternal) {\n if (!internalParse) throw new Error('tg:// deeplink is not supported')\n\n const path = parsed.pathname.slice(1)\n\n return internalParse(path, parsed.searchParams)\n }\n\n if (!externalParse) throw new Error('t.me deeplink is not supported')\n\n const path = parsed.pathname.slice(1)\n\n return externalParse(path, parsed.searchParams)\n }\n\n return fn\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/utils/links/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,aAAa,CAAA;AACpC,OAAO,EAAE,KAAK,EAAE,CAAA","sourcesContent":["import * as links from './bundle.js'\nexport { links }\n"]}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Share links
|
|
3
|
+
*
|
|
4
|
+
* Used to share a prepared message and URL into a chosen chat's text field.
|
|
5
|
+
*/
|
|
6
|
+
export declare const share: import("./common.js").Deeplink<{
|
|
7
|
+
url: string;
|
|
8
|
+
text?: string | undefined;
|
|
9
|
+
}>;
|
|
10
|
+
/**
|
|
11
|
+
* Boost links
|
|
12
|
+
*
|
|
13
|
+
* Used by users to boost channels, granting them the ability to post stories.
|
|
14
|
+
*/
|
|
15
|
+
export declare const boost: import("./common.js").Deeplink<{
|
|
16
|
+
username: string;
|
|
17
|
+
} | {
|
|
18
|
+
channelId: number;
|
|
19
|
+
}>;
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import { deeplinkBuilder } from './common.js';
|
|
2
|
+
/**
|
|
3
|
+
* Share links
|
|
4
|
+
*
|
|
5
|
+
* Used to share a prepared message and URL into a chosen chat's text field.
|
|
6
|
+
*/
|
|
7
|
+
export const share = deeplinkBuilder({
|
|
8
|
+
internalBuild: ({ url, text }) => ['msg_url', { url, text }],
|
|
9
|
+
internalParse: (path, query) => {
|
|
10
|
+
if (path !== 'msg_url')
|
|
11
|
+
return null;
|
|
12
|
+
const url = query.get('url');
|
|
13
|
+
if (!url)
|
|
14
|
+
return null;
|
|
15
|
+
const text = query.get('text');
|
|
16
|
+
return { url, text: text || undefined };
|
|
17
|
+
},
|
|
18
|
+
externalBuild: ({ url, text }) => ['share', { url, text }],
|
|
19
|
+
externalParse: (path, query) => {
|
|
20
|
+
if (path !== 'share')
|
|
21
|
+
return null;
|
|
22
|
+
const url = query.get('url');
|
|
23
|
+
if (!url)
|
|
24
|
+
return null;
|
|
25
|
+
const text = query.get('text');
|
|
26
|
+
return { url, text: text || undefined };
|
|
27
|
+
},
|
|
28
|
+
});
|
|
29
|
+
/**
|
|
30
|
+
* Boost links
|
|
31
|
+
*
|
|
32
|
+
* Used by users to boost channels, granting them the ability to post stories.
|
|
33
|
+
*/
|
|
34
|
+
export const boost = deeplinkBuilder({
|
|
35
|
+
internalBuild: (params) => {
|
|
36
|
+
if ('username' in params) {
|
|
37
|
+
return ['boost', { domain: params.username }];
|
|
38
|
+
}
|
|
39
|
+
return ['boost', { channel: params.channelId }];
|
|
40
|
+
},
|
|
41
|
+
internalParse: (path, query) => {
|
|
42
|
+
if (path !== 'boost')
|
|
43
|
+
return null;
|
|
44
|
+
const username = query.get('domain');
|
|
45
|
+
if (username) {
|
|
46
|
+
return { username };
|
|
47
|
+
}
|
|
48
|
+
const channelId = Number(query.get('channel'));
|
|
49
|
+
if (!isNaN(channelId)) {
|
|
50
|
+
return { channelId: Number(channelId) };
|
|
51
|
+
}
|
|
52
|
+
return null;
|
|
53
|
+
},
|
|
54
|
+
externalBuild: (params) => {
|
|
55
|
+
if ('username' in params) {
|
|
56
|
+
return [params.username, { boost: true }];
|
|
57
|
+
}
|
|
58
|
+
return [`c/${params.channelId}`, { boost: true }];
|
|
59
|
+
},
|
|
60
|
+
externalParse: (path, query) => {
|
|
61
|
+
if (!query.has('boost'))
|
|
62
|
+
return null;
|
|
63
|
+
if (path.startsWith('c/')) {
|
|
64
|
+
const channelId = Number(path.slice(2));
|
|
65
|
+
if (isNaN(channelId))
|
|
66
|
+
return null;
|
|
67
|
+
return { channelId };
|
|
68
|
+
}
|
|
69
|
+
if (path.includes('/'))
|
|
70
|
+
return null;
|
|
71
|
+
return { username: path };
|
|
72
|
+
},
|
|
73
|
+
});
|
|
74
|
+
//# sourceMappingURL=misc.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"misc.js","sourceRoot":"","sources":["../../../../src/utils/links/misc.ts"],"names":[],"mappings":"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","sourcesContent":["import { deeplinkBuilder } from './common.js'\n\n/**\n * Share links\n *\n * Used to share a prepared message and URL into a chosen chat's text field.\n */\nexport const share = deeplinkBuilder<{ url: string; text?: string }>({\n internalBuild: ({ url, text }) => ['msg_url', { url, text }],\n internalParse: (path, query) => {\n if (path !== 'msg_url') return null\n\n const url = query.get('url')\n if (!url) return null\n\n const text = query.get('text')\n\n return { url, text: text || undefined }\n },\n externalBuild: ({ url, text }) => ['share', { url, text }],\n externalParse: (path, query) => {\n if (path !== 'share') return null\n\n const url = query.get('url')\n if (!url) return null\n\n const text = query.get('text')\n\n return { url, text: text || undefined }\n },\n})\n\n/**\n * Boost links\n *\n * Used by users to boost channels, granting them the ability to post stories.\n */\nexport const boost = deeplinkBuilder<{ username: string } | { channelId: number }>({\n internalBuild: (params) => {\n if ('username' in params) {\n return ['boost', { domain: params.username }]\n }\n\n return ['boost', { channel: params.channelId }]\n },\n internalParse: (path, query) => {\n if (path !== 'boost') return null\n\n const username = query.get('domain')\n\n if (username) {\n return { username }\n }\n\n const channelId = Number(query.get('channel'))\n\n if (!isNaN(channelId)) {\n return { channelId: Number(channelId) }\n }\n\n return null\n },\n externalBuild: (params) => {\n if ('username' in params) {\n return [params.username, { boost: true }]\n }\n\n return [`c/${params.channelId}`, { boost: true }]\n },\n externalParse: (path, query) => {\n if (!query.has('boost')) return null\n\n if (path.startsWith('c/')) {\n const channelId = Number(path.slice(2))\n if (isNaN(channelId)) return null\n\n return { channelId }\n }\n\n if (path.includes('/')) return null\n\n return { username: path }\n },\n})\n"]}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MTProxy links
|
|
3
|
+
*/
|
|
4
|
+
export declare const mtproxy: import("./common.js").Deeplink<{
|
|
5
|
+
server: string;
|
|
6
|
+
port: number;
|
|
7
|
+
secret: string;
|
|
8
|
+
}>;
|
|
9
|
+
/**
|
|
10
|
+
* Socks5 proxy links
|
|
11
|
+
*/
|
|
12
|
+
export declare const socks5: import("./common.js").Deeplink<{
|
|
13
|
+
server: string;
|
|
14
|
+
port: number;
|
|
15
|
+
user?: string | undefined;
|
|
16
|
+
pass?: string | undefined;
|
|
17
|
+
}>;
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { deeplinkBuilder } from './common.js';
|
|
2
|
+
/**
|
|
3
|
+
* MTProxy links
|
|
4
|
+
*/
|
|
5
|
+
export const mtproxy = deeplinkBuilder({
|
|
6
|
+
internalBuild: (params) => ['proxy', params],
|
|
7
|
+
externalBuild: (params) => ['proxy', params],
|
|
8
|
+
internalParse: (path, query) => {
|
|
9
|
+
if (path !== 'proxy')
|
|
10
|
+
return null;
|
|
11
|
+
const server = query.get('server');
|
|
12
|
+
const port = Number(query.get('port'));
|
|
13
|
+
const secret = query.get('secret');
|
|
14
|
+
if (!server || isNaN(port) || !secret)
|
|
15
|
+
return null;
|
|
16
|
+
return { server, port, secret };
|
|
17
|
+
},
|
|
18
|
+
externalParse: (path, query) => {
|
|
19
|
+
if (path !== 'proxy')
|
|
20
|
+
return null;
|
|
21
|
+
const server = query.get('server');
|
|
22
|
+
const port = Number(query.get('port'));
|
|
23
|
+
const secret = query.get('secret');
|
|
24
|
+
if (!server || isNaN(port) || !secret)
|
|
25
|
+
return null;
|
|
26
|
+
return { server, port, secret };
|
|
27
|
+
},
|
|
28
|
+
});
|
|
29
|
+
/**
|
|
30
|
+
* Socks5 proxy links
|
|
31
|
+
*/
|
|
32
|
+
export const socks5 = deeplinkBuilder({
|
|
33
|
+
internalBuild: (params) => ['socks', params],
|
|
34
|
+
externalBuild: (params) => ['socks', params],
|
|
35
|
+
internalParse: (path, query) => {
|
|
36
|
+
if (path !== 'socks')
|
|
37
|
+
return null;
|
|
38
|
+
const server = query.get('server');
|
|
39
|
+
const port = Number(query.get('port'));
|
|
40
|
+
const user = query.get('user');
|
|
41
|
+
const pass = query.get('pass');
|
|
42
|
+
if (!server || isNaN(port))
|
|
43
|
+
return null;
|
|
44
|
+
return { server, port, user: user || undefined, pass: pass || undefined };
|
|
45
|
+
},
|
|
46
|
+
externalParse: (path, query) => {
|
|
47
|
+
if (path !== 'socks')
|
|
48
|
+
return null;
|
|
49
|
+
const server = query.get('server');
|
|
50
|
+
const port = Number(query.get('port'));
|
|
51
|
+
const user = query.get('user');
|
|
52
|
+
const pass = query.get('pass');
|
|
53
|
+
if (!server || isNaN(port))
|
|
54
|
+
return null;
|
|
55
|
+
return { server, port, user: user || undefined, pass: pass || undefined };
|
|
56
|
+
},
|
|
57
|
+
});
|
|
58
|
+
//# sourceMappingURL=proxy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"proxy.js","sourceRoot":"","sources":["../../../../src/utils/links/proxy.ts"],"names":[],"mappings":"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","sourcesContent":["import { deeplinkBuilder } from './common.js'\n\n/**\n * MTProxy links\n */\nexport const mtproxy = deeplinkBuilder<{\n server: string\n port: number\n secret: string\n}>({\n internalBuild: (params) => ['proxy', params],\n externalBuild: (params) => ['proxy', params],\n internalParse: (path, query) => {\n if (path !== 'proxy') return null\n\n const server = query.get('server')\n const port = Number(query.get('port'))\n const secret = query.get('secret')\n\n if (!server || isNaN(port) || !secret) return null\n\n return { server, port, secret }\n },\n externalParse: (path, query) => {\n if (path !== 'proxy') return null\n\n const server = query.get('server')\n const port = Number(query.get('port'))\n const secret = query.get('secret')\n\n if (!server || isNaN(port) || !secret) return null\n\n return { server, port, secret }\n },\n})\n\n/**\n * Socks5 proxy links\n */\nexport const socks5 = deeplinkBuilder<{\n server: string\n port: number\n user?: string\n pass?: string\n}>({\n internalBuild: (params) => ['socks', params],\n externalBuild: (params) => ['socks', params],\n internalParse: (path, query) => {\n if (path !== 'socks') return null\n\n const server = query.get('server')\n const port = Number(query.get('port'))\n const user = query.get('user')\n const pass = query.get('pass')\n\n if (!server || isNaN(port)) return null\n\n return { server, port, user: user || undefined, pass: pass || undefined }\n },\n externalParse: (path, query) => {\n if (path !== 'socks') return null\n\n const server = query.get('server')\n const port = Number(query.get('port'))\n const user = query.get('user')\n const pass = query.get('pass')\n\n if (!server || isNaN(port)) return null\n\n return { server, port, user: user || undefined, pass: pass || undefined }\n },\n})\n"]}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { deeplinkBuilder } from './common.js';
|
|
2
|
+
/**
|
|
3
|
+
* Sticker set links
|
|
4
|
+
*
|
|
5
|
+
* Used to import stickersets or custom emoji stickersets
|
|
6
|
+
*/
|
|
7
|
+
export const stickerset = deeplinkBuilder({
|
|
8
|
+
internalBuild: ({ slug, emoji }) => [emoji ? 'addemoji' : 'addstickers', { set: slug }],
|
|
9
|
+
internalParse: (path, query) => {
|
|
10
|
+
if (path !== 'addstickers' && path !== 'addemoji')
|
|
11
|
+
return null;
|
|
12
|
+
const slug = query.get('set');
|
|
13
|
+
if (!slug)
|
|
14
|
+
return null;
|
|
15
|
+
return { slug, emoji: path === 'addemoji' };
|
|
16
|
+
},
|
|
17
|
+
externalBuild: ({ slug, emoji }) => [`${emoji ? 'addemoji' : 'addstickers'}/${slug}`, null],
|
|
18
|
+
externalParse: (path) => {
|
|
19
|
+
const [prefix, slug] = path.split('/');
|
|
20
|
+
if (prefix !== 'addstickers' && prefix !== 'addemoji')
|
|
21
|
+
return null;
|
|
22
|
+
return { slug, emoji: prefix === 'addemoji' };
|
|
23
|
+
},
|
|
24
|
+
});
|
|
25
|
+
//# sourceMappingURL=stickers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stickers.js","sourceRoot":"","sources":["../../../../src/utils/links/stickers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAA;AAE7C;;;;GAIG;AACH,MAAM,CAAC,MAAM,UAAU,GAAG,eAAe,CAGtC;IACC,aAAa,EAAE,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,aAAa,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC;IACvF,aAAa,EAAE,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE;QAC3B,IAAI,IAAI,KAAK,aAAa,IAAI,IAAI,KAAK,UAAU;YAAE,OAAO,IAAI,CAAA;QAE9D,MAAM,IAAI,GAAG,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,CAAA;QAC7B,IAAI,CAAC,IAAI;YAAE,OAAO,IAAI,CAAA;QAEtB,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,KAAK,UAAU,EAAE,CAAA;IAC/C,CAAC;IACD,aAAa,EAAE,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,aAAa,IAAI,IAAI,EAAE,EAAE,IAAI,CAAC;IAC3F,aAAa,EAAE,CAAC,IAAI,EAAE,EAAE;QACpB,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;QACtC,IAAI,MAAM,KAAK,aAAa,IAAI,MAAM,KAAK,UAAU;YAAE,OAAO,IAAI,CAAA;QAElE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,KAAK,UAAU,EAAE,CAAA;IACjD,CAAC;CACJ,CAAC,CAAA","sourcesContent":["import { deeplinkBuilder } from './common.js'\n\n/**\n * Sticker set links\n *\n * Used to import stickersets or custom emoji stickersets\n */\nexport const stickerset = deeplinkBuilder<{\n slug: string\n emoji?: boolean\n}>({\n internalBuild: ({ slug, emoji }) => [emoji ? 'addemoji' : 'addstickers', { set: slug }],\n internalParse: (path, query) => {\n if (path !== 'addstickers' && path !== 'addemoji') return null\n\n const slug = query.get('set')\n if (!slug) return null\n\n return { slug, emoji: path === 'addemoji' }\n },\n externalBuild: ({ slug, emoji }) => [`${emoji ? 'addemoji' : 'addstickers'}/${slug}`, null],\n externalParse: (path) => {\n const [prefix, slug] = path.split('/')\n if (prefix !== 'addstickers' && prefix !== 'addemoji') return null\n\n return { slug, emoji: prefix === 'addemoji' }\n },\n})\n"]}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Public username links
|
|
3
|
+
*
|
|
4
|
+
* Used to link to public users, groups and channels
|
|
5
|
+
*/
|
|
6
|
+
export declare const publicUsername: import("./common.js").Deeplink<{
|
|
7
|
+
username: string;
|
|
8
|
+
}>;
|
|
9
|
+
/**
|
|
10
|
+
* Temporary profile links
|
|
11
|
+
*
|
|
12
|
+
* Used to link to user profiles, generated using contacts.exportContactToken.
|
|
13
|
+
* These links can be generated even for profiles that don't have a username,
|
|
14
|
+
* and they have an expiration date, specified by the expires field of the exportedContactToken
|
|
15
|
+
* constructor returned by contacts.exportContactToken.
|
|
16
|
+
*/
|
|
17
|
+
export declare const temporaryProfile: import("./common.js").Deeplink<{
|
|
18
|
+
token: string;
|
|
19
|
+
}>;
|
|
20
|
+
/**
|
|
21
|
+
* Phone number links
|
|
22
|
+
*
|
|
23
|
+
* Used to link to public and private users by their phone number.
|
|
24
|
+
*/
|
|
25
|
+
export declare const phoneNumber: import("./common.js").Deeplink<{
|
|
26
|
+
phone: string;
|
|
27
|
+
}>;
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import { deeplinkBuilder } from './common.js';
|
|
2
|
+
/**
|
|
3
|
+
* Public username links
|
|
4
|
+
*
|
|
5
|
+
* Used to link to public users, groups and channels
|
|
6
|
+
*/
|
|
7
|
+
export const publicUsername = deeplinkBuilder({
|
|
8
|
+
internalBuild: ({ username }) => ['resolve', { domain: username }],
|
|
9
|
+
internalParse: (path, query) => {
|
|
10
|
+
if (path !== 'resolve')
|
|
11
|
+
return null;
|
|
12
|
+
const domain = query.get('domain');
|
|
13
|
+
if (!domain)
|
|
14
|
+
return null;
|
|
15
|
+
// might be some more precise deeplink
|
|
16
|
+
if ([...query.keys()].length > 1)
|
|
17
|
+
return null;
|
|
18
|
+
return { username: domain };
|
|
19
|
+
},
|
|
20
|
+
externalBuild: ({ username }) => [username, null],
|
|
21
|
+
externalParse: (path, query) => {
|
|
22
|
+
if (path.length <= 1 || path.includes('/') || path[0] === '+')
|
|
23
|
+
return null;
|
|
24
|
+
if ([...query.keys()].length > 0)
|
|
25
|
+
return null;
|
|
26
|
+
return { username: path };
|
|
27
|
+
},
|
|
28
|
+
});
|
|
29
|
+
/**
|
|
30
|
+
* Temporary profile links
|
|
31
|
+
*
|
|
32
|
+
* Used to link to user profiles, generated using contacts.exportContactToken.
|
|
33
|
+
* These links can be generated even for profiles that don't have a username,
|
|
34
|
+
* and they have an expiration date, specified by the expires field of the exportedContactToken
|
|
35
|
+
* constructor returned by contacts.exportContactToken.
|
|
36
|
+
*/
|
|
37
|
+
export const temporaryProfile = deeplinkBuilder({
|
|
38
|
+
internalBuild: ({ token }) => ['contact', { token }],
|
|
39
|
+
internalParse: (path, query) => {
|
|
40
|
+
if (path !== 'contact')
|
|
41
|
+
return null;
|
|
42
|
+
const token = query.get('token');
|
|
43
|
+
if (!token)
|
|
44
|
+
return null;
|
|
45
|
+
return { token };
|
|
46
|
+
},
|
|
47
|
+
externalBuild: ({ token }) => [`contact/${token}`, null],
|
|
48
|
+
externalParse: (path) => {
|
|
49
|
+
const [prefix, token] = path.split('/');
|
|
50
|
+
if (prefix !== 'contact')
|
|
51
|
+
return null;
|
|
52
|
+
return { token };
|
|
53
|
+
},
|
|
54
|
+
});
|
|
55
|
+
/**
|
|
56
|
+
* Phone number links
|
|
57
|
+
*
|
|
58
|
+
* Used to link to public and private users by their phone number.
|
|
59
|
+
*/
|
|
60
|
+
export const phoneNumber = deeplinkBuilder({
|
|
61
|
+
internalBuild: ({ phone }) => ['resolve', { phone }],
|
|
62
|
+
internalParse: (path, query) => {
|
|
63
|
+
if (path !== 'resolve')
|
|
64
|
+
return null;
|
|
65
|
+
const phone = query.get('phone');
|
|
66
|
+
if (!phone)
|
|
67
|
+
return null;
|
|
68
|
+
return { phone };
|
|
69
|
+
},
|
|
70
|
+
externalBuild: ({ phone }) => [`+${phone}`, null],
|
|
71
|
+
externalParse: (path) => {
|
|
72
|
+
const m = path.match(/^\+(\d+)$/);
|
|
73
|
+
if (!m)
|
|
74
|
+
return null;
|
|
75
|
+
return { phone: m[1] };
|
|
76
|
+
},
|
|
77
|
+
});
|
|
78
|
+
//# sourceMappingURL=user.js.map
|