@@ -4,6 +4,14 @@ var levelProxy = require('level-proxy');
4
4
var net = require ( 'net' ) ;
5
5
var fs = require ( 'fs' ) ;
6
6
var path = require ( 'path' ) ;
7
+ var has = require ( 'has' ) ;
8
+ var manifest = require ( 'level-manifest' ) ( {
9
+ methods : {
10
+ _iteratorCreate : { type : 'async' } ,
11
+ _iteratorNext : { type : 'async' } ,
12
+ _iteratorEnd : { type : 'async' }
13
+ }
14
+ } ) ;
7
15
8
16
module . exports = function ( dir , opts ) {
9
17
var proxy = levelProxy ( ) ;
@@ -27,8 +35,40 @@ function withProxy (proxy, dir, opts) {
27
35
db . removeListener ( 'error' , onerror ) ;
28
36
29
37
var server = net . createServer ( function ( stream ) {
30
- stream . on ( 'error' , function ( err ) { } ) ;
38
+ var iterators = { } ;
39
+ if ( ! db . methods ) db . methods = { } ;
40
+
41
+ db . methods . _iteratorCreate = { type : 'async' } ;
42
+ db . _iteratorCreate = function ( ix , opts ) {
43
+ iterators [ ix ] = ( db . iterator && db . iterator ( opts ) )
44
+ || ( db . db && db . db . iterator && db . db . iterator ( opts ) )
45
+ ;
46
+ } ;
47
+
48
+ db . methods . _iteratorNext = { type : 'async' } ;
49
+ db . _iteratorNext = function ( ix , cb ) {
50
+ if ( ! has ( iterators , ix ) ) cb ( new Error ( 'no such iterator' ) )
51
+ else iterators [ ix ] . next ( function ( err , key , value ) {
52
+ cb ( err , key , value ) ;
53
+ } )
54
+ } ;
55
+
56
+ db . methods . _iteratorEnd = { type : 'async' } ;
57
+ db . _iteratorEnd = function ( ix , cb ) {
58
+ if ( ! has ( iterators , ix ) ) cb ( new Error ( 'no such iterator' ) )
59
+ else iterators [ ix ] . end ( cb )
60
+ } ;
61
+
62
+ stream . on ( 'error' , function ( err ) { cleanup ( ) } ) ;
63
+ stream . once ( 'end' , cleanup ) ;
31
64
stream . pipe ( multilevel . server ( db ) ) . pipe ( stream ) ;
65
+
66
+ function cleanup ( ) {
67
+ Object . keys ( iterators ) . forEach ( function ( ix ) {
68
+ iterators [ ix ] . end ( ) ;
69
+ } ) ;
70
+ iterators = null ;
71
+ }
32
72
} ) ;
33
73
server . listen ( sockfile ) ;
34
74
@@ -58,7 +98,17 @@ function withProxy (proxy, dir, opts) {
58
98
}
59
99
60
100
function createStream ( ) {
61
- var xdb = multilevel . client ( ) ;
101
+ var xdb = multilevel . client ( manifest ) ;
102
+
103
+ var iteratorIx = 0 ;
104
+ xdb . iterator = function ( opts ) {
105
+ var ix = iteratorIx ++ ;
106
+ xdb . _iteratorCreate ( ix , opts ) ;
107
+
108
+ return { next : next , end : end } ;
109
+ function next ( cb ) { xdb . _iteratorNext ( ix , cb ) }
110
+ function end ( cb ) { xdb . _iteratorEnd ( ix , cb ) }
111
+ } ;
62
112
63
113
( function connect ( ) {
64
114
var stream = net . connect ( sockfile ) ;
0 commit comments