nestia
nestia copied to clipboard
Add new decorator `@WebSocketRoute()` and `@WebSocketDriver()`
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();
};