im.client.js 14 KB

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