https://github.com/vasyas/typescript-rest-rpc
RPC over REST for Typescript clients and servers
https://github.com/vasyas/typescript-rest-rpc
api javascript nodejs rest restful rpc typescript
Last synced: 3 months ago
JSON representation
RPC over REST for Typescript clients and servers
- Host: GitHub
- URL: https://github.com/vasyas/typescript-rest-rpc
- Owner: vasyas
- Created: 2018-03-02T23:41:02.000Z (about 7 years ago)
- Default Branch: master
- Last Pushed: 2022-12-07T10:22:58.000Z (over 2 years ago)
- Last Synced: 2023-02-28T19:22:50.461Z (about 2 years ago)
- Topics: api, javascript, nodejs, rest, restful, rpc, typescript
- Language: TypeScript
- Size: 208 KB
- Stars: 4
- Watchers: 1
- Forks: 1
- Open Issues: 9
-
Metadata Files:
- Readme: README.md
Awesome Lists containing this project
README
This package is deprecated in favor of https://github.com/vasyas/push-rpc
# REST RPC for TypeScript
This library allows you to define your RESTful API in a TypeScript interface.
That interface definition could be share between your backend and frontend code bases.
From that interface library can generate client and server stubs.Uses `Koa.JS` for server stubs and `Fetch` to make client requests.
## Example
### Installation
```
yarn add typescript-rest-rpc
```### Code
shared.ts:
```
export interface Backend {
login({ username, password }): Promise<{ token: string }>
}```
server.ts:
```
import { createServerRouter } from "typescript-rest-rpc/lib/server"class BackendImpl implements Backend {
async login({ username, password }): Promise<{ token: string }> {
if (username == "admin" && password == "123456")
return { token: "ok" }throw new BadRequest("Invalid login or password")
}
}const backendRouter = createServerRouter("/api", new BackendImpl())
app.use(backendRouter.routes())
```client.ts:
```
import { createClient } from "typescript-rest-rpc/lib/client"const client: Backend = createClient("http://localhost:9090/api")
console.log(await client.login({ username: "admin", password: "123456" }))
```With this code you can even Ctrl-Click from your client code to your backend
implementation to quick find how API is implemented!## Features
- Generating client and server RPC proxies based on zero-config TS interface.
- File upload support via multipart encoding (uses `koa-multer` under the hood).
- Binary data download.
- JSON bodies auto-parsing with Date revival.
- Supported client envs: Node.JS (with `isomorphic-fetch`), browser, react-native(see notes).
- Generation of OpenAPI (Swagger) YAMLs with API description
## Implementation flaws
- untyped File in Multipart definition
- untyped File in binary download
- ctx parameter is untyped and should be defined in the base interface## Notes on the implementation
### React-Native clients
For generating clients ES6 Proxy is used. However, React-Native doesn't support ES6 proxy
on some devices, see [this RN Issue](https://github.com/facebook/react-native/issues/11232#issuecomment-264100958]).
And no polyfills could exist that will handle dynamic properties. So for React Native you
should explicitly list your interface operations:
```
export let backend: Backend = createClient(url, { ... },
[ "login", "resetPassword", etc ]
)
```