u8-mqtt 0.5.3 → 0.6.1

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