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.

130 lines
3.8 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. import { EchoResponder } from "./EchoResponder";
  15. import { every } from "rsocket-flowable";
  16. import RSocketTcpClient from "rsocket-tcp-client";
  17. import RSocketWebSocketClient from "rsocket-websocket-client";
  18. const maxRSocketRequestN = 2147483647;
  19. const host = "127.0.0.1";
  20. const port = 7000;
  21. const keepAlive = 60000;
  22. const lifetime = 180000;
  23. const dataMimeType = "application/octet-stream";
  24. const metadataMimeType = MESSAGE_RSOCKET_COMPOSITE_METADATA.string;
  25. const address = { host: "localhost", port: 7000 };
  26. const messageReceiver = (payload) => {
  27. //do what you want to do with received message
  28. if ((payload.metadata as string).slice(1) == "user.queue.reply") 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://localhost:7000/client-id",
  37. });
  38. }
  39. interface Message {
  40. toUser: string;
  41. fromUser: string;
  42. message: string;
  43. }
  44. const client = new RSocketClient({
  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: "1234",
  54. metadata: String.fromCharCode("client-id".length) + "client-id",
  55. },
  56. // ms btw sending keepalive to server
  57. keepAlive: 60000,
  58. // ms timeout if no keepalive response
  59. lifetime: 180000,
  60. // format of `data`
  61. dataMimeType: "application/json",
  62. // format of `metadata`
  63. metadataMimeType: "message/x.rsocket.routing.v0",
  64. },
  65. responder: responder,
  66. transport: getClientTransport(address.host, address.port),
  67. });
  68. const route = "user.queue.reply";
  69. const sendRoute = "private.news";
  70. client.connect().subscribe({
  71. onComplete: (rSocket) => {
  72. every(1000).subscribe({
  73. onNext: (time) => {
  74. console.log(`Requester availability: ${rSocket.availability()}`);
  75. // rSocket
  76. // .requestResponse({
  77. // data: time.toString(),
  78. // metadata: "",
  79. // })
  80. // .subscribe({
  81. // onComplete: (response) => {
  82. // const data = response.data;
  83. // if (data) {
  84. // console.log(`Requester response: ${data}`);
  85. // }
  86. // },
  87. // onError: (error) =>
  88. // console.log(`Requester error: ${error.message}`),
  89. // });
  90. // rSocket
  91. // .requestStream({
  92. // metadata: String.fromCharCode(route.length) + route,
  93. // })
  94. // .subscribe({
  95. // onComplete: () => console.log("Request-stream completed"),
  96. // onError: (error) =>
  97. // console.error(`Request-stream error:${error.message}`),
  98. // onNext: (value) => console.log("%s", value.data),
  99. // onSubscribe: (sub) => sub.request(maxRSocketRequestN),
  100. // });
  101. rSocket.fireAndForget({
  102. data: { toUser: "4567", fromUser: "1234", message: "testHello" },
  103. metadata: String.fromCharCode(sendRoute.length) + sendRoute,
  104. });
  105. // S APPLICATION_JSON.string
  106. },
  107. onSubscribe: (subscription) =>
  108. subscription.request(Number.MAX_SAFE_INTEGER),
  109. });
  110. console.log("RSocket completed");
  111. rSocket.connectionStatus().subscribe((status) => {
  112. console.log("Connection status:", status);
  113. });
  114. },
  115. onError: (error) => console.log(`RSocket error: ${error.message}`),
  116. });
  117. // setTimeout(() => {}, 360000);