@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"]}
@@ -27,6 +27,9 @@ function _initializeClient(opts) {
27
27
  Object.defineProperty(this, 'stopSignal', {
28
28
  get: () => this._client.stopSignal,
29
29
  });
30
+ Object.defineProperty(this, 'appConfig', {
31
+ get: () => this._client.appConfig,
32
+ });
30
33
  if (!opts.disableUpdates) {
31
34
  const skipConversationUpdates = opts.skipConversationUpdates ?? true;
32
35
  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,mDAAsE;AACtE,wCAA0E;AAK1E,QAAQ;AACR,8DAAuD;AACvD,QAAQ;AACR,oDAAyF;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,6BAAkB,CACxB,+EAA+E,CAClF,CAAA;QACL,CAAC;QAED,IAAI,CAAC,OAAO,GAAG,IAAI,4BAAkB,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,IAAA,mCAAuB,EAAC;YACpB,uBAAuB;YACvB,QAAQ,EAAE,CAAC,MAAM,EAAE,EAAE;gBACjB,IAAI,8BAAY,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,mDAAsE;AACtE,wCAA0E;AAK1E,QAAQ;AACR,8DAAuD;AACvD,QAAQ;AACR,oDAAyF;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,6BAAkB,CACxB,+EAA+E,CAClF,CAAA;QACL,CAAC;QAED,IAAI,CAAC,OAAO,GAAG,IAAI,4BAAkB,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,IAAA,mCAAuB,EAAC;YACpB,uBAAuB;YACvB,QAAQ,EAAE,CAAC,MAAM,EAAE,EAAE;gBACjB,IAAI,8BAAY,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>;
@@ -11,12 +11,12 @@ const misc_utils_js_1 = require("../../utils/misc-utils.js");
11
11
  * {@link SentCode} object returned by {@link sendCode}
12
12
  */
13
13
  async function resendCode(client, params) {
14
- const { phone, phoneCodeHash } = params;
14
+ const { phone, phoneCodeHash, abortSignal } = params;
15
15
  const res = await client.call({
16
16
  _: 'auth.resendCode',
17
17
  phoneNumber: (0, misc_utils_js_1.normalizePhoneNumber)(phone),
18
18
  phoneCodeHash,
19
- });
19
+ }, { abortSignal });
20
20
  (0, type_assertions_js_1.assertTypeIs)('sendCode', res, 'auth.sentCode');
21
21
  return new sent_code_js_1.SentCode(res);
22
22
  }
@@ -1 +1 @@
1
- {"version":3,"file":"resend-code.js","sourceRoot":"","sources":["../../../../../src/highlevel/methods/auth/resend-code.ts"],"names":[],"mappings":";;;AAAA,0EAAgE;AAEhE,gEAAwD;AACxD,6DAAgE;AAEhE;;;;;GAKG;AACI,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,IAAA,oCAAoB,EAAC,KAAK,CAAC;QACxC,aAAa;KAChB,CAAC,CAAA;IAEF,IAAA,iCAAY,EAAC,UAAU,EAAE,GAAG,EAAE,eAAe,CAAC,CAAA;IAE9C,OAAO,IAAI,uBAAQ,CAAC,GAAG,CAAC,CAAA;AAC5B,CAAC;AArBD,gCAqBC","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,0EAAgE;AAEhE,gEAAwD;AACxD,6DAAgE;AAEhE;;;;;GAKG;AACI,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,IAAA,oCAAoB,EAAC,KAAK,CAAC;QACxC,aAAa;KAChB,EACD,EAAE,WAAW,EAAE,CAClB,CAAA;IAED,IAAA,iCAAY,EAAC,UAAU,EAAE,GAAG,EAAE,eAAe,CAAC,CAAA;IAE9C,OAAO,IAAI,uBAAQ,CAAC,GAAG,CAAC,CAAA;AAC5B,CAAC;AA3BD,gCA2BC","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>;
@@ -22,7 +22,7 @@ async function sendCode(client, params) {
22
22
  logoutTokens: params.futureAuthTokens,
23
23
  ...params.codeSettings,
24
24
  },
25
- });
25
+ }, { abortSignal: params.abortSignal });
26
26
  (0, type_assertions_js_1.assertTypeIs)('sendCode', res, 'auth.sentCode');
27
27
  return new sent_code_js_1.SentCode(res);
28
28
  }
