Created
August 28, 2013 21:46
-
-
Save niclashoyer/6371760 to your computer and use it in GitHub Desktop.
minimal in-memory nodejs ldp container implementation (incomplete)
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
# npm install connect | |
connect = require 'connect' | |
accept = [ | |
'text/turtle', | |
'application/rdf+xml', | |
'application/rdf+json' | |
] | |
accPostHeader = accept.join ', ' | |
accMap = {} | |
for a in accept | |
accMap[a] = true | |
members = {} | |
cnt = 0 | |
app = connect() | |
app.use connect.logger 'dev' | |
app.use connect.responseTime() | |
app.use (req, res, next) -> | |
if req.url is '/' | |
res.setHeader 'Accept-Post', accPostHeader | |
if req.method is 'POST' | |
type = req.headers['content-type'] | |
if accMap[type] isnt true | |
res.statusCode = 415 | |
res.end() | |
return | |
cnt++ | |
url = '/r' + cnt | |
res.statusCode = 201 | |
res.setHeader 'Location', url | |
req.on 'data', (data) -> | |
if members[url] is undefined | |
members[url] = | |
data: new Buffer 0 | |
created: new Date() | |
modified: new Date() | |
members[url].data = Buffer.concat [members[url].data, data] | |
console.log url | |
res.end() | |
else if req.method is 'GET' | |
res.setHeader 'Content-Type', 'text/turtle' | |
body = '@prefix ldp: <http://www.w3.org/ns/ldp#>.\n' + | |
'@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#>.\n' + | |
'<> a ldp:Container' | |
urls = Object.keys members | |
if urls.length > 0 | |
body += ';\n' | |
first = urls.shift() | |
urls = urls.map (url) -> ' <' + url + '>' | |
mtrip = urls.join(',\n') | |
if urls.length > 0 | |
mtrip = ',\n' + mtrip | |
body += ' rdfs:member <' + first + '>' + mtrip + '.\n' | |
else | |
body += '.\n' | |
res.end body | |
else | |
do next | |
return | |
else if req.method is 'GET' | |
url = req.url | |
member = members[url] | |
if member? | |
res.end member.data | |
return | |
else if req.method is 'DELETE' | |
url = req.url | |
member = members[url] | |
if member? | |
delete members[url] | |
res.end() | |
return | |
do next | |
app.listen 3000 |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment