polfan-server-js-client 0.0.96 → 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (158) hide show
  1. package/build/index.js +1 -1
  2. package/build/index.js.map +1 -1
  3. package/build/types/AbstractChatClient.d.ts +78 -0
  4. package/build/types/AbstractRestClient.d.ts +19 -0
  5. package/build/types/AuthClient.d.ts +16 -0
  6. package/build/types/ChatStateTracker.d.ts +54 -0
  7. package/build/types/EventTarget.d.ts +16 -0
  8. package/build/types/IndexedObjectCollection.d.ts +53 -0
  9. package/build/types/WebApiChatClient.d.ts +30 -0
  10. package/build/types/WebSocketChatClient.d.ts +36 -0
  11. package/build/types/index.d.ts +5 -68
  12. package/package.json +65 -64
  13. package/src/AbstractChatClient.ts +174 -0
  14. package/src/AbstractRestClient.ts +66 -0
  15. package/src/AuthClient.ts +46 -0
  16. package/src/ChatStateTracker.ts +326 -0
  17. package/src/EventTarget.ts +39 -0
  18. package/src/IndexedObjectCollection.ts +209 -0
  19. package/src/{connections/WebApiConnection.ts → WebApiChatClient.ts} +94 -81
  20. package/src/WebSocketChatClient.ts +125 -0
  21. package/src/index.ts +15 -123
  22. package/build/types/Client.d.ts +0 -107
  23. package/build/types/ObservableInterface.d.ts +0 -16
  24. package/build/types/connections/ConnectionAssets.d.ts +0 -17
  25. package/build/types/connections/RestApiConnection.d.ts +0 -14
  26. package/build/types/connections/WebApiConnection.d.ts +0 -21
  27. package/build/types/connections/WebSocketConnection.d.ts +0 -22
  28. package/build/types/dtos/Dto.d.ts +0 -16
  29. package/build/types/dtos/Message.d.ts +0 -9
  30. package/build/types/dtos/Permission.d.ts +0 -7
  31. package/build/types/dtos/Role.d.ts +0 -7
  32. package/build/types/dtos/Room.d.ts +0 -10
  33. package/build/types/dtos/RoomMember.d.ts +0 -6
  34. package/build/types/dtos/RoomSummary.d.ts +0 -7
  35. package/build/types/dtos/Space.d.ts +0 -8
  36. package/build/types/dtos/SpaceMember.d.ts +0 -7
  37. package/build/types/dtos/Topic.d.ts +0 -7
  38. package/build/types/dtos/User.d.ts +0 -9
  39. package/build/types/dtos/UserState.d.ts +0 -8
  40. package/build/types/dtos/protocol/Envelope.d.ts +0 -7
  41. package/build/types/dtos/protocol/commands/AssignRole.d.ts +0 -7
  42. package/build/types/dtos/protocol/commands/CreateMessage.d.ts +0 -7
  43. package/build/types/dtos/protocol/commands/CreateRole.d.ts +0 -7
  44. package/build/types/dtos/protocol/commands/CreateRoom.d.ts +0 -7
  45. package/build/types/dtos/protocol/commands/CreateSpace.d.ts +0 -5
  46. package/build/types/dtos/protocol/commands/CreateTopic.d.ts +0 -7
  47. package/build/types/dtos/protocol/commands/DeassignRole.d.ts +0 -7
  48. package/build/types/dtos/protocol/commands/DeleteRole.d.ts +0 -6
  49. package/build/types/dtos/protocol/commands/DeleteRoom.d.ts +0 -5
  50. package/build/types/dtos/protocol/commands/DeleteSpace.d.ts +0 -5
  51. package/build/types/dtos/protocol/commands/DeleteTopic.d.ts +0 -5
  52. package/build/types/dtos/protocol/commands/GetComputedPermissions.d.ts +0 -8
  53. package/build/types/dtos/protocol/commands/GetRolePermissions.d.ts +0 -8
  54. package/build/types/dtos/protocol/commands/GetRoomMembers.d.ts +0 -5
  55. package/build/types/dtos/protocol/commands/GetSession.d.ts +0 -4
  56. package/build/types/dtos/protocol/commands/GetSpaceMembers.d.ts +0 -5
  57. package/build/types/dtos/protocol/commands/GetSpaceRooms.d.ts +0 -5
  58. package/build/types/dtos/protocol/commands/GetUserPermissions.d.ts +0 -8
  59. package/build/types/dtos/protocol/commands/JoinRoom.d.ts +0 -5
  60. package/build/types/dtos/protocol/commands/JoinSpace.d.ts +0 -5
  61. package/build/types/dtos/protocol/commands/LeaveRoom.d.ts +0 -5
  62. package/build/types/dtos/protocol/commands/LeaveSpace.d.ts +0 -5
  63. package/build/types/dtos/protocol/commands/SetRolePermissions.d.ts +0 -9
  64. package/build/types/dtos/protocol/commands/SetUserPermissions.d.ts +0 -9
  65. package/build/types/dtos/protocol/events/Bye.d.ts +0 -5
  66. package/build/types/dtos/protocol/events/Error.d.ts +0 -6
  67. package/build/types/dtos/protocol/events/NewMessage.d.ts +0 -6
  68. package/build/types/dtos/protocol/events/NewRole.d.ts +0 -7
  69. package/build/types/dtos/protocol/events/NewRoom.d.ts +0 -7
  70. package/build/types/dtos/protocol/events/NewTopic.d.ts +0 -7
  71. package/build/types/dtos/protocol/events/Ok.d.ts +0 -4
  72. package/build/types/dtos/protocol/events/Permissions.d.ts +0 -6
  73. package/build/types/dtos/protocol/events/RoleDeleted.d.ts +0 -6
  74. package/build/types/dtos/protocol/events/RoomDeleted.d.ts +0 -5
  75. package/build/types/dtos/protocol/events/RoomJoined.d.ts +0 -6
  76. package/build/types/dtos/protocol/events/RoomLeft.d.ts +0 -5
  77. package/build/types/dtos/protocol/events/RoomMemberJoined.d.ts +0 -6
  78. package/build/types/dtos/protocol/events/RoomMemberLeft.d.ts +0 -5
  79. package/build/types/dtos/protocol/events/RoomMembers.d.ts +0 -6
  80. package/build/types/dtos/protocol/events/Session.d.ts +0 -9
  81. package/build/types/dtos/protocol/events/SpaceDeleted.d.ts +0 -5
  82. package/build/types/dtos/protocol/events/SpaceJoined.d.ts +0 -6
  83. package/build/types/dtos/protocol/events/SpaceLeft.d.ts +0 -5
  84. package/build/types/dtos/protocol/events/SpaceMemberJoined.d.ts +0 -6
  85. package/build/types/dtos/protocol/events/SpaceMemberLeft.d.ts +0 -5
  86. package/build/types/dtos/protocol/events/SpaceMemberUpdate.d.ts +0 -6
  87. package/build/types/dtos/protocol/events/SpaceMembers.d.ts +0 -6
  88. package/build/types/dtos/protocol/events/SpaceRooms.d.ts +0 -6
  89. package/build/types/dtos/protocol/events/TopicDeleted.d.ts +0 -5
  90. package/build/types/protocol.d.ts +0 -102
  91. package/src/Client.ts +0 -267
  92. package/src/ObservableInterface.ts +0 -39
  93. package/src/connections/ConnectionAssets.ts +0 -20
  94. package/src/connections/RestApiConnection.ts +0 -47
  95. package/src/connections/WebSocketConnection.ts +0 -103
  96. package/src/dtos/Dto.ts +0 -45
  97. package/src/dtos/Message.ts +0 -16
  98. package/src/dtos/Permission.ts +0 -12
  99. package/src/dtos/Role.ts +0 -12
  100. package/src/dtos/Room.ts +0 -17
  101. package/src/dtos/RoomMember.ts +0 -13
  102. package/src/dtos/RoomSummary.ts +0 -12
  103. package/src/dtos/Space.ts +0 -15
  104. package/src/dtos/SpaceMember.ts +0 -14
  105. package/src/dtos/Topic.ts +0 -12
  106. package/src/dtos/User.ts +0 -15
  107. package/src/dtos/UserState.ts +0 -16
  108. package/src/dtos/protocol/Envelope.ts +0 -12
  109. package/src/dtos/protocol/commands/AssignRole.ts +0 -12
  110. package/src/dtos/protocol/commands/CreateMessage.ts +0 -12
  111. package/src/dtos/protocol/commands/CreateRole.ts +0 -12
  112. package/src/dtos/protocol/commands/CreateRoom.ts +0 -12
  113. package/src/dtos/protocol/commands/CreateSpace.ts +0 -10
  114. package/src/dtos/protocol/commands/CreateTopic.ts +0 -12
  115. package/src/dtos/protocol/commands/DeassignRole.ts +0 -12
  116. package/src/dtos/protocol/commands/DeleteRole.ts +0 -11
  117. package/src/dtos/protocol/commands/DeleteRoom.ts +0 -10
  118. package/src/dtos/protocol/commands/DeleteSpace.ts +0 -10
  119. package/src/dtos/protocol/commands/DeleteTopic.ts +0 -10
  120. package/src/dtos/protocol/commands/GetComputedPermissions.ts +0 -13
  121. package/src/dtos/protocol/commands/GetRolePermissions.ts +0 -13
  122. package/src/dtos/protocol/commands/GetRoomMembers.ts +0 -10
  123. package/src/dtos/protocol/commands/GetSession.ts +0 -8
  124. package/src/dtos/protocol/commands/GetSpaceMembers.ts +0 -10
  125. package/src/dtos/protocol/commands/GetSpaceRooms.ts +0 -10
  126. package/src/dtos/protocol/commands/GetUserPermissions.ts +0 -13
  127. package/src/dtos/protocol/commands/JoinRoom.ts +0 -10
  128. package/src/dtos/protocol/commands/JoinSpace.ts +0 -10
  129. package/src/dtos/protocol/commands/LeaveRoom.ts +0 -10
  130. package/src/dtos/protocol/commands/LeaveSpace.ts +0 -10
  131. package/src/dtos/protocol/commands/SetRolePermissions.ts +0 -16
  132. package/src/dtos/protocol/commands/SetUserPermissions.ts +0 -16
  133. package/src/dtos/protocol/events/Bye.ts +0 -10
  134. package/src/dtos/protocol/events/Error.ts +0 -11
  135. package/src/dtos/protocol/events/NewMessage.ts +0 -13
  136. package/src/dtos/protocol/events/NewRole.ts +0 -14
  137. package/src/dtos/protocol/events/NewRoom.ts +0 -14
  138. package/src/dtos/protocol/events/NewTopic.ts +0 -14
  139. package/src/dtos/protocol/events/Ok.ts +0 -8
  140. package/src/dtos/protocol/events/Permissions.ts +0 -13
  141. package/src/dtos/protocol/events/RoleDeleted.ts +0 -11
  142. package/src/dtos/protocol/events/RoomDeleted.ts +0 -10
  143. package/src/dtos/protocol/events/RoomJoined.ts +0 -13
  144. package/src/dtos/protocol/events/RoomLeft.ts +0 -10
  145. package/src/dtos/protocol/events/RoomMemberJoined.ts +0 -13
  146. package/src/dtos/protocol/events/RoomMemberLeft.ts +0 -10
  147. package/src/dtos/protocol/events/RoomMembers.ts +0 -13
  148. package/src/dtos/protocol/events/Session.ts +0 -17
  149. package/src/dtos/protocol/events/SpaceDeleted.ts +0 -10
  150. package/src/dtos/protocol/events/SpaceJoined.ts +0 -13
  151. package/src/dtos/protocol/events/SpaceLeft.ts +0 -10
  152. package/src/dtos/protocol/events/SpaceMemberJoined.ts +0 -13
  153. package/src/dtos/protocol/events/SpaceMemberLeft.ts +0 -10
  154. package/src/dtos/protocol/events/SpaceMemberUpdate.ts +0 -13
  155. package/src/dtos/protocol/events/SpaceMembers.ts +0 -13
  156. package/src/dtos/protocol/events/SpaceRooms.ts +0 -13
  157. package/src/dtos/protocol/events/TopicDeleted.ts +0 -10
  158. package/src/protocol.ts +0 -113
