polfan-server-js-client 0.1.992 → 0.1.994

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 (284) hide show
  1. package/build/index.js +825 -124
  2. package/build/index.js.map +1 -1
  3. package/build/types/AbstractChatClient.d.ts +5 -1
  4. package/build/types/state-tracker/MessagesManager.d.ts +8 -10
  5. package/build/types/state-tracker/RoomMessagesHistory.d.ts +17 -0
  6. package/build/types/state-tracker/RoomsManager.d.ts +4 -2
  7. package/build/types/state-tracker/TopicHistoryWindow.d.ts +58 -0
  8. package/build/types/types/src/index.d.ts +6 -2
  9. package/build/types/types/src/schemes/FollowedTopic.d.ts +0 -1
  10. package/build/types/types/src/schemes/Message.d.ts +8 -2
  11. package/{src/types/dist/schemes/commands/Ack.d.ts → build/types/types/src/schemes/commands/GetMessages.d.ts} +3 -2
  12. package/build/types/types/src/schemes/commands/GetTopics.d.ts +4 -0
  13. package/{src/types/dist/schemes/events/NewMessage.d.ts → build/types/types/src/schemes/events/Messages.d.ts} +3 -3
  14. package/build/types/types/src/schemes/events/Topics.d.ts +6 -0
  15. package/package.json +1 -1
  16. package/src/AbstractChatClient.ts +8 -0
  17. package/src/state-tracker/MessagesManager.ts +28 -60
  18. package/src/state-tracker/RoomMessagesHistory.ts +78 -0
  19. package/src/state-tracker/RoomsManager.ts +24 -2
  20. package/src/state-tracker/TopicHistoryWindow.ts +257 -0
  21. package/src/types/src/index.ts +10 -1
  22. package/src/types/src/schemes/FollowedTopic.ts +0 -1
  23. package/src/types/src/schemes/Message.ts +9 -2
  24. package/src/types/src/schemes/commands/GetMessages.ts +7 -0
  25. package/src/types/src/schemes/commands/GetTopics.ts +4 -0
  26. package/src/types/src/schemes/events/Messages.ts +7 -0
  27. package/src/types/src/schemes/events/Topics.ts +7 -0
  28. package/tests/history-window.test.ts +129 -0
  29. package/build/types/types/dist/index.d.ts +0 -1
  30. package/build/types/types/dist/schemes/ChatLocation.d.ts +0 -1
  31. package/build/types/types/dist/schemes/Envelope.d.ts +0 -1
  32. package/build/types/types/dist/schemes/FollowedTopic.d.ts +0 -1
  33. package/build/types/types/dist/schemes/Message.d.ts +0 -1
  34. package/build/types/types/dist/schemes/PermissionOverwritesValue.d.ts +0 -1
  35. package/build/types/types/dist/schemes/Role.d.ts +0 -1
  36. package/build/types/types/dist/schemes/Room.d.ts +0 -1
  37. package/build/types/types/dist/schemes/RoomMember.d.ts +0 -1
  38. package/build/types/types/dist/schemes/RoomSummary.d.ts +0 -1
  39. package/build/types/types/dist/schemes/Space.d.ts +0 -1
  40. package/build/types/types/dist/schemes/SpaceMember.d.ts +0 -1
  41. package/build/types/types/dist/schemes/Topic.d.ts +0 -1
  42. package/build/types/types/dist/schemes/User.d.ts +0 -1
  43. package/build/types/types/dist/schemes/UserState.d.ts +0 -1
  44. package/build/types/types/dist/schemes/commands/Ack.d.ts +0 -1
  45. package/build/types/types/dist/schemes/commands/AssignRole.d.ts +0 -1
  46. package/build/types/types/dist/schemes/commands/CreateMessage.d.ts +0 -1
  47. package/build/types/types/dist/schemes/commands/CreateOwner.d.ts +0 -1
  48. package/build/types/types/dist/schemes/commands/CreateRole.d.ts +0 -1
  49. package/build/types/types/dist/schemes/commands/CreateRoom.d.ts +0 -1
  50. package/build/types/types/dist/schemes/commands/CreateSpace.d.ts +0 -1
  51. package/build/types/types/dist/schemes/commands/CreateTopic.d.ts +0 -1
  52. package/build/types/types/dist/schemes/commands/DeassignRole.d.ts +0 -1
  53. package/build/types/types/dist/schemes/commands/DeleteOwner.d.ts +0 -1
  54. package/build/types/types/dist/schemes/commands/DeleteRole.d.ts +0 -1
  55. package/build/types/types/dist/schemes/commands/DeleteRoom.d.ts +0 -1
  56. package/build/types/types/dist/schemes/commands/DeleteSpace.d.ts +0 -1
  57. package/build/types/types/dist/schemes/commands/DeleteTopic.d.ts +0 -1
  58. package/build/types/types/dist/schemes/commands/FollowTopic.d.ts +0 -1
  59. package/build/types/types/dist/schemes/commands/GetComputedPermissions.d.ts +0 -1
  60. package/build/types/types/dist/schemes/commands/GetFollowedTopics.d.ts +0 -1
  61. package/build/types/types/dist/schemes/commands/GetOwners.d.ts +0 -1
  62. package/build/types/types/dist/schemes/commands/GetPermissionOverwriteTargets.d.ts +0 -1
  63. package/build/types/types/dist/schemes/commands/GetPermissionOverwrites.d.ts +0 -1
  64. package/build/types/types/dist/schemes/commands/GetRoomMembers.d.ts +0 -1
  65. package/build/types/types/dist/schemes/commands/GetSession.d.ts +0 -1
  66. package/build/types/types/dist/schemes/commands/GetSpaceMembers.d.ts +0 -1
  67. package/build/types/types/dist/schemes/commands/GetSpaceRooms.d.ts +0 -1
  68. package/build/types/types/dist/schemes/commands/JoinRoom.d.ts +0 -1
  69. package/build/types/types/dist/schemes/commands/JoinSpace.d.ts +0 -1
  70. package/build/types/types/dist/schemes/commands/LeaveRoom.d.ts +0 -1
  71. package/build/types/types/dist/schemes/commands/LeaveSpace.d.ts +0 -1
  72. package/build/types/types/dist/schemes/commands/SetPermissionOverwrites.d.ts +0 -1
  73. package/build/types/types/dist/schemes/commands/UnfollowTopic.d.ts +0 -1
  74. package/build/types/types/dist/schemes/commands/UpdateRole.d.ts +0 -1
  75. package/build/types/types/dist/schemes/commands/UpdateRoom.d.ts +0 -1
  76. package/build/types/types/dist/schemes/commands/UpdateSpace.d.ts +0 -1
  77. package/build/types/types/dist/schemes/events/Bye.d.ts +0 -1
  78. package/build/types/types/dist/schemes/events/ComputedPermissions.d.ts +0 -1
  79. package/build/types/types/dist/schemes/events/Error.d.ts +0 -1
  80. package/build/types/types/dist/schemes/events/FollowedTopicUpdated.d.ts +0 -1
  81. package/build/types/types/dist/schemes/events/FollowedTopics.d.ts +0 -1
  82. package/build/types/types/dist/schemes/events/NewMessage.d.ts +0 -1
  83. package/build/types/types/dist/schemes/events/NewRole.d.ts +0 -1
  84. package/build/types/types/dist/schemes/events/NewRoom.d.ts +0 -1
  85. package/build/types/types/dist/schemes/events/NewTopic.d.ts +0 -1
  86. package/build/types/types/dist/schemes/events/Ok.d.ts +0 -1
  87. package/build/types/types/dist/schemes/events/Owners.d.ts +0 -1
  88. package/build/types/types/dist/schemes/events/PermissionOverwriteTargets.d.ts +0 -1
  89. package/build/types/types/dist/schemes/events/PermissionOverwrites.d.ts +0 -1
  90. package/build/types/types/dist/schemes/events/PermissionOverwritesUpdated.d.ts +0 -1
  91. package/build/types/types/dist/schemes/events/RoleDeleted.d.ts +0 -1
  92. package/build/types/types/dist/schemes/events/RoleUpdated.d.ts +0 -1
  93. package/build/types/types/dist/schemes/events/RoomDeleted.d.ts +0 -1
  94. package/build/types/types/dist/schemes/events/RoomJoined.d.ts +0 -1
  95. package/build/types/types/dist/schemes/events/RoomLeft.d.ts +0 -1
  96. package/build/types/types/dist/schemes/events/RoomMemberJoined.d.ts +0 -1
  97. package/build/types/types/dist/schemes/events/RoomMemberLeft.d.ts +0 -1
  98. package/build/types/types/dist/schemes/events/RoomMemberUpdated.d.ts +0 -1
  99. package/build/types/types/dist/schemes/events/RoomMembers.d.ts +0 -1
  100. package/build/types/types/dist/schemes/events/RoomUpdated.d.ts +0 -1
  101. package/build/types/types/dist/schemes/events/Session.d.ts +0 -1
  102. package/build/types/types/dist/schemes/events/SpaceDeleted.d.ts +0 -1
  103. package/build/types/types/dist/schemes/events/SpaceJoined.d.ts +0 -1
  104. package/build/types/types/dist/schemes/events/SpaceLeft.d.ts +0 -1
  105. package/build/types/types/dist/schemes/events/SpaceMemberJoined.d.ts +0 -1
  106. package/build/types/types/dist/schemes/events/SpaceMemberLeft.d.ts +0 -1
  107. package/build/types/types/dist/schemes/events/SpaceMemberUpdated.d.ts +0 -1
  108. package/build/types/types/dist/schemes/events/SpaceMembers.d.ts +0 -1
  109. package/build/types/types/dist/schemes/events/SpaceRooms.d.ts +0 -1
  110. package/build/types/types/dist/schemes/events/SpaceUpdated.d.ts +0 -1
  111. package/build/types/types/dist/schemes/events/TopicDeleted.d.ts +0 -1
  112. package/build/types/types/dist/schemes/events/TopicFollowed.d.ts +0 -1
  113. package/build/types/types/dist/schemes/events/TopicUnfollowed.d.ts +0 -1
  114. package/build/types/types/dist/schemes/events/UserUpdated.d.ts +0 -1
  115. package/src/types/dist/index.d.ts +0 -88
  116. package/src/types/dist/index.js +0 -2
  117. package/src/types/dist/schemes/ChatLocation.d.ts +0 -5
  118. package/src/types/dist/schemes/ChatLocation.js +0 -2
  119. package/src/types/dist/schemes/Envelope.d.ts +0 -5
  120. package/src/types/dist/schemes/Envelope.js +0 -2
  121. package/src/types/dist/schemes/FollowedTopic.d.ts +0 -7
  122. package/src/types/dist/schemes/FollowedTopic.js +0 -2
  123. package/src/types/dist/schemes/Message.d.ts +0 -8
  124. package/src/types/dist/schemes/Message.js +0 -2
  125. package/src/types/dist/schemes/PermissionOverwritesValue.d.ts +0 -4
  126. package/src/types/dist/schemes/PermissionOverwritesValue.js +0 -2
  127. package/src/types/dist/schemes/Role.d.ts +0 -6
  128. package/src/types/dist/schemes/Role.js +0 -2
  129. package/src/types/dist/schemes/Room.d.ts +0 -10
  130. package/src/types/dist/schemes/Room.js +0 -2
  131. package/src/types/dist/schemes/RoomMember.d.ts +0 -7
  132. package/src/types/dist/schemes/RoomMember.js +0 -2
  133. package/src/types/dist/schemes/RoomSummary.d.ts +0 -5
  134. package/src/types/dist/schemes/RoomSummary.js +0 -2
  135. package/src/types/dist/schemes/Space.d.ts +0 -6
  136. package/src/types/dist/schemes/Space.js +0 -2
  137. package/src/types/dist/schemes/SpaceMember.d.ts +0 -5
  138. package/src/types/dist/schemes/SpaceMember.js +0 -2
  139. package/src/types/dist/schemes/Topic.d.ts +0 -9
  140. package/src/types/dist/schemes/Topic.js +0 -2
  141. package/src/types/dist/schemes/User.d.ts +0 -8
  142. package/src/types/dist/schemes/User.js +0 -2
  143. package/src/types/dist/schemes/UserState.d.ts +0 -6
  144. package/src/types/dist/schemes/UserState.js +0 -2
  145. package/src/types/dist/schemes/commands/Ack.js +0 -2
  146. package/src/types/dist/schemes/commands/AssignRole.d.ts +0 -6
  147. package/src/types/dist/schemes/commands/AssignRole.js +0 -2
  148. package/src/types/dist/schemes/commands/CreateMessage.d.ts +0 -5
  149. package/src/types/dist/schemes/commands/CreateMessage.js +0 -2
  150. package/src/types/dist/schemes/commands/CreateOwner.d.ts +0 -5
  151. package/src/types/dist/schemes/commands/CreateOwner.js +0 -2
  152. package/src/types/dist/schemes/commands/CreateRole.d.ts +0 -5
  153. package/src/types/dist/schemes/commands/CreateRole.js +0 -2
  154. package/src/types/dist/schemes/commands/CreateRoom.d.ts +0 -7
  155. package/src/types/dist/schemes/commands/CreateRoom.js +0 -2
  156. package/src/types/dist/schemes/commands/CreateSpace.d.ts +0 -3
  157. package/src/types/dist/schemes/commands/CreateSpace.js +0 -2
  158. package/src/types/dist/schemes/commands/CreateTopic.d.ts +0 -12
  159. package/src/types/dist/schemes/commands/CreateTopic.js +0 -2
  160. package/src/types/dist/schemes/commands/DeassignRole.d.ts +0 -6
  161. package/src/types/dist/schemes/commands/DeassignRole.js +0 -2
  162. package/src/types/dist/schemes/commands/DeleteOwner.d.ts +0 -5
  163. package/src/types/dist/schemes/commands/DeleteOwner.js +0 -2
  164. package/src/types/dist/schemes/commands/DeleteRole.d.ts +0 -4
  165. package/src/types/dist/schemes/commands/DeleteRole.js +0 -2
  166. package/src/types/dist/schemes/commands/DeleteRoom.d.ts +0 -3
  167. package/src/types/dist/schemes/commands/DeleteRoom.js +0 -2
  168. package/src/types/dist/schemes/commands/DeleteSpace.d.ts +0 -3
  169. package/src/types/dist/schemes/commands/DeleteSpace.js +0 -2
  170. package/src/types/dist/schemes/commands/DeleteTopic.d.ts +0 -4
  171. package/src/types/dist/schemes/commands/DeleteTopic.js +0 -2
  172. package/src/types/dist/schemes/commands/FollowTopic.d.ts +0 -4
  173. package/src/types/dist/schemes/commands/FollowTopic.js +0 -2
  174. package/src/types/dist/schemes/commands/GetComputedPermissions.d.ts +0 -4
  175. package/src/types/dist/schemes/commands/GetComputedPermissions.js +0 -2
  176. package/src/types/dist/schemes/commands/GetFollowedTopics.d.ts +0 -4
  177. package/src/types/dist/schemes/commands/GetFollowedTopics.js +0 -2
  178. package/src/types/dist/schemes/commands/GetOwners.d.ts +0 -4
  179. package/src/types/dist/schemes/commands/GetOwners.js +0 -2
  180. package/src/types/dist/schemes/commands/GetPermissionOverwriteTargets.d.ts +0 -4
  181. package/src/types/dist/schemes/commands/GetPermissionOverwriteTargets.js +0 -2
  182. package/src/types/dist/schemes/commands/GetPermissionOverwrites.d.ts +0 -6
  183. package/src/types/dist/schemes/commands/GetPermissionOverwrites.js +0 -2
  184. package/src/types/dist/schemes/commands/GetRoomMembers.d.ts +0 -3
  185. package/src/types/dist/schemes/commands/GetRoomMembers.js +0 -2
  186. package/src/types/dist/schemes/commands/GetSession.d.ts +0 -2
  187. package/src/types/dist/schemes/commands/GetSession.js +0 -2
  188. package/src/types/dist/schemes/commands/GetSpaceMembers.d.ts +0 -3
  189. package/src/types/dist/schemes/commands/GetSpaceMembers.js +0 -2
  190. package/src/types/dist/schemes/commands/GetSpaceRooms.d.ts +0 -3
  191. package/src/types/dist/schemes/commands/GetSpaceRooms.js +0 -2
  192. package/src/types/dist/schemes/commands/JoinRoom.d.ts +0 -3
  193. package/src/types/dist/schemes/commands/JoinRoom.js +0 -2
  194. package/src/types/dist/schemes/commands/JoinSpace.d.ts +0 -3
  195. package/src/types/dist/schemes/commands/JoinSpace.js +0 -2
  196. package/src/types/dist/schemes/commands/LeaveRoom.d.ts +0 -3
  197. package/src/types/dist/schemes/commands/LeaveRoom.js +0 -2
  198. package/src/types/dist/schemes/commands/LeaveSpace.d.ts +0 -3
  199. package/src/types/dist/schemes/commands/LeaveSpace.js +0 -2
  200. package/src/types/dist/schemes/commands/SetPermissionOverwrites.d.ts +0 -8
  201. package/src/types/dist/schemes/commands/SetPermissionOverwrites.js +0 -2
  202. package/src/types/dist/schemes/commands/UnfollowTopic.d.ts +0 -4
  203. package/src/types/dist/schemes/commands/UnfollowTopic.js +0 -2
  204. package/src/types/dist/schemes/commands/UpdateRole.d.ts +0 -7
  205. package/src/types/dist/schemes/commands/UpdateRole.js +0 -2
  206. package/src/types/dist/schemes/commands/UpdateRoom.d.ts +0 -5
  207. package/src/types/dist/schemes/commands/UpdateRoom.js +0 -2
  208. package/src/types/dist/schemes/commands/UpdateSpace.d.ts +0 -4
  209. package/src/types/dist/schemes/commands/UpdateSpace.js +0 -2
  210. package/src/types/dist/schemes/events/Bye.d.ts +0 -3
  211. package/src/types/dist/schemes/events/Bye.js +0 -2
  212. package/src/types/dist/schemes/events/ComputedPermissions.d.ts +0 -5
  213. package/src/types/dist/schemes/events/ComputedPermissions.js +0 -2
  214. package/src/types/dist/schemes/events/Error.d.ts +0 -4
  215. package/src/types/dist/schemes/events/Error.js +0 -2
  216. package/src/types/dist/schemes/events/FollowedTopicUpdated.d.ts +0 -4
  217. package/src/types/dist/schemes/events/FollowedTopicUpdated.js +0 -2
  218. package/src/types/dist/schemes/events/FollowedTopics.d.ts +0 -6
  219. package/src/types/dist/schemes/events/FollowedTopics.js +0 -2
  220. package/src/types/dist/schemes/events/NewMessage.js +0 -2
  221. package/src/types/dist/schemes/events/NewRole.d.ts +0 -5
  222. package/src/types/dist/schemes/events/NewRole.js +0 -2
  223. package/src/types/dist/schemes/events/NewRoom.d.ts +0 -5
  224. package/src/types/dist/schemes/events/NewRoom.js +0 -2
  225. package/src/types/dist/schemes/events/NewTopic.d.ts +0 -5
  226. package/src/types/dist/schemes/events/NewTopic.js +0 -2
  227. package/src/types/dist/schemes/events/Ok.d.ts +0 -2
  228. package/src/types/dist/schemes/events/Ok.js +0 -2
  229. package/src/types/dist/schemes/events/Owners.d.ts +0 -8
  230. package/src/types/dist/schemes/events/Owners.js +0 -2
  231. package/src/types/dist/schemes/events/PermissionOverwriteTargets.d.ts +0 -10
  232. package/src/types/dist/schemes/events/PermissionOverwriteTargets.js +0 -2
  233. package/src/types/dist/schemes/events/PermissionOverwrites.d.ts +0 -8
  234. package/src/types/dist/schemes/events/PermissionOverwrites.js +0 -2
  235. package/src/types/dist/schemes/events/PermissionOverwritesUpdated.d.ts +0 -8
  236. package/src/types/dist/schemes/events/PermissionOverwritesUpdated.js +0 -2
  237. package/src/types/dist/schemes/events/RoleDeleted.d.ts +0 -4
  238. package/src/types/dist/schemes/events/RoleDeleted.js +0 -2
  239. package/src/types/dist/schemes/events/RoleUpdated.d.ts +0 -5
  240. package/src/types/dist/schemes/events/RoleUpdated.js +0 -2
  241. package/src/types/dist/schemes/events/RoomDeleted.d.ts +0 -3
  242. package/src/types/dist/schemes/events/RoomDeleted.js +0 -2
  243. package/src/types/dist/schemes/events/RoomJoined.d.ts +0 -4
  244. package/src/types/dist/schemes/events/RoomJoined.js +0 -2
  245. package/src/types/dist/schemes/events/RoomLeft.d.ts +0 -3
  246. package/src/types/dist/schemes/events/RoomLeft.js +0 -2
  247. package/src/types/dist/schemes/events/RoomMemberJoined.d.ts +0 -5
  248. package/src/types/dist/schemes/events/RoomMemberJoined.js +0 -2
  249. package/src/types/dist/schemes/events/RoomMemberLeft.d.ts +0 -4
  250. package/src/types/dist/schemes/events/RoomMemberLeft.js +0 -2
  251. package/src/types/dist/schemes/events/RoomMemberUpdated.d.ts +0 -6
  252. package/src/types/dist/schemes/events/RoomMemberUpdated.js +0 -2
  253. package/src/types/dist/schemes/events/RoomMembers.d.ts +0 -5
  254. package/src/types/dist/schemes/events/RoomMembers.js +0 -2
  255. package/src/types/dist/schemes/events/RoomUpdated.d.ts +0 -4
  256. package/src/types/dist/schemes/events/RoomUpdated.js +0 -2
  257. package/src/types/dist/schemes/events/Session.d.ts +0 -7
  258. package/src/types/dist/schemes/events/Session.js +0 -2
  259. package/src/types/dist/schemes/events/SpaceDeleted.d.ts +0 -3
  260. package/src/types/dist/schemes/events/SpaceDeleted.js +0 -2
  261. package/src/types/dist/schemes/events/SpaceJoined.d.ts +0 -4
  262. package/src/types/dist/schemes/events/SpaceJoined.js +0 -2
  263. package/src/types/dist/schemes/events/SpaceLeft.d.ts +0 -3
  264. package/src/types/dist/schemes/events/SpaceLeft.js +0 -2
  265. package/src/types/dist/schemes/events/SpaceMemberJoined.d.ts +0 -5
  266. package/src/types/dist/schemes/events/SpaceMemberJoined.js +0 -2
  267. package/src/types/dist/schemes/events/SpaceMemberLeft.d.ts +0 -4
  268. package/src/types/dist/schemes/events/SpaceMemberLeft.js +0 -2
  269. package/src/types/dist/schemes/events/SpaceMemberUpdated.d.ts +0 -6
  270. package/src/types/dist/schemes/events/SpaceMemberUpdated.js +0 -2
  271. package/src/types/dist/schemes/events/SpaceMembers.d.ts +0 -5
  272. package/src/types/dist/schemes/events/SpaceMembers.js +0 -2
  273. package/src/types/dist/schemes/events/SpaceRooms.d.ts +0 -5
  274. package/src/types/dist/schemes/events/SpaceRooms.js +0 -2
  275. package/src/types/dist/schemes/events/SpaceUpdated.d.ts +0 -4
  276. package/src/types/dist/schemes/events/SpaceUpdated.js +0 -2
  277. package/src/types/dist/schemes/events/TopicDeleted.d.ts +0 -4
  278. package/src/types/dist/schemes/events/TopicDeleted.js +0 -2
  279. package/src/types/dist/schemes/events/TopicFollowed.d.ts +0 -4
  280. package/src/types/dist/schemes/events/TopicFollowed.js +0 -2
  281. package/src/types/dist/schemes/events/TopicUnfollowed.d.ts +0 -4
  282. package/src/types/dist/schemes/events/TopicUnfollowed.js +0 -2
  283. package/src/types/dist/schemes/events/UserUpdated.d.ts +0 -4
  284. package/src/types/dist/schemes/events/UserUpdated.js +0 -2
