Пример #1
0
			subscribe: function (req, models) {

				// If a request object was sent, get its socket, otherwise assume a socket was sent.
				var socket = req.socket ? req.socket : req;

				var self = this;

				// Subscribe to class room to hear about new models
				if (!models) {
					STRINGFILE.logDeprecationNotice(
						'Model.subscribe(socket, null, ...)',
							STRINGFILE.get('links.docs.sockets.pubsub'),
							sails.log.debug) &&
					STRINGFILE.logUpgradeNotice(STRINGFILE.get('upgrade.classrooms'), [], sails.log.debug);

					this.watch(req);
					return;
				}

				// Subscribe to model instances
				models = self.pluralize(models);
				var ids = _.pluck(models,'id');

				_.each(ids,function (id) {
					sails.log.silly(
						'Subscribed to the ' + 
						self.globalId + ' with id=' + id + '\t(room :: ' + self.room(id) + ')'
					);
					sails.sockets.join( socket, self.room(id) );
				});
			},
Пример #2
0
			unsubscribe: function (req, models, cb) {

				// If a request object was sent, get its socket, otherwise assume a socket was sent.
				var socket = req.socket ? req.socket : req;

				var self = this;
				
				// If no models provided, unsubscribe from the class room
				if (!models) {
					STRINGFILE.logDeprecationNotice(
						'Model.unsubscribe(socket, null, ...)',
							STRINGFILE.get('links.docs.sockets.pubsub'),
							sails.log.debug) &&
					STRINGFILE.logUpgradeNotice(STRINGFILE.get('upgrade.classrooms'), [], sails.log.debug);

					return cb ?
						sails.sockets.leave( socket, self.classRoom(), cb )
						: sails.sockets.leave( socket, self.classRoom());
				}
				
				models = self.pluralize(models);
				var ids = _.pluck(models,'id');
				_.each(ids,function (id) {
					sails.log.silly(
						'Unsubscribed from the ' + 
						self.globalId + ' with id=' + id + '\t(room :: ' + self.room(id) + ')'
					);
					cb ? 
					sails.sockets.leave( socket, self.room(id), cb )
					: sails.sockets.leave( socket, self.room(id));
				});
			},
Пример #3
0
				sails.after('lifted', function () {
					STRINGFILE.logDeprecationNotice('sails.config[404]',
						STRINGFILE.get('links.docs.migrationGuide.responses'),
						sails.log.debug);
					sails.log.debug('Please define a "response" instead. (i.e. api/responses/notFound.js)');
					sails.log.debug('Your old handler is being ignored. (the format has been upgraded in v0.10)');
				});
Пример #4
0
			publish: function (models, eventName, context, data, req) {
				var self = this;

				// If the event name is an object, assume we're seeing `publish(models, data, req)`
				if (typeof eventName === 'object') {
					req = context;
					context = null;
					data = eventName;
					eventName = null;
				}

				// Default to the event name being the model identity
				if (!eventName) {
					eventName = this.identity;
				}

				// If the context is an object, assume we're seeing `publish(models, eventName, data, req)`
				if (typeof context === 'object' && context !== null) {
					req = data;
					data = context;
					context = null;
				}

				// Default to using the message context
				if (!context) {
					sails.log.warn('`Model.publish` should specify a context; using "message".  Try `Model.message` instead?');
					context = 'message';
				}

				// If a request object was sent, get its socket, otherwise assume a socket was sent.
				var socketToOmit = (req && req.socket ? req.socket : req);

				// If no models provided, publish to the class room
				if (!models) {
					STRINGFILE.logDeprecationNotice(
						'Model.publish(null, ...)',
							STRINGFILE.get('links.docs.sockets.pubsub'),
							sails.log.debug) && 
					STRINGFILE.logUpgradeNotice(STRINGFILE.get('upgrade.classrooms'), [], sails.log.debug);

					sails.log.silly('Published ', eventName, ' to ', self.classRoom());
					sails.sockets.broadcast( self.classRoom(), eventName, data, socketToOmit );
					return;
				}

				// Otherwise publish to each instance room
				else {
					models = this.pluralize(models);
					var ids = _.pluck(models, this.primaryKey);
					if ( ids.length === 0 ) {
						sails.log.warn('Can\'t publish a message to an empty list of instances-- ignoring...');
					}
					_.each(ids,function eachInstance (id) {
						var room = self.room(id, context);
						sails.log.silly("Published ", eventName, " to ", room);
						sails.sockets.broadcast( room, eventName, data, socketToOmit );
					});
				}

			},
