UNPKG

1.73 kBJavaScriptView Raw
1var mkdirp = require('mkdirp');
2var path = require('path');
3var spawn = require('child_process').spawn;
4
5module.exports = function (avail, configDir, cb) {
6 var pending = avail.length;
7 if (pending === 0) cb();
8
9 avail.forEach(function (br) {
10 if (br.type === 'firefox' && br.profile) {
11 createFirefox(br.command, function (err, profile) {
12 if (err) return cb(err);
13 br.profile = profile;
14 if (--pending === 0) cb();
15 });
16 }
17 else if (br.profile) {
18 var dir = br.profile = makeDir(br.name, br.version);
19 mkdirp(dir, function (err) {
20 if (err) return cb(err);
21 if (--pending === 0) cb();
22 });
23 }
24 else if (--pending === 0) cb()
25 });
26
27 function makeDir (name, v) {
28 var d = name + '-' + v + '_' + Math.random().toString(16).slice(2);
29 return path.join(configDir, d);
30 }
31};
32
33function createFirefox (name, cb) {
34 var profileName = 'browser-launcher-' + Math.random().toString(16).slice(2);
35 var args = [ '--no-remote', '-CreateProfile', profileName ];
36 var ps = spawn(name, args);
37
38 var data = '';
39 ps.stdout.on('data', function (buf) { data += buf });
40 ps.stderr.on('data', function (buf) { data += buf });
41
42 ps.on('exit', function (code) {
43 if (code !== 0) {
44 return cb(name + ' ' + args.join(' ')
45 + ' exited with code ' + code + ': ' + data
46 );
47 }
48 var m = data.match(/^Success: created profile '[^']+' at '([^']+)/m);
49 if (!m) cb('Unexpected data: ' + data)
50 else cb(null, { name : profileName, file : m[1] })
51 });
52}