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

Add hooks for onUnsubscribe, before unsubscribe happens. #26

Merged
merged 1 commit into from
Sep 29, 2020

Conversation

guilt
Copy link
Contributor

@guilt guilt commented Sep 28, 2020

I have created this pull request because I had an issue where I had to check if channel was valid/met some constraints, before unsubscribing from it, and cannot do this with onUnsubscribed(). Hence this PR.

Please see if you can get this behavior merged, would be very helpful. I currently maintain a vendored fork because of this.

@codecov-commenter
Copy link

codecov-commenter commented Sep 28, 2020

Codecov Report

Merging #26 into master will increase coverage by 0.07%.
The diff coverage is 11.11%.

Impacted file tree graph

@@            Coverage Diff             @@
##           master      #26      +/-   ##
==========================================
+ Coverage   70.25%   70.33%   +0.07%     
==========================================
  Files          26       26              
  Lines        2700     2353     -347     
==========================================
- Hits         1897     1655     -242     
+ Misses        639      541      -98     
+ Partials      164      157       -7     
Impacted Files Coverage Δ
client.go 83.20% <0.00%> (+1.38%) ⬆️
server.go 54.13% <14.28%> (+4.92%) ⬆️
pkg/packets/pingresp.go 46.15% <0.00%> (-6.79%) ⬇️
pkg/packets/disconnect.go 47.05% <0.00%> (-5.33%) ⬇️
pkg/packets/pingreq.go 40.00% <0.00%> (-5.00%) ⬇️
retained/trie/retain_trie.go 85.07% <0.00%> (-2.74%) ⬇️
pkg/packets/unsubscribe.go 67.50% <0.00%> (-2.72%) ⬇️
pkg/packets/unsuback.go 56.00% <0.00%> (-2.63%) ⬇️
subscription/trie/trie_db.go 79.20% <0.00%> (-2.46%) ⬇️
pkg/packets/connack.go 55.17% <0.00%> (-2.41%) ⬇️
... and 18 more

Continue to review full report at Codecov.

Legend - Click here to learn more
Δ = absolute <relative> (impact), ø = not affected, ? = missing data
Powered by Codecov. Last update 132bfa3...a19d6da. Read the comment docs.

@DrmagicE
Copy link
Owner

merged. Nice feature, thanks for your PR.
By the way, the MQTT v5 is under development, i will add this hook as well.

@DrmagicE DrmagicE merged commit 622fdd7 into DrmagicE:master Sep 29, 2020
@@ -667,6 +667,9 @@ func (client *client) unsubscribeHandler(unSub *packets.Unsubscribe) {
unSuback := unSub.NewUnSubBack()
client.write(unSuback)
for _, topicName := range unSub.Topics {
if srv.hooks.OnUnsubscribe != nil {
srv.hooks.OnUnsubscribe(context.Background(), client, topicName)
Copy link
Owner

Choose a reason for hiding this comment

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

Question here, what will you do if the topic is invalid? It seams the topic will still be unsubscribed.

Copy link
Contributor Author

Choose a reason for hiding this comment

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

I was using gmqttd as a proxy, because the hooks were very helpful. No, it doesn't help that there's no return type nor error condition, because all that stuff is in the hook (rest of the processing is ignored completely)

However, it makes sense to use return types such as nil / Error in addition to current values, even for the onSubscribe sort of hooks, because an error processing can allow us to prevent further processing, than just qos settings. I wanted this to currently be just that helpful lifecycle handler for now, but I do agree that there is more logic that could be added here.

The current answer may be to panic/recover but I would highly advise against that sort of code. :)

Copy link
Owner

Choose a reason for hiding this comment

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

However, it makes sense to use return types such as nil / Error in addition to current values, even for the onSubscribe sort of hooks, because an error processing can allow us to prevent further processing, than just qos settings

I agree. Because the v3.1.1 specification does not define "how to response the client when error happens", gmqtt cannot decide what to do when receiving an error from hooks. But you can close the client in the hook, which is the general solution for MQTT v3/v3.1.1.

MQTT v5 gives every acknowledgement packet a reason code and reason string which can use to inform the client when error happens, gmqtt will also add error return for most hooks to support such feature.

Copy link
Contributor Author

Choose a reason for hiding this comment

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

Thank you, and looking forward to that :-) May I request that you make an interim release (v0.1.3) if possible?

@DrmagicE
Copy link
Owner

@guilt no problem, done.

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.

3 participants