reusable-streaming (#5709)
This commit is contained in:
		
							parent
							
								
									f6bc6399e2
								
							
						
					
					
						commit
						c73a1fb537
					
				| @ -1,4 +1,4 @@ | ||||
| import createStream from '../stream'; | ||||
| import { connectStream } from '../stream'; | ||||
| import { | ||||
|   updateTimeline, | ||||
|   deleteFromTimelines, | ||||
| @ -12,42 +12,19 @@ import { getLocale } from '../locales'; | ||||
| const { messages } = getLocale(); | ||||
| 
 | ||||
| export function connectTimelineStream (timelineId, path, pollingRefresh = null) { | ||||
|   return (dispatch, getState) => { | ||||
|     const streamingAPIBaseURL = getState().getIn(['meta', 'streaming_api_base_url']); | ||||
|     const accessToken = getState().getIn(['meta', 'access_token']); | ||||
| 
 | ||||
|   return connectStream (path, pollingRefresh, (dispatch, getState) => { | ||||
|     const locale = getState().getIn(['meta', 'locale']); | ||||
|     let polling = null; | ||||
| 
 | ||||
|     const setupPolling = () => { | ||||
|       polling = setInterval(() => { | ||||
|         pollingRefresh(dispatch); | ||||
|       }, 20000); | ||||
|     }; | ||||
| 
 | ||||
|     const clearPolling = () => { | ||||
|       if (polling) { | ||||
|         clearInterval(polling); | ||||
|         polling = null; | ||||
|       } | ||||
|     }; | ||||
| 
 | ||||
|     const subscription = createStream(streamingAPIBaseURL, accessToken, path, { | ||||
| 
 | ||||
|       connected () { | ||||
|         if (pollingRefresh) { | ||||
|           clearPolling(); | ||||
|         } | ||||
|     return { | ||||
|       onConnect() { | ||||
|         dispatch(connectTimeline(timelineId)); | ||||
|       }, | ||||
| 
 | ||||
|       disconnected () { | ||||
|         if (pollingRefresh) { | ||||
|           setupPolling(); | ||||
|         } | ||||
|       onDisconnect() { | ||||
|         dispatch(disconnectTimeline(timelineId)); | ||||
|       }, | ||||
| 
 | ||||
|       received (data) { | ||||
|       onReceive (data) { | ||||
|         switch(data.event) { | ||||
|         case 'update': | ||||
|           dispatch(updateTimeline(timelineId, JSON.parse(data.payload))); | ||||
| @ -60,26 +37,8 @@ export function connectTimelineStream (timelineId, path, pollingRefresh = null) | ||||
|           break; | ||||
|         } | ||||
|       }, | ||||
| 
 | ||||
|       reconnected () { | ||||
|         if (pollingRefresh) { | ||||
|           clearPolling(); | ||||
|           pollingRefresh(dispatch); | ||||
|         } | ||||
|         dispatch(connectTimeline(timelineId)); | ||||
|       }, | ||||
| 
 | ||||
|     }; | ||||
|   }); | ||||
| 
 | ||||
|     const disconnect = () => { | ||||
|       if (subscription) { | ||||
|         subscription.close(); | ||||
|       } | ||||
|       clearPolling(); | ||||
|     }; | ||||
| 
 | ||||
|     return disconnect; | ||||
|   }; | ||||
| } | ||||
| 
 | ||||
| function refreshHomeTimelineAndNotification (dispatch) { | ||||
|  | ||||
| @ -1,5 +1,66 @@ | ||||
| import WebSocketClient from 'websocket.js'; | ||||
| 
 | ||||
| export function connectStream(path, pollingRefresh = null, callbacks = () => ({ onConnect() {}, onDisconnect() {}, onReceive() {} })) { | ||||
|   return (dispatch, getState) => { | ||||
|     const streamingAPIBaseURL = getState().getIn(['meta', 'streaming_api_base_url']); | ||||
|     const accessToken = getState().getIn(['meta', 'access_token']); | ||||
|     const { onConnect, onDisconnect, onReceive } = callbacks(dispatch, getState); | ||||
|     let polling = null; | ||||
| 
 | ||||
|     const setupPolling = () => { | ||||
|       polling = setInterval(() => { | ||||
|         pollingRefresh(dispatch); | ||||
|       }, 20000); | ||||
|     }; | ||||
| 
 | ||||
|     const clearPolling = () => { | ||||
|       if (polling) { | ||||
|         clearInterval(polling); | ||||
|         polling = null; | ||||
|       } | ||||
|     }; | ||||
| 
 | ||||
|     const subscription = getStream(streamingAPIBaseURL, accessToken, path, { | ||||
|       connected () { | ||||
|         if (pollingRefresh) { | ||||
|           clearPolling(); | ||||
|         } | ||||
|         onConnect(); | ||||
|       }, | ||||
| 
 | ||||
|       disconnected () { | ||||
|         if (pollingRefresh) { | ||||
|           setupPolling(); | ||||
|         } | ||||
|         onDisconnect(); | ||||
|       }, | ||||
| 
 | ||||
|       received (data) { | ||||
|         onReceive(data); | ||||
|       }, | ||||
| 
 | ||||
|       reconnected () { | ||||
|         if (pollingRefresh) { | ||||
|           clearPolling(); | ||||
|           pollingRefresh(dispatch); | ||||
|         } | ||||
|         onConnect(); | ||||
|       }, | ||||
| 
 | ||||
|     }); | ||||
| 
 | ||||
|     const disconnect = () => { | ||||
|       if (subscription) { | ||||
|         subscription.close(); | ||||
|       } | ||||
|       clearPolling(); | ||||
|     }; | ||||
| 
 | ||||
|     return disconnect; | ||||
|   }; | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| export default function getStream(streamingAPIBaseURL, accessToken, stream, { connected, received, disconnected, reconnected }) { | ||||
|   const ws = new WebSocketClient(`${streamingAPIBaseURL}/api/v1/streaming/?access_token=${accessToken}&stream=${stream}`); | ||||
| 
 | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user