@yandex-cloud/nodejs-sdk
Version:
Yandex.Cloud NodeJS SDK
81 lines (80 loc) • 4.38 kB
JavaScript
;
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.Session = void 0;
const grpc_js_1 = require("@grpc/grpc-js");
const nice_grpc_1 = require("nice-grpc");
const iam_token_service_1 = require("./token-service/iam-token-service");
const metadata_token_service_1 = require("./token-service/metadata-token-service");
const client_factory_1 = require("./utils/client-factory");
const _1 = require(".");
const service_endpoints_1 = require("./service-endpoints");
const isOAuth = (config) => 'oauthToken' in config;
const isIamToken = (config) => 'iamToken' in config;
const isServiceAccount = (config) => 'serviceAccountJson' in config;
const createIamToken = (iamEndpoint, req) => __awaiter(void 0, void 0, void 0, function* () {
const channel = (0, nice_grpc_1.createChannel)(iamEndpoint, grpc_js_1.credentials.createSsl());
const client = client_factory_1.clientFactory.create(_1.serviceClients.IamTokenServiceClient.service, channel);
const resp = yield client.create(_1.cloudApi.iam.iam_token_service.CreateIamTokenRequest.fromPartial(req));
return resp.iamToken;
});
const newTokenCreator = (config) => {
if (isOAuth(config)) {
return () => {
const iamEndpoint = (0, service_endpoints_1.getServiceClientEndpoint)(_1.serviceClients.IamTokenServiceClient);
return createIamToken(iamEndpoint, {
yandexPassportOauthToken: config.oauthToken,
});
};
}
if (isIamToken(config)) {
const { iamToken } = config;
return () => __awaiter(void 0, void 0, void 0, function* () { return iamToken; });
}
const tokenService = isServiceAccount(config) ? new iam_token_service_1.IamTokenService(config.serviceAccountJson) : new metadata_token_service_1.MetadataTokenService();
return () => __awaiter(void 0, void 0, void 0, function* () { return tokenService.getToken(); });
};
const newChannelCredentials = (tokenCreator, sslOptions, headers) => grpc_js_1.credentials.combineChannelCredentials(grpc_js_1.credentials.createSsl(sslOptions === null || sslOptions === void 0 ? void 0 : sslOptions.rootCerts, sslOptions === null || sslOptions === void 0 ? void 0 : sslOptions.privateKey, sslOptions === null || sslOptions === void 0 ? void 0 : sslOptions.certChain), grpc_js_1.credentials.createFromMetadataGenerator((params, callback) => {
tokenCreator()
.then((token) => {
const md = new grpc_js_1.Metadata();
md.set('authorization', `Bearer ${token}`);
if (headers) {
for (const [key, value] of Object.entries(headers)) {
const lowerCaseKey = key.toLowerCase();
if (lowerCaseKey !== 'authorization') {
md.set(lowerCaseKey, value);
}
}
}
return callback(null, md);
})
.catch((error) => callback(error));
}));
class Session {
constructor(config) {
this.config = Object.assign(Object.assign({}, Session.DEFAULT_CONFIG), config);
this.tokenCreator = newTokenCreator(this.config);
this.channelCredentials = newChannelCredentials(this.tokenCreator, this.config.ssl, this.config.headers);
}
get pollInterval() {
return this.config.pollInterval;
}
client(clientClass, customEndpoint) {
const endpoint = customEndpoint || (0, service_endpoints_1.getServiceClientEndpoint)(clientClass);
const channel = (0, nice_grpc_1.createChannel)(endpoint, this.channelCredentials);
return client_factory_1.clientFactory.create(clientClass.service, channel);
}
}
exports.Session = Session;
Session.DEFAULT_CONFIG = {
pollInterval: 1000,
};