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/full-v5.js CHANGED
@@ -841,16 +841,20 @@ const mqtt_opts_v5 =
841
841
  encode_fns: mqtt_encode_v5,
842
842
  mqtt_writer: mqtt_writer_v5, };
843
843
 
844
- function parse(str, loose) {
845
- if (str instanceof RegExp) return { keys:false, pattern:str };
846
- var c, o, tmp, ext, keys=[], pattern='', arr = str.split('/');
844
+ /**
845
+ * @param {string|RegExp} input The route pattern
846
+ * @param {boolean} [loose] Allow open-ended matching. Ignored with `RegExp` input.
847
+ */
848
+ function parse(input, loose) {
849
+ if (input instanceof RegExp) return { keys:false, pattern:input };
850
+ var c, o, tmp, ext, keys=[], pattern='', arr = input.split('/');
847
851
  arr[0] || arr.shift();
848
852
 
849
853
  while (tmp = arr.shift()) {
850
854
  c = tmp[0];
851
855
  if (c === '*') {
852
- keys.push('wild');
853
- pattern += '/(.*)';
856
+ keys.push(c);
857
+ pattern += tmp[1] === '?' ? '(?:/(.*))?' : '/(.*)';
854
858
  } else if (c === ':') {
855
859
  o = tmp.indexOf('?', 1);
856
860
  ext = tmp.indexOf('.', 1);
@@ -926,7 +930,10 @@ const with_topic_router = mqtt_topic_router =>
926
930
  // alias: unsub_topic
927
931
  unsubscribe_topic(topic_route, ...args) {
928
932
  let router = this.router;
929
- router.remove(topic_route, true);
933
+
934
+ let fn = args.at(-1)?.call ? args.pop() : null;
935
+ router.remove(topic_route, true, fn);
936
+
930
937
  let topic = router.mqtt_topic(topic_route);
931
938
  return this.unsubscribe(topic, ...args ) }// topic_prefix
932
939
 
@@ -979,65 +986,79 @@ function mqtt_topic_path_router() {
979
986
  if (fn) {throw new TypeError()}
980
987
  fn = _ignore;}
981
988
 
982
- let rte = parse(as_topic_path(topic_route));
983
-
984
- rte.key = topic_route;
985
- rte.tgt = fn;
986
- pri_lsts[priority ? 0 : 1].push(rte);
989
+ let route = parse(as_topic_path(topic_route));
990
+ route.topic = topic_route;
991
+ route.tgt = fn;
992
+ pri_lsts[priority ? 0 : 1].push(route);
987
993
  return this}
988
994
 
989
- , remove(topic_route, priority) {
990
- let lst = pri_lsts[priority ? 0 : 1];
991
- return _route_remove([lst], topic_route)}
995
+ , remove(query, ...args) {
996
+ let lst = pri_lsts;
997
+ if ('boolean' === typeof args[0]) {
998
+ lst = [pri_lsts[args.shift() ? 0 : 1]];}
999
+
1000
+ if ('string' === typeof query) {
1001
+ query ={topic: query, tgt: args.pop()}; }
1002
+ return _route_remove(lst, query)}
992
1003
 
993
1004
  , clear(priority) {
994
- pri_lsts[priority ? 0 : 1] = [];
995
1005
  if (null == priority) {
996
- pri_lsts[1] = []; } }// null clears both lists
1006
+ pri_lsts = [[],[]]; }// null clears both lists
1007
+ else {
1008
+ pri_lsts[priority ? 0 : 1] = [];} }
997
1009
 
998
1010
  , async invoke(pkt, ctx) {
999
1011
  ctx.idx = 0;
1000
1012
  ctx.rm = rm;
1001
1013
 
1002
- for (let [fn, params] of find(pkt.topic)) {
1014
+ for (let [fn, params, route] of find(pkt.topic)) {
1003
1015
  let res = await fn(pkt, params, ctx);
1004
1016
 
1005
1017
  if (rm === res) {
1006
- _route_remove(pri_lsts, fn);}
1018
+ _route_remove(pri_lsts, route);}
1007
1019
 
1008
- if (ctx.done) {
1009
- break}
1020
+ if (ctx.done) {break}
1010
1021
  else ctx.idx++;}
1011
1022
 
1012
1023
  if (1 === pkt.qos) {
1013
1024
  await ctx.mqtt.puback(pkt);} } } }
1014
1025
 
1015
1026
 
1027
+ const _regexparam ={
1028
+ get wild() {return this['*']}
1029
+ , set wild(v) {return this['*']=wild} };
1030
+
1016
1031
  function * _routes_iter(all_route_lists, topic) {
1017
1032
  topic = topic.replace(/^[\/]*/, '/'); // ensure '/' prefix for regexparam library
1018
- for (let route_list of all_route_lists) {
1019
- for (let {keys, pattern, tgt} of route_list) {
1020
- let match = pattern.exec(topic);
1021
- if (match) {
1022
- let params = keys
1023
- ? keys.reduce(
1024
- (o, k, i) => (o[k] = match[1+i], o)
1025
- , {})
1026
- : match.groups ?? match;
1027
- yield [tgt, params];} } } }
1033
+ for (let route of all_route_lists.flat()) {
1034
+ let match = route?.pattern.exec(topic);
1035
+ if (match) {
1036
+ let keys = route.keys;
1037
+ if (keys) {
1038
+ let k, i=0, params={__proto__:_regexparam};
1039
+ for (k of keys) {
1040
+ params[k] = match[++i];}
1041
+ yield [route.tgt, params, route];}
1042
+ else {
1043
+ yield [route.tgt, match.groups ?? match, route];} } } }
1028
1044
 
1029
1045
 
1030
1046
  function _route_remove(all_route_lists, query) {
1031
- let fn_match = route =>(
1032
- route===query
1033
- || route.tgt===query
1034
- || route.key===query);
1047
+ let ans = false;
1035
1048
  for (let lst of all_route_lists) {
1036
- let i = lst.findIndex(fn_match);
1037
- if (0 <= i) {
1038
- lst.splice(i,1);
1039
- return true} }
1040
- return false}
1049
+ let idx_tip = 0;
1050
+ for (let route of lst) {
1051
+ // skip matching routes to remove from compacted list
1052
+ let skip = route === query;
1053
+ if (!skip && route.topic === query.topic)
1054
+ skip = (null == query.tgt) || (route.tgt === query.tgt);
1055
+
1056
+ if (!skip) lst[idx_tip++] = route;}
1057
+
1058
+ // truncate remaining list
1059
+ lst.length = idx_tip;}
1060
+
1061
+ return ans}
1041
1062
 
1042
1063
  function decode_varint(u8, i0=0, invalid) {
1043
1064
  let shift=0, i=i0, b=u8[i++], n=(b & 0x7f);
@@ -1652,7 +1673,7 @@ class MQTTCore extends MQTTBase {
1652
1673
 
1653
1674
  return this} }
1654
1675
 
1655
- const version = '0.6.3';
1676
+ const version = '0.6.5';
1656
1677
 
1657
1678
  const MQTTClient_v4 = /* #__PURE__ */
1658
1679
  with_topic_path_router(