u8-mqtt 0.4.1 → 0.5.0

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 (81) hide show
  1. package/cjs/basic-v4.cjs +103 -137
  2. package/cjs/basic-v4.cjs.map +1 -1
  3. package/cjs/basic-v5.cjs +102 -136
  4. package/cjs/basic-v5.cjs.map +1 -1
  5. package/cjs/index.cjs +144 -189
  6. package/cjs/index.cjs.map +1 -1
  7. package/cjs/v4.cjs +145 -190
  8. package/cjs/v4.cjs.map +1 -1
  9. package/cjs/v5.cjs +144 -189
  10. package/cjs/v5.cjs.map +1 -1
  11. package/code/_dispatch.jsy +16 -0
  12. package/code/base.jsy +68 -124
  13. package/code/core.jsy +15 -9
  14. package/code/router_path.jsy +24 -43
  15. package/code/with_topic_router.jsy +18 -10
  16. package/esm/basic-v4.js +1154 -0
  17. package/esm/basic-v4.js.map +1 -0
  18. package/esm/basic-v5.js +1416 -0
  19. package/esm/basic-v5.js.map +1 -0
  20. package/esm/deno/basic-v4.js +103 -137
  21. package/esm/deno/basic-v4.js.map +1 -1
  22. package/esm/deno/basic-v5.js +102 -136
  23. package/esm/deno/basic-v5.js.map +1 -1
  24. package/esm/deno/index.js +144 -189
  25. package/esm/deno/index.js.map +1 -1
  26. package/esm/deno/v4.js +145 -190
  27. package/esm/deno/v4.js.map +1 -1
  28. package/esm/deno/v5.js +144 -189
  29. package/esm/deno/v5.js.map +1 -1
  30. package/esm/index.js +1599 -0
  31. package/esm/index.js.map +1 -0
  32. package/esm/node/basic-v4.js +103 -137
  33. package/esm/node/basic-v4.js.map +1 -1
  34. package/esm/node/basic-v4.mjs +103 -137
  35. package/esm/node/basic-v4.mjs.map +1 -1
  36. package/esm/node/basic-v5.js +102 -136
  37. package/esm/node/basic-v5.js.map +1 -1
  38. package/esm/node/basic-v5.mjs +102 -136
  39. package/esm/node/basic-v5.mjs.map +1 -1
  40. package/esm/node/index.js +144 -189
  41. package/esm/node/index.js.map +1 -1
  42. package/esm/node/index.mjs +144 -189
  43. package/esm/node/index.mjs.map +1 -1
  44. package/esm/node/v4.js +145 -190
  45. package/esm/node/v4.js.map +1 -1
  46. package/esm/node/v4.mjs +145 -190
  47. package/esm/node/v4.mjs.map +1 -1
  48. package/esm/node/v5.js +144 -189
  49. package/esm/node/v5.js.map +1 -1
  50. package/esm/node/v5.mjs +144 -189
  51. package/esm/node/v5.mjs.map +1 -1
  52. package/esm/v4.js +1336 -0
  53. package/esm/v4.js.map +1 -0
  54. package/esm/v5.js +1599 -0
  55. package/esm/v5.js.map +1 -0
  56. package/esm/web/basic-v4.js +103 -137
  57. package/esm/web/basic-v4.js.map +1 -1
  58. package/esm/web/basic-v4.min.js +1 -1
  59. package/esm/web/basic-v4.min.js.br +0 -0
  60. package/esm/web/basic-v4.min.js.gz +0 -0
  61. package/esm/web/basic-v5.js +102 -136
  62. package/esm/web/basic-v5.js.map +1 -1
  63. package/esm/web/basic-v5.min.js +1 -1
  64. package/esm/web/basic-v5.min.js.br +0 -0
  65. package/esm/web/basic-v5.min.js.gz +0 -0
  66. package/esm/web/index.js +144 -189
  67. package/esm/web/index.js.map +1 -1
  68. package/esm/web/index.min.js +1 -1
  69. package/esm/web/index.min.js.br +0 -0
  70. package/esm/web/index.min.js.gz +0 -0
  71. package/esm/web/v4.js +145 -190
  72. package/esm/web/v4.js.map +1 -1
  73. package/esm/web/v4.min.js +1 -1
  74. package/esm/web/v4.min.js.br +0 -0
  75. package/esm/web/v4.min.js.gz +0 -0
  76. package/esm/web/v5.js +144 -189
  77. package/esm/web/v5.js.map +1 -1
  78. package/esm/web/v5.min.js +1 -1
  79. package/esm/web/v5.min.js.br +0 -0
  80. package/esm/web/v5.min.js.gz +0 -0
  81. package/package.json +7 -8
