remote
Version:
Work on client-side files with a remote API server transparently
180 lines (123 loc) • 5.32 kB
Markdown
## Remote
**Remote** is a simple CLI tool that enables you to work in local files while consuming an API from a remote server. An easy reverse proxy in Node, if you will.
If you'd like, it can also start a simple local server for your files.
Simply specify
- the address of your local files server, or where I should start one
- the address of your remote API
- the address of where to start a reverse proxy
- a directory, if you want me to start a local server
- some regex rules that define which files to serve locally, which to fetch from the remote host
- optionally, you can map requests to specific files with the mappings option
It aims to solve the dreaded **cross domain request** problem, so you can freely *ajax* like you have a local server-side.
### Install
npm install -g remote
### Quickstart
After installing, create a `remote.json` configuration file (check the example folder) and simply call `remote`.
### Usage - command line
remote [options]
Options:
-h, --help output usage information
-V, --version output the version number
-d, --directory [path] Path to a local folder. If defined, will serve files at server address. [undefined]
-r, --remote [host:port] Address of the remote API [localhost:80]
-p, --proxy [host:port] Address of the reverse proxy server [localhost:9001]
-s, --server [host:port] Address of the static file server [localhost:9000]
-m, --mapping Whether to use the mapping rules [false]
-f, --file [remote.json] Specific configuration file [remote.json]
### Usage - configuration file (remote.json)
See the example configuration file at the example folder.
Read on for the possible options for your `remote.json` file.
### Bounces
This is the simplest `remote.json`, with some bounce rules defined:
{
"directory" : "./src/",
"remote" : {"host": "remote-api-host.com", "port": 80},
"bounces" : [
"public/.*",
"assets/.*"
]
}
In this case, any call to `localhost:3000/public/(...)` or `localhost:3000/assets/(...)` will be *bounced* to your local files under `./src/`.
Other URL's will be forwarded to `remote-api-host.com`
### Headers
You may wish to send along some headers with your request. For example:
{
"directory" : "./src/",
"remote" : {"host": "remote-api-host.com", "port": 80},
"headers": {
"Host": "remote-api-host.com",
"X-Secret-Header" : "awesome"
},
"bounces" : [
"public/.*",
"assets/.*"
]
}
These will be added to every request made by `remote`.
### Mappings
A mapping is like a bounce rule, only more specific. You define what you want served given a request URL. For example:
{
"directory" : "./src/",
"remote" : {"host": "remote-api-host.com", "port": 80},
"headers": {
"Host": "remote-api-host.com",
"X-Secret-Header" : "awesome"
},
"bounces" : [
"public/.*",
"assets/.*"
],
"mapping": true,
"mappings": {
".*/api/users/1/remove": {"result": "ok"},
".*/api/users/.*":"./test/mocks/users-mock.json",
".*/files/.*":"./test/files/",
".*/public/js/awesome.js":"./src/special/path/awesome-2.js"
}
}
As you can see, mappings can be:
- A JSON object.
- A path to any file.
- A path to any directory (Remote will locate the requested file in the directory).
When any of these URL's are requested, remote will serve the given resource.
**Note that mappings take precedence over bounce rules!**
You can disable all mappings setting `mapping` to **false**.
### Bounce to remote
If you like to keep things complicated, you may use the `bounceToRemote: true` option in your configuration file.
This will invert the `bounces` rules, so they will actually bounce to the remote API. All other requests will be forwarded to the local server.
### Other notes
Command line options take precedence over `remote.json` options.
Also, any command line option may be specified in the json configuration file.
Have fun!
-----------------
#### Note for Mac OS X users (or: *what to do when I get EMFILE errors*)
OS X has a arbitrarily low limit for the amount of files that a process can open of 256.
Use the `ulimit` command to check your current limit.
For sites with large amounts of files, or in any situation when encountering **EMFILE** errors, simply issue:
ulimit -n 2048
Or any such large value, before turning on remote.
-----------------
### Changelog:
v 0.2.6:
- Ignores query string on mapping.
- Starting unit tests with jasmine-node.
v 0.2.5:
- Serves images correctly. Really, this time.
- Accepts mapping with 'http://' to change to arbitrary host.
v 0.2.4:
- Serves images correctly (utf8 issue fix, thanks Augusto).
v 0.2.3:
- Accepts directory for mappings.
v 0.2.1:
- File update and options scope fix.
- Mappings should work now when applied in a file.
v 0.2.0:
- **Breaking changes** in API. Old remote.json files wont work.
- Better options syntax
- Bring you own local server. Now you can use remote as a reverse proxy, only.
- Many fixes.
v 0.1.0:
- Major rewrite. Nothing of note before this ;)
- Using nodejitsu's http-proxy
- Add the capability to map arbitrary url to arbitrary files or JSON
- Add the capability to add request headers