Skip to content

Commit dc7fe97

Browse files
committed
💥 Switch to Promise based interface
Migration Guide: Instead of taking a callback, the exposed functions now returns a Promise.
1 parent 3cf9716 commit dc7fe97

File tree

7 files changed

+164
-275
lines changed

7 files changed

+164
-275
lines changed

impl/darwin.js

Lines changed: 11 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -1,51 +1,21 @@
1-
const { spawn } = require('child_process')
1+
const execa = require('execa')
22

3-
const osascript = function (cmd, cb) {
4-
let ret = ''
5-
let err = null
6-
const p = spawn('osascript', ['-e', cmd])
7-
8-
p.stdout.on('data', function (data) {
9-
ret += data
10-
})
11-
12-
p.stderr.on('data', function (data) {
13-
err = new Error('Apple Script Error: ' + data)
14-
})
15-
16-
p.on('close', function () {
17-
cb(err, ret.trim())
18-
})
3+
function osascript (cmd) {
4+
return execa.stdout('osascript', ['-e', cmd], { preferLocal: false })
195
}
206

21-
module.exports.getVolume = function (cb) {
22-
osascript('output volume of (get volume settings)', function (err, vol) {
23-
if (err) {
24-
cb(err)
25-
} else {
26-
cb(null, parseInt(vol, 10))
27-
}
28-
})
7+
exports.getVolume = function () {
8+
return osascript('output volume of (get volume settings)').then(vol => parseInt(vol, 10))
299
}
3010

31-
module.exports.setVolume = function (val, cb) {
32-
osascript('set volume output volume ' + val, function (err) {
33-
cb(err)
34-
})
11+
exports.setVolume = function (val) {
12+
return osascript('set volume output volume ' + val).then(() => undefined)
3513
}
3614

37-
module.exports.getMuted = function (cb) {
38-
osascript('output muted of (get volume settings)', function (err, mute) {
39-
if (err) {
40-
cb(err)
41-
} else {
42-
cb(null, (mute === 'true'))
43-
}
44-
})
15+
exports.getMuted = function () {
16+
return osascript('output muted of (get volume settings)').then(mute => (mute === 'true'))
4517
}
4618

47-
module.exports.setMuted = function (val, cb) {
48-
osascript('set volume ' + (val ? 'with' : 'without') + ' output muted', function (err) {
49-
cb(err)
50-
})
19+
exports.setMuted = function (val) {
20+
return osascript('set volume ' + (val ? 'with' : 'without') + ' output muted').then(() => undefined)
5121
}

impl/linux.js

Lines changed: 36 additions & 84 deletions
Original file line numberDiff line numberDiff line change
@@ -1,104 +1,56 @@
1-
const { spawn } = require('child_process')
1+
const execa = require('execa')
22

3-
const amixer = function (args, cb) {
4-
let ret = ''
5-
let err = null
6-
const p = spawn('amixer', args)
3+
function amixer (...args) {
4+
return execa.stdout('amixer', args, { preferLocal: false })
5+
}
6+
7+
let defaultDeviceCache = null
8+
const reDefaultDevice = /Simple mixer control '([a-z0-9 -]+)',[0-9]+/i
79

8-
p.stdout.on('data', function (data) {
9-
ret += data
10-
})
10+
function parseDefaultDevice (data) {
11+
const result = reDefaultDevice.exec(data)
1112

12-
p.stderr.on('data', function (data) {
13-
err = new Error('Alsa Mixer Error: ' + data)
14-
})
13+
if (result === null) {
14+
throw new Error('Alsa Mixer Error: failed to parse output')
15+
}
1516

16-
p.on('close', function () {
17-
cb(err, ret.trim())
18-
})
17+
return result[1]
1918
}
2019

21-
const reDefaultDevice = /Simple mixer control '([a-z0-9 -]+)',[0-9]+/i
22-
let defaultDeviceCache = null
23-
const defaultDevice = function (cb) {
24-
if (defaultDeviceCache === null) {
25-
amixer([], function (err, data) {
26-
if (err) {
27-
cb(err)
28-
} else {
29-
let res = reDefaultDevice.exec(data)
30-
if (res === null) {
31-
cb(new Error('Alsa Mixer Error: failed to parse output'))
32-
} else {
33-
defaultDeviceCache = res[1]
34-
cb(null, defaultDeviceCache)
35-
}
36-
}
37-
})
38-
} else {
39-
cb(null, defaultDeviceCache)
40-
}
20+
function getDefaultDevice () {
21+
if (defaultDeviceCache) return Promise.resolve(defaultDeviceCache)
22+
23+
return amixer().then(data => (defaultDeviceCache = parseDefaultDevice(data)))
4124
}
4225

4326
const reInfo = /[a-z][a-z ]*: Playback [0-9-]+ \[([0-9]+)%\] (?:[[0-9.-]+dB\] )?\[(on|off)\]/i
44-
const getInfo = function (cb) {
45-
defaultDevice(function (err, dev) {
46-
if (err) {
47-
cb(err)
48-
} else {
49-
amixer(['get', dev], function (err, data) {
50-
if (err) {
51-
cb(err)
52-
} else {
53-
let res = reInfo.exec(data)
54-
if (res === null) {
55-
cb(new Error('Alsa Mixer Error: failed to parse output'))
56-
} else {
57-
cb(null, {
58-
volume: parseInt(res[1], 10),
59-
muted: (res[2] === 'off')
60-
})
61-
}
62-
}
63-
})
64-
}
65-
})
27+
28+
function parseInfo (data) {
29+
const result = reInfo.exec(data)
30+
31+
if (result === null) {
32+
throw new Error('Alsa Mixer Error: failed to parse output')
33+
}
34+
35+
return { volume: parseInt(result[1], 10), muted: (result[2] === 'off') }
36+
}
37+
38+
function getInfo () {
39+
return getDefaultDevice().then(dev => amixer('get', dev)).then(data => parseInfo(data))
6640
}
6741

68-
module.exports.getVolume = function (cb) {
69-
getInfo(function (err, obj) {
70-
if (err) {
71-
cb(err)
72-
} else {
73-
cb(null, obj.volume)
74-
}
75-
})
42+
exports.getVolume = function () {
43+
return getInfo().then(info => info.volume)
7644
}
7745

78-
module.exports.setVolume = function (val, cb) {
79-
defaultDevice(function (err, dev) {
80-
if (err) {
81-
cb(err)
82-
} else {
83-
amixer(['set', dev, val + '%'], function (err) {
84-
cb(err)
85-
})
86-
}
87-
})
46+
module.exports.setVolume = function (val) {
47+
return getDefaultDevice().then(dev => amixer('set', dev, val + '%')).then(() => undefined)
8848
}
8949

9050
module.exports.getMuted = function (cb) {
91-
getInfo(function (err, obj) {
92-
if (err) {
93-
cb(err)
94-
} else {
95-
cb(null, obj.muted)
96-
}
97-
})
51+
return getInfo().then(info => info.muted)
9852
}
9953

10054
module.exports.setMuted = function (val, cb) {
101-
amixer(['set', 'PCM', (val ? 'mute' : 'unmute')], function (err) {
102-
cb(err)
103-
})
55+
return amixer('set', 'PCM', (val ? 'mute' : 'unmute')).then(() => undefined)
10456
}

impl/windows/index.js

Lines changed: 16 additions & 69 deletions
Original file line numberDiff line numberDiff line change
@@ -1,85 +1,32 @@
1-
const { spawn } = require('child_process')
1+
const execa = require('execa')
22
const path = require('path')
33

4-
const executable = path.join(__dirname, 'adjust_get_current_system_volume_vista_plus.exe')
4+
const executablePath = path.join(__dirname, 'adjust_get_current_system_volume_vista_plus.exe')
55

6-
const runProgram = function (args, done) {
7-
args = args === '' ? [] : args.toString().split(' ')
8-
done = done || function () {}
9-
10-
let ret = ''
11-
let err = null
12-
const p = spawn(executable, args)
13-
14-
p.stdout.on('data', function (data) {
15-
ret += data
16-
})
17-
18-
p.stderr.on('data', function (data) {
19-
err = new Error('Windows Script Error: ' + data)
20-
})
21-
22-
p.on('close', function () {
23-
if (err) return done(err)
24-
25-
return done(null, ret.trim())
26-
})
6+
function runProgram (...args) {
7+
return execa.stdout(executablePath, args)
278
}
289

29-
const getVolumeInfo = function (done) {
30-
done = done || function () {}
31-
32-
runProgram('', function (err, strArgs) {
33-
if (err) return done(err)
10+
function getVolumeInfo () {
11+
return runProgram().then((data) => {
12+
const args = data.split(' ')
3413

35-
const args = strArgs.split(' ')
36-
const info = {
37-
volume: parseInt(args[0]),
38-
isMuted: !!parseInt(args[1])
39-
}
40-
41-
return done(null, info)
14+
return { volume: parseInt(args[0], 10), isMuted: Boolean(parseInt(args[1], 10)) }
4215
})
4316
}
4417

45-
module.exports.getVolume = function (done) {
46-
done = done || function () {}
47-
48-
getVolumeInfo(function (err, info) {
49-
if (err) return done(err)
50-
51-
return done(null, info.volume)
52-
})
18+
exports.getVolume = function () {
19+
return getVolumeInfo().then(info => info.volume)
5320
}
5421

55-
module.exports.setVolume = function (val, done) {
56-
val = val || 0
57-
done = done || function () {}
58-
59-
runProgram(val, function (err) {
60-
if (err) return done(err)
61-
62-
return done(null)
63-
})
22+
exports.setVolume = function (val) {
23+
return runProgram(String(val)).then(() => undefined)
6424
}
6525

66-
module.exports.getMuted = function (done) {
67-
done = done || function () {}
68-
69-
getVolumeInfo(function (err, info) {
70-
if (err) return done(err)
71-
72-
return done(null, info.isMuted)
73-
})
26+
exports.getMuted = function () {
27+
return getVolumeInfo().then(info => info.isMuted)
7428
}
7529

76-
module.exports.setMuted = function (val, done) {
77-
val = val ? 'mute' : 'unmute'
78-
done = done || function () {}
79-
80-
runProgram(val, function (err) {
81-
if (err) return done(err)
82-
83-
return done(null)
84-
})
30+
exports.setMuted = function (val) {
31+
return runProgram(val ? 'mute' : 'unmute').then(() => undefined)
8532
}

index.js

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -16,16 +16,16 @@ switch (os.type()) {
1616
}
1717

1818
module.exports = {
19-
setVolume (volume, cb) {
20-
impl.setVolume(volume, cb)
19+
setVolume (volume) {
20+
return impl.setVolume(volume)
2121
},
22-
getVolume (cb) {
23-
impl.getVolume(cb)
22+
getVolume () {
23+
return impl.getVolume()
2424
},
25-
setMuted (muted, cb) {
26-
impl.setMuted(muted, cb)
25+
setMuted (muted) {
26+
return impl.setMuted(muted)
2727
},
28-
getMuted (cb) {
29-
impl.getMuted(cb)
28+
getMuted () {
29+
return impl.getMuted()
3030
}
3131
}

0 commit comments

Comments
 (0)