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