@remotion/lambda 4.0.163 → 4.0.165
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/api/delete-render.js +7 -3
- package/dist/api/deploy-function.d.ts +0 -1
- package/dist/api/deploy-function.js +3 -3
- package/dist/api/deploy-site.d.ts +3 -3
- package/dist/api/download-media.js +6 -3
- package/dist/api/get-compositions-on-lambda.js +0 -2
- package/dist/api/get-render-progress.js +0 -2
- package/dist/api/make-lambda-payload.js +2 -1
- package/dist/api/render-media-on-lambda.js +0 -2
- package/dist/api/render-still-on-lambda.js +37 -25
- package/dist/cli/args.d.ts +1 -0
- package/dist/cli/commands/functions/ls.js +3 -1
- package/dist/cli/commands/render/progress.d.ts +3 -28
- package/dist/cli/commands/render/progress.js +89 -90
- package/dist/cli/commands/render/render.js +7 -40
- package/dist/cli/commands/sites/create.js +2 -2
- package/dist/functions/chunk-optimization/types.d.ts +0 -3
- package/dist/functions/helpers/calculate-chunk-times.d.ts +3 -4
- package/dist/functions/helpers/calculate-chunk-times.js +4 -8
- package/dist/functions/helpers/calculate-price-from-bucket.d.ts +3 -5
- package/dist/functions/helpers/calculate-price-from-bucket.js +5 -18
- package/dist/functions/helpers/clean-tmpdir.d.ts +0 -2
- package/dist/functions/helpers/clean-tmpdir.js +1 -7
- package/dist/functions/helpers/concat-videos.d.ts +1 -13
- package/dist/functions/helpers/concat-videos.js +7 -131
- package/dist/functions/helpers/create-post-render-data.d.ts +6 -6
- package/dist/functions/helpers/create-post-render-data.js +17 -37
- package/dist/functions/helpers/find-output-file-in-bucket.d.ts +1 -3
- package/dist/functions/helpers/find-output-file-in-bucket.js +1 -4
- package/dist/functions/helpers/get-encoding-progress-step-size.d.ts +1 -1
- package/dist/functions/helpers/get-encoding-progress-step-size.js +0 -3
- package/dist/functions/helpers/get-lambdas-invoked-stats.d.ts +1 -6
- package/dist/functions/helpers/get-lambdas-invoked-stats.js +0 -13
- package/dist/functions/helpers/get-overall-progress-s3.d.ts +8 -0
- package/dist/functions/helpers/get-overall-progress-s3.js +25 -0
- package/dist/functions/helpers/get-overall-progress.d.ts +1 -2
- package/dist/functions/helpers/get-overall-progress.js +2 -4
- package/dist/functions/helpers/get-progress.js +78 -154
- package/dist/functions/helpers/get-retry-stats.d.ts +0 -5
- package/dist/functions/helpers/get-retry-stats.js +0 -18
- package/dist/functions/helpers/inspect-errors.d.ts +4 -10
- package/dist/functions/helpers/inspect-errors.js +5 -27
- package/dist/functions/helpers/io.d.ts +0 -1
- package/dist/functions/helpers/io.js +2 -3
- package/dist/functions/helpers/lifecycle.d.ts +0 -4
- package/dist/functions/helpers/lifecycle.js +2 -3
- package/dist/functions/helpers/make-timeout-error.d.ts +0 -2
- package/dist/functions/helpers/merge-chunks.d.ts +5 -7
- package/dist/functions/helpers/merge-chunks.js +16 -149
- package/dist/functions/helpers/min-max.d.ts +1 -1
- package/dist/functions/helpers/min-max.js +1 -1
- package/dist/functions/helpers/overall-render-progress.d.ts +49 -0
- package/dist/functions/helpers/overall-render-progress.js +164 -0
- package/dist/functions/helpers/stream-renderer.d.ts +11 -0
- package/dist/functions/helpers/stream-renderer.js +127 -0
- package/dist/functions/helpers/streamify-response.d.ts +0 -3
- package/dist/functions/helpers/streamify-response.js +2 -14
- package/dist/functions/helpers/streaming-payloads.d.ts +3 -3
- package/dist/functions/helpers/write-lambda-error.d.ts +3 -6
- package/dist/functions/helpers/write-lambda-error.js +1 -21
- package/dist/functions/index.d.ts +5 -0
- package/dist/functions/index.js +70 -51
- package/dist/functions/launch.js +103 -200
- package/dist/functions/renderer.d.ts +2 -2
- package/dist/functions/renderer.js +70 -123
- package/dist/functions/start.d.ts +1 -0
- package/dist/functions/start.js +3 -2
- package/dist/functions/still.d.ts +7 -2
- package/dist/functions/still.js +17 -34
- package/dist/functions/streaming/stream-writer.d.ts +6 -0
- package/dist/functions/streaming/stream-writer.js +35 -0
- package/dist/functions/streaming/streaming.d.ts +92 -0
- package/dist/functions/streaming/streaming.js +58 -0
- package/dist/internals.d.ts +7 -6
- package/dist/shared/aws-clients.js +8 -0
- package/dist/shared/call-lambda.d.ts +5 -4
- package/dist/shared/call-lambda.js +53 -44
- package/dist/shared/constants.d.ts +15 -49
- package/dist/shared/constants.js +3 -32
- package/dist/shared/content-disposition-header.d.ts +0 -3
- package/dist/shared/get-function-version.js +0 -2
- package/dist/shared/is-flaky-error.js +4 -0
- package/dist/shared/parse-lambda-timings-key.d.ts +0 -2
- package/dist/shared/parse-lambda-timings-key.js +0 -14
- package/dist/shared/return-values.d.ts +0 -7
- package/package.json +18 -18
- package/remotionlambda-arm64.zip +0 -0
|
@@ -3,13 +3,11 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
3
3
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
4
|
};
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.rendererHandler =
|
|
6
|
+
exports.rendererHandler = void 0;
|
|
7
7
|
const renderer_1 = require("@remotion/renderer");
|
|
8
8
|
const node_fs_1 = __importDefault(require("node:fs"));
|
|
9
9
|
const node_path_1 = __importDefault(require("node:path"));
|
|
10
10
|
const version_1 = require("remotion/version");
|
|
11
|
-
const call_lambda_1 = require("../shared/call-lambda");
|
|
12
|
-
const chunk_progress_1 = require("../shared/chunk-progress");
|
|
13
11
|
const compress_props_1 = require("../shared/compress-props");
|
|
14
12
|
const constants_1 = require("../shared/constants");
|
|
15
13
|
const is_flaky_error_1 = require("../shared/is-flaky-error");
|
|
@@ -19,11 +17,10 @@ const can_concat_seamlessly_1 = require("./helpers/can-concat-seamlessly");
|
|
|
19
17
|
const get_browser_instance_1 = require("./helpers/get-browser-instance");
|
|
20
18
|
const get_chromium_executable_path_1 = require("./helpers/get-chromium-executable-path");
|
|
21
19
|
const get_current_region_1 = require("./helpers/get-current-region");
|
|
22
|
-
const io_1 = require("./helpers/io");
|
|
23
20
|
const leak_detection_1 = require("./helpers/leak-detection");
|
|
24
21
|
const on_downloads_logger_1 = require("./helpers/on-downloads-logger");
|
|
25
22
|
const write_lambda_error_1 = require("./helpers/write-lambda-error");
|
|
26
|
-
const renderHandler = async (params, options, logs) => {
|
|
23
|
+
const renderHandler = async ({ params, options, logs, onStream, }) => {
|
|
27
24
|
if (params.type !== constants_1.LambdaRoutines.renderer) {
|
|
28
25
|
throw new Error('Params must be renderer');
|
|
29
26
|
}
|
|
@@ -98,6 +95,7 @@ const renderHandler = async (params, options, logs) => {
|
|
|
98
95
|
: null;
|
|
99
96
|
const resolvedProps = await resolvedPropsPromise;
|
|
100
97
|
const serializedInputPropsWithCustomSchema = await inputPropsPromise;
|
|
98
|
+
const allFrames = renderer_1.RenderInternals.getFramesToRender(params.frameRange, params.everyNthFrame);
|
|
101
99
|
await new Promise((resolve, reject) => {
|
|
102
100
|
var _a, _b, _c, _d;
|
|
103
101
|
renderer_1.RenderInternals.internalRenderMedia({
|
|
@@ -114,24 +112,21 @@ const renderHandler = async (params, options, logs) => {
|
|
|
114
112
|
serializedInputPropsWithCustomSchema,
|
|
115
113
|
frameRange: params.frameRange,
|
|
116
114
|
onProgress: ({ renderedFrames, encodedFrames, stitchStage }) => {
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
115
|
+
renderer_1.RenderInternals.Log.verbose({ indent: false, logLevel: params.logLevel }, `Rendered ${renderedFrames} frames, encoded ${encodedFrames} frames, stage = ${stitchStage}`);
|
|
116
|
+
const allFramesRendered = allFrames.length === renderedFrames;
|
|
117
|
+
const allFramesEncoded = allFrames.length === encodedFrames;
|
|
118
|
+
const frameReportPoint = (renderedFrames % params.progressEveryNthFrame === 0 ||
|
|
119
|
+
allFramesRendered) &&
|
|
120
|
+
!allFramesEncoded;
|
|
121
|
+
const encodedFramesReportPoint = (encodedFrames % params.progressEveryNthFrame === 0 ||
|
|
122
|
+
allFramesEncoded) &&
|
|
123
|
+
allFramesRendered;
|
|
124
|
+
if (frameReportPoint || encodedFramesReportPoint) {
|
|
125
|
+
onStream({
|
|
126
|
+
type: 'frames-rendered',
|
|
127
|
+
payload: { rendered: renderedFrames, encoded: encodedFrames },
|
|
129
128
|
});
|
|
130
129
|
}
|
|
131
|
-
else {
|
|
132
|
-
renderer_1.RenderInternals.Log.verbose({ indent: false, logLevel: params.logLevel }, `Rendered ${renderedFrames} frames, encoded ${encodedFrames} frames, stage = ${stitchStage}`);
|
|
133
|
-
}
|
|
134
|
-
const allFrames = renderer_1.RenderInternals.getFramesToRender(params.frameRange, params.everyNthFrame);
|
|
135
130
|
if (renderedFrames === allFrames.length) {
|
|
136
131
|
renderer_1.RenderInternals.Log.verbose({ indent: false, logLevel: params.logLevel }, 'Rendered all frames!');
|
|
137
132
|
}
|
|
@@ -139,14 +134,12 @@ const renderHandler = async (params, options, logs) => {
|
|
|
139
134
|
},
|
|
140
135
|
concurrency: params.concurrencyPerLambda,
|
|
141
136
|
onStart: () => {
|
|
142
|
-
(
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
renderId: params.renderId,
|
|
149
|
-
}).catch((err) => reject(err));
|
|
137
|
+
onStream({
|
|
138
|
+
type: 'lambda-invoked',
|
|
139
|
+
payload: {
|
|
140
|
+
attempt: params.attempt,
|
|
141
|
+
},
|
|
142
|
+
});
|
|
150
143
|
},
|
|
151
144
|
puppeteerInstance: browserInstance.instance,
|
|
152
145
|
serveUrl: params.serveUrl,
|
|
@@ -205,46 +198,31 @@ const renderHandler = async (params, options, logs) => {
|
|
|
205
198
|
})
|
|
206
199
|
.catch((err) => reject(err));
|
|
207
200
|
});
|
|
201
|
+
renderer_1.RenderInternals.Log.verbose({ indent: false, logLevel: params.logLevel }, 'Streaming chunks to main function');
|
|
202
|
+
if (audioOutputLocation) {
|
|
203
|
+
onStream({
|
|
204
|
+
type: 'audio-chunk-rendered',
|
|
205
|
+
payload: node_fs_1.default.readFileSync(audioOutputLocation),
|
|
206
|
+
});
|
|
207
|
+
}
|
|
208
|
+
if (videoOutputLocation) {
|
|
209
|
+
onStream({
|
|
210
|
+
type: renderer_1.RenderInternals.isAudioCodec(params.codec)
|
|
211
|
+
? 'audio-chunk-rendered'
|
|
212
|
+
: 'video-chunk-rendered',
|
|
213
|
+
payload: node_fs_1.default.readFileSync(videoOutputLocation),
|
|
214
|
+
});
|
|
215
|
+
}
|
|
208
216
|
const endRendered = Date.now();
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
217
|
+
onStream({
|
|
218
|
+
type: 'chunk-complete',
|
|
219
|
+
payload: {
|
|
220
|
+
rendered: endRendered,
|
|
221
|
+
start,
|
|
222
|
+
},
|
|
223
|
+
});
|
|
214
224
|
const writeStart = Date.now();
|
|
215
|
-
|
|
216
|
-
(0, io_1.lambdaWriteFile)({
|
|
217
|
-
bucketName: params.bucketName,
|
|
218
|
-
key: (0, constants_1.chunkKeyForIndex)({
|
|
219
|
-
renderId: params.renderId,
|
|
220
|
-
index: params.chunk,
|
|
221
|
-
type: renderer_1.RenderInternals.isAudioCodec(params.codec) ? 'audio' : 'video',
|
|
222
|
-
}),
|
|
223
|
-
body: node_fs_1.default.createReadStream(videoOutputLocation),
|
|
224
|
-
region: (0, get_current_region_1.getCurrentRegionInFunction)(),
|
|
225
|
-
privacy: params.privacy,
|
|
226
|
-
expectedBucketOwner: options.expectedBucketOwner,
|
|
227
|
-
downloadBehavior: null,
|
|
228
|
-
customCredentials: null,
|
|
229
|
-
}),
|
|
230
|
-
audioOutputLocation
|
|
231
|
-
? (0, io_1.lambdaWriteFile)({
|
|
232
|
-
bucketName: params.bucketName,
|
|
233
|
-
key: (0, constants_1.chunkKeyForIndex)({
|
|
234
|
-
renderId: params.renderId,
|
|
235
|
-
index: params.chunk,
|
|
236
|
-
type: 'audio',
|
|
237
|
-
}),
|
|
238
|
-
body: node_fs_1.default.createReadStream(audioOutputLocation),
|
|
239
|
-
region: (0, get_current_region_1.getCurrentRegionInFunction)(),
|
|
240
|
-
privacy: params.privacy,
|
|
241
|
-
expectedBucketOwner: options.expectedBucketOwner,
|
|
242
|
-
downloadBehavior: null,
|
|
243
|
-
customCredentials: null,
|
|
244
|
-
})
|
|
245
|
-
: null,
|
|
246
|
-
]);
|
|
247
|
-
renderer_1.RenderInternals.Log.verbose({ indent: false, logLevel: params.logLevel }, `Wrote chunk to S3 (${Date.now() - writeStart}ms)`);
|
|
225
|
+
renderer_1.RenderInternals.Log.verbose({ indent: false, logLevel: params.logLevel }, `Streamed chunk to main function (${Date.now() - writeStart}ms)`);
|
|
248
226
|
renderer_1.RenderInternals.Log.verbose({ indent: false, logLevel: params.logLevel }, 'Cleaning up and writing timings');
|
|
249
227
|
await Promise.all([
|
|
250
228
|
node_fs_1.default.promises.rm(videoOutputLocation, { recursive: true }),
|
|
@@ -252,34 +230,19 @@ const renderHandler = async (params, options, logs) => {
|
|
|
252
230
|
? node_fs_1.default.promises.rm(audioOutputLocation, { recursive: true })
|
|
253
231
|
: null,
|
|
254
232
|
node_fs_1.default.promises.rm(outputPath, { recursive: true }),
|
|
255
|
-
(0, io_1.lambdaWriteFile)({
|
|
256
|
-
bucketName: params.bucketName,
|
|
257
|
-
body: JSON.stringify(condensedTimingData, null, 2),
|
|
258
|
-
key: (0, constants_1.lambdaTimingsKey)({
|
|
259
|
-
renderId: params.renderId,
|
|
260
|
-
chunk: params.chunk,
|
|
261
|
-
rendered: endRendered,
|
|
262
|
-
start,
|
|
263
|
-
}),
|
|
264
|
-
region: (0, get_current_region_1.getCurrentRegionInFunction)(),
|
|
265
|
-
privacy: 'private',
|
|
266
|
-
expectedBucketOwner: options.expectedBucketOwner,
|
|
267
|
-
downloadBehavior: null,
|
|
268
|
-
customCredentials: null,
|
|
269
|
-
}),
|
|
270
233
|
].filter(truthy_1.truthy));
|
|
271
234
|
renderer_1.RenderInternals.Log.verbose({ indent: false, logLevel: params.logLevel }, 'Done!');
|
|
272
235
|
return {};
|
|
273
236
|
};
|
|
274
|
-
|
|
275
|
-
const rendererHandler = async (params, options, requestContext) => {
|
|
237
|
+
const ENABLE_SLOW_LEAK_DETECTION = false;
|
|
238
|
+
const rendererHandler = async (params, options, onStream, requestContext) => {
|
|
276
239
|
if (params.type !== constants_1.LambdaRoutines.renderer) {
|
|
277
240
|
throw new Error('Params must be renderer');
|
|
278
241
|
}
|
|
279
242
|
const logs = [];
|
|
280
|
-
const leakDetection = (0, why_is_node_running_1.enableNodeIntrospection)(
|
|
243
|
+
const leakDetection = (0, why_is_node_running_1.enableNodeIntrospection)(ENABLE_SLOW_LEAK_DETECTION);
|
|
281
244
|
try {
|
|
282
|
-
await renderHandler(params, options, logs);
|
|
245
|
+
await renderHandler({ params, options, logs, onStream });
|
|
283
246
|
return {
|
|
284
247
|
type: 'success',
|
|
285
248
|
};
|
|
@@ -293,45 +256,29 @@ const rendererHandler = async (params, options, requestContext) => {
|
|
|
293
256
|
// is a very rare error to occur
|
|
294
257
|
const isRetryableError = (0, is_flaky_error_1.isFlakyError)(err);
|
|
295
258
|
const shouldNotRetry = err.name === 'CancelledError';
|
|
296
|
-
const
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
259
|
+
const shouldRetry = isRetryableError && params.retriesLeft > 0 && !shouldNotRetry;
|
|
260
|
+
renderer_1.RenderInternals.Log.error({ indent: false, logLevel: params.logLevel }, `Error occurred (will retry = ${String(shouldRetry)})`);
|
|
261
|
+
renderer_1.RenderInternals.Log.error({ indent: false, logLevel: params.logLevel }, err);
|
|
262
|
+
onStream({
|
|
263
|
+
type: 'error-occurred',
|
|
264
|
+
payload: {
|
|
265
|
+
error: err.stack,
|
|
266
|
+
shouldRetry,
|
|
267
|
+
errorInfo: {
|
|
268
|
+
name: err.name,
|
|
269
|
+
message: err.message,
|
|
270
|
+
stack: err.stack,
|
|
271
|
+
chunk: params.chunk,
|
|
272
|
+
frame: null,
|
|
273
|
+
type: 'renderer',
|
|
274
|
+
isFatal: !shouldRetry,
|
|
275
|
+
tmpDir: (0, write_lambda_error_1.getTmpDirStateIfENoSp)(err.stack),
|
|
276
|
+
attempt: params.attempt,
|
|
277
|
+
totalAttempts: params.retriesLeft + params.attempt,
|
|
278
|
+
willRetry: shouldRetry,
|
|
279
|
+
},
|
|
314
280
|
},
|
|
315
|
-
renderId: params.renderId,
|
|
316
|
-
expectedBucketOwner: options.expectedBucketOwner,
|
|
317
281
|
});
|
|
318
|
-
if (willRetry) {
|
|
319
|
-
const retryPayload = {
|
|
320
|
-
...params,
|
|
321
|
-
retriesLeft: params.retriesLeft - 1,
|
|
322
|
-
attempt: params.attempt + 1,
|
|
323
|
-
};
|
|
324
|
-
const res = await (0, call_lambda_1.callLambda)({
|
|
325
|
-
functionName: process.env.AWS_LAMBDA_FUNCTION_NAME,
|
|
326
|
-
payload: retryPayload,
|
|
327
|
-
type: constants_1.LambdaRoutines.renderer,
|
|
328
|
-
region: (0, get_current_region_1.getCurrentRegionInFunction)(),
|
|
329
|
-
receivedStreamingPayload: () => undefined,
|
|
330
|
-
timeoutInTest: 120000,
|
|
331
|
-
retriesRemaining: 0,
|
|
332
|
-
});
|
|
333
|
-
return res;
|
|
334
|
-
}
|
|
335
282
|
throw err;
|
|
336
283
|
}
|
|
337
284
|
finally {
|
package/dist/functions/start.js
CHANGED
|
@@ -10,6 +10,7 @@ const convert_to_serve_url_1 = require("../shared/convert-to-serve-url");
|
|
|
10
10
|
const get_current_region_1 = require("./helpers/get-current-region");
|
|
11
11
|
const io_1 = require("./helpers/io");
|
|
12
12
|
const lifecycle_1 = require("./helpers/lifecycle");
|
|
13
|
+
const overall_render_progress_1 = require("./helpers/overall-render-progress");
|
|
13
14
|
const startHandler = async (params, options) => {
|
|
14
15
|
var _a;
|
|
15
16
|
if (params.type !== constants_1.LambdaRoutines.start) {
|
|
@@ -38,9 +39,9 @@ const startHandler = async (params, options) => {
|
|
|
38
39
|
bucketName,
|
|
39
40
|
downloadBehavior: null,
|
|
40
41
|
region,
|
|
41
|
-
body:
|
|
42
|
+
body: JSON.stringify((0, overall_render_progress_1.makeInitialOverallRenderProgress)(options.timeoutInMilliseconds + Date.now())),
|
|
42
43
|
expectedBucketOwner: options.expectedBucketOwner,
|
|
43
|
-
key: (0, constants_1.
|
|
44
|
+
key: (0, constants_1.overallProgressKey)(renderId),
|
|
44
45
|
privacy: 'private',
|
|
45
46
|
customCredentials: null,
|
|
46
47
|
});
|
|
@@ -1,10 +1,13 @@
|
|
|
1
1
|
import type { CostsInfo, LambdaPayload } from '../shared/constants';
|
|
2
|
+
import type { OnStream } from './streaming/streaming';
|
|
2
3
|
type Options = {
|
|
3
4
|
params: LambdaPayload;
|
|
4
5
|
renderId: string;
|
|
5
6
|
expectedBucketOwner: string;
|
|
7
|
+
onStream: OnStream;
|
|
8
|
+
timeoutInMilliseconds: number;
|
|
6
9
|
};
|
|
7
|
-
type RenderStillLambdaResponsePayload = {
|
|
10
|
+
export type RenderStillLambdaResponsePayload = {
|
|
8
11
|
type: 'success';
|
|
9
12
|
output: string;
|
|
10
13
|
outKey: string;
|
|
@@ -14,5 +17,7 @@ type RenderStillLambdaResponsePayload = {
|
|
|
14
17
|
estimatedPrice: CostsInfo;
|
|
15
18
|
renderId: string;
|
|
16
19
|
};
|
|
17
|
-
export declare const stillHandler: (options: Options) => Promise<
|
|
20
|
+
export declare const stillHandler: (options: Options) => Promise<{
|
|
21
|
+
type: 'success';
|
|
22
|
+
}>;
|
|
18
23
|
export {};
|
package/dist/functions/still.js
CHANGED
|
@@ -28,9 +28,9 @@ const get_current_region_1 = require("./helpers/get-current-region");
|
|
|
28
28
|
const get_output_url_from_metadata_1 = require("./helpers/get-output-url-from-metadata");
|
|
29
29
|
const io_1 = require("./helpers/io");
|
|
30
30
|
const on_downloads_logger_1 = require("./helpers/on-downloads-logger");
|
|
31
|
+
const overall_render_progress_1 = require("./helpers/overall-render-progress");
|
|
31
32
|
const validate_composition_1 = require("./helpers/validate-composition");
|
|
32
|
-
const
|
|
33
|
-
const innerStillHandler = async ({ params: lambdaParams, expectedBucketOwner, renderId, }) => {
|
|
33
|
+
const innerStillHandler = async ({ params: lambdaParams, expectedBucketOwner, renderId, onStream, timeoutInMilliseconds, }) => {
|
|
34
34
|
var _a, _b, _c, _d, _e;
|
|
35
35
|
if (lambdaParams.type !== constants_1.LambdaRoutines.still) {
|
|
36
36
|
throw new TypeError('Expected still type');
|
|
@@ -127,10 +127,12 @@ const innerStillHandler = async ({ params: lambdaParams, expectedBucketOwner, re
|
|
|
127
127
|
downloadBehavior: lambdaParams.downloadBehavior,
|
|
128
128
|
audioBitrate: null,
|
|
129
129
|
};
|
|
130
|
+
const still = (0, overall_render_progress_1.makeInitialOverallRenderProgress)(timeoutInMilliseconds);
|
|
131
|
+
still.renderMetadata = renderMetadata;
|
|
130
132
|
await (0, io_1.lambdaWriteFile)({
|
|
131
133
|
bucketName,
|
|
132
|
-
key: (0, constants_1.
|
|
133
|
-
body: JSON.stringify(
|
|
134
|
+
key: (0, constants_1.overallProgressKey)(renderId),
|
|
135
|
+
body: JSON.stringify(still),
|
|
134
136
|
region: (0, get_current_region_1.getCurrentRegionInFunction)(),
|
|
135
137
|
privacy: 'private',
|
|
136
138
|
expectedBucketOwner,
|
|
@@ -205,7 +207,7 @@ const innerStillHandler = async ({ params: lambdaParams, expectedBucketOwner, re
|
|
|
205
207
|
diskSizeInMb: constants_1.MAX_EPHEMERAL_STORAGE_IN_MB,
|
|
206
208
|
});
|
|
207
209
|
const { key: outKey, url } = (0, get_output_url_from_metadata_1.getOutputUrlFromMetadata)(renderMetadata, bucketName, customCredentials);
|
|
208
|
-
|
|
210
|
+
const payload = {
|
|
209
211
|
type: 'success',
|
|
210
212
|
output: url,
|
|
211
213
|
size,
|
|
@@ -215,15 +217,19 @@ const innerStillHandler = async ({ params: lambdaParams, expectedBucketOwner, re
|
|
|
215
217
|
renderId,
|
|
216
218
|
outKey,
|
|
217
219
|
};
|
|
220
|
+
onStream({
|
|
221
|
+
type: 'still-rendered',
|
|
222
|
+
payload,
|
|
223
|
+
});
|
|
218
224
|
};
|
|
219
225
|
const stillHandler = async (options) => {
|
|
220
|
-
var _a;
|
|
221
226
|
const { params } = options;
|
|
222
227
|
if (params.type !== constants_1.LambdaRoutines.still) {
|
|
223
228
|
throw new Error('Params must be renderer');
|
|
224
229
|
}
|
|
225
230
|
try {
|
|
226
|
-
|
|
231
|
+
await innerStillHandler(options);
|
|
232
|
+
return { type: 'success' };
|
|
227
233
|
}
|
|
228
234
|
catch (err) {
|
|
229
235
|
// If this error is encountered, we can just retry as it
|
|
@@ -233,6 +239,10 @@ const stillHandler = async (options) => {
|
|
|
233
239
|
if (!willRetry) {
|
|
234
240
|
throw err;
|
|
235
241
|
}
|
|
242
|
+
renderer_1.RenderInternals.Log.error({
|
|
243
|
+
indent: false,
|
|
244
|
+
logLevel: params.logLevel,
|
|
245
|
+
}, 'Got error:', err.stack, 'Will retry.');
|
|
236
246
|
const retryPayload = {
|
|
237
247
|
...params,
|
|
238
248
|
maxRetries: params.maxRetries - 1,
|
|
@@ -243,34 +253,7 @@ const stillHandler = async (options) => {
|
|
|
243
253
|
payload: retryPayload,
|
|
244
254
|
region: (0, get_current_region_1.getCurrentRegionInFunction)(),
|
|
245
255
|
type: constants_1.LambdaRoutines.still,
|
|
246
|
-
receivedStreamingPayload: () => undefined,
|
|
247
256
|
timeoutInTest: 120000,
|
|
248
|
-
retriesRemaining: 0,
|
|
249
|
-
});
|
|
250
|
-
const bucketName = (_a = params.bucketName) !== null && _a !== void 0 ? _a : (await (0, get_or_create_bucket_1.internalGetOrCreateBucket)({
|
|
251
|
-
region: (0, get_current_region_1.getCurrentRegionInFunction)(),
|
|
252
|
-
enableFolderExpiry: null,
|
|
253
|
-
customCredentials: null,
|
|
254
|
-
})).bucketName;
|
|
255
|
-
// `await` elided on purpose here; using `void` to mark it as intentional
|
|
256
|
-
// eslint-disable-next-line no-void
|
|
257
|
-
void (0, write_lambda_error_1.writeLambdaError)({
|
|
258
|
-
bucketName,
|
|
259
|
-
errorInfo: {
|
|
260
|
-
chunk: null,
|
|
261
|
-
frame: null,
|
|
262
|
-
isFatal: false,
|
|
263
|
-
name: err.name,
|
|
264
|
-
message: err.message,
|
|
265
|
-
stack: err.stack,
|
|
266
|
-
type: 'browser',
|
|
267
|
-
tmpDir: (0, write_lambda_error_1.getTmpDirStateIfENoSp)(err.stack),
|
|
268
|
-
attempt: params.attempt,
|
|
269
|
-
totalAttempts: params.attempt + params.maxRetries,
|
|
270
|
-
willRetry,
|
|
271
|
-
},
|
|
272
|
-
expectedBucketOwner: options.expectedBucketOwner,
|
|
273
|
-
renderId: options.renderId,
|
|
274
257
|
});
|
|
275
258
|
return res;
|
|
276
259
|
}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { ResponseStream } from '../helpers/streamify-response';
|
|
2
|
+
export type ResponseStreamWriter = {
|
|
3
|
+
write: (message: Uint8Array) => Promise<void>;
|
|
4
|
+
end: () => Promise<void>;
|
|
5
|
+
};
|
|
6
|
+
export declare const streamWriter: (responseStream: ResponseStream) => ResponseStreamWriter;
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.streamWriter = void 0;
|
|
4
|
+
// Ensures that the previous write is finished before the next one is started
|
|
5
|
+
// Genius solution by ChatGPT
|
|
6
|
+
const streamWriter = (responseStream) => {
|
|
7
|
+
let promiseChain = Promise.resolve();
|
|
8
|
+
const write = (message) => {
|
|
9
|
+
promiseChain = promiseChain.then(() => {
|
|
10
|
+
return new Promise((resolve, reject) => {
|
|
11
|
+
responseStream.write(message, (err) => {
|
|
12
|
+
if (err) {
|
|
13
|
+
reject(err);
|
|
14
|
+
}
|
|
15
|
+
else {
|
|
16
|
+
resolve();
|
|
17
|
+
}
|
|
18
|
+
});
|
|
19
|
+
});
|
|
20
|
+
});
|
|
21
|
+
return promiseChain;
|
|
22
|
+
};
|
|
23
|
+
const end = () => {
|
|
24
|
+
promiseChain = promiseChain.then(() => {
|
|
25
|
+
return new Promise((resolve) => {
|
|
26
|
+
responseStream.end(() => {
|
|
27
|
+
resolve();
|
|
28
|
+
});
|
|
29
|
+
});
|
|
30
|
+
});
|
|
31
|
+
return promiseChain;
|
|
32
|
+
};
|
|
33
|
+
return { write, end };
|
|
34
|
+
};
|
|
35
|
+
exports.streamWriter = streamWriter;
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
/// <reference types="node" />
|
|
2
|
+
import type { LambdaErrorInfo } from '../helpers/write-lambda-error';
|
|
3
|
+
import type { RenderStillLambdaResponsePayload } from '../still';
|
|
4
|
+
declare const framesRendered: "frames-rendered";
|
|
5
|
+
declare const errorOccurred: "error-occurred";
|
|
6
|
+
declare const renderIdDetermined: "render-id-determined";
|
|
7
|
+
declare const videoChunkRendered: "video-chunk-rendered";
|
|
8
|
+
declare const audioChunkRendered: "audio-chunk-rendered";
|
|
9
|
+
declare const chunkComplete: "chunk-complete";
|
|
10
|
+
declare const stillRendered: "still-rendered";
|
|
11
|
+
declare const lambdaInvoked: "lambda-invoked";
|
|
12
|
+
declare const messageTypes: {
|
|
13
|
+
readonly '1': {
|
|
14
|
+
readonly type: "frames-rendered";
|
|
15
|
+
};
|
|
16
|
+
readonly '2': {
|
|
17
|
+
readonly type: "error-occurred";
|
|
18
|
+
};
|
|
19
|
+
readonly '3': {
|
|
20
|
+
readonly type: "render-id-determined";
|
|
21
|
+
};
|
|
22
|
+
readonly '4': {
|
|
23
|
+
readonly type: "video-chunk-rendered";
|
|
24
|
+
};
|
|
25
|
+
readonly '5': {
|
|
26
|
+
readonly type: "audio-chunk-rendered";
|
|
27
|
+
};
|
|
28
|
+
readonly '6': {
|
|
29
|
+
readonly type: "still-rendered";
|
|
30
|
+
};
|
|
31
|
+
readonly '7': {
|
|
32
|
+
readonly type: "chunk-complete";
|
|
33
|
+
};
|
|
34
|
+
readonly '8': {
|
|
35
|
+
readonly type: "lambda-invoked";
|
|
36
|
+
};
|
|
37
|
+
};
|
|
38
|
+
export type MessageTypeId = keyof typeof messageTypes;
|
|
39
|
+
type MessageType = (typeof messageTypes)[MessageTypeId]['type'];
|
|
40
|
+
export declare const formatMap: {
|
|
41
|
+
[key in MessageType]: 'json' | 'binary';
|
|
42
|
+
};
|
|
43
|
+
export type StreamingPayload = {
|
|
44
|
+
type: typeof framesRendered;
|
|
45
|
+
payload: {
|
|
46
|
+
rendered: number;
|
|
47
|
+
encoded: number;
|
|
48
|
+
};
|
|
49
|
+
} | {
|
|
50
|
+
type: typeof videoChunkRendered;
|
|
51
|
+
payload: Buffer;
|
|
52
|
+
} | {
|
|
53
|
+
type: typeof audioChunkRendered;
|
|
54
|
+
payload: Buffer;
|
|
55
|
+
} | {
|
|
56
|
+
type: typeof errorOccurred;
|
|
57
|
+
payload: {
|
|
58
|
+
error: string;
|
|
59
|
+
shouldRetry: boolean;
|
|
60
|
+
errorInfo: LambdaErrorInfo;
|
|
61
|
+
};
|
|
62
|
+
} | {
|
|
63
|
+
type: typeof renderIdDetermined;
|
|
64
|
+
payload: {
|
|
65
|
+
renderId: string;
|
|
66
|
+
};
|
|
67
|
+
} | {
|
|
68
|
+
type: typeof stillRendered;
|
|
69
|
+
payload: RenderStillLambdaResponsePayload;
|
|
70
|
+
} | {
|
|
71
|
+
type: typeof chunkComplete;
|
|
72
|
+
payload: {
|
|
73
|
+
start: number;
|
|
74
|
+
rendered: number;
|
|
75
|
+
};
|
|
76
|
+
} | {
|
|
77
|
+
type: typeof lambdaInvoked;
|
|
78
|
+
payload: {
|
|
79
|
+
attempt: number;
|
|
80
|
+
};
|
|
81
|
+
};
|
|
82
|
+
export declare const messageTypeIdToMessageType: (messageTypeId: MessageTypeId) => MessageType;
|
|
83
|
+
export type StreamingMessage = {
|
|
84
|
+
successType: 'error' | 'success';
|
|
85
|
+
message: StreamingPayload;
|
|
86
|
+
};
|
|
87
|
+
export type OnMessage = (options: StreamingMessage) => void;
|
|
88
|
+
export type OnStream = (payload: StreamingPayload) => void;
|
|
89
|
+
export declare const makeStreamPayload: ({ message }: {
|
|
90
|
+
message: StreamingPayload;
|
|
91
|
+
}) => Uint8Array;
|
|
92
|
+
export {};
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.makeStreamPayload = exports.messageTypeIdToMessageType = exports.formatMap = void 0;
|
|
4
|
+
const pure_1 = require("@remotion/renderer/pure");
|
|
5
|
+
const framesRendered = 'frames-rendered';
|
|
6
|
+
const errorOccurred = 'error-occurred';
|
|
7
|
+
const renderIdDetermined = 'render-id-determined';
|
|
8
|
+
const videoChunkRendered = 'video-chunk-rendered';
|
|
9
|
+
const audioChunkRendered = 'audio-chunk-rendered';
|
|
10
|
+
const chunkComplete = 'chunk-complete';
|
|
11
|
+
const stillRendered = 'still-rendered';
|
|
12
|
+
const lambdaInvoked = 'lambda-invoked';
|
|
13
|
+
const messageTypes = {
|
|
14
|
+
'1': { type: framesRendered },
|
|
15
|
+
'2': { type: errorOccurred },
|
|
16
|
+
'3': { type: renderIdDetermined },
|
|
17
|
+
'4': { type: videoChunkRendered },
|
|
18
|
+
'5': { type: audioChunkRendered },
|
|
19
|
+
'6': { type: stillRendered },
|
|
20
|
+
'7': { type: chunkComplete },
|
|
21
|
+
'8': { type: lambdaInvoked },
|
|
22
|
+
};
|
|
23
|
+
exports.formatMap = {
|
|
24
|
+
[framesRendered]: 'json',
|
|
25
|
+
[errorOccurred]: 'json',
|
|
26
|
+
[renderIdDetermined]: 'json',
|
|
27
|
+
[videoChunkRendered]: 'binary',
|
|
28
|
+
[audioChunkRendered]: 'binary',
|
|
29
|
+
[stillRendered]: 'json',
|
|
30
|
+
[chunkComplete]: 'json',
|
|
31
|
+
[lambdaInvoked]: 'json',
|
|
32
|
+
};
|
|
33
|
+
const messageTypeIdToMessageType = (messageTypeId) => {
|
|
34
|
+
const types = messageTypes[messageTypeId];
|
|
35
|
+
if (!types) {
|
|
36
|
+
throw new Error(`Unknown message type id ${messageTypeId}`);
|
|
37
|
+
}
|
|
38
|
+
return types.type;
|
|
39
|
+
};
|
|
40
|
+
exports.messageTypeIdToMessageType = messageTypeIdToMessageType;
|
|
41
|
+
const messageTypeToMessageId = (messageType) => {
|
|
42
|
+
const id = Object.keys(messageTypes).find((key) => messageTypes[key].type === messageType);
|
|
43
|
+
if (!id) {
|
|
44
|
+
throw new Error(`Unknown message type ${messageType}`);
|
|
45
|
+
}
|
|
46
|
+
return id;
|
|
47
|
+
};
|
|
48
|
+
const makeStreamPayload = ({ message }) => {
|
|
49
|
+
const body = exports.formatMap[message.type] === 'json'
|
|
50
|
+
? new TextEncoder().encode(JSON.stringify(message.payload))
|
|
51
|
+
: message.payload;
|
|
52
|
+
return pure_1.NoReactAPIs.makeStreamPayloadMessage({
|
|
53
|
+
body,
|
|
54
|
+
nonce: messageTypeToMessageId(message.type),
|
|
55
|
+
status: 0,
|
|
56
|
+
});
|
|
57
|
+
};
|
|
58
|
+
exports.makeStreamPayload = makeStreamPayload;
|
package/dist/internals.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
export declare const LambdaInternals: {
|
|
2
|
-
executeCommand: (args: string[], remotionRoot: string, logLevel: "
|
|
2
|
+
executeCommand: (args: string[], remotionRoot: string, logLevel: "error" | "verbose" | "info" | "warn") => Promise<void>;
|
|
3
3
|
makeLambdaRenderMediaPayload: ({ rendererFunctionName, frameRange, framesPerLambda, forceBucketName: bucketName, codec, composition, serveUrl, imageFormat, inputProps, region, crf, envVariables, pixelFormat, proResProfile, x264Preset, maxRetries, privacy, logLevel, outName, timeoutInMilliseconds, chromiumOptions, scale, everyNthFrame, numberOfGifLoops, audioBitrate, concurrencyPerLambda, audioCodec, forceHeight, forceWidth, webhook, videoBitrate, encodingMaxRate, encodingBufferSize, downloadBehavior, muted, overwrite, jpegQuality, offthreadVideoCacheSizeInBytes, deleteAfter, colorSpace, preferLossless, }: import("./api/make-lambda-payload").InnerRenderMediaOnLambdaInput) => Promise<import("./defaults").LambdaStartPayload>;
|
|
4
|
-
getRenderProgressPayload: ({ bucketName, renderId, s3OutputProvider, logLevel, }: import("
|
|
4
|
+
getRenderProgressPayload: ({ bucketName, renderId, s3OutputProvider, logLevel, }: import("./client").GetRenderProgressInput) => import("./defaults").LambdaStatusPayload;
|
|
5
5
|
makeLambdaRenderStillPayload: ({ serveUrl, inputProps, imageFormat, envVariables, quality, jpegQuality, region, maxRetries, composition, privacy, frame, logLevel, outName, timeoutInMilliseconds, chromiumOptions, scale, downloadBehavior, forceHeight, forceWidth, forceBucketName, offthreadVideoCacheSizeInBytes, deleteAfter, }: import("./api/render-still-on-lambda").RenderStillOnLambdaNonNullInput) => Promise<{
|
|
6
6
|
type: import("./defaults").LambdaRoutines.still;
|
|
7
7
|
serveUrl: string;
|
|
@@ -14,7 +14,7 @@ export declare const LambdaInternals: {
|
|
|
14
14
|
maxRetries: number;
|
|
15
15
|
frame: number;
|
|
16
16
|
privacy: import("./defaults").Privacy;
|
|
17
|
-
logLevel: "
|
|
17
|
+
logLevel: "error" | "verbose" | "info" | "warn";
|
|
18
18
|
outName: import("./defaults").OutNameInput | null;
|
|
19
19
|
timeoutInMilliseconds: number;
|
|
20
20
|
chromiumOptions: import("@remotion/renderer").ChromiumOptions;
|
|
@@ -26,6 +26,7 @@ export declare const LambdaInternals: {
|
|
|
26
26
|
bucketName: string | null;
|
|
27
27
|
offthreadVideoCacheSizeInBytes: number | null;
|
|
28
28
|
deleteAfter: "1-day" | "3-days" | "7-days" | "30-days" | null;
|
|
29
|
+
streamed: boolean;
|
|
29
30
|
}>;
|
|
30
31
|
internalDeploySite: (args_0: {
|
|
31
32
|
entryPoint: string;
|
|
@@ -56,11 +57,11 @@ export declare const LambdaInternals: {
|
|
|
56
57
|
getValue: ({ commandLine }: {
|
|
57
58
|
commandLine: Record<string, unknown>;
|
|
58
59
|
}) => {
|
|
59
|
-
value: "
|
|
60
|
+
value: "error" | "verbose" | "info" | "warn";
|
|
60
61
|
source: string;
|
|
61
62
|
};
|
|
62
|
-
setConfig: (newLogLevel: "
|
|
63
|
-
type: "
|
|
63
|
+
setConfig: (newLogLevel: "error" | "verbose" | "info" | "warn") => void;
|
|
64
|
+
type: "error" | "verbose" | "info" | "warn";
|
|
64
65
|
};
|
|
65
66
|
readonly throwIfSiteExists: {
|
|
66
67
|
cliFlag: string;
|