It's actually a pretty simple patch to write. I wrote one myself a while ago, because I was tired of dealing with callbacks. It also allows for nice wrappers to do things like unlock an account, do some stuff, then lock the account again, e.g.:
var readFile = Promise.denodeify(fs.readFile);
function whileUnlocked(web3, account, pwfile, task) {
return readFile(pwfile, 'utf8')
.then(function(pw) {
return web3.personal.unlockAccount(account, pw.trim())
.then(task)
.then(function() {
return web3.personal.lockAccount(account);
});
});
}
See: https://github.com/DeviateFish/web3.js/pull/1
Note that I wrote this some time ago, and this solution could definitely be improved with newer language features, or without using the Promise polyfill library I'm using (e.g. enforcing newer versions of node), so your mileage may vary.
[E] I should add that this approach doesn't touch the filters API, since that's not strictly compatible with the Promise style. Promises are generally about things that are done asynchronously once, not (potentially) multiple times. I was unsure how to best address that discrepancy, so I left them alone.