Skip to content

Commit 36460be

Browse files
authored
Merge pull request #335 from ably/objects-encoding
Add spec for `ObjectMessage` encoding and decoding
2 parents d673b9e + 6b14482 commit 36460be

1 file changed

Lines changed: 41 additions & 9 deletions

File tree

textile/features.textile

Lines changed: 41 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1523,6 +1523,8 @@ h4. ObjectMessage
15231523
** @(OM3d)@ The size of the @extras@ property is the string length of its JSON representation
15241524
** @(OM3f)@ The size of the @clientId@ property is its string length
15251525
** @(OM3e)@ The size of a @null@ or omitted property is zero
1526+
* @(OM4)@ For @ObjectMessage@ encoding see @ObjectData@ "OD4":#OD4 and @ObjectOperation@ "OOP5":#OOP5 encoding
1527+
* @(OM5)@ For @ObjectMessage@ decoding see @ObjectData@ "OD5":#OD5 decoding
15261528

15271529
h4. ObjectOperation
15281530

@@ -1535,16 +1537,23 @@ h4. ObjectOperation
15351537
** @(OOP3d)@ @counterOp@ @ObjectsCounterOp@ object - the payload for the operation if it is an operation on an @ObjectsCounter@ object type
15361538
** @(OOP3e)@ @map@ @ObjectsMap@ object - the payload for the operation if the operation is @MAP_CREATE@. Defines the initial value for the @ObjectsMap@ object
15371539
** @(OOP3f)@ @counter@ @ObjectsCounter@ object - the payload for the operation if the operation is @COUNTER_CREATE@. Defines the initial value for the @ObjectsCounter@ object
1538-
** @(OOP3g)@ @nonce@ string - the nonce, must be present on @COUNTER_CREATE@ and @MAP_CREATE@ operations sent to the server
1539-
** @(OOP3h)@ @initialValue@ binary - the initial value bytes for the object
1540-
** @(OOP3i)@ @initialValueEncoding@ string - defines how the @initialValue@ should be interpreted. Should be @msgpack@ or @json@
1540+
** @(OOP3g)@ @nonce@ string - the nonce. Must be present on @COUNTER_CREATE@ and @MAP_CREATE@ operations sent to the server. Should not be accessed by the client library if received from the server
1541+
** @(OOP3h)@ @initialValue@ binary - the initial value bytes for the object. Must be present on @COUNTER_CREATE@ and @MAP_CREATE@ operations sent to the server. Should not be accessed by the client library if received from the server
1542+
** @(OOP3i)@ @initialValueEncoding@ string - defines how the @initialValue@ should be interpreted by the server. Must be @msgpack@ or @json@. Must be present on @COUNTER_CREATE@ and @MAP_CREATE@ operations sent to the server. Should not be accessed by the client library if received from the server
15411543
* @(OOP4)@ The size of the @ObjectOperation@ is calculated as follows:
15421544
** @(OOP4a)@ The size is the sum of the sizes of the @mapOp@, @counterOp@, @map@, and @counter@ properties
15431545
** @(OOP4b)@ The size of the @mapOp@ property is calculated per "OMO3":#OMO3
15441546
** @(OOP4c)@ The size of the @counterOp@ property is calculated per "OCO3":#OCO3
15451547
** @(OOP4d)@ The size of the @map@ property is calculated per "OMP4":#OMP4
15461548
** @(OOP4e)@ The size of the @counter@ property is calculated per "OCN3":#OCN3
15471549
** @(OOP4f)@ The size of a @null@ or omitted property is zero
1550+
* @(OOP5)@ @ObjectOperation@ encoding:
1551+
** @(OOP5a)@ When the MessagePack protocol is used:
1552+
*** @(OOP5a1)@ A binary @ObjectOperation.initialValue@ is encoded as a MessagePack binary type
1553+
*** @(OOP5a2)@ Set @ObjectOperation.initialValueEncoding@ to @msgpack@
1554+
** @(OOP5b)@ When the JSON protocol is used:
1555+
*** @(OOP5b1)@ A binary @ObjectOperation.initialValue@ is Base64-encoded and represented as a JSON string
1556+
*** @(OOP5b2)@ Set @ObjectOperation.initialValueEncoding@ to @json@
15481557

15491558
h4. ObjectState
15501559

