if-electricitymaps
Version:
Electricity Maps plugin for Impact Framework.
98 lines • 11.1 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.ElectricityMapsAPI = void 0;
const dotenv = require("dotenv");
const axios_1 = require("axios");
const utils_1 = require("@grnsft/if-core/utils");
const helpers_1 = require("../util/helpers");
const { AuthorizationError, APIRequestError } = utils_1.ERRORS;
const ElectricityMapsAPI = () => {
const BASE_URL = 'https://api.electricitymap.org/v3';
let authToken = '';
const errorBuilder = (0, helpers_1.buildErrorMessage)(exports.ElectricityMapsAPI.name);
/**
* Loads ENV and validates credentials
*/
const authenticate = async () => {
dotenv.config();
const token = loadToken();
const isAuthorized = await getZones(token);
if (!isAuthorized) {
throw new AuthorizationError(errorBuilder({
message: 'Invalid API token',
scope: 'authorization',
}));
}
authToken = token;
};
/**
* Validates that the `EMAPS_TOKEN` env var is set.
*/
const loadToken = () => {
const token = process.env.EMAPS_TOKEN;
if (token) {
return String(token);
}
throw new AuthorizationError(errorBuilder({
message: 'Invalid credentials provided. The `EMAPS_TOKEN` ENV variable is required',
}));
};
/**
* Fetches zones list to test authentication
*/
const getZones = async (token) => {
const url = `${BASE_URL}/zones`;
let isAuthenticated = true;
await axios_1.default
.get(url, {
headers: {
'auth-token': token,
},
})
.catch(error => {
if (error.response.data &&
error.response.data.error === 'Token is invalid') {
isAuthenticated = false;
}
else {
throw new APIRequestError(errorBuilder({
message: `Error from Electricity Maps API. ${JSON.stringify(error?.message || error)}`,
}));
}
});
return isAuthenticated;
};
const getCarbonIntensity = async (params) => {
const url = `${BASE_URL}/carbon-intensity/past-range`;
const response = await axios_1.default
.get(url, {
params: params,
headers: {
'auth-token': authToken,
},
})
.catch(error => {
throw new APIRequestError(errorBuilder({
message: `Error from Electricity Maps API. ${JSON.stringify(error?.message || error)}`,
}));
});
if (response.status !== 200) {
throw new APIRequestError(errorBuilder({
message: `Error: ${JSON.stringify(response.status)}`,
}));
}
const data = response.data.data;
return data.map(carbonIntensityData => {
return {
datetime: carbonIntensityData.datetime,
value: carbonIntensityData.carbonIntensity,
};
});
};
return {
authenticate,
getCarbonIntensity,
};
};
exports.ElectricityMapsAPI = ElectricityMapsAPI;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWxlY3RyaWNpdHltYXBzLWFwaS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9saWIvZWxlY3RyaWNpdHltYXBzL2VsZWN0cmljaXR5bWFwcy1hcGkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsaUNBQWlDO0FBQ2pDLGlDQUEwQjtBQUUxQixpREFBNkM7QUFDN0MsNkNBQWtEO0FBSWxELE1BQU0sRUFBQyxrQkFBa0IsRUFBRSxlQUFlLEVBQUMsR0FBRyxjQUFNLENBQUM7QUFFOUMsTUFBTSxrQkFBa0IsR0FBRyxHQUFHLEVBQUU7SUFDckMsTUFBTSxRQUFRLEdBQUcsbUNBQW1DLENBQUM7SUFDckQsSUFBSSxTQUFTLEdBQUcsRUFBRSxDQUFDO0lBRW5CLE1BQU0sWUFBWSxHQUFHLElBQUEsMkJBQWlCLEVBQUMsMEJBQWtCLENBQUMsSUFBSSxDQUFDLENBQUM7SUFFaEU7O09BRUc7SUFDSCxNQUFNLFlBQVksR0FBRyxLQUFLLElBQW1CLEVBQUU7UUFDN0MsTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBRWhCLE1BQU0sS0FBSyxHQUFHLFNBQVMsRUFBRSxDQUFDO1FBQzFCLE1BQU0sWUFBWSxHQUFHLE1BQU0sUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBRTNDLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztZQUNsQixNQUFNLElBQUksa0JBQWtCLENBQzFCLFlBQVksQ0FBQztnQkFDWCxPQUFPLEVBQUUsbUJBQW1CO2dCQUM1QixLQUFLLEVBQUUsZUFBZTthQUN2QixDQUFDLENBQ0gsQ0FBQztRQUNKLENBQUM7UUFDRCxTQUFTLEdBQUcsS0FBSyxDQUFDO0lBQ3BCLENBQUMsQ0FBQztJQUVGOztPQUVHO0lBQ0gsTUFBTSxTQUFTLEdBQUcsR0FBVyxFQUFFO1FBQzdCLE1BQU0sS0FBSyxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsV0FBVyxDQUFDO1FBRXRDLElBQUksS0FBSyxFQUFFLENBQUM7WUFDVixPQUFPLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN2QixDQUFDO1FBRUQsTUFBTSxJQUFJLGtCQUFrQixDQUMxQixZQUFZLENBQUM7WUFDWCxPQUFPLEVBQ0wsMEVBQTBFO1NBQzdFLENBQUMsQ0FDSCxDQUFDO0lBQ0osQ0FBQyxDQUFDO0lBRUY7O09BRUc7SUFDSCxNQUFNLFFBQVEsR0FBRyxLQUFLLEVBQUUsS0FBYSxFQUFvQixFQUFFO1FBQ3pELE1BQU0sR0FBRyxHQUFHLEdBQUcsUUFBUSxRQUFRLENBQUM7UUFDaEMsSUFBSSxlQUFlLEdBQUcsSUFBSSxDQUFDO1FBRTNCLE1BQU0sZUFBSzthQUNSLEdBQUcsQ0FBQyxHQUFHLEVBQUU7WUFDUixPQUFPLEVBQUU7Z0JBQ1AsWUFBWSxFQUFFLEtBQUs7YUFDcEI7U0FDRixDQUFDO2FBQ0QsS0FBSyxDQUFDLEtBQUssQ0FBQyxFQUFFO1lBQ2IsSUFDRSxLQUFLLENBQUMsUUFBUSxDQUFDLElBQUk7Z0JBQ25CLEtBQUssQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEtBQUssS0FBSyxrQkFBa0IsRUFDaEQsQ0FBQztnQkFDRCxlQUFlLEdBQUcsS0FBSyxDQUFDO1lBQzFCLENBQUM7aUJBQU0sQ0FBQztnQkFDTixNQUFNLElBQUksZUFBZSxDQUN2QixZQUFZLENBQUM7b0JBQ1gsT0FBTyxFQUFFLG9DQUFvQyxJQUFJLENBQUMsU0FBUyxDQUN6RCxLQUFLLEVBQUUsT0FBTyxJQUFJLEtBQUssQ0FDeEIsRUFBRTtpQkFDSixDQUFDLENBQ0gsQ0FBQztZQUNKLENBQUM7UUFDSCxDQUFDLENBQUMsQ0FBQztRQUVMLE9BQU8sZUFBZSxDQUFDO0lBQ3pCLENBQUMsQ0FBQztJQUVGLE1BQU0sa0JBQWtCLEdBQUcsS0FBSyxFQUM5QixNQUE0QyxFQUNuQixFQUFFO1FBQzNCLE1BQU0sR0FBRyxHQUFHLEdBQUcsUUFBUSw4QkFBOEIsQ0FBQztRQUV0RCxNQUFNLFFBQVEsR0FBRyxNQUFNLGVBQUs7YUFDekIsR0FBRyxDQUFDLEdBQUcsRUFBRTtZQUNSLE1BQU0sRUFBRSxNQUFNO1lBQ2QsT0FBTyxFQUFFO2dCQUNQLFlBQVksRUFBRSxTQUFTO2FBQ3hCO1NBQ0YsQ0FBQzthQUNELEtBQUssQ0FBQyxLQUFLLENBQUMsRUFBRTtZQUNiLE1BQU0sSUFBSSxlQUFlLENBQ3ZCLFlBQVksQ0FBQztnQkFDWCxPQUFPLEVBQUUsb0NBQW9DLElBQUksQ0FBQyxTQUFTLENBQ3pELEtBQUssRUFBRSxPQUFPLElBQUksS0FBSyxDQUN4QixFQUFFO2FBQ0osQ0FBQyxDQUNILENBQUM7UUFDSixDQUFDLENBQUMsQ0FBQztRQUVMLElBQUksUUFBUSxDQUFDLE1BQU0sS0FBSyxHQUFHLEVBQUUsQ0FBQztZQUM1QixNQUFNLElBQUksZUFBZSxDQUN2QixZQUFZLENBQUM7Z0JBQ1gsT0FBTyxFQUFFLFVBQVUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLEVBQUU7YUFDckQsQ0FBQyxDQUNILENBQUM7UUFDSixDQUFDO1FBRUQsTUFBTSxJQUFJLEdBQW1CLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDO1FBRWhELE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxtQkFBbUIsQ0FBQyxFQUFFO1lBQ3BDLE9BQU87Z0JBQ0wsUUFBUSxFQUFFLG1CQUFtQixDQUFDLFFBQVE7Z0JBQ3RDLEtBQUssRUFBRSxtQkFBbUIsQ0FBQyxlQUFlO2FBQzNDLENBQUM7UUFDSixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQztJQUVGLE9BQU87UUFDTCxZQUFZO1FBQ1osa0JBQWtCO0tBQ25CLENBQUM7QUFDSixDQUFDLENBQUM7QUF6SFcsUUFBQSxrQkFBa0Isc0JBeUg3QiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIGRvdGVudiBmcm9tICdkb3RlbnYnO1xuaW1wb3J0IGF4aW9zIGZyb20gJ2F4aW9zJztcblxuaW1wb3J0IHtFUlJPUlN9IGZyb20gJ0Bncm5zZnQvaWYtY29yZS91dGlscyc7XG5pbXBvcnQge2J1aWxkRXJyb3JNZXNzYWdlfSBmcm9tICcuLi91dGlsL2hlbHBlcnMnO1xuXG5pbXBvcnQge0VsZWN0cmljaXR5TWFwc0NhcmJvbkludGVuc2l0eVBhcmFtc30gZnJvbSAnLi90eXBlcyc7XG5pbXBvcnQge0tleVZhbHVlUGFpcn0gZnJvbSAnLi4vdHlwZXMvY29tbW9uJztcbmNvbnN0IHtBdXRob3JpemF0aW9uRXJyb3IsIEFQSVJlcXVlc3RFcnJvcn0gPSBFUlJPUlM7XG5cbmV4cG9ydCBjb25zdCBFbGVjdHJpY2l0eU1hcHNBUEkgPSAoKSA9PiB7XG4gIGNvbnN0IEJBU0VfVVJMID0gJ2h0dHBzOi8vYXBpLmVsZWN0cmljaXR5bWFwLm9yZy92Myc7XG4gIGxldCBhdXRoVG9rZW4gPSAnJztcblxuICBjb25zdCBlcnJvckJ1aWxkZXIgPSBidWlsZEVycm9yTWVzc2FnZShFbGVjdHJpY2l0eU1hcHNBUEkubmFtZSk7XG5cbiAgLyoqXG4gICAqIExvYWRzIEVOViBhbmQgdmFsaWRhdGVzIGNyZWRlbnRpYWxzXG4gICAqL1xuICBjb25zdCBhdXRoZW50aWNhdGUgPSBhc3luYyAoKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgZG90ZW52LmNvbmZpZygpO1xuXG4gICAgY29uc3QgdG9rZW4gPSBsb2FkVG9rZW4oKTtcbiAgICBjb25zdCBpc0F1dGhvcml6ZWQgPSBhd2FpdCBnZXRab25lcyh0b2tlbik7XG5cbiAgICBpZiAoIWlzQXV0aG9yaXplZCkge1xuICAgICAgdGhyb3cgbmV3IEF1dGhvcml6YXRpb25FcnJvcihcbiAgICAgICAgZXJyb3JCdWlsZGVyKHtcbiAgICAgICAgICBtZXNzYWdlOiAnSW52YWxpZCBBUEkgdG9rZW4nLFxuICAgICAgICAgIHNjb3BlOiAnYXV0aG9yaXphdGlvbicsXG4gICAgICAgIH0pXG4gICAgICApO1xuICAgIH1cbiAgICBhdXRoVG9rZW4gPSB0b2tlbjtcbiAgfTtcblxuICAvKipcbiAgICogVmFsaWRhdGVzIHRoYXQgdGhlIGBFTUFQU19UT0tFTmAgZW52IHZhciBpcyBzZXQuXG4gICAqL1xuICBjb25zdCBsb2FkVG9rZW4gPSAoKTogc3RyaW5nID0+IHtcbiAgICBjb25zdCB0b2tlbiA9IHByb2Nlc3MuZW52LkVNQVBTX1RPS0VOO1xuXG4gICAgaWYgKHRva2VuKSB7XG4gICAgICByZXR1cm4gU3RyaW5nKHRva2VuKTtcbiAgICB9XG5cbiAgICB0aHJvdyBuZXcgQXV0aG9yaXphdGlvbkVycm9yKFxuICAgICAgZXJyb3JCdWlsZGVyKHtcbiAgICAgICAgbWVzc2FnZTpcbiAgICAgICAgICAnSW52YWxpZCBjcmVkZW50aWFscyBwcm92aWRlZC4gVGhlIGBFTUFQU19UT0tFTmAgRU5WIHZhcmlhYmxlIGlzIHJlcXVpcmVkJyxcbiAgICAgIH0pXG4gICAgKTtcbiAgfTtcblxuICAvKipcbiAgICogRmV0Y2hlcyB6b25lcyBsaXN0IHRvIHRlc3QgYXV0aGVudGljYXRpb25cbiAgICovXG4gIGNvbnN0IGdldFpvbmVzID0gYXN5bmMgKHRva2VuOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+ID0+IHtcbiAgICBjb25zdCB1cmwgPSBgJHtCQVNFX1VSTH0vem9uZXNgO1xuICAgIGxldCBpc0F1dGhlbnRpY2F0ZWQgPSB0cnVlO1xuXG4gICAgYXdhaXQgYXhpb3NcbiAgICAgIC5nZXQodXJsLCB7XG4gICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICAnYXV0aC10b2tlbic6IHRva2VuLFxuICAgICAgICB9LFxuICAgICAgfSlcbiAgICAgIC5jYXRjaChlcnJvciA9PiB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICBlcnJvci5yZXNwb25zZS5kYXRhICYmXG4gICAgICAgICAgZXJyb3IucmVzcG9uc2UuZGF0YS5lcnJvciA9PT0gJ1Rva2VuIGlzIGludmFsaWQnXG4gICAgICAgICkge1xuICAgICAgICAgIGlzQXV0aGVudGljYXRlZCA9IGZhbHNlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRocm93IG5ldyBBUElSZXF1ZXN0RXJyb3IoXG4gICAgICAgICAgICBlcnJvckJ1aWxkZXIoe1xuICAgICAgICAgICAgICBtZXNzYWdlOiBgRXJyb3IgZnJvbSBFbGVjdHJpY2l0eSBNYXBzIEFQSS4gJHtKU09OLnN0cmluZ2lmeShcbiAgICAgICAgICAgICAgICBlcnJvcj8ubWVzc2FnZSB8fCBlcnJvclxuICAgICAgICAgICAgICApfWAsXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgcmV0dXJuIGlzQXV0aGVudGljYXRlZDtcbiAgfTtcblxuICBjb25zdCBnZXRDYXJib25JbnRlbnNpdHkgPSBhc3luYyAoXG4gICAgcGFyYW1zOiBFbGVjdHJpY2l0eU1hcHNDYXJib25JbnRlbnNpdHlQYXJhbXNcbiAgKTogUHJvbWlzZTxLZXlWYWx1ZVBhaXJbXT4gPT4ge1xuICAgIGNvbnN0IHVybCA9IGAke0JBU0VfVVJMfS9jYXJib24taW50ZW5zaXR5L3Bhc3QtcmFuZ2VgO1xuXG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBheGlvc1xuICAgICAgLmdldCh1cmwsIHtcbiAgICAgICAgcGFyYW1zOiBwYXJhbXMsXG4gICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICAnYXV0aC10b2tlbic6IGF1dGhUb2tlbixcbiAgICAgICAgfSxcbiAgICAgIH0pXG4gICAgICAuY2F0Y2goZXJyb3IgPT4ge1xuICAgICAgICB0aHJvdyBuZXcgQVBJUmVxdWVzdEVycm9yKFxuICAgICAgICAgIGVycm9yQnVpbGRlcih7XG4gICAgICAgICAgICBtZXNzYWdlOiBgRXJyb3IgZnJvbSBFbGVjdHJpY2l0eSBNYXBzIEFQSS4gJHtKU09OLnN0cmluZ2lmeShcbiAgICAgICAgICAgICAgZXJyb3I/Lm1lc3NhZ2UgfHwgZXJyb3JcbiAgICAgICAgICAgICl9YCxcbiAgICAgICAgICB9KVxuICAgICAgICApO1xuICAgICAgfSk7XG5cbiAgICBpZiAocmVzcG9uc2Uuc3RhdHVzICE9PSAyMDApIHtcbiAgICAgIHRocm93IG5ldyBBUElSZXF1ZXN0RXJyb3IoXG4gICAgICAgIGVycm9yQnVpbGRlcih7XG4gICAgICAgICAgbWVzc2FnZTogYEVycm9yOiAke0pTT04uc3RyaW5naWZ5KHJlc3BvbnNlLnN0YXR1cyl9YCxcbiAgICAgICAgfSlcbiAgICAgICk7XG4gICAgfVxuXG4gICAgY29uc3QgZGF0YTogS2V5VmFsdWVQYWlyW10gPSByZXNwb25zZS5kYXRhLmRhdGE7XG5cbiAgICByZXR1cm4gZGF0YS5tYXAoY2FyYm9uSW50ZW5zaXR5RGF0YSA9PiB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBkYXRldGltZTogY2FyYm9uSW50ZW5zaXR5RGF0YS5kYXRldGltZSxcbiAgICAgICAgdmFsdWU6IGNhcmJvbkludGVuc2l0eURhdGEuY2FyYm9uSW50ZW5zaXR5LFxuICAgICAgfTtcbiAgICB9KTtcbiAgfTtcblxuICByZXR1cm4ge1xuICAgIGF1dGhlbnRpY2F0ZSxcbiAgICBnZXRDYXJib25JbnRlbnNpdHksXG4gIH07XG59O1xuIl19