@voicenter-team/events-sdk 0.0.12 → 0.0.14

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 (74) hide show
  1. package/.eslintrc.cjs +17 -0
  2. package/.github/workflows/main.yml +16 -0
  3. package/.idea/VoicenterEventsSDK.iml +12 -0
  4. package/.idea/git_toolbox_prj.xml +15 -0
  5. package/.idea/inspectionProfiles/Project_Default.xml +6 -0
  6. package/.idea/jsLibraryMappings.xml +6 -0
  7. package/.idea/jsLinters/eslint.xml +7 -0
  8. package/.idea/modules.xml +8 -0
  9. package/.idea/vcs.xml +6 -0
  10. package/.nvmrc +1 -0
  11. package/TODELETE_TEMP/events.json +69122 -0
  12. package/TODELETE_TEMP/temphelper.cjs +101 -0
  13. package/dist/index.d.ts +689 -11
  14. package/dist/voicenter-events-sdk.cjs.js +10 -10
  15. package/dist/voicenter-events-sdk.cjs.js.map +1 -1
  16. package/dist/voicenter-events-sdk.es.js +1856 -1818
  17. package/dist/voicenter-events-sdk.es.js.map +1 -1
  18. package/dist/voicenter-events-sdk.iife.js +17 -17
  19. package/dist/voicenter-events-sdk.iife.js.map +1 -1
  20. package/dist/voicenter-events-sdk.umd.js +16 -16
  21. package/dist/voicenter-events-sdk.umd.js.map +1 -1
  22. package/docs/package-lock.json +3820 -0
  23. package/docs/package.json +25 -0
  24. package/docs/src/.vuepress/client.js +8 -0
  25. package/docs/src/.vuepress/components/Demo.vue +191 -0
  26. package/docs/src/.vuepress/config.js +60 -0
  27. package/docs/src/.vuepress/public/favicon.ico +0 -0
  28. package/docs/src/.vuepress/public/images/logo.png +0 -0
  29. package/docs/src/.vuepress/styles/index.scss +0 -0
  30. package/docs/src/.vuepress/styles/index.styl +8 -0
  31. package/docs/src/.vuepress/styles/palette.styl +10 -0
  32. package/docs/src/demo.md +7 -0
  33. package/docs/src/index.md +4 -0
  34. package/interface.ts +261 -0
  35. package/jest.config.js +11 -0
  36. package/package.json +1 -4
  37. package/src/classes/auth/auth.class.ts +272 -0
  38. package/src/classes/auth/auth.urls.ts +8 -0
  39. package/src/classes/events-sdk/events-sdk-default-options.ts +60 -0
  40. package/src/classes/events-sdk/events-sdk.class.ts +250 -0
  41. package/src/classes/events-sdk/events-sdk.test.ts +9 -0
  42. package/src/classes/events-sdk/events-sdk.types.ts +71 -0
  43. package/src/classes/socket-io/socket-io.class.ts +172 -0
  44. package/src/classes/socket-io/versions/index.ts +52 -0
  45. package/src/classes/socket-io/versions/v1_3_7.js +2083 -0
  46. package/src/classes/storage/storage.class.ts +43 -0
  47. package/src/enum/auth.enum.ts +4 -0
  48. package/src/enum/events.enum.ts +98 -0
  49. package/src/index.ts +15 -0
  50. package/{dist → src}/types/auth.d.ts +12 -8
  51. package/{dist → src}/types/events.common.d.ts +1 -1
  52. package/{dist → src}/types/events.d.ts +1 -1
  53. package/{dist → src}/types/socket.d.ts +1 -1
  54. package/swagger/generated/Swagger.json +1 -0
  55. package/swagger/index.js +60 -0
  56. package/swagger/package.json +21 -0
  57. package/swagger/scripts/update-swagger-json.js +53 -0
  58. package/swagger/yarn.lock +2100 -0
  59. package/tsconfig.json +47 -0
  60. package/vite.config.ts +45 -0
  61. package/dist/classes/auth/auth.class.d.ts +0 -20
  62. package/dist/classes/auth/auth.urls.d.ts +0 -4
  63. package/dist/classes/events-sdk/events-sdk-default-options.d.ts +0 -2
  64. package/dist/classes/events-sdk/events-sdk.class.d.ts +0 -35
  65. package/dist/classes/events-sdk/events-sdk.test.d.ts +0 -1
  66. package/dist/classes/events-sdk/events-sdk.types.d.ts +0 -63
  67. package/dist/classes/socket-io/socket-io.class.d.ts +0 -23
  68. package/dist/classes/socket-io/versions/index.d.ts +0 -8
  69. package/dist/classes/storage/storage.class.d.ts +0 -6
  70. package/dist/enum/auth.enum.d.ts +0 -4
  71. package/dist/enum/events.enum.d.ts +0 -77
  72. /package/{dist → src}/classes/socket-io/socket-io.d.ts +0 -0
  73. /package/{dist → src}/types/listeners.d.ts +0 -0
  74. /package/{dist → src}/types/public-api.d.ts +0 -0
@@ -0,0 +1,272 @@
1
+ import md5 from 'js-md5'
2
+
3
+ import EventsSdkClass from '@/classes/events-sdk/events-sdk.class'
4
+ import { EventsSdkOptions, ServerParameter } from '@/classes/events-sdk/events-sdk.types'
5
+ import {
6
+ ExternalLoginNewStackResponseData,
7
+ ExternalLoginOldStackResponseData,
8
+ ExternalLoginResponse,
9
+ LoginSessionData,
10
+ LoginSessionPayload,
11
+ Settings
12
+ } from '@/types/auth'
13
+ import { LoginType } from '@/enum/auth.enum'
14
+ import { getSettingsUrl } from '@/classes/auth/auth.urls'
15
+ import { StorageClass } from '@/classes/storage/storage.class'
16
+
17
+ class AuthClass{
18
+ constructor (private readonly eventsSdkClass: EventsSdkClass) {
19
+ this.eventsSdkClass = eventsSdkClass
20
+
21
+ this.storageKey = ''
22
+ }
23
+
24
+ private delay = 1000
25
+ public lastLoginTimestamp: number | undefined
26
+ public token: string | undefined
27
+
28
+ private storageKey: string
29
+
30
+ public async login (options: EventsSdkOptions) {
31
+ const payload: LoginSessionPayload = {
32
+ token: options.token,
33
+ email: options.email,
34
+ password: options.password
35
+ }
36
+
37
+ this.storageKey = md5(JSON.stringify(payload))
38
+
39
+ if (this.lastLoginTimestamp && this.lastLoginTimestamp + this.delay > new Date().getTime()) {
40
+ return
41
+ }
42
+
43
+ this.updateLastLoginTimestamp()
44
+
45
+ const isLoggedIn = await this.checkLoginStatus(this.storageKey)
46
+
47
+ if (!isLoggedIn) {
48
+ await this.userLoginFunction(payload, this.storageKey, options.loginType)
49
+ }
50
+ }
51
+
52
+ public updateLastLoginTimestamp () {
53
+ this.lastLoginTimestamp = new Date().getTime()
54
+ }
55
+
56
+ private async checkLoginStatus (key: string): Promise<boolean> {
57
+ const loginSessionData = await StorageClass.getSessionStorageDataByKey(key)
58
+
59
+ if (loginSessionData) {
60
+ this.onLoginResponse(loginSessionData)
61
+
62
+ return true
63
+ }
64
+
65
+ return false
66
+ }
67
+
68
+ private async userLoginFunction (
69
+ payload: LoginSessionPayload,
70
+ key: string,
71
+ loginType: LoginType,
72
+ ) {
73
+ let externalLoginResponse
74
+
75
+ let settings
76
+
77
+ let loginSessionData: Partial<LoginSessionData>
78
+
79
+ if (this.eventsSdkClass.options.isNewStack) {
80
+ externalLoginResponse = await this.externalLogin<ExternalLoginNewStackResponseData>(
81
+ this.eventsSdkClass.options.loginUrl,
82
+ payload,
83
+ loginType,
84
+ )
85
+
86
+ settings = await this.getSettings(externalLoginResponse.Data.AccessToken)
87
+
88
+ loginSessionData = {
89
+ ...externalLoginResponse.Data,
90
+ ...settings
91
+ }
92
+ } else {
93
+ externalLoginResponse = await this.externalLogin<ExternalLoginOldStackResponseData>(
94
+ this.eventsSdkClass.options.loginUrl,
95
+ payload,
96
+ loginType,
97
+ )
98
+
99
+ loginSessionData = {
100
+ ...externalLoginResponse.Data.Socket,
101
+ }
102
+ }
103
+
104
+ this.onLoginResponse(loginSessionData)
105
+
106
+ await StorageClass.updateSessionStorageKey(key, loginSessionData)
107
+ }
108
+
109
+ private onLoginResponse (loginSessionData: Partial<LoginSessionData>) {
110
+ if (loginSessionData.MonitorList && loginSessionData.MonitorList.length) {
111
+ this.eventsSdkClass.servers = [ ...loginSessionData.MonitorList ]
112
+ this.eventsSdkClass.server = this.eventsSdkClass.servers.reduce((prev, current) =>
113
+ (prev.Priority > current.Priority) ? prev : current
114
+ )
115
+ }
116
+ if (!this.eventsSdkClass.options.isNewStack && this.eventsSdkClass.options.servers) {
117
+ this.eventsSdkClass.servers = [ ...this.eventsSdkClass.options.servers ]
118
+ this.eventsSdkClass.server = this.eventsSdkClass.servers.reduce((prev, current) =>
119
+ (prev.Priority > current.Priority) ? prev : current
120
+ )
121
+ }
122
+ if (this.eventsSdkClass.server) {
123
+ this.eventsSdkClass.socketIoClass.getSocketIoFunction(`v=${this.eventsSdkClass.server.Version}`)
124
+ }
125
+ if (loginSessionData.IdentityCode) {
126
+ this.token = loginSessionData.IdentityCode
127
+ this.eventsSdkClass.connect(ServerParameter.DEFAULT, true)
128
+ }
129
+ if (loginSessionData.Token) {
130
+ this.token = loginSessionData.Token
131
+ this.eventsSdkClass.connect(ServerParameter.DEFAULT, true)
132
+ }
133
+ if (loginSessionData.RefreshToken && loginSessionData.IdentityCodeExpiry && this.eventsSdkClass.options.loginType === LoginType.USER) {
134
+ this.eventsSdkClass.options.refreshToken = loginSessionData.RefreshToken
135
+ this.eventsSdkClass.options.tokenExpiry = loginSessionData.IdentityCodeExpiry
136
+ this.handleTokenExpiry()
137
+ }
138
+ if (loginSessionData.RefreshToken && loginSessionData.TokenExpiry) {
139
+ this.eventsSdkClass.options.refreshToken = loginSessionData.RefreshToken
140
+ this.eventsSdkClass.options.tokenExpiry = loginSessionData.TokenExpiry
141
+ this.handleTokenExpiry()
142
+ }
143
+ }
144
+
145
+ public handleTokenExpiry () {
146
+ let date: Date
147
+
148
+ if (this.eventsSdkClass.options.tokenExpiry) {
149
+ date = new Date(this.eventsSdkClass.options.tokenExpiry)
150
+ } else {
151
+ return
152
+ }
153
+
154
+ const timeout = date.getTime() - new Date().getTime() - 5000 // 5 seconds before expire
155
+
156
+ const maxAllowedTimeout = Math.min(timeout, 0x7FFFFFFF)
157
+
158
+ setTimeout(
159
+ async () => {
160
+ if (this.eventsSdkClass.options.refreshToken) {
161
+ this.eventsSdkClass.socketIoClass.closeAllConnections()
162
+
163
+ let settings
164
+
165
+ let loginSessionData: Partial<LoginSessionData>
166
+
167
+ if (this.eventsSdkClass.options.isNewStack) {
168
+ const refreshTokenResponse = await this.refreshToken<ExternalLoginNewStackResponseData>(
169
+ this.eventsSdkClass.options.refreshTokenUrl,
170
+ this.eventsSdkClass.options.refreshToken
171
+ )
172
+
173
+ settings = await this.getSettings(refreshTokenResponse.Data.AccessToken)
174
+
175
+ loginSessionData = {
176
+ ...refreshTokenResponse.Data,
177
+ ...settings
178
+ }
179
+ } else {
180
+ const refreshTokenResponse = await this.refreshToken<ExternalLoginOldStackResponseData>(
181
+ this.eventsSdkClass.options.refreshTokenUrl,
182
+ this.eventsSdkClass.options.refreshToken
183
+ )
184
+
185
+ loginSessionData = {
186
+ ...refreshTokenResponse.Data.Socket,
187
+ }
188
+ }
189
+
190
+ this.onLoginResponse(loginSessionData)
191
+
192
+ await StorageClass.updateSessionStorageKey(this.storageKey, loginSessionData)
193
+ }
194
+ },
195
+ maxAllowedTimeout)
196
+ }
197
+
198
+ private async externalLogin<T> (
199
+ url: string,
200
+ { password, token, email }: LoginSessionPayload,
201
+ loginType: LoginType,
202
+ ): Promise<ExternalLoginResponse<T>> {
203
+ let body: string
204
+
205
+ if (this.eventsSdkClass.options.isNewStack) {
206
+ if (loginType === LoginType.TOKEN) {
207
+ body = JSON.stringify({
208
+ identityType: LoginType.TOKEN,
209
+ token
210
+ })
211
+ } else {
212
+ body = JSON.stringify({
213
+ identityType: LoginType.USER,
214
+ username: email,
215
+ password,
216
+ })
217
+ }
218
+ } else {
219
+ if (token) {
220
+ body = JSON.stringify({ token })
221
+
222
+ url = `${url}/Token`
223
+ } else {
224
+ body = JSON.stringify({
225
+ email,
226
+ pin: password
227
+ })
228
+
229
+ url = `${url}/User`
230
+ }
231
+ }
232
+
233
+ const res = await fetch(url, {
234
+ method: 'POST',
235
+ headers: {
236
+ 'Content-Type': 'application/json'
237
+ },
238
+ body,
239
+ })
240
+
241
+ const data = await res.json()
242
+
243
+ if (data.error) {
244
+ throw new Error(data.error)
245
+ }
246
+ return data
247
+ }
248
+
249
+ private async getSettings (token: string): Promise<Settings> {
250
+ const res = await fetch(getSettingsUrl, {
251
+ headers: {
252
+ Authorization: `Bearer ${token}`
253
+ }
254
+ })
255
+
256
+ return res.json()
257
+ }
258
+
259
+ private async refreshToken<T> (refreshTokenUrl: string, oldRefreshToken: string): Promise<ExternalLoginResponse<T>> {
260
+ const res = await fetch(refreshTokenUrl, {
261
+ method: 'GET',
262
+
263
+ headers: {
264
+ 'Content-Type': 'application/json',
265
+ Authorization: `Bearer ${oldRefreshToken}`
266
+ }
267
+ })
268
+ return res.json()
269
+ }
270
+ }
271
+
272
+ export default AuthClass
@@ -0,0 +1,8 @@
1
+ const getSettingsUrl = 'https://loginapidev.voicenter.co.il/Application/GetSettings'
2
+ const refreshTokenUrl = 'https://loginapidev.voicenter.co.il/Auth/RefreshToken'
3
+
4
+
5
+ export {
6
+ getSettingsUrl,
7
+ refreshTokenUrl
8
+ }
@@ -0,0 +1,60 @@
1
+ import { EventsSdkOptions } from '@/classes/events-sdk/events-sdk.types'
2
+ import { LoginType } from '@/enum/auth.enum'
3
+
4
+ export const eventsSdkDefaultOptions: EventsSdkOptions = {
5
+ isNewStack: false,
6
+ servers: [ {
7
+ URLID: 1,
8
+ Priority: 5,
9
+ Version: '1.3.7',
10
+ Domain: 'monitor1.comms24x7.com'
11
+ },{
12
+ URLID: 2,
13
+ Priority: 4,
14
+ Version: '1.3.7',
15
+ Domain: 'monitor2.comms24x7.com'
16
+ } ],
17
+ loginUrl: 'https://loginapi.comms24x7.com/monitorAPI/Login',
18
+ refreshTokenUrl: 'https://loginapi.comms24x7.com/monitorAPI/RefreshIdentityToken',
19
+ fallbackServer: {
20
+ Domain: 'monitor5.voicenter.co.il',
21
+ Priority: 0,
22
+ Version: '1.3.7',
23
+ URLID: 1
24
+ },
25
+ token: '',
26
+ loginType: LoginType.TOKEN,
27
+ forceNew: true,
28
+ reconnectionDelay: 10000,
29
+ reconnectionDelayMax: 10000,
30
+ maxReconnectAttempts: 5,
31
+ timeout: 10000,
32
+ keepAliveTimeout: 60000,
33
+ idleInterval: 60000 * 5,
34
+ protocol: 'https',
35
+ transports: [ 'websocket' ],
36
+ upgrade: false,
37
+ serverFetchStrategy: 'static',
38
+ serverType: 0,
39
+ useLogger: false,
40
+ loggerSocketConnection: '',
41
+ loggerServer: 'http://127.0.0.1:3000/',
42
+ loggerConfig: {
43
+ logToConsole: true,
44
+ overloadGlobalConsole: false,
45
+ namespace: 'events-sdk',
46
+ socketEmitInterval: 10000,
47
+ },
48
+ loggerConnectOptions: {
49
+ reconnection: true,
50
+ reconnectionDelay: 5000,
51
+ reconnectionAttempts: 10,
52
+ perMessageDeflate: false,
53
+ upgrade: false,
54
+ transports: [ 'websocket' ],
55
+ debug: false
56
+ },
57
+ username: 'username',
58
+ password: '92455783085',
59
+ email: 'sasha.za@starkey.co.il',
60
+ }
@@ -0,0 +1,250 @@
1
+ import AuthClass from '@/classes/auth/auth.class'
2
+ import { debounce } from 'lodash'
3
+ import { eventsSdkDefaultOptions } from '@/classes/events-sdk/events-sdk-default-options'
4
+ import { SocketIoClass } from '@/classes/socket-io/socket-io.class'
5
+ import { EventsSdkOptions, ReconnectOptions, Server, ServerParameter } from '@/classes/events-sdk/events-sdk.types'
6
+ import { SocketTyped } from '@/types/socket'
7
+ import {
8
+ GenericEventWrapper,
9
+ EventSpecificCallback,
10
+ EventCallbackListenersMap,
11
+ EventTypeData,
12
+ EventTypeNames,
13
+ } from '@/types/events'
14
+ import { EventsEnum } from '@/enum/events.enum'
15
+
16
+ class EventsSdkClass{
17
+ constructor (options: EventsSdkOptions) {
18
+ this.options = {
19
+ ...eventsSdkDefaultOptions,
20
+ ...options
21
+ }
22
+
23
+ this.server = this.options.fallbackServer
24
+
25
+ this.argumentOptions = {
26
+ ...options
27
+ }
28
+ }
29
+
30
+ private argumentOptions: EventsSdkOptions
31
+ public readonly options: EventsSdkOptions = {
32
+ ...eventsSdkDefaultOptions
33
+ }
34
+ public servers: Server[] = []
35
+ public server: Server
36
+ public socket: SocketTyped | undefined
37
+
38
+ public authClass = new AuthClass(this)
39
+ public socketIoClass = new SocketIoClass(this)
40
+
41
+ public reconnectOptions: ReconnectOptions = {
42
+ retryCount: 1,
43
+ maxReconnectAttempts: this.options.maxReconnectAttempts,
44
+ reconnectionDelay: this.options.reconnectionDelay, // 10 seconds. After each re-connection attempt this number will increase (minReconnectionDelay * attempts) => 10, 20, 30, 40 seconds ... up to 5min
45
+ minReconnectionDelay: this.options.reconnectionDelay, // 10 seconds
46
+ maxReconnectionDelay: 60000 * 5 // 5 minutes
47
+ }
48
+
49
+ public retryConnection = debounce(this.connect.bind(this), this.reconnectOptions.reconnectionDelay, {
50
+ leading: true,
51
+ trailing: false
52
+ })
53
+
54
+ private listeners: EventCallbackListenersMap = {
55
+ [EventsEnum.ALL_EXTENSION_STATUS]: [],
56
+ [EventsEnum.ALL_DIALER_STATUS]: [],
57
+ [EventsEnum.ALL_USERS_STATUS]: [],
58
+ [EventsEnum.QUEUE_EVENT]: [],
59
+ [EventsEnum.EXTENSION_EVENT]: [],
60
+ [EventsEnum.DIALER_EVENT]: [],
61
+ [EventsEnum.LOGIN_SUCCESS]: [],
62
+ [EventsEnum.LOGIN_STATUS]: [],
63
+ [EventsEnum.KEEP_ALIVE_RESPONSE]: [],
64
+ [EventsEnum.ONLINE_STATUS_EVENT]: []
65
+ }
66
+ private allListeners: Array<(data: GenericEventWrapper) => void> = []
67
+
68
+ public on<T extends EventTypeNames> (event: T, callback: EventSpecificCallback<T>): void
69
+ public on (event: '*', callback: (data: GenericEventWrapper) => void): void
70
+ public on (event: unknown, callback: unknown) {
71
+ if (event === '*') {
72
+ this.allListeners.push(callback as (data: GenericEventWrapper) => void)
73
+ } else {
74
+ // Handle specific event type with strong typing
75
+ this.listeners[event as EventTypeNames].push(callback as EventSpecificCallback<EventTypeNames>)
76
+ }
77
+ }
78
+
79
+ public off<T extends EventTypeNames> (event: T, callback: EventSpecificCallback<T>): void
80
+ public off (event: '*', callback: (data: GenericEventWrapper) => void): void
81
+ public off (event: unknown, callback: unknown) {
82
+ if (event === '*') {
83
+ this.allListeners = this.allListeners.filter(item => item !== callback)
84
+ } else {
85
+ const data = this.listeners[event as EventTypeNames] as Array<EventSpecificCallback<EventTypeNames>>
86
+ const filtered = data.filter(item => item !== callback)
87
+
88
+ this.listeners = {
89
+ ...this.listeners,
90
+ [event as EventTypeNames]: filtered
91
+ }
92
+ }
93
+ }
94
+
95
+ public emit <T extends EventTypeNames> (event: T, data: EventTypeData<T>) {
96
+ this.socketIoClass.lastEventTimestamp = new Date().getTime()
97
+
98
+ this.listeners[event].forEach(callback => callback({
99
+ name: event,
100
+ data
101
+ }))
102
+
103
+ const allEventData: GenericEventWrapper = {
104
+ name: event,
105
+ data: data as any
106
+ }
107
+
108
+ this.allListeners.forEach((callback) => callback(allEventData))
109
+ }
110
+
111
+ public connect (server: ServerParameter = ServerParameter.DEFAULT, skipLogin = false) {
112
+ let serverToConnect: Server | undefined
113
+
114
+ if (server === ServerParameter.DEFAULT) {
115
+ serverToConnect = this.findCurrentServer()
116
+ }
117
+
118
+ if (server === ServerParameter.NEXT) {
119
+ serverToConnect = this.findNextAvailableServer()
120
+ }
121
+
122
+ if (server === ServerParameter.PREVIOUS) {
123
+ serverToConnect = this.findMaxPriorityServer()
124
+ }
125
+
126
+ if (!serverToConnect) {
127
+ this.server = this.findCurrentServer()
128
+ }
129
+
130
+ this.socketIoClass.doReconnect = true
131
+
132
+ this.socketIoClass.initSocketConnection()
133
+
134
+ this.socketIoClass.initSocketEvents()
135
+
136
+ this.socketIoClass.initKeepAlive()
137
+
138
+ // TODO: check if it is needed here
139
+ if (skipLogin) {
140
+ return
141
+ }
142
+ }
143
+
144
+ public disconnect () {
145
+ this.socketIoClass.doReconnect = false
146
+ this.socketIoClass.closeAllConnections()
147
+ }
148
+
149
+ public clearKeepAliveInterval () {
150
+ this.socketIoClass.clearKeepAliveInterval()
151
+ }
152
+
153
+ private findCurrentServer (): Server {
154
+ if (this.servers.length) {
155
+ this.server = this.servers[0]
156
+ }
157
+ if (!this.server) {
158
+ this.server = this.options.fallbackServer
159
+ }
160
+ return this.server
161
+ }
162
+
163
+ private findNextAvailableServer (): Server {
164
+ // this.log(INFO, 'Failover -> Trying to find another server');
165
+
166
+ const currentServerPriority = this.server.Priority
167
+
168
+ const nextServerPriority = currentServerPriority + 1
169
+
170
+ const nextServer = this.servers.find(server => server.Priority === nextServerPriority) || this.findMinPriorityServer()
171
+
172
+ this.server = { ...nextServer }
173
+
174
+ // this.log(INFO, 'Failover -> Found new server. Connecting to it...', this.server);
175
+
176
+ return this.server
177
+ }
178
+
179
+ private findMaxPriorityServer (): Server {
180
+ // this.log(INFO, 'Fallback -> Trying to find previous server');
181
+
182
+ const maxPriorityServer = this.getServerWithHighestPriority(this.servers)
183
+
184
+ if (!this.server) {
185
+ this.server = maxPriorityServer
186
+
187
+ return this.server
188
+ }
189
+
190
+ if (this.server && maxPriorityServer.Domain !== this.server.Domain) {
191
+ this.server = maxPriorityServer
192
+
193
+ // this.log(INFO, 'Fallback -> Trying to find previous server');
194
+
195
+ return this.server
196
+ }
197
+
198
+ return this.server
199
+ }
200
+
201
+ private findMinPriorityServer (): Server {
202
+ const minPriority = Math.min(...this.servers.map(server => server.Priority))
203
+
204
+ const server = this.servers.find(server => server.Priority === minPriority)
205
+
206
+ if (server) {
207
+ this.server = server
208
+
209
+ return this.server
210
+ }
211
+
212
+ return this.server
213
+ }
214
+
215
+ public getServerWithHighestPriority (servers: Server[]): Server {
216
+ let chosenServer: Server | undefined
217
+
218
+ let maxPriority = Number.MAX_SAFE_INTEGER
219
+
220
+ chosenServer = servers.find(server => {
221
+ if (server.Priority < maxPriority) {
222
+ maxPriority = server.Priority
223
+
224
+ chosenServer = server
225
+ }
226
+ })
227
+
228
+ return chosenServer ? chosenServer : this.server
229
+ }
230
+
231
+ public async init () {
232
+ if (this.socket) {
233
+ // this.emit(eventTypes.CLOSE);
234
+ }
235
+
236
+ await this.authClass.login(this.options)
237
+
238
+ this.getServers()
239
+
240
+ return true
241
+ }
242
+
243
+ private getServers () {
244
+ if (this.options.serverFetchStrategy === 'static' && this.argumentOptions.servers && Array.isArray(this.argumentOptions.servers) && this.argumentOptions.servers.length > 1) {
245
+ this.servers = this.argumentOptions.servers
246
+ }
247
+ }
248
+ }
249
+
250
+ export default EventsSdkClass
@@ -0,0 +1,9 @@
1
+ import EventsSdkClass from '@/classes/events-sdk/events-sdk.class'
2
+ import { eventsSdkDefaultOptions } from '@/classes/events-sdk/events-sdk-default-options'
3
+
4
+ describe('EventsSdkClass', () => {
5
+ it('should be true', () => {
6
+ const eventsSdkClass = new EventsSdkClass(eventsSdkDefaultOptions)
7
+ expect(eventsSdkClass.init()).toBe(true)
8
+ })
9
+ })
@@ -0,0 +1,71 @@
1
+ import { LoginType } from '@/enum/auth.enum'
2
+
3
+ export interface EventsSdkOptions {
4
+ isNewStack?: boolean,
5
+ servers: Server[],
6
+ loginUrl: string,
7
+ fallbackServer: Server,
8
+ refreshTokenUrl: string,
9
+ refreshToken?: string,
10
+ token: string,
11
+ tokenExpiry?: Date,
12
+ loginType: LoginType,
13
+ forceNew?: boolean,
14
+ reconnectionDelay: number,
15
+ reconnectionDelayMax?: number,
16
+ maxReconnectAttempts: number,
17
+ timeout?: number,
18
+ keepAliveTimeout: number,
19
+ idleInterval?: number,
20
+ protocol: string,
21
+ transports?: string[],
22
+ upgrade?: boolean,
23
+ serverFetchStrategy?: string,
24
+ serverType?: number,
25
+ useLogger?: boolean,
26
+ loggerSocketConnection?: string,
27
+ loggerServer?: string,
28
+ loggerConfig?: LoggerConfig,
29
+ loggerConnectOptions?: LoggerConnectOptions,
30
+ email: string,
31
+ password: string,
32
+ username: string,
33
+ }
34
+
35
+ export interface Server {
36
+ Priority: number,
37
+ Domain: string,
38
+ URLID: number,
39
+ Version: string,
40
+ }
41
+
42
+ export interface LoggerConfig {
43
+ logToConsole?: boolean,
44
+ overloadGlobalConsole?: boolean,
45
+ namespace?: string,
46
+ socketEmitInterval?: number
47
+ }
48
+
49
+ export interface LoggerConnectOptions {
50
+ reconnection?: boolean,
51
+ reconnectionDelay?: number,
52
+ reconnectionAttempts?: number,
53
+ perMessageDeflate?: boolean,
54
+ upgrade?: boolean,
55
+ transports?: string[],
56
+ debug?: boolean
57
+ }
58
+
59
+ export interface ReconnectOptions {
60
+ retryCount: number,
61
+ maxReconnectAttempts: number,
62
+ reconnectionDelay: number,
63
+ minReconnectionDelay: number,
64
+ maxReconnectionDelay: number
65
+ }
66
+
67
+ export enum ServerParameter {
68
+ DEFAULT = 'default',
69
+ NEXT = 'next',
70
+ PREVIOUS = 'previous'
71
+ }