@meowpanel/api 0.3.0 → 0.5.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.
Files changed (201) hide show
  1. package/esm/mod.d.ts +37 -16
  2. package/esm/mod.d.ts.map +1 -1
  3. package/esm/mod.js +25 -7
  4. package/esm/src/client.d.ts +48 -11
  5. package/esm/src/client.d.ts.map +1 -1
  6. package/esm/src/client.js +53 -12
  7. package/esm/src/http.d.ts +2 -2
  8. package/esm/src/http.d.ts.map +1 -1
  9. package/esm/src/http.js +5 -2
  10. package/esm/src/namespace.d.ts +1 -1
  11. package/esm/src/namespace.js +1 -1
  12. package/esm/src/resources/account.d.ts +50 -19
  13. package/esm/src/resources/account.d.ts.map +1 -1
  14. package/esm/src/resources/account.js +51 -13
  15. package/esm/src/resources/api-keys.d.ts +16 -24
  16. package/esm/src/resources/api-keys.d.ts.map +1 -1
  17. package/esm/src/resources/api-keys.js +16 -20
  18. package/esm/src/resources/auth.d.ts +70 -4
  19. package/esm/src/resources/auth.d.ts.map +1 -1
  20. package/esm/src/resources/auth.js +47 -4
  21. package/esm/src/resources/eggs.d.ts +261 -22
  22. package/esm/src/resources/eggs.d.ts.map +1 -1
  23. package/esm/src/resources/eggs.js +261 -25
  24. package/esm/src/resources/features.d.ts +35 -0
  25. package/esm/src/resources/features.d.ts.map +1 -0
  26. package/esm/src/resources/features.js +21 -0
  27. package/esm/src/resources/hosts.d.ts +151 -21
  28. package/esm/src/resources/hosts.d.ts.map +1 -1
  29. package/esm/src/resources/hosts.js +143 -10
  30. package/esm/src/resources/logs.d.ts +39 -0
  31. package/esm/src/resources/logs.d.ts.map +1 -0
  32. package/esm/src/resources/logs.js +38 -0
  33. package/esm/src/resources/nodes.d.ts +108 -33
  34. package/esm/src/resources/nodes.d.ts.map +1 -1
  35. package/esm/src/resources/nodes.js +116 -24
  36. package/esm/src/resources/permissions.d.ts +45 -0
  37. package/esm/src/resources/permissions.d.ts.map +1 -0
  38. package/esm/src/resources/permissions.js +26 -0
  39. package/esm/src/resources/request-logs.d.ts +91 -0
  40. package/esm/src/resources/request-logs.d.ts.map +1 -0
  41. package/esm/src/resources/request-logs.js +70 -0
  42. package/esm/src/resources/roles.d.ts +128 -0
  43. package/esm/src/resources/roles.d.ts.map +1 -0
  44. package/esm/src/resources/roles.js +142 -0
  45. package/esm/src/resources/server-groups.d.ts +141 -7
  46. package/esm/src/resources/server-groups.d.ts.map +1 -1
  47. package/esm/src/resources/server-groups.js +157 -8
  48. package/esm/src/resources/servers/activity.d.ts +50 -8
  49. package/esm/src/resources/servers/activity.d.ts.map +1 -1
  50. package/esm/src/resources/servers/activity.js +54 -13
  51. package/esm/src/resources/servers/allocations.d.ts +3 -3
  52. package/esm/src/resources/servers/allocations.d.ts.map +1 -1
  53. package/esm/src/resources/servers/allocations.js +7 -7
  54. package/esm/src/resources/servers/backups.d.ts +46 -0
  55. package/esm/src/resources/servers/backups.d.ts.map +1 -0
  56. package/esm/src/resources/servers/backups.js +43 -0
  57. package/esm/src/resources/servers/connection.d.ts +33 -13
  58. package/esm/src/resources/servers/connection.d.ts.map +1 -1
  59. package/esm/src/resources/servers/connection.js +32 -11
  60. package/esm/src/resources/servers/features.d.ts +81 -0
  61. package/esm/src/resources/servers/features.d.ts.map +1 -0
  62. package/esm/src/resources/servers/features.js +60 -0
  63. package/esm/src/resources/servers/files.d.ts +41 -53
  64. package/esm/src/resources/servers/files.d.ts.map +1 -1
  65. package/esm/src/resources/servers/files.js +74 -116
  66. package/esm/src/resources/servers/index.d.ts +46 -27
  67. package/esm/src/resources/servers/index.d.ts.map +1 -1
  68. package/esm/src/resources/servers/index.js +26 -12
  69. package/esm/src/resources/servers/jobs.d.ts +88 -0
  70. package/esm/src/resources/servers/jobs.d.ts.map +1 -0
  71. package/esm/src/resources/servers/jobs.js +115 -0
  72. package/esm/src/resources/servers/node-client.d.ts +33 -0
  73. package/esm/src/resources/servers/node-client.d.ts.map +1 -0
  74. package/esm/src/resources/servers/node-client.js +61 -0
  75. package/esm/src/resources/servers/profiles.d.ts +83 -18
  76. package/esm/src/resources/servers/profiles.d.ts.map +1 -1
  77. package/esm/src/resources/servers/profiles.js +78 -11
  78. package/esm/src/resources/servers/server.d.ts +13 -28
  79. package/esm/src/resources/servers/server.d.ts.map +1 -1
  80. package/esm/src/resources/servers/server.js +21 -37
  81. package/esm/src/resources/servers/sftp.d.ts +12 -19
  82. package/esm/src/resources/servers/sftp.d.ts.map +1 -1
  83. package/esm/src/resources/servers/sftp.js +10 -14
  84. package/esm/src/resources/servers/sub-users.d.ts +99 -0
  85. package/esm/src/resources/servers/sub-users.d.ts.map +1 -0
  86. package/esm/src/resources/servers/sub-users.js +94 -0
  87. package/esm/src/resources/servers/types.d.ts +30 -28
  88. package/esm/src/resources/servers/types.d.ts.map +1 -1
  89. package/esm/src/resources/systems.d.ts +124 -0
  90. package/esm/src/resources/systems.d.ts.map +1 -0
  91. package/esm/src/resources/systems.js +139 -0
  92. package/esm/src/resources/users.d.ts +330 -0
  93. package/esm/src/resources/users.d.ts.map +1 -0
  94. package/esm/src/resources/users.js +280 -0
  95. package/esm/src/types.d.ts +18 -1
  96. package/esm/src/types.d.ts.map +1 -1
  97. package/esm/src/types.js +11 -0
  98. package/package.json +1 -1
  99. package/script/mod.d.ts +37 -16
  100. package/script/mod.d.ts.map +1 -1
  101. package/script/mod.js +50 -5
  102. package/script/src/client.d.ts +48 -11
  103. package/script/src/client.d.ts.map +1 -1
  104. package/script/src/client.js +53 -12
  105. package/script/src/http.d.ts +2 -2
  106. package/script/src/http.d.ts.map +1 -1
  107. package/script/src/http.js +5 -2
  108. package/script/src/namespace.d.ts +1 -1
  109. package/script/src/namespace.js +1 -1
  110. package/script/src/resources/account.d.ts +50 -19
  111. package/script/src/resources/account.d.ts.map +1 -1
  112. package/script/src/resources/account.js +50 -12
  113. package/script/src/resources/api-keys.d.ts +16 -24
  114. package/script/src/resources/api-keys.d.ts.map +1 -1
  115. package/script/src/resources/api-keys.js +15 -19
  116. package/script/src/resources/auth.d.ts +70 -4
  117. package/script/src/resources/auth.d.ts.map +1 -1
  118. package/script/src/resources/auth.js +47 -4
  119. package/script/src/resources/eggs.d.ts +261 -22
  120. package/script/src/resources/eggs.d.ts.map +1 -1
  121. package/script/src/resources/eggs.js +267 -26
  122. package/script/src/resources/features.d.ts +35 -0
  123. package/script/src/resources/features.d.ts.map +1 -0
  124. package/script/src/resources/features.js +25 -0
  125. package/script/src/resources/hosts.d.ts +151 -21
  126. package/script/src/resources/hosts.d.ts.map +1 -1
  127. package/script/src/resources/hosts.js +144 -10
  128. package/script/src/resources/logs.d.ts +39 -0
  129. package/script/src/resources/logs.d.ts.map +1 -0
  130. package/script/src/resources/logs.js +42 -0
  131. package/script/src/resources/nodes.d.ts +108 -33
  132. package/script/src/resources/nodes.d.ts.map +1 -1
  133. package/script/src/resources/nodes.js +117 -24
  134. package/script/src/resources/permissions.d.ts +45 -0
  135. package/script/src/resources/permissions.d.ts.map +1 -0
  136. package/script/src/resources/permissions.js +31 -0
  137. package/script/src/resources/request-logs.d.ts +91 -0
  138. package/script/src/resources/request-logs.d.ts.map +1 -0
  139. package/script/src/resources/request-logs.js +75 -0
  140. package/script/src/resources/roles.d.ts +128 -0
  141. package/script/src/resources/roles.d.ts.map +1 -0
  142. package/script/src/resources/roles.js +148 -0
  143. package/script/src/resources/server-groups.d.ts +141 -7
  144. package/script/src/resources/server-groups.d.ts.map +1 -1
  145. package/script/src/resources/server-groups.js +158 -8
  146. package/script/src/resources/servers/activity.d.ts +50 -8
  147. package/script/src/resources/servers/activity.d.ts.map +1 -1
  148. package/script/src/resources/servers/activity.js +54 -12
  149. package/script/src/resources/servers/allocations.d.ts +3 -3
  150. package/script/src/resources/servers/allocations.d.ts.map +1 -1
  151. package/script/src/resources/servers/allocations.js +7 -7
  152. package/script/src/resources/servers/backups.d.ts +46 -0
  153. package/script/src/resources/servers/backups.d.ts.map +1 -0
  154. package/script/src/resources/servers/backups.js +47 -0
  155. package/script/src/resources/servers/connection.d.ts +33 -13
  156. package/script/src/resources/servers/connection.d.ts.map +1 -1
  157. package/script/src/resources/servers/connection.js +32 -11
  158. package/script/src/resources/servers/features.d.ts +81 -0
  159. package/script/src/resources/servers/features.d.ts.map +1 -0
  160. package/script/src/resources/servers/features.js +64 -0
  161. package/script/src/resources/servers/files.d.ts +41 -53
  162. package/script/src/resources/servers/files.d.ts.map +1 -1
  163. package/script/src/resources/servers/files.js +74 -116
  164. package/script/src/resources/servers/index.d.ts +46 -27
  165. package/script/src/resources/servers/index.d.ts.map +1 -1
  166. package/script/src/resources/servers/index.js +26 -12
  167. package/script/src/resources/servers/jobs.d.ts +88 -0
  168. package/script/src/resources/servers/jobs.d.ts.map +1 -0
  169. package/script/src/resources/servers/jobs.js +120 -0
  170. package/script/src/resources/servers/node-client.d.ts +33 -0
  171. package/script/src/resources/servers/node-client.d.ts.map +1 -0
  172. package/script/src/resources/servers/node-client.js +65 -0
  173. package/script/src/resources/servers/profiles.d.ts +83 -18
  174. package/script/src/resources/servers/profiles.d.ts.map +1 -1
  175. package/script/src/resources/servers/profiles.js +77 -10
  176. package/script/src/resources/servers/server.d.ts +13 -28
  177. package/script/src/resources/servers/server.d.ts.map +1 -1
  178. package/script/src/resources/servers/server.js +21 -37
  179. package/script/src/resources/servers/sftp.d.ts +12 -19
  180. package/script/src/resources/servers/sftp.d.ts.map +1 -1
  181. package/script/src/resources/servers/sftp.js +10 -14
  182. package/script/src/resources/servers/sub-users.d.ts +99 -0
  183. package/script/src/resources/servers/sub-users.d.ts.map +1 -0
  184. package/script/src/resources/servers/sub-users.js +99 -0
  185. package/script/src/resources/servers/types.d.ts +30 -28
  186. package/script/src/resources/servers/types.d.ts.map +1 -1
  187. package/script/src/resources/systems.d.ts +124 -0
  188. package/script/src/resources/systems.d.ts.map +1 -0
  189. package/script/src/resources/systems.js +145 -0
  190. package/script/src/resources/users.d.ts +330 -0
  191. package/script/src/resources/users.d.ts.map +1 -0
  192. package/script/src/resources/users.js +287 -0
  193. package/script/src/types.d.ts +18 -1
  194. package/script/src/types.d.ts.map +1 -1
  195. package/script/src/types.js +12 -0
  196. package/esm/src/resources/members.d.ts +0 -138
  197. package/esm/src/resources/members.d.ts.map +0 -1
  198. package/esm/src/resources/members.js +0 -122
  199. package/script/src/resources/members.d.ts +0 -138
  200. package/script/src/resources/members.d.ts.map +0 -1
  201. package/script/src/resources/members.js +0 -127
