@synonymdev/react-native-pubky 0.7.1 → 0.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +75 -3
- package/android/src/main/java/com/pubky/PubkyModule.kt +369 -252
- package/android/src/main/java/uniffi/pubkymobile/pubkymobile.kt +557 -127
- package/android/src/main/jniLibs/arm64-v8a/libpubkymobile.so +0 -0
- package/android/src/main/jniLibs/armeabi-v7a/libpubkymobile.so +0 -0
- package/android/src/main/jniLibs/x86/libpubkymobile.so +0 -0
- package/android/src/main/jniLibs/x86_64/libpubkymobile.so +0 -0
- package/ios/Frameworks/PubkyMobile.xcframework/Info.plist +4 -4
- package/ios/Frameworks/PubkyMobile.xcframework/ios-arm64/Headers/pubkymobileFFI.h +38 -0
- package/ios/Frameworks/PubkyMobile.xcframework/ios-arm64/libpubkymobile.a +0 -0
- package/ios/Frameworks/PubkyMobile.xcframework/ios-arm64-simulator/Headers/pubkymobileFFI.h +38 -0
- package/ios/Frameworks/PubkyMobile.xcframework/ios-arm64-simulator/libpubkymobile.a +0 -0
- package/ios/Pubky-Bridging-Header.h +1 -0
- package/ios/Pubky.mm +26 -1
- package/ios/Pubky.swift +84 -1
- package/ios/pubkymobile.swift +310 -0
- package/lib/commonjs/index.js +69 -0
- package/lib/commonjs/index.js.map +1 -1
- package/lib/module/index.js +64 -1
- package/lib/module/index.js.map +1 -1
- package/lib/typescript/commonjs/src/index.d.ts +10 -0
- package/lib/typescript/commonjs/src/index.d.ts.map +1 -1
- package/lib/typescript/module/src/index.d.ts +10 -0
- package/lib/typescript/module/src/index.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/index.tsx +84 -1
@@ -29,9 +29,10 @@ import java.nio.ByteOrder
|
|
29
29
|
import java.nio.CharBuffer
|
30
30
|
import java.nio.charset.CodingErrorAction
|
31
31
|
import java.util.concurrent.ConcurrentHashMap
|
32
|
-
import
|
33
|
-
import
|
34
|
-
import
|
32
|
+
import java.util.concurrent.atomic.AtomicBoolean
|
33
|
+
import java.util.concurrent.atomic.AtomicLong
|
34
|
+
import java.util.concurrent.locks.ReentrantLock
|
35
|
+
import kotlin.concurrent.withLock
|
35
36
|
|
36
37
|
// This is a helper for safely working with byte buffers returned from the Rust code.
|
37
38
|
// A rust-owned buffer is represented by its capacity, its current length, and a
|
@@ -380,15 +381,29 @@ internal interface _UniFFILib : Library {
|
|
380
381
|
.also { lib: _UniFFILib ->
|
381
382
|
uniffiCheckContractApiVersion(lib)
|
382
383
|
uniffiCheckApiChecksums(lib)
|
383
|
-
|
384
|
+
FfiConverterTypeEventListener.register(lib)
|
384
385
|
}
|
385
386
|
}
|
386
387
|
}
|
387
388
|
|
389
|
+
fun uniffi_pubkymobile_fn_free_eventnotifier(`ptr`: Pointer,_uniffi_out_err: RustCallStatus,
|
390
|
+
): Unit
|
391
|
+
fun uniffi_pubkymobile_fn_init_callback_eventlistener(`callbackStub`: ForeignCallback,_uniffi_out_err: RustCallStatus,
|
392
|
+
): Unit
|
388
393
|
fun uniffi_pubkymobile_fn_func_auth(`url`: RustBuffer.ByValue,`secretKey`: RustBuffer.ByValue,_uniffi_out_err: RustCallStatus,
|
389
394
|
): RustBuffer.ByValue
|
390
|
-
fun
|
391
|
-
):
|
395
|
+
fun uniffi_pubkymobile_fn_func_create_recovery_file(`secretKey`: RustBuffer.ByValue,`passphrase`: RustBuffer.ByValue,_uniffi_out_err: RustCallStatus,
|
396
|
+
): RustBuffer.ByValue
|
397
|
+
fun uniffi_pubkymobile_fn_func_decrypt_recovery_file(`recoveryFile`: RustBuffer.ByValue,`passphrase`: RustBuffer.ByValue,_uniffi_out_err: RustCallStatus,
|
398
|
+
): RustBuffer.ByValue
|
399
|
+
fun uniffi_pubkymobile_fn_func_delete_file(`url`: RustBuffer.ByValue,_uniffi_out_err: RustCallStatus,
|
400
|
+
): RustBuffer.ByValue
|
401
|
+
fun uniffi_pubkymobile_fn_func_generate_secret_key(_uniffi_out_err: RustCallStatus,
|
402
|
+
): RustBuffer.ByValue
|
403
|
+
fun uniffi_pubkymobile_fn_func_get(`url`: RustBuffer.ByValue,_uniffi_out_err: RustCallStatus,
|
404
|
+
): RustBuffer.ByValue
|
405
|
+
fun uniffi_pubkymobile_fn_func_get_public_key_from_secret_key(`secretKey`: RustBuffer.ByValue,_uniffi_out_err: RustCallStatus,
|
406
|
+
): RustBuffer.ByValue
|
392
407
|
fun uniffi_pubkymobile_fn_func_list(`url`: RustBuffer.ByValue,_uniffi_out_err: RustCallStatus,
|
393
408
|
): RustBuffer.ByValue
|
394
409
|
fun uniffi_pubkymobile_fn_func_parse_auth_url(`url`: RustBuffer.ByValue,_uniffi_out_err: RustCallStatus,
|
@@ -397,18 +412,24 @@ internal interface _UniFFILib : Library {
|
|
397
412
|
): RustBuffer.ByValue
|
398
413
|
fun uniffi_pubkymobile_fn_func_publish_https(`recordName`: RustBuffer.ByValue,`target`: RustBuffer.ByValue,`secretKey`: RustBuffer.ByValue,_uniffi_out_err: RustCallStatus,
|
399
414
|
): RustBuffer.ByValue
|
400
|
-
fun uniffi_pubkymobile_fn_func_put(`url`: RustBuffer.ByValue,`content`: RustBuffer.ByValue,
|
401
|
-
):
|
415
|
+
fun uniffi_pubkymobile_fn_func_put(`url`: RustBuffer.ByValue,`content`: RustBuffer.ByValue,_uniffi_out_err: RustCallStatus,
|
416
|
+
): RustBuffer.ByValue
|
417
|
+
fun uniffi_pubkymobile_fn_func_remove_event_listener(_uniffi_out_err: RustCallStatus,
|
418
|
+
): Unit
|
402
419
|
fun uniffi_pubkymobile_fn_func_resolve(`publicKey`: RustBuffer.ByValue,_uniffi_out_err: RustCallStatus,
|
403
420
|
): RustBuffer.ByValue
|
404
421
|
fun uniffi_pubkymobile_fn_func_resolve_https(`publicKey`: RustBuffer.ByValue,_uniffi_out_err: RustCallStatus,
|
405
422
|
): RustBuffer.ByValue
|
406
|
-
fun
|
407
|
-
):
|
408
|
-
fun
|
409
|
-
):
|
410
|
-
fun
|
411
|
-
):
|
423
|
+
fun uniffi_pubkymobile_fn_func_session(`pubky`: RustBuffer.ByValue,_uniffi_out_err: RustCallStatus,
|
424
|
+
): RustBuffer.ByValue
|
425
|
+
fun uniffi_pubkymobile_fn_func_set_event_listener(`listener`: Long,_uniffi_out_err: RustCallStatus,
|
426
|
+
): Unit
|
427
|
+
fun uniffi_pubkymobile_fn_func_sign_in(`secretKey`: RustBuffer.ByValue,_uniffi_out_err: RustCallStatus,
|
428
|
+
): RustBuffer.ByValue
|
429
|
+
fun uniffi_pubkymobile_fn_func_sign_out(`secretKey`: RustBuffer.ByValue,_uniffi_out_err: RustCallStatus,
|
430
|
+
): RustBuffer.ByValue
|
431
|
+
fun uniffi_pubkymobile_fn_func_sign_up(`secretKey`: RustBuffer.ByValue,`homeserver`: RustBuffer.ByValue,_uniffi_out_err: RustCallStatus,
|
432
|
+
): RustBuffer.ByValue
|
412
433
|
fun ffi_pubkymobile_rustbuffer_alloc(`size`: Int,_uniffi_out_err: RustCallStatus,
|
413
434
|
): RustBuffer.ByValue
|
414
435
|
fun ffi_pubkymobile_rustbuffer_from_bytes(`bytes`: ForeignBytes.ByValue,_uniffi_out_err: RustCallStatus,
|
@@ -525,8 +546,18 @@ internal interface _UniFFILib : Library {
|
|
525
546
|
): Unit
|
526
547
|
fun uniffi_pubkymobile_checksum_func_auth(
|
527
548
|
): Short
|
549
|
+
fun uniffi_pubkymobile_checksum_func_create_recovery_file(
|
550
|
+
): Short
|
551
|
+
fun uniffi_pubkymobile_checksum_func_decrypt_recovery_file(
|
552
|
+
): Short
|
553
|
+
fun uniffi_pubkymobile_checksum_func_delete_file(
|
554
|
+
): Short
|
555
|
+
fun uniffi_pubkymobile_checksum_func_generate_secret_key(
|
556
|
+
): Short
|
528
557
|
fun uniffi_pubkymobile_checksum_func_get(
|
529
558
|
): Short
|
559
|
+
fun uniffi_pubkymobile_checksum_func_get_public_key_from_secret_key(
|
560
|
+
): Short
|
530
561
|
fun uniffi_pubkymobile_checksum_func_list(
|
531
562
|
): Short
|
532
563
|
fun uniffi_pubkymobile_checksum_func_parse_auth_url(
|
@@ -537,16 +568,24 @@ internal interface _UniFFILib : Library {
|
|
537
568
|
): Short
|
538
569
|
fun uniffi_pubkymobile_checksum_func_put(
|
539
570
|
): Short
|
571
|
+
fun uniffi_pubkymobile_checksum_func_remove_event_listener(
|
572
|
+
): Short
|
540
573
|
fun uniffi_pubkymobile_checksum_func_resolve(
|
541
574
|
): Short
|
542
575
|
fun uniffi_pubkymobile_checksum_func_resolve_https(
|
543
576
|
): Short
|
577
|
+
fun uniffi_pubkymobile_checksum_func_session(
|
578
|
+
): Short
|
579
|
+
fun uniffi_pubkymobile_checksum_func_set_event_listener(
|
580
|
+
): Short
|
544
581
|
fun uniffi_pubkymobile_checksum_func_sign_in(
|
545
582
|
): Short
|
546
583
|
fun uniffi_pubkymobile_checksum_func_sign_out(
|
547
584
|
): Short
|
548
585
|
fun uniffi_pubkymobile_checksum_func_sign_up(
|
549
586
|
): Short
|
587
|
+
fun uniffi_pubkymobile_checksum_method_eventlistener_on_event_occurred(
|
588
|
+
): Short
|
550
589
|
fun ffi_pubkymobile_uniffi_contract_version(
|
551
590
|
): Int
|
552
591
|
|
@@ -567,7 +606,22 @@ private fun uniffiCheckApiChecksums(lib: _UniFFILib) {
|
|
567
606
|
if (lib.uniffi_pubkymobile_checksum_func_auth() != 61378.toShort()) {
|
568
607
|
throw RuntimeException("UniFFI API checksum mismatch: try cleaning and rebuilding your project")
|
569
608
|
}
|
570
|
-
if (lib.
|
609
|
+
if (lib.uniffi_pubkymobile_checksum_func_create_recovery_file() != 55903.toShort()) {
|
610
|
+
throw RuntimeException("UniFFI API checksum mismatch: try cleaning and rebuilding your project")
|
611
|
+
}
|
612
|
+
if (lib.uniffi_pubkymobile_checksum_func_decrypt_recovery_file() != 59688.toShort()) {
|
613
|
+
throw RuntimeException("UniFFI API checksum mismatch: try cleaning and rebuilding your project")
|
614
|
+
}
|
615
|
+
if (lib.uniffi_pubkymobile_checksum_func_delete_file() != 57905.toShort()) {
|
616
|
+
throw RuntimeException("UniFFI API checksum mismatch: try cleaning and rebuilding your project")
|
617
|
+
}
|
618
|
+
if (lib.uniffi_pubkymobile_checksum_func_generate_secret_key() != 63116.toShort()) {
|
619
|
+
throw RuntimeException("UniFFI API checksum mismatch: try cleaning and rebuilding your project")
|
620
|
+
}
|
621
|
+
if (lib.uniffi_pubkymobile_checksum_func_get() != 21596.toShort()) {
|
622
|
+
throw RuntimeException("UniFFI API checksum mismatch: try cleaning and rebuilding your project")
|
623
|
+
}
|
624
|
+
if (lib.uniffi_pubkymobile_checksum_func_get_public_key_from_secret_key() != 23603.toShort()) {
|
571
625
|
throw RuntimeException("UniFFI API checksum mismatch: try cleaning and rebuilding your project")
|
572
626
|
}
|
573
627
|
if (lib.uniffi_pubkymobile_checksum_func_list() != 8522.toShort()) {
|
@@ -582,7 +636,10 @@ private fun uniffiCheckApiChecksums(lib: _UniFFILib) {
|
|
582
636
|
if (lib.uniffi_pubkymobile_checksum_func_publish_https() != 14705.toShort()) {
|
583
637
|
throw RuntimeException("UniFFI API checksum mismatch: try cleaning and rebuilding your project")
|
584
638
|
}
|
585
|
-
if (lib.uniffi_pubkymobile_checksum_func_put() !=
|
639
|
+
if (lib.uniffi_pubkymobile_checksum_func_put() != 51107.toShort()) {
|
640
|
+
throw RuntimeException("UniFFI API checksum mismatch: try cleaning and rebuilding your project")
|
641
|
+
}
|
642
|
+
if (lib.uniffi_pubkymobile_checksum_func_remove_event_listener() != 6794.toShort()) {
|
586
643
|
throw RuntimeException("UniFFI API checksum mismatch: try cleaning and rebuilding your project")
|
587
644
|
}
|
588
645
|
if (lib.uniffi_pubkymobile_checksum_func_resolve() != 18303.toShort()) {
|
@@ -591,62 +648,27 @@ private fun uniffiCheckApiChecksums(lib: _UniFFILib) {
|
|
591
648
|
if (lib.uniffi_pubkymobile_checksum_func_resolve_https() != 34593.toShort()) {
|
592
649
|
throw RuntimeException("UniFFI API checksum mismatch: try cleaning and rebuilding your project")
|
593
650
|
}
|
594
|
-
if (lib.
|
651
|
+
if (lib.uniffi_pubkymobile_checksum_func_session() != 65177.toShort()) {
|
595
652
|
throw RuntimeException("UniFFI API checksum mismatch: try cleaning and rebuilding your project")
|
596
653
|
}
|
597
|
-
if (lib.
|
654
|
+
if (lib.uniffi_pubkymobile_checksum_func_set_event_listener() != 19468.toShort()) {
|
598
655
|
throw RuntimeException("UniFFI API checksum mismatch: try cleaning and rebuilding your project")
|
599
656
|
}
|
600
|
-
if (lib.
|
657
|
+
if (lib.uniffi_pubkymobile_checksum_func_sign_in() != 21006.toShort()) {
|
601
658
|
throw RuntimeException("UniFFI API checksum mismatch: try cleaning and rebuilding your project")
|
602
659
|
}
|
603
|
-
|
604
|
-
|
605
|
-
// Async support
|
606
|
-
// Async return type handlers
|
607
|
-
|
608
|
-
internal const val UNIFFI_RUST_FUTURE_POLL_READY = 0.toShort()
|
609
|
-
internal const val UNIFFI_RUST_FUTURE_POLL_MAYBE_READY = 1.toShort()
|
610
|
-
|
611
|
-
internal val uniffiContinuationHandleMap = UniFfiHandleMap<CancellableContinuation<Short>>()
|
612
|
-
|
613
|
-
// FFI type for Rust future continuations
|
614
|
-
internal object uniffiRustFutureContinuationCallback: UniFffiRustFutureContinuationCallbackType {
|
615
|
-
override fun callback(continuationHandle: USize, pollResult: Short) {
|
616
|
-
uniffiContinuationHandleMap.remove(continuationHandle)?.resume(pollResult)
|
660
|
+
if (lib.uniffi_pubkymobile_checksum_func_sign_out() != 59116.toShort()) {
|
661
|
+
throw RuntimeException("UniFFI API checksum mismatch: try cleaning and rebuilding your project")
|
617
662
|
}
|
618
|
-
|
619
|
-
|
620
|
-
lib.ffi_pubkymobile_rust_future_continuation_callback_set(this)
|
663
|
+
if (lib.uniffi_pubkymobile_checksum_func_sign_up() != 58756.toShort()) {
|
664
|
+
throw RuntimeException("UniFFI API checksum mismatch: try cleaning and rebuilding your project")
|
621
665
|
}
|
622
|
-
|
623
|
-
|
624
|
-
internal suspend fun<T, F, E: Exception> uniffiRustCallAsync(
|
625
|
-
rustFuture: Pointer,
|
626
|
-
pollFunc: (Pointer, USize) -> Unit,
|
627
|
-
completeFunc: (Pointer, RustCallStatus) -> F,
|
628
|
-
freeFunc: (Pointer) -> Unit,
|
629
|
-
liftFunc: (F) -> T,
|
630
|
-
errorHandler: CallStatusErrorHandler<E>
|
631
|
-
): T {
|
632
|
-
try {
|
633
|
-
do {
|
634
|
-
val pollResult = suspendCancellableCoroutine<Short> { continuation ->
|
635
|
-
pollFunc(
|
636
|
-
rustFuture,
|
637
|
-
uniffiContinuationHandleMap.insert(continuation)
|
638
|
-
)
|
639
|
-
}
|
640
|
-
} while (pollResult != UNIFFI_RUST_FUTURE_POLL_READY);
|
641
|
-
|
642
|
-
return liftFunc(
|
643
|
-
rustCallWithError(errorHandler, { status -> completeFunc(rustFuture, status) })
|
644
|
-
)
|
645
|
-
} finally {
|
646
|
-
freeFunc(rustFuture)
|
666
|
+
if (lib.uniffi_pubkymobile_checksum_method_eventlistener_on_event_occurred() != 39865.toShort()) {
|
667
|
+
throw RuntimeException("UniFFI API checksum mismatch: try cleaning and rebuilding your project")
|
647
668
|
}
|
648
669
|
}
|
649
670
|
|
671
|
+
// Async support
|
650
672
|
|
651
673
|
// Public interface members begin here.
|
652
674
|
|
@@ -706,6 +728,384 @@ public object FfiConverterString: FfiConverter<String, RustBuffer.ByValue> {
|
|
706
728
|
}
|
707
729
|
|
708
730
|
|
731
|
+
// Interface implemented by anything that can contain an object reference.
|
732
|
+
//
|
733
|
+
// Such types expose a `destroy()` method that must be called to cleanly
|
734
|
+
// dispose of the contained objects. Failure to call this method may result
|
735
|
+
// in memory leaks.
|
736
|
+
//
|
737
|
+
// The easiest way to ensure this method is called is to use the `.use`
|
738
|
+
// helper method to execute a block and destroy the object at the end.
|
739
|
+
interface Disposable {
|
740
|
+
fun destroy()
|
741
|
+
companion object {
|
742
|
+
fun destroy(vararg args: Any?) {
|
743
|
+
args.filterIsInstance<Disposable>()
|
744
|
+
.forEach(Disposable::destroy)
|
745
|
+
}
|
746
|
+
}
|
747
|
+
}
|
748
|
+
|
749
|
+
inline fun <T : Disposable?, R> T.use(block: (T) -> R) =
|
750
|
+
try {
|
751
|
+
block(this)
|
752
|
+
} finally {
|
753
|
+
try {
|
754
|
+
// N.B. our implementation is on the nullable type `Disposable?`.
|
755
|
+
this?.destroy()
|
756
|
+
} catch (e: Throwable) {
|
757
|
+
// swallow
|
758
|
+
}
|
759
|
+
}
|
760
|
+
|
761
|
+
// The base class for all UniFFI Object types.
|
762
|
+
//
|
763
|
+
// This class provides core operations for working with the Rust `Arc<T>` pointer to
|
764
|
+
// the live Rust struct on the other side of the FFI.
|
765
|
+
//
|
766
|
+
// There's some subtlety here, because we have to be careful not to operate on a Rust
|
767
|
+
// struct after it has been dropped, and because we must expose a public API for freeing
|
768
|
+
// the Kotlin wrapper object in lieu of reliable finalizers. The core requirements are:
|
769
|
+
//
|
770
|
+
// * Each `FFIObject` instance holds an opaque pointer to the underlying Rust struct.
|
771
|
+
// Method calls need to read this pointer from the object's state and pass it in to
|
772
|
+
// the Rust FFI.
|
773
|
+
//
|
774
|
+
// * When an `FFIObject` is no longer needed, its pointer should be passed to a
|
775
|
+
// special destructor function provided by the Rust FFI, which will drop the
|
776
|
+
// underlying Rust struct.
|
777
|
+
//
|
778
|
+
// * Given an `FFIObject` instance, calling code is expected to call the special
|
779
|
+
// `destroy` method in order to free it after use, either by calling it explicitly
|
780
|
+
// or by using a higher-level helper like the `use` method. Failing to do so will
|
781
|
+
// leak the underlying Rust struct.
|
782
|
+
//
|
783
|
+
// * We can't assume that calling code will do the right thing, and must be prepared
|
784
|
+
// to handle Kotlin method calls executing concurrently with or even after a call to
|
785
|
+
// `destroy`, and to handle multiple (possibly concurrent!) calls to `destroy`.
|
786
|
+
//
|
787
|
+
// * We must never allow Rust code to operate on the underlying Rust struct after
|
788
|
+
// the destructor has been called, and must never call the destructor more than once.
|
789
|
+
// Doing so may trigger memory unsafety.
|
790
|
+
//
|
791
|
+
// If we try to implement this with mutual exclusion on access to the pointer, there is the
|
792
|
+
// possibility of a race between a method call and a concurrent call to `destroy`:
|
793
|
+
//
|
794
|
+
// * Thread A starts a method call, reads the value of the pointer, but is interrupted
|
795
|
+
// before it can pass the pointer over the FFI to Rust.
|
796
|
+
// * Thread B calls `destroy` and frees the underlying Rust struct.
|
797
|
+
// * Thread A resumes, passing the already-read pointer value to Rust and triggering
|
798
|
+
// a use-after-free.
|
799
|
+
//
|
800
|
+
// One possible solution would be to use a `ReadWriteLock`, with each method call taking
|
801
|
+
// a read lock (and thus allowed to run concurrently) and the special `destroy` method
|
802
|
+
// taking a write lock (and thus blocking on live method calls). However, we aim not to
|
803
|
+
// generate methods with any hidden blocking semantics, and a `destroy` method that might
|
804
|
+
// block if called incorrectly seems to meet that bar.
|
805
|
+
//
|
806
|
+
// So, we achieve our goals by giving each `FFIObject` an associated `AtomicLong` counter to track
|
807
|
+
// the number of in-flight method calls, and an `AtomicBoolean` flag to indicate whether `destroy`
|
808
|
+
// has been called. These are updated according to the following rules:
|
809
|
+
//
|
810
|
+
// * The initial value of the counter is 1, indicating a live object with no in-flight calls.
|
811
|
+
// The initial value for the flag is false.
|
812
|
+
//
|
813
|
+
// * At the start of each method call, we atomically check the counter.
|
814
|
+
// If it is 0 then the underlying Rust struct has already been destroyed and the call is aborted.
|
815
|
+
// If it is nonzero them we atomically increment it by 1 and proceed with the method call.
|
816
|
+
//
|
817
|
+
// * At the end of each method call, we atomically decrement and check the counter.
|
818
|
+
// If it has reached zero then we destroy the underlying Rust struct.
|
819
|
+
//
|
820
|
+
// * When `destroy` is called, we atomically flip the flag from false to true.
|
821
|
+
// If the flag was already true we silently fail.
|
822
|
+
// Otherwise we atomically decrement and check the counter.
|
823
|
+
// If it has reached zero then we destroy the underlying Rust struct.
|
824
|
+
//
|
825
|
+
// Astute readers may observe that this all sounds very similar to the way that Rust's `Arc<T>` works,
|
826
|
+
// and indeed it is, with the addition of a flag to guard against multiple calls to `destroy`.
|
827
|
+
//
|
828
|
+
// The overall effect is that the underlying Rust struct is destroyed only when `destroy` has been
|
829
|
+
// called *and* all in-flight method calls have completed, avoiding violating any of the expectations
|
830
|
+
// of the underlying Rust code.
|
831
|
+
//
|
832
|
+
// In the future we may be able to replace some of this with automatic finalization logic, such as using
|
833
|
+
// the new "Cleaner" functionaility in Java 9. The above scheme has been designed to work even if `destroy` is
|
834
|
+
// invoked by garbage-collection machinery rather than by calling code (which by the way, it's apparently also
|
835
|
+
// possible for the JVM to finalize an object while there is an in-flight call to one of its methods [1],
|
836
|
+
// so there would still be some complexity here).
|
837
|
+
//
|
838
|
+
// Sigh...all of this for want of a robust finalization mechanism.
|
839
|
+
//
|
840
|
+
// [1] https://stackoverflow.com/questions/24376768/can-java-finalize-an-object-when-it-is-still-in-scope/24380219
|
841
|
+
//
|
842
|
+
abstract class FFIObject(
|
843
|
+
protected val pointer: Pointer
|
844
|
+
): Disposable, AutoCloseable {
|
845
|
+
|
846
|
+
private val wasDestroyed = AtomicBoolean(false)
|
847
|
+
private val callCounter = AtomicLong(1)
|
848
|
+
|
849
|
+
open protected fun freeRustArcPtr() {
|
850
|
+
// To be overridden in subclasses.
|
851
|
+
}
|
852
|
+
|
853
|
+
override fun destroy() {
|
854
|
+
// Only allow a single call to this method.
|
855
|
+
// TODO: maybe we should log a warning if called more than once?
|
856
|
+
if (this.wasDestroyed.compareAndSet(false, true)) {
|
857
|
+
// This decrement always matches the initial count of 1 given at creation time.
|
858
|
+
if (this.callCounter.decrementAndGet() == 0L) {
|
859
|
+
this.freeRustArcPtr()
|
860
|
+
}
|
861
|
+
}
|
862
|
+
}
|
863
|
+
|
864
|
+
@Synchronized
|
865
|
+
override fun close() {
|
866
|
+
this.destroy()
|
867
|
+
}
|
868
|
+
|
869
|
+
internal inline fun <R> callWithPointer(block: (ptr: Pointer) -> R): R {
|
870
|
+
// Check and increment the call counter, to keep the object alive.
|
871
|
+
// This needs a compare-and-set retry loop in case of concurrent updates.
|
872
|
+
do {
|
873
|
+
val c = this.callCounter.get()
|
874
|
+
if (c == 0L) {
|
875
|
+
throw IllegalStateException("${this.javaClass.simpleName} object has already been destroyed")
|
876
|
+
}
|
877
|
+
if (c == Long.MAX_VALUE) {
|
878
|
+
throw IllegalStateException("${this.javaClass.simpleName} call counter would overflow")
|
879
|
+
}
|
880
|
+
} while (! this.callCounter.compareAndSet(c, c + 1L))
|
881
|
+
// Now we can safely do the method call without the pointer being freed concurrently.
|
882
|
+
try {
|
883
|
+
return block(this.pointer)
|
884
|
+
} finally {
|
885
|
+
// This decrement always matches the increment we performed above.
|
886
|
+
if (this.callCounter.decrementAndGet() == 0L) {
|
887
|
+
this.freeRustArcPtr()
|
888
|
+
}
|
889
|
+
}
|
890
|
+
}
|
891
|
+
}
|
892
|
+
|
893
|
+
public interface EventNotifierInterface {
|
894
|
+
|
895
|
+
companion object
|
896
|
+
}
|
897
|
+
|
898
|
+
class EventNotifier(
|
899
|
+
pointer: Pointer
|
900
|
+
) : FFIObject(pointer), EventNotifierInterface {
|
901
|
+
|
902
|
+
/**
|
903
|
+
* Disconnect the object from the underlying Rust object.
|
904
|
+
*
|
905
|
+
* It can be called more than once, but once called, interacting with the object
|
906
|
+
* causes an `IllegalStateException`.
|
907
|
+
*
|
908
|
+
* Clients **must** call this method once done with the object, or cause a memory leak.
|
909
|
+
*/
|
910
|
+
override protected fun freeRustArcPtr() {
|
911
|
+
rustCall() { status ->
|
912
|
+
_UniFFILib.INSTANCE.uniffi_pubkymobile_fn_free_eventnotifier(this.pointer, status)
|
913
|
+
}
|
914
|
+
}
|
915
|
+
|
916
|
+
|
917
|
+
|
918
|
+
|
919
|
+
companion object
|
920
|
+
|
921
|
+
}
|
922
|
+
|
923
|
+
public object FfiConverterTypeEventNotifier: FfiConverter<EventNotifier, Pointer> {
|
924
|
+
override fun lower(value: EventNotifier): Pointer = value.callWithPointer { it }
|
925
|
+
|
926
|
+
override fun lift(value: Pointer): EventNotifier {
|
927
|
+
return EventNotifier(value)
|
928
|
+
}
|
929
|
+
|
930
|
+
override fun read(buf: ByteBuffer): EventNotifier {
|
931
|
+
// The Rust code always writes pointers as 8 bytes, and will
|
932
|
+
// fail to compile if they don't fit.
|
933
|
+
return lift(Pointer(buf.getLong()))
|
934
|
+
}
|
935
|
+
|
936
|
+
override fun allocationSize(value: EventNotifier) = 8
|
937
|
+
|
938
|
+
override fun write(value: EventNotifier, buf: ByteBuffer) {
|
939
|
+
// The Rust code always expects pointers written as 8 bytes,
|
940
|
+
// and will fail to compile if they don't fit.
|
941
|
+
buf.putLong(Pointer.nativeValue(lower(value)))
|
942
|
+
}
|
943
|
+
}
|
944
|
+
|
945
|
+
|
946
|
+
|
947
|
+
|
948
|
+
internal typealias Handle = Long
|
949
|
+
internal class ConcurrentHandleMap<T>(
|
950
|
+
private val leftMap: MutableMap<Handle, T> = mutableMapOf(),
|
951
|
+
private val rightMap: MutableMap<T, Handle> = mutableMapOf()
|
952
|
+
) {
|
953
|
+
private val lock = java.util.concurrent.locks.ReentrantLock()
|
954
|
+
private val currentHandle = AtomicLong(0L)
|
955
|
+
private val stride = 1L
|
956
|
+
|
957
|
+
fun insert(obj: T): Handle =
|
958
|
+
lock.withLock {
|
959
|
+
rightMap[obj] ?:
|
960
|
+
currentHandle.getAndAdd(stride)
|
961
|
+
.also { handle ->
|
962
|
+
leftMap[handle] = obj
|
963
|
+
rightMap[obj] = handle
|
964
|
+
}
|
965
|
+
}
|
966
|
+
|
967
|
+
fun get(handle: Handle) = lock.withLock {
|
968
|
+
leftMap[handle]
|
969
|
+
}
|
970
|
+
|
971
|
+
fun delete(handle: Handle) {
|
972
|
+
this.remove(handle)
|
973
|
+
}
|
974
|
+
|
975
|
+
fun remove(handle: Handle): T? =
|
976
|
+
lock.withLock {
|
977
|
+
leftMap.remove(handle)?.let { obj ->
|
978
|
+
rightMap.remove(obj)
|
979
|
+
obj
|
980
|
+
}
|
981
|
+
}
|
982
|
+
}
|
983
|
+
|
984
|
+
interface ForeignCallback : com.sun.jna.Callback {
|
985
|
+
public fun callback(handle: Handle, method: Int, argsData: Pointer, argsLen: Int, outBuf: RustBufferByReference): Int
|
986
|
+
}
|
987
|
+
|
988
|
+
// Magic number for the Rust proxy to call using the same mechanism as every other method,
|
989
|
+
// to free the callback once it's dropped by Rust.
|
990
|
+
internal const val IDX_CALLBACK_FREE = 0
|
991
|
+
// Callback return codes
|
992
|
+
internal const val UNIFFI_CALLBACK_SUCCESS = 0
|
993
|
+
internal const val UNIFFI_CALLBACK_ERROR = 1
|
994
|
+
internal const val UNIFFI_CALLBACK_UNEXPECTED_ERROR = 2
|
995
|
+
|
996
|
+
public abstract class FfiConverterCallbackInterface<CallbackInterface>(
|
997
|
+
protected val foreignCallback: ForeignCallback
|
998
|
+
): FfiConverter<CallbackInterface, Handle> {
|
999
|
+
private val handleMap = ConcurrentHandleMap<CallbackInterface>()
|
1000
|
+
|
1001
|
+
// Registers the foreign callback with the Rust side.
|
1002
|
+
// This method is generated for each callback interface.
|
1003
|
+
internal abstract fun register(lib: _UniFFILib)
|
1004
|
+
|
1005
|
+
fun drop(handle: Handle): RustBuffer.ByValue {
|
1006
|
+
return handleMap.remove(handle).let { RustBuffer.ByValue() }
|
1007
|
+
}
|
1008
|
+
|
1009
|
+
override fun lift(value: Handle): CallbackInterface {
|
1010
|
+
return handleMap.get(value) ?: throw InternalException("No callback in handlemap; this is a Uniffi bug")
|
1011
|
+
}
|
1012
|
+
|
1013
|
+
override fun read(buf: ByteBuffer) = lift(buf.getLong())
|
1014
|
+
|
1015
|
+
override fun lower(value: CallbackInterface) =
|
1016
|
+
handleMap.insert(value).also {
|
1017
|
+
assert(handleMap.get(it) === value) { "Handle map is not returning the object we just placed there. This is a bug in the HandleMap." }
|
1018
|
+
}
|
1019
|
+
|
1020
|
+
override fun allocationSize(value: CallbackInterface) = 8
|
1021
|
+
|
1022
|
+
override fun write(value: CallbackInterface, buf: ByteBuffer) {
|
1023
|
+
buf.putLong(lower(value))
|
1024
|
+
}
|
1025
|
+
}
|
1026
|
+
|
1027
|
+
// Declaration and FfiConverters for EventListener Callback Interface
|
1028
|
+
|
1029
|
+
public interface EventListener {
|
1030
|
+
fun `onEventOccurred`(`eventData`: String)
|
1031
|
+
|
1032
|
+
companion object
|
1033
|
+
}
|
1034
|
+
|
1035
|
+
// The ForeignCallback that is passed to Rust.
|
1036
|
+
internal class ForeignCallbackTypeEventListener : ForeignCallback {
|
1037
|
+
@Suppress("TooGenericExceptionCaught")
|
1038
|
+
override fun callback(handle: Handle, method: Int, argsData: Pointer, argsLen: Int, outBuf: RustBufferByReference): Int {
|
1039
|
+
val cb = FfiConverterTypeEventListener.lift(handle)
|
1040
|
+
return when (method) {
|
1041
|
+
IDX_CALLBACK_FREE -> {
|
1042
|
+
FfiConverterTypeEventListener.drop(handle)
|
1043
|
+
// Successful return
|
1044
|
+
// See docs of ForeignCallback in `uniffi_core/src/ffi/foreigncallbacks.rs`
|
1045
|
+
UNIFFI_CALLBACK_SUCCESS
|
1046
|
+
}
|
1047
|
+
1 -> {
|
1048
|
+
// Call the method, write to outBuf and return a status code
|
1049
|
+
// See docs of ForeignCallback in `uniffi_core/src/ffi/foreigncallbacks.rs` for info
|
1050
|
+
try {
|
1051
|
+
this.`invokeOnEventOccurred`(cb, argsData, argsLen, outBuf)
|
1052
|
+
} catch (e: Throwable) {
|
1053
|
+
// Unexpected error
|
1054
|
+
try {
|
1055
|
+
// Try to serialize the error into a string
|
1056
|
+
outBuf.setValue(FfiConverterString.lower(e.toString()))
|
1057
|
+
} catch (e: Throwable) {
|
1058
|
+
// If that fails, then it's time to give up and just return
|
1059
|
+
}
|
1060
|
+
UNIFFI_CALLBACK_UNEXPECTED_ERROR
|
1061
|
+
}
|
1062
|
+
}
|
1063
|
+
|
1064
|
+
else -> {
|
1065
|
+
// An unexpected error happened.
|
1066
|
+
// See docs of ForeignCallback in `uniffi_core/src/ffi/foreigncallbacks.rs`
|
1067
|
+
try {
|
1068
|
+
// Try to serialize the error into a string
|
1069
|
+
outBuf.setValue(FfiConverterString.lower("Invalid Callback index"))
|
1070
|
+
} catch (e: Throwable) {
|
1071
|
+
// If that fails, then it's time to give up and just return
|
1072
|
+
}
|
1073
|
+
UNIFFI_CALLBACK_UNEXPECTED_ERROR
|
1074
|
+
}
|
1075
|
+
}
|
1076
|
+
}
|
1077
|
+
|
1078
|
+
|
1079
|
+
@Suppress("UNUSED_PARAMETER")
|
1080
|
+
private fun `invokeOnEventOccurred`(kotlinCallbackInterface: EventListener, argsData: Pointer, argsLen: Int, outBuf: RustBufferByReference): Int {
|
1081
|
+
val argsBuf = argsData.getByteBuffer(0, argsLen.toLong()).also {
|
1082
|
+
it.order(ByteOrder.BIG_ENDIAN)
|
1083
|
+
}
|
1084
|
+
fun makeCall() : Int {
|
1085
|
+
kotlinCallbackInterface.`onEventOccurred`(
|
1086
|
+
FfiConverterString.read(argsBuf)
|
1087
|
+
)
|
1088
|
+
return UNIFFI_CALLBACK_SUCCESS
|
1089
|
+
}
|
1090
|
+
fun makeCallAndHandleError() : Int = makeCall()
|
1091
|
+
|
1092
|
+
return makeCallAndHandleError()
|
1093
|
+
}
|
1094
|
+
|
1095
|
+
}
|
1096
|
+
|
1097
|
+
// The ffiConverter which transforms the Callbacks in to Handles to pass to Rust.
|
1098
|
+
public object FfiConverterTypeEventListener: FfiConverterCallbackInterface<EventListener>(
|
1099
|
+
foreignCallback = ForeignCallbackTypeEventListener()
|
1100
|
+
) {
|
1101
|
+
override fun register(lib: _UniFFILib) {
|
1102
|
+
rustCall() { status ->
|
1103
|
+
lib.uniffi_pubkymobile_fn_init_callback_eventlistener(this.foreignCallback, status)
|
1104
|
+
}
|
1105
|
+
}
|
1106
|
+
}
|
1107
|
+
|
1108
|
+
|
709
1109
|
|
710
1110
|
|
711
1111
|
public object FfiConverterSequenceString: FfiConverterRustBuffer<List<String>> {
|
@@ -730,32 +1130,62 @@ public object FfiConverterSequenceString: FfiConverterRustBuffer<List<String>> {
|
|
730
1130
|
}
|
731
1131
|
}
|
732
1132
|
|
1133
|
+
fun `auth`(`url`: String, `secretKey`: String): List<String> {
|
1134
|
+
return FfiConverterSequenceString.lift(
|
1135
|
+
rustCall() { _status ->
|
1136
|
+
_UniFFILib.INSTANCE.uniffi_pubkymobile_fn_func_auth(FfiConverterString.lower(`url`),FfiConverterString.lower(`secretKey`),_status)
|
1137
|
+
})
|
1138
|
+
}
|
1139
|
+
|
733
1140
|
|
1141
|
+
fun `createRecoveryFile`(`secretKey`: String, `passphrase`: String): List<String> {
|
1142
|
+
return FfiConverterSequenceString.lift(
|
1143
|
+
rustCall() { _status ->
|
1144
|
+
_UniFFILib.INSTANCE.uniffi_pubkymobile_fn_func_create_recovery_file(FfiConverterString.lower(`secretKey`),FfiConverterString.lower(`passphrase`),_status)
|
1145
|
+
})
|
1146
|
+
}
|
734
1147
|
|
735
1148
|
|
1149
|
+
fun `decryptRecoveryFile`(`recoveryFile`: String, `passphrase`: String): List<String> {
|
1150
|
+
return FfiConverterSequenceString.lift(
|
1151
|
+
rustCall() { _status ->
|
1152
|
+
_UniFFILib.INSTANCE.uniffi_pubkymobile_fn_func_decrypt_recovery_file(FfiConverterString.lower(`recoveryFile`),FfiConverterString.lower(`passphrase`),_status)
|
1153
|
+
})
|
1154
|
+
}
|
736
1155
|
|
737
|
-
|
1156
|
+
|
1157
|
+
fun `deleteFile`(`url`: String): List<String> {
|
738
1158
|
return FfiConverterSequenceString.lift(
|
739
1159
|
rustCall() { _status ->
|
740
|
-
_UniFFILib.INSTANCE.
|
1160
|
+
_UniFFILib.INSTANCE.uniffi_pubkymobile_fn_func_delete_file(FfiConverterString.lower(`url`),_status)
|
741
1161
|
})
|
742
1162
|
}
|
743
1163
|
|
744
1164
|
|
745
|
-
|
746
|
-
|
747
|
-
|
748
|
-
|
749
|
-
|
750
|
-
{ future, continuation -> _UniFFILib.INSTANCE.ffi_pubkymobile_rust_future_complete_rust_buffer(future, continuation) },
|
751
|
-
{ future -> _UniFFILib.INSTANCE.ffi_pubkymobile_rust_future_free_rust_buffer(future) },
|
752
|
-
// lift function
|
753
|
-
{ FfiConverterSequenceString.lift(it) },
|
754
|
-
// Error FFI converter
|
755
|
-
NullCallStatusErrorHandler,
|
756
|
-
)
|
1165
|
+
fun `generateSecretKey`(): List<String> {
|
1166
|
+
return FfiConverterSequenceString.lift(
|
1167
|
+
rustCall() { _status ->
|
1168
|
+
_UniFFILib.INSTANCE.uniffi_pubkymobile_fn_func_generate_secret_key(_status)
|
1169
|
+
})
|
757
1170
|
}
|
758
1171
|
|
1172
|
+
|
1173
|
+
fun `get`(`url`: String): List<String> {
|
1174
|
+
return FfiConverterSequenceString.lift(
|
1175
|
+
rustCall() { _status ->
|
1176
|
+
_UniFFILib.INSTANCE.uniffi_pubkymobile_fn_func_get(FfiConverterString.lower(`url`),_status)
|
1177
|
+
})
|
1178
|
+
}
|
1179
|
+
|
1180
|
+
|
1181
|
+
fun `getPublicKeyFromSecretKey`(`secretKey`: String): List<String> {
|
1182
|
+
return FfiConverterSequenceString.lift(
|
1183
|
+
rustCall() { _status ->
|
1184
|
+
_UniFFILib.INSTANCE.uniffi_pubkymobile_fn_func_get_public_key_from_secret_key(FfiConverterString.lower(`secretKey`),_status)
|
1185
|
+
})
|
1186
|
+
}
|
1187
|
+
|
1188
|
+
|
759
1189
|
fun `list`(`url`: String): List<String> {
|
760
1190
|
return FfiConverterSequenceString.lift(
|
761
1191
|
rustCall() { _status ->
|
@@ -788,20 +1218,22 @@ fun `publishHttps`(`recordName`: String, `target`: String, `secretKey`: String):
|
|
788
1218
|
}
|
789
1219
|
|
790
1220
|
|
791
|
-
|
792
|
-
|
793
|
-
|
794
|
-
|
795
|
-
|
796
|
-
|
797
|
-
|
798
|
-
|
799
|
-
|
800
|
-
|
801
|
-
|
802
|
-
)
|
1221
|
+
fun `put`(`url`: String, `content`: String): List<String> {
|
1222
|
+
return FfiConverterSequenceString.lift(
|
1223
|
+
rustCall() { _status ->
|
1224
|
+
_UniFFILib.INSTANCE.uniffi_pubkymobile_fn_func_put(FfiConverterString.lower(`url`),FfiConverterString.lower(`content`),_status)
|
1225
|
+
})
|
1226
|
+
}
|
1227
|
+
|
1228
|
+
|
1229
|
+
fun `removeEventListener`() =
|
1230
|
+
|
1231
|
+
rustCall() { _status ->
|
1232
|
+
_UniFFILib.INSTANCE.uniffi_pubkymobile_fn_func_remove_event_listener(_status)
|
803
1233
|
}
|
804
1234
|
|
1235
|
+
|
1236
|
+
|
805
1237
|
fun `resolve`(`publicKey`: String): List<String> {
|
806
1238
|
return FfiConverterSequenceString.lift(
|
807
1239
|
rustCall() { _status ->
|
@@ -818,45 +1250,43 @@ fun `resolveHttps`(`publicKey`: String): List<String> {
|
|
818
1250
|
}
|
819
1251
|
|
820
1252
|
|
821
|
-
|
822
|
-
|
823
|
-
|
824
|
-
|
825
|
-
|
826
|
-
{ future, continuation -> _UniFFILib.INSTANCE.ffi_pubkymobile_rust_future_complete_rust_buffer(future, continuation) },
|
827
|
-
{ future -> _UniFFILib.INSTANCE.ffi_pubkymobile_rust_future_free_rust_buffer(future) },
|
828
|
-
// lift function
|
829
|
-
{ FfiConverterSequenceString.lift(it) },
|
830
|
-
// Error FFI converter
|
831
|
-
NullCallStatusErrorHandler,
|
832
|
-
)
|
833
|
-
}
|
834
|
-
|
835
|
-
@Suppress("ASSIGNED_BUT_NEVER_ACCESSED_VARIABLE")
|
836
|
-
suspend fun `signOut`(`secretKey`: String) : List<String> {
|
837
|
-
return uniffiRustCallAsync(
|
838
|
-
_UniFFILib.INSTANCE.uniffi_pubkymobile_fn_func_sign_out(FfiConverterString.lower(`secretKey`),),
|
839
|
-
{ future, continuation -> _UniFFILib.INSTANCE.ffi_pubkymobile_rust_future_poll_rust_buffer(future, continuation) },
|
840
|
-
{ future, continuation -> _UniFFILib.INSTANCE.ffi_pubkymobile_rust_future_complete_rust_buffer(future, continuation) },
|
841
|
-
{ future -> _UniFFILib.INSTANCE.ffi_pubkymobile_rust_future_free_rust_buffer(future) },
|
842
|
-
// lift function
|
843
|
-
{ FfiConverterSequenceString.lift(it) },
|
844
|
-
// Error FFI converter
|
845
|
-
NullCallStatusErrorHandler,
|
846
|
-
)
|
847
|
-
}
|
848
|
-
|
849
|
-
@Suppress("ASSIGNED_BUT_NEVER_ACCESSED_VARIABLE")
|
850
|
-
suspend fun `signUp`(`secretKey`: String, `homeserver`: String) : List<String> {
|
851
|
-
return uniffiRustCallAsync(
|
852
|
-
_UniFFILib.INSTANCE.uniffi_pubkymobile_fn_func_sign_up(FfiConverterString.lower(`secretKey`),FfiConverterString.lower(`homeserver`),),
|
853
|
-
{ future, continuation -> _UniFFILib.INSTANCE.ffi_pubkymobile_rust_future_poll_rust_buffer(future, continuation) },
|
854
|
-
{ future, continuation -> _UniFFILib.INSTANCE.ffi_pubkymobile_rust_future_complete_rust_buffer(future, continuation) },
|
855
|
-
{ future -> _UniFFILib.INSTANCE.ffi_pubkymobile_rust_future_free_rust_buffer(future) },
|
856
|
-
// lift function
|
857
|
-
{ FfiConverterSequenceString.lift(it) },
|
858
|
-
// Error FFI converter
|
859
|
-
NullCallStatusErrorHandler,
|
860
|
-
)
|
1253
|
+
fun `session`(`pubky`: String): List<String> {
|
1254
|
+
return FfiConverterSequenceString.lift(
|
1255
|
+
rustCall() { _status ->
|
1256
|
+
_UniFFILib.INSTANCE.uniffi_pubkymobile_fn_func_session(FfiConverterString.lower(`pubky`),_status)
|
1257
|
+
})
|
861
1258
|
}
|
862
1259
|
|
1260
|
+
|
1261
|
+
fun `setEventListener`(`listener`: EventListener) =
|
1262
|
+
|
1263
|
+
rustCall() { _status ->
|
1264
|
+
_UniFFILib.INSTANCE.uniffi_pubkymobile_fn_func_set_event_listener(FfiConverterTypeEventListener.lower(`listener`),_status)
|
1265
|
+
}
|
1266
|
+
|
1267
|
+
|
1268
|
+
|
1269
|
+
fun `signIn`(`secretKey`: String): List<String> {
|
1270
|
+
return FfiConverterSequenceString.lift(
|
1271
|
+
rustCall() { _status ->
|
1272
|
+
_UniFFILib.INSTANCE.uniffi_pubkymobile_fn_func_sign_in(FfiConverterString.lower(`secretKey`),_status)
|
1273
|
+
})
|
1274
|
+
}
|
1275
|
+
|
1276
|
+
|
1277
|
+
fun `signOut`(`secretKey`: String): List<String> {
|
1278
|
+
return FfiConverterSequenceString.lift(
|
1279
|
+
rustCall() { _status ->
|
1280
|
+
_UniFFILib.INSTANCE.uniffi_pubkymobile_fn_func_sign_out(FfiConverterString.lower(`secretKey`),_status)
|
1281
|
+
})
|
1282
|
+
}
|
1283
|
+
|
1284
|
+
|
1285
|
+
fun `signUp`(`secretKey`: String, `homeserver`: String): List<String> {
|
1286
|
+
return FfiConverterSequenceString.lift(
|
1287
|
+
rustCall() { _status ->
|
1288
|
+
_UniFFILib.INSTANCE.uniffi_pubkymobile_fn_func_sign_up(FfiConverterString.lower(`secretKey`),FfiConverterString.lower(`homeserver`),_status)
|
1289
|
+
})
|
1290
|
+
}
|
1291
|
+
|
1292
|
+
|