oblivious-set
Advanced tools
@@ -6,9 +6,9 @@ name: CI | ||
| build: | ||
| runs-on: ubuntu-latest | ||
| runs-on: ubuntu-22.04 | ||
| steps: | ||
| - uses: actions/checkout@v2 | ||
| - name: Use Node.js 12.11.0 | ||
| - name: Set Node Version | ||
| uses: actions/setup-node@v2 | ||
| with: | ||
| node-version: 12.11.0 | ||
| node-version: 22.21.0 | ||
| - run: npm install | ||
@@ -15,0 +15,0 @@ - run: npm run lint |
@@ -21,5 +21,14 @@ "use strict"; | ||
| has(value) { | ||
| return this.map.has(value); | ||
| const valueTime = this.map.get(value); | ||
| if (typeof valueTime === 'undefined') { | ||
| return false; | ||
| } | ||
| if (valueTime < now() - this.ttl) { | ||
| this.map.delete(value); | ||
| return false; | ||
| } | ||
| return true; | ||
| } | ||
| add(value) { | ||
| this.map.delete(value); | ||
| this.map.set(value, now()); | ||
@@ -59,3 +68,3 @@ /** | ||
| if (!next) { | ||
| return; // no more elements | ||
| break; // no more elements | ||
| } | ||
@@ -69,3 +78,3 @@ const value = next[0]; | ||
| // We reached a value that is not old enough | ||
| return; | ||
| break; | ||
| } | ||
@@ -72,0 +81,0 @@ } |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/index.ts"],"names":[],"mappings":";;;AACA;;;;GAIG;AACH,MAAa,YAAY;IASD;IARJ,GAAG,GAAG,IAAI,GAAG,EAAE,CAAC;IAEhC;;;OAGG;IACI,GAAG,GAAY,KAAK,CAAC;IAC5B,YACoB,GAAW;QAAX,QAAG,GAAH,GAAG,CAAQ;IAC3B,CAAC;IAEL,GAAG,CAAC,KAAQ;QACR,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IAC/B,CAAC;IAED,GAAG,CAAC,KAAQ;QACR,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC;QAE3B;;;;;WAKG;QACH,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE;YACX,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC;YAChB,UAAU,CAAC,GAAG,EAAE;gBACZ,IAAI,CAAC,GAAG,GAAG,KAAK,CAAC;gBACjB,kBAAkB,CAAC,IAAI,CAAC,CAAC;YAC7B,CAAC,EAAE,CAAC,CAAC,CAAC;SACT;IACL,CAAC;IAED,KAAK;QACD,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC;IACrB,CAAC;CACJ;AArCD,oCAqCC;AAGD;;;GAGG;AACH,SAAgB,kBAAkB,CAC9B,YAA0B;IAE1B,MAAM,SAAS,GAAG,GAAG,EAAE,GAAG,YAAY,CAAC,GAAG,CAAC;IAC3C,MAAM,QAAQ,GAAG,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC;IAErD;;;OAGG;IACH,OAAO,IAAI,EAAE;QAET,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC;QAEnC,IAAI,CAAC,IAAI,EAAE;YACP,OAAO,CAAC,mBAAmB;SAC9B;QACD,MAAM,KAAK,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QACtB,MAAM,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QACrB,IAAI,IAAI,GAAG,SAAS,EAAE;YAClB,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;SAClC;aAAM;YACH,4CAA4C;YAC5C,OAAO;SACV;KACJ;AACL,CAAC;AA1BD,gDA0BC;AAED,SAAgB,GAAG;IACf,OAAO,IAAI,CAAC,GAAG,EAAE,CAAC;AACtB,CAAC;AAFD,kBAEC"} | ||
| {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/index.ts"],"names":[],"mappings":";;;AACA;;;;GAIG;AACH,MAAa,YAAY;IASD;IARJ,GAAG,GAAG,IAAI,GAAG,EAAE,CAAC;IAEhC;;;OAGG;IACI,GAAG,GAAY,KAAK,CAAC;IAC5B,YACoB,GAAW;QAAX,QAAG,GAAH,GAAG,CAAQ;IAC3B,CAAC;IAEL,GAAG,CAAC,KAAQ;QACR,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QACtC,IAAI,OAAO,SAAS,KAAK,WAAW,EAAE;YAClC,OAAO,KAAK,CAAC;SAChB;QAED,IAAI,SAAS,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE;YAC9B,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YACvB,OAAO,KAAK,CAAC;SAChB;QAED,OAAO,IAAI,CAAC;IAChB,CAAC;IAED,GAAG,CAAC,KAAQ;QACR,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACvB,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC;QAE3B;;;;;WAKG;QACH,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE;YACX,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC;YAChB,UAAU,CAAC,GAAG,EAAE;gBACZ,IAAI,CAAC,GAAG,GAAG,KAAK,CAAC;gBACjB,kBAAkB,CAAC,IAAI,CAAC,CAAC;YAC7B,CAAC,EAAE,CAAC,CAAC,CAAC;SACT;IACL,CAAC;IAED,KAAK;QACD,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC;IACrB,CAAC;CACJ;AAhDD,oCAgDC;AAGD;;;GAGG;AACH,SAAgB,kBAAkB,CAC9B,YAA0B;IAE1B,MAAM,SAAS,GAAG,GAAG,EAAE,GAAG,YAAY,CAAC,GAAG,CAAC;IAC3C,MAAM,QAAQ,GAAG,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC;IAErD;;;OAGG;IACH,OAAO,IAAI,EAAE;QACT,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC;QAEnC,IAAI,CAAC,IAAI,EAAE;YACP,MAAM,CAAC,mBAAmB;SAC7B;QACD,MAAM,KAAK,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QACtB,MAAM,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QACrB,IAAI,IAAI,GAAG,SAAS,EAAE;YAClB,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;SAClC;aAAM;YACH,4CAA4C;YAC5C,MAAM;SACT;KACJ;AACL,CAAC;AAzBD,gDAyBC;AAED,SAAgB,GAAG;IACf,OAAO,IAAI,CAAC,GAAG,EAAE,CAAC;AACtB,CAAC;AAFD,kBAEC"} |
@@ -69,3 +69,53 @@ "use strict"; | ||
| }); | ||
| /** | ||
| * This behavior is required so | ||
| * that removeTooOldValues() can iterate over a time-sorted list. | ||
| */ | ||
| it('re-adding should add as last element of the internal map', () => { | ||
| const set = new index_1.ObliviousSet(100); | ||
| set.add('a'); | ||
| set.add('b'); | ||
| set.add('c'); | ||
| // re-add | ||
| set.add('a'); | ||
| const keys = Array.from(set.map.keys()); | ||
| assert.strictEqual(keys[2], 'a'); | ||
| }); | ||
| describe('issues', () => { | ||
| /** | ||
| * @link https://github.com/pubkey/oblivious-set/issues/2 | ||
| */ | ||
| describe('#2 Value update breaks removeTooOldValues', () => { | ||
| it('should reset the TTL on re-add (check via set.has())', async () => { | ||
| const set = new index_1.ObliviousSet(100); | ||
| set.add('foo'); | ||
| set.add('bar'); | ||
| await async_test_util_1.default.wait(80); | ||
| assert.strictEqual(set.has('bar'), true, 'still be there after 80'); | ||
| set.add('foo'); | ||
| await async_test_util_1.default.wait(110); | ||
| assert.strictEqual(set.has('bar'), false, 'gone after 110 by time'); | ||
| }); | ||
| it('should reset the TTL on re-add (check by triggering removeTooOldValues())', async () => { | ||
| const set = new index_1.ObliviousSet(100); | ||
| set.add('foo'); | ||
| set.add('bar'); | ||
| await async_test_util_1.default.wait(80); | ||
| assert.strictEqual(set.has('bar'), true, 'still be there after 80'); | ||
| set.add('foo'); | ||
| await async_test_util_1.default.wait(110); | ||
| // trigger removeTooOldValues | ||
| set.add('baz'); | ||
| await async_test_util_1.default.waitUntil(() => !set._to); | ||
| assert.strictEqual(set.map.has('bar'), false, 'gone after 110 by removeTooOldValues'); | ||
| }); | ||
| it('should return false for values after its ttl', async () => { | ||
| const set = new index_1.ObliviousSet(100); | ||
| set.add('foobar'); | ||
| await async_test_util_1.default.wait(110); | ||
| assert.strictEqual(set.has('foobar'), false); | ||
| }); | ||
| }); | ||
| }); | ||
| }); | ||
| //# sourceMappingURL=unit.test.js.map |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"unit.test.js","sourceRoot":"","sources":["../../../test/unit.test.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,sEAA4C;AAC5C,+CAAiC;AAEjC,wCAEsB;AAEtB,QAAQ,CAAC,cAAc,EAAE,GAAG,EAAE;IAC1B,EAAE,CAAC,8BAA8B,EAAE,GAAG,EAAE;QACpC,MAAM,GAAG,GAAG,IAAI,oBAAY,CAAC,GAAG,CAAC,CAAC;QAClC,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAClB,MAAM,GAAG,GAAG,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAC9B,MAAM,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC;QAEf,GAAG,CAAC,KAAK,EAAE,CAAC;QACZ,MAAM,QAAQ,GAAG,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QACnC,MAAM,CAAC,WAAW,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;IACxC,CAAC,CAAC,CAAC;IACH,EAAE,CAAC,2EAA2E,EAAE,KAAK,IAAI,EAAE;QACvF,MAAM,GAAG,GAAG,IAAI,oBAAY,CAAC,GAAG,CAAC,CAAC;QAClC,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAClB,MAAM,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC;QAE7B,MAAM,yBAAa,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC9B,GAAG,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QACnB,MAAM,yBAAa,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAE9B,MAAM,GAAG,GAAG,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAE9B,MAAM,CAAC,WAAW,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IACnC,CAAC,CAAC,CAAC;IACH,EAAE,CAAC,gFAAgF,EAAE,KAAK,IAAI,EAAE;QAC5F,MAAM,GAAG,GAAG,IAAI,oBAAY,CAAC,GAAG,CAAC,CAAC;QAClC,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAClB,MAAM,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC;QAE7B,MAAM,yBAAa,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAC7B,GAAG,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QACnB,MAAM,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC;IACjC,CAAC,CAAC,CAAC;IACH,EAAE,CAAC,sCAAsC,EAAE,KAAK,IAAI,EAAE;QAClD,MAAM,GAAG,GAAG,IAAI,oBAAY,CAAC,GAAG,CAAC,CAAC;QAClC,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAElB,MAAM,yBAAa,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC9B,GAAG,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QACnB,MAAM,yBAAa,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAE9B,MAAM,GAAG,GAAG,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAC9B,MAAM,CAAC,WAAW,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IACnC,CAAC,CAAC,CAAC;AACP,CAAC,CAAC,CAAC"} | ||
| {"version":3,"file":"unit.test.js","sourceRoot":"","sources":["../../../test/unit.test.ts"],"names":[],"mappings":"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"} |
@@ -18,5 +18,14 @@ /** | ||
| has(value) { | ||
| return this.map.has(value); | ||
| const valueTime = this.map.get(value); | ||
| if (typeof valueTime === 'undefined') { | ||
| return false; | ||
| } | ||
| if (valueTime < now() - this.ttl) { | ||
| this.map.delete(value); | ||
| return false; | ||
| } | ||
| return true; | ||
| } | ||
| add(value) { | ||
| this.map.delete(value); | ||
| this.map.set(value, now()); | ||
@@ -55,3 +64,3 @@ /** | ||
| if (!next) { | ||
| return; // no more elements | ||
| break; // no more elements | ||
| } | ||
@@ -65,3 +74,3 @@ const value = next[0]; | ||
| // We reached a value that is not old enough | ||
| return; | ||
| break; | ||
| } | ||
@@ -68,0 +77,0 @@ } |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/index.ts"],"names":[],"mappings":"AACA;;;;GAIG;AACH,MAAM,OAAO,YAAY;IASD;IARJ,GAAG,GAAG,IAAI,GAAG,EAAE,CAAC;IAEhC;;;OAGG;IACI,GAAG,GAAY,KAAK,CAAC;IAC5B,YACoB,GAAW;QAAX,QAAG,GAAH,GAAG,CAAQ;IAC3B,CAAC;IAEL,GAAG,CAAC,KAAQ;QACR,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IAC/B,CAAC;IAED,GAAG,CAAC,KAAQ;QACR,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC;QAE3B;;;;;WAKG;QACH,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE;YACX,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC;YAChB,UAAU,CAAC,GAAG,EAAE;gBACZ,IAAI,CAAC,GAAG,GAAG,KAAK,CAAC;gBACjB,kBAAkB,CAAC,IAAI,CAAC,CAAC;YAC7B,CAAC,EAAE,CAAC,CAAC,CAAC;SACT;IACL,CAAC;IAED,KAAK;QACD,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC;IACrB,CAAC;CACJ;AAGD;;;GAGG;AACH,MAAM,UAAU,kBAAkB,CAC9B,YAA0B;IAE1B,MAAM,SAAS,GAAG,GAAG,EAAE,GAAG,YAAY,CAAC,GAAG,CAAC;IAC3C,MAAM,QAAQ,GAAG,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC;IAErD;;;OAGG;IACH,OAAO,IAAI,EAAE;QAET,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC;QAEnC,IAAI,CAAC,IAAI,EAAE;YACP,OAAO,CAAC,mBAAmB;SAC9B;QACD,MAAM,KAAK,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QACtB,MAAM,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QACrB,IAAI,IAAI,GAAG,SAAS,EAAE;YAClB,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;SAClC;aAAM;YACH,4CAA4C;YAC5C,OAAO;SACV;KACJ;AACL,CAAC;AAED,MAAM,UAAU,GAAG;IACf,OAAO,IAAI,CAAC,GAAG,EAAE,CAAC;AACtB,CAAC"} | ||
| {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/index.ts"],"names":[],"mappings":"AACA;;;;GAIG;AACH,MAAM,OAAO,YAAY;IASD;IARJ,GAAG,GAAG,IAAI,GAAG,EAAE,CAAC;IAEhC;;;OAGG;IACI,GAAG,GAAY,KAAK,CAAC;IAC5B,YACoB,GAAW;QAAX,QAAG,GAAH,GAAG,CAAQ;IAC3B,CAAC;IAEL,GAAG,CAAC,KAAQ;QACR,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QACtC,IAAI,OAAO,SAAS,KAAK,WAAW,EAAE;YAClC,OAAO,KAAK,CAAC;SAChB;QAED,IAAI,SAAS,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE;YAC9B,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YACvB,OAAO,KAAK,CAAC;SAChB;QAED,OAAO,IAAI,CAAC;IAChB,CAAC;IAED,GAAG,CAAC,KAAQ;QACR,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACvB,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC;QAE3B;;;;;WAKG;QACH,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE;YACX,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC;YAChB,UAAU,CAAC,GAAG,EAAE;gBACZ,IAAI,CAAC,GAAG,GAAG,KAAK,CAAC;gBACjB,kBAAkB,CAAC,IAAI,CAAC,CAAC;YAC7B,CAAC,EAAE,CAAC,CAAC,CAAC;SACT;IACL,CAAC;IAED,KAAK;QACD,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC;IACrB,CAAC;CACJ;AAGD;;;GAGG;AACH,MAAM,UAAU,kBAAkB,CAC9B,YAA0B;IAE1B,MAAM,SAAS,GAAG,GAAG,EAAE,GAAG,YAAY,CAAC,GAAG,CAAC;IAC3C,MAAM,QAAQ,GAAG,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC;IAErD;;;OAGG;IACH,OAAO,IAAI,EAAE;QACT,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC;QAEnC,IAAI,CAAC,IAAI,EAAE;YACP,MAAM,CAAC,mBAAmB;SAC7B;QACD,MAAM,KAAK,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QACtB,MAAM,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QACrB,IAAI,IAAI,GAAG,SAAS,EAAE;YAClB,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;SAClC;aAAM;YACH,4CAA4C;YAC5C,MAAM;SACT;KACJ;AACL,CAAC;AAED,MAAM,UAAU,GAAG;IACf,OAAO,IAAI,CAAC,GAAG,EAAE,CAAC;AACtB,CAAC"} |
@@ -41,3 +41,53 @@ import AsyncTestUtil from 'async-test-util'; | ||
| }); | ||
| /** | ||
| * This behavior is required so | ||
| * that removeTooOldValues() can iterate over a time-sorted list. | ||
| */ | ||
| it('re-adding should add as last element of the internal map', () => { | ||
| const set = new ObliviousSet(100); | ||
| set.add('a'); | ||
| set.add('b'); | ||
| set.add('c'); | ||
| // re-add | ||
| set.add('a'); | ||
| const keys = Array.from(set.map.keys()); | ||
| assert.strictEqual(keys[2], 'a'); | ||
| }); | ||
| describe('issues', () => { | ||
| /** | ||
| * @link https://github.com/pubkey/oblivious-set/issues/2 | ||
| */ | ||
| describe('#2 Value update breaks removeTooOldValues', () => { | ||
| it('should reset the TTL on re-add (check via set.has())', async () => { | ||
| const set = new ObliviousSet(100); | ||
| set.add('foo'); | ||
| set.add('bar'); | ||
| await AsyncTestUtil.wait(80); | ||
| assert.strictEqual(set.has('bar'), true, 'still be there after 80'); | ||
| set.add('foo'); | ||
| await AsyncTestUtil.wait(110); | ||
| assert.strictEqual(set.has('bar'), false, 'gone after 110 by time'); | ||
| }); | ||
| it('should reset the TTL on re-add (check by triggering removeTooOldValues())', async () => { | ||
| const set = new ObliviousSet(100); | ||
| set.add('foo'); | ||
| set.add('bar'); | ||
| await AsyncTestUtil.wait(80); | ||
| assert.strictEqual(set.has('bar'), true, 'still be there after 80'); | ||
| set.add('foo'); | ||
| await AsyncTestUtil.wait(110); | ||
| // trigger removeTooOldValues | ||
| set.add('baz'); | ||
| await AsyncTestUtil.waitUntil(() => !set._to); | ||
| assert.strictEqual(set.map.has('bar'), false, 'gone after 110 by removeTooOldValues'); | ||
| }); | ||
| it('should return false for values after its ttl', async () => { | ||
| const set = new ObliviousSet(100); | ||
| set.add('foobar'); | ||
| await AsyncTestUtil.wait(110); | ||
| assert.strictEqual(set.has('foobar'), false); | ||
| }); | ||
| }); | ||
| }); | ||
| }); | ||
| //# sourceMappingURL=unit.test.js.map |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"unit.test.js","sourceRoot":"","sources":["../../../test/unit.test.ts"],"names":[],"mappings":"AAAA,OAAO,aAAa,MAAM,iBAAiB,CAAC;AAC5C,OAAO,KAAK,MAAM,MAAM,QAAQ,CAAC;AAEjC,OAAO,EACH,YAAY,EACf,MAAM,cAAc,CAAC;AAEtB,QAAQ,CAAC,cAAc,EAAE,GAAG,EAAE;IAC1B,EAAE,CAAC,8BAA8B,EAAE,GAAG,EAAE;QACpC,MAAM,GAAG,GAAG,IAAI,YAAY,CAAC,GAAG,CAAC,CAAC;QAClC,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAClB,MAAM,GAAG,GAAG,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAC9B,MAAM,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC;QAEf,GAAG,CAAC,KAAK,EAAE,CAAC;QACZ,MAAM,QAAQ,GAAG,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QACnC,MAAM,CAAC,WAAW,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;IACxC,CAAC,CAAC,CAAC;IACH,EAAE,CAAC,2EAA2E,EAAE,KAAK,IAAI,EAAE;QACvF,MAAM,GAAG,GAAG,IAAI,YAAY,CAAC,GAAG,CAAC,CAAC;QAClC,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAClB,MAAM,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC;QAE7B,MAAM,aAAa,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC9B,GAAG,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QACnB,MAAM,aAAa,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAE9B,MAAM,GAAG,GAAG,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAE9B,MAAM,CAAC,WAAW,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IACnC,CAAC,CAAC,CAAC;IACH,EAAE,CAAC,gFAAgF,EAAE,KAAK,IAAI,EAAE;QAC5F,MAAM,GAAG,GAAG,IAAI,YAAY,CAAC,GAAG,CAAC,CAAC;QAClC,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAClB,MAAM,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC;QAE7B,MAAM,aAAa,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAC7B,GAAG,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QACnB,MAAM,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC;IACjC,CAAC,CAAC,CAAC;IACH,EAAE,CAAC,sCAAsC,EAAE,KAAK,IAAI,EAAE;QAClD,MAAM,GAAG,GAAG,IAAI,YAAY,CAAC,GAAG,CAAC,CAAC;QAClC,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAElB,MAAM,aAAa,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC9B,GAAG,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QACnB,MAAM,aAAa,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAE9B,MAAM,GAAG,GAAG,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAC9B,MAAM,CAAC,WAAW,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IACnC,CAAC,CAAC,CAAC;AACP,CAAC,CAAC,CAAC"} | ||
| {"version":3,"file":"unit.test.js","sourceRoot":"","sources":["../../../test/unit.test.ts"],"names":[],"mappings":"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"} |
+2
-2
| { | ||
| "name": "oblivious-set", | ||
| "version": "1.4.0", | ||
| "version": "2.0.0", | ||
| "description": "Like a JavaScript Set() but with a TTL for entries", | ||
@@ -46,3 +46,3 @@ "keywords": [ | ||
| "assert": "2.0.0", | ||
| "async-test-util": "2.2.0", | ||
| "async-test-util": "2.5.0", | ||
| "mocha": "8.4.0", | ||
@@ -49,0 +49,0 @@ "rimraf": "3.0.2", |
+14
-4
@@ -20,6 +20,17 @@ | ||
| has(value: T): boolean { | ||
| return this.map.has(value); | ||
| const valueTime = this.map.get(value); | ||
| if (typeof valueTime === 'undefined') { | ||
| return false; | ||
| } | ||
| if (valueTime < now() - this.ttl) { | ||
| this.map.delete(value); | ||
| return false; | ||
| } | ||
| return true; | ||
| } | ||
| add(value: T): void { | ||
| this.map.delete(value); | ||
| this.map.set(value, now()); | ||
@@ -63,7 +74,6 @@ | ||
| while (true) { | ||
| const next = iterator.next().value; | ||
| if (!next) { | ||
| return; // no more elements | ||
| break; // no more elements | ||
| } | ||
@@ -76,3 +86,3 @@ const value = next[0]; | ||
| // We reached a value that is not old enough | ||
| return; | ||
| break; | ||
| } | ||
@@ -79,0 +89,0 @@ } |
+57
-0
@@ -52,2 +52,59 @@ import AsyncTestUtil from 'async-test-util'; | ||
| }); | ||
| /** | ||
| * This behavior is required so | ||
| * that removeTooOldValues() can iterate over a time-sorted list. | ||
| */ | ||
| it('re-adding should add as last element of the internal map', () => { | ||
| const set = new ObliviousSet(100); | ||
| set.add('a'); | ||
| set.add('b'); | ||
| set.add('c'); | ||
| // re-add | ||
| set.add('a'); | ||
| const keys = Array.from(set.map.keys()); | ||
| assert.strictEqual(keys[2], 'a'); | ||
| }); | ||
| describe('issues', () => { | ||
| /** | ||
| * @link https://github.com/pubkey/oblivious-set/issues/2 | ||
| */ | ||
| describe('#2 Value update breaks removeTooOldValues', () => { | ||
| it('should reset the TTL on re-add (check via set.has())', async () => { | ||
| const set = new ObliviousSet(100); | ||
| set.add('foo'); | ||
| set.add('bar'); | ||
| await AsyncTestUtil.wait(80); | ||
| assert.strictEqual(set.has('bar'), true, 'still be there after 80'); | ||
| set.add('foo'); | ||
| await AsyncTestUtil.wait(110); | ||
| assert.strictEqual(set.has('bar'), false, 'gone after 110 by time'); | ||
| }); | ||
| it('should reset the TTL on re-add (check by triggering removeTooOldValues())', async () => { | ||
| const set = new ObliviousSet(100); | ||
| set.add('foo'); | ||
| set.add('bar'); | ||
| await AsyncTestUtil.wait(80); | ||
| assert.strictEqual(set.has('bar'), true, 'still be there after 80'); | ||
| set.add('foo'); | ||
| await AsyncTestUtil.wait(110); | ||
| // trigger removeTooOldValues | ||
| set.add('baz'); | ||
| await AsyncTestUtil.waitUntil(() => !set._to); | ||
| assert.strictEqual(set.map.has('bar'), false, 'gone after 110 by removeTooOldValues'); | ||
| }); | ||
| it('should return false for values after its ttl', async () => { | ||
| const set = new ObliviousSet(100); | ||
| set.add('foobar'); | ||
| await AsyncTestUtil.wait(110); | ||
| assert.strictEqual(set.has('foobar'), false); | ||
| }); | ||
| }); | ||
| }); | ||
| }); |
40670
41.4%779
29.4%