fontcolor_theme
Deepkit RPC

WebSocket

WebSocket은 Deepkit RPC의 기본 transport입니다. 브라우저와 Node에서 동작하며, 모든 호출에 대해 하나의 연결을 열어 두고, 모든 기능을 지원합니다: RxJS Observable, Subject, Collection을 이용한 스트리밍, 업로드 및 다운로드 진행 상황, back controller(서버가 클라이언트를 호출하는 것), 그리고 peer-to-peer 메시지.

서버 간에는 TCP가 더 빠릅니다. worker thread, Web Worker, child process에는 IPC를 사용하세요. 연결을 열어 둘 수 없는 경우에는 HTTP가 모든 호출을 각각 별도의 요청으로 전송합니다.

Deepkit app

Deepkit app은 HTTP 서버의 포트에서 WebSocket을 통해 RPC controller를 제공하며, 별도로 설정할 것이 없습니다:

import { App } from '@deepkit/app';
import { FrameworkModule } from '@deepkit/framework';
import { rpc } from '@deepkit/rpc';

@rpc.controller('user')
class UserController {
    @rpc.action()
    hello(name: string): string {
        return 'Hello ' + name;
    }
}

new App({
    controllers: [UserController],
    imports: [new FrameworkModule({ port: 8080 })],
}).run();
ts-node app.ts server:start

클라이언트

import { RpcWebSocketClient } from '@deepkit/rpc';

const client = new RpcWebSocketClient('ws://localhost:8080');
const user = client.controller<UserController>('user');

await user.hello('Peter'); // 'Hello Peter'

클라이언트는 첫 번째 호출 시 연결하며, 연결이 끊어진 후에는 다음 호출 시 다시 연결합니다. client.connect()는 즉시 연결하고, client.disconnect()는 연결을 닫습니다.

브라우저에서 RpcWebSocketClient.fromCurrentHost()는 페이지의 호스트에 연결하며, HTTPS 페이지에서는 wss://를 사용합니다. dependency injection을 사용하는 프론트엔드에서는 provideRpcWebSocketClient가 클라이언트를 제공합니다:

import { provideRpcWebSocketClient } from '@deepkit/rpc';

// 페이지의 origin 또는 지정된 URL; 포트 매핑은 다른 포트에서 실행되는 dev server를 위한 것입니다
providers: [provideRpcWebSocketClient(undefined, { 4200: 8080 })];

Node 22 이상에는 WebSocket이 내장되어 있습니다. 이전 버전에서는 ws 패키지의 Class를 adapter에 전달하세요:

import { RpcClient, RpcWebSocketClientAdapter } from '@deepkit/rpc';
import WebSocket from 'ws';

const client = new RpcClient(new RpcWebSocketClientAdapter('ws://localhost:8080', WebSocket as any));

프레임워크 없이 사용하기

@deepkit/rpc-tcp의 RpcWebSocketServer는 자체 포트에서 RpcKernel을 제공합니다:

import { RpcKernel } from '@deepkit/rpc';
import { RpcWebSocketServer } from '@deepkit/rpc-tcp';

const kernel = new RpcKernel();
kernel.registerController(UserController, 'user');

const server = new RpcWebSocketServer(kernel, 'localhost:8081');
server.start({ host: 'localhost', port: 8081 });

인증

클라이언트에 설정된 token은 연결당 한 번 전송되며, RpcKernelSecurity.authenticate가 이를 해당 연결의 session으로 변환합니다. 보안을 참조하세요.

client.token.set('my-session-token');
English中文 (Chinese)한국어 (Korean)日本語 (Japanese)Deutsch (German)