@replohq/sandbox-runtime 1.8.0 → 1.10.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/PageCaptureResponder.d.ts +1 -0
- package/PageCaptureResponder.js +12 -0
- package/_vendor/replo-utils/lib/crypto.mjs +1 -0
- package/_vendor/replo-utils/lib/fonts.mjs +18 -6
- package/_vendor/replo-utils/lib/math.mjs +1 -1
- package/_vendor/replo-utils/lib/pageCapture.d.ts +34 -0
- package/_vendor/replo-utils/lib/pageCapture.mjs +52 -0
- package/_vendor/schemas/generated/selectMode.d.ts +14 -0
- package/_vendor/schemas/generated/selectModeIframeRpc.d.ts +12 -2
- package/_vendor/schemas/iframeRpcChannel.mjs +1 -1
- package/_vendor/schemas/selectMode.d.ts +26 -2
- package/_vendor/schemas/selectMode.mjs +1 -1
- package/_vendor/schemas/selectModeIframeRpc.d.ts +53 -4
- package/_vendor/schemas/selectModeIframeRpc.mjs +18 -2
- package/_vendor/schemas/selectModeImage.mjs +6 -2
- package/buildMetadata.js +3 -3
- package/capturePage.d.ts +11 -0
- package/capturePage.js +261 -0
- package/chunk-LIPH4O4F.mjs +67 -0
- package/{chunk-XWNBKE63.mjs → chunk-PJBGUXBG.mjs} +6 -1
- package/design-library-preview/DesignLibraryPreview.js +18 -6
- package/package.json +5 -4
- package/sandbox-runtime.js +2 -0
- package/select-mode/EditorSelection.js +21 -4
- package/select-mode/SelectionFrames.js +56 -23
- package/select-mode/descriptor/elementDescriptor.d.ts +2 -1
- package/select-mode/descriptor/elementDescriptor.js +22 -14
- package/select-mode/hooks/useOptimisticOverrides.js +18 -6
- package/select-mode/hooks/useParentMessaging.d.ts +7 -1
- package/select-mode/hooks/useParentMessaging.js +6 -0
- package/select-mode/hooks/useSelectionHover.js +38 -15
- package/select-mode/hooks/useSelectionInteractions.js +9 -37
- package/select-mode/hooks/useSelectionScrollSync.js +5 -1
- package/select-mode/iframeRpcChannel.d.ts +10 -0
- package/select-mode/iframeRpcChannel.js +2 -0
- package/select-mode/imageOverridePreview.js +14 -5
- package/select-mode/imageSources.js +2 -1
- package/select-mode/inlineEditFeedback.js +9 -3
- package/select-mode/interactions/sectionGeometry.d.ts +3 -0
- package/select-mode/interactions/sectionGeometry.js +200 -0
- package/select-mode/selectModeStore.d.ts +36 -8
- package/select-mode/selectModeStore.js +141 -21
- package/select-mode/selectionFrame.d.ts +3 -1
- package/select-mode/selectionFrame.js +4 -0
- package/startPageCaptureResponder.d.ts +32 -0
- package/startPageCaptureResponder.js +87 -0
- package/chunk-SGKQ5HGT.mjs +0 -7
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
import {
|
|
2
|
+
isPageCaptureRequestMessage,
|
|
3
|
+
PAGE_CAPTURE_RESPONSE
|
|
4
|
+
} from "./_vendor/replo-utils/lib/pageCapture.mjs";
|
|
5
|
+
import { isTrustedViewportSnapshotRequester } from "./_vendor/replo-utils/lib/viewportSnapshot.mjs";
|
|
6
|
+
const IDLE_TIMEOUT_MS = 1e3;
|
|
7
|
+
function waitForIdle(targetWindow) {
|
|
8
|
+
return new Promise((resolve) => {
|
|
9
|
+
if (targetWindow.requestIdleCallback) {
|
|
10
|
+
targetWindow.requestIdleCallback(
|
|
11
|
+
() => {
|
|
12
|
+
resolve();
|
|
13
|
+
},
|
|
14
|
+
{ timeout: IDLE_TIMEOUT_MS }
|
|
15
|
+
);
|
|
16
|
+
} else {
|
|
17
|
+
setTimeout(resolve, 0);
|
|
18
|
+
}
|
|
19
|
+
});
|
|
20
|
+
}
|
|
21
|
+
async function respondToRequest({
|
|
22
|
+
targetWindow,
|
|
23
|
+
request
|
|
24
|
+
}) {
|
|
25
|
+
const failure = (error) => {
|
|
26
|
+
return {
|
|
27
|
+
response: {
|
|
28
|
+
type: PAGE_CAPTURE_RESPONSE,
|
|
29
|
+
requestId: request.requestId,
|
|
30
|
+
jpeg: null,
|
|
31
|
+
error
|
|
32
|
+
},
|
|
33
|
+
transfer: []
|
|
34
|
+
};
|
|
35
|
+
};
|
|
36
|
+
if (targetWindow.innerWidth !== request.width) {
|
|
37
|
+
return failure("layout-width-mismatch");
|
|
38
|
+
}
|
|
39
|
+
try {
|
|
40
|
+
const startedAt = performance.now();
|
|
41
|
+
await waitForIdle(targetWindow);
|
|
42
|
+
await targetWindow.document.fonts?.ready;
|
|
43
|
+
const { capturePage } = await import("./capturePage");
|
|
44
|
+
const blob = await capturePage({
|
|
45
|
+
width: request.width,
|
|
46
|
+
height: request.height
|
|
47
|
+
});
|
|
48
|
+
const jpeg = await blob.arrayBuffer();
|
|
49
|
+
return {
|
|
50
|
+
response: {
|
|
51
|
+
type: PAGE_CAPTURE_RESPONSE,
|
|
52
|
+
requestId: request.requestId,
|
|
53
|
+
jpeg,
|
|
54
|
+
ms: Math.round(performance.now() - startedAt)
|
|
55
|
+
},
|
|
56
|
+
transfer: [jpeg]
|
|
57
|
+
};
|
|
58
|
+
} catch (error) {
|
|
59
|
+
return failure(error instanceof Error ? error.message : String(error));
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
function startPageCaptureResponder(targetWindow) {
|
|
63
|
+
let queue = Promise.resolve();
|
|
64
|
+
const onMessage = (event) => {
|
|
65
|
+
if (event.source !== targetWindow.parent || !isPageCaptureRequestMessage(event.data) || !isTrustedViewportSnapshotRequester(event.origin)) {
|
|
66
|
+
return;
|
|
67
|
+
}
|
|
68
|
+
const request = event.data;
|
|
69
|
+
const requesterOrigin = event.origin;
|
|
70
|
+
queue = queue.then(async () => {
|
|
71
|
+
const { response, transfer } = await respondToRequest({
|
|
72
|
+
targetWindow,
|
|
73
|
+
request
|
|
74
|
+
});
|
|
75
|
+
targetWindow.parent.postMessage(response, requesterOrigin, transfer);
|
|
76
|
+
}).catch((error) => {
|
|
77
|
+
console.warn("[replo] page capture reply failed", error);
|
|
78
|
+
});
|
|
79
|
+
};
|
|
80
|
+
targetWindow.addEventListener("message", onMessage);
|
|
81
|
+
return () => {
|
|
82
|
+
targetWindow.removeEventListener("message", onMessage);
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
export {
|
|
86
|
+
startPageCaptureResponder
|
|
87
|
+
};
|