{"version":3,"file":"index.cjs","sources":["../../../src/errors.ts","../../../src/platform/index.ts","../../../src/requests.ts","../../../src/api.ts","../../../src/auth.ts","../../../src/profile.ts","../../../src/auth-user.ts","../../../src/timeline-async.ts","../../../src/type-util.ts","../../../src/timeline-tweet-util.ts","../../../src/timeline-v2.ts","../../../src/timeline-search.ts","../../../src/search.ts","../../../src/timeline-relationship.ts","../../../src/relationships.ts","../../../src/trends.ts","../../../src/api-data.ts","../../../src/timeline-list.ts","../../../src/tweets.ts","../../../src/timeline-home.ts","../../../src/timeline-following.ts","../../../src/messages.ts","../../../src/spaces.ts","../../../src/scraper.ts","../../../src/spaces/core/ChatClient.ts","../../../src/spaces/core/JanusAudioSource.ts","../../../src/spaces/core/JanusClient.ts","../../../src/spaces/utils.ts","../../../src/spaces/core/Space.ts","../../../src/spaces/plugins/SttTtsPlugin.ts","../../../src/spaces/plugins/RecordToDiskPlugin.ts","../../../src/spaces/plugins/MonitorAudioPlugin.ts","../../../src/spaces/plugins/IdleMonitorPlugin.ts","../../../src/platform/node/randomize-ciphers.ts","../../../src/platform/node/index.ts"],"sourcesContent":["export class ApiError extends Error {\n  private constructor(\n    readonly response: Response,\n    readonly data: any,\n    message: string,\n  ) {\n    super(message);\n  }\n\n  static async fromResponse(response: Response) {\n    // Try our best to parse the result, but don't bother if we can't\n    let data: string | object | undefined = undefined;\n    try {\n      data = await response.json();\n    } catch {\n      try {\n        data = await response.text();\n      } catch {}\n    }\n\n    return new ApiError(response, data, `Response status: ${response.status}`);\n  }\n}\n\ninterface Position {\n  line: number;\n  column: number;\n}\n\ninterface TraceInfo {\n  trace_id: string;\n}\n\ninterface TwitterApiErrorExtensions {\n  code?: number;\n  kind?: string;\n  name?: string;\n  source?: string;\n  tracing?: TraceInfo;\n}\n\nexport interface TwitterApiErrorRaw extends TwitterApiErrorExtensions {\n  message?: string;\n  locations?: Position[];\n  path?: string[];\n  extensions?: TwitterApiErrorExtensions;\n}\n","import { PlatformExtensions, genericPlatform } from './platform-interface';\n\nexport * from './platform-interface';\n\ndeclare const PLATFORM_NODE: boolean;\ndeclare const PLATFORM_NODE_JEST: boolean;\n\nexport class Platform implements PlatformExtensions {\n  async randomizeCiphers() {\n    const platform = await Platform.importPlatform();\n    await platform?.randomizeCiphers();\n  }\n\n  private static async importPlatform(): Promise<null | PlatformExtensions> {\n    if (PLATFORM_NODE) {\n      const { platform } = await import('./node/index.js');\n      return platform as PlatformExtensions;\n    } else if (PLATFORM_NODE_JEST) {\n      // Jest gets unhappy when using an await import here, so we just use require instead.\n      // eslint-disable-next-line @typescript-eslint/no-var-requires\n      const { platform } = require('./node');\n      return platform as PlatformExtensions;\n    }\n\n    return genericPlatform;\n  }\n}\n","import { Cookie, CookieJar } from 'tough-cookie';\nimport setCookie from 'set-cookie-parser';\nimport type { Headers as HeadersPolyfill } from 'headers-polyfill';\n\n/**\n * Updates a cookie jar with the Set-Cookie headers from the provided Headers instance.\n * @param cookieJar The cookie jar to update.\n * @param headers The response headers to populate the cookie jar with.\n */\nexport async function updateCookieJar(\n  cookieJar: CookieJar,\n  headers: Headers | HeadersPolyfill,\n) {\n  const setCookieHeader = headers.get('set-cookie');\n  if (setCookieHeader) {\n    const cookies = setCookie.splitCookiesString(setCookieHeader);\n    for (const cookie of cookies.map((c) => Cookie.parse(c))) {\n      if (!cookie) continue;\n      await cookieJar.setCookie(\n        cookie,\n        `${cookie.secure ? 'https' : 'http'}://${cookie.domain}${cookie.path}`,\n      );\n    }\n  } else if (typeof document !== 'undefined') {\n    for (const cookie of document.cookie.split(';')) {\n      const hardCookie = Cookie.parse(cookie);\n      if (hardCookie) {\n        await cookieJar.setCookie(hardCookie, document.location.toString());\n      }\n    }\n  }\n}\n","import { TwitterAuth } from './auth';\nimport { ApiError } from './errors';\nimport { Platform, PlatformExtensions } from './platform';\nimport { updateCookieJar } from './requests';\nimport { Headers } from 'headers-polyfill';\n\n// For some reason using Parameters<typeof fetch> reduces the request transform function to\n// `(url: string) => string` in tests.\ntype FetchParameters = [input: RequestInfo | URL, init?: RequestInit];\n\nexport interface FetchTransformOptions {\n  /**\n   * Transforms the request options before a request is made. This executes after all of the default\n   * parameters have been configured, and is stateless. It is safe to return new request options\n   * objects.\n   * @param args The request options.\n   * @returns The transformed request options.\n   */\n  request: (\n    ...args: FetchParameters\n  ) => FetchParameters | Promise<FetchParameters>;\n\n  /**\n   * Transforms the response after a request completes. This executes immediately after the request\n   * completes, and is stateless. It is safe to return a new response object.\n   * @param response The response object.\n   * @returns The transformed response object.\n   */\n  response: (response: Response) => Response | Promise<Response>;\n}\n\nexport const bearerToken =\n  'AAAAAAAAAAAAAAAAAAAAAFQODgEAAAAAVHTp76lzh3rFzcHbmHVvQxYYpTw%3DckAlMINMjmCwxUcaXbAN4XqJVdgMJaHqNOFgPMK0zN1qLqLQCF';\n\n/**\n * An API result container.\n */\nexport type RequestApiResult<T> =\n  | { success: true; value: T }\n  | { success: false; err: Error };\n\n/**\n * Used internally to send HTTP requests to the Twitter API.\n * @internal\n * @param url - The URL to send the request to.\n * @param auth - The instance of {@link TwitterAuth} that will be used to authorize this request.\n * @param method - The HTTP method used when sending this request.\n */\nexport async function requestApi<T>(\n  url: string,\n  auth: TwitterAuth,\n  method: 'GET' | 'POST' = 'GET',\n  platform: PlatformExtensions = new Platform(),\n): Promise<RequestApiResult<T>> {\n  const headers = new Headers();\n  await auth.installTo(headers, url);\n  await platform.randomizeCiphers();\n\n  let res: Response;\n  do {\n    try {\n      res = await auth.fetch(url, {\n        method,\n        headers,\n        credentials: 'include',\n      });\n    } catch (err) {\n      if (!(err instanceof Error)) {\n        throw err;\n      }\n\n      return {\n        success: false,\n        err: new Error('Failed to perform request.'),\n      };\n    }\n\n    await updateCookieJar(auth.cookieJar(), res.headers);\n\n    if (res.status === 429) {\n      /*\n      Known headers at this point:\n      - x-rate-limit-limit: Maximum number of requests per time period?\n      - x-rate-limit-reset: UNIX timestamp when the current rate limit will be reset.\n      - x-rate-limit-remaining: Number of requests remaining in current time period?\n      */\n      const xRateLimitRemaining = res.headers.get('x-rate-limit-remaining');\n      const xRateLimitReset = res.headers.get('x-rate-limit-reset');\n      if (xRateLimitRemaining == '0' && xRateLimitReset) {\n        const currentTime = new Date().valueOf() / 1000;\n        const timeDeltaMs = 1000 * (parseInt(xRateLimitReset) - currentTime);\n\n        // I have seen this block for 800s (~13 *minutes*)\n        await new Promise((resolve) => setTimeout(resolve, timeDeltaMs));\n      }\n    }\n  } while (res.status === 429);\n\n  if (!res.ok) {\n    return {\n      success: false,\n      err: await ApiError.fromResponse(res),\n    };\n  }\n\n  const value: T = await res.json();\n  if (res.headers.get('x-rate-limit-incoming') == '0') {\n    auth.deleteToken();\n    return { success: true, value };\n  } else {\n    return { success: true, value };\n  }\n}\n\n/** @internal */\nexport function addApiFeatures(o: object) {\n  return {\n    ...o,\n    rweb_lists_timeline_redesign_enabled: true,\n    responsive_web_graphql_exclude_directive_enabled: true,\n    verified_phone_label_enabled: false,\n    creator_subscriptions_tweet_preview_api_enabled: true,\n    responsive_web_graphql_timeline_navigation_enabled: true,\n    responsive_web_graphql_skip_user_profile_image_extensions_enabled: false,\n    tweetypie_unmention_optimization_enabled: true,\n    responsive_web_edit_tweet_api_enabled: true,\n    graphql_is_translatable_rweb_tweet_is_translatable_enabled: true,\n    view_counts_everywhere_api_enabled: true,\n    longform_notetweets_consumption_enabled: true,\n    tweet_awards_web_tipping_enabled: false,\n    freedom_of_speech_not_reach_fetch_enabled: true,\n    standardized_nudges_misinfo: true,\n    longform_notetweets_rich_text_read_enabled: true,\n    responsive_web_enhance_cards_enabled: false,\n    subscriptions_verification_info_enabled: true,\n    subscriptions_verification_info_reason_enabled: true,\n    subscriptions_verification_info_verified_since_enabled: true,\n    super_follow_badge_privacy_enabled: false,\n    super_follow_exclusive_tweet_notifications_enabled: false,\n    super_follow_tweet_api_enabled: false,\n    super_follow_user_api_enabled: false,\n    android_graphql_skip_api_media_color_palette: false,\n    creator_subscriptions_subscription_count_enabled: false,\n    blue_business_profile_image_shape_enabled: false,\n    unified_cards_ad_metadata_container_dynamic_card_content_query_enabled:\n      false,\n  };\n}\n\nexport function addApiParams(\n  params: URLSearchParams,\n  includeTweetReplies: boolean,\n): URLSearchParams {\n  params.set('include_profile_interstitial_type', '1');\n  params.set('include_blocking', '1');\n  params.set('include_blocked_by', '1');\n  params.set('include_followed_by', '1');\n  params.set('include_want_retweets', '1');\n  params.set('include_mute_edge', '1');\n  params.set('include_can_dm', '1');\n  params.set('include_can_media_tag', '1');\n  params.set('include_ext_has_nft_avatar', '1');\n  params.set('include_ext_is_blue_verified', '1');\n  params.set('include_ext_verified_type', '1');\n  params.set('skip_status', '1');\n  params.set('cards_platform', 'Web-12');\n  params.set('include_cards', '1');\n  params.set('include_ext_alt_text', 'true');\n  params.set('include_ext_limited_action_results', 'false');\n  params.set('include_quote_count', 'true');\n  params.set('include_reply_count', '1');\n  params.set('tweet_mode', 'extended');\n  params.set('include_ext_collab_control', 'true');\n  params.set('include_ext_views', 'true');\n  params.set('include_entities', 'true');\n  params.set('include_user_entities', 'true');\n  params.set('include_ext_media_color', 'true');\n  params.set('include_ext_media_availability', 'true');\n  params.set('include_ext_sensitive_media_warning', 'true');\n  params.set('include_ext_trusted_friends_metadata', 'true');\n  params.set('send_error_codes', 'true');\n  params.set('simple_quoted_tweet', 'true');\n  params.set('include_tweet_replies', `${includeTweetReplies}`);\n  params.set(\n    'ext',\n    'mediaStats,highlightedLabel,hasNftAvatar,voiceInfo,birdwatchPivot,enrichments,superFollowMetadata,unmentionInfo,editControl,collab_control,vibe',\n  );\n  return params;\n}\n","import { Cookie, CookieJar, MemoryCookieStore } from 'tough-cookie';\nimport { updateCookieJar } from './requests';\nimport { Headers } from 'headers-polyfill';\nimport { FetchTransformOptions } from './api';\nimport { TwitterApi } from 'twitter-api-v2';\nimport { Profile } from './profile';\n\nexport interface TwitterAuthOptions {\n  fetch: typeof fetch;\n  transform: Partial<FetchTransformOptions>;\n}\n\nexport interface TwitterAuth {\n  fetch: typeof fetch;\n\n  /**\n   * Returns the current cookie jar.\n   */\n  cookieJar(): CookieJar;\n\n  /**\n   * Logs into a Twitter account using the v2 API\n   */\n  loginWithV2(\n    appKey: string,\n    appSecret: string,\n    accessToken: string,\n    accessSecret: string,\n  ): void;\n\n  /**\n   * Get v2 API client if it exists\n   */\n  getV2Client(): TwitterApi | null;\n\n  /**\n   * Returns if a user is logged-in to Twitter through this instance.\n   * @returns `true` if a user is logged-in; otherwise `false`.\n   */\n  isLoggedIn(): Promise<boolean>;\n\n  /**\n   * Fetches the current user's profile.\n   */\n  me(): Promise<Profile | undefined>;\n\n  /**\n   * Logs into a Twitter account.\n   * @param username The username to log in with.\n   * @param password The password to log in with.\n   * @param email The email to log in with, if you have email confirmation enabled.\n   * @param twoFactorSecret The secret to generate two factor authentication tokens with, if you have two factor authentication enabled.\n   */\n  login(\n    username: string,\n    password: string,\n    email?: string,\n    twoFactorSecret?: string,\n  ): Promise<void>;\n\n  /**\n   * Logs out of the current session.\n   */\n  logout(): Promise<void>;\n\n  /**\n   * Deletes the current guest token token.\n   */\n  deleteToken(): void;\n\n  /**\n   * Returns if the authentication state has a token.\n   * @returns `true` if the authentication state has a token; `false` otherwise.\n   */\n  hasToken(): boolean;\n\n  /**\n   * Returns the time that authentication was performed.\n   * @returns The time at which the authentication token was created, or `null` if it hasn't been created yet.\n   */\n  authenticatedAt(): Date | null;\n\n  /**\n   * Installs the authentication information into a headers-like object. If needed, the\n   * authentication token will be updated from the API automatically.\n   * @param headers A Headers instance representing a request's headers.\n   */\n  installTo(headers: Headers, url: string): Promise<void>;\n}\n\n/**\n * Wraps the provided fetch function with transforms.\n * @param fetchFn The fetch function.\n * @param transform The transform options.\n * @returns The input fetch function, wrapped with the provided transforms.\n */\nfunction withTransform(\n  fetchFn: typeof fetch,\n  transform?: Partial<FetchTransformOptions>,\n): typeof fetch {\n  return async (input, init) => {\n    const fetchArgs = (await transform?.request?.(input, init)) ?? [\n      input,\n      init,\n    ];\n    const res = await fetchFn(...fetchArgs);\n    return (await transform?.response?.(res)) ?? res;\n  };\n}\n\n/**\n * A guest authentication token manager. Automatically handles token refreshes.\n */\nexport class TwitterGuestAuth implements TwitterAuth {\n  protected bearerToken: string;\n  protected jar: CookieJar;\n  protected guestToken?: string;\n  protected guestCreatedAt?: Date;\n  protected v2Client: TwitterApi | null;\n\n  fetch: typeof fetch;\n\n  constructor(\n    bearerToken: string,\n    protected readonly options?: Partial<TwitterAuthOptions>,\n  ) {\n    this.fetch = withTransform(options?.fetch ?? fetch, options?.transform);\n    this.bearerToken = bearerToken;\n    this.jar = new CookieJar();\n    this.v2Client = null;\n  }\n\n  cookieJar(): CookieJar {\n    return this.jar;\n  }\n\n  getV2Client(): TwitterApi | null {\n    return this.v2Client ?? null;\n  }\n\n  loginWithV2(\n    appKey: string,\n    appSecret: string,\n    accessToken: string,\n    accessSecret: string,\n  ): void {\n    const v2Client = new TwitterApi({\n      appKey,\n      appSecret,\n      accessToken,\n      accessSecret,\n    });\n    this.v2Client = v2Client;\n  }\n\n  isLoggedIn(): Promise<boolean> {\n    return Promise.resolve(false);\n  }\n\n  async me(): Promise<Profile | undefined> {\n    return undefined;\n  }\n\n  // eslint-disable-next-line @typescript-eslint/no-unused-vars\n  login(_username: string, _password: string, _email?: string): Promise<void> {\n    return this.updateGuestToken();\n  }\n\n  logout(): Promise<void> {\n    this.deleteToken();\n    this.jar = new CookieJar();\n    return Promise.resolve();\n  }\n\n  deleteToken() {\n    delete this.guestToken;\n    delete this.guestCreatedAt;\n  }\n\n  hasToken(): boolean {\n    return this.guestToken != null;\n  }\n\n  authenticatedAt(): Date | null {\n    if (this.guestCreatedAt == null) {\n      return null;\n    }\n\n    return new Date(this.guestCreatedAt);\n  }\n\n  async installTo(headers: Headers): Promise<void> {\n    if (this.shouldUpdate()) {\n      await this.updateGuestToken();\n    }\n\n    const token = this.guestToken;\n    if (token == null) {\n      throw new Error('Authentication token is null or undefined.');\n    }\n\n    headers.set('authorization', `Bearer ${this.bearerToken}`);\n    headers.set('x-guest-token', token);\n\n    const cookies = await this.getCookies();\n    const xCsrfToken = cookies.find((cookie) => cookie.key === 'ct0');\n    if (xCsrfToken) {\n      headers.set('x-csrf-token', xCsrfToken.value);\n    }\n\n    headers.set('cookie', await this.getCookieString());\n  }\n\n  protected getCookies(): Promise<Cookie[]> {\n    return this.jar.getCookies(this.getCookieJarUrl());\n  }\n\n  protected getCookieString(): Promise<string> {\n    return this.jar.getCookieString(this.getCookieJarUrl());\n  }\n\n  protected async removeCookie(key: string): Promise<void> {\n    //@ts-expect-error don't care\n    const store: MemoryCookieStore = this.jar.store;\n    const cookies = await this.jar.getCookies(this.getCookieJarUrl());\n    for (const cookie of cookies) {\n      if (!cookie.domain || !cookie.path) continue;\n      store.removeCookie(cookie.domain, cookie.path, key);\n\n      if (typeof document !== 'undefined') {\n        document.cookie = `${cookie.key}=; Max-Age=0; path=${cookie.path}; domain=${cookie.domain}`;\n      }\n    }\n  }\n\n  private getCookieJarUrl(): string {\n    return typeof document !== 'undefined'\n      ? document.location.toString()\n      : 'https://twitter.com';\n  }\n\n  /**\n   * Updates the authentication state with a new guest token from the Twitter API.\n   */\n  protected async updateGuestToken() {\n    const guestActivateUrl = 'https://api.twitter.com/1.1/guest/activate.json';\n\n    const headers = new Headers({\n      Authorization: `Bearer ${this.bearerToken}`,\n      Cookie: await this.getCookieString(),\n    });\n\n    const res = await this.fetch(guestActivateUrl, {\n      method: 'POST',\n      headers: headers,\n      referrerPolicy: 'no-referrer',\n    });\n\n    await updateCookieJar(this.jar, res.headers);\n\n    if (!res.ok) {\n      throw new Error(await res.text());\n    }\n\n    const o = await res.json();\n    if (o == null || o['guest_token'] == null) {\n      throw new Error('guest_token not found.');\n    }\n\n    const newGuestToken = o['guest_token'];\n    if (typeof newGuestToken !== 'string') {\n      throw new Error('guest_token was not a string.');\n    }\n\n    this.guestToken = newGuestToken;\n    this.guestCreatedAt = new Date();\n  }\n\n  /**\n   * Returns if the authentication token needs to be updated or not.\n   * @returns `true` if the token needs to be updated; `false` otherwise.\n   */\n  private shouldUpdate(): boolean {\n    return (\n      !this.hasToken() ||\n      (this.guestCreatedAt != null &&\n        this.guestCreatedAt <\n          new Date(new Date().valueOf() - 3 * 60 * 60 * 1000))\n    );\n  }\n}\n","import stringify from 'json-stable-stringify';\nimport { requestApi, RequestApiResult } from './api';\nimport { TwitterAuth } from './auth';\nimport { TwitterApiErrorRaw } from './errors';\n\nexport interface LegacyUserRaw {\n  created_at?: string;\n  description?: string;\n  entities?: {\n    url?: {\n      urls?: {\n        expanded_url?: string;\n      }[];\n    };\n  };\n  favourites_count?: number;\n  followers_count?: number;\n  friends_count?: number;\n  media_count?: number;\n  statuses_count?: number;\n  id_str?: string;\n  listed_count?: number;\n  name?: string;\n  location: string;\n  geo_enabled?: boolean;\n  pinned_tweet_ids_str?: string[];\n  profile_background_color?: string;\n  profile_banner_url?: string;\n  profile_image_url_https?: string;\n  protected?: boolean;\n  screen_name?: string;\n  verified?: boolean;\n  has_custom_timelines?: boolean;\n  has_extended_profile?: boolean;\n  url?: string;\n  can_dm?: boolean;\n}\n\n/**\n * A parsed profile object.\n */\nexport interface Profile {\n  avatar?: string;\n  banner?: string;\n  biography?: string;\n  birthday?: string;\n  followersCount?: number;\n  followingCount?: number;\n  friendsCount?: number;\n  mediaCount?: number;\n  statusesCount?: number;\n  isPrivate?: boolean;\n  isVerified?: boolean;\n  isBlueVerified?: boolean;\n  joined?: Date;\n  likesCount?: number;\n  listedCount?: number;\n  location: string;\n  name?: string;\n  pinnedTweetIds?: string[];\n  tweetsCount?: number;\n  url?: string;\n  userId?: string;\n  username?: string;\n  website?: string;\n  canDm?: boolean;\n}\n\nexport interface UserRaw {\n  data: {\n    user: {\n      result: {\n        rest_id?: string;\n        is_blue_verified?: boolean;\n        legacy: LegacyUserRaw;\n      };\n    };\n  };\n  errors?: TwitterApiErrorRaw[];\n}\n\nfunction getAvatarOriginalSizeUrl(avatarUrl: string | undefined) {\n  return avatarUrl ? avatarUrl.replace('_normal', '') : undefined;\n}\n\nexport function parseProfile(\n  user: LegacyUserRaw,\n  isBlueVerified?: boolean,\n): Profile {\n  const profile: Profile = {\n    avatar: getAvatarOriginalSizeUrl(user.profile_image_url_https),\n    banner: user.profile_banner_url,\n    biography: user.description,\n    followersCount: user.followers_count,\n    followingCount: user.friends_count,\n    friendsCount: user.friends_count,\n    mediaCount: user.media_count,\n    isPrivate: user.protected ?? false,\n    isVerified: user.verified,\n    likesCount: user.favourites_count,\n    listedCount: user.listed_count,\n    location: user.location,\n    name: user.name,\n    pinnedTweetIds: user.pinned_tweet_ids_str,\n    tweetsCount: user.statuses_count,\n    url: `https://twitter.com/${user.screen_name}`,\n    userId: user.id_str,\n    username: user.screen_name,\n    isBlueVerified: isBlueVerified ?? false,\n    canDm: user.can_dm,\n  };\n\n  if (user.created_at != null) {\n    profile.joined = new Date(Date.parse(user.created_at));\n  }\n\n  const urls = user.entities?.url?.urls;\n  if (urls?.length != null && urls?.length > 0) {\n    profile.website = urls[0].expanded_url;\n  }\n\n  return profile;\n}\n\nexport async function getProfile(\n  username: string,\n  auth: TwitterAuth,\n): Promise<RequestApiResult<Profile>> {\n  const params = new URLSearchParams();\n  params.set(\n    'variables',\n    stringify({\n      screen_name: username,\n      withSafetyModeUserFields: true,\n    }) ?? '',\n  );\n\n  params.set(\n    'features',\n    stringify({\n      hidden_profile_likes_enabled: false,\n      hidden_profile_subscriptions_enabled: false, // Auth-restricted\n      responsive_web_graphql_exclude_directive_enabled: true,\n      verified_phone_label_enabled: false,\n      subscriptions_verification_info_is_identity_verified_enabled: false,\n      subscriptions_verification_info_verified_since_enabled: true,\n      highlights_tweets_tab_ui_enabled: true,\n      creator_subscriptions_tweet_preview_api_enabled: true,\n      responsive_web_graphql_skip_user_profile_image_extensions_enabled: false,\n      responsive_web_graphql_timeline_navigation_enabled: true,\n    }) ?? '',\n  );\n\n  params.set('fieldToggles', stringify({ withAuxiliaryUserLabels: false }) ?? '');\n\n  const res = await requestApi<UserRaw>(\n    `https://twitter.com/i/api/graphql/G3KGOASz96M-Qu0nwmGXNg/UserByScreenName?${params.toString()}`,\n    auth,\n  );\n  if (!res.success) {\n    return res;\n  }\n\n  const { value } = res;\n  const { errors } = value;\n  if (errors != null && errors.length > 0) {\n    return {\n      success: false,\n      err: new Error(errors[0].message),\n    };\n  }\n\n  if (!value.data || !value.data.user || !value.data.user.result) {\n    return {\n      success: false,\n      err: new Error('User not found.'),\n    };\n  }\n  const { result: user } = value.data.user;\n  const { legacy } = user;\n\n  if (user.rest_id == null || user.rest_id.length === 0) {\n    return {\n      success: false,\n      err: new Error('rest_id not found.'),\n    };\n  }\n\n  legacy.id_str = user.rest_id;\n\n  if (legacy.screen_name == null || legacy.screen_name.length === 0) {\n    return {\n      success: false,\n      err: new Error(`Either ${username} does not exist or is private.`),\n    };\n  }\n\n  return {\n    success: true,\n    value: parseProfile(user.legacy, user.is_blue_verified),\n  };\n}\n\nconst idCache = new Map<string, string>();\n\nexport async function getScreenNameByUserId(\n  userId: string,\n  auth: TwitterAuth,\n): Promise<RequestApiResult<string>> {\n  const params = new URLSearchParams();\n  params.set(\n    'variables',\n    stringify({\n      userId: userId,\n      withSafetyModeUserFields: true,\n    }) ?? '',\n  );\n\n  params.set(\n    'features',\n    stringify({\n      hidden_profile_subscriptions_enabled: true,\n      rweb_tipjar_consumption_enabled: true,\n      responsive_web_graphql_exclude_directive_enabled: true,\n      verified_phone_label_enabled: false,\n      highlights_tweets_tab_ui_enabled: true,\n      responsive_web_twitter_article_notes_tab_enabled: true,\n      subscriptions_feature_can_gift_premium: false,\n      creator_subscriptions_tweet_preview_api_enabled: true,\n      responsive_web_graphql_skip_user_profile_image_extensions_enabled: false,\n      responsive_web_graphql_timeline_navigation_enabled: true,\n    }) ?? '',\n  );\n\n  const res = await requestApi<UserRaw>(\n    `https://twitter.com/i/api/graphql/xf3jd90KKBCUxdlI_tNHZw/UserByRestId?${params.toString()}`,\n    auth,\n  );\n\n  if (!res.success) {\n    return res;\n  }\n\n  const { value } = res;\n  const { errors } = value;\n  if (errors != null && errors.length > 0) {\n    return {\n      success: false,\n      err: new Error(errors[0].message),\n    };\n  }\n\n  if (!value.data || !value.data.user || !value.data.user.result) {\n    return {\n      success: false,\n      err: new Error('User not found.'),\n    };\n  }\n\n  const { result: user } = value.data.user;\n  const { legacy } = user;\n\n  if (legacy.screen_name == null || legacy.screen_name.length === 0) {\n    return {\n      success: false,\n      err: new Error(\n        `Either user with ID ${userId} does not exist or is private.`,\n      ),\n    };\n  }\n\n  return {\n    success: true,\n    value: legacy.screen_name,\n  };\n}\n\nexport async function getUserIdByScreenName(\n  screenName: string,\n  auth: TwitterAuth,\n): Promise<RequestApiResult<string>> {\n  const cached = idCache.get(screenName);\n  if (cached != null) {\n    return { success: true, value: cached };\n  }\n\n  const profileRes = await getProfile(screenName, auth);\n  if (!profileRes.success) {\n    return profileRes;\n  }\n\n  const profile = profileRes.value;\n  if (profile.userId != null) {\n    idCache.set(screenName, profile.userId);\n\n    return {\n      success: true,\n      value: profile.userId,\n    };\n  }\n\n  return {\n    success: false,\n    err: new Error('User ID is undefined.'),\n  };\n}\n","import { TwitterAuthOptions, TwitterGuestAuth } from './auth';\nimport { requestApi } from './api';\nimport { CookieJar } from 'tough-cookie';\nimport { updateCookieJar } from './requests';\nimport { Headers } from 'headers-polyfill';\nimport { TwitterApiErrorRaw } from './errors';\nimport { Type, type Static } from '@sinclair/typebox';\nimport { Check } from '@sinclair/typebox/value';\nimport * as OTPAuth from 'otpauth';\nimport { LegacyUserRaw, parseProfile, type Profile } from './profile';\n\ninterface TwitterUserAuthFlowInitRequest {\n  flow_name: string;\n  input_flow_data: Record<string, unknown>;\n}\n\ninterface TwitterUserAuthFlowSubtaskRequest {\n  flow_token: string;\n  subtask_inputs: ({\n    subtask_id: string;\n  } & Record<string, unknown>)[];\n}\n\ntype TwitterUserAuthFlowRequest =\n  | TwitterUserAuthFlowInitRequest\n  | TwitterUserAuthFlowSubtaskRequest;\n\ninterface TwitterUserAuthFlowResponse {\n  errors?: TwitterApiErrorRaw[];\n  flow_token?: string;\n  status?: string;\n  subtasks?: TwitterUserAuthSubtask[];\n}\n\ninterface TwitterUserAuthVerifyCredentials {\n  errors?: TwitterApiErrorRaw[];\n}\n\nconst TwitterUserAuthSubtask = Type.Object({\n  subtask_id: Type.String(),\n  enter_text: Type.Optional(Type.Object({})),\n});\ntype TwitterUserAuthSubtask = Static<typeof TwitterUserAuthSubtask>;\n\ntype FlowTokenResultSuccess = {\n  status: 'success';\n  flowToken: string;\n  subtask?: TwitterUserAuthSubtask;\n};\n\ntype FlowTokenResult = FlowTokenResultSuccess | { status: 'error'; err: Error };\n\n/**\n * A user authentication token manager.\n */\nexport class TwitterUserAuth extends TwitterGuestAuth {\n  private userProfile: Profile | undefined;\n\n  constructor(bearerToken: string, options?: Partial<TwitterAuthOptions>) {\n    super(bearerToken, options);\n  }\n\n  async isLoggedIn(): Promise<boolean> {\n    const res = await requestApi<TwitterUserAuthVerifyCredentials>(\n      'https://api.twitter.com/1.1/account/verify_credentials.json',\n      this,\n    );\n    if (!res.success) {\n      return false;\n    }\n\n    const { value: verify } = res;\n    this.userProfile = parseProfile(\n      verify as LegacyUserRaw,\n      (verify as unknown as { verified: boolean }).verified,\n    );\n    return verify && !verify.errors?.length;\n  }\n\n  async me(): Promise<Profile | undefined> {\n    if (this.userProfile) {\n      return this.userProfile;\n    }\n    await this.isLoggedIn();\n    return this.userProfile;\n  }\n\n  async login(\n    username: string,\n    password: string,\n    email?: string,\n    twoFactorSecret?: string,\n    appKey?: string,\n    appSecret?: string,\n    accessToken?: string,\n    accessSecret?: string,\n  ): Promise<void> {\n    await this.updateGuestToken();\n\n    let next = await this.initLogin();\n    while ('subtask' in next && next.subtask) {\n      if (next.subtask.subtask_id === 'LoginJsInstrumentationSubtask') {\n        next = await this.handleJsInstrumentationSubtask(next);\n      } else if (next.subtask.subtask_id === 'LoginEnterUserIdentifierSSO') {\n        next = await this.handleEnterUserIdentifierSSO(next, username);\n      } else if (\n        next.subtask.subtask_id === 'LoginEnterAlternateIdentifierSubtask'\n      ) {\n        next = await this.handleEnterAlternateIdentifierSubtask(\n          next,\n          email as string,\n        );\n      } else if (next.subtask.subtask_id === 'LoginEnterPassword') {\n        next = await this.handleEnterPassword(next, password);\n      } else if (next.subtask.subtask_id === 'AccountDuplicationCheck') {\n        next = await this.handleAccountDuplicationCheck(next);\n      } else if (next.subtask.subtask_id === 'LoginTwoFactorAuthChallenge') {\n        if (twoFactorSecret) {\n          next = await this.handleTwoFactorAuthChallenge(next, twoFactorSecret);\n        } else {\n          throw new Error(\n            'Requested two factor authentication code but no secret provided',\n          );\n        }\n      } else if (next.subtask.subtask_id === 'LoginAcid') {\n        next = await this.handleAcid(next, email);\n      } else if (next.subtask.subtask_id === 'LoginSuccessSubtask') {\n        next = await this.handleSuccessSubtask(next);\n      } else {\n        throw new Error(`Unknown subtask ${next.subtask.subtask_id}`);\n      }\n    }\n    if (appKey && appSecret && accessToken && accessSecret) {\n      this.loginWithV2(appKey, appSecret, accessToken, accessSecret);\n    }\n    if ('err' in next) {\n      throw next.err;\n    }\n  }\n\n  async logout(): Promise<void> {\n    if (!this.isLoggedIn()) {\n      return;\n    }\n\n    await requestApi<void>(\n      'https://api.twitter.com/1.1/account/logout.json',\n      this,\n      'POST',\n    );\n    this.deleteToken();\n    this.jar = new CookieJar();\n  }\n\n  async installCsrfToken(headers: Headers): Promise<void> {\n    const cookies = await this.getCookies();\n    const xCsrfToken = cookies.find((cookie) => cookie.key === 'ct0');\n    if (xCsrfToken) {\n      headers.set('x-csrf-token', xCsrfToken.value);\n    }\n  }\n\n  async installTo(headers: Headers): Promise<void> {\n    headers.set('authorization', `Bearer ${this.bearerToken}`);\n    headers.set('cookie', await this.getCookieString());\n    await this.installCsrfToken(headers);\n  }\n\n  private async initLogin() {\n    // Reset certain session-related cookies because Twitter complains sometimes if we don't\n    this.removeCookie('twitter_ads_id=');\n    this.removeCookie('ads_prefs=');\n    this.removeCookie('_twitter_sess=');\n    this.removeCookie('zipbox_forms_auth_token=');\n    this.removeCookie('lang=');\n    this.removeCookie('bouncer_reset_cookie=');\n    this.removeCookie('twid=');\n    this.removeCookie('twitter_ads_idb=');\n    this.removeCookie('email_uid=');\n    this.removeCookie('external_referer=');\n    this.removeCookie('ct0=');\n    this.removeCookie('aa_u=');\n\n    return await this.executeFlowTask({\n      flow_name: 'login',\n      input_flow_data: {\n        flow_context: {\n          debug_overrides: {},\n          start_location: {\n            location: 'splash_screen',\n          },\n        },\n      },\n    });\n  }\n\n  private async handleJsInstrumentationSubtask(prev: FlowTokenResultSuccess) {\n    return await this.executeFlowTask({\n      flow_token: prev.flowToken,\n      subtask_inputs: [\n        {\n          subtask_id: 'LoginJsInstrumentationSubtask',\n          js_instrumentation: {\n            response: '{}',\n            link: 'next_link',\n          },\n        },\n      ],\n    });\n  }\n\n  private async handleEnterAlternateIdentifierSubtask(\n    prev: FlowTokenResultSuccess,\n    email: string,\n  ) {\n    return await this.executeFlowTask({\n      flow_token: prev.flowToken,\n      subtask_inputs: [\n        {\n          subtask_id: 'LoginEnterAlternateIdentifierSubtask',\n          enter_text: {\n            text: email,\n            link: 'next_link',\n          },\n        },\n      ],\n    });\n  }\n\n  private async handleEnterUserIdentifierSSO(\n    prev: FlowTokenResultSuccess,\n    username: string,\n  ) {\n    return await this.executeFlowTask({\n      flow_token: prev.flowToken,\n      subtask_inputs: [\n        {\n          subtask_id: 'LoginEnterUserIdentifierSSO',\n          settings_list: {\n            setting_responses: [\n              {\n                key: 'user_identifier',\n                response_data: {\n                  text_data: { result: username },\n                },\n              },\n            ],\n            link: 'next_link',\n          },\n        },\n      ],\n    });\n  }\n\n  private async handleEnterPassword(\n    prev: FlowTokenResultSuccess,\n    password: string,\n  ) {\n    return await this.executeFlowTask({\n      flow_token: prev.flowToken,\n      subtask_inputs: [\n        {\n          subtask_id: 'LoginEnterPassword',\n          enter_password: {\n            password,\n            link: 'next_link',\n          },\n        },\n      ],\n    });\n  }\n\n  private async handleAccountDuplicationCheck(prev: FlowTokenResultSuccess) {\n    return await this.executeFlowTask({\n      flow_token: prev.flowToken,\n      subtask_inputs: [\n        {\n          subtask_id: 'AccountDuplicationCheck',\n          check_logged_in_account: {\n            link: 'AccountDuplicationCheck_false',\n          },\n        },\n      ],\n    });\n  }\n\n  private async handleTwoFactorAuthChallenge(\n    prev: FlowTokenResultSuccess,\n    secret: string,\n  ) {\n    const totp = new OTPAuth.TOTP({ secret });\n    let error;\n    for (let attempts = 1; attempts < 4; attempts += 1) {\n      try {\n        return await this.executeFlowTask({\n          flow_token: prev.flowToken,\n          subtask_inputs: [\n            {\n              subtask_id: 'LoginTwoFactorAuthChallenge',\n              enter_text: {\n                link: 'next_link',\n                text: totp.generate(),\n              },\n            },\n          ],\n        });\n      } catch (err) {\n        error = err;\n        await new Promise((resolve) => setTimeout(resolve, 2000 * attempts));\n      }\n    }\n    throw error;\n  }\n\n  private async handleAcid(\n    prev: FlowTokenResultSuccess,\n    email: string | undefined,\n  ) {\n    return await this.executeFlowTask({\n      flow_token: prev.flowToken,\n      subtask_inputs: [\n        {\n          subtask_id: 'LoginAcid',\n          enter_text: {\n            text: email,\n            link: 'next_link',\n          },\n        },\n      ],\n    });\n  }\n\n  private async handleSuccessSubtask(prev: FlowTokenResultSuccess) {\n    return await this.executeFlowTask({\n      flow_token: prev.flowToken,\n      subtask_inputs: [],\n    });\n  }\n\n  private async executeFlowTask(\n    data: TwitterUserAuthFlowRequest,\n  ): Promise<FlowTokenResult> {\n    const onboardingTaskUrl =\n      'https://api.twitter.com/1.1/onboarding/task.json';\n\n    const token = this.guestToken;\n    if (token == null) {\n      throw new Error('Authentication token is null or undefined.');\n    }\n\n    const headers = new Headers({\n      authorization: `Bearer ${this.bearerToken}`,\n      cookie: await this.getCookieString(),\n      'content-type': 'application/json',\n      'User-Agent':\n        'Mozilla/5.0 (Linux; Android 11; Nokia G20) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.88 Mobile Safari/537.36',\n      'x-guest-token': token,\n      'x-twitter-auth-type': 'OAuth2Client',\n      'x-twitter-active-user': 'yes',\n      'x-twitter-client-language': 'en',\n    });\n    await this.installCsrfToken(headers);\n\n    const res = await this.fetch(onboardingTaskUrl, {\n      credentials: 'include',\n      method: 'POST',\n      headers: headers,\n      body: JSON.stringify(data),\n    });\n\n    await updateCookieJar(this.jar, res.headers);\n\n    if (!res.ok) {\n      return { status: 'error', err: new Error(await res.text()) };\n    }\n\n    const flow: TwitterUserAuthFlowResponse = await res.json();\n    if (flow?.flow_token == null) {\n      return { status: 'error', err: new Error('flow_token not found.') };\n    }\n\n    if (flow.errors?.length) {\n      return {\n        status: 'error',\n        err: new Error(\n          `Authentication error (${flow.errors[0].code}): ${flow.errors[0].message}`,\n        ),\n      };\n    }\n\n    if (typeof flow.flow_token !== 'string') {\n      return {\n        status: 'error',\n        err: new Error('flow_token was not a string.'),\n      };\n    }\n\n    const subtask = flow.subtasks?.length ? flow.subtasks[0] : undefined;\n    Check(TwitterUserAuthSubtask, subtask);\n\n    if (subtask && subtask.subtask_id === 'DenyLoginSubtask') {\n      return {\n        status: 'error',\n        err: new Error('Authentication error: DenyLoginSubtask'),\n      };\n    }\n\n    return {\n      status: 'success',\n      subtask,\n      flowToken: flow.flow_token,\n    };\n  }\n}\n","import { Profile } from './profile';\nimport { Tweet } from './tweets';\n\nexport interface FetchProfilesResponse {\n  profiles: Profile[];\n  next?: string;\n}\n\nexport type FetchProfiles = (\n  query: string,\n  maxProfiles: number,\n  cursor: string | undefined,\n) => Promise<FetchProfilesResponse>;\n\nexport interface FetchTweetsResponse {\n  tweets: Tweet[];\n  next?: string;\n}\n\nexport type FetchTweets = (\n  query: string,\n  maxTweets: number,\n  cursor: string | undefined,\n) => Promise<FetchTweetsResponse>;\n\nexport async function* getUserTimeline(\n  query: string,\n  maxProfiles: number,\n  fetchFunc: FetchProfiles,\n): AsyncGenerator<Profile, void> {\n  let nProfiles = 0;\n  let cursor: string | undefined = undefined;\n  let consecutiveEmptyBatches = 0;\n  while (nProfiles < maxProfiles) {\n    const batch: FetchProfilesResponse = await fetchFunc(\n      query,\n      maxProfiles,\n      cursor,\n    );\n\n    const { profiles, next } = batch;\n    cursor = next;\n\n    if (profiles.length === 0) {\n      consecutiveEmptyBatches++;\n      if (consecutiveEmptyBatches > 5) break;\n    } else consecutiveEmptyBatches = 0;\n\n    for (const profile of profiles) {\n      if (nProfiles < maxProfiles) yield profile;\n      else break;\n      nProfiles++;\n    }\n\n    if (!next) break;\n  }\n}\n\nexport async function* getTweetTimeline(\n  query: string,\n  maxTweets: number,\n  fetchFunc: FetchTweets,\n): AsyncGenerator<Tweet, void> {\n  let nTweets = 0;\n  let cursor: string | undefined = undefined;\n  while (nTweets < maxTweets) {\n    const batch: FetchTweetsResponse = await fetchFunc(\n      query,\n      maxTweets,\n      cursor,\n    );\n\n    const { tweets, next } = batch;\n\n    if (tweets.length === 0) {\n      break;\n    }\n\n    for (const tweet of tweets) {\n      if (nTweets < maxTweets) {\n        cursor = next;\n        yield tweet;\n      } else {\n        break;\n      }\n\n      nTweets++;\n    }\n  }\n}\n","export type NonNullableField<T, K extends keyof T> = {\n  [P in K]-?: T[P];\n} & T;\n\nexport function isFieldDefined<T, K extends keyof T>(key: K) {\n  return function (value: T): value is NonNullableField<T, K> {\n    return isDefined(value[key]);\n  };\n}\n\nexport function isDefined<T>(value: T | null | undefined): value is T {\n  return value != null;\n}\n","import { LegacyTweetRaw, TimelineMediaExtendedRaw } from './timeline-v1';\nimport { Photo, Video } from './tweets';\nimport { isFieldDefined, NonNullableField } from './type-util';\n\nconst reHashtag = /\\B(\\#\\S+\\b)/g;\nconst reCashtag = /\\B(\\$\\S+\\b)/g;\nconst reTwitterUrl = /https:(\\/\\/t\\.co\\/([A-Za-z0-9]|[A-Za-z]){10})/g;\nconst reUsername = /\\B(\\@\\S{1,15}\\b)/g;\n\nexport function parseMediaGroups(media: TimelineMediaExtendedRaw[]): {\n  sensitiveContent?: boolean;\n  photos: Photo[];\n  videos: Video[];\n} {\n  const photos: Photo[] = [];\n  const videos: Video[] = [];\n  let sensitiveContent: boolean | undefined = undefined;\n\n  for (const m of media\n    .filter(isFieldDefined('id_str'))\n    .filter(isFieldDefined('media_url_https'))) {\n    if (m.type === 'photo') {\n      photos.push({\n        id: m.id_str,\n        url: m.media_url_https,\n        alt_text: m.ext_alt_text,\n      });\n    } else if (m.type === 'video') {\n      videos.push(parseVideo(m));\n    }\n\n    const sensitive = m.ext_sensitive_media_warning;\n    if (sensitive != null) {\n      sensitiveContent =\n        sensitive.adult_content ||\n        sensitive.graphic_violence ||\n        sensitive.other;\n    }\n  }\n\n  return { sensitiveContent, photos, videos };\n}\n\nfunction parseVideo(\n  m: NonNullableField<TimelineMediaExtendedRaw, 'id_str' | 'media_url_https'>,\n): Video {\n  const video: Video = {\n    id: m.id_str,\n    preview: m.media_url_https,\n  };\n\n  let maxBitrate = 0;\n  const variants = m.video_info?.variants ?? [];\n  for (const variant of variants) {\n    const bitrate = variant.bitrate;\n    if (bitrate != null && bitrate > maxBitrate && variant.url != null) {\n      let variantUrl = variant.url;\n      const stringStart = 0;\n      const tagSuffixIdx = variantUrl.indexOf('?tag=10');\n      if (tagSuffixIdx !== -1) {\n        variantUrl = variantUrl.substring(stringStart, tagSuffixIdx + 1);\n      }\n\n      video.url = variantUrl;\n      maxBitrate = bitrate;\n    }\n  }\n\n  return video;\n}\n\nexport function reconstructTweetHtml(\n  tweet: LegacyTweetRaw,\n  photos: Photo[],\n  videos: Video[],\n): string {\n  const media: string[] = [];\n\n  // HTML parsing with regex :)\n  let html = tweet.full_text ?? '';\n\n  html = html.replace(reHashtag, linkHashtagHtml);\n  html = html.replace(reCashtag, linkCashtagHtml);\n  html = html.replace(reUsername, linkUsernameHtml);\n  html = html.replace(reTwitterUrl, unwrapTcoUrlHtml(tweet, media));\n\n  for (const { url } of photos) {\n    if (media.indexOf(url) !== -1) {\n      continue;\n    }\n\n    html += `<br><img src=\"${url}\"/>`;\n  }\n\n  for (const { preview: url } of videos) {\n    if (media.indexOf(url) !== -1) {\n      continue;\n    }\n\n    html += `<br><img src=\"${url}\"/>`;\n  }\n\n  html = html.replace(/\\n/g, '<br>');\n\n  return html;\n}\n\nfunction linkHashtagHtml(hashtag: string) {\n  return `<a href=\"https://twitter.com/hashtag/${hashtag.replace(\n    '#',\n    '',\n  )}\">${hashtag}</a>`;\n}\n\nfunction linkCashtagHtml(cashtag: string) {\n  return `<a href=\"https://twitter.com/search?q=%24${cashtag.replace(\n    '$',\n    '',\n  )}\">${cashtag}</a>`;\n}\n\nfunction linkUsernameHtml(username: string) {\n  return `<a href=\"https://twitter.com/${username.replace(\n    '@',\n    '',\n  )}\">${username}</a>`;\n}\n\nfunction unwrapTcoUrlHtml(tweet: LegacyTweetRaw, foundedMedia: string[]) {\n  return function (tco: string) {\n    for (const entity of tweet.entities?.urls ?? []) {\n      if (tco === entity.url && entity.expanded_url != null) {\n        return `<a href=\"${entity.expanded_url}\">${tco}</a>`;\n      }\n    }\n\n    for (const entity of tweet.extended_entities?.media ?? []) {\n      if (tco === entity.url && entity.media_url_https != null) {\n        foundedMedia.push(entity.media_url_https);\n        return `<br><a href=\"${tco}\"><img src=\"${entity.media_url_https}\"/></a>`;\n      }\n    }\n\n    return tco;\n  };\n}\n","import { LegacyUserRaw } from './profile';\nimport { parseMediaGroups, reconstructTweetHtml } from './timeline-tweet-util';\nimport {\n  LegacyTweetRaw,\n  ParseTweetResult,\n  QueryTweetsResponse,\n  SearchResultRaw,\n  TimelineResultRaw,\n} from './timeline-v1';\nimport { Tweet } from './tweets';\nimport { isFieldDefined } from './type-util';\n\nexport interface TimelineUserResultRaw {\n  rest_id?: string;\n  legacy?: LegacyUserRaw;\n  is_blue_verified?: boolean;\n}\n\nexport interface TimelineEntryItemContentRaw {\n  itemType?: string;\n  tweetDisplayType?: string;\n  tweetResult?: {\n    result?: TimelineResultRaw;\n  };\n  tweet_results?: {\n    result?: TimelineResultRaw;\n  };\n  userDisplayType?: string;\n  user_results?: {\n    result?: TimelineUserResultRaw;\n  };\n}\n\nexport interface TimelineEntryRaw {\n  entryId: string;\n  content?: {\n    cursorType?: string;\n    value?: string;\n    items?: {\n      entryId?: string;\n      item?: {\n        content?: TimelineEntryItemContentRaw;\n        itemContent?: SearchEntryItemContentRaw;\n      };\n    }[];\n    itemContent?: TimelineEntryItemContentRaw;\n  };\n}\n\nexport interface SearchEntryItemContentRaw {\n  tweetDisplayType?: string;\n  tweet_results?: {\n    result?: SearchResultRaw;\n  };\n  userDisplayType?: string;\n  user_results?: {\n    result?: TimelineUserResultRaw;\n  };\n}\n\nexport interface SearchEntryRaw {\n  entryId: string;\n  sortIndex: string;\n  content?: {\n    cursorType?: string;\n    entryType?: string;\n    __typename?: string;\n    value?: string;\n    items?: {\n      item?: {\n        content?: SearchEntryItemContentRaw;\n      };\n    }[];\n    itemContent?: SearchEntryItemContentRaw;\n  };\n}\n\nexport interface TimelineInstruction {\n  entries?: TimelineEntryRaw[];\n  entry?: TimelineEntryRaw;\n  type?: string;\n}\n\nexport interface TimelineV2 {\n  data?: {\n    user?: {\n      result?: {\n        timeline_v2?: {\n          timeline?: {\n            instructions?: TimelineInstruction[];\n          };\n        };\n      };\n    };\n  };\n}\n\nexport interface ThreadedConversation {\n  data?: {\n    threaded_conversation_with_injections_v2?: {\n      instructions?: TimelineInstruction[];\n    };\n  };\n}\n\nexport function parseLegacyTweet(\n  user?: LegacyUserRaw,\n  tweet?: LegacyTweetRaw,\n): ParseTweetResult {\n  if (tweet == null) {\n    return {\n      success: false,\n      err: new Error('Tweet was not found in the timeline object.'),\n    };\n  }\n\n  if (user == null) {\n    return {\n      success: false,\n      err: new Error('User was not found in the timeline object.'),\n    };\n  }\n\n  if (!tweet.id_str) {\n    if (!tweet.conversation_id_str) {\n      return {\n        success: false,\n        err: new Error('Tweet ID was not found in object.'),\n      };\n    }\n\n    tweet.id_str = tweet.conversation_id_str;\n  }\n\n  const hashtags = tweet.entities?.hashtags ?? [];\n  const mentions = tweet.entities?.user_mentions ?? [];\n  const media = tweet.extended_entities?.media ?? [];\n  const pinnedTweets = new Set<string | undefined>(\n    user.pinned_tweet_ids_str ?? [],\n  );\n  const urls = tweet.entities?.urls ?? [];\n  const { photos, videos, sensitiveContent } = parseMediaGroups(media);\n\n  const tw: Tweet = {\n    bookmarkCount: tweet.bookmark_count,\n    conversationId: tweet.conversation_id_str,\n    id: tweet.id_str,\n    hashtags: hashtags\n      .filter(isFieldDefined('text'))\n      .map((hashtag) => hashtag.text),\n    likes: tweet.favorite_count,\n    mentions: mentions.filter(isFieldDefined('id_str')).map((mention) => ({\n      id: mention.id_str,\n      username: mention.screen_name,\n      name: mention.name,\n    })),\n    name: user.name,\n    permanentUrl: `https://twitter.com/${user.screen_name}/status/${tweet.id_str}`,\n    photos,\n    replies: tweet.reply_count,\n    retweets: tweet.retweet_count,\n    text: tweet.full_text,\n    thread: [],\n    urls: urls\n      .filter(isFieldDefined('expanded_url'))\n      .map((url) => url.expanded_url),\n    userId: tweet.user_id_str,\n    username: user.screen_name,\n    videos,\n    isQuoted: false,\n    isReply: false,\n    isRetweet: false,\n    isPin: false,\n    sensitiveContent: false,\n  };\n\n  if (tweet.created_at) {\n    tw.timeParsed = new Date(Date.parse(tweet.created_at));\n    tw.timestamp = Math.floor(tw.timeParsed.valueOf() / 1000);\n  }\n\n  if (tweet.place?.id) {\n    tw.place = tweet.place;\n  }\n\n  const quotedStatusIdStr = tweet.quoted_status_id_str;\n  const inReplyToStatusIdStr = tweet.in_reply_to_status_id_str;\n  const retweetedStatusIdStr = tweet.retweeted_status_id_str;\n  const retweetedStatusResult = tweet.retweeted_status_result?.result;\n\n  if (quotedStatusIdStr) {\n    tw.isQuoted = true;\n    tw.quotedStatusId = quotedStatusIdStr;\n  }\n\n  if (inReplyToStatusIdStr) {\n    tw.isReply = true;\n    tw.inReplyToStatusId = inReplyToStatusIdStr;\n  }\n\n  if (retweetedStatusIdStr || retweetedStatusResult) {\n    tw.isRetweet = true;\n    tw.retweetedStatusId = retweetedStatusIdStr;\n\n    if (retweetedStatusResult) {\n      const parsedResult = parseLegacyTweet(\n        retweetedStatusResult?.core?.user_results?.result?.legacy,\n        retweetedStatusResult?.legacy,\n      );\n\n      if (parsedResult.success) {\n        tw.retweetedStatus = parsedResult.tweet;\n      }\n    }\n  }\n\n  const views = parseInt(tweet.ext_views?.count ?? '');\n  if (!isNaN(views)) {\n    tw.views = views;\n  }\n\n  if (pinnedTweets.has(tweet.id_str)) {\n    // TODO: Update tests so this can be assigned at the tweet declaration\n    tw.isPin = true;\n  }\n\n  if (sensitiveContent) {\n    // TODO: Update tests so this can be assigned at the tweet declaration\n    tw.sensitiveContent = true;\n  }\n\n  tw.html = reconstructTweetHtml(tweet, tw.photos, tw.videos);\n\n  return { success: true, tweet: tw };\n}\n\nfunction parseResult(result?: TimelineResultRaw): ParseTweetResult {\n  const noteTweetResultText =\n    result?.note_tweet?.note_tweet_results?.result?.text;\n\n  if (result?.legacy && noteTweetResultText) {\n    result.legacy.full_text = noteTweetResultText;\n  }\n\n  const tweetResult = parseLegacyTweet(\n    result?.core?.user_results?.result?.legacy,\n    result?.legacy,\n  );\n  if (!tweetResult.success) {\n    return tweetResult;\n  }\n\n  if (!tweetResult.tweet.views && result?.views?.count) {\n    const views = parseInt(result.views.count);\n    if (!isNaN(views)) {\n      tweetResult.tweet.views = views;\n    }\n  }\n\n  const quotedResult = result?.quoted_status_result?.result;\n  if (quotedResult) {\n    if (quotedResult.legacy && quotedResult.rest_id) {\n      quotedResult.legacy.id_str = quotedResult.rest_id;\n    }\n\n    const quotedTweetResult = parseResult(quotedResult);\n    if (quotedTweetResult.success) {\n      tweetResult.tweet.quotedStatus = quotedTweetResult.tweet;\n    }\n  }\n\n  return tweetResult;\n}\n\nconst expectedEntryTypes = ['tweet', 'profile-conversation'];\n\nexport function parseTimelineTweetsV2(\n  timeline: TimelineV2,\n): QueryTweetsResponse {\n  let bottomCursor: string | undefined;\n  let topCursor: string | undefined;\n  const tweets: Tweet[] = [];\n  const instructions =\n    timeline.data?.user?.result?.timeline_v2?.timeline?.instructions ?? [];\n  for (const instruction of instructions) {\n    const entries = instruction.entries ?? [];\n\n    for (const entry of entries) {\n      const entryContent = entry.content;\n      if (!entryContent) continue;\n\n      // Handle pagination\n      if (entryContent.cursorType === 'Bottom') {\n        bottomCursor = entryContent.value;\n        continue;\n      } else if (entryContent.cursorType === 'Top') {\n        topCursor = entryContent.value;\n        continue;\n      }\n\n      const idStr = entry.entryId;\n      if (\n        !expectedEntryTypes.some((entryType) => idStr.startsWith(entryType))\n      ) {\n        continue;\n      }\n\n      if (entryContent.itemContent) {\n        // Typically TimelineTimelineTweet entries\n        parseAndPush(tweets, entryContent.itemContent, idStr);\n      } else if (entryContent.items) {\n        // Typically TimelineTimelineModule entries\n        for (const item of entryContent.items) {\n          if (item.item?.itemContent) {\n            parseAndPush(tweets, item.item.itemContent, idStr);\n          }\n        }\n      }\n    }\n  }\n\n  return { tweets, next: bottomCursor, previous: topCursor };\n}\n\nexport function parseTimelineEntryItemContentRaw(\n  content: TimelineEntryItemContentRaw,\n  entryId: string,\n  isConversation = false,\n) {\n  let result = content.tweet_results?.result ?? content.tweetResult?.result;\n  if (\n    result?.__typename === 'Tweet' ||\n    (result?.__typename === 'TweetWithVisibilityResults' && result?.tweet)\n  ) {\n    if (result?.__typename === 'TweetWithVisibilityResults')\n      result = result.tweet;\n\n    if (result?.legacy) {\n      result.legacy.id_str =\n        result.rest_id ??\n        entryId.replace('conversation-', '').replace('tweet-', '');\n    }\n\n    const tweetResult = parseResult(result);\n    if (tweetResult.success) {\n      if (isConversation) {\n        if (content?.tweetDisplayType === 'SelfThread') {\n          tweetResult.tweet.isSelfThread = true;\n        }\n      }\n\n      return tweetResult.tweet;\n    }\n  }\n\n  return null;\n}\n\nexport function parseAndPush(\n  tweets: Tweet[],\n  content: TimelineEntryItemContentRaw,\n  entryId: string,\n  isConversation = false,\n) {\n  const tweet = parseTimelineEntryItemContentRaw(\n    content,\n    entryId,\n    isConversation,\n  );\n\n  if (tweet) {\n    tweets.push(tweet);\n  }\n}\n\nexport function parseThreadedConversation(\n  conversation: ThreadedConversation,\n): Tweet[] {\n  const tweets: Tweet[] = [];\n  const instructions =\n    conversation.data?.threaded_conversation_with_injections_v2?.instructions ??\n    [];\n\n  for (const instruction of instructions) {\n    const entries = instruction.entries ?? [];\n    for (const entry of entries) {\n      const entryContent = entry.content?.itemContent;\n      if (entryContent) {\n        parseAndPush(tweets, entryContent, entry.entryId, true);\n      }\n\n      for (const item of entry.content?.items ?? []) {\n        const itemContent = item.item?.itemContent;\n        if (itemContent) {\n          parseAndPush(tweets, itemContent, entry.entryId, true);\n        }\n      }\n    }\n  }\n\n  for (const tweet of tweets) {\n    if (tweet.inReplyToStatusId) {\n      for (const parentTweet of tweets) {\n        if (parentTweet.id === tweet.inReplyToStatusId) {\n          tweet.inReplyToStatus = parentTweet;\n          break;\n        }\n      }\n    }\n\n    if (tweet.isSelfThread && tweet.conversationId === tweet.id) {\n      for (const childTweet of tweets) {\n        if (childTweet.isSelfThread && childTweet.id !== tweet.id) {\n          tweet.thread.push(childTweet);\n        }\n      }\n\n      if (tweet.thread.length === 0) {\n        tweet.isSelfThread = false;\n      }\n    }\n  }\n\n  return tweets;\n}\n","import { Profile, parseProfile } from './profile';\nimport { QueryProfilesResponse, QueryTweetsResponse } from './timeline-v1';\nimport { SearchEntryRaw, parseLegacyTweet } from './timeline-v2';\nimport { Tweet } from './tweets';\n\nexport interface SearchTimeline {\n  data?: {\n    search_by_raw_query?: {\n      search_timeline?: {\n        timeline?: {\n          instructions?: {\n            entries?: SearchEntryRaw[];\n            entry?: SearchEntryRaw;\n            type?: string;\n          }[];\n        };\n      };\n    };\n  };\n}\n\nexport function parseSearchTimelineTweets(\n  timeline: SearchTimeline,\n): QueryTweetsResponse {\n  let bottomCursor: string | undefined;\n  let topCursor: string | undefined;\n  const tweets: Tweet[] = [];\n  const instructions =\n    timeline.data?.search_by_raw_query?.search_timeline?.timeline\n      ?.instructions ?? [];\n  for (const instruction of instructions) {\n    if (\n      instruction.type === 'TimelineAddEntries' ||\n      instruction.type === 'TimelineReplaceEntry'\n    ) {\n      if (instruction.entry?.content?.cursorType === 'Bottom') {\n        bottomCursor = instruction.entry.content.value;\n        continue;\n      } else if (instruction.entry?.content?.cursorType === 'Top') {\n        topCursor = instruction.entry.content.value;\n        continue;\n      }\n\n      const entries = instruction.entries ?? [];\n      for (const entry of entries) {\n        const itemContent = entry.content?.itemContent;\n        if (itemContent?.tweetDisplayType === 'Tweet') {\n          const tweetResultRaw = itemContent.tweet_results?.result;\n          const tweetResult = parseLegacyTweet(\n            tweetResultRaw?.core?.user_results?.result?.legacy,\n            tweetResultRaw?.legacy,\n          );\n\n          if (tweetResult.success) {\n            if (!tweetResult.tweet.views && tweetResultRaw?.views?.count) {\n              const views = parseInt(tweetResultRaw.views.count);\n              if (!isNaN(views)) {\n                tweetResult.tweet.views = views;\n              }\n            }\n\n            tweets.push(tweetResult.tweet);\n          }\n        } else if (entry.content?.cursorType === 'Bottom') {\n          bottomCursor = entry.content.value;\n        } else if (entry.content?.cursorType === 'Top') {\n          topCursor = entry.content.value;\n        }\n      }\n    }\n  }\n\n  return { tweets, next: bottomCursor, previous: topCursor };\n}\n\nexport function parseSearchTimelineUsers(\n  timeline: SearchTimeline,\n): QueryProfilesResponse {\n  let bottomCursor: string | undefined;\n  let topCursor: string | undefined;\n  const profiles: Profile[] = [];\n  const instructions =\n    timeline.data?.search_by_raw_query?.search_timeline?.timeline\n      ?.instructions ?? [];\n\n  for (const instruction of instructions) {\n    if (\n      instruction.type === 'TimelineAddEntries' ||\n      instruction.type === 'TimelineReplaceEntry'\n    ) {\n      if (instruction.entry?.content?.cursorType === 'Bottom') {\n        bottomCursor = instruction.entry.content.value;\n        continue;\n      } else if (instruction.entry?.content?.cursorType === 'Top') {\n        topCursor = instruction.entry.content.value;\n        continue;\n      }\n\n      const entries = instruction.entries ?? [];\n      for (const entry of entries) {\n        const itemContent = entry.content?.itemContent;\n        if (itemContent?.userDisplayType === 'User') {\n          const userResultRaw = itemContent.user_results?.result;\n\n          if (userResultRaw?.legacy) {\n            const profile = parseProfile(\n              userResultRaw.legacy,\n              userResultRaw.is_blue_verified,\n            );\n\n            if (!profile.userId) {\n              profile.userId = userResultRaw.rest_id;\n            }\n\n            profiles.push(profile);\n          }\n        } else if (entry.content?.cursorType === 'Bottom') {\n          bottomCursor = entry.content.value;\n        } else if (entry.content?.cursorType === 'Top') {\n          topCursor = entry.content.value;\n        }\n      }\n    }\n  }\n\n  return { profiles, next: bottomCursor, previous: topCursor };\n}\n","import { addApiFeatures, requestApi } from './api';\nimport { TwitterAuth } from './auth';\nimport { Profile } from './profile';\nimport { QueryProfilesResponse, QueryTweetsResponse } from './timeline-v1';\nimport { getTweetTimeline, getUserTimeline } from './timeline-async';\nimport { Tweet } from './tweets';\nimport {\n  SearchTimeline,\n  parseSearchTimelineTweets,\n  parseSearchTimelineUsers,\n} from './timeline-search';\nimport stringify from 'json-stable-stringify';\n\n/**\n * The categories that can be used in Twitter searches.\n */\nexport enum SearchMode {\n  Top,\n  Latest,\n  Photos,\n  Videos,\n  Users,\n}\n\nexport function searchTweets(\n  query: string,\n  maxTweets: number,\n  searchMode: SearchMode,\n  auth: TwitterAuth,\n): AsyncGenerator<Tweet, void> {\n  return getTweetTimeline(query, maxTweets, (q, mt, c) => {\n    return fetchSearchTweets(q, mt, searchMode, auth, c);\n  });\n}\n\nexport function searchProfiles(\n  query: string,\n  maxProfiles: number,\n  auth: TwitterAuth,\n): AsyncGenerator<Profile, void> {\n  return getUserTimeline(query, maxProfiles, (q, mt, c) => {\n    return fetchSearchProfiles(q, mt, auth, c);\n  });\n}\n\nexport async function fetchSearchTweets(\n  query: string,\n  maxTweets: number,\n  searchMode: SearchMode,\n  auth: TwitterAuth,\n  cursor?: string,\n): Promise<QueryTweetsResponse> {\n  const timeline = await getSearchTimeline(\n    query,\n    maxTweets,\n    searchMode,\n    auth,\n    cursor,\n  );\n\n  return parseSearchTimelineTweets(timeline);\n}\n\nexport async function fetchSearchProfiles(\n  query: string,\n  maxProfiles: number,\n  auth: TwitterAuth,\n  cursor?: string,\n): Promise<QueryProfilesResponse> {\n  const timeline = await getSearchTimeline(\n    query,\n    maxProfiles,\n    SearchMode.Users,\n    auth,\n    cursor,\n  );\n\n  return parseSearchTimelineUsers(timeline);\n}\n\nasync function getSearchTimeline(\n  query: string,\n  maxItems: number,\n  searchMode: SearchMode,\n  auth: TwitterAuth,\n  cursor?: string,\n): Promise<SearchTimeline> {\n  if (!auth.isLoggedIn()) {\n    throw new Error('Scraper is not logged-in for search.');\n  }\n\n  if (maxItems > 50) {\n    maxItems = 50;\n  }\n\n  const variables: Record<string, any> = {\n    rawQuery: query,\n    count: maxItems,\n    querySource: 'typed_query',\n    product: 'Top',\n  };\n\n  const features = addApiFeatures({\n    longform_notetweets_inline_media_enabled: true,\n    responsive_web_enhance_cards_enabled: false,\n    responsive_web_media_download_video_enabled: false,\n    responsive_web_twitter_article_tweet_consumption_enabled: false,\n    tweet_with_visibility_results_prefer_gql_limited_actions_policy_enabled:\n      true,\n    interactive_text_enabled: false,\n    responsive_web_text_conversations_enabled: false,\n    vibe_api_enabled: false,\n  });\n\n  const fieldToggles: Record<string, any> = {\n    withArticleRichContentState: false,\n  };\n\n  if (cursor != null && cursor != '') {\n    variables['cursor'] = cursor;\n  }\n\n  switch (searchMode) {\n    case SearchMode.Latest:\n      variables.product = 'Latest';\n      break;\n    case SearchMode.Photos:\n      variables.product = 'Photos';\n      break;\n    case SearchMode.Videos:\n      variables.product = 'Videos';\n      break;\n    case SearchMode.Users:\n      variables.product = 'People';\n      break;\n    default:\n      break;\n  }\n\n  const params = new URLSearchParams();\n  params.set('features', stringify(features) ?? '');\n  params.set('fieldToggles', stringify(fieldToggles) ?? '');\n  params.set('variables', stringify(variables) ?? '');\n\n  const res = await requestApi<SearchTimeline>(\n    `https://api.twitter.com/graphql/gkjsKepM6gl_HmFWoWKfgg/SearchTimeline?${params.toString()}`,\n    auth,\n  );\n\n  if (!res.success) {\n    throw res.err;\n  }\n\n  return res.value;\n}\n","import { Profile, parseProfile } from './profile';\nimport { QueryProfilesResponse } from './timeline-v1';\nimport { TimelineUserResultRaw } from './timeline-v2';\n\nexport interface RelationshipEntryItemContentRaw {\n  itemType?: string;\n  userDisplayType?: string;\n  user_results?: {\n    result?: TimelineUserResultRaw;\n  };\n}\n\nexport interface RelationshipEntryRaw {\n  entryId: string;\n  sortIndex: string;\n  content?: {\n    cursorType?: string;\n    entryType?: string;\n    __typename?: string;\n    value?: string;\n    itemContent?: RelationshipEntryItemContentRaw;\n  };\n}\n\nexport interface RelationshipTimeline {\n  data?: {\n    user?: {\n      result?: {\n        timeline?: {\n          timeline?: {\n            instructions?: {\n              entries?: RelationshipEntryRaw[];\n              entry?: RelationshipEntryRaw;\n              type?: string;\n            }[];\n          };\n        };\n      };\n    };\n  };\n}\n\nexport function parseRelationshipTimeline(\n  timeline: RelationshipTimeline,\n): QueryProfilesResponse {\n  let bottomCursor: string | undefined;\n  let topCursor: string | undefined;\n  const profiles: Profile[] = [];\n  const instructions =\n    timeline.data?.user?.result?.timeline?.timeline?.instructions ?? [];\n\n  for (const instruction of instructions) {\n    if (\n      instruction.type === 'TimelineAddEntries' ||\n      instruction.type === 'TimelineReplaceEntry'\n    ) {\n      if (instruction.entry?.content?.cursorType === 'Bottom') {\n        bottomCursor = instruction.entry.content.value;\n        continue;\n      }\n\n      if (instruction.entry?.content?.cursorType === 'Top') {\n        topCursor = instruction.entry.content.value;\n        continue;\n      }\n\n      const entries = instruction.entries ?? [];\n      for (const entry of entries) {\n        const itemContent = entry.content?.itemContent;\n        if (itemContent?.userDisplayType === 'User') {\n          const userResultRaw = itemContent.user_results?.result;\n\n          if (userResultRaw?.legacy) {\n            const profile = parseProfile(\n              userResultRaw.legacy,\n              userResultRaw.is_blue_verified,\n            );\n\n            if (!profile.userId) {\n              profile.userId = userResultRaw.rest_id;\n            }\n\n            profiles.push(profile);\n          }\n        } else if (entry.content?.cursorType === 'Bottom') {\n          bottomCursor = entry.content.value;\n        } else if (entry.content?.cursorType === 'Top') {\n          topCursor = entry.content.value;\n        }\n      }\n    }\n  }\n\n  return { profiles, next: bottomCursor, previous: topCursor };\n}\n","import { addApiFeatures, requestApi, bearerToken } from './api';\nimport { Headers } from 'headers-polyfill';\nimport { TwitterAuth } from './auth';\nimport { Profile, getUserIdByScreenName } from './profile';\nimport { QueryProfilesResponse } from './timeline-v1';\nimport { getUserTimeline } from './timeline-async';\nimport {\n  RelationshipTimeline,\n  parseRelationshipTimeline,\n} from './timeline-relationship';\nimport stringify from 'json-stable-stringify';\n\nexport function getFollowing(\n  userId: string,\n  maxProfiles: number,\n  auth: TwitterAuth,\n): AsyncGenerator<Profile, void> {\n  return getUserTimeline(userId, maxProfiles, (q, mt, c) => {\n    return fetchProfileFollowing(q, mt, auth, c);\n  });\n}\n\nexport function getFollowers(\n  userId: string,\n  maxProfiles: number,\n  auth: TwitterAuth,\n): AsyncGenerator<Profile, void> {\n  return getUserTimeline(userId, maxProfiles, (q, mt, c) => {\n    return fetchProfileFollowers(q, mt, auth, c);\n  });\n}\n\nexport async function fetchProfileFollowing(\n  userId: string,\n  maxProfiles: number,\n  auth: TwitterAuth,\n  cursor?: string,\n): Promise<QueryProfilesResponse> {\n  const timeline = await getFollowingTimeline(\n    userId,\n    maxProfiles,\n    auth,\n    cursor,\n  );\n\n  return parseRelationshipTimeline(timeline);\n}\n\nexport async function fetchProfileFollowers(\n  userId: string,\n  maxProfiles: number,\n  auth: TwitterAuth,\n  cursor?: string,\n): Promise<QueryProfilesResponse> {\n  const timeline = await getFollowersTimeline(\n    userId,\n    maxProfiles,\n    auth,\n    cursor,\n  );\n\n  return parseRelationshipTimeline(timeline);\n}\n\nasync function getFollowingTimeline(\n  userId: string,\n  maxItems: number,\n  auth: TwitterAuth,\n  cursor?: string,\n): Promise<RelationshipTimeline> {\n  if (!auth.isLoggedIn()) {\n    throw new Error('Scraper is not logged-in for profile following.');\n  }\n\n  if (maxItems > 50) {\n    maxItems = 50;\n  }\n\n  const variables: Record<string, any> = {\n    userId,\n    count: maxItems,\n    includePromotedContent: false,\n  };\n\n  const features = addApiFeatures({\n    responsive_web_twitter_article_tweet_consumption_enabled: false,\n    tweet_with_visibility_results_prefer_gql_limited_actions_policy_enabled:\n      true,\n    longform_notetweets_inline_media_enabled: true,\n    responsive_web_media_download_video_enabled: false,\n  });\n\n  if (cursor != null && cursor != '') {\n    variables['cursor'] = cursor;\n  }\n\n  const params = new URLSearchParams();\n  params.set('features', stringify(features) ?? '');\n  params.set('variables', stringify(variables) ?? '');\n\n  const res = await requestApi<RelationshipTimeline>(\n    `https://twitter.com/i/api/graphql/iSicc7LrzWGBgDPL0tM_TQ/Following?${params.toString()}`,\n    auth,\n  );\n\n  if (!res.success) {\n    throw res.err;\n  }\n\n  return res.value;\n}\n\nasync function getFollowersTimeline(\n  userId: string,\n  maxItems: number,\n  auth: TwitterAuth,\n  cursor?: string,\n): Promise<RelationshipTimeline> {\n  if (!auth.isLoggedIn()) {\n    throw new Error('Scraper is not logged-in for profile followers.');\n  }\n\n  if (maxItems > 50) {\n    maxItems = 50;\n  }\n\n  const variables: Record<string, any> = {\n    userId,\n    count: maxItems,\n    includePromotedContent: false,\n  };\n\n  const features = addApiFeatures({\n    responsive_web_twitter_article_tweet_consumption_enabled: false,\n    tweet_with_visibility_results_prefer_gql_limited_actions_policy_enabled:\n      true,\n    longform_notetweets_inline_media_enabled: true,\n    responsive_web_media_download_video_enabled: false,\n  });\n\n  if (cursor != null && cursor != '') {\n    variables['cursor'] = cursor;\n  }\n\n  const params = new URLSearchParams();\n  params.set('features', stringify(features) ?? '');\n  params.set('variables', stringify(variables) ?? '');\n\n  const res = await requestApi<RelationshipTimeline>(\n    `https://twitter.com/i/api/graphql/rRXFSG5vR6drKr5M37YOTw/Followers?${params.toString()}`,\n    auth,\n  );\n\n  if (!res.success) {\n    throw res.err;\n  }\n\n  return res.value;\n}\n\nexport async function followUser(\n  username: string,\n  auth: TwitterAuth,\n): Promise<Response> {\n\n  // Check if the user is logged in\n  if (!(await auth.isLoggedIn())) {\n    throw new Error('Must be logged in to follow users');\n  }\n  // Get user ID from username\n  const userIdResult = await getUserIdByScreenName(username, auth);\n\n  if (!userIdResult.success) {\n    throw new Error(`Failed to get user ID: ${userIdResult.err.message}`);\n  }\n\n  const userId = userIdResult.value;\n\n  // Prepare the request body\n  const requestBody = {\n    include_profile_interstitial_type: '1',\n    skip_status: 'true',\n    user_id: userId,\n  };\n\n  // Prepare the headers\n  const headers = new Headers({\n    'Content-Type': 'application/x-www-form-urlencoded',\n    Referer: `https://twitter.com/${username}`,\n    'X-Twitter-Active-User': 'yes',\n    'X-Twitter-Auth-Type': 'OAuth2Session',\n    'X-Twitter-Client-Language': 'en',\n    Authorization: `Bearer ${bearerToken}`,\n  });\n\n  // Install auth headers\n  await auth.installTo(headers, 'https://api.twitter.com/1.1/friendships/create.json');\n  \n  // Make the follow request using auth.fetch\n  const res = await auth.fetch(\n    'https://api.twitter.com/1.1/friendships/create.json',\n    {\n      method: 'POST',\n      headers,\n      body: new URLSearchParams(requestBody).toString(),\n      credentials: 'include',\n    },\n  );\n\n  if (!res.ok) {\n    throw new Error(`Failed to follow user: ${res.statusText}`);\n  }\n\n  const data = await res.json();\n\n  return new Response(JSON.stringify(data), {\n    status: 200,\n    headers: {\n      'Content-Type': 'application/json',\n    },\n  });\n}","import { addApiParams, requestApi } from './api';\nimport { TwitterAuth } from './auth';\nimport { TimelineV1 } from './timeline-v1';\n\nexport async function getTrends(auth: TwitterAuth): Promise<string[]> {\n  const params = new URLSearchParams();\n  addApiParams(params, false);\n\n  params.set('count', '20');\n  params.set('candidate_source', 'trends');\n  params.set('include_page_configuration', 'false');\n  params.set('entity_tokens', 'false');\n\n  const res = await requestApi<TimelineV1>(\n    `https://api.twitter.com/2/guide.json?${params.toString()}`,\n    auth,\n  );\n  if (!res.success) {\n    throw res.err;\n  }\n\n  const instructions = res.value.timeline?.instructions ?? [];\n  if (instructions.length < 2) {\n    throw new Error('No trend entries found.');\n  }\n\n  // Some of this is silly, but for now we're assuming we know nothing about the\n  // data, and that anything can be missing. Go has non-nilable strings and empty\n  // slices are nil, so it largely doesn't need to worry about this.\n  const entries = instructions[1].addEntries?.entries ?? [];\n  if (entries.length < 2) {\n    throw new Error('No trend entries found.');\n  }\n\n  const items = entries[1].content?.timelineModule?.items ?? [];\n  const trends: string[] = [];\n  for (const item of items) {\n    const trend =\n      item.item?.clientEventInfo?.details?.guideDetails?.transparentGuideDetails\n        ?.trendMetadata?.trendName;\n    if (trend != null) {\n      trends.push(trend);\n    }\n  }\n\n  return trends;\n}\n","import stringify from 'json-stable-stringify';\n\n/**\n * Examples of requests to API endpoints. These are parsed at runtime and used\n * as templates for requests to a particular endpoint. Please ensure these do\n * not contain any information that you do not want published to NPM.\n */\nconst endpoints = {\n  // TODO: Migrate other endpoint URLs here\n  UserTweets:\n    'https://twitter.com/i/api/graphql/V7H0Ap3_Hh2FyS75OCDO3Q/UserTweets?variables=%7B%22userId%22%3A%224020276615%22%2C%22count%22%3A20%2C%22includePromotedContent%22%3Atrue%2C%22withQuickPromoteEligibilityTweetFields%22%3Atrue%2C%22withVoice%22%3Atrue%2C%22withV2Timeline%22%3Atrue%7D&features=%7B%22rweb_tipjar_consumption_enabled%22%3Atrue%2C%22responsive_web_graphql_exclude_directive_enabled%22%3Atrue%2C%22verified_phone_label_enabled%22%3Afalse%2C%22creator_subscriptions_tweet_preview_api_enabled%22%3Atrue%2C%22responsive_web_graphql_timeline_navigation_enabled%22%3Atrue%2C%22responsive_web_graphql_skip_user_profile_image_extensions_enabled%22%3Afalse%2C%22communities_web_enable_tweet_community_results_fetch%22%3Atrue%2C%22c9s_tweet_anatomy_moderator_badge_enabled%22%3Atrue%2C%22articles_preview_enabled%22%3Atrue%2C%22tweetypie_unmention_optimization_enabled%22%3Atrue%2C%22responsive_web_edit_tweet_api_enabled%22%3Atrue%2C%22graphql_is_translatable_rweb_tweet_is_translatable_enabled%22%3Atrue%2C%22view_counts_everywhere_api_enabled%22%3Atrue%2C%22longform_notetweets_consumption_enabled%22%3Atrue%2C%22responsive_web_twitter_article_tweet_consumption_enabled%22%3Atrue%2C%22tweet_awards_web_tipping_enabled%22%3Afalse%2C%22creator_subscriptions_quote_tweet_preview_enabled%22%3Afalse%2C%22freedom_of_speech_not_reach_fetch_enabled%22%3Atrue%2C%22standardized_nudges_misinfo%22%3Atrue%2C%22tweet_with_visibility_results_prefer_gql_limited_actions_policy_enabled%22%3Atrue%2C%22rweb_video_timestamps_enabled%22%3Atrue%2C%22longform_notetweets_rich_text_read_enabled%22%3Atrue%2C%22longform_notetweets_inline_media_enabled%22%3Atrue%2C%22responsive_web_enhance_cards_enabled%22%3Afalse%7D&fieldToggles=%7B%22withArticlePlainText%22%3Afalse%7D',\n  UserTweetsAndReplies:\n    'https://twitter.com/i/api/graphql/E4wA5vo2sjVyvpliUffSCw/UserTweetsAndReplies?variables=%7B%22userId%22%3A%224020276615%22%2C%22count%22%3A40%2C%22cursor%22%3A%22DAABCgABGPWl-F-ATiIKAAIY9YfiF1rRAggAAwAAAAEAAA%22%2C%22includePromotedContent%22%3Atrue%2C%22withCommunity%22%3Atrue%2C%22withVoice%22%3Atrue%2C%22withV2Timeline%22%3Atrue%7D&features=%7B%22rweb_tipjar_consumption_enabled%22%3Atrue%2C%22responsive_web_graphql_exclude_directive_enabled%22%3Atrue%2C%22verified_phone_label_enabled%22%3Afalse%2C%22creator_subscriptions_tweet_preview_api_enabled%22%3Atrue%2C%22responsive_web_graphql_timeline_navigation_enabled%22%3Atrue%2C%22responsive_web_graphql_skip_user_profile_image_extensions_enabled%22%3Afalse%2C%22communities_web_enable_tweet_community_results_fetch%22%3Atrue%2C%22c9s_tweet_anatomy_moderator_badge_enabled%22%3Atrue%2C%22articles_preview_enabled%22%3Atrue%2C%22tweetypie_unmention_optimization_enabled%22%3Atrue%2C%22responsive_web_edit_tweet_api_enabled%22%3Atrue%2C%22graphql_is_translatable_rweb_tweet_is_translatable_enabled%22%3Atrue%2C%22view_counts_everywhere_api_enabled%22%3Atrue%2C%22longform_notetweets_consumption_enabled%22%3Atrue%2C%22responsive_web_twitter_article_tweet_consumption_enabled%22%3Atrue%2C%22tweet_awards_web_tipping_enabled%22%3Afalse%2C%22creator_subscriptions_quote_tweet_preview_enabled%22%3Afalse%2C%22freedom_of_speech_not_reach_fetch_enabled%22%3Atrue%2C%22standardized_nudges_misinfo%22%3Atrue%2C%22tweet_with_visibility_results_prefer_gql_limited_actions_policy_enabled%22%3Atrue%2C%22rweb_video_timestamps_enabled%22%3Atrue%2C%22longform_notetweets_rich_text_read_enabled%22%3Atrue%2C%22longform_notetweets_inline_media_enabled%22%3Atrue%2C%22responsive_web_enhance_cards_enabled%22%3Afalse%7D&fieldToggles=%7B%22withArticlePlainText%22%3Afalse%7D',\n  UserLikedTweets:\n    'https://twitter.com/i/api/graphql/eSSNbhECHHWWALkkQq-YTA/Likes?variables=%7B%22userId%22%3A%222244196397%22%2C%22count%22%3A20%2C%22includePromotedContent%22%3Afalse%2C%22withClientEventToken%22%3Afalse%2C%22withBirdwatchNotes%22%3Afalse%2C%22withVoice%22%3Atrue%2C%22withV2Timeline%22%3Atrue%7D&features=%7B%22responsive_web_graphql_exclude_directive_enabled%22%3Atrue%2C%22verified_phone_label_enabled%22%3Afalse%2C%22creator_subscriptions_tweet_preview_api_enabled%22%3Atrue%2C%22responsive_web_graphql_timeline_navigation_enabled%22%3Atrue%2C%22responsive_web_graphql_skip_user_profile_image_extensions_enabled%22%3Afalse%2C%22c9s_tweet_anatomy_moderator_badge_enabled%22%3Atrue%2C%22tweetypie_unmention_optimization_enabled%22%3Atrue%2C%22responsive_web_edit_tweet_api_enabled%22%3Atrue%2C%22graphql_is_translatable_rweb_tweet_is_translatable_enabled%22%3Atrue%2C%22view_counts_everywhere_api_enabled%22%3Atrue%2C%22longform_notetweets_consumption_enabled%22%3Atrue%2C%22responsive_web_twitter_article_tweet_consumption_enabled%22%3Atrue%2C%22tweet_awards_web_tipping_enabled%22%3Afalse%2C%22freedom_of_speech_not_reach_fetch_enabled%22%3Atrue%2C%22standardized_nudges_misinfo%22%3Atrue%2C%22tweet_with_visibility_results_prefer_gql_limited_actions_policy_enabled%22%3Atrue%2C%22rweb_video_timestamps_enabled%22%3Atrue%2C%22longform_notetweets_rich_text_read_enabled%22%3Atrue%2C%22longform_notetweets_inline_media_enabled%22%3Atrue%2C%22responsive_web_enhance_cards_enabled%22%3Afalse%7D',\n  TweetDetail:\n    'https://twitter.com/i/api/graphql/xOhkmRac04YFZmOzU9PJHg/TweetDetail?variables=%7B%22focalTweetId%22%3A%221237110546383724547%22%2C%22with_rux_injections%22%3Afalse%2C%22includePromotedContent%22%3Atrue%2C%22withCommunity%22%3Atrue%2C%22withQuickPromoteEligibilityTweetFields%22%3Atrue%2C%22withBirdwatchNotes%22%3Atrue%2C%22withVoice%22%3Atrue%2C%22withV2Timeline%22%3Atrue%7D&features=%7B%22responsive_web_graphql_exclude_directive_enabled%22%3Atrue%2C%22verified_phone_label_enabled%22%3Afalse%2C%22creator_subscriptions_tweet_preview_api_enabled%22%3Atrue%2C%22responsive_web_graphql_timeline_navigation_enabled%22%3Atrue%2C%22responsive_web_graphql_skip_user_profile_image_extensions_enabled%22%3Afalse%2C%22tweetypie_unmention_optimization_enabled%22%3Atrue%2C%22responsive_web_edit_tweet_api_enabled%22%3Atrue%2C%22graphql_is_translatable_rweb_tweet_is_translatable_enabled%22%3Atrue%2C%22view_counts_everywhere_api_enabled%22%3Atrue%2C%22longform_notetweets_consumption_enabled%22%3Atrue%2C%22responsive_web_twitter_article_tweet_consumption_enabled%22%3Afalse%2C%22tweet_awards_web_tipping_enabled%22%3Afalse%2C%22freedom_of_speech_not_reach_fetch_enabled%22%3Atrue%2C%22standardized_nudges_misinfo%22%3Atrue%2C%22tweet_with_visibility_results_prefer_gql_limited_actions_policy_enabled%22%3Atrue%2C%22longform_notetweets_rich_text_read_enabled%22%3Atrue%2C%22longform_notetweets_inline_media_enabled%22%3Atrue%2C%22responsive_web_media_download_video_enabled%22%3Afalse%2C%22responsive_web_enhance_cards_enabled%22%3Afalse%7D&fieldToggles=%7B%22withArticleRichContentState%22%3Afalse%7D',\n  TweetResultByRestId:\n    'https://twitter.com/i/api/graphql/DJS3BdhUhcaEpZ7B7irJDg/TweetResultByRestId?variables=%7B%22tweetId%22%3A%221237110546383724547%22%2C%22withCommunity%22%3Afalse%2C%22includePromotedContent%22%3Afalse%2C%22withVoice%22%3Afalse%7D&features=%7B%22creator_subscriptions_tweet_preview_api_enabled%22%3Atrue%2C%22tweetypie_unmention_optimization_enabled%22%3Atrue%2C%22responsive_web_edit_tweet_api_enabled%22%3Atrue%2C%22graphql_is_translatable_rweb_tweet_is_translatable_enabled%22%3Atrue%2C%22view_counts_everywhere_api_enabled%22%3Atrue%2C%22longform_notetweets_consumption_enabled%22%3Atrue%2C%22responsive_web_twitter_article_tweet_consumption_enabled%22%3Afalse%2C%22tweet_awards_web_tipping_enabled%22%3Afalse%2C%22freedom_of_speech_not_reach_fetch_enabled%22%3Atrue%2C%22standardized_nudges_misinfo%22%3Atrue%2C%22tweet_with_visibility_results_prefer_gql_limited_actions_policy_enabled%22%3Atrue%2C%22longform_notetweets_rich_text_read_enabled%22%3Atrue%2C%22longform_notetweets_inline_media_enabled%22%3Atrue%2C%22responsive_web_graphql_exclude_directive_enabled%22%3Atrue%2C%22verified_phone_label_enabled%22%3Afalse%2C%22responsive_web_media_download_video_enabled%22%3Afalse%2C%22responsive_web_graphql_skip_user_profile_image_extensions_enabled%22%3Afalse%2C%22responsive_web_graphql_timeline_navigation_enabled%22%3Atrue%2C%22responsive_web_enhance_cards_enabled%22%3Afalse%7D',\n  ListTweets:\n    'https://twitter.com/i/api/graphql/whF0_KH1fCkdLLoyNPMoEw/ListLatestTweetsTimeline?variables=%7B%22listId%22%3A%221736495155002106192%22%2C%22count%22%3A20%7D&features=%7B%22responsive_web_graphql_exclude_directive_enabled%22%3Atrue%2C%22verified_phone_label_enabled%22%3Afalse%2C%22creator_subscriptions_tweet_preview_api_enabled%22%3Atrue%2C%22responsive_web_graphql_timeline_navigation_enabled%22%3Atrue%2C%22responsive_web_graphql_skip_user_profile_image_extensions_enabled%22%3Afalse%2C%22c9s_tweet_anatomy_moderator_badge_enabled%22%3Atrue%2C%22tweetypie_unmention_optimization_enabled%22%3Atrue%2C%22responsive_web_edit_tweet_api_enabled%22%3Atrue%2C%22graphql_is_translatable_rweb_tweet_is_translatable_enabled%22%3Atrue%2C%22view_counts_everywhere_api_enabled%22%3Atrue%2C%22longform_notetweets_consumption_enabled%22%3Atrue%2C%22responsive_web_twitter_article_tweet_consumption_enabled%22%3Afalse%2C%22tweet_awards_web_tipping_enabled%22%3Afalse%2C%22freedom_of_speech_not_reach_fetch_enabled%22%3Atrue%2C%22standardized_nudges_misinfo%22%3Atrue%2C%22tweet_with_visibility_results_prefer_gql_limited_actions_policy_enabled%22%3Atrue%2C%22rweb_video_timestamps_enabled%22%3Atrue%2C%22longform_notetweets_rich_text_read_enabled%22%3Atrue%2C%22longform_notetweets_inline_media_enabled%22%3Atrue%2C%22responsive_web_media_download_video_enabled%22%3Afalse%2C%22responsive_web_enhance_cards_enabled%22%3Afalse%7D',\n} as const;\n\nexport interface EndpointFieldInfo {\n  /**\n   * Request variables, used for providing arguments such as user IDs or result counts.\n   */\n  variables: Record<string, unknown>;\n\n  /**\n   * Request features, used for encoding feature flags into the request. These may either be\n   * boolean values or numerically-encoded booleans (1 or 0). It is possible this may change\n   * to include other representations of booleans as Twitter's backend evolves.\n   */\n  features: Record<string, unknown>;\n\n  /**\n   * Request field toggles, used for limiting how returned fields are represented. This is\n   * rarely used.\n   */\n  fieldToggles: Record<string, unknown>;\n}\n\ntype SomePartial<T, K extends keyof T> = Omit<T, K> & Partial<Pick<T, K>>;\n\ntype EndpointVersion = string;\ntype EndpointName = string;\ntype EncodedVariables = string;\ntype EncodedFeatures = string;\ntype EncodedFieldToggles = string;\n\n// TODO: Set up field-level Intellisense for the QraphQL parameters in these?\ntype EndpointFields<EndpointUrl> =\n  EndpointUrl extends `https://twitter.com/i/api/graphql/${EndpointVersion}/${EndpointName}?variables=${EncodedVariables}&features=${EncodedFeatures}&fieldToggles=${EncodedFieldToggles}`\n    ? EndpointFieldInfo\n    : EndpointUrl extends `https://twitter.com/i/api/graphql/${EndpointVersion}/${EndpointName}?variables=${EncodedVariables}&features=${EncodedFeatures}`\n    ? SomePartial<EndpointFieldInfo, 'fieldToggles'>\n    : EndpointUrl extends `https://twitter.com/i/api/graphql/${EndpointVersion}/${EndpointName}?variables=${EncodedVariables}`\n    ? SomePartial<EndpointFieldInfo, 'features' | 'fieldToggles'>\n    : Partial<EndpointFieldInfo>;\n\nexport type ApiRequestInfo<EndpointUrl> = EndpointFields<EndpointUrl> & {\n  /**\n   * The URL, without any GraphQL query parameters.\n   */\n  url: string;\n\n  /**\n   * Converts the request back into a URL to be sent to the Twitter API.\n   */\n  toRequestUrl(): string;\n};\n\n/** Wrapper class for API request information. */\nclass ApiRequest<EndpointUrl> {\n  url: string;\n  variables?: Record<string, unknown> | undefined;\n  features?: Record<string, unknown> | undefined;\n  fieldToggles?: Record<string, unknown> | undefined;\n\n  constructor(info: Omit<ApiRequestInfo<EndpointUrl>, 'toRequestUrl'>) {\n    this.url = info.url;\n    this.variables = info.variables;\n    this.features = info.features;\n    this.fieldToggles = info.fieldToggles;\n  }\n\n  toRequestUrl(): string {\n    const params = new URLSearchParams();\n\n    // Only include query parameters with values\n    if (this.variables) {\n      // Stringify with the query keys in sorted order like the Go package\n      params.set('variables', stringify(this.variables) ?? '');\n    }\n\n    if (this.features) {\n      params.set('features', stringify(this.features) ?? '');\n    }\n\n    if (this.fieldToggles) {\n      params.set('fieldToggles', stringify(this.fieldToggles) ?? '');\n    }\n\n    return `${this.url}?${params.toString()}`;\n  }\n}\n\n/**\n * Parses information from a Twitter API endpoint using an example request\n * URL against that endpoint. This can be used to extract GraphQL parameters\n * in order to easily reuse and/or override them later.\n * @param example An example of the endpoint to analyze.\n * @returns The parsed endpoint information.\n */\nfunction parseEndpointExample<\n  Endpoints,\n  Endpoint extends string & keyof Endpoints,\n>(example: Endpoint): ApiRequestInfo<Endpoints[Endpoint]> {\n  const { protocol, host, pathname, searchParams: query } = new URL(example);\n\n  const base = `${protocol}//${host}${pathname}`;\n  const variables = query.get('variables');\n  const features = query.get('features');\n  const fieldToggles = query.get('fieldToggles');\n\n  return new ApiRequest<Endpoints[Endpoint]>({\n    url: base,\n    variables: variables ? JSON.parse(variables) : undefined,\n    features: features ? JSON.parse(features) : undefined,\n    fieldToggles: fieldToggles ? JSON.parse(fieldToggles) : undefined,\n  } as Omit<ApiRequestInfo<Endpoints[Endpoint]>, 'toRequestUrl'>) as ApiRequestInfo<\n    Endpoints[Endpoint]\n  >;\n}\n\ntype ApiRequestFactory<Endpoints> = {\n  [Endpoint in keyof Endpoints as `create${string &\n    Endpoint}Request`]: () => ApiRequestInfo<Endpoints[Endpoint]>;\n};\n\nfunction createApiRequestFactory<Endpoints extends Record<string, string>>(\n  endpoints: Endpoints,\n): ApiRequestFactory<Endpoints> {\n  type UntypedApiRequestFactory = ApiRequestFactory<Record<string, string>>;\n\n  return Object.entries(endpoints)\n    .map<UntypedApiRequestFactory>(([endpointName, endpointExample]) => {\n      // Create a partial factory for only one endpoint\n      return {\n        [`create${endpointName}Request`]: () => {\n          // Create a new instance on each invocation so that we can safely\n          // mutate requests before sending them off\n          return parseEndpointExample<Endpoints, any>(endpointExample);\n        },\n      };\n    })\n    .reduce((agg, next) => {\n      // Merge all of our factories into one that includes every endpoint\n      return Object.assign(agg, next);\n    }) as ApiRequestFactory<Endpoints>;\n}\n\nexport const apiRequestFactory = createApiRequestFactory(endpoints);\n","import { QueryTweetsResponse } from './timeline-v1';\nimport { parseAndPush, TimelineEntryRaw } from './timeline-v2';\nimport { Tweet } from './tweets';\n\nexport interface ListTimeline {\n  data?: {\n    list?: {\n      tweets_timeline?: {\n        timeline?: {\n          instructions?: {\n            entries?: TimelineEntryRaw[];\n            entry?: TimelineEntryRaw;\n            type?: string;\n          }[];\n        };\n      };\n    };\n  };\n}\n\nexport function parseListTimelineTweets(\n  timeline: ListTimeline,\n): QueryTweetsResponse {\n  let bottomCursor: string | undefined;\n  let topCursor: string | undefined;\n  const tweets: Tweet[] = [];\n  const instructions =\n    timeline.data?.list?.tweets_timeline?.timeline?.instructions ?? [];\n  for (const instruction of instructions) {\n    const entries = instruction.entries ?? [];\n\n    for (const entry of entries) {\n      const entryContent = entry.content;\n      if (!entryContent) continue;\n\n      if (entryContent.cursorType === 'Bottom') {\n        bottomCursor = entryContent.value;\n        continue;\n      } else if (entryContent.cursorType === 'Top') {\n        topCursor = entryContent.value;\n        continue;\n      }\n\n      const idStr = entry.entryId;\n      if (\n        !idStr.startsWith('tweet') &&\n        !idStr.startsWith('list-conversation')\n      ) {\n        continue;\n      }\n\n      if (entryContent.itemContent) {\n        parseAndPush(tweets, entryContent.itemContent, idStr);\n      } else if (entryContent.items) {\n        for (const contentItem of entryContent.items) {\n          if (\n            contentItem.item &&\n            contentItem.item.itemContent &&\n            contentItem.entryId\n          ) {\n            parseAndPush(\n              tweets,\n              contentItem.item.itemContent,\n              contentItem.entryId.split('tweet-')[1],\n            );\n          }\n        }\n      }\n    }\n  }\n\n  return { tweets, next: bottomCursor, previous: topCursor };\n}\n","import { addApiFeatures, requestApi } from './api';\nimport { TwitterAuth } from './auth';\nimport { getUserIdByScreenName } from './profile';\nimport { QueryTweetsResponse } from './timeline-v1';\nimport {\n  parseTimelineTweetsV2,\n  TimelineV2,\n  TimelineEntryItemContentRaw,\n  parseTimelineEntryItemContentRaw,\n  ThreadedConversation,\n  parseThreadedConversation,\n} from './timeline-v2';\nimport { getTweetTimeline } from './timeline-async';\nimport { apiRequestFactory } from './api-data';\nimport { ListTimeline, parseListTimelineTweets } from './timeline-list';\nimport { updateCookieJar } from './requests';\nimport {\n  ApiV2Includes,\n  MediaObjectV2,\n  PlaceV2,\n  PollV2,\n  TTweetv2Expansion,\n  TTweetv2MediaField,\n  TTweetv2PlaceField,\n  TTweetv2PollField,\n  TTweetv2TweetField,\n  TTweetv2UserField,\n  TweetV2,\n  UserV2,\n} from 'twitter-api-v2';\n\nexport const defaultOptions = {\n  expansions: [\n    'attachments.poll_ids',\n    'attachments.media_keys',\n    'author_id',\n    'referenced_tweets.id',\n    'in_reply_to_user_id',\n    'edit_history_tweet_ids',\n    'geo.place_id',\n    'entities.mentions.username',\n    'referenced_tweets.id.author_id',\n  ] as TTweetv2Expansion[],\n  tweetFields: [\n    'attachments',\n    'author_id',\n    'context_annotations',\n    'conversation_id',\n    'created_at',\n    'entities',\n    'geo',\n    'id',\n    'in_reply_to_user_id',\n    'lang',\n    'public_metrics',\n    'edit_controls',\n    'possibly_sensitive',\n    'referenced_tweets',\n    'reply_settings',\n    'source',\n    'text',\n    'withheld',\n    'note_tweet',\n  ] as TTweetv2TweetField[],\n  pollFields: [\n    'duration_minutes',\n    'end_datetime',\n    'id',\n    'options',\n    'voting_status',\n  ] as TTweetv2PollField[],\n  mediaFields: [\n    'duration_ms',\n    'height',\n    'media_key',\n    'preview_image_url',\n    'type',\n    'url',\n    'width',\n    'public_metrics',\n    'alt_text',\n    'variants',\n  ] as TTweetv2MediaField[],\n  userFields: [\n    'created_at',\n    'description',\n    'entities',\n    'id',\n    'location',\n    'name',\n    'profile_image_url',\n    'protected',\n    'public_metrics',\n    'url',\n    'username',\n    'verified',\n    'withheld',\n  ] as TTweetv2UserField[],\n  placeFields: [\n    'contained_within',\n    'country',\n    'country_code',\n    'full_name',\n    'geo',\n    'id',\n    'name',\n    'place_type',\n  ] as TTweetv2PlaceField[],\n};\nexport interface Mention {\n  id: string;\n  username?: string;\n  name?: string;\n}\n\nexport interface Photo {\n  id: string;\n  url: string;\n  alt_text: string | undefined;\n}\n\nexport interface Video {\n  id: string;\n  preview: string;\n  url?: string;\n}\n\nexport interface PlaceRaw {\n  id?: string;\n  place_type?: string;\n  name?: string;\n  full_name?: string;\n  country_code?: string;\n  country?: string;\n  bounding_box?: {\n    type?: string;\n    coordinates?: number[][][];\n  };\n}\n\nexport interface PollData {\n  id?: string;\n  end_datetime?: string;\n  voting_status?: string;\n  duration_minutes: number;\n  options: PollOption[];\n}\n\nexport interface PollOption {\n  position?: number;\n  label: string;\n  votes?: number;\n}\n\n/**\n * A parsed Tweet object.\n */\nexport interface Tweet {\n  bookmarkCount?: number;\n  conversationId?: string;\n  hashtags: string[];\n  html?: string;\n  id?: string;\n  inReplyToStatus?: Tweet;\n  inReplyToStatusId?: string;\n  isQuoted?: boolean;\n  isPin?: boolean;\n  isReply?: boolean;\n  isRetweet?: boolean;\n  isSelfThread?: boolean;\n  likes?: number;\n  name?: string;\n  mentions: Mention[];\n  permanentUrl?: string;\n  photos: Photo[];\n  place?: PlaceRaw;\n  quotedStatus?: Tweet;\n  quotedStatusId?: string;\n  replies?: number;\n  retweets?: number;\n  retweetedStatus?: Tweet;\n  retweetedStatusId?: string;\n  text?: string;\n  thread: Tweet[];\n  timeParsed?: Date;\n  timestamp?: number;\n  urls: string[];\n  userId?: string;\n  username?: string;\n  videos: Video[];\n  views?: number;\n  sensitiveContent?: boolean;\n  poll?: PollV2 | null;\n}\n\nexport type TweetQuery =\n  | Partial<Tweet>\n  | ((tweet: Tweet) => boolean | Promise<boolean>);\n\nexport const features = addApiFeatures({\n  interactive_text_enabled: true,\n  longform_notetweets_inline_media_enabled: false,\n  responsive_web_text_conversations_enabled: false,\n  tweet_with_visibility_results_prefer_gql_limited_actions_policy_enabled:\n    false,\n  vibe_api_enabled: false,\n});\n\nexport async function fetchTweets(\n  userId: string,\n  maxTweets: number,\n  cursor: string | undefined,\n  auth: TwitterAuth,\n): Promise<QueryTweetsResponse> {\n  if (maxTweets > 200) {\n    maxTweets = 200;\n  }\n\n  const userTweetsRequest = apiRequestFactory.createUserTweetsRequest();\n  userTweetsRequest.variables.userId = userId;\n  userTweetsRequest.variables.count = maxTweets;\n  userTweetsRequest.variables.includePromotedContent = false; // true on the website\n\n  if (cursor != null && cursor != '') {\n    userTweetsRequest.variables['cursor'] = cursor;\n  }\n\n  const res = await requestApi<TimelineV2>(\n    userTweetsRequest.toRequestUrl(),\n    auth,\n  );\n\n  if (!res.success) {\n    throw res.err;\n  }\n\n  return parseTimelineTweetsV2(res.value);\n}\n\nexport async function fetchTweetsAndReplies(\n  userId: string,\n  maxTweets: number,\n  cursor: string | undefined,\n  auth: TwitterAuth,\n): Promise<QueryTweetsResponse> {\n  if (maxTweets > 40) {\n    maxTweets = 40;\n  }\n\n  const userTweetsRequest =\n    apiRequestFactory.createUserTweetsAndRepliesRequest();\n  userTweetsRequest.variables.userId = userId;\n  userTweetsRequest.variables.count = maxTweets;\n  userTweetsRequest.variables.includePromotedContent = false; // true on the website\n\n  if (cursor != null && cursor != '') {\n    userTweetsRequest.variables['cursor'] = cursor;\n  }\n\n  const res = await requestApi<TimelineV2>(\n    userTweetsRequest.toRequestUrl(),\n    auth,\n  );\n\n  if (!res.success) {\n    throw res.err;\n  }\n\n  return parseTimelineTweetsV2(res.value);\n}\n\nexport async function createCreateTweetRequestV2(\n  text: string,\n  auth: TwitterAuth,\n  tweetId?: string,\n  options?: {\n    poll?: PollData;\n  },\n) {\n  const v2client = auth.getV2Client();\n  if (v2client == null) {\n    throw new Error('V2 client is not initialized');\n  }\n  const { poll } = options || {};\n  let tweetConfig;\n  if (poll) {\n    tweetConfig = {\n      text,\n      poll: {\n        options: poll?.options.map((option) => option.label) ?? [],\n        duration_minutes: poll?.duration_minutes ?? 60,\n      },\n    };\n  } else if (tweetId) {\n    tweetConfig = {\n      text,\n      reply: {\n        in_reply_to_tweet_id: tweetId,\n      },\n    };\n  } else {\n    tweetConfig = {\n      text,\n    };\n  }\n  const tweetResponse = await v2client.v2.tweet(tweetConfig);\n  let optionsConfig = {};\n  if (options?.poll) {\n    optionsConfig = {\n      expansions: ['attachments.poll_ids'],\n      pollFields: [\n        'options',\n        'duration_minutes',\n        'end_datetime',\n        'voting_status',\n      ],\n    };\n  }\n  return await getTweetV2(tweetResponse.data.id, auth, optionsConfig);\n}\n\nexport function parseTweetV2ToV1(\n  tweetV2: TweetV2,\n  includes?: ApiV2Includes,\n  defaultTweetData?: Tweet | null,\n): Tweet {\n  let parsedTweet: Tweet;\n  if (defaultTweetData != null) {\n    parsedTweet = defaultTweetData;\n  }\n  parsedTweet = {\n    id: tweetV2.id,\n    text: tweetV2.text ?? defaultTweetData?.text ?? '',\n    hashtags:\n      tweetV2.entities?.hashtags?.map((tag) => tag.tag) ??\n      defaultTweetData?.hashtags ??\n      [],\n    mentions:\n      tweetV2.entities?.mentions?.map((mention) => ({\n        id: mention.id,\n        username: mention.username,\n      })) ??\n      defaultTweetData?.mentions ??\n      [],\n    urls:\n      tweetV2.entities?.urls?.map((url) => url.url) ??\n      defaultTweetData?.urls ??\n      [],\n    likes: tweetV2.public_metrics?.like_count ?? defaultTweetData?.likes ?? 0,\n    retweets:\n      tweetV2.public_metrics?.retweet_count ?? defaultTweetData?.retweets ?? 0,\n    replies:\n      tweetV2.public_metrics?.reply_count ?? defaultTweetData?.replies ?? 0,\n    views:\n      tweetV2.public_metrics?.impression_count ?? defaultTweetData?.views ?? 0,\n    userId: tweetV2.author_id ?? defaultTweetData?.userId,\n    conversationId: tweetV2.conversation_id ?? defaultTweetData?.conversationId,\n    photos: defaultTweetData?.photos ?? [],\n    videos: defaultTweetData?.videos ?? [],\n    poll: defaultTweetData?.poll ?? null,\n    username: defaultTweetData?.username ?? '',\n    name: defaultTweetData?.name ?? '',\n    place: defaultTweetData?.place,\n    thread: defaultTweetData?.thread ?? [],\n  };\n\n  // Process Polls\n  if (includes?.polls?.length) {\n    const poll = includes.polls[0];\n    parsedTweet.poll = {\n      id: poll.id,\n      end_datetime: poll.end_datetime\n        ? poll.end_datetime\n        : defaultTweetData?.poll?.end_datetime\n        ? defaultTweetData?.poll?.end_datetime\n        : undefined,\n      options: poll.options.map((option) => ({\n        position: option.position,\n        label: option.label,\n        votes: option.votes,\n      })),\n      voting_status:\n        poll.voting_status ?? defaultTweetData?.poll?.voting_status,\n    };\n  }\n\n  // Process Media (photos and videos)\n  if (includes?.media?.length) {\n    includes.media.forEach((media: MediaObjectV2) => {\n      if (media.type === 'photo') {\n        parsedTweet.photos.push({\n          id: media.media_key,\n          url: media.url ?? '',\n          alt_text: media.alt_text ?? '',\n        });\n      } else if (media.type === 'video' || media.type === 'animated_gif') {\n        parsedTweet.videos.push({\n          id: media.media_key,\n          preview: media.preview_image_url ?? '',\n          url:\n            media.variants?.find(\n              (variant) => variant.content_type === 'video/mp4',\n            )?.url ?? '',\n        });\n      }\n    });\n  }\n\n  // Process User (for author info)\n  if (includes?.users?.length) {\n    const user = includes.users.find(\n      (user: UserV2) => user.id === tweetV2.author_id,\n    );\n    if (user) {\n      parsedTweet.username = user.username ?? defaultTweetData?.username ?? '';\n      parsedTweet.name = user.name ?? defaultTweetData?.name ?? '';\n    }\n  }\n\n  // Process Place (if any)\n  if (tweetV2?.geo?.place_id && includes?.places?.length) {\n    const place = includes.places.find(\n      (place: PlaceV2) => place.id === tweetV2?.geo?.place_id,\n    );\n    if (place) {\n      parsedTweet.place = {\n        id: place.id,\n        full_name: place.full_name ?? defaultTweetData?.place?.full_name ?? '',\n        country: place.country ?? defaultTweetData?.place?.country ?? '',\n        country_code:\n          place.country_code ?? defaultTweetData?.place?.country_code ?? '',\n        name: place.name ?? defaultTweetData?.place?.name ?? '',\n        place_type: place.place_type ?? defaultTweetData?.place?.place_type,\n      };\n    }\n  }\n\n  // TODO: Process Thread (referenced tweets) and remove reference to v1\n  return parsedTweet;\n}\n\nexport async function createCreateTweetRequest(\n  text: string,\n  auth: TwitterAuth,\n  tweetId?: string,\n  mediaData?: { data: Buffer; mediaType: string }[],\n) {\n  const onboardingTaskUrl = 'https://api.twitter.com/1.1/onboarding/task.json';\n\n  const cookies = await auth.cookieJar().getCookies(onboardingTaskUrl);\n  const xCsrfToken = cookies.find((cookie) => cookie.key === 'ct0');\n\n  //@ ts-expect-error - This is a private API.\n  const headers = new Headers({\n    authorization: `Bearer ${(auth as any).bearerToken}`,\n    cookie: await auth.cookieJar().getCookieString(onboardingTaskUrl),\n    'content-type': 'application/json',\n    'User-Agent':\n      'Mozilla/5.0 (Linux; Android 11; Nokia G20) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.88 Mobile Safari/537.36',\n    'x-guest-token': (auth as any).guestToken,\n    'x-twitter-auth-type': 'OAuth2Client',\n    'x-twitter-active-user': 'yes',\n    'x-twitter-client-language': 'en',\n    'x-csrf-token': xCsrfToken?.value as string,\n  });\n\n  const variables: Record<string, any> = {\n    tweet_text: text,\n    dark_request: false,\n    media: {\n      media_entities: [],\n      possibly_sensitive: false,\n    },\n    semantic_annotation_ids: [],\n  };\n\n  if (mediaData && mediaData.length > 0) {\n    const mediaIds = await Promise.all(\n      mediaData.map(({ data, mediaType }) =>\n        uploadMedia(data, auth, mediaType),\n      ),\n    );\n\n    variables.media.media_entities = mediaIds.map((id) => ({\n      media_id: id,\n      tagged_users: [],\n    }));\n  }\n\n  if (tweetId) {\n    variables.reply = { in_reply_to_tweet_id: tweetId };\n  }\n\n  const response = await fetch(\n    'https://twitter.com/i/api/graphql/a1p9RWpkYKBjWv_I3WzS-A/CreateTweet',\n    {\n      headers,\n      body: JSON.stringify({\n        variables,\n        features: {\n          interactive_text_enabled: true,\n          longform_notetweets_inline_media_enabled: false,\n          responsive_web_text_conversations_enabled: false,\n          tweet_with_visibility_results_prefer_gql_limited_actions_policy_enabled:\n            false,\n          vibe_api_enabled: false,\n          rweb_lists_timeline_redesign_enabled: true,\n          responsive_web_graphql_exclude_directive_enabled: true,\n          verified_phone_label_enabled: false,\n          creator_subscriptions_tweet_preview_api_enabled: true,\n          responsive_web_graphql_timeline_navigation_enabled: true,\n          responsive_web_graphql_skip_user_profile_image_extensions_enabled:\n            false,\n          tweetypie_unmention_optimization_enabled: true,\n          responsive_web_edit_tweet_api_enabled: true,\n          graphql_is_translatable_rweb_tweet_is_translatable_enabled: true,\n          view_counts_everywhere_api_enabled: true,\n          longform_notetweets_consumption_enabled: true,\n          tweet_awards_web_tipping_enabled: false,\n          freedom_of_speech_not_reach_fetch_enabled: true,\n          standardized_nudges_misinfo: true,\n          longform_notetweets_rich_text_read_enabled: true,\n          responsive_web_enhance_cards_enabled: false,\n          subscriptions_verification_info_enabled: true,\n          subscriptions_verification_info_reason_enabled: true,\n          subscriptions_verification_info_verified_since_enabled: true,\n          super_follow_badge_privacy_enabled: false,\n          super_follow_exclusive_tweet_notifications_enabled: false,\n          super_follow_tweet_api_enabled: false,\n          super_follow_user_api_enabled: false,\n          android_graphql_skip_api_media_color_palette: false,\n          creator_subscriptions_subscription_count_enabled: false,\n          blue_business_profile_image_shape_enabled: false,\n          unified_cards_ad_metadata_container_dynamic_card_content_query_enabled:\n            false,\n          rweb_video_timestamps_enabled: false,\n          c9s_tweet_anatomy_moderator_badge_enabled: false,\n          responsive_web_twitter_article_tweet_consumption_enabled: false,\n        },\n        fieldToggles: {},\n      }),\n      method: 'POST',\n    },\n  );\n\n  await updateCookieJar(auth.cookieJar(), response.headers);\n\n  // check for errors\n  if (!response.ok) {\n    throw new Error(await response.text());\n  }\n\n  return response;\n}\n\nexport async function createCreateNoteTweetRequest(\n  text: string,\n  auth: TwitterAuth,\n  tweetId?: string,\n  mediaData?: { data: Buffer; mediaType: string }[],\n) {\n  const onboardingTaskUrl = 'https://api.twitter.com/1.1/onboarding/task.json';\n\n  const cookies = await auth.cookieJar().getCookies(onboardingTaskUrl);\n  const xCsrfToken = cookies.find((cookie) => cookie.key === 'ct0');\n\n  const headers = new Headers({\n    authorization: `Bearer ${(auth as any).bearerToken}`,\n    cookie: await auth.cookieJar().getCookieString(onboardingTaskUrl),\n    'content-type': 'application/json',\n    'User-Agent':\n      'Mozilla/5.0 (Linux; Android 11; Nokia G20) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.88 Mobile Safari/537.36',\n    'x-guest-token': (auth as any).guestToken,\n    'x-twitter-auth-type': 'OAuth2Client',\n    'x-twitter-active-user': 'yes',\n    'x-twitter-client-language': 'en',\n    'x-csrf-token': xCsrfToken?.value as string,\n  });\n\n  const variables: Record<string, any> = {\n    tweet_text: text,\n    dark_request: false,\n    media: {\n      media_entities: [],\n      possibly_sensitive: false,\n    },\n    semantic_annotation_ids: [],\n  };\n\n  if (mediaData && mediaData.length > 0) {\n    const mediaIds = await Promise.all(\n      mediaData.map(({ data, mediaType }) =>\n        uploadMedia(data, auth, mediaType),\n      ),\n    );\n\n    variables.media.media_entities = mediaIds.map((id) => ({\n      media_id: id,\n      tagged_users: [],\n    }));\n  }\n\n  if (tweetId) {\n    variables.reply = { in_reply_to_tweet_id: tweetId };\n  }\n\n  const response = await fetch(\n    'https://twitter.com/i/api/graphql/0aWhJJmFlxkxv9TAUJPanA/CreateNoteTweet',\n    {\n      headers,\n      body: JSON.stringify({\n        variables,\n        features: {\n          interactive_text_enabled: true,\n          longform_notetweets_inline_media_enabled: false,\n          responsive_web_text_conversations_enabled: false,\n          tweet_with_visibility_results_prefer_gql_limited_actions_policy_enabled:\n            false,\n          vibe_api_enabled: false,\n          rweb_lists_timeline_redesign_enabled: true,\n          responsive_web_graphql_exclude_directive_enabled: true,\n          verified_phone_label_enabled: false,\n          creator_subscriptions_tweet_preview_api_enabled: true,\n          responsive_web_graphql_timeline_navigation_enabled: true,\n          responsive_web_graphql_skip_user_profile_image_extensions_enabled:\n            false,\n          tweetypie_unmention_optimization_enabled: true,\n          responsive_web_edit_tweet_api_enabled: true,\n          graphql_is_translatable_rweb_tweet_is_translatable_enabled: true,\n          view_counts_everywhere_api_enabled: true,\n          longform_notetweets_consumption_enabled: true,\n          longform_notetweets_creation_enabled: true,\n          tweet_awards_web_tipping_enabled: false,\n          freedom_of_speech_not_reach_fetch_enabled: true,\n          standardized_nudges_misinfo: true,\n          longform_notetweets_rich_text_read_enabled: true,\n          responsive_web_enhance_cards_enabled: false,\n          subscriptions_verification_info_enabled: true,\n          subscriptions_verification_info_reason_enabled: true,\n          subscriptions_verification_info_verified_since_enabled: true,\n          super_follow_badge_privacy_enabled: false,\n          super_follow_exclusive_tweet_notifications_enabled: false,\n          super_follow_tweet_api_enabled: false,\n          super_follow_user_api_enabled: false,\n          android_graphql_skip_api_media_color_palette: false,\n          creator_subscriptions_subscription_count_enabled: false,\n          blue_business_profile_image_shape_enabled: false,\n          unified_cards_ad_metadata_container_dynamic_card_content_query_enabled:\n            false,\n          rweb_video_timestamps_enabled: false,\n          c9s_tweet_anatomy_moderator_badge_enabled: false,\n          responsive_web_twitter_article_tweet_consumption_enabled: false,\n\n          communities_web_enable_tweet_community_results_fetch: false,\n          articles_preview_enabled: false,\n          rweb_tipjar_consumption_enabled: false,\n          creator_subscriptions_quote_tweet_preview_enabled: false,\n        },\n        fieldToggles: {},\n      }),\n      method: 'POST',\n    },\n  );\n\n  await updateCookieJar(auth.cookieJar(), response.headers);\n\n  // Check for errors and log the error response\n  if (!response.ok) {\n    const errorText = await response.text();\n    console.error('Error response:', errorText);\n    throw new Error(`Failed to create long tweet: ${errorText}`);\n  }\n\n  // Parse and return the response\n  const data = await response.json();\n  return data;\n}\n\nexport async function fetchListTweets(\n  listId: string,\n  maxTweets: number,\n  cursor: string | undefined,\n  auth: TwitterAuth,\n): Promise<QueryTweetsResponse> {\n  if (maxTweets > 200) {\n    maxTweets = 200;\n  }\n\n  const listTweetsRequest = apiRequestFactory.createListTweetsRequest();\n  listTweetsRequest.variables.listId = listId;\n  listTweetsRequest.variables.count = maxTweets;\n\n  if (cursor != null && cursor != '') {\n    listTweetsRequest.variables['cursor'] = cursor;\n  }\n\n  const res = await requestApi<ListTimeline>(\n    listTweetsRequest.toRequestUrl(),\n    auth,\n  );\n\n  if (!res.success) {\n    throw res.err;\n  }\n\n  return parseListTimelineTweets(res.value);\n}\n\nexport function getTweets(\n  user: string,\n  maxTweets: number,\n  auth: TwitterAuth,\n): AsyncGenerator<Tweet, void> {\n  return getTweetTimeline(user, maxTweets, async (q, mt, c) => {\n    const userIdRes = await getUserIdByScreenName(q, auth);\n\n    if (!userIdRes.success) {\n      throw userIdRes.err;\n    }\n\n    const { value: userId } = userIdRes;\n\n    return fetchTweets(userId, mt, c, auth);\n  });\n}\n\nexport function getTweetsByUserId(\n  userId: string,\n  maxTweets: number,\n  auth: TwitterAuth,\n): AsyncGenerator<Tweet, void> {\n  return getTweetTimeline(userId, maxTweets, (q, mt, c) => {\n    return fetchTweets(q, mt, c, auth);\n  });\n}\n\nexport function getTweetsAndReplies(\n  user: string,\n  maxTweets: number,\n  auth: TwitterAuth,\n): AsyncGenerator<Tweet, void> {\n  return getTweetTimeline(user, maxTweets, async (q, mt, c) => {\n    const userIdRes = await getUserIdByScreenName(q, auth);\n\n    if (!userIdRes.success) {\n      throw userIdRes.err;\n    }\n\n    const { value: userId } = userIdRes;\n\n    return fetchTweetsAndReplies(userId, mt, c, auth);\n  });\n}\n\nexport function getTweetsAndRepliesByUserId(\n  userId: string,\n  maxTweets: number,\n  auth: TwitterAuth,\n): AsyncGenerator<Tweet, void> {\n  return getTweetTimeline(userId, maxTweets, (q, mt, c) => {\n    return fetchTweetsAndReplies(q, mt, c, auth);\n  });\n}\n\nexport async function fetchLikedTweets(\n  userId: string,\n  maxTweets: number,\n  cursor: string | undefined,\n  auth: TwitterAuth,\n): Promise<QueryTweetsResponse> {\n  if (!auth.isLoggedIn()) {\n    throw new Error('Scraper is not logged-in for fetching liked tweets.');\n  }\n\n  if (maxTweets > 200) {\n    maxTweets = 200;\n  }\n\n  const userTweetsRequest = apiRequestFactory.createUserLikedTweetsRequest();\n  userTweetsRequest.variables.userId = userId;\n  userTweetsRequest.variables.count = maxTweets;\n  userTweetsRequest.variables.includePromotedContent = false; // true on the website\n\n  if (cursor != null && cursor != '') {\n    userTweetsRequest.variables['cursor'] = cursor;\n  }\n\n  const res = await requestApi<TimelineV2>(\n    userTweetsRequest.toRequestUrl(),\n    auth,\n  );\n\n  if (!res.success) {\n    throw res.err;\n  }\n\n  return parseTimelineTweetsV2(res.value);\n}\n\nexport async function getTweetWhere(\n  tweets: AsyncIterable<Tweet>,\n  query: TweetQuery,\n): Promise<Tweet | null> {\n  const isCallback = typeof query === 'function';\n\n  for await (const tweet of tweets) {\n    const matches = isCallback\n      ? await query(tweet)\n      : checkTweetMatches(tweet, query);\n\n    if (matches) {\n      return tweet;\n    }\n  }\n\n  return null;\n}\n\nexport async function getTweetsWhere(\n  tweets: AsyncIterable<Tweet>,\n  query: TweetQuery,\n): Promise<Tweet[]> {\n  const isCallback = typeof query === 'function';\n  const filtered = [];\n\n  for await (const tweet of tweets) {\n    const matches = isCallback ? query(tweet) : checkTweetMatches(tweet, query);\n\n    if (!matches) continue;\n    filtered.push(tweet);\n  }\n\n  return filtered;\n}\n\nfunction checkTweetMatches(tweet: Tweet, options: Partial<Tweet>): boolean {\n  return Object.keys(options).every((k) => {\n    const key = k as keyof Tweet;\n    return tweet[key] === options[key];\n  });\n}\n\nexport async function getLatestTweet(\n  user: string,\n  includeRetweets: boolean,\n  max: number,\n  auth: TwitterAuth,\n): Promise<Tweet | null | void> {\n  const timeline = getTweets(user, max, auth);\n\n  // No point looping if max is 1, just use first entry.\n  return max === 1\n    ? (await timeline.next()).value\n    : await getTweetWhere(timeline, { isRetweet: includeRetweets });\n}\n\nexport interface TweetResultByRestId {\n  data?: TimelineEntryItemContentRaw;\n}\n\nexport async function getTweet(\n  id: string,\n  auth: TwitterAuth,\n): Promise<Tweet | null> {\n  const tweetDetailRequest = apiRequestFactory.createTweetDetailRequest();\n  tweetDetailRequest.variables.focalTweetId = id;\n\n  const res = await requestApi<ThreadedConversation>(\n    tweetDetailRequest.toRequestUrl(),\n    auth,\n  );\n\n  if (!res.success) {\n    throw res.err;\n  }\n\n  if (!res.value) {\n    return null;\n  }\n\n  const tweets = parseThreadedConversation(res.value);\n  return tweets.find((tweet) => tweet.id === id) ?? null;\n}\n\nexport async function getTweetV2(\n  id: string,\n  auth: TwitterAuth,\n  options: {\n    expansions?: TTweetv2Expansion[];\n    tweetFields?: TTweetv2TweetField[];\n    pollFields?: TTweetv2PollField[];\n    mediaFields?: TTweetv2MediaField[];\n    userFields?: TTweetv2UserField[];\n    placeFields?: TTweetv2PlaceField[];\n  } = defaultOptions,\n): Promise<Tweet | null> {\n  const v2client = auth.getV2Client();\n  if (!v2client) {\n    throw new Error('V2 client is not initialized');\n  }\n\n  try {\n    const tweetData = await v2client.v2.singleTweet(id, {\n      expansions: options?.expansions,\n      'tweet.fields': options?.tweetFields,\n      'poll.fields': options?.pollFields,\n      'media.fields': options?.mediaFields,\n      'user.fields': options?.userFields,\n      'place.fields': options?.placeFields,\n    });\n\n    if (!tweetData?.data) {\n      console.warn(`Tweet data not found for ID: ${id}`);\n      return null;\n    }\n\n    const defaultTweetData = await getTweet(tweetData.data.id, auth);\n    // Extract primary tweet data\n    const parsedTweet = parseTweetV2ToV1(\n      tweetData.data,\n      tweetData?.includes,\n      defaultTweetData,\n    );\n\n    return parsedTweet;\n  } catch (error) {\n    console.error(`Error fetching tweet ${id}:`, error);\n    return null;\n  }\n}\n\nexport async function getTweetsV2(\n  ids: string[],\n  auth: TwitterAuth,\n  options: {\n    expansions?: TTweetv2Expansion[];\n    tweetFields?: TTweetv2TweetField[];\n    pollFields?: TTweetv2PollField[];\n    mediaFields?: TTweetv2MediaField[];\n    userFields?: TTweetv2UserField[];\n    placeFields?: TTweetv2PlaceField[];\n  } = defaultOptions,\n): Promise<Tweet[]> {\n  const v2client = auth.getV2Client();\n  if (!v2client) {\n    return [];\n  }\n\n  try {\n    const tweetData = await v2client.v2.tweets(ids, {\n      expansions: options?.expansions,\n      'tweet.fields': options?.tweetFields,\n      'poll.fields': options?.pollFields,\n      'media.fields': options?.mediaFields,\n      'user.fields': options?.userFields,\n      'place.fields': options?.placeFields,\n    });\n    const tweetsV2 = tweetData.data;\n    if (tweetsV2.length === 0) {\n      console.warn(`No tweet data found for IDs: ${ids.join(', ')}`);\n      return [];\n    }\n    return (\n      await Promise.all(\n        tweetsV2.map(\n          async (tweet) => await getTweetV2(tweet.id, auth, options),\n        ),\n      )\n    ).filter((tweet): tweet is Tweet => tweet !== null);\n  } catch (error) {\n    console.error(`Error fetching tweets for IDs: ${ids.join(', ')}`, error);\n    return [];\n  }\n}\n\nexport async function getTweetAnonymous(\n  id: string,\n  auth: TwitterAuth,\n): Promise<Tweet | null> {\n  const tweetResultByRestIdRequest =\n    apiRequestFactory.createTweetResultByRestIdRequest();\n  tweetResultByRestIdRequest.variables.tweetId = id;\n\n  const res = await requestApi<TweetResultByRestId>(\n    tweetResultByRestIdRequest.toRequestUrl(),\n    auth,\n  );\n\n  if (!res.success) {\n    throw res.err;\n  }\n\n  if (!res.value.data) {\n    return null;\n  }\n\n  return parseTimelineEntryItemContentRaw(res.value.data, id);\n}\n\ninterface MediaUploadResponse {\n  media_id_string: string;\n  size: number;\n  expires_after_secs: number;\n  image: {\n    image_type: string;\n    w: number;\n    h: number;\n  };\n}\n\nasync function uploadMedia(\n  mediaData: Buffer,\n  auth: TwitterAuth,\n  mediaType: string,\n): Promise<string> {\n  const uploadUrl = 'https://upload.twitter.com/1.1/media/upload.json';\n\n  // Get authentication headers\n  const cookies = await auth.cookieJar().getCookies(uploadUrl);\n  const xCsrfToken = cookies.find((cookie) => cookie.key === 'ct0');\n  const headers = new Headers({\n    authorization: `Bearer ${(auth as any).bearerToken}`,\n    cookie: await auth.cookieJar().getCookieString(uploadUrl),\n    'x-csrf-token': xCsrfToken?.value as string,\n  });\n\n  // Detect if media is a video based on mediaType\n  const isVideo = mediaType.startsWith('video/');\n\n  if (isVideo) {\n    // Handle video upload using chunked media upload\n    const mediaId = await uploadVideoInChunks(mediaData, mediaType);\n    return mediaId;\n  } else {\n    // Handle image upload\n    const form = new FormData();\n    form.append('media', new Blob([mediaData]));\n\n    const response = await fetch(uploadUrl, {\n      method: 'POST',\n      headers,\n      body: form,\n    });\n\n    await updateCookieJar(auth.cookieJar(), response.headers);\n\n    if (!response.ok) {\n      throw new Error(await response.text());\n    }\n\n    const data: MediaUploadResponse = await response.json();\n    return data.media_id_string;\n  }\n\n  // Function to upload video in chunks\n  async function uploadVideoInChunks(\n    mediaData: Buffer,\n    mediaType: string,\n  ): Promise<string> {\n    // Initialize upload\n    const initParams = new URLSearchParams();\n    initParams.append('command', 'INIT');\n    initParams.append('media_type', mediaType);\n    initParams.append('total_bytes', mediaData.length.toString());\n\n    const initResponse = await fetch(uploadUrl, {\n      method: 'POST',\n      headers,\n      body: initParams,\n    });\n\n    if (!initResponse.ok) {\n      throw new Error(await initResponse.text());\n    }\n\n    const initData = await initResponse.json();\n    const mediaId = initData.media_id_string;\n\n    // Append upload in chunks\n    const segmentSize = 5 * 1024 * 1024; // 5 MB per chunk\n    let segmentIndex = 0;\n    for (let offset = 0; offset < mediaData.length; offset += segmentSize) {\n      const chunk = mediaData.slice(offset, offset + segmentSize);\n\n      const appendForm = new FormData();\n      appendForm.append('command', 'APPEND');\n      appendForm.append('media_id', mediaId);\n      appendForm.append('segment_index', segmentIndex.toString());\n      appendForm.append('media', new Blob([chunk]));\n\n      const appendResponse = await fetch(uploadUrl, {\n        method: 'POST',\n        headers,\n        body: appendForm,\n      });\n\n      if (!appendResponse.ok) {\n        throw new Error(await appendResponse.text());\n      }\n\n      segmentIndex++;\n    }\n\n    // Finalize upload\n    const finalizeParams = new URLSearchParams();\n    finalizeParams.append('command', 'FINALIZE');\n    finalizeParams.append('media_id', mediaId);\n\n    const finalizeResponse = await fetch(uploadUrl, {\n      method: 'POST',\n      headers,\n      body: finalizeParams,\n    });\n\n    if (!finalizeResponse.ok) {\n      throw new Error(await finalizeResponse.text());\n    }\n\n    const finalizeData = await finalizeResponse.json();\n\n    // Check processing status for videos\n    if (finalizeData.processing_info) {\n      await checkUploadStatus(mediaId);\n    }\n\n    return mediaId;\n  }\n\n  // Function to check upload status\n  async function checkUploadStatus(mediaId: string): Promise<void> {\n    let processing = true;\n    while (processing) {\n      await new Promise((resolve) => setTimeout(resolve, 5000)); // Wait 5 seconds\n\n      const statusParams = new URLSearchParams();\n      statusParams.append('command', 'STATUS');\n      statusParams.append('media_id', mediaId);\n\n      const statusResponse = await fetch(\n        `${uploadUrl}?${statusParams.toString()}`,\n        {\n          method: 'GET',\n          headers,\n        },\n      );\n\n      if (!statusResponse.ok) {\n        throw new Error(await statusResponse.text());\n      }\n\n      const statusData = await statusResponse.json();\n      const state = statusData.processing_info.state;\n\n      if (state === 'succeeded') {\n        processing = false;\n      } else if (state === 'failed') {\n        throw new Error('Video processing failed');\n      }\n    }\n  }\n}\n\n// Function to create a quote tweet\nexport async function createQuoteTweetRequest(\n  text: string,\n  quotedTweetId: string,\n  auth: TwitterAuth,\n  mediaData?: { data: Buffer; mediaType: string }[],\n) {\n  const onboardingTaskUrl = 'https://api.twitter.com/1.1/onboarding/task.json';\n\n  // Retrieve necessary cookies and tokens\n  const cookies = await auth.cookieJar().getCookies(onboardingTaskUrl);\n  const xCsrfToken = cookies.find((cookie) => cookie.key === 'ct0');\n\n  const headers = new Headers({\n    authorization: `Bearer ${(auth as any).bearerToken}`,\n    cookie: await auth.cookieJar().getCookieString(onboardingTaskUrl),\n    'content-type': 'application/json',\n    'User-Agent':\n      'Mozilla/5.0 (Linux; Android 11; Nokia G20) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.88 Mobile Safari/537.36',\n    'x-guest-token': (auth as any).guestToken,\n    'x-twitter-auth-type': 'OAuth2Client',\n    'x-twitter-active-user': 'yes',\n    'x-csrf-token': xCsrfToken?.value as string,\n  });\n\n  // Construct variables for the GraphQL request\n  const variables: Record<string, any> = {\n    tweet_text: text,\n    dark_request: false,\n    attachment_url: `https://twitter.com/twitter/status/${quotedTweetId}`,\n    media: {\n      media_entities: [],\n      possibly_sensitive: false,\n    },\n    semantic_annotation_ids: [],\n  };\n\n  // Handle media uploads if any media data is provided\n  if (mediaData && mediaData.length > 0) {\n    const mediaIds = await Promise.all(\n      mediaData.map(({ data, mediaType }) =>\n        uploadMedia(data, auth, mediaType),\n      ),\n    );\n\n    variables.media.media_entities = mediaIds.map((id) => ({\n      media_id: id,\n      tagged_users: [],\n    }));\n  }\n\n  // Send the GraphQL request to create a quote tweet\n  const response = await fetch(\n    'https://twitter.com/i/api/graphql/a1p9RWpkYKBjWv_I3WzS-A/CreateTweet',\n    {\n      headers,\n      body: JSON.stringify({\n        variables,\n        features: {\n          interactive_text_enabled: true,\n          longform_notetweets_inline_media_enabled: false,\n          responsive_web_text_conversations_enabled: false,\n          tweet_with_visibility_results_prefer_gql_limited_actions_policy_enabled:\n            false,\n          vibe_api_enabled: false,\n          rweb_lists_timeline_redesign_enabled: true,\n          responsive_web_graphql_exclude_directive_enabled: true,\n          verified_phone_label_enabled: false,\n          creator_subscriptions_tweet_preview_api_enabled: true,\n          responsive_web_graphql_timeline_navigation_enabled: true,\n          responsive_web_graphql_skip_user_profile_image_extensions_enabled:\n            false,\n          tweetypie_unmention_optimization_enabled: true,\n          responsive_web_edit_tweet_api_enabled: true,\n          graphql_is_translatable_rweb_tweet_is_translatable_enabled: true,\n          view_counts_everywhere_api_enabled: true,\n          longform_notetweets_consumption_enabled: true,\n          tweet_awards_web_tipping_enabled: false,\n          freedom_of_speech_not_reach_fetch_enabled: true,\n          standardized_nudges_misinfo: true,\n          longform_notetweets_rich_text_read_enabled: true,\n          responsive_web_enhance_cards_enabled: false,\n          subscriptions_verification_info_enabled: true,\n          subscriptions_verification_info_reason_enabled: true,\n          subscriptions_verification_info_verified_since_enabled: true,\n          super_follow_badge_privacy_enabled: false,\n          super_follow_exclusive_tweet_notifications_enabled: false,\n          super_follow_tweet_api_enabled: false,\n          super_follow_user_api_enabled: false,\n          android_graphql_skip_api_media_color_palette: false,\n          creator_subscriptions_subscription_count_enabled: false,\n          blue_business_profile_image_shape_enabled: false,\n          unified_cards_ad_metadata_container_dynamic_card_content_query_enabled:\n            false,\n          rweb_video_timestamps_enabled: true,\n          c9s_tweet_anatomy_moderator_badge_enabled: true,\n          responsive_web_twitter_article_tweet_consumption_enabled: false,\n        },\n        fieldToggles: {},\n      }),\n      method: 'POST',\n    },\n  );\n\n  // Update the cookie jar with any new cookies from the response\n  await updateCookieJar(auth.cookieJar(), response.headers);\n\n  // Check for errors in the response\n  if (!response.ok) {\n    throw new Error(await response.text());\n  }\n\n  return response;\n}\n\n/**\n * Likes a tweet with the given tweet ID.\n * @param tweetId The ID of the tweet to like.\n * @param auth The authentication object.\n * @returns A promise that resolves when the tweet is liked.\n */\nexport async function likeTweet(\n  tweetId: string,\n  auth: TwitterAuth,\n): Promise<void> {\n  // Prepare the GraphQL endpoint and payload\n  const likeTweetUrl =\n    'https://twitter.com/i/api/graphql/lI07N6Otwv1PhnEgXILM7A/FavoriteTweet';\n\n  // Retrieve necessary cookies and tokens\n  const cookies = await auth.cookieJar().getCookies(likeTweetUrl);\n  const xCsrfToken = cookies.find((cookie) => cookie.key === 'ct0');\n\n  const headers = new Headers({\n    authorization: `Bearer ${(auth as any).bearerToken}`,\n    cookie: await auth.cookieJar().getCookieString(likeTweetUrl),\n    'content-type': 'application/json',\n    'x-guest-token': (auth as any).guestToken,\n    'x-twitter-auth-type': 'OAuth2Client',\n    'x-twitter-active-user': 'yes',\n    'x-csrf-token': xCsrfToken?.value as string,\n  });\n\n  const payload = {\n    variables: {\n      tweet_id: tweetId,\n    },\n  };\n\n  // Send the POST request to like the tweet\n  const response = await fetch(likeTweetUrl, {\n    method: 'POST',\n    headers,\n    body: JSON.stringify(payload),\n  });\n\n  // Update the cookie jar with any new cookies from the response\n  await updateCookieJar(auth.cookieJar(), response.headers);\n\n  // Check for errors in the response\n  if (!response.ok) {\n    throw new Error(await response.text());\n  }\n}\n\n/**\n * Retweets a tweet with the given tweet ID.\n * @param tweetId The ID of the tweet to retweet.\n * @param auth The authentication object.\n * @returns A promise that resolves when the tweet is retweeted.\n */\nexport async function retweet(\n  tweetId: string,\n  auth: TwitterAuth,\n): Promise<void> {\n  // Prepare the GraphQL endpoint and payload\n  const retweetUrl =\n    'https://twitter.com/i/api/graphql/ojPdsZsimiJrUGLR1sjUtA/CreateRetweet';\n\n  // Retrieve necessary cookies and tokens\n  const cookies = await auth.cookieJar().getCookies(retweetUrl);\n  const xCsrfToken = cookies.find((cookie) => cookie.key === 'ct0');\n\n  const headers = new Headers({\n    authorization: `Bearer ${(auth as any).bearerToken}`,\n    cookie: await auth.cookieJar().getCookieString(retweetUrl),\n    'content-type': 'application/json',\n    'x-guest-token': (auth as any).guestToken,\n    'x-twitter-auth-type': 'OAuth2Client',\n    'x-twitter-active-user': 'yes',\n    'x-csrf-token': xCsrfToken?.value as string,\n  });\n\n  const payload = {\n    variables: {\n      tweet_id: tweetId,\n      dark_request: false,\n    },\n  };\n\n  // Send the POST request to retweet the tweet\n  const response = await fetch(retweetUrl, {\n    method: 'POST',\n    headers,\n    body: JSON.stringify(payload),\n  });\n\n  // Update the cookie jar with any new cookies from the response\n  await updateCookieJar(auth.cookieJar(), response.headers);\n\n  // Check for errors in the response\n  if (!response.ok) {\n    throw new Error(await response.text());\n  }\n}\n\nexport async function createCreateLongTweetRequest(\n  text: string,\n  auth: TwitterAuth,\n  tweetId?: string,\n  mediaData?: { data: Buffer; mediaType: string }[],\n) {\n  // URL for the long tweet endpoint\n  const url =\n    'https://x.com/i/api/graphql/YNXM2DGuE2Sff6a2JD3Ztw/CreateNoteTweet';\n  const onboardingTaskUrl = 'https://api.twitter.com/1.1/onboarding/task.json';\n\n  const cookies = await auth.cookieJar().getCookies(onboardingTaskUrl);\n  const xCsrfToken = cookies.find((cookie) => cookie.key === 'ct0');\n\n  //@ ts-expect-error - This is a private API.\n  const headers = new Headers({\n    authorization: `Bearer ${(auth as any).bearerToken}`,\n    cookie: await auth.cookieJar().getCookieString(onboardingTaskUrl),\n    'content-type': 'application/json',\n    'User-Agent':\n      'Mozilla/5.0 (Linux; Android 11; Nokia G20) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.88 Mobile Safari/537.36',\n    'x-guest-token': (auth as any).guestToken,\n    'x-twitter-auth-type': 'OAuth2Client',\n    'x-twitter-active-user': 'yes',\n    'x-twitter-client-language': 'en',\n    'x-csrf-token': xCsrfToken?.value as string,\n  });\n\n  const variables: Record<string, any> = {\n    tweet_text: text,\n    dark_request: false,\n    media: {\n      media_entities: [],\n      possibly_sensitive: false,\n    },\n    semantic_annotation_ids: [],\n  };\n\n  if (mediaData && mediaData.length > 0) {\n    const mediaIds = await Promise.all(\n      mediaData.map(({ data, mediaType }) =>\n        uploadMedia(data, auth, mediaType),\n      ),\n    );\n\n    variables.media.media_entities = mediaIds.map((id) => ({\n      media_id: id,\n      tagged_users: [],\n    }));\n  }\n\n  if (tweetId) {\n    variables.reply = { in_reply_to_tweet_id: tweetId };\n  }\n\n  const features = {\n    premium_content_api_read_enabled: false,\n    communities_web_enable_tweet_community_results_fetch: true,\n    c9s_tweet_anatomy_moderator_badge_enabled: true,\n    responsive_web_grok_analyze_button_fetch_trends_enabled: true,\n    responsive_web_edit_tweet_api_enabled: true,\n    graphql_is_translatable_rweb_tweet_is_translatable_enabled: true,\n    view_counts_everywhere_api_enabled: true,\n    longform_notetweets_consumption_enabled: true,\n    responsive_web_twitter_article_tweet_consumption_enabled: true,\n    tweet_awards_web_tipping_enabled: false,\n    creator_subscriptions_quote_tweet_preview_enabled: false,\n    longform_notetweets_rich_text_read_enabled: true,\n    longform_notetweets_inline_media_enabled: true,\n    profile_label_improvements_pcf_label_in_post_enabled: false,\n    rweb_tipjar_consumption_enabled: true,\n    responsive_web_graphql_exclude_directive_enabled: true,\n    verified_phone_label_enabled: false,\n    articles_preview_enabled: true,\n    rweb_video_timestamps_enabled: true,\n    responsive_web_graphql_skip_user_profile_image_extensions_enabled: false,\n    freedom_of_speech_not_reach_fetch_enabled: true,\n    standardized_nudges_misinfo: true,\n    tweet_with_visibility_results_prefer_gql_limited_actions_policy_enabled:\n      true,\n    responsive_web_graphql_timeline_navigation_enabled: true,\n    responsive_web_enhance_cards_enabled: false,\n  };\n\n  const response = await fetch(url, {\n    headers,\n    body: JSON.stringify({\n      variables,\n      features,\n      queryId: 'YNXM2DGuE2Sff6a2JD3Ztw',\n    }),\n    method: 'POST',\n  });\n\n  await updateCookieJar(auth.cookieJar(), response.headers);\n\n  // check for errors\n  if (!response.ok) {\n    throw new Error(await response.text());\n  }\n\n  return response;\n}\n","import { requestApi } from './api';\nimport { TwitterAuth } from './auth';\nimport { ApiError } from './errors';\nimport { TimelineInstruction } from './timeline-v2';\n\nexport interface HomeTimelineResponse {\n  data?: {\n    home: {\n      home_timeline_urt: {\n        instructions: TimelineInstruction[];\n      };\n    };\n  };\n}\n\nexport async function fetchHomeTimeline(\n  count: number,\n  seenTweetIds: string[],\n  auth: TwitterAuth,\n): Promise<any[]> {\n  const variables = {\n    count,\n    includePromotedContent: true,\n    latestControlAvailable: true,\n    requestContext: 'launch',\n    withCommunity: true,\n    seenTweetIds,\n  };\n\n  const features = {\n    rweb_tipjar_consumption_enabled: true,\n    responsive_web_graphql_exclude_directive_enabled: true,\n    verified_phone_label_enabled: false,\n    creator_subscriptions_tweet_preview_api_enabled: true,\n    responsive_web_graphql_timeline_navigation_enabled: true,\n    responsive_web_graphql_skip_user_profile_image_extensions_enabled: false,\n    communities_web_enable_tweet_community_results_fetch: true,\n    c9s_tweet_anatomy_moderator_badge_enabled: true,\n    articles_preview_enabled: true,\n    responsive_web_edit_tweet_api_enabled: true,\n    graphql_is_translatable_rweb_tweet_is_translatable_enabled: true,\n    view_counts_everywhere_api_enabled: true,\n    longform_notetweets_consumption_enabled: true,\n    responsive_web_twitter_article_tweet_consumption_enabled: true,\n    tweet_awards_web_tipping_enabled: false,\n    creator_subscriptions_quote_tweet_preview_enabled: false,\n    freedom_of_speech_not_reach_fetch_enabled: true,\n    standardized_nudges_misinfo: true,\n    tweet_with_visibility_results_prefer_gql_limited_actions_policy_enabled:\n      true,\n    rweb_video_timestamps_enabled: true,\n    longform_notetweets_rich_text_read_enabled: true,\n    longform_notetweets_inline_media_enabled: true,\n    responsive_web_enhance_cards_enabled: false,\n  };\n\n  const res = await requestApi<HomeTimelineResponse>(\n    `https://x.com/i/api/graphql/HJFjzBgCs16TqxewQOeLNg/HomeTimeline?variables=${encodeURIComponent(\n      JSON.stringify(variables),\n    )}&features=${encodeURIComponent(JSON.stringify(features))}`,\n    auth,\n    'GET',\n  );\n\n  if (!res.success) {\n    if (res.err instanceof ApiError) {\n      console.error('Error details:', res.err.data);\n    }\n    throw res.err;\n  }\n\n  const home = res.value?.data?.home.home_timeline_urt?.instructions;\n\n  if (!home) {\n    return [];\n  }\n\n  const entries: any[] = [];\n\n  for (const instruction of home) {\n    if (instruction.type === 'TimelineAddEntries') {\n      for (const entry of instruction.entries ?? []) {\n        entries.push(entry);\n      }\n    }\n  }\n  // get the itemContnent from each entry\n  const tweets = entries\n    .map((entry) => entry.content.itemContent?.tweet_results?.result)\n    .filter((tweet) => tweet !== undefined);\n\n  return tweets;\n}\n","import { requestApi } from './api';\nimport { TwitterAuth } from './auth';\nimport { ApiError } from './errors';\nimport { TimelineInstruction } from './timeline-v2';\n\nexport interface HomeLatestTimelineResponse {\n  data?: {\n    home: {\n      home_timeline_urt: {\n        instructions: TimelineInstruction[];\n      };\n    };\n  };\n}\n\nexport async function fetchFollowingTimeline(\n  count: number,\n  seenTweetIds: string[],\n  auth: TwitterAuth,\n): Promise<any[]> {\n  const variables = {\n    count,\n    includePromotedContent: true,\n    latestControlAvailable: true,\n    requestContext: 'launch',\n    seenTweetIds,\n  };\n\n  const features = {\n    profile_label_improvements_pcf_label_in_post_enabled: true,\n    rweb_tipjar_consumption_enabled: true,\n    responsive_web_graphql_exclude_directive_enabled: true,\n    verified_phone_label_enabled: false,\n    creator_subscriptions_tweet_preview_api_enabled: true,\n    responsive_web_graphql_timeline_navigation_enabled: true,\n    responsive_web_graphql_skip_user_profile_image_extensions_enabled: false,\n    communities_web_enable_tweet_community_results_fetch: true,\n    c9s_tweet_anatomy_moderator_badge_enabled: true,\n    articles_preview_enabled: true,\n    responsive_web_edit_tweet_api_enabled: true,\n    graphql_is_translatable_rweb_tweet_is_translatable_enabled: true,\n    view_counts_everywhere_api_enabled: true,\n    longform_notetweets_consumption_enabled: true,\n    responsive_web_twitter_article_tweet_consumption_enabled: true,\n    tweet_awards_web_tipping_enabled: false,\n    creator_subscriptions_quote_tweet_preview_enabled: false,\n    freedom_of_speech_not_reach_fetch_enabled: true,\n    standardized_nudges_misinfo: true,\n    tweet_with_visibility_results_prefer_gql_limited_actions_policy_enabled:\n      true,\n    rweb_video_timestamps_enabled: true,\n    longform_notetweets_rich_text_read_enabled: true,\n    longform_notetweets_inline_media_enabled: true,\n    responsive_web_enhance_cards_enabled: false,\n  };\n\n  const res = await requestApi<HomeLatestTimelineResponse>(\n    `https://x.com/i/api/graphql/K0X1xbCZUjttdK8RazKAlw/HomeLatestTimeline?variables=${encodeURIComponent(\n      JSON.stringify(variables),\n    )}&features=${encodeURIComponent(JSON.stringify(features))}`,\n    auth,\n    'GET',\n  );\n\n  if (!res.success) {\n    if (res.err instanceof ApiError) {\n      console.error('Error details:', res.err.data);\n    }\n    throw res.err;\n  }\n\n  const home = res.value?.data?.home.home_timeline_urt?.instructions;\n\n  if (!home) {\n    return [];\n  }\n\n  const entries: any[] = [];\n\n  for (const instruction of home) {\n    if (instruction.type === 'TimelineAddEntries') {\n      for (const entry of instruction.entries ?? []) {\n        entries.push(entry);\n      }\n    }\n  }\n  // get the itemContnent from each entry\n  const tweets = entries\n    .map((entry) => entry.content.itemContent?.tweet_results?.result)\n    .filter((tweet) => tweet !== undefined);\n\n  return tweets;\n}\n","import { TwitterAuth } from './auth';\nimport { updateCookieJar } from './requests';\n\nexport interface DirectMessage {\n  id: string;\n  text: string;\n  senderId: string;\n  recipientId: string;\n  createdAt: string;\n  mediaUrls?: string[];\n  senderScreenName?: string;\n  recipientScreenName?: string;\n}\n\nexport interface DirectMessageConversation {\n  conversationId: string;\n  messages: DirectMessage[];\n  participants: {\n    id: string;\n    screenName: string;\n  }[];\n}\n\nexport interface DirectMessageEvent {\n  id: string;\n  type: string;\n  message_create: {\n    sender_id: string;\n    target: {\n      recipient_id: string;\n    };\n    message_data: {\n      text: string;\n      created_at: string;\n      entities?: {\n        urls?: Array<{\n          url: string;\n          expanded_url: string;\n          display_url: string;\n        }>;\n        media?: Array<{\n          url: string;\n          type: string;\n        }>;\n      };\n    };\n  };\n}\n\nexport interface DirectMessagesResponse {\n  conversations: DirectMessageConversation[];\n  users: TwitterUser[];\n  cursor?: string;\n  lastSeenEventId?: string;\n  trustedLastSeenEventId?: string;\n  untrustedLastSeenEventId?: string;\n  inboxTimelines?: {\n    trusted?: {\n      status: string;\n      minEntryId?: string;\n    };\n    untrusted?: {\n      status: string;\n      minEntryId?: string;\n    };\n  };\n  userId: string;\n}\n\nexport interface TwitterUser {\n  id: string;\n  screenName: string;\n  name: string;\n  profileImageUrl: string;\n  description?: string;\n  verified?: boolean;\n  protected?: boolean;\n  followersCount?: number;\n  friendsCount?: number;\n}\n\nexport interface SendDirectMessageResponse {\n  entries: {\n    message: {\n      id: string;\n      time: string;\n      affects_sort: boolean;\n      conversation_id: string;\n      message_data: {\n        id: string;\n        time: string;\n        recipient_id: string;\n        sender_id: string;\n        text: string;\n      };\n    };\n  }[];\n  users: Record<string, TwitterUser>;\n}\n\nfunction parseDirectMessageConversations(\n  data: any,\n  userId: string,\n): DirectMessagesResponse {\n  try {\n    const inboxState = data?.inbox_initial_state;\n    const conversations = inboxState?.conversations || {};\n    const entries = inboxState?.entries || [];\n    const users = inboxState?.users || {};\n\n    // Parse users first\n    const parsedUsers: TwitterUser[] = Object.values(users).map(\n      (user: any) => ({\n        id: user.id_str,\n        screenName: user.screen_name,\n        name: user.name,\n        profileImageUrl: user.profile_image_url_https,\n        description: user.description,\n        verified: user.verified,\n        protected: user.protected,\n        followersCount: user.followers_count,\n        friendsCount: user.friends_count,\n      }),\n    );\n\n    // Group messages by conversation_id\n    const messagesByConversation: Record<string, any[]> = {};\n    entries.forEach((entry: any) => {\n      if (entry.message) {\n        const convId = entry.message.conversation_id;\n        if (!messagesByConversation[convId]) {\n          messagesByConversation[convId] = [];\n        }\n        messagesByConversation[convId].push(entry.message);\n      }\n    });\n\n    // Convert to DirectMessageConversation array\n    const parsedConversations = Object.entries(conversations).map(\n      ([convId, conv]: [string, any]) => {\n        const messages = messagesByConversation[convId] || [];\n\n        // Sort messages by time in ascending order\n        messages.sort((a, b) => Number(a.time) - Number(b.time));\n\n        return {\n          conversationId: convId,\n          messages: parseDirectMessages(messages, users),\n          participants: conv.participants.map((p: any) => ({\n            id: p.user_id,\n            screenName: users[p.user_id]?.screen_name || p.user_id,\n          })),\n        };\n      },\n    );\n\n    return {\n      conversations: parsedConversations,\n      users: parsedUsers,\n      cursor: inboxState?.cursor,\n      lastSeenEventId: inboxState?.last_seen_event_id,\n      trustedLastSeenEventId: inboxState?.trusted_last_seen_event_id,\n      untrustedLastSeenEventId: inboxState?.untrusted_last_seen_event_id,\n      inboxTimelines: {\n        trusted: inboxState?.inbox_timelines?.trusted && {\n          status: inboxState.inbox_timelines.trusted.status,\n          minEntryId: inboxState.inbox_timelines.trusted.min_entry_id,\n        },\n        untrusted: inboxState?.inbox_timelines?.untrusted && {\n          status: inboxState.inbox_timelines.untrusted.status,\n          minEntryId: inboxState.inbox_timelines.untrusted.min_entry_id,\n        },\n      },\n      userId,\n    };\n  } catch (error) {\n    console.error('Error parsing DM conversations:', error);\n    return {\n      conversations: [],\n      users: [],\n      userId,\n    };\n  }\n}\n\nfunction parseDirectMessages(messages: any[], users: any): DirectMessage[] {\n  try {\n    return messages.map((msg: any) => ({\n      id: msg.message_data.id,\n      text: msg.message_data.text,\n      senderId: msg.message_data.sender_id,\n      recipientId: msg.message_data.recipient_id,\n      createdAt: msg.message_data.time,\n      mediaUrls: extractMediaUrls(msg.message_data),\n      senderScreenName: users[msg.message_data.sender_id]?.screen_name,\n      recipientScreenName: users[msg.message_data.recipient_id]?.screen_name,\n    }));\n  } catch (error) {\n    console.error('Error parsing DMs:', error);\n    return [];\n  }\n}\n\nfunction extractMediaUrls(messageData: any): string[] | undefined {\n  const urls: string[] = [];\n\n  // Extract URLs from entities if they exist\n  if (messageData.entities?.urls) {\n    messageData.entities.urls.forEach((url: any) => {\n      urls.push(url.expanded_url);\n    });\n  }\n\n  // Extract media URLs if they exist\n  if (messageData.entities?.media) {\n    messageData.entities.media.forEach((media: any) => {\n      urls.push(media.media_url_https || media.media_url);\n    });\n  }\n\n  return urls.length > 0 ? urls : undefined;\n}\n\nexport async function getDirectMessageConversations(\n  userId: string,\n  auth: TwitterAuth,\n  cursor?: string,\n): Promise<DirectMessagesResponse> {\n  if (!auth.isLoggedIn()) {\n    throw new Error('Authentication required to fetch direct messages');\n  }\n\n  const url =\n    'https://twitter.com/i/api/graphql/7s3kOODhC5vgXlO0OlqYdA/DMInboxTimeline';\n  const messageListUrl = 'https://x.com/i/api/1.1/dm/inbox_initial_state.json';\n\n  const params = new URLSearchParams();\n\n  if (cursor) {\n    params.append('cursor', cursor);\n  }\n\n  const finalUrl = `${messageListUrl}${\n    params.toString() ? '?' + params.toString() : ''\n  }`;\n  const cookies = await auth.cookieJar().getCookies(url);\n  const xCsrfToken = cookies.find((cookie) => cookie.key === 'ct0');\n\n  const headers = new Headers({\n    authorization: `Bearer ${(auth as any).bearerToken}`,\n    cookie: await auth.cookieJar().getCookieString(url),\n    'content-type': 'application/json',\n    'User-Agent':\n      'Mozilla/5.0 (Linux; Android 11; Nokia G20) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.88 Mobile Safari/537.36',\n    'x-guest-token': (auth as any).guestToken,\n    'x-twitter-auth-type': 'OAuth2Client',\n    'x-twitter-active-user': 'yes',\n    'x-csrf-token': xCsrfToken?.value as string,\n  });\n\n  const response = await fetch(finalUrl, {\n    method: 'GET',\n    headers,\n  });\n\n  await updateCookieJar(auth.cookieJar(), response.headers);\n\n  if (!response.ok) {\n    throw new Error(await response.text());\n  }\n\n  // parse the response\n  const data = await response.json();\n  return parseDirectMessageConversations(data, userId);\n}\n\nexport async function sendDirectMessage(\n  auth: TwitterAuth,\n  conversation_id: string,\n  text: string,\n): Promise<SendDirectMessageResponse> {\n  if (!auth.isLoggedIn()) {\n    throw new Error('Authentication required to send direct messages');\n  }\n\n  const url =\n    'https://twitter.com/i/api/graphql/7s3kOODhC5vgXlO0OlqYdA/DMInboxTimeline';\n  const messageDmUrl = 'https://x.com/i/api/1.1/dm/new2.json';\n\n  const cookies = await auth.cookieJar().getCookies(url);\n  const xCsrfToken = cookies.find((cookie) => cookie.key === 'ct0');\n\n  const headers = new Headers({\n    authorization: `Bearer ${(auth as any).bearerToken}`,\n    cookie: await auth.cookieJar().getCookieString(url),\n    'content-type': 'application/json',\n    'User-Agent':\n      'Mozilla/5.0 (Linux; Android 11; Nokia G20) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.88 Mobile Safari/537.36',\n    'x-guest-token': (auth as any).guestToken,\n    'x-twitter-auth-type': 'OAuth2Client',\n    'x-twitter-active-user': 'yes',\n    'x-csrf-token': xCsrfToken?.value as string,\n  });\n\n  const payload = {\n    conversation_id: `${conversation_id}`,\n    recipient_ids: false,\n    text: text,\n    cards_platform: 'Web-12',\n    include_cards: 1,\n    include_quote_count: true,\n    dm_users: false,\n  };\n\n  const response = await fetch(messageDmUrl, {\n    method: 'POST',\n    headers,\n    body: JSON.stringify(payload),\n  });\n\n  await updateCookieJar(auth.cookieJar(), response.headers);\n\n  if (!response.ok) {\n    throw new Error(await response.text());\n  }\n\n  return await response.json();\n}\n","import { TwitterAuth } from './auth';\nimport { updateCookieJar } from './requests';\nimport {\n    AudioSpace,\n    AudioSpaceByIdResponse,\n    AudioSpaceByIdVariables,\n    AuthenticatePeriscopeResponse,\n    BrowseSpaceTopicsResponse,\n    Community,\n    CommunitySelectQueryResponse,\n    LiveVideoStreamStatus,\n    LoginTwitterTokenResponse,\n    Subtopic,\n} from './types/spaces';\n\n/**\n * Generates a random string that mimics a UUID v4.\n */\n// TODO: install and replace with uuidv4\nfunction generateRandomId(): string {\n    return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, c => {\n        const r = (Math.random() * 16) | 0;\n        const v = c === 'x' ? r : (r & 0x3) | 0x8;\n        return v.toString(16);\n    });\n}\n\n/**\n * Fetches details of an Audio Space by its ID.\n * @param variables The variables required for the GraphQL query.\n * @param auth The authentication object.\n * @returns The details of the Audio Space.\n */\nexport async function fetchAudioSpaceById(\n    variables: AudioSpaceByIdVariables,\n    auth: TwitterAuth,\n): Promise<AudioSpace> {\n    const queryId = 'Tvv_cNXCbtTcgdy1vWYPMw'; // Specific to the AudioSpaceById GraphQL query\n    const operationName = 'AudioSpaceById';\n\n    // URL encode the variables and features\n    const variablesEncoded = encodeURIComponent(JSON.stringify(variables));\n    const features = {\n        spaces_2022_h2_spaces_communities: true,\n        spaces_2022_h2_clipping: true,\n        creator_subscriptions_tweet_preview_api_enabled: true,\n        profile_label_improvements_pcf_label_in_post_enabled: false,\n        rweb_tipjar_consumption_enabled: true,\n        responsive_web_graphql_exclude_directive_enabled: true,\n        verified_phone_label_enabled: false,\n        premium_content_api_read_enabled: false,\n        communities_web_enable_tweet_community_results_fetch: true,\n        c9s_tweet_anatomy_moderator_badge_enabled: true,\n        responsive_web_grok_analyze_button_fetch_trends_enabled: true,\n        articles_preview_enabled: true,\n        responsive_web_graphql_skip_user_profile_image_extensions_enabled: false,\n        responsive_web_edit_tweet_api_enabled: true,\n        graphql_is_translatable_rweb_tweet_is_translatable_enabled: true,\n        view_counts_everywhere_api_enabled: true,\n        longform_notetweets_consumption_enabled: true,\n        responsive_web_twitter_article_tweet_consumption_enabled: true,\n        tweet_awards_web_tipping_enabled: false,\n        creator_subscriptions_quote_tweet_preview_enabled: false,\n        freedom_of_speech_not_reach_fetch_enabled: true,\n        standardized_nudges_misinfo: true,\n        tweet_with_visibility_results_prefer_gql_limited_actions_policy_enabled:\n            true,\n        rweb_video_timestamps_enabled: true,\n        longform_notetweets_rich_text_read_enabled: true,\n        longform_notetweets_inline_media_enabled: true,\n        responsive_web_graphql_timeline_navigation_enabled: true,\n        responsive_web_enhance_cards_enabled: false,\n    };\n    const featuresEncoded = encodeURIComponent(JSON.stringify(features));\n\n    const url = `https://x.com/i/api/graphql/${queryId}/${operationName}?variables=${variablesEncoded}&features=${featuresEncoded}`;\n\n    const onboardingTaskUrl = 'https://api.twitter.com/1.1/onboarding/task.json';\n\n    // Retrieve necessary cookies and tokens\n    const cookies = await auth.cookieJar().getCookies(onboardingTaskUrl);\n    const xCsrfToken = cookies.find((cookie) => cookie.key === 'ct0');\n\n    const headers = new Headers({\n        Accept: '*/*',\n        Authorization: `Bearer ${(auth as any).bearerToken}`,\n        'Content-Type': 'application/json',\n        Cookie: await auth.cookieJar().getCookieString(onboardingTaskUrl),\n        'User-Agent':\n            'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36',\n        'x-guest-token': (auth as any).guestToken,\n        'x-twitter-auth-type': 'OAuth2Client',\n        'x-twitter-active-user': 'yes',\n        'x-csrf-token': xCsrfToken?.value as string,\n    });\n\n    const response = await auth.fetch(url, {\n        headers,\n        method: 'GET',\n    });\n\n    // Update the cookie jar with any new cookies from the response\n    await updateCookieJar(auth.cookieJar(), response.headers);\n\n    // Check for errors in the response\n    if (!response.ok) {\n        throw new Error(`Failed to fetch Audio Space: ${await response.text()}`);\n    }\n\n    const data: AudioSpaceByIdResponse = await response.json();\n\n    if (data.errors && data.errors.length > 0) {\n        throw new Error(`API Errors: ${JSON.stringify(data.errors)}`);\n    }\n\n    return data.data.audioSpace;\n}\n\n/**\n * Fetches available space topics from Twitter.\n * @param auth The authentication object.\n * @returns An array of space topics.\n */\nexport async function fetchBrowseSpaceTopics(\n    auth: TwitterAuth,\n): Promise<Subtopic[]> {\n    const queryId = 'TYpVV9QioZfViHqEqRZxJA';\n    const operationName = 'BrowseSpaceTopics';\n\n    const variables = {};\n    const features = {};\n\n    const variablesEncoded = encodeURIComponent(JSON.stringify(variables));\n    const featuresEncoded = encodeURIComponent(JSON.stringify(features));\n\n    const url = `https://x.com/i/api/graphql/${queryId}/${operationName}?variables=${variablesEncoded}&features=${featuresEncoded}`;\n\n    const onboardingTaskUrl = 'https://api.twitter.com/1.1/onboarding/task.json';\n\n    // Retrieve necessary cookies and tokens\n    const cookies = await auth.cookieJar().getCookies(onboardingTaskUrl);\n    const xCsrfToken = cookies.find((cookie) => cookie.key === 'ct0');\n\n    const headers = new Headers({\n        Accept: '*/*',\n        Authorization: `Bearer ${(auth as any).bearerToken}`,\n        'Content-Type': 'application/json',\n        Cookie: await auth.cookieJar().getCookieString(onboardingTaskUrl),\n        'User-Agent':\n            'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36',\n        'x-guest-token': (auth as any).guestToken,\n        'x-twitter-auth-type': 'OAuth2Client',\n        'x-twitter-active-user': 'yes',\n        'x-csrf-token': xCsrfToken?.value as string,\n    });\n\n    const response = await auth.fetch(url, {\n        headers,\n        method: 'GET',\n    });\n\n    // Update the cookie jar with any new cookies from the response\n    await updateCookieJar(auth.cookieJar(), response.headers);\n\n    // Check for errors in the response\n    if (!response.ok) {\n        throw new Error(`Failed to fetch Space Topics: ${await response.text()}`);\n    }\n\n    const data: BrowseSpaceTopicsResponse = await response.json();\n\n    if (data.errors && data.errors.length > 0) {\n        throw new Error(`API Errors: ${JSON.stringify(data.errors)}`);\n    }\n\n    // Flatten the subtopics from all categories into a single array\n    return data.data.browse_space_topics.categories.flatMap(\n        (category) => category.subtopics,\n    );\n}\n\n/**\n * Fetches available communities from Twitter.\n * @param auth The authentication object.\n * @returns An array of communities.\n */\nexport async function fetchCommunitySelectQuery(\n    auth: TwitterAuth,\n): Promise<Community[]> {\n    const queryId = 'Lue1DfmoW2cc0225t_8z1w'; // Specific to the CommunitySelectQuery GraphQL query\n    const operationName = 'CommunitySelectQuery';\n\n    const variables = {};\n    const features = {};\n\n    const variablesEncoded = encodeURIComponent(JSON.stringify(variables));\n    const featuresEncoded = encodeURIComponent(JSON.stringify(features));\n\n    const url = `https://x.com/i/api/graphql/${queryId}/${operationName}?variables=${variablesEncoded}&features=${featuresEncoded}`;\n\n    const onboardingTaskUrl = 'https://api.twitter.com/1.1/onboarding/task.json';\n\n    // Retrieve necessary cookies and tokens\n    const cookies = await auth.cookieJar().getCookies(onboardingTaskUrl);\n    const xCsrfToken = cookies.find((cookie) => cookie.key === 'ct0');\n\n    const headers = new Headers({\n        Accept: '*/*',\n        Authorization: `Bearer ${(auth as any).bearerToken}`,\n        'Content-Type': 'application/json',\n        Cookie: await auth.cookieJar().getCookieString(onboardingTaskUrl),\n        'User-Agent':\n            'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36',\n        'x-guest-token': (auth as any).guestToken,\n        'x-twitter-auth-type': 'OAuth2Client',\n        'x-twitter-active-user': 'yes',\n        'x-csrf-token': xCsrfToken?.value as string,\n    });\n\n    const response = await auth.fetch(url, {\n        headers,\n        method: 'GET',\n    });\n\n    // Update the cookie jar with any new cookies from the response\n    await updateCookieJar(auth.cookieJar(), response.headers);\n\n    // Check for errors in the response\n    if (!response.ok) {\n        throw new Error(\n            `Failed to fetch Community Select Query: ${await response.text()}`,\n        );\n    }\n\n    const data: CommunitySelectQueryResponse = await response.json();\n\n    if (data.errors && data.errors.length > 0) {\n        throw new Error(`API Errors: ${JSON.stringify(data.errors)}`);\n    }\n\n    // Return the space_hostable_communities array, which may be empty\n    return data.data.space_hostable_communities;\n}\n\n/**\n * Fetches the status of an Audio Space stream by its media key.\n * @param mediaKey The media key of the Audio Space.\n * @param auth The authentication object.\n * @returns The status of the Audio Space stream.\n */\nexport async function fetchLiveVideoStreamStatus(\n    mediaKey: string,\n    auth: TwitterAuth,\n): Promise<LiveVideoStreamStatus> {\n    const baseUrl = `https://x.com/i/api/1.1/live_video_stream/status/${mediaKey}`;\n    const queryParams = new URLSearchParams({\n        client: 'web',\n        use_syndication_guest_id: 'false',\n        cookie_set_host: 'x.com',\n    });\n\n    const url = `${baseUrl}?${queryParams.toString()}`;\n\n    const onboardingTaskUrl = 'https://api.twitter.com/1.1/onboarding/task.json';\n\n    // Retrieve necessary cookies and tokens\n    const cookies = await auth.cookieJar().getCookies(onboardingTaskUrl);\n    const xCsrfToken = cookies.find((cookie) => cookie.key === 'ct0');\n\n    const headers = new Headers({\n        Accept: '*/*',\n        Authorization: `Bearer ${(auth as any).bearerToken}`,\n        'Content-Type': 'application/json',\n        Cookie: await auth.cookieJar().getCookieString(onboardingTaskUrl),\n        'User-Agent':\n            'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36',\n        'x-guest-token': (auth as any).guestToken,\n        'x-twitter-auth-type': 'OAuth2Client',\n        'x-twitter-active-user': 'yes',\n        'x-csrf-token': xCsrfToken?.value as string,\n    });\n\n    try {\n        const response = await auth.fetch(url, {\n            method: 'GET',\n            headers: headers,\n        });\n\n        // Update the cookie jar with any new cookies from the response\n        await updateCookieJar(auth.cookieJar(), response.headers);\n\n        // Check for errors in the response\n        if (!response.ok) {\n            throw new Error(\n                `Failed to fetch live video stream status: ${await response.text()}`,\n            );\n        }\n\n        return await response.json();\n    } catch (error) {\n        console.error(\n            `Error fetching live video stream status for mediaKey ${mediaKey}:`,\n            error,\n        );\n        throw error;\n    }\n}\n\n/**\n * Authenticates Periscope to obtain a token.\n * @param auth The authentication object.\n * @returns The Periscope authentication token.\n */\nexport async function fetchAuthenticatePeriscope(\n    auth: TwitterAuth,\n): Promise<string> {\n    const queryId = 'r7VUmxbfqNkx7uwjgONSNw';\n    const operationName = 'AuthenticatePeriscope';\n\n    const variables = {};\n    const features = {};\n\n    const variablesEncoded = encodeURIComponent(JSON.stringify(variables));\n    const featuresEncoded = encodeURIComponent(JSON.stringify(features));\n\n    const url = `https://x.com/i/api/graphql/${queryId}/${operationName}?variables=${variablesEncoded}&features=${featuresEncoded}`;\n\n    const onboardingTaskUrl = 'https://api.twitter.com/1.1/onboarding/task.json';\n\n    const cookies = await auth.cookieJar().getCookies(onboardingTaskUrl);\n    const xCsrfToken = cookies.find((cookie) => cookie.key === 'ct0');\n\n    if (!xCsrfToken) {\n        throw new Error('CSRF Token (ct0) not found in cookies.');\n    }\n\n    const clientTransactionId = generateRandomId();\n\n    const headers = new Headers({\n        Accept: '*/*',\n        Authorization: `Bearer ${(auth as any).bearerToken}`,\n        'Content-Type': 'application/json',\n        Cookie: await auth.cookieJar().getCookieString(onboardingTaskUrl),\n        'User-Agent':\n            'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36',\n        'x-guest-token': (auth as any).guestToken,\n        'x-twitter-auth-type': 'OAuth2Session',\n        'x-twitter-active-user': 'yes',\n        'x-csrf-token': xCsrfToken.value,\n        'x-client-transaction-id': clientTransactionId,\n        'sec-ch-ua-platform': '\"Windows\"',\n        'sec-ch-ua':\n            '\"Google Chrome\";v=\"131\", \"Chromium\";v=\"131\", \"Not_A Brand\";v=\"24\"',\n        'x-twitter-client-language': 'en',\n        'sec-ch-ua-mobile': '?0',\n        Referer: 'https://x.com/i/spaces/start',\n    });\n\n    try {\n        const response = await auth.fetch(url, {\n            method: 'GET',\n            headers: headers,\n        });\n\n        await updateCookieJar(auth.cookieJar(), response.headers);\n\n        if (!response.ok) {\n            const errorText = await response.text();\n            throw new Error(`Error ${response.status}: ${errorText}`);\n        }\n\n        const data: AuthenticatePeriscopeResponse = await response.json();\n\n        if (data.errors && data.errors.length > 0) {\n            throw new Error(`API Errors: ${JSON.stringify(data.errors)}`);\n        }\n\n        if (!data.data.authenticate_periscope) {\n            throw new Error('Periscope authentication failed, no data returned.');\n        }\n\n        return data.data.authenticate_periscope;\n    } catch (error) {\n        console.error('Error during Periscope authentication:', error);\n        throw error;\n    }\n}\n\n/**\n * Logs in to Twitter via Proxsee using the Periscope JWT to obtain a login cookie.\n * @param jwt The JWT obtained via AuthenticatePeriscope.\n * @param auth The authentication object.\n * @returns The response containing the cookie and user information.\n */\nexport async function fetchLoginTwitterToken(\n    jwt: unknown,\n    auth: TwitterAuth,\n): Promise<LoginTwitterTokenResponse> {\n    const url = 'https://proxsee.pscp.tv/api/v2/loginTwitterToken';\n\n    const idempotenceKey = generateRandomId();\n\n    const payload = {\n        jwt: jwt,\n        vendor_id: 'm5-proxsee-login-a2011357b73e',\n        create_user: true,\n    };\n\n    const headers = new Headers({\n        'Content-Type': 'application/json',\n        'User-Agent':\n            'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36',\n        Referer: 'https://x.com/',\n        'sec-ch-ua':\n            '\"Google Chrome\";v=\"131\", \"Chromium\";v=\"131\", \"Not_A Brand\";v=\"24\"',\n        'sec-ch-ua-platform': '\"Windows\"',\n        'sec-ch-ua-mobile': '?0',\n        'X-Periscope-User-Agent': 'Twitter/m5',\n        'X-Idempotence': idempotenceKey,\n        'X-Attempt': '1',\n    });\n\n    try {\n        const response = await auth.fetch(url, {\n            method: 'POST',\n            headers: headers,\n            body: JSON.stringify(payload),\n        });\n\n        // Update the cookie jar with any new cookies from the response\n        await updateCookieJar(auth.cookieJar(), response.headers);\n\n        // Check if the response is successful\n        if (!response.ok) {\n            const errorText = await response.text();\n            throw new Error(`Error ${response.status}: ${errorText}`);\n        }\n\n        const data: LoginTwitterTokenResponse = await response.json();\n\n        if (!data.cookie || !data.user) {\n            throw new Error('Twitter authentication failed, missing data.');\n        }\n\n        return data;\n    } catch (error) {\n        console.error('Error logging into Twitter via Proxsee:', error);\n        throw error;\n    }\n}","import { Cookie } from 'tough-cookie';\nimport {\n  bearerToken,\n  FetchTransformOptions,\n  requestApi,\n  RequestApiResult,\n} from './api';\nimport { TwitterAuth, TwitterAuthOptions, TwitterGuestAuth } from './auth';\nimport { TwitterUserAuth } from './auth-user';\nimport {\n  getProfile,\n  getUserIdByScreenName,\n  getScreenNameByUserId,\n  Profile,\n} from './profile';\nimport {\n  fetchSearchProfiles,\n  fetchSearchTweets,\n  SearchMode,\n  searchProfiles,\n  searchTweets,\n} from './search';\nimport {\n  fetchProfileFollowing,\n  fetchProfileFollowers,\n  getFollowing,\n  getFollowers,\n  followUser,\n} from './relationships';\nimport { QueryProfilesResponse, QueryTweetsResponse } from './timeline-v1';\nimport { getTrends } from './trends';\nimport {\n  Tweet,\n  getTweetAnonymous,\n  getTweets,\n  getLatestTweet,\n  getTweetWhere,\n  getTweetsWhere,\n  getTweetsByUserId,\n  TweetQuery,\n  getTweet,\n  fetchListTweets,\n  getTweetsAndRepliesByUserId,\n  getTweetsAndReplies,\n  createCreateTweetRequest,\n  PollData,\n  createCreateTweetRequestV2,\n  getTweetV2,\n  getTweetsV2,\n  defaultOptions,\n  createQuoteTweetRequest,\n  likeTweet,\n  retweet,\n  createCreateNoteTweetRequest,\n  createCreateLongTweetRequest,\n} from './tweets';\nimport { parseTimelineTweetsV2, TimelineV2 } from './timeline-v2';\nimport { fetchHomeTimeline } from './timeline-home';\nimport { fetchFollowingTimeline } from './timeline-following';\nimport {\n  TTweetv2Expansion,\n  TTweetv2MediaField,\n  TTweetv2PlaceField,\n  TTweetv2PollField,\n  TTweetv2TweetField,\n  TTweetv2UserField,\n} from 'twitter-api-v2';\nimport {\n  DirectMessagesResponse,\n  getDirectMessageConversations,\n  sendDirectMessage,\n  SendDirectMessageResponse,\n} from './messages';\nimport {\n  fetchAudioSpaceById,\n  fetchAuthenticatePeriscope,\n  fetchBrowseSpaceTopics,\n  fetchCommunitySelectQuery, fetchLiveVideoStreamStatus, fetchLoginTwitterToken\n} from './spaces';\nimport {AudioSpace, Community, LiveVideoStreamStatus, LoginTwitterTokenResponse, Subtopic} from './types/spaces';\n\nconst twUrl = 'https://twitter.com';\nconst UserTweetsUrl =\n  'https://twitter.com/i/api/graphql/E3opETHurmVJflFsUBVuUQ/UserTweets';\n\nexport interface ScraperOptions {\n  /**\n   * An alternative fetch function to use instead of the default fetch function. This may be useful\n   * in nonstandard runtime environments, such as edge workers.\n   */\n  fetch: typeof fetch;\n\n  /**\n   * Additional options that control how requests and responses are processed. This can be used to\n   * proxy requests through other hosts, for example.\n   */\n  transform: Partial<FetchTransformOptions>;\n}\n\n/**\n * An interface to Twitter's undocumented API.\n * - Reusing Scraper objects is recommended to minimize the time spent authenticating unnecessarily.\n */\nexport class Scraper {\n  private auth!: TwitterAuth;\n  private authTrends!: TwitterAuth;\n  private token: string;\n\n  /**\n   * Creates a new Scraper object.\n   * - Scrapers maintain their own guest tokens for Twitter's internal API.\n   * - Reusing Scraper objects is recommended to minimize the time spent authenticating unnecessarily.\n   */\n  constructor(private readonly options?: Partial<ScraperOptions>) {\n    this.token = bearerToken;\n    this.useGuestAuth();\n  }\n\n  /**\n   * Initializes auth properties using a guest token.\n   * Used when creating a new instance of this class, and when logging out.\n   * @internal\n   */\n  private useGuestAuth() {\n    this.auth = new TwitterGuestAuth(this.token, this.getAuthOptions());\n    this.authTrends = new TwitterGuestAuth(this.token, this.getAuthOptions());\n  }\n\n  /**\n   * Fetches a Twitter profile.\n   * @param username The Twitter username of the profile to fetch, without an `@` at the beginning.\n   * @returns The requested {@link Profile}.\n   */\n  public async getProfile(username: string): Promise<Profile> {\n    const res = await getProfile(username, this.auth);\n    return this.handleResponse(res);\n  }\n\n  /**\n   * Fetches the user ID corresponding to the provided screen name.\n   * @param screenName The Twitter screen name of the profile to fetch.\n   * @returns The ID of the corresponding account.\n   */\n  public async getUserIdByScreenName(screenName: string): Promise<string> {\n    const res = await getUserIdByScreenName(screenName, this.auth);\n    return this.handleResponse(res);\n  }\n\n  /**\n   *\n   * @param userId The user ID of the profile to fetch.\n   * @returns The screen name of the corresponding account.\n   */\n  public async getScreenNameByUserId(userId: string): Promise<string> {\n    const response = await getScreenNameByUserId(userId, this.auth);\n    return this.handleResponse(response);\n  }\n\n  /**\n   * Fetches tweets from Twitter.\n   * @param query The search query. Any Twitter-compatible query format can be used.\n   * @param maxTweets The maximum number of tweets to return.\n   * @param includeReplies Whether or not replies should be included in the response.\n   * @param searchMode The category filter to apply to the search. Defaults to `Top`.\n   * @returns An {@link AsyncGenerator} of tweets matching the provided filters.\n   */\n  public searchTweets(\n    query: string,\n    maxTweets: number,\n    searchMode: SearchMode = SearchMode.Top,\n  ): AsyncGenerator<Tweet, void> {\n    return searchTweets(query, maxTweets, searchMode, this.auth);\n  }\n\n  /**\n   * Fetches profiles from Twitter.\n   * @param query The search query. Any Twitter-compatible query format can be used.\n   * @param maxProfiles The maximum number of profiles to return.\n   * @returns An {@link AsyncGenerator} of tweets matching the provided filter(s).\n   */\n  public searchProfiles(\n    query: string,\n    maxProfiles: number,\n  ): AsyncGenerator<Profile, void> {\n    return searchProfiles(query, maxProfiles, this.auth);\n  }\n\n  /**\n   * Fetches tweets from Twitter.\n   * @param query The search query. Any Twitter-compatible query format can be used.\n   * @param maxTweets The maximum number of tweets to return.\n   * @param includeReplies Whether or not replies should be included in the response.\n   * @param searchMode The category filter to apply to the search. Defaults to `Top`.\n   * @param cursor The search cursor, which can be passed into further requests for more results.\n   * @returns A page of results, containing a cursor that can be used in further requests.\n   */\n  public fetchSearchTweets(\n    query: string,\n    maxTweets: number,\n    searchMode: SearchMode,\n    cursor?: string,\n  ): Promise<QueryTweetsResponse> {\n    return fetchSearchTweets(query, maxTweets, searchMode, this.auth, cursor);\n  }\n\n  /**\n   * Fetches profiles from Twitter.\n   * @param query The search query. Any Twitter-compatible query format can be used.\n   * @param maxProfiles The maximum number of profiles to return.\n   * @param cursor The search cursor, which can be passed into further requests for more results.\n   * @returns A page of results, containing a cursor that can be used in further requests.\n   */\n  public fetchSearchProfiles(\n    query: string,\n    maxProfiles: number,\n    cursor?: string,\n  ): Promise<QueryProfilesResponse> {\n    return fetchSearchProfiles(query, maxProfiles, this.auth, cursor);\n  }\n\n  /**\n   * Fetches list tweets from Twitter.\n   * @param listId The list id\n   * @param maxTweets The maximum number of tweets to return.\n   * @param cursor The search cursor, which can be passed into further requests for more results.\n   * @returns A page of results, containing a cursor that can be used in further requests.\n   */\n  public fetchListTweets(\n    listId: string,\n    maxTweets: number,\n    cursor?: string,\n  ): Promise<QueryTweetsResponse> {\n    return fetchListTweets(listId, maxTweets, cursor, this.auth);\n  }\n\n  /**\n   * Fetch the profiles a user is following\n   * @param userId The user whose following should be returned\n   * @param maxProfiles The maximum number of profiles to return.\n   * @returns An {@link AsyncGenerator} of following profiles for the provided user.\n   */\n  public getFollowing(\n    userId: string,\n    maxProfiles: number,\n  ): AsyncGenerator<Profile, void> {\n    return getFollowing(userId, maxProfiles, this.auth);\n  }\n\n  /**\n   * Fetch the profiles that follow a user\n   * @param userId The user whose followers should be returned\n   * @param maxProfiles The maximum number of profiles to return.\n   * @returns An {@link AsyncGenerator} of profiles following the provided user.\n   */\n  public getFollowers(\n    userId: string,\n    maxProfiles: number,\n  ): AsyncGenerator<Profile, void> {\n    return getFollowers(userId, maxProfiles, this.auth);\n  }\n\n  /**\n   * Fetches following profiles from Twitter.\n   * @param userId The user whose following should be returned\n   * @param maxProfiles The maximum number of profiles to return.\n   * @param cursor The search cursor, which can be passed into further requests for more results.\n   * @returns A page of results, containing a cursor that can be used in further requests.\n   */\n  public fetchProfileFollowing(\n    userId: string,\n    maxProfiles: number,\n    cursor?: string,\n  ): Promise<QueryProfilesResponse> {\n    return fetchProfileFollowing(userId, maxProfiles, this.auth, cursor);\n  }\n\n  /**\n   * Fetches profile followers from Twitter.\n   * @param userId The user whose following should be returned\n   * @param maxProfiles The maximum number of profiles to return.\n   * @param cursor The search cursor, which can be passed into further requests for more results.\n   * @returns A page of results, containing a cursor that can be used in further requests.\n   */\n  public fetchProfileFollowers(\n    userId: string,\n    maxProfiles: number,\n    cursor?: string,\n  ): Promise<QueryProfilesResponse> {\n    return fetchProfileFollowers(userId, maxProfiles, this.auth, cursor);\n  }\n\n  /**\n   * Fetches the home timeline for the current user. (for you feed)\n   * @param count The number of tweets to fetch.\n   * @param seenTweetIds An array of tweet IDs that have already been seen.\n   * @returns A promise that resolves to the home timeline response.\n   */\n  public async fetchHomeTimeline(\n    count: number,\n    seenTweetIds: string[],\n  ): Promise<any[]> {\n    return await fetchHomeTimeline(count, seenTweetIds, this.auth);\n  }\n\n  /**\n   * Fetches the home timeline for the current user. (following feed)\n   * @param count The number of tweets to fetch.\n   * @param seenTweetIds An array of tweet IDs that have already been seen.\n   * @returns A promise that resolves to the home timeline response.\n   */\n  public async fetchFollowingTimeline(\n    count: number,\n    seenTweetIds: string[],\n  ): Promise<any[]> {\n    return await fetchFollowingTimeline(count, seenTweetIds, this.auth);\n  }\n\n  async getUserTweets(\n    userId: string,\n    maxTweets = 200,\n    cursor?: string,\n  ): Promise<{ tweets: Tweet[]; next?: string }> {\n    if (maxTweets > 200) {\n      maxTweets = 200;\n    }\n\n    const variables: Record<string, any> = {\n      userId,\n      count: maxTweets,\n      includePromotedContent: true,\n      withQuickPromoteEligibilityTweetFields: true,\n      withVoice: true,\n      withV2Timeline: true,\n    };\n\n    if (cursor) {\n      variables['cursor'] = cursor;\n    }\n\n    const features = {\n      rweb_tipjar_consumption_enabled: true,\n      responsive_web_graphql_exclude_directive_enabled: true,\n      verified_phone_label_enabled: false,\n      creator_subscriptions_tweet_preview_api_enabled: true,\n      responsive_web_graphql_timeline_navigation_enabled: true,\n      responsive_web_graphql_skip_user_profile_image_extensions_enabled: false,\n      communities_web_enable_tweet_community_results_fetch: true,\n      c9s_tweet_anatomy_moderator_badge_enabled: true,\n      articles_preview_enabled: true,\n      responsive_web_edit_tweet_api_enabled: true,\n      graphql_is_translatable_rweb_tweet_is_translatable_enabled: true,\n      view_counts_everywhere_api_enabled: true,\n      longform_notetweets_consumption_enabled: true,\n      responsive_web_twitter_article_tweet_consumption_enabled: true,\n      tweet_awards_web_tipping_enabled: false,\n      creator_subscriptions_quote_tweet_preview_enabled: false,\n      freedom_of_speech_not_reach_fetch_enabled: true,\n      standardized_nudges_misinfo: true,\n      tweet_with_visibility_results_prefer_gql_limited_actions_policy_enabled:\n        true,\n      rweb_video_timestamps_enabled: true,\n      longform_notetweets_rich_text_read_enabled: true,\n      longform_notetweets_inline_media_enabled: true,\n      responsive_web_enhance_cards_enabled: false,\n    };\n\n    const fieldToggles = {\n      withArticlePlainText: false,\n    };\n\n    const res = await requestApi<TimelineV2>(\n      `${UserTweetsUrl}?variables=${encodeURIComponent(\n        JSON.stringify(variables),\n      )}&features=${encodeURIComponent(\n        JSON.stringify(features),\n      )}&fieldToggles=${encodeURIComponent(JSON.stringify(fieldToggles))}`,\n      this.auth,\n    );\n\n    if (!res.success) {\n      throw res.err;\n    }\n\n    const timelineV2 = parseTimelineTweetsV2(res.value);\n    return {\n      tweets: timelineV2.tweets,\n      next: timelineV2.next,\n    };\n  }\n\n  async *getUserTweetsIterator(\n    userId: string,\n    maxTweets = 200,\n  ): AsyncGenerator<Tweet, void> {\n    let cursor: string | undefined;\n    let retrievedTweets = 0;\n\n    while (retrievedTweets < maxTweets) {\n      const response = await this.getUserTweets(\n        userId,\n        maxTweets - retrievedTweets,\n        cursor,\n      );\n\n      for (const tweet of response.tweets) {\n        yield tweet;\n        retrievedTweets++;\n        if (retrievedTweets >= maxTweets) {\n          break;\n        }\n      }\n\n      cursor = response.next;\n\n      if (!cursor) {\n        break;\n      }\n    }\n  }\n\n  /**\n   * Fetches the current trends from Twitter.\n   * @returns The current list of trends.\n   */\n  public getTrends(): Promise<string[]> {\n    return getTrends(this.authTrends);\n  }\n\n  /**\n   * Fetches tweets from a Twitter user.\n   * @param user The user whose tweets should be returned.\n   * @param maxTweets The maximum number of tweets to return. Defaults to `200`.\n   * @returns An {@link AsyncGenerator} of tweets from the provided user.\n   */\n  public getTweets(user: string, maxTweets = 200): AsyncGenerator<Tweet> {\n    return getTweets(user, maxTweets, this.auth);\n  }\n\n  /**\n   * Fetches tweets from a Twitter user using their ID.\n   * @param userId The user whose tweets should be returned.\n   * @param maxTweets The maximum number of tweets to return. Defaults to `200`.\n   * @returns An {@link AsyncGenerator} of tweets from the provided user.\n   */\n  public getTweetsByUserId(\n    userId: string,\n    maxTweets = 200,\n  ): AsyncGenerator<Tweet, void> {\n    return getTweetsByUserId(userId, maxTweets, this.auth);\n  }\n\n  /**\n   * Send a tweet\n   * @param text The text of the tweet\n   * @param tweetId The id of the tweet to reply to\n   * @param mediaData Optional media data\n   * @returns\n   */\n\n  async sendTweet(\n    text: string,\n    replyToTweetId?: string,\n    mediaData?: { data: Buffer; mediaType: string }[],\n  ) {\n    return await createCreateTweetRequest(\n      text,\n      this.auth,\n      replyToTweetId,\n      mediaData,\n    );\n  }\n\n  async sendNoteTweet(\n    text: string,\n    replyToTweetId?: string,\n    mediaData?: { data: Buffer; mediaType: string }[],\n  ) {\n    return await createCreateNoteTweetRequest(\n      text,\n      this.auth,\n      replyToTweetId,\n      mediaData,\n    );\n  }\n\n  /**\n   * Send a long tweet (Note Tweet)\n   * @param text The text of the tweet\n   * @param tweetId The id of the tweet to reply to\n   * @param mediaData Optional media data\n   * @returns\n   */\n  async sendLongTweet(\n    text: string,\n    replyToTweetId?: string,\n    mediaData?: { data: Buffer; mediaType: string }[],\n  ) {\n    return await createCreateLongTweetRequest(\n      text,\n      this.auth,\n      replyToTweetId,\n      mediaData,\n    );\n  }\n\n  /**\n   * Send a tweet\n   * @param text The text of the tweet\n   * @param tweetId The id of the tweet to reply to\n   * @param options The options for the tweet\n   * @returns\n   */\n\n  async sendTweetV2(\n    text: string,\n    replyToTweetId?: string,\n    options?: {\n      poll?: PollData;\n    },\n  ) {\n    return await createCreateTweetRequestV2(\n      text,\n      this.auth,\n      replyToTweetId,\n      options,\n    );\n  }\n\n  /**\n   * Fetches tweets and replies from a Twitter user.\n   * @param user The user whose tweets should be returned.\n   * @param maxTweets The maximum number of tweets to return. Defaults to `200`.\n   * @returns An {@link AsyncGenerator} of tweets from the provided user.\n   */\n  public getTweetsAndReplies(\n    user: string,\n    maxTweets = 200,\n  ): AsyncGenerator<Tweet> {\n    return getTweetsAndReplies(user, maxTweets, this.auth);\n  }\n\n  /**\n   * Fetches tweets and replies from a Twitter user using their ID.\n   * @param userId The user whose tweets should be returned.\n   * @param maxTweets The maximum number of tweets to return. Defaults to `200`.\n   * @returns An {@link AsyncGenerator} of tweets from the provided user.\n   */\n  public getTweetsAndRepliesByUserId(\n    userId: string,\n    maxTweets = 200,\n  ): AsyncGenerator<Tweet, void> {\n    return getTweetsAndRepliesByUserId(userId, maxTweets, this.auth);\n  }\n\n  /**\n   * Fetches the first tweet matching the given query.\n   *\n   * Example:\n   * ```js\n   * const timeline = scraper.getTweets('user', 200);\n   * const retweet = await scraper.getTweetWhere(timeline, { isRetweet: true });\n   * ```\n   * @param tweets The {@link AsyncIterable} of tweets to search through.\n   * @param query A query to test **all** tweets against. This may be either an\n   * object of key/value pairs or a predicate. If this query is an object, all\n   * key/value pairs must match a {@link Tweet} for it to be returned. If this query\n   * is a predicate, it must resolve to `true` for a {@link Tweet} to be returned.\n   * - All keys are optional.\n   * - If specified, the key must be implemented by that of {@link Tweet}.\n   */\n  public getTweetWhere(\n    tweets: AsyncIterable<Tweet>,\n    query: TweetQuery,\n  ): Promise<Tweet | null> {\n    return getTweetWhere(tweets, query);\n  }\n\n  /**\n   * Fetches all tweets matching the given query.\n   *\n   * Example:\n   * ```js\n   * const timeline = scraper.getTweets('user', 200);\n   * const retweets = await scraper.getTweetsWhere(timeline, { isRetweet: true });\n   * ```\n   * @param tweets The {@link AsyncIterable} of tweets to search through.\n   * @param query A query to test **all** tweets against. This may be either an\n   * object of key/value pairs or a predicate. If this query is an object, all\n   * key/value pairs must match a {@link Tweet} for it to be returned. If this query\n   * is a predicate, it must resolve to `true` for a {@link Tweet} to be returned.\n   * - All keys are optional.\n   * - If specified, the key must be implemented by that of {@link Tweet}.\n   */\n  public getTweetsWhere(\n    tweets: AsyncIterable<Tweet>,\n    query: TweetQuery,\n  ): Promise<Tweet[]> {\n    return getTweetsWhere(tweets, query);\n  }\n\n  /**\n   * Fetches the most recent tweet from a Twitter user.\n   * @param user The user whose latest tweet should be returned.\n   * @param includeRetweets Whether or not to include retweets. Defaults to `false`.\n   * @returns The {@link Tweet} object or `null`/`undefined` if it couldn't be fetched.\n   */\n  public getLatestTweet(\n    user: string,\n    includeRetweets = false,\n    max = 200,\n  ): Promise<Tweet | null | void> {\n    return getLatestTweet(user, includeRetweets, max, this.auth);\n  }\n\n  /**\n   * Fetches a single tweet.\n   * @param id The ID of the tweet to fetch.\n   * @returns The {@link Tweet} object, or `null` if it couldn't be fetched.\n   */\n  public getTweet(id: string): Promise<Tweet | null> {\n    if (this.auth instanceof TwitterUserAuth) {\n      return getTweet(id, this.auth);\n    } else {\n      return getTweetAnonymous(id, this.auth);\n    }\n  }\n\n  /**\n   * Fetches a single tweet by ID using the Twitter API v2.\n   * Allows specifying optional expansions and fields for more detailed data.\n   *\n   * @param {string} id - The ID of the tweet to fetch.\n   * @param {Object} [options] - Optional parameters to customize the tweet data.\n   * @param {string[]} [options.expansions] - Array of expansions to include, e.g., 'attachments.poll_ids'.\n   * @param {string[]} [options.tweetFields] - Array of tweet fields to include, e.g., 'created_at', 'public_metrics'.\n   * @param {string[]} [options.pollFields] - Array of poll fields to include, if the tweet has a poll, e.g., 'options', 'end_datetime'.\n   * @param {string[]} [options.mediaFields] - Array of media fields to include, if the tweet includes media, e.g., 'url', 'preview_image_url'.\n   * @param {string[]} [options.userFields] - Array of user fields to include, if user information is requested, e.g., 'username', 'verified'.\n   * @param {string[]} [options.placeFields] - Array of place fields to include, if the tweet includes location data, e.g., 'full_name', 'country'.\n   * @returns {Promise<TweetV2 | null>} - The tweet data, including requested expansions and fields.\n   */\n  async getTweetV2(\n    id: string,\n    options: {\n      expansions?: TTweetv2Expansion[];\n      tweetFields?: TTweetv2TweetField[];\n      pollFields?: TTweetv2PollField[];\n      mediaFields?: TTweetv2MediaField[];\n      userFields?: TTweetv2UserField[];\n      placeFields?: TTweetv2PlaceField[];\n    } = defaultOptions,\n  ): Promise<Tweet | null> {\n    return await getTweetV2(id, this.auth, options);\n  }\n\n  /**\n   * Fetches multiple tweets by IDs using the Twitter API v2.\n   * Allows specifying optional expansions and fields for more detailed data.\n   *\n   * @param {string[]} ids - Array of tweet IDs to fetch.\n   * @param {Object} [options] - Optional parameters to customize the tweet data.\n   * @param {string[]} [options.expansions] - Array of expansions to include, e.g., 'attachments.poll_ids'.\n   * @param {string[]} [options.tweetFields] - Array of tweet fields to include, e.g., 'created_at', 'public_metrics'.\n   * @param {string[]} [options.pollFields] - Array of poll fields to include, if tweets contain polls, e.g., 'options', 'end_datetime'.\n   * @param {string[]} [options.mediaFields] - Array of media fields to include, if tweets contain media, e.g., 'url', 'preview_image_url'.\n   * @param {string[]} [options.userFields] - Array of user fields to include, if user information is requested, e.g., 'username', 'verified'.\n   * @param {string[]} [options.placeFields] - Array of place fields to include, if tweets contain location data, e.g., 'full_name', 'country'.\n   * @returns {Promise<TweetV2[]> } - Array of tweet data, including requested expansions and fields.\n   */\n  async getTweetsV2(\n    ids: string[],\n    options: {\n      expansions?: TTweetv2Expansion[];\n      tweetFields?: TTweetv2TweetField[];\n      pollFields?: TTweetv2PollField[];\n      mediaFields?: TTweetv2MediaField[];\n      userFields?: TTweetv2UserField[];\n      placeFields?: TTweetv2PlaceField[];\n    } = defaultOptions,\n  ): Promise<Tweet[]> {\n    return await getTweetsV2(ids, this.auth, options);\n  }\n\n  /**\n   * Returns if the scraper has a guest token. The token may not be valid.\n   * @returns `true` if the scraper has a guest token; otherwise `false`.\n   */\n  public hasGuestToken(): boolean {\n    return this.auth.hasToken() || this.authTrends.hasToken();\n  }\n\n  /**\n   * Returns if the scraper is logged in as a real user.\n   * @returns `true` if the scraper is logged in with a real user account; otherwise `false`.\n   */\n  public async isLoggedIn(): Promise<boolean> {\n    return (\n      (await this.auth.isLoggedIn()) && (await this.authTrends.isLoggedIn())\n    );\n  }\n\n  /**\n   * Returns the currently logged in user\n   * @returns The currently logged in user\n   */\n  public async me(): Promise<Profile | undefined> {\n    return this.auth.me();\n  }\n\n  /**\n   * Login to Twitter as a real Twitter account. This enables running\n   * searches.\n   * @param username The username of the Twitter account to login with.\n   * @param password The password of the Twitter account to login with.\n   * @param email The email to log in with, if you have email confirmation enabled.\n   * @param twoFactorSecret The secret to generate two factor authentication tokens with, if you have two factor authentication enabled.\n   */\n  public async login(\n    username: string,\n    password: string,\n    email?: string,\n    twoFactorSecret?: string,\n    appKey?: string,\n    appSecret?: string,\n    accessToken?: string,\n    accessSecret?: string,\n  ): Promise<void> {\n    // Swap in a real authorizer for all requests\n    const userAuth = new TwitterUserAuth(this.token, this.getAuthOptions());\n    await userAuth.login(\n      username,\n      password,\n      email,\n      twoFactorSecret,\n      appKey,\n      appSecret,\n      accessToken,\n      accessSecret,\n    );\n    this.auth = userAuth;\n    this.authTrends = userAuth;\n  }\n\n  /**\n   * Log out of Twitter.\n   */\n  public async logout(): Promise<void> {\n    await this.auth.logout();\n    await this.authTrends.logout();\n\n    // Swap in guest authorizers for all requests\n    this.useGuestAuth();\n  }\n\n  /**\n   * Retrieves all cookies for the current session.\n   * @returns All cookies for the current session.\n   */\n  public async getCookies(): Promise<Cookie[]> {\n    return await this.authTrends\n      .cookieJar()\n      .getCookies(\n        typeof document !== 'undefined' ? document.location.toString() : twUrl,\n      );\n  }\n\n  /**\n   * Set cookies for the current session.\n   * @param cookies The cookies to set for the current session.\n   */\n  public async setCookies(cookies: (string | Cookie)[]): Promise<void> {\n    const userAuth = new TwitterUserAuth(this.token, this.getAuthOptions());\n    for (const cookie of cookies) {\n      await userAuth.cookieJar().setCookie(cookie, twUrl);\n    }\n\n    this.auth = userAuth;\n    this.authTrends = userAuth;\n  }\n\n  /**\n   * Clear all cookies for the current session.\n   */\n  public async clearCookies(): Promise<void> {\n    await this.auth.cookieJar().removeAllCookies();\n    await this.authTrends.cookieJar().removeAllCookies();\n  }\n\n  /**\n   * Sets the optional cookie to be used in requests.\n   * @param _cookie The cookie to be used in requests.\n   * @deprecated This function no longer represents any part of Twitter's auth flow.\n   * @returns This scraper instance.\n   */\n  // eslint-disable-next-line @typescript-eslint/no-unused-vars\n  public withCookie(_cookie: string): Scraper {\n    console.warn(\n      'Warning: Scraper#withCookie is deprecated and will be removed in a later version. Use Scraper#login or Scraper#setCookies instead.',\n    );\n    return this;\n  }\n\n  /**\n   * Sets the optional CSRF token to be used in requests.\n   * @param _token The CSRF token to be used in requests.\n   * @deprecated This function no longer represents any part of Twitter's auth flow.\n   * @returns This scraper instance.\n   */\n  // eslint-disable-next-line @typescript-eslint/no-unused-vars\n  public withXCsrfToken(_token: string): Scraper {\n    console.warn(\n      'Warning: Scraper#withXCsrfToken is deprecated and will be removed in a later version.',\n    );\n    return this;\n  }\n\n  /**\n   * Sends a quote tweet.\n   * @param text The text of the tweet.\n   * @param quotedTweetId The ID of the tweet to quote.\n   * @param options Optional parameters, such as media data.\n   * @returns The response from the Twitter API.\n   */\n  public async sendQuoteTweet(\n    text: string,\n    quotedTweetId: string,\n    options?: {\n      mediaData: { data: Buffer; mediaType: string }[];\n    },\n  ) {\n    return await createQuoteTweetRequest(\n      text,\n      quotedTweetId,\n      this.auth,\n      options?.mediaData,\n    );\n  }\n\n  /**\n   * Likes a tweet with the given tweet ID.\n   * @param tweetId The ID of the tweet to like.\n   * @returns A promise that resolves when the tweet is liked.\n   */\n  public async likeTweet(tweetId: string): Promise<void> {\n    // Call the likeTweet function from tweets.ts\n    await likeTweet(tweetId, this.auth);\n  }\n\n  /**\n   * Retweets a tweet with the given tweet ID.\n   * @param tweetId The ID of the tweet to retweet.\n   * @returns A promise that resolves when the tweet is retweeted.\n   */\n  public async retweet(tweetId: string): Promise<void> {\n    // Call the retweet function from tweets.ts\n    await retweet(tweetId, this.auth);\n  }\n\n  /**\n   * Follows a user with the given user ID.\n   * @param userId The user ID of the user to follow.\n   * @returns A promise that resolves when the user is followed.\n   */\n  public async followUser(userName: string): Promise<void> {\n    // Call the followUser function from relationships.ts\n    await followUser(userName, this.auth);\n  }\n\n  /**\n   * Fetches direct message conversations\n   * @param count Number of conversations to fetch (default: 50)\n   * @param cursor Pagination cursor for fetching more conversations\n   * @returns Array of DM conversations and other details\n   */\n  public async getDirectMessageConversations(\n    userId: string,\n    cursor?: string,\n  ): Promise<DirectMessagesResponse> {\n    return await getDirectMessageConversations(userId, this.auth, cursor);\n  }\n\n  /**\n   * Sends a direct message to a user.\n   * @param conversationId The ID of the conversation to send the message to.\n   * @param text The text of the message to send.\n   * @returns The response from the Twitter API.\n   */\n  public async sendDirectMessage(\n    conversationId: string,\n    text: string,\n  ): Promise<SendDirectMessageResponse> {\n    return await sendDirectMessage(this.auth, conversationId, text);\n  }\n\n  private getAuthOptions(): Partial<TwitterAuthOptions> {\n    return {\n      fetch: this.options?.fetch,\n      transform: this.options?.transform,\n    };\n  }\n\n  private handleResponse<T>(res: RequestApiResult<T>): T {\n    if (!res.success) {\n      throw res.err;\n    }\n\n    return res.value;\n  }\n\n  /**\n   * Retrieves the details of an Audio Space by its ID.\n   * @param id The ID of the Audio Space.\n   * @returns The details of the Audio Space.\n   */\n  public async getAudioSpaceById(id: string): Promise<AudioSpace> {\n    const variables = {\n      id,\n      isMetatagsQuery: false,\n      withReplays: true,\n      withListeners: true,\n    };\n\n    return await fetchAudioSpaceById(variables, this.auth);\n  }\n\n  /**\n   * Retrieves available space topics.\n   * @returns An array of space topics.\n   */\n  public async browseSpaceTopics(): Promise<Subtopic[]> {\n    return await fetchBrowseSpaceTopics(this.auth);\n  }\n\n  /**\n   * Retrieves available communities.\n   * @returns An array of communities.\n   */\n  public async communitySelectQuery(): Promise<Community[]> {\n    return await fetchCommunitySelectQuery(this.auth);\n  }\n\n  /**\n   * Retrieves the status of an Audio Space stream by its media key.\n   * @param mediaKey The media key of the Audio Space.\n   * @returns The status of the Audio Space stream.\n   */\n  public async getAudioSpaceStreamStatus(\n      mediaKey: string,\n  ): Promise<LiveVideoStreamStatus> {\n    return await fetchLiveVideoStreamStatus(mediaKey, this.auth);\n  }\n\n  /**\n   * Retrieves the status of an Audio Space by its ID.\n   * This method internally fetches the Audio Space to obtain the media key,\n   * then retrieves the stream status using the media key.\n   * @param audioSpaceId The ID of the Audio Space.\n   * @returns The status of the Audio Space stream.\n   */\n  public async getAudioSpaceStatus(\n      audioSpaceId: string,\n  ): Promise<LiveVideoStreamStatus> {\n    const audioSpace = await this.getAudioSpaceById(audioSpaceId);\n\n    const mediaKey = audioSpace.metadata.media_key;\n    if (!mediaKey) {\n      throw new Error('Media Key not found in Audio Space metadata.');\n    }\n\n    return await this.getAudioSpaceStreamStatus(mediaKey);\n  }\n\n  /**\n   * Authenticates Periscope to obtain a token.\n   * @returns The Periscope authentication token.\n   */\n  public async authenticatePeriscope(): Promise<string> {\n    return await fetchAuthenticatePeriscope(this.auth);\n  }\n\n  /**\n   * Logs in to Twitter via Proxsee using the Periscope JWT.\n   * @param jwt The JWT obtained from AuthenticatePeriscope.\n   * @returns The response containing the cookie and user information.\n   */\n  public async loginTwitterToken(\n      jwt: string,\n  ): Promise<LoginTwitterTokenResponse> {\n    return await fetchLoginTwitterToken(jwt, this.auth);\n  }\n\n  /**\n   * Orchestrates the flow: get token -> login -> return Periscope cookie\n   */\n  public async getPeriscopeCookie(): Promise<string> {\n    const periscopeToken = await this.authenticatePeriscope();\n\n    const loginResponse = await this.loginTwitterToken(periscopeToken);\n\n    return loginResponse.cookie;\n  }\n}\n","// src/core/ChatClient.ts\n\nimport WebSocket from 'ws';\nimport { EventEmitter } from 'events';\nimport type { SpeakerRequest, OccupancyUpdate } from '../types';\n\nexport class ChatClient extends EventEmitter {\n  private ws?: WebSocket;\n  private connected = false;\n\n  constructor(\n    private readonly spaceId: string,\n    private readonly accessToken: string,\n    private readonly endpoint: string,\n  ) {\n    super();\n  }\n\n  async connect() {\n    const wsUrl = `${this.endpoint}/chatapi/v1/chatnow`.replace(\n      'https://',\n      'wss://',\n    );\n    console.log('[ChatClient] Connecting =>', wsUrl);\n\n    this.ws = new WebSocket(wsUrl, {\n      headers: {\n        Origin: 'https://x.com',\n        'User-Agent': 'Mozilla/5.0',\n      },\n    });\n\n    await this.setupHandlers();\n  }\n\n  private setupHandlers(): Promise<void> {\n    if (!this.ws) throw new Error('No WebSocket instance');\n\n    return new Promise((resolve, reject) => {\n      this.ws!.on('open', () => {\n        console.log('[ChatClient] Connected');\n        this.connected = true;\n        this.sendAuthAndJoin();\n        resolve();\n      });\n\n      this.ws!.on('message', (data) => {\n        this.handleMessage(data.toString());\n      });\n\n      this.ws!.on('close', () => {\n        console.log('[ChatClient] Closed');\n        this.connected = false;\n        this.emit('disconnected');\n      });\n\n      this.ws!.on('error', (err) => {\n        console.error('[ChatClient] Error =>', err);\n        reject(err);\n      });\n    });\n  }\n\n  private sendAuthAndJoin() {\n    if (!this.ws) return;\n    // Auth\n    this.ws.send(\n      JSON.stringify({\n        payload: JSON.stringify({ access_token: this.accessToken }),\n        kind: 3,\n      }),\n    );\n    // Join\n    this.ws.send(\n      JSON.stringify({\n        payload: JSON.stringify({\n          body: JSON.stringify({ room: this.spaceId }),\n          kind: 1,\n        }),\n        kind: 2,\n      }),\n    );\n  }\n\n  reactWithEmoji(emoji: string) {\n    if (!this.ws) return;\n    const payload = JSON.stringify({\n      body: JSON.stringify({ body: emoji, type: 2, v: 2 }),\n      kind: 1,\n      /*\n      // The 'sender' field is not required, it's not even verified by the server\n      // Instead of passing attributes down here it's easier to ignore it\n      sender: {\n        user_id: null,\n        twitter_id: null,\n        username: null,\n        display_name: null,\n      },\n      */\n      payload: JSON.stringify({\n        room: this.spaceId,\n        body: JSON.stringify({ body: emoji, type: 2, v: 2 }),\n      }),\n      type: 2,\n    });\n    this.ws.send(payload);\n  }\n\n  private handleMessage(raw: string) {\n    let msg: any;\n    try {\n      msg = JSON.parse(raw);\n    } catch {\n      return;\n    }\n    if (!msg.payload) return;\n\n    const payload = safeJson(msg.payload);\n    if (!payload?.body) return;\n\n    const body = safeJson(payload.body);\n\n    // Example of speaker request detection\n    if (body.guestBroadcastingEvent === 1) {\n      const req: SpeakerRequest = {\n        userId: body.guestRemoteID,\n        username: body.guestUsername,\n        displayName: payload.sender?.display_name || body.guestUsername,\n        sessionUUID: body.sessionUUID,\n      };\n      this.emit('speakerRequest', req);\n    }\n\n    // Example of occupancy update\n    if (typeof body.occupancy === 'number') {\n      const update: OccupancyUpdate = {\n        occupancy: body.occupancy,\n        totalParticipants: body.total_participants || 0,\n      };\n      this.emit('occupancyUpdate', update);\n    }\n\n    // Example of mute state\n    if (body.guestBroadcastingEvent === 16) {\n      this.emit('muteStateChanged', {\n        userId: body.guestRemoteID,\n        muted: true,\n      });\n    }\n    if (body.guestBroadcastingEvent === 17) {\n      this.emit('muteStateChanged', {\n        userId: body.guestRemoteID,\n        muted: false,\n      });\n    }\n    // Example of guest reaction\n    if (body?.type === 2) {\n      console.log('[ChatClient] Emiting guest reaction event =>', body);\n      this.emit('guestReaction', {\n        displayName: body.displayName,\n        emoji: body.body,\n      });\n    }\n  }\n\n  async disconnect() {\n    if (this.ws) {\n      this.ws.close();\n      this.ws = undefined;\n      this.connected = false;\n    }\n  }\n}\n\nfunction safeJson(text: string): any {\n  try {\n    return JSON.parse(text);\n  } catch {\n    return null;\n  }\n}\n","// src/core/audio.ts\n\nimport { EventEmitter } from 'events';\nimport wrtc from '@roamhq/wrtc';\nconst { nonstandard } = wrtc;\nconst { RTCAudioSource, RTCAudioSink } = nonstandard;\n\nexport class JanusAudioSource extends EventEmitter {\n  private source: any;\n  private track: MediaStreamTrack;\n\n  constructor() {\n    super();\n    this.source = new RTCAudioSource();\n    this.track = this.source.createTrack();\n  }\n\n  getTrack() {\n    return this.track;\n  }\n\n  pushPcmData(samples: Int16Array, sampleRate: number, channels = 1) {\n    this.source.onData({\n      samples,\n      sampleRate,\n      bitsPerSample: 16,\n      channelCount: channels,\n      numberOfFrames: samples.length / channels,\n    });\n  }\n}\n\nexport class JanusAudioSink extends EventEmitter {\n  private sink: any;\n  private active = true;\n\n  constructor(track: MediaStreamTrack) {\n    super();\n    if (track.kind !== 'audio')\n      throw new Error('JanusAudioSink must be an audio track');\n\n    this.sink = new RTCAudioSink(track);\n\n    this.sink.ondata = (frame: {\n      samples: Int16Array;\n      sampleRate: number;\n      bitsPerSample: number;\n      channelCount: number;\n    }) => {\n      if (!this.active) return;\n      this.emit('audioData', frame);\n    };\n  }\n\n  stop() {\n    this.active = false;\n    this.sink?.stop();\n  }\n}\n","// src/core/JanusClient.ts\n\nimport { EventEmitter } from 'events';\nimport wrtc from '@roamhq/wrtc';\nconst { RTCPeerConnection, MediaStream } = wrtc;\nimport { JanusAudioSink, JanusAudioSource } from './JanusAudioSource';\nimport type { AudioDataWithUser, TurnServersInfo } from '../types';\n\ninterface JanusConfig {\n  webrtcUrl: string;\n  roomId: string;\n  credential: string;\n  userId: string;\n  streamName: string;\n  turnServers: TurnServersInfo;\n}\n\n/**\n * This class is in charge of the Janus session, handle,\n * joining the videoroom, and polling events.\n */\nexport class JanusClient extends EventEmitter {\n  private sessionId?: number;\n  private handleId?: number;\n  private publisherId?: number;\n  private pc?: RTCPeerConnection;\n  private localAudioSource?: JanusAudioSource;\n  private pollActive = false;\n  private eventWaiters: Array<{\n    predicate: (evt: any) => boolean;\n    resolve: (value: any) => void;\n    reject: (error: Error) => void;\n  }> = [];\n  private subscribers = new Map<\n    string,\n    {\n      handleId: number;\n      pc: RTCPeerConnection;\n    }\n  >();\n\n  constructor(private readonly config: JanusConfig) {\n    super();\n  }\n\n  async initialize() {\n    // 1) Create session\n    this.sessionId = await this.createSession();\n\n    // 2) Attach plugin\n    this.handleId = await this.attachPlugin();\n\n    // 3) Start polling events right now\n    this.pollActive = true;\n    this.startPolling();\n\n    // 4) Create room\n    await this.createRoom();\n\n    // 3) Join room\n    this.publisherId = await this.joinRoom();\n\n    // 4) Create local RTCPeerConnection\n    this.pc = new RTCPeerConnection({\n      iceServers: [\n        {\n          urls: this.config.turnServers.uris,\n          username: this.config.turnServers.username,\n          credential: this.config.turnServers.password,\n        },\n      ],\n    });\n    this.setupPeerEvents();\n\n    this.enableLocalAudio();\n    // 6) Do the initial configure -> generate Offer -> setLocalDesc -> send -> setRemoteDesc\n    await this.configurePublisher();\n\n    console.log('[JanusClient] Initialization complete');\n  }\n\n  public async subscribeSpeaker(userId: string): Promise<void> {\n    console.log('[JanusClient] subscribeSpeaker => userId=', userId);\n\n    // 1) Attach plugin as subscriber\n    const subscriberHandleId = await this.attachPlugin();\n    console.log('[JanusClient] subscriber handle =>', subscriberHandleId);\n\n    // 2) Wait for an event with \"publishers\" to discover feedId\n    //    We do *not* check sender === subscriberHandleId because Hydra\n    //    might send it from the main handle or another handle.\n    const publishersEvt = await this.waitForJanusEvent(\n      (e) =>\n        e.janus === 'event' &&\n        e.plugindata?.plugin === 'janus.plugin.videoroom' &&\n        e.plugindata?.data?.videoroom === 'event' &&\n        Array.isArray(e.plugindata?.data?.publishers) &&\n        e.plugindata?.data?.publishers.length > 0,\n      8000,\n      'discover feed_id from \"publishers\"',\n    );\n\n    // Extract the feedId from the first publisher whose 'display' or 'periscope_user_id' = userId\n    // (in your logs, 'display' or 'periscope_user_id' is the actual user)\n    const list = publishersEvt.plugindata.data.publishers as any[];\n    const pub = list.find(\n      (p) => p.display === userId || p.periscope_user_id === userId,\n    );\n    if (!pub) {\n      throw new Error(\n        `[JanusClient] subscribeSpeaker => No publisher found for userId=${userId}`,\n      );\n    }\n    const feedId = pub.id;\n    console.log('[JanusClient] found feedId =>', feedId);\n    this.emit('subscribedSpeaker', { userId, feedId });\n\n    // 3) \"join\" as subscriber with \"streams: [{ feed, mid: '0', send: true }]\"\n    const joinBody = {\n      request: 'join',\n      room: this.config.roomId,\n      periscope_user_id: this.config.userId,\n      ptype: 'subscriber',\n      streams: [\n        {\n          feed: feedId,\n          mid: '0',\n          send: true,\n        },\n      ],\n    };\n    await this.sendJanusMessage(subscriberHandleId, joinBody);\n\n    // 4) Wait for \"attached\" + jsep.offer from *this subscriber handle*\n    //    Now we do filter on e.sender === subscriberHandleId\n    const attachedEvt = await this.waitForJanusEvent(\n      (e) =>\n        e.janus === 'event' &&\n        e.sender === subscriberHandleId &&\n        e.plugindata?.plugin === 'janus.plugin.videoroom' &&\n        e.plugindata?.data?.videoroom === 'attached' &&\n        e.jsep?.type === 'offer',\n      8000,\n      'subscriber attached + offer',\n    );\n    console.log('[JanusClient] subscriber => \"attached\" with offer');\n\n    const offer = attachedEvt.jsep;\n\n    // 5) Create subPc, setRemoteDescription(offer), createAnswer, setLocalDescription(answer)\n    const subPc = new RTCPeerConnection({\n      iceServers: [\n        {\n          urls: this.config.turnServers.uris,\n          username: this.config.turnServers.username,\n          credential: this.config.turnServers.password,\n        },\n      ],\n    });\n\n    // Ontrack => parse PCM via JanusAudioSink\n    subPc.ontrack = (evt) => {\n      console.log('[JanusClient] subscriber track =>', evt.track.kind);\n\n      // TODO: REMOVE DEBUG\n      // console.log(\n      //   '[JanusClient] subscriber track => kind=',\n      //   evt.track.kind,\n      //   'readyState=',\n      //   evt.track.readyState,\n      //   'muted=',\n      //   evt.track.muted,\n      // );\n\n      const sink = new JanusAudioSink(evt.track);\n      sink.on('audioData', (frame) => {\n        // TODO: REMOVE DEBUG\n        // console.log(\n        //   '[AudioSink] got an audio frame => sampleRate=',\n        //   frame.sampleRate,\n        //   'length=',\n        //   frame.samples.length,\n        // );\n        // console.log(\n        //   '[AudioSink] sampleRate=',\n        //   frame.sampleRate,\n        //   'channels=',\n        //   frame.channelCount,\n        // );\n        // const { samples } = frame; // Int16Array\n        // let maxVal = 0;\n        // for (let i = 0; i < samples.length; i++) {\n        //   const val = Math.abs(samples[i]);\n        //   if (val > maxVal) maxVal = val;\n        // }\n        // console.log(`[AudioSink] userId=${userId}, maxAmplitude=${maxVal}`);\n\n        this.emit('audioDataFromSpeaker', {\n          userId,\n          bitsPerSample: frame.bitsPerSample,\n          sampleRate: frame.sampleRate,\n          numberOfFrames: frame.numberOfFrames,\n          channelCount: frame.channelCount,\n          samples: frame.samples,\n        } as AudioDataWithUser);\n      });\n    };\n\n    await subPc.setRemoteDescription(offer);\n    const answer = await subPc.createAnswer();\n    await subPc.setLocalDescription(answer);\n\n    // 6) Send \"start\" with jsep=answer\n    await this.sendJanusMessage(\n      subscriberHandleId,\n      {\n        request: 'start',\n        room: this.config.roomId,\n        periscope_user_id: this.config.userId,\n      },\n      answer,\n    );\n    console.log('[JanusClient] subscriber => done (user=', userId, ')');\n\n    // Store for potential cleanup\n    this.subscribers.set(userId, { handleId: subscriberHandleId, pc: subPc });\n  }\n\n  pushLocalAudio(samples: Int16Array, sampleRate: number, channels = 1) {\n    if (!this.localAudioSource) {\n      console.warn('[JanusClient] No localAudioSource; enabling now...');\n      this.enableLocalAudio();\n    }\n    this.localAudioSource?.pushPcmData(samples, sampleRate, channels);\n  }\n\n  enableLocalAudio() {\n    if (!this.pc) {\n      console.warn('[JanusClient] No RTCPeerConnection');\n      return;\n    }\n    if (this.localAudioSource) {\n      console.log('[JanusClient] localAudioSource already active');\n      return;\n    }\n    this.localAudioSource = new JanusAudioSource();\n    const track = this.localAudioSource.getTrack();\n    const localStream = new MediaStream();\n    localStream.addTrack(track);\n    this.pc.addTrack(track, localStream);\n  }\n\n  async stop() {\n    console.log('[JanusClient] Stopping...');\n    this.pollActive = false;\n    // leave the room, etc.\n    // close PC\n    if (this.pc) {\n      this.pc.close();\n      this.pc = undefined;\n    }\n  }\n\n  getSessionId() {\n    return this.sessionId;\n  }\n  getHandleId() {\n    return this.handleId;\n  }\n  getPublisherId() {\n    return this.publisherId;\n  }\n\n  // ------------------- Private Methods --------------------\n\n  private async createSession(): Promise<number> {\n    const transaction = this.randomTid();\n    const resp = await fetch(this.config.webrtcUrl, {\n      method: 'POST',\n      headers: {\n        Authorization: this.config.credential,\n        'Content-Type': 'application/json',\n        Referer: 'https://x.com',\n      },\n      body: JSON.stringify({\n        janus: 'create',\n        transaction,\n      }),\n    });\n    if (!resp.ok) throw new Error('[JanusClient] createSession failed');\n    const json = await resp.json();\n    if (json.janus !== 'success')\n      throw new Error('[JanusClient] createSession invalid response');\n    return json.data.id; // sessionId\n  }\n\n  private async attachPlugin(): Promise<number> {\n    if (!this.sessionId) throw new Error('[JanusClient] no sessionId');\n\n    const transaction = this.randomTid();\n    const resp = await fetch(`${this.config.webrtcUrl}/${this.sessionId}`, {\n      method: 'POST',\n      headers: {\n        Authorization: this.config.credential,\n        'Content-Type': 'application/json',\n      },\n      body: JSON.stringify({\n        janus: 'attach',\n        plugin: 'janus.plugin.videoroom',\n        transaction,\n      }),\n    });\n    if (!resp.ok) throw new Error('[JanusClient] attachPlugin failed');\n    const json = await resp.json();\n    if (json.janus !== 'success')\n      throw new Error('[JanusClient] attachPlugin invalid response');\n    return json.data.id;\n  }\n\n  private async createRoom() {\n    if (!this.sessionId || !this.handleId) {\n      throw new Error('[JanusClient] No session/handle');\n    }\n\n    const transaction = this.randomTid();\n    const body = {\n      request: 'create',\n      room: this.config.roomId,\n      periscope_user_id: this.config.userId,\n      audiocodec: 'opus',\n      videocodec: 'h264',\n      transport_wide_cc_ext: true,\n      app_component: 'audio-room',\n      h264_profile: '42e01f',\n      dummy_publisher: false,\n    };\n\n    // Send the \"create\" request\n    const resp = await fetch(\n      `${this.config.webrtcUrl}/${this.sessionId}/${this.handleId}`,\n      {\n        method: 'POST',\n        headers: {\n          Authorization: this.config.credential,\n          'Content-Type': 'application/json',\n          Referer: 'https://x.com',\n        },\n        body: JSON.stringify({\n          janus: 'message',\n          transaction,\n          body,\n        }),\n      },\n    );\n\n    if (!resp.ok) {\n      throw new Error(`[JanusClient] createRoom failed => ${resp.status}`);\n    }\n\n    const json = await resp.json();\n    console.log('[JanusClient] createRoom =>', JSON.stringify(json));\n\n    // Check if Janus responded with videoroom:\"created\"\n    if (json.janus === 'error') {\n      throw new Error(\n        `[JanusClient] createRoom error => ${\n          json.error?.reason || 'Unknown error'\n        }`,\n      );\n    }\n\n    if (json.plugindata?.data?.videoroom !== 'created') {\n      throw new Error(\n        `[JanusClient] unexpected createRoom response => ${JSON.stringify(\n          json,\n        )}`,\n      );\n    }\n\n    console.log(\n      `[JanusClient] Room '${this.config.roomId}' created successfully`,\n    );\n  }\n\n  private async joinRoom(): Promise<number> {\n    if (!this.sessionId || !this.handleId)\n      throw new Error('[JanusClient] no session/handle');\n\n    // Wait for the event that indicates we joined\n    // Typically:  evt.janus === 'event' && evt.plugindata?.data?.videoroom === 'joined'\n    const evtPromise = this.waitForJanusEvent(\n      (e) => {\n        return (\n          e.janus === 'event' &&\n          e.plugindata?.plugin === 'janus.plugin.videoroom' &&\n          e.plugindata?.data?.videoroom === 'joined'\n        );\n      },\n      12000,\n      'Host Joined Event',\n    );\n\n    const body = {\n      request: 'join',\n      room: this.config.roomId,\n      ptype: 'publisher',\n      display: this.config.userId,\n      periscope_user_id: this.config.userId,\n    };\n    await this.sendJanusMessage(this.handleId, body);\n\n    const evt = await evtPromise;\n\n    const publisherId = evt.plugindata.data.id;\n    console.log('[JanusClient] joined room => publisherId=', publisherId);\n    return publisherId;\n  }\n\n  private async configurePublisher() {\n    if (!this.pc || !this.sessionId || !this.handleId) return;\n\n    console.log('[JanusClient] createOffer...');\n    const offer = await this.pc.createOffer({\n      offerToReceiveAudio: true,\n      offerToReceiveVideo: false,\n    });\n    await this.pc.setLocalDescription(offer);\n\n    console.log('[JanusClient] sending configure with JSEP...');\n    await this.sendJanusMessage(\n      this.handleId,\n      {\n        request: 'configure',\n        room: this.config.roomId,\n        periscope_user_id: this.config.userId,\n        session_uuid: '',\n        stream_name: this.config.streamName,\n        vidman_token: this.config.credential,\n      },\n      offer,\n    );\n\n    console.log('[JanusClient] waiting for answer...');\n    // In a real scenario, we do an event-based wait for jsep.type === 'answer'.\n    // For MVP, let's do a poll in handleJanusEvent for that \"answer\" and setRemoteDesc\n  }\n\n  private async sendJanusMessage(\n    handleId: number,\n    body: any,\n    jsep?: any,\n  ): Promise<void> {\n    if (!this.sessionId) {\n      throw new Error('[JanusClient] No session');\n    }\n    const transaction = this.randomTid();\n\n    const resp = await fetch(\n      `${this.config.webrtcUrl}/${this.sessionId}/${handleId}`,\n      {\n        method: 'POST',\n        headers: {\n          Authorization: this.config.credential,\n          'Content-Type': 'application/json',\n        },\n        body: JSON.stringify({\n          janus: 'message',\n          transaction,\n          body,\n          jsep,\n        }),\n      },\n    );\n\n    if (!resp.ok) {\n      throw new Error(\n        '[JanusClient] sendJanusMessage failed => ' + resp.status,\n      );\n    }\n  }\n\n  private startPolling() {\n    console.log('[JanusClient] Starting polling...');\n    const doPoll = async () => {\n      if (!this.pollActive || !this.sessionId) {\n        console.log('[JanusClient] Polling stopped');\n        return;\n      }\n      try {\n        const url = `${this.config.webrtcUrl}/${\n          this.sessionId\n        }?maxev=1&_=${Date.now()}`;\n        const resp = await fetch(url, {\n          headers: { Authorization: this.config.credential },\n        });\n        if (resp.ok) {\n          const event = await resp.json();\n          this.handleJanusEvent(event);\n        } else {\n          console.log('[JanusClient] poll error =>', resp.status);\n        }\n      } catch (err) {\n        console.error('[JanusClient] poll exception =>', err);\n      }\n      setTimeout(doPoll, 500);\n    };\n    doPoll();\n  }\n\n  private handleJanusEvent(evt: any) {\n    // TODO: REMOVE DEBUG\n    // console.log('[JanusClient] handleJanusEvent =>', JSON.stringify(evt));\n\n    if (!evt.janus) return;\n    if (evt.janus === 'keepalive') {\n      return;\n    }\n    if (evt.janus === 'webrtcup') {\n      console.log('[JanusClient] webrtcup =>', evt.sender);\n    }\n    if (evt.jsep && evt.jsep.type === 'answer') {\n      this.onReceivedAnswer(evt.jsep);\n    }\n    if (evt.plugindata?.data?.id) {\n      // e.g. publisherId\n      this.publisherId = evt.plugindata.data.id;\n    }\n    if (evt.error) {\n      console.error('[JanusClient] Janus error =>', evt.error.reason);\n      this.emit('error', new Error(evt.error.reason));\n    }\n\n    for (let i = 0; i < this.eventWaiters.length; i++) {\n      const waiter = this.eventWaiters[i];\n      if (waiter.predicate(evt)) {\n        // remove from the array\n        this.eventWaiters.splice(i, 1);\n        // resolve the promise\n        waiter.resolve(evt);\n        break; // important: only resolve one waiter\n      }\n    }\n    // Add more logic if needed\n  }\n\n  private async onReceivedAnswer(answer: any) {\n    if (!this.pc) return;\n    console.log('[JanusClient] got answer => setRemoteDescription');\n    await this.pc.setRemoteDescription(answer);\n  }\n\n  private setupPeerEvents() {\n    if (!this.pc) return;\n\n    this.pc.addEventListener('iceconnectionstatechange', () => {\n      // TODO: REMOVE DEBUG\n      // console.log('[JanusClient] ICE state =>', this.pc?.iceConnectionState);\n\n      if (this.pc?.iceConnectionState === 'failed') {\n        this.emit('error', new Error('ICE connection failed'));\n      }\n    });\n\n    this.pc.addEventListener('track', (evt) => {\n      console.log('[JanusClient] track =>', evt.track.kind);\n      // Here you can attach a JanusAudioSink to parse PCM frames\n    });\n  }\n\n  private randomTid() {\n    return Math.random().toString(36).slice(2, 10);\n  }\n\n  /**\n   * Allows code to wait for a specific Janus event that matches a predicate\n   */\n  private async waitForJanusEvent(\n    predicate: (evt: any) => boolean,\n    timeoutMs = 5000,\n    description = 'some event',\n  ): Promise<any> {\n    return new Promise((resolve, reject) => {\n      const waiter = {\n        predicate,\n        resolve,\n        reject,\n      };\n      this.eventWaiters.push(waiter);\n\n      setTimeout(() => {\n        const idx = this.eventWaiters.indexOf(waiter);\n        if (idx !== -1) {\n          this.eventWaiters.splice(idx, 1);\n          console.log(\n            `[JanusClient] waitForJanusEvent => timed out waiting for: ${description}`,\n          );\n          reject(\n            new Error(\n              `[JanusClient] waitForJanusEvent (expecting \"${description}\") timed out after ${timeoutMs}ms`,\n            ),\n          );\n        }\n      }, timeoutMs);\n    });\n  }\n\n  public async destroyRoom(): Promise<void> {\n    if (!this.sessionId || !this.handleId) {\n      console.warn('[JanusClient] destroyRoom => no session/handle');\n      return;\n    }\n    if (!this.config.roomId || !this.config.userId) {\n      console.warn('[JanusClient] destroyRoom => no roomId/userId');\n      return;\n    }\n\n    const transaction = this.randomTid();\n    const body = {\n      request: 'destroy',\n      room: this.config.roomId,\n      periscope_user_id: this.config.userId,\n    };\n\n    console.log('[JanusClient] destroying room =>', body);\n    const resp = await fetch(\n      `${this.config.webrtcUrl}/${this.sessionId}/${this.handleId}`,\n      {\n        method: 'POST',\n        headers: {\n          Authorization: this.config.credential,\n          'Content-Type': 'application/json',\n          Referer: 'https://x.com',\n        },\n        body: JSON.stringify({\n          janus: 'message',\n          transaction,\n          body,\n        }),\n      },\n    );\n\n    if (!resp.ok) {\n      throw new Error(`[JanusClient] destroyRoom failed => ${resp.status}`);\n    }\n\n    const json = await resp.json();\n    console.log('[JanusClient] destroyRoom =>', JSON.stringify(json));\n  }\n\n  public async leaveRoom(): Promise<void> {\n    if (!this.sessionId || !this.handleId) {\n      console.warn('[JanusClient] leaveRoom => no session/handle');\n      return;\n    }\n    const transaction = this.randomTid();\n    const body = {\n      request: 'leave',\n      room: this.config.roomId,\n      periscope_user_id: this.config.userId,\n    };\n\n    console.log('[JanusClient] leaving room =>', body);\n    const resp = await fetch(\n      `${this.config.webrtcUrl}/${this.sessionId}/${this.handleId}`,\n      {\n        method: 'POST',\n        headers: {\n          Authorization: this.config.credential,\n          'Content-Type': 'application/json',\n        },\n        body: JSON.stringify({\n          janus: 'message',\n          transaction,\n          body,\n        }),\n      },\n    );\n    if (!resp.ok) {\n      throw new Error(`[JanusClient] leaveRoom => error code ${resp.status}`);\n    }\n    const json = await resp.json();\n    console.log('[JanusClient] leaveRoom =>', JSON.stringify(json));\n  }\n}\n","// src/utils.ts\n\nimport { Headers } from 'headers-polyfill';\nimport type { BroadcastCreated, TurnServersInfo } from './types';\n\nexport async function authorizeToken(cookie: string): Promise<string> {\n  const headers = new Headers({\n    'X-Periscope-User-Agent': 'Twitter/m5',\n    'Content-Type': 'application/json',\n    'X-Idempotence': Date.now().toString(),\n    Referer: 'https://x.com/',\n    'X-Attempt': '1',\n  });\n\n  const resp = await fetch('https://proxsee.pscp.tv/api/v2/authorizeToken', {\n    method: 'POST',\n    headers,\n    body: JSON.stringify({\n      service: 'guest',\n      cookie: cookie,\n    }),\n  });\n\n  if (!resp.ok) {\n    throw new Error(`Failed to authorize token => ${resp.status}`);\n  }\n\n  const data = (await resp.json()) as { authorization_token: string };\n  if (!data.authorization_token) {\n    throw new Error('authorizeToken: Missing authorization_token in response');\n  }\n\n  return data.authorization_token;\n}\n\nexport async function publishBroadcast(params: {\n  title: string;\n  broadcast: BroadcastCreated;\n  cookie: string;\n  janusSessionId?: number;\n  janusHandleId?: number;\n  janusPublisherId?: number;\n}) {\n  const headers = new Headers({\n    'X-Periscope-User-Agent': 'Twitter/m5',\n    'Content-Type': 'application/json',\n    Referer: 'https://x.com/',\n    'X-Idempotence': Date.now().toString(),\n    'X-Attempt': '1',\n  });\n\n  await fetch('https://proxsee.pscp.tv/api/v2/publishBroadcast', {\n    method: 'POST',\n    headers,\n    body: JSON.stringify({\n      accept_guests: true,\n      broadcast_id: params.broadcast.room_id,\n      webrtc_handle_id: params.janusHandleId,\n      webrtc_session_id: params.janusSessionId,\n      janus_publisher_id: params.janusPublisherId,\n      janus_room_id: params.broadcast.room_id,\n      cookie: params.cookie,\n      status: params.title,\n      conversation_controls: 0,\n    }),\n  });\n}\n\nexport async function getTurnServers(cookie: string): Promise<TurnServersInfo> {\n  const headers = new Headers({\n    'X-Periscope-User-Agent': 'Twitter/m5',\n    'Content-Type': 'application/json',\n    Referer: 'https://x.com/',\n    'X-Idempotence': Date.now().toString(),\n    'X-Attempt': '1',\n  });\n\n  const resp = await fetch('https://proxsee.pscp.tv/api/v2/turnServers', {\n    method: 'POST',\n    headers,\n    body: JSON.stringify({ cookie }),\n  });\n  if (!resp.ok) throw new Error('Failed to get turn servers => ' + resp.status);\n  return resp.json();\n}\n\n/**\n * Get region from signer.pscp.tv\n */\nexport async function getRegion(): Promise<string> {\n  const resp = await fetch('https://signer.pscp.tv/region', {\n    method: 'POST',\n    headers: {\n      'Content-Type': 'application/json',\n      Referer: 'https://x.com',\n    },\n    body: JSON.stringify({}),\n  });\n  if (!resp.ok) {\n    throw new Error(`Failed to get region => ${resp.status}`);\n  }\n  const data = (await resp.json()) as { region: string };\n  return data.region;\n}\n\n/**\n * Create broadcast on Periscope\n */\nexport async function createBroadcast(params: {\n  description?: string;\n  languages?: string[];\n  cookie: string;\n  region: string;\n}): Promise<BroadcastCreated> {\n  const headers = new Headers({\n    'X-Periscope-User-Agent': 'Twitter/m5',\n    'Content-Type': 'application/json',\n    'X-Idempotence': Date.now().toString(),\n    Referer: 'https://x.com/',\n    'X-Attempt': '1',\n  });\n\n  const resp = await fetch('https://proxsee.pscp.tv/api/v2/createBroadcast', {\n    method: 'POST',\n    headers,\n    body: JSON.stringify({\n      app_component: 'audio-room',\n      content_type: 'visual_audio',\n      cookie: params.cookie,\n      conversation_controls: 0,\n      description: params.description || '',\n      height: 1080,\n      is_360: false,\n      is_space_available_for_replay: false,\n      is_webrtc: true,\n      languages: params.languages ?? [],\n      region: params.region,\n      width: 1920,\n    }),\n  });\n\n  if (!resp.ok) {\n    const text = await resp.text();\n    throw new Error(`Failed to create broadcast => ${resp.status} ${text}`);\n  }\n\n  const data = await resp.json();\n  return data as BroadcastCreated;\n}\n","// src/core/Space.ts\n\nimport { EventEmitter } from 'events';\nimport { ChatClient } from './ChatClient';\nimport { JanusClient } from './JanusClient';\nimport {\n  getTurnServers,\n  createBroadcast,\n  publishBroadcast,\n  authorizeToken,\n  getRegion,\n} from '../utils';\nimport type {\n  SpaceConfig,\n  BroadcastCreated,\n  SpeakerRequest,\n  OccupancyUpdate,\n  GuestReaction,\n  Plugin,\n  AudioDataWithUser,\n  PluginRegistration,\n  SpeakerInfo,\n} from '../types';\nimport { Scraper } from '../../scraper';\n\n/**\n * This class orchestrates:\n * 1) Creation of the broadcast\n * 2) Instantiation of Janus + Chat\n * 3) Approve speakers, push audio, etc.\n */\nexport class Space extends EventEmitter {\n  private janusClient?: JanusClient;\n  private chatClient?: ChatClient;\n  private authToken?: string;\n  private broadcastInfo?: BroadcastCreated;\n  private isInitialized = false;\n  private plugins = new Set<PluginRegistration>();\n  private speakers = new Map<string, SpeakerInfo>();\n\n  constructor(private readonly scraper: Scraper) {\n    super();\n  }\n\n  public use(plugin: Plugin, config?: Record<string, any>) {\n    const registration: PluginRegistration = { plugin, config };\n    this.plugins.add(registration);\n\n    console.log('[Space] Plugin added =>', plugin.constructor.name);\n\n    plugin.onAttach?.(this);\n\n    if (this.isInitialized && plugin.init) {\n      plugin.init({\n        space: this,\n        pluginConfig: config,\n      });\n    }\n\n    return this;\n  }\n\n  /**\n   * Main entry point\n   */\n  async initialize(config: SpaceConfig) {\n    console.log('[Space] Initializing...');\n\n    // 1) get Periscope cookie\n    const cookie = await this.scraper.getPeriscopeCookie();\n\n    // 2) get region\n    const region = await getRegion();\n    console.log('[Space] Got region =>', region);\n\n    // 3) create broadcast\n    console.log('[Space] Creating broadcast...');\n    const broadcast = await createBroadcast({\n      description: config.description,\n      languages: config.languages,\n      cookie,\n      region,\n    });\n    this.broadcastInfo = broadcast;\n\n    // 4) Authorize token if needed\n    console.log('[Space] Authorizing token...');\n    this.authToken = await authorizeToken(cookie);\n\n    // 5) Get TURN servers\n    console.log('[Space] Getting turn servers...');\n    const turnServers = await getTurnServers(cookie);\n\n    // 6) Create Janus client\n    this.janusClient = new JanusClient({\n      webrtcUrl: broadcast.webrtc_gw_url,\n      roomId: broadcast.room_id,\n      credential: broadcast.credential,\n      userId: broadcast.broadcast.user_id,\n      streamName: broadcast.stream_name,\n      turnServers,\n    });\n    await this.janusClient.initialize();\n\n    this.janusClient.on('audioDataFromSpeaker', (data: AudioDataWithUser) => {\n      // console.log('[Space] Received PCM from speaker =>', data.userId);\n      this.handleAudioData(data);\n      // You can store or forward to a plugin, run STT, etc.\n    });\n\n    this.janusClient.on('subscribedSpeaker', ({ userId, feedId }) => {\n      const speaker = this.speakers.get(userId);\n      if (!speaker) {\n        console.log(\n          '[Space] subscribedSpeaker => speaker not found for userId=',\n          userId,\n        );\n        return;\n      }\n\n      speaker.janusParticipantId = feedId;\n      console.log(\n        `[Space] updated speaker info => userId=${userId}, feedId=${feedId}`,\n      );\n    });\n\n    // 7) Publish the broadcast\n    console.log('[Space] Publishing broadcast...');\n    await publishBroadcast({\n      title: config.title || '',\n      broadcast,\n      cookie,\n      janusSessionId: this.janusClient.getSessionId(),\n      janusHandleId: this.janusClient.getHandleId(),\n      janusPublisherId: this.janusClient.getPublisherId(),\n    });\n\n    // 8) If interactive, open chat\n    if (config.mode === 'INTERACTIVE') {\n      console.log('[Space] Connecting chat...');\n      this.chatClient = new ChatClient(\n        broadcast.room_id,\n        broadcast.access_token,\n        broadcast.endpoint,\n      );\n      await this.chatClient.connect();\n      this.setupChatEvents();\n    }\n\n    this.isInitialized = true;\n    console.log('[Space] Initialized =>', broadcast.share_url);\n\n    for (const { plugin, config: pluginConfig } of this.plugins) {\n      if (plugin.init) {\n        plugin.init({\n          space: this,\n          pluginConfig,\n        });\n      }\n    }\n\n    console.log('[Space] All plugins initialized');\n    return broadcast;\n  }\n\n  reactWithEmoji(emoji: string) {\n    if (!this.chatClient) return;\n    this.chatClient.reactWithEmoji(emoji);\n  }\n\n  private setupChatEvents() {\n    if (!this.chatClient) return;\n\n    this.chatClient.on('speakerRequest', (req: SpeakerRequest) => {\n      console.log('[Space] Speaker request =>', req);\n      this.emit('speakerRequest', req);\n    });\n    this.chatClient.on('occupancyUpdate', (update: OccupancyUpdate) => {\n      this.emit('occupancyUpdate', update);\n    });\n    this.chatClient.on('muteStateChanged', (evt) => {\n      this.emit('muteStateChanged', evt);\n    });\n    this.chatClient.on('guestReaction', (reaction: GuestReaction) => {\n      console.log('[Space] Guest reaction =>', reaction);\n      this.emit('guestReaction', reaction);\n    });\n  }\n\n  /**\n   * Approves a speaker on Periscope side, then subscribes on Janus side\n   */\n  async approveSpeaker(userId: string, sessionUUID: string) {\n    if (!this.isInitialized || !this.broadcastInfo) {\n      throw new Error('[Space] Not initialized or no broadcastInfo');\n    }\n\n    if (!this.authToken) {\n      throw new Error('[Space] No auth token available');\n    }\n\n    this.speakers.set(userId, {\n      userId,\n      sessionUUID,\n    });\n\n    // 1) Call the \"request/approve\" endpoint\n    await this.callApproveEndpoint(\n      this.broadcastInfo,\n      this.authToken,\n      userId,\n      sessionUUID,\n    );\n\n    // 2) Subscribe in Janus => receive speaker's audio\n    await this.janusClient?.subscribeSpeaker(userId);\n  }\n\n  private async callApproveEndpoint(\n    broadcast: BroadcastCreated,\n    authorizationToken: string,\n    userId: string,\n    sessionUUID: string,\n  ): Promise<void> {\n    const endpoint = 'https://guest.pscp.tv/api/v1/audiospace/request/approve';\n\n    const headers = {\n      'Content-Type': 'application/json',\n      Referer: 'https://x.com/',\n      Authorization: authorizationToken,\n    };\n\n    const body = {\n      ntpForBroadcasterFrame: '2208988800024000300',\n      ntpForLiveFrame: '2208988800024000300',\n      chat_token: broadcast.access_token,\n      session_uuid: sessionUUID,\n    };\n\n    console.log('[Space] Approving speaker =>', endpoint, body);\n    const resp = await fetch(endpoint, {\n      method: 'POST',\n      headers,\n      body: JSON.stringify(body),\n    });\n\n    if (!resp.ok) {\n      const error = await resp.text();\n      throw new Error(\n        `[Space] Failed to approve speaker => ${resp.status}: ${error}`,\n      );\n    }\n\n    console.log('[Space] Speaker approved =>', userId);\n  }\n\n  /**\n   * Removes a speaker (userId) on the Twitter side (audiospace/stream/eject)\n   * then unsubscribes in Janus if needed.\n   */\n  public async removeSpeaker(userId: string) {\n    if (!this.isInitialized || !this.broadcastInfo) {\n      throw new Error('[Space] Not initialized or no broadcastInfo');\n    }\n    if (!this.authToken) {\n      throw new Error('[Space] No auth token available');\n    }\n    if (!this.janusClient) {\n      throw new Error('[Space] No Janus client initialized');\n    }\n\n    const speaker = this.speakers.get(userId);\n    if (!speaker) {\n      throw new Error(\n        `[Space] removeSpeaker => no speaker found for userId=${userId}`,\n      );\n    }\n\n    const sessionUUID = speaker.sessionUUID;\n    const janusParticipantId = speaker.janusParticipantId;\n    console.log(sessionUUID, janusParticipantId, speaker);\n    if (!sessionUUID || janusParticipantId === undefined) {\n      throw new Error(\n        `[Space] removeSpeaker => missing sessionUUID or feedId for userId=${userId}`,\n      );\n    }\n\n    const janusHandleId = this.janusClient.getHandleId();\n    const janusSessionId = this.janusClient.getSessionId();\n\n    if (!janusHandleId || !janusSessionId) {\n      throw new Error(\n        `[Space] removeSpeaker => missing Janus handle or sessionId for userId=${userId}`,\n      );\n    }\n\n    // 1) Call the Twitter eject endpoint\n    await this.callRemoveEndpoint(\n      this.broadcastInfo,\n      this.authToken,\n      sessionUUID,\n      janusParticipantId,\n      this.broadcastInfo.room_id,\n      janusHandleId,\n      janusSessionId,\n    );\n\n    // 2) Remove from local speakers map\n    this.speakers.delete(userId);\n\n    console.log(`[Space] removeSpeaker => removed userId=${userId}`);\n  }\n\n  /**\n   * Calls the audiospace/stream/eject endpoint to remove a speaker on Twitter\n   */\n  private async callRemoveEndpoint(\n    broadcast: BroadcastCreated,\n    authorizationToken: string,\n    sessionUUID: string,\n    janusParticipantId: number,\n    janusRoomId: string,\n    webrtcHandleId: number,\n    webrtcSessionId: number,\n  ): Promise<void> {\n    const endpoint = 'https://guest.pscp.tv/api/v1/audiospace/stream/eject';\n\n    const headers = {\n      'Content-Type': 'application/json',\n      Referer: 'https://x.com/',\n      Authorization: authorizationToken,\n    };\n\n    const body = {\n      ntpForBroadcasterFrame: '2208988800024000300',\n      ntpForLiveFrame: '2208988800024000300',\n      session_uuid: sessionUUID,\n      chat_token: broadcast.access_token,\n      janus_room_id: janusRoomId,\n      janus_participant_id: janusParticipantId,\n      webrtc_handle_id: webrtcHandleId,\n      webrtc_session_id: webrtcSessionId,\n    };\n\n    console.log('[Space] Removing speaker =>', endpoint, body);\n    const resp = await fetch(endpoint, {\n      method: 'POST',\n      headers,\n      body: JSON.stringify(body),\n    });\n\n    if (!resp.ok) {\n      const error = await resp.text();\n      throw new Error(\n        `[Space] Failed to remove speaker => ${resp.status}: ${error}`,\n      );\n    }\n\n    console.log('[Space] Speaker removed => sessionUUID=', sessionUUID);\n  }\n\n  pushAudio(samples: Int16Array, sampleRate: number) {\n    this.janusClient?.pushLocalAudio(samples, sampleRate);\n  }\n\n  /**\n   * This method is called by JanusClient on 'audioDataFromSpeaker'\n   * or we do it from the 'initialize(...)' once Janus is set up.\n   */\n  private handleAudioData(data: AudioDataWithUser) {\n    // Forward to plugins\n    for (const { plugin } of this.plugins) {\n      plugin.onAudioData?.(data);\n    }\n  }\n\n  /**\n   * Gracefully end the Space (stop broadcast, destroy Janus room, etc.)\n   */\n  public async finalizeSpace(): Promise<void> {\n    console.log('[Space] finalizeSpace => stopping broadcast gracefully');\n\n    const tasks: Array<Promise<any>> = [];\n\n    if (this.janusClient) {\n      tasks.push(\n        this.janusClient.destroyRoom().catch((err) => {\n          console.error('[Space] destroyRoom error =>', err);\n        }),\n      );\n    }\n\n    if (this.broadcastInfo) {\n      tasks.push(\n        this.endAudiospace({\n          broadcastId: this.broadcastInfo.room_id,\n          chatToken: this.broadcastInfo.access_token,\n        }).catch((err) => {\n          console.error('[Space] endAudiospace error =>', err);\n        }),\n      );\n    }\n\n    if (this.janusClient) {\n      tasks.push(\n        this.janusClient.leaveRoom().catch((err) => {\n          console.error('[Space] leaveRoom error =>', err);\n        }),\n      );\n    }\n\n    await Promise.all(tasks);\n    console.log('[Space] finalizeSpace => done.');\n  }\n\n  /**\n   * Calls the endAudiospace endpoint from Twitter\n   */\n  private async endAudiospace(params: {\n    broadcastId: string;\n    chatToken: string;\n  }): Promise<void> {\n    const url = 'https://guest.pscp.tv/api/v1/audiospace/admin/endAudiospace';\n    const headers = {\n      'Content-Type': 'application/json',\n      Referer: 'https://x.com/',\n      Authorization: this.authToken || '',\n    };\n\n    const body = {\n      broadcast_id: params.broadcastId,\n      chat_token: params.chatToken,\n    };\n\n    console.log('[Space] endAudiospace =>', body);\n    const resp = await fetch(url, {\n      method: 'POST',\n      headers,\n      body: JSON.stringify(body),\n    });\n\n    if (!resp.ok) {\n      const errText = await resp.text();\n      throw new Error(`[Space] endAudiospace => ${resp.status} ${errText}`);\n    }\n    const json = await resp.json();\n    console.log('[Space] endAudiospace => success =>', json);\n  }\n\n  public getSpeakers(): SpeakerInfo[] {\n    return Array.from(this.speakers.values());\n  }\n\n  async stop() {\n    console.log('[Space] Stopping...');\n\n    await this.finalizeSpace().catch((err) => {\n      console.error('[Space] finalizeBroadcast error =>', err);\n    });\n\n    if (this.chatClient) {\n      await this.chatClient.disconnect();\n      this.chatClient = undefined;\n    }\n    if (this.janusClient) {\n      await this.janusClient.stop();\n      this.janusClient = undefined;\n    }\n    for (const { plugin } of this.plugins) {\n      plugin.cleanup?.();\n    }\n    this.plugins.clear();\n\n    this.isInitialized = false;\n  }\n}\n","// src/plugins/SttTtsPlugin.ts\n\nimport fs from 'fs';\nimport path from 'path';\nimport { spawn } from 'child_process';\nimport { Plugin, AudioDataWithUser } from '../types';\nimport { Space } from '../core/Space';\nimport { JanusClient } from '../core/JanusClient';\n\ninterface PluginConfig {\n  openAiApiKey?: string; // for STT & ChatGPT\n  elevenLabsApiKey?: string; // for TTS\n  sttLanguage?: string; // e.g. \"en\" for Whisper\n  gptModel?: string; // e.g. \"gpt-3.5-turbo\"\n  silenceThreshold?: number; // amplitude threshold for ignoring silence\n  voiceId?: string; // specify which ElevenLabs voice to use\n  elevenLabsModel?: string; // e.g. \"eleven_monolingual_v1\"\n  systemPrompt?: string; // ex. \"You are a helpful AI assistant\"\n  chatContext?: Array<{\n    role: 'system' | 'user' | 'assistant';\n    content: string;\n  }>;\n}\n\n/**\n * MVP plugin for speech-to-text (OpenAI) + conversation + TTS (ElevenLabs)\n * Approach:\n *   - Collect each speaker's unmuted PCM in a memory buffer (only if above silence threshold)\n *   - On speaker mute -> flush STT -> GPT -> TTS -> push to Janus\n */\nexport class SttTtsPlugin implements Plugin {\n  private space?: Space;\n  private janus?: JanusClient;\n\n  // OpenAI + ElevenLabs\n  private openAiApiKey?: string;\n  private elevenLabsApiKey?: string;\n\n  private sttLanguage = 'en';\n  private gptModel = 'gpt-3.5-turbo';\n  private voiceId = '21m00Tcm4TlvDq8ikWAM';\n  private elevenLabsModel = 'eleven_monolingual_v1';\n\n  private systemPrompt = 'You are a helpful AI assistant.';\n  private chatContext: Array<{\n    role: 'system' | 'user' | 'assistant';\n    content: string;\n  }> = [];\n\n  /**\n   * userId => arrayOfChunks (PCM Int16)\n   */\n  private pcmBuffers = new Map<string, Int16Array[]>();\n\n  /**\n   * Track mute states: userId => boolean (true=unmuted)\n   */\n  private speakerUnmuted = new Map<string, boolean>();\n\n  /**\n   * For ignoring near-silence frames (if amplitude < threshold)\n   */\n  private silenceThreshold = 50; // default amplitude threshold\n\n  onAttach(space: Space) {\n    console.log('[SttTtsPlugin] onAttach => space was attached');\n  }\n\n  init(params: { space: Space; pluginConfig?: Record<string, any> }): void {\n    console.log(\n      '[SttTtsPlugin] init => Space fully ready. Subscribing to events.',\n    );\n\n    this.space = params.space;\n    this.janus = (this.space as any)?.janusClient as JanusClient | undefined;\n\n    const config = params.pluginConfig as PluginConfig;\n    this.openAiApiKey = config?.openAiApiKey;\n    this.elevenLabsApiKey = config?.elevenLabsApiKey;\n    if (config?.sttLanguage) this.sttLanguage = config.sttLanguage;\n    if (config?.gptModel) this.gptModel = config.gptModel;\n    if (typeof config?.silenceThreshold === 'number') {\n      this.silenceThreshold = config.silenceThreshold;\n    }\n    if (config?.voiceId) {\n      this.voiceId = config.voiceId;\n    }\n    if (config?.elevenLabsModel) {\n      this.voiceId = config.elevenLabsModel;\n    }\n\n    if (config.systemPrompt) {\n      this.systemPrompt = config.systemPrompt;\n    }\n    if (config.chatContext) {\n      this.chatContext = config.chatContext;\n    }\n    console.log('[SttTtsPlugin] Plugin config =>', config);\n\n    // Listen for mute state changes to trigger STT flush\n    this.space.on(\n      'muteStateChanged',\n      (evt: { userId: string; muted: boolean }) => {\n        console.log('[SttTtsPlugin] Speaker muteStateChanged =>', evt);\n        if (evt.muted) {\n          // speaker just got muted => flush STT\n          this.handleMute(evt.userId).catch((err) =>\n            console.error('[SttTtsPlugin] handleMute error =>', err),\n          );\n        } else {\n          // unmuted => start buffering\n          this.speakerUnmuted.set(evt.userId, true);\n          if (!this.pcmBuffers.has(evt.userId)) {\n            this.pcmBuffers.set(evt.userId, []);\n          }\n        }\n      },\n    );\n  }\n\n  /**\n   * Called whenever we receive PCM from a speaker\n   */\n  onAudioData(data: AudioDataWithUser): void {\n    // Skip if speaker is muted or not tracked\n    if (!this.speakerUnmuted.get(data.userId)) return;\n\n    // Optional: detect silence\n    let maxVal = 0;\n    for (let i = 0; i < data.samples.length; i++) {\n      const val = Math.abs(data.samples[i]);\n      if (val > maxVal) maxVal = val;\n    }\n    if (maxVal < this.silenceThreshold) {\n      // It's near-silence => skip\n      return;\n    }\n\n    // Add chunk\n    let arr = this.pcmBuffers.get(data.userId);\n    if (!arr) {\n      arr = [];\n      this.pcmBuffers.set(data.userId, arr);\n    }\n    arr.push(data.samples);\n  }\n\n  /**\n   * On speaker mute => flush STT => GPT => TTS => push to Janus\n   */\n  private async handleMute(userId: string): Promise<void> {\n    this.speakerUnmuted.set(userId, false);\n    const chunks = this.pcmBuffers.get(userId) || [];\n    this.pcmBuffers.set(userId, []); // reset\n\n    if (!chunks.length) {\n      console.log('[SttTtsPlugin] No audio chunks for user =>', userId);\n      return;\n    }\n    console.log(\n      `[SttTtsPlugin] Flushing STT buffer for user=${userId}, total chunks=${chunks.length}`,\n    );\n\n    // 1) Merge chunks\n    const totalLen = chunks.reduce((acc, c) => acc + c.length, 0);\n    const merged = new Int16Array(totalLen);\n    let offset = 0;\n    for (const c of chunks) {\n      merged.set(c, offset);\n      offset += c.length;\n    }\n\n    // 2) Convert PCM -> WAV (48kHz) for STT\n    const wavPath = await this.convertPcmToWav(merged, 48000);\n    console.log('[SttTtsPlugin] WAV ready =>', wavPath);\n\n    // 3) STT with OpenAI Whisper\n    const sttText = await this.transcribeWithOpenAI(wavPath, this.sttLanguage);\n    fs.unlinkSync(wavPath);\n    if (!sttText.trim()) {\n      console.log('[SttTtsPlugin] No speech recognized for user =>', userId);\n      return;\n    }\n    console.log(`[SttTtsPlugin] STT => user=${userId}, text=\"${sttText}\"`);\n\n    // 4) GPT\n    const replyText = await this.askChatGPT(sttText);\n    console.log(`[SttTtsPlugin] GPT => user=${userId}, reply=\"${replyText}\"`);\n\n    // 5) TTS => returns MP3\n    const ttsAudio = await this.elevenLabsTts(replyText);\n    console.log('[SttTtsPlugin] TTS => got MP3 size=', ttsAudio.length);\n\n    // 6) Convert MP3 -> PCM (48kHz, mono)\n    const pcm = await this.convertMp3ToPcm(ttsAudio, 48000);\n    console.log(\n      '[SttTtsPlugin] TTS => converted to PCM => frames=',\n      pcm.length,\n    );\n\n    // 7) Push frames to Janus\n    if (this.janus) {\n      await this.streamToJanus(pcm, 48000);\n      console.log('[SttTtsPlugin] TTS => done streaming to space');\n    }\n  }\n\n  /**\n   * Convert Int16 PCM -> WAV using ffmpeg\n   */\n  private convertPcmToWav(\n    samples: Int16Array,\n    sampleRate: number,\n  ): Promise<string> {\n    return new Promise((resolve, reject) => {\n      const tmpPath = path.resolve('/tmp', `stt-${Date.now()}.wav`);\n      const ff = spawn('ffmpeg', [\n        '-f',\n        's16le',\n        '-ar',\n        sampleRate.toString(),\n        '-ac',\n        '1',\n        '-i',\n        'pipe:0',\n        '-y',\n        tmpPath,\n      ]);\n      ff.stdin.write(Buffer.from(samples.buffer));\n      ff.stdin.end();\n      ff.on('close', (code) => {\n        if (code === 0) resolve(tmpPath);\n        else reject(new Error(`ffmpeg error code=${code}`));\n      });\n    });\n  }\n\n  /**\n   * OpenAI Whisper STT\n   */\n  private async transcribeWithOpenAI(wavPath: string, language: string) {\n    if (!this.openAiApiKey) {\n      throw new Error('[SttTtsPlugin] No OpenAI API key available');\n    }\n\n    try {\n      console.log('[SttTtsPlugin] Transcribe =>', wavPath);\n\n      // Read file into buffer\n      const fileBuffer = fs.readFileSync(wavPath);\n      console.log(\n        '[SttTtsPlugin] File read, size:',\n        fileBuffer.length,\n        'bytes',\n      );\n\n      // Create blob from buffer\n      const blob = new Blob([fileBuffer], { type: 'audio/wav' });\n\n      // Create FormData\n      const formData = new FormData();\n      formData.append('file', blob, path.basename(wavPath));\n      formData.append('model', 'whisper-1');\n      formData.append('language', language);\n      formData.append('temperature', '0');\n\n      // Call OpenAI API\n      const response = await fetch(\n        'https://api.openai.com/v1/audio/transcriptions',\n        {\n          method: 'POST',\n          headers: {\n            Authorization: `Bearer ${this.openAiApiKey}`,\n          },\n          body: formData,\n        },\n      );\n\n      // Handle errors\n      if (!response.ok) {\n        const errorText = await response.text();\n        console.error('[SttTtsPlugin] API Error:', errorText);\n        throw new Error(`OpenAI API error: ${response.status} ${errorText}`);\n      }\n\n      // Parse response\n      const data = (await response.json()) as { text: string };\n      const text = data.text?.trim() || '';\n      console.log('[SttTtsPlugin] Transcription =>', text);\n      return text;\n    } catch (err) {\n      console.error('[SttTtsPlugin] OpenAI STT Error =>', err);\n      throw new Error('OpenAI STT failed');\n    }\n  }\n\n  /**\n   * Simple ChatGPT call\n   */\n  private async askChatGPT(userText: string): Promise<string> {\n    if (!this.openAiApiKey) {\n      throw new Error('[SttTtsPlugin] No OpenAI API key for ChatGPT');\n    }\n    const url = 'https://api.openai.com/v1/chat/completions';\n\n    // Build the final array of messages\n    const messages = [\n      { role: 'system', content: this.systemPrompt },\n      ...this.chatContext,\n      { role: 'user', content: userText },\n    ];\n\n    const resp = await fetch(url, {\n      method: 'POST',\n      headers: {\n        Authorization: `Bearer ${this.openAiApiKey}`,\n        'Content-Type': 'application/json',\n      },\n      body: JSON.stringify({\n        model: this.gptModel,\n        messages,\n      }),\n    });\n\n    if (!resp.ok) {\n      const errText = await resp.text();\n      throw new Error(\n        `[SttTtsPlugin] ChatGPT error => ${resp.status} ${errText}`,\n      );\n    }\n\n    const json = await resp.json();\n    const reply = json.choices?.[0]?.message?.content || '';\n\n    // Optionally store the conversation in the chatContext\n    this.chatContext.push({ role: 'user', content: userText });\n    this.chatContext.push({ role: 'assistant', content: reply });\n\n    return reply.trim();\n  }\n\n  /**\n   * ElevenLabs TTS => returns MP3 Buffer\n   */\n  private async elevenLabsTts(text: string): Promise<Buffer> {\n    if (!this.elevenLabsApiKey) {\n      throw new Error('[SttTtsPlugin] No ElevenLabs API key');\n    }\n    const url = `https://api.elevenlabs.io/v1/text-to-speech/${this.voiceId}`;\n    const resp = await fetch(url, {\n      method: 'POST',\n      headers: {\n        'Content-Type': 'application/json',\n        'xi-api-key': this.elevenLabsApiKey,\n      },\n      body: JSON.stringify({\n        text,\n        model_id: this.elevenLabsModel,\n        voice_settings: { stability: 0.4, similarity_boost: 0.8 },\n      }),\n    });\n    if (!resp.ok) {\n      const errText = await resp.text();\n      throw new Error(\n        `[SttTtsPlugin] ElevenLabs TTS error => ${resp.status} ${errText}`,\n      );\n    }\n    const arrayBuf = await resp.arrayBuffer();\n    return Buffer.from(arrayBuf);\n  }\n\n  /**\n   * Convert MP3 => PCM via ffmpeg\n   */\n  private convertMp3ToPcm(\n    mp3Buf: Buffer,\n    outRate: number,\n  ): Promise<Int16Array> {\n    return new Promise((resolve, reject) => {\n      const ff = spawn('ffmpeg', [\n        '-i',\n        'pipe:0',\n        '-f',\n        's16le',\n        '-ar',\n        outRate.toString(),\n        '-ac',\n        '1',\n        'pipe:1',\n      ]);\n      let raw = Buffer.alloc(0);\n      ff.stdout.on('data', (chunk: Buffer) => {\n        raw = Buffer.concat([raw, chunk]);\n      });\n      ff.stderr.on('data', () => {\n        /* ignore ffmpeg logs */\n      });\n      ff.on('close', (code) => {\n        if (code !== 0) {\n          reject(new Error(`ffmpeg error code=${code}`));\n          return;\n        }\n        const samples = new Int16Array(\n          raw.buffer,\n          raw.byteOffset,\n          raw.byteLength / 2,\n        );\n        resolve(samples);\n      });\n      ff.stdin.write(mp3Buf);\n      ff.stdin.end();\n    });\n  }\n\n  /**\n   * Push PCM back to Janus in small frames\n   * We'll do 10ms @48k => 960 samples per frame\n   */\n  private async streamToJanus(\n    samples: Int16Array,\n    sampleRate: number,\n  ): Promise<void> {\n    // 10 ms => 480 samples @48k\n    const FRAME_SIZE = 480;\n\n    for (\n      let offset = 0;\n      offset + FRAME_SIZE <= samples.length;\n      offset += FRAME_SIZE\n    ) {\n      // Option 1: subarray + .set\n      const frame = new Int16Array(FRAME_SIZE);\n      frame.set(samples.subarray(offset, offset + FRAME_SIZE));\n\n      this.janus?.pushLocalAudio(frame, sampleRate, 1);\n      await new Promise((r) => setTimeout(r, 10));\n    }\n  }\n\n  public async speakText(text: string): Promise<void> {\n    // 1) TTS => MP3\n    const ttsAudio = await this.elevenLabsTts(text);\n\n    // 2) Convert MP3 -> PCM\n    const pcm = await this.convertMp3ToPcm(ttsAudio, 48000);\n\n    // 3) Stream to Janus\n    if (this.janus) {\n      await this.streamToJanus(pcm, 48000);\n      console.log('[SttTtsPlugin] speakText => done streaming to space');\n    }\n  }\n\n  /**\n   * Change the system prompt at runtime.\n   */\n  public setSystemPrompt(prompt: string) {\n    this.systemPrompt = prompt;\n    console.log('[SttTtsPlugin] setSystemPrompt =>', prompt);\n  }\n\n  /**\n   * Change the GPT model at runtime (e.g. \"gpt-4\", \"gpt-3.5-turbo\", etc.).\n   */\n  public setGptModel(model: string) {\n    this.gptModel = model;\n    console.log('[SttTtsPlugin] setGptModel =>', model);\n  }\n\n  /**\n   * Add a message (system, user or assistant) to the chat context.\n   * E.g. to store conversation history or inject a persona.\n   */\n  public addMessage(role: 'system' | 'user' | 'assistant', content: string) {\n    this.chatContext.push({ role, content });\n    console.log(\n      `[SttTtsPlugin] addMessage => role=${role}, content=${content}`,\n    );\n  }\n\n  /**\n   * Clear the chat context if needed.\n   */\n  public clearChatContext() {\n    this.chatContext = [];\n    console.log('[SttTtsPlugin] clearChatContext => done');\n  }\n\n  cleanup(): void {\n    console.log('[SttTtsPlugin] cleanup => releasing resources');\n    this.pcmBuffers.clear();\n    this.speakerUnmuted.clear();\n  }\n}\n","import * as fs from 'fs';\nimport { AudioDataWithUser, Plugin } from '../types';\n\nexport class RecordToDiskPlugin implements Plugin {\n  private outStream = fs.createWriteStream('/tmp/speaker_audio.raw');\n\n  onAudioData(data: AudioDataWithUser): void {\n    // Convert Int16Array -> Buffer\n    const buf = Buffer.from(data.samples.buffer);\n    this.outStream.write(buf);\n  }\n\n  cleanup(): void {\n    this.outStream.end();\n  }\n}\n","// src/plugins/MonitorAudioPlugin.ts\n\nimport { spawn, ChildProcessWithoutNullStreams } from 'child_process';\nimport { Plugin, AudioDataWithUser } from '../types';\n\nexport class MonitorAudioPlugin implements Plugin {\n  private ffplay?: ChildProcessWithoutNullStreams;\n\n  constructor(private readonly sampleRate = 48000) {\n    // spawn ffplay reading raw PCM s16le from stdin\n    // \"-nodisp\" hides any video window, \"-loglevel quiet\" reduces console spam\n    this.ffplay = spawn('ffplay', [\n      '-f',\n      's16le',\n      '-ar',\n      this.sampleRate.toString(), // e.g. \"16000\"\n      '-ac',\n      '1', // mono\n      '-nodisp',\n      '-loglevel',\n      'quiet',\n      '-i',\n      'pipe:0',\n    ]);\n\n    this.ffplay.on('error', (err) => {\n      console.error('[MonitorAudioPlugin] ffplay error =>', err);\n    });\n    this.ffplay.on('close', (code) => {\n      console.log('[MonitorAudioPlugin] ffplay closed => code=', code);\n      this.ffplay = undefined;\n    });\n\n    console.log('[MonitorAudioPlugin] Started ffplay for real-time monitoring');\n  }\n\n  onAudioData(data: AudioDataWithUser): void {\n    // TODO: REMOVE DEBUG\n    // console.log(\n    //   '[MonitorAudioPlugin] onAudioData => user=',\n    //   data.userId,\n    //   'samples=',\n    //   data.samples.length,\n    //   'sampleRate=',\n    //   data.sampleRate,\n    // );\n\n    // Check sampleRate if needed\n    if (!this.ffplay?.stdin.writable) return;\n\n    // Suppose data.sampleRate = this.sampleRate\n    // Convert Int16Array => Buffer\n    const buf = Buffer.from(data.samples.buffer);\n\n    // Write raw 16-bit PCM samples to ffplay stdin\n    this.ffplay.stdin.write(buf);\n  }\n\n  cleanup(): void {\n    console.log('[MonitorAudioPlugin] Cleanup => stopping ffplay');\n    if (this.ffplay) {\n      this.ffplay.stdin.end(); // close the pipe\n      this.ffplay.kill(); // kill ffplay process\n      this.ffplay = undefined;\n    }\n  }\n}\n","// src/plugins/IdleMonitorPlugin.ts\n\nimport { Plugin, AudioDataWithUser } from '../types';\nimport { Space } from '../core/Space';\n\n/**\n * Plugin that tracks the last speaker audio timestamp\n * and the last local audio timestamp to detect overall silence.\n */\nexport class IdleMonitorPlugin implements Plugin {\n  private space?: Space;\n  private lastSpeakerAudioMs = Date.now();\n  private lastLocalAudioMs = Date.now();\n  private checkInterval?: NodeJS.Timeout;\n\n  /**\n   * @param idleTimeoutMs How many ms of silence before triggering idle (default 60s)\n   * @param checkEveryMs Interval for checking silence (default 10s)\n   */\n  constructor(\n    private idleTimeoutMs: number = 60_000,\n    private checkEveryMs: number = 10_000,\n  ) {}\n\n  onAttach(space: Space) {\n    this.space = space;\n    console.log('[IdleMonitorPlugin] onAttach => plugin attached');\n  }\n\n  init(params: { space: Space; pluginConfig?: Record<string, any> }): void {\n    this.space = params.space;\n    console.log('[IdleMonitorPlugin] init => setting up idle checks');\n\n    // Update lastSpeakerAudioMs on incoming speaker audio\n    this.space.on('audioDataFromSpeaker', (data: AudioDataWithUser) => {\n      this.lastSpeakerAudioMs = Date.now();\n    });\n\n    // Patch space.pushAudio to update lastLocalAudioMs\n    const originalPushAudio = this.space.pushAudio.bind(this.space);\n    this.space.pushAudio = (samples, sampleRate) => {\n      this.lastLocalAudioMs = Date.now();\n      originalPushAudio(samples, sampleRate);\n    };\n\n    // Periodically check for silence\n    this.checkInterval = setInterval(() => this.checkIdle(), this.checkEveryMs);\n  }\n\n  private checkIdle() {\n    const now = Date.now();\n    const lastAudio = Math.max(this.lastSpeakerAudioMs, this.lastLocalAudioMs);\n    const idleMs = now - lastAudio;\n\n    if (idleMs >= this.idleTimeoutMs) {\n      console.log(\n        '[IdleMonitorPlugin] idleTimeout => no audio for',\n        idleMs,\n        'ms',\n      );\n      this.space?.emit('idleTimeout', { idleMs });\n    }\n  }\n\n  /**\n   * Returns how many ms have passed since any audio was detected.\n   */\n  public getIdleTimeMs(): number {\n    const now = Date.now();\n    const lastAudio = Math.max(this.lastSpeakerAudioMs, this.lastLocalAudioMs);\n    return now - lastAudio;\n  }\n\n  cleanup(): void {\n    console.log('[IdleMonitorPlugin] cleanup => stopping idle checks');\n    if (this.checkInterval) {\n      clearInterval(this.checkInterval);\n      this.checkInterval = undefined;\n    }\n  }\n}\n","import tls from 'node:tls';\nimport { randomBytes } from 'node:crypto';\n\nconst ORIGINAL_CIPHERS = tls.DEFAULT_CIPHERS;\n\n// How many ciphers from the top of the list to shuffle.\n// The remaining ciphers are left in the original order.\nconst TOP_N_SHUFFLE = 8;\n\n// Modified variation of https://stackoverflow.com/a/12646864\nconst shuffleArray = (array: unknown[]) => {\n  for (let i = array.length - 1; i > 0; i--) {\n    const j = randomBytes(4).readUint32LE() % array.length;\n    [array[i], array[j]] = [array[j], array[i]];\n  }\n\n  return array;\n};\n\n// https://github.com/imputnet/cobalt/pull/574\nexport const randomizeCiphers = () => {\n  do {\n    const cipherList = ORIGINAL_CIPHERS.split(':');\n    const shuffled = shuffleArray(cipherList.slice(0, TOP_N_SHUFFLE));\n    const retained = cipherList.slice(TOP_N_SHUFFLE);\n\n    tls.DEFAULT_CIPHERS = [...shuffled, ...retained].join(':');\n  } while (tls.DEFAULT_CIPHERS === ORIGINAL_CIPHERS);\n};\n","import { PlatformExtensions } from '../platform-interface';\nimport { randomizeCiphers } from './randomize-ciphers';\n\nclass NodePlatform implements PlatformExtensions {\n  randomizeCiphers(): Promise<void> {\n    randomizeCiphers();\n    return Promise.resolve();\n  }\n}\n\nexport const platform = new NodePlatform();\n"],"names":["Cookie","Headers","CookieJar","TwitterApi","Type","OTPAuth","Check","SearchMode","endpoints","user","place","data","mediaData","mediaType","features","EventEmitter","spawn","fs","randomBytes"],"mappings":"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"}