polfan-server-js-client 0.2.85 → 0.2.87

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 +46 -24
  2. package/build/index.cjs.js +29 -9
  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 +3 -1
  7. package/build/types/state-tracker/TopicHistoryWindow.d.ts +12 -3
  8. package/build/types/types/src/index.d.ts +4 -1
  9. package/build/types/types/src/schemes/BanObject.d.ts +4 -1
  10. package/build/types/types/src/schemes/RoomSummary.d.ts +1 -0
  11. package/build/types/types/src/schemes/UserInformation.d.ts +11 -0
  12. package/build/types/types/src/schemes/commands/Ban.d.ts +2 -0
  13. package/build/types/types/src/schemes/commands/GetBans.d.ts +2 -0
  14. package/build/types/types/src/schemes/commands/GetUserInfo.d.ts +3 -0
  15. package/build/types/types/src/schemes/commands/Unban.d.ts +1 -3
  16. package/build/types/types/src/schemes/events/Session.d.ts +1 -0
  17. package/build/types/types/src/schemes/events/UserInfo.d.ts +4 -0
  18. package/package.json +1 -1
  19. package/src/AbstractChatClient.ts +4 -0
  20. package/src/state-tracker/TopicHistoryWindow.ts +32 -10
  21. package/src/types/src/index.ts +7 -1
  22. package/src/types/src/schemes/BanObject.ts +5 -1
  23. package/src/types/src/schemes/RoomSummary.ts +1 -0
  24. package/src/types/src/schemes/UserInformation.ts +12 -0
  25. package/src/types/src/schemes/commands/Ban.ts +2 -0
  26. package/src/types/src/schemes/commands/GetBans.ts +2 -0
  27. package/src/types/src/schemes/commands/GetUserInfo.ts +3 -0
  28. package/src/types/src/schemes/commands/Unban.ts +1 -4
  29. package/src/types/src/schemes/events/Session.ts +1 -0
  30. package/src/types/src/schemes/events/UserInfo.ts +5 -0
  31. package/tests/history-window.test.ts +35 -1
@@ -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, UpdateSpaceMember, Relationships, RelationshipDeleted, NewRelationship, DeleteRelationship, CreateRelationship, RoomSummaryUpdated, Pong, Ping, RedactMessages, MessagesRedacted, ReportAbuse, UpdateRoomMember, GetRelationships } from "./types/src";
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, UpdateSpaceMember, Relationships, RelationshipDeleted, NewRelationship, DeleteRelationship, CreateRelationship, RoomSummaryUpdated, Pong, Ping, RedactMessages, MessagesRedacted, ReportAbuse, UpdateRoomMember, GetRelationships, GetUserInfo, UserInfo } from "./types/src";
2
2
  import { EventTarget } from "./EventTarget";
3
3
  type ArrayOfPromiseResolvers = [(value: any) => void, (reason?: any) => void];
4
4
  type ExtraEventMap = Record<string, any>;
