molly-db 1.0.3 → 1.0.4

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 CHANGED
@@ -2,5 +2,6 @@ const output = new Object();
2
2
 
3
3
  try{ output.streamDB = require('./module/streamDB'); } catch(e) { /*console.log(e)*/ }
4
4
  try{ output.localDB = require('./module/localDB'); } catch(e) { /*console.log(e)*/ }
5
+ try{ output.webDB = require('./module/webDB'); } catch(e) { /*console.log(e)*/ }
5
6
 
6
7
  module.exports = output;
package/module/localDB.js CHANGED
@@ -1,22 +1,65 @@
1
- const readline = require('./readline');
1
+ const readline = require('readline');
2
+ const crypto = require('crypto-js');
2
3
  const fs = require('fs');
3
4
 
5
+ //TODO: Function ---------------------------------------------------------------------------------//
6
+ function slugify(str){
7
+ const map = {
8
+ 'o' : 'ó|ò|ô|õ|ö|Ó|Ò|Ô|Õ|Ö',
9
+ 'a' : 'á|à|ã|â|ä|À|Á|Ã|Â|Ä',
10
+ 'e' : 'é|è|ê|ë|É|È|Ê|Ë',
11
+ 'i' : 'í|ì|î|ï|Í|Ì|Î|Ï',
12
+ 'u' : 'ú|ù|û|ü|Ú|Ù|Û|Ü',
13
+ 'c' : 'ç|Ç','n':'ñ|Ñ',
14
+ '' : /\s+|\W+/,
15
+ };
16
+ for (var pattern in map) {
17
+ str=str.replace( new RegExp(map[pattern],'gi' ), pattern);
18
+ } return str.toLowerCase();
19
+ }
20
+
21
+ const JsonFormatter = {
22
+ 'stringify': function(cipherParams) {
23
+ var jsonObj = { ct: cipherParams.ciphertext.toString(crypto.enc.Base64) };
24
+ if (cipherParams.salt) jsonObj.s = cipherParams.salt.toString();
25
+ if (cipherParams.iv) jsonObj.iv = cipherParams.iv.toString();
26
+ return new Buffer(JSON.stringify(jsonObj)).toString('base64');
27
+ },
28
+
29
+ 'parse': function(jsonStr) {
30
+ var jsonObj = JSON.parse( new Buffer(jsonStr,'base64').toString('UTF-8'));
31
+ var cipherParams = crypto.lib.CipherParams.create({
32
+ ciphertext: crypto.enc.Base64.parse(jsonObj.ct)
33
+ });
34
+ if (jsonObj.iv) cipherParams.iv = crypto.enc.Hex.parse(jsonObj.iv);
35
+ if (jsonObj.s) cipherParams.salt = crypto.enc.Hex.parse(jsonObj.s);
36
+ return cipherParams;
37
+ }
38
+ };
39
+
4
40
  //TODO: Optimization FUnctions -------------------------------------------------------------------//
5
41
 
6
- const _default = { offset: 0, length: 100 };
7
42
  const init = function( _table,_config,_self ){
8
43
  return {
9
- _tbl: createNewTable( `${_self.path}/${_table}.json` ),
44
+ _itr: readline.createInterface( createNewTable( `${_self.path}/${_table}.json` ) ),
45
+ _cfg: !_config ? _self.default : _config,
10
46
  _tmp: `${_self.path}/${_table}_tmp.json`,
11
47
  _path: `${_self.path}/${_table}.json`,
12
- _cfg: config(_config),
48
+ _res: new Array(),
49
+ _i: 0,
13
50
  }
14
51
  };
15
52
 
53
+ const lineConstrain = function( _i,_config ){
54
+ if( _i >= parseInt(_config.length)+parseInt(_config.offset) ) return 1;
55
+ else if ( _i < parseInt(_config.offset) ) return -1
56
+ else return 0;
57
+ }
58
+
16
59
  const createNewTable = function( _path ){
17
60
  if( !fs.existsSync( _path ) ) fs.writeFileSync( _path,"" );
18
61
  const table = fs.createReadStream( _path );
19
- return table;
62
+ return { debug: false, input: table };
20
63
  }
21
64
 
