{"version":3,"file":"login.mjs","names":[],"sources":["../../src/operations/login.ts"],"sourcesContent":["import type { SingleConnection } from \"~/client/connection\";\nimport { awaitResponse } from \"~/await/await-response\";\nimport { ConnectionError } from \"~/client/errors\";\nimport { NoticeMessage } from \"~/message/twitch-types/notice\";\nimport { isAnonymousUsername } from \"~/utils/is-anonymous-username\";\n\nexport class LoginError extends ConnectionError {}\n\nexport async function sendLogin(\n  conn: SingleConnection,\n  username: string,\n  password?: string,\n): Promise<void> {\n  if (password != null) {\n    if (!isAnonymousUsername(username) && !password.startsWith(\"oauth:\")) {\n      // don't append oauth: for the fake passwords that can be sent for\n      // anonymous usernames, such as `PASS SCHMOOPIE`\n      password = `oauth:${password}`;\n    }\n\n    conn.sendRaw(`PASS ${password}`);\n  }\n  conn.sendRaw(`NICK ${username}`);\n\n  // successful login if we're greeted with a 001,\n  // e.g. :tmi.twitch.tv 001 justinfan12345 :Welcome, GLHF!\n  // some kind of error occurred if the server sends us a NOTICE.\n  // e.g. :tmi.twitch.tv NOTICE * :Improperly formatted auth\n  // or :tmi.twitch.tv NOTICE * :Login authentication failed\n  await awaitResponse(conn, {\n    success: (message) => message.ircCommand === \"001\",\n    failure: (message) => message instanceof NoticeMessage,\n    errorType: (message, cause) => new LoginError(message, cause),\n    errorMessage: \"Failed to login\",\n  });\n}\n"],"mappings":";;;;;AAMA,IAAa,aAAb,cAAgC,gBAAgB;AAEhD,eAAsB,UACpB,MACA,UACA,UACe;AACf,KAAI,YAAY,MAAM;AACpB,MAAI,CAAC,oBAAoB,SAAS,IAAI,CAAC,SAAS,WAAW,SAAS,CAGlE,YAAW,SAAS;AAGtB,OAAK,QAAQ,QAAQ,WAAW;;AAElC,MAAK,QAAQ,QAAQ,WAAW;AAOhC,OAAM,cAAc,MAAM;EACxB,UAAU,YAAY,QAAQ,eAAe;EAC7C,UAAU,YAAY,mBAAmB;EACzC,YAAY,SAAS,UAAU,IAAI,WAAW,SAAS,MAAM;EAC7D,cAAc;EACf,CAAC"}