@nexrender/core 1.40.0 → 1.41.0

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nexrender/core",
3
- "version": "1.40.0",
3
+ "version": "1.41.0",
4
4
  "main": "src/index.js",
5
5
  "author": "Inlife",
6
6
  "scripts": {
@@ -30,5 +30,5 @@
30
30
  "publishConfig": {
31
31
  "access": "public"
32
32
  },
33
- "gitHead": "9c2ab173beeed9a531a924841576ee71943817d3"
33
+ "gitHead": "01e3428a9194eb50e40f22a66bb236c9fc70a03c"
34
34
  }
@@ -13,6 +13,7 @@ const defaultPaths = {
13
13
  '/Applications/Adobe After Effects 2020',
14
14
  '/Applications/Adobe After Effects 2021',
15
15
  '/Applications/Adobe After Effects 2022',
16
+ '/Applications/Adobe After Effects 2023',
16
17
  '/Applications/Adobe After Effects CC 2021',
17
18
  '/Applications/Adobe After Effects CC 2022',
18
19
  '/Applications/Adobe After Effects CC 2023',
package/src/index.js CHANGED
@@ -21,6 +21,8 @@ const dorender = require('./tasks/render')
21
21
  const postrender = require('./tasks/actions')('postrender')
22
22
  const cleanup = require('./tasks/cleanup')
23
23
 
24
+ const { create } = require('@nexrender/types/job')
25
+
24
26
  /* place to register all plugins */
25
27
  /* so they will be picked up and resolved by pkg */
26
28
  if (process.env.NEXRENDER_REQUIRE_PLUGINS) {
@@ -103,11 +105,13 @@ const init = (settings) => {
103
105
  }
104
106
 
105
107
 
106
- const render = (job, settings = {}) => {
108
+ const render = (jobConfig, settings = {}) => {
107
109
  if (!settings.__initialized) {
108
110
  settings = init(settings)
109
111
  }
110
112
 
113
+ /* fill default job fields */
114
+ const job = create(jobConfig)
111
115
  return Promise.resolve(job)
112
116
  .then(job => state(job, settings, setup, 'setup'))
113
117
  .then(job => state(job, settings, predownload, 'predownload'))
@@ -14,6 +14,7 @@ const option = (params, name, ...values) => {
14
14
  values.every(value => value !== undefined) ? params.push(name, ...values) : undefined
15
15
  }
16
16
  }
17
+
17
18
  const seconds = (string) => string.split(':')
18
19
  .map((e, i) => (i < 3) ? +e * Math.pow(60, 2 - i) : +e * 10e-6)
19
20
  .reduce((acc, val) => acc + val);
@@ -117,7 +118,7 @@ module.exports = (job, settings) => {
117
118
 
118
119
  // There will be multiple error messages parsed when nexrender throws an error,
119
120
  // but we want only the first
120
- if(matchError !== null && !errorSent){
121
+ if (matchError !== null && !errorSent) {
121
122
  settings.logger.log(`[${job.uid}] rendering reached an error: ${matchError[1]}`);
122
123
  if (job.hasOwnProperty('onRenderError') && typeof job['onRenderError'] == 'function') {
123
124
  job.onRenderError(job, matchError[1]);
@@ -132,6 +133,8 @@ module.exports = (job, settings) => {
132
133
  return new Promise((resolve, reject) => {
133
134
  renderStopwatch = Date.now();
134
135
 
136
+ let timeoutID = 0;
137
+
135
138
  if (settings.debug) {
136
139
  settings.logger.log(`[${job.uid}] spawning aerender process: ${settings.binary} ${params.join(' ')}`);
137
140
  }
@@ -145,7 +148,10 @@ module.exports = (job, settings) => {
145
148
  // env: { PATH: path.dirname(settings.binary) },
146
149
  });
147
150
 
148
- instance.on('error', err => reject(new Error(`Error starting aerender process: ${err}`)));
151
+ instance.on('error', err => {
152
+ clearTimeout(timeoutID);
153
+ return reject(new Error(`Error starting aerender process: ${err}`));
154
+ });
149
155
 
150
156
  instance.stdout.on('data', (data) => {
151
157
  output.push(parse(data.toString('utf8')));
@@ -157,6 +163,17 @@ module.exports = (job, settings) => {
157
163
  (settings.verbose && settings.logger.log(data.toString('utf8')));
158
164
  });
159
165
 
166
+ if (settings.maxRenderTimeout && settings.maxRenderTimeout > 0) {
167
+ const timeout = 1000 * settings.maxRenderTimeout;
168
+ timeoutID = setTimeout(
169
+ () => {
170
+ reject(new Error(`Maximum rendering time exceeded`));
171
+ instance.kill('SIGINT');
172
+ },
173
+ timeout
174
+ );
175
+ }
176
+
160
177
  /* on finish (code 0 - success, other - error) */
161
178
  instance.on('close', (code) => {
162
179
 
@@ -169,6 +186,7 @@ module.exports = (job, settings) => {
169
186
  settings.logger.log(fs.readFileSync(logPath, 'utf8'))
170
187
  }
171
188
 
189
+ clearTimeout(timeoutID);
172
190
  return reject(new Error(outputStr || 'aerender.exe failed to render the output into the file due to an unknown reason'));
173
191
  }
174
192
 
@@ -179,6 +197,7 @@ module.exports = (job, settings) => {
179
197
 
180
198
  /* resolve job without checking if file exists, or its size for image sequences */
181
199
  if (settings.skipRender || job.template.imageSequence || ['jpeg', 'jpg', 'png'].indexOf(outputFile) !== -1) {
200
+ clearTimeout(timeoutID);
182
201
  return resolve(job)
183
202
  }
184
203
 
@@ -205,6 +224,7 @@ module.exports = (job, settings) => {
205
224
  settings.logger.log(fs.readFileSync(logPath, 'utf8'))
206
225
  }
207
226
 
227
+ clearTimeout(timeoutID);
208
228
  return reject(new Error(`Couldn't find a result file: ${outputFile}`))
209
229
  }
210
230
 
@@ -215,6 +235,7 @@ module.exports = (job, settings) => {
215
235
  settings.logger.log(`[${job.uid}] Warning: output file size is less than 1000 bytes (${stats.size} bytes), be advised that file is corrupted, or rendering is still being finished`)
216
236
  }
217
237
 
238
+ clearTimeout(timeoutID);
218
239
  resolve(job)
219
240
  });
220
241
 
@@ -3,15 +3,12 @@ const path = require('path')
3
3
  const mkdirp = require('mkdirp')
4
4
  const assert = require('assert')
5
5
 
6
- const { create, validate } = require('@nexrender/types/job')
6
+ const { validate } = require('@nexrender/types/job')
7
7
 
8
8
  /**
9
9
  * This task creates working directory for current job
10
10
  */
11
11
  module.exports = (job, settings) => {
12
- /* fill default job fields */
13
- job = create(job)
14
-
15
12
  settings.logger.log(`[${job.uid}] setting up job...`);
16
13
 
17
14
  try {