molly-db 1.0.5 → 1.0.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/main.js +4 -5
- package/module/_crypto_.js +17 -13
- package/module/_init_.js +2 -1
- package/module/_server_.js +181 -80
- package/module/_worker_.js +19 -12
- package/package.json +1 -1
package/main.js
CHANGED
|
@@ -22,21 +22,20 @@ class molly_db{
|
|
|
22
22
|
if( opt.pass )
|
|
23
23
|
this.pass = opt.pass;
|
|
24
24
|
this.port = opt.port || 27017;
|
|
25
|
-
this.type = opt.type || 'local';
|
|
26
25
|
this.path = opt.path.replace(/^\./,process.cwd());
|
|
27
26
|
|
|
28
27
|
if( this.worker ) return console.log(`server is running`);
|
|
29
28
|
|
|
30
29
|
this.worker = new worker.Worker(
|
|
31
|
-
`${__dirname}/module/_worker_`,{
|
|
30
|
+
`${__dirname}/module/_worker_.js`,{
|
|
32
31
|
env: worker.SHARE_ENV,
|
|
33
32
|
workerData: this
|
|
34
33
|
}
|
|
35
34
|
);
|
|
36
35
|
|
|
37
|
-
this.worker.on('exit',(err)=>{ });
|
|
38
|
-
this.worker.on('error',(err)=>{ });
|
|
39
|
-
this.worker.on('message',(msg)=>{ console.log(msg); response()
|
|
36
|
+
this.worker.on('exit',(err)=>{ console.log(err); reject() });
|
|
37
|
+
this.worker.on('error',(err)=>{ console.log(err); reject() });
|
|
38
|
+
this.worker.on('message',(msg)=>{ console.log(msg); response() });
|
|
40
39
|
});
|
|
41
40
|
}
|
|
42
41
|
|
package/module/_crypto_.js
CHANGED
|
@@ -28,19 +28,23 @@ const JsonFormatter = {
|
|
|
28
28
|
/* --------------------------------------------------------------------------------------- */
|
|
29
29
|
|
|
30
30
|
output.slugify = (str)=>{
|
|
31
|
-
|
|
32
|
-
'c'
|
|
33
|
-
'n'
|
|
34
|
-
'e'
|
|
35
|
-
'i'
|
|
36
|
-
'u'
|
|
37
|
-
'o'
|
|
38
|
-
'a'
|
|
39
|
-
''
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
str=str.replace(
|
|
43
|
-
} return str.toLowerCase();
|
|
31
|
+
[
|
|
32
|
+
['c','ç'],
|
|
33
|
+
['n','ñ'],
|
|
34
|
+
['e','é|è|ê|ë'],
|
|
35
|
+
['i','í|ì|î|ï'],
|
|
36
|
+
['u','ú|ù|û|ü'],
|
|
37
|
+
['o','ó|ò|ô|õ|ö'],
|
|
38
|
+
['a','á|à|ã|â|ä'],
|
|
39
|
+
['' ,/\s+|\W+/,]
|
|
40
|
+
].map(x=>{
|
|
41
|
+
const regex = new RegExp(x[1],'gi');
|
|
42
|
+
str = str.replace( regex,x[0] );
|
|
43
|
+
}); return str.toLowerCase();
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
output.hash = (data,nonce)=>{
|
|
47
|
+
return crypto.SHA256(Math.random+data+nonce).toString();
|
|
44
48
|
}
|
|
45
49
|
|
|
46
50
|
output.encrypt = ( _message,_password )=>{
|
package/module/_init_.js
CHANGED
package/module/_server_.js
CHANGED
|
@@ -1,13 +1,14 @@
|
|
|
1
1
|
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
2
|
+
const api = url.parse( req.url,true );
|
|
3
|
+
let params = api.query;
|
|
4
|
+
let body = undefined;
|
|
5
|
+
|
|
6
|
+
/* --------------------------------------------------------------------------------------- */
|
|
6
7
|
|
|
7
8
|
function error( _error ){
|
|
8
|
-
res.writeHead(
|
|
9
|
-
res.end(
|
|
10
|
-
console.log(_error);
|
|
9
|
+
res.writeHead(404,{'contetn-type':'application/json'});
|
|
10
|
+
res.end(JSON.stringify([{ status:'error', message:_error }]));
|
|
11
|
+
console.log( _error,req.url );
|
|
11
12
|
}
|
|
12
13
|
|
|
13
14
|
function json( _data ){
|
|
@@ -19,11 +20,22 @@ function json( _data ){
|
|
|
19
20
|
|
|
20
21
|
function getBody(){
|
|
21
22
|
return new Promise((response,reject)=>{
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
23
|
+
try{
|
|
24
|
+
if( req.method == 'POST' ){
|
|
25
|
+
const data = new Array();
|
|
26
|
+
req.on('data',(chunk)=>{ data.push(chunk); });
|
|
27
|
+
req.on('close',()=>{ try{
|
|
28
|
+
const buff = Buffer.concat(data).toString();
|
|
29
|
+
const object = JSON.parse(buff);
|
|
30
|
+
const date = Date.now();
|
|
31
|
+
|
|
32
|
+
if( !object.hash )
|
|
33
|
+
object.hash = crypto.hash( date,0 );
|
|
34
|
+
|
|
35
|
+
response(JSON.stringify(object));
|
|
36
|
+
} catch(e) { response(false) } });
|
|
37
|
+
} else { response(true) }
|
|
38
|
+
} catch(e) { response(false) }
|
|
27
39
|
});
|
|
28
40
|
}
|
|
29
41
|
|
|
@@ -49,6 +61,36 @@ function encryptDB( _db,_table, _path ){
|
|
|
49
61
|
});
|
|
50
62
|
}
|
|
51
63
|
|
|
64
|
+
function validate( _params ){
|
|
65
|
+
return new Promise((response,reject)=>{
|
|
66
|
+
|
|
67
|
+
let validator = false;
|
|
68
|
+
|
|
69
|
+
const vtb = (key)=>{ return db._init_.DB.some(x=>{ return x.tables.join().match(key); }) }
|
|
70
|
+
const vdb = (key)=>{ return db._init_.DB.some(x=>{ return x.name == key; }) }
|
|
71
|
+
|
|
72
|
+
validator = [
|
|
73
|
+
[!body, {status:'error',message:'invalid data'}],
|
|
74
|
+
[!_params?.db, {status:'error',message:'no db name added'}],
|
|
75
|
+
[!_params?.table, {status:'error',message:'no table name added'}]
|
|
76
|
+
].some(x=>{ if(x[0]) reject(x[1]); return x[0];}); if(validator) return 0;
|
|
77
|
+
|
|
78
|
+
validator = [
|
|
79
|
+
[!vdb(_params?.db), {status:'error',message:`no db called ${_params.db} exist`}],
|
|
80
|
+
[!vtb(_params?.table), {status:'error',message:`no table called ${_params.table} exist`}]
|
|
81
|
+
].some(x=>{ if(x[0]) reject(x[1]); return x[0];}); if(validator) return 0;
|
|
82
|
+
|
|
83
|
+
validator = [
|
|
84
|
+
[ !_params.offset, '_params.offset = 0' ],
|
|
85
|
+
[ !_params.target, '_params.target = ""' ],
|
|
86
|
+
[ !_params.length, '_params.length = 100' ],
|
|
87
|
+
].map(x=>{ if(x[0]) eval(x[1]) });
|
|
88
|
+
|
|
89
|
+
response(_params);
|
|
90
|
+
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
|
|
52
94
|
/* --------------------------------------------------------------------------------------- */
|
|
53
95
|
|
|
54
96
|
function list( _params ){
|
|
@@ -63,9 +105,10 @@ function match( _params ){
|
|
|
63
105
|
const regex = new RegExp(crypto.slugify(_params.target),'gi');
|
|
64
106
|
const target = crypto.slugify(x);
|
|
65
107
|
if( regex.test(target) ) result.push(x);
|
|
66
|
-
})
|
|
108
|
+
});
|
|
109
|
+
return result.map(x=>JSON.parse(x)).slice(
|
|
67
110
|
_params.offset, Number(_params.offset)+Number(_params.length)
|
|
68
|
-
);
|
|
111
|
+
);
|
|
69
112
|
}
|
|
70
113
|
|
|
71
114
|
function hash( _params ){
|
|
@@ -73,126 +116,171 @@ function hash( _params ){
|
|
|
73
116
|
db[_params.db][_params.table].map((x)=>{
|
|
74
117
|
const regex = new RegExp(_params.target,'gi');
|
|
75
118
|
if( regex.test(x) ) result.push(x);
|
|
76
|
-
})
|
|
119
|
+
});
|
|
120
|
+
return result.map(x=>JSON.parse(x)).slice(
|
|
77
121
|
_params.offset, Number(_params.offset)+Number(_params.length)
|
|
78
|
-
);
|
|
122
|
+
);
|
|
79
123
|
}
|
|
80
124
|
|
|
81
125
|
/* --------------------------------------------------------------------------------------- */
|
|
82
126
|
|
|
83
127
|
function shift( _params ){
|
|
84
|
-
const result = db[_params.db][_params.table].shift();
|
|
85
|
-
modifyDB( _params.db,_params.table ); return result;
|
|
128
|
+
const result = db[_params.db][_params.table].shift(); save( _params ); return result;
|
|
86
129
|
}
|
|
87
130
|
|
|
88
131
|
function pop( _params ){
|
|
89
|
-
const result = db[_params.db][_params.table].pop();
|
|
90
|
-
modifyDB( _params.db,_params.table ); return result; return result;
|
|
132
|
+
const result = db[_params.db][_params.table].pop(); save( _params ); return result;
|
|
91
133
|
}
|
|
92
134
|
|
|
93
135
|
/* --------------------------------------------------------------------------------------- */
|
|
94
136
|
|
|
95
137
|
async function push( _params ){
|
|
96
138
|
|
|
97
|
-
const body = await getBody();
|
|
98
139
|
db[_params.db][_params.table].push( body );
|
|
99
140
|
|
|
100
|
-
|
|
101
|
-
return {
|
|
141
|
+
save( _params ); return [{
|
|
102
142
|
database: _params.db,
|
|
103
143
|
table: _params.table,
|
|
104
144
|
status: 'pushed'
|
|
105
|
-
};
|
|
145
|
+
}];
|
|
106
146
|
|
|
107
147
|
}
|
|
108
148
|
|
|
109
149
|
async function splice( _params ){
|
|
110
150
|
|
|
111
|
-
const body = await getBody();
|
|
112
151
|
db[_params.db][_params.table].splice(
|
|
113
152
|
_params.offset,_params.length,body
|
|
114
153
|
);
|
|
115
154
|
|
|
116
|
-
|
|
117
|
-
return {
|
|
155
|
+
save( _params ); return [{
|
|
118
156
|
database: _params.db,
|
|
119
157
|
table: _params.table,
|
|
120
158
|
status: 'spliced'
|
|
121
|
-
};
|
|
159
|
+
}];
|
|
122
160
|
}
|
|
123
161
|
|
|
124
162
|
async function unshift( _params ){
|
|
125
163
|
|
|
126
|
-
const body = await getBody();
|
|
127
164
|
db[_params.db][_params.table].unshift( body );
|
|
128
165
|
|
|
129
|
-
|
|
130
|
-
return {
|
|
166
|
+
save( _params ); return [{
|
|
131
167
|
database: _params.db,
|
|
132
168
|
table: _params.table,
|
|
133
169
|
status: 'unshifted'
|
|
134
|
-
};
|
|
170
|
+
}];
|
|
135
171
|
}
|
|
136
172
|
|
|
137
173
|
/* --------------------------------------------------------------------------------------- */
|
|
138
174
|
|
|
139
|
-
function
|
|
140
|
-
|
|
141
|
-
const init = `${query.path}/_init_.json`;
|
|
175
|
+
async function update( _params ){
|
|
142
176
|
|
|
143
|
-
db.
|
|
144
|
-
|
|
145
|
-
|
|
177
|
+
const index = db[_params.db][_params.table].findIndex(x=>{
|
|
178
|
+
const regex = new RegExp(_params.target,'gi');
|
|
179
|
+
return regex.test(x);
|
|
146
180
|
});
|
|
147
181
|
|
|
148
|
-
|
|
149
|
-
|
|
182
|
+
if( !(index<0) )
|
|
183
|
+
db[_params.db][_params.table].splice( index,1,body );
|
|
150
184
|
|
|
151
|
-
return {
|
|
185
|
+
save( _params ); return [{
|
|
152
186
|
database: _params.db,
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
187
|
+
table: _params.table,
|
|
188
|
+
status: 'udated'
|
|
189
|
+
}];
|
|
156
190
|
}
|
|
157
191
|
|
|
158
|
-
function
|
|
192
|
+
async function remove( _params ){
|
|
159
193
|
|
|
160
|
-
const
|
|
161
|
-
|
|
162
|
-
return x
|
|
163
|
-
});
|
|
194
|
+
const index = db[_params.db][_params.table].findIndex(x=>{
|
|
195
|
+
const regex = new RegExp(_params.target,'gi');
|
|
196
|
+
return regex.test(x);
|
|
197
|
+
});
|
|
164
198
|
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
199
|
+
if( !(index<0) )
|
|
200
|
+
db[_params.db][_params.table].splice( index,1 );
|
|
201
|
+
|
|
202
|
+
save( _params ); return [{
|
|
203
|
+
database: _params.db,
|
|
204
|
+
table: _params.table,
|
|
205
|
+
status: 'removed'
|
|
206
|
+
}];
|
|
207
|
+
}
|
|
169
208
|
|
|
170
|
-
|
|
171
|
-
fs.writeFileSync( init,JSON.stringify(db._init_) );
|
|
209
|
+
async function save( _params ){
|
|
172
210
|
|
|
173
|
-
|
|
211
|
+
modifyDB( _params.db,_params.table );
|
|
212
|
+
return [{
|
|
174
213
|
database: _params.db,
|
|
175
214
|
table: _params.table,
|
|
176
|
-
status: '
|
|
177
|
-
};
|
|
215
|
+
status: 'saved'
|
|
216
|
+
}];
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
/* --------------------------------------------------------------------------------------- */
|
|
220
|
+
|
|
221
|
+
function addDB( _params ){
|
|
222
|
+
try{
|
|
223
|
+
|
|
224
|
+
const init = `${query.path}/_init_.json`;
|
|
225
|
+
|
|
226
|
+
db._init_.DB.push({
|
|
227
|
+
name: _params.db,
|
|
228
|
+
tables: []
|
|
229
|
+
});
|
|
178
230
|
|
|
231
|
+
db[_params.db] = new Array();
|
|
232
|
+
fs.writeFileSync( init,JSON.stringify(db._init_) );
|
|
233
|
+
|
|
234
|
+
return [{
|
|
235
|
+
database: _params.db,
|
|
236
|
+
status: 'DB added'
|
|
237
|
+
}];
|
|
238
|
+
|
|
239
|
+
} catch(e) { }
|
|
179
240
|
}
|
|
180
241
|
|
|
181
|
-
function
|
|
242
|
+
function removeDB( _params ){
|
|
243
|
+
try{
|
|
182
244
|
|
|
183
|
-
|
|
184
|
-
|
|
245
|
+
const init = `${query.path}/_init_.json`;
|
|
246
|
+
const i = db._init_.DB.findIndex(x=>{
|
|
247
|
+
return x.name == _params.db
|
|
248
|
+
});
|
|
249
|
+
|
|
250
|
+
db._init_.DB[i].tables.forEach(x=>{
|
|
251
|
+
const path = `${query.path}/${x}.json`;
|
|
252
|
+
fs.unlinkSync(path);
|
|
253
|
+
}); db._init_.DB.splice(i,1);
|
|
254
|
+
|
|
255
|
+
db[_params.db] = new Array();
|
|
256
|
+
fs.writeFileSync( init,JSON.stringify(db._init_) );
|
|
257
|
+
|
|
258
|
+
return [{
|
|
259
|
+
database: _params.db,
|
|
260
|
+
table: _params.table,
|
|
261
|
+
status: 'DB deleted'
|
|
262
|
+
}];
|
|
185
263
|
|
|
186
|
-
|
|
264
|
+
} catch(e) { }
|
|
265
|
+
}
|
|
187
266
|
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
if( length>0 ) encryptDB( _name, _table, path );
|
|
191
|
-
else fs.writeFileSync( path,'' );
|
|
192
|
-
} catch(e) {
|
|
193
|
-
fs.unlinkSync( path );
|
|
194
|
-
}
|
|
267
|
+
function modifyDB( _name, _table ){
|
|
268
|
+
try{
|
|
195
269
|
|
|
270
|
+
const init = `${query.path}/_init_.json`;
|
|
271
|
+
const path = `${query.path}/${_table}.json`;
|
|
272
|
+
|
|
273
|
+
fs.writeFileSync( init,JSON.stringify(db._init_) );
|
|
274
|
+
|
|
275
|
+
try {
|
|
276
|
+
const length = db[_name][_table].length;
|
|
277
|
+
if( length>0 ) encryptDB( _name, _table, path );
|
|
278
|
+
else fs.writeFileSync( path,'' );
|
|
279
|
+
} catch(e) {
|
|
280
|
+
fs.unlinkSync( path );
|
|
281
|
+
}
|
|
282
|
+
|
|
283
|
+
} catch(e) { }
|
|
196
284
|
}
|
|
197
285
|
|
|
198
286
|
/* --------------------------------------------------------------------------------------- */
|
|
@@ -211,13 +299,12 @@ function addTable( _params ){
|
|
|
211
299
|
}); db._init_.DB[i].tables.push(_params.table);
|
|
212
300
|
|
|
213
301
|
db[_params.db][_params.table] = new Array();
|
|
214
|
-
modifyDB( _params.db,_params.table );
|
|
215
302
|
|
|
216
|
-
return {
|
|
303
|
+
return [{
|
|
217
304
|
database: _params.db,
|
|
218
305
|
table: _params.table,
|
|
219
306
|
status: 'table added'
|
|
220
|
-
};
|
|
307
|
+
}];
|
|
221
308
|
|
|
222
309
|
}
|
|
223
310
|
|
|
@@ -233,28 +320,42 @@ function removeTable( _params ){
|
|
|
233
320
|
|
|
234
321
|
db._init_.DB[i].tables.splice(j,1);
|
|
235
322
|
delete db[_params.db][_params.table];
|
|
236
|
-
modifyDB( _params.db,_params.table );
|
|
237
323
|
|
|
238
|
-
return {
|
|
324
|
+
return [{
|
|
239
325
|
database: _params.db,
|
|
240
326
|
table: _params.table,
|
|
241
327
|
status: 'table removed'
|
|
242
|
-
};
|
|
328
|
+
}];
|
|
243
329
|
|
|
244
330
|
}
|
|
245
331
|
|
|
246
332
|
/* --------------------------------------------------------------------------------------- */
|
|
247
333
|
|
|
248
|
-
(
|
|
249
|
-
|
|
334
|
+
function refresh( _params ){
|
|
335
|
+
return new Promise((response,reject)=>{
|
|
336
|
+
_init_().then(()=>{ response([{status: 'done'}]) })
|
|
337
|
+
.catch((e)=>{ reject([{status:'error',message:e.message}]) });
|
|
338
|
+
});
|
|
339
|
+
}
|
|
250
340
|
|
|
251
|
-
|
|
252
|
-
|
|
341
|
+
/* --------------------------------------------------------------------------------------- */
|
|
342
|
+
|
|
343
|
+
(async ()=>{
|
|
344
|
+
try{
|
|
345
|
+
|
|
346
|
+
body = await getBody();
|
|
347
|
+
params = await validate(params);
|
|
253
348
|
|
|
254
349
|
/* Find Api */
|
|
255
350
|
if( api.pathname == '/list' ) json( await list(params) )
|
|
256
351
|
else if( api.pathname == '/hash' ) json( await hash(params) )
|
|
257
352
|
else if( api.pathname == '/match' ) json( await match(params) )
|
|
353
|
+
else if( api.pathname == '/update' ) json( await update(params) )
|
|
354
|
+
|
|
355
|
+
/* Save Api */
|
|
356
|
+
else if( api.pathname == '/save' ) json( await save(params) )
|
|
357
|
+
else if( api.pathname == '/remove' ) json( await remove(params) )
|
|
358
|
+
else if( api.pathname == '/refresh' ) json( await refresh(params) )
|
|
258
359
|
|
|
259
360
|
/* Remove Api */
|
|
260
361
|
else if( api.pathname == '/pop' ) json( await pop(params) )
|
|
@@ -275,7 +376,7 @@ function removeTable( _params ){
|
|
|
275
376
|
|
|
276
377
|
else error('Oops something went wrong');
|
|
277
378
|
|
|
278
|
-
} catch(e) { error(e); }
|
|
379
|
+
} catch(e) { error(e?.message||e); }
|
|
279
380
|
})();
|
|
280
381
|
|
|
281
382
|
/* --------------------------------------------------------------------------------------- */
|
package/module/_worker_.js
CHANGED
|
@@ -9,34 +9,41 @@ const fs = require('fs');
|
|
|
9
9
|
|
|
10
10
|
const query = worker.workerData;
|
|
11
11
|
const db = new Object();
|
|
12
|
-
|
|
13
12
|
/* --------------------------------------------------------------------------------------- */
|
|
14
13
|
|
|
15
|
-
function
|
|
16
|
-
|
|
14
|
+
function _init_(){
|
|
15
|
+
return new Promise((response,reject)=>{
|
|
16
|
+
try{
|
|
17
|
+
eval( fs.readFileSync(`${__dirname}/_init_.js`).toString() );
|
|
18
|
+
} catch(e){ console.log(e); }
|
|
19
|
+
});
|
|
17
20
|
}
|
|
18
21
|
|
|
19
22
|
/* --------------------------------------------------------------------------------------- */
|
|
20
23
|
|
|
21
|
-
function
|
|
22
|
-
|
|
23
|
-
eval( fs.readFileSync(`${__dirname}/
|
|
24
|
-
})
|
|
24
|
+
function app(req,res){
|
|
25
|
+
try{
|
|
26
|
+
eval( fs.readFileSync(`${__dirname}/_server_.js`).toString() );
|
|
27
|
+
} catch(e) { console.log(e) }
|
|
25
28
|
}
|
|
26
29
|
|
|
27
30
|
/* --------------------------------------------------------------------------------------- */
|
|
28
31
|
|
|
29
32
|
(()=>{
|
|
30
33
|
try{
|
|
31
|
-
console.log('molly-db is running, please wait');
|
|
32
34
|
http.createServer( app ).listen( query.port,()=>{
|
|
35
|
+
console.log('molly-db cluster is running, please wait');
|
|
33
36
|
_init_().then(()=>{
|
|
34
|
-
worker.parentPort.postMessage(
|
|
35
|
-
|
|
36
|
-
|
|
37
|
+
worker.parentPort.postMessage({
|
|
38
|
+
protocol: 'HTTP',
|
|
39
|
+
status: 'started',
|
|
40
|
+
workerID: process.pid,
|
|
41
|
+
msg: 'molly-db is running',
|
|
42
|
+
server: `http://localhost:${query.port}`,
|
|
43
|
+
});
|
|
37
44
|
}).catch(e=>{ process.exit(1); });
|
|
38
45
|
});
|
|
39
|
-
} catch(e) {
|
|
46
|
+
} catch(e) {}
|
|
40
47
|
})();
|
|
41
48
|
|
|
42
49
|
/* --------------------------------------------------------------------------------------- */
|