2017-02-02 01:31:09 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								import  dotenv  from  'dotenv' 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								import  express  from  'express' 
							 
						 
					
						
							
								
									
										
										
										
											2017-02-04 00:34:31 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								import  http  from  'http' 
							 
						 
					
						
							
								
									
										
										
										
											2017-02-02 01:31:09 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								import  redis  from  'redis' 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								import  pg  from  'pg' 
							 
						 
					
						
							
								
									
										
										
										
											2017-02-02 13:56:14 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								import  log  from  'npmlog' 
							 
						 
					
						
							
								
									
										
										
										
											2017-02-04 00:34:31 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								import  url  from  'url' 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								import  WebSocket  from  'ws' 
							 
						 
					
						
							
								
									
										
										
										
											2017-02-05 23:37:25 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								import  uuid  from  'uuid' 
							 
						 
					
						
							
								
									
										
										
										
											2017-02-02 01:31:09 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-02-02 16:11:36 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								const  env  =  process . env . NODE _ENV  ||  'development' 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								dotenv . config ( { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  path :  env  ===  'production'  ?  '.env.production'  :  '.env' 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								} ) 
							 
						 
					
						
							
								
									
										
										
										
											2017-02-02 01:31:09 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								const  pgConfigs  =  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  development :  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    database :  'mastodon_development' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    host :      '/var/run/postgresql' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    max :       10 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  production :  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    user :      process . env . DB _USER  ||  'mastodon' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    password :  process . env . DB _PASS  ||  '' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    database :  process . env . DB _NAME  ||  'mastodon_production' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    host :      process . env . DB _HOST  ||  'localhost' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    port :      process . env . DB _PORT  ||  5432 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    max :       10 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-02-04 00:34:31 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								const  app     =  express ( ) 
							 
						 
					
						
							
								
									
										
										
										
											2017-02-02 01:31:09 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								const  pgPool  =  new  pg . Pool ( pgConfigs [ env ] ) 
							 
						 
					
						
							
								
									
										
										
										
											2017-02-04 00:34:31 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								const  server  =  http . createServer ( app ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								const  wss     =  new  WebSocket . Server ( {  server  } ) 
							 
						 
					
						
							
								
									
										
										
										
											2017-02-02 01:31:09 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-02-07 14:37:12 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								const  redisClient  =  redis . createClient ( { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  host :      process . env . REDIS _HOST      ||  '127.0.0.1' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  port :      process . env . REDIS _PORT      ||  6379 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  password :  process . env . REDIS _PASSWORD 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								} ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								const  subs  =  { } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								redisClient . on ( 'pmessage' ,  ( _ ,  channel ,  message )  =>  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  const  callbacks  =  subs [ channel ] 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  log . silly ( ` New message on channel  ${ channel } ` ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  if  ( ! callbacks )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    return 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  callbacks . forEach ( callback  =>  callback ( message ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								} ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								redisClient . psubscribe ( 'timeline:*' ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								const  subscribe  =  ( channel ,  callback )  =>  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  log . silly ( ` Adding listener for  ${ channel } ` ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  subs [ channel ]  =  subs [ channel ]  ||  [ ] 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  subs [ channel ] . push ( callback ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								const  unsubscribe  =  ( channel ,  callback )  =>  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  log . silly ( ` Removing listener for  ${ channel } ` ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  subs [ channel ]  =  subs [ channel ] . filter ( item  =>  item  !==  callback ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-02-03 18:27:42 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								const  allowCrossDomain  =  ( req ,  res ,  next )  =>  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  res . header ( 'Access-Control-Allow-Origin' ,  '*' ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  res . header ( 'Access-Control-Allow-Headers' ,  'Authorization, Accept, Cache-Control' ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  res . header ( 'Access-Control-Allow-Methods' ,  'GET, OPTIONS' ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  next ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-02-05 23:37:25 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								const  setRequestId  =  ( req ,  res ,  next )  =>  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  req . requestId  =  uuid . v4 ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  res . header ( 'X-Request-Id' ,  req . requestId ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  next ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-02-04 00:34:31 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								const  accountFromToken  =  ( token ,  req ,  next )  =>  { 
							 
						 
					
						
							
								
									
										
										
										
											2017-02-02 01:31:09 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								  pgPool . connect ( ( err ,  client ,  done )  =>  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    if  ( err )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								      return  next ( err ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-02-02 15:20:31 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								    client . query ( 'SELECT oauth_access_tokens.resource_owner_id, users.account_id FROM oauth_access_tokens INNER JOIN users ON oauth_access_tokens.resource_owner_id = users.id WHERE oauth_access_tokens.token = $1 LIMIT 1' ,  [ token ] ,  ( err ,  result )  =>  { 
							 
						 
					
						
							
								
									
										
										
										
											2017-02-02 01:31:09 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								      done ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								      if  ( err )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        return  next ( err ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								      } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								      if  ( result . rows . length  ===  0 )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        err  =  new  Error ( 'Invalid access token' ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        err . statusCode  =  401 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        return  next ( err ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								      } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								      req . accountId  =  result . rows [ 0 ] . account _id 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								      next ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    } ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  } ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-02-04 00:34:31 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								const  authenticationMiddleware  =  ( req ,  res ,  next )  =>  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  if  ( req . method  ===  'OPTIONS' )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    return  next ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  const  authorization  =  req . get ( 'Authorization' ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  if  ( ! authorization )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    const  err  =  new  Error ( 'Missing access token' ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    err . statusCode  =  401 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    return  next ( err ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  const  token  =  authorization . replace ( /^Bearer / ,  '' ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  accountFromToken ( token ,  req ,  next ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-02-02 01:31:09 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								const  errorMiddleware  =  ( err ,  req ,  res ,  next )  =>  { 
							 
						 
					
						
							
								
									
										
										
										
											2017-02-05 23:37:25 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								  log . error ( req . requestId ,  err ) 
							 
						 
					
						
							
								
									
										
										
										
											2017-02-02 01:31:09 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								  res . writeHead ( err . statusCode  ||  500 ,  {  'Content-Type' :  'application/json'  } ) 
							 
						 
					
						
							
								
									
										
										
										
											2017-02-04 00:34:31 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								  res . end ( JSON . stringify ( {  error :  err . statusCode  ?  ` ${ err } `  :  'An unexpected error occurred'  } ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2017-02-02 01:31:09 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-02-02 17:10:59 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								const  placeholders  =  ( arr ,  shift  =  0 )  =>  arr . map ( ( _ ,  i )  =>  ` $ ${ i  +  1  +  shift } ` ) . join ( ', ' ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-02-07 14:37:12 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								const  streamFrom  =  ( id ,  req ,  output ,  attachCloseHandler ,  needsFiltering  =  false )  =>  { 
							 
						 
					
						
							
								
									
										
										
										
											2017-02-05 23:37:25 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								  log . verbose ( req . requestId ,  ` Starting stream from  ${ id }  for  ${ req . accountId } ` ) 
							 
						 
					
						
							
								
									
										
										
										
											2017-02-02 13:56:14 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-02-07 14:37:12 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								  const  listener  =  message  =>  { 
							 
						 
					
						
							
								
									
										
										
										
											2017-02-05 03:19:04 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								    const  {  event ,  payload ,  queued _at  }  =  JSON . parse ( message ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    const  transmit  =  ( )  =>  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								      const  now    =  new  Date ( ) . getTime ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								      const  delta  =  now  -  queued _at ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-02-05 23:37:25 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								      log . silly ( req . requestId ,  ` Transmitting for  ${ req . accountId } :  ${ event }   ${ payload }  Delay:  ${ delta } ms ` ) 
							 
						 
					
						
							
								
									
										
										
										
											2017-02-05 03:19:04 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								      output ( event ,  payload ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    } 
							 
						 
					
						
							
								
									
										
										
										
											2017-02-02 01:31:09 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-02-02 16:35:06 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								    // Only messages that may require filtering are statuses, since notifications
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    // are already personalized and deletes do not matter
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    if  ( needsFiltering  &&  event  ===  'update' )  { 
							 
						 
					
						
							
								
									
										
										
										
											2017-02-02 13:56:14 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								      pgPool . connect ( ( err ,  client ,  done )  =>  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        if  ( err )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								          log . error ( err ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								          return 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								        const  unpackedPayload   =  JSON . parse ( payload ) 
							 
						 
					
						
							
								
									
										
										
										
											2017-02-02 17:10:59 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								        const  targetAccountIds  =  [ unpackedPayload . account . id ] . concat ( unpackedPayload . mentions . map ( item  =>  item . id ) ) . concat ( unpackedPayload . reblog  ?  [ unpackedPayload . reblog . account . id ]  :  [ ] ) 
							 
						 
					
						
							
								
									
										
										
										
											2017-02-02 13:56:14 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-03-02 18:49:32 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								        client . query ( ` SELECT target_account_id FROM blocks WHERE account_id =  $ 1 AND target_account_id IN ( ${ placeholders ( targetAccountIds ,  1 ) } ) UNION SELECT target_account_id FROM mutes WHERE account_id =  $ 1 AND target_account_id IN ( ${ placeholders ( targetAccountIds ,  1 ) } ) ` ,  [ req . accountId ] . concat ( targetAccountIds ) ,  ( err ,  result )  =>  { 
							 
						 
					
						
							
								
									
										
										
										
											2017-02-02 13:56:14 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								          done ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								          if  ( err )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								            log . error ( err ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								            return 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								          } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								          if  ( result . rows . length  >  0 )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								            return 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								          } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-02-05 03:19:04 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								          transmit ( ) 
							 
						 
					
						
							
								
									
										
										
										
											2017-02-02 13:56:14 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								        } ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								      } ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    }  else  { 
							 
						 
					
						
							
								
									
										
										
										
											2017-02-05 03:19:04 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								      transmit ( ) 
							 
						 
					
						
							
								
									
										
										
										
											2017-02-02 13:56:14 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								    } 
							 
						 
					
						
							
								
									
										
										
										
											2017-02-07 14:37:12 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								  } 
							 
						 
					
						
							
								
									
										
										
										
											2017-02-02 01:31:09 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-02-07 14:37:12 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								  subscribe ( id ,  listener ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  attachCloseHandler ( id ,  listener ) 
							 
						 
					
						
							
								
									
										
										
										
											2017-02-04 00:34:31 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								// Setup stream output to HTTP
 
							 
						 
					
						
							
								
									
										
										
										
											2017-02-07 14:37:12 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								const  streamToHttp  =  ( req ,  res )  =>  { 
							 
						 
					
						
							
								
									
										
										
										
											2017-02-04 00:34:31 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								  res . setHeader ( 'Content-Type' ,  'text/event-stream' ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  res . setHeader ( 'Transfer-Encoding' ,  'chunked' ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-02-02 15:20:31 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								  const  heartbeat  =  setInterval ( ( )  =>  res . write ( ':thump\n' ) ,  15000 ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  req . on ( 'close' ,  ( )  =>  { 
							 
						 
					
						
							
								
									
										
										
										
											2017-02-05 23:37:25 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								    log . verbose ( req . requestId ,  ` Ending stream for  ${ req . accountId } ` ) 
							 
						 
					
						
							
								
									
										
										
										
											2017-02-02 15:20:31 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								    clearInterval ( heartbeat ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  } ) 
							 
						 
					
						
							
								
									
										
										
										
											2017-02-02 01:31:09 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-02-04 00:34:31 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								  return  ( event ,  payload )  =>  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    res . write ( ` event:  ${ event } \n ` ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    res . write ( ` data:  ${ payload } \n \n ` ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-02-07 14:37:12 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								// Setup stream end for HTTP
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								const  streamHttpEnd  =  req  =>  ( id ,  listener )  =>  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  req . on ( 'close' ,  ( )  =>  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    unsubscribe ( id ,  listener ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  } ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-02-04 00:34:31 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								// Setup stream output to WebSockets
 
							 
						 
					
						
							
								
									
										
										
										
											2017-02-07 14:37:12 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								const  streamToWs  =  ( req ,  ws )  =>  { 
							 
						 
					
						
							
								
									
										
										
										
											2017-04-02 21:27:14 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								  const  heartbeat  =  setInterval ( ( )  =>  ws . ping ( ) ,  15000 ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-02-04 00:34:31 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								  ws . on ( 'close' ,  ( )  =>  { 
							 
						 
					
						
							
								
									
										
										
										
											2017-02-05 23:37:25 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								    log . verbose ( req . requestId ,  ` Ending stream for  ${ req . accountId } ` ) 
							 
						 
					
						
							
								
									
										
										
										
											2017-04-02 21:27:14 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								    clearInterval ( heartbeat ) 
							 
						 
					
						
							
								
									
										
										
										
											2017-02-04 00:34:31 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								  } ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  return  ( event ,  payload )  =>  { 
							 
						 
					
						
							
								
									
										
										
										
											2017-02-05 23:37:25 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								    if  ( ws . readyState  !==  ws . OPEN )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								      log . error ( req . requestId ,  'Tried writing to closed socket' ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								      return 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-02-04 00:34:31 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								    ws . send ( JSON . stringify ( {  event ,  payload  } ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  } 
							 
						 
					
						
							
								
									
										
										
										
											2017-02-02 01:31:09 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-02-07 14:37:12 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								// Setup stream end for WebSockets
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								const  streamWsEnd  =  ws  =>  ( id ,  listener )  =>  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  ws . on ( 'close' ,  ( )  =>  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    unsubscribe ( id ,  listener ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  } ) 
							 
						 
					
						
							
								
									
										
										
										
											2017-04-02 21:27:14 +02:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  ws . on ( 'error' ,  e  =>  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    unsubscribe ( id ,  listener ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  } ) 
							 
						 
					
						
							
								
									
										
										
										
											2017-02-07 14:37:12 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								} 
							 
						 
					
						
							
								
									
										
										
										
											2017-02-04 00:34:31 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-02-05 23:37:25 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								app . use ( setRequestId ) 
							 
						 
					
						
							
								
									
										
										
										
											2017-02-03 18:27:42 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								app . use ( allowCrossDomain ) 
							 
						 
					
						
							
								
									
										
										
										
											2017-02-02 01:31:09 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								app . use ( authenticationMiddleware ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								app . use ( errorMiddleware ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-02-04 00:34:31 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								app . get ( '/api/v1/streaming/user' ,  ( req ,  res )  =>  { 
							 
						 
					
						
							
								
									
										
										
										
											2017-02-07 14:37:12 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								  streamFrom ( ` timeline: ${ req . accountId } ` ,  req ,  streamToHttp ( req ,  res ) ,  streamHttpEnd ( req ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2017-02-04 00:34:31 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								} ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								app . get ( '/api/v1/streaming/public' ,  ( req ,  res )  =>  { 
							 
						 
					
						
							
								
									
										
										
										
											2017-02-07 14:37:12 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								  streamFrom ( 'timeline:public' ,  req ,  streamToHttp ( req ,  res ) ,  streamHttpEnd ( req ) ,  true ) 
							 
						 
					
						
							
								
									
										
										
										
											2017-02-04 00:34:31 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								} ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-02-06 23:46:14 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								app . get ( '/api/v1/streaming/public/local' ,  ( req ,  res )  =>  { 
							 
						 
					
						
							
								
									
										
										
										
											2017-02-07 14:37:12 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								  streamFrom ( 'timeline:public:local' ,  req ,  streamToHttp ( req ,  res ) ,  streamHttpEnd ( req ) ,  true ) 
							 
						 
					
						
							
								
									
										
										
										
											2017-02-06 23:46:14 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								} ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-02-04 00:34:31 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								app . get ( '/api/v1/streaming/hashtag' ,  ( req ,  res )  =>  { 
							 
						 
					
						
							
								
									
										
										
										
											2017-02-07 14:37:12 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								  streamFrom ( ` timeline:hashtag: ${ req . params . tag } ` ,  req ,  streamToHttp ( req ,  res ) ,  streamHttpEnd ( req ) ,  true ) 
							 
						 
					
						
							
								
									
										
										
										
											2017-02-04 00:34:31 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								} ) 
							 
						 
					
						
							
								
									
										
										
										
											2017-02-02 13:56:14 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-02-06 23:46:14 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								app . get ( '/api/v1/streaming/hashtag/local' ,  ( req ,  res )  =>  { 
							 
						 
					
						
							
								
									
										
										
										
											2017-02-07 14:37:12 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								  streamFrom ( ` timeline:hashtag: ${ req . params . tag } :local ` ,  req ,  streamToHttp ( req ,  res ) ,  streamHttpEnd ( req ) ,  true ) 
							 
						 
					
						
							
								
									
										
										
										
											2017-02-06 23:46:14 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								} ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-02-04 00:34:31 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								wss . on ( 'connection' ,  ws  =>  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  const  location  =  url . parse ( ws . upgradeReq . url ,  true ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  const  token     =  location . query . access _token 
							 
						 
					
						
							
								
									
										
										
										
											2017-02-05 23:37:25 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								  const  req       =  {  requestId :  uuid . v4 ( )  } 
							 
						 
					
						
							
								
									
										
										
										
											2017-02-02 01:31:09 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-02-04 00:34:31 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								  accountFromToken ( token ,  req ,  err  =>  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    if  ( err )  { 
							 
						 
					
						
							
								
									
										
										
										
											2017-02-05 23:37:25 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								      log . error ( req . requestId ,  err ) 
							 
						 
					
						
							
								
									
										
										
										
											2017-02-04 00:34:31 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								      ws . close ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								      return 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    switch ( location . query . stream )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    case  'user' : 
							 
						 
					
						
							
								
									
										
										
										
											2017-02-07 14:37:12 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								      streamFrom ( ` timeline: ${ req . accountId } ` ,  req ,  streamToWs ( req ,  ws ) ,  streamWsEnd ( ws ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2017-02-04 00:34:31 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								      break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    case  'public' : 
							 
						 
					
						
							
								
									
										
										
										
											2017-02-07 14:37:12 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								      streamFrom ( 'timeline:public' ,  req ,  streamToWs ( req ,  ws ) ,  streamWsEnd ( ws ) ,  true ) 
							 
						 
					
						
							
								
									
										
										
										
											2017-02-04 00:34:31 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								      break ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-02-06 23:46:14 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								    case  'public:local' : 
							 
						 
					
						
							
								
									
										
										
										
											2017-02-07 14:37:12 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								      streamFrom ( 'timeline:public:local' ,  req ,  streamToWs ( req ,  ws ) ,  streamWsEnd ( ws ) ,  true ) 
							 
						 
					
						
							
								
									
										
										
										
											2017-02-06 23:46:14 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								      break ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-02-04 00:34:31 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								    case  'hashtag' : 
							 
						 
					
						
							
								
									
										
										
										
											2017-02-07 14:37:12 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								      streamFrom ( ` timeline:hashtag: ${ location . query . tag } ` ,  req ,  streamToWs ( req ,  ws ) ,  streamWsEnd ( ws ) ,  true ) 
							 
						 
					
						
							
								
									
										
										
										
											2017-02-04 00:34:31 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								      break ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-02-06 23:46:14 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								    case  'hashtag:local' : 
							 
						 
					
						
							
								
									
										
										
										
											2017-02-07 14:37:12 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								      streamFrom ( ` timeline:hashtag: ${ location . query . tag } :local ` ,  req ,  streamToWs ( req ,  ws ) ,  streamWsEnd ( ws ) ,  true ) 
							 
						 
					
						
							
								
									
										
										
										
											2017-02-06 23:46:14 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								      break ; 
							 
						 
					
						
							
								
									
										
										
										
											2017-02-04 00:34:31 +01:00 
										
									 
								 
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								    default : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								      ws . close ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  } ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								} ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								server . listen ( process . env . PORT  ||  4000 ,  ( )  =>  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  log . level  =  process . env . LOG _LEVEL  ||  'verbose' 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  log . info ( ` Starting streaming API server on port  ${ server . address ( ) . port } ` ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								} )