u8-mqtt 0.5.2 → 0.6.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 (116) hide show
  1. package/README.md +23 -6
  2. package/cjs/basic-v4.cjs +293 -284
  3. package/cjs/basic-v4.cjs.map +1 -1
  4. package/cjs/basic-v5.cjs +307 -288
  5. package/cjs/basic-v5.cjs.map +1 -1
  6. package/cjs/full-v4.cjs +1538 -0
  7. package/cjs/full-v4.cjs.map +1 -0
  8. package/cjs/full-v5.cjs +1812 -0
  9. package/cjs/full-v5.cjs.map +1 -0
  10. package/cjs/index.cjs +320 -302
  11. package/cjs/index.cjs.map +1 -1
  12. package/cjs/v4.cjs +305 -296
  13. package/cjs/v4.cjs.map +1 -1
  14. package/cjs/v5.cjs +319 -300
  15. package/cjs/v5.cjs.map +1 -1
  16. package/code/_cmdid_dispatch.jsy +45 -69
  17. package/code/_conn.jsy +96 -72
  18. package/code/_dispatch.jsy +36 -28
  19. package/code/_utils.jsy +17 -0
  20. package/code/base.jsy +35 -63
  21. package/code/core.jsy +78 -56
  22. package/code/full-v4.js +20 -0
  23. package/code/full-v5.js +29 -0
  24. package/code/router_path.jsy +2 -1
  25. package/esm/basic-v4.js +293 -284
  26. package/esm/basic-v4.js.map +1 -1
  27. package/esm/basic-v5.js +307 -288
  28. package/esm/basic-v5.js.map +1 -1
  29. package/esm/deno/basic-v4.js +297 -288
  30. package/esm/deno/basic-v4.js.map +1 -1
  31. package/esm/deno/basic-v5.js +311 -292
  32. package/esm/deno/basic-v5.js.map +1 -1
  33. package/esm/deno/full-v4.js +1526 -0
  34. package/esm/deno/full-v4.js.map +1 -0
  35. package/esm/deno/full-v5.js +1798 -0
  36. package/esm/deno/full-v5.js.map +1 -0
  37. package/esm/deno/index.js +324 -305
  38. package/esm/deno/index.js.map +1 -1
  39. package/esm/deno/v4.js +309 -300
  40. package/esm/deno/v4.js.map +1 -1
  41. package/esm/deno/v5.js +323 -304
  42. package/esm/deno/v5.js.map +1 -1
  43. package/esm/full-v4.js +1526 -0
  44. package/esm/full-v4.js.map +1 -0
  45. package/esm/full-v5.js +1798 -0
  46. package/esm/full-v5.js.map +1 -0
  47. package/esm/index.js +320 -301
  48. package/esm/index.js.map +1 -1
  49. package/esm/node/basic-v4.js +293 -284
  50. package/esm/node/basic-v4.js.map +1 -1
  51. package/esm/node/basic-v4.mjs +293 -284
  52. package/esm/node/basic-v4.mjs.map +1 -1
  53. package/esm/node/basic-v5.js +307 -288
  54. package/esm/node/basic-v5.js.map +1 -1
  55. package/esm/node/basic-v5.mjs +307 -288
  56. package/esm/node/basic-v5.mjs.map +1 -1
  57. package/esm/node/full-v4.js +1529 -0
  58. package/esm/node/full-v4.js.map +1 -0
  59. package/esm/node/full-v4.mjs +1529 -0
  60. package/esm/node/full-v4.mjs.map +1 -0
  61. package/esm/node/full-v5.js +1801 -0
  62. package/esm/node/full-v5.js.map +1 -0
  63. package/esm/node/full-v5.mjs +1801 -0
  64. package/esm/node/full-v5.mjs.map +1 -0
  65. package/esm/node/index.js +320 -301
  66. package/esm/node/index.js.map +1 -1
  67. package/esm/node/index.mjs +320 -301
  68. package/esm/node/index.mjs.map +1 -1
  69. package/esm/node/v4.js +305 -296
  70. package/esm/node/v4.js.map +1 -1
  71. package/esm/node/v4.mjs +305 -296
  72. package/esm/node/v4.mjs.map +1 -1
  73. package/esm/node/v5.js +319 -300
  74. package/esm/node/v5.js.map +1 -1
  75. package/esm/node/v5.mjs +319 -300
  76. package/esm/node/v5.mjs.map +1 -1
  77. package/esm/v4.js +305 -296
  78. package/esm/v4.js.map +1 -1
  79. package/esm/v5.js +319 -300
  80. package/esm/v5.js.map +1 -1
  81. package/esm/web/basic-v4.js +293 -284
  82. package/esm/web/basic-v4.js.map +1 -1
  83. package/esm/web/basic-v4.min.js +1 -1
  84. package/esm/web/basic-v4.min.js.br +0 -0
  85. package/esm/web/basic-v4.min.js.gz +0 -0
  86. package/esm/web/basic-v5.js +307 -288
  87. package/esm/web/basic-v5.js.map +1 -1
  88. package/esm/web/basic-v5.min.js +1 -1
  89. package/esm/web/basic-v5.min.js.br +0 -0
  90. package/esm/web/basic-v5.min.js.gz +0 -0
  91. package/esm/web/full-v4.js +1526 -0
  92. package/esm/web/full-v4.js.map +1 -0
  93. package/esm/web/full-v4.min.js +1 -0
  94. package/esm/web/full-v4.min.js.br +0 -0
  95. package/esm/web/full-v4.min.js.gz +0 -0
  96. package/esm/web/full-v5.js +1798 -0
  97. package/esm/web/full-v5.js.map +1 -0
  98. package/esm/web/full-v5.min.js +1 -0
  99. package/esm/web/full-v5.min.js.br +0 -0
  100. package/esm/web/full-v5.min.js.gz +0 -0
  101. package/esm/web/index.js +320 -301
  102. package/esm/web/index.js.map +1 -1
  103. package/esm/web/index.min.js +1 -1
  104. package/esm/web/index.min.js.br +0 -0
  105. package/esm/web/index.min.js.gz +0 -0
  106. package/esm/web/v4.js +305 -296
  107. package/esm/web/v4.js.map +1 -1
  108. package/esm/web/v4.min.js +1 -1
  109. package/esm/web/v4.min.js.br +0 -0
  110. package/esm/web/v4.min.js.gz +0 -0
  111. package/esm/web/v5.js +319 -300
  112. package/esm/web/v5.js.map +1 -1
  113. package/esm/web/v5.min.js +1 -1
  114. package/esm/web/v5.min.js.br +0 -0
  115. package/esm/web/v5.min.js.gz +0 -0
  116. package/package.json +7 -8