@@ -43,6 +43,7 @@ export type EventsMap = {
43
43
  RelationshipDeleted: RelationshipDeleted;
44
44
  Relationships: Relationships;
45
45
  Pong: Pong;
46
+ UserInfo: UserInfo;
46
47
  DiscoverableSpaces: DiscoverableSpaces;
47
48
  SpaceJoined: SpaceJoined;
48
49
  SpaceLeft: SpaceLeft;
@@ -107,6 +108,7 @@ export type CommandsMap = {
107
108
  GetRelationships: CommandDefinition<GetRelationships, EventsMap['Relationships']>;
108
109
  Ping: CommandDefinition<Ping, EventsMap['Pong']>;
109
110
  ReportAbuse: CommandDefinition<ReportAbuse, EventsMap['Ok']>;
111
+ GetUserInfo: CommandDefinition<GetUserInfo, EventsMap['UserInfo']>;
110
112
  GetDiscoverableSpaces: CommandDefinition<GetDiscoverableSpaces, EventsMap['DiscoverableSpaces']>;
111
113
  JoinSpace: CommandDefinition<JoinSpace, EventsMap['SpaceJoined']>;
112
114
  LeaveSpace: CommandDefinition<LeaveSpace, EventsMap['SpaceLeft']>;
@@ -30,6 +30,7 @@ export declare abstract class TraversableRemoteCollection<ItemT, EventMapT exten
30
30
  current: WindowState;
31
31
  ongoing?: WindowState;
32
32
  limit: number | null;
33
+ retainRatio: number;
33
34
  fetchLimit: number;
34
35
  lastFetchCount: number;
35
36
  oldestId: string | null;
@@ -43,15 +44,23 @@ export declare abstract class TraversableRemoteCollection<ItemT, EventMapT exten
43
44
  */
44
45
  set fetchLimit(value: number);
45
46
  /**
46
- * Maximum numer of items stored in window.
47
+ * Maximum number of items stored in window (High Watermark).
47
48
  * Null for unlimited.
48
49
  */
49
50
  get limit(): number | null;
50
51
  /**
51
- * Maximum numer of items stored in window.
52
+ * Maximum number of items stored in window (High Watermark).
52
53
  * Null for unlimited.
53
54
  */
54
55
  set limit(value: number | null);
56
+ /**
57
+ * Percentage of limit to keep when trimming.
58
+ */
59
+ get retainRatio(): number;
60
+ /**
61
+ * Percentage of limit to keep when trimming.
62
+ */
63
+ set retainRatio(value: number);
55
64
  get hasLatest(): boolean;
56
65
  get hasOldest(): boolean;
57
66
  abstract createMirror(): TraversableRemoteCollection<ItemT, EventMapT>;
@@ -65,7 +74,7 @@ export declare abstract class TraversableRemoteCollection<ItemT, EventMapT exten
65
74
  protected refreshFetchedState(): Promise<void>;
66
75
  protected addItems(newItems: ItemT[], to: 'head' | 'tail'): void;
67
76
  /**
68
- * Return array with messages of count that matching limit.
77
+ * Return array with messages trimmed using High/Low Watermark strategy.
69
78
  */
70
79
  private trimItemsArrayToLimit;
71
80
  }
@@ -131,4 +131,7 @@ import { ReportAbuse } from "./schemes/commands/ReportAbuse";
131
131
  import { RedactMessages } from "./schemes/commands/RedactMessages";
132
132
  import { MessagesRedacted } from "./schemes/events/MessagesRedacted";
133
133
  import { GetRelationships } from "./schemes/commands/GetRelationships";
134
- export { Envelope, Message, MessageType, MessageAuthor, Role, Room, RoomType, RoomStream, RoomStreamType, RoomHistory, RoomHistoryMode, RoomMember, RoomSummary, RoomSummaryExtras, Space, 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, Pong, MessagesRedacted, 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, UpdateSpaceMember, CreateRelationship, DeleteRelationship, GetRelationships, UpdateRoomMember, Ping, ReportAbuse, RedactMessages };
134
+ import { GetUserInfo } from "./schemes/commands/GetUserInfo";
135
+ import { UserInfo } from "./schemes/events/UserInfo";
136
+ import { UserInformation } from "./schemes/UserInformation";
137
+ export { Envelope, Message, MessageType, MessageAuthor, Role, Room, RoomType, RoomStream, RoomStreamType, RoomHistory, RoomHistoryMode, RoomMember, RoomSummary, RoomSummaryExtras, Space, SpaceMember, Topic, FollowedTopic, User, UserState, PermissionOverwritesValue, ChatLocation, SpaceSummary, SpaceDiscoverable, Emoticon, PermissionOverwritesTarget, BanObject, LeaveReason, UserRelationship, UserRelationshipType, CreateTopicInitialMessage, UserInformation, 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, Pong, MessagesRedacted, UserInfo, 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, UpdateSpaceMember, CreateRelationship, DeleteRelationship, GetRelationships, UpdateRoomMember, Ping, ReportAbuse, RedactMessages, GetUserInfo, };
@@ -1,11 +1,14 @@
1
1
  import { User } from "./User";
2
2
  import { ChatLocation } from "./ChatLocation";
3
+ export type BanType = 'Ban' | 'Mute';
3
4
  export interface BanObject {
5
+ id: string;
4
6
  bannedUser: User;
5
7
  banningUser?: User;
6
8
  location: ChatLocation;
7
9
  reason: string;
8
- diagnosticId: string;
9
10
  expiresAt?: string;
10
11
  createdAt: string;
12
+ type: BanType;
13
+ parentId?: string;
11
14
  }
@@ -4,6 +4,7 @@ export interface RoomSummaryExtras {
4
4
  }
5
5
  export interface RoomSummary {
6
6
  id: string;
7
+ spaceId?: string;
7
8
  name: string;
8
9
  description: string;
9
10
  memberCount: number;
@@ -0,0 +1,11 @@
1
+ import { User } from "./User";
2
+ import { SpaceSummary } from "./SpaceSummary";
3
+ import { RoomSummary } from "./RoomSummary";
4
+ export interface UserInformation {
5
+ user: User;
6
+ firstSeenAt: string;
7
+ lastSeenAt: string;
8
+ spaces: SpaceSummary[];
9
+ rooms: RoomSummary[];
10
+ knownAliases?: User[];
11
+ }
@@ -1,8 +1,10 @@
1
1
  import { ChatLocation } from "../ChatLocation";
2
+ import { BanType } from "../BanObject";
2
3
  export interface Ban {
3
4
  userId: string;
4
5
  location: ChatLocation;
5
6
  reason: string;
6
7
  expiresAt?: string;
7
8
  notify?: boolean;
9
+ type?: BanType;
8
10
  }
@@ -1,4 +1,6 @@
1
1
  import { ChatLocation } from "../ChatLocation";
2
+ import { BanType } from "../BanObject";
2
3
  export interface GetBans {
3
4
  location: ChatLocation;
5
+ type?: BanType;
4
6
  }
@@ -0,0 +1,3 @@
1
+ export interface GetUserInfo {
2
+ id: string;
3
+ }
@@ -1,5 +1,3 @@
1
- import { ChatLocation } from "../ChatLocation";
2
1
  export interface Unban {
3
- userId: string;
4
- location: ChatLocation;
2
+ id: string;
5
3
  }
@@ -5,4 +5,5 @@ export interface Session {
5
5
  protoVersion: string;
6
6
  state: UserState;
7
7
  user: User;
8
+ ict?: string;
8
9
  }
@@ -0,0 +1,4 @@
1
+ import { UserInformation } from "../UserInformation";
2
+ export interface UserInfo {
3
+ info: UserInformation;
4
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "polfan-server-js-client",
3
- "version": "0.2.85",
3
+ "version": "0.2.87",
4
4
  "description": "JavaScript client library for handling communication with Polfan chat server.",
5
5
  "author": "Jarosław Żak",
6
6
  "license": "MIT",
@@ -109,6 +109,8 @@ import {
109
109
  ReportAbuse,
110
110
  UpdateRoomMember,
111
111
  GetRelationships,
112
+ GetUserInfo,
113
+ UserInfo,
112
114
  } from "./types/src";
113
115
  import {EventTarget} from "./EventTarget";
114
116
 
@@ -188,6 +190,7 @@ export type CommandResponse<CommandType extends keyof CommandsMap> = CommandsMap
188
190
  RelationshipDeleted: RelationshipDeleted,
189
191
  Relationships: Relationships,
190
192
  Pong: Pong,
193
+ UserInfo: UserInfo,
191
194
  // Space events
192
195
  DiscoverableSpaces: DiscoverableSpaces,
193
196
  SpaceJoined: SpaceJoined,
@@ -257,6 +260,7 @@ export type CommandsMap = {
257
260
  GetRelationships: CommandDefinition<GetRelationships, EventsMap['Relationships']>,
258
261
  Ping: CommandDefinition<Ping, EventsMap['Pong']>,
259
262
  ReportAbuse: CommandDefinition<ReportAbuse, EventsMap['Ok']>,
263
+ GetUserInfo: CommandDefinition<GetUserInfo, EventsMap['UserInfo']>,
260
264
  // Space commands
261
265
  GetDiscoverableSpaces: CommandDefinition<GetDiscoverableSpaces, EventsMap['DiscoverableSpaces']>,
262
266
  JoinSpace: CommandDefinition<JoinSpace, EventsMap['SpaceJoined']>,
@@ -40,14 +40,16 @@ export abstract class TraversableRemoteCollection<
40
40
  protected internalState: {
41
41
  current: WindowState,
42
42
  ongoing?: WindowState,
43
- limit: number | null,
43
+ limit: number | null, // Acts as High Watermark
44
+ retainRatio: number, // Percentage of limit to keep when trimming
44
45
  fetchLimit: number,
45
46
  lastFetchCount: number,
46
47
  oldestId: string | null,
47
48
  } = {
48
49
  current: WindowState.LIVE,
49
50
  ongoing: undefined,
50
- limit: 50,
51
+ limit: 1000,
52
+ retainRatio: 1,
51
53
  fetchLimit: 50,
52
54
  lastFetchCount: 0,
53
55
  oldestId: null,
@@ -68,7 +70,7 @@ export abstract class TraversableRemoteCollection<
68
70
  }
69
71
 
70
72
  /**
71
- * Maximum numer of items stored in window.
73
+ * Maximum number of items stored in window (High Watermark).
72
74
  * Null for unlimited.
73
75
  */
74
76
  public get limit(): number | null {
@@ -76,13 +78,27 @@ export abstract class TraversableRemoteCollection<
76
78
  }
77
79
 
78
80
  /**
79
- * Maximum numer of items stored in window.
81
+ * Maximum number of items stored in window (High Watermark).
80
82
  * Null for unlimited.
81
83
  */
82
84
  public set limit(value: number | null) {
83
85
  this.internalState.limit = value;
84
86
  }
85
87
 
88
+ /**
89
+ * Percentage of limit to keep when trimming.
90
+ */
91
+ public get retainRatio(): number {
92
+ return this.internalState.retainRatio;
93
+ }
94
+
95
+ /**
96
+ * Percentage of limit to keep when trimming.
97
+ */
98
+ public set retainRatio(value: number) {
99
+ this.internalState.retainRatio = value;
100
+ }
101
+
86
102
  public get hasLatest(): boolean {
87
103
  return [WindowState.LATEST, WindowState.LIVE].includes(this.state);
88
104
  }
@@ -111,7 +127,7 @@ export abstract class TraversableRemoteCollection<
111
127
  this.internalState.ongoing = undefined;
112
128
  }
113
129
 
114
- this.deleteAll();
130
+ this._items.deleteAll(); // Directly call deleteAll to prevent event emit.
115
131
  this.addItems(result, 'tail');
116
132
  this.internalState.current = WindowState.LATEST;
117
133
  }
@@ -205,25 +221,31 @@ export abstract class TraversableRemoteCollection<
205
221
  result = this.trimItemsArrayToLimit([...this.items, ...newItems], 'head');
206
222
  }
207
223
 
208
- this.deleteAll();
224
+ this._items.deleteAll(); // Directly call deleteAll to prevent event emit.
209
225
  this.set(...result);
210
226
  }
