{"version":3,"file":"base-client.mjs","names":[],"sources":["../../src/client/base-client.ts"],"sourcesContent":["import EventEmitter from \"eventemitter3\";\n\nimport type { ClientConfiguration } from \"~/config/config\";\nimport type { IRCMessage } from \"~/message/irc/irc-message\";\nimport {\n  type ClientEvents,\n  type ClientState,\n  CLIENT_STATES,\n} from \"./interface\";\nimport {\n  type ExpandedClientConfiguration,\n  expandConfig,\n} from \"~/config/expanded\";\n\nexport abstract class BaseClient extends EventEmitter<ClientEvents> {\n  public get unconnected(): boolean {\n    return this.state === \"UNCONNECTED\";\n  }\n\n  public get connecting(): boolean {\n    return this.state === \"CONNECTING\";\n  }\n\n  public get connected(): boolean {\n    return this.state === \"CONNECTED\";\n  }\n\n  public get ready(): boolean {\n    return this.state === \"READY\";\n  }\n\n  public get closed(): boolean {\n    return this.state === \"CLOSED\";\n  }\n\n  public readonly configuration: ExpandedClientConfiguration;\n  public abstract readonly wantedChannels: Set<string>;\n  public abstract readonly joinedChannels: Set<string>;\n\n  public state: ClientState = \"UNCONNECTED\";\n\n  protected constructor(partialConfig?: ClientConfiguration) {\n    super();\n    this.configuration = expandConfig(partialConfig);\n  }\n\n  public emitError(error: Error, emitEvenIfClosed = false): void {\n    if (this.closed && !emitEvenIfClosed) {\n      return;\n    }\n\n    this.emit(\"error\", error);\n  }\n\n  public emitMessage(message: IRCMessage): void {\n    this.emit(\"message\", message);\n    this.emit(message.ircCommand, message);\n  }\n\n  public emitConnecting(): void {\n    if (this.advanceState(\"CONNECTING\")) {\n      this.emit(\"connecting\");\n    }\n  }\n\n  public emitConnected(): void {\n    if (this.advanceState(\"CONNECTED\")) {\n      this.emit(\"connect\");\n    }\n  }\n\n  public emitReady(): void {\n    if (this.advanceState(\"READY\")) {\n      this.emit(\"ready\");\n    }\n  }\n\n  public emitClosed(error?: Error): void {\n    if (this.advanceState(\"CLOSED\")) {\n      this.emit(\"close\", error);\n    }\n  }\n\n  public advanceState(newState: ClientState): boolean {\n    if (CLIENT_STATES.indexOf(newState) <= CLIENT_STATES.indexOf(this.state)) {\n      return false;\n    }\n\n    this.state = newState;\n    return true;\n  }\n}\n"],"mappings":";;;;AAcA,IAAsB,aAAtB,cAAyC,aAA2B;CAClE,IAAW,cAAuB;AAChC,SAAO,KAAK,UAAU;;CAGxB,IAAW,aAAsB;AAC/B,SAAO,KAAK,UAAU;;CAGxB,IAAW,YAAqB;AAC9B,SAAO,KAAK,UAAU;;CAGxB,IAAW,QAAiB;AAC1B,SAAO,KAAK,UAAU;;CAGxB,IAAW,SAAkB;AAC3B,SAAO,KAAK,UAAU;;CAGxB;CAIA,QAA4B;CAE5B,YAAsB,eAAqC;AACzD,SAAO;AACP,OAAK,gBAAgB,aAAa,cAAc;;CAGlD,UAAiB,OAAc,mBAAmB,OAAa;AAC7D,MAAI,KAAK,UAAU,CAAC,iBAClB;AAGF,OAAK,KAAK,SAAS,MAAM;;CAG3B,YAAmB,SAA2B;AAC5C,OAAK,KAAK,WAAW,QAAQ;AAC7B,OAAK,KAAK,QAAQ,YAAY,QAAQ;;CAGxC,iBAA8B;AAC5B,MAAI,KAAK,aAAa,aAAa,CACjC,MAAK,KAAK,aAAa;;CAI3B,gBAA6B;AAC3B,MAAI,KAAK,aAAa,YAAY,CAChC,MAAK,KAAK,UAAU;;CAIxB,YAAyB;AACvB,MAAI,KAAK,aAAa,QAAQ,CAC5B,MAAK,KAAK,QAAQ;;CAItB,WAAkB,OAAqB;AACrC,MAAI,KAAK,aAAa,SAAS,CAC7B,MAAK,KAAK,SAAS,MAAM;;CAI7B,aAAoB,UAAgC;AAClD,MAAI,cAAc,QAAQ,SAAS,IAAI,cAAc,QAAQ,KAAK,MAAM,CACtE,QAAO;AAGT,OAAK,QAAQ;AACb,SAAO"}