virtualizorjs 2.0.0 → 2.1.1
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 +1 -10
- package/dist/index.d.mts +153 -9
- package/dist/index.d.ts +153 -9
- package/dist/index.js +80 -34
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +80 -33
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -6,16 +6,6 @@
|
|
|
6
6
|
|
|
7
7
|
A **TypeScript-first** SDK for the [Virtualizor](https://www.virtualizor.com/) server management API. Manage VPS instances, users, and plans with a clean, namespaced interface and zero production dependencies.
|
|
8
8
|
|
|
9
|
-
## Features
|
|
10
|
-
|
|
11
|
-
- ✅ **TypeScript-first**: Full type safety and IDE autocomplete
|
|
12
|
-
- ✅ **Namespaced API**: Logical organization (`client.vps.*`, `client.users.*`, `client.plans.*`, `client.tasks.*`)
|
|
13
|
-
- ✅ **SHA-256 Authentication**: Secure API communication
|
|
14
|
-
- ✅ **Zero Production Dependencies**: Lightweight and fast
|
|
15
|
-
- ✅ **Async Task Polling**: Built-in support for long-running operations
|
|
16
|
-
- ✅ **Self-signed SSL Ready**: Pre-configured for Virtualizor's typical certificate setup
|
|
17
|
-
- ✅ **Dual Output**: Outputs both CommonJS and ESM modules
|
|
18
|
-
|
|
19
9
|
## Installation
|
|
20
10
|
|
|
21
11
|
**npm:**
|
|
@@ -41,6 +31,7 @@ const client = createVirtualizorClient({
|
|
|
41
31
|
apiPass: 'your-api-pass',
|
|
42
32
|
// Optional: port (default 4085), https (default true),
|
|
43
33
|
// rejectUnauthorized (default false), timeout (default 30000ms)
|
|
34
|
+
// 4085 for Https, 4084 for Http
|
|
44
35
|
});
|
|
45
36
|
```
|
|
46
37
|
|
package/dist/index.d.mts
CHANGED
|
@@ -13,6 +13,7 @@ interface AsyncTaskResult extends VirtualizorResponse {
|
|
|
13
13
|
taskid?: string;
|
|
14
14
|
}
|
|
15
15
|
type VirtType = 'kvm' | 'xen' | 'openvz' | 'lxc' | 'proxmox' | 'virtuozzo' | 'xcp' | 'hyperv';
|
|
16
|
+
type ApiParams = Record<string, unknown>;
|
|
16
17
|
|
|
17
18
|
interface VirtualizorConfig {
|
|
18
19
|
host: string;
|
|
@@ -22,6 +23,7 @@ interface VirtualizorConfig {
|
|
|
22
23
|
https?: boolean;
|
|
23
24
|
rejectUnauthorized?: boolean;
|
|
24
25
|
timeout?: number;
|
|
26
|
+
debug?: boolean;
|
|
25
27
|
}
|
|
26
28
|
interface ResolvedConfig {
|
|
27
29
|
host: string;
|
|
@@ -31,18 +33,18 @@ interface ResolvedConfig {
|
|
|
31
33
|
https: boolean;
|
|
32
34
|
rejectUnauthorized: boolean;
|
|
33
35
|
timeout: number;
|
|
36
|
+
debug: boolean;
|
|
34
37
|
}
|
|
35
38
|
|
|
36
39
|
declare class VirtualizorApiError extends Error {
|
|
37
40
|
readonly code: number;
|
|
38
41
|
constructor(message: string, code: number);
|
|
39
42
|
}
|
|
40
|
-
type Params = Record<string, string | number | undefined>;
|
|
41
43
|
declare class HttpClient {
|
|
42
44
|
private readonly config;
|
|
43
45
|
constructor(config: ResolvedConfig);
|
|
44
46
|
parseResponse<T extends VirtualizorResponse>(data: T): T;
|
|
45
|
-
request<T extends VirtualizorResponse>(act: string, queryParams?:
|
|
47
|
+
request<T extends VirtualizorResponse>(act: string, queryParams?: ApiParams, bodyParams?: ApiParams): Promise<T>;
|
|
46
48
|
private rawRequest;
|
|
47
49
|
}
|
|
48
50
|
|
|
@@ -62,6 +64,7 @@ interface CreatePlanParams {
|
|
|
62
64
|
bandwidth: number;
|
|
63
65
|
cpu: number;
|
|
64
66
|
virt?: string;
|
|
67
|
+
[key: string]: unknown;
|
|
65
68
|
}
|
|
66
69
|
|
|
67
70
|
declare class PlansResource {
|
|
@@ -104,6 +107,7 @@ interface CreateUserParams {
|
|
|
104
107
|
fname?: string;
|
|
105
108
|
lname?: string;
|
|
106
109
|
acttype?: number;
|
|
110
|
+
[key: string]: unknown;
|
|
107
111
|
}
|
|
108
112
|
|
|
109
113
|
declare class UsersResource {
|
|
@@ -116,18 +120,156 @@ declare class UsersResource {
|
|
|
116
120
|
unsuspend(uid: string): Promise<AsyncTaskResult>;
|
|
117
121
|
}
|
|
118
122
|
|
|
123
|
+
interface VPSData {
|
|
124
|
+
os_type?: number | string;
|
|
125
|
+
rtc?: number | string;
|
|
126
|
+
unprivileged?: number | string;
|
|
127
|
+
vnc_auto_port?: number | string;
|
|
128
|
+
nested_virt?: number | string;
|
|
129
|
+
vga_vram?: number | string;
|
|
130
|
+
discard?: number | string;
|
|
131
|
+
vlan_tag?: number | string;
|
|
132
|
+
enable_guest_agent?: number | string;
|
|
133
|
+
ssd_emulation?: number | string;
|
|
134
|
+
machine_type?: number | string;
|
|
135
|
+
bios?: string;
|
|
136
|
+
enable_tpm?: number | string;
|
|
137
|
+
disable_password?: string;
|
|
138
|
+
ssh_options?: string;
|
|
139
|
+
added_keys?: unknown[];
|
|
140
|
+
io_uring?: number | string;
|
|
141
|
+
min_ram?: number | string;
|
|
142
|
+
vga?: number | string;
|
|
143
|
+
vga_memory?: number | string;
|
|
144
|
+
cpu_flags?: number | string;
|
|
145
|
+
scsi_controller?: number | string;
|
|
146
|
+
demo?: string | null;
|
|
147
|
+
enable_cpu_threshold?: number | string;
|
|
148
|
+
cpu_threshold?: number | string;
|
|
149
|
+
cpu_threshold_time?: number | string;
|
|
150
|
+
disable_guest_agent?: number | string;
|
|
151
|
+
disable_autostart?: number | string;
|
|
152
|
+
iothread?: number | string;
|
|
153
|
+
nesting?: number | string;
|
|
154
|
+
suspended_time?: number | string;
|
|
155
|
+
multiqueue?: number | string;
|
|
156
|
+
freeze_fs_on_backup?: number | string;
|
|
157
|
+
enable_ver_scaling?: number | string;
|
|
158
|
+
ver_max_ram?: string | number;
|
|
159
|
+
ver_ram_threshold?: string | number;
|
|
160
|
+
ver_ram_inc_by?: string | number;
|
|
161
|
+
ver_max_cpu?: string | number;
|
|
162
|
+
ver_cpu_threshold?: string | number;
|
|
163
|
+
ver_cpu_inc_by?: string | number;
|
|
164
|
+
random_ipv6?: number | string;
|
|
165
|
+
encrypted_pass?: number | string;
|
|
166
|
+
vm_admin_name?: string;
|
|
167
|
+
crypted_pass?: string | null;
|
|
168
|
+
crypted_salt?: string | null;
|
|
169
|
+
custom_ipv6_on_edit?: number | string;
|
|
170
|
+
docker_info?: unknown | null;
|
|
171
|
+
}
|
|
119
172
|
interface VPS {
|
|
120
173
|
vpsid: string;
|
|
174
|
+
vps_name?: string;
|
|
175
|
+
uuid?: string;
|
|
176
|
+
serid?: string | number;
|
|
177
|
+
time?: string | number;
|
|
178
|
+
edittime?: string | number;
|
|
179
|
+
virt?: VirtType | string;
|
|
180
|
+
uid?: string | number;
|
|
181
|
+
plid?: string | number;
|
|
121
182
|
hostname: string;
|
|
122
|
-
|
|
183
|
+
osid?: string | number;
|
|
184
|
+
os_name: string;
|
|
185
|
+
iso?: string;
|
|
186
|
+
sec_iso?: string;
|
|
187
|
+
boot?: string;
|
|
188
|
+
space?: string | number;
|
|
189
|
+
inodes?: string | number;
|
|
123
190
|
ram: string;
|
|
124
|
-
|
|
191
|
+
burst?: string | number;
|
|
192
|
+
swap?: string | number;
|
|
193
|
+
cpu?: string | number;
|
|
194
|
+
cores?: string | number;
|
|
195
|
+
cpupin?: string | number;
|
|
196
|
+
cpu_percent?: string | number;
|
|
125
197
|
bandwidth: string;
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
198
|
+
network_speed?: string | number;
|
|
199
|
+
upload_speed?: string | number;
|
|
200
|
+
io?: string | number;
|
|
201
|
+
ubc?: string;
|
|
202
|
+
acpi?: string | number;
|
|
203
|
+
apic?: string | number;
|
|
204
|
+
pae?: string | number;
|
|
205
|
+
shadow?: string | number;
|
|
206
|
+
vnc?: string | number;
|
|
207
|
+
vncport?: string | number;
|
|
208
|
+
vnc_passwd?: string;
|
|
209
|
+
hvm?: string | number;
|
|
210
|
+
suspended?: string | number;
|
|
211
|
+
suspend_reason?: string | null;
|
|
212
|
+
nw_suspended?: string | null;
|
|
213
|
+
rescue?: string | number;
|
|
214
|
+
band_suspend?: string | number;
|
|
215
|
+
tuntap?: string | number;
|
|
216
|
+
ppp?: string | number;
|
|
217
|
+
ploop?: string | number;
|
|
218
|
+
dns_nameserver?: string;
|
|
219
|
+
osreinstall_limit?: string | number;
|
|
220
|
+
preferences?: unknown | null;
|
|
221
|
+
nic_type?: string;
|
|
222
|
+
vif_type?: string;
|
|
223
|
+
virtio?: string | number;
|
|
224
|
+
pv_on_hvm?: string | number;
|
|
225
|
+
disks?: unknown | null;
|
|
226
|
+
kvm_cache?: string | number;
|
|
227
|
+
io_mode?: string | number;
|
|
228
|
+
cpu_mode?: string;
|
|
229
|
+
total_iops_sec?: string | number;
|
|
230
|
+
read_bytes_sec?: string | number;
|
|
231
|
+
write_bytes_sec?: string | number;
|
|
232
|
+
kvm_vga?: string | number;
|
|
233
|
+
acceleration?: string | number;
|
|
234
|
+
vnc_keymap?: string;
|
|
235
|
+
routing?: string | number;
|
|
236
|
+
mg?: string;
|
|
237
|
+
used_bandwidth?: string | number;
|
|
238
|
+
cached_disk?: unknown;
|
|
239
|
+
webuzo?: string | number;
|
|
240
|
+
disable_ebtables?: string | number;
|
|
241
|
+
install_xentools?: string | number;
|
|
242
|
+
admin_managed?: string | number;
|
|
243
|
+
rdp?: string | number;
|
|
244
|
+
topology_sockets?: string | number;
|
|
245
|
+
topology_cores?: string | number;
|
|
246
|
+
topology_threads?: string | number;
|
|
247
|
+
mac?: string;
|
|
248
|
+
notes?: string | null;
|
|
249
|
+
disable_nw_config?: string | number;
|
|
250
|
+
locked?: string;
|
|
251
|
+
openvz_features?: string;
|
|
252
|
+
speed_cap?: string;
|
|
253
|
+
numa?: string | number;
|
|
254
|
+
bpid?: string | number;
|
|
255
|
+
bserid?: string | number;
|
|
256
|
+
timezone?: string | null;
|
|
257
|
+
ha?: string | number;
|
|
258
|
+
load_balancer?: string | number;
|
|
259
|
+
data?: VPSData;
|
|
260
|
+
fwid?: string | number;
|
|
261
|
+
admin_fwid?: string | number;
|
|
262
|
+
current_resource?: unknown | null;
|
|
263
|
+
plan_expiry?: string | number;
|
|
264
|
+
machine_status?: string | number;
|
|
265
|
+
tags?: string | null;
|
|
266
|
+
server_name?: string;
|
|
267
|
+
email?: string;
|
|
268
|
+
pid?: string | number;
|
|
269
|
+
type?: string | number;
|
|
270
|
+
os_distro?: string;
|
|
271
|
+
stid?: number[];
|
|
272
|
+
ips?: Record<string, string>;
|
|
131
273
|
}
|
|
132
274
|
interface ListVPSParams {
|
|
133
275
|
user?: string | number;
|
|
@@ -140,6 +282,7 @@ interface ListVPSParams {
|
|
|
140
282
|
serid?: number;
|
|
141
283
|
plid?: number;
|
|
142
284
|
bpid?: number;
|
|
285
|
+
[key: string]: unknown;
|
|
143
286
|
}
|
|
144
287
|
interface CreateVPSParams {
|
|
145
288
|
hostname: string;
|
|
@@ -161,6 +304,7 @@ interface CreateVPSParams {
|
|
|
161
304
|
recipe?: number;
|
|
162
305
|
sshkey?: string;
|
|
163
306
|
nopassword?: 0 | 1;
|
|
307
|
+
[key: string]: unknown;
|
|
164
308
|
}
|
|
165
309
|
interface RebuildVPSParams {
|
|
166
310
|
/** OS template ID to rebuild with */
|
package/dist/index.d.ts
CHANGED
|
@@ -13,6 +13,7 @@ interface AsyncTaskResult extends VirtualizorResponse {
|
|
|
13
13
|
taskid?: string;
|
|
14
14
|
}
|
|
15
15
|
type VirtType = 'kvm' | 'xen' | 'openvz' | 'lxc' | 'proxmox' | 'virtuozzo' | 'xcp' | 'hyperv';
|
|
16
|
+
type ApiParams = Record<string, unknown>;
|
|
16
17
|
|
|
17
18
|
interface VirtualizorConfig {
|
|
18
19
|
host: string;
|
|
@@ -22,6 +23,7 @@ interface VirtualizorConfig {
|
|
|
22
23
|
https?: boolean;
|
|
23
24
|
rejectUnauthorized?: boolean;
|
|
24
25
|
timeout?: number;
|
|
26
|
+
debug?: boolean;
|
|
25
27
|
}
|
|
26
28
|
interface ResolvedConfig {
|
|
27
29
|
host: string;
|
|
@@ -31,18 +33,18 @@ interface ResolvedConfig {
|
|
|
31
33
|
https: boolean;
|
|
32
34
|
rejectUnauthorized: boolean;
|
|
33
35
|
timeout: number;
|
|
36
|
+
debug: boolean;
|
|
34
37
|
}
|
|
35
38
|
|
|
36
39
|
declare class VirtualizorApiError extends Error {
|
|
37
40
|
readonly code: number;
|
|
38
41
|
constructor(message: string, code: number);
|
|
39
42
|
}
|
|
40
|
-
type Params = Record<string, string | number | undefined>;
|
|
41
43
|
declare class HttpClient {
|
|
42
44
|
private readonly config;
|
|
43
45
|
constructor(config: ResolvedConfig);
|
|
44
46
|
parseResponse<T extends VirtualizorResponse>(data: T): T;
|
|
45
|
-
request<T extends VirtualizorResponse>(act: string, queryParams?:
|
|
47
|
+
request<T extends VirtualizorResponse>(act: string, queryParams?: ApiParams, bodyParams?: ApiParams): Promise<T>;
|
|
46
48
|
private rawRequest;
|
|
47
49
|
}
|
|
48
50
|
|
|
@@ -62,6 +64,7 @@ interface CreatePlanParams {
|
|
|
62
64
|
bandwidth: number;
|
|
63
65
|
cpu: number;
|
|
64
66
|
virt?: string;
|
|
67
|
+
[key: string]: unknown;
|
|
65
68
|
}
|
|
66
69
|
|
|
67
70
|
declare class PlansResource {
|
|
@@ -104,6 +107,7 @@ interface CreateUserParams {
|
|
|
104
107
|
fname?: string;
|
|
105
108
|
lname?: string;
|
|
106
109
|
acttype?: number;
|
|
110
|
+
[key: string]: unknown;
|
|
107
111
|
}
|
|
108
112
|
|
|
109
113
|
declare class UsersResource {
|
|
@@ -116,18 +120,156 @@ declare class UsersResource {
|
|
|
116
120
|
unsuspend(uid: string): Promise<AsyncTaskResult>;
|
|
117
121
|
}
|
|
118
122
|
|
|
123
|
+
interface VPSData {
|
|
124
|
+
os_type?: number | string;
|
|
125
|
+
rtc?: number | string;
|
|
126
|
+
unprivileged?: number | string;
|
|
127
|
+
vnc_auto_port?: number | string;
|
|
128
|
+
nested_virt?: number | string;
|
|
129
|
+
vga_vram?: number | string;
|
|
130
|
+
discard?: number | string;
|
|
131
|
+
vlan_tag?: number | string;
|
|
132
|
+
enable_guest_agent?: number | string;
|
|
133
|
+
ssd_emulation?: number | string;
|
|
134
|
+
machine_type?: number | string;
|
|
135
|
+
bios?: string;
|
|
136
|
+
enable_tpm?: number | string;
|
|
137
|
+
disable_password?: string;
|
|
138
|
+
ssh_options?: string;
|
|
139
|
+
added_keys?: unknown[];
|
|
140
|
+
io_uring?: number | string;
|
|
141
|
+
min_ram?: number | string;
|
|
142
|
+
vga?: number | string;
|
|
143
|
+
vga_memory?: number | string;
|
|
144
|
+
cpu_flags?: number | string;
|
|
145
|
+
scsi_controller?: number | string;
|
|
146
|
+
demo?: string | null;
|
|
147
|
+
enable_cpu_threshold?: number | string;
|
|
148
|
+
cpu_threshold?: number | string;
|
|
149
|
+
cpu_threshold_time?: number | string;
|
|
150
|
+
disable_guest_agent?: number | string;
|
|
151
|
+
disable_autostart?: number | string;
|
|
152
|
+
iothread?: number | string;
|
|
153
|
+
nesting?: number | string;
|
|
154
|
+
suspended_time?: number | string;
|
|
155
|
+
multiqueue?: number | string;
|
|
156
|
+
freeze_fs_on_backup?: number | string;
|
|
157
|
+
enable_ver_scaling?: number | string;
|
|
158
|
+
ver_max_ram?: string | number;
|
|
159
|
+
ver_ram_threshold?: string | number;
|
|
160
|
+
ver_ram_inc_by?: string | number;
|
|
161
|
+
ver_max_cpu?: string | number;
|
|
162
|
+
ver_cpu_threshold?: string | number;
|
|
163
|
+
ver_cpu_inc_by?: string | number;
|
|
164
|
+
random_ipv6?: number | string;
|
|
165
|
+
encrypted_pass?: number | string;
|
|
166
|
+
vm_admin_name?: string;
|
|
167
|
+
crypted_pass?: string | null;
|
|
168
|
+
crypted_salt?: string | null;
|
|
169
|
+
custom_ipv6_on_edit?: number | string;
|
|
170
|
+
docker_info?: unknown | null;
|
|
171
|
+
}
|
|
119
172
|
interface VPS {
|
|
120
173
|
vpsid: string;
|
|
174
|
+
vps_name?: string;
|
|
175
|
+
uuid?: string;
|
|
176
|
+
serid?: string | number;
|
|
177
|
+
time?: string | number;
|
|
178
|
+
edittime?: string | number;
|
|
179
|
+
virt?: VirtType | string;
|
|
180
|
+
uid?: string | number;
|
|
181
|
+
plid?: string | number;
|
|
121
182
|
hostname: string;
|
|
122
|
-
|
|
183
|
+
osid?: string | number;
|
|
184
|
+
os_name: string;
|
|
185
|
+
iso?: string;
|
|
186
|
+
sec_iso?: string;
|
|
187
|
+
boot?: string;
|
|
188
|
+
space?: string | number;
|
|
189
|
+
inodes?: string | number;
|
|
123
190
|
ram: string;
|
|
124
|
-
|
|
191
|
+
burst?: string | number;
|
|
192
|
+
swap?: string | number;
|
|
193
|
+
cpu?: string | number;
|
|
194
|
+
cores?: string | number;
|
|
195
|
+
cpupin?: string | number;
|
|
196
|
+
cpu_percent?: string | number;
|
|
125
197
|
bandwidth: string;
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
198
|
+
network_speed?: string | number;
|
|
199
|
+
upload_speed?: string | number;
|
|
200
|
+
io?: string | number;
|
|
201
|
+
ubc?: string;
|
|
202
|
+
acpi?: string | number;
|
|
203
|
+
apic?: string | number;
|
|
204
|
+
pae?: string | number;
|
|
205
|
+
shadow?: string | number;
|
|
206
|
+
vnc?: string | number;
|
|
207
|
+
vncport?: string | number;
|
|
208
|
+
vnc_passwd?: string;
|
|
209
|
+
hvm?: string | number;
|
|
210
|
+
suspended?: string | number;
|
|
211
|
+
suspend_reason?: string | null;
|
|
212
|
+
nw_suspended?: string | null;
|
|
213
|
+
rescue?: string | number;
|
|
214
|
+
band_suspend?: string | number;
|
|
215
|
+
tuntap?: string | number;
|
|
216
|
+
ppp?: string | number;
|
|
217
|
+
ploop?: string | number;
|
|
218
|
+
dns_nameserver?: string;
|
|
219
|
+
osreinstall_limit?: string | number;
|
|
220
|
+
preferences?: unknown | null;
|
|
221
|
+
nic_type?: string;
|
|
222
|
+
vif_type?: string;
|
|
223
|
+
virtio?: string | number;
|
|
224
|
+
pv_on_hvm?: string | number;
|
|
225
|
+
disks?: unknown | null;
|
|
226
|
+
kvm_cache?: string | number;
|
|
227
|
+
io_mode?: string | number;
|
|
228
|
+
cpu_mode?: string;
|
|
229
|
+
total_iops_sec?: string | number;
|
|
230
|
+
read_bytes_sec?: string | number;
|
|
231
|
+
write_bytes_sec?: string | number;
|
|
232
|
+
kvm_vga?: string | number;
|
|
233
|
+
acceleration?: string | number;
|
|
234
|
+
vnc_keymap?: string;
|
|
235
|
+
routing?: string | number;
|
|
236
|
+
mg?: string;
|
|
237
|
+
used_bandwidth?: string | number;
|
|
238
|
+
cached_disk?: unknown;
|
|
239
|
+
webuzo?: string | number;
|
|
240
|
+
disable_ebtables?: string | number;
|
|
241
|
+
install_xentools?: string | number;
|
|
242
|
+
admin_managed?: string | number;
|
|
243
|
+
rdp?: string | number;
|
|
244
|
+
topology_sockets?: string | number;
|
|
245
|
+
topology_cores?: string | number;
|
|
246
|
+
topology_threads?: string | number;
|
|
247
|
+
mac?: string;
|
|
248
|
+
notes?: string | null;
|
|
249
|
+
disable_nw_config?: string | number;
|
|
250
|
+
locked?: string;
|
|
251
|
+
openvz_features?: string;
|
|
252
|
+
speed_cap?: string;
|
|
253
|
+
numa?: string | number;
|
|
254
|
+
bpid?: string | number;
|
|
255
|
+
bserid?: string | number;
|
|
256
|
+
timezone?: string | null;
|
|
257
|
+
ha?: string | number;
|
|
258
|
+
load_balancer?: string | number;
|
|
259
|
+
data?: VPSData;
|
|
260
|
+
fwid?: string | number;
|
|
261
|
+
admin_fwid?: string | number;
|
|
262
|
+
current_resource?: unknown | null;
|
|
263
|
+
plan_expiry?: string | number;
|
|
264
|
+
machine_status?: string | number;
|
|
265
|
+
tags?: string | null;
|
|
266
|
+
server_name?: string;
|
|
267
|
+
email?: string;
|
|
268
|
+
pid?: string | number;
|
|
269
|
+
type?: string | number;
|
|
270
|
+
os_distro?: string;
|
|
271
|
+
stid?: number[];
|
|
272
|
+
ips?: Record<string, string>;
|
|
131
273
|
}
|
|
132
274
|
interface ListVPSParams {
|
|
133
275
|
user?: string | number;
|
|
@@ -140,6 +282,7 @@ interface ListVPSParams {
|
|
|
140
282
|
serid?: number;
|
|
141
283
|
plid?: number;
|
|
142
284
|
bpid?: number;
|
|
285
|
+
[key: string]: unknown;
|
|
143
286
|
}
|
|
144
287
|
interface CreateVPSParams {
|
|
145
288
|
hostname: string;
|
|
@@ -161,6 +304,7 @@ interface CreateVPSParams {
|
|
|
161
304
|
recipe?: number;
|
|
162
305
|
sshkey?: string;
|
|
163
306
|
nopassword?: 0 | 1;
|
|
307
|
+
[key: string]: unknown;
|
|
164
308
|
}
|
|
165
309
|
interface RebuildVPSParams {
|
|
166
310
|
/** OS template ID to rebuild with */
|
package/dist/index.js
CHANGED
|
@@ -2,19 +2,26 @@
|
|
|
2
2
|
|
|
3
3
|
var http = require('http');
|
|
4
4
|
var https = require('https');
|
|
5
|
-
var crypto = require('crypto');
|
|
6
5
|
|
|
7
6
|
function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
|
|
8
7
|
|
|
9
8
|
var http__default = /*#__PURE__*/_interopDefault(http);
|
|
10
9
|
var https__default = /*#__PURE__*/_interopDefault(https);
|
|
11
|
-
var crypto__default = /*#__PURE__*/_interopDefault(crypto);
|
|
12
10
|
|
|
13
|
-
// src/
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
11
|
+
// src/config/defaults.ts
|
|
12
|
+
var DEFAULT_CONFIG = {
|
|
13
|
+
port: 4085,
|
|
14
|
+
https: true,
|
|
15
|
+
rejectUnauthorized: false,
|
|
16
|
+
timeout: 3e4,
|
|
17
|
+
debug: false
|
|
18
|
+
};
|
|
19
|
+
var DEFAULT_TASK_POLLING = {
|
|
20
|
+
pollIntervalMs: 2e3,
|
|
21
|
+
timeoutMs: 12e4
|
|
22
|
+
};
|
|
23
|
+
|
|
24
|
+
// src/auth.ts
|
|
18
25
|
function buildQueryString(params, apiKey, apiPass) {
|
|
19
26
|
const clean = {};
|
|
20
27
|
for (const [key, value] of Object.entries(params)) {
|
|
@@ -22,11 +29,10 @@ function buildQueryString(params, apiKey, apiPass) {
|
|
|
22
29
|
clean[key] = value;
|
|
23
30
|
}
|
|
24
31
|
}
|
|
25
|
-
const sig = generateSignature(apiKey, apiPass, clean);
|
|
26
32
|
const urlParams = new URLSearchParams();
|
|
27
33
|
urlParams.set("api", "json");
|
|
28
|
-
urlParams.set("
|
|
29
|
-
urlParams.set("
|
|
34
|
+
urlParams.set("adminapikey", apiKey);
|
|
35
|
+
urlParams.set("adminapipass", apiPass);
|
|
30
36
|
for (const [key, value] of Object.entries(clean)) {
|
|
31
37
|
urlParams.set(key, String(value));
|
|
32
38
|
}
|
|
@@ -83,10 +89,24 @@ var HttpClient = class {
|
|
|
83
89
|
raw += chunk.toString();
|
|
84
90
|
});
|
|
85
91
|
res.on("end", () => {
|
|
92
|
+
if (res.statusCode === 302 || res.statusCode === 301) {
|
|
93
|
+
reject(
|
|
94
|
+
new Error(
|
|
95
|
+
`Redirect detected (status ${res.statusCode}). Authentication failed. Check your API credentials. Location: ${res.headers.location}`
|
|
96
|
+
)
|
|
97
|
+
);
|
|
98
|
+
return;
|
|
99
|
+
}
|
|
86
100
|
try {
|
|
87
101
|
resolve(JSON.parse(raw));
|
|
88
|
-
} catch {
|
|
89
|
-
|
|
102
|
+
} catch (err) {
|
|
103
|
+
if (this.config.debug)
|
|
104
|
+
console.debug("[Virtualizor] Raw response (first 500 chars):", raw.slice(0, 500));
|
|
105
|
+
reject(
|
|
106
|
+
new Error(
|
|
107
|
+
`Failed to parse response: ${raw.slice(0, 200)}. Parse error: ${err instanceof Error ? err.message : String(err)}`
|
|
108
|
+
)
|
|
109
|
+
);
|
|
90
110
|
}
|
|
91
111
|
});
|
|
92
112
|
});
|
|
@@ -129,7 +149,10 @@ var TasksResource = class {
|
|
|
129
149
|
return res.tasks[taskId];
|
|
130
150
|
}
|
|
131
151
|
async wait(taskId, options = {}) {
|
|
132
|
-
const {
|
|
152
|
+
const {
|
|
153
|
+
pollIntervalMs = DEFAULT_TASK_POLLING.pollIntervalMs,
|
|
154
|
+
timeoutMs = DEFAULT_TASK_POLLING.timeoutMs
|
|
155
|
+
} = options;
|
|
133
156
|
const deadline = Date.now() + timeoutMs;
|
|
134
157
|
while (Date.now() < deadline) {
|
|
135
158
|
const task = await this.get(taskId);
|
|
@@ -167,14 +190,24 @@ var UsersResource = class {
|
|
|
167
190
|
}
|
|
168
191
|
};
|
|
169
192
|
|
|
193
|
+
// src/constants/vps.ts
|
|
194
|
+
var VPS_CONSTANTS = {
|
|
195
|
+
// Rebuild operation requires reos=1 flag
|
|
196
|
+
REBUILD_REOS_FLAG: 1,
|
|
197
|
+
// Migrate operation requires migrate=1 flag
|
|
198
|
+
MIGRATE_FLAG: 1,
|
|
199
|
+
// Migrate operation requires migrate_but=1 flag
|
|
200
|
+
MIGRATE_BUT_FLAG: 1
|
|
201
|
+
};
|
|
202
|
+
|
|
170
203
|
// src/resources/vps.ts
|
|
171
204
|
var VpsResource = class {
|
|
172
205
|
constructor(http2) {
|
|
173
206
|
this.http = http2;
|
|
174
207
|
}
|
|
175
208
|
async list(filters = {}) {
|
|
176
|
-
const res = await this.http.request("
|
|
177
|
-
return res.vs;
|
|
209
|
+
const res = await this.http.request("vs", {}, filters);
|
|
210
|
+
return res.vs ?? {};
|
|
178
211
|
}
|
|
179
212
|
async get(vpsId) {
|
|
180
213
|
const res = await this.http.request("vs", { vpsid: vpsId }, {});
|
|
@@ -207,25 +240,37 @@ var VpsResource = class {
|
|
|
207
240
|
return this.http.request("vs", { unsuspend: vpsId }, {});
|
|
208
241
|
}
|
|
209
242
|
async rebuild(vpsId, params) {
|
|
210
|
-
return this.http.request(
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
243
|
+
return this.http.request(
|
|
244
|
+
"rebuild",
|
|
245
|
+
{},
|
|
246
|
+
{
|
|
247
|
+
vpsid: vpsId,
|
|
248
|
+
reos: VPS_CONSTANTS.REBUILD_REOS_FLAG,
|
|
249
|
+
...params
|
|
250
|
+
}
|
|
251
|
+
);
|
|
215
252
|
}
|
|
216
253
|
async clone(vpsId, params) {
|
|
217
|
-
return this.http.request(
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
254
|
+
return this.http.request(
|
|
255
|
+
"clone",
|
|
256
|
+
{},
|
|
257
|
+
{
|
|
258
|
+
vpsid: vpsId,
|
|
259
|
+
...params
|
|
260
|
+
}
|
|
261
|
+
);
|
|
221
262
|
}
|
|
222
263
|
async migrate(vpsId, params) {
|
|
223
|
-
return this.http.request(
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
264
|
+
return this.http.request(
|
|
265
|
+
"migrate",
|
|
266
|
+
{},
|
|
267
|
+
{
|
|
268
|
+
vpsid: vpsId,
|
|
269
|
+
migrate: VPS_CONSTANTS.MIGRATE_FLAG,
|
|
270
|
+
migrate_but: VPS_CONSTANTS.MIGRATE_BUT_FLAG,
|
|
271
|
+
...params
|
|
272
|
+
}
|
|
273
|
+
);
|
|
229
274
|
}
|
|
230
275
|
async status(vpsId) {
|
|
231
276
|
return this.http.request("vstatus", { vpsid: vpsId }, {});
|
|
@@ -249,10 +294,11 @@ var VirtualizorClient = class {
|
|
|
249
294
|
host: config.host,
|
|
250
295
|
apiKey: config.apiKey,
|
|
251
296
|
apiPass: config.apiPass ?? "",
|
|
252
|
-
port: config.port ??
|
|
253
|
-
https: config.https ??
|
|
254
|
-
rejectUnauthorized: config.rejectUnauthorized ??
|
|
255
|
-
timeout: config.timeout ??
|
|
297
|
+
port: config.port ?? DEFAULT_CONFIG.port,
|
|
298
|
+
https: config.https ?? DEFAULT_CONFIG.https,
|
|
299
|
+
rejectUnauthorized: config.rejectUnauthorized ?? DEFAULT_CONFIG.rejectUnauthorized,
|
|
300
|
+
timeout: config.timeout ?? DEFAULT_CONFIG.timeout,
|
|
301
|
+
debug: config.debug ?? DEFAULT_CONFIG.debug
|
|
256
302
|
};
|
|
257
303
|
const http2 = new HttpClient(resolved);
|
|
258
304
|
this.vps = new VpsResource(http2);
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/auth.ts","../src/http.ts","../src/resources/plans.ts","../src/resources/tasks.ts","../src/resources/users.ts","../src/resources/vps.ts","../src/client.ts"],"names":["crypto","https","http"],"mappings":"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","file":"index.js","sourcesContent":["import crypto from 'node:crypto';\n\ntype Params = Record<string, string | number | undefined>;\n\nfunction generateSignature(apiKey: string, apiPass: string, params: Params): string {\n const sorted = Object.keys(params)\n .filter((k) => params[k] !== undefined)\n .sort()\n .map((k) => `${k}${params[k]}`)\n .join('');\n return crypto\n .createHash('sha256')\n .update(apiKey + apiPass + sorted)\n .digest('hex');\n}\n\nexport function buildQueryString(params: Params, apiKey: string, apiPass: string): string {\n const clean: Params = {};\n for (const [key, value] of Object.entries(params)) {\n if (value !== undefined) {\n clean[key] = value;\n }\n }\n\n const sig = generateSignature(apiKey, apiPass, clean);\n\n const urlParams = new URLSearchParams();\n urlParams.set('api', 'json');\n urlParams.set('api_key', apiKey);\n urlParams.set('api_sig', sig);\n\n for (const [key, value] of Object.entries(clean)) {\n urlParams.set(key, String(value));\n }\n\n return `?${urlParams.toString()}`;\n}\n","import http from 'node:http';\nimport https from 'node:https';\nimport { buildQueryString } from './auth.js';\nimport type { VirtualizorResponse } from './types/common.js';\nimport type { ResolvedConfig } from './types/config.js';\n\nexport class VirtualizorApiError extends Error {\n readonly code: number;\n\n constructor(message: string, code: number) {\n super(message);\n this.name = 'VirtualizorApiError';\n this.code = code;\n }\n}\n\ntype Params = Record<string, string | number | undefined>;\n\nexport class HttpClient {\n constructor(private readonly config: ResolvedConfig) {}\n\n parseResponse<T extends VirtualizorResponse>(data: T): T {\n if (data.error && data.error.length > 0) {\n const first = data.error[0];\n if (first) {\n throw new VirtualizorApiError(first.msg, first.code);\n }\n }\n return data;\n }\n\n async request<T extends VirtualizorResponse>(\n act: string,\n queryParams: Params = {},\n bodyParams: Params = {},\n ): Promise<T> {\n const allQueryParams: Params = { act, ...queryParams };\n const qs = buildQueryString(allQueryParams, this.config.apiKey, this.config.apiPass);\n\n const path = `/index.php${qs}`;\n\n const bodyString = Object.entries(bodyParams)\n .filter(([, v]) => v !== undefined)\n .map(([k, v]) => `${encodeURIComponent(k)}=${encodeURIComponent(String(v))}`)\n .join('&');\n\n const data = await this.rawRequest(path, bodyString || undefined);\n return this.parseResponse(data as T);\n }\n\n private rawRequest(path: string, body?: string): Promise<VirtualizorResponse> {\n const transport = this.config.https ? https : http;\n const options: https.RequestOptions = {\n host: this.config.host,\n port: this.config.port,\n path,\n method: body ? 'POST' : 'GET',\n headers: {\n 'Content-Type': 'application/x-www-form-urlencoded',\n ...(body ? { 'Content-Length': Buffer.byteLength(body) } : {}),\n },\n ...(this.config.https\n ? { agent: new https.Agent({ rejectUnauthorized: this.config.rejectUnauthorized }) }\n : {}),\n };\n\n return new Promise((resolve, reject) => {\n const req = transport.request(options, (res) => {\n let raw = '';\n res.on('data', (chunk: Buffer) => {\n raw += chunk.toString();\n });\n res.on('end', () => {\n try {\n resolve(JSON.parse(raw) as VirtualizorResponse);\n } catch {\n reject(new Error(`Failed to parse response: ${raw.slice(0, 200)}`));\n }\n });\n });\n\n req.setTimeout(this.config.timeout, () => {\n req.destroy(new Error(`Request timed out after ${this.config.timeout}ms`));\n });\n\n req.on('error', reject);\n\n if (body) {\n req.write(body);\n }\n\n req.end();\n });\n }\n}\n","import type { HttpClient } from '../http.js';\nimport type { AsyncTaskResult, VirtualizorResponse } from '../types/common.js';\nimport type { CreatePlanParams, Plan } from '../types/plans.js';\n\ntype Params = Record<string, string | number | undefined>;\n\ninterface ListPlansResponse extends VirtualizorResponse {\n plans: Record<string, Plan>;\n}\nexport class PlansResource {\n constructor(private readonly http: HttpClient) {}\n\n async list(): Promise<Record<string, Plan>> {\n const res = await this.http.request<ListPlansResponse>('plans', {}, {});\n return res.plans;\n }\n\n async create(params: CreatePlanParams): Promise<AsyncTaskResult> {\n return this.http.request<AsyncTaskResult>('addplan', {}, params as unknown as Params);\n }\n\n async delete(planId: string): Promise<AsyncTaskResult> {\n return this.http.request<AsyncTaskResult>('plans', {}, { delete: planId });\n }\n}\n","import type { HttpClient } from '../http.js';\nimport type { VirtualizorResponse } from '../types/common.js';\nimport type { Task } from '../types/tasks.js';\n\ninterface TasksResponse extends VirtualizorResponse {\n tasks: Record<string, Task>;\n}\n\nexport class TasksResource {\n constructor(private readonly http: HttpClient) {}\n\n async get(taskId: string): Promise<Task | undefined> {\n const res = await this.http.request<TasksResponse>('tasks', { taskid: taskId }, {});\n return res.tasks[taskId];\n }\n\n async wait(\n taskId: string,\n options: { pollIntervalMs?: number; timeoutMs?: number } = {},\n ): Promise<Task> {\n const { pollIntervalMs = 2000, timeoutMs = 120000 } = options;\n const deadline = Date.now() + timeoutMs;\n\n while (Date.now() < deadline) {\n const task = await this.get(taskId);\n if (!task) throw new Error(`Task ${taskId} not found`);\n if (task.status === '1' || task.status === 'done') return task;\n if (task.status === 'error' || task.status === '-1') {\n throw new Error(`Task ${taskId} failed`);\n }\n await new Promise((r) => setTimeout(r, pollIntervalMs));\n }\n\n throw new Error(`Task ${taskId} timed out after ${timeoutMs}ms`);\n }\n}\n","import type { HttpClient } from '../http.js';\nimport type { AsyncTaskResult, VirtualizorResponse } from '../types/common.js';\nimport type { CreateUserParams, User } from '../types/users.js';\n\ntype Params = Record<string, string | number | undefined>;\n\ninterface ListUsersResponse extends VirtualizorResponse {\n users: Record<string, User>;\n}\n\nexport class UsersResource {\n constructor(private readonly http: HttpClient) {}\n\n async list(): Promise<Record<string, User>> {\n const res = await this.http.request<ListUsersResponse>('users', {}, {});\n return res.users;\n }\n\n async create(params: CreateUserParams): Promise<AsyncTaskResult> {\n return this.http.request<AsyncTaskResult>('adduser', {}, params as unknown as Params);\n }\n\n async delete(uid: string): Promise<AsyncTaskResult> {\n return this.http.request<AsyncTaskResult>('users', {}, { delete: uid });\n }\n\n async suspend(uid: string): Promise<AsyncTaskResult> {\n return this.http.request<AsyncTaskResult>('users', {}, { suspend: uid });\n }\n\n async unsuspend(uid: string): Promise<AsyncTaskResult> {\n return this.http.request<AsyncTaskResult>('users', {}, { unsuspend: uid });\n }\n}\n","import type { HttpClient } from '../http.js';\nimport type { AsyncTaskResult, VirtualizorResponse } from '../types/common.js';\nimport type {\n CloneVPSParams,\n CreateVPSParams,\n ListVPSParams,\n MigrateVPSParams,\n RebuildVPSParams,\n VNCInfo,\n VPS,\n VPSStatsResponse,\n} from '../types/vps.js';\n\ntype Params = Record<string, string | number | undefined>;\n\ninterface ListVPSResponse extends VirtualizorResponse {\n vs: Record<string, VPS>;\n}\ninterface GetVPSResponse extends VirtualizorResponse {\n vs: Record<string, VPS>;\n}\n\nexport class VpsResource {\n constructor(private readonly http: HttpClient) {}\n\n async list(filters: ListVPSParams = {}): Promise<Record<string, VPS>> {\n const res = await this.http.request<ListVPSResponse>('listvs', {}, filters as Params);\n return res.vs;\n }\n\n async get(vpsId: string): Promise<VPS> {\n const res = await this.http.request<GetVPSResponse>('vs', { vpsid: vpsId }, {});\n const vps = res.vs[vpsId];\n if (!vps) throw new Error(`VPS ${vpsId} not found in response`);\n return vps;\n }\n\n async create(params: CreateVPSParams): Promise<AsyncTaskResult> {\n return this.http.request<AsyncTaskResult>('addvs', {}, params as unknown as Params);\n }\n\n async delete(vpsId: string): Promise<AsyncTaskResult> {\n return this.http.request<AsyncTaskResult>('vs', { delete: vpsId }, {});\n }\n\n async start(vpsId: string): Promise<AsyncTaskResult> {\n return this.http.request<AsyncTaskResult>('vs', { vpsid: vpsId, action: 'start' }, {});\n }\n\n async stop(vpsId: string): Promise<AsyncTaskResult> {\n return this.http.request<AsyncTaskResult>('vs', { vpsid: vpsId, action: 'stop' }, {});\n }\n\n async restart(vpsId: string): Promise<AsyncTaskResult> {\n return this.http.request<AsyncTaskResult>('vs', { vpsid: vpsId, action: 'restart' }, {});\n }\n\n async poweroff(vpsId: string): Promise<AsyncTaskResult> {\n return this.http.request<AsyncTaskResult>('vs', { vpsid: vpsId, action: 'poweroff' }, {});\n }\n\n async suspend(vpsId: string): Promise<AsyncTaskResult> {\n return this.http.request<AsyncTaskResult>('vs', { suspend: vpsId }, {});\n }\n\n async unsuspend(vpsId: string): Promise<AsyncTaskResult> {\n return this.http.request<AsyncTaskResult>('vs', { unsuspend: vpsId }, {});\n }\n\n async rebuild(vpsId: string, params: RebuildVPSParams): Promise<AsyncTaskResult> {\n return this.http.request<AsyncTaskResult>('rebuild', {}, {\n vpsid: vpsId,\n reos: 1,\n ...params,\n } as Params);\n }\n\n async clone(vpsId: string, params: CloneVPSParams): Promise<AsyncTaskResult> {\n return this.http.request<AsyncTaskResult>('clone', {}, {\n vpsid: vpsId,\n ...params,\n } as Params);\n }\n\n async migrate(vpsId: string, params: MigrateVPSParams): Promise<AsyncTaskResult> {\n return this.http.request<AsyncTaskResult>('migrate', {}, {\n vpsid: vpsId,\n migrate: 1,\n migrate_but: 1,\n ...params,\n } as Params);\n }\n\n async status(vpsId: string): Promise<unknown> {\n return this.http.request('vstatus', { vpsid: vpsId }, {});\n }\n\n async vnc(vpsId: string): Promise<VNCInfo> {\n return this.http.request<VNCInfo>('vnc', { vpsid: vpsId }, {});\n }\n\n async stats(vpsId: string): Promise<VPSStatsResponse> {\n return this.http.request<VPSStatsResponse>('vps_stats', {}, { vpsid: vpsId });\n }\n}\n","import { HttpClient } from './http.js';\nimport { PlansResource } from './resources/plans.js';\nimport { TasksResource } from './resources/tasks.js';\nimport { UsersResource } from './resources/users.js';\nimport { VpsResource } from './resources/vps.js';\nimport type { ResolvedConfig, VirtualizorConfig } from './types/config.js';\n\nexport class VirtualizorClient {\n readonly vps: VpsResource;\n readonly users: UsersResource;\n readonly plans: PlansResource;\n readonly tasks: TasksResource;\n\n constructor(config: VirtualizorConfig) {\n const resolved: ResolvedConfig = {\n host: config.host,\n apiKey: config.apiKey,\n apiPass: config.apiPass ?? '',\n port: config.port ?? 4085,\n https: config.https ?? true,\n rejectUnauthorized: config.rejectUnauthorized ?? false,\n timeout: config.timeout ?? 30000,\n };\n const http = new HttpClient(resolved);\n this.vps = new VpsResource(http);\n this.users = new UsersResource(http);\n this.plans = new PlansResource(http);\n this.tasks = new TasksResource(http);\n }\n}\n\nexport function createVirtualizorClient(config: VirtualizorConfig): VirtualizorClient {\n return new VirtualizorClient(config);\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/config/defaults.ts","../src/auth.ts","../src/http.ts","../src/resources/plans.ts","../src/resources/tasks.ts","../src/resources/users.ts","../src/constants/vps.ts","../src/resources/vps.ts","../src/client.ts"],"names":["https","http"],"mappings":"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","file":"index.js","sourcesContent":["export const DEFAULT_CONFIG = {\n port: 4085,\n https: true,\n rejectUnauthorized: false,\n timeout: 30000,\n debug: false,\n} as const;\n\nexport const DEFAULT_TASK_POLLING = {\n pollIntervalMs: 2000,\n timeoutMs: 120000,\n} as const;\n","import type { ApiParams } from './types/common.js';\n\nexport function buildQueryString(params: ApiParams, apiKey: string, apiPass: string): string {\n const clean: ApiParams = {};\n for (const [key, value] of Object.entries(params)) {\n if (value !== undefined) {\n clean[key] = value;\n }\n }\n\n const urlParams = new URLSearchParams();\n urlParams.set('api', 'json');\n urlParams.set('adminapikey', apiKey);\n urlParams.set('adminapipass', apiPass);\n\n for (const [key, value] of Object.entries(clean)) {\n urlParams.set(key, String(value));\n }\n\n return `?${urlParams.toString()}`;\n}\n","import http from 'node:http';\nimport https from 'node:https';\nimport { buildQueryString } from './auth.js';\nimport type { ApiParams } from './types/common.js';\nimport type { VirtualizorResponse } from './types/common.js';\nimport type { ResolvedConfig } from './types/config.js';\n\nexport class VirtualizorApiError extends Error {\n readonly code: number;\n\n constructor(message: string, code: number) {\n super(message);\n this.name = 'VirtualizorApiError';\n this.code = code;\n }\n}\n\nexport class HttpClient {\n constructor(private readonly config: ResolvedConfig) {}\n\n parseResponse<T extends VirtualizorResponse>(data: T): T {\n if (data.error && data.error.length > 0) {\n const first = data.error[0];\n if (first) {\n throw new VirtualizorApiError(first.msg, first.code);\n }\n }\n return data;\n }\n\n async request<T extends VirtualizorResponse>(\n act: string,\n queryParams: ApiParams = {},\n bodyParams: ApiParams = {},\n ): Promise<T> {\n const allQueryParams: ApiParams = { act, ...queryParams };\n const qs = buildQueryString(allQueryParams, this.config.apiKey, this.config.apiPass);\n\n const path = `/index.php${qs}`;\n\n const bodyString = Object.entries(bodyParams as Record<string, unknown>)\n .filter(([, v]) => v !== undefined)\n .map(([k, v]) => `${encodeURIComponent(k)}=${encodeURIComponent(String(v))}`)\n .join('&');\n\n const data = await this.rawRequest(path, bodyString || undefined);\n return this.parseResponse(data as T);\n }\n\n private rawRequest(path: string, body?: string): Promise<VirtualizorResponse> {\n const transport = this.config.https ? https : http;\n const options: https.RequestOptions = {\n host: this.config.host,\n port: this.config.port,\n path,\n method: body ? 'POST' : 'GET',\n headers: {\n 'Content-Type': 'application/x-www-form-urlencoded',\n ...(body ? { 'Content-Length': Buffer.byteLength(body) } : {}),\n },\n ...(this.config.https\n ? { agent: new https.Agent({ rejectUnauthorized: this.config.rejectUnauthorized }) }\n : {}),\n };\n\n return new Promise((resolve, reject) => {\n const req = transport.request(options, (res) => {\n let raw = '';\n res.on('data', (chunk: Buffer) => {\n raw += chunk.toString();\n });\n res.on('end', () => {\n // Handle redirect (302) - usually means auth failed\n if (res.statusCode === 302 || res.statusCode === 301) {\n reject(\n new Error(\n `Redirect detected (status ${res.statusCode}). Authentication failed. ` +\n `Check your API credentials. Location: ${res.headers.location}`,\n ),\n );\n return;\n }\n\n try {\n resolve(JSON.parse(raw) as VirtualizorResponse);\n } catch (err) {\n if (this.config.debug)\n console.debug('[Virtualizor] Raw response (first 500 chars):', raw.slice(0, 500));\n reject(\n new Error(\n `Failed to parse response: ${raw.slice(0, 200)}. Parse error: ${err instanceof Error ? err.message : String(err)}`,\n ),\n );\n }\n });\n });\n\n req.setTimeout(this.config.timeout, () => {\n req.destroy(new Error(`Request timed out after ${this.config.timeout}ms`));\n });\n\n req.on('error', reject);\n\n if (body) {\n req.write(body);\n }\n\n req.end();\n });\n }\n}\n","import type { HttpClient } from '../http.js';\nimport type { ApiParams } from '../types/common.js';\nimport type { AsyncTaskResult, VirtualizorResponse } from '../types/common.js';\nimport type { CreatePlanParams, Plan } from '../types/plans.js';\n\ninterface ListPlansResponse extends VirtualizorResponse {\n plans: Record<string, Plan>;\n}\nexport class PlansResource {\n constructor(private readonly http: HttpClient) {}\n\n async list(): Promise<Record<string, Plan>> {\n const res = await this.http.request<ListPlansResponse>('plans', {}, {});\n return res.plans;\n }\n\n async create(params: CreatePlanParams): Promise<AsyncTaskResult> {\n return this.http.request<AsyncTaskResult>('addplan', {}, params);\n }\n\n async delete(planId: string): Promise<AsyncTaskResult> {\n return this.http.request<AsyncTaskResult>('plans', {}, { delete: planId });\n }\n}\n","import { DEFAULT_TASK_POLLING } from '../config/defaults.js';\nimport type { HttpClient } from '../http.js';\nimport type { VirtualizorResponse } from '../types/common.js';\nimport type { Task } from '../types/tasks.js';\n\ninterface TasksResponse extends VirtualizorResponse {\n tasks: Record<string, Task>;\n}\n\nexport class TasksResource {\n constructor(private readonly http: HttpClient) {}\n\n async get(taskId: string): Promise<Task | undefined> {\n const res = await this.http.request<TasksResponse>('tasks', { taskid: taskId }, {});\n return res.tasks[taskId];\n }\n\n async wait(\n taskId: string,\n options: { pollIntervalMs?: number; timeoutMs?: number } = {},\n ): Promise<Task> {\n const {\n pollIntervalMs = DEFAULT_TASK_POLLING.pollIntervalMs,\n timeoutMs = DEFAULT_TASK_POLLING.timeoutMs,\n } = options;\n const deadline = Date.now() + timeoutMs;\n\n while (Date.now() < deadline) {\n const task = await this.get(taskId);\n if (!task) throw new Error(`Task ${taskId} not found`);\n if (task.status === '1' || task.status === 'done') return task;\n if (task.status === 'error' || task.status === '-1') {\n throw new Error(`Task ${taskId} failed`);\n }\n await new Promise((r) => setTimeout(r, pollIntervalMs));\n }\n\n throw new Error(`Task ${taskId} timed out after ${timeoutMs}ms`);\n }\n}\n","import type { HttpClient } from '../http.js';\nimport type { ApiParams } from '../types/common.js';\nimport type { AsyncTaskResult, VirtualizorResponse } from '../types/common.js';\nimport type { CreateUserParams, User } from '../types/users.js';\n\ninterface ListUsersResponse extends VirtualizorResponse {\n users: Record<string, User>;\n}\n\nexport class UsersResource {\n constructor(private readonly http: HttpClient) {}\n\n async list(): Promise<Record<string, User>> {\n const res = await this.http.request<ListUsersResponse>('users', {}, {});\n return res.users;\n }\n\n async create(params: CreateUserParams): Promise<AsyncTaskResult> {\n return this.http.request<AsyncTaskResult>('adduser', {}, params);\n }\n\n async delete(uid: string): Promise<AsyncTaskResult> {\n return this.http.request<AsyncTaskResult>('users', {}, { delete: uid });\n }\n\n async suspend(uid: string): Promise<AsyncTaskResult> {\n return this.http.request<AsyncTaskResult>('users', {}, { suspend: uid });\n }\n\n async unsuspend(uid: string): Promise<AsyncTaskResult> {\n return this.http.request<AsyncTaskResult>('users', {}, { unsuspend: uid });\n }\n}\n","// VPS operation constants\nexport const VPS_CONSTANTS = {\n // Rebuild operation requires reos=1 flag\n REBUILD_REOS_FLAG: 1,\n // Migrate operation requires migrate=1 flag\n MIGRATE_FLAG: 1,\n // Migrate operation requires migrate_but=1 flag\n MIGRATE_BUT_FLAG: 1,\n} as const;\n","import { VPS_CONSTANTS } from '../constants/vps.js';\nimport type { HttpClient } from '../http.js';\nimport type { ApiParams } from '../types/common.js';\nimport type { AsyncTaskResult, VirtualizorResponse } from '../types/common.js';\nimport type {\n CloneVPSParams,\n CreateVPSParams,\n ListVPSParams,\n MigrateVPSParams,\n RebuildVPSParams,\n VNCInfo,\n VPS,\n VPSStatsResponse,\n} from '../types/vps.js';\n\ninterface ListVPSResponse extends VirtualizorResponse {\n vs: Record<string, VPS>;\n}\ninterface GetVPSResponse extends VirtualizorResponse {\n vs: Record<string, VPS>;\n}\n\nexport class VpsResource {\n constructor(private readonly http: HttpClient) {}\n\n async list(filters: ListVPSParams = {}): Promise<Record<string, VPS>> {\n const res = await this.http.request<ListVPSResponse>('vs', {}, filters);\n return res.vs ?? {};\n }\n\n async get(vpsId: string): Promise<VPS> {\n const res = await this.http.request<GetVPSResponse>('vs', { vpsid: vpsId }, {});\n const vps = res.vs[vpsId];\n if (!vps) throw new Error(`VPS ${vpsId} not found in response`);\n return vps;\n }\n\n async create(params: CreateVPSParams): Promise<AsyncTaskResult> {\n return this.http.request<AsyncTaskResult>('addvs', {}, params);\n }\n\n async delete(vpsId: string): Promise<AsyncTaskResult> {\n return this.http.request<AsyncTaskResult>('vs', { delete: vpsId }, {});\n }\n\n async start(vpsId: string): Promise<AsyncTaskResult> {\n return this.http.request<AsyncTaskResult>('vs', { vpsid: vpsId, action: 'start' }, {});\n }\n\n async stop(vpsId: string): Promise<AsyncTaskResult> {\n return this.http.request<AsyncTaskResult>('vs', { vpsid: vpsId, action: 'stop' }, {});\n }\n\n async restart(vpsId: string): Promise<AsyncTaskResult> {\n return this.http.request<AsyncTaskResult>('vs', { vpsid: vpsId, action: 'restart' }, {});\n }\n\n async poweroff(vpsId: string): Promise<AsyncTaskResult> {\n return this.http.request<AsyncTaskResult>('vs', { vpsid: vpsId, action: 'poweroff' }, {});\n }\n\n async suspend(vpsId: string): Promise<AsyncTaskResult> {\n return this.http.request<AsyncTaskResult>('vs', { suspend: vpsId }, {});\n }\n\n async unsuspend(vpsId: string): Promise<AsyncTaskResult> {\n return this.http.request<AsyncTaskResult>('vs', { unsuspend: vpsId }, {});\n }\n\n async rebuild(vpsId: string, params: RebuildVPSParams): Promise<AsyncTaskResult> {\n return this.http.request<AsyncTaskResult>(\n 'rebuild',\n {},\n {\n vpsid: vpsId,\n reos: VPS_CONSTANTS.REBUILD_REOS_FLAG,\n ...params,\n },\n );\n }\n\n async clone(vpsId: string, params: CloneVPSParams): Promise<AsyncTaskResult> {\n return this.http.request<AsyncTaskResult>(\n 'clone',\n {},\n {\n vpsid: vpsId,\n ...params,\n },\n );\n }\n\n async migrate(vpsId: string, params: MigrateVPSParams): Promise<AsyncTaskResult> {\n return this.http.request<AsyncTaskResult>(\n 'migrate',\n {},\n {\n vpsid: vpsId,\n migrate: VPS_CONSTANTS.MIGRATE_FLAG,\n migrate_but: VPS_CONSTANTS.MIGRATE_BUT_FLAG,\n ...params,\n },\n );\n }\n\n async status(vpsId: string): Promise<unknown> {\n return this.http.request('vstatus', { vpsid: vpsId }, {});\n }\n\n async vnc(vpsId: string): Promise<VNCInfo> {\n return this.http.request<VNCInfo>('vnc', { vpsid: vpsId }, {});\n }\n\n async stats(vpsId: string): Promise<VPSStatsResponse> {\n return this.http.request<VPSStatsResponse>('vps_stats', {}, { vpsid: vpsId });\n }\n}\n","import { DEFAULT_CONFIG } from './config/defaults.js';\nimport { HttpClient } from './http.js';\nimport { PlansResource } from './resources/plans.js';\nimport { TasksResource } from './resources/tasks.js';\nimport { UsersResource } from './resources/users.js';\nimport { VpsResource } from './resources/vps.js';\nimport type { ResolvedConfig, VirtualizorConfig } from './types/config.js';\n\nexport class VirtualizorClient {\n readonly vps: VpsResource;\n readonly users: UsersResource;\n readonly plans: PlansResource;\n readonly tasks: TasksResource;\n\n constructor(config: VirtualizorConfig) {\n const resolved: ResolvedConfig = {\n host: config.host,\n apiKey: config.apiKey,\n apiPass: config.apiPass ?? '',\n port: config.port ?? DEFAULT_CONFIG.port,\n https: config.https ?? DEFAULT_CONFIG.https,\n rejectUnauthorized: config.rejectUnauthorized ?? DEFAULT_CONFIG.rejectUnauthorized,\n timeout: config.timeout ?? DEFAULT_CONFIG.timeout,\n debug: config.debug ?? DEFAULT_CONFIG.debug,\n };\n const http = new HttpClient(resolved);\n this.vps = new VpsResource(http);\n this.users = new UsersResource(http);\n this.plans = new PlansResource(http);\n this.tasks = new TasksResource(http);\n }\n}\n\nexport function createVirtualizorClient(config: VirtualizorConfig): VirtualizorClient {\n return new VirtualizorClient(config);\n}\n"]}
|
package/dist/index.mjs
CHANGED
|
@@ -1,12 +1,20 @@
|
|
|
1
1
|
import http from 'http';
|
|
2
2
|
import https from 'https';
|
|
3
|
-
import crypto from 'crypto';
|
|
4
3
|
|
|
5
|
-
// src/
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
4
|
+
// src/config/defaults.ts
|
|
5
|
+
var DEFAULT_CONFIG = {
|
|
6
|
+
port: 4085,
|
|
7
|
+
https: true,
|
|
8
|
+
rejectUnauthorized: false,
|
|
9
|
+
timeout: 3e4,
|
|
10
|
+
debug: false
|
|
11
|
+
};
|
|
12
|
+
var DEFAULT_TASK_POLLING = {
|
|
13
|
+
pollIntervalMs: 2e3,
|
|
14
|
+
timeoutMs: 12e4
|
|
15
|
+
};
|
|
16
|
+
|
|
17
|
+
// src/auth.ts
|
|
10
18
|
function buildQueryString(params, apiKey, apiPass) {
|
|
11
19
|
const clean = {};
|
|
12
20
|
for (const [key, value] of Object.entries(params)) {
|
|
@@ -14,11 +22,10 @@ function buildQueryString(params, apiKey, apiPass) {
|
|
|
14
22
|
clean[key] = value;
|
|
15
23
|
}
|
|
16
24
|
}
|
|
17
|
-
const sig = generateSignature(apiKey, apiPass, clean);
|
|
18
25
|
const urlParams = new URLSearchParams();
|
|
19
26
|
urlParams.set("api", "json");
|
|
20
|
-
urlParams.set("
|
|
21
|
-
urlParams.set("
|
|
27
|
+
urlParams.set("adminapikey", apiKey);
|
|
28
|
+
urlParams.set("adminapipass", apiPass);
|
|
22
29
|
for (const [key, value] of Object.entries(clean)) {
|
|
23
30
|
urlParams.set(key, String(value));
|
|
24
31
|
}
|
|
@@ -75,10 +82,24 @@ var HttpClient = class {
|
|
|
75
82
|
raw += chunk.toString();
|
|
76
83
|
});
|
|
77
84
|
res.on("end", () => {
|
|
85
|
+
if (res.statusCode === 302 || res.statusCode === 301) {
|
|
86
|
+
reject(
|
|
87
|
+
new Error(
|
|
88
|
+
`Redirect detected (status ${res.statusCode}). Authentication failed. Check your API credentials. Location: ${res.headers.location}`
|
|
89
|
+
)
|
|
90
|
+
);
|
|
91
|
+
return;
|
|
92
|
+
}
|
|
78
93
|
try {
|
|
79
94
|
resolve(JSON.parse(raw));
|
|
80
|
-
} catch {
|
|
81
|
-
|
|
95
|
+
} catch (err) {
|
|
96
|
+
if (this.config.debug)
|
|
97
|
+
console.debug("[Virtualizor] Raw response (first 500 chars):", raw.slice(0, 500));
|
|
98
|
+
reject(
|
|
99
|
+
new Error(
|
|
100
|
+
`Failed to parse response: ${raw.slice(0, 200)}. Parse error: ${err instanceof Error ? err.message : String(err)}`
|
|
101
|
+
)
|
|
102
|
+
);
|
|
82
103
|
}
|
|
83
104
|
});
|
|
84
105
|
});
|
|
@@ -121,7 +142,10 @@ var TasksResource = class {
|
|
|
121
142
|
return res.tasks[taskId];
|
|
122
143
|
}
|
|
123
144
|
async wait(taskId, options = {}) {
|
|
124
|
-
const {
|
|
145
|
+
const {
|
|
146
|
+
pollIntervalMs = DEFAULT_TASK_POLLING.pollIntervalMs,
|
|
147
|
+
timeoutMs = DEFAULT_TASK_POLLING.timeoutMs
|
|
148
|
+
} = options;
|
|
125
149
|
const deadline = Date.now() + timeoutMs;
|
|
126
150
|
while (Date.now() < deadline) {
|
|
127
151
|
const task = await this.get(taskId);
|
|
@@ -159,14 +183,24 @@ var UsersResource = class {
|
|
|
159
183
|
}
|
|
160
184
|
};
|
|
161
185
|
|
|
186
|
+
// src/constants/vps.ts
|
|
187
|
+
var VPS_CONSTANTS = {
|
|
188
|
+
// Rebuild operation requires reos=1 flag
|
|
189
|
+
REBUILD_REOS_FLAG: 1,
|
|
190
|
+
// Migrate operation requires migrate=1 flag
|
|
191
|
+
MIGRATE_FLAG: 1,
|
|
192
|
+
// Migrate operation requires migrate_but=1 flag
|
|
193
|
+
MIGRATE_BUT_FLAG: 1
|
|
194
|
+
};
|
|
195
|
+
|
|
162
196
|
// src/resources/vps.ts
|
|
163
197
|
var VpsResource = class {
|
|
164
198
|
constructor(http2) {
|
|
165
199
|
this.http = http2;
|
|
166
200
|
}
|
|
167
201
|
async list(filters = {}) {
|
|
168
|
-
const res = await this.http.request("
|
|
169
|
-
return res.vs;
|
|
202
|
+
const res = await this.http.request("vs", {}, filters);
|
|
203
|
+
return res.vs ?? {};
|
|
170
204
|
}
|
|
171
205
|
async get(vpsId) {
|
|
172
206
|
const res = await this.http.request("vs", { vpsid: vpsId }, {});
|
|
@@ -199,25 +233,37 @@ var VpsResource = class {
|
|
|
199
233
|
return this.http.request("vs", { unsuspend: vpsId }, {});
|
|
200
234
|
}
|
|
201
235
|
async rebuild(vpsId, params) {
|
|
202
|
-
return this.http.request(
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
236
|
+
return this.http.request(
|
|
237
|
+
"rebuild",
|
|
238
|
+
{},
|
|
239
|
+
{
|
|
240
|
+
vpsid: vpsId,
|
|
241
|
+
reos: VPS_CONSTANTS.REBUILD_REOS_FLAG,
|
|
242
|
+
...params
|
|
243
|
+
}
|
|
244
|
+
);
|
|
207
245
|
}
|
|
208
246
|
async clone(vpsId, params) {
|
|
209
|
-
return this.http.request(
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
247
|
+
return this.http.request(
|
|
248
|
+
"clone",
|
|
249
|
+
{},
|
|
250
|
+
{
|
|
251
|
+
vpsid: vpsId,
|
|
252
|
+
...params
|
|
253
|
+
}
|
|
254
|
+
);
|
|
213
255
|
}
|
|
214
256
|
async migrate(vpsId, params) {
|
|
215
|
-
return this.http.request(
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
257
|
+
return this.http.request(
|
|
258
|
+
"migrate",
|
|
259
|
+
{},
|
|
260
|
+
{
|
|
261
|
+
vpsid: vpsId,
|
|
262
|
+
migrate: VPS_CONSTANTS.MIGRATE_FLAG,
|
|
263
|
+
migrate_but: VPS_CONSTANTS.MIGRATE_BUT_FLAG,
|
|
264
|
+
...params
|
|
265
|
+
}
|
|
266
|
+
);
|
|
221
267
|
}
|
|
222
268
|
async status(vpsId) {
|
|
223
269
|
return this.http.request("vstatus", { vpsid: vpsId }, {});
|
|
@@ -241,10 +287,11 @@ var VirtualizorClient = class {
|
|
|
241
287
|
host: config.host,
|
|
242
288
|
apiKey: config.apiKey,
|
|
243
289
|
apiPass: config.apiPass ?? "",
|
|
244
|
-
port: config.port ??
|
|
245
|
-
https: config.https ??
|
|
246
|
-
rejectUnauthorized: config.rejectUnauthorized ??
|
|
247
|
-
timeout: config.timeout ??
|
|
290
|
+
port: config.port ?? DEFAULT_CONFIG.port,
|
|
291
|
+
https: config.https ?? DEFAULT_CONFIG.https,
|
|
292
|
+
rejectUnauthorized: config.rejectUnauthorized ?? DEFAULT_CONFIG.rejectUnauthorized,
|
|
293
|
+
timeout: config.timeout ?? DEFAULT_CONFIG.timeout,
|
|
294
|
+
debug: config.debug ?? DEFAULT_CONFIG.debug
|
|
248
295
|
};
|
|
249
296
|
const http2 = new HttpClient(resolved);
|
|
250
297
|
this.vps = new VpsResource(http2);
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/auth.ts","../src/http.ts","../src/resources/plans.ts","../src/resources/tasks.ts","../src/resources/users.ts","../src/resources/vps.ts","../src/client.ts"],"names":["http"],"mappings":";;;;;AAIA,SAAS,iBAAA,CAAkB,MAAA,EAAgB,OAAA,EAAiB,MAAA,EAAwB;AAClF,EAAA,MAAM,MAAA,GAAS,MAAA,CAAO,IAAA,CAAK,MAAM,CAAA,CAC9B,MAAA,CAAO,CAAC,CAAA,KAAM,MAAA,CAAO,CAAC,CAAA,KAAM,MAAS,CAAA,CACrC,IAAA,EAAK,CACL,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,EAAG,CAAC,CAAA,EAAG,MAAA,CAAO,CAAC,CAAC,CAAA,CAAE,CAAA,CAC7B,IAAA,CAAK,EAAE,CAAA;AACV,EAAA,OAAO,MAAA,CACJ,UAAA,CAAW,QAAQ,CAAA,CACnB,MAAA,CAAO,SAAS,OAAA,GAAU,MAAM,CAAA,CAChC,MAAA,CAAO,KAAK,CAAA;AACjB;AAEO,SAAS,gBAAA,CAAiB,MAAA,EAAgB,MAAA,EAAgB,OAAA,EAAyB;AACxF,EAAA,MAAM,QAAgB,EAAC;AACvB,EAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,MAAM,CAAA,EAAG;AACjD,IAAA,IAAI,UAAU,MAAA,EAAW;AACvB,MAAA,KAAA,CAAM,GAAG,CAAA,GAAI,KAAA;AAAA,IACf;AAAA,EACF;AAEA,EAAA,MAAM,GAAA,GAAM,iBAAA,CAAkB,MAAA,EAAQ,OAAA,EAAS,KAAK,CAAA;AAEpD,EAAA,MAAM,SAAA,GAAY,IAAI,eAAA,EAAgB;AACtC,EAAA,SAAA,CAAU,GAAA,CAAI,OAAO,MAAM,CAAA;AAC3B,EAAA,SAAA,CAAU,GAAA,CAAI,WAAW,MAAM,CAAA;AAC/B,EAAA,SAAA,CAAU,GAAA,CAAI,WAAW,GAAG,CAAA;AAE5B,EAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,KAAK,CAAA,EAAG;AAChD,IAAA,SAAA,CAAU,GAAA,CAAI,GAAA,EAAK,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,EAClC;AAEA,EAAA,OAAO,CAAA,CAAA,EAAI,SAAA,CAAU,QAAA,EAAU,CAAA,CAAA;AACjC;;;AC9BO,IAAM,mBAAA,GAAN,cAAkC,KAAA,CAAM;AAAA,EACpC,IAAA;AAAA,EAET,WAAA,CAAY,SAAiB,IAAA,EAAc;AACzC,IAAA,KAAA,CAAM,OAAO,CAAA;AACb,IAAA,IAAA,CAAK,IAAA,GAAO,qBAAA;AACZ,IAAA,IAAA,CAAK,IAAA,GAAO,IAAA;AAAA,EACd;AACF;AAIO,IAAM,aAAN,MAAiB;AAAA,EACtB,YAA6B,MAAA,EAAwB;AAAxB,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AAAA,EAAyB;AAAA,EAEtD,cAA6C,IAAA,EAAY;AACvD,IAAA,IAAI,IAAA,CAAK,KAAA,IAAS,IAAA,CAAK,KAAA,CAAM,SAAS,CAAA,EAAG;AACvC,MAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,CAAC,CAAA;AAC1B,MAAA,IAAI,KAAA,EAAO;AACT,QAAA,MAAM,IAAI,mBAAA,CAAoB,KAAA,CAAM,GAAA,EAAK,MAAM,IAAI,CAAA;AAAA,MACrD;AAAA,IACF;AACA,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,MAAM,QACJ,GAAA,EACA,WAAA,GAAsB,EAAC,EACvB,UAAA,GAAqB,EAAC,EACV;AACZ,IAAA,MAAM,cAAA,GAAyB,EAAE,GAAA,EAAK,GAAG,WAAA,EAAY;AACrD,IAAA,MAAM,EAAA,GAAK,iBAAiB,cAAA,EAAgB,IAAA,CAAK,OAAO,MAAA,EAAQ,IAAA,CAAK,OAAO,OAAO,CAAA;AAEnF,IAAA,MAAM,IAAA,GAAO,aAAa,EAAE,CAAA,CAAA;AAE5B,IAAA,MAAM,UAAA,GAAa,MAAA,CAAO,OAAA,CAAQ,UAAU,EACzC,MAAA,CAAO,CAAC,GAAG,CAAC,CAAA,KAAM,CAAA,KAAM,MAAS,EACjC,GAAA,CAAI,CAAC,CAAC,CAAA,EAAG,CAAC,CAAA,KAAM,CAAA,EAAG,kBAAA,CAAmB,CAAC,CAAC,CAAA,CAAA,EAAI,kBAAA,CAAmB,MAAA,CAAO,CAAC,CAAC,CAAC,CAAA,CAAE,CAAA,CAC3E,KAAK,GAAG,CAAA;AAEX,IAAA,MAAM,OAAO,MAAM,IAAA,CAAK,UAAA,CAAW,IAAA,EAAM,cAAc,MAAS,CAAA;AAChE,IAAA,OAAO,IAAA,CAAK,cAAc,IAAS,CAAA;AAAA,EACrC;AAAA,EAEQ,UAAA,CAAW,MAAc,IAAA,EAA6C;AAC5E,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,MAAA,CAAO,KAAA,GAAQ,KAAA,GAAQ,IAAA;AAC9C,IAAA,MAAM,OAAA,GAAgC;AAAA,MACpC,IAAA,EAAM,KAAK,MAAA,CAAO,IAAA;AAAA,MAClB,IAAA,EAAM,KAAK,MAAA,CAAO,IAAA;AAAA,MAClB,IAAA;AAAA,MACA,MAAA,EAAQ,OAAO,MAAA,GAAS,KAAA;AAAA,MACxB,OAAA,EAAS;AAAA,QACP,cAAA,EAAgB,mCAAA;AAAA,QAChB,GAAI,OAAO,EAAE,gBAAA,EAAkB,OAAO,UAAA,CAAW,IAAI,CAAA,EAAE,GAAI;AAAC,OAC9D;AAAA,MACA,GAAI,IAAA,CAAK,MAAA,CAAO,KAAA,GACZ,EAAE,OAAO,IAAI,KAAA,CAAM,KAAA,CAAM,EAAE,oBAAoB,IAAA,CAAK,MAAA,CAAO,oBAAoB,CAAA,KAC/E;AAAC,KACP;AAEA,IAAA,OAAO,IAAI,OAAA,CAAQ,CAAC,OAAA,EAAS,MAAA,KAAW;AACtC,MAAA,MAAM,GAAA,GAAM,SAAA,CAAU,OAAA,CAAQ,OAAA,EAAS,CAAC,GAAA,KAAQ;AAC9C,QAAA,IAAI,GAAA,GAAM,EAAA;AACV,QAAA,GAAA,CAAI,EAAA,CAAG,MAAA,EAAQ,CAAC,KAAA,KAAkB;AAChC,UAAA,GAAA,IAAO,MAAM,QAAA,EAAS;AAAA,QACxB,CAAC,CAAA;AACD,QAAA,GAAA,CAAI,EAAA,CAAG,OAAO,MAAM;AAClB,UAAA,IAAI;AACF,YAAA,OAAA,CAAQ,IAAA,CAAK,KAAA,CAAM,GAAG,CAAwB,CAAA;AAAA,UAChD,CAAA,CAAA,MAAQ;AACN,YAAA,MAAA,CAAO,IAAI,MAAM,CAAA,0BAAA,EAA6B,GAAA,CAAI,MAAM,CAAA,EAAG,GAAG,CAAC,CAAA,CAAE,CAAC,CAAA;AAAA,UACpE;AAAA,QACF,CAAC,CAAA;AAAA,MACH,CAAC,CAAA;AAED,MAAA,GAAA,CAAI,UAAA,CAAW,IAAA,CAAK,MAAA,CAAO,OAAA,EAAS,MAAM;AACxC,QAAA,GAAA,CAAI,OAAA,CAAQ,IAAI,KAAA,CAAM,CAAA,wBAAA,EAA2B,KAAK,MAAA,CAAO,OAAO,IAAI,CAAC,CAAA;AAAA,MAC3E,CAAC,CAAA;AAED,MAAA,GAAA,CAAI,EAAA,CAAG,SAAS,MAAM,CAAA;AAEtB,MAAA,IAAI,IAAA,EAAM;AACR,QAAA,GAAA,CAAI,MAAM,IAAI,CAAA;AAAA,MAChB;AAEA,MAAA,GAAA,CAAI,GAAA,EAAI;AAAA,IACV,CAAC,CAAA;AAAA,EACH;AACF,CAAA;;;ACrFO,IAAM,gBAAN,MAAoB;AAAA,EACzB,YAA6BA,KAAAA,EAAkB;AAAlB,IAAA,IAAA,CAAA,IAAA,GAAAA,KAAAA;AAAA,EAAmB;AAAA,EAEhD,MAAM,IAAA,GAAsC;AAC1C,IAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,IAAA,CAAK,QAA2B,OAAA,EAAS,EAAC,EAAG,EAAE,CAAA;AACtE,IAAA,OAAO,GAAA,CAAI,KAAA;AAAA,EACb;AAAA,EAEA,MAAM,OAAO,MAAA,EAAoD;AAC/D,IAAA,OAAO,KAAK,IAAA,CAAK,OAAA,CAAyB,SAAA,EAAW,IAAI,MAA2B,CAAA;AAAA,EACtF;AAAA,EAEA,MAAM,OAAO,MAAA,EAA0C;AACrD,IAAA,OAAO,IAAA,CAAK,KAAK,OAAA,CAAyB,OAAA,EAAS,EAAC,EAAG,EAAE,MAAA,EAAQ,MAAA,EAAQ,CAAA;AAAA,EAC3E;AACF,CAAA;;;AChBO,IAAM,gBAAN,MAAoB;AAAA,EACzB,YAA6BA,KAAAA,EAAkB;AAAlB,IAAA,IAAA,CAAA,IAAA,GAAAA,KAAAA;AAAA,EAAmB;AAAA,EAEhD,MAAM,IAAI,MAAA,EAA2C;AACnD,IAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,IAAA,CAAK,OAAA,CAAuB,OAAA,EAAS,EAAE,MAAA,EAAQ,MAAA,EAAO,EAAG,EAAE,CAAA;AAClF,IAAA,OAAO,GAAA,CAAI,MAAM,MAAM,CAAA;AAAA,EACzB;AAAA,EAEA,MAAM,IAAA,CACJ,MAAA,EACA,OAAA,GAA2D,EAAC,EAC7C;AACf,IAAA,MAAM,EAAE,cAAA,GAAiB,GAAA,EAAM,SAAA,GAAY,MAAO,GAAI,OAAA;AACtD,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,GAAA,EAAI,GAAI,SAAA;AAE9B,IAAA,OAAO,IAAA,CAAK,GAAA,EAAI,GAAI,QAAA,EAAU;AAC5B,MAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,GAAA,CAAI,MAAM,CAAA;AAClC,MAAA,IAAI,CAAC,IAAA,EAAM,MAAM,IAAI,KAAA,CAAM,CAAA,KAAA,EAAQ,MAAM,CAAA,UAAA,CAAY,CAAA;AACrD,MAAA,IAAI,KAAK,MAAA,KAAW,GAAA,IAAO,IAAA,CAAK,MAAA,KAAW,QAAQ,OAAO,IAAA;AAC1D,MAAA,IAAI,IAAA,CAAK,MAAA,KAAW,OAAA,IAAW,IAAA,CAAK,WAAW,IAAA,EAAM;AACnD,QAAA,MAAM,IAAI,KAAA,CAAM,CAAA,KAAA,EAAQ,MAAM,CAAA,OAAA,CAAS,CAAA;AAAA,MACzC;AACA,MAAA,MAAM,IAAI,OAAA,CAAQ,CAAC,MAAM,UAAA,CAAW,CAAA,EAAG,cAAc,CAAC,CAAA;AAAA,IACxD;AAEA,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,KAAA,EAAQ,MAAM,CAAA,iBAAA,EAAoB,SAAS,CAAA,EAAA,CAAI,CAAA;AAAA,EACjE;AACF,CAAA;;;ACzBO,IAAM,gBAAN,MAAoB;AAAA,EACzB,YAA6BA,KAAAA,EAAkB;AAAlB,IAAA,IAAA,CAAA,IAAA,GAAAA,KAAAA;AAAA,EAAmB;AAAA,EAEhD,MAAM,IAAA,GAAsC;AAC1C,IAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,IAAA,CAAK,QAA2B,OAAA,EAAS,EAAC,EAAG,EAAE,CAAA;AACtE,IAAA,OAAO,GAAA,CAAI,KAAA;AAAA,EACb;AAAA,EAEA,MAAM,OAAO,MAAA,EAAoD;AAC/D,IAAA,OAAO,KAAK,IAAA,CAAK,OAAA,CAAyB,SAAA,EAAW,IAAI,MAA2B,CAAA;AAAA,EACtF;AAAA,EAEA,MAAM,OAAO,GAAA,EAAuC;AAClD,IAAA,OAAO,IAAA,CAAK,KAAK,OAAA,CAAyB,OAAA,EAAS,EAAC,EAAG,EAAE,MAAA,EAAQ,GAAA,EAAK,CAAA;AAAA,EACxE;AAAA,EAEA,MAAM,QAAQ,GAAA,EAAuC;AACnD,IAAA,OAAO,IAAA,CAAK,KAAK,OAAA,CAAyB,OAAA,EAAS,EAAC,EAAG,EAAE,OAAA,EAAS,GAAA,EAAK,CAAA;AAAA,EACzE;AAAA,EAEA,MAAM,UAAU,GAAA,EAAuC;AACrD,IAAA,OAAO,IAAA,CAAK,KAAK,OAAA,CAAyB,OAAA,EAAS,EAAC,EAAG,EAAE,SAAA,EAAW,GAAA,EAAK,CAAA;AAAA,EAC3E;AACF,CAAA;;;ACXO,IAAM,cAAN,MAAkB;AAAA,EACvB,YAA6BA,KAAAA,EAAkB;AAAlB,IAAA,IAAA,CAAA,IAAA,GAAAA,KAAAA;AAAA,EAAmB;AAAA,EAEhD,MAAM,IAAA,CAAK,OAAA,GAAyB,EAAC,EAAiC;AACpE,IAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,IAAA,CAAK,QAAyB,QAAA,EAAU,IAAI,OAAiB,CAAA;AACpF,IAAA,OAAO,GAAA,CAAI,EAAA;AAAA,EACb;AAAA,EAEA,MAAM,IAAI,KAAA,EAA6B;AACrC,IAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,IAAA,CAAK,OAAA,CAAwB,IAAA,EAAM,EAAE,KAAA,EAAO,KAAA,EAAM,EAAG,EAAE,CAAA;AAC9E,IAAA,MAAM,GAAA,GAAM,GAAA,CAAI,EAAA,CAAG,KAAK,CAAA;AACxB,IAAA,IAAI,CAAC,GAAA,EAAK,MAAM,IAAI,KAAA,CAAM,CAAA,IAAA,EAAO,KAAK,CAAA,sBAAA,CAAwB,CAAA;AAC9D,IAAA,OAAO,GAAA;AAAA,EACT;AAAA,EAEA,MAAM,OAAO,MAAA,EAAmD;AAC9D,IAAA,OAAO,KAAK,IAAA,CAAK,OAAA,CAAyB,OAAA,EAAS,IAAI,MAA2B,CAAA;AAAA,EACpF;AAAA,EAEA,MAAM,OAAO,KAAA,EAAyC;AACpD,IAAA,OAAO,IAAA,CAAK,KAAK,OAAA,CAAyB,IAAA,EAAM,EAAE,MAAA,EAAQ,KAAA,EAAM,EAAG,EAAE,CAAA;AAAA,EACvE;AAAA,EAEA,MAAM,MAAM,KAAA,EAAyC;AACnD,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,OAAA,CAAyB,IAAA,EAAM,EAAE,KAAA,EAAO,KAAA,EAAO,MAAA,EAAQ,OAAA,EAAQ,EAAG,EAAE,CAAA;AAAA,EACvF;AAAA,EAEA,MAAM,KAAK,KAAA,EAAyC;AAClD,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,OAAA,CAAyB,IAAA,EAAM,EAAE,KAAA,EAAO,KAAA,EAAO,MAAA,EAAQ,MAAA,EAAO,EAAG,EAAE,CAAA;AAAA,EACtF;AAAA,EAEA,MAAM,QAAQ,KAAA,EAAyC;AACrD,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,OAAA,CAAyB,IAAA,EAAM,EAAE,KAAA,EAAO,KAAA,EAAO,MAAA,EAAQ,SAAA,EAAU,EAAG,EAAE,CAAA;AAAA,EACzF;AAAA,EAEA,MAAM,SAAS,KAAA,EAAyC;AACtD,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,OAAA,CAAyB,IAAA,EAAM,EAAE,KAAA,EAAO,KAAA,EAAO,MAAA,EAAQ,UAAA,EAAW,EAAG,EAAE,CAAA;AAAA,EAC1F;AAAA,EAEA,MAAM,QAAQ,KAAA,EAAyC;AACrD,IAAA,OAAO,IAAA,CAAK,KAAK,OAAA,CAAyB,IAAA,EAAM,EAAE,OAAA,EAAS,KAAA,EAAM,EAAG,EAAE,CAAA;AAAA,EACxE;AAAA,EAEA,MAAM,UAAU,KAAA,EAAyC;AACvD,IAAA,OAAO,IAAA,CAAK,KAAK,OAAA,CAAyB,IAAA,EAAM,EAAE,SAAA,EAAW,KAAA,EAAM,EAAG,EAAE,CAAA;AAAA,EAC1E;AAAA,EAEA,MAAM,OAAA,CAAQ,KAAA,EAAe,MAAA,EAAoD;AAC/E,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,OAAA,CAAyB,SAAA,EAAW,EAAC,EAAG;AAAA,MACvD,KAAA,EAAO,KAAA;AAAA,MACP,IAAA,EAAM,CAAA;AAAA,MACN,GAAG;AAAA,KACM,CAAA;AAAA,EACb;AAAA,EAEA,MAAM,KAAA,CAAM,KAAA,EAAe,MAAA,EAAkD;AAC3E,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,OAAA,CAAyB,OAAA,EAAS,EAAC,EAAG;AAAA,MACrD,KAAA,EAAO,KAAA;AAAA,MACP,GAAG;AAAA,KACM,CAAA;AAAA,EACb;AAAA,EAEA,MAAM,OAAA,CAAQ,KAAA,EAAe,MAAA,EAAoD;AAC/E,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,OAAA,CAAyB,SAAA,EAAW,EAAC,EAAG;AAAA,MACvD,KAAA,EAAO,KAAA;AAAA,MACP,OAAA,EAAS,CAAA;AAAA,MACT,WAAA,EAAa,CAAA;AAAA,MACb,GAAG;AAAA,KACM,CAAA;AAAA,EACb;AAAA,EAEA,MAAM,OAAO,KAAA,EAAiC;AAC5C,IAAA,OAAO,IAAA,CAAK,KAAK,OAAA,CAAQ,SAAA,EAAW,EAAE,KAAA,EAAO,KAAA,EAAM,EAAG,EAAE,CAAA;AAAA,EAC1D;AAAA,EAEA,MAAM,IAAI,KAAA,EAAiC;AACzC,IAAA,OAAO,IAAA,CAAK,KAAK,OAAA,CAAiB,KAAA,EAAO,EAAE,KAAA,EAAO,KAAA,EAAM,EAAG,EAAE,CAAA;AAAA,EAC/D;AAAA,EAEA,MAAM,MAAM,KAAA,EAA0C;AACpD,IAAA,OAAO,IAAA,CAAK,KAAK,OAAA,CAA0B,WAAA,EAAa,EAAC,EAAG,EAAE,KAAA,EAAO,KAAA,EAAO,CAAA;AAAA,EAC9E;AACF,CAAA;;;ACjGO,IAAM,oBAAN,MAAwB;AAAA,EACpB,GAAA;AAAA,EACA,KAAA;AAAA,EACA,KAAA;AAAA,EACA,KAAA;AAAA,EAET,YAAY,MAAA,EAA2B;AACrC,IAAA,MAAM,QAAA,GAA2B;AAAA,MAC/B,MAAM,MAAA,CAAO,IAAA;AAAA,MACb,QAAQ,MAAA,CAAO,MAAA;AAAA,MACf,OAAA,EAAS,OAAO,OAAA,IAAW,EAAA;AAAA,MAC3B,IAAA,EAAM,OAAO,IAAA,IAAQ,IAAA;AAAA,MACrB,KAAA,EAAO,OAAO,KAAA,IAAS,IAAA;AAAA,MACvB,kBAAA,EAAoB,OAAO,kBAAA,IAAsB,KAAA;AAAA,MACjD,OAAA,EAAS,OAAO,OAAA,IAAW;AAAA,KAC7B;AACA,IAAA,MAAMA,KAAAA,GAAO,IAAI,UAAA,CAAW,QAAQ,CAAA;AACpC,IAAA,IAAA,CAAK,GAAA,GAAM,IAAI,WAAA,CAAYA,KAAI,CAAA;AAC/B,IAAA,IAAA,CAAK,KAAA,GAAQ,IAAI,aAAA,CAAcA,KAAI,CAAA;AACnC,IAAA,IAAA,CAAK,KAAA,GAAQ,IAAI,aAAA,CAAcA,KAAI,CAAA;AACnC,IAAA,IAAA,CAAK,KAAA,GAAQ,IAAI,aAAA,CAAcA,KAAI,CAAA;AAAA,EACrC;AACF;AAEO,SAAS,wBAAwB,MAAA,EAA8C;AACpF,EAAA,OAAO,IAAI,kBAAkB,MAAM,CAAA;AACrC","file":"index.mjs","sourcesContent":["import crypto from 'node:crypto';\n\ntype Params = Record<string, string | number | undefined>;\n\nfunction generateSignature(apiKey: string, apiPass: string, params: Params): string {\n const sorted = Object.keys(params)\n .filter((k) => params[k] !== undefined)\n .sort()\n .map((k) => `${k}${params[k]}`)\n .join('');\n return crypto\n .createHash('sha256')\n .update(apiKey + apiPass + sorted)\n .digest('hex');\n}\n\nexport function buildQueryString(params: Params, apiKey: string, apiPass: string): string {\n const clean: Params = {};\n for (const [key, value] of Object.entries(params)) {\n if (value !== undefined) {\n clean[key] = value;\n }\n }\n\n const sig = generateSignature(apiKey, apiPass, clean);\n\n const urlParams = new URLSearchParams();\n urlParams.set('api', 'json');\n urlParams.set('api_key', apiKey);\n urlParams.set('api_sig', sig);\n\n for (const [key, value] of Object.entries(clean)) {\n urlParams.set(key, String(value));\n }\n\n return `?${urlParams.toString()}`;\n}\n","import http from 'node:http';\nimport https from 'node:https';\nimport { buildQueryString } from './auth.js';\nimport type { VirtualizorResponse } from './types/common.js';\nimport type { ResolvedConfig } from './types/config.js';\n\nexport class VirtualizorApiError extends Error {\n readonly code: number;\n\n constructor(message: string, code: number) {\n super(message);\n this.name = 'VirtualizorApiError';\n this.code = code;\n }\n}\n\ntype Params = Record<string, string | number | undefined>;\n\nexport class HttpClient {\n constructor(private readonly config: ResolvedConfig) {}\n\n parseResponse<T extends VirtualizorResponse>(data: T): T {\n if (data.error && data.error.length > 0) {\n const first = data.error[0];\n if (first) {\n throw new VirtualizorApiError(first.msg, first.code);\n }\n }\n return data;\n }\n\n async request<T extends VirtualizorResponse>(\n act: string,\n queryParams: Params = {},\n bodyParams: Params = {},\n ): Promise<T> {\n const allQueryParams: Params = { act, ...queryParams };\n const qs = buildQueryString(allQueryParams, this.config.apiKey, this.config.apiPass);\n\n const path = `/index.php${qs}`;\n\n const bodyString = Object.entries(bodyParams)\n .filter(([, v]) => v !== undefined)\n .map(([k, v]) => `${encodeURIComponent(k)}=${encodeURIComponent(String(v))}`)\n .join('&');\n\n const data = await this.rawRequest(path, bodyString || undefined);\n return this.parseResponse(data as T);\n }\n\n private rawRequest(path: string, body?: string): Promise<VirtualizorResponse> {\n const transport = this.config.https ? https : http;\n const options: https.RequestOptions = {\n host: this.config.host,\n port: this.config.port,\n path,\n method: body ? 'POST' : 'GET',\n headers: {\n 'Content-Type': 'application/x-www-form-urlencoded',\n ...(body ? { 'Content-Length': Buffer.byteLength(body) } : {}),\n },\n ...(this.config.https\n ? { agent: new https.Agent({ rejectUnauthorized: this.config.rejectUnauthorized }) }\n : {}),\n };\n\n return new Promise((resolve, reject) => {\n const req = transport.request(options, (res) => {\n let raw = '';\n res.on('data', (chunk: Buffer) => {\n raw += chunk.toString();\n });\n res.on('end', () => {\n try {\n resolve(JSON.parse(raw) as VirtualizorResponse);\n } catch {\n reject(new Error(`Failed to parse response: ${raw.slice(0, 200)}`));\n }\n });\n });\n\n req.setTimeout(this.config.timeout, () => {\n req.destroy(new Error(`Request timed out after ${this.config.timeout}ms`));\n });\n\n req.on('error', reject);\n\n if (body) {\n req.write(body);\n }\n\n req.end();\n });\n }\n}\n","import type { HttpClient } from '../http.js';\nimport type { AsyncTaskResult, VirtualizorResponse } from '../types/common.js';\nimport type { CreatePlanParams, Plan } from '../types/plans.js';\n\ntype Params = Record<string, string | number | undefined>;\n\ninterface ListPlansResponse extends VirtualizorResponse {\n plans: Record<string, Plan>;\n}\nexport class PlansResource {\n constructor(private readonly http: HttpClient) {}\n\n async list(): Promise<Record<string, Plan>> {\n const res = await this.http.request<ListPlansResponse>('plans', {}, {});\n return res.plans;\n }\n\n async create(params: CreatePlanParams): Promise<AsyncTaskResult> {\n return this.http.request<AsyncTaskResult>('addplan', {}, params as unknown as Params);\n }\n\n async delete(planId: string): Promise<AsyncTaskResult> {\n return this.http.request<AsyncTaskResult>('plans', {}, { delete: planId });\n }\n}\n","import type { HttpClient } from '../http.js';\nimport type { VirtualizorResponse } from '../types/common.js';\nimport type { Task } from '../types/tasks.js';\n\ninterface TasksResponse extends VirtualizorResponse {\n tasks: Record<string, Task>;\n}\n\nexport class TasksResource {\n constructor(private readonly http: HttpClient) {}\n\n async get(taskId: string): Promise<Task | undefined> {\n const res = await this.http.request<TasksResponse>('tasks', { taskid: taskId }, {});\n return res.tasks[taskId];\n }\n\n async wait(\n taskId: string,\n options: { pollIntervalMs?: number; timeoutMs?: number } = {},\n ): Promise<Task> {\n const { pollIntervalMs = 2000, timeoutMs = 120000 } = options;\n const deadline = Date.now() + timeoutMs;\n\n while (Date.now() < deadline) {\n const task = await this.get(taskId);\n if (!task) throw new Error(`Task ${taskId} not found`);\n if (task.status === '1' || task.status === 'done') return task;\n if (task.status === 'error' || task.status === '-1') {\n throw new Error(`Task ${taskId} failed`);\n }\n await new Promise((r) => setTimeout(r, pollIntervalMs));\n }\n\n throw new Error(`Task ${taskId} timed out after ${timeoutMs}ms`);\n }\n}\n","import type { HttpClient } from '../http.js';\nimport type { AsyncTaskResult, VirtualizorResponse } from '../types/common.js';\nimport type { CreateUserParams, User } from '../types/users.js';\n\ntype Params = Record<string, string | number | undefined>;\n\ninterface ListUsersResponse extends VirtualizorResponse {\n users: Record<string, User>;\n}\n\nexport class UsersResource {\n constructor(private readonly http: HttpClient) {}\n\n async list(): Promise<Record<string, User>> {\n const res = await this.http.request<ListUsersResponse>('users', {}, {});\n return res.users;\n }\n\n async create(params: CreateUserParams): Promise<AsyncTaskResult> {\n return this.http.request<AsyncTaskResult>('adduser', {}, params as unknown as Params);\n }\n\n async delete(uid: string): Promise<AsyncTaskResult> {\n return this.http.request<AsyncTaskResult>('users', {}, { delete: uid });\n }\n\n async suspend(uid: string): Promise<AsyncTaskResult> {\n return this.http.request<AsyncTaskResult>('users', {}, { suspend: uid });\n }\n\n async unsuspend(uid: string): Promise<AsyncTaskResult> {\n return this.http.request<AsyncTaskResult>('users', {}, { unsuspend: uid });\n }\n}\n","import type { HttpClient } from '../http.js';\nimport type { AsyncTaskResult, VirtualizorResponse } from '../types/common.js';\nimport type {\n CloneVPSParams,\n CreateVPSParams,\n ListVPSParams,\n MigrateVPSParams,\n RebuildVPSParams,\n VNCInfo,\n VPS,\n VPSStatsResponse,\n} from '../types/vps.js';\n\ntype Params = Record<string, string | number | undefined>;\n\ninterface ListVPSResponse extends VirtualizorResponse {\n vs: Record<string, VPS>;\n}\ninterface GetVPSResponse extends VirtualizorResponse {\n vs: Record<string, VPS>;\n}\n\nexport class VpsResource {\n constructor(private readonly http: HttpClient) {}\n\n async list(filters: ListVPSParams = {}): Promise<Record<string, VPS>> {\n const res = await this.http.request<ListVPSResponse>('listvs', {}, filters as Params);\n return res.vs;\n }\n\n async get(vpsId: string): Promise<VPS> {\n const res = await this.http.request<GetVPSResponse>('vs', { vpsid: vpsId }, {});\n const vps = res.vs[vpsId];\n if (!vps) throw new Error(`VPS ${vpsId} not found in response`);\n return vps;\n }\n\n async create(params: CreateVPSParams): Promise<AsyncTaskResult> {\n return this.http.request<AsyncTaskResult>('addvs', {}, params as unknown as Params);\n }\n\n async delete(vpsId: string): Promise<AsyncTaskResult> {\n return this.http.request<AsyncTaskResult>('vs', { delete: vpsId }, {});\n }\n\n async start(vpsId: string): Promise<AsyncTaskResult> {\n return this.http.request<AsyncTaskResult>('vs', { vpsid: vpsId, action: 'start' }, {});\n }\n\n async stop(vpsId: string): Promise<AsyncTaskResult> {\n return this.http.request<AsyncTaskResult>('vs', { vpsid: vpsId, action: 'stop' }, {});\n }\n\n async restart(vpsId: string): Promise<AsyncTaskResult> {\n return this.http.request<AsyncTaskResult>('vs', { vpsid: vpsId, action: 'restart' }, {});\n }\n\n async poweroff(vpsId: string): Promise<AsyncTaskResult> {\n return this.http.request<AsyncTaskResult>('vs', { vpsid: vpsId, action: 'poweroff' }, {});\n }\n\n async suspend(vpsId: string): Promise<AsyncTaskResult> {\n return this.http.request<AsyncTaskResult>('vs', { suspend: vpsId }, {});\n }\n\n async unsuspend(vpsId: string): Promise<AsyncTaskResult> {\n return this.http.request<AsyncTaskResult>('vs', { unsuspend: vpsId }, {});\n }\n\n async rebuild(vpsId: string, params: RebuildVPSParams): Promise<AsyncTaskResult> {\n return this.http.request<AsyncTaskResult>('rebuild', {}, {\n vpsid: vpsId,\n reos: 1,\n ...params,\n } as Params);\n }\n\n async clone(vpsId: string, params: CloneVPSParams): Promise<AsyncTaskResult> {\n return this.http.request<AsyncTaskResult>('clone', {}, {\n vpsid: vpsId,\n ...params,\n } as Params);\n }\n\n async migrate(vpsId: string, params: MigrateVPSParams): Promise<AsyncTaskResult> {\n return this.http.request<AsyncTaskResult>('migrate', {}, {\n vpsid: vpsId,\n migrate: 1,\n migrate_but: 1,\n ...params,\n } as Params);\n }\n\n async status(vpsId: string): Promise<unknown> {\n return this.http.request('vstatus', { vpsid: vpsId }, {});\n }\n\n async vnc(vpsId: string): Promise<VNCInfo> {\n return this.http.request<VNCInfo>('vnc', { vpsid: vpsId }, {});\n }\n\n async stats(vpsId: string): Promise<VPSStatsResponse> {\n return this.http.request<VPSStatsResponse>('vps_stats', {}, { vpsid: vpsId });\n }\n}\n","import { HttpClient } from './http.js';\nimport { PlansResource } from './resources/plans.js';\nimport { TasksResource } from './resources/tasks.js';\nimport { UsersResource } from './resources/users.js';\nimport { VpsResource } from './resources/vps.js';\nimport type { ResolvedConfig, VirtualizorConfig } from './types/config.js';\n\nexport class VirtualizorClient {\n readonly vps: VpsResource;\n readonly users: UsersResource;\n readonly plans: PlansResource;\n readonly tasks: TasksResource;\n\n constructor(config: VirtualizorConfig) {\n const resolved: ResolvedConfig = {\n host: config.host,\n apiKey: config.apiKey,\n apiPass: config.apiPass ?? '',\n port: config.port ?? 4085,\n https: config.https ?? true,\n rejectUnauthorized: config.rejectUnauthorized ?? false,\n timeout: config.timeout ?? 30000,\n };\n const http = new HttpClient(resolved);\n this.vps = new VpsResource(http);\n this.users = new UsersResource(http);\n this.plans = new PlansResource(http);\n this.tasks = new TasksResource(http);\n }\n}\n\nexport function createVirtualizorClient(config: VirtualizorConfig): VirtualizorClient {\n return new VirtualizorClient(config);\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/config/defaults.ts","../src/auth.ts","../src/http.ts","../src/resources/plans.ts","../src/resources/tasks.ts","../src/resources/users.ts","../src/constants/vps.ts","../src/resources/vps.ts","../src/client.ts"],"names":["http"],"mappings":"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","file":"index.mjs","sourcesContent":["export const DEFAULT_CONFIG = {\n port: 4085,\n https: true,\n rejectUnauthorized: false,\n timeout: 30000,\n debug: false,\n} as const;\n\nexport const DEFAULT_TASK_POLLING = {\n pollIntervalMs: 2000,\n timeoutMs: 120000,\n} as const;\n","import type { ApiParams } from './types/common.js';\n\nexport function buildQueryString(params: ApiParams, apiKey: string, apiPass: string): string {\n const clean: ApiParams = {};\n for (const [key, value] of Object.entries(params)) {\n if (value !== undefined) {\n clean[key] = value;\n }\n }\n\n const urlParams = new URLSearchParams();\n urlParams.set('api', 'json');\n urlParams.set('adminapikey', apiKey);\n urlParams.set('adminapipass', apiPass);\n\n for (const [key, value] of Object.entries(clean)) {\n urlParams.set(key, String(value));\n }\n\n return `?${urlParams.toString()}`;\n}\n","import http from 'node:http';\nimport https from 'node:https';\nimport { buildQueryString } from './auth.js';\nimport type { ApiParams } from './types/common.js';\nimport type { VirtualizorResponse } from './types/common.js';\nimport type { ResolvedConfig } from './types/config.js';\n\nexport class VirtualizorApiError extends Error {\n readonly code: number;\n\n constructor(message: string, code: number) {\n super(message);\n this.name = 'VirtualizorApiError';\n this.code = code;\n }\n}\n\nexport class HttpClient {\n constructor(private readonly config: ResolvedConfig) {}\n\n parseResponse<T extends VirtualizorResponse>(data: T): T {\n if (data.error && data.error.length > 0) {\n const first = data.error[0];\n if (first) {\n throw new VirtualizorApiError(first.msg, first.code);\n }\n }\n return data;\n }\n\n async request<T extends VirtualizorResponse>(\n act: string,\n queryParams: ApiParams = {},\n bodyParams: ApiParams = {},\n ): Promise<T> {\n const allQueryParams: ApiParams = { act, ...queryParams };\n const qs = buildQueryString(allQueryParams, this.config.apiKey, this.config.apiPass);\n\n const path = `/index.php${qs}`;\n\n const bodyString = Object.entries(bodyParams as Record<string, unknown>)\n .filter(([, v]) => v !== undefined)\n .map(([k, v]) => `${encodeURIComponent(k)}=${encodeURIComponent(String(v))}`)\n .join('&');\n\n const data = await this.rawRequest(path, bodyString || undefined);\n return this.parseResponse(data as T);\n }\n\n private rawRequest(path: string, body?: string): Promise<VirtualizorResponse> {\n const transport = this.config.https ? https : http;\n const options: https.RequestOptions = {\n host: this.config.host,\n port: this.config.port,\n path,\n method: body ? 'POST' : 'GET',\n headers: {\n 'Content-Type': 'application/x-www-form-urlencoded',\n ...(body ? { 'Content-Length': Buffer.byteLength(body) } : {}),\n },\n ...(this.config.https\n ? { agent: new https.Agent({ rejectUnauthorized: this.config.rejectUnauthorized }) }\n : {}),\n };\n\n return new Promise((resolve, reject) => {\n const req = transport.request(options, (res) => {\n let raw = '';\n res.on('data', (chunk: Buffer) => {\n raw += chunk.toString();\n });\n res.on('end', () => {\n // Handle redirect (302) - usually means auth failed\n if (res.statusCode === 302 || res.statusCode === 301) {\n reject(\n new Error(\n `Redirect detected (status ${res.statusCode}). Authentication failed. ` +\n `Check your API credentials. Location: ${res.headers.location}`,\n ),\n );\n return;\n }\n\n try {\n resolve(JSON.parse(raw) as VirtualizorResponse);\n } catch (err) {\n if (this.config.debug)\n console.debug('[Virtualizor] Raw response (first 500 chars):', raw.slice(0, 500));\n reject(\n new Error(\n `Failed to parse response: ${raw.slice(0, 200)}. Parse error: ${err instanceof Error ? err.message : String(err)}`,\n ),\n );\n }\n });\n });\n\n req.setTimeout(this.config.timeout, () => {\n req.destroy(new Error(`Request timed out after ${this.config.timeout}ms`));\n });\n\n req.on('error', reject);\n\n if (body) {\n req.write(body);\n }\n\n req.end();\n });\n }\n}\n","import type { HttpClient } from '../http.js';\nimport type { ApiParams } from '../types/common.js';\nimport type { AsyncTaskResult, VirtualizorResponse } from '../types/common.js';\nimport type { CreatePlanParams, Plan } from '../types/plans.js';\n\ninterface ListPlansResponse extends VirtualizorResponse {\n plans: Record<string, Plan>;\n}\nexport class PlansResource {\n constructor(private readonly http: HttpClient) {}\n\n async list(): Promise<Record<string, Plan>> {\n const res = await this.http.request<ListPlansResponse>('plans', {}, {});\n return res.plans;\n }\n\n async create(params: CreatePlanParams): Promise<AsyncTaskResult> {\n return this.http.request<AsyncTaskResult>('addplan', {}, params);\n }\n\n async delete(planId: string): Promise<AsyncTaskResult> {\n return this.http.request<AsyncTaskResult>('plans', {}, { delete: planId });\n }\n}\n","import { DEFAULT_TASK_POLLING } from '../config/defaults.js';\nimport type { HttpClient } from '../http.js';\nimport type { VirtualizorResponse } from '../types/common.js';\nimport type { Task } from '../types/tasks.js';\n\ninterface TasksResponse extends VirtualizorResponse {\n tasks: Record<string, Task>;\n}\n\nexport class TasksResource {\n constructor(private readonly http: HttpClient) {}\n\n async get(taskId: string): Promise<Task | undefined> {\n const res = await this.http.request<TasksResponse>('tasks', { taskid: taskId }, {});\n return res.tasks[taskId];\n }\n\n async wait(\n taskId: string,\n options: { pollIntervalMs?: number; timeoutMs?: number } = {},\n ): Promise<Task> {\n const {\n pollIntervalMs = DEFAULT_TASK_POLLING.pollIntervalMs,\n timeoutMs = DEFAULT_TASK_POLLING.timeoutMs,\n } = options;\n const deadline = Date.now() + timeoutMs;\n\n while (Date.now() < deadline) {\n const task = await this.get(taskId);\n if (!task) throw new Error(`Task ${taskId} not found`);\n if (task.status === '1' || task.status === 'done') return task;\n if (task.status === 'error' || task.status === '-1') {\n throw new Error(`Task ${taskId} failed`);\n }\n await new Promise((r) => setTimeout(r, pollIntervalMs));\n }\n\n throw new Error(`Task ${taskId} timed out after ${timeoutMs}ms`);\n }\n}\n","import type { HttpClient } from '../http.js';\nimport type { ApiParams } from '../types/common.js';\nimport type { AsyncTaskResult, VirtualizorResponse } from '../types/common.js';\nimport type { CreateUserParams, User } from '../types/users.js';\n\ninterface ListUsersResponse extends VirtualizorResponse {\n users: Record<string, User>;\n}\n\nexport class UsersResource {\n constructor(private readonly http: HttpClient) {}\n\n async list(): Promise<Record<string, User>> {\n const res = await this.http.request<ListUsersResponse>('users', {}, {});\n return res.users;\n }\n\n async create(params: CreateUserParams): Promise<AsyncTaskResult> {\n return this.http.request<AsyncTaskResult>('adduser', {}, params);\n }\n\n async delete(uid: string): Promise<AsyncTaskResult> {\n return this.http.request<AsyncTaskResult>('users', {}, { delete: uid });\n }\n\n async suspend(uid: string): Promise<AsyncTaskResult> {\n return this.http.request<AsyncTaskResult>('users', {}, { suspend: uid });\n }\n\n async unsuspend(uid: string): Promise<AsyncTaskResult> {\n return this.http.request<AsyncTaskResult>('users', {}, { unsuspend: uid });\n }\n}\n","// VPS operation constants\nexport const VPS_CONSTANTS = {\n // Rebuild operation requires reos=1 flag\n REBUILD_REOS_FLAG: 1,\n // Migrate operation requires migrate=1 flag\n MIGRATE_FLAG: 1,\n // Migrate operation requires migrate_but=1 flag\n MIGRATE_BUT_FLAG: 1,\n} as const;\n","import { VPS_CONSTANTS } from '../constants/vps.js';\nimport type { HttpClient } from '../http.js';\nimport type { ApiParams } from '../types/common.js';\nimport type { AsyncTaskResult, VirtualizorResponse } from '../types/common.js';\nimport type {\n CloneVPSParams,\n CreateVPSParams,\n ListVPSParams,\n MigrateVPSParams,\n RebuildVPSParams,\n VNCInfo,\n VPS,\n VPSStatsResponse,\n} from '../types/vps.js';\n\ninterface ListVPSResponse extends VirtualizorResponse {\n vs: Record<string, VPS>;\n}\ninterface GetVPSResponse extends VirtualizorResponse {\n vs: Record<string, VPS>;\n}\n\nexport class VpsResource {\n constructor(private readonly http: HttpClient) {}\n\n async list(filters: ListVPSParams = {}): Promise<Record<string, VPS>> {\n const res = await this.http.request<ListVPSResponse>('vs', {}, filters);\n return res.vs ?? {};\n }\n\n async get(vpsId: string): Promise<VPS> {\n const res = await this.http.request<GetVPSResponse>('vs', { vpsid: vpsId }, {});\n const vps = res.vs[vpsId];\n if (!vps) throw new Error(`VPS ${vpsId} not found in response`);\n return vps;\n }\n\n async create(params: CreateVPSParams): Promise<AsyncTaskResult> {\n return this.http.request<AsyncTaskResult>('addvs', {}, params);\n }\n\n async delete(vpsId: string): Promise<AsyncTaskResult> {\n return this.http.request<AsyncTaskResult>('vs', { delete: vpsId }, {});\n }\n\n async start(vpsId: string): Promise<AsyncTaskResult> {\n return this.http.request<AsyncTaskResult>('vs', { vpsid: vpsId, action: 'start' }, {});\n }\n\n async stop(vpsId: string): Promise<AsyncTaskResult> {\n return this.http.request<AsyncTaskResult>('vs', { vpsid: vpsId, action: 'stop' }, {});\n }\n\n async restart(vpsId: string): Promise<AsyncTaskResult> {\n return this.http.request<AsyncTaskResult>('vs', { vpsid: vpsId, action: 'restart' }, {});\n }\n\n async poweroff(vpsId: string): Promise<AsyncTaskResult> {\n return this.http.request<AsyncTaskResult>('vs', { vpsid: vpsId, action: 'poweroff' }, {});\n }\n\n async suspend(vpsId: string): Promise<AsyncTaskResult> {\n return this.http.request<AsyncTaskResult>('vs', { suspend: vpsId }, {});\n }\n\n async unsuspend(vpsId: string): Promise<AsyncTaskResult> {\n return this.http.request<AsyncTaskResult>('vs', { unsuspend: vpsId }, {});\n }\n\n async rebuild(vpsId: string, params: RebuildVPSParams): Promise<AsyncTaskResult> {\n return this.http.request<AsyncTaskResult>(\n 'rebuild',\n {},\n {\n vpsid: vpsId,\n reos: VPS_CONSTANTS.REBUILD_REOS_FLAG,\n ...params,\n },\n );\n }\n\n async clone(vpsId: string, params: CloneVPSParams): Promise<AsyncTaskResult> {\n return this.http.request<AsyncTaskResult>(\n 'clone',\n {},\n {\n vpsid: vpsId,\n ...params,\n },\n );\n }\n\n async migrate(vpsId: string, params: MigrateVPSParams): Promise<AsyncTaskResult> {\n return this.http.request<AsyncTaskResult>(\n 'migrate',\n {},\n {\n vpsid: vpsId,\n migrate: VPS_CONSTANTS.MIGRATE_FLAG,\n migrate_but: VPS_CONSTANTS.MIGRATE_BUT_FLAG,\n ...params,\n },\n );\n }\n\n async status(vpsId: string): Promise<unknown> {\n return this.http.request('vstatus', { vpsid: vpsId }, {});\n }\n\n async vnc(vpsId: string): Promise<VNCInfo> {\n return this.http.request<VNCInfo>('vnc', { vpsid: vpsId }, {});\n }\n\n async stats(vpsId: string): Promise<VPSStatsResponse> {\n return this.http.request<VPSStatsResponse>('vps_stats', {}, { vpsid: vpsId });\n }\n}\n","import { DEFAULT_CONFIG } from './config/defaults.js';\nimport { HttpClient } from './http.js';\nimport { PlansResource } from './resources/plans.js';\nimport { TasksResource } from './resources/tasks.js';\nimport { UsersResource } from './resources/users.js';\nimport { VpsResource } from './resources/vps.js';\nimport type { ResolvedConfig, VirtualizorConfig } from './types/config.js';\n\nexport class VirtualizorClient {\n readonly vps: VpsResource;\n readonly users: UsersResource;\n readonly plans: PlansResource;\n readonly tasks: TasksResource;\n\n constructor(config: VirtualizorConfig) {\n const resolved: ResolvedConfig = {\n host: config.host,\n apiKey: config.apiKey,\n apiPass: config.apiPass ?? '',\n port: config.port ?? DEFAULT_CONFIG.port,\n https: config.https ?? DEFAULT_CONFIG.https,\n rejectUnauthorized: config.rejectUnauthorized ?? DEFAULT_CONFIG.rejectUnauthorized,\n timeout: config.timeout ?? DEFAULT_CONFIG.timeout,\n debug: config.debug ?? DEFAULT_CONFIG.debug,\n };\n const http = new HttpClient(resolved);\n this.vps = new VpsResource(http);\n this.users = new UsersResource(http);\n this.plans = new PlansResource(http);\n this.tasks = new TasksResource(http);\n }\n}\n\nexport function createVirtualizorClient(config: VirtualizorConfig): VirtualizorClient {\n return new VirtualizorClient(config);\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "virtualizorjs",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.1.1",
|
|
4
4
|
"description": "TypeScript SDK for the Virtualizor server management API. Create, start, stop, restart, rebuild, and manage VPS instances with a type-safe, developer-friendly client.",
|
|
5
5
|
"main": "./dist/index.js",
|
|
6
6
|
"module": "./dist/index.mjs",
|