package/code/core.jsy CHANGED
@@ -1,47 +1,79 @@
1
1
  import mqtt_pkt_ctx from 'u8-mqtt-packet/esm/codec_bind.js'
2
+ import { _isfn } from './_utils.jsy'
2
3
  import { MQTTBase } from './base.jsy'
4
+ import { _mqtt_conn } from './_conn.jsy'
3
5
 
4
6
  #IF PLAT_NODEJS
5
7
  import {connect as tcp_connect} from 'node:net'
6
8
  import {connect as tls_connect} from 'node:tls'
7
9
 
8
- const pkt_api = {
9
- utf8(u8) { return new TextDecoder('utf-8').decode(u8 || this.payload ) },
10
- json(u8) { return JSON.parse( this.utf8(u8) || null ) },
11
- text(u8) { return this.utf8(u8) },
12
- }
10
+ const pkt_api = @{}
11
+ utf8(u8) :: return new TextDecoder('utf-8').decode(u8 || this.payload )
12
+ json(u8) :: return JSON.parse( this.utf8(u8) || null )
13
+ text(u8) :: return this.utf8(u8)
14
+
15
+ const opt_default = @{}
16
+ sess_stg: globalThis.sessionStorage
13
17
 
14
18
  export class MQTTCore extends MQTTBase ::
19
+ constructor(opt) ::
20
+ super()
21
+ this.with(opt)
22
+ opt = @{} ...opt_default, ...opt
23
+ // settings for MQTTCore
24
+ this.sess_stg = opt.sess_stg
25
+ // setup connection and dispatch
26
+ this.conn = _mqtt_conn @ opt, this,
27
+ this._init_dispatch(opt)
28
+
29
+ with(fns_ns) ::
30
+ for let [k,v] of Object.entries(fns_ns) ::
31
+ if _isfn(v) :: this[k] = v
32
+ return this
33
+
34
+
15
35
  static mqtt_ctx(mqtt_level, mqtt_opts, pkt_ctx=pkt_api) ::
16
- let self = class extends this {}
17
- self.prototype.mqtt_ctx =
36
+ let klass = class extends this {}
37
+ klass.prototype.mqtt_ctx =
18
38
  mqtt_pkt_ctx(mqtt_level, mqtt_opts, pkt_ctx)
