wakz-sdk 1.0.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.
Files changed (56) hide show
  1. package/README.md +264 -0
  2. package/dist/client.d.ts +124 -0
  3. package/dist/client.d.ts.map +1 -0
  4. package/dist/client.js +323 -0
  5. package/dist/client.js.map +1 -0
  6. package/dist/crypto.d.ts +26 -0
  7. package/dist/crypto.d.ts.map +1 -0
  8. package/dist/crypto.js +161 -0
  9. package/dist/crypto.js.map +1 -0
  10. package/dist/esm/client.js.map +1 -0
  11. package/dist/esm/client.mjs +319 -0
  12. package/dist/esm/crypto.js.map +1 -0
  13. package/dist/esm/crypto.mjs +123 -0
  14. package/dist/esm/events.js.map +1 -0
  15. package/dist/esm/events.mjs +100 -0
  16. package/dist/esm/http.js.map +1 -0
  17. package/dist/esm/http.mjs +159 -0
  18. package/dist/esm/index.js.map +1 -0
  19. package/dist/esm/index.mjs +32 -0
  20. package/dist/esm/session.js.map +1 -0
  21. package/dist/esm/session.mjs +186 -0
  22. package/dist/esm/types.js.map +1 -0
  23. package/dist/esm/types.mjs +5 -0
  24. package/dist/esm/utils.js.map +1 -0
  25. package/dist/esm/utils.mjs +139 -0
  26. package/dist/esm/websocket.js.map +1 -0
  27. package/dist/esm/websocket.mjs +363 -0
  28. package/dist/events.d.ts +38 -0
  29. package/dist/events.d.ts.map +1 -0
  30. package/dist/events.js +104 -0
  31. package/dist/events.js.map +1 -0
  32. package/dist/http.d.ts +37 -0
  33. package/dist/http.d.ts.map +1 -0
  34. package/dist/http.js +163 -0
  35. package/dist/http.js.map +1 -0
  36. package/dist/index.d.ts +27 -0
  37. package/dist/index.d.ts.map +1 -0
  38. package/dist/index.js +49 -0
  39. package/dist/index.js.map +1 -0
  40. package/dist/session.d.ts +75 -0
  41. package/dist/session.d.ts.map +1 -0
  42. package/dist/session.js +190 -0
  43. package/dist/session.js.map +1 -0
  44. package/dist/types.d.ts +149 -0
  45. package/dist/types.d.ts.map +1 -0
  46. package/dist/types.js +6 -0
  47. package/dist/types.js.map +1 -0
  48. package/dist/utils.d.ts +56 -0
  49. package/dist/utils.d.ts.map +1 -0
  50. package/dist/utils.js +153 -0
  51. package/dist/utils.js.map +1 -0
  52. package/dist/websocket.d.ts +93 -0
  53. package/dist/websocket.d.ts.map +1 -0
  54. package/dist/websocket.js +367 -0
  55. package/dist/websocket.js.map +1 -0
  56. package/package.json +50 -0