Пример #5
0
				sails.after('lifted', function () {
					STRINGFILE.logDeprecationNotice('sails.config[500]',
						STRINGFILE.get('links.docs.migrationGuide.responses'),
						sails.log.debug);
					sails.log.debug('sails.config[500] (i.e. `config/500.js`) has been superceded in Sails v0.10.');
					sails.log.debug('Please define a "response" instead. (i.e. api/responses/serverError.js)');
					sails.log.debug('Your old handler is being ignored. (the format has been upgraded in v0.10)');
				});
Пример #6
0
      classRoom: function () {
        STRINGFILE.logDeprecationNotice(
          'Model.classRoom',
            STRINGFILE.get('links.docs.sockets.pubsub'),
            sails.log.debug) &&
        STRINGFILE.logUpgradeNotice(STRINGFILE.get('upgrade.classrooms'), [], sails.log.debug);

        return this._classRoom();
      },
Пример #7
0
			classRoom: function () {
				STRINGFILE.logDeprecationNotice(
					'Model.classRoom',
						STRINGFILE.get('links.docs.sockets.pubsub'),
						sails.log.debug) && 
				STRINGFILE.logUpgradeNotice(STRINGFILE.get('upgrade.classrooms'), [], sails.log.debug);

				return 'sails_model_create_'+this.identity;
			},
Пример #8
0
				sails.after('lifted', function () {

					STRINGFILE.logDeprecationNotice(
						'config.adapters',
						STRINGFILE.get('links.docs.migrationGuide.connections'),
						sails.log.debug) &&
					STRINGFILE.logUpgradeNotice(
						STRINGFILE.get('upgrade.config.connections'), [], sails.log.debug);

				});
Пример #9
0
      unsubscribe: function (req, records, contexts) {

        // If a request object was sent, get its socket, otherwise assume a socket was sent.
        var socket = req.socket ? req.socket : req;

        if (!socket.manager) {
          return sails.log.warn('`Model.unsubscribe()` called by a non-socket request. Only requests originating from a connected socket may be subscribed. Ignoring...');
        }

        var self = this;

        // If no records provided, unsubscribe from the class room
        if (!records) {
          STRINGFILE.logDeprecationNotice(
            'Model.unsubscribe(socket, null, ...)',
              STRINGFILE.get('links.docs.sockets.pubsub'),
              sails.log.debug) &&
          STRINGFILE.logUpgradeNotice(STRINGFILE.get('upgrade.classrooms'), [], sails.log.debug);

          this.unwatch();

        }

        contexts = contexts || this.getAllContexts();

        if (contexts === true) {
          contexts = this.getAllContexts();
        }

        if (sails.config.sockets['backwardsCompatibilityFor0.9SocketClients'] && socket.handshake) {
          var sdk = getSDKMetadata(socket.handshake);
          var isLegacySocketClient = sdk.version === '0.9.0';
          if (isLegacySocketClient) {
            contexts.push('legacy_v0.9');
          }
        }

        records = self.pluralize(records);
        var ids = _.pluck(records, this.primaryKey);
        _.each(ids,function (id) {
          _.each(contexts, function(context) {
            sails.log.silly(
              'Unsubscribed from the ' +
              self.globalId + ' with id=' + id + '\t(room :: ' + self.room(id, context) + ')'
            );
            sails.sockets.leave( socket, self.room(id, context));
          });
        });
      },
Пример #10
0
			subscribe: function (req, models, contexts) {

				// If a request object was sent, get its socket, otherwise assume a socket was sent.
				var socket = req.socket ? req.socket : req;

				var self = this;

				// Subscribe to class room to hear about new models
				if (!models) {
					STRINGFILE.logDeprecationNotice(
						'Model.subscribe(socket, null, ...)',
							STRINGFILE.get('links.docs.sockets.pubsub'),
							sails.log.debug) &&
					STRINGFILE.logUpgradeNotice(STRINGFILE.get('upgrade.classrooms'), [], sails.log.debug);

					this.watch(req);
					return;
				}

				contexts = contexts || this.autosubscribe;

				if (!contexts) {
					sails.log.warn("`subscribe` called without context on a model with autosubscribe:false.  No action will be taken.");
					return;
				}

				if (contexts === true || contexts == '*') {
					contexts = this.getAllContexts();
				} else if (sails.util.isString(contexts)) {
					contexts = [contexts];
				}

				// Subscribe to model instances
				models = self.pluralize(models);
				var ids = _.pluck(models, this.primaryKey);

				_.each(ids,function (id) {
					_.each(contexts, function(context) {
					sails.log.silly(
							'Subscribed to the ' + 
							self.globalId + ' with id=' + id + '\t(room :: ' + self.room(id, context) + ')'
						);
						sails.sockets.join( socket, self.room(id, context) );
					});
				});
			},
