# Meteor

This library is universal: outside of environment-specific features (parsing DOM
tables in the browser, streaming write in nodejs), the core is ES3/ES5 and can
be used in any reasonably compliant JS implementation.  It should play nice with
meteor out of the box.


## This demonstration

You can split the work between the client and server side as you see fit.  The
obvious extremes of pure-client code and pure-server code are straightforward.
This demo tries to split the work to demonstrate that the workbook object can be
passed on the wire.

The read demo:
- accepts files from the client side
- sends binary string to server
- processes data on server side
- sends workbook object to client
- renders HTML and adds to a DOM element

The write demo:
- generates workbook on server side
- sends workbook object to client
- generates file on client side
- triggers a download.

This demo uses the FileSaver.js library for writing files, installed through the
[`pfafman:filesaver` wrapper](https://atmospherejs.com/pfafman/filesaver):

```bash
meteor add pfafman:filesaver
```

## Setup

This tree does not include the `.meteor` structure.  Rebuild the project with:

```bash
meteor create .
npm install babel-runtime meteor-node-stubs xlsx
meteor add pfafman:filesaver
meteor
```


## Environment-specific features

File-related operations (e.g. `XLSX.readFile` and `XLSX.writeFile`) will not be
available in client-side code. If you need to read a local file from the client,
use a file input or drag-and-drop.

Browser-specific operations (e.g. `XLSX.utils.table_to_book`) are limited to
client side code. You should never have to read from DOM elements on the server
side, but you can use a third-party virtual DOM to provide the required API.