194 lines
4.8 KiB
JavaScript
194 lines
4.8 KiB
JavaScript
;(function () {
|
|
'use strict';
|
|
|
|
var Vue = window.Vue;
|
|
var Telebit = window.TELEBIT;
|
|
var api = {};
|
|
|
|
/*
|
|
function safeFetch(url, opts) {
|
|
var controller = new AbortController();
|
|
var tok = setTimeout(function () {
|
|
controller.abort();
|
|
}, 4000);
|
|
if (!opts) {
|
|
opts = {};
|
|
}
|
|
opts.signal = controller.signal;
|
|
return window.fetch(url, opts).finally(function () {
|
|
clearTimeout(tok);
|
|
});
|
|
}
|
|
*/
|
|
|
|
api.config = function apiConfig() {
|
|
return Telebit.reqLocalAsync({
|
|
url: "/api/config"
|
|
, method: "GET"
|
|
}).then(function (resp) {
|
|
var json = resp.body;
|
|
appData.config = json;
|
|
return json;
|
|
});
|
|
};
|
|
api.status = function apiStatus() {
|
|
return Telebit.reqLocalAsync({ url: "/api/status", method: "GET" }).then(function (resp) {
|
|
var json = resp.body;
|
|
appData.status = json;
|
|
return json;
|
|
});
|
|
};
|
|
api.initialize = function apiInitialize() {
|
|
var opts = {
|
|
url: "/api/init"
|
|
, method: "POST"
|
|
, headers: {
|
|
'Content-Type': 'application/json'
|
|
}
|
|
, body: JSON.stringify({
|
|
foo: 'bar'
|
|
})
|
|
};
|
|
return Telebit.reqLocalAsync(opts).then(function (resp) {
|
|
var json = resp.body;
|
|
appData.initResult = json;
|
|
window.alert("Error: [success] " + JSON.stringify(json, null, 2));
|
|
return json;
|
|
}).catch(function (err) {
|
|
window.alert("Error: [init] " + (err.message || JSON.stringify(err, null, 2)));
|
|
});
|
|
};
|
|
|
|
// TODO test for internet connectivity (and telebit connectivity)
|
|
var DEFAULT_RELAY = 'telebit.cloud';
|
|
var BETA_RELAY = 'telebit.ppl.family';
|
|
var TELEBIT_RELAYS = [
|
|
DEFAULT_RELAY
|
|
, BETA_RELAY
|
|
];
|
|
var PRODUCTION_ACME = 'https://acme-v02.api.letsencrypt.org/directory';
|
|
var STAGING_ACME = 'https://acme-staging-v02.api.letsencrypt.org/directory';
|
|
var appData = {
|
|
config: null
|
|
, status: null
|
|
, init: {
|
|
teletos: true
|
|
, letos: true
|
|
, notifications: "important"
|
|
, relay: DEFAULT_RELAY
|
|
, telemetry: true
|
|
, acmeServer: PRODUCTION_ACME
|
|
}
|
|
, http: null
|
|
, tcp: null
|
|
, ssh: null
|
|
, views: {
|
|
section: {
|
|
setup: false
|
|
, advanced: false
|
|
}
|
|
}
|
|
};
|
|
var telebitState = {};
|
|
var appMethods = {
|
|
initialize: function () {
|
|
console.log("call initialize");
|
|
if (!appData.init.relay) {
|
|
appData.init.relay = DEFAULT_RELAY;
|
|
}
|
|
appData.init.relay = appData.init.relay.toLowerCase();
|
|
telebitState = { relay: appData.init.relay };
|
|
return Telebit.api.directory(telebitState).then(function (dir) {
|
|
if (!dir.api_host) {
|
|
window.alert("Error: '" + telebitState.relay + "' does not appear to be a valid telebit service");
|
|
return;
|
|
}
|
|
if (-1 !== TELEBIT_RELAYS.indexOf(appData.init.relay)) {
|
|
if (!telebitState.config) { telebitState.config = {}; }
|
|
if (!telebitState.config.relay) { telebitState.config.relay = telebitState.relay; }
|
|
telebitState.config.email = appData.init.email;
|
|
telebitState.config._otp = Telebit.otp();
|
|
return Telebit.authorize(telebitState).then(function () {
|
|
console.log('1 api.init...');
|
|
return api.initialize();
|
|
}).catch(function (err) {
|
|
console.error(err);
|
|
window.alert("Error: [authorize] " + (err.message || JSON.stringify(err, null, 2)));
|
|
});
|
|
} else {
|
|
changeState('advanced');
|
|
}
|
|
}).catch(function (err) {
|
|
console.error(err);
|
|
window.alert("Error: [directory] " + (err.message || JSON.stringify(err, null, 2)));
|
|
});
|
|
}
|
|
, advance: function () {
|
|
console.log('2 api.init...');
|
|
return api.initialize();
|
|
}
|
|
, productionAcme: function () {
|
|
console.log("prod acme:");
|
|
appData.init.acmeServer = PRODUCTION_ACME;
|
|
console.log(appData.init.acmeServer);
|
|
}
|
|
, stagingAcme: function () {
|
|
console.log("staging acme:");
|
|
appData.init.acmeServer = STAGING_ACME;
|
|
console.log(appData.init.acmeServer);
|
|
}
|
|
, defaultRelay: function () {
|
|
appData.init.relay = DEFAULT_RELAY;
|
|
}
|
|
, betaRelay: function () {
|
|
appData.init.relay = BETA_RELAY;
|
|
}
|
|
, defaultRhubarb: function () {
|
|
appData.init.rhubarb = DEFAULT_RELAY;
|
|
}
|
|
, betaRhubarb: function () {
|
|
appData.init.rhubarb = BETA_RELAY;
|
|
}
|
|
};
|
|
var appStates = {
|
|
setup: function () {
|
|
appData.views.section = { setup: true };
|
|
}
|
|
, advanced: function () {
|
|
appData.views.section = { advanced: true };
|
|
}
|
|
};
|
|
|
|
function changeState(newstate) {
|
|
location.hash = '#/' + newstate + '/';
|
|
}
|
|
window.addEventListener('hashchange', setState, false);
|
|
function setState(/*ev*/) {
|
|
//ev.oldURL
|
|
//ev.newURL
|
|
var parts = location.hash.substr(1).replace(/^\//, '').replace(/\/$/, '').split('/');
|
|
var fn = appStates;
|
|
parts.forEach(function (s) {
|
|
console.log("state:", s);
|
|
fn = fn[s];
|
|
});
|
|
fn();
|
|
//appMethods.states[newstate]();
|
|
}
|
|
|
|
new Vue({
|
|
el: ".v-app"
|
|
, data: appData
|
|
, methods: appMethods
|
|
});
|
|
|
|
|
|
api.config();
|
|
api.status().then(function () {
|
|
changeState('setup');
|
|
setState();
|
|
});
|
|
|
|
window.api = api;
|
|
}());
|