Advertisement
Guest User

Untitled

a guest
Aug 19th, 2019
100
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.28 KB | None | 0 0
  1. import { createEffect, createEvent, createStore, merge } from 'effector';
  2. import nanoid from 'nanoid';
  3. import { request, parseObject } from 'jsonrpc-lite';
  4.  
  5. const wsURL = `ws://localhost:${process.env.WS_PORT}`;
  6. let socket;
  7.  
  8. const awaitingMap = new Map();
  9.  
  10. function cleanSocket() {
  11. socket.onopen = null;
  12. socket.onclose = null;
  13. socket.onerror = null;
  14. socket.onmessage = null;
  15. }
  16.  
  17. const open = createEvent('open');
  18. const closed = createEvent('closed');
  19. const error = createEvent('error');
  20.  
  21. const onMessage = createEvent('message');
  22.  
  23. onMessage
  24. .map(({ data }) => JSON.parse(data))
  25. .watch(payload => {
  26. const {
  27. payload: { id, result },
  28. type
  29. } = parseObject(payload);
  30.  
  31. const { resolve, reject } = awaitingMap.get(id);
  32. if (type === 'error') {
  33. reject(result);
  34. }
  35. awaitingMap.delete(id);
  36. resolve(result);
  37. });
  38.  
  39. export const fetch = createEffect('fetch', {
  40. handler({ method, params }) {
  41. const id = nanoid();
  42. socket.send(request(id, method, params));
  43. const promise = new Promise((resolve, reject) => {
  44. awaitingMap.set(id, { resolve, reject });
  45. });
  46.  
  47. return promise;
  48. }
  49. });
  50.  
  51. fetch.watch(payload => console.log(`Запрос`, payload));
  52. fetch.done.watch(payload => console.log('Ответ на запрос', payload));
  53. fetch.fail.watch(payload => console.log('Ошибка', payload));
  54.  
  55. export function disconnect() {
  56. console.warn('websocket connection is disconnect');
  57. socket.close();
  58. }
  59.  
  60. export function connect() {
  61. try {
  62. console.info(`Try to connect on ${wsURL}`);
  63. socket = new WebSocket(wsURL);
  64. } catch (e) {
  65. throw new Error(e.message);
  66. }
  67.  
  68. socket.onopen = event => open(event);
  69. socket.onclose = ({ wasClean, code, reason }) =>
  70. closed({ wasClean, code, reason });
  71. socket.onerror = err => error(err);
  72. socket.onmessage = msg => onMessage(msg);
  73. }
  74.  
  75. open.watch(() => {
  76. console.info('connect ready');
  77. });
  78.  
  79. closed.watch(({ code, reason }) => {
  80. console.warn(`[close] Connection is closed, code=${code} reason=${reason}`);
  81. });
  82.  
  83. error.watch(err => {
  84. console.error(`[error] ${err.message}`);
  85. });
  86.  
  87. merge([closed, error]).watch(() => cleanSocket());
  88.  
  89. const $status = createStore('closed')
  90. .on(open, () => 'open')
  91. .on(closed, () => 'closed')
  92. .on(error, () => 'error');
  93.  
  94. $status.watch(state => console.log(`websocket is ${state}`));
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement