@uploadx/core
Version:
Node.js resumable upload middleware
93 lines (92 loc) • 3.4 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.FileName = exports.Metadata = exports.File = void 0;
exports.isExpired = isExpired;
exports.extractOriginalName = extractOriginalName;
exports.extractMimeType = extractMimeType;
exports.hasContent = hasContent;
exports.partMatch = partMatch;
exports.updateSize = updateSize;
exports.isMetadata = isMetadata;
exports.updateMetadata = updateMetadata;
exports.getFileStatus = getFileStatus;
const utils_1 = require("../utils");
const path_1 = require("path");
function isExpired(file) {
if (!file.expiredAt)
return false;
return Date.now() > +new Date(file.expiredAt);
}
function extractOriginalName(meta) {
return meta.name || meta.title || meta.originalName || meta.filename;
}
function extractMimeType(meta) {
return meta.mimeType || meta.contentType || meta.type || meta.filetype;
}
const generateFileId = (file) => {
const { originalName, size, userId, metadata } = file;
const mtime = String(metadata.lastModified || Date.now());
return [userId, originalName, size, mtime].filter(Boolean).map(String).map(utils_1.hash).join('-');
};
class File {
constructor({ metadata = {}, originalName, contentType, size, userId }) {
this.bytesWritten = NaN;
this.name = '';
this.metadata = metadata;
this.originalName = originalName || extractOriginalName(metadata) || (this.id = (0, utils_1.uid)());
this.contentType = contentType || extractMimeType(metadata) || 'application/octet-stream';
this.size = Number(size || metadata.size);
this.userId = userId;
this.id || (this.id = generateFileId(this));
}
}
exports.File = File;
function hasContent(part) {
return typeof part.start === 'number' && part.start >= 0 && !!part.body;
}
function partMatch(part, file) {
if (part.size && part.size > file.size)
return false;
return (part.start || 0) + (part.contentLength || 0) <= file.size;
}
function updateSize(file, size) {
if (size < file.size)
file.size = size;
return file;
}
/** User-provided metadata */
class Metadata {
}
exports.Metadata = Metadata;
function isMetadata(raw) {
return (0, utils_1.isRecord)(raw);
}
function updateMetadata(file, metadata) {
(0, utils_1.extendObject)(file, metadata);
file.originalName = extractOriginalName(file.metadata) || file.originalName;
}
function getFileStatus(file) {
return file.bytesWritten === file.size ? 'completed' : !file.createdAt ? 'created' : 'part';
}
class FileName {
static isValid(name) {
if (!name ||
name.length < FileName.MIN_LENGTH ||
name.length > FileName.MAX_LENGTH ||
(0, path_1.isAbsolute)(name)) {
return false;
}
else {
const upperCase = name.toUpperCase();
return !(FileName.INVALID_CHARS.filter(Boolean).some(chars => upperCase.includes(chars)) ||
FileName.INVALID_PREFIXES.filter(Boolean).some(chars => upperCase.startsWith(chars)) ||
FileName.INVALID_SUFFIXES.filter(Boolean).some(chars => upperCase.endsWith(chars)));
}
}
}
exports.FileName = FileName;
FileName.INVALID_CHARS = ['"', '*', ':', '<', '>', '?', '\\', '|', '../'];
FileName.INVALID_PREFIXES = [];
FileName.INVALID_SUFFIXES = [];
FileName.MAX_LENGTH = 255;
FileName.MIN_LENGTH = 3;