@remotion/renderer 4.0.294 → 4.0.296
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/compositor/compositor.js +1 -0
- package/dist/download-behavior.d.ts +6 -0
- package/dist/download-behavior.js +2 -0
- package/dist/esm/index.mjs +141 -52
- package/dist/filter-asset-types.js +2 -0
- package/dist/get-video-threads-flag.js +1 -1
- package/dist/memory/from-docker-cgroup.d.ts +1 -0
- package/dist/memory/from-docker-cgroup.js +66 -0
- package/dist/memory/from-lambda-env.d.ts +1 -0
- package/dist/memory/from-lambda-env.js +10 -0
- package/dist/memory/from-proc-meminfo.d.ts +2 -0
- package/dist/memory/from-proc-meminfo.js +44 -0
- package/dist/memory/get-available-memory.d.ts +2 -0
- package/dist/memory/get-available-memory.js +44 -0
- package/dist/prestitcher-memory-usage.js +1 -1
- package/dist/serialize-artifact.d.ts +2 -0
- package/package.json +12 -12
|
@@ -93,6 +93,7 @@ const startCompositor = ({ type, payload, logLevel, indent, binariesDirectory =
|
|
|
93
93
|
const errorMessage = Buffer.concat(stderrChunks).toString('utf-8') +
|
|
94
94
|
new TextDecoder('utf-8').decode(getOutputBuffer());
|
|
95
95
|
runningStatus = { type: 'quit-with-error', error: errorMessage, signal };
|
|
96
|
+
logger_1.Log.verbose({ indent, logLevel }, `Compositor exited with code ${code} and signal ${signal}`);
|
|
96
97
|
const error = code === null
|
|
97
98
|
? new Error(`Compositor exited with signal ${signal}`)
|
|
98
99
|
: new Error(`Compositor exited with code ${code}: ${errorMessage}`);
|
package/dist/esm/index.mjs
CHANGED
|
@@ -4951,56 +4951,6 @@ var getLocalBrowserExecutable = ({
|
|
|
4951
4951
|
return status.path;
|
|
4952
4952
|
};
|
|
4953
4953
|
|
|
4954
|
-
// src/get-available-memory.ts
|
|
4955
|
-
import { existsSync as existsSync3, readFileSync as readFileSync2 } from "node:fs";
|
|
4956
|
-
import { freemem } from "node:os";
|
|
4957
|
-
var getFreeMemoryFromProcMeminfo = () => {
|
|
4958
|
-
const data = readFileSync2("/proc/meminfo", "utf-8");
|
|
4959
|
-
const lines = data.split(`
|
|
4960
|
-
`);
|
|
4961
|
-
const memAvailableLine = lines.find((line) => line.startsWith("MemAvailable"));
|
|
4962
|
-
if (!memAvailableLine) {
|
|
4963
|
-
throw new Error("MemAvailable not found in /proc/meminfo");
|
|
4964
|
-
}
|
|
4965
|
-
const matches = memAvailableLine.match(/(\d+)\s+(\w+)/);
|
|
4966
|
-
if (!matches || matches.length !== 3) {
|
|
4967
|
-
throw new Error("Failed to parse MemAvailable value");
|
|
4968
|
-
}
|
|
4969
|
-
const value = parseInt(matches[1], 10);
|
|
4970
|
-
const unit = matches[2].toLowerCase();
|
|
4971
|
-
switch (unit) {
|
|
4972
|
-
case "kb":
|
|
4973
|
-
return value * 1024;
|
|
4974
|
-
case "mb":
|
|
4975
|
-
return value * 1024 * 1024;
|
|
4976
|
-
case "gb":
|
|
4977
|
-
return value * 1024 * 1024 * 1024;
|
|
4978
|
-
default:
|
|
4979
|
-
throw new Error(`Unknown unit: ${unit}`);
|
|
4980
|
-
}
|
|
4981
|
-
};
|
|
4982
|
-
var maxLambdaMemory = () => {
|
|
4983
|
-
if (process.env.AWS_LAMBDA_FUNCTION_MEMORY_SIZE) {
|
|
4984
|
-
return parseInt(process.env.AWS_LAMBDA_FUNCTION_MEMORY_SIZE, 10) * 1024 * 1024;
|
|
4985
|
-
}
|
|
4986
|
-
return Infinity;
|
|
4987
|
-
};
|
|
4988
|
-
var getAvailableMemory = (logLevel) => {
|
|
4989
|
-
const maxMemory = maxLambdaMemory();
|
|
4990
|
-
if (existsSync3("/proc/meminfo")) {
|
|
4991
|
-
try {
|
|
4992
|
-
const val = getFreeMemoryFromProcMeminfo();
|
|
4993
|
-
if (val !== null) {
|
|
4994
|
-
return Math.min(val, maxMemory);
|
|
4995
|
-
}
|
|
4996
|
-
} catch (err) {
|
|
4997
|
-
Log.warn({ indent: false, logLevel }, "Tried to get available memory from /proc/meminfo but failed. Falling back to os.freemem(). Error:");
|
|
4998
|
-
Log.warn({ indent: false, logLevel }, err);
|
|
4999
|
-
}
|
|
5000
|
-
}
|
|
5001
|
-
return Math.min(freemem(), maxMemory);
|
|
5002
|
-
};
|
|
5003
|
-
|
|
5004
4954
|
// src/get-cpu-count.ts
|
|
5005
4955
|
import { execSync as execSync2 } from "node:child_process";
|
|
5006
4956
|
import { cpus } from "node:os";
|
|
@@ -5026,6 +4976,142 @@ var getCpuCount = () => {
|
|
|
5026
4976
|
return Math.min(nproc, node);
|
|
5027
4977
|
};
|
|
5028
4978
|
|
|
4979
|
+
// src/memory/get-available-memory.ts
|
|
4980
|
+
import { freemem } from "node:os";
|
|
4981
|
+
|
|
4982
|
+
// src/memory/from-docker-cgroup.ts
|
|
4983
|
+
import { readFileSync as readFileSync2 } from "node:fs";
|
|
4984
|
+
var getMaxMemoryFromCgroupV2 = () => {
|
|
4985
|
+
try {
|
|
4986
|
+
const data = readFileSync2("/sys/fs/cgroup/memory.max", "utf-8");
|
|
4987
|
+
if (data.trim() === "max") {
|
|
4988
|
+
return Infinity;
|
|
4989
|
+
}
|
|
4990
|
+
return parseInt(data, 10);
|
|
4991
|
+
} catch {
|
|
4992
|
+
return null;
|
|
4993
|
+
}
|
|
4994
|
+
};
|
|
4995
|
+
var getAvailableMemoryFromCgroupV2 = () => {
|
|
4996
|
+
try {
|
|
4997
|
+
const data = readFileSync2("/sys/fs/cgroup/memory.current", "utf-8");
|
|
4998
|
+
return parseInt(data, 10);
|
|
4999
|
+
} catch {
|
|
5000
|
+
return null;
|
|
5001
|
+
}
|
|
5002
|
+
};
|
|
5003
|
+
var getMaxMemoryFromCgroupV1 = () => {
|
|
5004
|
+
try {
|
|
5005
|
+
const data = readFileSync2("/sys/fs/cgroup/memory/memory.limit_in_bytes", "utf-8");
|
|
5006
|
+
if (data.trim() === "max") {
|
|
5007
|
+
return Infinity;
|
|
5008
|
+
}
|
|
5009
|
+
return parseInt(data, 10);
|
|
5010
|
+
} catch {
|
|
5011
|
+
return null;
|
|
5012
|
+
}
|
|
5013
|
+
};
|
|
5014
|
+
var getAvailableMemoryFromCgroupV1 = () => {
|
|
5015
|
+
try {
|
|
5016
|
+
const data = readFileSync2("/sys/fs/cgroup/memory/memory.usage_in_bytes", "utf-8");
|
|
5017
|
+
return parseInt(data, 10);
|
|
5018
|
+
} catch {
|
|
5019
|
+
return null;
|
|
5020
|
+
}
|
|
5021
|
+
};
|
|
5022
|
+
var getAvailableMemoryFromCgroup = () => {
|
|
5023
|
+
const maxMemoryV2 = getMaxMemoryFromCgroupV2();
|
|
5024
|
+
if (maxMemoryV2 !== null) {
|
|
5025
|
+
const availableMemoryV2 = getAvailableMemoryFromCgroupV2();
|
|
5026
|
+
if (availableMemoryV2 !== null) {
|
|
5027
|
+
return maxMemoryV2 - availableMemoryV2;
|
|
5028
|
+
}
|
|
5029
|
+
}
|
|
5030
|
+
const maxMemoryV1 = getMaxMemoryFromCgroupV1();
|
|
5031
|
+
if (maxMemoryV1 !== null) {
|
|
5032
|
+
const availableMemoryV1 = getAvailableMemoryFromCgroupV1();
|
|
5033
|
+
if (availableMemoryV1 !== null) {
|
|
5034
|
+
return maxMemoryV1 - availableMemoryV1;
|
|
5035
|
+
}
|
|
5036
|
+
}
|
|
5037
|
+
return null;
|
|
5038
|
+
};
|
|
5039
|
+
|
|
5040
|
+
// src/memory/from-lambda-env.ts
|
|
5041
|
+
var getMaxLambdaMemory = () => {
|
|
5042
|
+
if (process.env.AWS_LAMBDA_FUNCTION_MEMORY_SIZE) {
|
|
5043
|
+
return parseInt(process.env.AWS_LAMBDA_FUNCTION_MEMORY_SIZE, 10) * 1024 * 1024;
|
|
5044
|
+
}
|
|
5045
|
+
return null;
|
|
5046
|
+
};
|
|
5047
|
+
|
|
5048
|
+
// src/memory/from-proc-meminfo.ts
|
|
5049
|
+
import { existsSync as existsSync3, readFileSync as readFileSync3 } from "node:fs";
|
|
5050
|
+
var getFreeMemoryFromProcMeminfo = (logLevel) => {
|
|
5051
|
+
if (!existsSync3("/proc/meminfo")) {
|
|
5052
|
+
return null;
|
|
5053
|
+
}
|
|
5054
|
+
try {
|
|
5055
|
+
const data = readFileSync3("/proc/meminfo", "utf-8");
|
|
5056
|
+
const lines = data.split(`
|
|
5057
|
+
`);
|
|
5058
|
+
const memAvailableLine = lines.find((line) => line.startsWith("MemAvailable"));
|
|
5059
|
+
if (!memAvailableLine) {
|
|
5060
|
+
throw new Error("MemAvailable not found in /proc/meminfo");
|
|
5061
|
+
}
|
|
5062
|
+
const matches = memAvailableLine.match(/(\d+)\s+(\w+)/);
|
|
5063
|
+
if (!matches || matches.length !== 3) {
|
|
5064
|
+
throw new Error("Failed to parse MemAvailable value");
|
|
5065
|
+
}
|
|
5066
|
+
const value = parseInt(matches[1], 10);
|
|
5067
|
+
const unit = matches[2].toLowerCase();
|
|
5068
|
+
switch (unit) {
|
|
5069
|
+
case "kb":
|
|
5070
|
+
return value * 1024;
|
|
5071
|
+
case "mb":
|
|
5072
|
+
return value * 1024 * 1024;
|
|
5073
|
+
case "gb":
|
|
5074
|
+
return value * 1024 * 1024 * 1024;
|
|
5075
|
+
default:
|
|
5076
|
+
throw new Error(`Unknown unit: ${unit}`);
|
|
5077
|
+
}
|
|
5078
|
+
} catch (err) {
|
|
5079
|
+
Log.warn({ indent: false, logLevel }, "/proc/meminfo exists but failed to get memory info. Error:");
|
|
5080
|
+
Log.warn({ indent: false, logLevel }, err);
|
|
5081
|
+
return null;
|
|
5082
|
+
}
|
|
5083
|
+
};
|
|
5084
|
+
|
|
5085
|
+
// src/memory/get-available-memory.ts
|
|
5086
|
+
var getAvailableMemory = (logLevel) => {
|
|
5087
|
+
const maxMemory = getMaxLambdaMemory();
|
|
5088
|
+
if (maxMemory !== null) {
|
|
5089
|
+
const nodeMemory = freemem();
|
|
5090
|
+
return Math.min(nodeMemory, maxMemory);
|
|
5091
|
+
}
|
|
5092
|
+
const cgroupMemory = getAvailableMemoryFromCgroup();
|
|
5093
|
+
if (cgroupMemory !== null) {
|
|
5094
|
+
const nodeMemory = freemem();
|
|
5095
|
+
const _procInfo = getFreeMemoryFromProcMeminfo(logLevel);
|
|
5096
|
+
if (cgroupMemory > nodeMemory * 1.25) {
|
|
5097
|
+
Log.warn({ indent: false, logLevel }, "Detected differing memory amounts:");
|
|
5098
|
+
Log.warn({ indent: false, logLevel }, `Memory reported by CGroup: ${(cgroupMemory / 1024 / 1024).toFixed(2)} MB`);
|
|
5099
|
+
if (_procInfo !== null) {
|
|
5100
|
+
Log.warn({ indent: false, logLevel }, `Memory reported by /proc/meminfo: ${(_procInfo / 1024 / 1024).toFixed(2)} MB`);
|
|
5101
|
+
}
|
|
5102
|
+
Log.warn({ indent: false, logLevel }, `Memory reported by Node: ${(nodeMemory / 1024 / 1024).toFixed(2)} MB`);
|
|
5103
|
+
Log.warn({ indent: false, logLevel }, "You might have inadvertenly set the --memory flag of `docker run` to a value that is higher than the global Docker memory limit.");
|
|
5104
|
+
Log.warn({ indent: false, logLevel }, "Using the lower amount of memory for calculation.");
|
|
5105
|
+
}
|
|
5106
|
+
return Math.min(nodeMemory, cgroupMemory);
|
|
5107
|
+
}
|
|
5108
|
+
const procInfo = getFreeMemoryFromProcMeminfo(logLevel);
|
|
5109
|
+
if (procInfo !== null) {
|
|
5110
|
+
return Math.min(freemem(), procInfo);
|
|
5111
|
+
}
|
|
5112
|
+
return freemem();
|
|
5113
|
+
};
|
|
5114
|
+
|
|
5029
5115
|
// src/get-video-threads-flag.ts
|
|
5030
5116
|
var MEMORY_USAGE_PER_THREAD = 400000000;
|
|
5031
5117
|
var RESERVED_MEMORY = 2000000000;
|
|
@@ -14635,6 +14721,7 @@ ${parsed.backtrace}`));
|
|
|
14635
14721
|
} else {
|
|
14636
14722
|
const errorMessage = Buffer.concat(stderrChunks).toString("utf-8") + new TextDecoder("utf-8").decode(getOutputBuffer());
|
|
14637
14723
|
runningStatus = { type: "quit-with-error", error: errorMessage, signal };
|
|
14724
|
+
Log.verbose({ indent, logLevel }, `Compositor exited with code ${code} and signal ${signal}`);
|
|
14638
14725
|
const error = code === null ? new Error(`Compositor exited with signal ${signal}`) : new Error(`Compositor exited with code ${code}: ${errorMessage}`);
|
|
14639
14726
|
for (const waiter of waitersToKill) {
|
|
14640
14727
|
waiter.reject(error);
|
|
@@ -17749,7 +17836,8 @@ var onlyArtifact = ({
|
|
|
17749
17836
|
return {
|
|
17750
17837
|
frame: artifact.frame,
|
|
17751
17838
|
content: artifact.content,
|
|
17752
|
-
filename: artifact.filename
|
|
17839
|
+
filename: artifact.filename,
|
|
17840
|
+
downloadBehavior: artifact.downloadBehavior
|
|
17753
17841
|
};
|
|
17754
17842
|
}
|
|
17755
17843
|
if (artifact.contentType === "thumbnail") {
|
|
@@ -17759,7 +17847,8 @@ var onlyArtifact = ({
|
|
|
17759
17847
|
return {
|
|
17760
17848
|
frame: artifact.frame,
|
|
17761
17849
|
content: new Uint8Array(frameBuffer),
|
|
17762
|
-
filename: artifact.filename
|
|
17850
|
+
filename: artifact.filename,
|
|
17851
|
+
downloadBehavior: artifact.downloadBehavior
|
|
17763
17852
|
};
|
|
17764
17853
|
}
|
|
17765
17854
|
throw new Error("Unknown artifact type: " + artifact);
|
|
@@ -16,6 +16,7 @@ const onlyArtifact = ({ assets, frameBuffer, }) => {
|
|
|
16
16
|
frame: artifact.frame,
|
|
17
17
|
content: artifact.content,
|
|
18
18
|
filename: artifact.filename,
|
|
19
|
+
downloadBehavior: artifact.downloadBehavior,
|
|
19
20
|
};
|
|
20
21
|
}
|
|
21
22
|
if (artifact.contentType === 'thumbnail') {
|
|
@@ -29,6 +30,7 @@ const onlyArtifact = ({ assets, frameBuffer, }) => {
|
|
|
29
30
|
frame: artifact.frame,
|
|
30
31
|
content: new Uint8Array(frameBuffer),
|
|
31
32
|
filename: artifact.filename,
|
|
33
|
+
downloadBehavior: artifact.downloadBehavior,
|
|
32
34
|
};
|
|
33
35
|
}
|
|
34
36
|
throw new Error('Unknown artifact type: ' + artifact);
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.getIdealVideoThreadsFlag = void 0;
|
|
4
|
-
const get_available_memory_1 = require("./get-available-memory");
|
|
5
4
|
const get_cpu_count_1 = require("./get-cpu-count");
|
|
5
|
+
const get_available_memory_1 = require("./memory/get-available-memory");
|
|
6
6
|
const MEMORY_USAGE_PER_THREAD = 400000000; // 400MB
|
|
7
7
|
const RESERVED_MEMORY = 2000000000;
|
|
8
8
|
const getIdealVideoThreadsFlag = (logLevel) => {
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const getAvailableMemoryFromCgroup: () => number | null;
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.getAvailableMemoryFromCgroup = void 0;
|
|
4
|
+
const node_fs_1 = require("node:fs");
|
|
5
|
+
const getMaxMemoryFromCgroupV2 = () => {
|
|
6
|
+
try {
|
|
7
|
+
const data = (0, node_fs_1.readFileSync)('/sys/fs/cgroup/memory.max', 'utf-8');
|
|
8
|
+
// If --memory=[num] flag of "docker run" is not set, the value will be "max"
|
|
9
|
+
if (data.trim() === 'max') {
|
|
10
|
+
return Infinity;
|
|
11
|
+
}
|
|
12
|
+
return parseInt(data, 10);
|
|
13
|
+
}
|
|
14
|
+
catch (_a) {
|
|
15
|
+
return null;
|
|
16
|
+
}
|
|
17
|
+
};
|
|
18
|
+
const getAvailableMemoryFromCgroupV2 = () => {
|
|
19
|
+
try {
|
|
20
|
+
const data = (0, node_fs_1.readFileSync)('/sys/fs/cgroup/memory.current', 'utf-8');
|
|
21
|
+
return parseInt(data, 10);
|
|
22
|
+
}
|
|
23
|
+
catch (_a) {
|
|
24
|
+
return null;
|
|
25
|
+
}
|
|
26
|
+
};
|
|
27
|
+
const getMaxMemoryFromCgroupV1 = () => {
|
|
28
|
+
try {
|
|
29
|
+
const data = (0, node_fs_1.readFileSync)('/sys/fs/cgroup/memory/memory.limit_in_bytes', 'utf-8');
|
|
30
|
+
// If --memory=[num] flag of "docker run" is not set, the value will be "max"
|
|
31
|
+
if (data.trim() === 'max') {
|
|
32
|
+
return Infinity;
|
|
33
|
+
}
|
|
34
|
+
return parseInt(data, 10);
|
|
35
|
+
}
|
|
36
|
+
catch (_a) {
|
|
37
|
+
return null;
|
|
38
|
+
}
|
|
39
|
+
};
|
|
40
|
+
const getAvailableMemoryFromCgroupV1 = () => {
|
|
41
|
+
try {
|
|
42
|
+
const data = (0, node_fs_1.readFileSync)('/sys/fs/cgroup/memory/memory.usage_in_bytes', 'utf-8');
|
|
43
|
+
return parseInt(data, 10);
|
|
44
|
+
}
|
|
45
|
+
catch (_a) {
|
|
46
|
+
return null;
|
|
47
|
+
}
|
|
48
|
+
};
|
|
49
|
+
const getAvailableMemoryFromCgroup = () => {
|
|
50
|
+
const maxMemoryV2 = getMaxMemoryFromCgroupV2();
|
|
51
|
+
if (maxMemoryV2 !== null) {
|
|
52
|
+
const availableMemoryV2 = getAvailableMemoryFromCgroupV2();
|
|
53
|
+
if (availableMemoryV2 !== null) {
|
|
54
|
+
return maxMemoryV2 - availableMemoryV2;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
const maxMemoryV1 = getMaxMemoryFromCgroupV1();
|
|
58
|
+
if (maxMemoryV1 !== null) {
|
|
59
|
+
const availableMemoryV1 = getAvailableMemoryFromCgroupV1();
|
|
60
|
+
if (availableMemoryV1 !== null) {
|
|
61
|
+
return maxMemoryV1 - availableMemoryV1;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
return null;
|
|
65
|
+
};
|
|
66
|
+
exports.getAvailableMemoryFromCgroup = getAvailableMemoryFromCgroup;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const getMaxLambdaMemory: () => number | null;
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.getMaxLambdaMemory = void 0;
|
|
4
|
+
const getMaxLambdaMemory = () => {
|
|
5
|
+
if (process.env.AWS_LAMBDA_FUNCTION_MEMORY_SIZE) {
|
|
6
|
+
return (parseInt(process.env.AWS_LAMBDA_FUNCTION_MEMORY_SIZE, 10) * 1024 * 1024);
|
|
7
|
+
}
|
|
8
|
+
return null;
|
|
9
|
+
};
|
|
10
|
+
exports.getMaxLambdaMemory = getMaxLambdaMemory;
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.getFreeMemoryFromProcMeminfo = void 0;
|
|
4
|
+
const node_fs_1 = require("node:fs");
|
|
5
|
+
const logger_1 = require("../logger");
|
|
6
|
+
const getFreeMemoryFromProcMeminfo = (logLevel) => {
|
|
7
|
+
if (!(0, node_fs_1.existsSync)('/proc/meminfo')) {
|
|
8
|
+
return null;
|
|
9
|
+
}
|
|
10
|
+
try {
|
|
11
|
+
const data = (0, node_fs_1.readFileSync)('/proc/meminfo', 'utf-8');
|
|
12
|
+
// Split the file by lines and find the line with MemFree
|
|
13
|
+
const lines = data.split('\n');
|
|
14
|
+
const memAvailableLine = lines.find((line) => line.startsWith('MemAvailable'));
|
|
15
|
+
// If we couldn't find MemAvailable, return an error
|
|
16
|
+
if (!memAvailableLine) {
|
|
17
|
+
throw new Error('MemAvailable not found in /proc/meminfo');
|
|
18
|
+
}
|
|
19
|
+
// Extract the value and unit from the line
|
|
20
|
+
const matches = memAvailableLine.match(/(\d+)\s+(\w+)/);
|
|
21
|
+
if (!matches || matches.length !== 3) {
|
|
22
|
+
throw new Error('Failed to parse MemAvailable value');
|
|
23
|
+
}
|
|
24
|
+
const value = parseInt(matches[1], 10);
|
|
25
|
+
const unit = matches[2].toLowerCase();
|
|
26
|
+
// Convert the value to bytes based on its unit
|
|
27
|
+
switch (unit) {
|
|
28
|
+
case 'kb':
|
|
29
|
+
return value * 1024;
|
|
30
|
+
case 'mb':
|
|
31
|
+
return value * 1024 * 1024;
|
|
32
|
+
case 'gb':
|
|
33
|
+
return value * 1024 * 1024 * 1024;
|
|
34
|
+
default:
|
|
35
|
+
throw new Error(`Unknown unit: ${unit}`);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
catch (err) {
|
|
39
|
+
logger_1.Log.warn({ indent: false, logLevel }, '/proc/meminfo exists but failed to get memory info. Error:');
|
|
40
|
+
logger_1.Log.warn({ indent: false, logLevel }, err);
|
|
41
|
+
return null;
|
|
42
|
+
}
|
|
43
|
+
};
|
|
44
|
+
exports.getFreeMemoryFromProcMeminfo = getFreeMemoryFromProcMeminfo;
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.getAvailableMemory = void 0;
|
|
4
|
+
const node_os_1 = require("node:os");
|
|
5
|
+
const logger_1 = require("../logger");
|
|
6
|
+
const from_docker_cgroup_1 = require("./from-docker-cgroup");
|
|
7
|
+
const from_lambda_env_1 = require("./from-lambda-env");
|
|
8
|
+
const from_proc_meminfo_1 = require("./from-proc-meminfo");
|
|
9
|
+
const getAvailableMemory = (logLevel) => {
|
|
10
|
+
// If we are in Lambda, the most reliable way is to read the environment variable
|
|
11
|
+
// This is also pretty much free
|
|
12
|
+
const maxMemory = (0, from_lambda_env_1.getMaxLambdaMemory)();
|
|
13
|
+
if (maxMemory !== null) {
|
|
14
|
+
const nodeMemory = (0, node_os_1.freemem)();
|
|
15
|
+
return Math.min(nodeMemory, maxMemory);
|
|
16
|
+
}
|
|
17
|
+
// If cgroup memory data is available, we are in Docker, and we should respect it
|
|
18
|
+
const cgroupMemory = (0, from_docker_cgroup_1.getAvailableMemoryFromCgroup)();
|
|
19
|
+
if (cgroupMemory !== null) {
|
|
20
|
+
// There are 2 Docker memory configurations:
|
|
21
|
+
// 1. --memory=[num]
|
|
22
|
+
// 2. Global Docker memory limit
|
|
23
|
+
// If cgroup limit is higher than global memory, the global memory limit still applies
|
|
24
|
+
const nodeMemory = (0, node_os_1.freemem)();
|
|
25
|
+
const _procInfo = (0, from_proc_meminfo_1.getFreeMemoryFromProcMeminfo)(logLevel);
|
|
26
|
+
if (cgroupMemory > nodeMemory * 1.25) {
|
|
27
|
+
logger_1.Log.warn({ indent: false, logLevel }, 'Detected differing memory amounts:');
|
|
28
|
+
logger_1.Log.warn({ indent: false, logLevel }, `Memory reported by CGroup: ${(cgroupMemory / 1024 / 1024).toFixed(2)} MB`);
|
|
29
|
+
if (_procInfo !== null) {
|
|
30
|
+
logger_1.Log.warn({ indent: false, logLevel }, `Memory reported by /proc/meminfo: ${(_procInfo / 1024 / 1024).toFixed(2)} MB`);
|
|
31
|
+
}
|
|
32
|
+
logger_1.Log.warn({ indent: false, logLevel }, `Memory reported by Node: ${(nodeMemory / 1024 / 1024).toFixed(2)} MB`);
|
|
33
|
+
logger_1.Log.warn({ indent: false, logLevel }, 'You might have inadvertenly set the --memory flag of `docker run` to a value that is higher than the global Docker memory limit.');
|
|
34
|
+
logger_1.Log.warn({ indent: false, logLevel }, 'Using the lower amount of memory for calculation.');
|
|
35
|
+
}
|
|
36
|
+
return Math.min(nodeMemory, cgroupMemory);
|
|
37
|
+
}
|
|
38
|
+
const procInfo = (0, from_proc_meminfo_1.getFreeMemoryFromProcMeminfo)(logLevel);
|
|
39
|
+
if (procInfo !== null) {
|
|
40
|
+
return Math.min((0, node_os_1.freemem)(), procInfo);
|
|
41
|
+
}
|
|
42
|
+
return (0, node_os_1.freemem)();
|
|
43
|
+
};
|
|
44
|
+
exports.getAvailableMemory = getAvailableMemory;
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.shouldUseParallelEncoding = void 0;
|
|
4
|
-
const get_available_memory_1 = require("./get-available-memory");
|
|
4
|
+
const get_available_memory_1 = require("./memory/get-available-memory");
|
|
5
5
|
const estimateMemoryUsageForPrestitcher = ({ width, height, }) => {
|
|
6
6
|
// Empirically we detected that per 1 million pixels, FFMPEG uses around 1GB of memory, relatively independent of
|
|
7
7
|
// the duration of the video.
|
package/package.json
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
"url": "https://github.com/remotion-dev/remotion/tree/main/packages/renderer"
|
|
4
4
|
},
|
|
5
5
|
"name": "@remotion/renderer",
|
|
6
|
-
"version": "4.0.
|
|
6
|
+
"version": "4.0.296",
|
|
7
7
|
"description": "Render Remotion videos using Node.js or Bun",
|
|
8
8
|
"main": "dist/index.js",
|
|
9
9
|
"types": "dist/index.d.ts",
|
|
@@ -18,8 +18,8 @@
|
|
|
18
18
|
"extract-zip": "2.0.1",
|
|
19
19
|
"source-map": "^0.8.0-beta.0",
|
|
20
20
|
"ws": "8.17.1",
|
|
21
|
-
"remotion": "4.0.
|
|
22
|
-
"@remotion/streaming": "4.0.
|
|
21
|
+
"remotion": "4.0.296",
|
|
22
|
+
"@remotion/streaming": "4.0.296"
|
|
23
23
|
},
|
|
24
24
|
"peerDependencies": {
|
|
25
25
|
"react": ">=16.8.0",
|
|
@@ -33,17 +33,17 @@
|
|
|
33
33
|
"react-dom": "19.0.0",
|
|
34
34
|
"@types/ws": "8.5.10",
|
|
35
35
|
"eslint": "9.19.0",
|
|
36
|
-
"@remotion/
|
|
37
|
-
"@remotion/
|
|
36
|
+
"@remotion/example-videos": "4.0.296",
|
|
37
|
+
"@remotion/eslint-config-internal": "4.0.296"
|
|
38
38
|
},
|
|
39
39
|
"optionalDependencies": {
|
|
40
|
-
"@remotion/compositor-darwin-
|
|
41
|
-
"@remotion/compositor-
|
|
42
|
-
"@remotion/compositor-linux-arm64-
|
|
43
|
-
"@remotion/compositor-
|
|
44
|
-
"@remotion/compositor-
|
|
45
|
-
"@remotion/compositor-
|
|
46
|
-
"@remotion/compositor-linux-
|
|
40
|
+
"@remotion/compositor-darwin-x64": "4.0.296",
|
|
41
|
+
"@remotion/compositor-linux-arm64-gnu": "4.0.296",
|
|
42
|
+
"@remotion/compositor-linux-arm64-musl": "4.0.296",
|
|
43
|
+
"@remotion/compositor-win32-x64-msvc": "4.0.296",
|
|
44
|
+
"@remotion/compositor-darwin-arm64": "4.0.296",
|
|
45
|
+
"@remotion/compositor-linux-x64-gnu": "4.0.296",
|
|
46
|
+
"@remotion/compositor-linux-x64-musl": "4.0.296"
|
|
47
47
|
},
|
|
48
48
|
"keywords": [
|
|
49
49
|
"remotion",
|