polfan-server-js-client 0.1.94 → 0.1.96
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/build/index.js +59 -25
- package/build/index.js.map +1 -1
- package/build/types/state-tracker/MessagesManager.d.ts +1 -1
- package/package.json +47 -47
- package/src/AbstractChatClient.ts +218 -218
- package/src/state-tracker/MessagesManager.ts +30 -16
- package/build/types/types/dist/schemes/AckReport.d.ts +0 -1
- package/build/types/types/dist/schemes/commands/GetAckReports.d.ts +0 -1
- package/build/types/types/dist/schemes/events/AckReports.d.ts +0 -1
- package/src/types/dist/schemes/AckReport.d.ts +0 -7
- package/src/types/dist/schemes/AckReport.js +0 -2
- package/src/types/dist/schemes/commands/GetAckReports.d.ts +0 -4
- package/src/types/dist/schemes/commands/GetAckReports.js +0 -2
- package/src/types/dist/schemes/events/AckReports.d.ts +0 -4
- package/src/types/dist/schemes/events/AckReports.js +0 -2
|
@@ -27,7 +27,7 @@ export declare class MessagesManager {
|
|
|
27
27
|
* @internal
|
|
28
28
|
*/
|
|
29
29
|
_deleteByTopicIds(roomId: string, ...topicIds: string[]): void;
|
|
30
|
-
private
|
|
30
|
+
private createHistoryForNewTopic;
|
|
31
31
|
private handleNewMessage;
|
|
32
32
|
private handleFollowedTopicUpdated;
|
|
33
33
|
private handleTopicFollowed;
|
package/package.json
CHANGED
|
@@ -1,47 +1,47 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "polfan-server-js-client",
|
|
3
|
-
"version": "0.1.
|
|
4
|
-
"description": "JavaScript client library for handling communication with Polfan chat server.",
|
|
5
|
-
"author": "Jarosław Żak",
|
|
6
|
-
"license": "MIT",
|
|
7
|
-
"main": "build/index.js",
|
|
8
|
-
"types": "build/types/index.d.ts",
|
|
9
|
-
"scripts": {
|
|
10
|
-
"start": "webpack serve --config webpack.config.demo.js",
|
|
11
|
-
"build": "webpack && tsc",
|
|
12
|
-
"build:demo": "webpack --config webpack.config.demo.js",
|
|
13
|
-
"test": "jest",
|
|
14
|
-
"coverage": "npm run test -- --coverage",
|
|
15
|
-
"prepare": "npm run build",
|
|
16
|
-
"trypublish": "npm publish || true"
|
|
17
|
-
},
|
|
18
|
-
"devDependencies": {
|
|
19
|
-
"@babel/cli": "^7.20.7",
|
|
20
|
-
"@babel/core": "^7.20.12",
|
|
21
|
-
"@babel/plugin-proposal-class-properties": "^7.16.0",
|
|
22
|
-
"@babel/plugin-transform-typescript": "^7.20.2",
|
|
23
|
-
"@babel/polyfill": "^7.12.1",
|
|
24
|
-
"@babel/preset-env": "^7.20.2",
|
|
25
|
-
"@types/jest": "^29.2.5",
|
|
26
|
-
"@typescript-eslint/eslint-plugin": "^4.33.0",
|
|
27
|
-
"@typescript-eslint/parser": "^4.33.0",
|
|
28
|
-
"babel-eslint": "^10.1.0",
|
|
29
|
-
"babel-loader": "^9.1.2",
|
|
30
|
-
"babel-preset-minify": "^0.5.2",
|
|
31
|
-
"css-loader": "^6.7.3",
|
|
32
|
-
"css-minimizer-webpack-plugin": "^4.2.2",
|
|
33
|
-
"eslint": "^7.32.0",
|
|
34
|
-
"file-loader": "^6.2.0",
|
|
35
|
-
"html-webpack-plugin": "^5.5.0",
|
|
36
|
-
"jest": "^29.3.1",
|
|
37
|
-
"mini-css-extract-plugin": "^2.7.2",
|
|
38
|
-
"style-loader": "^3.3.1",
|
|
39
|
-
"terser-webpack-plugin": "^5.3.5",
|
|
40
|
-
"ts-node": "^10.9.2",
|
|
41
|
-
"typescript": "^4.9.4",
|
|
42
|
-
"url-loader": "^4.1.1",
|
|
43
|
-
"webpack": "^5.75.0",
|
|
44
|
-
"webpack-cli": "^5.0.1",
|
|
45
|
-
"webpack-dev-server": "4.11.1"
|
|
46
|
-
}
|
|
47
|
-
}
|
|
1
|
+
{
|
|
2
|
+
"name": "polfan-server-js-client",
|
|
3
|
+
"version": "0.1.96",
|
|
4
|
+
"description": "JavaScript client library for handling communication with Polfan chat server.",
|
|
5
|
+
"author": "Jarosław Żak",
|
|
6
|
+
"license": "MIT",
|
|
7
|
+
"main": "build/index.js",
|
|
8
|
+
"types": "build/types/index.d.ts",
|
|
9
|
+
"scripts": {
|
|
10
|
+
"start": "webpack serve --config webpack.config.demo.js",
|
|
11
|
+
"build": "webpack && tsc",
|
|
12
|
+
"build:demo": "webpack --config webpack.config.demo.js",
|
|
13
|
+
"test": "jest",
|
|
14
|
+
"coverage": "npm run test -- --coverage",
|
|
15
|
+
"prepare": "npm run build",
|
|
16
|
+
"trypublish": "npm publish || true"
|
|
17
|
+
},
|
|
18
|
+
"devDependencies": {
|
|
19
|
+
"@babel/cli": "^7.20.7",
|
|
20
|
+
"@babel/core": "^7.20.12",
|
|
21
|
+
"@babel/plugin-proposal-class-properties": "^7.16.0",
|
|
22
|
+
"@babel/plugin-transform-typescript": "^7.20.2",
|
|
23
|
+
"@babel/polyfill": "^7.12.1",
|
|
24
|
+
"@babel/preset-env": "^7.20.2",
|
|
25
|
+
"@types/jest": "^29.2.5",
|
|
26
|
+
"@typescript-eslint/eslint-plugin": "^4.33.0",
|
|
27
|
+
"@typescript-eslint/parser": "^4.33.0",
|
|
28
|
+
"babel-eslint": "^10.1.0",
|
|
29
|
+
"babel-loader": "^9.1.2",
|
|
30
|
+
"babel-preset-minify": "^0.5.2",
|
|
31
|
+
"css-loader": "^6.7.3",
|
|
32
|
+
"css-minimizer-webpack-plugin": "^4.2.2",
|
|
33
|
+
"eslint": "^7.32.0",
|
|
34
|
+
"file-loader": "^6.2.0",
|
|
35
|
+
"html-webpack-plugin": "^5.5.0",
|
|
36
|
+
"jest": "^29.3.1",
|
|
37
|
+
"mini-css-extract-plugin": "^2.7.2",
|
|
38
|
+
"style-loader": "^3.3.1",
|
|
39
|
+
"terser-webpack-plugin": "^5.3.5",
|
|
40
|
+
"ts-node": "^10.9.2",
|
|
41
|
+
"typescript": "^4.9.4",
|
|
42
|
+
"url-loader": "^4.1.1",
|
|
43
|
+
"webpack": "^5.75.0",
|
|
44
|
+
"webpack-cli": "^5.0.1",
|
|
45
|
+
"webpack-dev-server": "4.11.1"
|
|
46
|
+
}
|
|
47
|
+
}
|
|
@@ -1,219 +1,219 @@
|
|
|
1
|
-
import {
|
|
2
|
-
Bye,
|
|
3
|
-
GetSession,
|
|
4
|
-
JoinSpace,
|
|
5
|
-
Session,
|
|
6
|
-
SpaceJoined,
|
|
7
|
-
Error as ErrorType,
|
|
8
|
-
SpaceLeft,
|
|
9
|
-
SpaceMemberJoined,
|
|
10
|
-
SpaceMemberLeft,
|
|
11
|
-
SpaceMemberUpdated,
|
|
12
|
-
SpaceDeleted,
|
|
13
|
-
SpaceMembers,
|
|
14
|
-
SpaceRooms,
|
|
15
|
-
NewRole,
|
|
16
|
-
RoomDeleted,
|
|
17
|
-
RoomJoined,
|
|
18
|
-
RoomLeft,
|
|
19
|
-
RoomMemberLeft,
|
|
20
|
-
RoomMemberJoined,
|
|
21
|
-
RoomMembers,
|
|
22
|
-
NewRoom,
|
|
23
|
-
NewTopic,
|
|
24
|
-
TopicDeleted,
|
|
25
|
-
NewMessage,
|
|
26
|
-
GetPermissionOverwrites,
|
|
27
|
-
GetComputedPermissions,
|
|
28
|
-
LeaveSpace,
|
|
29
|
-
CreateSpace,
|
|
30
|
-
DeleteSpace,
|
|
31
|
-
GetSpaceMembers,
|
|
32
|
-
GetSpaceRooms,
|
|
33
|
-
CreateRole,
|
|
34
|
-
DeleteRole,
|
|
35
|
-
AssignRole,
|
|
36
|
-
DeassignRole,
|
|
37
|
-
SetPermissionOverwrites,
|
|
38
|
-
JoinRoom,
|
|
39
|
-
LeaveRoom,
|
|
40
|
-
CreateRoom,
|
|
41
|
-
DeleteRoom,
|
|
42
|
-
GetRoomMembers,
|
|
43
|
-
CreateTopic,
|
|
44
|
-
DeleteTopic,
|
|
45
|
-
CreateMessage,
|
|
46
|
-
Envelope,
|
|
47
|
-
PermissionOverwrites,
|
|
48
|
-
PermissionOverwritesUpdated,
|
|
49
|
-
RoomMemberUpdated,
|
|
50
|
-
UpdateRole,
|
|
51
|
-
RoleUpdated,
|
|
52
|
-
Ack,
|
|
53
|
-
UserUpdated,
|
|
54
|
-
UpdateRoom,
|
|
55
|
-
RoomUpdated,
|
|
56
|
-
UpdateSpace,
|
|
57
|
-
SpaceUpdated,
|
|
58
|
-
PermissionOverwriteTargets,
|
|
59
|
-
GetPermissionOverwriteTargets,
|
|
60
|
-
Owners,
|
|
61
|
-
Ok,
|
|
62
|
-
GetOwners,
|
|
63
|
-
CreateOwner,
|
|
64
|
-
RoleDeleted,
|
|
65
|
-
FollowedTopicUpdated,
|
|
66
|
-
TopicFollowed,
|
|
67
|
-
TopicUnfollowed,
|
|
68
|
-
FollowedTopics,
|
|
69
|
-
FollowTopic,
|
|
70
|
-
UnfollowTopic,
|
|
71
|
-
GetFollowedTopics,
|
|
72
|
-
} from "./types/src/index";
|
|
73
|
-
import {EventTarget} from "./EventTarget";
|
|
74
|
-
|
|
75
|
-
type ArrayOfPromiseResolvers = [(value: any) => void, (reason?: any) => void];
|
|
76
|
-
|
|
77
|
-
export abstract class AbstractChatClient extends EventTarget {
|
|
78
|
-
protected awaitingResponse: Map<string, ArrayOfPromiseResolvers> = new Map<string, ArrayOfPromiseResolvers>();
|
|
79
|
-
protected sentCounter: number = 0;
|
|
80
|
-
|
|
81
|
-
public abstract send<CommandType extends keyof CommandsMap>
|
|
82
|
-
(commandType: CommandType, commandData: CommandsMap[CommandType][0]): Promise<CommandResult<CommandsMap[CommandType][1]>>;
|
|
83
|
-
|
|
84
|
-
public on<EventName extends keyof EventsMap>
|
|
85
|
-
(eventName: EventName | string, handler: (event: EventsMap[EventName]) => void): this {
|
|
86
|
-
return super.on(eventName, handler);
|
|
87
|
-
}
|
|
88
|
-
|
|
89
|
-
public once<EventName extends keyof EventsMap>
|
|
90
|
-
(eventName: EventName, handler: (event: EventsMap[EventName]) => void): this {
|
|
91
|
-
return super.once(eventName, handler);
|
|
92
|
-
}
|
|
93
|
-
|
|
94
|
-
protected createEnvelope<CommandT>(type: string, data: CommandT): Envelope<CommandT> {
|
|
95
|
-
return {
|
|
96
|
-
type, data, ref: (++this.sentCounter).toString()
|
|
97
|
-
};
|
|
98
|
-
}
|
|
99
|
-
|
|
100
|
-
protected createPromiseFromCommandEnvelope
|
|
101
|
-
<CommandT extends keyof CommandsMap>(envelope: Envelope<CommandsMap[CommandT][0]>):
|
|
102
|
-
Promise<CommandResult<CommandsMap[CommandT][1]>> {
|
|
103
|
-
return new Promise((...args) =>
|
|
104
|
-
this.awaitingResponse.set(envelope.ref as string, args));
|
|
105
|
-
}
|
|
106
|
-
|
|
107
|
-
protected handleIncomingEnvelope(envelope: Envelope): void {
|
|
108
|
-
if (!this.awaitingResponse.has(envelope.ref)) {
|
|
109
|
-
return;
|
|
110
|
-
}
|
|
111
|
-
const isError = envelope.type === 'Error';
|
|
112
|
-
this.awaitingResponse.get(envelope.ref)[0]({
|
|
113
|
-
data: isError ? null : envelope.data,
|
|
114
|
-
error: isError ? envelope.data : null,
|
|
115
|
-
} as CommandResult<any>);
|
|
116
|
-
this.awaitingResponse.delete(envelope.ref);
|
|
117
|
-
}
|
|
118
|
-
|
|
119
|
-
protected handleEnvelopeSendError(envelope: Envelope, error: any): void {
|
|
120
|
-
if (!this.awaitingResponse.has(envelope.ref)) {
|
|
121
|
-
return;
|
|
122
|
-
}
|
|
123
|
-
this.awaitingResponse.get(envelope.ref)[0](error);
|
|
124
|
-
this.awaitingResponse.delete(envelope.ref);
|
|
125
|
-
}
|
|
126
|
-
}
|
|
127
|
-
|
|
128
|
-
export type CommandResult<ResultT> = {data?: ResultT, error?: Error};
|
|
129
|
-
|
|
130
|
-
/**
|
|
131
|
-
* Map of incoming events.
|
|
132
|
-
*/
|
|
133
|
-
export type EventsMap = {
|
|
134
|
-
// General Events
|
|
135
|
-
Bye: Bye,
|
|
136
|
-
Ok: Ok,
|
|
137
|
-
Error: ErrorType,
|
|
138
|
-
Session: Session,
|
|
139
|
-
Permissions: Permissions,
|
|
140
|
-
PermissionOverwrites: PermissionOverwrites,
|
|
141
|
-
PermissionOverwritesUpdated: PermissionOverwritesUpdated,
|
|
142
|
-
PermissionOverwriteTargets: PermissionOverwriteTargets,
|
|
143
|
-
Owners: Owners,
|
|
144
|
-
// Space events
|
|
145
|
-
SpaceJoined: SpaceJoined,
|
|
146
|
-
SpaceLeft: SpaceLeft,
|
|
147
|
-
SpaceMemberJoined: SpaceMemberJoined,
|
|
148
|
-
SpaceMemberLeft: SpaceMemberLeft,
|
|
149
|
-
SpaceMemberUpdated: SpaceMemberUpdated,
|
|
150
|
-
SpaceUpdated: SpaceUpdated,
|
|
151
|
-
SpaceDeleted: SpaceDeleted,
|
|
152
|
-
SpaceMembers: SpaceMembers,
|
|
153
|
-
SpaceRooms: SpaceRooms,
|
|
154
|
-
NewRole: NewRole,
|
|
155
|
-
RoleDeleted: RoleDeleted,
|
|
156
|
-
RoleUpdated: RoleUpdated,
|
|
157
|
-
// Room events
|
|
158
|
-
RoomJoined: RoomJoined,
|
|
159
|
-
RoomLeft: RoomLeft,
|
|
160
|
-
RoomMemberJoined: RoomMemberJoined,
|
|
161
|
-
RoomMemberLeft: RoomMemberLeft,
|
|
162
|
-
RoomMemberUpdated: RoomMemberUpdated,
|
|
163
|
-
RoomMembers: RoomMembers,
|
|
164
|
-
NewRoom: NewRoom,
|
|
165
|
-
RoomDeleted: RoomDeleted,
|
|
166
|
-
RoomUpdated: RoomUpdated,
|
|
167
|
-
// Topic events
|
|
168
|
-
NewTopic: NewTopic,
|
|
169
|
-
TopicDeleted: TopicDeleted,
|
|
170
|
-
NewMessage: NewMessage,
|
|
171
|
-
UserUpdated: UserUpdated,
|
|
172
|
-
TopicFollowed: TopicFollowed,
|
|
173
|
-
TopicUnfollowed: TopicUnfollowed,
|
|
174
|
-
FollowedTopics: FollowedTopics,
|
|
175
|
-
FollowedTopicUpdated: FollowedTopicUpdated,
|
|
176
|
-
};
|
|
177
|
-
|
|
178
|
-
/**
|
|
179
|
-
* Map of commands and their corresponding events.
|
|
180
|
-
*/
|
|
181
|
-
export type CommandsMap = {
|
|
182
|
-
// General commands
|
|
183
|
-
GetSession: [GetSession, EventsMap['Session']],
|
|
184
|
-
SetPermissionOverwrites: [SetPermissionOverwrites, EventsMap['PermissionOverwritesUpdated']],
|
|
185
|
-
GetPermissionOverwrites: [GetPermissionOverwrites, EventsMap['PermissionOverwrites']],
|
|
186
|
-
GetComputedPermissions: [GetComputedPermissions, EventsMap['Permissions']],
|
|
187
|
-
GetPermissionOverwriteTargets: [GetPermissionOverwriteTargets, EventsMap['PermissionOverwriteTargets']],
|
|
188
|
-
GetOwners: [GetOwners, EventsMap['Owners']],
|
|
189
|
-
CreateOwner: [CreateOwner, EventsMap['Owners']],
|
|
190
|
-
DeleteOwner: [CreateOwner, EventsMap['Owners']],
|
|
191
|
-
// Space commands
|
|
192
|
-
JoinSpace: [JoinSpace, EventsMap['SpaceJoined']],
|
|
193
|
-
LeaveSpace: [LeaveSpace, EventsMap['SpaceLeft']],
|
|
194
|
-
CreateSpace: [CreateSpace, EventsMap['SpaceJoined']],
|
|
195
|
-
UpdateSpace: [UpdateSpace, EventsMap['SpaceUpdated']],
|
|
196
|
-
DeleteSpace: [DeleteSpace, EventsMap['SpaceDeleted']],
|
|
197
|
-
GetSpaceMembers: [GetSpaceMembers, EventsMap['SpaceMembers']],
|
|
198
|
-
GetSpaceRooms: [GetSpaceRooms, EventsMap['SpaceRooms']],
|
|
199
|
-
CreateRole: [CreateRole, EventsMap['NewRole']],
|
|
200
|
-
DeleteRole: [DeleteRole, EventsMap['RoleDeleted']],
|
|
201
|
-
UpdateRole: [UpdateRole, EventsMap['RoleUpdated']],
|
|
202
|
-
AssignRole: [AssignRole, EventsMap['SpaceMemberUpdated'] | EventsMap['RoomMemberUpdated']],
|
|
203
|
-
DeassignRole: [DeassignRole, EventsMap['SpaceMemberUpdated'] | EventsMap['RoomMemberUpdated']],
|
|
204
|
-
// Room commands
|
|
205
|
-
JoinRoom: [JoinRoom, EventsMap['RoomJoined']],
|
|
206
|
-
LeaveRoom: [LeaveRoom, EventsMap['RoomLeft']],
|
|
207
|
-
CreateRoom: [CreateRoom, EventsMap['NewRoom']],
|
|
208
|
-
DeleteRoom: [DeleteRoom, EventsMap['RoomDeleted']],
|
|
209
|
-
UpdateRoom: [UpdateRoom, EventsMap['RoomUpdated']],
|
|
210
|
-
GetRoomMembers: [GetRoomMembers, EventsMap['RoomMembers']],
|
|
211
|
-
// Topic commands
|
|
212
|
-
CreateTopic: [CreateTopic, EventsMap['NewTopic']],
|
|
213
|
-
DeleteTopic: [DeleteTopic, EventsMap['TopicDeleted']],
|
|
214
|
-
CreateMessage: [CreateMessage, EventsMap['NewMessage']],
|
|
215
|
-
Ack: [Ack, EventsMap['FollowedTopicUpdated'] | EventsMap['Ok']],
|
|
216
|
-
FollowTopic: [FollowTopic, EventsMap['TopicFollowed']],
|
|
217
|
-
UnfollowTopic: [UnfollowTopic, EventsMap['TopicUnfollowed']],
|
|
218
|
-
GetFollowedTopics: [GetFollowedTopics, EventsMap['FollowedTopics']],
|
|
1
|
+
import {
|
|
2
|
+
Bye,
|
|
3
|
+
GetSession,
|
|
4
|
+
JoinSpace,
|
|
5
|
+
Session,
|
|
6
|
+
SpaceJoined,
|
|
7
|
+
Error as ErrorType,
|
|
8
|
+
SpaceLeft,
|
|
9
|
+
SpaceMemberJoined,
|
|
10
|
+
SpaceMemberLeft,
|
|
11
|
+
SpaceMemberUpdated,
|
|
12
|
+
SpaceDeleted,
|
|
13
|
+
SpaceMembers,
|
|
14
|
+
SpaceRooms,
|
|
15
|
+
NewRole,
|
|
16
|
+
RoomDeleted,
|
|
17
|
+
RoomJoined,
|
|
18
|
+
RoomLeft,
|
|
19
|
+
RoomMemberLeft,
|
|
20
|
+
RoomMemberJoined,
|
|
21
|
+
RoomMembers,
|
|
22
|
+
NewRoom,
|
|
23
|
+
NewTopic,
|
|
24
|
+
TopicDeleted,
|
|
25
|
+
NewMessage,
|
|
26
|
+
GetPermissionOverwrites,
|
|
27
|
+
GetComputedPermissions,
|
|
28
|
+
LeaveSpace,
|
|
29
|
+
CreateSpace,
|
|
30
|
+
DeleteSpace,
|
|
31
|
+
GetSpaceMembers,
|
|
32
|
+
GetSpaceRooms,
|
|
33
|
+
CreateRole,
|
|
34
|
+
DeleteRole,
|
|
35
|
+
AssignRole,
|
|
36
|
+
DeassignRole,
|
|
37
|
+
SetPermissionOverwrites,
|
|
38
|
+
JoinRoom,
|
|
39
|
+
LeaveRoom,
|
|
40
|
+
CreateRoom,
|
|
41
|
+
DeleteRoom,
|
|
42
|
+
GetRoomMembers,
|
|
43
|
+
CreateTopic,
|
|
44
|
+
DeleteTopic,
|
|
45
|
+
CreateMessage,
|
|
46
|
+
Envelope,
|
|
47
|
+
PermissionOverwrites,
|
|
48
|
+
PermissionOverwritesUpdated,
|
|
49
|
+
RoomMemberUpdated,
|
|
50
|
+
UpdateRole,
|
|
51
|
+
RoleUpdated,
|
|
52
|
+
Ack,
|
|
53
|
+
UserUpdated,
|
|
54
|
+
UpdateRoom,
|
|
55
|
+
RoomUpdated,
|
|
56
|
+
UpdateSpace,
|
|
57
|
+
SpaceUpdated,
|
|
58
|
+
PermissionOverwriteTargets,
|
|
59
|
+
GetPermissionOverwriteTargets,
|
|
60
|
+
Owners,
|
|
61
|
+
Ok,
|
|
62
|
+
GetOwners,
|
|
63
|
+
CreateOwner,
|
|
64
|
+
RoleDeleted,
|
|
65
|
+
FollowedTopicUpdated,
|
|
66
|
+
TopicFollowed,
|
|
67
|
+
TopicUnfollowed,
|
|
68
|
+
FollowedTopics,
|
|
69
|
+
FollowTopic,
|
|
70
|
+
UnfollowTopic,
|
|
71
|
+
GetFollowedTopics,
|
|
72
|
+
} from "./types/src/index";
|
|
73
|
+
import {EventTarget} from "./EventTarget";
|
|
74
|
+
|
|
75
|
+
type ArrayOfPromiseResolvers = [(value: any) => void, (reason?: any) => void];
|
|
76
|
+
|
|
77
|
+
export abstract class AbstractChatClient extends EventTarget {
|
|
78
|
+
protected awaitingResponse: Map<string, ArrayOfPromiseResolvers> = new Map<string, ArrayOfPromiseResolvers>();
|
|
79
|
+
protected sentCounter: number = 0;
|
|
80
|
+
|
|
81
|
+
public abstract send<CommandType extends keyof CommandsMap>
|
|
82
|
+
(commandType: CommandType, commandData: CommandsMap[CommandType][0]): Promise<CommandResult<CommandsMap[CommandType][1]>>;
|
|
83
|
+
|
|
84
|
+
public on<EventName extends keyof EventsMap>
|
|
85
|
+
(eventName: EventName | string, handler: (event: EventsMap[EventName]) => void): this {
|
|
86
|
+
return super.on(eventName, handler);
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
public once<EventName extends keyof EventsMap>
|
|
90
|
+
(eventName: EventName, handler: (event: EventsMap[EventName]) => void): this {
|
|
91
|
+
return super.once(eventName, handler);
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
protected createEnvelope<CommandT>(type: string, data: CommandT): Envelope<CommandT> {
|
|
95
|
+
return {
|
|
96
|
+
type, data, ref: (++this.sentCounter).toString()
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
protected createPromiseFromCommandEnvelope
|
|
101
|
+
<CommandT extends keyof CommandsMap>(envelope: Envelope<CommandsMap[CommandT][0]>):
|
|
102
|
+
Promise<CommandResult<CommandsMap[CommandT][1]>> {
|
|
103
|
+
return new Promise((...args) =>
|
|
104
|
+
this.awaitingResponse.set(envelope.ref as string, args));
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
protected handleIncomingEnvelope(envelope: Envelope): void {
|
|
108
|
+
if (!this.awaitingResponse.has(envelope.ref)) {
|
|
109
|
+
return;
|
|
110
|
+
}
|
|
111
|
+
const isError = envelope.type === 'Error';
|
|
112
|
+
this.awaitingResponse.get(envelope.ref)[0]({
|
|
113
|
+
data: isError ? null : envelope.data,
|
|
114
|
+
error: isError ? envelope.data : null,
|
|
115
|
+
} as CommandResult<any>);
|
|
116
|
+
this.awaitingResponse.delete(envelope.ref);
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
protected handleEnvelopeSendError(envelope: Envelope, error: any): void {
|
|
120
|
+
if (!this.awaitingResponse.has(envelope.ref)) {
|
|
121
|
+
return;
|
|
122
|
+
}
|
|
123
|
+
this.awaitingResponse.get(envelope.ref)[0](error);
|
|
124
|
+
this.awaitingResponse.delete(envelope.ref);
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
export type CommandResult<ResultT> = {data?: ResultT, error?: Error};
|
|
129
|
+
|
|
130
|
+
/**
|
|
131
|
+
* Map of incoming events.
|
|
132
|
+
*/
|
|
133
|
+
export type EventsMap = {
|
|
134
|
+
// General Events
|
|
135
|
+
Bye: Bye,
|
|
136
|
+
Ok: Ok,
|
|
137
|
+
Error: ErrorType,
|
|
138
|
+
Session: Session,
|
|
139
|
+
Permissions: Permissions,
|
|
140
|
+
PermissionOverwrites: PermissionOverwrites,
|
|
141
|
+
PermissionOverwritesUpdated: PermissionOverwritesUpdated,
|
|
142
|
+
PermissionOverwriteTargets: PermissionOverwriteTargets,
|
|
143
|
+
Owners: Owners,
|
|
144
|
+
// Space events
|
|
145
|
+
SpaceJoined: SpaceJoined,
|
|
146
|
+
SpaceLeft: SpaceLeft,
|
|
147
|
+
SpaceMemberJoined: SpaceMemberJoined,
|
|
148
|
+
SpaceMemberLeft: SpaceMemberLeft,
|
|
149
|
+
SpaceMemberUpdated: SpaceMemberUpdated,
|
|
150
|
+
SpaceUpdated: SpaceUpdated,
|
|
151
|
+
SpaceDeleted: SpaceDeleted,
|
|
152
|
+
SpaceMembers: SpaceMembers,
|
|
153
|
+
SpaceRooms: SpaceRooms,
|
|
154
|
+
NewRole: NewRole,
|
|
155
|
+
RoleDeleted: RoleDeleted,
|
|
156
|
+
RoleUpdated: RoleUpdated,
|
|
157
|
+
// Room events
|
|
158
|
+
RoomJoined: RoomJoined,
|
|
159
|
+
RoomLeft: RoomLeft,
|
|
160
|
+
RoomMemberJoined: RoomMemberJoined,
|
|
161
|
+
RoomMemberLeft: RoomMemberLeft,
|
|
162
|
+
RoomMemberUpdated: RoomMemberUpdated,
|
|
163
|
+
RoomMembers: RoomMembers,
|
|
164
|
+
NewRoom: NewRoom,
|
|
165
|
+
RoomDeleted: RoomDeleted,
|
|
166
|
+
RoomUpdated: RoomUpdated,
|
|
167
|
+
// Topic events
|
|
168
|
+
NewTopic: NewTopic,
|
|
169
|
+
TopicDeleted: TopicDeleted,
|
|
170
|
+
NewMessage: NewMessage,
|
|
171
|
+
UserUpdated: UserUpdated,
|
|
172
|
+
TopicFollowed: TopicFollowed,
|
|
173
|
+
TopicUnfollowed: TopicUnfollowed,
|
|
174
|
+
FollowedTopics: FollowedTopics,
|
|
175
|
+
FollowedTopicUpdated: FollowedTopicUpdated,
|
|
176
|
+
};
|
|
177
|
+
|
|
178
|
+
/**
|
|
179
|
+
* Map of commands and their corresponding events.
|
|
180
|
+
*/
|
|
181
|
+
export type CommandsMap = {
|
|
182
|
+
// General commands
|
|
183
|
+
GetSession: [GetSession, EventsMap['Session']],
|
|
184
|
+
SetPermissionOverwrites: [SetPermissionOverwrites, EventsMap['PermissionOverwritesUpdated']],
|
|
185
|
+
GetPermissionOverwrites: [GetPermissionOverwrites, EventsMap['PermissionOverwrites']],
|
|
186
|
+
GetComputedPermissions: [GetComputedPermissions, EventsMap['Permissions']],
|
|
187
|
+
GetPermissionOverwriteTargets: [GetPermissionOverwriteTargets, EventsMap['PermissionOverwriteTargets']],
|
|
188
|
+
GetOwners: [GetOwners, EventsMap['Owners']],
|
|
189
|
+
CreateOwner: [CreateOwner, EventsMap['Owners']],
|
|
190
|
+
DeleteOwner: [CreateOwner, EventsMap['Owners']],
|
|
191
|
+
// Space commands
|
|
192
|
+
JoinSpace: [JoinSpace, EventsMap['SpaceJoined']],
|
|
193
|
+
LeaveSpace: [LeaveSpace, EventsMap['SpaceLeft']],
|
|
194
|
+
CreateSpace: [CreateSpace, EventsMap['SpaceJoined']],
|
|
195
|
+
UpdateSpace: [UpdateSpace, EventsMap['SpaceUpdated']],
|
|
196
|
+
DeleteSpace: [DeleteSpace, EventsMap['SpaceDeleted']],
|
|
197
|
+
GetSpaceMembers: [GetSpaceMembers, EventsMap['SpaceMembers']],
|
|
198
|
+
GetSpaceRooms: [GetSpaceRooms, EventsMap['SpaceRooms']],
|
|
199
|
+
CreateRole: [CreateRole, EventsMap['NewRole']],
|
|
200
|
+
DeleteRole: [DeleteRole, EventsMap['RoleDeleted']],
|
|
201
|
+
UpdateRole: [UpdateRole, EventsMap['RoleUpdated']],
|
|
202
|
+
AssignRole: [AssignRole, EventsMap['SpaceMemberUpdated'] | EventsMap['RoomMemberUpdated']],
|
|
203
|
+
DeassignRole: [DeassignRole, EventsMap['SpaceMemberUpdated'] | EventsMap['RoomMemberUpdated']],
|
|
204
|
+
// Room commands
|
|
205
|
+
JoinRoom: [JoinRoom, EventsMap['RoomJoined']],
|
|
206
|
+
LeaveRoom: [LeaveRoom, EventsMap['RoomLeft']],
|
|
207
|
+
CreateRoom: [CreateRoom, EventsMap['NewRoom']],
|
|
208
|
+
DeleteRoom: [DeleteRoom, EventsMap['RoomDeleted']],
|
|
209
|
+
UpdateRoom: [UpdateRoom, EventsMap['RoomUpdated']],
|
|
210
|
+
GetRoomMembers: [GetRoomMembers, EventsMap['RoomMembers']],
|
|
211
|
+
// Topic commands
|
|
212
|
+
CreateTopic: [CreateTopic, EventsMap['NewTopic']],
|
|
213
|
+
DeleteTopic: [DeleteTopic, EventsMap['TopicDeleted']],
|
|
214
|
+
CreateMessage: [CreateMessage, EventsMap['NewMessage']],
|
|
215
|
+
Ack: [Ack, EventsMap['FollowedTopicUpdated'] | EventsMap['Ok']],
|
|
216
|
+
FollowTopic: [FollowTopic, EventsMap['TopicFollowed']],
|
|
217
|
+
UnfollowTopic: [UnfollowTopic, EventsMap['TopicUnfollowed']],
|
|
218
|
+
GetFollowedTopics: [GetFollowedTopics, EventsMap['FollowedTopics']],
|
|
219
219
|
}
|
|
@@ -25,16 +25,16 @@ export class MessagesManager {
|
|
|
25
25
|
private readonly followedTopics = new IndexedCollection<string, ObservableIndexedObjectCollection<FollowedTopic>>();
|
|
26
26
|
|
|
27
27
|
public constructor(private tracker: ChatStateTracker) {
|
|
28
|
-
this.tracker.client.on('
|
|
28
|
+
this.tracker.client.on('Session', ev => this.handleSession(ev));
|
|
29
|
+
this.tracker.client.on('RoomJoined', ev => this.handleRoomJoin(ev));
|
|
30
|
+
this.tracker.client.on('NewTopic', ev => this.handleNewTopic(ev));
|
|
29
31
|
this.tracker.client.on('FollowedTopicUpdated', ev => this.handleFollowedTopicUpdated(ev));
|
|
30
32
|
this.tracker.client.on('TopicFollowed', ev => this.handleTopicFollowed(ev));
|
|
31
33
|
this.tracker.client.on('TopicUnfollowed', ev => this.handleTopicUnfollowed(ev));
|
|
34
|
+
this.tracker.client.on('NewMessage', ev => this.handleNewMessage(ev));
|
|
32
35
|
this.tracker.client.on('RoomDeleted', ev => this.handleRoomDeleted(ev));
|
|
33
|
-
this.tracker.client.on('RoomJoined', ev => this.handleRoomJoin(ev));
|
|
34
36
|
this.tracker.client.on('RoomLeft', ev => this.handleRoomLeft(ev));
|
|
35
|
-
this.tracker.client.on('NewTopic', ev => this.handleNewTopic(ev));
|
|
36
37
|
this.tracker.client.on('TopicDeleted', ev => this.handleTopicDeleted(ev));
|
|
37
|
-
this.tracker.client.on('Session', ev => this.handleSession(ev));
|
|
38
38
|
}
|
|
39
39
|
|
|
40
40
|
/**
|
|
@@ -95,7 +95,7 @@ export class MessagesManager {
|
|
|
95
95
|
this.followedTopics.get(roomId)?.delete(...topicIds);
|
|
96
96
|
}
|
|
97
97
|
|
|
98
|
-
private
|
|
98
|
+
private createHistoryForNewTopic(roomId: string, ...newTopics: Topic[]): void {
|
|
99
99
|
for (const newTopic of newTopics) {
|
|
100
100
|
const newTopicCombinedId = getCombinedId({roomId, topicId: newTopic.id});
|
|
101
101
|
|
|
@@ -138,7 +138,7 @@ export class MessagesManager {
|
|
|
138
138
|
|
|
139
139
|
private handleRoomJoin(ev: RoomJoined): void {
|
|
140
140
|
if (ev.room.defaultTopic) {
|
|
141
|
-
this.
|
|
141
|
+
this.createHistoryForNewTopic(ev.room.id, ev.room.defaultTopic)
|
|
142
142
|
}
|
|
143
143
|
}
|
|
144
144
|
|
|
@@ -146,8 +146,21 @@ export class MessagesManager {
|
|
|
146
146
|
this.followedTopics.delete(ev.id);
|
|
147
147
|
}
|
|
148
148
|
|
|
149
|
-
private handleNewTopic(ev: NewTopic): void {
|
|
150
|
-
this.
|
|
149
|
+
private async handleNewTopic(ev: NewTopic): Promise<void> {
|
|
150
|
+
this.createHistoryForNewTopic(ev.roomId, ev.topic);
|
|
151
|
+
|
|
152
|
+
if (this.followedTopics.has(ev.roomId)) {
|
|
153
|
+
// Check if the new topic is followed by user
|
|
154
|
+
// only if client asked for followed topics list before for this room
|
|
155
|
+
const result = await this.tracker.client.send(
|
|
156
|
+
'GetFollowedTopics',
|
|
157
|
+
{location: {roomId: ev.roomId, topicId: ev.topic.id}},
|
|
158
|
+
);
|
|
159
|
+
const followedTopic = result.data.followedTopics[0];
|
|
160
|
+
if (followedTopic) {
|
|
161
|
+
this.followedTopics.get(ev.roomId).set(followedTopic);
|
|
162
|
+
}
|
|
163
|
+
}
|
|
151
164
|
}
|
|
152
165
|
|
|
153
166
|
private handleTopicDeleted(ev: TopicDeleted): void {
|
|
@@ -157,21 +170,22 @@ export class MessagesManager {
|
|
|
157
170
|
private handleSession(ev: Session): void {
|
|
158
171
|
ev.state.rooms.forEach(room => {
|
|
159
172
|
if (room.defaultTopic) {
|
|
160
|
-
this.
|
|
173
|
+
this.createHistoryForNewTopic(room.id, room.defaultTopic);
|
|
161
174
|
}
|
|
162
175
|
});
|
|
163
176
|
}
|
|
164
177
|
|
|
165
178
|
private updateLocallyFollowedTopicOnNewMessage(ev: NewMessage): void {
|
|
166
|
-
const
|
|
179
|
+
const roomFollowedTopics = this.followedTopics.get(ev.location.roomId);
|
|
180
|
+
const followedTopic = roomFollowedTopics.get(ev.location.topicId);
|
|
167
181
|
|
|
168
|
-
if (! followedTopic) {
|
|
169
|
-
//
|
|
182
|
+
if (! roomFollowedTopics || ! followedTopic) {
|
|
183
|
+
// Skip if we don't follow this room or targeted topic
|
|
170
184
|
return;
|
|
171
185
|
}
|
|
172
186
|
|
|
173
187
|
const isMe = ev.message.author.id === this.tracker.me?.id;
|
|
174
|
-
|
|
188
|
+
|
|
175
189
|
let update: Partial<FollowedTopic>;
|
|
176
190
|
|
|
177
191
|
if (isMe) {
|
|
@@ -180,12 +194,12 @@ export class MessagesManager {
|
|
|
180
194
|
} else {
|
|
181
195
|
// ...add 1 otherwise
|
|
182
196
|
update = {
|
|
183
|
-
missed:
|
|
184
|
-
missedMoreThan:
|
|
197
|
+
missed: followedTopic.missed === null ? null : followedTopic.missed + 1,
|
|
198
|
+
missedMoreThan: followedTopic.missedMoreThan === null ? null : followedTopic.missedMoreThan,
|
|
185
199
|
};
|
|
186
200
|
}
|
|
187
201
|
|
|
188
|
-
|
|
202
|
+
roomFollowedTopics.set({...followedTopic, ...update});
|
|
189
203
|
}
|
|
190
204
|
|
|
191
205
|
private setFollowedTopicsArray(followedTopics: FollowedTopic[]): void {
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export const __esModule: boolean;
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export const __esModule: boolean;
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export const __esModule: boolean;
|