export type Unsubscribe = () => void; export type Listener = (value: T) => Promise | void; export type ResettableListener = Listener & { resetCallState: () => void; }; export interface EventEmitter { on(event: string, listener: Listener): void; removeListener(event: string, listener: Listener): void; } export type Setter = (prev: T) => T | Promise; export interface Atom { get(): Promise; set(value: T): Promise; set(setter: Setter): Promise; observe(listener: Listener): Unsubscribe; reset(): Promise; } export type ReadonlyAtom = Omit, 'set' | 'reset'>; export type KeystoreValue = string | number; export interface Port { emit(event: string, value: T): void; } export interface Keystore { getSecret(key: string, options?: object): Promise; setSecret(key: string, value: KeystoreValue, options?: object): Promise; deleteSecret(key: string, options?: object): Promise; } export type Logger = Pick; export type AnyAtom = Atom | ReadonlyAtom; export type AtomValue = A extends AnyAtom ? V : never; export type SetAtomValue = A extends Atom ? Atom : A extends ReadonlyAtom ? ReadonlyAtom : never;