rijs.upload

1.0.1 • Public • Published

Ripple | Upload

Coverage Status Build Status

This module aims to make uploading forms nicer to deal with. Given a <form>, you can get a sensible JSON object on the server side where the keys are the [name] attribute of each control. In particlar, it turns type="file" elements into an array of native Streams (with backpressure and all) so you can then simply pipe them.

First, use utilise/form to turn your form element into a simple plain JSON object.

const { values } = form(formElement)

Then upload. You get two events for updates: progress and response.

ripple.upload('resource', values)
  .on('progress', progress => ...)
  .on('progress', response => ...)

The resource identifies which handler to use on the server-side. For example, let's say you registered an events resource, then its from function would receive the upload. Complete example below and see the example/test for a real example:

<form>
  <input type="text" name="title">
  <input type="file" name="photos"> 
</form>
// server
ripple('events', [], { from })

function from(req, res){
  if (!req.type == 'upload') return

  // req.value contains everything you need to process
  req.value == {
    name: ... // some text
    photos: [...] // An array of streams, one for each file
  }

  // Use res to respond directly to the upload. 
  // You can pass any arguments you like.
  // This is what the "response" event on the client receives
  if (success) 
    res(200, '/event/123')
  else
    res(500, 'error')
}

// client
const { values } = form(formElement)

ripple.upload('events', values)
  .on('progress', progress => {
    swal({
      title: 'Uploading Event..'
    , content: progress + '%'
    , type: 'working'
    })
  })
  .on('response', (status, url) => {
    const title   = status == 200 ? 'Done' : 'Error'
        , type    = status == 200 ? 'success' : 'error' 
        , content = status == 200 
            ? 'Great - Your event has now been published!'
            : 'Uh oh, something went wrong! Please try again later'
        , buttons = [{ type: 'primary', text: 'Close' }]

    go(url)
    swal({ title, type, content, buttons })
  })

(NB: swal comes from pemrouz/sweet-alert and go from pemrouz/decouter)

Readme

Keywords

none

Package Sidebar

Install

npm i rijs.upload

Weekly Downloads

1

Version

1.0.1

License

pemrouz.mit-license.org

Last publish

Collaborators

  • pemrouz