19
- return self
39
+ return klass
40
+
41
+
42
+ async conn_emit(evt, arg, err_arg) ::
43
+ this.log_conn?.(evt, arg, err_arg)
44
+ try ::
45
+ let fn_evt = this[await evt] // microtask break using `await evt`
46
+ if fn_evt ::
47
+ await fn_evt.call(this, this, arg, err_arg)
48
+ else if err_arg :: throw err_arg
49
+ catch err ::
50
+ this.on_error(err, evt)
51
+
52
+ on_error(err, evt) ::
53
+ console.warn @ '[[u8-mqtt error: %s]]', evt, err
54
+ log_conn(evt, arg, err_arg) ::
55
+ console.info @ '[[u8-mqtt conn: %s]]', evt, arg, err_arg
20
56
 
21
57
 
22
58
  // automatic Client Id for connect()
23
59
  init_client_id(parts=['u8-mqtt--','']) ::
24
- let sess_stg=this.sess_stg
60
+ let sess_stg = this.sess_stg
25
61
  let key, cid = sess_stg?.getItem(key=parts.join(' '))
26
62
  if ! cid ::
27
63
  cid = parts.join @ Math.random().toString(36).slice(2)
28
64
  sess_stg?.setItem(key, cid)
29
65
  return cid
30
66
 
31
- get sess_stg() :: return globalThis.sessionStorage
32
-
33
-
34
- //on_error(err, evt) ::
35
- // console.warn @ '[[u8-mqtt error: %s]]', evt, err
36
-
37
- //log_conn(evt, arg, err_arg) ::
38
- // console.info @ '[[u8-mqtt log: %s]]', evt, arg, err_arg
39
67
 
40
68
  on_live(client, is_reconnect) ::
41
69
  if is_reconnect ::
42
70
  return client.connect()
43
71
 
44
- //on_reconnect(client) ::
72
+ // on_ready(client) ::
73
+ // on_reconnect(client) ::
74
+ on_disconnect(client, intentional) ::
75
+ if ! intentional ::
76
+ return client.on_reconnect?.()
45
77
 
46
78
  _use_conn(fn_reconnect) ::
47
79
  return (this.reconnect = fn_reconnect)?.()
@@ -53,27 +85,20 @@ export class MQTTCore extends MQTTBase ::
53
85
  .then(this.reconnect)
54
86
  .then(opt.reconnect, opt.error)
55
87
 
56
- on_disconnect(client, intentional) ::
57
- if ! intentional ::
58
- return client.on_reconnect?.()
59
-
60
88
  delay(ms) ::
61
89
  return new Promise @ done => setTimeout(done, ms)
62
90
 
63
91
  with_async_iter(async_iter, write_u8_pkt) ::
64
- let on_mqtt_chunk = this._conn_.set @
65
- this.mqtt_ctx,
66
- write_u8_pkt
67
-
68
- this._msg_loop = @!>
69
- try ::
70
- async_iter = await async_iter
71
- for await (let chunk of async_iter)
72
- on_mqtt_chunk(chunk)
73
- this._conn_.reset()
74
- catch err ::
75
- this._conn_.reset(err)
76
-
92
+ this.conn.setup @ async_iter,
93
+ write_u8_pkt,
94
+ async (on_mqtt_chunk, conn) => ::
95
+ try ::
96
+ async_iter = await async_iter
97
+ for await (let chunk of async_iter)
98
+ on_mqtt_chunk(chunk)
99
+ conn.reset()
100
+ catch err ::
101
+ conn.reset(err)
77
102
  return this
78
103
 
79
104
 
@@ -92,11 +117,11 @@ export class MQTTCore extends MQTTBase ::
92
117
  this.with_deno_iter @
93
118
  Deno.connectTls(opt)
94
119
 
95
- with_deno_iter(conn) ::
120
+ with_deno_iter(transport) ::
96
121
  return this.with_async_iter @
97
- conn.then(Deno.iter),
98
- async u8_pkt =>
99
- (await conn).write(u8_pkt)
122
+ transport.then(Deno.iter),
123
+ transport.then @ write_stream =>
124
+ u8_pkt => write_stream.write(u8_pkt)
100
125
 
101
126
  _conn_opt([a0, a1, a2]) ::
102
127
  // (port, hostname, options) or (url, options)
@@ -144,29 +169,26 @@ export class MQTTCore extends MQTTBase ::
144
169
 
145
170
  websock.binaryType = 'arraybuffer'
146
171
 
