holepunchto / hyperdrive

Hyperdrive is a secure, real time distributed file system
Apache License 2.0
1.86k stars 134 forks source link

Checkout TypeError: Cannot read property 'download' of null #226

Closed eu1444 closed 1 year ago

eu1444 commented 6 years ago

I am reporting:

Bug Report

Please give us details about your installation to assist you. Run dat -v to see the version of Dat you are using.

Expected behavior

I have a gist (https://gist.github.com/mistersdevelopment/4dcb5d98efbe3f48233d08bc0254c7be) that generates a Dat server/client pair. The server Dat has one file making its version 1. The client Dat's archive performs a checkout of the server at version 1. I expect the client Dat's archive to now be a read only copy of the server at version 1.

Actual behavior

As the logs below show the checkout operation fails with "TypeError: Cannot read property 'download' of null".

Debug Logs

DEBUG=dat* node dat-checkout.js
  dat-node archive ready. version: 0 +0ms
  dat-node importFiles() { watch: true,
  dereference: true,
  count: true,
  indexing: true,
  ignore: [Function: ignore] } +0ms
  dat-node IMPORT ignore: / +63ms
  dat-node IMPORT ignore: /.dat +1ms
  dat-node IMPORT ignore: /.dat/content.bitfield +3ms
  dat-node IMPORT ignore: /.dat/content.key +0ms
  dat-node IMPORT ignore: /.dat/content.signatures +1ms
  dat-node IMPORT ignore: /.dat/content.tree +0ms
  dat-node IMPORT ignore: /.dat/metadata.bitfield +0ms
  dat-node IMPORT ignore: /.dat/metadata.data +0ms
  dat-node IMPORT ignore: /.dat/metadata.key +0ms
  dat-node IMPORT ignore: /.dat/metadata.ogd +1ms
  dat-node IMPORT ignore: /.dat/metadata.signatures +0ms
  dat-node IMPORT ignore: /.dat/metadata.tree +0ms
  dat-node IMPORT put: /test-0.txt +1ms
dat-server - {
  "files": 1,
  "byteLength": 13,
  "length": 1,
  "version": 1
}
  dat-node IMPORT ignore: /.dat/content.signatures +16ms
  dat-node IMPORT ignore: /.dat/content.tree +0ms
  dat-node IMPORT ignore: /.dat/content.bitfield +0ms
  dat-node IMPORT ignore: /.dat/metadata.data +1ms
  dat-node IMPORT ignore: /.dat/metadata.signatures +0ms
  dat-node IMPORT ignore: /.dat/metadata.tree +0ms
  dat-node IMPORT ignore: /.dat/metadata.bitfield +0ms
Created Dat "d752e62e7447ffc324afbaaf593e38fe9a89e8b8bdb866cf913dcb72adc5d3db" with storage "dat-server".
  dat-node archive ready. version: 0 +8s
  dat-node Stream close +0ms
  dat-node Stream close +1ms
dat-client - undefined
dat-client - {
  "files": 1,
  "byteLength": 13,
  "length": 1,
  "version": 1,
  "downloaded": 0
}
dat-client - undefined
  dat-network Downloaded data: 109 +0ms
  dat-network Uploaded data: 109 +95ms
  dat-network Downloaded data: 109 +405ms
  dat-network Uploaded data: 109 +95ms
  dat-network Downloaded data: 109 +406ms
  dat-network Uploaded data: 109 +95ms
  dat-network Downloaded data: 109 +406ms
  dat-network Uploaded data: 109 +95ms
  dat-network Downloaded data: 109 +405ms
  dat-network Uploaded data: 109 +96ms
  dat-network Downloaded data: 109 +405ms
  dat-network Uploaded data: 109 +95ms
  dat-network Downloaded data: 109 +406ms
  dat-network Uploaded data: 109 +96ms
  dat-network Downloaded data: 109 +404ms
  dat-network Uploaded data: 109 +97ms
  dat-network Downloaded data: 109 +404ms
  dat-network Uploaded data: 109 +97ms
  dat-network Downloaded data: 109 +404ms
  dat-node Stream close +5s
  dat-node Stream close +8ms
  dat-network Uploaded data: 109 +97ms
  dat-network Downloaded data: 109 +404ms
  dat-network Uploaded data: 109 +97ms
  dat-network Downloaded data: 109 +404ms
  dat-network Uploaded data: 109 +97ms
  dat-network Downloaded data: 109 +404ms
  dat-network Uploaded data: 109 +97ms
  dat-network Downloaded data: 109 +404ms
  dat-network Uploaded data: 109 +97ms
  dat-network Downloaded data: 109 +404ms
  dat-network Uploaded data: 109 +97ms
  dat-network Downloaded data: 109 +403ms
  dat-network Uploaded data: 109 +98ms
  dat-network Downloaded data: 109 +403ms
  dat-network Uploaded data: 109 +98ms
  dat-network Downloaded data: 109 +402ms
Created Dat "d752e62e7447ffc324afbaaf593e38fe9a89e8b8bdb866cf913dcb72adc5d3db" with storage "dat-client".
dat-checkout/node_modules/hyperdrive/index.js:368
    self.content.download({start, end}, function () {
                 ^

TypeError: Cannot read property 'download' of null
    at downloadFile (dat-checkout/node_modules/hyperdrive/index.js:368:18)
    at dat-checkout/node_modules/hyperdrive/index.js:345:33
    at dat-checkout/node_modules/hyperdrive/index.js:701:5
    at Tree._get (dat-checkout/node_modules/append-tree/index.js:299:12)
    at dat-checkout/node_modules/append-tree/index.js:164:10
    at _combinedTickCallback (internal/process/next_tick.js:141:11)
    at process._tickCallback (internal/process/next_tick.js:180:9)
eu1444 commented 6 years ago

After talking with @joehand it looks like the issue is that I wasn't waiting for the 'content' event to be emitted from the archive. The README.md might need to be updated to reflect this. The documentation shows calling archive.checkout(version).download() as the way to download a checked out archive but given the errors I encountered this is not correct.

chartgerink commented 5 years ago

Were you able to resolve this @mistersdevelopment? If so, would you mind sharing your code so the documentation could be updated?

I'm struggling with the version downloads atm too.

eu1444 commented 5 years ago

Hey @chartgerink, I believe waiting for the content event (https://github.com/mafintosh/hyperdrive/blob/master/index.js#L127) helped but I can't find any documentation of that in the test scripts I kept around so I don't have any code to share. Sorry about that.