Skip to content

Commit 4311194

Browse files
committed
implement resolve
1 parent 9749b2d commit 4311194

File tree

5 files changed

+131
-44
lines changed

5 files changed

+131
-44
lines changed

README.md

+3
Original file line numberDiff line numberDiff line change
@@ -15,4 +15,7 @@ var archive = drive.createArchive()
1515
ln.link(archive, 'linkfile', <ARCHIVE KEY>, cb) // create symlink to another archive
1616
ln.readlink(archive, 'linkfile', cb) // get linked archive key
1717
ln.read(drive, archive, 'linkfile', cb) // returns a hyperdrive archive pointed to linked archive
18+
19+
// assume link(archive, 'path/to/file', <ARCHIVE KEY>)
20+
ln.resolve(drive, archive, 'path/to/file/within/linked/archive', cb) // returns (err, nextArchive(<ARCHIVE KEY>, 'within/linked/archive'))
1821
```

index.js

+48-9
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,26 @@
1-
const collect = require('stream-collect')
1+
const collect = require('collect-stream')
22
const Readable = require('stream').Readable
33

4-
module.exports = {read, readlink, link}
4+
module.exports = {read, readlink, link, resolve}
55

66
function readlink (archive, entry, cb) {
7-
collect(archive.createFileReadStream(entry), body => {
7+
collect(archive.createFileReadStream(entry), (err, body) => {
8+
if (err) return cb(err, null)
9+
var l
810
try {
9-
var l = decode(body)
10-
if (!l) return cb(new Error('no link found'))
11-
cb(null, l)
11+
l = decode(body)
1212
} catch (e) {
13-
cb(e)
13+
return cb(new Error('not a link'), null)
1414
}
15+
if (!l) return cb(new Error('not a link'), null)
16+
cb(null, l)
1517
})
1618
}
1719

1820
function read (drive, archive, entry, cb) {
19-
readlink(archive, entry, (err, info) => {
21+
readlink(archive, entry, (err, key) => {
2022
if (err) return cb(err)
21-
cb(null, drive.createArchive(info))
23+
cb(null, drive.createArchive(key))
2224
})
2325
}
2426

@@ -30,7 +32,44 @@ function link (archive, entry, destArchiveKey, cb) {
3032
s.pipe(w).on('finish', cb)
3133
}
3234

35+
function resolve (drive, archive, path, cb) {
36+
var components = path.split('/')
37+
var partialPath = []
38+
var found = false
39+
archive.list((err, entries) => {
40+
if (err) return cb(err)
41+
for (var i = 0; i < components.length; i++) {
42+
var c = components[i]
43+
partialPath.push(c)
44+
45+
if (exist(entries, partialPath)) {
46+
read(drive, archive, partialPath.join('/'), (err, linkedArchive) => {
47+
if (err && err.message === 'not a link') {
48+
return cb(new Error(`unresolvable at ${partialPath.join('/')}`))
49+
}
50+
if (err) return cb(err)
51+
52+
return cb(null, linkedArchive, components.slice(i + 1).join('/'))
53+
})
54+
found = true
55+
break
56+
}
57+
}
58+
59+
if (!found) {
60+
cb(new Error(`unresolvable path ${path}`))
61+
}
62+
})
63+
64+
function exist (entries, partialPath) {
65+
if (entries.find(x => x.name === partialPath.join('/'))) return true
66+
67+
return false
68+
}
69+
}
70+
3371
function encode (destKey) {
72+
if (destKey instanceof Buffer) return JSON.stringify({l: destKey.toString('hex')})
3473
return JSON.stringify({l: destKey})
3574
}
3675

package.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
"main": "index.js",
77
"license": "MIT",
88
"dependencies": {
9-
"stream-collect": "^1.3.1"
9+
"collect-stream": "^1.2.1"
1010
},
1111
"keywords": [
1212
"hyperdrive",

test.js

+53
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
const tape = require('tape')
22
const memdb = require('memdb')
33
const hyperdrive = require('hyperdrive')
4+
const Readable = require('stream').Readable
45

56
const ln = require('.')
67

@@ -21,3 +22,55 @@ tape('link', function (t) {
2122
})
2223
})
2324
})
25+
26+
tape('resolve', function (t) {
27+
var drive = hyperdrive(memdb())
28+
var archive = drive.createArchive()
29+
30+
var drive2 = hyperdrive(memdb())
31+
32+
var linkedArchive = drive.createArchive({live: false})
33+
linkedArchive.finalize(() => {
34+
ln.link(archive, '/foo/link', linkedArchive.key, err => {
35+
t.error(err)
36+
37+
ln.resolve(drive2, archive, '/foo/link/bar/baz.txt', (err, nextArchive, nextPath) => {
38+
t.error(err)
39+
t.same(nextArchive.key, linkedArchive.key)
40+
t.same(nextPath, 'bar/baz.txt')
41+
t.end()
42+
})
43+
})
44+
})
45+
})
46+
47+
tape('unresolvable not exists', function (t) {
48+
var drive = hyperdrive(memdb())
49+
var archive = drive.createArchive()
50+
51+
ln.resolve(drive, archive, '/foo/link/bar/baz.txt', (err, nextArchive, nextPath) => {
52+
t.same(err.message, 'unresolvable path /foo/link/bar/baz.txt')
53+
t.end()
54+
})
55+
})
56+
57+
tape('unresolvable not link', function (t) {
58+
var drive = hyperdrive(memdb())
59+
var archive = drive.createArchive()
60+
61+
write('baz').pipe(archive.createFileWriteStream('/foo/link')).on('finish', test)
62+
63+
function test () {
64+
ln.resolve(drive, archive, '/foo/link/bar/baz.txt', (err, nextArchive, nextPath) => {
65+
t.same(err.message, 'unresolvable at /foo/link')
66+
t.end()
67+
})
68+
}
69+
})
70+
71+
function write (str) {
72+
var s = new Readable()
73+
s.push(str)
74+
s.push(null)
75+
return s
76+
}

yarn.lock

+26-34
Original file line numberDiff line numberDiff line change
@@ -177,6 +177,13 @@ cipher-base@^1.0.1:
177177
dependencies:
178178
inherits "^2.0.1"
179179

180+
collect-stream@^1.2.1:
181+
version "1.2.1"
182+
resolved "https://registry.yarnpkg.com/collect-stream/-/collect-stream-1.2.1.tgz#829b41746431b1e27e01e6cd3d0ac163c22a1ca7"
183+
dependencies:
184+
concat-stream "^1.2.0"
185+
once "^1.3.0"
186+
180187
combined-stream@^1.0.5, combined-stream@~1.0.5:
181188
version "1.0.5"
182189
resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.5.tgz#938370a57b4a51dea2c77c15d5c5fdf895164009"
@@ -193,6 +200,14 @@ concat-map@0.0.1:
193200
version "0.0.1"
194201
resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b"
195202

203+
concat-stream@^1.2.0:
204+
version "1.5.2"
205+
resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.5.2.tgz#708978624d856af41a5a741defdd261da752c266"
206+
dependencies:
207+
inherits "~2.0.1"
208+
readable-stream "~2.0.0"
209+
typedarray "~0.0.5"
210+
196211
concat-stream@~1.4.5:
197212
version "1.4.10"
198213
resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.4.10.tgz#acc3bbf5602cb8cc980c6ac840fa7d8603e3ef36"
@@ -239,9 +254,9 @@ dashdash@^1.12.0:
239254
dependencies:
240255
assert-plus "^1.0.0"
241256

242-
debug@^2.1.1, debug@^2.2.0, debug@^2.3.2:
243-
version "2.3.3"
244-
resolved "https://registry.yarnpkg.com/debug/-/debug-2.3.3.tgz#40c453e67e6e13c901ddec317af8986cda9eff8c"
257+
debug@^2.2.0, debug@^2.3.2:
258+
version "2.4.1"
259+
resolved "https://registry.yarnpkg.com/debug/-/debug-2.4.1.tgz#ef2532d2753d282045c13c82ce47a09e56b91d53"
245260
dependencies:
246261
ms "0.7.2"
247262

@@ -405,7 +420,7 @@ esutils@~1.0.0:
405420

406421
execspawn@^1.0.1:
407422
version "1.0.1"
408-
resolved "https://registry.yarnpkg.com/execspawn/-/execspawn-1.0.1.tgz#8286f9dde7cecde7905fbdc04e24f368f23f8da6"
423+
resolved "http://registry.npmjs.org/execspawn/-/execspawn-1.0.1.tgz#8286f9dde7cecde7905fbdc04e24f368f23f8da6"
409424
dependencies:
410425
util-extend "^1.0.1"
411426

@@ -1110,16 +1125,6 @@ process-nextick-args@~1.0.6:
11101125
version "1.0.7"
11111126
resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-1.0.7.tgz#150e20b756590ad3f91093f25a4f2ad8bff30ba3"
11121127

1113-
promise-polyfill@~2.0.2:
1114-
version "2.0.2"
1115-
resolved "https://registry.yarnpkg.com/promise-polyfill/-/promise-polyfill-2.0.2.tgz#3908dda91f5d130bfb3d09b3e1f77c37c4cb2669"
1116-
1117-
promise-util@^1.1.0:
1118-
version "1.2.0"
1119-
resolved "https://registry.yarnpkg.com/promise-util/-/promise-util-1.2.0.tgz#838a3b6c349eb94e60eb42a972d73055bc6634af"
1120-
dependencies:
1121-
require-promise "1.0.1"
1122-
11231128
protocol-buffers-schema@^3.1.1:
11241129
version "3.1.1"
11251130
resolved "https://registry.yarnpkg.com/protocol-buffers-schema/-/protocol-buffers-schema-3.1.1.tgz#b5e4800ce8adab7fb8ffe8770bb36e2a04359c78"
@@ -1224,22 +1229,22 @@ readable-stream@^1.0.33, readable-stream@~1.1.9:
12241229
isarray "0.0.1"
12251230
string_decoder "~0.10.x"
12261231

1227-
readable-stream@^2.0.0, "readable-stream@^2.0.0 || ^1.1.13", readable-stream@^2.0.4, readable-stream@^2.0.5, readable-stream@^2.1.4, readable-stream@^2.1.5:
1228-
version "2.2.2"
1229-
resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.2.2.tgz#a9e6fec3c7dda85f8bb1b3ba7028604556fc825e"
1232+
readable-stream@^2.0.0, readable-stream@~2.0.0, readable-stream@~2.0.5:
1233+
version "2.0.6"
1234+
resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.0.6.tgz#8f90341e68a53ccc928788dacfcd11b36eb9b78e"
12301235
dependencies:
1231-
buffer-shims "^1.0.0"
12321236
core-util-is "~1.0.0"
12331237
inherits "~2.0.1"
12341238
isarray "~1.0.0"
12351239
process-nextick-args "~1.0.6"
12361240
string_decoder "~0.10.x"
12371241
util-deprecate "~1.0.1"
12381242

1239-
readable-stream@~2.0.5:
1240-
version "2.0.6"
1241-
resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.0.6.tgz#8f90341e68a53ccc928788dacfcd11b36eb9b78e"
1243+
"readable-stream@^2.0.0 || ^1.1.13", readable-stream@^2.0.4, readable-stream@^2.0.5, readable-stream@^2.1.4, readable-stream@^2.1.5:
1244+
version "2.2.2"
1245+
resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.2.2.tgz#a9e6fec3c7dda85f8bb1b3ba7028604556fc825e"
12421246
dependencies:
1247+
buffer-shims "^1.0.0"
12431248
core-util-is "~1.0.0"
12441249
inherits "~2.0.1"
12451250
isarray "~1.0.0"
@@ -1272,12 +1277,6 @@ request@2:
12721277
tunnel-agent "~0.4.1"
12731278
uuid "^3.0.0"
12741279

1275-
require-promise@1.0.1:
1276-
version "1.0.1"
1277-
resolved "https://registry.yarnpkg.com/require-promise/-/require-promise-1.0.1.tgz#286508d4b609fe9a439daef714ea721b4f655c22"
1278-
dependencies:
1279-
promise-polyfill "~2.0.2"
1280-
12811280
resolve@^1.1.5, resolve@~1.1.7:
12821281
version "1.1.7"
12831282
resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b"
@@ -1409,13 +1408,6 @@ static-module@^1.1.0:
14091408
static-eval "~0.2.0"
14101409
through2 "~0.4.1"
14111410

1412-
stream-collect@^1.3.1:
1413-
version "1.3.1"
1414-
resolved "https://registry.yarnpkg.com/stream-collect/-/stream-collect-1.3.1.tgz#f55ded11ec88a06d441089609c775a54e383712d"
1415-
dependencies:
1416-
debug "^2.1.1"
1417-
promise-util "^1.1.0"
1418-
14191411
stream-collector@^1.0.1:
14201412
version "1.0.1"
14211413
resolved "https://registry.yarnpkg.com/stream-collector/-/stream-collector-1.0.1.tgz#4d4e55f171356121b2c5f6559f944705ab28db15"

0 commit comments

Comments
 (0)