class TokenStorage {
initialize(token) {
this._token = null
}
async getStoredToken() {
return this._token ? this._token : await this.refreshToken();
}
async refreshToken() {
this._token = await fetchTokenSomehow();
return this._token;
}
}
let tokenStorage = new TokenStorage();
async function poll() {
let response = await tokenStorage.getStoredToken().then(fetchResponse);
if (isTokenExpired(response)) {
response = await tokenStorage.refreshToken().then(fetchResponse)
}
if (response.ok) {
let result = response.json.result;
if (result && result !== 'reinit-required') processData(result);
setTimeout(poll, 0);
} else {
setTimeout(poll, 1000);
}
}
async function fetchResponse(token) {
try {
let response = await fetch(`http://127.0.0.1:8000/delta?token=${token}`);
let json = await response.json();
return { ok: response.ok, json, status: response.status };
} catch(e) {
return { ok: false, error: e };
}
}
async function fetchTokenSomehow() {
// ...
}
function processData(result) {
// ...
}
function isTokenExpired(response) {
// ...
}
Y2xhc3MgVG9rZW5TdG9yYWdlIHsKICBpbml0aWFsaXplKHRva2VuKSB7CiAgICB0aGlzLl90b2tlbiA9IG51bGwKICB9CgogIGFzeW5jIGdldFN0b3JlZFRva2VuKCkgewogICAgcmV0dXJuIHRoaXMuX3Rva2VuID8gdGhpcy5fdG9rZW4gOiBhd2FpdCB0aGlzLnJlZnJlc2hUb2tlbigpOwogIH0KCiAgYXN5bmMgcmVmcmVzaFRva2VuKCkgewogICAgdGhpcy5fdG9rZW4gPSBhd2FpdCBmZXRjaFRva2VuU29tZWhvdygpOwogICAgcmV0dXJuIHRoaXMuX3Rva2VuOwogIH0KfQoKbGV0IHRva2VuU3RvcmFnZSA9IG5ldyBUb2tlblN0b3JhZ2UoKTsKCmFzeW5jIGZ1bmN0aW9uIHBvbGwoKSB7CiAgbGV0IHJlc3BvbnNlID0gYXdhaXQgdG9rZW5TdG9yYWdlLmdldFN0b3JlZFRva2VuKCkudGhlbihmZXRjaFJlc3BvbnNlKTsKCiAgaWYgKGlzVG9rZW5FeHBpcmVkKHJlc3BvbnNlKSkgewogICAgcmVzcG9uc2UgPSBhd2FpdCB0b2tlblN0b3JhZ2UucmVmcmVzaFRva2VuKCkudGhlbihmZXRjaFJlc3BvbnNlKQogIH0KCiAgaWYgKHJlc3BvbnNlLm9rKSB7CiAgICBsZXQgcmVzdWx0ID0gcmVzcG9uc2UuanNvbi5yZXN1bHQ7CiAgICBpZiAocmVzdWx0ICYmIHJlc3VsdCAhPT0gJ3JlaW5pdC1yZXF1aXJlZCcpIHByb2Nlc3NEYXRhKHJlc3VsdCk7CgogICAgc2V0VGltZW91dChwb2xsLCAwKTsKICB9IGVsc2UgewogICAgc2V0VGltZW91dChwb2xsLCAxMDAwKTsKICB9Cn0KCmFzeW5jIGZ1bmN0aW9uIGZldGNoUmVzcG9uc2UodG9rZW4pIHsKICB0cnkgewogICAgbGV0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goYGh0dHA6Ly8xMjcuMC4wLjE6ODAwMC9kZWx0YT90b2tlbj0ke3Rva2VufWApOwogICAgbGV0IGpzb24gPSBhd2FpdCByZXNwb25zZS5qc29uKCk7CgogICAgcmV0dXJuIHsgb2s6IHJlc3BvbnNlLm9rLCBqc29uLCBzdGF0dXM6IHJlc3BvbnNlLnN0YXR1cyB9OwogIH0gY2F0Y2goZSkgewogICAgcmV0dXJuIHsgb2s6IGZhbHNlLCBlcnJvcjogZSB9OwogIH0KfQoKYXN5bmMgZnVuY3Rpb24gZmV0Y2hUb2tlblNvbWVob3coKSB7CiAgLy8gLi4uCn0KCmZ1bmN0aW9uIHByb2Nlc3NEYXRhKHJlc3VsdCkgewogIC8vIC4uLgp9CgpmdW5jdGlvbiBpc1Rva2VuRXhwaXJlZChyZXNwb25zZSkgewogIC8vIC4uLgp9