api.js 9.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312
  1. var defaultEvent = {}
  2. var proto = {}
  3. function uuidv4() {
  4. return ([1e7]+-1e3+-4e3+-8e3+-1e11).replace(/[018]/g, c =>
  5. (c ^ crypto.getRandomValues(new Uint8Array(1))[0] & 15 >> c / 4).toString(16)
  6. );
  7. }
  8. var api = {
  9. token: "",
  10. roomToken: "",
  11. event: null,
  12. ws: null,
  13. init(token, event) {
  14. this.token = token
  15. this.event = event || defaultEvent
  16. protobuf.load("/static/game.proto", function (err, root) {
  17. if (err)
  18. throw err;
  19. proto.Ping = root.lookupType("Ping");
  20. proto.JoinRoom = root.lookupType("JoinRoom");
  21. proto.LeaveRoom = root.lookupType("LeaveRoom");
  22. proto.CreateRoom = root.lookupType("CreateRoom");
  23. proto.Connect = root.lookupType("Connect");
  24. proto.Disconnect = root.lookupType("Disconnect");
  25. proto.Ready = root.lookupType("Ready");
  26. proto.UnReady = root.lookupType("UnReady");
  27. proto.Start = root.lookupType("Start");
  28. proto.ChooseMaster = root.lookupType("ChooseMaster");
  29. proto.ChooseMasterFinish = root.lookupType("ChooseMasterFinish");
  30. proto.ChooseMul = root.lookupType("ChooseMul");
  31. proto.ChooseMulFinish = root.lookupType("ChooseMulFinish");
  32. proto.Open = root.lookupType("Open");
  33. proto.OpenFinish = root.lookupType("OpenFinish");
  34. proto.GameInit = root.lookupType("GameInit");
  35. proto.MsgResp = root.lookupType("MsgResp");
  36. proto.NotifyTypeEnum = root.lookupEnum("NotifyTypeEnum");
  37. console.log(proto)
  38. })
  39. },
  40. startWS() {
  41. //debug_auth 是调试,其他用之前的模式
  42. //const connectStr = "wss://nn.daxia.dev/connect?debug_auth=ucqrjnhiyHfuUrmR"
  43. const connectStr = "ws://localhost:18879/connect?debug_auth=ucqrjnhiyHfuUrmR"
  44. var ws = new WebSocket(connectStr);
  45. this.ws = ws;
  46. var token = this.token
  47. ws.onmessage = async (evt) => {
  48. console.log("ok:", evt)
  49. var received_msg = evt.data;
  50. var buffer = await received_msg.arrayBuffer()
  51. var array = new Uint8Array(buffer);
  52. var arrayLen = array.length;
  53. var dataType = array[0]
  54. var eventType = array[1]
  55. var data = array.subarray(2)
  56. if (dataType != 0) {
  57. console.log("TODO:需要处理压缩和解密====")
  58. data = decrypt("sBWBAyOaGqkuEhCw", "sBWBAyOaGqkuEhCw", array.subarray(1))
  59. eventType = data[0]
  60. data = data.subarray(1)
  61. console.log("data==>", data)
  62. }
  63. console.log("data type:", dataType)
  64. console.log("event type:", eventType)
  65. console.log("data:", data, " len:", data.length)
  66. var decodedMessage = printMsg(eventType, data)
  67. if(this.event){
  68. this.event(eventType, decodedMessage)
  69. }
  70. }
  71. ws.onopen = () => {
  72. // Web Socket 已连接上,使用 send() 方法发送数据
  73. let msg = { "type": "connect", "once": 123, "token": token }
  74. ws.send(JSON.stringify(msg));
  75. setInterval(() => {
  76. let msg = { "type": "ping" }
  77. ws.send(JSON.stringify(msg));
  78. }, 5000)
  79. };
  80. ws.onclose = function () {
  81. // 关闭 websocket
  82. console.log("连接已关闭...");
  83. };
  84. },
  85. joinRoom(roomID, chairID) {
  86. var guid = uuidv4();
  87. console.log("guid:", guid)
  88. let msg = {
  89. "type": "perform",
  90. "version": "1.0.0",
  91. "name": "room/join",
  92. "body": {
  93. "room_id": roomID,
  94. "chair_id": chairID,
  95. },
  96. "once": guid
  97. }
  98. console.log("join room:", msg)
  99. msg.body = JSON.stringify(msg.body)
  100. this.ws.send(JSON.stringify(msg))
  101. },
  102. leaveRoom() {
  103. var guid = uuidv4();
  104. let msg = {
  105. "type": "perform",
  106. "version": "1.0.0",
  107. "name": "room/leave",
  108. "body": {
  109. },
  110. "once": guid
  111. }
  112. msg.body = JSON.stringify(msg.body)
  113. this.ws.send(JSON.stringify(msg))
  114. },
  115. createRoom(roomType, passwd) {
  116. var guid = uuidv4();
  117. let msg = {
  118. "type": "perform",
  119. "version": "1.0.0",
  120. "name": "room/create",
  121. "body": {
  122. "passwd": passwd,
  123. "room_type": roomType,
  124. },
  125. "once": guid
  126. }
  127. msg.body = JSON.stringify(msg.body)
  128. this.ws.send(JSON.stringify(msg))
  129. },
  130. ready() {
  131. var guid = uuidv4();
  132. console.log("ready")
  133. let msg = {
  134. "type": "perform",
  135. "version": "1.0.0",
  136. "name": "qznn/ready",
  137. "body": {
  138. },
  139. "once": guid
  140. }
  141. msg.body = JSON.stringify(msg.body)
  142. this.ws.send(JSON.stringify(msg))
  143. },
  144. unready() {
  145. var guid = uuidv4();
  146. console.log("unready")
  147. let msg = {
  148. "type": "perform",
  149. "version": "1.0.0",
  150. "name": "qznn/unready",
  151. "body": {
  152. },
  153. "once": guid
  154. }
  155. msg.body = JSON.stringify(msg.body)
  156. this.ws.send(JSON.stringify(msg))
  157. },
  158. chooseMaster() {
  159. var guid = uuidv4();
  160. console.log("chooseMaster")
  161. let msg = {
  162. "type": "perform",
  163. "version": "1.0.0",
  164. "name": "qznn/choose_master",
  165. "body": {
  166. "mul": 1,
  167. },
  168. "once": guid
  169. }
  170. msg.body = JSON.stringify(msg.body)
  171. this.ws.send(JSON.stringify(msg))
  172. },
  173. chooseMul() {
  174. var guid = uuidv4();
  175. console.log("choose_mul")
  176. let msg = {
  177. "type": "perform",
  178. "version": "1.0.0",
  179. "name": "qznn/choose_mul",
  180. "body": {
  181. "mul": 1,
  182. },
  183. "once": guid
  184. }
  185. msg.body = JSON.stringify(msg.body)
  186. this.ws.send(JSON.stringify(msg))
  187. },
  188. open() {
  189. var guid = uuidv4();
  190. console.log("open")
  191. let msg = {
  192. "type": "perform",
  193. "version": "1.0.0",
  194. "name": "qznn/open",
  195. "body": {
  196. },
  197. "once": guid
  198. }
  199. msg.body = JSON.stringify(msg.body)
  200. this.ws.send(JSON.stringify(msg))
  201. }
  202. }
  203. function printMsg(eventType, data) {
  204. var decodedMessage = null;
  205. try {
  206. switch (eventType) {
  207. case proto.NotifyTypeEnum.values['NotifyTypePing']:
  208. decodedMessage = proto.Ping.decode(data);
  209. break;
  210. case proto.NotifyTypeEnum.values['NotifyTypeConnect']:
  211. decodedMessage = proto.Connect.decode(data);
  212. break;
  213. case proto.NotifyTypeEnum.values['NotifyTypeDisconnect']:
  214. decodedMessage = proto.Disconnect.decode(data);
  215. break;
  216. case proto.NotifyTypeEnum.values['NotifyTypeJoinRoom']:
  217. decodedMessage = proto.JoinRoom.decode(data);
  218. break;
  219. case proto.NotifyTypeEnum.values['NotifyTypeLeaveRoom']:
  220. decodedMessage = proto.LeaveRoom.decode(data);
  221. break;
  222. case proto.NotifyTypeEnum.values['NotifyTypeCreateRoom']:
  223. decodedMessage = proto.CreateRoom.decode(data);
  224. break;
  225. case proto.NotifyTypeEnum.values['NotifyTypeReady']:
  226. decodedMessage = proto.Ready.decode(data);
  227. break;
  228. case proto.NotifyTypeEnum.values['NotifyTypeUnReady']:
  229. decodedMessage = proto.UnReady.decode(data);
  230. break;
  231. case proto.NotifyTypeEnum.values['NotifyTypeStart']:
  232. decodedMessage = proto.Start.decode(data);
  233. break;
  234. case proto.NotifyTypeEnum.values['NotifyTypeChooseMaster']:
  235. decodedMessage = proto.ChooseMaster.decode(data);
  236. break;
  237. case proto.NotifyTypeEnum.values['NotifyTypeChooseMasterFinish']:
  238. decodedMessage = proto.ChooseMasterFinish.decode(data);
  239. break;
  240. case proto.NotifyTypeEnum.values['NotifyTypeChooseMul']:
  241. decodedMessage = proto.ChooseMul.decode(data);
  242. break;
  243. case proto.NotifyTypeEnum.values['NotifyTypeChooseMulFinish']:
  244. decodedMessage = proto.ChooseMulFinish.decode(data);
  245. break;
  246. case proto.NotifyTypeEnum.values['NotifyTypeOpen']:
  247. decodedMessage = proto.Open.decode(data);
  248. break;
  249. case proto.NotifyTypeEnum.values['NotifyTypeOpenFinish']:
  250. decodedMessage = proto.OpenFinish.decode(data);
  251. break;
  252. case proto.NotifyTypeEnum.values['NotifyTypeGameInit']:
  253. decodedMessage = proto.GameInit.decode(data);
  254. break;
  255. case proto.NotifyTypeEnum.values['NotifyTypeMsgResp']:
  256. decodedMessage = proto.MsgResp.decode(data);
  257. break;
  258. default:
  259. throw ("没找到类型:", eventType)
  260. }
  261. } catch (e) {
  262. console.log("err:", e)
  263. return
  264. }
  265. console.log("decode msg", Date().toLocaleString(), "==>", decodedMessage)
  266. return decodedMessage
  267. }
  268. export default api