@metaplay/metaplay-auth 1.1.6 → 1.1.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +11 -0
- package/README.md +35 -2
- package/dist/auth.js +47 -32
- package/dist/auth.js.map +1 -1
- package/dist/deployment.js +16 -6
- package/dist/deployment.js.map +1 -1
- package/dist/index.js +40 -37
- package/dist/index.js.map +1 -1
- package/dist/secret_store.js.map +1 -1
- package/dist/src/auth.js +335 -0
- package/dist/src/auth.js.map +1 -0
- package/dist/src/deployment.js +218 -0
- package/dist/src/deployment.js.map +1 -0
- package/dist/src/index.js +215 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/logging.js +18 -0
- package/dist/src/logging.js.map +1 -0
- package/dist/src/secret_store.js +79 -0
- package/dist/src/secret_store.js.map +1 -0
- package/dist/src/stackapi.js +111 -0
- package/dist/src/stackapi.js.map +1 -0
- package/dist/src/utils.js +41 -0
- package/dist/src/utils.js.map +1 -0
- package/dist/stackapi.js +8 -13
- package/dist/stackapi.js.map +1 -1
- package/dist/tests/utils.spec.js +18 -0
- package/dist/tests/utils.spec.js.map +1 -0
- package/package.json +8 -8
- package/src/auth.ts +59 -36
- package/src/deployment.ts +18 -6
- package/src/index.ts +40 -38
- package/src/secret_store.ts +2 -2
- package/src/stackapi.ts +8 -13
|
@@ -0,0 +1,215 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { Command } from 'commander';
|
|
3
|
+
import { loginAndSaveTokens, machineLoginAndSaveTokens, extendCurrentSession, loadTokens, removeTokens } from './auth.js';
|
|
4
|
+
import { StackAPI } from './stackapi.js';
|
|
5
|
+
import { checkGameServerDeployment } from './deployment.js';
|
|
6
|
+
import { setLogLevel } from './logging.js';
|
|
7
|
+
import { exit } from 'process';
|
|
8
|
+
const program = new Command();
|
|
9
|
+
program
|
|
10
|
+
.name('metaplay-auth')
|
|
11
|
+
.description('Authenticate with Metaplay and get AWS and Kubernetes credentials for game servers.')
|
|
12
|
+
.version('1.1.7')
|
|
13
|
+
.option('-d, --debug', 'enable debug output')
|
|
14
|
+
.hook('preAction', (thisCommand) => {
|
|
15
|
+
// Handle debug flag for all commands.
|
|
16
|
+
const opts = thisCommand.opts();
|
|
17
|
+
if (opts.debug) {
|
|
18
|
+
setLogLevel(0);
|
|
19
|
+
}
|
|
20
|
+
else {
|
|
21
|
+
setLogLevel(10);
|
|
22
|
+
}
|
|
23
|
+
});
|
|
24
|
+
program.command('login')
|
|
25
|
+
.description('login to your Metaplay account')
|
|
26
|
+
.action(async () => {
|
|
27
|
+
await loginAndSaveTokens();
|
|
28
|
+
});
|
|
29
|
+
program.command('machine-login')
|
|
30
|
+
.description('login to the Metaplay cloud using a machine account (using credentials in environment variable METAPLAY_CREDENTIALS)')
|
|
31
|
+
.option('--dev-credentials', 'machine user credentials to use, only for dev purposes, use METAPLAY_CREDENTIALS env variable for better safety!')
|
|
32
|
+
.action(async (options) => {
|
|
33
|
+
// Get credentials from command line or from METAPLAY_CREDENTIALS environment variable
|
|
34
|
+
let credentials;
|
|
35
|
+
if (options.devCredentials) {
|
|
36
|
+
credentials = options.devCredentials;
|
|
37
|
+
}
|
|
38
|
+
else {
|
|
39
|
+
credentials = process.env.METAPLAY_CREDENTIALS;
|
|
40
|
+
if (!credentials || credentials === '') {
|
|
41
|
+
throw new Error('Unable to find the credentials, the environment variable METAPLAY_CREDENTIALS is not defined!');
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
// Parse the clientId and clientSecret from the credentials (separate by a '+' character)
|
|
45
|
+
// \note We can't be certain that the secret does not contain pluses so split at the first occurrence
|
|
46
|
+
const splitOffset = credentials.indexOf('+');
|
|
47
|
+
if (splitOffset === -1) {
|
|
48
|
+
throw new Error('Invalid format for credentials, you should copy-paste the value from the developer portal verbatim');
|
|
49
|
+
}
|
|
50
|
+
const clientId = credentials.substring(0, splitOffset);
|
|
51
|
+
const clientSecret = credentials.substring(splitOffset + 1);
|
|
52
|
+
// Login with machine user and save the tokens
|
|
53
|
+
await machineLoginAndSaveTokens(clientId, clientSecret);
|
|
54
|
+
});
|
|
55
|
+
program.command('logout')
|
|
56
|
+
.description('log out of your Metaplay account')
|
|
57
|
+
.action(async () => {
|
|
58
|
+
console.log('Logging out by removing locally stored tokens...');
|
|
59
|
+
try {
|
|
60
|
+
// TODO: Could check if the tokens existed in the first place and print something nicer if doing an unnecessary operation?
|
|
61
|
+
await removeTokens();
|
|
62
|
+
console.log('Done! You are now logged out.');
|
|
63
|
+
}
|
|
64
|
+
catch (error) {
|
|
65
|
+
if (error instanceof Error) {
|
|
66
|
+
console.error(`Error logging out: ${error.message}`);
|
|
67
|
+
}
|
|
68
|
+
exit(1);
|
|
69
|
+
}
|
|
70
|
+
});
|
|
71
|
+
program.command('show-tokens')
|
|
72
|
+
.description('show loaded tokens')
|
|
73
|
+
.hook('preAction', async () => {
|
|
74
|
+
await extendCurrentSession();
|
|
75
|
+
})
|
|
76
|
+
.action(async (options) => {
|
|
77
|
+
try {
|
|
78
|
+
// TODO: Could detect if not logged in and fail more gracefully?
|
|
79
|
+
const tokens = await loadTokens();
|
|
80
|
+
console.log(tokens);
|
|
81
|
+
}
|
|
82
|
+
catch (error) {
|
|
83
|
+
if (error instanceof Error) {
|
|
84
|
+
console.error(`Error showing tokens: ${error.message}`);
|
|
85
|
+
}
|
|
86
|
+
exit(1);
|
|
87
|
+
}
|
|
88
|
+
});
|
|
89
|
+
program.command('get-kubeconfig')
|
|
90
|
+
.description('get kubeconfig for deployment')
|
|
91
|
+
.argument('[gameserver]', 'address of gameserver (e.g. idler-develop.p1.metaplay.io)')
|
|
92
|
+
.option('-s, --stack-api <stack-api-base-path>', 'explicit stack api (e.g. https://infra.p1.metaplay.io/stackapi/)')
|
|
93
|
+
.option('-o, --organization <organization>', 'organization name (e.g. metaplay)')
|
|
94
|
+
.option('-p, --project <project>', 'project name (e.g. idler)')
|
|
95
|
+
.option('-e, --environment <environment>', 'environment name (e.g. develop)')
|
|
96
|
+
.hook('preAction', async () => {
|
|
97
|
+
await extendCurrentSession();
|
|
98
|
+
})
|
|
99
|
+
.action(async (gameserver, options) => {
|
|
100
|
+
try {
|
|
101
|
+
const tokens = await loadTokens();
|
|
102
|
+
if (!gameserver && !(options.organization && options.project && options.environment)) {
|
|
103
|
+
throw new Error('Could not determine a deployment to fetch the KubeConfigs from. You need to specify either a gameserver or an organization, project, and environment');
|
|
104
|
+
}
|
|
105
|
+
const stackApi = new StackAPI(tokens.access_token);
|
|
106
|
+
if (options.stackApi) {
|
|
107
|
+
stackApi.stack_api_base_uri = options.stackApi;
|
|
108
|
+
}
|
|
109
|
+
const payload = gameserver ? { gameserver } : { organization: options.organization, project: options.project, environment: options.environment };
|
|
110
|
+
const credentials = await stackApi.getKubeConfig(payload);
|
|
111
|
+
console.log(credentials);
|
|
112
|
+
}
|
|
113
|
+
catch (error) {
|
|
114
|
+
if (error instanceof Error) {
|
|
115
|
+
console.error(`Error getting KubeConfig: ${error.message}`);
|
|
116
|
+
}
|
|
117
|
+
exit(1);
|
|
118
|
+
}
|
|
119
|
+
});
|
|
120
|
+
program.command('get-aws-credentials')
|
|
121
|
+
.description('get AWS credentials for deployment')
|
|
122
|
+
.argument('[gameserver]', 'address of gameserver (e.g. idler-develop.p1.metaplay.io)')
|
|
123
|
+
.option('-s, --stack-api <stack-api-base-path>', 'explicit stack api (e.g. https://infra.p1.metaplay.io/stackapi/)')
|
|
124
|
+
.option('-o, --organization <organization>', 'organization name (e.g. metaplay)')
|
|
125
|
+
.option('-p, --project <project>', 'project name (e.g. idler)')
|
|
126
|
+
.option('-e, --environment <environment>', 'environment name (e.g. develop)')
|
|
127
|
+
.option('-f, --format <format>', 'output format (json or env)', 'json')
|
|
128
|
+
.hook('preAction', async () => {
|
|
129
|
+
await extendCurrentSession();
|
|
130
|
+
})
|
|
131
|
+
.action(async (gameserver, options) => {
|
|
132
|
+
try {
|
|
133
|
+
if (options.format !== 'json' && options.format !== 'env') {
|
|
134
|
+
throw new Error('Invalid format; must be one of json or env');
|
|
135
|
+
}
|
|
136
|
+
const tokens = await loadTokens();
|
|
137
|
+
if (!gameserver && !(options.organization && options.project && options.environment)) {
|
|
138
|
+
throw new Error('Could not determine a deployment to fetch the AWS credentials from. You need to specify either a gameserver or an organization, project, and environment');
|
|
139
|
+
}
|
|
140
|
+
const stackApi = new StackAPI(tokens.access_token);
|
|
141
|
+
if (options.stackApi) {
|
|
142
|
+
stackApi.stack_api_base_uri = options.stackApi;
|
|
143
|
+
}
|
|
144
|
+
const payload = gameserver ? { gameserver } : { organization: options.organization, project: options.project, environment: options.environment };
|
|
145
|
+
const credentials = await stackApi.getAwsCredentials(payload);
|
|
146
|
+
if (options.format === 'env') {
|
|
147
|
+
console.log(`export AWS_ACCESS_KEY_ID=${credentials.AccessKeyId}`);
|
|
148
|
+
console.log(`export AWS_SECRET_ACCESS_KEY=${credentials.SecretAccessKey}`);
|
|
149
|
+
console.log(`export AWS_SESSION_TOKEN=${credentials.SessionToken}`);
|
|
150
|
+
}
|
|
151
|
+
else {
|
|
152
|
+
console.log(JSON.stringify({
|
|
153
|
+
...credentials,
|
|
154
|
+
Version: 1 // this is needed to comply with `aws` format for external credential providers
|
|
155
|
+
}));
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
catch (error) {
|
|
159
|
+
if (error instanceof Error) {
|
|
160
|
+
console.error(`Error getting AWS credentials: ${error.message}`);
|
|
161
|
+
}
|
|
162
|
+
exit(1);
|
|
163
|
+
}
|
|
164
|
+
});
|
|
165
|
+
program.command('get-environment')
|
|
166
|
+
.description('get environment details for deployment')
|
|
167
|
+
.argument('[gameserver]', 'address of gameserver (e.g. idler-develop.p1.metaplay.io)')
|
|
168
|
+
.option('-s, --stack-api <stack-api-base-path>', 'explicit stack api (e.g. https://infra.p1.metaplay.io/stackapi/)')
|
|
169
|
+
.option('-o, --organization <organization>', 'organization name (e.g. metaplay)')
|
|
170
|
+
.option('-p, --project <project>', 'project name (e.g. idler)')
|
|
171
|
+
.option('-e, --environment <environment>', 'environment name (e.g. develop)')
|
|
172
|
+
.hook('preAction', async () => {
|
|
173
|
+
await extendCurrentSession();
|
|
174
|
+
})
|
|
175
|
+
.action(async (gameserver, options) => {
|
|
176
|
+
try {
|
|
177
|
+
const tokens = await loadTokens();
|
|
178
|
+
if (!gameserver && !(options.organization && options.project && options.environment)) {
|
|
179
|
+
throw new Error('Could not determine a deployment to fetch environment details from. You need to specify either a gameserver or an organization, project, and environment');
|
|
180
|
+
}
|
|
181
|
+
const stackApi = new StackAPI(tokens.access_token);
|
|
182
|
+
if (options.stackApi) {
|
|
183
|
+
stackApi.stack_api_base_uri = options.stackApi;
|
|
184
|
+
}
|
|
185
|
+
const payload = gameserver ? { gameserver } : { organization: options.organization, project: options.project, environment: options.environment };
|
|
186
|
+
const environment = await stackApi.getEnvironmentDetails(payload);
|
|
187
|
+
console.log(JSON.stringify(environment));
|
|
188
|
+
}
|
|
189
|
+
catch (error) {
|
|
190
|
+
if (error instanceof Error) {
|
|
191
|
+
console.error(`Error getting environment details: ${error.message}`);
|
|
192
|
+
}
|
|
193
|
+
exit(1);
|
|
194
|
+
}
|
|
195
|
+
});
|
|
196
|
+
program.command('check-deployment')
|
|
197
|
+
.description('[experimental] check that a game server was successfully deployed, or print out useful error messages in case of failure')
|
|
198
|
+
.argument('[namespace]', 'kubernetes namespace of the deployment')
|
|
199
|
+
.action(async (namespace) => {
|
|
200
|
+
setLogLevel(0);
|
|
201
|
+
try {
|
|
202
|
+
if (!namespace) {
|
|
203
|
+
throw new Error('Must specify value for argument "namespace"');
|
|
204
|
+
}
|
|
205
|
+
// Run the checks and exit with success/failure exitCode depending on result
|
|
206
|
+
const exitCode = await checkGameServerDeployment(namespace);
|
|
207
|
+
exit(exitCode);
|
|
208
|
+
}
|
|
209
|
+
catch (error) {
|
|
210
|
+
console.error(`Failed to check deployment status: ${error}`);
|
|
211
|
+
exit(1);
|
|
212
|
+
}
|
|
213
|
+
});
|
|
214
|
+
void program.parseAsync();
|
|
215
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { Logger } from 'tslog';
|
|
2
|
+
/**
|
|
3
|
+
* The logger instance. Use this to log messages.
|
|
4
|
+
*/
|
|
5
|
+
export const logger = new Logger({
|
|
6
|
+
overwrite: {
|
|
7
|
+
transportFormatted(logMetaMarkup, logArgs, logErrors, settings) {
|
|
8
|
+
console.error(`${logMetaMarkup} ${logArgs.join('')} ${logErrors.join('')}`);
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
});
|
|
12
|
+
/**
|
|
13
|
+
* Set the log level. We use 0 and 10.
|
|
14
|
+
*/
|
|
15
|
+
export function setLogLevel(level) {
|
|
16
|
+
logger.settings.minLevel = level;
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=logging.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logging.js","sourceRoot":"","sources":["../../src/logging.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,OAAO,CAAA;AAE9B;;GAEG;AACH,MAAM,CAAC,MAAM,MAAM,GAAG,IAAI,MAAM,CAAC;IAC/B,SAAS,EAAE;QACT,kBAAkB,CAAE,aAAa,EAAE,OAAO,EAAE,SAAS,EAAE,QAAQ;YAC7D,OAAO,CAAC,KAAK,CAAC,GAAG,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,CAAA;QAC7E,CAAC;KACF;CACF,CAAC,CAAA;AAEF;;GAEG;AACH,MAAM,UAAU,WAAW,CAAE,KAAa;IACxC,MAAM,CAAC,QAAQ,CAAC,QAAQ,GAAG,KAAK,CAAA;AAClC,CAAC"}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import { promises as fs } from 'fs';
|
|
2
|
+
import { join } from 'path';
|
|
3
|
+
import { randomBytes, createCipheriv, createDecipheriv, scryptSync } from 'crypto';
|
|
4
|
+
import { homedir } from 'os';
|
|
5
|
+
import { logger } from './logging.js';
|
|
6
|
+
const filePath = process.env.METAPLAY_AUTH_FILE ?? join(homedir(), '.metaplay_auth.json');
|
|
7
|
+
const algorithm = 'aes-256-cbc';
|
|
8
|
+
const password = process.env.METAPLAY_AUTH_PASSWORD ?? '';
|
|
9
|
+
const salt = process.env.METAPLAY_AUTH_SALT ?? 'saltysalt';
|
|
10
|
+
async function loadSecrets() {
|
|
11
|
+
try {
|
|
12
|
+
logger.debug(`Loading secrets from ${filePath}...`);
|
|
13
|
+
await fs.access(filePath);
|
|
14
|
+
const data = await fs.readFile(filePath, 'utf8');
|
|
15
|
+
// if password is not provided, treat as unencrypted
|
|
16
|
+
if (password.length === 0) {
|
|
17
|
+
logger.debug('No password provided. Treating as unencrypted.');
|
|
18
|
+
return JSON.parse(data);
|
|
19
|
+
}
|
|
20
|
+
logger.debug('Decrypting data...');
|
|
21
|
+
const decryptedData = decrypt(data);
|
|
22
|
+
return JSON.parse(decryptedData);
|
|
23
|
+
}
|
|
24
|
+
catch (error) {
|
|
25
|
+
const nodeError = error;
|
|
26
|
+
if (nodeError.code === 'ENOENT') {
|
|
27
|
+
// file does not exist, just revert to an empty object
|
|
28
|
+
return {};
|
|
29
|
+
}
|
|
30
|
+
if (password.length === 0) {
|
|
31
|
+
throw new Error('The file is encrypted. Please set the METAPLAY_AUTH_PASSWORD environment variable.');
|
|
32
|
+
}
|
|
33
|
+
throw error;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
function encrypt(text) {
|
|
37
|
+
const key = scryptSync(password, salt, 32);
|
|
38
|
+
const iv = randomBytes(16); // Generate a 16-byte IV
|
|
39
|
+
const cipher = createCipheriv(algorithm, key, iv);
|
|
40
|
+
const encrypted = Buffer.concat([cipher.update(text), cipher.final()]);
|
|
41
|
+
return iv.toString('hex') + ':' + encrypted.toString('hex'); // Store IV with the encrypted data
|
|
42
|
+
}
|
|
43
|
+
function decrypt(text) {
|
|
44
|
+
const textParts = text.split(':');
|
|
45
|
+
if (textParts.length !== 2) {
|
|
46
|
+
throw new Error('Invalid encrypted data format.');
|
|
47
|
+
}
|
|
48
|
+
const iv = Buffer.from(textParts[0], 'hex');
|
|
49
|
+
if (iv.length !== 16) { // Ensure the IV is 16 bytes
|
|
50
|
+
throw new Error('Invalid IV length.');
|
|
51
|
+
}
|
|
52
|
+
const encryptedText = Buffer.from(textParts[1], 'hex');
|
|
53
|
+
const key = scryptSync(password, salt, 32);
|
|
54
|
+
const decipher = createDecipheriv(algorithm, key, iv);
|
|
55
|
+
const decrypted = Buffer.concat([decipher.update(encryptedText), decipher.final()]);
|
|
56
|
+
return decrypted.toString();
|
|
57
|
+
}
|
|
58
|
+
export async function setSecret(key, value) {
|
|
59
|
+
logger.debug(`Setting secret ${key}...`);
|
|
60
|
+
const secrets = await loadSecrets();
|
|
61
|
+
secrets[key] = value;
|
|
62
|
+
const secretJson = JSON.stringify(secrets);
|
|
63
|
+
const content = password.length !== 0 ? encrypt(secretJson) : secretJson;
|
|
64
|
+
await fs.writeFile(filePath, content);
|
|
65
|
+
}
|
|
66
|
+
export async function getSecret(key) {
|
|
67
|
+
logger.debug(`Getting secret ${key}...`);
|
|
68
|
+
const secrets = await loadSecrets();
|
|
69
|
+
return secrets[key];
|
|
70
|
+
}
|
|
71
|
+
export async function removeSecret(key) {
|
|
72
|
+
logger.debug(`Removing secret ${key}...`);
|
|
73
|
+
const currentSecrets = await loadSecrets();
|
|
74
|
+
const { [key]: _, ...secrets } = currentSecrets; // remove key from secrets
|
|
75
|
+
const secretJson = JSON.stringify(secrets);
|
|
76
|
+
const content = password.length !== 0 ? encrypt(secretJson) : secretJson;
|
|
77
|
+
await fs.writeFile(filePath, content);
|
|
78
|
+
}
|
|
79
|
+
//# sourceMappingURL=secret_store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"secret_store.js","sourceRoot":"","sources":["../../src/secret_store.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
import { isValidFQDN, getGameserverAdminUrl } from './utils.js';
|
|
2
|
+
import { logger } from './logging.js';
|
|
3
|
+
export class StackAPI {
|
|
4
|
+
accessToken;
|
|
5
|
+
_stack_api_base_uri;
|
|
6
|
+
constructor(accessToken) {
|
|
7
|
+
if (accessToken == null) {
|
|
8
|
+
throw new Error('accessToken must be provided');
|
|
9
|
+
}
|
|
10
|
+
this.accessToken = accessToken;
|
|
11
|
+
this._stack_api_base_uri = 'https://infra.p1.metaplay.io/stackapi';
|
|
12
|
+
}
|
|
13
|
+
get stack_api_base_uri() {
|
|
14
|
+
return this._stack_api_base_uri.replace(/\/$/, '');
|
|
15
|
+
}
|
|
16
|
+
set stack_api_base_uri(uri) {
|
|
17
|
+
uri = uri.replace(/\/$/, ''); // Remove trailing slash
|
|
18
|
+
this._stack_api_base_uri = uri;
|
|
19
|
+
}
|
|
20
|
+
async getAwsCredentials(gs) {
|
|
21
|
+
let url = '';
|
|
22
|
+
if (gs.gameserver != null) {
|
|
23
|
+
if (isValidFQDN(gs.gameserver)) {
|
|
24
|
+
const adminUrl = getGameserverAdminUrl(gs.gameserver);
|
|
25
|
+
url = `https://${adminUrl}/.infra/credentials/aws`;
|
|
26
|
+
}
|
|
27
|
+
else {
|
|
28
|
+
url = `${this.stack_api_base_uri}/v0/credentials/${gs.gameserver}/aws`;
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
else if (gs.organization != null && gs.project != null && gs.environment != null) {
|
|
32
|
+
url = `${this.stack_api_base_uri}/v1/servers/${gs.organization}/${gs.project}/${gs.environment}/credentials/aws`;
|
|
33
|
+
}
|
|
34
|
+
else {
|
|
35
|
+
throw new Error('Invalid arguments for getAwsCredentials');
|
|
36
|
+
}
|
|
37
|
+
logger.debug(`Getting AWS credentials from ${url}...`);
|
|
38
|
+
const response = await fetch(url, {
|
|
39
|
+
method: 'POST',
|
|
40
|
+
headers: {
|
|
41
|
+
Authorization: `Bearer ${this.accessToken}`,
|
|
42
|
+
'Content-Type': 'application/json'
|
|
43
|
+
}
|
|
44
|
+
});
|
|
45
|
+
if (response.status !== 200) {
|
|
46
|
+
throw new Error(`Failed to fetch AWS credentials: ${response.statusText}, response code=${response.status}`);
|
|
47
|
+
}
|
|
48
|
+
return await response.json();
|
|
49
|
+
}
|
|
50
|
+
async getKubeConfig(gs) {
|
|
51
|
+
let url = '';
|
|
52
|
+
if (gs.gameserver != null) {
|
|
53
|
+
if (isValidFQDN(gs.gameserver)) {
|
|
54
|
+
const adminUrl = getGameserverAdminUrl(gs.gameserver);
|
|
55
|
+
url = `https://${adminUrl}/.infra/credentials/k8s`;
|
|
56
|
+
}
|
|
57
|
+
else {
|
|
58
|
+
url = `${this.stack_api_base_uri}/v0/credentials/${gs.gameserver}/k8s`;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
else if (gs.organization != null && gs.project != null && gs.environment != null) {
|
|
62
|
+
url = `${this.stack_api_base_uri}/v1/servers/${gs.organization}/${gs.project}/${gs.environment}/credentials/k8s`;
|
|
63
|
+
}
|
|
64
|
+
else {
|
|
65
|
+
throw new Error('Invalid arguments for getKubeConfig');
|
|
66
|
+
}
|
|
67
|
+
logger.debug(`Getting KubeConfig from ${url}...`);
|
|
68
|
+
const response = await fetch(url, {
|
|
69
|
+
method: 'POST',
|
|
70
|
+
headers: {
|
|
71
|
+
Authorization: `Bearer ${this.accessToken}`,
|
|
72
|
+
'Content-Type': 'application/json'
|
|
73
|
+
}
|
|
74
|
+
});
|
|
75
|
+
if (response.status !== 200) {
|
|
76
|
+
throw new Error(`Failed to fetch KubeConfigs: ${response.statusText}`);
|
|
77
|
+
}
|
|
78
|
+
return await response.text();
|
|
79
|
+
}
|
|
80
|
+
async getEnvironmentDetails(gs) {
|
|
81
|
+
let url = '';
|
|
82
|
+
if (gs.gameserver != null) {
|
|
83
|
+
if (isValidFQDN(gs.gameserver)) {
|
|
84
|
+
const adminUrl = getGameserverAdminUrl(gs.gameserver);
|
|
85
|
+
url = `https://${adminUrl}/.infra/environment`;
|
|
86
|
+
}
|
|
87
|
+
else {
|
|
88
|
+
url = `${this.stack_api_base_uri}/v0/deployments/${gs.gameserver}`;
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
else if (gs.organization != null && gs.project != null && gs.environment != null) {
|
|
92
|
+
url = `${this.stack_api_base_uri}/v1/servers/${gs.organization}/${gs.project}/${gs.environment}`;
|
|
93
|
+
}
|
|
94
|
+
else {
|
|
95
|
+
throw new Error('Invalid arguments for environment details');
|
|
96
|
+
}
|
|
97
|
+
logger.debug(`Getting environment details from ${url}...`);
|
|
98
|
+
const response = await fetch(url, {
|
|
99
|
+
method: 'GET',
|
|
100
|
+
headers: {
|
|
101
|
+
Authorization: `Bearer ${this.accessToken}`,
|
|
102
|
+
'Content-Type': 'application/json'
|
|
103
|
+
}
|
|
104
|
+
});
|
|
105
|
+
if (response.status !== 200) {
|
|
106
|
+
throw new Error(`Failed to fetch environment details: ${response.statusText}`);
|
|
107
|
+
}
|
|
108
|
+
return await response.json();
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
//# sourceMappingURL=stackapi.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stackapi.js","sourceRoot":"","sources":["../../src/stackapi.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAA;AAC/D,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAA;AAgBrC,MAAM,OAAO,QAAQ;IACF,WAAW,CAAQ;IAE5B,mBAAmB,CAAQ;IAEnC,YAAa,WAAmB;QAC9B,IAAI,WAAW,IAAI,IAAI,EAAE;YACvB,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAA;SAChD;QAED,IAAI,CAAC,WAAW,GAAG,WAAW,CAAA;QAC9B,IAAI,CAAC,mBAAmB,GAAG,uCAAuC,CAAA;IACpE,CAAC;IAED,IAAI,kBAAkB;QACpB,OAAO,IAAI,CAAC,mBAAmB,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAA;IACpD,CAAC;IAED,IAAI,kBAAkB,CAAE,GAAW;QACjC,GAAG,GAAG,GAAG,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAA,CAAC,wBAAwB;QACrD,IAAI,CAAC,mBAAmB,GAAG,GAAG,CAAA;IAChC,CAAC;IAED,KAAK,CAAC,iBAAiB,CAAE,EAAgB;QACvC,IAAI,GAAG,GAAG,EAAE,CAAA;QACZ,IAAI,EAAE,CAAC,UAAU,IAAI,IAAI,EAAE;YACzB,IAAI,WAAW,CAAC,EAAE,CAAC,UAAU,CAAC,EAAE;gBAC9B,MAAM,QAAQ,GAAG,qBAAqB,CAAC,EAAE,CAAC,UAAU,CAAC,CAAA;gBACrD,GAAG,GAAG,WAAW,QAAQ,yBAAyB,CAAA;aACnD;iBAAM;gBACL,GAAG,GAAG,GAAG,IAAI,CAAC,kBAAkB,mBAAmB,EAAE,CAAC,UAAU,MAAM,CAAA;aACvE;SACF;aAAM,IAAI,EAAE,CAAC,YAAY,IAAI,IAAI,IAAI,EAAE,CAAC,OAAO,IAAI,IAAI,IAAI,EAAE,CAAC,WAAW,IAAI,IAAI,EAAE;YAClF,GAAG,GAAG,GAAG,IAAI,CAAC,kBAAkB,eAAe,EAAE,CAAC,YAAY,IAAI,EAAE,CAAC,OAAO,IAAI,EAAE,CAAC,WAAW,kBAAkB,CAAA;SACjH;aAAM;YACL,MAAM,IAAI,KAAK,CAAC,yCAAyC,CAAC,CAAA;SAC3D;QAED,MAAM,CAAC,KAAK,CAAC,gCAAgC,GAAG,KAAK,CAAC,CAAA;QACtD,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;YAChC,MAAM,EAAE,MAAM;YACd,OAAO,EAAE;gBACP,aAAa,EAAE,UAAU,IAAI,CAAC,WAAW,EAAE;gBAC3C,cAAc,EAAE,kBAAkB;aACnC;SACF,CAAC,CAAA;QAEF,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,EAAE;YAC3B,MAAM,IAAI,KAAK,CAAC,oCAAoC,QAAQ,CAAC,UAAU,mBAAmB,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAA;SAC7G;QAED,OAAO,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAA;IAC9B,CAAC;IAED,KAAK,CAAC,aAAa,CAAE,EAAgB;QACnC,IAAI,GAAG,GAAG,EAAE,CAAA;QACZ,IAAI,EAAE,CAAC,UAAU,IAAI,IAAI,EAAE;YACzB,IAAI,WAAW,CAAC,EAAE,CAAC,UAAU,CAAC,EAAE;gBAC9B,MAAM,QAAQ,GAAG,qBAAqB,CAAC,EAAE,CAAC,UAAU,CAAC,CAAA;gBACrD,GAAG,GAAG,WAAW,QAAQ,yBAAyB,CAAA;aACnD;iBAAM;gBACL,GAAG,GAAG,GAAG,IAAI,CAAC,kBAAkB,mBAAmB,EAAE,CAAC,UAAU,MAAM,CAAA;aACvE;SACF;aAAM,IAAI,EAAE,CAAC,YAAY,IAAI,IAAI,IAAI,EAAE,CAAC,OAAO,IAAI,IAAI,IAAI,EAAE,CAAC,WAAW,IAAI,IAAI,EAAE;YAClF,GAAG,GAAG,GAAG,IAAI,CAAC,kBAAkB,eAAe,EAAE,CAAC,YAAY,IAAI,EAAE,CAAC,OAAO,IAAI,EAAE,CAAC,WAAW,kBAAkB,CAAA;SACjH;aAAM;YACL,MAAM,IAAI,KAAK,CAAC,qCAAqC,CAAC,CAAA;SACvD;QAED,MAAM,CAAC,KAAK,CAAC,2BAA2B,GAAG,KAAK,CAAC,CAAA;QAEjD,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;YAChC,MAAM,EAAE,MAAM;YACd,OAAO,EAAE;gBACP,aAAa,EAAE,UAAU,IAAI,CAAC,WAAW,EAAE;gBAC3C,cAAc,EAAE,kBAAkB;aACnC;SACF,CAAC,CAAA;QAEF,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,EAAE;YAC3B,MAAM,IAAI,KAAK,CAAC,gCAAgC,QAAQ,CAAC,UAAU,EAAE,CAAC,CAAA;SACvE;QAED,OAAO,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAA;IAC9B,CAAC;IAED,KAAK,CAAC,qBAAqB,CAAE,EAAgB;QAC3C,IAAI,GAAG,GAAG,EAAE,CAAA;QACZ,IAAI,EAAE,CAAC,UAAU,IAAI,IAAI,EAAE;YACzB,IAAI,WAAW,CAAC,EAAE,CAAC,UAAU,CAAC,EAAE;gBAC9B,MAAM,QAAQ,GAAG,qBAAqB,CAAC,EAAE,CAAC,UAAU,CAAC,CAAA;gBACrD,GAAG,GAAG,WAAW,QAAQ,qBAAqB,CAAA;aAC/C;iBAAM;gBACL,GAAG,GAAG,GAAG,IAAI,CAAC,kBAAkB,mBAAmB,EAAE,CAAC,UAAU,EAAE,CAAA;aACnE;SACF;aAAM,IAAI,EAAE,CAAC,YAAY,IAAI,IAAI,IAAI,EAAE,CAAC,OAAO,IAAI,IAAI,IAAI,EAAE,CAAC,WAAW,IAAI,IAAI,EAAE;YAClF,GAAG,GAAG,GAAG,IAAI,CAAC,kBAAkB,eAAe,EAAE,CAAC,YAAY,IAAI,EAAE,CAAC,OAAO,IAAI,EAAE,CAAC,WAAW,EAAE,CAAA;SACjG;aAAM;YACL,MAAM,IAAI,KAAK,CAAC,2CAA2C,CAAC,CAAA;SAC7D;QAED,MAAM,CAAC,KAAK,CAAC,oCAAoC,GAAG,KAAK,CAAC,CAAA;QAC1D,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;YAChC,MAAM,EAAE,KAAK;YACb,OAAO,EAAE;gBACP,aAAa,EAAE,UAAU,IAAI,CAAC,WAAW,EAAE;gBAC3C,cAAc,EAAE,kBAAkB;aACnC;SACF,CAAC,CAAA;QAEF,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,EAAE;YAC3B,MAAM,IAAI,KAAK,CAAC,wCAAwC,QAAQ,CAAC,UAAU,EAAE,CAAC,CAAA;SAC/E;QAED,OAAO,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAA;IAC9B,CAAC;CACF"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
export function stackApiBaseFromOptions(arg, options) {
|
|
2
|
+
return '';
|
|
3
|
+
}
|
|
4
|
+
/**
|
|
5
|
+
* Checks if the given string is a fully qualified domain name (FQDN).
|
|
6
|
+
*
|
|
7
|
+
* @param domain The domain name to check.
|
|
8
|
+
* @returns true if the domain is a valid FQDN, false otherwise.
|
|
9
|
+
*/
|
|
10
|
+
export function isValidFQDN(domain) {
|
|
11
|
+
const fqdnRegex = /^(?=.{1,253}$)(([a-zA-Z0-9]([a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?\.)+[a-zA-Z]{2,})$/;
|
|
12
|
+
return fqdnRegex.test(domain);
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Splits an HTTP URL into its components: scheme, hostname, port, and subpaths.
|
|
16
|
+
*
|
|
17
|
+
* @param urlString The HTTP URL string to be split.
|
|
18
|
+
* @returns An object containing the scheme, hostname, port, and subpaths.
|
|
19
|
+
*/
|
|
20
|
+
export function splitUrlComponents(urlString) {
|
|
21
|
+
try {
|
|
22
|
+
const url = new URL(urlString);
|
|
23
|
+
// Extract the scheme (protocol without the ":"), hostname, and port
|
|
24
|
+
const scheme = url.protocol.slice(0, -1); // Removes the trailing ":"
|
|
25
|
+
const hostname = url.hostname;
|
|
26
|
+
const port = url.port ?? null;
|
|
27
|
+
// Extract subpaths (pathname) and remove the leading "/"
|
|
28
|
+
const subpaths = url.pathname.slice(1) ?? null;
|
|
29
|
+
return { scheme, hostname, port, subpaths };
|
|
30
|
+
}
|
|
31
|
+
catch (error) {
|
|
32
|
+
throw new Error('Invalid URL');
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
export function getGameserverAdminUrl(uri) {
|
|
36
|
+
const parts = uri.split('.');
|
|
37
|
+
const hostname = parts[0];
|
|
38
|
+
const domain = uri.substring(hostname.length + 1);
|
|
39
|
+
return `${hostname}-admin.${domain}`;
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/utils.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,uBAAuB,CAAE,GAAW,EAAE,OAA4B;IAChF,OAAO,EAAE,CAAA;AACX,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,WAAW,CAAE,MAAc;IACzC,MAAM,SAAS,GAAG,+EAA+E,CAAA;IAEjG,OAAO,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;AAC/B,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,kBAAkB,CAAE,SAAiB;IACnD,IAAI;QACF,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,SAAS,CAAC,CAAA;QAE9B,oEAAoE;QACpE,MAAM,MAAM,GAAG,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA,CAAC,2BAA2B;QACpE,MAAM,QAAQ,GAAG,GAAG,CAAC,QAAQ,CAAA;QAC7B,MAAM,IAAI,GAAG,GAAG,CAAC,IAAI,IAAI,IAAI,CAAA;QAE7B,yDAAyD;QACzD,MAAM,QAAQ,GAAG,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,IAAI,CAAA;QAE9C,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAA;KAC5C;IAAC,OAAO,KAAK,EAAE;QACd,MAAM,IAAI,KAAK,CAAC,aAAa,CAAC,CAAA;KAC/B;AACH,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAE,GAAW;IAChD,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;IAE5B,MAAM,QAAQ,GAAG,KAAK,CAAC,CAAC,CAAC,CAAA;IACzB,MAAM,MAAM,GAAG,GAAG,CAAC,SAAS,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAA;IAEjD,OAAO,GAAG,QAAQ,UAAU,MAAM,EAAE,CAAA;AACtC,CAAC"}
|
package/dist/stackapi.js
CHANGED
|
@@ -1,18 +1,13 @@
|
|
|
1
1
|
import { isValidFQDN, getGameserverAdminUrl } from './utils.js';
|
|
2
2
|
import { logger } from './logging.js';
|
|
3
3
|
export class StackAPI {
|
|
4
|
-
|
|
5
|
-
access_token;
|
|
4
|
+
accessToken;
|
|
6
5
|
_stack_api_base_uri;
|
|
7
|
-
constructor(
|
|
8
|
-
if (idToken == null) {
|
|
9
|
-
throw new Error('id_token is missing');
|
|
10
|
-
}
|
|
6
|
+
constructor(accessToken) {
|
|
11
7
|
if (accessToken == null) {
|
|
12
|
-
throw new Error('
|
|
8
|
+
throw new Error('accessToken must be provided');
|
|
13
9
|
}
|
|
14
|
-
this.
|
|
15
|
-
this.access_token = accessToken;
|
|
10
|
+
this.accessToken = accessToken;
|
|
16
11
|
this._stack_api_base_uri = 'https://infra.p1.metaplay.io/stackapi';
|
|
17
12
|
}
|
|
18
13
|
get stack_api_base_uri() {
|
|
@@ -43,12 +38,12 @@ export class StackAPI {
|
|
|
43
38
|
const response = await fetch(url, {
|
|
44
39
|
method: 'POST',
|
|
45
40
|
headers: {
|
|
46
|
-
Authorization: `Bearer ${this.
|
|
41
|
+
Authorization: `Bearer ${this.accessToken}`,
|
|
47
42
|
'Content-Type': 'application/json'
|
|
48
43
|
}
|
|
49
44
|
});
|
|
50
45
|
if (response.status !== 200) {
|
|
51
|
-
throw new Error(`Failed to fetch AWS
|
|
46
|
+
throw new Error(`Failed to fetch AWS credentials: ${response.statusText}, response code=${response.status}`);
|
|
52
47
|
}
|
|
53
48
|
return await response.json();
|
|
54
49
|
}
|
|
@@ -73,7 +68,7 @@ export class StackAPI {
|
|
|
73
68
|
const response = await fetch(url, {
|
|
74
69
|
method: 'POST',
|
|
75
70
|
headers: {
|
|
76
|
-
Authorization: `Bearer ${this.
|
|
71
|
+
Authorization: `Bearer ${this.accessToken}`,
|
|
77
72
|
'Content-Type': 'application/json'
|
|
78
73
|
}
|
|
79
74
|
});
|
|
@@ -103,7 +98,7 @@ export class StackAPI {
|
|
|
103
98
|
const response = await fetch(url, {
|
|
104
99
|
method: 'GET',
|
|
105
100
|
headers: {
|
|
106
|
-
Authorization: `Bearer ${this.
|
|
101
|
+
Authorization: `Bearer ${this.accessToken}`,
|
|
107
102
|
'Content-Type': 'application/json'
|
|
108
103
|
}
|
|
109
104
|
});
|
package/dist/stackapi.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stackapi.js","sourceRoot":"","sources":["../src/stackapi.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAA;AAC/D,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAA;AAgBrC,MAAM,OAAO,QAAQ;IACF,
|
|
1
|
+
{"version":3,"file":"stackapi.js","sourceRoot":"","sources":["../src/stackapi.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAA;AAC/D,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAA;AAgBrC,MAAM,OAAO,QAAQ;IACF,WAAW,CAAQ;IAE5B,mBAAmB,CAAQ;IAEnC,YAAa,WAAmB;QAC9B,IAAI,WAAW,IAAI,IAAI,EAAE;YACvB,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAA;SAChD;QAED,IAAI,CAAC,WAAW,GAAG,WAAW,CAAA;QAC9B,IAAI,CAAC,mBAAmB,GAAG,uCAAuC,CAAA;IACpE,CAAC;IAED,IAAI,kBAAkB;QACpB,OAAO,IAAI,CAAC,mBAAmB,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAA;IACpD,CAAC;IAED,IAAI,kBAAkB,CAAE,GAAW;QACjC,GAAG,GAAG,GAAG,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAA,CAAC,wBAAwB;QACrD,IAAI,CAAC,mBAAmB,GAAG,GAAG,CAAA;IAChC,CAAC;IAED,KAAK,CAAC,iBAAiB,CAAE,EAAgB;QACvC,IAAI,GAAG,GAAG,EAAE,CAAA;QACZ,IAAI,EAAE,CAAC,UAAU,IAAI,IAAI,EAAE;YACzB,IAAI,WAAW,CAAC,EAAE,CAAC,UAAU,CAAC,EAAE;gBAC9B,MAAM,QAAQ,GAAG,qBAAqB,CAAC,EAAE,CAAC,UAAU,CAAC,CAAA;gBACrD,GAAG,GAAG,WAAW,QAAQ,yBAAyB,CAAA;aACnD;iBAAM;gBACL,GAAG,GAAG,GAAG,IAAI,CAAC,kBAAkB,mBAAmB,EAAE,CAAC,UAAU,MAAM,CAAA;aACvE;SACF;aAAM,IAAI,EAAE,CAAC,YAAY,IAAI,IAAI,IAAI,EAAE,CAAC,OAAO,IAAI,IAAI,IAAI,EAAE,CAAC,WAAW,IAAI,IAAI,EAAE;YAClF,GAAG,GAAG,GAAG,IAAI,CAAC,kBAAkB,eAAe,EAAE,CAAC,YAAY,IAAI,EAAE,CAAC,OAAO,IAAI,EAAE,CAAC,WAAW,kBAAkB,CAAA;SACjH;aAAM;YACL,MAAM,IAAI,KAAK,CAAC,yCAAyC,CAAC,CAAA;SAC3D;QAED,MAAM,CAAC,KAAK,CAAC,gCAAgC,GAAG,KAAK,CAAC,CAAA;QACtD,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;YAChC,MAAM,EAAE,MAAM;YACd,OAAO,EAAE;gBACP,aAAa,EAAE,UAAU,IAAI,CAAC,WAAW,EAAE;gBAC3C,cAAc,EAAE,kBAAkB;aACnC;SACF,CAAC,CAAA;QAEF,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,EAAE;YAC3B,MAAM,IAAI,KAAK,CAAC,oCAAoC,QAAQ,CAAC,UAAU,mBAAmB,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAA;SAC7G;QAED,OAAO,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAA;IAC9B,CAAC;IAED,KAAK,CAAC,aAAa,CAAE,EAAgB;QACnC,IAAI,GAAG,GAAG,EAAE,CAAA;QACZ,IAAI,EAAE,CAAC,UAAU,IAAI,IAAI,EAAE;YACzB,IAAI,WAAW,CAAC,EAAE,CAAC,UAAU,CAAC,EAAE;gBAC9B,MAAM,QAAQ,GAAG,qBAAqB,CAAC,EAAE,CAAC,UAAU,CAAC,CAAA;gBACrD,GAAG,GAAG,WAAW,QAAQ,yBAAyB,CAAA;aACnD;iBAAM;gBACL,GAAG,GAAG,GAAG,IAAI,CAAC,kBAAkB,mBAAmB,EAAE,CAAC,UAAU,MAAM,CAAA;aACvE;SACF;aAAM,IAAI,EAAE,CAAC,YAAY,IAAI,IAAI,IAAI,EAAE,CAAC,OAAO,IAAI,IAAI,IAAI,EAAE,CAAC,WAAW,IAAI,IAAI,EAAE;YAClF,GAAG,GAAG,GAAG,IAAI,CAAC,kBAAkB,eAAe,EAAE,CAAC,YAAY,IAAI,EAAE,CAAC,OAAO,IAAI,EAAE,CAAC,WAAW,kBAAkB,CAAA;SACjH;aAAM;YACL,MAAM,IAAI,KAAK,CAAC,qCAAqC,CAAC,CAAA;SACvD;QAED,MAAM,CAAC,KAAK,CAAC,2BAA2B,GAAG,KAAK,CAAC,CAAA;QAEjD,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;YAChC,MAAM,EAAE,MAAM;YACd,OAAO,EAAE;gBACP,aAAa,EAAE,UAAU,IAAI,CAAC,WAAW,EAAE;gBAC3C,cAAc,EAAE,kBAAkB;aACnC;SACF,CAAC,CAAA;QAEF,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,EAAE;YAC3B,MAAM,IAAI,KAAK,CAAC,gCAAgC,QAAQ,CAAC,UAAU,EAAE,CAAC,CAAA;SACvE;QAED,OAAO,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAA;IAC9B,CAAC;IAED,KAAK,CAAC,qBAAqB,CAAE,EAAgB;QAC3C,IAAI,GAAG,GAAG,EAAE,CAAA;QACZ,IAAI,EAAE,CAAC,UAAU,IAAI,IAAI,EAAE;YACzB,IAAI,WAAW,CAAC,EAAE,CAAC,UAAU,CAAC,EAAE;gBAC9B,MAAM,QAAQ,GAAG,qBAAqB,CAAC,EAAE,CAAC,UAAU,CAAC,CAAA;gBACrD,GAAG,GAAG,WAAW,QAAQ,qBAAqB,CAAA;aAC/C;iBAAM;gBACL,GAAG,GAAG,GAAG,IAAI,CAAC,kBAAkB,mBAAmB,EAAE,CAAC,UAAU,EAAE,CAAA;aACnE;SACF;aAAM,IAAI,EAAE,CAAC,YAAY,IAAI,IAAI,IAAI,EAAE,CAAC,OAAO,IAAI,IAAI,IAAI,EAAE,CAAC,WAAW,IAAI,IAAI,EAAE;YAClF,GAAG,GAAG,GAAG,IAAI,CAAC,kBAAkB,eAAe,EAAE,CAAC,YAAY,IAAI,EAAE,CAAC,OAAO,IAAI,EAAE,CAAC,WAAW,EAAE,CAAA;SACjG;aAAM;YACL,MAAM,IAAI,KAAK,CAAC,2CAA2C,CAAC,CAAA;SAC7D;QAED,MAAM,CAAC,KAAK,CAAC,oCAAoC,GAAG,KAAK,CAAC,CAAA;QAC1D,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;YAChC,MAAM,EAAE,KAAK;YACb,OAAO,EAAE;gBACP,aAAa,EAAE,UAAU,IAAI,CAAC,WAAW,EAAE;gBAC3C,cAAc,EAAE,kBAAkB;aACnC;SACF,CAAC,CAAA;QAEF,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,EAAE;YAC3B,MAAM,IAAI,KAAK,CAAC,wCAAwC,QAAQ,CAAC,UAAU,EAAE,CAAC,CAAA;SAC/E;QAED,OAAO,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAA;IAC9B,CAAC;CACF"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { expect, test, describe } from 'vitest';
|
|
2
|
+
import { isValidFQDN } from '../src/utils.js';
|
|
3
|
+
describe('isValidFQDN', () => {
|
|
4
|
+
test('should return true for valid FQDNs', () => {
|
|
5
|
+
expect(isValidFQDN('www.example.com')).toBe(true);
|
|
6
|
+
expect(isValidFQDN('subdomain.example.com')).toBe(true);
|
|
7
|
+
expect(isValidFQDN('example.com')).toBe(true);
|
|
8
|
+
expect(isValidFQDN('example.co.uk')).toBe(true);
|
|
9
|
+
});
|
|
10
|
+
test('should return false for invalid FQDNs', () => {
|
|
11
|
+
expect(isValidFQDN('example')).toBe(false);
|
|
12
|
+
expect(isValidFQDN('www.example..com')).toBe(false);
|
|
13
|
+
expect(isValidFQDN('www.-example.com')).toBe(false);
|
|
14
|
+
expect(isValidFQDN('www.example-.com')).toBe(false);
|
|
15
|
+
expect(isValidFQDN('www.example.com-')).toBe(false);
|
|
16
|
+
});
|
|
17
|
+
});
|
|
18
|
+
//# sourceMappingURL=utils.spec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.spec.js","sourceRoot":"","sources":["../../tests/utils.spec.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAA;AAE/C,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAA;AAE7C,QAAQ,CAAC,aAAa,EAAE,GAAG,EAAE;IAC3B,IAAI,CAAC,oCAAoC,EAAE,GAAG,EAAE;QAC9C,MAAM,CAAC,WAAW,CAAC,iBAAiB,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QACjD,MAAM,CAAC,WAAW,CAAC,uBAAuB,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QACvD,MAAM,CAAC,WAAW,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QAC7C,MAAM,CAAC,WAAW,CAAC,eAAe,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IACjD,CAAC,CAAC,CAAA;IAEF,IAAI,CAAC,uCAAuC,EAAE,GAAG,EAAE;QACjD,MAAM,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;QAC1C,MAAM,CAAC,WAAW,CAAC,kBAAkB,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;QACnD,MAAM,CAAC,WAAW,CAAC,kBAAkB,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;QACnD,MAAM,CAAC,WAAW,CAAC,kBAAkB,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;QACnD,MAAM,CAAC,WAAW,CAAC,kBAAkB,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;IACrD,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"}
|
package/package.json
CHANGED
|
@@ -1,23 +1,27 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@metaplay/metaplay-auth",
|
|
3
3
|
"description": "Utility CLI for authenticating with the Metaplay Auth and making authenticated calls to infrastructure endpoints.",
|
|
4
|
-
"version": "1.1.
|
|
4
|
+
"version": "1.1.7",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"license": "SEE LICENSE IN LICENSE",
|
|
7
7
|
"homepage": "https://metaplay.io",
|
|
8
8
|
"bin": "dist/index.js",
|
|
9
|
+
"scripts": {
|
|
10
|
+
"dev": "tsx src/index.ts",
|
|
11
|
+
"prepublish": "tsc"
|
|
12
|
+
},
|
|
9
13
|
"publishConfig": {
|
|
10
14
|
"access": "public"
|
|
11
15
|
},
|
|
12
16
|
"devDependencies": {
|
|
17
|
+
"@metaplay/eslint-config": "workspace:*",
|
|
18
|
+
"@metaplay/typescript-config": "workspace:*",
|
|
13
19
|
"@types/express": "^4.17.21",
|
|
14
20
|
"@types/jsonwebtoken": "^9.0.5",
|
|
15
21
|
"@types/jwk-to-pem": "^2.0.3",
|
|
16
22
|
"@types/node": "^20.11.20",
|
|
17
23
|
"tsx": "^4.7.1",
|
|
18
|
-
"typescript": "^5.1.6"
|
|
19
|
-
"@metaplay/eslint-config": "1.0.0",
|
|
20
|
-
"@metaplay/typescript-config": "1.0.0"
|
|
24
|
+
"typescript": "^5.1.6"
|
|
21
25
|
},
|
|
22
26
|
"dependencies": {
|
|
23
27
|
"@ory/client": "^1.6.2",
|
|
@@ -28,9 +32,5 @@
|
|
|
28
32
|
"open": "^10.0.2",
|
|
29
33
|
"tslog": "^4.9.2",
|
|
30
34
|
"@kubernetes/client-node": "^0.20.0"
|
|
31
|
-
},
|
|
32
|
-
"scripts": {
|
|
33
|
-
"dev": "tsx src/index.ts",
|
|
34
|
-
"prepublish": "tsc"
|
|
35
35
|
}
|
|
36
36
|
}
|