@remotion/renderer 4.0.0-alpha13 → 4.0.0-alpha16

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 (103) hide show
  1. package/dist/assets/download-and-map-assets-to-file.d.ts +6 -4
  2. package/dist/assets/download-and-map-assets-to-file.js +30 -6
  3. package/dist/assets/download-file.d.ts +2 -2
  4. package/dist/assets/download-map.d.ts +3 -3
  5. package/dist/assets/ffmpeg-volume-expression.d.ts +2 -2
  6. package/dist/assets/get-audio-channels.d.ts +1 -0
  7. package/dist/assets/get-audio-channels.js +10 -5
  8. package/dist/assets/read-file.js +1 -1
  9. package/dist/assets/types.d.ts +4 -4
  10. package/dist/audio-codec.d.ts +2 -2
  11. package/dist/browser/Browser.d.ts +9 -9
  12. package/dist/browser/Browser.js +26 -32
  13. package/dist/browser/BrowserFetcher.d.ts +1 -1
  14. package/dist/browser/BrowserPage.d.ts +11 -2
  15. package/dist/browser/BrowserPage.js +47 -12
  16. package/dist/browser/BrowserRunner.js +19 -2
  17. package/dist/browser/ConsoleMessage.d.ts +1 -1
  18. package/dist/browser/DOMWorld.js +8 -8
  19. package/dist/browser/EvalTypes.d.ts +7 -7
  20. package/dist/browser/FrameManager.js +11 -11
  21. package/dist/browser/JSHandle.js +14 -14
  22. package/dist/browser/LaunchOptions.d.ts +1 -1
  23. package/dist/browser/Launcher.js +0 -1
  24. package/dist/browser/LifecycleWatcher.d.ts +1 -1
  25. package/dist/browser/NetworkEventManager.d.ts +4 -4
  26. package/dist/browser/NodeWebSocketTransport.js +16 -16
  27. package/dist/browser/Product.d.ts +1 -1
  28. package/dist/browser/Target.d.ts +2 -1
  29. package/dist/browser/Target.js +8 -2
  30. package/dist/browser/devtools-types.d.ts +10 -10
  31. package/dist/browser/mitt/index.d.ts +6 -6
  32. package/dist/browser/revisions.d.ts +1 -1
  33. package/dist/browser/should-log-message.d.ts +24 -0
  34. package/dist/browser/should-log-message.js +72 -0
  35. package/dist/browser-executable.d.ts +1 -1
  36. package/dist/browser-log.d.ts +1 -1
  37. package/dist/browser.d.ts +1 -1
  38. package/dist/chalk/index.d.ts +4 -4
  39. package/dist/codec-supports-media.d.ts +1 -1
  40. package/dist/codec.d.ts +2 -2
  41. package/dist/combine-videos.d.ts +1 -1
  42. package/dist/compositor/compose.d.ts +11 -2
  43. package/dist/compositor/compose.js +15 -4
  44. package/dist/compositor/compositor.d.ts +1 -1
  45. package/dist/compositor/compositor.js +19 -7
  46. package/dist/compositor/payloads.d.ts +5 -5
  47. package/dist/crf.d.ts +1 -1
  48. package/dist/error-handling/symbolicate-error.js +4 -2
  49. package/dist/ffmpeg-override.d.ts +1 -1
  50. package/dist/file-extensions.d.ts +1 -1
  51. package/dist/frame-range.d.ts +1 -1
  52. package/dist/get-browser-instance.d.ts +6 -1
  53. package/dist/get-browser-instance.js +9 -4
  54. package/dist/get-compositions.d.ts +18 -11
  55. package/dist/get-compositions.js +66 -49
  56. package/dist/get-frame-padded-index.d.ts +1 -1
  57. package/dist/image-format.d.ts +3 -3
  58. package/dist/index.d.ts +106 -16
  59. package/dist/index.js +25 -13
  60. package/dist/jpeg-quality.d.ts +1 -0
  61. package/dist/jpeg-quality.js +2 -1
  62. package/dist/log-level.d.ts +1 -1
  63. package/dist/logger.d.ts +5 -3
  64. package/dist/logger.js +12 -5
  65. package/dist/make-cancel-signal.d.ts +2 -2
  66. package/dist/merge-audio-track.d.ts +1 -1
  67. package/dist/mime-types.js +1 -1
  68. package/dist/offthread-video-server.d.ts +36 -4
  69. package/dist/offthread-video-server.js +48 -4
  70. package/dist/open-browser.d.ts +19 -10
  71. package/dist/open-browser.js +34 -21
  72. package/dist/options/option.d.ts +1 -1
  73. package/dist/parse-browser-error-stack.d.ts +1 -1
  74. package/dist/perf.d.ts +1 -1
  75. package/dist/pixel-format.d.ts +1 -1
  76. package/dist/prepare-server.d.ts +20 -8
  77. package/dist/prepare-server.js +52 -8
  78. package/dist/preprocess-audio-track.d.ts +2 -2
  79. package/dist/prespawn-ffmpeg.d.ts +1 -1
  80. package/dist/prespawn-ffmpeg.js +7 -7
  81. package/dist/prores-profile.d.ts +1 -1
  82. package/dist/puppeteer-screenshot.js +1 -2
  83. package/dist/render-frames.d.ts +32 -11
  84. package/dist/render-frames.js +112 -77
  85. package/dist/render-media.d.ts +50 -21
  86. package/dist/render-media.js +249 -197
  87. package/dist/render-still.d.ts +33 -18
  88. package/dist/render-still.js +71 -43
  89. package/dist/replace-browser.d.ts +1 -1
  90. package/dist/select-composition.d.ts +19 -11
  91. package/dist/select-composition.js +79 -42
  92. package/dist/serve-static.d.ts +2 -3
  93. package/dist/serve-static.js +2 -4
  94. package/dist/set-props-and-env.d.ts +1 -1
  95. package/dist/stitch-frames-to-video.d.ts +32 -10
  96. package/dist/stitch-frames-to-video.js +121 -99
  97. package/dist/stringify-ffmpeg-filter.d.ts +2 -2
  98. package/dist/symbolicate-stacktrace.d.ts +16 -3
  99. package/dist/symbolicate-stacktrace.js +49 -24
  100. package/dist/truthy.d.ts +1 -1
  101. package/dist/types.d.ts +2 -2
  102. package/dist/validate-opengl-renderer.d.ts +1 -1
  103. package/package.json +11 -11
