yeow-api 0.2.7 → 0.2.9
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/package.json +3 -4
- package/src/assets.ts +42 -0
- package/src/event.ts +241 -26
- package/src/fs.ts +56 -19
- package/src/http.ts +44 -50
- package/src/index.ts +14 -0
- package/src/lifecycle.ts +8 -0
- package/src/task.ts +8 -4
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "yeow-api",
|
|
3
|
-
"version": "0.2.
|
|
4
|
-
"description": "Yeow API �?TypeScript OOP wrappers over the task protocol",
|
|
3
|
+
"version": "0.2.9",
|
|
4
|
+
"description": "Yeow API �?TypeScript OOP wrappers over the task protocol",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./src/index.ts",
|
|
7
7
|
"types": "./src/index.ts",
|
|
@@ -9,5 +9,4 @@
|
|
|
9
9
|
"src/"
|
|
10
10
|
],
|
|
11
11
|
"license": "MIT"
|
|
12
|
-
}
|
|
13
|
-
|
|
12
|
+
}
|
package/src/assets.ts
ADDED
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
function _sendAssets(payload) {
|
|
2
|
+
const raw = $send('assets', JSON.stringify(payload));
|
|
3
|
+
if (!raw) return undefined;
|
|
4
|
+
const r = JSON.parse(raw);
|
|
5
|
+
if (r.err) throw new Error(r.err);
|
|
6
|
+
return r;
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
export function read(path) {
|
|
10
|
+
return new Promise((resolve, reject) => {
|
|
11
|
+
try { const r = _sendAssets({ t: 'read', p: { path } }); resolve(r.data); } catch(e) { reject(e); }
|
|
12
|
+
});
|
|
13
|
+
}
|
|
14
|
+
export function readSync(path) {
|
|
15
|
+
return _sendAssets({ t: 'read', p: { path } }).data;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
export function readBase64(path) {
|
|
19
|
+
return new Promise((resolve, reject) => {
|
|
20
|
+
try { const r = _sendAssets({ t: 'readBase64', p: { path } }); resolve(r.data); } catch(e) { reject(e); }
|
|
21
|
+
});
|
|
22
|
+
}
|
|
23
|
+
export function readBase64Sync(path) {
|
|
24
|
+
return _sendAssets({ t: 'readBase64', p: { path } }).data;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
export function extract(path, dest) {
|
|
28
|
+
return new Promise((resolve, reject) => {
|
|
29
|
+
try {
|
|
30
|
+
const p = { path };
|
|
31
|
+
if (dest) p.dest = dest;
|
|
32
|
+
const r = _sendAssets({ t: 'extract', p }); resolve(r.path);
|
|
33
|
+
} catch(e) { reject(e); }
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
export function extractSync(path, dest) {
|
|
37
|
+
const p = { path };
|
|
38
|
+
if (dest) p.dest = dest;
|
|
39
|
+
return _sendAssets({ t: 'extract', p }).path;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
export const assets = { read, readSync, readBase64, readBase64Sync, extract, extractSync };
|
package/src/event.ts
CHANGED
|
@@ -1,11 +1,226 @@
|
|
|
1
1
|
import { call } from './task.js';
|
|
2
|
+
import { Player } from './player.js';
|
|
3
|
+
import { Location } from './location.js';
|
|
4
|
+
|
|
5
|
+
// ── Event Typed Interfaces ─────────────────────────────────────────
|
|
6
|
+
|
|
7
|
+
export interface PlayerJoinEvent {
|
|
8
|
+
player: Player;
|
|
9
|
+
joinMessage: string;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
export interface PlayerQuitEvent {
|
|
13
|
+
player: Player;
|
|
14
|
+
quitMessage: string;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
export interface PlayerChatEvent {
|
|
18
|
+
player: Player;
|
|
19
|
+
message: string;
|
|
20
|
+
format: string;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
export interface PlayerMoveEvent {
|
|
24
|
+
player: Player;
|
|
25
|
+
from: Location;
|
|
26
|
+
to: Location;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
export interface PlayerInteractEvent {
|
|
30
|
+
player: Player;
|
|
31
|
+
action: string;
|
|
32
|
+
material: string | null;
|
|
33
|
+
block: { x: number; y: number; z: number; type: string } | null;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
export interface PlayerCommandEvent {
|
|
37
|
+
player: Player;
|
|
38
|
+
message: string;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
export interface PlayerDeathEvent {
|
|
42
|
+
player: Player;
|
|
43
|
+
deathMessage: string;
|
|
44
|
+
deathType: string;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
export interface PlayerRespawnEvent {
|
|
48
|
+
player: Player;
|
|
49
|
+
respawnLocation: Location;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
export interface PlayerDropItemEvent {
|
|
53
|
+
player: Player;
|
|
54
|
+
itemType: string;
|
|
55
|
+
amount: number;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
export interface PlayerPickupItemEvent {
|
|
59
|
+
player: Player;
|
|
60
|
+
itemType: string;
|
|
61
|
+
amount: number;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
export interface PlayerBucketFillEvent {
|
|
65
|
+
player: Player;
|
|
66
|
+
bucket: string;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
export interface PlayerBucketEmptyEvent {
|
|
70
|
+
player: Player;
|
|
71
|
+
bucket: string;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
export interface PlayerExpChangeEvent {
|
|
75
|
+
player: Player;
|
|
76
|
+
amount: number;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
export interface PlayerLevelChangeEvent {
|
|
80
|
+
player: Player;
|
|
81
|
+
oldLevel: number;
|
|
82
|
+
newLevel: number;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
export interface PlayerGameModeChangeEvent {
|
|
86
|
+
player: Player;
|
|
87
|
+
newGameMode: string;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
export interface FoodLevelChangeEvent {
|
|
91
|
+
player: Player;
|
|
92
|
+
oldFoodLevel: number;
|
|
93
|
+
newFoodLevel: number;
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
export interface EntityDamageEvent {
|
|
97
|
+
entity: string;
|
|
98
|
+
damage: number;
|
|
99
|
+
cause: string;
|
|
100
|
+
entityType: string;
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
export interface EntityDeathEvent {
|
|
104
|
+
entity: string;
|
|
105
|
+
entityType: string;
|
|
106
|
+
entityName: string;
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
export interface EntitySpawnEvent {
|
|
110
|
+
entity: string;
|
|
111
|
+
entityType: string;
|
|
112
|
+
x: number;
|
|
113
|
+
y: number;
|
|
114
|
+
z: number;
|
|
115
|
+
world: string;
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
export interface ProjectileLaunchEvent {
|
|
119
|
+
entity: string;
|
|
120
|
+
projectileType: string;
|
|
121
|
+
shooter?: string;
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
export interface BlockBreakEvent {
|
|
125
|
+
player: Player;
|
|
126
|
+
block: string;
|
|
127
|
+
x: number;
|
|
128
|
+
y: number;
|
|
129
|
+
z: number;
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
export interface BlockPlaceEvent {
|
|
133
|
+
player: Player;
|
|
134
|
+
block: string;
|
|
135
|
+
blockAgainst: string;
|
|
136
|
+
x: number;
|
|
137
|
+
y: number;
|
|
138
|
+
z: number;
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
export interface InventoryOpenEvent {
|
|
142
|
+
player: Player;
|
|
143
|
+
inventoryType: string;
|
|
144
|
+
title: string;
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
export interface InventoryCloseEvent {
|
|
148
|
+
player: Player;
|
|
149
|
+
inventoryType: string;
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
export interface ServerPingEvent {
|
|
153
|
+
address: string;
|
|
154
|
+
numPlayers: number;
|
|
155
|
+
maxPlayers: number;
|
|
156
|
+
motd: string;
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
// ── Event Type Mapping ─────────────────────────────────────────────
|
|
160
|
+
|
|
161
|
+
type EventMap = {
|
|
162
|
+
playerJoin: PlayerJoinEvent;
|
|
163
|
+
playerQuit: PlayerQuitEvent;
|
|
164
|
+
playerChat: PlayerChatEvent;
|
|
165
|
+
playerMove: PlayerMoveEvent;
|
|
166
|
+
playerInteract: PlayerInteractEvent;
|
|
167
|
+
playerCommand: PlayerCommandEvent;
|
|
168
|
+
playerDeath: PlayerDeathEvent;
|
|
169
|
+
playerRespawn: PlayerRespawnEvent;
|
|
170
|
+
playerDropItem: PlayerDropItemEvent;
|
|
171
|
+
playerPickupItem: PlayerPickupItemEvent;
|
|
172
|
+
playerBucketFill: PlayerBucketFillEvent;
|
|
173
|
+
playerBucketEmpty: PlayerBucketEmptyEvent;
|
|
174
|
+
playerExpChange: PlayerExpChangeEvent;
|
|
175
|
+
playerLevelChange: PlayerLevelChangeEvent;
|
|
176
|
+
playerGameModeChange: PlayerGameModeChangeEvent;
|
|
177
|
+
foodLevelChange: FoodLevelChangeEvent;
|
|
178
|
+
entityDamage: EntityDamageEvent;
|
|
179
|
+
entityDeath: EntityDeathEvent;
|
|
180
|
+
entitySpawn: EntitySpawnEvent;
|
|
181
|
+
projectileLaunch: ProjectileLaunchEvent;
|
|
182
|
+
blockBreak: BlockBreakEvent;
|
|
183
|
+
blockPlace: BlockPlaceEvent;
|
|
184
|
+
inventoryOpen: InventoryOpenEvent;
|
|
185
|
+
inventoryClose: InventoryCloseEvent;
|
|
186
|
+
serverPing: ServerPingEvent;
|
|
187
|
+
};
|
|
188
|
+
|
|
189
|
+
// ── Event Data Adapter ──────────────────────────────────────────────
|
|
190
|
+
|
|
191
|
+
function _loc(raw: any): Location | null {
|
|
192
|
+
if (!raw) return null;
|
|
193
|
+
return new Location(raw.x, raw.y, raw.z, raw.yaw ?? 0, raw.pitch ?? 0, raw.world);
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
function adaptEvent(type: string, data: any): any {
|
|
197
|
+
if (!data) return data;
|
|
198
|
+
const wrap: any = {};
|
|
199
|
+
for (const key of Object.keys(data)) {
|
|
200
|
+
if (key.startsWith('_')) continue;
|
|
201
|
+
wrap[key] = data[key];
|
|
202
|
+
}
|
|
203
|
+
switch (type) {
|
|
204
|
+
case 'playerJoin': case 'playerQuit': case 'playerChat': case 'playerMove':
|
|
205
|
+
case 'playerInteract': case 'playerCommand': case 'playerDeath': case 'playerRespawn':
|
|
206
|
+
case 'playerDropItem': case 'playerPickupItem': case 'playerBucketFill': case 'playerBucketEmpty':
|
|
207
|
+
case 'playerExpChange': case 'playerLevelChange': case 'playerGameModeChange': case 'foodLevelChange':
|
|
208
|
+
case 'blockBreak': case 'blockPlace': case 'inventoryOpen': case 'inventoryClose':
|
|
209
|
+
if (data.player) wrap.player = Player.get(data.player);
|
|
210
|
+
break;
|
|
211
|
+
}
|
|
212
|
+
if (data.from) wrap.from = _loc(data.from);
|
|
213
|
+
if (data.to) wrap.to = _loc(data.to);
|
|
214
|
+
if (data.respawnLocation) wrap.respawnLocation = _loc(data.respawnLocation);
|
|
215
|
+
return wrap;
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
// ── EventOn/EventOff ───────────────────────────────────────────────
|
|
219
|
+
|
|
220
|
+
export function eventOn<K extends keyof EventMap>(eventType: K, handler: (e: EventMap[K]) => void): () => void {
|
|
221
|
+
const wrapper = (data: any) => handler(adaptEvent(eventType, data) as EventMap[K]);
|
|
222
|
+
(wrapper as any)._raw = handler;
|
|
2
223
|
|
|
3
|
-
export function eventOn(eventType: string, handler: (e: any) => void): () => void {
|
|
4
|
-
// eventOn registers a handler on the JS side.
|
|
5
|
-
// The _onEvent function in init.js dispatches SYNC_CALLBACK messages to handlers.
|
|
6
|
-
// For now, event handlers are set up via a global registry.
|
|
7
|
-
// This is a simplified version — full sync callback event system requires
|
|
8
|
-
// the PluginThread to call _onEvent which processes handlers.
|
|
9
224
|
if (!(globalThis as any).__yeowEventHandlers) (globalThis as any).__yeowEventHandlers = {};
|
|
10
225
|
if (!(globalThis as any).__yeowEventHandlers[eventType]) {
|
|
11
226
|
(globalThis as any).__yeowEventHandlers[eventType] = [];
|
|
@@ -14,14 +229,14 @@ export function eventOn(eventType: string, handler: (e: any) => void): () => voi
|
|
|
14
229
|
eventType,
|
|
15
230
|
});
|
|
16
231
|
}
|
|
17
|
-
(globalThis as any).__yeowEventHandlers[eventType].push(
|
|
232
|
+
(globalThis as any).__yeowEventHandlers[eventType].push(wrapper);
|
|
18
233
|
return () => eventOff(eventType, handler);
|
|
19
234
|
}
|
|
20
235
|
|
|
21
|
-
export function eventOff(eventType: string, handler:
|
|
236
|
+
export function eventOff(eventType: string, handler: Function): void {
|
|
22
237
|
const handlers = (globalThis as any).__yeowEventHandlers?.[eventType];
|
|
23
238
|
if (!handlers) return;
|
|
24
|
-
const idx = handlers.
|
|
239
|
+
const idx = handlers.findIndex((h: any) => h._raw === handler || h === handler);
|
|
25
240
|
if (idx !== -1) handlers.splice(idx, 1);
|
|
26
241
|
if (handlers.length === 0) {
|
|
27
242
|
delete (globalThis as any).__yeowEventHandlers[eventType];
|
|
@@ -32,31 +247,31 @@ export function eventOff(eventType: string, handler: (e: any) => void): void {
|
|
|
32
247
|
}
|
|
33
248
|
}
|
|
34
249
|
|
|
35
|
-
//
|
|
36
|
-
|
|
250
|
+
// ── _onEvent dispatcher (called from init.js) ──────────────────────
|
|
251
|
+
|
|
252
|
+
(globalThis as any)._onEvent = (eventType: string, data: any): any => {
|
|
37
253
|
const handlers = (globalThis as any).__yeowEventHandlers?.[eventType];
|
|
38
254
|
if (!handlers?.length) return {};
|
|
39
255
|
|
|
40
|
-
const cancellable =
|
|
256
|
+
const cancellable = data?._cancellable;
|
|
41
257
|
const mods: Record<string, any> = {};
|
|
42
258
|
|
|
259
|
+
const wrapped = adaptEvent(eventType, data);
|
|
260
|
+
|
|
261
|
+
const localMods: Record<string, any> = {};
|
|
262
|
+
if (cancellable) {
|
|
263
|
+
Object.defineProperty(wrapped, 'cancelled', {
|
|
264
|
+
get: () => localMods.cancelled || false,
|
|
265
|
+
set: (v: boolean) => { localMods.cancelled = v; },
|
|
266
|
+
enumerable: true,
|
|
267
|
+
});
|
|
268
|
+
}
|
|
269
|
+
|
|
43
270
|
for (const handler of handlers) {
|
|
44
271
|
try {
|
|
45
|
-
|
|
46
|
-
for (const key of Object.keys(snapshot || {})) {
|
|
47
|
-
if (!key.startsWith('_')) proxy[key] = snapshot[key];
|
|
48
|
-
}
|
|
49
|
-
const localMods: Record<string, any> = {};
|
|
50
|
-
if (cancellable) {
|
|
51
|
-
Object.defineProperty(proxy, 'cancelled', {
|
|
52
|
-
get: () => localMods.cancelled || false,
|
|
53
|
-
set: (v: boolean) => { localMods.cancelled = v; },
|
|
54
|
-
enumerable: true,
|
|
55
|
-
});
|
|
56
|
-
}
|
|
57
|
-
handler(proxy);
|
|
58
|
-
if (cancellable && localMods.cancelled) mods.cancelled = true;
|
|
272
|
+
handler(wrapped);
|
|
59
273
|
} catch (e: any) { console.error('event:', e?.message || e); }
|
|
60
274
|
}
|
|
275
|
+
if (cancellable && localMods.cancelled) mods.cancelled = true;
|
|
61
276
|
return mods;
|
|
62
277
|
};
|
package/src/fs.ts
CHANGED
|
@@ -1,33 +1,70 @@
|
|
|
1
|
-
|
|
1
|
+
function _sendFs(payload) {
|
|
2
|
+
const raw = $send('fs', JSON.stringify(payload));
|
|
3
|
+
if (!raw) return undefined;
|
|
4
|
+
const r = JSON.parse(raw);
|
|
5
|
+
if (r.err) throw new Error(r.err);
|
|
6
|
+
return r;
|
|
7
|
+
}
|
|
2
8
|
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
9
|
+
export function readFile(path) {
|
|
10
|
+
return new Promise((resolve, reject) => {
|
|
11
|
+
try { const r = _sendFs({ t: 'readFile', p: { path } }); resolve(r.data); } catch(e) { reject(e); }
|
|
12
|
+
});
|
|
13
|
+
}
|
|
14
|
+
export function readFileSync(path) {
|
|
15
|
+
return _sendFs({ t: 'readFile', p: { path } }).data;
|
|
16
|
+
}
|
|
7
17
|
|
|
8
|
-
export function
|
|
9
|
-
return
|
|
18
|
+
export function readFileBase64(path) {
|
|
19
|
+
return new Promise((resolve, reject) => {
|
|
20
|
+
try { const r = _sendFs({ t: 'readBase64', p: { path } }); resolve(r.data); } catch(e) { reject(e); }
|
|
21
|
+
});
|
|
22
|
+
}
|
|
23
|
+
export function readFileBase64Sync(path) {
|
|
24
|
+
return _sendFs({ t: 'readBase64', p: { path } }).data;
|
|
10
25
|
}
|
|
11
26
|
|
|
12
|
-
export function
|
|
13
|
-
return
|
|
27
|
+
export function writeFile(path, data) {
|
|
28
|
+
return new Promise((resolve, reject) => {
|
|
29
|
+
try { _sendFs({ t: 'writeFile', p: { path, data } }); resolve(); } catch(e) { reject(e); }
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
export function writeFileSync(path, data) {
|
|
33
|
+
_sendFs({ t: 'writeFile', p: { path, data } });
|
|
14
34
|
}
|
|
15
35
|
|
|
16
|
-
export function
|
|
17
|
-
return
|
|
36
|
+
export function writeFileBase64(path, data) {
|
|
37
|
+
return new Promise((resolve, reject) => {
|
|
38
|
+
try { _sendFs({ t: 'writeBase64', p: { path, data } }); resolve(); } catch(e) { reject(e); }
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
export function writeFileBase64Sync(path, data) {
|
|
42
|
+
_sendFs({ t: 'writeBase64', p: { path, data } });
|
|
18
43
|
}
|
|
19
44
|
|
|
20
|
-
export function
|
|
21
|
-
|
|
45
|
+
export function existsSync(path) {
|
|
46
|
+
const r = _sendFs({ t: 'exists', p: { path } });
|
|
47
|
+
return r === true || String(r) === 'true';
|
|
22
48
|
}
|
|
23
49
|
|
|
24
|
-
export function
|
|
25
|
-
return
|
|
50
|
+
export function deleteFile(path) {
|
|
51
|
+
return new Promise((resolve, reject) => {
|
|
52
|
+
try { const r = _sendFs({ t: 'delete', p: { path } }); resolve(r === true || String(r) === 'true'); } catch(e) { reject(e); }
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
export function mkdir(path) {
|
|
56
|
+
return new Promise((resolve, reject) => {
|
|
57
|
+
try { _sendFs({ t: 'mkdir', p: { path } }); resolve(); } catch(e) { reject(e); }
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
export function list(path) {
|
|
61
|
+
return new Promise((resolve, reject) => {
|
|
62
|
+
try { const r = _sendFs({ t: 'list', p: { path } }); resolve(r); } catch(e) { reject(e); }
|
|
63
|
+
});
|
|
26
64
|
}
|
|
27
65
|
|
|
28
66
|
export const fs = {
|
|
29
|
-
readFile, readFileSync,
|
|
30
|
-
writeFile, writeFileSync,
|
|
31
|
-
existsSync,
|
|
32
|
-
// ... more to come
|
|
67
|
+
readFile, readFileSync, readFileBase64, readFileBase64Sync,
|
|
68
|
+
writeFile, writeFileSync, writeFileBase64, writeFileBase64Sync,
|
|
69
|
+
existsSync, deleteFile, mkdir, list,
|
|
33
70
|
};
|
package/src/http.ts
CHANGED
|
@@ -1,69 +1,63 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
1
|
+
const _servers = new Set();
|
|
2
|
+
|
|
3
|
+
function _sendHttp(payload) {
|
|
4
|
+
const raw = $send('http', JSON.stringify(payload));
|
|
5
|
+
if (!raw) return undefined;
|
|
6
|
+
const r = JSON.parse(raw);
|
|
7
|
+
if (r.err) throw new Error(r.err);
|
|
8
|
+
return r;
|
|
9
|
+
}
|
|
4
10
|
|
|
5
|
-
|
|
6
|
-
* Start an HTTP server on a random available port.
|
|
7
|
-
* The callback receives: { connId, serverId, method, path, query, headers, body }
|
|
8
|
-
* Response is sent via http.respond(task: { serverId, connId, status?, headers?, body? })
|
|
9
|
-
*/
|
|
10
|
-
export function listen(
|
|
11
|
-
callback: (req: HttpRequest) => void,
|
|
12
|
-
port?: number
|
|
13
|
-
): Promise<{ serverId: string; port: number }> {
|
|
11
|
+
export function listen(callback, port) {
|
|
14
12
|
return new Promise((resolve, reject) => {
|
|
15
|
-
const cbId =
|
|
13
|
+
const cbId = _registerCallback((payload) => {
|
|
16
14
|
callback(payload);
|
|
17
15
|
}, { persistent: true });
|
|
18
16
|
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
17
|
+
try {
|
|
18
|
+
const result = _sendHttp({ t: 'listen', p: {
|
|
19
|
+
pluginName: __plugin?.name || 'unknown',
|
|
20
|
+
callbackId: String(cbId),
|
|
21
|
+
port: port || 0,
|
|
22
|
+
}});
|
|
23
|
+
_servers.add(result.serverId);
|
|
24
|
+
resolve(result);
|
|
25
|
+
} catch(e) { reject(e); }
|
|
27
26
|
});
|
|
28
27
|
}
|
|
29
28
|
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
})
|
|
36
|
-
|
|
37
|
-
serverId,
|
|
38
|
-
connId,
|
|
39
|
-
status: options.status || 200,
|
|
40
|
-
headers: options.headers || {},
|
|
41
|
-
body: options.body || '',
|
|
42
|
-
}) as Promise<void>;
|
|
29
|
+
export function respond(serverId, connId, opts = {}) {
|
|
30
|
+
return new Promise((resolve, reject) => {
|
|
31
|
+
try {
|
|
32
|
+
_sendHttp({ t: 'respond', p: { serverId, connId, ...opts }});
|
|
33
|
+
resolve();
|
|
34
|
+
} catch(e) { reject(e); }
|
|
35
|
+
});
|
|
43
36
|
}
|
|
44
37
|
|
|
45
|
-
|
|
46
|
-
* Stop an HTTP server and release its port.
|
|
47
|
-
*/
|
|
48
|
-
export function close(serverId: string): Promise<void> {
|
|
38
|
+
export function close(serverId) {
|
|
49
39
|
_servers.delete(serverId);
|
|
50
|
-
return
|
|
40
|
+
return new Promise((resolve, reject) => {
|
|
41
|
+
try { _sendHttp({ t: 'close', p: { serverId }}); resolve(); } catch(e) { reject(e); }
|
|
42
|
+
});
|
|
51
43
|
}
|
|
52
44
|
|
|
53
|
-
|
|
54
|
-
(globalThis as any)._registerCallback(() => {
|
|
45
|
+
_registerCallback(() => {
|
|
55
46
|
for (const id of _servers) {
|
|
56
|
-
try {
|
|
47
|
+
try { _sendHttp({ t: 'close', p: { serverId: id }}); } catch {}
|
|
57
48
|
}
|
|
58
49
|
_servers.clear();
|
|
59
50
|
}, { persistent: true });
|
|
60
51
|
|
|
61
|
-
export
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
52
|
+
export function request(url, opts = {}) {
|
|
53
|
+
return new Promise((resolve, reject) => {
|
|
54
|
+
try {
|
|
55
|
+
const result = _sendHttp({ t: 'request', p: { url, ...opts }});
|
|
56
|
+
resolve(result);
|
|
57
|
+
} catch(e) { reject(e); }
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
export function requestSync(url, opts = {}) {
|
|
62
|
+
return _sendHttp({ t: 'request', p: { url, ...opts }});
|
|
69
63
|
}
|
package/src/index.ts
CHANGED
|
@@ -4,4 +4,18 @@ export { Player } from './player.js';
|
|
|
4
4
|
export { registerCommand } from './command.js';
|
|
5
5
|
export type { CommandOptions, CommandPayload, CommandSender } from './command.js';
|
|
6
6
|
export { eventOn, eventOff } from './event.js';
|
|
7
|
+
export type {
|
|
8
|
+
PlayerJoinEvent, PlayerQuitEvent, PlayerChatEvent, PlayerMoveEvent,
|
|
9
|
+
PlayerInteractEvent, PlayerCommandEvent, PlayerDeathEvent, PlayerRespawnEvent,
|
|
10
|
+
PlayerDropItemEvent, PlayerPickupItemEvent, PlayerBucketFillEvent, PlayerBucketEmptyEvent,
|
|
11
|
+
PlayerExpChangeEvent, PlayerLevelChangeEvent, PlayerGameModeChangeEvent, FoodLevelChangeEvent,
|
|
12
|
+
EntityDamageEvent, EntityDeathEvent, EntitySpawnEvent, ProjectileLaunchEvent,
|
|
13
|
+
BlockBreakEvent, BlockPlaceEvent,
|
|
14
|
+
InventoryOpenEvent, InventoryCloseEvent,
|
|
15
|
+
ServerPingEvent,
|
|
16
|
+
} from './event.js';
|
|
17
|
+
export { onInit, onLoad } from './lifecycle.js';
|
|
7
18
|
export { broadcast, getMotd, getVersion } from './server.js';
|
|
19
|
+
export { fs, readFile, readFileSync, readFileBase64, readFileBase64Sync, writeFile, writeFileSync, writeFileBase64, writeFileBase64Sync, existsSync, deleteFile, mkdir, list } from './fs.js';
|
|
20
|
+
export { assets, read as assetsRead, readSync as assetsReadSync, readBase64 as assetsReadBase64, readBase64Sync as assetsReadBase64Sync, extract as assetsExtract, extractSync as assetsExtractSync } from './assets.js';
|
|
21
|
+
export { listen, respond, close, request, requestSync } from './http.js';
|
package/src/lifecycle.ts
ADDED
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
const _initCbs: (() => void)[] = [];
|
|
2
|
+
const _loadCbs: (() => void)[] = [];
|
|
3
|
+
|
|
4
|
+
export function onInit(cb: () => void): void { _initCbs.push(cb); }
|
|
5
|
+
export function onLoad(cb: () => void): void { _loadCbs.push(cb); }
|
|
6
|
+
|
|
7
|
+
(globalThis as any).__yeowInitCbs = _initCbs;
|
|
8
|
+
(globalThis as any).__yeowLoadCbs = _loadCbs;
|
package/src/task.ts
CHANGED
|
@@ -1,15 +1,19 @@
|
|
|
1
|
-
export function post(type: string, params: Record<string, unknown> = {}): Promise<unknown> {
|
|
1
|
+
export function post(type: string, params: Record<string, unknown> = {}, priority?: string): Promise<unknown> {
|
|
2
2
|
return new Promise((resolve, reject) => {
|
|
3
3
|
const cbId = (globalThis as any)._registerCallback((result: any) => {
|
|
4
4
|
if (result?.err) reject(new Error(result.err));
|
|
5
5
|
else resolve(result);
|
|
6
6
|
});
|
|
7
|
-
|
|
7
|
+
const pld: Record<string, unknown> = { t: type, p: params, cb: cbId };
|
|
8
|
+
if (priority) pld._priority = priority;
|
|
9
|
+
(globalThis as any).$send('game', JSON.stringify(pld));
|
|
8
10
|
});
|
|
9
11
|
}
|
|
10
12
|
|
|
11
|
-
export function call(type: string, params: Record<string, unknown> = {}): unknown {
|
|
12
|
-
const
|
|
13
|
+
export function call(type: string, params: Record<string, unknown> = {}, priority?: string): unknown {
|
|
14
|
+
const pld: Record<string, unknown> = { t: type, p: params };
|
|
15
|
+
if (priority) pld._priority = priority;
|
|
16
|
+
const raw = (globalThis as any).$send('game', JSON.stringify(pld));
|
|
13
17
|
if (!raw) return undefined;
|
|
14
18
|
const r = JSON.parse(raw as string);
|
|
15
19
|
if (r.err) throw new Error(r.err);
|