polfan-server-js-client 0.2.49 → 0.2.50

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.
@@ -1,4 +1,4 @@
1
- import { Bye, GetSession, JoinSpace, Session, SpaceJoined, Error as ErrorType, SpaceLeft, SpaceMemberJoined, SpaceMemberLeft, SpaceMemberUpdated, SpaceDeleted, SpaceMembers, SpaceRooms, NewRole, RoomDeleted, RoomJoined, RoomLeft, RoomMemberLeft, RoomMemberJoined, RoomMembers, NewRoom, NewTopic, TopicDeleted, NewMessage, GetPermissionOverwrites, GetComputedPermissions, LeaveSpace, CreateSpace, DeleteSpace, GetSpaceMembers, GetSpaceRooms, CreateRole, DeleteRole, AssignRole, DeassignRole, SetPermissionOverwrites, JoinRoom, LeaveRoom, CreateRoom, DeleteRoom, GetRoomMembers, CreateTopic, DeleteTopic, CreateMessage, Envelope, PermissionOverwrites, PermissionOverwritesUpdated, RoomMemberUpdated, UpdateRole, RoleUpdated, Ack, UserUpdated, UpdateRoom, RoomUpdated, UpdateSpace, SpaceUpdated, PermissionOverwriteTargets, GetPermissionOverwriteTargets, Owners, Ok, GetOwners, CreateOwner, RoleDeleted, FollowedTopicUpdated, TopicFollowed, TopicUnfollowed, FollowedTopics, FollowTopic, UnfollowTopic, GetFollowedTopics, Messages, GetMessages, Topics, GetTopics, TopicUpdated, UpdateTopic, GetDiscoverableSpaces, DiscoverableSpaces, CreateEmoticon, DeleteEmoticon, GetEmoticons, Emoticons, EmoticonDeleted, NewEmoticon, Bans, GetBans, Ban, Unban, Kick, ClientData, GetClientData, SetClientData, GetRoomSummary, GetSpaceSummary, RoomSummaryEvent, SpaceSummaryEvent, SetCustomNick, Relationships, RelationshipDeleted, NewRelationship, DeleteRelationship, CreateRelationship } from "./types/src/index";
1
+ import { Bye, GetSession, JoinSpace, Session, SpaceJoined, Error as ErrorType, SpaceLeft, SpaceMemberJoined, SpaceMemberLeft, SpaceMemberUpdated, SpaceDeleted, SpaceMembers, SpaceRooms, NewRole, RoomDeleted, RoomJoined, RoomLeft, RoomMemberLeft, RoomMemberJoined, RoomMembers, NewRoom, NewTopic, TopicDeleted, NewMessage, GetPermissionOverwrites, GetComputedPermissions, LeaveSpace, CreateSpace, DeleteSpace, GetSpaceMembers, GetSpaceRooms, CreateRole, DeleteRole, AssignRole, DeassignRole, SetPermissionOverwrites, JoinRoom, LeaveRoom, CreateRoom, DeleteRoom, GetRoomMembers, CreateTopic, DeleteTopic, CreateMessage, Envelope, PermissionOverwrites, PermissionOverwritesUpdated, RoomMemberUpdated, UpdateRole, RoleUpdated, Ack, UserUpdated, UpdateRoom, RoomUpdated, UpdateSpace, SpaceUpdated, PermissionOverwriteTargets, GetPermissionOverwriteTargets, Owners, Ok, GetOwners, CreateOwner, RoleDeleted, FollowedTopicUpdated, TopicFollowed, TopicUnfollowed, FollowedTopics, FollowTopic, UnfollowTopic, GetFollowedTopics, Messages, GetMessages, Topics, GetTopics, TopicUpdated, UpdateTopic, GetDiscoverableSpaces, DiscoverableSpaces, CreateEmoticon, DeleteEmoticon, GetEmoticons, Emoticons, EmoticonDeleted, NewEmoticon, Bans, GetBans, Ban, Unban, Kick, ClientData, GetClientData, SetClientData, GetRoomSummary, GetSpaceSummary, RoomSummaryEvent, SpaceSummaryEvent, SetCustomNick, Relationships, RelationshipDeleted, NewRelationship, DeleteRelationship, CreateRelationship, RoomSummaryUpdated } from "./types/src/index";
2
2
  import { EventTarget } from "./EventTarget";
