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