corebasic 1.0.51 → 1.0.53

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
@@ -1,57 +1,38 @@
1
1
  import * as Elabase from './elabase.js'
2
2
  import * as Kafka from './kafka.js'
3
- import { createRequire } from 'module';
4
- const require = createRequire(import.meta.url);
3
+ import * as Utils from './utils.js'
5
4
 
6
5
 
7
6
  let features = {}
8
7
  let apis = {}
9
8
 
10
- export function start(app, url) {
11
- let file = url.toString().replace('file://','')
12
- features = require(file)
9
+ export const start = async (app, url, file) => {
10
+ features = await Utils.fileToJson(url, file)
13
11
 
14
- Object.entries(features).forEach(async ([name,feature]) => {
12
+
13
+ // Registering handlers
14
+ for (let name in features) {
15
+ let feature = features[name]
15
16
  apis[feature.api] = apis[feature.api] ?? {}
16
17
  apis[feature.api][name] = feature
17
18
 
18
- let featureName = name
19
-
20
19
  name = name.split('.')
21
20
  let handler = name.pop()
22
21
  name = `src/${name.join('/')}`
23
22
 
24
23
  if (name === 'src/transactions/query')
25
- return
24
+ continue
26
25
 
27
26
  feature.handler = (await import(`${new URL(`${name}.js`, url).toString().replace('file://', '')}`))[handler]
27
+ }
28
28
 
29
- if (feature.api.split(' ')[0].toLowerCase() !== "get") {
30
- let topic = feature.topic
31
- Kafka.receive(`Features.${topic}`, `${featureName}.${topic}`, async (topic, message) => {
32
-
33
- const timer = ms => new Promise(res => setTimeout(res, ms)) // A promise that resolves after "ms" Milliseconds
34
- topic = topic.replace('Features.','')
35
- while (true) {
36
- try {
37
- await features[message.feature].handler(topic, message)
38
- await Elabase.insert("Features.txns", {_id: message.txn, status: "Processed"})
39
- break
40
- } catch {
41
- console.warn(`Feature: ${featureName}, error in executing handler during Kafka.receive(topic: ${topic})`)
42
- }
43
- await timer(10000);
44
- }
45
- })
46
- }
47
-
48
- })
49
-
50
- Object.entries(apis).forEach(([api,features]) => {
29
+ // Registering apis
30
+ for (let api in apis) {
51
31
  let method = api.split(' ')[0].toLowerCase()
52
32
  let url = api.split(' ')[1]
53
33
  if (api === 'GET /transactions/:id')
54
- return
34
+ continue
35
+
55
36
  app[method](url, async (req, res) => {
56
37
  let feature = features[req.body.feature]
57
38
  let topic = feature.topic
@@ -68,9 +49,38 @@ export function start(app, url) {
68
49
  res.status(err.status ?? 500).json(err)
69
50
  }
70
51
  })
71
- })
52
+ }
53
+
54
+
55
+ // Get unique kafka topics list from features
56
+ let kafkaTopics = []
57
+ for (let name in features) {
58
+ let feature = features[name]
59
+ if (feature.api.split(' ')[0].toLowerCase() === "get" )
60
+ continue
61
+ kafkaTopics = [... new Set(kafkaTopics.concat([feature.topic]))]
62
+ }
72
63
 
64
+ // Subscribe to each topic
65
+ for (let topic of kafkaTopics) {
66
+ Kafka.receive(`Features.${topic}`, async (topic, message) => {
67
+
68
+ const timer = ms => new Promise(res => setTimeout(res, ms)) // A promise that resolves after "ms" Milliseconds
69
+ topic = topic.replace('Features.','')
70
+ while (true) {
71
+ try {
72
+ await features[message.feature].handler(topic, message)
73
+ await Elabase.insert("Features.txns", {_id: message.txn, status: "Processed"})
74
+ break
75
+ } catch {
76
+ console.warn(`Feature: ${message.feature}, error in executing handler during Kafka.receive(topic: ${topic})`)
77
+ }
78
+ await timer(10000);
79
+ }
80
+ })
81
+ }
73
82
 
83
+ // Transaction status api
74
84
  app.get('/transactions/:id', async (req, res) => {
75
85
  try {
76
86
  let items = await Elabase.query("Features.txns", {_id: req.params.id})
@@ -90,7 +100,7 @@ const commandAction = async (req, res, topic) => {
90
100
  try {
91
101
  let {data, feature, app, user, client, version} = req.body
92
102
  let params = req.params
93
- await Kafka.send(`Features.${topic}`, { data, params, feature, app, user, client, version, txn, id: _id, date: new Date().getTime() }, user)
103
+ await Kafka.send(`Features.${topic}`, { data, params, feature, app, user, client, version, txn, id: _id, date: new Date().getTime() }, user, { compression: Kafka.CompressionTypes.GZIP })
94
104
 
95
105
  } catch {
96
106
  throw {status: 500, message: "Failed to queue the transaction"}
package/libs/kafka.js CHANGED
@@ -1,6 +1,7 @@
1
- import { Kafka, logLevel as KafkaLogLevel } from 'kafkajs'
1
+ import { Kafka, logLevel as KafkaLogLevel, CompressionTypes as KafkaCompressionTypes } from 'kafkajs'
2
2
 
3
3
  export const logLevel = KafkaLogLevel
4
+ export const CompressionTypes = KafkaCompressionTypes
4
5
 
5
6
  let kafka, producer, admin
6
7
 
@@ -68,7 +69,7 @@ const start_consumer = async function (topic, groupId, callback) {
68
69
  // Producer
69
70
  // ===========
70
71
  let producerInvoked = false
71
- const start_producer = async function (topic, message, key) {
72
+ const start_producer = async function (topic, message, key, options) {
72
73
 
73
74
  let isJson = Object.prototype.toString.call(message) === '[object Object]' || Object.prototype.toString.call(message) === '[object Array]'
74
75
 
@@ -79,6 +80,7 @@ const start_producer = async function (topic, message, key) {
79
80
  let value = isJson ? JSON.stringify(message) : message
80
81
  await producer.send({
81
82
  topic: topic,
83
+ ...(options ?? {}),
82
84
  messages: [
83
85
  key ? { key, value} : {value},
84
86
  ],
@@ -99,9 +101,9 @@ export const receive = async function(topic, groupId, callback) {
99
101
  }
100
102
 
101
103
 
102
- export const send = async function(topic, message, key) {
104
+ export const send = async function(topic, message, key, options) {
103
105
  topic = topicPrefix + topic
104
- await start_producer(topic, message, key)
106
+ await start_producer(topic, message, key, options)
105
107
  }
106
108
 
107
109
 
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "corebasic",
3
3
  "type": "module",
4
- "version": "1.0.51",
4
+ "version": "1.0.53",
5
5
  "description": "",
6
6
  "main": "index.js",
7
7
  "scripts": {