u8-mqtt 0.6.3 → 0.6.5

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 (96) hide show
  1. package/cjs/basic-v4.cjs +1 -1
  2. package/cjs/basic-v5.cjs +1 -1
  3. package/cjs/full-v4.cjs +61 -40
  4. package/cjs/full-v4.cjs.map +1 -1
  5. package/cjs/full-v5.cjs +61 -40
  6. package/cjs/full-v5.cjs.map +1 -1
  7. package/cjs/index.cjs +61 -40
  8. package/cjs/index.cjs.map +1 -1
  9. package/cjs/v4.cjs +61 -40
  10. package/cjs/v4.cjs.map +1 -1
  11. package/cjs/v5.cjs +61 -40
  12. package/cjs/v5.cjs.map +1 -1
  13. package/code/router_path.jsy +47 -33
  14. package/code/with_topic_router.jsy +4 -1
  15. package/esm/basic-v4.js +1 -1
  16. package/esm/basic-v5.js +1 -1
  17. package/esm/deno/basic-v4.js +1 -1
  18. package/esm/deno/basic-v5.js +1 -1
  19. package/esm/deno/full-v4.js +61 -40
  20. package/esm/deno/full-v4.js.map +1 -1
  21. package/esm/deno/full-v5.js +61 -40
  22. package/esm/deno/full-v5.js.map +1 -1
  23. package/esm/deno/index.js +61 -40
  24. package/esm/deno/index.js.map +1 -1
  25. package/esm/deno/v4.js +61 -40
  26. package/esm/deno/v4.js.map +1 -1
  27. package/esm/deno/v5.js +61 -40
  28. package/esm/deno/v5.js.map +1 -1
  29. package/esm/full-v4.js +61 -40
  30. package/esm/full-v4.js.map +1 -1
  31. package/esm/full-v5.js +61 -40
  32. package/esm/full-v5.js.map +1 -1
  33. package/esm/index.js +61 -40
  34. package/esm/index.js.map +1 -1
  35. package/esm/node/basic-v4.js +1 -1
  36. package/esm/node/basic-v4.mjs +1 -1
  37. package/esm/node/basic-v5.js +1 -1
  38. package/esm/node/basic-v5.mjs +1 -1
  39. package/esm/node/full-v4.js +61 -40
  40. package/esm/node/full-v4.js.map +1 -1
  41. package/esm/node/full-v4.mjs +61 -40
  42. package/esm/node/full-v4.mjs.map +1 -1
  43. package/esm/node/full-v5.js +61 -40
  44. package/esm/node/full-v5.js.map +1 -1
  45. package/esm/node/full-v5.mjs +61 -40
  46. package/esm/node/full-v5.mjs.map +1 -1
  47. package/esm/node/index.js +61 -40
  48. package/esm/node/index.js.map +1 -1
  49. package/esm/node/index.mjs +61 -40
  50. package/esm/node/index.mjs.map +1 -1
  51. package/esm/node/v4.js +61 -40
  52. package/esm/node/v4.js.map +1 -1
  53. package/esm/node/v4.mjs +61 -40
  54. package/esm/node/v4.mjs.map +1 -1
  55. package/esm/node/v5.js +61 -40
  56. package/esm/node/v5.js.map +1 -1
  57. package/esm/node/v5.mjs +61 -40
  58. package/esm/node/v5.mjs.map +1 -1
  59. package/esm/v4.js +61 -40
  60. package/esm/v4.js.map +1 -1
  61. package/esm/v5.js +61 -40
  62. package/esm/v5.js.map +1 -1
  63. package/esm/web/basic-v4.js +1 -1
  64. package/esm/web/basic-v4.min.js +1 -1
  65. package/esm/web/basic-v4.min.js.br +0 -0
  66. package/esm/web/basic-v4.min.js.gz +0 -0
  67. package/esm/web/basic-v5.js +1 -1
  68. package/esm/web/basic-v5.min.js +1 -1
  69. package/esm/web/basic-v5.min.js.br +0 -0
  70. package/esm/web/basic-v5.min.js.gz +0 -0
  71. package/esm/web/full-v4.js +61 -40
  72. package/esm/web/full-v4.js.map +1 -1
  73. package/esm/web/full-v4.min.js +1 -1
  74. package/esm/web/full-v4.min.js.br +0 -0
  75. package/esm/web/full-v4.min.js.gz +0 -0
  76. package/esm/web/full-v5.js +61 -40
  77. package/esm/web/full-v5.js.map +1 -1
  78. package/esm/web/full-v5.min.js +1 -1
  79. package/esm/web/full-v5.min.js.br +0 -0
  80. package/esm/web/full-v5.min.js.gz +0 -0
  81. package/esm/web/index.js +61 -40
  82. package/esm/web/index.js.map +1 -1
  83. package/esm/web/index.min.js +1 -1
  84. package/esm/web/index.min.js.br +0 -0
  85. package/esm/web/index.min.js.gz +0 -0
  86. package/esm/web/v4.js +61 -40
  87. package/esm/web/v4.js.map +1 -1
  88. package/esm/web/v4.min.js +1 -1
  89. package/esm/web/v4.min.js.br +0 -0
  90. package/esm/web/v4.min.js.gz +0 -0
  91. package/esm/web/v5.js +61 -40
  92. package/esm/web/v5.js.map +1 -1
  93. package/esm/web/v5.min.js +1 -1
  94. package/esm/web/v5.min.js.br +0 -0
  95. package/esm/web/v5.min.js.gz +0 -0
  96. package/package.json +5 -5
