Server and client, type defined, Remote Procedure Call.
First install rpc-sync globally
npm install -g rpc-sync
First create a rpc.json file in the root of your project:
{
"url": "http://api.example.com/api",
"secret: null
"target": "ReactTypeScript",
"output": "src/rcpClient.ts",
"namespace": "rcpClient",
}
Replace the url parameter value with the URL of your remote API server.
If your API server requires a secret in order to obtain the schema/documentation supply the secret in this parameter
Targets include:
- ReactTypeScript
- TypeScript
- Dart
- VisualBasic
The output source file generated by rpc-sync.
The namespace/class for the generated source files.
Run the following command from your project root. You can re-run this command to update any API reference changes.
rpc-sync
or
rpc-sync rpc.json
Create a Node Typescript with Express project, then install the following package:
npm install rpc-sync
Now using the example below setup an express API using rpc-sync:
import express from "express";
import path from "path";
import rpcSync from "rpc-sync";
import HelloWorldAPI from "src/api/helloWorldAPI"
export interface IContext {
req: express.Request;
res: express.Response;
}
const port = 3000;
const app = express();
app.listen(port, () => {
console.log("Listening on port:", port);
rpcSync.server.buildAPI({
srcPath: path.join(process.cwd(), "/src"),
apiPath: path.join(process.cwd(), "/src/api"),
entityPath: path.join(process.cwd(), "/src/entity"),
schemaOutputPath: path.join(process.cwd(), "schema.json"),
enableDocs: true,
enableClientSchema: true,
minClientVersion: "0.1",
debug: true,
}).then((build)=>{
rpcSync.server.exposeExpressAPI(build, app, (request) => {
// This occurs on every web request.
// Build a context object.. this can be anything. It will be sent to the API method as the first parameter.
const context: IContext = {
req: request.req,
res: request.res
};
//Here is a good place to setup the database connection, apply authentication etc.
//Expose the APIs to the request
request.expose(context, {
"helloWorld": HelloWorldAPI
});
}).catch((e) => {
console.error(e);
});
}).catch((e)=>{
console.error(e)
});
});
// src/api/helloWorldAPI.ts
interface IHelloWorldParameters {
myTestValue: string;
}
interface IHelloWorldResult {
myResult: string;
}
export class HelloWorldAPI {
static async helloWorld(context: IContext, parameters: IHelloWorldParameters): Promise<IHelloWorldResult> {
return new Promise<IHelloWorldResult>((accept, reject) => {
accept({
myResult: `Hello ${parameters.myTestValue}!`
});
});
}
}
// src/entity
You can leave this directory empty.