Пример #11
0
			publish: function (models, message, data, req) {
				var self = this;

				if (typeof message === 'object') {
					req = data;
					data = message;
					message = null;
				}

				if (!message) {
					message = 'message';
				}

				// If a request object was sent, get its socket, otherwise assume a socket was sent.
				var socketToOmit = !sails.config.blueprints.mirror && (req && req.socket ? req.socket : req);

				// If no models provided, publish to the class room
				if (!models) {
					STRINGFILE.logDeprecationNotice(
						'Model.publish(null, ...)',
							STRINGFILE.get('links.docs.sockets.pubsub'),
							sails.log.debug) && 
					STRINGFILE.logUpgradeNotice(STRINGFILE.get('upgrade.classrooms'), [], sails.log.debug);

					sails.log.silly("Published ", message, " to ", self.classRoom());
					sails.sockets.broadcast( self.classRoom(), message, data, socketToOmit );
					return;
				}

				// Otherwise publish to each instance room
				else {
					models = this.pluralize(models);
					var ids = _.pluck(models,'id');
					if ( ids.length === 0 ) {
						sails.log.warn('Can\'t publish a message to an empty list of instances-- ignoring...');
					}
					_.each(ids,function eachInstance (id) {
						var room = self.room(id);
						sails.log.silly("Published ", message, " to ", room);
						sails.sockets.broadcast( room, message, data, socketToOmit );
					});
				}

			},
Пример #12
0
			introduce: function(id, req) {

				STRINGFILE.logDeprecationNotice(
					'Model.introduce',
						STRINGFILE.get('links.docs.sockets.pubsub'),
						sails.log.debug) && 
				STRINGFILE.logUpgradeNotice(STRINGFILE.get('upgrade.classrooms'), [], sails.log.debug);

				// If a request object was sent, get its socket, otherwise assume a socket was sent.
				var socketToOmit = !sails.config.blueprints.mirror && (req && req.socket ? req.socket : req);

				var self = this;
				sails.log.silly("Introduced model " + self.room(id));
				_.each(this.subscribers(), function(socketId) {

					if (socketToOmit && socketToOmit.id === socketId) {
						return;
					}

					sails.sockets.join(socketId, self.room(id));
				});
			},
Пример #13
0
			unsubscribe: function (req, models, contexts) {

				// If a request object was sent, get its socket, otherwise assume a socket was sent.
				var socket = req.socket ? req.socket : req;

				var self = this;
				
				// If no models provided, unsubscribe from the class room
				if (!models) {
					STRINGFILE.logDeprecationNotice(
						'Model.unsubscribe(socket, null, ...)',
							STRINGFILE.get('links.docs.sockets.pubsub'),
							sails.log.debug) &&
					STRINGFILE.logUpgradeNotice(STRINGFILE.get('upgrade.classrooms'), [], sails.log.debug);

					this.unwatch();

				}

				contexts = contexts || this.getAllContexts();

				if (contexts === true) {
					contexts = this.getAllContexts();
				}
				
				models = self.pluralize(models);
				var ids = _.pluck(models, this.primaryKey);
				_.each(ids,function (id) {
					_.each(contexts, function(context) {
						sails.log.silly(
							'Unsubscribed from the ' + 
							self.globalId + ' with id=' + id + '\t(room :: ' + self.room(id, context) + ')'
						);
						sails.sockets.leave( socket, self.room(id, context));
					});
				});
			},
