cast-web-api
Version:
Web API for Google Cast enabled devices.
196 lines (175 loc) • 7.6 kB
JavaScript
const jsonfile = require('jsonfile');
const OAuth2 = new (require('google-auth-library'))().OAuth2;
class AssistantSetup {
static checkSetup() {
return new Promise(function(resolve, reject) {
let setup = {id: false, secret: false, token: false};
AssistantSetup.readClientSecretJSON()
.then(existing =>{
if (existing.installed) {
if (existing.installed.client_secret){
setup.secret = true;
}
if (existing.installed.client_id){
setup.id = true;
}
}
let file = AssistantSetup.getAbsolutePath()+'/config/tokens.json';
jsonfile.readFile(file, function(err, obj) {
if (obj) {
if (obj.access_token) {
setup.token = true;
}
resolve(setup);
}
if (err) {
console.log('read tokens.json, error: '+err);
resolve(setup);
}
});
})
.catch(error =>{
console.log('readClientSecretJSON error: '+error);
resolve(setup);
})
});
}
static setSetup(setup) {
if (setup.id || setup.secret) {
this.setClient(setup.id, setup.secret)
.then(value => {
if (setup.token) {
this.setToken(setup.token);
}
})
.catch(error => {
console.log("setSetup error: "+error);
})
} else if (setup.token) {
this.setToken(setup.token);
}
}
static setClient(clientID=false, clientSecret=false) {
return new Promise((resolve, reject) => {
AssistantSetup.readClientSecretJSON()
.then(existing =>{
if (clientID) {
existing.installed.client_id = clientID;
}
if (clientSecret) {
existing.installed.client_secret = clientSecret;
}
existing.installed.redirect_uris = ["urn:ietf:wg:oauth:2.0:oob"];
// existing.installed.redirect_uris = ["http://127.0.0.1:3000/assistant/setup/token/auto/"];
AssistantSetup.writeClientSecretJSON(existing).then(value => {
resolve(true);
});
})
.catch(error =>{
reject(error);
})
})
}
// static setClientSecret(clientSecret) {
// AssistantSetup.readClientSecretJSON()
// .then(existing =>{
// existing.installed.redirect_uris = ["urn:ietf:wg:oauth:2.0:oob"];
// // existing.installed.redirect_uris = ["http://127.0.0.1:3000/assistant/setup/token/auto/"];
// AssistantSetup.writeClientSecretJSON(existing);
// })
// .catch(error =>{
// console.log('setClientSecret error: '+error);
// })
// }
static writeClientSecretJSON(object) {
return new Promise(resolve => {
let file = AssistantSetup.getAbsolutePath()+'/config/client_secret.json';
jsonfile.writeFileSync(file, object, function (err) {
if (err) {
console.log('writeClientSecretJSON error: '+err)
}
});
resolve(true);
});
}
static readClientSecretJSON() {
return new Promise( function(resolve, reject) {
let file = AssistantSetup.getAbsolutePath()+'/config/client_secret.json';
jsonfile.readFile(file, function(err, obj) {
if (obj) {
resolve(obj);
}
if (err) {
console.log('readClientSecretJSON error: '+err);
resolve({ installed:{} });
}
});
});
}
static setToken(oAuthCode) {
return new Promise( function(resolve, reject) {
AssistantSetup.readClientSecretJSON()
.then(existing =>{
if (existing.installed.client_id && existing.installed.client_secret && existing.installed.redirect_uris) {
try {
const oauthClient = new OAuth2(existing.installed.client_id, existing.installed.client_secret, existing.installed.redirect_uris[0]);
console.log('oAuthCode: '+oAuthCode);
oauthClient.getToken(oAuthCode, (error, tokens) => {
if (error) {
reject('Couldnot get tokens, error: '+error);
}
console.log("tokens: "+tokens);
AssistantSetup.writeToken(tokens);
resolve({response: 'ok'});
});
} catch (e) {
reject('setToken exception: '+e);
}
} else {
reject('setToken missing clientID / clientSecret');
}
})
.catch(error =>{
reject('setToken error: '+error);
})
});
}
static writeToken(token) {
let file = AssistantSetup.getAbsolutePath()+'/config/tokens.json';
console.log('writeToken: '+JSON.stringify(token));
jsonfile.writeFile(file, token, function(err) {
console.log('writeToken error: '+err);
})
}
static generateTokenUrl() {
return new Promise( function(resolve, reject) {
AssistantSetup.readClientSecretJSON()
.then(existing =>{
if (existing.installed.client_id && existing.installed.client_secret && existing.installed.redirect_uris) {
try {
const oauthClient = new OAuth2(existing.installed.client_id, existing.installed.client_secret, existing.installed.redirect_uris[0]);
let url = oauthClient.generateAuthUrl({
access_type: 'offline',
scope: ['https://www.googleapis.com/auth/assistant-sdk-prototype'],
});
resolve(url);
} catch(e) {
reject('generateTokenUrl exception: '+e);
}
} else {
reject('generateToken missing clientID / clientSecret');
}
})
.catch(error =>{
console.log('generateTokenUrl error: '+error);
reject(error);
})
});
}
static getAbsolutePath(){ //TODO: get rid of redundancy in /lib/config
let path = (require.resolve('../../api.js').substring(0, ( require.resolve('../../api.js').length -7 ) ));
// console.log(path);
return path;
}
}
module.exports = AssistantSetup;