22
65
  const createNewHash = function( _object ){
@@ -27,64 +70,195 @@ const createNewHash = function( _object ){
27
70
  return _object;
28
71
  }
29
72
 
30
- function config(_config){
31
- Object.keys(_config).map((x)=>{
32
- _default[x] = _config[x];
33
- }); return _default;
34
- }
35
-
36
73
  //TODO: localDB Class ----------------------------------------------------------------------------//
37
74
 
38
- class localDB {
75
+ class localDB{
39
76
 
77
+ encrypted = false
78
+ events = new Object()
40
79
  default = { offset: 0, length: 100 }
41
80
 
42
- constructor( _object ){
43
- if( _object.pass ){
44
- this.password = _object.pass;
45
- } this.path = _object.path;
81
+ constructor( object ){
82
+ if( object.pass ){
83
+ this.password = object.pass;
84
+ this.encrypted = true;
85
+ } this.path = object.path;
46
86
  }
47
87
 
48
- // TODO: Searching functions --------------------------------------------------- //
88
+ // TODO: Encription & Decription DATA //
89
+ encrypt( _message,_password=this.password,_encrypted=this.encrypted ){
90
+ try{
91
+ if( _encrypted )
92
+ return crypto.AES.encrypt( _message,_password,{
93
+ format: JsonFormatter
94
+ }).toString(); return _message;
95
+ } catch(e) { return _message; }
96
+ }
97
+
98
+ decrypt( _message,_password=this.password,_encrypted=this.encrypted ){
99
+ try{
100
+ if( _encrypted )
101
+ return crypto.AES.decrypt( _message,_password,{
102
+ format: JsonFormatter
103
+ }).toString( crypto.enc.Utf8 );
104
+ return _message;
105
+ } catch(e) { return _message; }
106
+ }
107
+
108
+ // TODO: Searching functions //
49
109
  list( _table, _config ){
50
- return new Promise( async(response,reject)=>{ try{
51
- const { _cfg,_tbl,_tmp,_path } = init( _table,_config,this );
52
- let data = await readline.list( this,_tbl,_cfg );
53
- data = data.map(x=>{ return JSON.parse(x) });
54
- response({ data:data, table:_table });
55
- } catch(e) { reject(e); }});
110
+ return new Promise( (res,rej)=>{ try{
111
+
112
+ let { _i,_cfg,_itr,_res,_tmp,_path } = init( _table,_config,this );
113
+
114
+ _itr.on( 'line',( encryptedLine )=>{ try{
115
+ const line = this.decrypt( encryptedLine );
116
+ const cns = lineConstrain( _i, _cfg );
117
+ if( cns == 0 ) { _res.push( JSON.parse( line ) );
118
+ } else if( cns == 1 ) _itr.close();
119
+ } catch(e) { rej(`the db can be decripted: ${e}`) }
120
+ _i++; });
121
+
122
+ _itr.on( 'close',()=>{ res({
123
+ table:_table,
124
+ data:_res,
125
+ }); });
126
+
127
+ } catch(e) { rej( e ); } });
56
128
  }
57
129
 
58
130
  find( _table, _target, _config ){
59
- return new Promise( async(response,reject)=>{ try{
60
- const { _cfg,_tbl,_tmp,_path } = init( _table,_config,this );
61
- let data = await readline.find( this,_tbl,_target,_cfg );
62
- data = data.map(x=>{ return JSON.parse(x) });
63
- response({ data:data, table:_table });
64
- } catch(e) { reject(e); }});
131
+ return new Promise( async(res,rej)=>{ try{
132
+
133
+ let { _i,_cfg,_itr,_res } = await init( _table,_config,this );
134
+
135
+ _itr.on( 'line',( encryptedLine )=>{
136
+ try{
137
+ const line = this.decrypt( encryptedLine );
138
+ const keys = Object.keys( _target );
139
+ const data = JSON.parse( line );
140
+
141
+ const regex = ( x )=>{
142
+ const target = slugify(_target[x].toString());
143
+ const info = slugify(data[x].toString());
144
+ const regex = new RegExp(target,'gi');
145
+ return regex.test(info);
146
+ }
147
+
148
+ const every = keys.every( (x)=>{return regex(x)} );
149
+ if( ( every ) ){
150
+ const cns = lineConstrain( _i, _cfg );
151
+ if( cns == 0 ) _res.push( data );
152
+ else if( cns == 1 ) _itr.close();
153
+ _i++;}
154
+
155
+ } catch(e) { rej(`the db can be decripted: ${e}`) }
156
+ });
157
+
158
+ _itr.on( 'close',()=>{ res({
159
+ table:_table,
160
+ data:_res,
161
+ }); });
162
+
163
+ } catch(e) { rej( e ); } });
65
164
  }
66
165
 
67
166
  match( _table,_match,_config ){
68
- return new Promise( async(response,reject)=>{ try{
69
- const { _cfg,_tbl,_tmp,_path } = init( _table,_config,this );
70
- let data = await readline.match( this,_tbl,_match );
71
- data = data.map(x=>{ return JSON.parse(x) });
72
- response({ data:data, table:_table });
73
- } catch(e) { reject(e); }});
167
+ return new Promise( async(res,rej)=>{ try{
168
+
169
+ let { _i,_cfg,_itr,_res } = await init( _table,_config,this );
170
+
171
+ _itr.on( 'line',( encryptedLine )=>{ try{
172
+ const regex = new RegExp(slugify(_match),'gi');
173
+ const line = this.decrypt( encryptedLine );
174
+ if( regex.test(slugify(line)) ){
175
+ const cns = lineConstrain( _i, _cfg );
176
+ if( cns == 0 ) _res.push( JSON.parse( line ) );
177
+ else if( cns == 1 ) _itr.close();
178
+ _i++;}
179
+ } catch(e) { rej(`the db can be decripted: ${e}`) }
180
+ });
181
+
182
+ _itr.on( 'close',()=>{ res({
183
+ table:_table,
184
+ data:_res,
185
+ }); });
186
+
187
+ } catch(e) { rej( e ); } });
74
188
  }
75
189
 
76
190
  hash( _table, _hash ){
77
- return new Promise( async(response,reject)=>{ try{
78
- const { _cfg,_tbl,_tmp,_path } = init( _table,null,this );
79
- let data = await readline.hash( this,_tbl,_hash,_cfg );
80
- data = data.map(x=>{ return JSON.parse(x) });
81
- response({ data:data, table:_table });
82
- } catch(e) { reject(e); }});
191
+ return new Promise( (res,rej)=>{ try{
192
+
193
+ let { _i,_cfg,_itr,_res,_tmp,_path } = init( _table,null,this );
194
+
195
+ _itr.on( 'line',( encryptedLine )=>{ try{
196
+ const line = this.decrypt( encryptedLine );
197
+ const data = JSON.parse( line );
198
+ if( data.hash == _hash ){
199
+ _res.push( data );
200
+ _itr.close();
201
+ }
202
+ } catch(e) { rej(`the db can be decripted: ${e}`) }
203
+ });
204
+
205
+ _itr.on( 'close',()=>{ res({
206
+ table:_table,
207
+ data:_res,
208
+ }); });
209
+
210
+ } catch(e) { rej( e ); } });
211
+ }
212
+
213
+ // TODO: Saving functions //
214
+ encryptTable( _table,_password ){
215
+ return new Promise( (res,rej)=>{ try{
216
+
217
+ let { _i,_cfg,_itr,_res,_tmp,_path } = init( _table,null,this );
218
+ const writable = fs.createWriteStream( _tmp );
219
+
220
+ writable.on( 'finish',()=>{ fs.renameSync( _tmp, _path ); res(); });
221
+
222
+ _itr.on( 'line',( encryptedLine )=>{
223
+ try{
224
+ const line = this.decrypt( encryptedLine );
225
+ const encryptedData = this.encrypt( line,_password,true );
226
+ writable.write( `${encryptedData}\n` );
227
+ } catch(e) { rej(`the db can be decripted ${e}`) }
228
+ });
229
+
230
+ _itr.on( 'close',()=>{ writable.end(); res({
231
+ table: _table,
232
+ }); });
233
+
234
+ } catch(e) { rej( e ); } });
235
+ }
236
+
237
+ decryptTable( _table ){
238
+ return new Promise( (res,rej)=>{ try{
239
+
240
+ let { _i,_cfg,_itr,_res,_tmp,_path } = init( _table,null,this );
241
+ const writable = fs.createWriteStream( _tmp );
242
+
243
+ writable.on( 'finish',()=>{ fs.renameSync( _tmp, _path ); res(); });
244
+ _itr.on( 'line',( encryptedLine )=>{
245
+ try{
246
+ const line = this.decrypt( encryptedLine );
247
+ writable.write( `${line}\n` );
248
+
249
+ } catch(e) { rej(`the db can be decripted: ${e}`) }
250
+ });
251
+
252
+ _itr.on( 'close',()=>{ writable.end(); res({
253
+ table: _table,
254
+ }); });
255
+
256
+ } catch(e) { rej( e ); } });
83
257
  }
84
258
 
85
- // TODO: Saving functions ------------------------------------------------- //
259
+ // TODO: Saving functions //
86
260
  push( _table, ..._object ){
87
- return new Promise( (response,reject)=>{ try{
261
+ return new Promise( (res,rej)=>{ try{
88
262
 
89
263
  let { _i,_cfg,_itr,_res,_tmp,_path } = init( _table,null,this );
90
264
  const writable = fs.createWriteStream( _tmp );
@@ -103,11 +277,11 @@ class localDB {
103
277
  table: _table,
104
278
  }); });
105
279
 
106
- } catch(e) { reject(e); }
280
+ } catch(e) { rej(e); }
107
281
  }); }
108
282
 
109
283
  unshift( _table, ..._object ){
110
- return new Promise( (response,reject)=>{ try{
284
+ return new Promise( (res,rej)=>{ try{
111
285
 
112
286
  let { _i,_cfg,_itr,_res,_tmp,_path } = init( _table,null,this );
113
287
  const writable = fs.createWriteStream( _tmp );
@@ -128,11 +302,11 @@ class localDB {
128
302
  table: _table,
129
303
  }); });
130
304
 
131
- } catch(e) { reject(e) }
305
+ } catch(e) { rej(e) }
132
306
  }); }
133
307
 
134
308
  place( _table, _line, ..._object ){
135
- return new Promise( (response,reject)=>{ try{
309
+ return new Promise( (res,rej)=>{ try{
136
310
 
137
311
  let { _i,_cfg,_itr,_res,_tmp,_path } = init( _table,null,this );
138
312
  const writable = fs.createWriteStream( _tmp );
@@ -153,11 +327,11 @@ class localDB {
153
327
  table: _table,
154
328
  }); });
155
329
 
156
- } catch(e) { reject(e) }
330
+ } catch(e) { rej(e) }
157
331
  }); }
158
332
 
159
333
  update( _table, _hash, ..._object ){
160
- return new Promise( (response,reject)=>{ try{
334
+ return new Promise( (res,rej)=>{ try{
161
335
 
162
336
  let { _i,_cfg,_itr,_res,_tmp,_path } = init( _table,null,this );
163
337
  const writable = fs.createWriteStream( _tmp );
@@ -173,7 +347,7 @@ class localDB {
173
347
  });
174
348
  } else
175
349
  writable.write( `${encryptedLine}\n` );
176
- } catch(e) { reject(`the db can be decripted: ${e}`) }
350
+ } catch(e) { rej(`the db can be decripted: ${e}`) }
177
351
  });
178
352
 
179
353
  _itr.on( 'close',()=>{ writable.end(); });
@@ -182,12 +356,12 @@ class localDB {
182
356
  table: _table,
183
357
  }); });
184
358
 
185
- } catch(e) { reject(e) }
359
+ } catch(e) { rej(e) }
186
360
  }); }
187
361
 
188
362
  // TODO: Removing functions //
189
363
  remove( _table, _hash ){
190
- return new Promise( (response,reject)=>{ try{
364
+ return new Promise( (res,rej)=>{ try{
191
365
 
192
366
  let { _i,_cfg,_itr,_res,_tmp,_path } = init( _table,null,this );
193
367
  const writable = fs.createWriteStream( _tmp );
@@ -205,21 +379,21 @@ class localDB {
205
379
  table: _table,
206
380
  }); });
207
381
 
208
- } catch(e) { reject(e) }
382
+ } catch(e) { rej(e) }
209
383
  }); }
210
384
 
211
385
  removeTable( _table ){
212
- return new Promise( (response,reject)=>{
386
+ return new Promise( (res,rej)=>{
213
387
  const _path = `${this.path}/${_table}`;
214
388
  fs.unlink( _path,( err,data )=>{
215
- if(err) reject( err );
389
+ if(err) rej( err );
216
390
  res({ table: _table });
217
391
  });
218
392
  })
219
393
  }
220
394
 
221
395
  shift( _table ){
222
- return new Promise( (response,reject)=>{ try{
396
+ return new Promise( (res,rej)=>{ try{
223
397
 
224
398
  let { _i,_cfg,_itr,_res,_tmp,_path } = init( _table,null,this );
225
399
  const writable = fs.createWriteStream( _tmp );
@@ -232,10 +406,10 @@ class localDB {
232
406
  table: _table,
233
407
  }); });
234
408
 
235
- } catch(e) { reject(e) }
409
+ } catch(e) { rej(e) }
236
410
  }); }
237
411
 
238
412
  }
