On 10/26/2013 04:11 PM, Matthew Toseland wrote:
> On 25/10/13 02:05, xor wrote:
>> Hi,
>> the last remaining TODO of merging the "event-notifications" branch of WOT 
>> to 
>> the master branch is to ask you guys for your opinion on whether you are OK 
>> with the FCP API. This mail does that.

Glad to see it - thank you for writing all this up!

>> Short summary of what event-notifications provides: Before 
>> event-notifications, 
>> a WOT client would be implemented by periodically polling WOT for identities 
>> / 
>> trusts / scores. This caused a lot of database queries and made everything 
>> slow and laggy.
>> With event-notifications, clients of WOT subscribe to types of objects which 
>> they are interested in: Identities / Trusts / Scores / and in the future 
>> introduction puzzles. WOT will then send all known objects at time of 
>> subscripion once, and afterwards keep the client up to date by only sending 
>> single objects as they are changed (= as an event happens). This causes 
>> database
>> and network traffic only to happen when there is an actual need for it.

This seems concerning to me. It is a very odd client application that
wants to pull in WoT's entire view of the web of trust. I assume this
means the initial state of all things matching a query, and
notifications are sent whenever the results change?

Having the ability to subscribe to everything or an entire category of
things - though very odd - I am okay with, if only because it's
convenient for debugging. A condition of "*" or something would be fine.

>> I originally wanted to link you to the JavaDoc but we currently do not have 
>> a 
>> proper way of auto-generating it on a webserver.

For Fred the build scripts update it on release:
https://github.com/freenet/scripts/blob/master/release-fred#L199

>> I had a better idea though: The end of this  mail will contain a dump of the 
>> FCP traffic between a client of event-notifications and WOT. So you can have
>> a look at how the communication typically looks.
>> Before that, there will be a copy-pasta of the JavaDoc of the "Subscribe" 
>> FCP 
>> function - this is the initial function which enables event-notifications. 
>> Its 
>> JavaDoc will give you a rough idea of how to interpret the following FCP 
>> dump.
>>
>> NOTICE: Even though by this mail significant effort is being spent on making 
>> FCP 
>> easy to use by client authors, you should only implement an actual FCP 
>> client 
>> as a last resort: I've done the job of implementing a Java class 
>> "FCPClientReferenceImplementation" which serves the purpose of providing a 
>> reference client to event-notifications. This took around 3 weeks, is ~1000 
>> lines and very thoroughly tested. Please use it.

Very nice! I think this is an excellent layer of separation to have.
Client applications should not always have to deal with parsing text to
do WoT things. Maybe this interface could even be cleanly replaced in
the future with something more direct where appropriate like OSGi?

>>
>> FCP "Subscribe" JavaDoc (removed some uninteresting parts):
>> ------------------------------------------------------------------------------
>> Processes the "Subscribe" FCP message, filing a {@link Subscription} to 
>> event-{@link Notification}s via {@link SubscriptionManager}.

So far so good.

>> Required fields:
>> "To" = "Identities" | "Trusts" | "Scores" - chooses among {@link 
>> IdentitiesSubscription} / {@link TrustsSubscription} / 
>> {@link ScoresSubscription}.

It took me a few minutes to understand that this means that the "To"
field can be one of the values "Identities", "Trusts", or "Scores". It'd
be helpful if it was clearer somehow. Maybe: To =
[Identities|Trusts|Scores] ? Maybe just English.

Is my understanding correct that this is an internal WoT function for
parsing FCP from clients, and not a part of the reference event
notifications client? It's just for understanding the FCP fields in use?

>> Reply:
>> The reply consists of two separate FCP messages:
>> The first message is "Message" = "Identities" | "Trusts" | "Scores".
>> It contains the full dataset of the type you have subscribed to. 
>> By storing this dataset, your client is completely synchronized with WOT. 
>> Upon 
>> changes of anything, WOT will only have to send
>> the single {@link Identity}/{@link Trust}/{@link Score} object which has 
>> changed for your client to be fully synchronized again.

WoT is synchronizing entire categories of stuff? Always sending
everything is insanity. I really think WoT should allow much more
selectiveness. The concept of keeping state up to date with an initial
synchronization and subsequent notifications is great, but this
returning too much information in a way that requires a lot of
additional processing to be useful. Requiring such processing invites
another wave of duplicate implementations of WoT-wrangling code in clients.

