WS.ts 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162
  1. import { director, EventTarget } from "cc";
  2. import { _decorator, Component, Node } from "cc";
  3. import {
  4. PogWebsocketListener as IWebsocketMessage,
  5. PogWebsocket,
  6. } from "./PogWebsocket";
  7. import JsonUtils from "../utils/JsonUtils";
  8. const { ccclass, property } = _decorator;
  9. export class WsResponse {
  10. protocolId: number;
  11. requestId: number;
  12. code: number;
  13. success: boolean;
  14. data: any;
  15. msg: string;
  16. }
  17. export class WsRequest {
  18. requestId: number;
  19. protocolId: number;
  20. data: any;
  21. public static create(protocolId: number): WsRequest {
  22. let msg = new WsRequest();
  23. msg.protocolId = protocolId;
  24. msg.requestId = Math.floor(Math.random() * 1000000);
  25. msg.requestId = 2;
  26. return msg;
  27. }
  28. public setData(data: any): WsRequest {
  29. this.data = data;
  30. return this;
  31. }
  32. public async send() {
  33. let data = JSON.stringify(this);
  34. // data = this.convertBigInt(data, ["familyId", "userId"]);
  35. // console.log("send", data);
  36. await WS.ins.send(data);
  37. }
  38. private convertBigInt(data: string, keys: string[]): string {
  39. // 将data中的keys转换为bigint
  40. // {"familyId":"123456789"} 去掉引號 {"familyId":123456789},使用正则表达式
  41. let regex = /"([^"]+)":/g;
  42. let match = regex.exec(data);
  43. while (match) {
  44. let key = match[1];
  45. let value = data.substring(match.index + match[0].length, data.indexOf(":", match.index + match[0].length));
  46. data = data.replace(match[0], `"${key}":${value}`);
  47. match = regex.exec(data);
  48. }
  49. return data;
  50. }
  51. }
  52. @ccclass("WS")
  53. export class WS extends Component implements IWebsocketMessage {
  54. public disconnect() {
  55. if (this.pogWebsocket) {
  56. this.pogWebsocket.close();
  57. }
  58. }
  59. OnMessage(data: any): void {
  60. // console.warn("onMessage", typeof data.data, data.data);
  61. if ("pong" == data) {
  62. return;
  63. }
  64. let msg: WsResponse = JsonUtils.parse(data.data);
  65. this._e.emit("" + msg.protocolId, msg);
  66. }
  67. init() {}
  68. onTimeout() {
  69. this.pogWebsocket.clearReconnectTimes();
  70. this.pogWebsocket.reconnect();
  71. }
  72. private _url: string = "";
  73. private _token: string = "";
  74. public async connect(url: string, token: string) {
  75. this._url = url;
  76. this._token = token;
  77. return new Promise((resolve) => {
  78. try {
  79. let full_url = `${url}?accessToken=${token}`;
  80. this.pogWebsocket = PogWebsocket.create(full_url, this);
  81. resolve(true);
  82. } catch (e) {
  83. console.error(e);
  84. resolve(false);
  85. }
  86. });
  87. }
  88. private static _ins: WS;
  89. private pogWebsocket: PogWebsocket;
  90. public static get ins(): WS {
  91. return (this._ins ??= new WS());
  92. }
  93. private _dt: number = 0;
  94. public update(dt: number) {
  95. this._dt += dt;
  96. if (this._dt > 5) {
  97. this._dt = 0;
  98. if (this.pogWebsocket) {
  99. this.pogWebsocket.ping();
  100. }
  101. }
  102. }
  103. public async send(msg: any) {
  104. console.log("send", msg);
  105. for (let i = 0; i < 3; i++) {
  106. if (!this.pogWebsocket.connected) {
  107. await new Promise((resolve) => setTimeout(resolve, 500));
  108. }
  109. }
  110. return await this.pogWebsocket.send(msg);
  111. }
  112. public close() {
  113. this.pogWebsocket.close();
  114. }
  115. private _e: EventTarget;
  116. protected onLoad(): void {
  117. WS._ins = this;
  118. this._e = new EventTarget();
  119. this.node.parent = null;
  120. director.getScene().addChild(this.node);
  121. director.addPersistRootNode(this.node);
  122. }
  123. public on(
  124. protocolId: number,
  125. handler: (...args: any[]) => void,
  126. target: any
  127. ) {
  128. this._e.on("" + protocolId, handler, target);
  129. }
  130. public off(
  131. protocolId: number,
  132. handler: (...args: any[]) => void,
  133. target: any
  134. ) {
  135. this._e.off("" + protocolId, handler, target);
  136. }
  137. protected onDestroy(): void {
  138. //
  139. console.log("WS onDestroy");
  140. }
  141. }