WS.ts 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145
  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. const { ccclass, property } = _decorator;
  8. export class WsResponse {
  9. protocolId: number;
  10. requestId: number;
  11. code: number;
  12. success: boolean;
  13. data: any;
  14. msg: string;
  15. }
  16. export class WsRequest {
  17. requestId: number;
  18. protocolId: number;
  19. data: any;
  20. public static create(protocolId: number): WsRequest {
  21. let msg = new WsRequest();
  22. msg.protocolId = protocolId;
  23. msg.requestId = Math.floor(Math.random() * 1000000);
  24. msg.requestId = 2;
  25. return msg;
  26. }
  27. public setData(data: any): WsRequest {
  28. this.data = data;
  29. return this;
  30. }
  31. public async send() {
  32. let data = JSON.stringify(this);
  33. await WS.ins.send(data);
  34. }
  35. }
  36. @ccclass("WS")
  37. export class WS extends Component implements IWebsocketMessage {
  38. public disconnect() {
  39. if (this.pogWebsocket) {
  40. this.pogWebsocket.close();
  41. }
  42. }
  43. OnMessage(data: any): void {
  44. // console.warn("onMessage", typeof data.data, data.data);
  45. if ("pong" == data) {
  46. return;
  47. }
  48. let msg: WsResponse = JSON.parse(data.data);
  49. this._e.emit("" + msg.protocolId, msg);
  50. }
  51. init() {}
  52. onTimeout() {
  53. this.pogWebsocket.clearReconnectTimes();
  54. this.pogWebsocket.reconnect();
  55. }
  56. private _url: string = "";
  57. private _token: string = "";
  58. public async connect(url: string, token: string) {
  59. this._url = url;
  60. this._token = token;
  61. return new Promise((resolve) => {
  62. try {
  63. let full_url = `${url}?accessToken=${token}`;
  64. this.pogWebsocket = PogWebsocket.create(full_url, this);
  65. resolve(true);
  66. } catch (e) {
  67. console.error(e);
  68. resolve(false);
  69. }
  70. });
  71. }
  72. private static _ins: WS;
  73. private pogWebsocket: PogWebsocket;
  74. public static get ins(): WS {
  75. return (this._ins ??= new WS());
  76. }
  77. private _dt: number = 0;
  78. public update(dt: number) {
  79. this._dt += dt;
  80. if (this._dt > 5) {
  81. this._dt = 0;
  82. if (this.pogWebsocket) {
  83. this.pogWebsocket.ping();
  84. }
  85. }
  86. }
  87. public async send(msg: any) {
  88. console.log("send", msg);
  89. for (let i = 0; i < 3; i++) {
  90. if (!this.pogWebsocket.connected) {
  91. await new Promise((resolve) => setTimeout(resolve, 500));
  92. }
  93. }
  94. return await this.pogWebsocket.send(msg);
  95. }
  96. public close() {
  97. this.pogWebsocket.close();
  98. }
  99. private _e: EventTarget;
  100. protected onLoad(): void {
  101. WS._ins = this;
  102. this._e = new EventTarget();
  103. this.node.parent = null;
  104. director.getScene().addChild(this.node);
  105. director.addPersistRootNode(this.node);
  106. }
  107. public on(
  108. protocolId: number,
  109. handler: (...args: any[]) => void,
  110. target: any
  111. ) {
  112. this._e.on("" + protocolId, handler, target);
  113. }
  114. public off(
  115. protocolId: number,
  116. handler: (...args: any[]) => void,
  117. target: any
  118. ) {
  119. this._e.off("" + protocolId, handler, target);
  120. }
  121. protected onDestroy(): void {
  122. //
  123. console.log("WS onDestroy");
  124. }
  125. }