@@ -2,10 +2,9 @@ import type { HttpClient } from '../../http.js';
2
2
  import { ResourceNamespace } from '../../namespace.js';
3
3
  import type { IncludeOptions, ListOptions, NanoID, Paginated } from '../../types.js';
4
4
  import type { ResourceWith } from '../../types.js';
5
- import type { ServerBuild, ServerStartup, ServerStatus } from './server.js';
5
+ import type { ServerBuild, ServerStatus } from './server.js';
6
6
  import { Server } from './server.js';
7
7
  import type { ServerAllocationsData, ServerProfileData, UpdateServerPayload } from './types.js';
8
- import type { Egg } from '../eggs.js';
9
8
  import type { ServerGroup } from '../server-groups.js';
10
9
  export type { UpdateServerPayload };
11
10
  /**
@@ -15,7 +14,7 @@ export type { UpdateServerPayload };
15
14
  * When an include is requested, the corresponding field on {@link Server} is guaranteed
16
15
  * to be populated (non-undefined).
17
16
  */
18
- export type ServerInclude = 'group' | 'egg' | 'status' | 'build' | 'startup' | 'allocations' | 'profiles';
17
+ export type ServerInclude = 'group' | 'status' | 'build' | 'allocations' | 'profiles';
19
18
  /**
20
19
  * Maps each {@link ServerInclude} key to the field(s) it guarantees on the {@link Server} instance.
21
20
  *
@@ -25,18 +24,12 @@ interface ServerIncludeMap {
25
24
  group: {
26
25
  group: ServerGroup;
27
26
  };
28
- egg: {
29
- egg: Egg;
30
- };
31
27
  status: {
32
28
  status: ServerStatus;
33
29
  };
34
30
  build: {
35
31
  build: ServerBuild;
36
32
  };
37
- startup: {
38
- startup: ServerStartup;
39
- };
40
33
  allocations: {
41
34
  allocationPorts: ServerAllocationsData;
42
35
  };
@@ -54,32 +47,49 @@ interface ServerIncludeMap {
54
47
  * ```
55
48
  */
