From e16167a08e3eb804a31ea0f603ba53e28a1b0a1e Mon Sep 17 00:00:00 2001 From: Luca Spinazzola Date: Fri, 25 Mar 2022 02:43:10 -0400 Subject: [PATCH] JS fixes. Use libsodium-sumo module for ready and _sodium_init, and libsodium-wrapper-sumo for JsSodiumInterface Load JsSodiumInterface as external object Clean up JsSodiumLoader: remove storeSodium (not needed anymore) Clean up LibsodiumInitializer: remove sodiumPointer (not needed anymore) --- .../kotlin/crypto/JsSodiumInterface.kt | 6 ++--- .../ionspin/kotlin/crypto/JsSodiumLoader.kt | 23 ++++++------------- .../kotlin/crypto/LibsodiumInitializer.kt | 13 +++-------- .../src/jsMain/kotlin/libsodium.kt | 5 +++- 4 files changed, 17 insertions(+), 30 deletions(-) diff --git a/multiplatform-crypto-libsodium-bindings/src/jsMain/kotlin/com/ionspin/kotlin/crypto/JsSodiumInterface.kt b/multiplatform-crypto-libsodium-bindings/src/jsMain/kotlin/com/ionspin/kotlin/crypto/JsSodiumInterface.kt index 24248ab..ed74443 100644 --- a/multiplatform-crypto-libsodium-bindings/src/jsMain/kotlin/com/ionspin/kotlin/crypto/JsSodiumInterface.kt +++ b/multiplatform-crypto-libsodium-bindings/src/jsMain/kotlin/com/ionspin/kotlin/crypto/JsSodiumInterface.kt @@ -9,10 +9,10 @@ import org.khronos.webgl.Uint8Array * ugljesa.jovanovic@ionspin.com * on 27-May-2020 */ -interface JsSodiumInterface { +@JsModule("libsodium-wrappers-sumo") +@JsNonModule +external object JsSodiumInterface { - @JsName("sodium_init") - fun sodium_init() : Int @JsName("crypto_generichash") fun crypto_generichash(hashLength: Int, inputMessage: Uint8Array, key: Uint8Array): Uint8Array diff --git a/multiplatform-crypto-libsodium-bindings/src/jsMain/kotlin/com/ionspin/kotlin/crypto/JsSodiumLoader.kt b/multiplatform-crypto-libsodium-bindings/src/jsMain/kotlin/com/ionspin/kotlin/crypto/JsSodiumLoader.kt index a04adbd..e9f72e6 100644 --- a/multiplatform-crypto-libsodium-bindings/src/jsMain/kotlin/com/ionspin/kotlin/crypto/JsSodiumLoader.kt +++ b/multiplatform-crypto-libsodium-bindings/src/jsMain/kotlin/com/ionspin/kotlin/crypto/JsSodiumLoader.kt @@ -1,11 +1,7 @@ package ext.libsodium.com.ionspin.kotlin.crypto -import com.ionspin.kotlin.crypto.getSodiumLoaded -import com.ionspin.kotlin.crypto.setSodiumPointer -import com.ionspin.kotlin.crypto.sodiumLoaded -import com.ionspin.kotlin.crypto.sodiumPointer +import com.ionspin.kotlin.crypto.* import ext.libsodium.* -import kotlin.coroutines.Continuation import kotlin.coroutines.suspendCoroutine /** @@ -25,18 +21,15 @@ object JsSodiumLoader { } - fun storeSodium(promisedSodium: dynamic, continuation: Continuation) { - setSodiumPointer(promisedSodium) - sodiumLoaded = true - continuation.resumeWith(Result.success(Unit)) - } - suspend fun load() = suspendCoroutine { continuation -> console.log(getSodiumLoaded()) if (!getSodiumLoaded()) { - val libsodiumModule = js("\$module\$libsodium_wrappers_sumo") _libsodiumPromise.then { - storeSodium(libsodiumModule, continuation) + sodium_init() + sodiumLoaded = true + continuation.resumeWith(Result.success(Unit)) + }.catch { e -> + continuation.resumeWith(Result.failure(e)) } } else { continuation.resumeWith(Result.success(Unit)) @@ -46,10 +39,8 @@ object JsSodiumLoader { fun loadWithCallback(doneCallback: () -> (Unit)) { console.log(getSodiumLoaded()) if (!getSodiumLoaded()) { - val libsodiumModule = js("\$module\$libsodium_wrappers_sumo") _libsodiumPromise.then { - setSodiumPointer(libsodiumModule) - sodiumPointer.sodium_init() + sodium_init() sodiumLoaded = true doneCallback.invoke() } diff --git a/multiplatform-crypto-libsodium-bindings/src/jsMain/kotlin/com/ionspin/kotlin/crypto/LibsodiumInitializer.kt b/multiplatform-crypto-libsodium-bindings/src/jsMain/kotlin/com/ionspin/kotlin/crypto/LibsodiumInitializer.kt index 437304a..20bf538 100644 --- a/multiplatform-crypto-libsodium-bindings/src/jsMain/kotlin/com/ionspin/kotlin/crypto/LibsodiumInitializer.kt +++ b/multiplatform-crypto-libsodium-bindings/src/jsMain/kotlin/com/ionspin/kotlin/crypto/LibsodiumInitializer.kt @@ -2,22 +2,15 @@ package com.ionspin.kotlin.crypto import ext.libsodium.com.ionspin.kotlin.crypto.JsSodiumInterface import ext.libsodium.com.ionspin.kotlin.crypto.JsSodiumLoader -/* 1.4-M1 has some weirdness with static/objects, or I'm misusing something, not sure */ -lateinit var sodiumPointer : JsSodiumInterface + var sodiumLoaded: Boolean = false -fun getSodium() : JsSodiumInterface = sodiumPointer - -//fun getSodiumAdvanced() : JsSodiumAdvancedInterface = js("sodiumPointer.libsodium") - -fun setSodiumPointer(jsSodiumInterface: JsSodiumInterface) { - js("sodiumPointer = jsSodiumInterface") -} +fun getSodium() : JsSodiumInterface = JsSodiumInterface fun getSodiumLoaded() : Boolean = sodiumLoaded fun setSodiumLoaded(loaded: Boolean) { - js("sodiumLoaded = loaded") + sodiumLoaded = loaded } actual object LibsodiumInitializer { diff --git a/multiplatform-crypto-libsodium-bindings/src/jsMain/kotlin/libsodium.kt b/multiplatform-crypto-libsodium-bindings/src/jsMain/kotlin/libsodium.kt index f37c329..85ff707 100644 --- a/multiplatform-crypto-libsodium-bindings/src/jsMain/kotlin/libsodium.kt +++ b/multiplatform-crypto-libsodium-bindings/src/jsMain/kotlin/libsodium.kt @@ -1,4 +1,4 @@ -@file:JsModule("libsodium-wrappers-sumo") +@file:JsModule("libsodium-sumo") @file:JsNonModule package ext.libsodium @@ -15,6 +15,9 @@ import kotlin.js.Promise @JsName("ready") external val _libsodiumPromise : Promise +@JsName("_sodium_init") +external fun sodium_init() : Int + external fun crypto_generichash(hashLength: Int, inputMessage: Uint8Array) : Uint8Array external fun crypto_hash_sha256(message: Uint8Array) : Uint8Array