polfan-server-js-client 0.2.48 → 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.
Files changed (31) hide show
  1. package/.idea/workspace.xml +53 -49
  2. package/build/index.cjs.js +68 -5
  3. package/build/index.cjs.js.map +1 -1
  4. package/build/index.umd.js +1 -1
  5. package/build/index.umd.js.map +1 -1
  6. package/build/types/AbstractChatClient.d.ts +2 -1
  7. package/build/types/state-tracker/RoomMessagesHistory.d.ts +2 -0
  8. package/build/types/state-tracker/SpacesManager.d.ts +1 -0
  9. package/build/types/state-tracker/TopicHistoryWindow.d.ts +6 -0
  10. package/build/types/types/src/index.d.ts +4 -2
  11. package/build/types/types/src/schemes/Message.d.ts +1 -1
  12. package/build/types/types/src/schemes/Room.d.ts +2 -0
  13. package/build/types/types/src/schemes/RoomHistory.d.ts +5 -0
  14. package/build/types/types/src/schemes/RoomSummary.d.ts +1 -0
  15. package/build/types/types/src/schemes/commands/CreateTopic.d.ts +5 -2
  16. package/build/types/types/src/schemes/commands/UpdateRoom.d.ts +2 -0
  17. package/build/types/types/src/schemes/events/RoomSummaryUpdated.d.ts +7 -0
  18. package/package.json +1 -1
  19. package/src/AbstractChatClient.ts +17 -2
  20. package/src/state-tracker/MessagesManager.ts +2 -3
  21. package/src/state-tracker/RoomMessagesHistory.ts +20 -3
  22. package/src/state-tracker/SpacesManager.ts +28 -1
  23. package/src/state-tracker/TopicHistoryWindow.ts +35 -0
  24. package/src/types/src/index.ts +9 -3
  25. package/src/types/src/schemes/Message.ts +1 -1
  26. package/src/types/src/schemes/Room.ts +2 -0
  27. package/src/types/src/schemes/RoomHistory.ts +6 -0
  28. package/src/types/src/schemes/RoomSummary.ts +1 -0
  29. package/src/types/src/schemes/commands/CreateTopic.ts +6 -2
  30. package/src/types/src/schemes/commands/UpdateRoom.ts +2 -0
  31. package/src/types/src/schemes/events/RoomSummaryUpdated.ts +8 -0
@@ -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
@@ -57,7 +57,7 @@ import { LeaveRoom } from "./schemes/commands/LeaveRoom";
57
57
  import { CreateRoom } from "./schemes/commands/CreateRoom";
58
58
  import { DeleteRoom } from "./schemes/commands/DeleteRoom";
59
59
  import { GetRoomMembers } from "./schemes/commands/GetRoomMembers";
60
- import { CreateTopic } from "./schemes/commands/CreateTopic";
60
+ import { CreateTopic, CreateTopicInitialMessage } from "./schemes/commands/CreateTopic";
61
61
  import { DeleteTopic } from "./schemes/commands/DeleteTopic";
62
62
  import { CreateMessage } from "./schemes/commands/CreateMessage";
63
63
  import { UpdateRole } from "./schemes/commands/UpdateRole";
@@ -111,6 +111,7 @@ import { GetClientData } from "./schemes/commands/GetClientData";
111
111
  import { SetClientData } from "./schemes/commands/SetClientData";
112
112
  import { ClientData } from "./schemes/events/ClientData";
113
113
  import { RoomStream, RoomStreamType } from "./schemes/RoomStream";
114
+ import { RoomHistory, RoomHistoryMode } from "./schemes/RoomHistory";
114
115
  import { GetRoomSummary } from "./schemes/commands/GetRoomSummary";
115
116
  import { GetSpaceSummary } from "./schemes/commands/GetSpaceSummary";
116
117
  import { SpaceFlag } from "./schemes/Space";
@@ -123,4 +124,5 @@ import { UserRelationship, UserRelationshipType } from "./schemes/UserRelationsh
123
124
  import { DeleteRelationship } from "./schemes/commands/DeleteRelationship";
124
125
  import { Relationships } from "./schemes/events/Relationships";
125
126
  import { CreateRelationship } from "./schemes/commands/CreateRelationship";
126
- export { Envelope, Message, MessageType, MessageAuthor, Role, Room, RoomFlag, RoomType, RoomMember, RoomSummary, RoomSummaryExtras, Space, SpaceFlag, SpaceMember, Topic, FollowedTopic, User, UserState, PermissionOverwritesValue, ChatLocation, SpaceSummary, SpaceDiscoverable, Emoticon, PermissionOverwritesTarget, BanObject, LeaveReason, RoomStream, RoomStreamType, UserRelationship, UserRelationshipType, 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 };
@@ -1,6 +1,6 @@
1
1
  import { User } from "./User";
