@@ -4,23 +4,23 @@ const { EventEmitter } = require('events')
4
4
const hyperdrive = require ( 'hyperdrive' )
5
5
const sub = require ( 'subleveldown' )
6
6
const collectStream = require ( 'stream-collector' )
7
+ const bjson = require ( 'buffer-json-encoding' )
7
8
const datEncoding = require ( 'dat-encoding' )
8
9
9
10
const { fromHyperdriveOptions, toHyperdriveOptions } = require ( 'hyperdrive-daemon-client/lib/common' )
10
11
const log = require ( '../log' ) . child ( { component : 'drive-manager' } )
11
12
12
13
class DriveManager extends EventEmitter {
13
- constructor ( megastore , networking , db , opts ) {
14
+ constructor ( corestore , networking , db , opts ) {
14
15
super ( )
15
16
16
- this . megastore = megastore
17
+ this . corestore = corestore
17
18
this . networking = networking
18
19
this . db = db
19
20
this . opts = opts || { }
20
21
21
- this . _driveIndex = sub ( this . db , 'drives' , { valueEncoding : 'json' } )
22
+ this . _driveIndex = sub ( this . db , 'drives' , { valueEncoding : bjson } )
22
23
this . _seedIndex = sub ( this . db , 'seeding' , { valueEncoding : 'utf8' } )
23
- this . _nameIndex = sub ( this . db , 'names' , { valueEncoding : 'utf8' } )
24
24
25
25
if ( this . opts . stats ) {
26
26
this . _statsIndex = sub ( this . db , 'stats' , { valueEncoding : 'json' } )
@@ -29,6 +29,8 @@ class DriveManager extends EventEmitter {
29
29
30
30
// TODO: Replace with an LRU cache.
31
31
this . _drives = new Map ( )
32
+ this . _sessions = new Map ( )
33
+
32
34
this . _ready = new Promise ( async resolve => {
33
35
await this . _reseed ( )
34
36
return resolve ( )
@@ -56,14 +58,13 @@ class DriveManager extends EventEmitter {
56
58
drive . writeFile ( '.key' , drive . key . toString ( 'hex' ) , err => {
57
59
if ( err ) return reject ( err )
58
60
if ( opts && opts . rootDrive ) {
59
- drive . mkdir ( '/home' , { uid : process . getuid ( ) , gid : process . getgid ( ) } , err => {
61
+ return drive . mkdir ( '/home' , { uid : process . getuid ( ) , gid : process . getgid ( ) } , err => {
60
62
if ( err ) return reject ( err )
61
63
return resolve ( err )
62
64
} )
63
65
} else {
64
66
return resolve ( )
65
67
}
66
-
67
68
} )
68
69
}
69
70
} )
@@ -89,12 +90,6 @@ class DriveManager extends EventEmitter {
89
90
} , this . opts . statsInterval || 2000 )
90
91
}
91
92
92
- _generateName ( key ) {
93
- if ( key ) return key . toString ( 'hex' )
94
- // TODO: check collisions
95
- return crypto . randomBytes ( 64 ) . toString ( 'hex' )
96
- }
97
-
98
93
_generateKeyString ( key , opts ) {
99
94
var keyString = ( key instanceof Buffer ) ? key . toString ( 'hex' ) : key
100
95
if ( opts && opts . version ) keyString = keyString + '+' + opts . version
@@ -104,53 +99,40 @@ class DriveManager extends EventEmitter {
104
99
105
100
async get ( key , opts ) {
106
101
key = ( key instanceof Buffer ) ? datEncoding . decode ( key ) : key
107
- const keyString = this . _generateKeyString ( key , opts )
108
- var newDrive = false
102
+ var keyString = this . _generateKeyString ( key , opts )
109
103
110
104
if ( key ) {
111
105
// TODO: cache checkouts
112
106
const existing = this . _drives . get ( keyString )
113
107
if ( existing ) return existing
114
- try {
115
- var name = await this . _nameIndex . get ( key )
116
- } catch ( err ) {
117
- if ( ! err . notFound ) throw err
118
- // If a name was not found for this key, then the drive is not writable and must be synced.
119
- name = this . _generateName ( key )
120
- newDrive = true
121
- }
122
- } else {
123
- name = this . _generateName ( )
124
- newDrive = true
125
108
}
126
109
127
- console . error ( 'GETTING CORESTORE WITH OPTS:' , { ...this . opts , ...opts } )
128
- const corestore = this . megastore . get ( name , { ...this . opts , ...opts } )
129
110
const driveOpts = {
130
111
...opts ,
131
112
sparse : opts . sparse !== false ,
132
113
sparseMetadata : opts . sparseMetadata !== false
133
114
}
134
- const drive = hyperdrive ( corestore , key , driveOpts )
135
-
115
+ const drive = hyperdrive ( this . corestore , key , driveOpts )
136
116
await new Promise ( ( resolve , reject ) => {
137
117
drive . ready ( err => {
138
118
if ( err ) return reject ( err )
139
119
return resolve ( )
140
120
} )
141
121
} )
122
+
142
123
key = datEncoding . encode ( drive . key )
124
+ keyString = this . _generateKeystring ( key , opts )
125
+
143
126
144
127
if ( drive . writable ) {
145
128
await this . _configureDrive ( drive , opts && opts . configure )
146
129
}
147
- if ( newDrive && this . opts . stats ) {
130
+ if ( this . opts . stats ) {
148
131
this . _collectStats ( drive )
149
132
}
150
133
151
134
// TODO: This should all be in one batch.
152
135
await Promise . all ( [
153
- this . _nameIndex . put ( key , name ) ,
154
136
this . _driveIndex . put ( key , driveOpts )
155
137
] )
156
138
this . _drives . set ( key , drive )
0 commit comments