diff --git a/.pnp.cjs b/.pnp.cjs index 54c64b8c824..35a2883f892 100755 --- a/.pnp.cjs +++ b/.pnp.cjs @@ -3004,6 +3004,7 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ["stream-browserify", "npm:3.0.0"],\ ["stream-http", "npm:3.2.0"],\ ["string_decoder", "npm:1.3.0"],\ + ["terser-webpack-plugin", "virtual:e2d057e7cc143d3cb9bec864f4a2d862441b5a09f81f8e6c46e7a098cbc89e4d07017cc6e2e2142d5704bb55da853cbec2d025ebc0b30e8696c31380c00f2c7d#npm:5.3.3"],\ ["ts-loader", "virtual:e2d057e7cc143d3cb9bec864f4a2d862441b5a09f81f8e6c46e7a098cbc89e4d07017cc6e2e2142d5704bb55da853cbec2d025ebc0b30e8696c31380c00f2c7d#npm:8.3.0"],\ ["typescript", "patch:typescript@npm%3A3.9.10#~builtin::version=3.9.10&hash=3bd3d3"],\ ["url", "npm:0.11.0"],\ @@ -16612,10 +16613,10 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ],\ "linkType": "HARD"\ }],\ - ["virtual:1e283838b33fe5ecbdf2f3115a4d5b08849a8ce87631118c686a4cee561fe8d2be0e74cac24b64751965c29ead072c36f3b80c2bd2bd4117d8a681dd5762fd93#npm:5.3.3", {\ - "packageLocation": "./.yarn/__virtual__/terser-webpack-plugin-virtual-3118d3e560/0/cache/terser-webpack-plugin-npm-5.3.3-659a8e4514-4b8d508d8a.zip/node_modules/terser-webpack-plugin/",\ + ["virtual:35ef488be3738fb73696e8919272b5c35cfafebd6b82f716b7cf402514ee937bd8da0f25ae67baa1d8aeef0e69c557930350fe0dec6c03e135d60acb24c93c14#npm:5.3.3", {\ + "packageLocation": "./.yarn/__virtual__/terser-webpack-plugin-virtual-48f02661da/0/cache/terser-webpack-plugin-npm-5.3.3-659a8e4514-4b8d508d8a.zip/node_modules/terser-webpack-plugin/",\ "packageDependencies": [\ - ["terser-webpack-plugin", "virtual:1e283838b33fe5ecbdf2f3115a4d5b08849a8ce87631118c686a4cee561fe8d2be0e74cac24b64751965c29ead072c36f3b80c2bd2bd4117d8a681dd5762fd93#npm:5.3.3"],\ + ["terser-webpack-plugin", "virtual:35ef488be3738fb73696e8919272b5c35cfafebd6b82f716b7cf402514ee937bd8da0f25ae67baa1d8aeef0e69c557930350fe0dec6c03e135d60acb24c93c14#npm:5.3.3"],\ ["@jridgewell/trace-mapping", "npm:0.3.15"],\ ["@swc/core", null],\ ["@types/esbuild", null],\ @@ -16628,7 +16629,7 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ["serialize-javascript", "npm:6.0.0"],\ ["terser", "npm:5.14.2"],\ ["uglify-js", null],\ - ["webpack", "virtual:e2d057e7cc143d3cb9bec864f4a2d862441b5a09f81f8e6c46e7a098cbc89e4d07017cc6e2e2142d5704bb55da853cbec2d025ebc0b30e8696c31380c00f2c7d#npm:5.64.1"]\ + ["webpack", "virtual:8f25fc90e0fb5fd89843707863857591fa8c52f9f33eadced4bf404b1871d91959f7bb86948ae0e1b53ee94d491ef8fde9c0b58b39c9490c0d0fa6c931945f97#npm:5.64.1"]\ ],\ "packagePeers": [\ "@swc/core",\ @@ -16642,10 +16643,10 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ],\ "linkType": "HARD"\ }],\ - ["virtual:35ef488be3738fb73696e8919272b5c35cfafebd6b82f716b7cf402514ee937bd8da0f25ae67baa1d8aeef0e69c557930350fe0dec6c03e135d60acb24c93c14#npm:5.3.3", {\ - "packageLocation": "./.yarn/__virtual__/terser-webpack-plugin-virtual-48f02661da/0/cache/terser-webpack-plugin-npm-5.3.3-659a8e4514-4b8d508d8a.zip/node_modules/terser-webpack-plugin/",\ + ["virtual:4953b975b7bd5a519c3d3acbf14e67153262cfb500bb1b8ce3d6f78e6b4fc3e422ef0018b19f059be78f5a124f310f4b9d100d3e3076ea1db98ff3d39975a669#npm:5.3.3", {\ + "packageLocation": "./.yarn/__virtual__/terser-webpack-plugin-virtual-6184b6aeb4/0/cache/terser-webpack-plugin-npm-5.3.3-659a8e4514-4b8d508d8a.zip/node_modules/terser-webpack-plugin/",\ "packageDependencies": [\ - ["terser-webpack-plugin", "virtual:35ef488be3738fb73696e8919272b5c35cfafebd6b82f716b7cf402514ee937bd8da0f25ae67baa1d8aeef0e69c557930350fe0dec6c03e135d60acb24c93c14#npm:5.3.3"],\ + ["terser-webpack-plugin", "virtual:4953b975b7bd5a519c3d3acbf14e67153262cfb500bb1b8ce3d6f78e6b4fc3e422ef0018b19f059be78f5a124f310f4b9d100d3e3076ea1db98ff3d39975a669#npm:5.3.3"],\ ["@jridgewell/trace-mapping", "npm:0.3.15"],\ ["@swc/core", null],\ ["@types/esbuild", null],\ @@ -16658,7 +16659,7 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ["serialize-javascript", "npm:6.0.0"],\ ["terser", "npm:5.14.2"],\ ["uglify-js", null],\ - ["webpack", "virtual:8f25fc90e0fb5fd89843707863857591fa8c52f9f33eadced4bf404b1871d91959f7bb86948ae0e1b53ee94d491ef8fde9c0b58b39c9490c0d0fa6c931945f97#npm:5.64.1"]\ + ["webpack", "virtual:01938c2be4835443e5a304e2b117c575220e96e8b7cedeb0f48d79264590b4c4babc6d1fea6367f522b1ca0149d795b42f2ab89c34a6ffe3c20f0a8cbb8b4453#npm:5.64.1"]\ ],\ "packagePeers": [\ "@swc/core",\ @@ -16672,10 +16673,10 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ],\ "linkType": "HARD"\ }],\ - ["virtual:4953b975b7bd5a519c3d3acbf14e67153262cfb500bb1b8ce3d6f78e6b4fc3e422ef0018b19f059be78f5a124f310f4b9d100d3e3076ea1db98ff3d39975a669#npm:5.3.3", {\ - "packageLocation": "./.yarn/__virtual__/terser-webpack-plugin-virtual-6184b6aeb4/0/cache/terser-webpack-plugin-npm-5.3.3-659a8e4514-4b8d508d8a.zip/node_modules/terser-webpack-plugin/",\ + ["virtual:74c6cfbee4804d578abc9f87850914089f1afe762b6ef9dde76ecf912446a2b7772b58b2a3d070d6a0e21b0f126bfcdfa013123d743c15f32eee4a9cf9f4d551#npm:5.3.3", {\ + "packageLocation": "./.yarn/__virtual__/terser-webpack-plugin-virtual-f3cc17b892/0/cache/terser-webpack-plugin-npm-5.3.3-659a8e4514-4b8d508d8a.zip/node_modules/terser-webpack-plugin/",\ "packageDependencies": [\ - ["terser-webpack-plugin", "virtual:4953b975b7bd5a519c3d3acbf14e67153262cfb500bb1b8ce3d6f78e6b4fc3e422ef0018b19f059be78f5a124f310f4b9d100d3e3076ea1db98ff3d39975a669#npm:5.3.3"],\ + ["terser-webpack-plugin", "virtual:74c6cfbee4804d578abc9f87850914089f1afe762b6ef9dde76ecf912446a2b7772b58b2a3d070d6a0e21b0f126bfcdfa013123d743c15f32eee4a9cf9f4d551#npm:5.3.3"],\ ["@jridgewell/trace-mapping", "npm:0.3.15"],\ ["@swc/core", null],\ ["@types/esbuild", null],\ @@ -16688,7 +16689,7 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ["serialize-javascript", "npm:6.0.0"],\ ["terser", "npm:5.14.2"],\ ["uglify-js", null],\ - ["webpack", "virtual:01938c2be4835443e5a304e2b117c575220e96e8b7cedeb0f48d79264590b4c4babc6d1fea6367f522b1ca0149d795b42f2ab89c34a6ffe3c20f0a8cbb8b4453#npm:5.64.1"]\ + ["webpack", "virtual:58fb68f2aed20e5e0f2e48520ab903ae9bb3440369bfd5e912034003cf27c5aae368649fc5620dd2acbed578131f3a0975e75b838d77d12335fb0412e24026c6#npm:5.64.1"]\ ],\ "packagePeers": [\ "@swc/core",\ @@ -16702,10 +16703,10 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ],\ "linkType": "HARD"\ }],\ - ["virtual:74c6cfbee4804d578abc9f87850914089f1afe762b6ef9dde76ecf912446a2b7772b58b2a3d070d6a0e21b0f126bfcdfa013123d743c15f32eee4a9cf9f4d551#npm:5.3.3", {\ - "packageLocation": "./.yarn/__virtual__/terser-webpack-plugin-virtual-f3cc17b892/0/cache/terser-webpack-plugin-npm-5.3.3-659a8e4514-4b8d508d8a.zip/node_modules/terser-webpack-plugin/",\ + ["virtual:ad53cff31b1dbd4927a99e71702e3b8b10338636eaff010987c27c9ccea2d52af36900a9e36a4231cbb6e5464248ccc9c1da5d1d24d9b0f4f95660296b1060a6#npm:5.3.3", {\ + "packageLocation": "./.yarn/__virtual__/terser-webpack-plugin-virtual-65e4fce360/0/cache/terser-webpack-plugin-npm-5.3.3-659a8e4514-4b8d508d8a.zip/node_modules/terser-webpack-plugin/",\ "packageDependencies": [\ - ["terser-webpack-plugin", "virtual:74c6cfbee4804d578abc9f87850914089f1afe762b6ef9dde76ecf912446a2b7772b58b2a3d070d6a0e21b0f126bfcdfa013123d743c15f32eee4a9cf9f4d551#npm:5.3.3"],\ + ["terser-webpack-plugin", "virtual:ad53cff31b1dbd4927a99e71702e3b8b10338636eaff010987c27c9ccea2d52af36900a9e36a4231cbb6e5464248ccc9c1da5d1d24d9b0f4f95660296b1060a6#npm:5.3.3"],\ ["@jridgewell/trace-mapping", "npm:0.3.15"],\ ["@swc/core", null],\ ["@types/esbuild", null],\ @@ -16718,7 +16719,7 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ["serialize-javascript", "npm:6.0.0"],\ ["terser", "npm:5.14.2"],\ ["uglify-js", null],\ - ["webpack", "virtual:58fb68f2aed20e5e0f2e48520ab903ae9bb3440369bfd5e912034003cf27c5aae368649fc5620dd2acbed578131f3a0975e75b838d77d12335fb0412e24026c6#npm:5.64.1"]\ + ["webpack", "virtual:ad53cff31b1dbd4927a99e71702e3b8b10338636eaff010987c27c9ccea2d52af36900a9e36a4231cbb6e5464248ccc9c1da5d1d24d9b0f4f95660296b1060a6#npm:5.64.1"]\ ],\ "packagePeers": [\ "@swc/core",\ @@ -16732,10 +16733,10 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ],\ "linkType": "HARD"\ }],\ - ["virtual:ad53cff31b1dbd4927a99e71702e3b8b10338636eaff010987c27c9ccea2d52af36900a9e36a4231cbb6e5464248ccc9c1da5d1d24d9b0f4f95660296b1060a6#npm:5.3.3", {\ - "packageLocation": "./.yarn/__virtual__/terser-webpack-plugin-virtual-65e4fce360/0/cache/terser-webpack-plugin-npm-5.3.3-659a8e4514-4b8d508d8a.zip/node_modules/terser-webpack-plugin/",\ + ["virtual:e2d057e7cc143d3cb9bec864f4a2d862441b5a09f81f8e6c46e7a098cbc89e4d07017cc6e2e2142d5704bb55da853cbec2d025ebc0b30e8696c31380c00f2c7d#npm:5.3.3", {\ + "packageLocation": "./.yarn/__virtual__/terser-webpack-plugin-virtual-e7099d0e79/0/cache/terser-webpack-plugin-npm-5.3.3-659a8e4514-4b8d508d8a.zip/node_modules/terser-webpack-plugin/",\ "packageDependencies": [\ - ["terser-webpack-plugin", "virtual:ad53cff31b1dbd4927a99e71702e3b8b10338636eaff010987c27c9ccea2d52af36900a9e36a4231cbb6e5464248ccc9c1da5d1d24d9b0f4f95660296b1060a6#npm:5.3.3"],\ + ["terser-webpack-plugin", "virtual:e2d057e7cc143d3cb9bec864f4a2d862441b5a09f81f8e6c46e7a098cbc89e4d07017cc6e2e2142d5704bb55da853cbec2d025ebc0b30e8696c31380c00f2c7d#npm:5.3.3"],\ ["@jridgewell/trace-mapping", "npm:0.3.15"],\ ["@swc/core", null],\ ["@types/esbuild", null],\ @@ -16748,7 +16749,7 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ["serialize-javascript", "npm:6.0.0"],\ ["terser", "npm:5.14.2"],\ ["uglify-js", null],\ - ["webpack", "virtual:ad53cff31b1dbd4927a99e71702e3b8b10338636eaff010987c27c9ccea2d52af36900a9e36a4231cbb6e5464248ccc9c1da5d1d24d9b0f4f95660296b1060a6#npm:5.64.1"]\ + ["webpack", "virtual:e2d057e7cc143d3cb9bec864f4a2d862441b5a09f81f8e6c46e7a098cbc89e4d07017cc6e2e2142d5704bb55da853cbec2d025ebc0b30e8696c31380c00f2c7d#npm:5.64.1"]\ ],\ "packagePeers": [\ "@swc/core",\ @@ -17986,7 +17987,7 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ["neo-async", "npm:2.6.2"],\ ["schema-utils", "npm:3.1.1"],\ ["tapable", "npm:2.2.1"],\ - ["terser-webpack-plugin", "virtual:1e283838b33fe5ecbdf2f3115a4d5b08849a8ce87631118c686a4cee561fe8d2be0e74cac24b64751965c29ead072c36f3b80c2bd2bd4117d8a681dd5762fd93#npm:5.3.3"],\ + ["terser-webpack-plugin", "virtual:e2d057e7cc143d3cb9bec864f4a2d862441b5a09f81f8e6c46e7a098cbc89e4d07017cc6e2e2142d5704bb55da853cbec2d025ebc0b30e8696c31380c00f2c7d#npm:5.3.3"],\ ["watchpack", "npm:2.2.0"],\ ["webpack-cli", "virtual:e2d057e7cc143d3cb9bec864f4a2d862441b5a09f81f8e6c46e7a098cbc89e4d07017cc6e2e2142d5704bb55da853cbec2d025ebc0b30e8696c31380c00f2c7d#npm:4.9.1"],\ ["webpack-sources", "npm:3.2.2"]\ diff --git a/packages/wasm-dpp/README.md b/packages/wasm-dpp/README.md index 3d55826b98d..43e9919a27a 100644 --- a/packages/wasm-dpp/README.md +++ b/packages/wasm-dpp/README.md @@ -14,7 +14,8 @@ The WASM JavaScript binding of the Rust implementation of the [Dash Platform Pro In order for this binding to work, you have to have a rs-platform cloned alongside platform repo, so you can have access to the rust dpp. -## IMPORTANT! Build on a Mac +## IMPORTANT! +### Build on a Mac To build on a mac, you need to perform two steps. First, install `clang` from the homebrew. XCode's `clang` doesn't ship with the WASM support. Second, @@ -24,6 +25,9 @@ instead. Alternatively, you can add the following to the `yarn workspace @dashevo/wasm-dpp build:node:mac` instead. +### Class names minification +Library consumers must ignore class names minification for `@dashevo/wasm-dpp` library in their bundlers. + ## Table of Contents - [Install](#install) diff --git a/packages/wasm-dpp/package.json b/packages/wasm-dpp/package.json index 9777a3652f3..c1b1c4524d1 100644 --- a/packages/wasm-dpp/package.json +++ b/packages/wasm-dpp/package.json @@ -74,6 +74,7 @@ "stream-browserify": "^3.0.0", "stream-http": "^3.2.0", "string_decoder": "^1.3.0", + "terser-webpack-plugin": "^5.3.1", "ts-loader": "^8.0.2", "typescript": "^3.9.5", "url": "^0.11.0", diff --git a/packages/wasm-dpp/src/utils.rs b/packages/wasm-dpp/src/utils.rs index c4bd9ae5f12..66f10f527ce 100644 --- a/packages/wasm-dpp/src/utils.rs +++ b/packages/wasm-dpp/src/utils.rs @@ -6,6 +6,7 @@ use dpp::{ use js_sys::Function; use serde::de::DeserializeOwned; use serde_json::Value; +use wasm_bindgen::convert::RefFromWasmAbi; use wasm_bindgen::prelude::*; use crate::errors::{from_dpp_err, RustConversionError}; @@ -121,3 +122,33 @@ impl WithJsError for Result { } } } + +pub fn generic_of_js_val>( + js_value: &JsValue, + class_name: &str, +) -> Result { + if !js_value.is_object() { + return Err(JsValue::from_str( + format!("Value supplied as {} is not an object", class_name).as_str(), + )); + } + + let ctor_name = js_sys::Object::get_prototype_of(js_value) + .constructor() + .name(); + + if ctor_name == class_name { + let ptr = js_sys::Reflect::get(js_value, &JsValue::from_str("ptr"))?; + let ptr_u32: u32 = ptr + .as_f64() + .ok_or(JsValue::from("Invalid JS object pointer"))? as u32; + let reference = unsafe { T::ref_from_abi(ptr_u32) }; + Ok(reference) + } else { + let error_string = format!( + "JS object constructor name mismatch. Expected {}, provided {}.", + class_name, ctor_name + ); + Err(JsValue::from(&error_string)) + } +} diff --git a/packages/wasm-dpp/webpack.config.js b/packages/wasm-dpp/webpack.config.js index b9d8edfd7e6..35b7319e0d3 100644 --- a/packages/wasm-dpp/webpack.config.js +++ b/packages/wasm-dpp/webpack.config.js @@ -1,5 +1,6 @@ const path = require('path'); const webpack = require('webpack'); +const TerserPlugin = require('terser-webpack-plugin'); module.exports = { entry: './lib/index.ts', @@ -14,6 +15,14 @@ module.exports = { // as webpack names global object "self" for some reason globalObject: 'this', }, + optimization: { + minimize: true, + minimizer: [new TerserPlugin({ + terserOptions: { + keep_classnames: true, + }, + })], + }, mode: 'production', module: { rules: [ diff --git a/yarn.lock b/yarn.lock index 444e9c4c8e8..f1fcf493f0c 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1962,6 +1962,7 @@ __metadata: stream-browserify: ^3.0.0 stream-http: ^3.2.0 string_decoder: ^1.3.0 + terser-webpack-plugin: ^5.3.1 ts-loader: ^8.0.2 typescript: ^3.9.5 url: ^0.11.0