diff --git a/packages/livedata/package.js b/packages/livedata/package.js index 6ae652d2bb..bf0ee19af3 100644 --- a/packages/livedata/package.js +++ b/packages/livedata/package.js @@ -10,22 +10,20 @@ Package.on_use(function (api) { api.use(['check', 'random', 'ejson', 'json', 'underscore', 'deps', 'logging'], ['client', 'server']); - // XXX we do NOT require webapp here, because it's OK to use this package on a - // server architecture without making a server (in order to do - // server-to-server DDP as a client). So if you want to provide a DDP server, - // you need to use webapp before you use livedata. + // XXX we do NOT require webapp or routepolicy here, because it's OK to use + // this package on a server architecture without making a server (in order to + // do server-to-server DDP as a client). So if you want to provide a DDP + // server, you need to use webapp before you use livedata. // Transport api.use('reload', 'client'); - api.use('routepolicy', 'server'); api.add_files(['sockjs-0.3.4.js', 'stream_client_sockjs.js'], 'client'); api.add_files('stream_client_nodejs.js', 'server'); api.add_files('stream_client_common.js', ['client', 'server']); api.add_files('stream_server.js', 'server'); - // livedata_connection.js uses a Minimongo collection internally to - // manage the current set of subscriptions. + // we depend on LocalCollection._diffObjects and ._applyChanges. api.use('minimongo', ['client', 'server']); api.add_files('writefence.js', 'server'); diff --git a/packages/livedata/stream_server.js b/packages/livedata/stream_server.js index e3125198c4..24a1ff8f8e 100644 --- a/packages/livedata/stream_server.js +++ b/packages/livedata/stream_server.js @@ -1,5 +1,3 @@ -Meteor._routePolicy.declare('/sockjs/', 'network'); - // unique id for this instantiation of the server. If this changes // between client reconnects, the client will reload. You can set the // environment variable "SERVER_ID" to control this. For example, if @@ -14,10 +12,16 @@ Meteor._DdpStreamServer = function () { self.registration_callbacks = []; self.open_sockets = []; + self.prefix = '/sockjs'; + // We don't depend directly on routepolicy because we don't want to pull in + // webapp stuff if we're just doing server-to-server DDP as a client. + if (Meteor._routePolicy) + Meteor._routePolicy.declare(self.prefix + '/', 'network'); + // set up sockjs var sockjs = Npm.require('sockjs'); self.server = sockjs.createServer({ - prefix: '/sockjs', log: function(){}, + prefix: self.prefix, log: function(){}, // this is the default, but we code it explicitly because we depend // on it in stream_client:HEARTBEAT_TIMEOUT heartbeat_delay: 25000, @@ -77,6 +81,7 @@ _.extend(Meteor._DdpStreamServer.prototype, { // Redirect /websocket to /sockjs/websocket in order to not expose // sockjs to clients that want to use raw websockets _redirectWebsocketEndpoint: function() { + var self = this; // Unfortunately we can't use a connect middleware here since // sockjs installs itself prior to all existing listeners // (meaning prior to any connect middlewares) so we need to take @@ -95,7 +100,7 @@ _.extend(Meteor._DdpStreamServer.prototype, { if (request.url === '/websocket' || request.url === '/websocket/') - request.url = '/sockjs/websocket'; + request.url = self.prefix + '/websocket'; _.each(oldAppListeners, function(oldListener) { oldListener.apply(app, args); diff --git a/tools/packages.js b/tools/packages.js index b37e0b2617..2e28248073 100644 --- a/tools/packages.js +++ b/tools/packages.js @@ -1479,8 +1479,8 @@ _.extend(Package.prototype, { var names = _.union( // standard client packages for the classic meteor stack. // XXX remove and make everyone explicitly declare all dependencies - ['meteor', 'webapp', 'deps', 'session', 'livedata', 'mongo-livedata', - 'spark', 'templating', 'startup', 'past', 'check'], + ['meteor', 'webapp', 'routepolicy', 'deps', 'session', 'livedata', + 'mongo-livedata', 'spark', 'templating', 'startup', 'past', 'check'], project.get_packages(appDir)); var arch = sliceName === "server" ? "native" : "browser";