Пример #14
0
      subscribe: function (req, records, contexts) {
        // If a request object was sent, get its socket, otherwise assume a socket was sent.
        var socket = req.socket ? req.socket : req;

        if (!socket.manager) {
          return sails.log.warn('`Model.subscribe()` called by a non-socket request. Only requests originating from a connected socket may be subscribed. Ignoring...');
        }

        var self = this;

        // Subscribe to class room to hear about new records
        if (!records) {
          sails.log.warn('Missing or empty second argument `records`. API is `.subscribe(request, records [, contexts])`.');
          STRINGFILE.logDeprecationNotice(
            'Model.subscribe(socket, null, ...)',
              STRINGFILE.get('links.docs.sockets.pubsub'),
              sails.log.debug) &&
          STRINGFILE.logUpgradeNotice(STRINGFILE.get('upgrade.classrooms'), [], sails.log.debug);

          this.watch(req);
          return;
        }

        contexts = contexts || this.autosubscribe;

        if (!contexts) {
          sails.log.warn("`subscribe` called without context on a model with autosubscribe:false.  No action will be taken.");
          return;
        }

        if (contexts === true || contexts == '*') {
          contexts = this.getAllContexts();
        } else if (sails.util.isString(contexts)) {
          contexts = [contexts];
        }


        // If the subscribing socket is using the legacy (v0.9.x) socket SDK (sails.io.js),
        // always subscribe the client to the `legacy_v0.9` context.
        if (sails.config.sockets['backwardsCompatibilityFor0.9SocketClients'] && socket.handshake) {
          var sdk = getSDKMetadata(socket.handshake);
          var isLegacySocketClient = sdk.version === '0.9.0';
          if (isLegacySocketClient) {
            contexts.push('legacy_v0.9');
          }
        }

        // Subscribe to model instances
        records = self.pluralize(records);
        var ids = _.pluck(records, this.primaryKey);

        _.each(ids,function (id) {
          _.each(contexts, function(context) {
            sails.log.silly(
              'Subscribed to the ' +
              self.globalId + ' with id=' + id + '\t(room :: ' + self.room(id, context) + ')'
            );

            sails.sockets.join( socket, self.room(id, context) );
          });
        });
      },
Пример #15
0
      publish: function (models, eventName, context, data, req) {
        var self = this;

        // If the event name is an object, assume we're seeing `publish(models, data, req)`
        if (typeof eventName === 'object') {
          req = context;
          context = null;
          data = eventName;
          eventName = null;
        }

        // Default to the event name being the model identity
        if (!eventName) {
          eventName = this.identity;
        }

        // If the context is an object, assume we're seeing `publish(models, eventName, data, req)`
        if (typeof context === 'object' && context !== null) {
          req = data;
          data = context;
          context = null;
        }

        // Default to using the message context
        if (!context) {
          sails.log.warn('`Model.publish` should specify a context; defaulting to "message".  Try `Model.message` instead?');
          context = 'message';
        }

        // If a request object was sent, get its socket, otherwise assume a socket was sent.
        var socketToOmit = (req && req.socket ? req.socket : req);

        // If no models provided, publish to the class room
        if (!models) {
          STRINGFILE.logDeprecationNotice(
            'Model.publish(null, ...)',
              STRINGFILE.get('links.docs.sockets.pubsub'),
              sails.log.debug) &&
          STRINGFILE.logUpgradeNotice(STRINGFILE.get('upgrade.classrooms'), [], sails.log.debug);

          sails.log.silly('Published ', eventName, ' to ', self.classRoom());
          self.broadcast( self.classRoom(), eventName, data, socketToOmit );
          return;
        }

        // Otherwise publish to each instance room
        else {
          models = this.pluralize(models);
          var ids = _.pluck(models, this.primaryKey);
          if ( ids.length === 0 ) {
            sails.log.warn('Can\'t publish a message to an empty list of instances-- ignoring...');
          }
          _.each(ids,function eachInstance (id) {
            var room = self.room(id, context);
            sails.log.silly("Published ", eventName, " to ", room);
            self.broadcast( room, eventName, data, socketToOmit );


            // Also broadcasts a message to the legacy instance room (derived by
            // using the `legacy_v0.9` context).
            // Uses traditional eventName === "message".
            // Uses traditional message format.
            if (sails.config.sockets['backwardsCompatibilityFor0.9SocketClients']) {
              var legacyRoom = self.room(id, 'legacy_v0.9');
              var legacyMsg = _.cloneDeep(data);
              legacyMsg.model = self.identity;
              if (legacyMsg.verb === 'created') { legacyMsg.verb = 'create'; }
              if (legacyMsg.verb === 'updated') { legacyMsg.verb = 'update'; }
              if (legacyMsg.verb === 'destroyed') { legacyMsg.verb = 'destroy'; }
              self.broadcast( legacyRoom, 'message', legacyMsg, socketToOmit );
            }
          });
        }

      },