u8-mqtt 0.5.3 → 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 (113) hide show
  1. package/cjs/basic-v4.cjs +283 -277
  2. package/cjs/basic-v4.cjs.map +1 -1
  3. package/cjs/basic-v5.cjs +297 -281
  4. package/cjs/basic-v5.cjs.map +1 -1
  5. package/cjs/full-v4.cjs +295 -289
  6. package/cjs/full-v4.cjs.map +1 -1
  7. package/cjs/full-v5.cjs +309 -293
  8. package/cjs/full-v5.cjs.map +1 -1
  9. package/cjs/index.cjs +310 -295
  10. package/cjs/index.cjs.map +1 -1
  11. package/cjs/v4.cjs +295 -289
  12. package/cjs/v4.cjs.map +1 -1
  13. package/cjs/v5.cjs +309 -293
  14. package/cjs/v5.cjs.map +1 -1
  15. package/code/_cmdid_dispatch.jsy +45 -69
  16. package/code/_conn.jsy +96 -72
  17. package/code/_dispatch.jsy +36 -28
  18. package/code/_utils.jsy +17 -0
  19. package/code/base.jsy +33 -61
  20. package/code/core.jsy +73 -51
  21. package/code/router_path.jsy +2 -1
  22. package/esm/basic-v4.js +283 -277
  23. package/esm/basic-v4.js.map +1 -1
  24. package/esm/basic-v5.js +297 -281
  25. package/esm/basic-v5.js.map +1 -1
  26. package/esm/deno/basic-v4.js +287 -281
  27. package/esm/deno/basic-v4.js.map +1 -1
  28. package/esm/deno/basic-v5.js +301 -285
  29. package/esm/deno/basic-v5.js.map +1 -1
  30. package/esm/deno/full-v4.js +299 -293
  31. package/esm/deno/full-v4.js.map +1 -1
  32. package/esm/deno/full-v5.js +313 -297
  33. package/esm/deno/full-v5.js.map +1 -1
  34. package/esm/deno/index.js +314 -298
  35. package/esm/deno/index.js.map +1 -1
  36. package/esm/deno/v4.js +299 -293
  37. package/esm/deno/v4.js.map +1 -1
  38. package/esm/deno/v5.js +313 -297
  39. package/esm/deno/v5.js.map +1 -1
  40. package/esm/full-v4.js +295 -289
  41. package/esm/full-v4.js.map +1 -1
  42. package/esm/full-v5.js +309 -293
  43. package/esm/full-v5.js.map +1 -1
  44. package/esm/index.js +310 -294
  45. package/esm/index.js.map +1 -1
  46. package/esm/node/basic-v4.js +283 -277
  47. package/esm/node/basic-v4.js.map +1 -1
  48. package/esm/node/basic-v4.mjs +283 -277
  49. package/esm/node/basic-v4.mjs.map +1 -1
  50. package/esm/node/basic-v5.js +297 -281
  51. package/esm/node/basic-v5.js.map +1 -1
  52. package/esm/node/basic-v5.mjs +297 -281
  53. package/esm/node/basic-v5.mjs.map +1 -1
  54. package/esm/node/full-v4.js +295 -289
  55. package/esm/node/full-v4.js.map +1 -1
  56. package/esm/node/full-v4.mjs +295 -289
  57. package/esm/node/full-v4.mjs.map +1 -1
  58. package/esm/node/full-v5.js +309 -293
  59. package/esm/node/full-v5.js.map +1 -1
  60. package/esm/node/full-v5.mjs +309 -293
  61. package/esm/node/full-v5.mjs.map +1 -1
  62. package/esm/node/index.js +310 -294
  63. package/esm/node/index.js.map +1 -1
  64. package/esm/node/index.mjs +310 -294
  65. package/esm/node/index.mjs.map +1 -1
  66. package/esm/node/v4.js +295 -289
  67. package/esm/node/v4.js.map +1 -1
  68. package/esm/node/v4.mjs +295 -289
  69. package/esm/node/v4.mjs.map +1 -1
  70. package/esm/node/v5.js +309 -293
  71. package/esm/node/v5.js.map +1 -1
  72. package/esm/node/v5.mjs +309 -293
  73. package/esm/node/v5.mjs.map +1 -1
  74. package/esm/v4.js +295 -289
  75. package/esm/v4.js.map +1 -1
  76. package/esm/v5.js +309 -293
  77. package/esm/v5.js.map +1 -1
  78. package/esm/web/basic-v4.js +283 -277
  79. package/esm/web/basic-v4.js.map +1 -1
  80. package/esm/web/basic-v4.min.js +1 -1
  81. package/esm/web/basic-v4.min.js.br +0 -0
  82. package/esm/web/basic-v4.min.js.gz +0 -0
  83. package/esm/web/basic-v5.js +297 -281
  84. package/esm/web/basic-v5.js.map +1 -1
  85. package/esm/web/basic-v5.min.js +1 -1
  86. package/esm/web/basic-v5.min.js.br +0 -0
  87. package/esm/web/basic-v5.min.js.gz +0 -0
  88. package/esm/web/full-v4.js +295 -289
  89. package/esm/web/full-v4.js.map +1 -1
  90. package/esm/web/full-v4.min.js +1 -1
  91. package/esm/web/full-v4.min.js.br +0 -0
  92. package/esm/web/full-v4.min.js.gz +0 -0
  93. package/esm/web/full-v5.js +309 -293
  94. package/esm/web/full-v5.js.map +1 -1
  95. package/esm/web/full-v5.min.js +1 -1
  96. package/esm/web/full-v5.min.js.br +0 -0
  97. package/esm/web/full-v5.min.js.gz +0 -0
  98. package/esm/web/index.js +310 -294
  99. package/esm/web/index.js.map +1 -1
  100. package/esm/web/index.min.js +1 -1
  101. package/esm/web/index.min.js.br +0 -0
  102. package/esm/web/index.min.js.gz +0 -0
  103. package/esm/web/v4.js +295 -289
  104. package/esm/web/v4.js.map +1 -1
  105. package/esm/web/v4.min.js +1 -1
  106. package/esm/web/v4.min.js.br +0 -0
  107. package/esm/web/v4.min.js.gz +0 -0
  108. package/esm/web/v5.js +309 -293
  109. package/esm/web/v5.js.map +1 -1
  110. package/esm/web/v5.min.js +1 -1
  111. package/esm/web/v5.min.js.br +0 -0
  112. package/esm/web/v5.min.js.gz +0 -0
  113. package/package.json +7 -8
package/code/core.jsy CHANGED
@@ -1,41 +1,69 @@
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 ::
@@ -61,19 +89,16 @@ export class MQTTCore extends MQTTBase ::
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
 
@@ -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