@takaro/gameserver 0.0.30 → 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (76) hide show
  1. package/dist/TakaroEmitter.d.ts +2 -1
  2. package/dist/TakaroEmitter.d.ts.map +1 -1
  3. package/dist/TakaroEmitter.js.map +1 -1
  4. package/dist/config.d.ts +9 -0
  5. package/dist/config.d.ts.map +1 -0
  6. package/dist/config.js +13 -0
  7. package/dist/config.js.map +1 -0
  8. package/dist/gameservers/7d2d/index.d.ts +5 -3
  9. package/dist/gameservers/7d2d/index.d.ts.map +1 -1
  10. package/dist/gameservers/7d2d/index.js +11 -6
  11. package/dist/gameservers/7d2d/index.js.map +1 -1
  12. package/dist/gameservers/7d2d/sdtdAPIClient.d.ts +1 -1
  13. package/dist/gameservers/7d2d/sdtdAPIClient.d.ts.map +1 -1
  14. package/dist/gameservers/7d2d/sdtdAPIClient.js +2 -1
  15. package/dist/gameservers/7d2d/sdtdAPIClient.js.map +1 -1
  16. package/dist/gameservers/generic/connectionInfo.d.ts +16 -0
  17. package/dist/gameservers/generic/connectionInfo.d.ts.map +1 -0
  18. package/dist/gameservers/{mock → generic}/connectionInfo.js +6 -14
  19. package/dist/gameservers/generic/connectionInfo.js.map +1 -0
  20. package/dist/gameservers/generic/connectorClient.d.ts +7 -0
  21. package/dist/gameservers/generic/connectorClient.d.ts.map +1 -0
  22. package/dist/gameservers/generic/connectorClient.js +84 -0
  23. package/dist/gameservers/generic/connectorClient.js.map +1 -0
  24. package/dist/gameservers/generic/emitter.d.ts +13 -0
  25. package/dist/gameservers/generic/emitter.d.ts.map +1 -0
  26. package/dist/gameservers/generic/emitter.js +31 -0
  27. package/dist/gameservers/generic/emitter.js.map +1 -0
  28. package/dist/gameservers/generic/index.d.ts +36 -0
  29. package/dist/gameservers/generic/index.d.ts.map +1 -0
  30. package/dist/gameservers/generic/index.js +170 -0
  31. package/dist/gameservers/generic/index.js.map +1 -0
  32. package/dist/gameservers/rust/index.d.ts +5 -3
  33. package/dist/gameservers/rust/index.d.ts.map +1 -1
  34. package/dist/gameservers/rust/index.js +12 -5
  35. package/dist/gameservers/rust/index.js.map +1 -1
  36. package/dist/getGame.d.ts +4 -3
  37. package/dist/getGame.d.ts.map +1 -1
  38. package/dist/getGame.js +7 -6
  39. package/dist/getGame.js.map +1 -1
  40. package/dist/interfaces/GameServer.d.ts +28 -2
  41. package/dist/interfaces/GameServer.d.ts.map +1 -1
  42. package/dist/interfaces/GameServer.js +97 -2
  43. package/dist/interfaces/GameServer.js.map +1 -1
  44. package/dist/main.d.ts +4 -2
  45. package/dist/main.d.ts.map +1 -1
  46. package/dist/main.js +4 -2
  47. package/dist/main.js.map +1 -1
  48. package/package.json +1 -1
  49. package/src/TakaroEmitter.ts +2 -1
  50. package/src/__tests__/gameEventEmitter.test.ts +4 -9
  51. package/src/config.ts +20 -0
  52. package/src/gameservers/7d2d/__tests__/7d2dEventDetection.unit.test.ts +0 -1
  53. package/src/gameservers/7d2d/index.ts +14 -5
  54. package/src/gameservers/7d2d/sdtdAPIClient.ts +3 -2
  55. package/src/gameservers/generic/connectionInfo.ts +19 -0
  56. package/src/gameservers/generic/connectorClient.ts +107 -0
  57. package/src/gameservers/generic/emitter.ts +36 -0
  58. package/src/gameservers/generic/index.ts +193 -0
  59. package/src/gameservers/rust/index.ts +16 -5
  60. package/src/getGame.ts +7 -5
  61. package/src/interfaces/GameServer.ts +91 -3
  62. package/src/main.ts +5 -3
  63. package/dist/gameservers/mock/connectionInfo.d.ts +0 -21
  64. package/dist/gameservers/mock/connectionInfo.d.ts.map +0 -1
  65. package/dist/gameservers/mock/connectionInfo.js.map +0 -1
  66. package/dist/gameservers/mock/emitter.d.ts +0 -13
  67. package/dist/gameservers/mock/emitter.d.ts.map +0 -1
  68. package/dist/gameservers/mock/emitter.js +0 -34
  69. package/dist/gameservers/mock/emitter.js.map +0 -1
  70. package/dist/gameservers/mock/index.d.ts +0 -35
  71. package/dist/gameservers/mock/index.d.ts.map +0 -1
  72. package/dist/gameservers/mock/index.js +0 -154
  73. package/dist/gameservers/mock/index.js.map +0 -1
  74. package/src/gameservers/mock/connectionInfo.ts +0 -25
  75. package/src/gameservers/mock/emitter.ts +0 -41
  76. package/src/gameservers/mock/index.ts +0 -182