211
227
 
212
228
  /**
213
- * Return array with messages of count that matching limit.
229
+ * Return array with messages trimmed using High/Low Watermark strategy.
214
230
  */
215
231
  private trimItemsArrayToLimit(items: ItemT[], from: 'head' | 'tail'): ItemT[] {
216
- if (this.limit === null) {
232
+ const highWatermark = this.limit;
233
+
234
+ if (highWatermark === null || items.length <= highWatermark) {
217
235
  return items;
218
236
  }
219
237
 
238
+ const lowWatermark = Math.floor(highWatermark * this.internalState.retainRatio);
239
+
220
240
  if (from === 'head') {
221
- return items.slice(-this.limit);
241
+ return items.slice(-lowWatermark);
222
242
  }
223
243
 
224
244
  if (from === 'tail') {
225
- return items.slice(0, this.limit);
245
+ return items.slice(0, lowWatermark);
226
246
  }
247
+
248
+ return items;
227
249
  }
228
250
  }
229
251
 
@@ -131,6 +131,9 @@ import {ReportAbuse} from "./schemes/commands/ReportAbuse";
131
131
  import {RedactMessages} from "./schemes/commands/RedactMessages";
132
132
  import {MessagesRedacted} from "./schemes/events/MessagesRedacted";
133
133
  import {GetRelationships} from "./schemes/commands/GetRelationships";
