@corti/embedded-web 0.1.0-alpha.1 → 0.1.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.
- package/README.md +69 -41
- package/dist/CortiEmbedded.d.ts +9 -5
- package/dist/CortiEmbedded.js +30 -40
- package/dist/CortiEmbedded.js.map +1 -1
- package/dist/bundle.js +7 -7
- package/dist/index.d.ts +2 -3
- package/dist/index.js +3 -1
- package/dist/index.js.map +1 -1
- package/dist/react/CortiEmbeddedReact.d.ts +38 -15
- package/dist/react/CortiEmbeddedReact.js +95 -15
- package/dist/react/CortiEmbeddedReact.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/dist/types/api.d.ts +152 -0
- package/dist/types/api.js +3 -0
- package/dist/types/api.js.map +1 -0
- package/dist/types/config.d.ts +26 -0
- package/dist/types/config.js +3 -0
- package/dist/types/config.js.map +1 -0
- package/dist/types/events.d.ts +28 -0
- package/dist/types/events.js +2 -0
- package/dist/types/events.js.map +1 -0
- package/dist/types/generated/interview-details.d.ts +159 -0
- package/dist/types/generated/interview-details.js +4 -0
- package/dist/types/generated/interview-details.js.map +1 -0
- package/dist/types/index.d.ts +6 -0
- package/dist/types/index.js +14 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/payloads.d.ts +61 -0
- package/dist/types/payloads.js +2 -0
- package/dist/types/payloads.js.map +1 -0
- package/dist/types/protocol.d.ts +111 -0
- package/dist/types/protocol.js +3 -0
- package/dist/types/protocol.js.map +1 -0
- package/dist/types/responses.d.ts +48 -0
- package/dist/types/responses.js +3 -0
- package/dist/types/responses.js.map +1 -0
- package/dist/utils/PostMessageHandler.d.ts +11 -17
- package/dist/utils/PostMessageHandler.js +29 -40
- package/dist/utils/PostMessageHandler.js.map +1 -1
- package/dist/web-bundle.js +4 -4
- package/dist/web-index.d.ts +1 -1
- package/dist/web-index.js +2 -0
- package/dist/web-index.js.map +1 -1
- package/package.json +4 -3
- package/dist/internal-types.d.ts +0 -231
- package/dist/internal-types.js +0 -2
- package/dist/internal-types.js.map +0 -1
- package/dist/public-types.d.ts +0 -238
- package/dist/public-types.js +0 -2
- package/dist/public-types.js.map +0 -1
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import type { AppearanceConfig, FeaturesConfig, LocaleConfig, NetworkConfig } from "./config.js";
|
|
2
|
+
import type { EmbeddedInterviewDetails } from "./generated/interview-details.js";
|
|
3
|
+
export interface UserInfo {
|
|
4
|
+
id: string;
|
|
5
|
+
email: string;
|
|
6
|
+
name?: string;
|
|
7
|
+
[key: string]: unknown;
|
|
8
|
+
}
|
|
9
|
+
export interface AuthResponse {
|
|
10
|
+
user: UserInfo;
|
|
11
|
+
}
|
|
12
|
+
export interface CreateInteractionResponse {
|
|
13
|
+
id: string;
|
|
14
|
+
createdAt: string;
|
|
15
|
+
status?: string;
|
|
16
|
+
}
|
|
17
|
+
export interface EmbeddedTemplate {
|
|
18
|
+
id: string;
|
|
19
|
+
name: string;
|
|
20
|
+
description?: string;
|
|
21
|
+
language: {
|
|
22
|
+
code: string;
|
|
23
|
+
name: string;
|
|
24
|
+
locale?: string;
|
|
25
|
+
};
|
|
26
|
+
sections: Array<{
|
|
27
|
+
id: string;
|
|
28
|
+
title: string;
|
|
29
|
+
}>;
|
|
30
|
+
isCustom: boolean;
|
|
31
|
+
}
|
|
32
|
+
export interface GetStatusResponse {
|
|
33
|
+
auth: {
|
|
34
|
+
isAuthenticated: boolean;
|
|
35
|
+
user?: UserInfo;
|
|
36
|
+
};
|
|
37
|
+
currentUrl: string;
|
|
38
|
+
interaction: EmbeddedInterviewDetails | null;
|
|
39
|
+
}
|
|
40
|
+
export interface GetTemplatesResponse {
|
|
41
|
+
templates: EmbeddedTemplate[];
|
|
42
|
+
}
|
|
43
|
+
export interface ConfigureAppResponse {
|
|
44
|
+
appearance: AppearanceConfig;
|
|
45
|
+
features: FeaturesConfig;
|
|
46
|
+
locale: LocaleConfig;
|
|
47
|
+
network: NetworkConfig;
|
|
48
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"responses.js","sourceRoot":"","sources":["../../src/types/responses.ts"],"names":[],"mappings":"AAAA,kCAAkC","sourcesContent":["// Response types for embedded API\n\nimport type { AppearanceConfig, FeaturesConfig, LocaleConfig, NetworkConfig } from \"./config.js\";\nimport type { EmbeddedInterviewDetails } from \"./generated/interview-details.js\";\n\nexport interface UserInfo {\n id: string;\n email: string;\n name?: string;\n [key: string]: unknown;\n}\n\nexport interface AuthResponse {\n user: UserInfo;\n}\n\nexport interface CreateInteractionResponse {\n id: string;\n createdAt: string;\n status?: string;\n}\n\nexport interface EmbeddedTemplate {\n id: string;\n name: string;\n description?: string;\n language: {\n code: string;\n name: string;\n locale?: string;\n };\n sections: Array<{\n id: string;\n title: string;\n }>;\n isCustom: boolean;\n}\n\nexport interface GetStatusResponse {\n auth: {\n isAuthenticated: boolean;\n user?: UserInfo;\n };\n currentUrl: string;\n interaction: EmbeddedInterviewDetails | null;\n}\n\nexport interface GetTemplatesResponse {\n templates: EmbeddedTemplate[];\n}\n\nexport interface ConfigureAppResponse {\n appearance: AppearanceConfig;\n features: FeaturesConfig;\n locale: LocaleConfig;\n network: NetworkConfig;\n}\n"]}
|
|
@@ -1,20 +1,9 @@
|
|
|
1
|
-
import type {
|
|
2
|
-
import type { AddFactsPayload, AuthPayload, AuthResponse, ConfigureAppPayload, ConfigureAppResponsePayload, ConfigureSessionPayload, CreateInteractionResponse, EmbeddedRequest, EmbeddedResponse, GetStatusResponse, NavigatePayload, SetCredentialsPayload } from '../internal-types.js';
|
|
3
|
-
import type { EmbeddedEventData, InteractionPayload } from '../public-types.js';
|
|
1
|
+
import type { AddFactsPayload, AuthPayload, AuthResponse, ConfigureAppPayload, ConfigureAppResponse, ConfigureSessionPayload, CreateInteractionPayload, CreateInteractionResponse, EmbeddedRequest, EmbeddedResponse, GetStatusResponse, NavigatePayload, SetCredentialsPayload, GetTemplatesResponse } from '../types';
|
|
4
2
|
export interface PostMessageHandlerCallbacks {
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
onRecordingStarted?: () => void;
|
|
9
|
-
onRecordingStopped?: () => void;
|
|
10
|
-
onDocumentGenerated?: (payload: {
|
|
11
|
-
document: Corti.DocumentsGetResponse;
|
|
3
|
+
onEvent?: (event: {
|
|
4
|
+
name: string;
|
|
5
|
+
payload: unknown;
|
|
12
6
|
}) => void;
|
|
13
|
-
onDocumentUpdated?: (payload: {
|
|
14
|
-
document: Corti.DocumentsGetResponse;
|
|
15
|
-
}) => void;
|
|
16
|
-
onNavigationChanged?: (payload: any) => void;
|
|
17
|
-
onUsage?: (payload: EmbeddedEventData['usage']) => void;
|
|
18
7
|
onError?: (error: {
|
|
19
8
|
message: string;
|
|
20
9
|
code?: string;
|
|
@@ -82,7 +71,7 @@ export declare class PostMessageHandler {
|
|
|
82
71
|
* @param payload - Interaction creation payload
|
|
83
72
|
* @returns Promise that resolves with interaction details
|
|
84
73
|
*/
|
|
85
|
-
createInteraction(payload:
|
|
74
|
+
createInteraction(payload: CreateInteractionPayload): Promise<CreateInteractionResponse>;
|
|
86
75
|
/**
|
|
87
76
|
* Helper method to start recording
|
|
88
77
|
* @returns Promise that resolves when recording starts
|
|
@@ -103,13 +92,18 @@ export declare class PostMessageHandler {
|
|
|
103
92
|
* @param payload - Component configuration payload
|
|
104
93
|
* @returns Promise that resolves when configuration is applied
|
|
105
94
|
*/
|
|
106
|
-
configure(payload: ConfigureAppPayload): Promise<
|
|
95
|
+
configure(payload: ConfigureAppPayload): Promise<ConfigureAppResponse>;
|
|
107
96
|
/**
|
|
108
97
|
* Helper method to set credentials without triggering auth flow
|
|
109
98
|
* @param payload - Credentials payload
|
|
110
99
|
* @returns Promise that resolves when credentials are set
|
|
111
100
|
*/
|
|
112
101
|
setCredentials(payload: SetCredentialsPayload): Promise<void>;
|
|
102
|
+
/**
|
|
103
|
+
* Helper method to get templates
|
|
104
|
+
* @returns Promise that resolves with a list of templates
|
|
105
|
+
*/
|
|
106
|
+
getTemplates(): Promise<GetTemplatesResponse>;
|
|
113
107
|
private static generateRequestId;
|
|
114
108
|
/**
|
|
115
109
|
* Derive the trusted origin from the iframe src (constructed from baseURL).
|
|
@@ -35,43 +35,15 @@ export class PostMessageHandler {
|
|
|
35
35
|
const eventType = eventData.event;
|
|
36
36
|
const { payload } = eventData;
|
|
37
37
|
// Handle ready-like events
|
|
38
|
-
if (eventType === 'ready' ||
|
|
38
|
+
if (eventType === 'ready' ||
|
|
39
|
+
eventType === 'loaded' ||
|
|
40
|
+
eventType === 'embedded.ready') {
|
|
39
41
|
this.isReady = true;
|
|
40
42
|
}
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
this.callbacks.onReady?.();
|
|
46
|
-
break;
|
|
47
|
-
case 'authChanged':
|
|
48
|
-
this.callbacks.onAuthChanged?.(payload);
|
|
49
|
-
break;
|
|
50
|
-
case 'interactionCreated':
|
|
51
|
-
this.callbacks.onInteractionCreated?.(payload);
|
|
52
|
-
break;
|
|
53
|
-
case 'recordingStarted':
|
|
54
|
-
this.callbacks.onRecordingStarted?.();
|
|
55
|
-
break;
|
|
56
|
-
case 'recordingStopped':
|
|
57
|
-
this.callbacks.onRecordingStopped?.();
|
|
58
|
-
break;
|
|
59
|
-
case 'documentGenerated':
|
|
60
|
-
this.callbacks.onDocumentGenerated?.(payload);
|
|
61
|
-
break;
|
|
62
|
-
case 'documentUpdated':
|
|
63
|
-
this.callbacks.onDocumentUpdated?.(payload);
|
|
64
|
-
break;
|
|
65
|
-
case 'navigationChanged':
|
|
66
|
-
this.callbacks.onNavigationChanged?.(payload);
|
|
67
|
-
break;
|
|
68
|
-
case 'usage':
|
|
69
|
-
this.callbacks.onUsage?.(payload);
|
|
70
|
-
break;
|
|
71
|
-
default:
|
|
72
|
-
console.warn(`Unhandled event type: ${eventType}`);
|
|
73
|
-
break;
|
|
74
|
-
}
|
|
43
|
+
this.callbacks.onEvent?.({
|
|
44
|
+
name: eventType,
|
|
45
|
+
payload,
|
|
46
|
+
});
|
|
75
47
|
}
|
|
76
48
|
handleResponse(data) {
|
|
77
49
|
const pendingRequest = this.pendingRequests.get(data.requestId);
|
|
@@ -129,7 +101,9 @@ export class PostMessageHandler {
|
|
|
129
101
|
if (event.source === this.iframe.contentWindow &&
|
|
130
102
|
event.origin === this.getTrustedOrigin() &&
|
|
131
103
|
event.data?.type === 'CORTI_EMBEDDED_EVENT' &&
|
|
132
|
-
event.data.event === 'ready'
|
|
104
|
+
(event.data.event === 'ready' ||
|
|
105
|
+
event.data.event === 'loaded' ||
|
|
106
|
+
event.data.event === 'embedded.ready')) {
|
|
133
107
|
clearTimeout(timeoutId);
|
|
134
108
|
window.removeEventListener('message', readyListener);
|
|
135
109
|
resolve();
|
|
@@ -197,7 +171,7 @@ export class PostMessageHandler {
|
|
|
197
171
|
payload,
|
|
198
172
|
});
|
|
199
173
|
this.isReady = false;
|
|
200
|
-
if (response.payload &&
|
|
174
|
+
if (response.payload && response.success) {
|
|
201
175
|
return response.payload.user;
|
|
202
176
|
}
|
|
203
177
|
throw new Error(response.error);
|
|
@@ -253,7 +227,7 @@ export class PostMessageHandler {
|
|
|
253
227
|
action: 'createInteraction',
|
|
254
228
|
payload,
|
|
255
229
|
});
|
|
256
|
-
if (response.payload &&
|
|
230
|
+
if (response.payload && response.success) {
|
|
257
231
|
return response.payload;
|
|
258
232
|
}
|
|
259
233
|
throw new Error(response.error);
|
|
@@ -293,7 +267,7 @@ export class PostMessageHandler {
|
|
|
293
267
|
action: 'getStatus',
|
|
294
268
|
payload: {},
|
|
295
269
|
});
|
|
296
|
-
if (response.payload &&
|
|
270
|
+
if (response.payload && response.success) {
|
|
297
271
|
return response.payload;
|
|
298
272
|
}
|
|
299
273
|
throw new Error(response.error);
|
|
@@ -310,7 +284,7 @@ export class PostMessageHandler {
|
|
|
310
284
|
action: 'configure',
|
|
311
285
|
payload,
|
|
312
286
|
});
|
|
313
|
-
if (response.payload &&
|
|
287
|
+
if (response.payload && response.success) {
|
|
314
288
|
return response.payload;
|
|
315
289
|
}
|
|
316
290
|
throw new Error(response.error);
|
|
@@ -328,6 +302,21 @@ export class PostMessageHandler {
|
|
|
328
302
|
payload,
|
|
329
303
|
});
|
|
330
304
|
}
|
|
305
|
+
/**
|
|
306
|
+
* Helper method to get templates
|
|
307
|
+
* @returns Promise that resolves with a list of templates
|
|
308
|
+
*/
|
|
309
|
+
async getTemplates() {
|
|
310
|
+
const response = await this.postMessage({
|
|
311
|
+
type: 'CORTI_EMBEDDED',
|
|
312
|
+
version: 'v1',
|
|
313
|
+
action: 'getTemplates',
|
|
314
|
+
});
|
|
315
|
+
if (response.payload && response.success) {
|
|
316
|
+
return response.payload;
|
|
317
|
+
}
|
|
318
|
+
throw new Error(response.error);
|
|
319
|
+
}
|
|
331
320
|
static generateRequestId() {
|
|
332
321
|
return `req_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;
|
|
333
322
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PostMessageHandler.js","sourceRoot":"","sources":["../../src/utils/PostMessageHandler.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Corti } from '@corti/sdk';\nimport type {\n AddFactsPayload,\n AnyEmbeddedEvent,\n AuthPayload,\n AuthResponse,\n ConfigureAppPayload,\n ConfigureAppResponsePayload,\n ConfigureSessionPayload,\n CreateInteractionResponse,\n EmbeddedRequest,\n EmbeddedResponse,\n GetStatusResponse,\n NavigatePayload,\n SetCredentialsPayload,\n} from '../internal-types.js';\nimport type { EmbeddedEventData, InteractionPayload } from '../public-types.js';\n\nexport interface PostMessageHandlerCallbacks {\n onReady?: () => void;\n onAuthChanged?: (payload: any) => void;\n onInteractionCreated?: (payload: any) => void;\n onRecordingStarted?: () => void;\n onRecordingStopped?: () => void;\n onDocumentGenerated?: (payload: {\n document: Corti.DocumentsGetResponse;\n }) => void;\n onDocumentUpdated?: (payload: {\n document: Corti.DocumentsGetResponse;\n }) => void;\n onNavigationChanged?: (payload: any) => void;\n onUsage?: (payload: EmbeddedEventData['usage']) => void;\n onError?: (error: {\n message: string;\n code?: string;\n details?: unknown;\n }) => void;\n}\n\nexport class PostMessageHandler {\n private pendingRequests = new Map<\n string,\n { resolve: (value: any) => void; reject: (reason: any) => void }\n >();\n\n private messageListener: ((event: MessageEvent) => void) | null = null;\n\n private iframe: HTMLIFrameElement;\n\n private isReady = false;\n\n private callbacks: PostMessageHandlerCallbacks;\n\n constructor(\n iframe: HTMLIFrameElement,\n callbacks: PostMessageHandlerCallbacks = {},\n ) {\n this.iframe = iframe;\n this.callbacks = callbacks;\n this.setupMessageListener();\n }\n\n private setupMessageListener() {\n this.messageListener = (event: MessageEvent) => {\n // Only handle messages from our iframe\n if (event.source !== this.iframe.contentWindow) {\n return;\n }\n\n // Enforce origin to match the trusted iframe origin\n const trustedOrigin = this.getTrustedOrigin();\n if (!trustedOrigin || event.origin !== trustedOrigin) {\n return;\n }\n\n const { data } = event;\n\n // Check for Corti embedded events\n if (data?.type === 'CORTI_EMBEDDED_EVENT') {\n this.handleEvent(data);\n return;\n }\n\n // Check if this is a response to a pending request\n if (data.requestId && this.pendingRequests.has(data.requestId)) {\n this.handleResponse(data);\n }\n };\n\n window.addEventListener('message', this.messageListener);\n }\n\n private handleEvent(eventData: AnyEmbeddedEvent): void {\n const eventType = (eventData as any).event;\n const { payload } = eventData;\n\n // Handle ready-like events\n if (eventType === 'ready' || eventType === 'loaded') {\n this.isReady = true;\n }\n\n // Handle specific events with callbacks\n switch (eventType) {\n case 'ready':\n case 'loaded':\n this.callbacks.onReady?.();\n break;\n case 'authChanged':\n this.callbacks.onAuthChanged?.(payload);\n break;\n case 'interactionCreated':\n this.callbacks.onInteractionCreated?.(payload);\n break;\n case 'recordingStarted':\n this.callbacks.onRecordingStarted?.();\n break;\n case 'recordingStopped':\n this.callbacks.onRecordingStopped?.();\n break;\n case 'documentGenerated':\n this.callbacks.onDocumentGenerated?.(\n payload as EmbeddedEventData['document-generated'],\n );\n break;\n case 'documentUpdated':\n this.callbacks.onDocumentUpdated?.(\n payload as EmbeddedEventData['document-updated'],\n );\n break;\n case 'navigationChanged':\n this.callbacks.onNavigationChanged?.(payload);\n break;\n case 'usage':\n this.callbacks.onUsage?.(payload as EmbeddedEventData['usage']);\n break;\n default:\n console.warn(`Unhandled event type: ${eventType}`);\n break;\n }\n }\n\n private handleResponse(data: any): void {\n const pendingRequest = this.pendingRequests.get(data.requestId);\n if (pendingRequest) {\n const { resolve, reject } = pendingRequest;\n this.pendingRequests.delete(data.requestId);\n\n if (data.success === false || data.error) {\n const error = {\n message: data.error || 'Request failed',\n code: data.errorCode,\n details: data.errorDetails,\n };\n this.callbacks.onError?.(error);\n reject(error);\n } else {\n resolve(data);\n }\n }\n }\n\n destroy() {\n if (this.messageListener) {\n window.removeEventListener('message', this.messageListener);\n this.messageListener = null;\n }\n this.pendingRequests.clear();\n }\n\n /**\n * Update callbacks after construction\n */\n updateCallbacks(callbacks: PostMessageHandlerCallbacks) {\n this.callbacks = { ...this.callbacks, ...callbacks };\n }\n\n /**\n * Check if the iframe is ready to receive postMessages\n */\n get ready(): boolean {\n return this.isReady;\n }\n\n /**\n * Wait for the iframe to be ready\n * @param timeout - Optional timeout in milliseconds (default: 30000ms)\n * @returns Promise that resolves when ready\n */\n async waitForReady(timeout = 30000): Promise<void> {\n if (this.isReady) {\n return Promise.resolve();\n }\n\n return new Promise((resolve, reject) => {\n const timeoutId = setTimeout(() => {\n reject(new Error('Timeout waiting for iframe to be ready'));\n }, timeout);\n\n // Create a one-time listener for the ready event\n const readyListener = (event: MessageEvent) => {\n if (\n event.source === this.iframe.contentWindow &&\n event.origin === this.getTrustedOrigin() &&\n event.data?.type === 'CORTI_EMBEDDED_EVENT' &&\n event.data.event === 'ready'\n ) {\n clearTimeout(timeoutId);\n window.removeEventListener('message', readyListener);\n resolve();\n }\n };\n\n window.addEventListener('message', readyListener);\n });\n }\n\n /**\n * Sends a postMessage to the iframe and returns a Promise that resolves with the response\n * @param message - The message to send\n * @param timeout - Optional timeout in milliseconds (default: 10000ms)\n * @returns Promise that resolves with the response\n */\n async postMessage(\n message: Omit<EmbeddedRequest, 'requestId'>,\n timeout = 10000,\n ): Promise<EmbeddedResponse> {\n if (!this.iframe.contentWindow) {\n throw new Error('Iframe not ready');\n }\n\n // Ensure the iframe has signaled readiness before sending\n await this.waitForReady();\n\n const { contentWindow } = this.iframe;\n const requestId = PostMessageHandler.generateRequestId();\n\n return new Promise((resolve, reject) => {\n // Set up timeout\n const timeoutId = setTimeout(() => {\n this.pendingRequests.delete(requestId);\n reject(new Error('Request timeout'));\n }, timeout);\n\n // Store the promise handlers\n const handlers = {\n resolve: (value: any) => {\n clearTimeout(timeoutId);\n resolve(value);\n },\n reject: (reason: any) => {\n clearTimeout(timeoutId);\n reject(reason);\n },\n };\n\n this.pendingRequests.set(requestId, handlers);\n\n // Send the message\n const fullMessage: EmbeddedRequest = {\n ...message,\n requestId,\n };\n\n const targetOrigin = this.getTrustedOrigin();\n if (!targetOrigin) {\n this.pendingRequests.delete(requestId);\n reject(new Error('Cannot determine trusted origin for postMessage'));\n return;\n }\n contentWindow.postMessage(fullMessage, targetOrigin);\n });\n }\n\n /**\n * Helper method to send an auth message and return clean user data\n * @param payload - Auth payload\n * @returns Promise that resolves with user data\n */\n async auth(payload: AuthPayload): Promise<AuthResponse['user']> {\n const response = await this.postMessage({\n type: 'CORTI_EMBEDDED',\n version: 'v1',\n action: 'auth',\n payload,\n });\n this.isReady = false;\n\n if (response.payload && typeof response.success) {\n return (response.payload as AuthResponse).user;\n }\n throw new Error(response.error);\n }\n\n /**\n * Helper method to configure a session\n * @param payload - Session configuration payload\n * @returns Promise that resolves when configuration is complete\n */\n async configureSession(payload: ConfigureSessionPayload): Promise<void> {\n await this.postMessage({\n type: 'CORTI_EMBEDDED',\n version: 'v1',\n action: 'configureSession',\n payload,\n });\n }\n\n /**\n * Helper method to navigate to a specific path\n * @param payload - Navigation payload\n * @returns Promise that resolves when navigation is complete\n */\n async navigate(payload: NavigatePayload): Promise<void> {\n await this.postMessage({\n type: 'CORTI_EMBEDDED',\n version: 'v1',\n action: 'navigate',\n payload,\n });\n }\n\n /**\n * Helper method to add facts to the session\n * @param payload - Facts payload\n * @returns Promise that resolves when facts are added\n */\n async addFacts(payload: AddFactsPayload): Promise<void> {\n await this.postMessage({\n type: 'CORTI_EMBEDDED',\n version: 'v1',\n action: 'addFacts',\n payload,\n });\n }\n\n /**\n * Helper method to create a new interaction and return clean interaction data\n * @param payload - Interaction creation payload\n * @returns Promise that resolves with interaction details\n */\n async createInteraction(\n payload: InteractionPayload,\n ): Promise<CreateInteractionResponse> {\n const response = await this.postMessage({\n type: 'CORTI_EMBEDDED',\n version: 'v1',\n action: 'createInteraction',\n payload,\n });\n\n if (response.payload && typeof response.success) {\n return response.payload as CreateInteractionResponse;\n }\n throw new Error(response.error);\n }\n\n /**\n * Helper method to start recording\n * @returns Promise that resolves when recording starts\n */\n async startRecording(): Promise<void> {\n await this.postMessage({\n type: 'CORTI_EMBEDDED',\n version: 'v1',\n action: 'startRecording',\n payload: {},\n });\n }\n\n /**\n * Helper method to stop recording\n * @returns Promise that resolves when recording stops\n */\n async stopRecording(): Promise<void> {\n await this.postMessage({\n type: 'CORTI_EMBEDDED',\n version: 'v1',\n action: 'stopRecording',\n payload: {},\n });\n }\n\n /**\n * Helper method to get current status\n * @returns Promise that resolves with current status\n */\n async getStatus(): Promise<GetStatusResponse> {\n const response = await this.postMessage({\n type: 'CORTI_EMBEDDED',\n version: 'v1',\n action: 'getStatus',\n payload: {},\n });\n\n if (response.payload && typeof response.success) {\n return response.payload as GetStatusResponse;\n }\n throw new Error(response.error);\n }\n\n /**\n * Helper method to configure the component\n * @param payload - Component configuration payload\n * @returns Promise that resolves when configuration is applied\n */\n async configure(\n payload: ConfigureAppPayload,\n ): Promise<ConfigureAppResponsePayload> {\n const response = await this.postMessage({\n type: 'CORTI_EMBEDDED',\n version: 'v1',\n action: 'configure',\n payload,\n });\n\n if (response.payload && typeof response.success) {\n return response.payload as ConfigureAppResponsePayload;\n }\n throw new Error(response.error);\n }\n\n /**\n * Helper method to set credentials without triggering auth flow\n * @param payload - Credentials payload\n * @returns Promise that resolves when credentials are set\n */\n async setCredentials(payload: SetCredentialsPayload): Promise<void> {\n await this.postMessage({\n type: 'CORTI_EMBEDDED',\n version: 'v1',\n action: 'setCredentials',\n payload,\n });\n }\n\n private static generateRequestId(): string {\n return `req_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;\n }\n\n /**\n * Derive the trusted origin from the iframe src (constructed from baseURL).\n * Returns null if it cannot be determined.\n */\n private getTrustedOrigin(): string | null {\n try {\n // If iframe.src is relative, URL() will resolve against the current location.\n // Embeds should provide an absolute baseURL; enforcing strict origin here.\n const src = this.iframe.getAttribute('src') || this.iframe.src;\n if (!src) return null;\n const url = new URL(src, window.location.href);\n return url.origin;\n } catch {\n return null;\n }\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"PostMessageHandler.js","sourceRoot":"","sources":["../../src/utils/PostMessageHandler.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n AddFactsPayload,\n AnyEvent,\n AuthPayload,\n AuthResponse,\n ConfigureAppPayload,\n ConfigureAppResponse,\n ConfigureSessionPayload,\n CreateInteractionPayload,\n CreateInteractionResponse,\n EmbeddedRequest,\n EmbeddedResponse,\n GetStatusResponse,\n NavigatePayload,\n SetCredentialsPayload,\n GetTemplatesResponse,\n} from '../types';\n\nexport interface PostMessageHandlerCallbacks {\n onEvent?: (event: { name: string; payload: unknown }) => void;\n onError?: (error: {\n message: string;\n code?: string;\n details?: unknown;\n }) => void;\n}\n\nexport class PostMessageHandler {\n private pendingRequests = new Map<\n string,\n { resolve: (value: any) => void; reject: (reason: any) => void }\n >();\n\n private messageListener: ((event: MessageEvent) => void) | null = null;\n\n private iframe: HTMLIFrameElement;\n\n private isReady = false;\n\n private callbacks: PostMessageHandlerCallbacks;\n\n constructor(\n iframe: HTMLIFrameElement,\n callbacks: PostMessageHandlerCallbacks = {},\n ) {\n this.iframe = iframe;\n this.callbacks = callbacks;\n this.setupMessageListener();\n }\n\n private setupMessageListener() {\n this.messageListener = (event: MessageEvent) => {\n // Only handle messages from our iframe\n if (event.source !== this.iframe.contentWindow) {\n return;\n }\n\n // Enforce origin to match the trusted iframe origin\n const trustedOrigin = this.getTrustedOrigin();\n if (!trustedOrigin || event.origin !== trustedOrigin) {\n return;\n }\n\n const { data } = event;\n\n // Check for Corti embedded events\n if (data?.type === 'CORTI_EMBEDDED_EVENT') {\n this.handleEvent(data);\n return;\n }\n\n // Check if this is a response to a pending request\n if (data.requestId && this.pendingRequests.has(data.requestId)) {\n this.handleResponse(data);\n }\n };\n\n window.addEventListener('message', this.messageListener);\n }\n\n private handleEvent(eventData: AnyEvent): void {\n const eventType = (eventData as any).event;\n const { payload } = eventData;\n\n // Handle ready-like events\n if (\n eventType === 'ready' ||\n eventType === 'loaded' ||\n eventType === 'embedded.ready'\n ) {\n this.isReady = true;\n }\n\n this.callbacks.onEvent?.({\n name: eventType,\n payload,\n });\n }\n\n private handleResponse(data: any): void {\n const pendingRequest = this.pendingRequests.get(data.requestId);\n if (pendingRequest) {\n const { resolve, reject } = pendingRequest;\n this.pendingRequests.delete(data.requestId);\n\n if (data.success === false || data.error) {\n const error = {\n message: data.error || 'Request failed',\n code: data.errorCode,\n details: data.errorDetails,\n };\n this.callbacks.onError?.(error);\n reject(error);\n } else {\n resolve(data);\n }\n }\n }\n\n destroy() {\n if (this.messageListener) {\n window.removeEventListener('message', this.messageListener);\n this.messageListener = null;\n }\n this.pendingRequests.clear();\n }\n\n /**\n * Update callbacks after construction\n */\n updateCallbacks(callbacks: PostMessageHandlerCallbacks) {\n this.callbacks = { ...this.callbacks, ...callbacks };\n }\n\n /**\n * Check if the iframe is ready to receive postMessages\n */\n get ready(): boolean {\n return this.isReady;\n }\n\n /**\n * Wait for the iframe to be ready\n * @param timeout - Optional timeout in milliseconds (default: 30000ms)\n * @returns Promise that resolves when ready\n */\n async waitForReady(timeout = 30000): Promise<void> {\n if (this.isReady) {\n return Promise.resolve();\n }\n\n return new Promise((resolve, reject) => {\n const timeoutId = setTimeout(() => {\n reject(new Error('Timeout waiting for iframe to be ready'));\n }, timeout);\n\n // Create a one-time listener for the ready event\n const readyListener = (event: MessageEvent) => {\n if (\n event.source === this.iframe.contentWindow &&\n event.origin === this.getTrustedOrigin() &&\n event.data?.type === 'CORTI_EMBEDDED_EVENT' &&\n (event.data.event === 'ready' ||\n event.data.event === 'loaded' ||\n event.data.event === 'embedded.ready')\n ) {\n clearTimeout(timeoutId);\n window.removeEventListener('message', readyListener);\n resolve();\n }\n };\n\n window.addEventListener('message', readyListener);\n });\n }\n\n /**\n * Sends a postMessage to the iframe and returns a Promise that resolves with the response\n * @param message - The message to send\n * @param timeout - Optional timeout in milliseconds (default: 10000ms)\n * @returns Promise that resolves with the response\n */\n async postMessage(\n message: Omit<EmbeddedRequest, 'requestId'>,\n timeout = 10000,\n ): Promise<EmbeddedResponse> {\n if (!this.iframe.contentWindow) {\n throw new Error('Iframe not ready');\n }\n\n // Ensure the iframe has signaled readiness before sending\n await this.waitForReady();\n\n const { contentWindow } = this.iframe;\n const requestId = PostMessageHandler.generateRequestId();\n\n return new Promise((resolve, reject) => {\n // Set up timeout\n const timeoutId = setTimeout(() => {\n this.pendingRequests.delete(requestId);\n reject(new Error('Request timeout'));\n }, timeout);\n\n // Store the promise handlers\n const handlers = {\n resolve: (value: any) => {\n clearTimeout(timeoutId);\n resolve(value);\n },\n reject: (reason: any) => {\n clearTimeout(timeoutId);\n reject(reason);\n },\n };\n\n this.pendingRequests.set(requestId, handlers);\n\n // Send the message\n const fullMessage: EmbeddedRequest = {\n ...message,\n requestId,\n };\n\n const targetOrigin = this.getTrustedOrigin();\n if (!targetOrigin) {\n this.pendingRequests.delete(requestId);\n reject(new Error('Cannot determine trusted origin for postMessage'));\n return;\n }\n contentWindow.postMessage(fullMessage, targetOrigin);\n });\n }\n\n /**\n * Helper method to send an auth message and return clean user data\n * @param payload - Auth payload\n * @returns Promise that resolves with user data\n */\n async auth(payload: AuthPayload): Promise<AuthResponse['user']> {\n const response = await this.postMessage({\n type: 'CORTI_EMBEDDED',\n version: 'v1',\n action: 'auth',\n payload,\n });\n this.isReady = false;\n\n if (response.payload && response.success) {\n return (response.payload as AuthResponse).user;\n }\n throw new Error(response.error);\n }\n\n /**\n * Helper method to configure a session\n * @param payload - Session configuration payload\n * @returns Promise that resolves when configuration is complete\n */\n async configureSession(payload: ConfigureSessionPayload): Promise<void> {\n await this.postMessage({\n type: 'CORTI_EMBEDDED',\n version: 'v1',\n action: 'configureSession',\n payload,\n });\n }\n\n /**\n * Helper method to navigate to a specific path\n * @param payload - Navigation payload\n * @returns Promise that resolves when navigation is complete\n */\n async navigate(payload: NavigatePayload): Promise<void> {\n await this.postMessage({\n type: 'CORTI_EMBEDDED',\n version: 'v1',\n action: 'navigate',\n payload,\n });\n }\n\n /**\n * Helper method to add facts to the session\n * @param payload - Facts payload\n * @returns Promise that resolves when facts are added\n */\n async addFacts(payload: AddFactsPayload): Promise<void> {\n await this.postMessage({\n type: 'CORTI_EMBEDDED',\n version: 'v1',\n action: 'addFacts',\n payload,\n });\n }\n\n /**\n * Helper method to create a new interaction and return clean interaction data\n * @param payload - Interaction creation payload\n * @returns Promise that resolves with interaction details\n */\n async createInteraction(\n payload: CreateInteractionPayload,\n ): Promise<CreateInteractionResponse> {\n const response = await this.postMessage({\n type: 'CORTI_EMBEDDED',\n version: 'v1',\n action: 'createInteraction',\n payload,\n });\n\n if (response.payload && response.success) {\n return response.payload as CreateInteractionResponse;\n }\n throw new Error(response.error);\n }\n\n /**\n * Helper method to start recording\n * @returns Promise that resolves when recording starts\n */\n async startRecording(): Promise<void> {\n await this.postMessage({\n type: 'CORTI_EMBEDDED',\n version: 'v1',\n action: 'startRecording',\n payload: {},\n });\n }\n\n /**\n * Helper method to stop recording\n * @returns Promise that resolves when recording stops\n */\n async stopRecording(): Promise<void> {\n await this.postMessage({\n type: 'CORTI_EMBEDDED',\n version: 'v1',\n action: 'stopRecording',\n payload: {},\n });\n }\n\n /**\n * Helper method to get current status\n * @returns Promise that resolves with current status\n */\n async getStatus(): Promise<GetStatusResponse> {\n const response = await this.postMessage({\n type: 'CORTI_EMBEDDED',\n version: 'v1',\n action: 'getStatus',\n payload: {},\n });\n\n if (response.payload && response.success) {\n return response.payload as GetStatusResponse;\n }\n throw new Error(response.error);\n }\n\n /**\n * Helper method to configure the component\n * @param payload - Component configuration payload\n * @returns Promise that resolves when configuration is applied\n */\n async configure(payload: ConfigureAppPayload): Promise<ConfigureAppResponse> {\n const response = await this.postMessage({\n type: 'CORTI_EMBEDDED',\n version: 'v1',\n action: 'configure',\n payload,\n });\n\n if (response.payload && response.success) {\n return response.payload as ConfigureAppResponse;\n }\n throw new Error(response.error);\n }\n\n /**\n * Helper method to set credentials without triggering auth flow\n * @param payload - Credentials payload\n * @returns Promise that resolves when credentials are set\n */\n async setCredentials(payload: SetCredentialsPayload): Promise<void> {\n await this.postMessage({\n type: 'CORTI_EMBEDDED',\n version: 'v1',\n action: 'setCredentials',\n payload,\n });\n }\n\n /**\n * Helper method to get templates\n * @returns Promise that resolves with a list of templates\n */\n async getTemplates(): Promise<GetTemplatesResponse> {\n const response = await this.postMessage({\n type: 'CORTI_EMBEDDED',\n version: 'v1',\n action: 'getTemplates',\n });\n\n if (response.payload && response.success) {\n return response.payload as GetTemplatesResponse;\n }\n throw new Error(response.error);\n }\n\n private static generateRequestId(): string {\n return `req_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;\n }\n\n /**\n * Derive the trusted origin from the iframe src (constructed from baseURL).\n * Returns null if it cannot be determined.\n */\n private getTrustedOrigin(): string | null {\n try {\n // If iframe.src is relative, URL() will resolve against the current location.\n // Embeds should provide an absolute baseURL; enforcing strict origin here.\n const src = this.iframe.getAttribute('src') || this.iframe.src;\n if (!src) return null;\n const url = new URL(src, window.location.href);\n return url.origin;\n } catch {\n return null;\n }\n }\n}\n"]}
|
package/dist/web-bundle.js
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
var
|
|
1
|
+
var D=globalThis,I=D.ShadowRoot&&(D.ShadyCSS===void 0||D.ShadyCSS.nativeShadow)&&"adoptedStyleSheets"in Document.prototype&&"replace"in CSSStyleSheet.prototype,V=Symbol(),dt=new WeakMap,R=class{constructor(t,e,s){if(this._$cssResult$=!0,s!==V)throw Error("CSSResult is not constructable. Use `unsafeCSS` or `css` instead.");this.cssText=t,this.t=e}get styleSheet(){let t=this.o,e=this.t;if(I&&t===void 0){let s=e!==void 0&&e.length===1;s&&(t=dt.get(e)),t===void 0&&((this.o=t=new CSSStyleSheet).replaceSync(this.cssText),s&&dt.set(e,t))}return t}toString(){return this.cssText}},ct=r=>new R(typeof r=="string"?r:r+"",void 0,V),x=(r,...t)=>{let e=r.length===1?r[0]:t.reduce(((s,i,o)=>s+(n=>{if(n._$cssResult$===!0)return n.cssText;if(typeof n=="number")return n;throw Error("Value passed to 'css' function must be a 'css' function result: "+n+". Use 'unsafeCSS' to pass non-literal values, but take care to ensure page security.")})(i)+r[o+1]),r[0]);return new R(e,r,V)},ht=(r,t)=>{if(I)r.adoptedStyleSheets=t.map((e=>e instanceof CSSStyleSheet?e:e.styleSheet));else for(let e of t){let s=document.createElement("style"),i=D.litNonce;i!==void 0&&s.setAttribute("nonce",i),s.textContent=e.cssText,r.appendChild(s)}},J=I?r=>r:r=>r instanceof CSSStyleSheet?(t=>{let e="";for(let s of t.cssRules)e+=s.cssText;return ct(e)})(r):r;var{is:Ct,defineProperty:Ut,getOwnPropertyDescriptor:Ot,getOwnPropertyNames:Ht,getOwnPropertySymbols:Lt,getPrototypeOf:Pt}=Object,N=globalThis,lt=N.trustedTypes,Tt=lt?lt.emptyScript:"",Dt=N.reactiveElementPolyfillSupport,M=(r,t)=>r,C={toAttribute(r,t){switch(t){case Boolean:r=r?Tt:null;break;case Object:case Array:r=r==null?r:JSON.stringify(r)}return r},fromAttribute(r,t){let e=r;switch(t){case Boolean:e=r!==null;break;case Number:e=r===null?null:Number(r);break;case Object:case Array:try{e=JSON.parse(r)}catch{e=null}}return e}},q=(r,t)=>!Ct(r,t),pt={attribute:!0,type:String,converter:C,reflect:!1,useDefault:!1,hasChanged:q};Symbol.metadata??=Symbol("metadata"),N.litPropertyMetadata??=new WeakMap;var m=class extends HTMLElement{static addInitializer(t){this._$Ei(),(this.l??=[]).push(t)}static get observedAttributes(){return this.finalize(),this._$Eh&&[...this._$Eh.keys()]}static createProperty(t,e=pt){if(e.state&&(e.attribute=!1),this._$Ei(),this.prototype.hasOwnProperty(t)&&((e=Object.create(e)).wrapped=!0),this.elementProperties.set(t,e),!e.noAccessor){let s=Symbol(),i=this.getPropertyDescriptor(t,s,e);i!==void 0&&Ut(this.prototype,t,i)}}static getPropertyDescriptor(t,e,s){let{get:i,set:o}=Ot(this.prototype,t)??{get(){return this[e]},set(n){this[e]=n}};return{get:i,set(n){let d=i?.call(this);o?.call(this,n),this.requestUpdate(t,d,s)},configurable:!0,enumerable:!0}}static getPropertyOptions(t){return this.elementProperties.get(t)??pt}static _$Ei(){if(this.hasOwnProperty(M("elementProperties")))return;let t=Pt(this);t.finalize(),t.l!==void 0&&(this.l=[...t.l]),this.elementProperties=new Map(t.elementProperties)}static finalize(){if(this.hasOwnProperty(M("finalized")))return;if(this.finalized=!0,this._$Ei(),this.hasOwnProperty(M("properties"))){let e=this.properties,s=[...Ht(e),...Lt(e)];for(let i of s)this.createProperty(i,e[i])}let t=this[Symbol.metadata];if(t!==null){let e=litPropertyMetadata.get(t);if(e!==void 0)for(let[s,i]of e)this.elementProperties.set(s,i)}this._$Eh=new Map;for(let[e,s]of this.elementProperties){let i=this._$Eu(e,s);i!==void 0&&this._$Eh.set(i,e)}this.elementStyles=this.finalizeStyles(this.styles)}static finalizeStyles(t){let e=[];if(Array.isArray(t)){let s=new Set(t.flat(1/0).reverse());for(let i of s)e.unshift(J(i))}else t!==void 0&&e.push(J(t));return e}static _$Eu(t,e){let s=e.attribute;return s===!1?void 0:typeof s=="string"?s:typeof t=="string"?t.toLowerCase():void 0}constructor(){super(),this._$Ep=void 0,this.isUpdatePending=!1,this.hasUpdated=!1,this._$Em=null,this._$Ev()}_$Ev(){this._$ES=new Promise((t=>this.enableUpdating=t)),this._$AL=new Map,this._$E_(),this.requestUpdate(),this.constructor.l?.forEach((t=>t(this)))}addController(t){(this._$EO??=new Set).add(t),this.renderRoot!==void 0&&this.isConnected&&t.hostConnected?.()}removeController(t){this._$EO?.delete(t)}_$E_(){let t=new Map,e=this.constructor.elementProperties;for(let s of e.keys())this.hasOwnProperty(s)&&(t.set(s,this[s]),delete this[s]);t.size>0&&(this._$Ep=t)}createRenderRoot(){let t=this.shadowRoot??this.attachShadow(this.constructor.shadowRootOptions);return ht(t,this.constructor.elementStyles),t}connectedCallback(){this.renderRoot??=this.createRenderRoot(),this.enableUpdating(!0),this._$EO?.forEach((t=>t.hostConnected?.()))}enableUpdating(t){}disconnectedCallback(){this._$EO?.forEach((t=>t.hostDisconnected?.()))}attributeChangedCallback(t,e,s){this._$AK(t,s)}_$ET(t,e){let s=this.constructor.elementProperties.get(t),i=this.constructor._$Eu(t,s);if(i!==void 0&&s.reflect===!0){let o=(s.converter?.toAttribute!==void 0?s.converter:C).toAttribute(e,s.type);this._$Em=t,o==null?this.removeAttribute(i):this.setAttribute(i,o),this._$Em=null}}_$AK(t,e){let s=this.constructor,i=s._$Eh.get(t);if(i!==void 0&&this._$Em!==i){let o=s.getPropertyOptions(i),n=typeof o.converter=="function"?{fromAttribute:o.converter}:o.converter?.fromAttribute!==void 0?o.converter:C;this._$Em=i;let d=n.fromAttribute(e,o.type);this[i]=d??this._$Ej?.get(i)??d,this._$Em=null}}requestUpdate(t,e,s){if(t!==void 0){let i=this.constructor,o=this[t];if(s??=i.getPropertyOptions(t),!((s.hasChanged??q)(o,e)||s.useDefault&&s.reflect&&o===this._$Ej?.get(t)&&!this.hasAttribute(i._$Eu(t,s))))return;this.C(t,e,s)}this.isUpdatePending===!1&&(this._$ES=this._$EP())}C(t,e,{useDefault:s,reflect:i,wrapped:o},n){s&&!(this._$Ej??=new Map).has(t)&&(this._$Ej.set(t,n??e??this[t]),o!==!0||n!==void 0)||(this._$AL.has(t)||(this.hasUpdated||s||(e=void 0),this._$AL.set(t,e)),i===!0&&this._$Em!==t&&(this._$Eq??=new Set).add(t))}async _$EP(){this.isUpdatePending=!0;try{await this._$ES}catch(e){Promise.reject(e)}let t=this.scheduleUpdate();return t!=null&&await t,!this.isUpdatePending}scheduleUpdate(){return this.performUpdate()}performUpdate(){if(!this.isUpdatePending)return;if(!this.hasUpdated){if(this.renderRoot??=this.createRenderRoot(),this._$Ep){for(let[i,o]of this._$Ep)this[i]=o;this._$Ep=void 0}let s=this.constructor.elementProperties;if(s.size>0)for(let[i,o]of s){let{wrapped:n}=o,d=this[i];n!==!0||this._$AL.has(i)||d===void 0||this.C(i,void 0,o,d)}}let t=!1,e=this._$AL;try{t=this.shouldUpdate(e),t?(this.willUpdate(e),this._$EO?.forEach((s=>s.hostUpdate?.())),this.update(e)):this._$EM()}catch(s){throw t=!1,this._$EM(),s}t&&this._$AE(e)}willUpdate(t){}_$AE(t){this._$EO?.forEach((e=>e.hostUpdated?.())),this.hasUpdated||(this.hasUpdated=!0,this.firstUpdated(t)),this.updated(t)}_$EM(){this._$AL=new Map,this.isUpdatePending=!1}get updateComplete(){return this.getUpdateComplete()}getUpdateComplete(){return this._$ES}shouldUpdate(t){return!0}update(t){this._$Eq&&=this._$Eq.forEach((e=>this._$ET(e,this[e]))),this._$EM()}updated(t){}firstUpdated(t){}};m.elementStyles=[],m.shadowRootOptions={mode:"open"},m[M("elementProperties")]=new Map,m[M("finalized")]=new Map,Dt?.({ReactiveElement:m}),(N.reactiveElementVersions??=[]).push("2.1.1");var tt=globalThis,k=tt.trustedTypes,ut=k?k.createPolicy("lit-html",{createHTML:r=>r}):void 0,$t="$lit$",y=`lit$${Math.random().toFixed(9).slice(2)}$`,_t="?"+y,It=`<${_t}>`,w=document,O=()=>w.createComment(""),H=r=>r===null||typeof r!="object"&&typeof r!="function",et=Array.isArray,Nt=r=>et(r)||typeof r?.[Symbol.iterator]=="function",K=`[
|
|
2
2
|
\f\r]`,U=/<(?:(!--|\/[^a-zA-Z])|(\/?[a-zA-Z][^>\s]*)|(\/?$))/g,ft=/-->/g,mt=/>/g,_=RegExp(`>|${K}(?:([^\\s"'>=/]+)(${K}*=${K}*(?:[^
|
|
3
|
-
\f\r"'\`<>=]|("|')|))|$)`,"g"),gt=/'/g,yt=/"/g,vt=/^(?:script|style|textarea|title)$/i,st=r=>(t,...e)=>({_$litType$:r,strings:t,values:e}),rt=st(1),
|
|
3
|
+
\f\r"'\`<>=]|("|')|))|$)`,"g"),gt=/'/g,yt=/"/g,vt=/^(?:script|style|textarea|title)$/i,st=r=>(t,...e)=>({_$litType$:r,strings:t,values:e}),rt=st(1),Zt=st(2),Gt=st(3),b=Symbol.for("lit-noChange"),p=Symbol.for("lit-nothing"),Et=new WeakMap,v=w.createTreeWalker(w,129);function wt(r,t){if(!et(r)||!r.hasOwnProperty("raw"))throw Error("invalid template strings array");return ut!==void 0?ut.createHTML(t):t}var qt=(r,t)=>{let e=r.length-1,s=[],i,o=t===2?"<svg>":t===3?"<math>":"",n=U;for(let d=0;d<e;d++){let a=r[d],h,l,c=-1,f=0;for(;f<a.length&&(n.lastIndex=f,l=n.exec(a),l!==null);)f=n.lastIndex,n===U?l[1]==="!--"?n=ft:l[1]!==void 0?n=mt:l[2]!==void 0?(vt.test(l[2])&&(i=RegExp("</"+l[2],"g")),n=_):l[3]!==void 0&&(n=_):n===_?l[0]===">"?(n=i??U,c=-1):l[1]===void 0?c=-2:(c=n.lastIndex-l[2].length,h=l[1],n=l[3]===void 0?_:l[3]==='"'?yt:gt):n===yt||n===gt?n=_:n===ft||n===mt?n=U:(n=_,i=void 0);let g=n===_&&r[d+1].startsWith("/>")?" ":"";o+=n===U?a+It:c>=0?(s.push(h),a.slice(0,c)+$t+a.slice(c)+y+g):a+y+(c===-2?d:g)}return[wt(r,o+(r[e]||"<?>")+(t===2?"</svg>":t===3?"</math>":"")),s]},L=class r{constructor({strings:t,_$litType$:e},s){let i;this.parts=[];let o=0,n=0,d=t.length-1,a=this.parts,[h,l]=qt(t,e);if(this.el=r.createElement(h,s),v.currentNode=this.el.content,e===2||e===3){let c=this.el.content.firstChild;c.replaceWith(...c.childNodes)}for(;(i=v.nextNode())!==null&&a.length<d;){if(i.nodeType===1){if(i.hasAttributes())for(let c of i.getAttributeNames())if(c.endsWith($t)){let f=l[n++],g=i.getAttribute(c).split(y),T=/([.?@])?(.*)/.exec(f);a.push({type:1,index:o,name:T[2],strings:g,ctor:T[1]==="."?G:T[1]==="?"?Q:T[1]==="@"?X:S}),i.removeAttribute(c)}else c.startsWith(y)&&(a.push({type:6,index:o}),i.removeAttribute(c));if(vt.test(i.tagName)){let c=i.textContent.split(y),f=c.length-1;if(f>0){i.textContent=k?k.emptyScript:"";for(let g=0;g<f;g++)i.append(c[g],O()),v.nextNode(),a.push({type:2,index:++o});i.append(c[f],O())}}}else if(i.nodeType===8)if(i.data===_t)a.push({type:2,index:o});else{let c=-1;for(;(c=i.data.indexOf(y,c+1))!==-1;)a.push({type:7,index:o}),c+=y.length-1}o++}}static createElement(t,e){let s=w.createElement("template");return s.innerHTML=t,s}};function A(r,t,e=r,s){if(t===b)return t;let i=s!==void 0?e._$Co?.[s]:e._$Cl,o=H(t)?void 0:t._$litDirective$;return i?.constructor!==o&&(i?._$AO?.(!1),o===void 0?i=void 0:(i=new o(r),i._$AT(r,e,s)),s!==void 0?(e._$Co??=[])[s]=i:e._$Cl=i),i!==void 0&&(t=A(r,i._$AS(r,t.values),i,s)),t}var Z=class{constructor(t,e){this._$AV=[],this._$AN=void 0,this._$AD=t,this._$AM=e}get parentNode(){return this._$AM.parentNode}get _$AU(){return this._$AM._$AU}u(t){let{el:{content:e},parts:s}=this._$AD,i=(t?.creationScope??w).importNode(e,!0);v.currentNode=i;let o=v.nextNode(),n=0,d=0,a=s[0];for(;a!==void 0;){if(n===a.index){let h;a.type===2?h=new P(o,o.nextSibling,this,t):a.type===1?h=new a.ctor(o,a.name,a.strings,this,t):a.type===6&&(h=new Y(o,this,t)),this._$AV.push(h),a=s[++d]}n!==a?.index&&(o=v.nextNode(),n++)}return v.currentNode=w,i}p(t){let e=0;for(let s of this._$AV)s!==void 0&&(s.strings!==void 0?(s._$AI(t,s,e),e+=s.strings.length-2):s._$AI(t[e])),e++}},P=class r{get _$AU(){return this._$AM?._$AU??this._$Cv}constructor(t,e,s,i){this.type=2,this._$AH=p,this._$AN=void 0,this._$AA=t,this._$AB=e,this._$AM=s,this.options=i,this._$Cv=i?.isConnected??!0}get parentNode(){let t=this._$AA.parentNode,e=this._$AM;return e!==void 0&&t?.nodeType===11&&(t=e.parentNode),t}get startNode(){return this._$AA}get endNode(){return this._$AB}_$AI(t,e=this){t=A(this,t,e),H(t)?t===p||t==null||t===""?(this._$AH!==p&&this._$AR(),this._$AH=p):t!==this._$AH&&t!==b&&this._(t):t._$litType$!==void 0?this.$(t):t.nodeType!==void 0?this.T(t):Nt(t)?this.k(t):this._(t)}O(t){return this._$AA.parentNode.insertBefore(t,this._$AB)}T(t){this._$AH!==t&&(this._$AR(),this._$AH=this.O(t))}_(t){this._$AH!==p&&H(this._$AH)?this._$AA.nextSibling.data=t:this.T(w.createTextNode(t)),this._$AH=t}$(t){let{values:e,_$litType$:s}=t,i=typeof s=="number"?this._$AC(t):(s.el===void 0&&(s.el=L.createElement(wt(s.h,s.h[0]),this.options)),s);if(this._$AH?._$AD===i)this._$AH.p(e);else{let o=new Z(i,this),n=o.u(this.options);o.p(e),this.T(n),this._$AH=o}}_$AC(t){let e=Et.get(t.strings);return e===void 0&&Et.set(t.strings,e=new L(t)),e}k(t){et(this._$AH)||(this._$AH=[],this._$AR());let e=this._$AH,s,i=0;for(let o of t)i===e.length?e.push(s=new r(this.O(O()),this.O(O()),this,this.options)):s=e[i],s._$AI(o),i++;i<e.length&&(this._$AR(s&&s._$AB.nextSibling,i),e.length=i)}_$AR(t=this._$AA.nextSibling,e){for(this._$AP?.(!1,!0,e);t!==this._$AB;){let s=t.nextSibling;t.remove(),t=s}}setConnected(t){this._$AM===void 0&&(this._$Cv=t,this._$AP?.(t))}},S=class{get tagName(){return this.element.tagName}get _$AU(){return this._$AM._$AU}constructor(t,e,s,i,o){this.type=1,this._$AH=p,this._$AN=void 0,this.element=t,this.name=e,this._$AM=i,this.options=o,s.length>2||s[0]!==""||s[1]!==""?(this._$AH=Array(s.length-1).fill(new String),this.strings=s):this._$AH=p}_$AI(t,e=this,s,i){let o=this.strings,n=!1;if(o===void 0)t=A(this,t,e,0),n=!H(t)||t!==this._$AH&&t!==b,n&&(this._$AH=t);else{let d=t,a,h;for(t=o[0],a=0;a<o.length-1;a++)h=A(this,d[s+a],e,a),h===b&&(h=this._$AH[a]),n||=!H(h)||h!==this._$AH[a],h===p?t=p:t!==p&&(t+=(h??"")+o[a+1]),this._$AH[a]=h}n&&!i&&this.j(t)}j(t){t===p?this.element.removeAttribute(this.name):this.element.setAttribute(this.name,t??"")}},G=class extends S{constructor(){super(...arguments),this.type=3}j(t){this.element[this.name]=t===p?void 0:t}},Q=class extends S{constructor(){super(...arguments),this.type=4}j(t){this.element.toggleAttribute(this.name,!!t&&t!==p)}},X=class extends S{constructor(t,e,s,i,o){super(t,e,s,i,o),this.type=5}_$AI(t,e=this){if((t=A(this,t,e,0)??p)===b)return;let s=this._$AH,i=t===p&&s!==p||t.capture!==s.capture||t.once!==s.once||t.passive!==s.passive,o=t!==p&&(s===p||i);i&&this.element.removeEventListener(this.name,this,s),o&&this.element.addEventListener(this.name,this,t),this._$AH=t}handleEvent(t){typeof this._$AH=="function"?this._$AH.call(this.options?.host??this.element,t):this._$AH.handleEvent(t)}},Y=class{constructor(t,e,s){this.element=t,this.type=6,this._$AN=void 0,this._$AM=e,this.options=s}get _$AU(){return this._$AM._$AU}_$AI(t){A(this,t)}};var kt=tt.litHtmlPolyfillSupport;kt?.(L,P),(tt.litHtmlVersions??=[]).push("3.3.1");var bt=(r,t,e)=>{let s=e?.renderBefore??t,i=s._$litPart$;if(i===void 0){let o=e?.renderBefore??null;s._$litPart$=i=new P(t.insertBefore(O(),o),o,void 0,e??{})}return i._$AI(r),i};var it=globalThis,E=class extends m{constructor(){super(...arguments),this.renderOptions={host:this},this._$Do=void 0}createRenderRoot(){let t=super.createRenderRoot();return this.renderOptions.renderBefore??=t.firstChild,t}update(t){let e=this.render();this.hasUpdated||(this.renderOptions.isConnected=this.isConnected),super.update(t),this._$Do=bt(e,this.renderRoot,this.renderOptions)}connectedCallback(){super.connectedCallback(),this._$Do?.setConnected(!0)}disconnectedCallback(){super.disconnectedCallback(),this._$Do?.setConnected(!1)}render(){return b}};E._$litElement$=!0,E.finalized=!0,it.litElementHydrateSupport?.({LitElement:E});var Bt=it.litElementPolyfillSupport;Bt?.({LitElement:E});(it.litElementVersions??=[]).push("4.2.1");var zt={attribute:!0,type:String,converter:C,reflect:!1,hasChanged:q},jt=(r=zt,t,e)=>{let{kind:s,metadata:i}=e,o=globalThis.litPropertyMetadata.get(i);if(o===void 0&&globalThis.litPropertyMetadata.set(i,o=new Map),s==="setter"&&((r=Object.create(r)).wrapped=!0),o.set(e.name,r),s==="accessor"){let{name:n}=e;return{set(d){let a=t.get.call(this);t.set.call(this,d),this.requestUpdate(n,a,r)},init(d){return d!==void 0&&this.C(n,void 0,r,d),d}}}if(s==="setter"){let{name:n}=e;return function(d){let a=this[n];t.call(this,d),this.requestUpdate(n,a,r)}}throw Error("Unsupported decorator location: "+s)};function B(r){return(t,e)=>typeof e=="object"?jt(r,t,e):((s,i,o)=>{let n=i.hasOwnProperty(o);return i.constructor.createProperty(o,s),n?Object.getOwnPropertyDescriptor(i,o):void 0})(r,t,e)}var At=x`
|
|
4
4
|
* {
|
|
5
5
|
box-sizing: border-box;
|
|
6
6
|
}
|
|
7
|
-
`;var St=
|
|
7
|
+
`;var St=x`
|
|
8
8
|
:host {
|
|
9
9
|
/* Make the component fill its container completely */
|
|
10
10
|
display: block;
|
|
@@ -35,7 +35,7 @@ var T=globalThis,I=T.ShadowRoot&&(T.ShadyCSS===void 0||T.ShadyCSS.nativeShadow)&
|
|
|
35
35
|
margin: 0 !important;
|
|
36
36
|
padding: 0 !important;
|
|
37
37
|
}
|
|
38
|
-
`;function j(r){let t;try{t=new URL(r)}catch{throw new Error("Invalid baseURL: not a parseable URL")}if(t.protocol!=="https:")throw new Error("Invalid baseURL: must use https");let e=t.host.toLowerCase();if(!/^assistant\.[a-z0-9-]+\.corti\.app$/i.test(e))throw new Error("Invalid baseURL: host must match assistant.xxx.corti.app");if(t.pathname&&t.pathname!=="/"&&t.pathname!=="")throw new Error("Invalid baseURL: must not include a path");if(t.username||t.password)throw new Error("Invalid baseURL: must not include credentials");return t.origin.replace(/\/+$/,"")}function ot(r){return`${r}/embedded`}function Rt(r,t){if(!r||r.startsWith("about:"))return!1;try{let e=new URL(r,window.location.href),s=new URL(t);return e.origin!==s.origin?!1:e.pathname.replace(/\/+$/,"")==="/embedded"}catch{return!1}}function Ft(r){try{return JSON.parse(r)}catch{return null}}function F(r){let t=r.match(/\b([1-5]\d{2})\b/);return t?t[1]:void 0}function nt(r){return typeof r=="object"&&r!==null&&("expected"in r||"code"in r||"path"in r||"message"in r)}function at(r){let{path:t,expected:e,message:s,code:i}=r;if(s)return s;let o=t&&t.length>0?t.join("."):"field";return e?`Invalid ${o}: expected ${e}`:i?`Validation error in ${o} (${i})`:`Validation error in ${o}`}function Ct(r){return r.length===0?"Unknown validation error":r.length===1?at(r[0]):`Multiple validation errors: ${r.map(at).join("; ")}`}function u(r,t="An error occurred"){if(!r)return{message:t,details:r};if(r instanceof Error){let e=F(r.message);return{message:r.message||t,code:e,details:r}}if(typeof r=="string"){let e=F(r);return{message:r,code:e,details:r}}if(Array.isArray(r)){if(r.every(nt)){let e=r;return{message:Ct(e),code:e[0]?.code,details:r}}return{message:`Multiple errors: ${r.length} item(s)`,details:r}}if(typeof r=="object"){let e=r;if(e.message&&typeof e.message=="string"){let s=e.message,{code:i}=e;if(i||(i=F(s)),e.details?.message&&typeof e.details.message=="string"){let o=Ft(e.details.message);Array.isArray(o)&&o.every(nt)&&(s=Ct(o))}return{message:s,code:i,details:e.details}}if(nt(e))return{message:at(e),code:e.code,details:r};if(e.error||e.message||e.detail){let s=e.error||e.message||e.detail,i=typeof s=="string"?s:t,o=e.code||e.status;return!o&&typeof s=="string"&&(o=F(s)),{message:i,code:o,details:r}}}return{message:t,details:r}}var W=class r{constructor(t,e={}){this.pendingRequests=new Map,this.messageListener=null,this.isReady=!1,this.iframe=t,this.callbacks=e,this.setupMessageListener()}setupMessageListener(){this.messageListener=t=>{if(t.source!==this.iframe.contentWindow)return;let e=this.getTrustedOrigin();if(!e||t.origin!==e)return;let{data:s}=t;if(s?.type==="CORTI_EMBEDDED_EVENT"){this.handleEvent(s);return}s.requestId&&this.pendingRequests.has(s.requestId)&&this.handleResponse(s)},window.addEventListener("message",this.messageListener)}handleEvent(t){let e=t.event,{payload:s}=t;switch((e==="ready"||e==="loaded")&&(this.isReady=!0),e){case"ready":case"loaded":this.callbacks.onReady?.();break;case"authChanged":this.callbacks.onAuthChanged?.(s);break;case"interactionCreated":this.callbacks.onInteractionCreated?.(s);break;case"recordingStarted":this.callbacks.onRecordingStarted?.();break;case"recordingStopped":this.callbacks.onRecordingStopped?.();break;case"documentGenerated":this.callbacks.onDocumentGenerated?.(s);break;case"documentUpdated":this.callbacks.onDocumentUpdated?.(s);break;case"navigationChanged":this.callbacks.onNavigationChanged?.(s);break;case"usage":this.callbacks.onUsage?.(s);break;default:console.warn(`Unhandled event type: ${e}`);break}}handleResponse(t){let e=this.pendingRequests.get(t.requestId);if(e){let{resolve:s,reject:i}=e;if(this.pendingRequests.delete(t.requestId),t.success===!1||t.error){let o={message:t.error||"Request failed",code:t.errorCode,details:t.errorDetails};this.callbacks.onError?.(o),i(o)}else s(t)}}destroy(){this.messageListener&&(window.removeEventListener("message",this.messageListener),this.messageListener=null),this.pendingRequests.clear()}updateCallbacks(t){this.callbacks={...this.callbacks,...t}}get ready(){return this.isReady}async waitForReady(t=3e4){return this.isReady?Promise.resolve():new Promise((e,s)=>{let i=setTimeout(()=>{s(new Error("Timeout waiting for iframe to be ready"))},t),o=n=>{n.source===this.iframe.contentWindow&&n.origin===this.getTrustedOrigin()&&n.data?.type==="CORTI_EMBEDDED_EVENT"&&n.data.event==="ready"&&(clearTimeout(i),window.removeEventListener("message",o),e())};window.addEventListener("message",o)})}async postMessage(t,e=1e4){if(!this.iframe.contentWindow)throw new Error("Iframe not ready");await this.waitForReady();let{contentWindow:s}=this.iframe,i=r.generateRequestId();return new Promise((o,n)=>{let c=setTimeout(()=>{this.pendingRequests.delete(i),n(new Error("Request timeout"))},e),a={resolve:d=>{clearTimeout(c),o(d)},reject:d=>{clearTimeout(c),n(d)}};this.pendingRequests.set(i,a);let h={...t,requestId:i},l=this.getTrustedOrigin();if(!l){this.pendingRequests.delete(i),n(new Error("Cannot determine trusted origin for postMessage"));return}s.postMessage(h,l)})}async auth(t){let e=await this.postMessage({type:"CORTI_EMBEDDED",version:"v1",action:"auth",payload:t});if(this.isReady=!1,e.payload&&typeof e.success)return e.payload.user;throw new Error(e.error)}async configureSession(t){await this.postMessage({type:"CORTI_EMBEDDED",version:"v1",action:"configureSession",payload:t})}async navigate(t){await this.postMessage({type:"CORTI_EMBEDDED",version:"v1",action:"navigate",payload:t})}async addFacts(t){await this.postMessage({type:"CORTI_EMBEDDED",version:"v1",action:"addFacts",payload:t})}async createInteraction(t){let e=await this.postMessage({type:"CORTI_EMBEDDED",version:"v1",action:"createInteraction",payload:t});if(e.payload&&typeof e.success)return e.payload;throw new Error(e.error)}async startRecording(){await this.postMessage({type:"CORTI_EMBEDDED",version:"v1",action:"startRecording",payload:{}})}async stopRecording(){await this.postMessage({type:"CORTI_EMBEDDED",version:"v1",action:"stopRecording",payload:{}})}async getStatus(){let t=await this.postMessage({type:"CORTI_EMBEDDED",version:"v1",action:"getStatus",payload:{}});if(t.payload&&typeof t.success)return t.payload;throw new Error(t.error)}async configure(t){let e=await this.postMessage({type:"CORTI_EMBEDDED",version:"v1",action:"configure",payload:t});if(e.payload&&typeof e.success)return e.payload;throw new Error(e.error)}async setCredentials(t){await this.postMessage({type:"CORTI_EMBEDDED",version:"v1",action:"setCredentials",payload:t})}static generateRequestId(){return`req_${Date.now()}_${Math.random().toString(36).substr(2,9)}`}getTrustedOrigin(){try{let t=this.iframe.getAttribute("src")||this.iframe.src;return t?new URL(t,window.location.href).origin:null}catch{return null}}};var Mt=function(r,t,e,s){var i=arguments.length,o=i<3?t:s===null?s=Object.getOwnPropertyDescriptor(t,e):s,n;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")o=Reflect.decorate(r,t,e,s);else for(var c=r.length-1;c>=0;c--)(n=r[c])&&(o=(i<3?n(o):i>3?n(t,e,o):n(t,e))||o);return i>3&&o&&Object.defineProperty(t,e,o),o},$=class extends E{constructor(){super(...arguments),this.visibility="hidden",this.postMessageHandler=null,this.normalizedBaseURL=null}connectedCallback(){if(super.connectedCallback(),!this.baseURL){this.dispatchErrorEvent({message:"baseURL is required"});return}try{this.normalizedBaseURL=j(this.baseURL)}catch(t){throw this.dispatchErrorEvent({message:t.message||"Invalid baseURL"}),t}}disconnectedCallback(){super.disconnectedCallback(),this.postMessageHandler&&(this.postMessageHandler.destroy(),this.postMessageHandler=null)}async setupPostMessageHandler(){if(this.postMessageHandler)return;let t=this.getIframe();if(t?.contentWindow){let e={onReady:()=>{this.dispatchPublicEvent("ready",void 0)},onAuthChanged:s=>{this.dispatchPublicEvent("auth-changed",{user:s.user})},onInteractionCreated:s=>{this.dispatchPublicEvent("interaction-created",{interaction:s.interaction})},onRecordingStarted:()=>{this.dispatchPublicEvent("recording-started",void 0)},onRecordingStopped:()=>{this.dispatchPublicEvent("recording-stopped",void 0)},onDocumentGenerated:s=>{this.dispatchPublicEvent("document-generated",{document:s.document})},onDocumentUpdated:s=>{this.dispatchPublicEvent("document-updated",{document:s.document})},onNavigationChanged:s=>{this.dispatchPublicEvent("navigation-changed",{path:s.path})},onUsage:s=>{this.dispatchPublicEvent("usage",{creditsConsumed:s.creditsConsumed})},onError:s=>{this.dispatchErrorEvent(s)}};this.postMessageHandler=new W(t,e)}else this.dispatchErrorEvent({message:"No iframe or contentWindow available"})}dispatchPublicEvent(t,e){this.dispatchEvent(new CustomEvent(t,{detail:e}))}dispatchErrorEvent(t){this.dispatchPublicEvent("error",t)}isRealIframeLoad(t){let e=t.getAttribute("src")||"";return this.normalizedBaseURL?Rt(e,this.normalizedBaseURL):!1}async handleIframeLoad(t){let e=t.target;if(e&&this.isRealIframeLoad(e))try{await this.setupPostMessageHandler()}catch(s){this.dispatchErrorEvent({message:`Failed to setup PostMessageHandler on iframe load: ${s}`})}}getIframe(){return this.shadowRoot?.querySelector("iframe")||null}updated(t){if(super.updated(t),t.has("baseURL")){try{this.normalizedBaseURL=j(this.baseURL)}catch(s){this.postMessageHandler&&(this.postMessageHandler.destroy(),this.postMessageHandler=null);let i=this.getIframe();i&&i.setAttribute("src","about:blank"),this.dispatchErrorEvent({message:s.message||"Invalid baseURL"});return}this.postMessageHandler&&(this.postMessageHandler.destroy(),this.postMessageHandler=null);let e=this.getIframe();if(e){let s=this.normalizedBaseURL?ot(this.normalizedBaseURL):"";e.getAttribute("src")!==s&&(e.setAttribute("src",s),e.setAttribute("allow",`microphone ${s}; camera ${s}; device-capture ${s}; display-capture ${s}`))}}}async auth(t){if(!this.postMessageHandler)throw new Error("Component not ready");try{let e={access_token:t.access_token,token_type:t.token_type,expires_at:t.expires_at,expires_in:t.expires_in,refresh_expires_in:t.refresh_expires_in,refresh_token:t.refresh_token,id_token:t.id_token,"not-before-policy":t["not-before-policy"],session_state:t.session_state,scope:t.scope,profile:t.profile,mode:t.mode};return await this.postMessageHandler.auth(e)}catch(e){let s=u(e,"Authentication failed");throw this.dispatchErrorEvent(s),new Error(JSON.stringify(s))}}async createInteraction(t){if(!this.postMessageHandler)throw new Error("Component not ready");try{let e=await this.postMessageHandler.createInteraction(t);return{id:e.id,createdAt:e.createdAt}}catch(e){let s=u(e,"Failed to create interaction");throw this.dispatchErrorEvent(s),new Error(JSON.stringify(s))}}async configureSession(t){if(!this.postMessageHandler)throw new Error("Component not ready");try{let e={defaultLanguage:t.defaultLanguage,defaultOutputLanguage:t.defaultOutputLanguage,defaultTemplateKey:t.defaultTemplateKey,defaultMode:t.defaultMode};await this.postMessageHandler.configureSession(e)}catch(e){let s=u(e,"Failed to configure session");throw this.dispatchErrorEvent(s),new Error(JSON.stringify(s))}}async addFacts(t){if(!this.postMessageHandler)throw new Error("Component not ready");try{let e={facts:t};await this.postMessageHandler.addFacts(e)}catch(e){let s=u(e,"Failed to add facts");throw this.dispatchErrorEvent(s),new Error(JSON.stringify(s))}}async navigate(t){if(!this.postMessageHandler)throw new Error("Component not ready");try{let e={path:t};await this.postMessageHandler.navigate(e)}catch(e){let s=u(e,"Failed to navigate");throw this.dispatchErrorEvent(s),new Error(JSON.stringify(s))}}async startRecording(){if(!this.postMessageHandler)throw new Error("Component not ready");try{await this.postMessageHandler.startRecording()}catch(t){let e=u(t,"Failed to start recording");throw this.dispatchErrorEvent(e),new Error(JSON.stringify(e))}}async stopRecording(){if(!this.postMessageHandler)throw new Error("Component not ready");try{await this.postMessageHandler.stopRecording()}catch(t){let e=u(t,"Failed to stop recording");throw this.dispatchErrorEvent(e),new Error(JSON.stringify(e))}}async getStatus(){if(!this.postMessageHandler)return{ready:!1,auth:{authenticated:!1,user:void 0},currentUrl:void 0,interaction:void 0};try{return await this.postMessageHandler.getStatus()}catch(t){let e=u(t,"Failed to get status");throw this.dispatchErrorEvent(e),new Error(JSON.stringify(e))}}async configure(t){if(!this.postMessageHandler)throw new Error("Component not ready");try{return await this.postMessageHandler.configure(t)}catch(e){let s=u(e,"Failed to configure component");throw this.dispatchErrorEvent(s),new Error(JSON.stringify(s))}}async setCredentials(t){if(!this.postMessageHandler)throw new Error("Component not ready");try{if(!t.password)throw new Error("Password is required");await this.postMessageHandler.setCredentials(t)}catch(e){let s=u(e,"Failed to set credentials");throw this.dispatchErrorEvent(s),new Error(JSON.stringify(s))}}show(){this.visibility="visible"}hide(){this.visibility="hidden"}getDebugStatus(){let t=this.getIframe();return{ready:t?.contentDocument?.readyState==="complete",iframeExists:!!t,iframeSrc:t?.src,iframeContentWindow:!!t?.contentWindow,iframeContentDocument:!!t?.contentDocument,iframeReadyState:t?.contentDocument?.readyState,postMessageHandlerExists:!!this.postMessageHandler,postMessageHandlerReady:this.postMessageHandler?.ready||!1,baseURL:this.baseURL}}render(){return this.baseURL?rt`
|
|
38
|
+
`;function j(r){let t;try{t=new URL(r)}catch{throw new Error("Invalid baseURL: not a parseable URL")}if(t.protocol!=="https:")throw new Error("Invalid baseURL: must use https");let e=t.host.toLowerCase();if(!/^assistant\.[a-z0-9-]+\.corti\.app$/i.test(e))throw new Error("Invalid baseURL: host must match assistant.xxx.corti.app");if(t.pathname&&t.pathname!=="/"&&t.pathname!=="")throw new Error("Invalid baseURL: must not include a path");if(t.username||t.password)throw new Error("Invalid baseURL: must not include credentials");return t.origin.replace(/\/+$/,"")}function ot(r){return`${r}/embedded`}function Rt(r,t){if(!r||r.startsWith("about:"))return!1;try{let e=new URL(r,window.location.href),s=new URL(t);return e.origin!==s.origin?!1:e.pathname.replace(/\/+$/,"")==="/embedded"}catch{return!1}}function Ft(r){try{return JSON.parse(r)}catch{return null}}function F(r){let t=r.match(/\b([1-5]\d{2})\b/);return t?t[1]:void 0}function nt(r){return typeof r=="object"&&r!==null&&("expected"in r||"code"in r||"path"in r||"message"in r)}function at(r){let{path:t,expected:e,message:s,code:i}=r;if(s)return s;let o=t&&t.length>0?t.join("."):"field";return e?`Invalid ${o}: expected ${e}`:i?`Validation error in ${o} (${i})`:`Validation error in ${o}`}function xt(r){return r.length===0?"Unknown validation error":r.length===1?at(r[0]):`Multiple validation errors: ${r.map(at).join("; ")}`}function u(r,t="An error occurred"){if(!r)return{message:t,details:r};if(r instanceof Error){let e=F(r.message);return{message:r.message||t,code:e,details:r}}if(typeof r=="string"){let e=F(r);return{message:r,code:e,details:r}}if(Array.isArray(r)){if(r.every(nt)){let e=r;return{message:xt(e),code:e[0]?.code,details:r}}return{message:`Multiple errors: ${r.length} item(s)`,details:r}}if(typeof r=="object"){let e=r;if(e.message&&typeof e.message=="string"){let s=e.message,{code:i}=e;if(i||(i=F(s)),e.details?.message&&typeof e.details.message=="string"){let o=Ft(e.details.message);Array.isArray(o)&&o.every(nt)&&(s=xt(o))}return{message:s,code:i,details:e.details}}if(nt(e))return{message:at(e),code:e.code,details:r};if(e.error||e.message||e.detail){let s=e.error||e.message||e.detail,i=typeof s=="string"?s:t,o=e.code||e.status;return!o&&typeof s=="string"&&(o=F(s)),{message:i,code:o,details:r}}}return{message:t,details:r}}var W=class r{constructor(t,e={}){this.pendingRequests=new Map,this.messageListener=null,this.isReady=!1,this.iframe=t,this.callbacks=e,this.setupMessageListener()}setupMessageListener(){this.messageListener=t=>{if(t.source!==this.iframe.contentWindow)return;let e=this.getTrustedOrigin();if(!e||t.origin!==e)return;let{data:s}=t;if(s?.type==="CORTI_EMBEDDED_EVENT"){this.handleEvent(s);return}s.requestId&&this.pendingRequests.has(s.requestId)&&this.handleResponse(s)},window.addEventListener("message",this.messageListener)}handleEvent(t){let e=t.event,{payload:s}=t;(e==="ready"||e==="loaded"||e==="embedded.ready")&&(this.isReady=!0),this.callbacks.onEvent?.({name:e,payload:s})}handleResponse(t){let e=this.pendingRequests.get(t.requestId);if(e){let{resolve:s,reject:i}=e;if(this.pendingRequests.delete(t.requestId),t.success===!1||t.error){let o={message:t.error||"Request failed",code:t.errorCode,details:t.errorDetails};this.callbacks.onError?.(o),i(o)}else s(t)}}destroy(){this.messageListener&&(window.removeEventListener("message",this.messageListener),this.messageListener=null),this.pendingRequests.clear()}updateCallbacks(t){this.callbacks={...this.callbacks,...t}}get ready(){return this.isReady}async waitForReady(t=3e4){return this.isReady?Promise.resolve():new Promise((e,s)=>{let i=setTimeout(()=>{s(new Error("Timeout waiting for iframe to be ready"))},t),o=n=>{n.source===this.iframe.contentWindow&&n.origin===this.getTrustedOrigin()&&n.data?.type==="CORTI_EMBEDDED_EVENT"&&(n.data.event==="ready"||n.data.event==="loaded"||n.data.event==="embedded.ready")&&(clearTimeout(i),window.removeEventListener("message",o),e())};window.addEventListener("message",o)})}async postMessage(t,e=1e4){if(!this.iframe.contentWindow)throw new Error("Iframe not ready");await this.waitForReady();let{contentWindow:s}=this.iframe,i=r.generateRequestId();return new Promise((o,n)=>{let d=setTimeout(()=>{this.pendingRequests.delete(i),n(new Error("Request timeout"))},e),a={resolve:c=>{clearTimeout(d),o(c)},reject:c=>{clearTimeout(d),n(c)}};this.pendingRequests.set(i,a);let h={...t,requestId:i},l=this.getTrustedOrigin();if(!l){this.pendingRequests.delete(i),n(new Error("Cannot determine trusted origin for postMessage"));return}s.postMessage(h,l)})}async auth(t){let e=await this.postMessage({type:"CORTI_EMBEDDED",version:"v1",action:"auth",payload:t});if(this.isReady=!1,e.payload&&e.success)return e.payload.user;throw new Error(e.error)}async configureSession(t){await this.postMessage({type:"CORTI_EMBEDDED",version:"v1",action:"configureSession",payload:t})}async navigate(t){await this.postMessage({type:"CORTI_EMBEDDED",version:"v1",action:"navigate",payload:t})}async addFacts(t){await this.postMessage({type:"CORTI_EMBEDDED",version:"v1",action:"addFacts",payload:t})}async createInteraction(t){let e=await this.postMessage({type:"CORTI_EMBEDDED",version:"v1",action:"createInteraction",payload:t});if(e.payload&&e.success)return e.payload;throw new Error(e.error)}async startRecording(){await this.postMessage({type:"CORTI_EMBEDDED",version:"v1",action:"startRecording",payload:{}})}async stopRecording(){await this.postMessage({type:"CORTI_EMBEDDED",version:"v1",action:"stopRecording",payload:{}})}async getStatus(){let t=await this.postMessage({type:"CORTI_EMBEDDED",version:"v1",action:"getStatus",payload:{}});if(t.payload&&t.success)return t.payload;throw new Error(t.error)}async configure(t){let e=await this.postMessage({type:"CORTI_EMBEDDED",version:"v1",action:"configure",payload:t});if(e.payload&&e.success)return e.payload;throw new Error(e.error)}async setCredentials(t){await this.postMessage({type:"CORTI_EMBEDDED",version:"v1",action:"setCredentials",payload:t})}async getTemplates(){let t=await this.postMessage({type:"CORTI_EMBEDDED",version:"v1",action:"getTemplates"});if(t.payload&&t.success)return t.payload;throw new Error(t.error)}static generateRequestId(){return`req_${Date.now()}_${Math.random().toString(36).substr(2,9)}`}getTrustedOrigin(){try{let t=this.iframe.getAttribute("src")||this.iframe.src;return t?new URL(t,window.location.href).origin:null}catch{return null}}};var Mt=function(r,t,e,s){var i=arguments.length,o=i<3?t:s===null?s=Object.getOwnPropertyDescriptor(t,e):s,n;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")o=Reflect.decorate(r,t,e,s);else for(var d=r.length-1;d>=0;d--)(n=r[d])&&(o=(i<3?n(o):i>3?n(t,e,o):n(t,e))||o);return i>3&&o&&Object.defineProperty(t,e,o),o},$=class extends E{constructor(){super(...arguments),this.visibility="hidden",this.postMessageHandler=null,this.normalizedBaseURL=null}connectedCallback(){if(super.connectedCallback(),!this.baseURL){this.dispatchErrorEvent({message:"baseURL is required"});return}try{this.normalizedBaseURL=j(this.baseURL)}catch(t){throw this.dispatchErrorEvent({message:t.message||"Invalid baseURL"}),t}}disconnectedCallback(){super.disconnectedCallback(),this.postMessageHandler&&(this.postMessageHandler.destroy(),this.postMessageHandler=null)}async setupPostMessageHandler(){if(this.postMessageHandler)return;let t=this.getIframe();if(t?.contentWindow){let e={onEvent:s=>{this.dispatchEmbeddedEvent(s.name,s.payload)},onError:s=>{this.dispatchErrorEvent(s)}};this.postMessageHandler=new W(t,e)}else this.dispatchErrorEvent({message:"No iframe or contentWindow available"})}dispatchPublicEvent(t,e){this.dispatchEvent(new CustomEvent(t,{detail:e}))}dispatchEmbeddedEvent(t,e){this.dispatchPublicEvent(t,e),this.dispatchPublicEvent("embedded-event",{name:t,payload:e})}dispatchErrorEvent(t){this.dispatchPublicEvent("error",t)}isRealIframeLoad(t){let e=t.getAttribute("src")||"";return this.normalizedBaseURL?Rt(e,this.normalizedBaseURL):!1}async handleIframeLoad(t){let e=t.target;if(e&&this.isRealIframeLoad(e))try{await this.setupPostMessageHandler()}catch(s){this.dispatchErrorEvent({message:`Failed to setup PostMessageHandler on iframe load: ${s}`})}}getIframe(){return this.shadowRoot?.querySelector("iframe")||null}updated(t){if(super.updated(t),t.has("baseURL")){try{this.normalizedBaseURL=j(this.baseURL)}catch(s){this.postMessageHandler&&(this.postMessageHandler.destroy(),this.postMessageHandler=null);let i=this.getIframe();i&&i.setAttribute("src","about:blank"),this.dispatchErrorEvent({message:s.message||"Invalid baseURL"});return}this.postMessageHandler&&(this.postMessageHandler.destroy(),this.postMessageHandler=null);let e=this.getIframe();if(e){let s=this.normalizedBaseURL?ot(this.normalizedBaseURL):"";e.getAttribute("src")!==s&&(e.setAttribute("src",s),e.setAttribute("allow",`microphone ${s}; camera ${s}; device-capture ${s}; display-capture ${s}`))}}}async auth(t){if(!this.postMessageHandler)throw new Error("Component not ready");try{let e={access_token:t.access_token,token_type:t.token_type,expires_at:t.expires_at,expires_in:t.expires_in,refresh_expires_in:t.refresh_expires_in,refresh_token:t.refresh_token,id_token:t.id_token,"not-before-policy":t["not-before-policy"],session_state:t.session_state,scope:t.scope,profile:t.profile,mode:t.mode};return await this.postMessageHandler.auth(e)}catch(e){let s=u(e,"Authentication failed");throw this.dispatchErrorEvent(s),new Error(JSON.stringify(s))}}async createInteraction(t){if(!this.postMessageHandler)throw new Error("Component not ready");try{let e=await this.postMessageHandler.createInteraction(t);return{id:e.id,createdAt:e.createdAt}}catch(e){let s=u(e,"Failed to create interaction");throw this.dispatchErrorEvent(s),new Error(JSON.stringify(s))}}async configureSession(t){if(!this.postMessageHandler)throw new Error("Component not ready");try{let e={defaultLanguage:t.defaultLanguage,defaultOutputLanguage:t.defaultOutputLanguage,defaultTemplateKey:t.defaultTemplateKey,defaultMode:t.defaultMode};await this.postMessageHandler.configureSession(e)}catch(e){let s=u(e,"Failed to configure session");throw this.dispatchErrorEvent(s),new Error(JSON.stringify(s))}}async addFacts(t){if(!this.postMessageHandler)throw new Error("Component not ready");try{let e={facts:t};await this.postMessageHandler.addFacts(e)}catch(e){let s=u(e,"Failed to add facts");throw this.dispatchErrorEvent(s),new Error(JSON.stringify(s))}}async navigate(t){if(!this.postMessageHandler)throw new Error("Component not ready");try{let e={path:t};await this.postMessageHandler.navigate(e)}catch(e){let s=u(e,"Failed to navigate");throw this.dispatchErrorEvent(s),new Error(JSON.stringify(s))}}async startRecording(){if(!this.postMessageHandler)throw new Error("Component not ready");try{await this.postMessageHandler.startRecording()}catch(t){let e=u(t,"Failed to start recording");throw this.dispatchErrorEvent(e),new Error(JSON.stringify(e))}}async stopRecording(){if(!this.postMessageHandler)throw new Error("Component not ready");try{await this.postMessageHandler.stopRecording()}catch(t){let e=u(t,"Failed to stop recording");throw this.dispatchErrorEvent(e),new Error(JSON.stringify(e))}}async getStatus(){if(!this.postMessageHandler)return{auth:{isAuthenticated:!1,user:void 0},currentUrl:"",interaction:null};try{return await this.postMessageHandler.getStatus()}catch(t){let e=u(t,"Failed to get status");throw this.dispatchErrorEvent(e),new Error(JSON.stringify(e))}}async configure(t){if(!this.postMessageHandler)throw new Error("Component not ready");try{return await this.postMessageHandler.configure(t)}catch(e){let s=u(e,"Failed to configure component");throw this.dispatchErrorEvent(s),new Error(JSON.stringify(s))}}async setCredentials(t){if(!this.postMessageHandler)throw new Error("Component not ready");try{if(!t.password)throw new Error("Password is required");await this.postMessageHandler.setCredentials(t)}catch(e){let s=u(e,"Failed to set credentials");throw this.dispatchErrorEvent(s),new Error(JSON.stringify(s))}}show(){this.visibility="visible"}hide(){this.visibility="hidden"}async getTemplates(){if(!this.postMessageHandler)throw new Error("Component not ready");try{return await this.postMessageHandler.getTemplates()}catch(t){let e=u(t,"Failed to get templates");throw this.dispatchErrorEvent(e),new Error(JSON.stringify(e))}}getDebugStatus(){let t=this.getIframe();return{ready:t?.contentDocument?.readyState==="complete",iframeExists:!!t,iframeSrc:t?.src,iframeContentWindow:!!t?.contentWindow,iframeContentDocument:!!t?.contentDocument,iframeReadyState:t?.contentDocument?.readyState,postMessageHandlerExists:!!this.postMessageHandler,postMessageHandlerReady:this.postMessageHandler?.ready||!1,baseURL:this.baseURL}}render(){return this.baseURL?rt`
|
|
39
39
|
<iframe
|
|
40
40
|
src=${ot(j(this.baseURL))}
|
|
41
41
|
title="Corti Embedded UI"
|
package/dist/web-index.d.ts
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
import './corti-embedded.js';
|
|
2
2
|
export { CortiEmbedded } from './CortiEmbedded.js';
|
|
3
|
-
export
|
|
3
|
+
export * from './types/index.js';
|
package/dist/web-index.js
CHANGED
package/dist/web-index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"web-index.js","sourceRoot":"","sources":["../src/web-index.ts"],"names":[],"mappings":"AAAA,OAAO,qBAAqB,CAAC;AAE7B,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC","sourcesContent":["import './corti-embedded.js';\n\nexport { CortiEmbedded } from './CortiEmbedded.js';\n\n// Export clean public types only\nexport
|
|
1
|
+
{"version":3,"file":"web-index.js","sourceRoot":"","sources":["../src/web-index.ts"],"names":[],"mappings":"AAAA,OAAO,qBAAqB,CAAC;AAE7B,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAEnD,iCAAiC;AACjC,cAAc,kBAAkB,CAAC","sourcesContent":["import './corti-embedded.js';\n\nexport { CortiEmbedded } from './CortiEmbedded.js';\n\n// Export clean public types only\nexport * from './types/index.js';\n"]}
|
package/package.json
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"name": "@corti/embedded-web",
|
|
3
3
|
"description": "Web component for Corti Embedded",
|
|
4
4
|
"author": "Corti ApS",
|
|
5
|
-
"version": "0.1.0
|
|
5
|
+
"version": "0.1.0",
|
|
6
6
|
"license": "MIT",
|
|
7
7
|
"bugs": {
|
|
8
8
|
"url": "https://help.corti.app",
|
|
@@ -45,14 +45,15 @@
|
|
|
45
45
|
"build:bundle": "esbuild dist/index.js --bundle --outfile=dist/bundle.js --format=esm --platform=browser --external:react --define:process.env.NODE_ENV='\"production\"' --minify",
|
|
46
46
|
"build:web-bundle": "esbuild dist/web-index.js --bundle --outfile=dist/web-bundle.js --format=esm --platform=browser --define:process.env.NODE_ENV='\"production\"' --minify",
|
|
47
47
|
"build:demo": "esbuild demo/react-demo.tsx --bundle --outfile=demo/react-demo-bundle.js --format=esm --platform=browser --jsx=automatic --loader:.tsx=tsx",
|
|
48
|
-
"
|
|
48
|
+
"prerelease": "npm run build && npm run build:bundle && npm run build:web-bundle",
|
|
49
49
|
"start": "npm run build && npm run build:demo && concurrently -k -r \"tsc --watch --preserveWatchOutput\" \"esbuild demo/react-demo.tsx --bundle --outfile=demo/react-demo-bundle.js --format=esm --platform=browser --jsx=automatic --loader:.tsx=tsx --watch\" \"web-dev-server\"",
|
|
50
50
|
"start:simple": "npm run build && concurrently -k -r \"tsc --watch --preserveWatchOutput\" \"web-dev-server\"",
|
|
51
51
|
"prepublish": "tsc && npm run analyze -- --exclude dist",
|
|
52
52
|
"lint": "eslint --ext .ts,.tsx src --ignore-path .gitignore && prettier \"src/**/*.{ts,tsx}\" --check --ignore-path .gitignore",
|
|
53
53
|
"format": "eslint --ext .ts,.tsx src --fix --ignore-path .gitignore && prettier \"src/**/*.{ts,tsx}\" --write --ignore-path .gitignore",
|
|
54
54
|
"test": "tsc -p tsconfig.test.json && wtr --coverage",
|
|
55
|
-
"test:watch": "concurrently -k -r \"tsc -p tsconfig.test.json --watch --preserveWatchOutput\" \"wtr --watch\""
|
|
55
|
+
"test:watch": "concurrently -k -r \"tsc -p tsconfig.test.json --watch --preserveWatchOutput\" \"wtr --watch\"",
|
|
56
|
+
"typecheck": "tsc --noEmit"
|
|
56
57
|
},
|
|
57
58
|
"dependencies": {
|
|
58
59
|
"@corti/sdk": "^0.5.0",
|