mlpcardgame/src/store/network/actions.ts

52 lines
1.5 KiB
TypeScript

import { ActionTree } from "vuex";
import { AppState } from "../types";
import { NetworkState, StartServerOptions, ConnectOptions } from "./types";
import {
PeerServer,
LocalClient,
PeerClient,
NetworkMessage,
Client,
ChatMessage
} 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, id: options.serverID });
client.on("connected", () => {
commit("connectionStatusChanged", "connected");
});
client.on("disconnected", () => {
commit("connectionStatusChanged", "disconnected");
});
client.on("error", err => {
commit("connectionError", err);
});
client.connect(options.serverID);
},
sendChatMessage({ commit, dispatch, getters }, message: ChatMessage) {
if (getters.connectionType == "none") {
throw new Error("not connected");
}
dispatch("sendMessage", message);
commit("receivedChatMessage", message);
},
sendMessage({ getters }, message: NetworkMessage) {
if (getters.connectionType == "none") {
throw new Error("not connected");
}
(getters.client as Client).send(message);
}
};
export default actions;