@remotion/serverless 4.0.244 → 4.0.246

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 (122) hide show
  1. package/.turbo/turbo-make.log +1 -1
  2. package/LICENSE.md +1 -1
  3. package/dist/best-frames-per-function-param.d.ts +1 -0
  4. package/dist/best-frames-per-function-param.js +17 -0
  5. package/dist/calculate-chunk-times.d.ts +5 -0
  6. package/dist/calculate-chunk-times.js +29 -0
  7. package/dist/can-concat-seamlessly.d.ts +3 -0
  8. package/dist/can-concat-seamlessly.js +17 -0
  9. package/dist/cleanup-props.d.ts +9 -0
  10. package/dist/cleanup-props.js +23 -0
  11. package/dist/cleanup-serialized-input-props.d.ts +15 -0
  12. package/dist/cleanup-serialized-input-props.js +34 -0
  13. package/dist/client.d.ts +9 -0
  14. package/dist/client.js +30 -12
  15. package/dist/compress-props.d.ts +6 -2
  16. package/dist/compress-props.js +5 -3
  17. package/dist/concat-videos.d.ts +25 -0
  18. package/dist/concat-videos.js +53 -0
  19. package/dist/constants.d.ts +39 -3
  20. package/dist/constants.js +8 -1
  21. package/dist/create-post-render-data.d.ts +20 -0
  22. package/dist/create-post-render-data.js +68 -0
  23. package/dist/docs-url.d.ts +1 -0
  24. package/dist/docs-url.js +4 -0
  25. package/dist/estimate-price-from-bucket.d.ts +15 -0
  26. package/dist/estimate-price-from-bucket.js +31 -0
  27. package/dist/expected-out-name.d.ts +1 -1
  28. package/dist/find-output-file-in-bucket.d.ts +16 -0
  29. package/dist/find-output-file-in-bucket.js +41 -0
  30. package/dist/format-costs-info.d.ts +2 -0
  31. package/dist/format-costs-info.js +23 -0
  32. package/dist/get-browser-instance.d.ts +5 -12
  33. package/dist/get-browser-instance.js +8 -7
  34. package/dist/get-custom-out-name.d.ts +1 -1
  35. package/dist/get-or-create-bucket.d.ts +1 -1
  36. package/dist/get-overall-progress-from-storage.d.ts +11 -0
  37. package/dist/get-overall-progress-from-storage.js +25 -0
  38. package/dist/get-overall-progress.d.ts +9 -0
  39. package/dist/get-overall-progress.js +23 -0
  40. package/dist/handlers/check-version-mismatch.d.ts +8 -0
  41. package/dist/handlers/check-version-mismatch.js +23 -0
  42. package/dist/handlers/compositions.d.ts +16 -0
  43. package/dist/handlers/compositions.js +81 -0
  44. package/dist/handlers/launch.d.ts +18 -0
  45. package/dist/handlers/launch.js +600 -0
  46. package/dist/handlers/progress.d.ts +16 -0
  47. package/dist/handlers/progress.js +54 -0
  48. package/dist/handlers/renderer.d.ts +24 -0
  49. package/dist/handlers/renderer.js +344 -0
  50. package/dist/handlers/start.d.ts +19 -0
  51. package/dist/handlers/start.js +104 -0
  52. package/dist/handlers/still.d.ts +21 -0
  53. package/dist/handlers/still.js +335 -0
  54. package/dist/index.d.ts +21 -5
  55. package/dist/index.js +54 -7
  56. package/dist/info.d.ts +1 -1
  57. package/dist/inner-routine.d.ts +22 -0
  58. package/dist/inner-routine.js +267 -0
  59. package/dist/inspect-error.d.ts +4 -0
  60. package/dist/inspect-error.js +39 -0
  61. package/dist/invoke-webhook.d.ts +42 -0
  62. package/dist/invoke-webhook.js +116 -0
  63. package/dist/is-warm.d.ts +2 -0
  64. package/dist/is-warm.js +10 -0
  65. package/dist/leak-detection.d.ts +4 -0
  66. package/dist/leak-detection.js +40 -0
  67. package/dist/make-bucket-name.d.ts +1 -1
  68. package/dist/make-timeout-error.d.ts +13 -0
  69. package/dist/make-timeout-error.js +32 -0
  70. package/dist/make-timeout-message.d.ts +12 -0
  71. package/dist/make-timeout-message.js +76 -0
  72. package/dist/merge-chunks.d.ts +38 -0
  73. package/dist/merge-chunks.js +92 -0
  74. package/dist/min-max.d.ts +2 -0
  75. package/dist/min-max.js +33 -0
  76. package/dist/most-expensive-chunks.d.ts +13 -0
  77. package/dist/most-expensive-chunks.js +28 -0
  78. package/dist/on-downloads-helpers.d.ts +2 -0
  79. package/dist/on-downloads-helpers.js +29 -0
  80. package/dist/overall-render-progress.d.ts +59 -0
  81. package/dist/overall-render-progress.js +180 -0
  82. package/dist/plan-frame-ranges.d.ts +7 -0
  83. package/dist/plan-frame-ranges.js +17 -0
  84. package/dist/print-logging-grep-helper.d.ts +4 -0
  85. package/dist/print-logging-grep-helper.js +12 -0
  86. package/dist/progress.d.ts +16 -0
  87. package/dist/progress.js +254 -0
  88. package/dist/provider-implementation.d.ts +152 -3
  89. package/dist/render-has-audio-video.d.ts +6 -0
  90. package/dist/render-has-audio-video.js +21 -0
  91. package/dist/render-metadata.d.ts +1 -1
  92. package/dist/render-progress.d.ts +51 -0
  93. package/dist/return-values.d.ts +38 -0
  94. package/dist/return-values.js +2 -0
  95. package/dist/stackback.d.ts +6 -0
  96. package/dist/stackback.js +59 -0
  97. package/dist/stream-renderer.d.ts +17 -0
  98. package/dist/stream-renderer.js +148 -0
  99. package/dist/streaming/streaming.d.ts +6 -6
  100. package/dist/streaming/streaming.js +3 -3
  101. package/dist/types.d.ts +55 -0
  102. package/dist/types.js +2 -0
  103. package/dist/validate-composition.d.ts +1 -1
  104. package/dist/validate-composition.js +11 -1
  105. package/dist/validate-download-behavior.d.ts +1 -0
  106. package/dist/validate-download-behavior.js +21 -0
  107. package/dist/validate-frames-per-function.d.ts +4 -0
  108. package/dist/validate-frames-per-function.js +29 -0
  109. package/dist/validate-privacy.d.ts +2 -0
  110. package/dist/validate-privacy.js +14 -0
  111. package/dist/validate.d.ts +4 -0
  112. package/dist/validate.js +8 -0
  113. package/dist/why-is-node-running.d.ts +15 -0
  114. package/dist/why-is-node-running.js +89 -0
  115. package/dist/{write-lambda-error.d.ts → write-error-to-storage.d.ts} +4 -4
  116. package/package.json +6 -5
  117. package/tsconfig.tsbuildinfo +1 -1
  118. package/dist/compositions.d.ts +0 -11
  119. package/dist/compositions.js +0 -82
  120. package/dist/still.d.ts +0 -28
  121. /package/dist/{still.js → render-progress.js} +0 -0
  122. /package/dist/{write-lambda-error.js → write-error-to-storage.js} +0 -0
@@ -0,0 +1,24 @@
1
+ import type { ServerlessPayload } from '../constants';
2
+ import type { InsideFunctionSpecifics, ProviderSpecifics } from '../provider-implementation';
3
+ import type { OnStream } from '../streaming/streaming';
4
+ import type { CloudProvider } from '../types';
5
+ type Options = {
6
+ expectedBucketOwner: string;
7
+ isWarm: boolean;
8
+ };
9
+ export type RequestContext = {
10
+ invokedFunctionArn: string;
11
+ getRemainingTimeInMillis: () => number;
12
+ awsRequestId: string;
13
+ };
14
+ export declare const rendererHandler: <Provider extends CloudProvider>({ onStream, options, params, providerSpecifics, requestContext, insideFunctionSpecifics, }: {
15
+ params: ServerlessPayload<Provider>;
16
+ options: Options;
17
+ onStream: OnStream<Provider>;
18
+ requestContext: RequestContext;
19
+ providerSpecifics: ProviderSpecifics<Provider>;
20
+ insideFunctionSpecifics: InsideFunctionSpecifics;
21
+ }) => Promise<{
22
+ type: "success";
23
+ }>;
24
+ export {};
@@ -0,0 +1,344 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.rendererHandler = void 0;
7
+ const renderer_1 = require("@remotion/renderer");
8
+ const pure_1 = require("@remotion/renderer/pure");
9
+ const node_fs_1 = __importDefault(require("node:fs"));
10
+ const node_path_1 = __importDefault(require("node:path"));
11
+ const version_1 = require("remotion/version");
12
+ const can_concat_seamlessly_1 = require("../can-concat-seamlessly");
13
+ const compress_props_1 = require("../compress-props");
14
+ const constants_1 = require("../constants");
15
+ const leak_detection_1 = require("../leak-detection");
16
+ const on_downloads_helpers_1 = require("../on-downloads-helpers");
17
+ const serialize_artifact_1 = require("../serialize-artifact");
18
+ const truthy_1 = require("../truthy");
19
+ const why_is_node_running_1 = require("../why-is-node-running");
20
+ const write_error_to_storage_1 = require("../write-error-to-storage");
21
+ const renderHandler = async ({ params, options, logs, onStream, providerSpecifics, insideFunctionSpecifics, }) => {
22
+ if (params.type !== constants_1.ServerlessRoutines.renderer) {
23
+ throw new Error('Params must be renderer');
24
+ }
25
+ if (params.launchFunctionConfig.version !== version_1.VERSION) {
26
+ throw new Error(`The version of the function that was specified as "rendererFunctionName" is ${version_1.VERSION} but the version of the function that invoked the render is ${params.launchFunctionConfig.version}. Please make sure that the version of the function that is specified as "rendererFunctionName" is the same as the version of the function that is invoked.`);
27
+ }
28
+ const inputPropsPromise = (0, compress_props_1.decompressInputProps)({
29
+ bucketName: params.bucketName,
30
+ expectedBucketOwner: options.expectedBucketOwner,
31
+ region: providerSpecifics.getCurrentRegionInFunction(),
32
+ serialized: params.inputProps,
33
+ propsType: 'input-props',
34
+ providerSpecifics,
35
+ forcePathStyle: params.forcePathStyle,
36
+ });
37
+ const resolvedPropsPromise = (0, compress_props_1.decompressInputProps)({
38
+ bucketName: params.bucketName,
39
+ expectedBucketOwner: options.expectedBucketOwner,
40
+ region: providerSpecifics.getCurrentRegionInFunction(),
41
+ serialized: params.resolvedProps,
42
+ propsType: 'resolved-props',
43
+ providerSpecifics,
44
+ forcePathStyle: params.forcePathStyle,
45
+ });
46
+ const browserInstance = await insideFunctionSpecifics.getBrowserInstance({
47
+ logLevel: params.logLevel,
48
+ indent: false,
49
+ chromiumOptions: params.chromiumOptions,
50
+ providerSpecifics,
51
+ insideFunctionSpecifics,
52
+ });
53
+ const outputPath = renderer_1.RenderInternals.tmpDir('remotion-render-');
54
+ if (typeof params.chunk !== 'number') {
55
+ throw new Error('must pass chunk');
56
+ }
57
+ if (!params.frameRange) {
58
+ throw new Error('must pass framerange');
59
+ }
60
+ renderer_1.RenderInternals.Log.verbose({ indent: false, logLevel: params.logLevel }, `Rendering frames ${params.frameRange[0]}-${params.frameRange[1]} in this Lambda function`);
61
+ const start = Date.now();
62
+ const chunkTimingData = {
63
+ timings: {},
64
+ chunk: params.chunk,
65
+ frameRange: params.frameRange,
66
+ startDate: start,
67
+ };
68
+ const outdir = renderer_1.RenderInternals.tmpDir(constants_1.RENDERER_PATH_TOKEN);
69
+ const chunk = `localchunk-${String(params.chunk).padStart(8, '0')}`;
70
+ const defaultAudioCodec = renderer_1.RenderInternals.getDefaultAudioCodec({
71
+ codec: params.codec,
72
+ preferLossless: params.preferLossless,
73
+ });
74
+ const seamlessAudio = (0, can_concat_seamlessly_1.canConcatAudioSeamlessly)(defaultAudioCodec, params.framesPerLambda);
75
+ const seamlessVideo = (0, can_concat_seamlessly_1.canConcatVideoSeamlessly)(params.codec);
76
+ renderer_1.RenderInternals.Log.verbose({ indent: false, logLevel: params.logLevel }, `Preparing for rendering a chunk. Audio = ${seamlessAudio ? 'seamless' : 'normal'}, Video = ${seamlessVideo ? 'seamless' : 'normal'}`, params.logLevel);
77
+ const chunkCodec = seamlessVideo && params.codec === 'h264'
78
+ ? 'h264-ts'
79
+ : params.codec === 'gif'
80
+ ? 'h264-ts'
81
+ : params.codec;
82
+ const audioCodec = defaultAudioCodec === null
83
+ ? null
84
+ : seamlessAudio
85
+ ? defaultAudioCodec
86
+ : 'pcm-16';
87
+ const videoExtension = renderer_1.RenderInternals.getFileExtensionFromCodec(chunkCodec, audioCodec);
88
+ const audioExtension = audioCodec
89
+ ? renderer_1.RenderInternals.getExtensionFromAudioCodec(audioCodec)
90
+ : null;
91
+ const videoOutputLocation = node_path_1.default.join(outdir, `${chunk}.${videoExtension}`);
92
+ const willRenderAudioEval = renderer_1.RenderInternals.getShouldRenderAudio({
93
+ assetsInfo: null,
94
+ codec: params.codec,
95
+ enforceAudioTrack: true,
96
+ muted: params.muted,
97
+ });
98
+ if (willRenderAudioEval === 'maybe') {
99
+ throw new Error('Cannot determine whether to render audio or not');
100
+ }
101
+ const audioOutputLocation = willRenderAudioEval === 'no'
102
+ ? null
103
+ : pure_1.NoReactAPIs.isAudioCodec(params.codec)
104
+ ? null
105
+ : audioExtension
106
+ ? node_path_1.default.join(outdir, `${chunk}.${audioExtension}`)
107
+ : null;
108
+ const resolvedProps = await resolvedPropsPromise;
109
+ const serializedInputPropsWithCustomSchema = await inputPropsPromise;
110
+ const allFrames = renderer_1.RenderInternals.getFramesToRender(params.frameRange, params.everyNthFrame);
111
+ const onArtifact = (artifact) => {
112
+ renderer_1.RenderInternals.Log.info({ indent: false, logLevel: params.logLevel }, `Received artifact on frame ${artifact.frame}:`, artifact.filename, artifact.content.length + 'bytes. Streaming to main function');
113
+ const startTimestamp = Date.now();
114
+ onStream({
115
+ type: 'artifact-emitted',
116
+ payload: {
117
+ artifact: (0, serialize_artifact_1.serializeArtifact)(artifact),
118
+ },
119
+ })
120
+ .then(() => {
121
+ renderer_1.RenderInternals.Log.info({ indent: false, logLevel: params.logLevel }, `Streaming artifact ${artifact.filename} to main function took ${Date.now() - startTimestamp}ms`);
122
+ })
123
+ .catch((e) => {
124
+ renderer_1.RenderInternals.Log.error({ indent: false, logLevel: params.logLevel }, `Error streaming artifact ${artifact.filename} to main function`, e);
125
+ });
126
+ };
127
+ await new Promise((resolve, reject) => {
128
+ var _a, _b, _c, _d, _e;
129
+ renderer_1.RenderInternals.internalRenderMedia({
130
+ repro: false,
131
+ composition: {
132
+ id: params.composition,
133
+ durationInFrames: params.durationInFrames,
134
+ fps: params.fps,
135
+ height: params.height,
136
+ width: params.width,
137
+ defaultCodec: null,
138
+ },
139
+ imageFormat: params.imageFormat,
140
+ serializedInputPropsWithCustomSchema,
141
+ frameRange: params.frameRange,
142
+ onProgress: ({ renderedFrames, encodedFrames, stitchStage }) => {
143
+ renderer_1.RenderInternals.Log.verbose({ indent: false, logLevel: params.logLevel }, `Rendered ${renderedFrames} frames, encoded ${encodedFrames} frames, stage = ${stitchStage}`);
144
+ const allFramesRendered = allFrames.length === renderedFrames;
145
+ const allFramesEncoded = allFrames.length === encodedFrames;
146
+ const frameReportPoint = (renderedFrames % params.progressEveryNthFrame === 0 ||
147
+ allFramesRendered) &&
148
+ !allFramesEncoded;
149
+ const encodedFramesReportPoint = (encodedFrames % params.progressEveryNthFrame === 0 ||
150
+ allFramesEncoded) &&
151
+ allFramesRendered;
152
+ if (frameReportPoint || encodedFramesReportPoint) {
153
+ onStream({
154
+ type: 'frames-rendered',
155
+ payload: { rendered: renderedFrames, encoded: encodedFrames },
156
+ });
157
+ }
158
+ if (renderedFrames === allFrames.length) {
159
+ renderer_1.RenderInternals.Log.verbose({ indent: false, logLevel: params.logLevel }, 'Rendered all frames!');
160
+ }
161
+ chunkTimingData.timings[renderedFrames] = Date.now() - start;
162
+ },
163
+ concurrency: params.concurrencyPerLambda,
164
+ onStart: () => {
165
+ onStream({
166
+ type: 'lambda-invoked',
167
+ payload: {
168
+ attempt: params.attempt,
169
+ },
170
+ });
171
+ },
172
+ puppeteerInstance: browserInstance.instance,
173
+ serveUrl: params.serveUrl,
174
+ jpegQuality: (_a = params.jpegQuality) !== null && _a !== void 0 ? _a : renderer_1.RenderInternals.DEFAULT_JPEG_QUALITY,
175
+ envVariables: (_b = params.envVariables) !== null && _b !== void 0 ? _b : {},
176
+ logLevel: params.logLevel,
177
+ onBrowserLog: (log) => {
178
+ logs.push(log);
179
+ },
180
+ outputLocation: videoOutputLocation,
181
+ codec: chunkCodec,
182
+ crf: (_c = params.crf) !== null && _c !== void 0 ? _c : null,
183
+ pixelFormat: (_d = params.pixelFormat) !== null && _d !== void 0 ? _d : renderer_1.RenderInternals.DEFAULT_PIXEL_FORMAT,
184
+ proResProfile: (_e = params.proResProfile) !== null && _e !== void 0 ? _e : undefined,
185
+ x264Preset: params.x264Preset,
186
+ onDownload: (0, on_downloads_helpers_1.onDownloadsHelper)(params.logLevel),
187
+ overwrite: false,
188
+ chromiumOptions: params.chromiumOptions,
189
+ scale: params.scale,
190
+ timeoutInMilliseconds: params.timeoutInMilliseconds,
191
+ port: null,
192
+ everyNthFrame: params.everyNthFrame,
193
+ numberOfGifLoops: null,
194
+ muted: params.muted,
195
+ enforceAudioTrack: true,
196
+ audioBitrate: params.audioBitrate,
197
+ videoBitrate: params.videoBitrate,
198
+ encodingBufferSize: params.encodingBufferSize,
199
+ encodingMaxRate: params.encodingMaxRate,
200
+ audioCodec,
201
+ preferLossless: params.preferLossless,
202
+ browserExecutable: providerSpecifics.getChromiumPath(),
203
+ cancelSignal: undefined,
204
+ disallowParallelEncoding: false,
205
+ ffmpegOverride: ({ args }) => args,
206
+ indent: false,
207
+ onCtrlCExit: () => undefined,
208
+ server: undefined,
209
+ serializedResolvedPropsWithCustomSchema: resolvedProps,
210
+ offthreadVideoCacheSizeInBytes: params.offthreadVideoCacheSizeInBytes,
211
+ colorSpace: params.colorSpace,
212
+ binariesDirectory: null,
213
+ separateAudioTo: audioOutputLocation,
214
+ forSeamlessAacConcatenation: seamlessAudio,
215
+ compositionStart: params.compositionStart,
216
+ onBrowserDownload: () => {
217
+ throw new Error('Should not download a browser in Lambda');
218
+ },
219
+ onArtifact,
220
+ metadata: params.metadata,
221
+ hardwareAcceleration: 'disable',
222
+ })
223
+ .then(({ slowestFrames }) => {
224
+ renderer_1.RenderInternals.Log.verbose({ indent: false, logLevel: params.logLevel }, `Slowest frames:`);
225
+ slowestFrames.forEach(({ frame, time }) => {
226
+ renderer_1.RenderInternals.Log.verbose({ indent: false, logLevel: params.logLevel }, ` Frame ${frame} (${time.toFixed(3)}ms)`);
227
+ });
228
+ resolve();
229
+ })
230
+ .catch((err) => reject(err));
231
+ });
232
+ const streamTimer = insideFunctionSpecifics.timer('Streaming chunk to the main function', params.logLevel);
233
+ if (audioOutputLocation) {
234
+ const audioChunkTimer = insideFunctionSpecifics.timer('Sending audio chunk', params.logLevel);
235
+ await onStream({
236
+ type: 'audio-chunk-rendered',
237
+ payload: node_fs_1.default.readFileSync(audioOutputLocation),
238
+ });
239
+ audioChunkTimer.end();
240
+ }
241
+ if (videoOutputLocation) {
242
+ const videoChunkTimer = insideFunctionSpecifics.timer('Sending main chunk', params.logLevel);
243
+ await onStream({
244
+ type: pure_1.NoReactAPIs.isAudioCodec(params.codec)
245
+ ? 'audio-chunk-rendered'
246
+ : 'video-chunk-rendered',
247
+ payload: node_fs_1.default.readFileSync(videoOutputLocation),
248
+ });
249
+ videoChunkTimer.end();
250
+ }
251
+ const endRendered = Date.now();
252
+ await onStream({
253
+ type: 'chunk-complete',
254
+ payload: {
255
+ rendered: endRendered,
256
+ start,
257
+ },
258
+ });
259
+ streamTimer.end();
260
+ renderer_1.RenderInternals.Log.verbose({ indent: false, logLevel: params.logLevel }, 'Cleaning up and writing timings');
261
+ await Promise.all([
262
+ node_fs_1.default.promises.rm(videoOutputLocation, { recursive: true }),
263
+ audioOutputLocation
264
+ ? node_fs_1.default.promises.rm(audioOutputLocation, { recursive: true })
265
+ : null,
266
+ node_fs_1.default.promises.rm(outputPath, { recursive: true }),
267
+ ].filter(truthy_1.truthy));
268
+ renderer_1.RenderInternals.Log.verbose({ indent: false, logLevel: params.logLevel }, 'Done!');
269
+ return {};
270
+ };
271
+ const ENABLE_SLOW_LEAK_DETECTION = false;
272
+ const rendererHandler = async ({ onStream, options, params, providerSpecifics, requestContext, insideFunctionSpecifics, }) => {
273
+ if (params.type !== constants_1.ServerlessRoutines.renderer) {
274
+ throw new Error('Params must be renderer');
275
+ }
276
+ const logs = [];
277
+ const leakDetection = (0, why_is_node_running_1.enableNodeIntrospection)(ENABLE_SLOW_LEAK_DETECTION);
278
+ let shouldKeepBrowserOpen = true;
279
+ try {
280
+ await renderHandler({
281
+ params,
282
+ options,
283
+ logs,
284
+ onStream,
285
+ providerSpecifics,
286
+ insideFunctionSpecifics,
287
+ });
288
+ return {
289
+ type: 'success',
290
+ };
291
+ }
292
+ catch (err) {
293
+ if (process.env.NODE_ENV === 'test') {
294
+ // eslint-disable-next-line no-console
295
+ console.log({ err });
296
+ throw err;
297
+ }
298
+ // If this error is encountered, we can just retry as it
299
+ // is a very rare error to occur
300
+ const isRetryableError = providerSpecifics.isFlakyError(err);
301
+ if (isRetryableError) {
302
+ shouldKeepBrowserOpen = false;
303
+ }
304
+ const shouldNotRetry = err.name === 'CancelledError';
305
+ const shouldRetry = isRetryableError && params.retriesLeft > 0 && !shouldNotRetry;
306
+ renderer_1.RenderInternals.Log.error({ indent: false, logLevel: params.logLevel }, `Error occurred (will retry = ${String(shouldRetry)})`);
307
+ renderer_1.RenderInternals.Log.error({ indent: false, logLevel: params.logLevel }, err.stack);
308
+ onStream({
309
+ type: 'error-occurred',
310
+ payload: {
311
+ error: err.stack,
312
+ shouldRetry,
313
+ errorInfo: {
314
+ name: err.name,
315
+ message: err.message,
316
+ stack: err.stack,
317
+ chunk: params.chunk,
318
+ frame: null,
319
+ type: 'renderer',
320
+ isFatal: !shouldRetry,
321
+ tmpDir: (0, write_error_to_storage_1.getTmpDirStateIfENoSp)(err.stack, providerSpecifics),
322
+ attempt: params.attempt,
323
+ totalAttempts: params.retriesLeft + params.attempt,
324
+ willRetry: shouldRetry,
325
+ },
326
+ },
327
+ });
328
+ throw err;
329
+ }
330
+ finally {
331
+ if (shouldKeepBrowserOpen) {
332
+ insideFunctionSpecifics.forgetBrowserEventLoop(params.logLevel);
333
+ }
334
+ else {
335
+ renderer_1.RenderInternals.Log.info({ indent: false, logLevel: params.logLevel }, 'Function did not succeed with flaky error, not keeping browser open.');
336
+ renderer_1.RenderInternals.Log.info({ indent: false, logLevel: params.logLevel }, 'Quitting Function forcefully now to force not keeping the Function warm.');
337
+ process.exit(0);
338
+ }
339
+ if (ENABLE_SLOW_LEAK_DETECTION) {
340
+ (0, leak_detection_1.startLeakDetection)(leakDetection, requestContext.awsRequestId);
341
+ }
342
+ }
343
+ };
344
+ exports.rendererHandler = rendererHandler;
@@ -0,0 +1,19 @@
1
+ import type { ServerlessPayload } from '../constants';
2
+ import type { InsideFunctionSpecifics, ProviderSpecifics } from '../provider-implementation';
3
+ import type { CloudProvider } from '../types';
4
+ type Options = {
5
+ expectedBucketOwner: string;
6
+ timeoutInMilliseconds: number;
7
+ renderId: string;
8
+ };
9
+ export declare const startHandler: <Provider extends CloudProvider>({ params, options, providerSpecifics, insideFunctionSpecifics, }: {
10
+ params: ServerlessPayload<Provider>;
11
+ options: Options;
12
+ providerSpecifics: ProviderSpecifics<Provider>;
13
+ insideFunctionSpecifics: InsideFunctionSpecifics;
14
+ }) => Promise<{
15
+ type: "success";
16
+ bucketName: string;
17
+ renderId: string;
18
+ }>;
19
+ export {};
@@ -0,0 +1,104 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.startHandler = void 0;
4
+ const constants_1 = require("../constants");
5
+ const get_or_create_bucket_1 = require("../get-or-create-bucket");
6
+ const overall_render_progress_1 = require("../overall-render-progress");
7
+ const check_version_mismatch_1 = require("./check-version-mismatch");
8
+ const startHandler = async ({ params, options, providerSpecifics, insideFunctionSpecifics, }) => {
9
+ var _a, _b, _c, _d;
10
+ if (params.type !== constants_1.ServerlessRoutines.start) {
11
+ throw new TypeError('Expected type start');
12
+ }
13
+ (0, check_version_mismatch_1.checkVersionMismatch)({
14
+ apiName: 'renderMediaOnLambda()',
15
+ insideFunctionSpecifics,
16
+ params,
17
+ });
18
+ const region = providerSpecifics.getCurrentRegionInFunction();
19
+ const bucketName = (_a = params.bucketName) !== null && _a !== void 0 ? _a : (await (0, get_or_create_bucket_1.internalGetOrCreateBucket)({
20
+ region: providerSpecifics.getCurrentRegionInFunction(),
21
+ enableFolderExpiry: null,
22
+ customCredentials: null,
23
+ providerSpecifics,
24
+ forcePathStyle: params.forcePathStyle,
25
+ skipPutAcl: false,
26
+ })).bucketName;
27
+ const realServeUrl = providerSpecifics.convertToServeUrl({
28
+ urlOrId: params.serveUrl,
29
+ region,
30
+ bucketName,
31
+ });
32
+ providerSpecifics.validateDeleteAfter(params.deleteAfter);
33
+ const initialFile = providerSpecifics.writeFile({
34
+ bucketName,
35
+ downloadBehavior: null,
36
+ region,
37
+ body: JSON.stringify((0, overall_render_progress_1.makeInitialOverallRenderProgress)(options.timeoutInMilliseconds + Date.now())),
38
+ expectedBucketOwner: options.expectedBucketOwner,
39
+ key: (0, constants_1.overallProgressKey)(options.renderId),
40
+ privacy: 'private',
41
+ customCredentials: null,
42
+ forcePathStyle: params.forcePathStyle,
43
+ });
44
+ const payload = {
45
+ type: constants_1.ServerlessRoutines.launch,
46
+ framesPerFunction: params.framesPerLambda,
47
+ composition: params.composition,
48
+ serveUrl: realServeUrl,
49
+ inputProps: params.inputProps,
50
+ bucketName,
51
+ renderId: options.renderId,
52
+ codec: params.codec,
53
+ imageFormat: params.imageFormat,
54
+ crf: (_b = params.crf) !== null && _b !== void 0 ? _b : null,
55
+ envVariables: params.envVariables,
56
+ pixelFormat: (_c = params.pixelFormat) !== null && _c !== void 0 ? _c : null,
57
+ proResProfile: (_d = params.proResProfile) !== null && _d !== void 0 ? _d : null,
58
+ x264Preset: params.x264Preset,
59
+ jpegQuality: params.jpegQuality,
60
+ maxRetries: params.maxRetries,
61
+ privacy: params.privacy,
62
+ logLevel: params.logLevel,
63
+ frameRange: params.frameRange,
64
+ outName: params.outName,
65
+ timeoutInMilliseconds: params.timeoutInMilliseconds,
66
+ chromiumOptions: params.chromiumOptions,
67
+ scale: params.scale,
68
+ numberOfGifLoops: params.numberOfGifLoops,
69
+ everyNthFrame: params.everyNthFrame,
70
+ concurrencyPerFunction: params.concurrencyPerLambda,
71
+ downloadBehavior: params.downloadBehavior,
72
+ muted: params.muted,
73
+ overwrite: params.overwrite,
74
+ webhook: params.webhook,
75
+ audioBitrate: params.audioBitrate,
76
+ videoBitrate: params.videoBitrate,
77
+ encodingBufferSize: params.encodingBufferSize,
78
+ encodingMaxRate: params.encodingMaxRate,
79
+ forceHeight: params.forceHeight,
80
+ forceWidth: params.forceWidth,
81
+ rendererFunctionName: params.rendererFunctionName,
82
+ audioCodec: params.audioCodec,
83
+ offthreadVideoCacheSizeInBytes: params.offthreadVideoCacheSizeInBytes,
84
+ deleteAfter: params.deleteAfter,
85
+ colorSpace: params.colorSpace,
86
+ preferLossless: params.preferLossless,
87
+ forcePathStyle: params.forcePathStyle,
88
+ metadata: params.metadata,
89
+ };
90
+ await providerSpecifics.callFunctionAsync({
91
+ functionName: insideFunctionSpecifics.getCurrentFunctionName(),
92
+ type: constants_1.ServerlessRoutines.launch,
93
+ payload,
94
+ region,
95
+ timeoutInTest: options.timeoutInMilliseconds,
96
+ });
97
+ await initialFile;
98
+ return {
99
+ type: 'success',
100
+ bucketName,
101
+ renderId: options.renderId,
102
+ };
103
+ };
104
+ exports.startHandler = startHandler;
@@ -0,0 +1,21 @@
1
+ import type { ServerlessPayload } from '../constants';
2
+ import type { InsideFunctionSpecifics, ProviderSpecifics } from '../provider-implementation';
3
+ import type { OnStream } from '../streaming/streaming';
4
+ import type { CloudProvider } from '../types';
5
+ type Options<Provider extends CloudProvider> = {
6
+ params: ServerlessPayload<Provider>;
7
+ renderId: string;
8
+ expectedBucketOwner: string;
9
+ onStream: OnStream<Provider>;
10
+ timeoutInMilliseconds: number;
11
+ providerSpecifics: ProviderSpecifics<Provider>;
12
+ insideFunctionSpecifics: InsideFunctionSpecifics;
13
+ };
14
+ export declare const stillHandler: <Provider extends CloudProvider>(options: Options<Provider>) => Promise<{
15
+ type: "success";
16
+ } | {
17
+ type: "error";
18
+ message: string;
19
+ stack: string;
20
+ }>;
21
+ export {};