Spring Boot Web Flux with JOOQ for interfacing with DB and Kotlin coroutines to make blocking JDBC calls run asynchronously. Now with rsockets.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

139 lines
4.3 KiB

  1. import {
  2. RSocketClient,
  3. JsonSerializer,
  4. IdentitySerializer,
  5. Encodable,
  6. encodeAndAddWellKnownMetadata,
  7. encodeAndAddCustomMetadata,
  8. MESSAGE_RSOCKET_ROUTING,
  9. MESSAGE_RSOCKET_COMPOSITE_METADATA,
  10. TEXT_PLAIN,
  11. WellKnownMimeType,
  12. APPLICATION_JSON,
  13. } from "rsocket-core";
  14. // MESSAGE_RSOCKET_AUTHENTICATION("message/x.rsocket.authentication.v0", (byte) 0x7C)
  15. import { EchoResponder } from "./EchoResponder";
  16. import { every } from "rsocket-flowable";
  17. import RSocketTcpClient from "rsocket-tcp-client";
  18. import RSocketWebSocketClient from "rsocket-websocket-client";
  19. const maxRSocketRequestN = 2147483647;
  20. const keepAlive = 60000;
  21. const lifetime = 180000;
  22. const dataMimeType = "application/octet-stream";
  23. const metadataMimeType = MESSAGE_RSOCKET_COMPOSITE_METADATA.string;
  24. const address = { host: "localhost", port: 7000 };
  25. const messageReceiver = (payload) => {
  26. //do what you want to do with received message
  27. if ((payload.metadata as string).slice(1) == "user.queue.reply")
  28. console.log("YES");
  29. else console.log("No");
  30. console.log((payload.metadata as string).slice(1));
  31. console.log(payload);
  32. };
  33. const responder = new EchoResponder(messageReceiver);
  34. function getClientTransport(host: string, port: number) {
  35. return new RSocketWebSocketClient({
  36. url: `ws://${host}:${port}/client-id`,
  37. });
  38. }
  39. interface Message {
  40. toUser: string;
  41. fromUser: string;
  42. message: string;
  43. }
  44. const client = new RSocketClient<Object, Encodable>({
  45. // send/receive JSON objects instead of strings/buffers
  46. serializers: {
  47. data: JsonSerializer,
  48. metadata: IdentitySerializer,
  49. },
  50. setup: {
  51. //for connection mapping on server
  52. payload: {
  53. data: { id: 1234, name: "John" },
  54. // metadata: encodeAndAddWellKnownMetadata(
  55. // encodeAndAddCustomMetadata(
  56. // Buffer.alloc(0),
  57. // "message/x.rsocket.authentication.v0",
  58. // Buffer.from("Hello World")
  59. // ),
  60. // MESSAGE_RSOCKET_ROUTING,
  61. // Buffer.from(String.fromCharCode("client-id2".length) + "client-id2")
  62. // ),
  63. metadata: String.fromCharCode("client-id2".length) + "client-id2"
  64. },
  65. // ms btw sending keepalive to server
  66. keepAlive: 60000,
  67. // ms timeout if no keepalive response
  68. lifetime: 180000,
  69. // format of `data`
  70. dataMimeType: "application/json",
  71. // format of `metadata`
  72. metadataMimeType: "message/x.rsocket.routing.v0",
  73. },
  74. responder: responder,
  75. transport: getClientTransport(address.host, address.port),
  76. });
  77. const route = "user.queue.reply";
  78. const sendRoute = "private.news.2";
  79. client.connect().subscribe({
  80. onComplete: (rSocket) => {
  81. every(1000).subscribe({
  82. onNext: (time) => {
  83. console.log(`Requester availability: ${rSocket.availability()}`);
  84. // rSocket
  85. // .requestResponse({
  86. // data: time.toString(),
  87. // metadata: "",
  88. // })
  89. // .subscribe({
  90. // onComplete: (response) => {
  91. // const data = response.data;
  92. // if (data) {
  93. // console.log(`Requester response: ${data}`);
  94. // }
  95. // },
  96. // onError: (error) =>
  97. // console.log(`Requester error: ${error.message}`),
  98. // });
  99. // rSocket
  100. // .requestStream({
  101. // metadata: String.fromCharCode(route.length) + route,
  102. // })
  103. // .subscribe({
  104. // onComplete: () => console.log("Request-stream completed"),
  105. // onError: (error) =>
  106. // console.error(`Request-stream error:${error.message}`),
  107. // onNext: (value) => console.log("%s", value.data),
  108. // onSubscribe: (sub) => sub.request(maxRSocketRequestN),
  109. // });
  110. rSocket.fireAndForget({
  111. data: <Message>{ toUser: "4567", fromUser: "1234", message: "testHello" },
  112. metadata: String.fromCharCode(sendRoute.length) + sendRoute,
  113. });
  114. // S APPLICATION_JSON.string
  115. },
  116. onSubscribe: (subscription) =>
  117. subscription.request(Number.MAX_SAFE_INTEGER),
  118. });
  119. console.log("RSocket completed");
  120. rSocket.connectionStatus().subscribe((status) => {
  121. console.log("Connection status:", status);
  122. });
  123. },
  124. onError: (error) => console.log(`RSocket error: ${error.message}`),
  125. });
  126. // setTimeout(() => {}, 360000);