import { Client } from 'ts-linker-sdk'; import { getMetaData } from './meta'; export interface WebSocketClientStatus { created: boolean; connected: boolean; login: boolean; } export interface WebSocketResp { value: object | string; } export type ListenerCallback = (data: WebSocketResp) => void; const meta = getMetaData(); const PING_INTERVAL = 50 * 1000; export class WebSocketClient { client: Client; interval: number; wsUrl: string; token: string; sid: string; chatToken: object; status: WebSocketClientStatus = { created: false, connected: false, login: false }; /** 默认构造函数 */ constructor(wsUrl: string, token: string, sid: string, chatToken: object) { this.wsUrl = wsUrl; this.token = token; this.chatToken = chatToken; this.sid = sid; } async init() { return this.create(); } getStatus() { return this.status; } async create() { const url = this.wsUrl; return new Promise((resolve, reject) => { if (!url) { throw new Error('websocket url is required.'); } this.client = Client.getInstance(url, { onOpen: async () => { try { this.ping(); this.interval = setInterval(() => { this.ping(); }, PING_INTERVAL) as any; } catch (err) { console.error(err); reject(err); } const data = await this.connect(); await this.authentication(); resolve(data.value); }, onError: () => { resolve(false); }, onClose: () => { clearInterval(this.interval); } }); }); } on(url: string, callback: (data: WebSocketResp) => void) { if (!url) { throw new Error('url is required.'); } this.client.addMessageListener(url, callback); } off(url: string) { this.client.removeMessageListener(url); } async request(url: string, data: object) { return this.client.request(url, data); } async connect() { const { sid } = this; if (sid) { this.client.setRequestProperty('sid', sid); } const data = await this.request('/v1/session/start', { ...this.chatToken, ...meta }); if (data && data.value) { const id = data.value as string; this.sid = id; this.client.setRequestProperty('sid', id); } return data || true; } ping() { return this.client.ping({}); } async authentication() { const tk = this.token; const data = await this.request('/v1/session/bind/uid/by/token', { token: tk }); return data || true; } async onMessage(callback: ListenerCallback) { this.on('/v1/message/listener', callback); } async sendMessage(data: object) { return this.request('/v1/send/message', data); } async markServiced(data: { msg_id: string }) { return this.request('/v1/mark/message/serviced', data); } /** @start Apis */ /** 获取聊天室历史消息 */ async getHistoryMessage(data: { contact_id: string; chat_type: string; start_time: number; limit: number; }) { return this.request('/v1/history/message', data); } /** 修改在线状态 */ async updateStatus(data: { status: 'on' | 'off' | 'busy' }) { return this.request('/v1/session/status', data); } /** 获取当前登陆用户的设备信息 */ async getSessionLists() { return this.request('/v1/session/lists', {}); } /** 增量获取所有会话信息 */ async getAllConversations(data: { last_pull: number; // 最后一次获取的时间 0的话是全量获取 }) { return this.request('/v1/get/all/conversation', data); } /** 获取联系人列表 */ async getAllContact(data: { last_pull: number; // 最后一次获取的时间 0的话是全量获取 }) { return this.request('/v1/get/all/contact', data); } /** 添加联系人 */ async addContact(data: { to_add_username: string; reason: string }) { return this.request('/v1/add/contact', data); } /** 删除联系人 */ async deleteContact(data: { fid: string }) { return this.request('/v1/delete/contact', data); } /** 屏蔽联系人 */ async maskingContact(data: { fid: string }) { return this.request('/v1/add/contact/masking', data); } /** 取消联系人 */ async removeMaskingContact(data: { fid: string }) { return this.request('/v1/remove/contact/masking', data); } /** 置顶联系人 */ async stickingContact(data: { fid: string }) { return this.request('/v1/add/contact/stick', data); } /** 解除置顶联系人 */ async removeStickContact(data: { fid: string }) { return this.request('/v1/remove/contact/stick', data); } /** 消息免打扰 */ async setNoDisturbing(data: { fid: string }) { return this.request('/v1/add/contact/no/disturbing', data); } /** 取消消息免打扰 */ async removeNoDisturbing(data: { fid: string }) { return this.request('/v1/remove/contact/no/disturbing', data); } /** 同意添加好友 */ async agreeAddContact(data: { id: string; to: string }) { return this.request('/v1/add/contact/agree', data); } /** 拒绝添加好友 */ async rejectAddContact(data: { id: string; to: string }) { return this.request('/v1/add/contact/reject', data); } /** 标记好友申请已发送 */ async addContactServiced(data: { id: string; to: string }) { return this.request('/v1/add/contact/serviced', data); } /** 创建聊天室 */ async createChatroom(data: { subject: string; description: string; welcome_message: string; max: number; }) { return this.request('/v1/create/chatroom', data); } /** 销毁聊天室 */ async destroyChatroom(data: { room_id: string }) { return this.request('/v1/destroy/chatroom', data); } /** 离开聊天室 */ async leaveChatroom(data: { room_id: string }) { return this.request('/v1/leave/chatroom', data); } /** 获取聊天室详情 */ async getChatroomProfile(data: { room_id: string }) { return this.request('/v1/get/chatroom/profile', data); } /** 修改聊天室名称 */ async updateChatroomSubject(data: { room_id: string }) { return this.request('/v1/update/chatroom/subject', data); } /** 修改聊天室描述信息 */ async updateChatroomDescription(data: { room_id: string }) { return this.request('/v1/update/chatroom/description', data); } /** 添加管理员 */ async addChatroomAdmin(data: { room_id: string; admin_id: string }) { return this.request('/v1/add/chatroom/admin', data); } /** 移除管理员 */ async removeChatroomAdmin(data: { room_id: string; admin_id: string }) { return this.request('/v1/remove/chatroom/admin', data); } /** 批量添加管理员 */ async addChatroomAdmins(data: { room_id: string; admins_id: string[] }) { return this.request('/v1/add/chatroom/admins', data); } /** 批量移除管理员 */ async removeChatroomAdmins(data: { room_id: string; admins_id: string[] }) { return this.request('/v1/remove/chatroom/admins', data); } /** 加入聊天室 */ async joinChatroom(data: {}) { return this.request('/v1/join/chatroom', data); } /** 删除聊天室成员 */ async removeChatroomMember(data: { room_id: string; member: string }) { return this.request('/v1/remove/chatroom/member', data); } /** 获取置顶聊天室列表 */ async fetchStickChatroom(data: { cache_time: number }) { return this.request('/v1/fetch/stick/chatroom', data); } /** 获取聊天室成员 */ async fetchChatroomMembers(data: { room_id: string; authority: number }) { return this.request('/v1/fetch/chatroom/members', data); } /** 搜索聊天室历史消息 */ async searchHistoryMessage(data: { contact_id: string; chat_type: string; keyword: string; limit: number; }) { return this.request('/v1/search/history/message', data); } }