Relationships API

Notes

  • For all functions, enter the parameters in the order listed.
  • Italicized parameters are optional.
  • Received Events are events of the "wrangler" domain that Wrangler will respond to
  • Raised Events are events that can be selected on within any ruleset in the pico when they occur
  • Sent Events are events that the pico will send elsewhere as a result of triggering a Wrangler event.

"io.picolabs.relationship" must be installed on your pico for these to work

See Managing Relationsips for an in-depth explanation on the relationship process.

Functions


established

Returns all of the established relationships for this pico in an array

Returns

NO ARGS: An array of relationship maps

key and value passed: The array will be filtered according to if the value at the key relationship attribute matches the value parameter

Parameters

ParameterDatatypeDescription
key

String

The relationship attribute that you want to filter for
valueStringThe value of the relationship attribute you want to filter for

Returns 

An array of established relationships. Possibly filtered.

Example
establishedArray = relationship:established()
/*
[
  {
    "Tx_host": "http://10.37.68.7:8080", // The host of the other pico
    "Id": "cjrcuow1a001q04rqu6h7ihit", // The ID of the relationship
    "Tx": "5V8ks8hmirW8MfE96aNaHn", // The transmitting channel to send events to on the other pico
    "Rx": "5N8EnBfeCA3ajsniKDZdkQ", // The receiving channel to receive events on this pico
	"Tx_role": "sensor", // The role of the pico on the other end of the relationship
	"Rx_role": "manager", // This pico's role from its own perspective
    "Tx_verify_key": "3SnLikfRD8Cm5JtHaWe26byvcn4f7bQAVVZM2zWEEgUm", // The key used for verifying signed messages sent through the relationship
    "Tx_public_key": "FzkwstPeu7jQamcsY4HycW6f4RmNNPynqCveTiGbsVHy" // The public key used for encrypting messages to send to the other pico
  },
  {
    "Id": "cjrcv4dwt003004rqdonu3ulx",
    "Rx": "E8Ei7TFbUNs4VSqsYHBWhb",
    "Tx": "T7wRhAvKNJocFezx2QCUpY",
    "Tx_verify_key": "FEhBwJFRy9WGx3QQPaKWXSvxB9YRQDNk6QVmX1GW9e6y",
    "Tx_public_key": "5UENb6pXGw5W9Vmz9uKmkzoMWifxWfeDLHsnFhMvkCYK"
  }
]
*/

outbound

Returns the pending outbound relationship requests in an array

Returns

NO ARGS: An array of pending outbound relationship maps

key and value passed: The array will be filtered according to if the value at the key map attribute matches the value parameter

Parameters

Returns 

An array of outbound relationships. Possibly filtered.

Example
pendingOutboundRels = relationship:outbound()
/*
[
  {
    "Id": "cjrcv6tzl003g04rqlri0vqqw",
    "wellKnown_Tx": "HLy15B5xmws3avFpbS6beZ",
    "Rx": "AgZKbAHa47RYytKBAK31DF"
  }
]
*/

inbound

Returns the pending inbound relationship requests in an array

Returns

NO ARGS: An array of pending inbound relationship maps

key and value passed: The array will be filtered according to if the value at the key map attribute matches the value parameter

Parameters

ParameterDatatypeDescription
key

String

The inbound relationship attribute that you want to filter for
valueStringThe value of the inbound relationship attribute you want to filter for

Returns 

An array of inbound relationship. Possibly filtered.

