@botpress/webchat-client 0.3.0 → 0.4.0

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.
@@ -39,6 +39,10 @@ type Event =
39
39
  data: any
40
40
  }
41
41
 
42
+ type EventMap = {
43
+ [E in Event as E['type']]: E['data']
44
+ }
45
+
42
46
  const MAX_RETRIES = 10
43
47
  const RETRY_INTERVAL = 3000 // ms
44
48
  const TIMEOUT = '60000' // ms
@@ -60,13 +64,12 @@ export type Client = {
60
64
  getMessage: (params: MessageIdParam) => Promise<ClientTypes.GetMessageResponse>
61
65
  deleteMessage: (params: MessageIdParam) => Promise<ClientTypes.DeleteMessageResponse>
62
66
  createFile: (params: ClientTypes.CreateFileBody) => Promise<ClientTypes.CreateFileResponse>
63
- createUser: (params: ClientTypes.CreateUserBody) => Promise<ClientTypes.CreateUserResponse>
64
67
  getUser: () => Promise<ClientTypes.GetUserResponse>
65
68
  updateUser: (params: ClientTypes.CreateUserBody) => Promise<ClientTypes.UpdateUserResponse>
66
69
  deleteUser: (params: UserIdParam) => Promise<ClientTypes.DeleteUserResponse>
67
70
  createEvent: (params: ClientTypes.CreateEventBody) => Promise<ClientTypes.CreateEventResponse>
68
71
  getEvent: (params: EventIdParam) => Promise<ClientTypes.GetEventResponse>
69
- listenConversation: (params: ConversationIdParam) => EventEmitter<Record<Event['type'], Event['data']>>['on']
72
+ listenConversation: (params: ConversationIdParam) => EventEmitter<EventMap>['on']
70
73
  addMessageFeedback: (
71
74
  params: MessageIdParam & ClientTypes.AddMessageFeedbackBody
72
75
  ) => Promise<ClientTypes.AddMessageFeedbackResponse>
@@ -84,11 +87,14 @@ export const createUser = async ({
84
87
  clientId,
85
88
  apiUrl,
86
89
  adminSecret,
90
+ customHeaders,
91
+ ...body
87
92
  }: {
88
93
  clientId: string
89
94
  apiUrl?: string
90
95
  adminSecret?: string
91
- }) => {
96
+ customHeaders?: Record<string, string>
97
+ } & ClientTypes.CreateUserBody) => {
92
98
  const baseUrl = `${apiUrl || baseClient.getConfig().baseUrl}/${clientId}`
93
99
 
94
100
  // @ts-expect-error - this is a private property
@@ -101,11 +107,16 @@ export const createUser = async ({
101
107
  baseUrl,
102
108
  }
103
109
 
110
+ const headers = {
111
+ ...(adminSecret ? { 'x-admin-secret': adminSecret } : {}),
112
+ ...customHeaders,
113
+ }
114
+
104
115
  return sdk
105
116
  .createUser({
106
117
  ...configs,
107
- body: {},
108
- headers: adminSecret ? { 'x-admin-secret': adminSecret } : undefined,
118
+ headers: Object.keys(headers).length > 0 ? headers : undefined,
119
+ body,
109
120
  })
110
121
  .then(extractData)
111
122
  }
@@ -115,15 +126,17 @@ export const initialize = ({
115
126
  userToken,
116
127
  clientId,
117
128
  apiUrl,
129
+ adminSecret,
118
130
  }: {
119
131
  conversationId?: string
120
132
  userToken?: string
121
133
  apiUrl?: string
122
134
  clientId: string
135
+ adminSecret?: string
123
136
  }) => {
124
137
  let retryCount = 0
125
138
  let eventSource: EventSource | null = null
126
- const eventEmitter = createEventEmitter<Record<Event['type'], Event['data']>>()
139
+ const eventEmitter = createEventEmitter<EventMap>()
127
140
 
128
141
  const connect = () => {
129
142
  if (eventSource) {
@@ -133,7 +146,12 @@ export const initialize = ({
133
146
  const baseUrl = `${apiUrl || baseClient.getConfig().baseUrl}/${clientId}`
134
147
  const url = `${baseUrl}/initialize${conversationId ? `?conversationId=${conversationId}` : ''}`
135
148
 
136
- eventSource = createNewEventSource(url, userToken ? { 'x-user-token': userToken } : {})
149
+ const headers = {
150
+ ...(adminSecret ? { 'x-admin-secret': adminSecret } : {}),
151
+ ...(userToken ? { 'x-user-key': userToken } : {}),
152
+ }
153
+
154
+ eventSource = createNewEventSource(url, headers)
137
155
 
138
156
  eventSource.onopen = () => eventEmitter.emit('open')
139
157
  eventSource.onerror = (err) => {
@@ -176,17 +194,34 @@ export const generateUserKey = async ({
176
194
  return sdk.generateUserKey({ ...configs, headers, body: { id: userId, expiresAt } }).then(extractData)
177
195
  }
178
196
 
197
+ export const sendPerfMetrics = async (
198
+ clientId: string,
199
+ body: ClientTypes.SendPerfMetricsBody,
200
+ apiUrl?: string,
201
+ customHeaders?: Record<string, string>
202
+ ) => {
203
+ const baseUrl = `${apiUrl || baseClient.getConfig().baseUrl}/${clientId}`
204
+ const configs = {
205
+ ...baseConfigs,
206
+ baseUrl,
207
+ }
208
+ return sdk.sendPerfMetrics({ ...configs, body, headers: customHeaders }).then(extractData)
209
+ }
210
+
179
211
  export const createClient = ({
180
212
  userKey,
181
213
  clientId,
182
214
  apiUrl,
215
+ customHeaders,
183
216
  }: {
184
217
  userKey: string
185
218
  clientId: string
186
219
  apiUrl?: string
220
+ customHeaders?: Record<string, string>
187
221
  }): Client => {
188
222
  const headers = {
189
223
  'x-user-key': userKey,
224
+ ...customHeaders,
190
225
  }
191
226
 
192
227
  const baseUrl = `${apiUrl || baseClient.getConfig().baseUrl}/${clientId}`
@@ -234,7 +269,6 @@ export const createClient = ({
234
269
  deleteMessage: ({ messageId }) =>
235
270
  sdk.deleteMessage({ ...configs, headers, path: { id: messageId } }).then(extractData),
236
271
  createFile: (body) => sdk.createFile({ ...configs, headers, body }).then(extractData),
237
- createUser: (body) => sdk.createUser({ ...configs, headers, body }).then(extractData),
238
272
  getUser: () => sdk.getUser({ ...configs, headers }).then(extractData),
239
273
  updateUser: (body) => sdk.updateUser({ ...configs, headers, body }).then(extractData),
240
274
  deleteUser: () => sdk.deleteUser({ ...configs, headers }).then(extractData),
@@ -249,7 +283,7 @@ export const createClient = ({
249
283
  listenConversation: ({ conversationId }) => {
250
284
  let retryCount = 0
251
285
  let eventSource: EventSource | null = null
252
- const eventEmitter = createEventEmitter<Record<Event['type'], Event['data']>>()
286
+ const eventEmitter = createEventEmitter<EventMap>()
253
287
 
254
288
  const connect = () => {
255
289
  if (eventSource) {
@@ -12,7 +12,7 @@ export type Initialize = {
12
12
  messages: ListConversationMessagesResponse['messages']
13
13
  participants: ListParticipantsResponse['participants']
14
14
  user: GetUserResponse['user'] & {
15
- userKey?: string
15
+ userKey: string
16
16
  }
17
17
  }
18
18
  }
package/src/index.ts CHANGED
@@ -2,6 +2,7 @@ export {
2
2
  createClient,
3
3
  createUser,
4
4
  generateUserKey,
5
+ sendPerfMetrics,
5
6
  initialize,
6
7
  type Client,
7
8
  type UserCredentials,
package/.eslintrc.cjs DELETED
@@ -1,11 +0,0 @@
1
- /** @type {import("eslint").Linter.Config} */
2
- module.exports = {
3
- root: true,
4
- extends: ["@repo/eslint-config/react-internal.js"],
5
- parser: "@typescript-eslint/parser",
6
- ignorePatterns: ["dist", "node_modules", "storybook-static", ".turbo", "turbo/*"],
7
- parserOptions: {
8
- project: "./tsconfig.json",
9
- tsconfigRootDir: __dirname,
10
- },
11
- };