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);
});