UNPKG

if-electricitymaps

Version:

Electricity Maps plugin for Impact Framework.

98 lines 11.1 kB
"use strict"; 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