iosignal 3.3.0 → 4.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 (82) hide show
  1. package/.vscode/settings.json +3 -0
  2. package/README.md +38 -559
  3. package/dist/io.d.ts +16 -9
  4. package/dist/io.js +5 -5
  5. package/dist/io.js.map +1 -1
  6. package/dist/io.min.js +5 -5
  7. package/dist/io.min.js.map +1 -1
  8. package/dist/iosignal.js +339 -268
  9. package/dist/types/client/IOCore.d.ts +17 -10
  10. package/dist/types/common/constants.d.ts +27 -37
  11. package/index.js +4 -3
  12. package/package.json +3 -4
  13. package/src/auth/BohoAuth.js +48 -11
  14. package/src/auth/{Auth_File.js → key_providers/FileKeyProvider.js} +8 -20
  15. package/src/auth/{Auth_Redis.js → key_providers/RedisKeyProvider.js} +4 -7
  16. package/src/auth/key_providers/StringKeyProvider.js +54 -0
  17. package/src/client/IOCongSocket.js +5 -3
  18. package/src/client/IOCore.js +118 -89
  19. package/src/client/IOWS.js +5 -3
  20. package/src/client/browser/IOWebSocket.js +5 -3
  21. package/src/common/constants.js +31 -44
  22. package/src/common/util.js +3 -0
  23. package/src/server/Manager.js +13 -12
  24. package/src/server/Remote.js +4 -1
  25. package/src/server/RemoteCore.js +23 -17
  26. package/src/server/Server.js +7 -7
  27. package/README.ko.md +0 -566
  28. package/auth_file.js +0 -23
  29. package/auth_file.json +0 -13
  30. package/docs/iosignal_architecture.png +0 -0
  31. package/examples/react-chat-js/dist/assets/index-Cy4qaVcJ.js +0 -56
  32. package/examples/react-chat-js/dist/assets/index-NETrjYhz.css +0 -1
  33. package/examples/react-chat-js/dist/assets/index-e2KOTYW8.js +0 -65
  34. package/examples/react-chat-js/dist/index.html +0 -14
  35. package/examples/react-chat-js/index.html +0 -13
  36. package/examples/react-chat-js/package-lock.json +0 -1723
  37. package/examples/react-chat-js/package.json +0 -20
  38. package/examples/react-chat-js/src/App.css +0 -61
  39. package/examples/react-chat-js/src/App.jsx +0 -125
  40. package/examples/react-chat-js/src/index.css +0 -13
  41. package/examples/react-chat-js/src/main.jsx +0 -13
  42. package/examples/react-chat-js/src/shared_io.js +0 -12
  43. package/examples/react-chat-js/vite.config.js +0 -7
  44. package/examples/server/index.js +0 -65
  45. package/examples/server/package-lock.json +0 -878
  46. package/examples/server/package.json +0 -13
  47. package/examples/server/public/index.html +0 -26
  48. package/examples/svelte-chat-js/.devtools +0 -3
  49. package/examples/svelte-chat-js/README.md +0 -38
  50. package/examples/svelte-chat-js/package-lock.json +0 -1421
  51. package/examples/svelte-chat-js/package.json +0 -23
  52. package/examples/svelte-chat-js/src/app.css +0 -105
  53. package/examples/svelte-chat-js/src/app.d.ts +0 -13
  54. package/examples/svelte-chat-js/src/app.html +0 -13
  55. package/examples/svelte-chat-js/src/lib/images/github.svg +0 -1
  56. package/examples/svelte-chat-js/src/lib/images/svelte-logo.svg +0 -1
  57. package/examples/svelte-chat-js/src/lib/images/svelte-welcome.png +0 -0
  58. package/examples/svelte-chat-js/src/lib/images/svelte-welcome.webp +0 -0
  59. package/examples/svelte-chat-js/src/lib/shared_io.js +0 -12
  60. package/examples/svelte-chat-js/src/routes/+layout.svelte +0 -5
  61. package/examples/svelte-chat-js/src/routes/+page.js +0 -3
  62. package/examples/svelte-chat-js/src/routes/+page.svelte +0 -167
  63. package/examples/svelte-chat-js/static/favicon.svg +0 -1
  64. package/examples/svelte-chat-js/static/global.css +0 -19
  65. package/examples/svelte-chat-js/static/robots.txt +0 -3
  66. package/examples/svelte-chat-js/svelte.config.js +0 -23
  67. package/examples/svelte-chat-js/vite.config.js +0 -6
  68. package/src/auth/Auth_Env.js +0 -76
  69. package/test-browser/favicon.ico +0 -0
  70. package/test-browser/index.html +0 -95
  71. package/test-browser/server.js +0 -12
  72. package/test-nodejs/client-playToggle.js +0 -19
  73. package/test-nodejs/client.js +0 -17
  74. package/test-nodejs/client_api_reply.js +0 -15
  75. package/test-nodejs/server-Auth_Env.js +0 -19
  76. package/test-nodejs/server-Auth_File.js +0 -12
  77. package/test-nodejs/server-api_reply.js +0 -6
  78. package/test-nodejs/server-api_sudo.js +0 -7
  79. package/test-nodejs/server.js +0 -20
  80. package/test-nodejs/signalPack.js +0 -34
  81. package/test-nodejs/signaling.js +0 -61
  82. package/test-nodejs/simple-server.js +0 -13
