UNPKG

@metamask/kernel-rpc-methods

Version:
1 lines 3.81 kB
{"version":3,"file":"types.mjs","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"","sourcesContent":["import type { Infer, Struct } from '@metamask/superstruct';\nimport type { JsonRpcParams, Json } from '@metamask/utils';\n\n// Client-side types\n\nexport type MethodSignature<\n Method extends string,\n Params extends JsonRpcParams,\n Result extends Json | Promise<Json>,\n> = (method: Method, params: Params) => Result;\n\nexport type MethodSpec<\n Method extends string,\n Params extends JsonRpcParams,\n Result extends Json | Promise<Json> | void | Promise<void>,\n> = Result extends void | Promise<void>\n ? { method: Method; params: Struct<Params>; result?: undefined }\n : {\n method: Method;\n params: Struct<Params>;\n result: Struct<UnwrapPromise<Result>>;\n };\n\n// `any` can safely be used in constraints.\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype SpecConstraint = MethodSpec<string, any, any>;\n\nexport type MethodSpecRecord<Methods extends SpecConstraint> = {\n [Key in Methods['method']]: Extract<Methods, { method: Key }>;\n};\n\ntype SpecRecordConstraint = MethodSpecRecord<SpecConstraint>;\n\nexport type ExtractMethodSignature<Spec extends SpecConstraint> =\n Spec extends ((\n method: infer Method extends string,\n params: infer Params extends JsonRpcParams,\n ) => infer Result extends Json | Promise<Json>)\n ? MethodSignature<Method, Params, Result>\n : never;\n\nexport type ExtractMethodSpec<\n Specs extends SpecRecordConstraint,\n Key extends keyof Specs = keyof Specs,\n> = Specs[Key];\n\nexport type ExtractMethod<Specs extends SpecRecordConstraint> =\n ExtractMethodSpec<Specs>['method'];\n\nexport type ExtractRequest<Specs extends SpecRecordConstraint> =\n // Safe to use `any` in constraints.\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n Extract<ExtractMethodSpec<Specs>, { result: Struct<any> }>['method'];\n\nexport type ExtractNotification<Specs extends SpecRecordConstraint> = Extract<\n ExtractMethodSpec<Specs>,\n { result?: undefined }\n>['method'];\n\nexport type ExtractParams<\n Method extends string,\n Specs extends SpecRecordConstraint,\n> = Infer<ExtractMethodSpec<Specs, Method>['params']>;\n\nexport type ExtractResult<\n Method extends string,\n Specs extends SpecRecordConstraint,\n> =\n // Safe to use `any` in constraints.\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n ExtractMethodSpec<Specs, Method> extends MethodSpec<any, any, infer Result>\n ? UnwrapPromise<Result>\n : never;\n\nexport type HandlerFunction<\n Params extends JsonRpcParams,\n Result extends Json | Promise<Json> | void | Promise<void>,\n Hooks extends Record<string, unknown>,\n> = (hooks: Hooks, params: Params) => Result;\n\n// Service-side types\n\nexport type Handler<\n Method extends string,\n Params extends JsonRpcParams,\n Result extends Json | Promise<Json> | void | Promise<void>,\n Hooks extends Record<string, unknown>,\n> = MethodSpec<Method, Params, Result> & {\n hooks: { [Key in keyof Hooks]: true };\n implementation: HandlerFunction<Params, Result, Hooks>;\n};\n\n// `any` can safely be used in constraints.\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype HandlerConstraint = Handler<string, any, any, any>;\n\nexport type HandlerRecord<Handlers extends HandlerConstraint> = {\n [Key in Handlers['method']]: Extract<Handlers, { method: Key }>;\n};\n\n// Utils\n\n// eslint-disable-next-line @typescript-eslint/naming-convention\ntype UnwrapPromise<T> = T extends Promise<infer U> ? U : T;\n\nexport type MethodRequest<Method extends SpecConstraint> = {\n id: string | number | null;\n jsonrpc: '2.0';\n method: Method['method'];\n params: Infer<Method['params']>;\n};\n"]}