polfan-server-js-client 0.2.43 → 0.2.45
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.
- package/.idea/workspace.xml +57 -23
- package/build/index.cjs.js +61 -1
- package/build/index.cjs.js.map +1 -1
- package/build/index.umd.js +1 -1
- package/build/index.umd.js.map +1 -1
- package/build/types/AbstractChatClient.d.ts +8 -1
- package/build/types/state-tracker/ChatStateTracker.d.ts +5 -0
- package/build/types/state-tracker/RelationshipsManager.d.ts +15 -0
- package/build/types/types/src/index.d.ts +7 -1
- package/build/types/types/src/schemes/UserRelationship.d.ts +8 -0
- package/build/types/types/src/schemes/commands/CreateRelationship.d.ts +5 -0
- package/build/types/types/src/schemes/commands/DeleteRelationship.d.ts +5 -0
- package/build/types/types/src/schemes/commands/GetRelationships.d.ts +2 -0
- package/build/types/types/src/schemes/events/NewRelationship.d.ts +4 -0
- package/build/types/types/src/schemes/events/RelationshipDeleted.d.ts +4 -0
- package/build/types/types/src/schemes/events/Relationships.d.ts +4 -0
- package/package.json +1 -1
- package/src/AbstractChatClient.ts +8 -1
- package/src/state-tracker/ChatStateTracker.ts +6 -0
- package/src/state-tracker/RelationshipsManager.ts +68 -0
- package/src/state-tracker/RoomsManager.ts +1 -1
- package/src/types/src/index.ts +13 -0
- package/src/types/src/schemes/UserRelationship.ts +9 -0
- package/src/types/src/schemes/commands/CreateRelationship.ts +6 -0
- package/src/types/src/schemes/commands/DeleteRelationship.ts +6 -0
- package/src/types/src/schemes/commands/GetRelationships.ts +3 -0
- package/src/types/src/schemes/events/NewRelationship.ts +5 -0
- package/src/types/src/schemes/events/RelationshipDeleted.ts +5 -0
- package/src/types/src/schemes/events/Relationships.ts +5 -0
package/build/index.cjs.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs.js","mappings":"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","sources":["webpack://polfan-server-js-client/webpack/bootstrap","webpack://polfan-server-js-client/webpack/runtime/define property getters","webpack://polfan-server-js-client/webpack/runtime/hasOwnProperty shorthand","webpack://polfan-server-js-client/webpack/runtime/make namespace object","webpack://polfan-server-js-client/./src/EventTarget.ts","webpack://polfan-server-js-client/./src/AbstractChatClient.ts","webpack://polfan-server-js-client/./src/IndexedObjectCollection.ts","webpack://polfan-server-js-client/./src/state-tracker/AsyncUtils.ts","webpack://polfan-server-js-client/./src/state-tracker/TopicHistoryWindow.ts","webpack://polfan-server-js-client/./src/state-tracker/RoomMessagesHistory.ts","webpack://polfan-server-js-client/./src/state-tracker/MessagesManager.ts","webpack://polfan-server-js-client/./src/state-tracker/RoomsManager.ts","webpack://polfan-server-js-client/./src/state-tracker/functions.ts","webpack://polfan-server-js-client/./src/state-tracker/SpacesManager.ts","webpack://polfan-server-js-client/./src/Permissions.ts","webpack://polfan-server-js-client/./src/state-tracker/PermissionsManager.ts","webpack://polfan-server-js-client/./src/state-tracker/EmoticonsManager.ts","webpack://polfan-server-js-client/./src/state-tracker/UsersManager.ts","webpack://polfan-server-js-client/./src/state-tracker/ChatStateTracker.ts","webpack://polfan-server-js-client/./src/WebSocketChatClient.ts","webpack://polfan-server-js-client/./src/WebApiChatClient.ts","webpack://polfan-server-js-client/./src/AbstractRestClient.ts","webpack://polfan-server-js-client/./src/AuthClient.ts","webpack://polfan-server-js-client/./src/FilesClient.ts","webpack://polfan-server-js-client/./src/index.ts"],"sourcesContent":["// The require scope\nvar __webpack_require__ = {};\n\n","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","export type EventHandler<EventT> = (ev?: EventT) => void;\r\ntype HandlersMap<EventT> = Map<string, EventHandler<EventT>[]>;\r\n\r\nexport interface ObservableInterface<EventT = any> {\r\n on(eventName: string, handler: EventHandler<EventT>): this;\r\n once(eventName: string, handler: EventHandler<EventT>): this;\r\n off(eventName: string, handler: EventHandler<EventT>): this;\r\n}\r\n\r\nexport class EventTarget<EventT = any> implements ObservableInterface<EventT> {\r\n protected events: HandlersMap<EventT> = new Map<string, EventHandler<EventT>[]>();\r\n protected onceEvents: HandlersMap<EventT> = new Map<string, EventHandler<EventT>[]>();\r\n\r\n public on(eventName: string, handler: EventHandler<EventT>): this {\r\n this.addHandler(this.events, eventName, handler);\r\n return this;\r\n }\r\n\r\n public once(eventName: string, handler: EventHandler<EventT>): this {\r\n this.addHandler(this.onceEvents, eventName, handler);\r\n return this;\r\n }\r\n\r\n public off(eventName: string, handler: EventHandler<EventT>): this {\r\n const index = this.events.get(eventName)?.indexOf(handler);\r\n if (!index || index < 0) {\r\n return this;\r\n }\r\n this.events.get(eventName).splice(index, 1);\r\n return this;\r\n }\r\n\r\n public emit(eventName: string, event?: EventT): this {\r\n this.callHandlers(this.events, eventName, event);\r\n this.callHandlers(this.onceEvents, eventName, event);\r\n this.onceEvents.delete(eventName);\r\n return this;\r\n }\r\n\r\n private addHandler(map: HandlersMap<EventT>, eventName: string, handler: EventHandler<EventT>): void {\r\n const handlers = map.get(eventName) ?? [];\r\n handlers.push(handler);\r\n map.set(eventName, handlers);\r\n }\r\n\r\n private callHandlers(map: HandlersMap<EventT>, eventName: string, event: EventT): void {\r\n map.get(eventName)?.forEach(callback => callback(event));\r\n }\r\n}","import {\r\n Bye,\r\n GetSession,\r\n JoinSpace,\r\n Session,\r\n SpaceJoined,\r\n Error as ErrorType,\r\n SpaceLeft,\r\n SpaceMemberJoined,\r\n SpaceMemberLeft,\r\n SpaceMemberUpdated,\r\n SpaceDeleted,\r\n SpaceMembers,\r\n SpaceRooms,\r\n NewRole,\r\n RoomDeleted,\r\n RoomJoined,\r\n RoomLeft,\r\n RoomMemberLeft,\r\n RoomMemberJoined,\r\n RoomMembers,\r\n NewRoom,\r\n NewTopic,\r\n TopicDeleted,\r\n NewMessage,\r\n GetPermissionOverwrites,\r\n GetComputedPermissions,\r\n LeaveSpace,\r\n CreateSpace,\r\n DeleteSpace,\r\n GetSpaceMembers,\r\n GetSpaceRooms,\r\n CreateRole,\r\n DeleteRole,\r\n AssignRole,\r\n DeassignRole,\r\n SetPermissionOverwrites,\r\n JoinRoom,\r\n LeaveRoom,\r\n CreateRoom,\r\n DeleteRoom,\r\n GetRoomMembers,\r\n CreateTopic,\r\n DeleteTopic,\r\n CreateMessage,\r\n Envelope,\r\n PermissionOverwrites,\r\n PermissionOverwritesUpdated,\r\n RoomMemberUpdated,\r\n UpdateRole,\r\n RoleUpdated,\r\n Ack,\r\n UserUpdated,\r\n UpdateRoom,\r\n RoomUpdated,\r\n UpdateSpace,\r\n SpaceUpdated,\r\n PermissionOverwriteTargets,\r\n GetPermissionOverwriteTargets,\r\n Owners,\r\n Ok,\r\n GetOwners,\r\n CreateOwner,\r\n RoleDeleted,\r\n FollowedTopicUpdated,\r\n TopicFollowed,\r\n TopicUnfollowed,\r\n FollowedTopics,\r\n FollowTopic,\r\n UnfollowTopic,\r\n GetFollowedTopics,\r\n Messages,\r\n GetMessages,\r\n Topics,\r\n GetTopics,\r\n TopicUpdated,\r\n UpdateTopic,\r\n GetDiscoverableSpaces,\r\n DiscoverableSpaces,\r\n CreateEmoticon,\r\n DeleteEmoticon,\r\n GetEmoticons,\r\n Emoticons,\r\n EmoticonDeleted,\r\n NewEmoticon, Bans, GetBans, Ban, Unban, Kick, ClientData, GetClientData, SetClientData,\r\n GetRoomSummary,\r\n GetSpaceSummary,\r\n RoomSummaryEvent,\r\n SpaceSummaryEvent,\r\n SetCustomNick,\r\n} from \"./types/src/index\";\r\nimport {EventTarget} from \"./EventTarget\";\r\n\r\ntype ArrayOfPromiseResolvers = [(value: any) => void, (reason?: any) => void];\r\n\r\nexport abstract class AbstractChatClient extends EventTarget {\r\n protected awaitingResponse: Map<string, ArrayOfPromiseResolvers> = new Map<string, ArrayOfPromiseResolvers>();\r\n protected sentCounter: number = 0;\r\n\r\n public abstract send<CommandType extends keyof CommandsMap>\r\n (commandType: CommandType, commandData: CommandsMap[CommandType][0]): Promise<CommandResult<CommandsMap[CommandType][1]>>;\r\n\r\n public on<EventName extends keyof EventsMap>\r\n (eventName: EventName | string, handler: (event: EventsMap[EventName]) => void): this {\r\n return super.on(eventName, handler);\r\n }\r\n\r\n public once<EventName extends keyof EventsMap>\r\n (eventName: EventName, handler: (event: EventsMap[EventName]) => void): this {\r\n return super.once(eventName, handler);\r\n }\r\n\r\n protected createEnvelope<CommandT>(type: string, data: CommandT): Envelope<CommandT> {\r\n return {\r\n type, data, ref: (++this.sentCounter).toString()\r\n };\r\n }\r\n\r\n protected createPromiseFromCommandEnvelope\r\n <CommandT extends keyof CommandsMap>(envelope: Envelope<CommandsMap[CommandT][0]>):\r\n Promise<CommandResult<CommandsMap[CommandT][1]>> {\r\n return new Promise((...args) =>\r\n this.awaitingResponse.set(envelope.ref as string, args));\r\n }\r\n\r\n protected handleIncomingEnvelope(envelope: Envelope): void {\r\n if (!this.awaitingResponse.has(envelope.ref)) {\r\n return;\r\n }\r\n const isError = envelope.type === 'Error';\r\n this.awaitingResponse.get(envelope.ref)[0]({\r\n data: isError ? null : envelope.data,\r\n error: isError ? envelope.data : null,\r\n } as CommandResult<any>);\r\n this.awaitingResponse.delete(envelope.ref);\r\n }\r\n\r\n protected handleEnvelopeSendError(envelope: Envelope, error: any): void {\r\n if (!this.awaitingResponse.has(envelope.ref)) {\r\n return;\r\n }\r\n this.awaitingResponse.get(envelope.ref)[0](error);\r\n this.awaitingResponse.delete(envelope.ref);\r\n }\r\n}\r\n\r\nexport type CommandResult<ResultT> = {data?: ResultT, error?: ErrorType};\r\n\r\n/**\r\n * Map of incoming events.\r\n */\r\nexport type EventsMap = {\r\n // General Events\r\n Bye: Bye,\r\n Ok: Ok,\r\n Error: ErrorType,\r\n Session: Session,\r\n Permissions: Permissions,\r\n PermissionOverwrites: PermissionOverwrites,\r\n PermissionOverwritesUpdated: PermissionOverwritesUpdated,\r\n PermissionOverwriteTargets: PermissionOverwriteTargets,\r\n Owners: Owners,\r\n NewEmoticon: NewEmoticon,\r\n EmoticonDeleted: EmoticonDeleted,\r\n Emoticons: Emoticons,\r\n Bans: Bans,\r\n ClientData: ClientData,\r\n // Space events\r\n DiscoverableSpaces: DiscoverableSpaces,\r\n SpaceJoined: SpaceJoined,\r\n SpaceLeft: SpaceLeft,\r\n SpaceMemberJoined: SpaceMemberJoined,\r\n SpaceMemberLeft: SpaceMemberLeft,\r\n SpaceMemberUpdated: SpaceMemberUpdated,\r\n SpaceUpdated: SpaceUpdated,\r\n SpaceDeleted: SpaceDeleted,\r\n SpaceMembers: SpaceMembers,\r\n SpaceRooms: SpaceRooms,\r\n NewRole: NewRole,\r\n RoleDeleted: RoleDeleted,\r\n RoleUpdated: RoleUpdated,\r\n SpaceSummaryEvent: SpaceSummaryEvent,\r\n // Room events\r\n RoomJoined: RoomJoined,\r\n RoomLeft: RoomLeft,\r\n RoomMemberJoined: RoomMemberJoined,\r\n RoomMemberLeft: RoomMemberLeft,\r\n RoomMemberUpdated: RoomMemberUpdated,\r\n RoomMembers: RoomMembers,\r\n NewRoom: NewRoom,\r\n RoomDeleted: RoomDeleted,\r\n RoomUpdated: RoomUpdated,\r\n RoomSummaryEvent: RoomSummaryEvent,\r\n // Topic events\r\n NewTopic: NewTopic,\r\n TopicDeleted: TopicDeleted,\r\n NewMessage: NewMessage,\r\n UserUpdated: UserUpdated,\r\n TopicFollowed: TopicFollowed,\r\n TopicUnfollowed: TopicUnfollowed,\r\n FollowedTopics: FollowedTopics,\r\n FollowedTopicUpdated: FollowedTopicUpdated,\r\n Messages: Messages,\r\n Topics: Topics,\r\n TopicUpdated: TopicUpdated,\r\n};\r\n\r\n/**\r\n * Map of commands and their corresponding events.\r\n */\r\nexport type CommandsMap = {\r\n // General commands\r\n GetSession: [GetSession, EventsMap['Session']],\r\n SetPermissionOverwrites: [SetPermissionOverwrites, EventsMap['PermissionOverwritesUpdated']],\r\n GetPermissionOverwrites: [GetPermissionOverwrites, EventsMap['PermissionOverwrites']],\r\n GetComputedPermissions: [GetComputedPermissions, EventsMap['Permissions']],\r\n GetPermissionOverwriteTargets: [GetPermissionOverwriteTargets, EventsMap['PermissionOverwriteTargets']],\r\n GetOwners: [GetOwners, EventsMap['Owners']],\r\n CreateOwner: [CreateOwner, EventsMap['Owners']],\r\n DeleteOwner: [CreateOwner, EventsMap['Owners']],\r\n CreateEmoticon: [CreateEmoticon, EventsMap['NewEmoticon']],\r\n DeleteEmoticon: [DeleteEmoticon, EventsMap['EmoticonDeleted']],\r\n GetEmoticons: [GetEmoticons, EventsMap['Emoticons']],\r\n GetBans: [GetBans, EventsMap['Bans']],\r\n Ban: [Ban, EventsMap['Ok']],\r\n Unban: [Unban, EventsMap['Ok']],\r\n Kick: [Kick, EventsMap['Ok']],\r\n GetClientData: [GetClientData, EventsMap['ClientData']],\r\n SetClientData: [SetClientData, EventsMap['Ok']],\r\n // Space commands\r\n GetDiscoverableSpaces: [GetDiscoverableSpaces, EventsMap['DiscoverableSpaces']],\r\n JoinSpace: [JoinSpace, EventsMap['SpaceJoined']],\r\n LeaveSpace: [LeaveSpace, EventsMap['SpaceLeft']],\r\n CreateSpace: [CreateSpace, EventsMap['SpaceJoined']],\r\n UpdateSpace: [UpdateSpace, EventsMap['SpaceUpdated']],\r\n DeleteSpace: [DeleteSpace, EventsMap['SpaceDeleted']],\r\n GetSpaceMembers: [GetSpaceMembers, EventsMap['SpaceMembers']],\r\n GetSpaceRooms: [GetSpaceRooms, EventsMap['SpaceRooms']],\r\n CreateRole: [CreateRole, EventsMap['NewRole']],\r\n DeleteRole: [DeleteRole, EventsMap['RoleDeleted']],\r\n UpdateRole: [UpdateRole, EventsMap['RoleUpdated']],\r\n AssignRole: [AssignRole, EventsMap['SpaceMemberUpdated'] | EventsMap['RoomMemberUpdated']],\r\n DeassignRole: [DeassignRole, EventsMap['SpaceMemberUpdated'] | EventsMap['RoomMemberUpdated']],\r\n GetSpaceSummary: [GetSpaceSummary, EventsMap['SpaceSummaryEvent']],\r\n SetCustomNick: [SetCustomNick, EventsMap['SpaceMemberUpdated']],\r\n // Room commands\r\n JoinRoom: [JoinRoom, EventsMap['RoomJoined']],\r\n LeaveRoom: [LeaveRoom, EventsMap['RoomLeft']],\r\n CreateRoom: [CreateRoom, EventsMap['RoomJoined']],\r\n DeleteRoom: [DeleteRoom, EventsMap['RoomDeleted']],\r\n UpdateRoom: [UpdateRoom, EventsMap['RoomUpdated']],\r\n GetRoomMembers: [GetRoomMembers, EventsMap['RoomMembers']],\r\n GetRoomSummary: [GetRoomSummary, EventsMap['RoomSummaryEvent']],\r\n // Topic commands\r\n CreateTopic: [CreateTopic, EventsMap['NewTopic']],\r\n DeleteTopic: [DeleteTopic, EventsMap['TopicDeleted']],\r\n CreateMessage: [CreateMessage, EventsMap['NewMessage']],\r\n Ack: [Ack, EventsMap['FollowedTopicUpdated'] | EventsMap['Ok']],\r\n FollowTopic: [FollowTopic, EventsMap['TopicFollowed']],\r\n UnfollowTopic: [UnfollowTopic, EventsMap['TopicUnfollowed']],\r\n GetFollowedTopics: [GetFollowedTopics, EventsMap['FollowedTopics']],\r\n GetMessages: [GetMessages, EventsMap['Messages']],\r\n GetTopics: [GetTopics, EventsMap['Topics']],\r\n UpdateTopic: [UpdateTopic, EventsMap['TopicUpdated']],\r\n}","import {EventTarget, ObservableInterface} from \"./EventTarget\";\r\n\r\nexport class IndexedCollection<KeyT, ValueT> {\r\n protected _items: Map<KeyT, ValueT> = new Map();\r\n protected _mutationCounter: number = 0;\r\n\r\n public constructor(items: [key: KeyT, value: ValueT][] = []) {\r\n this.set(...items);\r\n }\r\n\r\n public get mutationCounter(): number {\r\n return this._mutationCounter;\r\n }\r\n\r\n public get items(): Map<KeyT, ValueT> {\r\n return this._items;\r\n }\r\n\r\n public get length(): number {\r\n return this._items.size;\r\n }\r\n\r\n public set(...items: [KeyT, ValueT][]): void {\r\n this._mutationCounter++;\r\n for (const item of items) {\r\n this._items.set(item[0], item[1]);\r\n }\r\n }\r\n\r\n public get(id: KeyT): ValueT | undefined {\r\n return this.items.get(id);\r\n }\r\n\r\n public has(id: KeyT): boolean {\r\n return this.items.has(id);\r\n }\r\n\r\n public delete(...ids: KeyT[]): void {\r\n for (const id of ids) {\r\n this.items.delete(id);\r\n }\r\n }\r\n\r\n public deleteAll(): void {\r\n this.items.clear();\r\n }\r\n\r\n public findBy(field: keyof ValueT, valueToFind: any, limit: number = null): IndexedCollection<KeyT, ValueT> {\r\n const result = new IndexedCollection<KeyT, ValueT>();\r\n let item;\r\n while (!(item = this.items.entries().next().value).done) {\r\n if (limit && result.length === limit) {\r\n break;\r\n }\r\n if (item[1][field] === valueToFind) {\r\n result.set(item);\r\n }\r\n }\r\n return result;\r\n }\r\n}\r\n\r\nexport class IndexedObjectCollection<T> {\r\n protected _items: IndexedCollection<string, T>;\r\n\r\n public constructor(\r\n public readonly id: keyof T | ((item: T) => any),\r\n items: T[] = [],\r\n ) {\r\n this._items = new IndexedCollection<string, T>();\r\n this.set(...items);\r\n }\r\n\r\n public get items(): T[] {\r\n return Array.from(this._items.items.values());\r\n }\r\n\r\n public get length(): number {\r\n return this._items.length;\r\n }\r\n\r\n public get mutationCounter(): number {\r\n return this._items.mutationCounter;\r\n }\r\n\r\n public set(...items: T[]): void {\r\n this._items.set(...(items.map(item => [this.getId(item), item] as [string, T])));\r\n }\r\n\r\n public get(id: any): T | undefined {\r\n return this._items.get(id);\r\n }\r\n\r\n public getAt(index: number): T | undefined {\r\n return this.items[index];\r\n }\r\n\r\n public has(id: any): boolean {\r\n return this._items.has(id);\r\n }\r\n\r\n public delete(...ids: any[]): void {\r\n this._items.delete(...ids);\r\n }\r\n\r\n public deleteAll(): void {\r\n this._items.deleteAll();\r\n }\r\n\r\n public findBy(field: keyof T, valueToFind: any, limit: number = null): IndexedObjectCollection<T> {\r\n const result = new IndexedObjectCollection<T>(this.id);\r\n for (const value of this.items) {\r\n if (limit && result.length === limit) {\r\n break;\r\n }\r\n if (value[field] === valueToFind) {\r\n result.set(value);\r\n }\r\n }\r\n return result;\r\n }\r\n\r\n protected getId(item: T): any {\r\n return typeof this.id === 'function' ? this.id(item) : item[this.id];\r\n }\r\n}\r\n\r\ninterface ObservableCollectionEvent<KeyT> {\r\n setItems?: KeyT[],\r\n deletedItems?: KeyT[],\r\n}\r\n\r\nexport class ObservableIndexedCollection<KeyT, ValueT> extends IndexedCollection<KeyT, ValueT> implements ObservableInterface {\r\n protected eventTarget: EventTarget<ObservableCollectionEvent<KeyT>>;\r\n\r\n public constructor(items: [key: KeyT, value: ValueT][] = []) {\r\n super();\r\n this.eventTarget = new EventTarget<ObservableCollectionEvent<KeyT>>();\r\n this.set(...items);\r\n }\r\n\r\n public set(...items: [KeyT, ValueT][]) {\r\n if (items.length) {\r\n super.set(...items);\r\n this.eventTarget.emit('change', {setItems: items.map(item => item[0])});\r\n }\r\n }\r\n\r\n public delete(...ids: KeyT[]) {\r\n if (ids.length) {\r\n super.delete(...ids);\r\n this.eventTarget.emit('change', {deletedItems: ids});\r\n }\r\n }\r\n\r\n public deleteAll() {\r\n if (this.length) {\r\n const ids = this._items.keys();\r\n super.deleteAll();\r\n this.eventTarget.emit('change', {deletedItems: Array.from(ids)});\r\n }\r\n }\r\n\r\n public on(eventName: 'change', handler: (ev?: ObservableCollectionEvent<KeyT>) => void): this {\r\n this.eventTarget.on(eventName, handler);\r\n return this;\r\n }\r\n\r\n public once(eventName: 'change', handler: (ev?: ObservableCollectionEvent<KeyT>) => void): this {\r\n this.eventTarget.once(eventName, handler);\r\n return this;\r\n }\r\n\r\n public off(eventName: string, handler: (ev?: ObservableCollectionEvent<KeyT>) => void): this {\r\n this.eventTarget.off(eventName, handler);\r\n return this;\r\n }\r\n}\r\n\r\nexport class ObservableIndexedObjectCollection<T> extends IndexedObjectCollection<T> implements ObservableInterface {\r\n protected eventTarget: EventTarget<ObservableCollectionEvent<string>>;\r\n\r\n public constructor(\r\n public readonly id: keyof T | ((item: T) => string),\r\n items: T[] = [],\r\n ) {\r\n super(id);\r\n this.eventTarget = new EventTarget();\r\n this.set(...items);\r\n }\r\n\r\n public set(...items: T[]) {\r\n if (items.length) {\r\n super.set(...items);\r\n this.eventTarget.emit('change', {setItems: items.map(item => this.getId(item))});\r\n }\r\n }\r\n\r\n public delete(...ids: string[]) {\r\n if (ids.length) {\r\n super.delete(...ids);\r\n this.eventTarget.emit('change', {deletedItems: ids});\r\n }\r\n }\r\n\r\n public deleteAll() {\r\n if (this.length) {\r\n const ids = this._items.items.keys();\r\n super.deleteAll();\r\n this.eventTarget.emit('change', {deletedItems: Array.from(ids)});\r\n }\r\n }\r\n\r\n public on(eventName: 'change', handler: (ev?: ObservableCollectionEvent<string>) => void): this {\r\n this.eventTarget.on(eventName, handler);\r\n return this;\r\n }\r\n\r\n public once(eventName: 'change', handler: (ev?: ObservableCollectionEvent<string>) => void): this {\r\n this.eventTarget.once(eventName, handler);\r\n return this;\r\n }\r\n\r\n public off(eventName: string, handler: (ev?: ObservableCollectionEvent<string>) => void): this {\r\n this.eventTarget.off(eventName, handler);\r\n return this;\r\n }\r\n}","import {IndexedCollection} from \"../IndexedObjectCollection\";\r\n\r\nexport class DeferredTask {\r\n public readonly promise: Promise<void>;\r\n public resolve: () => void;\r\n\r\n public constructor() {\r\n this.promise = new Promise<void>((resolve) => this.resolve = resolve);\r\n }\r\n}\r\n\r\nexport class PromiseRegistry {\r\n private promises = new IndexedCollection<string, Promise<any>>();\r\n\r\n public register<T = any>(promise: Promise<T>, key: string): void {\r\n this.promises.set([key, promise]);\r\n }\r\n\r\n public registerByFunction(fn: () => Promise<any>, key: string): void {\r\n this.register(fn(), key);\r\n }\r\n\r\n public get<T = any>(key: string): Promise<T> | undefined {\r\n return this.promises.get(key);\r\n }\r\n\r\n public has(key: string): boolean {\r\n return this.promises.has(key);\r\n }\r\n\r\n public notExist(key: string): boolean {\r\n return ! this.has(key);\r\n }\r\n\r\n public forget(...keys: string[]): void {\r\n this.promises.delete(...keys);\r\n }\r\n\r\n public forgetAll(): void {\r\n this.promises.deleteAll();\r\n }\r\n}","import {Message, NewMessage, Session, Topic} from \"../types/src\";\r\nimport {ChatStateTracker} from \"./ChatStateTracker\";\r\nimport {ObservableIndexedObjectCollection} from \"../IndexedObjectCollection\";\r\n\r\nexport enum WindowState {\r\n /**\r\n * The latest messages (those received live) are available in the history window, history has not been fetched.\r\n */\r\n LIVE,\r\n\r\n /**\r\n * The latest messages has been fetched and are available in the history window.\r\n */\r\n LATEST,\r\n\r\n /**\r\n * The historical messages have been fetched and are available in the history window.\r\n * Latest messages are not available and will not be available.\r\n */\r\n PAST,\r\n\r\n /**\r\n * The oldest messages have been fetched and are available in the history window.\r\n * Next attempts to fetch previous messages will result with no-op.\r\n */\r\n OLDEST,\r\n}\r\n\r\nexport abstract class TraversableRemoteCollection<T> extends ObservableIndexedObjectCollection<T> {\r\n /**\r\n * Current mode od collection window. To change mode, call one of available fetch methods.\r\n */\r\n public get state(): WindowState {\r\n return this.currentState;\r\n }\r\n\r\n /**\r\n * Maximum numer of items stored in window.\r\n * Null for unlimited.\r\n */\r\n public limit: number | null = 50;\r\n\r\n private currentState: WindowState = WindowState.LIVE;\r\n private fetchingState: WindowState = undefined;\r\n public oldestId: string = null;\r\n\r\n public get hasLatest(): boolean {\r\n return [WindowState.LATEST, WindowState.LIVE].includes(this.state);\r\n }\r\n\r\n public get hasOldest(): boolean {\r\n return this.state === WindowState.OLDEST || this.oldestId !== null && this.has(this.oldestId);\r\n }\r\n\r\n public async resetToLatest(): Promise<void> {\r\n if (this.fetchingState || this.currentState === WindowState.LATEST) {\r\n return;\r\n }\r\n\r\n this.fetchingState = WindowState.LATEST;\r\n\r\n let result;\r\n\r\n try {\r\n result = await this.fetchLatestItems();\r\n } finally {\r\n this.fetchingState = undefined;\r\n }\r\n\r\n this.deleteAll();\r\n this.addItems(result, 'tail');\r\n this.currentState = WindowState.LATEST;\r\n }\r\n\r\n public async fetchPrevious(): Promise<void> {\r\n if (this.fetchingState || this.hasOldest) {\r\n return;\r\n }\r\n\r\n this.fetchingState = WindowState.PAST;\r\n\r\n let result;\r\n\r\n try {\r\n result = await this.fetchItemsBefore();\r\n } finally {\r\n this.fetchingState = undefined;\r\n }\r\n\r\n if (! result) {\r\n return this.resetToLatest();\r\n }\r\n\r\n if (! result.length) {\r\n const firstItem = this.getAt(0);\r\n this.oldestId = firstItem ? this.getId(firstItem) : null;\r\n\r\n await this.refreshFetchedState();\r\n\r\n // LATEST state has priority over OLDEST\r\n if (this.currentState === WindowState.PAST) {\r\n this.currentState = WindowState.OLDEST;\r\n }\r\n\r\n return;\r\n }\r\n\r\n this.addItems(result, 'head');\r\n await this.refreshFetchedState();\r\n }\r\n\r\n public async fetchNext(): Promise<void> {\r\n if (this.fetchingState || this.hasLatest) {\r\n return;\r\n }\r\n\r\n this.fetchingState = WindowState.PAST;\r\n\r\n let result;\r\n\r\n try {\r\n result = await this.fetchItemsAfter();\r\n } finally {\r\n this.fetchingState = undefined;\r\n }\r\n\r\n if (! result) {\r\n await this.resetToLatest();\r\n return;\r\n }\r\n\r\n if (result.length) {\r\n this.addItems(result, 'tail');\r\n await this.refreshFetchedState();\r\n return;\r\n }\r\n }\r\n\r\n protected abstract fetchLatestItems(): Promise<T[]>;\r\n\r\n protected abstract fetchItemsBefore(): Promise<T[] | null>;\r\n\r\n protected abstract fetchItemsAfter(): Promise<T[] | null>;\r\n\r\n protected abstract isLatestItemLoaded(): Promise<boolean>;\r\n\r\n protected async refreshFetchedState(): Promise<void> {\r\n this.currentState = (await this.isLatestItemLoaded()) ? WindowState.LATEST : WindowState.PAST;\r\n }\r\n\r\n protected addItems(newItems: T[], to: 'head' | 'tail'): void {\r\n let result;\r\n\r\n if (to === 'head') {\r\n result = this.trimItemsArrayToLimit([...newItems, ...this.items], 'tail');\r\n }\r\n\r\n if (to === 'tail') {\r\n result = this.trimItemsArrayToLimit([...this.items, ...newItems], 'head');\r\n }\r\n\r\n this.deleteAll();\r\n this.set(...result);\r\n }\r\n\r\n /**\r\n * Return array with messages of count that matching limit.\r\n */\r\n private trimItemsArrayToLimit(items: T[], from: 'head' | 'tail'): T[] {\r\n if (this.limit === null) {\r\n return items;\r\n }\r\n\r\n if (from === 'head') {\r\n return items.slice(-this.limit);\r\n }\r\n\r\n if (from === 'tail') {\r\n return items.slice(0, this.limit);\r\n }\r\n }\r\n}\r\n\r\nexport class TopicHistoryWindow extends TraversableRemoteCollection<Message> {\r\n /**\r\n * Reexported available window modes enum.\r\n */\r\n public readonly WindowState: typeof WindowState = WindowState;\r\n\r\n public constructor(\r\n private roomId: string,\r\n private topicId: string,\r\n private tracker: ChatStateTracker,\r\n ) {\r\n super('id');\r\n this.tracker.client.on('Session', ev => this.handleSession(ev));\r\n this.tracker.client.on('NewMessage', ev => this.handleNewMessage(ev));\r\n }\r\n\r\n /**\r\n * For internal use.\r\n * @internal\r\n */\r\n public _updateMessageReference(refTopic: Topic): void {\r\n const refMessage = this.get(refTopic.refMessage.id);\r\n\r\n if (refMessage) {\r\n // Update referenced topic ID in message\r\n this.set({...refMessage, topicRef: refTopic.id});\r\n }\r\n }\r\n\r\n private async handleNewMessage(ev: NewMessage): Promise<void> {\r\n if (\r\n [WindowState.LATEST, WindowState.LIVE].includes(this.state)\r\n && ev.message.location.roomId === this.roomId\r\n && ev.message.location.topicId === this.topicId\r\n ) {\r\n this.addItems([ev.message], 'tail');\r\n }\r\n }\r\n\r\n private handleSession(ev: Session): void {\r\n const rooms = ev.state.rooms;\r\n\r\n if (rooms.find(room => room.id === this.roomId)) {\r\n this.resetToLatest();\r\n } else {\r\n this.deleteAll();\r\n }\r\n }\r\n\r\n protected async fetchItemsAfter(): Promise<Message[] | null> {\r\n const afterId = this.getAt(this.length - 1)?.id;\r\n\r\n if (! afterId) {\r\n // If there is no message to refer, fetch latest\r\n return null;\r\n }\r\n\r\n const result = await this.tracker.client.send('GetMessages', {\r\n location: {roomId: this.roomId, topicId: this.topicId},\r\n after: afterId,\r\n });\r\n\r\n if (result.error) {\r\n throw new Error(`Cannot fetch messages: ${result.error.message}`);\r\n }\r\n\r\n return result.data.messages;\r\n }\r\n\r\n protected async fetchItemsBefore(): Promise<Message[] | null> {\r\n const beforeId = this.getAt(0)?.id;\r\n\r\n if (! beforeId) {\r\n // If there is no message to refer, fetch latest\r\n return null;\r\n }\r\n\r\n const result = await this.tracker.client.send('GetMessages', {\r\n location: {roomId: this.roomId, topicId: this.topicId},\r\n before: beforeId,\r\n });\r\n\r\n if (result.error) {\r\n throw new Error(`Cannot fetch messages: ${result.error.message}`);\r\n }\r\n\r\n return result.data.messages;\r\n }\r\n\r\n protected async fetchLatestItems(): Promise<Message[]> {\r\n const result = await this.tracker.client.send('GetMessages', {\r\n location: {roomId: this.roomId, topicId: this.topicId},\r\n });\r\n\r\n if (result.error) {\r\n throw new Error(`Cannot fetch messages: ${result.error.message}`);\r\n }\r\n\r\n return result.data.messages;\r\n }\r\n\r\n private async getTopic(): Promise<Topic | undefined> {\r\n return (await this.tracker.rooms.getTopics(this.roomId, [this.topicId])).get(this.topicId);\r\n }\r\n\r\n private async getLatestMessageId(): Promise<string | undefined> {\r\n return (await this.getTopic())?.lastMessage?.id;\r\n }\r\n\r\n protected async isLatestItemLoaded(): Promise<boolean> {\r\n const lastMessageId = await this.getLatestMessageId();\r\n return lastMessageId ? this.has(lastMessageId) : true;\r\n }\r\n}","import {ChatStateTracker} from \"./ChatStateTracker\";\r\nimport {NewTopic, Room, RoomUpdated, Topic, TopicDeleted} from \"../types/src\";\r\nimport {IndexedCollection,} from \"../IndexedObjectCollection\";\r\nimport {TopicHistoryWindow} from \"./TopicHistoryWindow\";\r\n\r\nexport class RoomMessagesHistory {\r\n private historyWindows = new IndexedCollection<string, TopicHistoryWindow>();\r\n\r\n public constructor(\r\n private room: Room,\r\n private tracker: ChatStateTracker,\r\n ) {\r\n this.tracker.client.on('RoomUpdated', ev => this.handleRoomUpdated(ev));\r\n this.tracker.client.on('NewTopic', ev => this.handleNewTopic(ev));\r\n this.tracker.client.on('TopicDeleted', ev => this.handleTopicDeleted(ev));\r\n\r\n if (this.room.defaultTopic) {\r\n this.createHistoryWindowForTopic(this.room.defaultTopic);\r\n }\r\n }\r\n\r\n /**\r\n * Returns a history window object for the given topic ID, allowing you to view message history.\r\n */\r\n public async getMessagesWindow(topicId: string): Promise<TopicHistoryWindow | undefined> {\r\n let historyWindow = this.historyWindows.get(topicId);\r\n\r\n if (! historyWindow) {\r\n const topic = (await this.tracker.rooms.getTopics(this.room.id, [topicId])).get(topicId);\r\n\r\n if (topic) {\r\n this.createHistoryWindowForTopic(topic);\r\n }\r\n }\r\n\r\n return this.historyWindows.get(topicId);\r\n }\r\n\r\n private handleRoomUpdated(ev: RoomUpdated): void {\r\n if (this.room.id === ev.room.id) {\r\n this.room = ev.room;\r\n\r\n if (ev.room.defaultTopic) {\r\n this.createHistoryWindowForTopic(ev.room.defaultTopic);\r\n }\r\n }\r\n }\r\n\r\n private handleNewTopic(ev: NewTopic): void {\r\n if (this.room.id === ev.roomId) {\r\n this.createHistoryWindowForTopic(ev.topic);\r\n }\r\n }\r\n\r\n private handleTopicDeleted(ev: TopicDeleted): void {\r\n if (this.room.id === ev.location.roomId) {\r\n this.historyWindows.delete(ev.location.topicId);\r\n }\r\n }\r\n\r\n private createHistoryWindowForTopic(topic: Topic): void {\r\n if (this.historyWindows.has(topic.id)) {\r\n return;\r\n }\r\n\r\n this.historyWindows.set([topic.id, new TopicHistoryWindow(this.room.id, topic.id, this.tracker)]);\r\n\r\n // If new topic refers to some message from this room, update other structures\r\n if (topic.refMessage) {\r\n const refHistoryWindow = this.historyWindows.get(topic.refMessage.location.topicId);\r\n refHistoryWindow?._updateMessageReference(topic);\r\n }\r\n }\r\n}","import {ChatStateTracker} from \"./ChatStateTracker\";\r\nimport {\r\n ChatLocation,\r\n NewMessage,\r\n FollowedTopic,\r\n TopicFollowed,\r\n TopicUnfollowed,\r\n RoomDeleted,\r\n RoomLeft,\r\n TopicDeleted,\r\n FollowedTopicUpdated, RoomJoined, NewTopic, Session, Room, MessageType,\r\n} from \"../types/src\";\r\nimport {\r\n IndexedCollection,\r\n ObservableIndexedObjectCollection\r\n} from \"../IndexedObjectCollection\";\r\nimport {DeferredTask, PromiseRegistry} from \"./AsyncUtils\";\r\nimport {RoomMessagesHistory} from \"./RoomMessagesHistory\";\r\n\r\nexport class MessagesManager {\r\n private readonly roomHistories = new IndexedCollection<string, RoomMessagesHistory>();\r\n private readonly followedTopics = new IndexedCollection<string, ObservableIndexedObjectCollection<FollowedTopic>>();\r\n private readonly followedTopicsPromises = new PromiseRegistry();\r\n private readonly deferredSession = new DeferredTask();\r\n\r\n public constructor(private tracker: ChatStateTracker) {\r\n this.tracker.client.on('Session', ev => this.handleSession(ev));\r\n this.tracker.client.on('RoomJoined', ev => this.handleRoomJoin(ev));\r\n this.tracker.client.on('NewTopic', ev => this.handleNewTopic(ev));\r\n this.tracker.client.on('FollowedTopicUpdated', ev => this.handleFollowedTopicUpdated(ev));\r\n this.tracker.client.on('TopicFollowed', ev => this.handleTopicFollowed(ev));\r\n this.tracker.client.on('TopicUnfollowed', ev => this.handleTopicUnfollowed(ev));\r\n this.tracker.client.on('NewMessage', ev => this.handleNewMessage(ev));\r\n this.tracker.client.on('RoomDeleted', ev => this.handleRoomDeleted(ev));\r\n this.tracker.client.on('RoomLeft', ev => this.handleRoomLeft(ev));\r\n this.tracker.client.on('TopicDeleted', ev => this.handleTopicDeleted(ev));\r\n }\r\n\r\n /**\r\n * Get history manager for given room ID.\r\n */\r\n public async getRoomHistory(roomId: string): Promise<RoomMessagesHistory | undefined> {\r\n await this.deferredSession.promise;\r\n return this.roomHistories.get(roomId);\r\n }\r\n\r\n /**\r\n * Cache followed topics for all joined rooms in a space and fetch them in bulk if necessary.\r\n * Then you can get them using getRoomFollowedTopics().\r\n * @see getRoomFollowedTopics\r\n */\r\n public async cacheSpaceFollowedTopics(spaceId: string | null): Promise<void> {\r\n if (spaceId && ! (await this.tracker.spaces.get()).has(spaceId)) {\r\n throw new Error(`You are not in space ${spaceId}`);\r\n }\r\n\r\n const roomIds = (await this.tracker.rooms.get()).findBy('spaceId', spaceId).items.map(room => room.id);\r\n\r\n if (! roomIds.length) {\r\n // We don't need to ping server for followed topics for this space, if user has no joined rooms\r\n return;\r\n }\r\n\r\n const resultPromise = this.tracker.client.send('GetFollowedTopics', {location: {spaceId}});\r\n\r\n roomIds.forEach(roomId => this.followedTopicsPromises.register(resultPromise, roomId));\r\n\r\n const result = await resultPromise;\r\n\r\n if (result.error) {\r\n throw result.error;\r\n }\r\n\r\n this.setFollowedTopicsArray(roomIds, result.data.followedTopics);\r\n }\r\n\r\n /**\r\n * Get followed topics for the given room.\r\n * @return Undefined if you are not in the room, collection otherwise.\r\n */\r\n public async getRoomFollowedTopics(roomId: string): Promise<ObservableIndexedObjectCollection<FollowedTopic> | undefined> {\r\n if (! (await this.tracker.rooms.get()).has(roomId)) {\r\n return undefined;\r\n }\r\n\r\n if (! this.followedTopics.has(roomId)) {\r\n if (this.followedTopicsPromises.notExist(roomId)) {\r\n this.followedTopicsPromises.registerByFunction(async () => {\r\n const result = await this.tracker.client.send('GetFollowedTopics', {location: {roomId}});\r\n\r\n if (result.error) {\r\n throw result.error;\r\n }\r\n\r\n this.setFollowedTopicsArray([roomId], result.data.followedTopics);\r\n }, roomId);\r\n }\r\n\r\n await this.followedTopicsPromises.get(roomId);\r\n }\r\n\r\n return this.followedTopics.get(roomId);\r\n }\r\n\r\n /**\r\n * Batch acknowledge all missed messages from any topics in given room.\r\n */\r\n public async ackRoomFollowedTopics(roomId: string): Promise<void> {\r\n const collection = await this.getRoomFollowedTopics(roomId);\r\n\r\n if (! collection) {\r\n return;\r\n }\r\n\r\n for (const followedTopic of collection.items) {\r\n if (followedTopic.missed) {\r\n await this.tracker.client.send('Ack', {location: followedTopic.location});\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Calculate missed messages from any topic in given room.\r\n * @return Undefined if you are not in room.\r\n */\r\n public async calculateRoomMissedMessages(roomId: string): Promise<number | undefined> {\r\n const collection = await this.getRoomFollowedTopics(roomId);\r\n\r\n if (collection) {\r\n return collection.items.reduce(\r\n (previousValue, currentValue) => previousValue + (currentValue.missed ?? 0),\r\n 0,\r\n );\r\n }\r\n\r\n return undefined;\r\n }\r\n\r\n /**\r\n * For internal use. If you want to delete the message, execute a proper command on client object.\r\n * @internal\r\n */\r\n public _deleteByTopicIds(roomId: string, ...topicIds: string[]): void {\r\n this.followedTopics.get(roomId)?.delete(...topicIds);\r\n }\r\n\r\n private createHistoryForNewRoom(room: Room): void {\r\n this.roomHistories.set([room.id, new RoomMessagesHistory(room, this.tracker)]);\r\n }\r\n\r\n private handleNewMessage(ev: NewMessage): void {\r\n this.updateLocallyFollowedTopicOnNewMessage(ev);\r\n }\r\n\r\n private handleFollowedTopicUpdated(ev: FollowedTopicUpdated): void {\r\n this.followedTopics.get(ev.followedTopic.location.roomId)?.set(ev.followedTopic);\r\n }\r\n\r\n private handleTopicFollowed(ev: TopicFollowed): void {\r\n this.setFollowedTopicsArray([ev.followedTopic.location.roomId], [ev.followedTopic]);\r\n }\r\n\r\n private handleTopicUnfollowed(ev: TopicUnfollowed): void {\r\n this.followedTopics.get(ev.location.roomId)?.delete(ev.location.topicId);\r\n }\r\n\r\n private handleRoomDeleted(ev: RoomDeleted): void {\r\n this.roomHistories.delete(ev.id);\r\n this.clearRoomFollowedTopicsStructures(ev.id);\r\n }\r\n\r\n private handleRoomJoin(ev: RoomJoined): void {\r\n this.createHistoryForNewRoom(ev.room)\r\n this.clearRoomFollowedTopicsStructures(ev.room.id);\r\n }\r\n\r\n private handleRoomLeft(ev: RoomLeft): void {\r\n this.roomHistories.delete(ev.id);\r\n this.clearRoomFollowedTopicsStructures(ev.id);\r\n }\r\n\r\n private async handleNewTopic(ev: NewTopic): Promise<void> {\r\n if (this.followedTopics.has(ev.roomId)) {\r\n // Check if the new topic is followed by user\r\n // only if client asked for followed topics list before for this room\r\n const result = await this.tracker.client.send(\r\n 'GetFollowedTopics',\r\n {location: {roomId: ev.roomId, topicId: ev.topic.id}},\r\n );\r\n const followedTopic = result.data.followedTopics[0];\r\n if (followedTopic) {\r\n this.followedTopics.get(ev.roomId).set(followedTopic);\r\n }\r\n }\r\n }\r\n\r\n private handleTopicDeleted(ev: TopicDeleted): void {\r\n this.followedTopics.get(ev.location.roomId)?.delete(ev.location.topicId);\r\n }\r\n\r\n private handleSession(ev: Session): void {\r\n this.followedTopics.deleteAll();\r\n this.followedTopicsPromises.forgetAll();\r\n this.roomHistories.deleteAll();\r\n ev.state.rooms.forEach(room => this.createHistoryForNewRoom(room));\r\n this.deferredSession.resolve();\r\n }\r\n\r\n private updateLocallyFollowedTopicOnNewMessage(ev: NewMessage): void {\r\n const roomFollowedTopics = this.followedTopics.get(ev.message.location.roomId);\r\n const followedTopic = roomFollowedTopics?.get(ev.message.location.topicId);\r\n const ephemeralMessageTypes = ['System'] as MessageType[];\r\n\r\n if (!roomFollowedTopics || !followedTopic || ephemeralMessageTypes.includes(ev.message.type)) {\r\n // Skip if we don't follow this room or targeted topic or message is ephemeral\r\n return;\r\n }\r\n\r\n const isMe = ev.message.author.user.id === this.tracker.me?.id;\r\n\r\n let update: Partial<FollowedTopic>;\r\n\r\n if (isMe) {\r\n // Reset missed messages count if new message is authored by me\r\n update = {missed: 0, lastAckMessageId: ev.message.id};\r\n } else {\r\n // ...add 1 otherwise\r\n update = {missed: followedTopic.missed === null ? null : followedTopic.missed + 1};\r\n }\r\n\r\n roomFollowedTopics.set({...followedTopic, ...update});\r\n }\r\n\r\n private setFollowedTopicsArray(roomIds: string[], followedTopics: FollowedTopic[]): void {\r\n const roomToTopics: {[roomId: string]: FollowedTopic[]} = {};\r\n\r\n // Reassign followed topics to limit collection change event emit\r\n followedTopics.forEach(followedTopic => {\r\n roomToTopics[followedTopic.location.roomId] ??= [];\r\n roomToTopics[followedTopic.location.roomId].push(followedTopic);\r\n });\r\n\r\n roomIds.forEach(roomId => {\r\n if (! this.followedTopics.has(roomId)) {\r\n this.followedTopics.set([roomId, new ObservableIndexedObjectCollection<FollowedTopic>(\r\n followedTopic => followedTopic.location.topicId\r\n )]);\r\n }\r\n\r\n if (roomToTopics[roomId]) {\r\n this.followedTopics.get(roomId).set(...roomToTopics[roomId]);\r\n }\r\n });\r\n }\r\n\r\n private clearRoomFollowedTopicsStructures(roomId: string): void {\r\n this.followedTopics.delete(roomId);\r\n this.followedTopicsPromises.forget(roomId);\r\n }\r\n}","import {IndexedCollection, ObservableIndexedObjectCollection} from \"../IndexedObjectCollection\";\r\nimport {\r\n NewMessage,\r\n NewTopic,\r\n Room, RoomDeleted,\r\n RoomJoined, RoomLeft,\r\n RoomMember, RoomMemberJoined, RoomMemberLeft, RoomMembers,\r\n RoomMemberUpdated, RoomUpdated, Session, SpaceDeleted, SpaceLeft, SpaceMemberLeft,\r\n SpaceMemberUpdated,\r\n Topic,\r\n TopicDeleted, TopicUpdated,\r\n UserUpdated,\r\n} from \"../types/src\";\r\nimport {ChatStateTracker} from \"./ChatStateTracker\";\r\nimport {DeferredTask, PromiseRegistry} from \"./AsyncUtils\";\r\nimport {MessagesManager} from \"./MessagesManager\";\r\n\r\nexport class RoomsManager {\r\n public readonly messages: MessagesManager;\r\n\r\n private readonly list = new ObservableIndexedObjectCollection<Room>('id');\r\n private readonly topics = new IndexedCollection<string, ObservableIndexedObjectCollection<Topic>>();\r\n private readonly members = new IndexedCollection<string, ObservableIndexedObjectCollection<RoomMember>>();\r\n private readonly deferredSession = new DeferredTask();\r\n private readonly membersPromises = new PromiseRegistry();\r\n private readonly topicsPromises = new PromiseRegistry();\r\n\r\n public constructor(private tracker: ChatStateTracker) {\r\n this.messages = new MessagesManager(tracker);\r\n\r\n this.tracker.client.on('NewMessage', ev => this.handleNewMessage(ev));\r\n this.tracker.client.on('NewTopic', ev => this.handleNewTopic(ev));\r\n this.tracker.client.on('TopicDeleted', ev => this.handleTopicDeleted(ev));\r\n this.tracker.client.on('RoomJoined', ev => this.handleRoomJoined(ev));\r\n this.tracker.client.on('RoomLeft', ev => this.handleRoomLeft(ev));\r\n this.tracker.client.on('RoomUpdated', ev => this.handleRoomUpdated(ev));\r\n this.tracker.client.on('RoomDeleted', ev => this.handleRoomDeleted(ev));\r\n this.tracker.client.on('TopicUpdated', ev => this.handleTopicUpdated(ev));\r\n this.tracker.client.on('RoomMemberJoined', ev => this.handleRoomMemberJoined(ev));\r\n this.tracker.client.on('RoomMemberLeft', ev => this.handleRoomMemberLeft(ev));\r\n this.tracker.client.on('RoomMembers', ev => this.handleRoomMembers(ev));\r\n this.tracker.client.on('RoomMemberUpdated', ev => this.handleRoomMemberUpdated(ev));\r\n this.tracker.client.on('SpaceMemberLeft', ev => this.handleSpaceMemberLeft(ev));\r\n this.tracker.client.on('SpaceMemberUpdated', ev => this.handleSpaceMemberUpdated(ev));\r\n this.tracker.client.on('SpaceDeleted', ev => this.handleSpaceDeleted(ev));\r\n this.tracker.client.on('SpaceLeft', ev => this.handleSpaceDeleted(ev));\r\n this.tracker.client.on('UserUpdated', ev => this.handleUserUpdated(ev));\r\n this.tracker.client.on('Session', ev => this.handleSession(ev));\r\n }\r\n\r\n /**\r\n * Get collection of room members.\r\n */\r\n public async getMembers(roomId: string): Promise<ObservableIndexedObjectCollection<RoomMember> | undefined> {\r\n if (this.membersPromises.notExist(roomId)) {\r\n this.membersPromises.registerByFunction(async () => {\r\n const result = await this.tracker.client.send('GetRoomMembers', {id: roomId});\r\n if (result.error) {\r\n throw result.error;\r\n }\r\n this.handleRoomMembers(result.data);\r\n }, roomId);\r\n }\r\n\r\n await this.membersPromises.get(roomId);\r\n return this.members.get(roomId);\r\n }\r\n\r\n /**\r\n * Get a room member representing the current user.\r\n */\r\n public async getMe(roomId: string): Promise<RoomMember | undefined> {\r\n const userId = (await this.tracker.getMe()).id;\r\n\r\n if (! this.list.has(roomId)) {\r\n // User is not in passed room.\r\n return undefined;\r\n }\r\n\r\n const members = await this.getMembers(roomId);\r\n return members?.items.find(member => (member.user?.id ?? member.spaceMember.user.id) === userId);\r\n }\r\n\r\n /**\r\n * Get collection of all the rooms you are in.\r\n */\r\n public async get(): Promise<ObservableIndexedObjectCollection<Room>> {\r\n await this.deferredSession.promise;\r\n return this.list;\r\n }\r\n\r\n /**\r\n * Get a collection of locally cached Topic objects for given room.\r\n * You can pass topic ids as second argument, to try to fetch them from the server.\r\n */\r\n public async getTopics(roomId: string, tryToFetchTopicIds?: string[]): Promise<ObservableIndexedObjectCollection<Topic> | undefined> {\r\n await this.deferredSession.promise;\r\n\r\n if (tryToFetchTopicIds?.length) {\r\n // Topic can be fetched if it isn't already cached and fetch is not already in progress\r\n const canFetch = (topicId: string) => ! this.topics.get(roomId)?.has(topicId) && ! this.topicsPromises.has(roomId + topicId);\r\n const idsToFetch = tryToFetchTopicIds.filter(canFetch);\r\n\r\n if (idsToFetch.length) {\r\n const promise = this.tracker\r\n .client\r\n .send('GetTopics', {roomId, topicIds: idsToFetch})\r\n .then(result => this.topics.get(result.data.location.roomId)?.set(...result.data.topics));\r\n\r\n idsToFetch.forEach(topicId => this.topicsPromises.register(promise, roomId + topicId));\r\n }\r\n\r\n for (const topicId of tryToFetchTopicIds) {\r\n await this.topicsPromises.get(roomId + topicId);\r\n }\r\n }\r\n\r\n return this.topics.get(roomId);\r\n }\r\n\r\n private deleteRoom(...roomIds: string[]): void {\r\n this.list.delete(...roomIds);\r\n this.members.delete(...roomIds);\r\n this.membersPromises.forget(...roomIds);\r\n\r\n for (const roomId of roomIds) {\r\n const topicIds: string[] = this.topics.get(roomId)?.items.map(topic => topic.id) ?? [];\r\n this.messages._deleteByTopicIds(roomId, ...topicIds);\r\n }\r\n\r\n this.topics.delete(...roomIds);\r\n }\r\n\r\n private deleteRoomsBySpaceId(spaceId: string): void {\r\n this.deleteRoom(\r\n ...this.list.findBy('spaceId', spaceId).items.map(room => room.id)\r\n );\r\n }\r\n\r\n private handleSpaceMemberUpdated(ev: SpaceMemberUpdated): void {\r\n // Update members of rooms related to this space\r\n for (const room of this.list.findBy('spaceId', ev.spaceId).items) {\r\n const roomMembers = this.members.get(room.id);\r\n\r\n if (! roomMembers || ! roomMembers.has(ev.userId)) {\r\n // Skip update if member list for this room is not loaded\r\n // or user is not in room\r\n continue;\r\n }\r\n\r\n const roomMember = roomMembers.get(ev.userId);\r\n const user = roomMember.spaceMember.user;\r\n\r\n // Update space member but first fill user object (it's null in event object)\r\n roomMember.spaceMember = {...ev.member, user};\r\n roomMembers.set(roomMember);\r\n }\r\n }\r\n\r\n private handleSpaceMemberLeft(ev: SpaceMemberLeft): void {\r\n this.list\r\n .findBy('spaceId', ev.spaceId).items\r\n .forEach(room => this.members.get(room.id)?.delete(ev.userId));\r\n }\r\n\r\n private handleRoomMemberUpdated(ev: RoomMemberUpdated): void {\r\n if (! this.members.has(ev.roomId)) {\r\n // We do not track member list for this room.\r\n return;\r\n }\r\n\r\n const members = this.members.get(ev.roomId);\r\n const member = members.get(ev.userId);\r\n const newMember = ev.member;\r\n const user = member.spaceMember?.user ?? member.user;\r\n\r\n if (newMember.spaceMember) {\r\n newMember.spaceMember.user = user;\r\n } else {\r\n newMember.user = user;\r\n }\r\n\r\n members.set(newMember);\r\n }\r\n\r\n private handleSpaceDeleted(ev: SpaceDeleted | SpaceLeft): void {\r\n this.deleteRoomsBySpaceId(ev.id);\r\n }\r\n\r\n private handleTopicDeleted(ev: TopicDeleted): void {\r\n const collection = this.topics.get(ev.location.roomId);\r\n collection.delete(ev.location.topicId);\r\n\r\n const room = this.list.get(ev.location.roomId);\r\n if (room.defaultTopic?.id === ev.location.topicId) {\r\n this.list.set({...room, defaultTopic: null});\r\n }\r\n }\r\n\r\n private handleNewTopic(ev: NewTopic): void {\r\n this.addJoinedRoomTopics(ev.roomId, ev.topic);\r\n }\r\n\r\n private addJoinedRoomTopics(roomId: string, ...topics: Topic[]): void {\r\n if (this.topics.has(roomId)) {\r\n this.topics.get(roomId).set(...topics);\r\n } else {\r\n this.topics.set([roomId, new ObservableIndexedObjectCollection<Topic>('id', topics)]);\r\n }\r\n }\r\n\r\n private handleRoomJoined(ev: RoomJoined): void {\r\n this.addJoinedRooms(ev.room);\r\n }\r\n\r\n private handleRoomUpdated(ev: RoomUpdated): void {\r\n if (this.list.has(ev.room)) {\r\n this.list.set(ev.room);\r\n }\r\n }\r\n\r\n private handleRoomDeleted(ev: RoomDeleted): void {\r\n this.deleteRoom(ev.id);\r\n }\r\n\r\n private handleTopicUpdated(ev: TopicUpdated): void {\r\n const room = this.list.get(ev.location.roomId);\r\n\r\n if (this.topics.get(ev.location.roomId)?.has(ev.topic.id)) {\r\n this.topics.get(ev.location.roomId).set(ev.topic);\r\n }\r\n\r\n if (room.defaultTopic.id === ev.topic.id) {\r\n room.defaultTopic = ev.topic;\r\n this.list.set(room);\r\n }\r\n }\r\n\r\n private addJoinedRooms(...rooms: Room[]): void {\r\n for (const room of rooms) {\r\n if (room.defaultTopic) {\r\n this.addJoinedRoomTopics(room.id, room.defaultTopic);\r\n }\r\n\r\n if (room.type === 'Pm' && room.recipients) {\r\n // Treat PM recipients as normal room members.\r\n // We are registering fake promise in `memberPromises`\r\n // because GetMembers are not supported for PM rooms.\r\n this.handleRoomMembers({\r\n id: room.id,\r\n members: room.recipients.map(user => ({user, spaceMember: null, roles: null})),\r\n });\r\n this.membersPromises.register(Promise.resolve(), room.id);\r\n }\r\n }\r\n this.list.set(...rooms);\r\n }\r\n\r\n private handleRoomLeft(ev: RoomLeft): void {\r\n this.deleteRoom(ev.id);\r\n }\r\n\r\n private handleRoomMemberJoined(ev: RoomMemberJoined): void {\r\n if (this.members.has(ev.roomId)) {\r\n this.members.get(ev.roomId).set(ev.member);\r\n }\r\n }\r\n\r\n private handleRoomMemberLeft(ev: RoomMemberLeft): void {\r\n if (this.members.has(ev.roomId)) {\r\n this.members.get(ev.roomId).delete(ev.userId);\r\n }\r\n }\r\n\r\n private handleRoomMembers(ev: RoomMembers): void {\r\n if (! this.members.has(ev.id)) {\r\n this.members.set([\r\n ev.id,\r\n new ObservableIndexedObjectCollection(\r\n member => member.user?.id ?? member.spaceMember.user.id,\r\n ev.members,\r\n )\r\n ]);\r\n }\r\n }\r\n\r\n private handleSession(ev: Session): void {\r\n this.list.deleteAll();\r\n this.topics.deleteAll();\r\n this.topicsPromises.forgetAll();\r\n this.members.deleteAll();\r\n this.membersPromises.forgetAll();\r\n\r\n this.addJoinedRooms(...ev.state.rooms);\r\n\r\n this.deferredSession.resolve();\r\n }\r\n\r\n private handleUserUpdated(ev: UserUpdated): void {\r\n this.members.items.forEach((members) => {\r\n const member = members.get(ev.user.id);\r\n\r\n if (! member) {\r\n // Skip room; updated user is not here\r\n return;\r\n }\r\n\r\n const newMember: RoomMember = {...member};\r\n\r\n if (member.user) {\r\n newMember.user = ev.user;\r\n } else {\r\n newMember.spaceMember.user = ev.user;\r\n }\r\n\r\n members.set(newMember);\r\n });\r\n }\r\n\r\n private handleNewMessage(ev: NewMessage): void {\r\n const topics = this.topics.get(ev.message.location.roomId);\r\n const topic = topics?.get(ev.message.location.topicId);\r\n\r\n if (!topic) {\r\n return; // No topic found, nothing to update\r\n }\r\n\r\n const newTopic = {\r\n ...topic,\r\n messageCount: topic.messageCount + 1,\r\n lastMessage: ev.message,\r\n };\r\n\r\n topics.set(newTopic);\r\n const room = this.list.get(ev.message.location.roomId);\r\n\r\n if (room.defaultTopic?.id === ev.message.location.topicId) {\r\n this.list.set({ ...room, defaultTopic: newTopic });\r\n }\r\n }\r\n}","import {Role, RoomMember, SpaceMember, User} from \"../types/src\";\r\n\r\nexport function reorderRolesOnPriorityUpdate(allRoles: Role[], oldRole: Role, updatedRole: Role): Role[] {\r\n // If the priority has changed, adjust the rest of roles\r\n const increased = (updatedRole.priority - oldRole.priority) > 0;\r\n const decreased = ! increased;\r\n const changedRoles: Role[] = [];\r\n\r\n allRoles.forEach(role => {\r\n if (role.id === updatedRole.id) {\r\n // Skip the updated role\r\n return;\r\n }\r\n if (increased && oldRole.priority <= role.priority) {\r\n role.priority--;\r\n changedRoles.push(role);\r\n }\r\n if (decreased && updatedRole.priority <= role.priority) {\r\n role.priority++;\r\n changedRoles.push(role);\r\n }\r\n });\r\n\r\n return changedRoles;\r\n}\r\n\r\nexport function extractUserFromMember(member: RoomMember | SpaceMember): User | null {\r\n return member.user ?? (member as RoomMember).spaceMember?.user;\r\n}","import {ChatStateTracker} from \"./ChatStateTracker\";\r\nimport {IndexedCollection, ObservableIndexedObjectCollection} from \"../IndexedObjectCollection\";\r\nimport {\r\n NewRole,\r\n NewRoom,\r\n Role,\r\n RoleDeleted,\r\n RoleUpdated,\r\n RoomDeleted,\r\n RoomSummary,\r\n RoomUpdated,\r\n Session,\r\n Space,\r\n SpaceDeleted,\r\n SpaceJoined,\r\n SpaceLeft,\r\n SpaceMember,\r\n SpaceMemberJoined,\r\n SpaceMemberLeft,\r\n SpaceMembers,\r\n SpaceMemberUpdated,\r\n SpaceRooms,\r\n SpaceUpdated,\r\n UserUpdated\r\n} from \"../types/src\";\r\nimport {DeferredTask, PromiseRegistry} from \"./AsyncUtils\";\r\nimport {reorderRolesOnPriorityUpdate} from \"./functions\";\r\n\r\nexport class SpacesManager {\r\n private readonly list = new ObservableIndexedObjectCollection<Space>('id');\r\n private readonly roles = new IndexedCollection<string, ObservableIndexedObjectCollection<Role>>();\r\n private readonly rooms = new IndexedCollection<string, ObservableIndexedObjectCollection<RoomSummary>>();\r\n private readonly roomIdToSpaceId = new IndexedCollection<string, string>();\r\n private readonly members = new IndexedCollection<string, ObservableIndexedObjectCollection<SpaceMember>>();\r\n private readonly deferredSession = new DeferredTask();\r\n private readonly roomsPromises = new PromiseRegistry();\r\n private readonly membersPromises = new PromiseRegistry();\r\n\r\n public constructor(private tracker: ChatStateTracker) {\r\n this.tracker.client.on('NewRoom', ev => this.handleNewRoom(ev));\r\n this.tracker.client.on('RoomDeleted', ev => this.handleRoomDeleted(ev));\r\n this.tracker.client.on('RoomUpdated', ev => this.handleRoomUpdated(ev));\r\n this.tracker.client.on('SpaceDeleted', ev => this.handleSpaceDeleted(ev));\r\n this.tracker.client.on('SpaceUpdated', ev => this.handleSpaceUpdated(ev));\r\n this.tracker.client.on('SpaceJoined', ev => this.handleSpaceJoined(ev));\r\n this.tracker.client.on('SpaceLeft', ev => this.handleSpaceDeleted(ev));\r\n this.tracker.client.on('SpaceMemberJoined', ev => this.handleSpaceMemberJoined(ev));\r\n this.tracker.client.on('SpaceMemberLeft', ev => this.handleSpaceMemberLeft(ev));\r\n this.tracker.client.on('SpaceMembers', ev => this.handleSpaceMembers(ev));\r\n this.tracker.client.on('SpaceRooms', ev => this.handleSpaceRooms(ev));\r\n this.tracker.client.on('SpaceMemberUpdated', ev => this.handleSpaceMemberUpdated(ev));\r\n this.tracker.client.on('UserUpdated', ev => this.handleUserUpdated(ev));\r\n this.tracker.client.on('NewRole', ev => this.handleNewRole(ev));\r\n this.tracker.client.on('RoleDeleted', ev => this.handleRoleDeleted(ev));\r\n this.tracker.client.on('RoleUpdated', ev => this.handleRoleUpdated(ev));\r\n this.tracker.client.on('Session', ev => this.handleSession(ev));\r\n }\r\n\r\n /**\r\n * Get collection of all the spaces you are in.\r\n */\r\n public async get(): Promise<ObservableIndexedObjectCollection<Space>> {\r\n await this.deferredSession.promise;\r\n return this.list;\r\n }\r\n\r\n /**\r\n * Get collection of space roles.\r\n */\r\n public async getRoles(spaceId: string): Promise<ObservableIndexedObjectCollection<Role> | undefined> {\r\n await this.deferredSession.promise;\r\n return this.roles.get(spaceId);\r\n }\r\n\r\n /**\r\n * Get collection of the all available rooms inside given space.\r\n */\r\n public async getRooms(spaceId: string): Promise<ObservableIndexedObjectCollection<RoomSummary> | undefined> {\r\n if (this.roomsPromises.notExist(spaceId)) {\r\n this.roomsPromises.registerByFunction(async () => {\r\n const result = await this.tracker.client.send('GetSpaceRooms', {id: spaceId});\r\n if (result.error) {\r\n throw result.error;\r\n }\r\n this.handleSpaceRooms(result.data);\r\n }, spaceId);\r\n }\r\n\r\n await this.roomsPromises.get(spaceId);\r\n return this.rooms.get(spaceId);\r\n }\r\n\r\n /**\r\n * Get collection of space members.\r\n */\r\n public async getMembers(spaceId: string): Promise<ObservableIndexedObjectCollection<SpaceMember> | undefined> {\r\n if (this.membersPromises.notExist(spaceId)) {\r\n this.membersPromises.registerByFunction(async () => {\r\n const result = await this.tracker.client.send('GetSpaceMembers', {id: spaceId});\r\n if (result.error) {\r\n throw result.error;\r\n }\r\n this.handleSpaceMembers(result.data);\r\n }, spaceId);\r\n }\r\n\r\n await this.membersPromises.get(spaceId);\r\n return this.members.get(spaceId);\r\n }\r\n\r\n /**\r\n * Get a space member representing the current user.\r\n */\r\n public async getMe(spaceId: string): Promise<SpaceMember | undefined> {\r\n const userId = (await this.tracker.getMe()).id;\r\n\r\n if (! this.list.has(spaceId)) {\r\n // User is not in passed space.\r\n return undefined;\r\n }\r\n\r\n const members = await this.getMembers(spaceId);\r\n return members?.items.find(member => member.user.id === userId);\r\n }\r\n\r\n private handleNewRole(ev: NewRole): void {\r\n const collection = this.roles.get(ev.spaceId);\r\n collection.set(ev.role);\r\n this.list.get(ev.spaceId).roles = collection.items;\r\n }\r\n\r\n private handleNewRoom(ev: NewRoom): void {\r\n this.rooms.get(ev.spaceId)?.set(ev.summary);\r\n this.roomIdToSpaceId.set([ev.summary.id, ev.spaceId]);\r\n }\r\n\r\n private handleRoomUpdated(ev: RoomUpdated): void {\r\n if (ev.room.spaceId && this.rooms.has(ev.room.spaceId)) {\r\n const rooms = this.rooms.get(ev.room.spaceId);\r\n rooms.set({\r\n ...rooms.get(ev.room.id),\r\n name: ev.room.name,\r\n description: ev.room.description,\r\n } as RoomSummary);\r\n }\r\n }\r\n\r\n private async handleRoomDeleted(ev: RoomDeleted): Promise<void> {\r\n const spaceId = this.roomIdToSpaceId.get(ev.id);\r\n this.roomIdToSpaceId.delete(ev.id);\r\n\r\n if (! spaceId) {\r\n return;\r\n }\r\n\r\n const space = this.list.get(spaceId);\r\n let spaceChanged = false;\r\n\r\n this.rooms.get(spaceId)?.delete(ev.id);\r\n\r\n if (space.systemRoom === ev.id) {\r\n space.systemRoom = null;\r\n spaceChanged = true;\r\n }\r\n\r\n if (space.defaultRooms.includes(ev.id)) {\r\n space.defaultRooms = space.defaultRooms.filter(roomId => roomId !== ev.id);\r\n spaceChanged = true;\r\n }\r\n\r\n if (spaceChanged) {\r\n this.list.set(space);\r\n }\r\n }\r\n\r\n private handleRoleDeleted(ev: RoleDeleted): void {\r\n const collection = this.roles.get(ev.spaceId);\r\n collection.delete(ev.id);\r\n this.list.get(ev.spaceId).roles = collection.items;\r\n }\r\n\r\n private handleSpaceUpdated(ev: SpaceUpdated): void {\r\n this.list.set(ev.space);\r\n }\r\n\r\n private handleSpaceDeleted(ev: SpaceDeleted | SpaceLeft): void {\r\n const roomIds = this.rooms.get(ev.id)?.items.map(item => item.id) ?? [];\r\n this.roomIdToSpaceId.delete(...roomIds);\r\n\r\n this.roles.delete(ev.id);\r\n this.members.delete(ev.id);\r\n this.membersPromises.forget(ev.id);\r\n this.rooms.delete(ev.id);\r\n this.roomsPromises.forget(ev.id);\r\n this.list.delete(ev.id);\r\n }\r\n\r\n private handleSpaceJoined(ev: SpaceJoined): void {\r\n this.addJoinedSpaces(ev.space);\r\n }\r\n\r\n private addJoinedSpaces(...spaces: Space[]): void {\r\n this.roles.set(...(spaces.map(space => [\r\n space.id,\r\n new ObservableIndexedObjectCollection<Role>('id', space.roles)\r\n ]) as [string, ObservableIndexedObjectCollection<Role>][]));\r\n this.list.set(...spaces);\r\n }\r\n\r\n private handleSpaceMemberJoined(ev: SpaceMemberJoined): void {\r\n if (this.members.has(ev.spaceId)) {\r\n this.members.get(ev.spaceId).set(ev.member);\r\n }\r\n }\r\n\r\n private handleSpaceMemberLeft(ev: SpaceMemberLeft): void {\r\n if (this.members.has(ev.spaceId)) {\r\n this.members.get(ev.spaceId).delete(ev.userId);\r\n }\r\n }\r\n\r\n private handleSpaceMembers(ev: SpaceMembers): void {\r\n if (! this.members.has(ev.id)) {\r\n this.members.set([\r\n ev.id,\r\n new ObservableIndexedObjectCollection(member => member?.user.id, ev.members)\r\n ]);\r\n }\r\n }\r\n\r\n private handleSpaceRooms(ev: SpaceRooms): void {\r\n if (! this.rooms.has(ev.id)) {\r\n this.rooms.set([ev.id, new ObservableIndexedObjectCollection('id', ev.summaries)]);\r\n ev.summaries.forEach(summary => this.roomIdToSpaceId.set([summary.id, ev.id]));\r\n }\r\n }\r\n\r\n private handleSpaceMemberUpdated(ev: SpaceMemberUpdated): void {\r\n if (this.members.has(ev.spaceId)) {\r\n const members = this.members.get(ev.spaceId);\r\n const member = members.get(ev.userId);\r\n members.set({...ev.member, user: member.user});\r\n }\r\n }\r\n\r\n private handleRoleUpdated(ev: RoleUpdated): void {\r\n const roles = this.roles.get(ev.spaceId);\r\n const oldRole = roles.get(ev.role.id);\r\n const newRole = ev.role;\r\n const rolesToUpdate = [newRole];\r\n\r\n if (oldRole.priority !== newRole.priority) {\r\n rolesToUpdate.push(\r\n ...reorderRolesOnPriorityUpdate(roles.items, oldRole, newRole)\r\n );\r\n }\r\n\r\n this.roles.get(ev.spaceId).set(...rolesToUpdate);\r\n }\r\n\r\n private handleSession(ev: Session): void {\r\n this.list.deleteAll();\r\n this.roles.deleteAll();\r\n this.rooms.deleteAll();\r\n this.roomsPromises.forgetAll();\r\n this.members.deleteAll();\r\n this.membersPromises.forgetAll();\r\n this.roomIdToSpaceId.deleteAll();\r\n\r\n this.addJoinedSpaces(...ev.state.spaces);\r\n\r\n this.deferredSession.resolve();\r\n }\r\n\r\n private handleUserUpdated(ev: UserUpdated): void {\r\n this.members.items.forEach((members) => {\r\n const member = members.get(ev.user.id);\r\n\r\n if (! member) {\r\n // Skip space; updated user is not here\r\n return;\r\n }\r\n\r\n members.set({...member, user: ev.user});\r\n });\r\n }\r\n}","export enum Layer {\r\n Global,\r\n Space,\r\n Room,\r\n Topic,\r\n}\r\n\r\nexport class PermissionDefinition {\r\n value: number;\r\n maxLayer: Layer;\r\n}\r\n\r\nexport class Permissions {\r\n public static readonly list = {\r\n Root: {value: 1 << 0, maxLayer: Layer.Room},\r\n CreateSpaces: {value: 1 << 1, maxLayer: Layer.Global},\r\n ManageSpace: {value: 1 << 2, maxLayer: Layer.Space},\r\n ManageSpaceRoles: {value: 1 << 3, maxLayer: Layer.Space},\r\n ManageRoom: {value: 1 << 4, maxLayer: Layer.Room},\r\n CreateTopics: {value: 1 << 5, maxLayer: Layer.Room},\r\n ManageTopic: {value: 1 << 6, maxLayer: Layer.Topic},\r\n ManageSpaceMembers: {value: 1 << 7, maxLayer: Layer.Space},\r\n ManageRoomMembers: {value: 1 << 8, maxLayer: Layer.Room},\r\n CreateMessages: {value: 1 << 9, maxLayer: Layer.Topic},\r\n ManagePermissions: {value: 1 << 10, maxLayer: Layer.Topic},\r\n CreateSpaceRooms: {value: 1 << 11, maxLayer: Layer.Space},\r\n ManageSpaceRooms: {value: 1 << 12, maxLayer: Layer.Space},\r\n CreateEmoticons: {value: 1 << 13, maxLayer: Layer.Space},\r\n ManageEmoticon: {value: 1 << 14, maxLayer: Layer.Space},\r\n ManageBan: {value: 1 << 15, maxLayer: Layer.Room},\r\n Kick: {value: 1 << 16, maxLayer: Layer.Room},\r\n ChangeOwnNick: {value: 1 << 17, maxLayer: Layer.Space},\r\n };\r\n\r\n public static getNames(): (keyof typeof this.list)[] {\r\n return Object.keys(this.list) as any;\r\n }\r\n\r\n public static getByName(name: keyof typeof this.list): PermissionDefinition | undefined {\r\n return this.list[name];\r\n }\r\n\r\n public static canBeDefinedOnLayer(permissionName: keyof typeof this.list, layer: Layer): boolean {\r\n const def = this.getByName(permissionName);\r\n\r\n if (! def) {\r\n throw new Error(`Invalid permission name: ${permissionName}`);\r\n }\r\n\r\n return layer <= this.getByName(permissionName).maxLayer;\r\n }\r\n}","import {ChatStateTracker} from \"./ChatStateTracker\";\r\nimport {\r\n ChatLocation,\r\n PermissionOverwrites, PermissionOverwritesTarget,\r\n PermissionOverwritesUpdated,\r\n PermissionOverwritesValue,\r\n RoleDeleted,\r\n RoomDeleted,\r\n RoomLeft, RoomMember, RoomMemberUpdated, Session,\r\n SpaceDeleted,\r\n SpaceLeft, SpaceMember,\r\n SpaceMemberUpdated,\r\n TopicDeleted,\r\n} from \"../types/src\";\r\nimport {EventHandler, EventTarget} from \"../EventTarget\";\r\nimport {IndexedCollection} from \"../IndexedObjectCollection\";\r\nimport {Permissions} from \"../Permissions\";\r\nimport {PromiseRegistry} from \"./AsyncUtils\";\r\n\r\nconst getOvId = (\r\n location: ChatLocation,\r\n target?: PermissionOverwritesTarget,\r\n) => [location.spaceId, location.roomId, location.topicId, target?.type, target?.userId, target?.roleId].filter(Boolean).join('/');\r\n\r\nconst getOvIdByObject\r\n = (overwrites: PermissionOverwrites | PermissionOverwritesUpdated): string => getOvId(overwrites.location, overwrites.target);\r\n\r\ninterface CheckPermissionsResult {\r\n /**\r\n * @deprecated Use `hasAll` instead.\r\n */\r\n ok: boolean;\r\n hasAll: boolean;\r\n hasAny: boolean;\r\n missing: string[];\r\n}\r\n\r\nexport class PermissionsManager extends EventTarget {\r\n private readonly overwrites = new IndexedCollection<string, PermissionOverwrites>();\r\n private readonly overwritesPromises = new PromiseRegistry();\r\n\r\n public constructor(private tracker: ChatStateTracker) {\r\n super();\r\n this.tracker.client.on('PermissionOverwrites', ev => this.handlePermissionOverwrites(ev));\r\n this.tracker.client.on('PermissionOverwritesUpdated', ev => this.handlePermissionOverwrites(ev));\r\n this.tracker.client.on('SpaceDeleted', ev => this.handleSpaceDeleted(ev));\r\n this.tracker.client.on('SpaceLeft', ev => this.handleSpaceDeleted(ev));\r\n this.tracker.client.on('RoomDeleted', ev => this.handleRoomDeleted(ev));\r\n this.tracker.client.on('RoomLeft', ev => this.handleRoomDeleted(ev));\r\n this.tracker.client.on('TopicDeleted', ev => this.handleTopicDeleted(ev));\r\n this.tracker.client.on('RoleDeleted', ev => this.handleRoleDeleted(ev));\r\n this.tracker.client.on('SpaceMemberUpdated', ev => this.handleSpaceMemberUpdated(ev));\r\n this.tracker.client.on('RoomMemberUpdated', ev => this.handleRoomMemberUpdated(ev));\r\n this.tracker.client.on('Session', ev => this.handleSession(ev));\r\n }\r\n\r\n public async getOverwrites(\r\n location: ChatLocation,\r\n target: PermissionOverwritesTarget,\r\n ): Promise<PermissionOverwrites | undefined> {\r\n this.validateLocation(location);\r\n\r\n const id = getOvId(location, target);\r\n\r\n if (this.overwritesPromises.notExist(id)) {\r\n this.overwritesPromises.registerByFunction(async () => {\r\n const result = await this.tracker.client.send(\r\n 'GetPermissionOverwrites',\r\n {location, target},\r\n );\r\n if (result.error) {\r\n throw result.error;\r\n }\r\n this.handlePermissionOverwrites(result.data);\r\n }, id);\r\n }\r\n\r\n await this.overwritesPromises.get(id);\r\n return this.overwrites.get(id);\r\n }\r\n\r\n public on(eventName: 'change', handler: EventHandler<any>): this {\r\n return super.on(eventName, handler);\r\n }\r\n\r\n public async check(\r\n permissionNames: (keyof typeof Permissions.list)[],\r\n location: ChatLocation,\r\n ): Promise<CheckPermissionsResult> {\r\n if (! permissionNames.length) {\r\n throw new Error('Permission names array cannot be empty');\r\n }\r\n\r\n const ownedPermissions = await this.calculatePermissions(location);\r\n const missing: string[] = [];\r\n\r\n permissionNames.forEach(name => {\r\n if (~ ownedPermissions & Permissions.getByName(name).value) {\r\n missing.push(name as string);\r\n }\r\n });\r\n\r\n return {\r\n ok: missing.length === 0,\r\n hasAll: missing.length === 0,\r\n hasAny: missing.length < permissionNames.length,\r\n missing,\r\n };\r\n }\r\n\r\n public async calculatePermissions(location: ChatLocation): Promise<number> {\r\n this.validateLocation(location);\r\n\r\n const userId = (await this.tracker.getMe()).id;\r\n const [spaceMember, roomMember] = await this.fetchMembersOrFail(location);\r\n const userRoles: string[] = [...(spaceMember?.roles ?? []), ...(roomMember?.roles ?? [])];\r\n const promises: Promise<PermissionOverwritesValue>[] = [\r\n // Global user overwrites\r\n this.getOverwrites({}, { type: 'User', userId }).then(v => v.overwrites),\r\n ];\r\n\r\n if (location.spaceId && (await this.tracker.spaces.get())?.has(location.spaceId)) {\r\n const filterLocation: ChatLocation = {spaceId: location.spaceId};\r\n promises.push(this.collectRoleOverwrites(filterLocation, userRoles));\r\n promises.push(this.getOverwrites(filterLocation, { type: 'User', userId }).then(v => v.overwrites));\r\n }\r\n\r\n if (location.roomId && (await this.tracker.rooms.get())?.has(location.roomId)) {\r\n const filterLocation: ChatLocation = {spaceId: location.spaceId, roomId: location.roomId};\r\n if (userRoles.length) {\r\n promises.push(this.collectRoleOverwrites(filterLocation, userRoles));\r\n }\r\n promises.push(this.getOverwrites(filterLocation, { type: 'User', userId }).then(v => v.overwrites));\r\n }\r\n\r\n if (location.topicId && (await this.tracker.rooms.getTopics(location.roomId))?.has(location.topicId)) {\r\n if (userRoles.length) {\r\n promises.push(this.collectRoleOverwrites(location, userRoles));\r\n }\r\n promises.push(this.getOverwrites(location, { type: 'User', userId }).then(v => v.overwrites));\r\n }\r\n\r\n return this.resolveOverwritesHierarchy(await Promise.all(promises));\r\n }\r\n\r\n private handlePermissionOverwrites(ev: PermissionOverwritesUpdated | PermissionOverwrites): void {\r\n this.overwrites.set([getOvIdByObject(ev), ev]);\r\n this.emit('change');\r\n }\r\n\r\n private handleSpaceDeleted(ev: SpaceDeleted | SpaceLeft): void {\r\n const ids = this.deleteOverwritesByIdPrefix(getOvId({spaceId: ev.id}));\r\n this.overwritesPromises.forget(...ids);\r\n }\r\n\r\n private async handleRoomDeleted(ev: RoomDeleted | RoomLeft): Promise<void> {\r\n const room = (await this.tracker.rooms.get()).get(ev.id);\r\n if (room) {\r\n const ids = this.deleteOverwritesByIdPrefix(getOvId({spaceId: room.spaceId, roomId: room.id}));\r\n this.overwritesPromises.forget(...ids);\r\n }\r\n }\r\n\r\n private handleTopicDeleted(ev: TopicDeleted): void {\r\n const ids = this.deleteOverwritesByIdPrefix(getOvId(ev.location));\r\n this.overwritesPromises.forget(...ids);\r\n }\r\n\r\n private handleRoleDeleted(ev: RoleDeleted): void {\r\n const ids = this.deleteOverwritesByIdPrefix(getOvId({spaceId: ev.spaceId}, { type: 'Role', roleId: ev.id }));\r\n this.overwritesPromises.forget(...ids);\r\n }\r\n\r\n private handleSpaceMemberUpdated(ev: SpaceMemberUpdated): void {\r\n if (ev.userId === this.tracker.me?.id) {\r\n // User roles in space could potentially have changed\r\n this.emit('change');\r\n }\r\n }\r\n\r\n private handleRoomMemberUpdated(ev: RoomMemberUpdated): void {\r\n if (ev.userId === this.tracker.me?.id) {\r\n // User roles in room could potentially have changed\r\n this.emit('change');\r\n }\r\n }\r\n\r\n /**\r\n * @return Matched and deleted ids\r\n */\r\n private deleteOverwritesByIdPrefix(prefix: string): string[] {\r\n const ids: string[] = [];\r\n this.overwrites.items.forEach((overwrites) => {\r\n const id = getOvIdByObject(overwrites);\r\n if (id.startsWith(prefix)) {\r\n ids.push(id);\r\n this.overwrites.delete(id);\r\n }\r\n });\r\n return ids;\r\n }\r\n\r\n private async collectRoleOverwrites(\r\n location: ChatLocation,\r\n userRoles: string[],\r\n ): Promise<PermissionOverwritesValue> {\r\n const roleOverwrites = await Promise.all(userRoles.map(\r\n roleId => this.getOverwrites(location, { type: 'Role', roleId }),\r\n ));\r\n\r\n return this.resolveOverwritesFromRolesByOrder(location.spaceId, roleOverwrites);\r\n }\r\n\r\n private async resolveOverwritesFromRolesByOrder(\r\n spaceId: string,\r\n overwrites: PermissionOverwrites[],\r\n ): Promise<PermissionOverwritesValue> {\r\n let allows = 0, denies = 0;\r\n const roles = await this.tracker.spaces.getRoles(spaceId);\r\n const sortedOverwrites = overwrites.sort(\r\n (a, b) =>\r\n roles.get(a.target.roleId).priority - roles.get(b.target.roleId).priority\r\n );\r\n\r\n // Max length of bit word\r\n const permissionsLength = overwrites.reduce(\r\n (previousValue: number, currentValue: PermissionOverwrites) =>\r\n Math.max(\r\n previousValue,\r\n currentValue.overwrites.allow?.toString(2).length ?? 0,\r\n currentValue.overwrites.deny?.toString(2).length ?? 0,\r\n ),\r\n 0,\r\n );\r\n\r\n sortedOverwrites.forEach(overwriteEvent => {\r\n const overwrites = overwriteEvent.overwrites;\r\n const revDecDenies = overwrites.deny?.toString(2).split('').reverse().join('') ?? '';\r\n const revDecAllows = overwrites.allow?.toString(2).split('').reverse().join('') ?? '';\r\n\r\n for (let i = 0; i < permissionsLength; i++) {\r\n const deny = parseInt(revDecDenies[i] ?? '0');\r\n const allow = parseInt(revDecAllows[i] ?? '0');\r\n\r\n if (deny) {\r\n denies |= 1 << i;\r\n }\r\n\r\n if (allow) {\r\n allows |= 1 << i;\r\n }\r\n }\r\n });\r\n\r\n return {allow: allows, deny: denies};\r\n }\r\n\r\n private resolveOverwritesHierarchy(permissionOverwritesValues: PermissionOverwritesValue[]): number {\r\n let result = 0;\r\n\r\n for (const value of permissionOverwritesValues) {\r\n if (value.allow & Permissions.getByName('Root').value) {\r\n return this.getRootAccessValue();\r\n }\r\n\r\n result = (result & ~value.deny) | value.allow;\r\n }\r\n\r\n return result;\r\n }\r\n\r\n private getRootAccessValue(): number {\r\n let result = 0;\r\n\r\n for (const name of Permissions.getNames()) {\r\n result |= Permissions.getByName(name).value;\r\n }\r\n\r\n return result;\r\n }\r\n\r\n private async fetchMembersOrFail(location: ChatLocation): Promise<[SpaceMember | null, RoomMember | null]> {\r\n const results = await Promise.all([\r\n location.spaceId ? this.tracker.spaces.getMe(location.spaceId) : null,\r\n location.roomId ? this.tracker.rooms.getMe(location.roomId) : null,\r\n ]);\r\n\r\n const spaceFail = location.spaceId && ! results[0];\r\n const roomFail = location.roomId && ! results[1];\r\n\r\n if (spaceFail || roomFail) {\r\n const layer = spaceFail ? `space (${location.spaceId})` : `room (${location.roomId})`;\r\n throw new Error(`Attempting to calculate permissions for a ${layer} that the user does not belong to`);\r\n }\r\n\r\n return results;\r\n }\r\n\r\n private validateLocation(location: ChatLocation): void {\r\n if (location.topicId && ! location.roomId) {\r\n throw new Error('Corrupted arguments hierarchy');\r\n }\r\n }\r\n\r\n private handleSession(ev: Session): void {\r\n this.overwrites.deleteAll();\r\n this.overwritesPromises.forgetAll();\r\n }\r\n}","import {ChatStateTracker} from \"./ChatStateTracker\";\r\nimport {\r\n IndexedCollection,\r\n ObservableIndexedObjectCollection\r\n} from \"../IndexedObjectCollection\";\r\nimport {Emoticon, EmoticonDeleted, Emoticons, NewEmoticon, SpaceDeleted} from \"../types/src\";\r\nimport {PromiseRegistry} from \"./AsyncUtils\";\r\n\r\nconst GLOBAL_KEY = 'global';\r\n\r\nexport class EmoticonsManager {\r\n private list: IndexedCollection<string, ObservableIndexedObjectCollection<Emoticon>> = new IndexedCollection();\r\n private emoticonsPromises = new PromiseRegistry();\r\n \r\n public constructor(private tracker: ChatStateTracker) {\r\n this.tracker.client.on('Emoticons', ev => this.handleEmoticons(ev));\r\n this.tracker.client.on('NewEmoticon', ev => this.handleNewEmoticon(ev));\r\n this.tracker.client.on('EmoticonDeleted', ev => this.handleEmoticonDeleted(ev));\r\n this.tracker.client.on('SpaceDeleted', ev => this.handleSpaceDeleted(ev));\r\n this.tracker.client.on('Session', () => this.handleSession());\r\n }\r\n\r\n public async get(spaceId?: string): Promise<ObservableIndexedObjectCollection<Emoticon>> {\r\n const key = spaceId ?? GLOBAL_KEY;\r\n\r\n if (this.emoticonsPromises.notExist(key)) {\r\n this.emoticonsPromises.registerByFunction(async () => {\r\n const result = await this.tracker.client.send('GetEmoticons', {spaceId});\r\n if (result.error) {\r\n throw result.error;\r\n }\r\n this.handleEmoticons(result.data);\r\n }, key);\r\n }\r\n\r\n await this.emoticonsPromises.get(key);\r\n return this.list.get(key);\r\n }\r\n\r\n private handleEmoticons(event: Emoticons): void {\r\n const spaceId = event.location.spaceId ?? GLOBAL_KEY;\r\n\r\n if (!this.list.has(spaceId)) {\r\n this.list.set([spaceId, new ObservableIndexedObjectCollection<Emoticon>('id')]);\r\n }\r\n\r\n const collection = this.list.get(spaceId);\r\n collection.set(...event.emoticons);\r\n }\r\n\r\n private handleNewEmoticon(ev: NewEmoticon): void {\r\n const collection = this.list.get(ev.emoticon.spaceId ?? GLOBAL_KEY);\r\n collection?.set(ev.emoticon);\r\n }\r\n\r\n private handleEmoticonDeleted(ev: EmoticonDeleted): void {\r\n const collection = this.list.get(ev.spaceId ?? GLOBAL_KEY);\r\n collection?.delete(ev.emoticonId);\r\n }\r\n\r\n private handleSpaceDeleted(event: SpaceDeleted): void {\r\n this.list.delete(event.id);\r\n }\r\n\r\n private handleSession(): void {\r\n this.list.deleteAll();\r\n this.emoticonsPromises.forgetAll();\r\n }\r\n}","import {ChatStateTracker} from \"./ChatStateTracker\";\nimport {ObservableIndexedObjectCollection} from \"../IndexedObjectCollection\";\nimport {RoomMember, Session, SpaceMember, User} from \"../types/src\";\nimport {extractUserFromMember} from \"./functions\";\nimport {EventTarget} from \"../EventTarget\";\n\nexport class UsersManager {\n public readonly onlineStatus = new EventTarget();\n\n private readonly users: ObservableIndexedObjectCollection<User> = new ObservableIndexedObjectCollection('id');\n\n public constructor(private tracker: ChatStateTracker) {\n // RoomMemberUpdated & SpaceMemberUpdated events are not contains user object\n tracker.client.on('UserUpdated', event => this.handleUsers([event.user]));\n tracker.client.on('RoomMemberJoined', event => this.handleMembers([event.member]));\n tracker.client.on('SpaceMemberJoined', event => this.handleMembers([event.member]));\n tracker.client.on('SpaceMembers', event => this.handleMembers(event.members));\n tracker.client.on('RoomMembers', event => this.handleMembers(event.members));\n tracker.client.on('Messages', event => this.handleUsers(event.messages.map(message => message.author.user)));\n tracker.client.on('NewMessage', event => this.handleUsers([event.message.author.user]));\n tracker.client.on('Session', event => this.handleSession(event));\n }\n\n /**\n * Get all available (cached) user objects at once.\n */\n public async getAvailable(): Promise<ObservableIndexedObjectCollection<User>> {\n return this.users;\n }\n\n private handleMembers(members: (RoomMember | SpaceMember)[]): void {\n this.handleUsers(members.map(extractUserFromMember));\n }\n\n private handleSession(session: Session): void {\n this.users.deleteAll();\n this.handleUsers([session.user]);\n }\n\n private handleUsers(users: User[]): void {\n users.forEach(newUser => {\n const oldUser = this.users.get(newUser.id);\n if (oldUser && oldUser.online !== newUser.online) {\n this.onlineStatus.emit('change', newUser);\n }\n });\n\n this.users.set(...users);\n }\n}","import {WebSocketChatClient} from \"../WebSocketChatClient\";\r\nimport {Session, User} from \"../types/src\";\r\nimport {RoomsManager} from \"./RoomsManager\";\r\nimport {SpacesManager} from \"./SpacesManager\";\r\nimport {PermissionsManager} from \"./PermissionsManager\";\r\nimport {DeferredTask} from \"./AsyncUtils\";\r\nimport {EmoticonsManager} from \"./EmoticonsManager\";\r\nimport {UsersManager} from \"./UsersManager\";\r\n\r\nexport class ChatStateTracker {\r\n /**\r\n * State of your permissions.\r\n */\r\n public readonly permissions = new PermissionsManager(this);\r\n\r\n /**\r\n * State of the rooms you are in.\r\n */\r\n public readonly rooms: RoomsManager = new RoomsManager(this);\r\n\r\n /**\r\n * State of the spaces you are in.\r\n */\r\n public readonly spaces = new SpacesManager(this);\r\n\r\n /**\r\n * State of the emoticons (global and space-related).\r\n */\r\n public readonly emoticons = new EmoticonsManager(this);\r\n\r\n /**\r\n * Users related state.\r\n */\r\n public readonly users = new UsersManager(this);\r\n\r\n private _me: User = null;\r\n private readonly deferredSession = new DeferredTask();\r\n\r\n public constructor(public readonly client: WebSocketChatClient) {\r\n this.client.on('Session', ev => this.handleSession(ev));\r\n }\r\n\r\n public get me(): User | null {\r\n return this._me;\r\n }\r\n\r\n public async getMe(): Promise<User> {\r\n await this.deferredSession.promise;\r\n return this._me;\r\n }\r\n\r\n private handleSession(ev: Session): void {\r\n this._me = ev.user;\r\n this.deferredSession.resolve();\r\n }\r\n}","import {ObservableInterface} from \"./EventTarget\";\r\nimport {AbstractChatClient, CommandResult, CommandsMap} from \"./AbstractChatClient\";\r\nimport {ChatStateTracker} from \"./state-tracker/ChatStateTracker\";\r\nimport {Envelope} from \"./types/src\";\r\n\r\nexport interface WebSocketClientOptions {\r\n url: string;\r\n token: string;\r\n connectingTimeoutMs?: number;\r\n awaitQueueSendDelayMs?: number;\r\n stateTracking?: boolean;\r\n queryParams?: Record<string, string>;\r\n}\r\n\r\nenum WebSocketChatClientEvent {\r\n connect = 'connect',\r\n disconnect = 'disconnect',\r\n message = 'message',\r\n error = 'error',\r\n}\r\n\r\nexport class WebSocketChatClient extends AbstractChatClient implements ObservableInterface {\r\n public readonly Event = WebSocketChatClientEvent;\r\n public readonly state?: ChatStateTracker;\r\n\r\n protected ws: WebSocket|null = null;\r\n protected sendQueue: Envelope[] = [];\r\n protected connectingTimeoutId: any;\r\n protected authenticated: boolean;\r\n protected authenticatedResolvers: [() => void, (error: Error) => void];\r\n\r\n public constructor(private readonly options: WebSocketClientOptions) {\r\n super();\r\n if (this.options.stateTracking ?? true) {\r\n this.state = new ChatStateTracker(this);\r\n }\r\n }\r\n\r\n public async connect(): Promise<void> {\r\n const params = new URLSearchParams(this.options.queryParams ?? {});\r\n params.set('token', this.options.token);\r\n\r\n this.ws = new WebSocket(`${this.options.url}?${params}`);\r\n this.ws.onclose = ev => this.onClose(ev);\r\n this.ws.onmessage = ev => this.onMessage(ev);\r\n this.connectingTimeoutId = setTimeout(\r\n () => this.triggerConnectionTimeout(),\r\n this.options.connectingTimeoutMs ?? 10000\r\n );\r\n this.authenticated = false;\r\n\r\n return new Promise((...args) => this.authenticatedResolvers = args);\r\n }\r\n\r\n public disconnect(): void {\r\n this.sendQueue = [];\r\n this.ws?.close();\r\n this.ws = null;\r\n }\r\n\r\n public async send<CommandType extends keyof CommandsMap>(commandType: CommandType, commandData: CommandsMap[CommandType][0]):\r\n Promise<CommandResult<CommandsMap[CommandType][1]>> {\r\n if (!this.ws || [this.ws.CLOSED, this.ws.CLOSING].includes(this.ws.readyState)) {\r\n throw new Error('Cannot send; close or closing connection state');\r\n }\r\n\r\n const envelope = this.createEnvelope<CommandsMap[CommandType][0]>(commandType, commandData);\r\n const promise = this.createPromiseFromCommandEnvelope<CommandType>(envelope);\r\n\r\n if (this.ws.readyState === this.ws.CONNECTING || !this.authenticated) {\r\n this.sendQueue.push(envelope);\r\n return promise;\r\n }\r\n\r\n if (this.ws.readyState !== this.ws.OPEN) {\r\n throw new Error(`Invalid websocket state=${this.ws.readyState}`);\r\n }\r\n\r\n this.sendEnvelope(envelope);\r\n return promise;\r\n }\r\n\r\n private sendEnvelope(envelope: Envelope): void {\r\n this.ws.send(JSON.stringify(envelope));\r\n }\r\n\r\n private onMessage(event: MessageEvent): void {\r\n const envelope: Envelope = JSON.parse(event.data);\r\n this.handleIncomingEnvelope(envelope);\r\n this.emit(envelope.type, envelope.data);\r\n this.emit(this.Event.message, envelope);\r\n\r\n // Login successfully\r\n if (!this.authenticated) {\r\n const isAuthenticated = envelope.type !== 'Bye';\r\n this.authenticated = isAuthenticated;\r\n if (isAuthenticated) {\r\n this.authenticatedResolvers[0]();\r\n this.emit(this.Event.connect);\r\n this.sendFromQueue();\r\n } else {\r\n this.authenticatedResolvers[1](envelope.data);\r\n }\r\n }\r\n }\r\n\r\n private onClose(event: CloseEvent): void {\r\n clearTimeout(this.connectingTimeoutId);\r\n const reconnect = event.code !== 1000; // Connection was closed because of error\r\n if (reconnect) {\r\n this.connect();\r\n }\r\n this.emit(this.Event.disconnect, reconnect);\r\n }\r\n\r\n private sendFromQueue(): void {\r\n // Send awaiting data to server\r\n let lastDelay = 0;\r\n for (const dataIndex in this.sendQueue) {\r\n const envelope = this.sendQueue[dataIndex];\r\n setTimeout(() => this.sendEnvelope(envelope), lastDelay);\r\n lastDelay += this.options.awaitQueueSendDelayMs ?? 500;\r\n }\r\n this.sendQueue = [];\r\n clearTimeout(this.connectingTimeoutId);\r\n }\r\n\r\n private triggerConnectionTimeout(): void {\r\n this.disconnect();\r\n this.emit(this.Event.error, new Error('Connection timeout'));\r\n }\r\n}","import {AbstractChatClient, CommandResult, CommandsMap} from \"./AbstractChatClient\";\r\nimport {ObservableInterface} from \"./EventTarget\";\r\nimport {Envelope} from \"./types/src\";\r\n\r\nexport interface WebApiChatClientOptions {\r\n url: string;\r\n token: string;\r\n attemptsToSend?: number;\r\n attemptDelayMs?: number;\r\n queryParams?: Record<string, string>;\r\n}\r\n\r\nenum WebApiChatClientEvent {\r\n message = 'message',\r\n error = 'error',\r\n destroy = 'destroy',\r\n}\r\n\r\nexport class WebApiChatClient extends AbstractChatClient implements ObservableInterface {\r\n public readonly Event = WebApiChatClientEvent;\r\n\r\n protected sendStack: {data: any, attempts: number, lastTimeoutId: any}[];\r\n\r\n public constructor(private readonly options: WebApiChatClientOptions) {\r\n super();\r\n }\r\n\r\n public async send<CommandType extends keyof CommandsMap>(commandType: CommandType, commandData: CommandsMap[CommandType][0]):\r\n Promise<CommandResult<CommandsMap[CommandType][1]>> {\r\n const envelope = this.createEnvelope(commandType, commandData);\r\n this.sendStack.push({data: envelope, attempts: 0, lastTimeoutId: null});\r\n this.makeApiCall(this.sendStack.length - 1);\r\n return this.createPromiseFromCommandEnvelope(envelope);\r\n }\r\n\r\n public destroy(): void {\r\n // Cancel all awaiting requests\r\n this.sendStack.forEach(item => {\r\n if (item.lastTimeoutId) {\r\n clearTimeout(item.lastTimeoutId);\r\n }\r\n this.awaitingResponse.delete(item.data.ref);\r\n });\r\n this.sendStack = [];\r\n this.emit(this.Event.destroy, false);\r\n }\r\n\r\n protected async onMessage(reqId: number, response: Response): Promise<void> {\r\n this.sendStack.splice(reqId, 1);\r\n const envelope: Envelope = await response.json();\r\n this.handleIncomingEnvelope(envelope);\r\n this.emit(envelope.type, envelope.data);\r\n this.emit(this.Event.message, envelope);\r\n }\r\n\r\n protected onError(reqId: number, body: string): void {\r\n if (this.sendStack[reqId].attempts >= (this.options.attemptsToSend ?? 10)) {\r\n this.sendStack.splice(reqId, 1);\r\n this.handleEnvelopeSendError(this.sendStack[reqId].data, new Error(\r\n `Cannot send ${body}; aborting after reaching the maximum connection errors`\r\n ));\r\n return;\r\n }\r\n this.sendStack[reqId].lastTimeoutId = setTimeout(\r\n () => this.makeApiCall(reqId),\r\n this.options.attemptDelayMs ?? 3000\r\n );\r\n }\r\n\r\n protected makeApiCall(reqId: number): void {\r\n this.sendStack[reqId].attempts++;\r\n const bodyJson = JSON.stringify(this.sendStack[reqId].data);\r\n const headers: any = {\r\n 'Content-Type': 'application/json',\r\n Accept: 'application/json'\r\n };\r\n\r\n headers.Authorization = `Bearer ${this.options.token}`;\r\n\r\n const params = new URLSearchParams(this.options.queryParams ?? {});\r\n const url = `${this.options.url}${params ? '?' + params : ''}`;\r\n\r\n fetch(url, {\r\n headers,\r\n body: bodyJson,\r\n method: 'POST',\r\n })\r\n .then(response => this.onMessage(reqId, response))\r\n .catch(() => this.onError(reqId, bodyJson));\r\n }\r\n}","export interface RestClientOptions {\r\n url?: string;\r\n token: string;\r\n}\r\n\r\nexport interface RestClientResponse<T> {\r\n ok: boolean;\r\n status: number;\r\n data: T;\r\n}\r\n\r\nexport type HttpMethod = 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE';\r\n\r\nexport abstract class AbstractRestClient {\r\n protected abstract defaultUrl: string;\r\n\r\n public constructor(\r\n private readonly options: RestClientOptions,\r\n ) {}\r\n\r\n protected async send<ResponseT = any>(\r\n method: HttpMethod,\r\n uri: string,\r\n data: any = undefined\r\n ): Promise<RestClientResponse<ResponseT>> {\r\n let url = this.getUrl(uri);\r\n let body = undefined;\r\n\r\n if (data) {\r\n if (['GET', 'DELETE'].includes(method)) {\r\n url += new URLSearchParams(data).toString()\r\n } else {\r\n body = JSON.stringify(data);\r\n }\r\n }\r\n\r\n const headers = {\r\n 'Content-Type': 'application/json',\r\n Accept: 'application/json',\r\n ...this.getAuthHeaders(),\r\n };\r\n\r\n const result = await fetch(url, {method, body, headers});\r\n\r\n return this.convertFetchResponse(result);\r\n }\r\n\r\n protected getAuthHeaders(): any {\r\n const headers = {} as any;\r\n\r\n if (this.options.token) {\r\n headers.Authorization = `Bearer ${this.options.token}`;\r\n }\r\n\r\n return headers;\r\n }\r\n\r\n protected getUrl(uri: string): string {\r\n return this.removeEndingSlash(this.options.url ?? this.defaultUrl) + '/' + this.removeStartingSlash(uri);\r\n }\r\n\r\n protected async convertFetchResponse<T>(result: Response): Promise<RestClientResponse<T>> {\r\n return {\r\n ok: result.ok,\r\n status: result.status,\r\n data: result.headers.get('content-type')?.includes('json') ? await result.json() : await result.text(),\r\n };\r\n }\r\n\r\n private removeStartingSlash(text: string): string {\r\n return text.replace(/^\\/+/, '');\r\n }\r\n\r\n private removeEndingSlash(text: string): string {\r\n return text.replace(/\\/+$/, '');\r\n }\r\n}","import {AbstractRestClient} from \"./AbstractRestClient\";\r\n\r\nexport interface TokenInterface {\r\n token: string,\r\n expiration: string\r\n}\r\n\r\nexport interface MyAccountInterface {\r\n id: string;\r\n nick: string;\r\n avatar: string;\r\n}\r\n\r\nexport class AuthClient extends AbstractRestClient {\r\n protected defaultUrl: string = 'https://polfan.pl/webservice/api';\r\n\r\n public static async createToken(\r\n login: string,\r\n password: string,\r\n clientName: string = 'pserv-js-client'\r\n ): Promise<TokenInterface> {\r\n const response = await new AuthClient({token: null}).send('POST', 'auth/tokens', {\r\n login, password, client_name: clientName\r\n });\r\n if (response.ok) {\r\n return response.data;\r\n }\r\n throw new Error(`Cannot create user token: ${response.data.errors[0]}`);\r\n }\r\n\r\n public async deleteToken(token: string): Promise<void> {\r\n const response = await this.send('DELETE', `auth/tokens/${token}`);\r\n if (!response.ok) {\r\n throw new Error(`Cannot delete access token: ${response.data.errors[0]}`);\r\n }\r\n }\r\n\r\n public async getMe(): Promise<MyAccountInterface> {\r\n const response = await this.send('GET', 'auth/me');\r\n if (response.ok) {\r\n response.data.id = response.data.id.toString();\r\n return response.data;\r\n }\r\n throw new Error(`Cannot get current user account: ${response.data.errors[0]}`);\r\n }\r\n}","import {AbstractRestClient, RestClientResponse} from \"./AbstractRestClient\";\r\n\r\nexport interface File {\r\n id: string;\r\n url: string;\r\n name: string;\r\n mime: string;\r\n size: number;\r\n width?: number;\r\n height?: number;\r\n}\r\n\r\nexport class FilesClient extends AbstractRestClient {\r\n protected defaultUrl: string = 'https://files.devana.pl';\r\n\r\n public async uploadFile(file: globalThis.File | Blob): Promise<RestClientResponse<File>> {\r\n const name = encodeURIComponent((file as globalThis.File).name ?? '');\r\n let headers = {\r\n ...this.getAuthHeaders(),\r\n Accept: 'application/json',\r\n 'Content-Disposition': `attachment; filename=\"${name}\"`,\r\n 'Content-Length': file.size\r\n };\r\n\r\n const response = await fetch(this.getUrl('files'), {\r\n method: 'POST',\r\n body: file,\r\n headers\r\n });\r\n\r\n return this.convertFetchResponse<File>(response);\r\n }\r\n\r\n public async getFileMeta(id: string): Promise<RestClientResponse<File>> {\r\n return this.send('GET', 'files/' + id);\r\n }\r\n\r\n public async getFileMetaBulk(ids: string[]): Promise<RestClientResponse<File[]>> {\r\n const searchParams = new URLSearchParams();\r\n ids.forEach(id => searchParams.append('id[]', id));\r\n return this.send('GET', 'files?' + searchParams);\r\n }\r\n}","import {WebSocketChatClient} from \"./WebSocketChatClient\";\r\nimport {WebApiChatClient} from \"./WebApiChatClient\";\r\nimport {\r\n IndexedCollection,\r\n IndexedObjectCollection,\r\n ObservableIndexedCollection,\r\n ObservableIndexedObjectCollection\r\n} from \"./IndexedObjectCollection\";\r\nimport { AuthClient, MyAccountInterface, TokenInterface } from \"./AuthClient\";\r\nimport {FilesClient, File} from \"./FilesClient\";\r\nimport { Permissions, PermissionDefinition, Layer } from \"./Permissions\";\r\nimport * as ChatTypes from './types/src';\r\nimport {extractUserFromMember} from \"./state-tracker/functions\";\r\n\r\nexport {\r\n IndexedCollection, ObservableIndexedCollection,\r\n IndexedObjectCollection, ObservableIndexedObjectCollection,\r\n Permissions, PermissionDefinition, Layer,\r\n WebSocketChatClient, WebApiChatClient,\r\n AuthClient,\r\n FilesClient,\r\n extractUserFromMember,\r\n};\r\n\r\nexport type {\r\n ChatTypes,\r\n MyAccountInterface, TokenInterface, File,\r\n};"],"names":["EventTarget","constructor","_defineProperty","Map","on","eventName","handler","addHandler","events","once","onceEvents","off","index","get","indexOf","splice","emit","event","callHandlers","delete","map","handlers","push","set","forEach","callback","AbstractChatClient","args","createEnvelope","type","data","ref","sentCounter","toString","createPromiseFromCommandEnvelope","envelope","Promise","awaitingResponse","handleIncomingEnvelope","has","isError","error","handleEnvelopeSendError","IndexedCollection","items","mutationCounter","_mutationCounter","_items","length","size","item","id","ids","deleteAll","clear","findBy","field","valueToFind","limit","result","entries","next","value","done","IndexedObjectCollection","Array","from","values","getId","getAt","ObservableIndexedCollection","eventTarget","setItems","deletedItems","keys","ObservableIndexedObjectCollection","DeferredTask","promise","resolve","PromiseRegistry","register","key","promises","registerByFunction","fn","notExist","forget","forgetAll","WindowState","TraversableRemoteCollection","LIVE","undefined","state","currentState","hasLatest","LATEST","includes","hasOldest","OLDEST","oldestId","resetToLatest","fetchingState","fetchLatestItems","addItems","fetchPrevious","PAST","fetchItemsBefore","firstItem","refreshFetchedState","fetchNext","fetchItemsAfter","isLatestItemLoaded","newItems","to","trimItemsArrayToLimit","slice","TopicHistoryWindow","roomId","topicId","tracker","client","ev","handleSession","handleNewMessage","_updateMessageReference","refTopic","refMessage","topicRef","message","location","rooms","find","room","afterId","send","after","Error","messages","beforeId","before","getTopic","getTopics","getLatestMessageId","lastMessage","lastMessageId","RoomMessagesHistory","handleRoomUpdated","handleNewTopic","handleTopicDeleted","defaultTopic","createHistoryWindowForTopic","getMessagesWindow","historyWindow","historyWindows","topic","refHistoryWindow","MessagesManager","handleRoomJoin","handleFollowedTopicUpdated","handleTopicFollowed","handleTopicUnfollowed","handleRoomDeleted","handleRoomLeft","getRoomHistory","deferredSession","roomHistories","cacheSpaceFollowedTopics","spaceId","spaces","roomIds","resultPromise","followedTopicsPromises","setFollowedTopicsArray","followedTopics","getRoomFollowedTopics","ackRoomFollowedTopics","collection","followedTopic","missed","calculateRoomMissedMessages","reduce","previousValue","currentValue","_deleteByTopicIds","topicIds","createHistoryForNewRoom","updateLocallyFollowedTopicOnNewMessage","clearRoomFollowedTopicsStructures","roomFollowedTopics","ephemeralMessageTypes","isMe","author","user","me","update","lastAckMessageId","roomToTopics","RoomsManager","handleRoomJoined","handleTopicUpdated","handleRoomMemberJoined","handleRoomMemberLeft","handleRoomMembers","handleRoomMemberUpdated","handleSpaceMemberLeft","handleSpaceMemberUpdated","handleSpaceDeleted","handleUserUpdated","getMembers","membersPromises","members","getMe","userId","list","member","spaceMember","tryToFetchTopicIds","canFetch","topics","topicsPromises","idsToFetch","filter","then","deleteRoom","deleteRoomsBySpaceId","roomMembers","roomMember","newMember","addJoinedRoomTopics","addJoinedRooms","recipients","roles","newTopic","messageCount","reorderRolesOnPriorityUpdate","allRoles","oldRole","updatedRole","increased","priority","decreased","changedRoles","role","extractUserFromMember","SpacesManager","handleNewRoom","handleSpaceUpdated","handleSpaceJoined","handleSpaceMemberJoined","handleSpaceMembers","handleSpaceRooms","handleNewRole","handleRoleDeleted","handleRoleUpdated","getRoles","getRooms","roomsPromises","summary","roomIdToSpaceId","name","description","space","spaceChanged","systemRoom","defaultRooms","addJoinedSpaces","summaries","newRole","rolesToUpdate","Layer","PermissionDefinition","Permissions","getNames","Object","getByName","canBeDefinedOnLayer","permissionName","layer","def","maxLayer","Root","Room","CreateSpaces","Global","ManageSpace","Space","ManageSpaceRoles","ManageRoom","CreateTopics","ManageTopic","Topic","ManageSpaceMembers","ManageRoomMembers","CreateMessages","ManagePermissions","CreateSpaceRooms","ManageSpaceRooms","CreateEmoticons","ManageEmoticon","ManageBan","Kick","ChangeOwnNick","getOvId","target","roleId","Boolean","join","getOvIdByObject","overwrites","PermissionsManager","handlePermissionOverwrites","getOverwrites","validateLocation","overwritesPromises","check","permissionNames","ownedPermissions","calculatePermissions","missing","ok","hasAll","hasAny","fetchMembersOrFail","userRoles","v","filterLocation","collectRoleOverwrites","resolveOverwritesHierarchy","all","deleteOverwritesByIdPrefix","prefix","startsWith","roleOverwrites","resolveOverwritesFromRolesByOrder","allows","denies","sortedOverwrites","sort","a","b","permissionsLength","Math","max","allow","deny","overwriteEvent","revDecDenies","split","reverse","revDecAllows","i","parseInt","permissionOverwritesValues","getRootAccessValue","results","spaceFail","roomFail","GLOBAL_KEY","EmoticonsManager","handleEmoticons","handleNewEmoticon","handleEmoticonDeleted","emoticonsPromises","emoticons","emoticon","emoticonId","UsersManager","handleUsers","handleMembers","getAvailable","users","session","newUser","oldUser","online","onlineStatus","ChatStateTracker","_me","WebSocketChatClientEvent","WebSocketChatClient","options","stateTracking","connect","params","URLSearchParams","queryParams","token","ws","WebSocket","url","onclose","onClose","onmessage","onMessage","connectingTimeoutId","setTimeout","triggerConnectionTimeout","connectingTimeoutMs","authenticated","authenticatedResolvers","disconnect","sendQueue","close","commandType","commandData","CLOSED","CLOSING","readyState","CONNECTING","OPEN","sendEnvelope","JSON","stringify","parse","Event","isAuthenticated","sendFromQueue","clearTimeout","reconnect","code","lastDelay","dataIndex","awaitQueueSendDelayMs","WebApiChatClientEvent","WebApiChatClient","sendStack","attempts","lastTimeoutId","makeApiCall","destroy","reqId","response","json","onError","body","attemptsToSend","attemptDelayMs","bodyJson","headers","Accept","Authorization","fetch","method","catch","AbstractRestClient","uri","getUrl","getAuthHeaders","convertFetchResponse","removeEndingSlash","defaultUrl","removeStartingSlash","status","text","replace","AuthClient","createToken","login","password","clientName","client_name","errors","deleteToken","FilesClient","uploadFile","file","encodeURIComponent","getFileMeta","getFileMetaBulk","searchParams","append"],"sourceRoot":""}
|
|
1
|
+
{"version":3,"file":"index.cjs.js","mappings":"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","sources":["webpack://polfan-server-js-client/webpack/bootstrap","webpack://polfan-server-js-client/webpack/runtime/define property getters","webpack://polfan-server-js-client/webpack/runtime/hasOwnProperty shorthand","webpack://polfan-server-js-client/webpack/runtime/make namespace object","webpack://polfan-server-js-client/./src/EventTarget.ts","webpack://polfan-server-js-client/./src/AbstractChatClient.ts","webpack://polfan-server-js-client/./src/IndexedObjectCollection.ts","webpack://polfan-server-js-client/./src/state-tracker/AsyncUtils.ts","webpack://polfan-server-js-client/./src/state-tracker/TopicHistoryWindow.ts","webpack://polfan-server-js-client/./src/state-tracker/RoomMessagesHistory.ts","webpack://polfan-server-js-client/./src/state-tracker/MessagesManager.ts","webpack://polfan-server-js-client/./src/state-tracker/RoomsManager.ts","webpack://polfan-server-js-client/./src/state-tracker/functions.ts","webpack://polfan-server-js-client/./src/state-tracker/SpacesManager.ts","webpack://polfan-server-js-client/./src/Permissions.ts","webpack://polfan-server-js-client/./src/state-tracker/PermissionsManager.ts","webpack://polfan-server-js-client/./src/state-tracker/EmoticonsManager.ts","webpack://polfan-server-js-client/./src/state-tracker/UsersManager.ts","webpack://polfan-server-js-client/./src/state-tracker/RelationshipsManager.ts","webpack://polfan-server-js-client/./src/state-tracker/ChatStateTracker.ts","webpack://polfan-server-js-client/./src/WebSocketChatClient.ts","webpack://polfan-server-js-client/./src/WebApiChatClient.ts","webpack://polfan-server-js-client/./src/AbstractRestClient.ts","webpack://polfan-server-js-client/./src/AuthClient.ts","webpack://polfan-server-js-client/./src/FilesClient.ts","webpack://polfan-server-js-client/./src/index.ts"],"sourcesContent":["// The require scope\nvar __webpack_require__ = {};\n\n","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","export type EventHandler<EventT> = (ev?: EventT) => void;\r\ntype HandlersMap<EventT> = Map<string, EventHandler<EventT>[]>;\r\n\r\nexport interface ObservableInterface<EventT = any> {\r\n on(eventName: string, handler: EventHandler<EventT>): this;\r\n once(eventName: string, handler: EventHandler<EventT>): this;\r\n off(eventName: string, handler: EventHandler<EventT>): this;\r\n}\r\n\r\nexport class EventTarget<EventT = any> implements ObservableInterface<EventT> {\r\n protected events: HandlersMap<EventT> = new Map<string, EventHandler<EventT>[]>();\r\n protected onceEvents: HandlersMap<EventT> = new Map<string, EventHandler<EventT>[]>();\r\n\r\n public on(eventName: string, handler: EventHandler<EventT>): this {\r\n this.addHandler(this.events, eventName, handler);\r\n return this;\r\n }\r\n\r\n public once(eventName: string, handler: EventHandler<EventT>): this {\r\n this.addHandler(this.onceEvents, eventName, handler);\r\n return this;\r\n }\r\n\r\n public off(eventName: string, handler: EventHandler<EventT>): this {\r\n const index = this.events.get(eventName)?.indexOf(handler);\r\n if (!index || index < 0) {\r\n return this;\r\n }\r\n this.events.get(eventName).splice(index, 1);\r\n return this;\r\n }\r\n\r\n public emit(eventName: string, event?: EventT): this {\r\n this.callHandlers(this.events, eventName, event);\r\n this.callHandlers(this.onceEvents, eventName, event);\r\n this.onceEvents.delete(eventName);\r\n return this;\r\n }\r\n\r\n private addHandler(map: HandlersMap<EventT>, eventName: string, handler: EventHandler<EventT>): void {\r\n const handlers = map.get(eventName) ?? [];\r\n handlers.push(handler);\r\n map.set(eventName, handlers);\r\n }\r\n\r\n private callHandlers(map: HandlersMap<EventT>, eventName: string, event: EventT): void {\r\n map.get(eventName)?.forEach(callback => callback(event));\r\n }\r\n}","import {\r\n Bye,\r\n GetSession,\r\n JoinSpace,\r\n Session,\r\n SpaceJoined,\r\n Error as ErrorType,\r\n SpaceLeft,\r\n SpaceMemberJoined,\r\n SpaceMemberLeft,\r\n SpaceMemberUpdated,\r\n SpaceDeleted,\r\n SpaceMembers,\r\n SpaceRooms,\r\n NewRole,\r\n RoomDeleted,\r\n RoomJoined,\r\n RoomLeft,\r\n RoomMemberLeft,\r\n RoomMemberJoined,\r\n RoomMembers,\r\n NewRoom,\r\n NewTopic,\r\n TopicDeleted,\r\n NewMessage,\r\n GetPermissionOverwrites,\r\n GetComputedPermissions,\r\n LeaveSpace,\r\n CreateSpace,\r\n DeleteSpace,\r\n GetSpaceMembers,\r\n GetSpaceRooms,\r\n CreateRole,\r\n DeleteRole,\r\n AssignRole,\r\n DeassignRole,\r\n SetPermissionOverwrites,\r\n JoinRoom,\r\n LeaveRoom,\r\n CreateRoom,\r\n DeleteRoom,\r\n GetRoomMembers,\r\n CreateTopic,\r\n DeleteTopic,\r\n CreateMessage,\r\n Envelope,\r\n PermissionOverwrites,\r\n PermissionOverwritesUpdated,\r\n RoomMemberUpdated,\r\n UpdateRole,\r\n RoleUpdated,\r\n Ack,\r\n UserUpdated,\r\n UpdateRoom,\r\n RoomUpdated,\r\n UpdateSpace,\r\n SpaceUpdated,\r\n PermissionOverwriteTargets,\r\n GetPermissionOverwriteTargets,\r\n Owners,\r\n Ok,\r\n GetOwners,\r\n CreateOwner,\r\n RoleDeleted,\r\n FollowedTopicUpdated,\r\n TopicFollowed,\r\n TopicUnfollowed,\r\n FollowedTopics,\r\n FollowTopic,\r\n UnfollowTopic,\r\n GetFollowedTopics,\r\n Messages,\r\n GetMessages,\r\n Topics,\r\n GetTopics,\r\n TopicUpdated,\r\n UpdateTopic,\r\n GetDiscoverableSpaces,\r\n DiscoverableSpaces,\r\n CreateEmoticon,\r\n DeleteEmoticon,\r\n GetEmoticons,\r\n Emoticons,\r\n EmoticonDeleted,\r\n NewEmoticon, Bans, GetBans, Ban, Unban, Kick, ClientData, GetClientData, SetClientData,\r\n GetRoomSummary,\r\n GetSpaceSummary,\r\n RoomSummaryEvent,\r\n SpaceSummaryEvent,\r\n SetCustomNick, Relationships, RelationshipDeleted, NewRelationship, DeleteRelationship, CreateRelationship,\r\n} from \"./types/src/index\";\r\nimport {EventTarget} from \"./EventTarget\";\r\nimport {GetRelationships} from \"./types/src/schemes/commands/GetRelationships\";\r\n\r\ntype ArrayOfPromiseResolvers = [(value: any) => void, (reason?: any) => void];\r\n\r\nexport abstract class AbstractChatClient extends EventTarget {\r\n protected awaitingResponse: Map<string, ArrayOfPromiseResolvers> = new Map<string, ArrayOfPromiseResolvers>();\r\n protected sentCounter: number = 0;\r\n\r\n public abstract send<CommandType extends keyof CommandsMap>\r\n (commandType: CommandType, commandData: CommandsMap[CommandType][0]): Promise<CommandResult<CommandsMap[CommandType][1]>>;\r\n\r\n public on<EventName extends keyof EventsMap>\r\n (eventName: EventName | string, handler: (event: EventsMap[EventName]) => void): this {\r\n return super.on(eventName, handler);\r\n }\r\n\r\n public once<EventName extends keyof EventsMap>\r\n (eventName: EventName, handler: (event: EventsMap[EventName]) => void): this {\r\n return super.once(eventName, handler);\r\n }\r\n\r\n protected createEnvelope<CommandT>(type: string, data: CommandT): Envelope<CommandT> {\r\n return {\r\n type, data, ref: (++this.sentCounter).toString()\r\n };\r\n }\r\n\r\n protected createPromiseFromCommandEnvelope\r\n <CommandT extends keyof CommandsMap>(envelope: Envelope<CommandsMap[CommandT][0]>):\r\n Promise<CommandResult<CommandsMap[CommandT][1]>> {\r\n return new Promise((...args) =>\r\n this.awaitingResponse.set(envelope.ref as string, args));\r\n }\r\n\r\n protected handleIncomingEnvelope(envelope: Envelope): void {\r\n if (!this.awaitingResponse.has(envelope.ref)) {\r\n return;\r\n }\r\n const isError = envelope.type === 'Error';\r\n this.awaitingResponse.get(envelope.ref)[0]({\r\n data: isError ? null : envelope.data,\r\n error: isError ? envelope.data : null,\r\n } as CommandResult<any>);\r\n this.awaitingResponse.delete(envelope.ref);\r\n }\r\n\r\n protected handleEnvelopeSendError(envelope: Envelope, error: any): void {\r\n if (!this.awaitingResponse.has(envelope.ref)) {\r\n return;\r\n }\r\n this.awaitingResponse.get(envelope.ref)[0](error);\r\n this.awaitingResponse.delete(envelope.ref);\r\n }\r\n}\r\n\r\nexport type CommandResult<ResultT> = {data?: ResultT, error?: ErrorType};\r\n\r\n/**\r\n * Map of incoming events.\r\n */\r\nexport type EventsMap = {\r\n // General Events\r\n Bye: Bye,\r\n Ok: Ok,\r\n Error: ErrorType,\r\n Session: Session,\r\n Permissions: Permissions,\r\n PermissionOverwrites: PermissionOverwrites,\r\n PermissionOverwritesUpdated: PermissionOverwritesUpdated,\r\n PermissionOverwriteTargets: PermissionOverwriteTargets,\r\n Owners: Owners,\r\n NewEmoticon: NewEmoticon,\r\n EmoticonDeleted: EmoticonDeleted,\r\n Emoticons: Emoticons,\r\n Bans: Bans,\r\n ClientData: ClientData,\r\n NewRelationship: NewRelationship,\r\n RelationshipDeleted: RelationshipDeleted,\r\n Relationships: Relationships,\r\n // Space events\r\n DiscoverableSpaces: DiscoverableSpaces,\r\n SpaceJoined: SpaceJoined,\r\n SpaceLeft: SpaceLeft,\r\n SpaceMemberJoined: SpaceMemberJoined,\r\n SpaceMemberLeft: SpaceMemberLeft,\r\n SpaceMemberUpdated: SpaceMemberUpdated,\r\n SpaceUpdated: SpaceUpdated,\r\n SpaceDeleted: SpaceDeleted,\r\n SpaceMembers: SpaceMembers,\r\n SpaceRooms: SpaceRooms,\r\n NewRole: NewRole,\r\n RoleDeleted: RoleDeleted,\r\n RoleUpdated: RoleUpdated,\r\n SpaceSummaryEvent: SpaceSummaryEvent,\r\n // Room events\r\n RoomJoined: RoomJoined,\r\n RoomLeft: RoomLeft,\r\n RoomMemberJoined: RoomMemberJoined,\r\n RoomMemberLeft: RoomMemberLeft,\r\n RoomMemberUpdated: RoomMemberUpdated,\r\n RoomMembers: RoomMembers,\r\n NewRoom: NewRoom,\r\n RoomDeleted: RoomDeleted,\r\n RoomUpdated: RoomUpdated,\r\n RoomSummaryEvent: RoomSummaryEvent,\r\n // Topic events\r\n NewTopic: NewTopic,\r\n TopicDeleted: TopicDeleted,\r\n NewMessage: NewMessage,\r\n UserUpdated: UserUpdated,\r\n TopicFollowed: TopicFollowed,\r\n TopicUnfollowed: TopicUnfollowed,\r\n FollowedTopics: FollowedTopics,\r\n FollowedTopicUpdated: FollowedTopicUpdated,\r\n Messages: Messages,\r\n Topics: Topics,\r\n TopicUpdated: TopicUpdated,\r\n};\r\n\r\n/**\r\n * Map of commands and their corresponding events.\r\n */\r\nexport type CommandsMap = {\r\n // General commands\r\n GetSession: [GetSession, EventsMap['Session']],\r\n SetPermissionOverwrites: [SetPermissionOverwrites, EventsMap['PermissionOverwritesUpdated']],\r\n GetPermissionOverwrites: [GetPermissionOverwrites, EventsMap['PermissionOverwrites']],\r\n GetComputedPermissions: [GetComputedPermissions, EventsMap['Permissions']],\r\n GetPermissionOverwriteTargets: [GetPermissionOverwriteTargets, EventsMap['PermissionOverwriteTargets']],\r\n GetOwners: [GetOwners, EventsMap['Owners']],\r\n CreateOwner: [CreateOwner, EventsMap['Owners']],\r\n DeleteOwner: [CreateOwner, EventsMap['Owners']],\r\n CreateEmoticon: [CreateEmoticon, EventsMap['NewEmoticon']],\r\n DeleteEmoticon: [DeleteEmoticon, EventsMap['EmoticonDeleted']],\r\n GetEmoticons: [GetEmoticons, EventsMap['Emoticons']],\r\n GetBans: [GetBans, EventsMap['Bans']],\r\n Ban: [Ban, EventsMap['Ok']],\r\n Unban: [Unban, EventsMap['Ok']],\r\n Kick: [Kick, EventsMap['Ok']],\r\n GetClientData: [GetClientData, EventsMap['ClientData']],\r\n SetClientData: [SetClientData, EventsMap['Ok']],\r\n DeleteRelationship: [DeleteRelationship, EventsMap['RelationshipDeleted']],\r\n CreateRelationship: [CreateRelationship, EventsMap['NewRelationship']],\r\n GetRelationships: [GetRelationships, EventsMap['Relationships']],\r\n // Space commands\r\n GetDiscoverableSpaces: [GetDiscoverableSpaces, EventsMap['DiscoverableSpaces']],\r\n JoinSpace: [JoinSpace, EventsMap['SpaceJoined']],\r\n LeaveSpace: [LeaveSpace, EventsMap['SpaceLeft']],\r\n CreateSpace: [CreateSpace, EventsMap['SpaceJoined']],\r\n UpdateSpace: [UpdateSpace, EventsMap['SpaceUpdated']],\r\n DeleteSpace: [DeleteSpace, EventsMap['SpaceDeleted']],\r\n GetSpaceMembers: [GetSpaceMembers, EventsMap['SpaceMembers']],\r\n GetSpaceRooms: [GetSpaceRooms, EventsMap['SpaceRooms']],\r\n CreateRole: [CreateRole, EventsMap['NewRole']],\r\n DeleteRole: [DeleteRole, EventsMap['RoleDeleted']],\r\n UpdateRole: [UpdateRole, EventsMap['RoleUpdated']],\r\n AssignRole: [AssignRole, EventsMap['SpaceMemberUpdated'] | EventsMap['RoomMemberUpdated']],\r\n DeassignRole: [DeassignRole, EventsMap['SpaceMemberUpdated'] | EventsMap['RoomMemberUpdated']],\r\n GetSpaceSummary: [GetSpaceSummary, EventsMap['SpaceSummaryEvent']],\r\n SetCustomNick: [SetCustomNick, EventsMap['SpaceMemberUpdated']],\r\n // Room commands\r\n JoinRoom: [JoinRoom, EventsMap['RoomJoined']],\r\n LeaveRoom: [LeaveRoom, EventsMap['RoomLeft']],\r\n CreateRoom: [CreateRoom, EventsMap['RoomJoined']],\r\n DeleteRoom: [DeleteRoom, EventsMap['RoomDeleted']],\r\n UpdateRoom: [UpdateRoom, EventsMap['RoomUpdated']],\r\n GetRoomMembers: [GetRoomMembers, EventsMap['RoomMembers']],\r\n GetRoomSummary: [GetRoomSummary, EventsMap['RoomSummaryEvent']],\r\n // Topic commands\r\n CreateTopic: [CreateTopic, EventsMap['NewTopic']],\r\n DeleteTopic: [DeleteTopic, EventsMap['TopicDeleted']],\r\n CreateMessage: [CreateMessage, EventsMap['NewMessage']],\r\n Ack: [Ack, EventsMap['FollowedTopicUpdated'] | EventsMap['Ok']],\r\n FollowTopic: [FollowTopic, EventsMap['TopicFollowed']],\r\n UnfollowTopic: [UnfollowTopic, EventsMap['TopicUnfollowed']],\r\n GetFollowedTopics: [GetFollowedTopics, EventsMap['FollowedTopics']],\r\n GetMessages: [GetMessages, EventsMap['Messages']],\r\n GetTopics: [GetTopics, EventsMap['Topics']],\r\n UpdateTopic: [UpdateTopic, EventsMap['TopicUpdated']],\r\n}","import {EventTarget, ObservableInterface} from \"./EventTarget\";\r\n\r\nexport class IndexedCollection<KeyT, ValueT> {\r\n protected _items: Map<KeyT, ValueT> = new Map();\r\n protected _mutationCounter: number = 0;\r\n\r\n public constructor(items: [key: KeyT, value: ValueT][] = []) {\r\n this.set(...items);\r\n }\r\n\r\n public get mutationCounter(): number {\r\n return this._mutationCounter;\r\n }\r\n\r\n public get items(): Map<KeyT, ValueT> {\r\n return this._items;\r\n }\r\n\r\n public get length(): number {\r\n return this._items.size;\r\n }\r\n\r\n public set(...items: [KeyT, ValueT][]): void {\r\n this._mutationCounter++;\r\n for (const item of items) {\r\n this._items.set(item[0], item[1]);\r\n }\r\n }\r\n\r\n public get(id: KeyT): ValueT | undefined {\r\n return this.items.get(id);\r\n }\r\n\r\n public has(id: KeyT): boolean {\r\n return this.items.has(id);\r\n }\r\n\r\n public delete(...ids: KeyT[]): void {\r\n for (const id of ids) {\r\n this.items.delete(id);\r\n }\r\n }\r\n\r\n public deleteAll(): void {\r\n this.items.clear();\r\n }\r\n\r\n public findBy(field: keyof ValueT, valueToFind: any, limit: number = null): IndexedCollection<KeyT, ValueT> {\r\n const result = new IndexedCollection<KeyT, ValueT>();\r\n let item;\r\n while (!(item = this.items.entries().next().value).done) {\r\n if (limit && result.length === limit) {\r\n break;\r\n }\r\n if (item[1][field] === valueToFind) {\r\n result.set(item);\r\n }\r\n }\r\n return result;\r\n }\r\n}\r\n\r\nexport class IndexedObjectCollection<T> {\r\n protected _items: IndexedCollection<string, T>;\r\n\r\n public constructor(\r\n public readonly id: keyof T | ((item: T) => any),\r\n items: T[] = [],\r\n ) {\r\n this._items = new IndexedCollection<string, T>();\r\n this.set(...items);\r\n }\r\n\r\n public get items(): T[] {\r\n return Array.from(this._items.items.values());\r\n }\r\n\r\n public get length(): number {\r\n return this._items.length;\r\n }\r\n\r\n public get mutationCounter(): number {\r\n return this._items.mutationCounter;\r\n }\r\n\r\n public set(...items: T[]): void {\r\n this._items.set(...(items.map(item => [this.getId(item), item] as [string, T])));\r\n }\r\n\r\n public get(id: any): T | undefined {\r\n return this._items.get(id);\r\n }\r\n\r\n public getAt(index: number): T | undefined {\r\n return this.items[index];\r\n }\r\n\r\n public has(id: any): boolean {\r\n return this._items.has(id);\r\n }\r\n\r\n public delete(...ids: any[]): void {\r\n this._items.delete(...ids);\r\n }\r\n\r\n public deleteAll(): void {\r\n this._items.deleteAll();\r\n }\r\n\r\n public findBy(field: keyof T, valueToFind: any, limit: number = null): IndexedObjectCollection<T> {\r\n const result = new IndexedObjectCollection<T>(this.id);\r\n for (const value of this.items) {\r\n if (limit && result.length === limit) {\r\n break;\r\n }\r\n if (value[field] === valueToFind) {\r\n result.set(value);\r\n }\r\n }\r\n return result;\r\n }\r\n\r\n protected getId(item: T): any {\r\n return typeof this.id === 'function' ? this.id(item) : item[this.id];\r\n }\r\n}\r\n\r\ninterface ObservableCollectionEvent<KeyT> {\r\n setItems?: KeyT[],\r\n deletedItems?: KeyT[],\r\n}\r\n\r\nexport class ObservableIndexedCollection<KeyT, ValueT> extends IndexedCollection<KeyT, ValueT> implements ObservableInterface {\r\n protected eventTarget: EventTarget<ObservableCollectionEvent<KeyT>>;\r\n\r\n public constructor(items: [key: KeyT, value: ValueT][] = []) {\r\n super();\r\n this.eventTarget = new EventTarget<ObservableCollectionEvent<KeyT>>();\r\n this.set(...items);\r\n }\r\n\r\n public set(...items: [KeyT, ValueT][]) {\r\n if (items.length) {\r\n super.set(...items);\r\n this.eventTarget.emit('change', {setItems: items.map(item => item[0])});\r\n }\r\n }\r\n\r\n public delete(...ids: KeyT[]) {\r\n if (ids.length) {\r\n super.delete(...ids);\r\n this.eventTarget.emit('change', {deletedItems: ids});\r\n }\r\n }\r\n\r\n public deleteAll() {\r\n if (this.length) {\r\n const ids = this._items.keys();\r\n super.deleteAll();\r\n this.eventTarget.emit('change', {deletedItems: Array.from(ids)});\r\n }\r\n }\r\n\r\n public on(eventName: 'change', handler: (ev?: ObservableCollectionEvent<KeyT>) => void): this {\r\n this.eventTarget.on(eventName, handler);\r\n return this;\r\n }\r\n\r\n public once(eventName: 'change', handler: (ev?: ObservableCollectionEvent<KeyT>) => void): this {\r\n this.eventTarget.once(eventName, handler);\r\n return this;\r\n }\r\n\r\n public off(eventName: string, handler: (ev?: ObservableCollectionEvent<KeyT>) => void): this {\r\n this.eventTarget.off(eventName, handler);\r\n return this;\r\n }\r\n}\r\n\r\nexport class ObservableIndexedObjectCollection<T> extends IndexedObjectCollection<T> implements ObservableInterface {\r\n protected eventTarget: EventTarget<ObservableCollectionEvent<string>>;\r\n\r\n public constructor(\r\n public readonly id: keyof T | ((item: T) => string),\r\n items: T[] = [],\r\n ) {\r\n super(id);\r\n this.eventTarget = new EventTarget();\r\n this.set(...items);\r\n }\r\n\r\n public set(...items: T[]) {\r\n if (items.length) {\r\n super.set(...items);\r\n this.eventTarget.emit('change', {setItems: items.map(item => this.getId(item))});\r\n }\r\n }\r\n\r\n public delete(...ids: string[]) {\r\n if (ids.length) {\r\n super.delete(...ids);\r\n this.eventTarget.emit('change', {deletedItems: ids});\r\n }\r\n }\r\n\r\n public deleteAll() {\r\n if (this.length) {\r\n const ids = this._items.items.keys();\r\n super.deleteAll();\r\n this.eventTarget.emit('change', {deletedItems: Array.from(ids)});\r\n }\r\n }\r\n\r\n public on(eventName: 'change', handler: (ev?: ObservableCollectionEvent<string>) => void): this {\r\n this.eventTarget.on(eventName, handler);\r\n return this;\r\n }\r\n\r\n public once(eventName: 'change', handler: (ev?: ObservableCollectionEvent<string>) => void): this {\r\n this.eventTarget.once(eventName, handler);\r\n return this;\r\n }\r\n\r\n public off(eventName: string, handler: (ev?: ObservableCollectionEvent<string>) => void): this {\r\n this.eventTarget.off(eventName, handler);\r\n return this;\r\n }\r\n}","import {IndexedCollection} from \"../IndexedObjectCollection\";\r\n\r\nexport class DeferredTask {\r\n public readonly promise: Promise<void>;\r\n public resolve: () => void;\r\n\r\n public constructor() {\r\n this.promise = new Promise<void>((resolve) => this.resolve = resolve);\r\n }\r\n}\r\n\r\nexport class PromiseRegistry {\r\n private promises = new IndexedCollection<string, Promise<any>>();\r\n\r\n public register<T = any>(promise: Promise<T>, key: string): void {\r\n this.promises.set([key, promise]);\r\n }\r\n\r\n public registerByFunction(fn: () => Promise<any>, key: string): void {\r\n this.register(fn(), key);\r\n }\r\n\r\n public get<T = any>(key: string): Promise<T> | undefined {\r\n return this.promises.get(key);\r\n }\r\n\r\n public has(key: string): boolean {\r\n return this.promises.has(key);\r\n }\r\n\r\n public notExist(key: string): boolean {\r\n return ! this.has(key);\r\n }\r\n\r\n public forget(...keys: string[]): void {\r\n this.promises.delete(...keys);\r\n }\r\n\r\n public forgetAll(): void {\r\n this.promises.deleteAll();\r\n }\r\n}","import {Message, NewMessage, Session, Topic} from \"../types/src\";\r\nimport {ChatStateTracker} from \"./ChatStateTracker\";\r\nimport {ObservableIndexedObjectCollection} from \"../IndexedObjectCollection\";\r\n\r\nexport enum WindowState {\r\n /**\r\n * The latest messages (those received live) are available in the history window, history has not been fetched.\r\n */\r\n LIVE,\r\n\r\n /**\r\n * The latest messages has been fetched and are available in the history window.\r\n */\r\n LATEST,\r\n\r\n /**\r\n * The historical messages have been fetched and are available in the history window.\r\n * Latest messages are not available and will not be available.\r\n */\r\n PAST,\r\n\r\n /**\r\n * The oldest messages have been fetched and are available in the history window.\r\n * Next attempts to fetch previous messages will result with no-op.\r\n */\r\n OLDEST,\r\n}\r\n\r\nexport abstract class TraversableRemoteCollection<T> extends ObservableIndexedObjectCollection<T> {\r\n /**\r\n * Current mode od collection window. To change mode, call one of available fetch methods.\r\n */\r\n public get state(): WindowState {\r\n return this.currentState;\r\n }\r\n\r\n /**\r\n * Maximum numer of items stored in window.\r\n * Null for unlimited.\r\n */\r\n public limit: number | null = 50;\r\n\r\n private currentState: WindowState = WindowState.LIVE;\r\n private fetchingState: WindowState = undefined;\r\n public oldestId: string = null;\r\n\r\n public get hasLatest(): boolean {\r\n return [WindowState.LATEST, WindowState.LIVE].includes(this.state);\r\n }\r\n\r\n public get hasOldest(): boolean {\r\n return this.state === WindowState.OLDEST || this.oldestId !== null && this.has(this.oldestId);\r\n }\r\n\r\n public async resetToLatest(): Promise<void> {\r\n if (this.fetchingState || this.currentState === WindowState.LATEST) {\r\n return;\r\n }\r\n\r\n this.fetchingState = WindowState.LATEST;\r\n\r\n let result;\r\n\r\n try {\r\n result = await this.fetchLatestItems();\r\n } finally {\r\n this.fetchingState = undefined;\r\n }\r\n\r\n this.deleteAll();\r\n this.addItems(result, 'tail');\r\n this.currentState = WindowState.LATEST;\r\n }\r\n\r\n public async fetchPrevious(): Promise<void> {\r\n if (this.fetchingState || this.hasOldest) {\r\n return;\r\n }\r\n\r\n this.fetchingState = WindowState.PAST;\r\n\r\n let result;\r\n\r\n try {\r\n result = await this.fetchItemsBefore();\r\n } finally {\r\n this.fetchingState = undefined;\r\n }\r\n\r\n if (! result) {\r\n return this.resetToLatest();\r\n }\r\n\r\n if (! result.length) {\r\n const firstItem = this.getAt(0);\r\n this.oldestId = firstItem ? this.getId(firstItem) : null;\r\n\r\n await this.refreshFetchedState();\r\n\r\n // LATEST state has priority over OLDEST\r\n if (this.currentState === WindowState.PAST) {\r\n this.currentState = WindowState.OLDEST;\r\n }\r\n\r\n return;\r\n }\r\n\r\n this.addItems(result, 'head');\r\n await this.refreshFetchedState();\r\n }\r\n\r\n public async fetchNext(): Promise<void> {\r\n if (this.fetchingState || this.hasLatest) {\r\n return;\r\n }\r\n\r\n this.fetchingState = WindowState.PAST;\r\n\r\n let result;\r\n\r\n try {\r\n result = await this.fetchItemsAfter();\r\n } finally {\r\n this.fetchingState = undefined;\r\n }\r\n\r\n if (! result) {\r\n await this.resetToLatest();\r\n return;\r\n }\r\n\r\n if (result.length) {\r\n this.addItems(result, 'tail');\r\n await this.refreshFetchedState();\r\n return;\r\n }\r\n }\r\n\r\n protected abstract fetchLatestItems(): Promise<T[]>;\r\n\r\n protected abstract fetchItemsBefore(): Promise<T[] | null>;\r\n\r\n protected abstract fetchItemsAfter(): Promise<T[] | null>;\r\n\r\n protected abstract isLatestItemLoaded(): Promise<boolean>;\r\n\r\n protected async refreshFetchedState(): Promise<void> {\r\n this.currentState = (await this.isLatestItemLoaded()) ? WindowState.LATEST : WindowState.PAST;\r\n }\r\n\r\n protected addItems(newItems: T[], to: 'head' | 'tail'): void {\r\n let result;\r\n\r\n if (to === 'head') {\r\n result = this.trimItemsArrayToLimit([...newItems, ...this.items], 'tail');\r\n }\r\n\r\n if (to === 'tail') {\r\n result = this.trimItemsArrayToLimit([...this.items, ...newItems], 'head');\r\n }\r\n\r\n this.deleteAll();\r\n this.set(...result);\r\n }\r\n\r\n /**\r\n * Return array with messages of count that matching limit.\r\n */\r\n private trimItemsArrayToLimit(items: T[], from: 'head' | 'tail'): T[] {\r\n if (this.limit === null) {\r\n return items;\r\n }\r\n\r\n if (from === 'head') {\r\n return items.slice(-this.limit);\r\n }\r\n\r\n if (from === 'tail') {\r\n return items.slice(0, this.limit);\r\n }\r\n }\r\n}\r\n\r\nexport class TopicHistoryWindow extends TraversableRemoteCollection<Message> {\r\n /**\r\n * Reexported available window modes enum.\r\n */\r\n public readonly WindowState: typeof WindowState = WindowState;\r\n\r\n public constructor(\r\n private roomId: string,\r\n private topicId: string,\r\n private tracker: ChatStateTracker,\r\n ) {\r\n super('id');\r\n this.tracker.client.on('Session', ev => this.handleSession(ev));\r\n this.tracker.client.on('NewMessage', ev => this.handleNewMessage(ev));\r\n }\r\n\r\n /**\r\n * For internal use.\r\n * @internal\r\n */\r\n public _updateMessageReference(refTopic: Topic): void {\r\n const refMessage = this.get(refTopic.refMessage.id);\r\n\r\n if (refMessage) {\r\n // Update referenced topic ID in message\r\n this.set({...refMessage, topicRef: refTopic.id});\r\n }\r\n }\r\n\r\n private async handleNewMessage(ev: NewMessage): Promise<void> {\r\n if (\r\n [WindowState.LATEST, WindowState.LIVE].includes(this.state)\r\n && ev.message.location.roomId === this.roomId\r\n && ev.message.location.topicId === this.topicId\r\n ) {\r\n this.addItems([ev.message], 'tail');\r\n }\r\n }\r\n\r\n private handleSession(ev: Session): void {\r\n const rooms = ev.state.rooms;\r\n\r\n if (rooms.find(room => room.id === this.roomId)) {\r\n this.resetToLatest();\r\n } else {\r\n this.deleteAll();\r\n }\r\n }\r\n\r\n protected async fetchItemsAfter(): Promise<Message[] | null> {\r\n const afterId = this.getAt(this.length - 1)?.id;\r\n\r\n if (! afterId) {\r\n // If there is no message to refer, fetch latest\r\n return null;\r\n }\r\n\r\n const result = await this.tracker.client.send('GetMessages', {\r\n location: {roomId: this.roomId, topicId: this.topicId},\r\n after: afterId,\r\n });\r\n\r\n if (result.error) {\r\n throw new Error(`Cannot fetch messages: ${result.error.message}`);\r\n }\r\n\r\n return result.data.messages;\r\n }\r\n\r\n protected async fetchItemsBefore(): Promise<Message[] | null> {\r\n const beforeId = this.getAt(0)?.id;\r\n\r\n if (! beforeId) {\r\n // If there is no message to refer, fetch latest\r\n return null;\r\n }\r\n\r\n const result = await this.tracker.client.send('GetMessages', {\r\n location: {roomId: this.roomId, topicId: this.topicId},\r\n before: beforeId,\r\n });\r\n\r\n if (result.error) {\r\n throw new Error(`Cannot fetch messages: ${result.error.message}`);\r\n }\r\n\r\n return result.data.messages;\r\n }\r\n\r\n protected async fetchLatestItems(): Promise<Message[]> {\r\n const result = await this.tracker.client.send('GetMessages', {\r\n location: {roomId: this.roomId, topicId: this.topicId},\r\n });\r\n\r\n if (result.error) {\r\n throw new Error(`Cannot fetch messages: ${result.error.message}`);\r\n }\r\n\r\n return result.data.messages;\r\n }\r\n\r\n private async getTopic(): Promise<Topic | undefined> {\r\n return (await this.tracker.rooms.getTopics(this.roomId, [this.topicId])).get(this.topicId);\r\n }\r\n\r\n private async getLatestMessageId(): Promise<string | undefined> {\r\n return (await this.getTopic())?.lastMessage?.id;\r\n }\r\n\r\n protected async isLatestItemLoaded(): Promise<boolean> {\r\n const lastMessageId = await this.getLatestMessageId();\r\n return lastMessageId ? this.has(lastMessageId) : true;\r\n }\r\n}","import {ChatStateTracker} from \"./ChatStateTracker\";\r\nimport {NewTopic, Room, RoomUpdated, Topic, TopicDeleted} from \"../types/src\";\r\nimport {IndexedCollection,} from \"../IndexedObjectCollection\";\r\nimport {TopicHistoryWindow} from \"./TopicHistoryWindow\";\r\n\r\nexport class RoomMessagesHistory {\r\n private historyWindows = new IndexedCollection<string, TopicHistoryWindow>();\r\n\r\n public constructor(\r\n private room: Room,\r\n private tracker: ChatStateTracker,\r\n ) {\r\n this.tracker.client.on('RoomUpdated', ev => this.handleRoomUpdated(ev));\r\n this.tracker.client.on('NewTopic', ev => this.handleNewTopic(ev));\r\n this.tracker.client.on('TopicDeleted', ev => this.handleTopicDeleted(ev));\r\n\r\n if (this.room.defaultTopic) {\r\n this.createHistoryWindowForTopic(this.room.defaultTopic);\r\n }\r\n }\r\n\r\n /**\r\n * Returns a history window object for the given topic ID, allowing you to view message history.\r\n */\r\n public async getMessagesWindow(topicId: string): Promise<TopicHistoryWindow | undefined> {\r\n let historyWindow = this.historyWindows.get(topicId);\r\n\r\n if (! historyWindow) {\r\n const topic = (await this.tracker.rooms.getTopics(this.room.id, [topicId])).get(topicId);\r\n\r\n if (topic) {\r\n this.createHistoryWindowForTopic(topic);\r\n }\r\n }\r\n\r\n return this.historyWindows.get(topicId);\r\n }\r\n\r\n private handleRoomUpdated(ev: RoomUpdated): void {\r\n if (this.room.id === ev.room.id) {\r\n this.room = ev.room;\r\n\r\n if (ev.room.defaultTopic) {\r\n this.createHistoryWindowForTopic(ev.room.defaultTopic);\r\n }\r\n }\r\n }\r\n\r\n private handleNewTopic(ev: NewTopic): void {\r\n if (this.room.id === ev.roomId) {\r\n this.createHistoryWindowForTopic(ev.topic);\r\n }\r\n }\r\n\r\n private handleTopicDeleted(ev: TopicDeleted): void {\r\n if (this.room.id === ev.location.roomId) {\r\n this.historyWindows.delete(ev.location.topicId);\r\n }\r\n }\r\n\r\n private createHistoryWindowForTopic(topic: Topic): void {\r\n if (this.historyWindows.has(topic.id)) {\r\n return;\r\n }\r\n\r\n this.historyWindows.set([topic.id, new TopicHistoryWindow(this.room.id, topic.id, this.tracker)]);\r\n\r\n // If new topic refers to some message from this room, update other structures\r\n if (topic.refMessage) {\r\n const refHistoryWindow = this.historyWindows.get(topic.refMessage.location.topicId);\r\n refHistoryWindow?._updateMessageReference(topic);\r\n }\r\n }\r\n}","import {ChatStateTracker} from \"./ChatStateTracker\";\r\nimport {\r\n ChatLocation,\r\n NewMessage,\r\n FollowedTopic,\r\n TopicFollowed,\r\n TopicUnfollowed,\r\n RoomDeleted,\r\n RoomLeft,\r\n TopicDeleted,\r\n FollowedTopicUpdated, RoomJoined, NewTopic, Session, Room, MessageType,\r\n} from \"../types/src\";\r\nimport {\r\n IndexedCollection,\r\n ObservableIndexedObjectCollection\r\n} from \"../IndexedObjectCollection\";\r\nimport {DeferredTask, PromiseRegistry} from \"./AsyncUtils\";\r\nimport {RoomMessagesHistory} from \"./RoomMessagesHistory\";\r\n\r\nexport class MessagesManager {\r\n private readonly roomHistories = new IndexedCollection<string, RoomMessagesHistory>();\r\n private readonly followedTopics = new IndexedCollection<string, ObservableIndexedObjectCollection<FollowedTopic>>();\r\n private readonly followedTopicsPromises = new PromiseRegistry();\r\n private readonly deferredSession = new DeferredTask();\r\n\r\n public constructor(private tracker: ChatStateTracker) {\r\n this.tracker.client.on('Session', ev => this.handleSession(ev));\r\n this.tracker.client.on('RoomJoined', ev => this.handleRoomJoin(ev));\r\n this.tracker.client.on('NewTopic', ev => this.handleNewTopic(ev));\r\n this.tracker.client.on('FollowedTopicUpdated', ev => this.handleFollowedTopicUpdated(ev));\r\n this.tracker.client.on('TopicFollowed', ev => this.handleTopicFollowed(ev));\r\n this.tracker.client.on('TopicUnfollowed', ev => this.handleTopicUnfollowed(ev));\r\n this.tracker.client.on('NewMessage', ev => this.handleNewMessage(ev));\r\n this.tracker.client.on('RoomDeleted', ev => this.handleRoomDeleted(ev));\r\n this.tracker.client.on('RoomLeft', ev => this.handleRoomLeft(ev));\r\n this.tracker.client.on('TopicDeleted', ev => this.handleTopicDeleted(ev));\r\n }\r\n\r\n /**\r\n * Get history manager for given room ID.\r\n */\r\n public async getRoomHistory(roomId: string): Promise<RoomMessagesHistory | undefined> {\r\n await this.deferredSession.promise;\r\n return this.roomHistories.get(roomId);\r\n }\r\n\r\n /**\r\n * Cache followed topics for all joined rooms in a space and fetch them in bulk if necessary.\r\n * Then you can get them using getRoomFollowedTopics().\r\n * @see getRoomFollowedTopics\r\n */\r\n public async cacheSpaceFollowedTopics(spaceId: string | null): Promise<void> {\r\n if (spaceId && ! (await this.tracker.spaces.get()).has(spaceId)) {\r\n throw new Error(`You are not in space ${spaceId}`);\r\n }\r\n\r\n const roomIds = (await this.tracker.rooms.get()).findBy('spaceId', spaceId).items.map(room => room.id);\r\n\r\n if (! roomIds.length) {\r\n // We don't need to ping server for followed topics for this space, if user has no joined rooms\r\n return;\r\n }\r\n\r\n const resultPromise = this.tracker.client.send('GetFollowedTopics', {location: {spaceId}});\r\n\r\n roomIds.forEach(roomId => this.followedTopicsPromises.register(resultPromise, roomId));\r\n\r\n const result = await resultPromise;\r\n\r\n if (result.error) {\r\n throw result.error;\r\n }\r\n\r\n this.setFollowedTopicsArray(roomIds, result.data.followedTopics);\r\n }\r\n\r\n /**\r\n * Get followed topics for the given room.\r\n * @return Undefined if you are not in the room, collection otherwise.\r\n */\r\n public async getRoomFollowedTopics(roomId: string): Promise<ObservableIndexedObjectCollection<FollowedTopic> | undefined> {\r\n if (! (await this.tracker.rooms.get()).has(roomId)) {\r\n return undefined;\r\n }\r\n\r\n if (! this.followedTopics.has(roomId)) {\r\n if (this.followedTopicsPromises.notExist(roomId)) {\r\n this.followedTopicsPromises.registerByFunction(async () => {\r\n const result = await this.tracker.client.send('GetFollowedTopics', {location: {roomId}});\r\n\r\n if (result.error) {\r\n throw result.error;\r\n }\r\n\r\n this.setFollowedTopicsArray([roomId], result.data.followedTopics);\r\n }, roomId);\r\n }\r\n\r\n await this.followedTopicsPromises.get(roomId);\r\n }\r\n\r\n return this.followedTopics.get(roomId);\r\n }\r\n\r\n /**\r\n * Batch acknowledge all missed messages from any topics in given room.\r\n */\r\n public async ackRoomFollowedTopics(roomId: string): Promise<void> {\r\n const collection = await this.getRoomFollowedTopics(roomId);\r\n\r\n if (! collection) {\r\n return;\r\n }\r\n\r\n for (const followedTopic of collection.items) {\r\n if (followedTopic.missed) {\r\n await this.tracker.client.send('Ack', {location: followedTopic.location});\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Calculate missed messages from any topic in given room.\r\n * @return Undefined if you are not in room.\r\n */\r\n public async calculateRoomMissedMessages(roomId: string): Promise<number | undefined> {\r\n const collection = await this.getRoomFollowedTopics(roomId);\r\n\r\n if (collection) {\r\n return collection.items.reduce(\r\n (previousValue, currentValue) => previousValue + (currentValue.missed ?? 0),\r\n 0,\r\n );\r\n }\r\n\r\n return undefined;\r\n }\r\n\r\n /**\r\n * For internal use. If you want to delete the message, execute a proper command on client object.\r\n * @internal\r\n */\r\n public _deleteByTopicIds(roomId: string, ...topicIds: string[]): void {\r\n this.followedTopics.get(roomId)?.delete(...topicIds);\r\n }\r\n\r\n private createHistoryForNewRoom(room: Room): void {\r\n this.roomHistories.set([room.id, new RoomMessagesHistory(room, this.tracker)]);\r\n }\r\n\r\n private handleNewMessage(ev: NewMessage): void {\r\n this.updateLocallyFollowedTopicOnNewMessage(ev);\r\n }\r\n\r\n private handleFollowedTopicUpdated(ev: FollowedTopicUpdated): void {\r\n this.followedTopics.get(ev.followedTopic.location.roomId)?.set(ev.followedTopic);\r\n }\r\n\r\n private handleTopicFollowed(ev: TopicFollowed): void {\r\n this.setFollowedTopicsArray([ev.followedTopic.location.roomId], [ev.followedTopic]);\r\n }\r\n\r\n private handleTopicUnfollowed(ev: TopicUnfollowed): void {\r\n this.followedTopics.get(ev.location.roomId)?.delete(ev.location.topicId);\r\n }\r\n\r\n private handleRoomDeleted(ev: RoomDeleted): void {\r\n this.roomHistories.delete(ev.id);\r\n this.clearRoomFollowedTopicsStructures(ev.id);\r\n }\r\n\r\n private handleRoomJoin(ev: RoomJoined): void {\r\n this.createHistoryForNewRoom(ev.room)\r\n this.clearRoomFollowedTopicsStructures(ev.room.id);\r\n }\r\n\r\n private handleRoomLeft(ev: RoomLeft): void {\r\n this.roomHistories.delete(ev.id);\r\n this.clearRoomFollowedTopicsStructures(ev.id);\r\n }\r\n\r\n private async handleNewTopic(ev: NewTopic): Promise<void> {\r\n if (this.followedTopics.has(ev.roomId)) {\r\n // Check if the new topic is followed by user\r\n // only if client asked for followed topics list before for this room\r\n const result = await this.tracker.client.send(\r\n 'GetFollowedTopics',\r\n {location: {roomId: ev.roomId, topicId: ev.topic.id}},\r\n );\r\n const followedTopic = result.data.followedTopics[0];\r\n if (followedTopic) {\r\n this.followedTopics.get(ev.roomId).set(followedTopic);\r\n }\r\n }\r\n }\r\n\r\n private handleTopicDeleted(ev: TopicDeleted): void {\r\n this.followedTopics.get(ev.location.roomId)?.delete(ev.location.topicId);\r\n }\r\n\r\n private handleSession(ev: Session): void {\r\n this.followedTopics.deleteAll();\r\n this.followedTopicsPromises.forgetAll();\r\n this.roomHistories.deleteAll();\r\n ev.state.rooms.forEach(room => this.createHistoryForNewRoom(room));\r\n this.deferredSession.resolve();\r\n }\r\n\r\n private updateLocallyFollowedTopicOnNewMessage(ev: NewMessage): void {\r\n const roomFollowedTopics = this.followedTopics.get(ev.message.location.roomId);\r\n const followedTopic = roomFollowedTopics?.get(ev.message.location.topicId);\r\n const ephemeralMessageTypes = ['System'] as MessageType[];\r\n\r\n if (!roomFollowedTopics || !followedTopic || ephemeralMessageTypes.includes(ev.message.type)) {\r\n // Skip if we don't follow this room or targeted topic or message is ephemeral\r\n return;\r\n }\r\n\r\n const isMe = ev.message.author.user.id === this.tracker.me?.id;\r\n\r\n let update: Partial<FollowedTopic>;\r\n\r\n if (isMe) {\r\n // Reset missed messages count if new message is authored by me\r\n update = {missed: 0, lastAckMessageId: ev.message.id};\r\n } else {\r\n // ...add 1 otherwise\r\n update = {missed: followedTopic.missed === null ? null : followedTopic.missed + 1};\r\n }\r\n\r\n roomFollowedTopics.set({...followedTopic, ...update});\r\n }\r\n\r\n private setFollowedTopicsArray(roomIds: string[], followedTopics: FollowedTopic[]): void {\r\n const roomToTopics: {[roomId: string]: FollowedTopic[]} = {};\r\n\r\n // Reassign followed topics to limit collection change event emit\r\n followedTopics.forEach(followedTopic => {\r\n roomToTopics[followedTopic.location.roomId] ??= [];\r\n roomToTopics[followedTopic.location.roomId].push(followedTopic);\r\n });\r\n\r\n roomIds.forEach(roomId => {\r\n if (! this.followedTopics.has(roomId)) {\r\n this.followedTopics.set([roomId, new ObservableIndexedObjectCollection<FollowedTopic>(\r\n followedTopic => followedTopic.location.topicId\r\n )]);\r\n }\r\n\r\n if (roomToTopics[roomId]) {\r\n this.followedTopics.get(roomId).set(...roomToTopics[roomId]);\r\n }\r\n });\r\n }\r\n\r\n private clearRoomFollowedTopicsStructures(roomId: string): void {\r\n this.followedTopics.delete(roomId);\r\n this.followedTopicsPromises.forget(roomId);\r\n }\r\n}","import {IndexedCollection, ObservableIndexedObjectCollection} from \"../IndexedObjectCollection\";\r\nimport {\r\n NewMessage,\r\n NewTopic,\r\n Room, RoomDeleted,\r\n RoomJoined, RoomLeft,\r\n RoomMember, RoomMemberJoined, RoomMemberLeft, RoomMembers,\r\n RoomMemberUpdated, RoomUpdated, Session, SpaceDeleted, SpaceLeft, SpaceMemberLeft,\r\n SpaceMemberUpdated,\r\n Topic,\r\n TopicDeleted, TopicUpdated,\r\n UserUpdated,\r\n} from \"../types/src\";\r\nimport {ChatStateTracker} from \"./ChatStateTracker\";\r\nimport {DeferredTask, PromiseRegistry} from \"./AsyncUtils\";\r\nimport {MessagesManager} from \"./MessagesManager\";\r\n\r\nexport class RoomsManager {\r\n public readonly messages: MessagesManager;\r\n\r\n private readonly list = new ObservableIndexedObjectCollection<Room>('id');\r\n private readonly topics = new IndexedCollection<string, ObservableIndexedObjectCollection<Topic>>();\r\n private readonly members = new IndexedCollection<string, ObservableIndexedObjectCollection<RoomMember>>();\r\n private readonly deferredSession = new DeferredTask();\r\n private readonly membersPromises = new PromiseRegistry();\r\n private readonly topicsPromises = new PromiseRegistry();\r\n\r\n public constructor(private tracker: ChatStateTracker) {\r\n this.messages = new MessagesManager(tracker);\r\n\r\n this.tracker.client.on('NewMessage', ev => this.handleNewMessage(ev));\r\n this.tracker.client.on('NewTopic', ev => this.handleNewTopic(ev));\r\n this.tracker.client.on('TopicDeleted', ev => this.handleTopicDeleted(ev));\r\n this.tracker.client.on('RoomJoined', ev => this.handleRoomJoined(ev));\r\n this.tracker.client.on('RoomLeft', ev => this.handleRoomLeft(ev));\r\n this.tracker.client.on('RoomUpdated', ev => this.handleRoomUpdated(ev));\r\n this.tracker.client.on('RoomDeleted', ev => this.handleRoomDeleted(ev));\r\n this.tracker.client.on('TopicUpdated', ev => this.handleTopicUpdated(ev));\r\n this.tracker.client.on('RoomMemberJoined', ev => this.handleRoomMemberJoined(ev));\r\n this.tracker.client.on('RoomMemberLeft', ev => this.handleRoomMemberLeft(ev));\r\n this.tracker.client.on('RoomMembers', ev => this.handleRoomMembers(ev));\r\n this.tracker.client.on('RoomMemberUpdated', ev => this.handleRoomMemberUpdated(ev));\r\n this.tracker.client.on('SpaceMemberLeft', ev => this.handleSpaceMemberLeft(ev));\r\n this.tracker.client.on('SpaceMemberUpdated', ev => this.handleSpaceMemberUpdated(ev));\r\n this.tracker.client.on('SpaceDeleted', ev => this.handleSpaceDeleted(ev));\r\n this.tracker.client.on('SpaceLeft', ev => this.handleSpaceDeleted(ev));\r\n this.tracker.client.on('UserUpdated', ev => this.handleUserUpdated(ev));\r\n this.tracker.client.on('Session', ev => this.handleSession(ev));\r\n }\r\n\r\n /**\r\n * Get collection of room members.\r\n */\r\n public async getMembers(roomId: string): Promise<ObservableIndexedObjectCollection<RoomMember> | undefined> {\r\n if (this.membersPromises.notExist(roomId)) {\r\n this.membersPromises.registerByFunction(async () => {\r\n const result = await this.tracker.client.send('GetRoomMembers', {id: roomId});\r\n if (result.error) {\r\n throw result.error;\r\n }\r\n this.handleRoomMembers(result.data);\r\n }, roomId);\r\n }\r\n\r\n await this.membersPromises.get(roomId);\r\n return this.members.get(roomId);\r\n }\r\n\r\n /**\r\n * Get a room member representing the current user.\r\n */\r\n public async getMe(roomId: string): Promise<RoomMember | undefined> {\r\n const userId = (await this.tracker.getMe()).id;\r\n\r\n if (! this.list.has(roomId)) {\r\n // User is not in passed room.\r\n return undefined;\r\n }\r\n\r\n const members = await this.getMembers(roomId);\r\n return members?.items.find(member => (member.user?.id ?? member.spaceMember.user.id) === userId);\r\n }\r\n\r\n /**\r\n * Get collection of all the rooms you are in.\r\n */\r\n public async get(): Promise<ObservableIndexedObjectCollection<Room>> {\r\n await this.deferredSession.promise;\r\n return this.list;\r\n }\r\n\r\n /**\r\n * Get a collection of locally cached Topic objects for given room.\r\n * You can pass topic ids as second argument, to try to fetch them from the server.\r\n */\r\n public async getTopics(roomId: string, tryToFetchTopicIds?: string[]): Promise<ObservableIndexedObjectCollection<Topic> | undefined> {\r\n await this.deferredSession.promise;\r\n\r\n if (tryToFetchTopicIds?.length) {\r\n // Topic can be fetched if it isn't already cached and fetch is not already in progress\r\n const canFetch = (topicId: string) => ! this.topics.get(roomId)?.has(topicId) && ! this.topicsPromises.has(roomId + topicId);\r\n const idsToFetch = tryToFetchTopicIds.filter(canFetch);\r\n\r\n if (idsToFetch.length) {\r\n const promise = this.tracker\r\n .client\r\n .send('GetTopics', {roomId, topicIds: idsToFetch})\r\n .then(result => this.topics.get(result.data.location.roomId)?.set(...result.data.topics));\r\n\r\n idsToFetch.forEach(topicId => this.topicsPromises.register(promise, roomId + topicId));\r\n }\r\n\r\n for (const topicId of tryToFetchTopicIds) {\r\n await this.topicsPromises.get(roomId + topicId);\r\n }\r\n }\r\n\r\n return this.topics.get(roomId);\r\n }\r\n\r\n private deleteRoom(...roomIds: string[]): void {\r\n this.list.delete(...roomIds);\r\n this.members.delete(...roomIds);\r\n this.membersPromises.forget(...roomIds);\r\n\r\n for (const roomId of roomIds) {\r\n const topicIds: string[] = this.topics.get(roomId)?.items.map(topic => topic.id) ?? [];\r\n this.messages._deleteByTopicIds(roomId, ...topicIds);\r\n }\r\n\r\n this.topics.delete(...roomIds);\r\n }\r\n\r\n private deleteRoomsBySpaceId(spaceId: string): void {\r\n this.deleteRoom(\r\n ...this.list.findBy('spaceId', spaceId).items.map(room => room.id)\r\n );\r\n }\r\n\r\n private handleSpaceMemberUpdated(ev: SpaceMemberUpdated): void {\r\n // Update members of rooms related to this space\r\n for (const room of this.list.findBy('spaceId', ev.spaceId).items) {\r\n const roomMembers = this.members.get(room.id);\r\n\r\n if (! roomMembers || ! roomMembers.has(ev.userId)) {\r\n // Skip update if member list for this room is not loaded\r\n // or user is not in room\r\n continue;\r\n }\r\n\r\n const roomMember = roomMembers.get(ev.userId);\r\n const user = roomMember.spaceMember.user;\r\n\r\n // Update space member but first fill user object (it's null in event object)\r\n roomMember.spaceMember = {...ev.member, user};\r\n roomMembers.set(roomMember);\r\n }\r\n }\r\n\r\n private handleSpaceMemberLeft(ev: SpaceMemberLeft): void {\r\n this.list\r\n .findBy('spaceId', ev.spaceId).items\r\n .forEach(room => this.members.get(room.id)?.delete(ev.userId));\r\n }\r\n\r\n private handleRoomMemberUpdated(ev: RoomMemberUpdated): void {\r\n if (! this.members.has(ev.roomId)) {\r\n // We do not track member list for this room.\r\n return;\r\n }\r\n\r\n const members = this.members.get(ev.roomId);\r\n const member = members.get(ev.userId);\r\n const newMember = ev.member;\r\n const user = member.spaceMember?.user ?? member.user;\r\n\r\n if (newMember.spaceMember) {\r\n newMember.spaceMember.user = user;\r\n } else {\r\n newMember.user = user;\r\n }\r\n\r\n members.set(newMember);\r\n }\r\n\r\n private handleSpaceDeleted(ev: SpaceDeleted | SpaceLeft): void {\r\n this.deleteRoomsBySpaceId(ev.id);\r\n }\r\n\r\n private handleTopicDeleted(ev: TopicDeleted): void {\r\n const collection = this.topics.get(ev.location.roomId);\r\n collection.delete(ev.location.topicId);\r\n\r\n const room = this.list.get(ev.location.roomId);\r\n if (room.defaultTopic?.id === ev.location.topicId) {\r\n this.list.set({...room, defaultTopic: null});\r\n }\r\n }\r\n\r\n private handleNewTopic(ev: NewTopic): void {\r\n this.addJoinedRoomTopics(ev.roomId, ev.topic);\r\n }\r\n\r\n private addJoinedRoomTopics(roomId: string, ...topics: Topic[]): void {\r\n if (this.topics.has(roomId)) {\r\n this.topics.get(roomId).set(...topics);\r\n } else {\r\n this.topics.set([roomId, new ObservableIndexedObjectCollection<Topic>('id', topics)]);\r\n }\r\n }\r\n\r\n private handleRoomJoined(ev: RoomJoined): void {\r\n this.addJoinedRooms(ev.room);\r\n }\r\n\r\n private handleRoomUpdated(ev: RoomUpdated): void {\r\n if (this.list.has(ev.room.id)) {\r\n this.list.set(ev.room);\r\n }\r\n }\r\n\r\n private handleRoomDeleted(ev: RoomDeleted): void {\r\n this.deleteRoom(ev.id);\r\n }\r\n\r\n private handleTopicUpdated(ev: TopicUpdated): void {\r\n const room = this.list.get(ev.location.roomId);\r\n\r\n if (this.topics.get(ev.location.roomId)?.has(ev.topic.id)) {\r\n this.topics.get(ev.location.roomId).set(ev.topic);\r\n }\r\n\r\n if (room.defaultTopic.id === ev.topic.id) {\r\n room.defaultTopic = ev.topic;\r\n this.list.set(room);\r\n }\r\n }\r\n\r\n private addJoinedRooms(...rooms: Room[]): void {\r\n for (const room of rooms) {\r\n if (room.defaultTopic) {\r\n this.addJoinedRoomTopics(room.id, room.defaultTopic);\r\n }\r\n\r\n if (room.type === 'Pm' && room.recipients) {\r\n // Treat PM recipients as normal room members.\r\n // We are registering fake promise in `memberPromises`\r\n // because GetMembers are not supported for PM rooms.\r\n this.handleRoomMembers({\r\n id: room.id,\r\n members: room.recipients.map(user => ({user, spaceMember: null, roles: null})),\r\n });\r\n this.membersPromises.register(Promise.resolve(), room.id);\r\n }\r\n }\r\n this.list.set(...rooms);\r\n }\r\n\r\n private handleRoomLeft(ev: RoomLeft): void {\r\n this.deleteRoom(ev.id);\r\n }\r\n\r\n private handleRoomMemberJoined(ev: RoomMemberJoined): void {\r\n if (this.members.has(ev.roomId)) {\r\n this.members.get(ev.roomId).set(ev.member);\r\n }\r\n }\r\n\r\n private handleRoomMemberLeft(ev: RoomMemberLeft): void {\r\n if (this.members.has(ev.roomId)) {\r\n this.members.get(ev.roomId).delete(ev.userId);\r\n }\r\n }\r\n\r\n private handleRoomMembers(ev: RoomMembers): void {\r\n if (! this.members.has(ev.id)) {\r\n this.members.set([\r\n ev.id,\r\n new ObservableIndexedObjectCollection(\r\n member => member.user?.id ?? member.spaceMember.user.id,\r\n ev.members,\r\n )\r\n ]);\r\n }\r\n }\r\n\r\n private handleSession(ev: Session): void {\r\n this.list.deleteAll();\r\n this.topics.deleteAll();\r\n this.topicsPromises.forgetAll();\r\n this.members.deleteAll();\r\n this.membersPromises.forgetAll();\r\n\r\n this.addJoinedRooms(...ev.state.rooms);\r\n\r\n this.deferredSession.resolve();\r\n }\r\n\r\n private handleUserUpdated(ev: UserUpdated): void {\r\n this.members.items.forEach((members) => {\r\n const member = members.get(ev.user.id);\r\n\r\n if (! member) {\r\n // Skip room; updated user is not here\r\n return;\r\n }\r\n\r\n const newMember: RoomMember = {...member};\r\n\r\n if (member.user) {\r\n newMember.user = ev.user;\r\n } else {\r\n newMember.spaceMember.user = ev.user;\r\n }\r\n\r\n members.set(newMember);\r\n });\r\n }\r\n\r\n private handleNewMessage(ev: NewMessage): void {\r\n const topics = this.topics.get(ev.message.location.roomId);\r\n const topic = topics?.get(ev.message.location.topicId);\r\n\r\n if (!topic) {\r\n return; // No topic found, nothing to update\r\n }\r\n\r\n const newTopic = {\r\n ...topic,\r\n messageCount: topic.messageCount + 1,\r\n lastMessage: ev.message,\r\n };\r\n\r\n topics.set(newTopic);\r\n const room = this.list.get(ev.message.location.roomId);\r\n\r\n if (room.defaultTopic?.id === ev.message.location.topicId) {\r\n this.list.set({ ...room, defaultTopic: newTopic });\r\n }\r\n }\r\n}","import {Role, RoomMember, SpaceMember, User} from \"../types/src\";\r\n\r\nexport function reorderRolesOnPriorityUpdate(allRoles: Role[], oldRole: Role, updatedRole: Role): Role[] {\r\n // If the priority has changed, adjust the rest of roles\r\n const increased = (updatedRole.priority - oldRole.priority) > 0;\r\n const decreased = ! increased;\r\n const changedRoles: Role[] = [];\r\n\r\n allRoles.forEach(role => {\r\n if (role.id === updatedRole.id) {\r\n // Skip the updated role\r\n return;\r\n }\r\n if (increased && oldRole.priority <= role.priority) {\r\n role.priority--;\r\n changedRoles.push(role);\r\n }\r\n if (decreased && updatedRole.priority <= role.priority) {\r\n role.priority++;\r\n changedRoles.push(role);\r\n }\r\n });\r\n\r\n return changedRoles;\r\n}\r\n\r\nexport function extractUserFromMember(member: RoomMember | SpaceMember): User | null {\r\n return member.user ?? (member as RoomMember).spaceMember?.user;\r\n}","import {ChatStateTracker} from \"./ChatStateTracker\";\r\nimport {IndexedCollection, ObservableIndexedObjectCollection} from \"../IndexedObjectCollection\";\r\nimport {\r\n NewRole,\r\n NewRoom,\r\n Role,\r\n RoleDeleted,\r\n RoleUpdated,\r\n RoomDeleted,\r\n RoomSummary,\r\n RoomUpdated,\r\n Session,\r\n Space,\r\n SpaceDeleted,\r\n SpaceJoined,\r\n SpaceLeft,\r\n SpaceMember,\r\n SpaceMemberJoined,\r\n SpaceMemberLeft,\r\n SpaceMembers,\r\n SpaceMemberUpdated,\r\n SpaceRooms,\r\n SpaceUpdated,\r\n UserUpdated\r\n} from \"../types/src\";\r\nimport {DeferredTask, PromiseRegistry} from \"./AsyncUtils\";\r\nimport {reorderRolesOnPriorityUpdate} from \"./functions\";\r\n\r\nexport class SpacesManager {\r\n private readonly list = new ObservableIndexedObjectCollection<Space>('id');\r\n private readonly roles = new IndexedCollection<string, ObservableIndexedObjectCollection<Role>>();\r\n private readonly rooms = new IndexedCollection<string, ObservableIndexedObjectCollection<RoomSummary>>();\r\n private readonly roomIdToSpaceId = new IndexedCollection<string, string>();\r\n private readonly members = new IndexedCollection<string, ObservableIndexedObjectCollection<SpaceMember>>();\r\n private readonly deferredSession = new DeferredTask();\r\n private readonly roomsPromises = new PromiseRegistry();\r\n private readonly membersPromises = new PromiseRegistry();\r\n\r\n public constructor(private tracker: ChatStateTracker) {\r\n this.tracker.client.on('NewRoom', ev => this.handleNewRoom(ev));\r\n this.tracker.client.on('RoomDeleted', ev => this.handleRoomDeleted(ev));\r\n this.tracker.client.on('RoomUpdated', ev => this.handleRoomUpdated(ev));\r\n this.tracker.client.on('SpaceDeleted', ev => this.handleSpaceDeleted(ev));\r\n this.tracker.client.on('SpaceUpdated', ev => this.handleSpaceUpdated(ev));\r\n this.tracker.client.on('SpaceJoined', ev => this.handleSpaceJoined(ev));\r\n this.tracker.client.on('SpaceLeft', ev => this.handleSpaceDeleted(ev));\r\n this.tracker.client.on('SpaceMemberJoined', ev => this.handleSpaceMemberJoined(ev));\r\n this.tracker.client.on('SpaceMemberLeft', ev => this.handleSpaceMemberLeft(ev));\r\n this.tracker.client.on('SpaceMembers', ev => this.handleSpaceMembers(ev));\r\n this.tracker.client.on('SpaceRooms', ev => this.handleSpaceRooms(ev));\r\n this.tracker.client.on('SpaceMemberUpdated', ev => this.handleSpaceMemberUpdated(ev));\r\n this.tracker.client.on('UserUpdated', ev => this.handleUserUpdated(ev));\r\n this.tracker.client.on('NewRole', ev => this.handleNewRole(ev));\r\n this.tracker.client.on('RoleDeleted', ev => this.handleRoleDeleted(ev));\r\n this.tracker.client.on('RoleUpdated', ev => this.handleRoleUpdated(ev));\r\n this.tracker.client.on('Session', ev => this.handleSession(ev));\r\n }\r\n\r\n /**\r\n * Get collection of all the spaces you are in.\r\n */\r\n public async get(): Promise<ObservableIndexedObjectCollection<Space>> {\r\n await this.deferredSession.promise;\r\n return this.list;\r\n }\r\n\r\n /**\r\n * Get collection of space roles.\r\n */\r\n public async getRoles(spaceId: string): Promise<ObservableIndexedObjectCollection<Role> | undefined> {\r\n await this.deferredSession.promise;\r\n return this.roles.get(spaceId);\r\n }\r\n\r\n /**\r\n * Get collection of the all available rooms inside given space.\r\n */\r\n public async getRooms(spaceId: string): Promise<ObservableIndexedObjectCollection<RoomSummary> | undefined> {\r\n if (this.roomsPromises.notExist(spaceId)) {\r\n this.roomsPromises.registerByFunction(async () => {\r\n const result = await this.tracker.client.send('GetSpaceRooms', {id: spaceId});\r\n if (result.error) {\r\n throw result.error;\r\n }\r\n this.handleSpaceRooms(result.data);\r\n }, spaceId);\r\n }\r\n\r\n await this.roomsPromises.get(spaceId);\r\n return this.rooms.get(spaceId);\r\n }\r\n\r\n /**\r\n * Get collection of space members.\r\n */\r\n public async getMembers(spaceId: string): Promise<ObservableIndexedObjectCollection<SpaceMember> | undefined> {\r\n if (this.membersPromises.notExist(spaceId)) {\r\n this.membersPromises.registerByFunction(async () => {\r\n const result = await this.tracker.client.send('GetSpaceMembers', {id: spaceId});\r\n if (result.error) {\r\n throw result.error;\r\n }\r\n this.handleSpaceMembers(result.data);\r\n }, spaceId);\r\n }\r\n\r\n await this.membersPromises.get(spaceId);\r\n return this.members.get(spaceId);\r\n }\r\n\r\n /**\r\n * Get a space member representing the current user.\r\n */\r\n public async getMe(spaceId: string): Promise<SpaceMember | undefined> {\r\n const userId = (await this.tracker.getMe()).id;\r\n\r\n if (! this.list.has(spaceId)) {\r\n // User is not in passed space.\r\n return undefined;\r\n }\r\n\r\n const members = await this.getMembers(spaceId);\r\n return members?.items.find(member => member.user.id === userId);\r\n }\r\n\r\n private handleNewRole(ev: NewRole): void {\r\n const collection = this.roles.get(ev.spaceId);\r\n collection.set(ev.role);\r\n this.list.get(ev.spaceId).roles = collection.items;\r\n }\r\n\r\n private handleNewRoom(ev: NewRoom): void {\r\n this.rooms.get(ev.spaceId)?.set(ev.summary);\r\n this.roomIdToSpaceId.set([ev.summary.id, ev.spaceId]);\r\n }\r\n\r\n private handleRoomUpdated(ev: RoomUpdated): void {\r\n if (ev.room.spaceId && this.rooms.has(ev.room.spaceId)) {\r\n const rooms = this.rooms.get(ev.room.spaceId);\r\n rooms.set({\r\n ...rooms.get(ev.room.id),\r\n name: ev.room.name,\r\n description: ev.room.description,\r\n } as RoomSummary);\r\n }\r\n }\r\n\r\n private async handleRoomDeleted(ev: RoomDeleted): Promise<void> {\r\n const spaceId = this.roomIdToSpaceId.get(ev.id);\r\n this.roomIdToSpaceId.delete(ev.id);\r\n\r\n if (! spaceId) {\r\n return;\r\n }\r\n\r\n const space = this.list.get(spaceId);\r\n let spaceChanged = false;\r\n\r\n this.rooms.get(spaceId)?.delete(ev.id);\r\n\r\n if (space.systemRoom === ev.id) {\r\n space.systemRoom = null;\r\n spaceChanged = true;\r\n }\r\n\r\n if (space.defaultRooms.includes(ev.id)) {\r\n space.defaultRooms = space.defaultRooms.filter(roomId => roomId !== ev.id);\r\n spaceChanged = true;\r\n }\r\n\r\n if (spaceChanged) {\r\n this.list.set(space);\r\n }\r\n }\r\n\r\n private handleRoleDeleted(ev: RoleDeleted): void {\r\n const collection = this.roles.get(ev.spaceId);\r\n collection.delete(ev.id);\r\n this.list.get(ev.spaceId).roles = collection.items;\r\n }\r\n\r\n private handleSpaceUpdated(ev: SpaceUpdated): void {\r\n this.list.set(ev.space);\r\n }\r\n\r\n private handleSpaceDeleted(ev: SpaceDeleted | SpaceLeft): void {\r\n const roomIds = this.rooms.get(ev.id)?.items.map(item => item.id) ?? [];\r\n this.roomIdToSpaceId.delete(...roomIds);\r\n\r\n this.roles.delete(ev.id);\r\n this.members.delete(ev.id);\r\n this.membersPromises.forget(ev.id);\r\n this.rooms.delete(ev.id);\r\n this.roomsPromises.forget(ev.id);\r\n this.list.delete(ev.id);\r\n }\r\n\r\n private handleSpaceJoined(ev: SpaceJoined): void {\r\n this.addJoinedSpaces(ev.space);\r\n }\r\n\r\n private addJoinedSpaces(...spaces: Space[]): void {\r\n this.roles.set(...(spaces.map(space => [\r\n space.id,\r\n new ObservableIndexedObjectCollection<Role>('id', space.roles)\r\n ]) as [string, ObservableIndexedObjectCollection<Role>][]));\r\n this.list.set(...spaces);\r\n }\r\n\r\n private handleSpaceMemberJoined(ev: SpaceMemberJoined): void {\r\n if (this.members.has(ev.spaceId)) {\r\n this.members.get(ev.spaceId).set(ev.member);\r\n }\r\n }\r\n\r\n private handleSpaceMemberLeft(ev: SpaceMemberLeft): void {\r\n if (this.members.has(ev.spaceId)) {\r\n this.members.get(ev.spaceId).delete(ev.userId);\r\n }\r\n }\r\n\r\n private handleSpaceMembers(ev: SpaceMembers): void {\r\n if (! this.members.has(ev.id)) {\r\n this.members.set([\r\n ev.id,\r\n new ObservableIndexedObjectCollection(member => member?.user.id, ev.members)\r\n ]);\r\n }\r\n }\r\n\r\n private handleSpaceRooms(ev: SpaceRooms): void {\r\n if (! this.rooms.has(ev.id)) {\r\n this.rooms.set([ev.id, new ObservableIndexedObjectCollection('id', ev.summaries)]);\r\n ev.summaries.forEach(summary => this.roomIdToSpaceId.set([summary.id, ev.id]));\r\n }\r\n }\r\n\r\n private handleSpaceMemberUpdated(ev: SpaceMemberUpdated): void {\r\n if (this.members.has(ev.spaceId)) {\r\n const members = this.members.get(ev.spaceId);\r\n const member = members.get(ev.userId);\r\n members.set({...ev.member, user: member.user});\r\n }\r\n }\r\n\r\n private handleRoleUpdated(ev: RoleUpdated): void {\r\n const roles = this.roles.get(ev.spaceId);\r\n const oldRole = roles.get(ev.role.id);\r\n const newRole = ev.role;\r\n const rolesToUpdate = [newRole];\r\n\r\n if (oldRole.priority !== newRole.priority) {\r\n rolesToUpdate.push(\r\n ...reorderRolesOnPriorityUpdate(roles.items, oldRole, newRole)\r\n );\r\n }\r\n\r\n this.roles.get(ev.spaceId).set(...rolesToUpdate);\r\n }\r\n\r\n private handleSession(ev: Session): void {\r\n this.list.deleteAll();\r\n this.roles.deleteAll();\r\n this.rooms.deleteAll();\r\n this.roomsPromises.forgetAll();\r\n this.members.deleteAll();\r\n this.membersPromises.forgetAll();\r\n this.roomIdToSpaceId.deleteAll();\r\n\r\n this.addJoinedSpaces(...ev.state.spaces);\r\n\r\n this.deferredSession.resolve();\r\n }\r\n\r\n private handleUserUpdated(ev: UserUpdated): void {\r\n this.members.items.forEach((members) => {\r\n const member = members.get(ev.user.id);\r\n\r\n if (! member) {\r\n // Skip space; updated user is not here\r\n return;\r\n }\r\n\r\n members.set({...member, user: ev.user});\r\n });\r\n }\r\n}","export enum Layer {\r\n Global,\r\n Space,\r\n Room,\r\n Topic,\r\n}\r\n\r\nexport class PermissionDefinition {\r\n value: number;\r\n maxLayer: Layer;\r\n}\r\n\r\nexport class Permissions {\r\n public static readonly list = {\r\n Root: {value: 1 << 0, maxLayer: Layer.Room},\r\n CreateSpaces: {value: 1 << 1, maxLayer: Layer.Global},\r\n ManageSpace: {value: 1 << 2, maxLayer: Layer.Space},\r\n ManageSpaceRoles: {value: 1 << 3, maxLayer: Layer.Space},\r\n ManageRoom: {value: 1 << 4, maxLayer: Layer.Room},\r\n CreateTopics: {value: 1 << 5, maxLayer: Layer.Room},\r\n ManageTopic: {value: 1 << 6, maxLayer: Layer.Topic},\r\n ManageSpaceMembers: {value: 1 << 7, maxLayer: Layer.Space},\r\n ManageRoomMembers: {value: 1 << 8, maxLayer: Layer.Room},\r\n CreateMessages: {value: 1 << 9, maxLayer: Layer.Topic},\r\n ManagePermissions: {value: 1 << 10, maxLayer: Layer.Topic},\r\n CreateSpaceRooms: {value: 1 << 11, maxLayer: Layer.Space},\r\n ManageSpaceRooms: {value: 1 << 12, maxLayer: Layer.Space},\r\n CreateEmoticons: {value: 1 << 13, maxLayer: Layer.Space},\r\n ManageEmoticon: {value: 1 << 14, maxLayer: Layer.Space},\r\n ManageBan: {value: 1 << 15, maxLayer: Layer.Room},\r\n Kick: {value: 1 << 16, maxLayer: Layer.Room},\r\n ChangeOwnNick: {value: 1 << 17, maxLayer: Layer.Space},\r\n };\r\n\r\n public static getNames(): (keyof typeof this.list)[] {\r\n return Object.keys(this.list) as any;\r\n }\r\n\r\n public static getByName(name: keyof typeof this.list): PermissionDefinition | undefined {\r\n return this.list[name];\r\n }\r\n\r\n public static canBeDefinedOnLayer(permissionName: keyof typeof this.list, layer: Layer): boolean {\r\n const def = this.getByName(permissionName);\r\n\r\n if (! def) {\r\n throw new Error(`Invalid permission name: ${permissionName}`);\r\n }\r\n\r\n return layer <= this.getByName(permissionName).maxLayer;\r\n }\r\n}","import {ChatStateTracker} from \"./ChatStateTracker\";\r\nimport {\r\n ChatLocation,\r\n PermissionOverwrites, PermissionOverwritesTarget,\r\n PermissionOverwritesUpdated,\r\n PermissionOverwritesValue,\r\n RoleDeleted,\r\n RoomDeleted,\r\n RoomLeft, RoomMember, RoomMemberUpdated, Session,\r\n SpaceDeleted,\r\n SpaceLeft, SpaceMember,\r\n SpaceMemberUpdated,\r\n TopicDeleted,\r\n} from \"../types/src\";\r\nimport {EventHandler, EventTarget} from \"../EventTarget\";\r\nimport {IndexedCollection} from \"../IndexedObjectCollection\";\r\nimport {Permissions} from \"../Permissions\";\r\nimport {PromiseRegistry} from \"./AsyncUtils\";\r\n\r\nconst getOvId = (\r\n location: ChatLocation,\r\n target?: PermissionOverwritesTarget,\r\n) => [location.spaceId, location.roomId, location.topicId, target?.type, target?.userId, target?.roleId].filter(Boolean).join('/');\r\n\r\nconst getOvIdByObject\r\n = (overwrites: PermissionOverwrites | PermissionOverwritesUpdated): string => getOvId(overwrites.location, overwrites.target);\r\n\r\ninterface CheckPermissionsResult {\r\n /**\r\n * @deprecated Use `hasAll` instead.\r\n */\r\n ok: boolean;\r\n hasAll: boolean;\r\n hasAny: boolean;\r\n missing: string[];\r\n}\r\n\r\nexport class PermissionsManager extends EventTarget {\r\n private readonly overwrites = new IndexedCollection<string, PermissionOverwrites>();\r\n private readonly overwritesPromises = new PromiseRegistry();\r\n\r\n public constructor(private tracker: ChatStateTracker) {\r\n super();\r\n this.tracker.client.on('PermissionOverwrites', ev => this.handlePermissionOverwrites(ev));\r\n this.tracker.client.on('PermissionOverwritesUpdated', ev => this.handlePermissionOverwrites(ev));\r\n this.tracker.client.on('SpaceDeleted', ev => this.handleSpaceDeleted(ev));\r\n this.tracker.client.on('SpaceLeft', ev => this.handleSpaceDeleted(ev));\r\n this.tracker.client.on('RoomDeleted', ev => this.handleRoomDeleted(ev));\r\n this.tracker.client.on('RoomLeft', ev => this.handleRoomDeleted(ev));\r\n this.tracker.client.on('TopicDeleted', ev => this.handleTopicDeleted(ev));\r\n this.tracker.client.on('RoleDeleted', ev => this.handleRoleDeleted(ev));\r\n this.tracker.client.on('SpaceMemberUpdated', ev => this.handleSpaceMemberUpdated(ev));\r\n this.tracker.client.on('RoomMemberUpdated', ev => this.handleRoomMemberUpdated(ev));\r\n this.tracker.client.on('Session', ev => this.handleSession(ev));\r\n }\r\n\r\n public async getOverwrites(\r\n location: ChatLocation,\r\n target: PermissionOverwritesTarget,\r\n ): Promise<PermissionOverwrites | undefined> {\r\n this.validateLocation(location);\r\n\r\n const id = getOvId(location, target);\r\n\r\n if (this.overwritesPromises.notExist(id)) {\r\n this.overwritesPromises.registerByFunction(async () => {\r\n const result = await this.tracker.client.send(\r\n 'GetPermissionOverwrites',\r\n {location, target},\r\n );\r\n if (result.error) {\r\n throw result.error;\r\n }\r\n this.handlePermissionOverwrites(result.data);\r\n }, id);\r\n }\r\n\r\n await this.overwritesPromises.get(id);\r\n return this.overwrites.get(id);\r\n }\r\n\r\n public on(eventName: 'change', handler: EventHandler<any>): this {\r\n return super.on(eventName, handler);\r\n }\r\n\r\n public async check(\r\n permissionNames: (keyof typeof Permissions.list)[],\r\n location: ChatLocation,\r\n ): Promise<CheckPermissionsResult> {\r\n if (! permissionNames.length) {\r\n throw new Error('Permission names array cannot be empty');\r\n }\r\n\r\n const ownedPermissions = await this.calculatePermissions(location);\r\n const missing: string[] = [];\r\n\r\n permissionNames.forEach(name => {\r\n if (~ ownedPermissions & Permissions.getByName(name).value) {\r\n missing.push(name as string);\r\n }\r\n });\r\n\r\n return {\r\n ok: missing.length === 0,\r\n hasAll: missing.length === 0,\r\n hasAny: missing.length < permissionNames.length,\r\n missing,\r\n };\r\n }\r\n\r\n public async calculatePermissions(location: ChatLocation): Promise<number> {\r\n this.validateLocation(location);\r\n\r\n const userId = (await this.tracker.getMe()).id;\r\n const [spaceMember, roomMember] = await this.fetchMembersOrFail(location);\r\n const userRoles: string[] = [...(spaceMember?.roles ?? []), ...(roomMember?.roles ?? [])];\r\n const promises: Promise<PermissionOverwritesValue>[] = [\r\n // Global user overwrites\r\n this.getOverwrites({}, { type: 'User', userId }).then(v => v.overwrites),\r\n ];\r\n\r\n if (location.spaceId && (await this.tracker.spaces.get())?.has(location.spaceId)) {\r\n const filterLocation: ChatLocation = {spaceId: location.spaceId};\r\n promises.push(this.collectRoleOverwrites(filterLocation, userRoles));\r\n promises.push(this.getOverwrites(filterLocation, { type: 'User', userId }).then(v => v.overwrites));\r\n }\r\n\r\n if (location.roomId && (await this.tracker.rooms.get())?.has(location.roomId)) {\r\n const filterLocation: ChatLocation = {spaceId: location.spaceId, roomId: location.roomId};\r\n if (userRoles.length) {\r\n promises.push(this.collectRoleOverwrites(filterLocation, userRoles));\r\n }\r\n promises.push(this.getOverwrites(filterLocation, { type: 'User', userId }).then(v => v.overwrites));\r\n }\r\n\r\n if (location.topicId && (await this.tracker.rooms.getTopics(location.roomId))?.has(location.topicId)) {\r\n if (userRoles.length) {\r\n promises.push(this.collectRoleOverwrites(location, userRoles));\r\n }\r\n promises.push(this.getOverwrites(location, { type: 'User', userId }).then(v => v.overwrites));\r\n }\r\n\r\n return this.resolveOverwritesHierarchy(await Promise.all(promises));\r\n }\r\n\r\n private handlePermissionOverwrites(ev: PermissionOverwritesUpdated | PermissionOverwrites): void {\r\n this.overwrites.set([getOvIdByObject(ev), ev]);\r\n this.emit('change');\r\n }\r\n\r\n private handleSpaceDeleted(ev: SpaceDeleted | SpaceLeft): void {\r\n const ids = this.deleteOverwritesByIdPrefix(getOvId({spaceId: ev.id}));\r\n this.overwritesPromises.forget(...ids);\r\n }\r\n\r\n private async handleRoomDeleted(ev: RoomDeleted | RoomLeft): Promise<void> {\r\n const room = (await this.tracker.rooms.get()).get(ev.id);\r\n if (room) {\r\n const ids = this.deleteOverwritesByIdPrefix(getOvId({spaceId: room.spaceId, roomId: room.id}));\r\n this.overwritesPromises.forget(...ids);\r\n }\r\n }\r\n\r\n private handleTopicDeleted(ev: TopicDeleted): void {\r\n const ids = this.deleteOverwritesByIdPrefix(getOvId(ev.location));\r\n this.overwritesPromises.forget(...ids);\r\n }\r\n\r\n private handleRoleDeleted(ev: RoleDeleted): void {\r\n const ids = this.deleteOverwritesByIdPrefix(getOvId({spaceId: ev.spaceId}, { type: 'Role', roleId: ev.id }));\r\n this.overwritesPromises.forget(...ids);\r\n }\r\n\r\n private handleSpaceMemberUpdated(ev: SpaceMemberUpdated): void {\r\n if (ev.userId === this.tracker.me?.id) {\r\n // User roles in space could potentially have changed\r\n this.emit('change');\r\n }\r\n }\r\n\r\n private handleRoomMemberUpdated(ev: RoomMemberUpdated): void {\r\n if (ev.userId === this.tracker.me?.id) {\r\n // User roles in room could potentially have changed\r\n this.emit('change');\r\n }\r\n }\r\n\r\n /**\r\n * @return Matched and deleted ids\r\n */\r\n private deleteOverwritesByIdPrefix(prefix: string): string[] {\r\n const ids: string[] = [];\r\n this.overwrites.items.forEach((overwrites) => {\r\n const id = getOvIdByObject(overwrites);\r\n if (id.startsWith(prefix)) {\r\n ids.push(id);\r\n this.overwrites.delete(id);\r\n }\r\n });\r\n return ids;\r\n }\r\n\r\n private async collectRoleOverwrites(\r\n location: ChatLocation,\r\n userRoles: string[],\r\n ): Promise<PermissionOverwritesValue> {\r\n const roleOverwrites = await Promise.all(userRoles.map(\r\n roleId => this.getOverwrites(location, { type: 'Role', roleId }),\r\n ));\r\n\r\n return this.resolveOverwritesFromRolesByOrder(location.spaceId, roleOverwrites);\r\n }\r\n\r\n private async resolveOverwritesFromRolesByOrder(\r\n spaceId: string,\r\n overwrites: PermissionOverwrites[],\r\n ): Promise<PermissionOverwritesValue> {\r\n let allows = 0, denies = 0;\r\n const roles = await this.tracker.spaces.getRoles(spaceId);\r\n const sortedOverwrites = overwrites.sort(\r\n (a, b) =>\r\n roles.get(a.target.roleId).priority - roles.get(b.target.roleId).priority\r\n );\r\n\r\n // Max length of bit word\r\n const permissionsLength = overwrites.reduce(\r\n (previousValue: number, currentValue: PermissionOverwrites) =>\r\n Math.max(\r\n previousValue,\r\n currentValue.overwrites.allow?.toString(2).length ?? 0,\r\n currentValue.overwrites.deny?.toString(2).length ?? 0,\r\n ),\r\n 0,\r\n );\r\n\r\n sortedOverwrites.forEach(overwriteEvent => {\r\n const overwrites = overwriteEvent.overwrites;\r\n const revDecDenies = overwrites.deny?.toString(2).split('').reverse().join('') ?? '';\r\n const revDecAllows = overwrites.allow?.toString(2).split('').reverse().join('') ?? '';\r\n\r\n for (let i = 0; i < permissionsLength; i++) {\r\n const deny = parseInt(revDecDenies[i] ?? '0');\r\n const allow = parseInt(revDecAllows[i] ?? '0');\r\n\r\n if (deny) {\r\n denies |= 1 << i;\r\n }\r\n\r\n if (allow) {\r\n allows |= 1 << i;\r\n }\r\n }\r\n });\r\n\r\n return {allow: allows, deny: denies};\r\n }\r\n\r\n private resolveOverwritesHierarchy(permissionOverwritesValues: PermissionOverwritesValue[]): number {\r\n let result = 0;\r\n\r\n for (const value of permissionOverwritesValues) {\r\n if (value.allow & Permissions.getByName('Root').value) {\r\n return this.getRootAccessValue();\r\n }\r\n\r\n result = (result & ~value.deny) | value.allow;\r\n }\r\n\r\n return result;\r\n }\r\n\r\n private getRootAccessValue(): number {\r\n let result = 0;\r\n\r\n for (const name of Permissions.getNames()) {\r\n result |= Permissions.getByName(name).value;\r\n }\r\n\r\n return result;\r\n }\r\n\r\n private async fetchMembersOrFail(location: ChatLocation): Promise<[SpaceMember | null, RoomMember | null]> {\r\n const results = await Promise.all([\r\n location.spaceId ? this.tracker.spaces.getMe(location.spaceId) : null,\r\n location.roomId ? this.tracker.rooms.getMe(location.roomId) : null,\r\n ]);\r\n\r\n const spaceFail = location.spaceId && ! results[0];\r\n const roomFail = location.roomId && ! results[1];\r\n\r\n if (spaceFail || roomFail) {\r\n const layer = spaceFail ? `space (${location.spaceId})` : `room (${location.roomId})`;\r\n throw new Error(`Attempting to calculate permissions for a ${layer} that the user does not belong to`);\r\n }\r\n\r\n return results;\r\n }\r\n\r\n private validateLocation(location: ChatLocation): void {\r\n if (location.topicId && ! location.roomId) {\r\n throw new Error('Corrupted arguments hierarchy');\r\n }\r\n }\r\n\r\n private handleSession(ev: Session): void {\r\n this.overwrites.deleteAll();\r\n this.overwritesPromises.forgetAll();\r\n }\r\n}","import {ChatStateTracker} from \"./ChatStateTracker\";\r\nimport {\r\n IndexedCollection,\r\n ObservableIndexedObjectCollection\r\n} from \"../IndexedObjectCollection\";\r\nimport {Emoticon, EmoticonDeleted, Emoticons, NewEmoticon, SpaceDeleted} from \"../types/src\";\r\nimport {PromiseRegistry} from \"./AsyncUtils\";\r\n\r\nconst GLOBAL_KEY = 'global';\r\n\r\nexport class EmoticonsManager {\r\n private list: IndexedCollection<string, ObservableIndexedObjectCollection<Emoticon>> = new IndexedCollection();\r\n private emoticonsPromises = new PromiseRegistry();\r\n \r\n public constructor(private tracker: ChatStateTracker) {\r\n this.tracker.client.on('Emoticons', ev => this.handleEmoticons(ev));\r\n this.tracker.client.on('NewEmoticon', ev => this.handleNewEmoticon(ev));\r\n this.tracker.client.on('EmoticonDeleted', ev => this.handleEmoticonDeleted(ev));\r\n this.tracker.client.on('SpaceDeleted', ev => this.handleSpaceDeleted(ev));\r\n this.tracker.client.on('Session', () => this.handleSession());\r\n }\r\n\r\n public async get(spaceId?: string): Promise<ObservableIndexedObjectCollection<Emoticon>> {\r\n const key = spaceId ?? GLOBAL_KEY;\r\n\r\n if (this.emoticonsPromises.notExist(key)) {\r\n this.emoticonsPromises.registerByFunction(async () => {\r\n const result = await this.tracker.client.send('GetEmoticons', {spaceId});\r\n if (result.error) {\r\n throw result.error;\r\n }\r\n this.handleEmoticons(result.data);\r\n }, key);\r\n }\r\n\r\n await this.emoticonsPromises.get(key);\r\n return this.list.get(key);\r\n }\r\n\r\n private handleEmoticons(event: Emoticons): void {\r\n const spaceId = event.location.spaceId ?? GLOBAL_KEY;\r\n\r\n if (!this.list.has(spaceId)) {\r\n this.list.set([spaceId, new ObservableIndexedObjectCollection<Emoticon>('id')]);\r\n }\r\n\r\n const collection = this.list.get(spaceId);\r\n collection.set(...event.emoticons);\r\n }\r\n\r\n private handleNewEmoticon(ev: NewEmoticon): void {\r\n const collection = this.list.get(ev.emoticon.spaceId ?? GLOBAL_KEY);\r\n collection?.set(ev.emoticon);\r\n }\r\n\r\n private handleEmoticonDeleted(ev: EmoticonDeleted): void {\r\n const collection = this.list.get(ev.spaceId ?? GLOBAL_KEY);\r\n collection?.delete(ev.emoticonId);\r\n }\r\n\r\n private handleSpaceDeleted(event: SpaceDeleted): void {\r\n this.list.delete(event.id);\r\n }\r\n\r\n private handleSession(): void {\r\n this.list.deleteAll();\r\n this.emoticonsPromises.forgetAll();\r\n }\r\n}","import {ChatStateTracker} from \"./ChatStateTracker\";\nimport {ObservableIndexedObjectCollection} from \"../IndexedObjectCollection\";\nimport {RoomMember, Session, SpaceMember, User} from \"../types/src\";\nimport {extractUserFromMember} from \"./functions\";\nimport {EventTarget} from \"../EventTarget\";\n\nexport class UsersManager {\n public readonly onlineStatus = new EventTarget();\n\n private readonly users: ObservableIndexedObjectCollection<User> = new ObservableIndexedObjectCollection('id');\n\n public constructor(private tracker: ChatStateTracker) {\n // RoomMemberUpdated & SpaceMemberUpdated events are not contains user object\n tracker.client.on('UserUpdated', event => this.handleUsers([event.user]));\n tracker.client.on('RoomMemberJoined', event => this.handleMembers([event.member]));\n tracker.client.on('SpaceMemberJoined', event => this.handleMembers([event.member]));\n tracker.client.on('SpaceMembers', event => this.handleMembers(event.members));\n tracker.client.on('RoomMembers', event => this.handleMembers(event.members));\n tracker.client.on('Messages', event => this.handleUsers(event.messages.map(message => message.author.user)));\n tracker.client.on('NewMessage', event => this.handleUsers([event.message.author.user]));\n tracker.client.on('Session', event => this.handleSession(event));\n }\n\n /**\n * Get all available (cached) user objects at once.\n */\n public async getAvailable(): Promise<ObservableIndexedObjectCollection<User>> {\n return this.users;\n }\n\n private handleMembers(members: (RoomMember | SpaceMember)[]): void {\n this.handleUsers(members.map(extractUserFromMember));\n }\n\n private handleSession(session: Session): void {\n this.users.deleteAll();\n this.handleUsers([session.user]);\n }\n\n private handleUsers(users: User[]): void {\n users.forEach(newUser => {\n const oldUser = this.users.get(newUser.id);\n if (oldUser && oldUser.online !== newUser.online) {\n this.onlineStatus.emit('change', newUser);\n }\n });\n\n this.users.set(...users);\n }\n}","import {ObservableIndexedObjectCollection} from \"../IndexedObjectCollection\";\nimport {\n NewRelationship,\n RelationshipDeleted,\n Relationships,\n UserRelationship,\n UserRelationshipType\n} from \"../types/src\";\nimport {PromiseRegistry} from \"./AsyncUtils\";\nimport {ChatStateTracker} from \"./ChatStateTracker\";\n\nconst getId = (refUserId: string, type: UserRelationshipType): string => `${refUserId}-${type}`;\nconst getIdFromRelationship = (relationship: UserRelationship): string => getId(relationship.refUserId, relationship.type);\n\nexport class RelationshipsManager {\n private relationships: ObservableIndexedObjectCollection<UserRelationship> = new ObservableIndexedObjectCollection<UserRelationship>(getIdFromRelationship);\n private promises = new PromiseRegistry();\n\n public constructor(private tracker: ChatStateTracker) {\n this.tracker.client.on('Relationships', ev => this.handleRelationships(ev));\n this.tracker.client.on('NewRelationship', ev => this.handleNewRelationship(ev));\n this.tracker.client.on('RelationshipDeleted', ev => this.handleRelationshipDeleted(ev));\n this.tracker.client.on('Session', () => this.handleSession());\n }\n\n public async get(): Promise<ObservableIndexedObjectCollection<UserRelationship>> {\n if (this.promises.notExist('all')) {\n this.promises.registerByFunction(async () => {\n const result = await this.tracker.client.send('GetRelationships', {});\n if (result.error) {\n throw result.error;\n }\n }, 'all');\n }\n\n await this.promises.get('all');\n return this.relationships;\n }\n\n public async exists(refUserId: string, type: UserRelationshipType): Promise<boolean> {\n await this.get();\n return this.relationships.has(getId(refUserId, type));\n }\n\n private handleRelationships(ev: Relationships): void {\n this.relationships.deleteAll();\n ev.relationships.forEach(relationship => {\n this.relationships.set(relationship);\n });\n }\n\n private handleNewRelationship(ev: NewRelationship): void {\n if (this.promises.has('all')) {\n this.relationships.set(ev.relationship);\n }\n }\n\n private handleRelationshipDeleted(ev: RelationshipDeleted): void {\n if (this.promises.has('all')) {\n this.relationships.delete(getIdFromRelationship(ev.relationship));\n }\n }\n\n private handleSession(): void {\n this.promises.forgetAll();\n this.relationships.deleteAll();\n }\n}","import {WebSocketChatClient} from \"../WebSocketChatClient\";\r\nimport {Session, User} from \"../types/src\";\r\nimport {RoomsManager} from \"./RoomsManager\";\r\nimport {SpacesManager} from \"./SpacesManager\";\r\nimport {PermissionsManager} from \"./PermissionsManager\";\r\nimport {DeferredTask} from \"./AsyncUtils\";\r\nimport {EmoticonsManager} from \"./EmoticonsManager\";\r\nimport {UsersManager} from \"./UsersManager\";\r\nimport {RelationshipsManager} from \"./RelationshipsManager\";\r\n\r\nexport class ChatStateTracker {\r\n /**\r\n * State of your permissions.\r\n */\r\n public readonly permissions = new PermissionsManager(this);\r\n\r\n /**\r\n * State of the rooms you are in.\r\n */\r\n public readonly rooms: RoomsManager = new RoomsManager(this);\r\n\r\n /**\r\n * State of the spaces you are in.\r\n */\r\n public readonly spaces = new SpacesManager(this);\r\n\r\n /**\r\n * State of the emoticons (global and space-related).\r\n */\r\n public readonly emoticons = new EmoticonsManager(this);\r\n\r\n /**\r\n * Users related state.\r\n */\r\n public readonly users = new UsersManager(this);\r\n\r\n /**\r\n * State of relationships with other users.\r\n */\r\n public readonly relationships = new RelationshipsManager(this);\r\n\r\n private _me: User = null;\r\n private readonly deferredSession = new DeferredTask();\r\n\r\n public constructor(public readonly client: WebSocketChatClient) {\r\n this.client.on('Session', ev => this.handleSession(ev));\r\n }\r\n\r\n public get me(): User | null {\r\n return this._me;\r\n }\r\n\r\n public async getMe(): Promise<User> {\r\n await this.deferredSession.promise;\r\n return this._me;\r\n }\r\n\r\n private handleSession(ev: Session): void {\r\n this._me = ev.user;\r\n this.deferredSession.resolve();\r\n }\r\n}","import {ObservableInterface} from \"./EventTarget\";\r\nimport {AbstractChatClient, CommandResult, CommandsMap} from \"./AbstractChatClient\";\r\nimport {ChatStateTracker} from \"./state-tracker/ChatStateTracker\";\r\nimport {Envelope} from \"./types/src\";\r\n\r\nexport interface WebSocketClientOptions {\r\n url: string;\r\n token: string;\r\n connectingTimeoutMs?: number;\r\n awaitQueueSendDelayMs?: number;\r\n stateTracking?: boolean;\r\n queryParams?: Record<string, string>;\r\n}\r\n\r\nenum WebSocketChatClientEvent {\r\n connect = 'connect',\r\n disconnect = 'disconnect',\r\n message = 'message',\r\n error = 'error',\r\n}\r\n\r\nexport class WebSocketChatClient extends AbstractChatClient implements ObservableInterface {\r\n public readonly Event = WebSocketChatClientEvent;\r\n public readonly state?: ChatStateTracker;\r\n\r\n protected ws: WebSocket|null = null;\r\n protected sendQueue: Envelope[] = [];\r\n protected connectingTimeoutId: any;\r\n protected authenticated: boolean;\r\n protected authenticatedResolvers: [() => void, (error: Error) => void];\r\n\r\n public constructor(private readonly options: WebSocketClientOptions) {\r\n super();\r\n if (this.options.stateTracking ?? true) {\r\n this.state = new ChatStateTracker(this);\r\n }\r\n }\r\n\r\n public async connect(): Promise<void> {\r\n const params = new URLSearchParams(this.options.queryParams ?? {});\r\n params.set('token', this.options.token);\r\n\r\n this.ws = new WebSocket(`${this.options.url}?${params}`);\r\n this.ws.onclose = ev => this.onClose(ev);\r\n this.ws.onmessage = ev => this.onMessage(ev);\r\n this.connectingTimeoutId = setTimeout(\r\n () => this.triggerConnectionTimeout(),\r\n this.options.connectingTimeoutMs ?? 10000\r\n );\r\n this.authenticated = false;\r\n\r\n return new Promise((...args) => this.authenticatedResolvers = args);\r\n }\r\n\r\n public disconnect(): void {\r\n this.sendQueue = [];\r\n this.ws?.close();\r\n this.ws = null;\r\n }\r\n\r\n public async send<CommandType extends keyof CommandsMap>(commandType: CommandType, commandData: CommandsMap[CommandType][0]):\r\n Promise<CommandResult<CommandsMap[CommandType][1]>> {\r\n if (!this.ws || [this.ws.CLOSED, this.ws.CLOSING].includes(this.ws.readyState)) {\r\n throw new Error('Cannot send; close or closing connection state');\r\n }\r\n\r\n const envelope = this.createEnvelope<CommandsMap[CommandType][0]>(commandType, commandData);\r\n const promise = this.createPromiseFromCommandEnvelope<CommandType>(envelope);\r\n\r\n if (this.ws.readyState === this.ws.CONNECTING || !this.authenticated) {\r\n this.sendQueue.push(envelope);\r\n return promise;\r\n }\r\n\r\n if (this.ws.readyState !== this.ws.OPEN) {\r\n throw new Error(`Invalid websocket state=${this.ws.readyState}`);\r\n }\r\n\r\n this.sendEnvelope(envelope);\r\n return promise;\r\n }\r\n\r\n private sendEnvelope(envelope: Envelope): void {\r\n this.ws.send(JSON.stringify(envelope));\r\n }\r\n\r\n private onMessage(event: MessageEvent): void {\r\n const envelope: Envelope = JSON.parse(event.data);\r\n this.handleIncomingEnvelope(envelope);\r\n this.emit(envelope.type, envelope.data);\r\n this.emit(this.Event.message, envelope);\r\n\r\n // Login successfully\r\n if (!this.authenticated) {\r\n const isAuthenticated = envelope.type !== 'Bye';\r\n this.authenticated = isAuthenticated;\r\n if (isAuthenticated) {\r\n this.authenticatedResolvers[0]();\r\n this.emit(this.Event.connect);\r\n this.sendFromQueue();\r\n } else {\r\n this.authenticatedResolvers[1](envelope.data);\r\n }\r\n }\r\n }\r\n\r\n private onClose(event: CloseEvent): void {\r\n clearTimeout(this.connectingTimeoutId);\r\n const reconnect = event.code !== 1000; // Connection was closed because of error\r\n if (reconnect) {\r\n this.connect();\r\n }\r\n this.emit(this.Event.disconnect, reconnect);\r\n }\r\n\r\n private sendFromQueue(): void {\r\n // Send awaiting data to server\r\n let lastDelay = 0;\r\n for (const dataIndex in this.sendQueue) {\r\n const envelope = this.sendQueue[dataIndex];\r\n setTimeout(() => this.sendEnvelope(envelope), lastDelay);\r\n lastDelay += this.options.awaitQueueSendDelayMs ?? 500;\r\n }\r\n this.sendQueue = [];\r\n clearTimeout(this.connectingTimeoutId);\r\n }\r\n\r\n private triggerConnectionTimeout(): void {\r\n this.disconnect();\r\n this.emit(this.Event.error, new Error('Connection timeout'));\r\n }\r\n}","import {AbstractChatClient, CommandResult, CommandsMap} from \"./AbstractChatClient\";\r\nimport {ObservableInterface} from \"./EventTarget\";\r\nimport {Envelope} from \"./types/src\";\r\n\r\nexport interface WebApiChatClientOptions {\r\n url: string;\r\n token: string;\r\n attemptsToSend?: number;\r\n attemptDelayMs?: number;\r\n queryParams?: Record<string, string>;\r\n}\r\n\r\nenum WebApiChatClientEvent {\r\n message = 'message',\r\n error = 'error',\r\n destroy = 'destroy',\r\n}\r\n\r\nexport class WebApiChatClient extends AbstractChatClient implements ObservableInterface {\r\n public readonly Event = WebApiChatClientEvent;\r\n\r\n protected sendStack: {data: any, attempts: number, lastTimeoutId: any}[];\r\n\r\n public constructor(private readonly options: WebApiChatClientOptions) {\r\n super();\r\n }\r\n\r\n public async send<CommandType extends keyof CommandsMap>(commandType: CommandType, commandData: CommandsMap[CommandType][0]):\r\n Promise<CommandResult<CommandsMap[CommandType][1]>> {\r\n const envelope = this.createEnvelope(commandType, commandData);\r\n this.sendStack.push({data: envelope, attempts: 0, lastTimeoutId: null});\r\n this.makeApiCall(this.sendStack.length - 1);\r\n return this.createPromiseFromCommandEnvelope(envelope);\r\n }\r\n\r\n public destroy(): void {\r\n // Cancel all awaiting requests\r\n this.sendStack.forEach(item => {\r\n if (item.lastTimeoutId) {\r\n clearTimeout(item.lastTimeoutId);\r\n }\r\n this.awaitingResponse.delete(item.data.ref);\r\n });\r\n this.sendStack = [];\r\n this.emit(this.Event.destroy, false);\r\n }\r\n\r\n protected async onMessage(reqId: number, response: Response): Promise<void> {\r\n this.sendStack.splice(reqId, 1);\r\n const envelope: Envelope = await response.json();\r\n this.handleIncomingEnvelope(envelope);\r\n this.emit(envelope.type, envelope.data);\r\n this.emit(this.Event.message, envelope);\r\n }\r\n\r\n protected onError(reqId: number, body: string): void {\r\n if (this.sendStack[reqId].attempts >= (this.options.attemptsToSend ?? 10)) {\r\n this.sendStack.splice(reqId, 1);\r\n this.handleEnvelopeSendError(this.sendStack[reqId].data, new Error(\r\n `Cannot send ${body}; aborting after reaching the maximum connection errors`\r\n ));\r\n return;\r\n }\r\n this.sendStack[reqId].lastTimeoutId = setTimeout(\r\n () => this.makeApiCall(reqId),\r\n this.options.attemptDelayMs ?? 3000\r\n );\r\n }\r\n\r\n protected makeApiCall(reqId: number): void {\r\n this.sendStack[reqId].attempts++;\r\n const bodyJson = JSON.stringify(this.sendStack[reqId].data);\r\n const headers: any = {\r\n 'Content-Type': 'application/json',\r\n Accept: 'application/json'\r\n };\r\n\r\n headers.Authorization = `Bearer ${this.options.token}`;\r\n\r\n const params = new URLSearchParams(this.options.queryParams ?? {});\r\n const url = `${this.options.url}${params ? '?' + params : ''}`;\r\n\r\n fetch(url, {\r\n headers,\r\n body: bodyJson,\r\n method: 'POST',\r\n })\r\n .then(response => this.onMessage(reqId, response))\r\n .catch(() => this.onError(reqId, bodyJson));\r\n }\r\n}","export interface RestClientOptions {\r\n url?: string;\r\n token: string;\r\n}\r\n\r\nexport interface RestClientResponse<T> {\r\n ok: boolean;\r\n status: number;\r\n data: T;\r\n}\r\n\r\nexport type HttpMethod = 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE';\r\n\r\nexport abstract class AbstractRestClient {\r\n protected abstract defaultUrl: string;\r\n\r\n public constructor(\r\n private readonly options: RestClientOptions,\r\n ) {}\r\n\r\n protected async send<ResponseT = any>(\r\n method: HttpMethod,\r\n uri: string,\r\n data: any = undefined\r\n ): Promise<RestClientResponse<ResponseT>> {\r\n let url = this.getUrl(uri);\r\n let body = undefined;\r\n\r\n if (data) {\r\n if (['GET', 'DELETE'].includes(method)) {\r\n url += new URLSearchParams(data).toString()\r\n } else {\r\n body = JSON.stringify(data);\r\n }\r\n }\r\n\r\n const headers = {\r\n 'Content-Type': 'application/json',\r\n Accept: 'application/json',\r\n ...this.getAuthHeaders(),\r\n };\r\n\r\n const result = await fetch(url, {method, body, headers});\r\n\r\n return this.convertFetchResponse(result);\r\n }\r\n\r\n protected getAuthHeaders(): any {\r\n const headers = {} as any;\r\n\r\n if (this.options.token) {\r\n headers.Authorization = `Bearer ${this.options.token}`;\r\n }\r\n\r\n return headers;\r\n }\r\n\r\n protected getUrl(uri: string): string {\r\n return this.removeEndingSlash(this.options.url ?? this.defaultUrl) + '/' + this.removeStartingSlash(uri);\r\n }\r\n\r\n protected async convertFetchResponse<T>(result: Response): Promise<RestClientResponse<T>> {\r\n return {\r\n ok: result.ok,\r\n status: result.status,\r\n data: result.headers.get('content-type')?.includes('json') ? await result.json() : await result.text(),\r\n };\r\n }\r\n\r\n private removeStartingSlash(text: string): string {\r\n return text.replace(/^\\/+/, '');\r\n }\r\n\r\n private removeEndingSlash(text: string): string {\r\n return text.replace(/\\/+$/, '');\r\n }\r\n}","import {AbstractRestClient} from \"./AbstractRestClient\";\r\n\r\nexport interface TokenInterface {\r\n token: string,\r\n expiration: string\r\n}\r\n\r\nexport interface MyAccountInterface {\r\n id: string;\r\n nick: string;\r\n avatar: string;\r\n}\r\n\r\nexport class AuthClient extends AbstractRestClient {\r\n protected defaultUrl: string = 'https://polfan.pl/webservice/api';\r\n\r\n public static async createToken(\r\n login: string,\r\n password: string,\r\n clientName: string = 'pserv-js-client'\r\n ): Promise<TokenInterface> {\r\n const response = await new AuthClient({token: null}).send('POST', 'auth/tokens', {\r\n login, password, client_name: clientName\r\n });\r\n if (response.ok) {\r\n return response.data;\r\n }\r\n throw new Error(`Cannot create user token: ${response.data.errors[0]}`);\r\n }\r\n\r\n public async deleteToken(token: string): Promise<void> {\r\n const response = await this.send('DELETE', `auth/tokens/${token}`);\r\n if (!response.ok) {\r\n throw new Error(`Cannot delete access token: ${response.data.errors[0]}`);\r\n }\r\n }\r\n\r\n public async getMe(): Promise<MyAccountInterface> {\r\n const response = await this.send('GET', 'auth/me');\r\n if (response.ok) {\r\n response.data.id = response.data.id.toString();\r\n return response.data;\r\n }\r\n throw new Error(`Cannot get current user account: ${response.data.errors[0]}`);\r\n }\r\n}","import {AbstractRestClient, RestClientResponse} from \"./AbstractRestClient\";\r\n\r\nexport interface File {\r\n id: string;\r\n url: string;\r\n name: string;\r\n mime: string;\r\n size: number;\r\n width?: number;\r\n height?: number;\r\n}\r\n\r\nexport class FilesClient extends AbstractRestClient {\r\n protected defaultUrl: string = 'https://files.devana.pl';\r\n\r\n public async uploadFile(file: globalThis.File | Blob): Promise<RestClientResponse<File>> {\r\n const name = encodeURIComponent((file as globalThis.File).name ?? '');\r\n let headers = {\r\n ...this.getAuthHeaders(),\r\n Accept: 'application/json',\r\n 'Content-Disposition': `attachment; filename=\"${name}\"`,\r\n 'Content-Length': file.size\r\n };\r\n\r\n const response = await fetch(this.getUrl('files'), {\r\n method: 'POST',\r\n body: file,\r\n headers\r\n });\r\n\r\n return this.convertFetchResponse<File>(response);\r\n }\r\n\r\n public async getFileMeta(id: string): Promise<RestClientResponse<File>> {\r\n return this.send('GET', 'files/' + id);\r\n }\r\n\r\n public async getFileMetaBulk(ids: string[]): Promise<RestClientResponse<File[]>> {\r\n const searchParams = new URLSearchParams();\r\n ids.forEach(id => searchParams.append('id[]', id));\r\n return this.send('GET', 'files?' + searchParams);\r\n }\r\n}","import {WebSocketChatClient} from \"./WebSocketChatClient\";\r\nimport {WebApiChatClient} from \"./WebApiChatClient\";\r\nimport {\r\n IndexedCollection,\r\n IndexedObjectCollection,\r\n ObservableIndexedCollection,\r\n ObservableIndexedObjectCollection\r\n} from \"./IndexedObjectCollection\";\r\nimport { AuthClient, MyAccountInterface, TokenInterface } from \"./AuthClient\";\r\nimport {FilesClient, File} from \"./FilesClient\";\r\nimport { Permissions, PermissionDefinition, Layer } from \"./Permissions\";\r\nimport * as ChatTypes from './types/src';\r\nimport {extractUserFromMember} from \"./state-tracker/functions\";\r\n\r\nexport {\r\n IndexedCollection, ObservableIndexedCollection,\r\n IndexedObjectCollection, ObservableIndexedObjectCollection,\r\n Permissions, PermissionDefinition, Layer,\r\n WebSocketChatClient, WebApiChatClient,\r\n AuthClient,\r\n FilesClient,\r\n extractUserFromMember,\r\n};\r\n\r\nexport type {\r\n ChatTypes,\r\n MyAccountInterface, TokenInterface, File,\r\n};"],"names":["EventTarget","constructor","_defineProperty","Map","on","eventName","handler","addHandler","events","once","onceEvents","off","index","get","indexOf","splice","emit","event","callHandlers","delete","map","handlers","push","set","forEach","callback","AbstractChatClient","args","createEnvelope","type","data","ref","sentCounter","toString","createPromiseFromCommandEnvelope","envelope","Promise","awaitingResponse","handleIncomingEnvelope","has","isError","error","handleEnvelopeSendError","IndexedCollection","items","mutationCounter","_mutationCounter","_items","length","size","item","id","ids","deleteAll","clear","findBy","field","valueToFind","limit","result","entries","next","value","done","IndexedObjectCollection","Array","from","values","getId","getAt","ObservableIndexedCollection","eventTarget","setItems","deletedItems","keys","ObservableIndexedObjectCollection","DeferredTask","promise","resolve","PromiseRegistry","register","key","promises","registerByFunction","fn","notExist","forget","forgetAll","WindowState","TraversableRemoteCollection","LIVE","undefined","state","currentState","hasLatest","LATEST","includes","hasOldest","OLDEST","oldestId","resetToLatest","fetchingState","fetchLatestItems","addItems","fetchPrevious","PAST","fetchItemsBefore","firstItem","refreshFetchedState","fetchNext","fetchItemsAfter","isLatestItemLoaded","newItems","to","trimItemsArrayToLimit","slice","TopicHistoryWindow","roomId","topicId","tracker","client","ev","handleSession","handleNewMessage","_updateMessageReference","refTopic","refMessage","topicRef","message","location","rooms","find","room","afterId","send","after","Error","messages","beforeId","before","getTopic","getTopics","getLatestMessageId","lastMessage","lastMessageId","RoomMessagesHistory","handleRoomUpdated","handleNewTopic","handleTopicDeleted","defaultTopic","createHistoryWindowForTopic","getMessagesWindow","historyWindow","historyWindows","topic","refHistoryWindow","MessagesManager","handleRoomJoin","handleFollowedTopicUpdated","handleTopicFollowed","handleTopicUnfollowed","handleRoomDeleted","handleRoomLeft","getRoomHistory","deferredSession","roomHistories","cacheSpaceFollowedTopics","spaceId","spaces","roomIds","resultPromise","followedTopicsPromises","setFollowedTopicsArray","followedTopics","getRoomFollowedTopics","ackRoomFollowedTopics","collection","followedTopic","missed","calculateRoomMissedMessages","reduce","previousValue","currentValue","_deleteByTopicIds","topicIds","createHistoryForNewRoom","updateLocallyFollowedTopicOnNewMessage","clearRoomFollowedTopicsStructures","roomFollowedTopics","ephemeralMessageTypes","isMe","author","user","me","update","lastAckMessageId","roomToTopics","RoomsManager","handleRoomJoined","handleTopicUpdated","handleRoomMemberJoined","handleRoomMemberLeft","handleRoomMembers","handleRoomMemberUpdated","handleSpaceMemberLeft","handleSpaceMemberUpdated","handleSpaceDeleted","handleUserUpdated","getMembers","membersPromises","members","getMe","userId","list","member","spaceMember","tryToFetchTopicIds","canFetch","topics","topicsPromises","idsToFetch","filter","then","deleteRoom","deleteRoomsBySpaceId","roomMembers","roomMember","newMember","addJoinedRoomTopics","addJoinedRooms","recipients","roles","newTopic","messageCount","reorderRolesOnPriorityUpdate","allRoles","oldRole","updatedRole","increased","priority","decreased","changedRoles","role","extractUserFromMember","SpacesManager","handleNewRoom","handleSpaceUpdated","handleSpaceJoined","handleSpaceMemberJoined","handleSpaceMembers","handleSpaceRooms","handleNewRole","handleRoleDeleted","handleRoleUpdated","getRoles","getRooms","roomsPromises","summary","roomIdToSpaceId","name","description","space","spaceChanged","systemRoom","defaultRooms","addJoinedSpaces","summaries","newRole","rolesToUpdate","Layer","PermissionDefinition","Permissions","getNames","Object","getByName","canBeDefinedOnLayer","permissionName","layer","def","maxLayer","Root","Room","CreateSpaces","Global","ManageSpace","Space","ManageSpaceRoles","ManageRoom","CreateTopics","ManageTopic","Topic","ManageSpaceMembers","ManageRoomMembers","CreateMessages","ManagePermissions","CreateSpaceRooms","ManageSpaceRooms","CreateEmoticons","ManageEmoticon","ManageBan","Kick","ChangeOwnNick","getOvId","target","roleId","Boolean","join","getOvIdByObject","overwrites","PermissionsManager","handlePermissionOverwrites","getOverwrites","validateLocation","overwritesPromises","check","permissionNames","ownedPermissions","calculatePermissions","missing","ok","hasAll","hasAny","fetchMembersOrFail","userRoles","v","filterLocation","collectRoleOverwrites","resolveOverwritesHierarchy","all","deleteOverwritesByIdPrefix","prefix","startsWith","roleOverwrites","resolveOverwritesFromRolesByOrder","allows","denies","sortedOverwrites","sort","a","b","permissionsLength","Math","max","allow","deny","overwriteEvent","revDecDenies","split","reverse","revDecAllows","i","parseInt","permissionOverwritesValues","getRootAccessValue","results","spaceFail","roomFail","GLOBAL_KEY","EmoticonsManager","handleEmoticons","handleNewEmoticon","handleEmoticonDeleted","emoticonsPromises","emoticons","emoticon","emoticonId","UsersManager","handleUsers","handleMembers","getAvailable","users","session","newUser","oldUser","online","onlineStatus","refUserId","getIdFromRelationship","relationship","RelationshipsManager","handleRelationships","handleNewRelationship","handleRelationshipDeleted","relationships","exists","ChatStateTracker","_me","WebSocketChatClientEvent","WebSocketChatClient","options","stateTracking","connect","params","URLSearchParams","queryParams","token","ws","WebSocket","url","onclose","onClose","onmessage","onMessage","connectingTimeoutId","setTimeout","triggerConnectionTimeout","connectingTimeoutMs","authenticated","authenticatedResolvers","disconnect","sendQueue","close","commandType","commandData","CLOSED","CLOSING","readyState","CONNECTING","OPEN","sendEnvelope","JSON","stringify","parse","Event","isAuthenticated","sendFromQueue","clearTimeout","reconnect","code","lastDelay","dataIndex","awaitQueueSendDelayMs","WebApiChatClientEvent","WebApiChatClient","sendStack","attempts","lastTimeoutId","makeApiCall","destroy","reqId","response","json","onError","body","attemptsToSend","attemptDelayMs","bodyJson","headers","Accept","Authorization","fetch","method","catch","AbstractRestClient","uri","getUrl","getAuthHeaders","convertFetchResponse","removeEndingSlash","defaultUrl","removeStartingSlash","status","text","replace","AuthClient","createToken","login","password","clientName","client_name","errors","deleteToken","FilesClient","uploadFile","file","encodeURIComponent","getFileMeta","getFileMetaBulk","searchParams","append"],"sourceRoot":""}
|