@@ -1 +1 @@
1
- {"version":3,"file":"send-code.js","sourceRoot":"","sources":["../../../../../src/highlevel/methods/auth/send-code.ts"],"names":[],"mappings":";;;AAEA,0EAAgE;AAEhE,gEAAwD;AACxD,6DAAgE;AAEhE;;;;GAIG;AACI,KAAK,UAAU,QAAQ,CAC1B,MAAuB,EACvB,MASC;IAED,MAAM,KAAK,GAAG,IAAA,oCAAoB,EAAC,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,IAAA,iCAAY,EAAC,UAAU,EAAE,GAAG,EAAE,eAAe,CAAC,CAAA;IAE9C,OAAO,IAAI,uBAAQ,CAAC,GAAG,CAAC,CAAA;AAC5B,CAAC;AAhCD,4BAgCC","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,0EAAgE;AAEhE,gEAAwD;AACxD,6DAAgE;AAEhE;;;;GAIG;AACI,KAAK,UAAU,QAAQ,CAC1B,MAAuB,EACvB,MAYC;IAED,MAAM,KAAK,GAAG,IAAA,oCAAoB,EAAC,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,IAAA,iCAAY,EAAC,UAAU,EAAE,GAAG,EAAE,eAAe,CAAC,CAAA;IAE9C,OAAO,IAAI,uBAAQ,CAAC,GAAG,CAAC,CAAA;AAC5B,CAAC;AAtCD,4BAsCC","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,125 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.signInQr = void 0;
4
+ const tl_1 = require("@mtcute/tl");
5
+ const platform_js_1 = require("../../../platform.js");
6
+ const controllable_promise_js_1 = require("../../../utils/controllable-promise.js");
7
+ const misc_utils_js_1 = require("../../../utils/misc-utils.js");
8
+ const type_assertions_js_1 = require("../../../utils/type-assertions.js");
9
+ const index_js_1 = require("../../types/index.js");
10
+ const misc_utils_js_2 = require("../../utils/misc-utils.js");
11
+ const check_password_js_1 = require("./check-password.js");
12
+ // @available=user
13
+ /**
14
+ * Execute the [QR login flow](https://core.telegram.org/api/qr-login).
15
+ *
16
+ * This method will resolve once the authorization is complete,
17
+ * returning the authorized user.
18
+ */
19
+ async function signInQr(client, params) {
20
+ const { onUrlUpdated, abortSignal } = params;
21
+ let waiter;
22
+ // crutch – we need to wait for the updateLoginToken update.
23
+ // we replace the server update handler temporarily because:
24
+ // - updates manager may be disabled, in which case `onUpdate` will never be called
25
+ // - even if the updates manager is enabled, it won't start until we're logged in
26
+ //
27
+ // todo: how can we make this more clean?
28
+ const originalHandler = client.getServerUpdateHandler();
29
+ const onUpdate = (upd) => {
30
+ if (upd._ === 'updateShort' && upd.update._ === 'updateLoginToken') {
31
+ waiter?.resolve();
32
+ client.onServerUpdate(originalHandler);
33
+ }
34
+ };
35
+ client.onServerUpdate(onUpdate);
36
+ abortSignal?.addEventListener('abort', () => {
37
+ client.onServerUpdate(originalHandler);
38
+ waiter?.reject(abortSignal.reason);
39
+ });
40
+ async function handle2fa(input) {
41
+ const isDynamic = typeof input === 'function';
42
+ while (true) {
43
+ const password = await (0, misc_utils_js_2.resolveMaybeDynamic)(input);
44
+ try {
45
+ return await (0, check_password_js_1.checkPassword)(client, password);
46
+ }
47
+ catch (e) {
48
+ if (tl_1.tl.RpcError.is(e, 'PASSWORD_HASH_INVALID')) {
49
+ if (!isDynamic) {
50
+ throw e;
51
+ }
52
+ if (params.invalidPasswordCallback) {
53
+ await params.invalidPasswordCallback?.();
54
+ }
55
+ else {
56
+ // eslint-disable-next-line no-console
57
+ console.log('Invalid password. Please try again');
58
+ }
59
+ continue;
60
+ }
61
+ throw e;
62
+ }
63
+ }
64
+ }
65
+ try {
66
+ const { id, hash } = await client.getApiCrenetials();
67
+ const platform = (0, platform_js_1.getPlatform)();
68
+ loop: while (true) {
69
+ let res;
70
+ try {
71
+ res = await client.call({
72
+ _: 'auth.exportLoginToken',
73
+ apiId: id,
74
+ apiHash: hash,
75
+ exceptIds: [],
76
+ }, { abortSignal });
77
+ }
78
+ catch (e) {
79
+ if (tl_1.tl.RpcError.is(e, 'SESSION_PASSWORD_NEEDED') && params.password) {
80
+ return handle2fa(params.password);
81
+ }
82
+ throw e;
83
+ }
84
+ switch (res._) {
85
+ case 'auth.loginToken':
86
+ onUrlUpdated(`tg://login?token=${platform.base64Encode(res.token, true)}`, new Date(res.expires * 1000));
87
+ waiter = (0, controllable_promise_js_1.createControllablePromise)();
88
+ await Promise.race([waiter, (0, misc_utils_js_1.sleepWithAbort)(res.expires * 1000 - Date.now(), client.stopSignal)]);
89
+ break;
90
+ case 'auth.loginTokenMigrateTo': {
91
+ await client.changePrimaryDc(res.dcId);
92
+ let res2;
93
+ try {
94
+ res2 = await client.call({
95
+ _: 'auth.importLoginToken',
96
+ token: res.token,
97
+ }, { abortSignal });
98
+ }
99
+ catch (e) {
100
+ if (tl_1.tl.RpcError.is(e, 'SESSION_PASSWORD_NEEDED') && params.password) {
101
+ return handle2fa(params.password);
102
+ }
103
+ throw e;
104
+ }
105
+ (0, type_assertions_js_1.assertTypeIs)('auth.importLoginToken', res2, 'auth.loginTokenSuccess');
106
+ break loop;
107
+ }
108
+ case 'auth.loginTokenSuccess':
109
+ break loop;
110
+ }
111
+ }
112
+ const [self] = await client.call({
113
+ _: 'users.getUsers',
114
+ id: [{ _: 'inputUserSelf' }],
115
+ }, { abortSignal });
116
+ (0, type_assertions_js_1.assertTypeIs)('users.getUsers', self, 'user');
117
+ await client.notifyLoggedIn(self);
118
+ return new index_js_1.User(self);
119
+ }
120
+ finally {
121
+ client.onServerUpdate(originalHandler);
122
+ }
123
+ }
124
+ exports.signInQr = signInQr;
125
+ //# 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>;
@@ -11,13 +11,13 @@ const utils_js_1 = require("./utils.js");
11
11
  * @throws SessionPasswordNeededError In case a password is needed to sign in
12
12
  */
13
13
  async function signIn(client, params) {
14
- const { phone, phoneCodeHash, phoneCode } = params;
14
+ const { phone, phoneCodeHash, phoneCode, abortSignal } = params;
15
15
  const res = await client.call({
16
16
  _: 'auth.signIn',
17
17
  phoneNumber: (0, misc_utils_js_1.normalizePhoneNumber)(phone),
18
18
  phoneCodeHash,
19
19
  phoneCode,
20
- });
20
+ }, { abortSignal });
21
21
  return (0, utils_js_1._onAuthorization)(client, res);
