@ai-coders/installer 0.3.0
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 +25 -0
- package/LICENSE +18 -0
- package/README.md +64 -0
- package/dist/callback-page.d.ts +11 -0
- package/dist/callback-page.js +230 -0
- package/dist/callback-page.js.map +1 -0
- package/dist/clerk-auth.d.ts +18 -0
- package/dist/clerk-auth.js +296 -0
- package/dist/clerk-auth.js.map +1 -0
- package/dist/cli-command.d.ts +10 -0
- package/dist/cli-command.js +17 -0
- package/dist/cli-command.js.map +1 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.js +84 -0
- package/dist/cli.js.map +1 -0
- package/dist/i18n.d.ts +52 -0
- package/dist/i18n.js +163 -0
- package/dist/i18n.js.map +1 -0
- package/dist/product-manifest.d.ts +43 -0
- package/dist/product-manifest.js +140 -0
- package/dist/product-manifest.js.map +1 -0
- package/dist/products/second-brain/apply.d.ts +86 -0
- package/dist/products/second-brain/apply.js +277 -0
- package/dist/products/second-brain/apply.js.map +1 -0
- package/dist/products/second-brain/bearer.d.ts +29 -0
- package/dist/products/second-brain/bearer.js +78 -0
- package/dist/products/second-brain/bearer.js.map +1 -0
- package/dist/products/second-brain/bootstrap.d.ts +33 -0
- package/dist/products/second-brain/bootstrap.js +39 -0
- package/dist/products/second-brain/bootstrap.js.map +1 -0
- package/dist/products/second-brain/envfile.d.ts +35 -0
- package/dist/products/second-brain/envfile.js +136 -0
- package/dist/products/second-brain/envfile.js.map +1 -0
- package/dist/products/second-brain/github.d.ts +77 -0
- package/dist/products/second-brain/github.js +195 -0
- package/dist/products/second-brain/github.js.map +1 -0
- package/dist/products/second-brain/hostinger.d.ts +140 -0
- package/dist/products/second-brain/hostinger.js +607 -0
- package/dist/products/second-brain/hostinger.js.map +1 -0
- package/dist/products/second-brain/i18n.d.ts +887 -0
- package/dist/products/second-brain/i18n.js +587 -0
- package/dist/products/second-brain/i18n.js.map +1 -0
- package/dist/products/second-brain/keys.d.ts +5 -0
- package/dist/products/second-brain/keys.js +16 -0
- package/dist/products/second-brain/keys.js.map +1 -0
- package/dist/products/second-brain/main.d.ts +3 -0
- package/dist/products/second-brain/main.js +78 -0
- package/dist/products/second-brain/main.js.map +1 -0
- package/dist/products/second-brain/ports.d.ts +34 -0
- package/dist/products/second-brain/ports.js +77 -0
- package/dist/products/second-brain/ports.js.map +1 -0
- package/dist/products/second-brain/recovery.d.ts +50 -0
- package/dist/products/second-brain/recovery.js +96 -0
- package/dist/products/second-brain/recovery.js.map +1 -0
- package/dist/products/second-brain/sealed-box.d.ts +1 -0
- package/dist/products/second-brain/sealed-box.js +11 -0
- package/dist/products/second-brain/sealed-box.js.map +1 -0
- package/dist/products/second-brain/server.d.ts +143 -0
- package/dist/products/second-brain/server.js +280 -0
- package/dist/products/second-brain/server.js.map +1 -0
- package/dist/products/second-brain/service.d.ts +26 -0
- package/dist/products/second-brain/service.js +806 -0
- package/dist/products/second-brain/service.js.map +1 -0
- package/dist/products/second-brain/ssh.d.ts +35 -0
- package/dist/products/second-brain/ssh.js +140 -0
- package/dist/products/second-brain/ssh.js.map +1 -0
- package/dist/products/second-brain/state.d.ts +27 -0
- package/dist/products/second-brain/state.js +60 -0
- package/dist/products/second-brain/state.js.map +1 -0
- package/dist/products/second-brain/ui/assets/index-BoXpakUt.css +2 -0
- package/dist/products/second-brain/ui/assets/index-MgfOpW_R.js +66 -0
- package/dist/products/second-brain/ui/index.html +15 -0
- package/dist/products/second-brain/verify.d.ts +23 -0
- package/dist/products/second-brain/verify.js +59 -0
- package/dist/products/second-brain/verify.js.map +1 -0
- package/dist/products/severino/apply.d.ts +87 -0
- package/dist/products/severino/apply.js +250 -0
- package/dist/products/severino/apply.js.map +1 -0
- package/dist/products/severino/domain.d.ts +6 -0
- package/dist/products/severino/domain.js +20 -0
- package/dist/products/severino/domain.js.map +1 -0
- package/dist/products/severino/envfile.d.ts +20 -0
- package/dist/products/severino/envfile.js +89 -0
- package/dist/products/severino/envfile.js.map +1 -0
- package/dist/products/severino/github.d.ts +77 -0
- package/dist/products/severino/github.js +195 -0
- package/dist/products/severino/github.js.map +1 -0
- package/dist/products/severino/hostinger.d.ts +140 -0
- package/dist/products/severino/hostinger.js +607 -0
- package/dist/products/severino/hostinger.js.map +1 -0
- package/dist/products/severino/i18n.d.ts +887 -0
- package/dist/products/severino/i18n.js +587 -0
- package/dist/products/severino/i18n.js.map +1 -0
- package/dist/products/severino/keys.d.ts +5 -0
- package/dist/products/severino/keys.js +16 -0
- package/dist/products/severino/keys.js.map +1 -0
- package/dist/products/severino/main.d.ts +3 -0
- package/dist/products/severino/main.js +78 -0
- package/dist/products/severino/main.js.map +1 -0
- package/dist/products/severino/recovery.d.ts +50 -0
- package/dist/products/severino/recovery.js +96 -0
- package/dist/products/severino/recovery.js.map +1 -0
- package/dist/products/severino/sealed-box.d.ts +1 -0
- package/dist/products/severino/sealed-box.js +11 -0
- package/dist/products/severino/sealed-box.js.map +1 -0
- package/dist/products/severino/server.d.ts +123 -0
- package/dist/products/severino/server.js +274 -0
- package/dist/products/severino/server.js.map +1 -0
- package/dist/products/severino/service.d.ts +28 -0
- package/dist/products/severino/service.js +752 -0
- package/dist/products/severino/service.js.map +1 -0
- package/dist/products/severino/slack-manifest.d.ts +3 -0
- package/dist/products/severino/slack-manifest.js +45 -0
- package/dist/products/severino/slack-manifest.js.map +1 -0
- package/dist/products/severino/ssh.d.ts +35 -0
- package/dist/products/severino/ssh.js +140 -0
- package/dist/products/severino/ssh.js.map +1 -0
- package/dist/products/severino/state.d.ts +26 -0
- package/dist/products/severino/state.js +61 -0
- package/dist/products/severino/state.js.map +1 -0
- package/dist/products/severino/ui/assets/index-7S8Hl4jq.js +96 -0
- package/dist/products/severino/ui/assets/index-D5kql1Bh.css +2 -0
- package/dist/products/severino/ui/index.html +15 -0
- package/dist/products/severino/verify.d.ts +22 -0
- package/dist/products/severino/verify.js +149 -0
- package/dist/products/severino/verify.js.map +1 -0
- package/package.json +53 -0
|
@@ -0,0 +1,607 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Minimal Hostinger VPS client for the local installer. Credentials remain in
|
|
3
|
+
* this instance only; upstream response messages are never surfaced because
|
|
4
|
+
* they may echo request data.
|
|
5
|
+
*/
|
|
6
|
+
import { isIPv4 } from "node:net";
|
|
7
|
+
export class HostingerApiError extends Error {
|
|
8
|
+
name = "HostingerApiError";
|
|
9
|
+
status;
|
|
10
|
+
code;
|
|
11
|
+
correlationId;
|
|
12
|
+
retryable;
|
|
13
|
+
retryAfterMs;
|
|
14
|
+
validationFields;
|
|
15
|
+
constructor(options) {
|
|
16
|
+
super(withCorrelationId(options.message, options.correlationId), {
|
|
17
|
+
...(options.cause === undefined ? {} : { cause: options.cause }),
|
|
18
|
+
});
|
|
19
|
+
this.status = options.status;
|
|
20
|
+
this.code = options.code;
|
|
21
|
+
this.correlationId = options.correlationId;
|
|
22
|
+
this.retryable = options.retryable;
|
|
23
|
+
this.retryAfterMs = options.retryAfterMs;
|
|
24
|
+
this.validationFields = Object.freeze((options.validationFields ?? []).filter((field) => /^[A-Za-z][A-Za-z0-9_.-]{0,63}$/.test(field)));
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
export class HostingerPasswordValidationError extends Error {
|
|
28
|
+
name = "HostingerPasswordValidationError";
|
|
29
|
+
issues;
|
|
30
|
+
constructor(issues) {
|
|
31
|
+
super("The root password does not meet Hostinger's password requirements.");
|
|
32
|
+
this.issues = issues;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
export class HostingerActionFailedError extends Error {
|
|
36
|
+
name = "HostingerActionFailedError";
|
|
37
|
+
virtualMachineId;
|
|
38
|
+
actionId;
|
|
39
|
+
correlationId;
|
|
40
|
+
constructor(options) {
|
|
41
|
+
super(withCorrelationId("Hostinger could not update the root password.", options.correlationId));
|
|
42
|
+
this.virtualMachineId = options.virtualMachineId;
|
|
43
|
+
this.actionId = options.actionId;
|
|
44
|
+
this.correlationId = options.correlationId;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
export class HostingerActionTimeoutError extends Error {
|
|
48
|
+
name = "HostingerActionTimeoutError";
|
|
49
|
+
virtualMachineId;
|
|
50
|
+
actionId;
|
|
51
|
+
timeoutMs;
|
|
52
|
+
correlationId;
|
|
53
|
+
constructor(options) {
|
|
54
|
+
super(withCorrelationId("Hostinger did not finish updating the root password within the allowed time.", options.correlationId));
|
|
55
|
+
this.virtualMachineId = options.virtualMachineId;
|
|
56
|
+
this.actionId = options.actionId;
|
|
57
|
+
this.timeoutMs = options.timeoutMs;
|
|
58
|
+
this.correlationId = options.correlationId;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
export class HostingerActionOutcomeUnknownError extends Error {
|
|
62
|
+
name = "HostingerActionOutcomeUnknownError";
|
|
63
|
+
virtualMachineId;
|
|
64
|
+
actionId;
|
|
65
|
+
correlationId;
|
|
66
|
+
reason;
|
|
67
|
+
constructor(options) {
|
|
68
|
+
super(withCorrelationId("Hostinger accepted the root password update, but its final outcome could not be confirmed.", options.correlationId));
|
|
69
|
+
this.virtualMachineId = options.virtualMachineId;
|
|
70
|
+
this.actionId = options.actionId;
|
|
71
|
+
this.correlationId = options.correlationId;
|
|
72
|
+
this.reason = options.reason;
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
const defaultApiBase = "https://developers.hostinger.com";
|
|
76
|
+
const defaultPolling = {
|
|
77
|
+
intervalMs: 2_000,
|
|
78
|
+
maxIntervalMs: 20_000,
|
|
79
|
+
timeoutMs: 180_000,
|
|
80
|
+
};
|
|
81
|
+
const defaultGetRetry = {
|
|
82
|
+
maxAttempts: 3,
|
|
83
|
+
baseDelayMs: 500,
|
|
84
|
+
maxDelayMs: 5_000,
|
|
85
|
+
};
|
|
86
|
+
const defaultRequestTimeoutMs = 20_000;
|
|
87
|
+
export const hostingerRootPasswordSymbols = "-().&@?'#,/;+";
|
|
88
|
+
const pendingActionStates = new Set([
|
|
89
|
+
"created",
|
|
90
|
+
"sent",
|
|
91
|
+
"delayed",
|
|
92
|
+
]);
|
|
93
|
+
const actionStates = new Set([
|
|
94
|
+
...pendingActionStates,
|
|
95
|
+
"success",
|
|
96
|
+
"error",
|
|
97
|
+
]);
|
|
98
|
+
function withCorrelationId(message, correlationId) {
|
|
99
|
+
return correlationId === null
|
|
100
|
+
? message
|
|
101
|
+
: `${message} Correlation ID: ${correlationId}.`;
|
|
102
|
+
}
|
|
103
|
+
function safeCorrelationId(value) {
|
|
104
|
+
if (typeof value !== "string")
|
|
105
|
+
return null;
|
|
106
|
+
const trimmed = value.trim();
|
|
107
|
+
return /^[A-Za-z0-9._:-]{1,128}$/.test(trimmed) ? trimmed : null;
|
|
108
|
+
}
|
|
109
|
+
function isRecord(value) {
|
|
110
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
111
|
+
}
|
|
112
|
+
function requiredInteger(record, key) {
|
|
113
|
+
const value = record[key];
|
|
114
|
+
if (!Number.isSafeInteger(value) || value < 1) {
|
|
115
|
+
throw new TypeError(`Invalid ${key}.`);
|
|
116
|
+
}
|
|
117
|
+
return value;
|
|
118
|
+
}
|
|
119
|
+
function requiredString(record, key) {
|
|
120
|
+
const value = record[key];
|
|
121
|
+
if (typeof value !== "string")
|
|
122
|
+
throw new TypeError(`Invalid ${key}.`);
|
|
123
|
+
return value;
|
|
124
|
+
}
|
|
125
|
+
function nullableString(record, key) {
|
|
126
|
+
const value = record[key];
|
|
127
|
+
if (value === null || value === undefined)
|
|
128
|
+
return null;
|
|
129
|
+
if (typeof value !== "string")
|
|
130
|
+
throw new TypeError(`Invalid ${key}.`);
|
|
131
|
+
return value;
|
|
132
|
+
}
|
|
133
|
+
function safeHttpsUrl(value) {
|
|
134
|
+
if (value === null)
|
|
135
|
+
return null;
|
|
136
|
+
try {
|
|
137
|
+
const url = new URL(value);
|
|
138
|
+
return url.protocol === "https:" ? url.toString() : null;
|
|
139
|
+
}
|
|
140
|
+
catch {
|
|
141
|
+
return null;
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
function mapTemplate(value) {
|
|
145
|
+
if (value === null)
|
|
146
|
+
return null;
|
|
147
|
+
if (!isRecord(value))
|
|
148
|
+
throw new TypeError("Invalid template.");
|
|
149
|
+
return {
|
|
150
|
+
id: requiredInteger(value, "id"),
|
|
151
|
+
name: requiredString(value, "name"),
|
|
152
|
+
description: nullableString(value, "description"),
|
|
153
|
+
documentation: safeHttpsUrl(nullableString(value, "documentation")),
|
|
154
|
+
};
|
|
155
|
+
}
|
|
156
|
+
function mapIpv4(value) {
|
|
157
|
+
if (!Array.isArray(value))
|
|
158
|
+
throw new TypeError("Invalid IPv4 addresses.");
|
|
159
|
+
return value.map((entry) => {
|
|
160
|
+
if (!isRecord(entry))
|
|
161
|
+
throw new TypeError("Invalid IPv4 address.");
|
|
162
|
+
const address = requiredString(entry, "address");
|
|
163
|
+
if (!isIPv4(address))
|
|
164
|
+
throw new TypeError("Invalid IPv4 address.");
|
|
165
|
+
return {
|
|
166
|
+
id: requiredInteger(entry, "id"),
|
|
167
|
+
address,
|
|
168
|
+
ptr: nullableString(entry, "ptr"),
|
|
169
|
+
};
|
|
170
|
+
});
|
|
171
|
+
}
|
|
172
|
+
function mapVirtualMachines(value) {
|
|
173
|
+
if (!Array.isArray(value))
|
|
174
|
+
throw new TypeError("Invalid virtual machines.");
|
|
175
|
+
return value.map((entry) => {
|
|
176
|
+
if (!isRecord(entry))
|
|
177
|
+
throw new TypeError("Invalid virtual machine.");
|
|
178
|
+
return {
|
|
179
|
+
id: requiredInteger(entry, "id"),
|
|
180
|
+
hostname: requiredString(entry, "hostname"),
|
|
181
|
+
state: requiredString(entry, "state"),
|
|
182
|
+
actionsLock: requiredString(entry, "actions_lock"),
|
|
183
|
+
plan: requiredString(entry, "plan"),
|
|
184
|
+
template: mapTemplate(entry.template),
|
|
185
|
+
ipv4: mapIpv4(entry.ipv4),
|
|
186
|
+
};
|
|
187
|
+
});
|
|
188
|
+
}
|
|
189
|
+
function mapAction(value) {
|
|
190
|
+
if (!isRecord(value))
|
|
191
|
+
throw new TypeError("Invalid action.");
|
|
192
|
+
const state = requiredString(value, "state");
|
|
193
|
+
if (!actionStates.has(state)) {
|
|
194
|
+
throw new TypeError("Invalid action state.");
|
|
195
|
+
}
|
|
196
|
+
return {
|
|
197
|
+
id: requiredInteger(value, "id"),
|
|
198
|
+
name: requiredString(value, "name"),
|
|
199
|
+
state: state,
|
|
200
|
+
createdAt: requiredString(value, "created_at"),
|
|
201
|
+
updatedAt: requiredString(value, "updated_at"),
|
|
202
|
+
};
|
|
203
|
+
}
|
|
204
|
+
function validatePollingValue(name, value) {
|
|
205
|
+
if (!Number.isFinite(value) || value <= 0) {
|
|
206
|
+
throw new RangeError(`${name} must be a positive number.`);
|
|
207
|
+
}
|
|
208
|
+
return value;
|
|
209
|
+
}
|
|
210
|
+
function validateRetryAttempts(value) {
|
|
211
|
+
if (!Number.isInteger(value) || value < 1) {
|
|
212
|
+
throw new RangeError("GET retry attempts must be a positive integer.");
|
|
213
|
+
}
|
|
214
|
+
return value;
|
|
215
|
+
}
|
|
216
|
+
function parseRetryAfterMs(response, now) {
|
|
217
|
+
const value = response.headers.get("retry-after")?.trim();
|
|
218
|
+
if (value === undefined || value === "")
|
|
219
|
+
return null;
|
|
220
|
+
if (/^\d+(?:\.\d+)?$/.test(value)) {
|
|
221
|
+
return Math.ceil(Number(value) * 1_000);
|
|
222
|
+
}
|
|
223
|
+
const date = Date.parse(value);
|
|
224
|
+
return Number.isNaN(date) ? null : Math.max(0, date - now());
|
|
225
|
+
}
|
|
226
|
+
function apiError(status, correlationId, retryAfterMs, value) {
|
|
227
|
+
if (status === 401) {
|
|
228
|
+
return new HostingerApiError({
|
|
229
|
+
status,
|
|
230
|
+
code: "unauthorized",
|
|
231
|
+
correlationId,
|
|
232
|
+
retryable: false,
|
|
233
|
+
retryAfterMs,
|
|
234
|
+
message: "Hostinger rejected the API token. Check the token and try again.",
|
|
235
|
+
});
|
|
236
|
+
}
|
|
237
|
+
if (status === 422) {
|
|
238
|
+
return new HostingerApiError({
|
|
239
|
+
status,
|
|
240
|
+
code: "validation_failed",
|
|
241
|
+
correlationId,
|
|
242
|
+
retryable: false,
|
|
243
|
+
retryAfterMs,
|
|
244
|
+
validationFields: isRecord(value) && isRecord(value.errors)
|
|
245
|
+
? Object.keys(value.errors)
|
|
246
|
+
: [],
|
|
247
|
+
message: "Hostinger rejected the request. Check the supplied values and try again.",
|
|
248
|
+
});
|
|
249
|
+
}
|
|
250
|
+
if (status === 429) {
|
|
251
|
+
return new HostingerApiError({
|
|
252
|
+
status,
|
|
253
|
+
code: "rate_limited",
|
|
254
|
+
correlationId,
|
|
255
|
+
retryable: true,
|
|
256
|
+
retryAfterMs,
|
|
257
|
+
message: "Hostinger's request limit was reached. Wait and try again.",
|
|
258
|
+
});
|
|
259
|
+
}
|
|
260
|
+
if (status >= 500) {
|
|
261
|
+
return new HostingerApiError({
|
|
262
|
+
status,
|
|
263
|
+
code: "server_error",
|
|
264
|
+
correlationId,
|
|
265
|
+
retryable: true,
|
|
266
|
+
retryAfterMs,
|
|
267
|
+
message: "Hostinger is temporarily unavailable. Try again later.",
|
|
268
|
+
});
|
|
269
|
+
}
|
|
270
|
+
return new HostingerApiError({
|
|
271
|
+
status,
|
|
272
|
+
code: "unexpected_status",
|
|
273
|
+
correlationId,
|
|
274
|
+
retryable: false,
|
|
275
|
+
retryAfterMs,
|
|
276
|
+
message: `Hostinger rejected the request (HTTP ${status}).`,
|
|
277
|
+
});
|
|
278
|
+
}
|
|
279
|
+
function invalidResponse(status, correlationId, cause) {
|
|
280
|
+
return new HostingerApiError({
|
|
281
|
+
status,
|
|
282
|
+
code: "invalid_response",
|
|
283
|
+
correlationId,
|
|
284
|
+
retryable: false,
|
|
285
|
+
retryAfterMs: null,
|
|
286
|
+
message: "Hostinger returned an invalid response. Try again later.",
|
|
287
|
+
cause,
|
|
288
|
+
});
|
|
289
|
+
}
|
|
290
|
+
function responseCorrelationId(response, value) {
|
|
291
|
+
const bodyCorrelationId = isRecord(value)
|
|
292
|
+
? safeCorrelationId(value.correlation_id ?? value.correlationId)
|
|
293
|
+
: null;
|
|
294
|
+
return (bodyCorrelationId ??
|
|
295
|
+
safeCorrelationId(response.headers.get("x-correlation-id")) ??
|
|
296
|
+
safeCorrelationId(response.headers.get("x-request-id")));
|
|
297
|
+
}
|
|
298
|
+
export function validateHostingerRootPassword(password) {
|
|
299
|
+
const issues = [];
|
|
300
|
+
if (password.length < 12)
|
|
301
|
+
issues.push("minimum_length");
|
|
302
|
+
if (!/[A-Z]/.test(password))
|
|
303
|
+
issues.push("uppercase");
|
|
304
|
+
if (!/[a-z]/.test(password))
|
|
305
|
+
issues.push("lowercase");
|
|
306
|
+
if (!/[0-9]/.test(password))
|
|
307
|
+
issues.push("number");
|
|
308
|
+
if (![...password].some((character) => hostingerRootPasswordSymbols.includes(character))) {
|
|
309
|
+
issues.push("symbol");
|
|
310
|
+
}
|
|
311
|
+
if (![...password].every((character) => /^[A-Za-z0-9]$/.test(character) ||
|
|
312
|
+
hostingerRootPasswordSymbols.includes(character))) {
|
|
313
|
+
issues.push("unsupported_character");
|
|
314
|
+
}
|
|
315
|
+
return { valid: issues.length === 0, issues };
|
|
316
|
+
}
|
|
317
|
+
export class HostingerClient {
|
|
318
|
+
token;
|
|
319
|
+
fetchLike;
|
|
320
|
+
apiBase;
|
|
321
|
+
sleep;
|
|
322
|
+
polling;
|
|
323
|
+
retry;
|
|
324
|
+
random;
|
|
325
|
+
now;
|
|
326
|
+
requestTimeoutMs;
|
|
327
|
+
activeRequests = new Set();
|
|
328
|
+
constructor(options) {
|
|
329
|
+
const token = options.token.trim();
|
|
330
|
+
if (token.length === 0) {
|
|
331
|
+
throw new TypeError("A Hostinger API token is required.");
|
|
332
|
+
}
|
|
333
|
+
this.token = token;
|
|
334
|
+
this.fetchLike = options.fetchLike ?? fetch;
|
|
335
|
+
this.apiBase = (options.apiBase ?? defaultApiBase).replace(/\/+$/, "");
|
|
336
|
+
this.sleep =
|
|
337
|
+
options.sleep ??
|
|
338
|
+
((ms) => new Promise((resolve) => setTimeout(resolve, ms)));
|
|
339
|
+
this.polling = {
|
|
340
|
+
intervalMs: validatePollingValue("Polling interval", options.polling?.intervalMs ?? defaultPolling.intervalMs),
|
|
341
|
+
maxIntervalMs: validatePollingValue("Maximum polling interval", options.polling?.maxIntervalMs ?? defaultPolling.maxIntervalMs),
|
|
342
|
+
timeoutMs: validatePollingValue("Polling timeout", options.polling?.timeoutMs ?? defaultPolling.timeoutMs),
|
|
343
|
+
};
|
|
344
|
+
this.retry = {
|
|
345
|
+
maxAttempts: validateRetryAttempts(options.retry?.maxAttempts ?? defaultGetRetry.maxAttempts),
|
|
346
|
+
baseDelayMs: validatePollingValue("GET retry base delay", options.retry?.baseDelayMs ?? defaultGetRetry.baseDelayMs),
|
|
347
|
+
maxDelayMs: validatePollingValue("GET retry maximum delay", options.retry?.maxDelayMs ?? defaultGetRetry.maxDelayMs),
|
|
348
|
+
};
|
|
349
|
+
this.random = options.random ?? Math.random;
|
|
350
|
+
this.now = options.now ?? Date.now;
|
|
351
|
+
this.requestTimeoutMs = validatePollingValue("Request timeout", options.requestTimeoutMs ?? defaultRequestTimeoutMs);
|
|
352
|
+
if (this.polling.maxIntervalMs < this.polling.intervalMs) {
|
|
353
|
+
throw new RangeError("Maximum polling interval must not be less than the polling interval.");
|
|
354
|
+
}
|
|
355
|
+
}
|
|
356
|
+
async request(method, path, body, requestTimeoutMs = this.requestTimeoutMs) {
|
|
357
|
+
const token = this.token;
|
|
358
|
+
if (token === null) {
|
|
359
|
+
throw new HostingerApiError({
|
|
360
|
+
status: 0,
|
|
361
|
+
code: "client_closed",
|
|
362
|
+
correlationId: null,
|
|
363
|
+
retryable: false,
|
|
364
|
+
retryAfterMs: null,
|
|
365
|
+
message: "The Hostinger connection is closed.",
|
|
366
|
+
});
|
|
367
|
+
}
|
|
368
|
+
const abortController = new AbortController();
|
|
369
|
+
this.activeRequests.add(abortController);
|
|
370
|
+
const timeout = setTimeout(() => abortController.abort(), validatePollingValue("Request timeout", requestTimeoutMs));
|
|
371
|
+
const init = {
|
|
372
|
+
method,
|
|
373
|
+
headers: {
|
|
374
|
+
authorization: `Bearer ${token}`,
|
|
375
|
+
accept: "application/json",
|
|
376
|
+
...(body === undefined ? {} : { "content-type": "application/json" }),
|
|
377
|
+
},
|
|
378
|
+
redirect: "error",
|
|
379
|
+
signal: abortController.signal,
|
|
380
|
+
...(body === undefined ? {} : { body: JSON.stringify(body) }),
|
|
381
|
+
};
|
|
382
|
+
try {
|
|
383
|
+
let response;
|
|
384
|
+
try {
|
|
385
|
+
response = await this.fetchLike(`${this.apiBase}${path}`, init);
|
|
386
|
+
}
|
|
387
|
+
catch (cause) {
|
|
388
|
+
const closed = this.token === null;
|
|
389
|
+
const timedOut = abortController.signal.aborted && !closed;
|
|
390
|
+
throw new HostingerApiError({
|
|
391
|
+
status: 0,
|
|
392
|
+
code: closed
|
|
393
|
+
? "client_closed"
|
|
394
|
+
: timedOut
|
|
395
|
+
? "request_timeout"
|
|
396
|
+
: "network_error",
|
|
397
|
+
correlationId: null,
|
|
398
|
+
retryable: !closed,
|
|
399
|
+
retryAfterMs: null,
|
|
400
|
+
message: closed
|
|
401
|
+
? "The Hostinger connection was closed."
|
|
402
|
+
: timedOut
|
|
403
|
+
? "Hostinger did not respond within the request deadline."
|
|
404
|
+
: "Hostinger could not be reached. Check the connection and try again.",
|
|
405
|
+
cause,
|
|
406
|
+
});
|
|
407
|
+
}
|
|
408
|
+
let value;
|
|
409
|
+
try {
|
|
410
|
+
value = await response.json();
|
|
411
|
+
}
|
|
412
|
+
catch (cause) {
|
|
413
|
+
const correlationId = responseCorrelationId(response, null);
|
|
414
|
+
if (!response.ok) {
|
|
415
|
+
throw apiError(response.status, correlationId, parseRetryAfterMs(response, this.now), null);
|
|
416
|
+
}
|
|
417
|
+
if (abortController.signal.aborted) {
|
|
418
|
+
throw new HostingerApiError({
|
|
419
|
+
status: 0,
|
|
420
|
+
code: this.token === null ? "client_closed" : "request_timeout",
|
|
421
|
+
correlationId,
|
|
422
|
+
retryable: this.token !== null,
|
|
423
|
+
retryAfterMs: null,
|
|
424
|
+
message: this.token === null
|
|
425
|
+
? "The Hostinger connection was closed."
|
|
426
|
+
: "Hostinger did not respond within the request deadline.",
|
|
427
|
+
cause,
|
|
428
|
+
});
|
|
429
|
+
}
|
|
430
|
+
throw invalidResponse(response.status, correlationId, cause);
|
|
431
|
+
}
|
|
432
|
+
const correlationId = responseCorrelationId(response, value);
|
|
433
|
+
if (!response.ok) {
|
|
434
|
+
throw apiError(response.status, correlationId, parseRetryAfterMs(response, this.now), value);
|
|
435
|
+
}
|
|
436
|
+
return { value, correlationId, status: response.status };
|
|
437
|
+
}
|
|
438
|
+
finally {
|
|
439
|
+
clearTimeout(timeout);
|
|
440
|
+
this.activeRequests.delete(abortController);
|
|
441
|
+
}
|
|
442
|
+
}
|
|
443
|
+
getRetryDelayMs(failedAttempt) {
|
|
444
|
+
return this.getJitteredDelayMs(this.retry.baseDelayMs, this.retry.maxDelayMs, failedAttempt - 1);
|
|
445
|
+
}
|
|
446
|
+
getJitteredDelayMs(baseDelayMs, maxDelayMs, exponent) {
|
|
447
|
+
const exponential = Math.min(maxDelayMs, baseDelayMs * 2 ** exponent);
|
|
448
|
+
const random = Math.min(1, Math.max(0, this.random()));
|
|
449
|
+
return Math.max(1, Math.min(maxDelayMs, Math.floor(exponential * (0.5 + random))));
|
|
450
|
+
}
|
|
451
|
+
async requestActionWithRetries(path, availableMs) {
|
|
452
|
+
let waitedMs = 0;
|
|
453
|
+
for (let attempt = 1; attempt <= this.retry.maxAttempts; attempt += 1) {
|
|
454
|
+
const requestAvailableMs = availableMs - waitedMs;
|
|
455
|
+
if (requestAvailableMs <= 0)
|
|
456
|
+
return null;
|
|
457
|
+
const requestDeadlineMs = Math.min(this.requestTimeoutMs, requestAvailableMs);
|
|
458
|
+
try {
|
|
459
|
+
return {
|
|
460
|
+
response: await this.request("GET", path, undefined, requestDeadlineMs),
|
|
461
|
+
waitedMs,
|
|
462
|
+
};
|
|
463
|
+
}
|
|
464
|
+
catch (error) {
|
|
465
|
+
if (error instanceof HostingerApiError &&
|
|
466
|
+
error.code === "request_timeout") {
|
|
467
|
+
waitedMs += requestDeadlineMs;
|
|
468
|
+
if (waitedMs >= availableMs)
|
|
469
|
+
return null;
|
|
470
|
+
}
|
|
471
|
+
if (!(error instanceof HostingerApiError) ||
|
|
472
|
+
!error.retryable ||
|
|
473
|
+
attempt === this.retry.maxAttempts) {
|
|
474
|
+
throw error;
|
|
475
|
+
}
|
|
476
|
+
const retryDelayMs = Math.min(this.retry.maxDelayMs, error.retryAfterMs ?? this.getRetryDelayMs(attempt));
|
|
477
|
+
const remainingMs = availableMs - waitedMs;
|
|
478
|
+
if (remainingMs <= 0)
|
|
479
|
+
return null;
|
|
480
|
+
const delayMs = Math.min(retryDelayMs, remainingMs);
|
|
481
|
+
await this.sleep(delayMs);
|
|
482
|
+
waitedMs += delayMs;
|
|
483
|
+
if (delayMs < retryDelayMs)
|
|
484
|
+
return null;
|
|
485
|
+
}
|
|
486
|
+
}
|
|
487
|
+
return null;
|
|
488
|
+
}
|
|
489
|
+
async listVirtualMachines() {
|
|
490
|
+
const response = await this.request("GET", "/api/vps/v1/virtual-machines");
|
|
491
|
+
try {
|
|
492
|
+
return mapVirtualMachines(response.value);
|
|
493
|
+
}
|
|
494
|
+
catch (cause) {
|
|
495
|
+
throw invalidResponse(response.status, response.correlationId, cause);
|
|
496
|
+
}
|
|
497
|
+
}
|
|
498
|
+
close() {
|
|
499
|
+
this.token = null;
|
|
500
|
+
for (const request of this.activeRequests)
|
|
501
|
+
request.abort();
|
|
502
|
+
this.activeRequests.clear();
|
|
503
|
+
}
|
|
504
|
+
async setRootPassword(virtualMachineId, password, polling) {
|
|
505
|
+
if (!Number.isSafeInteger(virtualMachineId) || virtualMachineId < 1) {
|
|
506
|
+
throw new TypeError("The virtual machine ID must be a positive safe integer.");
|
|
507
|
+
}
|
|
508
|
+
const validation = validateHostingerRootPassword(password);
|
|
509
|
+
if (!validation.valid) {
|
|
510
|
+
throw new HostingerPasswordValidationError(validation.issues);
|
|
511
|
+
}
|
|
512
|
+
const intervalMs = validatePollingValue("Polling interval", polling?.intervalMs ?? this.polling.intervalMs);
|
|
513
|
+
const maxIntervalMs = validatePollingValue("Maximum polling interval", polling?.maxIntervalMs ?? this.polling.maxIntervalMs);
|
|
514
|
+
const timeoutMs = validatePollingValue("Polling timeout", polling?.timeoutMs ?? this.polling.timeoutMs);
|
|
515
|
+
if (maxIntervalMs < intervalMs) {
|
|
516
|
+
throw new RangeError("Maximum polling interval must not be less than the polling interval.");
|
|
517
|
+
}
|
|
518
|
+
const basePath = `/api/vps/v1/virtual-machines/${virtualMachineId}`;
|
|
519
|
+
let response = await this.request("PUT", `${basePath}/root-password`, {
|
|
520
|
+
password,
|
|
521
|
+
});
|
|
522
|
+
let current;
|
|
523
|
+
try {
|
|
524
|
+
current = mapAction(response.value);
|
|
525
|
+
}
|
|
526
|
+
catch (cause) {
|
|
527
|
+
throw invalidResponse(response.status, response.correlationId, cause);
|
|
528
|
+
}
|
|
529
|
+
let elapsedMs = 0;
|
|
530
|
+
const startedAt = this.now();
|
|
531
|
+
let pollAttempt = 0;
|
|
532
|
+
while (pendingActionStates.has(current.state)) {
|
|
533
|
+
const remainingMs = timeoutMs - Math.max(elapsedMs, this.now() - startedAt);
|
|
534
|
+
const delayMs = Math.min(this.getJitteredDelayMs(intervalMs, maxIntervalMs, pollAttempt), remainingMs);
|
|
535
|
+
if (delayMs <= 0) {
|
|
536
|
+
throw new HostingerActionOutcomeUnknownError({
|
|
537
|
+
virtualMachineId,
|
|
538
|
+
actionId: current.id,
|
|
539
|
+
correlationId: response.correlationId,
|
|
540
|
+
reason: "poll_timeout",
|
|
541
|
+
});
|
|
542
|
+
}
|
|
543
|
+
try {
|
|
544
|
+
await this.sleep(delayMs);
|
|
545
|
+
}
|
|
546
|
+
catch {
|
|
547
|
+
throw new HostingerActionOutcomeUnknownError({
|
|
548
|
+
virtualMachineId,
|
|
549
|
+
actionId: current.id,
|
|
550
|
+
correlationId: response.correlationId,
|
|
551
|
+
reason: "poll_failed",
|
|
552
|
+
});
|
|
553
|
+
}
|
|
554
|
+
elapsedMs += delayMs;
|
|
555
|
+
pollAttempt += 1;
|
|
556
|
+
const expectedActionId = current.id;
|
|
557
|
+
let polled;
|
|
558
|
+
try {
|
|
559
|
+
polled = await this.requestActionWithRetries(`${basePath}/actions/${expectedActionId}`, timeoutMs - Math.max(elapsedMs, this.now() - startedAt));
|
|
560
|
+
}
|
|
561
|
+
catch (error) {
|
|
562
|
+
throw new HostingerActionOutcomeUnknownError({
|
|
563
|
+
virtualMachineId,
|
|
564
|
+
actionId: expectedActionId,
|
|
565
|
+
correlationId: error instanceof HostingerApiError
|
|
566
|
+
? error.correlationId
|
|
567
|
+
: response.correlationId,
|
|
568
|
+
reason: "poll_failed",
|
|
569
|
+
});
|
|
570
|
+
}
|
|
571
|
+
if (polled === null) {
|
|
572
|
+
throw new HostingerActionOutcomeUnknownError({
|
|
573
|
+
virtualMachineId,
|
|
574
|
+
actionId: current.id,
|
|
575
|
+
correlationId: response.correlationId,
|
|
576
|
+
reason: "poll_timeout",
|
|
577
|
+
});
|
|
578
|
+
}
|
|
579
|
+
elapsedMs += polled.waitedMs;
|
|
580
|
+
response = polled.response;
|
|
581
|
+
try {
|
|
582
|
+
current = mapAction(response.value);
|
|
583
|
+
if (current.id !== expectedActionId) {
|
|
584
|
+
throw new TypeError("Mismatched action ID.");
|
|
585
|
+
}
|
|
586
|
+
}
|
|
587
|
+
catch (cause) {
|
|
588
|
+
const error = invalidResponse(response.status, response.correlationId, cause);
|
|
589
|
+
throw new HostingerActionOutcomeUnknownError({
|
|
590
|
+
virtualMachineId,
|
|
591
|
+
actionId: expectedActionId,
|
|
592
|
+
correlationId: error.correlationId,
|
|
593
|
+
reason: "poll_failed",
|
|
594
|
+
});
|
|
595
|
+
}
|
|
596
|
+
}
|
|
597
|
+
if (current.state === "error") {
|
|
598
|
+
throw new HostingerActionFailedError({
|
|
599
|
+
virtualMachineId,
|
|
600
|
+
actionId: current.id,
|
|
601
|
+
correlationId: response.correlationId,
|
|
602
|
+
});
|
|
603
|
+
}
|
|
604
|
+
return current;
|
|
605
|
+
}
|
|
606
|
+
}
|
|
607
|
+
//# sourceMappingURL=hostinger.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hostinger.js","sourceRoot":"","sources":["../../../packages/severino/src/hostinger.ts"],"names":[],"mappings":"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"}
|