239
413
 
240
414
  //TODO: localDB Class ----------------------------------------------------------------------------//
241
- module.exports = localDB;
415
+ module.exports = localDB;
@@ -1,77 +1,197 @@
1
- const readline = require('./readline');
2
- const fetch = require('axios');
1
+
2
+ const readline = require('readline');
3
+ const crypto = require('crypto-js');
4
+ const axios = require('axios');
3
5
  const fs = require('fs');
4
6
 
5
- //TODO: Optimization FUnctions -------------------------------------------------------------------//
7
+ //TODO: Function ---------------------------------------------------------------------------------//
8
+ function slugify(str) {
9
+ const map = {
10
+ 'o' : 'ó|ò|ô|õ|ö|Ó|Ò|Ô|Õ|Ö',
11
+ 'a' : 'á|à|ã|â|ä|À|Á|Ã|Â|Ä',
12
+ 'e' : 'é|è|ê|ë|É|È|Ê|Ë',
13
+ 'i' : 'í|ì|î|ï|Í|Ì|Î|Ï',
14
+ 'u' : 'ú|ù|û|ü|Ú|Ù|Û|Ü',
15
+ 'c' : 'ç|Ç','n':'ñ|Ñ',
16
+ '' : /\s+|\W+/,
17
+ };
18
+ for (var pattern in map) {
19
+ str=str.replace( new RegExp(map[pattern],'gi' ), pattern);
20
+ } return str.toLowerCase();
21
+ }
6
22
 
7
- const _default = { offset: 0, length: 100 };
23
+ const JsonFormatter = {
24
+ 'stringify': function(cipherParams) {
25
+ var jsonObj = { ct: cipherParams.ciphertext.toString(crypto.enc.Base64) };
26
+ if (cipherParams.salt) jsonObj.s = cipherParams.salt.toString();
27
+ if (cipherParams.iv) jsonObj.iv = cipherParams.iv.toString();
28
+ return new Buffer(JSON.stringify(jsonObj)).toString('base64');
29
+ },
30
+
31
+ 'parse': function(jsonStr) {
32
+ var jsonObj = JSON.parse( new Buffer(jsonStr,'base64').toString('UTF-8'));
33
+ var cipherParams = crypto.lib.CipherParams.create({
34
+ ciphertext: crypto.enc.Base64.parse(jsonObj.ct)
35
+ });
36
+ if (jsonObj.iv) cipherParams.iv = crypto.enc.Hex.parse(jsonObj.iv);
37
+ if (jsonObj.s) cipherParams.salt = crypto.enc.Hex.parse(jsonObj.s);
38
+ return cipherParams;
39
+ }
40
+ };
41
+
42
+ //TODO: Optimization FUnctions -------------------------------------------------------------------//
8
43
 
