@wumx-labs/noxaeapi-sdk 0.3.5 → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +41 -0
- package/dist/index.cjs +92 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +137 -2
- package/dist/index.d.ts +137 -2
- package/dist/index.js +92 -2
- package/dist/index.js.map +1 -1
- package/package.json +3 -2
package/README.md
CHANGED
|
@@ -109,6 +109,47 @@ Some modules only work depending on the target server's setup:
|
|
|
109
109
|
|
|
110
110
|
Calling these against a server without the corresponding feature enabled will fail (typically 404).
|
|
111
111
|
|
|
112
|
+
## NoxAeApi-Velocity network hub
|
|
113
|
+
|
|
114
|
+
If your network runs the **NoxAeApi-Velocity** proxy plugin, use
|
|
115
|
+
`NoxAeApiNetworkHubClient` instead of (or alongside) `NoxAeApiClient` —
|
|
116
|
+
point it at the hub's own REST port, not a backend server's port.
|
|
117
|
+
Backend servers push register/heartbeat updates to the hub over
|
|
118
|
+
WebSocket, so hub calls answer from its in-memory registry rather than
|
|
119
|
+
fanning out live requests the way `client.network.*` above does — and
|
|
120
|
+
the response shapes differ accordingly (e.g. `players()` is one flat
|
|
121
|
+
proxy-wide list, not a per-backend breakdown, and there's no hub
|
|
122
|
+
equivalent of `network/health` — see each node's `health` field in
|
|
123
|
+
`statusAll()`/`statusById()` instead).
|
|
124
|
+
|
|
125
|
+
```ts
|
|
126
|
+
import { NoxAeApiNetworkHubClient } from "@wumx-labs/noxaeapi-sdk";
|
|
127
|
+
|
|
128
|
+
const hub = new NoxAeApiNetworkHubClient({
|
|
129
|
+
baseUrl: "http://localhost:9090", // the hub's api-port, not a backend's port
|
|
130
|
+
apiKey: "your-hub-key",
|
|
131
|
+
});
|
|
132
|
+
|
|
133
|
+
const status = await hub.network.statusAll();
|
|
134
|
+
const players = await hub.network.players();
|
|
135
|
+
const found = await hub.network.findPlayer(players.players[0]?.uuid ?? "");
|
|
136
|
+
await hub.network.broadcast("Hello from the hub!");
|
|
137
|
+
|
|
138
|
+
// Reach a specific backend's own REST routes through the hub:
|
|
139
|
+
await hub.network.forward("survival", "POST", "server/exec", {
|
|
140
|
+
body: { command: "say hi" },
|
|
141
|
+
form: true,
|
|
142
|
+
});
|
|
143
|
+
```
|
|
144
|
+
|
|
145
|
+
Or from environment variables (`NOXAEAPI_HUB_BASE_URL` / `NOXAEAPI_HUB_KEY`,
|
|
146
|
+
kept separate from `NoxAeApiClient.fromEnv()`'s `NOXAEAPI_*` vars so a
|
|
147
|
+
process can hold both clients at once):
|
|
148
|
+
|
|
149
|
+
```ts
|
|
150
|
+
const hub = NoxAeApiNetworkHubClient.fromEnv();
|
|
151
|
+
```
|
|
152
|
+
|
|
112
153
|
## Configuration
|
|
113
154
|
|
|
114
155
|
```ts
|
package/dist/index.cjs
CHANGED
|
@@ -830,6 +830,59 @@ var NetworkModule = class {
|
|
|
830
830
|
}
|
|
831
831
|
};
|
|
832
832
|
|
|
833
|
+
// src/modules/network-hub.ts
|
|
834
|
+
var NetworkHubModule = class {
|
|
835
|
+
constructor(http) {
|
|
836
|
+
this.http = http;
|
|
837
|
+
}
|
|
838
|
+
http;
|
|
839
|
+
/** Get last-known status (from the registry) for every backend node that has ever registered. */
|
|
840
|
+
statusAll() {
|
|
841
|
+
return this.http.request("GET", "network/status");
|
|
842
|
+
}
|
|
843
|
+
/** Get last-known status for a single node by its configured ID. */
|
|
844
|
+
statusById(id) {
|
|
845
|
+
return this.http.request("GET", `network/status/${encodeURIComponent(id)}`);
|
|
846
|
+
}
|
|
847
|
+
/**
|
|
848
|
+
* List every player currently connected to the proxy, read straight from
|
|
849
|
+
* Velocity's own player registry (not reported by backends), along with
|
|
850
|
+
* which backend server each is on.
|
|
851
|
+
*/
|
|
852
|
+
players() {
|
|
853
|
+
return this.http.request("GET", "network/players");
|
|
854
|
+
}
|
|
855
|
+
/** Find which backend server a player is currently on by UUID (proxy-authoritative). */
|
|
856
|
+
findPlayer(uuid) {
|
|
857
|
+
return this.http.request("GET", `network/players/${encodeURIComponent(uuid)}`);
|
|
858
|
+
}
|
|
859
|
+
/**
|
|
860
|
+
* Broadcast a message directly to every player connected to the proxy.
|
|
861
|
+
* Unlike `NetworkModule.broadcast`, this doesn't forward to each
|
|
862
|
+
* backend's `/v1/chat/broadcast` — the proxy already has every player
|
|
863
|
+
* in hand — so it still delivers even to servers with no REST API of
|
|
864
|
+
* their own reachable from the hub.
|
|
865
|
+
*/
|
|
866
|
+
broadcast(message) {
|
|
867
|
+
return this.http.request("POST", "network/broadcast", { body: { message }, form: true });
|
|
868
|
+
}
|
|
869
|
+
/**
|
|
870
|
+
* Forward an arbitrary request to a specific backend node's own REST
|
|
871
|
+
* API, e.g. `hub.forward("survival", "POST", "server/exec", { body:
|
|
872
|
+
* { command: "say hi" }, form: true })` reaches that backend's
|
|
873
|
+
* `POST /v1/server/exec` directly. Useful for endpoints the hub doesn't
|
|
874
|
+
* have a dedicated method for (economy, worlds, etc) without
|
|
875
|
+
* instantiating a second client pointed at that backend directly.
|
|
876
|
+
*
|
|
877
|
+
* The target backend responds according to its own route's expected
|
|
878
|
+
* encoding (form vs JSON) — pass `form: true` the same way you would for
|
|
879
|
+
* a direct call to that endpoint.
|
|
880
|
+
*/
|
|
881
|
+
forward(id, method, path, opts = {}) {
|
|
882
|
+
return this.http.request(method, `network/${encodeURIComponent(id)}/${path.replace(/^\/+/, "")}`, opts);
|
|
883
|
+
}
|
|
884
|
+
};
|
|
885
|
+
|
|
833
886
|
// src/socket.ts
|
|
834
887
|
function toWsUrl(baseUrl, route, apiKey) {
|
|
835
888
|
const url = new URL(`${baseUrl.replace(/\/+$/, "")}/v1/ws/${route.replace(/^\/+/, "")}`);
|
|
@@ -939,7 +992,17 @@ var NoxAeApiClient = class _NoxAeApiClient {
|
|
|
939
992
|
skills;
|
|
940
993
|
/** Generic ranked leaderboards (economy currencies, mcMMO, AuraSkills, ...). */
|
|
941
994
|
leaderboards;
|
|
942
|
-
/**
|
|
995
|
+
/**
|
|
996
|
+
* Only works if `network.enabled: true` is set in the server config.
|
|
997
|
+
*
|
|
998
|
+
* This is NoxAeApi-main's built-in polling aggregator — it lives on the
|
|
999
|
+
* *same* backend server you're already connected to and fans requests
|
|
1000
|
+
* out to the other backends listed in that server's own config. If the
|
|
1001
|
+
* network is running NoxAeApi-Velocity instead, use
|
|
1002
|
+
* `NoxAeApiNetworkHubClient` (pointed at the proxy's hub port) rather
|
|
1003
|
+
* than this module — the hub replaces this aggregator with a push model
|
|
1004
|
+
* and its response shapes differ.
|
|
1005
|
+
*/
|
|
943
1006
|
network;
|
|
944
1007
|
http;
|
|
945
1008
|
baseUrl;
|
|
@@ -990,11 +1053,39 @@ var NoxAeApiClient = class _NoxAeApiClient {
|
|
|
990
1053
|
});
|
|
991
1054
|
}
|
|
992
1055
|
};
|
|
1056
|
+
var NoxAeApiNetworkHubClient = class _NoxAeApiNetworkHubClient {
|
|
1057
|
+
/** The network hub's aggregated view of every registered backend node. */
|
|
1058
|
+
network;
|
|
1059
|
+
constructor(options) {
|
|
1060
|
+
const http = new HttpEngine(options);
|
|
1061
|
+
this.network = new NetworkHubModule(http);
|
|
1062
|
+
}
|
|
1063
|
+
/**
|
|
1064
|
+
* Build a hub client from environment variables:
|
|
1065
|
+
* `NOXAEAPI_HUB_BASE_URL` and `NOXAEAPI_HUB_KEY`.
|
|
1066
|
+
*
|
|
1067
|
+
* Same convenience as `NoxAeApiClient.fromEnv()`, under separate env var
|
|
1068
|
+
* names so a process can hold both a backend client and a hub client at
|
|
1069
|
+
* once without the two colliding.
|
|
1070
|
+
*/
|
|
1071
|
+
static fromEnv(overrides = {}) {
|
|
1072
|
+
const env = globalThis.process?.env;
|
|
1073
|
+
const baseUrl = overrides.baseUrl ?? env?.NOXAEAPI_HUB_BASE_URL;
|
|
1074
|
+
const apiKey = overrides.apiKey ?? env?.NOXAEAPI_HUB_KEY;
|
|
1075
|
+
if (!baseUrl) {
|
|
1076
|
+
throw new Error(
|
|
1077
|
+
"NoxAeApiNetworkHubClient.fromEnv(): NOXAEAPI_HUB_BASE_URL is not set and no baseUrl override was given."
|
|
1078
|
+
);
|
|
1079
|
+
}
|
|
1080
|
+
return new _NoxAeApiNetworkHubClient({ ...overrides, baseUrl, apiKey });
|
|
1081
|
+
}
|
|
1082
|
+
};
|
|
993
1083
|
|
|
994
1084
|
exports.NoxAeApiClient = NoxAeApiClient;
|
|
995
1085
|
exports.NoxAeApiError = NoxAeApiError;
|
|
996
1086
|
exports.NoxAeApiForbiddenError = NoxAeApiForbiddenError;
|
|
997
1087
|
exports.NoxAeApiNetworkError = NoxAeApiNetworkError;
|
|
1088
|
+
exports.NoxAeApiNetworkHubClient = NoxAeApiNetworkHubClient;
|
|
998
1089
|
exports.NoxAeApiNotFoundError = NoxAeApiNotFoundError;
|
|
999
1090
|
exports.NoxAeApiRateLimitError = NoxAeApiRateLimitError;
|
|
1000
1091
|
exports.NoxAeApiServerError = NoxAeApiServerError;
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/errors.ts","../src/http-engine.ts","../src/modules/players.ts","../src/modules/economy.ts","../src/modules/server.ts","../src/modules/worlds.ts","../src/modules/plugins.ts","../src/modules/misc.ts","../src/modules/luckperms.ts","../src/modules/noxauth.ts","../src/modules/skills.ts","../src/modules/leaderboard.ts","../src/modules/network.ts","../src/socket.ts","../src/client.ts"],"names":[],"mappings":"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","file":"index.cjs","sourcesContent":["export interface NoxAeApiErrorInfo {\n status: number;\n method: string;\n path: string;\n body?: unknown;\n}\n\n/**\n * Base error thrown for any non-2xx response from a NoxAeApi server.\n * Prefer catching the more specific subclasses below when you need to\n * branch on the failure reason.\n */\nexport class NoxAeApiError extends Error {\n readonly status: number;\n readonly method: string;\n readonly path: string;\n readonly body?: unknown;\n\n constructor(message: string, info: NoxAeApiErrorInfo) {\n super(message);\n this.name = \"NoxAeApiError\";\n this.status = info.status;\n this.method = info.method;\n this.path = info.path;\n this.body = info.body;\n }\n}\n\n/** 401 — the API key is missing or not recognized by the server. */\nexport class NoxAeApiUnauthorizedError extends NoxAeApiError {\n constructor(info: NoxAeApiErrorInfo) {\n super(\n `Unauthorized: the API key was missing or invalid for ${info.method} ${info.path}`,\n info,\n );\n this.name = \"NoxAeApiUnauthorizedError\";\n }\n}\n\n/**\n * 403 — the API key is valid but isn't allowed to call this endpoint\n * (read-only key hitting a write route, or an endpoint restriction set\n * on the key). This is a server-side permission decision; the SDK does\n * not attempt to predict or enforce it client-side.\n */\nexport class NoxAeApiForbiddenError extends NoxAeApiError {\n constructor(info: NoxAeApiErrorInfo) {\n super(\n `Forbidden: this API key does not have permission to call ${info.method} ${info.path}`,\n info,\n );\n this.name = \"NoxAeApiForbiddenError\";\n }\n}\n\n/** 404 — the target resource (player, world, plugin, etc.) wasn't found. */\nexport class NoxAeApiNotFoundError extends NoxAeApiError {\n constructor(info: NoxAeApiErrorInfo) {\n super(`Not found: ${info.method} ${info.path}`, info);\n this.name = \"NoxAeApiNotFoundError\";\n }\n}\n\n/** 429 — rate limited. `retryAfterMs` is populated when the server sends a Retry-After header. */\nexport class NoxAeApiRateLimitError extends NoxAeApiError {\n readonly retryAfterMs?: number;\n\n constructor(info: NoxAeApiErrorInfo, retryAfterMs?: number) {\n super(\n `Rate limited on ${info.method} ${info.path}${retryAfterMs ? ` — retry after ${retryAfterMs}ms` : \"\"}`,\n info,\n );\n this.name = \"NoxAeApiRateLimitError\";\n this.retryAfterMs = retryAfterMs;\n }\n}\n\n/** 5xx — the server errored out. Usually safe to retry. */\nexport class NoxAeApiServerError extends NoxAeApiError {\n constructor(info: NoxAeApiErrorInfo) {\n super(`Server error (${info.status}) on ${info.method} ${info.path}`, info);\n this.name = \"NoxAeApiServerError\";\n }\n}\n\n/** The request could not complete at all (DNS, connection refused, timeout, abort). */\nexport class NoxAeApiNetworkError extends Error {\n readonly method: string;\n readonly path: string;\n readonly cause?: unknown;\n\n constructor(message: string, method: string, path: string, cause?: unknown) {\n super(message);\n this.name = \"NoxAeApiNetworkError\";\n this.method = method;\n this.path = path;\n this.cause = cause;\n }\n}\n","import {\n NoxAeApiError,\n NoxAeApiForbiddenError,\n NoxAeApiNetworkError,\n NoxAeApiNotFoundError,\n NoxAeApiRateLimitError,\n NoxAeApiServerError,\n NoxAeApiUnauthorizedError,\n} from \"./errors.js\";\n\nexport interface RetryOptions {\n /** Max number of attempts including the first one. Default 3. */\n attempts?: number;\n /** Base delay in ms used for exponential backoff. Default 300. */\n baseDelayMs?: number;\n /** Upper bound for any single backoff delay. Default 5000. */\n maxDelayMs?: number;\n}\n\nexport interface NoxAeApiClientOptions {\n /** Base URL of the server, e.g. \"http://localhost:8080\" or \"https://mc.example.com\". */\n baseUrl: string;\n /** The API key configured on the server (sent as the `key` header). */\n apiKey?: string;\n /** Request timeout in ms. Default 10000. */\n timeoutMs?: number;\n /** Retry behavior for network errors, 429s, and 5xx responses. */\n retry?: RetryOptions | false;\n /** Extra headers sent on every request. */\n headers?: Record<string, string>;\n /** Override fetch, mainly for testing. Defaults to the global fetch. */\n fetchImpl?: typeof fetch;\n}\n\nconst DEFAULT_RETRY: Required<RetryOptions> = {\n attempts: 3,\n baseDelayMs: 300,\n maxDelayMs: 5000,\n};\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nfunction backoffDelay(attempt: number, opts: Required<RetryOptions>): number {\n const exp = Math.min(opts.maxDelayMs, opts.baseDelayMs * 2 ** attempt);\n // full jitter\n return Math.floor(Math.random() * exp);\n}\n\nexport type QueryValue = string | number | boolean | null | undefined;\n\nexport class HttpEngine {\n private readonly baseUrl: string;\n private readonly apiKey?: string;\n private readonly timeoutMs: number;\n private readonly retry: Required<RetryOptions> | false;\n private readonly extraHeaders: Record<string, string>;\n private readonly fetchImpl: typeof fetch;\n\n constructor(options: NoxAeApiClientOptions) {\n if (!options.baseUrl) {\n throw new Error(\"NoxAeApiClient requires a non-empty baseUrl\");\n }\n this.baseUrl = options.baseUrl.replace(/\\/+$/, \"\");\n this.apiKey = options.apiKey;\n this.timeoutMs = options.timeoutMs ?? 10_000;\n this.retry =\n options.retry === false\n ? false\n : { ...DEFAULT_RETRY, ...(options.retry ?? {}) };\n this.extraHeaders = options.headers ?? {};\n const fetchImpl = options.fetchImpl ?? globalThis.fetch;\n if (!fetchImpl) {\n throw new Error(\n \"No fetch implementation available. Pass `fetchImpl` in options for this runtime.\",\n );\n }\n this.fetchImpl = fetchImpl;\n }\n\n private buildUrl(path: string, query?: Record<string, QueryValue>): string {\n const url = new URL(`${this.baseUrl}/v1/${path.replace(/^\\/+/, \"\")}`);\n if (query) {\n for (const [key, value] of Object.entries(query)) {\n if (value !== undefined && value !== null) {\n url.searchParams.set(key, String(value));\n }\n }\n }\n return url.toString();\n }\n\n async request<T>(\n method: \"GET\" | \"POST\" | \"PUT\" | \"DELETE\" | \"PATCH\",\n path: string,\n opts: {\n body?: unknown;\n query?: Record<string, QueryValue>;\n /**\n * Encode `body` as `application/x-www-form-urlencoded` (Javalin's\n * `ctx.formParam(...)`) instead of JSON. Most NoxAeApi endpoints\n * expect form-urlencoded bodies — only the LuckPerms and NoxAuth\n * routes use `ctx.bodyAsClass(...)` and need real JSON. Defaults to\n * `false` (JSON) to preserve existing behavior; each module call\n * site is responsible for passing `form: true` where the server\n * actually expects it.\n */\n form?: boolean;\n } = {},\n ): Promise<T> {\n const url = this.buildUrl(path, opts.query);\n const maxAttempts = this.retry ? this.retry.attempts : 1;\n\n let lastError: unknown;\n\n for (let attempt = 0; attempt < maxAttempts; attempt++) {\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), this.timeoutMs);\n\n try {\n const headers: Record<string, string> = {\n Accept: \"application/json\",\n ...this.extraHeaders,\n };\n if (this.apiKey) headers[\"key\"] = this.apiKey;\n\n let encodedBody: string | undefined;\n if (opts.body !== undefined) {\n if (opts.form) {\n headers[\"Content-Type\"] = \"application/x-www-form-urlencoded\";\n encodedBody = encodeFormBody(opts.body);\n } else {\n headers[\"Content-Type\"] = \"application/json\";\n encodedBody = JSON.stringify(opts.body);\n }\n }\n\n const response = await this.fetchImpl(url, {\n method,\n headers,\n body: encodedBody,\n signal: controller.signal,\n });\n\n clearTimeout(timeout);\n\n if (response.ok) {\n if (response.status === 204) return undefined as T;\n const text = await response.text();\n return (text ? JSON.parse(text) : undefined) as T;\n }\n\n const errorBody = await response.text().catch(() => undefined);\n const parsedBody = safeJsonParse(errorBody);\n const info = { status: response.status, method, path, body: parsedBody };\n\n if (response.status === 401) throw new NoxAeApiUnauthorizedError(info);\n if (response.status === 403) throw new NoxAeApiForbiddenError(info);\n if (response.status === 404) throw new NoxAeApiNotFoundError(info);\n\n if (response.status === 429) {\n const retryAfterHeader = response.headers.get(\"Retry-After\");\n const retryAfterMs = retryAfterHeader\n ? parseRetryAfter(retryAfterHeader)\n : undefined;\n const err = new NoxAeApiRateLimitError(info, retryAfterMs);\n if (this.retry && attempt < maxAttempts - 1) {\n lastError = err;\n await sleep(retryAfterMs ?? backoffDelay(attempt, this.retry));\n continue;\n }\n throw err;\n }\n\n if (response.status >= 500) {\n const err = new NoxAeApiServerError(info);\n if (this.retry && attempt < maxAttempts - 1) {\n lastError = err;\n await sleep(backoffDelay(attempt, this.retry));\n continue;\n }\n throw err;\n }\n\n throw new NoxAeApiError(\n `Unexpected status ${response.status} on ${method} ${path}`,\n info,\n );\n } catch (err) {\n clearTimeout(timeout);\n\n if (err instanceof NoxAeApiError) throw err;\n\n const isAbort = err instanceof Error && err.name === \"AbortError\";\n const networkErr = new NoxAeApiNetworkError(\n isAbort\n ? `Request timed out after ${this.timeoutMs}ms: ${method} ${path}`\n : `Network error on ${method} ${path}: ${(err as Error).message}`,\n method,\n path,\n err,\n );\n\n if (this.retry && attempt < maxAttempts - 1) {\n lastError = networkErr;\n await sleep(backoffDelay(attempt, this.retry));\n continue;\n }\n throw networkErr;\n }\n }\n\n // Unreachable in practice, but keeps TS happy and surfaces the last error if we exit the loop.\n throw lastError instanceof Error\n ? lastError\n : new Error(\"Request failed after retries\");\n }\n}\n\n/**\n * Encodes a plain object as `application/x-www-form-urlencoded`, matching\n * what Javalin's `ctx.formParam(name)` reads server-side. `undefined`/`null`\n * values are omitted (so optional fields can be left out entirely rather\n * than sent as the literal string \"undefined\"). Non-primitive values are\n * JSON.stringify'd as a fallback, though no current endpoint needs that.\n */\nfunction encodeFormBody(body: unknown): string {\n const params = new URLSearchParams();\n if (body && typeof body === \"object\") {\n for (const [key, value] of Object.entries(body as Record<string, unknown>)) {\n if (value === undefined || value === null) continue;\n params.set(\n key,\n typeof value === \"string\" || typeof value === \"number\" || typeof value === \"boolean\"\n ? String(value)\n : JSON.stringify(value),\n );\n }\n }\n return params.toString();\n}\n\nfunction safeJsonParse(text: string | undefined): unknown {\n if (!text) return undefined;\n try {\n return JSON.parse(text);\n } catch {\n return text;\n }\n}\n\nfunction parseRetryAfter(headerValue: string): number | undefined {\n const seconds = Number(headerValue);\n if (!Number.isNaN(seconds)) return seconds * 1000;\n const date = Date.parse(headerValue);\n if (!Number.isNaN(date)) return Math.max(0, date - Date.now());\n return undefined;\n}\n","import type { HttpEngine } from \"../http-engine.js\";\nimport type {\n InventoryItem,\n OfflinePlayer,\n OnlinePlayer,\n PlayerStats,\n} from \"../types/models.js\";\n\nexport class PlayersModule {\n constructor(private readonly http: HttpEngine) {}\n\n /** List currently online players. */\n list(): Promise<OnlinePlayer[]> {\n return this.http.request(\"GET\", \"players\");\n }\n\n /** List all players the server has ever seen (online + offline). */\n listAll(): Promise<OfflinePlayer[]> {\n return this.http.request(\"GET\", \"players/all\");\n }\n\n /** Get a single player by UUID (works for online or offline players). */\n get(uuid: string): Promise<OnlinePlayer | OfflinePlayer> {\n return this.http.request(\"GET\", `players/${encodeURIComponent(uuid)}`);\n }\n\n /** Get a player's inventory in a specific world. */\n getInventory(playerUuid: string, worldUuid: string): Promise<InventoryItem[]> {\n return this.http.request(\n \"GET\",\n `players/${encodeURIComponent(playerUuid)}/${encodeURIComponent(worldUuid)}/inventory`,\n );\n }\n\n /** Kick an online player, optionally with a reason. */\n kick(uuid: string, reason?: string): Promise<void> {\n return this.http.request(\"POST\", `players/${encodeURIComponent(uuid)}/kick`, {\n body: reason ? { reason } : undefined,\n form: true,\n });\n }\n\n /**\n * Ban a player, optionally with a reason and an ISO-8601 expiry\n * (e.g. \"2030-01-01T00:00:00Z\"). Omit `expiry` for a permanent ban.\n */\n ban(uuid: string, reason?: string, expiry?: string): Promise<void> {\n return this.http.request(\"POST\", `players/${encodeURIComponent(uuid)}/ban`, {\n body: reason || expiry ? { reason, expiry } : undefined,\n form: true,\n });\n }\n\n /** Remove a player's ban. */\n unban(uuid: string): Promise<void> {\n return this.http.request(\"DELETE\", `players/${encodeURIComponent(uuid)}/ban`);\n }\n\n /** Teleport a player to a location. */\n teleport(\n uuid: string,\n location: { x: number; y: number; z: number; world?: string },\n ): Promise<void> {\n return this.http.request(\"POST\", `players/${encodeURIComponent(uuid)}/teleport`, {\n body: location,\n form: true,\n });\n }\n\n /** Change a player's gamemode. */\n setGamemode(\n uuid: string,\n gamemode: \"survival\" | \"creative\" | \"adventure\" | \"spectator\",\n ): Promise<void> {\n return this.http.request(\"PUT\", `players/${encodeURIComponent(uuid)}/gamemode`, {\n body: { gamemode },\n form: true,\n });\n }\n\n /** Get kill/death/playtime/block stats for a player. */\n getStats(uuid: string): Promise<PlayerStats> {\n return this.http.request(\"GET\", `players/${encodeURIComponent(uuid)}/stats`);\n }\n}\n","import type { HttpEngine } from \"../http-engine.js\";\nimport type {\n CurrencyBalance,\n CurrencyTopEntry,\n EconomyInfo,\n PlayerBalance,\n TopBalanceEntry,\n} from \"../types/models.js\";\n\nexport class EconomyModule {\n constructor(private readonly http: HttpEngine) {}\n\n /** Get info about the connected economy provider (Impactor on Fabric, Vault on Bukkit/Spigot/Paper). */\n info(): Promise<EconomyInfo> {\n return this.http.request(\"GET\", \"economy\");\n }\n\n /** Get a player's balance. */\n getBalance(uuid: string): Promise<PlayerBalance> {\n return this.http.request(\"GET\", `economy/balance/${encodeURIComponent(uuid)}`);\n }\n\n /** Get the top balances leaderboard. */\n getTopBalance(limit?: number): Promise<TopBalanceEntry[]> {\n return this.http.request(\"GET\", \"economy/top\", {\n query: { limit },\n });\n }\n\n /** Pay an amount to a player (adds to their balance). */\n pay(uuid: string, amount: number): Promise<void> {\n return this.http.request(\"POST\", \"economy/pay\", { body: { uuid, amount }, form: true });\n }\n\n /** Debit an amount from a player (subtracts from their balance). */\n debit(uuid: string, amount: number): Promise<void> {\n return this.http.request(\"POST\", \"economy/debit\", { body: { uuid, amount }, form: true });\n }\n\n // ─── ExcellentEconomy multi-currency (native API, not Vault) ────────────\n //\n // These endpoints talk directly to ExcellentEconomy's Developer API rather\n // than Vault, so they work with any currency configured on the server\n // (coins, gems, tokens, ...) instead of only the single Vault-linked\n // \"primary\" currency exposed above. They throw `NoxAeApiError` with a 424\n // status if ExcellentEconomy isn't installed on the target server, and a\n // 404 if the given currency ID doesn't exist.\n\n /** List all currency IDs configured on ExcellentEconomy. */\n listCurrencies(): Promise<string[]> {\n return this.http.request(\"GET\", \"economy/currencies\");\n }\n\n /** Get a player's balance for a specific ExcellentEconomy currency. */\n getCurrencyBalance(currency: string, uuid: string): Promise<CurrencyBalance> {\n return this.http.request(\n \"GET\",\n `economy/currency/${encodeURIComponent(currency)}/balance/${encodeURIComponent(uuid)}`,\n );\n }\n\n /**\n * Pay a player in a specific currency (adds `amount` to their balance).\n * `amount` must be greater than zero.\n */\n payCurrency(currency: string, uuid: string, amount: number): Promise<\"success\" | \"failure\"> {\n return this.http.request(\"POST\", `economy/currency/${encodeURIComponent(currency)}/pay`, {\n body: { uuid, amount },\n form: true,\n });\n }\n\n /**\n * Debit a player in a specific currency (subtracts `amount` from their\n * balance). `amount` must be greater than zero.\n */\n debitCurrency(currency: string, uuid: string, amount: number): Promise<\"success\" | \"failure\"> {\n return this.http.request(\"POST\", `economy/currency/${encodeURIComponent(currency)}/debit`, {\n body: { uuid, amount },\n form: true,\n });\n }\n\n /**\n * Set a player's balance for a specific currency to an exact amount\n * (`amount` must be >= 0), rather than adding/subtracting.\n */\n setCurrencyBalance(\n currency: string,\n uuid: string,\n amount: number,\n ): Promise<\"success\" | \"failure\"> {\n return this.http.request(\"POST\", `economy/currency/${encodeURIComponent(currency)}/set`, {\n body: { uuid, amount },\n form: true,\n });\n }\n\n /** Get the top balances leaderboard for a specific currency. */\n getCurrencyTop(currency: string, limit?: number): Promise<CurrencyTopEntry[]> {\n return this.http.request(\"GET\", `economy/currency/${encodeURIComponent(currency)}/top`, {\n query: { limit },\n });\n }\n}\n","import type { HttpEngine } from \"../http-engine.js\";\nimport type { ServerInfo, WhitelistEntry } from \"../types/models.js\";\n\nexport class ServerModule {\n constructor(private readonly http: HttpEngine) {}\n\n /** Basic liveness check. */\n ping(): Promise<{ status: string }> {\n return this.http.request(\"GET\", \"ping\");\n }\n\n /** Get server info: version, MOTD, TPS, health, player counts, etc. */\n info(): Promise<ServerInfo> {\n return this.http.request(\"GET\", \"server\");\n }\n\n /**\n * Run a console command on the server, returning its console output.\n * This is a privileged endpoint — requires a write-enabled API key.\n *\n * `waitMs` is how long to wait for output before returning (server\n * default 500ms if omitted). The server returns the joined output as a\n * plain JSON string, not `{ lines }`.\n */\n exec(command: string, waitMs?: number): Promise<string> {\n return this.http.request(\"POST\", \"server/exec\", {\n body: { command, time: waitMs },\n form: true,\n });\n }\n\n /** List server operators. */\n getOps(): Promise<WhitelistEntry[]> {\n return this.http.request(\"GET\", \"server/ops\");\n }\n\n /**\n * Grant operator status to a player.\n *\n * Server-side (`ServerApi.opPlayer`) reads `ctx.formParam(\"playerUuid\")`,\n * not \"uuid\" — the field name matters here.\n */\n opPlayer(uuid: string): Promise<void> {\n return this.http.request(\"POST\", \"server/ops\", { body: { playerUuid: uuid }, form: true });\n }\n\n /**\n * Revoke operator status from a player.\n *\n * Server-side (`ServerApi.deopPlayer`) reads this from the query string\n * (`ctx.queryParam(\"playerUuid\")`), not the request body.\n */\n deopPlayer(uuid: string): Promise<void> {\n return this.http.request(\"DELETE\", \"server/ops\", { query: { playerUuid: uuid } });\n }\n\n /** Get the current whitelist. */\n getWhitelist(): Promise<WhitelistEntry[]> {\n return this.http.request(\"GET\", \"server/whitelist\");\n }\n\n /** Add a player to the whitelist. */\n addToWhitelist(uuid: string, name?: string): Promise<void> {\n return this.http.request(\"POST\", \"server/whitelist\", { body: { uuid, name }, form: true });\n }\n\n /**\n * Remove a player from the whitelist.\n *\n * Server-side (`ServerApi.whitelistDelete`) reads `uuid`/`name` from the\n * query string, not the request body.\n */\n removeFromWhitelist(uuid: string): Promise<void> {\n return this.http.request(\"DELETE\", \"server/whitelist\", { query: { uuid } });\n }\n\n /**\n * Restart the server.\n * This is a privileged endpoint — requires a write-enabled API key.\n */\n restart(): Promise<void> {\n return this.http.request(\"POST\", \"server/restart\");\n }\n\n /** Tail the server console log. */\n getLogs(lines?: number): Promise<{ lines: string[] }> {\n return this.http.request(\"GET\", \"server/logs\", { query: { lines } });\n }\n\n /** Get entity counts on the server, optionally scoped to a world. */\n getEntities(world?: string): Promise<{ world: string; count: number; entities: Record<string, number> }> {\n return this.http.request(\"GET\", \"server/entities\", { query: { world } });\n }\n\n /** Get loaded chunk counts, optionally scoped to a world. */\n getChunks(world?: string): Promise<{ world: string; loadedChunks: number }> {\n return this.http.request(\"GET\", \"server/chunks\", { query: { world } });\n }\n\n /** Ban an IP address. */\n banIp(ip: string, reason?: string): Promise<void> {\n return this.http.request(\"POST\", \"server/ban-ip\", { body: { ip, reason }, form: true });\n }\n\n /** Get a scoreboard objective's scores by objective name. */\n getObjective(name: string) {\n return this.http.request(\"GET\", `scoreboard/${encodeURIComponent(name)}`);\n }\n\n /** List all scoreboard objectives and tracked entries. */\n getScoreboard() {\n return this.http.request(\"GET\", \"scoreboard\");\n }\n\n /** Set a score for an entry on an objective. */\n setScore(objective: string, entry: string, value: number): Promise<void> {\n return this.http.request(\"POST\", `scoreboard/${encodeURIComponent(objective)}/score`, {\n body: { entry, value },\n form: true,\n });\n }\n\n /**\n * Reset (remove) a score for an entry on an objective.\n *\n * Server-side (`ServerApi.resetScore`) reads `entry` from the query\n * string, not the request body.\n */\n resetScore(objective: string, entry: string): Promise<void> {\n return this.http.request(\"DELETE\", `scoreboard/${encodeURIComponent(objective)}/score`, {\n query: { entry },\n });\n }\n\n /** Broadcast a message to every player on the server. */\n broadcast(message: string): Promise<void> {\n return this.http.request(\"POST\", \"chat/broadcast\", { body: { message }, form: true });\n }\n\n /**\n * Send a private message to a specific player.\n *\n * Server-side (`ServerApi.tellPost`) reads `ctx.formParam(\"playerUuid\")`,\n * not \"uuid\".\n */\n tell(uuid: string, message: string): Promise<void> {\n return this.http.request(\"POST\", \"chat/tell\", { body: { playerUuid: uuid, message }, form: true });\n }\n}\n","import type { HttpEngine } from \"../http-engine.js\";\nimport type { World } from \"../types/models.js\";\n\nexport class WorldsModule {\n constructor(private readonly http: HttpEngine) {}\n\n /** List all worlds. */\n list(): Promise<World[]> {\n return this.http.request(\"GET\", \"worlds\");\n }\n\n /** Save all worlds to disk. */\n saveAll(): Promise<void> {\n return this.http.request(\"POST\", \"worlds/save\");\n }\n\n /** Get a download link/stream reference for all worlds. */\n downloadAll(): Promise<{ url: string }> {\n return this.http.request(\"GET\", \"worlds/download\");\n }\n\n /** Get a single world by UUID. */\n get(uuid: string): Promise<World> {\n return this.http.request(\"GET\", `worlds/${encodeURIComponent(uuid)}`);\n }\n\n /** Save a specific world to disk. */\n save(uuid: string): Promise<void> {\n return this.http.request(\"POST\", `worlds/${encodeURIComponent(uuid)}/save`);\n }\n\n /** Get a download link/stream reference for a specific world. */\n download(uuid: string): Promise<{ url: string }> {\n return this.http.request(\"GET\", `worlds/${encodeURIComponent(uuid)}/download`);\n }\n\n /** Set the in-game time for a world (0-24000). */\n setTime(uuid: string, time: number): Promise<void> {\n return this.http.request(\"POST\", `worlds/${encodeURIComponent(uuid)}/time`, {\n body: { time },\n form: true,\n });\n }\n\n /**\n * Set the weather for a world.\n *\n * Server-side (`WorldApi.setWorldWeather`) reads a single\n * `ctx.formParam(\"weather\")` enum string — \"clear\" | \"rain\" | \"thunder\" —\n * not separate storm/thundering booleans.\n */\n setWeather(uuid: string, weather: \"clear\" | \"rain\" | \"thunder\"): Promise<void> {\n return this.http.request(\"POST\", `worlds/${encodeURIComponent(uuid)}/weather`, {\n body: { weather },\n form: true,\n });\n }\n\n /** Get entity counts within a specific world. */\n getEntities(uuid: string): Promise<{ world: string; count: number; entities: Record<string, number> }> {\n return this.http.request(\"GET\", `worlds/${encodeURIComponent(uuid)}/entities`);\n }\n}\n","import type { HttpEngine } from \"../http-engine.js\";\nimport type { Plugin } from \"../types/models.js\";\n\nexport class PluginsModule {\n constructor(private readonly http: HttpEngine) {}\n\n /** List all installed plugins/mods. */\n list(): Promise<Plugin[]> {\n return this.http.request(\"GET\", \"plugins\");\n }\n\n /**\n * Install a plugin by downloading it from a direct URL.\n * This is a privileged endpoint — requires a write-enabled API key.\n *\n * Server-side (`PluginApi.installPlugin`) reads\n * `ctx.formParam(\"downloadUrl\")`, not \"source\", and the request must be\n * form-urlencoded.\n */\n install(downloadUrl: string): Promise<void> {\n return this.http.request(\"POST\", \"plugins\", { body: { downloadUrl }, form: true });\n }\n\n /** Enable a plugin by name. */\n enable(name: string): Promise<void> {\n return this.http.request(\"POST\", `plugins/${encodeURIComponent(name)}/enable`);\n }\n\n /** Disable a plugin by name. */\n disable(name: string): Promise<void> {\n return this.http.request(\"POST\", `plugins/${encodeURIComponent(name)}/disable`);\n }\n}\n","import type { HttpEngine } from \"../http-engine.js\";\nimport type { Advancement } from \"../types/models.js\";\n\nexport class AdvancementsModule {\n constructor(private readonly http: HttpEngine) {}\n\n /** List all advancements known to the server. */\n list(): Promise<Advancement[]> {\n return this.http.request(\"GET\", \"advancements\");\n }\n}\n\nexport class PlaceholdersModule {\n constructor(private readonly http: HttpEngine) {}\n\n /**\n * Replace PlaceholderAPI-style placeholders (e.g. \"%player_name%\") in\n * `message` for a player, returning the resolved string.\n *\n * Server-side this is `PAPIApi.replacePlaceholders`, which reads\n * `ctx.formParam(\"message\")` and `ctx.formParam(\"uuid\")` — the field is\n * literally named \"message\", not \"text\", and the whole body must be\n * form-urlencoded.\n */\n replace(uuid: string, message: string): Promise<string> {\n return this.http.request(\"POST\", \"placeholders/replace\", {\n body: { uuid, message },\n form: true,\n });\n }\n}\n","import type { HttpEngine } from \"../http-engine.js\";\nimport type { GroupInfo, PermissionNode } from \"../types/models.js\";\n\n/**\n * Wraps the `/v1/luckperms/*` routes. These only exist on the server when\n * the LuckPerms mod is loaded — calling any method here against a server\n * without it will fail (typically a 404). There's no separate \"is this\n * available\" flag from the SDK's side; check `client.plugins.list()` for\n * LuckPerms if you need to branch on it ahead of time.\n *\n * Unlike most other modules, these POST/DELETE bodies are sent as real\n * JSON (the server reads them with `ctx.bodyAsClass(...)`, not\n * `ctx.formParam(...)`) — do not add `form: true` to these calls.\n */\nexport class LuckPermsModule {\n constructor(private readonly http: HttpEngine) {}\n\n /** Get the groups a player belongs to. */\n getPlayerGroups(uuid: string): Promise<string[]> {\n return this.http.request(\"GET\", `luckperms/player/${encodeURIComponent(uuid)}/groups`);\n }\n\n /** Get a player's effective permission nodes. */\n getPlayerPermissions(uuid: string): Promise<PermissionNode[]> {\n return this.http.request(\n \"GET\",\n `luckperms/player/${encodeURIComponent(uuid)}/permissions`,\n );\n }\n\n /** Add a permission node to a player. */\n addPlayerPermission(uuid: string, permission: string, value = true): Promise<void> {\n return this.http.request(\n \"POST\",\n `luckperms/player/${encodeURIComponent(uuid)}/permission`,\n { body: { permission, value } },\n );\n }\n\n /** Check whether a player has a given permission. */\n checkPlayerPermission(\n uuid: string,\n permission: string,\n ): Promise<{ permission: string; value: boolean }> {\n return this.http.request(\n \"POST\",\n `luckperms/player/${encodeURIComponent(uuid)}/check-permission`,\n { body: { permission } },\n );\n }\n\n /** Remove a permission node from a player. */\n removePlayerPermission(uuid: string, permission: string): Promise<void> {\n return this.http.request(\n \"DELETE\",\n `luckperms/player/${encodeURIComponent(uuid)}/permission`,\n { body: { permission } },\n );\n }\n\n /** Set a player's primary group. */\n setPlayerGroup(uuid: string, group: string): Promise<void> {\n return this.http.request(\n \"POST\",\n `luckperms/player/${encodeURIComponent(uuid)}/group`,\n { body: { group } },\n );\n }\n\n /** Remove a group from a player. */\n removePlayerGroup(uuid: string, groupName: string): Promise<void> {\n return this.http.request(\n \"DELETE\",\n `luckperms/player/${encodeURIComponent(uuid)}/group/${encodeURIComponent(groupName)}`,\n );\n }\n\n /** List all known groups. */\n getGroups(): Promise<string[]> {\n return this.http.request(\"GET\", \"luckperms/groups\");\n }\n\n /**\n * Create a new LuckPerms group. The name is lowercased server-side.\n * Throws `NoxAeApiError` with a 409 status if the group already exists.\n */\n createGroup(name: string): Promise<{ name: string; status: string }> {\n return this.http.request(\"POST\", \"luckperms/groups\", { body: { name } });\n }\n\n /**\n * Delete a LuckPerms group by name.\n * The `default` group can't be deleted (400 — every user without an\n * explicit group inherits from it) and a 404 is thrown if it doesn't exist.\n */\n deleteGroup(name: string): Promise<void> {\n return this.http.request(\"DELETE\", `luckperms/group/${encodeURIComponent(name)}`);\n }\n\n /** Get the permissions attached to a specific group. */\n getGroupPermissions(name: string): Promise<GroupInfo> {\n return this.http.request(\"GET\", `luckperms/group/${encodeURIComponent(name)}/permissions`);\n }\n}\n","import type { HttpEngine } from \"../http-engine.js\";\nimport type { NoxAuthPlayerInfo, PasswordCheckResult } from \"../types/models.js\";\n\n/**\n * Wraps the `/v1/noxauth/*` routes. These only work when `noxauth.enabled`\n * is set to true in the server's noxaeapi-config.yml and the NoxAuth plugin\n * is installed.\n *\n * `checkPassword`'s body is sent as real JSON (the server parses it with\n * `GsonSingleton...fromJson(ctx.body(), PasswordCheckRequest.class)`, not\n * `ctx.formParam(...)`) — do not add `form: true` to that call.\n */\nexport class NoxAuthModule {\n constructor(private readonly http: HttpEngine) {}\n\n /** Get NoxAuth registration/auth info for a player by name. */\n getPlayerAuth(name: string): Promise<NoxAuthPlayerInfo> {\n return this.http.request(\"GET\", `noxauth/player/${encodeURIComponent(name)}`);\n }\n\n /** Check whether a password matches a player's stored NoxAuth password. */\n checkPassword(name: string, password: string): Promise<PasswordCheckResult> {\n return this.http.request(\n \"POST\",\n `noxauth/player/${encodeURIComponent(name)}/check-password`,\n { body: { password } },\n );\n }\n}\n","import type { HttpEngine } from \"../http-engine.js\";\nimport type { SkillInfo } from \"../types/models.js\";\n\n/**\n * Wraps the `/v1/skills/*` routes (mcMMO / AuraSkills).\n */\nexport class SkillsModule {\n constructor(private readonly http: HttpEngine) {}\n\n /**\n * Get mcMMO skill levels and power level for a player.\n * Only works for **online** players — mcMMO's public ExperienceAPI has\n * no offline lookup, so this throws `NoxAeApiNotFoundError` if the\n * player isn't currently connected, and `NoxAeApiServerError` (503)\n * if mcMMO isn't loaded on the target server.\n */\n getMcmmoSkills(uuid: string): Promise<SkillInfo> {\n return this.http.request(\"GET\", `skills/mcmmo/player/${encodeURIComponent(uuid)}`);\n }\n\n /**\n * Get AuraSkills skill levels and power level for a player.\n * Works for offline players. Throws `NoxAeApiServerError` (503) if\n * AuraSkills isn't loaded on the target server.\n */\n getAuraSkills(uuid: string): Promise<SkillInfo> {\n return this.http.request(\"GET\", `skills/auraskills/player/${encodeURIComponent(uuid)}`);\n }\n}\n","import type { HttpEngine } from \"../http-engine.js\";\nimport type { LeaderboardEntry, LeaderboardSourceInfo } from \"../types/models.js\";\n\n/**\n * Wraps the generic, pluggable `/v1/leaderboards/*` routes. This is a\n * unified view over every ranking source registered on the server —\n * economy currencies, mcMMO power level, AuraSkills power level, etc —\n * so you don't need to know ahead of time which plugins are installed.\n *\n * Use `list()` to discover available source IDs, then pass one to\n * `getTop(id)`. Sources that are registered but currently unavailable\n * (e.g. the backing plugin isn't loaded) throw `NoxAeApiError` with the\n * source's own unavailable status (424 for economy currencies, 503 for\n * mcMMO/AuraSkills) when you call `getTop`.\n */\nexport class LeaderboardModule {\n constructor(private readonly http: HttpEngine) {}\n\n /** List every registered leaderboard source and its availability. */\n list(): Promise<LeaderboardSourceInfo[]> {\n return this.http.request(\"GET\", \"leaderboards\");\n }\n\n /** Get ranked entries for one leaderboard source (see `list()` for valid IDs). */\n getTop(id: string, limit?: number): Promise<LeaderboardEntry[]> {\n return this.http.request(\"GET\", `leaderboards/${encodeURIComponent(id)}/top`, {\n query: { limit },\n });\n }\n}\n","import type { HttpEngine, QueryValue } from \"../http-engine.js\";\nimport type {\n NetworkFindPlayerResponse,\n NetworkHealthResponse,\n NetworkPlayersResponse,\n NetworkServerStatus,\n} from \"../types/models.js\";\n\n/**\n * Wraps the `/v1/network/*` routes. These only exist when `network.enabled:\n * true` is set in the server's config with at least one backend server\n * configured — calling any method here against a server without the\n * network aggregator enabled will 404.\n *\n * The aggregator fans requests out to every configured backend server\n * (each with its own base URL + key) and merges the results, so a single\n * call here can reflect the state of an entire network rather than just\n * the server you connected to.\n */\nexport class NetworkModule {\n constructor(private readonly http: HttpEngine) {}\n\n /** Get status (server info + online players) for every configured network server. */\n statusAll(): Promise<{ network: NetworkServerStatus[] }> {\n return this.http.request(\"GET\", \"network/status\");\n }\n\n /** Get status for a single network server by its configured ID. */\n statusById(id: string): Promise<NetworkServerStatus> {\n return this.http.request(\"GET\", `network/status/${encodeURIComponent(id)}`);\n }\n\n /** Aggregate online players across every network server. */\n players(): Promise<NetworkPlayersResponse> {\n return this.http.request(\"GET\", \"network/players\");\n }\n\n /** Find which network server a player is currently on by UUID. */\n findPlayer(uuid: string): Promise<NetworkFindPlayerResponse> {\n return this.http.request(\"GET\", `network/players/${encodeURIComponent(uuid)}`);\n }\n\n /** Get aggregate health (TPS/memory) from every network server. */\n health(): Promise<NetworkHealthResponse> {\n return this.http.request(\"GET\", \"network/health\");\n }\n\n /**\n * Broadcast a message to every server on the network.\n * Returns a map of server ID -> \"success\" | \"error\" (per-server delivery\n * result; a network-wide failure is only thrown for a malformed request).\n */\n broadcast(message: string): Promise<Record<string, \"success\" | \"error\">> {\n return this.http.request(\"POST\", \"network/broadcast\", { body: { message }, form: true });\n }\n\n /**\n * Forward an arbitrary request to a specific network server's own REST\n * API, e.g. `network.forward(\"survival\", \"POST\", \"server/exec\", { body:\n * { command: \"say hi\" }, form: true })` reaches that server's\n * `POST /v1/server/exec` directly. Useful for endpoints the aggregator\n * doesn't have a dedicated method for (economy, worlds, etc) on a\n * specific server without instantiating a second client pointed at it.\n *\n * Note the target server responds according to its own route's expected\n * encoding (form vs JSON) — pass `form: true` the same way you would for\n * a direct call to that endpoint.\n */\n forward<T = unknown>(\n id: string,\n method: \"GET\" | \"POST\" | \"PUT\" | \"DELETE\" | \"PATCH\",\n path: string,\n opts: { body?: unknown; query?: Record<string, QueryValue>; form?: boolean } = {},\n ): Promise<T> {\n return this.http.request(method, `network/${encodeURIComponent(id)}/${path.replace(/^\\/+/, \"\")}`, opts);\n }\n}\n","export type NoxAeApiWsEvent =\n | \"open\"\n | \"close\"\n | \"error\"\n | \"console\"\n | \"event\"\n | \"message\";\n\ntype Listener = (payload: unknown) => void;\n\nexport interface NoxAeApiWsOptions {\n /** Base URL of the server, same one passed to the client (http/https). */\n baseUrl: string;\n apiKey?: string;\n /** Route suffix under the websocket base, e.g. \"console\" or \"events\". Default \"events\". */\n route?: string;\n /** Whether to auto-reconnect on unexpected close. Default true. */\n autoReconnect?: boolean;\n /** Max reconnect delay in ms. Default 30000. */\n maxReconnectDelayMs?: number;\n /** Override the WebSocket implementation, mainly for testing / non-browser runtimes. */\n webSocketImpl?: typeof WebSocket;\n}\n\nfunction toWsUrl(baseUrl: string, route: string, apiKey?: string): string {\n const url = new URL(`${baseUrl.replace(/\\/+$/, \"\")}/v1/ws/${route.replace(/^\\/+/, \"\")}`);\n url.protocol = url.protocol === \"https:\" ? \"wss:\" : \"ws:\";\n if (apiKey) url.searchParams.set(\"key\", apiKey);\n return url.toString();\n}\n\n/**\n * Thin wrapper around the server's WebSocket endpoints (console tail and\n * event broadcasts). Handles reconnection with exponential backoff so\n * consumers can just attach listeners and not think about the socket\n * lifecycle.\n *\n * Usage:\n * ```ts\n * const ws = client.connect({ route: \"console\" });\n * ws.on(\"console\", (line) => console.log(line));\n * ws.on(\"close\", () => console.log(\"disconnected\"));\n * ```\n */\nexport class NoxAeApiSocket {\n private socket: WebSocket | null = null;\n private readonly listeners = new Map<NoxAeApiWsEvent, Set<Listener>>();\n private reconnectAttempt = 0;\n private closedByUser = false;\n private readonly wsImpl: typeof WebSocket;\n\n constructor(private readonly options: NoxAeApiWsOptions) {\n const impl = options.webSocketImpl ?? (globalThis as { WebSocket?: typeof WebSocket }).WebSocket;\n if (!impl) {\n throw new Error(\n \"No WebSocket implementation available in this runtime. Pass `webSocketImpl` in options.\",\n );\n }\n this.wsImpl = impl;\n this.open();\n }\n\n private open(): void {\n const url = toWsUrl(this.options.baseUrl, this.options.route ?? \"events\", this.options.apiKey);\n const socket = new this.wsImpl(url);\n\n socket.onopen = () => {\n this.reconnectAttempt = 0;\n this.emit(\"open\", undefined);\n };\n\n socket.onmessage = (event: MessageEvent) => {\n const raw = typeof event.data === \"string\" ? event.data : String(event.data);\n const parsed = safeParse(raw);\n this.emit(\"message\", parsed);\n // Best-effort routing: if the payload has a `type` field of \"console\"\n // or \"event\", also emit on that specific channel.\n if (parsed && typeof parsed === \"object\" && \"type\" in (parsed as Record<string, unknown>)) {\n const type = (parsed as Record<string, unknown>).type;\n if (type === \"console\" || type === \"event\") this.emit(type, parsed);\n }\n };\n\n socket.onerror = (event) => {\n this.emit(\"error\", event);\n };\n\n socket.onclose = () => {\n this.emit(\"close\", undefined);\n if (!this.closedByUser && this.options.autoReconnect !== false) {\n this.scheduleReconnect();\n }\n };\n\n this.socket = socket;\n }\n\n private scheduleReconnect(): void {\n const maxDelay = this.options.maxReconnectDelayMs ?? 30_000;\n const delay = Math.min(maxDelay, 500 * 2 ** this.reconnectAttempt);\n this.reconnectAttempt++;\n setTimeout(() => {\n if (!this.closedByUser) this.open();\n }, delay);\n }\n\n on(event: NoxAeApiWsEvent, listener: Listener): () => void {\n if (!this.listeners.has(event)) this.listeners.set(event, new Set());\n this.listeners.get(event)!.add(listener);\n return () => this.listeners.get(event)?.delete(listener);\n }\n\n off(event: NoxAeApiWsEvent, listener: Listener): void {\n this.listeners.get(event)?.delete(listener);\n }\n\n private emit(event: NoxAeApiWsEvent, payload: unknown): void {\n for (const listener of this.listeners.get(event) ?? []) listener(payload);\n }\n\n /** Send a raw payload over the socket, JSON-stringified if not already a string. */\n send(payload: unknown): void {\n if (!this.socket || this.socket.readyState !== this.wsImpl.OPEN) {\n throw new Error(\"Cannot send: socket is not open\");\n }\n this.socket.send(typeof payload === \"string\" ? payload : JSON.stringify(payload));\n }\n\n /** Close the socket and stop reconnecting. */\n close(): void {\n this.closedByUser = true;\n this.socket?.close();\n }\n}\n\nfunction safeParse(text: string): unknown {\n try {\n return JSON.parse(text);\n } catch {\n return text;\n }\n}\n","import { HttpEngine, type NoxAeApiClientOptions } from \"./http-engine.js\";\nimport { PlayersModule } from \"./modules/players.js\";\nimport { EconomyModule } from \"./modules/economy.js\";\nimport { ServerModule } from \"./modules/server.js\";\nimport { WorldsModule } from \"./modules/worlds.js\";\nimport { PluginsModule } from \"./modules/plugins.js\";\nimport { AdvancementsModule, PlaceholdersModule } from \"./modules/misc.js\";\nimport { LuckPermsModule } from \"./modules/luckperms.js\";\nimport { NoxAuthModule } from \"./modules/noxauth.js\";\nimport { SkillsModule } from \"./modules/skills.js\";\nimport { LeaderboardModule } from \"./modules/leaderboard.js\";\nimport { NetworkModule } from \"./modules/network.js\";\nimport { NoxAeApiSocket, type NoxAeApiWsOptions } from \"./socket.js\";\n\nexport class NoxAeApiClient {\n readonly players: PlayersModule;\n readonly economy: EconomyModule;\n readonly server: ServerModule;\n readonly worlds: WorldsModule;\n readonly plugins: PluginsModule;\n readonly advancements: AdvancementsModule;\n readonly placeholders: PlaceholdersModule;\n /** Only works if LuckPerms is loaded on the target server. */\n readonly luckperms: LuckPermsModule;\n /** Only works if `noxauth.enabled: true` is set in the server config. */\n readonly noxauth: NoxAuthModule;\n /** Requires mcMMO and/or AuraSkills to be loaded on the target server. */\n readonly skills: SkillsModule;\n /** Generic ranked leaderboards (economy currencies, mcMMO, AuraSkills, ...). */\n readonly leaderboards: LeaderboardModule;\n /** Only works if `network.enabled: true` is set in the server config. */\n readonly network: NetworkModule;\n\n private readonly http: HttpEngine;\n private readonly baseUrl: string;\n private readonly apiKey?: string;\n\n constructor(options: NoxAeApiClientOptions) {\n this.http = new HttpEngine(options);\n this.baseUrl = options.baseUrl;\n this.apiKey = options.apiKey;\n\n this.players = new PlayersModule(this.http);\n this.economy = new EconomyModule(this.http);\n this.server = new ServerModule(this.http);\n this.worlds = new WorldsModule(this.http);\n this.plugins = new PluginsModule(this.http);\n this.advancements = new AdvancementsModule(this.http);\n this.placeholders = new PlaceholdersModule(this.http);\n this.luckperms = new LuckPermsModule(this.http);\n this.noxauth = new NoxAuthModule(this.http);\n this.skills = new SkillsModule(this.http);\n this.leaderboards = new LeaderboardModule(this.http);\n this.network = new NetworkModule(this.http);\n }\n\n /**\n * Build a client from environment variables:\n * `NOXAEAPI_BASE_URL` and `NOXAEAPI_KEY`.\n *\n * This is a convenience for Node-like runtimes; the SDK itself never\n * reads `process.env` implicitly outside of this method, and does not\n * load `.env` files — use a library like `dotenv` in your own app if\n * you want that, then call `NoxAeApiClient.fromEnv()` after it's loaded.\n */\n static fromEnv(overrides: Partial<NoxAeApiClientOptions> = {}): NoxAeApiClient {\n const env = (globalThis as { process?: { env?: Record<string, string | undefined> } })\n .process?.env;\n const baseUrl = overrides.baseUrl ?? env?.NOXAEAPI_BASE_URL;\n const apiKey = overrides.apiKey ?? env?.NOXAEAPI_KEY;\n\n if (!baseUrl) {\n throw new Error(\n \"NoxAeApiClient.fromEnv(): NOXAEAPI_BASE_URL is not set and no baseUrl override was given.\",\n );\n }\n\n return new NoxAeApiClient({ ...overrides, baseUrl, apiKey });\n }\n\n /** Open a WebSocket connection to the server (console tail or event stream). */\n connect(options: Partial<NoxAeApiWsOptions> = {}): NoxAeApiSocket {\n return new NoxAeApiSocket({\n baseUrl: this.baseUrl,\n apiKey: this.apiKey,\n ...options,\n });\n }\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/errors.ts","../src/http-engine.ts","../src/modules/players.ts","../src/modules/economy.ts","../src/modules/server.ts","../src/modules/worlds.ts","../src/modules/plugins.ts","../src/modules/misc.ts","../src/modules/luckperms.ts","../src/modules/noxauth.ts","../src/modules/skills.ts","../src/modules/leaderboard.ts","../src/modules/network.ts","../src/modules/network-hub.ts","../src/socket.ts","../src/client.ts"],"names":[],"mappings":"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","file":"index.cjs","sourcesContent":["export interface NoxAeApiErrorInfo {\n status: number;\n method: string;\n path: string;\n body?: unknown;\n}\n\n/**\n * Base error thrown for any non-2xx response from a NoxAeApi server.\n * Prefer catching the more specific subclasses below when you need to\n * branch on the failure reason.\n */\nexport class NoxAeApiError extends Error {\n readonly status: number;\n readonly method: string;\n readonly path: string;\n readonly body?: unknown;\n\n constructor(message: string, info: NoxAeApiErrorInfo) {\n super(message);\n this.name = \"NoxAeApiError\";\n this.status = info.status;\n this.method = info.method;\n this.path = info.path;\n this.body = info.body;\n }\n}\n\n/** 401 — the API key is missing or not recognized by the server. */\nexport class NoxAeApiUnauthorizedError extends NoxAeApiError {\n constructor(info: NoxAeApiErrorInfo) {\n super(\n `Unauthorized: the API key was missing or invalid for ${info.method} ${info.path}`,\n info,\n );\n this.name = \"NoxAeApiUnauthorizedError\";\n }\n}\n\n/**\n * 403 — the API key is valid but isn't allowed to call this endpoint\n * (read-only key hitting a write route, or an endpoint restriction set\n * on the key). This is a server-side permission decision; the SDK does\n * not attempt to predict or enforce it client-side.\n */\nexport class NoxAeApiForbiddenError extends NoxAeApiError {\n constructor(info: NoxAeApiErrorInfo) {\n super(\n `Forbidden: this API key does not have permission to call ${info.method} ${info.path}`,\n info,\n );\n this.name = \"NoxAeApiForbiddenError\";\n }\n}\n\n/** 404 — the target resource (player, world, plugin, etc.) wasn't found. */\nexport class NoxAeApiNotFoundError extends NoxAeApiError {\n constructor(info: NoxAeApiErrorInfo) {\n super(`Not found: ${info.method} ${info.path}`, info);\n this.name = \"NoxAeApiNotFoundError\";\n }\n}\n\n/** 429 — rate limited. `retryAfterMs` is populated when the server sends a Retry-After header. */\nexport class NoxAeApiRateLimitError extends NoxAeApiError {\n readonly retryAfterMs?: number;\n\n constructor(info: NoxAeApiErrorInfo, retryAfterMs?: number) {\n super(\n `Rate limited on ${info.method} ${info.path}${retryAfterMs ? ` — retry after ${retryAfterMs}ms` : \"\"}`,\n info,\n );\n this.name = \"NoxAeApiRateLimitError\";\n this.retryAfterMs = retryAfterMs;\n }\n}\n\n/** 5xx — the server errored out. Usually safe to retry. */\nexport class NoxAeApiServerError extends NoxAeApiError {\n constructor(info: NoxAeApiErrorInfo) {\n super(`Server error (${info.status}) on ${info.method} ${info.path}`, info);\n this.name = \"NoxAeApiServerError\";\n }\n}\n\n/** The request could not complete at all (DNS, connection refused, timeout, abort). */\nexport class NoxAeApiNetworkError extends Error {\n readonly method: string;\n readonly path: string;\n readonly cause?: unknown;\n\n constructor(message: string, method: string, path: string, cause?: unknown) {\n super(message);\n this.name = \"NoxAeApiNetworkError\";\n this.method = method;\n this.path = path;\n this.cause = cause;\n }\n}\n","import {\n NoxAeApiError,\n NoxAeApiForbiddenError,\n NoxAeApiNetworkError,\n NoxAeApiNotFoundError,\n NoxAeApiRateLimitError,\n NoxAeApiServerError,\n NoxAeApiUnauthorizedError,\n} from \"./errors.js\";\n\nexport interface RetryOptions {\n /** Max number of attempts including the first one. Default 3. */\n attempts?: number;\n /** Base delay in ms used for exponential backoff. Default 300. */\n baseDelayMs?: number;\n /** Upper bound for any single backoff delay. Default 5000. */\n maxDelayMs?: number;\n}\n\nexport interface NoxAeApiClientOptions {\n /** Base URL of the server, e.g. \"http://localhost:8080\" or \"https://mc.example.com\". */\n baseUrl: string;\n /** The API key configured on the server (sent as the `key` header). */\n apiKey?: string;\n /** Request timeout in ms. Default 10000. */\n timeoutMs?: number;\n /** Retry behavior for network errors, 429s, and 5xx responses. */\n retry?: RetryOptions | false;\n /** Extra headers sent on every request. */\n headers?: Record<string, string>;\n /** Override fetch, mainly for testing. Defaults to the global fetch. */\n fetchImpl?: typeof fetch;\n}\n\nconst DEFAULT_RETRY: Required<RetryOptions> = {\n attempts: 3,\n baseDelayMs: 300,\n maxDelayMs: 5000,\n};\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nfunction backoffDelay(attempt: number, opts: Required<RetryOptions>): number {\n const exp = Math.min(opts.maxDelayMs, opts.baseDelayMs * 2 ** attempt);\n // full jitter\n return Math.floor(Math.random() * exp);\n}\n\nexport type QueryValue = string | number | boolean | null | undefined;\n\nexport class HttpEngine {\n private readonly baseUrl: string;\n private readonly apiKey?: string;\n private readonly timeoutMs: number;\n private readonly retry: Required<RetryOptions> | false;\n private readonly extraHeaders: Record<string, string>;\n private readonly fetchImpl: typeof fetch;\n\n constructor(options: NoxAeApiClientOptions) {\n if (!options.baseUrl) {\n throw new Error(\"NoxAeApiClient requires a non-empty baseUrl\");\n }\n this.baseUrl = options.baseUrl.replace(/\\/+$/, \"\");\n this.apiKey = options.apiKey;\n this.timeoutMs = options.timeoutMs ?? 10_000;\n this.retry =\n options.retry === false\n ? false\n : { ...DEFAULT_RETRY, ...(options.retry ?? {}) };\n this.extraHeaders = options.headers ?? {};\n const fetchImpl = options.fetchImpl ?? globalThis.fetch;\n if (!fetchImpl) {\n throw new Error(\n \"No fetch implementation available. Pass `fetchImpl` in options for this runtime.\",\n );\n }\n this.fetchImpl = fetchImpl;\n }\n\n private buildUrl(path: string, query?: Record<string, QueryValue>): string {\n const url = new URL(`${this.baseUrl}/v1/${path.replace(/^\\/+/, \"\")}`);\n if (query) {\n for (const [key, value] of Object.entries(query)) {\n if (value !== undefined && value !== null) {\n url.searchParams.set(key, String(value));\n }\n }\n }\n return url.toString();\n }\n\n async request<T>(\n method: \"GET\" | \"POST\" | \"PUT\" | \"DELETE\" | \"PATCH\",\n path: string,\n opts: {\n body?: unknown;\n query?: Record<string, QueryValue>;\n /**\n * Encode `body` as `application/x-www-form-urlencoded` (Javalin's\n * `ctx.formParam(...)`) instead of JSON. Most NoxAeApi endpoints\n * expect form-urlencoded bodies — only the LuckPerms and NoxAuth\n * routes use `ctx.bodyAsClass(...)` and need real JSON. Defaults to\n * `false` (JSON) to preserve existing behavior; each module call\n * site is responsible for passing `form: true` where the server\n * actually expects it.\n */\n form?: boolean;\n } = {},\n ): Promise<T> {\n const url = this.buildUrl(path, opts.query);\n const maxAttempts = this.retry ? this.retry.attempts : 1;\n\n let lastError: unknown;\n\n for (let attempt = 0; attempt < maxAttempts; attempt++) {\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), this.timeoutMs);\n\n try {\n const headers: Record<string, string> = {\n Accept: \"application/json\",\n ...this.extraHeaders,\n };\n if (this.apiKey) headers[\"key\"] = this.apiKey;\n\n let encodedBody: string | undefined;\n if (opts.body !== undefined) {\n if (opts.form) {\n headers[\"Content-Type\"] = \"application/x-www-form-urlencoded\";\n encodedBody = encodeFormBody(opts.body);\n } else {\n headers[\"Content-Type\"] = \"application/json\";\n encodedBody = JSON.stringify(opts.body);\n }\n }\n\n const response = await this.fetchImpl(url, {\n method,\n headers,\n body: encodedBody,\n signal: controller.signal,\n });\n\n clearTimeout(timeout);\n\n if (response.ok) {\n if (response.status === 204) return undefined as T;\n const text = await response.text();\n return (text ? JSON.parse(text) : undefined) as T;\n }\n\n const errorBody = await response.text().catch(() => undefined);\n const parsedBody = safeJsonParse(errorBody);\n const info = { status: response.status, method, path, body: parsedBody };\n\n if (response.status === 401) throw new NoxAeApiUnauthorizedError(info);\n if (response.status === 403) throw new NoxAeApiForbiddenError(info);\n if (response.status === 404) throw new NoxAeApiNotFoundError(info);\n\n if (response.status === 429) {\n const retryAfterHeader = response.headers.get(\"Retry-After\");\n const retryAfterMs = retryAfterHeader\n ? parseRetryAfter(retryAfterHeader)\n : undefined;\n const err = new NoxAeApiRateLimitError(info, retryAfterMs);\n if (this.retry && attempt < maxAttempts - 1) {\n lastError = err;\n await sleep(retryAfterMs ?? backoffDelay(attempt, this.retry));\n continue;\n }\n throw err;\n }\n\n if (response.status >= 500) {\n const err = new NoxAeApiServerError(info);\n if (this.retry && attempt < maxAttempts - 1) {\n lastError = err;\n await sleep(backoffDelay(attempt, this.retry));\n continue;\n }\n throw err;\n }\n\n throw new NoxAeApiError(\n `Unexpected status ${response.status} on ${method} ${path}`,\n info,\n );\n } catch (err) {\n clearTimeout(timeout);\n\n if (err instanceof NoxAeApiError) throw err;\n\n const isAbort = err instanceof Error && err.name === \"AbortError\";\n const networkErr = new NoxAeApiNetworkError(\n isAbort\n ? `Request timed out after ${this.timeoutMs}ms: ${method} ${path}`\n : `Network error on ${method} ${path}: ${(err as Error).message}`,\n method,\n path,\n err,\n );\n\n if (this.retry && attempt < maxAttempts - 1) {\n lastError = networkErr;\n await sleep(backoffDelay(attempt, this.retry));\n continue;\n }\n throw networkErr;\n }\n }\n\n // Unreachable in practice, but keeps TS happy and surfaces the last error if we exit the loop.\n throw lastError instanceof Error\n ? lastError\n : new Error(\"Request failed after retries\");\n }\n}\n\n/**\n * Encodes a plain object as `application/x-www-form-urlencoded`, matching\n * what Javalin's `ctx.formParam(name)` reads server-side. `undefined`/`null`\n * values are omitted (so optional fields can be left out entirely rather\n * than sent as the literal string \"undefined\"). Non-primitive values are\n * JSON.stringify'd as a fallback, though no current endpoint needs that.\n */\nfunction encodeFormBody(body: unknown): string {\n const params = new URLSearchParams();\n if (body && typeof body === \"object\") {\n for (const [key, value] of Object.entries(body as Record<string, unknown>)) {\n if (value === undefined || value === null) continue;\n params.set(\n key,\n typeof value === \"string\" || typeof value === \"number\" || typeof value === \"boolean\"\n ? String(value)\n : JSON.stringify(value),\n );\n }\n }\n return params.toString();\n}\n\nfunction safeJsonParse(text: string | undefined): unknown {\n if (!text) return undefined;\n try {\n return JSON.parse(text);\n } catch {\n return text;\n }\n}\n\nfunction parseRetryAfter(headerValue: string): number | undefined {\n const seconds = Number(headerValue);\n if (!Number.isNaN(seconds)) return seconds * 1000;\n const date = Date.parse(headerValue);\n if (!Number.isNaN(date)) return Math.max(0, date - Date.now());\n return undefined;\n}\n","import type { HttpEngine } from \"../http-engine.js\";\nimport type {\n InventoryItem,\n OfflinePlayer,\n OnlinePlayer,\n PlayerStats,\n} from \"../types/models.js\";\n\nexport class PlayersModule {\n constructor(private readonly http: HttpEngine) {}\n\n /** List currently online players. */\n list(): Promise<OnlinePlayer[]> {\n return this.http.request(\"GET\", \"players\");\n }\n\n /** List all players the server has ever seen (online + offline). */\n listAll(): Promise<OfflinePlayer[]> {\n return this.http.request(\"GET\", \"players/all\");\n }\n\n /** Get a single player by UUID (works for online or offline players). */\n get(uuid: string): Promise<OnlinePlayer | OfflinePlayer> {\n return this.http.request(\"GET\", `players/${encodeURIComponent(uuid)}`);\n }\n\n /** Get a player's inventory in a specific world. */\n getInventory(playerUuid: string, worldUuid: string): Promise<InventoryItem[]> {\n return this.http.request(\n \"GET\",\n `players/${encodeURIComponent(playerUuid)}/${encodeURIComponent(worldUuid)}/inventory`,\n );\n }\n\n /** Kick an online player, optionally with a reason. */\n kick(uuid: string, reason?: string): Promise<void> {\n return this.http.request(\"POST\", `players/${encodeURIComponent(uuid)}/kick`, {\n body: reason ? { reason } : undefined,\n form: true,\n });\n }\n\n /**\n * Ban a player, optionally with a reason and an ISO-8601 expiry\n * (e.g. \"2030-01-01T00:00:00Z\"). Omit `expiry` for a permanent ban.\n */\n ban(uuid: string, reason?: string, expiry?: string): Promise<void> {\n return this.http.request(\"POST\", `players/${encodeURIComponent(uuid)}/ban`, {\n body: reason || expiry ? { reason, expiry } : undefined,\n form: true,\n });\n }\n\n /** Remove a player's ban. */\n unban(uuid: string): Promise<void> {\n return this.http.request(\"DELETE\", `players/${encodeURIComponent(uuid)}/ban`);\n }\n\n /** Teleport a player to a location. */\n teleport(\n uuid: string,\n location: { x: number; y: number; z: number; world?: string },\n ): Promise<void> {\n return this.http.request(\"POST\", `players/${encodeURIComponent(uuid)}/teleport`, {\n body: location,\n form: true,\n });\n }\n\n /** Change a player's gamemode. */\n setGamemode(\n uuid: string,\n gamemode: \"survival\" | \"creative\" | \"adventure\" | \"spectator\",\n ): Promise<void> {\n return this.http.request(\"PUT\", `players/${encodeURIComponent(uuid)}/gamemode`, {\n body: { gamemode },\n form: true,\n });\n }\n\n /** Get kill/death/playtime/block stats for a player. */\n getStats(uuid: string): Promise<PlayerStats> {\n return this.http.request(\"GET\", `players/${encodeURIComponent(uuid)}/stats`);\n }\n}\n","import type { HttpEngine } from \"../http-engine.js\";\nimport type {\n CurrencyBalance,\n CurrencyTopEntry,\n EconomyInfo,\n PlayerBalance,\n TopBalanceEntry,\n} from \"../types/models.js\";\n\nexport class EconomyModule {\n constructor(private readonly http: HttpEngine) {}\n\n /** Get info about the connected economy provider (Impactor on Fabric, Vault on Bukkit/Spigot/Paper). */\n info(): Promise<EconomyInfo> {\n return this.http.request(\"GET\", \"economy\");\n }\n\n /** Get a player's balance. */\n getBalance(uuid: string): Promise<PlayerBalance> {\n return this.http.request(\"GET\", `economy/balance/${encodeURIComponent(uuid)}`);\n }\n\n /** Get the top balances leaderboard. */\n getTopBalance(limit?: number): Promise<TopBalanceEntry[]> {\n return this.http.request(\"GET\", \"economy/top\", {\n query: { limit },\n });\n }\n\n /** Pay an amount to a player (adds to their balance). */\n pay(uuid: string, amount: number): Promise<void> {\n return this.http.request(\"POST\", \"economy/pay\", { body: { uuid, amount }, form: true });\n }\n\n /** Debit an amount from a player (subtracts from their balance). */\n debit(uuid: string, amount: number): Promise<void> {\n return this.http.request(\"POST\", \"economy/debit\", { body: { uuid, amount }, form: true });\n }\n\n // ─── ExcellentEconomy multi-currency (native API, not Vault) ────────────\n //\n // These endpoints talk directly to ExcellentEconomy's Developer API rather\n // than Vault, so they work with any currency configured on the server\n // (coins, gems, tokens, ...) instead of only the single Vault-linked\n // \"primary\" currency exposed above. They throw `NoxAeApiError` with a 424\n // status if ExcellentEconomy isn't installed on the target server, and a\n // 404 if the given currency ID doesn't exist.\n\n /** List all currency IDs configured on ExcellentEconomy. */\n listCurrencies(): Promise<string[]> {\n return this.http.request(\"GET\", \"economy/currencies\");\n }\n\n /** Get a player's balance for a specific ExcellentEconomy currency. */\n getCurrencyBalance(currency: string, uuid: string): Promise<CurrencyBalance> {\n return this.http.request(\n \"GET\",\n `economy/currency/${encodeURIComponent(currency)}/balance/${encodeURIComponent(uuid)}`,\n );\n }\n\n /**\n * Pay a player in a specific currency (adds `amount` to their balance).\n * `amount` must be greater than zero.\n */\n payCurrency(currency: string, uuid: string, amount: number): Promise<\"success\" | \"failure\"> {\n return this.http.request(\"POST\", `economy/currency/${encodeURIComponent(currency)}/pay`, {\n body: { uuid, amount },\n form: true,\n });\n }\n\n /**\n * Debit a player in a specific currency (subtracts `amount` from their\n * balance). `amount` must be greater than zero.\n */\n debitCurrency(currency: string, uuid: string, amount: number): Promise<\"success\" | \"failure\"> {\n return this.http.request(\"POST\", `economy/currency/${encodeURIComponent(currency)}/debit`, {\n body: { uuid, amount },\n form: true,\n });\n }\n\n /**\n * Set a player's balance for a specific currency to an exact amount\n * (`amount` must be >= 0), rather than adding/subtracting.\n */\n setCurrencyBalance(\n currency: string,\n uuid: string,\n amount: number,\n ): Promise<\"success\" | \"failure\"> {\n return this.http.request(\"POST\", `economy/currency/${encodeURIComponent(currency)}/set`, {\n body: { uuid, amount },\n form: true,\n });\n }\n\n /** Get the top balances leaderboard for a specific currency. */\n getCurrencyTop(currency: string, limit?: number): Promise<CurrencyTopEntry[]> {\n return this.http.request(\"GET\", `economy/currency/${encodeURIComponent(currency)}/top`, {\n query: { limit },\n });\n }\n}\n","import type { HttpEngine } from \"../http-engine.js\";\nimport type { ServerInfo, WhitelistEntry } from \"../types/models.js\";\n\nexport class ServerModule {\n constructor(private readonly http: HttpEngine) {}\n\n /** Basic liveness check. */\n ping(): Promise<{ status: string }> {\n return this.http.request(\"GET\", \"ping\");\n }\n\n /** Get server info: version, MOTD, TPS, health, player counts, etc. */\n info(): Promise<ServerInfo> {\n return this.http.request(\"GET\", \"server\");\n }\n\n /**\n * Run a console command on the server, returning its console output.\n * This is a privileged endpoint — requires a write-enabled API key.\n *\n * `waitMs` is how long to wait for output before returning (server\n * default 500ms if omitted). The server returns the joined output as a\n * plain JSON string, not `{ lines }`.\n */\n exec(command: string, waitMs?: number): Promise<string> {\n return this.http.request(\"POST\", \"server/exec\", {\n body: { command, time: waitMs },\n form: true,\n });\n }\n\n /** List server operators. */\n getOps(): Promise<WhitelistEntry[]> {\n return this.http.request(\"GET\", \"server/ops\");\n }\n\n /**\n * Grant operator status to a player.\n *\n * Server-side (`ServerApi.opPlayer`) reads `ctx.formParam(\"playerUuid\")`,\n * not \"uuid\" — the field name matters here.\n */\n opPlayer(uuid: string): Promise<void> {\n return this.http.request(\"POST\", \"server/ops\", { body: { playerUuid: uuid }, form: true });\n }\n\n /**\n * Revoke operator status from a player.\n *\n * Server-side (`ServerApi.deopPlayer`) reads this from the query string\n * (`ctx.queryParam(\"playerUuid\")`), not the request body.\n */\n deopPlayer(uuid: string): Promise<void> {\n return this.http.request(\"DELETE\", \"server/ops\", { query: { playerUuid: uuid } });\n }\n\n /** Get the current whitelist. */\n getWhitelist(): Promise<WhitelistEntry[]> {\n return this.http.request(\"GET\", \"server/whitelist\");\n }\n\n /** Add a player to the whitelist. */\n addToWhitelist(uuid: string, name?: string): Promise<void> {\n return this.http.request(\"POST\", \"server/whitelist\", { body: { uuid, name }, form: true });\n }\n\n /**\n * Remove a player from the whitelist.\n *\n * Server-side (`ServerApi.whitelistDelete`) reads `uuid`/`name` from the\n * query string, not the request body.\n */\n removeFromWhitelist(uuid: string): Promise<void> {\n return this.http.request(\"DELETE\", \"server/whitelist\", { query: { uuid } });\n }\n\n /**\n * Restart the server.\n * This is a privileged endpoint — requires a write-enabled API key.\n */\n restart(): Promise<void> {\n return this.http.request(\"POST\", \"server/restart\");\n }\n\n /** Tail the server console log. */\n getLogs(lines?: number): Promise<{ lines: string[] }> {\n return this.http.request(\"GET\", \"server/logs\", { query: { lines } });\n }\n\n /** Get entity counts on the server, optionally scoped to a world. */\n getEntities(world?: string): Promise<{ world: string; count: number; entities: Record<string, number> }> {\n return this.http.request(\"GET\", \"server/entities\", { query: { world } });\n }\n\n /** Get loaded chunk counts, optionally scoped to a world. */\n getChunks(world?: string): Promise<{ world: string; loadedChunks: number }> {\n return this.http.request(\"GET\", \"server/chunks\", { query: { world } });\n }\n\n /** Ban an IP address. */\n banIp(ip: string, reason?: string): Promise<void> {\n return this.http.request(\"POST\", \"server/ban-ip\", { body: { ip, reason }, form: true });\n }\n\n /** Get a scoreboard objective's scores by objective name. */\n getObjective(name: string) {\n return this.http.request(\"GET\", `scoreboard/${encodeURIComponent(name)}`);\n }\n\n /** List all scoreboard objectives and tracked entries. */\n getScoreboard() {\n return this.http.request(\"GET\", \"scoreboard\");\n }\n\n /** Set a score for an entry on an objective. */\n setScore(objective: string, entry: string, value: number): Promise<void> {\n return this.http.request(\"POST\", `scoreboard/${encodeURIComponent(objective)}/score`, {\n body: { entry, value },\n form: true,\n });\n }\n\n /**\n * Reset (remove) a score for an entry on an objective.\n *\n * Server-side (`ServerApi.resetScore`) reads `entry` from the query\n * string, not the request body.\n */\n resetScore(objective: string, entry: string): Promise<void> {\n return this.http.request(\"DELETE\", `scoreboard/${encodeURIComponent(objective)}/score`, {\n query: { entry },\n });\n }\n\n /** Broadcast a message to every player on the server. */\n broadcast(message: string): Promise<void> {\n return this.http.request(\"POST\", \"chat/broadcast\", { body: { message }, form: true });\n }\n\n /**\n * Send a private message to a specific player.\n *\n * Server-side (`ServerApi.tellPost`) reads `ctx.formParam(\"playerUuid\")`,\n * not \"uuid\".\n */\n tell(uuid: string, message: string): Promise<void> {\n return this.http.request(\"POST\", \"chat/tell\", { body: { playerUuid: uuid, message }, form: true });\n }\n}\n","import type { HttpEngine } from \"../http-engine.js\";\nimport type { World } from \"../types/models.js\";\n\nexport class WorldsModule {\n constructor(private readonly http: HttpEngine) {}\n\n /** List all worlds. */\n list(): Promise<World[]> {\n return this.http.request(\"GET\", \"worlds\");\n }\n\n /** Save all worlds to disk. */\n saveAll(): Promise<void> {\n return this.http.request(\"POST\", \"worlds/save\");\n }\n\n /** Get a download link/stream reference for all worlds. */\n downloadAll(): Promise<{ url: string }> {\n return this.http.request(\"GET\", \"worlds/download\");\n }\n\n /** Get a single world by UUID. */\n get(uuid: string): Promise<World> {\n return this.http.request(\"GET\", `worlds/${encodeURIComponent(uuid)}`);\n }\n\n /** Save a specific world to disk. */\n save(uuid: string): Promise<void> {\n return this.http.request(\"POST\", `worlds/${encodeURIComponent(uuid)}/save`);\n }\n\n /** Get a download link/stream reference for a specific world. */\n download(uuid: string): Promise<{ url: string }> {\n return this.http.request(\"GET\", `worlds/${encodeURIComponent(uuid)}/download`);\n }\n\n /** Set the in-game time for a world (0-24000). */\n setTime(uuid: string, time: number): Promise<void> {\n return this.http.request(\"POST\", `worlds/${encodeURIComponent(uuid)}/time`, {\n body: { time },\n form: true,\n });\n }\n\n /**\n * Set the weather for a world.\n *\n * Server-side (`WorldApi.setWorldWeather`) reads a single\n * `ctx.formParam(\"weather\")` enum string — \"clear\" | \"rain\" | \"thunder\" —\n * not separate storm/thundering booleans.\n */\n setWeather(uuid: string, weather: \"clear\" | \"rain\" | \"thunder\"): Promise<void> {\n return this.http.request(\"POST\", `worlds/${encodeURIComponent(uuid)}/weather`, {\n body: { weather },\n form: true,\n });\n }\n\n /** Get entity counts within a specific world. */\n getEntities(uuid: string): Promise<{ world: string; count: number; entities: Record<string, number> }> {\n return this.http.request(\"GET\", `worlds/${encodeURIComponent(uuid)}/entities`);\n }\n}\n","import type { HttpEngine } from \"../http-engine.js\";\nimport type { Plugin } from \"../types/models.js\";\n\nexport class PluginsModule {\n constructor(private readonly http: HttpEngine) {}\n\n /** List all installed plugins/mods. */\n list(): Promise<Plugin[]> {\n return this.http.request(\"GET\", \"plugins\");\n }\n\n /**\n * Install a plugin by downloading it from a direct URL.\n * This is a privileged endpoint — requires a write-enabled API key.\n *\n * Server-side (`PluginApi.installPlugin`) reads\n * `ctx.formParam(\"downloadUrl\")`, not \"source\", and the request must be\n * form-urlencoded.\n */\n install(downloadUrl: string): Promise<void> {\n return this.http.request(\"POST\", \"plugins\", { body: { downloadUrl }, form: true });\n }\n\n /** Enable a plugin by name. */\n enable(name: string): Promise<void> {\n return this.http.request(\"POST\", `plugins/${encodeURIComponent(name)}/enable`);\n }\n\n /** Disable a plugin by name. */\n disable(name: string): Promise<void> {\n return this.http.request(\"POST\", `plugins/${encodeURIComponent(name)}/disable`);\n }\n}\n","import type { HttpEngine } from \"../http-engine.js\";\nimport type { Advancement } from \"../types/models.js\";\n\nexport class AdvancementsModule {\n constructor(private readonly http: HttpEngine) {}\n\n /** List all advancements known to the server. */\n list(): Promise<Advancement[]> {\n return this.http.request(\"GET\", \"advancements\");\n }\n}\n\nexport class PlaceholdersModule {\n constructor(private readonly http: HttpEngine) {}\n\n /**\n * Replace PlaceholderAPI-style placeholders (e.g. \"%player_name%\") in\n * `message` for a player, returning the resolved string.\n *\n * Server-side this is `PAPIApi.replacePlaceholders`, which reads\n * `ctx.formParam(\"message\")` and `ctx.formParam(\"uuid\")` — the field is\n * literally named \"message\", not \"text\", and the whole body must be\n * form-urlencoded.\n */\n replace(uuid: string, message: string): Promise<string> {\n return this.http.request(\"POST\", \"placeholders/replace\", {\n body: { uuid, message },\n form: true,\n });\n }\n}\n","import type { HttpEngine } from \"../http-engine.js\";\nimport type { GroupInfo, PermissionNode } from \"../types/models.js\";\n\n/**\n * Wraps the `/v1/luckperms/*` routes. These only exist on the server when\n * the LuckPerms mod is loaded — calling any method here against a server\n * without it will fail (typically a 404). There's no separate \"is this\n * available\" flag from the SDK's side; check `client.plugins.list()` for\n * LuckPerms if you need to branch on it ahead of time.\n *\n * Unlike most other modules, these POST/DELETE bodies are sent as real\n * JSON (the server reads them with `ctx.bodyAsClass(...)`, not\n * `ctx.formParam(...)`) — do not add `form: true` to these calls.\n */\nexport class LuckPermsModule {\n constructor(private readonly http: HttpEngine) {}\n\n /** Get the groups a player belongs to. */\n getPlayerGroups(uuid: string): Promise<string[]> {\n return this.http.request(\"GET\", `luckperms/player/${encodeURIComponent(uuid)}/groups`);\n }\n\n /** Get a player's effective permission nodes. */\n getPlayerPermissions(uuid: string): Promise<PermissionNode[]> {\n return this.http.request(\n \"GET\",\n `luckperms/player/${encodeURIComponent(uuid)}/permissions`,\n );\n }\n\n /** Add a permission node to a player. */\n addPlayerPermission(uuid: string, permission: string, value = true): Promise<void> {\n return this.http.request(\n \"POST\",\n `luckperms/player/${encodeURIComponent(uuid)}/permission`,\n { body: { permission, value } },\n );\n }\n\n /** Check whether a player has a given permission. */\n checkPlayerPermission(\n uuid: string,\n permission: string,\n ): Promise<{ permission: string; value: boolean }> {\n return this.http.request(\n \"POST\",\n `luckperms/player/${encodeURIComponent(uuid)}/check-permission`,\n { body: { permission } },\n );\n }\n\n /** Remove a permission node from a player. */\n removePlayerPermission(uuid: string, permission: string): Promise<void> {\n return this.http.request(\n \"DELETE\",\n `luckperms/player/${encodeURIComponent(uuid)}/permission`,\n { body: { permission } },\n );\n }\n\n /** Set a player's primary group. */\n setPlayerGroup(uuid: string, group: string): Promise<void> {\n return this.http.request(\n \"POST\",\n `luckperms/player/${encodeURIComponent(uuid)}/group`,\n { body: { group } },\n );\n }\n\n /** Remove a group from a player. */\n removePlayerGroup(uuid: string, groupName: string): Promise<void> {\n return this.http.request(\n \"DELETE\",\n `luckperms/player/${encodeURIComponent(uuid)}/group/${encodeURIComponent(groupName)}`,\n );\n }\n\n /** List all known groups. */\n getGroups(): Promise<string[]> {\n return this.http.request(\"GET\", \"luckperms/groups\");\n }\n\n /**\n * Create a new LuckPerms group. The name is lowercased server-side.\n * Throws `NoxAeApiError` with a 409 status if the group already exists.\n */\n createGroup(name: string): Promise<{ name: string; status: string }> {\n return this.http.request(\"POST\", \"luckperms/groups\", { body: { name } });\n }\n\n /**\n * Delete a LuckPerms group by name.\n * The `default` group can't be deleted (400 — every user without an\n * explicit group inherits from it) and a 404 is thrown if it doesn't exist.\n */\n deleteGroup(name: string): Promise<void> {\n return this.http.request(\"DELETE\", `luckperms/group/${encodeURIComponent(name)}`);\n }\n\n /** Get the permissions attached to a specific group. */\n getGroupPermissions(name: string): Promise<GroupInfo> {\n return this.http.request(\"GET\", `luckperms/group/${encodeURIComponent(name)}/permissions`);\n }\n}\n","import type { HttpEngine } from \"../http-engine.js\";\nimport type { NoxAuthPlayerInfo, PasswordCheckResult } from \"../types/models.js\";\n\n/**\n * Wraps the `/v1/noxauth/*` routes. These only work when `noxauth.enabled`\n * is set to true in the server's noxaeapi-config.yml and the NoxAuth plugin\n * is installed.\n *\n * `checkPassword`'s body is sent as real JSON (the server parses it with\n * `GsonSingleton...fromJson(ctx.body(), PasswordCheckRequest.class)`, not\n * `ctx.formParam(...)`) — do not add `form: true` to that call.\n */\nexport class NoxAuthModule {\n constructor(private readonly http: HttpEngine) {}\n\n /** Get NoxAuth registration/auth info for a player by name. */\n getPlayerAuth(name: string): Promise<NoxAuthPlayerInfo> {\n return this.http.request(\"GET\", `noxauth/player/${encodeURIComponent(name)}`);\n }\n\n /** Check whether a password matches a player's stored NoxAuth password. */\n checkPassword(name: string, password: string): Promise<PasswordCheckResult> {\n return this.http.request(\n \"POST\",\n `noxauth/player/${encodeURIComponent(name)}/check-password`,\n { body: { password } },\n );\n }\n}\n","import type { HttpEngine } from \"../http-engine.js\";\nimport type { SkillInfo } from \"../types/models.js\";\n\n/**\n * Wraps the `/v1/skills/*` routes (mcMMO / AuraSkills).\n */\nexport class SkillsModule {\n constructor(private readonly http: HttpEngine) {}\n\n /**\n * Get mcMMO skill levels and power level for a player.\n * Only works for **online** players — mcMMO's public ExperienceAPI has\n * no offline lookup, so this throws `NoxAeApiNotFoundError` if the\n * player isn't currently connected, and `NoxAeApiServerError` (503)\n * if mcMMO isn't loaded on the target server.\n */\n getMcmmoSkills(uuid: string): Promise<SkillInfo> {\n return this.http.request(\"GET\", `skills/mcmmo/player/${encodeURIComponent(uuid)}`);\n }\n\n /**\n * Get AuraSkills skill levels and power level for a player.\n * Works for offline players. Throws `NoxAeApiServerError` (503) if\n * AuraSkills isn't loaded on the target server.\n */\n getAuraSkills(uuid: string): Promise<SkillInfo> {\n return this.http.request(\"GET\", `skills/auraskills/player/${encodeURIComponent(uuid)}`);\n }\n}\n","import type { HttpEngine } from \"../http-engine.js\";\nimport type { LeaderboardEntry, LeaderboardSourceInfo } from \"../types/models.js\";\n\n/**\n * Wraps the generic, pluggable `/v1/leaderboards/*` routes. This is a\n * unified view over every ranking source registered on the server —\n * economy currencies, mcMMO power level, AuraSkills power level, etc —\n * so you don't need to know ahead of time which plugins are installed.\n *\n * Use `list()` to discover available source IDs, then pass one to\n * `getTop(id)`. Sources that are registered but currently unavailable\n * (e.g. the backing plugin isn't loaded) throw `NoxAeApiError` with the\n * source's own unavailable status (424 for economy currencies, 503 for\n * mcMMO/AuraSkills) when you call `getTop`.\n */\nexport class LeaderboardModule {\n constructor(private readonly http: HttpEngine) {}\n\n /** List every registered leaderboard source and its availability. */\n list(): Promise<LeaderboardSourceInfo[]> {\n return this.http.request(\"GET\", \"leaderboards\");\n }\n\n /** Get ranked entries for one leaderboard source (see `list()` for valid IDs). */\n getTop(id: string, limit?: number): Promise<LeaderboardEntry[]> {\n return this.http.request(\"GET\", `leaderboards/${encodeURIComponent(id)}/top`, {\n query: { limit },\n });\n }\n}\n","import type { HttpEngine, QueryValue } from \"../http-engine.js\";\nimport type {\n NetworkFindPlayerResponse,\n NetworkHealthResponse,\n NetworkPlayersResponse,\n NetworkServerStatus,\n} from \"../types/models.js\";\n\n/**\n * Wraps the `/v1/network/*` routes. These only exist when `network.enabled:\n * true` is set in the server's config with at least one backend server\n * configured — calling any method here against a server without the\n * network aggregator enabled will 404.\n *\n * The aggregator fans requests out to every configured backend server\n * (each with its own base URL + key) and merges the results, so a single\n * call here can reflect the state of an entire network rather than just\n * the server you connected to.\n */\nexport class NetworkModule {\n constructor(private readonly http: HttpEngine) {}\n\n /** Get status (server info + online players) for every configured network server. */\n statusAll(): Promise<{ network: NetworkServerStatus[] }> {\n return this.http.request(\"GET\", \"network/status\");\n }\n\n /** Get status for a single network server by its configured ID. */\n statusById(id: string): Promise<NetworkServerStatus> {\n return this.http.request(\"GET\", `network/status/${encodeURIComponent(id)}`);\n }\n\n /** Aggregate online players across every network server. */\n players(): Promise<NetworkPlayersResponse> {\n return this.http.request(\"GET\", \"network/players\");\n }\n\n /** Find which network server a player is currently on by UUID. */\n findPlayer(uuid: string): Promise<NetworkFindPlayerResponse> {\n return this.http.request(\"GET\", `network/players/${encodeURIComponent(uuid)}`);\n }\n\n /** Get aggregate health (TPS/memory) from every network server. */\n health(): Promise<NetworkHealthResponse> {\n return this.http.request(\"GET\", \"network/health\");\n }\n\n /**\n * Broadcast a message to every server on the network.\n * Returns a map of server ID -> \"success\" | \"error\" (per-server delivery\n * result; a network-wide failure is only thrown for a malformed request).\n */\n broadcast(message: string): Promise<Record<string, \"success\" | \"error\">> {\n return this.http.request(\"POST\", \"network/broadcast\", { body: { message }, form: true });\n }\n\n /**\n * Forward an arbitrary request to a specific network server's own REST\n * API, e.g. `network.forward(\"survival\", \"POST\", \"server/exec\", { body:\n * { command: \"say hi\" }, form: true })` reaches that server's\n * `POST /v1/server/exec` directly. Useful for endpoints the aggregator\n * doesn't have a dedicated method for (economy, worlds, etc) on a\n * specific server without instantiating a second client pointed at it.\n *\n * Note the target server responds according to its own route's expected\n * encoding (form vs JSON) — pass `form: true` the same way you would for\n * a direct call to that endpoint.\n */\n forward<T = unknown>(\n id: string,\n method: \"GET\" | \"POST\" | \"PUT\" | \"DELETE\" | \"PATCH\",\n path: string,\n opts: { body?: unknown; query?: Record<string, QueryValue>; form?: boolean } = {},\n ): Promise<T> {\n return this.http.request(method, `network/${encodeURIComponent(id)}/${path.replace(/^\\/+/, \"\")}`, opts);\n }\n}\n","import type { HttpEngine, QueryValue } from \"../http-engine.js\";\nimport type {\n NetworkHubBroadcastResponse,\n NetworkHubFindPlayerResponse,\n NetworkHubNode,\n NetworkHubPlayersResponse,\n NetworkHubStatusResponse,\n} from \"../types/models.js\";\n\n/**\n * Wraps the `/v1/network/*` routes exposed by the **NoxAeApi-Velocity**\n * network hub — a separate plugin/process from NoxAeApi-main, run on the\n * Velocity proxy and listening on its own port (`NetworkHubConfig`'s\n * `api-port`, distinct from any individual backend's own REST port).\n *\n * Point a `NoxAeApiNetworkHubClient` (not the regular `NoxAeApiClient`) at\n * that port to use this module. Backend Paper/Bukkit servers connect out\n * to the hub over WebSocket (`/network/register`) and push register /\n * heartbeat / player-join / player-quit events; the hub answers every\n * method below from its own in-memory registry, so calls here are cheap\n * and don't block on a live round trip to each backend the way the older\n * `NetworkModule` (NoxAeApi-main's built-in aggregator) does.\n *\n * Response shapes differ from `NetworkModule` even where the route names\n * match — e.g. `players()` returns one flat proxy-wide player list here,\n * not a per-server breakdown — so the two modules' types aren't\n * interchangeable. There's also no hub equivalent of `/v1/network/health`;\n * each node's last-reported health is embedded in `status*()`'s\n * `NetworkHubNode.health` field instead.\n */\nexport class NetworkHubModule {\n constructor(private readonly http: HttpEngine) {}\n\n /** Get last-known status (from the registry) for every backend node that has ever registered. */\n statusAll(): Promise<NetworkHubStatusResponse> {\n return this.http.request(\"GET\", \"network/status\");\n }\n\n /** Get last-known status for a single node by its configured ID. */\n statusById(id: string): Promise<NetworkHubNode> {\n return this.http.request(\"GET\", `network/status/${encodeURIComponent(id)}`);\n }\n\n /**\n * List every player currently connected to the proxy, read straight from\n * Velocity's own player registry (not reported by backends), along with\n * which backend server each is on.\n */\n players(): Promise<NetworkHubPlayersResponse> {\n return this.http.request(\"GET\", \"network/players\");\n }\n\n /** Find which backend server a player is currently on by UUID (proxy-authoritative). */\n findPlayer(uuid: string): Promise<NetworkHubFindPlayerResponse> {\n return this.http.request(\"GET\", `network/players/${encodeURIComponent(uuid)}`);\n }\n\n /**\n * Broadcast a message directly to every player connected to the proxy.\n * Unlike `NetworkModule.broadcast`, this doesn't forward to each\n * backend's `/v1/chat/broadcast` — the proxy already has every player\n * in hand — so it still delivers even to servers with no REST API of\n * their own reachable from the hub.\n */\n broadcast(message: string): Promise<NetworkHubBroadcastResponse> {\n return this.http.request(\"POST\", \"network/broadcast\", { body: { message }, form: true });\n }\n\n /**\n * Forward an arbitrary request to a specific backend node's own REST\n * API, e.g. `hub.forward(\"survival\", \"POST\", \"server/exec\", { body:\n * { command: \"say hi\" }, form: true })` reaches that backend's\n * `POST /v1/server/exec` directly. Useful for endpoints the hub doesn't\n * have a dedicated method for (economy, worlds, etc) without\n * instantiating a second client pointed at that backend directly.\n *\n * The target backend responds according to its own route's expected\n * encoding (form vs JSON) — pass `form: true` the same way you would for\n * a direct call to that endpoint.\n */\n forward<T = unknown>(\n id: string,\n method: \"GET\" | \"POST\" | \"PUT\" | \"DELETE\" | \"PATCH\",\n path: string,\n opts: { body?: unknown; query?: Record<string, QueryValue>; form?: boolean } = {},\n ): Promise<T> {\n return this.http.request(method, `network/${encodeURIComponent(id)}/${path.replace(/^\\/+/, \"\")}`, opts);\n }\n}\n","export type NoxAeApiWsEvent =\n | \"open\"\n | \"close\"\n | \"error\"\n | \"console\"\n | \"event\"\n | \"message\";\n\ntype Listener = (payload: unknown) => void;\n\nexport interface NoxAeApiWsOptions {\n /** Base URL of the server, same one passed to the client (http/https). */\n baseUrl: string;\n apiKey?: string;\n /** Route suffix under the websocket base, e.g. \"console\" or \"events\". Default \"events\". */\n route?: string;\n /** Whether to auto-reconnect on unexpected close. Default true. */\n autoReconnect?: boolean;\n /** Max reconnect delay in ms. Default 30000. */\n maxReconnectDelayMs?: number;\n /** Override the WebSocket implementation, mainly for testing / non-browser runtimes. */\n webSocketImpl?: typeof WebSocket;\n}\n\nfunction toWsUrl(baseUrl: string, route: string, apiKey?: string): string {\n const url = new URL(`${baseUrl.replace(/\\/+$/, \"\")}/v1/ws/${route.replace(/^\\/+/, \"\")}`);\n url.protocol = url.protocol === \"https:\" ? \"wss:\" : \"ws:\";\n if (apiKey) url.searchParams.set(\"key\", apiKey);\n return url.toString();\n}\n\n/**\n * Thin wrapper around the server's WebSocket endpoints (console tail and\n * event broadcasts). Handles reconnection with exponential backoff so\n * consumers can just attach listeners and not think about the socket\n * lifecycle.\n *\n * Usage:\n * ```ts\n * const ws = client.connect({ route: \"console\" });\n * ws.on(\"console\", (line) => console.log(line));\n * ws.on(\"close\", () => console.log(\"disconnected\"));\n * ```\n */\nexport class NoxAeApiSocket {\n private socket: WebSocket | null = null;\n private readonly listeners = new Map<NoxAeApiWsEvent, Set<Listener>>();\n private reconnectAttempt = 0;\n private closedByUser = false;\n private readonly wsImpl: typeof WebSocket;\n\n constructor(private readonly options: NoxAeApiWsOptions) {\n const impl = options.webSocketImpl ?? (globalThis as { WebSocket?: typeof WebSocket }).WebSocket;\n if (!impl) {\n throw new Error(\n \"No WebSocket implementation available in this runtime. Pass `webSocketImpl` in options.\",\n );\n }\n this.wsImpl = impl;\n this.open();\n }\n\n private open(): void {\n const url = toWsUrl(this.options.baseUrl, this.options.route ?? \"events\", this.options.apiKey);\n const socket = new this.wsImpl(url);\n\n socket.onopen = () => {\n this.reconnectAttempt = 0;\n this.emit(\"open\", undefined);\n };\n\n socket.onmessage = (event: MessageEvent) => {\n const raw = typeof event.data === \"string\" ? event.data : String(event.data);\n const parsed = safeParse(raw);\n this.emit(\"message\", parsed);\n // Best-effort routing: if the payload has a `type` field of \"console\"\n // or \"event\", also emit on that specific channel.\n if (parsed && typeof parsed === \"object\" && \"type\" in (parsed as Record<string, unknown>)) {\n const type = (parsed as Record<string, unknown>).type;\n if (type === \"console\" || type === \"event\") this.emit(type, parsed);\n }\n };\n\n socket.onerror = (event) => {\n this.emit(\"error\", event);\n };\n\n socket.onclose = () => {\n this.emit(\"close\", undefined);\n if (!this.closedByUser && this.options.autoReconnect !== false) {\n this.scheduleReconnect();\n }\n };\n\n this.socket = socket;\n }\n\n private scheduleReconnect(): void {\n const maxDelay = this.options.maxReconnectDelayMs ?? 30_000;\n const delay = Math.min(maxDelay, 500 * 2 ** this.reconnectAttempt);\n this.reconnectAttempt++;\n setTimeout(() => {\n if (!this.closedByUser) this.open();\n }, delay);\n }\n\n on(event: NoxAeApiWsEvent, listener: Listener): () => void {\n if (!this.listeners.has(event)) this.listeners.set(event, new Set());\n this.listeners.get(event)!.add(listener);\n return () => this.listeners.get(event)?.delete(listener);\n }\n\n off(event: NoxAeApiWsEvent, listener: Listener): void {\n this.listeners.get(event)?.delete(listener);\n }\n\n private emit(event: NoxAeApiWsEvent, payload: unknown): void {\n for (const listener of this.listeners.get(event) ?? []) listener(payload);\n }\n\n /** Send a raw payload over the socket, JSON-stringified if not already a string. */\n send(payload: unknown): void {\n if (!this.socket || this.socket.readyState !== this.wsImpl.OPEN) {\n throw new Error(\"Cannot send: socket is not open\");\n }\n this.socket.send(typeof payload === \"string\" ? payload : JSON.stringify(payload));\n }\n\n /** Close the socket and stop reconnecting. */\n close(): void {\n this.closedByUser = true;\n this.socket?.close();\n }\n}\n\nfunction safeParse(text: string): unknown {\n try {\n return JSON.parse(text);\n } catch {\n return text;\n }\n}\n","import { HttpEngine, type NoxAeApiClientOptions } from \"./http-engine.js\";\nimport { PlayersModule } from \"./modules/players.js\";\nimport { EconomyModule } from \"./modules/economy.js\";\nimport { ServerModule } from \"./modules/server.js\";\nimport { WorldsModule } from \"./modules/worlds.js\";\nimport { PluginsModule } from \"./modules/plugins.js\";\nimport { AdvancementsModule, PlaceholdersModule } from \"./modules/misc.js\";\nimport { LuckPermsModule } from \"./modules/luckperms.js\";\nimport { NoxAuthModule } from \"./modules/noxauth.js\";\nimport { SkillsModule } from \"./modules/skills.js\";\nimport { LeaderboardModule } from \"./modules/leaderboard.js\";\nimport { NetworkModule } from \"./modules/network.js\";\nimport { NetworkHubModule } from \"./modules/network-hub.js\";\nimport { NoxAeApiSocket, type NoxAeApiWsOptions } from \"./socket.js\";\n\nexport class NoxAeApiClient {\n readonly players: PlayersModule;\n readonly economy: EconomyModule;\n readonly server: ServerModule;\n readonly worlds: WorldsModule;\n readonly plugins: PluginsModule;\n readonly advancements: AdvancementsModule;\n readonly placeholders: PlaceholdersModule;\n /** Only works if LuckPerms is loaded on the target server. */\n readonly luckperms: LuckPermsModule;\n /** Only works if `noxauth.enabled: true` is set in the server config. */\n readonly noxauth: NoxAuthModule;\n /** Requires mcMMO and/or AuraSkills to be loaded on the target server. */\n readonly skills: SkillsModule;\n /** Generic ranked leaderboards (economy currencies, mcMMO, AuraSkills, ...). */\n readonly leaderboards: LeaderboardModule;\n /**\n * Only works if `network.enabled: true` is set in the server config.\n *\n * This is NoxAeApi-main's built-in polling aggregator — it lives on the\n * *same* backend server you're already connected to and fans requests\n * out to the other backends listed in that server's own config. If the\n * network is running NoxAeApi-Velocity instead, use\n * `NoxAeApiNetworkHubClient` (pointed at the proxy's hub port) rather\n * than this module — the hub replaces this aggregator with a push model\n * and its response shapes differ.\n */\n readonly network: NetworkModule;\n\n private readonly http: HttpEngine;\n private readonly baseUrl: string;\n private readonly apiKey?: string;\n\n constructor(options: NoxAeApiClientOptions) {\n this.http = new HttpEngine(options);\n this.baseUrl = options.baseUrl;\n this.apiKey = options.apiKey;\n\n this.players = new PlayersModule(this.http);\n this.economy = new EconomyModule(this.http);\n this.server = new ServerModule(this.http);\n this.worlds = new WorldsModule(this.http);\n this.plugins = new PluginsModule(this.http);\n this.advancements = new AdvancementsModule(this.http);\n this.placeholders = new PlaceholdersModule(this.http);\n this.luckperms = new LuckPermsModule(this.http);\n this.noxauth = new NoxAuthModule(this.http);\n this.skills = new SkillsModule(this.http);\n this.leaderboards = new LeaderboardModule(this.http);\n this.network = new NetworkModule(this.http);\n }\n\n /**\n * Build a client from environment variables:\n * `NOXAEAPI_BASE_URL` and `NOXAEAPI_KEY`.\n *\n * This is a convenience for Node-like runtimes; the SDK itself never\n * reads `process.env` implicitly outside of this method, and does not\n * load `.env` files — use a library like `dotenv` in your own app if\n * you want that, then call `NoxAeApiClient.fromEnv()` after it's loaded.\n */\n static fromEnv(overrides: Partial<NoxAeApiClientOptions> = {}): NoxAeApiClient {\n const env = (globalThis as { process?: { env?: Record<string, string | undefined> } })\n .process?.env;\n const baseUrl = overrides.baseUrl ?? env?.NOXAEAPI_BASE_URL;\n const apiKey = overrides.apiKey ?? env?.NOXAEAPI_KEY;\n\n if (!baseUrl) {\n throw new Error(\n \"NoxAeApiClient.fromEnv(): NOXAEAPI_BASE_URL is not set and no baseUrl override was given.\",\n );\n }\n\n return new NoxAeApiClient({ ...overrides, baseUrl, apiKey });\n }\n\n /** Open a WebSocket connection to the server (console tail or event stream). */\n connect(options: Partial<NoxAeApiWsOptions> = {}): NoxAeApiSocket {\n return new NoxAeApiSocket({\n baseUrl: this.baseUrl,\n apiKey: this.apiKey,\n ...options,\n });\n }\n}\n\n/**\n * Client for the **NoxAeApi-Velocity** network hub — a separate plugin\n * that runs on the Velocity proxy, not on any individual backend server.\n * Point `baseUrl` at the hub's own REST port (`NetworkHubConfig`'s\n * `api-port`), not a backend's port, and use `NOXAEAPI_HUB_*` env vars\n * (via `fromEnv`) if you keep that separate from a regular backend's\n * `NOXAEAPI_*` vars.\n *\n * Only exposes `.network` — the hub doesn't run any of the other REST\n * modules (players, economy, worlds, ...) that a backend `NoxAeApiClient`\n * does. To reach a specific backend's own routes through the hub, use\n * `hub.network.forward(id, ...)`.\n */\nexport class NoxAeApiNetworkHubClient {\n /** The network hub's aggregated view of every registered backend node. */\n readonly network: NetworkHubModule;\n\n constructor(options: NoxAeApiClientOptions) {\n const http = new HttpEngine(options);\n this.network = new NetworkHubModule(http);\n }\n\n /**\n * Build a hub client from environment variables:\n * `NOXAEAPI_HUB_BASE_URL` and `NOXAEAPI_HUB_KEY`.\n *\n * Same convenience as `NoxAeApiClient.fromEnv()`, under separate env var\n * names so a process can hold both a backend client and a hub client at\n * once without the two colliding.\n */\n static fromEnv(overrides: Partial<NoxAeApiClientOptions> = {}): NoxAeApiNetworkHubClient {\n const env = (globalThis as { process?: { env?: Record<string, string | undefined> } })\n .process?.env;\n const baseUrl = overrides.baseUrl ?? env?.NOXAEAPI_HUB_BASE_URL;\n const apiKey = overrides.apiKey ?? env?.NOXAEAPI_HUB_KEY;\n\n if (!baseUrl) {\n throw new Error(\n \"NoxAeApiNetworkHubClient.fromEnv(): NOXAEAPI_HUB_BASE_URL is not set and no baseUrl override was given.\",\n );\n }\n\n return new NoxAeApiNetworkHubClient({ ...overrides, baseUrl, apiKey });\n }\n}\n"]}
|