abstract class Client {
  
  
  public abstract init(params: {
    metadata?: AppMetadata;
  }): Promise<void>;
  
  public abstract connect(params: {
    requiredNamespaces: Map<string, ProposalNamespace>;
    relays?: RelayProtocolOptions[];
    pairingTopic: string;
  }): Promise<Sequence>;
  
  public abstract setNamespaceConfig(params: NamespaceConfig) : Promise<void>;
  
  public abstract approveSession(params: {
    id: number;
    namespaces: Map<string, SessionNamespace>;  
    relayProtocol?: string;
  }): Promise<Sequence>;
  
  public abstract rejectSession(params: {
    proposerPublicKey: string;
    reason: Reason;
  }): Promise<void>;
  
  public abstract updateSession(params: {
    topic: string;
    namespaces: Map<string, SessionNamespace>;
  }): Promise<void>;
  
  public abstract extendSession(params: {
    topic: string;
  }): Promise<void>;
  
  public abstract request(params: {
    topic: string;
    request: RequestArguments;
    chainId: string;
  }): Promise<any>;
  
  public abstract respondSessionRequest(params: {
    topic: string;
    response: JsonRpcResponse;
  }): Promise<void>;
  
  public abstract emitSessionEvent(params: {
    topic: string;
    event: SessionEvent;
    chainId: string;
  }): Promise<void>;
    
  public abstract ping(params: {
    topic: string;
  }): Promise<void>;
  
  public abstract disconnectSession(params: {
    topic: string;
    reason: Reason;
  }): Promise<void>;
  
  
  public abstract on("session_proposal", (sessionProposal: SessionProposal, verifyContext: VerifyContext) => {}): void;
  
  public abstract on("session_request", (sessionRequest: SessionRequest, verifyContext: VerifyContext) => {}): void;
  
  public abstract on("session_event", (sessionEvent: SessionEvent) => {}): void;
  
  public abstract on("session_delete", (sessionDelete: { id: number, topic: string }) => {}): void;
}