@typexim/web-sdk 0.0.7 → 0.0.8

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.
Files changed (45) hide show
  1. package/README.md +2 -1
  2. package/dist/types/enums/sdk.d.ts +0 -1
  3. package/dist/types/modules/ChatSDK.d.ts +3 -2
  4. package/dist/types/modules/ReConnectWebsocket.d.ts +3 -0
  5. package/dist/types/modules/TabSessionCoordinator.d.ts +9 -5
  6. package/dist/types/utils/websocket.d.ts +4 -0
  7. package/dist/web-sdk.esm.js +1 -1
  8. package/dist/web-sdk.js +1 -1
  9. package/dist-test/enums/business.js +139 -0
  10. package/dist-test/enums/index.js +2 -0
  11. package/dist-test/enums/sdk.js +24 -0
  12. package/dist-test/events.js +50 -0
  13. package/dist-test/index.js +26 -0
  14. package/dist-test/interfaces/business.js +1 -0
  15. package/dist-test/interfaces/index.js +3 -0
  16. package/dist-test/interfaces/pushMessage.js +1 -0
  17. package/dist-test/interfaces/sdk/api.js +1 -0
  18. package/dist-test/interfaces/sdk/common.js +1 -0
  19. package/dist-test/interfaces/sdk/index.js +2 -0
  20. package/dist-test/modules/Base.js +70 -0
  21. package/dist-test/modules/BusinessWebsocket.js +68 -0
  22. package/dist-test/modules/ChatSDK.js +698 -0
  23. package/dist-test/modules/FeedCache.js +211 -0
  24. package/dist-test/modules/HttpClient.js +104 -0
  25. package/dist-test/modules/Logger.js +73 -0
  26. package/dist-test/modules/PushMessageProcessor.js +437 -0
  27. package/dist-test/modules/ReConnectWebsocket.js +223 -0
  28. package/dist-test/modules/Storage.js +27 -0
  29. package/dist-test/modules/TabSessionCoordinator.js +289 -0
  30. package/dist-test/modules/Version.js +20 -0
  31. package/dist-test/utils/date.js +4 -0
  32. package/dist-test/utils/http.js +13 -0
  33. package/dist-test/utils/makeSign.js +79 -0
  34. package/dist-test/utils/message.js +146 -0
  35. package/dist-test/utils/misc.js +13 -0
  36. package/dist-test/utils/promise.js +10 -0
  37. package/dist-test/utils/sleep.js +3 -0
  38. package/dist-test/utils/websocket.js +24 -0
  39. package/package.json +1 -1
  40. package/test/{chat-sdk-restore-login.test.mjs → chat-sdk-independent-login.test.mjs} +50 -62
  41. package/test/chat-sdk-session-restore.test.mjs +331 -0
  42. package/test/tab-session-coordinator.test.mjs +65 -64
  43. package/test/websocket-url.test.mjs +24 -0
  44. package/dist/types/modules/SingletonLock.d.ts +0 -12
  45. package/test/singleton-lock.test.mjs +0 -75
