ueberdb2 4.0.10 → 4.0.15

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.
Files changed (47) hide show
  1. package/.eslintignore +2 -0
  2. package/.eslintrc.cjs +44 -5
  3. package/databases/{cassandra_db.js → cassandra_db.ts} +45 -30
  4. package/databases/{couch_db.js → couch_db.ts} +78 -31
  5. package/databases/{dirty_db.js → dirty_db.ts} +19 -14
  6. package/databases/{dirty_git_db.js → dirty_git_db.ts} +19 -15
  7. package/databases/{elasticsearch_db.js → elasticsearch_db.ts} +30 -21
  8. package/databases/{memory_db.js → memory_db.ts} +8 -8
  9. package/databases/mock_db.ts +43 -0
  10. package/databases/{mongodb_db.js → mongodb_db.ts} +22 -16
  11. package/databases/{mssql_db.js → mssql_db.ts} +29 -21
  12. package/databases/{mysql_db.js → mysql_db.ts} +20 -15
  13. package/databases/{postgres_db.js → postgres_db.ts} +37 -22
  14. package/databases/{postgrespool_db.js → postgrespool_db.ts} +3 -3
  15. package/databases/redis_db.ts +129 -0
  16. package/databases/{rethink_db.js → rethink_db.ts} +35 -19
  17. package/databases/{sqlite_db.js → sqlite_db.ts} +37 -36
  18. package/docker-compose.yml +44 -0
  19. package/{index.js → index.ts} +76 -25
  20. package/lib/AbstractDatabase.ts +79 -0
  21. package/lib/{CacheAndBufferLayer.js → CacheAndBufferLayer.ts} +17 -16
  22. package/lib/{logging.js → logging.ts} +10 -6
  23. package/package.json +17 -3
  24. package/test/lib/{databases.js → databases.ts} +8 -5
  25. package/test/test.ts +328 -0
  26. package/test/test_bulk.ts +69 -0
  27. package/test/{test_elasticsearch.js → test_elasticsearch.ts} +48 -53
  28. package/test/{test_findKeys.js → test_findKeys.ts} +15 -17
  29. package/test/{test_flush.js → test_flush.ts} +16 -22
  30. package/test/test_getSub.ts +28 -0
  31. package/test/test_lru.ts +151 -0
  32. package/test/test_memory.ts +32 -0
  33. package/test/{test_metrics.js → test_metrics.ts} +73 -68
  34. package/test/{test_mysql.js → test_mysql.ts} +16 -22
  35. package/test/test_postgres.ts +16 -0
  36. package/test/{test_setSub.js → test_setSub.ts} +8 -12
  37. package/test/test_tojson.ts +34 -0
  38. package/databases/mock_db.js +0 -42
  39. package/databases/redis_db.js +0 -96
  40. package/lib/AbstractDatabase.js +0 -37
  41. package/test/test.js +0 -328
  42. package/test/test_bulk.js +0 -69
  43. package/test/test_getSub.js +0 -31
  44. package/test/test_lru.js +0 -145
  45. package/test/test_memory.js +0 -31
  46. package/test/test_postgres.js +0 -16
  47. package/test/test_tojson.js +0 -37
