From 6491588223fbb2dc31c5b0f30751a0c2410572e8 Mon Sep 17 00:00:00 2001 From: Tangent Wantwight Date: Sun, 17 May 2020 23:39:28 -0400 Subject: [PATCH] Add proper "helo" message to protocol so client can be sure server is ready to receive input. --- src/net/LockstepClient.ts | 18 +++++++++++++----- src/net/LoopbackServer.ts | 14 ++++++++++++-- 2 files changed, 25 insertions(+), 7 deletions(-) diff --git a/src/net/LockstepClient.ts b/src/net/LockstepClient.ts index 296935e..8e64b8e 100644 --- a/src/net/LockstepClient.ts +++ b/src/net/LockstepClient.ts @@ -30,6 +30,10 @@ export const enum MessageTypes { export type Packet = { t: TypeId } & Payload; +export type Meta = { + helo?: string; +}; + export type ClientMessage = | Packet }> | Packet @@ -37,6 +41,7 @@ export type ClientMessage = ; export type ServerMessage = + | Packet | Packet }> | Packet | Packet @@ -85,11 +90,6 @@ export abstract class LockstepClient { } }); - // talkback should exist at this point, send reset message - if(this.serverTalkback) { - this.serverTalkback(1, {t: MessageTypes.SET_STATE, s: {}}); - } - // disposal return () => { this.serverTalkback?.(2); @@ -110,6 +110,14 @@ export abstract class LockstepClient { private processMessage(message: ServerMessage) { switch (message.t) { + case MessageTypes.META: + if(message.helo) { + console.log(`Connected to ${message.helo}`); + + // Connection established, reset state for now + this.serverTalkback?.(1, {t: MessageTypes.SET_STATE, s: {}}); + } + break; case MessageTypes.SET_STATE: const resetState = this.initState(message.s); this.state = new LockstepState(resetState, this.engine); diff --git a/src/net/LoopbackServer.ts b/src/net/LoopbackServer.ts index b31bed6..4439982 100644 --- a/src/net/LoopbackServer.ts +++ b/src/net/LoopbackServer.ts @@ -3,9 +3,19 @@ import pipe from "callbag-pipe"; import share from "callbag-share"; import { INPUT_FREQUENCY } from "../ecs/Lockstep"; -import { catchTalkback, defer, interval, makeSubject, map, merge } from "../utilities/Callbag"; +import { + catchTalkback, + defer, + interval, + lazy, + makeSubject, + map, + merge, +} from "../utilities/Callbag"; import { ClientMessage, MessageTypes, ServerMessage } from "./LockstepClient"; +const heloSource: Callbag> = lazy(() => ({ t: MessageTypes.META, helo: "In-Process Loopback Server" })); + /** Stub loopback server that handles multiple clients, for schemes where GlobalInput = LocalInput[] */ export class LoopbackServer { @@ -26,7 +36,7 @@ export class LoopbackServer { public readonly socket = defer(() => { const playerNumber = this.nextClientId++; return pipe( - this.serverFeed, + merge(this.serverFeed, heloSource), catchTalkback((message: ClientMessage) => this.processMessage(playerNumber, message)), map(message => this.postprocessResponse(playerNumber, message)) );