Example
pendingInboundRels = relationship:inbound()
/*
[
  {
    "Id": "cjrcv6tzl003g04rqlri0vqqw", // The ID of the relationship
    "Tx": "AgZKbAHa47RYytKBAK31DF", // The channel to transmit events to on the other pico
    "Rx": "GTh2ZdE6tpWqQQQ3jHL1Dv", // The channel to receive events on for this pico
    "Tx_verify_key": "6H4w3JV3VktkV1hAkYXFbba1d1dYSTQfZ7PgdcBtrnGs", // signing key for sending signed messages
    "Tx_public_key": "GaTt4ChY1Fre39szbRGLVE4waVGJ3qqo1NQWg1nutugN" // public key for encrypting messages
  },
  {
    "Id": "cjrcvvq0e004104rq8obn20e0",
    "Tx": "X9o6b6dhGevQGNZCyg3AEx",
    "Rx": "Rj6ACgfzVhU6PNgbjHhNTz",
    "Tx_verify_key": "HS9rJbPdQjsgY4q18eVxv7QPQkJcTdN14aiorDHeEEhu",
    "Tx_public_key": "DxbYXzoj9ozkHUz2NtWm7aXgGUSuRR8BbQTZeT1aKAni"
  }
]
*/

wellKnown_Rx

Returns the channel map of the WellKnown_Rx for this pico

Returns

A map in the channel map structure, describing the channel for the WellKnown_Rx on this pico.

Example
wellKnownChannel = relationship:wellKnown_Rx()
/*
{
  "id": "Cv1x3ufMEemxoYwFZ41WKb",
  "pico_id": "cjrb850we001cnkrq4in3pd37",
  "name": "wellKnown_Rx",
  "type": "Tx_Rx",
  "policy_id": "cjrcuog6b001l04rqfxz9lnei",
  "sovrin": {
    "did": "Cv1x3ufMEdmxoYwFZ41WKb",
    "verifyKey": "7VddbRHoDdxGBvqL6iYMi83T3QoKxxCLjNijMFawXbcV",
    "encryptionPublicKey": "BX1eddj7carru3KEd4CrAwmxG6S7A16hbpDCSoUXaGdw"
  }
}
*/

autoAcceptConfig

Returns the current autoAccept configuration for relationships. This map represents a configuration that you can set for auto accepting relationship requests with the added attribute value.

Returns

A map with the auto accept configuration of the pico's relationship ruleset.

Example
relationshipConfig = relationship:autoAcceptConfig()
/*
{
  "password": [
    "1234"
  ]
}
*/


Received Events


relationship

wrangler:relationship

When a pico receives or raises this event, it initiates the relationship protocol. Through the protocol, a wrangler:inbound_pending_relationship_added event will be raised within the other pico. A wrangler:outbound_pending_relationship_added event will be raised in the pico which received the initial wrangler:relationship event.

Attributes

AttributeDatatypeDescription
wellKnown_TxStringThe wellKnown_Rx channel from the other pico that you want to establish a relationship with.

name

StringThe name of the Rx to be created on each pico. Defaults to a random English word if not given.
channel_typeStringThe channel type that you want both pico's Rx to be
Rx_roleStringDescribes this pico's role in the relationship
Tx_roleStringDescribes the other pico's role in the relationship
IdStringOptionally provide a custom Id for the relationship, defaults to a UUID. Be very careful when providing your own Id.
Tx_hostStringThe network address of the engine hosting the other pico to relate to. Defaults to the same engine.
passwordStringNot implemented

Directives Returned

Will return empty directives. 

Corresponding Raised Events:

  • Wrangler Full API#inbound_pending_relationship_added in the other pico

pending_relationship_approval

wrangler:pending_relationship_approval

Should be raised by the developer as a response to wrangler:inbound_pending_relationship_added. The pico which received a wrangler:inbound_pending_relationship_added event should review the attributes and raise the wrangler:pending_relationship_approval event if the pico accepts the incoming relationship. See the example code for how this can be easily signaled using the "attributes" keyword.

Attributes

Must provide any one of the attributes.

AttributeDatatypeDescription
RxStringThe receiving channel created for this relationship. This is already created and given as an attribute of wrangler:inbound_pending_relationship_added.
TxStringThe channel on the pico that sent the relationship request that was created to receive events from this pico.
IdStringThe relationship Id of the relationship you want to accept. Also given in wrangler:inbound_pending_relationship_added.