@@ -1623,18 +1632,41 @@ h4. ObjectData
16231632
* @(OD1)@ An @ObjectData@ represents a value in an object on a channel
16241633
* @(OD2)@ The attributes available in an @ObjectData@ are:
16251634
** @(OD2a)@ @objectId@ string - a reference to another object
1626-
** @(OD2b)@ @encoding@ string - can be set by the client to indicate that value in @string@ or @bytes@ field have an encoding
1627-
** @(OD2c)@ @boolean@ boolean - a primitive boolean leaf value in the object graph. Only one of the value fields - @boolean@, @bytes@, @number@ or @string@ - can be set at a time
1628-
** @(OD2d)@ @bytes@ binary - a primitive binary leaf value in the object graph. Only one of the value fields - @boolean@, @bytes@, @number@ or @string@ - can be set at a time
1629-
** @(OD2e)@ @number@ number - a primitive number leaf value in the object graph. Only one of the value fields - @boolean@, @bytes@, @number@ or @string@ - can be set at a time
1630-
** @(OD2f)@ @string@ string - a primitive string leaf value in the object graph. Only one of the value fields - @boolean@, @bytes@, @number@ or @string@ - can be set at a time
1635+
** @(OD2b)@ @encoding@ string - may be set by the client library to indicate that value in @string@ field have an encoding
1636+
** @(OD2c)@ @boolean@ boolean - a primitive boolean leaf value in the object graph. Only one of the value fields - @boolean@, @bytes@, @number@ or @string@ - must be set at a time
1637+
** @(OD2d)@ @bytes@ binary | string - a primitive binary leaf value in the object graph. It is sent to and received from the server as a Base64-encoded string when using the JSON protocol. Only one of the value fields - @boolean@, @bytes@, @number@ or @string@ - must be set at a time
1638+
** @(OD2e)@ @number@ number - a primitive number leaf value in the object graph. Only one of the value fields - @boolean@, @bytes@, @number@ or @string@ - must be set at a time
1639+
** @(OD2f)@ @string@ string - a primitive string leaf value in the object graph. Only one of the value fields - @boolean@, @bytes@, @number@ or @string@ - must be set at a time
16311640
* @(OD3)@ The size of the @ObjectData@ is calculated as follows:
16321641
** @(OD3a)@ The size is the sum of the sizes of the @boolean@, @bytes@, @number@, and @string@ properties
16331642
** @(OD3b)@ If set, the size of a @boolean@ property is 1
16341643
** @(OD3c)@ If set, the size of a @bytes@ property is its size in bytes (of the actual binary, not the base64 representation, regardless of whether the binary protocol is in use)
16351644
** @(OD3d)@ If set, the size of a @number@ property is 8
16361645
** @(OD3e)@ If set, the size of a @string@ property is its length
16371646
** @(OD3f)@ The size of a @null@ or omitted property is zero
1647+
* @(OD4)@ @ObjectData@ encoding:
1648+
** @(OD4a)@ Payloads must be booleans, binary, numbers, strings, or JSON-encodable objects or arrays. Any other data type must not be permitted and result in an error with code 40013
1649+
** @(OD4b)@ @ObjectData.encoding@ must be left unset unless specified otherwise by the payload encoding procedure in "OD4c":#OD4c and "OD4d":#OD4d
1650+
** @(OD4c)@ When the MessagePack protocol is used:
1651+
*** @(OD4c1)@ A boolean payload is encoded as a MessagePack boolean type, and the result is set on the @ObjectData.boolean@ attribute
1652+
*** @(OD4c2)@ A binary payload is encoded as a MessagePack binary type, and the result is set on the @ObjectData.bytes@ attribute
1653+
*** @(OD4c3)@ A number payload is encoded as a MessagePack float64 type, and the result is set on the @ObjectData.number@ attribute
1654+
*** @(OD4c4)@ A string payload is encoded as a MessagePack string type, and the result is set on the @ObjectData.string@ attribute
1655+
*** @(OD4c5)@ A payload consisting of a JSON-encodable object or array is stringified as a JSON object or array, encoded as a MessagePack string type, and the result is set on the @ObjectData.string@ attribute. The @ObjectData.encoding@ attribute is then set to "json"
1656+
** @(OD4d)@ When the JSON protocol is used:
1657+
*** @(OD4d1)@ A boolean payload is represented as a JSON boolean and set on the @ObjectData.boolean@ attribute
1658+
*** @(OD4d2)@ A binary payload is Base64-encoded and represented as a JSON string; the result is set on the @ObjectData.bytes@ attribute
1659+
*** @(OD4d3)@ A number payload is represented as a JSON number and set on the @ObjectData.number@ attribute
1660+
*** @(OD4d4)@ A string payload is represented as a JSON string and set on the @ObjectData.string@ attribute
1661+
*** @(OD4d5)@ A payload consisting of a JSON-encodable object or array is stringified as a JSON object or array, represented as a JSON string and the result is set on the @ObjectData.string@ attribute. The @ObjectData.encoding@ attribute is then set to "json"
1662+
* @(OD5)@ @ObjectData@ decoding:
1663+
** @(OD5a)@ When the MessagePack protocol is used:
1664+
*** @(OD5a1)@ The payloads in @ObjectData.boolean@, @ObjectData.bytes@, @ObjectData.number@, and @ObjectData.string@ are decoded as their corresponding MessagePack types
1665+
*** @(OD5a2)@ If @ObjectData.encoding@ is set to "json", the @ObjectData.string@ content is decoded by parsing the string as JSON
1666+
** @(OD5b)@ When the JSON protocol is used:
1667+
*** @(OD5b1)@ The payloads in @ObjectData.boolean@, @ObjectData.number@, and @ObjectData.string@ are decoded as their corresponding JSON types
1668+
*** @(OD5b2)@ The @ObjectData.bytes@ payload is Base64-decoded into a binary value
1669+
*** @(OD5b3)@ If @ObjectData.encoding@ is set to "json", the @ObjectData.string@ content is decoded by parsing the string as JSON
16381670

16391671
h4. Annotation
16401672

@@ -2631,7 +2663,7 @@ class ObjectData // OD*, internal
26312663
objectId: String? // OD2a
26322664
encoding: String? // OD2b
26332665
boolean: Boolean? // OD2c
2634-
bytes: Binary? // OD2d
2666+
bytes: Binary? | String? // OD2d
26352667
number: Number? // OD2e
26362668
string: String? // OD2f
26372669

0 commit comments

Comments
 (0)