Some refactorings Added counterpart of existing rsocket connection controller that is based on kotlin coroutines and actor model
140 lines
4.3 KiB
TypeScript
140 lines
4.3 KiB
TypeScript
import {
|
|
RSocketClient,
|
|
JsonSerializer,
|
|
IdentitySerializer,
|
|
Encodable,
|
|
encodeAndAddWellKnownMetadata,
|
|
encodeAndAddCustomMetadata,
|
|
MESSAGE_RSOCKET_ROUTING,
|
|
MESSAGE_RSOCKET_COMPOSITE_METADATA,
|
|
TEXT_PLAIN,
|
|
WellKnownMimeType,
|
|
APPLICATION_JSON,
|
|
} from "rsocket-core";
|
|
// MESSAGE_RSOCKET_AUTHENTICATION("message/x.rsocket.authentication.v0", (byte) 0x7C)
|
|
import { EchoResponder } from "./EchoResponder";
|
|
import { every } from "rsocket-flowable";
|
|
import RSocketTcpClient from "rsocket-tcp-client";
|
|
import RSocketWebSocketClient from "rsocket-websocket-client";
|
|
|
|
const maxRSocketRequestN = 2147483647;
|
|
const keepAlive = 60000;
|
|
const lifetime = 180000;
|
|
const dataMimeType = "application/octet-stream";
|
|
const metadataMimeType = MESSAGE_RSOCKET_COMPOSITE_METADATA.string;
|
|
|
|
const address = { host: "localhost", port: 7000 };
|
|
|
|
const messageReceiver = (payload) => {
|
|
//do what you want to do with received message
|
|
if ((payload.metadata as string).slice(1) == "user.queue.reply")
|
|
console.log("YES");
|
|
else console.log("No");
|
|
console.log((payload.metadata as string).slice(1));
|
|
console.log(payload);
|
|
};
|
|
const responder = new EchoResponder(messageReceiver);
|
|
|
|
function getClientTransport(host: string, port: number) {
|
|
return new RSocketWebSocketClient({
|
|
url: `ws://${host}:${port}/client-id`,
|
|
});
|
|
}
|
|
|
|
interface Message {
|
|
toUser: string;
|
|
fromUser: string;
|
|
message: string;
|
|
}
|
|
|
|
const client = new RSocketClient<Object, Encodable>({
|
|
// send/receive JSON objects instead of strings/buffers
|
|
serializers: {
|
|
data: JsonSerializer,
|
|
metadata: IdentitySerializer,
|
|
},
|
|
setup: {
|
|
//for connection mapping on server
|
|
payload: {
|
|
data: { id: 1234, name: "John" },
|
|
// metadata: encodeAndAddWellKnownMetadata(
|
|
// encodeAndAddCustomMetadata(
|
|
// Buffer.alloc(0),
|
|
// "message/x.rsocket.authentication.v0",
|
|
// Buffer.from("Hello World")
|
|
// ),
|
|
// MESSAGE_RSOCKET_ROUTING,
|
|
// Buffer.from(String.fromCharCode("client-id2".length) + "client-id2")
|
|
// ),
|
|
metadata: String.fromCharCode("client-id2".length) + "client-id2"
|
|
},
|
|
// ms btw sending keepalive to server
|
|
keepAlive: 60000,
|
|
|
|
// ms timeout if no keepalive response
|
|
lifetime: 180000,
|
|
|
|
// format of `data`
|
|
dataMimeType: "application/json",
|
|
|
|
// format of `metadata`
|
|
metadataMimeType: "message/x.rsocket.routing.v0",
|
|
},
|
|
responder: responder,
|
|
transport: getClientTransport(address.host, address.port),
|
|
});
|
|
const route = "user.queue.reply";
|
|
const sendRoute = "private.news.2";
|
|
client.connect().subscribe({
|
|
onComplete: (rSocket) => {
|
|
every(1000).subscribe({
|
|
onNext: (time) => {
|
|
console.log(`Requester availability: ${rSocket.availability()}`);
|
|
// rSocket
|
|
// .requestResponse({
|
|
// data: time.toString(),
|
|
// metadata: "",
|
|
// })
|
|
// .subscribe({
|
|
// onComplete: (response) => {
|
|
// const data = response.data;
|
|
// if (data) {
|
|
// console.log(`Requester response: ${data}`);
|
|
// }
|
|
// },
|
|
// onError: (error) =>
|
|
// console.log(`Requester error: ${error.message}`),
|
|
// });
|
|
|
|
// rSocket
|
|
// .requestStream({
|
|
// metadata: String.fromCharCode(route.length) + route,
|
|
// })
|
|
// .subscribe({
|
|
// onComplete: () => console.log("Request-stream completed"),
|
|
// onError: (error) =>
|
|
// console.error(`Request-stream error:${error.message}`),
|
|
// onNext: (value) => console.log("%s", value.data),
|
|
// onSubscribe: (sub) => sub.request(maxRSocketRequestN),
|
|
// });
|
|
|
|
rSocket.fireAndForget({
|
|
data: <Message>{ toUser: "4567", fromUser: "1234", message: "testHello" },
|
|
metadata: String.fromCharCode(sendRoute.length) + sendRoute,
|
|
});
|
|
// S APPLICATION_JSON.string
|
|
},
|
|
onSubscribe: (subscription) =>
|
|
subscription.request(Number.MAX_SAFE_INTEGER),
|
|
});
|
|
console.log("RSocket completed");
|
|
|
|
rSocket.connectionStatus().subscribe((status) => {
|
|
console.log("Connection status:", status);
|
|
});
|
|
},
|
|
onError: (error) => console.log(`RSocket error: ${error.message}`),
|
|
});
|
|
|
|
// setTimeout(() => {}, 360000);
|