Mark incoming state as readonly

This commit is contained in:
zikaeroh 2020-05-26 20:34:30 -07:00
parent e5845b9a57
commit 8accc42167
3 changed files with 28 additions and 17 deletions

View File

@ -25,6 +25,7 @@
"react-hook-form": "^5.6.3", "react-hook-form": "^5.6.3",
"react-scripts": "^3.4.1", "react-scripts": "^3.4.1",
"react-use-websocket": "^2.0.1", "react-use-websocket": "^2.0.1",
"ts-essentials": "^6.0.5",
"typeface-roboto": "^0.0.75", "typeface-roboto": "^0.0.75",
"typescript": "^3.9.2", "typescript": "^3.9.2",
"uuid": "^8.0.0" "uuid": "^8.0.0"

View File

@ -1,17 +1,9 @@
import myzod, { Infer } from 'myzod'; import myzod, { Infer } from 'myzod';
import { DeepReadonly } from 'ts-essentials';
// See protocol.go. // See protocol.go.
export type RoomResponse = Infer<typeof RoomResponse>; // Messages sent from client to server.
export const RoomResponse = myzod.object({
id: myzod.string().optional().nullable(),
error: myzod.string().optional().nullable(),
});
export type TimeResponse = Infer<typeof TimeResponse>;
export const TimeResponse = myzod.object({
time: myzod.date(),
});
export type WordPack = Infer<typeof WordPack>; export type WordPack = Infer<typeof WordPack>;
const WordPack = myzod.object({ const WordPack = myzod.object({
@ -83,7 +75,20 @@ export const ClientNote = myzod
]) ])
); );
export type StateTile = Infer<typeof StateTile>; // Messages sent from server to client.
export type RoomResponse = DeepReadonly<Infer<typeof RoomResponse>>;
export const RoomResponse = myzod.object({
id: myzod.string().optional().nullable(),
error: myzod.string().optional().nullable(),
});
export type TimeResponse = DeepReadonly<Infer<typeof TimeResponse>>;
export const TimeResponse = myzod.object({
time: myzod.date(),
});
export type StateTile = DeepReadonly<Infer<typeof StateTile>>;
const StateTile = myzod.object({ const StateTile = myzod.object({
word: myzod.string(), word: myzod.string(),
revealed: myzod.boolean(), revealed: myzod.boolean(),
@ -97,26 +102,26 @@ const StateTile = myzod.object({
.nullable(), .nullable(),
}); });
export type StateBoard = Infer<typeof StateBoard>; export type StateBoard = DeepReadonly<Infer<typeof StateBoard>>;
const StateBoard = myzod.array(myzod.array(StateTile)); const StateBoard = myzod.array(myzod.array(StateTile));
export type StatePlayer = Infer<typeof StatePlayer>; export type StatePlayer = DeepReadonly<Infer<typeof StatePlayer>>;
const StatePlayer = myzod.object({ const StatePlayer = myzod.object({
playerID: myzod.string(), playerID: myzod.string(),
nickname: myzod.string(), nickname: myzod.string(),
spymaster: myzod.boolean(), spymaster: myzod.boolean(),
}); });
export type StateTeams = Infer<typeof StateTeams>; export type StateTeams = DeepReadonly<Infer<typeof StateTeams>>;
const StateTeams = myzod.array(myzod.array(StatePlayer)); const StateTeams = myzod.array(myzod.array(StatePlayer));
export type StateTimer = Infer<typeof StateTimer>; export type StateTimer = DeepReadonly<Infer<typeof StateTimer>>;
const StateTimer = myzod.object({ const StateTimer = myzod.object({
turnTime: myzod.number(), turnTime: myzod.number(),
turnEnd: myzod.date(), turnEnd: myzod.date(),
}); });
export type State = Infer<typeof State>; export type State = DeepReadonly<Infer<typeof State>>;
export const State = myzod.object({ export const State = myzod.object({
version: myzod.number(), version: myzod.number(),
teams: StateTeams, teams: StateTeams,
@ -136,7 +141,7 @@ export const State = myzod.object({
hideBomb: myzod.boolean(), hideBomb: myzod.boolean(),
}); });
export type ServerNote = Infer<typeof ServerNote>; export type ServerNote = DeepReadonly<Infer<typeof ServerNote>>;
export const ServerNote = myzod.union([ export const ServerNote = myzod.union([
myzod.object({ myzod.object({
method: myzod.literal('state'), method: myzod.literal('state'),

View File

@ -10531,6 +10531,11 @@ tr46@^1.0.1:
dependencies: dependencies:
punycode "^2.1.0" punycode "^2.1.0"
ts-essentials@^6.0.5:
version "6.0.5"
resolved "https://registry.yarnpkg.com/ts-essentials/-/ts-essentials-6.0.5.tgz#dd5b98f73bd56dc94d15dfbc0fbf01da3163eb42"
integrity sha512-RSAKlpu+E0DCGY8FsbG92EveRLw2Y+UgK3ksX01w1VaHeG01dKkYo/KtAV4q0qPT6nPbLfyerb2YPVSediP+8g==
ts-pnp@1.1.6: ts-pnp@1.1.6:
version "1.1.6" version "1.1.6"
resolved "https://registry.yarnpkg.com/ts-pnp/-/ts-pnp-1.1.6.tgz#389a24396d425a0d3162e96d2b4638900fdc289a" resolved "https://registry.yarnpkg.com/ts-pnp/-/ts-pnp-1.1.6.tgz#389a24396d425a0d3162e96d2b4638900fdc289a"