forked from yandex-cloud/nodejs-sdk
-
Notifications
You must be signed in to change notification settings - Fork 0
/
index.js
93 lines (83 loc) · 2.55 KB
/
index.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
const grpc = require('grpc');
const util = require('./lib/util');
const { EndpointResolver } = require('./lib/endpoint');
const metadata = require('./lib/metadata');
const iam = require('./api/iam/v1');
const op = require('./lib/operation');
async function createIamToken(iamEndpoint, req) {
const ctor = iam.IamTokenService.makeGrpcConstructor();
let client = new ctor(iamEndpoint, grpc.credentials.createSsl());
client = util.pimpServiceInstance(client);
const resp = await client.create(req);
return resp.iamToken;
}
function newTokenCreator(config, iamEndpoint) {
if (config.oauthToken) {
return () => {
return createIamToken(iamEndpoint, {
yandexPassportOauthToken: config.oauthToken,
});
};
}
if (config.iamToken) {
return async () => {
return config.iamToken;
};
}
const tokenService = new metadata.TokenService();
return async () => {
await tokenService.initialize();
return tokenService.getToken();
};
}
function newChannelCredentials(tokenCreator) {
return grpc.credentials.combineChannelCredentials(
grpc.credentials.createSsl(),
grpc.credentials.createFromMetadataGenerator((params, callback) => {
tokenCreator()
.then((token) => {
const md = new grpc.Metadata();
md.set('authorization', 'Bearer ' + token);
return callback(null, md);
})
.catch((e) => {
return callback(e);
});
})
);
}
const defaultConfig = {
pollInterval: 1000,
metadataToken: false,
};
class Session {
constructor(config) {
this.__config = {
...defaultConfig,
...config,
};
this.__endpointResolver = new EndpointResolver();
this.__tokenCreator = newTokenCreator(
this.__config,
this.__endpointResolver.resolve('iam')
);
this.__channelCredentials = newChannelCredentials(this.__tokenCreator);
}
async setEndpoint(newEndpoint) {
await this.__endpointResolver.updateEndpointList(newEndpoint);
}
client(clazz) {
return util.pimpServiceInstance(
new clazz(
this.__endpointResolver.resolve(clazz.__endpointId),
this.__channelCredentials,
undefined,
this.__tokenCreator
)
);
}
}
module.exports = {
Session,
TokenService: metadata.TokenService
};