akeyless-server-commons 1.0.205 → 1.0.207

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/dist/cjs/helpers/postponed_actions.d.ts +7 -17
  2. package/dist/cjs/helpers/postponed_actions.js +25 -26
  3. package/dist/cjs/helpers/postponed_actions.js.map +1 -1
  4. package/dist/cjs/helpers/tasks.d.ts +12 -0
  5. package/dist/cjs/helpers/tasks.js +62 -0
  6. package/dist/cjs/helpers/tasks.js.map +1 -0
  7. package/dist/cjs/helpers/tasks_helpers.d.ts +2 -1
  8. package/dist/cjs/helpers/tasks_helpers.js +1 -0
  9. package/dist/cjs/helpers/tasks_helpers.js.map +1 -1
  10. package/dist/cjs/managers/cacche_manager2.d.ts +18 -0
  11. package/dist/cjs/managers/cacche_manager2.js +41 -0
  12. package/dist/cjs/managers/cacche_manager2.js.map +1 -0
  13. package/dist/cjs/managers/socket_manager.js +245 -0
  14. package/dist/cjs/managers/socket_manager.js.map +1 -0
  15. package/dist/esm/helpers/postponed_actions.d.ts +7 -17
  16. package/dist/esm/helpers/postponed_actions.js +12 -12
  17. package/dist/esm/helpers/postponed_actions.js.map +1 -1
  18. package/dist/esm/helpers/tasks.d.ts +12 -0
  19. package/dist/esm/helpers/tasks.js +58 -0
  20. package/dist/esm/helpers/tasks.js.map +1 -0
  21. package/dist/esm/helpers/tasks_helpers.d.ts +2 -1
  22. package/dist/esm/helpers/tasks_helpers.js +1 -0
  23. package/dist/esm/helpers/tasks_helpers.js.map +1 -1
  24. package/dist/esm/managers/cacche_manager2.d.ts +18 -0
  25. package/dist/esm/managers/cacche_manager2.js +37 -0
  26. package/dist/esm/managers/cacche_manager2.js.map +1 -0
  27. package/dist/esm/managers/socket_manager.js +243 -0
  28. package/dist/esm/managers/socket_manager.js.map +1 -0
  29. package/package.json +1 -1
  30. package/dist/cjs/helpers/rabbitmq_helpers.d.ts +0 -64
  31. package/dist/cjs/helpers/rabbitmq_helpers.js +0 -193
  32. package/dist/cjs/helpers/rabbitmq_helpers.js.map +0 -1
  33. package/dist/esm/helpers/rabbitmq_helpers.d.ts +0 -64
  34. package/dist/esm/helpers/rabbitmq_helpers.js +0 -186
  35. package/dist/esm/helpers/rabbitmq_helpers.js.map +0 -1
  36. package/dist/helpers/boards_helpers.js +0 -62
  37. package/dist/helpers/email_helpers.js +0 -153
  38. package/dist/helpers/firebase_helpers.js +0 -601
  39. package/dist/helpers/global_helpers.js +0 -147
  40. package/dist/helpers/index.js +0 -13
  41. package/dist/helpers/location_helpers.js +0 -15
  42. package/dist/helpers/login_helpers.js +0 -18
  43. package/dist/helpers/notification_helpers.js +0 -248
  44. package/dist/helpers/phone_number_helpers.js +0 -96
  45. package/dist/helpers/postponed_actions.js +0 -358
  46. package/dist/helpers/redis/helpers.js +0 -215
  47. package/dist/helpers/redis/index.js +0 -4
  48. package/dist/helpers/redis/initialize.js +0 -139
  49. package/dist/helpers/redis/keys.js +0 -23
  50. package/dist/helpers/redis/snapshot.js +0 -166
  51. package/dist/helpers/start.js +0 -83
  52. package/dist/helpers/tasks_helpers.js +0 -139
  53. package/dist/helpers/time_helpers.js +0 -167
  54. package/dist/index.js +0 -5
  55. package/dist/managers/cache_manager.js +0 -37
  56. package/dist/managers/index.js +0 -4
  57. package/dist/managers/logger_manager.js +0 -68
  58. package/dist/managers/rabbitmq_manager.js +0 -182
  59. package/dist/managers/translation_manager.js +0 -38
  60. package/dist/middlewares/auth_mw.js +0 -50
  61. package/dist/middlewares/error_handling.js +0 -20
  62. package/dist/middlewares/global_mw.js +0 -119
  63. package/dist/middlewares/index.js +0 -4
  64. package/dist/middlewares/trim_mw.js +0 -7
  65. package/dist/test.js +0 -1
  66. package/dist/types/enums/global.js +0 -8
  67. package/dist/types/enums/index.js +0 -1
  68. package/dist/types/helpers/boards_helpers.d.ts +0 -10
  69. package/dist/types/helpers/email_helpers.d.ts +0 -12
  70. package/dist/types/helpers/firebase_helpers.d.ts +0 -56
  71. package/dist/types/helpers/global_helpers.d.ts +0 -16
  72. package/dist/types/helpers/index.d.ts +0 -13
  73. package/dist/types/helpers/location_helpers.d.ts +0 -3
  74. package/dist/types/helpers/login_helpers.d.ts +0 -4
  75. package/dist/types/helpers/notification_helpers.d.ts +0 -11
  76. package/dist/types/helpers/phone_number_helpers.d.ts +0 -19
  77. package/dist/types/helpers/postponed_actions.d.ts +0 -113
  78. package/dist/types/helpers/redis/helpers.d.ts +0 -11
  79. package/dist/types/helpers/redis/index.d.ts +0 -4
  80. package/dist/types/helpers/redis/initialize.d.ts +0 -6
  81. package/dist/types/helpers/redis/keys.d.ts +0 -5
  82. package/dist/types/helpers/redis/snapshot.d.ts +0 -2
  83. package/dist/types/helpers/start.d.ts +0 -4
  84. package/dist/types/helpers/tasks_helpers.d.ts +0 -25
  85. package/dist/types/helpers/time_helpers.d.ts +0 -40
  86. package/dist/types/index.d.ts +0 -5
  87. package/dist/types/index.js +0 -3
  88. package/dist/types/interfaces/index.js +0 -2
  89. package/dist/types/managers/cache_manager.d.ts +0 -12
  90. package/dist/types/managers/index.d.ts +0 -4
  91. package/dist/types/managers/logger_manager.d.ts +0 -14
  92. package/dist/types/managers/rabbitmq_manager.d.ts +0 -60
  93. package/dist/types/managers/translation_manager.d.ts +0 -14
  94. package/dist/types/middlewares/auth_mw.d.ts +0 -4
  95. package/dist/types/middlewares/error_handling.d.ts +0 -11
  96. package/dist/types/middlewares/global_mw.d.ts +0 -5
  97. package/dist/types/middlewares/index.d.ts +0 -4
  98. package/dist/types/middlewares/trim_mw.d.ts +0 -2
  99. package/dist/types/test.d.ts +0 -0
  100. package/dist/types/types/enums/global.d.ts +0 -9
  101. package/dist/types/types/enums/index.d.ts +0 -1
  102. package/dist/types/types/firebase_types.js +0 -1
  103. package/dist/types/types/global.js +0 -1
  104. package/dist/types/types/index.d.ts +0 -3
  105. package/dist/types/types/index.js +0 -2
  106. package/dist/types/types/interfaces/email.d.ts +0 -33
  107. package/dist/types/types/interfaces/global.d.ts +0 -27
  108. package/dist/types/types/interfaces/index.d.ts +0 -2
  109. package/dist/types/types/types/firebase_types.d.ts +0 -50
  110. package/dist/types/types/types/global.d.ts +0 -17
  111. package/dist/types/types/types/index.d.ts +0 -2
  112. /package/dist/{types/interfaces/email.js → cjs/managers/socket_manager.d.ts} +0 -0
  113. /package/dist/{types/interfaces/global.js → esm/managers/socket_manager.d.ts} +0 -0
