@remotion/serverless 4.0.188

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 (67) hide show
  1. package/.eslintrc +3 -0
  2. package/LICENSE.md +49 -0
  3. package/README.md +18 -0
  4. package/dist/await.d.ts +1 -0
  5. package/dist/await.js +2 -0
  6. package/dist/client.d.ts +14 -0
  7. package/dist/client.js +40 -0
  8. package/dist/compositions.d.ts +11 -0
  9. package/dist/compositions.js +79 -0
  10. package/dist/compress-props.d.ts +23 -0
  11. package/dist/compress-props.js +90 -0
  12. package/dist/constants.d.ts +266 -0
  13. package/dist/constants.js +58 -0
  14. package/dist/error-category.d.ts +3 -0
  15. package/dist/error-category.js +16 -0
  16. package/dist/expected-out-name.d.ts +5 -0
  17. package/dist/expected-out-name.js +52 -0
  18. package/dist/get-browser-instance.d.ts +16 -0
  19. package/dist/get-browser-instance.js +104 -0
  20. package/dist/get-custom-out-name.d.ts +7 -0
  21. package/dist/get-custom-out-name.js +32 -0
  22. package/dist/get-files-in-folder.d.ts +5 -0
  23. package/dist/get-files-in-folder.js +2 -0
  24. package/dist/get-or-create-bucket.d.ts +20 -0
  25. package/dist/get-or-create-bucket.js +37 -0
  26. package/dist/index.d.ts +15 -0
  27. package/dist/index.js +32 -0
  28. package/dist/info.d.ts +6 -0
  29. package/dist/info.js +16 -0
  30. package/dist/input-props-keys.d.ts +2 -0
  31. package/dist/input-props-keys.js +11 -0
  32. package/dist/make-bucket-name.d.ts +3 -0
  33. package/dist/make-bucket-name.js +8 -0
  34. package/dist/provider-implementation.d.ts +105 -0
  35. package/dist/provider-implementation.js +2 -0
  36. package/dist/random-hash.d.ts +3 -0
  37. package/dist/random-hash.js +14 -0
  38. package/dist/region.d.ts +3 -0
  39. package/dist/region.js +45 -0
  40. package/dist/render-metadata.d.ts +37 -0
  41. package/dist/render-metadata.js +2 -0
  42. package/dist/serialize-artifact.d.ts +9 -0
  43. package/dist/serialize-artifact.js +37 -0
  44. package/dist/still.d.ts +28 -0
  45. package/dist/still.js +2 -0
  46. package/dist/stream-to-string.d.ts +4 -0
  47. package/dist/stream-to-string.js +15 -0
  48. package/dist/streaming/response-stream.d.ts +20 -0
  49. package/dist/streaming/response-stream.js +64 -0
  50. package/dist/streaming/stream-writer.d.ts +6 -0
  51. package/dist/streaming/stream-writer.js +35 -0
  52. package/dist/streaming/streaming.d.ts +102 -0
  53. package/dist/streaming/streaming.js +61 -0
  54. package/dist/truthy.d.ts +3 -0
  55. package/dist/truthy.js +7 -0
  56. package/dist/validate-bucket-name.d.ts +3 -0
  57. package/dist/validate-bucket-name.js +17 -0
  58. package/dist/validate-composition.d.ts +25 -0
  59. package/dist/validate-composition.js +31 -0
  60. package/dist/validate-outname.d.ts +8 -0
  61. package/dist/validate-outname.js +37 -0
  62. package/dist/validate-webhook.d.ts +3 -0
  63. package/dist/validate-webhook.js +16 -0
  64. package/dist/write-lambda-error.d.ts +27 -0
  65. package/dist/write-lambda-error.js +19 -0
  66. package/package.json +41 -0
  67. package/tsconfig.tsbuildinfo +1 -0
