/// <reference types="node" />
import { Realm } from "./realmUtil";
import * as superagent from "superagent";
import { EventEmitter } from "events";
import { StrictEventEmitter } from "strict-event-emitter-types";
import { RealmType } from "../realms/RealmType";
export declare function Promisify<T>(callback: any, ...args: any[]): Promise<T>;
export declare class TimeoutError extends Error {
    ms: number;
    constructor(ms: number);
}
export declare function timeout<T>(promise: Promise<T>, ms: number): Promise<T>;
export declare function delay(ms: number): Promise<void>;
export declare function validateRealmPath(path: string, userId: string): string;
export declare function getUserIdFromRealmPath(path: string): string;
export declare function writeAsync(realm: Realm, callback: () => void): Promise<void>;
export declare function downloadAllServerChanges(realm: Realm): Promise<void>;
export declare function uploadAllLocalChanges(realm: Realm): Promise<void>;
export declare function closeAfterUpload(realm: Realm): void;
export declare function convertHttpError(error: any): any;
export declare function waitAsync<T>(getter: () => T | Promise<T>, verifier?: (item: T) => boolean, timeout?: number, throwOnTimeout?: boolean): Promise<T>;
export declare function retryRequest(retries?: number, delay?: number, shouldRetry?: (response: superagent.Response) => boolean): superagent.Plugin;
export declare function isPartialPath(path: string): boolean;
export declare function extractPartialInfo(path: string): {
    partialIndex: number;
    isPartial: boolean;
    canonicalPath: string;
    customIdentifier: string;
    fullPath: string;
};
export declare function getValueIfResolved<T>(promise: Promise<T>): Promise<T | undefined>;
export declare function enumerateObject<T>(obj: {
    [key: string]: T;
}): T[];
export declare function enumValues<T extends Object>(enumObject: T): [keyof T];
export declare function mapEnum<T extends Object, U>(enumObject: T, func: (current: keyof T) => U): {
    [key in keyof T]: U;
};
export declare function createPromise<T>(): {
    promise: Promise<T>;
    resolve: (value: T) => void;
    reject: (reason?: any) => void;
};
export declare function waitForEvent<TEventRecord, P extends keyof TEventRecord>(emitter: StrictEventEmitter<EventEmitter, TEventRecord>, eventName: P): Promise<TEventRecord[P]>;
export declare function gaussianRandom(array: number[]): number;
export declare function startStopwatch(): [number, number];
export declare function readStopwatch(stopwatch: [number, number]): number;
export declare function measureTime<T>(toMeasure: () => Promise<T>): Promise<{
    result: T;
    time: number;
}>;
export declare function ensureRealmOfType(requiredType: RealmType, actualType: RealmType): void;
export declare function getValueOrDefault<T>(value: T | undefined, defaultValue: T): T;
export declare function isArrayEmpty(arr: any[]): boolean;
export declare function getAccessLevel(permissions: {
    mayRead: boolean;
    mayWrite: boolean;
    mayManage: boolean;
}): Realm.Sync.AccessLevel;
export declare function nameof<T>(name: Exclude<Extract<keyof T, string>, Function>): string;
