Skip to content
/ rmi Public

🤝 TypeScript implementation of Remote Method Invocation in Deno

License

Notifications You must be signed in to change notification settings

swimauger/rmi

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

7 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

RMI Deno Package

Remote Method Invocation in TypeScript for Deno Compiler

Remote Method Invocation (RMI) is an architecture in which Server Side methods are exposed directly to the client and called on the server. Eliminating the repetitive process of programming the same API on both the client and server.

Getting Started

  import { Registry, Side, Bundle } from "https://deno.land/x/rmi/mod.ts";

Creating and Registering a Remote Object and Route

On the server:

  // Create a Remote Object for the "login" bundle
  class Authentication extends Bundle('login') {
    static init() {
      // Initialize database with key
    }

    @Side.Server
    static signup(username: string, password: string) {
      return someToken;
    }
  }

  Authentication.init();

  // Register Remote Object
  Registry.registerRemoteObject(Authentication);

  // Register a new route
  Registry.registerRoute({
    path: '/',
    method: 'get',
    response: function(req: ServerRequest) {
      req.respond({
        body: Deno.readFileSync('page.html')
      });
    }
  });

  // Start Server on port 8080
  Registry.createServer(8080);

On the client:

  <!-- Load the login bundle in a script -->
  <script src="/rmi/login"></script>

  <!-- Use the remote object API on the client -->
  <script>
    (async () => {
      const token = await Authentication.signup('johndoe', 'password123');
    })();
  </script>

  <!-- That's it!!! -->

Scoping your Remote Object

Bundle Scoping:

  class Authentication extends Bundle('login')
  • Bundle Scoping allows the developer to Bundle multiple remote objects into a single script file
  • In the previous server example on the first line, you can see the Authentication remote object can be accessed in the login bundle.

Side Scoping:

  @Side.Server
  invokedOnServerCalledFromClient()

  @Side.Client
  invokedOnClientCalledFromServer()

  @Side.Serialized
  invokedOnClientCalledFromClient()

  // No Decorator
  invokedOnServerCalledFromServer()
  • Side Scoping is how you want methods to be invoked
  • Side.Server turns the function on the client to a request to the server
    • Used for logic you want to be called on the server from the client
  • Side.Client turns the function on the client into an event listener for calls from the server
    • Used for logic you want to be called on the client from the server
  • Side.Serialized keeps the exact same function on the client
    • Used for logic you want to use directly on the client
  • No Decorator keeps the exact same function ONLY on the server
    • Used for logic you dont want to be accessible at all by the client

About

🤝 TypeScript implementation of Remote Method Invocation in Deno

Resources

License

Stars

Watchers

Forks

Packages

No packages published