package/cjs/basic-v5.cjs CHANGED
@@ -154,7 +154,7 @@ class mqtt_reader_v4 {
154
154
 
155
155
  }
156
156
 
157
- class mqtt_reader_v5$1 extends mqtt_reader_v4 {
157
+ let mqtt_reader_v5$1 = class mqtt_reader_v5 extends mqtt_reader_v4 {
158
158
  props() {
159
159
  let {buf, step} = this;
160
160
  let [n, vi, vi0] = decode_varint$1(buf, step.k|0);
@@ -189,7 +189,7 @@ class mqtt_reader_v5$1 extends mqtt_reader_v4 {
189
189
  : buf.subarray(vi, step.k|0)
190
190
  }
191
191
  */
192
- }
192
+ };
193
193
 
194
194
  function mqtt_reader_info(mqtt_reader, ... info_fn_list) {
195
195
  mqtt_reader = class extends mqtt_reader {
@@ -1034,6 +1034,22 @@ const _mqtt_cmdid_dispatch ={
1034
1034
 
1035
1035
  await fn?.call(target, pkt, ctx);} })()) };
1036
1036
 
1037
+ /*
1038
+ on_mqtt_type = {
1039
+ mqtt_auth(pkt, ctx) ::
1040
+ mqtt_connect(pkt, ctx) ::
1041
+ mqtt_connack(pkt, ctx) ::
1042
+ mqtt_disconnect(pkt, ctx) ::
1043
+
1044
+ mqtt_publish(pkt, ctx)
1045
+ mqtt_subscribe(pkt, ctx) ::
1046
+ mqtt_unsubscribe(pkt, ctx) ::
1047
+
1048
+ mqtt_pingreq(pkt, ctx) ::
1049
+ mqtt_pingresp(pkt, ctx) ::
1050
+ }
1051
+ */
1052
+
1037
1053
  function _mqtt_dispatch(opt, target) {
1038
1054
  let _disp_ = _mqtt_cmdid_dispatch.create(target);
1039
1055
  let { cmdids } = _disp_;
@@ -1063,28 +1079,34 @@ class MQTTError extends Error {
1063
1079
 
1064
1080
  class MQTTBase {
1065
1081
  constructor(opt={}) {
1082
+ this.with(opt);
1066
1083
  this._conn_ = _mqtt_conn(this,
1067
1084
  this._init_dispatch(opt, this)); }
1068
1085
 
1086
+ with(fns_ns) {
1087
+ for (let [k,v] of Object.entries(fns_ns)) {
1088
+ if ('function' === typeof v) {this[k] = v;} }
1089
+ return this}
1090
+
1069
1091
  async conn_emit(evt, arg, err_arg) {
1070
1092
  this.log_conn?.(evt, arg, err_arg);
1071
1093
  try {
1072
- let fn_evt = this[await evt]; // microtask break
1094
+ let fn_evt = this[await evt]; // microtask break using `await evt`
1073
1095
  if (fn_evt) {
1074
1096
  await fn_evt.call(this, this, arg, err_arg);}
1075
- else if (err_arg) {
1076
- await this.on_error(err_arg, evt);} }
1097
+ else if (err_arg) {throw err_arg} }
1077
1098
  catch (err) {
1078
1099
  this.on_error(err, evt);} }
1079
1100
 
1080
- on_error(err, err_path) {
1081
- console.warn('[[u8-mqtt error: %s]]', err_path, err); }
1101
+ on_error(err, evt) {
1102
+ console.warn('[[u8-mqtt error: %s]]', evt, err); }
1082
1103
 
1083
1104
  // Handshaking Packets
1084
1105
 
1085
1106
  async connect(pkt={}) {
1086
- let cid = pkt.client_id || ['u8-mqtt--', ''];
1087
- if (Array.isArray(cid)) {
1107
+ let cid = pkt.client_id || this.client_id;
1108
+ if ('string' !== typeof cid) {
1109
+ // see init_client_id implementation in core.jsy
1088
1110
  pkt.client_id = cid = this.init_client_id(cid);}
1089
1111
  this.client_id = cid;
1090
1112
 
@@ -1110,12 +1132,13 @@ class MQTTBase {
1110
1132
  return this._send('auth', pkt, 'auth')}
1111
1133
 
1112
1134
  ping() {return this._send('pingreq', null, 'pingresp')}
1113
-
1135
+ puback({pkt_id}) {return this._send('puback', {pkt_id})}
1114
1136
 
1115
1137
  // alias: sub
1116
1138
  subscribe(pkt, ex, topic_prefix) {
1117
1139
  pkt = _as_topics(pkt, ex, topic_prefix);
1118
- return this._send('subscribe', pkt, pkt)}
1140
+ let suback = this._send('subscribe', pkt, pkt);
1141
+ return this.on_sub?.(suback, pkt) ?? suback}
1119
1142
 
1120
1143
  // alias: unsub
1121
1144
  unsubscribe(pkt, ex, topic_prefix) {
@@ -1123,48 +1146,52 @@ class MQTTBase {
1123
1146
  return this._send('unsubscribe', pkt, pkt)}
1124
1147
 
1125
1148
 
1126
- // alias: pub
1127
- publish(pkt, pub_opt) {return _pub(this, pkt, pub_opt)}
1128
- post(topic, payload, pub_opt) {return _pub.m(this, topic, payload, pub_opt)}
1129
- send(topic, payload, pub_opt) {return _pub.mq(this, topic, payload, pub_opt)}
1130
- store(topic, payload, pub_opt) {return _pub.mqr(this, topic, payload, pub_opt)}
1131
-
1132
- json_post(topic, msg, pub_opt) {return _pub.o(this, topic, msg, pub_opt)}
1133
- json_send(topic, msg, pub_opt) {return _pub.oq(this, topic, msg, pub_opt)}
1134
- json_store(topic, msg, pub_opt) {return _pub.oqr(this, topic, msg, pub_opt)}
1135
-
1136
- obj_post(topic, msg, pub_opt) {return _pub.o(this, topic, msg, pub_opt)}
1137
- obj_send(topic, msg, pub_opt) {return _pub.oq(this, topic, msg, pub_opt)}
1138
- obj_store(topic, msg, pub_opt) {return _pub.oqr(this, topic, msg, pub_opt)}
1139
-
1140
-
1141
-
1142
- // Utility Methods
1143
-
1144
- init_client_id(parts) {
1145
- let cid = this.client_id;
1146
-
1147
- if (undefined === cid) {
1148
- this.client_id = cid = (
1149
-
1150
-
1151
-
1152
- this.new_client_id(parts)
1153
- );}
1154
-
1155
- return cid}
1156
-
1157
- new_client_id(parts) {
1158
- return [parts[0], Math.random().toString(36).slice(2), parts[1]].join('')}
1159
-
1160
-
1161
-
1162
-
1163
-
1164
-
1165
-
1166
-
1167
-
1149
+ post(topic, payload, pub_opt) {// qos:0
1150
+ return this.pub({topic, payload, qos:0}, pub_opt)}
1151
+ send(topic, payload, pub_opt) {// qos:1
1152
+ return this.pub({topic, payload, qos:1}, pub_opt)}
1153
+ store(topic, payload, pub_opt) {// qos:1, retain: 1
1154
+ return this.pub({topic, payload, qos:1, retain: 1}, pub_opt)}
1155
+
1156
+ // alias: json_post
1157
+ obj_post(topic, msg, pub_opt) {// qos:0
1158
+ return this.pub({topic, msg, arg: 'msg', qos:0}, pub_opt)}
1159
+ // alias: json_send
1160
+ obj_send(topic, msg, pub_opt) {// qos:1
1161
+ return this.pub({topic, msg, arg: 'msg', qos:1}, pub_opt)}
1162
+ // alias: json_store
1163
+ obj_store(topic, msg, pub_opt) {// qos:1, retain: 1
1164
+ return this.pub({topic, msg, arg: 'msg', qos:1, retain: 1}, pub_opt)}
1165
+
1166
+ // alias: publish -- because 'pub' is shorter for semantic aliases above
1167
+ async pub(pkt, pub_opt) {
1168
+ if (undefined === pkt.payload) {
1169
+ if ('function' === typeof pub_opt) {
1170
+ pub_opt = {fn_encode: pub_opt};}
1171
+
1172
+ let {msg} = pkt;
1173
+ switch (typeof msg) {
1174
+ case 'function':
1175
+ pub_opt = {...pub_opt, fn_encode: msg};
1176
+ // flow into 'undefined' case
1177
+ case 'undefined':
1178
+ // return a single-value closure to publish packets
1179
+ return v => this.pub({...pkt, [pkt.arg || 'payload']: v}, pub_opt)}
1180
+
1181
+ // Encode payload from msg; fn_encode allows alternative to JSON.stringify
1182
+ let {fn_encode} = pub_opt || {};
1183
+ pkt.payload = fn_encode
1184
+ ? await fn_encode(msg)
1185
+ : JSON.stringify(msg);}
1186
+
1187
+ if (pub_opt) {
1188
+ if (pub_opt.props) {
1189
+ pkt.props = pub_opt.props;}
1190
+ if (pub_opt.xform) {
1191
+ pkt = pub_opt.xform(pkt) || pkt;} }
1192
+
1193
+ return this._send('publish', pkt,
1194
+ pkt.qos ? pkt : void 0 ) }// key
1168
1195
 
1169
1196
 
1170
1197
  // Internal API
@@ -1179,41 +1206,18 @@ class MQTTBase {
1179
1206
  return _mqtt_dispatch(this, target)}
1180
1207
 
1181
1208
  static _aliases() {
1182
- return ' pub:publish sub:subscribe unsub:unsubscribe '}
1209
+ return ' publish:pub sub:subscribe unsub:unsubscribe json_post:obj_post json_send:obj_send json_store:obj_store'}
1183
1210
 
1184
1211
  static _once_(self=this) {
1185
1212
  self._once_ = _=>0;
1186
- self.MQTTError = MQTTError;
1187
1213
  let p = self.prototype;
1214
+ p.MQTTError = MQTTError;
1188
1215
  for (let alias of self._aliases().split(/\s+/)) {
1189
1216
  alias = alias.split(':');
1190
1217
  let fn = alias[1] && p[alias[1]];
1191
1218
  if (fn) {p[alias[0]] = fn;} } } }
1192
1219
 
1193
1220
 
1194
- /*
1195
- on_mqtt_type = {
1196
- mqtt_auth(pkt, ctx) ::
1197
- mqtt_connect(pkt, ctx) ::
1198
- mqtt_connack(pkt, ctx) ::
1199
- mqtt_disconnect(pkt, ctx) ::
1200
-
1201
- mqtt_publish(pkt, ctx)
1202
- mqtt_subscribe(pkt, ctx) ::
1203
- mqtt_unsubscribe(pkt, ctx) ::
1204
-
1205
- mqtt_pingreq(pkt, ctx) ::
1206
- mqtt_pingresp(pkt, ctx) ::
1207
- }
1208
- */
1209
-
1210
-
1211
- const _prefix_topics = (topic_prefix, iterable) =>
1212
- Array.from(iterable, value =>(
1213
- value.trim // string
1214
- ? _prefix_topics(topic_prefix, value)
1215
- : topic_prefix + value) );
1216
-
1217
1221
  function _as_topics(pkt, ex, topic_prefix) {
1218
1222
  if (ex?.trim) {// string
1219
1223
  topic_prefix = ex;
@@ -1230,55 +1234,11 @@ function _as_topics(pkt, ex, topic_prefix) {
1230
1234
  if (topic_prefix) {
1231
1235
  // particularly useful with shared queues, e.g.
1232
1236
  // topic_prefix = '$share/some-queue-name/'
1233
- pkt.topics = _prefix_topics(topic_prefix, pkt.topics);}
1234
- return pkt}
1235
-
1237
+ let _prefix_topics = v =>
1238
+ v.trim ? topic_prefix+v : v.map(_prefix_topics);
1236
1239
 
1237
- async function _pub(self, pkt, pub_opt) {
1238
- if (undefined === pkt.payload) {
1239
- if ('function' === typeof pub_opt) {
1240
- pub_opt = {fn_encode: pub_opt};}
1241
-
1242
- let {msg} = pkt;
1243
- switch (typeof msg) {
1244
- case 'function':
1245
- pub_opt = {...pub_opt, fn_encode: msg};
1246
- // flow into 'undefined' case
1247
- case 'undefined':
1248
- // return a single-value closure to publish packets
1249
- return v => _pub(self, {...pkt, [pkt.arg || 'payload']: v}, pub_opt)
1250
-
1251
- default:
1252
- // Encode payload from msg; fn_encode allows alternative to JSON.stringify
1253
- let {fn_encode} = pub_opt || {};
1254
- pkt.payload = fn_encode
1255
- ? await fn_encode(msg)
1256
- : JSON.stringify(msg);} }
1257
-
1258
- if (pub_opt) {
1259
- if (pub_opt.props) {
1260
- pkt.props = pub_opt.props;}
1261
- if (pub_opt.xform) {
1262
- pkt = pub_opt.xform(pkt) || pkt;} }
1263
-
1264
- return self._send('publish', pkt,
1265
- pkt.qos ? pkt : void 0 ) }// key
1266
-
1267
- {
1268
- Object.assign(_pub,{
1269
- m: (self, topic, payload, pub_opt) =>
1270
- _pub(self, {topic, payload, qos:0}, pub_opt)
1271
- , mq: (self, topic, payload, pub_opt) =>
1272
- _pub(self, {topic, payload, qos:1}, pub_opt)
1273
- , mqr: (self, topic, payload, pub_opt) =>
1274
- _pub(self, {topic, payload, qos:1, retain: 1}, pub_opt)
1275
-
1276
- , o: (self, topic, msg, pub_opt) =>
1277
- _pub(self, {topic, msg, arg: 'msg', qos:0}, pub_opt)
1278
- , oq: (self, topic, msg, pub_opt) =>
1279
- _pub(self, {topic, msg, arg: 'msg', qos:1}, pub_opt)
1280
- , oqr: (self, topic, msg, pub_opt) =>
1281
- _pub(self, {topic, msg, arg: 'msg', qos:1, retain: 1}, pub_opt)} ); }
1240
+ pkt.topics = pkt.topics.map(_prefix_topics);}
1241
+ return pkt}
1282
1242
 
1283
1243
  const pkt_api = {
1284
1244
  utf8(u8) { return new TextDecoder('utf-8').decode(u8 || this.payload ) },
@@ -1287,20 +1247,27 @@ const pkt_api = {
1287
1247
  };
1288
1248
 
1289
1249
  class MQTTCore extends MQTTBase {
1290
- constructor(opt={}) {
1291
- super(opt);
1292
- this.with(opt);}
1293
-
1294
1250
  static mqtt_ctx(mqtt_level, mqtt_opts, pkt_ctx=pkt_api) {
1295
1251
  let self = class extends this {};
1296
1252
  self.prototype.mqtt_ctx =
1297
1253
  mqtt_pkt_ctx(mqtt_level, mqtt_opts, pkt_ctx);
1298
1254
  return self}
1299
1255
 
1300
- with(fns_ns) {
1301
- for (let [k,v] of Object.entries(fns_ns)) {
1302
- if ('function' === typeof v) {this[k] = v;} }
1303
- return this}
1256
+
1257
+ // automatic Client Id for connect()
1258
+ init_client_id(parts=['u8-mqtt--','']) {
1259
+ let sess_stg=this.sess_stg;
1260
+ let key, cid = sess_stg?.getItem(key=parts.join(' '));
1261
+ if (! cid) {
1262
+ cid = parts.join(Math.random().toString(36).slice(2));
1263
+ sess_stg?.setItem(key, cid);}
1264
+ return cid}
1265
+
1266
+ get sess_stg() {return globalThis.sessionStorage}
1267
+
1268
+
1269
+ //on_error(err, evt) ::
1270
+ // console.warn @ '[[u8-mqtt error: %s]]', evt, err
1304
1271
 
1305
1272
  //log_conn(evt, arg, err_arg) ::
1306
1273
  // console.info @ '[[u8-mqtt log: %s]]', evt, arg, err_arg
@@ -1377,7 +1344,6 @@ class MQTTCore extends MQTTBase {
1377
1344
 
1378
1345
  with_tcp(...opt) {
1379
1346
  opt = this._conn_opt(opt);
1380
- console.log({opt});
1381
1347
  return this._use_conn (() =>
1382
1348
  this.with_stream(
1383
1349
  node_net.connect(opt)) ) }
@@ -1439,7 +1405,7 @@ class MQTTCore extends MQTTBase {
1439
1405
 
1440
1406
  return this} }
1441
1407
 
1442
- const version = '0.4.1';
1408
+ const version = '0.5.0';
1443
1409
 
1444
1410
  const MQTTClient_v4 = /* #__PURE__ */
1445
1411
  MQTTCore.mqtt_ctx(4, mqtt_opts_v5);