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. OnMessage(data: any): void {
  39. // console.warn("onMessage", typeof data.data, data.data);
  40. if ("pong" == data) {
  41. return;
  42. }
  43. let msg: WsResponse = JSON.parse(data.data);
  44. this._e.emit("" + msg.protocolId, msg);
  45. }
  46. init() {}
  47. reconnect() {
  48. if (this.pogWebsocket) {
  49. try {
  50. this.pogWebsocket.close();
  51. } catch (e) {
  52. console.error(e);
  53. }
  54. }
  55. this.connect(this._url, this._token);
  56. }
  57. private _url: string = "";
  58. private _token: string = "";
  59. public async connect(url: string, token: string) {
  60. this._url = url;
  61. this._token = token;
  62. return new Promise((resolve) => {
  63. try {
  64. let full_url = `${url}?accessToken=${token}`;
  65. this.pogWebsocket = PogWebsocket.create(full_url, this);
  66. resolve(true);
  67. } catch (e) {
  68. console.error(e);
  69. resolve(false);
  70. }
  71. });
  72. }
  73. private static _ins: WS;
  74. private pogWebsocket: PogWebsocket;
  75. public static get ins(): WS {
  76. return (this._ins ??= new WS());
  77. }
  78. private _dt: number = 0;
  79. public update(dt: number) {
  80. this._dt += dt;
  81. if (this._dt > 5) {
  82. this._dt = 0;
  83. if (this.pogWebsocket) {
  84. this.pogWebsocket.ping();
  85. }
  86. }
  87. }
  88. public async send(msg: any) {
  89. console.log("send", msg);
  90. for (let i = 0; i < 3; i++) {
  91. if (!this.pogWebsocket.connected) {
  92. await new Promise((resolve) => setTimeout(resolve, 500));
  93. }
  94. }
  95. return await this.pogWebsocket.send(msg);
  96. }
  97. public close() {
  98. this.pogWebsocket.close();
  99. }
  100. private _e: EventTarget;
  101. protected onLoad(): void {
  102. WS._ins = this;
  103. this._e = new EventTarget();
  104. this.node.parent = null;
  105. director.getScene().addChild(this.node);
  106. director.addPersistRootNode(this.node);
  107. }
  108. public on(
  109. protocolId: number,
  110. handler: (...args: any[]) => void,
  111. target: any
  112. ) {
  113. this._e.on("" + protocolId, handler, target);
  114. }
  115. public off(
  116. protocolId: number,
  117. handler: (...args: any[]) => void,
  118. target: any
  119. ) {
  120. this._e.off("" + protocolId, handler, target);
  121. }
  122. protected onDestroy(): void {
  123. //
  124. console.log("WS onDestroy");
  125. }
  126. }