1
0
Fork 0

feat: Upgrade versions, introduce Uppy batch signing

pull/12/head v0.2.0
Ambrose Chua 2022-02-16 16:22:31 +08:00
parent b5dacbc9bf
commit 0d78f1dc33
6 changed files with 816 additions and 1479 deletions

View File

@ -131,6 +131,61 @@ func handleGetUploadedParts(w http.ResponseWriter, req *http.Request) {
encoder.Encode(getUploadedPartsRes(parts))
}
/* batchSignPartsUpload */
type batchSignPartsUploadRes struct {
PresignedURLs map[string]string `json:"presignedUrls"`
}
func handleBatchSignPartsUpload(w http.ResponseWriter, req *http.Request) {
vars := mux.Vars(req)
cred, err := getCredential(vars["id"])
if err != nil {
errorResponse(w, req, err)
return
}
uploadID := vars["uploadID"]
key := req.URL.Query().Get("key")
partNumbers := req.URL.Query().Get("partNumbers")
if uploadID == "" || key == "" || partNumbers == "" {
errorResponse(w, req, fmt.Errorf("%w", errBadRequest))
return
}
partNumbersArray := strings.Split(partNumbers, ",")
partNumbersParsed := make([]uint16, 0, len(partNumbersArray))
for _, partNumber := range partNumbersArray {
n, err := strconv.ParseUint(partNumber, 10, 16)
if n < 1 || n > 10000 || err != nil {
errorResponse(w, req, fmt.Errorf("%w: invalid part number", errBadRequest))
return
}
partNumbersParsed = append(partNumbersParsed, uint16(n))
}
presignedURLs := make(map[string]string, len(partNumbersParsed))
for _, partNumber := range partNumbersParsed {
params := make(url.Values)
params.Add("partNumber", strconv.FormatUint(uint64(partNumber), 10))
params.Add("uploadId", uploadID)
unsignedReq, err := http.NewRequest(http.MethodPut, cred.Endpoint+"/"+key+"?"+params.Encode(), nil)
if err != nil {
errorResponse(w, req, fmt.Errorf("%w: %s", errInternalServerError, err))
return
}
signedReq := preSign(unsignedReq, cred)
presignedURLs[strconv.FormatUint(uint64(partNumber), 10)] = signedReq.URL.String()
}
encoder := json.NewEncoder(w)
encoder.Encode(batchSignPartsUploadRes{
PresignedURLs: presignedURLs,
})
}
/* signPartUpload */
type signPartUploadRes struct {

View File

@ -38,6 +38,7 @@ func main() {
s3Router.Methods(http.MethodPost).Path("").HandlerFunc(handleCreateMultipartUpload)
s3Router.Methods(http.MethodGet).Path("/{uploadID}").HandlerFunc(handleGetUploadedParts)
s3Router.Methods(http.MethodGet).Path("/{uploadID}/batch").HandlerFunc(handleBatchSignPartsUpload)
s3Router.Methods(http.MethodGet).Path("/{uploadID}/{uploadPart}").HandlerFunc(handleSignPartUpload)
s3Router.Methods(http.MethodPost).Path("/{uploadID}/complete").HandlerFunc(handleCompleteMultipartUpload)
s3Router.Methods(http.MethodDelete).Path("/{uploadID}").HandlerFunc(handleAbortMultipartUpload)

2207
web/package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@ -8,18 +8,18 @@
"watch": "rollup --config --watch"
},
"devDependencies": {
"@rollup/plugin-commonjs": "^19.0.0",
"@rollup/plugin-node-resolve": "^13.0.0",
"@tailwindcss/forms": "^0.3.2",
"@uppy/aws-s3-multipart": "^1.8.15",
"@uppy/core": "^1.18.1",
"@uppy/drag-drop": "^1.4.27",
"@uppy/status-bar": "^1.9.3",
"filesize": "^6.3.0",
"rollup": "^2.48.0",
"@rollup/plugin-commonjs": "^21.0.1",
"@rollup/plugin-node-resolve": "^13.1.3",
"@tailwindcss/forms": "^0.4.0",
"@uppy/aws-s3-multipart": "^2.2.0",
"@uppy/core": "^2.1.5",
"@uppy/drag-drop": "^2.0.6",
"@uppy/status-bar": "^2.1.2",
"filesize": "^8.0.7",
"rollup": "^2.67.2",
"rollup-plugin-copy": "^3.4.0",
"rollup-plugin-postcss": "^4.0.0",
"rollup-plugin-postcss": "^4.0.2",
"rollup-plugin-terser": "^7.0.2",
"tailwindcss": "^2.1.2"
"tailwindcss": "^3.0.22"
}
}

View File

@ -41,6 +41,12 @@ uploadAreas.forEach(uploadArea => {
}
/* Uppy */
let limit = window.localStorage.getItem('parallel');
if (!limit) {
limit = 3;
}
window.localStorage.setItem('parallel', 3);
const uppy = new Uppy({
autoProceed: true,
@ -54,7 +60,7 @@ uploadAreas.forEach(uploadArea => {
showProgressDetails: true,
});
uppy.use(AwsS3Multipart, {
limit: 3,
limit,
companionUrl: window.location.pathname,
});

View File

@ -1,5 +1,5 @@
module.exports = {
purge: [
content: [
'./*.tmpl',
'./src/*.js',
],