Directives Returned

Will return empty directives. 

An example of a rule that raises wrangler:pending_relationship_approval to accept an inbound relationship request.

Example
/*
  rule auto_accept {
    select when wrangler inbound_pending_relationship_added
    pre {
      attributes = event:attrs.klog("inbound relationship attributes: ")
    }
    always {
      raise wrangler event "pending_relationship_approval"
        attributes attributes);
    }
*/

Corresponding Raised Events:

  • Wrangler Full API#relationship_added in the other pico

send_event_on_relationships

wrangler:send_event_on_relationships

This event can be used to send an arbitrary event to one or many relationships. Given a relationship ID, it will send the event on that relationship. Given a Tx_role or Rx_role it will send an event to all relationships that have that Tx_role or Rx_role recorded.

Attributes

Must provide any one of the attributes.

AttributeDatatypeDescription
domainStringThe domain of the event to send
typeStringThe type of the event you want to send
attrsMapA map of the attributes you want to be associated with the sent event
subIDStringThe relationship ID of the relationship you want to send the event on
Rx_roleStringThe Rx_role of the relationship you want to send the event on
Tx_roleStringThe Tx_role of the relationship you want to send the event on

Directives Returned

Will return empty directives. 

outbound_cancellation

wrangler:outbound_cancellation

Raise this within the pico that initiated the relationship creation exchange to cancel an outbound relationship request.

Attributes

Must provide any one of the attributes.

AttributeDatatypeDescription
RxStringThe receiving channel created for this relationship. This is already created and given as an attribute of wrangler:outbound_pending_relationship_added.
IdStringThe relationship Id of the outbound relationship request you want to cancel.

Directives Returned

Will return empty directives. 

Corresponding Raised Events:

  • Wrangler Full API#outbound_relationship_cancelled
  • Wrangler Full API#inbound_relationship_cancelled in the other pico

inbound_rejection

wrangler:inbound_rejection

Raise this within the pico that has received an inbound_pending_relationship_added event to cancel an an inbound relationship request.

Attributes

Must provide any one of the attributes.

AttributeDatatypeDescription
RxStringThe receiving channel created for this relationship. This is already created and given as an attribute of wrangler:inbound_pending_relationship_added.
IdStringThe relationship Id of the inbound relationship request you want to cancel. Also given in wrangler:inbound_pending_relationship_added.

Directives Returned

Will return empty directives. 

Example
/*
  rule auto_deny {
    select when wrangler inbound_pending_relationship_added
    pre {
      attributes = event:attrs.klog("inbound relationship attributes: ")
    }
    always {
      raise wrangler event "inbound_rejection" 
        attributes event:attrs);
    }
*/

Corresponding Raised Events:

  • Wrangler Full API#outbound_relationship_cancelled in the other pico
  • Wrangler Full API#inbound_relationship_cancelled

relationship_cancellation

wrangler:relationship_cancellation

Raise this within a pico to cancel its relationship to another pico. 

Attributes

Provide any one of the attributes. 

If none of these attributes are given it will try to cancel the relationship associated with the channel the event was received on.

AttributeDatatypeDescription
RxStringThe receiving channel created for the relationship you want to cancel.
TxStringThe transmitting channel for the relationship you want to cancel.
IdStringThe Id of the relationship you want to cancel.

Directives Returned

Will return empty directives. 

Example
/*
{
  "directives": []
}
*/

Corresponding Raised Events:

  • Wrangler Full API#relationship_removed in both picos in the relationship relationship

Raised Events



relationship_added

wrangler:relationship:added

Fired within a pico whenever a new relationship has been added.

Attributes Added

AttributeDatatypeDescription
IdString

The relationship ID of the added relationship

