nestia icon indicating copy to clipboard operation
nestia copied to clipboard

Add new decorator `@WebSocketRoute()` and `@WebSocketDriver()`

Open samchon opened this issue 6 months ago • 0 comments

Will add new decorators @WebSocketRoute() and @WebSocketDriver(), which wrap TGrid features.

With those decorators, NestJS users can develop websocket server much type safely.

  • https://tgrid.com/en/tutorial/examples.html#1-remote-function-call

Also, if such websocket decorators being used, automatically generated SDK will also contain the websocket features with tgrid library importing. Of course, in the SDK generation case, the generic arguments of WebSocketAcceptor<ChatServerProvider, ChatClientProvider> would be important.

NestJS Controller

import core from "@nestia/core";
import { Controller } from "@nestjs/common";

@Controller()
export class AppController {
  @core.TypedGet("health")
  public health(): string {
    return "Hello World";
  }

  @core.WebSocketRoute("chat/:chatRoomId", {
    encrypt: true,
  })
  public async chat(
    @core.TypedParam("chatRoomId") id: string,
    @MemberAuth() member: IMember,
    @core.WebSocketAcceptor() 
    acceptor: core.WebSocketAcceptor<ChatServerProvider, ChatClientProvider>,
  ): Promise<void> {
    await acceptor.provider({
      ...
    } as ChatServerProvider);
    await acceptor.join();
  }
}

Providers

export interface ChatServerProvider {
  talk(content: string): void;
  whisper(to: string, content: string): void;
}
export interface ChatClientProvider {
  talk(from: string, content: string): void;
  whisper(from: string, content: string): void;
}

Client Use Case

import sdk from "sdk-library-generated-by-nestia";

const provider: ChatClientProvider = {
  talk: (from, content) => {
    console.log(`${from}: ${content}`);
  },
  whisper: (from, content) => {
    console.log(`> ${from}: ${content}`);
  },
};

const main = async (): Promise<void> => {
  const connection = {
    host: "http://localhost",
    encryption: {
      key: "abcdefghijklmnop",
      iv: "abcdefgh",
    },
  };
  const websocket: WebConnector<ChatClientProvider, ChatServerProvider> = 
    await sdk.chat(
      connection,
      "some-chat-room-id", 
      ChatClientProvider
    );
  const serverProvider: Driver<ChatServerProvider> = connection.getDriver();
  await serverProvider.talk("Yaho, Hello friends");
  await serverProvider.whisper("someone", "Do you know me?");
  await serverProvider.close();
};

samchon avatar Dec 07 '23 04:12 samchon