Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

uProtocol up-L1 1.5.8 #111

Merged
merged 1 commit into from
Jun 7, 2024
Merged

uProtocol up-L1 1.5.8 #111

merged 1 commit into from
Jun 7, 2024

Conversation

stevenhartley
Copy link

@stevenhartley stevenhartley commented May 7, 2024

The following includes all the L1 changes for 1.5.8, the new L2 APIs will be in a separate PR

#116

@stevenhartley stevenhartley marked this pull request as ready for review May 31, 2024 20:56
@eclipse-uprotocol-bot
Copy link
Contributor

fyi: I rebased that PR to trigger the codeql scan from the workflow and it seems to have been working fine.

*/
static UStatus publish(UTransport transport, UUri topic, Message message) {
Objects.requireNonNull(transport, UTransport.TRANSPORT_NULL_ERROR);
Objects.requireNonNull(topic, "Publish topic missing");
Copy link
Contributor

@neelam-kushwah neelam-kushwah Jun 4, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Would be good to define a constant instead of duplicating this literal "Publish topic missing"

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

maybe next commit :-)

Copy link
Contributor

@tamarafischer tamarafischer left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

not done - to be continued

* @param destination The destination to send the notification to.
* @return Returns the {@link UStatus} with the status of the notification.
*/
static UStatus notify(UTransport transport, UUri topic, UUri destination) {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

where is the notification payload?

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Message that is passed in the other static method. You could send notification with or without a payload

*/
static UStatus unregisterNotificationListener(UTransport transport, UUri topic, UListener listener) {
Objects.requireNonNull(transport, UTransport.TRANSPORT_NULL_ERROR);
return transport.unregisterListener(topic, Optional.of(transport.getSource()), listener);
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

same comment as before. functions that change mutate their parameters should not be needed.

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

L2 are wrappers for the transport, they are not meant to re-implement the transport

return UStatus.newBuilder().setCode(UCode.INTERNAL).build();
}
}

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

subscribe and unsubscribe are not supporting the SUBSCRIBE_PENDING scenario

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

