type Requests = {
    init: string;
    openURL: string;
    openPayment: string;
};
type EmptyRequests = {
    [K in keyof Requests as Requests[K] extends undefined ? K : never]: undefined;
};
type PayloadRequests = Omit<Requests, keyof EmptyRequests>;
type Responses = {
    init: UserData;
    openURL: 'success';
    openPayment: 'success';
    payment: 'success' | 'cancel';
};
type SuccessResponses = {
    [K in keyof Responses as `${K}Response`]: Responses[K];
};
type ErrorResponses = {
    [K in keyof Responses as `${K}Error`]: string;
};
type PlainResponses = {
    ready: never;
};
type MessageFromServer = SuccessResponses & ErrorResponses & PlainResponses;
interface User {
    accountId: string;
    username: string;
    minecraftUUID: string;
}
interface UserData extends User {
    hash: string;
}
type DoMessageData<T> = {
    [K in keyof T]: {
        type: K;
    };
}[keyof T];
type DoMessageLoadedData<T> = {
    [K in keyof T]: {
        type: K;
        payload: T[K];
    };
}[keyof T];
type RequestMessage = DoMessageData<EmptyRequests> | DoMessageLoadedData<PayloadRequests>;

export type { EmptyRequests, MessageFromServer, PayloadRequests, RequestMessage, User, UserData };