Were I writing a client I think I'd be interested in WoT sending me
updates on things like "identities with a Sone context that have a score
higher than 0 from the perspective of local identity XYZ."

>> This message is send via the synchronous FCP-API: You can signal that 
>> processing it failed by returning an error in the FCP message processor. 
>> This 
>> allows your client to be programmed in a transactional style: If part of the 
>> transaction which
>> stores the dataset fails, you can just roll it back and signal the error to 
>> WOT. It will rollback the subscription then and
>> send an "Error" message, indicating that subscribing failed. You must file 
>> another subscription attempt then.

This sounds like it's just for debugging purposes. Is there a way in
which failure to apply an incremental change to the state is not a bug?

>> The second message is formatted as:
>> "Message" = "Subscribed"
>> "SubscriptionID" = Random {@link UUID} of the Subscription.
>> "To" = Same as the "To" field of your original message.

I'm curious why this ID is not in the first message? Why two messages?

>> Errors:
>> If you are already subscribed to the selected type, you will only receive a 
>> message:
>> "Message" = "Error"
>> "Description" = 
>> "plugins.WebOfTrust.SubscriptionManager$SubscriptionExistsAlreadyException"
>> "SubscriptionID" = Same as in the original "Subscribed" message
>> "To" = Same as you requested
>> "OriginalMessage" = "Subscribe"

Would it be appropriate to have an error code so that some error types
can be machine-readable? I remember running into difficulties with this
sort of thing with my Infocalypse patches.

>> {@link Notification}s:
>> Further  messages will be sent at any time in the future if an {@link 
>> Identity} / {@link Trust} / {@link Score}
>> object has changed. They will contain the version of the object before the 
>> change and after the change.

Is there a reason to contain the before? Is it to relieve the client of
having to store all values to see how much the change was?

>> These messages are also send with the synchronous FCP API. In opposite to 
>> the 
>> initial synchronization message, by replying with failure to the synchronous 
>> FCP call, you can signal that you want to receive the same notification 
>> again.

This is inconsistent, and it is confusing to me. If there is not an
error during transmission what could resending a message achieve? The
client already got the message.

