// Copyright (c) 2017-2022 Cloudflare, Inc. // Licensed under the Apache 2.0 license found in the LICENSE file or at: // https://opensource.org/licenses/Apache-2.0 #pragma once #include "r2-bucket.h" #include namespace workerd::api::public_beta { class R2MultipartUpload: public jsg::Object { public: struct UploadedPart { int partNumber; kj::String etag; JSG_STRUCT(partNumber, etag); JSG_STRUCT_TS_OVERRIDE(R2UploadedPart); }; struct UploadPartOptions { jsg::Optional, kj::String>> ssecKey; JSG_STRUCT(ssecKey); JSG_STRUCT_TS_OVERRIDE(R2UploadPartOptions); }; R2MultipartUpload(kj::String key, kj::String uploadId, jsg::Ref bucket) : key(kj::mv(key)), uploadId(kj::mv(uploadId)), bucket(kj::mv(bucket)) {} kj::StringPtr getKey() const { return key; } kj::StringPtr getUploadId() const { return uploadId; } jsg::Promise uploadPart(jsg::Lock& js, int partNumber, R2PutValue value, jsg::Optional options, const jsg::TypeHandler>& errorType); jsg::Promise abort(jsg::Lock& js, const jsg::TypeHandler>& errorType); jsg::Promise> complete(jsg::Lock& js, kj::Array uploadedParts, const jsg::TypeHandler>& errorType); JSG_RESOURCE_TYPE(R2MultipartUpload) { JSG_LAZY_READONLY_INSTANCE_PROPERTY(key, getKey); JSG_LAZY_READONLY_INSTANCE_PROPERTY(uploadId, getUploadId); JSG_METHOD(uploadPart); JSG_METHOD(abort); JSG_METHOD(complete); } void visitForMemoryInfo(jsg::MemoryTracker& tracker) const { tracker.trackField("key", key); tracker.trackField("uploadId", uploadId); tracker.trackField("bucket", bucket); } protected: kj::String key; kj::String uploadId; jsg::Ref bucket; private: void visitForGc(jsg::GcVisitor& visitor) { visitor.visit(bucket); } }; } // namespace workerd::api::public_beta