项目作者: linux-china

项目描述 :
🦕RSocket Deno module
高级语言: TypeScript
项目地址: git://github.com/linux-china/rsocket-deno.git
创建时间: 2020-05-27T02:25:30Z
项目社区:https://github.com/linux-china/rsocket-deno

开源协议:Apache License 2.0

下载


RSocket Deno module

🦕Deno library to create/consume async RSocket services.

What is RSocket?

RSocket is a binary protocol for use on byte stream transports such as TCP and WebSocket.
It enables the following symmetric interaction models via async message passing over a single connection:

  • request/response (stream of 1)
  • request/stream (finite stream of many)
  • fire-and-forget (no response)
  • channel (bi-directional streams)

Yes, RSocket is designed for async/reactive communication between services.

How to use?

Now RSocket Deno is under active development, please execute following command to make sure all code are updated to last version.

  1. deno run --reload https://deno.land/x/rsocket/mod.ts

Start RSocket Server with Deno

  1. $ deno run --allow-net https://deno.land/x/rsocket/rsocket_server.ts

and RSocket server side code as following:

  1. import {
  2. RSocketServer,
  3. forRequestResponse,
  4. Payload
  5. } from "https://deno.land/x/rsocket/mod.ts"
  6. await RSocketServer.create(forRequestResponse(
  7. async (payload: Payload): Promise<Payload> => {
  8. console.log(`Received: ${payload.getDataUtf8()} `)
  9. return Payload.fromText("Hello, this is Deno Server!", "");
  10. })
  11. ).bind("tcp://0.0.0.0:42252");
  12. console.log("RSocket Server started on 0.0.0.0:42252")

Start RSocket requester to test async RPC call

  1. $ deno run --allow-net https://deno.land/x/rsocket/rsocket_client.ts

and RSocket client side code as following:

  1. import {
  2. RSocketConnector,
  3. Payload
  4. } from "https://deno.land/x/rsocket/mod.ts"
  5. const rsocket = await RSocketConnector.create().connect("tcp://127.0.0.1:42252");
  6. const result = await rsocket.requestResponse(Payload.fromText("Hello, I'm requester!", ""));
  7. console.log(result.getDataUtf8());

Service router and stub

Service route for RSocket server side

  1. import {
  2. RSocketServer,
  3. RSocket,
  4. ConnectionSetupPayload,
  5. RSocketRouteHandler
  6. } from "https://deno.land/x/rsocket/mod.ts"
  7. //RSocket Service
  8. class UserService {
  9. async findNickById(id: number): Promise<string> {
  10. return "DenoServer";
  11. }
  12. }
  13. const server = await RSocketServer.create({
  14. accept(setup: ConnectionSetupPayload, sendingSocket: RSocket) {
  15. return RSocketRouteHandler.fromHandler("com.example.UserService", new UserService());
  16. }
  17. }).bind("tcp://127.0.0.1:42252");

Service stub for requester side

  1. import {RSocketConnector, buildServiceStub} from "https://deno.land/x/rsocket/mod.ts"
  2. const rsocket = await RSocketConnector.create().connect("tcp://127.0.0.1:42252");
  3. interface UserService {
  4. findNickById(id: number): Promise<string>;
  5. }
  6. const userService = buildServiceStub<UserService>(rsocket, "com.example.UserService")
  7. let nick = await userService.findNickById(1);
  8. console.log(nick)

WebSocket support

Just use “ws://127.0.0.0:42252” format.

Interoperate with Spring Boot RSocket

Reactive streams interoperation with RxJS

Reactive Streams supplies interoperation with RxJS, such as Publisher to Observable or Observable to Publisher.

  1. // @deno-types="https://deno.land/x/types/rxjs/v6.5.5/rxjs.d.ts"
  2. import {Observable, range, of} from "https://cdn.pika.dev/rxjs@6.5.5";
  3. // @deno-types="https://deno.land/x/types/rxjs/v6.5.5/operators.d.ts"
  4. import operators from 'https://dev.jspm.io/rxjs@6.5.5/operators';
  5. const {map, filter} = operators;
  6. import { publisherToObservable, observableToPublisher } from "https://deno.land/x/rsocket/reactivestreams/rxjs.ts"

or you can use https://deno.land/x/rxjs

  1. import {Observable} from "https://deno.land/x/rxjs/mod.ts";
  2. import {map, last} from "https://deno.land/x/rxjs/src/operators/index.ts";

TODO

RSocket

  • Operations
    • REQUEST_FNF
    • REQUEST_RESPONSE
    • REQUEST_STREAM
    • REQUEST_CHANNEL
    • METADATA_PUSH
  • More Operations
    • Error
    • Cancel
    • Keepalive
  • QoS
    • RequestN
    • Lease
  • Transport
    • TCP
    • Websocket
  • High Level APIs
    • Client
    • Server
  • Misc
    • RxJS

References