>> After a typical delay of {@link 
>> SubscriptionManager#PROCESS_NOTIFICATIONS_DELAY}, it will be re-sent.
>> There is a maximal amount of {@link 
>> SubscriptionManager#DISCONNECT_CLIENT_AFTER_FAILURE_COUNT} failures per FCP-
>> Client.
>> If you exceed this limit, your subscriptions will be terminated. You will 
>> receive an "Unsubscribed" message then as long as your client has not 
>> terminated the FCP connection. See {@link 
>> #handleUnsubscribe(SimpleFieldSet)}.
>> The fact that you can request a notification to be re-sent may also be used 
>> to 
>> program your client in a transactional style.
>> If the transaction which processes an event-notification fails, you can 
>> indicate failure to the synchronous FCP sender and
>> WOT will then re-send the notification, causing the transaction to be 
>> retried.

The notion of resending enabling transactional state changes seems at
odds with being unsubscribed after hitting a limit on them. I'm still
not clear on how re-sending could help any kind of error.

>> If your client is shutting down or not interested in the subscription 
>> anymore, 
>> you should send an "Unsubscribe" message.
>> See {@link #handleUnsubscribe(SimpleFieldSet)}. This will make sure that WOT 
>> stops gathering data for your subscription,
>> which would be expensive to do if its not even needed. But if you cannot 
>> send 
>> the message anymore due to a dropped connection,
>> the subscription will be terminated automatically after some time due to 
>> notification-deployment failing. Nevertheless,
>> please always unsubscribe when possible.

Does WoT not have visibility on when FCP connections close? How does WoT
handle pushing messages over FCP? I had to jump through hoops to do that
with Infocalypse.

>> ------------------------------------------------------------------------------
>>
>> FCP dump of a typical connection which subscribes to all types of objects::
>> (Notice that the duplicate fields are for backwards compatibility with old 
>> clients.
>> They are present even in event-notifications because the functions for 
>> generating
>> FCP data are re-used in different areas of code.)
>> ------------------------------------------------------------------------------
>> ---------------- Fri Oct 25 02:14:07 CEST 2013 Connected. ---------------- 
>> ---------------- Fri Oct 25 02:14:07 CEST 2013 Sent: ---------------- 
>> Message=Subscribe
>> To=Identities
>> End

I guess it makes sense that it needs no more information if there are
three predetermined things a client can subscribe to.

>> ---------------- Fri Oct 25 02:14:08 CEST 2013 Received: ---------------- 
>> Message=Identities
>> Identities.Amount=5
>> Identities.0.CurrentEditionFetchState=NotFetched
>> Identities.0.ID=QeTBVWTwBldfI-lrF~xf0nqFVDdQoSUghT~PvhyJ1NE
>> Identities.0.Identity=QeTBVWTwBldfI-lrF~xf0nqFVDdQoSUghT~PvhyJ1NE
>> Identities.0.PublishesTrustList=true
>> Identities.0.RequestURI=USK@QeTBVWTwBldfI-
>> lrF~xf0nqFVDdQoSUghT~PvhyJ1NE,OjEywGD063La2H-
>> IihD7iYtZm3rC0BP6UTvvwyF5Zh4,AQACAAE/WebOfTrust/1344
>> Identities.0.Type=Identity
>> Identities.0.Contexts.Amount=0
>> Identities.0.Properties.Amount=0
>> Identities.1.CurrentEditionFetchState=NotFetched
>> Identities.1.ID=D3MrAR-AVMqKJRjXnpKW2guW9z1mw5GZ9BB15mYVkVc
>> Identities.1.Identity=D3MrAR-AVMqKJRjXnpKW2guW9z1mw5GZ9BB15mYVkVc
>> Identities.1.PublishesTrustList=true
>> Identities.1.RequestURI=USK@D3MrAR-
>> AVMqKJRjXnpKW2guW9z1mw5GZ9BB15mYVkVc,xgddjFHx2S~5U6PeFkwqO5V~1gZngFLoM-
>> xaoMKSBI8,AQACAAE/WebOfTrust/4959
>> Identities.1.Type=Identity
>> Identities.1.Contexts.Amount=0
>> Identities.1.Properties.Amount=0
>> Identities.2.CurrentEditionFetchState=NotFetched
>> Identities.2.ID=s88mAwLB3OW6mYlZ43XaHDM1K6QXosZ4QTt2UX-hq6s
>> Identities.2.Identity=s88mAwLB3OW6mYlZ43XaHDM1K6QXosZ4QTt2UX-hq6s
>> Identities.2.PublishesTrustList=true
>> Identities.2.RequestURI=USK@s88mAwLB3OW6mYlZ43XaHDM1K6QXosZ4QTt2UX-
>> hq6s,555tpw1TUReXUixAMDQD3RcD6gUKwOBCDQ6Dot2v6qg,AQACAAE/WebOfTrust/5
>> Identities.2.Type=Identity
>> Identities.2.Contexts.Amount=0
>> Identities.2.Properties.Amount=0
>> Identities.3.CurrentEditionFetchState=NotFetched
>> Identities.3.ID=z9dv7wqsxIBCiFLW7VijMGXD9Gl-EXAqBAwzQ4aq26s
>> Identities.3.Identity=z9dv7wqsxIBCiFLW7VijMGXD9Gl-EXAqBAwzQ4aq26s
>> Identities.3.PublishesTrustList=true
>> Identities.3.RequestURI=USK@z9dv7wqsxIBCiFLW7VijMGXD9Gl-
>> EXAqBAwzQ4aq26s,4Uvc~Fjw3i9toGeQuBkDARUV5mF7OTKoAhqOA9LpNdo,AQACAAE/WebOfTrust/1270
>> Identities.3.Type=Identity
>> Identities.3.Contexts.Amount=0
>> Identities.3.Properties.Amount=0
>> Identities.4.CurrentEditionFetchState=NotFetched
>> Identities.4.ID=o2~q8EMoBkCNEgzLUL97hLPdddco9ix1oAnEa~VzZtg
>> Identities.4.Identity=o2~q8EMoBkCNEgzLUL97hLPdddco9ix1oAnEa~VzZtg
>> Identities.4.PublishesTrustList=true
>> Identities.4.RequestURI=USK@o2~q8EMoBkCNEgzLUL97hLPdddco9ix1oAnEa~VzZtg,X~vTpL2LSyKvwQoYBx~eleI2RF6QzYJpzuenfcKDKBM,AQACAAE/WebOfTrust/9379
>> Identities.4.Type=Identity
>> Identities.4.Contexts.Amount=0
>> Identities.4.Properties.Amount=0
>> End

It seems evident that actual responses will be orders of magnitude larger.

Why are both Identity and ID specified as the same thing? I was under
the impression is is an identity ID - would just ID be okay? IIRC it's
already not going to be backwards-compatible with existing clients due
to the full stops between key segments.

What are Contexts.Amount and Properties.Amount for? The number of each
that are given? I think "Count" might be a clearer name.

>> ---------------- Fri Oct 25 02:14:08 CEST 2013 Received: ---------------- 
>> Message=Subscribed
>> SubscriptionID=19b22c4e-b902-4e1a-8dfd-704499ce3fe2
>> To=Identities
>> End
>>
>> ---------------- Fri Oct 25 02:14:08 CEST 2013 Sent: ---------------- 
>> Message=Subscribe
>> To=Trusts
>> End
>>
>> ---------------- Fri Oct 25 02:14:08 CEST 2013 Received: ---------------- 
>> Message=Trusts
>> Trusts.Amount=0
>> End
>>
>> ---------------- Fri Oct 25 02:14:08 CEST 2013 Received: ---------------- 
>> Message=Subscribed
>> SubscriptionID=c27ef403-2550-41be-bb35-42c5886729f5
>> To=Trusts
>> End
>>
>> ---------------- Fri Oct 25 02:14:08 CEST 2013 Sent: ---------------- 
>> Message=Subscribe
>> To=Scores
>> End
>>
>> ---------------- Fri Oct 25 02:14:08 CEST 2013 Received: ---------------- 
>> Message=Scores
>> Scores.Amount=0
>> End
>>
>> ---------------- Fri Oct 25 02:14:08 CEST 2013 Received: ---------------- 
>> Message=Subscribed
>> SubscriptionID=031f7f79-3487-455b-9a91-78cec7e72d79
>> To=Scores
>> End
>>
>> ---------------- Fri Oct 25 02:15:20 CEST 2013 Received: ---------------- 
>> Message=IdentityChangedNotification
>> AfterChange.Context0=Introduction

I think a key of AfterChange.Context.0 would be preferable for
consistent separation of the number. Why isn't there an
AfterChange.Context (without the trailing 0) like the other fields?

>> AfterChange.CurrentEditionFetchState=Fetched
>> AfterChange.CurrentEditionFetchState0=Fetched

I'm confused why these and others are duplicated save for a 0 on the end
of the key. Where are the meanings of the possible values for fields
like this documented?

>> AfterChange.ID=WNOyZsnZtpFjwmwfVBqC1PhSeg-hErXHlkrR43h0tiU
>> AfterChange.ID0=WNOyZsnZtpFjwmwfVBqC1PhSeg-hErXHlkrR43h0tiU
>> AfterChange.Identity=WNOyZsnZtpFjwmwfVBqC1PhSeg-hErXHlkrR43h0tiU
>> AfterChange.Identity0=WNOyZsnZtpFjwmwfVBqC1PhSeg-hErXHlkrR43h0tiU
>> AfterChange.InsertURI=USK@AILRi~9nfD2pesTkeDvwZxe3cRmkY7Q00CUxQyUOVW-
>> H,GzEIwcFQ78J7-RCzxgvY4Pfq0T8Lm4v0BazjMtkqT~8,AQECAAE/WebOfTrust/0
>> AfterChange.InsertURI0=USK@AILRi~9nfD2pesTkeDvwZxe3cRmkY7Q00CUxQyUOVW-
>> H,GzEIwcFQ78J7-RCzxgvY4Pfq0T8Lm4v0BazjMtkqT~8,AQECAAE/WebOfTrust/0
>> AfterChange.Nickname=Alexandre_Umpleby
>> AfterChange.Nickname0=Alexandre_Umpleby
>> AfterChange.PublishesTrustList=true
>> AfterChange.PublishesTrustList0=true
>> AfterChange.RequestURI=USK@WNOyZsnZtpFjwmwfVBqC1PhSeg-
>> hErXHlkrR43h0tiU,GzEIwcFQ78J7-
>> RCzxgvY4Pfq0T8Lm4v0BazjMtkqT~8,AQACAAE/WebOfTrust/0
>> AfterChange.RequestURI0=USK@WNOyZsnZtpFjwmwfVBqC1PhSeg-
>> hErXHlkrR43h0tiU,GzEIwcFQ78J7-
>> RCzxgvY4Pfq0T8Lm4v0BazjMtkqT~8,AQACAAE/WebOfTrust/0
>> AfterChange.Type=OwnIdentity
>> AfterChange.Type0=OwnIdentity

Would this API change be a place to change the name to LocalIdentity?

>> AfterChange.Contexts.Amount=1
>> AfterChange.Contexts.0.Name=Introduction
>> AfterChange.Contexts0.Amount=1
>> AfterChange.Contexts0.Context0=Introduction

I notice - for example - "Contexts" is plural and in the initial sync
message "Identity" is singular. It'd make sense to me to make the
components consistently one way or another. I have a preference for
singular because it's shorter.

>> AfterChange.Identities.Amount=1
>> AfterChange.Identities.0.Context0=Introduction
>> AfterChange.Identities.0.CurrentEditionFetchState=Fetched
>> AfterChange.Identities.0.ID=WNOyZsnZtpFjwmwfVBqC1PhSeg-hErXHlkrR43h0tiU
>> AfterChange.Identities.0.Identity=WNOyZsnZtpFjwmwfVBqC1PhSeg-hErXHlkrR43h0tiU
>> AfterChange.Identities.0.InsertURI=USK@AILRi~9nfD2pesTkeDvwZxe3cRmkY7Q00CUxQyUOVW-
>> H,GzEIwcFQ78J7-RCzxgvY4Pfq0T8Lm4v0BazjMtkqT~8,AQECAAE/WebOfTrust/0
>> AfterChange.Identities.0.Nickname=Alexandre_Umpleby
>> AfterChange.Identities.0.PublishesTrustList=true
>> AfterChange.Identities.0.RequestURI=USK@WNOyZsnZtpFjwmwfVBqC1PhSeg-
>> hErXHlkrR43h0tiU,GzEIwcFQ78J7-
>> RCzxgvY4Pfq0T8Lm4v0BazjMtkqT~8,AQACAAE/WebOfTrust/0
>> AfterChange.Identities.0.Type=OwnIdentity
>> AfterChange.Identities.0.Contexts.Amount=1
>> AfterChange.Identities.0.Contexts.0.Name=Introduction

The ".Name" part seems unnecessary to me.

>> AfterChange.Identities.0.Properties.Amount=1
>> AfterChange.Identities.0.Properties.0.Name=IntroductionPuzzleCount
>> AfterChange.Identities.0.Properties.0.Value=10

How about AfterChange.Identity.0.Property.IntroductionPuzzleCount=10 ?

>> AfterChange.Identities.0.Property0.Name=IntroductionPuzzleCount
>> AfterChange.Identities.0.Property0.Value=10
>> AfterChange.Properties.Amount=1
>> AfterChange.Properties.0.Name=IntroductionPuzzleCount
>> AfterChange.Properties.0.Value=10
>> AfterChange.Properties0.Amount=1
>> AfterChange.Properties0.Property0.Name=IntroductionPuzzleCount
>> AfterChange.Properties0.Property0.Value=10
>> AfterChange.Property0.Name=IntroductionPuzzleCount
>> AfterChange.Property0.Value=10
>> BeforeChange.Type=Inexistent
>> BeforeChange.Type0=Inexistent
>> BeforeChange.Identities.0.Type=Inexistent

It looks like "inexistent" is actually a word, but it's not one that I
knew. I'd have expected "nonexistent." This may be a place where
including the "before" value can lead to odd corner cases, and I wonder
if it's worth including. Instead of a word, would it make sense to have
an empty string?

Why isn't there a BeforeChange for every AfterChange?

>> End
>>
>> ---------------- Fri Oct 25 02:15:21 CEST 2013 Received: ---------------- 
>> Message=ScoreChangedNotification
>> AfterChange.Scores.Amount=1
>> AfterChange.Scores.0.Capacity=100

What does capacity mean here?

>> AfterChange.Scores.0.Rank=0
>> AfterChange.Scores.0.Trustee=WNOyZsnZtpFjwmwfVBqC1PhSeg-hErXHlkrR43h0tiU
>> AfterChange.Scores.0.Truster=WNOyZsnZtpFjwmwfVBqC1PhSeg-hErXHlkrR43h0tiU
>> AfterChange.Scores.0.Value=2147483647
>> BeforeChange.Scores.0.Value=Inexistent
>> End
>>
>> ---------------- Fri Oct 25 02:15:21 CEST 2013 Received: ---------------- 
>> Message=TrustChangedNotification
>> AfterChange.Trusts.Amount=1
>> AfterChange.Trusts.0.Comment=Automatically assigned trust to a seed identity.
>> AfterChange.Trusts.0.Trustee=QeTBVWTwBldfI-lrF~xf0nqFVDdQoSUghT~PvhyJ1NE
>> AfterChange.Trusts.0.Truster=WNOyZsnZtpFjwmwfVBqC1PhSeg-hErXHlkrR43h0tiU
>> AfterChange.Trusts.0.TrusterEdition=0
>> AfterChange.Trusts.0.Value=100
>> BeforeChange.Trusts.0.Value=Inexistent
>> End
>>
>> ---------------- Fri Oct 25 02:15:21 CEST 2013 Received: ---------------- 
>> Message=TrustChangedNotification
>> AfterChange.Trusts.Amount=1
>> AfterChange.Trusts.0.Comment=Automatically assigned trust to a seed identity.
>> AfterChange.Trusts.0.Trustee=z9dv7wqsxIBCiFLW7VijMGXD9Gl-EXAqBAwzQ4aq26s
>> AfterChange.Trusts.0.Truster=WNOyZsnZtpFjwmwfVBqC1PhSeg-hErXHlkrR43h0tiU
>> AfterChange.Trusts.0.TrusterEdition=0
>> AfterChange.Trusts.0.Value=100
>> BeforeChange.Trusts.0.Value=Inexistent
>> End
>>
>> ---------------- Fri Oct 25 02:15:21 CEST 2013 Received: ---------------- 
>> Message=TrustChangedNotification
>> AfterChange.Trusts.Amount=1
>> AfterChange.Trusts.0.Comment=Automatically assigned trust to a seed identity.
>> AfterChange.Trusts.0.Trustee=o2~q8EMoBkCNEgzLUL97hLPdddco9ix1oAnEa~VzZtg
>> AfterChange.Trusts.0.Truster=WNOyZsnZtpFjwmwfVBqC1PhSeg-hErXHlkrR43h0tiU
>> AfterChange.Trusts.0.TrusterEdition=0
>> AfterChange.Trusts.0.Value=100
>> BeforeChange.Trusts.0.Value=Inexistent
>> End
>>
>> ---------------- Fri Oct 25 02:15:21 CEST 2013 Received: ---------------- 
>> Message=TrustChangedNotification
>> AfterChange.Trusts.Amount=1
>> AfterChange.Trusts.0.Comment=Automatically assigned trust to a seed identity.
>> AfterChange.Trusts.0.Trustee=D3MrAR-AVMqKJRjXnpKW2guW9z1mw5GZ9BB15mYVkVc
>> AfterChange.Trusts.0.Truster=WNOyZsnZtpFjwmwfVBqC1PhSeg-hErXHlkrR43h0tiU
>> AfterChange.Trusts.0.TrusterEdition=0
>> AfterChange.Trusts.0.Value=100
>> BeforeChange.Trusts.0.Value=Inexistent
>> End
>>
>> ---------------- Fri Oct 25 02:15:21 CEST 2013 Received: ---------------- 
>> Message=TrustChangedNotification
>> AfterChange.Trusts.Amount=1
>> AfterChange.Trusts.0.Comment=Automatically assigned trust to a seed identity.
>> AfterChange.Trusts.0.Trustee=s88mAwLB3OW6mYlZ43XaHDM1K6QXosZ4QTt2UX-hq6s
>> AfterChange.Trusts.0.Truster=WNOyZsnZtpFjwmwfVBqC1PhSeg-hErXHlkrR43h0tiU
>> AfterChange.Trusts.0.TrusterEdition=0
>> AfterChange.Trusts.0.Value=100
>> BeforeChange.Trusts.0.Value=Inexistent
>> End
>>
>> ---------------- Fri Oct 25 02:15:21 CEST 2013 Received: ---------------- 
>> Message=ScoreChangedNotification
>> AfterChange.Scores.Amount=1
>> AfterChange.Scores.0.Capacity=40
>> AfterChange.Scores.0.Rank=1
>> AfterChange.Scores.0.Trustee=QeTBVWTwBldfI-lrF~xf0nqFVDdQoSUghT~PvhyJ1NE
>> AfterChange.Scores.0.Truster=WNOyZsnZtpFjwmwfVBqC1PhSeg-hErXHlkrR43h0tiU
>> AfterChange.Scores.0.Value=100
>> BeforeChange.Scores.0.Value=Inexistent
>> End
>>
>> ---------------- Fri Oct 25 02:15:21 CEST 2013 Received: ---------------- 
>> Message=IdentityChangedNotification
>> AfterChange.CurrentEditionFetchState=NotFetched
>> AfterChange.CurrentEditionFetchState0=NotFetched
>> AfterChange.ID=QeTBVWTwBldfI-lrF~xf0nqFVDdQoSUghT~PvhyJ1NE
>> AfterChange.ID0=QeTBVWTwBldfI-lrF~xf0nqFVDdQoSUghT~PvhyJ1NE
>> AfterChange.Identity=QeTBVWTwBldfI-lrF~xf0nqFVDdQoSUghT~PvhyJ1NE
>> AfterChange.Identity0=QeTBVWTwBldfI-lrF~xf0nqFVDdQoSUghT~PvhyJ1NE
>> AfterChange.PublishesTrustList=true
>> AfterChange.PublishesTrustList0=true
>> AfterChange.RequestURI=USK@QeTBVWTwBldfI-
>> lrF~xf0nqFVDdQoSUghT~PvhyJ1NE,OjEywGD063La2H-
>> IihD7iYtZm3rC0BP6UTvvwyF5Zh4,AQACAAE/WebOfTrust/1343
>> AfterChange.RequestURI0=USK@QeTBVWTwBldfI-
>> lrF~xf0nqFVDdQoSUghT~PvhyJ1NE,OjEywGD063La2H-
>> IihD7iYtZm3rC0BP6UTvvwyF5Zh4,AQACAAE/WebOfTrust/1343
>> AfterChange.Type=Identity
>> AfterChange.Type0=Identity
>> AfterChange.Contexts.Amount=0
>> AfterChange.Contexts0.Amount=0
>> AfterChange.Identities.Amount=1
>> AfterChange.Identities.0.CurrentEditionFetchState=NotFetched
>> AfterChange.Identities.0.ID=QeTBVWTwBldfI-lrF~xf0nqFVDdQoSUghT~PvhyJ1NE
>> AfterChange.Identities.0.Identity=QeTBVWTwBldfI-lrF~xf0nqFVDdQoSUghT~PvhyJ1NE
>> AfterChange.Identities.0.PublishesTrustList=true
>> AfterChange.Identities.0.RequestURI=USK@QeTBVWTwBldfI-
>> lrF~xf0nqFVDdQoSUghT~PvhyJ1NE,OjEywGD063La2H-
>> IihD7iYtZm3rC0BP6UTvvwyF5Zh4,AQACAAE/WebOfTrust/1343
>> AfterChange.Identities.0.Type=Identity
>> AfterChange.Identities.0.Contexts.Amount=0
>> AfterChange.Identities.0.Properties.Amount=0
>> AfterChange.Properties.Amount=0
>> AfterChange.Properties0.Amount=0
>> BeforeChange.CurrentEditionFetchState=NotFetched
>> BeforeChange.CurrentEditionFetchState0=NotFetched
>> BeforeChange.ID=QeTBVWTwBldfI-lrF~xf0nqFVDdQoSUghT~PvhyJ1NE
>> BeforeChange.ID0=QeTBVWTwBldfI-lrF~xf0nqFVDdQoSUghT~PvhyJ1NE
>> BeforeChange.Identity=QeTBVWTwBldfI-lrF~xf0nqFVDdQoSUghT~PvhyJ1NE
>> BeforeChange.Identity0=QeTBVWTwBldfI-lrF~xf0nqFVDdQoSUghT~PvhyJ1NE
>> BeforeChange.PublishesTrustList=true
>> BeforeChange.PublishesTrustList0=true
>> BeforeChange.RequestURI=USK@QeTBVWTwBldfI-
>> lrF~xf0nqFVDdQoSUghT~PvhyJ1NE,OjEywGD063La2H-
>> IihD7iYtZm3rC0BP6UTvvwyF5Zh4,AQACAAE/WebOfTrust/1344
>> BeforeChange.RequestURI0=USK@QeTBVWTwBldfI-
>> lrF~xf0nqFVDdQoSUghT~PvhyJ1NE,OjEywGD063La2H-
>> IihD7iYtZm3rC0BP6UTvvwyF5Zh4,AQACAAE/WebOfTrust/1344
>> BeforeChange.Type=Identity
>> BeforeChange.Type0=Identity
>> BeforeChange.Contexts.Amount=0
>> BeforeChange.Contexts0.Amount=0
>> BeforeChange.Identities.Amount=1
>> BeforeChange.Identities.0.CurrentEditionFetchState=NotFetched
>> BeforeChange.Identities.0.ID=QeTBVWTwBldfI-lrF~xf0nqFVDdQoSUghT~PvhyJ1NE
>> BeforeChange.Identities.0.Identity=QeTBVWTwBldfI-lrF~xf0nqFVDdQoSUghT~PvhyJ1NE
>> BeforeChange.Identities.0.PublishesTrustList=true
>> BeforeChange.Identities.0.RequestURI=USK@QeTBVWTwBldfI-
>> lrF~xf0nqFVDdQoSUghT~PvhyJ1NE,OjEywGD063La2H-
>> IihD7iYtZm3rC0BP6UTvvwyF5Zh4,AQACAAE/WebOfTrust/1344
>> BeforeChange.Identities.0.Type=Identity
>> BeforeChange.Identities.0.Contexts.Amount=0
>> BeforeChange.Identities.0.Properties.Amount=0
>> BeforeChange.Properties.Amount=0
>> BeforeChange.Properties0.Amount=0
>> End
>>
>> ---------------- Fri Oct 25 02:15:21 CEST 2013 Received: ---------------- 
>> Message=ScoreChangedNotification
>> AfterChange.Scores.Amount=1
>> AfterChange.Scores.0.Capacity=40
>> AfterChange.Scores.0.Rank=1
>> AfterChange.Scores.0.Trustee=D3MrAR-AVMqKJRjXnpKW2guW9z1mw5GZ9BB15mYVkVc
>> AfterChange.Scores.0.Truster=WNOyZsnZtpFjwmwfVBqC1PhSeg-hErXHlkrR43h0tiU
>> AfterChange.Scores.0.Value=100
>> BeforeChange.Scores.0.Value=Inexistent
>> End
>>
>> ---------------- Fri Oct 25 02:43:57 CEST 2013 Sent: ---------------- 
>> Message=Unsubscribe
>> SubscriptionID=19b22c4e-b902-4e1a-8dfd-704499ce3fe2
>> End
>>
>> ---------------- Fri Oct 25 02:43:57 CEST 2013 Sent: ---------------- 
>> Message=Unsubscribe
>> SubscriptionID=c27ef403-2550-41be-bb35-42c5886729f5
>> End
>>
>> ---------------- Fri Oct 25 02:43:57 CEST 2013 Sent: ---------------- 
>> Message=Unsubscribe
>> SubscriptionID=031f7f79-3487-455b-9a91-78cec7e72d79
>> End
>>
>> ---------------- Fri Oct 25 02:43:57 CEST 2013 Received: ---------------- 
>> From=Identities
>> Message=Unsubscribed
>> SubscriptionID=19b22c4e-b902-4e1a-8dfd-704499ce3fe2
>> End
>>
>> ---------------- Fri Oct 25 02:43:57 CEST 2013 Received: ---------------- 
>> From=Scores
>> Message=Unsubscribed
>> SubscriptionID=031f7f79-3487-455b-9a91-78cec7e72d79
>> End
>>
>> ---------------- Fri Oct 25 02:43:57 CEST 2013 Received: ---------------- 
>> From=Trusts
>> Message=Unsubscribed
>> SubscriptionID=c27ef403-2550-41be-bb35-42c5886729f5
>> End
>>
>> ---------------- Fri Oct 25 02:44:00 CEST 2013 Disconnected. 
>> ---------------- 
>> ------------------------------------------------------------------------------
>>
> The initial state could be huge. Please don't send it as part of the FCP
> message's SimpleFieldSet. Either split it up into multiple messages
> (e.g. one per identity; but then make sure there is some way of telling
> that you got all of them), or (probably better) put it in a Bucket i.e.
> a data field.

I will go further and say I think it very rarely makes sense for a
client application to have to pull in (and keep up-to-date with!) WoT's
entire state in the first place. I would expect queries and subscribing
to changes in their results.

Attachment: signature.asc
Description: OpenPGP digital signature

_______________________________________________
Devl mailing list
Devl@freenetproject.org
https://emu.freenetproject.org/cgi-bin/mailman/listinfo/devl

Reply via email to