You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

124 lines
3.0 KiB

// Copyright 2013 The Obvious Corporation.
/**
* @fileoverview Helpers made available via require('phantomjs') once package is
* installed.
*/
var fs = require('fs')
var path = require('path')
var spawn = require('child_process').spawn
var Promise = require('es6-promise').Promise
/**
* Where the phantom binary can be found.
* @type {string}
*/
try {
var location = require('./location')
exports.path = path.resolve(__dirname, location.location)
exports.platform = location.platform
exports.arch = location.arch
} catch(e) {
// Must be running inside install script.
exports.path = null
}
/**
* The version of phantomjs installed by this package.
* @type {number}
*/
exports.version = '2.1.1'
/**
* Returns a clean path that helps avoid `which` finding bin files installed
* by NPM for this repo.
* @param {string} path
* @return {string}
*/
exports.cleanPath = function (path) {
return path
.replace(/:[^:]*node_modules[^:]*/g, '')
.replace(/(^|:)\.\/bin(\:|$)/g, ':')
.replace(/^:+/, '')
.replace(/:+$/, '')
}
// Make sure the binary is executable. For some reason doing this inside
// install does not work correctly, likely due to some NPM step.
if (exports.path) {
try {
// avoid touching the binary if it's already got the correct permissions
var st = fs.statSync(exports.path)
var mode = st.mode | parseInt('0555', 8)
if (mode !== st.mode) {
fs.chmodSync(exports.path, mode)
}
} catch (e) {
// Just ignore error if we don't have permission.
// We did our best. Likely because phantomjs was already installed.
}
}
/**
* Executes a script or just runs PhantomJS
*/
exports.exec = function () {
var args = Array.prototype.slice.call(arguments)
return spawn(exports.path, args)
}
/**
* Runs PhantomJS with provided options
* @example
* // handy with WebDriver
* phantomjs.run('--webdriver=4444').then(program => {
* // do something
* program.kill()
* })
* @returns {Promise} the process of PhantomJS
*/
exports.run = function () {
var args = arguments
return new Promise(function (resolve, reject) {
try {
var program = exports.exec.apply(null, args)
var isFirst = true
var stderr = ''
program.stdout.on('data', function () {
// This detects PhantomJS instance get ready.
if (!isFirst) return
isFirst = false
resolve(program)
})
program.stderr.on('data', function (data) {
stderr = stderr + data.toString('utf8')
})
program.on('error', function (err) {
if (!isFirst) return
isFirst = false
reject(err)
})
program.on('exit', function (code) {
if (!isFirst) return
isFirst = false
if (code == 0) {
// PhantomJS doesn't use exit codes correctly :(
if (stderr.indexOf('Error:') == 0) {
reject(new Error(stderr))
} else {
resolve(program)
}
} else {
reject(new Error('Exit code: ' + code))
}
})
} catch (err) {
reject(err)
}
})
}