@@ -0,0 +1,139 @@
1
+ export var Bool;
2
+ (function (Bool) {
3
+ Bool[Bool["yes"] = 1] = "yes";
4
+ Bool[Bool["no"] = 0] = "no";
5
+ })(Bool || (Bool = {}));
6
+ export var PushMessageType;
7
+ (function (PushMessageType) {
8
+ PushMessageType[PushMessageType["CREATE_FEED"] = 0] = "CREATE_FEED";
9
+ PushMessageType[PushMessageType["UPDATE_FEED"] = 1] = "UPDATE_FEED";
10
+ PushMessageType[PushMessageType["ADD_MESSAGE"] = 2] = "ADD_MESSAGE";
11
+ PushMessageType[PushMessageType["UPDATE_MESSAGE"] = 3] = "UPDATE_MESSAGE";
12
+ PushMessageType[PushMessageType["UPDATE_USER_DATA"] = 4] = "UPDATE_USER_DATA";
13
+ PushMessageType[PushMessageType["USER_LOGIN"] = 5] = "USER_LOGIN";
14
+ PushMessageType[PushMessageType["READ_MESSAGE"] = 6] = "READ_MESSAGE";
15
+ PushMessageType[PushMessageType["PONG_MESSAGE"] = 8] = "PONG_MESSAGE";
16
+ PushMessageType[PushMessageType["DELETE_MESSAGE"] = 9] = "DELETE_MESSAGE";
17
+ PushMessageType[PushMessageType["UPDATE_GROUP"] = 12] = "UPDATE_GROUP";
18
+ PushMessageType[PushMessageType["DELETE_GROUP"] = 13] = "DELETE_GROUP";
19
+ PushMessageType[PushMessageType["UPDATE_LOGIN_USER"] = 17] = "UPDATE_LOGIN_USER";
20
+ // ADD_MESSAGE_REACTION = 18,
21
+ PushMessageType[PushMessageType["UPDATE_MESSAGE_REACTION"] = 19] = "UPDATE_MESSAGE_REACTION";
22
+ // DEL_MESSAGE_REACTION = 20,
23
+ PushMessageType[PushMessageType["ADD_GROUP_MEMBER"] = 21] = "ADD_GROUP_MEMBER";
24
+ PushMessageType[PushMessageType["DEL_GROUP_MEMBER"] = 22] = "DEL_GROUP_MEMBER";
25
+ PushMessageType[PushMessageType["ADD_CONTACTS"] = 23] = "ADD_CONTACTS";
26
+ PushMessageType[PushMessageType["UPDATE_CONTACTS"] = 24] = "UPDATE_CONTACTS";
27
+ PushMessageType[PushMessageType["DEL_CONTACTS"] = 25] = "DEL_CONTACTS";
28
+ PushMessageType[PushMessageType["BLOCK_USER"] = 26] = "BLOCK_USER";
29
+ PushMessageType[PushMessageType["DEVICE_CODE"] = 27] = "DEVICE_CODE";
30
+ PushMessageType[PushMessageType["MSG_OPEN_CLOCK"] = 28] = "MSG_OPEN_CLOCK";
31
+ PushMessageType[PushMessageType["DELETE_SECRET_CHAT"] = 29] = "DELETE_SECRET_CHAT";
32
+ PushMessageType[PushMessageType["DELETE_FEED"] = 30] = "DELETE_FEED";
33
+ PushMessageType[PushMessageType["FAVORITE_UPDATE"] = 31] = "FAVORITE_UPDATE";
34
+ PushMessageType[PushMessageType["STICKERS_UPDATE"] = 32] = "STICKERS_UPDATE";
35
+ PushMessageType[PushMessageType["CUSTOM_STICKERS_UPDATE"] = 33] = "CUSTOM_STICKERS_UPDATE";
36
+ PushMessageType[PushMessageType["MANAGE_DEVICE_UPDATE"] = 34] = "MANAGE_DEVICE_UPDATE";
37
+ PushMessageType[PushMessageType["MASS_MESSAGE_UPDATE"] = 35] = "MASS_MESSAGE_UPDATE";
38
+ PushMessageType[PushMessageType["CHAT_WALLPAPER_DELETE"] = 36] = "CHAT_WALLPAPER_DELETE";
39
+ PushMessageType[PushMessageType["CHAT_WALLPAPER_ADD"] = 37] = "CHAT_WALLPAPER_ADD";
40
+ PushMessageType[PushMessageType["CONTACT_REQUEST"] = 40] = "CONTACT_REQUEST";
41
+ PushMessageType[PushMessageType["USER_PREFERENCE_CHANGE"] = 38] = "USER_PREFERENCE_CHANGE";
42
+ // Chat_PREFERENCE_CHANGE = 39,
43
+ PushMessageType[PushMessageType["UPDATE_GROUP_PIN"] = 41] = "UPDATE_GROUP_PIN";
44
+ PushMessageType[PushMessageType["RTC_CANCEL"] = 46] = "RTC_CANCEL";
45
+ PushMessageType[PushMessageType["ADD_FEED_FOLDER"] = 43] = "ADD_FEED_FOLDER";
46
+ PushMessageType[PushMessageType["UPDATE_FEED_FOLDER"] = 44] = "UPDATE_FEED_FOLDER";
47
+ PushMessageType[PushMessageType["UPDATE_FOLDER_FEED_LIST"] = 47] = "UPDATE_FOLDER_FEED_LIST";
48
+ PushMessageType[PushMessageType["DELETE_FEED_FOLDER"] = 45] = "DELETE_FEED_FOLDER";
49
+ PushMessageType[PushMessageType["UPDATE_CHATTER"] = 42] = "UPDATE_CHATTER";
50
+ PushMessageType[PushMessageType["PAPER_KEY"] = 48] = "PAPER_KEY";
51
+ PushMessageType[PushMessageType["PAPER_KEY_LOG"] = 49] = "PAPER_KEY_LOG";
52
+ PushMessageType[PushMessageType["USER_LOGIN_SCAN"] = 50] = "USER_LOGIN_SCAN";
53
+ PushMessageType[PushMessageType["RTC_RINGING"] = 51] = "RTC_RINGING";
54
+ PushMessageType[PushMessageType["ON_UPDATE_PRIVATE_SETTING"] = 52] = "ON_UPDATE_PRIVATE_SETTING";
55
+ PushMessageType[PushMessageType["ON_DELETE_PRIVATE_SETTING"] = 53] = "ON_DELETE_PRIVATE_SETTING";
56
+ PushMessageType[PushMessageType["ON_UPDATE_LOGIN_PRIVATE_SETTING"] = 54] = "ON_UPDATE_LOGIN_PRIVATE_SETTING";
57
+ PushMessageType[PushMessageType["PUSH_LIVE_MESSAGE"] = 56] = "PUSH_LIVE_MESSAGE";
58
+ PushMessageType[PushMessageType["PUSH_SYSTEM_NOTICE"] = 58] = "PUSH_SYSTEM_NOTICE";
59
+ PushMessageType[PushMessageType["BIG_PACKAGE_PUSH"] = 126] = "BIG_PACKAGE_PUSH";
60
+ PushMessageType[PushMessageType["KICK_OUT_DEVICE"] = 127] = "KICK_OUT_DEVICE";
61
+ PushMessageType[PushMessageType["CLEAR_HISTORY"] = 128] = "CLEAR_HISTORY";
62
+ PushMessageType[PushMessageType["CLEAR_DATA"] = 255] = "CLEAR_DATA";
63
+ })(PushMessageType || (PushMessageType = {}));
64
+ export var ChatType;
65
+ (function (ChatType) {
66
+ /**
67
+ * 单聊
68
+ */
69
+ ChatType[ChatType["singleChat"] = 1] = "singleChat";
70
+ /**
71
+ * 群聊
72
+ */
73
+ ChatType[ChatType["groupChat"] = 2] = "groupChat";
74
+ })(ChatType || (ChatType = {}));
75
+ export var FeedType;
76
+ (function (FeedType) {
77
+ /**
78
+ * 常规
79
+ */
80
+ FeedType[FeedType["normal"] = 0] = "normal";
81
+ /**
82
+ * 消息串
83
+ */
84
+ FeedType[FeedType["thread"] = 1] = "thread";
85
+ })(FeedType || (FeedType = {}));
86
+ export var MessageKind;
87
+ (function (MessageKind) {
88
+ MessageKind[MessageKind["text"] = 0] = "text";
89
+ MessageKind[MessageKind["system"] = 1] = "system";
90
+ })(MessageKind || (MessageKind = {}));
91
+ export var MessageType;
92
+ (function (MessageType) {
93
+ MessageType[MessageType["text"] = 0] = "text";
94
+ MessageType[MessageType["image"] = 1] = "image";
95
+ MessageType[MessageType["card"] = 2] = "card";
96
+ MessageType[MessageType["audio"] = 3] = "audio";
97
+ MessageType[MessageType["video"] = 4] = "video";
98
+ MessageType[MessageType["file"] = 5] = "file";
99
+ MessageType[MessageType["mergeForward"] = 6] = "mergeForward";
100
+ MessageType[MessageType["sticker"] = 7] = "sticker";
101
+ MessageType[MessageType["richText"] = 8] = "richText";
102
+ MessageType[MessageType["custom"] = 9] = "custom";
103
+ })(MessageType || (MessageType = {}));
104
+ /** 群成员角色 */
105
+ export var GroupRole;
106
+ (function (GroupRole) {
107
+ GroupRole[GroupRole["Owner"] = 1] = "Owner";
108
+ GroupRole[GroupRole["Admin"] = 2] = "Admin";
109
+ GroupRole[GroupRole["Common"] = 3] = "Common";
110
+ GroupRole[GroupRole["Bot"] = 4] = "Bot";
111
+ })(GroupRole || (GroupRole = {}));
112
+ export var MessageOperation;
113
+ (function (MessageOperation) {
114
+ /**
115
+ * 正常
116
+ */
117
+ MessageOperation[MessageOperation["normal"] = 0] = "normal";
118
+ /**
119
+ * 撤回
120
+ */
121
+ MessageOperation[MessageOperation["recall"] = 1] = "recall";
122
+ /**
123
+ * 销毁
124
+ */
125
+ MessageOperation[MessageOperation["destroy"] = 2] = "destroy";
126
+ /**
127
+ * 编辑
128
+ */
129
+ MessageOperation[MessageOperation["edit"] = 3] = "edit";
130
+ /**
131
+ * thread主消息删除
132
+ */
133
+ MessageOperation[MessageOperation["main_delete"] = 4] = "main_delete";
134
+ })(MessageOperation || (MessageOperation = {}));
135
+ // 需要鉴权才能访问的域名
136
+ export const RESOURCE_AUTH_DOMAINS = [
137
+ 'api-coco.typex.im', // 线上
138
+ 'api-tx.typex-test.cn', // 测试
139
+ ];
@@ -0,0 +1,2 @@
1
+ export * from './business.js';
2
+ export * from './sdk.js';
@@ -0,0 +1,24 @@
1
+ export var LogLevel;
2
+ (function (LogLevel) {
3
+ LogLevel["error"] = "ERROR";
4
+ LogLevel["warning"] = "WARNING";
5
+ LogLevel["info"] = "INFO";
6
+ })(LogLevel || (LogLevel = {}));
7
+ export var HttpClientResponseCode;
8
+ (function (HttpClientResponseCode) {
9
+ HttpClientResponseCode[HttpClientResponseCode["SDK_ERROR"] = -10000] = "SDK_ERROR";
10
+ HttpClientResponseCode[HttpClientResponseCode["NETWORK_ERROR"] = -9999] = "NETWORK_ERROR";
11
+ HttpClientResponseCode[HttpClientResponseCode["MAKE_SIGN_FAIL"] = -9998] = "MAKE_SIGN_FAIL";
12
+ HttpClientResponseCode[HttpClientResponseCode["SUCCESS"] = 0] = "SUCCESS";
13
+ })(HttpClientResponseCode || (HttpClientResponseCode = {}));
14
+ export var RequestDirection;
15
+ (function (RequestDirection) {
16
+ /**
17
+ * 向上请求数据
18
+ */
19
+ RequestDirection[RequestDirection["up"] = 0] = "up";
20
+ /**
21
+ * 向下请求数据
22
+ */
23
+ RequestDirection[RequestDirection["down"] = 1] = "down";
24
+ })(RequestDirection || (RequestDirection = {}));
@@ -0,0 +1,50 @@
1
+ export const CHAT_SDK_EVENT = {
2
+ /**
3
+ * sdk用户已登录,可以调用发送消息等API
4
+ */
5
+ SDK_READY: 'sdkReady',
6
+ /**
7
+ * sdk用户已登出,无法调用发送消息等API,需要重新登录
8
+ */
9
+ SDK_NOT_READY: 'sdkNotReady',
10
+ /**
11
+ * feed列表有更新
12
+ */
13
+ FEED_LIST_UPDATED: 'feedListUpdated',
14
+ /**
15
+ * sdk收到新message
16
+ */
17
+ MESSAGE_RECEIVED: 'messageReceived',
18
+ /**
19
+ * message撤回
20
+ */
21
+ MESSAGE_RECALLED: 'messageRecalled',
22
+ /**
23
+ * message编辑
24
+ */
25
+ MESSAGE_EDITED: 'messageEdited',
26
+ /**
27
+ * message销毁
28
+ */
29
+ MESSAGE_DESTROYED: 'messageDestroyed',
30
+ /**
31
+ * message回复表情更新
32
+ */
33
+ MESSAGE_REACTION_UPDATED: 'messageReactionUpdated',
34
+ /**
35
+ * sdk收到message已读回执
36
+ */
37
+ MESSAGE_RECEIPT_RECEIVED: 'messageReceiptReceived',
38
+ /***
39
+ * sdk收到阅后即焚消息开始倒计时
40
+ */
41
+ MESSAGE_OPEN_CLOCK: 'messageOpenClock',
42
+ /**
43
+ * sdk收到直播间message
44
+ */
45
+ ROOM_MESSAGE_RECEIVED: 'roomMessageReceived',
46
+ /**
47
+ * sdk收到系统在线通知(通过OpenAPI的/open/message/notice接口触发)
48
+ */
49
+ SYSTEM_NOTICE_RECEIVED: 'systemNoticeReceived',
50
+ };
@@ -0,0 +1,26 @@
1
+ import * as enums from './enums/index.js';
2
+ import * as events from './events.js';
3
+ import * as interfaces from './interfaces/index.js';
4
+ import ChatSDK from './modules/ChatSDK.js';
5
+ import { parseCustomMessageContent, parseSystemMessageContent, parseTextMessageContent, } from './utils/message.js';
6
+ const instanceMap = new Map();
7
+ /**
8
+ * 创建一个ChatSDK实例,对于同一个instanceId只会返回同一份实例
9
+ * @param instanceId ChatSDK实例唯一id
10
+ * @param config ChatSDK配置
11
+ * @returns
12
+ */
13
+ export function create(instanceId, config) {
14
+ let instance = instanceMap.get(instanceId);
15
+ if (instance === undefined) {
16
+ instance = new ChatSDK(config);
17
+ instanceMap.set(instanceId, instance);
18
+ }
19
+ return instance;
20
+ }
21
+ export const utils = {
22
+ parseSystemMessageContent,
23
+ parseTextMessageContent,
24
+ parseCustomMessageContent,
25
+ };
26
+ export { ChatSDK, enums, events, interfaces };
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,3 @@
1
+ export * from './business.js';
2
+ export * from './pushMessage.js';
3
+ export * from './sdk/index.js';
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,2 @@
1
+ export * from './api.js';
2
+ export * from './common.js';
@@ -0,0 +1,70 @@
1
+ export default class Base {
2
+ constructor(all) {
3
+ // A Map of event names to registered handler functions.
4
+ Object.defineProperty(this, "all", {
5
+ enumerable: true,
6
+ configurable: true,
7
+ writable: true,
8
+ value: void 0
9
+ });
10
+ this.all = all || new Map();
11
+ }
12
+ on(type, handler) {
13
+ const handlers = this.all.get(type);
14
+ if (handlers) {
15
+ handlers.push(handler);
16
+ }
17
+ else {
18
+ this.all.set(type, [handler]);
19
+ }
20
+ return () => {
21
+ if (type === '*') {
22
+ this.off(type, handler);
23
+ }
24
+ else {
25
+ this.off(type, handler);
26
+ }
27
+ };
28
+ }
29
+ off(type, handler) {
30
+ const handlers = this.all.get(type);
31
+ if (handlers) {
32
+ if (handler) {
33
+ handlers.splice(handlers.indexOf(handler) >>> 0, 1);
34
+ }
35
+ else {
36
+ this.all.set(type, []);
37
+ }
38
+ }
39
+ }
40
+ emit(type, evt) {
41
+ let handlers = this.all.get(type);
42
+ if (handlers) {
43
+ handlers.slice().map((handler) => {
44
+ handler(evt);
45
+ });
46
+ }
47
+ handlers = this.all.get('*');
48
+ if (handlers) {
49
+ handlers.slice().map((handler) => {
50
+ handler(type, evt);
51
+ });
52
+ }
53
+ }
54
+ once(type, handler) {
55
+ if (type === '*') {
56
+ const onceHandler = ((type, event) => {
57
+ handler(type, event);
58
+ this.off('*', onceHandler);
59
+ });
60
+ this.on(type, onceHandler);
61
+ }
62
+ else {
63
+ const onceHandler = ((event) => {
64
+ handler(event);
65
+ this.off(type, onceHandler);
66
+ });
67
+ this.on(type, onceHandler);
68
+ }
69
+ }
70
+ }
@@ -0,0 +1,68 @@
1
+ import Base from './Base.js';
2
+ import ReConnectWebsocket from './ReConnectWebsocket.js';
3
+ export default class BusinessWebsocket extends Base {
4
+ constructor(config) {
5
+ super();
6
+ Object.defineProperty(this, "host", {
7
+ enumerable: true,
8
+ configurable: true,
9
+ writable: true,
10
+ value: void 0
11
+ });
12
+ Object.defineProperty(this, "context", {
13
+ enumerable: true,
14
+ configurable: true,
15
+ writable: true,
16
+ value: void 0
17
+ });
18
+ Object.defineProperty(this, "logger", {
19
+ enumerable: true,
20
+ configurable: true,
21
+ writable: true,
22
+ value: void 0
23
+ });
24
+ Object.defineProperty(this, "ws", {
25
+ enumerable: true,
26
+ configurable: true,
27
+ writable: true,
28
+ value: void 0
29
+ });
30
+ this.host = config.host;
31
+ this.context = config.context;
32
+ this.logger = config.logger;
33
+ this.ws = null;
34
+ }
35
+ connect() {
36
+ if (this.context.loginUser === null) {
37
+ this.logger.warn('BusinessWebsocket try connect but not login');
38
+ return;
39
+ }
40
+ // Keep exactly one push socket: replace any existing instance.
41
+ if (this.ws) {
42
+ this.ws.destroy();
43
+ this.ws = null;
44
+ }
45
+ this.ws = new ReConnectWebsocket({
46
+ url: `${this.host}/ws`,
47
+ token: this.context.loginUser.sessionId,
48
+ // Shared across tabs via localStorage deviceId.
49
+ wsRoute: this.context.deviceId,
50
+ logger: this.logger,
51
+ });
52
+ this.ws.on('message', (message) => {
53
+ this.emit('message', message);
54
+ });
55
+ this.ws.on('kickoff', () => {
56
+ this.emit('kickoff');
57
+ });
58
+ }
59
+ disconnect() {
60
+ if (this.ws) {
61
+ this.ws.destroy();
62
+ this.ws = null;
63
+ }
64
+ else {
65
+ this.logger.info('BusinessWebsocket already disconnected');
66
+ }
67
+ }
68
+ }