Integrate draft/network stack via Vuex #26

Merged
hamcha merged 5 commits from feature/vuex into master 2019-09-17 13:22:43 +00:00
5 changed files with 92 additions and 17 deletions
Showing only changes of commit 4da4e06871 - Show all commits

View file

@ -0,0 +1,23 @@
import { ActionTree } from "vuex";
import { AppState } from "../types";
import { NetworkState, StartServerOptions, ConnectOptions } from "./types";
import { PeerServer, LocalClient, PeerClient } from "@/network";
const actions: ActionTree<NetworkState, AppState> = {
startServer({ commit }, options: StartServerOptions) {
const local = new LocalClient(options.playerInfo);
const server = new PeerServer(options.roomInfo, local, options._customPeer);
commit("becomeServer", { local, server });
},
connect({ commit }, options: ConnectOptions) {
const client = new PeerClient(options.playerInfo, options._customPeer);
commit("becomeClient", { peer: client });
client.once("connected", () => {
commit("connected");
});
client.connect(options.serverID);
}
};
export default actions;

View file

@ -4,14 +4,17 @@ import { NetworkState } from "./types";
const getters: GetterTree<NetworkState, AppState> = { const getters: GetterTree<NetworkState, AppState> = {
peerID(state): string | null { peerID(state): string | null {
if (!state.connected) { switch (state.peerType) {
return null; case "server":
} return state.server.id;
if (state.peerType == "server") { case "client":
return state.server.id; return state.peer.id;
} else {
return state.peer.id;
} }
return null;
},
connectionType(state): "client" | "server" | "none" {
return state.peerType;
} }
}; };

View file

@ -2,21 +2,20 @@ import { NetworkState } from "./types";
import { AppState } from "../types"; import { AppState } from "../types";
import { Module } from "vuex"; import { Module } from "vuex";
import actions from "./actions";
import getters from "./getters"; import getters from "./getters";
const namespaced = true; const namespaced = true;
export const state: NetworkState = { export const state: NetworkState = {
connecting: false, peerType: "none",
connected: false,
name: "",
chatLog: [] chatLog: []
}; };
export const network: Module<NetworkState, AppState> = { export const network: Module<NetworkState, AppState> = {
namespaced, namespaced,
state, state,
//actions, actions,
//mutations, //mutations,
getters getters
}; };

View file

@ -0,0 +1,29 @@
import { MutationTree } from "vuex";
import { NetworkState, ServerNetworkState, ClientNetworkState } from "./types";
import { LocalClient, PeerServer, PeerClient } from "@/network";
const mutations: MutationTree<NetworkState> = {
becomeServer(state, payload: { local: LocalClient; server: PeerServer }) {
state = {
...state,
peerType: "server",
local: payload.local,
server: payload.server
};
},
becomeClient(state, payload: { peer: PeerClient }) {
state = {
...state,
connectionStatus: "connecting",
peerType: "client",
peer: payload.peer
};
},
connected(state) {
(state as ClientNetworkState).connectionStatus = "connected";
}
};
export default mutations;

View file

@ -1,4 +1,11 @@
import { PeerClient, PeerServer, LocalClient } from "@/network"; import {
PeerClient,
PeerServer,
LocalClient,
RoomInfo,
PeerMetadata
} from "@/network";
import Peer from "peerjs";
export interface ChatMessage { export interface ChatMessage {
who: string; who: string;
@ -7,23 +14,21 @@ export interface ChatMessage {
} }
export interface SharedNetworkState { export interface SharedNetworkState {
name: string;
chatLog: ChatMessage[]; chatLog: ChatMessage[];
} }
export interface NoNetworkState extends SharedNetworkState { export interface NoNetworkState extends SharedNetworkState {
connecting: boolean; peerType: "none";
connected: false;
} }
export interface ClientNetworkState extends SharedNetworkState { export interface ClientNetworkState extends SharedNetworkState {
connected: true;
peerType: "client"; peerType: "client";
connectionStatus: "connecting" | "connected" | "error";
connectionError?: Error;
peer: PeerClient; peer: PeerClient;
} }
export interface ServerNetworkState extends SharedNetworkState { export interface ServerNetworkState extends SharedNetworkState {
connected: true;
peerType: "server"; peerType: "server";
server: PeerServer; server: PeerServer;
local: LocalClient; local: LocalClient;
@ -33,3 +38,19 @@ export type NetworkState =
| NoNetworkState | NoNetworkState
| ClientNetworkState | ClientNetworkState
| ServerNetworkState; | ServerNetworkState;
export interface StartServerOptions {
roomInfo: RoomInfo;
playerInfo: PeerMetadata;
// Testing utils
_customPeer?: Peer;
}
export interface ConnectOptions {
serverID: string;
playerInfo: PeerMetadata;
// Testing utils
_customPeer?: Peer;
}