-
-
Save sergeysova/dbae62f2f99a945e20cb779b88d5043d to your computer and use it in GitHub Desktop.
Revisions
-
sergeysova revised this gist
Aug 22, 2019 . 1 changed file with 11 additions and 9 deletions.There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode charactersOriginal file line number Diff line number Diff line change @@ -7,10 +7,12 @@ const awaitingMap = new Map() let socket const open = createEvent() const closed = createEvent() const error = createEvent() const onMessage = createEvent() export const connect = createEvent() export const disconnect = createEvent() export const fetch = createEffect("fetch") @@ -66,12 +68,12 @@ $status $status.watch((state) => console.log(`websocket is ${state}`)) disconnect.watch(() => { console.warn("websocket connection is disconnect") socket.close() }) connect.watch(() => { try { console.info(`Try to connect on ${wsURL}`) socket = new WebSocket(wsURL) @@ -84,11 +86,11 @@ export function connect() { closed({ wasClean, code, reason }) socket.addEventListener("error", (err) => error(err)) socket.addEventListener("message", (msg) => onMessage(msg)) }) function cleanSocket() { socket.addEventListener("open", null) socket.onclose = null socket.addEventListener("error", null) socket.addEventListener("message", null) } -
sergeysova revised this gist
Aug 22, 2019 . 1 changed file with 70 additions and 70 deletions.There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode charactersOriginal file line number Diff line number Diff line change @@ -1,94 +1,94 @@ import { createEffect, createEvent, createStore, merge } from "effector" import nanoid from "nanoid" import { parseObject, request } from "jsonrpc-lite" const wsURL = `ws://localhost:${process.env.WS_PORT}` const awaitingMap = new Map() let socket const open = createEvent("open") const closed = createEvent("closed") const error = createEvent("error") const onMessage = createEvent("message") export const fetch = createEffect("fetch") const $status = createStore("closed") onMessage .map(({ data }) => JSON.parse(data)) .watch((payload) => { const { payload: { id, result }, type, } = parseObject(payload) const { resolve, reject } = awaitingMap.get(id) if (type === "error") { reject(result) } awaitingMap.delete(id) resolve(result) }) fetch.use(({ method, params }) => { const id = nanoid() socket.send(request(id, method, params)) return new Promise((resolve, reject) => { awaitingMap.set(id, { resolve, reject }) }) }) fetch.watch((payload) => console.log(`Запрос`, payload)) fetch.done.watch((payload) => console.log("Ответ на запрос", payload)) fetch.fail.watch((payload) => console.log("Ошибка", payload)) open.watch(() => { console.info("connect ready") }) closed.watch(({ code, reason }) => { console.warn(`[close] Connection is closed, code=${code} reason=${reason}`) }) error.watch((err) => { console.error(`[error] ${err.message}`) }) merge([closed, error]).watch(() => cleanSocket()) $status .on(open, () => "open") .on(closed, () => "closed") .on(error, () => "error") $status.watch((state) => console.log(`websocket is ${state}`)) export function disconnect() { console.warn("websocket connection is disconnect") socket.close() } export function connect() { try { console.info(`Try to connect on ${wsURL}`) socket = new WebSocket(wsURL) } catch (error) { throw new Error(error.message) } socket.addEventListener("open", (event) => open(event)) socket.onclose = ({ wasClean, code, reason }) => closed({ wasClean, code, reason }) socket.addEventListener("error", (err) => error(err)) socket.addEventListener("message", (msg) => onMessage(msg)) } function cleanSocket() { socket.addEventListener("open", null) socket.onclose = null socket.addEventListener("error", null) socket.addEventListener("message", null) } -
popuguytheparrot revised this gist
Aug 13, 2019 . 1 changed file with 40 additions and 13 deletions.There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode charactersOriginal file line number Diff line number Diff line change @@ -1,5 +1,6 @@ import { createEffect, createEvent, createStore, merge } from 'effector'; import nanoid from 'nanoid'; import { request, parseObject } from 'jsonrpc-lite'; const wsURL = `ws://localhost:${process.env.WS_PORT}`; let socket; @@ -21,30 +22,48 @@ const onMessage = createEvent('message'); onMessage .map(({ data }) => JSON.parse(data)) .watch(payload => { const { payload: { id, result }, type } = parseObject(payload); const { resolve, reject } = awaitingMap.get(id); if (type === 'error') { reject(result); } awaitingMap.delete(id); resolve(result); }); export const fetch = createEffect('fetch', { handler({ method, params }) { const id = nanoid(); socket.send(request(id, method, params)); const promise = new Promise((resolve, reject) => { awaitingMap.set(id, { resolve, reject }); }); return promise; } }); fetch.watch(payload => console.log(`Запрос`, payload)); fetch.done.watch(payload => console.log('Ответ на запрос', payload)); fetch.fail.watch(payload => console.log('Ошибка', payload)); export function disconnect() { console.warn('websocket connection is disconnect'); socket.close(); } export function connect() { try { console.info(`Try to connect on ${wsURL}`); socket = new WebSocket(wsURL); } catch (e) { throw new Error(e.message); } socket.onopen = event => open(event); socket.onclose = ({ wasClean, code, reason }) => @@ -53,15 +72,23 @@ export function connect() { socket.onmessage = msg => onMessage(msg); } open.watch(() => { console.info('connect ready'); }); closed.watch(({ code, reason }) => { console.warn(`[close] Connection is closed, code=${code} reason=${reason}`); }); error.watch(err => { console.error(`[error] ${err.message}`); }); merge([closed, error]).watch(() => cleanSocket()); const $status = createStore('closed') .on(open, () => 'open') .on(closed, () => 'closed') .on(error, () => 'error'); $status.watch(state => console.log(`websocket is ${state}`)); -
popuguytheparrot revised this gist
Aug 8, 2019 . 1 changed file with 45 additions and 31 deletions.There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode charactersOriginal file line number Diff line number Diff line change @@ -1,7 +1,10 @@ import { createEffect, createEvent, createStore, merge } from 'effector'; import nanoid from 'nanoid'; const wsURL = `ws://localhost:${process.env.WS_PORT}`; let socket; const awaitingMap = new Map(); function cleanSocket() { socket.onopen = null; @@ -16,38 +19,49 @@ const error = createEvent('error'); const onMessage = createEvent('message'); onMessage .map(({ data }) => JSON.parse(data)) .filterMap(payload => payload !== 'pong' && payload) .watch(payload => { const { resolve, reject } = awaitingMap.get(payload.id); if (payload.error) { reject(payload); } resolve(payload.result); }); export const fetch = createEffect('fetch', { handler({ method, params }) { const id = nanoid(); socket.send(JSON.stringify({ method, params, id })); const promise = new Promise((resolve, reject) => { awaitingMap.set(id, { resolve, reject }); return { resolve, reject }; }); return promise; } }); export function connect() { socket = new WebSocket(wsURL); socket.onopen = event => open(event); socket.onclose = ({ wasClean, code, reason }) => closed({ wasClean, code, reason }); socket.onerror = err => error(err); socket.onmessage = msg => onMessage(msg); } export function disconnect() { socket.close(); } open.watch(() => socket.send(JSON.stringify('ping'))); merge([closed, error]).watch(() => cleanSocket()); export const $status = createStore('closed') .on(open, () => 'open') .on(closed, () => 'closed') .on(error, () => 'error'); -
popuguytheparrot created this gist
Aug 7, 2019 .There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode charactersOriginal file line number Diff line number Diff line change @@ -0,0 +1,53 @@ import { createEffect, createEvent, createStore } from 'effector'; const wsURL = `ws://localhost:${process.env.WS_PORT}`; const socket = new WebSocket(wsURL); function cleanSocket() { socket.onopen = null; socket.onclose = null; socket.onerror = null; socket.onmessage = null; } const open = createEvent('open'); const closed = createEvent('closed'); const error = createEvent('error'); const onMessage = createEvent('message'); function fetch({ method, params }) { const id = Math.random() + Date.now(); socket.send(JSON.stringify({ method, params, id })); return new Promise((resolve, reject) => { const data = onMessage.map(msg => msg.data).map(JSON.parse); if (data.error) { reject(data); } resolve(data); }); } export const send = createEffect('send', { handler: fetch }); export const $status = createStore('closed') .on(open, () => { socket.send(JSON.stringify('ping')); return 'open'; }) .on(closed, () => { cleanSocket(); return 'closed'; }) .on(error, () => { cleanSocket(); return 'error'; }); socket.onopen = event => open(event); socket.onclose = ({ wasClean, code, reason }) => closed({ wasClean, code, reason }); socket.onerror = err => error(err); socket.onmessage = msg => onMessage(msg);