Skip to content

Commit

Permalink
add toJSON implementation for R2Checksums
Browse files Browse the repository at this point in the history
  • Loading branch information
Frederik-Baetens committed Oct 19, 2022
1 parent 66f4348 commit 451ce5e
Show file tree
Hide file tree
Showing 2 changed files with 65 additions and 22 deletions.
29 changes: 16 additions & 13 deletions src/workerd/api/r2-bucket.c++
Original file line number Diff line number Diff line change
Expand Up @@ -134,24 +134,24 @@ static jsg::Ref<T> parseObjectMetadata(R2HeadResponse::Reader responseReader,
};
}

R2Bucket::Checksums checksums;
jsg::Ref<R2Bucket::Checksums> checksums = jsg::alloc<R2Bucket::Checksums>(nullptr, nullptr, nullptr, nullptr, nullptr);

if (responseReader.hasChecksums()) {
R2Checksums::Reader checksumsBuilder = responseReader.getChecksums();
if (checksumsBuilder.hasMd5()) {
checksums.md5 = kj::heapArray(checksumsBuilder.getMd5());
checksums->md5 = kj::heapArray(checksumsBuilder.getMd5());
}
if (checksumsBuilder.hasSha1()) {
checksums.sha1 = kj::heapArray(checksumsBuilder.getSha1());
checksums->sha1 = kj::heapArray(checksumsBuilder.getSha1());
}
if (checksumsBuilder.hasSha256()) {
checksums.sha256 = kj::heapArray(checksumsBuilder.getSha256());
checksums->sha256 = kj::heapArray(checksumsBuilder.getSha256());
}
if (checksumsBuilder.hasSha384()) {
checksums.sha384 = kj::heapArray(checksumsBuilder.getSha384());
checksums->sha384 = kj::heapArray(checksumsBuilder.getSha384());
}
if (checksumsBuilder.hasSha512()) {
checksums.sha512 = kj::heapArray(checksumsBuilder.getSha512());
checksums->sha512 = kj::heapArray(checksumsBuilder.getSha512());
}
}

Expand Down Expand Up @@ -882,15 +882,18 @@ jsg::Promise<jsg::Ref<Blob>> R2Bucket::GetResult::blob(jsg::Lock& js) {
});
}

R2Bucket::Checksums R2Bucket::Checksums::clone() const{
auto cloneArray = [](const kj::Array<kj::byte>& arr) { return kj::heapArray(arr.asPtr()); };
R2Bucket::StringChecksums R2Bucket::Checksums::toJSON() {
return {
.md5 = this->md5.map(cloneArray),
.sha1 = this->sha1.map(cloneArray),
.sha256 = this->sha256.map(cloneArray),
.sha384 = this->sha384.map(cloneArray),
.sha512 = this->sha512.map(cloneArray),
.md5 = this->md5.map(kj::encodeHex),
.sha1 = this->sha1.map(kj::encodeHex),
.sha256 = this->sha256.map(kj::encodeHex),
.sha384 = this->sha384.map(kj::encodeHex),
.sha512 = this->sha512.map(kj::encodeHex),
};
}

kj::Array<kj::byte> cloneByteArray(const kj::Array<kj::byte> &arr) {
return kj::heapArray(arr.asPtr());
}

} // namespace workerd::api::public_beta
58 changes: 49 additions & 9 deletions src/workerd/api/r2-bucket.h
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,8 @@

