0.0.1 • Published 6 years ago

gocrypto v0.0.1

Weekly downloads
1
License
MIT
Repository
github
Last release
6 years ago

WebAssembly

Getting Started

Basic Setup

  1. Include wasm_exec.js to your web app

    <Script src="wasm_exec.js"/>
  2. Add following code to check the WebAssembly compatibility:

    if (WebAssembly) {
    	// WebAssembly.instantiateStreaming is not currently available in Safari
    	if (WebAssembly && !WebAssembly.instantiateStreaming) { // polyfill
    		WebAssembly.instantiateStreaming = async (resp, importObject) => {
    			const source = await (await resp).arrayBuffer();
    			return await WebAssembly.instantiate(source, importObject);
        };
    	} 
    }
  3. Instantiate and attach a __gobridge__ object to the global object, DMSCrypto will hook and exports all available function to the __gobridge__ object

    const g = global || window || self;
    
    if (!g.__gobridge__) {
    	g.__gobridge__ = {};
    }
  4. Use WebAssembly.instantiateStreaming to load and instantiate the DMSGoCrypto.wasm library:

    const go = new Go(); // Go provided by the wasm_exec.js to run the GoWasm library
    WebAssembly.instantiateStreaming(fetch("DMSGoCrypto.wasm"), go.importObject).then((result) => {
    		go.run(result.instance); // ** NOTE: Call go.run() before using any WebAssembly function **
    		__gobridge__.generateSecp256k1Key("", (err, privKey) => {
    			if (err != null) {
    				console.log(err);
    			} else {
    				console.log(privKey);
    			}
    	});
    });

API Reference

Overall API Design

Due to restriction of Go-WebAssembly, all DMSCrypto WebAssembly API is designed to provide a Parameters + Callback function signature pattern.

Take generateSecp256k1Key as the example:

__gobridge__.generateSecp256k1Key(
  // First param would be an object, check each API spec for the definition 
  "", 
  
  // Final param would always be a callback in which the first param is a nullable `error`
  (err, privKey) => {
		if (err != null) {
			console.log(err);
		} else {
			console.log(privKey);
		}
});