TxStringThe transmitting channel for the added relationship
Rx_roleStringThe role this pico has in this relationship
Tx_roleString or NULLThe role the other pico has in the relationship
Tx_public_keyString or NULLThe key used for decryption of encrypted messages sent through the relationship
Tx_verify_keyStringThe key used for verifying signed messages to send through the relationship
busMapHolds the above information but contains the receiving channel under key "Rx" and if the other pico is on a different host, its host under key "Tx_host"

The event attributes look like the following structure:

Example
{
  "Id": "cjrl7rbbh005kksrqle152lji",
  "Tx": "DWkbD6URr3JuQWtq9FjzQH",
  "Tx_public_key": "DWbUgvRLhtrp6Zv4CbuMLCZnV9qShsB2bXfW4E5EbEYh",
  "Tx_verify_key": "7pZSMfshJjPhjDbspNgko2KkmfET3pgW733UAZkbKxSX",
  "_headers": { // These were appended from the HTTP communication between the two picos
    "content-type": "application/json",
    "host": "10.37.155.96:8080",
    "content-length": "585",
    "connection": "close"
  },
  "bus": {
    "Tx_host": "http://localhost:8080",
    "Id": "cjrl7rbbh005kksrqle152lji",
    "Rx": "UGRZHTfz5P9AXFb4WXkJF8",
    "Tx": "DWkbD6URr3JuQWtq9FjzQH",
    "Tx_verify_key": "7pZSMfshJjPhjDbspNgko2KkmfET3pgW733UAZkbKxSX",
    "Tx_public_key": "DWbUgvRLhtrp6Zv4CbuMLCZnV9qShsB2bXfW4E5EbEYh"
  }
}

An example of a rule selecting on a new relationship creation.

Example
rule get_peer_ids {
  select when wrangler relationship_added
  foreach relationship:established() setting (relationship)
  pre {
  }
  if (relationship{"Rx_role"}.klog("RX_ROLE: ") == "node") then
    event:send({
      "eci":relationship{"Tx"},
      "eid":"getting_info",
      "domain":"gossip",
      "type":"get_peer_id",
      "attrs":{
        "channel":relationship{"Tx"}
    }
  }, relationship{"Tx_host"}.defaultsTo(meta:host))
  fired {
    ent:relationship_result := event:attrs
  }
}

relationship_removed

wrangler:relationship_removed

Raised within the pico when a relationship has been removed.

Attributes Added

AttributeDatatypeDescription
IdString

The relationship ID of the added relationship

busMapContains more information on the removed relationship

The event attributes look like the following structure:

Example
{
  "Id": "cjrmo1pox002fvkrq36wbu7tk",
  "_headers": { // These were appended from the HTTP communication between the two picos
    "host": "localhost:8080",
    "connection": "keep-alive",
    "accept": "application/json, text/javascript, */*; q=0.01",
    "x-requested-with": "XMLHttpRequest",
    "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.81 Safari/537.36",
    "referer": "http://localhost:8080/",
    "accept-encoding": "gzip, deflate, br",
    "accept-language": "en-US,en;q=0.9"
  },
  "bus": {
    "Rx_role": "10",
    "Tx_role": "2",
    "Tx_host": "http://10.37.184.244:8080",
    "Id": "cjrmo1pox002fvkrq36wbu7tk",
    "Tx": "BcAgD4DVKfmhsxKPhi55dz",
    "Rx": "QWEuQaqCP7pdeLR4riPfEs",
    "Tx_verify_key": "6nHdu1Ygf8GZaS2DnFHqjjv5psVvJsPnQfeBV8A6Tqxk",
    "Tx_public_key": "CmLjRfsPrxARqQCUWshDxLosQudvfDBV4iSReHU8qQyr"
  }
}

An example of a rule selecting on a relationship removal.

Example
rule remove_node_entry_after_sub_removal {
  select when wrangler relationship_removed
  pre {
	sub_id = event:attr("Id")
  }
  if (relationship{"Rx_role"}.klog("RX_ROLE: ") == "node") then
  noop()
  fired {
    ent:node_list := ent:node_list.delete([sub_id]);
  }
}

