WS.ts 2.7 KB

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