Skip to content

Instantly share code, notes, and snippets.

@niclashoyer
Created August 28, 2013 21:46
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save niclashoyer/6371760 to your computer and use it in GitHub Desktop.
Save niclashoyer/6371760 to your computer and use it in GitHub Desktop.
minimal in-memory nodejs ldp container implementation (incomplete)
# 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