@tonk/cli 0.3.3 → 0.6.5
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/README.md +15 -202
- package/bin/tonk.js +36 -1
- package/package.json +23 -89
- package/dist/commands/auth.d.ts +0 -3
- package/dist/commands/auth.d.ts.map +0 -1
- package/dist/commands/auth.js +0 -184
- package/dist/commands/auth.js.map +0 -1
- package/dist/commands/create.d.ts +0 -3
- package/dist/commands/create.d.ts.map +0 -1
- package/dist/commands/create.js +0 -55
- package/dist/commands/create.js.map +0 -1
- package/dist/commands/delete.d.ts +0 -3
- package/dist/commands/delete.d.ts.map +0 -1
- package/dist/commands/delete.js +0 -67
- package/dist/commands/delete.js.map +0 -1
- package/dist/commands/deploy.d.ts +0 -3
- package/dist/commands/deploy.d.ts.map +0 -1
- package/dist/commands/deploy.js +0 -336
- package/dist/commands/deploy.js.map +0 -1
- package/dist/commands/hello/index.d.ts +0 -3
- package/dist/commands/hello/index.d.ts.map +0 -1
- package/dist/commands/hello/index.js +0 -296
- package/dist/commands/hello/index.js.map +0 -1
- package/dist/commands/hello.d.ts +0 -3
- package/dist/commands/hello.d.ts.map +0 -1
- package/dist/commands/hello.js +0 -83
- package/dist/commands/hello.js.map +0 -1
- package/dist/commands/init.d.ts +0 -3
- package/dist/commands/init.d.ts.map +0 -1
- package/dist/commands/init.js +0 -137
- package/dist/commands/init.js.map +0 -1
- package/dist/commands/kill.d.ts +0 -3
- package/dist/commands/kill.d.ts.map +0 -1
- package/dist/commands/kill.js +0 -66
- package/dist/commands/kill.js.map +0 -1
- package/dist/commands/ls.d.ts +0 -3
- package/dist/commands/ls.d.ts.map +0 -1
- package/dist/commands/ls.js +0 -52
- package/dist/commands/ls.js.map +0 -1
- package/dist/commands/proxy.d.ts +0 -3
- package/dist/commands/proxy.d.ts.map +0 -1
- package/dist/commands/proxy.js +0 -86
- package/dist/commands/proxy.js.map +0 -1
- package/dist/commands/ps.d.ts +0 -3
- package/dist/commands/ps.d.ts.map +0 -1
- package/dist/commands/ps.js +0 -56
- package/dist/commands/ps.js.map +0 -1
- package/dist/commands/push.d.ts +0 -3
- package/dist/commands/push.d.ts.map +0 -1
- package/dist/commands/push.js +0 -238
- package/dist/commands/push.js.map +0 -1
- package/dist/commands/server.d.ts +0 -3
- package/dist/commands/server.d.ts.map +0 -1
- package/dist/commands/server.js +0 -676
- package/dist/commands/server.js.map +0 -1
- package/dist/commands/start.d.ts +0 -3
- package/dist/commands/start.d.ts.map +0 -1
- package/dist/commands/start.js +0 -82
- package/dist/commands/start.js.map +0 -1
- package/dist/commands/worker/commands.d.ts +0 -42
- package/dist/commands/worker/commands.d.ts.map +0 -1
- package/dist/commands/worker/commands.js +0 -968
- package/dist/commands/worker/commands.js.map +0 -1
- package/dist/commands/worker/index.d.ts +0 -7
- package/dist/commands/worker/index.d.ts.map +0 -1
- package/dist/commands/worker/index.js +0 -30
- package/dist/commands/worker/index.js.map +0 -1
- package/dist/commands/worker/utils/config.d.ts +0 -26
- package/dist/commands/worker/utils/config.d.ts.map +0 -1
- package/dist/commands/worker/utils/config.js +0 -197
- package/dist/commands/worker/utils/config.js.map +0 -1
- package/dist/commands/worker/utils/display.d.ts +0 -6
- package/dist/commands/worker/utils/display.d.ts.map +0 -1
- package/dist/commands/worker/utils/display.js +0 -32
- package/dist/commands/worker/utils/display.js.map +0 -1
- package/dist/commands/worker/utils/finder.d.ts +0 -12
- package/dist/commands/worker/utils/finder.d.ts.map +0 -1
- package/dist/commands/worker/utils/finder.js +0 -60
- package/dist/commands/worker/utils/finder.js.map +0 -1
- package/dist/config/environment.d.ts +0 -52
- package/dist/config/environment.d.ts.map +0 -1
- package/dist/config/environment.js +0 -83
- package/dist/config/environment.js.map +0 -1
- package/dist/index.d.ts +0 -1
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js +0 -3
- package/dist/index.js.map +0 -1
- package/dist/lib/tonkAuth.d.ts +0 -21
- package/dist/lib/tonkAuth.d.ts.map +0 -1
- package/dist/lib/tonkAuth.js +0 -140
- package/dist/lib/tonkAuth.js.map +0 -1
- package/dist/lib/workerManager.d.ts +0 -60
- package/dist/lib/workerManager.d.ts.map +0 -1
- package/dist/lib/workerManager.js +0 -417
- package/dist/lib/workerManager.js.map +0 -1
- package/dist/scripts/aws/create-key.sh +0 -20
- package/dist/scripts/aws/ec2-dns.sh +0 -20
- package/dist/scripts/aws/provision.sh +0 -93
- package/dist/tonk.d.ts +0 -2
- package/dist/tonk.d.ts.map +0 -1
- package/dist/tonk.js +0 -106
- package/dist/tonk.js.map +0 -1
- package/dist/types/worker.d.ts +0 -161
- package/dist/types/worker.d.ts.map +0 -1
- package/dist/types/worker.js +0 -7
- package/dist/types/worker.js.map +0 -1
- package/dist/types/workerConfig.d.ts +0 -164
- package/dist/types/workerConfig.d.ts.map +0 -1
- package/dist/types/workerConfig.js +0 -80
- package/dist/types/workerConfig.js.map +0 -1
- package/dist/utils/analytics.d.ts +0 -26
- package/dist/utils/analytics.d.ts.map +0 -1
- package/dist/utils/analytics.js +0 -218
- package/dist/utils/analytics.js.map +0 -1
- package/dist/utils/messages.d.ts +0 -6
- package/dist/utils/messages.d.ts.map +0 -1
- package/dist/utils/messages.js +0 -18
- package/dist/utils/messages.js.map +0 -1
- package/dist/utils/serverUtils.d.ts +0 -5
- package/dist/utils/serverUtils.d.ts.map +0 -1
- package/dist/utils/serverUtils.js +0 -34
- package/dist/utils/serverUtils.js.map +0 -1
- package/dist/utils/version.d.ts +0 -2
- package/dist/utils/version.d.ts.map +0 -1
- package/dist/utils/version.js +0 -3
- package/dist/utils/version.js.map +0 -1
- package/scripts/aws/create-key.sh +0 -20
- package/scripts/aws/ec2-dns.sh +0 -20
- package/scripts/aws/provision.sh +0 -93
package/dist/commands/server.js
DELETED
|
@@ -1,676 +0,0 @@
|
|
|
1
|
-
import { Command } from 'commander';
|
|
2
|
-
import chalk from 'chalk';
|
|
3
|
-
import inquirer from 'inquirer';
|
|
4
|
-
import ora from 'ora';
|
|
5
|
-
import { trackCommand, trackCommandError, trackCommandSuccess, shutdownAnalytics, } from '../utils/analytics.js';
|
|
6
|
-
// Lazy-load authHook to prevent initialization on import
|
|
7
|
-
async function getAuthHook() {
|
|
8
|
-
const { authHook } = await import('../lib/tonkAuth.js');
|
|
9
|
-
return authHook;
|
|
10
|
-
}
|
|
11
|
-
// Lazy-load tonkAuth to get auth token
|
|
12
|
-
async function getTonkAuth() {
|
|
13
|
-
const { tonkAuth } = await import('../lib/tonkAuth.js');
|
|
14
|
-
return tonkAuth;
|
|
15
|
-
}
|
|
16
|
-
import { getDeploymentServiceUrl, config } from '../config/environment.js';
|
|
17
|
-
import { fetchUserServers } from '../utils/serverUtils.js';
|
|
18
|
-
// Privileged subdomain names that cannot be used as server names
|
|
19
|
-
const PRIVILEGED_SUBDOMAINS = [
|
|
20
|
-
'accounts',
|
|
21
|
-
'clerk',
|
|
22
|
-
'clkmail',
|
|
23
|
-
'dashboard',
|
|
24
|
-
'tinyfoot',
|
|
25
|
-
];
|
|
26
|
-
/**
|
|
27
|
-
* Checks if the deployment service is reachable
|
|
28
|
-
*/
|
|
29
|
-
async function checkDeploymentService() {
|
|
30
|
-
try {
|
|
31
|
-
const response = await fetch(`${getDeploymentServiceUrl()}/health`);
|
|
32
|
-
if (!response.ok) {
|
|
33
|
-
throw new Error(`Service returned ${response.status}`);
|
|
34
|
-
}
|
|
35
|
-
}
|
|
36
|
-
catch {
|
|
37
|
-
console.error(chalk.red('Error: Tonk deployment service is not available.'));
|
|
38
|
-
console.log(chalk.yellow('Please reach out for support or try again later.'));
|
|
39
|
-
await shutdownAnalytics();
|
|
40
|
-
process.exitCode = 1;
|
|
41
|
-
return;
|
|
42
|
-
}
|
|
43
|
-
}
|
|
44
|
-
/**
|
|
45
|
-
* Validates that a server name is not a privileged subdomain
|
|
46
|
-
*/
|
|
47
|
-
function validateServerName(serverName) {
|
|
48
|
-
if (!serverName || serverName.trim().length === 0) {
|
|
49
|
-
return 'Server name is required';
|
|
50
|
-
}
|
|
51
|
-
if (PRIVILEGED_SUBDOMAINS.includes(serverName.toLowerCase())) {
|
|
52
|
-
return `Server name "${serverName}" is reserved and cannot be used. Please choose a different name.`;
|
|
53
|
-
}
|
|
54
|
-
return true;
|
|
55
|
-
}
|
|
56
|
-
/**
|
|
57
|
-
* Gets server name from user if not provided
|
|
58
|
-
*/
|
|
59
|
-
async function getServerName(serverName) {
|
|
60
|
-
if (serverName) {
|
|
61
|
-
return serverName;
|
|
62
|
-
}
|
|
63
|
-
const { inputName } = await inquirer.prompt([
|
|
64
|
-
{
|
|
65
|
-
type: 'input',
|
|
66
|
-
name: 'inputName',
|
|
67
|
-
message: 'Enter your Tonk server name:',
|
|
68
|
-
validate: validateServerName,
|
|
69
|
-
},
|
|
70
|
-
]);
|
|
71
|
-
return inputName.trim();
|
|
72
|
-
}
|
|
73
|
-
/**
|
|
74
|
-
* Deletes a server
|
|
75
|
-
*/
|
|
76
|
-
async function deleteServer(serverName) {
|
|
77
|
-
// Get auth token
|
|
78
|
-
const tonkAuth = await getTonkAuth();
|
|
79
|
-
const authToken = await tonkAuth.getAuthToken();
|
|
80
|
-
if (!authToken) {
|
|
81
|
-
throw new Error('Failed to get authentication token');
|
|
82
|
-
}
|
|
83
|
-
const formData = new FormData();
|
|
84
|
-
formData.append('serverData', JSON.stringify({
|
|
85
|
-
serverName,
|
|
86
|
-
}));
|
|
87
|
-
const response = await fetch(`${getDeploymentServiceUrl()}/delete-server`, {
|
|
88
|
-
method: 'POST',
|
|
89
|
-
headers: {
|
|
90
|
-
Authorization: `Bearer ${authToken}`,
|
|
91
|
-
},
|
|
92
|
-
body: formData,
|
|
93
|
-
});
|
|
94
|
-
// Get response text first to check if it's HTML
|
|
95
|
-
const responseText = await response.text();
|
|
96
|
-
// Try to parse as JSON
|
|
97
|
-
let result;
|
|
98
|
-
try {
|
|
99
|
-
result = JSON.parse(responseText);
|
|
100
|
-
}
|
|
101
|
-
catch {
|
|
102
|
-
console.error('Failed to parse response as JSON');
|
|
103
|
-
console.error('Full response:', responseText);
|
|
104
|
-
throw new Error('Server returned HTML instead of JSON. This usually means authentication failed or wrong URL.');
|
|
105
|
-
}
|
|
106
|
-
if (!response.ok || !result.success) {
|
|
107
|
-
throw new Error(result.error || 'Failed to delete server');
|
|
108
|
-
}
|
|
109
|
-
console.log(chalk.green('Server deleted successfully!'));
|
|
110
|
-
console.log(chalk.green(result.message));
|
|
111
|
-
}
|
|
112
|
-
/**
|
|
113
|
-
* Creates a new Tonk server
|
|
114
|
-
*/
|
|
115
|
-
async function createServer(serverName, options) {
|
|
116
|
-
const spinner = ora('Creating Tonk server...').start();
|
|
117
|
-
try {
|
|
118
|
-
// Get auth token
|
|
119
|
-
const tonkAuth = await getTonkAuth();
|
|
120
|
-
const authToken = await tonkAuth.getAuthToken();
|
|
121
|
-
if (!authToken) {
|
|
122
|
-
throw new Error('Failed to get authentication token');
|
|
123
|
-
}
|
|
124
|
-
// Prepare form data for server creation
|
|
125
|
-
const formData = new FormData();
|
|
126
|
-
const serverData = {
|
|
127
|
-
serverName,
|
|
128
|
-
region: options.region || 'ord',
|
|
129
|
-
memory: options.memory || '1gb',
|
|
130
|
-
cpus: options.cpus || '1',
|
|
131
|
-
remote: options.remote || false,
|
|
132
|
-
deployType: 'server',
|
|
133
|
-
};
|
|
134
|
-
formData.append('serverData', JSON.stringify(serverData));
|
|
135
|
-
const url = `${getDeploymentServiceUrl()}/create-server`;
|
|
136
|
-
// Send server creation request
|
|
137
|
-
spinner.text = 'Creating server...';
|
|
138
|
-
const response = await fetch(url, {
|
|
139
|
-
method: 'POST',
|
|
140
|
-
headers: {
|
|
141
|
-
Authorization: `Bearer ${authToken}`,
|
|
142
|
-
},
|
|
143
|
-
body: formData,
|
|
144
|
-
});
|
|
145
|
-
// Get response text first to check if it's HTML
|
|
146
|
-
const responseText = await response.text();
|
|
147
|
-
// Try to parse as JSON
|
|
148
|
-
let result;
|
|
149
|
-
try {
|
|
150
|
-
result = JSON.parse(responseText);
|
|
151
|
-
}
|
|
152
|
-
catch {
|
|
153
|
-
console.error('Failed to parse response as JSON');
|
|
154
|
-
console.error('Full response:', responseText);
|
|
155
|
-
throw new Error('Server returned HTML instead of JSON. This usually means authentication failed or wrong URL.');
|
|
156
|
-
}
|
|
157
|
-
if (!response.ok || !result.success) {
|
|
158
|
-
const errorMessage = result.error || 'Server creation failed';
|
|
159
|
-
// Check for name conflict errors
|
|
160
|
-
if (errorMessage.toLowerCase().includes('already exists') ||
|
|
161
|
-
errorMessage.toLowerCase().includes('name is taken') ||
|
|
162
|
-
errorMessage.toLowerCase().includes('name already taken') ||
|
|
163
|
-
errorMessage.toLowerCase().includes('already in use') ||
|
|
164
|
-
errorMessage.toLowerCase().includes('conflict')) {
|
|
165
|
-
throw new Error(`Server name "${serverName}" is already taken. Please choose a different server name and try again.`);
|
|
166
|
-
}
|
|
167
|
-
throw new Error(errorMessage);
|
|
168
|
-
}
|
|
169
|
-
spinner.succeed('Server created successfully!');
|
|
170
|
-
console.log(chalk.green(`🚀 Your Tonk server is ready!`));
|
|
171
|
-
console.log(chalk.blue(` URL: ${result.serverUrl}`));
|
|
172
|
-
console.log(chalk.yellow(` Use this server name for future bundle deployments: ${serverName}`));
|
|
173
|
-
}
|
|
174
|
-
catch (error) {
|
|
175
|
-
spinner.fail('Server creation failed');
|
|
176
|
-
throw error;
|
|
177
|
-
}
|
|
178
|
-
}
|
|
179
|
-
/**
|
|
180
|
-
* Lists bundles on a remote server
|
|
181
|
-
*/
|
|
182
|
-
async function listRemoteBundles(serverName) {
|
|
183
|
-
// Get auth token
|
|
184
|
-
const tonkAuth = await getTonkAuth();
|
|
185
|
-
const authToken = await tonkAuth.getAuthToken();
|
|
186
|
-
if (!authToken) {
|
|
187
|
-
throw new Error('Failed to get authentication token');
|
|
188
|
-
}
|
|
189
|
-
const formData = new FormData();
|
|
190
|
-
formData.append('requestData', JSON.stringify({
|
|
191
|
-
serverName,
|
|
192
|
-
action: 'ls',
|
|
193
|
-
}));
|
|
194
|
-
const response = await fetch(`${getDeploymentServiceUrl()}/server-action`, {
|
|
195
|
-
method: 'POST',
|
|
196
|
-
headers: {
|
|
197
|
-
Authorization: `Bearer ${authToken}`,
|
|
198
|
-
},
|
|
199
|
-
body: formData,
|
|
200
|
-
});
|
|
201
|
-
// Get response text first to check if it's HTML
|
|
202
|
-
const responseText = await response.text();
|
|
203
|
-
// Try to parse as JSON
|
|
204
|
-
let result;
|
|
205
|
-
try {
|
|
206
|
-
result = JSON.parse(responseText);
|
|
207
|
-
}
|
|
208
|
-
catch {
|
|
209
|
-
console.error('Failed to parse response as JSON');
|
|
210
|
-
console.error('Full response:', responseText);
|
|
211
|
-
throw new Error('Server returned HTML instead of JSON. This usually means authentication failed or wrong URL.');
|
|
212
|
-
}
|
|
213
|
-
if (!response.ok || !result.success) {
|
|
214
|
-
throw new Error(result.error || 'Failed to list bundles');
|
|
215
|
-
}
|
|
216
|
-
if (result.bundles && result.bundles.length > 0) {
|
|
217
|
-
console.log(chalk.green(`📦 Bundles on server "${serverName}":`));
|
|
218
|
-
result.bundles.forEach((bundle) => {
|
|
219
|
-
console.log(chalk.blue(` • ${bundle}`));
|
|
220
|
-
});
|
|
221
|
-
}
|
|
222
|
-
else {
|
|
223
|
-
console.log(chalk.yellow(`No bundles found on server "${serverName}"`));
|
|
224
|
-
}
|
|
225
|
-
}
|
|
226
|
-
/**
|
|
227
|
-
* Lists running bundles on a remote server
|
|
228
|
-
*/
|
|
229
|
-
async function listRunningBundles(serverName) {
|
|
230
|
-
// Get auth token
|
|
231
|
-
const tonkAuth = await getTonkAuth();
|
|
232
|
-
const authToken = await tonkAuth.getAuthToken();
|
|
233
|
-
if (!authToken) {
|
|
234
|
-
throw new Error('Failed to get authentication token');
|
|
235
|
-
}
|
|
236
|
-
const formData = new FormData();
|
|
237
|
-
formData.append('requestData', JSON.stringify({
|
|
238
|
-
serverName,
|
|
239
|
-
action: 'ps',
|
|
240
|
-
}));
|
|
241
|
-
const response = await fetch(`${getDeploymentServiceUrl()}/server-action`, {
|
|
242
|
-
method: 'POST',
|
|
243
|
-
headers: {
|
|
244
|
-
Authorization: `Bearer ${authToken}`,
|
|
245
|
-
},
|
|
246
|
-
body: formData,
|
|
247
|
-
});
|
|
248
|
-
// Get response text first to check if it's HTML
|
|
249
|
-
const responseText = await response.text();
|
|
250
|
-
// Try to parse as JSON
|
|
251
|
-
let result;
|
|
252
|
-
try {
|
|
253
|
-
result = JSON.parse(responseText);
|
|
254
|
-
}
|
|
255
|
-
catch {
|
|
256
|
-
console.error('Failed to parse response as JSON');
|
|
257
|
-
console.error('Full response:', responseText);
|
|
258
|
-
throw new Error('Server returned HTML instead of JSON. This usually means authentication failed or wrong URL.');
|
|
259
|
-
}
|
|
260
|
-
if (!response.ok || !result.success) {
|
|
261
|
-
throw new Error(result.error || 'Failed to list running bundles');
|
|
262
|
-
}
|
|
263
|
-
if (result.processes && result.processes.length > 0) {
|
|
264
|
-
console.log(chalk.green(`🏃 Running bundles on server "${serverName}":`));
|
|
265
|
-
result.processes.forEach((process) => {
|
|
266
|
-
console.log(chalk.blue(` • ${process.bundleName} (${process.id})`));
|
|
267
|
-
console.log(chalk.gray(` Route: ${process.route}`));
|
|
268
|
-
console.log(chalk.gray(` Status: ${process.status}`));
|
|
269
|
-
if (process.url) {
|
|
270
|
-
console.log(chalk.gray(` URL: ${process.url}`));
|
|
271
|
-
}
|
|
272
|
-
console.log('');
|
|
273
|
-
});
|
|
274
|
-
}
|
|
275
|
-
else {
|
|
276
|
-
console.log(chalk.yellow(`No running bundles on server "${serverName}"`));
|
|
277
|
-
}
|
|
278
|
-
}
|
|
279
|
-
/**
|
|
280
|
-
* Deletes a bundle from a remote server
|
|
281
|
-
*/
|
|
282
|
-
async function deleteRemoteBundle(bundleName, serverName) {
|
|
283
|
-
// Get auth token
|
|
284
|
-
const tonkAuth = await getTonkAuth();
|
|
285
|
-
const authToken = await tonkAuth.getAuthToken();
|
|
286
|
-
if (!authToken) {
|
|
287
|
-
throw new Error('Failed to get authentication token');
|
|
288
|
-
}
|
|
289
|
-
const formData = new FormData();
|
|
290
|
-
formData.append('deleteData', JSON.stringify({
|
|
291
|
-
bundleName,
|
|
292
|
-
serverName,
|
|
293
|
-
deployType: 'delete',
|
|
294
|
-
}));
|
|
295
|
-
const response = await fetch(`${getDeploymentServiceUrl()}/delete-bundle`, {
|
|
296
|
-
method: 'POST',
|
|
297
|
-
headers: {
|
|
298
|
-
Authorization: `Bearer ${authToken}`,
|
|
299
|
-
},
|
|
300
|
-
body: formData,
|
|
301
|
-
});
|
|
302
|
-
// Get response text first to check if it's HTML
|
|
303
|
-
const responseText = await response.text();
|
|
304
|
-
// Try to parse as JSON
|
|
305
|
-
let result;
|
|
306
|
-
try {
|
|
307
|
-
result = JSON.parse(responseText);
|
|
308
|
-
}
|
|
309
|
-
catch {
|
|
310
|
-
console.error('Failed to parse response as JSON');
|
|
311
|
-
console.error('Full response:', responseText);
|
|
312
|
-
throw new Error('Server returned HTML instead of JSON. This usually means authentication failed or wrong URL.');
|
|
313
|
-
}
|
|
314
|
-
if (!response.ok || !result.success) {
|
|
315
|
-
throw new Error(result.error || 'Failed to delete bundle');
|
|
316
|
-
}
|
|
317
|
-
console.log(chalk.green('Bundle deleted successfully!'));
|
|
318
|
-
console.log(chalk.green(result.message));
|
|
319
|
-
}
|
|
320
|
-
/**
|
|
321
|
-
* Server create command handler
|
|
322
|
-
*/
|
|
323
|
-
async function handleServerCreateCommand(options) {
|
|
324
|
-
const startTime = Date.now();
|
|
325
|
-
let tonkAuth = null;
|
|
326
|
-
try {
|
|
327
|
-
// Run auth check (replaces the preAction hook)
|
|
328
|
-
const authHook = await getAuthHook();
|
|
329
|
-
await authHook();
|
|
330
|
-
// Get TonkAuth instance for cleanup
|
|
331
|
-
tonkAuth = await getTonkAuth();
|
|
332
|
-
trackCommand('server-create', {
|
|
333
|
-
name: options.name,
|
|
334
|
-
region: options.region,
|
|
335
|
-
memory: options.memory,
|
|
336
|
-
cpus: options.cpus,
|
|
337
|
-
remote: options.remote,
|
|
338
|
-
});
|
|
339
|
-
console.log(chalk.cyan('🔧 Tonk Server Create\n'));
|
|
340
|
-
// Check prerequisites
|
|
341
|
-
console.log(chalk.blue('Checking prerequisites...'));
|
|
342
|
-
await checkDeploymentService();
|
|
343
|
-
// Determine server name
|
|
344
|
-
let serverName = options.name;
|
|
345
|
-
if (!serverName) {
|
|
346
|
-
const { inputName } = await inquirer.prompt([
|
|
347
|
-
{
|
|
348
|
-
type: 'input',
|
|
349
|
-
name: 'inputName',
|
|
350
|
-
message: 'Enter server name:',
|
|
351
|
-
validate: validateServerName,
|
|
352
|
-
},
|
|
353
|
-
]);
|
|
354
|
-
serverName = inputName
|
|
355
|
-
.trim()
|
|
356
|
-
.replace(/[^a-zA-Z0-9-]/g, '-')
|
|
357
|
-
.toLowerCase();
|
|
358
|
-
}
|
|
359
|
-
else {
|
|
360
|
-
// Validate provided server name
|
|
361
|
-
const validation = validateServerName(serverName);
|
|
362
|
-
if (validation !== true) {
|
|
363
|
-
throw new Error(validation);
|
|
364
|
-
}
|
|
365
|
-
}
|
|
366
|
-
console.log(chalk.green(`✓ Server name: ${serverName}`));
|
|
367
|
-
// Confirm server creation
|
|
368
|
-
const { confirm } = await inquirer.prompt([
|
|
369
|
-
{
|
|
370
|
-
type: 'confirm',
|
|
371
|
-
name: 'confirm',
|
|
372
|
-
message: `Create Tonk server "${serverName}"?`,
|
|
373
|
-
default: true,
|
|
374
|
-
},
|
|
375
|
-
]);
|
|
376
|
-
if (!confirm) {
|
|
377
|
-
console.log(chalk.yellow('Server creation cancelled'));
|
|
378
|
-
await shutdownAnalytics();
|
|
379
|
-
return;
|
|
380
|
-
}
|
|
381
|
-
// Create the server
|
|
382
|
-
await createServer(serverName, options);
|
|
383
|
-
const duration = Date.now() - startTime;
|
|
384
|
-
trackCommandSuccess('server-create', duration, {
|
|
385
|
-
serverName,
|
|
386
|
-
region: options.region,
|
|
387
|
-
memory: options.memory,
|
|
388
|
-
cpus: options.cpus,
|
|
389
|
-
remote: options.remote,
|
|
390
|
-
});
|
|
391
|
-
await shutdownAnalytics();
|
|
392
|
-
if (tonkAuth)
|
|
393
|
-
tonkAuth.destroy();
|
|
394
|
-
}
|
|
395
|
-
catch (error) {
|
|
396
|
-
const duration = Date.now() - startTime;
|
|
397
|
-
trackCommandError('server-create', error, duration, {
|
|
398
|
-
name: options.name,
|
|
399
|
-
region: options.region,
|
|
400
|
-
});
|
|
401
|
-
console.error(chalk.red(`Error: ${error instanceof Error ? error.message : String(error)}`));
|
|
402
|
-
await shutdownAnalytics();
|
|
403
|
-
if (tonkAuth)
|
|
404
|
-
tonkAuth.destroy();
|
|
405
|
-
process.exitCode = 1;
|
|
406
|
-
}
|
|
407
|
-
}
|
|
408
|
-
// Server create command
|
|
409
|
-
const serverCreateCommand = new Command('create')
|
|
410
|
-
.description('Create a new Tonk server')
|
|
411
|
-
.option('-n, --name <name>', 'Name for the server')
|
|
412
|
-
.option('-r, --region <region>', 'Region to deploy to', config.deployment.defaultRegion)
|
|
413
|
-
.option('-m, --memory <memory>', 'Memory allocation (e.g., 256mb, 1gb)', config.deployment.defaultMemory)
|
|
414
|
-
.option('-c, --cpus <cpus>', 'Number of CPUs', config.deployment.defaultCpus)
|
|
415
|
-
.option('--remote', 'Use remote Docker build (slower but works with limited local resources)')
|
|
416
|
-
.action(handleServerCreateCommand);
|
|
417
|
-
// Server ls command
|
|
418
|
-
const serverLsCommand = new Command('ls')
|
|
419
|
-
.description('List bundles on a remote Tonk server')
|
|
420
|
-
.option('-s, --server <server>', 'Name of the Tonk server')
|
|
421
|
-
.action(async (options) => {
|
|
422
|
-
const startTime = Date.now();
|
|
423
|
-
let tonkAuth = null;
|
|
424
|
-
try {
|
|
425
|
-
// Run auth check (replaces the preAction hook)
|
|
426
|
-
const authHook = await getAuthHook();
|
|
427
|
-
await authHook();
|
|
428
|
-
// Get TonkAuth instance for cleanup
|
|
429
|
-
tonkAuth = await getTonkAuth();
|
|
430
|
-
trackCommand('server-ls', {
|
|
431
|
-
server: options.server,
|
|
432
|
-
});
|
|
433
|
-
console.log(chalk.cyan('📋 Server Bundle List\n'));
|
|
434
|
-
// Check prerequisites
|
|
435
|
-
await checkDeploymentService();
|
|
436
|
-
// Get server name
|
|
437
|
-
const serverName = await getServerName(options.server);
|
|
438
|
-
// List bundles
|
|
439
|
-
await listRemoteBundles(serverName);
|
|
440
|
-
const duration = Date.now() - startTime;
|
|
441
|
-
trackCommandSuccess('server-ls', duration, {
|
|
442
|
-
serverName,
|
|
443
|
-
});
|
|
444
|
-
await shutdownAnalytics();
|
|
445
|
-
if (tonkAuth)
|
|
446
|
-
tonkAuth.destroy();
|
|
447
|
-
}
|
|
448
|
-
catch (error) {
|
|
449
|
-
const duration = Date.now() - startTime;
|
|
450
|
-
trackCommandError('server-ls', error, duration, {
|
|
451
|
-
server: options.server,
|
|
452
|
-
});
|
|
453
|
-
console.error(chalk.red(`Error: ${error instanceof Error ? error.message : String(error)}`));
|
|
454
|
-
await shutdownAnalytics();
|
|
455
|
-
if (tonkAuth)
|
|
456
|
-
tonkAuth.destroy();
|
|
457
|
-
process.exitCode = 1;
|
|
458
|
-
}
|
|
459
|
-
});
|
|
460
|
-
// Server ps command
|
|
461
|
-
const serverPsCommand = new Command('ps')
|
|
462
|
-
.description('List running bundles on a remote Tonk server')
|
|
463
|
-
.option('-s, --server <server>', 'Name of the Tonk server')
|
|
464
|
-
.action(async (options) => {
|
|
465
|
-
const startTime = Date.now();
|
|
466
|
-
let tonkAuth = null;
|
|
467
|
-
try {
|
|
468
|
-
// Run auth check (replaces the preAction hook)
|
|
469
|
-
const authHook = await getAuthHook();
|
|
470
|
-
await authHook();
|
|
471
|
-
// Get TonkAuth instance for cleanup
|
|
472
|
-
tonkAuth = await getTonkAuth();
|
|
473
|
-
trackCommand('server-ps', {
|
|
474
|
-
server: options.server,
|
|
475
|
-
});
|
|
476
|
-
console.log(chalk.cyan('🏃 Server Running Bundles\n'));
|
|
477
|
-
// Check prerequisites
|
|
478
|
-
await checkDeploymentService();
|
|
479
|
-
// Get server name
|
|
480
|
-
const serverName = await getServerName(options.server);
|
|
481
|
-
// List running bundles
|
|
482
|
-
await listRunningBundles(serverName);
|
|
483
|
-
const duration = Date.now() - startTime;
|
|
484
|
-
trackCommandSuccess('server-ps', duration, {
|
|
485
|
-
serverName,
|
|
486
|
-
});
|
|
487
|
-
await shutdownAnalytics();
|
|
488
|
-
if (tonkAuth)
|
|
489
|
-
tonkAuth.destroy();
|
|
490
|
-
}
|
|
491
|
-
catch (error) {
|
|
492
|
-
const duration = Date.now() - startTime;
|
|
493
|
-
trackCommandError('server-ps', error, duration, {
|
|
494
|
-
server: options.server,
|
|
495
|
-
});
|
|
496
|
-
console.error(chalk.red(`Error: ${error instanceof Error ? error.message : String(error)}`));
|
|
497
|
-
await shutdownAnalytics();
|
|
498
|
-
if (tonkAuth)
|
|
499
|
-
tonkAuth.destroy();
|
|
500
|
-
process.exitCode = 1;
|
|
501
|
-
}
|
|
502
|
-
});
|
|
503
|
-
// Server destroy command
|
|
504
|
-
const serverDestroyCommand = new Command('destroy')
|
|
505
|
-
.description('Permanently delete a Tonk server and all its data')
|
|
506
|
-
.action(async () => {
|
|
507
|
-
const startTime = Date.now();
|
|
508
|
-
let tonkAuth = null;
|
|
509
|
-
try {
|
|
510
|
-
// Run auth check
|
|
511
|
-
const authHook = await getAuthHook();
|
|
512
|
-
await authHook();
|
|
513
|
-
// Get TonkAuth instance for cleanup
|
|
514
|
-
tonkAuth = await getTonkAuth();
|
|
515
|
-
trackCommand('server-destroy', {});
|
|
516
|
-
console.log(chalk.red('⚠️ Server Destruction\n'));
|
|
517
|
-
console.log(chalk.yellow('WARNING: This will permanently delete your server and all data!'));
|
|
518
|
-
console.log(chalk.yellow('This action cannot be undone.\n'));
|
|
519
|
-
// Check prerequisites
|
|
520
|
-
await checkDeploymentService();
|
|
521
|
-
// Fetch user's servers
|
|
522
|
-
console.log(chalk.blue('Fetching your servers...'));
|
|
523
|
-
let userServers = [];
|
|
524
|
-
try {
|
|
525
|
-
userServers = await fetchUserServers();
|
|
526
|
-
}
|
|
527
|
-
catch (error) {
|
|
528
|
-
console.error(chalk.red(`Error fetching servers: ${error instanceof Error ? error.message : String(error)}`));
|
|
529
|
-
await shutdownAnalytics();
|
|
530
|
-
process.exitCode = 1;
|
|
531
|
-
return;
|
|
532
|
-
}
|
|
533
|
-
if (userServers.length === 0) {
|
|
534
|
-
console.log(chalk.yellow('No servers found in your account.'));
|
|
535
|
-
await shutdownAnalytics();
|
|
536
|
-
return;
|
|
537
|
-
}
|
|
538
|
-
// Server selection
|
|
539
|
-
let serverName;
|
|
540
|
-
if (userServers.length === 1) {
|
|
541
|
-
const { confirmSingle } = await inquirer.prompt([
|
|
542
|
-
{
|
|
543
|
-
type: 'confirm',
|
|
544
|
-
name: 'confirmSingle',
|
|
545
|
-
message: `Delete your only server '${userServers[0]}'?`,
|
|
546
|
-
default: false,
|
|
547
|
-
},
|
|
548
|
-
]);
|
|
549
|
-
if (!confirmSingle) {
|
|
550
|
-
console.log(chalk.yellow('Server deletion cancelled'));
|
|
551
|
-
await shutdownAnalytics();
|
|
552
|
-
return;
|
|
553
|
-
}
|
|
554
|
-
serverName = userServers[0];
|
|
555
|
-
}
|
|
556
|
-
else {
|
|
557
|
-
const { selectedServer } = await inquirer.prompt([
|
|
558
|
-
{
|
|
559
|
-
type: 'list',
|
|
560
|
-
name: 'selectedServer',
|
|
561
|
-
message: `Select a server to PERMANENTLY DELETE (${userServers.length} available):`,
|
|
562
|
-
choices: userServers,
|
|
563
|
-
},
|
|
564
|
-
]);
|
|
565
|
-
serverName = selectedServer;
|
|
566
|
-
}
|
|
567
|
-
// Final confirmation - require typing server name
|
|
568
|
-
const { confirmName } = await inquirer.prompt([
|
|
569
|
-
{
|
|
570
|
-
type: 'input',
|
|
571
|
-
name: 'confirmName',
|
|
572
|
-
message: `Type the server name '${serverName}' to confirm deletion:`,
|
|
573
|
-
validate: (input) => {
|
|
574
|
-
if (input.trim() !== serverName) {
|
|
575
|
-
return `Please type exactly '${serverName}' to confirm`;
|
|
576
|
-
}
|
|
577
|
-
return true;
|
|
578
|
-
},
|
|
579
|
-
},
|
|
580
|
-
]);
|
|
581
|
-
if (confirmName.trim() !== serverName) {
|
|
582
|
-
console.log(chalk.yellow('Server deletion cancelled'));
|
|
583
|
-
await shutdownAnalytics();
|
|
584
|
-
return;
|
|
585
|
-
}
|
|
586
|
-
// Delete the server
|
|
587
|
-
console.log(chalk.red(`\nDeleting server '${serverName}'...`));
|
|
588
|
-
await deleteServer(serverName);
|
|
589
|
-
const duration = Date.now() - startTime;
|
|
590
|
-
trackCommandSuccess('server-destroy', duration, {
|
|
591
|
-
serverName,
|
|
592
|
-
});
|
|
593
|
-
await shutdownAnalytics();
|
|
594
|
-
if (tonkAuth)
|
|
595
|
-
tonkAuth.destroy();
|
|
596
|
-
}
|
|
597
|
-
catch (error) {
|
|
598
|
-
const duration = Date.now() - startTime;
|
|
599
|
-
trackCommandError('server-destroy', error, duration, {});
|
|
600
|
-
console.error(chalk.red(`Error: ${error instanceof Error ? error.message : String(error)}`));
|
|
601
|
-
await shutdownAnalytics();
|
|
602
|
-
if (tonkAuth)
|
|
603
|
-
tonkAuth.destroy();
|
|
604
|
-
process.exitCode = 1;
|
|
605
|
-
}
|
|
606
|
-
});
|
|
607
|
-
// Server rm command
|
|
608
|
-
const serverRmCommand = new Command('rm')
|
|
609
|
-
.alias('delete')
|
|
610
|
-
.description('Delete a bundle from a remote Tonk server')
|
|
611
|
-
.option('-s, --server <server>', 'Name of the Tonk server')
|
|
612
|
-
.argument('<bundleName>', 'Name of the bundle to delete')
|
|
613
|
-
.action(async (bundleName, options) => {
|
|
614
|
-
const startTime = Date.now();
|
|
615
|
-
let tonkAuth = null;
|
|
616
|
-
try {
|
|
617
|
-
// Run auth check (replaces the preAction hook)
|
|
618
|
-
const authHook = await getAuthHook();
|
|
619
|
-
await authHook();
|
|
620
|
-
// Get TonkAuth instance for cleanup
|
|
621
|
-
tonkAuth = await getTonkAuth();
|
|
622
|
-
trackCommand('server-rm', {
|
|
623
|
-
bundleName,
|
|
624
|
-
server: options.server,
|
|
625
|
-
});
|
|
626
|
-
console.log(chalk.cyan('🗑️ Server Bundle Delete\n'));
|
|
627
|
-
// Check prerequisites
|
|
628
|
-
await checkDeploymentService();
|
|
629
|
-
// Get server name
|
|
630
|
-
const serverName = await getServerName(options.server);
|
|
631
|
-
// Confirm deletion
|
|
632
|
-
const { confirm } = await inquirer.prompt([
|
|
633
|
-
{
|
|
634
|
-
type: 'confirm',
|
|
635
|
-
name: 'confirm',
|
|
636
|
-
message: `Delete bundle "${bundleName}" from server "${serverName}"?`,
|
|
637
|
-
default: false,
|
|
638
|
-
},
|
|
639
|
-
]);
|
|
640
|
-
if (!confirm) {
|
|
641
|
-
console.log(chalk.yellow('Bundle deletion cancelled'));
|
|
642
|
-
await shutdownAnalytics();
|
|
643
|
-
return;
|
|
644
|
-
}
|
|
645
|
-
// Delete bundle
|
|
646
|
-
await deleteRemoteBundle(bundleName, serverName);
|
|
647
|
-
const duration = Date.now() - startTime;
|
|
648
|
-
trackCommandSuccess('server-rm', duration, {
|
|
649
|
-
bundleName,
|
|
650
|
-
serverName,
|
|
651
|
-
});
|
|
652
|
-
await shutdownAnalytics();
|
|
653
|
-
if (tonkAuth)
|
|
654
|
-
tonkAuth.destroy();
|
|
655
|
-
}
|
|
656
|
-
catch (error) {
|
|
657
|
-
const duration = Date.now() - startTime;
|
|
658
|
-
trackCommandError('server-rm', error, duration, {
|
|
659
|
-
bundleName,
|
|
660
|
-
server: options.server,
|
|
661
|
-
});
|
|
662
|
-
console.error(chalk.red(`Error: ${error instanceof Error ? error.message : String(error)}`));
|
|
663
|
-
await shutdownAnalytics();
|
|
664
|
-
if (tonkAuth)
|
|
665
|
-
tonkAuth.destroy();
|
|
666
|
-
process.exitCode = 1;
|
|
667
|
-
}
|
|
668
|
-
});
|
|
669
|
-
// Main server command
|
|
670
|
-
export const serverCommand = new Command('server').description('Manage Tonk servers');
|
|
671
|
-
serverCommand.addCommand(serverCreateCommand);
|
|
672
|
-
serverCommand.addCommand(serverLsCommand);
|
|
673
|
-
serverCommand.addCommand(serverPsCommand);
|
|
674
|
-
serverCommand.addCommand(serverRmCommand);
|
|
675
|
-
serverCommand.addCommand(serverDestroyCommand);
|
|
676
|
-
//# sourceMappingURL=server.js.map
|