2
2
  import { ChatLocation } from "./ChatLocation";
3
- export type MessageType = 'Text' | 'RoomJoin' | 'RoomLeave' | 'SpaceJoin' | 'SpaceLeave' | 'TopicChange' | 'CustomNickChange' | 'System';
3
+ export type MessageType = 'Text' | 'RoomJoin' | 'RoomLeave' | 'SpaceJoin' | 'SpaceLeave' | 'TopicChange' | 'CustomNickChange' | 'Ephemeral';
4
4
  export interface MessageAuthor {
5
5
  user: User;
6
6
  customNick?: string;
@@ -1,6 +1,7 @@
1
1
  import { Topic } from "./Topic";
2
2
  import { User } from "./User";
3
3
  import { RoomStream } from "./RoomStream";
4
+ import { RoomHistory } from "./RoomHistory";
4
5
  export type RoomType = 'Text' | 'ClassicText' | 'Pm';
5
6
  export declare enum RoomFlag {
6
7
  AllowSystemMessages = 1,
@@ -16,4 +17,5 @@ export interface Room {
16
17
  recipients: User[] | null;
17
18
  flags: number;
18
19
  stream: RoomStream | null;
20
+ history: RoomHistory | null;
19
21
  }
@@ -0,0 +1,5 @@
1
+ export type RoomHistoryMode = 'Full' | 'Ephemeral' | 'MaxAge';
2
+ export interface RoomHistory {
3
+ mode: RoomHistoryMode;
4
+ maxAge?: number;
5
+ }
@@ -6,6 +6,7 @@ export interface RoomSummary {
6
6
  id: string;
7
7
  name: string;
8
8
  description: string;
9
+ memberCount: number;
9
10
  type: RoomType;
10
11
  extras?: RoomSummaryExtras;
11
12
  }
@@ -1,8 +1,11 @@
1
1
  import { ChatLocation } from "../ChatLocation";
2
- import { CreateMessage } from "./CreateMessage";
2
+ export interface CreateTopicInitialMessage {
3
+ content?: string;
4
+ attachments?: string[];
5
+ }
3
6
  export interface CreateTopic {
4
7
  location: ChatLocation;
5
8
  name: string;
6
9
  refMessageId?: string;
7
- initialMessage?: Omit<CreateMessage, 'location'>;
10
+ initialMessage?: CreateTopicInitialMessage;
8
11
  }
@@ -1,8 +1,10 @@
1
1
  import { RoomStream } from "../RoomStream";
2
+ import { RoomHistory } from "../RoomHistory";
2
3
  export interface UpdateRoom {
3
4
  id: string;
4
5
  name?: string;
5
6
  description?: string;
6
7
  flags?: number;
7
8
  stream?: RoomStream | null;
9
+ history?: RoomHistory;
8
10
  }
@@ -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.48",
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,
@@ -209,10 +209,9 @@ export class MessagesManager {
209
209
  private updateLocallyFollowedTopicOnNewMessage(ev: NewMessage): void {
210
210
  const roomFollowedTopics = this.followedTopics.get(ev.message.location.roomId);
211
211
  const followedTopic = roomFollowedTopics?.get(ev.message.location.topicId);
212
- const ephemeralMessageTypes = ['System'] as MessageType[];
213
212
 
214
- if (!roomFollowedTopics || !followedTopic || ephemeralMessageTypes.includes(ev.message.type)) {
215
- // Skip if we don't follow this room or targeted topic or message is ephemeral
213
+ if (!roomFollowedTopics || !followedTopic || ev.message.type === 'Ephemeral') {
214
+ // Skip if we don't follow this room or targeted topic or the message is ephemeral
216
215
  return;
217
216
  }
218
217
 
@@ -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
@@ -57,7 +57,7 @@ import {LeaveRoom} from "./schemes/commands/LeaveRoom";
57
57
  import {CreateRoom} from "./schemes/commands/CreateRoom";
58
58
  import {DeleteRoom} from "./schemes/commands/DeleteRoom";
59
59
  import {GetRoomMembers} from "./schemes/commands/GetRoomMembers";
60
- import {CreateTopic} from "./schemes/commands/CreateTopic";
60
+ import {CreateTopic, CreateTopicInitialMessage} from "./schemes/commands/CreateTopic";
61
61
  import {DeleteTopic} from "./schemes/commands/DeleteTopic";
62
62
  import {CreateMessage} from "./schemes/commands/CreateMessage";
63
63
  import {UpdateRole} from "./schemes/commands/UpdateRole";
@@ -111,6 +111,7 @@ import {GetClientData} from "./schemes/commands/GetClientData";
111
111
  import {SetClientData} from "./schemes/commands/SetClientData";
112
112
  import {ClientData} from "./schemes/events/ClientData";
113
113
  import {RoomStream, RoomStreamType} from "./schemes/RoomStream";
114
+ import {RoomHistory, RoomHistoryMode} from "./schemes/RoomHistory";
114
115
  import {GetRoomSummary} from "./schemes/commands/GetRoomSummary";
115
116
  import {GetSpaceSummary} from "./schemes/commands/GetSpaceSummary";
116
117
  import {SpaceFlag} from "./schemes/Space";
@@ -123,6 +124,7 @@ import {UserRelationship, UserRelationshipType} from "./schemes/UserRelationship
123
124
  import {DeleteRelationship} from "./schemes/commands/DeleteRelationship";
124
125
  import {Relationships} from "./schemes/events/Relationships";
125
126
  import {CreateRelationship} from "./schemes/commands/CreateRelationship";
127
+ import {RoomSummaryUpdated} from "./schemes/events/RoomSummaryUpdated";
126
128
 
127
129
  export {
128
130
  // objects
@@ -134,6 +136,10 @@ export {
134
136
  Room,
135
137
  RoomFlag,
136
138
  RoomType,
139
+ RoomStream,
140
+ RoomStreamType,
141
+ RoomHistory,
142
+ RoomHistoryMode,
137
143
  RoomMember,
138
144
  RoomSummary,
139
145
  RoomSummaryExtras,
@@ -152,10 +158,9 @@ export {
152
158
  PermissionOverwritesTarget,
153
159
  BanObject,
154
160
  LeaveReason,
155
- RoomStream,
156
- RoomStreamType,
157
161
  UserRelationship,
158
162
  UserRelationshipType,
163
+ CreateTopicInitialMessage,
159
164
  // events
160
165
  Bye,
161
166
  Error,
@@ -208,6 +213,7 @@ export {
208
213
  NewRelationship,
209
214
  RelationshipDeleted,
210
215
  Relationships,
216
+ RoomSummaryUpdated,
211
217
  // commands
212
218
  AssignRole,
213
219
  GetMessages,
@@ -1,7 +1,7 @@
1
1
  import {User} from "./User";
2
2
  import {ChatLocation} from "./ChatLocation";
3
3
 
4
- export type MessageType = 'Text'|'RoomJoin'|'RoomLeave'|'SpaceJoin'|'SpaceLeave'|'TopicChange'|'CustomNickChange'|'System';
4
+ export type MessageType = 'Text'|'RoomJoin'|'RoomLeave'|'SpaceJoin'|'SpaceLeave'|'TopicChange'|'CustomNickChange'|'Ephemeral';
5
5
 
6
6
  export interface MessageAuthor {
7
7
  user: User;
@@ -1,6 +1,7 @@
1
1
  import {Topic} from "./Topic";
2
2
  import {User} from "./User";
3
3
  import {RoomStream} from "./RoomStream";
4
+ import {RoomHistory} from "./RoomHistory";
4
5
 
5
6
  export type RoomType = 'Text' | 'ClassicText' | 'Pm';
6
7
 
@@ -19,4 +20,5 @@ export interface Room {
19
20
  recipients: User[] | null;
20
21
  flags: number;
21
22
  stream: RoomStream | null;
23
+ history: RoomHistory | null;
22
24
  }
@@ -0,0 +1,6 @@
1
+ export type RoomHistoryMode = 'Full' | 'Ephemeral' | 'MaxAge';
2
+
3
+ export interface RoomHistory {
4
+ mode: RoomHistoryMode;
5
+ maxAge?: number;
6
+ }
@@ -8,6 +8,7 @@ export interface RoomSummary {
8
8
  id: string;
9
9
  name: string;
10
10
  description: string;
11
+ memberCount: number;
11
12
  type: RoomType;
12
13
  extras?: RoomSummaryExtras;
13
14
  }
@@ -1,9 +1,13 @@
1
1
  import {ChatLocation} from "../ChatLocation";
2
- import {CreateMessage} from "./CreateMessage";
2
+
3
+ export interface CreateTopicInitialMessage {
4
+ content?: string;
5
+ attachments?: string[];
6
+ }
3
7
 
4
8
  export interface CreateTopic {
5
9
  location: ChatLocation;
6
10
  name: string;
7
11
  refMessageId?: string;
8
- initialMessage?: Omit<CreateMessage, 'location'>;
12
+ initialMessage?: CreateTopicInitialMessage;
9
13
  }
@@ -1,4 +1,5 @@
1
1
  import {RoomStream} from "../RoomStream";
2
+ import {RoomHistory} from "../RoomHistory";
2
3
 
3
4
  export interface UpdateRoom {
4
5
  id: string;
@@ -6,4 +7,5 @@ export interface UpdateRoom {
6
7
  description?: string;
7
8
  flags?: number;
8
9
  stream?: RoomStream | null;
10
+ history?: RoomHistory;
9
11
  }
@@ -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
+ }