@elizaos/plugin-telegram 2.0.0-alpha.9 → 2.0.0-beta.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.
- package/README.md +1 -1
- package/dist/account-auth-service.d.ts +100 -0
- package/dist/account-auth-service.js +25 -0
- package/dist/account-auth-service.js.map +1 -0
- package/dist/chunk-KFEFF6RI.js +642 -0
- package/dist/chunk-KFEFF6RI.js.map +1 -0
- package/dist/index.d.ts +622 -1
- package/dist/index.js +2686 -339
- package/dist/index.js.map +1 -1
- package/package.json +19 -21
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/account-auth-service.ts"],"sourcesContent":["import fs from \"node:fs\";\nimport os from \"node:os\";\nimport path from \"node:path\";\nimport { resolveStateDir } from \"@elizaos/core\";\nimport { Api, TelegramClient } from \"telegram\";\nimport { StringSession } from \"telegram/sessions/index.js\";\n\nexport type TelegramAccountAuthStatus =\n | \"idle\"\n | \"waiting_for_provisioning_code\"\n | \"waiting_for_telegram_code\"\n | \"waiting_for_password\"\n | \"configured\"\n | \"connected\"\n | \"error\";\n\nexport interface TelegramAccountAuthAccount {\n id: string;\n username: string | null;\n firstName: string | null;\n lastName: string | null;\n phone: string | null;\n}\n\nexport interface TelegramAccountAuthSnapshot {\n status: TelegramAccountAuthStatus;\n phone: string | null;\n error: string | null;\n isCodeViaApp: boolean;\n account: TelegramAccountAuthAccount | null;\n}\n\nexport interface TelegramAccountApiCredentials {\n apiId: number;\n apiHash: string;\n}\n\nexport interface TelegramAccountConnectorConfig {\n phone: string;\n appId: string;\n appHash: string;\n deviceModel: string;\n systemVersion: string;\n enabled: true;\n}\n\nexport interface TelegramAccountAuthSessionLike {\n start(options: {\n phone: string;\n credentials: TelegramAccountApiCredentials | null;\n }): Promise<TelegramAccountAuthSnapshot>;\n submit(input: {\n provisioningCode?: string;\n telegramCode?: string;\n password?: string;\n }): Promise<TelegramAccountAuthSnapshot>;\n stop(): Promise<void>;\n getSnapshot(): TelegramAccountAuthSnapshot;\n getResolvedConnectorConfig(): TelegramAccountConnectorConfig | null;\n}\n\ntype TelegramAccountProvisioningApp = {\n api_id: number;\n api_hash: string;\n};\n\ntype PersistedTelegramAccountAuthState = {\n snapshot: TelegramAccountAuthSnapshot;\n credentials: TelegramAccountApiCredentials | null;\n connectorConfig: TelegramAccountConnectorConfig | null;\n provisioningRandomHash: string | null;\n phoneCodeHash: string | null;\n};\n\ntype TelegramAccountAuthDeps = {\n createTelegramClient?: (\n session: StringSession,\n credentials: TelegramAccountApiCredentials,\n deviceModel: string,\n systemVersion: string,\n ) => TelegramClient;\n sendProvisioningCode?: (phone: string) => Promise<string>;\n completeProvisioningLogin?: (\n phone: string,\n randomHash: string,\n code: string,\n ) => Promise<string>;\n getOrCreateProvisionedApp?: (\n stelToken: string,\n ) => Promise<TelegramAccountProvisioningApp>;\n};\n\nconst MY_TELEGRAM_URL = \"https://my.telegram.org\";\nconst TELEGRAM_USER_AGENT =\n \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/133.0.0.0 Safari/537.36\";\nconst TELEGRAM_ACCOUNT_AUTH_STATUSES = new Set<TelegramAccountAuthStatus>([\n \"idle\",\n \"waiting_for_provisioning_code\",\n \"waiting_for_telegram_code\",\n \"waiting_for_password\",\n \"configured\",\n \"connected\",\n \"error\",\n]);\n\nfunction resolveTelegramAccountSessionDir(): string {\n const sessionDir = path.join(resolveStateDir(), \"telegram-account\");\n fs.mkdirSync(sessionDir, { recursive: true });\n return sessionDir;\n}\n\nexport function resolveTelegramAccountSessionFile(): string {\n return path.join(resolveTelegramAccountSessionDir(), \"session.txt\");\n}\n\nfunction resolveTelegramAccountAuthStateFile(): string {\n return path.join(resolveTelegramAccountSessionDir(), \"auth-state.json\");\n}\n\nexport function loadTelegramAccountSessionString(): string {\n const sessionFile = resolveTelegramAccountSessionFile();\n if (!fs.existsSync(sessionFile)) {\n return \"\";\n }\n return fs.readFileSync(sessionFile, \"utf8\").trim();\n}\n\nexport function saveTelegramAccountSessionString(session: string): void {\n fs.writeFileSync(resolveTelegramAccountSessionFile(), session, {\n encoding: \"utf8\",\n mode: 0o600,\n });\n}\n\nexport function clearTelegramAccountSession(): void {\n fs.rmSync(resolveTelegramAccountSessionFile(), { force: true });\n}\n\nexport function telegramAccountSessionExists(): boolean {\n const sessionFile = resolveTelegramAccountSessionFile();\n return fs.existsSync(sessionFile) && fs.statSync(sessionFile).size > 0;\n}\n\nfunction readTrimmedString(value: unknown): string | null {\n if (typeof value !== \"string\") {\n return null;\n }\n const trimmed = value.trim();\n return trimmed.length > 0 ? trimmed : null;\n}\n\nfunction readPersistedAccount(\n value: unknown,\n): TelegramAccountAuthAccount | null {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) {\n return null;\n }\n const record = value as Record<string, unknown>;\n const id = readTrimmedString(record.id);\n if (!id) {\n return null;\n }\n return {\n id,\n username: readTrimmedString(record.username),\n firstName: readTrimmedString(record.firstName),\n lastName: readTrimmedString(record.lastName),\n phone: readTrimmedString(record.phone),\n };\n}\n\nfunction readPersistedSnapshot(\n value: unknown,\n): TelegramAccountAuthSnapshot | null {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) {\n return null;\n }\n const record = value as Record<string, unknown>;\n const status = record.status;\n if (\n typeof status !== \"string\" ||\n !TELEGRAM_ACCOUNT_AUTH_STATUSES.has(status as TelegramAccountAuthStatus)\n ) {\n return null;\n }\n return {\n status: status as TelegramAccountAuthStatus,\n phone: readTrimmedString(record.phone),\n error:\n typeof record.error === \"string\" && record.error.trim().length > 0\n ? record.error\n : null,\n isCodeViaApp: record.isCodeViaApp === true,\n account: readPersistedAccount(record.account),\n };\n}\n\nfunction readPersistedCredentials(\n value: unknown,\n): TelegramAccountApiCredentials | null {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) {\n return null;\n }\n const record = value as Record<string, unknown>;\n const apiIdValue = record.apiId;\n const apiId =\n typeof apiIdValue === \"number\"\n ? apiIdValue\n : typeof apiIdValue === \"string\" && apiIdValue.trim().length > 0\n ? Number.parseInt(apiIdValue, 10)\n : Number.NaN;\n const apiHash = readTrimmedString(record.apiHash);\n if (!Number.isInteger(apiId) || apiId <= 0 || !apiHash) {\n return null;\n }\n return { apiId, apiHash };\n}\n\nfunction readPersistedConnectorConfig(\n value: unknown,\n): TelegramAccountConnectorConfig | null {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) {\n return null;\n }\n const record = value as Record<string, unknown>;\n const phone = readTrimmedString(record.phone);\n const appId = readTrimmedString(record.appId);\n const appHash = readTrimmedString(record.appHash);\n const deviceModel = readTrimmedString(record.deviceModel);\n const systemVersion = readTrimmedString(record.systemVersion);\n if (!phone || !appId || !appHash || !deviceModel || !systemVersion) {\n return null;\n }\n return {\n phone,\n appId,\n appHash,\n deviceModel,\n systemVersion,\n enabled: true,\n };\n}\n\nfunction loadTelegramAccountAuthState(): PersistedTelegramAccountAuthState | null {\n const authStateFile = resolveTelegramAccountAuthStateFile();\n if (!fs.existsSync(authStateFile)) {\n return null;\n }\n\n try {\n const parsed = JSON.parse(\n fs.readFileSync(authStateFile, \"utf8\"),\n ) as unknown;\n if (!parsed || typeof parsed !== \"object\" || Array.isArray(parsed)) {\n return null;\n }\n const record = parsed as Record<string, unknown>;\n const snapshot = readPersistedSnapshot(record.snapshot);\n if (!snapshot) {\n return null;\n }\n return {\n snapshot,\n credentials: readPersistedCredentials(record.credentials),\n connectorConfig: readPersistedConnectorConfig(record.connectorConfig),\n provisioningRandomHash: readTrimmedString(record.provisioningRandomHash),\n phoneCodeHash: readTrimmedString(record.phoneCodeHash),\n };\n } catch {\n return null;\n }\n}\n\nfunction saveTelegramAccountAuthState(\n state: PersistedTelegramAccountAuthState,\n): void {\n fs.writeFileSync(\n resolveTelegramAccountAuthStateFile(),\n JSON.stringify(state),\n {\n encoding: \"utf8\",\n mode: 0o600,\n },\n );\n}\n\nexport function clearTelegramAccountAuthState(): void {\n fs.rmSync(resolveTelegramAccountAuthStateFile(), { force: true });\n}\n\nexport function telegramAccountAuthStateExists(): boolean {\n const authStateFile = resolveTelegramAccountAuthStateFile();\n return fs.existsSync(authStateFile) && fs.statSync(authStateFile).size > 0;\n}\n\nexport function defaultTelegramAccountDeviceModel(): string {\n return \"Eliza Desktop\";\n}\n\nexport function defaultTelegramAccountSystemVersion(): string {\n const platform = os.platform();\n const release = os.release();\n if (platform === \"darwin\") {\n return `macOS ${release}`;\n }\n if (platform === \"win32\") {\n return `Windows ${release}`;\n }\n return `${platform} ${release}`;\n}\n\nfunction mapTelegramAccount(user: Api.User): TelegramAccountAuthAccount {\n return {\n id: user.id.toString(),\n username: typeof user.username === \"string\" ? user.username : null,\n firstName: typeof user.firstName === \"string\" ? user.firstName : null,\n lastName: typeof user.lastName === \"string\" ? user.lastName : null,\n phone: typeof user.phone === \"string\" ? user.phone : null,\n };\n}\n\nfunction createTelegramClient(\n session: StringSession,\n credentials: TelegramAccountApiCredentials,\n deviceModel: string,\n systemVersion: string,\n): TelegramClient {\n return new TelegramClient(session, credentials.apiId, credentials.apiHash, {\n connectionRetries: 5,\n deviceModel,\n systemVersion,\n });\n}\n\ninterface SerializableTelegramSession {\n save(): unknown;\n}\n\nfunction isSerializableTelegramSession(\n session: unknown,\n): session is SerializableTelegramSession {\n return (\n typeof session === \"object\" &&\n session !== null &&\n typeof Reflect.get(session, \"save\") === \"function\"\n );\n}\n\nfunction serializeSession(client: TelegramClient): string {\n if (!isSerializableTelegramSession(client.session)) {\n throw new Error(\"Telegram client session cannot be serialized\");\n }\n const savedSession = client.session.save();\n if (typeof savedSession !== \"string\") {\n throw new Error(\"Telegram client session did not serialize to a string\");\n }\n return savedSession;\n}\n\nfunction createAjaxHeaders(): Record<string, string> {\n return {\n \"Content-Type\": \"application/x-www-form-urlencoded; charset=UTF-8\",\n \"User-Agent\": TELEGRAM_USER_AGENT,\n Origin: MY_TELEGRAM_URL,\n \"X-Requested-With\": \"XMLHttpRequest\",\n };\n}\n\nfunction createFormHeaders(cookie?: string): Record<string, string> {\n return {\n \"Content-Type\": \"application/x-www-form-urlencoded; charset=UTF-8\",\n \"User-Agent\": TELEGRAM_USER_AGENT,\n ...(cookie ? { Cookie: cookie } : {}),\n };\n}\n\nfunction extractRandomHash(data: unknown): string | null {\n if (!data || typeof data !== \"object\") {\n return null;\n }\n const randomHash = (data as { random_hash?: unknown }).random_hash;\n return typeof randomHash === \"string\" && randomHash.trim().length > 0\n ? randomHash.trim()\n : null;\n}\n\nfunction getSetCookieHeaders(headers: Headers): string[] {\n const withGetSetCookie = headers as Headers & {\n getSetCookie?: () => string[];\n };\n if (typeof withGetSetCookie.getSetCookie === \"function\") {\n return withGetSetCookie.getSetCookie();\n }\n const single = headers.get(\"set-cookie\");\n return single ? [single] : [];\n}\n\nfunction extractCookieValue(\n headers: Headers,\n cookieName: string,\n): string | null {\n const pattern = new RegExp(`(?:^|;\\\\s*)${cookieName}=([^;]+)`);\n for (const header of getSetCookieHeaders(headers)) {\n const match = header.match(pattern);\n if (match?.[1]) {\n return match[1];\n }\n }\n return null;\n}\n\nfunction extractProvisionedApp(html: string): TelegramAccountProvisioningApp {\n const apiIdMatch = html.match(\n /<span class=\"form-control input-xlarge uneditable-input\"[^>]*><strong>(\\d+)<\\/strong><\\/span>/,\n );\n const apiHashMatch = html.match(\n /<span class=\"form-control input-xlarge uneditable-input\"[^>]*>([a-f0-9]{32})<\\/span>/i,\n );\n if (!apiIdMatch?.[1] || !apiHashMatch?.[1]) {\n throw new Error(\"Failed to parse Telegram app credentials\");\n }\n return {\n api_id: Number(apiIdMatch[1]),\n api_hash: apiHashMatch[1],\n };\n}\n\nfunction extractCreationHash(html: string): string | null {\n const match = html.match(/<input[^>]*name=\"hash\"[^>]*value=\"([^\"]+)\"/i);\n return match?.[1] ?? null;\n}\n\nasync function sendProvisioningCode(phone: string): Promise<string> {\n const response = await fetch(`${MY_TELEGRAM_URL}/auth/send_password`, {\n method: \"POST\",\n headers: createAjaxHeaders(),\n body: new URLSearchParams({ phone }),\n signal: AbortSignal.timeout(15_000),\n });\n const text = await response.text();\n if (text.includes(\"Sorry, too many tries\")) {\n throw new Error(\"Telegram provisioning is rate limited right now\");\n }\n const parsed = JSON.parse(text) as unknown;\n const randomHash = extractRandomHash(parsed);\n if (!randomHash) {\n throw new Error(\"Telegram provisioning did not return a login token\");\n }\n return randomHash;\n}\n\nasync function completeProvisioningLogin(\n phone: string,\n randomHash: string,\n code: string,\n): Promise<string> {\n const response = await fetch(`${MY_TELEGRAM_URL}/auth/login`, {\n method: \"POST\",\n headers: createAjaxHeaders(),\n body: new URLSearchParams({\n phone,\n random_hash: randomHash,\n password: code,\n }),\n redirect: \"manual\",\n signal: AbortSignal.timeout(15_000),\n });\n const text = await response.text();\n if (text === \"Invalid confirmation code!\") {\n throw new Error(\"Invalid Telegram provisioning code\");\n }\n if (text !== \"true\") {\n throw new Error(\"Telegram provisioning login failed\");\n }\n const stelToken = extractCookieValue(response.headers, \"stel_token\");\n if (!stelToken) {\n throw new Error(\"Telegram provisioning did not return a session token\");\n }\n return stelToken;\n}\n\nasync function getOrCreateProvisionedApp(\n stelToken: string,\n): Promise<TelegramAccountProvisioningApp> {\n const cookie = `stel_token=${stelToken}`;\n const response = await fetch(`${MY_TELEGRAM_URL}/apps`, {\n headers: {\n Cookie: cookie,\n \"User-Agent\": TELEGRAM_USER_AGENT,\n },\n signal: AbortSignal.timeout(15_000),\n });\n const html = await response.text();\n if (/<title>\\s*App configuration\\s*<\\/title>/i.test(html)) {\n return extractProvisionedApp(html);\n }\n if (!/<title>\\s*Create new application\\s*<\\/title>/i.test(html)) {\n throw new Error(\"Telegram app provisioning page could not be parsed\");\n }\n const creationHash = extractCreationHash(html);\n if (!creationHash) {\n throw new Error(\"Telegram app provisioning hash missing\");\n }\n const createResponse = await fetch(`${MY_TELEGRAM_URL}/apps/create`, {\n method: \"POST\",\n headers: createFormHeaders(cookie),\n body: new URLSearchParams({\n hash: creationHash,\n app_title: \"eliza\",\n app_shortname: \"eliza\",\n app_platform: \"other\",\n app_url: \"\",\n app_desc: \"\",\n }),\n signal: AbortSignal.timeout(15_000),\n });\n return extractProvisionedApp(await createResponse.text());\n}\n\nexport class TelegramAccountAuthSession\n implements TelegramAccountAuthSessionLike\n{\n private snapshot: TelegramAccountAuthSnapshot = {\n status: \"idle\",\n phone: null,\n error: null,\n isCodeViaApp: false,\n account: null,\n };\n private client: TelegramClient | null = null;\n private credentials: TelegramAccountApiCredentials | null = null;\n private connectorConfig: TelegramAccountConnectorConfig | null = null;\n private provisioningRandomHash: string | null = null;\n private phoneCodeHash: string | null = null;\n private readonly deviceModel: string;\n private readonly systemVersion: string;\n private readonly deps: Required<TelegramAccountAuthDeps>;\n\n constructor(\n options: {\n deviceModel?: string;\n systemVersion?: string;\n } = {},\n deps: TelegramAccountAuthDeps = {},\n ) {\n this.deviceModel =\n options.deviceModel?.trim() || defaultTelegramAccountDeviceModel();\n this.systemVersion =\n options.systemVersion?.trim() || defaultTelegramAccountSystemVersion();\n this.deps = {\n createTelegramClient: deps.createTelegramClient ?? createTelegramClient,\n sendProvisioningCode: deps.sendProvisioningCode ?? sendProvisioningCode,\n completeProvisioningLogin:\n deps.completeProvisioningLogin ?? completeProvisioningLogin,\n getOrCreateProvisionedApp:\n deps.getOrCreateProvisionedApp ?? getOrCreateProvisionedApp,\n };\n\n const persisted = loadTelegramAccountAuthState();\n if (persisted) {\n this.snapshot = persisted.snapshot;\n this.credentials = persisted.credentials;\n this.connectorConfig = persisted.connectorConfig;\n this.provisioningRandomHash = persisted.provisioningRandomHash;\n this.phoneCodeHash = persisted.phoneCodeHash;\n }\n }\n\n getSnapshot(): TelegramAccountAuthSnapshot {\n return { ...this.snapshot };\n }\n\n getResolvedConnectorConfig(): TelegramAccountConnectorConfig | null {\n return this.connectorConfig ? { ...this.connectorConfig } : null;\n }\n\n async start(options: {\n phone: string;\n credentials: TelegramAccountApiCredentials | null;\n }): Promise<TelegramAccountAuthSnapshot> {\n const phone = options.phone.trim();\n if (!phone) {\n throw new Error(\"Telegram phone number is required\");\n }\n\n await this.disconnectClient();\n clearTelegramAccountSession();\n clearTelegramAccountAuthState();\n this.snapshot = {\n status: \"idle\",\n phone,\n error: null,\n isCodeViaApp: false,\n account: null,\n };\n this.credentials = options.credentials;\n this.connectorConfig = null;\n\n if (this.credentials) {\n await this.beginTelegramLogin();\n return this.getSnapshot();\n }\n\n this.provisioningRandomHash = await this.deps.sendProvisioningCode(phone);\n this.snapshot.status = \"waiting_for_provisioning_code\";\n this.persistAuthState();\n return this.getSnapshot();\n }\n\n async submit(input: {\n provisioningCode?: string;\n telegramCode?: string;\n password?: string;\n }): Promise<TelegramAccountAuthSnapshot> {\n switch (this.snapshot.status) {\n case \"waiting_for_provisioning_code\": {\n const provisioningCode = input.provisioningCode?.trim();\n if (!provisioningCode) {\n throw new Error(\"Telegram provisioning code is required\");\n }\n if (!this.snapshot.phone || !this.provisioningRandomHash) {\n throw new Error(\"Telegram provisioning session is missing state\");\n }\n const stelToken = await this.deps.completeProvisioningLogin(\n this.snapshot.phone,\n this.provisioningRandomHash,\n provisioningCode,\n );\n const app = await this.deps.getOrCreateProvisionedApp(stelToken);\n this.credentials = {\n apiId: app.api_id,\n apiHash: app.api_hash,\n };\n this.provisioningRandomHash = null;\n await this.beginTelegramLogin();\n return this.getSnapshot();\n }\n case \"waiting_for_telegram_code\": {\n const telegramCode = input.telegramCode?.trim();\n if (!telegramCode) {\n throw new Error(\"Telegram login code is required\");\n }\n await this.ensureClientConnected();\n await this.completeTelegramCode(telegramCode);\n return this.getSnapshot();\n }\n case \"waiting_for_password\": {\n const password = input.password ?? \"\";\n if (!password.trim()) {\n throw new Error(\"Telegram two-factor password is required\");\n }\n await this.ensureClientConnected();\n await this.completePassword(password);\n return this.getSnapshot();\n }\n default:\n throw new Error(\"Telegram login is not waiting for input\");\n }\n }\n\n async stop(): Promise<void> {\n await this.disconnectClient();\n this.provisioningRandomHash = null;\n this.phoneCodeHash = null;\n this.credentials = null;\n this.connectorConfig = null;\n this.snapshot = {\n status: \"idle\",\n phone: null,\n error: null,\n isCodeViaApp: false,\n account: null,\n };\n clearTelegramAccountAuthState();\n }\n\n private async beginTelegramLogin(): Promise<void> {\n if (!this.credentials || !this.snapshot.phone) {\n throw new Error(\"Telegram login credentials are incomplete\");\n }\n\n const session = new StringSession(loadTelegramAccountSessionString());\n this.client = this.deps.createTelegramClient(\n session,\n this.credentials,\n this.deviceModel,\n this.systemVersion,\n );\n await this.client.connect();\n this.persistSession();\n\n if (await this.client.checkAuthorization()) {\n const me = (await this.client.getEntity(\"me\")) as Api.User;\n await this.finishAuthorized(me);\n return;\n }\n\n const sentCode = await this.client.sendCode(\n this.credentials,\n this.snapshot.phone,\n );\n this.phoneCodeHash = sentCode.phoneCodeHash;\n this.snapshot.status = \"waiting_for_telegram_code\";\n this.snapshot.isCodeViaApp = sentCode.isCodeViaApp;\n this.snapshot.error = null;\n this.persistSession();\n this.persistAuthState();\n }\n\n private async completeTelegramCode(code: string): Promise<void> {\n if (\n !this.client ||\n !this.credentials ||\n !this.snapshot.phone ||\n !this.phoneCodeHash\n ) {\n throw new Error(\"Telegram login session is missing state\");\n }\n try {\n const result = await this.client.invoke(\n new Api.auth.SignIn({\n phoneNumber: this.snapshot.phone,\n phoneCodeHash: this.phoneCodeHash,\n phoneCode: code,\n }),\n );\n if (!(result instanceof Api.auth.Authorization)) {\n throw new Error(\"Telegram returned an unexpected authorization state\");\n }\n await this.finishAuthorized(result.user as Api.User);\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n if (message.includes(\"SESSION_PASSWORD_NEEDED\")) {\n this.snapshot.status = \"waiting_for_password\";\n this.snapshot.error = null;\n this.persistSession();\n this.persistAuthState();\n return;\n }\n this.snapshot.status = \"error\";\n this.snapshot.error = message;\n this.persistAuthState();\n throw error;\n }\n }\n\n private async completePassword(password: string): Promise<void> {\n if (!this.client || !this.credentials) {\n throw new Error(\"Telegram password login session is missing state\");\n }\n try {\n const user = (await this.client.signInWithPassword(this.credentials, {\n password: async () => password,\n onError: (error: unknown) => {\n throw error instanceof Error ? error : new Error(String(error));\n },\n })) as Api.User;\n await this.finishAuthorized(user);\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n this.snapshot.status = \"error\";\n this.snapshot.error = message;\n this.persistAuthState();\n throw error;\n }\n }\n\n private async finishAuthorized(user: Api.User): Promise<void> {\n if (!this.snapshot.phone || !this.credentials || !this.client) {\n throw new Error(\"Telegram authorization finished without session state\");\n }\n saveTelegramAccountSessionString(serializeSession(this.client));\n this.connectorConfig = {\n phone: this.snapshot.phone,\n appId: String(this.credentials.apiId),\n appHash: this.credentials.apiHash,\n deviceModel: this.deviceModel,\n systemVersion: this.systemVersion,\n enabled: true,\n };\n this.snapshot = {\n status: \"configured\",\n phone: this.snapshot.phone,\n error: null,\n isCodeViaApp: false,\n account: mapTelegramAccount(user),\n };\n clearTelegramAccountAuthState();\n await this.disconnectClient();\n }\n\n private persistSession(): void {\n if (!this.client) {\n return;\n }\n const session = serializeSession(this.client);\n if (session.trim().length > 0) {\n saveTelegramAccountSessionString(session);\n }\n }\n\n private persistAuthState(): void {\n saveTelegramAccountAuthState({\n snapshot: this.snapshot,\n credentials: this.credentials,\n connectorConfig: this.connectorConfig,\n provisioningRandomHash: this.provisioningRandomHash,\n phoneCodeHash: this.phoneCodeHash,\n });\n }\n\n private async disconnectClient(): Promise<void> {\n if (!this.client) {\n return;\n }\n this.persistSession();\n await this.client.disconnect().catch(() => undefined);\n this.client = null;\n }\n\n private async ensureClientConnected(): Promise<void> {\n if (this.client) {\n return;\n }\n if (!this.credentials) {\n throw new Error(\"Telegram login session is missing credentials\");\n }\n const sessionString = loadTelegramAccountSessionString();\n if (!sessionString.trim()) {\n throw new Error(\n \"Telegram login session is missing persisted session data\",\n );\n }\n this.client = this.deps.createTelegramClient(\n new StringSession(sessionString),\n this.credentials,\n this.deviceModel,\n this.systemVersion,\n );\n await this.client.connect();\n }\n}\n"],"mappings":"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","names":[]}
|