u8-mqtt 0.6.6 → 0.6.7

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.
Files changed (109) hide show
  1. package/cjs/basic-v4.cjs +16 -11
  2. package/cjs/basic-v4.cjs.map +1 -1
  3. package/cjs/basic-v5.cjs +16 -11
  4. package/cjs/basic-v5.cjs.map +1 -1
  5. package/cjs/full-v4.cjs +17 -12
  6. package/cjs/full-v4.cjs.map +1 -1
  7. package/cjs/full-v5.cjs +17 -12
  8. package/cjs/full-v5.cjs.map +1 -1
  9. package/cjs/index.cjs +17 -12
  10. package/cjs/index.cjs.map +1 -1
  11. package/cjs/v4.cjs +17 -12
  12. package/cjs/v4.cjs.map +1 -1
  13. package/cjs/v5.cjs +17 -12
  14. package/cjs/v5.cjs.map +1 -1
  15. package/code/_conn.jsy +5 -4
  16. package/code/base.jsy +3 -2
  17. package/code/core.jsy +7 -4
  18. package/esm/basic-v4.js +16 -11
  19. package/esm/basic-v4.js.map +1 -1
  20. package/esm/basic-v5.js +16 -11
  21. package/esm/basic-v5.js.map +1 -1
  22. package/esm/deno/basic-v4.js +16 -11
  23. package/esm/deno/basic-v4.js.map +1 -1
  24. package/esm/deno/basic-v5.js +16 -11
  25. package/esm/deno/basic-v5.js.map +1 -1
  26. package/esm/deno/full-v4.js +17 -12
  27. package/esm/deno/full-v4.js.map +1 -1
  28. package/esm/deno/full-v5.js +17 -12
  29. package/esm/deno/full-v5.js.map +1 -1
  30. package/esm/deno/index.js +17 -12
  31. package/esm/deno/index.js.map +1 -1
  32. package/esm/deno/v4.js +17 -12
  33. package/esm/deno/v4.js.map +1 -1
  34. package/esm/deno/v5.js +17 -12
  35. package/esm/deno/v5.js.map +1 -1
  36. package/esm/full-v4.js +17 -12
  37. package/esm/full-v4.js.map +1 -1
  38. package/esm/full-v5.js +17 -12
  39. package/esm/full-v5.js.map +1 -1
  40. package/esm/index.js +17 -12
  41. package/esm/index.js.map +1 -1
  42. package/esm/node/basic-v4.js +16 -11
  43. package/esm/node/basic-v4.js.map +1 -1
  44. package/esm/node/basic-v4.mjs +16 -11
  45. package/esm/node/basic-v4.mjs.map +1 -1
  46. package/esm/node/basic-v5.js +16 -11
  47. package/esm/node/basic-v5.js.map +1 -1
  48. package/esm/node/basic-v5.mjs +16 -11
  49. package/esm/node/basic-v5.mjs.map +1 -1
  50. package/esm/node/full-v4.js +17 -12
  51. package/esm/node/full-v4.js.map +1 -1
  52. package/esm/node/full-v4.mjs +17 -12
  53. package/esm/node/full-v4.mjs.map +1 -1
  54. package/esm/node/full-v5.js +17 -12
  55. package/esm/node/full-v5.js.map +1 -1
  56. package/esm/node/full-v5.mjs +17 -12
  57. package/esm/node/full-v5.mjs.map +1 -1
  58. package/esm/node/index.js +17 -12
  59. package/esm/node/index.js.map +1 -1
  60. package/esm/node/index.mjs +17 -12
  61. package/esm/node/index.mjs.map +1 -1
  62. package/esm/node/v4.js +17 -12
  63. package/esm/node/v4.js.map +1 -1
  64. package/esm/node/v4.mjs +17 -12
  65. package/esm/node/v4.mjs.map +1 -1
  66. package/esm/node/v5.js +17 -12
  67. package/esm/node/v5.js.map +1 -1
  68. package/esm/node/v5.mjs +17 -12
  69. package/esm/node/v5.mjs.map +1 -1
  70. package/esm/v4.js +17 -12
  71. package/esm/v4.js.map +1 -1
  72. package/esm/v5.js +17 -12
  73. package/esm/v5.js.map +1 -1
  74. package/esm/web/basic-v4.js +16 -11
  75. package/esm/web/basic-v4.js.map +1 -1
  76. package/esm/web/basic-v4.min.js +1 -1
  77. package/esm/web/basic-v4.min.js.br +0 -0
  78. package/esm/web/basic-v4.min.js.gz +0 -0
  79. package/esm/web/basic-v5.js +16 -11
  80. package/esm/web/basic-v5.js.map +1 -1
  81. package/esm/web/basic-v5.min.js +1 -1
  82. package/esm/web/basic-v5.min.js.br +0 -0
  83. package/esm/web/basic-v5.min.js.gz +0 -0
  84. package/esm/web/full-v4.js +17 -12
  85. package/esm/web/full-v4.js.map +1 -1
  86. package/esm/web/full-v4.min.js +1 -1
  87. package/esm/web/full-v4.min.js.br +0 -0
  88. package/esm/web/full-v4.min.js.gz +0 -0
  89. package/esm/web/full-v5.js +17 -12
  90. package/esm/web/full-v5.js.map +1 -1
  91. package/esm/web/full-v5.min.js +1 -1
  92. package/esm/web/full-v5.min.js.br +0 -0
  93. package/esm/web/full-v5.min.js.gz +0 -0
  94. package/esm/web/index.js +17 -12
  95. package/esm/web/index.js.map +1 -1
  96. package/esm/web/index.min.js +1 -1
  97. package/esm/web/index.min.js.br +0 -0
  98. package/esm/web/index.min.js.gz +0 -0
  99. package/esm/web/v4.js +17 -12
  100. package/esm/web/v4.js.map +1 -1
  101. package/esm/web/v4.min.js +1 -1
  102. package/esm/web/v4.min.js.br +0 -0
  103. package/esm/web/v4.min.js.gz +0 -0
  104. package/esm/web/v5.js +17 -12
  105. package/esm/web/v5.js.map +1 -1
  106. package/esm/web/v5.min.js +1 -1
  107. package/esm/web/v5.min.js.br +0 -0
  108. package/esm/web/v5.min.js.gz +0 -0
  109. package/package.json +16 -17