@@ -0,0 +1,257 @@
1
+ import {Message, MessageReference, NewMessage, Room, Session, Topic} from "../types/src";
2
+ import {ChatStateTracker} from "./ChatStateTracker";
3
+ import {ObservableIndexedObjectCollection} from "../IndexedObjectCollection";
4
+
5
+ export enum WindowState {
6
+ UNINITIALIZED,
7
+ LATEST,
8
+ PAST,
9
+ }
10
+
11
+ export abstract class TraversableRemoteCollection<T> extends ObservableIndexedObjectCollection<T> {
12
+ /**
13
+ * Current mode od collection window. To change mode, call one of available fetch methods.
14
+ */
15
+ public get state(): WindowState {
16
+ return this.currentState;
17
+ }
18
+
19
+ /**
20
+ * Maximum numer of items stored in window.
21
+ * Null for unlimited.
22
+ */
23
+ public limit: number | null = 50;
24
+
25
+ private currentState: WindowState = WindowState.UNINITIALIZED;
26
+ private fetchingState: WindowState = undefined;
27
+
28
+ public async resetToLatest(): Promise<void> {
29
+ this.throwIfFetchingInProgress();
30
+
31
+ if (this.currentState === WindowState.LATEST) {
32
+ return;
33
+ }
34
+
35
+ this.fetchingState = WindowState.LATEST;
36
+
37
+ let result;
38
+
39
+ try {
40
+ result = await this.fetchLatestItems();
41
+ } finally {
42
+ this.fetchingState = undefined;
43
+ }
44
+
45
+ this.deleteAll();
46
+ this.addItems(result, 'tail');
47
+ this.currentState = WindowState.LATEST;
48
+ }
49
+
50
+ public async fetchPrevious(): Promise<void> {
51
+ this.throwIfFetchingInProgress();
52
+
53
+ this.fetchingState = WindowState.PAST;
54
+
55
+ let result;
56
+
57
+ try {
58
+ result = await this.fetchItemsBefore();
59
+ } finally {
60
+ this.fetchingState = undefined;
61
+ }
62
+
63
+ if (! result) {
64
+ return this.resetToLatest();
65
+ }
66
+
67
+ if (result.length) {
68
+ this.addItems(result, 'head');
69
+ this.currentState = (await this.isLatestItemLoaded()) ? WindowState.LATEST : WindowState.PAST;
70
+ }
71
+ }
72
+
73
+ public async fetchNext(): Promise<void> {
74
+ this.throwIfFetchingInProgress();
75
+
76
+ let result;
77
+
78
+ try {
79
+ result = await this.fetchItemsAfter();
80
+ } finally {
81
+ this.fetchingState = undefined;
82
+ }
83
+
84
+ if (! result) {
85
+ await this.resetToLatest();
86
+ return;
87
+ }
88
+
89
+ if (result.length) {
90
+ this.addItems(result, 'tail');
91
+ await this.refreshMode();
92
+ }
93
+ }
94
+
95
+ protected abstract fetchLatestItems(): Promise<T[]>;
96
+
97
+ protected abstract fetchItemsBefore(): Promise<T[] | null>;
98
+
99
+ protected abstract fetchItemsAfter(): Promise<T[] | null>;
100
+
101
+ protected abstract isLatestItemLoaded(): Promise<boolean>;
102
+
103
+ protected async refreshMode(): Promise<void> {
104
+ this.currentState = (await this.isLatestItemLoaded()) ? WindowState.LATEST : WindowState.PAST;
105
+ }
106
+
107
+ private throwIfFetchingInProgress(): void {
108
+ if (this.fetchingState) {
109
+ throw new Error(`Items fetching in progress: ${WindowState[this.fetchingState]}`);
110
+ }
111
+ }
112
+
113
+ private addItems(newItems: T[], to: 'head' | 'tail'): void {
114
+ let result;
115
+
116
+ if (to === 'head') {
117
+ result = this.trimItemsArrayToLimit([...newItems, ...this.items], 'tail');
118
+ }
119
+
120
+ if (to === 'tail') {
121
+ result = this.trimItemsArrayToLimit([...this.items, ...newItems], 'head');
122
+ }
123
+
124
+ this.deleteAll();
125
+ this.set(...result);
126
+ }
127
+
128
+ /**
129
+ * Return array with messages of count that matching limit.
130
+ */
131
+ private trimItemsArrayToLimit(items: T[], from: 'head' | 'tail'): T[] {
132
+ if (this.limit === null) {
133
+ return items;
134
+ }
135
+
136
+ if (from === 'head') {
137
+ return items.slice(-this.limit);
138
+ }
139
+
140
+ if (from === 'tail') {
141
+ return items.slice(0, this.limit);
142
+ }
143
+ }
144
+ }
145
+
146
+ export class TopicHistoryWindow extends TraversableRemoteCollection<Message> {
147
+ /**
148
+ * Reexported available window modes enum.
149
+ */
150
+ public readonly WindowState: typeof WindowState = WindowState;
151
+
152
+ public constructor(
153
+ private roomId: string,
154
+ private topicId: string,
155
+ private tracker: ChatStateTracker,
156
+ ) {
157
+ super('id');
158
+ this.tracker.client.on('Session', ev => this.handleSession(ev));
159
+ this.tracker.client.on('NewMessage', ev => this.handleNewMessage(ev));
160
+ }
161
+
162
+ /**
163
+ * For internal use.
164
+ * @internal
165
+ */
166
+ public _setTopicReference(ref: MessageReference): void {
167
+ const refMessage = this.get(ref.messageId);
168
+
169
+ if (refMessage) {
170
+ // Update referenced topic ID in message
171
+ this.set({...refMessage, topicRef: ref.topicId});
172
+ }
173
+ }
174
+
175
+ private async handleNewMessage(ev: NewMessage): Promise<void> {
176
+ if (
177
+ [WindowState.LATEST, WindowState.UNINITIALIZED].includes(this.state)
178
+ && ev.location.roomId === this.roomId
179
+ && ev.location.topicId === this.topicId
180
+ ) {
181
+ this.set(ev.message);
182
+
183
+ if (this.state === WindowState.UNINITIALIZED) {
184
+ await this.refreshMode();
185
+ }
186
+ }
187
+ }
188
+
189
+ private handleSession(ev: Session): void {
190
+ this.resetToLatest();
191
+ }
192
+
193
+ protected async fetchItemsAfter(): Promise<Message[] | null> {
194
+ const afterId = this.getAt(this.length - 1)?.id;
195
+
196
+ if (! afterId) {
197
+ // If there is no message to refer, fetch latest
198
+ return null;
199
+ }
200
+
201
+ const result = await this.tracker.client.send('GetMessages', {
202
+ location: {roomId: this.roomId, topicId: this.topicId},
203
+ after: afterId,
204
+ });
205
+
206
+ if (result.error) {
207
+ throw new Error(`Cannot fetch messages: ${result.error.message}`);
208
+ }
209
+
210
+ return result.data.messages;
211
+ }
212
+
213
+ protected async fetchItemsBefore(): Promise<Message[] | null> {
214
+ const beforeId = this.getAt(0)?.id;
215
+
216
+ if (! beforeId) {
217
+ // If there is no message to refer, fetch latest
218
+ return null;
219
+ }
220
+
221
+ const result = await this.tracker.client.send('GetMessages', {
222
+ location: {roomId: this.roomId, topicId: this.topicId},
223
+ before: beforeId,
224
+ });
225
+
226
+ if (result.error) {
227
+ throw new Error(`Cannot fetch messages: ${result.error.message}`);
228
+ }
229
+
230
+ return result.data.messages;
231
+ }
232
+
233
+ protected async fetchLatestItems(): Promise<Message[]> {
234
+ const result = await this.tracker.client.send('GetMessages', {
235
+ location: {roomId: this.roomId, topicId: this.topicId},
236
+ });
237
+
238
+ if (result.error) {
239
+ throw new Error(`Cannot fetch messages: ${result.error.message}`);
240
+ }
241
+
242
+ return result.data.messages;
243
+ }
244
+
245
+ private async getTopic(): Promise<Topic | undefined> {
246
+ return (await this.tracker.rooms.getTopics(this.roomId, [this.topicId])).get(this.topicId);
247
+ }
248
+
249
+ private async getLatestMessageId(): Promise<string | undefined> {
250
+ return (await this.getTopic())?.lastMessage?.id;
251
+ }
252
+
253
+ protected async isLatestItemLoaded(): Promise<boolean> {
254
+ const lastMessageId = await this.getLatestMessageId();
255
+ return lastMessageId ? this.has(lastMessageId) : false;
256
+ }
257
+ }
@@ -1,5 +1,5 @@
1
1
  import {Envelope} from "./schemes/Envelope";
