UNPKG

@sama-communications/sdk

Version:

A SDK client for interacting with the SAMA chat server from Web/Node.js apps

264 lines (263 loc) 9.9 kB
var w = Object.defineProperty; var q = (c, e, n) => e in c ? w(c, e, { enumerable: !0, configurable: !0, writable: !0, value: n }) : c[e] = n; var r = (c, e, n) => q(c, typeof e != "symbol" ? e + "" : e, n); import S from "get-browser-fingerprint"; function P(c) { const e = "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g, (n) => { const t = Math.random() * 16 | 0; return (n === "x" ? t : t & 3 | 8).toString(16); }); return c !== void 0 ? `${e}:${c}` : e; } class E { constructor({ endpoint: { ws: e, http: n } }) { r(this, "socket", null); r(this, "wsEndpoint"); r(this, "httpEndpoint"); r(this, "curerntUserId", null); r(this, "responsesPromises", {}); r(this, "deviceId", null); r(this, "onMessageListener", null); r(this, "onMessageStatusListener", null); r(this, "onUserActivityListener", null); r(this, "onUserTypingListener", null); r(this, "onConversationCreateListener", null); r(this, "onConversationUpdateListener", null); r(this, "onConversationDeleteListener", null); r(this, "onConnectEvent", null); r(this, "onMessageEvent", null); r(this, "onDisconnectEvent", null); this.wsEndpoint = e, this.httpEndpoint = n, S({ hardwareOnly: !0 }).then((t) => this.deviceId = t.toString()); } async connect() { return new Promise((e, n) => { this.socket = new WebSocket(this.wsEndpoint), this.socket.onopen = () => { var t; console.log("[socket.open]"), (t = this.onConnectEvent) == null || t.call(this), e(); }, this.socket.onmessage = (t) => { var a, p, d, h, g, y, v, _, k, b, x, f; const s = JSON.parse(t.data); if (console.log("[socket.message]", s), s.typing) { (a = this.onUserTypingListener) == null || a.call(this, s.typing); return; } if (s.system_message || (p = s.message) != null && p.system_message) { const { conversation_created: o, conversation_updated: u, conversation_kicked: l } = ((d = s.system_message) == null ? void 0 : d.x) || ((g = (h = s.message) == null ? void 0 : h.system_message) == null ? void 0 : g.x) || {}; if (o) { (y = this.onConversationCreateListener) == null || y.call(this, o); return; } if (u) { (v = this.onConversationUpdateListener) == null || v.call(this, u); return; } if (l) { (_ = this.onConversationDeleteListener) == null || _.call(this, l); return; } return; } if (s.last_activity) { (k = this.onUserActivityListener) == null || k.call(this, s.last_activity); return; } if (s.message_read) { (b = this.onMessageStatusListener) == null || b.call(this, s.message_read); return; } if (s.message) { if (s.message.error) { this.responsesPromises[Object.keys(this.responsesPromises).slice(-1)[0]].reject(s.message.error); return; } (x = this.onMessageListener) == null || x.call(this, s.message), s.message.from.toString() !== this.curerntUserId && ((f = this.onMessageEvent) == null || f.call(this, s.message)); return; } if (s.ask) { const o = s.ask.mid; this.responsesPromises[o].resolve(s.ask), delete this.responsesPromises[o]; return; } const i = s.response; if (i) { const o = i.id; if (!o) { console.error(i.error); return; } const { resolve: u, reject: l, resObjKey: m } = this.responsesPromises[o]; i.error ? i.error.status === 403 ? this.responsesPromises[o].reject(i.error) : l(i.error) : m ? i[m] ? u(i[m]) : l({ message: "Server error." }) : u(i), delete this.responsesPromises[o]; } }, this.socket.onerror = (t) => { console.log("[socket.error]", t), n(t); }, this.socket.onclose = () => { var t; console.log("[socket.close]"), (t = this.onDisconnectEvent) == null || t.call(this), this.reconnect(); }; }); } reconnect() { const e = () => { navigator.onLine && document.visibilityState === "visible" && (this.connect(), window.removeEventListener("online", e), document.removeEventListener("visibilitychange", e)); }; navigator.onLine && document.visibilityState === "visible" ? this.connect() : (window.addEventListener("online", e), document.addEventListener("visibilitychange", e)); } async sendRequest(e, n = {}, t = "success") { const s = { request: { [e]: n, id: P(e) } }; return this.sendPromise(s, t); } async sendPromise(e, n) { return new Promise((t, s) => { if (!this.socket) { s("Socket is not connected."); return; } this.socket.send(JSON.stringify(e)), console.log("[socket.send]", e), this.responsesPromises[e.request.id] = { resolve: t, reject: s, resObjKey: n }; }); } async sendHttpPromise(e, n, t) { console.log("[http.request]", { request: t }); const s = { "Content-Type": "application/json" }, i = localStorage.getItem("sessionId"); i && (s.Authorization = `Bearer ${i}`); const a = { method: e, credentials: "include", headers: s }; t && (a.body = JSON.stringify(t)); const d = await (await fetch(`${this.httpEndpoint}/${n}`, a)).json(); return console.log("[http.response]", { response: d }), d; } async connectSocket(e) { return this.sendRequest("connect", { token: e.token, device_id: this.deviceId }); } async disconnectSocket() { return this.sendRequest("user_logout"); } async userCreate(e) { return this.sendRequest("user_create", { login: e.login, password: e.password }, "user"); } async userEdit(e) { return this.sendRequest("user_edit", e, "user"); } async userLogin(e) { const { login: n, password: t } = e || {}, s = Date.now(); parseInt(localStorage.getItem("sessionExpiredAt") || `${s}`, 10) - s <= 0 && localStorage.removeItem("sessionId"); const a = { device_id: this.deviceId }; return n && t && (a.login = n, a.password = t), await this.sendHttpPromise("POST", "login", a); } async userLogout() { return await this.sendHttpPromise("POST", "logout", null); } async userDelete() { return localStorage.removeItem("sessionId"), this.sendRequest("user_delete"); } async userSearch(e) { const n = { keyword: e.keyword, ignore_ids: e.ignore_ids || [], ...e.limit && { limit: e.limit }, ...e.updated_at && { updated_at: e.updated_at } }; return this.sendRequest("user_search", n, "users"); } async getUsersByIds(e) { return this.sendRequest("get_users_by_ids", { ids: e.ids }, "users"); } async getParticipantsByCids(e) { return this.sendRequest("get_participants_by_cids", { cids: e.cids }, "users"); } async createUploadUrlForFiles(e) { return this.sendRequest("create_files", e.files, "files"); } async getDownloadUrlForFiles(e) { return this.sendRequest("get_file_urls", { file_ids: e.file_ids }, "file_urls"); } async messageCreate(e) { return new Promise((n, t) => { var i; const s = { message: { id: e.mid, body: e.body, cid: e.cid, attachments: e.attachments } }; this.responsesPromises[s.message.id] = { resolve: n, reject: t }, (i = this.socket) == null || i.send(JSON.stringify(s)), console.log("[socket.send]", s); }); } async messageList(e) { const n = { cid: e.cid, ...e.limit && { limit: e.limit }, ...e.updated_at && { updated_at: e.updated_at } }; return this.sendRequest("message_list", n, "messages"); } async markConversationAsRead(e) { return this.sendRequest("message_read", { cid: e.cid }); } async subscribeToUserActivity(e) { return this.sendRequest("user_last_activity_subscribe", { id: e }, "last_activity"); } async unsubscribeFromUserActivity() { return this.sendRequest("user_last_activity_unsubscribe"); } async sendTypingStatus(e) { return new Promise((n, t) => { var i; const s = { typing: { cid: e.cid } }; this.responsesPromises[s.typing.cid] = { resolve: n, reject: t }, (i = this.socket) == null || i.send(JSON.stringify(s)), console.log("[socket.send]", s); }); } async conversationCreate(e) { return this.sendRequest("conversation_create", e, "conversation"); } async conversationUpdate(e) { var n, t; return this.sendRequest("conversation_update", { id: e.cid, name: e.name, description: e.description, participants: { add: (n = e.participants) == null ? void 0 : n.add, remove: (t = e.participants) == null ? void 0 : t.remove }, image_object: e.image_object }, "conversation"); } async conversationList(e) { const n = { ...e.limit && { limit: e.limit }, ...e.updated_at && { updated_at: { gt: e.updated_at.gt, lt: e.updated_at.lt } } }; return this.sendRequest("conversation_list", n, "conversations"); } async conversationDelete(e) { return this.sendRequest("conversation_delete", { id: e.cid }); } async conversationSearch(e) { return this.sendRequest("conversation_search", { name: e.name }, "conversations"); } async pushSubscriptionCreate(e) { return this.sendRequest("push_subscription_create", { platform: "web", web_endpoint: e.web_endpoint, web_key_auth: e.web_key_auth, web_key_p256dh: e.web_key_p256dh, device_udid: this.deviceId }, "subscription"); } async pushSubscriptionDelete() { return this.sendRequest("push_subscription_delete", { device_udid: this.deviceId }); } } export { E as SAMAClient };