You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
filepizza/src/messages.ts

71 lines
1.4 KiB
TypeScript

import { z } from 'zod'
export enum MessageType {
RequestInfo = 'RequestInfo',
Info = 'Info',
Start = 'Start',
Chunk = 'Chunk',
Done = 'Done',
Error = 'Error',
}
export const RequestInfoMessage = z.object({
type: z.literal(MessageType.RequestInfo),
browserName: z.string(),
browserVersion: z.string(),
osName: z.string(),
osVersion: z.string(),
mobileVendor: z.string(),
mobileModel: z.string(),
password: z.string(),
})
export const InfoMessage = z.object({
type: z.literal(MessageType.Info),
files: z.array(
z.object({
fileName: z.string(),
size: z.number(),
type: z.string(),
}),
),
})
export const StartMessage = z.object({
type: z.literal(MessageType.Start),
fileName: z.string(),
offset: z.number(),
})
export const ChunkMessage = z.object({
type: z.literal(MessageType.Chunk),
fileName: z.string(),
offset: z.number(),
bytes: z.unknown(),
final: z.boolean(),
})
export const DoneMessage = z.object({
type: z.literal(MessageType.Done),
})
export const ErrorMessage = z.object({
type: z.literal(MessageType.Error),
error: z.string(),
})
export const Message = z.discriminatedUnion('type', [
RequestInfoMessage,
InfoMessage,
StartMessage,
ChunkMessage,
DoneMessage,
ErrorMessage,
])
export type Message = z.infer<typeof Message>
export function decodeMessage(data: unknown): Message {
return Message.parse(data)
}