const view = (state$,confirmvtree$)=> most.combine((state,confirmvtree)=> (
  div('.child',[
    label('Name: '),
    input('.field', {attrs: {type: 'text'}, props:{value: state}}),
    confirmvtree
  ])
),state$,confirmvtree$)
  function mostDemo () {
    // x represents the current value of xInput
    var x = most.fromEvent('input', xInput).map(toNumber)

    // y represents the current value of yInput
    var y = most.fromEvent('input', yInput).map(toNumber)

    // result is the live current value of adding x and y
    var result = most.combine(add, x, y)

    // Observe the result value by rendering it to the resultNode
    result.observe(renderResult)
  };
export function oscDiff2(a,b,options={}) {
    return doDiff(most.combine((original,compare) => Immutable.Map({original,compare}),a,b),options);    
}
Example #4
0
export default function main ({DOM, GRAPHQL, ROUTER, PUSHER}) {
  let match$ = ROUTER.define({
    '/': {where: 'ENDPOINTS'},
    '/create': {where: 'CREATE'},
    '/account': {where: 'ACCOUNT'},
    '/endpoints': {where: 'ENDPOINTS'},
    '/endpoints/:endpoint': id => ({where: 'ENDPOINT', id})
  })
    .thru(hold)

  let response$ = GRAPHQL
    .flatMap(r$ => r$
      .recoverWith(err =>
        console.log('got err', err) || most.of({errors: [err.message]})
      )
    )
    .filter(({errors}) => {
      if (errors && errors.length) {
        console.log('errors:', errors)
        return false
      }
      return true
    })
    .map(({data}) => data)

  let userError$ = response$
    .map(data => data[Object.keys(data)[0]])
    .filter(fields => fields.error)
    .map(fields => fields.error)

  let created$ = response$
    .filter(r => r.setEndpoint && r.setEndpoint.ok)
  let deleted$ = response$
    .filter(r => r.deleteEndpoint)
    .map(r => r.deleteEndpoint)
  let endpoint$ = response$
    .filter(r => r.endpoint)
    .map(r => r.endpoint)
  let endpoints$ = response$
    .filter(r => r.endpoints)
    .map(r => r.endpoints)
    .merge(endpoint$)
    .merge(deleted$.map(({id}) => ({deleted: id})))
    .scan((map, cur) => {
      if (Array.isArray(cur)) {
        for (let i = 0; i < cur.length; i++) {
          map[cur[i].id] = cur[i]
        }
      } else if (cur.id) {
        map[cur.id] = cur
      } else if (cur.deleted) {
        delete map[cur.deleted]
      }
      return map
    }, {})
    .multicast()

  let selectedEndpointId$ = match$
    .filter(m => m.value.where === 'ENDPOINT')
    .map(m => m.value.id)

  let selectedEndpoint$ = most.combine(
    (endpointId, endpoints) => endpoints[endpointId],
    selectedEndpointId$,
    endpoints$.tap(x => console.log('all', x))
  )
    .tap(x => console.log('selected', x))

  let nheaders$ = most.merge(
    DOM.select('.a-header').events('click').tap(e => e.preventDefault()).constant(1),
    DOM.select('.r-header').events('click').tap(e => e.preventDefault()).constant(-1)
  )
    .scan((acc, v) => (acc + v) || 1, 2)

  let showEvents$ = most.merge(
    DOM.select('.s-events').events('click').tap(e => e.preventDefault()).constant(true),
    DOM.select('.h-events').events('click').tap(e => e.preventDefault()).constant(false)
  )
    .startWith(false)

  let selectedEvent$ = DOM.select('tr.event').events('click')
    .map(e => e.ownerTarget.id.slice(3)) // id="ev-{ timestring }"
    .scan((cur, next) => cur === next ? null : next, null)
    .multicast()

  let pusherEvents$ = PUSHER.event$
    .map(ev => [ev.id, ev.data, 'pusher'])
    .scan((events, ev) => {
      events.unshift(ev)
      return events
    }, [])

  let endpointEvents$ = most.combine(
    (endpoint, pusherEvents) =>
      pusherEvents
        .filter(([id]) => id = endpoint.id)
        .map(([_, data]) => {
          try {
            return eval('(' + data + ')')
          } catch (e) {
            return null
          }
        })
        .filter(x => x)
        .concat(
          (endpoint && endpoint.recentEvents || [])
            .map(data => JSON.parse(data))
        )
    ,
    selectedEndpoint$
      .tap(x => console.log('this', x)),
    pusherEvents$
  )
    .startWith([])
    .thru(hold)

  let vtree$ = most.combine(
    (match, endpoints, nheaders, events, showingEvents, selectedEvent) =>
      fwitch(match.value.where, {
        CREATE: vrender.create.bind(null, nheaders),
        ENDPOINTS: vrender.list.bind(null, endpoints),
        ENDPOINT: endpoints[match.value.id] ? vrender.endpoint.bind(
          null,
          endpoints[match.value.id],
          nheaders,
          events,
          showingEvents,
          selectedEvent
        ) : vrender.empty,
        default: vrender.empty
      })
    ,
    match$,
    endpoints$,
    nheaders$,
    endpointEvents$.combine((ee, _) => ee, most.periodic(8000, 'x')),
    showEvents$,
    selectedEvent$
  )

  let replayEvent$ = DOM.select('.replay').events('click')
    .tap(e => e.preventDefault())
    .throttle(800)
    .sample(
      (id, selectedEvent, events, _) => {
        for (let i = 0; i < events.length; i++) {
          if (events[i].in.time.toString() === selectedEvent) {
            return [id, i]
          }
        }
      },
      selectedEndpointId$,
      selectedEvent$,
      endpointEvents$
    )

  let setEndpointGQL$ = DOM.select('form button.set').events('click')
    .tap(e => e.preventDefault())
    .map(e => e.ownerTarget.parentNode.parentNode.parentNode)
    .map(form => ({
      mutation: 'setEndpoint',
      variables: {
        currentId: form.querySelector('[name="current_id"]')
          ? form.querySelector('[name="current_id"]').value
          : undefined,
        id: form.querySelector('[name="identifier"]').value,
        description: form.querySelector('[name="description"]').value,
        method: (() => {
          let buttons = form.querySelectorAll('[name="method"]')
          for (let i = 0; i < buttons.length; i++) {
            if (buttons[i].checked) return buttons[i].value
          }
        })(),
        url: form.querySelector('[name="url"]').value.trim(),
        definition: form.querySelector('[name="definition"]').value.trim(),
        pass_headers: form.querySelector('[name="pass_headers"]').checked || '',
        headers: (() => {
          let keys = form.querySelectorAll('[name="header-key"]')
          let vals = form.querySelectorAll('[name="header-val"]')
          var headers = {}
          for (let i = 0; i < keys.length; i++) {
            let key = keys[i].value.trim()
            let val = vals[i].value.trim()
            if (key && val) {
              headers[key] = val
            }
          }
          return JSON.stringify(headers)
        })()
      }
    }))
    .merge(
      DOM.select('form button.delete').events('click')
        .tap(e => e.preventDefault())
        .filter(() => window.confirm('Are you sure you want to delete this endpoint?'))
        .map(e => e.ownerTarget.parentNode.parentNode.parentNode)
        .map(form => ({
          mutation: 'deleteEndpoint',
          variables: {id: form.querySelector('[name="identifier"]').value}
        }))
    )

  let fetchEndpointsGQL$ = match$
    .filter(m => m.value.where === 'ENDPOINTS')
    .constant({query: 'fetchAll', forceFetch: true})

  let fetchEndpointGQL$ = selectedEndpointId$
    .map(id => ({
      query: 'fetchOne',
      variables: {
        id
      },
      forceFetch: true
    }))

  let replayEventGQL$ = replayEvent$
    .map(([id, index]) => ({
      mutation: 'replayEvent',
      variables: {
        id, index
      }
    }))

  let gql$ = most.merge(
    setEndpointGQL$,
    fetchEndpointsGQL$,
    fetchEndpointGQL$,
    replayEventGQL$
  ).thru(hold)

  let notification$ = most.merge(
    created$.map(({setEndpoint: s}) => [`<b>${s.id}</b> saved`, 'success', {timeout: 3000}]),
    deleted$.map(({id}) => [`<b>${id}</b> deleted`, {timeout: 4000}]),
    userError$.map(err => [err, 'error']),
    PUSHER.event$.map(({id}) => [`detected webhook call on <b>${id}</b>`, 'info',
                                 {timeout: 3000}]),
    most.from((() => {
      var messages = []
      let divs = document.querySelectorAll('.flashed-messages .alert')
      for (let i = 0; i < divs.length; i++) {
        messages.push([divs[i].innerHTML, 'error'])
      }
      document.querySelector('.flashed-messages').style.display = 'none'
      return messages
    })())
  )

  return {
    DOM: vtree$,
    GRAPHQL: gql$,
    ROUTER: most.empty()
      .merge(created$.map(({setEndpoint: s}) => `/endpoints/${s.id}`))
      .merge(deleted$.constant('/endpoints'))
      .skipRepeats()
      .multicast(),
    PUSHER: selectedEndpointId$
      .tap(x => console.log('PUSHER SUBSCRIBE', x)),
    NOTIFICATION: notification$
  }
}