@@ -1,13 +1,14 @@
1
1
  import type { TAsset } from 'remotion';
2
+ import { OffthreadVideoServerEmitter } from '../offthread-video-server';
2
3
  import type { DownloadMap } from './download-map';
3
- export declare type RenderMediaOnDownload = (src: string) => ((progress: {
4
+ export type RenderMediaOnDownload = (src: string) => ((progress: {
4
5
  percent: number | null;
5
6
  downloaded: number;
6
7
  totalSize: number | null;
7
8
  }) => void) | undefined | void;
8
- export declare const downloadAsset: ({ src, onDownload, downloadMap, }: {
9
+ export declare const downloadAsset: ({ src, downloadMap, emitter, }: {
9
10
  src: string;
10
- onDownload: RenderMediaOnDownload;
11
+ emitter: OffthreadVideoServerEmitter;
11
12
  downloadMap: DownloadMap;
12
13
  }) => Promise<string>;
13
14
  export declare const markAllAssetsAsDownloaded: (downloadMap: DownloadMap) => void;
@@ -19,6 +20,7 @@ export declare const getSanitizedFilenameForAssetUrl: ({ src, downloadDir, conte
19
20
  }) => string;
20
21
  export declare const downloadAndMapAssetsToFileUrl: ({ asset, onDownload, downloadMap, }: {
21
22
  asset: TAsset;
22
- onDownload: RenderMediaOnDownload;
23
+ onDownload: RenderMediaOnDownload | null;
23
24
  downloadMap: DownloadMap;
24
25
  }) => Promise<TAsset>;
26
+ export declare const attachDownloadListenerToEmitter: (emitter: OffthreadVideoServerEmitter, onDownload: RenderMediaOnDownload | null) => () => void;
@@ -26,13 +26,14 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
26
26
  return (mod && mod.__esModule) ? mod : { "default": mod };
27
27
  };
28
28
  Object.defineProperty(exports, "__esModule", { value: true });
29
- exports.downloadAndMapAssetsToFileUrl = exports.getSanitizedFilenameForAssetUrl = exports.markAllAssetsAsDownloaded = exports.downloadAsset = void 0;
29
+ exports.attachDownloadListenerToEmitter = exports.downloadAndMapAssetsToFileUrl = exports.getSanitizedFilenameForAssetUrl = exports.markAllAssetsAsDownloaded = exports.downloadAsset = void 0;
30
30
  const node_fs_1 = __importDefault(require("node:fs"));
31
31
  const node_path_1 = __importStar(require("node:path"));
32
32
  const remotion_1 = require("remotion");
33
33
  const compress_assets_1 = require("../compress-assets");
34
34
  const ensure_output_directory_1 = require("../ensure-output-directory");
35
35
  const mime_types_1 = require("../mime-types");
36
+ const offthread_video_server_1 = require("../offthread-video-server");
36
37
  const download_file_1 = require("./download-file");
37
38
  const sanitize_filepath_1 = require("./sanitize-filepath");
38
39
  const waitForAssetToBeDownloaded = ({ src, downloadDir, downloadMap, }) => {
@@ -52,7 +53,7 @@ const waitForAssetToBeDownloaded = ({ src, downloadDir, downloadMap, }) => {
52
53
  return new Promise((resolve) => {
53
54
  downloadMap.listeners[src][downloadDir].push(() => {
54
55
  const srcMap = downloadMap.hasBeenDownloadedMap[src];
55
- if (!srcMap || !srcMap[downloadDir]) {
56
+ if (!(srcMap === null || srcMap === void 0 ? void 0 : srcMap[downloadDir])) {
56
57
  throw new Error('Expected file for ' + src + 'to be available in ' + downloadDir);
57
58
  }
58
59
  resolve(srcMap[downloadDir]);
@@ -115,7 +116,7 @@ function validateBufferEncoding(potentialEncoding, dataUrl) {
115
116
  throw new TypeError(errMessage);
116
117
  }
117
118
  }
118
- const downloadAsset = async ({ src, onDownload, downloadMap, }) => {
119
+ const downloadAsset = async ({ src, downloadMap, emitter, }) => {
119
120
  var _a, _b, _c;
120
121
  if ((0, compress_assets_1.isAssetCompressed)(src)) {
121
122
  return src;
@@ -145,7 +146,7 @@ const downloadAsset = async ({ src, onDownload, downloadMap, }) => {
145
146
  if (process.env.NODE_ENV === 'test') {
146
147
  console.log('Actually downloading asset', src);
147
148
  }
148
- const onProgress = onDownload(src);
149
+ emitter.dispatchDownload(src);
149
150
  if (src.startsWith('data:')) {
150
151
  const [assetDetails, assetData] = src.substring('data:'.length).split(',');
151
152
  if (!assetDetails.includes(';')) {
@@ -175,7 +176,7 @@ const downloadAsset = async ({ src, onDownload, downloadMap, }) => {
175
176
  const { to } = await (0, download_file_1.downloadFile)({
176
177
  url: src,
177
178
  onProgress: (progress) => {
178
- onProgress === null || onProgress === void 0 ? void 0 : onProgress(progress);
179
+ emitter.dispatchDownloadProgress(src, progress.percent, progress.downloaded, progress.totalSize);
179
180
  },
180
181
  to: (contentDisposition, contentType) => (0, exports.getSanitizedFilenameForAssetUrl)({
181
182
  contentDisposition,
@@ -242,14 +243,37 @@ const getSanitizedFilenameForAssetUrl = ({ src, downloadDir, contentDisposition,
242
243
  };
243
244
  exports.getSanitizedFilenameForAssetUrl = getSanitizedFilenameForAssetUrl;
244
245
  const downloadAndMapAssetsToFileUrl = async ({ asset, onDownload, downloadMap, }) => {
246
+ const emitter = new offthread_video_server_1.OffthreadVideoServerEmitter();
247
+ const cleanup = (0, exports.attachDownloadListenerToEmitter)(emitter, onDownload);
245
248
  const newSrc = await (0, exports.downloadAsset)({
246
249
  src: asset.src,
247
- onDownload,
250
+ emitter,
248
251
  downloadMap,
249
252
  });
253
+ cleanup();
250
254
  return {
251
255
  ...asset,
252
256
  src: newSrc,
253
257
  };
254
258
  };
255
259
  exports.downloadAndMapAssetsToFileUrl = downloadAndMapAssetsToFileUrl;
260
+ const attachDownloadListenerToEmitter = (emitter, onDownload) => {
261
+ const cleanup = [];
262
+ if (!onDownload) {
263
+ return () => undefined;
264
+ }
265
+ const a = emitter.addEventListener('download', ({ detail: { src: initialSrc } }) => {
266
+ const progress = onDownload(initialSrc);
267
+ const b = emitter.addEventListener('progress', ({ detail: { downloaded, percent, src: progressSrc, totalSize } }) => {
268
+ if (initialSrc === progressSrc) {
269
+ progress === null || progress === void 0 ? void 0 : progress({ downloaded, percent, totalSize });
270
+ }
271
+ });
272
+ cleanup.push(b);
273
+ });
274
+ cleanup.push(() => a());
275
+ return () => {
276
+ cleanup.forEach((c) => c());
277
+ };
278
+ };
279
+ exports.attachDownloadListenerToEmitter = attachDownloadListenerToEmitter;
@@ -1,8 +1,8 @@
1
- declare type Response = {
1
+ type Response = {
2
2
  sizeInBytes: number;
3
3
  to: string;
4
4
  };
5
- declare type Options = {
5
+ type Options = {
6
6
  url: string;
7
7
  to: (contentDisposition: string | null, contentType: string | null) => string;
8
8
  onProgress: ((progress: {
@@ -1,9 +1,9 @@
1
1
  import type { TAsset } from 'remotion';
2
- export declare type AudioChannelsAndDurationResultCache = {
2
+ export type AudioChannelsAndDurationResultCache = {
3
3
  channels: number;
4
4
  duration: number | null;
5
5
  };
6
- export declare type DownloadMap = {
6
+ export type DownloadMap = {
7
7
  id: string;
8
8
  isDownloadingMap: {
9
9
  [src: string]: {
@@ -33,7 +33,7 @@ export declare type DownloadMap = {
33
33
  [key: string]: string;
34
34
  };
35
35
  };
36
- export declare type RenderAssetInfo = {
36
+ export type RenderAssetInfo = {
37
37
  assets: TAsset[][];
38
38
  imageSequenceName: string;
39
39
  firstFrameIndex: number;
@@ -1,6 +1,6 @@
1
1
  import type { AssetVolume } from './types';
2
- declare type FfmpegEval = 'once' | 'frame';
3
- declare type FfmpegVolumeExpression = {
2
+ type FfmpegEval = 'once' | 'frame';
3
+ type FfmpegVolumeExpression = {
4
4
  eval: FfmpegEval;
5
5
  value: string;
6
6
  };
@@ -1,2 +1,3 @@
1
1
  import type { AudioChannelsAndDurationResultCache, DownloadMap } from './download-map';
2
+ export declare const getAudioChannelsAndDurationWithoutCache: (src: string) => Promise<AudioChannelsAndDurationResultCache>;
2
3
  export declare const getAudioChannelsAndDuration: (downloadMap: DownloadMap, src: string) => Promise<AudioChannelsAndDurationResultCache>;
@@ -1,13 +1,10 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.getAudioChannelsAndDuration = void 0;
3
+ exports.getAudioChannelsAndDuration = exports.getAudioChannelsAndDurationWithoutCache = void 0;
4
4
  const call_ffmpeg_1 = require("../call-ffmpeg");
5
5
  const p_limit_1 = require("../p-limit");
6
6
  const limit = (0, p_limit_1.pLimit)(1);
7
- async function getAudioChannelsAndDurationUnlimited(downloadMap, src) {
8
- if (downloadMap.durationOfAssetCache[src]) {
9
- return downloadMap.durationOfAssetCache[src];
10
- }
7
+ const getAudioChannelsAndDurationWithoutCache = async (src) => {
11
8
  const args = [
12
9
  ['-v', 'error'],
13
10
  ['-show_entries', 'stream=channels:format=duration'],
@@ -23,6 +20,14 @@ async function getAudioChannelsAndDurationUnlimited(downloadMap, src) {
23
20
  channels: channels ? parseInt(channels[1], 10) : 0,
24
21
  duration: duration ? parseFloat(duration[1]) : null,
25
22
  };
23
+ return result;
24
+ };
25
+ exports.getAudioChannelsAndDurationWithoutCache = getAudioChannelsAndDurationWithoutCache;
26
+ async function getAudioChannelsAndDurationUnlimited(downloadMap, src) {
27
+ if (downloadMap.durationOfAssetCache[src]) {
28
+ return downloadMap.durationOfAssetCache[src];
29
+ }
30
+ const result = await (0, exports.getAudioChannelsAndDurationWithoutCache)(src);
26
31
  downloadMap.durationOfAssetCache[src] = result;
27
32
  return result;
28
33
  }
@@ -14,7 +14,7 @@ const getClient = (url) => {
14
14
  if (url.startsWith('http://')) {
15
15
  return node_http_1.default.get;
16
16
  }
17
- throw new Error('Can only download URLs starting with http:// or https://');
17
+ throw new Error(`Can only download URLs starting with http:// or https://, got "${url}"`);
18
18
  };
19
19
  const readFileWithoutRedirect = (url) => {
20
20
  return new Promise((resolve, reject) => {
@@ -1,5 +1,5 @@
1
1
  import type { TAsset } from 'remotion';
2
- export declare type UnsafeAsset = Omit<TAsset, 'frame' | 'id' | 'volume' | 'mediaFrame'> & {
2
+ export type UnsafeAsset = Omit<TAsset, 'frame' | 'id' | 'volume' | 'mediaFrame'> & {
3
3
  startInVideo: number;
4
4
  duration: number | null;
5
5
  trimLeft: number;
@@ -8,10 +8,10 @@ export declare type UnsafeAsset = Omit<TAsset, 'frame' | 'id' | 'volume' | 'medi
8
8
  playbackRate: number;
9
9
  allowAmplificationDuringRender: boolean;
10
10
  };
11
- export declare type AssetVolume = number | number[];
12
- export declare type MediaAsset = Omit<UnsafeAsset, 'duration' | 'volume'> & {
11
+ export type AssetVolume = number | number[];
12
+ export type MediaAsset = Omit<UnsafeAsset, 'duration' | 'volume'> & {
13
13
  duration: number;
14
14
  volume: AssetVolume;
15
15
  };
16
16
  export declare const uncompressMediaAsset: (allAssets: TAsset[], assetToUncompress: TAsset) => TAsset;
17
- export declare type Assets = MediaAsset[];
17
+ export type Assets = MediaAsset[];
@@ -1,6 +1,6 @@
1
1
  import type { Codec } from './codec';
2
2
  export declare const validAudioCodecs: readonly ["pcm-16", "aac", "mp3", "opus"];
3
- export declare type AudioCodec = typeof validAudioCodecs[number];
3
+ export type AudioCodec = typeof validAudioCodecs[number];
4
4
  export declare const supportedAudioCodecs: {
5
5
  readonly h264: readonly ["aac", "pcm-16"];
6
6
  readonly 'h264-mkv': readonly ["pcm-16"];
@@ -14,7 +14,7 @@ export declare const supportedAudioCodecs: {
14
14
  readonly wav: readonly ["pcm-16"];
15
15
  };
16
16
  declare const audioCodecNames: readonly ["pcm_s16le", "aac", "libmp3lame", "libopus"];
17
- declare type FfmpegAudioCodecName = typeof audioCodecNames[number];
17
+ type FfmpegAudioCodecName = typeof audioCodecNames[number];
18
18
  export declare const mapAudioCodecToFfmpegAudioCodecName: (audioCodec: AudioCodec) => FfmpegAudioCodecName;
19
19
  export declare const defaultAudioCodecs: {
20
20
  [key in Codec]: {
@@ -13,12 +13,13 @@
13
13
  * See the License for the specific language governing permissions and
14
14
  * limitations under the License.
15
15
  */
16
+ import type { AnySourceMapConsumer } from '../symbolicate-stacktrace';
16
17
  import type { Page } from './BrowserPage';
17
18
  import type { Connection } from './Connection';
18
19
  import { EventEmitter } from './EventEmitter';
19
20
  import type { Viewport } from './PuppeteerViewport';
20
21
  import { Target } from './Target';
21
- declare type BrowserCloseCallback = () => Promise<void> | void;
22
+ type BrowserCloseCallback = () => Promise<void> | void;
22
23
  interface WaitForTargetOptions {
23
24
  timeout?: number;
24
25
  }
@@ -30,18 +31,17 @@ export declare const enum BrowserEmittedEvents {
30
31
  }
31
32
  export declare class HeadlessBrowser extends EventEmitter {
32
33
  #private;
33
- static _create({ connection, contextIds, defaultViewport, closeCallback, }: {
34
+ static _create({ connection, defaultViewport, closeCallback, }: {
34
35
  connection: Connection;
35
- contextIds: string[];
36
36
  defaultViewport: Viewport;
37
- closeCallback?: BrowserCloseCallback;
37
+ closeCallback: BrowserCloseCallback;
38
38
  }): Promise<HeadlessBrowser>;
39
39
  connection: Connection;
40
40
  get _targets(): Map<string, Target>;
41
- constructor(connection: Connection, contextIds: string[], defaultViewport: Viewport, closeCallback?: BrowserCloseCallback);
41
+ constructor(connection: Connection, defaultViewport: Viewport, closeCallback?: BrowserCloseCallback);
42
42
  browserContexts(): BrowserContext[];
43
- newPage(): Promise<Page>;
44
- _createPageInContext(contextId?: string): Promise<Page>;
43
+ newPage(context: AnySourceMapConsumer | null): Promise<Page>;
44
+ _createPageInContext(context: AnySourceMapConsumer | null): Promise<Page>;
45
45
  targets(): Target[];
46
46
  waitForTarget(predicate: (x: Target) => boolean | Promise<boolean>, options?: WaitForTargetOptions): Promise<Target>;
47
47
  pages(): Promise<Page[]>;
@@ -50,13 +50,13 @@ export declare class HeadlessBrowser extends EventEmitter {
50
50
  }
51
51
  export declare class BrowserContext extends EventEmitter {
52
52
  #private;
53
- constructor(browser: HeadlessBrowser, contextId?: string);
53
+ constructor(browser: HeadlessBrowser);
54
54
  targets(): Target[];
55
55
  waitForTarget(predicate: (x: Target) => boolean | Promise<boolean>, options?: {
56
56
  timeout?: number;
57
57
  }): Promise<Target>;
58
58
  pages(): Promise<Page[]>;
59
- newPage(): Promise<Page>;
59
+ newPage(context: AnySourceMapConsumer | null): Promise<Page>;
60
60
  browser(): HeadlessBrowser;
61
61
  }
62
62
  export {};
@@ -14,18 +14,18 @@
14
14
  * See the License for the specific language governing permissions and
15
15
  * limitations under the License.
16
16
  */
17
+ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
18
+ if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
19
+ if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
20
+ return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
21
+ };
17
22
  var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) {
18
23
  if (kind === "m") throw new TypeError("Private method is not writable");
19
24
  if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");
20
25
  if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it");
21
26
  return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
22
27
  };
23
- var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
24
- if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
25
- if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
26
- return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
27
- };
28
- var _HeadlessBrowser_instances, _HeadlessBrowser_defaultViewport, _HeadlessBrowser_closeCallback, _HeadlessBrowser_defaultContext, _HeadlessBrowser_contexts, _HeadlessBrowser_targets, _HeadlessBrowser_targetCreated, _HeadlessBrowser_targetDestroyed, _HeadlessBrowser_targetInfoChanged, _BrowserContext_browser, _BrowserContext_id;
28
+ var _HeadlessBrowser_instances, _HeadlessBrowser_defaultViewport, _HeadlessBrowser_closeCallback, _HeadlessBrowser_defaultContext, _HeadlessBrowser_contexts, _HeadlessBrowser_targets, _HeadlessBrowser_targetCreated, _HeadlessBrowser_targetDestroyed, _HeadlessBrowser_targetInfoChanged, _BrowserContext_browser;
29
29
  Object.defineProperty(exports, "__esModule", { value: true });
30
30
  exports.BrowserContext = exports.HeadlessBrowser = void 0;
31
31
  const assert_1 = require("./assert");
@@ -33,8 +33,15 @@ const EventEmitter_1 = require("./EventEmitter");
33
33
  const Target_1 = require("./Target");
34
34
  const util_1 = require("./util");
35
35
  class HeadlessBrowser extends EventEmitter_1.EventEmitter {
36
- // eslint-disable-next-line max-params
37
- constructor(connection, contextIds, defaultViewport, closeCallback) {
36
+ static async _create({ connection, defaultViewport, closeCallback, }) {
37
+ const browser = new HeadlessBrowser(connection, defaultViewport, closeCallback);
38
+ await connection.send('Target.setDiscoverTargets', { discover: true });
39
+ return browser;
40
+ }
41
+ get _targets() {
42
+ return __classPrivateFieldGet(this, _HeadlessBrowser_targets, "f");
43
+ }
44
+ constructor(connection, defaultViewport, closeCallback) {
38
45
  super();
39
46
  _HeadlessBrowser_instances.add(this);
40
47
  _HeadlessBrowser_defaultViewport.set(this, void 0);
@@ -50,32 +57,21 @@ class HeadlessBrowser extends EventEmitter_1.EventEmitter {
50
57
  }, "f");
51
58
  __classPrivateFieldSet(this, _HeadlessBrowser_defaultContext, new BrowserContext(this), "f");
52
59
  __classPrivateFieldSet(this, _HeadlessBrowser_contexts, new Map(), "f");
53
- for (const contextId of contextIds) {
54
- __classPrivateFieldGet(this, _HeadlessBrowser_contexts, "f").set(contextId, new BrowserContext(this, contextId));
55
- }
56
60
  __classPrivateFieldSet(this, _HeadlessBrowser_targets, new Map(), "f");
57
61
  this.connection.on('Target.targetCreated', __classPrivateFieldGet(this, _HeadlessBrowser_instances, "m", _HeadlessBrowser_targetCreated).bind(this));
58
62
  this.connection.on('Target.targetDestroyed', __classPrivateFieldGet(this, _HeadlessBrowser_instances, "m", _HeadlessBrowser_targetDestroyed).bind(this));
59
63
  this.connection.on('Target.targetInfoChanged', __classPrivateFieldGet(this, _HeadlessBrowser_instances, "m", _HeadlessBrowser_targetInfoChanged).bind(this));
60
64
  }
61
- static async _create({ connection, contextIds, defaultViewport, closeCallback, }) {
62
- const browser = new HeadlessBrowser(connection, contextIds, defaultViewport, closeCallback);
63
- await connection.send('Target.setDiscoverTargets', { discover: true });
64
- return browser;
65
- }
66
- get _targets() {
67
- return __classPrivateFieldGet(this, _HeadlessBrowser_targets, "f");
68
- }
69
65
  browserContexts() {
70
66
  return [__classPrivateFieldGet(this, _HeadlessBrowser_defaultContext, "f"), ...Array.from(__classPrivateFieldGet(this, _HeadlessBrowser_contexts, "f").values())];
71
67
  }
72
- newPage() {
73
- return __classPrivateFieldGet(this, _HeadlessBrowser_defaultContext, "f").newPage();
68
+ newPage(context) {
69
+ return __classPrivateFieldGet(this, _HeadlessBrowser_defaultContext, "f").newPage(context);
74
70
  }
75
- async _createPageInContext(contextId) {
71
+ async _createPageInContext(context) {
76
72
  const { targetId } = await this.connection.send('Target.createTarget', {
77
73
  url: 'about:blank',
78
- browserContextId: contextId || undefined,
74
+ browserContextId: undefined,
79
75
  });
80
76
  const target = __classPrivateFieldGet(this, _HeadlessBrowser_targets, "f").get(targetId);
81
77
  if (!target) {
@@ -85,9 +81,9 @@ class HeadlessBrowser extends EventEmitter_1.EventEmitter {
85
81
  if (!initialized) {
86
82
  throw new Error(`Failed to create target for page (id = ${targetId})`);
87
83
  }
88
- const page = await target.page();
84
+ const page = await target.page(context);
89
85
  if (!page) {
90
- throw new Error(`Failed to create a page for context (id = ${contextId})`);
86
+ throw new Error(`Failed to create a page for context`);
91
87
  }
92
88
  return page;
93
89
  }
@@ -185,12 +181,10 @@ _HeadlessBrowser_defaultViewport = new WeakMap(), _HeadlessBrowser_closeCallback
185
181
  }
186
182
  };
187
183
  class BrowserContext extends EventEmitter_1.EventEmitter {
188
- constructor(browser, contextId) {
184
+ constructor(browser) {
189
185
  super();
190
186
  _BrowserContext_browser.set(this, void 0);
191
- _BrowserContext_id.set(this, void 0);
192
187
  __classPrivateFieldSet(this, _BrowserContext_browser, browser, "f");
193
- __classPrivateFieldSet(this, _BrowserContext_id, contextId, "f");
194
188
  }
195
189
  targets() {
196
190
  return __classPrivateFieldGet(this, _BrowserContext_browser, "f").targets().filter((target) => {
@@ -205,17 +199,17 @@ class BrowserContext extends EventEmitter_1.EventEmitter {
205
199
  async pages() {
206
200
  const pages = await Promise.all(this.targets()
207
201
  .filter((target) => target.type() === 'page')
208
- .map((target) => target.page()));
202
+ .map((target) => target.page(null)));
209
203
  return pages.filter((page) => {
210
204
  return Boolean(page);
211
205
  });
212
206
  }
213
- newPage() {
214
- return __classPrivateFieldGet(this, _BrowserContext_browser, "f")._createPageInContext(__classPrivateFieldGet(this, _BrowserContext_id, "f"));
207
+ newPage(context) {
208
+ return __classPrivateFieldGet(this, _BrowserContext_browser, "f")._createPageInContext(context);
215
209
  }
216
210
  browser() {
217
211
  return __classPrivateFieldGet(this, _BrowserContext_browser, "f");
218
212
  }
219
213
  }
220
214
  exports.BrowserContext = BrowserContext;
221
- _BrowserContext_browser = new WeakMap(), _BrowserContext_id = new WeakMap();
215
+ _BrowserContext_browser = new WeakMap();
@@ -14,7 +14,7 @@
14
14
  * limitations under the License.
15
15
  */
16
16
  import type { Product } from './Product';
17
- declare type Platform = 'linux' | 'mac' | 'mac_arm' | 'win32' | 'win64';
17
+ type Platform = 'linux' | 'mac' | 'mac_arm' | 'win32' | 'win64';
18
18
  interface BrowserFetcherRevisionInfo {
19
19
  folderPath: string;
20
20
  executablePath: string;
@@ -13,6 +13,7 @@
13
13
  * See the License for the specific language governing permissions and
14
14
  * limitations under the License.
15
15
  */
16
+ import type { AnySourceMapConsumer } from '../symbolicate-stacktrace';
16
17
  import type { HeadlessBrowser } from './Browser';
17
18
  import type { CDPSession } from './Connection';
18
19
  import { ConsoleMessage } from './ConsoleMessage';
@@ -40,11 +41,18 @@ interface PageEventObject {
40
41
  export declare class Page extends EventEmitter {
41
42
  #private;
42
43
  id: string;
43
- static _create(client: CDPSession, target: Target, defaultViewport: Viewport, browser: HeadlessBrowser): Promise<Page>;
44
+ static _create({ client, target, defaultViewport, browser, sourcemapContext, }: {
45
+ client: CDPSession;
46
+ target: Target;
47
+ defaultViewport: Viewport;
48
+ browser: HeadlessBrowser;
49
+ sourcemapContext: AnySourceMapConsumer | null;
50
+ }): Promise<Page>;
44
51
  closed: boolean;
45
52
  browser: HeadlessBrowser;
46
53
  screenshotTaskQueue: TaskQueue;
47
- constructor(client: CDPSession, target: Target, browser: HeadlessBrowser);
54
+ sourcemapContext: AnySourceMapConsumer | null;
55
+ constructor(client: CDPSession, target: Target, browser: HeadlessBrowser, sourcemapContext: AnySourceMapConsumer | null);
48
56
  /**
49
57
  * Listen to page events.
50
58
  */
@@ -76,5 +84,6 @@ export declare class Page extends EventEmitter {
76
84
  close(options?: {
77
85
  runBeforeUnload?: boolean;
78
86
  }): Promise<void>;
87
+ setBrowserSourceMapContext(context: AnySourceMapConsumer | null): void;
79
88
  }
80
89
  export {};
@@ -14,20 +14,23 @@
14
14
  * See the License for the specific language governing permissions and
15
15
  * limitations under the License.
16
16
  */
17
+ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
18
+ if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
19
+ if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
20
+ return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
21
+ };
17
22
  var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) {
18
23
  if (kind === "m") throw new TypeError("Private method is not writable");
19
24
  if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");
20
25
  if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it");
21
26
  return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
22
27
  };
23
- var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
24
- if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
25
- if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
26
- return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
27
- };
28
28
  var _Page_instances, _Page_client, _Page_target, _Page_timeoutSettings, _Page_frameManager, _Page_pageBindings, _Page_initialize, _Page_onTargetCrashed, _Page_onLogEntryAdded, _Page_onConsoleAPI, _Page_onBindingCalled, _Page_addConsoleMessage;
29
29
  Object.defineProperty(exports, "__esModule", { value: true });
30
30
  exports.Page = void 0;
31
+ const remotion_1 = require("remotion");
32
+ const logger_1 = require("../logger");
33
+ const truthy_1 = require("../truthy");
31
34
  const assert_1 = require("./assert");
32
35
  const ConsoleMessage_1 = require("./ConsoleMessage");
33
36
  const EventEmitter_1 = require("./EventEmitter");
@@ -37,7 +40,13 @@ const TaskQueue_1 = require("./TaskQueue");
37
40
  const TimeoutSettings_1 = require("./TimeoutSettings");
38
41
  const util_1 = require("./util");
39
42
  class Page extends EventEmitter_1.EventEmitter {
40
- constructor(client, target, browser) {
43
+ static async _create({ client, target, defaultViewport, browser, sourcemapContext, }) {
44
+ const page = new Page(client, target, browser, sourcemapContext);
45
+ await __classPrivateFieldGet(page, _Page_instances, "m", _Page_initialize).call(page);
46
+ await page.setViewport(defaultViewport);
47
+ return page;
48
+ }
49
+ constructor(client, target, browser, sourcemapContext) {
41
50
  super();
42
51
  _Page_instances.add(this);
43
52
  this.closed = false;
@@ -52,6 +61,7 @@ class Page extends EventEmitter_1.EventEmitter {
52
61
  this.screenshotTaskQueue = new TaskQueue_1.TaskQueue();
53
62
  this.browser = browser;
54
63
  this.id = String(Math.random());
64
+ this.sourcemapContext = sourcemapContext;
55
65
  client.on('Target.attachedToTarget', (event) => {
56
66
  switch (event.targetInfo.type) {
57
67
  case 'iframe':
@@ -84,12 +94,34 @@ class Page extends EventEmitter_1.EventEmitter {
84
94
  client.on('Log.entryAdded', (event) => {
85
95
  return __classPrivateFieldGet(this, _Page_instances, "m", _Page_onLogEntryAdded).call(this, event);
86
96
  });
87
- }
88
- static async _create(client, target, defaultViewport, browser) {
89
- const page = new Page(client, target, browser);
90
- await __classPrivateFieldGet(page, _Page_instances, "m", _Page_initialize).call(page);
91
- await page.setViewport(defaultViewport);
92
- return page;
97
+ this.on('console', (log) => {
98
+ var _a;
99
+ const { url, columnNumber, lineNumber } = log.location();
100
+ if ((url === null || url === void 0 ? void 0 : url.endsWith(remotion_1.Internals.bundleName)) &&
101
+ lineNumber &&
102
+ this.sourcemapContext) {
103
+ const origPosition = (_a = this.sourcemapContext) === null || _a === void 0 ? void 0 : _a.originalPositionFor({
104
+ column: columnNumber !== null && columnNumber !== void 0 ? columnNumber : 0,
105
+ line: lineNumber,
106
+ });
107
+ const file = [
108
+ origPosition === null || origPosition === void 0 ? void 0 : origPosition.source,
109
+ origPosition === null || origPosition === void 0 ? void 0 : origPosition.line,
110
+ origPosition === null || origPosition === void 0 ? void 0 : origPosition.column,
111
+ ]
112
+ .filter(truthy_1.truthy)
113
+ .join(':');
114
+ logger_1.Log.verboseAdvanced({
115
+ logLevel: (0, logger_1.getLogLevel)(),
116
+ tag: `console.${log.type}()`,
117
+ secondTag: [origPosition.name, file].filter(truthy_1.truthy).join('@'),
118
+ indent: false,
119
+ }, log.text);
120
+ }
121
+ else {
122
+ logger_1.Log.verboseAdvanced({ logLevel: (0, logger_1.getLogLevel)(), tag: `console.${log.type}`, indent: false }, log.text);
123
+ }
124
+ });
93
125
  }
94
126
  /**
95
127
  * Listen to page events.
@@ -181,6 +213,9 @@ class Page extends EventEmitter_1.EventEmitter {
181
213
  await __classPrivateFieldGet(this, _Page_target, "f")._isClosedPromise;
182
214
  }
183
215
  }
216
+ setBrowserSourceMapContext(context) {
217
+ this.sourcemapContext = context;
218
+ }
184
219
  }
185
220
  exports.Page = Page;
186
221
  _Page_client = new WeakMap(), _Page_target = new WeakMap(), _Page_timeoutSettings = new WeakMap(), _Page_frameManager = new WeakMap(), _Page_pageBindings = new WeakMap(), _Page_instances = new WeakSet(), _Page_initialize = async function _Page_initialize() {
@@ -60,6 +60,7 @@ const assert_1 = require("./assert");
60
60
  const Connection_1 = require("./Connection");
61
61
  const Errors_1 = require("./Errors");
62
62
  const NodeWebSocketTransport_1 = require("./NodeWebSocketTransport");
63
+ const should_log_message_1 = require("./should-log-message");
63
64
  const util_1 = require("./util");
64
65
  const PROCESS_ERROR_EXPLANATION = `Puppeteer was unable to kill the process which ran the browser binary.
65
66
  This means that, on future Puppeteer launches, Puppeteer might not be able to launch the browser.
@@ -95,10 +96,26 @@ class BrowserRunner {
95
96
  });
96
97
  if (dumpio) {
97
98
  (_a = this.proc.stdout) === null || _a === void 0 ? void 0 : _a.on('data', (d) => {
98
- logger_1.Log.verboseAdvanced({ indent: options.indent, logLevel: (0, logger_1.getLogLevel)(), tag: 'chrome' }, d.toString().trim());
99
+ const message = d.toString('utf8').trim();
100
+ if ((0, should_log_message_1.shouldLogBrowserMessage)(message)) {
101
+ const formatted = (0, should_log_message_1.formatChromeMessage)(message);
102
+ if (!formatted) {
103
+ return;
104
+ }
105
+ const { output, tag } = formatted;
106
+ logger_1.Log.verboseAdvanced({ indent: options.indent, logLevel: (0, logger_1.getLogLevel)(), tag }, output);
107
+ }
99
108
  });
100
109
  (_b = this.proc.stderr) === null || _b === void 0 ? void 0 : _b.on('data', (d) => {
101
- logger_1.Log.verboseAdvanced({ indent: options.indent, logLevel: (0, logger_1.getLogLevel)(), tag: 'chrome' }, d.toString().trim());
110
+ const message = d.toString('utf8').trim();
111
+ if ((0, should_log_message_1.shouldLogBrowserMessage)(message)) {
112
+ const formatted = (0, should_log_message_1.formatChromeMessage)(message);
113
+ if (!formatted) {
114
+ return;
115
+ }
116
+ const { output, tag } = formatted;
117
+ logger_1.Log.verboseAdvanced({ indent: options.indent, logLevel: (0, logger_1.getLogLevel)(), tag }, output);
118
+ }
102
119
  });
103
120
  }
104
121
  __classPrivateFieldSet(this, _BrowserRunner_closed, false, "f");
@@ -19,7 +19,7 @@ export interface ConsoleMessageLocation {
19
19
  lineNumber?: number;
20
20
  columnNumber?: number;
21
21
  }
22
- export declare type ConsoleMessageType = 'log' | 'debug' | 'info' | 'error' | 'warning' | 'dir' | 'dirxml' | 'table' | 'trace' | 'clear' | 'startGroup' | 'startGroupCollapsed' | 'endGroup' | 'assert' | 'profile' | 'profileEnd' | 'count' | 'timeEnd' | 'verbose';
22
+ export type ConsoleMessageType = 'log' | 'debug' | 'info' | 'error' | 'warning' | 'dir' | 'dirxml' | 'table' | 'trace' | 'clear' | 'startGroup' | 'startGroupCollapsed' | 'endGroup' | 'assert' | 'profile' | 'profileEnd' | 'count' | 'timeEnd' | 'verbose';
23
23
  export declare class ConsoleMessage {
24
24
  #private;
25
25
  type: ConsoleMessageType;