From 9c3d59917282336657dbde3393f8625ae519a684 Mon Sep 17 00:00:00 2001 From: Doominika Date: Mon, 3 Nov 2025 10:40:37 +0100 Subject: [PATCH 1/4] feat: implement subscribeFor method --- .../src/main/cpp/modules/StreamApi.cpp | 39 +++++++++++++++++++ .../modules/stream/StreamApi.java | 5 +++ 2 files changed, 44 insertions(+) diff --git a/privmx-endpoint/src/main/cpp/modules/StreamApi.cpp b/privmx-endpoint/src/main/cpp/modules/StreamApi.cpp index 6cc1fbce..f84abe2b 100644 --- a/privmx-endpoint/src/main/cpp/modules/StreamApi.cpp +++ b/privmx-endpoint/src/main/cpp/modules/StreamApi.cpp @@ -56,4 +56,43 @@ Java_com_simplito_java_privmx_1endpoint_modules_stream_StreamApi_deinit( e.what() ); } +} + +extern "C" +JNIEXPORT jobject JNICALL +Java_com_simplito_java_privmx_1endpoint_modules_stream_StreamApi_subscribeFor( + JNIEnv *env, + jobject thiz, + jobject subscription_queries +) { + JniContextUtils ctx(env); + if (ctx.nullCheck(subscription_queries, "Subscription queries")) { + return nullptr; + } + + jobject result; + ctx.callResultEndpointApi( + &result, + [&ctx, &thiz, &subscription_queries]() -> jobject { + + std::vector queries = jArrayToVector( + ctx, + ctx.jObject2jArray(subscription_queries), + jobject2string + ); + + std::vector subscription_ids_c = + getStreamApi(ctx, thiz)->subscribeFor(queries); + + return vectorTojArray( + ctx, + subscription_ids_c, + string2jobject + ); + } + ); + if (ctx->ExceptionCheck()) { + return nullptr; + } + return result; } \ No newline at end of file diff --git a/privmx-endpoint/src/main/java/com/simplito/java/privmx_endpoint/modules/stream/StreamApi.java b/privmx-endpoint/src/main/java/com/simplito/java/privmx_endpoint/modules/stream/StreamApi.java index 6f7b512f..3f68c00e 100644 --- a/privmx-endpoint/src/main/java/com/simplito/java/privmx_endpoint/modules/stream/StreamApi.java +++ b/privmx-endpoint/src/main/java/com/simplito/java/privmx_endpoint/modules/stream/StreamApi.java @@ -1,9 +1,12 @@ package com.simplito.java.privmx_endpoint.modules.stream; import com.simplito.java.privmx_endpoint.LibLoader; +import com.simplito.java.privmx_endpoint.model.events.eventSelectorTypes.StreamEventSelectorType; +import com.simplito.java.privmx_endpoint.model.events.eventTypes.StreamEventType; import com.simplito.java.privmx_endpoint.modules.core.Connection; import com.simplito.java.privmx_endpoint.modules.event.EventApi; +import java.util.List; import java.util.Objects; public class StreamApi implements AutoCloseable { @@ -23,6 +26,8 @@ public StreamApi(Connection connection, EventApi eventApi) throws IllegalStateEx this.api = init(connection, eventApi); } + public native List subscribeFor(List subscriptionQueries); + @Override public void close() throws Exception { deinit(); From f6a033b3e2a22a202be4ddc287e378a5713dfc76 Mon Sep 17 00:00:00 2001 From: Doominika Date: Mon, 3 Nov 2025 10:41:18 +0100 Subject: [PATCH 2/4] feat: add StreamEventSelectorType and StreamEventType --- .../eventSelectorTypes/StreamEventSelectorType.java | 7 +++++++ .../model/events/eventTypes/StreamEventType.java | 11 +++++++++++ 2 files changed, 18 insertions(+) create mode 100644 privmx-endpoint/src/main/java/com/simplito/java/privmx_endpoint/model/events/eventSelectorTypes/StreamEventSelectorType.java create mode 100644 privmx-endpoint/src/main/java/com/simplito/java/privmx_endpoint/model/events/eventTypes/StreamEventType.java diff --git a/privmx-endpoint/src/main/java/com/simplito/java/privmx_endpoint/model/events/eventSelectorTypes/StreamEventSelectorType.java b/privmx-endpoint/src/main/java/com/simplito/java/privmx_endpoint/model/events/eventSelectorTypes/StreamEventSelectorType.java new file mode 100644 index 00000000..8d487955 --- /dev/null +++ b/privmx-endpoint/src/main/java/com/simplito/java/privmx_endpoint/model/events/eventSelectorTypes/StreamEventSelectorType.java @@ -0,0 +1,7 @@ +package com.simplito.java.privmx_endpoint.model.events.eventSelectorTypes; + +public enum StreamEventSelectorType implements EventSelectorType{ + CONTEXT_ID, + STREAMROOM_ID, + STREAM_ID +} diff --git a/privmx-endpoint/src/main/java/com/simplito/java/privmx_endpoint/model/events/eventTypes/StreamEventType.java b/privmx-endpoint/src/main/java/com/simplito/java/privmx_endpoint/model/events/eventTypes/StreamEventType.java new file mode 100644 index 00000000..54f7f7ad --- /dev/null +++ b/privmx-endpoint/src/main/java/com/simplito/java/privmx_endpoint/model/events/eventTypes/StreamEventType.java @@ -0,0 +1,11 @@ +package com.simplito.java.privmx_endpoint.model.events.eventTypes; + +public enum StreamEventType implements EventType{ + STREAMROOM_CREATE, + STREAMROOM_UPDATE, + STREAMROOM_DELETE, + STREAM_JOIN, + STREAM_LEAVE, + STREAM_PUBLISH, + STREAM_UNPUBLISH +} From 1f8e1ea1156e00d3b5aa5f2c1e9e5326601bb208 Mon Sep 17 00:00:00 2001 From: Doominika Date: Mon, 3 Nov 2025 10:42:07 +0100 Subject: [PATCH 3/4] feat: implement buildSubscriptionQuery method --- .../src/main/cpp/modules/StreamApi.cpp | 32 +++++++++++++++++++ .../modules/stream/StreamApi.java | 9 ++++++ 2 files changed, 41 insertions(+) diff --git a/privmx-endpoint/src/main/cpp/modules/StreamApi.cpp b/privmx-endpoint/src/main/cpp/modules/StreamApi.cpp index f84abe2b..0fb08e2e 100644 --- a/privmx-endpoint/src/main/cpp/modules/StreamApi.cpp +++ b/privmx-endpoint/src/main/cpp/modules/StreamApi.cpp @@ -95,4 +95,36 @@ Java_com_simplito_java_privmx_1endpoint_modules_stream_StreamApi_subscribeFor( return nullptr; } return result; +} + +extern "C" +JNIEXPORT jstring JNICALL +Java_com_simplito_java_privmx_1endpoint_modules_stream_StreamApi_buildSubscriptionQuery( + JNIEnv *env, + jobject thiz, + jlong event_type, + jlong selector_type, + jstring selector_id +) { + JniContextUtils ctx(env); + if (ctx.nullCheck(selector_id, "SelectorID")) { + return nullptr; + } + + jstring result = nullptr; + ctx.callResultEndpointApi( + &result, + [&ctx, &thiz, &event_type, &selector_type, &selector_id]() { + std::string query_result_c = getStreamApi(ctx, thiz)->buildSubscriptionQuery( + static_cast(event_type), + static_cast(selector_type), + ctx.jString2string(selector_id) + ); + return ctx->NewStringUTF(query_result_c.c_str()); + } + ); + if (ctx->ExceptionCheck()) { + return nullptr; + } + return result; } \ No newline at end of file diff --git a/privmx-endpoint/src/main/java/com/simplito/java/privmx_endpoint/modules/stream/StreamApi.java b/privmx-endpoint/src/main/java/com/simplito/java/privmx_endpoint/modules/stream/StreamApi.java index 3f68c00e..f1a39382 100644 --- a/privmx-endpoint/src/main/java/com/simplito/java/privmx_endpoint/modules/stream/StreamApi.java +++ b/privmx-endpoint/src/main/java/com/simplito/java/privmx_endpoint/modules/stream/StreamApi.java @@ -28,6 +28,15 @@ public StreamApi(Connection connection, EventApi eventApi) throws IllegalStateEx public native List subscribeFor(List subscriptionQueries); + public String buildSubscriptionQuery(StreamEventType eventType, StreamEventSelectorType selectorType, String selectorId) { + return buildSubscriptionQuery( + eventType.ordinal(), + selectorType.ordinal(), + selectorId + ); + } + + private native String buildSubscriptionQuery(long eventType, long selectorType, String selectorId); @Override public void close() throws Exception { deinit(); From 79ed6854bc66bb4cd25facf940f7636f41186f2b Mon Sep 17 00:00:00 2001 From: Doominika Date: Mon, 3 Nov 2025 10:42:54 +0100 Subject: [PATCH 4/4] feat: implement unsubscribeFrom method --- .../src/main/cpp/modules/StreamApi.cpp | 24 +++++++++++++++++++ .../modules/stream/StreamApi.java | 3 +++ 2 files changed, 27 insertions(+) diff --git a/privmx-endpoint/src/main/cpp/modules/StreamApi.cpp b/privmx-endpoint/src/main/cpp/modules/StreamApi.cpp index 0fb08e2e..ffb08194 100644 --- a/privmx-endpoint/src/main/cpp/modules/StreamApi.cpp +++ b/privmx-endpoint/src/main/cpp/modules/StreamApi.cpp @@ -127,4 +127,28 @@ Java_com_simplito_java_privmx_1endpoint_modules_stream_StreamApi_buildSubscripti return nullptr; } return result; +} + +extern "C" +JNIEXPORT void JNICALL +Java_com_simplito_java_privmx_1endpoint_modules_stream_StreamApi_unsubscribeFrom( + JNIEnv *env, + jobject thiz, + jobject subscription_ids +) { + JniContextUtils ctx(env); + if (ctx.nullCheck(subscription_ids, "Subscription IDs")) { + return; + } + + ctx.callVoidEndpointApi([&ctx, &thiz, &subscription_ids]() { + auto subscription_ids_arr = ctx.jObject2jArray(subscription_ids); + auto subscription_ids_c = jArrayToVector( + ctx, + subscription_ids_arr, + jobject2string + ); + + getStreamApi(ctx, thiz)->unsubscribeFrom(subscription_ids_c); + }); } \ No newline at end of file diff --git a/privmx-endpoint/src/main/java/com/simplito/java/privmx_endpoint/modules/stream/StreamApi.java b/privmx-endpoint/src/main/java/com/simplito/java/privmx_endpoint/modules/stream/StreamApi.java index f1a39382..191a6df9 100644 --- a/privmx-endpoint/src/main/java/com/simplito/java/privmx_endpoint/modules/stream/StreamApi.java +++ b/privmx-endpoint/src/main/java/com/simplito/java/privmx_endpoint/modules/stream/StreamApi.java @@ -37,6 +37,9 @@ public String buildSubscriptionQuery(StreamEventType eventType, StreamEventSelec } private native String buildSubscriptionQuery(long eventType, long selectorType, String selectorId); + + public native void unsubscribeFrom(List subscriptionIds); + @Override public void close() throws Exception { deinit();