Add streaming API channels for local-only statuses
This commit is contained in:
		| @@ -66,7 +66,7 @@ const Lightbox = React.createClass({ | ||||
|     return ( | ||||
|       <Motion defaultStyle={{ backgroundOpacity: 0, opacity: 0, y: -400 }} style={{ backgroundOpacity: spring(isVisible ? 50 : 0), opacity: isVisible ? spring(200) : 0, y: spring(isVisible ? 0 : -400, { stiffness: 150, damping: 12 }) }}> | ||||
|         {({ backgroundOpacity, opacity, y }) => | ||||
|           <div className='lightbox' style={{...overlayStyle, background: `rgba(0, 0, 0, ${backgroundOpacity / 100})`, display: Math.floor(backgroundOpacity) === 0 ? 'none' : 'flex'}} onClick={onOverlayClicked}> | ||||
|           <div className='lightbox' style={{...overlayStyle, background: `rgba(0, 0, 0, ${backgroundOpacity / 100})`, display: Math.floor(backgroundOpacity) === 0 ? 'none' : 'flex', pointerEvents: !isVisible ? 'none' : 'auto'}} onClick={onOverlayClicked}> | ||||
|             <div style={{...dialogStyle, transform: `translateY(${y}px)`, opacity: opacity / 100 }} onClick={this.stopPropagation}> | ||||
|               <IconButton title={intl.formatMessage({ id: 'lightbox.close', defaultMessage: 'Close' })} icon='times' onClick={onCloseClicked} size={16} style={closeStyle} /> | ||||
|               {children} | ||||
|   | ||||
| @@ -34,13 +34,21 @@ class FanOutOnWriteService < BaseService | ||||
|  | ||||
|   def deliver_to_hashtags(status) | ||||
|     Rails.logger.debug "Delivering status #{status.id} to hashtags" | ||||
|  | ||||
|     payload = FeedManager.instance.inline_render(nil, 'api/v1/statuses/show', status) | ||||
|  | ||||
|     status.tags.find_each do |tag| | ||||
|       FeedManager.instance.broadcast("hashtag:#{tag.name}", event: 'update', payload: FeedManager.instance.inline_render(nil, 'api/v1/statuses/show', status)) | ||||
|       FeedManager.instance.broadcast("hashtag:#{tag.name}", event: 'update', payload: payload) | ||||
|       FeedManager.instance.broadcast("hashtag:#{tag.name}:local", event: 'update', payload: payload) if status.account.local? | ||||
|     end | ||||
|   end | ||||
|  | ||||
|   def deliver_to_public(status) | ||||
|     Rails.logger.debug "Delivering status #{status.id} to public timeline" | ||||
|     FeedManager.instance.broadcast(:public, event: 'update', payload: FeedManager.instance.inline_render(nil, 'api/v1/statuses/show', status)) | ||||
|  | ||||
|     payload = FeedManager.instance.inline_render(nil, 'api/v1/statuses/show', status) | ||||
|  | ||||
|     FeedManager.instance.broadcast(:public, event: 'update', payload: payload) | ||||
|     FeedManager.instance.broadcast('public:local', event: 'update', payload: payload) if status.account.local? | ||||
|   end | ||||
| end | ||||
|   | ||||
| @@ -212,11 +212,21 @@ app.get('/api/v1/streaming/public', (req, res) => { | ||||
|   streamFrom(redisClient, 'timeline:public', req, streamToHttp(req, res, redisClient), true) | ||||
| }) | ||||
|  | ||||
| app.get('/api/v1/streaming/public/local', (req, res) => { | ||||
|   const redisClient = getRedisClient() | ||||
|   streamFrom(redisClient, 'timeline:public:local', req, streamToHttp(req, res, redisClient), true) | ||||
| }) | ||||
|  | ||||
| app.get('/api/v1/streaming/hashtag', (req, res) => { | ||||
|   const redisClient = getRedisClient() | ||||
|   streamFrom(redisClient, `timeline:hashtag:${req.params.tag}`, req, streamToHttp(req, res, redisClient), true) | ||||
| }) | ||||
|  | ||||
| app.get('/api/v1/streaming/hashtag/local', (req, res) => { | ||||
|   const redisClient = getRedisClient() | ||||
|   streamFrom(redisClient, `timeline:hashtag:${req.params.tag}:local`, req, streamToHttp(req, res, redisClient), true) | ||||
| }) | ||||
|  | ||||
| wss.on('connection', ws => { | ||||
|   const location = url.parse(ws.upgradeReq.url, true) | ||||
|   const token    = location.query.access_token | ||||
| @@ -238,9 +248,15 @@ wss.on('connection', ws => { | ||||
|     case 'public': | ||||
|       streamFrom(redisClient, 'timeline:public', req, streamToWs(req, ws, redisClient), true) | ||||
|       break; | ||||
|     case 'public:local': | ||||
|       streamFrom(redisClient, 'timeline:public:local', req, streamToWs(req, ws, redisClient), true) | ||||
|       break; | ||||
|     case 'hashtag': | ||||
|       streamFrom(redisClient, `timeline:hashtag:${location.query.tag}`, req, streamToWs(req, ws, redisClient), true) | ||||
|       break; | ||||
|     case 'hashtag:local': | ||||
|       streamFrom(redisClient, `timeline:hashtag:${location.query.tag}:local`, req, streamToWs(req, ws, redisClient), true) | ||||
|       break; | ||||
|     default: | ||||
|       ws.close() | ||||
|     } | ||||
|   | ||||
		Reference in New Issue
	
	Block a user