rsocket / rsocket-js

JavaScript implementation of RSocket

Home Page:https://github.com/rsocket/rsocket-js

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

TCP server closes unexpectedly on first RequestResponse from client

viglucci opened this issue · comments

Stack

TypeError: stream.handleReady is not a function
    at ClientServerInputMultiplexerDemultiplexer.add (...\rsocket-js\packages\rsocket-core\src\ClientServerMultiplexerDemultiplexer.ts:141:15)
    at new RequestResponseResponderStream (...\rsocket-js\packages\rsocket-core\src\RequestResponseStream.ts:277:14)
    at RequestFrameHandler.handle (...\rsocket-js\packages\rsocket-core\src\ClientServerMultiplexerDemultiplexer.ts:220:11)
    at GenericFrameHandler.handle (...\rsocket-js\packages\rsocket-core\src\ClientServerMultiplexerDemultiplexer.ts:305:27)
    at ClientServerInputMultiplexerDemultiplexer.handle (...\rsocket-js\packages\rsocket-core\src\ClientServerMultiplexerDemultiplexer.ts:120:26)
    at TcpDuplexConnection.handleData (...\rsocket-js\packages\rsocket-tcp-server\src\TcpDuplexConnection.ts:98:24)
    at TcpDuplexConnection._this.resolver (...\rsocket-js\packages\rsocket-tcp-server\src\TcpDuplexConnection.ts:25:16)
    at ...\rsocket-js\packages\rsocket-core\src\ClientServerMultiplexerDemultiplexer.ts:513:13
    at processTicksAndRejections (internal/process/task_queues.js:95:5)

Reproduction

import {
  OnExtensionSubscriber,
  OnNextSubscriber,
  OnTerminalSubscriber,
  Payload,
  RSocketConnector,
  RSocketServer,
} from "@rsocket/rsocket-core";
import { TcpClientTransport } from "@rsocket/rsocket-tcp-client";
import { TcpServerTransport } from "@rsocket/rsocket-tcp-server";
import { exit } from "process";

function makeServer() {
  return new RSocketServer({
    transport: new TcpServerTransport({
      listenOptions: {
        host: "127.0.0.1",
        port: 9090,
      },
    }),
    acceptor: {
      accept: async () => {
        return {
          requestResponse: (
            payload: Payload,
            responderStream: OnTerminalSubscriber &
              OnNextSubscriber &
              OnExtensionSubscriber
          ) => {
            const timeout = setTimeout(() => {
              responderStream.onNext(
                {
                  data: Buffer.concat([Buffer.from("Echo: "), payload.data]),
                },
                true
              );
            }, 1000);

            return {
              cancel: () => {
                clearTimeout(timeout);
                console.log("Request cancelled");
              },
              onExtension: () => {
                console.log("Received Extension request");
              },
            };
          },
        };
      },
    },
  });
}

function makeConnector() {
  return new RSocketConnector({
    transport: new TcpClientTransport({
      connectionOptions: {
        host: "127.0.0.1",
        port: 9090,
      },
    }),
  });
}

async function main() {
  const server = makeServer();
  const serverCloseable = await server.bind();

  console.log("Server bound.");

  const connector = makeConnector();
  const rsocket = await connector.connect();

  await new Promise((resolve, reject) => {
    rsocket.requestResponse(
      {
        data: Buffer.from("Hello World"),
      },
      {
        onError: (e) => reject(e),
        onNext: (payload, isComplete) => {
          console.log(
            `payload[data: ${payload.data}; metadata: ${payload.metadata}]|${isComplete}`
          );
          resolve(payload);
        },
        onComplete: () => {},
        onExtension: () => {},
      }
    );
  }).finally(() => {
    serverCloseable.close();
  });
}

main()
  .then(() => exit())
  .catch((error: Error) => {
    console.error(error);
    exit(1);
  });