Skip to content

Instantly share code, notes, and snippets.

@sergeysova
Forked from popuguytheparrot/file.js
Last active March 6, 2024 16:25
Show Gist options
  • Select an option

  • Save sergeysova/dbae62f2f99a945e20cb779b88d5043d to your computer and use it in GitHub Desktop.

Select an option

Save sergeysova/dbae62f2f99a945e20cb779b88d5043d to your computer and use it in GitHub Desktop.

Revisions

  1. sergeysova revised this gist Aug 22, 2019. 1 changed file with 11 additions and 9 deletions.
    20 changes: 11 additions & 9 deletions file.js
    Original file line number Diff line number Diff line change
    @@ -7,10 +7,12 @@ const awaitingMap = new Map()

    let socket

    const open = createEvent("open")
    const closed = createEvent("closed")
    const error = createEvent("error")
    const onMessage = createEvent("message")
    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}`))

    export function disconnect() {
    disconnect.watch(() => {
    console.warn("websocket connection is disconnect")
    socket.close()
    }
    })

    export function connect() {
    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)
    }
    }
  2. sergeysova revised this gist Aug 22, 2019. 1 changed file with 70 additions and 70 deletions.
    140 changes: 70 additions & 70 deletions file.js
    Original 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 { request, parseObject } from 'jsonrpc-lite';
    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}`;
    let socket;
    const wsURL = `ws://localhost:${process.env.WS_PORT}`
    const awaitingMap = new Map()

    const awaitingMap = new Map();
    let socket

    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")

    const open = createEvent('open');
    const closed = createEvent('closed');
    const error = createEvent('error');
    export const fetch = createEffect("fetch")

    const onMessage = createEvent('message');
    const $status = createStore("closed")

    onMessage
    .map(({ data }) => JSON.parse(data))
    .watch(payload => {
    .watch((payload) => {
    const {
    payload: { id, result },
    type
    } = parseObject(payload);
    type,
    } = parseObject(payload)

    const { resolve, reject } = awaitingMap.get(id);
    if (type === 'error') {
    reject(result);
    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;
    }
    });
    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}`)
    })

    fetch.watch(payload => console.log(`Запрос`, payload));
    fetch.done.watch(payload => console.log('Ответ на запрос', payload));
    fetch.fail.watch(payload => console.log('Ошибка', payload));
    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();
    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);
    console.info(`Try to connect on ${wsURL}`)
    socket = new WebSocket(wsURL)
    } catch (error) {
    throw new Error(error.message)
    }

    socket.onopen = event => open(event);
    socket.addEventListener("open", (event) => open(event))
    socket.onclose = ({ wasClean, code, reason }) =>
    closed({ wasClean, code, reason });
    socket.onerror = err => error(err);
    socket.onmessage = msg => onMessage(msg);
    closed({ wasClean, code, reason })
    socket.addEventListener("error", (err) => error(err))
    socket.addEventListener("message", (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}`));
    function cleanSocket() {
    socket.addEventListener("open", null)
    socket.onclose = null
    socket.addEventListener("error", null)
    socket.addEventListener("message", null)
    }
  3. @popuguytheparrot popuguytheparrot revised this gist Aug 13, 2019. 1 changed file with 40 additions and 13 deletions.
    53 changes: 40 additions & 13 deletions file.js
    Original 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))
    .filterMap(payload => payload !== 'pong' && payload)
    .watch(payload => {
    const { resolve, reject } = awaitingMap.get(payload.id);
    if (payload.error) {
    reject(payload);
    const {
    payload: { id, result },
    type
    } = parseObject(payload);

    const { resolve, reject } = awaitingMap.get(id);
    if (type === 'error') {
    reject(result);
    }
    resolve(payload.result);
    awaitingMap.delete(id);
    resolve(result);
    });

    export const fetch = createEffect('fetch', {
    handler({ method, params }) {
    const id = nanoid();
    socket.send(JSON.stringify({ method, params, id }));
    socket.send(request(id, method, params));
    const promise = new Promise((resolve, reject) => {
    awaitingMap.set(id, { resolve, reject });
    return { 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() {
    socket = new WebSocket(wsURL);
    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);
    }

    export function disconnect() {
    socket.close();
    }
    open.watch(() => {
    console.info('connect ready');
    });

    open.watch(() => socket.send(JSON.stringify('ping')));
    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());

    export const $status = createStore('closed')
    const $status = createStore('closed')
    .on(open, () => 'open')
    .on(closed, () => 'closed')
    .on(error, () => 'error');

    $status.watch(state => console.log(`websocket is ${state}`));
  4. @popuguytheparrot popuguytheparrot revised this gist Aug 8, 2019. 1 changed file with 45 additions and 31 deletions.
    76 changes: 45 additions & 31 deletions file.js
    Original file line number Diff line number Diff line change
    @@ -1,7 +1,10 @@
    import { createEffect, createEvent, createStore } from 'effector';
    import { createEffect, createEvent, createStore, merge } from 'effector';
    import nanoid from 'nanoid';

    const wsURL = `ws://localhost:${process.env.WS_PORT}`;
    const socket = new WebSocket(wsURL);
    let socket;

    const awaitingMap = new Map();

    function cleanSocket() {
    socket.onopen = null;
    @@ -16,38 +19,49 @@ 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);
    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(data);
    resolve(payload.result);
    });
    }

    export const send = createEffect('send', {
    handler: fetch
    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 const $status = createStore('closed')
    .on(open, () => {
    socket.send(JSON.stringify('ping'));
    return 'open';
    })
    .on(closed, () => {
    cleanSocket();
    return 'closed';
    })
    .on(error, () => {
    cleanSocket();
    return 'error';
    });
    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();
    }

    socket.onopen = event => open(event);
    socket.onclose = ({ wasClean, code, reason }) =>
    closed({ wasClean, code, reason });
    socket.onerror = err => error(err);
    socket.onmessage = msg => onMessage(msg);
    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');
  5. @popuguytheparrot popuguytheparrot created this gist Aug 7, 2019.
    53 changes: 53 additions & 0 deletions file.js
    Original 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);