Skip to content

Commit e1e3169

Browse files
author
Devendra
committed
saving psv2 work for v4
1 parent bb84dfe commit e1e3169

4 files changed

Lines changed: 455 additions & 223 deletions

File tree

core/pubnub-common.js

Lines changed: 222 additions & 107 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)