im.client.js 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388
  1. /**
  2. * IM客户端SDK。此SDK可以连接开发、测试或生产环境,根据需要配置环境参数以连接到不同的服务器。
  3. */
  4. // Node.js模拟jQuery及ajax请求所需要的环境:document及XMLHttpRequest。
  5. // 这些环境仅用于模拟,客户端在使用时候不需要真正引入
  6. if (typeof process !== 'undefined') {
  7. var jsdom = require('jsdom').jsdom;
  8. var document = jsdom('<html></html>', {});
  9. var window = document.defaultView;
  10. var jQuery = require('jquery');
  11. var $ = jQuery(window);
  12. $.support.cors = true;
  13. XMLHttpRequest = require('xmlhttprequest').XMLHttpRequest;
  14. $.ajaxSettings.xhr = function () {
  15. return new XMLHttpRequest();
  16. };
  17. }
  18. // 本地临时缓存Key
  19. var LocalStorageKey = {
  20. userId: "im_userid"
  21. };
  22. // 服务器
  23. var APIPrefix = "http://127.0.0.1:3008/api/v2";
  24. // 资源实体在URL中的占位符
  25. var UserPath = ":user_id";
  26. var SessionPath = ":session_id";
  27. var TopicPath = ":topic_id";
  28. var ParticipantPath = ":participant_id";
  29. // REST API
  30. var ENDPOINTS = {
  31. Application: {
  32. BadgeNo: '/application/badge_no'
  33. },
  34. Management: {
  35. Health: '/management/health',
  36. DbStatus: '/management/db'
  37. },
  38. Users: {
  39. Login: '/users/login',
  40. Logout: '/users/logout',
  41. User: '/users/:user_id',
  42. UserStatus: '/users/:user_id/status'
  43. },
  44. Sessions: {
  45. Sessions: '/sessions',
  46. Session: '/sessions/:session_id',
  47. SessionSticky: '/sessions/:session_id/sticky',
  48. RecentSessions: '/sessions/recent',
  49. Topics: '/sessions/:session_id/topics',
  50. Topic: '/sessions/:session_id/topics/:topic_id',
  51. TopicEnded: '/sessions/:session_id/topics/:topic_id/ended',
  52. Messages: '/sessions/:session_id/messages',
  53. MessagesByTopic: '/sessions/:session_id/topics/:topic_id/messages',
  54. Message: '/sessions/:session_id/messages/:message_id',
  55. SessionsUnreadMessageCount: '/sessions/unread_message_count',
  56. SessionUnreadMessageCount: '/sessions/:session_id/unread_message_count',
  57. SessionUnreadMessages: '/sessions/:session_id/messages/unread',
  58. Participants: '/sessions/:session_id/participants',
  59. ParticipantsAvatar: '/sessions/:session_id/participants/avatars',
  60. Participant: '/sessions/:session_id/participants/:participant_id',
  61. ParticipantAvatar: '/session/:session_id/participants/:participant_id/avatars'
  62. },
  63. Search: {}
  64. };
  65. var httpClient = {
  66. get: function (endpoint, data, successCallback, errorCallback) {
  67. $.ajax({
  68. type: "get",
  69. url: APIPrefix + endpoint,
  70. data: data,
  71. async: true,
  72. dataType: "json",
  73. success: function (data) {
  74. successCallback(data);
  75. },
  76. error: function (xhr, status, error) {
  77. errorCallback(xhr, status, error);
  78. }
  79. });
  80. },
  81. post: function (endpoint, data, successCallback, errorCallback) {
  82. $.ajax({
  83. type: "post",
  84. url: APIPrefix + endpoint,
  85. data: data,
  86. async: true,
  87. dataType: "json",
  88. success: function (data) {
  89. successCallback(data);
  90. },
  91. error: function (xhr, status, error) {
  92. errorCallback(xhr, status, error);
  93. }
  94. });
  95. },
  96. put: function (endpoint, data, successCallback, errorCallback) {
  97. $.ajax({
  98. type: "post",
  99. url: APIPrefix + endpoint,
  100. data: data,
  101. async: true,
  102. dataType: "json",
  103. headers: {
  104. "X-HTTP-Method-Override": "PUT"
  105. },
  106. success: function (data) {
  107. successCallback(data);
  108. },
  109. error: function (xhr, status, error) {
  110. errorCallback(xhr, status, error);
  111. }
  112. });
  113. },
  114. delete: function (endpoint, data, successCallback, errorCallback) {
  115. $.ajax({
  116. type: "get",
  117. url: APIPrefix + endpoint,
  118. data: data,
  119. async: true,
  120. dataType: "json",
  121. headers: {
  122. "X-HTTP-Method-Override": "DELETE"
  123. },
  124. success: function (data) {
  125. successCallback(data);
  126. },
  127. error: function (xhr, status, error) {
  128. errorCallback(xhr, status, error);
  129. }
  130. });
  131. },
  132. // 执行业务接口前,调用此函数判断当前用户是否在线。
  133. isOnline: function (callback, failure) {
  134. httpClient.get(ENDPOINTS.Users.UserStatus, {}, null, function (res) {
  135. if (res.status == 200) {
  136. callback();
  137. } else {
  138. failure();
  139. }
  140. });
  141. }
  142. };
  143. var imClient = {
  144. Application: {
  145. // 获取应用角标数
  146. getBadgeNo: function (userId, success, failure) {
  147. httpClient.get(ENDPOINTS.Application.BadgeNo,
  148. {user_id: userId},
  149. success,
  150. failure);
  151. }
  152. },
  153. Management: {
  154. getDbStatus: function (success, failure) {
  155. httpClient.get(ENDPOINTS.Management.DbStatus,
  156. {},
  157. success,
  158. failure);
  159. }
  160. },
  161. Users: {
  162. // 登录
  163. login: function (userId, token, client_id, platform, success, failure) {
  164. if (typeof plus !== 'undefined') plus.storage.setItem(LocalStorageKey.userId, userId);
  165. httpClient.post(ENDPOINTS.Users.Login,
  166. {user_id: userId, token: token, client_id: client_id, platform: platform},
  167. success,
  168. failure);
  169. },
  170. // 退出
  171. logout: function (userId, success, failure) {
  172. if (typeof plus !== 'undefined') plus.storage.removeItem(LocalStorageKey.userId);
  173. httpClient.delete(ENDPOINTS.Users.Logout,
  174. {user_id: userId},
  175. success,
  176. failure);
  177. },
  178. // 更新用户状态
  179. updateStatus: function (userId, appInBg, success, failure) {
  180. httpClient.put(ENDPOINTS.Users.UserStatus.replace(UserPath, userId),
  181. {app_in_bg: appInBg},
  182. success,
  183. failure);
  184. },
  185. },
  186. Sessions: {
  187. // 创建MUC会话
  188. createMucSession: function (userId, peerId, success, failure) {
  189. httpClient.post(ENDPOINTS.Sessions.Sessions,
  190. {session_type: 1, session_name: "咨询", participants: []},
  191. success,
  192. failure);
  193. },
  194. // 创建P2P会话
  195. createP2pSession: function (userId, peerId, success, failure) {
  196. httpClient.post(ENDPOINTS.Sessions.Sessions,
  197. {session_type: 2, session_name: "P2P", participants: [userId + ":0", peerId + ":0"]},
  198. success,
  199. failure);
  200. },
  201. // 获取与患者发生的会话,实际上这些是MUC会话
  202. getSessionsWithPatient: function (userId, page, size, success, failure) {
  203. httpClient.get(ENDPOINTS.Sessions.Sessions,
  204. {user_id: userId, session_type: "1", page: page, size: size},
  205. success,
  206. failure);
  207. },
  208. // 获取与医生相关的会话,实际上这些是P2P,群聊和讨论组
  209. getSessionsWithDoctor: function (userId, page, size, success, failure) {
  210. httpClient.get(ENDPOINTS.Sessions.Sessions,
  211. {user_id: userId, session_type: "2,3", page: page, size: size},
  212. success,
  213. failure);
  214. },
  215. // 获取与患者的最近会话
  216. getRecentSessionsWithPatient: function (userId, success, failure) {
  217. httpClient.get(ENDPOINTS.Sessions.RecentSessions,
  218. {session_type: 1, user_id: userId},
  219. success,
  220. failure);
  221. },
  222. // 获取与医生的最近会话,包括P2P、群聊与讨论组
  223. getRecentSessionsWithDoctor: function (userId, success, failure) {
  224. httpClient.get(ENDPOINTS.Sessions.RecentSessions,
  225. {session_type: "2, 3", userId: userId},
  226. success,
  227. failure);
  228. },
  229. // 置顶会话
  230. stickSession: function (userId, sessionId, success, failure) {
  231. httpClient.put(ENDPOINTS.Sessions.SessionSticky.replace(SessionPath, sessionId),
  232. {user_id: userId},
  233. success,
  234. failure);
  235. },
  236. // 取消会话置顶
  237. unstickSession: function (userId, sessionId, success, failure) {
  238. httpClient.put(ENDPOINTS.Sessions.SessionSticky.replace(SessionPath, sessionId),
  239. {user_id: userId},
  240. success,
  241. failure);
  242. },
  243. // 获取所有咨询
  244. getTopics: function (sessionId, success, failure) {
  245. httpClient.get(ENDPOINTS.Sessions.Topics.replace(SessionPath, sessionId),
  246. {},
  247. success,
  248. failure);
  249. },
  250. // 创建咨询
  251. createTopic: function (sessionId, topicId, success, failure) {
  252. httpClient.post(ENDPOINTS.Sessions.Topics.replace(SessionPath, sessionId),
  253. {topic_id: topicId},
  254. success,
  255. failure);
  256. },
  257. // 结束咨询
  258. endTopic: function (sessionId, topicId, success, failure) {
  259. httpClient.put(ENDPOINTS.Sessions.Topics.replace(SessionPath, sessionId),
  260. {topic_id: topicId},
  261. success,
  262. failure);
  263. },
  264. // 咨询是否已结束
  265. isTopicEnded: function (sessionId, topicId, success, failure) {
  266. httpClient.get(ENDPOINTS.Sessions.TopicEnded.replace(SessionPath, sessionId).replace(TopicPath, topicId),
  267. {},
  268. success,
  269. failure);
  270. },
  271. // 发送消息,不论是何种会话,均不需要指定会话对象是谁,只需要向会话本身发送消息即可
  272. sendMessage: function (sessionId, userId, userName, content, contentType, success, failure) {
  273. httpClient.post(ENDPOINTS.Sessions.Messages.replace(SessionPath, sessionId),
  274. {sender_id: userId, sender_name: userName, content_type: contentType, content: content},
  275. success,
  276. failure);
  277. },
  278. // 按会话获取消息
  279. getMessagesBySession: function (sessionId, startMessageId, count, success, failure) {
  280. httpClient.get(ENDPOINTS.Sessions.Messages.replace(SessionPath, sessionId),
  281. {start_message_id: startMessageId, count: count},
  282. success,
  283. failure);
  284. },
  285. // 按议题获取消息
  286. getMessagesByTopic: function (sessionId, topicId, startMessageId, count, success, failure) {
  287. httpClient.get(ENDPOINTS.Sessions.MessagesByTopic.replace(SessionPath, sessionId),
  288. {start_message_id: startMessageId, count: count},
  289. success,
  290. failure);
  291. },
  292. // 获取所有会话的未读消息数
  293. getAllSessionUnreadMessageCount: function (userId, success, failure) {
  294. httpClient.get(ENDPOINTS.Sessions.SessionsUnreadMessageCount,
  295. {user_id: userId},
  296. success,
  297. failure);
  298. },
  299. // 获取指定会话的未读消息数
  300. getSessionUnreadMessageCount: function (sessionId, userId, success, failure) {
  301. httpClient.get(ENDPOINTS.Sessions.SessionUnreadMessageCount.replace(SessionPath, sessionId),
  302. {user_id: userId},
  303. success,
  304. failure);
  305. },
  306. // 获取指定会话的未读消息
  307. getSessionUnreadMessages: function (sessionId, userId, success, failure) {
  308. httpClient.get(ENDPOINTS.Sessions.SessionUnreadMessages.replace(SessionPath, sessionId),
  309. {user_id: userId},
  310. success,
  311. failure);
  312. },
  313. // 添加会话成员
  314. addParticipant: function (sessionId, participantId, success, failure) {
  315. httpClient.post(ENDPOINTS.Sessions.SessionParticipants.replace(SessionPath, sessionId),
  316. {participant_id: participantId},
  317. success,
  318. failure);
  319. },
  320. // 获取会话成员列表
  321. getParticipants: function (sessionId, success, failure) {
  322. httpClient.get(ENDPOINTS.Sessions.SessionParticipants.replace(SessionPath, sessionId),
  323. {},
  324. success,
  325. failure);
  326. },
  327. // 移除会话成员
  328. removeParticipant: function (sessionId, participantId, success, failure) {
  329. httpClient.delete(ENDPOINTS.Sessions.Participant.replace(SessionPath, sessionId).replace(ParticipantPath, participantId),
  330. {},
  331. success,
  332. failure);
  333. },
  334. // 获取会话成员头像
  335. getParticipantAvatar: function (sessionId, participantId, success, failure) {
  336. httpClient.get(ENDPOINTS.Sessions.ParticipantAvatar.replace(SessionPath, sessionId).replace(ParticipantPath, participantId),
  337. {},
  338. success,
  339. failure);
  340. }
  341. },
  342. Search: {}
  343. };
  344. if (typeof process !== 'undefined') {
  345. module.exports = imClient;
  346. }