9
44
  const init = function( _table,_config,_self ){
10
- return new Promise( (response,reject)=>{
11
- const path = `${_self.path}/${_table}.json`;
12
- fetch.get(path,{responseType:'stream'}).then(({data})=>{
13
- response({
14
- _cfg: config(_config),
15
- _path: null,
16
- _tmp: null,
17
- _tbl: data,
45
+ return new Promise( (res,rej)=>{
46
+ axios.get(`${_self.path}/${_table}.json`,{responseType:'stream'})
47
+ .then( ({data})=>{
48
+ res({
49
+ _itr: readline.createInterface({ input: data }),
50
+ _cfg: !_config ? _self.default : _config,
51
+ _res: new Array(),
52
+ _i: 0,
18
53
  });
19
- });
54
+ }) .catch( e=>rej() );
20
55
  });
21
56
  };
22
57
 
23
- function config(_config){
24
- if( !_config ) return _default;
25
- Object.keys(_config).map((x)=>{
26
- _default[x] = _config[x];
27
- }); return _default;
58
+ const lineConstrain = function( _i,_config ){
59
+ if( _i >= parseInt(_config.length)+parseInt(_config.offset) ) return 1;
60
+ else if ( _i < parseInt(_config.offset) ) return -1
61
+ else return 0;
28
62
  }
29
63
 
30
64
  //TODO: localDB Class ----------------------------------------------------------------------------//
31
65
 
32
66
  class streamDB{
33
67
 
34
- constructor( _object ){
35
- if( _object.pass ){
36
- this.password = _object.pass;
37
- } this.path = _object.path;
68
+ encrypted = false
69
+ events = new Object()
70
+ default = { offset: 0, length: 100 }
71
+
72
+ constructor( object ){
73
+ if( object.pass ){
74
+ this.password = object.pass;
75
+ this.encrypted = true;
76
+ } this.path = object.path;
38
77
  }
39
78
 
40
- // TODO: Searching functions --------------------------------------------------- //
41
- list( _table, _config ){
42
- return new Promise( async(response,reject)=>{ try{
43
- const { _cfg,_tbl,_tmp,_path } = await init( _table,_config,this );
44
- let data = await readline.list( this,_tbl,_cfg );
45
- data = data.map(x=>{ return JSON.parse(x) });
46
- response({ data:data, table:_table });
47
- } catch(e) { reject(e); }});
79
+ decrypt( _message,_password=this.password,_encrypted=this.encrypted ){
80
+ try{
81
+ if( _encrypted )
82
+ return crypto.AES.decrypt( _message,_password,{
83
+ format: JsonFormatter
84
+ }).toString( crypto.enc.Utf8 );
85
+ return _message;
86
+ } catch(e) {
87
+ return _message;
88
+ }
48
89
  }
49
90
 
91
+ // TODO: Searching functions //
92
+ list( _table, _config ){
93
+ return new Promise( async(res,rej)=>{ try{
94
+
95
+ let { _i,_cfg,_itr,_res } = await init( _table,_config,this );
96
+
97
+ _itr.on( 'line',( encryptedLine )=>{ try{
98
+ const line = this.decrypt( encryptedLine );
99
+ const cns = lineConstrain( _i, _cfg );
100
+ if( cns == 0 ) { _res.push( JSON.parse( line ) );
101
+ } else if( cns == 1 ) _itr.close();
102
+ } catch(e) { rej(`the db can be decripted: ${e}`) }
103
+ _i++; });
104
+
105
+ _itr.on( 'close',()=>{ res({
106
+ table:_table,
107
+ data:_res,
108
+ }); });
109
+
110
+ } catch(e) { rej( e ); } });
111
+ }
112
+
50
113
  find( _table, _target, _config ){
51
- return new Promise( async(response,reject)=>{ try{
52
- const { _cfg,_tbl,_tmp,_path } = await init( _table,_config,this );
53
- let data = await readline.find( this,_tbl,_target,_cfg );
54
- data = data.map(x=>{ return JSON.parse(x) });
55
- response({ data:data, table:_table });
56
- } catch(e) { reject(e); }});
114
+ return new Promise( async(res,rej)=>{ try{
115
+
116
+ let { _i,_cfg,_itr,_res } = await init( _table,_config,this );
117
+
118
+ _itr.on( 'line',( encryptedLine )=>{
119
+ try{
120
+ const line = this.decrypt( encryptedLine );
121
+ const keys = Object.keys( _target );
122
+ const data = JSON.parse( line );
123
+
124
+ const regex = ( x )=>{
125
+ const target = slugify(_target[x].toString());
126
+ const info = slugify(data[x].toString());
127
+ const regex = new RegExp(target,'gi');
128
+ return regex.test(info);
129
+ }
130
+
131
+ const every = keys.every( (x)=>{return regex(x)} );
132
+
133
+ if( every ){
134
+ const cns = lineConstrain( _i, _cfg );
135
+ if( cns == 0 ) _res.push( data );
136
+ else if( cns == 1 ) _itr.close();
137
+ _i++;}
138
+
139
+ } catch(e) { rej(`the db can be decripted: ${e}`) }
140
+ });
141
+
142
+ _itr.on( 'close',()=>{ res({
143
+ table:_table,
144
+ data:_res,
145
+ }); });
146
+
147
+ } catch(e) { rej( e ); } });
57
148
  }
58
149
 
59
150
  match( _table,_match,_config ){
60
- return new Promise( async(response,reject)=>{ try{
61
- const { _cfg,_tbl,_tmp,_path } = await init( _table,_config,this );
62
- let data = await readline.match( this,_tbl,_match,_cfg );
63
- data = data.map(x=>{ return JSON.parse(x) });
64
- response({ data:data, table:_table });
65
- } catch(e) { reject(e); }});
151
+ return new Promise( async(res,rej)=>{ try{
152
+
153
+ let { _i,_cfg,_itr,_res } = await init( _table,_config,this );
154
+
155
+ _itr.on( 'line',( encryptedLine )=>{ try{
156
+ const regex = new RegExp(slugify(_match),'gi');
157
+ const line = this.decrypt( encryptedLine );
158
+ if( regex.test(slugify(line)) ){
159
+ const cns = lineConstrain( _i, _cfg );
160
+ if( cns == 0 ) _res.push( JSON.parse( line ) );
161
+ else if( cns == 1 ) _itr.close();
162
+ _i++;}
163
+ } catch(e) { rej(`the db can be decripted: ${e}`) }
164
+ });
165
+
166
+ _itr.on( 'close',()=>{ res({
167
+ table:_table,
168
+ data:_res,
169
+ }); });
170
+
171
+ } catch(e) { rej( e ); } });
66
172
  }
67
173
 
68
174
  hash( _table, _hash ){
69
- return new Promise( async(response,reject)=>{ try{
70
- const { _cfg,_tbl,_tmp,_path } = await init( _table,null,this );
71
- let data = await readline.hash( this,_tbl,_hash );
72
- data = data.map(x=>{ return JSON.parse(x) });
73
- response({ data:data, table:_table });
74
- } catch(e) { reject(e); }});
175
+ return new Promise( async(res,rej)=>{ try{
176
+
177
+ let { _i,_cfg,_itr,_res } = await init( _table,null,this );
178
+
179
+ _itr.on( 'line',( encryptedLine )=>{ try{
180
+ const line = this.decrypt( encryptedLine );
181
+ const data = JSON.parse( line );
182
+ if( data.hash == _hash ){
183
+ _res.push( data );
184
+ _itr.close();
185
+ }
186
+ } catch(e) { rej(`the db can be decripted: ${e}`) }
187
+ });
188
+
189
+ _itr.on( 'close',()=>{ res({
190
+ table:_table,
191
+ data:_res,
192
+ }); });
193
+
194
+ } catch(e) { rej( e ); } });
75
195
  }
76
196
 
77
197
  }
@@ -0,0 +1,377 @@
1
+ const crypto = require('crypto-js');
2
+
3
+ //TODO: Function ---------------------------------------------------------------------------------//
4
+
5
+ const store = {
6
+ set: function(key,data){ localStorage.setItem(key,data); },
7
+ key: function(index){ return localStorage.key(index); },
8
+ get: function(key){ return localStorage.getItem(key); },
9
+ clear: function(){ localStorage.clear(); },
10
+ length: localStorage.length,
11
+ }
12
+
13
+ function slugify(str) {
14
+ const map = {
15
+ 'o' : 'ó|ò|ô|õ|ö|Ó|Ò|Ô|Õ|Ö',
16
+ 'a' : 'á|à|ã|â|ä|À|Á|Ã|Â|Ä',
17
+ 'e' : 'é|è|ê|ë|É|È|Ê|Ë',
18
+ 'i' : 'í|ì|î|ï|Í|Ì|Î|Ï',
19
+ 'u' : 'ú|ù|û|ü|Ú|Ù|Û|Ü',
20
+ 'c' : 'ç|Ç','n':'ñ|Ñ',
21
+ '' : /\s+|\W+/,
22
+ };
23
+ for (var pattern in map) {
24
+ str=str.replace( new RegExp(map[pattern],'gi' ), pattern);
25
+ } return str.toLowerCase();
26
+ }
27
+
28
+ //TODO: Function ---------------------------------------------------------------------------------//
29
+
30
+ const JsonFormatter = {
31
+ 'stringify': function(cipherParams) {
32
+ var jsonObj = { ct: cipherParams.ciphertext.toString(crypto.enc.Base64) };
33
+ if (cipherParams.salt) jsonObj.s = cipherParams.salt.toString();
34
+ if (cipherParams.iv) jsonObj.iv = cipherParams.iv.toString();
35
+ return btoa( JSON.stringify(jsonObj) );
36
+ },
37
+
38
+ 'parse': function(jsonStr) {
39
+ var jsonObj = JSON.parse( atob(jsonStr) );
40
+ var cipherParams = crypto.lib.CipherParams.create({
41
+ ciphertext: crypto.enc.Base64.parse(jsonObj.ct)
42
+ });
43
+ if (jsonObj.iv) cipherParams.iv = crypto.enc.Hex.parse(jsonObj.iv);
44
+ if (jsonObj.s) cipherParams.salt = crypto.enc.Hex.parse(jsonObj.s);
45
+ return cipherParams;
46
+ }
47
+ };
48
+
49
+ //TODO: Function ---------------------------------------------------------------------------------//
50
+
51
+ const init = function( _table,_config,_self ){
52
+ return {
53
+ _cfg: !_config ? _self.default : _config,
54
+ _itr: _createNewTable_( _table ),
55
+ _res: new Array(),
56
+ _i: 0,
57
+ }
58
+ };
59
+
60
+ const _lineConstrain_ = function( _i,_config ){
61
+ if( _i >= parseInt(_config.length)+parseInt(_config.offset) ) return 1;
62
+ else if ( _i < parseInt(_config.offset) ) return -1
63
+ else return 0;
64
+ }
65
+
66
+ const _createNewTable_ = function( _path ){
67
+ const content = store.get( _path )
68
+ if( content == null ) return new Array();
69
+ return content.split('\n');
70
+ }
71
+
72
+ const _createNewHash_ = function( _object ){
73
+ _object['_stamp'] = Date.now();
74
+ const _base = JSON.stringify( _object );
75
+ if( !_object.hash )
76
+ _object.hash = crypto.SHA256( _base ).toString();
77
+ return _object;
78
+ }
79
+
80
+
81
+ //TODO: localDB Class ----------------------------------------------------------------------------//
82
+
83
+ class createWebDB{
84
+
85
+ constructor( _password ){
86
+ this.encrypted = false
87
+ this.events = new Object()
88
+ this.default = { offset: 0, length: 100 }
89
+ if( !crypto ) return console.log(' please import libs.crypto ');
90
+ if( _password ){
91
+ this.password = _password;
92
+ this.encrypted = true;
93
+ }
94
+ }
95
+
96
+ //TODO: clear all LocalStorage //
97
+ removeTable( _table ){
98
+ store.set( _table, null );
99
+ delete localStorage[ _table ];
100
+ }
101
+
102
+ //TODO: clear all LocalStorage //
103
+ removeTable( _table ){
104
+ store.set( _table, null );
105
+ delete localStorage[ _table ];
106
+ }
107
+
108
+ clearDB(){ store.clear(); }
109
+
110
+ // TODO: Encription & Decription DATA //
111
+ encrypt( _message,_password=this.password,_encrypted=this.encrypted ){
112
+ try{
113
+ if( this.encrypted )
114
+ return crypto.AES.encrypt( _message,this.password,{
115
+ format: JsonFormatter
116
+ }).toString( crypto.enc.Utf8 );
117
+ return _message;
118
+ } catch(e) { return _message; }
119
+ }
120
+
121
+ decrypt( _message,_password=this.password,_encrypted=this.encrypted ){
122
+ try{
123
+ if( this.encrypted )
124
+ return crypto.AES.decrypt( _message,this.password,{
125
+ format: JsonFormatter
126
+ }).toString( crypto.enc.Utf8 );
127
+ return _message;
128
+ } catch(e) { return _message; }
129
+ }
130
+
131
+ // TODO: Searching functions //
132
+ list( _table, _config ){
133
+ return new Promise( (res,rej)=>{ try{
134
+
135
+ let { _i,_cfg,_itr,_res,_tmp,_path } = init( _table,_config,this );
136
+
137
+ _itr.every( ( encryptedLine )=>{ try{
138
+
139
+ const line = this.decrypt( encryptedLine );
140
+ const cns = _lineConstrain_( _i, _cfg );
141
+ const data = JSON.parse( line );
142
+
143
+ if( cns == 0 ) _res.push( data );
144
+ else if( cns == 1 ) return false;
145
+
146
+ } catch(e) { rej(`the db can be decripted ${e}`) }
147
+
148
+ _i++; return true; }); res({data:_res,table:_table});
149
+
150
+ } catch(e) { rej( e ); } });
151
+ }
152
+
153
+ find( _table, _target, _logic='AND', _config ){
154
+ return new Promise( (res,rej)=>{ try{
155
+
156
+ let { _i,_cfg,_itr,_res,_tmp,_path } = init( _table,_config,this );
157
+
158
+ _itr.every( ( encryptedLine )=>{ try{
159
+
160
+ const line = this.decrypt( encryptedLine );
161
+ const keys = Object.keys( _target );
162
+ const data = JSON.parse( line );
163
+
164
+ const regex = ( x )=>{
165
+ const target = slugify(_target[x].toString());
166
+ const data = slugify(data[x].toString());
167
+ const regex = new RegExp(target,'gi');
168
+ return regex.test(data);
169
+ }
170
+
171
+ const every = keys.every( (x)=>{return regex(x)} );
172
+ const some = keys.some( (x)=>{return regex(x)} );
173
+
174
+ if( ( (/AND/gi).test(_logic) && every ) || ( (/OR/gi).test(_logic) && some ) ){
175
+ const cns = _lineConstrain_(_i, _cfg );
176
+ if( cns == 0 ) _res.push( data );
177
+ else if( cns == 1 ) return false;
178
+ _i++;}
179
+
180
+ } catch(e) { rej(`the db can be decripted ${e}`) }
181
+
182
+ return true; }); res({data:_res,table:_table});
183
+
184
+ } catch(e) { rej( e ); } });
185
+ }
186
+
187
+ match( _table, _match, _config ){
188
+ return new Promise( (res,rej)=>{ try{
189
+
190
+ let { _i,_cfg,_itr,_res,_tmp,_path } = init( _table,_config,this );
191
+
192
+ _itr.every( ( encryptedLine )=>{ try{
193
+
194
+ const line = this.decrypt( encryptedLine );
195
+ if( slugify(line).search( slugify(_match) ) >= 0 ){
196
+ const cns = _lineConstrain_(_i, _cfg );
197
+ const data = JSON.parse( line );
198
+ if( cns == 0 ) _res.push( data );
199
+ else if( cns == 1 ) return false;
200
+ i++;}
201
+
202
+ } catch(e) { rej(`the db can be decripted ${e}`) }
203
+ return true; }); res({data:_res,table:_table});
204
+
205
+ } catch(e) { rej( e ); } });
206
+ }
207
+
208
+ findByHash( _table, _hash ){
209
+ return new Promise( (res,rej)=>{ try{
210
+
211
+ let { _i,_cfg,_itr,_res,_tmp,_path } = init( _table,null,this );
212
+
213
+ _itr.every( ( encryptedLine )=>{ try{
214
+
215
+ const line = this.decrypt( encryptedLine );
216
+ const data = JSON.parse( line );
217
+
218
+ if( data.hash == _hash ){
219
+ _res.push( data );
220
+ return false;
221
+ }
222
+
223
+ } catch(e) { rej(`the db can be decripted ${e}`) }
224
+ _i++; return true; }); res({data:_res,table:_table});
225
+
226
+ } catch(e) { rej( e ); } });
227
+ }
228
+
229
+ // TODO: Saving functions //
230
+ push( _table, ..._object ){
231
+ return new Promise( (res,rej)=>{ try{
232
+
233
+ let { _i,_cfg,_itr,_res,_tmp,_path } = init( _table,null,this );
234
+
235
+ _object.flat().forEach( item=>{
236
+ item = _createNewHash_( item );
237
+ const data = JSON.stringify(item);
238
+ _itr.push( this.encrypt( data ) );
239
+ }); store.set( _table,_itr.join('\n') ); res({table:_table});
240
+
241
+ } catch(e) { rej( e ); } });
242
+ }
243
+
244
+ unshift( _table, ..._object ){
245
+ return new Promise( (res,rej)=>{ try{
246
+
247
+ let { _i,_cfg,_itr,_res,_tmp,_path } = init( _table,null,this );
248
+
249
+ _object.flat().forEach( item=>{
250
+ item = _createNewHash_( item );
251
+ const data = JSON.stringify(item);
252
+ _itr.unshift( this.encrypt(data) );
253
+ }); store.set( _table,_itr.join('\n') ); res({table:_table});
254
+
255
+ } catch(e) { rej( e ); } });
256
+ }
257
+
258
+ place( _table, _line, ..._object ){
259
+ return new Promise( (res,rej)=>{ try{
260
+
261
+ let { _i,_cfg,_itr,_res,_tmp,_path } = init( _table,null,this );
262
+
263
+ _object.flat().forEach( item=>{
264
+ item = _createNewHash_( item );
265
+ const data = JSON.stringify(item);
266
+ _itr.splice( _line,0,this.encrypt(data) );
267
+ }); store.set( _table,_itr.join('\n') ); res({table:_table});
268
+
269
+ } catch(e) { rej( e ); } });
270
+ }
271
+
272
+ update( _table, _hash, ..._object ){
273
+ return new Promise( (res,rej)=>{ try{
274
+
275
+ let { _i,_cfg,_itr,_res,_tmp,_path } = init( _table,null,this );
276
+
277
+ _itr.every( ( encryptedLine )=>{ try{
278
+
279
+ const line = this.decrypt( encryptedLine );
280
+ const data = JSON.parse( line );
281
+
282
+ if( data.hash == _hash ){
283
+
284
+ _object.flat().forEach( item=>{
285
+ item = _createNewHash_( item );
286
+ const data = JSON.stringify(item);
287
+ _itr.splice( _i,1,this.encrypt(data) );
288
+ }); return false;
289
+ }
290
+
291
+ _i++;} catch(e) { rej(`the db can be decripted ${e}`) }
292
+ return true; }); store.set( _table,_itr.join('\n') ); res({table:_table});
293
+
294
+ } catch(e) { rej( e ); } });
295
+ }
296
+
297
+ // TODO: Removing functions //
298
+ remove( _table, _hash ){
299
+ return new Promise( (res,rej)=>{ try{
300
+
301
+ let { _i,_cfg,_itr,_res,_tmp,_path } = init( _table,null,this );
302
+
303
+ _itr.every( ( encryptedLine )=>{ try{
304
+
305
+ const line = this.decrypt( encryptedLine );
306
+ const data = JSON.parse( line );
307
+
308
+ if( data.hash == _hash ){
309
+ _object = _createNewHash_( _object );
310
+ _itr.splice( _i,0 );
311
+ return false;
312
+ }
313
+
314
+ _i++;} catch(e) { rej(`the db can be decripted ${e}`) }
315
+ return true; }); store.set( _table,_itr.join('\n') ); res({table:_table});
316
+
317
+ } catch(e) { rej( e ); } });
318
+ }
319
+
320
+ shif( _table ){
321
+ return new Promise( (res,rej)=>{ try{
322
+ const _itr = _createNewTable_( _table );
323
+ _itr.shif(); store.set( _table,_itr.join('\n') ); res({table:_table});
324
+ } catch(e) { rej( e ); } });
325
+ }
326
+
327
+ pop( _table ){
328
+ return new Promise( (res,rej)=>{ try{
329
+ const _itr = _createNewTable_( _table );
330
+ _itr.pop(); store.set( _table,_itr.join('\n') ); res({table:_table});
331
+ } catch(e) { rej( e ); } });
332
+ }
333
+
334
+ // TODO: Saving functions //
335
+ encryptTable( _table,_password ){
336
+ return new Promise( (res,rej)=>{ try{
337
+
338
+ let { _i,_cfg,_itr,_res,_tmp,_path } = init( _table,null,this );
339
+ const writable = fs.createWriteStream( _tmp );
340
+ let db = new String();
341
+
342
+ _itr.every( ( encryptedLine )=>{
343
+ try{
344
+ const line = this.decrypt( encryptedLine );
345
+ const encryptedData = this.encrypt( line,_password,true );
346
+ db += `${encryptedData}\n`;
347
+ } catch(e) { rej(`the db can be decripted ${e}`) }
348
+ });
349
+
350
+ store.set(_table,db); res({ table:_table });
351
+
352
+ } catch(e) { rej( e ); } });
353
+ }
354
+
355
+ decryptTable( _table ){
356
+ return new Promise( (res,rej)=>{ try{
357
+
358
+ let { _i,_cfg,_itr,_res,_tmp,_path } = init( _table,null,this );
359
+ const writable = fs.createWriteStream( _tmp );
360
+ let db = new String();
361
+
362
+ _itr.on( 'line',( encryptedLine )=>{
363
+ try{
364
+ const line = this.decrypt( encryptedLine );
365
+ db += `${line}\n`;
366
+ } catch(e) { rej(`the db can be decripted: ${e}`) }
367
+ });
368
+
369
+ store.set(_table,db); res({ table:_table });
370
+
371
+ } catch(e) { rej( e ); } });
372
+ }
373
+
374
+ }
375
+
376
+ // TODO: export --------------------------------------------------------------------------------------//
377
+ module.exports = createWebDB;
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "license": "MIT",
3
3
  "main": "main.js",
4
- "version": "1.0.3",
4
+ "version": "1.0.4",
5
5
  "name": "molly-db",
6
6
  "author": "bececrazy",
7
7
  "scripts": { "start": "node main" },