@@ -1,7 +1,7 @@
1
1
  import MBP from 'meta-buffer-pack'
2
2
  import { Remote } from './Remote.js'
3
3
  import { serverOption } from './serverOption.js'
4
- import { IOMsg, CLIENT_STATE } from '../common/constants.js'
4
+ import { IOMsg, STATE } from '../common/constants.js'
5
5
  import { getSignalPack } from '../common/payload.js';
6
6
  import { FileLogger } from './FileLogger.js'
7
7
  import { Metric } from './Metric.js'
@@ -73,7 +73,7 @@ export class Manager {
73
73
  let remote = new Remote(socket, req, this)
74
74
  this.remotes.add(remote)
75
75
  remote.send(Buffer.from([IOMsg.SERVER_READY]))
76
- remote.setState(CLIENT_STATE.SENT_SERVER_READY)
76
+ remote.setState(STATE.SERVER_READY)
77
77
  this.lastSSID = remote.ssid;
78
78
  let connectionInfo = `+ IP:${remote.ip} #${remote.ssid} ${socket.socketType === 'websocket' ? "WS" : "CS"} `;
79
79
  // console.log( connectionInfo)
@@ -181,8 +181,8 @@ export class Manager {
181
181
  serverSignalTo(tag, ...args) {
182
182
  let cid = tag.split('@')[0]
183
183
  let topic = tag.split('@')[1]
184
- let sigPack = getSignalPack('@' + topic, ...args)
185
184
  if (cid && this.cid2remote.has(cid)) {
185
+ let sigPack = getSignalPack('@' + topic, ...args)
186
186
  let targetRemote = this.cid2remote.get(cid)
187
187
  console.log('target', targetRemote.state, targetRemote.cid)
188
188
  targetRemote.send_enc_mode(sigPack)
@@ -194,8 +194,8 @@ export class Manager {
194
194
 
195
195
  sender(tag, remote, message) {
196
196
  if (serverOption.membersOnly && !remote.boho.isAuthorized) {
197
- console.log("[membersOnly] unAuthorized remote.",tag )
198
- remote.send(Buffer.from([IOMsg.SERVER_CLEAR_AUTH]))
197
+ // console.log("### server reject client signal reason: [membersOnly]" ,tag, remote.cid )
198
+ remote.send(Buffer.from([IOMsg.AUTH_CLEAR]))
199
199
  remote.close()
200
200
  return ['err', 'unAuthorized']
201
201
  }
@@ -284,17 +284,18 @@ export class Manager {
284
284
  // console.log('## null remote' )
285
285
  break;
286
286
  }
287
- if (c !== remote) {
287
+ // change: from v4.x allow receiveSelfMessages.
288
+ // if (c !== remote) {
288
289
  c.send_enc_mode(message);
289
290
  sentCounter++;
290
- }
291
+ // }
291
292
  }
292
293
 
293
- if (serverOption.useQuota.publishCounter) {
294
- // console.log(`pub >> [${tag}] sent: ${sentCounter} [use quota limit: ${remote.quota.publishCounter }] total: ${remotes.size} subscribers. ` )
295
- } else {
296
- // console.log(`pub >> [${tag}] sent: ${sentCounter} [no quota limit] total: ${remotes.size} subscribers. ` )
297
- }
294
+ // if (serverOption.useQuota.publishCounter) {
295
+ // // console.log(`pub >> [${tag}] sent: ${sentCounter} [use quota limit: ${remote.quota.publishCounter }] total: ${remotes.size} subscribers. ` )
296
+ // } else {
297
+ // // console.log(`pub >> [${tag}] sent: ${sentCounter} [no quota limit] total: ${remotes.size} subscribers. ` )
298
+ // }
298
299
  return ['ok', sentCounter]
299
300
  }
300
301
  }
@@ -185,6 +185,7 @@ export class Remote extends RemoteCore {
185
185
  }
186
186
  }
187
187
 
188
+ // node.js server side remote.
188
189
  send(message, isBinary) {
189
190
  this.manager.txBytes += message.byteLength;
190
191
  this.socket.txCounter++;
@@ -196,13 +197,15 @@ export class Remote extends RemoteCore {
196
197
  this.socket.send(message);
197
198
  }
198
199
  } else {
200
+ console.log('server(ws)Remote.send() called. not open state. current readyState:', this.socket.readyState )
199
201
  this.close(true)
200
202
  }
201
-
203
+
202
204
  } else { //CongSocket
203
205
  if (this.socket.readyState == 'open') {
204
206
  this.socket.write(pack(message))
205
207
  } else {
208
+ console.log('server(cong)Remote.send() called. not open state. current readyState:', this.socket.readyState )
206
209
  this.close(true)
207
210
  }
208
211
  }
@@ -1,7 +1,7 @@
1
1
  import MBP from 'meta-buffer-pack'
2
2
  import Boho from 'boho'
3
3
  import { serverOption } from './serverOption.js';
4
- import { IOMsg, ENC_MODE, CLIENT_STATE } from '../common/constants.js'
4
+ import { IOMsg, ENC_MODE, STATE } from '../common/constants.js'
5
5
  import { quotaTable } from '../common/quotaTable.js'
6
6
 
7
7
  const decoder = new TextDecoder()
@@ -40,7 +40,7 @@ export class RemoteCore {
40
40
 
41
41
  this.state;
42
42
  this.stateLog = [];
43
- this.setState(CLIENT_STATE.INIT)
43
+ this.setState(STATE.OPEN)
44
44
 
45
45
  }
46
46
 
@@ -49,7 +49,7 @@ export class RemoteCore {
49
49
  setState(state) {
50
50
  this.state = state
51
51
  if (serverOption.debug.showAuthInfo) {
52
- // let s = state + ":" + CLIENT_STATE[ state]
52
+ state = state + ":" + STATE[ state]
53
53
  this.stateLog.push( state )
54
54
  console.log(this.stateLog.join('>'))
55
55
  }
@@ -60,24 +60,30 @@ export class RemoteCore {
60
60
  }
61
61
 
62
62
  getStateName() { // <String>
63
- return (CLIENT_STATE[this.state]).toLowerCase()
63
+ return (STATE[this.state]).toLowerCase()
64
64
  }
65
65
 
66
66
 
67
67
  showMessageLog(message, isBinary) {
68
- let from = this.boho.isAuthorized ? `[FROM]did: ${this.did} cid:${this.cid}` : `[FROM]cid:${this.cid}`
68
+ let h = '->S '
69
+ let from = this.boho.isAuthorized ? ` did: ${this.did} cid: ${this.cid}` : ` cid: ${this.cid}`
70
+ let prnLimit = 20
69
71
  if (isBinary) {
70
72
  let msgTypeName = IOMsg[message[0]]
71
73
  if (!msgTypeName) msgTypeName = Boho.BohoMsg[message[0]]
72
- msgTypeName = ' [' + msgTypeName + ']';
73
- if (message.byteLength > 40) {
74
- console.log(from + msgTypeName + ' LEN:', message.length);
74
+
75
+ msgTypeName = '[' + msgTypeName + ']';
76
+ let size = message.byteLength;
77
+ if (size < prnLimit) {
78
+ console.log( h + msgTypeName + from +` [${size}]`, message);
75
79
  } else {
76
- console.log(from + msgTypeName, message);
80
+ let elseLen = size - prnLimit
81
+ let some = message.subarray(0,prnLimit)
82
+ console.log( h + msgTypeName + from +` [${size}]` , some , ' ... else: ', elseLen);
77
83
  }
78
84
 
79
85
  } else {
80
- console.log(from + ' [TEXT] %s', message);
86
+ console.log( h + ' [TEXT] %s' + from, message);
81
87
  }
82
88
  }
83
89
 
@@ -162,7 +168,7 @@ export class RemoteCore {
162
168
  break;
163
169
 
164
170
  case IOMsg.CID_REQ:
165
- if (this.state < CLIENT_STATE.SENT_SERVER_READY) {
171
+ if (this.state < STATE.SERVER_READY) {
166
172
  // Protocol violation: CID_REQ was sent before receiving the SERVER_READY signal.
167
173
  console.log('CID_REQ before SERVER_READY')
168
174
  this.close()
@@ -179,7 +185,7 @@ export class RemoteCore {
179
185
  MB('#cid', this.cid)
180
186
  ))
181
187
 
182
- this.setState(CLIENT_STATE.CID_READY)
188
+ this.setState(STATE.CID_RES)
183
189
  break;
184
190
 
185
191
  case IOMsg.ECHO:
@@ -285,24 +291,24 @@ export class RemoteCore {
285
291
  // Auth
286
292
  case Boho.BohoMsg.AUTH_REQ:
287
293
  if (!this.manager.authManager) return
288
- if (this.state < CLIENT_STATE.SENT_SERVER_READY) {
294
+ if (this.state < STATE.SERVER_READY) {
289
295
  console.log('protocol error. auth_req before server_ready')
290
296
  this.close();
291
297
  }
292
- this.setState(CLIENT_STATE.RECV_AUTH_REQ)
298
+ this.setState(STATE.AUTH_REQ)
293
299
  let auth_nonce_pack = this.boho.auth_nonce()
294
300
  // console.log('## auth_nonce_pack', auth_nonce_pack )
295
301
  this.send(auth_nonce_pack)
296
- this.setState(CLIENT_STATE.SENT_SERVER_NONCE)
302
+ this.setState(STATE.AUTH_NONCE)
297
303
  break;
298
304
 
299
305
  case Boho.BohoMsg.AUTH_HMAC:
300
306
  if (!this.manager.authManager) return
301
- if (this.state < CLIENT_STATE.SENT_SERVER_NONCE) {
307
+ if (this.state < STATE.AUTH_NONCE) {
302
308
  console.log('protocol error. auth_hmac before server_nonce')
303
309
  this.close();
304
310
  }
305
- this.setState(CLIENT_STATE.RECV_AUTH_HMAC)
311
+ this.setState(STATE.AUTH_HMAC)
306
312
  //async
307
313
  this.manager.authManager.verify_auth_hmac(message, this)
308
314
  .then(authInfo => {
@@ -81,7 +81,7 @@ export class Server extends EventEmitter {
81
81
 
82
82
  this.wss.once('listening', () => {
83
83
  this.port = this.wss.address().port;
84
- console.log('wss server bound port:', this.port );
84
+ // console.log('wss server bound port:', this.port );
85
85
  this.listeningServerCount++;
86
86
  if (this.listeningServerCount === this.serverCountToListen) {
87
87
  this.emit('ready');
@@ -97,7 +97,7 @@ export class Server extends EventEmitter {
97
97
  })
98
98
 
99
99
  this.wss.on('close', () => {
100
- console.log('### WS server is closed.')
100
+ // console.log('### WS server is closed.')
101
101
  })
102
102
 
103
103
  this.wss.on('connection', (ws, req) => {
@@ -118,10 +118,10 @@ export class Server extends EventEmitter {
118
118
  process.exit()
119
119
  }
120
120
  }).on('close', () => {
121
- console.log('### congsocket server is closed.')
121
+ // console.log('### congsocket server is closed.')
122
122
  }).listen(this.congPort, () => {
123
123
  this.congPort = this.congServer.address().port;
124
- console.log('congsocket server bound port:', this.congPort );
124
+ // console.log('congsocket server bound port:', this.congPort );
125
125
  this.listeningServerCount++;
126
126
  if (this.listeningServerCount === this.serverCountToListen) {
127
127
  this.emit('ready');
@@ -156,7 +156,7 @@ export class Server extends EventEmitter {
156
156
  return
157
157
  }
158
158
  if( api.commands.includes( req.topic )){
159
- console.log('server api req', req )
159
+ // console.log('server api req', req )
160
160
  await api.request(remote, req)
161
161
  }else{
162
162
  remote.response(req.mid, STATUS.ERROR, "UNKNOWN_COMMAND");
@@ -186,7 +186,7 @@ export class Server extends EventEmitter {
186
186
  })
187
187
  }
188
188
  this.apiNames.add(target)
189
- console.log(`[API registed: ${target} ] accept commands: ${api.commands}`)
189
+ // console.log(`[API registed: ${target} ] accept commands: ${api.commands}`)
190
190
  return this
191
191
  }
192
192
 
@@ -226,7 +226,7 @@ export class Server extends EventEmitter {
226
226
 
227
227
  if (this.congServer) {
228
228
  this.congServer.close((err) => {
229
- if (err) console.error('congServer close error', err)
229
+ // if (err) console.error('congServer close error', err)
230
230
  // console.log('cong server closed.')
231
231
  onClosed()
232
232
  })