56
49
  export type ServerWith<I extends readonly ServerInclude[] = []> = ResourceWith<Server, ServerIncludeMap, I>;
57
- /** Payload for creating a new server. */
50
+ /** Resource limits for a server or server group. */
51
+ export interface ServerLimits {
52
+ ramMb: number;
53
+ swapMb: number;
54
+ storageMb: number;
55
+ /** IO weight (1–1000). */
56
+ weightIo: number;
57
+ cpuPercent: number;
58
+ cpuThreads?: string;
59
+ backup?: number;
60
+ database?: number;
61
+ allocation?: number;
62
+ }
63
+ /** The initial profile (egg binding) created alongside a server. */
64
+ export interface CreateServerProfile {
65
+ name: string;
66
+ description?: string;
67
+ notes?: string;
68
+ eggId: NanoID;
69
+ eggImageId: NanoID;
70
+ eggImageOverride?: string;
71
+ startupCommandOverride?: string;
72
+ skipInstallScripts?: boolean;
73
+ }
74
+ /** Payload for creating a new server (also creates its server group). */
58
75
  export interface CreateServerPayload {
59
76
  name: string;
60
77
  nodeId: NanoID;
78
+ /** Owner issuer reference, e.g. `"user:<id>"` or a bare id. Defaults to the caller. */
79
+ ownerId?: string;
61
80
  description?: string;
62
81
  notes?: string;
63
- limits: {
64
- ramMb: number;
65
- swapMb: number;
66
- storageMb: number;
67
- /** IO weight (1–1000). */
68
- weightIo: number;
69
- cpuPercent: number;
70
- cpuThreads?: string;
71
- backup?: number;
72
- database?: number;
73
- allocation?: number;
82
+ limits: ServerLimits;
83
+ /** Primary allocation to bind, by IP and port. */
84
+ allocation: {
85
+ ip: string;
86
+ port: number;
74
87
  };
75
- eggId: NanoID;
76
- allocationPrimaryId: NanoID;
77
- imageOverride?: string;
78
88
  forceOutgoingIp?: boolean;
79
89
  oomType?: 'docker';
80
- shouldSkipEggScripts?: boolean;
81
- startupCommandOverride?: string;
82
90
  expiresAt?: Date;
91
+ /** The server's initial profile. Omit to create the server without one. */
92
+ profile?: CreateServerProfile;
83
93
  }
84
94
  export interface ServerEvents {
85
95
  created: Server;
@@ -120,7 +130,16 @@ export declare class ServersNamespace extends ResourceNamespace<Server, ServerEv
120
130
  get<const I extends readonly ServerInclude[] = []>(id: NanoID, opts?: IncludeOptions<ServerInclude, I>): Promise<ServerWith<I>>;
121
131
  /** Create a new server (also creates its server group). */
122
132
  create(payload: CreateServerPayload): Promise<Server>;
123
- /** Update a server's details, startup config, or primary allocation. */
133
+ /** Update a server's details or primary allocation. */
124
134
  update(id: NanoID, payload: UpdateServerPayload): Promise<Server>;
135
+ /**
136
+ * Delete a server.
137
+ *
138
+ * @param id The server's NanoID.
139
+ * @param opts `force: true` deletes even when the node cannot be reached to clean up.
140
+ */
141
+ delete(id: NanoID, opts?: {
142
+ force?: boolean;
143
+ }): Promise<void>;
125
144
  }
126
145
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/src/resources/servers/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/src/resources/servers/index.ts"],"names":[],"mappings":"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"}
@@ -74,6 +74,7 @@ export class ServersNamespace extends ResourceNamespace {
74
74
  const body = {
75
75
  name: payload.name,
76
76
  node_id: payload.nodeId,
77
+ owner_id: payload.ownerId,
77
78
  description: payload.description,
78
79
  notes: payload.notes,
79
80
  limits: {
@@ -87,22 +88,30 @@ export class ServersNamespace extends ResourceNamespace {
87
88
  database: payload.limits.database,
88
89
  allocation: payload.limits.allocation,
89
90
  },
90
- egg_id: payload.eggId,
91
- allocation_primary_id: payload.allocationPrimaryId,
92
- image_override: payload.imageOverride,
91
+ allocation: payload.allocation,
93
92
  force_outgoing_ip: payload.forceOutgoingIp,
94
93
  oom_type: payload.oomType,
95
- should_skip_egg_scripts: payload.shouldSkipEggScripts,
96
- startup_command_override: payload.startupCommandOverride,
97
94
  expires_at: payload.expiresAt,
98
95
  };
96
+ if (payload.profile) {
97
+ body['profile'] = {
98
+ name: payload.profile.name,
99
+ description: payload.profile.description,
100
+ notes: payload.profile.notes,
101
+ egg_id: payload.profile.eggId,
102
+ egg_image_id: payload.profile.eggImageId,
103
+ egg_image_override: payload.profile.eggImageOverride,
104
+ startup_command_override: payload.profile.startupCommandOverride,
105
+ skip_install_scripts: payload.profile.skipInstallScripts,
106
+ };
107
+ }
99
108
  const data = await this.http.post('/servers', body);
100
109
  const server = this.makeServer(data);
101
110
  this.addToCache(server);
102
111
  this.emit('created', server);
103
112
  return server;
104
113
  }
105
- /** Update a server's details, startup config, or primary allocation. */
114
+ /** Update a server's details or primary allocation. */
106
115
  async update(id, payload) {
107
116
  const body = {};
108
117
  if (payload.name !== undefined)
@@ -113,12 +122,6 @@ export class ServersNamespace extends ResourceNamespace {
113
122
  body['notes'] = payload.notes;
114
123
  if (payload.allocationPrimary)
115
124
  body['allocation_primary'] = payload.allocationPrimary;
116
- if (payload.startup) {
117
- body['startup'] = {
118
- command: payload.startup.command,
119
- variables: payload.startup.variables,
120
- };
121
- }
122
125
  const data = await this.http.patch(`/servers/${id}`, body);
123
126
  const existing = this.cache.find((s) => s.id === id);
124
127
  if (existing) {
@@ -132,4 +135,15 @@ export class ServersNamespace extends ResourceNamespace {
132
135
  this.emit('updated', server);
133
136
  return server;
134
137
  }
138
+ /**
139
+ * Delete a server.
140
+ *
141
+ * @param id The server's NanoID.
142
+ * @param opts `force: true` deletes even when the node cannot be reached to clean up.
143
+ */
144
+ async delete(id, opts = {}) {
145
+ await this.http.delete(`/servers/${id}`, opts.force ? { params: { force: 'true' } } : {});
146
+ this.removeFromCache(id);
147
+ this.emit('deleted', id);
148
+ }
135
149
  }
@@ -0,0 +1,88 @@
1
+ import type { ISODate } from '../../types.js';
2
+ import type { NodeClient } from './node-client.js';
3
+ /** Lifecycle state of a daemon job. */
4
+ export type JobStatus = 'running' | 'completed' | 'failed' | 'canceled';
5
+ /** Raw job shape returned by the daemon. @internal */
6
+ export interface JobData {
7
+ id: string;
8
+ server_id: string;
9
+ type: string;
10
+ status: JobStatus;
11
+ progress: number;
12
+ message: string;
13
+ error?: string;
14
+ metadata?: Record<string, unknown>;
15
+ created_at: ISODate;
16
+ updated_at: ISODate;
17
+ }
18
+ /** Options for {@link ServerJob.wait}. */
19
+ export interface JobWaitOptions {
20
+ /** Poll interval in milliseconds. Defaults to 1000. */
21
+ intervalMs?: number;
22
+ /** Reject after this many milliseconds. Unlimited by default. */
23
+ timeoutMs?: number;
24
+ /** Abort the wait early. */
25
+ signal?: AbortSignal;
26
+ }
27
+ /**
28
+ * A tracked long-running operation on a server's node daemon (compress, decompress,
29
+ * backup, restore, install).
30
+ *
31
+ * Returned by the async file/backup operations (on the `202` path) and by
32
+ * {@link ServerJobsManager}. Note the daemon only reports `message`, not fine-grained
33
+ * `progress`, for these ops, so `progress` stays `0` until completion. Poll on
34
+ * {@link status} via {@link wait}, not on `progress`.
35
+ */
36
+ export declare class ServerJob {
37
+ private readonly node;
38
+ readonly id: string;
39
+ type: string;
40
+ status: JobStatus;
41
+ progress: number;
42
+ message: string;
43
+ /** Populated when {@link status} is `failed`. */
44
+ error: string | undefined;
45
+ metadata: Record<string, unknown> | undefined;
46
+ createdAt: Date | undefined;
47
+ updatedAt: Date | undefined;
48
+ /** @internal */
49
+ constructor(data: JobData | {
50
+ id: string;
51
+ }, node: NodeClient);
52
+ private apply;
53
+ /** `true` once the job has left the `running` state. */
54
+ get isDone(): boolean;
55
+ /** Re-fetch this job's current state from the daemon. */
56
+ refresh(): Promise<this>;
57
+ /** Fetch the job's stored log output as plain text. */
58
+ getLog(): Promise<string>;
59
+ /** Request cancellation. Resolves even if the job has already finished. */
60
+ cancel(): Promise<void>;
61
+ /**
62
+ * Poll until the job leaves the `running` state. Resolves with this job; inspect
63
+ * {@link status} and {@link error} to tell completion from failure/cancellation.
64
+ */
65
+ wait(opts?: JobWaitOptions): Promise<this>;
66
+ }
67
+ /**
68
+ * Lists and tracks a server's daemon jobs.
69
+ *
70
+ * Access via `server.jobs`.
71
+ *
72
+ * @example
73
+ * ```ts ignore
74
+ * const jobs = await server.jobs.list();
75
+ * const job = await server.jobs.get(id);
76
+ * await job.wait();
77
+ * ```
78
+ */
79
+ export declare class ServerJobsManager {
80
+ private readonly node;
81
+ /** @internal */
82
+ constructor(node: NodeClient);
83
+ /** List the server's jobs, most recent first (includes finished history). */
84
+ list(): Promise<ServerJob[]>;
85
+ /** Fetch a single job by id. */
86
+ get(id: string): Promise<ServerJob>;
87
+ }
88
+ //# sourceMappingURL=jobs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jobs.d.ts","sourceRoot":"","sources":["../../../../src/src/resources/servers/jobs.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAEnD,uCAAuC;AACvC,MAAM,MAAM,SAAS,GAAG,SAAS,GAAG,WAAW,GAAG,QAAQ,GAAG,UAAU,CAAC;AAExE,sDAAsD;AACtD,MAAM,WAAW,OAAO;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,SAAS,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACnC,UAAU,EAAE,OAAO,CAAC;IACpB,UAAU,EAAE,OAAO,CAAC;CACpB;AAED,0CAA0C;AAC1C,MAAM,WAAW,cAAc;IAC9B,uDAAuD;IACvD,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,iEAAiE;IACjE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,4BAA4B;IAC5B,MAAM,CAAC,EAAE,WAAW,CAAC;CACrB;AAED;;;;;;;;GAQG;AACH,qBAAa,SAAS;IAa8B,OAAO,CAAC,QAAQ,CAAC,IAAI;IAZxE,SAAgB,EAAE,EAAE,MAAM,CAAC;IACpB,IAAI,SAAM;IACV,MAAM,EAAE,SAAS,CAAa;IAC9B,QAAQ,SAAK;IACb,OAAO,SAAM;IACpB,iDAAiD;IAC1C,KAAK,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1B,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,CAAC;IAC9C,SAAS,EAAE,IAAI,GAAG,SAAS,CAAC;IAC5B,SAAS,EAAE,IAAI,GAAG,SAAS,CAAC;IAEnC,gBAAgB;gBACG,IAAI,EAAE,OAAO,GAAG;QAAE,EAAE,EAAE,MAAM,CAAA;KAAE,EAAmB,IAAI,EAAE,UAAU;IAKpF,OAAO,CAAC,KAAK;IAWb,wDAAwD;IACxD,IAAW,MAAM,IAAI,OAAO,CAE3B;IAED,yDAAyD;IAC5C,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAMrC,uDAAuD;IAC1C,MAAM,IAAI,OAAO,CAAC,MAAM,CAAC;IAKtC,2EAA2E;IAC9D,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;IAUpC;;;OAGG;IACU,IAAI,CAAC,IAAI,GAAE,cAAmB,GAAG,OAAO,CAAC,IAAI,CAAC;CAc3D;AAED;;;;;;;;;;;GAWG;AACH,qBAAa,iBAAiB;IAEV,OAAO,CAAC,QAAQ,CAAC,IAAI;IADxC,gBAAgB;gBACoB,IAAI,EAAE,UAAU;IAEpD,6EAA6E;IAChE,IAAI,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;IAMzC,gCAAgC;IACnB,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC;CAIhD"}
@@ -0,0 +1,115 @@
1
+ import { ApiError } from '../../errors.js';
2
+ /**
3
+ * A tracked long-running operation on a server's node daemon (compress, decompress,
4
+ * backup, restore, install).
5
+ *
6
+ * Returned by the async file/backup operations (on the `202` path) and by
7
+ * {@link ServerJobsManager}. Note the daemon only reports `message`, not fine-grained
8
+ * `progress`, for these ops, so `progress` stays `0` until completion. Poll on
9
+ * {@link status} via {@link wait}, not on `progress`.
10
+ */
11
+ export class ServerJob {
12
+ node;
13
+ id;
14
+ type = '';
15
+ status = 'running';
16
+ progress = 0;
17
+ message = '';
18
+ /** Populated when {@link status} is `failed`. */
19
+ error;
20
+ metadata;
21
+ createdAt;
22
+ updatedAt;
23
+ /** @internal */
24
+ constructor(data, node) {
25
+ this.node = node;
26
+ this.id = data.id;
27
+ if ('status' in data)
28
+ this.apply(data);
29
+ }
30
+ apply(data) {
31
+ this.type = data.type;
32
+ this.status = data.status;
33
+ this.progress = data.progress;
34
+ this.message = data.message;
35
+ this.error = data.error;
36
+ this.metadata = data.metadata;
37
+ this.createdAt = new Date(data.created_at);
38
+ this.updatedAt = new Date(data.updated_at);
39
+ }
40
+ /** `true` once the job has left the `running` state. */
41
+ get isDone() {
42
+ return this.status !== 'running';
43
+ }
44
+ /** Re-fetch this job's current state from the daemon. */
45
+ async refresh() {
46
+ const res = await this.node.fetch(`/jobs/${this.id}`);
47
+ this.apply(await res.json());
48
+ return this;
49
+ }
50
+ /** Fetch the job's stored log output as plain text. */
51
+ async getLog() {
52
+ const res = await this.node.fetch(`/jobs/${this.id}/log`);
53
+ return res.text();
54
+ }
55
+ /** Request cancellation. Resolves even if the job has already finished. */
56
+ async cancel() {
57
+ try {
58
+ await this.node.fetch(`/jobs/${this.id}`, { method: 'DELETE' });
59
+ }
60
+ catch (err) {
61
+ // 409 means the job is no longer running, which is the state we wanted.
62
+ if (err instanceof ApiError && err.status === 409)
63
+ return;
64
+ throw err;
65
+ }
66
+ }
67
+ /**
68
+ * Poll until the job leaves the `running` state. Resolves with this job; inspect
69
+ * {@link status} and {@link error} to tell completion from failure/cancellation.
70
+ */
71
+ async wait(opts = {}) {
72
+ const interval = opts.intervalMs ?? 1000;
73
+ const deadline = opts.timeoutMs !== undefined ? Date.now() + opts.timeoutMs : undefined;
74
+ while (this.status === 'running') {
75
+ if (opts.signal?.aborted)
76
+ throw new DOMException('Job wait aborted', 'AbortError');
77
+ if (deadline !== undefined && Date.now() >= deadline) {
78
+ throw new Error(`Timed out waiting for job ${this.id}`);
79
+ }
80
+ await new Promise((resolve) => setTimeout(resolve, interval));
81
+ await this.refresh();
82
+ }
83
+ return this;
84
+ }
85
+ }
86
+ /**
87
+ * Lists and tracks a server's daemon jobs.
88
+ *
89
+ * Access via `server.jobs`.
90
+ *
91
+ * @example
92
+ * ```ts ignore
93
+ * const jobs = await server.jobs.list();
94
+ * const job = await server.jobs.get(id);
95
+ * await job.wait();
96
+ * ```
97
+ */
98
+ export class ServerJobsManager {
99
+ node;
100
+ /** @internal */
101
+ constructor(node) {
102
+ this.node = node;
103
+ }
104
+ /** List the server's jobs, most recent first (includes finished history). */
105
+ async list() {
106
+ const res = await this.node.fetch('/jobs');
107
+ const data = await res.json();
108
+ return data.map((d) => new ServerJob(d, this.node));
109
+ }
110
+ /** Fetch a single job by id. */
111
+ async get(id) {
112
+ const res = await this.node.fetch(`/jobs/${id}`);
113
+ return new ServerJob(await res.json(), this.node);
114
+ }
115
+ }
@@ -0,0 +1,33 @@
1
+ import type { NanoID } from '../../types.js';
2
+ /**
3
+ * Transport for direct calls to a server's Whisker node daemon.
4
+ *
5
+ * File operations, backups, jobs, and the live connection all bypass Nexus and talk
6
+ * to the node that hosts the server. The node URL is resolved lazily on first use and
7
+ * cached. All requests carry the scoped bearer token and throw {@link ApiError} on
8
+ * non-2xx responses.
9
+ *
10
+ * @internal
11
+ */
12
+ export declare class NodeClient {
13
+ private readonly serverId;
14
+ private readonly token;
15
+ private readonly resolveNodeUrl;
16
+ private nodeUrl?;
17
+ constructor(serverId: NanoID, token: string, resolveNodeUrl: () => Promise<string>);
18
+ /** Base URL for this server on its node, e.g. `https://node:8080/api/servers/<id>`. */
19
+ private base;
20
+ /**
21
+ * Perform a request against the server's node daemon.
22
+ *
23
+ * @param endpoint Path under the server base, e.g. `/files/compress` or `/jobs`.
24
+ * @param init Standard `RequestInit`; the bearer header is added automatically.
25
+ */
26
+ fetch(endpoint: string, init?: RequestInit): Promise<Response>;
27
+ /** Shorthand for a JSON POST that returns the parsed body. */
28
+ postJson<T>(endpoint: string, body: unknown): Promise<{
29
+ status: number;
30
+ data: T;
31
+ }>;
32
+ }
33
+ //# sourceMappingURL=node-client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"node-client.d.ts","sourceRoot":"","sources":["../../../../src/src/resources/servers/node-client.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAE7C;;;;;;;;;GASG;AACH,qBAAa,UAAU;IAIrB,OAAO,CAAC,QAAQ,CAAC,QAAQ;IACzB,OAAO,CAAC,QAAQ,CAAC,KAAK;IACtB,OAAO,CAAC,QAAQ,CAAC,cAAc;IALhC,OAAO,CAAC,OAAO,CAAC,CAAS;gBAGP,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,MAAM,EACb,cAAc,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC;IAGvD,uFAAuF;YACzE,IAAI;IAKlB;;;;;OAKG;IACU,KAAK,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,GAAE,WAAgB,GAAG,OAAO,CAAC,QAAQ,CAAC;IAiB/E,8DAA8D;IACjD,QAAQ,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,CAAC,CAAA;KAAE,CAAC;CAQ/F"}
@@ -0,0 +1,61 @@
1
+ import { ApiError } from '../../errors.js';
2
+ /**
3
+ * Transport for direct calls to a server's Whisker node daemon.
4
+ *
5
+ * File operations, backups, jobs, and the live connection all bypass Nexus and talk
6
+ * to the node that hosts the server. The node URL is resolved lazily on first use and
7
+ * cached. All requests carry the scoped bearer token and throw {@link ApiError} on
8
+ * non-2xx responses.
9
+ *
10
+ * @internal
11
+ */
12
+ export class NodeClient {
13
+ serverId;
14
+ token;
15
+ resolveNodeUrl;
16
+ nodeUrl;
17
+ constructor(serverId, token, resolveNodeUrl) {
18
+ this.serverId = serverId;
19
+ this.token = token;
20
+ this.resolveNodeUrl = resolveNodeUrl;
21
+ }
22
+ /** Base URL for this server on its node, e.g. `https://node:8080/api/servers/<id>`. */
23
+ async base() {
24
+ if (!this.nodeUrl)
25
+ this.nodeUrl = await this.resolveNodeUrl();
26
+ return `${this.nodeUrl}/api/servers/${this.serverId}`;
27
+ }
28
+ /**
29
+ * Perform a request against the server's node daemon.
30
+ *
31
+ * @param endpoint Path under the server base, e.g. `/files/compress` or `/jobs`.
32
+ * @param init Standard `RequestInit`; the bearer header is added automatically.
33
+ */
34
+ async fetch(endpoint, init = {}) {
35
+ const url = (await this.base()) + endpoint;
36
+ const res = await globalThis.fetch(url, {
37
+ ...init,
38
+ headers: { 'Authorization': `Bearer ${this.token}`, ...init.headers },
39
+ });
40
+ if (!res.ok) {
41
+ let message = `HTTP ${res.status}`;
42
+ try {
43
+ const body = await res.json();
44
+ if (typeof body.error === 'string')
45
+ message = body.error;
46
+ }
47
+ catch { /* ignore non-JSON error bodies */ }
48
+ throw new ApiError({ message, status: res.status });
49
+ }
50
+ return res;
51
+ }
52
+ /** Shorthand for a JSON POST that returns the parsed body. */
53
+ async postJson(endpoint, body) {
54
+ const res = await this.fetch(endpoint, {
55
+ method: 'POST',
56
+ body: JSON.stringify(body),
57
+ headers: { 'Content-Type': 'application/json' },
58
+ });
59
+ return { status: res.status, data: (res.status === 204 ? undefined : await res.json()) };
60
+ }
61
+ }