Last active
December 16, 2015 13:09
-
-
Save pfrazee/5439938 to your computer and use it in GitHub Desktop.
trying out ideas for a better server framework
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
importScripts('grim/server-fn.js'); | |
function main(request, response) { | |
server(request, response); | |
} | |
server.headers.link['/'] = [ | |
{ href:'/', rel:'self' }, | |
{ href:'/people', rel:'collection' }, | |
{ href:'/people/{title}', rel:'item' } | |
]; | |
server.get['/'] = { // a static resource | |
headers: { 'content-type': 'text/html' }, | |
body: buildInterface() // buildInterface() will return a string value for `body` | |
}; | |
server.post['/'] = function(request, response) { | |
response.writeOk('html'); | |
response.end(buildInterface(request.body)); | |
}; | |
server.headers.link['/people'] = [ | |
{ href:'/', rel:'parent' }, | |
{ href:'/people', rel:'self' }, | |
{ href:'/people/{title}', rel:'item' } | |
]; | |
server.headers.link['/people/:id'] = function(request, response, id) { | |
return [ | |
{ href:'/people', rel:'parent' }, | |
{ href:'/people/'+id, rel:'self' }, | |
{ href:'/people/{title}', rel:'item' } | |
]; | |
}; | |
server.get['/people/:id'] = function(request, response, id) { | |
var person = people.get(id); | |
if (!person) | |
return response.endNotFound(); | |
if (request.isfor('event-stream')) | |
server.addEventStream('person-'+id, response); | |
else if (request.isfor('json')) | |
response.endOk('json', {}, person); | |
else | |
response.endBadAccept(); | |
}; | |
server.patch['/people/:id'] = function(request, response, id) { | |
var person = people.get(id); | |
if (!person) | |
return response.endNotFound(); | |
if (request.istype('json')) { | |
person.patch(request.body); | |
server.emitEvent('person-'+id, 'update', request.body); | |
response.endNoContent(); | |
} else | |
response.endBadType(); | |
}; | |
function buildInterface(data) { /* ... */ } | |
// --- | |
// another snippet with this style: | |
importScripts('grim/server-fn.js'); | |
var main = server; | |
server.get['/list'] = function(request, response) { | |
if (request.isfor('event-stream')) server.addEventStream('list', response); | |
else if (request.isfor('html')) response.endOk('html', {}, makeList(request)); | |
else response.endBadAccept(); | |
}; | |
server.patch['/list'] = function(request, response) { | |
if (typeof request.body == 'object' && request.body.filter) { | |
theListFilter = request.body.filter; | |
server.emitEvent('list', 'update', theListFilter); | |
response.endNoContent(); | |
} else | |
response.endBadRequest('json', {}, { filter:'required' }); | |
}; | |
server.get['/env'] = function(request, response) { | |
if (!request.isfor('html')) | |
return response.endBadAccept(); | |
localStorageCollection.getJson() | |
.succeed(function(res) { response.endOk('html', {}, makeDoc('env', request, res.body)); }) | |
.fail(function() { response.endBadGateway(); }); | |
}; | |
server.post['/env'] = function(request, response) { | |
if (!request.isfor('html')) | |
return response.endBadAccept(); | |
var lsUpdate; | |
if (request.body['delete']) { // delete button? | |
// delete the entry | |
var targetId = request.body['delete']; | |
lsUpdate = localStorageCollection.item(targetId).delete(); | |
} else { | |
// add a new entry | |
lsUpdate = localStorageCollection.post({}); | |
} | |
lsUpdate | |
.succeed(function() { | |
return localStorageCollection.getJson(); | |
}) | |
.succeed(function(res) { response.endOk('html', {}, makeDoc('env', request, res.body)); }) | |
.fail(function() { response.endBadGateway(); }); | |
}; | |
server.any['/:id'] = function(request, response, page) { | |
if (!request.ismethod('get', 'post')) | |
response.endBadMethod(); | |
else if (!request.isfor('html')) | |
response.endBadAccept(); | |
else | |
response.endOk('html', {}, makeDoc(request.path.slice(1), request)); | |
}; | |
// --- | |
// BELOW ARE THE SAME TWO, BUT MORE LIKE EXPRESSJS | |
// === | |
importScripts('grim/server-fn.js'); | |
function main(request, response) { | |
server(request, response); | |
} | |
server.headers('/', 'link', [ | |
{ href:'/', rel:'self' }, | |
{ href:'/people', rel:'collection' }, | |
{ href:'/people/{title}', rel:'item' } | |
]); | |
server.get('/', { // a static resource | |
headers: { 'content-type': 'text/html' }, | |
body: buildInterface() // buildInterface() will return a string value for `body` | |
}); | |
server.post('/', function(request, response) { | |
response.writeOk('html'); | |
response.end(buildInterface(request.body)); | |
}); | |
server.headers('/people', 'link', [ | |
{ href:'/', rel:'parent' }, | |
{ href:'/people', rel:'self' }, | |
{ href:'/people/{title}', rel:'item' } | |
]); | |
server.headers('/people/:id', 'link', function(request, response, id) { | |
return [ | |
{ href:'/people', rel:'parent' }, | |
{ href:'/people/'+id, rel:'self' }, | |
{ href:'/people/{title}', rel:'item' } | |
]; | |
}); | |
server.get('/people/:id', function(request, response, id) { | |
var person = people.get(id); | |
if (!person) | |
return response.endNotFound(); | |
if (request.isfor('event-stream')) | |
server.addEventStream('person-'+id, response); | |
else if (request.isfor('json')) | |
response.endOk('json', {}, person); | |
else | |
response.endBadAccept(); | |
}); | |
server.patch('/people/:id', function(request, response, id) { | |
var person = people.get(id); | |
if (!person) | |
return response.endNotFound(); | |
if (request.istype('json')) { | |
person.patch(request.body); | |
server.emitEvent('person-'+id, 'update', request.body); | |
response.endNoContent(); | |
} else | |
response.endBadType(); | |
}); | |
function buildInterface(data) { /* ... */ } | |
// --- | |
// another snippet with this style: | |
importScripts('grim/server-fn.js'); | |
var main = server; | |
server.get('/list', function(request, response) { | |
if (request.isfor('event-stream')) server.addEventStream('list', response); | |
else if (request.isfor('html')) response.endOk('html', {}, makeList(request)); | |
else response.endBadAccept(); | |
}); | |
server.patch('/list', function(request, response) { | |
if (typeof request.body == 'object' && request.body.filter) { | |
theListFilter = request.body.filter; | |
server.emitEvent('list', 'update', theListFilter); | |
response.endNoContent(); | |
} else | |
response.endBadRequest('json', {}, { filter:'required' }); | |
}); | |
server.get('/env', function(request, response) { | |
if (!request.isfor('html')) | |
return response.endBadAccept(); | |
localStorageCollection.getJson() | |
.succeed(function(res) { response.endOk('html', {}, makeDoc('env', request, res.body)); }) | |
.fail(function() { response.endBadGateway(); }); | |
}); | |
server.post('/env', function(request, response) { | |
if (!request.isfor('html')) | |
return response.endBadAccept(); | |
var lsUpdate; | |
if (request.body['delete']) { // delete button? | |
// delete the entry | |
var targetId = request.body['delete']; | |
lsUpdate = localStorageCollection.item(targetId).delete(); | |
} else { | |
// add a new entry | |
lsUpdate = localStorageCollection.post({}); | |
} | |
lsUpdate | |
.succeed(function() { | |
return localStorageCollection.getJson(); | |
}) | |
.succeed(function(res) { response.endOk('html', {}, makeDoc('env', request, res.body)); }) | |
.fail(function() { response.endBadGateway(); }); | |
}); | |
server.any('/:id', function(request, response, page) { | |
if (!request.ismethod('get', 'post')) | |
response.endBadMethod(); | |
else if (!request.isfor('html')) | |
response.endBadAccept(); | |
else | |
response.endOk('html', {}, makeDoc(request.path.slice(1), request)); | |
}); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment