@cstar.help/js 0.11.0 → 0.12.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.
- package/README.md +58 -6
- package/dist/auth/index.cjs +10 -10
- package/dist/auth/index.d.cts +4 -4
- package/dist/auth/index.d.ts +4 -4
- package/dist/auth/index.js +10 -10
- package/dist/chat/index.cjs +243 -10
- package/dist/chat/index.d.cts +188 -6
- package/dist/chat/index.d.ts +188 -6
- package/dist/chat/index.js +237 -9
- package/dist/quickhelp/index.cjs +102 -0
- package/dist/quickhelp/index.d.cts +97 -0
- package/dist/quickhelp/index.d.ts +97 -0
- package/dist/quickhelp/index.js +76 -0
- package/package.json +11 -1
- package/dist/index.d.cts +0 -2732
- package/dist/index.d.ts +0 -2732
- package/dist/webhook/index.d.cts +0 -163
- package/dist/webhook/index.d.ts +0 -163
package/dist/chat/index.d.cts
CHANGED
|
@@ -12,6 +12,39 @@ interface ChatConfig {
|
|
|
12
12
|
/** Polling interval in ms when realtime is disabled or unavailable (defaults to 3000). */
|
|
13
13
|
pollingInterval?: number;
|
|
14
14
|
}
|
|
15
|
+
/**
|
|
16
|
+
* Which auth path the client used to identify the customer. Set
|
|
17
|
+
* automatically from the `X-Cstar-Auth-Mode` response header on the first
|
|
18
|
+
* authenticated response — consumers don't declare it. Useful for runtime
|
|
19
|
+
* branching in apps that wrap multiple ChatClient instances.
|
|
20
|
+
*/
|
|
21
|
+
type ChatAuthMode = 'hmac' | 'session';
|
|
22
|
+
/**
|
|
23
|
+
* Parameters for `loginWithSession()` — for integrators that already have
|
|
24
|
+
* a Supabase access token from their own login flow.
|
|
25
|
+
*/
|
|
26
|
+
interface LoginWithSessionParams {
|
|
27
|
+
/** Supabase access token (JWT). Used as Bearer for every subsequent call. */
|
|
28
|
+
accessToken: string;
|
|
29
|
+
/** Optional: the team UUID. If omitted, derived server-side from the token. */
|
|
30
|
+
teamId?: string;
|
|
31
|
+
/** Optional: a hint for the customer name (UI only — server stays authoritative). */
|
|
32
|
+
customerName?: string;
|
|
33
|
+
}
|
|
34
|
+
/** Parameters for `loginWithCredentials()` — email/password sign-in. */
|
|
35
|
+
interface LoginWithCredentialsParams {
|
|
36
|
+
email: string;
|
|
37
|
+
password: string;
|
|
38
|
+
}
|
|
39
|
+
/** Result of a credentials login. The client retains the access token internally. */
|
|
40
|
+
interface LoginWithCredentialsResult {
|
|
41
|
+
customer: {
|
|
42
|
+
id: string;
|
|
43
|
+
email: string;
|
|
44
|
+
name: string | null;
|
|
45
|
+
};
|
|
46
|
+
teamId: string;
|
|
47
|
+
}
|
|
15
48
|
/** Parameters for identifying a customer via HMAC signature verification. */
|
|
16
49
|
interface IdentifyParams {
|
|
17
50
|
/** Customer ID from your system. */
|
|
@@ -188,23 +221,125 @@ interface CommunityFollowResult {
|
|
|
188
221
|
following: boolean;
|
|
189
222
|
}
|
|
190
223
|
|
|
224
|
+
/**
|
|
225
|
+
* Typed error classes for the cStar widget chat client.
|
|
226
|
+
*
|
|
227
|
+
* Every error thrown by `ChatClient.fetch()` is one of these subclasses,
|
|
228
|
+
* carrying an HTTP status code, a server-supplied error code, and a
|
|
229
|
+
* `requestId` (from the `X-Request-Id` response header) that customer
|
|
230
|
+
* support can match against server-side logs.
|
|
231
|
+
*
|
|
232
|
+
* Consumer code can branch on instanceof checks instead of string-matching
|
|
233
|
+
* error messages, which is a brittle pattern that breaks the moment the
|
|
234
|
+
* server tweaks its message text:
|
|
235
|
+
*
|
|
236
|
+
* ```typescript
|
|
237
|
+
* try {
|
|
238
|
+
* await chat.identify(customer, signature);
|
|
239
|
+
* } catch (err) {
|
|
240
|
+
* if (err instanceof ChatClientAuthError) {
|
|
241
|
+
* // bad signature, expired token, etc.
|
|
242
|
+
* } else if (err instanceof ChatClientRateLimitError) {
|
|
243
|
+
* // back off and retry after err.retryAfter
|
|
244
|
+
* }
|
|
245
|
+
* }
|
|
246
|
+
* ```
|
|
247
|
+
*/
|
|
248
|
+
/** Base class. Thrown by `ChatClient.fetch()` for any non-2xx response. */
|
|
249
|
+
declare class ChatClientError extends Error {
|
|
250
|
+
readonly code: string;
|
|
251
|
+
readonly statusCode: number;
|
|
252
|
+
readonly requestId: string | null;
|
|
253
|
+
constructor(message: string, opts: {
|
|
254
|
+
code?: string;
|
|
255
|
+
statusCode: number;
|
|
256
|
+
requestId?: string | null;
|
|
257
|
+
});
|
|
258
|
+
}
|
|
259
|
+
/** 401 / 403 — auth failed (bad/expired token, wrong team, etc.). */
|
|
260
|
+
declare class ChatClientAuthError extends ChatClientError {
|
|
261
|
+
constructor(opts: {
|
|
262
|
+
message: string;
|
|
263
|
+
code?: string;
|
|
264
|
+
statusCode: number;
|
|
265
|
+
requestId?: string | null;
|
|
266
|
+
});
|
|
267
|
+
}
|
|
268
|
+
/** 429 — too many requests. Inspect `retryAfter` (seconds) before retrying. */
|
|
269
|
+
declare class ChatClientRateLimitError extends ChatClientError {
|
|
270
|
+
readonly retryAfter: number | null;
|
|
271
|
+
constructor(opts: {
|
|
272
|
+
message: string;
|
|
273
|
+
code?: string;
|
|
274
|
+
statusCode: number;
|
|
275
|
+
requestId?: string | null;
|
|
276
|
+
retryAfter?: number | null;
|
|
277
|
+
});
|
|
278
|
+
}
|
|
279
|
+
/** 5xx — the cStar server hit an internal error. Usually transient. */
|
|
280
|
+
declare class ChatClientServerError extends ChatClientError {
|
|
281
|
+
constructor(opts: {
|
|
282
|
+
message: string;
|
|
283
|
+
code?: string;
|
|
284
|
+
statusCode: number;
|
|
285
|
+
requestId?: string | null;
|
|
286
|
+
});
|
|
287
|
+
}
|
|
288
|
+
/**
|
|
289
|
+
* `fetch()` itself failed before a response was received — DNS, TLS,
|
|
290
|
+
* abort, offline, CORS misconfiguration, etc. No statusCode or requestId
|
|
291
|
+
* because the request didn't reach the server. The original cause is
|
|
292
|
+
* preserved on `originalError`.
|
|
293
|
+
*/
|
|
294
|
+
declare class ChatClientNetworkError extends ChatClientError {
|
|
295
|
+
readonly originalError: unknown;
|
|
296
|
+
constructor(opts: {
|
|
297
|
+
message: string;
|
|
298
|
+
originalError: unknown;
|
|
299
|
+
});
|
|
300
|
+
}
|
|
301
|
+
|
|
191
302
|
/**
|
|
192
303
|
* Customer-facing chat client for the cStar widget API.
|
|
193
304
|
*
|
|
194
|
-
*
|
|
195
|
-
*
|
|
196
|
-
*
|
|
197
|
-
*
|
|
305
|
+
* Supports two auth paths:
|
|
306
|
+
*
|
|
307
|
+
* 1. **HMAC** — `identify(customer, signature)` if you sign customer
|
|
308
|
+
* claims with your team's HMAC secret ("Bring Your Own Auth").
|
|
309
|
+
* 2. **Session** — `loginWithCredentials({ email, password })` or
|
|
310
|
+
* `loginWithSession({ accessToken })` if you use cStar's hosted
|
|
311
|
+
* Supabase auth (or already have a Supabase session from your app).
|
|
312
|
+
*
|
|
313
|
+
* The auth mode is detected automatically from the `X-Cstar-Auth-Mode`
|
|
314
|
+
* response header on the first authenticated call — consumers don't
|
|
315
|
+
* declare it. Real-time messages and typing indicators work in both
|
|
316
|
+
* modes; the SDK opens the right channel based on which login path was
|
|
317
|
+
* used.
|
|
318
|
+
*
|
|
319
|
+
* Real-time is enabled by default and falls back to polling. No extra
|
|
320
|
+
* configuration is required — everything the SDK needs is fetched from
|
|
321
|
+
* the cStar API.
|
|
198
322
|
*
|
|
199
323
|
* ```typescript
|
|
324
|
+
* // HMAC mode
|
|
200
325
|
* const chat = new ChatClient({ teamSlug: 'acme' });
|
|
201
326
|
* await chat.identify(
|
|
202
327
|
* { externalId: 'usr_123', email: 'jane@co.com', name: 'Jane', timestamp: Date.now() / 1000 },
|
|
203
328
|
* 'hmac_signature_hex'
|
|
204
329
|
* );
|
|
330
|
+
*
|
|
331
|
+
* // Session mode (hosted auth)
|
|
332
|
+
* const chat = new ChatClient({ teamSlug: 'acme' });
|
|
333
|
+
* await chat.loginWithCredentials({ email: 'jane@co.com', password: 'hunter2' });
|
|
334
|
+
*
|
|
205
335
|
* chat.onMessage('tkt_abc', (msg) => console.log(msg));
|
|
206
336
|
* chat.onTyping('tkt_abc', ({ agent_name }) => console.log(agent_name, 'is typing'));
|
|
207
337
|
* ```
|
|
338
|
+
*
|
|
339
|
+
* Errors thrown by `fetch()` (and by the public methods that wrap it)
|
|
340
|
+
* are typed: see `ChatClientAuthError`, `ChatClientRateLimitError`,
|
|
341
|
+
* `ChatClientServerError`, `ChatClientNetworkError`. Each carries
|
|
342
|
+
* `requestId` for correlating with server-side logs.
|
|
208
343
|
*/
|
|
209
344
|
declare class ChatClient {
|
|
210
345
|
private readonly baseUrl;
|
|
@@ -214,6 +349,7 @@ declare class ChatClient {
|
|
|
214
349
|
private sessionToken;
|
|
215
350
|
private teamId;
|
|
216
351
|
private customerId;
|
|
352
|
+
private authMode;
|
|
217
353
|
private pollingTimers;
|
|
218
354
|
private realtimeManager;
|
|
219
355
|
private presenceManager;
|
|
@@ -238,6 +374,31 @@ declare class ChatClient {
|
|
|
238
374
|
* @param testMode - Whether to use test mode (relaxed timestamp validation)
|
|
239
375
|
*/
|
|
240
376
|
identify(customer: IdentifyParams, signature: string, testMode?: boolean): Promise<IdentifyResult>;
|
|
377
|
+
/**
|
|
378
|
+
* Sign in with cStar's hosted password auth. The SDK keeps the resulting
|
|
379
|
+
* Supabase access token and uses it as Bearer for every subsequent call.
|
|
380
|
+
* Real-time bootstraps automatically (same flow as `identify()`).
|
|
381
|
+
*
|
|
382
|
+
* Use this when your customers don't have a session in your app and you
|
|
383
|
+
* want cStar to handle login. For the case where your app already has a
|
|
384
|
+
* Supabase session, use `loginWithSession({ accessToken })` instead.
|
|
385
|
+
*/
|
|
386
|
+
loginWithCredentials(params: LoginWithCredentialsParams): Promise<LoginWithCredentialsResult>;
|
|
387
|
+
/**
|
|
388
|
+
* Use an existing Supabase access token for widget calls. Skip the cStar
|
|
389
|
+
* login flow entirely; the SDK uses the supplied token as Bearer and
|
|
390
|
+
* bootstraps real-time the same way `identify()` does.
|
|
391
|
+
*
|
|
392
|
+
* The widget API verifies the token via the `widget-session` strategy on
|
|
393
|
+
* every request — there is no client-side validation here.
|
|
394
|
+
*/
|
|
395
|
+
loginWithSession(params: LoginWithSessionParams): Promise<void>;
|
|
396
|
+
/**
|
|
397
|
+
* Returns the auth mode the client is currently using, or `null` before
|
|
398
|
+
* any authenticated call has resolved one. Useful for branching UI
|
|
399
|
+
* (e.g. to show a "Sign out" button only in session mode).
|
|
400
|
+
*/
|
|
401
|
+
getAuthMode(): ChatAuthMode | null;
|
|
241
402
|
/**
|
|
242
403
|
* Subscribe to new messages on a ticket.
|
|
243
404
|
* Uses real-time delivery when available, falls back to polling.
|
|
@@ -259,12 +420,33 @@ declare class ChatClient {
|
|
|
259
420
|
sendTyping(ticketId: string, isTyping: boolean): Promise<void>;
|
|
260
421
|
/** Disconnect all subscriptions and clean up. */
|
|
261
422
|
disconnect(): void;
|
|
262
|
-
/**
|
|
423
|
+
/**
|
|
424
|
+
* @internal Make an authenticated request to the widget API.
|
|
425
|
+
*
|
|
426
|
+
* On any non-2xx response, throws a typed subclass of `ChatClientError`
|
|
427
|
+
* (`ChatClientAuthError`, `ChatClientRateLimitError`, etc.) so consumers
|
|
428
|
+
* can branch on error class instead of parsing message strings.
|
|
429
|
+
*
|
|
430
|
+
* On the way out, reads the `X-Cstar-Auth-Mode` response header (set by
|
|
431
|
+
* widgetHandler on every response) and caches it on the client. After
|
|
432
|
+
* the first authenticated round-trip, `getAuthMode()` returns the
|
|
433
|
+
* server-confirmed mode.
|
|
434
|
+
*/
|
|
263
435
|
fetch<T>(path: string, options: {
|
|
264
436
|
method: string;
|
|
265
437
|
body?: unknown;
|
|
266
438
|
query?: Record<string, string | undefined>;
|
|
267
439
|
}): Promise<T>;
|
|
440
|
+
/**
|
|
441
|
+
* Look up the team UUID from the configured `teamSlug`. Used by
|
|
442
|
+
* `loginWithCredentials`. HMAC integrators (`identify()`) never hit
|
|
443
|
+
* this path — verify-identity accepts the slug directly.
|
|
444
|
+
*
|
|
445
|
+
* @internal
|
|
446
|
+
*/
|
|
447
|
+
private resolveTeamIdFromSlug;
|
|
448
|
+
/** @internal Bootstrap realtime from a session login (no precomputed customerId). */
|
|
449
|
+
private initRealtimeFromSession;
|
|
268
450
|
/** @internal Get the stored team ID for requests that need it. */
|
|
269
451
|
getTeamId(): string | null;
|
|
270
452
|
/** @internal Set team ID from identify response or other source. */
|
|
@@ -323,4 +505,4 @@ declare class MessagesApi {
|
|
|
323
505
|
send(ticketId: string, content: string): Promise<Message>;
|
|
324
506
|
}
|
|
325
507
|
|
|
326
|
-
export { ChatClient, type ChatConfig, type IdentifyParams, type IdentifyResult, type Message, type MessageCallback, type RealtimeTokenResponse, type Ticket, type TicketCreateParams, type TicketListParams, type TicketListResponse, type TypingCallback, type TypingPayload };
|
|
508
|
+
export { type ChatAuthMode, ChatClient, ChatClientAuthError, ChatClientError, ChatClientNetworkError, ChatClientRateLimitError, ChatClientServerError, type ChatConfig, type IdentifyParams, type IdentifyResult, type LoginWithCredentialsParams, type LoginWithCredentialsResult, type LoginWithSessionParams, type Message, type MessageCallback, type RealtimeTokenResponse, type Ticket, type TicketCreateParams, type TicketListParams, type TicketListResponse, type TypingCallback, type TypingPayload };
|
package/dist/chat/index.d.ts
CHANGED
|
@@ -12,6 +12,39 @@ interface ChatConfig {
|
|
|
12
12
|
/** Polling interval in ms when realtime is disabled or unavailable (defaults to 3000). */
|
|
13
13
|
pollingInterval?: number;
|
|
14
14
|
}
|
|
15
|
+
/**
|
|
16
|
+
* Which auth path the client used to identify the customer. Set
|
|
17
|
+
* automatically from the `X-Cstar-Auth-Mode` response header on the first
|
|
18
|
+
* authenticated response — consumers don't declare it. Useful for runtime
|
|
19
|
+
* branching in apps that wrap multiple ChatClient instances.
|
|
20
|
+
*/
|
|
21
|
+
type ChatAuthMode = 'hmac' | 'session';
|
|
22
|
+
/**
|
|
23
|
+
* Parameters for `loginWithSession()` — for integrators that already have
|
|
24
|
+
* a Supabase access token from their own login flow.
|
|
25
|
+
*/
|
|
26
|
+
interface LoginWithSessionParams {
|
|
27
|
+
/** Supabase access token (JWT). Used as Bearer for every subsequent call. */
|
|
28
|
+
accessToken: string;
|
|
29
|
+
/** Optional: the team UUID. If omitted, derived server-side from the token. */
|
|
30
|
+
teamId?: string;
|
|
31
|
+
/** Optional: a hint for the customer name (UI only — server stays authoritative). */
|
|
32
|
+
customerName?: string;
|
|
33
|
+
}
|
|
34
|
+
/** Parameters for `loginWithCredentials()` — email/password sign-in. */
|
|
35
|
+
interface LoginWithCredentialsParams {
|
|
36
|
+
email: string;
|
|
37
|
+
password: string;
|
|
38
|
+
}
|
|
39
|
+
/** Result of a credentials login. The client retains the access token internally. */
|
|
40
|
+
interface LoginWithCredentialsResult {
|
|
41
|
+
customer: {
|
|
42
|
+
id: string;
|
|
43
|
+
email: string;
|
|
44
|
+
name: string | null;
|
|
45
|
+
};
|
|
46
|
+
teamId: string;
|
|
47
|
+
}
|
|
15
48
|
/** Parameters for identifying a customer via HMAC signature verification. */
|
|
16
49
|
interface IdentifyParams {
|
|
17
50
|
/** Customer ID from your system. */
|
|
@@ -188,23 +221,125 @@ interface CommunityFollowResult {
|
|
|
188
221
|
following: boolean;
|
|
189
222
|
}
|
|
190
223
|
|
|
224
|
+
/**
|
|
225
|
+
* Typed error classes for the cStar widget chat client.
|
|
226
|
+
*
|
|
227
|
+
* Every error thrown by `ChatClient.fetch()` is one of these subclasses,
|
|
228
|
+
* carrying an HTTP status code, a server-supplied error code, and a
|
|
229
|
+
* `requestId` (from the `X-Request-Id` response header) that customer
|
|
230
|
+
* support can match against server-side logs.
|
|
231
|
+
*
|
|
232
|
+
* Consumer code can branch on instanceof checks instead of string-matching
|
|
233
|
+
* error messages, which is a brittle pattern that breaks the moment the
|
|
234
|
+
* server tweaks its message text:
|
|
235
|
+
*
|
|
236
|
+
* ```typescript
|
|
237
|
+
* try {
|
|
238
|
+
* await chat.identify(customer, signature);
|
|
239
|
+
* } catch (err) {
|
|
240
|
+
* if (err instanceof ChatClientAuthError) {
|
|
241
|
+
* // bad signature, expired token, etc.
|
|
242
|
+
* } else if (err instanceof ChatClientRateLimitError) {
|
|
243
|
+
* // back off and retry after err.retryAfter
|
|
244
|
+
* }
|
|
245
|
+
* }
|
|
246
|
+
* ```
|
|
247
|
+
*/
|
|
248
|
+
/** Base class. Thrown by `ChatClient.fetch()` for any non-2xx response. */
|
|
249
|
+
declare class ChatClientError extends Error {
|
|
250
|
+
readonly code: string;
|
|
251
|
+
readonly statusCode: number;
|
|
252
|
+
readonly requestId: string | null;
|
|
253
|
+
constructor(message: string, opts: {
|
|
254
|
+
code?: string;
|
|
255
|
+
statusCode: number;
|
|
256
|
+
requestId?: string | null;
|
|
257
|
+
});
|
|
258
|
+
}
|
|
259
|
+
/** 401 / 403 — auth failed (bad/expired token, wrong team, etc.). */
|
|
260
|
+
declare class ChatClientAuthError extends ChatClientError {
|
|
261
|
+
constructor(opts: {
|
|
262
|
+
message: string;
|
|
263
|
+
code?: string;
|
|
264
|
+
statusCode: number;
|
|
265
|
+
requestId?: string | null;
|
|
266
|
+
});
|
|
267
|
+
}
|
|
268
|
+
/** 429 — too many requests. Inspect `retryAfter` (seconds) before retrying. */
|
|
269
|
+
declare class ChatClientRateLimitError extends ChatClientError {
|
|
270
|
+
readonly retryAfter: number | null;
|
|
271
|
+
constructor(opts: {
|
|
272
|
+
message: string;
|
|
273
|
+
code?: string;
|
|
274
|
+
statusCode: number;
|
|
275
|
+
requestId?: string | null;
|
|
276
|
+
retryAfter?: number | null;
|
|
277
|
+
});
|
|
278
|
+
}
|
|
279
|
+
/** 5xx — the cStar server hit an internal error. Usually transient. */
|
|
280
|
+
declare class ChatClientServerError extends ChatClientError {
|
|
281
|
+
constructor(opts: {
|
|
282
|
+
message: string;
|
|
283
|
+
code?: string;
|
|
284
|
+
statusCode: number;
|
|
285
|
+
requestId?: string | null;
|
|
286
|
+
});
|
|
287
|
+
}
|
|
288
|
+
/**
|
|
289
|
+
* `fetch()` itself failed before a response was received — DNS, TLS,
|
|
290
|
+
* abort, offline, CORS misconfiguration, etc. No statusCode or requestId
|
|
291
|
+
* because the request didn't reach the server. The original cause is
|
|
292
|
+
* preserved on `originalError`.
|
|
293
|
+
*/
|
|
294
|
+
declare class ChatClientNetworkError extends ChatClientError {
|
|
295
|
+
readonly originalError: unknown;
|
|
296
|
+
constructor(opts: {
|
|
297
|
+
message: string;
|
|
298
|
+
originalError: unknown;
|
|
299
|
+
});
|
|
300
|
+
}
|
|
301
|
+
|
|
191
302
|
/**
|
|
192
303
|
* Customer-facing chat client for the cStar widget API.
|
|
193
304
|
*
|
|
194
|
-
*
|
|
195
|
-
*
|
|
196
|
-
*
|
|
197
|
-
*
|
|
305
|
+
* Supports two auth paths:
|
|
306
|
+
*
|
|
307
|
+
* 1. **HMAC** — `identify(customer, signature)` if you sign customer
|
|
308
|
+
* claims with your team's HMAC secret ("Bring Your Own Auth").
|
|
309
|
+
* 2. **Session** — `loginWithCredentials({ email, password })` or
|
|
310
|
+
* `loginWithSession({ accessToken })` if you use cStar's hosted
|
|
311
|
+
* Supabase auth (or already have a Supabase session from your app).
|
|
312
|
+
*
|
|
313
|
+
* The auth mode is detected automatically from the `X-Cstar-Auth-Mode`
|
|
314
|
+
* response header on the first authenticated call — consumers don't
|
|
315
|
+
* declare it. Real-time messages and typing indicators work in both
|
|
316
|
+
* modes; the SDK opens the right channel based on which login path was
|
|
317
|
+
* used.
|
|
318
|
+
*
|
|
319
|
+
* Real-time is enabled by default and falls back to polling. No extra
|
|
320
|
+
* configuration is required — everything the SDK needs is fetched from
|
|
321
|
+
* the cStar API.
|
|
198
322
|
*
|
|
199
323
|
* ```typescript
|
|
324
|
+
* // HMAC mode
|
|
200
325
|
* const chat = new ChatClient({ teamSlug: 'acme' });
|
|
201
326
|
* await chat.identify(
|
|
202
327
|
* { externalId: 'usr_123', email: 'jane@co.com', name: 'Jane', timestamp: Date.now() / 1000 },
|
|
203
328
|
* 'hmac_signature_hex'
|
|
204
329
|
* );
|
|
330
|
+
*
|
|
331
|
+
* // Session mode (hosted auth)
|
|
332
|
+
* const chat = new ChatClient({ teamSlug: 'acme' });
|
|
333
|
+
* await chat.loginWithCredentials({ email: 'jane@co.com', password: 'hunter2' });
|
|
334
|
+
*
|
|
205
335
|
* chat.onMessage('tkt_abc', (msg) => console.log(msg));
|
|
206
336
|
* chat.onTyping('tkt_abc', ({ agent_name }) => console.log(agent_name, 'is typing'));
|
|
207
337
|
* ```
|
|
338
|
+
*
|
|
339
|
+
* Errors thrown by `fetch()` (and by the public methods that wrap it)
|
|
340
|
+
* are typed: see `ChatClientAuthError`, `ChatClientRateLimitError`,
|
|
341
|
+
* `ChatClientServerError`, `ChatClientNetworkError`. Each carries
|
|
342
|
+
* `requestId` for correlating with server-side logs.
|
|
208
343
|
*/
|
|
209
344
|
declare class ChatClient {
|
|
210
345
|
private readonly baseUrl;
|
|
@@ -214,6 +349,7 @@ declare class ChatClient {
|
|
|
214
349
|
private sessionToken;
|
|
215
350
|
private teamId;
|
|
216
351
|
private customerId;
|
|
352
|
+
private authMode;
|
|
217
353
|
private pollingTimers;
|
|
218
354
|
private realtimeManager;
|
|
219
355
|
private presenceManager;
|
|
@@ -238,6 +374,31 @@ declare class ChatClient {
|
|
|
238
374
|
* @param testMode - Whether to use test mode (relaxed timestamp validation)
|
|
239
375
|
*/
|
|
240
376
|
identify(customer: IdentifyParams, signature: string, testMode?: boolean): Promise<IdentifyResult>;
|
|
377
|
+
/**
|
|
378
|
+
* Sign in with cStar's hosted password auth. The SDK keeps the resulting
|
|
379
|
+
* Supabase access token and uses it as Bearer for every subsequent call.
|
|
380
|
+
* Real-time bootstraps automatically (same flow as `identify()`).
|
|
381
|
+
*
|
|
382
|
+
* Use this when your customers don't have a session in your app and you
|
|
383
|
+
* want cStar to handle login. For the case where your app already has a
|
|
384
|
+
* Supabase session, use `loginWithSession({ accessToken })` instead.
|
|
385
|
+
*/
|
|
386
|
+
loginWithCredentials(params: LoginWithCredentialsParams): Promise<LoginWithCredentialsResult>;
|
|
387
|
+
/**
|
|
388
|
+
* Use an existing Supabase access token for widget calls. Skip the cStar
|
|
389
|
+
* login flow entirely; the SDK uses the supplied token as Bearer and
|
|
390
|
+
* bootstraps real-time the same way `identify()` does.
|
|
391
|
+
*
|
|
392
|
+
* The widget API verifies the token via the `widget-session` strategy on
|
|
393
|
+
* every request — there is no client-side validation here.
|
|
394
|
+
*/
|
|
395
|
+
loginWithSession(params: LoginWithSessionParams): Promise<void>;
|
|
396
|
+
/**
|
|
397
|
+
* Returns the auth mode the client is currently using, or `null` before
|
|
398
|
+
* any authenticated call has resolved one. Useful for branching UI
|
|
399
|
+
* (e.g. to show a "Sign out" button only in session mode).
|
|
400
|
+
*/
|
|
401
|
+
getAuthMode(): ChatAuthMode | null;
|
|
241
402
|
/**
|
|
242
403
|
* Subscribe to new messages on a ticket.
|
|
243
404
|
* Uses real-time delivery when available, falls back to polling.
|
|
@@ -259,12 +420,33 @@ declare class ChatClient {
|
|
|
259
420
|
sendTyping(ticketId: string, isTyping: boolean): Promise<void>;
|
|
260
421
|
/** Disconnect all subscriptions and clean up. */
|
|
261
422
|
disconnect(): void;
|
|
262
|
-
/**
|
|
423
|
+
/**
|
|
424
|
+
* @internal Make an authenticated request to the widget API.
|
|
425
|
+
*
|
|
426
|
+
* On any non-2xx response, throws a typed subclass of `ChatClientError`
|
|
427
|
+
* (`ChatClientAuthError`, `ChatClientRateLimitError`, etc.) so consumers
|
|
428
|
+
* can branch on error class instead of parsing message strings.
|
|
429
|
+
*
|
|
430
|
+
* On the way out, reads the `X-Cstar-Auth-Mode` response header (set by
|
|
431
|
+
* widgetHandler on every response) and caches it on the client. After
|
|
432
|
+
* the first authenticated round-trip, `getAuthMode()` returns the
|
|
433
|
+
* server-confirmed mode.
|
|
434
|
+
*/
|
|
263
435
|
fetch<T>(path: string, options: {
|
|
264
436
|
method: string;
|
|
265
437
|
body?: unknown;
|
|
266
438
|
query?: Record<string, string | undefined>;
|
|
267
439
|
}): Promise<T>;
|
|
440
|
+
/**
|
|
441
|
+
* Look up the team UUID from the configured `teamSlug`. Used by
|
|
442
|
+
* `loginWithCredentials`. HMAC integrators (`identify()`) never hit
|
|
443
|
+
* this path — verify-identity accepts the slug directly.
|
|
444
|
+
*
|
|
445
|
+
* @internal
|
|
446
|
+
*/
|
|
447
|
+
private resolveTeamIdFromSlug;
|
|
448
|
+
/** @internal Bootstrap realtime from a session login (no precomputed customerId). */
|
|
449
|
+
private initRealtimeFromSession;
|
|
268
450
|
/** @internal Get the stored team ID for requests that need it. */
|
|
269
451
|
getTeamId(): string | null;
|
|
270
452
|
/** @internal Set team ID from identify response or other source. */
|
|
@@ -323,4 +505,4 @@ declare class MessagesApi {
|
|
|
323
505
|
send(ticketId: string, content: string): Promise<Message>;
|
|
324
506
|
}
|
|
325
507
|
|
|
326
|
-
export { ChatClient, type ChatConfig, type IdentifyParams, type IdentifyResult, type Message, type MessageCallback, type RealtimeTokenResponse, type Ticket, type TicketCreateParams, type TicketListParams, type TicketListResponse, type TypingCallback, type TypingPayload };
|
|
508
|
+
export { type ChatAuthMode, ChatClient, ChatClientAuthError, ChatClientError, ChatClientNetworkError, ChatClientRateLimitError, ChatClientServerError, type ChatConfig, type IdentifyParams, type IdentifyResult, type LoginWithCredentialsParams, type LoginWithCredentialsResult, type LoginWithSessionParams, type Message, type MessageCallback, type RealtimeTokenResponse, type Ticket, type TicketCreateParams, type TicketListParams, type TicketListResponse, type TypingCallback, type TypingPayload };
|