134
+ import {GetUserInfo} from "./schemes/commands/GetUserInfo";
135
+ import {UserInfo} from "./schemes/events/UserInfo";
136
+ import {UserInformation} from "./schemes/UserInformation";
134
137
 
135
138
  export {
136
139
  // objects
@@ -165,6 +168,7 @@ export {
165
168
  UserRelationship,
166
169
  UserRelationshipType,
167
170
  CreateTopicInitialMessage,
171
+ UserInformation,
168
172
  // events
169
173
  Bye,
170
174
  Error,
@@ -220,6 +224,7 @@ export {
220
224
  RoomSummaryUpdated,
221
225
  Pong,
222
226
  MessagesRedacted,
227
+ UserInfo,
223
228
  // commands
224
229
  AssignRole,
225
230
  GetMessages,
@@ -277,5 +282,6 @@ export {
277
282
  UpdateRoomMember,
278
283
  Ping,
279
284
  ReportAbuse,
280
- RedactMessages
285
+ RedactMessages,
286
+ GetUserInfo,
281
287
  };
@@ -1,12 +1,16 @@
1
1
  import {User} from "./User";
2
2
  import {ChatLocation} from "./ChatLocation";
3
3
 
4
+ export type BanType = 'Ban' | 'Mute';
5
+
4
6
  export interface BanObject {
7
+ id: string;
5
8
  bannedUser: User;
6
9
  banningUser?: User;
7
10
  location: ChatLocation;
8
11
  reason: string;
9
- diagnosticId: string;
10
12
  expiresAt?: string;
11
13
  createdAt: string;
14
+ type: BanType;
15
+ parentId?: string;
12
16
  }
@@ -6,6 +6,7 @@ export interface RoomSummaryExtras {
6
6
 
7
7
  export interface RoomSummary {
8
8
  id: string;
9
+ spaceId?: string;
9
10
  name: string;
10
11
  description: string;
11
12
  memberCount: number;
@@ -0,0 +1,12 @@
1
+ import {User} from "./User";
2
+ import {SpaceSummary} from "./SpaceSummary";
3
+ import {RoomSummary} from "./RoomSummary";
4
+
5
+ export interface UserInformation {
6
+ user: User;
7
+ firstSeenAt: string;
8
+ lastSeenAt: string;
9
+ spaces: SpaceSummary[];
10
+ rooms: RoomSummary[];
11
+ knownAliases?: User[];
12
+ }
@@ -1,4 +1,5 @@
1
1
  import {ChatLocation} from "../ChatLocation";
2
+ import {BanType} from "../BanObject";
2
3
 
3
4
  export interface Ban {
4
5
  userId: string;
@@ -6,4 +7,5 @@ export interface Ban {
6
7
  reason: string;
7
8
  expiresAt?: string;
8
9
  notify?: boolean;
10
+ type?: BanType;
9
11
  }
@@ -1,5 +1,7 @@
1
1
  import {ChatLocation} from "../ChatLocation";
2
+ import {BanType} from "../BanObject";
2
3
 
3
4
  export interface GetBans {
4
5
  location: ChatLocation;
6
+ type?: BanType;
5
7
  }
@@ -0,0 +1,3 @@
1
+ export interface GetUserInfo {
2
+ id: string;
3
+ }
@@ -1,6 +1,3 @@
1
- import {ChatLocation} from "../ChatLocation";
2
-
3
1
  export interface Unban {
4
- userId: string;
5
- location: ChatLocation;
2
+ id: string;
6
3
  }
@@ -6,4 +6,5 @@ export interface Session {
6
6
  protoVersion: string;
7
7
  state: UserState;
8
8
  user: User;
9
+ ict?: string;
9
10
  }
@@ -0,0 +1,5 @@
1
+ import {UserInformation} from "../UserInformation";
2
+
3
+ export interface UserInfo {
4
+ info: UserInformation;
5
+ }
@@ -69,7 +69,8 @@ class TestableHistoryWindow extends TraversableRemoteCollection<SimpleMessage> {
69
69
  test('history window - fresh instance', async () => {
70
70
  const window = new TestableHistoryWindow();
71
71
  expect(window.items).toHaveLength(0);
72
- expect(window.limit).toEqual(50);
72
+ expect(window.limit).toEqual(1000);
73
+ expect(window.retainRatio).toEqual(1);
73
74
  });
74
75
 
75
76
  test('history window - states change', async () => {
@@ -251,3 +252,36 @@ test('history window - hasOldest false when in LATEST and length == fetchLimit',
251
252
  expect(window.fetchLimit).toEqual(3);
252
253
  expect(window.hasOldest).toBeFalsy();
253
254
  });
255
+
256
+ test('history window - high/low watermark limit (retainRatio)', async () => {
257
+ const window = new TestableHistoryWindow();
258
+ window.limit = 6; // High Watermark
259
+ window.retainRatio = 0.5; // Low Watermark target = 6 * 0.5 = 3
260
+ window.fetchLimit = 3;
261
+
262
+ await window.resetToLatest(); // [7, 8, 9]
263
+
264
+ expect(window.items).toHaveLength(3);
265
+
266
+ await window.fetchPrevious(); // [4, 5, 6] added to 'head' -> [4, 5, 6, 7, 8, 9]
267
+
268
+ expect(window.items).toHaveLength(6);
269
+ [4, 5, 6, 7, 8, 9].forEach(id => expect(window.items.map(item => item.id)).toContain(id));
270
+
271
+ await window.fetchPrevious(); // [1, 2, 3] added to 'head' -> [1, 2, 3, 4, 5, 6, 7, 8, 9]
272
+
273
+ expect(window.items).toHaveLength(3);
274
+ [1, 2, 3].forEach(id => expect(window.items.map(item => item.id)).toContain(id));
275
+ expect(window.state).toEqual(WindowState.PAST);
276
+
277
+ await window.fetchNext(); // [4, 5, 6] added to 'tail' -> [1, 2, 3, 4, 5, 6]
278
+
279
+ expect(window.items).toHaveLength(6);
280
+ [1, 2, 3, 4, 5, 6].forEach(id => expect(window.items.map(item => item.id)).toContain(id));
281
+
282
+ await window.fetchNext(); // [7, 8, 9] added to 'tail' -> [1, 2, 3, 4, 5, 6, 7, 8, 9]
283
+
284
+ expect(window.items).toHaveLength(3);
285
+ [7, 8, 9].forEach(id => expect(window.items.map(item => item.id)).toContain(id));
286
+ expect(window.state).toEqual(WindowState.LATEST);
287
+ });