/ snippets / typescript / ws.interfaces.json
ws.interfaces.json
1  {
2    "WebSocketAdapter Interface": {
3      "prefix": ["ns_class_adapter", "class Adapter", "implements WebSocketAdapter"],
4      "scope": "typescript",
5      "body": ["import * as WebSocket from 'ws';", "import { WebSocketAdapter, INestApplicationContext } from '@nestjs/common';", "import { MessageMappingProperties } from '@nestjs/websockets';", "import { Observable, fromEvent, EMPTY } from 'rxjs';", "import { mergeMap, filter } from 'rxjs/operators';", "", "export class $1Adapter implements WebSocketAdapter {", "  constructor(private app: INestApplicationContext) {}", "", "  create(port: number, options: any = {}): any {", "    return new WebSocket.Server({ port, ...options });", "  }", "", "  bindClientConnect(server, callback: Function) {", "    server.on('connection', callback);", "  }", "", "  bindMessageHandlers(", "    client: WebSocket,", "    handlers: MessageMappingProperties[],", "    process: (data: any) => Observable<any>,", "  ) {", "    fromEvent(client, 'message')", "      .pipe(", "        mergeMap(data => this.bindMessageHandler(data, handlers, process)),", "        filter(result => result),", "      )", "      .subscribe(response => client.send(JSON.stringify(response)));", "  }", "", "  bindMessageHandler(", "    buffer,", "    handlers: MessageMappingProperties[],", "    process: (data: any) => Observable<any>,", "  ): Observable<any> {", "    const message = JSON.parse(buffer.data);", "    const messageHandler = handlers.find(", "      handler => handler.message === message.event,", "    );", "    if (!messageHandler) {", "      return EMPTY;", "    }", "    return process(messageHandler.callback(message.data));", "  }", "", "  close(server) {", "    server.close();", "  }", "}", ""],
6      "description": "Example custom WebSocket adapter implementation using the 'ws' package."
7    }
8  }