package/README.md ADDED
@@ -0,0 +1,264 @@
1
+ # @wakz/sdk
2
+
3
+ Official WAKZ AI SDK — Embed intelligent chat assistants in any website or application with WebSocket + HTTP fallback, automatic reconnection, and HMAC-signed authentication.
4
+
5
+ ## Installation
6
+
7
+ ```bash
8
+ npm install @wakz/sdk
9
+ # or
10
+ yarn add @wakz/sdk
11
+ # or
12
+ pnpm add @wakz/sdk
13
+ # or
14
+ bun add @wakz/sdk
15
+ ```
16
+
17
+ ## Quick Start
18
+
19
+ ```typescript
20
+ import { WAKZClient } from '@wakz/sdk';
21
+
22
+ // Initialize the client with your API key
23
+ const client = new WAKZClient({
24
+ apiKey: 'wakz_live_xxxxx',
25
+ });
26
+
27
+ // Connect to the WAKZ API
28
+ await client.connect();
29
+
30
+ // Listen for messages
31
+ client.on('message', (msg) => {
32
+ console.log(`[${msg.role}]: ${msg.content}`);
33
+ });
34
+
35
+ // Send a message and get the AI response
36
+ const response = await client.sendMessage('Hello! How can you help me?');
37
+
38
+ if (response.success) {
39
+ console.log('AI Response:', response.message?.content);
40
+ } else {
41
+ console.error('Error:', response.error);
42
+ }
43
+
44
+ // Disconnect when done
45
+ client.disconnect();
46
+ ```
47
+
48
+ ## React Integration
49
+
50
+ ```tsx
51
+ import { useEffect, useRef, useState } from 'react';
52
+ import { WAKZClient, type ChatMessage } from '@wakz/sdk';
53
+
54
+ export function WAKZChat() {
55
+ const [messages, setMessages] = useState<ChatMessage[]>([]);
56
+ const [input, setInput] = useState('');
57
+ const clientRef = useRef<WAKZClient | null>(null);
58
+
59
+ useEffect(() => {
60
+ const client = new WAKZClient({
61
+ apiKey: 'wakz_live_xxxxx',
62
+ });
63
+
64
+ client.on('message', (msg) => {
65
+ setMessages((prev) => [...prev, msg]);
66
+ });
67
+
68
+ client.connect();
69
+ clientRef.current = client;
70
+
71
+ return () => {
72
+ client.destroy();
73
+ };
74
+ }, []);
75
+
76
+ const handleSend = async () => {
77
+ if (!input.trim() || !clientRef.current) return;
78
+
79
+ setMessages((prev) => [
80
+ ...prev,
81
+ {
82
+ id: Date.now().toString(),
83
+ role: 'user',
84
+ content: input,
85
+ timestamp: new Date().toISOString(),
86
+ },
87
+ ]);
88
+
89
+ await clientRef.current.sendMessage(input);
90
+ setInput('');
91
+ };
92
+
93
+ return (
94
+ <div>
95
+ {messages.map((msg) => (
96
+ <div key={msg.id}>{msg.content}</div>
97
+ ))}
98
+ <input
99
+ value={input}
100
+ onChange={(e) => setInput(e.target.value)}
101
+ onKeyDown={(e) => e.key === 'Enter' && handleSend()}
102
+ />
103
+ <button onClick={handleSend}>Send</button>
104
+ </div>
105
+ );
106
+ }
107
+ ```
108
+
109
+ ## API Reference
110
+
111
+ ### `new WAKZClient(options)`
112
+
113
+ Creates a new WAKZ SDK client instance.
114
+
115
+ #### Options
116
+
117
+ | Option | Type | Default | Description |
118
+ |--------|------|---------|-------------|
119
+ | `apiKey` | `string` | **required** | Your WAKZ API key (starts with `wakz_live_`) |
120
+ | `baseUrl` | `string` | `'https://api.wakz.dev'` | API base URL |
121
+ | `websocketUrl` | `string` | derived from baseUrl | WebSocket server URL |
122
+ | `autoReconnect` | `boolean` | `true` | Enable automatic reconnection |
123
+ | `maxRetries` | `number` | `5` | Max reconnection attempts before HTTP fallback |
124
+ | `initialRetryDelay` | `number` | `1000` | Initial retry delay in ms |
125
+ | `maxRetryDelay` | `number` | `30000` | Maximum retry delay in ms |
126
+ | `visitorId` | `string` | auto-generated | Custom visitor identifier |
127
+ | `metadata` | `object` | `{}` | Visitor metadata (browser, OS, etc.) |
128
+ | `timeout` | `number` | `30000` | Request timeout in ms |
129
+ | `debug` | `boolean` | `false` | Enable debug logging |
130
+
131
+ ### Methods
132
+
133
+ #### `client.connect(): Promise<void>`
134
+
135
+ Connect to the WAKZ API. Attempts WebSocket first, falls back to HTTP.
136
+
137
+ #### `client.sendMessage(content: string): Promise<SendMessageResponse>`
138
+
139
+ Send a message and receive the AI response.
140
+
141
+ #### `client.disconnect(): void`
142
+
143
+ Disconnect from the API.
144
+
145
+ #### `client.getSession(): Promise<SessionInfo>`
146
+
147
+ Get the current session information.
148
+
149
+ #### `client.getVisitorId(): string`
150
+
151
+ Get the current visitor ID.
152
+
153
+ #### `client.getStatus(): ConnectionStatus`
154
+
155
+ Get the current connection status (`'disconnected' | 'connecting' | 'connected' | 'reconnecting' | 'failed'`).
156
+
157
+ #### `client.getTransport(): TransportMode`
158
+
159
+ Get the current transport mode (`'websocket' | 'http'`).
160
+
161
+ #### `client.getWidgetConfig(): Promise<WidgetConfig | null>`
162
+
163
+ Fetch widget configuration from the API.
164
+
165
+ #### `client.healthCheck(): Promise<HealthCheckResult>`
166
+
167
+ Perform a health check against the API.
168
+
169
+ #### `client.updateMetadata(metadata: Record<string, string>): void`
170
+
171
+ Update visitor metadata.
172
+
173
+ #### `client.destroy(): void`
174
+
175
+ Disconnect and clean up all resources.
176
+
177
+ ### Events
178
+
179
+ | Event | Data | Description |
180
+ |-------|------|-------------|
181
+ | `connected` | `void` | Successfully connected to the API |
182
+ | `disconnected` | `{ code: number, reason: string }` | Disconnected from the API |
183
+ | `reconnecting` | `{ attempt: number, delay: number }` | Attempting to reconnect |
184
+ | `reconnect_failed` | `{ reason: string }` | All reconnection attempts exhausted |
185
+ | `message` | `ChatMessage` | Received a message from the AI |
186
+ | `error` | `Error` | An error occurred |
187
+ | `session_start` | `SessionInfo` | A new session started |
188
+ | `session_end` | `{ sessionId: string }` | The session ended |
189
+ | `transport_change` | `{ from: TransportMode, to: TransportMode }` | Transport mode changed |
190
+ | `health_check` | `{ latency: number, transport: TransportMode }` | Health check completed |
191
+
192
+ ### Static Methods
193
+
194
+ #### `WAKZClient.healthCheck(baseUrl?, timeout?): Promise<HealthCheckResult>`
195
+
196
+ Perform a quick connectivity check without creating a client instance.
197
+
198
+ ```typescript
199
+ const health = await WAKZClient.healthCheck();
200
+ if (health.healthy) {
201
+ console.log(`WAKZ API is up (${health.latency}ms)`);
202
+ }
203
+ ```
204
+
205
+ ## Transport Architecture
206
+
207
+ ```
208
+ ┌─────────────┐ WebSocket ┌──────────────┐
209
+ │ │ ─────────────────► │ │
210
+ │ WAKZ SDK │ │ WAKZ API │
211
+ │ │ ◄───────────────── │ │
212
+ │ │ Real-time │ │
213
+ │ │ │ │
214
+ │ │ HTTP/REST │ │
215
+ │ │ ─────────────────► │ │
216
+ │ │ ◄───────────────── │ │
217
+ └─────────────┘ Fallback └──────────────┘
218
+ ```
219
+
220
+ 1. **Primary**: WebSocket for real-time, low-latency communication
221
+ 2. **Fallback**: HTTP/REST when WebSocket is unavailable or fails
222
+ 3. **Auto-switch**: Automatically falls back to HTTP after max retries
223
+ 4. **Reconnection**: Exponential backoff with jitter (1s → 2s → 4s → ... → 30s max)
224
+
225
+ ## Authentication
226
+
227
+ All requests are authenticated using your API key with HMAC-SHA256 signing:
228
+
229
+ - **`X-API-Key`**: Your raw API key
230
+ - **`X-Timestamp`**: ISO 8601 timestamp
231
+ - **`X-Signature`**: HMAC-SHA256 of `{timestamp}.{payload}` using your API key
232
+
233
+ ## TypeScript Support
234
+
235
+ Full TypeScript support with comprehensive type definitions:
236
+
237
+ ```typescript
238
+ import type {
239
+ ChatMessage,
240
+ SessionInfo,
241
+ WAKZClientOptions,
242
+ TransportMode,
243
+ ConnectionStatus,
244
+ HealthCheckResult,
245
+ WAKZEventType,
246
+ WAKZEventMap,
247
+ } from '@wakz/sdk';
248
+ ```
249
+
250
+ ## Browser Support
251
+
252
+ - Chrome 80+
253
+ - Firefox 80+
254
+ - Safari 14+
255
+ - Edge 80+
256
+
257
+ ## Node.js Support
258
+
259
+ - Node.js 16+
260
+ - Works with `ws` package for WebSocket support
261
+
262
+ ## License
263
+
264
+ MIT License — see [LICENSE](LICENSE) for details.
@@ -0,0 +1,124 @@
1
+ import type { WAKZClientOptions, WAKZEventType, WAKZEventMap, WAKZEventCallback, SendMessageResponse, SessionInfo, WidgetConfig, HealthCheckResult, TransportMode, ConnectionStatus } from './types';
2
+ import { WAKZEventEmitter } from './events';
3
+ /**
4
+ * WAKZ SDK Client — The main entry point for integrating WAKZ AI.
5
+ *
6
+ * Features:
7
+ * - Dual transport: WebSocket (primary) with HTTP/REST fallback
8
+ * - Automatic reconnection with exponential backoff
9
+ * - API key authentication with HMAC-SHA256 request signing
10
+ * - Typed event emitter for real-time updates
11
+ * - Session management with visitor fingerprinting
12
+ * - Works in both browser and Node.js environments
13
+ *
14
+ * @example
15
+ * ```typescript
16
+ * const client = new WAKZClient({
17
+ * apiKey: 'wakz_live_xxxxx',
18
+ * });
19
+ *
20
+ * await client.connect();
21
+ * client.on('message', (msg) => console.log(msg));
22
+ * const response = await client.sendMessage('Hello!');
23
+ * ```
24
+ */
25
+ export declare class WAKZClient extends WAKZEventEmitter {
26
+ private options;
27
+ private wsTransport;
28
+ private httpTransport;
29
+ private sessionManager;
30
+ private logger;
31
+ private _status;
32
+ private _currentTransport;
33
+ /**
34
+ * Create a new WAKZ SDK client instance.
35
+ *
36
+ * @param options - Client configuration options
37
+ */
38
+ constructor(options: WAKZClientOptions);
39
+ /**
40
+ * Connect to the WAKZ API.
41
+ *
42
+ * Attempts WebSocket connection first. Falls back to HTTP if:
43
+ * - WebSocket is not available in the environment
44
+ * - WebSocket connection fails after max retries
45
+ *
46
+ * @returns Promise that resolves when connected
47
+ */
48
+ connect(): Promise<void>;
49
+ /**
50
+ * Send a chat message.
51
+ *
52
+ * Uses the current active transport (WebSocket or HTTP).
53
+ *
54
+ * @param content - The message text to send
55
+ * @returns Promise resolving to the assistant's reply
56
+ */
57
+ sendMessage(content: string): Promise<SendMessageResponse>;
58
+ /**
59
+ * Disconnect from the WAKZ API.
60
+ */
61
+ disconnect(): void;
62
+ /**
63
+ * Register an event listener.
64
+ */
65
+ on<K extends WAKZEventType>(event: K, callback: WAKZEventCallback<WAKZEventMap[K]>): this;
66
+ /**
67
+ * Register a one-time event listener.
68
+ */
69
+ once<K extends WAKZEventType>(event: K, callback: WAKZEventCallback<WAKZEventMap[K]>): this;
70
+ /**
71
+ * Remove an event listener.
72
+ */
73
+ off<K extends WAKZEventType>(event: K, callback: WAKZEventCallback<WAKZEventMap[K]>): this;
74
+ /**
75
+ * Get the current session information.
76
+ */
77
+ getSession(): Promise<SessionInfo>;
78
+ /**
79
+ * Get the current visitor ID.
80
+ */
81
+ getVisitorId(): string;
82
+ /**
83
+ * Get the current connection status.
84
+ */
85
+ getStatus(): ConnectionStatus;
86
+ /**
87
+ * Get the current transport mode.
88
+ */
89
+ getTransport(): TransportMode;
90
+ /**
91
+ * Fetch the widget configuration from the API.
92
+ */
93
+ getWidgetConfig(): Promise<WidgetConfig | null>;
94
+ /**
95
+ * Perform a health check against the WAKZ API.
96
+ */
97
+ healthCheck(): Promise<HealthCheckResult>;
98
+ /**
99
+ * Update visitor metadata.
100
+ */
101
+ updateMetadata(metadata: Record<string, string>): void;
102
+ /**
103
+ * Destroy the client — disconnect and clean up all resources.
104
+ */
105
+ destroy(): void;
106
+ /**
107
+ * ─── Static Methods ──────────────────────────────────────
108
+ */
109
+ /**
110
+ * Perform a quick health check against a WAKZ API endpoint.
111
+ * Useful for checking connectivity before creating a client instance.
112
+ *
113
+ * @param baseUrl - The API base URL to check
114
+ * @param timeout - Request timeout in ms (default: 10000)
115
+ * @returns Health check result
116
+ */
117
+ static healthCheck(baseUrl?: string, timeout?: number): Promise<HealthCheckResult>;
118
+ /**
119
+ * Connect via WebSocket transport.
120
+ */
121
+ private connectWebSocket;
122
+ private warn;
123
+ }
124
+ //# sourceMappingURL=client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EACV,iBAAiB,EACjB,aAAa,EACb,YAAY,EACZ,iBAAiB,EACjB,mBAAmB,EAEnB,WAAW,EACX,YAAY,EACZ,iBAAiB,EACjB,aAAa,EACb,gBAAgB,EACjB,MAAM,SAAS,CAAC;AAEjB,OAAO,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAM5C;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,qBAAa,UAAW,SAAQ,gBAAgB;IAC9C,OAAO,CAAC,OAAO,CACuD;IACtE,OAAO,CAAC,WAAW,CAAmC;IACtD,OAAO,CAAC,aAAa,CAAgB;IACrC,OAAO,CAAC,cAAc,CAAiB;IACvC,OAAO,CAAC,MAAM,CAAS;IAEvB,OAAO,CAAC,OAAO,CAAoC;IACnD,OAAO,CAAC,iBAAiB,CAAyB;IAElD;;;;OAIG;gBACS,OAAO,EAAE,iBAAiB;IA0CtC;;;;;;;;OAQG;IACG,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IA2B9B;;;;;;;OAOG;IACG,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,mBAAmB,CAAC;IA+ChE;;OAEG;IACH,UAAU,IAAI,IAAI;IAOlB;;OAEG;IACM,EAAE,CAAC,CAAC,SAAS,aAAa,EACjC,KAAK,EAAE,CAAC,EACR,QAAQ,EAAE,iBAAiB,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,GAC3C,IAAI;IAKP;;OAEG;IACM,IAAI,CAAC,CAAC,SAAS,aAAa,EACnC,KAAK,EAAE,CAAC,EACR,QAAQ,EAAE,iBAAiB,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,GAC3C,IAAI;IAKP;;OAEG;IACM,GAAG,CAAC,CAAC,SAAS,aAAa,EAClC,KAAK,EAAE,CAAC,EACR,QAAQ,EAAE,iBAAiB,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,GAC3C,IAAI;IAKP;;OAEG;IACG,UAAU,IAAI,OAAO,CAAC,WAAW,CAAC;IAIxC;;OAEG;IACH,YAAY,IAAI,MAAM;IAItB;;OAEG;IACH,SAAS,IAAI,gBAAgB;IAI7B;;OAEG;IACH,YAAY,IAAI,aAAa;IAI7B;;OAEG;IACG,eAAe,IAAI,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC;IAIrD;;OAEG;IACG,WAAW,IAAI,OAAO,CAAC,iBAAiB,CAAC;IAQ/C;;OAEG;IACH,cAAc,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI;IAItD;;OAEG;IACH,OAAO,IAAI,IAAI;IAQf;;OAEG;IAEH;;;;;;;OAOG;WACU,WAAW,CACtB,OAAO,GAAE,MAA+B,EACxC,OAAO,GAAE,MAAc,GACtB,OAAO,CAAC,iBAAiB,CAAC;IA6B7B;;OAEG;YACW,gBAAgB;IA2D9B,OAAO,CAAC,IAAI;CAGb"}