The code powering m.abunchtell.com https://m.abunchtell.com
Você não pode selecionar mais de 25 tópicos Os tópicos devem começar com uma letra ou um número, podem incluir traços ('-') e podem ter até 35 caracteres.
 
 
 
 

83 linhas
2.0 KiB

  1. import WebSocketClient from '@gamestdio/websocket';
  2. const randomIntUpTo = max => Math.floor(Math.random() * Math.floor(max));
  3. export function connectStream(path, pollingRefresh = null, callbacks = () => ({ onConnect() {}, onDisconnect() {}, onReceive() {} })) {
  4. return (dispatch, getState) => {
  5. const streamingAPIBaseURL = getState().getIn(['meta', 'streaming_api_base_url']);
  6. const accessToken = getState().getIn(['meta', 'access_token']);
  7. const { onConnect, onDisconnect, onReceive } = callbacks(dispatch, getState);
  8. let polling = null;
  9. const setupPolling = () => {
  10. pollingRefresh(dispatch, () => {
  11. polling = setTimeout(() => setupPolling(), 20000 + randomIntUpTo(20000));
  12. });
  13. };
  14. const clearPolling = () => {
  15. if (polling) {
  16. clearTimeout(polling);
  17. polling = null;
  18. }
  19. };
  20. const subscription = getStream(streamingAPIBaseURL, accessToken, path, {
  21. connected () {
  22. if (pollingRefresh) {
  23. clearPolling();
  24. }
  25. onConnect();
  26. },
  27. disconnected () {
  28. if (pollingRefresh) {
  29. polling = setTimeout(() => setupPolling(), randomIntUpTo(40000));
  30. }
  31. onDisconnect();
  32. },
  33. received (data) {
  34. onReceive(data);
  35. },
  36. reconnected () {
  37. if (pollingRefresh) {
  38. clearPolling();
  39. pollingRefresh(dispatch);
  40. }
  41. onConnect();
  42. },
  43. });
  44. const disconnect = () => {
  45. if (subscription) {
  46. subscription.close();
  47. }
  48. clearPolling();
  49. };
  50. return disconnect;
  51. };
  52. }
  53. export default function getStream(streamingAPIBaseURL, accessToken, stream, { connected, received, disconnected, reconnected }) {
  54. const params = [ `stream=${stream}` ];
  55. const ws = new WebSocketClient(`${streamingAPIBaseURL}/api/v1/streaming/?${params.join('&')}`, accessToken);
  56. ws.onopen = connected;
  57. ws.onmessage = e => received(JSON.parse(e.data));
  58. ws.onclose = disconnected;
  59. ws.onreconnect = reconnected;
  60. return ws;
  61. };