@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.
- package/.eslintrc.cjs +17 -0
- package/.github/workflows/main.yml +16 -0
- package/.idea/VoicenterEventsSDK.iml +12 -0
- package/.idea/git_toolbox_prj.xml +15 -0
- package/.idea/inspectionProfiles/Project_Default.xml +6 -0
- package/.idea/jsLibraryMappings.xml +6 -0
- package/.idea/jsLinters/eslint.xml +7 -0
- package/.idea/modules.xml +8 -0
- package/.idea/vcs.xml +6 -0
- package/.nvmrc +1 -0
- package/TODELETE_TEMP/events.json +69122 -0
- package/TODELETE_TEMP/temphelper.cjs +101 -0
- package/dist/index.d.ts +689 -11
- package/dist/voicenter-events-sdk.cjs.js +10 -10
- package/dist/voicenter-events-sdk.cjs.js.map +1 -1
- package/dist/voicenter-events-sdk.es.js +1856 -1818
- package/dist/voicenter-events-sdk.es.js.map +1 -1
- package/dist/voicenter-events-sdk.iife.js +17 -17
- package/dist/voicenter-events-sdk.iife.js.map +1 -1
- package/dist/voicenter-events-sdk.umd.js +16 -16
- package/dist/voicenter-events-sdk.umd.js.map +1 -1
- package/docs/package-lock.json +3820 -0
- package/docs/package.json +25 -0
- package/docs/src/.vuepress/client.js +8 -0
- package/docs/src/.vuepress/components/Demo.vue +191 -0
- package/docs/src/.vuepress/config.js +60 -0
- package/docs/src/.vuepress/public/favicon.ico +0 -0
- package/docs/src/.vuepress/public/images/logo.png +0 -0
- package/docs/src/.vuepress/styles/index.scss +0 -0
- package/docs/src/.vuepress/styles/index.styl +8 -0
- package/docs/src/.vuepress/styles/palette.styl +10 -0
- package/docs/src/demo.md +7 -0
- package/docs/src/index.md +4 -0
- package/interface.ts +261 -0
- package/jest.config.js +11 -0
- package/package.json +1 -4
- package/src/classes/auth/auth.class.ts +272 -0
- package/src/classes/auth/auth.urls.ts +8 -0
- package/src/classes/events-sdk/events-sdk-default-options.ts +60 -0
- package/src/classes/events-sdk/events-sdk.class.ts +250 -0
- package/src/classes/events-sdk/events-sdk.test.ts +9 -0
- package/src/classes/events-sdk/events-sdk.types.ts +71 -0
- package/src/classes/socket-io/socket-io.class.ts +172 -0
- package/src/classes/socket-io/versions/index.ts +52 -0
- package/src/classes/socket-io/versions/v1_3_7.js +2083 -0
- package/src/classes/storage/storage.class.ts +43 -0
- package/src/enum/auth.enum.ts +4 -0
- package/src/enum/events.enum.ts +98 -0
- package/src/index.ts +15 -0
- package/{dist → src}/types/auth.d.ts +12 -8
- package/{dist → src}/types/events.common.d.ts +1 -1
- package/{dist → src}/types/events.d.ts +1 -1
- package/{dist → src}/types/socket.d.ts +1 -1
- package/swagger/generated/Swagger.json +1 -0
- package/swagger/index.js +60 -0
- package/swagger/package.json +21 -0
- package/swagger/scripts/update-swagger-json.js +53 -0
- package/swagger/yarn.lock +2100 -0
- package/tsconfig.json +47 -0
- package/vite.config.ts +45 -0
- package/dist/classes/auth/auth.class.d.ts +0 -20
- package/dist/classes/auth/auth.urls.d.ts +0 -4
- package/dist/classes/events-sdk/events-sdk-default-options.d.ts +0 -2
- package/dist/classes/events-sdk/events-sdk.class.d.ts +0 -35
- package/dist/classes/events-sdk/events-sdk.test.d.ts +0 -1
- package/dist/classes/events-sdk/events-sdk.types.d.ts +0 -63
- package/dist/classes/socket-io/socket-io.class.d.ts +0 -23
- package/dist/classes/socket-io/versions/index.d.ts +0 -8
- package/dist/classes/storage/storage.class.d.ts +0 -6
- package/dist/enum/auth.enum.d.ts +0 -4
- package/dist/enum/events.enum.d.ts +0 -77
- /package/{dist → src}/classes/socket-io/socket-io.d.ts +0 -0
- /package/{dist → src}/types/listeners.d.ts +0 -0
- /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,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
|
+
}
|