22
22
  }
23
23
  exports.signIn = signIn;
@@ -1 +1 @@
1
- {"version":3,"file":"sign-in.js","sourceRoot":"","sources":["../../../../../src/highlevel/methods/auth/sign-in.ts"],"names":[],"mappings":";;;AAEA,6DAAgE;AAChE,yCAA6C;AAE7C;;;;;;GAMG;AACI,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,IAAA,oCAAoB,EAAC,KAAK,CAAC;QACxC,aAAa;QACb,SAAS;KACZ,CAAC,CAAA;IAEF,OAAO,IAAA,2BAAgB,EAAC,MAAM,EAAE,GAAG,CAAC,CAAA;AACxC,CAAC;AArBD,wBAqBC","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,6DAAgE;AAChE,yCAA6C;AAE7C;;;;;;GAMG;AACI,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,IAAA,oCAAoB,EAAC,KAAK,CAAC;QACxC,aAAa;QACb,SAAS;KACZ,EACD,EAAE,WAAW,EAAE,CAClB,CAAA;IAED,OAAO,IAAA,2BAAgB,EAAC,MAAM,EAAE,GAAG,CAAC,CAAA;AACxC,CAAC;AA1BD,wBA0BC","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>;
@@ -11,6 +11,7 @@ const resend_code_js_1 = require("./resend-code.js");
11
11
  const send_code_js_1 = require("./send-code.js");
12
12
  const sign_in_js_1 = require("./sign-in.js");
13
13
  const sign_in_bot_js_1 = require("./sign-in-bot.js");
14
+ const sign_in_qr_js_1 = require("./sign-in-qr.js");
14
15
  // @available=both
15
16
  /**
16
17
  * Start the client in an interactive and declarative manner,
@@ -29,6 +30,7 @@ async function start(client, params) {
29
30
  if (params.session) {
30
31
  await client.importSession(params.session, params.sessionForce);
31
32
  }
33
+ const { abortSignal } = params;
32
34
  let has2fa = false;
33
35
  let sentCode;
34
36
  let phone = null;
@@ -48,7 +50,7 @@ async function start(client, params) {
48
50
  }
49
51
  }
50
52
  // if has2fa == true, then we are half-logged in, but need to enter password
51
- if (!has2fa) {
53
+ if (!has2fa && !params.qrCodeHandler) {
52
54
  if (!params.phone && !params.botToken) {
53
55
  throw new errors_js_1.MtArgumentError('Neither phone nor bot token were provided');
54
56
  }
@@ -71,6 +73,7 @@ async function start(client, params) {
71
73
  phone,
72
74
  futureAuthTokens: params.futureAuthTokens,
73
75
  codeSettings: params.codeSettings,
76
+ abortSignal,
74
77
  });
75
78
  }
76
79
  catch (e) {
@@ -84,7 +87,11 @@ async function start(client, params) {
84
87
  }
85
88
  if (sentCode) {
86
89
  if (params.forceSms && (sentCode.type === 'app' || sentCode.type === 'email')) {
87
- sentCode = await (0, resend_code_js_1.resendCode)(client, { phone: phone, phoneCodeHash: sentCode.phoneCodeHash });
90
+ sentCode = await (0, resend_code_js_1.resendCode)(client, {
91
+ phone: phone,
92
+ phoneCodeHash: sentCode.phoneCodeHash,
93
+ abortSignal,
94
+ });
88
95
  }
89
96
  if (params.codeSentCallback) {
90
97
  await params.codeSentCallback(sentCode);
@@ -100,7 +107,12 @@ async function start(client, params) {
100
107
  if (!code)
101
108
  throw new tl_1.tl.RpcError(400, 'PHONE_CODE_EMPTY');
102
109
  try {
103
- return await (0, sign_in_js_1.signIn)(client, { phone: phone, phoneCodeHash: sentCode.phoneCodeHash, phoneCode: code });
110
+ return await (0, sign_in_js_1.signIn)(client, {
111
+ phone: phone,
112
+ phoneCodeHash: sentCode.phoneCodeHash,
113
+ phoneCode: code,
114
+ abortSignal,
115
+ });
104
116
  }
105
117
  catch (e) {
106
118
  if (!tl_1.tl.RpcError.is(e))
@@ -158,6 +170,16 @@ async function start(client, params) {
158
170
  }
159
171
  }
160
172
  }
173
+ if (params.qrCodeHandler) {
174
+ return await (0, sign_in_qr_js_1.signInQr)(client, {
175
+ onUrlUpdated: params.qrCodeHandler,
176
+ password: params.password,
177
+ invalidPasswordCallback: params.invalidCodeCallback ?
178
+ () => params.invalidCodeCallback('password') :
179
+ undefined,
180
+ abortSignal,
181
+ });
182
+ }
161
183
  throw new errors_js_1.MtArgumentError('Failed to log in with provided credentials');
162
184
  }
163
185
  exports.start = start;
@@ -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"]}
@@ -192,6 +192,20 @@ async function _normalizeInputMedia(client, media, params = {}, uploadMedia = fa
192
192
  url: media.url,
193
193
  };
194
194
  }
195
+ if (media.type === 'paid') {
196
+ let medias;
197
+ if (Array.isArray(media.media)) {
198
+ medias = await Promise.all(media.media.map((m) => _normalizeInputMedia(client, m, params)));
199
+ }
200
+ else {
201
+ medias = [await _normalizeInputMedia(client, media.media, params)];
202
+ }
203
+ return {
204
+ _: 'inputMediaPaidMedia',
205
+ starsAmount: long_1.default.isLong(media.starsAmount) ? media.starsAmount : long_1.default.fromNumber(media.starsAmount),
206
+ extendedMedia: medias,
207
+ };
208
+ }
195
209
  let inputFile = undefined;
196
210
  let thumb = undefined;
197
211
  let mime = 'application/octet-stream';