8 行
18 KiB
JavaScript
8 行
18 KiB
JavaScript
(function(i,m){typeof exports=="object"&&typeof module<"u"?m(exports):typeof define=="function"&&define.amd?define(["exports"],m):(i=typeof globalThis<"u"?globalThis:i||self,m(i.XuqmH5SDK={}))})(this,(function(i){"use strict";let m="",I=()=>null;function le(n,e){m=n.replace(/\/$/,""),I=e}function pe(n,e){if(!e)return`${m}${n}`;const t=new URLSearchParams;for(const[o,u]of Object.entries(e))u==null||u===""||t.set(o,u instanceof Date?u.toISOString():String(u));const s=t.toString();return s?`${m}${n}?${s}`:`${m}${n}`}async function v(n,e,t,s){const o=I(),u={"Content-Type":"application/json"};o&&(u.Authorization=`Bearer ${o}`);const d=await(await fetch(pe(e,s),{method:n,headers:u,body:t!==void 0?JSON.stringify(t):void 0})).json();if(d.code!==200)throw new Error(d.message);return d.data}async function h(n){const e=I(),t=new FormData;t.append("file",n);const o=await(await fetch(`${m}/api/file/upload`,{method:"POST",headers:e?{Authorization:`Bearer ${e}`}:{},body:t})).json();if(o.code!==200)throw new Error(o.message);return o.data}const r={get:(n,e)=>v("GET",n,void 0,e),post:(n,e,t)=>v("POST",n,e,t),put:(n,e,t)=>v("PUT",n,e,t),delete:(n,e)=>v("DELETE",n,void 0,e)},w="https://dev.xuqinmin.com",he="wss://dev.xuqinmin.com/ws/im";let b=null,R=null,T=null;function fe(n){b=n,le(n.baseUrl||w,()=>R),n.debug&&console.log("[XuqmSDK] initialized",n.appKey,"baseUrl=",n.baseUrl||w)}function y(n){R=n}function C(n){T=n}function E(){return R}function k(){return T}function ge(n,e){y(e),C(n)}function ve(){y(null),C(null)}function l(){if(!b)throw new Error("XuqmSDK not initialized. Call init() first.");return b}const Ie=3e4;function p(n,e,t){let s=n+`
|
|
`;for(const[o,u]of Object.entries(e))s+=`${o}:${u}
|
|
`;return s+=`
|
|
`,t&&(s+=t),s+="\0",s}function be(n){var me;const e=n.indexOf("\0");if(e<0)return null;const t=n.substring(0,e),s=t.indexOf(`
|
|
|
|
`);if(s<0)return null;const o=t.substring(0,s),u=t.substring(s+2),a=o.split(`
|
|
`).filter(g=>g.trim()!==""),d=((me=a[0])==null?void 0:me.trim())||"",de={};for(let g=1;g<a.length;g++){const G=a[g],M=G.indexOf(":");M>0&&(de[G.substring(0,M).trim()]=G.substring(M+1).trim())}return{command:d,headers:de,body:u}}class ${constructor(){this.ws=null,this.reconnectDelay=3e3,this.reconnectTimer=null,this.destroyed=!1,this.listeners={},this.subscriptionSeed=0,this.subscriptions=new Map}on(e,t){const s=this.listeners,o=s[e]??new Set;return o.add(t),s[e]=o,this}off(e,t){var s;return(s=this.listeners[e])==null||s.delete(t),this}emit(e,...t){var s;(s=this.listeners[e])==null||s.forEach(o=>o(...t))}connect(){if(this.destroyed)return;const e=l(),t=E(),s=`${e.wsUrl||he}?token=${t??""}`;this.ws=new WebSocket(s);let o="";this.ws.onopen=()=>{var d;this.reconnectDelay=3e3,e.debug&&console.log("[ImClient] ws opened, sending STOMP CONNECT");const u=new URL(s),a={"accept-version":"1.2","heart-beat":"0,0",host:u.hostname+(u.port?":"+u.port:"")};t&&(a.Authorization=`Bearer ${t}`),(d=this.ws)==null||d.send(p("CONNECT",a))},this.ws.onmessage=u=>{o+=u.data;let a;for(;(a=be(o))!==null;)o=o.substring(o.indexOf("\0")+1),this.handleStompFrame(a,e)},this.ws.onclose=u=>{this.emit("disconnected",u.code,u.reason),this.destroyed||this.scheduleReconnect()},this.ws.onerror=u=>{this.emit("error",u)}}handleStompFrame(e,t){const s=e.command.toUpperCase();switch(t.debug&&console.log(`[ImClient] STOMP ${s}`,e.headers),s){case"CONNECTED":{t.debug&&console.log("[ImClient] STOMP connected"),this.sendSubscribe("/user/queue/messages"),this.subscriptions.forEach((o,u)=>{var a;u!=="/user/queue/messages"&&((a=this.ws)==null||a.send(p("SUBSCRIBE",{id:o,destination:u})))}),this.sendSync(),this.emit("connected");break}case"MESSAGE":{try{const o=this.normalizeMessage(JSON.parse(e.body));t.debug&&console.log("[ImClient] MESSAGE",o.id,o.msgType,o.status),o.status==="READ"&&this.emit("read",o),(o.revoked||o.status==="REVOKED"||o.msgType==="REVOKED")&&this.emit("revoke",{msgId:o.id,operatorId:o.fromId??o.fromUserId}),this.emit("message",o),this.emit("conversations")}catch{}break}case"ERROR":{const o=e.body||e.headers.message||"STOMP error";t.debug&&console.error("[ImClient] STOMP ERROR",o),this.emit("error",new Event(o));break}}}send(e){var d;const t=l(),s=k()??"",o=e.messageId??this.generateMessageId(),u={id:o,appId:t.appKey,fromUserId:s,fromId:s,toId:e.toId,chatType:e.chatType,msgType:e.msgType,content:e.content,status:"SENDING",mentionedUserIds:e.mentionedUserIds,revoked:!1,createdAt:new Date().toISOString()};if(((d=this.ws)==null?void 0:d.readyState)!==WebSocket.OPEN)return{...u,status:"FAILED"};const a={appId:t.appKey,messageId:o,toId:e.toId,chatType:e.chatType,msgType:e.msgType,content:e.content};return e.mentionedUserIds&&(a.mentionedUserIds=e.mentionedUserIds),this.ws.send(p("SEND",{destination:"/app/chat.send","content-type":"application/json"},JSON.stringify(a))),u}revoke(e){var s;if(((s=this.ws)==null?void 0:s.readyState)!==WebSocket.OPEN)throw new Error("WebSocket not connected");const t=l();this.ws.send(p("SEND",{destination:"/app/chat.revoke","content-type":"application/json"},JSON.stringify({appId:t.appKey,messageId:e})))}sync(){this.sendSync()}sendSync(){var t;if(((t=this.ws)==null?void 0:t.readyState)!==WebSocket.OPEN)return;const e=l();this.ws.send(p("SEND",{destination:"/app/chat.sync","content-type":"application/json"},JSON.stringify({appId:e.appKey})))}subscribe(e){this.subscriptions.has(e)||this.sendSubscribe(e)}sendSubscribe(e,t){var o;const s=t??this.nextSubscriptionId();this.subscriptions.set(e,s),(o=this.ws)==null||o.send(p("SUBSCRIBE",{id:s,destination:e}))}disconnect(){var e,t;this.destroyed=!0,this.reconnectTimer&&clearTimeout(this.reconnectTimer),((e=this.ws)==null?void 0:e.readyState)===WebSocket.OPEN&&this.ws.send(p("DISCONNECT",{})),(t=this.ws)==null||t.close(),this.ws=null,this.subscriptions.clear()}scheduleReconnect(){this.destroyed||(l().debug&&console.log(`[ImClient] reconnect in ${this.reconnectDelay}ms`),this.reconnectTimer=setTimeout(()=>{this.connect(),this.reconnectDelay=Math.min(this.reconnectDelay*2,Ie)},this.reconnectDelay))}generateMessageId(){var t,s;const e=(s=(t=globalThis.crypto)==null?void 0:t.randomUUID)==null?void 0:s.call(t);return e||`msg_${Date.now()}_${Math.random().toString(16).slice(2)}`}nextSubscriptionId(){return this.subscriptionSeed+=1,`sub-${this.subscriptionSeed}`}normalizeMessage(e){return{...e,fromId:e.fromId??e.fromUserId,revoked:e.revoked??e.status==="REVOKED"}}}function c(n){return{appId:l().appKey,...n}}function F(n={}){return{msgType:n.msgType,keyword:n.keyword,startTime:n.startTime,endTime:n.endTime,page:n.page??0,size:n.size??20}}function f(n){return r.post("/api/im/messages/send",n,c())}async function Re(n,e,t,s,o){const u=await h(t),a=JSON.stringify({url:u.url,...s!==void 0?{width:s}:{},...o!==void 0?{height:o}:{},...u.thumbnailUrl?{thumbnailUrl:u.thumbnailUrl}:{}});return f({toId:n,chatType:e,msgType:"IMAGE",content:a})}async function ye(n,e,t,s,o,u){const a=await h(t),d=JSON.stringify({url:a.url,...s!==void 0?{width:s}:{},...o!==void 0?{height:o}:{},...u!==void 0?{duration:u}:{},...a.thumbnailUrl?{thumbnailUrl:a.thumbnailUrl}:{}});return f({toId:n,chatType:e,msgType:"VIDEO",content:d})}async function Ce(n,e,t){const s=await h(t),o=JSON.stringify({url:s.url,name:s.originalName,size:s.size});return f({toId:n,chatType:e,msgType:"FILE",content:o})}async function Se(n,e,t,s){const o=await h(t),u=JSON.stringify({url:o.url,...s!==void 0?{duration:s}:{}});return f({toId:n,chatType:e,msgType:"AUDIO",content:u})}function Ue(n){return r.post("/api/im/groups",n,c())}function O(n=20){return r.get("/api/im/conversations",c({page:0,size:n}))}function S(n,e={}){return r.get(`/api/im/messages/history/${encodeURIComponent(n)}`,c(F(e)))}function U(n,e={}){return r.get(`/api/im/messages/group-history/${encodeURIComponent(n)}`,c(F(e)))}async function q(n,e,t=20,s=20){for(let o=0;o<Math.max(s,1);o+=1){const u=await S(n,{page:o,size:t});if(u.content.some(a=>a.id===e))return u.content;if(u.content.length<t)return null}return null}async function _(n,e,t=20,s=20){for(let o=0;o<Math.max(s,1);o+=1){const u=await U(n,{page:o,size:t});if(u.content.some(a=>a.id===e))return u.content;if(u.content.length<t)return null}return null}function D(n,e){return r.put(`/api/im/messages/${encodeURIComponent(n)}`,{content:e},c())}function N(n){return r.post(`/api/im/messages/${encodeURIComponent(n)}/revoke`,void 0,c())}function P(n,e="SINGLE"){return r.put(`/api/im/conversations/${encodeURIComponent(n)}/read`,void 0,c({chatType:e}))}function j(n,e,t){return r.put(`/api/im/conversations/${encodeURIComponent(n)}/pinned`,void 0,c({chatType:e,pinned:t}))}function A(n,e,t){return r.put(`/api/im/conversations/${encodeURIComponent(n)}/muted`,void 0,c({chatType:e,muted:t}))}function J(n,e,t){return r.put(`/api/im/conversations/${encodeURIComponent(n)}/hidden`,void 0,c({chatType:e,hidden:t}))}function B(n,e,t){return r.put(`/api/im/conversations/${encodeURIComponent(n)}/group`,void 0,c({chatType:e,groupName:t}))}function H(){return r.get("/api/im/conversation-groups",c())}function K(n){return r.get(`/api/im/conversation-groups/${encodeURIComponent(n)}`,c())}function L(n,e,t){return r.put(`/api/im/conversations/${encodeURIComponent(n)}/draft`,void 0,c({chatType:e,draft:t}))}function z(n,e){return r.delete(`/api/im/conversations/${encodeURIComponent(n)}`,c({chatType:e}))}function Ge(n){return r.get(`/api/im/accounts/${encodeURIComponent(n)}`,c())}function Me(n,e,t,s){return r.put(`/api/im/accounts/${encodeURIComponent(n)}`,void 0,c({nickname:e,avatar:t,gender:s}))}function V(){return r.get("/api/im/friends",c())}function W(n){return r.post("/api/im/friends",void 0,c({friendId:n}))}function X(n){return r.delete(`/api/im/friends/${encodeURIComponent(n)}`,c())}function Q(){return r.delete("/api/im/friends",c())}function Y(n,e){return r.put(`/api/im/friends/${encodeURIComponent(n)}/group`,void 0,c({groupName:e}))}function Z(){return r.get("/api/im/friends/groups",c())}function x(n){return r.get(`/api/im/friends/groups/${encodeURIComponent(n)}`,c())}function ee(){return r.get("/api/im/groups",c())}function we(n,e=20){return r.get("/api/im/admin/users/search",c({keyword:n,size:e}))}function Te(n,e=20){return r.get("/api/im/admin/groups/search",c({keyword:n,size:e}))}function Ee(n=null,e=null,t=null,s=null,o=null,u=0,a=20){return r.get("/api/im/admin/messages/search",c({keyword:n,chatType:e,msgType:t,startTime:s,endTime:o,page:u,size:a}))}function ne(n){return r.get(`/api/im/groups/${encodeURIComponent(n)}`,c())}function ke(n,e){return r.post(`/api/im/groups/${encodeURIComponent(n)}/owner`,{newOwnerId:e})}function $e(n,e){return r.put(`/api/im/groups/${encodeURIComponent(n)}/attributes`,e)}function Fe(n,e){return r.post(`/api/im/groups/${encodeURIComponent(n)}/attributes/delete`,{keys:e})}function Oe(){return r.get("/api/im/blacklist",c())}function qe(n){return r.post("/api/im/blacklist",void 0,c({blockedUserId:n}))}function _e(n){return r.delete("/api/im/blacklist",c({blockedUserId:n}))}function De(n){return r.get("/api/im/blacklist/check",c({targetUserId:n}))}function te(n,e){return r.post("/api/im/friend-requests",void 0,c({toUserId:n,...e?{remark:e}:{}}))}function se(n="incoming"){return r.get("/api/im/friend-requests",c({direction:n}))}function ie(n){return r.post(`/api/im/friend-requests/${encodeURIComponent(n)}/accept`,void 0,c())}function oe(n){return r.post(`/api/im/friend-requests/${encodeURIComponent(n)}/reject`,void 0,c())}function re(n,e){return r.post(`/api/im/groups/${encodeURIComponent(n)}/join-requests`,void 0,c({...e?{remark:e}:{}}))}function ce(n){return r.get(`/api/im/groups/${encodeURIComponent(n)}/join-requests`,c())}function ue(n,e){return r.post(`/api/im/groups/${encodeURIComponent(n)}/join-requests/${encodeURIComponent(e)}/accept`,void 0,c())}function ae(n,e){return r.post(`/api/im/groups/${encodeURIComponent(n)}/join-requests/${encodeURIComponent(e)}/reject`,void 0,c())}function Ne(n,e){return r.post(`/api/im/admin/groups/${encodeURIComponent(n)}/read-receipts`,{messageIds:e},c())}function Pe(n){return r.post("/api/im/friends/batch",{friendIds:n},c())}function je(n){return r.post("/api/im/friends/batch/remove",{friendIds:n},c())}function Ae(n){return r.post("/api/im/friend-requests/batch/accept",{requestIds:n},c())}function Je(n){return r.post("/api/im/friend-requests/batch/reject",{requestIds:n},c())}function Be(n,e){return r.post(`/api/im/groups/${encodeURIComponent(n)}/members/batch`,{userIds:e},c())}function He(n,e){return r.post(`/api/im/groups/${encodeURIComponent(n)}/members/batch/remove`,{userIds:e},c())}function Ke(n,e){return r.post(`/api/im/groups/${encodeURIComponent(n)}/join-requests/batch/accept`,{requestIds:e},c())}function Le(n,e){return r.post(`/api/im/groups/${encodeURIComponent(n)}/join-requests/batch/reject`,{requestIds:e},c())}function ze(n,e,t,s){const o={};return t!==void 0&&(o.nickname=t),s!==void 0&&(o.role=s),r.put(`/api/im/groups/${encodeURIComponent(n)}/members/${encodeURIComponent(e)}/info`,o,c())}function Ve(){return r.get("/api/im/messages/offline/count",c())}function We(){return r.post("/api/im/messages/offline",void 0,c())}class Xe{constructor(){this.client=null,this._messages=[],this._conversations=[],this._connected=!1,this._error=null,this.listeners=new Map}get messages(){return this._messages}get conversations(){return this._conversations}get connected(){return this._connected}get error(){return this._error}on(e,t){const s=this.listeners.get(e)??new Set;s.add(t),this.listeners.set(e,s)}off(e,t){var s;(s=this.listeners.get(e))==null||s.delete(t)}emit(e,...t){var s;(s=this.listeners.get(e))==null||s.forEach(o=>o(...t))}connect(){const e=new $;e.on("connected",()=>{this._connected=!0,this.emit("connected"),this.refreshConversations().catch(()=>{})}),e.on("disconnected",(t,s)=>{this._connected=!1,this.emit("disconnected",t,s)}),e.on("message",t=>{this.upsertMessage(t),this.refreshConversations().catch(()=>{})}),e.on("read",t=>{this.upsertMessage(t),this.refreshConversations().catch(()=>{})}),e.on("revoke",({msgId:t})=>{this.markMessageRevoked(t),this.refreshConversations().catch(()=>{})}),e.on("conversations",()=>{this.refreshConversations().catch(()=>{})}),e.on("error",t=>{this._error=t,this.emit("error",t)}),e.connect(),this.client=e}send(e){if(!this.client)throw new Error("IM client not connected");const t=this.client.send(e);return this.upsertMessage(t),this.refreshConversations().catch(()=>{}),t}revoke(e){return N(e).then(t=>(this.upsertMessage(t),this.refreshConversations().catch(()=>{}),t))}edit(e,t){return D(e,t).then(s=>(this.upsertMessage(s),this.refreshConversations().catch(()=>{}),s))}disconnect(){var e;(e=this.client)==null||e.disconnect(),this.client=null,this._connected=!1}async refreshConversations(){const e=await O();this._conversations=[...e].sort((t,s)=>t.isPinned!==s.isPinned?Number(s.isPinned)-Number(t.isPinned):s.lastMsgTime-t.lastMsgTime),this.emit("conversations",this._conversations)}async loadHistory(e,t={}){return S(e,t)}async loadGroupHistory(e,t={}){return U(e,t)}jumpToMessagePage(e,t,s=20,o=20){return q(e,t,s,o)}jumpToGroupMessagePage(e,t,s=20,o=20){return _(e,t,s,o)}setConversationRead(e,t="SINGLE"){return this.markConversationRead(e,t),this.refreshConversations().catch(()=>{}),P(e,t)}setConversationPinnedState(e,t,s){return j(e,t,s)}setConversationMutedState(e,t,s){return A(e,t,s)}setConversationHiddenState(e,t,s){return J(e,t,s)}setConversationGroupName(e,t,s){return B(e,t,s)}getConversationGroups(){return H()}getConversationGroupItems(e){return K(e)}setConversationDraft(e,t,s){return L(e,t,s)}removeConversation(e,t){return z(e,t)}getFriends(){return V()}addFriendById(e){return W(e)}removeFriendById(e){return X(e)}clearFriends(){return Q()}setFriendGroupName(e,t){return Y(e,t)}getFriendGroups(){return Z()}getFriendsByGroup(e){return x(e)}getGroups(){return ee()}getGroup(e){return ne(e)}sendFriend(e,t){return te(e,t)}loadFriendRequests(e="incoming"){return se(e)}approveFriendRequest(e){return ie(e)}declineFriendRequest(e){return oe(e)}sendGroupJoin(e,t){return re(e,t)}loadGroupJoinRequests(e){return ce(e)}approveGroupJoinRequest(e,t){return ue(e,t)}declineGroupJoinRequest(e,t){return ae(e,t)}upsertMessage(e){const t=this._messages.findIndex(s=>s.id===e.id);if(t>=0){const s=[...this._messages];s[t]={...s[t],...e},this._messages=s}else this._messages=[...this._messages,e];this.emit("messages",this._messages)}markMessageRevoked(e){const t=this._messages.findIndex(o=>o.id===e);if(t<0)return;const s=[...this._messages];s[t]={...s[t],status:"REVOKED",msgType:"REVOKED",revoked:!0,content:""},this._messages=s,this.emit("messages",this._messages)}markConversationRead(e,t="SINGLE"){this._conversations=this._conversations.map(s=>s.targetId===e&&s.chatType===t?{...s,unreadCount:0}:s),this.emit("conversations",this._conversations)}}i.ImClient=$,i.ImManager=Xe,i.acceptFriendRequest=ie,i.acceptGroupJoinRequest=ue,i.addFriend=W,i.addToBlacklist=qe,i.adminGroupReadReceipts=Ne,i.batchAcceptFriendRequests=Ae,i.batchAcceptGroupJoinRequests=Ke,i.batchAddFriends=Pe,i.batchAddGroupMembers=Be,i.batchRejectFriendRequests=Je,i.batchRejectGroupJoinRequests=Le,i.batchRemoveFriends=je,i.batchRemoveGroupMembers=He,i.checkBlacklist=De,i.createGroup=Ue,i.deleteConversation=z,i.editMessage=D,i.fetchGroupHistory=U,i.fetchHistory=S,i.getConfig=l,i.getGroupInfo=ne,i.getProfile=Ge,i.getToken=E,i.getUserId=k,i.http=r,i.init=fe,i.listBlacklist=Oe,i.listConversationGroupItems=K,i.listConversationGroups=H,i.listConversations=O,i.listFriendGroups=Z,i.listFriendRequests=se,i.listFriends=V,i.listFriendsByGroup=x,i.listGroupJoinRequests=ce,i.listGroups=ee,i.locateGroupHistoryPage=_,i.locateHistoryPage=q,i.login=ge,i.logout=ve,i.markRead=P,i.modifyGroupMemberInfo=ze,i.offlineMessageCount=Ve,i.rejectFriendRequest=oe,i.rejectGroupJoinRequest=ae,i.removeAllFriends=Q,i.removeFriend=X,i.removeFromBlacklist=_e,i.removeGroupAttributes=Fe,i.revokeMessage=N,i.searchGroups=Te,i.searchMessages=Ee,i.searchUsers=we,i.sendAudioMessage=Se,i.sendFileMessage=Ce,i.sendFriendRequest=te,i.sendGroupJoinRequest=re,i.sendImageMessage=Re,i.sendMessage=f,i.sendVideoMessage=ye,i.setConversationGroup=B,i.setConversationHidden=J,i.setConversationMuted=A,i.setConversationPinned=j,i.setDraft=L,i.setFriendGroup=Y,i.setToken=y,i.setUserId=C,i.syncOfflineMessages=We,i.transferGroupOwner=ke,i.updateGroupAttributes=$e,i.updateProfile=Me,i.uploadFile=h,Object.defineProperty(i,Symbol.toStringTag,{value:"Module"})}));
|