UNPKG

@hellocoop/api

Version:

Client API for Hellō https://hello.dev

128 lines (127 loc) 5.37 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.getApiRoute = exports.getAuthApiRoute = exports.getLogoutApiRoute = exports.getLoginApiRoute = exports.getConfig = exports.configure = exports.isConfigured = void 0; const helper_server_1 = require("@hellocoop/helper-server"); const HELLO_DOMAIN = process.env.HELLO_DOMAIN || 'hello.coop'; const HOST = process.env.HOST || process.env.HELLO_HOST || undefined; const _configuration = { production: process.env.NODE_ENV === 'production', routes: { loggedIn: 'not-configured', loggedOut: 'not-configured', }, cookies: { authName: 'hellocoop_auth', oidcName: 'hellocoop_oidc', }, apiRoute: 'not-configured', authApiRoute: 'not-configured', loginApiRoute: 'not-configured', logoutApiRoute: 'not-configured', redirectURI: 'not-configured', // configured only by process.env or .env clientId: '', secret: process.env.COOKIE_SECRET || process.env.HELLO_COOKIE_SECRET, host: HOST, // for internal testing helloDomain: HELLO_DOMAIN, helloWallet: process.env.HELLO_WALLET || 'https://wallet.' + HELLO_DOMAIN, }; exports.isConfigured = false; const pendingConfigurations = []; const confirmPath = (label, path) => { if (!path) return undefined; if (!path.startsWith('/')) { console.error(`${label}=${path} ignored, must start with /`); return undefined; } return path; }; const configure = function (config) { _configuration.clientId = process.env.CLIENT_ID || process.env.HELLO_CLIENT_ID || config.client_id; if (config.routes) { _configuration.routes = { ..._configuration.routes, ...config.routes }; } const apiRoute = process.env.HELLO_API_ROUTE || config.apiRoute || '/api/hellocoop'; _configuration.apiRoute = apiRoute; _configuration.authApiRoute = apiRoute + '?op=auth'; _configuration.loginApiRoute = apiRoute + '?op=login'; _configuration.logoutApiRoute = apiRoute + '?op=logout'; _configuration.routes = { loggedIn: confirmPath('process.env.HELLO_LOGGED_IN', process.env.HELLO_LOGGED_IN) || confirmPath('config routes.loggedIn', config.routes?.loggedIn) || '/', loggedOut: confirmPath('process.env.HELLO_LOGGED_OUT', process.env.HELLO_LOGGED_OUT) || confirmPath('config routes.loggedOut', config.routes?.loggedOut) || '/', error: confirmPath('process.env.HELLO_ERROR', process.env.HELLO_ERROR) || confirmPath('config routes.error', config.routes?.error) }; _configuration.redirectURI = HOST ? `https://${HOST}${apiRoute}` : undefined, _configuration.loginSync = config.loginSync; _configuration.logoutSync = config.logoutSync; if (process.env.HELLO_SCOPES) _configuration.scope = process.env.HELLO_SCOPES.split(' '); else _configuration.scope = config.scope; if (process.env.HELLO_PROVIDER_HINT) _configuration.provider_hint = process.env.HELLO_PROVIDER_HINT.split(' '); else _configuration.provider_hint = config.provider_hint; if (process.env.HELLO_DEBUG) _configuration.logDebug = true; _configuration.sameSiteStrict = !!process.env.HELLO_SAME_SITE_STRICT || config.sameSiteStrict; _configuration.cookieToken = !!process.env.HELLO_COOKIE_TOKEN || config.cookieToken; exports.isConfigured = true; if (!_configuration.clientId) { const message = 'No CLIENT_ID or HELLO_CLIENT_ID was in environment or client_id in hello.config'; _configuration.error = [message]; console.error(message); exports.isConfigured = false; } if (!_configuration.secret) { const message = 'No COOKIE_SECRET or HELLO_COOKIE_SECRET was in environment'; _configuration.error = [message]; console.error(message); exports.isConfigured = false; } if (_configuration.secret && !(0, helper_server_1.checkSecret)(_configuration.secret)) { const message = 'HELLO_COOKIE_SECRET is not 32 hex digits'; _configuration.error = [message]; console.error(message); exports.isConfigured = false; } while (pendingConfigurations.length > 0) { const resolve = pendingConfigurations.pop(); if (resolve) resolve(_configuration); } if (config.logConfig) console.log('\n@hellocoop/api config:\n', JSON.stringify({ config: _configuration }, null, 2)); }; exports.configure = configure; const getConfig = function () { if (!exports.isConfigured) { return new Promise((resolve) => { pendingConfigurations.push(() => resolve(_configuration)); }); } return Promise.resolve(_configuration); }; exports.getConfig = getConfig; const getLoginApiRoute = () => { return _configuration.loginApiRoute; }; exports.getLoginApiRoute = getLoginApiRoute; const getLogoutApiRoute = () => { return _configuration.logoutApiRoute; }; exports.getLogoutApiRoute = getLogoutApiRoute; const getAuthApiRoute = () => { return _configuration.authApiRoute; }; exports.getAuthApiRoute = getAuthApiRoute; const getApiRoute = () => { return _configuration.apiRoute; }; exports.getApiRoute = getApiRoute; exports.default = _configuration;