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
@@ -649,16 +649,20 @@ const mqtt_opts_v4 =
649
649
  encode_fns: mqtt_encode_v4,
650
650
  mqtt_writer: mqtt_writer_v4, };
651
651
 
652
- function parse(str, loose) {
653
- if (str instanceof RegExp) return { keys:false, pattern:str };
654
- var c, o, tmp, ext, keys=[], pattern='', arr = str.split('/');
652
+ /**
653
+ * @param {string|RegExp} input The route pattern
654
+ * @param {boolean} [loose] Allow open-ended matching. Ignored with `RegExp` input.
655
+ */
656
+ function parse(input, loose) {
657
+ if (input instanceof RegExp) return { keys:false, pattern:input };
658
+ var c, o, tmp, ext, keys=[], pattern='', arr = input.split('/');
655
659
  arr[0] || arr.shift();
656
660
 
657
661
  while (tmp = arr.shift()) {
658
662
  c = tmp[0];
659
663
  if (c === '*') {
660
- keys.push('wild');
661
- pattern += '/(.*)';
664
+ keys.push(c);
665
+ pattern += tmp[1] === '?' ? '(?:/(.*))?' : '/(.*)';
662
666
  } else if (c === ':') {
663
667
  o = tmp.indexOf('?', 1);
664
668
  ext = tmp.indexOf('.', 1);
@@ -734,7 +738,10 @@ const with_topic_router = mqtt_topic_router =>
734
738
  // alias: unsub_topic
735
739
  unsubscribe_topic(topic_route, ...args) {
736
740
  let router = this.router;
737
- router.remove(topic_route, true);
741
+
742
+ let fn = args.at(-1)?.call ? args.pop() : null;
743
+ router.remove(topic_route, true, fn);
744
+
738
745
  let topic = router.mqtt_topic(topic_route);
739
746
  return this.unsubscribe(topic, ...args ) }// topic_prefix
740
747
 
@@ -787,65 +794,79 @@ function mqtt_topic_path_router() {
787
794
  if (fn) {throw new TypeError()}
788
795
  fn = _ignore;}
789
796
 
790
- let rte = parse(as_topic_path(topic_route));
791
-
792
- rte.key = topic_route;
793
- rte.tgt = fn;
794
- pri_lsts[priority ? 0 : 1].push(rte);
797
+ let route = parse(as_topic_path(topic_route));
798
+ route.topic = topic_route;
799
+ route.tgt = fn;
800
+ pri_lsts[priority ? 0 : 1].push(route);
795
801
  return this}
796
802
 
797
- , remove(topic_route, priority) {
798
- let lst = pri_lsts[priority ? 0 : 1];
799
- return _route_remove([lst], topic_route)}
803
+ , remove(query, ...args) {
804
+ let lst = pri_lsts;
805
+ if ('boolean' === typeof args[0]) {
806
+ lst = [pri_lsts[args.shift() ? 0 : 1]];}
807
+
808
+ if ('string' === typeof query) {
809
+ query ={topic: query, tgt: args.pop()}; }
810
+ return _route_remove(lst, query)}
800
811
 
801
812
  , clear(priority) {
802
- pri_lsts[priority ? 0 : 1] = [];
803
813
  if (null == priority) {
804
- pri_lsts[1] = []; } }// null clears both lists
814
+ pri_lsts = [[],[]]; }// null clears both lists
815
+ else {
816
+ pri_lsts[priority ? 0 : 1] = [];} }
805
817
 
806
818
  , async invoke(pkt, ctx) {
807
819
  ctx.idx = 0;
808
820
  ctx.rm = rm;
809
821
 
810
- for (let [fn, params] of find(pkt.topic)) {
822
+ for (let [fn, params, route] of find(pkt.topic)) {
811
823
  let res = await fn(pkt, params, ctx);
812
824
 
813
825
  if (rm === res) {
814
- _route_remove(pri_lsts, fn);}
826
+ _route_remove(pri_lsts, route);}
815
827
 
816
- if (ctx.done) {
817
- break}
828
+ if (ctx.done) {break}
818
829
  else ctx.idx++;}
819
830
 
820
831
  if (1 === pkt.qos) {
821
832
  await ctx.mqtt.puback(pkt);} } } }
822
833
 
823
834
 
835
+ const _regexparam ={
836
+ get wild() {return this['*']}
837
+ , set wild(v) {return this['*']=wild} };
838
+
824
839
  function * _routes_iter(all_route_lists, topic) {
825
840
  topic = topic.replace(/^[\/]*/, '/'); // ensure '/' prefix for regexparam library
826
- for (let route_list of all_route_lists) {
827
- for (let {keys, pattern, tgt} of route_list) {
828
- let match = pattern.exec(topic);
829
- if (match) {
830
- let params = keys
831
- ? keys.reduce(
832
- (o, k, i) => (o[k] = match[1+i], o)
833
- , {})
834
- : match.groups ?? match;
835
- yield [tgt, params];} } } }
841
+ for (let route of all_route_lists.flat()) {
842
+ let match = route?.pattern.exec(topic);
843
+ if (match) {
844
+ let keys = route.keys;
845
+ if (keys) {
846
+ let k, i=0, params={__proto__:_regexparam};
847
+ for (k of keys) {
848
+ params[k] = match[++i];}
849
+ yield [route.tgt, params, route];}
850
+ else {
851
+ yield [route.tgt, match.groups ?? match, route];} } } }
836
852
 
837
853
 
838
854
  function _route_remove(all_route_lists, query) {
839
- let fn_match = route =>(
840
- route===query
841
- || route.tgt===query
842
- || route.key===query);
855
+ let ans = false;
843
856
  for (let lst of all_route_lists) {
844
- let i = lst.findIndex(fn_match);
845
- if (0 <= i) {
846
- lst.splice(i,1);
847
- return true} }
848
- return false}
857
+ let idx_tip = 0;
858
+ for (let route of lst) {
859
+ // skip matching routes to remove from compacted list
860
+ let skip = route === query;
861
+ if (!skip && route.topic === query.topic)
862
+ skip = (null == query.tgt) || (route.tgt === query.tgt);
863
+
864
+ if (!skip) lst[idx_tip++] = route;}
865
+
866
+ // truncate remaining list
867
+ lst.length = idx_tip;}
868
+
869
+ return ans}
849
870
 
850
871
  function decode_varint(u8, i0=0, invalid) {
851
872
  let shift=0, i=i0, b=u8[i++], n=(b & 0x7f);
@@ -1460,7 +1481,7 @@ class MQTTCore extends MQTTBase {
1460
1481
 
1461
1482
  return this} }
1462
1483
 
1463
- const version = '0.6.3-node';
1484
+ const version = '0.6.5-node';
1464
1485
 
1465
1486
  const MQTTClient_v4 = /* #__PURE__ */
1466
1487
  with_topic_path_router(