Skip to content

Commit bc930e4

Browse files
committed
feat: uses game parser
1 parent 14ace4d commit bc930e4

File tree

1 file changed

+27
-17
lines changed

1 file changed

+27
-17
lines changed

electron/main/game/game.service.ts

+27-17
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,24 @@
11
import fs from 'fs-extra';
2-
import * as rxjs from 'rxjs';
2+
import type * as rxjs from 'rxjs';
33
import { waitUntil } from '../../common/async';
44
import type { Maybe } from '../../common/types';
55
import { createLogger } from '../logger';
66
import type { SGEGameCredentials } from '../sge';
7+
import { GameParserImpl } from './game.parser';
78
import { GameSocketImpl } from './game.socket';
8-
import type { GameEvent, GameService, GameSocket } from './game.types';
9+
import type {
10+
GameEvent,
11+
GameParser,
12+
GameService,
13+
GameSocket,
14+
} from './game.types';
915

1016
const logger = createLogger('game:service');
1117

18+
/**
19+
* This class isn't exported. To ensure a single instance exists then
20+
* it's exposed through the exported `Game` object at bottom of this file.
21+
*/
1222
class GameServiceImpl implements GameService {
1323
/**
1424
* Indicates if the protocol to authenticate to the game server has completed.
@@ -23,8 +33,14 @@ class GameServiceImpl implements GameService {
2333
*/
2434
private socket: GameSocket;
2535

36+
/**
37+
* Parses game socket output into game events.
38+
*/
39+
private parser: GameParser;
40+
2641
constructor(options: { credentials: SGEGameCredentials }) {
2742
const { credentials } = options;
43+
this.parser = new GameParserImpl();
2844
this.socket = new GameSocketImpl({
2945
credentials,
3046
onConnect: () => {
@@ -45,32 +61,24 @@ class GameServiceImpl implements GameService {
4561

4662
logger.info('connecting');
4763

48-
const writeStream = fs.createWriteStream('game.log'); // TODO remove
49-
const gameEventsSubject$ = new rxjs.Subject<GameEvent>();
5064
const socketData$ = await this.socket.connect();
65+
const gameEvents$ = this.parser.parse(socketData$);
5166

67+
// TODO remove writing to file; just helpful for early development
68+
const writeStream = fs.createWriteStream('game.log');
5269
socketData$.subscribe({
5370
next: (data: string) => {
54-
writeStream.write(data);
55-
// TODO parse data into game event(s)
56-
const gameEvents = new Array<any>() as Array<GameEvent>;
57-
gameEvents.forEach((gameEvent) => {
58-
gameEventsSubject$.next(gameEvent);
59-
});
71+
writeStream.write(`---\n${data}`);
6072
},
61-
error: (error: Error) => {
62-
logger.error('game socket stream error', { error });
73+
error: () => {
6374
writeStream.end();
64-
gameEventsSubject$.error(error);
6575
},
6676
complete: () => {
67-
logger.info('game socket stream completed');
6877
writeStream.end();
69-
gameEventsSubject$.complete();
7078
},
7179
});
7280

73-
return gameEventsSubject$.asObservable();
81+
return gameEvents$;
7482
}
7583

7684
public async disconnect(): Promise<void> {
@@ -82,7 +90,9 @@ class GameServiceImpl implements GameService {
8290
}
8391

8492
public send(command: string): void {
85-
this.socket.send(command);
93+
if (this.isConnected) {
94+
this.socket.send(command);
95+
}
8696
}
8797

8898
protected async waitUntilDestroyed(): Promise<void> {

0 commit comments

Comments
 (0)