@@ -1,7 +1,16 @@
1
1
  import { TakaroEmitter } from '../TakaroEmitter.js';
2
2
  import { IGamePlayer, IPosition } from '@takaro/modules';
3
3
  import { TakaroDTO } from '@takaro/util';
4
- import { IsBoolean, IsISO8601, IsNumber, IsOptional, IsString, ValidateNested } from 'class-validator';
4
+ import {
5
+ IsBoolean,
6
+ IsEnum,
7
+ IsISO8601,
8
+ IsNumber,
9
+ IsObject,
10
+ IsOptional,
11
+ IsString,
12
+ ValidateNested,
13
+ } from 'class-validator';
5
14
  import { Type } from 'class-transformer';
6
15
 
7
16
  export class CommandOutput extends TakaroDTO<CommandOutput> {
@@ -87,6 +96,54 @@ export class MapInfoDTO extends TakaroDTO<MapInfoDTO> {
87
96
  mapSizeZ: number;
88
97
  }
89
98
 
99
+ export enum EntityType {
100
+ HOSTILE = 'hostile',
101
+ FRIENDLY = 'friendly',
102
+ NEUTRAL = 'neutral',
103
+ }
104
+
105
+ export class IEntityDTO extends TakaroDTO<IEntityDTO> {
106
+ @IsString()
107
+ code: string;
108
+ @IsString()
109
+ name: string;
110
+ @IsString()
111
+ @IsOptional()
112
+ description: string;
113
+ @IsEnum(Object.values(EntityType))
114
+ @IsOptional()
115
+ type: EntityType;
116
+ @IsObject()
117
+ @IsOptional()
118
+ metadata?: Record<string, unknown>;
119
+ }
120
+
121
+ export class ILocationDTO extends TakaroDTO<ILocationDTO> {
122
+ @ValidateNested()
123
+ @Type(() => IPosition)
124
+ position: IPosition;
125
+ @IsNumber()
126
+ @IsOptional()
127
+ radius?: number; // For circular areas, radius in game units
128
+ @IsNumber()
129
+ @IsOptional()
130
+ sizeX?: number; // For rectangular areas, X dimension
131
+ @IsNumber()
132
+ @IsOptional()
133
+ sizeY?: number; // For rectangular areas, Y dimension
134
+ @IsNumber()
135
+ @IsOptional()
136
+ sizeZ?: number; // For rectangular areas, Z dimension (height)
137
+ @IsString()
138
+ name: string;
139
+ @IsString()
140
+ @IsOptional()
141
+ code?: string;
142
+ @IsObject()
143
+ @IsOptional()
144
+ metadata?: Record<string, unknown>;
145
+ }
146
+
90
147
  export interface IGameServer {
91
148
  connectionInfo: unknown;
92
149
  getEventEmitter(): TakaroEmitter;
@@ -99,9 +156,12 @@ export interface IGameServer {
99
156
  giveItem(player: IPlayerReferenceDTO, item: string, amount: number, quality?: string): Promise<void>;
100
157
  listItems(): Promise<IItemDTO[]>;
101
158
 
159
+ listEntities(): Promise<IEntityDTO[]>;
160
+ listLocations(): Promise<ILocationDTO[]>;
161
+
102
162
  executeConsoleCommand(rawCommand: string): Promise<CommandOutput>;
103
163
  sendMessage(message: string, opts: IMessageOptsDTO): Promise<void>;
104
- teleportPlayer(player: IPlayerReferenceDTO, x: number, y: number, z: number): Promise<void>;
164
+ teleportPlayer(player: IPlayerReferenceDTO, x: number, y: number, z: number, dimension?: string): Promise<void>;
105
165
 
106
166
  /**
107
167
  * Try and connect to the gameserver
@@ -117,5 +177,33 @@ export interface IGameServer {
117
177
  shutdown(): Promise<void>;
118
178
 
119
179
  getMapInfo(): Promise<MapInfoDTO>;
120
- getMapTile(x: number, y: number, z: number): Promise<Buffer>;
180
+ // Returns a base64 encoded image of the map tile
181
+ getMapTile(x: number, y: number, z: number): Promise<string>;
121
182
  }
183
+
184
+ // All actions that can be sent to the gameserver
185
+ // So the IGameServer interface, but with some internal types omitted
186
+ export type GameServerActions = keyof Omit<IGameServer, 'getEventEmitter' | 'connectionInfo'>;
187
+ // Also create a runtime array with all the actions
188
+ // This is used for class-validator
189
+ export const GAME_SERVER_ACTIONS: GameServerActions[] = [
190
+ 'getPlayer',
191
+ 'getPlayers',
192
+ 'getPlayerLocation',
193
+ 'getPlayerInventory',
194
+ 'giveItem',
195
+ 'listItems',
196
+ 'listEntities',
197
+ 'listLocations',
198
+ 'executeConsoleCommand',
199
+ 'sendMessage',
200
+ 'teleportPlayer',
201
+ 'testReachability',
202
+ 'kickPlayer',
203
+ 'banPlayer',
204
+ 'unbanPlayer',
205
+ 'listBans',
206
+ 'shutdown',
207
+ 'getMapInfo',
208
+ 'getMapTile',
209
+ ];
package/src/main.ts CHANGED
@@ -2,9 +2,6 @@ export * from './interfaces/GameServer.js';
2
2
 
3
3
  export { TakaroEmitter } from './TakaroEmitter.js';
4
4
 
5
- export { Mock } from './gameservers/mock/index.js';
6
- export { MockConnectionInfo, mockJsonSchema } from './gameservers/mock/connectionInfo.js';
7
-
8
5
  export { SevenDaysToDie } from './gameservers/7d2d/index.js';
9
6
  export { SdtdConnectionInfo, sdtdJsonSchema } from './gameservers/7d2d/connectionInfo.js';
10
7
 
@@ -12,3 +9,8 @@ export { Rust } from './gameservers/rust/index.js';
12
9
  export { RustConnectionInfo, rustJsonSchema } from './gameservers/rust/connectionInfo.js';
13
10
 
14
11
  export { getGame, GAME_SERVER_TYPE } from './getGame.js';
12
+
13
+ export { Generic } from './gameservers/generic/index.js';
14
+ export { TakaroConnector } from './gameservers/generic/connectorClient.js';
15
+ export { GenericEmitter } from './gameservers/generic/emitter.js';
16
+ export { GenericConnectionInfo, genericJsonSchema } from './gameservers/generic/connectionInfo.js';
@@ -1,21 +0,0 @@
1
- import { TakaroDTO } from '@takaro/util';
2
- export declare class MockConnectionInfo extends TakaroDTO<MockConnectionInfo> {
3
- host: string;
4
- name: string;
5
- }
6
- export declare const mockJsonSchema: {
7
- $schema: string;
8
- title: string;
9
- type: string;
10
- properties: {
11
- host: {
12
- type: string;
13
- };
14
- name: {
15
- type: string;
16
- default: string;
17
- };
18
- };
19
- required: string[];
20
- };
21
- //# sourceMappingURL=connectionInfo.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"connectionInfo.d.ts","sourceRoot":"","sources":["../../../src/gameservers/mock/connectionInfo.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAEzC,qBAAa,kBAAmB,SAAQ,SAAS,CAAC,kBAAkB,CAAC;IAE5D,IAAI,EAAG,MAAM,CAAC;IAEd,IAAI,EAAG,MAAM,CAAC;CACtB;AAED,eAAO,MAAM,cAAc;;;;;;;;;;;;;;CAc1B,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"connectionInfo.js","sourceRoot":"","sources":["../../../src/gameservers/mock/connectionInfo.ts"],"names":[],"mappings":";;;;;;;;;AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAC3C,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAEzC,MAAM,OAAO,kBAAmB,SAAQ,SAA6B;CAKpE;AAHQ;IADN,QAAQ,EAAE;;gDACU;AAEd;IADN,QAAQ,EAAE;;gDACU;AAGvB,MAAM,CAAC,MAAM,cAAc,GAAG;IAC5B,OAAO,EAAE,yCAAyC;IAClD,KAAK,EAAE,oBAAoB;IAC3B,IAAI,EAAE,QAAQ;IACd,UAAU,EAAE;QACV,IAAI,EAAE;YACJ,IAAI,EAAE,QAAQ;SACf;QACD,IAAI,EAAE;YACJ,IAAI,EAAE,QAAQ;YACd,OAAO,EAAE,MAAM;SAChB;KACF;IACD,QAAQ,EAAE,CAAC,MAAM,CAAC;CACnB,CAAC"}
@@ -1,13 +0,0 @@
1
- import { MockConnectionInfo } from './connectionInfo.js';
2
- import { TakaroEmitter } from '../../TakaroEmitter.js';
3
- import { Socket } from 'socket.io-client';
4
- export declare class MockEmitter extends TakaroEmitter {
5
- private config;
6
- private io;
7
- private scopedListener;
8
- constructor(config: MockConnectionInfo, io: Socket);
9
- start(): Promise<void>;
10
- stop(): Promise<void>;
11
- private listener;
12
- }
13
- //# sourceMappingURL=emitter.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"emitter.d.ts","sourceRoot":"","sources":["../../../src/gameservers/mock/emitter.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AACvD,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAI1C,qBAAa,WAAY,SAAQ,aAAa;IAI1C,OAAO,CAAC,MAAM;IACd,OAAO,CAAC,EAAE;IAJZ,OAAO,CAAC,cAAc,CAA4B;gBAGxC,MAAM,EAAE,kBAAkB,EAC1B,EAAE,EAAE,MAAM;IAKd,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAItB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;YAKb,QAAQ;CAcvB"}
@@ -1,34 +0,0 @@
1
- import { logger } from '@takaro/util';
2
- import { TakaroEmitter } from '../../TakaroEmitter.js';
3
- import { EventMapping } from '@takaro/modules';
4
- const log = logger('Mock');
5
- export class MockEmitter extends TakaroEmitter {
6
- constructor(config, io) {
7
- super();
8
- this.config = config;
9
- this.io = io;
10
- this.scopedListener = this.listener.bind(this);
11
- }
12
- async start() {
13
- this.io.onAny(this.scopedListener);
14
- }
15
- async stop() {
16
- this.io.removeAllListeners();
17
- this.io.disconnect();
18
- }
19
- async listener(event, args) {
20
- if (this.config.name !== args.name) {
21
- // This event is not for us
22
- return;
23
- }
24
- log.debug(`Transmitting event ${event}`);
25
- const dto = EventMapping[event];
26
- if (dto) {
27
- this.emit(event, new dto(args));
28
- }
29
- else {
30
- this.emit(event, args);
31
- }
32
- }
33
- }
34
- //# sourceMappingURL=emitter.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"emitter.js","sourceRoot":"","sources":["../../../src/gameservers/mock/emitter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAEtC,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAEvD,OAAO,EAAE,YAAY,EAAkB,MAAM,iBAAiB,CAAC;AAE/D,MAAM,GAAG,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC;AAC3B,MAAM,OAAO,WAAY,SAAQ,aAAa;IAG5C,YACU,MAA0B,EAC1B,EAAU;QAElB,KAAK,EAAE,CAAC;QAHA,WAAM,GAAN,MAAM,CAAoB;QAC1B,OAAE,GAAF,EAAE,CAAQ;QAJZ,mBAAc,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAOlD,CAAC;IAED,KAAK,CAAC,KAAK;QACT,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;IACrC,CAAC;IAED,KAAK,CAAC,IAAI;QACR,IAAI,CAAC,EAAE,CAAC,kBAAkB,EAAE,CAAC;QAC7B,IAAI,CAAC,EAAE,CAAC,UAAU,EAAE,CAAC;IACvB,CAAC;IAEO,KAAK,CAAC,QAAQ,CAAC,KAAqB,EAAE,IAAS;QACrD,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI,EAAE,CAAC;YACnC,2BAA2B;YAC3B,OAAO;QACT,CAAC;QACD,GAAG,CAAC,KAAK,CAAC,sBAAsB,KAAK,EAAE,CAAC,CAAC;QACzC,MAAM,GAAG,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC;QAEhC,IAAI,GAAG,EAAE,CAAC;YACR,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;QAClC,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;QACzB,CAAC;IACH,CAAC;CACF"}
@@ -1,35 +0,0 @@
1
- import { IGamePlayer, IPosition } from '@takaro/modules';
2
- import { BanDTO, CommandOutput, IGameServer, IItemDTO, IMessageOptsDTO, IPlayerReferenceDTO, MapInfoDTO, TestReachabilityOutputDTO } from '../../interfaces/GameServer.js';
3
- import { MockEmitter } from './emitter.js';
4
- import { Socket } from 'socket.io-client';
5
- import { MockConnectionInfo } from './connectionInfo.js';
6
- import { Settings } from '@takaro/apiclient';
7
- export declare class Mock implements IGameServer {
8
- private settings;
9
- private logger;
10
- connectionInfo: MockConnectionInfo;
11
- emitter: MockEmitter;
12
- io: Socket;
13
- constructor(config: MockConnectionInfo, settings?: Partial<Settings>);
14
- getEventEmitter(): MockEmitter;
15
- private getClient;
16
- private requestFromServer;
17
- getPlayer(player: IPlayerReferenceDTO): Promise<IGamePlayer | null>;
18
- getPlayers(): Promise<IGamePlayer[]>;
19
- getPlayerLocation(player: IPlayerReferenceDTO): Promise<IPosition | null>;
20
- testReachability(): Promise<TestReachabilityOutputDTO>;
21
- executeConsoleCommand(rawCommand: string): Promise<CommandOutput>;
22
- sendMessage(message: string, opts: IMessageOptsDTO): Promise<any>;
23
- teleportPlayer(player: IGamePlayer, x: number, y: number, z: number): Promise<any>;
24
- kickPlayer(player: IGamePlayer, reason: string): Promise<any>;
25
- banPlayer(options: BanDTO): Promise<any>;
26
- unbanPlayer(player: IGamePlayer): Promise<any>;
27
- listBans(): Promise<BanDTO[]>;
28
- giveItem(player: IPlayerReferenceDTO, item: string, amount: number, quality: string): Promise<void>;
29
- listItems(): Promise<IItemDTO[]>;
30
- getPlayerInventory(player: IPlayerReferenceDTO): Promise<IItemDTO[]>;
31
- shutdown(): Promise<void>;
32
- getMapInfo(): Promise<MapInfoDTO>;
33
- getMapTile(_x: number, _y: number, _z: number): Promise<Buffer>;
34
- }
35
- //# sourceMappingURL=index.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/gameservers/mock/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AACzD,OAAO,EACL,MAAM,EACN,aAAa,EACb,WAAW,EACX,QAAQ,EACR,eAAe,EACf,mBAAmB,EACnB,UAAU,EACV,yBAAyB,EAC1B,MAAM,gCAAgC,CAAC;AACxC,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,EAAE,MAAM,EAAM,MAAM,kBAAkB,CAAC;AAE9C,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAE7C,qBACa,IAAK,YAAW,WAAW;IAQpC,OAAO,CAAC,QAAQ;IAPlB,OAAO,CAAC,MAAM,CAAkB;IAChC,cAAc,EAAE,kBAAkB,CAAC;IACnC,OAAO,EAAE,WAAW,CAAC;IACrB,EAAE,EAAE,MAAM,CAAC;gBAGT,MAAM,EAAE,kBAAkB,EAClB,QAAQ,GAAE,OAAO,CAAC,QAAQ,CAAM;IAY1C,eAAe;YAID,SAAS;YA8BT,iBAAiB;IAKzB,SAAS,CAAC,MAAM,EAAE,mBAAmB,GAAG,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC;IAInE,UAAU,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC;IAIpC,iBAAiB,CAAC,MAAM,EAAE,mBAAmB,GAAG,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC;IAIzE,gBAAgB,IAAI,OAAO,CAAC,yBAAyB,CAAC;IAiCtD,qBAAqB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC;IAIjE,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,eAAe;IAIlD,cAAc,CAAC,MAAM,EAAE,WAAW,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM;IAInE,UAAU,CAAC,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM;IAI9C,SAAS,CAAC,OAAO,EAAE,MAAM;IAIzB,WAAW,CAAC,MAAM,EAAE,WAAW;IAI/B,QAAQ,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IAI7B,QAAQ,CAAC,MAAM,EAAE,mBAAmB,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAInG,SAAS,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;IAIhC,kBAAkB,CAAC,MAAM,EAAE,mBAAmB,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC;IAIpE,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAIzB,UAAU,IAAI,OAAO,CAAC,UAAU,CAAC;IAWjC,UAAU,CAAC,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;CAGtE"}
@@ -1,154 +0,0 @@
1
- var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
- var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
- if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
- else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
- return c > 3 && r && Object.defineProperty(target, key, r), r;
6
- };
7
- var __metadata = (this && this.__metadata) || function (k, v) {
8
- if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
9
- };
10
- import { logger, traceableClass } from '@takaro/util';
11
- import { MapInfoDTO, TestReachabilityOutputDTO, } from '../../interfaces/GameServer.js';
12
- import { MockEmitter } from './emitter.js';
13
- import { io } from 'socket.io-client';
14
- import assert from 'assert';
15
- import { MockConnectionInfo } from './connectionInfo.js';
16
- let Mock = class Mock {
17
- constructor(config, settings = {}) {
18
- this.settings = settings;
19
- this.logger = logger('Mock');
20
- this.connectionInfo = config;
21
- if (!this.connectionInfo.name)
22
- this.connectionInfo.name = 'default';
23
- this.io = io(this.connectionInfo.host, {
24
- query: {
25
- name: config.name,
26
- },
27
- });
28
- this.emitter = new MockEmitter(this.connectionInfo, this.io);
29
- }
30
- getEventEmitter() {
31
- return this.emitter;
32
- }
33
- async getClient(timeout = 2500) {
34
- if (this.io.connected) {
35
- return this.io;
36
- }
37
- return Promise.race([
38
- new Promise((resolve, reject) => {
39
- const onConnect = () => {
40
- this.io.off('connect_error', onConnectError);
41
- resolve(this.io);
42
- };
43
- const onConnectError = (err) => {
44
- this.io.off('connect', onConnect);
45
- reject(err);
46
- };
47
- this.io.on('connect', onConnect);
48
- this.io.on('connect_error', onConnectError);
49
- }),
50
- new Promise((_, reject) => {
51
- setTimeout(() => {
52
- this.io.off('connect');
53
- this.io.off('connect_error');
54
- reject(new Error(`Connection timed out after ${timeout}ms`));
55
- }, timeout);
56
- }),
57
- ]);
58
- }
59
- async requestFromServer(event, ...args) {
60
- const client = await this.getClient();
61
- return client.timeout(30000).emitWithAck(event, this.connectionInfo.name, ...args);
62
- }
63
- async getPlayer(player) {
64
- return this.requestFromServer('getPlayer', player);
65
- }
66
- async getPlayers() {
67
- return this.requestFromServer('getPlayers');
68
- }
69
- async getPlayerLocation(player) {
70
- return this.requestFromServer('getPlayerLocation', player);
71
- }
72
- async testReachability() {
73
- const start = Date.now();
74
- try {
75
- const data = await this.requestFromServer('ping');
76
- assert(data === 'pong');
77
- }
78
- catch (error) {
79
- if (!error || !(error instanceof Error)) {
80
- return new TestReachabilityOutputDTO({
81
- connectable: false,
82
- reason: `Unknown error: ${error}`,
83
- });
84
- }
85
- if (error.name === 'AssertionError') {
86
- return new TestReachabilityOutputDTO({
87
- connectable: false,
88
- reason: 'Server responded with invalid data',
89
- });
90
- }
91
- return new TestReachabilityOutputDTO({
92
- connectable: false,
93
- reason: `Unable to connect to server: ${error.message}`,
94
- });
95
- }
96
- const end = Date.now();
97
- return new TestReachabilityOutputDTO({
98
- connectable: true,
99
- latency: end - start,
100
- });
101
- }
102
- async executeConsoleCommand(rawCommand) {
103
- return this.requestFromServer('executeConsoleCommand', rawCommand);
104
- }
105
- async sendMessage(message, opts) {
106
- return this.requestFromServer('sendMessage', message, opts);
107
- }
108
- async teleportPlayer(player, x, y, z) {
109
- return this.requestFromServer('teleportPlayer', player, x, y, z);
110
- }
111
- async kickPlayer(player, reason) {
112
- return this.requestFromServer('kickPlayer', player, reason);
113
- }
114
- async banPlayer(options) {
115
- return this.requestFromServer('banPlayer', options);
116
- }
117
- async unbanPlayer(player) {
118
- return this.requestFromServer('unbanPlayer', player);
119
- }
120
- async listBans() {
121
- return this.requestFromServer('listBans');
122
- }
123
- async giveItem(player, item, amount, quality) {
124
- return this.requestFromServer('giveItem', player, item, amount, quality);
125
- }
126
- async listItems() {
127
- return this.requestFromServer('listItems');
128
- }
129
- async getPlayerInventory(player) {
130
- return this.requestFromServer('getPlayerInventory', player);
131
- }
132
- async shutdown() {
133
- return this.requestFromServer('shutdown');
134
- }
135
- async getMapInfo() {
136
- return new MapInfoDTO({
137
- enabled: false,
138
- mapBlockSize: 0,
139
- maxZoom: 0,
140
- mapSizeX: 0,
141
- mapSizeY: 0,
142
- mapSizeZ: 0,
143
- });
144
- }
145
- async getMapTile(_x, _y, _z) {
146
- throw new Error('Not implemented');
147
- }
148
- };
149
- Mock = __decorate([
150
- traceableClass('game:mock'),
151
- __metadata("design:paramtypes", [MockConnectionInfo, Object])
152
- ], Mock);
153
- export { Mock };
154
- //# sourceMappingURL=index.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/gameservers/mock/index.ts"],"names":[],"mappings":"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"}
@@ -1,25 +0,0 @@
1
- import { IsString } from 'class-validator';
2
- import { TakaroDTO } from '@takaro/util';
3
-
4
- export class MockConnectionInfo extends TakaroDTO<MockConnectionInfo> {
5
- @IsString()
6
- public host!: string;
7
- @IsString()
8
- public name!: string;
9
- }
10
-
11
- export const mockJsonSchema = {
12
- $schema: 'http://json-schema.org/draft-07/schema#',
13
- title: 'MockConnectionInfo',
14
- type: 'object',
15
- properties: {
16
- host: {
17
- type: 'string',
18
- },
19
- name: {
20
- type: 'string',
21
- default: 'mock',
22
- },
23
- },
24
- required: ['host'],
25
- };
@@ -1,41 +0,0 @@
1
- import { logger } from '@takaro/util';
2
- import { MockConnectionInfo } from './connectionInfo.js';
3
- import { TakaroEmitter } from '../../TakaroEmitter.js';
4
- import { Socket } from 'socket.io-client';
5
- import { EventMapping, GameEventTypes } from '@takaro/modules';
6
-
7
- const log = logger('Mock');
8
- export class MockEmitter extends TakaroEmitter {
9
- private scopedListener = this.listener.bind(this);
10
-
11
- constructor(
12
- private config: MockConnectionInfo,
13
- private io: Socket,
14
- ) {
15
- super();
16
- }
17
-
18
- async start(): Promise<void> {
19
- this.io.onAny(this.scopedListener);
20
- }
21
-
22
- async stop(): Promise<void> {
23
- this.io.removeAllListeners();
24
- this.io.disconnect();
25
- }
26
-
27
- private async listener(event: GameEventTypes, args: any) {
28
- if (this.config.name !== args.name) {
29
- // This event is not for us
30
- return;
31
- }
32
- log.debug(`Transmitting event ${event}`);
33
- const dto = EventMapping[event];
34
-
35
- if (dto) {
36
- this.emit(event, new dto(args));
37
- } else {
38
- this.emit(event, args);
39
- }
40
- }
41
- }