u8-mqtt 0.6.4 → 0.6.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/cjs/basic-v4.cjs +1 -1
- package/cjs/basic-v5.cjs +1 -1
- package/cjs/full-v4.cjs +46 -25
- package/cjs/full-v4.cjs.map +1 -1
- package/cjs/full-v5.cjs +46 -25
- package/cjs/full-v5.cjs.map +1 -1
- package/cjs/index.cjs +46 -25
- package/cjs/index.cjs.map +1 -1
- package/cjs/v4.cjs +46 -25
- package/cjs/v4.cjs.map +1 -1
- package/cjs/v5.cjs +46 -25
- package/cjs/v5.cjs.map +1 -1
- package/code/router_path.jsy +34 -21
- package/code/with_topic_router.jsy +3 -0
- package/esm/basic-v4.js +1 -1
- package/esm/basic-v5.js +1 -1
- package/esm/deno/basic-v4.js +1 -1
- package/esm/deno/basic-v5.js +1 -1
- package/esm/deno/full-v4.js +46 -25
- package/esm/deno/full-v4.js.map +1 -1
- package/esm/deno/full-v5.js +46 -25
- package/esm/deno/full-v5.js.map +1 -1
- package/esm/deno/index.js +46 -25
- package/esm/deno/index.js.map +1 -1
- package/esm/deno/v4.js +46 -25
- package/esm/deno/v4.js.map +1 -1
- package/esm/deno/v5.js +46 -25
- package/esm/deno/v5.js.map +1 -1
- package/esm/full-v4.js +46 -25
- package/esm/full-v4.js.map +1 -1
- package/esm/full-v5.js +46 -25
- package/esm/full-v5.js.map +1 -1
- package/esm/index.js +46 -25
- package/esm/index.js.map +1 -1
- package/esm/node/basic-v4.js +1 -1
- package/esm/node/basic-v4.mjs +1 -1
- package/esm/node/basic-v5.js +1 -1
- package/esm/node/basic-v5.mjs +1 -1
- package/esm/node/full-v4.js +46 -25
- package/esm/node/full-v4.js.map +1 -1
- package/esm/node/full-v4.mjs +46 -25
- package/esm/node/full-v4.mjs.map +1 -1
- package/esm/node/full-v5.js +46 -25
- package/esm/node/full-v5.js.map +1 -1
- package/esm/node/full-v5.mjs +46 -25
- package/esm/node/full-v5.mjs.map +1 -1
- package/esm/node/index.js +46 -25
- package/esm/node/index.js.map +1 -1
- package/esm/node/index.mjs +46 -25
- package/esm/node/index.mjs.map +1 -1
- package/esm/node/v4.js +46 -25
- package/esm/node/v4.js.map +1 -1
- package/esm/node/v4.mjs +46 -25
- package/esm/node/v4.mjs.map +1 -1
- package/esm/node/v5.js +46 -25
- package/esm/node/v5.js.map +1 -1
- package/esm/node/v5.mjs +46 -25
- package/esm/node/v5.mjs.map +1 -1
- package/esm/v4.js +46 -25
- package/esm/v4.js.map +1 -1
- package/esm/v5.js +46 -25
- package/esm/v5.js.map +1 -1
- package/esm/web/basic-v4.js +1 -1
- package/esm/web/basic-v4.min.js +1 -1
- package/esm/web/basic-v4.min.js.br +0 -0
- package/esm/web/basic-v4.min.js.gz +0 -0
- package/esm/web/basic-v5.js +1 -1
- package/esm/web/basic-v5.min.js +1 -1
- package/esm/web/basic-v5.min.js.br +0 -0
- package/esm/web/basic-v5.min.js.gz +0 -0
- package/esm/web/full-v4.js +46 -25
- package/esm/web/full-v4.js.map +1 -1
- package/esm/web/full-v4.min.js +1 -1
- package/esm/web/full-v4.min.js.br +0 -0
- package/esm/web/full-v4.min.js.gz +0 -0
- package/esm/web/full-v5.js +46 -25
- package/esm/web/full-v5.js.map +1 -1
- package/esm/web/full-v5.min.js +1 -1
- package/esm/web/full-v5.min.js.br +0 -0
- package/esm/web/full-v5.min.js.gz +0 -0
- package/esm/web/index.js +46 -25
- package/esm/web/index.js.map +1 -1
- package/esm/web/index.min.js +1 -1
- package/esm/web/index.min.js.br +0 -0
- package/esm/web/index.min.js.gz +0 -0
- package/esm/web/v4.js +46 -25
- package/esm/web/v4.js.map +1 -1
- package/esm/web/v4.min.js +1 -1
- package/esm/web/v4.min.js.br +0 -0
- package/esm/web/v4.min.js.gz +0 -0
- package/esm/web/v5.js +46 -25
- package/esm/web/v5.js.map +1 -1
- package/esm/web/v5.min.js +1 -1
- package/esm/web/v5.min.js.br +0 -0
- package/esm/web/v5.min.js.gz +0 -0
- package/package.json +2 -2
package/esm/web/full-v5.min.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
function t(t,e=[]){for(e.push((t<128?0:128)|127&t);(t>>>=7)>0;)e.push((t<128?0:128)|127&t);return e}function e(t,e=0,r){let n=0,s=e,o=t[s++],i=127&o;for(;128&o;)i|=(127&(o=t[s++]))<<(n+=7);return t.length<s?[r,e,e]:[i,s,e]}const r=()=>function(t,e){for(let[r,n,s,o]of e)o={id:r,type:n,name:s,...o},t.set(r,o).set(s,o);return t}(new Map,[[1,"u8","payload_format_indicator"],[2,"u32","message_expiry_interval"],[3,"utf8","content_type"],[8,"utf8","response_topic"],[9,"bin","correlation_data"],[11,"vint","subscription_identifier"],[17,"u32","session_expiry_interval"],[18,"utf8","assigned_client_identifier"],[19,"u16","server_keep_alive"],[21,"utf8","authentication_method"],[22,"bin","authentication_data"],[23,"u8","request_problem_information"],[24,"u32","will_delay_interval"],[25,"u8","request_response_information"],[26,"utf8","response_information"],[28,"utf8","server_reference"],[31,"utf8","reason_string"],[33,"u16","receive_maximum"],[34,"u16","topic_alias_maximum"],[35,"u16","topic_alias"],[36,"u8","maximum_qos"],[37,"u8","retain_available"],[38,"pair","user_properties",{op:"kv_obj"}],[39,"u32","maximum_packet_size"],[40,"u8","wildcard_subscription_available"],[41,"u8","subscription_identifiers_available",{op:"u8_vec"}],[42,"u8","shared_subscription_available"]]),n=r();class s extends Number{constructor(t,e){super(t),this.reason=`:${(this.ok=t<128)?"ok":"fail"}:${e}`}}class o{static for(t,e){return(new this).of(e,{pkt:t})}of(t,e){let r=(t,e)=>(e=0|r.k,r.k=e+t,e);return{__proto__:this,buf:t,step:r,...e}}has_more(){return this.buf.byteLength>(0|this.step.k)}u8(){return this.buf[this.step(1)]}u16(){let{buf:t,step:e}=this,r=e(2);return t[r]<<8|t[r+1]}u32(){let{buf:t,step:e}=this,r=e(4);return t[r]<<24|t[r+1]<<16|t[r+2]<<8|t[r+3]}vint(){let{buf:t,step:r}=this,[n,s,o]=e(t,0|r.k);return r(s-o),n}bin(){let{buf:t,step:e}=this,r=e(2),n=t[r]<<8|t[r+1];return r=e(n),t.subarray(r,r+n)}utf8(){return new TextDecoder("utf-8").decode(this.bin())}pair(){return[this.utf8(),this.utf8()]}flags(t){return new t(this.buf[this.step(1)])}reason(t){let e=this.buf[this.step(1)];if(null!=e)return new s(e,this._reason_for?.(e,t))}flush(){let{buf:t,step:e}=this;return this.step=this.buf=null,t.subarray(0|e.k)}}function i(t,e){for(let[t,r]of Object.entries(e))e[t]=new Map(r);return class extends t{_reason_for(t,r){return e[r]?.get(t)||e.all.get(t)}warn(t){let e=this.pkt;e.warn?e.warn(t,e):console.warn("[u8-mqtt-packet] "+t)}}}const u={connack:[[1,"conn refused: unacceptable protocol version"],[2,"conn refused: identifier rejected"],[3,"conn refused: server unavailable"],[4,"conn refused: bad user name or password"],[5,"conn refused: not authorized"]],suback:[[0,"qos=0"],[1,"qos=1"],[2,"qos=2"]],unsuback:[[17,"no subscription existed"]],puback:[[16,"no matching subscribers"]],all:[[0,""],[128,"unspecified error"],[131,"implementation specific error"],[135,"not authorized"],[143,"topic filter invalid"],[145,"packet identifier in use"],[146,"packet identifier not found"]]},a=i(class extends o{props(){let{buf:t,step:r}=this,[s,o,i]=e(t,0|r.k,0);if(r(s+o-i),0===s)return null;let u={},a=this.of(t.subarray(o,0|r.k));for(;a.has_more();){let t,e=a.u8(),r=n.get(e);if(!r){u._unknown_=e,this.warn?.(`unknown property: ${e}`);break}t=a[r.type](),u[r.name]=r.op?a[r.op](u[r.name],t):t}return u}kv_obj(t=Object.create(null),[e,r]){return t[e]=r,t}u8_vec(t=[],e){return t.push(e),t}},{...u,auth:[[24,"continue authentication"],[25,"re-authenticate"]],disconnect:[[4,"disconnect with will message"]],all:[...u.all,[129,"malformed packet"],[130,"protocol error"],[132,"unsupported protocol version"],[133,"client identifier not valid"],[134,"bad user name or password"],[136,"server unavailable"],[137,"server busy"],[138,"banned"],[139,"server shutting down"],[140,"bad authentication method"],[141,"keep alive timeout"],[142,"session taken over"],[144,"topic name invalid"],[147,"receive maximum exceeded"],[148,"topic alias invalid"],[149,"packet too large"],[150,"message rate too high"],[151,"quota exceeded"],[152,"administrative action"],[153,"payload format invalid"],[154,"retain not supported"],[155,"qoS not supported"],[156,"use another server"],[157,"server moved"],[158,"shared subscriptions not supported"],[159,"connection rate exceeded"],[160,"maximum connect time"],[161,"subscription identifiers not supported"],[162,"wildcard subscriptions not supported"]]});class p{static for(t){return(new this).of()}of(){return{__proto__:this,$:[]}}static init(){return this}as_pkt(t){return this.pack([t])}push(...t){this.$.push(...t)}pack(e){let r,n,s=0,o=this.$;for(r of(this.$=!1,o))s+=r.length;n=(e=t(s,e)).length;let i=new Uint8Array(n+s);for(r of(i.set(e,0),o))i.set(r,n),n+=r.length;return i}u8(t){this.push([255&t])}u16(t){this.push([t>>>8&255,255&t])}u32(t){this.push([t>>>24&255,t>>>16&255,t>>>8&255,255&t])}vint(e){this.push(t(e))}bin(t){return t?"string"==typeof t?this.utf8(t):(t.length!==t.byteLength&&(t=new Uint8Array(t)),this.u16(t.byteLength),void this.push(t)):this.u16(0)}utf8(t){let e=new TextEncoder("utf-8").encode(t);this.u16(e.byteLength),this.push(e)}pair(t,e){this.utf8(t),this.utf8(e)}flags(t,e,r=0){return void 0!==t&&isNaN(+t)&&(t=e(t,0)),t|=r,this.push([t]),t}reason(t){this.push([0|t])}flush(t){null!=t&&this.push("string"==typeof t?new TextEncoder("utf-8").encode(t):t),this.push=!1}}const c={decode_fns:[function(t,e){class r extends Number{get reserved(){return!0&this}get clean_start(){return!0&this}get will_flag(){return!0&this}get will_qos(){return this>>>3&3}get will_retain(){return!0&this}get password(){return!0&this}get username(){return!0&this}}return t[1]=(t,n)=>{let s=e.for(t,n);if("MQTT"!==s.utf8())throw new Error("Invalid mqtt_connect packet");t.__proto__.mqtt_level=t.mqtt_level=s.u8();let o=t.flags=s.flags(r);if(t.keep_alive=s.u16(),5<=t.mqtt_level&&(t.props=s.props()),t.client_id=s.utf8(),o.will_flag){let e=t.will={};5<=t.mqtt_level&&(e.props=s.props()),e.topic=s.utf8(),e.payload=s.bin(),e.qos=o.will_qos,e.retain=o.will_retain}return o.username&&(t.username=s.utf8()),o.password&&(t.password=s.bin()),t}},function(t,e){class r extends Number{get session_present(){return!0&this}}return t[2]=(t,n)=>{let s=e.for(t,n);return t.flags=s.flags(r),t.reason=s.reason(t.type),5<=t.mqtt_level&&(t.props=s.props()),t}},function(t,e){return t[3]=(t,r)=>{let{hdr:n}=t;t.dup=Boolean(8&n),t.retain=Boolean(1&n);let s=t.qos=n>>1&3,o=e.for(t,r);return t.topic=o.utf8(),0!==s&&(t.pkt_id=o.u16()),5<=t.mqtt_level&&(t.props=o.props()),t.payload=o.flush(),t}},function(t,e){return t[4]=(t,r)=>{let n=e.for(t,r);return t.pkt_id=n.u16(),5<=t.mqtt_level&&(t.reason=n.reason(t.type),t.props=n.props()),t}},function(t,e){return t[5]=t[6]=t[7]=(t,r)=>{let n=e.for(t,r);return t.pkt_id=n.u16(),t.reason=n.reason("pubxxx",e),5<=t.mqtt_level&&(t.props=n.props()),t}},function(t,e){class r extends Number{get qos(){return 3&this}get retain(){return!0&this}get retain_handling(){return this>>2&3}}return t[8]=(t,n)=>{let s=e.for(t,n);t.pkt_id=s.u16(),5<=t.mqtt_level&&(t.props=s.props());let o,i,u=t.topics=[];for(;s.has_more();)o=s.utf8(),i=s.flags(r),u.push({topic:o,opts:i});return t}},function(t,e){return t[9]=t[11]=(t,r)=>{let n=e.for(t,r);t.pkt_id=n.u16(),5<=t.mqtt_level&&(t.props=n.props());let s=t.answers=[];for(;n.has_more();)s.push(n.reason(t.type));return t}},function(t,e){return t[10]=(t,r)=>{let n=e.for(t,r);t.pkt_id=n.u16(),5<=t.mqtt_level&&(t.props=n.props());let s=t.topics=[];for(;n.has_more();)s.push(n.utf8());return t}},function(t){return t[12]=t[13]=t=>t},function(t,e){return t[14]=(t,r)=>{if(r&&5<=t.mqtt_level){let n=e.for(t,r);t.reason=n.reason(t.type),t.props=n.props()}return t}},function(t,e){return t[15]=(t,r)=>{if(5<=t.mqtt_level){let n=e.of(r);t.reason=n.reason(t.type),t.props=n.props()}return t}}],mqtt_reader:a,encode_fns:[function(t,e){const r=new Uint8Array([0,4,77,81,84,84]),n=t=>0|(t.reserved?1:0)|(3&t.will_qos)<<3|(t.clean_start?2:0)|(t.will_flag?4:0)|(t.will_retain?32:0)|(t.password?64:0)|(t.username?128:0);return t.connect=(t,s)=>{let o=e.for(s);o.push(r),o.u8(t);let{will:i,username:u,password:a}=s,p=o.flags(s.flags,n,0|(u?128:0)|(a?64:0)|(i?(t=>4|(3&t.qos)<<3|(t.retain?32:0))(i):0));return o.u16(s.keep_alive),5<=t&&o.props(s.props),o.utf8(s.client_id),4&p&&(5<=t&&o.props(i.props),o.utf8(i.topic),o.bin(i.payload)),128&p&&o.utf8(u),64&p&&o.bin(a),o.as_pkt(16)}},function(t,e){const r=t=>t.session_present?1:0;return t.connack=(t,n)=>{let s=e.for(n);return s.flags(n.flags,r),5<=t?(s.reason(n.reason),s.props(n.props)):s.reason(n.return_code||n.reason),s.as_pkt(32)}},function(t,e){return t.publish=(t,r)=>{let n=(3&r.qos)<<1,s=e.for(r);return s.utf8(r.topic),0!==n&&s.u16(r.pkt_id),5<=t?(s.props(r.props),s.flush(r.payload)):s.flush(r.payload),s.as_pkt(48|n|(r.dup?8:0)|(r.retain?1:0))}},function(t,e){return t.puback=(t,r)=>{let n=e.for(r);return n.u16(r.pkt_id),5<=t&&(n.reason(r.reason),n.props(r.props)),n.as_pkt(64)}},function(t,e){function r(t){return(r,n)=>{let s=e.for(n);return s.u16(n.pkt_id),5<=r?(s.props(n.props),s.reason(n.reason)):s.reason(n.return_code||n.reason),s.as_pkt(t)}}t.pubrec=r(80),t.pubrel=r(98),t.pubcomp=r(112)},function(t,e){const r=t=>0|3&t.qos|(t.retain?4:0)|(3&t.retain_handling)<<2;return t.subscribe=(t,n)=>{let s=e.for(n);s.u16(n.pkt_id),5<=t&&s.props(n.props);let o=r(n);for(let t of n.topics)if("string"==typeof t)s.utf8(t),s.u8(o);else{let[e,n]=Array.isArray(t)?t:[t.topic,t.opts];s.utf8(e),void 0===n?s.u8(o):s.flags(n,r)}return s.as_pkt(130)}},function(t,e){function r(t){return(r,n)=>{let s=e.for(n);s.u16(n.pkt_id),5<=r&&s.props(n.props);for(let t of n.answers)s.reason(t);return s.as_pkt(t)}}t.suback=r(144),t.unsuback=r(176)},function(t,e){return t.unsubscribe=(t,r)=>{let n=e.for(r);n.u16(r.pkt_id),5<=t&&n.props(r.props);for(let t of r.topics)n.utf8(t);return n.as_pkt(162)}},function(t){t.pingreq=()=>new Uint8Array([192,0]),t.pingresp=()=>new Uint8Array([208,0])},function(t,e){return t.disconnect=(t,r)=>{let n=e.for(r);return r&&5<=t&&(r.reason||r.props)&&(n.reason(r.reason),n.props(r.props)),n.as_pkt(224)}},function(t,e){return t.auth=(t,r)=>{if(5>t)throw new Error("Auth packets are only available after MQTT 5.x");let n=e.of(r);return n.reason(r.reason),n.props(r.props),n.as_pkt(240)}}],mqtt_writer:class extends p{props(t){if(!t)return this.u8(0);if(Array.isArray(t)||(t=t.entries?Array.from(t.entries()):Object.entries(t)),0===t.length)return this.u8(0);let e=this.of();for(let[r,s]of t){let t=n.get(r);if(!t)throw new Error(`MQTT unknown property "${r}"`);e[t.op||"one"](s,t)}this.push(e.pack())}one(t,e){this.u8(e.id),this[e.type](t)}kv_obj(t,e){for(let r of Object.entries(t))this.u8(e.id),this.pair(r)}u8_vec(t,e){for(let r of t)this.u8(e.id),this.u8(r)}}};const l=t=>"function"==typeof t,_=t=>"string"==typeof t;const f=(t=>e=>class extends e{static _aliases(){return super._aliases()+" sub_topic:subscribe_topic unsub_topic:unsubscribe_topic"}_init_router(e,r,n){this._subs=[];let s=this.router=n.router=t(e,this,n);return s?.invoke}on_sub(t,e){return t.pkt=e,this._subs.push(t),t}subs_settled(){return Promise.allSettled(this._subs.splice(0,1/0))}subscribe_topic(t,...e){let r=this.router;r.add(t,!0,e.pop());let n=r.mqtt_topic(t);return this.subscribe(n,...e),this}unsubscribe_topic(t,...e){let r=this.router,n=e.at(-1)?.call?e.pop():null;r.remove(t,!0,n);let s=r.mqtt_topic(t);return this.unsubscribe(s,...e)}on_topic(...t){return this.router.add(...t),this}})(m),h=t=>t.replace(/[*].*$/,"#").replace(/:\w[^\/]*/g,"+"),d=(t,e)=>(e=1,t.replace(/#$/,"*").replace(/\+/g,(()=>":$"+e++)));function b(t,e,r){r.done=!0}function m(){let t=[[],[]],e=Symbol(),r=e=>function*(t,e){e=e.replace(/^[\/]*/,"/");for(let r of t)for(let t of r){let r=t.pattern.exec(e);if(r){let e=t.keys?t.keys.reduce(((t,e,n)=>(t[e]=r[1+n],t)),{}):r.groups??r;yield[t.tgt,e,t]}}}(t,e);return{find:r,mqtt_topic:h,add(e,...r){let n=r.pop(),s=r.pop();if(!l(n)){if(n)throw new TypeError;n=b}let o=function(t,e){if(t instanceof RegExp)return{keys:!1,pattern:t};var r,n,s,o,i=[],u="",a=t.split("/");for(a[0]||a.shift();s=a.shift();)"*"===(r=s[0])?(i.push("wild"),u+="/(.*)"):":"===r?(n=s.indexOf("?",1),o=s.indexOf(".",1),i.push(s.substring(1,~n?n:~o?o:s.length)),u+=~n&&!~o?"(?:/([^/]+?))?":"/([^/]+?)",~o&&(u+=(~n?"?":"")+"\\"+s.substring(o))):u+="/"+s;return{keys:i,pattern:new RegExp("^"+u+(e?"(?=$|/)":"/?$"),"i")}}(d(e));return o.topic=e,o.tgt=n,t[s?0:1].push(o),this},remove(e,...r){let n=t;return"boolean"==typeof r[0]&&(n=[t[r.shift()?0:1]]),"string"==typeof e&&(e={topic:e,tgt:r.pop()}),w(n,e)},clear(e){null==e?t=[[],[]]:t[e?0:1]=[]},async invoke(n,s){s.idx=0,s.rm=e;for(let[o,i,u]of r(n.topic)){let r=await o(n,i,s);if(e===r&&w(t,u),s.done)break;s.idx++}1===n.qos&&await s.mqtt.puback(n)}}}function w(t,e){let r=!1;for(let n of t){let t=0;for(let r of n)if(r!==e){if(r.topic===e.topic){if(null==e.tgt)continue;if(r.tgt===e.tgt)continue}n[t++]=r}n.splice(t).length&&(r=!0)}return r}function g(t,e=0,r){let n=0,s=e,o=t[s++],i=127&o;for(;128&o;)i|=(127&(o=t[s++]))<<(n+=7);return t.length<s?[r,e,e]:[i,s,e]}function k(t){let e=new Uint8Array(0),r=0;return n=>{e=0===e.byteLength?n:function(t,e){let r=t.byteLength,n=new Uint8Array(r+e.byteLength);return n.set(t,0),n.set(e,r),n}(e,n);let s=[];for(;e.byteLength>=r;){let[n,o]=g(e,1,NaN),i=n+o;if(!(i<=e.byteLength)){r=i||0;break}let u=e[0],a=0===n?null:e.subarray(o,i);e=e.subarray(i);let p=t.decode_pkt(u,a,t);null!=p&&s.push(p)}return s}}const y=["~","connect","connack","publish","puback","pubrec","pubrel","pubcomp","subscribe","suback","unsubscribe","unsuback","pingreq","pingresp","disconnect","auth"];async function v(t,e,r,n){let s=t[`mqtt_${r.type}`]||t.mqtt_pkt;await(s?.call(t,r,n))}function q(t,e,r,n){e(r.type,r),v(t,0,r,n)}function x(t,e,r){e(r.pkt_id,r)}const j=[t=>{},v,q,v,x,x,x,x,v,x,v,x,q,q,v,q];class T extends Error{constructor(t,e=t.reason){super(`[0x${e.toString(16)}] ${e.reason}`),this.mqtt_pkt=t,this.reason=e}}class ${async connect(t={}){let e=t.client_id;_(e)||(t.client_id=e=this.client_id||this.init_client_id(e)),this.client_id=e,null==t.keep_alive&&(t.keep_alive=60);let r=await this._send0("connect",t,"connack");if(0!=r[0].reason)throw new this.MQTTError(r[0]);return this.conn.on_conn(t,r)}async disconnect(t={}){let e=await this._send0("disconnect",t);return this.conn.on_dis(t,e)}async auth(t={}){let e=await this._send0("auth",t,"auth");if(e[0].reason)throw new this.MQTTError(e[0]);return this.conn.on_auth(t,e)}ping(){return this._send("pingreq",null,"pingresp")}puback({pkt_id:t}){return this._send("puback",{pkt_id:t})}subscribe(t,e,r){t=E(t,e,r);let n=this._send("subscribe",t,t);return this.on_sub?.(n,t)??n}unsubscribe(t,e,r){return t=E(t,e,r),this._send("unsubscribe",t,t)}post(t,e,r){return this.pub({topic:t,payload:e,qos:0},r)}send(t,e,r){return this.pub({topic:t,payload:e,qos:1},r)}store(t,e,r){return this.pub({topic:t,payload:e,qos:1,retain:1},r)}obj_post(t,e,r){return this.pub({topic:t,msg:e,arg:"msg",qos:0},r)}obj_send(t,e,r){return this.pub({topic:t,msg:e,arg:"msg",qos:1},r)}obj_store(t,e,r){return this.pub({topic:t,msg:e,arg:"msg",qos:1,retain:1},r)}async pub(t,e){if(void 0===t.payload){l(e)&&(e={fn_encode:e});let r=t.msg,n=e?.fn_encode;if(null==r||l(r))return r&&(e={...e,fn_encode:r}),r=>this.pub({...t,[t.arg||"payload"]:r},e);t.payload=n?await n(r):JSON.stringify(r)}return e&&(e.props&&(t.props=e.props),e.xform&&(t=e.xform(t)||t)),this._send("publish",t,t.qos?t:null)}_init_dispatch(t){this.constructor?._once_();let e={__proto__:t.on_mqtt_type};return e.mqtt_publish||=this._init_router?.(t,this,e),function(t,e){let r,n=[],s=0,{td:o=1e3,n:i=5}=t?.rotate||{},u=100,a=t=>n[0].set(r,t);return c([]),[c,function(t){return _(t)?r=t:(u=u+1&65535,r=t.pkt_id=u),new Promise(a)}];function p(t,e){for(let r of n){let n=r.get(t);if(n)return r.delete(t),n([e]),!0}return!1}function c(t,r){for(let n of t)j[n.id](e,p,n,r);let u=Date.now();if(u>s)for(s=o+u,n.unshift(new Map);n.length>i;)for(let t of n.pop().values())t([,"expired"])}}(t,e)}static _aliases(){return" publish:pub sub:subscribe unsub:unsubscribe json_post:obj_post json_send:obj_send json_store:obj_store"}static _once_(t=this){t._once_=t=>0;var e,r,n=t.prototype;for(e of(n.MQTTError=T,t._aliases().split(/\s+/)))[e,r]=e.split(":"),n[e]=n[r]}}function E(t,e,r){if(e?.trim&&(r=e,e=null),t=t.trim?{topics:[t],...e}:t[Symbol.iterator]?{topics:[...t],...e}:e?{...t,...e}:t,r){let e=t=>t.trim?r+t:t.map(e);t.topics=t.topics.map(e)}return t}const A=t=>(t.p=new Promise(((e,r)=>{t.a=e,t.e=r})),t);function S(t,e,r){let n={set:o},s=async(...t)=>(await n.p)(...t);return o();function o(){return s!==t[e]&&(A(n).p.then(r,(t=>0)),t[e]=s),n}}function M(t,e,[r,n]){let s,o=S(e,"_send0",(t=>e.conn_emit("on_live",a.has_connected))),i=S(e,"_send",(t=>e.conn_emit("on_ready"))),u=function(t){let e;return r=>{if(e=clearInterval(e),r)return e=setInterval(t,1e3*r),e.unref?.(),!0}}((()=>e._send0("pingreq"))),a=Object.create({ping:(t=a.keep_alive)=>u(t),on_conn:(r,n)=>(a.has_connected=!0,a.keep_alive=t.keep_alive||n[0].props?.server_keep_alive||r.keep_alive,e.conn_emit("on_conn"),t.use_auth?n:a.on_auth(null,n)),on_auth:(r,n)=>(i.a(o.p),0!=t.keep_alive&&a.ping(),e.conn_emit("on_auth",!r),n),on_dis:(t,e)=>(a.reset(!1),e),reset(t){t&&o.e(t),s.e(t),delete a.is_set,a.ready=p(),e.conn_emit("on_disconnect",!1===t,t)},abort:()=>(i.e(err),a.reset(err)),async setup(t,s,i){if(a.is_set)throw new Error;a.is_set=!0,await t;let u=e.mqtt_ctx.mqtt_stream();{let t={mqtt:e};i((e=>r(u.decode(e),t)),a)}s=await s,o.a((async(t,e,r)=>{let o=void 0===r||n(r);return await s(u.encode_pkt(t,e)),o}))}});return a.ready=p(),a;async function p(){s=A({}),u(0),o.set(),i.set();try{return e._send0=await Promise.race([o.p,s.p]),e._send=await Promise.race([i.p,s.p]),!0}catch(t){return!1}}}const L={utf8(t){return new TextDecoder("utf-8").decode(t||this.payload)},json(t){return JSON.parse(this.utf8(t)||null)},text(t){return this.utf8(t)}},N={sess_stg:globalThis.sessionStorage};class O extends ${constructor(t){t={...N,...t},super(),this.with(t),this.sess_stg=t.sess_stg,this.conn=M(t,this,this._init_dispatch(t))}with(t){for(let[e,r]of Object.entries(t))l(r)&&(this[e]=r);return this}static mqtt_ctx(t,e,r=L){let n=class extends(this){};return n.prototype.mqtt_ctx=function(t,e,r=e.pkt_ctx){let n,s=e=>({__proto__:e,get hdr(){return 15&this.b0},get id(){return this.b0>>>4},get type(){return y[this.b0>>>4]},mqtt_level:t}),o=[],i={};for(n of e.encode_fns)n(i,e.mqtt_writer);for(n of e.decode_fns)n(o,e.mqtt_reader);return{pkt_api:r,pkt_ctx:s(r),encode_pkt:(e,r)=>i[e](t,r),decode_pkt(t,e){if(t.map)return k(this)(t)[0];let r=o[t>>>4]||o[0];return r?.({__proto__:this.pkt_ctx,b0:t},e)},mqtt_stream(t=this.pkt_api){let e={__proto__:this,pkt_ctx:s(t)};return e.decode=k(e),e}}}(t,e,r),n}async conn_emit(t,e,r){this.log_conn?.(t,e,r);try{let n=this[await t];if(n)await n.call(this,this,e,r);else if(r)throw r}catch(e){this.on_error(e,t)}}on_error(t,e){console.warn("[[u8-mqtt error: %s]]",e,t)}log_conn(t,e,r){console.info("[[u8-mqtt conn: %s]]",t,e,r)}init_client_id(t=["u8-mqtt--",""]){let e,r=this.sess_stg,n=r?.getItem(e=t.join(" "));return n||(n=t.join(Math.random().toString(36).slice(2)),r?.setItem(e,n)),n}on_live(t,e){if(e)return t.connect()}on_disconnect(t,e){if(!e)return t.on_reconnect?.()}_use_conn(t){return(this.reconnect=t)?.()}with_autoreconnect(t=2e3){return t.toFixed&&(t={delay:t}),this.with({on_reconnect(){this.delay(t.delay||2e3).then(this.reconnect).then(t.reconnect,t.error)}})}delay(t){return new Promise((e=>setTimeout(e,t)))}with_async_iter(t,e){return this.conn.setup(t,e,(async(e,r)=>{try{t=await t;for await(let r of t)e(r);r.reset()}catch(t){r.reset(t)}})),this}with_stream(t,e){return void 0===e&&(e=t),this.with_async_iter(t,(t=>e.write(t)))}with_websock(t){if(!t?.send)return t=new URL(t||"ws://127.0.0.1:9001"),this._use_conn((()=>this.with_websock(new WebSocket(t,["mqtt"]))));t.binaryType="arraybuffer";let e,r=t.readyState;if(1!==r){if(0!==r)throw new Error("WS readyState");e=new Promise((e=>t.onopen=e))}return this.conn.setup(e,(e=>t.send(e)),((e,r)=>{t.onmessage=t=>e(new Uint8Array(t.data)),t.onclose=t=>{if(!t.wasClean){var e=new Error("websocket close");e.code=t.code,e.reason=t.reason}r.reset(e)}})),this}}const U="0.6.4-web",P=f(O.mqtt_ctx(4,c)),Q=f(O.mqtt_ctx(5,c)),I=t=>new P(t),z=t=>new Q(t);export{Q as MQTTClient,P as MQTTClient_v4,Q as MQTTClient_v5,z as default,z as mqtt,I as mqtt_v4,z as mqtt_v5,U as version};
|
|
1
|
+
function t(t,e=[]){for(e.push((t<128?0:128)|127&t);(t>>>=7)>0;)e.push((t<128?0:128)|127&t);return e}function e(t,e=0,r){let n=0,s=e,o=t[s++],i=127&o;for(;128&o;)i|=(127&(o=t[s++]))<<(n+=7);return t.length<s?[r,e,e]:[i,s,e]}const r=()=>function(t,e){for(let[r,n,s,o]of e)o={id:r,type:n,name:s,...o},t.set(r,o).set(s,o);return t}(new Map,[[1,"u8","payload_format_indicator"],[2,"u32","message_expiry_interval"],[3,"utf8","content_type"],[8,"utf8","response_topic"],[9,"bin","correlation_data"],[11,"vint","subscription_identifier"],[17,"u32","session_expiry_interval"],[18,"utf8","assigned_client_identifier"],[19,"u16","server_keep_alive"],[21,"utf8","authentication_method"],[22,"bin","authentication_data"],[23,"u8","request_problem_information"],[24,"u32","will_delay_interval"],[25,"u8","request_response_information"],[26,"utf8","response_information"],[28,"utf8","server_reference"],[31,"utf8","reason_string"],[33,"u16","receive_maximum"],[34,"u16","topic_alias_maximum"],[35,"u16","topic_alias"],[36,"u8","maximum_qos"],[37,"u8","retain_available"],[38,"pair","user_properties",{op:"kv_obj"}],[39,"u32","maximum_packet_size"],[40,"u8","wildcard_subscription_available"],[41,"u8","subscription_identifiers_available",{op:"u8_vec"}],[42,"u8","shared_subscription_available"]]),n=r();class s extends Number{constructor(t,e){super(t),this.reason=`:${(this.ok=t<128)?"ok":"fail"}:${e}`}}class o{static for(t,e){return(new this).of(e,{pkt:t})}of(t,e){let r=(t,e)=>(e=0|r.k,r.k=e+t,e);return{__proto__:this,buf:t,step:r,...e}}has_more(){return this.buf.byteLength>(0|this.step.k)}u8(){return this.buf[this.step(1)]}u16(){let{buf:t,step:e}=this,r=e(2);return t[r]<<8|t[r+1]}u32(){let{buf:t,step:e}=this,r=e(4);return t[r]<<24|t[r+1]<<16|t[r+2]<<8|t[r+3]}vint(){let{buf:t,step:r}=this,[n,s,o]=e(t,0|r.k);return r(s-o),n}bin(){let{buf:t,step:e}=this,r=e(2),n=t[r]<<8|t[r+1];return r=e(n),t.subarray(r,r+n)}utf8(){return new TextDecoder("utf-8").decode(this.bin())}pair(){return[this.utf8(),this.utf8()]}flags(t){return new t(this.buf[this.step(1)])}reason(t){let e=this.buf[this.step(1)];if(null!=e)return new s(e,this._reason_for?.(e,t))}flush(){let{buf:t,step:e}=this;return this.step=this.buf=null,t.subarray(0|e.k)}}function i(t,e){for(let[t,r]of Object.entries(e))e[t]=new Map(r);return class extends t{_reason_for(t,r){return e[r]?.get(t)||e.all.get(t)}warn(t){let e=this.pkt;e.warn?e.warn(t,e):console.warn("[u8-mqtt-packet] "+t)}}}const u={connack:[[1,"conn refused: unacceptable protocol version"],[2,"conn refused: identifier rejected"],[3,"conn refused: server unavailable"],[4,"conn refused: bad user name or password"],[5,"conn refused: not authorized"]],suback:[[0,"qos=0"],[1,"qos=1"],[2,"qos=2"]],unsuback:[[17,"no subscription existed"]],puback:[[16,"no matching subscribers"]],all:[[0,""],[128,"unspecified error"],[131,"implementation specific error"],[135,"not authorized"],[143,"topic filter invalid"],[145,"packet identifier in use"],[146,"packet identifier not found"]]},a=i(class extends o{props(){let{buf:t,step:r}=this,[s,o,i]=e(t,0|r.k,0);if(r(s+o-i),0===s)return null;let u={},a=this.of(t.subarray(o,0|r.k));for(;a.has_more();){let t,e=a.u8(),r=n.get(e);if(!r){u._unknown_=e,this.warn?.(`unknown property: ${e}`);break}t=a[r.type](),u[r.name]=r.op?a[r.op](u[r.name],t):t}return u}kv_obj(t=Object.create(null),[e,r]){return t[e]=r,t}u8_vec(t=[],e){return t.push(e),t}},{...u,auth:[[24,"continue authentication"],[25,"re-authenticate"]],disconnect:[[4,"disconnect with will message"]],all:[...u.all,[129,"malformed packet"],[130,"protocol error"],[132,"unsupported protocol version"],[133,"client identifier not valid"],[134,"bad user name or password"],[136,"server unavailable"],[137,"server busy"],[138,"banned"],[139,"server shutting down"],[140,"bad authentication method"],[141,"keep alive timeout"],[142,"session taken over"],[144,"topic name invalid"],[147,"receive maximum exceeded"],[148,"topic alias invalid"],[149,"packet too large"],[150,"message rate too high"],[151,"quota exceeded"],[152,"administrative action"],[153,"payload format invalid"],[154,"retain not supported"],[155,"qoS not supported"],[156,"use another server"],[157,"server moved"],[158,"shared subscriptions not supported"],[159,"connection rate exceeded"],[160,"maximum connect time"],[161,"subscription identifiers not supported"],[162,"wildcard subscriptions not supported"]]});class p{static for(t){return(new this).of()}of(){return{__proto__:this,$:[]}}static init(){return this}as_pkt(t){return this.pack([t])}push(...t){this.$.push(...t)}pack(e){let r,n,s=0,o=this.$;for(r of(this.$=!1,o))s+=r.length;n=(e=t(s,e)).length;let i=new Uint8Array(n+s);for(r of(i.set(e,0),o))i.set(r,n),n+=r.length;return i}u8(t){this.push([255&t])}u16(t){this.push([t>>>8&255,255&t])}u32(t){this.push([t>>>24&255,t>>>16&255,t>>>8&255,255&t])}vint(e){this.push(t(e))}bin(t){return t?"string"==typeof t?this.utf8(t):(t.length!==t.byteLength&&(t=new Uint8Array(t)),this.u16(t.byteLength),void this.push(t)):this.u16(0)}utf8(t){let e=new TextEncoder("utf-8").encode(t);this.u16(e.byteLength),this.push(e)}pair(t,e){this.utf8(t),this.utf8(e)}flags(t,e,r=0){return void 0!==t&&isNaN(+t)&&(t=e(t,0)),t|=r,this.push([t]),t}reason(t){this.push([0|t])}flush(t){null!=t&&this.push("string"==typeof t?new TextEncoder("utf-8").encode(t):t),this.push=!1}}const c={decode_fns:[function(t,e){class r extends Number{get reserved(){return!0&this}get clean_start(){return!0&this}get will_flag(){return!0&this}get will_qos(){return this>>>3&3}get will_retain(){return!0&this}get password(){return!0&this}get username(){return!0&this}}return t[1]=(t,n)=>{let s=e.for(t,n);if("MQTT"!==s.utf8())throw new Error("Invalid mqtt_connect packet");t.__proto__.mqtt_level=t.mqtt_level=s.u8();let o=t.flags=s.flags(r);if(t.keep_alive=s.u16(),5<=t.mqtt_level&&(t.props=s.props()),t.client_id=s.utf8(),o.will_flag){let e=t.will={};5<=t.mqtt_level&&(e.props=s.props()),e.topic=s.utf8(),e.payload=s.bin(),e.qos=o.will_qos,e.retain=o.will_retain}return o.username&&(t.username=s.utf8()),o.password&&(t.password=s.bin()),t}},function(t,e){class r extends Number{get session_present(){return!0&this}}return t[2]=(t,n)=>{let s=e.for(t,n);return t.flags=s.flags(r),t.reason=s.reason(t.type),5<=t.mqtt_level&&(t.props=s.props()),t}},function(t,e){return t[3]=(t,r)=>{let{hdr:n}=t;t.dup=Boolean(8&n),t.retain=Boolean(1&n);let s=t.qos=n>>1&3,o=e.for(t,r);return t.topic=o.utf8(),0!==s&&(t.pkt_id=o.u16()),5<=t.mqtt_level&&(t.props=o.props()),t.payload=o.flush(),t}},function(t,e){return t[4]=(t,r)=>{let n=e.for(t,r);return t.pkt_id=n.u16(),5<=t.mqtt_level&&(t.reason=n.reason(t.type),t.props=n.props()),t}},function(t,e){return t[5]=t[6]=t[7]=(t,r)=>{let n=e.for(t,r);return t.pkt_id=n.u16(),t.reason=n.reason("pubxxx",e),5<=t.mqtt_level&&(t.props=n.props()),t}},function(t,e){class r extends Number{get qos(){return 3&this}get retain(){return!0&this}get retain_handling(){return this>>2&3}}return t[8]=(t,n)=>{let s=e.for(t,n);t.pkt_id=s.u16(),5<=t.mqtt_level&&(t.props=s.props());let o,i,u=t.topics=[];for(;s.has_more();)o=s.utf8(),i=s.flags(r),u.push({topic:o,opts:i});return t}},function(t,e){return t[9]=t[11]=(t,r)=>{let n=e.for(t,r);t.pkt_id=n.u16(),5<=t.mqtt_level&&(t.props=n.props());let s=t.answers=[];for(;n.has_more();)s.push(n.reason(t.type));return t}},function(t,e){return t[10]=(t,r)=>{let n=e.for(t,r);t.pkt_id=n.u16(),5<=t.mqtt_level&&(t.props=n.props());let s=t.topics=[];for(;n.has_more();)s.push(n.utf8());return t}},function(t){return t[12]=t[13]=t=>t},function(t,e){return t[14]=(t,r)=>{if(r&&5<=t.mqtt_level){let n=e.for(t,r);t.reason=n.reason(t.type),t.props=n.props()}return t}},function(t,e){return t[15]=(t,r)=>{if(5<=t.mqtt_level){let n=e.of(r);t.reason=n.reason(t.type),t.props=n.props()}return t}}],mqtt_reader:a,encode_fns:[function(t,e){const r=new Uint8Array([0,4,77,81,84,84]),n=t=>(t.reserved?1:0)|(3&t.will_qos)<<3|(t.clean_start?2:0)|(t.will_flag?4:0)|(t.will_retain?32:0)|(t.password?64:0)|(t.username?128:0);return t.connect=(t,s)=>{let o=e.for(s);o.push(r),o.u8(t);let{will:i,username:u,password:a}=s,p=o.flags(s.flags,n,(u?128:0)|(a?64:0)|(i?(t=>4|(3&t.qos)<<3|(t.retain?32:0))(i):0));return o.u16(s.keep_alive),5<=t&&o.props(s.props),o.utf8(s.client_id),4&p&&(5<=t&&o.props(i.props),o.utf8(i.topic),o.bin(i.payload)),128&p&&o.utf8(u),64&p&&o.bin(a),o.as_pkt(16)}},function(t,e){const r=t=>t.session_present?1:0;return t.connack=(t,n)=>{let s=e.for(n);return s.flags(n.flags,r),5<=t?(s.reason(n.reason),s.props(n.props)):s.reason(n.return_code||n.reason),s.as_pkt(32)}},function(t,e){return t.publish=(t,r)=>{let n=(3&r.qos)<<1,s=e.for(r);return s.utf8(r.topic),0!==n&&s.u16(r.pkt_id),5<=t?(s.props(r.props),s.flush(r.payload)):s.flush(r.payload),s.as_pkt(48|n|(r.dup?8:0)|(r.retain?1:0))}},function(t,e){return t.puback=(t,r)=>{let n=e.for(r);return n.u16(r.pkt_id),5<=t&&(n.reason(r.reason),n.props(r.props)),n.as_pkt(64)}},function(t,e){function r(t){return(r,n)=>{let s=e.for(n);return s.u16(n.pkt_id),5<=r?(s.props(n.props),s.reason(n.reason)):s.reason(n.return_code||n.reason),s.as_pkt(t)}}t.pubrec=r(80),t.pubrel=r(98),t.pubcomp=r(112)},function(t,e){const r=t=>3&t.qos|(t.retain?4:0)|(3&t.retain_handling)<<2;return t.subscribe=(t,n)=>{let s=e.for(n);s.u16(n.pkt_id),5<=t&&s.props(n.props);let o=r(n);for(let t of n.topics)if("string"==typeof t)s.utf8(t),s.u8(o);else{let[e,n]=Array.isArray(t)?t:[t.topic,t.opts];s.utf8(e),void 0===n?s.u8(o):s.flags(n,r)}return s.as_pkt(130)}},function(t,e){function r(t){return(r,n)=>{let s=e.for(n);s.u16(n.pkt_id),5<=r&&s.props(n.props);for(let t of n.answers)s.reason(t);return s.as_pkt(t)}}t.suback=r(144),t.unsuback=r(176)},function(t,e){return t.unsubscribe=(t,r)=>{let n=e.for(r);n.u16(r.pkt_id),5<=t&&n.props(r.props);for(let t of r.topics)n.utf8(t);return n.as_pkt(162)}},function(t){t.pingreq=()=>new Uint8Array([192,0]),t.pingresp=()=>new Uint8Array([208,0])},function(t,e){return t.disconnect=(t,r)=>{let n=e.for(r);return r&&5<=t&&(r.reason||r.props)&&(n.reason(r.reason),n.props(r.props)),n.as_pkt(224)}},function(t,e){return t.auth=(t,r)=>{if(5>t)throw new Error("Auth packets are only available after MQTT 5.x");let n=e.of(r);return n.reason(r.reason),n.props(r.props),n.as_pkt(240)}}],mqtt_writer:class extends p{props(t){if(!t)return this.u8(0);if(Array.isArray(t)||(t=t.entries?Array.from(t.entries()):Object.entries(t)),0===t.length)return this.u8(0);let e=this.of();for(let[r,s]of t){let t=n.get(r);if(!t)throw new Error(`MQTT unknown property "${r}"`);e[t.op||"one"](s,t)}this.push(e.pack())}one(t,e){this.u8(e.id),this[e.type](t)}kv_obj(t,e){for(let r of Object.entries(t))this.u8(e.id),this.pair(r)}u8_vec(t,e){for(let r of t)this.u8(e.id),this.u8(r)}}};const l=t=>"function"==typeof t,_=t=>"string"==typeof t;const f=(t=>e=>class extends e{static _aliases(){return super._aliases()+" sub_topic:subscribe_topic unsub_topic:unsubscribe_topic"}_init_router(e,r,n){this._subs=[];let s=this.router=n.router=t(e,this,n);return s?.invoke}on_sub(t,e){return t.pkt=e,this._subs.push(t),t}subs_settled(){return Promise.allSettled(this._subs.splice(0,1/0))}subscribe_topic(t,...e){let r=this.router;r.add(t,!0,e.pop());let n=r.mqtt_topic(t);return this.subscribe(n,...e),this}unsubscribe_topic(t,...e){let r=this.router,n=e.at(-1)?.call?e.pop():null;if(r.remove(t,!0,n),0!==r.count(t))return null;let s=r.mqtt_topic(t);return this.unsubscribe(s,...e)}on_topic(...t){return this.router.add(...t),this}})(m),h=t=>t.replace(/[*].*$/,"#").replace(/:\w[^\/]*/g,"+"),d=(t,e)=>(e=1,t.replace(/#$/,"*").replace(/\+/g,(()=>":$"+e++)));function b(t,e,r){r.done=!0}function m(){let t=[[],[]],e=Symbol(),r=e=>function*(t,e){e=e.replace(/^[\/]*/,"/");for(let r of t.flat()){let t=r?.pattern.exec(e);if(t){let e=r.keys;if(e){let n,s=0,o={__proto__:w};for(n of e)o[n]=t[++s];yield[r.tgt,o,r]}else yield[r.tgt,t.groups??t,r]}}}(t,e);return{find:r,mqtt_topic:h,add(e,...r){let n=r.pop(),s=r.pop();if(!l(n)){if(n)throw new TypeError;n=b}let o=function(t,e){if(t instanceof RegExp)return{keys:!1,pattern:t};var r,n,s,o,i=[],u="",a=t.split("/");for(a[0]||a.shift();s=a.shift();)"*"===(r=s[0])?(i.push(r),u+="?"===s[1]?"(?:/(.*))?":"/(.*)"):":"===r?(n=s.indexOf("?",1),o=s.indexOf(".",1),i.push(s.substring(1,~n?n:~o?o:s.length)),u+=~n&&!~o?"(?:/([^/]+?))?":"/([^/]+?)",~o&&(u+=(~n?"?":"")+"\\"+s.substring(o))):u+="/"+s;return{keys:i,pattern:new RegExp("^"+u+(e?"(?=$|/)":"/?$"),"i")}}(d(e));return o.topic=e,o.tgt=n,t[s?0:1].push(o),this},remove(e,...r){let n=t;return"boolean"==typeof r[0]&&(n=[t[r.shift()?0:1]]),"string"==typeof e&&(e={topic:e,tgt:r.pop()}),g(n,e)},count(e){if(!e)return t.reduce(((t,e)=>t+e.length),0);let r=0;for(let n of t)for(let t of n)e===t.topic&&r++;return r},clear(e){null==e?t=[[],[]]:t[e?0:1]=[]},async invoke(n,s){s.idx=0,s.rm=e;for(let[o,i,u]of r(n.topic)){let r=await o(n,i,s);if(e===r&&g(t,u),s.done)break;s.idx++}1===n.qos&&await s.mqtt.puback(n)}}}const w={get wild(){return this["*"]},set wild(t){return this["*"]=wild}};function g(t,e){let r=0;for(let n of t){let t=0;for(let s of n)s.topic!==e.topic||null!=e.tgt&&s.tgt!==e.tgt?n[t++]=s:r++;n.length=t}return r}function k(t,e=0,r){let n=0,s=e,o=t[s++],i=127&o;for(;128&o;)i|=(127&(o=t[s++]))<<(n+=7);return t.length<s?[r,e,e]:[i,s,e]}function y(t){let e=new Uint8Array(0),r=0;return n=>{e=0===e.byteLength?n:function(t,e){let r=t.byteLength,n=new Uint8Array(r+e.byteLength);return n.set(t,0),n.set(e,r),n}(e,n);let s=[];for(;e.byteLength>=r;){let[n,o]=k(e,1,NaN),i=n+o;if(!(i<=e.byteLength)){r=i||0;break}let u=e[0],a=0===n?null:e.subarray(o,i);e=e.subarray(i);let p=t.decode_pkt(u,a,t);null!=p&&s.push(p)}return s}}const v=["~","connect","connack","publish","puback","pubrec","pubrel","pubcomp","subscribe","suback","unsubscribe","unsuback","pingreq","pingresp","disconnect","auth"];async function q(t,e,r,n){let s=t[`mqtt_${r.type}`]||t.mqtt_pkt;await(s?.call(t,r,n))}function x(t,e,r,n){e(r.type,r),q(t,0,r,n)}function j(t,e,r){e(r.pkt_id,r)}const T=[t=>{},q,x,q,j,j,j,j,q,j,q,j,x,x,q,x];class $ extends Error{constructor(t,e=t.reason){super(`[0x${e.toString(16)}] ${e.reason}`),this.mqtt_pkt=t,this.reason=e}}class E{async connect(t={}){let e=t.client_id;_(e)||(t.client_id=e=this.client_id||this.init_client_id(e)),this.client_id=e,null==t.keep_alive&&(t.keep_alive=60);let r=await this._send0("connect",t,"connack");if(0!=r[0].reason)throw new this.MQTTError(r[0]);return this.conn.on_conn(t,r)}async disconnect(t={}){let e=await this._send0("disconnect",t);return this.conn.on_dis(t,e)}async auth(t={}){let e=await this._send0("auth",t,"auth");if(e[0].reason)throw new this.MQTTError(e[0]);return this.conn.on_auth(t,e)}ping(){return this._send("pingreq",null,"pingresp")}puback({pkt_id:t}){return this._send("puback",{pkt_id:t})}subscribe(t,e,r){t=A(t,e,r);let n=this._send("subscribe",t,t);return this.on_sub?.(n,t)??n}unsubscribe(t,e,r){return t=A(t,e,r),this._send("unsubscribe",t,t)}post(t,e,r){return this.pub({topic:t,payload:e,qos:0},r)}send(t,e,r){return this.pub({topic:t,payload:e,qos:1},r)}store(t,e,r){return this.pub({topic:t,payload:e,qos:1,retain:1},r)}obj_post(t,e,r){return this.pub({topic:t,msg:e,arg:"msg",qos:0},r)}obj_send(t,e,r){return this.pub({topic:t,msg:e,arg:"msg",qos:1},r)}obj_store(t,e,r){return this.pub({topic:t,msg:e,arg:"msg",qos:1,retain:1},r)}async pub(t,e){if(void 0===t.payload){l(e)&&(e={fn_encode:e});let r=t.msg,n=e?.fn_encode;if(null==r||l(r))return r&&(e={...e,fn_encode:r}),r=>this.pub({...t,[t.arg||"payload"]:r},e);t.payload=n?await n(r):JSON.stringify(r)}return e&&(e.props&&(t.props=e.props),e.xform&&(t=e.xform(t)||t)),this._send("publish",t,t.qos?t:null)}_init_dispatch(t){this.constructor?._once_();let e={__proto__:t.on_mqtt_type};return e.mqtt_publish||=this._init_router?.(t,this,e),function(t,e){let r,n=[],s=0,{td:o=1e3,n:i=5}=t?.rotate||{},u=100,a=t=>n[0].set(r,t);return c([]),[c,function(t){return _(t)?r=t:(u=u+1&65535,r=t.pkt_id=u),new Promise(a)}];function p(t,e){for(let r of n){let n=r.get(t);if(n)return r.delete(t),n([e]),!0}return!1}function c(t,r){for(let n of t)T[n.id](e,p,n,r);let u=Date.now();if(u>s)for(s=o+u,n.unshift(new Map);n.length>i;)for(let t of n.pop().values())t([,"expired"])}}(t,e)}static _aliases(){return" publish:pub sub:subscribe unsub:unsubscribe json_post:obj_post json_send:obj_send json_store:obj_store"}static _once_(t=this){t._once_=t=>0;var e,r,n=t.prototype;for(e of(n.MQTTError=$,t._aliases().split(/\s+/)))[e,r]=e.split(":"),n[e]=n[r]}}function A(t,e,r){if(e?.trim&&(r=e,e=null),t=t.trim?{topics:[t],...e}:t[Symbol.iterator]?{topics:[...t],...e}:e?{...t,...e}:t,r){let e=t=>t.trim?r+t:t.map(e);t.topics=t.topics.map(e)}return t}const S=t=>(t.p=new Promise(((e,r)=>{t.a=e,t.e=r})),t);function M(t,e,r){let n={set:o},s=async(...t)=>(await n.p)(...t);return o();function o(){return s!==t[e]&&(S(n).p.then(r,(t=>0)),t[e]=s),n}}function L(t,e,[r,n]){let s,o=M(e,"_send0",(t=>e.conn_emit("on_live",a.has_connected))),i=M(e,"_send",(t=>e.conn_emit("on_ready"))),u=function(t){let e;return r=>{if(e=clearInterval(e),r)return e=setInterval(t,1e3*r),e.unref?.(),!0}}((()=>e._send0("pingreq"))),a=Object.create({ping:(t=a.keep_alive)=>u(t),on_conn:(r,n)=>(a.has_connected=!0,a.keep_alive=t.keep_alive||n[0].props?.server_keep_alive||r.keep_alive,e.conn_emit("on_conn"),t.use_auth?n:a.on_auth(null,n)),on_auth:(r,n)=>(i.a(o.p),0!=t.keep_alive&&a.ping(),e.conn_emit("on_auth",!r),n),on_dis:(t,e)=>(a.reset(!1),e),reset(t){t&&o.e(t),s.e(t),delete a.is_set,a.ready=p(),e.conn_emit("on_disconnect",!1===t,t)},abort:()=>(i.e(err),a.reset(err)),async setup(t,s,i){if(a.is_set)throw new Error;a.is_set=!0,await t;let u=e.mqtt_ctx.mqtt_stream();{let t={mqtt:e};i((e=>r(u.decode(e),t)),a)}s=await s,o.a((async(t,e,r)=>{let o=void 0===r||n(r);return await s(u.encode_pkt(t,e)),o}))}});return a.ready=p(),a;async function p(){s=S({}),u(0),o.set(),i.set();try{return e._send0=await Promise.race([o.p,s.p]),e._send=await Promise.race([i.p,s.p]),!0}catch(t){return!1}}}const N={utf8(t){return new TextDecoder("utf-8").decode(t||this.payload)},json(t){return JSON.parse(this.utf8(t)||null)},text(t){return this.utf8(t)}},O={sess_stg:globalThis.sessionStorage};class U extends E{constructor(t){t={...O,...t},super(),this.with(t),this.sess_stg=t.sess_stg,this.conn=L(t,this,this._init_dispatch(t))}with(t){for(let[e,r]of Object.entries(t))l(r)&&(this[e]=r);return this}static mqtt_ctx(t,e,r=N){let n=class extends(this){};return n.prototype.mqtt_ctx=function(t,e,r=e.pkt_ctx){let n,s=e=>({__proto__:e,get hdr(){return 15&this.b0},get id(){return this.b0>>>4},get type(){return v[this.b0>>>4]},mqtt_level:t}),o=[],i={};for(n of e.encode_fns)n(i,e.mqtt_writer);for(n of e.decode_fns)n(o,e.mqtt_reader);return{pkt_api:r,pkt_ctx:s(r),encode_pkt:(e,r)=>i[e](t,r),decode_pkt(t,e){if(t.map)return y(this)(t)[0];let r=o[t>>>4]||o[0];return r?.({__proto__:this.pkt_ctx,b0:t},e)},mqtt_stream(t=this.pkt_api){let e={__proto__:this,pkt_ctx:s(t)};return e.decode=y(e),e}}}(t,e,r),n}async conn_emit(t,e,r){this.log_conn?.(t,e,r);try{let n=this[await t];if(n)await n.call(this,this,e,r);else if(r)throw r}catch(e){this.on_error(e,t)}}on_error(t,e){console.warn("[[u8-mqtt error: %s]]",e,t)}log_conn(t,e,r){console.info("[[u8-mqtt conn: %s]]",t,e,r)}init_client_id(t=["u8-mqtt--",""]){let e,r=this.sess_stg,n=r?.getItem(e=t.join(" "));return n||(n=t.join(Math.random().toString(36).slice(2)),r?.setItem(e,n)),n}on_live(t,e){if(e)return t.connect()}on_disconnect(t,e){if(!e)return t.on_reconnect?.()}_use_conn(t){return(this.reconnect=t)?.()}with_autoreconnect(t=2e3){return t.toFixed&&(t={delay:t}),this.with({on_reconnect(){this.delay(t.delay||2e3).then(this.reconnect).then(t.reconnect,t.error)}})}delay(t){return new Promise((e=>setTimeout(e,t)))}with_async_iter(t,e){return this.conn.setup(t,e,(async(e,r)=>{try{t=await t;for await(let r of t)e(r);r.reset()}catch(t){r.reset(t)}})),this}with_stream(t,e){return void 0===e&&(e=t),this.with_async_iter(t,(t=>e.write(t)))}with_websock(t){if(!t?.send)return t=new URL(t||"ws://127.0.0.1:9001"),this._use_conn((()=>this.with_websock(new WebSocket(t,["mqtt"]))));t.binaryType="arraybuffer";let e,r=t.readyState;if(1!==r){if(0!==r)throw new Error("WS readyState");e=new Promise((e=>t.onopen=e))}return this.conn.setup(e,(e=>t.send(e)),((e,r)=>{t.onmessage=t=>e(new Uint8Array(t.data)),t.onclose=t=>{if(!t.wasClean){var e=new Error("websocket close");e.code=t.code,e.reason=t.reason}r.reset(e)}})),this}}const P="0.6.6-web",Q=f(U.mqtt_ctx(4,c)),I=f(U.mqtt_ctx(5,c)),z=t=>new Q(t),D=t=>new I(t);export{I as MQTTClient,Q as MQTTClient_v4,I as MQTTClient_v5,D as default,D as mqtt,z as mqtt_v4,D as mqtt_v5,P as version};
|
|
Binary file
|
|
Binary file
|
package/esm/web/index.js
CHANGED
|
@@ -666,16 +666,20 @@ const mqtt_opts_v5 =
|
|
|
666
666
|
encode_fns: mqtt_encode_v5,
|
|
667
667
|
mqtt_writer: mqtt_writer_v5, };
|
|
668
668
|
|
|
669
|
-
|
|
670
|
-
|
|
671
|
-
|
|
669
|
+
/**
|
|
670
|
+
* @param {string|RegExp} input The route pattern
|
|
671
|
+
* @param {boolean} [loose] Allow open-ended matching. Ignored with `RegExp` input.
|
|
672
|
+
*/
|
|
673
|
+
function parse(input, loose) {
|
|
674
|
+
if (input instanceof RegExp) return { keys:false, pattern:input };
|
|
675
|
+
var c, o, tmp, ext, keys=[], pattern='', arr = input.split('/');
|
|
672
676
|
arr[0] || arr.shift();
|
|
673
677
|
|
|
674
678
|
while (tmp = arr.shift()) {
|
|
675
679
|
c = tmp[0];
|
|
676
680
|
if (c === '*') {
|
|
677
|
-
keys.push(
|
|
678
|
-
pattern += '/(.*)';
|
|
681
|
+
keys.push(c);
|
|
682
|
+
pattern += tmp[1] === '?' ? '(?:/(.*))?' : '/(.*)';
|
|
679
683
|
} else if (c === ':') {
|
|
680
684
|
o = tmp.indexOf('?', 1);
|
|
681
685
|
ext = tmp.indexOf('.', 1);
|
|
@@ -715,6 +719,7 @@ class AbstractTopicRouter ::
|
|
|
715
719
|
async invoke(pkt, ctx) ::
|
|
716
720
|
add(topic_route, ...args) ::
|
|
717
721
|
remove(topic_route, priority) ::
|
|
722
|
+
count(topic_route) ::
|
|
718
723
|
clear(priority) ::
|
|
719
724
|
find(topic) :: // optional
|
|
720
725
|
mqtt_topic(topic_route)
|
|
@@ -754,6 +759,8 @@ const with_topic_router = mqtt_topic_router =>
|
|
|
754
759
|
|
|
755
760
|
let fn = args.at(-1)?.call ? args.pop() : null;
|
|
756
761
|
router.remove(topic_route, true, fn);
|
|
762
|
+
if (0 !== router.count(topic_route) ) {
|
|
763
|
+
return null}
|
|
757
764
|
|
|
758
765
|
let topic = router.mqtt_topic(topic_route);
|
|
759
766
|
return this.unsubscribe(topic, ...args ) }// topic_prefix
|
|
@@ -822,6 +829,17 @@ function mqtt_topic_path_router() {
|
|
|
822
829
|
query ={topic: query, tgt: args.pop()}; }
|
|
823
830
|
return _route_remove(lst, query)}
|
|
824
831
|
|
|
832
|
+
, count(topic_route) {
|
|
833
|
+
if (! topic_route) {
|
|
834
|
+
return pri_lsts.reduce((r,l) => r+l.length, 0)}
|
|
835
|
+
|
|
836
|
+
let count = 0;
|
|
837
|
+
for (let lst of pri_lsts) {
|
|
838
|
+
for (let route of lst) {
|
|
839
|
+
if (topic_route === route.topic) {
|
|
840
|
+
count++;} } }
|
|
841
|
+
return count}
|
|
842
|
+
|
|
825
843
|
, clear(priority) {
|
|
826
844
|
if (null == priority) {
|
|
827
845
|
pri_lsts = [[],[]]; }// null clears both lists
|
|
@@ -845,38 +863,41 @@ function mqtt_topic_path_router() {
|
|
|
845
863
|
await ctx.mqtt.puback(pkt);} } } }
|
|
846
864
|
|
|
847
865
|
|
|
866
|
+
const _regexparam ={
|
|
867
|
+
get wild() {return this['*']}
|
|
868
|
+
, set wild(v) {return this['*']=wild} };
|
|
869
|
+
|
|
848
870
|
function * _routes_iter(all_route_lists, topic) {
|
|
849
871
|
topic = topic.replace(/^[\/]*/, '/'); // ensure '/' prefix for regexparam library
|
|
850
|
-
for (let
|
|
851
|
-
|
|
852
|
-
|
|
853
|
-
|
|
854
|
-
|
|
855
|
-
|
|
856
|
-
|
|
857
|
-
|
|
858
|
-
|
|
859
|
-
|
|
872
|
+
for (let route of all_route_lists.flat()) {
|
|
873
|
+
let match = route?.pattern.exec(topic);
|
|
874
|
+
if (match) {
|
|
875
|
+
let keys = route.keys;
|
|
876
|
+
if (keys) {
|
|
877
|
+
let k, i=0, params={__proto__:_regexparam};
|
|
878
|
+
for (k of keys) {
|
|
879
|
+
params[k] = match[++i];}
|
|
880
|
+
yield [route.tgt, params, route];}
|
|
881
|
+
else {
|
|
882
|
+
yield [route.tgt, match.groups ?? match, route];} } } }
|
|
860
883
|
|
|
861
884
|
|
|
862
885
|
function _route_remove(all_route_lists, query) {
|
|
863
|
-
let
|
|
886
|
+
let n_removed = 0;
|
|
864
887
|
for (let lst of all_route_lists) {
|
|
865
888
|
let idx_tip = 0;
|
|
866
889
|
for (let route of lst) {
|
|
867
|
-
// skip matching routes to remove from compacted list
|
|
868
|
-
if (route === query) continue
|
|
869
890
|
if (route.topic === query.topic) {
|
|
870
|
-
if (null == query.tgt)
|
|
871
|
-
|
|
891
|
+
if (null == query.tgt || route.tgt === query.tgt) {
|
|
892
|
+
// skip matching routes to remove from compacted list
|
|
893
|
+
n_removed++;
|
|
894
|
+
continue} }
|
|
872
895
|
|
|
873
896
|
lst[idx_tip++] = route;}
|
|
874
897
|
|
|
875
898
|
// truncate remaining list
|
|
876
|
-
|
|
877
|
-
|
|
878
|
-
|
|
879
|
-
return ans}
|
|
899
|
+
lst.length = idx_tip;}
|
|
900
|
+
return n_removed}
|
|
880
901
|
|
|
881
902
|
function decode_varint(u8, i0=0, invalid) {
|
|
882
903
|
let shift=0, i=i0, b=u8[i++], n=(b & 0x7f);
|
|
@@ -1491,7 +1512,7 @@ class MQTTCore extends MQTTBase {
|
|
|
1491
1512
|
|
|
1492
1513
|
return this} }
|
|
1493
1514
|
|
|
1494
|
-
const version = '0.6.
|
|
1515
|
+
const version = '0.6.6-web';
|
|
1495
1516
|
|
|
1496
1517
|
const MQTTClient_v4 = /* #__PURE__ */
|
|
1497
1518
|
with_topic_path_router(
|