clever-tools
Version:
Command Line Interface for Clever Cloud.
81 lines (74 loc) • 2.59 kB
JavaScript
import { addOauthHeader } from '@clevercloud/client/esm/oauth.js';
import { prefixUrl } from '@clevercloud/client/esm/prefix-url.js';
import { request } from '@clevercloud/client/esm/request.fetch.js';
import { subtle as cryptoSuble } from 'node:crypto';
import { addOauthHeaderPlaintext } from '../clever-client/auth-bridge.js';
import { styleText } from '../lib/style-text.js';
import { Logger } from '../logger.js';
import { conf, loadOAuthConf } from './configuration.js';
// Required for @clevercloud/client with "old" Node.js
if (globalThis.crypto == null) {
globalThis.crypto = {
subtle: cryptoSuble,
};
}
async function loadTokens() {
const tokens = await loadOAuthConf();
return {
OAUTH_CONSUMER_KEY: conf.OAUTH_CONSUMER_KEY,
OAUTH_CONSUMER_SECRET: conf.OAUTH_CONSUMER_SECRET,
API_OAUTH_TOKEN: tokens.token,
API_OAUTH_TOKEN_SECRET: tokens.secret,
};
}
export async function sendToApi(requestParams) {
const tokens = await loadTokens();
return Promise.resolve(requestParams)
.then(prefixUrl(conf.API_HOST))
.then(addOauthHeader(tokens))
.then((requestParams) => {
Logger.debug(
`${requestParams.method.toUpperCase()} ${requestParams.url} ? ${JSON.stringify(requestParams.queryParams)}`,
);
return requestParams;
})
.then(request)
.catch(processError);
}
export async function sendToAuthBridge(requestParams) {
const tokens = await loadTokens();
return Promise.resolve(requestParams)
.then(prefixUrl(conf.AUTH_BRIDGE_HOST))
.then(addOauthHeaderPlaintext(tokens))
.then((requestParams) => {
Logger.debug(
`${requestParams.method.toUpperCase()} ${requestParams.url} ? ${JSON.stringify(requestParams.queryParams)}`,
);
return requestParams;
})
.then(request)
.catch(processError);
}
export function processError(error) {
const code = error.code ?? error?.cause?.code;
if (code === 'EAI_AGAIN') {
throw new Error('Cannot reach the Clever Cloud API, please check your internet connection.', { cause: error });
}
if (code === 'ECONNRESET') {
throw new Error('The connection to the Clever Cloud API was closed abruptly, please try again.', { cause: error });
}
if (error?.response?.status === 401) {
throw new Error(
`You're not logged in, use ${styleText('red', 'clever login')} command to connect to your Clever Cloud account`,
{ cause: error },
);
}
throw error;
}
export async function getHostAndTokens() {
const tokens = await loadTokens();
return {
apiHost: conf.API_HOST,
tokens,
};
}