Integrate draft/network stack via Vuex #26
5 changed files with 92 additions and 17 deletions
23
src/store/network/actions.ts
Normal file
23
src/store/network/actions.ts
Normal 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;
|
|
@ -4,14 +4,17 @@ import { NetworkState } from "./types";
|
|||
|
||||
const getters: GetterTree<NetworkState, AppState> = {
|
||||
peerID(state): string | null {
|
||||
if (!state.connected) {
|
||||
return null;
|
||||
}
|
||||
if (state.peerType == "server") {
|
||||
return state.server.id;
|
||||
} else {
|
||||
return state.peer.id;
|
||||
switch (state.peerType) {
|
||||
case "server":
|
||||
return state.server.id;
|
||||
case "client":
|
||||
return state.peer.id;
|
||||
}
|
||||
return null;
|
||||
},
|
||||
|
||||
connectionType(state): "client" | "server" | "none" {
|
||||
return state.peerType;
|
||||
}
|
||||
};
|
||||
|
||||
|
|
|
@ -2,21 +2,20 @@ import { NetworkState } from "./types";
|
|||
import { AppState } from "../types";
|
||||
import { Module } from "vuex";
|
||||
|
||||
import actions from "./actions";
|
||||
import getters from "./getters";
|
||||
|
||||
const namespaced = true;
|
||||
|
||||
export const state: NetworkState = {
|
||||
connecting: false,
|
||||
connected: false,
|
||||
name: "",
|
||||
peerType: "none",
|
||||
chatLog: []
|
||||
};
|
||||
|
||||
export const network: Module<NetworkState, AppState> = {
|
||||
namespaced,
|
||||
state,
|
||||
//actions,
|
||||
actions,
|
||||
//mutations,
|
||||
getters
|
||||
};
|
||||
|
|
29
src/store/network/mutations.ts
Normal file
29
src/store/network/mutations.ts
Normal 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;
|
|
@ -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 {
|
||||
who: string;
|
||||
|
@ -7,23 +14,21 @@ export interface ChatMessage {
|
|||
}
|
||||
|
||||
export interface SharedNetworkState {
|
||||
name: string;
|
||||
chatLog: ChatMessage[];
|
||||
}
|
||||
|
||||
export interface NoNetworkState extends SharedNetworkState {
|
||||
connecting: boolean;
|
||||
connected: false;
|
||||
peerType: "none";
|
||||
}
|
||||
|
||||
export interface ClientNetworkState extends SharedNetworkState {
|
||||
connected: true;
|
||||
peerType: "client";
|
||||
connectionStatus: "connecting" | "connected" | "error";
|
||||
connectionError?: Error;
|
||||
peer: PeerClient;
|
||||
}
|
||||
|
||||
export interface ServerNetworkState extends SharedNetworkState {
|
||||
connected: true;
|
||||
peerType: "server";
|
||||
server: PeerServer;
|
||||
local: LocalClient;
|
||||
|
@ -33,3 +38,19 @@ export type NetworkState =
|
|||
| NoNetworkState
|
||||
| ClientNetworkState
|
||||
| ServerNetworkState;
|
||||
|
||||
export interface StartServerOptions {
|
||||
roomInfo: RoomInfo;
|
||||
playerInfo: PeerMetadata;
|
||||
|
||||
// Testing utils
|
||||
_customPeer?: Peer;
|
||||
}
|
||||
|
||||
export interface ConnectOptions {
|
||||
serverID: string;
|
||||
playerInfo: PeerMetadata;
|
||||
|
||||
// Testing utils
|
||||
_customPeer?: Peer;
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue