import { z } from 'zod' export const DeviceInfoZod = z.object({ allspace: z.bigint(), freespace: z.bigint(), name: z.string().max(128, 'Device Name too long'), size: z.string().describe('设备分辨率, 以x作为分隔符, 宽x高, 例如 360x360'), brand: z.string().max(128, 'Brand name too long'), powerlevel: z .number() .min(0, 'Power level could not be less then 0') .max(100, 'Power level could not be more then 100'), }) export type DeviceInfo = z.infer export const ProtocolFrameZod = z.object({ head: z.number().describe('固定表示传输方向 APP -> BLE = 0xb1, BLE -> APP = 0xb0'), type: z.number().describe('表示传输数据对应哪个Event, 与EVENT_TYPES.xxx.code对应'), subpageTotal: z.number().describe('代表总的分包大小'), curPage: z.number().describe('代表当前分包序号'), dataLen: z.number().describe('代表当前数据包字节长度 bytes'), data: z.instanceof(ArrayBuffer).describe('数据包内实际二进制字节内容'), checksum: z.number().describe('数据包校验字节, 整个数据包中除该字节以外的所有字节数据的单字节和 = (0 - 该字节)'), }) export type ProtocolFrame = z.infer export const BondingResponseZod = z.object({ type: z.number().describe('绑定命令类型 0x0f'), sn: z .string() .length(14) .describe( '设备sn码, 第1位A量产,D售后,E试产,F测试环境,后六位000000-999999,234568位不变,第7位可能根据配置不同变化', ), success: z .number() .describe('绑定成功/失败 0 = 失败,1 = 成功,如传入的userId与已绑定的userId一致,直接返回成功代表已绑定'), contents: z .array(z.string()) .describe('绑定成功时才返回设备内已存在的原始内容,绑定失败时返回空数组;数组按照id排序'), }) export type BindingResponse = z.infer export const UnBindResponseZod = z.object({ success: z.number().describe('解绑成功 = 1, 失败 = 0'), }) export type UnBindResponse = z.infer export const VersionInfoZod = z.object({ version: z.string().max(128, 'Version string too long').describe('设备版本号'), }) export type VersionInfo = z.infer export const FileTransferDataZod = z.object({ data: z.instanceof(ArrayBuffer), }) export type FileTransferData = z.infer export const BindingRequestZod = z.object({ type: z.number().describe('绑定命令类型 0x0f'), userId: z.string().length(32).describe('32位长度的user Id'), }) export type BindingRequest = z.infer // 删除文件协议响应状态 export const DELETE_FILE_STATUS = { SUCCESS: 0, // 删除成功 FAILED: 1, // 删除失败 NOT_EXISTS: 2, // 文件不存在 } as const export type DeleteFileStatus = (typeof DELETE_FILE_STATUS)[keyof typeof DELETE_FILE_STATUS] // 删除文件请求接口 export const DeleteFileRequestZod = z.object({ type: z.number().describe('删除文件命令类型 0x13'), key: z.string().describe('要删除内容对应的key'), }) export type DeleteFileRequest = z.infer // 删除文件响应接口 export const DeleteFileResponseZod = z.object({ type: z.number().describe('删除文件命令类型 0x13'), success: z.number().min(0).max(2).describe('删除结果状态: 0=成功, 1=失败, 2=文件不存在'), }) export type DeleteFileResponse = z.infer // 预先发送协议状态 export const PREPARE_TRANSFER_STATUS = { READY: 'ready', // 准备好接收 NO_SPACE: 'no_space', // 存储空间不足 DUPLICATED: 'duplicated', // 已存在相同key的资源 } as const export type PrepareTransferStatus = (typeof PREPARE_TRANSFER_STATUS)[keyof typeof PREPARE_TRANSFER_STATUS] // 预先发送请求接口 export const PrepareTransferRequestZod = z.object({ type: z.number().describe('预先发送命令类型 0x14'), key: z.string().describe('要传输内容对应的key'), size: z.number().describe('ani文件大小信息,单位为bytes'), }) export type PrepareTransferRequest = z.infer // 预先发送响应接口 export const PrepareTransferResponseZod = z.object({ type: z.number().describe('预先发送命令类型 0x14'), key: z.string().describe('要传输内容对应的key'), status: z.enum(['ready', 'no_space', 'duplicated']).describe('告知APP是否可继续发送'), }) export type PrepareTransferResponse = z.infer