1.0.1 • Published 3 years ago

rpc_sync v1.0.1

Weekly downloads
-
License
ISC
Repository
github
Last release
3 years ago

rpc-sync

Server and client, type defined, Remote Procedure Call.

Client Installation

First install rpc_sync globally

npm install -g rpc_sync

Create rpc.json

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",
}

url

Replace the url parameter value with the URL of your remote API server.

secret

If your API server requires a secret in order to obtain the schema/documentation supply the secret in this parameter

target

Targets include:

  • ReactTypeScript
  • TypeScript

output

The output source file generated by rpc-sync.

namespace

The namespace/class for the generated source files.

Sync project RPC references

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

Server Installation

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.exposeExpressAPI({
        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,
    }, 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);
    });
});
// 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.
1.0.1

3 years ago

1.0.0

3 years ago