FPGA_WebLab/server/msgProtocol.ts

80 lines
2.4 KiB
TypeScript

import { type TransferListItem } from "worker_threads";
import { z } from "zod";
import { UNUSED } from "./common";
export namespace MsgProtocol {
const QueryDataSchema = z.object({ type: z.literal("Query"), args: z.any() })
const ResultDataSchema = z.object({ type: z.literal("Result"), result: z.any() })
const ErrorDataSchema = z.object({ type: z.literal("Error"), error: z.string() })
const MessageSchema = z.object({
command: z.string(),
data: z.discriminatedUnion("type", [QueryDataSchema, ResultDataSchema, ErrorDataSchema]),
dest: z.string(),
src: z.string(),
})
const MessageQuerySchema = z.object({
command: z.string(),
data: QueryDataSchema,
dest: z.string(),
src: z.string(),
})
const MessageResultSchema = z.object({
command: z.string(),
data: ResultDataSchema,
dest: z.string(),
src: z.string(),
})
const MessageErrorSchema = z.object({
command: z.string(),
data: ErrorDataSchema,
dest: z.string(),
src: z.string(),
})
const MessageHandlerSchema = z.function()
.args(z.union([MessageResultSchema, MessageErrorSchema]))
.returns(z.void())
export type Message = z.infer<typeof MessageSchema>
export type MessageQuery = z.infer<typeof MessageQuerySchema>
export type MessageResult = z.infer<typeof MessageResultSchema>
export type MessageError = z.infer<typeof MessageErrorSchema>
export type MessageHandler = z.infer<typeof MessageHandlerSchema>
export function isMessage(obj: any): obj is Message {
return MessageSchema.safeParse(obj).success
}
export function isMessageQuery(obj: any): obj is MessageQuery {
return MessageQuerySchema.safeParse(obj).success
}
export function isMessageResult(obj: any): obj is MessageResult {
return MessageResultSchema.safeParse(obj).success
}
export function isMessageError(obj: any): obj is MessageError {
return MessageErrorSchema.safeParse(obj).success
}
export function genMessageResult(result: any, srcMsg: MessageQuery): MessageResult {
return {
command: srcMsg.command,
dest: srcMsg.src,
src: srcMsg.dest,
data: {
type: "Result",
result: result
}
} as MessageResult
}
export function genMessageError(error: string, srcMsg: MessageQuery): MessageError {
return {
command: srcMsg.command,
dest: srcMsg.src,
src: srcMsg.dest,
data: {
type: "Error",
error: error
}
} as MessageError
}
}