mirror of https://github.com/kern/filepizza
checkpoint
parent
3c17d2604f
commit
def5707932
@ -1,82 +1,70 @@
|
|||||||
import * as t from 'io-ts'
|
import { z } from 'zod'
|
||||||
import { pipe } from 'fp-ts/function'
|
|
||||||
import { fold } from 'fp-ts/Either'
|
|
||||||
|
|
||||||
export enum MessageType {
|
export enum MessageType {
|
||||||
RequestInfo = 'REQUEST_INFO',
|
RequestInfo = 'RequestInfo',
|
||||||
Info = 'INFO',
|
Info = 'Info',
|
||||||
Pause = 'PAUSE',
|
Start = 'Start',
|
||||||
Start = 'START',
|
Chunk = 'Chunk',
|
||||||
Chunk = 'CHUNK',
|
Done = 'Done',
|
||||||
Done = 'DONE',
|
Error = 'Error',
|
||||||
Error = 'ERROR',
|
|
||||||
}
|
}
|
||||||
|
|
||||||
export const RequestInfoMessage = t.type({
|
export const RequestInfoMessage = z.object({
|
||||||
type: t.literal(MessageType.RequestInfo),
|
type: z.literal(MessageType.RequestInfo),
|
||||||
browserName: t.string,
|
browserName: z.string(),
|
||||||
browserVersion: t.string,
|
browserVersion: z.string(),
|
||||||
osName: t.string,
|
osName: z.string(),
|
||||||
osVersion: t.string,
|
osVersion: z.string(),
|
||||||
mobileVendor: t.string,
|
mobileVendor: z.string(),
|
||||||
mobileModel: t.string,
|
mobileModel: z.string(),
|
||||||
password: t.string,
|
password: z.string(),
|
||||||
})
|
})
|
||||||
|
|
||||||
export const InfoMessage = t.type({
|
export const InfoMessage = z.object({
|
||||||
type: t.literal(MessageType.Info),
|
type: z.literal(MessageType.Info),
|
||||||
files: t.array(
|
files: z.array(
|
||||||
t.type({
|
z.object({
|
||||||
fileName: t.string,
|
fileName: z.string(),
|
||||||
size: t.number,
|
size: z.number(),
|
||||||
type: t.string,
|
type: z.string(),
|
||||||
}),
|
}),
|
||||||
),
|
),
|
||||||
})
|
})
|
||||||
|
|
||||||
export const StartMessage = t.type({
|
export const StartMessage = z.object({
|
||||||
type: t.literal(MessageType.Start),
|
type: z.literal(MessageType.Start),
|
||||||
fileName: t.string,
|
fileName: z.string(),
|
||||||
offset: t.number,
|
offset: z.number(),
|
||||||
})
|
})
|
||||||
|
|
||||||
export const ChunkMessage = t.type({
|
export const ChunkMessage = z.object({
|
||||||
type: t.literal(MessageType.Chunk),
|
type: z.literal(MessageType.Chunk),
|
||||||
fileName: t.string,
|
fileName: z.string(),
|
||||||
offset: t.number,
|
offset: z.number(),
|
||||||
bytes: t.unknown,
|
bytes: z.unknown(),
|
||||||
final: t.boolean,
|
final: z.boolean(),
|
||||||
})
|
})
|
||||||
|
|
||||||
export const PauseMessage = t.type({
|
export const DoneMessage = z.object({
|
||||||
type: t.literal(MessageType.Pause),
|
type: z.literal(MessageType.Done),
|
||||||
})
|
})
|
||||||
|
|
||||||
export const DoneMessage = t.type({
|
export const ErrorMessage = z.object({
|
||||||
type: t.literal(MessageType.Done),
|
type: z.literal(MessageType.Error),
|
||||||
|
error: z.string(),
|
||||||
})
|
})
|
||||||
|
|
||||||
export const ErrorMessage = t.type({
|
export const Message = z.discriminatedUnion('type', [
|
||||||
type: t.literal(MessageType.Error),
|
|
||||||
error: t.string,
|
|
||||||
})
|
|
||||||
|
|
||||||
export const Message = t.union([
|
|
||||||
RequestInfoMessage,
|
RequestInfoMessage,
|
||||||
InfoMessage,
|
InfoMessage,
|
||||||
PauseMessage,
|
|
||||||
StartMessage,
|
StartMessage,
|
||||||
ChunkMessage,
|
ChunkMessage,
|
||||||
DoneMessage,
|
DoneMessage,
|
||||||
ErrorMessage,
|
ErrorMessage,
|
||||||
])
|
])
|
||||||
|
|
||||||
export function decodeMessage(data: any): t.TypeOf<typeof Message> {
|
export type Message = z.infer<typeof Message>
|
||||||
const onFailure = (errors: t.Errors): t.TypeOf<typeof Message> => {
|
|
||||||
throw new Error(`${errors.length} error(s) found`)
|
|
||||||
}
|
|
||||||
|
|
||||||
const onSuccess = (mesg: t.TypeOf<typeof Message>) => mesg
|
|
||||||
|
|
||||||
return pipe(Message.decode(data), fold(onFailure, onSuccess))
|
export function decodeMessage(data: unknown): Message {
|
||||||
|
return Message.parse(data)
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
Reference in New Issue