import {IJSONRPCReturnType} from './express' import {WithContext, RPCClient, RPCActions} from './types' import {createActions} from './redux' import {createLocalClient, LocalClient} from './local' function keys(obj: T): Array { return Object.keys(obj) as Array } export type BulkServices = { [K in keyof T & string]: WithContext } export type BulkLocalClient = {[K in keyof T & string]: LocalClient} export type BulkActions = {[K in keyof T & string]: RPCActions} export type BulkClient = {[K in keyof T & string]: RPCClient} function bulkCreate( src: T, mapValue: (key: K, value: T[K]) => any, ) { return keys(src).reduce((obj, key) => { const value = mapValue(key, src[key]) obj[key] = value return obj }, {} as any) } export function bulkCreateLocalClient>( src: T, context: Cx, ): BulkLocalClient { return bulkCreate(src, (key, value) => createLocalClient(value, context)) } export function bulkCreateActions>>( src: T, ): BulkActions { return bulkCreate(src, (key, value) => createActions(value, key)) } export function bulkjsonrpc( jsonrpc: IJSONRPCReturnType, services: T, ) { keys(services).forEach(key => { const service = services[key] jsonrpc.addService('/' + key, service) }) return jsonrpc.router() }