@mtcute/core 0.14.0 → 0.15.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (139) hide show
  1. package/cjs/highlevel/base.d.ts +4 -2
  2. package/cjs/highlevel/base.js +6 -0
  3. package/cjs/highlevel/base.js.map +1 -1
  4. package/cjs/highlevel/client.d.ts +52 -2
  5. package/cjs/highlevel/client.js +13 -0
  6. package/cjs/highlevel/client.js.map +1 -1
  7. package/cjs/highlevel/client.types.d.ts +4 -1
  8. package/cjs/highlevel/client.types.js.map +1 -1
  9. package/cjs/highlevel/methods/_imports.js.map +1 -1
  10. package/cjs/highlevel/methods/_init.js +3 -0
  11. package/cjs/highlevel/methods/_init.js.map +1 -1
  12. package/cjs/highlevel/methods/auth/resend-code.d.ts +2 -0
  13. package/cjs/highlevel/methods/auth/resend-code.js +2 -2
  14. package/cjs/highlevel/methods/auth/resend-code.js.map +1 -1
  15. package/cjs/highlevel/methods/auth/send-code.d.ts +2 -0
  16. package/cjs/highlevel/methods/auth/send-code.js +1 -1
  17. package/cjs/highlevel/methods/auth/send-code.js.map +1 -1
  18. package/cjs/highlevel/methods/auth/sign-in-qr.d.ts +28 -0
  19. package/cjs/highlevel/methods/auth/sign-in-qr.js +125 -0
  20. package/cjs/highlevel/methods/auth/sign-in-qr.js.map +1 -0
  21. package/cjs/highlevel/methods/auth/sign-in.d.ts +2 -0
  22. package/cjs/highlevel/methods/auth/sign-in.js +2 -2
  23. package/cjs/highlevel/methods/auth/sign-in.js.map +1 -1
  24. package/cjs/highlevel/methods/auth/start.d.ts +10 -0
  25. package/cjs/highlevel/methods/auth/start.js +25 -3
  26. package/cjs/highlevel/methods/auth/start.js.map +1 -1
  27. package/cjs/highlevel/methods/files/normalize-input-media.js +14 -0
  28. package/cjs/highlevel/methods/files/normalize-input-media.js.map +1 -1
  29. package/cjs/highlevel/methods/files/upload-media.js +1 -0
  30. package/cjs/highlevel/methods/files/upload-media.js.map +1 -1
  31. package/cjs/highlevel/methods/messages/edit-inline-message.js +1 -1
  32. package/cjs/highlevel/methods/messages/edit-inline-message.js.map +1 -1
  33. package/cjs/highlevel/methods/messages/edit-message.js +1 -1
  34. package/cjs/highlevel/methods/messages/edit-message.js.map +1 -1
  35. package/cjs/highlevel/methods/messages/send-media.js +5 -2
  36. package/cjs/highlevel/methods/messages/send-media.js.map +1 -1
  37. package/cjs/highlevel/methods.d.ts +1 -0
  38. package/cjs/highlevel/methods.js +8 -6
  39. package/cjs/highlevel/methods.js.map +1 -1
  40. package/cjs/highlevel/types/media/extended-media.d.ts +20 -0
  41. package/cjs/highlevel/types/media/extended-media.js +41 -0
  42. package/cjs/highlevel/types/media/extended-media.js.map +1 -0
  43. package/cjs/highlevel/types/media/index.d.ts +2 -0
  44. package/cjs/highlevel/types/media/index.js +2 -0
  45. package/cjs/highlevel/types/media/index.js.map +1 -1
  46. package/cjs/highlevel/types/media/input-media/factories.d.ts +2 -1
  47. package/cjs/highlevel/types/media/input-media/factories.js +7 -1
  48. package/cjs/highlevel/types/media/input-media/factories.js.map +1 -1
  49. package/cjs/highlevel/types/media/input-media/types.d.ts +12 -1
  50. package/cjs/highlevel/types/media/input-media/types.js.map +1 -1
  51. package/cjs/highlevel/types/media/invoice.d.ts +2 -20
  52. package/cjs/highlevel/types/media/invoice.js +3 -37
  53. package/cjs/highlevel/types/media/invoice.js.map +1 -1
  54. package/cjs/highlevel/types/media/paid-media.d.ts +33 -0
  55. package/cjs/highlevel/types/media/paid-media.js +66 -0
  56. package/cjs/highlevel/types/media/paid-media.js.map +1 -0
  57. package/cjs/highlevel/types/messages/message-media.d.ts +2 -1
  58. package/cjs/highlevel/types/messages/message-media.js +10 -0
  59. package/cjs/highlevel/types/messages/message-media.js.map +1 -1
  60. package/cjs/highlevel/updates/manager.d.ts +1 -0
  61. package/cjs/highlevel/updates/manager.js +3 -0
  62. package/cjs/highlevel/updates/manager.js.map +1 -1
  63. package/cjs/highlevel/worker/port.d.ts +9 -8
  64. package/cjs/highlevel/worker/port.js +5 -0
  65. package/cjs/highlevel/worker/port.js.map +1 -1
  66. package/cjs/network/network-manager.js +9 -3
  67. package/cjs/network/network-manager.js.map +1 -1
  68. package/cjs/utils/bigint-utils.js +1 -1
  69. package/cjs/utils/bigint-utils.js.map +1 -1
  70. package/esm/highlevel/base.d.ts +4 -2
  71. package/esm/highlevel/base.js +6 -0
  72. package/esm/highlevel/base.js.map +1 -1
  73. package/esm/highlevel/client.d.ts +52 -2
  74. package/esm/highlevel/client.js +13 -0
  75. package/esm/highlevel/client.js.map +1 -1
  76. package/esm/highlevel/client.types.d.ts +4 -1
  77. package/esm/highlevel/client.types.js.map +1 -1
  78. package/esm/highlevel/methods/_imports.js.map +1 -1
  79. package/esm/highlevel/methods/_init.js +3 -0
  80. package/esm/highlevel/methods/_init.js.map +1 -1
  81. package/esm/highlevel/methods/auth/resend-code.d.ts +2 -0
  82. package/esm/highlevel/methods/auth/resend-code.js +2 -2
  83. package/esm/highlevel/methods/auth/resend-code.js.map +1 -1
  84. package/esm/highlevel/methods/auth/send-code.d.ts +2 -0
  85. package/esm/highlevel/methods/auth/send-code.js +1 -1
  86. package/esm/highlevel/methods/auth/send-code.js.map +1 -1
  87. package/esm/highlevel/methods/auth/sign-in-qr.d.ts +28 -0
  88. package/esm/highlevel/methods/auth/sign-in-qr.js +121 -0
  89. package/esm/highlevel/methods/auth/sign-in-qr.js.map +1 -0
  90. package/esm/highlevel/methods/auth/sign-in.d.ts +2 -0
  91. package/esm/highlevel/methods/auth/sign-in.js +2 -2
  92. package/esm/highlevel/methods/auth/sign-in.js.map +1 -1
  93. package/esm/highlevel/methods/auth/start.d.ts +10 -0
  94. package/esm/highlevel/methods/auth/start.js +25 -3
  95. package/esm/highlevel/methods/auth/start.js.map +1 -1
  96. package/esm/highlevel/methods/files/normalize-input-media.js +14 -0
  97. package/esm/highlevel/methods/files/normalize-input-media.js.map +1 -1
  98. package/esm/highlevel/methods/files/upload-media.js +1 -0
  99. package/esm/highlevel/methods/files/upload-media.js.map +1 -1
  100. package/esm/highlevel/methods/messages/edit-inline-message.js +1 -1
  101. package/esm/highlevel/methods/messages/edit-inline-message.js.map +1 -1
  102. package/esm/highlevel/methods/messages/edit-message.js +1 -1
  103. package/esm/highlevel/methods/messages/edit-message.js.map +1 -1
  104. package/esm/highlevel/methods/messages/send-media.js +5 -2
  105. package/esm/highlevel/methods/messages/send-media.js.map +1 -1
  106. package/esm/highlevel/methods.d.ts +1 -0
  107. package/esm/highlevel/methods.js +1 -0
  108. package/esm/highlevel/methods.js.map +1 -1
  109. package/esm/highlevel/types/media/extended-media.d.ts +20 -0
  110. package/esm/highlevel/types/media/extended-media.js +38 -0
  111. package/esm/highlevel/types/media/extended-media.js.map +1 -0
  112. package/esm/highlevel/types/media/index.d.ts +2 -0
  113. package/esm/highlevel/types/media/index.js +2 -0
  114. package/esm/highlevel/types/media/index.js.map +1 -1
  115. package/esm/highlevel/types/media/input-media/factories.d.ts +2 -1
  116. package/esm/highlevel/types/media/input-media/factories.js +5 -0
  117. package/esm/highlevel/types/media/input-media/factories.js.map +1 -1
  118. package/esm/highlevel/types/media/input-media/types.d.ts +12 -1
  119. package/esm/highlevel/types/media/input-media/types.js.map +1 -1
  120. package/esm/highlevel/types/media/invoice.d.ts +2 -20
  121. package/esm/highlevel/types/media/invoice.js +2 -36
  122. package/esm/highlevel/types/media/invoice.js.map +1 -1
  123. package/esm/highlevel/types/media/paid-media.d.ts +33 -0
  124. package/esm/highlevel/types/media/paid-media.js +63 -0
  125. package/esm/highlevel/types/media/paid-media.js.map +1 -0
  126. package/esm/highlevel/types/messages/message-media.d.ts +2 -1
  127. package/esm/highlevel/types/messages/message-media.js +10 -0
  128. package/esm/highlevel/types/messages/message-media.js.map +1 -1
  129. package/esm/highlevel/updates/manager.d.ts +1 -0
  130. package/esm/highlevel/updates/manager.js +3 -0
  131. package/esm/highlevel/updates/manager.js.map +1 -1
  132. package/esm/highlevel/worker/port.d.ts +9 -8
  133. package/esm/highlevel/worker/port.js +5 -0
  134. package/esm/highlevel/worker/port.js.map +1 -1
  135. package/esm/network/network-manager.js +9 -3
  136. package/esm/network/network-manager.js.map +1 -1
  137. package/esm/utils/bigint-utils.js +1 -1
  138. package/esm/utils/bigint-utils.js.map +1 -1
  139. package/package.json +10 -5
@@ -19,6 +19,7 @@ import type { StringSessionData } from './utils/string-session.js';
19
19
  * may be emitted before `updating` state
20
20
  */
21
21
  export type ConnectionState = 'offline' | 'connecting' | 'updating' | 'connected';
