From 5bf776f52a7cf21c198a751deba9f6ef92ce726a Mon Sep 17 00:00:00 2001 From: dancoffman Date: Wed, 16 Nov 2022 15:26:05 -0800 Subject: [PATCH] Make C++ exceptions catchable in JS-land --- bindings/node.js/binding.dist.gyp | 31 +++++++++++++++++----- bindings/node.js/binding.gyp | 33 ++++++++++++++++++----- bindings/node.js/kzg.cxx | 44 ++++++++++++++----------------- bindings/node.js/package.json | 2 +- bindings/node.js/test.ts | 9 +++++++ 5 files changed, 81 insertions(+), 38 deletions(-) diff --git a/bindings/node.js/binding.dist.gyp b/bindings/node.js/binding.dist.gyp index 89851df..861b19f 100644 --- a/bindings/node.js/binding.dist.gyp +++ b/bindings/node.js/binding.dist.gyp @@ -4,11 +4,31 @@ "target_name": "kzg", "cflags!": ["-fno-exceptions"], "cflags_cc!": ["-fno-exceptions"], - "xcode_settings": { - "GCC_ENABLE_CPP_EXCEPTIONS": "YES", - "CLANG_CXX_LIBRARY": "libc++", - "MACOSX_DEPLOYMENT_TARGET": "13.0" - }, + "conditions": [ + [ + "OS=='win'", + { + "defines": ["_HAS_EXCEPTIONS=1"], + "msvs_settings": { + "VCCLCompilerTool": { + "ExceptionHandling": 1 + } + } + } + ], + [ + "OS=='mac'", + { + "cflags+": ["-fvisibility=hidden"], + "xcode_settings": { + "GCC_ENABLE_CPP_EXCEPTIONS": "YES", + "CLANG_CXX_LIBRARY": "libc++", + "MACOSX_DEPLOYMENT_TARGET": "10.7", + "GCC_SYMBOLS_PRIVATE_EXTERN": "YES" + } + } + ] + ], "sources": ["kzg.cxx"], "include_dirs": [ "<(module_root_dir)/dist/deps/blst/bindings", @@ -20,7 +40,6 @@ "<(module_root_dir)/libblst.a" ], "dependencies": [" napi_typed_array_from_bytes(uint8_t* array, size_t length, Napi::Env env) { @@ -66,11 +62,11 @@ Napi::Value LoadTrustedSetup(const Napi::CallbackInfo& info) { size_t argument_count = info.Length(); size_t expected_argument_count = 1; if (argument_count != expected_argument_count) { - return throw_invalid_arguments_count(expected_argument_count, argument_count, env); + throw_invalid_arguments_count(expected_argument_count, argument_count, env); } if (!info[0].IsString()) { - return throw_invalid_argument_type(env, "filePath", "string"); + throw_invalid_argument_type(env, "filePath", "string"); } const std::string file_path = info[0].ToString().Utf8Value(); @@ -106,7 +102,7 @@ Napi::Value FreeTrustedSetup(const Napi::CallbackInfo& info) { size_t argument_count = info.Length(); size_t expected_argument_count = 1; if (argument_count != expected_argument_count) { - return throw_invalid_arguments_count(expected_argument_count, argument_count, env); + throw_invalid_arguments_count(expected_argument_count, argument_count, env); } auto kzg_settings = info[0].As>().Data(); @@ -122,12 +118,12 @@ Napi::Value BlobToKzgCommitment(const Napi::CallbackInfo& info) { size_t argument_count = info.Length(); size_t expected_argument_count = 2; if (argument_count != expected_argument_count) { - return throw_invalid_arguments_count(expected_argument_count, argument_count, env); + throw_invalid_arguments_count(expected_argument_count, argument_count, env); } auto blob_param = info[0].As(); - if (blob_param.TypedArrayType() != napi_uint8_array) { - return throw_invalid_argument_type(env, "blob", "UInt8Array"); + if (!blob_param.IsTypedArray() || blob_param.TypedArrayType() != napi_uint8_array) { + throw_invalid_argument_type(env, "blob", "UInt8Array"); } auto blob = blob_param.As().Data(); @@ -148,7 +144,7 @@ Napi::Value ComputeAggregateKzgProof(const Napi::CallbackInfo& info) { size_t argument_count = info.Length(); size_t expected_argument_count = 2; if (argument_count != expected_argument_count) { - return throw_invalid_arguments_count(expected_argument_count, argument_count, env); + throw_invalid_arguments_count(expected_argument_count, argument_count, env); } auto blobs_param = info[0].As(); @@ -191,7 +187,7 @@ Napi::Value VerifyAggregateKzgProof(const Napi::CallbackInfo& info) { size_t argument_count = info.Length(); size_t expected_argument_count = 4; if (argument_count != expected_argument_count) { - return throw_invalid_arguments_count(expected_argument_count, argument_count, env); + throw_invalid_arguments_count(expected_argument_count, argument_count, env); } auto blobs_param = info[0].As(); @@ -277,30 +273,30 @@ Napi::Value VerifyKzgProof(const Napi::CallbackInfo& info) { size_t argument_count = info.Length(); size_t expected_argument_count = 5; if (argument_count != expected_argument_count) { - return throw_invalid_arguments_count(expected_argument_count, argument_count, env); + throw_invalid_arguments_count(expected_argument_count, argument_count, env); } auto c_param = info[0].As(); if (c_param.TypedArrayType() != napi_uint8_array) { - return throw_invalid_argument_type(env, "polynomialKzg", "UInt8Array"); + throw_invalid_argument_type(env, "polynomialKzg", "UInt8Array"); } auto polynomial_kzg = c_param.As().Data(); auto z_param = info[1].As(); if (z_param.TypedArrayType() != napi_uint8_array) { - return throw_invalid_argument_type(env, "z", "UInt8Array"); + throw_invalid_argument_type(env, "z", "UInt8Array"); } auto z = z_param.As().Data(); auto y_param = info[2].As(); if (y_param.TypedArrayType() != napi_uint8_array) { - return throw_invalid_argument_type(env, "y", "UInt8Array"); + throw_invalid_argument_type(env, "y", "UInt8Array"); } auto y = y_param.As().Data(); auto proof_param = info[3].As(); if (proof_param.TypedArrayType() != napi_uint8_array) { - return throw_invalid_argument_type(env, "kzgProof", "UInt8Array"); + throw_invalid_argument_type(env, "kzgProof", "UInt8Array"); } auto kzg_proof = proof_param.As().Data(); diff --git a/bindings/node.js/package.json b/bindings/node.js/package.json index 035f2c9..7bf3af6 100644 --- a/bindings/node.js/package.json +++ b/bindings/node.js/package.json @@ -1,6 +1,6 @@ { "name": "c-kzg", - "version": "1.0.0", + "version": "1.0.1", "description": "NodeJS bindings for C-KZG", "author": "Dan Coffman", "license": "MIT", diff --git a/bindings/node.js/test.ts b/bindings/node.js/test.ts index ed6e4d2..c13d898 100644 --- a/bindings/node.js/test.ts +++ b/bindings/node.js/test.ts @@ -63,4 +63,13 @@ describe("C-KZG", () => { verifyAggregateKzgProof(blobs, commitments, proof), ).toThrowError("Invalid commitment data"); }); + + describe("computing commitment from blobs", () => { + it("throws as expected when given an argument of invalid type", () => { + // @ts-expect-error + expect(() => blobToKzgCommitment("wrong type")).toThrowError( + "Invalid argument type: blob. Expected UInt8Array", + ); + }); + }); });