Skip to content
This repository has been archived by the owner on Nov 9, 2017. It is now read-only.

Commit

Permalink
0.1.0
Browse files Browse the repository at this point in the history
* improved readme
* started documentation
* big refactor: maximized code shared between client and server
  • Loading branch information
sergioramos committed Dec 11, 2012
1 parent 37ba7dd commit c929ecc
Show file tree
Hide file tree
Showing 17 changed files with 310 additions and 200 deletions.
17 changes: 10 additions & 7 deletions component.json
Original file line number Diff line number Diff line change
@@ -1,21 +1,24 @@
{
"name": "restio",
"license": "MIT",
"version": "0.0.3",
"version": "0.1.0",
"twitter": "@ramitos",
"description": "REST-like syntax for websockets",
"description": "REST-like syntax for WebSockets",
"main": "src/client/restio.js",
"scripts": [
"src/client/restio.js",
"src/client/setup.js"
"src/platform.js",
"src/methods.js",
"src/packet.js",
"src/setup.js",
"src/type.js",
"src/on.js"
],
"dependencies": {
"LearnBoost/engine.io-client": "*",
"ramitos/match-route": "*",
"ramitos/sgen": "*"
},
"development": {
"visionmedia/mocha": "*",
"component/type": "*",
"ramitos/sgen": "*",
"component/assert": "*"
}
}
55 changes: 55 additions & 0 deletions documentation.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
# restio

## what

**restio** aims to provide a *REST-like* interface to WebSockets for [node.js](nodejs.org). It was created to help structure realtime apps with a well known interface.

It's built on top of [engine.io](https://github.com/LearnBoost/engine.io) and its client-side code was structured upon [component(1)](https://github.com/component/component)

#### server

```js
var assert = require('assert'),
restio = require('restio'),
http = require('http');

var server = http.createServer(function (req, res) {}).listen(7589);

var io = restio.listen(server);

io.on.get('/user/:id', function (params, query, data, respond, socket) {
assert(Object.keys(params).length == 1);
assert(Object.keys(keys).length == 0);
assert(Object.keys(data).length == 0);
assert(Object.keys(params).id);
respond({id: params.id});
});

io.on('connection', function (socket) {
socket.get('/status', function (status) {
assert(Object.keys(status).length == 1);
assert(status.running == true);
});
});
```

#### client

```js
var assert = require('assert'),
restio = require('restio');

restio.listen(document.location.origin, function (io) {
io.on.get('/status', function (params, query, data, respond) {
assert(Object.keys(params).length == 0);
assert(Object.keys(keys).length == 0);
assert(Object.keys(data).length == 0);
respond({running: true});
});

io.get('/user/5', function (user) {
assert(Object.keys(user).length == 1);
assert(user.id == 5);
});
});
```
14 changes: 9 additions & 5 deletions package.json
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
{
"name": "restio",
"license": "MIT",
"version": "0.0.3",
"version": "0.1.0",
"author": "Sérgio Ramos",
"description": "REST-like syntax for websockets",
"description": "REST-like syntax for WebSockets",
"main": "src/server/restio.js",
"repository": {
"type": "git",
Expand All @@ -17,13 +17,17 @@
"crud"
],
"dependencies": {
"match-route": "0.0.x",
"type-component": "0.0.x",
"match-route": "0.1.x",
"engine.io": "0.3.x",
"cookie": "0.0.x",
"sgen": "0.0.x"
},
"devDependencies": {
"better-assert": "0.1.x"
"engine.io-client": "0.4.x",
"mocha": "1.7.x",
"blage": "0.0.x",
"chai": "1.4.x",
"kip": "*"
}
}
}
55 changes: 39 additions & 16 deletions readme.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# restio