namespace workerd::api::public_beta {

kj::Array<kj::byte> cloneByteArray(const kj::Array<kj::byte>& arr);

class R2Bucket: public jsg::Object {
// A capability to an R2 Bucket.

Expand Down Expand Up @@ -57,16 +59,53 @@ class R2Bucket: public jsg::Object {
JSG_STRUCT(onlyIf, range);
};

struct Checksums {
struct StringChecksums {
jsg::Optional<kj::String> md5;
jsg::Optional<kj::String> sha1;
jsg::Optional<kj::String> sha256;
jsg::Optional<kj::String> sha384;
jsg::Optional<kj::String> sha512;

JSG_STRUCT(md5, sha1, sha256, sha384, sha512);
};

class Checksums: public jsg::Object {
public:
Checksums(
jsg::Optional<kj::Array<kj::byte>> md5,
jsg::Optional<kj::Array<kj::byte>> sha1,
jsg::Optional<kj::Array<kj::byte>> sha256,
jsg::Optional<kj::Array<kj::byte>> sha384,
jsg::Optional<kj::Array<kj::byte>> sha512
):
md5(kj::mv(md5)),
sha1(kj::mv(sha1)),
sha256(kj::mv(sha256)),
sha384(kj::mv(sha384)),
sha512(kj::mv(sha512)) {}

jsg::Optional<kj::Array<kj::byte>> getMd5() const { return md5.map(cloneByteArray); }
jsg::Optional<kj::Array<kj::byte>> getSha1() const { return sha1.map(cloneByteArray); }
jsg::Optional<kj::Array<kj::byte>> getSha256() const { return sha256.map(cloneByteArray); }
jsg::Optional<kj::Array<kj::byte>> getSha384() const { return sha384.map(cloneByteArray); }
jsg::Optional<kj::Array<kj::byte>> getSha512() const { return sha512.map(cloneByteArray); }

StringChecksums toJSON();

JSG_RESOURCE_TYPE(Checksums) {
JSG_LAZY_READONLY_INSTANCE_PROPERTY(md5, getMd5);
JSG_LAZY_READONLY_INSTANCE_PROPERTY(sha1, getSha1);
JSG_LAZY_READONLY_INSTANCE_PROPERTY(sha256, getSha256);
JSG_LAZY_READONLY_INSTANCE_PROPERTY(sha384, getSha384);
JSG_LAZY_READONLY_INSTANCE_PROPERTY(sha512, getSha512);
JSG_METHOD(toJSON);
}

jsg::Optional<kj::Array<kj::byte>> md5;
jsg::Optional<kj::Array<kj::byte>> sha1;
jsg::Optional<kj::Array<kj::byte>> sha256;
jsg::Optional<kj::Array<kj::byte>> sha384;
jsg::Optional<kj::Array<kj::byte>> sha512;

JSG_STRUCT(md5, sha1, sha256, sha384, sha512);

Checksums clone() const;
};

struct HttpMetadata {
Expand Down Expand Up @@ -101,7 +140,7 @@ class R2Bucket: public jsg::Object {
class HeadResult: public jsg::Object {
public:
HeadResult(kj::String name, kj::String version, double size,
kj::String etag, Checksums checksums, kj::Date uploaded, jsg::Optional<HttpMetadata> httpMetadata,
kj::String etag, jsg::Ref<Checksums> checksums, kj::Date uploaded, jsg::Optional<HttpMetadata> httpMetadata,
jsg::Optional<jsg::Dict<kj::String>> customMetadata, jsg::Optional<Range> range):
name(kj::mv(name)), version(kj::mv(version)), size(size), etag(kj::mv(etag)),
checksums(kj::mv(checksums)), uploaded(uploaded), httpMetadata(kj::mv(httpMetadata)),
Expand All @@ -112,7 +151,7 @@ class R2Bucket: public jsg::Object {
double getSize() const { return size; }
kj::String getEtag() const { return kj::str(etag); }
kj::String getHttpEtag() const { return kj::str('"', etag, '"'); }
Checksums getChecksums() const { return checksums.clone(); }
jsg::Ref<Checksums> getChecksums() { return checksums.addRef();}
kj::Date getUploaded() const { return uploaded; }

jsg::Optional<HttpMetadata> getHttpMetadata() const {
Expand Down Expand Up @@ -155,7 +194,7 @@ class R2Bucket: public jsg::Object {
kj::String version;
double size;
kj::String etag;
Checksums checksums;
jsg::Ref<Checksums> checksums;
kj::Date uploaded;
jsg::Optional<HttpMetadata> httpMetadata;
jsg::Optional<jsg::Dict<kj::String>> customMetadata;
Expand All @@ -167,7 +206,7 @@ class R2Bucket: public jsg::Object {
class GetResult: public HeadResult {
public:
GetResult(kj::String name, kj::String version, double size,
kj::String etag, Checksums checksums, kj::Date uploaded, jsg::Optional<HttpMetadata> httpMetadata,
kj::String etag, jsg::Ref<Checksums> checksums, kj::Date uploaded, jsg::Optional<HttpMetadata> httpMetadata,
jsg::Optional<jsg::Dict<kj::String>> customMetadata, jsg::Optional<Range> range,
jsg::Ref<ReadableStream> body)
: HeadResult(
Expand Down Expand Up @@ -277,6 +316,7 @@ class R2Bucket: public jsg::Object {
api::public_beta::R2Bucket::GetOptions, \
api::public_beta::R2Bucket::PutOptions, \
api::public_beta::R2Bucket::Checksums, \
api::public_beta::R2Bucket::StringChecksums, \
api::public_beta::R2Bucket::HttpMetadata, \
api::public_beta::R2Bucket::ListOptions, \
api::public_beta::R2Bucket::ListResult
Expand Down

0 comments on commit 451ce5e

Please sign in to comment.