remotion 4.0.341 → 4.0.342

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 (35) hide show
  1. package/dist/cjs/Artifact.js +2 -2
  2. package/dist/cjs/Composition.d.ts +1 -0
  3. package/dist/cjs/Composition.js +2 -2
  4. package/dist/cjs/ResolveCompositionConfig.js +13 -6
  5. package/dist/cjs/Sequence.js +6 -3
  6. package/dist/cjs/audio/Audio.js +2 -2
  7. package/dist/cjs/audio/shared-audio-tags.js +4 -1
  8. package/dist/cjs/delay-render.d.ts +12 -0
  9. package/dist/cjs/delay-render.js +28 -11
  10. package/dist/cjs/get-cross-origin-value.js +1 -1
  11. package/dist/cjs/get-remotion-environment.js +2 -1
  12. package/dist/cjs/index.d.ts +4 -0
  13. package/dist/cjs/index.js +5 -1
  14. package/dist/cjs/play-and-handle-not-allowed-error.d.ts +2 -1
  15. package/dist/cjs/play-and-handle-not-allowed-error.js +2 -3
  16. package/dist/cjs/resolve-video-config.js +2 -0
  17. package/dist/cjs/timeline-position-state.js +3 -4
  18. package/dist/cjs/use-current-frame.js +3 -2
  19. package/dist/cjs/use-current-scale.js +3 -2
  20. package/dist/cjs/use-delay-render.d.ts +8 -0
  21. package/dist/cjs/use-delay-render.js +17 -0
  22. package/dist/cjs/use-media-in-timeline.js +6 -3
  23. package/dist/cjs/use-media-playback.js +5 -0
  24. package/dist/cjs/use-remotion-environment.d.ts +6 -0
  25. package/dist/cjs/use-remotion-environment.js +14 -0
  26. package/dist/cjs/version.d.ts +1 -1
  27. package/dist/cjs/version.js +1 -1
  28. package/dist/cjs/video/OffthreadVideo.js +2 -2
  29. package/dist/cjs/video/Video.js +2 -2
  30. package/dist/cjs/video/VideoForRendering.js +2 -2
  31. package/dist/esm/index.mjs +142 -89
  32. package/dist/esm/version.mjs +1 -1
  33. package/package.json +2 -2
  34. package/dist/cjs/video/use-audio-channel-index.d.ts +0 -4
  35. package/dist/cjs/video/use-audio-channel-index.js +0 -13
@@ -3,12 +3,12 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.Artifact = void 0;
4
4
  const react_1 = require("react");
5
5
  const RenderAssetManager_1 = require("./RenderAssetManager");
6
- const get_remotion_environment_1 = require("./get-remotion-environment");
7
6
  const use_current_frame_1 = require("./use-current-frame");
7
+ const use_remotion_environment_1 = require("./use-remotion-environment");
8
8
  const ArtifactThumbnail = Symbol('Thumbnail');