3
3
  import { GetRelationships } from "./types/src/schemes/commands/GetRelationships";
4
4
  type ArrayOfPromiseResolvers = [(value: any) => void, (reason?: any) => void];
@@ -62,6 +62,7 @@ export type EventsMap = {
62
62
  RoomDeleted: RoomDeleted;
63
63
  RoomUpdated: RoomUpdated;
64
64
  RoomSummaryEvent: RoomSummaryEvent;
65
+ RoomSummaryUpdated: RoomSummaryUpdated;
65
66
  NewTopic: NewTopic;
66
67
  TopicDeleted: TopicDeleted;
67
68
  NewMessage: NewMessage;
@@ -5,6 +5,7 @@ export declare class RoomMessagesHistory {
5
5
  private room;
6
6
  private tracker;
7
7
  private historyWindows;
8
+ private traverseLock;
8
9
  constructor(room: Room, tracker: ChatStateTracker);
9
10
  /**
10
11
  * Returns a history window object for the given topic ID, allowing you to view message history.
@@ -14,4 +15,5 @@ export declare class RoomMessagesHistory {
14
15
  private handleNewTopic;
15
16
  private handleTopicDeleted;
16
17
  private createHistoryWindowForTopic;
18
+ private updateTraverseLock;
17
19
  }
@@ -45,6 +45,7 @@ export declare class SpacesManager {
45
45
  private handleSpaceMemberLeft;
46
46
  private handleSpaceMembers;
47
47
  private handleSpaceRooms;
48
+ private handleRoomSummaryUpdated;
48
49
  private handleSpaceMemberUpdated;
49
50
  private handleRoleUpdated;
50
51
  private handleSession;
@@ -58,7 +58,13 @@ export declare class TopicHistoryWindow extends TraversableRemoteCollection<Mess
58
58
  * Reexported available window modes enum.
59
59
  */
60
60
  readonly WindowState: typeof WindowState;
61
+ private traverseLock;
61
62
  constructor(roomId: string, topicId: string, tracker: ChatStateTracker);
63
+ get isTraverseLocked(): boolean;
64
+ setTraverseLock(lock: boolean): Promise<void>;
65
+ resetToLatest(): Promise<void>;
66
+ fetchNext(): Promise<void>;
67
+ fetchPrevious(): Promise<void>;
62
68
  /**
63
69
  * For internal use.
64
70
  * @internal
@@ -124,4 +124,5 @@ import { UserRelationship, UserRelationshipType } from "./schemes/UserRelationsh
124
124
  import { DeleteRelationship } from "./schemes/commands/DeleteRelationship";
125
125
  import { Relationships } from "./schemes/events/Relationships";
126
126
  import { CreateRelationship } from "./schemes/commands/CreateRelationship";
127
- export { Envelope, Message, MessageType, MessageAuthor, Role, Room, RoomFlag, RoomType, RoomStream, RoomStreamType, RoomHistory, RoomHistoryMode, RoomMember, RoomSummary, RoomSummaryExtras, Space, SpaceFlag, SpaceMember, Topic, FollowedTopic, User, UserState, PermissionOverwritesValue, ChatLocation, SpaceSummary, SpaceDiscoverable, Emoticon, PermissionOverwritesTarget, BanObject, LeaveReason, UserRelationship, UserRelationshipType, CreateTopicInitialMessage, Bye, Error, Messages, NewMessage, NewRole, NewRoom, NewTopic, TopicFollowed, TopicUnfollowed, FollowedTopics, FollowedTopicUpdated, ComputedPermissions, PermissionOverwrites, PermissionOverwritesUpdated, RoleDeleted, RoleUpdated, RoomDeleted, RoomUpdated, RoomJoined, RoomLeft, RoomMemberJoined, RoomMemberLeft, RoomMembers, RoomMemberUpdated, UserUpdated, Session, SpaceDeleted, SpaceUpdated, SpaceJoined, SpaceLeft, SpaceMemberJoined, SpaceMemberLeft, SpaceMembers, SpaceMemberUpdated, SpaceRooms, TopicDeleted, TopicUpdated, PermissionOverwriteTargets, Owners, Ok, DiscoverableSpaces, Emoticons, EmoticonDeleted, NewEmoticon, Bans, ClientData, SpaceSummaryEvent, RoomSummaryEvent, NewRelationship, RelationshipDeleted, Relationships, AssignRole, GetMessages, CreateMessage, Ack, CreateRole, CreateRoom, CreateSpace, CreateTopic, FollowTopic, UnfollowTopic, GetFollowedTopics, DeassignRole, DeleteRole, DeleteRoom, DeleteSpace, DeleteTopic, SetPermissionOverwrites, GetPermissionOverwrites, GetComputedPermissions, GetRoomMembers, GetSession, GetSpaceMembers, GetSpaceRooms, JoinRoom, JoinSpace, LeaveRoom, LeaveSpace, UpdateRole, UpdateSpace, UpdateRoom, UpdateTopic, GetPermissionOverwriteTargets, CreateOwner, DeleteOwner, GetOwners, Topics, GetTopics, GetDiscoverableSpaces, GetEmoticons, CreateEmoticon, DeleteEmoticon, Ban, Unban, GetBans, Kick, GetClientData, SetClientData, GetSpaceSummary, GetRoomSummary, SetCustomNick, CreateRelationship, DeleteRelationship };
127
+ import { RoomSummaryUpdated } from "./schemes/events/RoomSummaryUpdated";
128
+ export { Envelope, Message, MessageType, MessageAuthor, Role, Room, RoomFlag, RoomType, RoomStream, RoomStreamType, RoomHistory, RoomHistoryMode, RoomMember, RoomSummary, RoomSummaryExtras, Space, SpaceFlag, SpaceMember, Topic, FollowedTopic, User, UserState, PermissionOverwritesValue, ChatLocation, SpaceSummary, SpaceDiscoverable, Emoticon, PermissionOverwritesTarget, BanObject, LeaveReason, UserRelationship, UserRelationshipType, CreateTopicInitialMessage, Bye, Error, Messages, NewMessage, NewRole, NewRoom, NewTopic, TopicFollowed, TopicUnfollowed, FollowedTopics, FollowedTopicUpdated, ComputedPermissions, PermissionOverwrites, PermissionOverwritesUpdated, RoleDeleted, RoleUpdated, RoomDeleted, RoomUpdated, RoomJoined, RoomLeft, RoomMemberJoined, RoomMemberLeft, RoomMembers, RoomMemberUpdated, UserUpdated, Session, SpaceDeleted, SpaceUpdated, SpaceJoined, SpaceLeft, SpaceMemberJoined, SpaceMemberLeft, SpaceMembers, SpaceMemberUpdated, SpaceRooms, TopicDeleted, TopicUpdated, PermissionOverwriteTargets, Owners, Ok, DiscoverableSpaces, Emoticons, EmoticonDeleted, NewEmoticon, Bans, ClientData, SpaceSummaryEvent, RoomSummaryEvent, NewRelationship, RelationshipDeleted, Relationships, RoomSummaryUpdated, AssignRole, GetMessages, CreateMessage, Ack, CreateRole, CreateRoom, CreateSpace, CreateTopic, FollowTopic, UnfollowTopic, GetFollowedTopics, DeassignRole, DeleteRole, DeleteRoom, DeleteSpace, DeleteTopic, SetPermissionOverwrites, GetPermissionOverwrites, GetComputedPermissions, GetRoomMembers, GetSession, GetSpaceMembers, GetSpaceRooms, JoinRoom, JoinSpace, LeaveRoom, LeaveSpace, UpdateRole, UpdateSpace, UpdateRoom, UpdateTopic, GetPermissionOverwriteTargets, CreateOwner, DeleteOwner, GetOwners, Topics, GetTopics, GetDiscoverableSpaces, GetEmoticons, CreateEmoticon, DeleteEmoticon, Ban, Unban, GetBans, Kick, GetClientData, SetClientData, GetSpaceSummary, GetRoomSummary, SetCustomNick, CreateRelationship, DeleteRelationship };
@@ -0,0 +1,7 @@
1
+ import { RoomSummary } from "../RoomSummary";
2
+ export interface RoomSummaryUpdated {
3
+ /**
4
+ * Partial summary: without the `extras` field.
5
+ */
6
+ summary: RoomSummary;
7
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "polfan-server-js-client",
3
- "version": "0.2.49",
3
+ "version": "0.2.50",
4
4
  "description": "JavaScript client library for handling communication with Polfan chat server.",
5
5
  "author": "Jarosław Żak",
6
6
  "license": "MIT",
@@ -82,12 +82,26 @@ import {
82
82
  GetEmoticons,
83
83
  Emoticons,
84
84
  EmoticonDeleted,
85
- NewEmoticon, Bans, GetBans, Ban, Unban, Kick, ClientData, GetClientData, SetClientData,
85
+ NewEmoticon,
86
+ Bans,
87
+ GetBans,
88
+ Ban,
89
+ Unban,
90
+ Kick,
91
+ ClientData,
92
+ GetClientData,
93
+ SetClientData,
86
94
  GetRoomSummary,
87
95
  GetSpaceSummary,
88
96
  RoomSummaryEvent,
89
97
  SpaceSummaryEvent,
90
- SetCustomNick, Relationships, RelationshipDeleted, NewRelationship, DeleteRelationship, CreateRelationship,
98
+ SetCustomNick,
99
+ Relationships,
100
+ RelationshipDeleted,
101
+ NewRelationship,
102
+ DeleteRelationship,
103
+ CreateRelationship,
104
+ RoomSummaryUpdated,
91
105
  } from "./types/src/index";
92
106
  import {EventTarget} from "./EventTarget";
93
107
  import {GetRelationships} from "./types/src/schemes/commands/GetRelationships";
@@ -195,6 +209,7 @@ export type EventsMap = {
195
209
  RoomDeleted: RoomDeleted,
196
210
  RoomUpdated: RoomUpdated,
197
211
  RoomSummaryEvent: RoomSummaryEvent,
212
+ RoomSummaryUpdated: RoomSummaryUpdated,
198
213
  // Topic events
199
214
  NewTopic: NewTopic,
200
215
  TopicDeleted: TopicDeleted,
@@ -5,6 +5,7 @@ import {TopicHistoryWindow} from "./TopicHistoryWindow";
5
5
 
6
6
  export class RoomMessagesHistory {
7
7
  private historyWindows = new IndexedCollection<string, TopicHistoryWindow>();
8
+ private traverseLock: boolean = false;
8
9
 
9
10
  public constructor(
10
11
  private room: Room,
@@ -14,6 +15,8 @@ export class RoomMessagesHistory {
14
15
  this.tracker.client.on('NewTopic', ev => this.handleNewTopic(ev));
15
16
  this.tracker.client.on('TopicDeleted', ev => this.handleTopicDeleted(ev));
16
17
 
18
+ this.updateTraverseLock(this.room);
19
+
17
20
  if (this.room.defaultTopic) {
18
21
  this.createHistoryWindowForTopic(this.room.defaultTopic);
19
22
  }
@@ -25,7 +28,7 @@ export class RoomMessagesHistory {
25
28
  public async getMessagesWindow(topicId: string): Promise<TopicHistoryWindow | undefined> {
26
29
  let historyWindow = this.historyWindows.get(topicId);
27
30
 
28
- if (! historyWindow) {
31
+ if (!historyWindow) {
29
32
  const topic = (await this.tracker.rooms.getTopics(this.room.id, [topicId])).get(topicId);
30
33
 
31
34
  if (topic) {
@@ -36,13 +39,19 @@ export class RoomMessagesHistory {
36
39
  return this.historyWindows.get(topicId);
37
40
  }
38
41
 
39
- private handleRoomUpdated(ev: RoomUpdated): void {
42
+ private async handleRoomUpdated(ev: RoomUpdated): Promise<void> {
40
43
  if (this.room.id === ev.room.id) {
41
44
  this.room = ev.room;
42
45
 
46
+ this.updateTraverseLock(ev.room);
47
+
43
48
  if (ev.room.defaultTopic) {
44
49
  this.createHistoryWindowForTopic(ev.room.defaultTopic);
45
50
  }
51
+
52
+ for (const [, window] of Array.from(this.historyWindows.items)) {
53
+ await window.setTraverseLock(this.traverseLock);
54
+ }
46
55
  }
47
56
  }
48
57
 
@@ -63,7 +72,11 @@ export class RoomMessagesHistory {
63
72
  return;
64
73
  }
65
74
 
66
- this.historyWindows.set([topic.id, new TopicHistoryWindow(this.room.id, topic.id, this.tracker)]);
75
+ const historyWindow = new TopicHistoryWindow(this.room.id, topic.id, this.tracker);
76
+
77
+ historyWindow.setTraverseLock(this.traverseLock);
78
+
79
+ this.historyWindows.set([topic.id, historyWindow]);
67
80
 
68
81
  // If new topic refers to some message from this room, update other structures
69
82
  if (topic.refMessage) {
@@ -71,4 +84,8 @@ export class RoomMessagesHistory {
71
84
  refHistoryWindow?._updateMessageReference(topic);
72
85
  }
73
86
  }
87
+
88
+ private updateTraverseLock(room: Room): void {
89
+ this.traverseLock = room.history.mode === 'Ephemeral';
90
+ }
74
91
  }
@@ -8,6 +8,7 @@ import {
8
8
  RoleUpdated,
9
9
  RoomDeleted,
10
10
  RoomSummary,
11
+ RoomSummaryUpdated,
11
12
  RoomUpdated,
12
13
  Session,
13
14
  Space,
@@ -48,6 +49,7 @@ export class SpacesManager {
48
49
  this.tracker.client.on('SpaceMemberLeft', ev => this.handleSpaceMemberLeft(ev));
49
50
  this.tracker.client.on('SpaceMembers', ev => this.handleSpaceMembers(ev));
50
51
  this.tracker.client.on('SpaceRooms', ev => this.handleSpaceRooms(ev));
52
+ this.tracker.client.on('RoomSummaryUpdated', ev => this.handleRoomSummaryUpdated(ev));
51
53
  this.tracker.client.on('SpaceMemberUpdated', ev => this.handleSpaceMemberUpdated(ev));
52
54
  this.tracker.client.on('UserUpdated', ev => this.handleUserUpdated(ev));
53
55
  this.tracker.client.on('NewRole', ev => this.handleNewRole(ev));
@@ -229,12 +231,37 @@ export class SpacesManager {
229
231
  }
230
232
 
231
233
  private handleSpaceRooms(ev: SpaceRooms): void {
232
- if (! this.rooms.has(ev.id)) {
234
+ if (!this.rooms.has(ev.id)) {
233
235
  this.rooms.set([ev.id, new ObservableIndexedObjectCollection('id', ev.summaries)]);
234
236
  ev.summaries.forEach(summary => this.roomIdToSpaceId.set([summary.id, ev.id]));
235
237
  }
236
238
  }
237
239
 
240
+ private async handleRoomSummaryUpdated(ev: RoomSummaryUpdated): Promise<void> {
241
+ const spaceId = this.roomIdToSpaceId.get(ev.summary.id);
242
+ const summariesPromise = this.roomsPromises.get(spaceId);
243
+
244
+ /**
245
+ * Update summary only if the list was already loaded.
246
+ * RoomSummaryUpdated event has a partial summary, so we need to update the existing summary by merging it.
247
+ */
248
+ if (spaceId && summariesPromise) {
249
+ await summariesPromise;
250
+
251
+ const summaries = this.rooms.get(spaceId);
252
+ const oldSummary = summaries.get(ev.summary.id);
253
+ let newSummary: RoomSummary;
254
+
255
+ if (oldSummary) {
256
+ newSummary = {...oldSummary, ...ev.summary};
257
+ } else {
258
+ newSummary = ev.summary;
259
+ }
260
+
261
+ summaries.set(newSummary);
262
+ }
263
+ }
264
+
238
265
  private handleSpaceMemberUpdated(ev: SpaceMemberUpdated): void {
239
266
  if (this.members.has(ev.spaceId)) {
240
267
  const members = this.members.get(ev.spaceId);
@@ -187,6 +187,8 @@ export class TopicHistoryWindow extends TraversableRemoteCollection<Message> {
187
187
  */
188
188
  public readonly WindowState: typeof WindowState = WindowState;
189
189
 
190
+ private traverseLock: boolean = false;
191
+
190
192
  public constructor(
191
193
  private roomId: string,
192
194
  private topicId: string,
@@ -197,6 +199,39 @@ export class TopicHistoryWindow extends TraversableRemoteCollection<Message> {
197
199
  this.tracker.client.on('NewMessage', ev => this.handleNewMessage(ev));
198
200
  }
199
201
 
202
+ public get isTraverseLocked(): boolean {
203
+ return this.traverseLock;
204
+ }
205
+
206
+ public async setTraverseLock(lock: boolean): Promise<void> {
207
+ this.traverseLock = lock;
208
+
209
+ if (lock && (this.state !== WindowState.LIVE && this.state !== WindowState.LATEST)) {
210
+ await super.resetToLatest();
211
+ }
212
+ }
213
+
214
+ public async resetToLatest(): Promise<void> {
215
+ if (this.traverseLock) {
216
+ return;
217
+ }
218
+ return super.resetToLatest();
219
+ }
220
+
221
+ public async fetchNext(): Promise<void> {
222
+ if (this.traverseLock) {
223
+ return;
224
+ }
225
+ return super.fetchNext();
226
+ }
227
+
228
+ public async fetchPrevious(): Promise<void> {
229
+ if (this.traverseLock) {
230
+ return;
231
+ }
232
+ return super.fetchPrevious();
233
+ }
234
+
200
235
  /**
201
236
  * For internal use.
202
237
  * @internal
@@ -124,6 +124,7 @@ import {UserRelationship, UserRelationshipType} from "./schemes/UserRelationship
124
124
  import {DeleteRelationship} from "./schemes/commands/DeleteRelationship";
125
125
  import {Relationships} from "./schemes/events/Relationships";
126
126
  import {CreateRelationship} from "./schemes/commands/CreateRelationship";
127
+ import {RoomSummaryUpdated} from "./schemes/events/RoomSummaryUpdated";
127
128
 
128
129
  export {
129
130
  // objects
@@ -212,6 +213,7 @@ export {
212
213
  NewRelationship,
213
214
  RelationshipDeleted,
214
215
  Relationships,
216
+ RoomSummaryUpdated,
215
217
  // commands
216
218
  AssignRole,
217
219
  GetMessages,
@@ -0,0 +1,8 @@
1
+ import {RoomSummary} from "../RoomSummary";
2
+
3
+ export interface RoomSummaryUpdated {
4
+ /**
5
+ * Partial summary: without the `extras` field.
6
+ */
7
+ summary: RoomSummary;
8
+ }