Skip to content
This repository was archived by the owner on Jan 6, 2022. It is now read-only.

Commit 6d78f4b

Browse files
authored
add support for web_root and fix minor bugs (#47)
* add support for web_root and fix minor bugs * allow domains in cli * update travis node versions
1 parent d497351 commit 6d78f4b

File tree

8 files changed

+65
-2786
lines changed

8 files changed

+65
-2786
lines changed

.gitignore

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
11
###Node###
2+
package-lock.json
3+
node_modules
24

35
# Logs
46
logs
@@ -21,11 +23,6 @@ coverage
2123
# Compiled binary addons (http://nodejs.org/api/addons.html)
2224
build/Release
2325

24-
# Dependency directory
25-
# Commenting this out is preferred by some people, see
26-
# https://www.npmjs.org/doc/misc/npm-faq.html#should-i-check-my-node_modules-folder-into-git-
27-
node_modules
28-
2926
# Users Environment Variables
3027
.lock-wscript
3128

@@ -37,7 +34,8 @@ node_modules
3734
.LSOverride
3835

3936
# Icon must end with two \r
40-
Icon
37+
Icon
38+
4139

4240
# Thumbnails
4341
._*

.travis.yml

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,8 @@
11
language: node_js
22

33
node_js:
4-
- "4"
5-
- "6"
6-
- "7"
4+
- "lts/*"
5+
- "node"
76

87
script:
98
- npm test

cli.js

Lines changed: 12 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,40 +1,35 @@
11
#!/usr/bin/env node
22

3-
var fs = require('fs')
43
var http = require('http')
5-
var path = require('path')
64
var ram = require('random-access-memory')
75
var hyperdrive = require('hyperdrive')
86
var discovery = require('hyperdiscovery')
7+
var getDatKey = require('dat-link-resolve')
98
var serve = require('.')
109

11-
var key = process.argv[2]
10+
var link = process.argv[2]
1211
var storage = ram
1312
var port = 8080
1413

15-
if (!key) {
16-
console.log('key or path to a dat required')
14+
if (!link) {
15+
console.log('link to a dat required')
1716
process.exit(1)
1817
}
1918

20-
try {
21-
fs.stat(path.join(key, '.dat'), function (err, stat) {
22-
if (err) return start()
23-
storage = path.join(key, '.dat')
24-
key = null
25-
start()
26-
})
27-
} catch (e) { start() }
19+
getDatKey(link, (err, key) => {
20+
if (err) throw err
21+
start(key)
22+
})
2823

29-
function start () {
30-
var archive = hyperdrive(storage, key, {sparse: true})
31-
var server = http.createServer(serve(archive, {live: true}))
24+
function start (key) {
25+
var archive = hyperdrive(storage, key, { sparse: true })
26+
var server = http.createServer(serve(archive, { live: true }))
3227
server.listen(port)
3328
console.log(`Visit http://localhost:${port} to see archive`)
3429

3530
if (key) {
3631
archive.ready(function () {
37-
discovery(archive, {live: true})
32+
discovery(archive, { live: true })
3833
})
3934
}
4035
}

example.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ var serve = require('.')
66

77
var archive = hyperdrive(ram)
88

9-
var server = http.createServer(serve(archive, {exposeHeaders: true, live: true}))
9+
var server = http.createServer(serve(archive, { exposeHeaders: true, live: true }))
1010

1111
archive.writeFile('readme.md', fs.readFileSync('readme.md'))
1212
archive.writeFile('package.json', fs.readFileSync('package.json'))

index.js

Lines changed: 34 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -5,39 +5,60 @@ var range = require('range-parser')
55
var qs = require('querystring')
66
var corsify = require('corsify')
77
var pkg = require('./package.json')
8+
var debug = require('debug')('hyperdrive-http')
89

910
module.exports = serve
1011

1112
function serve (archive, opts) {
1213
if (!opts) opts = {}
1314

15+
archive.ready(() => {
16+
debug('serving', archive.key.toString('hex'))
17+
})
18+
1419
return corsify(onrequest)
1520

1621
function onrequest (req, res) {
1722
var name = decodeURI(req.url.split('?')[0])
1823
var query = qs.parse(req.url.split('?')[1] || '')
24+
opts.viewSource = false // reset for each request
1925

2026
var wait = (query.wait && Number(query.wait.toString())) || 0
2127
var have = archive.metadata ? archive.metadata.length : -1
2228

23-
if (wait <= have) return ready()
24-
waitFor(archive, wait, ready)
29+
if (wait <= have) return checkWebroot()
30+
waitFor(archive, wait, checkWebroot)
31+
32+
function checkWebroot () {
33+
if (opts.web_root) return ready() // used cached version
34+
getManifest(archive, (err, data) => {
35+
if (err || !data) return ready()
36+
if (data.web_root) opts.web_root = data.web_root
37+
ready()
38+
})
39+
}
2540

2641
function ready () {
2742
var arch = /^\d+$/.test(query.version) ? archive.checkout(Number(query.version)) : archive
43+
if (query.viewSource) {
44+
debug('view source', query)
45+
opts.viewSource = true
46+
}
47+
debug('view', name, 'view dir', name[name.length - 1] === '/')
2848
if (name[name.length - 1] === '/') ondirectory(arch, name, req, res, opts)
29-
else onfile(arch, name, req, res)
49+
else onfile(arch, name, req, res, opts)
3050
}
3151
}
3252
}
3353

34-
function onfile (archive, name, req, res) {
54+
function onfile (archive, name, req, res, opts) {
3555
archive.stat(name, function (err, st) {
3656
if (err) return on404(archive, req, res)
3757

3858
if (st.isDirectory()) {
3959
res.statusCode = 302
4060
res.setHeader('Location', name + '/')
61+
ondirectory(archive, name + '/', req, res, opts)
4162
return
4263
}
4364

@@ -66,14 +87,19 @@ function on404 (archive, req, res) {
6687

6788
if (!fallbackPage) return onerror(res, 404, new Error('Not Found, No Fallback'))
6889

69-
archive.stat(fallbackPage, function (err) {
90+
archive.stat((parsed.web_root || '/') + fallbackPage, function (err) {
7091
if (err) return onerror(res, 404, err)
7192
onfile(archive, fallbackPage, req, res)
7293
})
7394
})
7495
}
7596

7697
function ondirectory (archive, name, req, res, opts) {
98+
debug('ondirectory:', name, 'options', opts)
99+
if (opts.viewSource) return ondirectoryindex(archive, name, req, res, opts)
100+
101+
if (name === '/' && opts.web_root) name = opts.web_root
102+
if (name[name.length - 1] !== '/') name = name + '/'
77103
archive.stat(name + 'index.html', function (err) {
78104
if (err) return ondirectoryindex(archive, name, req, res, opts)
79105
onfile(archive, name + 'index.html', req, res)
@@ -107,7 +133,7 @@ function ondirectoryindex (archive, name, req, res, opts) {
107133
`
108134

109135
var footer = opts.footer ? 'Archive version: ' + archive.version : null
110-
var html = toHTML({directory: name, script: (!opts.live || archive._checkout) ? null : script, footer: footer}, entries)
136+
var html = toHTML({ directory: name, script: (!opts.live || archive._checkout) ? null : script, footer: footer }, entries)
111137
res.setHeader('Content-Type', 'text/html; charset=utf-8')
112138
res.setHeader('Content-Length', Buffer.byteLength(html))
113139
if (opts.exposeHeaders) {
@@ -121,7 +147,7 @@ function ondirectoryindex (archive, name, req, res, opts) {
121147

122148
function getManifest (archive, cb) {
123149
archive.readFile('/dat.json', 'utf-8', function (err, data) {
124-
if (err) cb(err)
150+
if (err) return cb(err)
125151
try {
126152
var parsed = JSON.parse(data)
127153
} catch (e) {
@@ -141,7 +167,7 @@ function waitFor (archive, until, cb) { // this feels a bit hacky, TODO: make le
141167
if (!archive.metadata) archive.once('ready', waitFor.bind(null, archive, until, cb))
142168
if (archive.metadata.length >= until) return cb()
143169
archive.metadata.setMaxListeners(0)
144-
archive.metadata.once('append', waitFor.bind(null, archive, until, cb))
170+
archive.metadata.update(waitFor.bind(null, archive, until, cb))
145171
}
146172

147173
function onerror (res, status, err) {

0 commit comments

Comments
 (0)