diff --git a/build.gradle b/build.gradle
index abaff405..8ce18ad2 100644
--- a/build.gradle
+++ b/build.gradle
@@ -11,5 +11,7 @@ buildscript {
plugins {
alias(libs.plugins.androidLibrary) apply false
alias(libs.plugins.kotlin.jvm) apply false
+ alias(libs.plugins.kotlinMultiplatform) apply false
+ alias(libs.plugins.android.lint) apply false
}
diff --git a/examples/privmx-snippets/build.gradle b/examples/privmx-snippets/build.gradle
deleted file mode 100644
index 1e5c68bf..00000000
--- a/examples/privmx-snippets/build.gradle
+++ /dev/null
@@ -1,22 +0,0 @@
-plugins {
- alias(libs.plugins.kotlin.jvm)
- alias(libs.plugins.kotlinPluginSerialization)
- alias(libs.plugins.privmx.install.native)
-}
-
-group = "com.simplito.privmx-endpoint-snippets"
-version = "2.2.0"
-
-kotlin {
- jvmToolchain(21)
-}
-
-//privmxEndpointInstallJni {
-// version = project.version
-//}
-
-dependencies {
- implementation(project(":privmx-endpoint-extra"))
- implementation(libs.gson)
- implementation(libs.kotlinx.serialization.json)
-}
\ No newline at end of file
diff --git a/examples/privmx-snippets/build.gradle.kts b/examples/privmx-snippets/build.gradle.kts
new file mode 100644
index 00000000..ef754007
--- /dev/null
+++ b/examples/privmx-snippets/build.gradle.kts
@@ -0,0 +1,42 @@
+plugins {
+ alias(libs.plugins.kotlinMultiplatform)
+ alias(libs.plugins.kotlinPluginSerialization)
+ alias(libs.plugins.androidLibrary)
+ alias(libs.plugins.privmx.install.native)
+}
+
+group = "com.simplito.privmx-endpoint-snippets"
+version = "2.2.0"
+
+android {
+ namespace = "com.simplito.privmx.endpoint.snippets"
+ compileSdk = 36
+
+ defaultConfig {
+ minSdk = 24
+ }
+}
+
+kotlin {
+ jvm()
+ androidTarget {
+ publishLibraryVariants("release", "debug")
+ }
+
+ sourceSets {
+ commonMain {
+ dependencies {
+ implementation(project(":privmx-endpoint-extra"))
+ implementation(libs.kotlinx.serialization.json)
+ }
+ }
+
+ androidMain {
+ dependencies {
+ implementation(project(":privmx-endpoint-streams:android"))
+ implementation(project(":privmx-endpoint-android"))
+ implementation(libs.privmx.endpoint.webrtc)
+ }
+ }
+ }
+}
diff --git a/examples/privmx-snippets/src/androidMain/AndroidManifest.xml b/examples/privmx-snippets/src/androidMain/AndroidManifest.xml
new file mode 100644
index 00000000..a5918e68
--- /dev/null
+++ b/examples/privmx-snippets/src/androidMain/AndroidManifest.xml
@@ -0,0 +1,4 @@
+
+
+
+
\ No newline at end of file
diff --git a/examples/privmx-snippets/src/androidMain/kotlin/com/example/shared/Platform.android.kt b/examples/privmx-snippets/src/androidMain/kotlin/com/example/shared/Platform.android.kt
new file mode 100644
index 00000000..94195656
--- /dev/null
+++ b/examples/privmx-snippets/src/androidMain/kotlin/com/example/shared/Platform.android.kt
@@ -0,0 +1,3 @@
+package com.example.shared
+
+actual fun platform() = "Android"
\ No newline at end of file
diff --git a/examples/privmx-snippets/src/androidMain/kotlin/com/simplito/privmx/endpoint/snippets/Stacks/JavaKotlin/streams/Overview.kt b/examples/privmx-snippets/src/androidMain/kotlin/com/simplito/privmx/endpoint/snippets/Stacks/JavaKotlin/streams/Overview.kt
new file mode 100644
index 00000000..6eacc15e
--- /dev/null
+++ b/examples/privmx-snippets/src/androidMain/kotlin/com/simplito/privmx/endpoint/snippets/Stacks/JavaKotlin/streams/Overview.kt
@@ -0,0 +1,59 @@
+package com.simplito.privmx.endpoint.snippets.Stacks.JavaKotlin.streams
+
+import Stacks.JavaKotlin.endpointSession
+import Stacks.JavaKotlin.stores.StorePublicMeta
+import android.content.Context
+import com.simplito.java.privmx_endpoint.model.stream.StreamRoom
+import com.simplito.java.privmx_endpoint.modules.stream.StreamApi
+import com.simplito.java.privmx_endpoint.modules.stream.StreamApiLow
+import com.simplito.java.privmx_endpoint_extra.lib.PrivmxEndpoint
+import com.simplito.java.privmx_endpoint_extra.lib.PrivmxEndpointContainer
+import com.simplito.java.privmx_endpoint_extra.model.Modules
+import org.webrtc.EglBase
+import org.webrtc.PeerConnection
+
+lateinit var streamApiLow: StreamApiLow
+lateinit var streamApi: StreamApi
+
+data class StreamRoomItem(
+ val streamRoom: StreamRoom,
+ val decodedPrivateMeta: String,
+ val decodedPublicMeta: StreamRoomPublicMeta
+)
+
+fun initializeStreamApi(context: Context) {
+ // Create EGL context (required for video rendering)
+ val eglBase: EglBase = EglBase.create()
+ val appContext = context.applicationContext
+
+ // Initialize low-level dependency
+ streamApiLow = endpointSession.initializeStreamApiLow()
+
+ // Create commonMain streaming API
+ streamApi = StreamApi(appContext, eglBase, streamApiLow)
+}
+
+
+fun observingConnectionState() {
+ val streamRoomId = "STREAM_ROOM_ID"
+
+ streamApi.setConnectionStateObserver(streamRoomId) { state ->
+ when (state) {
+ PeerConnection.IceConnectionState.CONNECTED -> {
+ // handle connected
+ }
+
+ PeerConnection.IceConnectionState.DISCONNECTED -> {
+ // handle disconnected
+ }
+
+ PeerConnection.IceConnectionState.FAILED -> {
+ // handle failed
+ }
+
+ else -> {
+ // handle other WebRTC states
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/examples/privmx-snippets/src/androidMain/kotlin/com/simplito/privmx/endpoint/snippets/Stacks/JavaKotlin/streams/StreamRooms.kt b/examples/privmx-snippets/src/androidMain/kotlin/com/simplito/privmx/endpoint/snippets/Stacks/JavaKotlin/streams/StreamRooms.kt
new file mode 100644
index 00000000..80ac8513
--- /dev/null
+++ b/examples/privmx-snippets/src/androidMain/kotlin/com/simplito/privmx/endpoint/snippets/Stacks/JavaKotlin/streams/StreamRooms.kt
@@ -0,0 +1,235 @@
+package com.simplito.privmx.endpoint.snippets.Stacks.JavaKotlin.streams
+
+import Stacks.JavaKotlin.contextId
+import Stacks.JavaKotlin.user1Id
+import Stacks.JavaKotlin.user1PublicKey
+import Stacks.JavaKotlin.user2Id
+import Stacks.JavaKotlin.user2PublicKey
+import com.simplito.java.privmx_endpoint.model.PagingList
+import com.simplito.java.privmx_endpoint.model.UserWithPubKey
+import com.simplito.java.privmx_endpoint.model.stream.StreamRoom
+import com.simplito.java.privmx_endpoint_extra.model.SortOrder
+import kotlinx.serialization.Serializable
+import kotlinx.serialization.encodeToString
+import kotlinx.serialization.json.Json
+
+
+// START: Creating Stream Rooms
+
+fun createStreamRoomBasic() {
+ val users = listOf(
+ UserWithPubKey(user1Id, user1PublicKey),
+ UserWithPubKey(user2Id, user2PublicKey)
+ )
+ val managers = mutableListOf(
+ UserWithPubKey(user1Id, user1PublicKey)
+ )
+
+ val roomId = streamApi.createStreamRoom(
+ contextId,
+ users,
+ managers,
+ ByteArray(0), // publicMeta
+ ByteArray(0), // privateMeta,
+ null // policies
+ )
+}
+
+fun createStreamRoomWithName() {
+ val users: List = listOf(
+ UserWithPubKey(user1Id, user1PublicKey),
+ UserWithPubKey(user2Id, user2PublicKey)
+ )
+ val managers: List = listOf(
+ UserWithPubKey(user1Id, user1PublicKey)
+ )
+ val publicMeta = ByteArray(0)
+ val streamRoomNameAsPrivateMeta = "New stream room"
+
+ val streamRoomId = streamApi.createStreamRoom(
+ contextId,
+ users,
+ managers,
+ publicMeta,
+ streamRoomNameAsPrivateMeta.encodeToByteArray(),
+ null
+ )
+}
+
+@Suppress("UnsafeOptInUsageError")
+@Serializable
+data class StreamRoomPublicMeta(
+ val title: String,
+ val type: String,
+ val scheduledAt: String
+)
+
+fun createStreamRoomWithPublicMeta() {
+ val users: List = listOf(
+ UserWithPubKey(user1Id, user1PublicKey),
+ UserWithPubKey(user2Id, user2PublicKey)
+ )
+ val managers: List = listOf(
+ UserWithPubKey(user1Id, user1PublicKey)
+ )
+ val publicMeta = StreamRoomPublicMeta(
+ title = "Daily meeting #34",
+ type = "meeting",
+ scheduledAt = "2026-02-23T10:00:00Z",
+ )
+ val privateMeta = ByteArray(0)
+
+ val roomId: String = streamApi.createStreamRoom(
+ contextId,
+ users,
+ managers,
+ Json.encodeToString(publicMeta).encodeToByteArray(),
+ privateMeta,
+ null // policies
+ )
+}
+
+// END: Creating Stream Rooms
+
+
+// START: Getting Stream Rooms
+
+fun getMostRecentStreamRooms() {
+ val startIndex = 0L
+ val pageSize = 100L
+
+ val streamRoomsPagingList: PagingList = streamApi.listStreamRooms(
+ contextId,
+ startIndex,
+ pageSize,
+ SortOrder.DESC,
+ null, // lastId
+ null, // sortBy
+ null // queryAsJson
+ )
+
+ val streamRooms = streamRoomsPagingList.readItems.map {
+ StreamRoomItem(
+ it,
+ it.privateMeta.decodeToString(),
+ Json.decodeFromString(it.publicMeta.decodeToString())
+ )
+ }
+}
+
+fun getMostOldestStreamRooms() {
+ val startIndex = 0L
+ val pageSize = 100L
+
+ val streamRoomsPagingList: PagingList = streamApi.listStreamRooms(
+ contextId,
+ startIndex,
+ pageSize,
+ SortOrder.ASC,
+ null, // lastId
+ null, // sortBy
+ null // queryAsJson
+ )
+
+ val streamRooms = streamRoomsPagingList.readItems.map {
+ StreamRoomItem(
+ it,
+ it.privateMeta.decodeToString(),
+ Json.decodeFromString(it.publicMeta.decodeToString())
+ )
+ }
+}
+
+fun getStreamRoomById() {
+ val streamRoomId = "STREAM_ROOM_ID"
+
+ val streamRoomItem = streamApi.getStreamRoom(streamRoomId).let {
+ StreamRoomItem(
+ it,
+ it.privateMeta.decodeToString(),
+ Json.decodeFromString(it.publicMeta.decodeToString())
+ )
+ }
+}
+
+// END: Getting Stream Rooms
+
+
+// START: Managing Stream Rooms
+
+fun renamingStreamRoom() {
+ val streamRoomId = "STREAM_ROOM_ID"
+ val streamRoom: StreamRoom = streamApi.getStreamRoom(streamRoomId)
+
+ val users = streamRoom.users.map { userId ->
+ // Your application must provide a way
+ // to get user's public key from their userId
+ UserWithPubKey(userId, "USER_PUBLIC_KEY")
+ }
+
+ val managers = streamRoom.managers.map { userId ->
+ UserWithPubKey(userId, "USER_PUBLIC_KEY")
+ }
+
+ val newStreamRoomNameAsPrivateMeta = "New stream room name"
+
+ streamApi.updateStreamRoom(
+ streamRoomId,
+ users,
+ managers,
+ streamRoom.publicMeta,
+ newStreamRoomNameAsPrivateMeta.encodeToByteArray(),
+ streamRoom.version,
+ false, // force
+ false, // forceGenerateNewKey
+ null // policies
+ )
+}
+
+fun removingUserFromStreamRoom() {
+ val streamRoomId = "STREAM_ROOM_ID"
+ val streamRoom: StreamRoom = streamApi.getStreamRoom(streamRoomId)
+ val userToRemove = "USERID_TO_REMOVE"
+ val newUsers = streamRoom
+ .users
+ .filter {
+ it != userToRemove
+ }.map { userId ->
+ // Your application must provide a way,
+ // to get user's public key from their userId.
+ UserWithPubKey(
+ userId,
+ "USER_PUBLIC_KEY"
+ )
+ }
+ val managers = streamRoom
+ .managers
+ .map { userId ->
+ // Your application must provide a way,
+ // to get user's public key from their userId.
+ UserWithPubKey(
+ userId,
+ "USER_PUBLIC_KEY"
+ )
+ }
+
+ streamApi.updateStreamRoom(
+ streamRoomId,
+ newUsers,
+ managers,
+ streamRoom.publicMeta,
+ streamRoom.privateMeta,
+ streamRoom.version,
+ false, // force
+ false, //forceGenerateNewKey
+ null // policies
+ )
+}
+
+fun deletingStreamRoom() {
+ val streamRoomId = "STREAM_ROOM_ID"
+
+ streamApi.deleteStreamRoom(streamRoomId)
+}
+
+// END: Managing Stream Rooms
\ No newline at end of file
diff --git a/examples/privmx-snippets/src/androidMain/kotlin/com/simplito/privmx/endpoint/snippets/Stacks/JavaKotlin/streams/Streams.kt b/examples/privmx-snippets/src/androidMain/kotlin/com/simplito/privmx/endpoint/snippets/Stacks/JavaKotlin/streams/Streams.kt
new file mode 100644
index 00000000..8ca8e08f
--- /dev/null
+++ b/examples/privmx-snippets/src/androidMain/kotlin/com/simplito/privmx/endpoint/snippets/Stacks/JavaKotlin/streams/Streams.kt
@@ -0,0 +1,221 @@
+package com.simplito.privmx.endpoint.snippets.Stacks.JavaKotlin.streams
+
+import com.simplito.java.privmx_endpoint.model.stream.StreamHandle
+import com.simplito.java.privmx_endpoint.model.stream.StreamInfo
+import com.simplito.java.privmx_endpoint.model.stream.StreamPublishResult
+import com.simplito.java.privmx_endpoint.model.stream.StreamSubscription
+import com.simplito.java.privmx_endpoint.modules.stream.TrackObserver
+import org.webrtc.AudioTrack
+import org.webrtc.MediaStreamTrack
+import org.webrtc.VideoTrack
+
+
+// START: Join and Leave Stream Room
+
+fun joiningStreamRoom() {
+ val streamRoomId = "STREAM_ROOM_ID"
+
+ streamApi.joinStreamRoom(streamRoomId)
+}
+
+fun leavingStreamRoom() {
+ val streamRoomId = "STREAM_ROOM_ID"
+
+ streamApi.leaveStreamRoom(streamRoomId)
+}
+
+// END: Join and Leave Stream Room
+
+
+// START: Create Stream
+
+fun creatingStream(): StreamHandle {
+ val streamRoomId = "STREAM_ROOM_ID"
+
+ // 1. Create tracks
+ // Create sources from device input
+ val videoSource = streamApi.trackFactory.createVideoSource(false /* isScreenCast */)
+ val audioSource = streamApi.trackFactory.createAudioSource()
+
+ // Wrap in tracks
+ val videoTrack = streamApi.trackFactory.createVideoTrack("video0", videoSource)
+ val audioTrack = streamApi.trackFactory.createAudioTrack("audio0", audioSource)
+
+
+ // 2. Create stream and attach tracks
+ val streamHandle: StreamHandle = streamApi.createStream(streamRoomId)
+
+ streamApi.addTrack(streamHandle, videoTrack)
+ streamApi.addTrack(streamHandle, audioTrack)
+
+ return streamHandle
+}
+// END: Create Stream
+
+
+// START: Publish Stream
+
+fun publishingStream(streamHandle: StreamHandle) {
+ val streamPublishResult: StreamPublishResult = streamApi.publishStream(streamHandle)
+}
+
+// END: Publish Stream
+
+
+// START: Modify Streams
+
+fun updatingStream(streamHandle: StreamHandle) {
+ val streamPublishResult: StreamPublishResult = streamApi.updateStream(streamHandle)
+}
+
+// END: Modify Streams
+
+
+// START: Unpublish Stream
+
+fun unpublishingStream(streamHandle: StreamHandle) {
+ streamApi.unpublishStream(streamHandle)
+}
+
+// END: Unpublish Stream
+
+
+// START: Manage Media Tracks
+
+fun createVideoTrack(): VideoTrack {
+ // Create source from device input
+ val videoSource = streamApi.trackFactory.createVideoSource(false /* isScreenCast */)
+
+ // Wrap in track
+ return streamApi.trackFactory.createVideoTrack("video0", videoSource)
+}
+
+fun createAudioTrack(): AudioTrack {
+ // Create source from device input
+ val audioSource = streamApi.trackFactory.createAudioSource()
+
+ // Wrap in track
+ return streamApi.trackFactory.createAudioTrack("audio0", audioSource)
+}
+
+fun removeAudioTrack(streamHandle: StreamHandle, audioTrack: MediaStreamTrack) {
+ streamApi.removeTrack(streamHandle, audioTrack)
+}
+
+fun removeVideoTrack(streamHandle: StreamHandle, videoTrack: VideoTrack) {
+ streamApi.removeTrack(streamHandle, videoTrack)
+}
+
+fun observingAllTracks() {
+ val streamRoomId = "STREAM_ROOM_ID"
+
+ streamApi.setTrackObserver(streamRoomId, object : TrackObserver {
+ override fun OnRemoteTrack(streamId: String?, track: MediaStreamTrack?) {
+ // handle remote tracks
+ }
+ })
+}
+
+fun observingSpecificStreamTracks() {
+ val streamRoomId = "STREAM_ROOM_ID"
+ val streamId = "STREAM_ID"
+
+ streamApi.setTrackObserver(
+ streamRoomId, object : TrackObserver {
+ override fun OnRemoteTrack(streamId: String?, track: MediaStreamTrack?) {
+ // handle remote tracks
+ }
+ },
+ streamId
+ )
+}
+// END: Manage Media Tracks
+
+
+// START: List Streams
+
+fun listStreams() {
+ val streamRoomId = "STREAM_ROOM_ID"
+
+ val streams: List = streamApi.listStreams(streamRoomId)
+}
+
+// END: List Streams
+
+
+// START: Manage Remote Streams Subscriptions
+
+fun subscribingToAllRemoteStreams() : List {
+ val streamRoomId = "STREAM_ROOM_ID"
+
+ val subscriptions: List = streamApi.listStreams(streamRoomId)
+ .flatMap { stream ->
+ stream.tracks.map { track ->
+ StreamSubscription(
+ stream.id,
+ track.mid
+ )
+ }
+ }.toList()
+
+ streamApi.subscribeToRemoteStreams(streamRoomId, subscriptions)
+
+ return subscriptions
+}
+
+fun subscribingToUserRemoteStreams(): List {
+ val streamRoomId = "STREAM_ROOM_ID"
+ val userId = "USER_ID"
+
+ val subscriptions: List = streamApi.listStreams(streamRoomId)
+ .filter { it.userId == userId }
+ .flatMap { stream ->
+ stream.tracks.map { track ->
+ StreamSubscription(
+ stream.id,
+ track.mid
+ )
+ }
+ }.toList()
+
+ streamApi.subscribeToRemoteStreams(streamRoomId, subscriptions)
+
+ return subscriptions
+}
+
+fun unsubscribingFromRemoteStreams(subscriptionsToRemove: List) {
+ val streamRoomId = "STREAM_ROOM_ID"
+
+ // unsubscribe from previously tracked remote subscriptions
+ streamApi.unsubscribeFromRemoteStreams(streamRoomId, subscriptionsToRemove)
+}
+
+fun modifySRemoteSubscriptions(previousSubscriptions: List) {
+ val streamRoomId = "STREAM_ROOM_ID"
+
+ // Fetch the latest available streams and map them to subscriptions
+ val currentSubscriptions: List = streamApi.listStreams(streamRoomId)
+ .flatMap { stream ->
+ stream.tracks.map { track ->
+ StreamSubscription(
+ stream.id,
+ track.mid
+ )
+ }
+ }.toList()
+
+ // Calculate differences between previous and current subscriptions
+ // new tracks that were not subscribed before
+ val subscriptionsToAdd = currentSubscriptions - previousSubscriptions;
+
+ // tracks that are no longer available
+ val subscriptionsToRemove = previousSubscriptions - currentSubscriptions;
+
+ streamApi.modifyRemoteStreamsSubscriptions(
+ streamRoomId,
+ subscriptionsToAdd,
+ subscriptionsToRemove
+ )
+}
+
+// END: Manage Remote Streams Subscriptions
diff --git a/examples/privmx-snippets/src/main/java/Stacks/JavaKotlin/PrivMXEndpointJava.java b/examples/privmx-snippets/src/commonMain/java/Stacks/JavaKotlin/PrivMXEndpointJava.java
similarity index 100%
rename from examples/privmx-snippets/src/main/java/Stacks/JavaKotlin/PrivMXEndpointJava.java
rename to examples/privmx-snippets/src/commonMain/java/Stacks/JavaKotlin/PrivMXEndpointJava.java
diff --git a/examples/privmx-snippets/src/main/java/Tools/Inboxes/UsingInboxes/InboxEntries.java b/examples/privmx-snippets/src/commonMain/java/Tools/Inboxes/UsingInboxes/InboxEntries.java
similarity index 100%
rename from examples/privmx-snippets/src/main/java/Tools/Inboxes/UsingInboxes/InboxEntries.java
rename to examples/privmx-snippets/src/commonMain/java/Tools/Inboxes/UsingInboxes/InboxEntries.java
diff --git a/examples/privmx-snippets/src/main/java/Tools/Inboxes/UsingInboxes/InboxUpdates.java b/examples/privmx-snippets/src/commonMain/java/Tools/Inboxes/UsingInboxes/InboxUpdates.java
similarity index 95%
rename from examples/privmx-snippets/src/main/java/Tools/Inboxes/UsingInboxes/InboxUpdates.java
rename to examples/privmx-snippets/src/commonMain/java/Tools/Inboxes/UsingInboxes/InboxUpdates.java
index cc0e9ca6..e37affef 100644
--- a/examples/privmx-snippets/src/main/java/Tools/Inboxes/UsingInboxes/InboxUpdates.java
+++ b/examples/privmx-snippets/src/commonMain/java/Tools/Inboxes/UsingInboxes/InboxUpdates.java
@@ -42,4 +42,8 @@ void handlingInboxEvents() {
endpointSession.unregisterCallbacks(inboxCallbacksGroup, entryCallbacksGroup);
}
+
+ public static void main(String[] args){
+ System.out.println("COS");
+ }
}
\ No newline at end of file
diff --git a/examples/privmx-snippets/src/main/java/Tools/Inboxes/UsingInboxes/WorkingWithInboxes.java b/examples/privmx-snippets/src/commonMain/java/Tools/Inboxes/UsingInboxes/WorkingWithInboxes.java
similarity index 100%
rename from examples/privmx-snippets/src/main/java/Tools/Inboxes/UsingInboxes/WorkingWithInboxes.java
rename to examples/privmx-snippets/src/commonMain/java/Tools/Inboxes/UsingInboxes/WorkingWithInboxes.java
diff --git a/examples/privmx-snippets/src/main/java/Tools/Kvdbs/UsingKvdbs/ListeningForChanges.java b/examples/privmx-snippets/src/commonMain/java/Tools/Kvdbs/UsingKvdbs/ListeningForChanges.java
similarity index 100%
rename from examples/privmx-snippets/src/main/java/Tools/Kvdbs/UsingKvdbs/ListeningForChanges.java
rename to examples/privmx-snippets/src/commonMain/java/Tools/Kvdbs/UsingKvdbs/ListeningForChanges.java
diff --git a/examples/privmx-snippets/src/main/java/Tools/Kvdbs/UsingKvdbs/ManagingEntries.java b/examples/privmx-snippets/src/commonMain/java/Tools/Kvdbs/UsingKvdbs/ManagingEntries.java
similarity index 100%
rename from examples/privmx-snippets/src/main/java/Tools/Kvdbs/UsingKvdbs/ManagingEntries.java
rename to examples/privmx-snippets/src/commonMain/java/Tools/Kvdbs/UsingKvdbs/ManagingEntries.java
diff --git a/examples/privmx-snippets/src/main/java/Tools/Kvdbs/UsingKvdbs/ManagingKvdbs.java b/examples/privmx-snippets/src/commonMain/java/Tools/Kvdbs/UsingKvdbs/ManagingKvdbs.java
similarity index 100%
rename from examples/privmx-snippets/src/main/java/Tools/Kvdbs/UsingKvdbs/ManagingKvdbs.java
rename to examples/privmx-snippets/src/commonMain/java/Tools/Kvdbs/UsingKvdbs/ManagingKvdbs.java
diff --git a/examples/privmx-snippets/src/main/java/Tools/Stores/UsingStores/DownloadingFiles.java b/examples/privmx-snippets/src/commonMain/java/Tools/Stores/UsingStores/DownloadingFiles.java
similarity index 100%
rename from examples/privmx-snippets/src/main/java/Tools/Stores/UsingStores/DownloadingFiles.java
rename to examples/privmx-snippets/src/commonMain/java/Tools/Stores/UsingStores/DownloadingFiles.java
diff --git a/examples/privmx-snippets/src/main/java/Tools/Stores/UsingStores/ManagingFiles.java b/examples/privmx-snippets/src/commonMain/java/Tools/Stores/UsingStores/ManagingFiles.java
similarity index 100%
rename from examples/privmx-snippets/src/main/java/Tools/Stores/UsingStores/ManagingFiles.java
rename to examples/privmx-snippets/src/commonMain/java/Tools/Stores/UsingStores/ManagingFiles.java
diff --git a/examples/privmx-snippets/src/main/java/Tools/Stores/UsingStores/ManagingStores.java b/examples/privmx-snippets/src/commonMain/java/Tools/Stores/UsingStores/ManagingStores.java
similarity index 100%
rename from examples/privmx-snippets/src/main/java/Tools/Stores/UsingStores/ManagingStores.java
rename to examples/privmx-snippets/src/commonMain/java/Tools/Stores/UsingStores/ManagingStores.java
diff --git a/examples/privmx-snippets/src/main/java/Tools/Stores/UsingStores/StoreEventsInRealTime.java b/examples/privmx-snippets/src/commonMain/java/Tools/Stores/UsingStores/StoreEventsInRealTime.java
similarity index 100%
rename from examples/privmx-snippets/src/main/java/Tools/Stores/UsingStores/StoreEventsInRealTime.java
rename to examples/privmx-snippets/src/commonMain/java/Tools/Stores/UsingStores/StoreEventsInRealTime.java
diff --git a/examples/privmx-snippets/src/main/java/Tools/Stores/UsingStores/UploadingFiles.java b/examples/privmx-snippets/src/commonMain/java/Tools/Stores/UsingStores/UploadingFiles.java
similarity index 100%
rename from examples/privmx-snippets/src/main/java/Tools/Stores/UsingStores/UploadingFiles.java
rename to examples/privmx-snippets/src/commonMain/java/Tools/Stores/UsingStores/UploadingFiles.java
diff --git a/examples/privmx-snippets/src/main/java/Tools/Threads/UsingThreads/ManagingMessages.java b/examples/privmx-snippets/src/commonMain/java/Tools/Threads/UsingThreads/ManagingMessages.java
similarity index 100%
rename from examples/privmx-snippets/src/main/java/Tools/Threads/UsingThreads/ManagingMessages.java
rename to examples/privmx-snippets/src/commonMain/java/Tools/Threads/UsingThreads/ManagingMessages.java
diff --git a/examples/privmx-snippets/src/main/java/Tools/Threads/UsingThreads/ManagingThreads.java b/examples/privmx-snippets/src/commonMain/java/Tools/Threads/UsingThreads/ManagingThreads.java
similarity index 100%
rename from examples/privmx-snippets/src/main/java/Tools/Threads/UsingThreads/ManagingThreads.java
rename to examples/privmx-snippets/src/commonMain/java/Tools/Threads/UsingThreads/ManagingThreads.java
diff --git a/examples/privmx-snippets/src/main/java/Tools/Threads/UsingThreads/RealTimeCommunication.java b/examples/privmx-snippets/src/commonMain/java/Tools/Threads/UsingThreads/RealTimeCommunication.java
similarity index 100%
rename from examples/privmx-snippets/src/main/java/Tools/Threads/UsingThreads/RealTimeCommunication.java
rename to examples/privmx-snippets/src/commonMain/java/Tools/Threads/UsingThreads/RealTimeCommunication.java
diff --git a/examples/privmx-snippets/src/main/java/Tools/Threads/UsingThreads/SendingMessages.java b/examples/privmx-snippets/src/commonMain/java/Tools/Threads/UsingThreads/SendingMessages.java
similarity index 100%
rename from examples/privmx-snippets/src/main/java/Tools/Threads/UsingThreads/SendingMessages.java
rename to examples/privmx-snippets/src/commonMain/java/Tools/Threads/UsingThreads/SendingMessages.java
diff --git a/examples/privmx-snippets/src/commonMain/jniLibs/arm64/libPocoCrypto.dylib b/examples/privmx-snippets/src/commonMain/jniLibs/arm64/libPocoCrypto.dylib
new file mode 100755
index 00000000..51c1055c
Binary files /dev/null and b/examples/privmx-snippets/src/commonMain/jniLibs/arm64/libPocoCrypto.dylib differ
diff --git a/examples/privmx-snippets/src/commonMain/jniLibs/arm64/libPocoFoundation.dylib b/examples/privmx-snippets/src/commonMain/jniLibs/arm64/libPocoFoundation.dylib
new file mode 100755
index 00000000..6ec6e878
Binary files /dev/null and b/examples/privmx-snippets/src/commonMain/jniLibs/arm64/libPocoFoundation.dylib differ
diff --git a/examples/privmx-snippets/src/commonMain/jniLibs/arm64/libPocoJSON.dylib b/examples/privmx-snippets/src/commonMain/jniLibs/arm64/libPocoJSON.dylib
new file mode 100755
index 00000000..86172e50
Binary files /dev/null and b/examples/privmx-snippets/src/commonMain/jniLibs/arm64/libPocoJSON.dylib differ
diff --git a/examples/privmx-snippets/src/commonMain/jniLibs/arm64/libPocoNet.dylib b/examples/privmx-snippets/src/commonMain/jniLibs/arm64/libPocoNet.dylib
new file mode 100755
index 00000000..33320918
Binary files /dev/null and b/examples/privmx-snippets/src/commonMain/jniLibs/arm64/libPocoNet.dylib differ
diff --git a/examples/privmx-snippets/src/commonMain/jniLibs/arm64/libPocoNetSSL.dylib b/examples/privmx-snippets/src/commonMain/jniLibs/arm64/libPocoNetSSL.dylib
new file mode 100755
index 00000000..0d1a4687
Binary files /dev/null and b/examples/privmx-snippets/src/commonMain/jniLibs/arm64/libPocoNetSSL.dylib differ
diff --git a/examples/privmx-snippets/src/commonMain/jniLibs/arm64/libPocoUtil.dylib b/examples/privmx-snippets/src/commonMain/jniLibs/arm64/libPocoUtil.dylib
new file mode 100755
index 00000000..01ea437c
Binary files /dev/null and b/examples/privmx-snippets/src/commonMain/jniLibs/arm64/libPocoUtil.dylib differ
diff --git a/examples/privmx-snippets/src/commonMain/jniLibs/arm64/libPocoXML.dylib b/examples/privmx-snippets/src/commonMain/jniLibs/arm64/libPocoXML.dylib
new file mode 100755
index 00000000..9af6b892
Binary files /dev/null and b/examples/privmx-snippets/src/commonMain/jniLibs/arm64/libPocoXML.dylib differ
diff --git a/examples/privmx-snippets/src/commonMain/jniLibs/arm64/libPson.dylib b/examples/privmx-snippets/src/commonMain/jniLibs/arm64/libPson.dylib
new file mode 100755
index 00000000..fc3bee88
Binary files /dev/null and b/examples/privmx-snippets/src/commonMain/jniLibs/arm64/libPson.dylib differ
diff --git a/examples/privmx-snippets/src/commonMain/jniLibs/arm64/libcrypto.dylib b/examples/privmx-snippets/src/commonMain/jniLibs/arm64/libcrypto.dylib
new file mode 100755
index 00000000..23741ff1
Binary files /dev/null and b/examples/privmx-snippets/src/commonMain/jniLibs/arm64/libcrypto.dylib differ
diff --git a/examples/privmx-snippets/src/commonMain/jniLibs/arm64/libgmp.dylib b/examples/privmx-snippets/src/commonMain/jniLibs/arm64/libgmp.dylib
new file mode 100755
index 00000000..e5436a9b
Binary files /dev/null and b/examples/privmx-snippets/src/commonMain/jniLibs/arm64/libgmp.dylib differ
diff --git a/examples/privmx-snippets/src/commonMain/jniLibs/arm64/libprivmx-endpoint-java.dylib b/examples/privmx-snippets/src/commonMain/jniLibs/arm64/libprivmx-endpoint-java.dylib
new file mode 100755
index 00000000..71eb177f
Binary files /dev/null and b/examples/privmx-snippets/src/commonMain/jniLibs/arm64/libprivmx-endpoint-java.dylib differ
diff --git a/examples/privmx-snippets/src/commonMain/jniLibs/arm64/libprivmx.dylib b/examples/privmx-snippets/src/commonMain/jniLibs/arm64/libprivmx.dylib
new file mode 100755
index 00000000..633272d8
Binary files /dev/null and b/examples/privmx-snippets/src/commonMain/jniLibs/arm64/libprivmx.dylib differ
diff --git a/examples/privmx-snippets/src/commonMain/jniLibs/arm64/libprivmxendpointcore.dylib b/examples/privmx-snippets/src/commonMain/jniLibs/arm64/libprivmxendpointcore.dylib
new file mode 100755
index 00000000..9aa053b3
Binary files /dev/null and b/examples/privmx-snippets/src/commonMain/jniLibs/arm64/libprivmxendpointcore.dylib differ
diff --git a/examples/privmx-snippets/src/commonMain/jniLibs/arm64/libprivmxendpointcrypto.dylib b/examples/privmx-snippets/src/commonMain/jniLibs/arm64/libprivmxendpointcrypto.dylib
new file mode 100755
index 00000000..60e23628
Binary files /dev/null and b/examples/privmx-snippets/src/commonMain/jniLibs/arm64/libprivmxendpointcrypto.dylib differ
diff --git a/examples/privmx-snippets/src/commonMain/jniLibs/arm64/libprivmxendpointevent.dylib b/examples/privmx-snippets/src/commonMain/jniLibs/arm64/libprivmxendpointevent.dylib
new file mode 100755
index 00000000..2f83b93d
Binary files /dev/null and b/examples/privmx-snippets/src/commonMain/jniLibs/arm64/libprivmxendpointevent.dylib differ
diff --git a/examples/privmx-snippets/src/commonMain/jniLibs/arm64/libprivmxendpointinbox.dylib b/examples/privmx-snippets/src/commonMain/jniLibs/arm64/libprivmxendpointinbox.dylib
new file mode 100755
index 00000000..ad3d401f
Binary files /dev/null and b/examples/privmx-snippets/src/commonMain/jniLibs/arm64/libprivmxendpointinbox.dylib differ
diff --git a/examples/privmx-snippets/src/commonMain/jniLibs/arm64/libprivmxendpointkvdb.dylib b/examples/privmx-snippets/src/commonMain/jniLibs/arm64/libprivmxendpointkvdb.dylib
new file mode 100755
index 00000000..e70927b8
Binary files /dev/null and b/examples/privmx-snippets/src/commonMain/jniLibs/arm64/libprivmxendpointkvdb.dylib differ
diff --git a/examples/privmx-snippets/src/commonMain/jniLibs/arm64/libprivmxendpointstore.dylib b/examples/privmx-snippets/src/commonMain/jniLibs/arm64/libprivmxendpointstore.dylib
new file mode 100755
index 00000000..0b94aab1
Binary files /dev/null and b/examples/privmx-snippets/src/commonMain/jniLibs/arm64/libprivmxendpointstore.dylib differ
diff --git a/examples/privmx-snippets/src/commonMain/jniLibs/arm64/libprivmxendpointthread.dylib b/examples/privmx-snippets/src/commonMain/jniLibs/arm64/libprivmxendpointthread.dylib
new file mode 100755
index 00000000..1373ea3e
Binary files /dev/null and b/examples/privmx-snippets/src/commonMain/jniLibs/arm64/libprivmxendpointthread.dylib differ
diff --git a/examples/privmx-snippets/src/commonMain/jniLibs/arm64/libssl.dylib b/examples/privmx-snippets/src/commonMain/jniLibs/arm64/libssl.dylib
new file mode 100755
index 00000000..2ffe5902
Binary files /dev/null and b/examples/privmx-snippets/src/commonMain/jniLibs/arm64/libssl.dylib differ
diff --git a/examples/privmx-snippets/src/main/kotlin/Projects/PrivMXEndpoint/Certificates.kt b/examples/privmx-snippets/src/commonMain/kotlin/Projects/PrivMXEndpoint/Certificates.kt
similarity index 100%
rename from examples/privmx-snippets/src/main/kotlin/Projects/PrivMXEndpoint/Certificates.kt
rename to examples/privmx-snippets/src/commonMain/kotlin/Projects/PrivMXEndpoint/Certificates.kt
diff --git a/examples/privmx-snippets/src/main/kotlin/Stacks/JavaKotlin/CustomFieldsAndQueries.kt b/examples/privmx-snippets/src/commonMain/kotlin/Stacks/JavaKotlin/CustomFieldsAndQueries.kt
similarity index 100%
rename from examples/privmx-snippets/src/main/kotlin/Stacks/JavaKotlin/CustomFieldsAndQueries.kt
rename to examples/privmx-snippets/src/commonMain/kotlin/Stacks/JavaKotlin/CustomFieldsAndQueries.kt
diff --git a/examples/privmx-snippets/src/main/kotlin/Stacks/JavaKotlin/PolicyBuilders.kt b/examples/privmx-snippets/src/commonMain/kotlin/Stacks/JavaKotlin/PolicyBuilders.kt
similarity index 100%
rename from examples/privmx-snippets/src/main/kotlin/Stacks/JavaKotlin/PolicyBuilders.kt
rename to examples/privmx-snippets/src/commonMain/kotlin/Stacks/JavaKotlin/PolicyBuilders.kt
diff --git a/examples/privmx-snippets/src/main/kotlin/Stacks/JavaKotlin/PrivMXEndpointJava.kt b/examples/privmx-snippets/src/commonMain/kotlin/Stacks/JavaKotlin/PrivMXEndpointJava.kt
similarity index 100%
rename from examples/privmx-snippets/src/main/kotlin/Stacks/JavaKotlin/PrivMXEndpointJava.kt
rename to examples/privmx-snippets/src/commonMain/kotlin/Stacks/JavaKotlin/PrivMXEndpointJava.kt
diff --git a/examples/privmx-snippets/src/main/kotlin/Stacks/JavaKotlin/events/CustomEvents.kt b/examples/privmx-snippets/src/commonMain/kotlin/Stacks/JavaKotlin/events/CustomEvents.kt
similarity index 100%
rename from examples/privmx-snippets/src/main/kotlin/Stacks/JavaKotlin/events/CustomEvents.kt
rename to examples/privmx-snippets/src/commonMain/kotlin/Stacks/JavaKotlin/events/CustomEvents.kt
diff --git a/examples/privmx-snippets/src/main/kotlin/Stacks/JavaKotlin/events/HandlingEvents.kt b/examples/privmx-snippets/src/commonMain/kotlin/Stacks/JavaKotlin/events/HandlingEvents.kt
similarity index 74%
rename from examples/privmx-snippets/src/main/kotlin/Stacks/JavaKotlin/events/HandlingEvents.kt
rename to examples/privmx-snippets/src/commonMain/kotlin/Stacks/JavaKotlin/events/HandlingEvents.kt
index 6180238d..886b82b3 100644
--- a/examples/privmx-snippets/src/main/kotlin/Stacks/JavaKotlin/events/HandlingEvents.kt
+++ b/examples/privmx-snippets/src/commonMain/kotlin/Stacks/JavaKotlin/events/HandlingEvents.kt
@@ -6,6 +6,16 @@ import com.simplito.java.privmx_endpoint.model.events.eventSelectorTypes.InboxEv
import com.simplito.java.privmx_endpoint.model.events.eventSelectorTypes.KvdbEventSelectorType
import com.simplito.java.privmx_endpoint.model.events.eventSelectorTypes.StoreEventSelectorType
import com.simplito.java.privmx_endpoint.model.events.eventSelectorTypes.ThreadEventSelectorType
+import com.simplito.java.privmx_endpoint.model.stream.StreamRoom
+import com.simplito.java.privmx_endpoint.model.stream.events.NewStreams
+import com.simplito.java.privmx_endpoint.model.stream.events.StreamEventData
+import com.simplito.java.privmx_endpoint.model.stream.events.StreamLeftEventData
+import com.simplito.java.privmx_endpoint.model.stream.events.StreamPublishedEventData
+import com.simplito.java.privmx_endpoint.model.stream.events.StreamRoomDeletedEventData
+import com.simplito.java.privmx_endpoint.model.stream.events.StreamUnpublishedEventData
+import com.simplito.java.privmx_endpoint.model.stream.events.StreamUpdatedEventData
+import com.simplito.java.privmx_endpoint.model.stream.events.StreamsUpdatedData
+import com.simplito.java.privmx_endpoint.model.stream.events.eventSelectorTypes.StreamEventSelectorType
import com.simplito.java.privmx_endpoint_extra.events.CallbackRegistration
import com.simplito.java.privmx_endpoint_extra.events.EventType
@@ -437,3 +447,117 @@ fun handlingKvdbEntriesEvents() {
)
}
// END: KVDBs events snippets
+
+
+fun handlingStreamRoomEvents() {
+ val callbacksGroup = "CALLBACKS_GROUP"
+
+ endpointSession.registerManyCallbacks(
+ CallbackRegistration(
+ callbacksGroup,
+ EventType.StreamRoomCreatedEvent(contextId)
+ ) { newStreamRoom: StreamRoom ->
+ // some actions when a new stream room is created
+ },
+
+ CallbackRegistration(
+ callbacksGroup,
+ EventType.StreamRoomUpdatedEvent(
+ StreamEventSelectorType.CONTEXT_ID,
+ contextId
+ )
+ ) { updatedStreamRoom: StreamRoom ->
+ // some actions when a stream room is updated
+ },
+
+ CallbackRegistration(
+ callbacksGroup,
+ EventType.StreamRoomDeletedEvent(
+ StreamEventSelectorType.CONTEXT_ID,
+ contextId
+ )
+ ) { deletedStreamRoomData: StreamRoomDeletedEventData ->
+ // some actions when a stream room is deleted
+ }
+ )
+}
+
+fun handlingStreamEvents() {
+ val callbacksGroup = "CALLBACKS_GROUP"
+ val streamRoomId = "STREAM_ROOM_ID"
+
+ endpointSession.registerManyCallbacks(
+ CallbackRegistration(
+ callbacksGroup,
+ EventType.StreamPublishedEvent(
+ StreamEventSelectorType.STREAMROOM_ID,
+ streamRoomId
+ )
+ ) { publishedStreamData: StreamPublishedEventData ->
+ // some actions when stream is published in the specified room
+ },
+
+ CallbackRegistration(
+ callbacksGroup,
+ EventType.StreamUnpublishedEvent(
+ StreamEventSelectorType.STREAMROOM_ID,
+ streamRoomId
+ )
+ ) { unpublishedStreamData: StreamUnpublishedEventData ->
+ // some actions when stream is unpublished from the specified room
+ },
+
+ CallbackRegistration(
+ callbacksGroup,
+ EventType.StreamUpdatedEvent(
+ StreamEventSelectorType.CONTEXT_ID,
+ contextId
+ )
+ ) { updatedStreamData: StreamUpdatedEventData ->
+ // some actions when stream data is updated
+ },
+
+ CallbackRegistration(
+ callbacksGroup,
+ EventType.StreamJoinedEvent(
+ StreamEventSelectorType.CONTEXT_ID,
+ contextId
+ )
+ ) { joinedEventData: StreamEventData ->
+ // some actions when user joins stream room
+ },
+
+ CallbackRegistration(
+ callbacksGroup,
+ EventType.StreamLeftEvent(
+ StreamEventSelectorType.CONTEXT_ID,
+ contextId
+ )
+ ) { leftEventData: StreamLeftEventData ->
+ // some actions when user leaves stream room
+ // e.g. update remote subscriptions list
+ },
+
+ CallbackRegistration(
+ callbacksGroup,
+ EventType.RemoteStreamsChangedEvent(
+ StreamEventSelectorType.CONTEXT_ID,
+ contextId
+ )
+ ) { remoteStreams: NewStreams ->
+ // some actions when remote streams change
+ // e.g. update remote subscriptions list
+ },
+
+ CallbackRegistration(
+ callbacksGroup,
+ EventType.StreamsUpdatedEvent(
+ StreamEventSelectorType.CONTEXT_ID,
+ contextId
+ )
+ ) { streamsUpdated: StreamsUpdatedData ->
+ // some actions when multiple streams updated
+ // e.g. update remote subscriptions list
+ }
+ )
+}
\ No newline at end of file
diff --git a/examples/privmx-snippets/src/main/kotlin/Stacks/JavaKotlin/events/Overview.kt b/examples/privmx-snippets/src/commonMain/kotlin/Stacks/JavaKotlin/events/Overview.kt
similarity index 100%
rename from examples/privmx-snippets/src/main/kotlin/Stacks/JavaKotlin/events/Overview.kt
rename to examples/privmx-snippets/src/commonMain/kotlin/Stacks/JavaKotlin/events/Overview.kt
diff --git a/examples/privmx-snippets/src/main/kotlin/Stacks/JavaKotlin/inboxes/Entries.kt b/examples/privmx-snippets/src/commonMain/kotlin/Stacks/JavaKotlin/inboxes/Entries.kt
similarity index 100%
rename from examples/privmx-snippets/src/main/kotlin/Stacks/JavaKotlin/inboxes/Entries.kt
rename to examples/privmx-snippets/src/commonMain/kotlin/Stacks/JavaKotlin/inboxes/Entries.kt
diff --git a/examples/privmx-snippets/src/main/kotlin/Stacks/JavaKotlin/inboxes/Overview.kt b/examples/privmx-snippets/src/commonMain/kotlin/Stacks/JavaKotlin/inboxes/Overview.kt
similarity index 72%
rename from examples/privmx-snippets/src/main/kotlin/Stacks/JavaKotlin/inboxes/Overview.kt
rename to examples/privmx-snippets/src/commonMain/kotlin/Stacks/JavaKotlin/inboxes/Overview.kt
index 90beb53d..2b801b8d 100644
--- a/examples/privmx-snippets/src/main/kotlin/Stacks/JavaKotlin/inboxes/Overview.kt
+++ b/examples/privmx-snippets/src/commonMain/kotlin/Stacks/JavaKotlin/inboxes/Overview.kt
@@ -1,14 +1,16 @@
package Stacks.JavaKotlin.inboxes
import Stacks.JavaKotlin.contextId
-import com.simplito.java.privmx_endpoint.model.FilesConfig
-import com.simplito.java.privmx_endpoint.model.UserWithPubKey
import Stacks.JavaKotlin.endpointSession
import Stacks.JavaKotlin.user1Id
import Stacks.JavaKotlin.user1PublicKey
import Stacks.JavaKotlin.user2Id
import Stacks.JavaKotlin.user2PublicKey
+import com.simplito.java.privmx_endpoint.model.ContainerPolicy
+import com.simplito.java.privmx_endpoint.model.FilesConfig
import com.simplito.java.privmx_endpoint.model.Inbox
+import com.simplito.java.privmx_endpoint.model.ItemPolicy
+import com.simplito.java.privmx_endpoint.model.UserWithPubKey
import com.simplito.java.privmx_endpoint.modules.inbox.InboxApi
import com.simplito.java.privmx_endpoint_extra.model.SortOrder
import kotlinx.serialization.Serializable
@@ -32,12 +34,12 @@ data class InboxItem(
// START: Creating Inboxes snippets
-fun createInboxBasic(){
- val users : List = listOf(
+fun createInboxBasic() {
+ val users: List = listOf(
UserWithPubKey(user1Id, user1PublicKey),
UserWithPubKey(user2Id, user2PublicKey)
)
- val managers : List = listOf(
+ val managers: List = listOf(
UserWithPubKey(user1Id, user1PublicKey)
)
val publicMeta = ByteArray(0)
@@ -52,18 +54,18 @@ fun createInboxBasic(){
)
}
-fun createInboxWithConfig(){
+fun createInboxWithConfig() {
val filesConfig = FilesConfig(
0L, //minCount
10L, //maxCount
500L, //maxFileSize
2000L //maxWholeUploadSize
)
- val users : List = listOf(
+ val users: List = listOf(
UserWithPubKey(user1Id, user1PublicKey),
UserWithPubKey(user2Id, user2PublicKey)
)
- val managers : List = listOf(
+ val managers: List = listOf(
UserWithPubKey(user1Id, user1PublicKey)
)
val publicMeta = ByteArray(0)
@@ -80,11 +82,11 @@ fun createInboxWithConfig(){
}
fun createInboxWithName() {
- val users : List = listOf(
+ val users: List = listOf(
UserWithPubKey(user1Id, user1PublicKey),
UserWithPubKey(user2Id, user2PublicKey)
)
- val managers : List = listOf(
+ val managers: List = listOf(
UserWithPubKey(user1Id, user1PublicKey)
)
val publicMeta = ByteArray(0)
@@ -99,12 +101,12 @@ fun createInboxWithName() {
)
}
-fun createInboxWithPublicMeta(){
- val users : List = listOf(
+fun createInboxWithPublicMeta() {
+ val users: List = listOf(
UserWithPubKey(user1Id, user1PublicKey),
UserWithPubKey(user2Id, user2PublicKey)
)
- val managers : List = listOf(
+ val managers: List = listOf(
UserWithPubKey(user1Id, user1PublicKey)
)
val publicMeta = InboxPublicMeta(
@@ -126,7 +128,7 @@ fun createInboxWithPublicMeta(){
// START: Getting Inboxes snippets
-fun getMostRecentInboxes(){
+fun getMostRecentInboxes() {
val startIndex = 0L
val pageSize = 100L
@@ -146,7 +148,7 @@ fun getMostRecentInboxes(){
}
}
-fun getOldestInboxes(){
+fun getOldestInboxes() {
val startIndex = 0L
val pageSize = 100L
@@ -166,7 +168,7 @@ fun getOldestInboxes(){
}
}
-fun getInboxById(){
+fun getInboxById() {
val inboxID = "INBOX_ID"
val inboxItem = inboxApi.getInbox(inboxID).let {
@@ -278,4 +280,80 @@ fun deletingInbox() {
inboxApi.deleteInbox(inboxID)
}
-// END: Managing Inboxes snippets
\ No newline at end of file
+// END: Managing Inboxes snippets
+
+
+@Serializable
+data class PublicMeta(
+ val name: String,
+ val date: String
+)
+
+val streamApi = endpointSession.initializeStreamApiLow();
+//val streamApi = StreamApi(streamApiLow, )
+
+
+fun a() {
+ val users: List = listOf(
+ UserWithPubKey(user1Id, user1PublicKey),
+ UserWithPubKey(user2Id, user2PublicKey)
+ )
+ val managers: List = listOf(
+ UserWithPubKey(user1Id, user1PublicKey)
+ )
+ val publicMeta = PublicMeta(
+ "Daily meeting #34",
+ "23 February 2026"
+ )
+ val privateMeta = ByteArray(0)
+
+ val roomId: String = streamApi.createStreamRoom(
+ contextId,
+ users,
+ managers,
+ Json.encodeToString(publicMeta).encodeToByteArray(),
+ privateMeta,
+ )
+}
+
+
+// todo
+fun b() {
+ val users: List = listOf(
+ UserWithPubKey(user1Id, user1PublicKey),
+ UserWithPubKey(user2Id, user2PublicKey)
+ )
+
+ val managers: List = listOf(
+ UserWithPubKey(user1Id, user1PublicKey)
+ )
+
+ val itemPolicy = ItemPolicy(
+ "owner", // get
+ "owner", // update
+ "owner", // delete
+ "owner", // updatePolicy
+ "owner", // updatePolicy
+ "owner", // updatePolicy
+ )
+
+ val policy = ContainerPolicy(
+ "owner", // get
+ "owner", // update
+ "owner", // delete
+ "owner", // updatePolicy
+ "true", // updaterCanBeRemovedFromManagers
+ "true", // ownerCanBeRemovedFromManagers
+ itemPolicy
+ )
+
+ val roomId: String? = streamApi.createStreamRoom(
+ contextId,
+ users,
+ managers,
+ ByteArray(0),
+ ByteArray(0),
+ policy
+ )
+}
+
diff --git a/examples/privmx-snippets/src/main/kotlin/Stacks/JavaKotlin/kvdb/KvdbEntries.kt b/examples/privmx-snippets/src/commonMain/kotlin/Stacks/JavaKotlin/kvdb/KvdbEntries.kt
similarity index 100%
rename from examples/privmx-snippets/src/main/kotlin/Stacks/JavaKotlin/kvdb/KvdbEntries.kt
rename to examples/privmx-snippets/src/commonMain/kotlin/Stacks/JavaKotlin/kvdb/KvdbEntries.kt
diff --git a/examples/privmx-snippets/src/main/kotlin/Stacks/JavaKotlin/kvdb/Overview.kt b/examples/privmx-snippets/src/commonMain/kotlin/Stacks/JavaKotlin/kvdb/Overview.kt
similarity index 100%
rename from examples/privmx-snippets/src/main/kotlin/Stacks/JavaKotlin/kvdb/Overview.kt
rename to examples/privmx-snippets/src/commonMain/kotlin/Stacks/JavaKotlin/kvdb/Overview.kt
diff --git a/examples/privmx-snippets/src/main/kotlin/Stacks/JavaKotlin/stores/DownloadingFiles.kt b/examples/privmx-snippets/src/commonMain/kotlin/Stacks/JavaKotlin/stores/DownloadingFiles.kt
similarity index 100%
rename from examples/privmx-snippets/src/main/kotlin/Stacks/JavaKotlin/stores/DownloadingFiles.kt
rename to examples/privmx-snippets/src/commonMain/kotlin/Stacks/JavaKotlin/stores/DownloadingFiles.kt
diff --git a/examples/privmx-snippets/src/main/kotlin/Stacks/JavaKotlin/stores/Files.kt b/examples/privmx-snippets/src/commonMain/kotlin/Stacks/JavaKotlin/stores/Files.kt
similarity index 100%
rename from examples/privmx-snippets/src/main/kotlin/Stacks/JavaKotlin/stores/Files.kt
rename to examples/privmx-snippets/src/commonMain/kotlin/Stacks/JavaKotlin/stores/Files.kt
diff --git a/examples/privmx-snippets/src/main/kotlin/Stacks/JavaKotlin/stores/Overview.kt b/examples/privmx-snippets/src/commonMain/kotlin/Stacks/JavaKotlin/stores/Overview.kt
similarity index 99%
rename from examples/privmx-snippets/src/main/kotlin/Stacks/JavaKotlin/stores/Overview.kt
rename to examples/privmx-snippets/src/commonMain/kotlin/Stacks/JavaKotlin/stores/Overview.kt
index e7e7df74..704e2e52 100644
--- a/examples/privmx-snippets/src/main/kotlin/Stacks/JavaKotlin/stores/Overview.kt
+++ b/examples/privmx-snippets/src/commonMain/kotlin/Stacks/JavaKotlin/stores/Overview.kt
@@ -20,6 +20,7 @@ fun setStoreApi() {
val storeApi = endpointSession.storeApi
}
+@Suppress("UnsafeOptInUsageError")
@Serializable
data class StorePublicMeta(val tags: List)
diff --git a/examples/privmx-snippets/src/main/kotlin/Stacks/JavaKotlin/threads/Messages.kt b/examples/privmx-snippets/src/commonMain/kotlin/Stacks/JavaKotlin/threads/Messages.kt
similarity index 100%
rename from examples/privmx-snippets/src/main/kotlin/Stacks/JavaKotlin/threads/Messages.kt
rename to examples/privmx-snippets/src/commonMain/kotlin/Stacks/JavaKotlin/threads/Messages.kt
diff --git a/examples/privmx-snippets/src/main/kotlin/Stacks/JavaKotlin/threads/Overview.kt b/examples/privmx-snippets/src/commonMain/kotlin/Stacks/JavaKotlin/threads/Overview.kt
similarity index 100%
rename from examples/privmx-snippets/src/main/kotlin/Stacks/JavaKotlin/threads/Overview.kt
rename to examples/privmx-snippets/src/commonMain/kotlin/Stacks/JavaKotlin/threads/Overview.kt
diff --git a/examples/privmx-snippets/src/main/kotlin/Tools/Stores/UsingStores/DownloadingFiles.kt b/examples/privmx-snippets/src/commonMain/kotlin/Tools/Stores/UsingStores/DownloadingFiles.kt
similarity index 100%
rename from examples/privmx-snippets/src/main/kotlin/Tools/Stores/UsingStores/DownloadingFiles.kt
rename to examples/privmx-snippets/src/commonMain/kotlin/Tools/Stores/UsingStores/DownloadingFiles.kt
diff --git a/examples/privmx-snippets/src/main/kotlin/Tools/Stores/UsingStores/ManagingFiles.kt b/examples/privmx-snippets/src/commonMain/kotlin/Tools/Stores/UsingStores/ManagingFiles.kt
similarity index 100%
rename from examples/privmx-snippets/src/main/kotlin/Tools/Stores/UsingStores/ManagingFiles.kt
rename to examples/privmx-snippets/src/commonMain/kotlin/Tools/Stores/UsingStores/ManagingFiles.kt
diff --git a/examples/privmx-snippets/src/main/kotlin/Tools/Stores/UsingStores/ManagingStores.kt b/examples/privmx-snippets/src/commonMain/kotlin/Tools/Stores/UsingStores/ManagingStores.kt
similarity index 100%
rename from examples/privmx-snippets/src/main/kotlin/Tools/Stores/UsingStores/ManagingStores.kt
rename to examples/privmx-snippets/src/commonMain/kotlin/Tools/Stores/UsingStores/ManagingStores.kt
diff --git a/examples/privmx-snippets/src/commonMain/kotlin/Tools/Stores/UsingStores/StoreEventsInRealTime.kt b/examples/privmx-snippets/src/commonMain/kotlin/Tools/Stores/UsingStores/StoreEventsInRealTime.kt
new file mode 100644
index 00000000..ca4a3572
--- /dev/null
+++ b/examples/privmx-snippets/src/commonMain/kotlin/Tools/Stores/UsingStores/StoreEventsInRealTime.kt
@@ -0,0 +1,27 @@
+package Tools.Stores.UsingStores
+
+import com.simplito.java.privmx_endpoint_extra.events.EventType
+
+//fun handlingStoreEvents() {
+// val callbacksID = "CALLBACK_ID"
+// val storeID = "STORE_ID"
+//
+// // Starting the Event Loop
+// endpointContainer.startListening()
+//
+// // Handling Store Events
+// endpointSession.registerCallback(
+// callbacksID,
+// EventType.StoreCreatedEvent
+// ) { newStore ->
+// println(newStore.storeId)
+// }
+//
+// // Handling File Events
+// endpointSession.registerCallback(
+// callbacksID,
+// EventType.StoreFileCreatedEvent(storeID)
+// ) { newFile ->
+// println(newFile.info.fileId)
+// }
+//}
\ No newline at end of file
diff --git a/examples/privmx-snippets/src/main/kotlin/Tools/Stores/UsingStores/UploadingFiles.kt b/examples/privmx-snippets/src/commonMain/kotlin/Tools/Stores/UsingStores/UploadingFiles.kt
similarity index 100%
rename from examples/privmx-snippets/src/main/kotlin/Tools/Stores/UsingStores/UploadingFiles.kt
rename to examples/privmx-snippets/src/commonMain/kotlin/Tools/Stores/UsingStores/UploadingFiles.kt
diff --git a/examples/privmx-snippets/src/main/kotlin/Tools/Threads/UsingThreads/ManagingThreads.kt b/examples/privmx-snippets/src/commonMain/kotlin/Tools/Threads/UsingThreads/ManagingThreads.kt
similarity index 100%
rename from examples/privmx-snippets/src/main/kotlin/Tools/Threads/UsingThreads/ManagingThreads.kt
rename to examples/privmx-snippets/src/commonMain/kotlin/Tools/Threads/UsingThreads/ManagingThreads.kt
diff --git a/examples/privmx-snippets/src/commonMain/kotlin/Tools/Threads/UsingThreads/RealTimeCommunication.kt b/examples/privmx-snippets/src/commonMain/kotlin/Tools/Threads/UsingThreads/RealTimeCommunication.kt
new file mode 100644
index 00000000..9a6643fc
--- /dev/null
+++ b/examples/privmx-snippets/src/commonMain/kotlin/Tools/Threads/UsingThreads/RealTimeCommunication.kt
@@ -0,0 +1,26 @@
+package Tools.Threads.UsingThreads
+
+import com.simplito.java.privmx_endpoint_extra.events.EventType
+//
+//fun handlingThreadAndMessageEvents() {
+// val callbacksID = "CALLBACK_ID"
+// val threadID = "THREAD_ID"
+// // Starting the Event Loop
+// endpointContainer.startListening()
+//
+// // Handling Thread events
+// endpointSession.registerCallback(
+// callbacksID,
+// EventType.ThreadCreatedEvent
+// ){ newThread ->
+// println(newThread.threadId)
+// }
+//
+// //Handling message Events
+// endpointSession.registerCallback(
+// callbacksID,
+// EventType.ThreadNewMessageEvent(threadID)
+// ){ newMessage ->
+// println(newMessage.info?.messageId)
+// }
+//}
\ No newline at end of file
diff --git a/examples/privmx-snippets/src/main/kotlin/Tools/Threads/UsingThreads/SendingMessages.kt b/examples/privmx-snippets/src/commonMain/kotlin/Tools/Threads/UsingThreads/SendingMessages.kt
similarity index 100%
rename from examples/privmx-snippets/src/main/kotlin/Tools/Threads/UsingThreads/SendingMessages.kt
rename to examples/privmx-snippets/src/commonMain/kotlin/Tools/Threads/UsingThreads/SendingMessages.kt
diff --git a/examples/privmx-snippets/src/commonMain/kotlin/Tools/UsingInboxes/InboxEntries.kt b/examples/privmx-snippets/src/commonMain/kotlin/Tools/UsingInboxes/InboxEntries.kt
new file mode 100644
index 00000000..25bb7442
--- /dev/null
+++ b/examples/privmx-snippets/src/commonMain/kotlin/Tools/UsingInboxes/InboxEntries.kt
@@ -0,0 +1,148 @@
+package Tools.UsingInboxes
+
+import com.google.gson.JsonParser
+import com.simplito.java.privmx_endpoint.model.File
+import com.simplito.java.privmx_endpoint.model.InboxEntry
+import com.simplito.java.privmx_endpoint_extra.inboxFileStream.InboxFileStreamWriter
+import com.simplito.java.privmx_endpoint_extra.model.SortOrder
+import java.io.IOException
+import java.util.List
+
+class InboxEntries : WorkingWithInboxes() {
+ fun sendingInboxEntryBasic() {
+ // 1. Preparing Entry
+ val inboxID = "INBOX_ID"
+
+ val entryDataAnswer = "USER_PROVIDED_TEXT"
+ val entryDataVersion = 1L
+ val entryDataType = "TEXT_ANSWER"
+
+ val entryData: ByteArray = """
+ {
+ "content": {
+ "answer": "%s"
+ },
+ "version": %d,
+ "type": "%s"
+ }
+
+ """.trimIndent().format(entryDataAnswer, entryDataVersion, entryDataType)
+ .toByteArray()
+
+ val entryHandle = endpointSession.inboxApi.prepareEntry(
+ inboxID,
+ entryData,
+ mutableListOf()
+ )
+
+ // 2. Sending Entry
+ endpointSession.inboxApi.sendEntry(entryHandle)
+ }
+
+ @Throws(IOException::class)
+ fun attachingFiles(fileID: String?) {
+ val inboxID = "INBOX_ID"
+ val publicMeta = "My public data".toByteArray()
+
+ val fileName = "FILE_NAME"
+ val fileType = "FILE_TYPE"
+ val fileContent = "FILE_CONTENT".toByteArray()
+ val fileSize = fileContent.size.toLong()
+
+ val entryDataAnswer = "USER_PROVIDED_TEXT"
+ val entryDataVersion = 1L
+ val entryDataType = "TEXT_ANSWER"
+
+ val entryData: ByteArray = """
+ {
+ "content": {
+ "answer": "%s"
+ },
+ "version": %d,
+ "type": "%s"
+ }
+
+ """.trimIndent().format(entryDataAnswer, entryDataVersion, entryDataType)
+ .toByteArray()
+
+ val filePrivateMeta: ByteArray = """
+ {
+ "name": "%s",
+ "mimetype": "%s"
+ }
+
+ """.trimIndent().format(fileName, fileType).toByteArray()
+
+ val inboxFileStreamWriter = InboxFileStreamWriter.createFile(
+ endpointSession.inboxApi,
+ publicMeta,
+ filePrivateMeta,
+ fileSize
+ )
+
+ val fileHandle = inboxFileStreamWriter.getFileHandle()
+
+ // 1. Preparing Entry & sending File Contents
+ val inboxHandle = endpointSession.inboxApi.prepareEntry(
+ inboxID,
+ entryData,
+ List.of(fileHandle)
+ )
+
+ // 2. Sending File Contents
+ inboxFileStreamWriter.write(
+ inboxHandle,
+ fileContent
+ )
+
+ // 3. Sending Entry
+ endpointSession.inboxApi.sendEntry(inboxHandle)
+ }
+
+ fun fetchingEntriesBasic() {
+ val inboxID = "INBOX_ID"
+ val startIndex = 0L
+ val pageSize = 100L
+
+ val entriesPagingList = endpointSession.inboxApi.listEntries(
+ inboxID,
+ startIndex,
+ pageSize,
+ SortOrder.DESC
+ )
+ }
+
+ fun fetchingEntriesWithFiles() {
+ val inboxID = "INBOX_ID"
+ val startIndex = 0L
+ val pageSize = 1L
+
+ // getting last entry
+ val entriesPagingList = endpointSession.inboxApi.listEntries(
+ inboxID,
+ startIndex,
+ pageSize,
+ SortOrder.DESC
+ )
+
+ val entry: InboxEntry = entriesPagingList.readItems[0]
+ val entryFile: File = entry.files[0]
+
+ // This example uses com.google.code.gson:gson
+ // dependency for handling JSON objects in Java
+
+ // decoded privateMeta
+ val privateMeta = String(entryFile.privateMeta)
+ val privateMetaJson = JsonParser.parseString(privateMeta).getAsJsonObject()
+ val fileName = privateMetaJson.get("name").getAsString()
+ val fileType = privateMetaJson.get("mimetype").getAsString()
+
+ // decoded data
+ val entryData = String(entry.data)
+ val entryDataJson = JsonParser.parseString(entryData).getAsJsonObject()
+ val answer = entryDataJson
+ .getAsJsonObject("content")
+ .get("answer")
+ .asString
+ }
+}
\ No newline at end of file
diff --git a/examples/privmx-snippets/src/commonMain/kotlin/Tools/UsingInboxes/InboxUpdates.kt b/examples/privmx-snippets/src/commonMain/kotlin/Tools/UsingInboxes/InboxUpdates.kt
new file mode 100644
index 00000000..2bee04c6
--- /dev/null
+++ b/examples/privmx-snippets/src/commonMain/kotlin/Tools/UsingInboxes/InboxUpdates.kt
@@ -0,0 +1,49 @@
+package Tools.UsingInboxes
+
+import com.simplito.java.privmx_endpoint.model.Inbox
+import com.simplito.java.privmx_endpoint.model.InboxEntry
+import com.simplito.java.privmx_endpoint.model.events.eventSelectorTypes.InboxEventSelectorType
+import com.simplito.java.privmx_endpoint_extra.events.CallbackRegistration
+import com.simplito.java.privmx_endpoint_extra.events.EventCallback
+import com.simplito.java.privmx_endpoint_extra.events.EventType
+
+class InboxUpdates : WorkingWithInboxes() {
+ fun handlingInboxEvents() {
+ val InboxCallbackID = "INBOX_CALLBACK_ID"
+ val EntryCallbackID = "ENTRY_CALLBACK_ID"
+ val inboxID = "INBOX_ID"
+
+ // Starting the Event Loop
+ endpointContainer.startListening()
+
+ endpointSession.registerManyCallbacks(
+
+ // Handling Inbox Events
+ CallbackRegistration(
+ InboxCallbackID,
+ EventType.InboxUpdatedEvent(
+ InboxEventSelectorType.CONTEXT_ID,
+ contextId
+ ),
+ EventCallback { updatedInbox: Inbox? ->
+ println(updatedInbox!!.lastModifier)
+ }
+ ),
+
+ // Handling Inbox Entry Events
+ CallbackRegistration(
+ EntryCallbackID,
+ EventType.InboxEntryCreatedEvent(
+ InboxEventSelectorType.INBOX_ID,
+ inboxID
+ ),
+ EventCallback { newEntry: InboxEntry? ->
+ println(newEntry!!.inboxId)
+ }
+ )
+ )
+
+
+ endpointSession.unregisterCallbacks(EntryCallbackID)
+ }
+}
\ No newline at end of file
diff --git a/examples/privmx-snippets/src/commonMain/kotlin/Tools/UsingInboxes/WorkingWithInboxes.kt b/examples/privmx-snippets/src/commonMain/kotlin/Tools/UsingInboxes/WorkingWithInboxes.kt
new file mode 100644
index 00000000..9f4a3222
--- /dev/null
+++ b/examples/privmx-snippets/src/commonMain/kotlin/Tools/UsingInboxes/WorkingWithInboxes.kt
@@ -0,0 +1,103 @@
+package Tools.UsingInboxes
+
+import com.simplito.java.privmx_endpoint.model.UserWithPubKey
+import com.simplito.java.privmx_endpoint_extra.lib.PrivmxEndpoint
+import com.simplito.java.privmx_endpoint_extra.lib.PrivmxEndpointContainer
+import com.simplito.java.privmx_endpoint_extra.model.Modules
+import com.simplito.java.privmx_endpoint_extra.model.SortOrder
+import java.nio.charset.StandardCharsets
+import java.util.Set
+
+open class WorkingWithInboxes {
+ // START: Initial Assumptions Snippets
+ /*
+ All the values below like BRIDGE_URL, SOLUTION_ID, CONTEXT_ID
+ should be replaced by the ones corresponding to your Bridge Server instance.
+
+ The private keys here are for demonstration purposes only.
+ Normally, they should be kept separately by each user and stored in a safe place,
+ or generated from a password (see the derivePrivateKey2() method in the Crypto API)
+ */
+ var bridgeUrl: String = "YOUR_BRIDGE_URL"
+ var solutionId: String = "YOUR_SOLUTION_ID"
+ var contextId: String = "YOUR_CONTEXT_ID"
+
+ var user1Id: String = "USER_ID_1"
+ var user1PublicKey: String = "PUBLIC_KEY_1"
+ var user1PrivateKey: String = "PRIVATE_KEY_1"
+
+ var user2Id: String = "USER_ID_2"
+ var user2PublicKey: String = "PUBLIC_KEY_2"
+
+ var user3Id: String = "USER_ID_3"
+ var user3PublicKey: String = "PUBLIC_KEY_3"
+
+ var endpointContainer: PrivmxEndpointContainer = PrivmxEndpointContainer()
+
+ var initModules = Set.of(Modules.INBOX)
+ var endpointSession: PrivmxEndpoint = endpointContainer.connect(
+ initModules,
+ user1PrivateKey,
+ solutionId,
+ bridgeUrl
+ )
+
+ // END: Initial Assumptions Snippets
+ fun creatingInboxes() {
+ val privateMeta = "My private data".toByteArray(StandardCharsets.UTF_8)
+ val publicMeta = "My public data".toByteArray(StandardCharsets.UTF_8)
+ val users = listOf(
+ UserWithPubKey(user1Id, user1PublicKey),
+ UserWithPubKey(user2Id, user2PublicKey)
+ )
+ val managers = listOf(
+ UserWithPubKey(user1Id, user1PublicKey)
+ )
+
+ val inboxID = endpointSession.inboxApi.createInbox(
+ contextId,
+ users,
+ managers,
+ publicMeta,
+ privateMeta
+ )
+ }
+
+ fun listingInboxes() {
+ val limit = 30L
+ val skip = 0L
+
+ val inboxes = endpointSession.inboxApi.listInboxes(
+ contextId,
+ skip,
+ limit,
+ SortOrder.DESC
+ )
+ }
+
+ fun modifyingInboxes() {
+ val inboxID = "INBOX_ID"
+ val inbox = endpointSession.inboxApi.getInbox(inboxID)
+ val newUsers = listOf(
+ UserWithPubKey(user1Id, user1PublicKey),
+ UserWithPubKey(user2Id, user2PublicKey),
+ UserWithPubKey(user3Id, user3PublicKey)
+ )
+ val newManagers = listOf(
+ UserWithPubKey(user1Id, user1PublicKey),
+ UserWithPubKey(user2Id, user2PublicKey)
+ )
+ val newPrivateMeta = "New inbox name".toByteArray(StandardCharsets.UTF_8)
+
+ endpointSession.inboxApi.updateInbox(
+ inboxID,
+ newUsers,
+ newManagers,
+ inbox.publicMeta,
+ newPrivateMeta,
+ null, // filesConfig
+ inbox.version,
+ false // force
+ )
+ }
+}
\ No newline at end of file
diff --git a/examples/privmx-snippets/src/commonMain/kotlin/Tools/UsingKvdbs/ListeningForChanges.kt b/examples/privmx-snippets/src/commonMain/kotlin/Tools/UsingKvdbs/ListeningForChanges.kt
new file mode 100644
index 00000000..30fd0a5e
--- /dev/null
+++ b/examples/privmx-snippets/src/commonMain/kotlin/Tools/UsingKvdbs/ListeningForChanges.kt
@@ -0,0 +1,49 @@
+package Tools.UsingKvdbs
+
+import com.simplito.java.privmx_endpoint.model.KvdbEntry
+import com.simplito.java.privmx_endpoint.model.events.KvdbStatsEventData
+import com.simplito.java.privmx_endpoint.model.events.eventSelectorTypes.KvdbEventSelectorType
+import com.simplito.java.privmx_endpoint_extra.events.CallbackRegistration
+import com.simplito.java.privmx_endpoint_extra.events.EventType
+
+class ListeningForChanges : ManagingKvdbs() {
+ fun handlingKvdbEvents() {
+ val KvdbCallbackID = "KVDB_CALLBACK_ID"
+ val EntrycallbackID = "ENTRY_CALLBACK_ID"
+ val kvdbID = "KVDB_ID"
+
+ // Starting the Event Loop
+ endpointContainer.startListening()
+
+ endpointSession.registerManyCallbacks(
+
+ // Handling KVDB Events
+ CallbackRegistration(
+ KvdbCallbackID,
+ EventType.KvdbStatsChangedEvent(
+ KvdbEventSelectorType.CONTEXT_ID,
+ contextId
+ ),
+ { kvdbStats: KvdbStatsEventData? ->
+ println(kvdbStats!!.lastEntryDate)
+ }
+ ),
+
+ // Handling KVDB Entry Events
+ CallbackRegistration(
+ EntrycallbackID,
+ EventType.KvdbNewEntryEvent(
+ KvdbEventSelectorType.KVDB_ID,
+ kvdbID
+ ),
+ { newEntry: KvdbEntry? ->
+ println(newEntry!!.info.key)
+ }
+ )
+ )
+
+ // Finish handling events
+ endpointSession.unregisterCallbacks(KvdbCallbackID)
+ endpointSession.unregisterCallbacks(EntrycallbackID)
+ }
+}
\ No newline at end of file
diff --git a/examples/privmx-snippets/src/commonMain/kotlin/Tools/UsingKvdbs/ManagingEntries.kt b/examples/privmx-snippets/src/commonMain/kotlin/Tools/UsingKvdbs/ManagingEntries.kt
new file mode 100644
index 00000000..9b15d635
--- /dev/null
+++ b/examples/privmx-snippets/src/commonMain/kotlin/Tools/UsingKvdbs/ManagingEntries.kt
@@ -0,0 +1,39 @@
+package Tools.UsingKvdbs
+
+import java.nio.charset.StandardCharsets
+
+class ManagingEntries : ManagingKvdbs() {
+ fun sendingEntries() {
+ val kvdbID = "KVDB_ID"
+ val kvdbEntryKey = "KVDB_ENTRY_KEY"
+ val privateMeta = "My private data".toByteArray(StandardCharsets.UTF_8)
+ val publicMeta = "My public data".toByteArray(StandardCharsets.UTF_8)
+ val entryData = "ENTRY_DATA".toByteArray()
+ val newEntryData = "New Entry Data".toByteArray()
+
+ // creating entry
+ endpointSession.kvdbApi.setEntry(
+ kvdbID,
+ kvdbEntryKey,
+ publicMeta,
+ privateMeta,
+ entryData
+ )
+
+ // read created entry
+ val entry = endpointSession.kvdbApi.getEntry(
+ kvdbID,
+ kvdbEntryKey
+ )
+
+ // update created entry
+ endpointSession.kvdbApi.setEntry(
+ entry.info.kvdbId,
+ entry.info.key,
+ entry.publicMeta,
+ entry.privateMeta,
+ newEntryData,
+ entry.version
+ )
+ }
+}
\ No newline at end of file
diff --git a/examples/privmx-snippets/src/commonMain/kotlin/Tools/UsingKvdbs/ManagingKvdbs.kt b/examples/privmx-snippets/src/commonMain/kotlin/Tools/UsingKvdbs/ManagingKvdbs.kt
new file mode 100644
index 00000000..b2750d68
--- /dev/null
+++ b/examples/privmx-snippets/src/commonMain/kotlin/Tools/UsingKvdbs/ManagingKvdbs.kt
@@ -0,0 +1,64 @@
+package Tools.UsingKvdbs
+
+import com.simplito.java.privmx_endpoint.model.UserWithPubKey
+import com.simplito.java.privmx_endpoint_extra.lib.PrivmxEndpoint
+import com.simplito.java.privmx_endpoint_extra.lib.PrivmxEndpointContainer
+import com.simplito.java.privmx_endpoint_extra.model.Modules
+import java.nio.charset.StandardCharsets
+import java.util.Set
+
+open class ManagingKvdbs {
+ // START: Initial Assumptions Snippets
+ /*
+ All the values below like BRIDGE_URL, SOLUTION_ID, CONTEXT_ID
+ should be replaced by the ones corresponding to your Bridge Server instance.
+
+ The private keys here are for demonstration purposes only.
+ Normally, they should be kept separately by each user and stored in a safe place,
+ or generated from a password (see the derivePrivateKey2() method in the Crypto API)
+ */
+ var bridgeUrl: String = "YOUR_BRIDGE_URL"
+ var solutionId: String = "YOUR_SOLUTION_ID"
+ var contextId: String = "YOUR_CONTEXT_ID"
+
+ var user1Id: String = "USER_ID_1"
+ var user1PublicKey: String = "PUBLIC_KEY_1"
+ var user1PrivateKey: String = "PRIVATE_KEY_1"
+
+ var user2Id: String = "USER_ID_2"
+ var user2PublicKey: String = "PUBLIC_KEY_2"
+
+ var user3Id: String = "USER_ID_3"
+ var user3PublicKey: String = "PUBLIC_KEY_3"
+
+ var endpointContainer: PrivmxEndpointContainer = PrivmxEndpointContainer()
+
+ var initModules: MutableSet = Set.of(Modules.KVDB)
+ var endpointSession: PrivmxEndpoint = endpointContainer.connect(
+ initModules,
+ user1PrivateKey,
+ solutionId,
+ bridgeUrl
+ )
+
+ // END: Initial Assumptions Snippets
+ fun creatingKvdbs() {
+ val privateMeta = "KVDB's private data".toByteArray(StandardCharsets.UTF_8)
+ val publicMeta = "KVDB's public data".toByteArray(StandardCharsets.UTF_8)
+ val users = listOf(
+ UserWithPubKey(user1Id, user1PublicKey),
+ UserWithPubKey(user2Id, user2PublicKey)
+ )
+ val managers = listOf(
+ UserWithPubKey(user1Id, user1PublicKey)
+ )
+
+ endpointSession.kvdbApi.createKvdb(
+ contextId,
+ users,
+ managers,
+ publicMeta,
+ privateMeta
+ )
+ }
+}
\ No newline at end of file
diff --git a/examples/privmx-snippets/src/main/kotlin/Tools/Stores/UsingStores/StoreEventsInRealTime.kt b/examples/privmx-snippets/src/main/kotlin/Tools/Stores/UsingStores/StoreEventsInRealTime.kt
deleted file mode 100644
index 2fb06edc..00000000
--- a/examples/privmx-snippets/src/main/kotlin/Tools/Stores/UsingStores/StoreEventsInRealTime.kt
+++ /dev/null
@@ -1,27 +0,0 @@
-package Tools.Stores.UsingStores
-
-import com.simplito.java.privmx_endpoint_extra.events.EventType
-
-fun handlingStoreEvents() {
- val callbacksID = "CALLBACK_ID"
- val storeID = "STORE_ID"
-
- // Starting the Event Loop
- endpointContainer.startListening()
-
- // Handling Store Events
- endpointSession.registerCallback(
- callbacksID,
- EventType.StoreCreatedEvent
- ) { newStore ->
- println(newStore.storeId)
- }
-
- // Handling File Events
- endpointSession.registerCallback(
- callbacksID,
- EventType.StoreFileCreatedEvent(storeID)
- ) { newFile ->
- println(newFile.info.fileId)
- }
-}
\ No newline at end of file
diff --git a/examples/privmx-snippets/src/main/kotlin/Tools/Threads/UsingThreads/RealTimeCommunication.kt b/examples/privmx-snippets/src/main/kotlin/Tools/Threads/UsingThreads/RealTimeCommunication.kt
deleted file mode 100644
index 80049c10..00000000
--- a/examples/privmx-snippets/src/main/kotlin/Tools/Threads/UsingThreads/RealTimeCommunication.kt
+++ /dev/null
@@ -1,26 +0,0 @@
-package Tools.Threads.UsingThreads
-
-import com.simplito.java.privmx_endpoint_extra.events.EventType
-
-fun handlingThreadAndMessageEvents() {
- val callbacksID = "CALLBACK_ID"
- val threadID = "THREAD_ID"
- // Starting the Event Loop
- endpointContainer.startListening()
-
- // Handling Thread events
- endpointSession.registerCallback(
- callbacksID,
- EventType.ThreadCreatedEvent
- ){ newThread ->
- println(newThread.threadId)
- }
-
- //Handling message Events
- endpointSession.registerCallback(
- callbacksID,
- EventType.ThreadNewMessageEvent(threadID)
- ){ newMessage ->
- println(newMessage.info?.messageId)
- }
-}
\ No newline at end of file
diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml
index ff106dd9..4445b609 100644
--- a/gradle/libs.versions.toml
+++ b/gradle/libs.versions.toml
@@ -1,5 +1,5 @@
[versions]
-kotlinJVM = "2.1.10"
+kotlin = "2.1.10"
agp = "8.11.0"
junit = "4.13.2"
junitVersion = "1.1.5"
@@ -8,7 +8,6 @@ appcompat = "1.7.1"
privmxInstallNative = "2.0.0"
proguardGradle = "7.7.0"
serialization-json = "1.6.2"
-kotlin-serialization = "1.9.21"
gson = "2.11.0"
material = "1.10.0"
webrtc = "1.0.0"
@@ -31,7 +30,9 @@ annotation-jvm = { group = "androidx.annotation", name = "annotation-jvm", versi
#google-webrtc = { module = "org.webrtc:google-webrtc", version.ref = "googleWebrtc" }
[plugins]
-kotlin-jvm = { id = "org.jetbrains.kotlin.jvm", version.ref = "kotlinJVM" }
+kotlin-jvm = { id = "org.jetbrains.kotlin.jvm", version.ref = "kotlin" }
privmx-install-native = { id = "com.simplito.privmx-endpoint-install-native", version.ref = "privmxInstallNative" }
-kotlinPluginSerialization = { id = "org.jetbrains.kotlin.plugin.serialization", version.ref = "kotlin-serialization" }
-androidLibrary = { id = "com.android.library", version.ref = "agp" }
\ No newline at end of file
+kotlinPluginSerialization = { id = "org.jetbrains.kotlin.plugin.serialization", version.ref = "kotlin" }
+androidLibrary = { id = "com.android.library", version.ref = "agp" }
+kotlinMultiplatform = { id = "org.jetbrains.kotlin.multiplatform", version.ref = "kotlin" }
+android-lint = { id = "com.android.lint", version.ref = "agp" }
\ No newline at end of file