nestjs / docs.nestjs.com

The official documentation https://docs.nestjs.com 📕
MIT License
1.19k stars 1.71k forks source link

Add tutorial for Nest Websocket Client #858

Open goodmanpersonguy opened 4 years ago

goodmanpersonguy commented 4 years ago

I'm submitting a...


[ ] Regression 
[ ] Bug report
[ ] Feature request
[x] Documentation issue or request (new chapter/page)
[ ] Support request => Please do not submit support request here, instead post your question on Stack Overflow.

Current behavior

So the docs here

Gateways

describe really well, how to create a websocket server. Unfortunately I didn't find anything about a client setup.

Expected behavior

I would expect an additional chapter for socket clients

What is the motivation / use case for changing the behavior?

Currently I have a websocket server with a standard frontend client. I want to extend this project with a second Nest backend which should also connect as a socket client. It would be nice to have a tutorial on how to make this Nest application a socket client listening to events etc.

cnaccio commented 4 years ago

This exactly what I'm looking for as well. I want to build a Nest Websocket Client that connects to a Cryptocurrency exchange's websocket server for market/pricing data, and then push received messages into Kafka. While I could easily do this without Nest; the data feed service is just part of an overall automated trading system that has many other components built using Nest.

Until an official solution is provided, my plan is to build a custom transport strategy loosely based on this documentation: https://docs.nestjs.com/microservices/custom-transport

Here's a few more resources that I think will be helping in hacking together a websockets client; they at least resemble the use case:

Any other resources that are a little more direct, would be much appreciated!

Perf commented 4 years ago

Hey guys @goodmanpersonguy @cnaccio ! Any luck with figuring out how to properly make Nestjs WebSocket Client application/module? Definitely worth to update documentation on how to work with WS client in Nestjs.

MulderNick commented 4 years ago

Also looking for this. We have multiple servers. All are web-socket servers. But some are also clients of the other servers.

StefanErler commented 3 years ago

I'm also trying to solve this. Nest Websocket Client connecting to Nest Websocket Server. Any solutions so far?

investeusa commented 3 years ago

I'm looking for that too. Too bad it still doesn't have socket client support.

zub0r commented 3 years ago

I found this article series useful. Although it deals with NATS transport, the concept applies to other transports too.

lrlago commented 3 years ago

@goodmanpersonguy @cnaccio ! I found this example for angular, since nestjs is based on angular I implemented the same solution that they raised for angular and it worked (sorry for my bad english)

nest g resource Socket

in socketService implement the methods for the socket

import {Injectable} from '@ nestjs / common';
import * as io from 'socket.io-client';
import {Observable} from 'rxjs';
import {env} from 'node: process';

@Injectable ()
export class SocketService {
  private url = process.env.SOCKET_URL;
  private socket;

  connect () {
    this.socket = io (this.url);
  }

  emit (emitName: string, data?) {
    this.socket.emit (emitName, data);
  }

  on (onName: string) {
    let observable = new Observable ((observer) => {
      this.socket.on (onName, (data) => {
        observer.next (data);
      });

      return () => {
        this.socket.disconnect ();
      };
    });
    return observable;
  }
}

in socketGateway implement your use

import {
  WebSocketGateway,
  OnGatewayInit,
  OnGatewayDisconnect
} from '@ nestjs / websockets';
import {SocketService} from './socket.service';

@WebSocketGateway ()
export class SocketGateway implements OnGatewayInit, OnGatewayDisconnect {
  connection: any;
  data: any;
  message: any;
  constructor (private readonly socketService: SocketService) {}
  afterInit () {
    this.socketService.connect ();
    this.connection = this.socketService.on ('connect'). subscribe ((data) => {
      console.log (data);

      this.message = data;
    });
    let message = {
      service: '' asdsadsad ",
      ip: "",
      port: ""
    };
    this.socketService.emit ('notify', message);
  }
  handleDisconnect (client: any) {
    throw new Error ('Method not implemented.');
  }
}
rama41222 commented 3 years ago

any working solutions?

0xslipk commented 3 years ago

@goodmanpersonguy I just released a module for use websocket-client with nestjs. I'd love you feedback guys :D

cc: @cnaccio @Perf @MulderNick @StefanErler @investeusa @zub0r @lrlango @lrlago

viethrk commented 2 years ago

@goodmanpersonguy I just released a module for use websocket-client with nestjs. I'd love you feedback guys :D

cc: @cnaccio @Perf @MulderNick @StefanErler @investeusa @zub0r @lrlango @lrlago

thanks, i used your module. However, I have a problem as follows, when the connection to the server side is closed, now I don't know how to reopen that connection. I'd love you feedback guys :D

TiagoLima411 commented 2 years ago

I followed this documentation and it worked perfectly. Hope it helps you guys in some way. They're sorry if I got my English wrong.

https://www.npmjs.com/package/nestjs-websocket

0xslipk commented 2 years ago

I followed this documentation and it worked perfectly. Hope it helps you guys in some way. They're sorry if I got my English wrong.

https://www.npmjs.com/package/nestjs-websocket

Happy to hear that, let me know if you have any problems

0xslipk commented 2 years ago

@goodmanpersonguy I just released a module for use websocket-client with nestjs. I'd love you feedback guys :D

cc: @cnaccio @Perf @MulderNick @StefanErler @investeusa @zub0r @lrlango @lrlago

thanks, i used your module. However, I have a problem as follows, when the connection to the server side is closed, now I don't know how to reopen that connection. I'd love you feedback guys :D

Sorry to hear that, can you push a repository with the implementation? Or open an issue in the repository of nestjs-websocket with the steps need it to reproduce the problem.

Thanks

TiagoLima411 commented 2 years ago

I followed this documentation and it worked perfectly. Hope it helps you guys in some way. They're sorry if I got my English wrong. https://www.npmjs.com/package/nestjs-websocket

Happy to hear that, let me know if you have any problems

Below is my module

import { Module, HttpModule, Injectable } from '@nestjs/common';
import { TasksService } from './tasks.service';
import { WebSocketModule } from 'nestjs-websocket';

@Injectable()
class ConfigService {
  public readonly url = 'wss://youendipoint.com./';
}

@Module({
  imports: [
    HttpModule,
    WebSocketModule.forRootAsync({
      providers: [ConfigService],
      inject: [ConfigService],
      useFactory: (config: ConfigService) => {
        return {
          url: config.url,
        };
      },
    }),
  ],
  providers: [TasksService],
})
export class TasksModule {}

Below is my service

import { Injectable, Logger } from '@nestjs/common';
import {
  InjectWebSocketProvider,
  WebSocketClient,
  OnOpen,
  OnMessage,
} from 'nestjs-websocket';

@Injectable()
export class TasksService {
  private data: Record<any, any> = {};

  constructor(
    @InjectWebSocketProvider()
    private readonly ws: WebSocketClient,
  ) {}

  @OnOpen()
  open() {
    console.log('The connection is established.');
    this.ws.send(
      JSON.stringify({payload: "payload"}),
    );
  }

  @OnMessage()
  message(data: WebSocketClient.Data) {
    this.data = JSON.parse(data.toString());
    console.log(this.data);
  }
}

Very simple ;)