| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556 |
- '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/'
- }
|