Skip to content

Instantly share code, notes, and snippets.

@hackape
Created February 26, 2021 08:09
Show Gist options
  • Select an option

  • Save hackape/fa09fcfd9b60e3475a361ca69af362b2 to your computer and use it in GitHub Desktop.

Select an option

Save hackape/fa09fcfd9b60e3475a361ca69af362b2 to your computer and use it in GitHub Desktop.

Revisions

  1. hackape created this gist Feb 26, 2021.
    66 changes: 66 additions & 0 deletions machine.js
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,66 @@

    // Available variables:
    // - Machine
    // - interpret
    // - assign
    // - send
    // - sendParent
    // - spawn
    // - raise
    // - actions
    // - XState (all XState exports)

    const wsMachine = Machine(
    {
    initial: 'idle',
    context: {
    ws: null,
    },
    states: {
    idle: {
    on: {
    CONNECT: 'connecting',
    },
    },
    connecting: {
    invoke: {
    src: 'createWsInstance',
    onDone: {
    target: 'connected',
    actions: assign({ ws: (ctx, evt) => evt.data }),
    },
    },
    },
    connected: {
    activities: [''],
    },
    },
    },
    {
    activities: {
    handleMessages: ctx => {
    const onMessage = ev => {
    console.log(ev.data)
    }
    ctx.ws.addEventListener('message', onMessage)
    return () => {
    ctx.ws.removeEventListener('message', onMessage)
    }
    },
    },
    services: {
    createWsInstance: (ctx, evt) => {
    return new Promise((resolve, reject) => {
    const ws = new WebSocket(evt.data.url)
    ws.addEventListener(
    'open',
    ev => {
    resolve(ws)
    },
    { once: true }
    )
    })
    },
    },
    }
    )