@mgamadeus/ddd-agents 0.1.0-alpha.49 → 0.1.0-alpha.51
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/dist/image-render.js +34 -18
- package/dist/image-render.js.map +1 -1
- package/package.json +1 -1
package/dist/image-render.js
CHANGED
|
@@ -229,11 +229,43 @@ const installLiveWidgetRequests = (bootstrap, readiness) => {
|
|
|
229
229
|
const originalAdapter = axios.defaults.adapter;
|
|
230
230
|
const originalFetch = window.fetch;
|
|
231
231
|
const fetchRead = originalFetch.bind(window);
|
|
232
|
+
const isScopedRead = (url, method, hasBody) => Boolean(bootstrap.authToken) && url.origin === window.location.origin && url.pathname.startsWith(getWidgetImageCaptureReadPathPrefix()) && method.toLowerCase() === "get" && !hasBody && !readiness.isFailed() && Date.now() < bootstrap.expiresAt * 1e3;
|
|
233
|
+
const readScoped = async (url, signal) => {
|
|
234
|
+
url.searchParams.delete("debug");
|
|
235
|
+
url.searchParams.delete("noCache");
|
|
236
|
+
const response = await fetchRead(url.toString(), {
|
|
237
|
+
method: "GET",
|
|
238
|
+
credentials: "omit",
|
|
239
|
+
cache: "no-store",
|
|
240
|
+
redirect: "error",
|
|
241
|
+
referrerPolicy: "no-referrer",
|
|
242
|
+
signal,
|
|
243
|
+
headers: {
|
|
244
|
+
Authorization: `Bearer ${bootstrap.authToken}`,
|
|
245
|
+
jwtSource: "internal_requests",
|
|
246
|
+
Accept: "application/json"
|
|
247
|
+
}
|
|
248
|
+
});
|
|
249
|
+
if (!response.ok) throw new Error("RENDER_READ_FAILED");
|
|
250
|
+
return response;
|
|
251
|
+
};
|
|
232
252
|
window.fetch = async (input, init) => {
|
|
233
253
|
const request = new Request(typeof input === "string" ? new URL(input, window.location.origin).href : input, init);
|
|
234
254
|
const url = new URL(request.url, window.location.origin);
|
|
235
255
|
const unavailable = readiness.isFailed() || Date.now() >= bootstrap.expiresAt * 1e3;
|
|
236
256
|
const isStaticAsset = url.origin === window.location.origin && STATIC_ASSET_PATH.test(url.pathname) && url.search === "" && request.method === "GET";
|
|
257
|
+
if (url.origin === window.location.origin && url.pathname.startsWith(getWidgetImageCaptureReadPathPrefix())) {
|
|
258
|
+
const finish2 = readiness.beginRequest();
|
|
259
|
+
try {
|
|
260
|
+
if (!isScopedRead(url, request.method, request.body !== null)) throw new Error("RENDER_READ_DENIED");
|
|
261
|
+
return await readScoped(url, init?.signal ?? request.signal);
|
|
262
|
+
} catch {
|
|
263
|
+
readiness.fail("WIDGET_HYDRATION_FAILED");
|
|
264
|
+
throw new TypeError("Widget hydration failed");
|
|
265
|
+
} finally {
|
|
266
|
+
finish2();
|
|
267
|
+
}
|
|
268
|
+
}
|
|
237
269
|
if (isStaticAsset && !unavailable) {
|
|
238
270
|
const finish2 = readiness.beginRequest();
|
|
239
271
|
try {
|
|
@@ -278,24 +310,8 @@ const installLiveWidgetRequests = (bootstrap, readiness) => {
|
|
|
278
310
|
const finish = readiness.beginRequest();
|
|
279
311
|
try {
|
|
280
312
|
const url = new URL(axios.getUri(config), window.location.origin);
|
|
281
|
-
if (!
|
|
282
|
-
|
|
283
|
-
url.searchParams.delete("debug");
|
|
284
|
-
url.searchParams.delete("noCache");
|
|
285
|
-
const response = await fetchRead(url.toString(), {
|
|
286
|
-
method: "GET",
|
|
287
|
-
credentials: "omit",
|
|
288
|
-
cache: "no-store",
|
|
289
|
-
redirect: "error",
|
|
290
|
-
referrerPolicy: "no-referrer",
|
|
291
|
-
signal: config.signal,
|
|
292
|
-
headers: {
|
|
293
|
-
Authorization: `Bearer ${bootstrap.authToken}`,
|
|
294
|
-
jwtSource: "internal_requests",
|
|
295
|
-
Accept: "application/json"
|
|
296
|
-
}
|
|
297
|
-
});
|
|
298
|
-
if (!response.ok) throw new Error("RENDER_READ_FAILED");
|
|
313
|
+
if (!isScopedRead(url, config.method ?? "get", config.data !== void 0)) throw new Error("RENDER_READ_DENIED");
|
|
314
|
+
const response = await readScoped(url, config.signal);
|
|
299
315
|
const data = await response.json();
|
|
300
316
|
return { data, status: response.status, statusText: "OK", config: {}, headers: {} };
|
|
301
317
|
} catch {
|
package/dist/image-render.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"image-render.js","sources":["../src/image-render/WidgetImageRender.tsx","../src/image-render/widget-image-readiness.ts","../src/image-render/frozen-widget-requests.ts","../src/image-render/widget-image-google-map.ts","../src/image-render/live-widget-requests.ts"],"sourcesContent":["import React, { useEffect, useRef } from \"react\";\nimport { conversationWidgetRegistry } from \"../renderer/conversationWidgetRegistry\";\nimport { resolveWidgetName } from \"../renderer/widget-name-resolver\";\nimport { buildWidgetAgentSpaceKeyProps } from \"../renderer/_agent-space/widget-agent-space-key-attribute\";\nimport { ReadOnlyConversationWidgetProvider } from \"../renderer/ConversationWidgetContext\";\nimport { ConversationWidgetRenderContext } from \"../renderer/ConversationWidgetRenderContext\";\nimport {\n WidgetImageRenderContext,\n WidgetImageLiveHydrationContext,\n WidgetImageReadinessContext,\n} from \"./WidgetImageRenderContext\";\nimport type { WidgetImageRenderBootstrap } from \"./widget-image-render.types\";\nimport type { createWidgetImageReadiness } from \"./widget-image-readiness\";\nimport styles from \"./WidgetImageRender.module.scss\";\n\n/**\n * Capture-only components by wire name: a frozen render shows the widget's visual from its complete snapshot, without\n * mounting the live fetch / OAuth / polling wrappers. An app adds its own with `registerStaticWidgetImageComponents`.\n */\nexport const staticWidgetImageComponents: Record<string, React.ComponentType<Record<string, unknown>>> = {};\n\n/** Adds an app's capture-only components (wire name → component). Runs outside React, before the first render. */\nexport const registerStaticWidgetImageComponents = (\n components: Readonly<Record<string, React.ComponentType<Record<string, unknown>>>>,\n): void => {\n Object.assign(staticWidgetImageComponents, components);\n};\n\ntype Readiness = ReturnType<typeof createWidgetImageReadiness>;\ntype HostProps = { bootstrap: WidgetImageRenderBootstrap; readiness: Readiness };\n\n// React error boundaries require a class. Never log customer payloads or send telemetry from capture.\nexport class WidgetImageCaptureBoundary extends React.Component<\n { children: React.ReactNode; fail: Readiness[\"fail\"] },\n { failed: boolean }\n> {\n state = { failed: false };\n static getDerivedStateFromError() {\n return { failed: true };\n }\n componentDidCatch() {\n this.props.fail(\"WIDGET_RENDER_FAILED\");\n }\n render() {\n return this.state.failed ? null : this.props.children;\n }\n}\n\n/**\n * The static image render of one widget (the e-mail capture): the registered widget in its e-mail presentation, inside\n * the read-only widget context, with the capture's frozen or live hydration. A frozen render takes the widget's static\n * capture component when the app registered one (`registerStaticWidgetImageComponents`). The app mounts it inside its\n * own store and theme (`WidgetImageCaptureBoundary` around it).\n */\nexport const WidgetImageRender = (props: HostProps) => {\n const { bootstrap, readiness } = props;\n const ref = useRef<HTMLDivElement>(null);\n const name = resolveWidgetName(bootstrap.input.widgetName);\n const entry = conversationWidgetRegistry.widgets.find((widget) => widget.name === name);\n useEffect(() => {\n if (!entry) readiness.fail(\"UNKNOWN_WIDGET\");\n else if (ref.current) return readiness.observe(ref.current);\n }, [entry, readiness]);\n if (!entry) return null;\n const Component =\n bootstrap.input.mode === \"live\" ? entry.component : (staticWidgetImageComponents[name ?? \"\"] ?? entry.component);\n return (\n <div ref={ref} className={styles.root} inert>\n <ConversationWidgetRenderContext.Provider value=\"email\">\n <WidgetImageReadinessContext.Provider value={readiness}>\n <ReadOnlyConversationWidgetProvider agentSpaceKey={bootstrap.siteId}>\n <WidgetImageRenderContext.Provider value={bootstrap.input.hydration}>\n <WidgetImageLiveHydrationContext.Provider value={bootstrap.input.mode === \"live\"}>\n <Component\n {...bootstrap.input.props}\n {...buildWidgetAgentSpaceKeyProps(bootstrap.siteId)}\n interactive={false}\n fresh={false}\n justDelivered={false}\n openedByPage={false}\n />\n </WidgetImageLiveHydrationContext.Provider>\n </WidgetImageRenderContext.Provider>\n </ReadOnlyConversationWidgetProvider>\n </WidgetImageReadinessContext.Provider>\n </ConversationWidgetRenderContext.Provider>\n </div>\n );\n};\n\n/** The slice the capture reads its hydration state from; any store that carries it (the capture's, a spec's). */\ninterface StoreWithWidgetHydration {\n getState: () => { AIExtensionsWidgetHydration: { widgets: Record<string, { status: string }> } };\n subscribe: (listener: () => void) => () => void;\n}\n\n/**\n * Holds the capture's readiness open while any widget hydration is idle or loading, and fails it on a hydration error.\n * Every shared hydrator counts — a widget's own, and each `$source` binding of a `ComposedView` tree, which reads through\n * the same slice (`ComposedViewDataSource:<name>`), so the shot waits for the tree's mail-time rows.\n */\nexport const followWidgetHydrationReadiness = (store: StoreWithWidgetHydration, readiness: Readiness) =>\n store.subscribe(() => {\n const widgets = Object.values(store.getState().AIExtensionsWidgetHydration.widgets);\n if (widgets.some((widget) => widget.status === \"error\")) readiness.fail(\"WIDGET_HYDRATION_FAILED\");\n readiness.setHydrationPending(widgets.some((widget) => widget.status === \"loading\" || widget.status === \"idle\"));\n });\n","import { publishWidgetImageReadiness, readWidgetImageReadiness } from \"./widget-image-readiness-signal\";\nimport type { WidgetImageRenderBootstrap, WidgetImageReadiness } from \"./widget-image-render.types\";\n\nconst MAX_TIMER_DELAY_MS = 2 ** 31 - 1;\n\nexport const createWidgetImageReadiness = (bootstrap: WidgetImageRenderBootstrap) => {\n let failed = readWidgetImageReadiness()?.state === \"failed\";\n let requestsPending = 0;\n let hydrationPending = false;\n let notifyChanged = () => {};\n let observed: HTMLElement | null = null;\n const identity = {\n version: 1 as const,\n snapshot_id: bootstrap.snapshotId,\n attempt_id: bootstrap.attemptId,\n input_sha256: bootstrap.inputSha256,\n render_version: bootstrap.renderVersion,\n };\n const publish = (state: WidgetImageReadiness[\"state\"], extra: Partial<WidgetImageReadiness> = {}) => {\n publishWidgetImageReadiness({ ...identity, state, ...extra });\n // Mirror outside the observed widget subtree for browser checks without changing screenshot pixels.\n document.documentElement.dataset.widgetImageState = state;\n document.documentElement.dataset.widgetImageError = extra.error_code ?? \"\";\n };\n if (!failed) publish(\"loading\");\n const measure = (element: HTMLElement) => {\n const { x, y, width, height } = element.getBoundingClientRect();\n return { x, y, width, height };\n };\n // A failed state still reports the widget box so the renderer can capture it when the caller suppresses errors.\n const fail = (code: string) => {\n if (failed || readWidgetImageReadiness()?.state === \"failed\") return;\n failed = true;\n const rect = observed ? measure(observed) : undefined;\n publish(\"failed\", rect && rect.width > 0 && rect.height > 0 ? { error_code: code, rect } : { error_code: code });\n };\n const isFailed = () => failed || readWidgetImageReadiness()?.state === \"failed\";\n const frame = () => new Promise<void>((resolve) => requestAnimationFrame(() => resolve()));\n\n const ready = async (element: HTMLElement, isCurrent: () => boolean = () => true) => {\n observed = element;\n try {\n // Effects and their state updates must commit before inspecting the final content.\n await frame();\n await frame();\n await document.fonts.ready;\n document.fonts.forEach((font) => {\n if (font.status === \"error\") throw new Error(\"FONT_FAILED\");\n });\n const images = Array.from(element.querySelectorAll(\"img\"));\n await Promise.all(\n images.map(async (img) => {\n // Empty decorative image slots have nothing to download or decode.\n if (!img.currentSrc && !img.getAttribute(\"src\") && !img.getAttribute(\"srcset\") && img.alt === \"\") return;\n if (img.loading !== \"eager\") img.loading = \"eager\";\n await img.decode();\n if (!img.naturalWidth) throw new Error(\"ASSET_FAILED\");\n }),\n );\n await frame();\n await frame();\n if (isFailed() || !isCurrent()) return;\n if (requestsPending > 0 || hydrationPending) return;\n if (Date.now() >= bootstrap.expiresAt * 1000) return fail(\"TOKEN_EXPIRED\");\n // Determinate bars visualize scores too; only indeterminate bars imply loading.\n if (\n element.querySelector(\n '[aria-busy=\"true\"], [role=\"progressbar\"]:not([aria-valuenow]), [class*=\"Skeleton\"], [class*=\"skeleton\"]',\n )\n ) {\n if (bootstrap.input.mode === \"live\") return;\n return fail(\"WIDGET_STILL_LOADING\");\n }\n const rect = element.getBoundingClientRect();\n const width = bootstrap.input.width ?? 528;\n const maxHeight = bootstrap.input.maxHeight ?? 1200;\n if (!element.textContent?.trim() && !element.querySelector(\"img,svg,canvas\")) return fail(\"EMPTY_WIDGET\");\n if (\n rect.width <= 0 ||\n rect.height <= 0 ||\n rect.width > width + 1 ||\n rect.height > maxHeight ||\n rect.x < 0 ||\n rect.y < 0 ||\n element.scrollWidth > Math.ceil(rect.width) ||\n element.scrollHeight > Math.ceil(rect.height)\n ) {\n return fail(\"WIDGET_BOUNDS_EXCEEDED\");\n }\n // The capture viewport may be smaller than the widget; the renderer sizes its viewport/clip from this rect.\n publish(\"ready\", { rect: measure(element) });\n } catch {\n if (isCurrent()) fail(\"REQUIRED_ASSET_FAILED\");\n }\n };\n const observe = (element: HTMLElement) => {\n observed = element;\n let revision = 0;\n let timer: ReturnType<typeof setTimeout>;\n let disposed = false;\n const changed = () => {\n if (disposed || isFailed()) return;\n revision += 1;\n const expected = revision;\n publish(\"loading\");\n clearTimeout(timer);\n // Frozen hydrators resolve synchronously; legacy frozen GET effects and chart layout may commit later.\n timer = setTimeout(() => void ready(element, () => !disposed && expected === revision), 250);\n };\n const observer = new MutationObserver(changed);\n notifyChanged = changed;\n observer.observe(element, { childList: true, subtree: true, attributes: true, characterData: true });\n const resize = new ResizeObserver(changed);\n resize.observe(element);\n changed();\n const remaining = bootstrap.expiresAt * 1000 - Date.now();\n // Browsers fire delays above 2^31-1 ms immediately; long-lived URLs cannot expire within the render deadline.\n const expiry =\n remaining <= MAX_TIMER_DELAY_MS ? setTimeout(() => fail(\"TOKEN_EXPIRED\"), Math.max(0, remaining)) : undefined;\n const deadline = setTimeout(() => {\n if (readWidgetImageReadiness()?.state !== \"ready\") fail(\"RENDER_DEADLINE_EXCEEDED\");\n }, 60000);\n return () => {\n disposed = true;\n observer.disconnect();\n resize.disconnect();\n clearTimeout(timer);\n if (expiry !== undefined) clearTimeout(expiry);\n clearTimeout(deadline);\n notifyChanged = () => {};\n };\n };\n const beginRequest = () => {\n requestsPending += 1;\n if (!isFailed()) publish(\"loading\");\n notifyChanged();\n return () => {\n requestsPending -= 1;\n notifyChanged();\n };\n };\n const setHydrationPending = (pending: boolean) => {\n if (hydrationPending === pending) return;\n hydrationPending = pending;\n if (!isFailed()) publish(\"loading\");\n notifyChanged();\n };\n return { ready, observe, fail, isFailed, beginRequest, setHydrationPending };\n};\n","import axios, { AxiosRequestConfig } from \"axios\";\n\n/** The capture page serves supplied GET results in memory. It never lends the render token to the SDK. */\nexport const installFrozenWidgetRequests = (responses: Record<string, unknown>, fail: (code: string) => void) => {\n const originalAdapter = axios.defaults.adapter;\n axios.defaults.adapter = async (config: AxiosRequestConfig) => {\n const url = new URL(axios.getUri(config), window.location.origin);\n url.searchParams.sort();\n const key = `${(config.method ?? \"get\").toUpperCase()} ${url.pathname}${url.search}`;\n if ((config.method ?? \"get\").toLowerCase() !== \"get\" || !Object.prototype.hasOwnProperty.call(responses, key)) {\n fail(\"MISSING_FROZEN_RESPONSE\");\n throw new Error(\"MISSING_FROZEN_RESPONSE\");\n }\n return { data: structuredClone(responses[key]), status: 200, statusText: \"OK\", config, headers: {} };\n };\n return () => {\n axios.defaults.adapter = originalAdapter;\n };\n};\n","import { getGoogleMapWidgetNames } from \"../provider/environment\";\n\n/** The deepest tree the walk follows — the backend decodes a block with the same depth (`json_decode(…, 32)`). */\nconst MAX_TREE_DEPTH = 32;\n\nconst isMapNodeInValue = (value: unknown, depth: number, googleMapWidgetNames: readonly string[]): boolean => {\n if (depth > MAX_TREE_DEPTH || typeof value !== \"object\" || value === null) return false;\n if (Array.isArray(value)) return value.some((element) => isMapNodeInValue(element, depth + 1, googleMapWidgetNames));\n const wireObject = value as Record<string, unknown>;\n if (wireObject.type === \"Map\") return true;\n if (wireObject.type === \"Widget\" && typeof wireObject.widget === \"string\") {\n const embeddedWidgetName = wireObject.widget.replace(/Directive$/, \"\");\n if (googleMapWidgetNames.includes(embeddedWidgetName)) return true;\n }\n return Object.values(wireObject).some((nested) => isMapNodeInValue(nested, depth + 1, googleMapWidgetNames));\n};\n\n/**\n * Whether a capture renders a Google map and so may load the Maps SDK (the narrow CSP and transport exception).\n * The twin of the backend's check that opens the page's CSP: the app's map widgets themselves\n * (`AgentsEnvironment.googleMapWidgetNames`), and a `ComposedView` whose tree holds a `Map` node or embeds one of them.\n * The payload is read as written; a payload that does not parse renders no map.\n */\nexport const isGoogleMapCapture = (widgetName: string, props: Record<string, unknown>): boolean => {\n const googleMapWidgetNames = getGoogleMapWidgetNames();\n if (googleMapWidgetNames.includes(widgetName)) return true;\n if (widgetName !== \"ComposedView\" || typeof props.payload !== \"string\") return false;\n try {\n return isMapNodeInValue((JSON.parse(props.payload) as Record<string, unknown>)?.view, 0, googleMapWidgetNames);\n } catch {\n return false;\n }\n};\n","import axios, { AxiosRequestConfig } from \"axios\";\nimport type { WidgetImageRenderBootstrap } from \"./widget-image-render.types\";\nimport type { createWidgetImageReadiness } from \"./widget-image-readiness\";\nimport { isGoogleMapCapture } from \"./widget-image-google-map\";\nimport { getWidgetImageCaptureReadPathPrefix } from \"../provider/environment\";\n\nconst STATIC_ASSET_PATH =\n /^\\/react\\/(?:app-build|widget-image-build)\\/assets\\/(?:[\\w-]+\\/)*[\\w.-]+\\.(?:svg|png|jpe?g|webp|gif)$/;\n\n/** Loaded only by the capture entry. SDK signatures stay unchanged; no ambient credentials are sent. */\nexport const installLiveWidgetRequests = (\n bootstrap: WidgetImageRenderBootstrap,\n readiness: ReturnType<typeof createWidgetImageReadiness>,\n) => {\n const originalAdapter = axios.defaults.adapter;\n const originalFetch = window.fetch;\n const fetchRead = originalFetch.bind(window);\n // Captured widgets may import shared telemetry/helpers. They cannot bypass the scoped adapter. Two reads pass:\n // static bundle images (useDynamicImport fetches icons such as review-source logos) and, for map captures only,\n // the Google Maps SDK (a map widget, or a ComposedView tree holding a map).\n window.fetch = async (input, init) => {\n const request = new Request(typeof input === \"string\" ? new URL(input, window.location.origin).href : input, init);\n const url = new URL(request.url, window.location.origin);\n const unavailable = readiness.isFailed() || Date.now() >= bootstrap.expiresAt * 1000;\n const isStaticAsset =\n url.origin === window.location.origin &&\n STATIC_ASSET_PATH.test(url.pathname) &&\n url.search === \"\" &&\n request.method === \"GET\";\n if (isStaticAsset && !unavailable) {\n const finish = readiness.beginRequest();\n try {\n return await fetchRead(url.toString(), {\n credentials: \"omit\",\n redirect: \"error\",\n referrerPolicy: \"no-referrer\",\n });\n } finally {\n finish();\n }\n }\n const isMap = isGoogleMapCapture(bootstrap.input.widgetName, bootstrap.input.props);\n const isGoogleMapRequest =\n url.protocol === \"https:\" &&\n ((url.hostname === \"maps.googleapis.com\" &&\n (url.pathname.startsWith(\"/maps/\") || url.pathname.startsWith(\"/$rpc/\"))) ||\n (url.hostname === \"maps.gstatic.com\" && url.pathname.startsWith(\"/mapfiles/\")));\n if (!isMap || !isGoogleMapRequest || ![\"GET\", \"POST\"].includes(request.method) || unavailable) {\n readiness.fail(\"UNSCOPED_REQUEST\");\n throw new Error(\"Unscoped render request\");\n }\n const headers = new Headers();\n for (const name of [\"content-type\", \"x-goog-api-key\", \"x-goog-api-client\", \"x-user-agent\"]) {\n const value = request.headers.get(name);\n if (value) headers.set(name, value);\n }\n const finish = readiness.beginRequest();\n try {\n const response = await fetchRead(request, {\n credentials: \"omit\",\n referrerPolicy: \"no-referrer\",\n redirect: \"error\",\n headers,\n });\n if (!response.ok) throw new Error(\"Map request failed\");\n return response;\n } catch {\n readiness.fail(\"MAP_ASSET_FAILED\");\n throw new Error(\"Map request failed\");\n } finally {\n finish();\n }\n };\n axios.defaults.adapter = async (config: AxiosRequestConfig) => {\n const finish = readiness.beginRequest();\n try {\n const url = new URL(axios.getUri(config), window.location.origin);\n if (\n !bootstrap.authToken ||\n url.origin !== window.location.origin ||\n !url.pathname.startsWith(getWidgetImageCaptureReadPathPrefix()) ||\n (config.method ?? \"get\").toLowerCase() !== \"get\" ||\n config.data !== undefined ||\n readiness.isFailed() ||\n Date.now() >= bootstrap.expiresAt * 1000\n )\n throw new Error(\"RENDER_READ_DENIED\");\n // The ordinary helper propagates debug/noCache from the page; capture requests never do.\n url.searchParams.delete(\"debug\");\n url.searchParams.delete(\"noCache\");\n const response = await fetchRead(url.toString(), {\n method: \"GET\",\n credentials: \"omit\",\n cache: \"no-store\",\n redirect: \"error\",\n referrerPolicy: \"no-referrer\",\n signal: config.signal as AbortSignal | undefined,\n headers: {\n Authorization: `Bearer ${bootstrap.authToken}`,\n jwtSource: \"internal_requests\",\n Accept: \"application/json\",\n },\n });\n if (!response.ok) throw new Error(\"RENDER_READ_FAILED\");\n const data = await response.json();\n return { data, status: response.status, statusText: \"OK\", config: {}, headers: {} };\n } catch {\n readiness.fail(\"WIDGET_HYDRATION_FAILED\");\n // HttpStore logs errors and submits telemetry for status 500. Never expose the URL,\n // request headers, auth token or remote exception body to those shared interceptors.\n throw { message: \"Widget hydration failed\", response: { status: 0, data: { error: \"Widget hydration failed\" } } };\n } finally {\n finish();\n }\n };\n return () => {\n axios.defaults.adapter = originalAdapter;\n window.fetch = originalFetch;\n };\n};\n"],"names":["finish"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"image-render.js","sources":["../src/image-render/WidgetImageRender.tsx","../src/image-render/widget-image-readiness.ts","../src/image-render/frozen-widget-requests.ts","../src/image-render/widget-image-google-map.ts","../src/image-render/live-widget-requests.ts"],"sourcesContent":["import React, { useEffect, useRef } from \"react\";\nimport { conversationWidgetRegistry } from \"../renderer/conversationWidgetRegistry\";\nimport { resolveWidgetName } from \"../renderer/widget-name-resolver\";\nimport { buildWidgetAgentSpaceKeyProps } from \"../renderer/_agent-space/widget-agent-space-key-attribute\";\nimport { ReadOnlyConversationWidgetProvider } from \"../renderer/ConversationWidgetContext\";\nimport { ConversationWidgetRenderContext } from \"../renderer/ConversationWidgetRenderContext\";\nimport {\n WidgetImageRenderContext,\n WidgetImageLiveHydrationContext,\n WidgetImageReadinessContext,\n} from \"./WidgetImageRenderContext\";\nimport type { WidgetImageRenderBootstrap } from \"./widget-image-render.types\";\nimport type { createWidgetImageReadiness } from \"./widget-image-readiness\";\nimport styles from \"./WidgetImageRender.module.scss\";\n\n/**\n * Capture-only components by wire name: a frozen render shows the widget's visual from its complete snapshot, without\n * mounting the live fetch / OAuth / polling wrappers. An app adds its own with `registerStaticWidgetImageComponents`.\n */\nexport const staticWidgetImageComponents: Record<string, React.ComponentType<Record<string, unknown>>> = {};\n\n/** Adds an app's capture-only components (wire name → component). Runs outside React, before the first render. */\nexport const registerStaticWidgetImageComponents = (\n components: Readonly<Record<string, React.ComponentType<Record<string, unknown>>>>,\n): void => {\n Object.assign(staticWidgetImageComponents, components);\n};\n\ntype Readiness = ReturnType<typeof createWidgetImageReadiness>;\ntype HostProps = { bootstrap: WidgetImageRenderBootstrap; readiness: Readiness };\n\n// React error boundaries require a class. Never log customer payloads or send telemetry from capture.\nexport class WidgetImageCaptureBoundary extends React.Component<\n { children: React.ReactNode; fail: Readiness[\"fail\"] },\n { failed: boolean }\n> {\n state = { failed: false };\n static getDerivedStateFromError() {\n return { failed: true };\n }\n componentDidCatch() {\n this.props.fail(\"WIDGET_RENDER_FAILED\");\n }\n render() {\n return this.state.failed ? null : this.props.children;\n }\n}\n\n/**\n * The static image render of one widget (the e-mail capture): the registered widget in its e-mail presentation, inside\n * the read-only widget context, with the capture's frozen or live hydration. A frozen render takes the widget's static\n * capture component when the app registered one (`registerStaticWidgetImageComponents`). The app mounts it inside its\n * own store and theme (`WidgetImageCaptureBoundary` around it).\n */\nexport const WidgetImageRender = (props: HostProps) => {\n const { bootstrap, readiness } = props;\n const ref = useRef<HTMLDivElement>(null);\n const name = resolveWidgetName(bootstrap.input.widgetName);\n const entry = conversationWidgetRegistry.widgets.find((widget) => widget.name === name);\n useEffect(() => {\n if (!entry) readiness.fail(\"UNKNOWN_WIDGET\");\n else if (ref.current) return readiness.observe(ref.current);\n }, [entry, readiness]);\n if (!entry) return null;\n const Component =\n bootstrap.input.mode === \"live\" ? entry.component : (staticWidgetImageComponents[name ?? \"\"] ?? entry.component);\n return (\n <div ref={ref} className={styles.root} inert>\n <ConversationWidgetRenderContext.Provider value=\"email\">\n <WidgetImageReadinessContext.Provider value={readiness}>\n <ReadOnlyConversationWidgetProvider agentSpaceKey={bootstrap.siteId}>\n <WidgetImageRenderContext.Provider value={bootstrap.input.hydration}>\n <WidgetImageLiveHydrationContext.Provider value={bootstrap.input.mode === \"live\"}>\n <Component\n {...bootstrap.input.props}\n {...buildWidgetAgentSpaceKeyProps(bootstrap.siteId)}\n interactive={false}\n fresh={false}\n justDelivered={false}\n openedByPage={false}\n />\n </WidgetImageLiveHydrationContext.Provider>\n </WidgetImageRenderContext.Provider>\n </ReadOnlyConversationWidgetProvider>\n </WidgetImageReadinessContext.Provider>\n </ConversationWidgetRenderContext.Provider>\n </div>\n );\n};\n\n/** The slice the capture reads its hydration state from; any store that carries it (the capture's, a spec's). */\ninterface StoreWithWidgetHydration {\n getState: () => { AIExtensionsWidgetHydration: { widgets: Record<string, { status: string }> } };\n subscribe: (listener: () => void) => () => void;\n}\n\n/**\n * Holds the capture's readiness open while any widget hydration is idle or loading, and fails it on a hydration error.\n * Every shared hydrator counts — a widget's own, and each `$source` binding of a `ComposedView` tree, which reads through\n * the same slice (`ComposedViewDataSource:<name>`), so the shot waits for the tree's mail-time rows.\n */\nexport const followWidgetHydrationReadiness = (store: StoreWithWidgetHydration, readiness: Readiness) =>\n store.subscribe(() => {\n const widgets = Object.values(store.getState().AIExtensionsWidgetHydration.widgets);\n if (widgets.some((widget) => widget.status === \"error\")) readiness.fail(\"WIDGET_HYDRATION_FAILED\");\n readiness.setHydrationPending(widgets.some((widget) => widget.status === \"loading\" || widget.status === \"idle\"));\n });\n","import { publishWidgetImageReadiness, readWidgetImageReadiness } from \"./widget-image-readiness-signal\";\nimport type { WidgetImageRenderBootstrap, WidgetImageReadiness } from \"./widget-image-render.types\";\n\nconst MAX_TIMER_DELAY_MS = 2 ** 31 - 1;\n\nexport const createWidgetImageReadiness = (bootstrap: WidgetImageRenderBootstrap) => {\n let failed = readWidgetImageReadiness()?.state === \"failed\";\n let requestsPending = 0;\n let hydrationPending = false;\n let notifyChanged = () => {};\n let observed: HTMLElement | null = null;\n const identity = {\n version: 1 as const,\n snapshot_id: bootstrap.snapshotId,\n attempt_id: bootstrap.attemptId,\n input_sha256: bootstrap.inputSha256,\n render_version: bootstrap.renderVersion,\n };\n const publish = (state: WidgetImageReadiness[\"state\"], extra: Partial<WidgetImageReadiness> = {}) => {\n publishWidgetImageReadiness({ ...identity, state, ...extra });\n // Mirror outside the observed widget subtree for browser checks without changing screenshot pixels.\n document.documentElement.dataset.widgetImageState = state;\n document.documentElement.dataset.widgetImageError = extra.error_code ?? \"\";\n };\n if (!failed) publish(\"loading\");\n const measure = (element: HTMLElement) => {\n const { x, y, width, height } = element.getBoundingClientRect();\n return { x, y, width, height };\n };\n // A failed state still reports the widget box so the renderer can capture it when the caller suppresses errors.\n const fail = (code: string) => {\n if (failed || readWidgetImageReadiness()?.state === \"failed\") return;\n failed = true;\n const rect = observed ? measure(observed) : undefined;\n publish(\"failed\", rect && rect.width > 0 && rect.height > 0 ? { error_code: code, rect } : { error_code: code });\n };\n const isFailed = () => failed || readWidgetImageReadiness()?.state === \"failed\";\n const frame = () => new Promise<void>((resolve) => requestAnimationFrame(() => resolve()));\n\n const ready = async (element: HTMLElement, isCurrent: () => boolean = () => true) => {\n observed = element;\n try {\n // Effects and their state updates must commit before inspecting the final content.\n await frame();\n await frame();\n await document.fonts.ready;\n document.fonts.forEach((font) => {\n if (font.status === \"error\") throw new Error(\"FONT_FAILED\");\n });\n const images = Array.from(element.querySelectorAll(\"img\"));\n await Promise.all(\n images.map(async (img) => {\n // Empty decorative image slots have nothing to download or decode.\n if (!img.currentSrc && !img.getAttribute(\"src\") && !img.getAttribute(\"srcset\") && img.alt === \"\") return;\n if (img.loading !== \"eager\") img.loading = \"eager\";\n await img.decode();\n if (!img.naturalWidth) throw new Error(\"ASSET_FAILED\");\n }),\n );\n await frame();\n await frame();\n if (isFailed() || !isCurrent()) return;\n if (requestsPending > 0 || hydrationPending) return;\n if (Date.now() >= bootstrap.expiresAt * 1000) return fail(\"TOKEN_EXPIRED\");\n // Determinate bars visualize scores too; only indeterminate bars imply loading.\n if (\n element.querySelector(\n '[aria-busy=\"true\"], [role=\"progressbar\"]:not([aria-valuenow]), [class*=\"Skeleton\"], [class*=\"skeleton\"]',\n )\n ) {\n if (bootstrap.input.mode === \"live\") return;\n return fail(\"WIDGET_STILL_LOADING\");\n }\n const rect = element.getBoundingClientRect();\n const width = bootstrap.input.width ?? 528;\n const maxHeight = bootstrap.input.maxHeight ?? 1200;\n if (!element.textContent?.trim() && !element.querySelector(\"img,svg,canvas\")) return fail(\"EMPTY_WIDGET\");\n if (\n rect.width <= 0 ||\n rect.height <= 0 ||\n rect.width > width + 1 ||\n rect.height > maxHeight ||\n rect.x < 0 ||\n rect.y < 0 ||\n element.scrollWidth > Math.ceil(rect.width) ||\n element.scrollHeight > Math.ceil(rect.height)\n ) {\n return fail(\"WIDGET_BOUNDS_EXCEEDED\");\n }\n // The capture viewport may be smaller than the widget; the renderer sizes its viewport/clip from this rect.\n publish(\"ready\", { rect: measure(element) });\n } catch {\n if (isCurrent()) fail(\"REQUIRED_ASSET_FAILED\");\n }\n };\n const observe = (element: HTMLElement) => {\n observed = element;\n let revision = 0;\n let timer: ReturnType<typeof setTimeout>;\n let disposed = false;\n const changed = () => {\n if (disposed || isFailed()) return;\n revision += 1;\n const expected = revision;\n publish(\"loading\");\n clearTimeout(timer);\n // Frozen hydrators resolve synchronously; legacy frozen GET effects and chart layout may commit later.\n timer = setTimeout(() => void ready(element, () => !disposed && expected === revision), 250);\n };\n const observer = new MutationObserver(changed);\n notifyChanged = changed;\n observer.observe(element, { childList: true, subtree: true, attributes: true, characterData: true });\n const resize = new ResizeObserver(changed);\n resize.observe(element);\n changed();\n const remaining = bootstrap.expiresAt * 1000 - Date.now();\n // Browsers fire delays above 2^31-1 ms immediately; long-lived URLs cannot expire within the render deadline.\n const expiry =\n remaining <= MAX_TIMER_DELAY_MS ? setTimeout(() => fail(\"TOKEN_EXPIRED\"), Math.max(0, remaining)) : undefined;\n const deadline = setTimeout(() => {\n if (readWidgetImageReadiness()?.state !== \"ready\") fail(\"RENDER_DEADLINE_EXCEEDED\");\n }, 60000);\n return () => {\n disposed = true;\n observer.disconnect();\n resize.disconnect();\n clearTimeout(timer);\n if (expiry !== undefined) clearTimeout(expiry);\n clearTimeout(deadline);\n notifyChanged = () => {};\n };\n };\n const beginRequest = () => {\n requestsPending += 1;\n if (!isFailed()) publish(\"loading\");\n notifyChanged();\n return () => {\n requestsPending -= 1;\n notifyChanged();\n };\n };\n const setHydrationPending = (pending: boolean) => {\n if (hydrationPending === pending) return;\n hydrationPending = pending;\n if (!isFailed()) publish(\"loading\");\n notifyChanged();\n };\n return { ready, observe, fail, isFailed, beginRequest, setHydrationPending };\n};\n","import axios, { AxiosRequestConfig } from \"axios\";\n\n/** The capture page serves supplied GET results in memory. It never lends the render token to the SDK. */\nexport const installFrozenWidgetRequests = (responses: Record<string, unknown>, fail: (code: string) => void) => {\n const originalAdapter = axios.defaults.adapter;\n axios.defaults.adapter = async (config: AxiosRequestConfig) => {\n const url = new URL(axios.getUri(config), window.location.origin);\n url.searchParams.sort();\n const key = `${(config.method ?? \"get\").toUpperCase()} ${url.pathname}${url.search}`;\n if ((config.method ?? \"get\").toLowerCase() !== \"get\" || !Object.prototype.hasOwnProperty.call(responses, key)) {\n fail(\"MISSING_FROZEN_RESPONSE\");\n throw new Error(\"MISSING_FROZEN_RESPONSE\");\n }\n return { data: structuredClone(responses[key]), status: 200, statusText: \"OK\", config, headers: {} };\n };\n return () => {\n axios.defaults.adapter = originalAdapter;\n };\n};\n","import { getGoogleMapWidgetNames } from \"../provider/environment\";\n\n/** The deepest tree the walk follows — the backend decodes a block with the same depth (`json_decode(…, 32)`). */\nconst MAX_TREE_DEPTH = 32;\n\nconst isMapNodeInValue = (value: unknown, depth: number, googleMapWidgetNames: readonly string[]): boolean => {\n if (depth > MAX_TREE_DEPTH || typeof value !== \"object\" || value === null) return false;\n if (Array.isArray(value)) return value.some((element) => isMapNodeInValue(element, depth + 1, googleMapWidgetNames));\n const wireObject = value as Record<string, unknown>;\n if (wireObject.type === \"Map\") return true;\n if (wireObject.type === \"Widget\" && typeof wireObject.widget === \"string\") {\n const embeddedWidgetName = wireObject.widget.replace(/Directive$/, \"\");\n if (googleMapWidgetNames.includes(embeddedWidgetName)) return true;\n }\n return Object.values(wireObject).some((nested) => isMapNodeInValue(nested, depth + 1, googleMapWidgetNames));\n};\n\n/**\n * Whether a capture renders a Google map and so may load the Maps SDK (the narrow CSP and transport exception).\n * The twin of the backend's check that opens the page's CSP: the app's map widgets themselves\n * (`AgentsEnvironment.googleMapWidgetNames`), and a `ComposedView` whose tree holds a `Map` node or embeds one of them.\n * The payload is read as written; a payload that does not parse renders no map.\n */\nexport const isGoogleMapCapture = (widgetName: string, props: Record<string, unknown>): boolean => {\n const googleMapWidgetNames = getGoogleMapWidgetNames();\n if (googleMapWidgetNames.includes(widgetName)) return true;\n if (widgetName !== \"ComposedView\" || typeof props.payload !== \"string\") return false;\n try {\n return isMapNodeInValue((JSON.parse(props.payload) as Record<string, unknown>)?.view, 0, googleMapWidgetNames);\n } catch {\n return false;\n }\n};\n","import axios, { AxiosRequestConfig } from \"axios\";\nimport type { WidgetImageRenderBootstrap } from \"./widget-image-render.types\";\nimport type { createWidgetImageReadiness } from \"./widget-image-readiness\";\nimport { isGoogleMapCapture } from \"./widget-image-google-map\";\nimport { getWidgetImageCaptureReadPathPrefix } from \"../provider/environment\";\n\nconst STATIC_ASSET_PATH =\n /^\\/react\\/(?:app-build|widget-image-build)\\/assets\\/(?:[\\w-]+\\/)*[\\w.-]+\\.(?:svg|png|jpe?g|webp|gif)$/;\n\n/** Loaded only by the capture entry. SDK signatures stay unchanged; no ambient credentials are sent. */\nexport const installLiveWidgetRequests = (\n bootstrap: WidgetImageRenderBootstrap,\n readiness: ReturnType<typeof createWidgetImageReadiness>,\n) => {\n const originalAdapter = axios.defaults.adapter;\n const originalFetch = window.fetch;\n const fetchRead = originalFetch.bind(window);\n // The one read a capture may make of the backend: a GET without body under the capture read path, with the\n // capture token and nothing of the page (cookies, debug/noCache) — through axios and through fetch alike.\n const isScopedRead = (url: URL, method: string, hasBody: boolean) =>\n Boolean(bootstrap.authToken) &&\n url.origin === window.location.origin &&\n url.pathname.startsWith(getWidgetImageCaptureReadPathPrefix()) &&\n method.toLowerCase() === \"get\" &&\n !hasBody &&\n !readiness.isFailed() &&\n Date.now() < bootstrap.expiresAt * 1000;\n const readScoped = async (url: URL, signal: AbortSignal | undefined) => {\n // The ordinary helper propagates debug/noCache from the page; capture requests never do.\n url.searchParams.delete(\"debug\");\n url.searchParams.delete(\"noCache\");\n const response = await fetchRead(url.toString(), {\n method: \"GET\",\n credentials: \"omit\",\n cache: \"no-store\",\n redirect: \"error\",\n referrerPolicy: \"no-referrer\",\n signal,\n headers: {\n Authorization: `Bearer ${bootstrap.authToken}`,\n jwtSource: \"internal_requests\",\n Accept: \"application/json\",\n },\n });\n if (!response.ok) throw new Error(\"RENDER_READ_FAILED\");\n return response;\n };\n // Captured widgets may import shared telemetry/helpers. They cannot bypass the scoped reads. Three reads pass:\n // the capture read path (as through axios: a client on fetch reads its data the same way), static bundle images\n // (useDynamicImport fetches icons such as review-source logos) and, for map captures only, the Google Maps SDK (a map\n // widget, or a ComposedView tree holding a map).\n window.fetch = async (input, init) => {\n const request = new Request(typeof input === \"string\" ? new URL(input, window.location.origin).href : input, init);\n const url = new URL(request.url, window.location.origin);\n const unavailable = readiness.isFailed() || Date.now() >= bootstrap.expiresAt * 1000;\n const isStaticAsset =\n url.origin === window.location.origin &&\n STATIC_ASSET_PATH.test(url.pathname) &&\n url.search === \"\" &&\n request.method === \"GET\";\n if (url.origin === window.location.origin && url.pathname.startsWith(getWidgetImageCaptureReadPathPrefix())) {\n const finish = readiness.beginRequest();\n try {\n if (!isScopedRead(url, request.method, request.body !== null)) throw new Error(\"RENDER_READ_DENIED\");\n return await readScoped(url, init?.signal ?? request.signal);\n } catch {\n readiness.fail(\"WIDGET_HYDRATION_FAILED\");\n // never the URL, the headers, the token or the remote body to the page's own error handling\n throw new TypeError(\"Widget hydration failed\");\n } finally {\n finish();\n }\n }\n if (isStaticAsset && !unavailable) {\n const finish = readiness.beginRequest();\n try {\n return await fetchRead(url.toString(), {\n credentials: \"omit\",\n redirect: \"error\",\n referrerPolicy: \"no-referrer\",\n });\n } finally {\n finish();\n }\n }\n const isMap = isGoogleMapCapture(bootstrap.input.widgetName, bootstrap.input.props);\n const isGoogleMapRequest =\n url.protocol === \"https:\" &&\n ((url.hostname === \"maps.googleapis.com\" &&\n (url.pathname.startsWith(\"/maps/\") || url.pathname.startsWith(\"/$rpc/\"))) ||\n (url.hostname === \"maps.gstatic.com\" && url.pathname.startsWith(\"/mapfiles/\")));\n if (!isMap || !isGoogleMapRequest || ![\"GET\", \"POST\"].includes(request.method) || unavailable) {\n readiness.fail(\"UNSCOPED_REQUEST\");\n throw new Error(\"Unscoped render request\");\n }\n const headers = new Headers();\n for (const name of [\"content-type\", \"x-goog-api-key\", \"x-goog-api-client\", \"x-user-agent\"]) {\n const value = request.headers.get(name);\n if (value) headers.set(name, value);\n }\n const finish = readiness.beginRequest();\n try {\n const response = await fetchRead(request, {\n credentials: \"omit\",\n referrerPolicy: \"no-referrer\",\n redirect: \"error\",\n headers,\n });\n if (!response.ok) throw new Error(\"Map request failed\");\n return response;\n } catch {\n readiness.fail(\"MAP_ASSET_FAILED\");\n throw new Error(\"Map request failed\");\n } finally {\n finish();\n }\n };\n axios.defaults.adapter = async (config: AxiosRequestConfig) => {\n const finish = readiness.beginRequest();\n try {\n const url = new URL(axios.getUri(config), window.location.origin);\n if (!isScopedRead(url, config.method ?? \"get\", config.data !== undefined)) throw new Error(\"RENDER_READ_DENIED\");\n const response = await readScoped(url, config.signal as AbortSignal | undefined);\n const data = await response.json();\n return { data, status: response.status, statusText: \"OK\", config: {}, headers: {} };\n } catch {\n readiness.fail(\"WIDGET_HYDRATION_FAILED\");\n // HttpStore logs errors and submits telemetry for status 500. Never expose the URL,\n // request headers, auth token or remote exception body to those shared interceptors.\n throw { message: \"Widget hydration failed\", response: { status: 0, data: { error: \"Widget hydration failed\" } } };\n } finally {\n finish();\n }\n };\n return () => {\n axios.defaults.adapter = originalAdapter;\n window.fetch = originalFetch;\n };\n};\n"],"names":["finish"],"mappings":"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"}
|
package/package.json
CHANGED