hum... how do you see it should handle the SUBSCRIBE_PENDING scenario? This API only sends the subscription request and sets up the listener to receive the published messages, the application can then decide what it wants to do if the response is pending.

}
try {
switch (format) {
case UPAYLOAD_FORMAT_UNSPECIFIED: // Default is WRAPPED_IN_ANY
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

what about JSON and Base64String representations?

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This function only supports unpacking protobuf serialized messages right now

/**
* The unchecked exception which carries uProtocol error model.
*/
public class UStatusException extends RuntimeException {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

peronally am not a fan of exceptions and definitely not checked exceptions

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

hum... what should change here then?

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I don't think we can fully avoid exceptions and it is nice to have one which may carry status. CompletableFuture may be completed exceptionally and this can be used to propagate status...

*
* @return UUri containing the source address
*/
UUri getSource();
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

why does the uTransport interface have a getSource() method?
seems a little strange to couple this with something that is very technology specific

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

When the transport is instantiated, we tell it our source address (who we are), this is then pulled by the L2 wrapper interfaces, otherwise we have to pass this to each static method as well as the transport instance.

/**
* Builder for easy construction of the UAttributes object.
*/
public class UMessageBuilder {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this is replacing the protobuf UMessage?

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

No I'm still using uprotocol.v1.UMessage but this builds teh right type of UMessage (request, response, notification, publish).

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Now this may just be a vibes thing, but it feels like these unit tests are a bit too large... Each test seems to be doing a lot at once. Take this one for example:

    @Test
    public void test_to_from_message_from_response_cloudevent() {
        // additional attributes
        final UCloudEventAttributes uCloudEventAttributes = new UCloudEventAttributes.UCloudEventAttributesBuilder()
                .withPriority(UPriority.UPRIORITY_CS2)
                .withTtl(3)
                .build();
        //cloudevent
        final CloudEvent cloudEvent = CloudEventFactory.response(buildSourceForTest(),"//bo.cloud/2/1/0",
            UuidSerializer.serialize(UuidFactory.Factories.UPROTOCOL.factory().create()),
                Optional.of( buildProtoPayloadForTest()),
                uCloudEventAttributes);

        UMessage result = UCloudEvent.toMessage(cloudEvent);
        assertNotNull(result);
        assertTrue(UCloudEvent.getRequestId(cloudEvent).isPresent());
        assertEquals(UCloudEvent.getRequestId(cloudEvent).get(),
                UuidSerializer.serialize(result.getAttributes().getReqid()));
        assertTrue(UCloudEvent.getTtl(cloudEvent).isPresent());
        assertEquals(UCloudEvent.getTtl(cloudEvent).get(), result.getAttributes().getTtl());
        assertTrue(UCloudEvent.getSink(cloudEvent).isPresent());
        assertEquals(UCloudEvent.getSink(cloudEvent).get(),
                UriSerializer.serialize(result.getAttributes().getSink()));
        assertEquals(UCloudEvent.getPayload(cloudEvent).toByteString(),result.getPayload());
        assertEquals(UCloudEvent.getSource(cloudEvent),UriSerializer.serialize(result.getAttributes().getSource()));
        assertTrue(UCloudEvent.getPriority(cloudEvent).isPresent());
        assertEquals(UCloudEvent.getPriority(cloudEvent).get(), UCloudEvent.getCePriority(result.getAttributes().getPriority()));

        final CloudEvent cloudEvent1 = UCloudEvent.fromMessage(result);
        assertEquals(cloudEvent,cloudEvent1);
    }

Now, I understand what this test is doing, since I work with this library regularly. But, someone else would have trouble IMO, considering its size. For this test, I think it could be divided into 3 tests:

  1. Check if the fields are present
  2. Check if the decoded fields are equal
  3. Check if the fields are equal after the decoding.

Here's what I'm thinking of doing in up-python:

    def build_response_cloudevent(self):
        # additional attributes
        u_cloud_event_attributes = (
            UCloudEventAttributesBuilder()
            .with_ttl(3)
            .with_priority(UPriority.UPRIORITY_CS2)
            .build()
        )

        cloud_event = CloudEventFactory.response(
            build_uri_for_test(),
            "//bo.cloud/12345/1/531",
            CloudEventFactory.generate_cloud_event_id(),
            build_proto_payload_for_test(),
            u_cloud_event_attributes,
        )
        return cloud_event

    def test_message_presence_response_cloudevent(self):
        cloud_event = self.build_response_cloudevent()
        result = UCloudEvent.toMessage(cloud_event)
        self.assertIsNotNone(result)
        self.assertIsNotNone(UCloudEvent.get_request_id(cloud_event))
        self.assertIsNotNone(UCloudEvent.get_ttl(cloud_event))
        self.assertIsNotNone(UCloudEvent.get_sink(cloud_event))
        self.assertIsNotNone(UCloudEvent.get_payload(cloud_event))
        self.assertIsNotNone(UCloudEvent.get_source(cloud_event))
        self.assertIsNotNone(UCloudEvent.get_priority(cloud_event))

    def test_message_equality_response_cloudevent(self):
        cloud_event = self.build_response_cloudevent()
        result = UCloudEvent.toMessage(cloud_event)
        self.assertEqual(UCloudEvent.get_request_id(cloud_event), UuidSerializer.serialize(result.attributes.reqid))
        self.assertEqual(UCloudEvent.get_ttl(cloud_event), result.attributes.ttl)
        self.assertEqual(UCloudEvent.get_sink(cloud_event), UriSerializer.serialize(result.attributes.sink))
        self.assertEqual(UCloudEvent.get_payload(cloud_event).SerializeToString(), result.payload)
        self.assertEqual(UCloudEvent.get_source(cloud_event), UriSerializer().serialize(result.attributes.source))
        self.assertEqual(UCloudEvent.get_priority(cloud_event), UCloudEvent.get_ce_priority(result.attributes.priority))


    def test_message_reconversion_response_cloudevent(self):
        cloud_event = self.build_response_cloudevent()
        result = UCloudEvent.toMessage(cloud_event)
        cloud_event1 = UCloudEvent.fromMessage(result)
        self.assertEqual(cloud_event, cloud_event1)

It's certainly not something that needs to be "fixed" for this PR to get merged, but I think it may be good to take up some cleanup on the test cases in the future.

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@matthewd0123 I plan to reboot these methods once this PR is merged so I can properly implement 1.3.x <->1.5.x uProtocol translation functions and I plan to extract that from this UCloudEvent and will split the test cases up so they are easier to read

@stevenhartley stevenhartley force-pushed the uprotocol-1.5.8 branch 2 times, most recently from ace19f8 to 385e1cf Compare June 5, 2024 20:24
Copy link

github-actions bot commented Jun 5, 2024

Code coverage report is ready! 📈


CompletionStage<UPayload> responsePayload = new CompletableFuture<UPayload>();

transport.registerListener(methodUri, transport.getSource(), new UListener() {
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

For every call register a new instance of a listener against topic? It should be linked by request id instead, if you make more then one invoke of the same API how you know which listener to trigger upon receiving of responses?

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@mishap4 , OK I addressed this in the latest change by filtering in the listener by the reqid. This allows me to not have to introduce state and/or instance in L2. If this turns out to be a performance issue (because someone invokes the same
message for a thousand times in a row) then we will reevaluate the situation.

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

L2 changes have been pushed out to #117

/**
* The unchecked exception which carries uProtocol error model.
*/
public class UStatusException extends RuntimeException {
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I don't think we can fully avoid exceptions and it is nice to have one which may carry status. CompletableFuture may be completed exceptionally and this can be used to propagate status...

UCode.OK);

// Unregister the listener so we no longer receive notifications
assertEquals(Notifier.unregisterNotificationListener(transport, topic, listener),
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Where do you send notification to receive in this test?

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Example code only shows how to use the API

@r-vanooyen
Copy link

I cannot build on this branch

local state:

git status
On branch uprotocol-1.5.8
Your branch is up to date with 'origin/uprotocol-1.5.8'.

nothing to commit, working tree clean

git pull
Already up to date.

mvn --version
Apache Maven 3.9.7 (8b094c9513efc1b9ce2d952b3b9c8eaedaf8cbf0)
Maven home: /opt/homebrew/Cellar/maven/3.9.7/libexec
Java version: 17.0.11, vendor: Eclipse Adoptium, runtime: /Users/robinvanooyen/.sdkman/candidates/java/17.0.11-tem
Default locale: de_DE, platform encoding: UTF-8
OS name: "mac os x", version: "14.5", arch: "aarch64", family: "mac"

build

mvn clean install
...
[INFO] Running org.eclipse.uprotocol.communication.SubscriberTest
[ERROR] Tests run: 6, Failures: 0, Errors: 1, Skipped: 0, Time elapsed: 0.019 s <<< FAILURE! - in org.eclipse.uprotocol.communication.SubscriberTest
[ERROR] org.eclipse.uprotocol.communication.SubscriberTest.testUnsubscribeUnhappy  Time elapsed: 0.001 s  <<< ERROR!
java.lang.NoClassDefFoundError: org/eclipse/uprotocol/communication/SubscriberTest$UnHappyUnSubscribeUTransport (wrong name: org/eclipse/uprotocol/communication/SubscriberTest$UnhappyUnSubscribeUTransport)
        at org.eclipse.uprotocol.communication.SubscriberTest.testUnsubscribeUnhappy(SubscriberTest.java:87)
...
[INFO] Results:
[INFO] 
[ERROR] Errors: 
[ERROR]   SubscriberTest.testUnsubscribeUnhappy:87 NoClassDefFound org/eclipse/uprotocol...
[INFO] 
[ERROR] Tests run: 380, Failures: 0, Errors: 1, Skipped: 0
[INFO] 
[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  8.664 s
[INFO] Finished at: 2024-06-06T10:52:36+02:00
[INFO] ------------------------------------------------------------------------

Copy link
Contributor

@neelam-kushwah neelam-kushwah left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@stevenhartley, I am also getting the same exception as @r-vanooyen is facing. I suspect our build issues on Windows are due to case sensitivity conflicts with class names. Since Windows is case-insensitive by default, unlike Unix-based systems, this is causing problems. Specifically, the SubscriberTest class has two inner classes named UnhappyUnSubscribeUTransport and UnHappyUnSubscribeUTransport. Please rename one of these classes to resolve the issue.

image

* with the failure if the subscription was not successful. The API will also register the listener to be
* called when messages are received.
*
* @param topic The topic to subscribe to.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

missing transport param

* The subscriber no longer wishes to be subscribed to said topic so we issue a unsubscribe
* request to the USubscription service.
*
* @param topic The topic to unsubscribe to.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

missing transport param

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

fixed

* <b>IMPORTANT NOTE:</b> If {@link UPayloadFormat} is not {@link UPAYLOAD_FORMAT_PROTOBUF_WRAPPED_IN_ANY},
* there is no guarantee that the parsing to T is correct as we do not have the data schema.
*
* @param payload the payload to unpack

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

params here don't match

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

fixed

Copy link

github-actions bot commented Jun 7, 2024

Code coverage report is ready! 📈

@stevenhartley
Copy link
Author

I cannot build on this branch

local state:

git status
On branch uprotocol-1.5.8
Your branch is up to date with 'origin/uprotocol-1.5.8'.

nothing to commit, working tree clean

git pull
Already up to date.

mvn --version
Apache Maven 3.9.7 (8b094c9513efc1b9ce2d952b3b9c8eaedaf8cbf0)
Maven home: /opt/homebrew/Cellar/maven/3.9.7/libexec
Java version: 17.0.11, vendor: Eclipse Adoptium, runtime: /Users/robinvanooyen/.sdkman/candidates/java/17.0.11-tem
Default locale: de_DE, platform encoding: UTF-8
OS name: "mac os x", version: "14.5", arch: "aarch64", family: "mac"

build

mvn clean install
...
[INFO] Running org.eclipse.uprotocol.communication.SubscriberTest
[ERROR] Tests run: 6, Failures: 0, Errors: 1, Skipped: 0, Time elapsed: 0.019 s <<< FAILURE! - in org.eclipse.uprotocol.communication.SubscriberTest
[ERROR] org.eclipse.uprotocol.communication.SubscriberTest.testUnsubscribeUnhappy  Time elapsed: 0.001 s  <<< ERROR!
java.lang.NoClassDefFoundError: org/eclipse/uprotocol/communication/SubscriberTest$UnHappyUnSubscribeUTransport (wrong name: org/eclipse/uprotocol/communication/SubscriberTest$UnhappyUnSubscribeUTransport)
        at org.eclipse.uprotocol.communication.SubscriberTest.testUnsubscribeUnhappy(SubscriberTest.java:87)
...
[INFO] Results:
[INFO] 
[ERROR] Errors: 
[ERROR]   SubscriberTest.testUnsubscribeUnhappy:87 NoClassDefFound org/eclipse/uprotocol...
[INFO] 
[ERROR] Tests run: 380, Failures: 0, Errors: 1, Skipped: 0
[INFO] 
[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  8.664 s
[INFO] Finished at: 2024-06-06T10:52:36+02:00
[INFO] ------------------------------------------------------------------------

I cannot build on this branch

local state:

git status
On branch uprotocol-1.5.8
Your branch is up to date with 'origin/uprotocol-1.5.8'.

nothing to commit, working tree clean

git pull
Already up to date.

mvn --version
Apache Maven 3.9.7 (8b094c9513efc1b9ce2d952b3b9c8eaedaf8cbf0)
Maven home: /opt/homebrew/Cellar/maven/3.9.7/libexec
Java version: 17.0.11, vendor: Eclipse Adoptium, runtime: /Users/robinvanooyen/.sdkman/candidates/java/17.0.11-tem
Default locale: de_DE, platform encoding: UTF-8
OS name: "mac os x", version: "14.5", arch: "aarch64", family: "mac"

build

mvn clean install
...
[INFO] Running org.eclipse.uprotocol.communication.SubscriberTest
[ERROR] Tests run: 6, Failures: 0, Errors: 1, Skipped: 0, Time elapsed: 0.019 s <<< FAILURE! - in org.eclipse.uprotocol.communication.SubscriberTest
[ERROR] org.eclipse.uprotocol.communication.SubscriberTest.testUnsubscribeUnhappy  Time elapsed: 0.001 s  <<< ERROR!
java.lang.NoClassDefFoundError: org/eclipse/uprotocol/communication/SubscriberTest$UnHappyUnSubscribeUTransport (wrong name: org/eclipse/uprotocol/communication/SubscriberTest$UnhappyUnSubscribeUTransport)
        at org.eclipse.uprotocol.communication.SubscriberTest.testUnsubscribeUnhappy(SubscriberTest.java:87)
...
[INFO] Results:
[INFO] 
[ERROR] Errors: 
[ERROR]   SubscriberTest.testUnsubscribeUnhappy:87 NoClassDefFound org/eclipse/uprotocol...
[INFO] 
[ERROR] Tests run: 380, Failures: 0, Errors: 1, Skipped: 0
[INFO] 
[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  8.664 s
[INFO] Finished at: 2024-06-06T10:52:36+02:00
[INFO] ------------------------------------------------------------------------

I cannot build on this branch

local state:

git status
On branch uprotocol-1.5.8
Your branch is up to date with 'origin/uprotocol-1.5.8'.

nothing to commit, working tree clean

git pull
Already up to date.

mvn --version
Apache Maven 3.9.7 (8b094c9513efc1b9ce2d952b3b9c8eaedaf8cbf0)
Maven home: /opt/homebrew/Cellar/maven/3.9.7/libexec
Java version: 17.0.11, vendor: Eclipse Adoptium, runtime: /Users/robinvanooyen/.sdkman/candidates/java/17.0.11-tem
Default locale: de_DE, platform encoding: UTF-8
OS name: "mac os x", version: "14.5", arch: "aarch64", family: "mac"

build

mvn clean install
...
[INFO] Running org.eclipse.uprotocol.communication.SubscriberTest
[ERROR] Tests run: 6, Failures: 0, Errors: 1, Skipped: 0, Time elapsed: 0.019 s <<< FAILURE! - in org.eclipse.uprotocol.communication.SubscriberTest
[ERROR] org.eclipse.uprotocol.communication.SubscriberTest.testUnsubscribeUnhappy  Time elapsed: 0.001 s  <<< ERROR!
java.lang.NoClassDefFoundError: org/eclipse/uprotocol/communication/SubscriberTest$UnHappyUnSubscribeUTransport (wrong name: org/eclipse/uprotocol/communication/SubscriberTest$UnhappyUnSubscribeUTransport)
        at org.eclipse.uprotocol.communication.SubscriberTest.testUnsubscribeUnhappy(SubscriberTest.java:87)
...
[INFO] Results:
[INFO] 
[ERROR] Errors: 
[ERROR]   SubscriberTest.testUnsubscribeUnhappy:87 NoClassDefFound org/eclipse/uprotocol...
[INFO] 
[ERROR] Tests run: 380, Failures: 0, Errors: 1, Skipped: 0
[INFO] 
[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  8.664 s
[INFO] Finished at: 2024-06-06T10:52:36+02:00
[INFO] ------------------------------------------------------------------------

Hum, @r-vanooyen can you try again? I don't seem to have any build issues on my side.

Copy link

github-actions bot commented Jun 7, 2024

Code coverage report is ready! 📈

Copy link

github-actions bot commented Jun 7, 2024

Code coverage report is ready! 📈

Copy link

github-actions bot commented Jun 7, 2024

Code coverage report is ready! 📈

@stevenhartley
Copy link
Author

@neelam-kushwah & @r-vanooyen , I fixed the issue, thanks for the hint @neelam-kushwah!

Copy link

github-actions bot commented Jun 7, 2024

Code coverage report is ready! 📈

Copy link

github-actions bot commented Jun 7, 2024

Code coverage report is ready! 📈

Copy link

github-actions bot commented Jun 7, 2024

Code coverage report is ready! 📈

}
CallOptions that = (CallOptions) obj;
return mTimeout == that.mTimeout && mPriority == that.mPriority && mToken.equals(that.mToken);
}
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

also need to override hashcode() when override equals()

In 1.5.8 we have made the following changes:

- URI: Condense definitions to a single form removing long and
  micro forms. Simplified the predicates to be easier to use

- Updates to uTransport API to support pattern matching for all message
  types

- Updates to UAttributes data model and removed UPayload placing the
  format in the header and the payload data directly in UMessage

- Full 100% code coverage and test

- Numerous linting and style fixes and corrections

- Switch to Java 17 from Java 11 for CI builds

- Refactoring uProtocol custom options into uoptions.proto to add SOME/IP
  serialization support and explicit topic declaration

- Removed Optional variables passing to methods

 #116
Copy link

github-actions bot commented Jun 7, 2024

Code coverage report is ready! 📈

@stevenhartley stevenhartley changed the title uProtocol 1.5.8 Branch uProtocol up-L1 1.5.8 Jun 7, 2024
@stevenhartley stevenhartley merged commit 89b735a into main Jun 7, 2024
5 checks passed
@stevenhartley stevenhartley deleted the uprotocol-1.5.8 branch June 7, 2024 17:27
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

8 participants