inbound_pending_relationship_added

wrangler:inbound_pending_relationship_added

This event is raised within the pico when a new inbound relationship request has been sent to the pico, and the developer needs to approve it. Typical use is to use the event attributes to determine whether the relationship is one you are expecting, and then raising wrangler:pending_relationship_approval if they are. 

Attributes Added

AttributeDatatypeDescription
IdString

The relationship ID of the added relationship

RxStringThe receiving channel that this pico will receive relationship events on
Rx_roleStringThe role that this pico will take in the relationship
TxStringThe channel to transmit events to on the other pico
Tx_hostStringThe network address of the pico engine hosting the other pico in the relationship
Tx_public_keyString
Tx_roleStringThe role of the other pico in the relationship relationship
Tx_verify_keyString
channel_nameStringThe name of the channel created for the relationship
channel_typeStringThe type of the channel created for the relationship
nameStringAlso the name of the channel created for the relationship
public_keyString
verify_keyString
wellKnown_TxStringThe wellKnown of this pico

The event attributes look like the following structure, depending on the arguments given to wrangler:relationship on the other pico:

Example
{
  "Id": "cjrmog0gd0030vkrqu0eeqax5",
  "Rx": "AQM7aFvb2Yp33pjypNcBhM",
  "Rx_role": "10",
  "Tx": "3naK2ZUH6a4vaWzLvU5cfn",
  "Tx_host": "http://10.37.184.244:8080",
  "Tx_public_key": "6G1fmv3KQd7hXpokesKFKrHE8dJJYpiew4eEAZwWbEKa",
  "Tx_role": "2",
  "Tx_verify_key": "2X4gcL8FGA4qrCniyBmYnfdKN5fitDu843mJtFFR5kBi",
  "_headers": { // These were appended from the HTTP communication between the two picos
    "content-type": "application/json",
    "host": "localhost:8080",
    "content-length": "981",
    "connection": "close"
  },
  "channel_name": "cool",
  "channel_type": "cool sub channel",
  "name": "cool",
  "password": "",
  "public_key": "6G1fmv3KQd7hXpokesKFKrHE8dJJYpiew4eEAZwWbEKa",
  "verify_key": "2X4gcL8FGA4qrCniyBmYnfdKN5fitDu843mJtFFR5kBi",
  "wellKnown_Tx": "5qMBoPpNh2fBnfG7JNk5yD"
}

An example of a rule accepting new relationship requests by selecting on wrangler:inbound_pending_relationship_added:

Example
rule auto_accept {
  select when wrangler inbound_pending_relationship_added
  pre {
  }
  always {
    raise wrangler event "pending_relationship_approval"
      attributes event:attrs
  }
}

outbound_pending_relationship_added

wrangler:outbound_pending_relationship_added

This is raised within the pico that has just initiated a relationship request using wrangler:relationship. This allows manipulation of the outgoing request, including cancelling it if necessary.

Attributes Added

These are currently identical to the attributes passed to wrangler:relationship.

AttributeDatatypeDescription
Rx_roleStringThe role that this pico will take in the relationship
Tx_hostStringThe network address of the pico engine hosting the other pico in the relationship
Tx_roleStringThe role of the other pico in the relationship relationship
channel_typeStringThe type of the channel created for the relationship
nameStringThe name of the channel created for the relationship
wellKnown_TxStringThe wellKnown of the pico the request is being sent to

The event attributes look like the following structure, depending on the arguments given to wrangler:relationship:

