@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.
Files changed (47) hide show
  1. package/PageCaptureResponder.d.ts +1 -0
  2. package/PageCaptureResponder.js +12 -0
  3. package/_vendor/replo-utils/lib/crypto.mjs +1 -0
  4. package/_vendor/replo-utils/lib/fonts.mjs +18 -6
  5. package/_vendor/replo-utils/lib/math.mjs +1 -1
  6. package/_vendor/replo-utils/lib/pageCapture.d.ts +34 -0
  7. package/_vendor/replo-utils/lib/pageCapture.mjs +52 -0
  8. package/_vendor/schemas/generated/selectMode.d.ts +14 -0
  9. package/_vendor/schemas/generated/selectModeIframeRpc.d.ts +12 -2
  10. package/_vendor/schemas/iframeRpcChannel.mjs +1 -1
  11. package/_vendor/schemas/selectMode.d.ts +26 -2
  12. package/_vendor/schemas/selectMode.mjs +1 -1
  13. package/_vendor/schemas/selectModeIframeRpc.d.ts +53 -4
  14. package/_vendor/schemas/selectModeIframeRpc.mjs +18 -2
  15. package/_vendor/schemas/selectModeImage.mjs +6 -2
  16. package/buildMetadata.js +3 -3
  17. package/capturePage.d.ts +11 -0
  18. package/capturePage.js +261 -0
  19. package/chunk-LIPH4O4F.mjs +67 -0
  20. package/{chunk-XWNBKE63.mjs → chunk-PJBGUXBG.mjs} +6 -1
  21. package/design-library-preview/DesignLibraryPreview.js +18 -6
  22. package/package.json +5 -4
  23. package/sandbox-runtime.js +2 -0
  24. package/select-mode/EditorSelection.js +21 -4
  25. package/select-mode/SelectionFrames.js +56 -23
  26. package/select-mode/descriptor/elementDescriptor.d.ts +2 -1
  27. package/select-mode/descriptor/elementDescriptor.js +22 -14
  28. package/select-mode/hooks/useOptimisticOverrides.js +18 -6
  29. package/select-mode/hooks/useParentMessaging.d.ts +7 -1
  30. package/select-mode/hooks/useParentMessaging.js +6 -0
  31. package/select-mode/hooks/useSelectionHover.js +38 -15
  32. package/select-mode/hooks/useSelectionInteractions.js +9 -37
  33. package/select-mode/hooks/useSelectionScrollSync.js +5 -1
  34. package/select-mode/iframeRpcChannel.d.ts +10 -0
  35. package/select-mode/iframeRpcChannel.js +2 -0
  36. package/select-mode/imageOverridePreview.js +14 -5
  37. package/select-mode/imageSources.js +2 -1
  38. package/select-mode/inlineEditFeedback.js +9 -3
  39. package/select-mode/interactions/sectionGeometry.d.ts +3 -0
  40. package/select-mode/interactions/sectionGeometry.js +200 -0
  41. package/select-mode/selectModeStore.d.ts +36 -8
  42. package/select-mode/selectModeStore.js +141 -21
  43. package/select-mode/selectionFrame.d.ts +3 -1
  44. package/select-mode/selectionFrame.js +4 -0
  45. package/startPageCaptureResponder.d.ts +32 -0
  46. package/startPageCaptureResponder.js +87 -0
  47. 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
+ };
@@ -1,7 +0,0 @@
1
- import { v4 } from 'uuid';
2
-
3
- function randomUUID() {
4
- return v4();
5
- }
6
-
7
- export { randomUUID };