首次提交
This commit is contained in:
+56
@@ -0,0 +1,56 @@
|
||||
'use strict'
|
||||
|
||||
const { Transform, Writable } = require('stream')
|
||||
|
||||
function validateTopic (topic, message) {
|
||||
if (!topic || topic.length === 0) { // [MQTT-3.8.3-3]
|
||||
return new Error('impossible to ' + message + ' to an empty topic')
|
||||
}
|
||||
|
||||
const end = topic.length - 1
|
||||
const endMinus = end - 1
|
||||
const slashInPreEnd = endMinus > 0 && topic.charCodeAt(endMinus) !== 47
|
||||
|
||||
for (let i = 0; i < topic.length; i++) {
|
||||
switch (topic.charCodeAt(i)) {
|
||||
case 35: { // #
|
||||
const notAtTheEnd = i !== end
|
||||
if (notAtTheEnd || slashInPreEnd) {
|
||||
return new Error('# is only allowed in ' + message + ' in the last position')
|
||||
}
|
||||
break
|
||||
}
|
||||
case 43: { // +
|
||||
const pastChar = i < end - 1 && topic.charCodeAt(i + 1) !== 47
|
||||
const preChar = i > 1 && topic.charCodeAt(i - 1) !== 47
|
||||
if (pastChar || preChar) {
|
||||
return new Error('+ is only allowed in ' + message + ' between /')
|
||||
}
|
||||
break
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function through (transform) {
|
||||
return new Transform({
|
||||
objectMode: true,
|
||||
transform
|
||||
})
|
||||
}
|
||||
|
||||
function bulk (fn) {
|
||||
return new Writable({
|
||||
objectMode: true,
|
||||
writev: function (chunks, cb) {
|
||||
fn(chunks.map(chunk => chunk.chunk), cb)
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
module.exports = {
|
||||
validateTopic,
|
||||
through,
|
||||
bulk,
|
||||
$SYS_PREFIX: '$SYS/'
|
||||
}
|
||||
Reference in New Issue
Block a user