Example
{
  "Rx_role": "2",
  "Tx_host": "http://localhost:8080",
  "Tx_role": "10",
  "_headers": { // These were appended from the HTTP communication between the two picos
    "host": "localhost:8080",
    "connection": "keep-alive",
    "accept": "application/json, text/javascript, */*; q=0.01",
    "x-requested-with": "XMLHttpRequest",
    "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.81 Safari/537.36",
    "referer": "http://localhost:8080/",
    "accept-encoding": "gzip, deflate, br",
    "accept-language": "en-US,en;q=0.9",
    "if-none-match": "W/\"11-cFrA0CClfKTQMohnyK0tNW5C4dU\""
  },
  "channel_type": "cool sub channel",
  "name": "cool",
  "password": "",
  "wellKnown_Tx": "5qMBoPpNh2fBnfG7JNk5yD"
}

An example of a rule selecting on wrangler:oubound_pending_relationship_added to prepare for the relationship.

Example
rule auto_accept {
  select when wrangler outbound_pending_relationship_added
  pre {
	other_pico_host = event:attr{"Tx_host"}
  }
  if other_pico_host then
    noop()
  fired {
    ent:attempted_hosts := ent:attempted_hosts.append(other_pico_host);
  }
}

outbound_relationship_cancelled

wrangler:outbound_relationship_cancelled

Raised when an outbound relationship has been cancelled through the use of wrangler:outbound_cancellation or the inbound request rejected on the other pico using wrangler:inbound_rejection.

Attributes Added

AttributeDatatypeDescription
IdStringThe Id that had been created for the possible relationship
Rx/TxStringUse the bus attribute to get information. This attribute will change depending on how the relationship was cancelled. It will give a channel that was originally created for the relationship from either pico.
busMap

The internals of the cancelled outbound request. See attached example for its values.

An example of a rule selecting on wrangler:outbound_relationship_cancelled:

Example
rule sub_request_cancelled_or_rejected {
  select when wrangler outbound_relationship_cancelled
  always {
    ent:sub := event:attrs
  }
}

The structure of the bus when the oubound relationship has been cancelled:

Example
{
  "bus": {
    "Id": "cjs51fu2a006kksrq7av62ttd", // the ID of the cancelled relationship request
    "wellKnown_Tx": "5qMBoPpNh2fBnfG7JNk5yD", // The well known of the other pico
    "Rx": "AiPhhS6Tkz7QqmqbRZujEM" // The receiving channel that no longer exists that was created for this pico for the relationship
  }
}

inbound_relationship_cancelled

wrangler:inbound_relationship_cancelled

Raised when an inbound relationship has been cancelled through the use of wrangler:inbound_rejection or the outbound request was rejected on the other pico using wrangler:outbound_cancellation.

Attributes Added

AttributeDatatypeDescription
IdStringThe Id that had been created for the possible relationship
Rx/TxStringUse the bus attribute to get information. This attribute will change depending on how the relationship was cancelled. It will give a channel that was originally created for the relationship from either pico.
busMapThe internals of the cancelled inbound request. The internals of the cancelled outbound request. See attached example for its values.

An example of a rule selecting on wrangler:inbound_relationship_cancelled:

Example
rule inbound_sub_req_cancelled {
  select when wrangler inbound_relationship_cancelled
  always {
    ent:sub := event:attrs
  }
}

The structure of the bus when the inbound relationship has been cancelled:

Example
{
  "bus": {
    "Id": "cjs51fu2a006kksrq7av62ttd", // the ID of the cancelled relationship request
    "Tx": "AiPhhS6Tkz7QqmqbRZujEM", // The transmitting channel that no longer exists that was created for the other pico for the relationship
    "Rx": "8UVQvmstjx7C35D3sKHRy6", // The receiving channel that no longer exists that was created for this pico for the relationship
    "Tx_verify_key": "6J4uxarQkQGc43KZkUhmHwowPAc3Hb5oezLnyoJgvM5k", // The signing key that had been created to allow signing of future relationship events
    "Tx_public_key": "9xvw5iYsPjGirBofxAniXU8w1bZ4CfT6pfmcigZpzGkQ" // The encryption key that had been created to allow encrypted communication of future relationship events
  }
}​_



Copyright Picolabs | Licensed under Creative Commons.