@@ -0,0 +1,30 @@
1
+ import { AbstractChatClient, CommandResult, CommandsMap } from "./AbstractChatClient";
2
+ import { ObservableInterface } from "./EventTarget";
3
+ export interface WebApiChatClientOptions {
4
+ url: string;
5
+ token?: string;
6
+ temporaryNick?: string;
7
+ attemptsToSend?: number;
8
+ attemptDelayMs?: number;
9
+ }
10
+ declare enum WebApiChatClientEvent {
11
+ message = "message",
12
+ error = "error",
13
+ destroy = "destroy"
14
+ }
15
+ export declare class WebApiChatClient extends AbstractChatClient implements ObservableInterface {
16
+ private readonly options;
17
+ readonly Event: typeof WebApiChatClientEvent;
18
+ protected sendStack: {
19
+ data: any;
20
+ attempts: number;
21
+ lastTimeoutId: any;
22
+ }[];
23
+ constructor(options: WebApiChatClientOptions);
24
+ send<CommandType extends keyof CommandsMap>(commandType: CommandType, commandData: CommandsMap[CommandType][0]): Promise<CommandResult<CommandsMap[CommandType][1]>>;
25
+ destroy(): void;
26
+ protected onMessage(reqId: number, response: Response): Promise<void>;
27
+ protected onError(reqId: number, body: string): void;
28
+ protected makeApiCall(reqId: number): void;
29
+ }
30
+ export {};
@@ -0,0 +1,36 @@
1
+ import { ObservableInterface } from "./EventTarget";
2
+ import { AbstractChatClient, CommandResult, CommandsMap } from "./AbstractChatClient";
3
+ import { ChatStateTracker } from "./ChatStateTracker";
4
+ export interface WebSocketClientOptions {
5
+ url: string;
6
+ token?: string;
7
+ temporaryNick?: string;
8
+ connectingTimeoutMs?: number;
9
+ awaitQueueSendDelayMs?: number;
10
+ stateTracking?: boolean;
11
+ }
12
+ declare enum WebSocketChatClientEvent {
13
+ connect = "connect",
14
+ disconnect = "disconnect",
15
+ message = "message",
16
+ error = "error"
17
+ }
18
+ export declare class WebSocketChatClient extends AbstractChatClient implements ObservableInterface {
19
+ private readonly options;
20
+ readonly Event: typeof WebSocketChatClientEvent;
21
+ readonly state?: ChatStateTracker;
22
+ protected ws: WebSocket | null;
23
+ protected sendQueue: [commandType: keyof CommandsMap, commandData: any][];
24
+ protected connectingTimeoutId: any;
25
+ protected authenticated: boolean;
26
+ protected authenticatedResolvers: [() => void, (error: Error) => void];
27
+ constructor(options: WebSocketClientOptions);
28
+ connect(): Promise<void>;
29
+ disconnect(): void;
30
+ send<CommandType extends keyof CommandsMap>(commandType: CommandType, commandData: CommandsMap[CommandType][0]): Promise<CommandResult<CommandsMap[CommandType][1]>>;
31
+ private onMessage;
32
+ private onClose;
33
+ private sendFromQueue;
34
+ private triggerConnectionTimeout;
35
+ }
36
+ export {};
@@ -1,68 +1,5 @@
1
- import { Client, ClientEvent } from "./Client";
2
- import { WebApiConnection } from "./connections/WebApiConnection";
3
- import { WebSocketConnection } from "./connections/WebSocketConnection";
4
- import { RestApiConnection } from "./connections/RestApiConnection";
5
- import { ChatConnectionEvent } from "./connections/ConnectionAssets";
6
- import { Dto } from "./dtos/Dto";
7
- import { Envelope } from "./dtos/protocol/Envelope";
8
- import { Message } from "./dtos/Message";
9
- import { Permission } from "./dtos/Permission";
10
- import { Role } from "./dtos/Role";
11
- import { Room } from "./dtos/Room";
12
- import { RoomMember } from "./dtos/RoomMember";
13
- import { RoomSummary } from "./dtos/RoomSummary";
14
- import { Space } from "./dtos/Space";
15
- import { SpaceMember } from "./dtos/SpaceMember";
16
- import { Topic } from "./dtos/Topic";
17
- import { User } from "./dtos/User";
18
- import { UserState } from "./dtos/UserState";
19
- import { Bye } from "./dtos/protocol/events/Bye";
20
- import { Ok } from "./dtos/protocol/events/Ok";
21
- import { Error } from "./dtos/protocol/events/Error";
22
- import { Session } from "./dtos/protocol/events/Session";
23
- import { Permissions } from "./dtos/protocol/events/Permissions";
24
- import { SpaceJoined } from "./dtos/protocol/events/SpaceJoined";
25
- import { SpaceLeft } from "./dtos/protocol/events/SpaceLeft";
26
- import { SpaceMemberJoined } from "./dtos/protocol/events/SpaceMemberJoined";
27
- import { SpaceMemberLeft } from "./dtos/protocol/events/SpaceMemberLeft";
28
- import { SpaceMemberUpdate } from "./dtos/protocol/events/SpaceMemberUpdate";
29
- import { SpaceDeleted } from "./dtos/protocol/events/SpaceDeleted";
30
- import { SpaceMembers } from "./dtos/protocol/events/SpaceMembers";
31
- import { SpaceRooms } from "./dtos/protocol/events/SpaceRooms";
32
- import { NewRole } from "./dtos/protocol/events/NewRole";
33
- import { RoleDeleted } from "./dtos/protocol/events/RoleDeleted";
34
- import { RoomJoined } from "./dtos/protocol/events/RoomJoined";
35
- import { RoomLeft } from "./dtos/protocol/events/RoomLeft";
36
- import { RoomMemberJoined } from "./dtos/protocol/events/RoomMemberJoined";
37
- import { RoomMemberLeft } from "./dtos/protocol/events/RoomMemberLeft";
38
- import { RoomMembers } from "./dtos/protocol/events/RoomMembers";
39
- import { NewRoom } from "./dtos/protocol/events/NewRoom";
40
- import { RoomDeleted } from "./dtos/protocol/events/RoomDeleted";
41
- import { NewTopic } from "./dtos/protocol/events/NewTopic";
42
- import { TopicDeleted } from "./dtos/protocol/events/TopicDeleted";
43
- import { NewMessage } from "./dtos/protocol/events/NewMessage";
44
- import { GetSession } from "./dtos/protocol/commands/GetSession";
45
- import { SetUserPermissions } from "./dtos/protocol/commands/SetUserPermissions";
46
- import { GetUserPermissions } from "./dtos/protocol/commands/GetUserPermissions";
47
- import { GetComputedPermissions } from "./dtos/protocol/commands/GetComputedPermissions";
48
- import { JoinSpace } from "./dtos/protocol/commands/JoinSpace";
49
- import { LeaveSpace } from "./dtos/protocol/commands/LeaveSpace";
50
- import { CreateSpace } from "./dtos/protocol/commands/CreateSpace";
51
- import { DeleteSpace } from "./dtos/protocol/commands/DeleteSpace";
52
- import { GetSpaceMembers } from "./dtos/protocol/commands/GetSpaceMembers";
53
- import { GetSpaceRooms } from "./dtos/protocol/commands/GetSpaceRooms";
54
- import { CreateRole } from "./dtos/protocol/commands/CreateRole";
55
- import { DeleteRole } from "./dtos/protocol/commands/DeleteRole";
56
- import { AssignRole } from "./dtos/protocol/commands/AssignRole";
57
- import { DeassignRole } from "./dtos/protocol/commands/DeassignRole";
58
- import { SetRolePermissions } from "./dtos/protocol/commands/SetRolePermissions";
59
- import { GetRolePermissions } from "./dtos/protocol/commands/GetRolePermissions";
60
- import { JoinRoom } from "./dtos/protocol/commands/JoinRoom";
61
- import { LeaveRoom } from "./dtos/protocol/commands/LeaveRoom";
62
- import { CreateRoom } from "./dtos/protocol/commands/CreateRoom";
63
- import { DeleteRoom } from "./dtos/protocol/commands/DeleteRoom";
64
- import { GetRoomMembers } from "./dtos/protocol/commands/GetRoomMembers";
65
- import { CreateTopic } from "./dtos/protocol/commands/CreateTopic";
66
- import { DeleteTopic } from "./dtos/protocol/commands/DeleteTopic";
67
- import { CreateMessage } from "./dtos/protocol/commands/CreateMessage";
68
- export { Client, ClientEvent, WebSocketConnection, WebApiConnection, RestApiConnection, ChatConnectionEvent, Dto, Envelope, Message, Permission, Role, Room, RoomMember, RoomSummary, Space, SpaceMember, Topic, User, UserState, Bye, Error, NewMessage, NewRole, NewRoom, NewTopic, Ok, Permissions, RoleDeleted, RoomDeleted, RoomJoined, RoomLeft, RoomMemberJoined, RoomMemberLeft, RoomMembers, Session, SpaceDeleted, SpaceJoined, SpaceLeft, SpaceMemberJoined, SpaceMemberLeft, SpaceMembers, SpaceMemberUpdate, SpaceRooms, TopicDeleted, AssignRole, CreateMessage, CreateRole, CreateRoom, CreateSpace, CreateTopic, DeassignRole, DeleteRole, DeleteRoom, DeleteSpace, DeleteTopic, GetComputedPermissions, GetRolePermissions, GetRoomMembers, GetSession, GetSpaceMembers, GetSpaceRooms, GetUserPermissions, JoinRoom, JoinSpace, LeaveRoom, LeaveSpace, SetRolePermissions, SetUserPermissions, };
1
+ import { WebSocketChatClient } from "./WebSocketChatClient";
2
+ import { WebApiChatClient } from "./WebApiChatClient";
3
+ import { IndexedCollection, IndexedObjectCollection, ObservableIndexedCollection, ObservableIndexedObjectCollection } from "./IndexedObjectCollection";
4
+ import { AuthClient } from "./AuthClient";
5
+ export { IndexedCollection, ObservableIndexedCollection, IndexedObjectCollection, ObservableIndexedObjectCollection, WebSocketChatClient, WebApiChatClient, AuthClient };
package/package.json CHANGED
@@ -1,64 +1,65 @@
1
- {
2
- "name": "polfan-server-js-client",
3
- "version": "0.0.96",
4
- "description": "JavaScript client library for handling communication with Polfan chat server.",
5
- "author": "Jarosław Żak",
6
- "license": "MIT",
7
- "main": "build/index.js",
8
- "types": "build/types/index.d.ts",
9
- "scripts": {
10
- "start": "webpack serve --config webpack.config.demo.js",
11
- "build": "webpack && tsc",
12
- "build:demo": "webpack --config webpack.config.demo.js",
13
- "test": "jest --silent",
14
- "coverage": "npm run test -- --coverage",
15
- "prepare": "npm run build",
16
- "trypublish": "npm publish || true"
17
- },
18
- "devDependencies": {
19
- "@babel/cli": "^7.20.7",
20
- "@babel/core": "^7.20.12",
21
- "@babel/plugin-proposal-class-properties": "^7.16.0",
22
- "@babel/plugin-transform-typescript": "^7.20.2",
23
- "@babel/polyfill": "^7.12.1",
24
- "@babel/preset-env": "^7.20.2",
25
- "@types/jest": "^29.2.5",
26
- "@typescript-eslint/eslint-plugin": "^4.33.0",
27
- "@typescript-eslint/parser": "^4.33.0",
28
- "babel-eslint": "^10.1.0",
29
- "babel-loader": "^9.1.2",
30
- "babel-preset-minify": "^0.5.2",
31
- "css-loader": "^6.7.3",
32
- "css-minimizer-webpack-plugin": "^4.2.2",
33
- "eslint": "^7.32.0",
34
- "file-loader": "^6.2.0",
35
- "html-webpack-plugin": "^5.5.0",
36
- "jest": "^29.3.1",
37
- "mini-css-extract-plugin": "^2.7.2",
38
- "style-loader": "^3.3.1",
39
- "terser-webpack-plugin": "^5.3.5",
40
- "typescript": "^4.9.4",
41
- "url-loader": "^4.1.1",
42
- "webpack": "^5.75.0",
43
- "webpack-cli": "^5.0.1",
44
- "webpack-dev-server": "4.11.1"
45
- },
46
- "jest": {
47
- "moduleNameMapper": {
48
- "\\.(jpg|jpeg|png|gif|eot|otf|webp|svg|ttf|woff|woff2|mp4|webm|wav|mp3|m4a|aac|oga)$": "<rootDir>/scripts/testMock.js",
49
- "\\.(css|less)$": "<rootDir>/scripts/testMock.js"
50
- },
51
- "moduleFileExtensions": [
52
- "web.js",
53
- "js",
54
- "web.ts",
55
- "ts",
56
- "web.tsx",
57
- "tsx",
58
- "json",
59
- "web.jsx",
60
- "jsx",
61
- "node"
62
- ]
63
- }
64
- }
1
+ {
2
+ "name": "polfan-server-js-client",
3
+ "version": "0.1.1",
4
+ "description": "JavaScript client library for handling communication with Polfan chat server.",
5
+ "author": "Jarosław Żak",
6
+ "license": "MIT",
7
+ "main": "build/index.js",
8
+ "types": "build/types/index.d.ts",
9
+ "scripts": {
10
+ "start": "webpack serve --config webpack.config.demo.js",
11
+ "build": "webpack && tsc",
12
+ "build:demo": "webpack --config webpack.config.demo.js",
13
+ "test": "jest --silent",
14
+ "coverage": "npm run test -- --coverage",
15
+ "prepare": "npm run build",
16
+ "trypublish": "npm publish || true"
17
+ },
18
+ "devDependencies": {
19
+ "@babel/cli": "^7.20.7",
20
+ "@babel/core": "^7.20.12",
21
+ "@babel/plugin-proposal-class-properties": "^7.16.0",
22
+ "@babel/plugin-transform-typescript": "^7.20.2",
23
+ "@babel/polyfill": "^7.12.1",
24
+ "@babel/preset-env": "^7.20.2",
25
+ "@types/jest": "^29.2.5",
26
+ "@typescript-eslint/eslint-plugin": "^4.33.0",
27
+ "@typescript-eslint/parser": "^4.33.0",
28
+ "babel-eslint": "^10.1.0",
29
+ "babel-loader": "^9.1.2",
30
+ "babel-preset-minify": "^0.5.2",
31
+ "css-loader": "^6.7.3",
32
+ "css-minimizer-webpack-plugin": "^4.2.2",
33
+ "eslint": "^7.32.0",
34
+ "file-loader": "^6.2.0",
35
+ "html-webpack-plugin": "^5.5.0",
36
+ "jest": "^29.3.1",
37
+ "mini-css-extract-plugin": "^2.7.2",
38
+ "style-loader": "^3.3.1",
39
+ "terser-webpack-plugin": "^5.3.5",
40
+ "typescript": "^4.9.4",
41
+ "url-loader": "^4.1.1",
42
+ "webpack": "^5.75.0",
43
+ "webpack-cli": "^5.0.1",
44
+ "webpack-dev-server": "4.11.1",
45
+ "pserv-ts-types": "^0.0.15"
46
+ },
47
+ "jest": {
48
+ "moduleNameMapper": {
49
+ "\\.(jpg|jpeg|png|gif|eot|otf|webp|svg|ttf|woff|woff2|mp4|webm|wav|mp3|m4a|aac|oga)$": "<rootDir>/scripts/testMock.js",
50
+ "\\.(css|less)$": "<rootDir>/scripts/testMock.js"
51
+ },
52
+ "moduleFileExtensions": [
53
+ "web.js",
54
+ "js",
55
+ "web.ts",
56
+ "ts",
57
+ "web.tsx",
58
+ "tsx",
59
+ "json",
60
+ "web.jsx",
61
+ "jsx",
62
+ "node"
63
+ ]
64
+ }
65
+ }
@@ -0,0 +1,174 @@
1
+ import {
2
+ Bye,
3
+ GetSession,
4
+ JoinSpace,
5
+ Ok,
6
+ Session,
7
+ SpaceJoined,
8
+ Error as ErrorType,
9
+ SpaceLeft,
10
+ SpaceMemberJoined,
11
+ SpaceMemberLeft,
12
+ SpaceMemberUpdate,
13
+ SpaceDeleted,
14
+ SpaceMembers,
15
+ SpaceRooms,
16
+ NewRole,
17
+ RoomDeleted,
18
+ RoomJoined,
19
+ RoomLeft,
20
+ RoomMemberLeft,
21
+ RoomMemberJoined,
22
+ RoomMembers,
23
+ NewRoom,
24
+ NewTopic,
25
+ TopicDeleted,
26
+ NewMessage,
27
+ GetUserPermissions,
28
+ SetUserPermissions,
29
+ GetComputedPermissions,
30
+ LeaveSpace,
31
+ CreateSpace,
32
+ DeleteSpace,
33
+ GetSpaceMembers,
34
+ GetSpaceRooms,
35
+ CreateRole,
36
+ DeleteRole,
37
+ AssignRole,
38
+ DeassignRole,
39
+ SetRolePermissions,
40
+ GetRolePermissions,
41
+ JoinRoom,
42
+ LeaveRoom,
43
+ CreateRoom,
44
+ DeleteRoom,
45
+ GetRoomMembers,
46
+ CreateTopic,
47
+ DeleteTopic,
48
+ CreateMessage, Envelope,
49
+ } from "pserv-ts-types";
50
+ import {EventTarget} from "./EventTarget";
51
+
52
+ type ArrayOfPromiseResolvers = [(value: any) => void, (reason?: any) => void];
53
+
54
+ export abstract class AbstractChatClient extends EventTarget {
55
+ protected awaitingResponse: Map<string, ArrayOfPromiseResolvers> = new Map<string, ArrayOfPromiseResolvers>();
56
+ protected sentCounter: number = 0;
57
+
58
+ public abstract send<CommandType extends keyof CommandsMap>
59
+ (commandType: CommandType, commandData: CommandsMap[CommandType][0]): Promise<CommandResult<CommandsMap[CommandType][1]>>;
60
+
61
+ public on<EventName extends keyof EventsMap>
62
+ (eventName: EventName | string, handler: (event: EventsMap[EventName]) => void): this {
63
+ return super.on(eventName, handler);
64
+ }
65
+
66
+ public once<EventName extends keyof EventsMap>
67
+ (eventName: EventName, handler: (event: EventsMap[EventName]) => void): this {
68
+ return super.once(eventName, handler);
69
+ }
70
+
71
+ protected createEnvelope<CommandT>(type: string, data: CommandT): Envelope<CommandT> {
72
+ return {
73
+ type, data, ref: (++this.sentCounter).toString()
74
+ };
75
+ }
76
+
77
+ protected createPromiseFromCommandEnvelope
78
+ <CommandT extends keyof CommandsMap>(envelope: Envelope<CommandsMap[CommandT][0]>):
79
+ Promise<CommandResult<CommandsMap[CommandT][1]>> {
80
+ return new Promise((...args) =>
81
+ this.awaitingResponse.set(envelope.ref as string, args));
82
+ }
83
+
84
+ protected handleIncomingEnvelope(envelope: Envelope): void {
85
+ if (!this.awaitingResponse.has(envelope.ref)) {
86
+ return;
87
+ }
88
+ const isError = envelope.type === 'Error';
89
+ this.awaitingResponse.get(envelope.ref)[0]({
90
+ data: isError ? null : envelope.data,
91
+ error: isError ? envelope.data : null,
92
+ } as CommandResult<any>);
93
+ this.awaitingResponse.delete(envelope.ref);
94
+ }
95
+
96
+ protected handleEnvelopeSendError(envelope: Envelope, error: any): void {
97
+ if (!this.awaitingResponse.has(envelope.ref)) {
98
+ return;
99
+ }
100
+ this.awaitingResponse.get(envelope.ref)[0](error);
101
+ this.awaitingResponse.delete(envelope.ref);
102
+ }
103
+ }
104
+
105
+ export type CommandResult<ResultT> = {data?: ResultT, error?: Error};
106
+
107
+ /**
108
+ * Map of incoming events.
109
+ */
110
+ export type EventsMap = {
111
+ // General Events
112
+ Bye: Bye,
113
+ Ok: Ok,
114
+ Error: ErrorType,
115
+ Session: Session,
116
+ Permissions: Permissions,
117
+ // Space events
118
+ SpaceJoined: SpaceJoined,
119
+ SpaceLeft: SpaceLeft,
120
+ SpaceMemberJoined: SpaceMemberJoined,
121
+ SpaceMemberLeft: SpaceMemberLeft,
122
+ SpaceMemberUpdate: SpaceMemberUpdate,
123
+ SpaceDeleted: SpaceDeleted,
124
+ SpaceMembers: SpaceMembers,
125
+ SpaceRooms: SpaceRooms,
126
+ NewRole: NewRole,
127
+ RoleDeleted: RoomDeleted,
128
+ // Room events
129
+ RoomJoined: RoomJoined,
130
+ RoomLeft: RoomLeft,
131
+ RoomMemberJoined: RoomMemberJoined,
132
+ RoomMemberLeft: RoomMemberLeft,
133
+ RoomMembers: RoomMembers,
134
+ NewRoom: NewRoom,
135
+ RoomDeleted: RoomDeleted,
136
+ // Topic events
137
+ NewTopic: NewTopic,
138
+ TopicDeleted: TopicDeleted,
139
+ NewMessage: NewMessage,
140
+ };
141
+
142
+ /**
143
+ * Map of commands and their corresponding events.
144
+ */
145
+ export type CommandsMap = {
146
+ // General commands
147
+ GetSession: [GetSession, EventsMap['Session']],
148
+ SetUserPermissions: [SetUserPermissions, EventsMap['Permissions']],
149
+ GetUserPermissions: [GetUserPermissions, EventsMap['Permissions']],
150
+ GetComputedPermissions: [GetComputedPermissions, EventsMap['Permissions']],
151
+ // Space commands
152
+ JoinSpace: [JoinSpace, EventsMap['SpaceJoined']],
153
+ LeaveSpace: [LeaveSpace, EventsMap['SpaceLeft']],
154
+ CreateSpace: [CreateSpace, EventsMap['SpaceJoined']],
155
+ DeleteSpace: [DeleteSpace, EventsMap['SpaceDeleted']],
156
+ GetSpaceMembers: [GetSpaceMembers, EventsMap['SpaceMembers']],
157
+ GetSpaceRooms: [GetSpaceRooms, EventsMap['SpaceRooms']],
158
+ CreateRole: [CreateRole, EventsMap['NewRole']],
159
+ DeleteRole: [DeleteRole, EventsMap['RoleDeleted']],
160
+ AssignRole: [AssignRole, EventsMap['SpaceMemberUpdate']],
161
+ DeassignRole: [DeassignRole, EventsMap['SpaceMemberUpdate']],
162
+ SetRolePermissions: [SetRolePermissions, EventsMap['Permissions']],
163
+ GetRolePermissions: [GetRolePermissions, EventsMap['Permissions']],
164
+ // Room commands
165
+ JoinRoom: [JoinRoom, EventsMap['RoomJoined']],
166
+ LeaveRoom: [LeaveRoom, EventsMap['RoomLeft']],
167
+ CreateRoom: [CreateRoom, EventsMap['NewRoom']],
168
+ DeleteRoom: [DeleteRoom, EventsMap['RoomDeleted']],
169
+ GetRoomMembers: [GetRoomMembers, EventsMap['RoomMembers']],
170
+ // Topic commands
171
+ CreateTopic: [CreateTopic, EventsMap['NewTopic']],
172
+ DeleteTopic: [DeleteTopic, EventsMap['TopicDeleted']],
173
+ CreateMessage: [CreateMessage, EventsMap['NewMessage']],
174
+ }
@@ -0,0 +1,66 @@
1
+ export interface RestClientOptions {
2
+ url?: string;
3
+ token: string;
4
+ }
5
+
6
+ export interface RestClientResponse<T> {
7
+ ok: boolean;
8
+ status: number;
9
+ data: T;
10
+ }
11
+
12
+ export type HttpMethod = 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE';
13
+
14
+ export abstract class AbstractRestClient {
15
+ protected abstract defaultUrl: string;
16
+
17
+ protected constructor(
18
+ private readonly options: RestClientOptions,
19
+ ) {}
20
+
21
+ protected async send<ResponseT = any>(
22
+ method: HttpMethod,
23
+ uri: string,
24
+ data: any = undefined
25
+ ): Promise<RestClientResponse<ResponseT>> {
26
+ const headers: any = {
27
+ 'Content-Type': 'application/json',
28
+ Accept: 'application/json'
29
+ };
30
+
31
+ if (this.options.token) {
32
+ headers.Authorization = `Bearer ${this.options.token}`;
33
+ }
34
+
35
+ let url = this.getUrl(uri);
36
+ let body = undefined;
37
+
38
+ if (data) {
39
+ if (['GET', 'DELETE'].includes(method)) {
40
+ url += new URLSearchParams(data).toString()
41
+ } else {
42
+ body = JSON.stringify(data);
43
+ }
44
+ }
45
+
46
+ const result = await fetch(url, {method, body, headers});
47
+
48
+ return {
49
+ ok: result.ok,
50
+ status: result.status,
51
+ data: await result.json(),
52
+ };
53
+ }
54
+
55
+ protected getUrl(uri: string): string {
56
+ return this.removeEndingSlash(this.options.url ?? this.defaultUrl) + '/' + this.removeStartingSlash(uri);
57
+ }
58
+
59
+ private removeStartingSlash(text: string): string {
60
+ return text.replace(/^\/+/, '');
61
+ }
62
+
63
+ private removeEndingSlash(text: string): string {
64
+ return text.replace(/\/+$/, '');
65
+ }
66
+ }
@@ -0,0 +1,46 @@
1
+ import {AbstractRestClient} from "./AbstractRestClient";
2
+
3
+ export interface TokenInterface {
4
+ token: string,
5
+ expiration: string
6
+ }
7
+
8
+ export interface MyAccountInterface {
9
+ id: string;
10
+ nick: string;
11
+ avatar: string;
12
+ }
13
+
14
+ export class AuthClient extends AbstractRestClient {
15
+ protected defaultUrl: string = 'https://polfan.pl/webservice';
16
+
17
+ public static async createToken(
18
+ login: string,
19
+ password: string,
20
+ clientName: string = 'pserv-js-client'
21
+ ): Promise<TokenInterface> {
22
+ const response = await new AuthClient({token: null}).send('POST', 'auth/tokens', {
23
+ login, password, client_name: clientName
24
+ });
25
+ if (response.ok) {
26
+ return response.data;
27
+ }
28
+ throw new Error(`Cannot create user token: ${response.data.errors[0]}`);
29
+ }
30
+
31
+ public async deleteToken(token: string): Promise<void> {
32
+ const response = await this.send('DELETE', `auth/tokens/${token}`);
33
+ if (!response.ok) {
34
+ throw new Error(`Cannot delete access token: ${response.data.errors[0]}`);
35
+ }
36
+ }
37
+
38
+ public async getMe(): Promise<MyAccountInterface> {
39
+ const response = await this.send('GET', 'auth/me');
40
+ if (response.ok) {
41
+ response.data.id = response.data.id.toString();
42
+ return response.data;
43
+ }
44
+ throw new Error(`Cannot get current user account: ${response.data.errors[0]}`);
45
+ }
46
+ }