22
+ export type ServerUpdateHandler = (update: tl.TypeUpdates) => void;
22
23
  export interface ITelegramClient {
23
24
  readonly log: Logger;
24
25
  readonly storage: PublicPart<TelegramStorageManager>;
@@ -39,7 +40,8 @@ export interface ITelegramClient {
39
40
  onError(handler: (err: unknown) => void): void;
40
41
  emitError(err: unknown): void;
41
42
  handleClientUpdate(updates: tl.TypeUpdates, noDispatch?: boolean): void;
42
- onServerUpdate(handler: (update: tl.TypeUpdates) => void): void;
43
+ onServerUpdate(handler: ServerUpdateHandler): void;
44
+ getServerUpdateHandler(): ServerUpdateHandler;
43
45
  onUpdate(handler: RawUpdateHandler): void;
44
46
  onConnectionState(handler: (state: ConnectionState) => void): void;
45
47
  getApiCrenetials(): Promise<{
@@ -48,6 +50,7 @@ export interface ITelegramClient {
48
50
  }>;
49
51
  getPoolSize(kind: ConnectionKind, dcId?: number): Promise<number>;
50
52
  getPrimaryDcId(): Promise<number>;
53
+ changePrimaryDc(newDc: number): Promise<void>;
51
54
  computeSrpParams(request: tl.account.RawPassword, password: string): Promise<tl.RawInputCheckPasswordSRP>;
52
55
  computeNewPasswordHash(algo: tl.TypePasswordKdfAlgo, password: string): Promise<Uint8Array>;
53
56
  }
@@ -1 +1 @@
1
- {"version":3,"file":"client.types.js","sourceRoot":"","sources":["../../../src/highlevel/client.types.ts"],"names":[],"mappings":"","sourcesContent":["import { tl } from '@mtcute/tl'\n\nimport type { ConnectionKind, RpcCallOptions } from '../network/index.js'\nimport type { MustEqual, PublicPart } from '../types/utils.js'\nimport type { Logger } from '../utils/logger.js'\nimport type { AppConfigManager } from './managers/app-config-manager.js'\nimport type { TelegramStorageManager } from './storage/storage.js'\nimport type { RawUpdateHandler } from './updates/types.js'\nimport type { StringSessionData } from './utils/string-session.js'\n\n/**\n * Connection state of the client\n *\n * - `offline` - not connected (only emitted when {@link ICorePlatform.onNetworkChanged} callback\n * is called with `false`)\n * - `connecting` - currently connecting. All requests will be queued until the connection is established\n * - `updating` - connected and is currently updating the state (i.e. downloading missing updates).\n * At this point client is already fully operational, but some updates may be missing.\n * Is only emitted when updates manager is enabled.\n * - `connected` - connected and ready to send requests. When updates manager is enabled, this state\n * may be emitted before `updating` state\n */\nexport type ConnectionState = 'offline' | 'connecting' | 'updating' | 'connected'\n\n// NB: when adding new methods, don't forget to add them to:\n// - worker/port.ts\n// - generate-client script\n\nexport interface ITelegramClient {\n readonly log: Logger\n readonly storage: PublicPart<TelegramStorageManager>\n readonly appConfig: PublicPart<AppConfigManager>\n readonly stopSignal: AbortSignal\n\n prepare(): Promise<void>\n connect(): Promise<void>\n close(): Promise<void>\n notifyLoggedIn(auth: tl.auth.TypeAuthorization | tl.RawUser): Promise<tl.RawUser>\n notifyLoggedOut(): Promise<void>\n notifyChannelOpened(channelId: number, pts?: number): Promise<boolean>\n notifyChannelClosed(channelId: number): Promise<boolean>\n startUpdatesLoop(): Promise<void>\n stopUpdatesLoop(): Promise<void>\n call<T extends tl.RpcMethod>(\n message: MustEqual<T, tl.RpcMethod>,\n params?: RpcCallOptions,\n ): Promise<tl.RpcCallReturn[T['_']]>\n importSession(session: string | StringSessionData, force?: boolean): Promise<void>\n exportSession(): Promise<string>\n onError(handler: (err: unknown) => void): void\n emitError(err: unknown): void\n handleClientUpdate(updates: tl.TypeUpdates, noDispatch?: boolean): void\n\n onServerUpdate(handler: (update: tl.TypeUpdates) => void): void\n onUpdate(handler: RawUpdateHandler): void\n onConnectionState(handler: (state: ConnectionState) => void): void\n\n getApiCrenetials(): Promise<{ id: number; hash: string }>\n // todo - this is only used for file dl/ul, which should probably be moved\n // to the client to allow moving the thing to worker\n // or at least load this once at startup (and then these methods can be made sync)\n getPoolSize(kind: ConnectionKind, dcId?: number): Promise<number>\n getPrimaryDcId(): Promise<number>\n\n computeSrpParams(request: tl.account.RawPassword, password: string): Promise<tl.RawInputCheckPasswordSRP>\n computeNewPasswordHash(algo: tl.TypePasswordKdfAlgo, password: string): Promise<Uint8Array>\n}\n"]}
1
+ {"version":3,"file":"client.types.js","sourceRoot":"","sources":["../../../src/highlevel/client.types.ts"],"names":[],"mappings":"","sourcesContent":["import { tl } from '@mtcute/tl'\n\nimport type { ConnectionKind, RpcCallOptions } from '../network/index.js'\nimport type { MustEqual, PublicPart } from '../types/utils.js'\nimport type { Logger } from '../utils/logger.js'\nimport type { AppConfigManager } from './managers/app-config-manager.js'\nimport type { TelegramStorageManager } from './storage/storage.js'\nimport type { RawUpdateHandler } from './updates/types.js'\nimport type { StringSessionData } from './utils/string-session.js'\n\n/**\n * Connection state of the client\n *\n * - `offline` - not connected (only emitted when {@link ICorePlatform.onNetworkChanged} callback\n * is called with `false`)\n * - `connecting` - currently connecting. All requests will be queued until the connection is established\n * - `updating` - connected and is currently updating the state (i.e. downloading missing updates).\n * At this point client is already fully operational, but some updates may be missing.\n * Is only emitted when updates manager is enabled.\n * - `connected` - connected and ready to send requests. When updates manager is enabled, this state\n * may be emitted before `updating` state\n */\nexport type ConnectionState = 'offline' | 'connecting' | 'updating' | 'connected'\n\nexport type ServerUpdateHandler = (update: tl.TypeUpdates) => void\n\n// NB: when adding new methods, don't forget to add them to:\n// - worker/port.ts\n// - generate-client script\n\nexport interface ITelegramClient {\n readonly log: Logger\n readonly storage: PublicPart<TelegramStorageManager>\n readonly appConfig: PublicPart<AppConfigManager>\n readonly stopSignal: AbortSignal\n\n prepare(): Promise<void>\n connect(): Promise<void>\n close(): Promise<void>\n notifyLoggedIn(auth: tl.auth.TypeAuthorization | tl.RawUser): Promise<tl.RawUser>\n notifyLoggedOut(): Promise<void>\n notifyChannelOpened(channelId: number, pts?: number): Promise<boolean>\n notifyChannelClosed(channelId: number): Promise<boolean>\n startUpdatesLoop(): Promise<void>\n stopUpdatesLoop(): Promise<void>\n call<T extends tl.RpcMethod>(\n message: MustEqual<T, tl.RpcMethod>,\n params?: RpcCallOptions,\n ): Promise<tl.RpcCallReturn[T['_']]>\n importSession(session: string | StringSessionData, force?: boolean): Promise<void>\n exportSession(): Promise<string>\n onError(handler: (err: unknown) => void): void\n emitError(err: unknown): void\n handleClientUpdate(updates: tl.TypeUpdates, noDispatch?: boolean): void\n\n onServerUpdate(handler: ServerUpdateHandler): void\n getServerUpdateHandler(): ServerUpdateHandler\n onUpdate(handler: RawUpdateHandler): void\n onConnectionState(handler: (state: ConnectionState) => void): void\n\n getApiCrenetials(): Promise<{ id: number; hash: string }>\n // todo - this is only used for file dl/ul, which should probably be moved\n // to the client to allow moving the thing to worker\n // or at least load this once at startup (and then these methods can be made sync)\n getPoolSize(kind: ConnectionKind, dcId?: number): Promise<number>\n getPrimaryDcId(): Promise<number>\n changePrimaryDc(newDc: number): Promise<void>\n\n computeSrpParams(request: tl.account.RawPassword, password: string): Promise<tl.RawInputCheckPasswordSRP>\n computeNewPasswordHash(algo: tl.TypePasswordKdfAlgo, password: string): Promise<Uint8Array>\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"_imports.js","sourceRoot":"","sources":["../../../../src/highlevel/methods/_imports.ts"],"names":[],"mappings":"AAAA,sDAAsD","sourcesContent":["/* eslint-disable @typescript-eslint/no-unused-vars */\n\n// @copy\nimport { tdFileId } from '@mtcute/file-id'\n// @copy\nimport { tl } from '@mtcute/tl'\n\n// @copy\nimport { RpcCallOptions } from '../../network/index.js'\n// @copy\nimport { MaybeArray, MaybePromise, MtUnsupportedError, PartialExcept, PartialOnly } from '../../types/index.js'\n// @copy\nimport { BaseTelegramClient, BaseTelegramClientOptions } from '../base.js'\n// @copy\nimport { ITelegramClient } from '../client.types.js'\n// @copy\nimport {\n AllStories,\n ArrayPaginated,\n ArrayWithTotal,\n Boost,\n BoostSlot,\n BoostStats,\n BotChatJoinRequestUpdate,\n BotCommands,\n BotReactionCountUpdate,\n BotReactionUpdate,\n BotStoppedUpdate,\n BusinessChatLink,\n BusinessConnection,\n BusinessMessage,\n BusinessWorkHoursDay,\n CallbackQuery,\n Chat,\n ChatEvent,\n ChatInviteLink,\n ChatInviteLinkMember,\n ChatJoinRequestUpdate,\n ChatlistPreview,\n ChatMember,\n ChatMemberUpdate,\n ChatPreview,\n ChosenInlineResult,\n CollectibleInfo,\n DeleteBusinessMessageUpdate,\n DeleteMessageUpdate,\n DeleteStoryUpdate,\n Dialog,\n FactCheck,\n FileDownloadLocation,\n FileDownloadParameters,\n ForumTopic,\n FullChat,\n GameHighScore,\n HistoryReadUpdate,\n InlineCallbackQuery,\n InlineQuery,\n InputChatEventFilters,\n InputDialogFolder,\n InputFileLike,\n InputInlineResult,\n InputMediaLike,\n InputMediaSticker,\n InputMessageId,\n InputPeerLike,\n InputPrivacyRule,\n InputReaction,\n InputStickerSet,\n InputStickerSetItem,\n InputText,\n MaybeDynamic,\n Message,\n MessageEffect,\n MessageMedia,\n MessageReactions,\n ParametersSkip2,\n ParsedUpdate,\n PeerReaction,\n PeersIndex,\n PeerStories,\n Photo,\n Poll,\n PollUpdate,\n PollVoteUpdate,\n PreCheckoutQuery,\n RawDocument,\n ReplyMarkup,\n SentCode,\n Sticker,\n StickerSet,\n StickerSourceType,\n StickerType,\n StoriesStealthMode,\n Story,\n StoryInteractions,\n StoryUpdate,\n StoryViewer,\n StoryViewersList,\n TakeoutSession,\n TextWithEntities,\n TypingStatus,\n UploadedFile,\n UploadFileLike,\n User,\n UserStatusUpdate,\n UserTypingUpdate,\n} from '../types/index.js'\n// @copy\nimport { StringSessionData } from '../utils/string-session.js'\n"]}
1
+ {"version":3,"file":"_imports.js","sourceRoot":"","sources":["../../../../src/highlevel/methods/_imports.ts"],"names":[],"mappings":"AAAA,sDAAsD","sourcesContent":["/* eslint-disable @typescript-eslint/no-unused-vars */\n\n// @copy\nimport { tdFileId } from '@mtcute/file-id'\n// @copy\nimport { tl } from '@mtcute/tl'\n\n// @copy\nimport { RpcCallOptions } from '../../network/index.js'\n// @copy\nimport { MaybeArray, MaybePromise, MtUnsupportedError, PartialExcept, PartialOnly } from '../../types/index.js'\n// @copy\nimport { BaseTelegramClient, BaseTelegramClientOptions } from '../base.js'\n// @copy\nimport { ITelegramClient } from '../client.types.js'\n// @copy\nimport {\n AllStories,\n ArrayPaginated,\n ArrayWithTotal,\n Boost,\n BoostSlot,\n BoostStats,\n BotChatJoinRequestUpdate,\n BotCommands,\n BotReactionCountUpdate,\n BotReactionUpdate,\n BotStoppedUpdate,\n BusinessCallbackQuery,\n BusinessChatLink,\n BusinessConnection,\n BusinessMessage,\n BusinessWorkHoursDay,\n CallbackQuery,\n Chat,\n ChatEvent,\n ChatInviteLink,\n ChatInviteLinkMember,\n ChatJoinRequestUpdate,\n ChatlistPreview,\n ChatMember,\n ChatMemberUpdate,\n ChatPreview,\n ChosenInlineResult,\n CollectibleInfo,\n DeleteBusinessMessageUpdate,\n DeleteMessageUpdate,\n DeleteStoryUpdate,\n Dialog,\n FactCheck,\n FileDownloadLocation,\n FileDownloadParameters,\n ForumTopic,\n FullChat,\n GameHighScore,\n HistoryReadUpdate,\n InlineCallbackQuery,\n InlineQuery,\n InputChatEventFilters,\n InputDialogFolder,\n InputFileLike,\n InputInlineResult,\n InputMediaLike,\n InputMediaSticker,\n InputMessageId,\n InputPeerLike,\n InputPrivacyRule,\n InputReaction,\n InputStickerSet,\n InputStickerSetItem,\n InputText,\n MaybeDynamic,\n Message,\n MessageEffect,\n MessageMedia,\n MessageReactions,\n ParametersSkip2,\n ParsedUpdate,\n PeerReaction,\n PeersIndex,\n PeerStories,\n Photo,\n Poll,\n PollUpdate,\n PollVoteUpdate,\n PreCheckoutQuery,\n RawDocument,\n ReplyMarkup,\n SentCode,\n Sticker,\n StickerSet,\n StickerSourceType,\n StickerType,\n StoriesStealthMode,\n Story,\n StoryInteractions,\n StoryUpdate,\n StoryViewer,\n StoryViewersList,\n TakeoutSession,\n TextWithEntities,\n TypingStatus,\n UploadedFile,\n UploadFileLike,\n User,\n UserStatusUpdate,\n UserTypingUpdate,\n} from '../types/index.js'\n// @copy\nimport { StringSessionData } from '../utils/string-session.js'\n"]}
@@ -25,6 +25,9 @@ function _initializeClient(opts) {
25
25
  Object.defineProperty(this, 'stopSignal', {
26
26
  get: () => this._client.stopSignal,
27
27
  });
28
+ Object.defineProperty(this, 'appConfig', {
29
+ get: () => this._client.appConfig,
30
+ });
28
31
  if (!opts.disableUpdates) {
29
32
  const skipConversationUpdates = opts.skipConversationUpdates ?? true;
30
33
  const { messageGroupingInterval } = opts.updates ?? {};
@@ -1 +1 @@
1
- {"version":3,"file":"_init.js","sourceRoot":"","sources":["../../../../src/highlevel/methods/_init.ts"],"names":[],"mappings":"AAAA,sDAAsD;AAEtD,QAAQ;AACR,OAAO,EAAE,kBAAkB,EAAe,MAAM,sBAAsB,CAAA;AACtE,OAAO,EAAE,kBAAkB,EAA6B,MAAM,YAAY,CAAA;AAK1E,QAAQ;AACR,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAA;AACvD,QAAQ;AACR,OAAO,EAAE,uBAAuB,EAA6B,MAAM,sBAAsB,CAAA;AAmCzF,cAAc;AACd,gBAAgB;AAChB,SAAS,iBAAiB,CAAuB,IAA2B;IACxE,IAAI,QAAQ,IAAI,IAAI,EAAE,CAAC;QACnB,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,MAAM,CAAA;IAC9B,CAAC;SAAM,CAAC;QACJ,IAAI,CAAC,IAAI,CAAC,OAAO,IAAI,OAAO,IAAI,CAAC,OAAO,KAAK,QAAQ,IAAI,CAAC,IAAI,CAAC,SAAS,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;YACvF,MAAM,IAAI,kBAAkB,CACxB,+EAA+E,CAClF,CAAA;QACL,CAAC;QAED,IAAI,CAAC,OAAO,GAAG,IAAI,kBAAkB,CAAC,IAAiC,CAAC,CAAA;IAC5E,CAAC;IAED,2BAA2B;IAC3B,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAA;IAC3B,2BAA2B;IAC3B,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAA;IACnC,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,YAAY,EAAE;QACtC,GAAG,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU;KACrC,CAAC,CAAA;IAEF,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,CAAC;QACvB,MAAM,uBAAuB,GAAG,IAAI,CAAC,uBAAuB,IAAI,IAAI,CAAA;QACpE,MAAM,EAAE,uBAAuB,EAAE,GAAG,IAAI,CAAC,OAAO,IAAI,EAAE,CAAA;QAEtD,IAAI,CAAC,OAAO,CAAC,QAAQ,CACjB,uBAAuB,CAAC;YACpB,uBAAuB;YACvB,QAAQ,EAAE,CAAC,MAAM,EAAE,EAAE;gBACjB,IAAI,YAAY,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,uBAAuB;oBAAE,OAAM;gBAE9E,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAA;gBAC3B,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,CAAA;YACvC,CAAC;YACD,WAAW,EAAE,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE;gBAC3B,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,MAAM,EAAE,KAAK,CAAC,CAAA;YAC1C,CAAC;SACJ,CAAC,CACL,CAAA;IACL,CAAC;AACL,CAAC","sourcesContent":["/* eslint-disable @typescript-eslint/no-unused-vars */\n\n// @copy\nimport { MtUnsupportedError, PartialOnly } from '../../types/index.js'\nimport { BaseTelegramClient, BaseTelegramClientOptions } from '../base.js'\nimport { TelegramClient } from '../client.js'\nimport { ITelegramClient } from '../client.types.js'\n// @copy\nimport { ITelegramStorageProvider } from '../storage/provider.js'\n// @copy\nimport { Conversation } from '../types/conversation.js'\n// @copy\nimport { makeParsedUpdateHandler, ParsedUpdateHandlerParams } from '../updates/parsed.js'\n\n// @copy\ntype TelegramClientOptions = (\n | (PartialOnly<Omit<BaseTelegramClientOptions, 'storage'>, 'transport' | 'crypto'> & {\n /**\n * Storage to use for this client.\n *\n * If a string is passed, it will be used as\n * a name for the default platform-specific storage provider to use.\n *\n * @default `\"client.session\"`\n */\n storage?: string | ITelegramStorageProvider\n })\n | { client: ITelegramClient }\n) & {\n /**\n * If true, all API calls will be wrapped with `tl.invokeWithoutUpdates`,\n * effectively disabling the server-sent events for the clients.\n * May be useful in some cases.\n *\n * @default false\n */\n disableUpdates?: boolean\n updates?: Omit<ParsedUpdateHandlerParams, 'onUpdate'>\n /**\n * If `true`, the updates that were handled by some {@link Conversation}\n * will not be dispatched any further.\n *\n * @default true\n */\n skipConversationUpdates?: boolean\n}\n\n// @initialize\n/** @internal */\nfunction _initializeClient(this: TelegramClient, opts: TelegramClientOptions) {\n if ('client' in opts) {\n this._client = opts.client\n } else {\n if (!opts.storage || typeof opts.storage === 'string' || !opts.transport || !opts.crypto) {\n throw new MtUnsupportedError(\n 'You need to explicitly provide storage, transport and crypto for @mtcute/core',\n )\n }\n\n this._client = new BaseTelegramClient(opts as BaseTelegramClientOptions)\n }\n\n // @ts-expect-error codegen\n this.log = this._client.log\n // @ts-expect-error codegen\n this.storage = this._client.storage\n Object.defineProperty(this, 'stopSignal', {\n get: () => this._client.stopSignal,\n })\n\n if (!opts.disableUpdates) {\n const skipConversationUpdates = opts.skipConversationUpdates ?? true\n const { messageGroupingInterval } = opts.updates ?? {}\n\n this._client.onUpdate(\n makeParsedUpdateHandler({\n messageGroupingInterval,\n onUpdate: (update) => {\n if (Conversation.handleUpdate(this, update) && skipConversationUpdates) return\n\n this.emit('update', update)\n this.emit(update.name, update.data)\n },\n onRawUpdate: (update, peers) => {\n this.emit('raw_update', update, peers)\n },\n }),\n )\n }\n}\n"]}
1
+ {"version":3,"file":"_init.js","sourceRoot":"","sources":["../../../../src/highlevel/methods/_init.ts"],"names":[],"mappings":"AAAA,sDAAsD;AAEtD,QAAQ;AACR,OAAO,EAAE,kBAAkB,EAAe,MAAM,sBAAsB,CAAA;AACtE,OAAO,EAAE,kBAAkB,EAA6B,MAAM,YAAY,CAAA;AAK1E,QAAQ;AACR,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAA;AACvD,QAAQ;AACR,OAAO,EAAE,uBAAuB,EAA6B,MAAM,sBAAsB,CAAA;AAmCzF,cAAc;AACd,gBAAgB;AAChB,SAAS,iBAAiB,CAAuB,IAA2B;IACxE,IAAI,QAAQ,IAAI,IAAI,EAAE,CAAC;QACnB,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,MAAM,CAAA;IAC9B,CAAC;SAAM,CAAC;QACJ,IAAI,CAAC,IAAI,CAAC,OAAO,IAAI,OAAO,IAAI,CAAC,OAAO,KAAK,QAAQ,IAAI,CAAC,IAAI,CAAC,SAAS,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;YACvF,MAAM,IAAI,kBAAkB,CACxB,+EAA+E,CAClF,CAAA;QACL,CAAC;QAED,IAAI,CAAC,OAAO,GAAG,IAAI,kBAAkB,CAAC,IAAiC,CAAC,CAAA;IAC5E,CAAC;IAED,2BAA2B;IAC3B,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAA;IAC3B,2BAA2B;IAC3B,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAA;IACnC,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,YAAY,EAAE;QACtC,GAAG,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU;KACrC,CAAC,CAAA;IACF,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,WAAW,EAAE;QACrC,GAAG,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS;KACpC,CAAC,CAAA;IAEF,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,CAAC;QACvB,MAAM,uBAAuB,GAAG,IAAI,CAAC,uBAAuB,IAAI,IAAI,CAAA;QACpE,MAAM,EAAE,uBAAuB,EAAE,GAAG,IAAI,CAAC,OAAO,IAAI,EAAE,CAAA;QAEtD,IAAI,CAAC,OAAO,CAAC,QAAQ,CACjB,uBAAuB,CAAC;YACpB,uBAAuB;YACvB,QAAQ,EAAE,CAAC,MAAM,EAAE,EAAE;gBACjB,IAAI,YAAY,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,uBAAuB;oBAAE,OAAM;gBAE9E,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAA;gBAC3B,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,CAAA;YACvC,CAAC;YACD,WAAW,EAAE,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE;gBAC3B,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,MAAM,EAAE,KAAK,CAAC,CAAA;YAC1C,CAAC;SACJ,CAAC,CACL,CAAA;IACL,CAAC;AACL,CAAC","sourcesContent":["/* eslint-disable @typescript-eslint/no-unused-vars */\n\n// @copy\nimport { MtUnsupportedError, PartialOnly } from '../../types/index.js'\nimport { BaseTelegramClient, BaseTelegramClientOptions } from '../base.js'\nimport { TelegramClient } from '../client.js'\nimport { ITelegramClient } from '../client.types.js'\n// @copy\nimport { ITelegramStorageProvider } from '../storage/provider.js'\n// @copy\nimport { Conversation } from '../types/conversation.js'\n// @copy\nimport { makeParsedUpdateHandler, ParsedUpdateHandlerParams } from '../updates/parsed.js'\n\n// @copy\ntype TelegramClientOptions = (\n | (PartialOnly<Omit<BaseTelegramClientOptions, 'storage'>, 'transport' | 'crypto'> & {\n /**\n * Storage to use for this client.\n *\n * If a string is passed, it will be used as\n * a name for the default platform-specific storage provider to use.\n *\n * @default `\"client.session\"`\n */\n storage?: string | ITelegramStorageProvider\n })\n | { client: ITelegramClient }\n) & {\n /**\n * If true, all API calls will be wrapped with `tl.invokeWithoutUpdates`,\n * effectively disabling the server-sent events for the clients.\n * May be useful in some cases.\n *\n * @default false\n */\n disableUpdates?: boolean\n updates?: Omit<ParsedUpdateHandlerParams, 'onUpdate'>\n /**\n * If `true`, the updates that were handled by some {@link Conversation}\n * will not be dispatched any further.\n *\n * @default true\n */\n skipConversationUpdates?: boolean\n}\n\n// @initialize\n/** @internal */\nfunction _initializeClient(this: TelegramClient, opts: TelegramClientOptions) {\n if ('client' in opts) {\n this._client = opts.client\n } else {\n if (!opts.storage || typeof opts.storage === 'string' || !opts.transport || !opts.crypto) {\n throw new MtUnsupportedError(\n 'You need to explicitly provide storage, transport and crypto for @mtcute/core',\n )\n }\n\n this._client = new BaseTelegramClient(opts as BaseTelegramClientOptions)\n }\n\n // @ts-expect-error codegen\n this.log = this._client.log\n // @ts-expect-error codegen\n this.storage = this._client.storage\n Object.defineProperty(this, 'stopSignal', {\n get: () => this._client.stopSignal,\n })\n Object.defineProperty(this, 'appConfig', {\n get: () => this._client.appConfig,\n })\n\n if (!opts.disableUpdates) {\n const skipConversationUpdates = opts.skipConversationUpdates ?? true\n const { messageGroupingInterval } = opts.updates ?? {}\n\n this._client.onUpdate(\n makeParsedUpdateHandler({\n messageGroupingInterval,\n onUpdate: (update) => {\n if (Conversation.handleUpdate(this, update) && skipConversationUpdates) return\n\n this.emit('update', update)\n this.emit(update.name, update.data)\n },\n onRawUpdate: (update, peers) => {\n this.emit('raw_update', update, peers)\n },\n }),\n )\n }\n}\n"]}
@@ -11,4 +11,6 @@ export declare function resendCode(client: ITelegramClient, params: {
11
11
  phone: string;
12
12
  /** Confirmation code identifier from {@link SentCode} */
13
13
  phoneCodeHash: string;
14
+ /** Abort signal */
15
+ abortSignal?: AbortSignal;
14
16
  }): Promise<SentCode>;
@@ -8,12 +8,12 @@ import { normalizePhoneNumber } from '../../utils/misc-utils.js';
8
8
  * {@link SentCode} object returned by {@link sendCode}
9
9
  */
10
10
  export async function resendCode(client, params) {
11
- const { phone, phoneCodeHash } = params;
11
+ const { phone, phoneCodeHash, abortSignal } = params;
12
12
  const res = await client.call({
13
13
  _: 'auth.resendCode',
14
14
  phoneNumber: normalizePhoneNumber(phone),
15
15
  phoneCodeHash,
16
- });
16
+ }, { abortSignal });
17
17
  assertTypeIs('sendCode', res, 'auth.sentCode');
18
18
  return new SentCode(res);
19
19
  }
@@ -1 +1 @@
1
- {"version":3,"file":"resend-code.js","sourceRoot":"","sources":["../../../../../src/highlevel/methods/auth/resend-code.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,mCAAmC,CAAA;AAEhE,OAAO,EAAE,QAAQ,EAAE,MAAM,+BAA+B,CAAA;AACxD,OAAO,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAA;AAEhE;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU,CAC5B,MAAuB,EACvB,MAMC;IAED,MAAM,EAAE,KAAK,EAAE,aAAa,EAAE,GAAG,MAAM,CAAA;IAEvC,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC;QAC1B,CAAC,EAAE,iBAAiB;QACpB,WAAW,EAAE,oBAAoB,CAAC,KAAK,CAAC;QACxC,aAAa;KAChB,CAAC,CAAA;IAEF,YAAY,CAAC,UAAU,EAAE,GAAG,EAAE,eAAe,CAAC,CAAA;IAE9C,OAAO,IAAI,QAAQ,CAAC,GAAG,CAAC,CAAA;AAC5B,CAAC","sourcesContent":["import { assertTypeIs } from '../../../utils/type-assertions.js'\nimport { ITelegramClient } from '../../client.types.js'\nimport { SentCode } from '../../types/auth/sent-code.js'\nimport { normalizePhoneNumber } from '../../utils/misc-utils.js'\n\n/**\n * Re-send the confirmation code using a different type.\n *\n * The type of the code to be re-sent is specified in the `nextType` attribute of\n * {@link SentCode} object returned by {@link sendCode}\n */\nexport async function resendCode(\n client: ITelegramClient,\n params: {\n /** Phone number in international format */\n phone: string\n\n /** Confirmation code identifier from {@link SentCode} */\n phoneCodeHash: string\n },\n): Promise<SentCode> {\n const { phone, phoneCodeHash } = params\n\n const res = await client.call({\n _: 'auth.resendCode',\n phoneNumber: normalizePhoneNumber(phone),\n phoneCodeHash,\n })\n\n assertTypeIs('sendCode', res, 'auth.sentCode')\n\n return new SentCode(res)\n}\n"]}
1
+ {"version":3,"file":"resend-code.js","sourceRoot":"","sources":["../../../../../src/highlevel/methods/auth/resend-code.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,mCAAmC,CAAA;AAEhE,OAAO,EAAE,QAAQ,EAAE,MAAM,+BAA+B,CAAA;AACxD,OAAO,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAA;AAEhE;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU,CAC5B,MAAuB,EACvB,MASC;IAED,MAAM,EAAE,KAAK,EAAE,aAAa,EAAE,WAAW,EAAE,GAAG,MAAM,CAAA;IAEpD,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,IAAI,CACzB;QACI,CAAC,EAAE,iBAAiB;QACpB,WAAW,EAAE,oBAAoB,CAAC,KAAK,CAAC;QACxC,aAAa;KAChB,EACD,EAAE,WAAW,EAAE,CAClB,CAAA;IAED,YAAY,CAAC,UAAU,EAAE,GAAG,EAAE,eAAe,CAAC,CAAA;IAE9C,OAAO,IAAI,QAAQ,CAAC,GAAG,CAAC,CAAA;AAC5B,CAAC","sourcesContent":["import { assertTypeIs } from '../../../utils/type-assertions.js'\nimport { ITelegramClient } from '../../client.types.js'\nimport { SentCode } from '../../types/auth/sent-code.js'\nimport { normalizePhoneNumber } from '../../utils/misc-utils.js'\n\n/**\n * Re-send the confirmation code using a different type.\n *\n * The type of the code to be re-sent is specified in the `nextType` attribute of\n * {@link SentCode} object returned by {@link sendCode}\n */\nexport async function resendCode(\n client: ITelegramClient,\n params: {\n /** Phone number in international format */\n phone: string\n\n /** Confirmation code identifier from {@link SentCode} */\n phoneCodeHash: string\n\n /** Abort signal */\n abortSignal?: AbortSignal\n },\n): Promise<SentCode> {\n const { phone, phoneCodeHash, abortSignal } = params\n\n const res = await client.call(\n {\n _: 'auth.resendCode',\n phoneNumber: normalizePhoneNumber(phone),\n phoneCodeHash,\n },\n { abortSignal },\n )\n\n assertTypeIs('sendCode', res, 'auth.sentCode')\n\n return new SentCode(res)\n}\n"]}
@@ -13,4 +13,6 @@ export declare function sendCode(client: ITelegramClient, params: {
13
13
  futureAuthTokens?: Uint8Array[];
14
14
  /** Additional code settings to pass to the server */
15
15
  codeSettings?: Omit<tl.RawCodeSettings, '_' | 'logoutTokens'>;
16
+ /** Abort signal */
17
+ abortSignal?: AbortSignal;
16
18
  }): Promise<SentCode>;
@@ -19,7 +19,7 @@ export async function sendCode(client, params) {
19
19
  logoutTokens: params.futureAuthTokens,
20
20
  ...params.codeSettings,
21
21
  },
22
- });
22
+ }, { abortSignal: params.abortSignal });
23
23
  assertTypeIs('sendCode', res, 'auth.sentCode');
24
24
  return new SentCode(res);
25
25
  }
@@ -1 +1 @@
1
- {"version":3,"file":"send-code.js","sourceRoot":"","sources":["../../../../../src/highlevel/methods/auth/send-code.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAAE,MAAM,mCAAmC,CAAA;AAEhE,OAAO,EAAE,QAAQ,EAAE,MAAM,+BAA+B,CAAA;AACxD,OAAO,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAA;AAEhE;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,QAAQ,CAC1B,MAAuB,EACvB,MASC;IAED,MAAM,KAAK,GAAG,oBAAoB,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;IAEhD,MAAM,EAAE,EAAE,EAAE,IAAI,EAAE,GAAG,MAAM,MAAM,CAAC,gBAAgB,EAAE,CAAA;IAEpD,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC;QAC1B,CAAC,EAAE,eAAe;QAClB,WAAW,EAAE,KAAK;QAClB,KAAK,EAAE,EAAE;QACT,OAAO,EAAE,IAAI;QACb,QAAQ,EAAE;YACN,CAAC,EAAE,cAAc;YACjB,YAAY,EAAE,MAAM,CAAC,gBAAgB;YACrC,GAAG,MAAM,CAAC,YAAY;SACzB;KACJ,CAAC,CAAA;IAEF,YAAY,CAAC,UAAU,EAAE,GAAG,EAAE,eAAe,CAAC,CAAA;IAE9C,OAAO,IAAI,QAAQ,CAAC,GAAG,CAAC,CAAA;AAC5B,CAAC","sourcesContent":["import { tl } from '@mtcute/tl'\n\nimport { assertTypeIs } from '../../../utils/type-assertions.js'\nimport { ITelegramClient } from '../../client.types.js'\nimport { SentCode } from '../../types/auth/sent-code.js'\nimport { normalizePhoneNumber } from '../../utils/misc-utils.js'\n\n/**\n * Send the confirmation code to the given phone number\n *\n * @returns An object containing information about the sent confirmation code\n */\nexport async function sendCode(\n client: ITelegramClient,\n params: {\n /** Phone number in international format */\n phone: string\n\n /** Saved future auth tokens, if any */\n futureAuthTokens?: Uint8Array[]\n\n /** Additional code settings to pass to the server */\n codeSettings?: Omit<tl.RawCodeSettings, '_' | 'logoutTokens'>\n },\n): Promise<SentCode> {\n const phone = normalizePhoneNumber(params.phone)\n\n const { id, hash } = await client.getApiCrenetials()\n\n const res = await client.call({\n _: 'auth.sendCode',\n phoneNumber: phone,\n apiId: id,\n apiHash: hash,\n settings: {\n _: 'codeSettings',\n logoutTokens: params.futureAuthTokens,\n ...params.codeSettings,\n },\n })\n\n assertTypeIs('sendCode', res, 'auth.sentCode')\n\n return new SentCode(res)\n}\n"]}
1
+ {"version":3,"file":"send-code.js","sourceRoot":"","sources":["../../../../../src/highlevel/methods/auth/send-code.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAAE,MAAM,mCAAmC,CAAA;AAEhE,OAAO,EAAE,QAAQ,EAAE,MAAM,+BAA+B,CAAA;AACxD,OAAO,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAA;AAEhE;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,QAAQ,CAC1B,MAAuB,EACvB,MAYC;IAED,MAAM,KAAK,GAAG,oBAAoB,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;IAEhD,MAAM,EAAE,EAAE,EAAE,IAAI,EAAE,GAAG,MAAM,MAAM,CAAC,gBAAgB,EAAE,CAAA;IAEpD,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,IAAI,CACzB;QACI,CAAC,EAAE,eAAe;QAClB,WAAW,EAAE,KAAK;QAClB,KAAK,EAAE,EAAE;QACT,OAAO,EAAE,IAAI;QACb,QAAQ,EAAE;YACN,CAAC,EAAE,cAAc;YACjB,YAAY,EAAE,MAAM,CAAC,gBAAgB;YACrC,GAAG,MAAM,CAAC,YAAY;SACzB;KACJ,EACD,EAAE,WAAW,EAAE,MAAM,CAAC,WAAW,EAAE,CACtC,CAAA;IAED,YAAY,CAAC,UAAU,EAAE,GAAG,EAAE,eAAe,CAAC,CAAA;IAE9C,OAAO,IAAI,QAAQ,CAAC,GAAG,CAAC,CAAA;AAC5B,CAAC","sourcesContent":["import { tl } from '@mtcute/tl'\n\nimport { assertTypeIs } from '../../../utils/type-assertions.js'\nimport { ITelegramClient } from '../../client.types.js'\nimport { SentCode } from '../../types/auth/sent-code.js'\nimport { normalizePhoneNumber } from '../../utils/misc-utils.js'\n\n/**\n * Send the confirmation code to the given phone number\n *\n * @returns An object containing information about the sent confirmation code\n */\nexport async function sendCode(\n client: ITelegramClient,\n params: {\n /** Phone number in international format */\n phone: string\n\n /** Saved future auth tokens, if any */\n futureAuthTokens?: Uint8Array[]\n\n /** Additional code settings to pass to the server */\n codeSettings?: Omit<tl.RawCodeSettings, '_' | 'logoutTokens'>\n\n /** Abort signal */\n abortSignal?: AbortSignal\n },\n): Promise<SentCode> {\n const phone = normalizePhoneNumber(params.phone)\n\n const { id, hash } = await client.getApiCrenetials()\n\n const res = await client.call(\n {\n _: 'auth.sendCode',\n phoneNumber: phone,\n apiId: id,\n apiHash: hash,\n settings: {\n _: 'codeSettings',\n logoutTokens: params.futureAuthTokens,\n ...params.codeSettings,\n },\n },\n { abortSignal: params.abortSignal },\n )\n\n assertTypeIs('sendCode', res, 'auth.sentCode')\n\n return new SentCode(res)\n}\n"]}
@@ -0,0 +1,28 @@
1
+ import { MaybePromise } from '../../../types/utils.js';
2
+ import { ITelegramClient } from '../../client.types.js';
3
+ import { MaybeDynamic, User } from '../../types/index.js';
4
+ /**
5
+ * Execute the [QR login flow](https://core.telegram.org/api/qr-login).
6
+ *
7
+ * This method will resolve once the authorization is complete,
8
+ * returning the authorized user.
9
+ */
10
+ export declare function signInQr(client: ITelegramClient, params: {
11
+ /**
12
+ * Function that will be called whenever the login URL is changed.
13
+ *
14
+ * The app is expected to display `url` as a QR code to the user
15
+ */
16
+ onUrlUpdated: (url: string, expires: Date) => void;
17
+ /** Password for 2FA */
18
+ password?: MaybeDynamic<string>;
19
+ /**
20
+ * Function that will be called after the server has rejected the password.
21
+ *
22
+ * Note that in case {@link password} is not a function,
23
+ * this callback will never be called, and an error will be thrown instead.
24
+ */
25
+ invalidPasswordCallback?: () => MaybePromise<void>;
26
+ /** Abort signal */
27
+ abortSignal?: AbortSignal;
28
+ }): Promise<User>;
@@ -0,0 +1,121 @@
1
+ import { tl } from '@mtcute/tl';
2
+ import { getPlatform } from '../../../platform.js';
3
+ import { createControllablePromise } from '../../../utils/controllable-promise.js';
4
+ import { sleepWithAbort } from '../../../utils/misc-utils.js';
5
+ import { assertTypeIs } from '../../../utils/type-assertions.js';
6
+ import { User } from '../../types/index.js';
7
+ import { resolveMaybeDynamic } from '../../utils/misc-utils.js';
8
+ import { checkPassword } from './check-password.js';
9
+ // @available=user
10
+ /**
11
+ * Execute the [QR login flow](https://core.telegram.org/api/qr-login).
12
+ *
13
+ * This method will resolve once the authorization is complete,
14
+ * returning the authorized user.
15
+ */
16
+ export async function signInQr(client, params) {
17
+ const { onUrlUpdated, abortSignal } = params;
18
+ let waiter;
19
+ // crutch – we need to wait for the updateLoginToken update.
20
+ // we replace the server update handler temporarily because:
21
+ // - updates manager may be disabled, in which case `onUpdate` will never be called
22
+ // - even if the updates manager is enabled, it won't start until we're logged in
23
+ //
24
+ // todo: how can we make this more clean?
25
+ const originalHandler = client.getServerUpdateHandler();
26
+ const onUpdate = (upd) => {
27
+ if (upd._ === 'updateShort' && upd.update._ === 'updateLoginToken') {
28
+ waiter?.resolve();
29
+ client.onServerUpdate(originalHandler);
30
+ }
31
+ };
32
+ client.onServerUpdate(onUpdate);
33
+ abortSignal?.addEventListener('abort', () => {
34
+ client.onServerUpdate(originalHandler);
35
+ waiter?.reject(abortSignal.reason);
36
+ });
37
+ async function handle2fa(input) {
38
+ const isDynamic = typeof input === 'function';
39
+ while (true) {
40
+ const password = await resolveMaybeDynamic(input);
41
+ try {
42
+ return await checkPassword(client, password);
43
+ }
44
+ catch (e) {
45
+ if (tl.RpcError.is(e, 'PASSWORD_HASH_INVALID')) {
46
+ if (!isDynamic) {
47
+ throw e;
48
+ }
49
+ if (params.invalidPasswordCallback) {
50
+ await params.invalidPasswordCallback?.();
51
+ }
52
+ else {
53
+ // eslint-disable-next-line no-console
54
+ console.log('Invalid password. Please try again');
55
+ }
56
+ continue;
57
+ }
58
+ throw e;
59
+ }
60
+ }
61
+ }
62
+ try {
63
+ const { id, hash } = await client.getApiCrenetials();
64
+ const platform = getPlatform();
65
+ loop: while (true) {
66
+ let res;
67
+ try {
68
+ res = await client.call({
69
+ _: 'auth.exportLoginToken',
70
+ apiId: id,
71
+ apiHash: hash,
72
+ exceptIds: [],
73
+ }, { abortSignal });
74
+ }
75
+ catch (e) {
76
+ if (tl.RpcError.is(e, 'SESSION_PASSWORD_NEEDED') && params.password) {
77
+ return handle2fa(params.password);
78
+ }
79
+ throw e;
80
+ }
81
+ switch (res._) {
82
+ case 'auth.loginToken':
83
+ onUrlUpdated(`tg://login?token=${platform.base64Encode(res.token, true)}`, new Date(res.expires * 1000));
84
+ waiter = createControllablePromise();
85
+ await Promise.race([waiter, sleepWithAbort(res.expires * 1000 - Date.now(), client.stopSignal)]);
86
+ break;
87
+ case 'auth.loginTokenMigrateTo': {
88
+ await client.changePrimaryDc(res.dcId);
89
+ let res2;
90
+ try {
91
+ res2 = await client.call({
92
+ _: 'auth.importLoginToken',
93
+ token: res.token,
94
+ }, { abortSignal });
95
+ }
96
+ catch (e) {
97
+ if (tl.RpcError.is(e, 'SESSION_PASSWORD_NEEDED') && params.password) {
98
+ return handle2fa(params.password);
99
+ }
100
+ throw e;
101
+ }
102
+ assertTypeIs('auth.importLoginToken', res2, 'auth.loginTokenSuccess');
103
+ break loop;
104
+ }
105
+ case 'auth.loginTokenSuccess':
106
+ break loop;
107
+ }
108
+ }
109
+ const [self] = await client.call({
110
+ _: 'users.getUsers',
111
+ id: [{ _: 'inputUserSelf' }],
112
+ }, { abortSignal });
113
+ assertTypeIs('users.getUsers', self, 'user');
114
+ await client.notifyLoggedIn(self);
115
+ return new User(self);
116
+ }
117
+ finally {
118
+ client.onServerUpdate(originalHandler);
119
+ }
120
+ }
121
+ //# sourceMappingURL=sign-in-qr.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sign-in-qr.js","sourceRoot":"","sources":["../../../../../src/highlevel/methods/auth/sign-in-qr.ts"],"names":[],"mappings":"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","sourcesContent":["import { tl } from '@mtcute/tl'\n\nimport { getPlatform } from '../../../platform.js'\nimport { MaybePromise } from '../../../types/utils.js'\nimport { ControllablePromise, createControllablePromise } from '../../../utils/controllable-promise.js'\nimport { sleepWithAbort } from '../../../utils/misc-utils.js'\nimport { assertTypeIs } from '../../../utils/type-assertions.js'\nimport { ITelegramClient, ServerUpdateHandler } from '../../client.types.js'\nimport { MaybeDynamic, User } from '../../types/index.js'\nimport { resolveMaybeDynamic } from '../../utils/misc-utils.js'\nimport { checkPassword } from './check-password.js'\n\n// @available=user\n/**\n * Execute the [QR login flow](https://core.telegram.org/api/qr-login).\n *\n * This method will resolve once the authorization is complete,\n * returning the authorized user.\n */\nexport async function signInQr(\n client: ITelegramClient,\n params: {\n /**\n * Function that will be called whenever the login URL is changed.\n *\n * The app is expected to display `url` as a QR code to the user\n */\n onUrlUpdated: (url: string, expires: Date) => void\n\n /** Password for 2FA */\n password?: MaybeDynamic<string>\n\n /**\n * Function that will be called after the server has rejected the password.\n *\n * Note that in case {@link password} is not a function,\n * this callback will never be called, and an error will be thrown instead.\n */\n invalidPasswordCallback?: () => MaybePromise<void>\n\n /** Abort signal */\n abortSignal?: AbortSignal\n },\n): Promise<User> {\n const { onUrlUpdated, abortSignal } = params\n\n let waiter: ControllablePromise<void> | undefined\n\n // crutch – we need to wait for the updateLoginToken update.\n // we replace the server update handler temporarily because:\n // - updates manager may be disabled, in which case `onUpdate` will never be called\n // - even if the updates manager is enabled, it won't start until we're logged in\n //\n // todo: how can we make this more clean?\n const originalHandler = client.getServerUpdateHandler()\n\n const onUpdate: ServerUpdateHandler = (upd) => {\n if (upd._ === 'updateShort' && upd.update._ === 'updateLoginToken') {\n waiter?.resolve()\n client.onServerUpdate(originalHandler)\n }\n }\n\n client.onServerUpdate(onUpdate)\n\n abortSignal?.addEventListener('abort', () => {\n client.onServerUpdate(originalHandler)\n waiter?.reject(abortSignal.reason)\n })\n\n async function handle2fa(input: MaybeDynamic<string>) {\n const isDynamic = typeof input === 'function'\n\n while (true) {\n const password = await resolveMaybeDynamic(input)\n\n try {\n return await checkPassword(client, password)\n } catch (e) {\n if (tl.RpcError.is(e, 'PASSWORD_HASH_INVALID')) {\n if (!isDynamic) {\n throw e\n }\n\n if (params.invalidPasswordCallback) {\n await params.invalidPasswordCallback?.()\n } else {\n // eslint-disable-next-line no-console\n console.log('Invalid password. Please try again')\n }\n continue\n }\n\n throw e\n }\n }\n }\n\n try {\n const { id, hash } = await client.getApiCrenetials()\n const platform = getPlatform()\n\n loop: while (true) {\n let res: tl.auth.TypeLoginToken\n\n try {\n res = await client.call(\n {\n _: 'auth.exportLoginToken',\n apiId: id,\n apiHash: hash,\n exceptIds: [],\n },\n { abortSignal },\n )\n } catch (e) {\n if (tl.RpcError.is(e, 'SESSION_PASSWORD_NEEDED') && params.password) {\n return handle2fa(params.password)\n }\n\n throw e\n }\n\n switch (res._) {\n case 'auth.loginToken':\n onUrlUpdated(\n `tg://login?token=${platform.base64Encode(res.token, true)}`,\n new Date(res.expires * 1000),\n )\n\n waiter = createControllablePromise()\n await Promise.race([waiter, sleepWithAbort(res.expires * 1000 - Date.now(), client.stopSignal)])\n break\n case 'auth.loginTokenMigrateTo': {\n await client.changePrimaryDc(res.dcId)\n\n let res2: tl.auth.TypeLoginToken\n\n try {\n res2 = await client.call(\n {\n _: 'auth.importLoginToken',\n token: res.token,\n },\n { abortSignal },\n )\n } catch (e) {\n if (tl.RpcError.is(e, 'SESSION_PASSWORD_NEEDED') && params.password) {\n return handle2fa(params.password)\n }\n\n throw e\n }\n\n assertTypeIs('auth.importLoginToken', res2, 'auth.loginTokenSuccess')\n break loop\n }\n case 'auth.loginTokenSuccess':\n break loop\n }\n }\n\n const [self] = await client.call(\n {\n _: 'users.getUsers',\n id: [{ _: 'inputUserSelf' }],\n },\n { abortSignal },\n )\n assertTypeIs('users.getUsers', self, 'user')\n\n await client.notifyLoggedIn(self)\n\n return new User(self)\n } finally {\n client.onServerUpdate(originalHandler)\n }\n}\n"]}
@@ -14,4 +14,6 @@ export declare function signIn(client: ITelegramClient, params: {
14
14
  phoneCodeHash: string;
15
15
  /** The confirmation code that was received */
16
16
  phoneCode: string;
17
+ /** Abort signal */
18
+ abortSignal?: AbortSignal;
17
19
  }): Promise<User>;
@@ -8,13 +8,13 @@ import { _onAuthorization } from './utils.js';
8
8
  * @throws SessionPasswordNeededError In case a password is needed to sign in
9
9
  */
10
10
  export async function signIn(client, params) {
11
- const { phone, phoneCodeHash, phoneCode } = params;
11
+ const { phone, phoneCodeHash, phoneCode, abortSignal } = params;
12
12
  const res = await client.call({
13
13
  _: 'auth.signIn',
14
14
  phoneNumber: normalizePhoneNumber(phone),
15
15
  phoneCodeHash,
16
16
  phoneCode,
17
- });
17
+ }, { abortSignal });
18
18
  return _onAuthorization(client, res);
19
19
  }
20
20
  //# sourceMappingURL=sign-in.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"sign-in.js","sourceRoot":"","sources":["../../../../../src/highlevel/methods/auth/sign-in.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAA;AAChE,OAAO,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAA;AAE7C;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,MAAM,CACxB,MAAuB,EACvB,MAOC;IAED,MAAM,EAAE,KAAK,EAAE,aAAa,EAAE,SAAS,EAAE,GAAG,MAAM,CAAA;IAElD,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC;QAC1B,CAAC,EAAE,aAAa;QAChB,WAAW,EAAE,oBAAoB,CAAC,KAAK,CAAC;QACxC,aAAa;QACb,SAAS;KACZ,CAAC,CAAA;IAEF,OAAO,gBAAgB,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;AACxC,CAAC","sourcesContent":["import { ITelegramClient } from '../../client.types.js'\nimport { User } from '../../types/peers/user.js'\nimport { normalizePhoneNumber } from '../../utils/misc-utils.js'\nimport { _onAuthorization } from './utils.js'\n\n/**\n * Authorize a user in Telegram with a valid confirmation code.\n *\n * @returns If the code was valid and authorization succeeded, the {@link User} is returned.\n * @throws BadRequestError In case the arguments are invalid\n * @throws SessionPasswordNeededError In case a password is needed to sign in\n */\nexport async function signIn(\n client: ITelegramClient,\n params: {\n /** Phone number in international format */\n phone: string\n /** Code identifier from {@link sendCode} */\n phoneCodeHash: string\n /** The confirmation code that was received */\n phoneCode: string\n },\n): Promise<User> {\n const { phone, phoneCodeHash, phoneCode } = params\n\n const res = await client.call({\n _: 'auth.signIn',\n phoneNumber: normalizePhoneNumber(phone),\n phoneCodeHash,\n phoneCode,\n })\n\n return _onAuthorization(client, res)\n}\n"]}
1
+ {"version":3,"file":"sign-in.js","sourceRoot":"","sources":["../../../../../src/highlevel/methods/auth/sign-in.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAA;AAChE,OAAO,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAA;AAE7C;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,MAAM,CACxB,MAAuB,EACvB,MASC;IAED,MAAM,EAAE,KAAK,EAAE,aAAa,EAAE,SAAS,EAAE,WAAW,EAAE,GAAG,MAAM,CAAA;IAE/D,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,IAAI,CACzB;QACI,CAAC,EAAE,aAAa;QAChB,WAAW,EAAE,oBAAoB,CAAC,KAAK,CAAC;QACxC,aAAa;QACb,SAAS;KACZ,EACD,EAAE,WAAW,EAAE,CAClB,CAAA;IAED,OAAO,gBAAgB,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;AACxC,CAAC","sourcesContent":["import { ITelegramClient } from '../../client.types.js'\nimport { User } from '../../types/peers/user.js'\nimport { normalizePhoneNumber } from '../../utils/misc-utils.js'\nimport { _onAuthorization } from './utils.js'\n\n/**\n * Authorize a user in Telegram with a valid confirmation code.\n *\n * @returns If the code was valid and authorization succeeded, the {@link User} is returned.\n * @throws BadRequestError In case the arguments are invalid\n * @throws SessionPasswordNeededError In case a password is needed to sign in\n */\nexport async function signIn(\n client: ITelegramClient,\n params: {\n /** Phone number in international format */\n phone: string\n /** Code identifier from {@link sendCode} */\n phoneCodeHash: string\n /** The confirmation code that was received */\n phoneCode: string\n /** Abort signal */\n abortSignal?: AbortSignal\n },\n): Promise<User> {\n const { phone, phoneCodeHash, phoneCode, abortSignal } = params\n\n const res = await client.call(\n {\n _: 'auth.signIn',\n phoneNumber: normalizePhoneNumber(phone),\n phoneCodeHash,\n phoneCode,\n },\n { abortSignal },\n )\n\n return _onAuthorization(client, res)\n}\n"]}
@@ -32,6 +32,14 @@ export declare function start(client: ITelegramClient, params: {
32
32
  * Whether to overwrite existing session.
33
33
  */
34
34
  sessionForce?: boolean;
35
+ /**
36
+ * When passed, [QR login flow](https://core.telegram.org/api/qr-login)
37
+ * will be used instead of the regular login flow.
38
+ *
39
+ * This function will be called whenever the login URL is changed,
40
+ * and the app is expected to display it as a QR code to the user.
41
+ */
42
+ qrCodeHandler?: (url: string, expires: Date) => void;
35
43
  /**
36
44
  * Phone number of the account.
37
45
  * If account does not exist, it will be created
@@ -76,4 +84,6 @@ export declare function start(client: ITelegramClient, params: {
76
84
  futureAuthTokens?: Uint8Array[];
77
85
  /** Additional code settings to pass to the server */
78
86
  codeSettings?: Omit<tl.RawCodeSettings, '_' | 'logoutTokens'>;
87
+ /** Abort signal */
88
+ abortSignal?: AbortSignal;
79
89
  }): Promise<User>;
@@ -8,6 +8,7 @@ import { resendCode } from './resend-code.js';
8
8
  import { sendCode } from './send-code.js';
9
9
  import { signIn } from './sign-in.js';
10
10
  import { signInBot } from './sign-in-bot.js';
11
+ import { signInQr } from './sign-in-qr.js';
11
12
  // @available=both
12
13
  /**
13
14
  * Start the client in an interactive and declarative manner,
@@ -26,6 +27,7 @@ export async function start(client, params) {
26
27
  if (params.session) {
27
28
  await client.importSession(params.session, params.sessionForce);
28
29
  }
30
+ const { abortSignal } = params;
29
31
  let has2fa = false;
30
32
  let sentCode;
31
33
  let phone = null;
@@ -45,7 +47,7 @@ export async function start(client, params) {
45
47
  }
46
48
  }
47
49
  // if has2fa == true, then we are half-logged in, but need to enter password
48
- if (!has2fa) {
50
+ if (!has2fa && !params.qrCodeHandler) {
49
51
  if (!params.phone && !params.botToken) {
50
52
  throw new MtArgumentError('Neither phone nor bot token were provided');
51
53
  }
@@ -68,6 +70,7 @@ export async function start(client, params) {
68
70
  phone,
69
71
  futureAuthTokens: params.futureAuthTokens,
70
72
  codeSettings: params.codeSettings,
73
+ abortSignal,
71
74
  });
72
75
  }
73
76
  catch (e) {
@@ -81,7 +84,11 @@ export async function start(client, params) {
81
84
  }
82
85
  if (sentCode) {
83
86
  if (params.forceSms && (sentCode.type === 'app' || sentCode.type === 'email')) {
84
- sentCode = await resendCode(client, { phone: phone, phoneCodeHash: sentCode.phoneCodeHash });
87
+ sentCode = await resendCode(client, {
88
+ phone: phone,
89
+ phoneCodeHash: sentCode.phoneCodeHash,
90
+ abortSignal,
91
+ });
85
92
  }
86
93
  if (params.codeSentCallback) {
87
94
  await params.codeSentCallback(sentCode);
@@ -97,7 +104,12 @@ export async function start(client, params) {
97
104
  if (!code)
98
105
  throw new tl.RpcError(400, 'PHONE_CODE_EMPTY');
99
106
  try {
100
- return await signIn(client, { phone: phone, phoneCodeHash: sentCode.phoneCodeHash, phoneCode: code });
107
+ return await signIn(client, {
108
+ phone: phone,
109
+ phoneCodeHash: sentCode.phoneCodeHash,
110
+ phoneCode: code,
111
+ abortSignal,
112
+ });
101
113
  }
102
114
  catch (e) {
103
115
  if (!tl.RpcError.is(e))
@@ -155,6 +167,16 @@ export async function start(client, params) {
155
167
  }
156
168
  }
157
169
  }
170
+ if (params.qrCodeHandler) {
171
+ return await signInQr(client, {
172
+ onUrlUpdated: params.qrCodeHandler,
173
+ password: params.password,
174
+ invalidPasswordCallback: params.invalidCodeCallback ?
175
+ () => params.invalidCodeCallback('password') :
176
+ undefined,
177
+ abortSignal,
178
+ });
179
+ }
158
180
  throw new MtArgumentError('Failed to log in with provided credentials');
159
181
  }
160
182
  //# sourceMappingURL=start.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"start.js","sourceRoot":"","sources":["../../../../../src/highlevel/methods/auth/start.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable no-console */\nimport { tl } from '@mtcute/tl'\n\nimport { MtArgumentError, MtcuteError } from '../../../types/errors.js'\nimport { MaybePromise } from '../../../types/utils.js'\nimport { ITelegramClient } from '../../client.types.js'\nimport { SentCode } from '../../types/auth/sent-code.js'\nimport { User } from '../../types/peers/user.js'\nimport { MaybeDynamic } from '../../types/utils.js'\nimport { normalizePhoneNumber, resolveMaybeDynamic } from '../../utils/misc-utils.js'\nimport { StringSessionData } from '../../utils/string-session.js'\nimport { getMe } from '../users/get-me.js'\nimport { checkPassword } from './check-password.js'\nimport { resendCode } from './resend-code.js'\nimport { sendCode } from './send-code.js'\nimport { signIn } from './sign-in.js'\nimport { signInBot } from './sign-in-bot.js'\n\n// @available=both\n/**\n * Start the client in an interactive and declarative manner,\n * by providing callbacks for authorization details.\n *\n * This method handles both login and sign up, and also handles 2FV\n *\n * All parameters are `MaybeDynamic<T>`, meaning you\n * can either supply `T`, or a function that returns `MaybePromise<T>`\n *\n * This method is intended for simple and fast use in automated\n * scripts and bots. If you are developing a custom client,\n * you'll probably need to use other auth methods.\n */\nexport async function start(\n client: ITelegramClient,\n params: {\n /**\n * String session exported using {@link TelegramClient.exportSession}.\n *\n * This simply calls {@link TelegramClient.importSession} before anything else.\n *\n * Note that passed session will be ignored in case storage already\n * contains authorization.\n */\n session?: string | StringSessionData\n\n /**\n * Whether to overwrite existing session.\n */\n sessionForce?: boolean\n\n /**\n * Phone number of the account.\n * If account does not exist, it will be created\n */\n phone?: MaybeDynamic<string>\n\n /**\n * Bot token to use. Ignored if `phone` is supplied.\n */\n botToken?: MaybeDynamic<string>\n\n /**\n * 2FA password. Ignored if `botToken` is supplied\n */\n password?: MaybeDynamic<string>\n\n /**\n * Code sent to the phone (either sms, call, flash call or other).\n * Ignored if `botToken` is supplied, must be present if `phone` is supplied.\n */\n code?: MaybeDynamic<string>\n\n /**\n * If passed, this function will be called if provided code or 2FA password\n * was invalid. New code/password will be requested later.\n *\n * If provided `code`/`password` is a constant string, providing an\n * invalid one will interrupt authorization flow.\n */\n invalidCodeCallback?: (type: 'code' | 'password') => MaybePromise<void>\n\n /**\n * Whether to force code delivery through SMS\n */\n forceSms?: boolean\n\n /**\n * Custom method that is called when a code is sent. Can be used\n * to show a GUI alert of some kind.\n *\n * This method is called *before* {@link start.params.code}.\n *\n * @param code\n * @default `console.log`.\n */\n codeSentCallback?: (code: SentCode) => MaybePromise<void>\n\n /** Saved future auth tokens, if any */\n futureAuthTokens?: Uint8Array[]\n\n /** Additional code settings to pass to the server */\n codeSettings?: Omit<tl.RawCodeSettings, '_' | 'logoutTokens'>\n },\n): Promise<User> {\n if (params.session) {\n await client.importSession(params.session, params.sessionForce)\n }\n\n let has2fa = false\n let sentCode: SentCode | undefined\n let phone: string | null = null\n\n try {\n const me = await getMe(client)\n\n // user is already authorized\n\n client.log.info('Logged in as %s (ID: %s, username: %s, bot: %s)', me.displayName, me.id, me.username, me.isBot)\n\n await client.notifyLoggedIn(me.raw)\n\n return me\n } catch (e) {\n if (tl.RpcError.is(e)) {\n if (e.text === 'SESSION_PASSWORD_NEEDED') has2fa = true\n else if (e.text !== 'AUTH_KEY_UNREGISTERED') throw e\n }\n }\n\n // if has2fa == true, then we are half-logged in, but need to enter password\n if (!has2fa) {\n if (!params.phone && !params.botToken) {\n throw new MtArgumentError('Neither phone nor bot token were provided')\n }\n\n phone = params.phone ? await resolveMaybeDynamic(params.phone) : null\n\n if (phone) {\n phone = normalizePhoneNumber(phone)\n\n if (!params.code) {\n throw new MtArgumentError('You must pass `code` to use `phone`')\n }\n } else {\n const botToken = params.botToken ? await resolveMaybeDynamic(params.botToken) : null\n\n if (!botToken) {\n throw new MtArgumentError('Either bot token or phone number must be provided')\n }\n\n return await signInBot(client, botToken)\n }\n\n try {\n sentCode = await sendCode(client, {\n phone,\n futureAuthTokens: params.futureAuthTokens,\n codeSettings: params.codeSettings,\n })\n } catch (e) {\n if (tl.RpcError.is(e, 'SESSION_PASSWORD_NEEDED')) {\n has2fa = true\n } else {\n throw e\n }\n }\n }\n\n if (sentCode) {\n if (params.forceSms && (sentCode.type === 'app' || sentCode.type === 'email')) {\n sentCode = await resendCode(client, { phone: phone!, phoneCodeHash: sentCode.phoneCodeHash })\n }\n\n if (params.codeSentCallback) {\n await params.codeSentCallback(sentCode)\n } else {\n if (sentCode.type === 'email_required') {\n throw new MtcuteError('Email login setup is required to sign in')\n }\n\n console.log(`The confirmation code has been sent via ${sentCode.type}.`)\n }\n\n for (;;) {\n const code = await resolveMaybeDynamic(params.code)\n if (!code) throw new tl.RpcError(400, 'PHONE_CODE_EMPTY')\n\n try {\n return await signIn(client, { phone: phone!, phoneCodeHash: sentCode.phoneCodeHash, phoneCode: code })\n } catch (e) {\n if (!tl.RpcError.is(e)) throw e\n\n if (e.is('SESSION_PASSWORD_NEEDED')) {\n has2fa = true\n break\n } else if (\n e.is('PHONE_CODE_EMPTY') ||\n e.is('PHONE_CODE_EXPIRED') ||\n e.is('PHONE_CODE_INVALID') ||\n e.is('PHONE_CODE_HASH_EMPTY')\n ) {\n if (typeof params.code !== 'function') {\n throw new MtArgumentError('Provided code was invalid')\n }\n\n if (params.invalidCodeCallback) {\n await params.invalidCodeCallback('code')\n } else {\n console.log('Invalid code. Please try again')\n }\n\n continue\n } else throw e\n }\n\n // if there was no error, code was valid, so it's either 2fa or signup\n break\n }\n }\n\n if (has2fa) {\n if (!params.password) {\n throw new MtArgumentError('2FA is enabled, but `password` was not provided.')\n }\n\n for (;;) {\n const password = await resolveMaybeDynamic(params.password)\n\n try {\n return await checkPassword(client, password)\n } catch (e) {\n if (typeof params.password !== 'function') {\n throw new MtArgumentError('Provided password was invalid')\n }\n\n if (tl.RpcError.is(e, 'PASSWORD_HASH_INVALID')) {\n if (params.invalidCodeCallback) {\n await params.invalidCodeCallback('password')\n } else {\n console.log('Invalid password. Please try again')\n }\n continue\n } else throw e\n }\n }\n }\n\n throw new MtArgumentError('Failed to log in with provided credentials')\n}\n"]}
1
+ {"version":3,"file":"start.js","sourceRoot":"","sources":["../../../../../src/highlevel/methods/auth/start.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable no-console */\nimport { tl } from '@mtcute/tl'\n\nimport { MtArgumentError, MtcuteError } from '../../../types/errors.js'\nimport { MaybePromise } from '../../../types/utils.js'\nimport { ITelegramClient } from '../../client.types.js'\nimport { SentCode } from '../../types/auth/sent-code.js'\nimport { User } from '../../types/peers/user.js'\nimport { MaybeDynamic } from '../../types/utils.js'\nimport { normalizePhoneNumber, resolveMaybeDynamic } from '../../utils/misc-utils.js'\nimport { StringSessionData } from '../../utils/string-session.js'\nimport { getMe } from '../users/get-me.js'\nimport { checkPassword } from './check-password.js'\nimport { resendCode } from './resend-code.js'\nimport { sendCode } from './send-code.js'\nimport { signIn } from './sign-in.js'\nimport { signInBot } from './sign-in-bot.js'\nimport { signInQr } from './sign-in-qr.js'\n\n// @available=both\n/**\n * Start the client in an interactive and declarative manner,\n * by providing callbacks for authorization details.\n *\n * This method handles both login and sign up, and also handles 2FV\n *\n * All parameters are `MaybeDynamic<T>`, meaning you\n * can either supply `T`, or a function that returns `MaybePromise<T>`\n *\n * This method is intended for simple and fast use in automated\n * scripts and bots. If you are developing a custom client,\n * you'll probably need to use other auth methods.\n */\nexport async function start(\n client: ITelegramClient,\n params: {\n /**\n * String session exported using {@link TelegramClient.exportSession}.\n *\n * This simply calls {@link TelegramClient.importSession} before anything else.\n *\n * Note that passed session will be ignored in case storage already\n * contains authorization.\n */\n session?: string | StringSessionData\n\n /**\n * Whether to overwrite existing session.\n */\n sessionForce?: boolean\n\n /**\n * When passed, [QR login flow](https://core.telegram.org/api/qr-login)\n * will be used instead of the regular login flow.\n *\n * This function will be called whenever the login URL is changed,\n * and the app is expected to display it as a QR code to the user.\n */\n qrCodeHandler?: (url: string, expires: Date) => void\n\n /**\n * Phone number of the account.\n * If account does not exist, it will be created\n */\n phone?: MaybeDynamic<string>\n\n /**\n * Bot token to use. Ignored if `phone` is supplied.\n */\n botToken?: MaybeDynamic<string>\n\n /**\n * 2FA password. Ignored if `botToken` is supplied\n */\n password?: MaybeDynamic<string>\n\n /**\n * Code sent to the phone (either sms, call, flash call or other).\n * Ignored if `botToken` is supplied, must be present if `phone` is supplied.\n */\n code?: MaybeDynamic<string>\n\n /**\n * If passed, this function will be called if provided code or 2FA password\n * was invalid. New code/password will be requested later.\n *\n * If provided `code`/`password` is a constant string, providing an\n * invalid one will interrupt authorization flow.\n */\n invalidCodeCallback?: (type: 'code' | 'password') => MaybePromise<void>\n\n /**\n * Whether to force code delivery through SMS\n */\n forceSms?: boolean\n\n /**\n * Custom method that is called when a code is sent. Can be used\n * to show a GUI alert of some kind.\n *\n * This method is called *before* {@link start.params.code}.\n *\n * @param code\n * @default `console.log`.\n */\n codeSentCallback?: (code: SentCode) => MaybePromise<void>\n\n /** Saved future auth tokens, if any */\n futureAuthTokens?: Uint8Array[]\n\n /** Additional code settings to pass to the server */\n codeSettings?: Omit<tl.RawCodeSettings, '_' | 'logoutTokens'>\n\n /** Abort signal */\n abortSignal?: AbortSignal\n },\n): Promise<User> {\n if (params.session) {\n await client.importSession(params.session, params.sessionForce)\n }\n\n const { abortSignal } = params\n\n let has2fa = false\n let sentCode: SentCode | undefined\n let phone: string | null = null\n\n try {\n const me = await getMe(client)\n\n // user is already authorized\n\n client.log.info('Logged in as %s (ID: %s, username: %s, bot: %s)', me.displayName, me.id, me.username, me.isBot)\n\n await client.notifyLoggedIn(me.raw)\n\n return me\n } catch (e) {\n if (tl.RpcError.is(e)) {\n if (e.text === 'SESSION_PASSWORD_NEEDED') has2fa = true\n else if (e.text !== 'AUTH_KEY_UNREGISTERED') throw e\n }\n }\n\n // if has2fa == true, then we are half-logged in, but need to enter password\n if (!has2fa && !params.qrCodeHandler) {\n if (!params.phone && !params.botToken) {\n throw new MtArgumentError('Neither phone nor bot token were provided')\n }\n\n phone = params.phone ? await resolveMaybeDynamic(params.phone) : null\n\n if (phone) {\n phone = normalizePhoneNumber(phone)\n\n if (!params.code) {\n throw new MtArgumentError('You must pass `code` to use `phone`')\n }\n } else {\n const botToken = params.botToken ? await resolveMaybeDynamic(params.botToken) : null\n\n if (!botToken) {\n throw new MtArgumentError('Either bot token or phone number must be provided')\n }\n\n return await signInBot(client, botToken)\n }\n\n try {\n sentCode = await sendCode(client, {\n phone,\n futureAuthTokens: params.futureAuthTokens,\n codeSettings: params.codeSettings,\n abortSignal,\n })\n } catch (e) {\n if (tl.RpcError.is(e, 'SESSION_PASSWORD_NEEDED')) {\n has2fa = true\n } else {\n throw e\n }\n }\n }\n\n if (sentCode) {\n if (params.forceSms && (sentCode.type === 'app' || sentCode.type === 'email')) {\n sentCode = await resendCode(client, {\n phone: phone!,\n phoneCodeHash: sentCode.phoneCodeHash,\n abortSignal,\n })\n }\n\n if (params.codeSentCallback) {\n await params.codeSentCallback(sentCode)\n } else {\n if (sentCode.type === 'email_required') {\n throw new MtcuteError('Email login setup is required to sign in')\n }\n\n console.log(`The confirmation code has been sent via ${sentCode.type}.`)\n }\n\n for (;;) {\n const code = await resolveMaybeDynamic(params.code)\n if (!code) throw new tl.RpcError(400, 'PHONE_CODE_EMPTY')\n\n try {\n return await signIn(client, {\n phone: phone!,\n phoneCodeHash: sentCode.phoneCodeHash,\n phoneCode: code,\n abortSignal,\n })\n } catch (e) {\n if (!tl.RpcError.is(e)) throw e\n\n if (e.is('SESSION_PASSWORD_NEEDED')) {\n has2fa = true\n break\n } else if (\n e.is('PHONE_CODE_EMPTY') ||\n e.is('PHONE_CODE_EXPIRED') ||\n e.is('PHONE_CODE_INVALID') ||\n e.is('PHONE_CODE_HASH_EMPTY')\n ) {\n if (typeof params.code !== 'function') {\n throw new MtArgumentError('Provided code was invalid')\n }\n\n if (params.invalidCodeCallback) {\n await params.invalidCodeCallback('code')\n } else {\n console.log('Invalid code. Please try again')\n }\n\n continue\n } else throw e\n }\n\n // if there was no error, code was valid, so it's either 2fa or signup\n break\n }\n }\n\n if (has2fa) {\n if (!params.password) {\n throw new MtArgumentError('2FA is enabled, but `password` was not provided.')\n }\n\n for (;;) {\n const password = await resolveMaybeDynamic(params.password)\n\n try {\n return await checkPassword(client, password)\n } catch (e) {\n if (typeof params.password !== 'function') {\n throw new MtArgumentError('Provided password was invalid')\n }\n\n if (tl.RpcError.is(e, 'PASSWORD_HASH_INVALID')) {\n if (params.invalidCodeCallback) {\n await params.invalidCodeCallback('password')\n } else {\n console.log('Invalid password. Please try again')\n }\n continue\n } else throw e\n }\n }\n }\n\n if (params.qrCodeHandler) {\n return await signInQr(client, {\n onUrlUpdated: params.qrCodeHandler,\n password: params.password,\n invalidPasswordCallback: params.invalidCodeCallback ?\n () => params.invalidCodeCallback!('password') :\n undefined,\n abortSignal,\n })\n }\n\n throw new MtArgumentError('Failed to log in with provided credentials')\n}\n"]}
@@ -186,6 +186,20 @@ export async function _normalizeInputMedia(client, media, params = {}, uploadMed
186
186
  url: media.url,
187
187
  };
188
188
  }
189
+ if (media.type === 'paid') {
190
+ let medias;
191
+ if (Array.isArray(media.media)) {
192
+ medias = await Promise.all(media.media.map((m) => _normalizeInputMedia(client, m, params)));
193
+ }
194
+ else {
195
+ medias = [await _normalizeInputMedia(client, media.media, params)];
196
+ }
197
+ return {
198
+ _: 'inputMediaPaidMedia',
199
+ starsAmount: Long.isLong(media.starsAmount) ? media.starsAmount : Long.fromNumber(media.starsAmount),
200
+ extendedMedia: medias,
201
+ };
202
+ }
189
203
  let inputFile = undefined;
190
204
  let thumb = undefined;
191
205
  let mime = 'application/octet-stream';