resolve-upload-local
Version:
This package is local uploader adapter.
108 lines (88 loc) • 2.6 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = exports.uploadFormData = exports.upload = void 0;
var _fs = _interopRequireDefault(require("fs"));
var _request = _interopRequireDefault(require("request"));
var _v = _interopRequireDefault(require("uuid/v4"));
var _crypto = _interopRequireDefault(require("crypto"));
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
const createPresignedPut = async (pool, dir) => {
const uploadId = (0, _v.default)();
const uploadUrl = `http://localhost:3000/uploader?dir=${dir}&uploadId=${uploadId}`;
return {
uploadUrl,
uploadId
};
};
const upload = (uploadUrl, filePath) => {
const fileSizeInBytes = _fs.default.statSync(filePath).size;
const fileStream = _fs.default.createReadStream(filePath);
return new Promise((resolve, reject) => _request.default.put({
headers: {
'Content-Length': fileSizeInBytes
},
uri: uploadUrl,
body: fileStream
}, (error, _, body) => {
error ? reject(error) : body ? reject(body) : resolve();
}));
};
exports.upload = upload;
const createPresignedPost = async (pool, dir) => {
const uploadId = (0, _v.default)();
const form = {
url: `http://localhost:3000/uploader?dir=${dir}&uploadId=${uploadId}`,
fields: {}
};
return {
form,
uploadId
};
};
const uploadFormData = (form, filePath) => {
const fileStream = _fs.default.createReadStream(filePath);
return new Promise((resolve, reject) => _request.default.post({
url: form.url,
formData: {
file: fileStream
}
}, error => {
error ? reject(error) : resolve();
}));
};
exports.uploadFormData = uploadFormData;
const createToken = ({
secretKey
}, {
dir,
expireTime = 3600
}) => {
const payload = Buffer.from(JSON.stringify({
dir,
expireTime: Date.now() + expireTime * 1000
})).toString('base64').replace(/=/g, '');
const signature = _crypto.default.createHmac('md5', secretKey).update(payload).digest('hex');
return `${payload}*${signature}`;
};
const createUploadAdapter = pool => {
const {
directory,
bucket,
secretKey
} = pool;
return Object.freeze({
createPresignedPut: createPresignedPut.bind(null, pool),
createPresignedPost: createPresignedPost.bind(null, pool),
createToken: createToken.bind(null, pool),
upload: upload,
uploadFormData: uploadFormData,
directory,
bucket,
secretKey
});
};
var _default = createUploadAdapter;
exports.default = _default;
//# sourceMappingURL=index.js.map