package/dist/region.js ADDED
@@ -0,0 +1,45 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.AWS_REGIONS = exports.DEFAULT_AWS_REGIONS = void 0;
4
+ exports.DEFAULT_AWS_REGIONS = [
5
+ 'eu-central-1',
6
+ 'eu-west-1',
7
+ 'eu-west-2',
8
+ 'eu-west-3',
9
+ 'eu-north-1',
10
+ 'us-east-1', // N. Virginia
11
+ 'us-east-2', // Ohio;
12
+ 'us-west-1',
13
+ 'us-west-2', // Oregon
14
+ 'ap-south-1',
15
+ 'ap-southeast-1',
16
+ 'ap-southeast-2',
17
+ 'ap-northeast-1',
18
+ 'ap-northeast-2',
19
+ 'ap-northeast-3',
20
+ 'ca-central-1',
21
+ 'sa-east-1',
22
+ ];
23
+ exports.AWS_REGIONS = [
24
+ 'eu-central-1',
25
+ 'eu-west-1',
26
+ 'eu-west-2',
27
+ 'eu-west-3',
28
+ 'eu-south-1',
29
+ 'eu-north-1',
30
+ 'us-east-1', // N. Virginia
31
+ 'us-east-2', // Ohio;
32
+ 'us-west-1',
33
+ 'us-west-2', // Oregon
34
+ 'af-south-1',
35
+ 'ap-south-1',
36
+ 'ap-east-1',
37
+ 'ap-southeast-1',
38
+ 'ap-southeast-2',
39
+ 'ap-northeast-1',
40
+ 'ap-northeast-2',
41
+ 'ap-northeast-3',
42
+ 'ca-central-1',
43
+ 'me-south-1',
44
+ 'sa-east-1',
45
+ ];
@@ -0,0 +1,37 @@
1
+ import type { AudioCodec, DeleteAfter, StillImageFormat, VideoImageFormat } from '@remotion/renderer';
2
+ import type { DownloadBehavior, OutNameInputWithoutCredentials, Privacy, SerializedInputProps, ServerlessCodec } from './constants';
3
+ import type { CloudProvider } from './still';
4
+ type Discriminated = {
5
+ type: 'still';
6
+ imageFormat: StillImageFormat;
7
+ codec: null;
8
+ } | {
9
+ type: 'video';
10
+ imageFormat: VideoImageFormat;
11
+ muted: boolean;
12
+ frameRange: [number, number];
13
+ everyNthFrame: number;
14
+ codec: ServerlessCodec;
15
+ };
16
+ export type RenderMetadata<Provider extends CloudProvider> = Discriminated & {
17
+ siteId: string;
18
+ startedDate: number;
19
+ totalChunks: number;
20
+ estimatedTotalLambdaInvokations: number;
21
+ estimatedRenderLambdaInvokations: number;
22
+ compositionId: string;
23
+ audioCodec: AudioCodec | null;
24
+ inputProps: SerializedInputProps;
25
+ framesPerLambda: number;
26
+ memorySizeInMb: number;
27
+ lambdaVersion: string;
28
+ region: Provider['region'];
29
+ renderId: string;
30
+ outName: OutNameInputWithoutCredentials | undefined;
31
+ privacy: Privacy;
32
+ deleteAfter: DeleteAfter | null;
33
+ numberOfGifLoops: number | null;
34
+ audioBitrate: string | null;
35
+ downloadBehavior: DownloadBehavior;
36
+ };
37
+ export {};
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,9 @@
1
+ import type { EmittedArtifact } from '@remotion/renderer';
2
+ export type SerializedArtifact = {
3
+ filename: string;
4
+ stringContent: string;
5
+ frame: number;
6
+ binary: boolean;
7
+ };
8
+ export declare const deserializeArtifact: (serializedArtifact: SerializedArtifact) => EmittedArtifact;
9
+ export declare const serializeArtifact: (artifact: EmittedArtifact) => SerializedArtifact;
@@ -0,0 +1,37 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.serializeArtifact = exports.deserializeArtifact = void 0;
4
+ const deserializeArtifact = (serializedArtifact) => {
5
+ if (serializedArtifact.binary) {
6
+ const content = new TextEncoder().encode(atob(serializedArtifact.stringContent));
7
+ return {
8
+ filename: serializedArtifact.filename,
9
+ content,
10
+ frame: serializedArtifact.frame,
11
+ };
12
+ }
13
+ return {
14
+ filename: serializedArtifact.filename,
15
+ content: serializedArtifact.stringContent,
16
+ frame: serializedArtifact.frame,
17
+ };
18
+ };
19
+ exports.deserializeArtifact = deserializeArtifact;
20
+ const serializeArtifact = (artifact) => {
21
+ if (artifact.content instanceof Uint8Array) {
22
+ const b64encoded = btoa(new TextDecoder('utf8').decode(artifact.content));
23
+ return {
24
+ filename: artifact.filename,
25
+ stringContent: b64encoded,
26
+ frame: artifact.frame,
27
+ binary: true,
28
+ };
29
+ }
30
+ return {
31
+ filename: artifact.filename,
32
+ stringContent: artifact.content,
33
+ frame: artifact.frame,
34
+ binary: false,
35
+ };
36
+ };
37
+ exports.serializeArtifact = serializeArtifact;
@@ -0,0 +1,28 @@
1
+ export interface CloudProvider<Region extends string = string, ReceivedArtifactType extends Record<string, unknown> = Record<string, unknown>> {
2
+ type: string;
3
+ region: Region;
4
+ receivedArtifactType: ReceivedArtifactType;
5
+ }
6
+ export type ReceivedArtifact<Provider extends CloudProvider> = {
7
+ filename: string;
8
+ sizeInBytes: number;
9
+ s3Url: string;
10
+ s3Key: string;
11
+ } & Provider['receivedArtifactType'];
12
+ export type CostsInfo = {
13
+ accruedSoFar: number;
14
+ displayCost: string;
15
+ currency: string;
16
+ disclaimer: string;
17
+ };
18
+ export type RenderStillLambdaResponsePayload<Provider extends CloudProvider> = {
19
+ type: 'success';
20
+ output: string;
21
+ outKey: string;
22
+ size: number;
23
+ bucketName: string;
24
+ sizeInBytes: number;
25
+ estimatedPrice: CostsInfo;
26
+ renderId: string;
27
+ receivedArtifacts: ReceivedArtifact<Provider>[];
28
+ };
package/dist/still.js ADDED
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,4 @@
1
+ /// <reference types="node" />
2
+ /// <reference types="node" />
3
+ import type { Readable } from 'stream';
4
+ export declare function streamToString(stream: Readable | Buffer): string | Promise<string>;
@@ -0,0 +1,15 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.streamToString = void 0;
4
+ function streamToString(stream) {
5
+ if (Buffer.isBuffer(stream)) {
6
+ return stream.toString('utf-8');
7
+ }
8
+ const chunks = [];
9
+ return new Promise((resolve, reject) => {
10
+ stream.on('data', (chunk) => chunks.push(Buffer.from(chunk)));
11
+ stream.on('error', (err) => reject(err));
12
+ stream.on('end', () => resolve(Buffer.concat(chunks).toString('utf8')));
13
+ });
14
+ }
15
+ exports.streamToString = streamToString;
@@ -0,0 +1,20 @@
1
+ /// <reference types="node" />
2
+ /// <reference types="node" />
3
+ import { Writable } from 'stream';
4
+ type Chunk = {
5
+ PayloadChunk: {
6
+ Payload: string | Buffer | null;
7
+ };
8
+ InvokeComplete: boolean;
9
+ };
10
+ export declare class ResponseStream extends Writable {
11
+ private queue;
12
+ private waitingResolve;
13
+ private response;
14
+ constructor();
15
+ _write(chunk: any, encoding: BufferEncoding, callback: (error?: Error | null) => void): void;
16
+ _finish(): void;
17
+ getBufferedData(): Buffer;
18
+ [Symbol.asyncIterator](): AsyncGenerator<Chunk, void, void>;
19
+ }
20
+ export {};
@@ -0,0 +1,64 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ResponseStream = void 0;
4
+ const stream_1 = require("stream");
5
+ class ResponseStream extends stream_1.Writable {
6
+ constructor() {
7
+ super();
8
+ this.queue = [];
9
+ this.waitingResolve = [];
10
+ this.response = [];
11
+ }
12
+ _write(chunk, encoding, callback) {
13
+ const data = Buffer.from(chunk, encoding);
14
+ const resolve = this.waitingResolve.shift();
15
+ if (resolve) {
16
+ resolve({ PayloadChunk: { Payload: data }, InvokeComplete: false });
17
+ }
18
+ else {
19
+ this.queue.push({ PayloadChunk: { Payload: data }, InvokeComplete: false });
20
+ }
21
+ this.response.push(Buffer.from(chunk, encoding));
22
+ callback();
23
+ }
24
+ _finish() {
25
+ const resolve = this.waitingResolve.shift();
26
+ if (resolve) {
27
+ resolve({ PayloadChunk: { Payload: null }, InvokeComplete: true });
28
+ }
29
+ else {
30
+ this.queue.push({ PayloadChunk: { Payload: null }, InvokeComplete: true });
31
+ }
32
+ }
33
+ getBufferedData() {
34
+ return Buffer.concat(this.response);
35
+ }
36
+ async *[Symbol.asyncIterator]() {
37
+ while (true) {
38
+ if (this.queue.length > 0) {
39
+ const shifted = this.queue.shift();
40
+ yield shifted;
41
+ if (shifted.InvokeComplete) {
42
+ break;
43
+ }
44
+ }
45
+ else {
46
+ // Wait for new data to be written
47
+ const shifted = await new Promise((resolve) => {
48
+ this.waitingResolve.push((data) => {
49
+ Promise.resolve(data).then((d) => {
50
+ if (d) {
51
+ resolve(d);
52
+ }
53
+ });
54
+ });
55
+ });
56
+ yield shifted;
57
+ if (shifted.InvokeComplete) {
58
+ break;
59
+ }
60
+ }
61
+ }
62
+ }
63
+ }
64
+ exports.ResponseStream = ResponseStream;
@@ -0,0 +1,6 @@
1
+ import type { ResponseStream } from './response-stream';
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,102 @@
1
+ /// <reference types="node" />
2
+ import type { SerializedArtifact } from '../serialize-artifact';
3
+ import type { CloudProvider, RenderStillLambdaResponsePayload } from '../still';
4
+ import type { LambdaErrorInfo } from '../write-lambda-error';
5
+ declare const framesRendered: "frames-rendered";
6
+ declare const errorOccurred: "error-occurred";
7
+ declare const renderIdDetermined: "render-id-determined";
8
+ declare const videoChunkRendered: "video-chunk-rendered";
9
+ declare const audioChunkRendered: "audio-chunk-rendered";
10
+ declare const chunkComplete: "chunk-complete";
11
+ declare const stillRendered: "still-rendered";
12
+ declare const lambdaInvoked: "lambda-invoked";
13
+ declare const artifactEmitted: "artifact-emitted";
14
+ declare const messageTypes: {
15
+ readonly '1': {
16
+ readonly type: "frames-rendered";
17
+ };
18
+ readonly '2': {
19
+ readonly type: "error-occurred";
20
+ };
21
+ readonly '3': {
22
+ readonly type: "render-id-determined";
23
+ };
24
+ readonly '4': {
25
+ readonly type: "video-chunk-rendered";
26
+ };
27
+ readonly '5': {
28
+ readonly type: "audio-chunk-rendered";
29
+ };
30
+ readonly '6': {
31
+ readonly type: "still-rendered";
32
+ };
33
+ readonly '7': {
34
+ readonly type: "chunk-complete";
35
+ };
36
+ readonly '8': {
37
+ readonly type: "lambda-invoked";
38
+ };
39
+ readonly '9': {
40
+ readonly type: "artifact-emitted";
41
+ };
42
+ };
43
+ export type MessageTypeId = keyof typeof messageTypes;
44
+ type MessageType = (typeof messageTypes)[MessageTypeId]['type'];
45
+ export declare const formatMap: {
46
+ [key in MessageType]: 'json' | 'binary';
47
+ };
48
+ export type StreamingPayload<Provider extends CloudProvider> = {
49
+ type: typeof framesRendered;
50
+ payload: {
51
+ rendered: number;
52
+ encoded: number;
53
+ };
54
+ } | {
55
+ type: typeof videoChunkRendered;
56
+ payload: Buffer;
57
+ } | {
58
+ type: typeof audioChunkRendered;
59
+ payload: Buffer;
60
+ } | {
61
+ type: typeof errorOccurred;
62
+ payload: {
63
+ error: string;
64
+ shouldRetry: boolean;
65
+ errorInfo: LambdaErrorInfo;
66
+ };
67
+ } | {
68
+ type: typeof renderIdDetermined;
69
+ payload: {
70
+ renderId: string;
71
+ };
72
+ } | {
73
+ type: typeof stillRendered;
74
+ payload: RenderStillLambdaResponsePayload<Provider>;
75
+ } | {
76
+ type: typeof chunkComplete;
77
+ payload: {
78
+ start: number;
79
+ rendered: number;
80
+ };
81
+ } | {
82
+ type: typeof lambdaInvoked;
83
+ payload: {
84
+ attempt: number;
85
+ };
86
+ } | {
87
+ type: typeof artifactEmitted;
88
+ payload: {
89
+ artifact: SerializedArtifact;
90
+ };
91
+ };
92
+ export declare const messageTypeIdToMessageType: (messageTypeId: MessageTypeId) => MessageType;
93
+ export type StreamingMessage<Provider extends CloudProvider> = {
94
+ successType: 'error' | 'success';
95
+ message: StreamingPayload<Provider>;
96
+ };
97
+ export type OnMessage<Provider extends CloudProvider> = (options: StreamingMessage<Provider>) => void;
98
+ export type OnStream<Provider extends CloudProvider> = (payload: StreamingPayload<Provider>) => Promise<void>;
99
+ export declare const makeStreamPayload: <Provider extends CloudProvider<string, Record<string, unknown>>>({ message, }: {
100
+ message: StreamingPayload<Provider>;
101
+ }) => Uint8Array;
102
+ export {};
@@ -0,0 +1,61 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.makeStreamPayload = exports.messageTypeIdToMessageType = exports.formatMap = void 0;
4
+ const streaming_1 = require("@remotion/streaming");
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 artifactEmitted = 'artifact-emitted';
14
+ const messageTypes = {
15
+ '1': { type: framesRendered },
16
+ '2': { type: errorOccurred },
17
+ '3': { type: renderIdDetermined },
18
+ '4': { type: videoChunkRendered },
19
+ '5': { type: audioChunkRendered },
20
+ '6': { type: stillRendered },
21
+ '7': { type: chunkComplete },
22
+ '8': { type: lambdaInvoked },
23
+ '9': { type: artifactEmitted },
24
+ };
25
+ exports.formatMap = {
26
+ [framesRendered]: 'json',
27
+ [errorOccurred]: 'json',
28
+ [renderIdDetermined]: 'json',
29
+ [videoChunkRendered]: 'binary',
30
+ [audioChunkRendered]: 'binary',
31
+ [stillRendered]: 'json',
32
+ [chunkComplete]: 'json',
33
+ [lambdaInvoked]: 'json',
34
+ [artifactEmitted]: 'json',
35
+ };
36
+ const messageTypeIdToMessageType = (messageTypeId) => {
37
+ const types = messageTypes[messageTypeId];
38
+ if (!types) {
39
+ throw new Error(`Unknown message type id ${messageTypeId}`);
40
+ }
41
+ return types.type;
42
+ };
43
+ exports.messageTypeIdToMessageType = messageTypeIdToMessageType;
44
+ const messageTypeToMessageId = (messageType) => {
45
+ const id = Object.keys(messageTypes).find((key) => messageTypes[key].type === messageType);
46
+ if (!id) {
47
+ throw new Error(`Unknown message type ${messageType}`);
48
+ }
49
+ return id;
50
+ };
51
+ const makeStreamPayload = ({ message, }) => {
52
+ const body = exports.formatMap[message.type] === 'json'
53
+ ? new TextEncoder().encode(JSON.stringify(message.payload))
54
+ : message.payload;
55
+ return (0, streaming_1.makeStreamPayloadMessage)({
56
+ body,
57
+ nonce: messageTypeToMessageId(message.type),
58
+ status: 0,
59
+ });
60
+ };
61
+ exports.makeStreamPayload = makeStreamPayload;
@@ -0,0 +1,3 @@
1
+ type Truthy<T> = T extends false | '' | 0 | null | undefined ? never : T;
2
+ export declare function truthy<T>(value: T): value is Truthy<T>;
3
+ export {};
package/dist/truthy.js ADDED
@@ -0,0 +1,7 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.truthy = void 0;
4
+ function truthy(value) {
5
+ return Boolean(value);
6
+ }
7
+ exports.truthy = truthy;
@@ -0,0 +1,3 @@
1
+ export declare const validateBucketName: (bucketName: unknown, options: {
2
+ mustStartWithRemotion: boolean;
3
+ }) => void;
@@ -0,0 +1,17 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.validateBucketName = void 0;
4
+ const constants_1 = require("./constants");
5
+ const validateBucketName = (bucketName, options) => {
6
+ if (typeof bucketName !== 'string') {
7
+ throw new TypeError(`'bucketName' must be a string, but is ${JSON.stringify(bucketName)}`);
8
+ }
9
+ if (options.mustStartWithRemotion &&
10
+ !bucketName.startsWith(constants_1.REMOTION_BUCKET_PREFIX)) {
11
+ throw new Error(`The bucketName parameter must start with ${constants_1.REMOTION_BUCKET_PREFIX}.`);
12
+ }
13
+ if (!bucketName.match(/^(?=^.{3,63}$)(?!^(\d+\.)+\d+$)(^(([a-z0-9]|[a-z0-9][a-z0-9-]*[a-z0-9])\.)*([a-z0-9]|[a-z0-9][a-z0-9-]*[a-z0-9])$)/)) {
14
+ throw new Error(`The bucket ${bucketName} `);
15
+ }
16
+ };
17
+ exports.validateBucketName = validateBucketName;
@@ -0,0 +1,25 @@
1
+ import type { ChromiumOptions, LogLevel, OnBrowserDownload, openBrowser, RemotionServer } from '@remotion/renderer';
2
+ import type { VideoConfig } from 'remotion/no-react';
3
+ import type { Await } from './await';
4
+ import type { ProviderSpecifics } from './provider-implementation';
5
+ import type { CloudProvider } from './still';
6
+ type ValidateCompositionOptions<Provider extends CloudProvider> = {
7
+ serveUrl: string;
8
+ composition: string;
9
+ browserInstance: Await<ReturnType<typeof openBrowser>>;
10
+ serializedInputPropsWithCustomSchema: string;
11
+ envVariables: Record<string, string>;
12
+ timeoutInMilliseconds: number;
13
+ chromiumOptions: ChromiumOptions;
14
+ port: number | null;
15
+ forceHeight: number | null;
16
+ forceWidth: number | null;
17
+ logLevel: LogLevel;
18
+ server: RemotionServer | undefined;
19
+ offthreadVideoCacheSizeInBytes: number | null;
20
+ onBrowserDownload: OnBrowserDownload;
21
+ onServeUrlVisited: () => void;
22
+ providerSpecifics: ProviderSpecifics<Provider>;
23
+ };
24
+ export declare const validateComposition: <Provider extends CloudProvider<string, Record<string, unknown>>>({ serveUrl, composition, browserInstance, serializedInputPropsWithCustomSchema, envVariables, timeoutInMilliseconds, chromiumOptions, port, forceHeight, forceWidth, logLevel, server, offthreadVideoCacheSizeInBytes, onBrowserDownload, onServeUrlVisited, providerSpecifics, }: ValidateCompositionOptions<Provider>) => Promise<VideoConfig>;
25
+ export {};
@@ -0,0 +1,31 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.validateComposition = void 0;
4
+ const renderer_1 = require("@remotion/renderer");
5
+ const validateComposition = async ({ serveUrl, composition, browserInstance, serializedInputPropsWithCustomSchema, envVariables, timeoutInMilliseconds, chromiumOptions, port, forceHeight, forceWidth, logLevel, server, offthreadVideoCacheSizeInBytes, onBrowserDownload, onServeUrlVisited, providerSpecifics, }) => {
6
+ const { metadata: comp } = await renderer_1.RenderInternals.internalSelectComposition({
7
+ id: composition,
8
+ puppeteerInstance: browserInstance,
9
+ serializedInputPropsWithCustomSchema,
10
+ envVariables,
11
+ timeoutInMilliseconds,
12
+ chromiumOptions,
13
+ port,
14
+ browserExecutable: providerSpecifics.getChromiumPath(),
15
+ serveUrl,
16
+ logLevel,
17
+ indent: false,
18
+ onBrowserLog: null,
19
+ server,
20
+ offthreadVideoCacheSizeInBytes,
21
+ binariesDirectory: null,
22
+ onBrowserDownload,
23
+ onServeUrlVisited,
24
+ });
25
+ return {
26
+ ...comp,
27
+ height: forceHeight !== null && forceHeight !== void 0 ? forceHeight : comp.height,
28
+ width: forceWidth !== null && forceWidth !== void 0 ? forceWidth : comp.width,
29
+ };
30
+ };
31
+ exports.validateComposition = validateComposition;
@@ -0,0 +1,8 @@
1
+ import type { AudioCodec, Codec } from '@remotion/renderer';
2
+ import type { OutNameInputWithoutCredentials } from './constants';
3
+ export declare const validateOutname: ({ outName, codec, audioCodecSetting, separateAudioTo, }: {
4
+ outName: OutNameInputWithoutCredentials | undefined | null;
5
+ codec: Codec | null;
6
+ audioCodecSetting: AudioCodec | null;
7
+ separateAudioTo: string | null;
8
+ }) => void;
@@ -0,0 +1,37 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.validateOutname = void 0;
4
+ const pure_1 = require("@remotion/renderer/pure");
5
+ const validate_bucket_name_1 = require("./validate-bucket-name");
6
+ const validateS3Key = (s3Key) => {
7
+ if (typeof s3Key !== 'string') {
8
+ throw new TypeError('The S3 key must be a string. Passed an object of type ' + typeof s3Key);
9
+ }
10
+ // https://docs.aws.amazon.com/AmazonS3/latest/userguide/object-keys.html
11
+ if (!s3Key.match(/^([0-9a-zA-Z-!_.*'()/:&$@=;+,?]+)/g)) {
12
+ throw new Error("The S3 Key must match the RegExp `/^([0-9a-zA-Z-!_.*'()/:&$@=;+,?]+)/g`. You passed: " +
13
+ s3Key +
14
+ '. Check for invalid characters.');
15
+ }
16
+ };
17
+ const validateOutname = ({ outName, codec, audioCodecSetting, separateAudioTo, }) => {
18
+ if (typeof outName === 'undefined' || outName === null) {
19
+ return;
20
+ }
21
+ if (typeof outName !== 'string') {
22
+ validateS3Key(outName.key);
23
+ (0, validate_bucket_name_1.validateBucketName)(outName.bucketName, { mustStartWithRemotion: false });
24
+ return;
25
+ }
26
+ if (codec) {
27
+ pure_1.NoReactAPIs.validateOutputFilename({
28
+ codec,
29
+ audioCodecSetting,
30
+ extension: pure_1.NoReactAPIs.getExtensionOfFilename(outName),
31
+ preferLossless: false,
32
+ separateAudioTo,
33
+ });
34
+ }
35
+ validateS3Key(outName);
36
+ };
37
+ exports.validateOutname = validateOutname;
@@ -0,0 +1,3 @@
1
+ import type { WebhookOption } from './constants';
2
+ export declare const MAX_WEBHOOK_CUSTOM_DATA_SIZE = 1024;
3
+ export declare const validateWebhook: (webhook?: WebhookOption | null) => void;
@@ -0,0 +1,16 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.validateWebhook = exports.MAX_WEBHOOK_CUSTOM_DATA_SIZE = void 0;
4
+ exports.MAX_WEBHOOK_CUSTOM_DATA_SIZE = 1024;
5
+ const validateWebhook = (webhook) => {
6
+ if (typeof webhook === 'undefined' || webhook === null) {
7
+ return;
8
+ }
9
+ if (webhook.customData) {
10
+ const size = JSON.stringify(webhook.customData).length;
11
+ if (size > exports.MAX_WEBHOOK_CUSTOM_DATA_SIZE) {
12
+ throw new Error(`Webhook "customData" must be less than ${exports.MAX_WEBHOOK_CUSTOM_DATA_SIZE} bytes. Current size: ${size} bytes.`);
13
+ }
14
+ }
15
+ };
16
+ exports.validateWebhook = validateWebhook;