@@ -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=>(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};
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){if(t instanceof RegExp)return{keys:!1,pattern:t};var e,r,n,s,o=[],i="",u=t.split("/");for(u[0]||u.shift();n=u.shift();)"*"===(e=n[0])?(o.push(e),i+="?"===n[1]?"(?:/(.*))?":"/(.*)"):":"===e?(r=n.indexOf("?",1),s=n.indexOf(".",1),o.push(n.substring(1,~r?r:~s?s:n.length)),i+=~r&&!~s?"(?:/([^/]+?))?":"/([^/]+?)",~s&&(i+=(~r?"?":"")+"\\"+n.substring(s))):i+="/"+n;return{keys:o,pattern:new RegExp("^"+i+"/?$","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 E 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=this._send0("disconnect",t);return await this.conn.on_dis(t,e),await 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=E,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),a.is_set&&(delete a.is_set,a.ready=p(),e.conn_emit("on_disconnect",!1===t,t))},abort:t=>(i.e(t),a.reset(t)),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 ${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,r){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,t.jitter).then(this.reconnect).then(t.reconnect,t.error)}})}delay(t,e=.2*t){return new Promise((r=>setTimeout(r,0|t+e*Math.random())))}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.onerror=t=>{r.reset(new Error("websocket error"))},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.7-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
@@ -693,7 +693,7 @@ function parse(input, loose) {
693
693
 
694
694
  return {
695
695
  keys: keys,
696
- pattern: new RegExp('^' + pattern + (loose ? '(?=$|\/)' : '\/?$'), 'i')
696
+ pattern: new RegExp('^' + pattern + ('\/?$'), 'i')
697
697
  };
698
698
  }
699
699
 
@@ -1107,8 +1107,9 @@ class MQTTBase {
1107
1107
  return this.conn.on_conn(pkt, response)}
1108
1108
 
1109
1109
  async disconnect(pkt={}) {
1110
- let response = await this._send0('disconnect', pkt);
1111
- return this.conn.on_dis(pkt, response)}
1110
+ let response = this._send0('disconnect', pkt);
1111
+ await this.conn.on_dis(pkt, response);
1112
+ return await response}
1112
1113
 
1113
1114
  async auth(pkt={}) {
1114
1115
  let response = await this._send0('auth', pkt, 'auth');
@@ -1273,11 +1274,12 @@ function _mqtt_conn(opt, client, [on_mqtt, pkt_future]) {
1273
1274
  _dfn_send0.e(err); }// send error to uses of _send0 (connect, auth)
1274
1275
  _abort.e(err); // abort in-progress connections
1275
1276
 
1276
- delete conn.is_set;
1277
- conn.ready = handshake();
1278
- client.conn_emit('on_disconnect', false===err, err);}
1277
+ if (conn.is_set) {
1278
+ delete conn.is_set;
1279
+ conn.ready = handshake();
1280
+ client.conn_emit('on_disconnect', false===err, err);} }
1279
1281
 
1280
- , abort() {
1282
+ , abort(err) {
1281
1283
  _dfn_ready.e(err); // abort all messages awaiting ready state
1282
1284
  return conn.reset(err)}
1283
1285
 
@@ -1391,7 +1393,7 @@ class MQTTCore extends MQTTBase {
1391
1393
 
1392
1394
  // on_ready(client) ::
1393
1395
  // on_reconnect(client) ::
1394
- on_disconnect(client, intentional) {
1396
+ on_disconnect(client, intentional, err) {
1395
1397
  if (! intentional) {
1396
1398
  return client.on_reconnect?.()} }
1397
1399
 
@@ -1401,12 +1403,12 @@ class MQTTCore extends MQTTBase {
1401
1403
  if (opt.toFixed) {opt ={delay: opt};}
1402
1404
  return this.with({
1403
1405
  on_reconnect() {
1404
- this.delay(opt.delay || 2000)
1406
+ this.delay(opt.delay || 2000, opt.jitter)
1405
1407
  .then(this.reconnect)
1406
1408
  .then(opt.reconnect, opt.error);} }) }
1407
1409
 
1408
- delay(ms) {
1409
- return new Promise(done => setTimeout(done, ms)) }
1410
+ delay(ms, ms_jitter=0.2*ms) {
1411
+ return new Promise(done => setTimeout(done, 0 | (ms + ms_jitter*Math.random()))) }
1410
1412
 
1411
1413
  with_async_iter(async_iter, write_u8_pkt) {
1412
1414
  this.conn.setup(async_iter,
@@ -1502,6 +1504,9 @@ class MQTTCore extends MQTTBase {
1502
1504
  websock.onmessage = evt =>(
1503
1505
  on_mqtt_chunk(new Uint8Array(evt.data)) );
1504
1506
 
1507
+ websock.onerror = evt => {
1508
+ conn.reset(new Error('websocket error'));};
1509
+
1505
1510
  websock.onclose = evt => {
1506
1511
  if (! evt.wasClean) {
1507
1512
  var err = new Error('websocket close');
@@ -1512,7 +1517,7 @@ class MQTTCore extends MQTTBase {
1512
1517
 
1513
1518
  return this} }
1514
1519
 
1515
- const version = '0.6.6-web';
1520
+ const version = '0.6.7-web';
1516
1521
 
1517
1522
  const MQTTClient_v4 = /* #__PURE__ */
1518
1523
  with_topic_path_router(