(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;g0&&(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;oa.id===e))return u.content;if(u.content.lengtha.id===e))return u.content;if(u.content.lengtho(...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"})}));