@@ -1,139 +0,0 @@
1
- import Redis from "ioredis";
2
- import { REDIS_UPDATES_PREFIX } from "akeyless-types-commons";
3
- import { get_collection_keys } from "./keys";
4
- import { init_env_variables } from "../global_helpers";
5
- import { logger } from "../../managers";
6
- import dotenv from "dotenv";
7
- dotenv.config();
8
- export let redis_commander_connected = false;
9
- export let redis_listener_connected = false;
10
- const MAX_RETRY_ATTEMPTS = 2;
11
- let redis_commander;
12
- let redis_listener;
13
- let redis_initialized = false;
14
- function create_redis_instance(role) {
15
- let retry_attempts = 0;
16
- const base_config = {
17
- host: init_env_variables(["redis_ip"]).redis_ip,
18
- lazyConnect: true,
19
- enableOfflineQueue: false,
20
- maxRetriesPerRequest: 0,
21
- reconnectOnError: () => false,
22
- retryStrategy(times) {
23
- retry_attempts = times;
24
- if (retry_attempts >= MAX_RETRY_ATTEMPTS) {
25
- logger.error(`❌ Redis ${role} failed after ${MAX_RETRY_ATTEMPTS} attempts. Stopping retries.`);
26
- return null;
27
- }
28
- const delay = 1000;
29
- logger.warn(`⚠️ Redis ${role} retry attempt ${retry_attempts}/${MAX_RETRY_ATTEMPTS} in ${delay}ms...`);
30
- return delay;
31
- },
32
- };
33
- // Listener needs enableReadyCheck: false because it will be in subscriber mode
34
- // and cannot respond to PING commands
35
- const config = role === "listener"
36
- ? { ...base_config, enableReadyCheck: false }
37
- : base_config;
38
- const client = new Redis(config);
39
- client.on("connect", () => {
40
- logger.log(`✅ Redis ${role} connected`);
41
- if (role === "commander")
42
- redis_commander_connected = true;
43
- if (role === "listener")
44
- redis_listener_connected = true;
45
- });
46
- client.on("error", (err) => logger.error(`❌ Redis ${role} error`, err));
47
- client.on("close", () => {
48
- logger.warn(`ℹ️ Redis ${role} connection closed`);
49
- if (role === "commander")
50
- redis_commander_connected = false;
51
- if (role === "listener")
52
- redis_listener_connected = false;
53
- });
54
- client.on("end", () => {
55
- logger.warn(`ℹ️ Redis ${role} connection ended`);
56
- if (role === "commander")
57
- redis_commander_connected = false;
58
- if (role === "listener")
59
- redis_listener_connected = false;
60
- });
61
- client.connect().catch((err) => {
62
- logger.error(`❌ Redis ${role} initial connect failed`, err);
63
- });
64
- return client;
65
- }
66
- export const init_redis = () => {
67
- return new Promise((resolve, reject) => {
68
- if (redis_initialized) {
69
- resolve();
70
- return;
71
- }
72
- redis_commander = create_redis_instance("commander");
73
- redis_listener = create_redis_instance("listener");
74
- redis_initialized = true;
75
- let commander_ready = false;
76
- let listener_ready = false;
77
- let listener_subscribed = false;
78
- const check_and_resolve = () => {
79
- if (commander_ready && listener_ready) {
80
- resolve();
81
- }
82
- };
83
- redis_commander.on("connect", () => {
84
- commander_ready = true;
85
- check_and_resolve();
86
- });
87
- redis_listener.on("connect", () => {
88
- listener_ready = true;
89
- // Only subscribe once, not on every reconnect
90
- // ioredis will automatically resubscribe on reconnection
91
- if (!listener_subscribed) {
92
- listener_subscribed = true;
93
- const redis_pattern = get_collection_keys(REDIS_UPDATES_PREFIX);
94
- redis_listener
95
- .psubscribe(redis_pattern)
96
- .then(() => logger.log(`✅ Subscribed to Redis pattern: ${redis_pattern}`))
97
- .catch((err) => logger.error(`❌ Failed to psubscribe to ${redis_pattern}`, err));
98
- }
99
- check_and_resolve();
100
- });
101
- // Handle case where Redis connections fail
102
- const connection_timeout = setTimeout(() => {
103
- if (!commander_ready || !listener_ready) {
104
- logger.warn("⚠️ Redis connection timeout, proceeding without Redis");
105
- resolve();
106
- }
107
- }, 5000);
108
- redis_commander.on("error", () => {
109
- if (!commander_ready && !listener_ready) {
110
- clearTimeout(connection_timeout);
111
- reject();
112
- }
113
- });
114
- redis_listener.on("error", () => {
115
- if (!commander_ready && !listener_ready) {
116
- clearTimeout(connection_timeout);
117
- reject();
118
- }
119
- });
120
- process.on("unhandledRejection", (err) => {
121
- logger.error("❌ Unhandled promise rejection", err);
122
- });
123
- process.on("uncaughtException", (err) => {
124
- logger.error("❌ Uncaught exception", err);
125
- });
126
- });
127
- };
128
- export const get_redis_commander = () => {
129
- if (!redis_commander) {
130
- throw new Error("Redis commander not initialized. Call init_redis() first.");
131
- }
132
- return redis_commander;
133
- };
134
- export const get_redis_listener = () => {
135
- if (!redis_listener) {
136
- throw new Error("Redis listener not initialized. Call init_redis() first.");
137
- }
138
- return redis_listener;
139
- };
@@ -1,23 +0,0 @@
1
- import { REDIS_UPDATES_PREFIX } from "akeyless-types-commons";
2
- const get_key = (...args) => {
3
- return args.join(":");
4
- };
5
- export const get_doc_key = (collection, doc_id) => {
6
- return get_key(collection, doc_id);
7
- };
8
- export const get_collection_keys = (collection) => {
9
- return get_key(collection, "*");
10
- };
11
- export const get_channel = (...args) => {
12
- return get_key(REDIS_UPDATES_PREFIX, ...args);
13
- };
14
- export const scan_redis_keys = async (pattern, redis_publisher) => {
15
- const found_keys = [];
16
- let cursor = "0";
17
- do {
18
- const [next_cursor, keys] = await redis_publisher.scan(cursor, "MATCH", pattern, "COUNT", 100);
19
- cursor = next_cursor;
20
- found_keys.push(...keys);
21
- } while (cursor !== "0");
22
- return found_keys;
23
- };
@@ -1,166 +0,0 @@
1
- import { get_redis_commander, get_redis_listener, redis_commander_connected, redis_listener_connected } from "./initialize";
2
- import { get_nx_settings, parse_add_update_as_array, parse_add_update_as_object, parse_delete_as_array, parse_delete_as_object, snapshot, } from "../firebase_helpers";
3
- import { get_collection_keys, scan_redis_keys } from "./keys";
4
- import { Timestamp } from "firebase-admin/firestore";
5
- import { logger } from "../../managers";
6
- const subscription_collections = new Set();
7
- export const redis_snapshots_bulk = async (configs) => {
8
- if (configs.length === 0) {
9
- return;
10
- }
11
- /// on first time
12
- for (const config of configs) {
13
- const validation = await validate_config(config);
14
- if (!validation.success) {
15
- logger.warn(validation.message, config);
16
- if (validation.trigger_firebase_snapshot) {
17
- await snapshot(config);
18
- }
19
- continue;
20
- }
21
- await parse_redis_snapshot(config);
22
- }
23
- /// on update
24
- get_redis_listener().on("pmessage", async (pattern, channel, message) => {
25
- const { collection_name, update_type, data: doc } = JSON.parse(message);
26
- const update = [convert_object_timestamps(doc)];
27
- const relevant_configs = configs.filter((config) => config.collection_name === collection_name);
28
- for (const config of relevant_configs) {
29
- await parse_redis_snapshot(config, { update_type, update });
30
- }
31
- });
32
- };
33
- const validate_config = async (config) => {
34
- const nx_settings = await get_nx_settings();
35
- const cache_collections_config = nx_settings.cache_collections_config || {};
36
- const { collection_name, cache_name = collection_name, subscription_type = "firebase" } = config;
37
- if (!redis_commander_connected || !redis_listener_connected) {
38
- return {
39
- success: false,
40
- trigger_firebase_snapshot: true,
41
- message: `⚠️ Redis commander or listener not connected, triggered firebase snapshot for collection: "${collection_name}"`,
42
- };
43
- }
44
- if (subscription_type === "firebase") {
45
- return {
46
- success: false,
47
- trigger_firebase_snapshot: true,
48
- message: `⚠️ subscription type is "firebase", triggered firebase snapshot for collection: "${collection_name}"`,
49
- };
50
- }
51
- if (!cache_collections_config[collection_name] || cache_collections_config[collection_name].sync_direction === "redis_to_firebase") {
52
- return {
53
- success: false,
54
- trigger_firebase_snapshot: true,
55
- message: `⚠️ collection: "${collection_name}" not found in cache_collections_config in "nx-settings" or sync_direction is "redis_to_firebase", triggered firebase snapshot for collection: "${collection_name}"`,
56
- };
57
- }
58
- if (subscription_collections.has(cache_name)) {
59
- return {
60
- success: false,
61
- trigger_firebase_snapshot: false,
62
- message: `⚠️ collection: "${collection_name}" already has a subscription, skipped redis snapshot for collection: "${collection_name}"`,
63
- };
64
- }
65
- subscription_collections.add(cache_name);
66
- return { success: true };
67
- };
68
- const parse_redis_snapshot = async (config, redis_update) => {
69
- const { collection_name: config_collection_name, cache_name = config_collection_name, extra_parsers, parse_as, debug, on_add, on_remove, on_modify, } = config;
70
- if (!redis_update) {
71
- const init_data = await get_collection_data(config_collection_name);
72
- default_parsers(parse_as, init_data, config);
73
- if (debug?.on_first_time) {
74
- logger.log(`${cache_name} => Redis snapshot on first time: `, debug.on_first_time === "documents" ? init_data : { length: init_data.length });
75
- }
76
- config.on_first_time?.(init_data, config);
77
- extra_parsers?.forEach((parser) => {
78
- if (debug?.extra_parsers?.on_first_time) {
79
- logger.log(`${cache_name} => Redis snapshot extra parsers on first time: `, debug.extra_parsers.on_first_time === "documents" ? init_data : { length: init_data.length });
80
- }
81
- parser?.on_first_time?.(init_data, config);
82
- });
83
- return;
84
- }
85
- if (!subscription_collections.has(cache_name)) {
86
- return;
87
- }
88
- const { update_type, update } = redis_update;
89
- switch (update_type) {
90
- case "add":
91
- if (debug?.on_add) {
92
- logger.log(`${cache_name} => Redis snapshot on add: `, update);
93
- }
94
- default_parsers(parse_as, update, config);
95
- on_add?.(update, config);
96
- extra_parsers?.forEach((parser) => {
97
- if (debug?.extra_parsers?.on_add) {
98
- logger.log(`${cache_name} => Redis snapshot extra parsers on add: `, update);
99
- }
100
- parser?.on_add?.(update, config);
101
- });
102
- return;
103
- case "update":
104
- if (debug?.on_modify) {
105
- logger.log(`${cache_name} => Redis snapshot on modify: `, update);
106
- }
107
- default_parsers(parse_as, update, config);
108
- on_modify?.(update, config);
109
- extra_parsers?.forEach((parser) => {
110
- if (debug?.extra_parsers?.on_modify) {
111
- logger.log(`${cache_name} => Redis snapshot extra parsers on modify: `, update);
112
- }
113
- parser?.on_modify?.(update, config);
114
- });
115
- return;
116
- case "delete":
117
- if (debug?.on_remove) {
118
- logger.log(`${cache_name} => Redis snapshot on remove: `, update);
119
- }
120
- if (parse_as === "object") {
121
- parse_delete_as_object(update, config);
122
- }
123
- if (parse_as === "array") {
124
- parse_delete_as_array(update, config);
125
- }
126
- on_remove?.(update, config);
127
- extra_parsers?.forEach((parser) => {
128
- if (debug?.extra_parsers?.on_remove) {
129
- logger.log(`${cache_name} => Redis snapshot extra parsers on remove: `, update);
130
- }
131
- parser?.on_remove?.(update, config);
132
- });
133
- return;
134
- default:
135
- return;
136
- }
137
- };
138
- const default_parsers = (parse_as, update, config) => {
139
- if (parse_as === "object") {
140
- parse_add_update_as_object(update, config);
141
- }
142
- if (parse_as === "array") {
143
- parse_add_update_as_array(update, config);
144
- }
145
- };
146
- const get_collection_data = async (collection_name) => {
147
- const redis_commander = get_redis_commander();
148
- const keys = await scan_redis_keys(get_collection_keys(collection_name), redis_commander);
149
- let collection_data = [];
150
- if (keys.length > 0) {
151
- const values = await redis_commander.mget(keys);
152
- collection_data = values.filter(Boolean).map((v) => JSON.parse(v).data);
153
- }
154
- return collection_data.map((data) => convert_object_timestamps(data));
155
- };
156
- const convert_object_timestamps = (data) => {
157
- Object.entries(data).forEach(([key, value]) => {
158
- if (typeof value === "object" && value && value._seconds !== undefined) {
159
- data[key] = new Timestamp(value._seconds, value._nanoseconds);
160
- }
161
- if (typeof value === "object" && value && value._seconds === undefined) {
162
- convert_object_timestamps(value);
163
- }
164
- });
165
- return data;
166
- };
@@ -1,83 +0,0 @@
1
- import express from "express";
2
- import cors from "cors";
3
- import { logger } from "../managers";
4
- import { init_env_variables, init_snapshots } from "./";
5
- import { error_handler } from "../middlewares/error_handling";
6
- import { request_logger, trim_body_middleware } from "../middlewares";
7
- import { init_redis } from "./redis/initialize";
8
- import axios from "axios";
9
- import https from "https";
10
- import http from "http";
11
- import { rabbitmq } from "../managers/rabbitmq_manager";
12
- export const start_server = async (main_router, project_name, version, options = {}) => {
13
- let env_data = init_env_variables(["mode"]);
14
- const { port = Number(env_data.port), log_requests, initialize_redis = true, enable_axios_keep_alive = true } = options;
15
- const app = express();
16
- app.use(cors());
17
- app.use(express.json({ limit: "10mb" }));
18
- app.use(express.urlencoded({ limit: "10mb", extended: true }));
19
- app.use(trim_body_middleware());
20
- app.use(request_logger(log_requests || {}));
21
- main_router(app);
22
- app.use(error_handler);
23
- if (enable_axios_keep_alive) {
24
- keep_axios_alive();
25
- }
26
- return new Promise((resolve) => {
27
- app.listen(port, async () => {
28
- logger.log(`Server is running at http://localhost:${port}`);
29
- logger.log("project status", { project_name, version, environment: env_data.mode });
30
- if (initialize_redis) {
31
- try {
32
- logger.log("Initializing Redis...");
33
- await init_redis();
34
- }
35
- catch (err) {
36
- logger.warn("Redis unavailable, continuing without it", { err });
37
- }
38
- }
39
- resolve(app);
40
- });
41
- });
42
- };
43
- export const basic_init = async (main_router, project_name, version, options = {}) => {
44
- const { init_snapshot_options, on_shutdown } = options;
45
- try {
46
- const app = await start_server(main_router, project_name, version, options);
47
- await init_snapshots(init_snapshot_options);
48
- const shutdown = async (signal) => {
49
- logger.log(`Received ${signal}, shutting down...`);
50
- try {
51
- await rabbitmq.cancel_subscriptions();
52
- await rabbitmq.close();
53
- await on_shutdown?.();
54
- }
55
- catch (err) {
56
- logger.error("Shutdown error", err);
57
- process.exit(1);
58
- }
59
- process.exit(0);
60
- };
61
- process.once("SIGINT", () => void shutdown("SIGINT"));
62
- process.once("SIGTERM", () => void shutdown("SIGTERM"));
63
- return app;
64
- }
65
- catch (error) {
66
- logger.error("Error from init function: ", error);
67
- process.exit(1);
68
- }
69
- };
70
- const keep_axios_alive = () => {
71
- axios.defaults.httpsAgent = new https.Agent({
72
- keepAlive: true,
73
- maxSockets: 100,
74
- maxFreeSockets: 20,
75
- timeout: 60000,
76
- });
77
- axios.defaults.httpAgent = new http.Agent({
78
- keepAlive: true,
79
- maxSockets: 100,
80
- maxFreeSockets: 20,
81
- timeout: 60000,
82
- });
83
- };
@@ -1,139 +0,0 @@
1
- import { cache_manager, logger } from "../managers";
2
- import { get_document_by_id_optional, set_document } from "./firebase_helpers";
3
- import admin from "firebase-admin";
4
- export var TaskName;
5
- (function (TaskName) {
6
- TaskName["send_reset_sms"] = "send_reset_sms";
7
- TaskName["collect_devices_health"] = "collect_devices_health";
8
- TaskName["collect_charge_locations"] = "collect_charge_locations";
9
- TaskName["collect_charge_cdrs"] = "collect_charge_cdrs";
10
- TaskName["auto_connect_to_call_center"] = "auto_connect_to_call_center";
11
- TaskName["make_erm_ev_events"] = "make_erm_ev_events";
12
- TaskName["collect_jimi_cars_odometer"] = "collect_jimi_cars_odometer";
13
- })(TaskName || (TaskName = {}));
14
- export var TaskStatus;
15
- (function (TaskStatus) {
16
- TaskStatus["running"] = "running";
17
- TaskStatus["completed"] = "completed";
18
- TaskStatus["failed"] = "failed";
19
- TaskStatus["suspeneded"] = "suspeneded";
20
- })(TaskStatus || (TaskStatus = {}));
21
- const save_task_data_in_cache = (task_name, data) => {
22
- if (Array.isArray(data)) {
23
- cache_manager.setArrayData(task_name, data);
24
- }
25
- else {
26
- cache_manager.setObjectData(task_name, data);
27
- }
28
- };
29
- export const execute_task = async (source, task_name, task, options) => {
30
- const { debug_logs = true, save_in } = options || {};
31
- try {
32
- await set_document("nx-tasks", task_name, {
33
- source,
34
- status: TaskStatus.running,
35
- started: new Date(),
36
- timestamp: new Date(),
37
- error: "",
38
- }, false);
39
- if (debug_logs) {
40
- logger.log(`Task [${task_name}] started`);
41
- }
42
- const start = performance.now();
43
- const data = await task();
44
- const update = {
45
- status: TaskStatus.completed,
46
- completed: new Date(),
47
- timestamp: new Date(),
48
- };
49
- if (data) {
50
- if (save_in === "none") {
51
- update.data = "no data to save";
52
- }
53
- else if (save_in === "storage" && typeof data === "object") {
54
- save_task_data_in_cache(task_name, data);
55
- const url = await keep_task_data_in_storage(task_name, data);
56
- update.data = url;
57
- }
58
- else {
59
- save_task_data_in_cache(task_name, data);
60
- update.data = data;
61
- }
62
- }
63
- else {
64
- update.data = "no data to save";
65
- }
66
- await set_document("nx-tasks", task_name, update);
67
- if (debug_logs) {
68
- logger.log(`Task [${task_name}] ended. It took ${Math.round(performance.now() - start)} ms`);
69
- }
70
- }
71
- catch (exception) {
72
- const error_for_db = exception instanceof Error ? exception.message : exception;
73
- logger.error(`Task [${task_name}] error`, error_for_db);
74
- await set_document("nx-tasks", task_name, {
75
- status: TaskStatus.failed,
76
- completed: new Date(),
77
- timestamp: new Date(),
78
- error: error_for_db,
79
- });
80
- }
81
- };
82
- export const get_task_data = async (task_name) => {
83
- const cached_data = cache_manager.getArrayData(task_name);
84
- const cached_data_object = cache_manager.getObjectData(task_name, null);
85
- if (cached_data.length > 0) {
86
- return cached_data;
87
- }
88
- if (cached_data_object) {
89
- return cached_data;
90
- }
91
- const task_data = await get_document_by_id_optional("nx-tasks", task_name);
92
- if (typeof task_data?.data === "string" && task_data.data.startsWith("http")) {
93
- const storage_data = await get_task_data_from_storage(task_name);
94
- if (storage_data) {
95
- const value = storage_data;
96
- save_task_data_in_cache(task_name, storage_data);
97
- return value;
98
- }
99
- }
100
- const value = typeof task_data?.data === "object" ? task_data.data : null;
101
- if (value) {
102
- save_task_data_in_cache(task_name, value);
103
- }
104
- return value || [];
105
- };
106
- export const get_task_data_from_storage = async (task_name) => {
107
- const bucket = admin.storage().bucket();
108
- const file = bucket.file(`tasks_data/${task_name}.json`);
109
- try {
110
- const [contents] = await file.download();
111
- return JSON.parse(contents.toString("utf-8"));
112
- }
113
- catch (error) {
114
- logger.error("Task error reading file from Firebase Storage:", error);
115
- return null;
116
- }
117
- };
118
- export const keep_task_data_in_storage = async (task_name, data) => {
119
- const bucket = admin.storage().bucket();
120
- const file = bucket.file(`tasks_data/${task_name}.json`);
121
- try {
122
- if (typeof data !== "object") {
123
- throw new Error("Only arrays or objects can be written");
124
- }
125
- const json_string = JSON.stringify(data, null);
126
- await file.save(json_string, {
127
- contentType: "application/json",
128
- });
129
- const [signed_url] = await file.getSignedUrl({
130
- action: "read",
131
- expires: Date.now() + 1000 * 60 * 60 * 24 * 7,
132
- });
133
- return signed_url;
134
- }
135
- catch (error) {
136
- logger.error("Error writing file to Firebase Storage:", error);
137
- return "";
138
- }
139
- };