Skip to content
File

Blob: src/workerd/api/r2-multipart.h

cpp77 lines
1// Copyright (c) 2017-2022 Cloudflare, Inc.
2// Licensed under the Apache 2.0 license found in the LICENSE file or at:
3// https://opensource.org/licenses/Apache-2.0
4 
5#pragma once
6 
7#include "r2-bucket.h"
8 
9#include <workerd/jsg/jsg.h>
10 
11namespace workerd::api::public_beta {
12 
13class R2MultipartUpload: public jsg::Object {
14 public:
15 struct UploadedPart {
16 int partNumber;
17 kj::String etag;
18 
19 JSG_STRUCT(partNumber, etag);
20 JSG_STRUCT_TS_OVERRIDE(R2UploadedPart);
21 };
22 struct UploadPartOptions {
23 jsg::Optional<kj::OneOf<kj::Array<byte>, kj::String>> ssecKey;
24 
25 JSG_STRUCT(ssecKey);
26 JSG_STRUCT_TS_OVERRIDE(R2UploadPartOptions);
27 };
28 
29 R2MultipartUpload(kj::String key, kj::String uploadId, jsg::Ref<R2Bucket> bucket)
30 : key(kj::mv(key)),
31 uploadId(kj::mv(uploadId)),
32 bucket(kj::mv(bucket)) {}
33 
34 kj::StringPtr getKey() const {
35 return key;
36 }
37 kj::StringPtr getUploadId() const {
38 return uploadId;
39 }
40 
41 jsg::Promise<UploadedPart> uploadPart(jsg::Lock& js,
42 int partNumber,
43 R2PutValue value,
44 jsg::Optional<UploadPartOptions> options,
45 const jsg::TypeHandler<jsg::Ref<R2Error>>& errorType);
46 jsg::Promise<void> abort(jsg::Lock& js, const jsg::TypeHandler<jsg::Ref<R2Error>>& errorType);
47 jsg::Promise<jsg::Ref<R2Bucket::HeadResult>> complete(jsg::Lock& js,
48 kj::Array<UploadedPart> uploadedParts,
49 const jsg::TypeHandler<jsg::Ref<R2Error>>& errorType);
50 
51 JSG_RESOURCE_TYPE(R2MultipartUpload) {
52 JSG_LAZY_READONLY_INSTANCE_PROPERTY(key, getKey);
53 JSG_LAZY_READONLY_INSTANCE_PROPERTY(uploadId, getUploadId);
54 JSG_METHOD(uploadPart);
55 JSG_METHOD(abort);
56 JSG_METHOD(complete);
57 }
58 
59 void visitForMemoryInfo(jsg::MemoryTracker& tracker) const {
60 tracker.trackField("key", key);
61 tracker.trackField("uploadId", uploadId);
62 tracker.trackField("bucket", bucket);
63 }
64 
65 protected:
66 kj::String key;
67 kj::String uploadId;
68 jsg::Ref<R2Bucket> bucket;
69 
70 private:
71 void visitForGc(jsg::GcVisitor& visitor) {
72 visitor.visit(bucket);
73 }
74};
75 
76} // namespace workerd::api::public_beta