REST-like syntax for websockets built on top of [engine.io](https://github.com/LearnBoost/engine.io)
REST-like syntax for WebSockets built on top of [engine.io](https://github.com/LearnBoost/engine.io)

## install

Expand All @@ -14,29 +14,52 @@ $ npm install [--save/--save-dev] restio

## usage

### server
#### server

```js
var io = require('restio').listen(7589)
var assert = require('assert'),
restio = require('restio'),
http = require('http');

io.on.get('/user/:id', function (params, query, data, socket, respond) {
respond({id: params.id})
})
var server = http.createServer(function (req, res) {}).listen(7589);

//send to all
Object.keys(io.clients).forEach(function (id) {
//callback will only be called if the client responds
io.clients[id].post('/user', {id: 10}, function (data) {})
})
var io = restio.listen(server);

io.on.get('/user/:id', function (params, query, data, respond, socket) {
assert(Object.keys(params).length == 1);
assert(Object.keys(keys).length == 0);
assert(Object.keys(data).length == 0);
assert(Object.keys(params).id);
respond({id: params.id});
});

io.on('connection', function (socket) {
socket.get('/status', function (status) {
assert(Object.keys(status).length == 1);
assert(status.running == true);
});
});
```

### client
#### client

```js
require('restio').listen('http://localhost:7589', function (io) {
io.get('/user/4', function (user) {})
io.on.post('/user', function (params, query, data, respond) {})
})
var assert = require('assert'),
restio = require('restio');

restio.listen(document.location.origin, function (io) {
io.on.get('/status', function (params, query, data, respond) {
assert(Object.keys(params).length == 0);
assert(Object.keys(keys).length == 0);
assert(Object.keys(data).length == 0);
respond({running: true});
});

io.get('/user/5', function (user) {
assert(Object.keys(user).length == 1);
assert(user.id == 5);
});
});
```

## todo
Expand Down
52 changes: 23 additions & 29 deletions src/client/restio.js
Original file line number Diff line number Diff line change
@@ -1,38 +1,32 @@
var mr = require('match-route'),
var methods = require('../methods'),
packet = require('../packet'),
setup = require('../setup'),
mr = require('match-route'),
eio = require('engine.io'),
setup = require('./setup'),
sgen = require('sgen');
getOn = require('../on');

module.exports.listen = function (addr, callback) {
var socket = new eio.Socket(addr);
var callbacks = {};
var io = {on: {}};
var routes = {};

methods.forEach(function (method) {
setup.methods(method, callbacks, routes);
setup.request(method, io, socket, callbacks);
setup.on(method, io, routes);
});

var on = getOn(socket, callbacks, routes);

on.error = function (e) {
throw e;
};

socket.on('message', on.message);
socket.on('error', on.error);

socket.on('open', function () {
var io = {};
var on = {};
setup(io, socket);

on.response = function (res) {
clearTimeout(io.callbacks[res.method][res.id].tm);
io.callbacks[res.method][res.id](res.data);
io.callbacks[res.method][res.id] = undefined;
};

on.message = function (message) {
message = JSON.parse(message);
if(io.callbacks[message.method][message.id]) on.response(message);
else on.request(message);
};

on.request = function (request) {
mr(request, io.routes, function (route, fn, params, query) {
fn(params, query, request.data, function (data) {
request.data = data;
socket.send(JSON.stringify(request));
});
});
};

socket.on('message', on.message);
callback(io);
});
};
40 changes: 0 additions & 40 deletions src/client/setup.js

This file was deleted.

1 change: 1 addition & 0 deletions src/methods.js
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
module.exports = new Array('get', 'post', 'put', 'delete');
31 changes: 31 additions & 0 deletions src/on.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
var platform = require('./platform'),
packet = require('./packet'),
mr = require('match-route'),
type = require('./type');

module.exports = function (socket, callbacks, routes) {
var on = {};

on.message = function (msg) {
msg = JSON.parse(msg)
if(msg.rsp && callbacks[msg.method][msg.id]) on.response(msg);
else if(!msg.rsp) on.request(msg);
};

on.response = function (res) {
clearTimeout(callbacks[res.method][res.id].tm);
callbacks[res.method][res.id](res.data);
callbacks[res.method][res.id] = undefined;
};

on.request = function (req) {
mr(req, routes, function (callback, route, params, query) {
callback(params, query, req.data, function (data) {
socket.send(packet.parse(req.method, data, req.url, req.id, true));
}, platform == 'node' ? socket : undefined);
});
};

return on;
};

3 changes: 3 additions & 0 deletions src/packet.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
module.exports.parse = function (method, data, url, id, rsp) {
return JSON.stringify({method: method, data: data, url: url, id: id, rsp: rsp});
};
1 change: 1 addition & 0 deletions src/platform.js
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
module.exports = typeof window == 'undefined' ? 'node' : 'browser';
11 changes: 0 additions & 11 deletions src/server/cookies.js

This file was deleted.

Loading

0 comments on commit c929ecc

Please sign in to comment.