Skip to content

Commit

Permalink
Change server to be used as library
Browse files Browse the repository at this point in the history
  • Loading branch information
CodeDoctorDE committed Oct 1, 2024
1 parent b6f9f7e commit 5768cc9
Show file tree
Hide file tree
Showing 11 changed files with 351 additions and 277 deletions.
92 changes: 2 additions & 90 deletions server/bin/quokka_server.dart
Original file line number Diff line number Diff line change
@@ -1,93 +1,5 @@
import 'package:args/args.dart';
import 'package:quokka_api/quokka_api.dart';
import 'package:quokka_server/main.dart';

const String version = '0.0.1';

ArgParser buildParser() {
return ArgParser()
..addFlag(
'help',
abbr: 'h',
negatable: false,
help: 'Print this usage information.',
)
..addFlag(
'verbose',
abbr: 'v',
negatable: false,
help: 'Show additional command output.',
)
..addFlag(
'version',
abbr: 'V',
negatable: false,
help: 'Print the tool version.',
)
..addOption(
'port',
abbr: 'p',
help: 'The port to run the server on. Defaults to $kDefaultPort.',
)
..addOption(
'description',
abbr: 'd',
help:
'A description of the server. Will be displayed in the server list.',
)
..addOption('autosave',
abbr: 'a', help: "Disable saving of the world automatically");
}

void printUsage(ArgParser argParser) {
print('Usage: server <flags> [arguments]');
print(argParser.usage);
}

const welcomeText = """
____ __ __
/ __ \\__ _____ / /__ / /_____ _
/ /_/ / // / _ \\/ '_// '_/ _ `/
\\___\\_\\_,_/\\___/_/\\_\\/_/\\_\\\\_,_/
""";
Future<void> main(List<String> arguments) async {
final ArgParser argParser = buildParser();
try {
final ArgResults results = argParser.parse(arguments);
bool verbose = false, autosave = false;

// Process the parsed arguments.
if (results.wasParsed('help')) {
printUsage(argParser);
return;
}
if (results.wasParsed('version')) {
print('server version: $version');
return;
}
if (results.wasParsed('verbose')) {
verbose = true;
}
if (results.wasParsed('autosave')) {
autosave = true;
}
String description = '';
if (results.wasParsed('description')) {
description = results['description'];
}
print(welcomeText);
final server = await QuokkaServer.load();
await server.init(
port: int.tryParse(results['port'] ?? '') ?? kDefaultPort,
verbose: verbose,
autosave: autosave,
description: description,
);
await server.run();
} on FormatException catch (e) {
// Print usage information if an invalid argument was provided.
print(e.message);
print('');
printUsage(argParser);
}
Future<void> main(List<String> arguments) {
return runServer(arguments);
}
44 changes: 44 additions & 0 deletions server/lib/events.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
import 'dart:async';

import 'package:networker/networker.dart';
import 'package:quokka_server/server.dart';

typedef ListenerResult<S> = (S, Channel)?;

typedef EventListener<T, S> = FutureOr<ListenerResult<S>> Function(
S serverEvent,
Channel target,
T clientEvent,
Channel source,
QuokkaServer server,
);

final class EventSystem<T, S> {
final Map<T, List<EventListener<T, S>>> _listeners = {};

void addListener(T event, EventListener<T, S> listener) {
_listeners.putIfAbsent(event, () => []).add(listener);
}

void removeListener(T event, EventListener<T, S> listener) {
_listeners[event]?.remove(listener);
}

Future<ListenerResult<S>> dispatch(
S serverEvent,
Channel target,
T clientEvent,
Channel source,
QuokkaServer server,
) async {
final listeners = _listeners[clientEvent];
if (listeners == null) return null;
ListenerResult<S> result = (serverEvent, target);
for (final listener in listeners) {
if (result == null) return null;
result =
await listener(result.$1, result.$2, clientEvent, source, server);
}
return result;
}
}
Loading

0 comments on commit 5768cc9

Please sign in to comment.