corebasic 1.0.82 → 1.0.84

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.
package/libs/features.js CHANGED
@@ -2,11 +2,32 @@ import * as Dip from './dip.js'
2
2
  import * as Kafka from './kafka.js'
3
3
  import * as Utils from './utils.js'
4
4
  import * as Messaging from './messaging.js'
5
+ import axios from 'axios'
5
6
 
6
7
 
7
8
  let features = {}
8
9
  let apis = {}
9
10
 
11
+ const getFeatureMethod = api => api.split(' ')[0].toLowerCase()
12
+ const getFeatureUrl = api => api.split(' ')[1]
13
+ const getFeature = name => features[name]
14
+
15
+ export const send = async (feature, params, payload) => {
16
+ let {api} = getFeature(feature)
17
+ let method = getFeatureMethod(api)
18
+ let url = getFeatureUrl(api)
19
+
20
+ if (params || url.includes(':')) {
21
+ for (let key in params)
22
+ url = url.replace(`:${key}`, params[key])
23
+ if (url.includes(':'))
24
+ throw {feature, when: 'api/params/substitution', message: "Internal Feature Call" }
25
+ }
26
+
27
+ return await (axios[method](`http://127.0.0.1${url}`,payload).timeout(1000))
28
+ }
29
+
30
+
10
31
  export const start = async (app, url, file) => {
11
32
  features = await Utils.fileToJson(url, file)
12
33
 
@@ -29,13 +50,13 @@ export const start = async (app, url, file) => {
29
50
 
30
51
  // Registering apis
31
52
  for (let api in apis) {
32
- let method = api.split(' ')[0].toLowerCase()
53
+ let method = getFeatureMethod(api)
33
54
  let url = api.split(' ')[1]
34
55
  if (api === 'GET /transactions/:id')
35
56
  continue
36
57
 
37
58
  app[method](url, async (req, res) => {
38
- let feature = features[req.body.feature]
59
+ let feature = getFeature(req.body.feature)
39
60
  let topic = feature.topic
40
61
  try {
41
62
  if (method === "get") {
package/libs/messaging.js CHANGED
@@ -17,9 +17,11 @@ async function disconnect(user, uid) {
17
17
  return
18
18
 
19
19
  if (users_pool[user].listeners[uid]) {
20
- await consumer.unsubscribe(user, users_pool[user].listeners[uid]);
20
+ if (users_pool[user].listeners.count == 1)
21
+ await consumer.unsubscribe(user, users_pool[user].listeners[uid]);
21
22
  users_pool[user].listeners.count --
22
23
  }
24
+ users_pool[user].reqres = users_pool[user].reqres.filter(item => item.uid !== uid)
23
25
  delete users_pool[user].listeners[uid]
24
26
  if (!users_pool[user].listeners.count)
25
27
  delete users_pool[user]
@@ -27,15 +29,19 @@ async function disconnect(user, uid) {
27
29
  // await consumer.unsubscribe(user);
28
30
  }
29
31
  async function connect({user,req,res, uid}) {
32
+ res.writeHead(200, {'Content-Type': 'text/event-stream', 'Cache-Control': 'no-cache', 'Connection': 'keep-alive'})
30
33
  const listener = (message, channel) => {
31
34
  if (users_pool[user]) {
32
35
  try {message = JSON.parse(message)} catch {}
33
- users_pool[user].res.write(JSON.stringify({message, channel}) + "\n")
36
+ for (let {req, res} of users_pool[user].reqres)
37
+ res.write(JSON.stringify({message, channel}) + "\n")
34
38
  }
35
39
  }
36
- users_pool[user] = users_pool[user] ?? {req,res,listeners: {count: 0}}
40
+ users_pool[user] = users_pool[user] ?? {reqres: [], listeners: {count: 0}}
41
+ users_pool[user].reqres.push({req, res, uid})
37
42
  users_pool[user].listeners[uid] = listener
38
- await consumer.subscribe(user, listener);
43
+ if (!users_pool[user].listeners.count)
44
+ await consumer.subscribe(user, listener);
39
45
  users_pool[user].listeners.count ++
40
46
  }
41
47
 
@@ -49,19 +55,15 @@ export async function start(app) {
49
55
  consumer.on('error', err => console.log('Redis Client Error', err));
50
56
 
51
57
  app.get('/messages/:user', async (req, res) => {
52
- let uid = Utils.uid()
58
+ let uid = req.body.client
53
59
  await connect({user: req.params.user, req, res, uid})
54
60
  req.on("close", async () => await disconnect(req.params.user, uid)) // request closed unexpectedly
55
61
  req.on("end", async () => await disconnect(req.params.user, uid)) // request ended normally
56
62
  })
57
63
  app.get('/messages/disconnects/:user', async (req, res) => {
64
+ let uid = req.body.client
58
65
  if (users_pool[req.params.user]) {
59
- let userRes = users_pool[req.params.user].res
60
- for (let uid in users_pool[req.params.user].listeners) {
61
- if (uid === "count")
62
- continue
63
- await disconnect(req.params.user, uid)
64
- }
66
+ await disconnect(req.params.user, uid)
65
67
  userRes.end()
66
68
  }
67
69
  res.json({})
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "corebasic",
3
3
  "type": "module",
4
- "version": "1.0.82",
4
+ "version": "1.0.84",
5
5
  "description": "",
6
6
  "main": "index.js",
7
7
  "scripts": {