diff --git a/packages/livedata/.npm/npm-shrinkwrap.json b/packages/livedata/.npm/npm-shrinkwrap.json index 459b9d5564..3d7836988b 100644 --- a/packages/livedata/.npm/npm-shrinkwrap.json +++ b/packages/livedata/.npm/npm-shrinkwrap.json @@ -16,7 +16,7 @@ }, "websocket": { "version": "1.0.7", - "from": "websocket@1.0.7", + "from": "https://registry.npmjs.org/websocket/-/websocket-1.0.7.tgz", "resolved": "https://registry.npmjs.org/websocket/-/websocket-1.0.7.tgz" } } diff --git a/packages/livedata/livedata_connection.js b/packages/livedata/livedata_connection.js index 605563bb4a..7f390c46cd 100644 --- a/packages/livedata/livedata_connection.js +++ b/packages/livedata/livedata_connection.js @@ -1,5 +1,6 @@ if (Meteor.isServer) { // XXX namespacing + var path = Npm.require('path'); var Future = Npm.require(path.join('fibers', 'future')); } diff --git a/packages/livedata/livedata_tests.js b/packages/livedata/livedata_tests.js index c0a3953e74..a86c968b84 100644 --- a/packages/livedata/livedata_tests.js +++ b/packages/livedata/livedata_tests.js @@ -597,6 +597,27 @@ if (Meteor.isClient) { ]); } +(function () { + if (Meteor.isServer) { + Meteor.methods({ + "s2s": function (arg) { + return "s2s " + arg; + } + }); + } + var conn; + testAsyncMulti("livedata - connect works from both client and server", [ + function (test, expect) { + conn = Meteor.connect(Meteor.absoluteUrl()); + conn.call('s2s', 'foo', expect(function (err, res) { + if (err) + throw err; + test.equal(res, "s2s foo"); + })); + } + ]); +})(); + // XXX some things to test in greater detail: // staying in simulation mode // time warp diff --git a/packages/livedata/package.js b/packages/livedata/package.js index 0daca03c0e..a79de184b4 100644 --- a/packages/livedata/package.js +++ b/packages/livedata/package.js @@ -15,7 +15,7 @@ Package.on_use(function (api) { api.use('routepolicy', 'server'); api.add_files(['sockjs-0.3.4.js', 'stream_client_sockjs.js'], 'client'); - api.add_files('stream_client_nodejs.js', 'client'); + api.add_files('stream_client_nodejs.js', 'server'); api.add_files('stream_server.js', 'server'); // livedata_connection.js uses a Minimongo collection internally to @@ -27,7 +27,7 @@ Package.on_use(function (api) { api.add_files('livedata_common.js', ['client', 'server']); - api.add_files('livedata_connection.js', 'client'); + api.add_files('livedata_connection.js', ['client', 'server']); api.add_files('livedata_server.js', 'server'); diff --git a/packages/livedata/stream_client_nodejs.js b/packages/livedata/stream_client_nodejs.js index 3bab4e9919..87b3f7d32d 100644 --- a/packages/livedata/stream_client_nodejs.js +++ b/packages/livedata/stream_client_nodejs.js @@ -54,7 +54,7 @@ Meteor._DdpClientStream = function (endpoint) { status: "connecting", connected: false, retryCount: 0 }; - self.statusListeners = window.Deps && new Deps.Dependency; + self.statusListeners = typeof Deps !== 'undefined' && new Deps.Dependency; self.statusChanged = function () { if (self.statusListeners) self.statusListeners.changed(); @@ -73,6 +73,8 @@ _.extend(Meteor._DdpClientStream, { _endpointToUrl: function (endpoint) { // XXX should be secure! // among other problems + endpoint = endpoint.replace(/^http(s)?:\/\//, ""); + endpoint = endpoint.replace(/\/$/, ""); return 'ws://' + endpoint + '/websocket'; } }); @@ -200,7 +202,7 @@ _.extend(Meteor._DdpClientStream.prototype, { _cleanupConnection: function () { var self = this; - self.clearConnectionTimer(); + self._clearConnectionTimer(); if (self.currentConnection) { self.currentConnection.close(); self.currentConnection = null; @@ -236,6 +238,12 @@ _.extend(Meteor._DdpClientStream.prototype, { self.statusChanged(); }, + _lostConnection: function () { + var self = this; + self._cleanupConnection(); + self._retryLater(); + }, + _retryTimeout: function (count) { var self = this; @@ -288,6 +296,8 @@ _.extend(Meteor._DdpClientStream.prototype, { // launch a connect attempt. we have no way to track it. we either // get an _onConnect event, or we don't. + // XXX: set up a timeout on this. + // we would like to specify 'ddp' as the protocol here, but // unfortunately WebSocket-Node fails the handshake if we ask for // a protocol and the server doesn't send one back (and sockjs