@@ -615,6 +615,7 @@ function PN_API(setup) {
615615 function _invoke_callback_v4 ( response , http_data , op_params , callback , err ) {
616616 //console.log('V4 callback');
617617 var v4_cb_data = objectShallowCopy ( http_data , op_params ) ;
618+ console . log ( JSON . stringify ( v4_cb_data , null , 2 ) ) ;
618619 v4_cb_data [ 'data' ] = get_v4_cb_data ( response ) ;
619620 _invoke_callback ( v4_cb_data , callback , err ) ;
620621 }
@@ -1320,6 +1321,7 @@ function PN_API(setup) {
13201321 , sub_timeout = args [ 'timeout' ] || SUB_TIMEOUT
13211322 , windowing = args [ 'windowing' ] || SUB_WINDOWING
13221323 , state = args [ 'state' ]
1324+ , V2 = args [ 'v2' ]
13231325 , heartbeat = args [ 'heartbeat' ] || args [ 'pnexpires' ]
13241326 , restore = args [ 'restore' ] || SUB_RESTORE ;
13251327
@@ -1348,10 +1350,19 @@ function PN_API(setup) {
13481350
13491351 } ;
13501352
1351- var callback = args [ 'callback' ] || function ( message , http_data , message_envelope , channel , latency , real_channel ) {
1353+ var callback = args [ 'callback' ] || function ( message , http_data , message_envelope , channel , latency , real_channel , expanded ) {
1354+ if ( message_envelope ) http_data [ 'message_envelope' ] = message_envelope ;
1355+ if ( channel ) http_data [ 'channel' ] = channel ;
1356+ if ( latency ) http_data [ 'latency' ] = latency ;
1357+ if ( real_channel ) http_data [ 'real_channel' ] = real_channel ;
1358+ if ( expanded ) http_data [ 'expanded' ] = expanded ;
13521359 _invoke_callback_v4 ( message , http_data , op_params , result , status ) ;
13531360 }
13541361
1362+ var callback2 = args [ 'callback' ] || function ( message , http_data , message_envelope , channel , real_channel , expanded ) {
1363+ callback && callback ( message , http_data , message_envelope , channel , null , real_channel , expanded ) ;
1364+ }
1365+
13551366 var connect = args [ 'connect' ] || function ( channel , http_data ) {
13561367 var status_event = http_data || { } ;
13571368
@@ -1410,7 +1421,7 @@ function PN_API(setup) {
14101421 connected : settings . connected ,
14111422 disconnected : settings . disconnected ,
14121423 subscribed : 1 ,
1413- callback : SUB_CALLBACK = callback ,
1424+ callback : SUB_CALLBACK = ( V2 ) ? callback2 : callback ,
14141425 'cipher_key' : args [ 'cipher_key' ] ,
14151426 connect : connect ,
14161427 disconnect : disconnect ,
@@ -1467,7 +1478,7 @@ function PN_API(setup) {
14671478 connected : settings . connected ,
14681479 disconnected : settings . disconnected ,
14691480 subscribed : 1 ,
1470- callback : SUB_CALLBACK = callback ,
1481+ callback : SUB_CALLBACK = ( V2 ) ? callback2 : callback ,
14711482 'cipher_key' : args [ 'cipher_key' ] ,
14721483 connect : connect ,
14731484 disconnect : disconnect ,
@@ -1481,7 +1492,8 @@ function PN_API(setup) {
14811492 SELF [ 'subscribe' ] ( {
14821493 'channel_group' : channel_group + PRESENCE_SUFFIX ,
14831494 'callback' : presence ,
1484- 'restore' : restore
1495+ 'restore' : restore ,
1496+ 'v2' : V2
14851497 } ) ;
14861498
14871499 // Presence Subscribed?
@@ -1570,6 +1582,210 @@ function PN_API(setup) {
15701582
15711583 if ( PRESENCE_HB ) data [ 'heartbeat' ] = PRESENCE_HB ;
15721584
1585+ function _change_key ( o , ok , nk ) {
1586+ if ( typeof o [ ok ] !== 'undefined' ) {
1587+ var t = o [ ok ] ;
1588+ o [ nk ] = t ;
1589+ delete o [ ok ] ;
1590+ }
1591+ return true ;
1592+ }
1593+ function _v2_expand_keys ( m ) {
1594+ m [ 'o' ] && _change_key ( m [ 'o' ] , 't' , 'timetoken' ) && _change_key ( m [ 'o' ] , 'r' , 'region_code' )
1595+ m [ 'p' ] && _change_key ( m [ 'p' ] , 't' , 'timetoken' ) && _change_key ( m [ 'p' ] , 'r' , 'region_code' )
1596+ _change_key ( m , 'i' , 'issuing_client_id' ) ;
1597+ _change_key ( m , 's' , 'sequence_number' ) ;
1598+ _change_key ( m , 'o' , 'origination_timetoken' ) ;
1599+ _change_key ( m , 'p' , 'publish_timetoken' ) ;
1600+ _change_key ( m , 'k' , 'subscribe_key' ) ;
1601+ _change_key ( m , 'c' , 'channel' ) ;
1602+ _change_key ( m , 'b' , 'subscription_match' ) ;
1603+ _change_key ( m , 'r' , 'replication_map' ) ;
1604+ _change_key ( m , 'ear' , 'eat_after_reading' ) ;
1605+ _change_key ( m , 'd' , 'payload' ) ;
1606+ _change_key ( m , 'u' , 'user_metadata' ) ;
1607+ _change_key ( m , 'w' , 'waypoint_list' ) ;
1608+ return m ;
1609+ }
1610+
1611+
1612+ function subscribeSuccessHandlerV1 ( messages , http_data ) {
1613+ //console.log(JSON.stringify(http_data));
1614+ // Check for Errors
1615+ if ( ! messages || (
1616+ typeof messages == 'object' &&
1617+ 'error' in messages &&
1618+ messages [ 'error' ]
1619+ ) ) {
1620+ err ( messages [ 'error' ] , http_data ) ;
1621+ return timeout ( CONNECT , 1000 ) ;
1622+ }
1623+
1624+ // User Idle Callback
1625+ idlecb ( messages [ 1 ] ) ;
1626+
1627+ // Restore Previous Connection Point if Needed
1628+ TIMETOKEN = ! TIMETOKEN &&
1629+ SUB_RESTORE &&
1630+ db [ 'get' ] ( SUBSCRIBE_KEY ) || messages [ 1 ] ;
1631+
1632+
1633+ _update_connection_states_and_invoke_callbacks ( 1 , http_data ) ;
1634+
1635+
1636+ if ( RESUMED && ! SUB_RESTORE ) {
1637+ TIMETOKEN = 0 ;
1638+ RESUMED = false ;
1639+ // Update Saved Timetoken
1640+ db [ 'set' ] ( SUBSCRIBE_KEY , 0 ) ;
1641+ timeout ( _connect , windowing ) ;
1642+ return ;
1643+ }
1644+
1645+ // Invoke Memory Catchup and Receive Up to 100
1646+ // Previous Messages from the Queue.
1647+ if ( backfill ) {
1648+ TIMETOKEN = 10000 ;
1649+ backfill = 0 ;
1650+ }
1651+
1652+ // Update Saved Timetoken
1653+ db [ 'set' ] ( SUBSCRIBE_KEY , messages [ 1 ] ) ;
1654+
1655+ // Route Channel <---> Callback for Message
1656+ var next_callback = ( function ( ) {
1657+ var channels = '' ;
1658+ var channels2 = '' ;
1659+
1660+ if ( messages . length > 3 ) {
1661+ channels = messages [ 3 ] ;
1662+ channels2 = messages [ 2 ] ;
1663+ } else if ( messages . length > 2 ) {
1664+ channels = messages [ 2 ] ;
1665+ } else {
1666+ channels = map (
1667+ generate_channel_list ( CHANNELS ) , function ( chan ) { return map (
1668+ Array ( messages [ 0 ] . length )
1669+ . join ( ',' ) . split ( ',' ) ,
1670+ function ( ) { return chan ; }
1671+ ) } ) . join ( ',' )
1672+ }
1673+
1674+ var list = channels . split ( ',' ) ;
1675+ var list2 = ( channels2 ) ?channels2 . split ( ',' ) :[ ] ;
1676+
1677+ return function ( ) {
1678+ var channel = list . shift ( ) || SUB_CHANNEL ;
1679+ var channel2 = list2 . shift ( ) ;
1680+
1681+ var chobj = { } ;
1682+
1683+ if ( channel2 ) {
1684+ if ( channel && channel . indexOf ( '-pnpres' ) >= 0
1685+ && channel2 . indexOf ( '-pnpres' ) < 0 ) {
1686+ channel2 += '-pnpres' ;
1687+ }
1688+ chobj = CHANNEL_GROUPS [ channel2 ] || CHANNELS [ channel2 ] || { 'callback' : function ( ) { } } ;
1689+ } else {
1690+ chobj = CHANNELS [ channel ] ;
1691+ }
1692+
1693+ var r = [
1694+ chobj
1695+ . callback || SUB_CALLBACK ,
1696+ channel . split ( PRESENCE_SUFFIX ) [ 0 ]
1697+ ] ;
1698+ channel2 && r . push ( channel2 . split ( PRESENCE_SUFFIX ) [ 0 ] ) ;
1699+ return r ;
1700+ } ;
1701+ } ) ( ) ;
1702+
1703+ var latency = detect_latency ( + messages [ 1 ] ) ;
1704+ each ( messages [ 0 ] , function ( msg ) {
1705+ var next = next_callback ( ) ;
1706+ var decrypted_msg = decrypt ( msg ,
1707+ ( CHANNELS [ next [ 1 ] ] ) ?CHANNELS [ next [ 1 ] ] [ 'cipher_key' ] :null ) ;
1708+ next [ 0 ] && next [ 0 ] ( decrypted_msg , http_data , messages , next [ 2 ] || next [ 1 ] , latency , next [ 1 ] ) ;
1709+ } ) ;
1710+
1711+ timeout ( _connect , windowing ) ;
1712+ }
1713+
1714+ function subscribeSuccessHandlerV2 ( response , http_data ) {
1715+
1716+ //SUB_RECEIVER = null;
1717+ // Check for Errors
1718+ if ( ! response || (
1719+ typeof response == 'object' &&
1720+ 'error' in response &&
1721+ response [ 'error' ]
1722+ ) ) {
1723+ err ( response [ 'error' ] , http_data ) ;
1724+ return timeout ( CONNECT , SECOND ) ;
1725+ }
1726+
1727+ // User Idle Callback
1728+ idlecb ( response [ 't' ] [ 't' ] ) ;
1729+
1730+ // Restore Previous Connection Point if Needed
1731+ TIMETOKEN = ! TIMETOKEN &&
1732+ SUB_RESTORE &&
1733+ db [ 'get' ] ( SUBSCRIBE_KEY ) || response [ 't' ] [ 't' ] ;
1734+
1735+ // Connect
1736+ each_channel ( function ( channel ) {
1737+ if ( channel . connected ) return ;
1738+ channel . connected = 1 ;
1739+ channel . connect ( channel . name , http_data ) ;
1740+ } ) ;
1741+
1742+ // Connect for channel groups
1743+ each_channel_group ( function ( channel_group ) {
1744+ if ( channel_group . connected ) return ;
1745+ channel_group . connected = 1 ;
1746+ channel_group . connect ( channel_group . name , http_data ) ;
1747+ } ) ;
1748+
1749+ if ( RESUMED && ! SUB_RESTORE ) {
1750+ TIMETOKEN = 0 ;
1751+ RESUMED = false ;
1752+ // Update Saved Timetoken
1753+ db [ 'set' ] ( SUBSCRIBE_KEY , 0 ) ;
1754+ timeout ( _connect , windowing ) ;
1755+ return ;
1756+ }
1757+
1758+ // Invoke Memory Catchup and Receive Up to 100
1759+ // Previous Messages from the Queue.
1760+ if ( backfill ) {
1761+ TIMETOKEN = 10000 ;
1762+ backfill = 0 ;
1763+ }
1764+
1765+ // Update Saved Timetoken
1766+ db [ 'set' ] ( SUBSCRIBE_KEY , response [ 't' ] [ 't' ] ) ;
1767+
1768+ var messages = response [ 'm' ] ;
1769+
1770+ for ( var i in messages ) {
1771+ var message = messages [ i ]
1772+ , channel = message [ 'c' ]
1773+ , sub_channel = message [ 'b' ] ;
1774+
1775+ var chobj = CHANNELS [ sub_channel ] || CHANNEL_GROUPS [ sub_channel ] ||
1776+ CHANNELS [ channel ] ;
1777+
1778+ if ( chobj ) {
1779+ var callback = chobj [ 'callback' ] ;
1780+ callback &&
1781+ callback ( message [ 'd' ] , http_data , message , message [ 'b' ] || message [ 'c' ] ,
1782+ message [ 'c' ] , _v2_expand_keys ( message ) ) ;
1783+ }
1784+ }
1785+
1786+ timeout ( _connect , windowing ) ;
1787+ }
1788+
15731789 start_presence_heartbeat ( ) ;
15741790 SUB_RECEIVER = xdr ( {
15751791 timeout : sub_timeout ,
@@ -1587,112 +1803,11 @@ function PN_API(setup) {
15871803 } ,
15881804 data : _get_url_params ( data ) ,
15891805 url : [
1590- SUB_ORIGIN , 'subscribe' ,
1806+ SUB_ORIGIN , ( ( V2 ) ? 'v2/' : '' ) + 'subscribe' ,
15911807 SUBSCRIBE_KEY , encode ( channels ) ,
15921808 jsonp , TIMETOKEN
15931809 ] ,
1594- success : function ( messages , http_data ) {
1595-
1596- //console.log(JSON.stringify(http_data));
1597- // Check for Errors
1598- if ( ! messages || (
1599- typeof messages == 'object' &&
1600- 'error' in messages &&
1601- messages [ 'error' ]
1602- ) ) {
1603- errcb ( messages [ 'error' ] ) ;
1604- return timeout ( CONNECT , 1000 ) ;
1605- }
1606-
1607- // User Idle Callback
1608- idlecb ( messages [ 1 ] ) ;
1609-
1610- // Restore Previous Connection Point if Needed
1611- TIMETOKEN = ! TIMETOKEN &&
1612- SUB_RESTORE &&
1613- db [ 'get' ] ( SUBSCRIBE_KEY ) || messages [ 1 ] ;
1614-
1615-
1616- _update_connection_states_and_invoke_callbacks ( 1 , http_data ) ;
1617-
1618-
1619- if ( RESUMED && ! SUB_RESTORE ) {
1620- TIMETOKEN = 0 ;
1621- RESUMED = false ;
1622- // Update Saved Timetoken
1623- db [ 'set' ] ( SUBSCRIBE_KEY , 0 ) ;
1624- timeout ( _connect , windowing ) ;
1625- return ;
1626- }
1627-
1628- // Invoke Memory Catchup and Receive Up to 100
1629- // Previous Messages from the Queue.
1630- if ( backfill ) {
1631- TIMETOKEN = 10000 ;
1632- backfill = 0 ;
1633- }
1634-
1635- // Update Saved Timetoken
1636- db [ 'set' ] ( SUBSCRIBE_KEY , messages [ 1 ] ) ;
1637-
1638- // Route Channel <---> Callback for Message
1639- var next_callback = ( function ( ) {
1640- var channels = '' ;
1641- var channels2 = '' ;
1642-
1643- if ( messages . length > 3 ) {
1644- channels = messages [ 3 ] ;
1645- channels2 = messages [ 2 ] ;
1646- } else if ( messages . length > 2 ) {
1647- channels = messages [ 2 ] ;
1648- } else {
1649- channels = map (
1650- generate_channel_list ( CHANNELS ) , function ( chan ) { return map (
1651- Array ( messages [ 0 ] . length )
1652- . join ( ',' ) . split ( ',' ) ,
1653- function ( ) { return chan ; }
1654- ) } ) . join ( ',' )
1655- }
1656-
1657- var list = channels . split ( ',' ) ;
1658- var list2 = ( channels2 ) ?channels2 . split ( ',' ) :[ ] ;
1659-
1660- return function ( ) {
1661- var channel = list . shift ( ) || SUB_CHANNEL ;
1662- var channel2 = list2 . shift ( ) ;
1663-
1664- var chobj = { } ;
1665-
1666- if ( channel2 ) {
1667- if ( channel && channel . indexOf ( '-pnpres' ) >= 0
1668- && channel2 . indexOf ( '-pnpres' ) < 0 ) {
1669- channel2 += '-pnpres' ;
1670- }
1671- chobj = CHANNEL_GROUPS [ channel2 ] || CHANNELS [ channel2 ] || { 'callback' : function ( ) { } } ;
1672- } else {
1673- chobj = CHANNELS [ channel ] ;
1674- }
1675-
1676- var r = [
1677- chobj
1678- . callback || SUB_CALLBACK ,
1679- channel . split ( PRESENCE_SUFFIX ) [ 0 ]
1680- ] ;
1681- channel2 && r . push ( channel2 . split ( PRESENCE_SUFFIX ) [ 0 ] ) ;
1682- return r ;
1683- } ;
1684- } ) ( ) ;
1685-
1686- var latency = detect_latency ( + messages [ 1 ] ) ;
1687- each ( messages [ 0 ] , function ( msg ) {
1688- var next = next_callback ( ) ;
1689- var decrypted_msg = decrypt ( msg ,
1690- ( CHANNELS [ next [ 1 ] ] ) ?CHANNELS [ next [ 1 ] ] [ 'cipher_key' ] :null ) ;
1691- next [ 0 ] && next [ 0 ] ( decrypted_msg , http_data , messages , next [ 2 ] || next [ 1 ] , latency , next [ 1 ] ) ;
1692- } ) ;
1693-
1694- timeout ( _connect , windowing ) ;
1695- }
1810+ success : ( V2 ) ?subscribeSuccessHandlerV2 :subscribeSuccessHandlerV1
16961811 } ) ;
16971812 }
16981813
0 commit comments