tiaoom 0.0.13 → 0.0.15
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/package.json +1 -1
- package/src/client.cjs +1 -1
- package/src/client.cjs.map +1 -1
- package/src/client.d.cts +66 -86
- package/src/client.d.mts +66 -86
- package/src/client.iife.js +1 -1
- package/src/client.iife.js.map +1 -1
- package/src/client.mjs +1 -1
- package/src/client.mjs.map +1 -1
- package/src/index.cjs +143 -76
- package/src/index.cjs.map +1 -1
- package/src/index.d.cts +36 -33
- package/src/index.d.mts +36 -33
- package/src/index.mjs +143 -76
- package/src/index.mjs.map +1 -1
package/src/client.d.mts
CHANGED
|
@@ -27,9 +27,9 @@ interface IRoomOptions {
|
|
|
27
27
|
attrs?: Record<string, any>;
|
|
28
28
|
}
|
|
29
29
|
//#endregion
|
|
30
|
-
//#region lib/
|
|
30
|
+
//#region lib/client.d.ts
|
|
31
31
|
/**
|
|
32
|
-
*
|
|
32
|
+
* 客户端发送消息包类型枚举
|
|
33
33
|
* player: 'command', 'message', 'join', 'leave', 'status'
|
|
34
34
|
*/
|
|
35
35
|
declare enum MessageTypes {
|
|
@@ -38,49 +38,29 @@ declare enum MessageTypes {
|
|
|
38
38
|
*/
|
|
39
39
|
RoomList = "room.list",
|
|
40
40
|
/**
|
|
41
|
-
*
|
|
42
|
-
*/
|
|
43
|
-
RoomCreate = "room.create",
|
|
44
|
-
/**
|
|
45
|
-
* 房间更新
|
|
46
|
-
*/
|
|
47
|
-
RoomUpdate = "room.update",
|
|
48
|
-
/**
|
|
49
|
-
* 房间准备
|
|
50
|
-
*/
|
|
51
|
-
RoomReady = "room.ready",
|
|
52
|
-
/**
|
|
53
|
-
* 房间开始
|
|
54
|
-
*/
|
|
55
|
-
RoomStart = "room.start",
|
|
56
|
-
/**
|
|
57
|
-
* 房间结束
|
|
58
|
-
*/
|
|
59
|
-
RoomEnd = "room.end",
|
|
60
|
-
/**
|
|
61
|
-
* 房间关闭
|
|
41
|
+
* 玩家列表
|
|
62
42
|
*/
|
|
63
|
-
|
|
43
|
+
PlayerList = "player.list",
|
|
64
44
|
/**
|
|
65
|
-
*
|
|
45
|
+
* 房间创建
|
|
66
46
|
*/
|
|
67
|
-
|
|
47
|
+
RoomCreate = "room.create",
|
|
68
48
|
/**
|
|
69
|
-
*
|
|
49
|
+
* 玩家加入房间
|
|
70
50
|
*/
|
|
71
|
-
|
|
51
|
+
PlayerJoin = "player.join",
|
|
72
52
|
/**
|
|
73
|
-
*
|
|
53
|
+
* 玩家离开房间
|
|
74
54
|
*/
|
|
75
|
-
|
|
55
|
+
PlayerLeave = "player.leave",
|
|
76
56
|
/**
|
|
77
|
-
*
|
|
57
|
+
* 房间获取
|
|
78
58
|
*/
|
|
79
|
-
|
|
59
|
+
RoomGet = "room.get",
|
|
80
60
|
/**
|
|
81
|
-
*
|
|
61
|
+
* 房间开始
|
|
82
62
|
*/
|
|
83
|
-
|
|
63
|
+
RoomStart = "room.start",
|
|
84
64
|
/**
|
|
85
65
|
* 房间踢出玩家
|
|
86
66
|
*/
|
|
@@ -90,17 +70,9 @@ declare enum MessageTypes {
|
|
|
90
70
|
*/
|
|
91
71
|
RoomTransfer = "room.transfer",
|
|
92
72
|
/**
|
|
93
|
-
*
|
|
94
|
-
*/
|
|
95
|
-
RoomPlayerReady = "room.player-ready",
|
|
96
|
-
/**
|
|
97
|
-
* 房间玩家取消准备
|
|
98
|
-
*/
|
|
99
|
-
RoomPlayerUnready = "room.player-unready",
|
|
100
|
-
/**
|
|
101
|
-
* 玩家列表
|
|
73
|
+
* 房间关闭
|
|
102
74
|
*/
|
|
103
|
-
|
|
75
|
+
RoomClose = "room.close",
|
|
104
76
|
/**
|
|
105
77
|
* 玩家登录
|
|
106
78
|
*/
|
|
@@ -109,14 +81,6 @@ declare enum MessageTypes {
|
|
|
109
81
|
* 玩家登出
|
|
110
82
|
*/
|
|
111
83
|
PlayerLogout = "player.logout",
|
|
112
|
-
/**
|
|
113
|
-
* 玩家消息
|
|
114
|
-
*/
|
|
115
|
-
PlayerMessage = "player.message",
|
|
116
|
-
/**
|
|
117
|
-
* 玩家命令
|
|
118
|
-
*/
|
|
119
|
-
PlayerCommand = "player.command",
|
|
120
84
|
/**
|
|
121
85
|
* 玩家准备
|
|
122
86
|
*/
|
|
@@ -126,20 +90,14 @@ declare enum MessageTypes {
|
|
|
126
90
|
*/
|
|
127
91
|
PlayerUnready = "player.unready",
|
|
128
92
|
/**
|
|
129
|
-
*
|
|
93
|
+
* 房间内玩家发送的指令
|
|
130
94
|
*/
|
|
131
|
-
|
|
95
|
+
RoomPlayerCommand = "room.player-command",
|
|
132
96
|
/**
|
|
133
|
-
*
|
|
134
|
-
*/
|
|
135
|
-
GlobalMessage = "global.message",
|
|
136
|
-
/**
|
|
137
|
-
* 全局错误
|
|
97
|
+
* 全局命令
|
|
138
98
|
*/
|
|
139
|
-
|
|
99
|
+
GlobalCommand = "global.command",
|
|
140
100
|
}
|
|
141
|
-
//#endregion
|
|
142
|
-
//#region lib/client.d.ts
|
|
143
101
|
type TiaoomEvents = {
|
|
144
102
|
/**
|
|
145
103
|
* 连接准备就绪事件
|
|
@@ -166,6 +124,11 @@ type TiaoomEvents = {
|
|
|
166
124
|
"global.command": (data: any & {
|
|
167
125
|
sender: Player;
|
|
168
126
|
}) => void;
|
|
127
|
+
/**
|
|
128
|
+
* 全局消息事件
|
|
129
|
+
* @param message 消息内容
|
|
130
|
+
*/
|
|
131
|
+
"global.message": (message: string, sender?: Player) => void;
|
|
169
132
|
/**
|
|
170
133
|
* 玩家列表更新事件
|
|
171
134
|
* @param players 玩家列表
|
|
@@ -199,8 +162,9 @@ type TiaoomEvents = {
|
|
|
199
162
|
* 玩家消息事件
|
|
200
163
|
* @param message 消息内容
|
|
201
164
|
*/
|
|
202
|
-
"player.message": (message:
|
|
203
|
-
|
|
165
|
+
"player.message": (message: {
|
|
166
|
+
content: string;
|
|
167
|
+
sender?: Player;
|
|
204
168
|
}) => void;
|
|
205
169
|
/**
|
|
206
170
|
* 房间列表更新事件
|
|
@@ -260,8 +224,9 @@ type TiaoomEvents = {
|
|
|
260
224
|
* 房间消息事件
|
|
261
225
|
* @param message 消息内容
|
|
262
226
|
*/
|
|
263
|
-
"room.message": (message:
|
|
264
|
-
|
|
227
|
+
"room.message": (message: {
|
|
228
|
+
content: string;
|
|
229
|
+
sender?: RoomPlayer;
|
|
265
230
|
}) => void;
|
|
266
231
|
/**
|
|
267
232
|
* 房间玩家准备事件
|
|
@@ -412,130 +377,145 @@ declare class Tiaoom {
|
|
|
412
377
|
* 连接准备监听
|
|
413
378
|
* @param {function} cb 监听函数
|
|
414
379
|
*/
|
|
415
|
-
onReady(cb: (
|
|
380
|
+
onReady(cb: () => void): this;
|
|
416
381
|
/**
|
|
417
382
|
* 全局错误监听
|
|
418
383
|
* @param {function} cb 监听函数
|
|
419
384
|
*/
|
|
420
|
-
onError(cb: (
|
|
385
|
+
onError(cb: (error: Error) => void): this;
|
|
386
|
+
/**
|
|
387
|
+
* 全局消息监听
|
|
388
|
+
* @param {function} cb 监听函数
|
|
389
|
+
*/
|
|
390
|
+
onMessage(cb: (message: string, sender?: Player) => void, on?: boolean): this;
|
|
421
391
|
/**
|
|
422
392
|
* 玩家列表变更监听
|
|
423
393
|
* @param {function} cb 监听函数
|
|
424
394
|
*/
|
|
425
|
-
onPlayerList(cb: (
|
|
395
|
+
onPlayerList(cb: (players: Player[]) => void): this;
|
|
426
396
|
/**
|
|
427
397
|
* 房间列表变更监听
|
|
428
398
|
* @param {function} cb 监听函数
|
|
429
399
|
* @param {boolean} on 开启/关闭监听
|
|
430
400
|
* @returns
|
|
431
401
|
*/
|
|
432
|
-
onRoomList(cb: (
|
|
402
|
+
onRoomList(cb: (rooms: Room[]) => void, on?: boolean): this;
|
|
433
403
|
/**
|
|
434
404
|
* 玩家加入监听
|
|
435
405
|
* @param {function} cb 监听函数
|
|
436
406
|
* @param {boolean} on 开启/关闭监听
|
|
437
407
|
* @returns
|
|
438
408
|
*/
|
|
439
|
-
onPlayerJoin(cb: (
|
|
409
|
+
onPlayerJoin(cb: (room: Room, player: Player) => void, on?: boolean): this;
|
|
440
410
|
/**
|
|
441
411
|
* 玩家离开监听
|
|
442
412
|
* @param {function} cb 监听函数
|
|
443
413
|
* @param {boolean} on 开启/关闭监听
|
|
444
414
|
* @returns
|
|
445
415
|
*/
|
|
446
|
-
onPlayerLeave(cb: (
|
|
416
|
+
onPlayerLeave(cb: (room: Room, player: Player) => void, on?: boolean): this;
|
|
447
417
|
/**
|
|
448
418
|
* 玩家准备监听
|
|
449
419
|
* @param {function} cb 监听函数
|
|
450
420
|
* @param {boolean} on 开启/关闭监听
|
|
451
421
|
* @returns
|
|
452
422
|
*/
|
|
453
|
-
onPlayerReady(cb: (
|
|
423
|
+
onPlayerReady(cb: (player: Player, roomId?: string) => void, on?: boolean): this;
|
|
454
424
|
/**
|
|
455
425
|
* 玩家取消准备监听
|
|
456
426
|
* @param {function} cb 监听函数
|
|
457
427
|
* @param {boolean} on 开启/关闭监听
|
|
458
428
|
* @returns
|
|
459
429
|
*/
|
|
460
|
-
onPlayerUnready(cb: (
|
|
430
|
+
onPlayerUnready(cb: (player: Player, roomId?: string) => void, on?: boolean): this;
|
|
461
431
|
/**
|
|
462
432
|
* 玩家状态更新监听
|
|
463
433
|
* @param {function} cb 监听函数
|
|
464
434
|
* @param {boolean} on 开启/关闭监听
|
|
465
435
|
* @returns
|
|
466
436
|
*/
|
|
467
|
-
onPlayerStatus(cb: (
|
|
437
|
+
onPlayerStatus(cb: (player: Player, status: any) => void, on?: boolean): this;
|
|
468
438
|
/**
|
|
469
439
|
* 房间开始游戏监听
|
|
470
440
|
* @param {function} cb 监听函数
|
|
471
441
|
* @param {boolean} on 开启/关闭监听
|
|
472
442
|
* @returns
|
|
473
443
|
*/
|
|
474
|
-
onRoomStart(cb: (
|
|
444
|
+
onRoomStart(cb: (room: Room) => void, on?: boolean): this;
|
|
475
445
|
/**
|
|
476
446
|
* 房间结束游戏监听
|
|
477
447
|
* @param {function} cb 监听函数
|
|
478
448
|
* @param {boolean} on 开启/关闭监听
|
|
479
449
|
* @returns
|
|
480
450
|
*/
|
|
481
|
-
onRoomEnd(cb: (
|
|
451
|
+
onRoomEnd(cb: (room: Room) => void, on?: boolean): this;
|
|
482
452
|
/**
|
|
483
453
|
* 房间全部准备监听
|
|
484
454
|
* @param {function} cb 监听函数
|
|
485
455
|
* @param {boolean} on 开启/关闭监听
|
|
486
456
|
* @returns
|
|
487
457
|
*/
|
|
488
|
-
onRoomAllReady(cb: (
|
|
458
|
+
onRoomAllReady(cb: (room: Room) => void, on?: boolean): this;
|
|
489
459
|
/**
|
|
490
460
|
* 房间消息监听
|
|
491
461
|
* @param {function} cb 监听函数
|
|
492
462
|
* @param {boolean} on 开启/关闭监听
|
|
493
463
|
* @returns
|
|
494
464
|
*/
|
|
495
|
-
onRoomMessage(cb: (
|
|
465
|
+
onRoomMessage(cb: (message: {
|
|
466
|
+
content: string;
|
|
467
|
+
sender?: RoomPlayer;
|
|
468
|
+
}) => void, on?: boolean): this;
|
|
496
469
|
/**
|
|
497
470
|
* 玩家消息监听
|
|
498
471
|
* @param {function} cb 监听函数
|
|
499
472
|
* @param {boolean} on 开启/关闭监听
|
|
500
473
|
* @returns
|
|
501
474
|
*/
|
|
502
|
-
onPlayerMessage(cb: (
|
|
475
|
+
onPlayerMessage(cb: (message: {
|
|
476
|
+
content: string;
|
|
477
|
+
sender?: Player;
|
|
478
|
+
}) => void, on?: boolean): this;
|
|
503
479
|
/**
|
|
504
480
|
* 房间指令监听
|
|
505
481
|
* @param {function} cb 监听函数
|
|
506
482
|
* @param {boolean} on 开启/关闭监听
|
|
507
483
|
* @returns
|
|
508
484
|
*/
|
|
509
|
-
onRoomCommand(cb: (
|
|
485
|
+
onRoomCommand(cb: (command: any & {
|
|
486
|
+
sender?: Player;
|
|
487
|
+
}) => void, on?: boolean): this;
|
|
510
488
|
/**
|
|
511
489
|
* 玩家指令监听
|
|
512
490
|
* @param {function} cb 监听函数
|
|
513
491
|
* @param {boolean} on 开启/关闭监听
|
|
514
492
|
* @returns
|
|
515
493
|
*/
|
|
516
|
-
onPlayerCommand(cb: (
|
|
494
|
+
onPlayerCommand(cb: (command: any & {
|
|
495
|
+
sender?: Player;
|
|
496
|
+
}) => void, on?: boolean): this;
|
|
517
497
|
/**
|
|
518
498
|
* 事件监听
|
|
519
499
|
* @param {string} event 事件名称
|
|
520
|
-
* @param {
|
|
500
|
+
* @param {TiaoomEvents[K]} listener 监听函数
|
|
521
501
|
* @returns
|
|
522
502
|
*/
|
|
523
503
|
on<K extends keyof TiaoomEvents>(event: K, listener: TiaoomEvents[K]): this;
|
|
524
504
|
/**
|
|
525
505
|
* 事件取消监听
|
|
526
506
|
* @param {string} event 事件名称
|
|
527
|
-
* @param {
|
|
507
|
+
* @param {TiaoomEvents[K]} listener 监听函数
|
|
528
508
|
* @returns
|
|
529
509
|
*/
|
|
530
510
|
off<K extends keyof TiaoomEvents>(event: K, listener: TiaoomEvents[K]): this;
|
|
531
511
|
/**
|
|
532
512
|
* 事件触发
|
|
533
513
|
* @param {string} event 事件名称
|
|
534
|
-
* @param {
|
|
514
|
+
* @param {Parameters<TiaoomEvents[K]>} args 参数
|
|
535
515
|
* @returns
|
|
536
516
|
*/
|
|
537
517
|
emit<K extends keyof TiaoomEvents>(event: K, ...args: Parameters<TiaoomEvents[K]>): this;
|
|
538
518
|
}
|
|
539
519
|
//#endregion
|
|
540
|
-
export { Player, Room, RoomPlayer, Tiaoom, TiaoomEvents };
|
|
520
|
+
export { IRoomOptions, MessageTypes, Player, Room, RoomPlayer, Tiaoom, TiaoomEvents };
|
|
541
521
|
//# sourceMappingURL=client.d.mts.map
|
package/src/client.iife.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
var Tiaoom=(function(e){let t=function(e){return e.RoomList=`room.list`,e.
|
|
1
|
+
var Tiaoom=(function(e){let t=function(e){return e.RoomList=`room.list`,e.PlayerList=`player.list`,e.RoomCreate=`room.create`,e.PlayerJoin=`player.join`,e.PlayerLeave=`player.leave`,e.RoomGet=`room.get`,e.RoomStart=`room.start`,e.RoomKick=`room.kick`,e.RoomTransfer=`room.transfer`,e.RoomClose=`room.close`,e.PlayerLogin=`player.login`,e.PlayerLogout=`player.logout`,e.PlayerReady=`player.ready`,e.PlayerUnready=`player.unready`,e.RoomPlayerCommand=`room.player-command`,e.GlobalCommand=`global.command`,e}({});var n=class{constructor(e){this.id=e.id||Date.now().toString(),this.name=e.name||`玩家`+this.id,this.attributes=e.attributes||{},this.status=e.status||`online`}},r=class extends n{constructor(e){super(e),this.role=e.role,this.isReady=e.isReady,this.isCreator=e.isCreator}},i=class{constructor(e){this.id=e.id,this.name=e.name,this.players=e.players.map(e=>new r(e)),this.size=e.size,this.minSize=e.minSize,this.status=e.status,this.attrs=e.attrs}},a=class{constructor(){this.listeners={},this.rooms=[],this.players=[],this.currentPlayer=null}run(){return this.connect(),this.onReady(()=>{this.send({type:t.RoomList}),this.send({type:t.PlayerList})}),this.on(`player.list`,e=>{this.players=e.map(e=>new n(e)),this.emit(`onPlayerList`,[...this.players])}),this.on(`player.login`,e=>{this.players.push(new n(e)),this.emit(`onPlayerList`,[...this.players])}),this.on(`player.logout`,e=>{this.players=this.players.filter(t=>t.id!==e.id),this.emit(`onPlayerList`,[...this.players])}),this.on(`room.list`,e=>{this.rooms=e.map(e=>new i(e)),this.emit(`onRoomList`,[...this.rooms])}),this.on(`room.create`,e=>{this.rooms.push(new i(e)),this.emit(`onRoomList`,this.rooms)}),this.on(`room.update`,e=>{let t=this.rooms.find(t=>t.id===e.id);t?Object.assign(t,e):this.rooms.push(new i(e)),this.emit(`onRoomList`,this.rooms)}),this.on(`room.close`,e=>{this.rooms=this.rooms.filter(t=>t.id!==e.id),this.emit(`onRoomList`,this.rooms)}),this.on(`room.update`,e=>{let t=this.rooms.find(t=>t.id===e.id);t&&(Object.assign(t,e),this.emit(`onRoomList`,this.rooms))}),this}connect(){throw Error(`Must be implement connect method`)}send(e){throw Error(`Must be implement send method`)}login(e){return this.currentPlayer=new n(e),this.send({type:t.PlayerLogin,data:e}),this}createRoom({name:e,size:n,minSize:r,attrs:i}){return new Promise(a=>{this.send({type:t.RoomCreate,data:{name:e,size:n,minSize:r,attrs:i}}),this.on(`room.create`,e=>{a()})})}joinRoom(e){return this.send({type:t.PlayerJoin,data:{roomId:e}}),this}leaveRoom(e){return this.send({type:t.PlayerLeave,data:{roomId:e}}),this}kickPlayer(e,n){return this.send({type:t.RoomKick,data:{roomId:e,playerId:n}}),this}transferRoom(e,n){return this.send({type:t.RoomTransfer,data:{roomId:e,playerId:n}}),this}startGame(e){return this.send({type:t.RoomStart,data:{id:e}}),this}ready(e,n=!0){return this.send({type:n?t.PlayerReady:t.PlayerUnready,data:{roomId:e}}),this}command(e,n){return typeof e==`string`?this.send({type:t.RoomPlayerCommand,data:{id:e,...n}}):(n=e,this.send({type:t.GlobalCommand,data:n})),this}onReady(e){return this.on(`sys.ready`,e)}onError(e){return this.on(`global.error`,e),this}onMessage(e,t=!0){return t?this.on(`global.message`,e):this.off(`global.message`,e),this}onPlayerList(e){return this.on(`onPlayerList`,e),this}onRoomList(e,t=!0){return t?this.on(`onRoomList`,e):this.off(`onRoomList`,e),this}onPlayerJoin(e,t=!0){return t?this.on(`room.join`,e):this.off(`room.join`,e),this}onPlayerLeave(e,t=!0){return t?this.on(`room.leave`,e):this.off(`room.leave`,e),this}onPlayerReady(e,t=!0){return t?this.on(`room.player-ready`,e):this.off(`room.player-ready`,e),this}onPlayerUnready(e,t=!0){return t?this.on(`room.player-unready`,e):this.off(`room.player-unready`,e),this}onPlayerStatus(e,t=!0){return t?this.on(`player.status`,e):this.off(`player.status`,e),this}onRoomStart(e,t=!0){return this.listeners[`room.start`]||this.on(`room.start`,e=>this.emit(`onRoomStart`,new i(e))),t?this.on(`onRoomStart`,e):this.off(`onRoomStart`,e),this}onRoomEnd(e,t=!0){return this.listeners[`room.end`]||this.on(`room.end`,e=>this.emit(`onRoomEnd`,new i(e))),t?this.on(`onRoomEnd`,e):this.off(`onRoomEnd`,e),this}onRoomAllReady(e,t=!0){return this.listeners[`room.all-ready`]||this.on(`room.all-ready`,e=>this.emit(`onRoomAllReady`,new i(e))),t?this.on(`onRoomAllReady`,e):this.off(`onRoomAllReady`,e),this}onRoomMessage(e,t=!0){return t?this.on(`room.message`,e):this.off(`room.message`,e),this}onPlayerMessage(e,t=!0){return t?this.on(`player.message`,e):this.off(`player.message`,e),this}onRoomCommand(e,t=!0){return t?this.on(`room.command`,e):this.off(`room.command`,e),this}onPlayerCommand(e,t=!0){return t?this.on(`player.command`,e):this.off(`player.command`,e),this}on(e,t){return this.listeners[e]=this.listeners[e]||[],this.listeners[e].push(t),this}off(e,t){let n=this.listeners[e]||[],r=n.indexOf(t);return r!==-1&&n.splice(r,1),this}emit(e,...t){return(this.listeners[e]||[]).forEach(e=>e(...t)),this}};return e.MessageTypes=t,e.Player=n,e.Room=i,e.RoomPlayer=r,e.Tiaoom=a,e})({});
|
|
2
2
|
//# sourceMappingURL=client.iife.js.map
|
package/src/client.iife.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.iife.js","names":[],"sources":["../lib/models/message.ts","../lib/client.ts"],"sourcesContent":["import EventEmitter from \"events\";\nimport { IPlayer, IPlayerOptions } from \"./player\";\nimport { IRoom, IRoomPlayer, IRoomOptions } from \"./room\";\nimport { IMessageEmitterEvents, IMessageEvents } from \"@lib/events/message\";\n\n/**\n * 消息包类型枚举\n * player: 'command', 'message', 'join', 'leave', 'status'\n */\nexport enum MessageTypes {\n /**\n * 房间列表\n */\n RoomList = \"room.list\",\n /**\n * 房间创建\n */\n RoomCreate = \"room.create\",\n /**\n * 房间更新\n */\n RoomUpdate = \"room.update\",\n /**\n * 房间准备\n */\n RoomReady = \"room.ready\",\n /**\n * 房间开始\n */\n RoomStart = \"room.start\",\n /**\n * 房间结束\n */\n RoomEnd = \"room.end\",\n /**\n * 房间关闭\n */\n RoomClose = \"room.close\",\n /**\n * 房间全部玩家已准备\n */\n RoomAllReady = \"room.all-ready\",\n /**\n * 房间命令\n */\n RoomCommand = \"room.command\",\n /**\n * 房间消息\n */\n RoomMessage = \"room.message\",\n /**\n * 玩家加入房间\n */\n RoomJoin = \"room.join\",\n /**\n * 玩家离开房间\n */\n RoomLeave = \"room.leave\",\n /**\n * 房间踢出玩家\n */\n RoomKick = \"room.kick\",\n /**\n * 房间转移\n */\n RoomTransfer = \"room.transfer\",\n /**\n * 房间玩家准备\n */\n RoomPlayerReady = \"room.player-ready\",\n /**\n * 房间玩家取消准备\n */\n RoomPlayerUnready = \"room.player-unready\",\n /**\n * 玩家列表\n */\n PlayerList = \"player.list\",\n /**\n * 玩家登录\n */\n PlayerLogin = \"player.login\",\n /**\n * 玩家登出\n */\n PlayerLogout = \"player.logout\",\n /**\n * 玩家消息\n */\n PlayerMessage = \"player.message\",\n /**\n * 玩家命令\n */\n PlayerCommand = \"player.command\",\n /**\n * 玩家准备\n */\n PlayerReady = \"player.ready\",\n /**\n * 玩家取消准备\n */\n PlayerUnready = \"player.unready\",\n /**\n * 全局命令\n */\n GlobalCommand = \"global.command\",\n /**\n * 全局消息\n */\n GlobalMessage = \"global.message\",\n /**\n * 全局错误\n */\n GlobalError = \"global.error\",\n}\n\n/**\n * 消息包接口\n */\nexport interface IMessagePackage {\n /**\n * 消息类型\n */\n type: MessageTypes;\n /**\n * 消息数据\n */\n data?: IPlayerOptions | IRoomOptions | IPlayer | IRoom | IRoomPlayer | any\n /**\n * 发送者信息\n */\n sender?: IPlayer | IRoomPlayer | IRoom;\n}\n\n/**\n * 消息数据接口,包含发送者信息\n */\nexport interface IMessageData extends IMessagePackage {\n sender: IPlayer | IRoomPlayer | IRoom;\n}\n\n/**\n * 消息通信接口\n */\nexport interface IMessage extends EventEmitter<IMessageEmitterEvents> {\n /**\n * 监听消息事件\n * @param event 事件名,具体见 MessageEvents\n * @param listener 监听器\n */\n on<K extends keyof IMessageEvents>(event: K, listener: IMessageEvents[K]): this;\n /**\n * 触发消息事件\n * @param event 事件名,具体见 MessageEvents\n * @param args 参数\n */\n emit<K extends keyof IMessageEvents>(event: K, ...args: Parameters<IMessageEvents[K]>): boolean;\n /**\n * 关闭连接\n */\n close(): void;\n /**\n * 发送消息包\n * @param message 消息包\n */\n send(message: IMessagePackage): void;\n}\n","import { MessageTypes } from \"./models/message\";\nimport type { IRoomOptions } from \"./models/room\";\n\nexport type TiaoomEvents = {\n /**\n * 连接准备就绪事件\n */\n \"sys.ready\": () => void;\n /**\n * 连接错误事件\n * @param error 错误信息\n */\n \"sys.error\": (error: any) => void;\n /**\n * 连接关闭事件\n */\n \"sys.close\": () => void;\n /**\n * 全局错误事件\n * @param error 错误信息\n */\n \"global.error\": (error: Error) => void;\n /**\n * 全局命令事件\n * @param data 命令内容\n */\n \"global.command\": (data: any & { sender: Player }) => void;\n /**\n * 玩家列表更新事件\n * @param players 玩家列表\n */\n \"player.list\": (players: Player[]) => void;\n /**\n * 玩家登录事件\n * @param player 玩家信息\n */\n \"player.login\": (player: Player) => void;\n /**\n * 玩家登出事件\n * @param player 玩家信息\n */\n \"player.logout\": (player: Player) => void;\n /**\n * 玩家状态更新事件\n * @param player 玩家信息\n * @param status 状态\n * @param roomId 房间ID(可选)\n */\n \"player.status\": (player: Player, status: string, roomId?: string) => void;\n /**\n * 玩家命令事件\n * @param command 命令内容\n */\n \"player.command\": (command: any & { sender: Player }) => void;\n /**\n * 玩家消息事件\n * @param message 消息内容\n */\n \"player.message\": (message: any & { sender: Player }) => void;\n /**\n * 房间列表更新事件\n * @param rooms 房间列表\n */\n \"room.list\": (rooms: Room[]) => void;\n /**\n * 房间创建事件\n * @param room 房间信息\n */\n \"room.create\": (room: Room) => void;\n /**\n * 房间更新事件\n * @param room 房间信息\n */\n \"room.update\": (room: Room) => void;\n /**\n * 房间关闭事件\n * @param room 房间信息\n */\n \"room.close\": (room: Room) => void;\n /**\n * 玩家加入房间事件\n * @param room 房间信息\n * @param player 玩家信息\n */\n \"room.join\": (room: Room, player: Player) => void;\n /**\n * 玩家离开房间事件\n * @param room 房间信息\n * @param player 玩家信息\n */\n \"room.leave\": (room: Room, player: Player) => void;\n /**\n * 房间开始游戏事件\n * @param room 房间信息\n */\n \"room.start\": (room: Room) => void;\n /**\n * 房间结束游戏事件\n * @param room 房间信息\n */\n \"room.end\": (room: Room) => void;\n /**\n * 房间玩家全部准备事件\n * @param room 房间信息\n */\n \"room.all-ready\": (room: Room) => void;\n /**\n * 房间命令事件\n * @param command 命令内容\n */\n \"room.command\": (command: any & { sender: Player }) => void;\n /**\n * 房间消息事件\n * @param message 消息内容\n */\n \"room.message\": (message: any & { sender: Player }) => void;\n /**\n * 房间玩家准备事件\n * @param player 玩家信息\n * @param roomId 房间ID(可选)\n */\n \"room.player-ready\": (player: Player, roomId?: string) => void;\n /**\n * 房间玩家取消准备事件\n * @param player 玩家信息\n * @param roomId 房间ID(可选)\n */\n \"room.player-unready\": (player: Player, roomId?: string) => void;\n /**\n * 玩家列表更新事件(内部)\n * @param players 玩家列表\n */\n \"onPlayerList\": (players: Player[]) => void;\n /**\n * 房间列表更新事件(内部)\n * @param rooms 房间列表\n */\n \"onRoomList\": (rooms: Room[]) => void;\n /**\n * 房间开始游戏事件(内部)\n * @param room 房间信息\n */\n \"onRoomStart\": (room: Room) => void;\n /**\n * 房间结束游戏事件(内部)\n * @param room 房间信息\n */\n \"onRoomEnd\": (room: Room) => void;\n /**\n * 房间玩家全部准备事件(内部)\n * @param room 房间信息\n */\n \"onRoomAllReady\": (room: Room) => void;\n};\n\nexport class Player {\n id: string;\n name: string;\n attributes: Record<string, any>;\n status: string;\n constructor(player: Partial<Player>) {\n this.id = player.id || Date.now().toString();\n this.name = player.name || '玩家' + this.id;\n this.attributes = player.attributes || {};\n this.status = player.status || 'online';\n }\n}\n\nexport class RoomPlayer extends Player {\n role: string;\n isReady: boolean;\n isCreator: boolean;\n constructor(player: RoomPlayer) {\n super(player);\n this.role = player.role;\n this.isReady = player.isReady;\n this.isCreator = player.isCreator;\n }\n}\n\nexport class Room {\n id: string;\n name: string;\n players: RoomPlayer[];\n size: number;\n minSize: number;\n status: string;\n attrs: Record<string, any>;\n constructor(room: Room) {\n this.id = room.id;\n this.name = room.name;\n this.players = room.players.map(player => new RoomPlayer(player));\n this.size = room.size;\n this.minSize = room.minSize;\n this.status = room.status;\n this.attrs = room.attrs;\n }\n}\n\n/**\n * Tiaoom 客户端\n * @description 用于连接 Tiaoom 服务器并进行游戏交互,如创建房间、加入房间、发送命令等。\n * 需继承后实现具体的连接和消息发送逻辑。\n */\nexport class Tiaoom {\n listeners: Record<string, Function[]>;\n rooms: Room[];\n players: Player[];\n currentPlayer: Player | null;\n constructor() {\n this.listeners = {};\n this.rooms = [];\n this.players = [];\n this.currentPlayer = null;\n }\n\n /**\n * 启动游戏\n */\n run() {\n this.connect();\n this.onReady(() => {\n this.send({ type: MessageTypes.RoomList });\n this.send({ type: MessageTypes.PlayerList });\n });\n\n this.on(\"player.list\", (players) => {\n this.players = players.map(player => new Player(player));\n this.emit('onPlayerList', [...this.players]);\n });\n this.on(\"player.login\", (player) => {\n this.players.push(new Player(player));\n this.emit('onPlayerList', [...this.players]);\n });\n this.on(\"player.logout\", (player) => {\n this.players = this.players.filter(p => p.id !== player.id);\n this.emit('onPlayerList', [...this.players]);\n });\n\n\n this.on(\"room.list\", (rooms) => {\n this.rooms = rooms.map(room => new Room(room));\n this.emit('onRoomList', [...this.rooms]);\n });\n this.on(\"room.create\", (room) => {\n this.rooms.push(new Room(room));\n this.emit('onRoomList', this.rooms);\n });\n this.on(\"room.update\", (room) => {\n const existingRoom = this.rooms.find(r => r.id === room.id);\n if (!existingRoom) {\n this.rooms.push(new Room(room));\n } else {\n Object.assign(existingRoom, room);\n }\n this.emit('onRoomList', this.rooms);\n });\n this.on(\"room.close\", (room) => {\n this.rooms = this.rooms.filter(r => r.id !== room.id);\n this.emit('onRoomList', this.rooms);\n });\n this.on(\"room.update\", (room) => {\n const updatedRoom = this.rooms.find(r => r.id === room.id);\n if (updatedRoom) {\n Object.assign(updatedRoom, room);\n this.emit('onRoomList', this.rooms);\n }\n });\n\n return this;\n }\n\n /**\n * 连接服务器实现\n */\n connect() {\n throw new Error('Must be implement connect method');\n }\n\n /**\n * 发送消息实现\n */\n send(_: { type: MessageTypes, data?: any }) {\n throw new Error('Must be implement send method');\n }\n\n /**\n * 登录\n * @param {Player} player 玩家信息\n */\n login(player: Player) {\n this.currentPlayer = new Player(player);\n this.send({ type: MessageTypes.PlayerLogin, data: player });\n return this;\n }\n\n /**\n * 创建房间\n * @param {string} name 房间名称\n * @param {number} size 房间人数上限\n * @param {number} minSize 房间人数下限\n * @param {object} attrs 房间属性\n */\n createRoom({ name, size, minSize, attrs }: Omit<IRoomOptions, 'id'>) {\n return new Promise<void>((resolve) => {\n this.send({ type: MessageTypes.RoomCreate, data: { name, size, minSize, attrs } });\n this.on(\"room.create\", (room) => {\n resolve();\n });\n });\n }\n\n /**\n * 加入房间\n * @param {string} roomId 房间ID\n */\n joinRoom(roomId: string) {\n this.send({ type: MessageTypes.RoomJoin, data: { roomId } });\n return this;\n }\n\n /**\n * 离开房间\n * @param {string} roomId 房间ID\n */\n leaveRoom(roomId: string) {\n this.send({ type: MessageTypes.RoomLeave, data: { roomId } });\n return this;\n }\n\n /**\n * 踢出玩家\n * @param {string} roomId 房间ID\n * @param {string} playerId 玩家ID\n */\n kickPlayer(roomId: string, playerId: string) {\n this.send({ type: MessageTypes.RoomKick, data: { roomId, playerId } });\n return this;\n }\n\n /**\n * 转让房主\n * @param {string} roomId 房间ID\n * @param {string} playerId 目标玩家ID\n */\n transferRoom(roomId: string, playerId: string) {\n this.send({ type: MessageTypes.RoomTransfer, data: { roomId, playerId } });\n return this;\n }\n\n /**\n * 开始游戏\n * @param {string} id 房间ID\n */\n startGame(id: string) {\n this.send({ type: MessageTypes.RoomStart, data: { id } });\n return this;\n }\n\n /**\n * 准备/取消准备\n * @param {string} roomId 房间ID\n * @param {boolean} isReady 是否准备\n */\n ready(roomId: string, isReady=true) {\n this.send({ type: isReady ? MessageTypes.PlayerReady : MessageTypes.PlayerUnready, data: { roomId } });\n return this;\n }\n\n /**\n * 发送房间指令\n * @param {string} roomId 房间ID\n * @param {any} command 指令内容\n */\n command(command: any): this;\n command(roomId: string, command: any): this;\n command(roomId: string | any, command?: any) {\n if (typeof roomId != 'string') {\n command = roomId;\n this.send({ type: MessageTypes.GlobalCommand, data: command });\n } else {\n this.send({ type: MessageTypes.PlayerCommand, data: { id: roomId, ...command } });\n }\n return this;\n }\n\n /**\n * 连接准备监听\n * @param {function} cb 监听函数\n */\n onReady(cb: (...args: any[]) => void) {\n return this.on(\"sys.ready\", cb);\n }\n\n /**\n * 全局错误监听\n * @param {function} cb 监听函数\n */\n onError(cb: (...args: any[]) => void) {\n this.on(\"global.error\", cb);\n return this;\n }\n\n /**\n * 玩家列表变更监听\n * @param {function} cb 监听函数\n */\n onPlayerList(cb: (...args: any[]) => void) {\n this.on(\"onPlayerList\", cb);\n return this;\n }\n\n /**\n * 房间列表变更监听\n * @param {function} cb 监听函数\n * @param {boolean} on 开启/关闭监听\n * @returns \n */\n onRoomList(cb: (...args: any[]) => void, on=true) {\n if (on) this.on(\"onRoomList\", cb);\n else this.off(\"onRoomList\", cb);\n return this;\n }\n\n /**\n * 玩家加入监听\n * @param {function} cb 监听函数\n * @param {boolean} on 开启/关闭监听\n * @returns \n */\n onPlayerJoin(cb: (...args: any[]) => void, on=true) {\n if (on) this.on(\"room.join\", cb);\n else this.off(\"room.join\", cb);\n return this;\n }\n\n /**\n * 玩家离开监听\n * @param {function} cb 监听函数\n * @param {boolean} on 开启/关闭监听\n * @returns \n */\n onPlayerLeave(cb: (...args: any[]) => void, on=true) {\n if (on) this.on(\"room.leave\", cb);\n else this.off(\"room.leave\", cb);\n return this;\n }\n\n /**\n * 玩家准备监听\n * @param {function} cb 监听函数\n * @param {boolean} on 开启/关闭监听\n * @returns \n */\n onPlayerReady(cb: (...args: any[]) => void, on=true) {\n if (on) this.on(\"room.player-ready\", cb);\n else this.off(\"room.player-ready\", cb);\n return this;\n }\n\n /**\n * 玩家取消准备监听\n * @param {function} cb 监听函数\n * @param {boolean} on 开启/关闭监听\n * @returns \n */\n onPlayerUnready(cb: (...args: any[]) => void, on=true) {\n if (on) this.on(\"room.player-unready\", cb);\n else this.off(\"room.player-unready\", cb);\n return this;\n }\n\n /**\n * 玩家状态更新监听\n * @param {function} cb 监听函数\n * @param {boolean} on 开启/关闭监听\n * @returns \n */\n onPlayerStatus(cb: (...args: any[]) => void, on=true) {\n if (on) this.on(\"player.status\", cb);\n else this.off(\"player.status\", cb);\n return this;\n }\n\n /**\n * 房间开始游戏监听\n * @param {function} cb 监听函数\n * @param {boolean} on 开启/关闭监听\n * @returns \n */\n onRoomStart(cb: (...args: any[]) => void, on=true) {\n if (!this.listeners[\"room.start\"]) {\n this.on(\"room.start\", (room) => this.emit(\"onRoomStart\", new Room(room)));\n }\n if (on) this.on(\"onRoomStart\", cb);\n else this.off(\"onRoomStart\", cb);\n return this;\n }\n\n /**\n * 房间结束游戏监听\n * @param {function} cb 监听函数\n * @param {boolean} on 开启/关闭监听\n * @returns\n */\n onRoomEnd(cb: (...args: any[]) => void, on=true) {\n if (!this.listeners[\"room.end\"]) {\n this.on(\"room.end\", (room) => this.emit(\"onRoomEnd\", new Room(room)));\n }\n if (on) this.on(\"onRoomEnd\", cb);\n else this.off(\"onRoomEnd\", cb);\n return this;\n }\n\n /**\n * 房间全部准备监听\n * @param {function} cb 监听函数\n * @param {boolean} on 开启/关闭监听\n * @returns \n */\n onRoomAllReady(cb: (...args: any[]) => void, on=true) {\n if (!this.listeners[\"room.all-ready\"]) {\n this.on(\"room.all-ready\", (room) => this.emit(\"onRoomAllReady\", new Room(room)));\n }\n if (on) this.on(\"onRoomAllReady\", cb);\n else this.off(\"onRoomAllReady\", cb);\n return this;\n }\n\n /**\n * 房间消息监听\n * @param {function} cb 监听函数\n * @param {boolean} on 开启/关闭监听\n * @returns \n */\n onRoomMessage(cb: (...args: any[]) => void, on=true) {\n if (on) this.on(\"room.message\", cb);\n else this.off(\"room.message\", cb);\n return this;\n }\n\n /**\n * 玩家消息监听\n * @param {function} cb 监听函数\n * @param {boolean} on 开启/关闭监听\n * @returns \n */\n onPlayerMessage(cb: (...args: any[]) => void, on=true) {\n if (on) this.on(\"player.message\", cb);\n else this.off(\"player.message\", cb);\n return this;\n }\n\n /**\n * 房间指令监听\n * @param {function} cb 监听函数\n * @param {boolean} on 开启/关闭监听\n * @returns \n */\n onRoomCommand(cb: (...args: any[]) => void, on=true) {\n if (on) this.on(\"room.command\", cb);\n else this.off(\"room.command\", cb);\n return this;\n }\n\n /**\n * 玩家指令监听\n * @param {function} cb 监听函数\n * @param {boolean} on 开启/关闭监听\n * @returns \n */\n onPlayerCommand(cb: (...args: any[]) => void, on=true) {\n if (on) this.on(\"player.command\", cb);\n else this.off(\"player.command\", cb);\n return this;\n }\n\n /**\n * 事件监听\n * @param {string} event 事件名称\n * @param {function} listener 监听函数\n * @returns \n */\n on<K extends keyof TiaoomEvents>(event: K, listener: TiaoomEvents[K]): this {\n this.listeners[event] = this.listeners[event] || [];\n this.listeners[event].push(listener);\n return this;\n }\n\n /**\n * 事件取消监听\n * @param {string} event 事件名称\n * @param {function} listener 监听函数\n * @returns \n */\n off<K extends keyof TiaoomEvents>(event: K, listener: TiaoomEvents[K]): this {\n const listeners = this.listeners[event] || [];\n const index = listeners.indexOf(listener);\n if (index !== -1) {\n listeners.splice(index, 1);\n }\n return this;\n }\n\n /**\n * 事件触发\n * @param {string} event 事件名称\n * @param {...any} args 参数\n * @returns \n */\n emit<K extends keyof TiaoomEvents>(event: K, ...args: Parameters<TiaoomEvents[K]>): this {\n const listeners = this.listeners[event] || [];\n listeners.forEach(listener => listener(...args));\n return this;\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"client.iife.js","names":[],"sources":["../lib/client.ts"],"sourcesContent":["import type { IRoomOptions } from \"./models/room\";\n\nexport { IRoomOptions };\n\n/**\n * 客户端发送消息包类型枚举\n * player: 'command', 'message', 'join', 'leave', 'status'\n */\nexport enum MessageTypes {\n /**\n * 房间列表\n */\n RoomList = \"room.list\",\n /**\n * 玩家列表\n */\n PlayerList = \"player.list\",\n /**\n * 房间创建\n */\n RoomCreate = \"room.create\",\n /**\n * 玩家加入房间\n */\n PlayerJoin = \"player.join\",\n /**\n * 玩家离开房间\n */\n PlayerLeave = \"player.leave\",\n /**\n * 房间获取\n */\n RoomGet = \"room.get\",\n /**\n * 房间开始\n */\n RoomStart = \"room.start\",\n /**\n * 房间踢出玩家\n */\n RoomKick = \"room.kick\",\n /**\n * 房间转移\n */\n RoomTransfer = \"room.transfer\",\n /**\n * 房间关闭\n */\n RoomClose = \"room.close\", \n /**\n * 玩家登录\n */\n PlayerLogin = \"player.login\",\n /**\n * 玩家登出\n */\n PlayerLogout = \"player.logout\",\n /**\n * 玩家准备\n */\n PlayerReady = \"player.ready\",\n /**\n * 玩家取消准备\n */\n PlayerUnready = \"player.unready\",\n /**\n * 房间内玩家发送的指令\n */\n RoomPlayerCommand = \"room.player-command\",\n /**\n * 全局命令\n */\n GlobalCommand = \"global.command\",\n}\n\nexport type TiaoomEvents = {\n /**\n * 连接准备就绪事件\n */\n \"sys.ready\": () => void;\n /**\n * 连接错误事件\n * @param error 错误信息\n */\n \"sys.error\": (error: any) => void;\n /**\n * 连接关闭事件\n */\n \"sys.close\": () => void;\n /**\n * 全局错误事件\n * @param error 错误信息\n */\n \"global.error\": (error: Error) => void;\n /**\n * 全局命令事件\n * @param data 命令内容\n */\n \"global.command\": (data: any & { sender: Player }) => void;\n /**\n * 全局消息事件\n * @param message 消息内容\n */\n \"global.message\": (message: string, sender?: Player) => void;\n /**\n * 玩家列表更新事件\n * @param players 玩家列表\n */\n \"player.list\": (players: Player[]) => void;\n /**\n * 玩家登录事件\n * @param player 玩家信息\n */\n \"player.login\": (player: Player) => void;\n /**\n * 玩家登出事件\n * @param player 玩家信息\n */\n \"player.logout\": (player: Player) => void;\n /**\n * 玩家状态更新事件\n * @param player 玩家信息\n * @param status 状态\n * @param roomId 房间ID(可选)\n */\n \"player.status\": (player: Player, status: string, roomId?: string) => void;\n /**\n * 玩家命令事件\n * @param command 命令内容\n */\n \"player.command\": (command: any & { sender: Player }) => void;\n /**\n * 玩家消息事件\n * @param message 消息内容\n */\n \"player.message\": (message: { content: string, sender?: Player }) => void;\n /**\n * 房间列表更新事件\n * @param rooms 房间列表\n */\n \"room.list\": (rooms: Room[]) => void;\n /**\n * 房间创建事件\n * @param room 房间信息\n */\n \"room.create\": (room: Room) => void;\n /**\n * 房间更新事件\n * @param room 房间信息\n */\n \"room.update\": (room: Room) => void;\n /**\n * 房间关闭事件\n * @param room 房间信息\n */\n \"room.close\": (room: Room) => void;\n /**\n * 玩家加入房间事件\n * @param room 房间信息\n * @param player 玩家信息\n */\n \"room.join\": (room: Room, player: Player) => void;\n /**\n * 玩家离开房间事件\n * @param room 房间信息\n * @param player 玩家信息\n */\n \"room.leave\": (room: Room, player: Player) => void;\n /**\n * 房间开始游戏事件\n * @param room 房间信息\n */\n \"room.start\": (room: Room) => void;\n /**\n * 房间结束游戏事件\n * @param room 房间信息\n */\n \"room.end\": (room: Room) => void;\n /**\n * 房间玩家全部准备事件\n * @param room 房间信息\n */\n \"room.all-ready\": (room: Room) => void;\n /**\n * 房间命令事件\n * @param command 命令内容\n */\n \"room.command\": (command: any & { sender: Player }) => void;\n /**\n * 房间消息事件\n * @param message 消息内容\n */\n \"room.message\": (message: { content: string; sender?: RoomPlayer }) => void;\n /**\n * 房间玩家准备事件\n * @param player 玩家信息\n * @param roomId 房间ID(可选)\n */\n \"room.player-ready\": (player: Player, roomId?: string) => void;\n /**\n * 房间玩家取消准备事件\n * @param player 玩家信息\n * @param roomId 房间ID(可选)\n */\n \"room.player-unready\": (player: Player, roomId?: string) => void;\n /**\n * 玩家列表更新事件(内部)\n * @param players 玩家列表\n */\n \"onPlayerList\": (players: Player[]) => void;\n /**\n * 房间列表更新事件(内部)\n * @param rooms 房间列表\n */\n \"onRoomList\": (rooms: Room[]) => void;\n /**\n * 房间开始游戏事件(内部)\n * @param room 房间信息\n */\n \"onRoomStart\": (room: Room) => void;\n /**\n * 房间结束游戏事件(内部)\n * @param room 房间信息\n */\n \"onRoomEnd\": (room: Room) => void;\n /**\n * 房间玩家全部准备事件(内部)\n * @param room 房间信息\n */\n \"onRoomAllReady\": (room: Room) => void;\n};\n\nexport class Player {\n id: string;\n name: string;\n attributes: Record<string, any>;\n status: string;\n constructor(player: Partial<Player>) {\n this.id = player.id || Date.now().toString();\n this.name = player.name || '玩家' + this.id;\n this.attributes = player.attributes || {};\n this.status = player.status || 'online';\n }\n}\n\nexport class RoomPlayer extends Player {\n role: string;\n isReady: boolean;\n isCreator: boolean;\n constructor(player: RoomPlayer) {\n super(player);\n this.role = player.role;\n this.isReady = player.isReady;\n this.isCreator = player.isCreator;\n }\n}\n\nexport class Room {\n id: string;\n name: string;\n players: RoomPlayer[];\n size: number;\n minSize: number;\n status: string;\n attrs: Record<string, any>;\n constructor(room: Room) {\n this.id = room.id;\n this.name = room.name;\n this.players = room.players.map(player => new RoomPlayer(player));\n this.size = room.size;\n this.minSize = room.minSize;\n this.status = room.status;\n this.attrs = room.attrs;\n }\n}\n\n/**\n * Tiaoom 客户端\n * @description 用于连接 Tiaoom 服务器并进行游戏交互,如创建房间、加入房间、发送命令等。\n * 需继承后实现具体的连接和消息发送逻辑。\n */\nexport class Tiaoom {\n listeners: Record<string, Function[]>;\n rooms: Room[];\n players: Player[];\n currentPlayer: Player | null;\n constructor() {\n this.listeners = {};\n this.rooms = [];\n this.players = [];\n this.currentPlayer = null;\n }\n\n /**\n * 启动游戏\n */\n run() {\n this.connect();\n this.onReady(() => {\n this.send({ type: MessageTypes.RoomList });\n this.send({ type: MessageTypes.PlayerList });\n });\n\n this.on(\"player.list\", (players) => {\n this.players = players.map(player => new Player(player));\n this.emit('onPlayerList', [...this.players]);\n });\n this.on(\"player.login\", (player) => {\n this.players.push(new Player(player));\n this.emit('onPlayerList', [...this.players]);\n });\n this.on(\"player.logout\", (player) => {\n this.players = this.players.filter(p => p.id !== player.id);\n this.emit('onPlayerList', [...this.players]);\n });\n\n\n this.on(\"room.list\", (rooms) => {\n this.rooms = rooms.map(room => new Room(room));\n this.emit('onRoomList', [...this.rooms]);\n });\n this.on(\"room.create\", (room) => {\n this.rooms.push(new Room(room));\n this.emit('onRoomList', this.rooms);\n });\n this.on(\"room.update\", (room) => {\n const existingRoom = this.rooms.find(r => r.id === room.id);\n if (!existingRoom) {\n this.rooms.push(new Room(room));\n } else {\n Object.assign(existingRoom, room);\n }\n this.emit('onRoomList', this.rooms);\n });\n this.on(\"room.close\", (room) => {\n this.rooms = this.rooms.filter(r => r.id !== room.id);\n this.emit('onRoomList', this.rooms);\n });\n this.on(\"room.update\", (room) => {\n const updatedRoom = this.rooms.find(r => r.id === room.id);\n if (updatedRoom) {\n Object.assign(updatedRoom, room);\n this.emit('onRoomList', this.rooms);\n }\n });\n\n return this;\n }\n\n /**\n * 连接服务器实现\n */\n connect() {\n throw new Error('Must be implement connect method');\n }\n\n /**\n * 发送消息实现\n */\n send(_: { type: MessageTypes, data?: any }) {\n throw new Error('Must be implement send method');\n }\n\n /**\n * 登录\n * @param {Player} player 玩家信息\n */\n login(player: Player) {\n this.currentPlayer = new Player(player);\n this.send({ type: MessageTypes.PlayerLogin, data: player });\n return this;\n }\n\n /**\n * 创建房间\n * @param {string} name 房间名称\n * @param {number} size 房间人数上限\n * @param {number} minSize 房间人数下限\n * @param {object} attrs 房间属性\n */\n createRoom({ name, size, minSize, attrs }: Omit<IRoomOptions, 'id'>) {\n return new Promise<void>((resolve) => {\n this.send({ type: MessageTypes.RoomCreate, data: { name, size, minSize, attrs } });\n this.on(\"room.create\", (room) => {\n resolve();\n });\n });\n }\n\n /**\n * 加入房间\n * @param {string} roomId 房间ID\n */\n joinRoom(roomId: string) {\n this.send({ type: MessageTypes.PlayerJoin, data: { roomId } });\n return this;\n }\n\n /**\n * 离开房间\n * @param {string} roomId 房间ID\n */\n leaveRoom(roomId: string) {\n this.send({ type: MessageTypes.PlayerLeave, data: { roomId } });\n return this;\n }\n\n /**\n * 踢出玩家\n * @param {string} roomId 房间ID\n * @param {string} playerId 玩家ID\n */\n kickPlayer(roomId: string, playerId: string) {\n this.send({ type: MessageTypes.RoomKick, data: { roomId, playerId } });\n return this;\n }\n\n /**\n * 转让房主\n * @param {string} roomId 房间ID\n * @param {string} playerId 目标玩家ID\n */\n transferRoom(roomId: string, playerId: string) {\n this.send({ type: MessageTypes.RoomTransfer, data: { roomId, playerId } });\n return this;\n }\n\n /**\n * 开始游戏\n * @param {string} id 房间ID\n */\n startGame(id: string) {\n this.send({ type: MessageTypes.RoomStart, data: { id } });\n return this;\n }\n\n /**\n * 准备/取消准备\n * @param {string} roomId 房间ID\n * @param {boolean} isReady 是否准备\n */\n ready(roomId: string, isReady=true) {\n this.send({ type: isReady ? MessageTypes.PlayerReady : MessageTypes.PlayerUnready, data: { roomId } });\n return this;\n }\n\n /**\n * 发送房间指令\n * @param {string} roomId 房间ID\n * @param {any} command 指令内容\n */\n command(command: any): this;\n command(roomId: string, command: any): this;\n command(roomId: string | any, command?: any) {\n if (typeof roomId != 'string') {\n command = roomId;\n this.send({ type: MessageTypes.GlobalCommand, data: command });\n } else {\n this.send({ type: MessageTypes.RoomPlayerCommand, data: { id: roomId, ...command } });\n }\n return this;\n }\n\n /**\n * 连接准备监听\n * @param {function} cb 监听函数\n */\n onReady(cb: () => void) {\n return this.on(\"sys.ready\", cb);\n }\n\n /**\n * 全局错误监听\n * @param {function} cb 监听函数\n */\n onError(cb: (error: Error) => void) {\n this.on(\"global.error\", cb);\n return this;\n }\n\n /**\n * 全局消息监听\n * @param {function} cb 监听函数\n */\n onMessage(cb: (message: string, sender?: Player) => void, on=true) {\n if (on) this.on(\"global.message\", cb);\n else this.off(\"global.message\", cb);\n return this;\n }\n\n /**\n * 玩家列表变更监听\n * @param {function} cb 监听函数\n */\n onPlayerList(cb: (players: Player[]) => void) {\n this.on(\"onPlayerList\", cb);\n return this;\n }\n\n /**\n * 房间列表变更监听\n * @param {function} cb 监听函数\n * @param {boolean} on 开启/关闭监听\n * @returns \n */\n onRoomList(cb: (rooms: Room[]) => void, on=true) {\n if (on) this.on(\"onRoomList\", cb);\n else this.off(\"onRoomList\", cb);\n return this;\n }\n\n /**\n * 玩家加入监听\n * @param {function} cb 监听函数\n * @param {boolean} on 开启/关闭监听\n * @returns \n */\n onPlayerJoin(cb: (room: Room, player: Player) => void, on=true) {\n if (on) this.on(\"room.join\", cb);\n else this.off(\"room.join\", cb);\n return this;\n }\n\n /**\n * 玩家离开监听\n * @param {function} cb 监听函数\n * @param {boolean} on 开启/关闭监听\n * @returns \n */\n onPlayerLeave(cb: (room: Room, player: Player) => void, on=true) {\n if (on) this.on(\"room.leave\", cb);\n else this.off(\"room.leave\", cb);\n return this;\n }\n\n /**\n * 玩家准备监听\n * @param {function} cb 监听函数\n * @param {boolean} on 开启/关闭监听\n * @returns \n */\n onPlayerReady(cb: (player: Player, roomId?: string) => void, on=true) {\n if (on) this.on(\"room.player-ready\", cb);\n else this.off(\"room.player-ready\", cb);\n return this;\n }\n\n /**\n * 玩家取消准备监听\n * @param {function} cb 监听函数\n * @param {boolean} on 开启/关闭监听\n * @returns \n */\n onPlayerUnready(cb: (player: Player, roomId?: string) => void, on=true) {\n if (on) this.on(\"room.player-unready\", cb);\n else this.off(\"room.player-unready\", cb);\n return this;\n }\n\n /**\n * 玩家状态更新监听\n * @param {function} cb 监听函数\n * @param {boolean} on 开启/关闭监听\n * @returns \n */\n onPlayerStatus(cb: (player: Player, status: any) => void, on=true) {\n if (on) this.on(\"player.status\", cb);\n else this.off(\"player.status\", cb);\n return this;\n }\n\n /**\n * 房间开始游戏监听\n * @param {function} cb 监听函数\n * @param {boolean} on 开启/关闭监听\n * @returns \n */\n onRoomStart(cb: (room: Room) => void, on=true) {\n if (!this.listeners[\"room.start\"]) {\n this.on(\"room.start\", (room) => this.emit(\"onRoomStart\", new Room(room)));\n }\n if (on) this.on(\"onRoomStart\", cb);\n else this.off(\"onRoomStart\", cb);\n return this;\n }\n\n /**\n * 房间结束游戏监听\n * @param {function} cb 监听函数\n * @param {boolean} on 开启/关闭监听\n * @returns\n */\n onRoomEnd(cb: (room: Room) => void, on=true) {\n if (!this.listeners[\"room.end\"]) {\n this.on(\"room.end\", (room) => this.emit(\"onRoomEnd\", new Room(room)));\n }\n if (on) this.on(\"onRoomEnd\", cb);\n else this.off(\"onRoomEnd\", cb);\n return this;\n }\n\n /**\n * 房间全部准备监听\n * @param {function} cb 监听函数\n * @param {boolean} on 开启/关闭监听\n * @returns \n */\n onRoomAllReady(cb: (room: Room) => void, on=true) {\n if (!this.listeners[\"room.all-ready\"]) {\n this.on(\"room.all-ready\", (room) => this.emit(\"onRoomAllReady\", new Room(room)));\n }\n if (on) this.on(\"onRoomAllReady\", cb);\n else this.off(\"onRoomAllReady\", cb);\n return this;\n }\n\n /**\n * 房间消息监听\n * @param {function} cb 监听函数\n * @param {boolean} on 开启/关闭监听\n * @returns \n */\n onRoomMessage(cb: (message: { content: string, sender?: RoomPlayer }) => void, on=true) {\n if (on) this.on(\"room.message\", cb);\n else this.off(\"room.message\", cb);\n return this;\n }\n\n /**\n * 玩家消息监听\n * @param {function} cb 监听函数\n * @param {boolean} on 开启/关闭监听\n * @returns \n */\n onPlayerMessage(cb: (message: { content: string, sender?: Player }) => void, on=true) {\n if (on) this.on(\"player.message\", cb);\n else this.off(\"player.message\", cb);\n return this;\n }\n\n /**\n * 房间指令监听\n * @param {function} cb 监听函数\n * @param {boolean} on 开启/关闭监听\n * @returns \n */\n onRoomCommand(cb: (command: any & { sender?: Player }) => void, on=true) {\n if (on) this.on(\"room.command\", cb);\n else this.off(\"room.command\", cb);\n return this;\n }\n\n /**\n * 玩家指令监听\n * @param {function} cb 监听函数\n * @param {boolean} on 开启/关闭监听\n * @returns \n */\n onPlayerCommand(cb: (command: any & { sender?: Player }) => void, on=true) {\n if (on) this.on(\"player.command\", cb);\n else this.off(\"player.command\", cb);\n return this;\n }\n\n /**\n * 事件监听\n * @param {string} event 事件名称\n * @param {TiaoomEvents[K]} listener 监听函数\n * @returns \n */\n on<K extends keyof TiaoomEvents>(event: K, listener: TiaoomEvents[K]): this {\n this.listeners[event] = this.listeners[event] || [];\n this.listeners[event].push(listener);\n return this;\n }\n\n /**\n * 事件取消监听\n * @param {string} event 事件名称\n * @param {TiaoomEvents[K]} listener 监听函数\n * @returns \n */\n off<K extends keyof TiaoomEvents>(event: K, listener: TiaoomEvents[K]): this {\n const listeners = this.listeners[event] || [];\n const index = listeners.indexOf(listener);\n if (index !== -1) {\n listeners.splice(index, 1);\n }\n return this;\n }\n\n /**\n * 事件触发\n * @param {string} event 事件名称\n * @param {Parameters<TiaoomEvents[K]>} args 参数\n * @returns \n */\n emit<K extends keyof TiaoomEvents>(event: K, ...args: Parameters<TiaoomEvents[K]>): this {\n const listeners = this.listeners[event] || [];\n listeners.forEach(listener => listener(...args));\n return this;\n }\n}\n"],"mappings":"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"}
|
package/src/client.mjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
let e=function(e){return e.RoomList=`room.list`,e.
|
|
1
|
+
let e=function(e){return e.RoomList=`room.list`,e.PlayerList=`player.list`,e.RoomCreate=`room.create`,e.PlayerJoin=`player.join`,e.PlayerLeave=`player.leave`,e.RoomGet=`room.get`,e.RoomStart=`room.start`,e.RoomKick=`room.kick`,e.RoomTransfer=`room.transfer`,e.RoomClose=`room.close`,e.PlayerLogin=`player.login`,e.PlayerLogout=`player.logout`,e.PlayerReady=`player.ready`,e.PlayerUnready=`player.unready`,e.RoomPlayerCommand=`room.player-command`,e.GlobalCommand=`global.command`,e}({});var t=class{constructor(e){this.id=e.id||Date.now().toString(),this.name=e.name||`玩家`+this.id,this.attributes=e.attributes||{},this.status=e.status||`online`}},n=class extends t{constructor(e){super(e),this.role=e.role,this.isReady=e.isReady,this.isCreator=e.isCreator}},r=class{constructor(e){this.id=e.id,this.name=e.name,this.players=e.players.map(e=>new n(e)),this.size=e.size,this.minSize=e.minSize,this.status=e.status,this.attrs=e.attrs}},i=class{constructor(){this.listeners={},this.rooms=[],this.players=[],this.currentPlayer=null}run(){return this.connect(),this.onReady(()=>{this.send({type:e.RoomList}),this.send({type:e.PlayerList})}),this.on(`player.list`,e=>{this.players=e.map(e=>new t(e)),this.emit(`onPlayerList`,[...this.players])}),this.on(`player.login`,e=>{this.players.push(new t(e)),this.emit(`onPlayerList`,[...this.players])}),this.on(`player.logout`,e=>{this.players=this.players.filter(t=>t.id!==e.id),this.emit(`onPlayerList`,[...this.players])}),this.on(`room.list`,e=>{this.rooms=e.map(e=>new r(e)),this.emit(`onRoomList`,[...this.rooms])}),this.on(`room.create`,e=>{this.rooms.push(new r(e)),this.emit(`onRoomList`,this.rooms)}),this.on(`room.update`,e=>{let t=this.rooms.find(t=>t.id===e.id);t?Object.assign(t,e):this.rooms.push(new r(e)),this.emit(`onRoomList`,this.rooms)}),this.on(`room.close`,e=>{this.rooms=this.rooms.filter(t=>t.id!==e.id),this.emit(`onRoomList`,this.rooms)}),this.on(`room.update`,e=>{let t=this.rooms.find(t=>t.id===e.id);t&&(Object.assign(t,e),this.emit(`onRoomList`,this.rooms))}),this}connect(){throw Error(`Must be implement connect method`)}send(e){throw Error(`Must be implement send method`)}login(n){return this.currentPlayer=new t(n),this.send({type:e.PlayerLogin,data:n}),this}createRoom({name:t,size:n,minSize:r,attrs:i}){return new Promise(a=>{this.send({type:e.RoomCreate,data:{name:t,size:n,minSize:r,attrs:i}}),this.on(`room.create`,e=>{a()})})}joinRoom(t){return this.send({type:e.PlayerJoin,data:{roomId:t}}),this}leaveRoom(t){return this.send({type:e.PlayerLeave,data:{roomId:t}}),this}kickPlayer(t,n){return this.send({type:e.RoomKick,data:{roomId:t,playerId:n}}),this}transferRoom(t,n){return this.send({type:e.RoomTransfer,data:{roomId:t,playerId:n}}),this}startGame(t){return this.send({type:e.RoomStart,data:{id:t}}),this}ready(t,n=!0){return this.send({type:n?e.PlayerReady:e.PlayerUnready,data:{roomId:t}}),this}command(t,n){return typeof t==`string`?this.send({type:e.RoomPlayerCommand,data:{id:t,...n}}):(n=t,this.send({type:e.GlobalCommand,data:n})),this}onReady(e){return this.on(`sys.ready`,e)}onError(e){return this.on(`global.error`,e),this}onMessage(e,t=!0){return t?this.on(`global.message`,e):this.off(`global.message`,e),this}onPlayerList(e){return this.on(`onPlayerList`,e),this}onRoomList(e,t=!0){return t?this.on(`onRoomList`,e):this.off(`onRoomList`,e),this}onPlayerJoin(e,t=!0){return t?this.on(`room.join`,e):this.off(`room.join`,e),this}onPlayerLeave(e,t=!0){return t?this.on(`room.leave`,e):this.off(`room.leave`,e),this}onPlayerReady(e,t=!0){return t?this.on(`room.player-ready`,e):this.off(`room.player-ready`,e),this}onPlayerUnready(e,t=!0){return t?this.on(`room.player-unready`,e):this.off(`room.player-unready`,e),this}onPlayerStatus(e,t=!0){return t?this.on(`player.status`,e):this.off(`player.status`,e),this}onRoomStart(e,t=!0){return this.listeners[`room.start`]||this.on(`room.start`,e=>this.emit(`onRoomStart`,new r(e))),t?this.on(`onRoomStart`,e):this.off(`onRoomStart`,e),this}onRoomEnd(e,t=!0){return this.listeners[`room.end`]||this.on(`room.end`,e=>this.emit(`onRoomEnd`,new r(e))),t?this.on(`onRoomEnd`,e):this.off(`onRoomEnd`,e),this}onRoomAllReady(e,t=!0){return this.listeners[`room.all-ready`]||this.on(`room.all-ready`,e=>this.emit(`onRoomAllReady`,new r(e))),t?this.on(`onRoomAllReady`,e):this.off(`onRoomAllReady`,e),this}onRoomMessage(e,t=!0){return t?this.on(`room.message`,e):this.off(`room.message`,e),this}onPlayerMessage(e,t=!0){return t?this.on(`player.message`,e):this.off(`player.message`,e),this}onRoomCommand(e,t=!0){return t?this.on(`room.command`,e):this.off(`room.command`,e),this}onPlayerCommand(e,t=!0){return t?this.on(`player.command`,e):this.off(`player.command`,e),this}on(e,t){return this.listeners[e]=this.listeners[e]||[],this.listeners[e].push(t),this}off(e,t){let n=this.listeners[e]||[],r=n.indexOf(t);return r!==-1&&n.splice(r,1),this}emit(e,...t){return(this.listeners[e]||[]).forEach(e=>e(...t)),this}};export{e as MessageTypes,t as Player,r as Room,n as RoomPlayer,i as Tiaoom};
|
|
2
2
|
//# sourceMappingURL=client.mjs.map
|