2
- import {Message} from "./schemes/Message";
2
+ import {Message, MessageType} from "./schemes/Message";
3
3
  import {PermissionOverwritesValue} from "./schemes/PermissionOverwritesValue";
4
4
  import {Role} from "./schemes/Role";
5
5
  import {Room} from "./schemes/Room";
@@ -85,11 +85,16 @@ import {TopicUnfollowed} from "./schemes/events/TopicUnfollowed";
85
85
  import {TopicFollowed} from "./schemes/events/TopicFollowed";
86
86
  import {GetFollowedTopics} from "./schemes/commands/GetFollowedTopics";
87
87
  import {FollowedTopicUpdated} from "./schemes/events/FollowedTopicUpdated";
88
+ import {GetMessages} from "./schemes/commands/GetMessages";
89
+ import {Messages} from "./schemes/events/Messages";
90
+ import {Topics} from "./schemes/events/Topics";
91
+ import {GetTopics} from "./schemes/commands/GetTopics";
88
92
 
89
93
  export {
90
94
  // objects
91
95
  Envelope,
92
96
  Message,
97
+ MessageType,
93
98
  Role,
94
99
  Room,
95
100
  RoomType,
@@ -107,6 +112,7 @@ export {
107
112
  // events
108
113
  Bye,
109
114
  Error,
115
+ Messages,
110
116
  NewMessage,
111
117
  NewRole,
112
118
  NewRoom,
@@ -145,6 +151,7 @@ export {
145
151
  Ok,
146
152
  // commands
147
153
  AssignRole,
154
+ GetMessages,
148
155
  CreateMessage,
149
156
  Ack,
150
157
  CreateRole,
@@ -177,4 +184,6 @@ export {
177
184
  CreateOwner,
178
185
  DeleteOwner,
179
186
  GetOwners,
187
+ Topics,
188
+ GetTopics,
180
189
  };
@@ -4,5 +4,4 @@ export interface FollowedTopic {
4
4
  location: ChatLocation;
5
5
  lastAckMessageId: string | null;
6
6
  missed: number | null;
7
- missedMoreThan: number | null;
8
7
  }
@@ -1,9 +1,16 @@
1
1
  import {User} from "./User";
2
2
 
3
+ export enum MessageType {
4
+ Text = 'Text',
5
+ Join = 'Join',
6
+ Leave = 'Leave',
7
+ }
8
+
3
9
  export interface Message {
4
10
  id: string;
5
11
  createdAt: string;
6
- author: User;
7
- content: string;
12
+ type: MessageType;
13
+ user: User;
14
+ content?: string;
8
15
  topicRef: string | null;
9
16
  }
@@ -0,0 +1,7 @@
1
+ import {ChatLocation} from "../ChatLocation";
2
+
3
+ export interface GetMessages {
4
+ location: ChatLocation;
5
+ before?: string;
6
+ after?: string;
7
+ }
@@ -0,0 +1,4 @@
1
+ export interface GetTopics {
2
+ roomId: string;
3
+ topicIds: string[];
4
+ }
@@ -0,0 +1,7 @@
1
+ import {ChatLocation} from "../ChatLocation";
2
+ import {Message} from "../Message";
3
+
4
+ export interface Messages {
5
+ location: ChatLocation;
6
+ messages: Message[];
7
+ }
@@ -0,0 +1,7 @@
1
+ import {ChatLocation} from "../ChatLocation";
2
+ import {Topic} from "../Topic";
3
+
4
+ export interface Topics {
5
+ location: ChatLocation;
6
+ topics: Topic[];
7
+ }
@@ -0,0 +1,129 @@
1
+ import {TraversableRemoteCollection, WindowState} from "../src/state-tracker/TopicHistoryWindow";
2
+
3
+ interface SimpleMessage {
4
+ id: number;
5
+ }
6
+
7
+ const messages: SimpleMessage[] = [
8
+ {id: 0},
9
+ {id: 1},
10
+ {id: 2},
11
+ {id: 3},
12
+ {id: 4},
13
+ {id: 5},
14
+ {id: 6},
15
+ {id: 7},
16
+ {id: 8},
17
+ {id: 9},
18
+ ];
19
+
20
+ class TestableHistoryWindow extends TraversableRemoteCollection<SimpleMessage> {
21
+ public constructor() {
22
+ super('id');
23
+ }
24
+
25
+ protected async fetchItemsAfter(): Promise<SimpleMessage[]> {
26
+ const after = this.getAt(this.length - 1)?.id;
27
+ if (after === undefined) {
28
+ return null;
29
+ }
30
+ // Return only 3 items
31
+ return messages.slice(after + 1, after + 4);
32
+ }
33
+
34
+ protected async fetchItemsBefore(): Promise<SimpleMessage[]> {
35
+ const before = this.getAt(0)?.id;
36
+ if (before === undefined) {
37
+ return null;
38
+ }
39
+ return messages.slice(Math.max(before - 3, 0), before);
40
+ }
41
+
42
+ protected async fetchLatestItems(): Promise<SimpleMessage[]> {
43
+ return messages.slice(-3);
44
+ }
45
+
46
+ protected async isLatestItemLoaded(): Promise<boolean> {
47
+ return this.has(messages.length - 1);
48
+ }
49
+ }
50
+
51
+ test('history window - fresh instance', async () => {
52
+ const window = new TestableHistoryWindow();
53
+ expect(window.items).toHaveLength(0);
54
+ expect(window.limit).toEqual(50);
55
+ expect(window.state).toEqual(WindowState.UNINITIALIZED);
56
+ });
57
+
58
+ test('history window - traverse back', async () => {
59
+ const window = new TestableHistoryWindow();
60
+ window.limit = 5;
61
+
62
+ await window.fetchPrevious(); // 7,8,9
63
+
64
+ expect(window.state).toEqual(WindowState.LATEST);
65
+ expect(window.items).toHaveLength(3);
66
+ [7,8,9].forEach(id => expect(window.items.map(item => item.id)).toContain(id));
67
+
68
+ await window.fetchPrevious(); // 4,5,6,7,8
69
+
70
+ expect(window.state).toEqual(WindowState.PAST);
71
+ expect(window.items).toHaveLength(5);
72
+ [4,5,6,7,8].forEach(id => expect(window.items.map(item => item.id)).toContain(id));
73
+
74
+ await window.fetchPrevious(); // 1,2,3,4,5
75
+ await window.fetchPrevious(); // 0,1,2,3,4
76
+ await window.fetchPrevious(); // 0,1,2,3,4
77
+
78
+ expect(window.state).toEqual(WindowState.PAST);
79
+ expect(window.items).toHaveLength(5);
80
+ [0,1,2,3,4].forEach(id => expect(window.items.map(item => item.id)).toContain(id));
81
+ });
82
+
83
+ test('history window - traverse forward', async () => {
84
+ const window = new TestableHistoryWindow();
85
+ window.limit = 5;
86
+
87
+ await window.fetchNext();
88
+
89
+ expect(window.state).toEqual(WindowState.LATEST);
90
+ expect(window.items).toHaveLength(3);
91
+ [7,8,9].forEach(id => expect(window.items.map(item => item.id)).toContain(id));
92
+
93
+ await window.fetchPrevious(); // [4,5,6,7,8]
94
+ await window.fetchPrevious(); // [1,2,3,4,5]
95
+ await window.fetchNext(); // [4,5,6,7,8]
96
+
97
+ expect(window.state).toEqual(WindowState.PAST);
98
+ expect(window.items).toHaveLength(5);
99
+ [4,5,6,7,8].forEach(id => expect(window.items.map(item => item.id)).toContain(id));
100
+
101
+ await window.fetchNext();
102
+ await window.fetchNext();
103
+ await window.fetchNext(); // move to latest
104
+
105
+ expect(window.state).toEqual(WindowState.LATEST);
106
+ expect(window.items).toHaveLength(5);
107
+ [5,6,7,8,9].forEach(id => expect(window.items.map(item => item.id)).toContain(id));
108
+ });
109
+
110
+ test('history window - reset to latest', async () => {
111
+ const window = new TestableHistoryWindow();
112
+ window.limit = 5;
113
+
114
+ await window.fetchPrevious();
115
+
116
+ expect(window.state).toEqual(WindowState.LATEST);
117
+
118
+ await window.fetchPrevious();
119
+ await window.fetchPrevious();
120
+ await window.fetchPrevious(); // Move to start
121
+
122
+ expect(window.state).toEqual(WindowState.PAST);
123
+
124
+ await window.resetToLatest();
125
+
126
+ expect(window.state).toEqual(WindowState.LATEST);
127
+ expect(window.items).toHaveLength(3);
128
+ [7,8,9].forEach(id => expect(window.items.map(item => item.id)).toContain(id));
129
+ });
@@ -1 +0,0 @@
1
- export const __esModule: boolean;
@@ -1 +0,0 @@
1
- export const __esModule: boolean;
@@ -1 +0,0 @@
1
- export const __esModule: boolean;
@@ -1 +0,0 @@
1
- export const __esModule: boolean;
@@ -1 +0,0 @@
1
- export const __esModule: boolean;
@@ -1 +0,0 @@
1
- export const __esModule: boolean;
@@ -1 +0,0 @@
1
- export const __esModule: boolean;
@@ -1 +0,0 @@
1
- export const __esModule: boolean;
@@ -1 +0,0 @@
1
- export const __esModule: boolean;
@@ -1 +0,0 @@
1
- export const __esModule: boolean;
@@ -1 +0,0 @@
1
- export const __esModule: boolean;
@@ -1 +0,0 @@
1
- export const __esModule: boolean;
@@ -1 +0,0 @@
1
- export const __esModule: boolean;
@@ -1 +0,0 @@
1
- export const __esModule: boolean;
@@ -1 +0,0 @@
1
- export const __esModule: boolean;
@@ -1 +0,0 @@
1
- export const __esModule: boolean;
@@ -1 +0,0 @@
1
- export const __esModule: boolean;
@@ -1 +0,0 @@
1
- export const __esModule: boolean;
@@ -1 +0,0 @@
1
- export const __esModule: boolean;
@@ -1 +0,0 @@
1
- export const __esModule: boolean;
@@ -1 +0,0 @@
1
- export const __esModule: boolean;
@@ -1 +0,0 @@
1
- export const __esModule: boolean;
@@ -1 +0,0 @@
1
- export const __esModule: boolean;
@@ -1 +0,0 @@
1
- export const __esModule: boolean;
@@ -1 +0,0 @@
1
- export const __esModule: boolean;
@@ -1 +0,0 @@
1
- export const __esModule: boolean;
@@ -1 +0,0 @@
1
- export const __esModule: boolean;
@@ -1 +0,0 @@
1
- export const __esModule: boolean;
@@ -1 +0,0 @@
1
- export const __esModule: boolean;
@@ -1 +0,0 @@
1
- export const __esModule: boolean;
@@ -1 +0,0 @@
1
- export const __esModule: boolean;
@@ -1 +0,0 @@
1
- export const __esModule: boolean;
@@ -1 +0,0 @@
1
- export const __esModule: boolean;
@@ -1 +0,0 @@
1
- export const __esModule: boolean;
@@ -1 +0,0 @@
1
- export const __esModule: boolean;
@@ -1 +0,0 @@
1
- export const __esModule: boolean;
@@ -1 +0,0 @@
1
- export const __esModule: boolean;
@@ -1 +0,0 @@
1
- export const __esModule: boolean;
@@ -1 +0,0 @@
1
- export const __esModule: boolean;
@@ -1 +0,0 @@
1
- export const __esModule: boolean;
@@ -1 +0,0 @@
1
- export const __esModule: boolean;
@@ -1 +0,0 @@
1
- export const __esModule: boolean;
@@ -1 +0,0 @@
1
- export const __esModule: boolean;
@@ -1 +0,0 @@
1
- export const __esModule: boolean;
@@ -1 +0,0 @@
1
- export const __esModule: boolean;
@@ -1 +0,0 @@
1
- export const __esModule: boolean;
@@ -1 +0,0 @@
1
- export const __esModule: boolean;
@@ -1 +0,0 @@
1
- export const __esModule: boolean;
@@ -1 +0,0 @@
1
- export const __esModule: boolean;
@@ -1 +0,0 @@
1
- export const __esModule: boolean;
@@ -1 +0,0 @@
1
- export const __esModule: boolean;
@@ -1 +0,0 @@
1
- export const __esModule: boolean;