54 lines
1.5 KiB
TypeScript
54 lines
1.5 KiB
TypeScript
export type FileUploadPayload = {
|
|
path: string;
|
|
data: Uint8Array;
|
|
offset: number;
|
|
total: number;
|
|
transferId: string;
|
|
};
|
|
|
|
export function coerceUploadData(data: unknown): Uint8Array | null {
|
|
if (data instanceof Uint8Array) {
|
|
return data;
|
|
}
|
|
if (data instanceof ArrayBuffer) {
|
|
return new Uint8Array(data);
|
|
}
|
|
if (typeof data === "string") {
|
|
try {
|
|
const binaryString = atob(data || "");
|
|
const out = new Uint8Array(binaryString.length);
|
|
for (let i = 0; i < binaryString.length; i += 1) {
|
|
out[i] = binaryString.charCodeAt(i);
|
|
}
|
|
return out;
|
|
} catch {
|
|
return null;
|
|
}
|
|
}
|
|
return null;
|
|
}
|
|
|
|
export function normalizeFileUploadPayload(payload: any): FileUploadPayload | null {
|
|
if (!payload || typeof payload !== "object") {
|
|
return null;
|
|
}
|
|
const toNumber = (value: unknown): number | null => {
|
|
if (typeof value === "number" && Number.isFinite(value)) return value;
|
|
if (typeof value === "bigint") {
|
|
const asNumber = Number(value);
|
|
if (Number.isSafeInteger(asNumber)) return asNumber;
|
|
}
|
|
return null;
|
|
};
|
|
const data = coerceUploadData(payload.data);
|
|
if (!data) {
|
|
return null;
|
|
}
|
|
const path = typeof payload.path === "string" ? payload.path : "";
|
|
const offset = toNumber(payload.offset) || 0;
|
|
const total = toNumber(payload.total) || 0;
|
|
const transferId = typeof payload.transferId === "string" ? payload.transferId : "";
|
|
|
|
return { path, data, offset, total, transferId };
|
|
}
|