147
- let ready, {readyState} = websock
172
+ let ws_ready, readyState = websock.readyState
148
173
  if 1 !== readyState ::
149
174
  if 0 !== readyState ::
150
- throw new Error @ 'Invalid WebSocket readyState'
151
-
152
- ready = new Promise @ fn => websock.onopen = fn
175
+ throw new Error @ 'WS readyState'
153
176
 
177
+ ws_ready = new Promise @ ready => websock.onopen = ready
154
178
 
155
- let {_conn_} = this
156
- let on_mqtt_chunk = _conn_.set @
157
- this.mqtt_ctx,
158
- async u8_pkt => @
159
- await ready
160
- websock.send(u8_pkt)
179
+ this.conn.setup @ ws_ready,
180
+ u8_pkt => websock.send(u8_pkt),
181
+ (on_mqtt_chunk, conn) => ::
182
+ websock.onmessage = evt => @
183
+ on_mqtt_chunk @ new Uint8Array(evt.data)
161
184
 
162
- websock.onmessage = evt => @ on_mqtt_chunk @ new Uint8Array(evt.data)
163
- websock.onclose = evt => ::
164
- if ! evt.wasClean ::
165
- var err = new Error('websocket connection close')
166
- err.code = evt.code
167
- err.reason = evt.reason
185
+ websock.onclose = evt => ::
186
+ if ! evt.wasClean ::
187
+ var err = new Error('websocket close')
188
+ err.code = evt.code
189
+ err.reason = evt.reason
168
190
 
169
- _conn_.reset(err)
191
+ conn.reset(err)
170
192
 
171
193
  return this
172
194
 
@@ -0,0 +1,20 @@
1
+ import mqtt_opts_v4 from 'u8-mqtt-packet/esm/codec_v4_full.js'
2
+ import {with_topic_path_router} from './router_path.jsy'
3
+ import MQTTCore from './core.jsy'
4
+ export * from './version.js'
5
+
6
+ const MQTTClient_v4 = /* #__PURE__ */
7
+ with_topic_path_router(
8
+ MQTTCore.mqtt_ctx(4, mqtt_opts_v4) )
9
+
10
+ const mqtt_v4 = opt =>
11
+ new MQTTClient_v4(opt)
12
+
13
+ export {
14
+ MQTTClient_v4,
15
+ MQTTClient_v4 as MQTTClient,
16
+
17
+ mqtt_v4,
18
+ mqtt_v4 as mqtt,
19
+ mqtt_v4 as default,
20
+ }
@@ -0,0 +1,29 @@
1
+ import mqtt_opts_v5 from 'u8-mqtt-packet/esm/codec_v5_full.js'
2
+ import {with_topic_path_router} from './router_path.jsy'
3
+ import MQTTCore from './core.jsy'
4
+ export * from './version.js'
5
+
6
+ const MQTTClient_v4 = /* #__PURE__ */
7
+ with_topic_path_router(
8
+ MQTTCore.mqtt_ctx(4, mqtt_opts_v5) )
9
+
10
+ const MQTTClient_v5 = /* #__PURE__ */
11
+ with_topic_path_router(
12
+ MQTTCore.mqtt_ctx(5, mqtt_opts_v5) )
13
+
14
+ const mqtt_v4 = opt =>
15
+ new MQTTClient_v4(opt)
16
+
17
+ const mqtt_v5 = opt =>
18
+ new MQTTClient_v5(opt)
19
+
20
+ export {
21
+ MQTTClient_v4,
22
+ MQTTClient_v5,
23
+ MQTTClient_v5 as MQTTClient,
24
+
25
+ mqtt_v4,
26
+ mqtt_v5,
27
+ mqtt_v5 as mqtt,
28
+ mqtt_v5 as default,
29
+ }
@@ -2,6 +2,7 @@
2
2
  // [regexparam]: https://github.com/lukeed/regexparam
3
3
 
4
4
  import {parse as _rxp_parse} from 'regexparam'
5
+ import {_isfn} from './_utils.jsy'
5
6
  import {with_topic_router} from './with_topic_router.jsy'
6
7
 
7
8
  export const with_topic_path_router = /* #__PURE__ */
@@ -40,7 +41,7 @@ function mqtt_topic_path_router() ::
40
41
  let fn = args.pop()
41
42
  let priority = args.pop()
42
43
 
43
- if 'function' !== typeof fn ::
44
+ if ! _isfn(fn) ::
44
45
  if fn :: throw new TypeError()
45
46
  fn = _ignore
46
47