{"_id":"upnode","_rev":"227659","name":"upnode","description":"transactional connection queue for dnode","dist-tags":{"latest":"0.6.0"},"maintainers":[{"name":"mreinstein","email":"reinstein.mike@gmail.com"},{"name":"substack","email":"substack@gmail.com"}],"time":{"modified":"2023-03-24T10:40:45.000Z","created":"2011-12-17T09:36:44.457Z","0.6.0":"2017-12-14T17:02:31.793Z","0.5.0":"2016-07-04T21:37:52.850Z","0.4.3":"2012-09-07T06:02:45.184Z","0.4.2":"2012-08-12T03:38:35.762Z","0.4.1":"2012-07-29T10:06:51.877Z","0.4.0":"2012-07-29T09:47:25.147Z","0.3.1":"2012-07-28T03:01:55.869Z","0.3.0":"2012-07-28T01:32:52.274Z","0.2.4":"2012-07-15T01:01:50.896Z","0.2.3":"2012-05-20T05:51:05.897Z","0.2.2":"2012-04-14T12:28:50.798Z","0.2.1":"2012-04-14T10:32:31.349Z","0.2.0":"2012-03-24T00:59:52.443Z","0.1.1":"2012-03-21T01:27:21.757Z","0.1.0":"2011-12-30T18:44:06.254Z","0.0.1":"2011-12-30T18:43:24.653Z","0.0.0":"2011-12-17T09:36:44.457Z"},"users":{},"author":{"name":"James Halliday","email":"mail@substack.net","url":"http://substack.net"},"repository":{"type":"git","url":"git://github.com/substack/upnode.git"},"versions":{"0.6.0":{"name":"upnode","description":"transactional connection queue for dnode","version":"0.6.0","repository":{"type":"git","url":"git://github.com/substack/upnode.git"},"main":"index.js","keywords":["dnode","queue","message","reconnect","transaction","interruption"],"directories":{"example":"example","test":"test"},"scripts":{"test":"tap test/*.js"},"dependencies":{"dnode":">= 1.2.2"},"devDependencies":{"tap":"^11.0.0"},"engines":{"node":">=4.0"},"license":"MIT","author":{"name":"James Halliday","email":"mail@substack.net","url":"http://substack.net"},"gitHead":"3c1258e7c2e109d51faa8dd5b7faeaae1acf1e8b","bugs":{"url":"https://github.com/substack/upnode/issues"},"homepage":"https://github.com/substack/upnode#readme","_id":"upnode@0.6.0","_npmVersion":"5.5.1","_nodeVersion":"8.9.3","_npmUser":{"name":"mreinstein","email":"reinstein.mike@gmail.com"},"dist":{"shasum":"847864bcd08828b20a7b2926336cfc66689bc4b1","size":9139,"noattachment":false,"key":"/upnode/-/upnode-0.6.0.tgz","tarball":"http://name.csiicloud.com:7001/upnode/download/upnode-0.6.0.tgz"},"maintainers":[{"name":"mreinstein","email":"reinstein.mike@gmail.com"},{"name":"substack","email":"substack@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/upnode-0.6.0.tgz_1513270950585_0.23905166960321367"},"publish_time":1513270951793,"_hasShrinkwrap":false,"_cnpm_publish_time":1513270951793,"_cnpmcore_publish_time":"2021-12-16T21:08:58.432Z"},"0.5.0":{"name":"upnode","description":"transactional connection queue for dnode","version":"0.5.0","repository":{"type":"git","url":"git://github.com/substack/upnode.git"},"main":"index.js","keywords":["dnode","queue","message","reconnect","transaction","interruption"],"directories":{"example":"example","test":"test"},"scripts":{"test":"tap test/*.js"},"dependencies":{"dnode":">= 1.2.2"},"devDependencies":{"tap":"~0.2.6"},"engines":{"node":">=0.12.0"},"license":"MIT","author":{"name":"James Halliday","email":"mail@substack.net","url":"http://substack.net"},"gitHead":"c842fa5960821aeba2ad6482e9662dce14ef7d94","bugs":{"url":"https://github.com/substack/upnode/issues"},"homepage":"https://github.com/substack/upnode#readme","_id":"upnode@0.5.0","_shasum":"1a7f05def29075e7b6df4d1fd34d31e5016b05a1","_from":".","_npmVersion":"3.9.5","_nodeVersion":"6.2.2","_npmUser":{"name":"mreinstein","email":"reinstein.mike@gmail.com"},"dist":{"shasum":"1a7f05def29075e7b6df4d1fd34d31e5016b05a1","size":9111,"noattachment":false,"key":"/upnode/-/upnode-0.5.0.tgz","tarball":"http://name.csiicloud.com:7001/upnode/download/upnode-0.5.0.tgz"},"maintainers":[{"name":"mreinstein","email":"reinstein.mike@gmail.com"},{"name":"substack","email":"substack@gmail.com"}],"_npmOperationalInternal":{"host":"packages-12-west.internal.npmjs.com","tmp":"tmp/upnode-0.5.0.tgz_1467668272375_0.9927827774081379"},"publish_time":1467668272850,"_hasShrinkwrap":false,"_cnpm_publish_time":1467668272850,"_cnpmcore_publish_time":"2021-12-16T21:08:58.635Z"},"0.4.3":{"name":"upnode","description":"transactional connection queue for dnode","version":"0.4.3","repository":{"type":"git","url":"git://github.com/substack/upnode.git"},"main":"index.js","keywords":["dnode","queue","message","reconnect","transaction","interruption"],"directories":{"example":"example","test":"test"},"scripts":{"test":"tap test/*.js"},"dependencies":{"dnode":"~1.0.1"},"devDependencies":{"tap":"~0.2.6"},"engines":{"node":">=0.4.0"},"license":"MIT","author":{"name":"James Halliday","email":"mail@substack.net","url":"http://substack.net"},"_id":"upnode@0.4.3","dist":{"shasum":"b6ff551f03b9f4b87bdb0d7153fef712dab9250e","size":9304,"noattachment":false,"key":"/upnode/-/upnode-0.4.3.tgz","tarball":"http://name.csiicloud.com:7001/upnode/download/upnode-0.4.3.tgz"},"_npmVersion":"1.1.59","_npmUser":{"name":"substack","email":"mail@substack.net"},"maintainers":[{"name":"substack","email":"mail@substack.net"}],"publish_time":1346997765184,"_hasShrinkwrap":false,"_cnpm_publish_time":1346997765184,"_cnpmcore_publish_time":"2021-12-16T21:08:58.884Z"},"0.4.2":{"name":"upnode","description":"transactional connection queue for dnode","version":"0.4.2","repository":{"type":"git","url":"git://github.com/substack/upnode.git"},"main":"index.js","keywords":["dnode","queue","message","reconnect","transaction","interruption"],"directories":{"example":"example","test":"test"},"scripts":{"test":"tap test/*.js"},"dependencies":{"dnode":"~1.0.1"},"devDependencies":{"tap":"~0.2.6"},"engines":{"node":">=0.4.0"},"license":"MIT","author":{"name":"James Halliday","email":"mail@substack.net","url":"http://substack.net"},"_id":"upnode@0.4.2","dist":{"shasum":"5ca405d8d516717ec32b5052616f231825b67202","size":9302,"noattachment":false,"key":"/upnode/-/upnode-0.4.2.tgz","tarball":"http://name.csiicloud.com:7001/upnode/download/upnode-0.4.2.tgz"},"maintainers":[{"name":"substack","email":"mail@substack.net"}],"publish_time":1344742715762,"_hasShrinkwrap":false,"_cnpm_publish_time":1344742715762,"_cnpmcore_publish_time":"2021-12-16T21:08:59.091Z"},"0.4.1":{"name":"upnode","description":"transactional connection queue for dnode","version":"0.4.1","repository":{"type":"git","url":"git://github.com/substack/upnode.git"},"main":"index.js","keywords":["dnode","queue","message","reconnect","transaction","interruption"],"directories":{"example":"example","test":"test"},"scripts":{"test":"tap test/*.js"},"dependencies":{"dnode":"~1.0.1"},"devDependencies":{"tap":"~0.2.6"},"engines":{"node":">=0.4.0"},"license":"MIT","author":{"name":"James Halliday","email":"mail@substack.net","url":"http://substack.net"},"_id":"upnode@0.4.1","dist":{"shasum":"3a9c474e308c51762aa6594e51b5506e4d75e41b","size":9302,"noattachment":false,"key":"/upnode/-/upnode-0.4.1.tgz","tarball":"http://name.csiicloud.com:7001/upnode/download/upnode-0.4.1.tgz"},"maintainers":[{"name":"substack","email":"mail@substack.net"}],"publish_time":1343556411877,"_hasShrinkwrap":false,"_cnpm_publish_time":1343556411877,"_cnpmcore_publish_time":"2021-12-16T21:08:59.356Z"},"0.4.0":{"name":"upnode","description":"transactional connection queue for dnode","version":"0.4.0","repository":{"type":"git","url":"git://github.com/substack/upnode.git"},"main":"index.js","keywords":["dnode","queue","message","reconnect","transaction","interruption"],"directories":{"example":"example","test":"test"},"scripts":{"test":"tap test/*.js"},"dependencies":{"dnode":"~1.0.1"},"devDependencies":{"tap":"~0.2.6"},"engines":{"node":">=0.4.0"},"license":"MIT","author":{"name":"James Halliday","email":"mail@substack.net","url":"http://substack.net"},"_id":"upnode@0.4.0","dist":{"shasum":"33fe8fd67242727a1f77a4ed4dc2bda903cf0e4d","size":9302,"noattachment":false,"key":"/upnode/-/upnode-0.4.0.tgz","tarball":"http://name.csiicloud.com:7001/upnode/download/upnode-0.4.0.tgz"},"maintainers":[{"name":"substack","email":"mail@substack.net"}],"publish_time":1343555245147,"_hasShrinkwrap":false,"_cnpm_publish_time":1343555245147,"_cnpmcore_publish_time":"2021-12-16T21:08:59.604Z"},"0.3.1":{"name":"upnode","description":"transactional connection queue for dnode","version":"0.3.1","repository":{"type":"git","url":"git://github.com/substack/upnode.git"},"main":"index.js","keywords":["dnode","queue","message","reconnect","transaction","interruption"],"directories":{"lib":".","example":"example","test":"test"},"scripts":{"test":"tap test/*.js"},"dependencies":{"dnode":"~1.0.1"},"devDependencies":{"tap":"~0.2.6"},"engines":{"node":">=0.4.0"},"license":"MIT","author":{"name":"James Halliday","email":"mail@substack.net","url":"http://substack.net"},"_id":"upnode@0.3.1","dist":{"shasum":"fd171c5c68462b277ab2a4f0091fa24674859e0b","size":6374,"noattachment":false,"key":"/upnode/-/upnode-0.3.1.tgz","tarball":"http://name.csiicloud.com:7001/upnode/download/upnode-0.3.1.tgz"},"maintainers":[{"name":"substack","email":"mail@substack.net"}],"publish_time":1343444515869,"_hasShrinkwrap":false,"_cnpm_publish_time":1343444515869,"_cnpmcore_publish_time":"2021-12-16T21:08:59.830Z"},"0.3.0":{"name":"upnode","description":"transactional connection queue for dnode","version":"0.3.0","repository":{"type":"git","url":"git://github.com/substack/upnode.git"},"main":"index.js","keywords":["dnode","queue","message","reconnect","transaction","interruption"],"directories":{"lib":".","example":"example","test":"test"},"scripts":{"test":"tap test/*.js"},"dependencies":{"dnode":"~1.0.1"},"devDependencies":{"tap":"~0.2.6"},"engines":{"node":">=0.4.0"},"license":"MIT","author":{"name":"James Halliday","email":"mail@substack.net","url":"http://substack.net"},"_id":"upnode@0.3.0","dist":{"shasum":"06cf9cc62a66de1e55e02f11a424c7012e02238f","size":6358,"noattachment":false,"key":"/upnode/-/upnode-0.3.0.tgz","tarball":"http://name.csiicloud.com:7001/upnode/download/upnode-0.3.0.tgz"},"maintainers":[{"name":"substack","email":"mail@substack.net"}],"publish_time":1343439172274,"_hasShrinkwrap":false,"_cnpm_publish_time":1343439172274,"_cnpmcore_publish_time":"2021-12-16T21:09:00.044Z"},"0.2.4":{"name":"upnode","description":"transactional connection queue for dnode","version":"0.2.4","repository":{"type":"git","url":"git://github.com/substack/upnode.git"},"main":"index.js","keywords":["dnode","queue","message","reconnect","transaction","interruption"],"directories":{"lib":".","example":"example","test":"test"},"scripts":{"test":"tap test/*.js"},"dependencies":{"dnode":"~0.9.10"},"devDependencies":{"tap":"0.0.x"},"engines":{"node":">=0.4.0"},"license":"MIT","author":{"name":"James Halliday","email":"mail@substack.net","url":"http://substack.net"},"_id":"upnode@0.2.4","dist":{"shasum":"ffa4b1757271f41a5d1ea166fafc8f59fcb82086","size":5998,"noattachment":false,"key":"/upnode/-/upnode-0.2.4.tgz","tarball":"http://name.csiicloud.com:7001/upnode/download/upnode-0.2.4.tgz"},"maintainers":[{"name":"substack","email":"mail@substack.net"}],"publish_time":1342314110896,"_hasShrinkwrap":false,"_cnpm_publish_time":1342314110896,"_cnpmcore_publish_time":"2021-12-16T21:09:00.474Z"},"0.2.3":{"name":"upnode","description":"transactional connection queue for dnode","version":"0.2.3","repository":{"type":"git","url":"git://github.com/substack/upnode.git"},"main":"index.js","keywords":["dnode","queue","message","reconnect","transaction","interruption"],"directories":{"lib":".","example":"example","test":"test"},"scripts":{"test":"tap test/*.js"},"dependencies":{"dnode":"~0.9.10"},"devDependencies":{"tap":"0.0.x"},"engines":{"node":">=0.4.0"},"license":"MIT","author":{"name":"James Halliday","email":"mail@substack.net","url":"http://substack.net"},"_npmUser":{"name":"substack","email":"mail@substack.net"},"_id":"upnode@0.2.3","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.19","_nodeVersion":"v0.6.11","_defaultsLoaded":true,"dist":{"shasum":"8818413ae957680f74a6536dbb4514b651febe71","size":5997,"noattachment":false,"key":"/upnode/-/upnode-0.2.3.tgz","tarball":"http://name.csiicloud.com:7001/upnode/download/upnode-0.2.3.tgz"},"maintainers":[{"name":"substack","email":"mail@substack.net"}],"publish_time":1337493065897,"_hasShrinkwrap":false,"_cnpm_publish_time":1337493065897,"_cnpmcore_publish_time":"2021-12-16T21:09:00.791Z"},"0.2.2":{"name":"upnode","description":"transactional connection queue for dnode","version":"0.2.2","repository":{"type":"git","url":"git://github.com/substack/upnode.git"},"main":"index.js","keywords":["dnode","queue","message","reconnect","transaction","interruption"],"directories":{"lib":".","example":"example","test":"test"},"scripts":{"test":"tap test/*.js"},"dependencies":{"dnode":"~0.9.10"},"devDependencies":{"tap":"0.0.x"},"engines":{"node":">=0.4.0"},"license":"MIT","author":{"name":"James Halliday","email":"mail@substack.net","url":"http://substack.net"},"_npmUser":{"name":"substack","email":"mail@substack.net"},"_id":"upnode@0.2.2","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.1","_nodeVersion":"v0.6.11","_defaultsLoaded":true,"dist":{"shasum":"2fc1b7d4287c6d159f9929e8196478703ea3e593","size":6023,"noattachment":false,"key":"/upnode/-/upnode-0.2.2.tgz","tarball":"http://name.csiicloud.com:7001/upnode/download/upnode-0.2.2.tgz"},"maintainers":[{"name":"substack","email":"mail@substack.net"}],"publish_time":1334406530798,"_hasShrinkwrap":false,"_cnpm_publish_time":1334406530798,"_cnpmcore_publish_time":"2021-12-16T21:09:01.031Z"},"0.2.1":{"name":"upnode","description":"transactional connection queue for dnode","version":"0.2.1","repository":{"type":"git","url":"git://github.com/substack/upnode.git"},"main":"index.js","keywords":["dnode","queue","message","reconnect","transaction","interruption"],"directories":{"lib":".","example":"example","test":"test"},"scripts":{"test":"tap test/*.js"},"dependencies":{"dnode":">=0.9.3 <0.10.0"},"devDependencies":{"tap":"0.0.x"},"engines":{"node":">=0.4.0"},"license":"MIT","author":{"name":"James Halliday","email":"mail@substack.net","url":"http://substack.net"},"_npmUser":{"name":"substack","email":"mail@substack.net"},"_id":"upnode@0.2.1","optionalDependencies":{},"_engineSupported":true,"_npmVersion":"1.1.1","_nodeVersion":"v0.6.11","_defaultsLoaded":true,"dist":{"shasum":"189592eb6fdcc60dedf357ead76e34e112ec19fd","size":6005,"noattachment":false,"key":"/upnode/-/upnode-0.2.1.tgz","tarball":"http://name.csiicloud.com:7001/upnode/download/upnode-0.2.1.tgz"},"maintainers":[{"name":"substack","email":"mail@substack.net"}],"publish_time":1334399551349,"_hasShrinkwrap":false,"_cnpm_publish_time":1334399551349,"_cnpmcore_publish_time":"2021-12-16T21:09:01.266Z"},"0.2.0":{"name":"upnode","description":"transactional connection queue for dnode","version":"0.2.0","repository":{"type":"git","url":"git://github.com/substack/upnode.git"},"main":"index.js","keywords":["dnode","queue","message","reconnect","transaction","interruption"],"directories":{"lib":".","example":"example","test":"test"},"scripts":{"test":"tap test/*.js"},"dependencies":{"dnode":">=0.9.3 <0.10.0"},"devDependencies":{"tap":"0.0.x"},"engines":{"node":">=0.4.0"},"license":"MIT","author":{"name":"James Halliday","email":"mail@substack.net","url":"http://substack.net"},"_npmUser":{"name":"substack","email":"mail@substack.net"},"_id":"upnode@0.2.0","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"85bf82cb03f3bfb2c0d51b567e20b9406c706f29","size":5621,"noattachment":false,"key":"/upnode/-/upnode-0.2.0.tgz","tarball":"http://name.csiicloud.com:7001/upnode/download/upnode-0.2.0.tgz"},"maintainers":[{"name":"substack","email":"mail@substack.net"}],"publish_time":1332550792443,"_hasShrinkwrap":false,"_cnpm_publish_time":1332550792443,"_cnpmcore_publish_time":"2021-12-16T21:09:01.489Z"},"0.1.1":{"name":"upnode","description":"transactional connection queue for dnode","version":"0.1.1","repository":{"type":"git","url":"git://github.com/substack/upnode.git"},"main":"index.js","keywords":["dnode","queue","message","reconnect","transaction","interruption"],"directories":{"lib":".","example":"example","test":"test"},"scripts":{"test":"tap test/*.js"},"dependencies":{"dnode":">=0.9.3 <0.10.0"},"devDependencies":{"tap":"0.0.x"},"engines":{"node":">=0.4.0"},"license":"MIT","author":{"name":"James Halliday","email":"mail@substack.net","url":"http://substack.net"},"_npmUser":{"name":"substack","email":"mail@substack.net"},"_id":"upnode@0.1.1","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"c9fb791bbd79381b44ebb1d5cb84699a1d5cf579","size":5230,"noattachment":false,"key":"/upnode/-/upnode-0.1.1.tgz","tarball":"http://name.csiicloud.com:7001/upnode/download/upnode-0.1.1.tgz"},"maintainers":[{"name":"substack","email":"mail@substack.net"}],"publish_time":1332293241757,"_hasShrinkwrap":false,"_cnpm_publish_time":1332293241757,"_cnpmcore_publish_time":"2021-12-16T21:09:01.718Z"},"0.1.0":{"name":"upnode","description":"transactional connection queue for dnode","version":"0.1.0","repository":{"type":"git","url":"git://github.com/substack/upnode.git"},"main":"index.js","keywords":["dnode","queue","message","reconnect","transaction","interruption"],"directories":{"lib":".","example":"example","test":"test"},"scripts":{"test":"tap test/*.js"},"dependencies":{"dnode":">=0.9.3 <0.10.0"},"devDependencies":{"tap":"0.0.x"},"engines":{"node":">=0.4.0"},"license":"MIT","author":{"name":"James Halliday","email":"mail@substack.net","url":"http://substack.net"},"_npmUser":{"name":"substack","email":"mail@substack.net"},"_id":"upnode@0.1.0","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"90f30b9f198b580b9cb8635803a9bb766b1c2e1b","size":4980,"noattachment":false,"key":"/upnode/-/upnode-0.1.0.tgz","tarball":"http://name.csiicloud.com:7001/upnode/download/upnode-0.1.0.tgz"},"maintainers":[{"name":"substack","email":"mail@substack.net"}],"publish_time":1325270646254,"_hasShrinkwrap":false,"_cnpm_publish_time":1325270646254,"_cnpmcore_publish_time":"2021-12-16T21:09:02.004Z"},"0.0.1":{"name":"upnode","description":"transactional connection queue for dnode","version":"0.0.1","repository":{"type":"git","url":"git://github.com/substack/upnode.git"},"main":"index.js","keywords":["dnode","queue","message","reconnect","transaction","interruption"],"directories":{"lib":".","example":"example","test":"test"},"scripts":{"test":"tap test/*.js"},"dependencies":{"dnode":">=0.9.3 <0.10.0"},"devDependencies":{"tap":"0.0.x"},"engines":{"node":">=0.4.0"},"license":"MIT","author":{"name":"James Halliday","email":"mail@substack.net","url":"http://substack.net"},"_npmUser":{"name":"substack","email":"mail@substack.net"},"_id":"upnode@0.0.1","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"48f7c8b0568584aa6c66cb54d2894be9a0bb0a06","size":4704,"noattachment":false,"key":"/upnode/-/upnode-0.0.1.tgz","tarball":"http://name.csiicloud.com:7001/upnode/download/upnode-0.0.1.tgz"},"maintainers":[{"name":"substack","email":"mail@substack.net"}],"publish_time":1325270604653,"_hasShrinkwrap":false,"_cnpm_publish_time":1325270604653,"_cnpmcore_publish_time":"2021-12-16T21:09:02.245Z"},"0.0.0":{"name":"upnode","description":"transactional connection queue for dnode","version":"0.0.0","repository":{"type":"git","url":"git://github.com/substack/upnode.git"},"main":"index.js","keywords":["dnode","queue","message","reconnect","transaction","interruption"],"directories":{"lib":".","example":"example","test":"test"},"scripts":{"test":"tap test/*.js"},"dependencies":{"dnode":">=0.9.3 <0.10.0"},"devDependencies":{"tap":"0.0.x"},"engines":{"node":">=0.4.0"},"license":"MIT","author":{"name":"James Halliday","email":"mail@substack.net","url":"http://substack.net"},"_npmUser":{"name":"substack","email":"mail@substack.net"},"_id":"upnode@0.0.0","_engineSupported":true,"_npmVersion":"1.0.106","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"10ffaee981a720dc40e5aefec2a72e16a153ed48","size":4292,"noattachment":false,"key":"/upnode/-/upnode-0.0.0.tgz","tarball":"http://name.csiicloud.com:7001/upnode/download/upnode-0.0.0.tgz"},"maintainers":[{"name":"substack","email":"mail@substack.net"}],"publish_time":1324114604457,"_hasShrinkwrap":false,"_cnpm_publish_time":1324114604457,"_cnpmcore_publish_time":"2021-12-16T21:09:02.588Z"}},"readme":"# upnode\n\nKeep a dnode connection alive and re-establish state between reconnects\nwith a transactional message queue.\n\n[![build status](https://secure.travis-ci.org/substack/upnode.png)](http://travis-ci.org/substack/upnode)\n\n# examples\n\n## simple service interruption\n\nserver.js:\n\n``` js\nvar upnode = require('upnode');\n\nvar server = upnode(function (client, conn) {\n    this.time = function (cb) { cb(new Date().toString()) };\n});\nserver.listen(7000);\n```\n\nNow when you want to make a call to the server, guard your connection in the\n`up()` function. If the connection is alive the callback fires immediately.\nIf the connection is down the callback is buffered and fires when the connection\nis ready again.\n\nclient.js:\n\n``` js\nvar upnode = require('upnode');\nvar up = upnode.connect(7000);\n\nsetInterval(function () {\n    up(function (remote) {\n        remote.time(function (t) {\n            console.log('time = ' + t);\n        });\n    });\n}, 1000);\n```\n\nIf we fire the client up first, then wait a few seconds to fire up the server:\n\n```\n$ node client.js & sleep 5; node server.js\n[1] 9165\ntime = Fri Dec 16 2011 23:47:48 GMT-0800 (PST)\ntime = Fri Dec 16 2011 23:47:48 GMT-0800 (PST)\ntime = Fri Dec 16 2011 23:47:48 GMT-0800 (PST)\ntime = Fri Dec 16 2011 23:47:48 GMT-0800 (PST)\ntime = Fri Dec 16 2011 23:47:48 GMT-0800 (PST)\ntime = Fri Dec 16 2011 23:47:49 GMT-0800 (PST)\ntime = Fri Dec 16 2011 23:47:50 GMT-0800 (PST)\ntime = Fri Dec 16 2011 23:47:51 GMT-0800 (PST)\ntime = Fri Dec 16 2011 23:47:52 GMT-0800 (PST)\n```\n\nwe can see that the first 5 seconds worth of requests are buffered and all come\nthrough at `23:47:48`. The requests then come in one per second once the\nconnection has been established.\n\nIf we kill the server and bring it back again while the client is running we can\nobserve a similar discontinuity as all the pending requests come through at `23:50:20`:\n\n```\n$ node client.js \ntime = Fri Dec 16 2011 23:50:11 GMT-0800 (PST)\ntime = Fri Dec 16 2011 23:50:11 GMT-0800 (PST)\ntime = Fri Dec 16 2011 23:50:12 GMT-0800 (PST)\ntime = Fri Dec 16 2011 23:50:13 GMT-0800 (PST)\ntime = Fri Dec 16 2011 23:50:20 GMT-0800 (PST)\ntime = Fri Dec 16 2011 23:50:20 GMT-0800 (PST)\ntime = Fri Dec 16 2011 23:50:20 GMT-0800 (PST)\ntime = Fri Dec 16 2011 23:50:20 GMT-0800 (PST)\ntime = Fri Dec 16 2011 23:50:20 GMT-0800 (PST)\ntime = Fri Dec 16 2011 23:50:20 GMT-0800 (PST)\ntime = Fri Dec 16 2011 23:50:20 GMT-0800 (PST)\ntime = Fri Dec 16 2011 23:50:21 GMT-0800 (PST)\ntime = Fri Dec 16 2011 23:50:22 GMT-0800 (PST)\n```\n\n## authenticated interruption\n\nOftentimes you'll want to re-establish state between reconnection attempts.\n\nSuppose we have a simple dnode server with a `beep` function protected behind an\n`auth` function:\n\nserver.js:\n\n``` js\nvar upnode = require('upnode');\n\nvar server = upnode(function (client, conn) {\n    this.auth = function (user, pass, cb) {\n        if (user === 'moo' && pass === 'hax') {\n            cb(null, {\n                beep : function (fn) { fn('boop at ' + new Date) }\n            });\n        }\n        else cb('ACCESS DENIED')\n    };\n});\nserver.listen(7000);\n```\n\nNow instead of doing `remote.auth()` every time the connection drops, we can\npass in a callback to `upnode.connect()` that will handle the re-authentication\nand expose the authenticated object to the `up()` transaction:\n\nclient.js:\n\n``` js\nvar upnode = require('upnode');\nvar up = upnode.connect(7000, function (remote, conn) {\n    remote.auth('moo', 'hax', function (err, res) {\n        if (err) console.error(err)\n        else conn.emit('up', res)\n    });\n});\n\nsetInterval(function () {\n    up(function (remote) {\n        remote.beep(function (s) {\n            console.log(s);\n        });\n    });\n}, 1000);\n```\n\nNow spin up the client.js and the server.js:\n\n```\n$ node client.js & sleep 2; node server.js\n[1] 10892\nboop at Sat Dec 17 2011 01:30:15 GMT-0800 (PST)\nboop at Sat Dec 17 2011 01:30:15 GMT-0800 (PST)\nboop at Sat Dec 17 2011 01:30:16 GMT-0800 (PST)\nboop at Sat Dec 17 2011 01:30:17 GMT-0800 (PST)\nboop at Sat Dec 17 2011 01:30:18 GMT-0800 (PST)\n```\n\nKill the server a few times and observe that the client re-authenticates between\nreconnects.\n\nYou could do any other sort of stateful operation here besides authentication.\nJust emit the object you want to expose to `up()` through\n`conn.emit('up', obj)`.\n\n## ssl stream example\n\nThis is very similar to the first example, except using tls streams. You can use\nany kind of full-duplex stream here, not just ssl.\n\nserver.js:\n\n``` js\nvar upnode = require('upnode');\nvar fs = require('fs');\nvar tls = require('tls');\n\nvar opts = {\n    key : fs.readFileSync(__dirname + '/keys/key.pem'),\n    cert : fs.readFileSync(__dirname + '/keys/cert.pem'),\n};\nvar server = tls.createServer(opts, function (stream) {\n    var up = upnode(function (client, conn) {\n        this.time = function (cb) { cb(new Date().toString()) };\n    });\n    up.pipe(stream).pipe(up);\n});\nserver.listen(7000);\n```\n\nclient.js:\n\n``` js\nvar upnode = require('upnode');\nvar tls = require('tls');\nvar up = upnode.connect({\n    createStream : tls.connect.bind(null, 7000)\n});\n\nsetInterval(function () {\n    up(function (remote) {\n        remote.time(function (t) {\n            console.log('time = ' + t);\n        });\n    });\n}, 1000);\n```\n\nIt behaves just like the first example when run on the command line, except that\nour connections go over ssl now:\n\n```\n$ node client.js & sleep 5; node server.js\n[1] 9178\ntime = Sun Jul 29 2012 02:31:00 GMT-0700 (PDT)\ntime = Sun Jul 29 2012 02:31:00 GMT-0700 (PDT)\ntime = Sun Jul 29 2012 02:31:00 GMT-0700 (PDT)\ntime = Sun Jul 29 2012 02:31:00 GMT-0700 (PDT)\ntime = Sun Jul 29 2012 02:31:00 GMT-0700 (PDT)\ntime = Sun Jul 29 2012 02:31:01 GMT-0700 (PDT)\ntime = Sun Jul 29 2012 02:31:02 GMT-0700 (PDT)\ntime = Sun Jul 29 2012 02:31:03 GMT-0700 (PDT)\n```\n\n# methods\n\n``` js\nvar upnode = require('upnode')\n```\n\n## var up = upnode(cons)\n\nCreate an upnode object `up` from the dnode constructor `cons`.\n\n`up` is a pipe-able object, which is a useful property when writing custom\nservers like in the ssl example.\n\nIn both server and client mode each side will send periodic heartbeats to the\nother side and sever the connection if data isn't getting through. Clients\ncreated with `up.connect()` will attempt to reconnect continuously.\n\n# up.listen(...)\n\nListen on a port with `net.createServer()`.\n\nTo use something other than `net.createServer()`, exploit how `up` is a\nfull-duplex stream that you can pipe data into and out of.\n\nReturns the net server object.\n\n## var cup = up.connect(...)\n\nEstablish an upnode connection with `net.connect()`.\n\nPass in dnode-style arguments where port, host, path, and options objects are\ninferred by the types of the arguments.\n\nReturns a transaction function `up()` for the connection.\n\nYou can use other streams besides `net.connect()` streams by passing in a\n`{ createStream : createStream }` object where `createStream()` is a function\nthat returns a new stream object. The connection will call `createStream()` when\nthe heartbeat fails or the previous stream ended or had errors.\n\nThe `cup` object emits `\"up\"` when the link is established, `\"down\" when the link\nis severed, and `\"reconnect\"` for each reconnection attempt.\n\nIf you give `.connect()` a callback, you *must* emit an `'up', remote` event on\nthe `conn` object with the remote object you want to make available to the\nsubsequent `up()` transactions.\n\nIf you don't pass a callback to `.connect()` this default callback is used:\n\n``` js\nfunction (remote, conn) {\n    conn.emit('up', remote);\n}\n```\n\nThe `conn` is just the dnode object.\n\nThe callback must emit an `'up'` event so that state can be rebuilt between\nconnection interruptions. A great use for this behavior is authentication where\ncertain functionality is only made available through the callback to a\n`.auth(username, password, cb)` function on the remote. For that case you could\nwrite a connection callback that looks like:\n\n``` js\nfunction (remote, conn) {\n    remote.auth(user, pass, function (err, obj) {\n        if (err) console.error(err)\n        else conn.emit('up', obj)\n    });\n}\n```\n\nand your dnode sessions will be re-authenticated between reconnects. The remote\nobject handle in `up()` will be the `obj` result provided by the `auth()`\ncallback.\n\nBesides being passed directly to dnode's `.connect(...)`, these additional\noption-object arguments are respected:\n\n* ping - Interval in milliseconds to send pings to the remote server.\n    Default 10000. Set to 0 to disable pings.\n* timeout - Time in milliseconds to wait for a ping response before triggering a\n    reconnect. Default 5000.\n* reconnect - Time in milliseconds to wait between reconnection attempts.\n    Default 1000.\n* createStream - Connection function to use instead of `net.connect()`.\n\n## var cup = upnode.connect(...)\n\nShortcut for `upnode({}).connect(...)` like how `dnode.connect(...)` is a\nshortcut for `dnode({}).connect(...)`.\n\n## cup(timeout=0, cb)\n\nCreate a new transaction from the callback `cb`.\n\nIf the connection is ready, `cb(remote, conn)` will fire immediately.\nOtherwise `cb` will be queued until the connection is available again.\n\nIf `timeout` is specified, fire `cb()` after `timeout` milliseconds with no\narguments. Here's an example of using timeouts:\n\n``` js\nup(5000, function (remote) {\n    if (!remote) console.error('resource timed out')\n    else remote.beep()\n})\n```\n\n## cup.close()\n\nClose the connection and don't attempt to reconnect.\n\n# install\n\nWith [npm](http://npmjs.org) do:\n\n```\nnpm install upnode\n```\n\n# license\n\nMIT\n","_attachments":{},"homepage":"https://github.com/substack/upnode#readme","bugs":{"url":"https://github.com/substack/upnode/issues"},"license":"MIT"}