package/test/test_bulk.js DELETED
@@ -1,69 +0,0 @@
1
- 'use strict';
2
-
3
- const assert = require('assert').strict;
4
- const ueberdb = require('../index');
5
- const util = require('util');
6
-
7
- const range = (N) => [...Array(N).keys()];
8
-
9
- describe(__filename, function () {
10
- let db = null;
11
- let mock = null;
12
- const createDb = async (wrapperSettings) => {
13
- const settings = {};
14
- db = new ueberdb.Database('mock', settings, wrapperSettings);
15
- mock = settings.mock;
16
- mock.once('init', (cb) => cb());
17
- await db.init();
18
- };
19
-
20
- afterEach(async function () {
21
- if (mock != null) {
22
- mock.removeAllListeners();
23
- mock.once('close', (cb) => cb());
24
- mock = null;
25
- }
26
- if (db != null) {
27
- await db.close();
28
- db = null;
29
- }
30
- });
31
-
32
- describe('bulkLimit', function () {
33
- const bulkLimits = [0, false, null, undefined, '', 1, 2];
34
- for (const bulkLimit of bulkLimits) {
35
- it(bulkLimit === undefined ? 'undefined' : JSON.stringify(bulkLimit), async function () {
36
- await createDb({bulkLimit});
37
- const gotWrites = [];
38
- mock.on('set', util.callbackify(async (k, v) => gotWrites.push(1)));
39
- mock.on('doBulk', util.callbackify(async (ops) => gotWrites.push(ops.length)));
40
- const N = 10;
41
- await Promise.all(range(N).map((i) => db.set(`key${i}`, `val${i}`)));
42
- const wantLimit = bulkLimit || N;
43
- const wantWrites = range(N / wantLimit).map((i) => wantLimit);
44
- assert.deepEqual(gotWrites, wantWrites);
45
- });
46
- }
47
- });
48
-
49
- it('bulk failures are retried individually', async function () {
50
- await createDb({});
51
- const gotDoBulkCalls = [];
52
- mock.on('doBulk', util.callbackify(async (ops) => {
53
- gotDoBulkCalls.push(ops.length);
54
- throw new Error('test');
55
- }));
56
- const gotWrites = new Map();
57
- const wantWrites = new Map();
58
- mock.on('set', util.callbackify(async (k, v) => gotWrites.set(k, v)));
59
- const N = 10;
60
- await Promise.all(range(N).map(async (i) => {
61
- const k = `key${i}`;
62
- const v = `val${i}`;
63
- wantWrites.set(k, JSON.stringify(v));
64
- await db.set(k, v);
65
- }));
66
- assert.deepEqual(gotDoBulkCalls, [N]);
67
- assert.deepEqual(gotWrites, wantWrites);
68
- });
69
- });
@@ -1,31 +0,0 @@
1
- 'use strict';
2
-
3
- const assert = require('assert').strict;
4
- const ueberdb = require('../index');
5
-
6
- describe(__filename, function () {
7
- let db;
8
-
9
- beforeEach(async function () {
10
- db = new ueberdb.Database('memory', {}, {});
11
- await db.init();
12
- await db.set('k', {s: 'v'});
13
- });
14
-
15
- afterEach(async function () {
16
- if (db != null) await db.close();
17
- db = null;
18
- });
19
-
20
- it('getSub stops at non-objects', async function () {
21
- assert(await db.getSub('k', ['s', 'length']) == null);
22
- });
23
-
24
- it('getSub ignores non-own properties', async function () {
25
- assert(await db.getSub('k', ['toString']) == null);
26
- });
27
-
28
- it('getSub ignores __proto__', async function () {
29
- assert(await db.getSub('k', ['__proto__']) == null);
30
- });
31
- });
package/test/test_lru.js DELETED
@@ -1,145 +0,0 @@
1
- 'use strict';
2
-
3
- const LRU = require('../lib/CacheAndBufferLayer').exportedForTesting.LRU;
4
- const assert = require('assert').strict;
5
-
6
- describe(__filename, function () {
7
- describe('capacity = 0', function () {
8
- it('constructor does not throw', async function () {
9
- new LRU(0);
10
- });
11
-
12
- describe('behavior when empty', function () {
13
- it('get() returns nullish', async function () {
14
- assert((new LRU(0)).get('k') == null);
15
- });
16
-
17
- it('empty iteration', async function () {
18
- assert.equal([...(new LRU(0))].length, 0);
19
- });
20
-
21
- it('evictOld() does not throw', async function () {
22
- (new LRU(0)).evictOld();
23
- });
24
- });
25
-
26
- describe('single entry with evictable = false', function () {
27
- let evictable, lru, key, val;
28
-
29
- beforeEach(async function () {
30
- evictable = false;
31
- lru = new LRU(0, () => evictable);
32
- key = 'k';
33
- val = 'v';
34
- lru.set(key, val);
35
- });
36
-
37
- it('get() works', async function () {
38
- assert.equal(lru.get(key), val);
39
- });
40
-
41
- it('iterate works', async function () {
42
- assert.deepEqual([...lru], [[key, val]]);
43
- });
44
-
45
- it('re-set() works', async function () {
46
- const val2 = 'v2';
47
- lru.set(key, val2);
48
- assert.equal(lru.get(key), val2);
49
- assert.deepEqual([...lru], [[key, val2]]);
50
- });
51
-
52
- it('evictOld() does not evict', async function () {
53
- lru.evictOld();
54
- assert.deepEqual([...lru], [[key, val]]);
55
- });
56
-
57
- it('evictOld() evicts after setting evictable = true', async function () {
58
- evictable = true;
59
- lru.evictOld();
60
- assert.deepEqual([...lru], []);
61
- });
62
- });
63
-
64
- describe('set immediately evicts if evictable', function () {
65
- it('explicitly evictable', async function () {
66
- const lru = new LRU(0, () => true);
67
- lru.set('k', 'v');
68
- assert(lru.get('k') == null);
69
- assert.deepEqual([...lru], []);
70
- });
71
-
72
- it('is evictable by default', async function () {
73
- const lru = new LRU(0);
74
- lru.set('k', 'v');
75
- assert(lru.get('k') == null);
76
- assert.deepEqual([...lru], []);
77
- });
78
- });
79
- });
80
-
81
- describe('capacity = 2', function () {
82
- let evictable, lru;
83
-
84
- beforeEach(async function () {
85
- evictable = () => false;
86
- lru = new LRU(2, (k, v) => evictable(k, v));
87
- });
88
-
89
- it('iterates oldest first', async function () {
90
- lru.set(0, '0');
91
- lru.set(1, '1');
92
- let i = 0;
93
- for (const [k, v] of lru) {
94
- assert.equal(k, i);
95
- assert.equal(v, `${i}`);
96
- i++;
97
- }
98
- assert.equal(i, 2);
99
- });
100
-
101
- it('get(k) updates recently used', async function () {
102
- lru.set(0, '0');
103
- lru.set(1, '1');
104
- assert.equal(lru.get(0), '0');
105
- assert.deepEqual([...lru], [[1, '1'], [0, '0']]);
106
- });
107
-
108
- it('get(k, false) does not update recently used', async function () {
109
- lru.set(0, '0');
110
- lru.set(1, '1');
111
- assert.equal(lru.get(0, false), '0');
112
- assert.deepEqual([...lru], [[0, '0'], [1, '1']]);
113
- });
114
-
115
- it('re-set() updates recently used', async function () {
116
- lru.set(0, '0');
117
- lru.set(1, '1');
118
- lru.set(0, '00');
119
- assert.deepEqual([...lru], [[1, '1'], [0, '00']]);
120
- });
121
-
122
- it('evictOld() only evicts evictable entries', async function () {
123
- evictable = () => false;
124
- lru.set(0, '0');
125
- lru.set(1, '1');
126
- lru.set(2, '2');
127
- lru.set(3, '3');
128
- assert.deepEqual([...lru], [[0, '0'], [1, '1'], [2, '2'], [3, '3']]);
129
- evictable = (k) => k >= 2;
130
- lru.evictOld();
131
- // The newer entries should be evicted because the older are dirty/writingInProgress.
132
- assert.deepEqual([...lru], [[0, '0'], [1, '1']]);
133
- });
134
-
135
- it('evictOld() does nothing if at or below capacity', async function () {
136
- evictable = () => true;
137
- lru.set(0, '0');
138
- lru.evictOld();
139
- assert.deepEqual([...lru], [[0, '0']]);
140
- lru.set(1, '1');
141
- lru.evictOld();
142
- assert.deepEqual([...lru], [[0, '0'], [1, '1']]);
143
- });
144
- });
145
- });
@@ -1,31 +0,0 @@
1
- 'use strict';
2
-
3
- const assert = require('assert').strict;
4
- const memory = require('../databases/memory_db');
5
-
6
- describe(__filename, function () {
7
- describe('data option', function () {
8
- it('uses existing records from data option', async function () {
9
- const db = new memory.Database({data: new Map([['foo', 'bar']])});
10
- await db.init();
11
- assert.equal(await db.get('foo'), 'bar');
12
- });
13
-
14
- it('updates existing map', async function () {
15
- const data = new Map();
16
- const db = new memory.Database({data});
17
- await db.init();
18
- await db.set('foo', 'bar');
19
- assert.equal(data.get('foo'), 'bar');
20
- });
21
-
22
- it('does not clear map on close', async function () {
23
- const data = new Map();
24
- const db = new memory.Database({data});
25
- await db.init();
26
- await db.set('foo', 'bar');
27
- await db.close();
28
- assert.equal(data.get('foo'), 'bar');
29
- });
30
- });
31
- });
@@ -1,16 +0,0 @@
1
- 'use strict';
2
-
3
- const assert = require('assert').strict;
4
- const {databases} = require('./lib/databases');
5
- const ueberdb = require('../index');
6
-
7
- describe(__filename, function () {
8
- it('connection string instead of settings object', async function () {
9
- const {user, password, host, database} = databases.postgres;
10
- const db =
11
- new ueberdb.Database('postgres', `postgres://${user}:${password}@${host}/${database}`);
12
- await db.init();
13
- await db.set('key', 'val');
14
- assert.equal(await db.get('key'), 'val');
15
- });
16
- });
@@ -1,37 +0,0 @@
1
- 'use strict';
2
-
3
- const assert = require('assert').strict;
4
- const ueberdb = require('../index');
5
-
6
- describe(__filename, function () {
7
- let db = null;
8
-
9
- before(async function () {
10
- db = new ueberdb.Database('memory', {}, {});
11
- await db.init();
12
- });
13
-
14
- after(async function () {
15
- await db.close();
16
- });
17
-
18
- it('no .toJSON method', async function () {
19
- await db.set('key', {prop: 'value'});
20
- assert.deepEqual(await db.get('key'), {prop: 'value'});
21
- });
22
-
23
- it('direct', async function () {
24
- await db.set('key', {toJSON: (arg) => `toJSON ${arg}`});
25
- assert.equal(await db.get('key'), 'toJSON ');
26
- });
27
-
28
- it('object property', async function () {
29
- await db.set('key', {prop: {toJSON: (arg) => `toJSON ${arg}`}});
30
- assert.deepEqual(await db.get('key'), {prop: 'toJSON prop'});
31
- });
32
-
33
- it('array entry', async function () {
34
- await db.set('key', [{toJSON: (arg) => `toJSON ${arg}`}]);
35
- assert.deepEqual(await db.get('key'), ['toJSON 0']);
36
- });
37
- });