cxplot 0.1.25 → 0.1.26

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 (2) hide show
  1. package/lib/hash.js +17 -1
  2. package/package.json +1 -1
package/lib/hash.js CHANGED
@@ -19,12 +19,28 @@ function hashCorpus(entries, opts) {
19
19
  settle: (opts && opts.settle) || 'full',
20
20
  figures: {}, failed: []
21
21
  };
22
+ // Each figure renders in its own fresh Chromium, which can crash natively (SIGSEGV)
23
+ // on a transient container hiccup -- a flake, not a figure change. Retry a rejected
24
+ // render a few times (a new browser each attempt) so one crash does not fail the whole
25
+ // determinism manifest. The hash is deterministic, so a clean attempt reproduces it;
26
+ // a genuine (reproducible) failure still surfaces after the attempts are spent.
27
+ var MAX_ATTEMPTS = opts && opts.renderAttempts > 0 ? opts.renderAttempts : 3;
28
+ function renderWithRetry(spec, key, attempt) {
29
+ return render.renderFigure(spec, opts).then(null, function (err) {
30
+ if (attempt < MAX_ATTEMPTS) {
31
+ process.stderr.write('retry ' + key + ' attempt ' + (attempt + 1) + '/' + MAX_ATTEMPTS +
32
+ ' after render crash: ' + String((err && err.message) || err).slice(0, 80) + '\n');
33
+ return renderWithRetry(spec, key, attempt + 1);
34
+ }
35
+ throw err;
36
+ });
37
+ }
22
38
  var i = 0;
23
39
  function next() {
24
40
  if (i >= entries.length) return Promise.resolve(manifest);
25
41
  var e = entries[i++];
26
42
  var key = path.basename(e.file);
27
- return render.renderFigure(e.spec, opts).then(function (res) {
43
+ return renderWithRetry(e.spec, key, 1).then(function (res) {
28
44
  manifest.engineVersion = manifest.engineVersion || res.engineVersion;
29
45
  manifest.engineSource = manifest.engineSource || res.engineSource;
30
46
  manifest.figures[key] = { sha256: sha256(res.png), width: res.width, height: res.height, settled: res.settled, waitedMs: res.waitedMs, errors: res.errors };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "cxplot",
3
- "version": "0.1.25",
3
+ "version": "0.1.26",
4
4
  "description": "cxplot \u2014 validate, render, hash and export CanvasXpress figure specs with the same engine the browser runs",
5
5
  "bin": {
6
6
  "cxplot": "bin/cxplot.js"