9
9
  const Artifact = ({ filename, content, downloadBehavior }) => {
10
10
  const { registerRenderAsset, unregisterRenderAsset } = (0, react_1.useContext)(RenderAssetManager_1.RenderAssetManager);
11
- const [env] = (0, react_1.useState)(() => (0, get_remotion_environment_1.getRemotionEnvironment)());
11
+ const env = (0, use_remotion_environment_1.useRemotionEnvironment)();
12
12
  const frame = (0, use_current_frame_1.useCurrentFrame)();
13
13
  const [id] = (0, react_1.useState)(() => {
14
14
  return String(Math.random());
@@ -28,6 +28,7 @@ export type CalculateMetadataFunction<T extends Record<string, unknown>> = (opti
28
28
  props: T;
29
29
  abortSignal: AbortSignal;
30
30
  compositionId: string;
31
+ isRendering: boolean;
31
32
  }) => Promise<CalcMetadataReturnType<T>> | CalcMetadataReturnType<T>;
32
33
  type OptionalDimensions<Schema extends AnyZodObject, Props extends Record<string, unknown>> = {
33
34
  width?: number;
@@ -9,13 +9,13 @@ const CompositionManagerContext_js_1 = require("./CompositionManagerContext.js")
9
9
  const Folder_js_1 = require("./Folder.js");
10
10
  const ResolveCompositionConfig_js_1 = require("./ResolveCompositionConfig.js");
11
11
  const delay_render_js_1 = require("./delay-render.js");
12
- const get_remotion_environment_js_1 = require("./get-remotion-environment.js");
13
12
  const input_props_serialization_js_1 = require("./input-props-serialization.js");
14
13
  const is_player_js_1 = require("./is-player.js");
15
14
  const loading_indicator_js_1 = require("./loading-indicator.js");
16
15
  const nonce_js_1 = require("./nonce.js");
17
16
  const portal_node_js_1 = require("./portal-node.js");
18
17
  const use_lazy_component_js_1 = require("./use-lazy-component.js");
18
+ const use_remotion_environment_js_1 = require("./use-remotion-environment.js");
19
19
  const use_video_js_1 = require("./use-video.js");
20
20
  const validate_composition_id_js_1 = require("./validation/validate-composition-id.js");
21
21
  const validate_default_props_js_1 = require("./validation/validate-default-props.js");
@@ -38,7 +38,7 @@ const InnerComposition = ({ width, height, fps, durationInFrames, id, defaultPro
38
38
  });
39
39
  const nonce = (0, nonce_js_1.useNonce)();
40
40
  const isPlayer = (0, is_player_js_1.useIsPlayer)();
41
- const environment = (0, get_remotion_environment_js_1.getRemotionEnvironment)();
41
+ const environment = (0, use_remotion_environment_js_1.useRemotionEnvironment)();
42
42
  const canUseComposition = (0, react_1.useContext)(CanUseRemotionHooks_js_1.CanUseRemotionHooks);
43
43
  if (canUseComposition) {
44
44
  if (isPlayer) {
@@ -6,9 +6,9 @@ const react_1 = require("react");
6
6
  const CompositionManagerContext_js_1 = require("./CompositionManagerContext.js");
7
7
  const EditorProps_js_1 = require("./EditorProps.js");
8
8
  const input_props_js_1 = require("./config/input-props.js");
9
- const get_remotion_environment_js_1 = require("./get-remotion-environment.js");
10
9
  const nonce_js_1 = require("./nonce.js");
11
10
  const resolve_video_config_js_1 = require("./resolve-video-config.js");
11
+ const use_remotion_environment_js_1 = require("./use-remotion-environment.js");
12
12
  const validate_dimensions_js_1 = require("./validation/validate-dimensions.js");
13
13
  const validate_duration_in_frames_js_1 = require("./validation/validate-duration-in-frames.js");
14
14
  const validate_fps_js_1 = require("./validation/validate-fps.js");
@@ -34,12 +34,13 @@ const ResolveCompositionConfig = ({ children }) => {
34
34
  }, [canvasContent, compositions]);
35
35
  const renderModalComposition = compositions.find((c) => c.id === currentRenderModalComposition);
36
36
  const { props: allEditorProps } = (0, react_1.useContext)(EditorProps_js_1.EditorPropsContext);
37
+ const env = (0, use_remotion_environment_js_1.useRemotionEnvironment)();
37
38
  const inputProps = (0, react_1.useMemo)(() => {
38
39
  var _a;
39
- return typeof window === 'undefined' || (0, get_remotion_environment_js_1.getRemotionEnvironment)().isPlayer
40
+ return typeof window === 'undefined' || env.isPlayer
40
41
  ? {}
41
42
  : ((_a = (0, input_props_js_1.getInputProps)()) !== null && _a !== void 0 ? _a : {});
42
- }, []);
43
+ }, [env.isPlayer]);
43
44
  const [resolvedConfigs, setResolvedConfigs] = (0, react_1.useState)({});
44
45
  const selectedEditorProps = (0, react_1.useMemo)(() => {
45
46
  var _a;
@@ -297,6 +298,7 @@ const useResolvedVideoConfig = (preferredCompositionId) => {
297
298
  var _a;
298
299
  return composition ? ((_a = allEditorProps[composition.id]) !== null && _a !== void 0 ? _a : {}) : {};
299
300
  }, [allEditorProps, composition]);
301
+ const env = (0, use_remotion_environment_js_1.useRemotionEnvironment)();
300
302
  return (0, react_1.useMemo)(() => {
301
303
  var _a, _b, _c, _d;
302
304
  if (!composition) {
@@ -332,8 +334,7 @@ const useResolvedVideoConfig = (preferredCompositionId) => {
332
334
  props: {
333
335
  ...((_c = composition.defaultProps) !== null && _c !== void 0 ? _c : {}),
334
336
  ...(selectedEditorProps !== null && selectedEditorProps !== void 0 ? selectedEditorProps : {}),
335
- ...(typeof window === 'undefined' ||
336
- (0, get_remotion_environment_js_1.getRemotionEnvironment)().isPlayer
337
+ ...(typeof window === 'undefined' || env.isPlayer
337
338
  ? {}
338
339
  : ((_d = (0, input_props_js_1.getInputProps)()) !== null && _d !== void 0 ? _d : {})),
339
340
  },
@@ -348,6 +349,12 @@ const useResolvedVideoConfig = (preferredCompositionId) => {
348
349
  return null;
349
350
  }
350
351
  return context[composition.id];
351
- }, [composition, context, currentCompositionMetadata, selectedEditorProps]);
352
+ }, [
353
+ composition,
354
+ context,
355
+ currentCompositionMetadata,
356
+ selectedEditorProps,
357
+ env.isPlayer,
358
+ ]);
352
359
  };
353
360
  exports.useResolvedVideoConfig = useResolvedVideoConfig;
@@ -7,12 +7,12 @@ const react_1 = require("react");
7
7
  const AbsoluteFill_js_1 = require("./AbsoluteFill.js");
8
8
  const SequenceContext_js_1 = require("./SequenceContext.js");
9
9
  const SequenceManager_js_1 = require("./SequenceManager.js");
10
- const get_remotion_environment_js_1 = require("./get-remotion-environment.js");
11
10
  const nonce_js_1 = require("./nonce.js");
12
11
  const timeline_position_state_js_1 = require("./timeline-position-state.js");
13
12
  const use_video_config_js_1 = require("./use-video-config.js");
14
13
  const freeze_js_1 = require("./freeze.js");
15
14
  const use_current_frame_1 = require("./use-current-frame");
15
+ const use_remotion_environment_js_1 = require("./use-remotion-environment.js");
16
16
  const RegularSequenceRefForwardingFunction = ({ from = 0, durationInFrames = Infinity, children, name, height, width, showInTimeline = true, _remotionInternalLoopDisplay: loopDisplay, _remotionInternalStack: stack, _remotionInternalPremountDisplay: premountDisplay, _remotionInternalPostmountDisplay: postmountDisplay, ...other }, ref) => {
17
17
  var _a;
18
18
  const { layout = 'absolute-fill' } = other;
@@ -87,9 +87,10 @@ const RegularSequenceRefForwardingFunction = ({ from = 0, durationInFrames = Inf
87
87
  const timelineClipName = (0, react_1.useMemo)(() => {
88
88
  return name !== null && name !== void 0 ? name : '';
89
89
  }, [name]);
90
+ const env = (0, use_remotion_environment_js_1.useRemotionEnvironment)();
90
91
  (0, react_1.useEffect)(() => {
91
92
  var _a;
92
- if (!(0, get_remotion_environment_js_1.getRemotionEnvironment)().isStudio) {
93
+ if (!env.isStudio) {
93
94
  return;
94
95
  }
95
96
  registerSequence({
@@ -127,6 +128,7 @@ const RegularSequenceRefForwardingFunction = ({ from = 0, durationInFrames = Inf
127
128
  stack,
128
129
  premountDisplay,
129
130
  postmountDisplay,
131
+ env.isStudio,
130
132
  ]);
131
133
  // Ceil to support floats
132
134
  // https://github.com/remotion-dev/remotion/issues/2958
@@ -193,7 +195,8 @@ const PremountedPostmountedSequenceRefForwardingFunction = (props, ref) => {
193
195
  };
194
196
  const PremountedPostmountedSequence = (0, react_1.forwardRef)(PremountedPostmountedSequenceRefForwardingFunction);
195
197
  const SequenceRefForwardingFunction = (props, ref) => {
196
- if (props.layout !== 'none' && !(0, get_remotion_environment_js_1.getRemotionEnvironment)().isRendering) {
198
+ const env = (0, use_remotion_environment_js_1.useRemotionEnvironment)();
199
+ if (props.layout !== 'none' && !env.isRendering) {
197
200
  if (props.premountFor || props.postmountFor) {
198
201
  return (0, jsx_runtime_1.jsx)(PremountedPostmountedSequence, { ...props, ref: ref });
199
202
  }
@@ -9,9 +9,9 @@ const absolute_src_js_1 = require("../absolute-src.js");
9
9
  const calculate_loop_js_1 = require("../calculate-loop.js");
10
10
  const cancel_render_js_1 = require("../cancel-render.js");
11
11
  const enable_sequence_stack_traces_js_1 = require("../enable-sequence-stack-traces.js");
12
- const get_remotion_environment_js_1 = require("../get-remotion-environment.js");
13
12
  const index_js_1 = require("../loop/index.js");
14
13
  const prefetch_js_1 = require("../prefetch.js");
14
+ const use_remotion_environment_js_1 = require("../use-remotion-environment.js");
15
15
  const use_video_config_js_1 = require("../use-video-config.js");
16
16
  const validate_media_props_js_1 = require("../validate-media-props.js");
17
17
  const validate_start_from_props_js_1 = require("../validate-start-from-props.js");
@@ -25,7 +25,7 @@ const AudioRefForwardingFunction = (props, ref) => {
25
25
  const { startFrom, endAt, trimBefore, trimAfter, name, stack, pauseWhenBuffering, showInTimeline, onError: onRemotionError, ...otherProps } = props;
26
26
  const { loop, ...propsOtherThanLoop } = props;
27
27
  const { fps } = (0, use_video_config_js_1.useVideoConfig)();
28
- const environment = (0, get_remotion_environment_js_1.getRemotionEnvironment)();
28
+ const environment = (0, use_remotion_environment_js_1.useRemotionEnvironment)();
29
29
  const { durations, setDurations } = (0, react_1.useContext)(duration_state_js_1.DurationsContext);
30
30
  if (typeof props.src !== 'string') {
31
31
  throw new TypeError(`The \`<Audio>\` tag requires a string for \`src\`, but got ${JSON.stringify(props.src)} instead.`);
@@ -38,6 +38,7 @@ const jsx_runtime_1 = require("react/jsx-runtime");
38
38
  const react_1 = __importStar(require("react"));
39
39
  const log_level_context_js_1 = require("../log-level-context.js");
40
40
  const play_and_handle_not_allowed_error_js_1 = require("../play-and-handle-not-allowed-error.js");
41
+ const use_remotion_environment_js_1 = require("../use-remotion-environment.js");
41
42
  const shared_element_source_node_js_1 = require("./shared-element-source-node.js");
42
43
  const use_audio_context_js_1 = require("./use-audio-context.js");
43
44
  const EMPTY_AUDIO = 'data:audio/mp3;base64,/+MYxAAJcAV8AAgAABn//////+/gQ5BAMA+D4Pg+BAQBAEAwD4Pg+D4EBAEAQDAPg++hYBH///hUFQVBUFREDQNHmf///////+MYxBUGkAGIMAAAAP/29Xt6lUxBTUUzLjEwMFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV/+MYxDUAAANIAAAAAFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV';
@@ -186,6 +187,7 @@ const SharedAudioContextProvider = ({ children, numberOfAudioTags, component, au
186
187
  }
187
188
  }, [rerenderAudios]);
188
189
  const mountTime = (0, log_level_context_js_1.useMountTime)();
190
+ const env = (0, use_remotion_environment_js_1.useRemotionEnvironment)();
189
191
  const playAllAudios = (0, react_1.useCallback)(() => {
190
192
  refs.forEach((ref) => {
191
193
  const audio = audios.current.find((a) => a.el === ref.ref);
@@ -199,10 +201,11 @@ const SharedAudioContextProvider = ({ children, numberOfAudioTags, component, au
199
201
  logLevel,
200
202
  mountTime,
201
203
  reason: 'playing all audios',
204
+ isPlayer: env.isPlayer,
202
205
  });
203
206
  });
204
207
  audioContext === null || audioContext === void 0 ? void 0 : audioContext.resume();
205
- }, [audioContext, logLevel, mountTime, refs]);
208
+ }, [audioContext, logLevel, mountTime, refs, env.isPlayer]);
206
209
  const value = (0, react_1.useMemo)(() => {
207
210
  return {
208
211
  registerAudio,
@@ -1,3 +1,4 @@
1
+ import type { RemotionEnvironment } from './get-remotion-environment.js';
1
2
  export declare const DELAY_RENDER_CALLSTACK_TOKEN = "The delayRender was called:";
2
3
  export declare const DELAY_RENDER_RETRIES_LEFT = "Retries left: ";
3
4
  export declare const DELAY_RENDER_RETRY_TOKEN = "- Rendering the frame will be retried.";
@@ -6,5 +7,16 @@ export type DelayRenderOptions = {
6
7
  timeoutInMilliseconds?: number;
7
8
  retries?: number;
8
9
  };
10
+ /**
11
+ * Internal function that accepts environment as parameter.
12
+ * This allows useDelayRender to control its own environment source.
13
+ * @private
14
+ */
15
+ export declare const delayRenderInternal: (environment: RemotionEnvironment, label?: string, options?: DelayRenderOptions) => number;
9
16
  export declare const delayRender: (label?: string, options?: DelayRenderOptions) => number;
17
+ /**
18
+ * Internal function that accepts environment as parameter.
19
+ * @private
20
+ */
21
+ export declare const continueRenderInternal: (handle: number, environment: RemotionEnvironment) => void;
10
22
  export declare const continueRender: (handle: number) => void;
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.continueRender = exports.delayRender = exports.DELAY_RENDER_CLEAR_TOKEN = exports.DELAY_RENDER_RETRY_TOKEN = exports.DELAY_RENDER_RETRIES_LEFT = exports.DELAY_RENDER_CALLSTACK_TOKEN = void 0;
3
+ exports.continueRender = exports.continueRenderInternal = exports.delayRender = exports.delayRenderInternal = exports.DELAY_RENDER_CLEAR_TOKEN = exports.DELAY_RENDER_RETRY_TOKEN = exports.DELAY_RENDER_RETRIES_LEFT = exports.DELAY_RENDER_CALLSTACK_TOKEN = void 0;
4
4
  const cancel_render_js_1 = require("./cancel-render.js");
5
5
  const get_remotion_environment_js_1 = require("./get-remotion-environment.js");
6
6
  const log_js_1 = require("./log.js");
@@ -17,11 +17,12 @@ exports.DELAY_RENDER_RETRIES_LEFT = 'Retries left: ';
17
17
  exports.DELAY_RENDER_RETRY_TOKEN = '- Rendering the frame will be retried.';
18
18
  exports.DELAY_RENDER_CLEAR_TOKEN = 'handle was cleared after';
19
19
  const defaultTimeout = 30000;
20
- /*
21
- * @description Call this function to signal that a frame should not be rendered until an asynchronous task (such as data fetching) is complete. Use continueRender(handle) to proceed with rendering once the task is complete.
22
- * @see [Documentation](https://remotion.dev/docs/delay-render)
20
+ /**
21
+ * Internal function that accepts environment as parameter.
22
+ * This allows useDelayRender to control its own environment source.
23
+ * @private
23
24
  */
24
- const delayRender = (label, options) => {
25
+ const delayRenderInternal = (environment, label, options) => {
25
26
  var _a, _b, _c, _d, _e;
26
27
  if (typeof label !== 'string' && typeof label !== 'undefined') {
27
28
  throw new Error('The label parameter of delayRender() must be a string or undefined, got: ' +
@@ -30,7 +31,7 @@ const delayRender = (label, options) => {
30
31
  const handle = Math.random();
31
32
  handles.push(handle);
32
33
  const called = (_b = (_a = Error().stack) === null || _a === void 0 ? void 0 : _a.replace(/^Error/g, '')) !== null && _b !== void 0 ? _b : '';
33
- if ((0, get_remotion_environment_js_1.getRemotionEnvironment)().isRendering) {
34
+ if (environment.isRendering) {
34
35
  const timeoutToUse = ((_c = options === null || options === void 0 ? void 0 : options.timeoutInMilliseconds) !== null && _c !== void 0 ? _c : (typeof window === 'undefined'
35
36
  ? defaultTimeout
36
37
  : ((_d = window.remotion_puppeteerTimeout) !== null && _d !== void 0 ? _d : defaultTimeout))) - 2000;
@@ -61,12 +62,20 @@ const delayRender = (label, options) => {
61
62
  }
62
63
  return handle;
63
64
  };
64
- exports.delayRender = delayRender;
65
+ exports.delayRenderInternal = delayRenderInternal;
65
66
  /*
66
- * @description Unblock a render that has been blocked by delayRender().
67
- * @see [Documentation](https://remotion.dev/docs/continue-render)
67
+ * @description Call this function to signal that a frame should not be rendered until an asynchronous task (such as data fetching) is complete. Use continueRender(handle) to proceed with rendering once the task is complete.
68
+ * @see [Documentation](https://remotion.dev/docs/delay-render)
68
69
  */
69
- const continueRender = (handle) => {
70
+ const delayRender = (label, options) => {
71
+ return (0, exports.delayRenderInternal)((0, get_remotion_environment_js_1.getRemotionEnvironment)(), label, options);
72
+ };
73
+ exports.delayRender = delayRender;
74
+ /**
75
+ * Internal function that accepts environment as parameter.
76
+ * @private
77
+ */
78
+ const continueRenderInternal = (handle, environment) => {
70
79
  if (typeof handle === 'undefined') {
71
80
  throw new TypeError('The continueRender() method must be called with a parameter that is the return value of delayRender(). No value was passed.');
72
81
  }
@@ -76,7 +85,7 @@ const continueRender = (handle) => {
76
85
  }
77
86
  handles = handles.filter((h) => {
78
87
  if (h === handle) {
79
- if ((0, get_remotion_environment_js_1.getRemotionEnvironment)().isRendering) {
88
+ if (environment.isRendering) {
80
89
  if (!window.remotion_delayRenderTimeouts[handle]) {
81
90
  return false;
82
91
  }
@@ -100,4 +109,12 @@ const continueRender = (handle) => {
100
109
  window.remotion_renderReady = true;
101
110
  }
102
111
  };
112
+ exports.continueRenderInternal = continueRenderInternal;
113
+ /*
114
+ * @description Unblock a render that has been blocked by delayRender().
115
+ * @see [Documentation](https://remotion.dev/docs/continue-render)
116
+ */
117
+ const continueRender = (handle) => {
118
+ (0, exports.continueRenderInternal)(handle, (0, get_remotion_environment_js_1.getRemotionEnvironment)());
119
+ };
103
120
  exports.continueRender = continueRender;
@@ -16,7 +16,7 @@ const getCrossOriginValue = ({ crossOrigin, requestsVideoFrame, }) => {
16
16
  // zeroing out the volume.
17
17
  // But this requires CORS, so we cannot default to that.
18
18
  // DONT DO THIS:
19
- // if (!getRemotionEnvironment().isRendering) {
19
+ // if (!useRemotionEnvironment().isRendering) {
20
20
  // return 'anonymous';
21
21
  // }
22
22
  // During rendering, we opt out of the crossOrigin value
@@ -9,7 +9,8 @@ const getEnvString = () => {
9
9
  return ['e', 'nv'].join('');
10
10
  };
11
11
  /*
12
- * @description Provides information about the Remotion Environment
12
+ * @description Provides information about the Remotion Environment.
13
+ * @note Prefer using the `useRemotionEnvironment()` hook as it will support future scoped contexts for browser rendering scenarios.
13
14
  * @see [Documentation](https://remotion.dev/docs/get-remotion-environment)
14
15
  */
15
16
  const getRemotionEnvironment = () => {
@@ -44,8 +44,10 @@ declare global {
44
44
  remotion_audioEnabled: boolean;
45
45
  remotion_videoEnabled: boolean;
46
46
  remotion_puppeteerTimeout: number;
47
+ remotion_broadcastChannel: BroadcastChannel | undefined;
47
48
  remotion_inputProps: string;
48
49
  remotion_envVariables: string;
50
+ remotion_isMainTab: boolean;
49
51
  remotion_collectAssets: () => TRenderAsset[];
50
52
  remotion_isPlayer: boolean;
51
53
  remotion_isStudio: boolean;
@@ -113,6 +115,8 @@ export type { PlayableMediaTag } from './timeline-position-state.js';
113
115
  export { useBufferState } from './use-buffer-state';
114
116
  export { useCurrentFrame } from './use-current-frame.js';
115
117
  export { CurrentScaleContextType, PreviewSize, PreviewSizeCtx, Translation, useCurrentScale, } from './use-current-scale';
118
+ export { useDelayRender } from './use-delay-render';
119
+ export { useRemotionEnvironment } from './use-remotion-environment.js';
116
120
  export * from './use-video-config.js';
117
121
  export * from './version.js';
118
122
  export * from './video-config.js';
package/dist/cjs/index.js CHANGED
@@ -14,7 +14,7 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
14
  for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
15
  };
16
16
  Object.defineProperty(exports, "__esModule", { value: true });
17
- exports.Config = exports.Experimental = exports.watchStaticFile = exports.useCurrentScale = exports.useCurrentFrame = exports.useBufferState = exports.staticFile = exports.Series = exports.Sequence = exports.registerRoot = exports.prefetch = exports.random = exports.interpolate = exports.Loop = exports.interpolateColors = exports.Img = exports.getStaticFiles = exports.getRemotionEnvironment = exports.delayRender = exports.continueRender = exports.getInputProps = exports.Composition = exports.cancelRender = exports.Artifact = void 0;
17
+ exports.Config = exports.Experimental = exports.watchStaticFile = exports.useRemotionEnvironment = exports.useDelayRender = exports.useCurrentScale = exports.useCurrentFrame = exports.useBufferState = exports.staticFile = exports.Series = exports.Sequence = exports.registerRoot = exports.prefetch = exports.random = exports.interpolate = exports.Loop = exports.interpolateColors = exports.Img = exports.getStaticFiles = exports.getRemotionEnvironment = exports.delayRender = exports.continueRender = exports.getInputProps = exports.Composition = exports.cancelRender = exports.Artifact = void 0;
18
18
  require("./_check-rsc.js");
19
19
  require("./asset-types.js");
20
20
  const Clipper_js_1 = require("./Clipper.js");
@@ -74,6 +74,10 @@ var use_current_frame_js_1 = require("./use-current-frame.js");
74
74
  Object.defineProperty(exports, "useCurrentFrame", { enumerable: true, get: function () { return use_current_frame_js_1.useCurrentFrame; } });
75
75
  var use_current_scale_1 = require("./use-current-scale");
76
76
  Object.defineProperty(exports, "useCurrentScale", { enumerable: true, get: function () { return use_current_scale_1.useCurrentScale; } });
77
+ var use_delay_render_1 = require("./use-delay-render");
78
+ Object.defineProperty(exports, "useDelayRender", { enumerable: true, get: function () { return use_delay_render_1.useDelayRender; } });
79
+ var use_remotion_environment_js_1 = require("./use-remotion-environment.js");
80
+ Object.defineProperty(exports, "useRemotionEnvironment", { enumerable: true, get: function () { return use_remotion_environment_js_1.useRemotionEnvironment; } });
77
81
  __exportStar(require("./use-video-config.js"), exports);
78
82
  __exportStar(require("./version.js"), exports);
79
83
  __exportStar(require("./video-config.js"), exports);
@@ -1,10 +1,11 @@
1
1
  import type { RefObject } from 'react';
2
2
  import type { LogLevel } from './log';
3
- export declare const playAndHandleNotAllowedError: ({ mediaRef, mediaType, onAutoPlayError, logLevel, mountTime, reason, }: {
3
+ export declare const playAndHandleNotAllowedError: ({ mediaRef, mediaType, onAutoPlayError, logLevel, mountTime, reason, isPlayer, }: {
4
4
  mediaRef: RefObject<HTMLVideoElement | HTMLAudioElement | null>;
5
5
  mediaType: "audio" | "video";
6
6
  onAutoPlayError: null | (() => void);
7
7
  logLevel: LogLevel;
8
8
  mountTime: number;
9
9
  reason: string;
10
+ isPlayer: boolean;
10
11
  }) => void;
@@ -1,9 +1,8 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.playAndHandleNotAllowedError = void 0;
4
- const get_remotion_environment_1 = require("./get-remotion-environment");
5
4
  const playback_logging_1 = require("./playback-logging");
6
- const playAndHandleNotAllowedError = ({ mediaRef, mediaType, onAutoPlayError, logLevel, mountTime, reason, }) => {
5
+ const playAndHandleNotAllowedError = ({ mediaRef, mediaType, onAutoPlayError, logLevel, mountTime, reason, isPlayer, }) => {
7
6
  const { current } = mediaRef;
8
7
  if (!current) {
9
8
  return;
@@ -56,7 +55,7 @@ const playAndHandleNotAllowedError = ({ mediaRef, mediaType, onAutoPlayError, lo
56
55
  }
57
56
  // eslint-disable-next-line no-console
58
57
  console.log(`The video will be muted and we'll retry playing it.`);
59
- if (mediaType === 'video' && (0, get_remotion_environment_1.getRemotionEnvironment)().isPlayer) {
58
+ if (mediaType === 'video' && isPlayer) {
60
59
  // eslint-disable-next-line no-console
61
60
  console.log('Use onAutoPlayError() to handle this error yourself.');
62
61
  }
@@ -1,6 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.resolveVideoConfigOrCatch = exports.resolveVideoConfig = void 0;
4
+ const get_remotion_environment_js_1 = require("./get-remotion-environment.js");
4
5
  const input_props_serialization_js_1 = require("./input-props-serialization.js");
5
6
  const validate_default_codec_js_1 = require("./validation/validate-default-codec.js");
6
7
  const validate_dimensions_js_1 = require("./validation/validate-dimensions.js");
@@ -45,6 +46,7 @@ const resolveVideoConfig = ({ calculateMetadata, signal, defaultProps, originalP
45
46
  props: originalProps,
46
47
  abortSignal: signal,
47
48
  compositionId,
49
+ isRendering: (0, get_remotion_environment_js_1.getRemotionEnvironment)().isRendering,
48
50
  })
49
51
  : null;
50
52
  if (calculatedProm !== null &&
@@ -2,7 +2,7 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.usePlayingState = exports.useTimelineSetFrame = exports.useTimelinePosition = exports.getFrameForComposition = exports.getInitialFrameState = exports.persistCurrentFrame = exports.SetTimelineContext = exports.TimelineContext = void 0;
4
4
  const react_1 = require("react");
5
- const get_remotion_environment_js_1 = require("./get-remotion-environment.js");
5
+ const use_remotion_environment_js_1 = require("./use-remotion-environment.js");
6
6
  const use_video_js_1 = require("./use-video.js");
7
7
  exports.TimelineContext = (0, react_1.createContext)({
8
8
  frame: {},
@@ -56,14 +56,13 @@ const useTimelinePosition = () => {
56
56
  var _a, _b;
57
57
  const videoConfig = (0, use_video_js_1.useVideo)();
58
58
  const state = (0, react_1.useContext)(exports.TimelineContext);
59
+ const env = (0, use_remotion_environment_js_1.useRemotionEnvironment)();
59
60
  if (!videoConfig) {
60
61
  return typeof window === 'undefined'
61
62
  ? 0
62
63
  : ((_a = window.remotion_initialFrame) !== null && _a !== void 0 ? _a : 0);
63
64
  }
64
- const unclamped = (_b = state.frame[videoConfig.id]) !== null && _b !== void 0 ? _b : ((0, get_remotion_environment_js_1.getRemotionEnvironment)().isPlayer
65
- ? 0
66
- : (0, exports.getFrameForComposition)(videoConfig.id));
65
+ const unclamped = (_b = state.frame[videoConfig.id]) !== null && _b !== void 0 ? _b : (env.isPlayer ? 0 : (0, exports.getFrameForComposition)(videoConfig.id));
67
66
  return Math.min(videoConfig.durationInFrames - 1, unclamped);
68
67
  };
69
68
  exports.useTimelinePosition = useTimelinePosition;
@@ -4,16 +4,17 @@ exports.useCurrentFrame = void 0;
4
4
  const react_1 = require("react");
5
5
  const CanUseRemotionHooks_js_1 = require("./CanUseRemotionHooks.js");
6
6
  const SequenceContext_js_1 = require("./SequenceContext.js");
7
- const get_remotion_environment_js_1 = require("./get-remotion-environment.js");
8
7
  const timeline_position_state_js_1 = require("./timeline-position-state.js");
8
+ const use_remotion_environment_js_1 = require("./use-remotion-environment.js");
9
9
  /*
10
10
  * @description Retrieves the current frame of the video within a component. Frames are 0-indexed, and if the component is wrapped in a `<Sequence>`, it returns the frame relative to when the Sequence starts.
11
11
  * @see [Documentation](https://www.remotion.dev/docs/use-current-frame)
12
12
  */
13
13
  const useCurrentFrame = () => {
14
14
  const canUseRemotionHooks = (0, react_1.useContext)(CanUseRemotionHooks_js_1.CanUseRemotionHooks);
15
+ const env = (0, use_remotion_environment_js_1.useRemotionEnvironment)();
15
16
  if (!canUseRemotionHooks) {
16
- if ((0, get_remotion_environment_js_1.getRemotionEnvironment)().isPlayer) {
17
+ if (env.isPlayer) {
17
18
  throw new Error(`useCurrentFrame can only be called inside a component that was passed to <Player>. See: https://www.remotion.dev/docs/player/examples`);
18
19
  }
19
20
  throw new Error(`useCurrentFrame() can only be called inside a component that was registered as a composition. See https://www.remotion.dev/docs/the-fundamentals#defining-compositions`);
@@ -35,7 +35,7 @@ var __importStar = (this && this.__importStar) || (function () {
35
35
  Object.defineProperty(exports, "__esModule", { value: true });
36
36
  exports.useCurrentScale = exports.calculateScale = exports.PreviewSizeContext = exports.CurrentScaleContext = void 0;
37
37
  const react_1 = __importStar(require("react"));
38
- const get_remotion_environment_1 = require("./get-remotion-environment");
38
+ const use_remotion_environment_1 = require("./use-remotion-environment");
39
39
  const use_unsafe_video_config_1 = require("./use-unsafe-video-config");
40
40
  exports.CurrentScaleContext = react_1.default.createContext(null);
41
41
  exports.PreviewSizeContext = (0, react_1.createContext)({
@@ -64,11 +64,12 @@ const useCurrentScale = (options) => {
64
64
  const hasContext = react_1.default.useContext(exports.CurrentScaleContext);
65
65
  const zoomContext = react_1.default.useContext(exports.PreviewSizeContext);
66
66
  const config = (0, use_unsafe_video_config_1.useUnsafeVideoConfig)();
67
+ const env = (0, use_remotion_environment_1.useRemotionEnvironment)();
67
68
  if (hasContext === null || config === null || zoomContext === null) {
68
69
  if (options === null || options === void 0 ? void 0 : options.dontThrowIfOutsideOfRemotion) {
69
70
  return 1;
70
71
  }
71
- if ((0, get_remotion_environment_1.getRemotionEnvironment)().isRendering) {
72
+ if (env.isRendering) {
72
73
  return 1;
73
74
  }
74
75
  throw new Error([
@@ -0,0 +1,8 @@
1
+ import type { DelayRenderOptions } from './delay-render.js';
2
+ type DelayRenderFn = (label?: string, options?: DelayRenderOptions) => number;
3
+ type ContinueRenderFn = (handle: number) => void;
4
+ export declare const useDelayRender: () => {
5
+ delayRender: DelayRenderFn;
6
+ continueRender: ContinueRenderFn;
7
+ };
8
+ export {};
@@ -0,0 +1,17 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.useDelayRender = void 0;
4
+ const react_1 = require("react");
5
+ const delay_render_js_1 = require("./delay-render.js");
6
+ const use_remotion_environment_js_1 = require("./use-remotion-environment.js");
7
+ const useDelayRender = () => {
8
+ const environment = (0, use_remotion_environment_js_1.useRemotionEnvironment)();
9
+ const delayRender = (0, react_1.useCallback)((label, options) => {
10
+ return (0, delay_render_js_1.delayRenderInternal)(environment, label, options);
11
+ }, [environment]);
12
+ const continueRender = (0, react_1.useCallback)((handle) => {
13
+ (0, delay_render_js_1.continueRenderInternal)(handle, environment);
14
+ }, [environment]);
15
+ return { delayRender, continueRender };
16
+ };
17
+ exports.useDelayRender = useDelayRender;
@@ -6,11 +6,11 @@ const SequenceContext_js_1 = require("./SequenceContext.js");
6
6
  const SequenceManager_js_1 = require("./SequenceManager.js");
7
7
  const use_audio_frame_js_1 = require("./audio/use-audio-frame.js");
8
8
  const get_asset_file_name_js_1 = require("./get-asset-file-name.js");
9
- const get_remotion_environment_js_1 = require("./get-remotion-environment.js");
10
9
  const log_level_context_js_1 = require("./log-level-context.js");
11
10
  const nonce_js_1 = require("./nonce.js");
12
11
  const play_and_handle_not_allowed_error_js_1 = require("./play-and-handle-not-allowed-error.js");
13
12
  const timeline_position_state_js_1 = require("./timeline-position-state.js");
13
+ const use_remotion_environment_js_1 = require("./use-remotion-environment.js");
14
14
  const use_video_config_js_1 = require("./use-video-config.js");
15
15
  const volume_prop_js_1 = require("./volume-prop.js");
16
16
  const didWarn = {};
@@ -60,6 +60,7 @@ const useMediaInTimeline = ({ volume, mediaVolume, mediaRef, src, mediaType, pla
60
60
  warnOnce(`Remotion: The ${mediaType} with src ${src} has changed it's volume. Prefer the callback syntax for setting volume to get better timeline display: https://www.remotion.dev/docs/audio/volume`);
61
61
  }
62
62
  }, [initialVolume, mediaType, src, volume]);
63
+ const env = (0, use_remotion_environment_js_1.useRemotionEnvironment)();
63
64
  (0, react_1.useEffect)(() => {
64
65
  var _a, _b, _c;
65
66
  if (!mediaRef.current) {
@@ -68,8 +69,7 @@ const useMediaInTimeline = ({ volume, mediaVolume, mediaRef, src, mediaType, pla
68
69
  if (!src) {
69
70
  throw new Error('No src passed');
70
71
  }
71
- if (!(0, get_remotion_environment_js_1.getRemotionEnvironment)().isStudio &&
72
- ((_b = (_a = window.process) === null || _a === void 0 ? void 0 : _a.env) === null || _b === void 0 ? void 0 : _b.NODE_ENV) !== 'test') {
72
+ if (!env.isStudio && ((_b = (_a = window.process) === null || _a === void 0 ? void 0 : _a.env) === null || _b === void 0 ? void 0 : _b.NODE_ENV) !== 'test') {
73
73
  return;
74
74
  }
75
75
  if (!showInTimeline) {
@@ -120,6 +120,7 @@ const useMediaInTimeline = ({ volume, mediaVolume, mediaRef, src, mediaType, pla
120
120
  showInTimeline,
121
121
  premountDisplay,
122
122
  postmountDisplay,
123
+ env.isStudio,
123
124
  ]);
124
125
  (0, react_1.useEffect)(() => {
125
126
  const tag = {
@@ -139,6 +140,7 @@ const useMediaInTimeline = ({ volume, mediaVolume, mediaRef, src, mediaType, pla
139
140
  logLevel,
140
141
  mountTime,
141
142
  reason,
143
+ isPlayer: env.isPlayer,
142
144
  });
143
145
  },
144
146
  };
@@ -157,6 +159,7 @@ const useMediaInTimeline = ({ volume, mediaVolume, mediaRef, src, mediaType, pla
157
159
  isPostmounting,
158
160
  logLevel,
159
161
  mountTime,
162
+ env.isPlayer,
160
163
  ]);
161
164
  };
162
165
  exports.useMediaInTimeline = useMediaInTimeline;
@@ -14,6 +14,7 @@ const seek_js_1 = require("./seek.js");
14
14
  const timeline_position_state_js_1 = require("./timeline-position-state.js");
15
15
  const use_current_frame_js_1 = require("./use-current-frame.js");
16
16
  const use_media_buffering_js_1 = require("./use-media-buffering.js");
17
+ const use_remotion_environment_js_1 = require("./use-remotion-environment.js");
17
18
  const use_request_video_callback_time_js_1 = require("./use-request-video-callback-time.js");
18
19
  const use_video_config_js_1 = require("./use-video-config.js");
19
20
  const get_current_time_js_1 = require("./video/get-current-time.js");
@@ -128,6 +129,7 @@ const useMediaPlayback = ({ mediaRef, src, mediaType, playbackRate: localPlaybac
128
129
  playing,
129
130
  isPostmounting,
130
131
  ]);
132
+ const env = (0, use_remotion_environment_js_1.useRemotionEnvironment)();
131
133
  // This must be a useLayoutEffect, because afterwards, useVolume() looks at the playbackRate
132
134
  // and it is also in a useLayoutEffect.
133
135
  (0, react_1.useLayoutEffect)(() => {
@@ -186,6 +188,7 @@ const useMediaPlayback = ({ mediaRef, src, mediaType, playbackRate: localPlaybac
186
188
  logLevel,
187
189
  mountTime,
188
190
  reason: 'player is playing but media tag is paused, and just seeked',
191
+ isPlayer: env.isPlayer,
189
192
  });
190
193
  }
191
194
  }
@@ -241,6 +244,7 @@ const useMediaPlayback = ({ mediaRef, src, mediaType, playbackRate: localPlaybac
241
244
  logLevel,
242
245
  mountTime,
243
246
  reason: `player is playing and ${reason}`,
247
+ isPlayer: env.isPlayer,
244
248
  });
245
249
  if (!isVariableFpsVideo && playbackRate > 0) {
246
250
  bufferUntilFirstFrame(shouldBeTime);
@@ -268,6 +272,7 @@ const useMediaPlayback = ({ mediaRef, src, mediaType, playbackRate: localPlaybac
268
272
  pauseWhenBuffering,
269
273
  mountTime,
270
274
  mediaTagCurrentTime,
275
+ env.isPlayer,
271
276
  ]);
272
277
  };
273
278
  exports.useMediaPlayback = useMediaPlayback;
@@ -0,0 +1,6 @@
1
+ import { type RemotionEnvironment } from './get-remotion-environment';
2
+ /**
3
+ * @description A React hook that provides information about the current Remotion Environment. This is the preferred way to access environment information in React components as it will support future scoped contexts.
4
+ * @see [Documentation](https://remotion.dev/docs/use-remotion-environment)
5
+ */
6
+ export declare const useRemotionEnvironment: () => RemotionEnvironment;