{"id":13780159,"url":"https://github.com/koalex/koa-json-rpc","last_synced_at":"2025-05-07T08:10:39.203Z","repository":{"id":36462634,"uuid":"224700020","full_name":"koalex/koa-json-rpc","owner":"koalex","description":"JSON-RPC 2.0 middleware for Koa.js which implements the","archived":false,"fork":false,"pushed_at":"2023-01-24T00:51:27.000Z","size":83,"stargazers_count":7,"open_issues_count":14,"forks_count":1,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-04-23T01:18:08.375Z","etag":null,"topics":["json-rpc","koa2"],"latest_commit_sha":null,"homepage":"https://www.jsonrpc.org/specification","language":"JavaScript","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/koalex.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2019-11-28T17:20:47.000Z","updated_at":"2025-01-11T00:28:03.000Z","dependencies_parsed_at":"2023-02-13T06:45:35.454Z","dependency_job_id":null,"html_url":"https://github.com/koalex/koa-json-rpc","commit_stats":null,"previous_names":[],"tags_count":3,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/koalex%2Fkoa-json-rpc","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/koalex%2Fkoa-json-rpc/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/koalex%2Fkoa-json-rpc/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/koalex%2Fkoa-json-rpc/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/koalex","download_url":"https://codeload.github.com/koalex/koa-json-rpc/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":252839294,"owners_count":21812090,"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":["json-rpc","koa2"],"created_at":"2024-08-03T18:01:12.916Z","updated_at":"2025-05-07T08:10:39.187Z","avatar_url":"https://github.com/koalex.png","language":"JavaScript","funding_links":[],"categories":["Middleware"],"sub_categories":[],"readme":"# koa-json-rpc\n\n\u003e JSON-RPC 2.0 middleware for [Koa.js](https://github.com/koajs/koa) which implements the [https://www.jsonrpc.org/specification](https://www.jsonrpc.org/specification)\n\n* Batch support\n* Parallel handling\n\n## Installation\n\nInstall using [npm](https://www.npmjs.org/):\n\n```sh\nnpm i @koalex/koa-json-rpc --save\n```\n## API Reference\n  \n* [koa-json-rpc](#module_koa-json-rpc)\n    * [Jsonrpc](#exp_module_koa-json-rpc)\n        * [new Jsonrpc([opts])](#new_module_koa-json-rpc_new)\n        * _instance_\n            * [.method(method, middleware)](#new_module_koa-json-rpc_new_method) ⇒ \u003ccode\u003eJsonrpc\u003c/code\u003e\n            * [.methods [[Get]]](#new_module_koa-json-rpc_new_methods_static) ⇒ \u003ccode\u003eArray\u003c/code\u003e\n            * [.middleware [[Get]]](#new_module_koa-json-rpc_new_middleware) ⇒ \u003ccode\u003eFunction\u003c/code\u003e\n        * _static_\n            * [.parseError [[Gett]]](#module_koa-json-rpc_parseerror_static) ⇒ \u003ccode\u003eObject\u003c/code\u003e\n         \n         \n\u003ca name=\"exp_module_koa-json-rpc\"\u003e\u003c/a\u003e\n### Jsonrpc ⏏\n**Kind**: Exported class \n   \n   \n\u003ca name=\"new_module_koa-json-rpc_new\"\u003e\u003c/a\u003e\n#### new Jsonrpc([opts])\nCreate a new JSON-RPC\n\n| Param | Type | Description |\n| --- | --- | --- |\n| [opts] | \u003ccode\u003eObject\u003c/code\u003e |  |\n| [opts.onerror] | \u003ccode\u003eFunction\u003c/code\u003e |  |\n| [opts.parallel] | \u003ccode\u003eBoolean\u003c/code\u003e | default is \u003ccode\u003etrue\u003c/code\u003e |\n| [opts.bodyParser] | \u003ccode\u003eFunction\u003c/code\u003e | \u003ccode\u003ekoa-bodyparser\u003c/code\u003e or \u003ccode\u003easync-busboy\u003c/code\u003e or some another. |\n\n**Examples**  \nBasic usage:\n\n```javascript\nconst Koa        = require('koa');\nconst Router     = require('koa-router');\nconst bodyParser = require('koa-bodyparser');\nconst Jsonrpc    = require('@koalex/koa-json-rpc');\n\nconst app     = new Koa();\nconst router  = new Router();\n\nconst jsonrpc = new Jsonrpc({\n    bodyParser: bodyParser({\n        onerror: (err, ctx) =\u003e {\n            ctx.status = 200;\n            ctx.body = Jsonrpc.parseError;\n        }\n    })\n});\n\njsonrpc.method('someMethod', (ctx, next) =\u003e {\n    // ctx.jsonrpc available\n    /*\n        ctx.jsonrpc.request\n        ctx.jsonrpc.id\n        ctx.jsonrpc.method [[Get]]\n        ctx.jsonrpc.params [[Get]]\n        ctx.jsonrpc.response\n        ctx.jsonrpc.result\n        ctx.jsonrpc.error\n        ctx.jsonrpc.code\n        ctx.jsonrpc.message\n        ctx.jsonrpc.data\n    */\n    ctx.body = 'Hello world!';\n});\n\nrouter.post('/api', jsonrpc.middleware);\n\napp.use(router.routes());\n/*\n    REQUEST -\u003e {id: 987, jsonrpc: '2.0', method: 'someMethod'}\n    RESPONSE \u003c- {jsonrpc: '2.0', id: 987, result: 'Hello world!'}\n*/\n```\n**Additional usage examples:**\n```javascript\njsonrpc.method('sum', (ctx, next) =\u003e {\n    let sum = 0;\n    ctx.jsonrpc.params.forEach(num =\u003e sum += num);\n    ctx.body = sum;\n    /*\n        also you can:\n        ctx.jsonrpc.result = sum;\n        ctx.body = ctx.jsonrpc.response;\n    */\n});\njsonrpc.method('someErrMethod', (ctx, next) =\u003e {\n    throw new Error('Crash...');\n});\njsonrpc.method('someHttpErrMethod', (ctx, next) =\u003e {\n    ctx.throw(500);\n});\n/*\n    REQUEST -\u003e {id: 1, jsonrpc: '2.0', method: 'sum', params: [1, 2, 3]}\n    RESPONSE \u003c- {jsonrpc: '2.0', id: 1, result: 6}\n*/\n/*\n    REQUEST -\u003e {id: 2, jsonrpc: '2.0', method: 'someErrMethod', params: [1, 2, 3]}\n    RESPONSE \u003c- {jsonrpc: '2.0', id: 2, error: {code: -32000: message: 'Server error', data: 'Error: Crash...'}}\n*/\n/*\n    REQUEST -\u003e {id: 3, jsonrpc: '2.0', method: 'someHttpErrMethod', params: [1, 2, 3]}\n    RESPONSE \u003c- {jsonrpc: '2.0', id: 3, error: {code: -32000: message: 'Server error', data: {message: 'Internal Server Error'}}}\n*/\n```\nBatch:\n```javascript\nconst Koa        = require('koa');\nconst Router     = require('koa-router');\nconst bodyParser = require('koa-bodyparser');\nconst Jsonrpc    = require('@koalex/koa-json-rpc');\n\nconst app    = new Koa();\nconst router = new Router();\n\nconst jsonrpc = new Jsonrpc({\n    bodyParser: bodyParser({\n        onerror: (err, ctx) =\u003e {\n            ctx.status = 200;\n            ctx.body = Jsonrpc.parseError;\n        }\n    })\n});\n\njsonrpc.method('sum', (ctx, next) =\u003e {\n    let sum = 0;\n    ctx.jsonrpc.params.forEach(num =\u003e sum += num);\n    ctx.body = sum;\n});\njsonrpc.method('subtract', (ctx, next) =\u003e {\n    ctx.body = ctx.jsonrpc.params.minuend - ctx.jsonrpc.params.subtrahend;\n});\n\nrouter.post('/api', jsonrpc.middleware);\n\napp.use(router.routes());\n\n/* \n    REQUEST -\u003e\n    [\n        {id: 123, jsonrpc: '2.0', method: 'sum', params: [1, 2, 3]},\n        {id: 456, jsonrpc: '2.0', method: 'subtract', params: {minuend: 10, subtrahend: 3}}\n    ]\n\n    RESPONSE \u003c-\n    [\n        {id: 123, jsonrpc: '2.0', result: 6},\n        {id: 456, jsonrpc: '2.0', result: 7}\n    ]\n*/\n```\nBatch with different instances of Jsonrpc:\n```javascript\nconst Koa           = require('koa');\nconst Router        = require('koa-router');\nconst koaBodyParser = require('koa-bodyparser');\nconst Jsonrpc       = require('@koalex/koa-json-rpc');\n\nconst app     = new Koa();\nconst router  = new Router();\n\nconst bodyParser = koaBodyParser({\n    onerror: (err, ctx) =\u003e {\n        ctx.status = 200;\n        ctx.body = Jsonrpc.parseError;\n    }\n});\n\nconst jsonrpc1 = new Jsonrpc();\nconst jsonrpc2 = new Jsonrpc();\n\njsonrpc1.method('sum', (ctx, next) =\u003e {\n    let sum = 0;\n    ctx.jsonrpc.params.forEach(num =\u003e sum += num);\n    ctx.body = sum;\n});\njsonrpc2.method('subtract', (ctx, next) =\u003e {\n    ctx.body = ctx.jsonrpc.params.minuend - ctx.jsonrpc.params.subtrahend;\n});\n\nrouter.post('/api', bodyParser, jsonrpc.middleware, jsonrpc2.middleware);\n\napp.use(router.routes());\n\n/* \n    REQUEST -\u003e\n    [\n        {id: 1234, jsonrpc: '2.0', method: 'sum', params: [1, 2, 3]},\n        {id: 4567, jsonrpc: '2.0', method: 'subtract', params: {minuend: 10, subtrahend: 3}}\n    ]\n\n    RESPONSE \u003c-\n    [\n        {id: 1234, jsonrpc: '2.0', result: 6},\n        {id: 4567, jsonrpc: '2.0', result: 7}\n    ]\n*/\n```\n\n\u003ca name=\"new_module_koa-json-rpc_new_method\"\u003e\u003c/a\u003e\n#### jsonrpc.method(methodName, middleware [,...middleware]) ⇒ \u003ccode\u003eJsonrpc\u003c/code\u003e\n| Param | Type | Description |\n| --- | --- | --- |\n| methodName | \u003ccode\u003eString\u003c/code\u003e | A String containing the name of the method to be invoked. Method names that begin with the word `rpc` followed by a period character (U+002E or ASCII 46) are reserved for rpc-internal methods and extensions and MUST NOT be used for anything else. |\n| middleware | \u003ccode\u003eFunction\u003c/code\u003e | middleware |\n\n\n\n\u003ca name=\"new_module_koa-json-rpc_new_methods_static\"\u003e\u003c/a\u003e\n#### jsonrpc.methods [[Get]]⇒ \u003ccode\u003eArray\u003c/code\u003e\nReturns a list of registered methods.\n\n```javascript\njsonrpc.method('sum', (ctx, next) =\u003e {\n    // Some code...\n});\njsonrpc.method('subtract', (ctx, next) =\u003e {\n    // Some code...\n});\n\nconsole.log( jsonrpc.methods ); // ['sum', 'subtract']\n```\n\n\n\u003ca name=\"new_module_koa-json-rpc_new_middleware\"\u003e\u003c/a\u003e\n#### jsonrpc.middleware [[Get]]⇒ \u003ccode\u003eFunction\u003c/code\u003e\nReturns a middleware function which takes arguments \u003ccode\u003ectx\u003c/code\u003e and \u003ccode\u003enext\u003c/code\u003e\n\n\n\u003ca name=\"module_koa-json-rpc_parseerror_static\"\u003e\u003c/a\u003e\n#### Jsonrpc.parseError ⇒ \u003ccode\u003eObject\u003c/code\u003e\nReturns error reponse object:\n\u003ccode\u003e\n{\n    jsonrpc: '2.0',\n    id: null,\n    error: {\n        code: -32700,\n        message: 'Parse error',\n    }\n}\n\u003c/code\u003e\n\n**Kind**: static method of \u003ccode\u003e[Jsonrpc](#exp_module_koa-json-rpc)\u003c/code\u003e  \n\n**Example**  \n```javascript\nconst Koa        = require('koa');\nconst Router     = require('koa-router');\nconst bodyParser = require('koa-bodyparser');\nconst Jsonrpc    = require('@koalex/koa-json-rpc');\n\nconst app    = new Koa();\nconst router = new Router();\n\nconst jsonrpc = new Jsonrpc({\n    bodyParser: bodyParser({\n        onerror: (err, ctx) =\u003e {\n            ctx.status = 200;\n            ctx.body = Jsonrpc.parseError;\n        }\n    })\n});\n\njsonrpc.method('someMethod', (ctx, next) =\u003e {\n    // ctx.jsonrpc available\n});\n\nrouter.post('/api', jsonrpc.middleware);\n\napp.use(router.routes());\n```\n\n## Contributing\n\nPlease submit all issues and pull requests to the [koalex/koa-json-rpc](http://github.com/koalex/koa-json-rpc) repository!\n\n## Tests\n\nRun tests using `npm test`.\n\n\u003chr/\u003e\n\nThis project using [SemVer](http://semver.org) for versioning. For the versions available, see the [tags on this repository](https://github.com/koalex/koa-json-rpc/tags). \n\nThis project is licensed under the MIT License - see the [LICENSE](LICENSE) file for details\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fkoalex%2Fkoa-json-rpc","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fkoalex%2Fkoa-json-rpc","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fkoalex%2Fkoa-json-rpc/lists"}