TsrpcNet.ts 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. /**
  2. * tsrpc连接管理
  3. */
  4. import { HttpClient as HttpClient_Browser, WsClient as WsClient_Browser } from 'tsrpc-browser';
  5. import { HttpClient as HttpClient_Miniapp, WsClient as WsClient_Miniapp } from 'tsrpc-miniapp';
  6. import { serviceProto as ServiceProtoRoom, ServiceType, ServiceType as ServiceTypeRoom } from "../shared/serviceProto";
  7. import { GameServerConfig } from './GameServerConfig';
  8. import { ShareConfig } from './ShareConfig';
  9. import { Security } from './Security';
  10. import { BaseResponse } from '../shared/base';
  11. /** TSRPC网络模块 */
  12. export class TsrpcNet {
  13. constructor() {
  14. }
  15. /** 创建连接登录服务器 Http 客户端 */
  16. createLoginServer(serverUrl: string) {
  17. let hcGate = new (cc.sys.platform == cc.sys.WECHAT_GAME ? HttpClient_Miniapp : HttpClient_Browser)(ServiceProtoRoom, {
  18. server: serverUrl,
  19. json: ShareConfig.json,
  20. logger: console
  21. });
  22. this.flowClientApi(hcGate);
  23. this.flowAuth(hcGate);
  24. return hcGate;
  25. }
  26. /**
  27. * 创建连接房间服务器 Websocket 客户端
  28. * @param serverUrl 服务器地址
  29. * @returns WsClient
  30. */
  31. createWscRoom(serverUrl: string) {
  32. // 创建客户端与房间服务器的 WebSocket 连接
  33. let wscRoom = new (cc.sys.platform == cc.sys.WECHAT_GAME ? WsClient_Miniapp : WsClient_Browser)(ServiceProtoRoom, {
  34. // server: serverUrl + "?" + Date.now(),
  35. server: serverUrl,
  36. heartbeat: {
  37. interval: GameServerConfig.heartbeat_interval,
  38. timeout: GameServerConfig.heartbeat_timeout
  39. },
  40. json: ShareConfig.json,
  41. logger: console,
  42. // logMsg: true,
  43. });
  44. this.flowClientApi(wscRoom);
  45. // this.flowAuth(wscRoom);
  46. return wscRoom;
  47. }
  48. /** HTTP 客户端协议数据加密、解密 */
  49. private flowClientApi(hc: any) {
  50. if (!ShareConfig.security) return;
  51. hc.flows.preSendDataFlow.push(v => {
  52. if (v.data instanceof Uint8Array) {
  53. v.data = Security.encrypt(v.data);
  54. }
  55. return v;
  56. });
  57. // 在处理接收到的数据之前,通常要进行加密/解密
  58. hc.flows.preRecvDataFlow.push(v => {
  59. if (v.data instanceof Uint8Array) {
  60. v.data = Security.decrypt(v.data);
  61. }
  62. return v;
  63. });
  64. }
  65. /** 帐号登录令牌验证是否逻辑(帐号中加入登录令牌,服务器通过令牌解析玩家数据,如果存在就是已登录) */
  66. private flowAuth(client: any) { // HttpClient WsClient
  67. // 执行 callApi 之前协议中插入登录令牌
  68. client.flows.preCallApiFlow.push(v => {
  69. // 请求前插入登录令牌
  70. let ssoToken = cc.sys.localStorage.getItem('SSO_TOKEN');
  71. if (ssoToken) {
  72. v.req.__ssoToken = ssoToken;
  73. }
  74. return v;
  75. })
  76. // 将 callApi 的结果返回给调用方之后将登录令牌存到本地(收到协议时将登录令牌存到本地)
  77. client.flows.postApiReturnFlow.push(v => {
  78. if (v.return.isSucc) {
  79. let res = v.return.res as BaseResponse;
  80. // 请求成功后刷新登录令牌
  81. // if (res.__ssoToken !== undefined) {
  82. // cc.sys.localStorage.setItem('SSO_TOKEN', res.__ssoToken);
  83. // }
  84. }
  85. // 登录令牌过期时删除客户端登录令牌(可跳转到登录界面)
  86. else if (v.return.err.code === 'NEED_LOGIN') {
  87. cc.sys.localStorage.setItem('SSO_TOKEN', '');
  88. }
  89. return v;
  90. });
  91. }
  92. }