@easecation/ecapi-sdk 0.1.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 ADDED
@@ -0,0 +1,112 @@
1
+ # @easecation/ecapi-sdk
2
+
3
+ ECAPI 的 Node.js / TypeScript SDK,封装了常用接口,并内置两种鉴权方式:
4
+
5
+ - `X-API-Key`(IAM API Key)
6
+ - `X-App-Session-Token`(App Session Token)
7
+
8
+ ## 安装
9
+
10
+ ```bash
11
+ npm install @easecation/ecapi-sdk
12
+ ```
13
+
14
+ ## 快速开始
15
+
16
+ ```ts
17
+ import { ECAPIClient } from "@easecation/ecapi-sdk";
18
+
19
+ const client = new ECAPIClient({
20
+ baseUrl: "https://your-ecapi-host",
21
+ auth: { type: "apiKey", apiKey: process.env.EC_API_KEY! },
22
+ });
23
+
24
+ const me = await client.user.getMe();
25
+ const player = await client.player.getInfo({ name: "player123" });
26
+ ```
27
+
28
+ 切换为 App Session Token:
29
+
30
+ ```ts
31
+ client.setAppSessionToken(process.env.EC_APP_SESSION_TOKEN!);
32
+ ```
33
+
34
+ ## 客户端能力
35
+
36
+ - 统一请求入口:`client.request(method, path, options)`
37
+ - 默认超时:15s(可在构造时 `timeoutMs` 覆盖)
38
+ - 支持 per-request 覆盖鉴权:`options.auth`
39
+ - 非 2xx 响应抛出 `ECAPIError`(包含 `status`、`payload`、`url`)
40
+
41
+ ## API 覆盖
42
+
43
+ > 下列为 SDK 已封装的主要接口,未覆盖部分可通过 `client.request(...)` 直接调用。
44
+
45
+ ### 用户
46
+
47
+ - `client.user.getMe()` → `GET /user/me`
48
+ - `client.user.loginByPassword(payload)` → `POST /user/auth`
49
+ - `client.user.loginByOauth2(payload)` → `POST /user/oauth2`
50
+ - `client.user.refreshToken(payload)` → `POST /user/refresh`
51
+ - `client.user.getOpenId()` → `GET /user/openid`
52
+ - `client.user.listAll()` → `GET /user/all`
53
+ - `client.user.updatePermissions(payload)` → `PUT /user/permissions`
54
+ - `client.user.getById(id)` → `GET /user/:id`
55
+
56
+ ### 玩家
57
+
58
+ - `client.player.getInfo()` → `GET /player/info`
59
+ - `client.player.searchEcid()` → `GET /player/searchecid`
60
+ - `client.player.getUserData()` → `GET /player/userdata`
61
+ - `client.player.queryNetease()` → `GET /player/querynetease`
62
+ - `client.player.setRankLevel(payload)` → `POST /player/ranklevel`
63
+ - `client.player.clearRespackCache()` → `DELETE /player/respack/cache`
64
+ - `client.player.getWallet()` → `GET /player/wallet`
65
+ - `client.player.listGamingTags()` / `operateGamingTag(payload)` → `GET/POST /player/gaming-tag`
66
+ - `client.player.getLastPlayed()` → `GET /player/last-played`
67
+ - `client.player.getStageRecord()` → `GET /player/stage/record`
68
+ - `client.player.getHeadicon()` / `getSkin()` → `GET /player/headicon|skin`(返回 `ArrayBuffer`)
69
+ - `client.player.batchNeteaseNicknames(payload)` → `POST /player/neteasenicknames`
70
+ - `client.player.getBinding()` / `resetBinding(payload)` / `updateBinding(payload)`
71
+ - `client.player.updateUserData(nick, payload)` → `POST /player/update/:nick`
72
+ - `client.player.updatePassword(ecid, payload)` / `getPasswordHash(ecid)`
73
+
74
+ #### 玩家子模块
75
+
76
+ - `client.player.score.*` → `/player/score*`
77
+ - `client.player.tasks.*` → `/player/:ecid/tasks*`
78
+ - `client.player.merchandise.*` → `/player/:ecid/merchandise*`
79
+ - `client.player.yearSummary.*` → `/player/year-summary/*`
80
+ - `client.player.vote.processRewards()` → `GET /player/vote`
81
+
82
+ ### 管理与处罚
83
+
84
+ - `client.admin.*` → `/admin/*`
85
+ - `client.punish.*` → `/punish/*`
86
+ - `client.ban.*` → `/ban/*`
87
+ - `client.permission.*` → `/permission`
88
+
89
+ ### 日志与审计
90
+
91
+ - `client.log.*` → `/log/*`
92
+ - `client.audit.*` → `/audit/*`
93
+
94
+ ### 配置与内容
95
+
96
+ - `client.stage.*`(含 `stage.logs.*`)→ `/stage/*`
97
+ - `client.item.getCommodity()` → `/item/commodity`
98
+ - `client.cfglang.*` → `/cfglang*`
99
+ - `client.globalkv.*` → `/globalkv*`
100
+ - `client.broadcast.*` → `/broadcast*`
101
+ - `client.pullConfig.pull()` → `/pull-config`
102
+
103
+ ### 运营与系统
104
+
105
+ - `client.order.*` → `/order/*`
106
+ - `client.count.*` → `/count/*`
107
+ - `client.servers.*` → `/servers*`
108
+ - `client.lobby.list()` → `/lobby/list`
109
+ - `client.easechat.*` → `/easechat/*`
110
+ - `client.monitor.spamDetector.*` → `/monitor/spam-detector/*`
111
+ - `client.system.getHealth()` → `/health`
112
+
package/dist/apis.d.ts ADDED
@@ -0,0 +1,213 @@
1
+ import { ECAPIHttpClient } from "./http";
2
+ import { QueryParams, RequestOptions } from "./types";
3
+ type NonBodyOptions = Omit<RequestOptions, "query" | "body">;
4
+ declare class BaseApi {
5
+ protected readonly http: ECAPIHttpClient;
6
+ constructor(http: ECAPIHttpClient);
7
+ protected get<T = unknown>(path: string, query?: QueryParams, options?: NonBodyOptions): Promise<T>;
8
+ protected post<T = unknown>(path: string, body?: unknown, options?: Omit<RequestOptions, "body">): Promise<T>;
9
+ protected put<T = unknown>(path: string, body?: unknown, options?: Omit<RequestOptions, "body">): Promise<T>;
10
+ protected patch<T = unknown>(path: string, body?: unknown, options?: Omit<RequestOptions, "body">): Promise<T>;
11
+ protected delete<T = unknown>(path: string, query?: QueryParams, options?: Omit<RequestOptions, "query">): Promise<T>;
12
+ }
13
+ export declare class UserApi extends BaseApi {
14
+ getMe(query?: QueryParams, options?: NonBodyOptions): Promise<unknown>;
15
+ loginByPassword(payload: Record<string, unknown>, options?: Omit<RequestOptions, "body">): Promise<unknown>;
16
+ loginByOauth2(payload: Record<string, unknown>, options?: Omit<RequestOptions, "body">): Promise<unknown>;
17
+ refreshToken(payload: Record<string, unknown>, options?: Omit<RequestOptions, "body">): Promise<unknown>;
18
+ getOpenId(query?: QueryParams, options?: NonBodyOptions): Promise<unknown>;
19
+ listAll(query?: QueryParams, options?: NonBodyOptions): Promise<unknown>;
20
+ updatePermissions(payload: Record<string, unknown>, options?: Omit<RequestOptions, "body">): Promise<unknown>;
21
+ getById(id: string, query?: QueryParams, options?: NonBodyOptions): Promise<unknown>;
22
+ }
23
+ export declare class PlayerScoreApi extends BaseApi {
24
+ getScore(query?: QueryParams, options?: NonBodyOptions): Promise<unknown>;
25
+ getStages(query?: QueryParams, options?: NonBodyOptions): Promise<unknown>;
26
+ getTop(query?: QueryParams, options?: NonBodyOptions): Promise<unknown>;
27
+ deleteTop(query?: QueryParams, options?: Omit<RequestOptions, "query">): Promise<unknown>;
28
+ getConfig(query?: QueryParams, options?: NonBodyOptions): Promise<unknown>;
29
+ getLeaderboard(query?: QueryParams, options?: NonBodyOptions): Promise<unknown>;
30
+ }
31
+ export declare class PlayerTasksApi extends BaseApi {
32
+ list(ecid: string, query?: QueryParams, options?: NonBodyOptions): Promise<unknown>;
33
+ create(ecid: string, payload: Record<string, unknown>, options?: Omit<RequestOptions, "body">): Promise<unknown>;
34
+ update(ecid: string, taskId: string, payload: Record<string, unknown>, options?: Omit<RequestOptions, "body">): Promise<unknown>;
35
+ deleteOne(ecid: string, taskId: string, query?: QueryParams, options?: Omit<RequestOptions, "query">): Promise<unknown>;
36
+ }
37
+ export declare class PlayerMerchandiseApi extends BaseApi {
38
+ list(ecid: string, query?: QueryParams, options?: NonBodyOptions): Promise<unknown>;
39
+ create(ecid: string, payload: Record<string, unknown>, options?: Omit<RequestOptions, "body">): Promise<unknown>;
40
+ update(ecid: string, idItem: string, payload: Record<string, unknown>, options?: Omit<RequestOptions, "body">): Promise<unknown>;
41
+ deleteOne(ecid: string, idItem: string, query?: QueryParams, options?: Omit<RequestOptions, "query">): Promise<unknown>;
42
+ }
43
+ export declare class PlayerYearSummaryApi extends BaseApi {
44
+ getBasicInfo(query?: QueryParams, options?: NonBodyOptions): Promise<unknown>;
45
+ getLoginStats(query?: QueryParams, options?: NonBodyOptions): Promise<unknown>;
46
+ getGameStats(query?: QueryParams, options?: NonBodyOptions): Promise<unknown>;
47
+ getRankData(query?: QueryParams, options?: NonBodyOptions): Promise<unknown>;
48
+ getCurrencyData(query?: QueryParams, options?: NonBodyOptions): Promise<unknown>;
49
+ getSocialData(query?: QueryParams, options?: NonBodyOptions): Promise<unknown>;
50
+ }
51
+ export declare class PlayerVoteApi extends BaseApi {
52
+ processRewards(query?: QueryParams, options?: NonBodyOptions): Promise<unknown>;
53
+ }
54
+ export declare class PlayerApi extends BaseApi {
55
+ readonly score: PlayerScoreApi;
56
+ readonly tasks: PlayerTasksApi;
57
+ readonly merchandise: PlayerMerchandiseApi;
58
+ readonly yearSummary: PlayerYearSummaryApi;
59
+ readonly vote: PlayerVoteApi;
60
+ constructor(http: ECAPIHttpClient);
61
+ getInfo(query?: QueryParams, options?: NonBodyOptions): Promise<unknown>;
62
+ searchEcid(query?: QueryParams, options?: NonBodyOptions): Promise<unknown>;
63
+ getUserData(query?: QueryParams, options?: NonBodyOptions): Promise<unknown>;
64
+ queryNetease(query?: QueryParams, options?: NonBodyOptions): Promise<unknown>;
65
+ setRankLevel(payload: Record<string, unknown>, options?: Omit<RequestOptions, "body">): Promise<unknown>;
66
+ clearRespackCache(query?: QueryParams, options?: Omit<RequestOptions, "query">): Promise<unknown>;
67
+ getWallet(query?: QueryParams, options?: NonBodyOptions): Promise<unknown>;
68
+ listGamingTags(query?: QueryParams, options?: NonBodyOptions): Promise<unknown>;
69
+ operateGamingTag(payload: Record<string, unknown>, options?: Omit<RequestOptions, "body">): Promise<unknown>;
70
+ getLastPlayed(query?: QueryParams, options?: NonBodyOptions): Promise<unknown>;
71
+ getStageRecord(query?: QueryParams, options?: NonBodyOptions): Promise<unknown>;
72
+ getHeadicon(query?: QueryParams, options?: Omit<RequestOptions, "query" | "responseType">): Promise<ArrayBuffer>;
73
+ getSkin(query?: QueryParams, options?: Omit<RequestOptions, "query" | "responseType">): Promise<ArrayBuffer>;
74
+ batchNeteaseNicknames(payload: Record<string, unknown>, options?: Omit<RequestOptions, "body">): Promise<unknown>;
75
+ getBinding(query?: QueryParams, options?: NonBodyOptions): Promise<unknown>;
76
+ resetBinding(payload: Record<string, unknown>, options?: Omit<RequestOptions, "body">): Promise<unknown>;
77
+ updateBinding(payload: Record<string, unknown>, options?: Omit<RequestOptions, "body">): Promise<unknown>;
78
+ updateUserData(nick: string, payload: Record<string, unknown>, options?: Omit<RequestOptions, "body">): Promise<unknown>;
79
+ updatePassword(ecid: string, payload: Record<string, unknown>, options?: Omit<RequestOptions, "body">): Promise<unknown>;
80
+ getPasswordHash(ecid: string, query?: QueryParams, options?: NonBodyOptions): Promise<unknown>;
81
+ }
82
+ export declare class AdminApi extends BaseApi {
83
+ sendMail(payload: Record<string, unknown>, options?: Omit<RequestOptions, "body">): Promise<unknown>;
84
+ prismDeviceBan(payload: Record<string, unknown>, options?: Omit<RequestOptions, "body">): Promise<unknown>;
85
+ getPrismDeviceBanLog(query?: QueryParams, options?: NonBodyOptions): Promise<unknown>;
86
+ upsertOverwatchCase(payload: Record<string, unknown>, options?: Omit<RequestOptions, "body">): Promise<unknown>;
87
+ getOverwatchCase(query?: QueryParams, options?: NonBodyOptions): Promise<unknown>;
88
+ getOperationLogs(query?: QueryParams, options?: NonBodyOptions): Promise<unknown>;
89
+ getOperationStatistics(query?: QueryParams, options?: NonBodyOptions): Promise<unknown>;
90
+ }
91
+ export declare class PunishApi extends BaseApi {
92
+ hack(payload: Record<string, unknown>, options?: Omit<RequestOptions, "body">): Promise<unknown>;
93
+ ban(payload: Record<string, unknown>, options?: Omit<RequestOptions, "body">): Promise<unknown>;
94
+ unban(payload: Record<string, unknown>, options?: Omit<RequestOptions, "body">): Promise<unknown>;
95
+ mute(payload: Record<string, unknown>, options?: Omit<RequestOptions, "body">): Promise<unknown>;
96
+ unmute(payload: Record<string, unknown>, options?: Omit<RequestOptions, "body">): Promise<unknown>;
97
+ warn(payload: Record<string, unknown>, options?: Omit<RequestOptions, "body">): Promise<unknown>;
98
+ kick(payload: Record<string, unknown>, options?: Omit<RequestOptions, "body">): Promise<unknown>;
99
+ clearDegree(payload: Record<string, unknown>, options?: Omit<RequestOptions, "body">): Promise<unknown>;
100
+ overwatch(payload: Record<string, unknown>, options?: Omit<RequestOptions, "body">): Promise<unknown>;
101
+ }
102
+ export declare class BanApi extends BaseApi {
103
+ ban(payload: Record<string, unknown>, options?: Omit<RequestOptions, "body">): Promise<unknown>;
104
+ clearDegree(payload: Record<string, unknown>, options?: Omit<RequestOptions, "body">): Promise<unknown>;
105
+ parkourPunish(query?: QueryParams, payload?: Record<string, unknown>, options?: Omit<RequestOptions, "query" | "body">): Promise<unknown>;
106
+ }
107
+ export declare class PermissionApi extends BaseApi {
108
+ getPermission(query?: QueryParams, options?: NonBodyOptions): Promise<unknown>;
109
+ upsert(payload: Record<string, unknown>, options?: Omit<RequestOptions, "body">): Promise<unknown>;
110
+ deleteOne(query?: QueryParams, options?: Omit<RequestOptions, "query">): Promise<unknown>;
111
+ }
112
+ export declare class LogApi extends BaseApi {
113
+ getAction(query?: QueryParams, options?: NonBodyOptions): Promise<unknown>;
114
+ getChat(query?: QueryParams, options?: NonBodyOptions): Promise<unknown>;
115
+ getAuth(query?: QueryParams, options?: NonBodyOptions): Promise<unknown>;
116
+ getTeaming(query?: QueryParams, options?: NonBodyOptions): Promise<unknown>;
117
+ getLatestTeaming(query?: QueryParams, options?: NonBodyOptions): Promise<unknown>;
118
+ getCommand(query?: QueryParams, options?: NonBodyOptions): Promise<unknown>;
119
+ getMail(query?: QueryParams, options?: NonBodyOptions): Promise<unknown>;
120
+ }
121
+ export declare class OrderApi extends BaseApi {
122
+ getDeliver(query?: QueryParams, options?: NonBodyOptions): Promise<unknown>;
123
+ getLogs(query?: QueryParams, options?: NonBodyOptions): Promise<unknown>;
124
+ getExchangeLogs(query?: QueryParams, options?: NonBodyOptions): Promise<unknown>;
125
+ getDownloadCount(query?: QueryParams, options?: NonBodyOptions): Promise<unknown>;
126
+ createDownloadTask(query?: QueryParams, payload?: Record<string, unknown>, options?: Omit<RequestOptions, "query" | "body">): Promise<unknown>;
127
+ getDownloadStatus(query?: QueryParams, options?: NonBodyOptions): Promise<unknown>;
128
+ listDownloadTasks(query?: QueryParams, options?: NonBodyOptions): Promise<unknown>;
129
+ }
130
+ export declare class StageLogApi extends BaseApi {
131
+ list(query?: QueryParams, options?: NonBodyOptions): Promise<unknown>;
132
+ query(query?: QueryParams, options?: NonBodyOptions): Promise<unknown>;
133
+ }
134
+ export declare class StageApi extends BaseApi {
135
+ readonly logs: StageLogApi;
136
+ constructor(http: ECAPIHttpClient);
137
+ getTypes(query?: QueryParams, options?: NonBodyOptions): Promise<unknown>;
138
+ create(payload: Record<string, unknown>, options?: Omit<RequestOptions, "body">): Promise<unknown>;
139
+ getInfo(query?: QueryParams, options?: NonBodyOptions): Promise<unknown>;
140
+ getDbId(query?: QueryParams, options?: NonBodyOptions): Promise<unknown>;
141
+ }
142
+ export declare class ItemApi extends BaseApi {
143
+ getCommodity(query?: QueryParams, options?: NonBodyOptions): Promise<unknown>;
144
+ }
145
+ export declare class CountApi extends BaseApi {
146
+ getHistory(query?: QueryParams, options?: NonBodyOptions): Promise<unknown>;
147
+ getLatest(query?: QueryParams, options?: NonBodyOptions): Promise<unknown>;
148
+ getTypes(query?: QueryParams, options?: NonBodyOptions): Promise<unknown>;
149
+ }
150
+ export declare class ServersApi extends BaseApi {
151
+ list(query?: QueryParams, options?: NonBodyOptions): Promise<unknown>;
152
+ getStatistics(query?: QueryParams, options?: NonBodyOptions): Promise<unknown>;
153
+ getMainstackEvent(query?: QueryParams, options?: NonBodyOptions): Promise<unknown>;
154
+ }
155
+ export declare class LobbyApi extends BaseApi {
156
+ list(query?: QueryParams, options?: NonBodyOptions): Promise<unknown>;
157
+ }
158
+ export declare class CfgLangApi extends BaseApi {
159
+ list(query?: QueryParams, options?: NonBodyOptions): Promise<unknown>;
160
+ compare(query?: QueryParams, options?: NonBodyOptions): Promise<unknown>;
161
+ deploy(payload: Record<string, unknown>, options?: Omit<RequestOptions, "body">): Promise<unknown>;
162
+ create(query: QueryParams | undefined, payload: Record<string, unknown>, options?: Omit<RequestOptions, "query" | "body">): Promise<unknown>;
163
+ update(query: QueryParams | undefined, payload: Record<string, unknown>, options?: Omit<RequestOptions, "query" | "body">): Promise<unknown>;
164
+ deleteOne(query?: QueryParams, options?: Omit<RequestOptions, "query">): Promise<unknown>;
165
+ }
166
+ export declare class GlobalKVApi extends BaseApi {
167
+ list(query?: QueryParams, options?: NonBodyOptions): Promise<unknown>;
168
+ getOne(key: string, query?: QueryParams, options?: NonBodyOptions): Promise<unknown>;
169
+ create(payload: Record<string, unknown>, options?: Omit<RequestOptions, "body">): Promise<unknown>;
170
+ update(key: string, payload: Record<string, unknown>, options?: Omit<RequestOptions, "body">): Promise<unknown>;
171
+ deleteOne(key: string, query?: QueryParams, options?: Omit<RequestOptions, "query">): Promise<unknown>;
172
+ deleteBatch(payload: Record<string, unknown>, options?: Omit<RequestOptions, "body">): Promise<unknown>;
173
+ }
174
+ export declare class BroadcastApi extends BaseApi {
175
+ list(query?: QueryParams, options?: NonBodyOptions): Promise<unknown>;
176
+ compare(query?: QueryParams, options?: NonBodyOptions): Promise<unknown>;
177
+ deploy(payload: Record<string, unknown>, options?: Omit<RequestOptions, "body">): Promise<unknown>;
178
+ getOne(msg: string, query?: QueryParams, options?: NonBodyOptions): Promise<unknown>;
179
+ create(payload: Record<string, unknown>, options?: Omit<RequestOptions, "body">): Promise<unknown>;
180
+ update(msg: string, payload: Record<string, unknown>, options?: Omit<RequestOptions, "body">): Promise<unknown>;
181
+ deleteOne(msg: string, payload?: Record<string, unknown>, options?: Omit<RequestOptions, "body">): Promise<unknown>;
182
+ }
183
+ export declare class EaseChatApi extends BaseApi {
184
+ sendHlaba(payload: Record<string, unknown>, options?: Omit<RequestOptions, "body">): Promise<unknown>;
185
+ listSubscriptions(query?: QueryParams, options?: NonBodyOptions): Promise<unknown>;
186
+ createSubscription(payload: Record<string, unknown>, options?: Omit<RequestOptions, "body">): Promise<unknown>;
187
+ deleteSubscription(query?: QueryParams, options?: Omit<RequestOptions, "query">): Promise<unknown>;
188
+ }
189
+ export declare class AuditApi extends BaseApi {
190
+ getAuthLogs(query?: QueryParams, options?: NonBodyOptions): Promise<unknown>;
191
+ getPlayerLogs(query?: QueryParams, options?: NonBodyOptions): Promise<unknown>;
192
+ getPunishmentLogs(query?: QueryParams, options?: NonBodyOptions): Promise<unknown>;
193
+ getPermissionLogs(query?: QueryParams, options?: NonBodyOptions): Promise<unknown>;
194
+ getAdminLogs(query?: QueryParams, options?: NonBodyOptions): Promise<unknown>;
195
+ getConfigLogs(query?: QueryParams, options?: NonBodyOptions): Promise<unknown>;
196
+ }
197
+ export declare class SpamDetectorApi extends BaseApi {
198
+ getStatus(query?: QueryParams, options?: NonBodyOptions): Promise<unknown>;
199
+ control(payload: Record<string, unknown>, options?: Omit<RequestOptions, "body">): Promise<unknown>;
200
+ getStats(query?: QueryParams, options?: NonBodyOptions): Promise<unknown>;
201
+ }
202
+ export declare class MonitorApi extends BaseApi {
203
+ readonly spamDetector: SpamDetectorApi;
204
+ constructor(http: ECAPIHttpClient);
205
+ }
206
+ export declare class PullConfigApi extends BaseApi {
207
+ pull(query?: QueryParams, options?: NonBodyOptions): Promise<unknown>;
208
+ }
209
+ export declare class SystemApi extends BaseApi {
210
+ getRoot(query?: QueryParams, options?: NonBodyOptions): Promise<unknown>;
211
+ getHealth(query?: QueryParams, options?: NonBodyOptions): Promise<unknown>;
212
+ }
213
+ export {};
package/dist/apis.js ADDED
@@ -0,0 +1,544 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.SystemApi = exports.PullConfigApi = exports.MonitorApi = exports.SpamDetectorApi = exports.AuditApi = exports.EaseChatApi = exports.BroadcastApi = exports.GlobalKVApi = exports.CfgLangApi = exports.LobbyApi = exports.ServersApi = exports.CountApi = exports.ItemApi = exports.StageApi = exports.StageLogApi = exports.OrderApi = exports.LogApi = exports.PermissionApi = exports.BanApi = exports.PunishApi = exports.AdminApi = exports.PlayerApi = exports.PlayerVoteApi = exports.PlayerYearSummaryApi = exports.PlayerMerchandiseApi = exports.PlayerTasksApi = exports.PlayerScoreApi = exports.UserApi = void 0;
4
+ class BaseApi {
5
+ constructor(http) {
6
+ this.http = http;
7
+ }
8
+ get(path, query, options) {
9
+ return this.http.request("GET", path, { ...options, query });
10
+ }
11
+ post(path, body, options) {
12
+ return this.http.request("POST", path, { ...options, body });
13
+ }
14
+ put(path, body, options) {
15
+ return this.http.request("PUT", path, { ...options, body });
16
+ }
17
+ patch(path, body, options) {
18
+ return this.http.request("PATCH", path, { ...options, body });
19
+ }
20
+ delete(path, query, options) {
21
+ return this.http.request("DELETE", path, { ...options, query });
22
+ }
23
+ }
24
+ class UserApi extends BaseApi {
25
+ getMe(query, options) {
26
+ return this.get("/user/me", query, options);
27
+ }
28
+ loginByPassword(payload, options) {
29
+ return this.post("/user/auth", payload, options);
30
+ }
31
+ loginByOauth2(payload, options) {
32
+ return this.post("/user/oauth2", payload, options);
33
+ }
34
+ refreshToken(payload, options) {
35
+ return this.post("/user/refresh", payload, options);
36
+ }
37
+ getOpenId(query, options) {
38
+ return this.get("/user/openid", query, options);
39
+ }
40
+ listAll(query, options) {
41
+ return this.get("/user/all", query, options);
42
+ }
43
+ updatePermissions(payload, options) {
44
+ return this.put("/user/permissions", payload, options);
45
+ }
46
+ getById(id, query, options) {
47
+ return this.get(`/user/${encodeURIComponent(id)}`, query, options);
48
+ }
49
+ }
50
+ exports.UserApi = UserApi;
51
+ class PlayerScoreApi extends BaseApi {
52
+ getScore(query, options) {
53
+ return super.get("/player/score", query, options);
54
+ }
55
+ getStages(query, options) {
56
+ return super.get("/player/score/stages", query, options);
57
+ }
58
+ getTop(query, options) {
59
+ return super.get("/player/score/top", query, options);
60
+ }
61
+ deleteTop(query, options) {
62
+ return super.delete("/player/score/top", query, options);
63
+ }
64
+ getConfig(query, options) {
65
+ return super.get("/player/score/config", query, options);
66
+ }
67
+ getLeaderboard(query, options) {
68
+ return super.get("/player/score/leaderboard", query, options);
69
+ }
70
+ }
71
+ exports.PlayerScoreApi = PlayerScoreApi;
72
+ class PlayerTasksApi extends BaseApi {
73
+ list(ecid, query, options) {
74
+ return this.get(`/player/${encodeURIComponent(ecid)}/tasks`, query, options);
75
+ }
76
+ create(ecid, payload, options) {
77
+ return this.post(`/player/${encodeURIComponent(ecid)}/tasks`, payload, options);
78
+ }
79
+ update(ecid, taskId, payload, options) {
80
+ return this.put(`/player/${encodeURIComponent(ecid)}/tasks/${encodeURIComponent(taskId)}`, payload, options);
81
+ }
82
+ deleteOne(ecid, taskId, query, options) {
83
+ return this.delete(`/player/${encodeURIComponent(ecid)}/tasks/${encodeURIComponent(taskId)}`, query, options);
84
+ }
85
+ }
86
+ exports.PlayerTasksApi = PlayerTasksApi;
87
+ class PlayerMerchandiseApi extends BaseApi {
88
+ list(ecid, query, options) {
89
+ return this.get(`/player/${encodeURIComponent(ecid)}/merchandise`, query, options);
90
+ }
91
+ create(ecid, payload, options) {
92
+ return this.post(`/player/${encodeURIComponent(ecid)}/merchandise`, payload, options);
93
+ }
94
+ update(ecid, idItem, payload, options) {
95
+ return this.put(`/player/${encodeURIComponent(ecid)}/merchandise/${encodeURIComponent(idItem)}`, payload, options);
96
+ }
97
+ deleteOne(ecid, idItem, query, options) {
98
+ return this.delete(`/player/${encodeURIComponent(ecid)}/merchandise/${encodeURIComponent(idItem)}`, query, options);
99
+ }
100
+ }
101
+ exports.PlayerMerchandiseApi = PlayerMerchandiseApi;
102
+ class PlayerYearSummaryApi extends BaseApi {
103
+ getBasicInfo(query, options) {
104
+ return this.get("/player/year-summary/basic-info", query, options);
105
+ }
106
+ getLoginStats(query, options) {
107
+ return this.get("/player/year-summary/login-stats", query, options);
108
+ }
109
+ getGameStats(query, options) {
110
+ return this.get("/player/year-summary/game-stats", query, options);
111
+ }
112
+ getRankData(query, options) {
113
+ return this.get("/player/year-summary/rank-data", query, options);
114
+ }
115
+ getCurrencyData(query, options) {
116
+ return this.get("/player/year-summary/currency-data", query, options);
117
+ }
118
+ getSocialData(query, options) {
119
+ return this.get("/player/year-summary/social-data", query, options);
120
+ }
121
+ }
122
+ exports.PlayerYearSummaryApi = PlayerYearSummaryApi;
123
+ class PlayerVoteApi extends BaseApi {
124
+ processRewards(query, options) {
125
+ return this.get("/player/vote", query, options);
126
+ }
127
+ }
128
+ exports.PlayerVoteApi = PlayerVoteApi;
129
+ class PlayerApi extends BaseApi {
130
+ constructor(http) {
131
+ super(http);
132
+ this.score = new PlayerScoreApi(http);
133
+ this.tasks = new PlayerTasksApi(http);
134
+ this.merchandise = new PlayerMerchandiseApi(http);
135
+ this.yearSummary = new PlayerYearSummaryApi(http);
136
+ this.vote = new PlayerVoteApi(http);
137
+ }
138
+ getInfo(query, options) {
139
+ return this.get("/player/info", query, options);
140
+ }
141
+ searchEcid(query, options) {
142
+ return this.get("/player/searchecid", query, options);
143
+ }
144
+ getUserData(query, options) {
145
+ return this.get("/player/userdata", query, options);
146
+ }
147
+ queryNetease(query, options) {
148
+ return this.get("/player/querynetease", query, options);
149
+ }
150
+ setRankLevel(payload, options) {
151
+ return this.post("/player/ranklevel", payload, options);
152
+ }
153
+ clearRespackCache(query, options) {
154
+ return this.delete("/player/respack/cache", query, options);
155
+ }
156
+ getWallet(query, options) {
157
+ return this.get("/player/wallet", query, options);
158
+ }
159
+ listGamingTags(query, options) {
160
+ return this.get("/player/gaming-tag", query, options);
161
+ }
162
+ operateGamingTag(payload, options) {
163
+ return this.post("/player/gaming-tag", payload, options);
164
+ }
165
+ getLastPlayed(query, options) {
166
+ return this.get("/player/last-played", query, options);
167
+ }
168
+ getStageRecord(query, options) {
169
+ return this.get("/player/stage/record", query, options);
170
+ }
171
+ getHeadicon(query, options) {
172
+ return this.http.request("GET", "/player/headicon", {
173
+ ...options,
174
+ query,
175
+ responseType: "arrayBuffer",
176
+ });
177
+ }
178
+ getSkin(query, options) {
179
+ return this.http.request("GET", "/player/skin", {
180
+ ...options,
181
+ query,
182
+ responseType: "arrayBuffer",
183
+ });
184
+ }
185
+ batchNeteaseNicknames(payload, options) {
186
+ return this.post("/player/neteasenicknames", payload, options);
187
+ }
188
+ getBinding(query, options) {
189
+ return this.get("/player/binding", query, options);
190
+ }
191
+ resetBinding(payload, options) {
192
+ return this.post("/player/reset-binding", payload, options);
193
+ }
194
+ updateBinding(payload, options) {
195
+ return this.post("/player/update-binding", payload, options);
196
+ }
197
+ updateUserData(nick, payload, options) {
198
+ return this.post(`/player/update/${encodeURIComponent(nick)}`, payload, options);
199
+ }
200
+ updatePassword(ecid, payload, options) {
201
+ return this.post(`/player/password/${encodeURIComponent(ecid)}`, payload, options);
202
+ }
203
+ getPasswordHash(ecid, query, options) {
204
+ return this.get(`/player/password/${encodeURIComponent(ecid)}`, query, options);
205
+ }
206
+ }
207
+ exports.PlayerApi = PlayerApi;
208
+ class AdminApi extends BaseApi {
209
+ sendMail(payload, options) {
210
+ return this.post("/admin/mail", payload, options);
211
+ }
212
+ prismDeviceBan(payload, options) {
213
+ return this.post("/admin/prism-device-ban", payload, options);
214
+ }
215
+ getPrismDeviceBanLog(query, options) {
216
+ return this.get("/admin/prism-device-ban-log", query, options);
217
+ }
218
+ upsertOverwatchCase(payload, options) {
219
+ return this.post("/admin/overwatch", payload, options);
220
+ }
221
+ getOverwatchCase(query, options) {
222
+ return this.get("/admin/overwatch", query, options);
223
+ }
224
+ getOperationLogs(query, options) {
225
+ return this.get("/admin/operation", query, options);
226
+ }
227
+ getOperationStatistics(query, options) {
228
+ return this.get("/admin/operation/statistic", query, options);
229
+ }
230
+ }
231
+ exports.AdminApi = AdminApi;
232
+ class PunishApi extends BaseApi {
233
+ hack(payload, options) {
234
+ return this.post("/punish/hack", payload, options);
235
+ }
236
+ ban(payload, options) {
237
+ return this.post("/punish/ban", payload, options);
238
+ }
239
+ unban(payload, options) {
240
+ return this.post("/punish/unban", payload, options);
241
+ }
242
+ mute(payload, options) {
243
+ return this.post("/punish/mute", payload, options);
244
+ }
245
+ unmute(payload, options) {
246
+ return this.post("/punish/unmute", payload, options);
247
+ }
248
+ warn(payload, options) {
249
+ return this.post("/punish/warn", payload, options);
250
+ }
251
+ kick(payload, options) {
252
+ return this.post("/punish/kick", payload, options);
253
+ }
254
+ clearDegree(payload, options) {
255
+ return this.post("/punish/clear-degree", payload, options);
256
+ }
257
+ overwatch(payload, options) {
258
+ return this.post("/punish/overwatch", payload, options);
259
+ }
260
+ }
261
+ exports.PunishApi = PunishApi;
262
+ class BanApi extends BaseApi {
263
+ ban(payload, options) {
264
+ return this.post("/ban", payload, options);
265
+ }
266
+ clearDegree(payload, options) {
267
+ return this.post("/ban/clear-degree", payload, options);
268
+ }
269
+ parkourPunish(query, payload, options) {
270
+ return this.http.request("POST", "/ban/parkour-punish", {
271
+ ...options,
272
+ query,
273
+ body: payload,
274
+ });
275
+ }
276
+ }
277
+ exports.BanApi = BanApi;
278
+ class PermissionApi extends BaseApi {
279
+ getPermission(query, options) {
280
+ return super.get("/permission", query, options);
281
+ }
282
+ upsert(payload, options) {
283
+ return this.post("/permission", payload, options);
284
+ }
285
+ deleteOne(query, options) {
286
+ return this.delete("/permission", query, options);
287
+ }
288
+ }
289
+ exports.PermissionApi = PermissionApi;
290
+ class LogApi extends BaseApi {
291
+ getAction(query, options) {
292
+ return this.get("/log/action", query, options);
293
+ }
294
+ getChat(query, options) {
295
+ return this.get("/log/chat", query, options);
296
+ }
297
+ getAuth(query, options) {
298
+ return this.get("/log/auth", query, options);
299
+ }
300
+ getTeaming(query, options) {
301
+ return this.get("/log/teaming", query, options);
302
+ }
303
+ getLatestTeaming(query, options) {
304
+ return this.get("/log/latestTeaming", query, options);
305
+ }
306
+ getCommand(query, options) {
307
+ return this.get("/log/command", query, options);
308
+ }
309
+ getMail(query, options) {
310
+ return this.get("/log/mail", query, options);
311
+ }
312
+ }
313
+ exports.LogApi = LogApi;
314
+ class OrderApi extends BaseApi {
315
+ getDeliver(query, options) {
316
+ return this.get("/order/deliver", query, options);
317
+ }
318
+ getLogs(query, options) {
319
+ return this.get("/order/logs", query, options);
320
+ }
321
+ getExchangeLogs(query, options) {
322
+ return this.get("/order/exchange-logs", query, options);
323
+ }
324
+ getDownloadCount(query, options) {
325
+ return this.get("/order/download/count", query, options);
326
+ }
327
+ createDownloadTask(query, payload, options) {
328
+ return this.http.request("POST", "/order/download/create", {
329
+ ...options,
330
+ query,
331
+ body: payload,
332
+ });
333
+ }
334
+ getDownloadStatus(query, options) {
335
+ return this.get("/order/download/status", query, options);
336
+ }
337
+ listDownloadTasks(query, options) {
338
+ return this.get("/order/download/list", query, options);
339
+ }
340
+ }
341
+ exports.OrderApi = OrderApi;
342
+ class StageLogApi extends BaseApi {
343
+ list(query, options) {
344
+ return this.get("/stage/log/list", query, options);
345
+ }
346
+ query(query, options) {
347
+ return this.get("/stage/log/query", query, options);
348
+ }
349
+ }
350
+ exports.StageLogApi = StageLogApi;
351
+ class StageApi extends BaseApi {
352
+ constructor(http) {
353
+ super(http);
354
+ this.logs = new StageLogApi(http);
355
+ }
356
+ getTypes(query, options) {
357
+ return this.get("/stage/types", query, options);
358
+ }
359
+ create(payload, options) {
360
+ return this.post("/stage/create", payload, options);
361
+ }
362
+ getInfo(query, options) {
363
+ return this.get("/stage/info", query, options);
364
+ }
365
+ getDbId(query, options) {
366
+ return this.get("/stage/db-id", query, options);
367
+ }
368
+ }
369
+ exports.StageApi = StageApi;
370
+ class ItemApi extends BaseApi {
371
+ getCommodity(query, options) {
372
+ return this.get("/item/commodity", query, options);
373
+ }
374
+ }
375
+ exports.ItemApi = ItemApi;
376
+ class CountApi extends BaseApi {
377
+ getHistory(query, options) {
378
+ return this.get("/count/history", query, options);
379
+ }
380
+ getLatest(query, options) {
381
+ return this.get("/count/latest", query, options);
382
+ }
383
+ getTypes(query, options) {
384
+ return this.get("/count/types", query, options);
385
+ }
386
+ }
387
+ exports.CountApi = CountApi;
388
+ class ServersApi extends BaseApi {
389
+ list(query, options) {
390
+ return this.get("/servers", query, options);
391
+ }
392
+ getStatistics(query, options) {
393
+ return this.get("/servers/statistics", query, options);
394
+ }
395
+ getMainstackEvent(query, options) {
396
+ return this.get("/servers/mainstack-event", query, options);
397
+ }
398
+ }
399
+ exports.ServersApi = ServersApi;
400
+ class LobbyApi extends BaseApi {
401
+ list(query, options) {
402
+ return this.get("/lobby/list", query, options);
403
+ }
404
+ }
405
+ exports.LobbyApi = LobbyApi;
406
+ class CfgLangApi extends BaseApi {
407
+ list(query, options) {
408
+ return this.get("/cfglang", query, options);
409
+ }
410
+ compare(query, options) {
411
+ return this.get("/cfglang/compare", query, options);
412
+ }
413
+ deploy(payload, options) {
414
+ return this.post("/cfglang/deploy", payload, options);
415
+ }
416
+ create(query, payload, options) {
417
+ return this.http.request("POST", "/cfglang", { ...options, query, body: payload });
418
+ }
419
+ update(query, payload, options) {
420
+ return this.http.request("PATCH", "/cfglang", { ...options, query, body: payload });
421
+ }
422
+ deleteOne(query, options) {
423
+ return this.delete("/cfglang", query, options);
424
+ }
425
+ }
426
+ exports.CfgLangApi = CfgLangApi;
427
+ class GlobalKVApi extends BaseApi {
428
+ list(query, options) {
429
+ return this.get("/globalkv", query, options);
430
+ }
431
+ getOne(key, query, options) {
432
+ return this.get(`/globalkv/${encodeURIComponent(key)}`, query, options);
433
+ }
434
+ create(payload, options) {
435
+ return this.post("/globalkv", payload, options);
436
+ }
437
+ update(key, payload, options) {
438
+ return this.put(`/globalkv/${encodeURIComponent(key)}`, payload, options);
439
+ }
440
+ deleteOne(key, query, options) {
441
+ return this.delete(`/globalkv/${encodeURIComponent(key)}`, query, options);
442
+ }
443
+ deleteBatch(payload, options) {
444
+ return this.http.request("DELETE", "/globalkv", { ...options, body: payload });
445
+ }
446
+ }
447
+ exports.GlobalKVApi = GlobalKVApi;
448
+ class BroadcastApi extends BaseApi {
449
+ list(query, options) {
450
+ return this.get("/broadcast", query, options);
451
+ }
452
+ compare(query, options) {
453
+ return this.get("/broadcast/compare", query, options);
454
+ }
455
+ deploy(payload, options) {
456
+ return this.post("/broadcast/deploy", payload, options);
457
+ }
458
+ getOne(msg, query, options) {
459
+ return this.get(`/broadcast/${encodeURIComponent(msg)}`, query, options);
460
+ }
461
+ create(payload, options) {
462
+ return this.post("/broadcast", payload, options);
463
+ }
464
+ update(msg, payload, options) {
465
+ return this.put(`/broadcast/${encodeURIComponent(msg)}`, payload, options);
466
+ }
467
+ deleteOne(msg, payload, options) {
468
+ return this.http.request("DELETE", `/broadcast/${encodeURIComponent(msg)}`, {
469
+ ...options,
470
+ body: payload,
471
+ });
472
+ }
473
+ }
474
+ exports.BroadcastApi = BroadcastApi;
475
+ class EaseChatApi extends BaseApi {
476
+ sendHlaba(payload, options) {
477
+ return this.post("/easechat/hlaba", payload, options);
478
+ }
479
+ listSubscriptions(query, options) {
480
+ return this.get("/easechat/subscriptions", query, options);
481
+ }
482
+ createSubscription(payload, options) {
483
+ return this.post("/easechat/subscriptions", payload, options);
484
+ }
485
+ deleteSubscription(query, options) {
486
+ return this.delete("/easechat/subscriptions", query, options);
487
+ }
488
+ }
489
+ exports.EaseChatApi = EaseChatApi;
490
+ class AuditApi extends BaseApi {
491
+ getAuthLogs(query, options) {
492
+ return this.get("/audit/auth", query, options);
493
+ }
494
+ getPlayerLogs(query, options) {
495
+ return this.get("/audit/player", query, options);
496
+ }
497
+ getPunishmentLogs(query, options) {
498
+ return this.get("/audit/punishment", query, options);
499
+ }
500
+ getPermissionLogs(query, options) {
501
+ return this.get("/audit/permission", query, options);
502
+ }
503
+ getAdminLogs(query, options) {
504
+ return this.get("/audit/admin", query, options);
505
+ }
506
+ getConfigLogs(query, options) {
507
+ return this.get("/audit/config", query, options);
508
+ }
509
+ }
510
+ exports.AuditApi = AuditApi;
511
+ class SpamDetectorApi extends BaseApi {
512
+ getStatus(query, options) {
513
+ return this.get("/monitor/spam-detector/status", query, options);
514
+ }
515
+ control(payload, options) {
516
+ return this.post("/monitor/spam-detector/control", payload, options);
517
+ }
518
+ getStats(query, options) {
519
+ return this.get("/monitor/spam-detector/stats", query, options);
520
+ }
521
+ }
522
+ exports.SpamDetectorApi = SpamDetectorApi;
523
+ class MonitorApi extends BaseApi {
524
+ constructor(http) {
525
+ super(http);
526
+ this.spamDetector = new SpamDetectorApi(http);
527
+ }
528
+ }
529
+ exports.MonitorApi = MonitorApi;
530
+ class PullConfigApi extends BaseApi {
531
+ pull(query, options) {
532
+ return this.get("/pull-config", query, options);
533
+ }
534
+ }
535
+ exports.PullConfigApi = PullConfigApi;
536
+ class SystemApi extends BaseApi {
537
+ getRoot(query, options) {
538
+ return this.get("/", query, { ...options, responseType: "text" });
539
+ }
540
+ getHealth(query, options) {
541
+ return this.get("/health", query, options);
542
+ }
543
+ }
544
+ exports.SystemApi = SystemApi;
package/dist/http.d.ts ADDED
@@ -0,0 +1,21 @@
1
+ import { AuthCredentials, ClientOptions, RequestOptions } from "./types";
2
+ type HttpMethod = "GET" | "POST" | "PUT" | "PATCH" | "DELETE";
3
+ export declare class ECAPIError extends Error {
4
+ readonly status: number;
5
+ readonly payload: unknown;
6
+ readonly url: string;
7
+ constructor(message: string, status: number, payload: unknown, url: string);
8
+ }
9
+ export declare class ECAPIHttpClient {
10
+ private readonly baseUrl;
11
+ private readonly defaultHeaders;
12
+ private readonly timeoutMs;
13
+ private auth?;
14
+ constructor(options: ClientOptions);
15
+ setAuth(auth?: AuthCredentials): void;
16
+ clearAuth(): void;
17
+ setApiKey(apiKey: string): void;
18
+ setAppSessionToken(appSessionToken: string): void;
19
+ request<T = unknown>(method: HttpMethod, path: string, options?: RequestOptions): Promise<T>;
20
+ }
21
+ export {};
package/dist/http.js ADDED
@@ -0,0 +1,167 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ECAPIHttpClient = exports.ECAPIError = void 0;
4
+ function normalizeBaseUrl(baseUrl) {
5
+ return baseUrl.endsWith("/") ? baseUrl.slice(0, -1) : baseUrl;
6
+ }
7
+ function toQueryString(query) {
8
+ if (!query) {
9
+ return "";
10
+ }
11
+ const params = new URLSearchParams();
12
+ for (const [key, rawValue] of Object.entries(query)) {
13
+ if (rawValue === undefined || rawValue === null) {
14
+ continue;
15
+ }
16
+ if (Array.isArray(rawValue)) {
17
+ for (const item of rawValue) {
18
+ if (item !== undefined && item !== null) {
19
+ params.append(key, String(item));
20
+ }
21
+ }
22
+ continue;
23
+ }
24
+ params.append(key, String(rawValue));
25
+ }
26
+ const value = params.toString();
27
+ return value ? `?${value}` : "";
28
+ }
29
+ function createAbortSignal(timeoutMs, signal) {
30
+ if (!timeoutMs || timeoutMs <= 0) {
31
+ return {
32
+ signal,
33
+ cleanup: () => undefined,
34
+ };
35
+ }
36
+ const timeoutController = new AbortController();
37
+ const timeoutId = setTimeout(() => timeoutController.abort(), timeoutMs);
38
+ if (signal) {
39
+ const onAbort = () => timeoutController.abort();
40
+ signal.addEventListener("abort", onAbort, { once: true });
41
+ return {
42
+ signal: timeoutController.signal,
43
+ cleanup: () => {
44
+ clearTimeout(timeoutId);
45
+ signal.removeEventListener("abort", onAbort);
46
+ },
47
+ };
48
+ }
49
+ return {
50
+ signal: timeoutController.signal,
51
+ cleanup: () => clearTimeout(timeoutId),
52
+ };
53
+ }
54
+ function applyAuth(headers, auth) {
55
+ if (!auth) {
56
+ return;
57
+ }
58
+ if (auth.type === "apiKey") {
59
+ headers["X-API-Key"] = auth.apiKey;
60
+ return;
61
+ }
62
+ headers["X-App-Session-Token"] = auth.appSessionToken;
63
+ }
64
+ async function parseBody(response, responseType) {
65
+ if (responseType === "raw") {
66
+ return response;
67
+ }
68
+ if (responseType === "arrayBuffer") {
69
+ return response.arrayBuffer();
70
+ }
71
+ if (responseType === "text") {
72
+ return response.text();
73
+ }
74
+ if (response.status === 204) {
75
+ return null;
76
+ }
77
+ const contentType = response.headers.get("content-type") || "";
78
+ if (contentType.includes("application/json")) {
79
+ return response.json();
80
+ }
81
+ const text = await response.text();
82
+ if (!text) {
83
+ return null;
84
+ }
85
+ try {
86
+ return JSON.parse(text);
87
+ }
88
+ catch {
89
+ return text;
90
+ }
91
+ }
92
+ class ECAPIError extends Error {
93
+ constructor(message, status, payload, url) {
94
+ super(message);
95
+ this.name = "ECAPIError";
96
+ this.status = status;
97
+ this.payload = payload;
98
+ this.url = url;
99
+ }
100
+ }
101
+ exports.ECAPIError = ECAPIError;
102
+ class ECAPIHttpClient {
103
+ constructor(options) {
104
+ this.baseUrl = normalizeBaseUrl(options.baseUrl);
105
+ this.defaultHeaders = { ...(options.defaultHeaders || {}) };
106
+ this.timeoutMs = options.timeoutMs ?? 15000;
107
+ this.auth = options.auth;
108
+ }
109
+ setAuth(auth) {
110
+ this.auth = auth;
111
+ }
112
+ clearAuth() {
113
+ this.auth = undefined;
114
+ }
115
+ setApiKey(apiKey) {
116
+ this.auth = { type: "apiKey", apiKey };
117
+ }
118
+ setAppSessionToken(appSessionToken) {
119
+ this.auth = { type: "appSessionToken", appSessionToken };
120
+ }
121
+ async request(method, path, options = {}) {
122
+ const requestPath = path.startsWith("/") ? path : `/${path}`;
123
+ const queryString = toQueryString(options.query);
124
+ const url = `${this.baseUrl}${requestPath}${queryString}`;
125
+ const headers = {
126
+ Accept: "application/json",
127
+ ...this.defaultHeaders,
128
+ ...(options.headers || {}),
129
+ };
130
+ applyAuth(headers, options.auth === undefined ? this.auth : options.auth);
131
+ const init = {
132
+ method,
133
+ headers,
134
+ };
135
+ if (options.body !== undefined) {
136
+ if (!headers["Content-Type"]) {
137
+ headers["Content-Type"] = "application/json";
138
+ }
139
+ init.body =
140
+ headers["Content-Type"].includes("application/json") &&
141
+ typeof options.body !== "string"
142
+ ? JSON.stringify(options.body)
143
+ : options.body;
144
+ }
145
+ const { signal, cleanup } = createAbortSignal(this.timeoutMs, options.signal);
146
+ init.signal = signal;
147
+ let response;
148
+ try {
149
+ response = await fetch(url, init);
150
+ }
151
+ catch (error) {
152
+ cleanup();
153
+ if (error instanceof Error && error.name === "AbortError") {
154
+ throw new ECAPIError("Request timeout or aborted", 0, null, url);
155
+ }
156
+ throw new ECAPIError("Network request failed", 0, error, url);
157
+ }
158
+ cleanup();
159
+ const responseType = options.responseType ?? "json";
160
+ const payload = await parseBody(response, responseType);
161
+ if (!response.ok) {
162
+ throw new ECAPIError(`Request failed with status ${response.status}`, response.status, payload, url);
163
+ }
164
+ return payload;
165
+ }
166
+ }
167
+ exports.ECAPIHttpClient = ECAPIHttpClient;
@@ -0,0 +1,36 @@
1
+ import { ECAPIError } from "./http";
2
+ import { AdminApi, AuditApi, BanApi, BroadcastApi, CfgLangApi, CountApi, EaseChatApi, GlobalKVApi, ItemApi, LobbyApi, LogApi, MonitorApi, OrderApi, PermissionApi, PlayerApi, PullConfigApi, PunishApi, ServersApi, StageApi, SystemApi, UserApi } from "./apis";
3
+ import { AuthCredentials, ClientOptions, RequestOptions } from "./types";
4
+ type HttpMethod = "GET" | "POST" | "PUT" | "PATCH" | "DELETE";
5
+ export declare class ECAPIClient {
6
+ private readonly http;
7
+ readonly user: UserApi;
8
+ readonly player: PlayerApi;
9
+ readonly admin: AdminApi;
10
+ readonly punish: PunishApi;
11
+ readonly ban: BanApi;
12
+ readonly permission: PermissionApi;
13
+ readonly log: LogApi;
14
+ readonly order: OrderApi;
15
+ readonly stage: StageApi;
16
+ readonly item: ItemApi;
17
+ readonly count: CountApi;
18
+ readonly servers: ServersApi;
19
+ readonly lobby: LobbyApi;
20
+ readonly cfglang: CfgLangApi;
21
+ readonly globalkv: GlobalKVApi;
22
+ readonly broadcast: BroadcastApi;
23
+ readonly easechat: EaseChatApi;
24
+ readonly audit: AuditApi;
25
+ readonly monitor: MonitorApi;
26
+ readonly pullConfig: PullConfigApi;
27
+ readonly system: SystemApi;
28
+ constructor(options: ClientOptions);
29
+ setAuth(auth?: AuthCredentials): void;
30
+ setApiKey(apiKey: string): void;
31
+ setAppSessionToken(appSessionToken: string): void;
32
+ clearAuth(): void;
33
+ request<T = unknown>(method: HttpMethod, path: string, options?: RequestOptions): Promise<T>;
34
+ }
35
+ export * from "./types";
36
+ export { ECAPIError };
package/dist/index.js ADDED
@@ -0,0 +1,63 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ exports.ECAPIError = exports.ECAPIClient = void 0;
18
+ const http_1 = require("./http");
19
+ Object.defineProperty(exports, "ECAPIError", { enumerable: true, get: function () { return http_1.ECAPIError; } });
20
+ const apis_1 = require("./apis");
21
+ class ECAPIClient {
22
+ constructor(options) {
23
+ this.http = new http_1.ECAPIHttpClient(options);
24
+ this.user = new apis_1.UserApi(this.http);
25
+ this.player = new apis_1.PlayerApi(this.http);
26
+ this.admin = new apis_1.AdminApi(this.http);
27
+ this.punish = new apis_1.PunishApi(this.http);
28
+ this.ban = new apis_1.BanApi(this.http);
29
+ this.permission = new apis_1.PermissionApi(this.http);
30
+ this.log = new apis_1.LogApi(this.http);
31
+ this.order = new apis_1.OrderApi(this.http);
32
+ this.stage = new apis_1.StageApi(this.http);
33
+ this.item = new apis_1.ItemApi(this.http);
34
+ this.count = new apis_1.CountApi(this.http);
35
+ this.servers = new apis_1.ServersApi(this.http);
36
+ this.lobby = new apis_1.LobbyApi(this.http);
37
+ this.cfglang = new apis_1.CfgLangApi(this.http);
38
+ this.globalkv = new apis_1.GlobalKVApi(this.http);
39
+ this.broadcast = new apis_1.BroadcastApi(this.http);
40
+ this.easechat = new apis_1.EaseChatApi(this.http);
41
+ this.audit = new apis_1.AuditApi(this.http);
42
+ this.monitor = new apis_1.MonitorApi(this.http);
43
+ this.pullConfig = new apis_1.PullConfigApi(this.http);
44
+ this.system = new apis_1.SystemApi(this.http);
45
+ }
46
+ setAuth(auth) {
47
+ this.http.setAuth(auth);
48
+ }
49
+ setApiKey(apiKey) {
50
+ this.http.setApiKey(apiKey);
51
+ }
52
+ setAppSessionToken(appSessionToken) {
53
+ this.http.setAppSessionToken(appSessionToken);
54
+ }
55
+ clearAuth() {
56
+ this.http.clearAuth();
57
+ }
58
+ request(method, path, options) {
59
+ return this.http.request(method, path, options);
60
+ }
61
+ }
62
+ exports.ECAPIClient = ECAPIClient;
63
+ __exportStar(require("./types"), exports);
@@ -0,0 +1,26 @@
1
+ export type Primitive = string | number | boolean | null | undefined;
2
+ export type QueryValue = Primitive | Primitive[];
3
+ export type QueryParams = Record<string, QueryValue>;
4
+ export type HeaderMap = Record<string, string>;
5
+ export type ResponseType = "json" | "text" | "arrayBuffer" | "raw";
6
+ export type AuthCredentials = {
7
+ type: "apiKey";
8
+ apiKey: string;
9
+ } | {
10
+ type: "appSessionToken";
11
+ appSessionToken: string;
12
+ };
13
+ export interface ClientOptions {
14
+ baseUrl: string;
15
+ auth?: AuthCredentials;
16
+ timeoutMs?: number;
17
+ defaultHeaders?: HeaderMap;
18
+ }
19
+ export interface RequestOptions {
20
+ query?: QueryParams;
21
+ body?: unknown;
22
+ headers?: HeaderMap;
23
+ signal?: AbortSignal;
24
+ responseType?: ResponseType;
25
+ auth?: AuthCredentials | null;
26
+ }
package/dist/types.js ADDED
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
package/package.json ADDED
@@ -0,0 +1,27 @@
1
+ {
2
+ "name": "@easecation/ecapi-sdk",
3
+ "version": "0.1.0",
4
+ "description": "ECAPI SDK for JavaScript and TypeScript",
5
+ "main": "dist/index.js",
6
+ "types": "dist/index.d.ts",
7
+ "files": [
8
+ "dist",
9
+ "README.md"
10
+ ],
11
+ "scripts": {
12
+ "build": "tsc -p tsconfig.json"
13
+ },
14
+ "keywords": [
15
+ "ecapi",
16
+ "easecation",
17
+ "sdk",
18
+ "typescript"
19
+ ],
20
+ "license": "MIT",
21
+ "engines": {
22
+ "node": ">=18"
23
+ },
24
+ "devDependencies": {
25
+ "typescript": "^5.9.3"
26
+ }
27
+ }