From 8c3b7547fc6f766f558ce40de8d9cbeca3598af6 Mon Sep 17 00:00:00 2001 From: Hans Klunder Date: Fri, 21 Feb 2025 18:50:34 +0100 Subject: [PATCH 1/6] chore: modernize dependencies --- .github/workflows/ci.yml | 6 +++--- .gitignore | 1 + package.json | 18 +++++++----------- test.js | 2 +- 4 files changed, 12 insertions(+), 15 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 66858ba..c0bdc16 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -9,13 +9,13 @@ jobs: runs-on: ubuntu-latest strategy: matrix: - node-version: [14.x, 16.x, '*'] + node-version: ['lts/-1', 'lts/*', 'node'] steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v4 - name: Use Node.js - uses: actions/setup-node@v1 + uses: actions/setup-node@v4 with: node-version: ${{ matrix.node-version }} - name: Install diff --git a/.gitignore b/.gitignore index 9c21649..d0364ca 100644 --- a/.gitignore +++ b/.gitignore @@ -30,3 +30,4 @@ node_modules mydb package-lock.json +.tap/ \ No newline at end of file diff --git a/package.json b/package.json index 3d1cccc..0ca63cb 100644 --- a/package.json +++ b/package.json @@ -7,7 +7,7 @@ "node": ">=14.0.0" }, "scripts": { - "test": "standard && tape test.js | faucet", + "test": "standard && tap test.js", "release": "read -p 'GITHUB_TOKEN: ' GITHUB_TOKEN && export GITHUB_TOKEN=$GITHUB_TOKEN && release-it --disable-metrics" }, "release-it": { @@ -45,21 +45,17 @@ }, "homepage": "https://github.com/mcollina/aedes-persistence-level#readme", "devDependencies": { - "aedes": "^0.46.3", - "aedes-persistence": "^9.1.1", - "concat-stream": "^2.0.0", - "faucet": "0.0.1", + "aedes": "^0.51.3", + "aedes-persistence": "^9.1.2", "level": "^8.0.0", - "mqemitter": "^4.5.0", "pre-commit": "^1.2.2", - "release-it": "^15.0.0", - "standard": "^17.0.0", - "tape": "^5.5.3", - "through2": "^4.0.2" + "release-it": "^18.1.2", + "standard": "^17.1.2", + "tap": "^21.1.0" }, "dependencies": { "aedes-packet": "^3.0.0", "msgpack-lite": "^0.1.26", - "qlobber": "^7.0.0" + "qlobber": "^8.0.1" } } diff --git a/test.js b/test.js index ce6ae40..c43463d 100644 --- a/test.js +++ b/test.js @@ -1,4 +1,4 @@ -const test = require('tape').test +const { test } = require('tape') const persistence = require('./') const abs = require('aedes-persistence/abstract') const { Level } = require('level') // Level >= 8.0.0 From 9708821b05ee0a4a28cab1963a4db099a9235472 Mon Sep 17 00:00:00 2001 From: Hans Klunder Date: Fri, 21 Feb 2025 19:27:47 +0100 Subject: [PATCH 2/6] switched back to tape and faucet --- package.json | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/package.json b/package.json index 0ca63cb..64045a1 100644 --- a/package.json +++ b/package.json @@ -7,7 +7,7 @@ "node": ">=14.0.0" }, "scripts": { - "test": "standard && tap test.js", + "test": "standard && tape test.js | faucet", "release": "read -p 'GITHUB_TOKEN: ' GITHUB_TOKEN && export GITHUB_TOKEN=$GITHUB_TOKEN && release-it --disable-metrics" }, "release-it": { @@ -50,12 +50,13 @@ "level": "^8.0.0", "pre-commit": "^1.2.2", "release-it": "^18.1.2", - "standard": "^17.1.2", - "tap": "^21.1.0" + "standard": "^17.1.2" }, "dependencies": { "aedes-packet": "^3.0.0", + "faucet": "^0.0.4", "msgpack-lite": "^0.1.26", - "qlobber": "^8.0.1" + "qlobber": "^8.0.1", + "tape": "^5.9.0" } } From 0fdbade1be089b96c5d06665d06832353217763e Mon Sep 17 00:00:00 2001 From: Hans Klunder Date: Sun, 23 Feb 2025 10:08:39 +0100 Subject: [PATCH 3/6] feat: upgrade level9 (#35) --- README.md | 2 +- package.json | 2 +- persistence.js | 134 +++++++++++++++++++++++++++---------------------- 3 files changed, 77 insertions(+), 61 deletions(-) diff --git a/README.md b/README.md index a053411..e1c95eb 100644 --- a/README.md +++ b/README.md @@ -23,7 +23,7 @@ The first parameter is an instance of [levelup][levelup]. Example: ```js -const { Level } = require('level') // Level >= 8.0.0 is required +const { Level } = require('level') // Level >= 9.0.0 is required const aedesPersistencelevel = require('aedes-persistence-level') // instantiate a persistence instance diff --git a/package.json b/package.json index 3d1cccc..965c6ed 100644 --- a/package.json +++ b/package.json @@ -49,7 +49,7 @@ "aedes-persistence": "^9.1.1", "concat-stream": "^2.0.0", "faucet": "0.0.1", - "level": "^8.0.0", + "level": "^9.0.0", "mqemitter": "^4.5.0", "pre-commit": "^1.2.2", "release-it": "^15.0.0", diff --git a/persistence.js b/persistence.js index e6066e8..9e25bc9 100644 --- a/persistence.js +++ b/persistence.js @@ -1,7 +1,7 @@ const Packet = require('aedes-packet') const msgpack = require('msgpack-lite') -const { EventEmitter } = require('events') -const { Readable } = require('stream') +const { EventEmitter } = require('node:events') +const { Readable } = require('node:stream') const QlobberSub = require('qlobber/aedes/qlobber-sub') const { QlobberTrue } = require('qlobber') @@ -21,6 +21,7 @@ const WILL = 'will:' const encodingOption = { valueEncoding: 'buffer' } +const LEVEL_NOT_FOUND = 'LEVEL_NOT_FOUND' async function * decodedDbValues (db, start) { const opts = Object.assign({ @@ -136,6 +137,12 @@ function toSubKey (sub) { return `${subByClientKey(sub.clientId)}:${sub.topic}` } +function callCb (cb, err, value) { + if (typeof cb === 'function') { + cb(err, value) + } +} + class LevelPersistence extends EventEmitter { // private class members start with # #db @@ -148,34 +155,38 @@ class LevelPersistence extends EventEmitter { this.#trie = new QlobberSub(QlobberOpts) this.#ready = false - const that = this - loadSubscriptions(this.#db, this.#trie) .then(() => { - that.#ready = true - that.emit('ready') + this.#ready = true + this.emit('ready') }) .catch((err) => { - that.emit('error', err) + this.emit('error', err) }) } - #dbGet (key, cb) { - this.#db.get(key, encodingOption, (err, blob) => { - cb(err, (!err) ? msgpack.decode(blob) : null) - }) + async #dbGet (key, cb) { + const blob = await this.#db.get(key, encodingOption) + if (blob !== undefined) { + cb(undefined, msgpack.decode(blob)) + return + } + cb(LEVEL_NOT_FOUND, null) } - #dbPut (key, value, cb) { - this.#db.put(key, msgpack.encode(value), encodingOption, cb) + async #dbPut (key, value, cb) { + await this.#db.put(key, msgpack.encode(value), encodingOption) + callCb(cb) } - #dbDel (key, cb) { - this.#db.del(key, cb) + async #dbDel (key, cb) { + await this.#db.del(key) + callCb(cb) } - #dbBatch (opArray, cb) { - this.#db.batch(opArray, encodingOption, cb) + async #dbBatch (opArray, cb) { + await this.#db.batch(opArray, encodingOption) + callCb(cb) } storeRetained (packet, cb) { @@ -261,11 +272,10 @@ class LevelPersistence extends EventEmitter { } cleanSubscriptions (client, cb) { - const that = this this.subscriptionsByClient(client, (err, subs) => { if (err || !subs) return cb(err, client) - that.removeSubscriptions( + this.removeSubscriptions( client, subs.map(sub => sub.topic), (err) => { @@ -300,32 +310,33 @@ class LevelPersistence extends EventEmitter { } outgoingUpdate (client, packet, cb) { - const that = this if (packet.brokerId) { - that.#updateWithBrokerData(client, packet, cb) + this.#updateWithBrokerData(client, packet, cb) } else { this.#augmentWithBrokerData(client, packet, (err) => { if (err) return cb(err, client, packet) - that.#updateWithBrokerData(client, packet, cb) + this.#updateWithBrokerData(client, packet, cb) }) } } outgoingClearMessageId (client, packet, cb) { - const that = this const key = outgoingByIdKey(client.id, packet.messageId) this.#dbGet(key, (err, packet) => { - if (err?.notFound) { - return cb(null) - } else if (err) { - return cb(err) + if (err === LEVEL_NOT_FOUND) { + cb(null) + return + } + if (err) { + cb(err) + return } const prekey = outgoingKey(client.id, packet.brokerId, packet.brokerCounter) - const batch = that.#db.batch() + const batch = this.#db.batch() batch.del(key) batch.del(prekey) - batch.write((err) => { + batch.write().then(err => { cb(err, packet) }) }) @@ -348,13 +359,15 @@ class LevelPersistence extends EventEmitter { incomingGetPacket (client, packet, cb) { const key = incomingKey(client.id, packet.messageId) this.#dbGet(key, (err, packet) => { - if (err && err.notFound) { + if (err === LEVEL_NOT_FOUND) { cb(new Error('no such packet'), client) - } else if (err) { + return + } + if (err) { cb(err, client) - } else { - cb(null, packet, client) + return } + cb(null, packet, client) }) } @@ -377,22 +390,22 @@ class LevelPersistence extends EventEmitter { getWill (client, cb) { const key = willKey(client.id) this.#dbGet(key, (err, will) => { - if (err && err.notFound) { + if (err === LEVEL_NOT_FOUND) { cb(null, null, client) - } else { - cb(err, will, client) + return } + cb(err, will, client) }) } delWill (client, cb) { const key = willKey(client.id) - const that = this this.#dbGet(key, (err, will) => { if (err) { - return cb(err, null, client) + cb(err, null, client) + return } - that.#dbDel(key, (err) => { + this.#dbDel(key, (err) => { cb(err, will, client) }) }) @@ -409,29 +422,29 @@ class LevelPersistence extends EventEmitter { #updateWithBrokerData (client, packet, cb) { const prekey = outgoingKey(client.id, packet.brokerId, packet.brokerCounter) const postkey = outgoingByIdKey(client.id, packet.messageId) - const that = this this.#dbGet(prekey, (err, decoded) => { - if (err && err.notFound) { + if (err === LEVEL_NOT_FOUND) { cb(new Error('no such packet'), client, packet) return - } else if (err) { + } + if (err) { cb(err, client, packet) return } if (decoded.messageId > 0) { - that.#dbDel(outgoingByIdKey(client.id, decoded.messageId)) + this.#dbDel(outgoingByIdKey(client.id, decoded.messageId)) } - that.#dbPut(postkey, packet, (err) => { + this.#dbPut(postkey, packet, (err) => { if (err) { cb(err, client, packet) - } else { - that.#dbPut(prekey, packet, (err) => { - cb(err, client, packet) - }) + return } + this.#dbPut(prekey, packet, (err) => { + cb(err, client, packet) + }) }) }) } @@ -439,10 +452,13 @@ class LevelPersistence extends EventEmitter { #augmentWithBrokerData (client, packet, cb) { const postkey = outgoingByIdKey(client.id, packet.messageId) this.#dbGet(postkey, (err, decoded) => { - if (err && err.notFound) { - return cb(new Error('no such packet')) - } else if (err) { - return cb(err) + if (err === LEVEL_NOT_FOUND) { + cb(new Error('no such packet')) + return + } + if (err) { + cb(err) + return } packet.brokerId = decoded.brokerId @@ -451,8 +467,9 @@ class LevelPersistence extends EventEmitter { }) } - destroy (cb) { - this.#db.close(cb) + async destroy (cb) { + await this.#db.close() + callCb(cb) } } @@ -466,11 +483,10 @@ function addSubToTrie (trie, sub) { if (match.qos === sub.qos) { add = false break - } else { - trie.remove(match.topic, match) - if (sub.qos === 0) { - add = false - } + } + trie.remove(match.topic, match) + if (sub.qos === 0) { + add = false } } } From 6e38a5f78351ec37ad3a0b9f2ba04bfd3f4f9ac9 Mon Sep 17 00:00:00 2001 From: Hans Klunder Date: Fri, 21 Feb 2025 18:50:34 +0100 Subject: [PATCH 4/6] chore: modernize dependencies --- .github/workflows/ci.yml | 6 +++--- .gitignore | 1 + package.json | 18 +++++++----------- test.js | 2 +- 4 files changed, 12 insertions(+), 15 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 66858ba..c0bdc16 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -9,13 +9,13 @@ jobs: runs-on: ubuntu-latest strategy: matrix: - node-version: [14.x, 16.x, '*'] + node-version: ['lts/-1', 'lts/*', 'node'] steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v4 - name: Use Node.js - uses: actions/setup-node@v1 + uses: actions/setup-node@v4 with: node-version: ${{ matrix.node-version }} - name: Install diff --git a/.gitignore b/.gitignore index 9c21649..d0364ca 100644 --- a/.gitignore +++ b/.gitignore @@ -30,3 +30,4 @@ node_modules mydb package-lock.json +.tap/ \ No newline at end of file diff --git a/package.json b/package.json index 965c6ed..c9fa06e 100644 --- a/package.json +++ b/package.json @@ -7,7 +7,7 @@ "node": ">=14.0.0" }, "scripts": { - "test": "standard && tape test.js | faucet", + "test": "standard && tap test.js", "release": "read -p 'GITHUB_TOKEN: ' GITHUB_TOKEN && export GITHUB_TOKEN=$GITHUB_TOKEN && release-it --disable-metrics" }, "release-it": { @@ -45,21 +45,17 @@ }, "homepage": "https://github.com/mcollina/aedes-persistence-level#readme", "devDependencies": { - "aedes": "^0.46.3", - "aedes-persistence": "^9.1.1", - "concat-stream": "^2.0.0", - "faucet": "0.0.1", + "aedes": "^0.51.3", + "aedes-persistence": "^9.1.2", "level": "^9.0.0", - "mqemitter": "^4.5.0", "pre-commit": "^1.2.2", - "release-it": "^15.0.0", - "standard": "^17.0.0", - "tape": "^5.5.3", - "through2": "^4.0.2" + "release-it": "^18.1.2", + "standard": "^17.1.2", + "tap": "^21.1.0" }, "dependencies": { "aedes-packet": "^3.0.0", "msgpack-lite": "^0.1.26", - "qlobber": "^7.0.0" + "qlobber": "^8.0.1" } } diff --git a/test.js b/test.js index ce6ae40..c43463d 100644 --- a/test.js +++ b/test.js @@ -1,4 +1,4 @@ -const test = require('tape').test +const { test } = require('tape') const persistence = require('./') const abs = require('aedes-persistence/abstract') const { Level } = require('level') // Level >= 8.0.0 From 43466cd1d731a9465d4e1fba2f1798c6101e64f8 Mon Sep 17 00:00:00 2001 From: Hans Klunder Date: Fri, 21 Feb 2025 19:27:47 +0100 Subject: [PATCH 5/6] switched back to tape and faucet --- package.json | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/package.json b/package.json index c9fa06e..e9dbdc8 100644 --- a/package.json +++ b/package.json @@ -7,7 +7,7 @@ "node": ">=14.0.0" }, "scripts": { - "test": "standard && tap test.js", + "test": "standard && tape test.js | faucet", "release": "read -p 'GITHUB_TOKEN: ' GITHUB_TOKEN && export GITHUB_TOKEN=$GITHUB_TOKEN && release-it --disable-metrics" }, "release-it": { @@ -50,12 +50,13 @@ "level": "^9.0.0", "pre-commit": "^1.2.2", "release-it": "^18.1.2", - "standard": "^17.1.2", - "tap": "^21.1.0" + "standard": "^17.1.2" }, "dependencies": { "aedes-packet": "^3.0.0", + "faucet": "^0.0.4", "msgpack-lite": "^0.1.26", - "qlobber": "^8.0.1" + "qlobber": "^8.0.1", + "tape": "^5.9.0" } } From 34480a5217134f5b32db84d6dafadb6986aaf573 Mon Sep 17 00:00:00 2001 From: Hans Klunder Date: Sun, 23 Feb 2025 11:50:58 +0100 Subject: [PATCH 6/6] replace pre-commit by @fastify/pre-commit --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index e9dbdc8..fd919f0 100644 --- a/package.json +++ b/package.json @@ -45,10 +45,10 @@ }, "homepage": "https://github.com/mcollina/aedes-persistence-level#readme", "devDependencies": { + "@fastify/pre-commit": "^2.2.0", "aedes": "^0.51.3", "aedes-persistence": "^9.1.2", "level": "^9.0.0", - "pre-commit": "^1.2.2", "release-it": "^18.1.2", "standard": "^17.1.2" },