The communications platform that puts data protection first.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
Rocket.Chat/server/sdk/lib/proxify.ts

27 lines
1.0 KiB

import { api } from '../api';
type FunctionPropertyNames<T> = {
[K in keyof T]: T[K] extends Function ? K : never;
}[keyof T];
type Prom<T> = {
[K in FunctionPropertyNames<T>]: ReturnType<T[K]> extends Promise<any> ? T[K] : (...params: Parameters<T[K]>) => Promise<ReturnType<T[K]>>;
}
type PromOrError<T> = {
[K in FunctionPropertyNames<T>]: ReturnType<T[K]> extends Promise<any> ? (...params: Parameters<T[K]>) => ReturnType<T[K]> | Promise<Error> : (...params: Parameters<T[K]>) => Promise<ReturnType<T[K]> | Error>;
}
function handler<T extends object>(namespace: string, waitService: boolean): ProxyHandler<T> {
return {
get: (_target: T, prop: string): any => (...params: any): Promise<any> => api[waitService ? 'waitAndCall' : 'call'](`${ namespace }.${ prop }`, params),
};
}
export function proxifyWithWait<T>(namespace: string): Prom<T> {
return new Proxy({}, handler(namespace, true)) as unknown as Prom<T>;
}
export function proxify<T>(namespace: string): PromOrError<T> {
return new Proxy({}, handler(namespace, false)) as unknown as Prom<T>;
}