package/esm/v5.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
- function parse(str, loose) {
670
- if (str instanceof RegExp) return { keys:false, pattern:str };
671
- var c, o, tmp, ext, keys=[], pattern='', arr = str.split('/');
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('wild');
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);
@@ -751,7 +755,10 @@ const with_topic_router = mqtt_topic_router =>
751
755
  // alias: unsub_topic
752
756
  unsubscribe_topic(topic_route, ...args) {
753
757
  let router = this.router;
754
- router.remove(topic_route, true);
758
+
759
+ let fn = args.at(-1)?.call ? args.pop() : null;
760
+ router.remove(topic_route, true, fn);
761
+
755
762
  let topic = router.mqtt_topic(topic_route);
756
763
  return this.unsubscribe(topic, ...args ) }// topic_prefix
757
764
 
@@ -804,65 +811,79 @@ function mqtt_topic_path_router() {
804
811
  if (fn) {throw new TypeError()}
805
812
  fn = _ignore;}
806
813
 
807
- let rte = parse(as_topic_path(topic_route));
808
-
809
- rte.key = topic_route;
810
- rte.tgt = fn;
811
- pri_lsts[priority ? 0 : 1].push(rte);
814
+ let route = parse(as_topic_path(topic_route));
815
+ route.topic = topic_route;
816
+ route.tgt = fn;
817
+ pri_lsts[priority ? 0 : 1].push(route);
812
818
  return this}
813
819
 
814
- , remove(topic_route, priority) {
815
- let lst = pri_lsts[priority ? 0 : 1];
816
- return _route_remove([lst], topic_route)}
820
+ , remove(query, ...args) {
821
+ let lst = pri_lsts;
822
+ if ('boolean' === typeof args[0]) {
823
+ lst = [pri_lsts[args.shift() ? 0 : 1]];}
824
+
825
+ if ('string' === typeof query) {
826
+ query ={topic: query, tgt: args.pop()}; }
827
+ return _route_remove(lst, query)}
817
828
 
818
829
  , clear(priority) {
819
- pri_lsts[priority ? 0 : 1] = [];
820
830
  if (null == priority) {
821
- pri_lsts[1] = []; } }// null clears both lists
831
+ pri_lsts = [[],[]]; }// null clears both lists
832
+ else {
833
+ pri_lsts[priority ? 0 : 1] = [];} }
822
834
 
823
835
  , async invoke(pkt, ctx) {
824
836
  ctx.idx = 0;
825
837
  ctx.rm = rm;
826
838
 
827
- for (let [fn, params] of find(pkt.topic)) {
839
+ for (let [fn, params, route] of find(pkt.topic)) {
828
840
  let res = await fn(pkt, params, ctx);
829
841
 
830
842
  if (rm === res) {
831
- _route_remove(pri_lsts, fn);}
843
+ _route_remove(pri_lsts, route);}
832
844
 
833
- if (ctx.done) {
834
- break}
845
+ if (ctx.done) {break}
835
846
  else ctx.idx++;}
836
847
 
837
848
  if (1 === pkt.qos) {
838
849
  await ctx.mqtt.puback(pkt);} } } }
839
850
 
840
851
 
852
+ const _regexparam ={
853
+ get wild() {return this['*']}
854
+ , set wild(v) {return this['*']=wild} };
855
+
841
856
  function * _routes_iter(all_route_lists, topic) {
842
857
  topic = topic.replace(/^[\/]*/, '/'); // ensure '/' prefix for regexparam library
843
- for (let route_list of all_route_lists) {
844
- for (let {keys, pattern, tgt} of route_list) {
845
- let match = pattern.exec(topic);
846
- if (match) {
847
- let params = keys
848
- ? keys.reduce(
849
- (o, k, i) => (o[k] = match[1+i], o)
850
- , {})
851
- : match.groups ?? match;
852
- yield [tgt, params];} } } }
858
+ for (let route of all_route_lists.flat()) {
859
+ let match = route?.pattern.exec(topic);
860
+ if (match) {
861
+ let keys = route.keys;
862
+ if (keys) {
863
+ let k, i=0, params={__proto__:_regexparam};
864
+ for (k of keys) {
865
+ params[k] = match[++i];}
866
+ yield [route.tgt, params, route];}
867
+ else {
868
+ yield [route.tgt, match.groups ?? match, route];} } } }
853
869
 
854
870
 
855
871
  function _route_remove(all_route_lists, query) {
856
- let fn_match = route =>(
857
- route===query
858
- || route.tgt===query
859
- || route.key===query);
872
+ let ans = false;
860
873
  for (let lst of all_route_lists) {
861
- let i = lst.findIndex(fn_match);
862
- if (0 <= i) {
863
- lst.splice(i,1);
864
- return true} }
865
- return false}
874
+ let idx_tip = 0;
875
+ for (let route of lst) {
876
+ // skip matching routes to remove from compacted list
877
+ let skip = route === query;
878
+ if (!skip && route.topic === query.topic)
879
+ skip = (null == query.tgt) || (route.tgt === query.tgt);
880
+
881
+ if (!skip) lst[idx_tip++] = route;}
882
+
883
+ // truncate remaining list
884
+ lst.length = idx_tip;}
885
+
886
+ return ans}
866
887
 
867
888
  function decode_varint(u8, i0=0, invalid) {
868
889
  let shift=0, i=i0, b=u8[i++], n=(b & 0x7f);
@@ -1477,7 +1498,7 @@ class MQTTCore extends MQTTBase {
1477
1498
 
1478
1499
  return this} }
1479
1500
 
1480
- const version = '0.6.3';
1501
+ const version = '0.6.5';
1481
1502
 
1482
1503
  const MQTTClient_v4 = /* #__PURE__ */
1483
1504
  with_topic_path_router(