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/dist/http.js ADDED
@@ -0,0 +1,163 @@
1
+ "use strict";
2
+ // ═══════════════════════════════════════════════════════════════
3
+ // WAKZ SDK — HTTP/REST Transport Client
4
+ // ═══════════════════════════════════════════════════════════════
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.HttpTransport = void 0;
7
+ const crypto_1 = require("./crypto");
8
+ const utils_1 = require("./utils");
9
+ /**
10
+ * HTTP/REST fallback transport for environments where WebSocket is unavailable.
11
+ * All requests are signed with HMAC-SHA256 for secure authentication.
12
+ */
13
+ class HttpTransport {
14
+ constructor(apiKey, baseUrl, timeout = 30000, debug = false) {
15
+ this.apiKey = apiKey;
16
+ this.baseUrl = (0, utils_1.normalizeUrl)(baseUrl);
17
+ this.timeout = timeout;
18
+ this.logger = new utils_1.Logger(debug);
19
+ }
20
+ /**
21
+ * Send a chat message via REST API.
22
+ */
23
+ async sendMessage(content, sessionId, visitorId) {
24
+ try {
25
+ const body = {
26
+ message: content,
27
+ role: 'user',
28
+ timestamp: (0, utils_1.nowISO)(),
29
+ id: (0, utils_1.generateId)('msg'),
30
+ };
31
+ if (sessionId)
32
+ body.session_id = sessionId;
33
+ if (visitorId)
34
+ body.visitor_id = visitorId;
35
+ const signed = await (0, crypto_1.signRequest)(this.apiKey, body);
36
+ this.logger.debug('[HTTP] Sending message:', content.slice(0, 50) + '...');
37
+ const response = await this.fetchWithTimeout('/api/v1/embed/chat', {
38
+ method: 'POST',
39
+ headers: signed,
40
+ body: JSON.stringify(body),
41
+ });
42
+ const data = await response.json();
43
+ if (!response.ok) {
44
+ return {
45
+ success: false,
46
+ error: data.error || `HTTP ${response.status}`,
47
+ };
48
+ }
49
+ return {
50
+ success: true,
51
+ message: data.message || data.reply || {
52
+ id: (0, utils_1.generateId)('msg'),
53
+ role: 'assistant',
54
+ content: data.content || data.reply_text || data.text || '',
55
+ timestamp: (0, utils_1.nowISO)(),
56
+ },
57
+ };
58
+ }
59
+ catch (err) {
60
+ this.logger.error('[HTTP] sendMessage error:', err);
61
+ return {
62
+ success: false,
63
+ error: err instanceof Error ? err.message : 'Network error',
64
+ };
65
+ }
66
+ }
67
+ /**
68
+ * Fetch widget configuration.
69
+ */
70
+ async fetchWidgetConfig() {
71
+ try {
72
+ const body = { action: 'get_config', timestamp: (0, utils_1.nowISO)() };
73
+ const signed = await (0, crypto_1.signRequest)(this.apiKey, body);
74
+ const response = await this.fetchWithTimeout('/api/v1/embed/widget', {
75
+ method: 'GET',
76
+ headers: {
77
+ 'X-API-Key': signed['X-API-Key'],
78
+ 'X-Timestamp': signed['X-Timestamp'],
79
+ 'X-Signature': signed['X-Signature'],
80
+ },
81
+ });
82
+ if (!response.ok)
83
+ return null;
84
+ const data = await response.json();
85
+ return data.success ? data : null;
86
+ }
87
+ catch (err) {
88
+ this.logger.error('[HTTP] fetchWidgetConfig error:', err);
89
+ return null;
90
+ }
91
+ }
92
+ /**
93
+ * Perform a health check against the API.
94
+ */
95
+ async healthCheck() {
96
+ const startTime = Date.now();
97
+ try {
98
+ const response = await this.fetchWithTimeout('/api/v1/embed/health', {
99
+ method: 'GET',
100
+ headers: {
101
+ 'X-API-Key': this.apiKey,
102
+ 'Content-Type': 'application/json',
103
+ },
104
+ });
105
+ const latency = Date.now() - startTime;
106
+ const data = await response.json().catch(() => ({}));
107
+ return {
108
+ healthy: response.ok,
109
+ latency,
110
+ version: data.version,
111
+ };
112
+ }
113
+ catch {
114
+ return {
115
+ healthy: false,
116
+ latency: Date.now() - startTime,
117
+ };
118
+ }
119
+ }
120
+ /**
121
+ * Get the current session from the server.
122
+ */
123
+ async getSession(visitorId) {
124
+ try {
125
+ const body = { visitor_id: visitorId, timestamp: (0, utils_1.nowISO)() };
126
+ const signed = await (0, crypto_1.signRequest)(this.apiKey, body);
127
+ const response = await this.fetchWithTimeout('/api/v1/embed/session', {
128
+ method: 'POST',
129
+ headers: signed,
130
+ body: JSON.stringify(body),
131
+ });
132
+ if (!response.ok)
133
+ return null;
134
+ return await response.json().catch(() => null);
135
+ }
136
+ catch {
137
+ return null;
138
+ }
139
+ }
140
+ /**
141
+ * Fetch with timeout support.
142
+ */
143
+ async fetchWithTimeout(path, options, timeout) {
144
+ const controller = new AbortController();
145
+ const timeoutMs = timeout ?? this.timeout;
146
+ const timeoutId = setTimeout(() => controller.abort(), timeoutMs);
147
+ try {
148
+ const url = path.startsWith('http')
149
+ ? path
150
+ : `${this.baseUrl}${path}`;
151
+ const response = await fetch(url, {
152
+ ...options,
153
+ signal: controller.signal,
154
+ });
155
+ return response;
156
+ }
157
+ finally {
158
+ clearTimeout(timeoutId);
159
+ }
160
+ }
161
+ }
162
+ exports.HttpTransport = HttpTransport;
163
+ //# sourceMappingURL=http.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http.js","sourceRoot":"","sources":["../src/http.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ /**
2
+ * @module @wakz/sdk
3
+ * @description Official WAKZ AI SDK — Embed intelligent chat assistants anywhere.
4
+ *
5
+ * @example
6
+ * ```typescript
7
+ * import { WAKZClient } from '@wakz/sdk';
8
+ *
9
+ * const client = new WAKZClient({
10
+ * apiKey: 'wakz_live_xxxxx',
11
+ * });
12
+ *
13
+ * await client.connect();
14
+ * client.on('message', (msg) => console.log(msg.content));
15
+ * const response = await client.sendMessage('Hello!');
16
+ * console.log(response.message?.content);
17
+ * ```
18
+ */
19
+ export { WAKZClient } from './client';
20
+ export type { TransportMode, ConnectionStatus, MessageRole, ChatMessage, SendMessageResponse, SessionInfo, WidgetConfig, WebhookConfig, WAKZClientOptions, WAKZEventType, WAKZEventCallback, WAKZEventMap, HealthCheckResult, SignedHeaders, } from './types';
21
+ export { WebSocketTransport } from './websocket';
22
+ export { HttpTransport } from './http';
23
+ export { SessionManager } from './session';
24
+ export { WAKZEventEmitter } from './events';
25
+ export { signRequest, simpleHash, randomHex, } from './crypto';
26
+ export { generateId, generateVisitorFingerprint, calculateBackoff, normalizeUrl, httpToWsUrl, Logger, } from './utils';
27
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAIA;;;;;;;;;;;;;;;;;GAiBG;AAGH,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAGtC,YAAY,EACV,aAAa,EACb,gBAAgB,EAChB,WAAW,EACX,WAAW,EACX,mBAAmB,EACnB,WAAW,EACX,YAAY,EACZ,aAAa,EACb,iBAAiB,EACjB,aAAa,EACb,iBAAiB,EACjB,YAAY,EACZ,iBAAiB,EACjB,aAAa,GACd,MAAM,SAAS,CAAC;AAGjB,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,EAAE,aAAa,EAAE,MAAM,QAAQ,CAAC;AACvC,OAAO,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAC3C,OAAO,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAG5C,OAAO,EACL,WAAW,EACX,UAAU,EACV,SAAS,GACV,MAAM,UAAU,CAAC;AAElB,OAAO,EACL,UAAU,EACV,0BAA0B,EAC1B,gBAAgB,EAChB,YAAY,EACZ,WAAW,EACX,MAAM,GACP,MAAM,SAAS,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,49 @@
1
+ "use strict";
2
+ // ═══════════════════════════════════════════════════════════════
3
+ // WAKZ SDK — Main Entry Point
4
+ // ═══════════════════════════════════════════════════════════════
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.Logger = exports.httpToWsUrl = exports.normalizeUrl = exports.calculateBackoff = exports.generateVisitorFingerprint = exports.generateId = exports.randomHex = exports.simpleHash = exports.signRequest = exports.WAKZEventEmitter = exports.SessionManager = exports.HttpTransport = exports.WebSocketTransport = exports.WAKZClient = void 0;
7
+ /**
8
+ * @module @wakz/sdk
9
+ * @description Official WAKZ AI SDK — Embed intelligent chat assistants anywhere.
10
+ *
11
+ * @example
12
+ * ```typescript
13
+ * import { WAKZClient } from '@wakz/sdk';
14
+ *
15
+ * const client = new WAKZClient({
16
+ * apiKey: 'wakz_live_xxxxx',
17
+ * });
18
+ *
19
+ * await client.connect();
20
+ * client.on('message', (msg) => console.log(msg.content));
21
+ * const response = await client.sendMessage('Hello!');
22
+ * console.log(response.message?.content);
23
+ * ```
24
+ */
25
+ // Main client
26
+ var client_1 = require("./client");
27
+ Object.defineProperty(exports, "WAKZClient", { enumerable: true, get: function () { return client_1.WAKZClient; } });
28
+ // Lower-level components (for advanced usage)
29
+ var websocket_1 = require("./websocket");
30
+ Object.defineProperty(exports, "WebSocketTransport", { enumerable: true, get: function () { return websocket_1.WebSocketTransport; } });
31
+ var http_1 = require("./http");
32
+ Object.defineProperty(exports, "HttpTransport", { enumerable: true, get: function () { return http_1.HttpTransport; } });
33
+ var session_1 = require("./session");
34
+ Object.defineProperty(exports, "SessionManager", { enumerable: true, get: function () { return session_1.SessionManager; } });
35
+ var events_1 = require("./events");
36
+ Object.defineProperty(exports, "WAKZEventEmitter", { enumerable: true, get: function () { return events_1.WAKZEventEmitter; } });
37
+ // Utilities
38
+ var crypto_1 = require("./crypto");
39
+ Object.defineProperty(exports, "signRequest", { enumerable: true, get: function () { return crypto_1.signRequest; } });
40
+ Object.defineProperty(exports, "simpleHash", { enumerable: true, get: function () { return crypto_1.simpleHash; } });
41
+ Object.defineProperty(exports, "randomHex", { enumerable: true, get: function () { return crypto_1.randomHex; } });
42
+ var utils_1 = require("./utils");
43
+ Object.defineProperty(exports, "generateId", { enumerable: true, get: function () { return utils_1.generateId; } });
44
+ Object.defineProperty(exports, "generateVisitorFingerprint", { enumerable: true, get: function () { return utils_1.generateVisitorFingerprint; } });
45
+ Object.defineProperty(exports, "calculateBackoff", { enumerable: true, get: function () { return utils_1.calculateBackoff; } });
46
+ Object.defineProperty(exports, "normalizeUrl", { enumerable: true, get: function () { return utils_1.normalizeUrl; } });
47
+ Object.defineProperty(exports, "httpToWsUrl", { enumerable: true, get: function () { return utils_1.httpToWsUrl; } });
48
+ Object.defineProperty(exports, "Logger", { enumerable: true, get: function () { return utils_1.Logger; } });
49
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAAA,kEAAkE;AAClE,8BAA8B;AAC9B,kEAAkE;;;AAElE;;;;;;;;;;;;;;;;;GAiBG;AAEH,cAAc;AACd,mCAAsC;AAA7B,oGAAA,UAAU,OAAA;AAoBnB,8CAA8C;AAC9C,yCAAiD;AAAxC,+GAAA,kBAAkB,OAAA;AAC3B,+BAAuC;AAA9B,qGAAA,aAAa,OAAA;AACtB,qCAA2C;AAAlC,yGAAA,cAAc,OAAA;AACvB,mCAA4C;AAAnC,0GAAA,gBAAgB,OAAA;AAEzB,YAAY;AACZ,mCAIkB;AAHhB,qGAAA,WAAW,OAAA;AACX,oGAAA,UAAU,OAAA;AACV,mGAAA,SAAS,OAAA;AAGX,iCAOiB;AANf,mGAAA,UAAU,OAAA;AACV,mHAAA,0BAA0B,OAAA;AAC1B,yGAAA,gBAAgB,OAAA;AAChB,qGAAA,YAAY,OAAA;AACZ,oGAAA,WAAW,OAAA;AACX,+FAAA,MAAM,OAAA"}
@@ -0,0 +1,75 @@
1
+ import type { SessionInfo } from './types';
2
+ /**
3
+ * Manages visitor sessions for the WAKZ embed chat.
4
+ * Each visitor gets a unique session that tracks their conversation.
5
+ */
6
+ export declare class SessionManager {
7
+ private session;
8
+ private visitorId;
9
+ private metadata;
10
+ private sessionStoreKey;
11
+ constructor(visitorId?: string, metadata?: Record<string, string>);
12
+ /**
13
+ * Get or create a session.
14
+ */
15
+ getSession(): Promise<SessionInfo>;
16
+ /**
17
+ * Create a new session.
18
+ */
19
+ private createSession;
20
+ /**
21
+ * Increment message count for the current session.
22
+ */
23
+ incrementMessageCount(): void;
24
+ /**
25
+ * End the current session.
26
+ */
27
+ endSession(): {
28
+ sessionId: string;
29
+ } | null;
30
+ /**
31
+ * Get the visitor ID.
32
+ */
33
+ getVisitorId(): string;
34
+ /**
35
+ * Update visitor metadata.
36
+ */
37
+ updateMetadata(newMeta: Record<string, string>): void;
38
+ /**
39
+ * Generate a unique visitor ID based on fingerprint.
40
+ */
41
+ private generateVisitorId;
42
+ /**
43
+ * Generate a unique session ID.
44
+ */
45
+ private generateSessionId;
46
+ /**
47
+ * Save session to localStorage (browser) or skip (server).
48
+ */
49
+ private saveSession;
50
+ /**
51
+ * Load session from storage.
52
+ */
53
+ private loadSession;
54
+ /**
55
+ * Clear stored session.
56
+ */
57
+ private clearStoredSession;
58
+ /**
59
+ * Save a value to the best available storage.
60
+ */
61
+ private saveToStorage;
62
+ /**
63
+ * Load a value from storage.
64
+ */
65
+ private loadFromStorage;
66
+ /**
67
+ * Remove a value from storage.
68
+ */
69
+ private removeFromStorage;
70
+ /**
71
+ * Destroy the session manager and clean up.
72
+ */
73
+ destroy(): void;
74
+ }
75
+ //# sourceMappingURL=session.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../src/session.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAI3C;;;GAGG;AACH,qBAAa,cAAc;IACzB,OAAO,CAAC,OAAO,CAA4B;IAC3C,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,QAAQ,CAAyB;IACzC,OAAO,CAAC,eAAe,CAAkB;gBAGvC,SAAS,CAAC,EAAE,MAAM,EAClB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;IAMnC;;OAEG;IACG,UAAU,IAAI,OAAO,CAAC,WAAW,CAAC;IAcxC;;OAEG;YACW,aAAa;IAiB3B;;OAEG;IACH,qBAAqB,IAAI,IAAI;IAQ7B;;OAEG;IACH,UAAU,IAAI;QAAE,SAAS,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI;IAY1C;;OAEG;IACH,YAAY,IAAI,MAAM;IAItB;;OAEG;IACH,cAAc,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI;IAQrD;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAUzB;;OAEG;YACW,iBAAiB;IAM/B;;OAEG;IACH,OAAO,CAAC,WAAW;IAQnB;;OAEG;IACH,OAAO,CAAC,WAAW;IAgBnB;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAQ1B;;OAEG;IACH,OAAO,CAAC,aAAa;IAQrB;;OAEG;IACH,OAAO,CAAC,eAAe;IAOvB;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAMzB;;OAEG;IACH,OAAO,IAAI,IAAI;CAIhB"}
@@ -0,0 +1,190 @@
1
+ "use strict";
2
+ // ═══════════════════════════════════════════════════════════════
3
+ // WAKZ SDK — Session Management
4
+ // ═══════════════════════════════════════════════════════════════
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.SessionManager = void 0;
7
+ const utils_1 = require("./utils");
8
+ const crypto_1 = require("./crypto");
9
+ /**
10
+ * Manages visitor sessions for the WAKZ embed chat.
11
+ * Each visitor gets a unique session that tracks their conversation.
12
+ */
13
+ class SessionManager {
14
+ constructor(visitorId, metadata) {
15
+ this.session = null;
16
+ this.sessionStoreKey = 'wakz_session';
17
+ this.metadata = metadata || {};
18
+ this.visitorId = visitorId || this.generateVisitorId();
19
+ }
20
+ /**
21
+ * Get or create a session.
22
+ */
23
+ async getSession() {
24
+ // Try to restore from storage
25
+ if (!this.session) {
26
+ this.session = this.loadSession();
27
+ }
28
+ // Create new if none found
29
+ if (!this.session || !this.session.isActive) {
30
+ this.session = await this.createSession();
31
+ }
32
+ return this.session;
33
+ }
34
+ /**
35
+ * Create a new session.
36
+ */
37
+ async createSession() {
38
+ const now = (0, utils_1.nowISO)();
39
+ const session = {
40
+ id: await this.generateSessionId(),
41
+ visitorId: this.visitorId,
42
+ messageCount: 0,
43
+ isActive: true,
44
+ startedAt: now,
45
+ lastActivityAt: now,
46
+ metadata: { ...this.metadata },
47
+ };
48
+ this.session = session;
49
+ this.saveSession(session);
50
+ return session;
51
+ }
52
+ /**
53
+ * Increment message count for the current session.
54
+ */
55
+ incrementMessageCount() {
56
+ if (this.session) {
57
+ this.session.messageCount++;
58
+ this.session.lastActivityAt = (0, utils_1.nowISO)();
59
+ this.saveSession(this.session);
60
+ }
61
+ }
62
+ /**
63
+ * End the current session.
64
+ */
65
+ endSession() {
66
+ if (this.session) {
67
+ this.session.isActive = false;
68
+ this.saveSession(this.session);
69
+ const sessionId = this.session.id;
70
+ this.session = null;
71
+ this.clearStoredSession();
72
+ return { sessionId };
73
+ }
74
+ return null;
75
+ }
76
+ /**
77
+ * Get the visitor ID.
78
+ */
79
+ getVisitorId() {
80
+ return this.visitorId;
81
+ }
82
+ /**
83
+ * Update visitor metadata.
84
+ */
85
+ updateMetadata(newMeta) {
86
+ this.metadata = { ...this.metadata, ...newMeta };
87
+ if (this.session) {
88
+ this.session.metadata = { ...this.session.metadata, ...newMeta };
89
+ this.saveSession(this.session);
90
+ }
91
+ }
92
+ /**
93
+ * Generate a unique visitor ID based on fingerprint.
94
+ */
95
+ generateVisitorId() {
96
+ const fingerprint = (0, utils_1.generateVisitorFingerprint)();
97
+ // Try to load existing visitor ID from storage
98
+ const stored = this.loadFromStorage('wakz_visitor_id');
99
+ if (stored)
100
+ return stored;
101
+ const newId = `v_${fingerprint.slice(0, 12)}`;
102
+ this.saveToStorage('wakz_visitor_id', newId);
103
+ return newId;
104
+ }
105
+ /**
106
+ * Generate a unique session ID.
107
+ */
108
+ async generateSessionId() {
109
+ const seed = `${this.visitorId}_${Date.now()}_${Math.random()}`;
110
+ const hash = await (0, crypto_1.simpleHash)(seed);
111
+ return `sess_${hash}`;
112
+ }
113
+ /**
114
+ * Save session to localStorage (browser) or skip (server).
115
+ */
116
+ saveSession(session) {
117
+ try {
118
+ this.saveToStorage(this.sessionStoreKey, JSON.stringify(session));
119
+ }
120
+ catch {
121
+ // Storage unavailable (SSR, sandbox)
122
+ }
123
+ }
124
+ /**
125
+ * Load session from storage.
126
+ */
127
+ loadSession() {
128
+ try {
129
+ const data = this.loadFromStorage(this.sessionStoreKey);
130
+ if (data) {
131
+ const parsed = JSON.parse(data);
132
+ // Validate it's a proper session object
133
+ if (parsed.id && parsed.visitorId) {
134
+ return parsed;
135
+ }
136
+ }
137
+ }
138
+ catch {
139
+ // Invalid or unavailable
140
+ }
141
+ return null;
142
+ }
143
+ /**
144
+ * Clear stored session.
145
+ */
146
+ clearStoredSession() {
147
+ try {
148
+ this.removeFromStorage(this.sessionStoreKey);
149
+ }
150
+ catch {
151
+ // Storage unavailable
152
+ }
153
+ }
154
+ /**
155
+ * Save a value to the best available storage.
156
+ */
157
+ saveToStorage(key, value) {
158
+ // Try localStorage (browser)
159
+ if (typeof localStorage !== 'undefined') {
160
+ localStorage.setItem(key, value);
161
+ return;
162
+ }
163
+ }
164
+ /**
165
+ * Load a value from storage.
166
+ */
167
+ loadFromStorage(key) {
168
+ if (typeof localStorage !== 'undefined') {
169
+ return localStorage.getItem(key);
170
+ }
171
+ return null;
172
+ }
173
+ /**
174
+ * Remove a value from storage.
175
+ */
176
+ removeFromStorage(key) {
177
+ if (typeof localStorage !== 'undefined') {
178
+ localStorage.removeItem(key);
179
+ }
180
+ }
181
+ /**
182
+ * Destroy the session manager and clean up.
183
+ */
184
+ destroy() {
185
+ this.endSession();
186
+ this.session = null;
187
+ }
188
+ }
189
+ exports.SessionManager = SessionManager;
190
+ //# sourceMappingURL=session.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session.js","sourceRoot":"","sources":["../src/session.ts"],"names":[],"mappings":"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"}