@botpress/webchat-client 0.4.0 → 0.6.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.
@@ -1,147 +1,148 @@
1
- import { createUser as x, generateUserKey as y, sendPerfMetrics as k, removeMessageFeedback as F, addMessageFeedback as T, getEvent as R, createEvent as w, deleteUser as I, updateUser as K, getUser as O, createFile as S, deleteMessage as _, getMessage as q, updateMessage as N, createMessage as z, listParticipants as A, getParticipant as J, removeParticipant as j, addParticipant as D, listConversationMessages as L, listConversations as V, deleteConversation as X, getConversation as Y, createConversation as B } from "./webchat-client3.js";
1
+ import { createUser as k, generateUserKey as b, sendPerfMetrics as F, removeMessageFeedback as S, addMessageFeedback as T, getEvent as R, createEvent as w, deleteUser as I, updateUser as K, getUser as _, createFile as q, deleteMessage as N, getMessage as z, updateMessage as A, createMessage as J, listParticipants as j, getParticipant as D, removeParticipant as V, addParticipant as X, listConversationMessages as Y, listConversations as B, deleteConversation as G, getConversation as H, createConversation as O } from "./webchat-client3.js";
2
2
  import { client as l } from "./webchat-client4.js";
3
- import { EventSource as G } from "./webchat-client5.js";
4
- import { throwErrorInterceptor as b } from "./webchat-client6.js";
5
- import { createEventEmitter as C } from "./webchat-client7.js";
6
- const n = (a) => a.data, $ = 10, M = 3e3, H = "60000", v = {
3
+ import { EventSource as Q } from "./webchat-client5.js";
4
+ import { throwErrorInterceptor as C } from "./webchat-client6.js";
5
+ import { createEventEmitter as $ } from "./webchat-client7.js";
6
+ const r = (a) => a.data, M = 10, P = 3e3, W = "60000", v = {
7
7
  throwOnError: !0
8
- }, se = async ({
8
+ }, ne = async ({
9
9
  clientId: a,
10
10
  apiUrl: c,
11
- adminSecret: i,
11
+ adminSecret: d,
12
12
  customHeaders: o,
13
- ...s
13
+ ...h
14
14
  }) => {
15
- const d = `${c || l.getConfig().baseUrl}/${a}`;
16
- l.interceptors.response._fns.length === 0 && l.interceptors.response.use(b);
17
- const t = {
15
+ const t = `${c || l.getConfig().baseUrl}/${a}`;
16
+ l.interceptors.response._fns.length === 0 && l.interceptors.response.use(C);
17
+ const i = {
18
18
  ...v,
19
- baseUrl: d
20
- }, h = {
21
- ...i ? { "x-admin-secret": i } : {},
19
+ baseUrl: t
20
+ }, s = {
21
+ ...d ? { "x-admin-secret": d } : {},
22
22
  ...o
23
23
  };
24
- return x({
25
- ...t,
26
- headers: Object.keys(h).length > 0 ? h : void 0,
27
- body: s
28
- }).then(n);
29
- }, ne = ({
24
+ return k({
25
+ ...i,
26
+ headers: Object.keys(s).length > 0 ? s : void 0,
27
+ body: h
28
+ }).then(r);
29
+ }, ae = ({
30
30
  conversationId: a,
31
31
  userToken: c,
32
- clientId: i,
32
+ clientId: d,
33
33
  apiUrl: o,
34
- adminSecret: s
34
+ adminSecret: h
35
35
  }) => {
36
- let d = 0, t = null;
37
- const h = C(), e = () => {
38
- t && t.close();
39
- const g = `${`${o || l.getConfig().baseUrl}/${i}`}/initialize${a ? `?conversationId=${a}` : ""}`, p = {
40
- ...s ? { "x-admin-secret": s } : {},
36
+ let t = 0, i = null;
37
+ const s = $(), m = () => {
38
+ i && i.close();
39
+ const n = `${`${o || l.getConfig().baseUrl}/${d}`}/initialize${a ? `?conversationId=${a}` : ""}`, g = {
40
+ ...h ? { "x-admin-secret": h } : {},
41
41
  ...c ? { "x-user-key": c } : {}
42
42
  };
43
- t = P(g, p), t.onopen = () => h.emit("open"), t.onerror = (u) => {
44
- d < $ ? (d++, setTimeout(() => e(), M)) : h.emit("error", u);
45
- }, t.onmessage = (u) => {
46
- const m = E(u.data);
47
- h.emit(m.type, m.data);
48
- };
43
+ i = L(n, g), i.addEventListener("open", () => s.emit("open")), i.addEventListener("error", (p) => {
44
+ t < M ? (t++, setTimeout(() => m(), P)) : s.emit("error", p);
45
+ }), i.addEventListener("message", (p) => {
46
+ const u = x(p.data);
47
+ s.emit(u.type, u.data);
48
+ });
49
49
  };
50
- return e(), h.on;
51
- }, re = async ({
50
+ return m(), s.on;
51
+ }, oe = async ({
52
52
  adminSecret: a,
53
53
  expiresAt: c,
54
- userId: i,
54
+ userId: d,
55
55
  apiUrl: o,
56
- clientId: s
56
+ clientId: h
57
57
  }) => {
58
- const d = { "x-admin-secret": a }, t = `${o || l.getConfig().baseUrl}/${s}`, h = {
58
+ const t = { "x-admin-secret": a }, i = `${o || l.getConfig().baseUrl}/${h}`, s = {
59
59
  ...v,
60
- baseUrl: t
60
+ baseUrl: i
61
61
  };
62
- return y({ ...h, headers: d, body: { id: i, expiresAt: c } }).then(n);
63
- }, ae = async (a, c, i, o) => {
64
- const s = `${i || l.getConfig().baseUrl}/${a}`, d = {
62
+ return b({ ...s, headers: t, body: { id: d, expiresAt: c } }).then(r);
63
+ }, ie = async (a, c, d, o) => {
64
+ const h = `${d || l.getConfig().baseUrl}/${a}`, t = {
65
65
  ...v,
66
- baseUrl: s
66
+ baseUrl: h
67
67
  };
68
- return k({ ...d, body: c, headers: o }).then(n);
69
- }, oe = ({
68
+ return F({ ...t, body: c, headers: o }).then(r);
69
+ }, ce = ({
70
70
  userKey: a,
71
71
  clientId: c,
72
- apiUrl: i,
73
- customHeaders: o
72
+ apiUrl: d,
73
+ customHeaders: o,
74
+ advancedOptions: h
74
75
  }) => {
75
- const s = {
76
+ const t = {
76
77
  "x-user-key": a,
77
78
  ...o
78
- }, d = `${i || l.getConfig().baseUrl}/${c}`, t = {
79
+ }, i = `${d || l.getConfig().baseUrl}/${c}`, s = {
79
80
  ...v,
80
- baseUrl: d
81
+ baseUrl: i
81
82
  };
82
- return l.interceptors.response._fns.length === 0 && l.interceptors.response.use(b), {
83
- createConversation: () => B({ ...t, headers: s, body: {} }).then(n),
84
- getConversation: ({ conversationId: e }) => Y({ ...t, headers: s, path: { id: e } }).then(n),
85
- deleteConversation: ({ conversationId: e }) => X({ ...t, headers: s, path: { id: e } }).then(n),
86
- listConversations: ({ nextToken: e }) => V({ ...t, headers: s, query: { nextToken: e } }).then(n),
87
- listConversationMessages: ({ conversationId: e, nextToken: r }) => L({
88
- ...t,
89
- headers: s,
83
+ return l.interceptors.response._fns.length === 0 && l.interceptors.response.use(C), {
84
+ createConversation: () => O({ ...s, headers: t, body: {} }).then(r),
85
+ getConversation: ({ conversationId: e }) => H({ ...s, headers: t, path: { id: e } }).then(r),
86
+ deleteConversation: ({ conversationId: e }) => G({ ...s, headers: t, path: { id: e } }).then(r),
87
+ listConversations: ({ nextToken: e }) => B({ ...s, headers: t, query: { nextToken: e } }).then(r),
88
+ listConversationMessages: ({ conversationId: e, nextToken: n }) => Y({
89
+ ...s,
90
+ headers: t,
90
91
  path: { id: e },
91
- query: { nextToken: r }
92
- }).then(n),
93
- addParticipant: ({ conversationId: e, userId: r }) => D({ ...t, headers: s, path: { id: e }, body: { userId: r } }).then(n),
94
- removeParticipant: ({ conversationId: e, userId: r }) => j({ ...t, headers: s, path: { id: e, userId: r } }).then(n),
95
- getParticipant: ({ conversationId: e, userId: r }) => J({ ...t, headers: s, path: { id: e, userId: r } }).then(n),
96
- listParticipants: ({ conversationId: e, nextToken: r }) => A({ ...t, headers: s, path: { id: e }, query: { nextToken: r } }).then(n),
97
- createMessage: (e) => z({ ...t, headers: s, body: e }).then(n),
98
- updateMessage: ({ messageId: e, ...r }) => N({ ...t, headers: s, path: { id: e }, body: r }).then(n),
99
- getMessage: ({ messageId: e }) => q({ ...t, headers: s, path: { id: e } }).then(n),
100
- deleteMessage: ({ messageId: e }) => _({ ...t, headers: s, path: { id: e } }).then(n),
101
- createFile: (e) => S({ ...t, headers: s, body: e }).then(n),
102
- getUser: () => O({ ...t, headers: s }).then(n),
103
- updateUser: (e) => K({ ...t, headers: s, body: e }).then(n),
104
- deleteUser: () => I({ ...t, headers: s }).then(n),
105
- createEvent: (e) => w({ ...t, headers: s, body: e }).then(n),
106
- getEvent: ({ eventId: e }) => R({ ...t, headers: s, path: { id: e } }).then(n),
107
- addMessageFeedback: ({ messageId: e, ...r }) => T({ ...t, headers: s, path: { id: e }, body: r }).then(n),
108
- removeMessageFeedback: ({ messageId: e }) => F({ ...t, headers: s, path: { id: e } }).then(n),
109
- generateUserKey: ({ adminSecret: e, ...r }) => y({ ...t, headers: { "x-admin-secret": e }, body: r }).then(n),
92
+ query: { nextToken: n }
93
+ }).then(r),
94
+ addParticipant: ({ conversationId: e, userId: n }) => X({ ...s, headers: t, path: { id: e }, body: { userId: n } }).then(r),
95
+ removeParticipant: ({ conversationId: e, userId: n }) => V({ ...s, headers: t, path: { id: e, userId: n } }).then(r),
96
+ getParticipant: ({ conversationId: e, userId: n }) => D({ ...s, headers: t, path: { id: e, userId: n } }).then(r),
97
+ listParticipants: ({ conversationId: e, nextToken: n }) => j({ ...s, headers: t, path: { id: e }, query: { nextToken: n } }).then(r),
98
+ createMessage: (e) => J({ ...s, headers: t, body: e }).then(r),
99
+ updateMessage: ({ messageId: e, ...n }) => A({ ...s, headers: t, path: { id: e }, body: n }).then(r),
100
+ getMessage: ({ messageId: e }) => z({ ...s, headers: t, path: { id: e } }).then(r),
101
+ deleteMessage: ({ messageId: e }) => N({ ...s, headers: t, path: { id: e } }).then(r),
102
+ createFile: (e) => q({ ...s, headers: t, body: e }).then(r),
103
+ getUser: () => _({ ...s, headers: t }).then(r),
104
+ updateUser: (e) => K({ ...s, headers: t, body: e }).then(r),
105
+ deleteUser: () => I({ ...s, headers: t }).then(r),
106
+ createEvent: (e) => w({ ...s, headers: t, body: e }).then(r),
107
+ getEvent: ({ eventId: e }) => R({ ...s, headers: t, path: { id: e } }).then(r),
108
+ addMessageFeedback: ({ messageId: e, ...n }) => T({ ...s, headers: t, path: { id: e }, body: n }).then(r),
109
+ removeMessageFeedback: ({ messageId: e }) => S({ ...s, headers: t, path: { id: e } }).then(r),
110
+ generateUserKey: ({ adminSecret: e, ...n }) => b({ ...s, headers: { "x-admin-secret": e }, body: n }).then(r),
110
111
  listenConversation: ({ conversationId: e }) => {
111
- let r = 0, g = null;
112
- const p = C(), u = () => {
112
+ let n = 0, g = null;
113
+ const p = $(), u = () => {
113
114
  g && g.close();
114
- const m = `${d}/conversations/${e}/listen`;
115
- g = P(m, s), g.onopen = () => p.emit("open"), g.onerror = (f) => {
116
- r < $ ? (r++, setTimeout(() => u(), M)) : p.emit("error", f);
117
- }, g.onmessage = (f) => {
118
- const U = E(f.data);
119
- p.emit(U.type, U.data);
120
- };
115
+ const U = `${i}/conversations/${e}/listen`, E = h == null ? void 0 : h.eventSource;
116
+ g = E ? E({ url: U, headers: t }) : L(U, t), g.addEventListener("open", () => p.emit("open")), g.addEventListener("error", (f) => {
117
+ n < M ? (n++, setTimeout(() => u(), P)) : p.emit("error", f);
118
+ }), g.addEventListener("message", (f) => {
119
+ const y = x(f.data);
120
+ p.emit(y.type, y.data);
121
+ });
121
122
  };
122
123
  return u(), p.on;
123
124
  }
124
125
  };
125
- }, E = (a) => {
126
+ }, x = (a) => {
126
127
  try {
127
128
  return JSON.parse(a);
128
129
  } catch {
129
130
  return a;
130
131
  }
131
- }, P = (a, c) => new G(a, {
132
- fetch: (i, o) => fetch(i, {
132
+ }, L = (a, c) => new Q(a, {
133
+ fetch: (d, o) => fetch(d, {
133
134
  ...o,
134
135
  headers: {
135
136
  ...o == null ? void 0 : o.headers,
136
137
  ...c,
137
- timeout: H
138
+ timeout: W
138
139
  }
139
140
  })
140
141
  });
141
142
  export {
142
- oe as createClient,
143
- se as createUser,
144
- re as generateUserKey,
145
- ne as initialize,
146
- ae as sendPerfMetrics
143
+ ce as createClient,
144
+ ne as createUser,
145
+ oe as generateUserKey,
146
+ ae as initialize,
147
+ ie as sendPerfMetrics
147
148
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@botpress/webchat-client",
3
- "version": "0.4.0",
3
+ "version": "0.6.0",
4
4
  "description": "",
5
5
  "main": "src/index.ts",
6
6
  "type": "module",
@@ -30,7 +30,7 @@
30
30
  "eventsource": "^3.0.6"
31
31
  },
32
32
  "devDependencies": {
33
- "@bpinternal/webchat-http-client": "0.8.0",
33
+ "@bpinternal/webchat-http-client": "0.10.0",
34
34
  "@hey-api/client-fetch": "^0.10.0",
35
35
  "@hey-api/openapi-ts": "^0.66.4",
36
36
  "@repo/eslint-config": "workspace:*",
@@ -40,6 +40,6 @@
40
40
  "glob": "^11.0.1",
41
41
  "rollup-plugin-tree-shakeable": "^1.0.3",
42
42
  "vite": "^5.4.8",
43
- "vite-plugin-dts": "^3.5.4"
43
+ "vite-plugin-dts": "^4.5.4"
44
44
  }
45
45
  }
@@ -6,6 +6,11 @@ import type { Signal } from './types/signals'
6
6
  import { throwErrorInterceptor } from './interceptor'
7
7
  import { createEventEmitter, EventEmitter } from './emitter'
8
8
 
9
+ interface EventSourceLike {
10
+ close(): void
11
+ addEventListener(event: string, handler: (event: any) => void): void
12
+ }
13
+
9
14
  type ConversationIdParam = {
10
15
  conversationId: string
11
16
  }
@@ -65,7 +70,7 @@ export type Client = {
65
70
  deleteMessage: (params: MessageIdParam) => Promise<ClientTypes.DeleteMessageResponse>
66
71
  createFile: (params: ClientTypes.CreateFileBody) => Promise<ClientTypes.CreateFileResponse>
67
72
  getUser: () => Promise<ClientTypes.GetUserResponse>
68
- updateUser: (params: ClientTypes.CreateUserBody) => Promise<ClientTypes.UpdateUserResponse>
73
+ updateUser: (params: ClientTypes.UpdateUserBody) => Promise<ClientTypes.UpdateUserResponse>
69
74
  deleteUser: (params: UserIdParam) => Promise<ClientTypes.DeleteUserResponse>
70
75
  createEvent: (params: ClientTypes.CreateEventBody) => Promise<ClientTypes.CreateEventResponse>
71
76
  getEvent: (params: EventIdParam) => Promise<ClientTypes.GetEventResponse>
@@ -135,7 +140,7 @@ export const initialize = ({
135
140
  adminSecret?: string
136
141
  }) => {
137
142
  let retryCount = 0
138
- let eventSource: EventSource | null = null
143
+ let eventSource: EventSourceLike | null = null
139
144
  const eventEmitter = createEventEmitter<EventMap>()
140
145
 
141
146
  const connect = () => {
@@ -153,19 +158,19 @@ export const initialize = ({
153
158
 
154
159
  eventSource = createNewEventSource(url, headers)
155
160
 
156
- eventSource.onopen = () => eventEmitter.emit('open')
157
- eventSource.onerror = (err) => {
161
+ eventSource.addEventListener('open', () => eventEmitter.emit('open'))
162
+ eventSource.addEventListener('error', (err) => {
158
163
  if (retryCount < MAX_RETRIES) {
159
164
  retryCount++
160
165
  setTimeout(() => connect(), RETRY_INTERVAL)
161
166
  } else {
162
167
  eventEmitter.emit('error', err)
163
168
  }
164
- }
165
- eventSource.onmessage = (ev) => {
169
+ })
170
+ eventSource.addEventListener('message', (ev) => {
166
171
  const event = safeJsonParse(ev.data) as Signal
167
172
  eventEmitter.emit(event.type, event.data)
168
- }
173
+ })
169
174
  }
170
175
  connect()
171
176
  return eventEmitter.on
@@ -213,11 +218,15 @@ export const createClient = ({
213
218
  clientId,
214
219
  apiUrl,
215
220
  customHeaders,
221
+ advancedOptions,
216
222
  }: {
217
223
  userKey: string
218
224
  clientId: string
219
225
  apiUrl?: string
220
226
  customHeaders?: Record<string, string>
227
+ advancedOptions?: {
228
+ eventSource?: (params: { url: string; headers: Record<string, string> }) => EventSourceLike
229
+ }
221
230
  }): Client => {
222
231
  const headers = {
223
232
  'x-user-key': userKey,
@@ -282,7 +291,7 @@ export const createClient = ({
282
291
  sdk.generateUserKey({ ...configs, headers: { 'x-admin-secret': adminSecret }, body }).then(extractData),
283
292
  listenConversation: ({ conversationId }) => {
284
293
  let retryCount = 0
285
- let eventSource: EventSource | null = null
294
+ let eventSource: EventSourceLike | null = null
286
295
  const eventEmitter = createEventEmitter<EventMap>()
287
296
 
288
297
  const connect = () => {
@@ -292,21 +301,22 @@ export const createClient = ({
292
301
 
293
302
  const url = `${baseUrl}/conversations/${conversationId}/listen`
294
303
 
295
- eventSource = createNewEventSource(url, headers)
304
+ const providedEventSource = advancedOptions?.eventSource
305
+ eventSource = providedEventSource ? providedEventSource({ url, headers }) : createNewEventSource(url, headers)
296
306
 
297
- eventSource.onopen = () => eventEmitter.emit('open')
298
- eventSource.onerror = (err) => {
307
+ eventSource.addEventListener('open', () => eventEmitter.emit('open'))
308
+ eventSource.addEventListener('error', (err) => {
299
309
  if (retryCount < MAX_RETRIES) {
300
310
  retryCount++
301
311
  setTimeout(() => connect(), RETRY_INTERVAL)
302
312
  } else {
303
313
  eventEmitter.emit('error', err)
304
314
  }
305
- }
306
- eventSource.onmessage = (ev) => {
315
+ })
316
+ eventSource.addEventListener('message', (ev) => {
307
317
  const event = safeJsonParse(ev.data) as Signal
308
318
  eventEmitter.emit(event.type, event.data)
309
- }
319
+ })
310
320
  }
311
321
  connect()
312
322
  return eventEmitter.on
@@ -324,7 +334,7 @@ const safeJsonParse = (data: any) => {
324
334
  }
325
335
  }
326
336
 
327
- const createNewEventSource = (url: string, headers: Record<string, string>) => {
337
+ const createNewEventSource = (url: string, headers: Record<string, string>): EventSourceLike => {
328
338
  return new EventSource(url, {
329
339
  fetch: (input, init) =>
330
340
  fetch(input, {