Implementasi Websocket di Server
NestJS bisa digunakan untuk menangani koneksi dan komunikasi dengan websocket. Dalam NestJs implmentasi websocket disebut gateway dengan menggunakan decorator@WebSocketGateway()
. Gateways bersifat platform-agnostic,
artinya tidak terikat pada library WebSocket tertentu. Hal ini memungkinkan gateway untuk bekerja dengan library WebSocket apa pun, asalkan ada adapter yang sesuai. NestJS menyediakan dua library websocket yang didukung secara default, yaitu socket.io
dan ws
.
Instalasi
Untuk memulai belajar implementasi WebSockets-based applications
di NestJS, pertama kita lakukan instalasi package yang diperlukan.
Kemudian kita buat module websocket dan file gateway untuk menangani koneksi websocket.
Kemudian secara manual file websocket.gateway.ts
import {
MessageBody,
SubscribeMessage,
WebSocketGateway,
WebSocketServer,
} from '@nestjs/websockets';
import { Server } from 'socket.io';
@WebSocketGateway({
namespace: 'events',
cors: {
origin: '*', // ubah kedomain spesifik jika perlu
},
})
export class MessageGateway {
@WebSocketServer()
server: Server;
@SubscribeMessage('send_message')
sendMessage(@MessageBody() body: any) {
this.server.emit('send_message.reply', {
msg: 'new Message',
data: body,
});
}
}
Info
@WebSocketGateway
: Dekorator ini mendefinisikan gateway WebSocket. Dalam NestJS, gateway bertugas untuk menangani koneksi WebSocket dan event-event yang terkait.namespace: 'events'
: Menentukan namespace untuk gateway WebSocket. Dalam kasus ini, gateway hanya akan menangani koneksi pada namespace 'events'. contohhttps://localhost:3000/events
atauws://localhost/event
cors: { origin: '*' }
: Mengizinkan koneksi dari semua origin. Hal ini biasa digunakan saat development, adapun saat production harus menggunaka spesifik url@WebSocketServer()
: Decorator ini memberitahu NestJS untuk menginisialisasi propertiserver
sebagaiinstance
dari server WebSocket. Dengan decorator ini, kita dapat langsung mengakses instance dari server WebSocket yang berjalan di gateway.server: Server
: mendeklarasi properti server dari tipe Server. Server biasanya di import dari library Websocket sepertisocket.io -
@SubscribeMessage('send_message')decorator yang menunjukkan bahwa nestjs akan mendengarkan pesan yang dikirimkan pada event
send_messagethis.server.emit('send_message.reply', { msg: 'new Message', data: body, });
: ini adalah perintah agar nestjs mengirmkan pesan kepada eventsend_message.reply
.
Kemudian kita export Class MessageGateway
agar bisa diakses oleh method lain
import { Module } from '@nestjs/common';
import { MessageGateway } from './websocket.gateway';
@Global()
@Module({
providers: [MessageGateway],
exports: [MessageGateway],
})
export class WebsocketModule {}
Pengujian Koneksi WebSocket di Postman
Buatlah request baru dengan pilih new
dan pilih socket.io
seperti gambar di bawah.
kemudian pada kolom url tuliskan url server seperti contoh http://localhost:5002/event
dengan event
merupakan namespace. Setelah itu klik connect untuk menghubungkan client dengan server.
Apabil koneksi berhasil maka akan tampak seperti gambar dibawah ini.
Kemudian buat Request
baru untuk receiver
sepert gambar di bawah ini. Pada tab events
tambahkan send_message.reply
dan listen true agar client bersiap menerima data jika dikirimkan ke channel send_message
.
Penjelasan
tab events
: digunakan untuk membuat simulasi listen websocket- pada simulasi ini receiver akan memperoleh pesan yang dikirimkan pada event
send_message.reply
Penjelasan
tab message
: digunakan untuk membuat simulasi mengirimkan message- pada simulasi ini sender akan mengirimkan pesan pada event
send_message
Pada simulasi ini, kita telah berhasil mengirimkan pesan dari sender dan pesan berhasil diterima oleh receiver.