im.client.js 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441
  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. Search: "/search"
  66. }
  67. };
  68. var httpClient = {
  69. get: function (endpoint, data, successCallback, errorCallback) {
  70. $.ajax({
  71. type: "get",
  72. url: imServer + endpoint,
  73. data: data,
  74. async: true,
  75. dataType: "json",
  76. success: function (data) {
  77. successCallback(data);
  78. },
  79. error: function (xhr, status, error) {
  80. errorCallback ? errorCallback(xhr, status, error) : "";
  81. }
  82. });
  83. },
  84. post: function (endpoint, data, successCallback, errorCallback) {
  85. $.ajax({
  86. type: "post",
  87. url: imServer + endpoint,
  88. data: data,
  89. async: true,
  90. dataType: "json",
  91. success: function (data) {
  92. successCallback(data);
  93. },
  94. error: function (xhr, status, error) {
  95. errorCallback(xhr, status, error);
  96. }
  97. });
  98. },
  99. put: function (endpoint, data, successCallback, errorCallback) {
  100. $.ajax({
  101. type: "post",
  102. url: imServer + endpoint,
  103. data: data,
  104. async: true,
  105. dataType: "json",
  106. headers: {
  107. "X-HTTP-Method-Override": "PUT"
  108. },
  109. success: function (data) {
  110. successCallback(data);
  111. },
  112. error: function (xhr, status, error) {
  113. errorCallback(xhr, status, error);
  114. }
  115. });
  116. },
  117. delete: function (endpoint, data, successCallback, errorCallback) {
  118. $.ajax({
  119. type: "get",
  120. url: imServer + endpoint,
  121. data: data,
  122. async: true,
  123. dataType: "json",
  124. headers: {
  125. "X-HTTP-Method-Override": "DELETE"
  126. },
  127. success: function (data) {
  128. successCallback(data);
  129. },
  130. error: function (xhr, status, error) {
  131. errorCallback(xhr, status, error);
  132. }
  133. });
  134. },
  135. // 执行业务接口前,调用此函数判断当前用户是否在线。
  136. isOnline: function (callback, failure) {
  137. httpClient.get(ENDPOINTS.Users.UserStatus, {}, null, function (res) {
  138. if (res.status == 200) {
  139. callback();
  140. } else {
  141. failure();
  142. }
  143. });
  144. }
  145. };
  146. var imClient = {
  147. Application: {
  148. // 获取应用角标数
  149. getBadgeNo: function (userId, success, failure) {
  150. httpClient.get(ENDPOINTS.Application.BadgeNo,
  151. {user_id: userId},
  152. success,
  153. failure);
  154. }
  155. },
  156. // TEST!PASS
  157. Management: {
  158. getDbStatus: function (success, failure) {
  159. httpClient.get(ENDPOINTS.Management.DbStatus,
  160. {},
  161. success,
  162. failure);
  163. }
  164. },
  165. // TEST!PASS
  166. Users: {
  167. // 登录
  168. login: function (userId, token, client_id, platform, success, failure) {
  169. if (typeof plus !== 'undefined') plus.storage.setItem(LocalStorageKey.userId, userId);
  170. httpClient.post(ENDPOINTS.Users.Login,
  171. {user_id: userId, token: token, client_id: client_id, platform: platform},
  172. success,
  173. failure);
  174. },
  175. // 退出
  176. logout: function (userId, success, failure) {
  177. if (typeof plus !== 'undefined') plus.storage.removeItem(LocalStorageKey.userId);
  178. httpClient.delete(ENDPOINTS.Users.Logout,
  179. {user_id: userId},
  180. success,
  181. failure);
  182. },
  183. // 更新用户状态
  184. updateStatus: function (userId, appInBg, success, failure) {
  185. httpClient.put(ENDPOINTS.Users.UserStatus.replace(UserPath, userId),
  186. {app_in_bg: appInBg},
  187. success,
  188. failure);
  189. },
  190. },
  191. Sessions: {
  192. // 创建MUC会话
  193. createMucSession: function (userId, peerId, success, failure) {
  194. httpClient.post(ENDPOINTS.Sessions.Sessions,
  195. {session_type: 1, session_name: "咨询", participants: []},
  196. success,
  197. failure);
  198. },
  199. // TEST!PASS 创建P2P会话
  200. createP2pSession: function (userId, peerId, success, failure) {
  201. httpClient.post(ENDPOINTS.Sessions.Sessions,
  202. {session_type: 2, session_name: "P2P", participants: [userId + ":0", peerId + ":0"]},
  203. success,
  204. failure);
  205. },
  206. // 获取与患者发生的会话
  207. getSessionsWithPatient: function (userId, page, size, success, failure) {
  208. httpClient.get(ENDPOINTS.Sessions.Sessions,
  209. {user_id: userId, session_type: "1", page: page, size: size},
  210. success,
  211. failure);
  212. },
  213. // 获取与医生相关的会话
  214. getSessionsWithDoctor: function (userId, page, size, success, failure) {
  215. httpClient.get(ENDPOINTS.Sessions.Sessions,
  216. {user_id: userId, session_type: "2,3", page: page, size: size},
  217. success,
  218. failure);
  219. },
  220. // 获取与患者的最近会话
  221. getRecentSessionsWithPatient: function (userId, success, failure) {
  222. httpClient.get(ENDPOINTS.Sessions.RecentSessions,
  223. {session_type: 1, user_id: userId},
  224. success,
  225. failure);
  226. },
  227. // 获取与医生的最近会话,包括P2P、群聊与讨论组
  228. getRecentSessionsWithDoctor: function (userId, success, failure) {
  229. httpClient.get(ENDPOINTS.Sessions.RecentSessions,
  230. {session_type: "2, 3", userId: userId},
  231. success,
  232. failure);
  233. },
  234. // 置顶会话
  235. stickSession: function (userId, sessionId, success, failure) {
  236. httpClient.put(ENDPOINTS.Sessions.SessionSticky.replace(SessionPath, sessionId),
  237. {user_id: userId},
  238. success,
  239. failure);
  240. },
  241. // 取消会话置顶
  242. unstickSession: function (userId, sessionId, success, failure) {
  243. httpClient.put(ENDPOINTS.Sessions.SessionSticky.replace(SessionPath, sessionId),
  244. {user_id: userId},
  245. success,
  246. failure);
  247. },
  248. // 获取所有咨询
  249. getTopics: function (sessionId, success, failure) {
  250. httpClient.get(ENDPOINTS.Sessions.Topics.replace(SessionPath, sessionId),
  251. {},
  252. success,
  253. failure);
  254. },
  255. // 创建咨询
  256. createTopic: function (sessionId, userId, success, failure) {
  257. httpClient.post(ENDPOINTS.Sessions.Topics.replace(SessionPath, sessionId),
  258. {user_id: userId},
  259. success,
  260. failure);
  261. },
  262. // 结束咨询
  263. endTopic: function (sessionId, userId, success, failure) {
  264. httpClient.put(ENDPOINTS.Sessions.Topics.replace(SessionPath, sessionId),
  265. {user_id: userId},
  266. success,
  267. failure);
  268. },
  269. // 咨询是否已结束, topicId为空时表示当前会话的最新消息
  270. isTopicEnded: function (sessionId, topicId, success, failure) {
  271. httpClient.get(ENDPOINTS.Sessions.TopicEnded.replace(SessionPath, sessionId).replace(TopicPath, topicId),
  272. {},
  273. success,
  274. failure);
  275. },
  276. // TEST!PASS 发送消息,不论是何种会话,均不需要指定会话对象是谁,只需要向会话本身发送消息即可
  277. sendMessage: function (sessionId, userId, userName, content, contentType, success, failure) {
  278. httpClient.post(ENDPOINTS.Sessions.Messages.replace(SessionPath, sessionId),
  279. {sender_id: userId, sender_name: userName, content_type: contentType, content: content},
  280. success,
  281. failure);
  282. },
  283. // 按会话获取消息
  284. getMessagesBySession: function (sessionId, userId, page, pagesize, startMsgId, endMsgId, success, failure) {
  285. httpClient.get(ENDPOINTS.Sessions.Messages.replace(SessionPath, sessionId),
  286. {
  287. page: page || 1,
  288. pagesize: pagesize || 20,
  289. end_msg_id: endMsgId || "",
  290. start_msg_id: startMsgId || "",
  291. user: userId,
  292. session_id: sessionId
  293. },
  294. success,
  295. failure);
  296. },
  297. // 按议题获取消息
  298. getMessagesByTopic: function (sessionId, topicId, startMessageId, count, success, failure) {
  299. httpClient.get(ENDPOINTS.Sessions.MessagesByTopic.replace(SessionPath, sessionId),
  300. {start_message_id: startMessageId, count: count},
  301. success,
  302. failure);
  303. },
  304. // 获取所有会话的未读消息数
  305. getAllSessionUnreadMessageCount: function (userId, success, failure) {
  306. httpClient.get(ENDPOINTS.Sessions.SessionsUnreadMessageCount,
  307. {user_id: userId},
  308. success,
  309. failure);
  310. },
  311. // TEST!PASS 获取指定会话的未读消息数
  312. getSessionUnreadMessageCount: function (sessionId, userId, success, failure) {
  313. httpClient.get(ENDPOINTS.Sessions.SessionUnreadMessageCount.replace(SessionPath, sessionId),
  314. {user_id: userId},
  315. success,
  316. failure);
  317. },
  318. // TEST!PASS 获取指定会话的未读消息
  319. getSessionUnreadMessages: function (sessionId, userId, success, failure) {
  320. httpClient.get(ENDPOINTS.Sessions.SessionUnreadMessages.replace(SessionPath, sessionId),
  321. {user_id: userId},
  322. success,
  323. failure);
  324. },
  325. // 添加会话成员
  326. addParticipant: function (sessionId, participantId, success, failure) {
  327. httpClient.post(ENDPOINTS.Sessions.SessionParticipants.replace(SessionPath, sessionId),
  328. {participant_id: participantId},
  329. success,
  330. failure);
  331. },
  332. // TEST!PASS 获取会话成员列表
  333. getParticipants: function (sessionId, success, failure) {
  334. httpClient.get(ENDPOINTS.Sessions.Participants.replace(SessionPath, sessionId),
  335. {},
  336. success,
  337. failure);
  338. },
  339. // 移除会话成员
  340. removeParticipant: function (sessionId, participantId, success, failure) {
  341. httpClient.delete(ENDPOINTS.Sessions.Participant.replace(SessionPath, sessionId).replace(ParticipantPath, participantId),
  342. {},
  343. success,
  344. failure);
  345. },
  346. // TEST!PASS 获取会话成员头像
  347. getParticipantsAvatars: function (sessionId, success, failure) {
  348. httpClient.get(ENDPOINTS.Sessions.ParticipantsAvatar.replace(SessionPath, sessionId),
  349. {},
  350. success,
  351. failure);
  352. },
  353. // TEST!PASS 获取最近7天内的会话列表
  354. getRecentSessions: function (userId, success, failure) {
  355. httpClient.get(ENDPOINTS.Sessions.RecentSessions,
  356. {user_id: userId, date_span: 7},
  357. success,
  358. failure);
  359. }
  360. },
  361. Search: {
  362. // 搜索所有对象:医生,会话及消息
  363. searchAll: function (userId, keyword, success, failure) {
  364. httpClient.get(ENDPOINTS.Search.Search,
  365. {user_id: userId, target: 'all', keyword: keyword},
  366. success,
  367. failure);
  368. },
  369. // 搜索医生
  370. searchDoctors: function (userId, keyword, page, size, success, failure) {
  371. httpClient.get(ENDPOINTS.Search.Search,
  372. {user_id: userId, target: 'doctor', keyword: keyword, page: page, size: size},
  373. success,
  374. failure);
  375. },
  376. // 搜索会话
  377. searchSessions: function (userId, keyword, page, size, success, failure) {
  378. httpClient.get(ENDPOINTS.Search.Search,
  379. {user_id: userId, target: 'session', keyword: keyword, page: page, size: size},
  380. success,
  381. failure);
  382. },
  383. // 搜索会话消息
  384. searchMessages: function (userId, keyword, page, size, success, failure) {
  385. httpClient.get(ENDPOINTS.Search.Search,
  386. {user_id: userId, target: 'message', keyword: keyword, page: page, size: size},
  387. success,
  388. failure);
  389. }
  390. }
  391. };
  392. if (typeof process !== 'undefined') {
  393. module.exports = imClient;
  394. }