forked from cybrespace/pinafore
		
	
		
			
				
	
	
		
			70 lines
		
	
	
	
		
			1.6 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			70 lines
		
	
	
	
		
			1.6 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
import { paramsString } from '../_utils/ajax'
 | 
						|
import noop from 'lodash/noop'
 | 
						|
import { importWebSocketClient } from '../_utils/asyncModules'
 | 
						|
 | 
						|
function getStreamName (timeline) {
 | 
						|
  switch (timeline) {
 | 
						|
    case 'local':
 | 
						|
      return 'public:local'
 | 
						|
    case 'federated':
 | 
						|
      return 'public'
 | 
						|
    case 'home':
 | 
						|
      return 'user'
 | 
						|
    case 'notifications':
 | 
						|
      return 'user:notification'
 | 
						|
  }
 | 
						|
  if (timeline.startsWith('tag/')) {
 | 
						|
    return 'hashtag'
 | 
						|
  }
 | 
						|
  if (timeline.startsWith('list/')) {
 | 
						|
    return 'list'
 | 
						|
  }
 | 
						|
}
 | 
						|
 | 
						|
function getUrl (streamingApi, accessToken, timeline) {
 | 
						|
  let url = `${streamingApi}/api/v1/streaming`
 | 
						|
  let streamName = getStreamName(timeline)
 | 
						|
 | 
						|
  let params = {
 | 
						|
    stream: streamName
 | 
						|
  }
 | 
						|
 | 
						|
  if (timeline.startsWith('tag/')) {
 | 
						|
    params.tag = timeline.split('/').slice(-1)[0]
 | 
						|
  } else if (timeline.startsWith('list/')) {
 | 
						|
    params.list = timeline.split('/').slice(-1)[0]
 | 
						|
  }
 | 
						|
 | 
						|
  if (accessToken) {
 | 
						|
    params.access_token = accessToken
 | 
						|
  }
 | 
						|
 | 
						|
  return url + '?' + paramsString(params)
 | 
						|
}
 | 
						|
 | 
						|
export class TimelineStream {
 | 
						|
  constructor (streamingApi, accessToken, timeline, opts) {
 | 
						|
    let url = getUrl(streamingApi, accessToken, timeline)
 | 
						|
    importWebSocketClient().then(WebSocketClient => {
 | 
						|
      if (this.__closed) {
 | 
						|
        return
 | 
						|
      }
 | 
						|
      const ws = new WebSocketClient(url, null, { backoff: 'exponential' })
 | 
						|
      const onMessage = opts.onMessage || noop
 | 
						|
 | 
						|
      ws.onopen = opts.onOpen || noop
 | 
						|
      ws.onmessage = e => onMessage(JSON.parse(e.data))
 | 
						|
      ws.onclose = opts.onClose || noop
 | 
						|
      ws.onreconnect = opts.onReconnect || noop
 | 
						|
 | 
						|
      this._ws = ws
 | 
						|
    })
 | 
						|
  }
 | 
						|
 | 
						|
  close () {
 | 
						|
    this.__closed = true
 | 
						|
    if (this._ws) {
 | 
						|
      this._ws.close()
 | 
						|
    }
 | 
						|
  }
 | 
						|
}
 |