Skip to content

Instantly share code, notes, and snippets.

@pfrazee
Last active December 16, 2015 13:09
Show Gist options
  • Save pfrazee/5439938 to your computer and use it in GitHub Desktop.
Save pfrazee/5439938 to your computer and use it in GitHub Desktop.
trying out ideas for a better server framework
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