├── .gitignore ├── .jscsrc ├── .jshintrc ├── .npmrc ├── CHANGELOG.md ├── Gruntfile.js ├── LICENSE ├── README.md ├── bower.json ├── debug.bowerrc ├── demo ├── elements │ ├── demo-element.html │ └── demo.css ├── index.html └── injecting-mqtt-connection.html ├── dist ├── mqtt-elements-bundle.js └── setImmediate.js ├── index.html ├── mqemitter.html ├── mqtt-connection.html ├── mqtt-elements.html ├── mqtt-publish-regestration-behaviour.html ├── mqtt-publish.html ├── mqtt-subscription-regestration-behaviour.html ├── mqtt-subscription.html ├── mqttjs.html ├── package.json └── test ├── index.html ├── mqtt-connection-and-subscription.html ├── mqtt-connection-change-properties.html ├── mqtt-connection-clientId.html ├── mqtt-connection-events.html ├── mqtt-connection-max-listeners.html ├── mqtt-connection-private-methods.html ├── mqtt-connection-read-only.html ├── mqtt-connection-spec.html ├── mqtt-elements-full-stack.html ├── mqtt-publish-spec.html ├── mqtt-publish-test.html └── mqtt-subscription-spec.html /.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | 5 | # Runtime data 6 | pids 7 | *.pid 8 | *.seed 9 | 10 | # Directory for instrumented libs generated by jscoverage/JSCover 11 | lib-cov 12 | 13 | # Coverage directory used by tools like istanbul 14 | coverage 15 | 16 | # Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) 17 | .grunt 18 | 19 | # node-waf configuration 20 | .lock-wscript 21 | 22 | # Compiled binary addons (http://nodejs.org/api/addons.html) 23 | build/Release 24 | 25 | # Dependency directory 26 | # https://www.npmjs.org/doc/misc/npm-faq.html#should-i-check-my-node_modules-folder-into-git 27 | node_modules 28 | .idea 29 | bower_components 30 | selenium-standalone/ 31 | chromedriver/ 32 | 33 | #bower 34 | .bowerrc 35 | tmp 36 | -------------------------------------------------------------------------------- /.jscsrc: -------------------------------------------------------------------------------- 1 | { 2 | "preset": "google", 3 | "disallowSpacesInAnonymousFunctionExpression": null, 4 | "excludeFiles": ["node_modules/**"] 5 | } -------------------------------------------------------------------------------- /.jshintrc: -------------------------------------------------------------------------------- 1 | { 2 | "node": true, 3 | "browser": true, 4 | "bitwise": true, 5 | "camelcase": true, 6 | "curly": true, 7 | "eqeqeq": true, 8 | "immed": true, 9 | "indent": 2, 10 | "latedef": true, 11 | "noarg": true, 12 | "quotmark": "single", 13 | "undef": true, 14 | "unused": true, 15 | "newcap": false, 16 | "globals": { 17 | "wrap": true, 18 | "unwrap": true, 19 | "Polymer": true, 20 | "Platform": true, 21 | "page": true, 22 | "app": true 23 | } 24 | } -------------------------------------------------------------------------------- /.npmrc: -------------------------------------------------------------------------------- 1 | chromedriver_cdnurl=http://localhost:9001/node_modules/web-component-tester/node_modules/wct-local/node_modules/selenium-standalone/.selenium/chromedriver -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | 0.0.2-beta (09/29/2015) 2 | 3 | 0.0.1-beta (09/02/2015) 4 | Implemented enhancements: 5 | Fixed bugs: 6 | Closed issues: 7 | Merged pull requests: -------------------------------------------------------------------------------- /Gruntfile.js: -------------------------------------------------------------------------------- 1 | /* global module:false */ 2 | module.exports = function (grunt) { 3 | 4 | // Project configuration. 5 | grunt.initConfig({ 6 | pkg: grunt.file.readJSON('package.json'), 7 | 8 | 'wct-test': { 9 | local: { 10 | options: {remote: false}, 11 | }, 12 | remote: { 13 | options: {remote: true}, 14 | }, 15 | chrome: { 16 | options: {browsers: ['chrome']}, 17 | }, 18 | firefox: { 19 | options: {browsers: ['firefox']}, 20 | } 21 | }, 22 | 23 | watch: { 24 | test: { 25 | files: ['test/*.html', 'test/*.js'], 26 | tasks: ['test'] 27 | }, 28 | html: { 29 | files: ['*.html'], 30 | tasks: ['test'] 31 | } 32 | }, 33 | 34 | connect: { 35 | server: { 36 | options: { 37 | port: 9001, 38 | base: '..' 39 | } 40 | } 41 | } 42 | }); 43 | 44 | // watch 45 | grunt.loadNpmTasks('grunt-contrib-watch'); 46 | 47 | // connect 48 | grunt.loadNpmTasks('grunt-contrib-connect'); 49 | 50 | //load the wct grunt plugin 51 | grunt.loadNpmTasks('web-component-tester'); 52 | 53 | // a task that builds the overall app 54 | grunt.registerTask('build', []); 55 | 56 | // define a serve task that will start a web server and watch for changes 57 | grunt.registerTask('serve', ['connect', 'watch']); 58 | 59 | // Default task(s). 60 | grunt.registerTask('default', ['build']); 61 | 62 | // define the test task to run wct tests 63 | grunt.registerTask('test', ['wct-test:chrome']); 64 | 65 | }; 66 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2015 MQTT.js 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | 23 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ![mqtt-elements](https://raw.githubusercontent.com/mqttjs/mqtt-elements/67266290fe6a0b6b3ff51418efb7c1c0662c78c5/assets/mqtt-elements.png) 2 | ======= 3 | 4 | Polymer elements to establish a MQTT connection to a MQTT broker. 5 | 6 | ## API 7 | 8 | [API documentation](http://mqttjs.github.io/mqtt-elements/bower_components/mqtt-elements/) 9 | 10 | ## Install 11 | 12 | ``` 13 | bower install --save mqtt-elements 14 | ``` 15 | 16 | ## Import 17 | 18 | ``` 19 | 20 | ``` 21 | 22 | ## Usage 23 | 24 | ``` 25 | 26 | 32 | 38 | 39 | ``` 40 | 41 | ### Connect 42 | 43 | ``` 44 | 45 | ``` 46 | 47 | The method `#connect` has to be called manually to establish the MQTT connection to the MQTT broker. 48 | Set `#auto` flag to make the MQTT connection as soon as possible. 49 | 50 | 51 | ### Connect with Username / Password 52 | 53 | ``` 54 | 59 | 60 | ``` 61 | 62 | OR 63 | 64 | ``` 65 | 71 | 72 | ``` 73 | 74 | The flag `#withCredentials` indecates the MQTT connection to wait until a username and password for 75 | the connection is supplied. 76 | 77 | ### Publish 78 | 79 | The following example will publish on the topic »mqtt/elements« with the payload »Publishing via a HTML element«. 80 | Every time when `#payload` changes the element will publish a new MQTT message to the topic »mqtt/elements«. 81 | If the `#auto` flag is not set - `#publish` has to be called to publish a MQTT message to the topic 82 | 83 | ``` 84 | 87 | 88 | 89 | ``` 90 | 91 | #### Publish on multiple topic 92 | 93 | A `` element can hold any number of `` elements to publish to different topics. 94 | 95 | ``` 96 | 99 | 100 | 101 | 102 | 103 | ``` 104 | 105 | #### Publish a retained message 106 | 107 | To publish a message with the RETAINED flag set to true add the `#retained` flag. 108 | 109 | ``` 110 | 113 | 114 | 115 | ``` 116 | 117 | ### Subscribe 118 | 119 | ``` 120 | 123 | 124 | 125 | ``` 126 | 127 | The last message to the topic will be save in `#lastMessage`. The `` stores the 128 | last `n` messages within the `#messages` array. Set `#numberOfMessages` to the 129 | number of messages that should be saved in `#messages`. To save every message received on the topic 130 | set `#numberOfMessages` to `Infinity`. 131 | 132 | ## Media 133 | 134 | * [MQTT Client Library Encyclopedia](http://www.hivemq.com/blog/mqtt-client-library-encyclopedia-mqttelements?utm_medium=social&utm_source=github-mqttjs) 135 | 136 | ## Development 137 | 138 | ``` 139 | mkdir mqtt-wrapper && cd mqtt-wrapper 140 | git clone https://github.com/mqttjs/mqtt-elements.git 141 | cd mqtt-elements 142 | cp debug.bowerrc .bowerrc 143 | npm install 144 | bower install 145 | grunt serve 146 | ``` 147 | 148 | 149 | #### Bundel MQTT.js, MQEmitter and Store 150 | 151 | ``` 152 | browserify -r ./node_modules/mqtt/lib/store.js:Store -r mqtt -r MQEmitter > dist/mqtt-elements-bundle.js 153 | 154 | ``` 155 | 156 | -------------------------------------------------------------------------------- /bower.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "mqtt-elements", 3 | "version": "0.0.6-beta", 4 | "homepage": "https://github.com/mqttjs/mqtt-elements", 5 | "description": "Polymer elements for MQTT", 6 | "main": "mqtt-elements.html", 7 | "keywords": [ 8 | "mqtt", 9 | "polymer", 10 | "websockets" 11 | ], 12 | "authors": [ 13 | "Sandro Kock (https://github.com/sandro-k)" 14 | ], 15 | "license": "MIT", 16 | "ignore": [ 17 | "**/.*", 18 | "node_modules", 19 | "bower_components", 20 | "test", 21 | "tests" 22 | ], 23 | "dependencies": { 24 | "polymer": "~1.2.1" 25 | }, 26 | "devDependencies": { 27 | "iron-component-page": "PolymerElements/iron-component-page#~1.0.5", 28 | "paper-button": "PolymerElements/paper-button#~1.0.7", 29 | "paper-icon-button": "PolymerElements/paper-icon-button#~1.0.3", 30 | "paper-input": "PolymerElements/paper-input#~1.0.14", 31 | "paper-slider": "PolymerElements/paper-slider#~1.0.6", 32 | "paper-toggle-button": "PolymerElements/paper-toggle-button#~1.0.8", 33 | "paper-tooltip": "PolymerElements/paper-tooltip#~1.1.0", 34 | "test-fixture": "PolymerElements/test-fixture#^1.0.0", 35 | "web-component-tester": "~3.3.22" 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /debug.bowerrc: -------------------------------------------------------------------------------- 1 | { 2 | "directory": ".." 3 | } -------------------------------------------------------------------------------- /demo/elements/demo-element.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 153 | 154 | 280 | 281 | 282 | 283 | 284 | 285 | 286 | -------------------------------------------------------------------------------- /demo/elements/demo.css: -------------------------------------------------------------------------------- 1 | :root { 2 | --status-icon: { 3 | width: 20px; 4 | height: 20px; 5 | border-radius: 50%; 6 | overflow: hidden; 7 | }; 8 | 9 | --paper-icon-button: { 10 | margin-right: -8px; 11 | }; 12 | } 13 | 14 | body { 15 | font-family: 'Roboto', 'Noto', sans-serif; 16 | font-size: 14px; 17 | margin: 0; 18 | padding: 24px; 19 | background-color: var(--paper-grey-50); 20 | } 21 | 22 | 23 | .horizontal-section { 24 | background-color: white; 25 | padding: 24px; 26 | margin-right: 24px; 27 | min-width: 200px; 28 | @apply(--shadow-elevation-2dp); 29 | } 30 | 31 | .vertical-section { 32 | background-color: white; 33 | padding: 24px; 34 | margin: 0 24px 24px 24px; 35 | @apply(--shadow-elevation-2dp); 36 | } 37 | 38 | .vertical-section table { 39 | width: 100%; 40 | } 41 | 42 | .vertical-section thead { 43 | font-weight: 600; 44 | } 45 | 46 | .vertical-section .full { 47 | width: 100%; 48 | } 49 | 50 | paper-slider { 51 | width:100px; 52 | } 53 | 54 | .sub-header { 55 | @apply(--layout); 56 | @apply(--layout-center); 57 | @apply(--layout-wrap); 58 | } 59 | 60 | .sub-header .title { 61 | @apply(--layout-flex); 62 | min-width: 248px; 63 | } 64 | 65 | .sub-header .qos { 66 | display: block; 67 | } 68 | 69 | .line { 70 | margin-right: 24px; 71 | } 72 | 73 | .horizontal-section-container-end { 74 | margin-top: 16px; 75 | @apply(--layout-horizontal); 76 | @apply(--layout-center); 77 | @apply(--layout-end-justified); 78 | @apply(--layout-wrap); 79 | } 80 | 81 | td, th { 82 | border: 1px solid #999; 83 | padding: 0.5rem; 84 | } 85 | 86 | tbody tr:nth-child(odd) { 87 | background-color: #fafafa; 88 | } 89 | 90 | .connected { 91 | @apply(--status-icon); 92 | background: darkseagreen; 93 | } 94 | 95 | .disconnected { 96 | @apply(--status-icon); 97 | background: indianred; 98 | } 99 | 100 | .status { 101 | @apply(--layout); 102 | @apply(--layout-center); 103 | margin-left: 1rem; 104 | } 105 | 106 | .status h3 { 107 | @apply(--layout-flex); 108 | margin-right: 0.25rem; 109 | } 110 | 111 | .layout.wrap.center-center { 112 | max-width: 800px; 113 | } 114 | 115 | 116 | .settings > h3 { 117 | margin-bottom: 0; 118 | } 119 | -------------------------------------------------------------------------------- /demo/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | inject <mqtt-connection> Demo 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /demo/injecting-mqtt-connection.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | inject <mqtt-connection> Demo 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 81 | 82 | 107 | 108 | 109 | -------------------------------------------------------------------------------- /dist/setImmediate.js: -------------------------------------------------------------------------------- 1 | (function (global, undefined) { 2 | "use strict"; 3 | 4 | if (global.setImmediate) { 5 | return; 6 | } 7 | 8 | var nextHandle = 1; // Spec says greater than zero 9 | var tasksByHandle = {}; 10 | var currentlyRunningATask = false; 11 | var doc = global.document; 12 | var setImmediate; 13 | 14 | function addFromSetImmediateArguments(args) { 15 | tasksByHandle[nextHandle] = partiallyApplied.apply(undefined, args); 16 | return nextHandle++; 17 | } 18 | 19 | // This function accepts the same arguments as setImmediate, but 20 | // returns a function that requires no arguments. 21 | function partiallyApplied(handler) { 22 | var args = [].slice.call(arguments, 1); 23 | return function() { 24 | if (typeof handler === "function") { 25 | handler.apply(undefined, args); 26 | } else { 27 | (new Function("" + handler))(); 28 | } 29 | }; 30 | } 31 | 32 | function runIfPresent(handle) { 33 | // From the spec: "Wait until any invocations of this algorithm started before this one have completed." 34 | // So if we're currently running a task, we'll need to delay this invocation. 35 | if (currentlyRunningATask) { 36 | // Delay by doing a setTimeout. setImmediate was tried instead, but in Firefox 7 it generated a 37 | // "too much recursion" error. 38 | setTimeout(partiallyApplied(runIfPresent, handle), 0); 39 | } else { 40 | var task = tasksByHandle[handle]; 41 | if (task) { 42 | currentlyRunningATask = true; 43 | try { 44 | task(); 45 | } finally { 46 | clearImmediate(handle); 47 | currentlyRunningATask = false; 48 | } 49 | } 50 | } 51 | } 52 | 53 | function clearImmediate(handle) { 54 | delete tasksByHandle[handle]; 55 | } 56 | 57 | function installNextTickImplementation() { 58 | setImmediate = function() { 59 | var handle = addFromSetImmediateArguments(arguments); 60 | process.nextTick(partiallyApplied(runIfPresent, handle)); 61 | return handle; 62 | }; 63 | } 64 | 65 | function canUsePostMessage() { 66 | // The test against `importScripts` prevents this implementation from being installed inside a web worker, 67 | // where `global.postMessage` means something completely different and can't be used for this purpose. 68 | if (global.postMessage && !global.importScripts) { 69 | var postMessageIsAsynchronous = true; 70 | var oldOnMessage = global.onmessage; 71 | global.onmessage = function() { 72 | postMessageIsAsynchronous = false; 73 | }; 74 | global.postMessage("", "*"); 75 | global.onmessage = oldOnMessage; 76 | return postMessageIsAsynchronous; 77 | } 78 | } 79 | 80 | function installPostMessageImplementation() { 81 | // Installs an event handler on `global` for the `message` event: see 82 | // * https://developer.mozilla.org/en/DOM/window.postMessage 83 | // * http://www.whatwg.org/specs/web-apps/current-work/multipage/comms.html#crossDocumentMessages 84 | 85 | var messagePrefix = "setImmediate$" + Math.random() + "$"; 86 | var onGlobalMessage = function(event) { 87 | if (event.source === global && 88 | typeof event.data === "string" && 89 | event.data.indexOf(messagePrefix) === 0) { 90 | runIfPresent(+event.data.slice(messagePrefix.length)); 91 | } 92 | }; 93 | 94 | if (global.addEventListener) { 95 | global.addEventListener("message", onGlobalMessage, false); 96 | } else { 97 | global.attachEvent("onmessage", onGlobalMessage); 98 | } 99 | 100 | setImmediate = function() { 101 | var handle = addFromSetImmediateArguments(arguments); 102 | global.postMessage(messagePrefix + handle, "*"); 103 | return handle; 104 | }; 105 | } 106 | 107 | function installMessageChannelImplementation() { 108 | var channel = new MessageChannel(); 109 | channel.port1.onmessage = function(event) { 110 | var handle = event.data; 111 | runIfPresent(handle); 112 | }; 113 | 114 | setImmediate = function() { 115 | var handle = addFromSetImmediateArguments(arguments); 116 | channel.port2.postMessage(handle); 117 | return handle; 118 | }; 119 | } 120 | 121 | function installReadyStateChangeImplementation() { 122 | var html = doc.documentElement; 123 | setImmediate = function() { 124 | var handle = addFromSetImmediateArguments(arguments); 125 | // Create a 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /mqemitter.html: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /mqtt-connection.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 28 | 29 | 30 | 35 | 36 | 37 | 725 | -------------------------------------------------------------------------------- /mqtt-elements.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /mqtt-publish-regestration-behaviour.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 7 | 8 | -------------------------------------------------------------------------------- /mqtt-publish.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 21 | 22 | 23 | 25 | 26 | 27 | 152 | -------------------------------------------------------------------------------- /mqtt-subscription-regestration-behaviour.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 7 | -------------------------------------------------------------------------------- /mqtt-subscription.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 26 | 27 | 28 | 30 | 31 | 32 | 293 | -------------------------------------------------------------------------------- /mqttjs.html: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "mqtt-elements", 3 | "version": "0.0.6-beta", 4 | "description": "Polymer elements for MQTT", 5 | "main": "mqtt-elements.html", 6 | "directories": { 7 | "test": "tests" 8 | }, 9 | "scripts": { 10 | "test": "grunt test" 11 | }, 12 | "repository": { 13 | "type": "git", 14 | "url": "git+https://github.com/mqttjs/mqtt-elements.git" 15 | }, 16 | "keywords": [ 17 | "mqtt", 18 | "polymer", 19 | "websockets" 20 | ], 21 | "author": "Sandro Kock (https://github.com/sandro-k)", 22 | "license": "MIT", 23 | "bugs": { 24 | "url": "https://github.com/mqttjs/mqtt-elements/issues" 25 | }, 26 | "homepage": "https://github.com/mqttjs/mqtt-elements#readme", 27 | "devDependencies": { 28 | "grunt": "^0.4.5", 29 | "grunt-contrib-connect": "^0.10.1", 30 | "grunt-contrib-watch": "^0.6.1", 31 | "jscs": "^2.4.0", 32 | "mqtt": "^1.3.0", 33 | "web-component-tester": "git+https://github.com/sandro-k/web-component-tester.git" 34 | }, 35 | "dependencies": { 36 | "mqemitter": "^0.4.0" 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /test/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Elements Test Runner 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 31 | 32 | 33 | 34 | -------------------------------------------------------------------------------- /test/mqtt-connection-and-subscription.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | mqtt-message-spec 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 31 | 32 | 33 | 34 | 41 | 42 | 43 | 44 | 80 | 81 | 82 | 83 | -------------------------------------------------------------------------------- /test/mqtt-connection-change-properties.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | mqtt-connection-basic 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 29 | 30 | 31 | 63 | 64 | 65 | 66 | -------------------------------------------------------------------------------- /test/mqtt-connection-clientId.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | mqtt-message-spec 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 30 | 31 | 32 | 33 | 53 | 54 | 55 | 56 | -------------------------------------------------------------------------------- /test/mqtt-connection-events.html: -------------------------------------------------------------------------------- 1 | 10 | 11 | 12 | 13 | 14 | 15 | mqtt-connection-events 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 35 | 36 | 37 | 94 | 95 | 96 | 97 | -------------------------------------------------------------------------------- /test/mqtt-connection-max-listeners.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | mqtt-connection-max-listeners 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 36 | 37 | 38 | 87 | 88 | 89 | 90 | -------------------------------------------------------------------------------- /test/mqtt-connection-private-methods.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | mqtt-connection-basic 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 24 | 25 | 26 | 27 | 30 | 31 | 32 | 67 | 68 | 69 | 70 | -------------------------------------------------------------------------------- /test/mqtt-connection-read-only.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | mqtt-connection-basic 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 26 | 27 | 28 | 55 | 56 | 57 | 58 | -------------------------------------------------------------------------------- /test/mqtt-connection-spec.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | mqtt-connection-basic 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 24 | 25 | 26 | 27 | 30 | 31 | 32 | 33 | 36 | 37 | 38 | 39 | 42 | 43 | 44 | 45 | 48 | 49 | 50 | 51 | 266 | 267 | 268 | 269 | -------------------------------------------------------------------------------- /test/mqtt-elements-full-stack.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | mqtt-subscription-spec 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 26 | 27 | 28 | 29 | 34 | 35 | 36 | 37 | 42 | 43 | 44 | 45 | 51 | 52 | 53 | 54 | 59 | 60 | 61 | 62 | 68 | 69 | 70 | 297 | 298 | 299 | 300 | -------------------------------------------------------------------------------- /test/mqtt-publish-spec.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | mqtt-subscription-spec 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 25 | 26 | 27 | 105 | 106 | 107 | 108 | -------------------------------------------------------------------------------- /test/mqtt-publish-test.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | mqtt-subscription-spec 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 27 | 28 | 29 | 71 | 72 | 73 | 74 | -------------------------------------------------------------------------------- /test/mqtt-subscription-spec.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | mqtt-subscription-spec 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 56 | 57 | 58 | 59 | --------------------------------------------------------------------------------