/jslib/services/multiplayersession.js

https://bitbucket.org/Wayno1979/test-game · JavaScript · 237 lines · 217 code · 2 blank · 18 comment · 25 complexity · ad772b08812a83934f131ffd6a48720b MD5 · raw file

  1. /* This file was generated from TypeScript source tslib/services/multiplayersession.ts */
  2. // Copyright (c) 2011-2012 Turbulenz Limited
  3. /*global TurbulenzEngine: false*/
  4. /*global TurbulenzServices: false*/
  5. /*global TurbulenzBridge: false*/
  6. /*global Utilities: false*/
  7. /// <reference path="turbulenzservices.ts" />
  8. //
  9. // API
  10. //
  11. var MultiPlayerSession = (function () {
  12. function MultiPlayerSession() { }
  13. MultiPlayerSession.version = 1;
  14. MultiPlayerSession.prototype.sendTo = // Public API
  15. function (destinationID, messageType, messageData) {
  16. var packet = (destinationID + ':' + messageType + ':');
  17. if(messageData) {
  18. packet += messageData;
  19. }
  20. var socket = this.socket;
  21. if(socket) {
  22. socket.send(packet);
  23. } else {
  24. this.queue.push(packet);
  25. }
  26. };
  27. MultiPlayerSession.prototype.sendToGroup = function (destinationIDs, messageType, messageData) {
  28. var packet = (destinationIDs.join(',') + ':' + messageType + ':');
  29. if(messageData) {
  30. packet += messageData;
  31. }
  32. var socket = this.socket;
  33. if(socket) {
  34. socket.send(packet);
  35. } else {
  36. this.queue.push(packet);
  37. }
  38. };
  39. MultiPlayerSession.prototype.sendToAll = function (messageType, messageData) {
  40. var packet = (':' + messageType + ':');
  41. if(messageData) {
  42. packet += messageData;
  43. }
  44. var socket = this.socket;
  45. if(socket) {
  46. socket.send(packet);
  47. } else {
  48. this.queue.push(packet);
  49. }
  50. };
  51. MultiPlayerSession.prototype.makePublic = function (callbackFn) {
  52. var sessionId = this.sessionId;
  53. this.service.request({
  54. url: '/api/v1/multiplayer/session/make-public',
  55. method: 'POST',
  56. data: {
  57. 'session': sessionId
  58. },
  59. callback: function () {
  60. TurbulenzBridge.triggerMultiplayerSessionMakePublic(sessionId);
  61. if(callbackFn) {
  62. callbackFn.call(arguments);
  63. }
  64. },
  65. requestHandler: this.requestHandler
  66. });
  67. };
  68. MultiPlayerSession.prototype.destroy = function (callbackFn) {
  69. var sessionId = this.sessionId;
  70. if(sessionId) {
  71. this.sessionId = null;
  72. var playerId = this.playerId;
  73. this.playerId = null;
  74. var gameSessionId = this.gameSessionId;
  75. this.gameSessionId = null;
  76. var socket = this.socket;
  77. if(socket) {
  78. this.socket = null;
  79. socket.onopen = null;
  80. socket.onmessage = null;
  81. socket.onclose = null;
  82. socket.onerror = null;
  83. socket.close();
  84. socket = null;
  85. }
  86. this.queue = null;
  87. this.onmessage = null;
  88. this.onclose = null;
  89. // we can't wait for the callback as the browser doesn't
  90. // call async callbacks after onbeforeunload has been called
  91. TurbulenzBridge.triggerLeaveMultiplayerSession(sessionId);
  92. Utilities.ajax({
  93. url: '/api/v1/multiplayer/session/leave',
  94. method: 'POST',
  95. data: {
  96. 'session': sessionId,
  97. 'player': playerId,
  98. 'gameSessionId': gameSessionId
  99. },
  100. callback: callbackFn,
  101. requestHandler: this.requestHandler
  102. });
  103. } else {
  104. if(callbackFn) {
  105. TurbulenzEngine.setTimeout(callbackFn, 0);
  106. }
  107. }
  108. };
  109. MultiPlayerSession.prototype.connected = function () {
  110. return (!!this.socket);
  111. };
  112. MultiPlayerSession.prototype.flushQueue = // Private API
  113. function () {
  114. var socket = this.socket;
  115. var queue = this.queue;
  116. var numPackets = queue.length;
  117. for(var n = 0; n < numPackets; n += 1) {
  118. socket.send(queue[n]);
  119. }
  120. };
  121. MultiPlayerSession.create = //
  122. // Constructor
  123. //
  124. function create(sessionData, createdCB, errorCB) {
  125. var ms = new MultiPlayerSession();
  126. ms.sessionId = sessionData.sessionid;
  127. ms.playerId = sessionData.playerid;
  128. ms.gameSessionId = sessionData.gameSessionId;
  129. ms.socket = null;
  130. ms.queue = [];
  131. ms.onmessage = null;
  132. ms.onclose = null;
  133. ms.requestHandler = sessionData.requestHandler;
  134. ms.service = TurbulenzServices.getService('multiplayer');
  135. var numplayers = sessionData.numplayers;
  136. var serverURL = sessionData.server;
  137. var socket;
  138. sessionData = null;
  139. var multiPlayerOnMessage = function multiPlayerOnMessageFn(packet) {
  140. var onmessage = ms.onmessage;
  141. if(onmessage) {
  142. var message = packet.data;
  143. var firstSplitIndex = message.indexOf(':');
  144. var secondSplitIndex = message.indexOf(':', (firstSplitIndex + 1));
  145. var senderID = message.slice(0, firstSplitIndex);
  146. /*jshint bitwise:false*/
  147. // The |0 ensures 'messageType' is an integer
  148. var messageType = (message.slice((firstSplitIndex + 1), secondSplitIndex) | 0);
  149. /*jshint bitwise:true*/
  150. var messageData = message.slice(secondSplitIndex + 1);
  151. onmessage(senderID, messageType, messageData);
  152. }
  153. };
  154. var multiPlayerConnect = function multiPlayerConnectFn() {
  155. var multiPlayerConnectionError = function multiPlayerConnectionErrorFn() {
  156. if(!socket) {
  157. socket = ms.socket;
  158. }
  159. ms.socket = null;
  160. if(socket) {
  161. socket.onopen = null;
  162. socket.onmessage = null;
  163. socket.onclose = null;
  164. socket.onerror = null;
  165. socket = null;
  166. }
  167. // current server URL does not respond, ask for a new one
  168. var requestCallback = function requestCallbackFn(jsonResponse, status) {
  169. if(status === 200) {
  170. var reconnectData = jsonResponse.data;
  171. numplayers = reconnectData.numplayers;
  172. serverURL = reconnectData.server;
  173. ms.sessionId = reconnectData.sessionid;
  174. ms.playerId = reconnectData.playerid;
  175. TurbulenzEngine.setTimeout(multiPlayerConnect, 0);
  176. } else {
  177. if(errorCB) {
  178. errorCB("MultiPlayerSession failed: Server not available", 0);
  179. errorCB = null;
  180. createdCB = null;
  181. } else {
  182. var onclose = ms.onclose;
  183. if(onclose) {
  184. ms.onclose = null;
  185. onclose();
  186. }
  187. }
  188. }
  189. };
  190. ms.service.request({
  191. url: '/api/v1/multiplayer/session/join',
  192. method: 'POST',
  193. data: {
  194. 'session': ms.sessionId,
  195. 'gameSessionId': ms.gameSessionId
  196. },
  197. callback: requestCallback,
  198. requestHandler: ms.requestHandler
  199. });
  200. };
  201. try {
  202. var nd = TurbulenzEngine.getNetworkDevice();
  203. if(!nd) {
  204. nd = TurbulenzEngine.createNetworkDevice({
  205. });
  206. }
  207. socket = nd.createWebSocket(serverURL);
  208. socket.onopen = function multiPlayerOnOpen() {
  209. ms.socket = socket;
  210. socket.onopen = null;
  211. socket.onmessage = multiPlayerOnMessage;
  212. socket = null;
  213. ms.flushQueue();
  214. TurbulenzBridge.triggerJoinedMultiplayerSession({
  215. sessionId: ms.sessionId,
  216. playerId: ms.playerId,
  217. serverURL: serverURL,
  218. numplayers: numplayers
  219. });
  220. if(createdCB) {
  221. createdCB(ms, numplayers);
  222. createdCB = null;
  223. errorCB = null;
  224. }
  225. };
  226. socket.onclose = socket.onerror = multiPlayerConnectionError;
  227. } catch (exc) {
  228. multiPlayerConnectionError();
  229. }
  230. };
  231. multiPlayerConnect();
  232. return ms;
  233. };
  234. return MultiPlayerSession;
  235. })();