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.
@@ -27,7 +27,7 @@ export declare class MessagesManager {
27
27
  * @internal
28
28
  */
29
29
  _deleteByTopicIds(roomId: string, ...topicIds: string[]): void;
30
- private handleNewTopics;
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.94",
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('NewMessage', ev => this.handleNewMessage(ev));
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 handleNewTopics(roomId: string, ...newTopics: Topic[]):void {
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.handleNewTopics(ev.room.id, ev.room.defaultTopic)
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.handleNewTopics(ev.roomId, ev.topic);
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.handleNewTopics(room.id, room.defaultTopic);
173
+ this.createHistoryForNewTopic(room.id, room.defaultTopic);
161
174
  }
162
175
  });
163
176
  }
164
177
 
165
178
  private updateLocallyFollowedTopicOnNewMessage(ev: NewMessage): void {
166
- const followedTopic = this.followedTopics.get(ev.location.roomId);
179
+ const roomFollowedTopics = this.followedTopics.get(ev.location.roomId);
180
+ const followedTopic = roomFollowedTopics.get(ev.location.topicId);
167
181
 
168
- if (! followedTopic) {
169
- // If we don't follow ack reports for this room, skip
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
- const currentFollowedTopic = followedTopic.get(ev.location.topicId);
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: currentFollowedTopic.missed === null ? null : currentFollowedTopic.missed + 1,
184
- missedMoreThan: currentFollowedTopic.missedMoreThan === null ? null : currentFollowedTopic.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
- followedTopic.set({...currentFollowedTopic, ...update});
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;