vanshi-sdk 1.0.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +96 -0
- package/dist/index.cjs +1015 -0
- package/dist/index.d.ts +1202 -0
- package/dist/index.js +4386 -0
- package/dist/index.mjs +983 -0
- package/package.json +65 -0
package/dist/index.mjs
ADDED
|
@@ -0,0 +1,983 @@
|
|
|
1
|
+
// src/plugins/socketio/client.ts
|
|
2
|
+
import io from "socket.io-client";
|
|
3
|
+
|
|
4
|
+
// src/sdk/runtime.ts
|
|
5
|
+
var SDK_TOKEN_KEY = "VanshiSdk_Token";
|
|
6
|
+
var SDK_LOGIN_KEY = "VanshiSdk_isLogin";
|
|
7
|
+
function getBrowserStorage() {
|
|
8
|
+
if (typeof localStorage === "undefined") {
|
|
9
|
+
return void 0;
|
|
10
|
+
}
|
|
11
|
+
return localStorage;
|
|
12
|
+
}
|
|
13
|
+
var SdkRuntimeError = class extends Error {
|
|
14
|
+
constructor(result) {
|
|
15
|
+
super(result.message || `SDK request failed${result.code !== void 0 ? `: ${String(result.code)}` : ""}`);
|
|
16
|
+
this.name = "SdkRuntimeError";
|
|
17
|
+
this.code = result.code;
|
|
18
|
+
this.data = result.data;
|
|
19
|
+
this.raw = result.raw;
|
|
20
|
+
this.parsed = result.parsed;
|
|
21
|
+
}
|
|
22
|
+
};
|
|
23
|
+
function parseJsonSafely(value) {
|
|
24
|
+
if (value == null) {
|
|
25
|
+
return void 0;
|
|
26
|
+
}
|
|
27
|
+
if (typeof value !== "string") {
|
|
28
|
+
return value;
|
|
29
|
+
}
|
|
30
|
+
try {
|
|
31
|
+
return JSON.parse(value);
|
|
32
|
+
} catch {
|
|
33
|
+
return void 0;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
function isSuccessCode(code) {
|
|
37
|
+
return code === 0 || code === "0" || code === true;
|
|
38
|
+
}
|
|
39
|
+
function toSdkEnvelope(response) {
|
|
40
|
+
if (response && typeof response === "object") {
|
|
41
|
+
return response;
|
|
42
|
+
}
|
|
43
|
+
return {};
|
|
44
|
+
}
|
|
45
|
+
function unwrapSdkData(response) {
|
|
46
|
+
const result = unwrapSdkDetailedData(response);
|
|
47
|
+
if (!result.success) {
|
|
48
|
+
throw new SdkRuntimeError(result);
|
|
49
|
+
}
|
|
50
|
+
return result.data;
|
|
51
|
+
}
|
|
52
|
+
function unwrapSdkResponse(response) {
|
|
53
|
+
const envelope = toSdkEnvelope(response);
|
|
54
|
+
const parsed = parseJsonSafely(envelope.data);
|
|
55
|
+
if (parsed && typeof parsed === "object" && "code" in parsed) {
|
|
56
|
+
return parsed;
|
|
57
|
+
}
|
|
58
|
+
return {
|
|
59
|
+
code: envelope.code,
|
|
60
|
+
message: envelope.message,
|
|
61
|
+
data: parsed !== void 0 ? parsed : envelope.data
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
function unwrapSdkDetailedData(response) {
|
|
65
|
+
const envelope = toSdkEnvelope(response);
|
|
66
|
+
const parsed = parseJsonSafely(envelope.data);
|
|
67
|
+
if (parsed && typeof parsed === "object" && "code" in parsed) {
|
|
68
|
+
const success = isSuccessCode(parsed.code);
|
|
69
|
+
return {
|
|
70
|
+
success,
|
|
71
|
+
code: parsed.code,
|
|
72
|
+
message: parsed.message || envelope.message,
|
|
73
|
+
data: parsed.data,
|
|
74
|
+
raw: response,
|
|
75
|
+
parsed
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
if (envelope.code !== void 0 || envelope.message !== void 0) {
|
|
79
|
+
return {
|
|
80
|
+
success: isSuccessCode(envelope.code),
|
|
81
|
+
code: envelope.code,
|
|
82
|
+
message: envelope.message,
|
|
83
|
+
data: parsed !== void 0 ? parsed : envelope.data,
|
|
84
|
+
raw: response,
|
|
85
|
+
parsed
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
return {
|
|
89
|
+
success: true,
|
|
90
|
+
data: parsed !== void 0 ? parsed : envelope.data,
|
|
91
|
+
raw: response,
|
|
92
|
+
parsed
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
function getStoredToken() {
|
|
96
|
+
return getBrowserStorage()?.getItem(SDK_TOKEN_KEY) || "";
|
|
97
|
+
}
|
|
98
|
+
function setSdkSession(token) {
|
|
99
|
+
const storage = getBrowserStorage();
|
|
100
|
+
if (!storage) {
|
|
101
|
+
return;
|
|
102
|
+
}
|
|
103
|
+
storage.setItem(SDK_TOKEN_KEY, token);
|
|
104
|
+
storage.setItem(SDK_LOGIN_KEY, "true");
|
|
105
|
+
}
|
|
106
|
+
function clearSdkSession() {
|
|
107
|
+
const storage = getBrowserStorage();
|
|
108
|
+
if (!storage) {
|
|
109
|
+
return;
|
|
110
|
+
}
|
|
111
|
+
storage.removeItem(SDK_TOKEN_KEY);
|
|
112
|
+
storage.removeItem(SDK_LOGIN_KEY);
|
|
113
|
+
}
|
|
114
|
+
function getSocketUrl() {
|
|
115
|
+
const globalUrl = typeof window !== "undefined" ? window.__VANSHI_SOCKET_URL : void 0;
|
|
116
|
+
return globalUrl || "wss://ws-vanshi-chat-sdk.xchatclub.com";
|
|
117
|
+
}
|
|
118
|
+
function getUploadUrl() {
|
|
119
|
+
const globalHttpUrl = typeof window !== "undefined" ? window.__VANSHI_HTTP_URL : void 0;
|
|
120
|
+
return globalHttpUrl || "https://vanshi-chat-api.xchatclub.com/api/files/sdkUpload";
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
// src/sdk/session.ts
|
|
124
|
+
var reconnectLoginHandler = null;
|
|
125
|
+
function registerReconnectLoginHandler(handler) {
|
|
126
|
+
reconnectLoginHandler = handler;
|
|
127
|
+
}
|
|
128
|
+
async function restoreSessionAfterReconnect() {
|
|
129
|
+
if (!reconnectLoginHandler) {
|
|
130
|
+
return false;
|
|
131
|
+
}
|
|
132
|
+
const token = getStoredToken();
|
|
133
|
+
if (!token) {
|
|
134
|
+
return false;
|
|
135
|
+
}
|
|
136
|
+
try {
|
|
137
|
+
return await reconnectLoginHandler(token);
|
|
138
|
+
} catch {
|
|
139
|
+
return false;
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
function clearSessionState() {
|
|
143
|
+
clearSdkSession();
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
// src/plugins/socketio/client.ts
|
|
147
|
+
function parseSocketConnectErrorPayload(value) {
|
|
148
|
+
if (!value) {
|
|
149
|
+
return void 0;
|
|
150
|
+
}
|
|
151
|
+
if (typeof value === "string") {
|
|
152
|
+
try {
|
|
153
|
+
const parsed = JSON.parse(value);
|
|
154
|
+
if (parsed && typeof parsed === "object") {
|
|
155
|
+
return parsed;
|
|
156
|
+
}
|
|
157
|
+
} catch {
|
|
158
|
+
return void 0;
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
if (typeof value === "object") {
|
|
162
|
+
return value;
|
|
163
|
+
}
|
|
164
|
+
return void 0;
|
|
165
|
+
}
|
|
166
|
+
function normalizeSocketConnectError(error) {
|
|
167
|
+
const rawMessage = error && typeof error === "object" && "message" in error ? error.message : void 0;
|
|
168
|
+
const rawData = error && typeof error === "object" && "data" in error ? error.data : void 0;
|
|
169
|
+
const payload = parseSocketConnectErrorPayload(rawData) || parseSocketConnectErrorPayload(rawMessage);
|
|
170
|
+
const normalized = new Error(
|
|
171
|
+
payload?.message || (typeof rawMessage === "string" ? rawMessage : "") || "socket connect failed"
|
|
172
|
+
);
|
|
173
|
+
normalized.name = "SocketConnectError";
|
|
174
|
+
normalized.code = payload?.code;
|
|
175
|
+
normalized.data = payload;
|
|
176
|
+
normalized.requestId = payload?.requestId;
|
|
177
|
+
normalized.raw = error;
|
|
178
|
+
return normalized;
|
|
179
|
+
}
|
|
180
|
+
var SocketClient = class {
|
|
181
|
+
constructor() {
|
|
182
|
+
this.pending = /* @__PURE__ */ new Map();
|
|
183
|
+
this.emitQueue = [];
|
|
184
|
+
this.connectPromise = null;
|
|
185
|
+
this.url = "";
|
|
186
|
+
this.handleResponse = (res) => {
|
|
187
|
+
const entry = this.pending.get(res.id);
|
|
188
|
+
if (!entry)
|
|
189
|
+
return;
|
|
190
|
+
clearTimeout(entry.timer);
|
|
191
|
+
this.pending.delete(res.id);
|
|
192
|
+
res.error ? entry.reject(res.error) : entry.resolve(res.payload);
|
|
193
|
+
};
|
|
194
|
+
}
|
|
195
|
+
connect(url, auth, opts = {}) {
|
|
196
|
+
if (this.connectPromise)
|
|
197
|
+
return this.connectPromise;
|
|
198
|
+
if (this.isConnected())
|
|
199
|
+
return Promise.resolve();
|
|
200
|
+
if (this.socket) {
|
|
201
|
+
try {
|
|
202
|
+
this.socket.off();
|
|
203
|
+
this.socket.io.off();
|
|
204
|
+
this.socket = void 0;
|
|
205
|
+
} catch {
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
if (this.isConnected())
|
|
209
|
+
return Promise.resolve();
|
|
210
|
+
const { baseUrl, namespace } = this.parseUrl(url);
|
|
211
|
+
this.url = url;
|
|
212
|
+
const ioOpts = {
|
|
213
|
+
...opts,
|
|
214
|
+
transports: ["websocket"],
|
|
215
|
+
// 🔥 只保留 websocket,不会多条连接
|
|
216
|
+
query: { namespace },
|
|
217
|
+
forceNew: true,
|
|
218
|
+
reconnection: true,
|
|
219
|
+
reconnectionAttempts: 9999,
|
|
220
|
+
reconnectionDelay: 1e4,
|
|
221
|
+
timeout: 15e3
|
|
222
|
+
};
|
|
223
|
+
this.connectPromise = new Promise((resolve, reject) => {
|
|
224
|
+
const socket = io(`${baseUrl}/im/user`, ioOpts);
|
|
225
|
+
this.socket = socket;
|
|
226
|
+
console.log("[SocketClient] \u65B0\u8FDE\u63A5\u521B\u5EFA\uFF1A", `${baseUrl}/im/user`);
|
|
227
|
+
const handleConnect = () => {
|
|
228
|
+
socket.off("connect_error", handleError);
|
|
229
|
+
socket.on("api:response", this.handleResponse);
|
|
230
|
+
this.processEmitQueue();
|
|
231
|
+
resolve();
|
|
232
|
+
};
|
|
233
|
+
const handleError = (err) => {
|
|
234
|
+
const normalizedError = normalizeSocketConnectError(err);
|
|
235
|
+
console.error("[SocketClient] \u8FDE\u63A5\u5931\u8D25\uFF1A:", normalizedError);
|
|
236
|
+
socket.off("connect", handleConnect);
|
|
237
|
+
reject(normalizedError);
|
|
238
|
+
};
|
|
239
|
+
socket.once("connect", handleConnect);
|
|
240
|
+
socket.once("connect_error", handleError);
|
|
241
|
+
socket.on("disconnect", (reason) => {
|
|
242
|
+
this.cleanupAllPending("disconnected: " + reason);
|
|
243
|
+
this.connectPromise = null;
|
|
244
|
+
});
|
|
245
|
+
socket.io.off("reconnect");
|
|
246
|
+
socket.io.on("reconnect", async () => {
|
|
247
|
+
console.log("[SocketClient] \u91CD\u8FDE\u6210\u529F \u2192 \u7B49\u5F85 socket \u5B8C\u5168\u5C31\u7EEA", this.socket?.connected);
|
|
248
|
+
await new Promise(
|
|
249
|
+
(resolveReconnect) => setTimeout(resolveReconnect, 200)
|
|
250
|
+
);
|
|
251
|
+
if (!this.isConnected() || !this.socket) {
|
|
252
|
+
console.log("[SocketClient] socket \u672A\u5C31\u7EEA\uFF0C\u8DF3\u8FC7\u767B\u5F55");
|
|
253
|
+
return;
|
|
254
|
+
}
|
|
255
|
+
try {
|
|
256
|
+
console.log("[SocketClient] \u5F00\u59CB\u81EA\u52A8\u767B\u5F55 \u2705");
|
|
257
|
+
const res = await restoreSessionAfterReconnect();
|
|
258
|
+
if (res) {
|
|
259
|
+
this.processEmitQueue();
|
|
260
|
+
} else {
|
|
261
|
+
clearSessionState();
|
|
262
|
+
}
|
|
263
|
+
} catch (err) {
|
|
264
|
+
console.error("[SocketClient] \u81EA\u52A8\u767B\u5F55\u5931\u8D25", err);
|
|
265
|
+
clearSessionState();
|
|
266
|
+
}
|
|
267
|
+
});
|
|
268
|
+
});
|
|
269
|
+
this.connectPromise.finally(() => {
|
|
270
|
+
this.connectPromise = null;
|
|
271
|
+
});
|
|
272
|
+
return this.connectPromise;
|
|
273
|
+
}
|
|
274
|
+
disconnect() {
|
|
275
|
+
if (!this.socket)
|
|
276
|
+
return;
|
|
277
|
+
try {
|
|
278
|
+
this.socket.off("api:response", this.handleResponse);
|
|
279
|
+
this.socket.io.off("reconnect");
|
|
280
|
+
this.socket.disconnect();
|
|
281
|
+
} catch {
|
|
282
|
+
}
|
|
283
|
+
this.socket = void 0;
|
|
284
|
+
this.cleanupAllPending("client disconnected");
|
|
285
|
+
}
|
|
286
|
+
emitWithAck(event, payload, timeoutMs = 1e4) {
|
|
287
|
+
if (this.isConnected()) {
|
|
288
|
+
return this.createEmitPromise(event, payload, timeoutMs);
|
|
289
|
+
}
|
|
290
|
+
if (this.connectPromise) {
|
|
291
|
+
return new Promise((resolve, reject) => {
|
|
292
|
+
this.emitQueue.push({ event, payload, timeoutMs, resolve, reject });
|
|
293
|
+
});
|
|
294
|
+
}
|
|
295
|
+
return Promise.reject(new Error("socket not initialized"));
|
|
296
|
+
}
|
|
297
|
+
request(path, payload, timeoutMs = 1e4) {
|
|
298
|
+
if (!this.socket) {
|
|
299
|
+
return Promise.reject(new Error("socket not initialized"));
|
|
300
|
+
}
|
|
301
|
+
const id = this.generateId();
|
|
302
|
+
const envelope = { id, path, payload };
|
|
303
|
+
return new Promise((resolve, reject) => {
|
|
304
|
+
const timer = setTimeout(() => {
|
|
305
|
+
this.pending.delete(id);
|
|
306
|
+
reject(new Error("request timeout"));
|
|
307
|
+
}, timeoutMs);
|
|
308
|
+
this.pending.set(id, { resolve, reject, timer });
|
|
309
|
+
try {
|
|
310
|
+
this.socket.emit("api:request", envelope);
|
|
311
|
+
} catch (err) {
|
|
312
|
+
clearTimeout(timer);
|
|
313
|
+
this.pending.delete(id);
|
|
314
|
+
reject(err);
|
|
315
|
+
}
|
|
316
|
+
});
|
|
317
|
+
}
|
|
318
|
+
on(event, handler) {
|
|
319
|
+
this.socket?.on(event, handler);
|
|
320
|
+
}
|
|
321
|
+
off(event, handler) {
|
|
322
|
+
if (!this.socket)
|
|
323
|
+
return;
|
|
324
|
+
handler ? this.socket.off(event, handler) : this.socket.off(event);
|
|
325
|
+
}
|
|
326
|
+
isConnected() {
|
|
327
|
+
return !!this.socket?.connected;
|
|
328
|
+
}
|
|
329
|
+
parseUrl(url) {
|
|
330
|
+
let baseUrl = url;
|
|
331
|
+
let namespace = "/im/user";
|
|
332
|
+
try {
|
|
333
|
+
const urlObj = new URL(url);
|
|
334
|
+
const queryNs = urlObj.searchParams.get("namespace");
|
|
335
|
+
if (queryNs)
|
|
336
|
+
namespace = queryNs;
|
|
337
|
+
baseUrl = urlObj.origin + urlObj.pathname.replace(/\/$/, "");
|
|
338
|
+
} catch {
|
|
339
|
+
console.warn("[Socket] URL parse failed:", url);
|
|
340
|
+
}
|
|
341
|
+
return { baseUrl, namespace };
|
|
342
|
+
}
|
|
343
|
+
generateId() {
|
|
344
|
+
return Date.now().toString(36) + Math.random().toString(36).slice(2, 9);
|
|
345
|
+
}
|
|
346
|
+
createEmitPromise(event, payload, timeoutMs) {
|
|
347
|
+
return new Promise((resolve, reject) => {
|
|
348
|
+
let timedOut = false;
|
|
349
|
+
const timer = setTimeout(() => {
|
|
350
|
+
timedOut = true;
|
|
351
|
+
reject(new Error("ack timeout"));
|
|
352
|
+
}, timeoutMs);
|
|
353
|
+
try {
|
|
354
|
+
this.socket.emit(event, payload, (response) => {
|
|
355
|
+
if (timedOut)
|
|
356
|
+
return;
|
|
357
|
+
clearTimeout(timer);
|
|
358
|
+
if (response?.code !== void 0) {
|
|
359
|
+
isSuccessCode(response.code) ? resolve(response) : reject(new Error(response.message || `code=${response.code}`));
|
|
360
|
+
} else {
|
|
361
|
+
resolve(response);
|
|
362
|
+
}
|
|
363
|
+
});
|
|
364
|
+
} catch (err) {
|
|
365
|
+
clearTimeout(timer);
|
|
366
|
+
reject(err);
|
|
367
|
+
}
|
|
368
|
+
});
|
|
369
|
+
}
|
|
370
|
+
processEmitQueue() {
|
|
371
|
+
if (!this.isConnected())
|
|
372
|
+
return;
|
|
373
|
+
while (this.emitQueue.length) {
|
|
374
|
+
const item = this.emitQueue.shift();
|
|
375
|
+
this.createEmitPromise(item.event, item.payload, item.timeoutMs).then(item.resolve).catch(item.reject);
|
|
376
|
+
}
|
|
377
|
+
}
|
|
378
|
+
cleanupAllPending(reason) {
|
|
379
|
+
for (const [, entry] of this.pending) {
|
|
380
|
+
clearTimeout(entry.timer);
|
|
381
|
+
entry.reject(new Error(reason));
|
|
382
|
+
}
|
|
383
|
+
this.pending.clear();
|
|
384
|
+
for (const item of this.emitQueue) {
|
|
385
|
+
item.reject(new Error(reason));
|
|
386
|
+
}
|
|
387
|
+
this.emitQueue = [];
|
|
388
|
+
}
|
|
389
|
+
};
|
|
390
|
+
var socketClient = new SocketClient();
|
|
391
|
+
var client_default = socketClient;
|
|
392
|
+
|
|
393
|
+
// src/plugins/request/index.ts
|
|
394
|
+
async function request(config) {
|
|
395
|
+
if (!config || !config.path) {
|
|
396
|
+
return Promise.reject(new Error("invalid request config"));
|
|
397
|
+
}
|
|
398
|
+
const path = config.path;
|
|
399
|
+
const isSdkApi = path.startsWith("/sdk/") || path.startsWith("sdk/");
|
|
400
|
+
if (isSdkApi) {
|
|
401
|
+
const eventName = path.replace(/^\/?sdk\//, "");
|
|
402
|
+
const timeoutMs2 = typeof config.timeoutMs === "number" ? config.timeoutMs : 1e4;
|
|
403
|
+
if (!client_default.isConnected()) {
|
|
404
|
+
return Promise.reject(new Error("socket not connected"));
|
|
405
|
+
}
|
|
406
|
+
try {
|
|
407
|
+
const res = await client_default.emitWithAck(
|
|
408
|
+
eventName,
|
|
409
|
+
config.data,
|
|
410
|
+
timeoutMs2
|
|
411
|
+
);
|
|
412
|
+
if (res && typeof res === "object" && typeof res.code === "number") {
|
|
413
|
+
return res;
|
|
414
|
+
}
|
|
415
|
+
return { code: 0, message: "", data: res };
|
|
416
|
+
} catch (err) {
|
|
417
|
+
return Promise.reject(err);
|
|
418
|
+
}
|
|
419
|
+
}
|
|
420
|
+
if (!client_default.isConnected()) {
|
|
421
|
+
return Promise.reject(new Error("socket not connected"));
|
|
422
|
+
}
|
|
423
|
+
const timeoutMs = typeof config.timeoutMs === "number" ? config.timeoutMs : 1e4;
|
|
424
|
+
return client_default.request(config.path, config.data, timeoutMs);
|
|
425
|
+
}
|
|
426
|
+
|
|
427
|
+
// src/apis/SdkQueryConversationPostApi.ts
|
|
428
|
+
var postSdkQueryConversationApiRequest = (data) => {
|
|
429
|
+
return request({
|
|
430
|
+
path: "/sdk/queryConversation",
|
|
431
|
+
method: "POST",
|
|
432
|
+
data
|
|
433
|
+
});
|
|
434
|
+
};
|
|
435
|
+
|
|
436
|
+
// src/apis/SdkDeleteAllConversationsPostApi.ts
|
|
437
|
+
var postSdkDeleteAllConversationsApiRequest = (data) => {
|
|
438
|
+
return request({
|
|
439
|
+
path: "/sdk/deleteAllConversations",
|
|
440
|
+
method: "POST",
|
|
441
|
+
data
|
|
442
|
+
});
|
|
443
|
+
};
|
|
444
|
+
|
|
445
|
+
// src/apis/SdkDeleteConversationPostApi.ts
|
|
446
|
+
var postSdkDeleteConversationApiRequest = (data) => {
|
|
447
|
+
return request({
|
|
448
|
+
path: "/sdk/deleteConversation",
|
|
449
|
+
method: "POST",
|
|
450
|
+
data
|
|
451
|
+
});
|
|
452
|
+
};
|
|
453
|
+
|
|
454
|
+
// src/apis/SdkClearConversationTotalUnreadMessageCountPostApi.ts
|
|
455
|
+
var postSdkClearConversationTotalUnreadMessageCountApiRequest = (data) => {
|
|
456
|
+
return request({
|
|
457
|
+
path: "/sdk/clearConversationTotalUnreadMessageCount",
|
|
458
|
+
method: "POST",
|
|
459
|
+
data
|
|
460
|
+
});
|
|
461
|
+
};
|
|
462
|
+
|
|
463
|
+
// src/apis/SdkClearConversationUnreadMessageCountPostApi.ts
|
|
464
|
+
var postSdkClearConversationUnreadMessageCountApiRequest = (data) => {
|
|
465
|
+
return request({
|
|
466
|
+
path: "/sdk/clearConversationUnreadMessageCount",
|
|
467
|
+
method: "POST",
|
|
468
|
+
data
|
|
469
|
+
});
|
|
470
|
+
};
|
|
471
|
+
|
|
472
|
+
// src/sdk/conversation.ts
|
|
473
|
+
async function queryConversation(payload) {
|
|
474
|
+
const response = await postSdkQueryConversationApiRequest(payload);
|
|
475
|
+
return unwrapSdkData(response) ?? [];
|
|
476
|
+
}
|
|
477
|
+
async function deleteAllConversations() {
|
|
478
|
+
const response = await postSdkDeleteAllConversationsApiRequest(
|
|
479
|
+
{ config: true }
|
|
480
|
+
);
|
|
481
|
+
return unwrapSdkResponse(response);
|
|
482
|
+
}
|
|
483
|
+
async function deleteConversation(payload) {
|
|
484
|
+
const response = await postSdkDeleteConversationApiRequest(payload);
|
|
485
|
+
return unwrapSdkResponse(response);
|
|
486
|
+
}
|
|
487
|
+
async function clearConversationTotalUnreadMessageCount() {
|
|
488
|
+
const response = await postSdkClearConversationTotalUnreadMessageCountApiRequest(
|
|
489
|
+
{}
|
|
490
|
+
);
|
|
491
|
+
return unwrapSdkResponse(response);
|
|
492
|
+
}
|
|
493
|
+
async function clearConversationUnreadMessageCount(conversationID, conversationType) {
|
|
494
|
+
const response = await postSdkClearConversationUnreadMessageCountApiRequest(
|
|
495
|
+
{
|
|
496
|
+
conversationID,
|
|
497
|
+
conversationType: String(conversationType)
|
|
498
|
+
}
|
|
499
|
+
);
|
|
500
|
+
return unwrapSdkResponse(response);
|
|
501
|
+
}
|
|
502
|
+
|
|
503
|
+
// src/sdk/initSocket.ts
|
|
504
|
+
async function initSocket() {
|
|
505
|
+
const baseUrl = getSocketUrl();
|
|
506
|
+
if (!client_default.isConnected()) {
|
|
507
|
+
await client_default.connect(baseUrl);
|
|
508
|
+
}
|
|
509
|
+
}
|
|
510
|
+
function isSocketConnected() {
|
|
511
|
+
return client_default.isConnected();
|
|
512
|
+
}
|
|
513
|
+
function on(event, handler) {
|
|
514
|
+
client_default.on(event, handler);
|
|
515
|
+
}
|
|
516
|
+
function off(event, handler) {
|
|
517
|
+
client_default.off(event, handler);
|
|
518
|
+
}
|
|
519
|
+
|
|
520
|
+
// src/apis/SdkLoginPostApi.ts
|
|
521
|
+
var postSdkLoginApiRequest = (data) => {
|
|
522
|
+
return request({
|
|
523
|
+
path: "/sdk/login",
|
|
524
|
+
method: "POST",
|
|
525
|
+
data
|
|
526
|
+
});
|
|
527
|
+
};
|
|
528
|
+
var postSdkLogoutApiRequest = (data) => {
|
|
529
|
+
return request({
|
|
530
|
+
path: "/sdk/logout",
|
|
531
|
+
method: "POST",
|
|
532
|
+
data
|
|
533
|
+
});
|
|
534
|
+
};
|
|
535
|
+
|
|
536
|
+
// src/sdk/loginCore.ts
|
|
537
|
+
async function performLogin(payload, { requestLogin, setSession = setSdkSession, clearSession = clearSdkSession }) {
|
|
538
|
+
try {
|
|
539
|
+
const resp = await requestLogin(payload);
|
|
540
|
+
if (unwrapSdkData(resp)) {
|
|
541
|
+
setSession(payload.token);
|
|
542
|
+
return true;
|
|
543
|
+
}
|
|
544
|
+
} catch (error) {
|
|
545
|
+
clearSession();
|
|
546
|
+
throw error;
|
|
547
|
+
}
|
|
548
|
+
clearSession();
|
|
549
|
+
return false;
|
|
550
|
+
}
|
|
551
|
+
|
|
552
|
+
// src/sdk/login.ts
|
|
553
|
+
async function login(payload) {
|
|
554
|
+
return performLogin(payload, {
|
|
555
|
+
requestLogin: postSdkLoginApiRequest
|
|
556
|
+
});
|
|
557
|
+
}
|
|
558
|
+
registerReconnectLoginHandler((token) => login({ token }));
|
|
559
|
+
async function logout(disconnect = true) {
|
|
560
|
+
let success = false;
|
|
561
|
+
try {
|
|
562
|
+
const resp = await postSdkLogoutApiRequest(
|
|
563
|
+
{}
|
|
564
|
+
);
|
|
565
|
+
let res = JSON.parse(resp);
|
|
566
|
+
const result = unwrapSdkData(res);
|
|
567
|
+
success = Boolean(result) || isSuccessCode(res.code);
|
|
568
|
+
} catch {
|
|
569
|
+
success = false;
|
|
570
|
+
} finally {
|
|
571
|
+
clearSdkSession();
|
|
572
|
+
}
|
|
573
|
+
return success;
|
|
574
|
+
}
|
|
575
|
+
|
|
576
|
+
// src/apis/SdkSendMessagePostApi.ts
|
|
577
|
+
var postSdkSendMessageApiRequest = (data) => {
|
|
578
|
+
return request({
|
|
579
|
+
path: "/sdk/sendMessage",
|
|
580
|
+
method: "POST",
|
|
581
|
+
data
|
|
582
|
+
});
|
|
583
|
+
};
|
|
584
|
+
|
|
585
|
+
// src/apis/SdkSendMediaMessagePostApi.ts
|
|
586
|
+
var postSdkSendMediaMessageApiRequest = (data) => {
|
|
587
|
+
return request({
|
|
588
|
+
path: "/sdk/sendMediaMessage",
|
|
589
|
+
method: "POST",
|
|
590
|
+
data
|
|
591
|
+
});
|
|
592
|
+
};
|
|
593
|
+
|
|
594
|
+
// src/apis/SdkQueryHistoryMessagePostApi.ts
|
|
595
|
+
var postSdkQueryHistoryMessageApiRequest = (data) => {
|
|
596
|
+
return request({
|
|
597
|
+
path: "/sdk/queryHistoryMessage",
|
|
598
|
+
method: "POST",
|
|
599
|
+
data
|
|
600
|
+
});
|
|
601
|
+
};
|
|
602
|
+
|
|
603
|
+
// src/apis/SdkDeleteAllConversationMessagesPostApi.ts
|
|
604
|
+
var postSdkDeleteAllConversationMessagesApiRequest = (data) => {
|
|
605
|
+
return request({
|
|
606
|
+
path: "/sdk/deleteAllConversationMessages",
|
|
607
|
+
method: "POST",
|
|
608
|
+
data
|
|
609
|
+
});
|
|
610
|
+
};
|
|
611
|
+
|
|
612
|
+
// src/apis/SdkDeleteMessagesPostApi.ts
|
|
613
|
+
var postSdkDeleteMessagesApiRequest = (data) => {
|
|
614
|
+
return request({
|
|
615
|
+
path: "/sdk/deleteMessages",
|
|
616
|
+
method: "POST",
|
|
617
|
+
data
|
|
618
|
+
});
|
|
619
|
+
};
|
|
620
|
+
|
|
621
|
+
// src/apis/SdkRevokeMessagePostApi.ts
|
|
622
|
+
var postSdkRevokeMessageApiRequest = (data) => {
|
|
623
|
+
return request({
|
|
624
|
+
path: "/sdk/revokeMessage",
|
|
625
|
+
method: "POST",
|
|
626
|
+
data
|
|
627
|
+
});
|
|
628
|
+
};
|
|
629
|
+
|
|
630
|
+
// helper/index.ts
|
|
631
|
+
function isSameUid(id, uid) {
|
|
632
|
+
return id?.toString() === uid?.toString();
|
|
633
|
+
}
|
|
634
|
+
var getVideoDurationAndFirstFrame = (file) => {
|
|
635
|
+
return new Promise((resolve, reject) => {
|
|
636
|
+
const video = document.createElement("video");
|
|
637
|
+
const canvas = document.createElement("canvas");
|
|
638
|
+
const ctx = canvas.getContext("2d");
|
|
639
|
+
let duration = 0;
|
|
640
|
+
let videoWidth = 0;
|
|
641
|
+
let videoHeight = 0;
|
|
642
|
+
video.preload = "metadata";
|
|
643
|
+
video.muted = true;
|
|
644
|
+
video.playsInline = true;
|
|
645
|
+
video.autoplay = true;
|
|
646
|
+
video.onloadedmetadata = () => {
|
|
647
|
+
canvas.width = video.videoWidth || 640;
|
|
648
|
+
canvas.height = video.videoHeight || 360;
|
|
649
|
+
window.URL.revokeObjectURL(video.src);
|
|
650
|
+
duration = video?.duration;
|
|
651
|
+
videoWidth = video.videoWidth || 640;
|
|
652
|
+
videoHeight = video.videoHeight || 360;
|
|
653
|
+
};
|
|
654
|
+
video.oncanplay = () => {
|
|
655
|
+
video.oncanplay = null;
|
|
656
|
+
video.pause();
|
|
657
|
+
ctx.drawImage(video, 0, 0, canvas.width, canvas.height);
|
|
658
|
+
canvas.toBlob(
|
|
659
|
+
(blob) => {
|
|
660
|
+
if (!blob) {
|
|
661
|
+
reject(new Error("\u622A\u53D6\u7B2C\u4E00\u5E27\u5931\u8D25"));
|
|
662
|
+
return;
|
|
663
|
+
}
|
|
664
|
+
const firstFrameFile = new File(
|
|
665
|
+
[blob],
|
|
666
|
+
`video_first_frame_${Date.now()}.jpg`,
|
|
667
|
+
{ type: "image/jpeg" }
|
|
668
|
+
);
|
|
669
|
+
URL.revokeObjectURL(video.src);
|
|
670
|
+
video.src = "";
|
|
671
|
+
canvas.width = 0;
|
|
672
|
+
canvas.height = 0;
|
|
673
|
+
resolve({
|
|
674
|
+
duration,
|
|
675
|
+
firstFrameFile,
|
|
676
|
+
// 这就是你要的文件流
|
|
677
|
+
videoWidth,
|
|
678
|
+
videoHeight
|
|
679
|
+
});
|
|
680
|
+
},
|
|
681
|
+
"image/jpeg",
|
|
682
|
+
0.9
|
|
683
|
+
// 图片质量 0-1
|
|
684
|
+
);
|
|
685
|
+
};
|
|
686
|
+
video.onerror = () => {
|
|
687
|
+
URL.revokeObjectURL(video.src);
|
|
688
|
+
reject(new Error("\u89C6\u9891\u6587\u4EF6\u635F\u574F\u6216\u683C\u5F0F\u4E0D\u652F\u6301"));
|
|
689
|
+
};
|
|
690
|
+
video.src = URL.createObjectURL(file);
|
|
691
|
+
});
|
|
692
|
+
};
|
|
693
|
+
function getAudioDuration(file) {
|
|
694
|
+
return new Promise((resolve, reject) => {
|
|
695
|
+
const audio = document.createElement("audio");
|
|
696
|
+
audio.preload = "metadata";
|
|
697
|
+
audio.onloadedmetadata = () => {
|
|
698
|
+
const duration = audio.duration;
|
|
699
|
+
URL.revokeObjectURL(audio.src);
|
|
700
|
+
resolve(duration);
|
|
701
|
+
};
|
|
702
|
+
audio.onerror = () => {
|
|
703
|
+
URL.revokeObjectURL(audio.src);
|
|
704
|
+
reject(new Error("\u97F3\u9891\u6587\u4EF6\u65E0\u6CD5\u8BFB\u53D6\u6216\u683C\u5F0F\u4E0D\u652F\u6301"));
|
|
705
|
+
};
|
|
706
|
+
audio.src = URL.createObjectURL(file);
|
|
707
|
+
});
|
|
708
|
+
}
|
|
709
|
+
|
|
710
|
+
// src/apis/SdkDeleteAllMessagePostApi.ts
|
|
711
|
+
var postSdkDeleteAllMessageApiRequest = (data) => {
|
|
712
|
+
return request({
|
|
713
|
+
path: "/sdk/deleteAllMessage",
|
|
714
|
+
method: "POST",
|
|
715
|
+
data
|
|
716
|
+
});
|
|
717
|
+
};
|
|
718
|
+
|
|
719
|
+
// src/sdk/message.ts
|
|
720
|
+
async function getImageSize(file) {
|
|
721
|
+
return new Promise((resolve, reject) => {
|
|
722
|
+
const url = URL.createObjectURL(file);
|
|
723
|
+
const img = new Image();
|
|
724
|
+
img.onload = () => {
|
|
725
|
+
resolve({
|
|
726
|
+
width: img.naturalWidth,
|
|
727
|
+
height: img.naturalHeight
|
|
728
|
+
});
|
|
729
|
+
URL.revokeObjectURL(url);
|
|
730
|
+
};
|
|
731
|
+
img.onerror = () => {
|
|
732
|
+
URL.revokeObjectURL(url);
|
|
733
|
+
reject(new Error("\u56FE\u7247\u6587\u4EF6\u65E0\u6CD5\u8BFB\u53D6\u6216\u683C\u5F0F\u4E0D\u652F\u6301"));
|
|
734
|
+
};
|
|
735
|
+
img.src = url;
|
|
736
|
+
});
|
|
737
|
+
}
|
|
738
|
+
async function uploadSdkFile(file) {
|
|
739
|
+
const formData = new FormData();
|
|
740
|
+
formData.append("file", file);
|
|
741
|
+
const response = await fetch(getUploadUrl(), {
|
|
742
|
+
method: "POST",
|
|
743
|
+
headers: {
|
|
744
|
+
Authorization: getStoredToken()
|
|
745
|
+
},
|
|
746
|
+
body: formData
|
|
747
|
+
});
|
|
748
|
+
if (!response.ok) {
|
|
749
|
+
throw new Error(`file upload failed: ${response.status}`);
|
|
750
|
+
}
|
|
751
|
+
const payload = await response.json();
|
|
752
|
+
if (payload.Code !== 0 && payload.Code !== "0") {
|
|
753
|
+
throw new Error(payload.Message || "file upload failed");
|
|
754
|
+
}
|
|
755
|
+
if (!payload.Result) {
|
|
756
|
+
throw new Error("file upload result is empty");
|
|
757
|
+
}
|
|
758
|
+
return payload.Result;
|
|
759
|
+
}
|
|
760
|
+
async function enrichMediaMessage(message) {
|
|
761
|
+
const file = message.file;
|
|
762
|
+
if (!file) {
|
|
763
|
+
throw new Error("media message file is required");
|
|
764
|
+
}
|
|
765
|
+
const enrichedMessage = {
|
|
766
|
+
...message,
|
|
767
|
+
fileName: file.name || message.fileName || "",
|
|
768
|
+
fileSize: String(file.size)
|
|
769
|
+
};
|
|
770
|
+
if (isSameUid(message.type, "11" /* Image */)) {
|
|
771
|
+
const { width, height } = await getImageSize(file);
|
|
772
|
+
enrichedMessage.thumbnailWidth = String(width);
|
|
773
|
+
enrichedMessage.thumbnailHeight = String(height);
|
|
774
|
+
} else if (isSameUid(message.type, "13" /* Audio */)) {
|
|
775
|
+
const duration = await getAudioDuration(file);
|
|
776
|
+
enrichedMessage.duration = String(duration);
|
|
777
|
+
} else if (isSameUid(message.type, "14" /* Video */)) {
|
|
778
|
+
const res = await getVideoDurationAndFirstFrame(file);
|
|
779
|
+
enrichedMessage.duration = String(res.duration);
|
|
780
|
+
enrichedMessage.thumbnailWidth = String(res.videoWidth);
|
|
781
|
+
enrichedMessage.thumbnailHeight = String(res.videoHeight);
|
|
782
|
+
enrichedMessage.thumbnailDownloadUrl = await uploadSdkFile(res.firstFrameFile);
|
|
783
|
+
}
|
|
784
|
+
const fileDownloadUrl = await uploadSdkFile(file);
|
|
785
|
+
enrichedMessage.fileDownloadUrl = fileDownloadUrl;
|
|
786
|
+
if (isSameUid(message.type, "11" /* Image */)) {
|
|
787
|
+
enrichedMessage.thumbnailDownloadUrl = fileDownloadUrl;
|
|
788
|
+
}
|
|
789
|
+
delete enrichedMessage.file;
|
|
790
|
+
return enrichedMessage;
|
|
791
|
+
}
|
|
792
|
+
async function sendMessage(payload) {
|
|
793
|
+
const response = await postSdkSendMessageApiRequest(payload);
|
|
794
|
+
return unwrapSdkData(response);
|
|
795
|
+
}
|
|
796
|
+
async function sendMediaMessage(payload) {
|
|
797
|
+
const response = await postSdkSendMediaMessageApiRequest({
|
|
798
|
+
...payload,
|
|
799
|
+
message: await enrichMediaMessage(payload.message)
|
|
800
|
+
});
|
|
801
|
+
return unwrapSdkData(response);
|
|
802
|
+
}
|
|
803
|
+
async function queryHistoryMessage(payload) {
|
|
804
|
+
const response = await postSdkQueryHistoryMessageApiRequest(payload);
|
|
805
|
+
return unwrapSdkData(response);
|
|
806
|
+
}
|
|
807
|
+
async function deleteAllConversationMessages() {
|
|
808
|
+
const response = await postSdkDeleteAllConversationMessagesApiRequest(
|
|
809
|
+
{
|
|
810
|
+
config: {
|
|
811
|
+
isAlsoDeleteServerMessage: true
|
|
812
|
+
// 是否同时删除服务器消息,默认为 false
|
|
813
|
+
}
|
|
814
|
+
}
|
|
815
|
+
);
|
|
816
|
+
return unwrapSdkResponse(response);
|
|
817
|
+
}
|
|
818
|
+
async function deleteMessages(conversationID, conversationType, messageList) {
|
|
819
|
+
const response = await postSdkDeleteMessagesApiRequest({
|
|
820
|
+
conversationID: Number(conversationID),
|
|
821
|
+
conversationType: conversationType.toString(),
|
|
822
|
+
messageList: messageList.map((msg) => ({
|
|
823
|
+
messageID: msg.messageID,
|
|
824
|
+
type: Number(msg.type)
|
|
825
|
+
}))
|
|
826
|
+
});
|
|
827
|
+
return unwrapSdkResponse(response);
|
|
828
|
+
}
|
|
829
|
+
async function revokeMessage(message, config) {
|
|
830
|
+
const response = await postSdkRevokeMessageApiRequest({ message, config });
|
|
831
|
+
return unwrapSdkResponse(response);
|
|
832
|
+
}
|
|
833
|
+
async function deleteAllMessage(conversationID, conversationType) {
|
|
834
|
+
const response = await postSdkDeleteAllMessageApiRequest({
|
|
835
|
+
conversationID: Number(conversationID),
|
|
836
|
+
conversationType: conversationType.toString()
|
|
837
|
+
});
|
|
838
|
+
return unwrapSdkResponse(response);
|
|
839
|
+
}
|
|
840
|
+
|
|
841
|
+
// src/apis/SdkQueryGroupMessageReceiptReadMemberListPostApi.ts
|
|
842
|
+
var postSdkQueryGroupMessageReceiptReadMemberListApiRequest = (data) => {
|
|
843
|
+
return request({
|
|
844
|
+
path: "/sdk/queryGroupMessageReceiptReadMemberList",
|
|
845
|
+
method: "POST",
|
|
846
|
+
data
|
|
847
|
+
});
|
|
848
|
+
};
|
|
849
|
+
|
|
850
|
+
// src/apis/SdkQueryGroupMessageReceiptUnreadMemberListPostApi.ts
|
|
851
|
+
var postSdkQueryGroupMessageReceiptUnreadMemberListApiRequest = (data) => {
|
|
852
|
+
return request({
|
|
853
|
+
path: "/sdk/queryGroupMessageReceiptUnreadMemberList",
|
|
854
|
+
method: "POST",
|
|
855
|
+
data
|
|
856
|
+
});
|
|
857
|
+
};
|
|
858
|
+
|
|
859
|
+
// src/apis/SdkQueryMessageReceiptsInfoPostApi.ts
|
|
860
|
+
var postSdkQueryMessageReceiptsInfoApiRequest = (data) => {
|
|
861
|
+
return request({
|
|
862
|
+
path: "/sdk/queryMessageReceiptsInfo",
|
|
863
|
+
method: "POST",
|
|
864
|
+
data
|
|
865
|
+
});
|
|
866
|
+
};
|
|
867
|
+
|
|
868
|
+
// src/apis/SdkSendMessageReceiptsReadPostApi.ts
|
|
869
|
+
var postSdkSendMessageReceiptsReadApiRequest = (data) => {
|
|
870
|
+
return request({
|
|
871
|
+
path: "/sdk/sendMessageReceiptsRead",
|
|
872
|
+
method: "POST",
|
|
873
|
+
data
|
|
874
|
+
});
|
|
875
|
+
};
|
|
876
|
+
|
|
877
|
+
// src/sdk/messageReceipts.ts
|
|
878
|
+
async function sendMessageReceiptsRead(conversationID, conversationType, messageList) {
|
|
879
|
+
const response = await postSdkSendMessageReceiptsReadApiRequest({
|
|
880
|
+
conversationID,
|
|
881
|
+
conversationType: conversationType.toString(),
|
|
882
|
+
messageList
|
|
883
|
+
});
|
|
884
|
+
return unwrapSdkResponse(response);
|
|
885
|
+
}
|
|
886
|
+
async function queryMessageReceiptsInfo(conversationID, conversationType, messageList) {
|
|
887
|
+
const response = await postSdkQueryMessageReceiptsInfoApiRequest({
|
|
888
|
+
conversationID: Number(conversationID),
|
|
889
|
+
conversationType: conversationType.toString(),
|
|
890
|
+
messageList
|
|
891
|
+
});
|
|
892
|
+
return unwrapSdkResponse(response);
|
|
893
|
+
}
|
|
894
|
+
async function queryGroupMessageReceiptUnreadMemberList(groupID, config, message) {
|
|
895
|
+
const response = await postSdkQueryGroupMessageReceiptUnreadMemberListApiRequest({
|
|
896
|
+
groupID,
|
|
897
|
+
config,
|
|
898
|
+
message
|
|
899
|
+
});
|
|
900
|
+
return unwrapSdkResponse(response);
|
|
901
|
+
}
|
|
902
|
+
async function queryGroupMessageReceiptReadMemberList(groupID, config, message) {
|
|
903
|
+
const response = await postSdkQueryGroupMessageReceiptReadMemberListApiRequest({
|
|
904
|
+
groupID,
|
|
905
|
+
config,
|
|
906
|
+
message
|
|
907
|
+
});
|
|
908
|
+
return unwrapSdkResponse(response);
|
|
909
|
+
}
|
|
910
|
+
|
|
911
|
+
// src/sdk/index.ts
|
|
912
|
+
var VanshiSdk = {
|
|
913
|
+
// 创建 ws 实例
|
|
914
|
+
create: initSocket,
|
|
915
|
+
// 退出 SDK 登录并断开 ws 连接
|
|
916
|
+
logout,
|
|
917
|
+
// 判断当前 ws 是否连接
|
|
918
|
+
isConnected: isSocketConnected,
|
|
919
|
+
// 监听推送事件
|
|
920
|
+
on,
|
|
921
|
+
// 解除推送事件监听
|
|
922
|
+
off,
|
|
923
|
+
// 登录 SDK
|
|
924
|
+
login,
|
|
925
|
+
// 查询会话列表
|
|
926
|
+
queryConversation,
|
|
927
|
+
// 删除全部会话列表
|
|
928
|
+
deleteAllConversations,
|
|
929
|
+
// 删除单个会话
|
|
930
|
+
deleteConversation,
|
|
931
|
+
// 清除全部会话未读数
|
|
932
|
+
clearConversationTotalUnreadMessageCount,
|
|
933
|
+
// 清除单个会话未读数
|
|
934
|
+
clearConversationUnreadMessageCount,
|
|
935
|
+
// 查询历史消息
|
|
936
|
+
queryHistoryMessage,
|
|
937
|
+
// 发送文本消息
|
|
938
|
+
sendMessage,
|
|
939
|
+
// 发送媒体消息
|
|
940
|
+
sendMediaMessage,
|
|
941
|
+
// 删除全部会话消息
|
|
942
|
+
deleteAllConversationMessages,
|
|
943
|
+
// 删除指定消息
|
|
944
|
+
deleteMessages,
|
|
945
|
+
// 删除当前会话全部消息
|
|
946
|
+
deleteAllMessage,
|
|
947
|
+
// 撤回消息
|
|
948
|
+
revokeMessage,
|
|
949
|
+
// 发送已读回执
|
|
950
|
+
sendMessageReceiptsRead,
|
|
951
|
+
// 查询一批消息回执信息
|
|
952
|
+
queryMessageReceiptsInfo,
|
|
953
|
+
// 查询群消息未读成员列表。
|
|
954
|
+
queryGroupMessageReceiptUnreadMemberList,
|
|
955
|
+
// 查询群消息已读成员列表。
|
|
956
|
+
queryGroupMessageReceiptReadMemberList
|
|
957
|
+
};
|
|
958
|
+
var sdk_default = VanshiSdk;
|
|
959
|
+
export {
|
|
960
|
+
clearConversationTotalUnreadMessageCount,
|
|
961
|
+
clearConversationUnreadMessageCount,
|
|
962
|
+
initSocket as create,
|
|
963
|
+
sdk_default as default,
|
|
964
|
+
deleteAllConversationMessages,
|
|
965
|
+
deleteAllConversations,
|
|
966
|
+
deleteAllMessage,
|
|
967
|
+
deleteConversation,
|
|
968
|
+
deleteMessages,
|
|
969
|
+
isSocketConnected as isConnected,
|
|
970
|
+
login,
|
|
971
|
+
logout,
|
|
972
|
+
off,
|
|
973
|
+
on,
|
|
974
|
+
queryConversation,
|
|
975
|
+
queryGroupMessageReceiptReadMemberList,
|
|
976
|
+
queryGroupMessageReceiptUnreadMemberList,
|
|
977
|
+
queryHistoryMessage,
|
|
978
|
+
queryMessageReceiptsInfo,
|
|
979
|
+
revokeMessage,
|
|
980
|
+
sendMediaMessage,
|
|
981
|
+
sendMessage,
|
|
982
|
+
sendMessageReceiptsRead
|
|
983
|
+
};
|