{"id":20161039,"url":"https://github.com/delight-rpc/delight-rpc","last_synced_at":"2025-09-21T12:31:25.002Z","repository":{"id":44843901,"uuid":"323011404","full_name":"delight-rpc/delight-rpc","owner":"delight-rpc","description":"🌲 The easiest-to-use RPC library designed for TypeScript and JavaScript.","archived":false,"fork":false,"pushed_at":"2023-04-04T02:04:30.000Z","size":2838,"stargazers_count":2,"open_issues_count":0,"forks_count":0,"subscribers_count":2,"default_branch":"main","last_synced_at":"2024-12-14T01:11:57.886Z","etag":null,"topics":["browser","esm","library","nodejs","npm-package","typescript"],"latest_commit_sha":null,"homepage":"https://www.npmjs.com/package/delight-rpc","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/delight-rpc.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2020-12-20T06:46:03.000Z","updated_at":"2024-11-09T20:52:12.000Z","dependencies_parsed_at":"2024-06-21T16:42:41.084Z","dependency_job_id":"3d57fdf1-d91a-4ec4-af00-ca25b976b354","html_url":"https://github.com/delight-rpc/delight-rpc","commit_stats":{"total_commits":201,"total_committers":2,"mean_commits":100.5,"dds":0.04975124378109452,"last_synced_commit":"ab2c1dc949d2b638ba1d2b4ff247c7227a6b3fed"},"previous_names":[],"tags_count":61,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/delight-rpc%2Fdelight-rpc","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/delight-rpc%2Fdelight-rpc/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/delight-rpc%2Fdelight-rpc/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/delight-rpc%2Fdelight-rpc/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/delight-rpc","download_url":"https://codeload.github.com/delight-rpc/delight-rpc/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":233750130,"owners_count":18724390,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["browser","esm","library","nodejs","npm-package","typescript"],"created_at":"2024-11-14T00:17:06.214Z","updated_at":"2025-09-21T12:31:19.639Z","avatar_url":"https://github.com/delight-rpc.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# delight-rpc\nThe easiest-to-use RPC library designed for TypeScript and JavaScript.\n\n## Install\n```sh\nnpm install --save delight-rpc\n# or\nyarn add delight-rpc\n```\n\n## Usage\n### Client\n```ts\nimport { createClient } from 'delight-rpc'\n\ninterface IAPI {\n  foo(bar: string): string\n}\n\nconst client = createClient\u003cIAPI\u003e(send)\nconst result = await client.foo('bar')\n```\n\n### BatchClient\n```ts\nimport { createBatchProxy, BatchClient } from 'delight-rpc'\n\ninterface IAPI {\n  getNumber(): number\n  getString(): string\n}\n\nconst client = new BatchClient(send)\nconst proxy = createBatchProxy\u003cIAPI\u003e()\nconst results = await client.parallel(\n  proxy.getNumber()\n, proxy.getString()\n)\n\n// `Result` comes from the `return-style` module, it has Rust-like APIs\nresults[0] // Result\u003cnumber, Error\u003e\nresults[1] // Result\u003cstring, Error\u003e\n```\n\n### Server\n```ts\nimport { createResponse, IRequest, IBatchRequest } from 'delight-rpc'\n\nconst api: IAPI = {\n  foo(bar: string) {\n    return bar\n  }\n}\n\nasync function handle(\n  request: IRequest\u003cunknown\u003e | IBatchRequest\u003cunknown\u003e\n): Promise\u003cIResponse\u003cunknown\u003e | IBatchResponse\u003cunknown\u003e\u003e {\n  return await createResponse(api, request)\n}\n```\n\n## API\n```ts\ntype ImplementationOf\u003cObj\u003e = {\n  [Key in FunctionKeys\u003cObj\u003e | KeysByType\u003cObj, object\u003e]:\n    Obj[Key] extends (...args: infer Args) =\u003e infer Result\n      ? (...args: [...args: Args, signal?: AbortSignal]) =\u003e Awaitable\u003cAwaited\u003cResult\u003e\u003e\n      : ImplementationOf\u003cObj[Key]\u003e\n}\n\ntype ParameterValidators\u003cObj\u003e = Partial\u003c{\n  [Key in FunctionKeys\u003cObj\u003e | KeysByType\u003cObj, object\u003e]:\n    Obj[Key] extends (...args: infer Args) =\u003e unknown\n      ? (...args: Args) =\u003e void\n      : ParameterValidators\u003cObj[Key]\u003e\n}\u003e\n```\n\n### createClient\n```ts\ntype ClientProxy\u003cObj\u003e = {\n  [Key in FunctionKeys\u003cObj\u003e | KeysByType\u003cObj, object\u003e]:\n    Obj[Key] extends (...args: infer Args) =\u003e infer Result\n      ? (...args: [...args: Args, signal?: AbortSignal]) =\u003e Promise\u003cAwaited\u003cResult\u003e\u003e\n      : ClientProxy\u003cObj[Key]\u003e\n}\n\nfunction createClient\u003cAPI extends object, DataType = unknown\u003e(\n  send: (\n    request: IRequest\u003cDataType\u003e\n  , signal?: AbortSignal\n  ) =\u003e Awaitable\u003cIResponse\u003cDataType\u003e\u003e\n, options?: {\n    parameterValidators?: ParameterValidators\u003cAPI\u003e\n    expectedVersion?: string\n    channel?: string\n  }\n): ClientProxy\u003cAPI\u003e\n```\n\nFor easy distinction, when the method is not available,\n`MethodNotAvailable` will be thrown instead of the general `Error`.\n\n### BatchClient\n```ts\ntype MapRequestsToResults\u003cRequestTuple extends IRequestForBatchRequest\u003cunknown, unknown\u003e[]\u003e = {\n  [Index in keyof RequestTuple]:\n    RequestTuple[Index] extends IRequestForBatchRequest\u003cinfer T, unknown\u003e\n    ? Result\u003cT, Error\u003e\n    : never\n}\n\nclass BatchClient\u003cDataType = unknown\u003e {\n  constructor(\n    send: (batchRequest: IBatchRequest\u003cDataType\u003e) =\u003e Awaitable\u003c\n    | IError\n    | IBatchResponse\u003cDataType\u003e\n    \u003e\n  , options?: {\n      expectedVersion?: string\n      channel?: string\n    }\n  )\n\n  async parallel\u003cT extends IRequestForBatchRequest\u003cunknown, DataType\u003e[]\u003e(\n    ...requests: T\n  ): Promise\u003cMapRequestsToResults\u003cT\u003e\u003e\n\n  async series\u003cT extends IRequestForBatchRequest\u003cunknown, DataType\u003e[]\u003e(\n    ...requests: T\n  ): Promise\u003cMapRequestsToResults\u003cT\u003e\u003e\n}\n```\n\n### createBatchProxy\n```ts\ntype BatchClientProxy\u003cObj, DataType\u003e = {\n  [Key in FunctionKeys\u003cObj\u003e | KeysByType\u003cObj, object\u003e]:\n    Obj[Key] extends (...args: infer Args) =\u003e infer Result\n      ? (...args: Args) =\u003e IRequestForBatchRequest\u003cAwaited\u003cResult\u003e, DataType\u003e\n      : BatchClientProxy\u003cObj[Key], DataType\u003e\n}\n\nfunction createBatchProxy\u003cAPI extends object, DataType = unknown\u003e(\n  options?: {\n    parameterValidators?: ParameterValidators\u003cAPI\u003e\n  }\n): BatchClientProxy\u003cAPI, DataType\u003e\n```\n\n### createResponse\n```ts\nconst AnyChannel\n\nfunction createResponse\u003cAPI, DataType\u003e(\n  api: ImplementationOf\u003cAPI\u003e\n, request: IRequest\u003cDataType\u003e | IBatchRequest\u003cDataType\u003e\n, { parameterValidators = {}, version, channel, signal, ownPropsOnly = false }: {\n    parameterValidators?: ParameterValidators\u003cAPI\u003e\n    version?: `${number}.${number}.${number}`\n    channel?: string | RegExp | typeof AnyChannel\n    ownPropsOnly?: boolean\n    signal?: AbortSignal\n  } = {}\n): Promise\u003cnull | IResponse\u003cDataType\u003e | IBatchResponse\u003cDataType\u003e\u003e\n```\n\n`createResponse` returns `null` if the channel does not match.\n\n### MethodNotAvailable\n```ts\nclass MethodNotAvailable extends CustomError {}\n```\n\n### VersionMismatch\n```ts\nclass VersionMismatch extends CustomError {}\n```\n\n### InternalError\n```ts\nclass InternalError extends CustomError {}\n```\n\n### isRequst\n```ts\nfunction isRequest\u003cDataType\u003e(val: unknown): val is IRequest\u003cDataType\u003e\n```\n\n### isResult\n```ts\nfunction isResult\u003cDataType\u003e(val: unknown): val is IResult\u003cDataType\u003e\n```\n\n### isError\n```ts\nfunction isError(val: unknown): val is IError\n```\n\n### isBatchRequest\n```ts\nfunction isBatchRequest\u003cT\u003e(val: unknown): val is IBatchRequest\u003cT\u003e\n```\n\n### isBatchResponse\n```ts\nfunction isBatchResponse\u003cT\u003e(val: unknown): val is IBatchResponse\u003cT\u003e \n```\n\n### matchChannel\n```ts\nfunction matchChannel\u003cDataType\u003e(\n  message: IDelightRPC\n, channel:\n  | undefined\n  | string\n  | RegExp\n  | typeof AnyChannel\n): boolean\n```\n\n### createAbort\n```ts\nfunction createAbort(id: string, channel: string | undefined): IAbort\n```\n\n### isAbort\n```ts\nfunction isAbort(val: unknown): val is IAbort\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdelight-rpc%2Fdelight-rpc","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdelight-rpc%2Fdelight-rpc","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdelight-rpc%2Fdelight-rpc/lists"}