{"id":43169199,"url":"https://github.com/sangaman/http-jsonrpc-server","last_synced_at":"2026-02-01T02:15:54.982Z","repository":{"id":29345185,"uuid":"121174593","full_name":"sangaman/http-jsonrpc-server","owner":"sangaman","description":"A simple and lightweight library for creating a JSON-RPC 2.0 compliant HTTP server","archived":false,"fork":false,"pushed_at":"2025-07-21T23:16:59.000Z","size":345,"stargazers_count":8,"open_issues_count":1,"forks_count":4,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-10-17T07:42:33.065Z","etag":null,"topics":["http-server","json-rpc","json-rpc-server","json-rpc2"],"latest_commit_sha":null,"homepage":null,"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/sangaman.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,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2018-02-11T22:40:24.000Z","updated_at":"2025-10-04T15:56:54.000Z","dependencies_parsed_at":"2024-06-20T21:48:53.442Z","dependency_job_id":"194f4505-f1de-4052-8359-40006334015a","html_url":"https://github.com/sangaman/http-jsonrpc-server","commit_stats":{"total_commits":77,"total_committers":5,"mean_commits":15.4,"dds":0.1558441558441559,"last_synced_commit":"792f58ffdb869dfa532fef991604713d4b0e20e3"},"previous_names":[],"tags_count":12,"template":false,"template_full_name":null,"purl":"pkg:github/sangaman/http-jsonrpc-server","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sangaman%2Fhttp-jsonrpc-server","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sangaman%2Fhttp-jsonrpc-server/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sangaman%2Fhttp-jsonrpc-server/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sangaman%2Fhttp-jsonrpc-server/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/sangaman","download_url":"https://codeload.github.com/sangaman/http-jsonrpc-server/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sangaman%2Fhttp-jsonrpc-server/sbom","scorecard":{"id":799458,"data":{"date":"2025-08-11","repo":{"name":"github.com/sangaman/http-jsonrpc-server","commit":"792f58ffdb869dfa532fef991604713d4b0e20e3"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":3.4,"checks":[{"name":"Maintained","score":0,"reason":"0 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"name":"Code-Review","score":1,"reason":"Found 2/15 approved changesets -- score normalized to 1","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#code-review"}},{"name":"Token-Permissions","score":0,"reason":"detected GitHub workflow tokens with excessive permissions","details":["Warn: no topLevel permission defined: .github/workflows/master.yaml:1","Info: no jobLevel write permissions found"],"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#token-permissions"}},{"name":"Dangerous-Workflow","score":10,"reason":"no dangerous workflow patterns detected","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#dangerous-workflow"}},{"name":"Packaging","score":-1,"reason":"packaging workflow not detected","details":["Warn: no GitHub/GitLab publishing workflow detected."],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#packaging"}},{"name":"Binary-Artifacts","score":10,"reason":"no binaries found in the repo","details":null,"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#binary-artifacts"}},{"name":"Pinned-Dependencies","score":4,"reason":"dependency not pinned by hash detected -- score normalized to 4","details":["Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/master.yaml:15: update your workflow using https://app.stepsecurity.io/secureworkflow/sangaman/http-jsonrpc-server/master.yaml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/master.yaml:20: update your workflow using https://app.stepsecurity.io/secureworkflow/sangaman/http-jsonrpc-server/master.yaml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/master.yaml:37: update your workflow using https://app.stepsecurity.io/secureworkflow/sangaman/http-jsonrpc-server/master.yaml/master?enable=pin","Info:   0 out of   2 GitHub-owned GitHubAction dependencies pinned","Info:   0 out of   1 third-party GitHubAction dependencies pinned","Info:   1 out of   1 npmCommand dependencies pinned"],"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#pinned-dependencies"}},{"name":"CII-Best-Practices","score":0,"reason":"no effort to earn an OpenSSF best practices badge detected","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#cii-best-practices"}},{"name":"Security-Policy","score":0,"reason":"security policy file not detected","details":["Warn: no security policy file detected","Warn: no security file to analyze","Warn: no security file to analyze","Warn: no security file to analyze"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#security-policy"}},{"name":"Fuzzing","score":0,"reason":"project is not fuzzed","details":["Warn: no fuzzer integrations found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#fuzzing"}},{"name":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE:0","Info: FSF or OSI recognized license: MIT License: LICENSE:0"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"name":"Branch-Protection","score":0,"reason":"branch protection not enabled on development/release branches","details":["Warn: branch protection not enabled for branch 'master'"],"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#branch-protection"}},{"name":"Signed-Releases","score":-1,"reason":"no releases found","details":null,"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#signed-releases"}},{"name":"SAST","score":0,"reason":"SAST tool is not run on all commits -- score normalized to 0","details":["Warn: 0 commits out of 19 are checked with a SAST tool"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}},{"name":"Vulnerabilities","score":6,"reason":"4 existing vulnerabilities detected","details":["Warn: Project is vulnerable to: GHSA-v6h2-p8h4-qcjw","Warn: Project is vulnerable to: GHSA-3xgq-45jj-v275","Warn: Project is vulnerable to: GHSA-fjxv-7rqg-78g4","Warn: Project is vulnerable to: GHSA-75v8-2h7p-7m2m"],"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}}]},"last_synced_at":"2025-08-23T09:59:11.704Z","repository_id":29345185,"created_at":"2025-08-23T09:59:11.704Z","updated_at":"2025-08-23T09:59:11.704Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28965036,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-02-01T02:14:24.993Z","status":"ssl_error","status_checked_at":"2026-02-01T02:13:55.706Z","response_time":56,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"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":["http-server","json-rpc","json-rpc-server","json-rpc2"],"created_at":"2026-02-01T02:15:49.270Z","updated_at":"2026-02-01T02:15:54.975Z","avatar_url":"https://github.com/sangaman.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# http-jsonrpc-server\n\n![GitHub Actions Build](https://github.com/sangaman/http-jsonrpc-server/actions/workflows/master.yaml/badge.svg)\n[![Coverage](https://sonarcloud.io/api/project_badges/measure?project=sangaman_http-jsonrpc-server\u0026metric=coverage)](https://sonarcloud.io/summary/new_code?id=sangaman_http-jsonrpc-server)\n[![Security Rating](https://sonarcloud.io/api/project_badges/measure?project=sangaman_http-jsonrpc-server\u0026metric=security_rating)](https://sonarcloud.io/summary/new_code?id=sangaman_http-jsonrpc-server)\n[![Reliability Rating](https://sonarcloud.io/api/project_badges/measure?project=sangaman_http-jsonrpc-server\u0026metric=reliability_rating)](https://sonarcloud.io/summary/new_code?id=sangaman_http-jsonrpc-server)\n[![Maintainability Rating](https://sonarcloud.io/api/project_badges/measure?project=sangaman_http-jsonrpc-server\u0026metric=sqale_rating)](https://sonarcloud.io/summary/new_code?id=sangaman_http-jsonrpc-server)[![Lines of Code](https://sonarcloud.io/api/project_badges/measure?project=sangaman_http-jsonrpc-server\u0026metric=ncloc)](https://sonarcloud.io/summary/new_code?id=sangaman_http-jsonrpc-server)\n[![Socket Badge](https://socket.dev/api/badge/npm/package/http-jsonrpc-server)](https://socket.dev/npm/package/http-jsonrpc-server)\n[![License: MIT](https://img.shields.io/badge/License-MIT%202.0-brightgreen.svg)](https://opensource.org/licenses/MIT)\n\n- [http-jsonrpc-server](#http-jsonrpc-server)\n  - [Install](#install)\n  - [Usage](#usage)\n    - [Specifying a Path](#specifying-a-path)\n    - [Optional Callbacks](#optional-callbacks)\n    - [Adding/Updating Methods](#addingupdating-methods)\n    - [Closing the Server](#closing-the-server)\n    - [Basic Authentication](#basic-authentication)\n    - [Native HTTP Server](#native-http-server)\n    - [Exposed Constants](#exposed-constants)\n  - [API Documentation](#api-documentation)\n  - [RpcServer](#rpcserver)\n    - [new RpcServer(options)](#new-rpcserveroptions)\n    - [rpcServer.setMethod(name, method)](#rpcserversetmethodname-method)\n    - [rpcServer.listen(port, host) ⇒ \u003ccode\u003ePromise.\u0026lt;number\u0026gt;\u003c/code\u003e](#rpcserverlistenport-host--codepromiseltnumbergtcode)\n    - [rpcServer.close() ⇒ \u003ccode\u003ePromise.\u0026lt;void\u0026gt;\u003c/code\u003e](#rpcserverclose--codepromiseltvoidgtcode)\n  - [Sample Requests](#sample-requests)\n    - [Sum](#sum)\n    - [Sum (Batched)](#sum-batched)\n    - [Wait](#wait)\n\nA simple and lightweight library for creating a JSON-RPC 2.0 compliant HTTP server.\n\nThis package complies with the [JSON-RPC 2.0](http://www.jsonrpc.org/specification) and [JSON-RPC 2.0 Transport: HTTP](https://www.simple-is-better.org/json-rpc/transport_http.html) specifications.\n\n## Install\n\nTo install http-jsonrpc-server in the current directory, run:\n\n```bash\nnpm install http-jsonrpc-server --save\n```\n\n## Usage\n\nBelow is code to create a server with two exposed methods and begin listening on a given port.\n\n```javascript\nconst RpcServer = require('http-jsonrpc-server');\n\nfunction sum(arr) {\n  let total = 0;\n  for (let n = 0; n \u003c arr.length; n += 1) {\n    total += arr[n];\n  }\n  return total;\n}\n\nasync function wait(params) {\n  return new Promise((resolve) =\u003e {\n    setTimeout(() =\u003e {\n      resolve(true);\n    }, params.ms);\n  });\n}\n\nconst rpcServer = new RpcServer({\n  methods: {\n    sum,\n    wait,\n  }\n});\nrpcServer.setMethod('sum', sum);\nrpcServer.setMethod('wait', wait);\nrpcServer.listen(9090, '127.0.0.1').then(() =\u003e {\n  console.log('server is listening at http://127.0.0.1:9090/');\n}\n```\n\n### Specifying a Path\n\n```javascript\nconst rpcServer = new RpcServer({\n  path: '/api'\n});\nrpcServer.listen(9090, '127.0.0.1').then(() =\u003e {\n  console.log('server is listening at http://127.0.0.1:9090/api');\n}\n```\n\n### Optional Callbacks\n\n`onServerError` will be called if the server emits an [error](https://nodejs.org/api/net.html#net_event_error). `onRequest`, and `onRequestError`, and `onResult` will be called each time a method is called, throws an error, or returns a result respectively.\n\n```javascript\nconst rpcServer = new RpcServer({\n  onRequest: (request) =\u003e {\n    console.log(JSON.stringify(request));\n    // sample output: {\"jsonrpc\":\"2.0\",\"id\":1,\"method\":\"sum\",\"params\":[1,2,3]}\n  },\n  onRequestError: (err, id) =\u003e {\n    console.error('request ' + id + ' threw an error: ' + err);\n  },\n  onResult: (result, id) =\u003e {\n    console.log(result); // sample output: 6\n  },\n  onServerError: (err) =\u003e {\n    console.error('the server threw an error: ' + err)\n  },\n});\n```\n\n### Adding/Updating Methods\n\nYou can register new methods or update existing ones after the server has been created.\n\n```javascript\nrpcServer.setMethod('sum', sum);\n```\n\n### Closing the Server\n\n```javascript\nrpcServer.close().then(() =\u003e {\n  console.log('server stopped listening');\n}\n```\n\n### Basic Authentication\n\nYou can optionally enable [Basic Authentication](https://developer.mozilla.org/en-US/docs/Web/HTTP/Authentication) by specifying credentials when creating the server. Any requests will then require an `Authorization` header with `[username]:[password]` encoded in Base64. Note that TLS is not currently supported, therefore all traffic is unencrypted and these credentials can be stolen by anyone relaying or listening to requests. This authentication alone should not be considered secure over public networks.\n\n```javascript\nconst rpcServer = new RpcServer({\n  username: 'johndoe',\n  password: 'wasspord', // ignored unless username is specified\n  realm: 'rpc' // realm defaults to \"Restricted\" if not specified\n});\n```\n\n### Native HTTP Server\n\nYou can access the underlying [http.Server](https://nodejs.org/api/http.html#http_class_http_server) object with `rpcServer.server`.\n\n```javascript\nif (rpcServer.server.listening) {\n  console.log('server is listening');\n}\n```\n\n### Exposed Constants\n\n```javascript\nconsole.log(rpcServer.PARSE_ERROR); // -32700\nconsole.log(rpcServer.INVALID_REQUEST); // -32600\nconsole.log(rpcServer.METHOD_NOT_FOUND); // -32601\nconsole.log(rpcServer.INVALID_PARAMS); // -32602\nconsole.log(rpcServer.SERVER_ERROR); // -32000\nconsole.log(rpcServer.SERVER_ERROR_MAX); // -32099\n```\n\n## API Documentation\n\n\u003ca name=\"RpcServer\"\u003e\u003c/a\u003e\n\n## RpcServer\nClass representing a HTTP JSON-RPC server\n\n**Kind**: global class\n\n* [RpcServer](#RpcServer)\n    * [new RpcServer(options)](#new_RpcServer_new)\n    * [.setMethod(name, method)](#RpcServer+setMethod)\n    * [.listen(port, host)](#RpcServer+listen) ⇒ \u003ccode\u003ePromise.\u0026lt;number\u0026gt;\u003c/code\u003e\n    * [.close()](#RpcServer+close) ⇒ \u003ccode\u003ePromise.\u0026lt;void\u0026gt;\u003c/code\u003e\n\n\u003ca name=\"new_RpcServer_new\"\u003e\u003c/a\u003e\n\n### new RpcServer(options)\n\n| Param | Type | Description |\n| --- | --- | --- |\n| options | \u003ccode\u003eObject\u003c/code\u003e | Optional parameters for the server |\n| options.methods | \u003ccode\u003eObject\u003c/code\u003e | A map of method names to functions. Method functions are passed one parameter which will either be an Object or a string array |\n| options.context |  | Context to be used as `this` for method functions. |\n| options.path | \u003ccode\u003estring\u003c/code\u003e | The path for the server |\n| options.onRequest | \u003ccode\u003efunction\u003c/code\u003e | Callback for when requests are received, it is passed an Object representing the request |\n| options.onRequestError | \u003ccode\u003efunction\u003c/code\u003e | Callback for when requested methods throw errors, it is passed an error and request id |\n| options.onResult | \u003ccode\u003efunction\u003c/code\u003e | Callback for when requests are successfully returned a result. It is passed the response object and request id |\n| options.onServerError | \u003ccode\u003efunction\u003c/code\u003e | Callback for server errors, it is passed an [Error](https://nodejs.org/api/errors.html#errors_class_error) |\n| options.username | \u003ccode\u003estring\u003c/code\u003e | Username for authentication. If provided, Basic Authentication will be enabled and required for all requests. |\n| options.password | \u003ccode\u003estring\u003c/code\u003e | Password for authentication, ignored unless a username is also specified. |\n| options.realm | \u003ccode\u003estring\u003c/code\u003e | Realm for authentication, ignored unless a username is also specified, defaults to `Restricted` if not specified. |\n\n\u003ca name=\"RpcServer+setMethod\"\u003e\u003c/a\u003e\n\n### rpcServer.setMethod(name, method)\nSets a method.\n\n**Kind**: instance method of [\u003ccode\u003eRpcServer\u003c/code\u003e](#RpcServer)\n\n| Param | Type | Description |\n| --- | --- | --- |\n| name | \u003ccode\u003estring\u003c/code\u003e | The name of the method |\n| method | \u003ccode\u003efunction\u003c/code\u003e | The function to be called for this method. Method functions are passed one parameter which will either be an Object or a string array. |\n\n\u003ca name=\"RpcServer+listen\"\u003e\u003c/a\u003e\n\n### rpcServer.listen(port, host) ⇒ \u003ccode\u003ePromise.\u0026lt;number\u0026gt;\u003c/code\u003e\nBegins listening on a given port and host.\n\n**Kind**: instance method of [\u003ccode\u003eRpcServer\u003c/code\u003e](#RpcServer)\n**Returns**: \u003ccode\u003ePromise.\u0026lt;number\u0026gt;\u003c/code\u003e - A promise that resolves to the assigned port once the server is\nlistening. On error the promise will be rejected with an [Error](https://nodejs.org/api/errors.html#errors_class_error).\n\n| Param | Type | Description |\n| --- | --- | --- |\n| port | \u003ccode\u003enumber\u003c/code\u003e | The port number to listen on - an arbitrary available port is used if no port is specified |\n| host | \u003ccode\u003estring\u003c/code\u003e | The host name or ip address to listen on - the unspecified IP address (`0.0.0.0` or `(::)`) is used if no host is specified |\n\n\u003ca name=\"RpcServer+close\"\u003e\u003c/a\u003e\n\n### rpcServer.close() ⇒ \u003ccode\u003ePromise.\u0026lt;void\u0026gt;\u003c/code\u003e\nStops listening on all ports.\n\n**Kind**: instance method of [\u003ccode\u003eRpcServer\u003c/code\u003e](#RpcServer)\n**Returns**: \u003ccode\u003ePromise.\u0026lt;void\u0026gt;\u003c/code\u003e - A promise that resolves once the server stops listening. On error the\npromise will be rejected with an [Error](https://nodejs.org/api/errors.html#errors_class_error).\n\n## Sample Requests\n\nHere are some sample requests made against the server created in the first [usage](#usage) example.\n\n### Sum\n\n```http\nPOST / HTTP/1.1\nHost: 127.0.0.1:9090\nContent-Type: application/json\nAccept: application/json\nContent-Length: 56\n\n{\"jsonrpc\":\"2.0\",\"id\":1,\"method\":\"sum\",\"params\":[1,2,3]}\n```\n\n```http\nconnection: close\ncontent-type: application/json\ncontent-length: 35\n\n {\"jsonrpc\":\"2.0\",\"id\":1,\"result\":6}\n```\n\n### Sum (Batched)\n\n```http\nPOST / HTTP/1.1\nHost: 127.0.0.1:9090\nContent-Type: application/json\nAccept: application/json\nContent-Length: 115\n\n[{\"jsonrpc\":\"2.0\",\"id\":1,\"method\":\"sum\",\"params\":[1,2,3]},{\"jsonrpc\":\"2.0\",\"id\":2,\"method\":\"sum\",\"params\":[4,5,6]}]\n```\n\n```http\nconnection: close\ncontent-type: application/json\ncontent-length: 74\n\n[{\"jsonrpc\":\"2.0\",\"id\":1,\"result\":6},{\"jsonrpc\":\"2.0\",\"id\":2,\"result\":15}]\n```\n\n### Wait\n\n```http\nPOST / HTTP/1.1\nHost: 127.0.0.1:9090\nContent-Type: application/json\nAccept: application/json\nContent-Length: 59\n\n{\"jsonrpc\":\"2.0\",\"id\":1,\"method\":\"wait\",\"params\":{\"ms\":50}}\n```\n\n```http\nconnection: close\ncontent-type: application/json\ncontent-length: 38\n\n{\"jsonrpc\":\"2.0\",\"id\":1,\"result\":true}\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsangaman%2Fhttp-jsonrpc-server","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fsangaman%2Fhttp-jsonrpc-server","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsangaman%2Fhttp-jsonrpc-server/lists"}