rpcchannel
Version:
Easy RPC with permission controls
91 lines (90 loc) • 3.4 kB
TypeScript
import { MultistringAddress, AddressMap } from './addrmap';
import { SerializableData } from './serializer';
import { RpcChannel, RpcFunction } from './registry';
export declare type AccessPolicy = boolean;
export declare const AccessPolicy: {
ALLOW: boolean;
DENY: boolean;
};
export declare type OptAccessPolicy = AccessPolicy | undefined | null;
export declare const OptAccessPolicy: {
NONE: null;
} & {
ALLOW: boolean;
DENY: boolean;
};
export interface CanCallOpts {
args: SerializableData[];
wc: string[];
channel: RpcChannel;
func?: RpcFunction;
}
export declare type AccessCanFunction = (addr: MultistringAddress, opts: CanCallOpts) => OptAccessPolicy;
/**
* Controls access to RPC endpoints based on address AND arguments.
*/
export interface AccessController {
can(addr: MultistringAddress, opts: CanCallOpts): OptAccessPolicy;
}
/**
* Always allows access.
*/
export declare class AllowAccessController implements AccessController {
can(): AccessPolicy;
}
/**
* Always denies access.
*/
export declare class DenyAccessController implements AccessController {
can(): AccessPolicy;
}
/**
* Controls access based on a single function
*/
export declare class FunctionAccessController implements AccessController {
readonly can: AccessCanFunction;
constructor(can: AccessCanFunction);
}
/**
* Gives higher `AccessController`s in the chain priority.
*/
export declare class ChainedAccessController implements AccessController {
default_ap: OptAccessPolicy;
readonly access_chain: AccessController[];
constructor(default_ap?: OptAccessPolicy);
can(addr: MultistringAddress, opts: CanCallOpts): OptAccessPolicy;
}
/**
* The old type of access control based on an address-to-policy map.
*/
export declare class LegacyAccessController implements AccessController {
readonly map: AddressMap<boolean>;
can(to: MultistringAddress): OptAccessPolicy;
}
/**
* Lookup a function to determine access on a per-address basis
*/
export declare class FunctionLookupAccessController implements AccessController {
readonly map: AddressMap<AccessCanFunction>;
can(to: MultistringAddress, opts: CanCallOpts): OptAccessPolicy;
}
export declare const CanCallFunction: unique symbol;
export declare const RequiresPermissions: unique symbol;
export interface PermissionedCanCallOpts extends CanCallOpts {
require: (perm: string) => void;
perms: Set<string>;
}
export declare type PermissionedAccessCanFunction = (addr: MultistringAddress, opts: PermissionedCanCallOpts) => OptAccessPolicy;
/**
* First, this `AccessController` will check the `RequiresPermissions` property
* on the target function. If any of these are missing from the member `perms`
* set, then access is denied. Otherwise, if `CanCallFunction` is defined, then
* its result is returned. The `CanCallFunction` may also require permissions.
*/
export declare class AutoFunctionAccessController implements AccessController {
perms: Set<string>;
constructor(perms?: Set<string>);
can(to: MultistringAddress, opts: CanCallOpts): OptAccessPolicy;
}
export declare function RequirePermissions(perms: string[]): (target: any, propertyKey: string, descriptor: PropertyDescriptor) => void;
export declare function SetCanCallFunc(can: AccessCanFunction): (target: any, propertyKey: string, descriptor: PropertyDescriptor) => void;