akeyless-server-commons 1.0.191 → 1.0.192

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 (97) hide show
  1. package/dist/cjs/helpers/firebase_helpers.d.ts +1 -1
  2. package/dist/cjs/helpers/firebase_helpers.js +4 -2
  3. package/dist/cjs/helpers/firebase_helpers.js.map +1 -1
  4. package/dist/cjs/helpers/global_helpers.d.ts +1 -1
  5. package/dist/cjs/helpers/tasks.d.ts +12 -0
  6. package/dist/cjs/helpers/tasks.js +62 -0
  7. package/dist/cjs/helpers/tasks.js.map +1 -0
  8. package/dist/cjs/managers/cacche_manager2.d.ts +18 -0
  9. package/dist/cjs/managers/cacche_manager2.js +41 -0
  10. package/dist/cjs/managers/cacche_manager2.js.map +1 -0
  11. package/dist/cjs/managers/socket_manager.js +245 -0
  12. package/dist/cjs/managers/socket_manager.js.map +1 -0
  13. package/dist/esm/helpers/firebase_helpers.d.ts +1 -1
  14. package/dist/esm/helpers/firebase_helpers.js +4 -2
  15. package/dist/esm/helpers/firebase_helpers.js.map +1 -1
  16. package/dist/esm/helpers/global_helpers.d.ts +1 -1
  17. package/dist/esm/helpers/tasks.d.ts +12 -0
  18. package/dist/esm/helpers/tasks.js +58 -0
  19. package/dist/esm/helpers/tasks.js.map +1 -0
  20. package/dist/esm/managers/cacche_manager2.d.ts +18 -0
  21. package/dist/esm/managers/cacche_manager2.js +37 -0
  22. package/dist/esm/managers/cacche_manager2.js.map +1 -0
  23. package/dist/esm/managers/socket_manager.js +243 -0
  24. package/dist/esm/managers/socket_manager.js.map +1 -0
  25. package/package.json +1 -1
  26. package/dist/helpers/boards_helpers.js +0 -62
  27. package/dist/helpers/email_helpers.js +0 -153
  28. package/dist/helpers/firebase_helpers.js +0 -576
  29. package/dist/helpers/global_helpers.js +0 -147
  30. package/dist/helpers/index.js +0 -12
  31. package/dist/helpers/location_helpers.js +0 -15
  32. package/dist/helpers/login_helpers.js +0 -18
  33. package/dist/helpers/notification_helpers.js +0 -234
  34. package/dist/helpers/phone_number_helpers.js +0 -91
  35. package/dist/helpers/redis/index.js +0 -3
  36. package/dist/helpers/redis/initialize.js +0 -139
  37. package/dist/helpers/redis/keys.js +0 -23
  38. package/dist/helpers/redis/snapshot.js +0 -163
  39. package/dist/helpers/start.js +0 -43
  40. package/dist/helpers/tasks_helpers.js +0 -136
  41. package/dist/helpers/time_helpers.js +0 -167
  42. package/dist/index.js +0 -5
  43. package/dist/managers/cache_manager.js +0 -27
  44. package/dist/managers/index.js +0 -3
  45. package/dist/managers/logger_manager.js +0 -51
  46. package/dist/managers/translation_manager.js +0 -38
  47. package/dist/middlewares/auth_mw.js +0 -50
  48. package/dist/middlewares/error_handling.js +0 -20
  49. package/dist/middlewares/global_mw.js +0 -110
  50. package/dist/middlewares/index.js +0 -4
  51. package/dist/middlewares/trim_mw.js +0 -7
  52. package/dist/test.js +0 -1
  53. package/dist/types/enums/global.js +0 -8
  54. package/dist/types/enums/index.js +0 -1
  55. package/dist/types/helpers/boards_helpers.d.ts +0 -10
  56. package/dist/types/helpers/email_helpers.d.ts +0 -12
  57. package/dist/types/helpers/firebase_helpers.d.ts +0 -55
  58. package/dist/types/helpers/global_helpers.d.ts +0 -16
  59. package/dist/types/helpers/index.d.ts +0 -12
  60. package/dist/types/helpers/location_helpers.d.ts +0 -3
  61. package/dist/types/helpers/login_helpers.d.ts +0 -4
  62. package/dist/types/helpers/notification_helpers.d.ts +0 -11
  63. package/dist/types/helpers/phone_number_helpers.d.ts +0 -14
  64. package/dist/types/helpers/redis/index.d.ts +0 -3
  65. package/dist/types/helpers/redis/initialize.d.ts +0 -6
  66. package/dist/types/helpers/redis/keys.d.ts +0 -5
  67. package/dist/types/helpers/redis/snapshot.d.ts +0 -2
  68. package/dist/types/helpers/start.d.ts +0 -4
  69. package/dist/types/helpers/tasks_helpers.d.ts +0 -22
  70. package/dist/types/helpers/time_helpers.d.ts +0 -40
  71. package/dist/types/index.d.ts +0 -5
  72. package/dist/types/index.js +0 -3
  73. package/dist/types/interfaces/index.js +0 -2
  74. package/dist/types/managers/cache_manager.d.ts +0 -11
  75. package/dist/types/managers/index.d.ts +0 -3
  76. package/dist/types/managers/logger_manager.d.ts +0 -12
  77. package/dist/types/managers/translation_manager.d.ts +0 -14
  78. package/dist/types/middlewares/auth_mw.d.ts +0 -4
  79. package/dist/types/middlewares/error_handling.d.ts +0 -11
  80. package/dist/types/middlewares/global_mw.d.ts +0 -5
  81. package/dist/types/middlewares/index.d.ts +0 -4
  82. package/dist/types/middlewares/trim_mw.d.ts +0 -2
  83. package/dist/types/test.d.ts +0 -0
  84. package/dist/types/types/enums/global.d.ts +0 -9
  85. package/dist/types/types/enums/index.d.ts +0 -1
  86. package/dist/types/types/firebase_types.js +0 -1
  87. package/dist/types/types/global.js +0 -1
  88. package/dist/types/types/index.d.ts +0 -3
  89. package/dist/types/types/index.js +0 -2
  90. package/dist/types/types/interfaces/email.d.ts +0 -33
  91. package/dist/types/types/interfaces/global.d.ts +0 -23
  92. package/dist/types/types/interfaces/index.d.ts +0 -2
  93. package/dist/types/types/types/firebase_types.d.ts +0 -50
  94. package/dist/types/types/types/global.d.ts +0 -17
  95. package/dist/types/types/types/index.d.ts +0 -2
  96. /package/dist/{types/interfaces/email.js → cjs/managers/socket_manager.d.ts} +0 -0
  97. /package/dist/{types/interfaces/global.js → esm/managers/socket_manager.d.ts} +0 -0
@@ -1,147 +0,0 @@
1
- import { readFileSync } from "fs";
2
- import { cache_manager, logger } from "../managers";
3
- import { LanguageOptions } from "akeyless-types-commons";
4
- import axios from "axios";
5
- import https from "https";
6
- export const init_env_variables = (required_vars = []) => {
7
- required_vars.forEach((varName) => {
8
- const env_val = process.env[varName];
9
- if (!env_val) {
10
- logger.error(`--- Error: Missing mandatory environment variable: ${varName}. ---`);
11
- process.exit(1);
12
- }
13
- });
14
- const env_vars = {};
15
- Object.keys(process.env).forEach((var_name) => {
16
- const env_val = process.env[var_name];
17
- env_vars[var_name] = env_val;
18
- });
19
- return env_vars;
20
- };
21
- export const json_ok = (data) => {
22
- return {
23
- success: true,
24
- data,
25
- };
26
- };
27
- export const json_failed = (error, msg) => {
28
- return {
29
- success: false,
30
- error: error.message || error || "general error: something happened ",
31
- msg: msg,
32
- };
33
- };
34
- export const parse_error = (error) => {
35
- return error instanceof Error ? { name: error.name, message: error.message } : error;
36
- };
37
- export const get_version = (packageJsonPath) => {
38
- const packageJson = JSON.parse(readFileSync(packageJsonPath, "utf8"));
39
- return packageJson.version;
40
- };
41
- export const sleep = (ms = 2500) => new Promise((resolve) => setTimeout(resolve, ms));
42
- const BASE_URLS = {
43
- local: {
44
- bi: "http://localhost:9002/api/bi",
45
- call_center: "http://localhost:9003/api/call-center",
46
- dashboard: "http://localhost",
47
- devices: "http://localhost:9001/api/devices",
48
- end_users: "http://10.100.102.9:9011/api/end-users",
49
- notifications: "http://localhost:9006/api/notifications",
50
- installer: "http://localhost",
51
- ox_server: "http://localhost",
52
- toolbox: "http://localhost",
53
- },
54
- prod: {
55
- bi: "https://nx-api.info/api/bi",
56
- call_center: "https://nx-api.info/api/call-center",
57
- dashboard: "https://akeyless-dashboard.online",
58
- devices: "https://nx-api.info/api/devices",
59
- end_users: "https://nx-api.info/api/end-users",
60
- notifications: "https://nx-api.info/api/notifications",
61
- installer: "https://installerapp.online",
62
- ox_server: "https://akeyless-online.info",
63
- toolbox: "https://akeyless-toolbox.online",
64
- },
65
- qa: {
66
- bi: "https://nx-api.xyz/api/bi",
67
- call_center: "https://nx-api.xyz/api/call-center",
68
- dashboard: "https://akeyless-dashboard.xyz",
69
- devices: "https://nx-api.xyz/api/devices",
70
- end_users: "https://nx-api.xyz/api/end-users",
71
- notifications: "https://nx-api.xyz/api/notifications",
72
- installer: "https://installerapp.xyz",
73
- ox_server: "https://akeyless-online.xyz",
74
- toolbox: "https://akeyless-toolbox.xyz",
75
- },
76
- };
77
- export function get_nx_service_urls(env_name = "mode") {
78
- const env_value = process.env[env_name]?.toLowerCase();
79
- if (!env_value)
80
- throw new Error(`missing [${env_name}] environment variable`);
81
- const env_key = ["production", "prod"].includes(env_value) ? "prod" : env_value === "qa" ? "qa" : "local";
82
- return BASE_URLS[env_key];
83
- }
84
- export const get_address_by_geo = async ({ lat, lng }, currentLanguage) => {
85
- const address_not_found = "";
86
- if (lat < -90 || lat > 90 || lng < -180 || lng > 180) {
87
- return address_not_found;
88
- }
89
- const language = currentLanguage === LanguageOptions.He ? "iw" : "en";
90
- const google_setting = cache_manager.getObjectData("nx-settings")["google"];
91
- const geocode_api_key = google_setting["geocode_api_key"];
92
- if (!geocode_api_key) {
93
- throw new Error("missing env google api key");
94
- }
95
- const url = `https://maps.googleapis.com/maps/api/geocode/json?latlng=${lat},${lng}&key=${geocode_api_key}&language=${language}`;
96
- try {
97
- const response = await axios.get(url);
98
- if (response?.data?.results[0]) {
99
- return response.data.results[0].formatted_address.slice(0, 35);
100
- }
101
- else {
102
- return address_not_found;
103
- }
104
- }
105
- catch (error) {
106
- logger.error("getAddressByGeo error:", error);
107
- return address_not_found;
108
- }
109
- };
110
- export const validate_and_cast = (variable, condition) => !!condition;
111
- export const get_or_default = (value, default_value) => {
112
- if (value !== undefined) {
113
- return value;
114
- }
115
- return typeof default_value === "function" ? default_value() : default_value;
116
- };
117
- export const trim_strings = (input) => {
118
- if (typeof input === "string") {
119
- return input.trim();
120
- }
121
- if (Array.isArray(input)) {
122
- return input.map(trim_strings);
123
- }
124
- if (input instanceof Date || input instanceof RegExp || input instanceof Map || input instanceof Set) {
125
- return input;
126
- }
127
- if (input !== null && typeof input === "object") {
128
- const trimmed_object = {};
129
- for (const key of Object.getOwnPropertyNames(input)) {
130
- if (Object.prototype.hasOwnProperty.call(input, key)) {
131
- trimmed_object[key] = trim_strings(input[key]);
132
- }
133
- }
134
- return trimmed_object;
135
- }
136
- return input;
137
- };
138
- export const remove_nulls_and_undefined = (obj) => {
139
- return Object.fromEntries(Object.entries(obj).filter(([_, value]) => value !== undefined && value !== null));
140
- };
141
- export const ignore_ssl_request = async (config) => {
142
- const { mode } = init_env_variables(["mode"]);
143
- if (mode === "qa") {
144
- config.httpsAgent = new https.Agent({ rejectUnauthorized: false });
145
- }
146
- return await axios(config);
147
- };
@@ -1,12 +0,0 @@
1
- export * from "./global_helpers";
2
- export * from "./firebase_helpers";
3
- export * from "./start";
4
- export * from "./time_helpers";
5
- export * from "./login_helpers";
6
- export * from "./notification_helpers";
7
- export * from "./email_helpers";
8
- export * from "./phone_number_helpers";
9
- export * from "./tasks_helpers";
10
- export * from "./boards_helpers";
11
- export * from "./redis";
12
- export * from "./location_helpers";
@@ -1,15 +0,0 @@
1
- export const get_distance_in_meters_between_geo_points = (location1, location2) => {
2
- const toRadians = (angle) => angle * (Math.PI / 180);
3
- const R = 6371e3;
4
- const φ1 = toRadians(location1.lat);
5
- const φ2 = toRadians(location2.lat);
6
- const Δφ = toRadians(location2.lat - location1.lat);
7
- const Δλ = toRadians(location2.lng - location1.lng);
8
- const a = Math.sin(Δφ / 2) * Math.sin(Δφ / 2) + Math.cos(φ1) * Math.cos(φ2) * Math.sin(Δλ / 2) * Math.sin(Δλ / 2);
9
- const c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));
10
- // distance in meters
11
- return R * c;
12
- };
13
- export const get_location_url = (location) => {
14
- return `https://www.google.com/maps?q=${location.lat},${location.lng}`;
15
- };
@@ -1,18 +0,0 @@
1
- import { query_document_optional } from "./firebase_helpers";
2
- export const convert_to_short_phone_number = (phone_number) => {
3
- return `0${phone_number.split("+972")[1]}`;
4
- };
5
- /// nx user
6
- export const get_user_by_identifier = async (identifier, ignore_log = false) => {
7
- if (identifier.includes("@") && identifier.includes(".")) {
8
- const email_query = await query_document_optional("nx-users", "email", "==", identifier, ignore_log);
9
- return email_query;
10
- }
11
- const phone_query = await query_document_optional("nx-users", "phone_number", "in", [convert_to_short_phone_number(identifier), identifier], ignore_log);
12
- return phone_query;
13
- };
14
- /// mobile app user
15
- export const get_mobile_app_user_by_uid = async (uid, ignore_log = false) => {
16
- const user = (await query_document_optional("mobile_users_app_pro", "uid", "==", uid, ignore_log));
17
- return user;
18
- };
@@ -1,234 +0,0 @@
1
- import axios from "axios";
2
- import { cache_manager, logger, translation_manager } from "../managers";
3
- import { add_document, messaging, add_audit_record } from "./firebase_helpers";
4
- import { is_iccid, is_international_phone_number, is_israel_long_phone_number, is_thailand_long_phone_number } from "./phone_number_helpers";
5
- import { Twilio } from "twilio";
6
- import { Timestamp } from "firebase-admin/firestore";
7
- import { v4 as uniqId } from "uuid";
8
- import FormData from "form-data";
9
- const send_local_sms = async (recepient, text, details) => {
10
- const { sms_provider: { multisend }, } = cache_manager.getObjectData("nx-settings");
11
- const msgId = uniqId();
12
- let data = new FormData();
13
- data.append("user", multisend.user);
14
- data.append("password", multisend.password);
15
- data.append("from", multisend.from);
16
- data.append("recipient", recepient);
17
- data.append("message", text);
18
- data.append("customermessageid", msgId);
19
- if (is_international_phone_number(recepient)) {
20
- data.append("international", "1");
21
- }
22
- const config = {
23
- method: "post",
24
- maxBodyLength: Infinity,
25
- url: "https://api.multisend.co.il/v2/sendsms",
26
- data: data,
27
- };
28
- const response = await axios(config);
29
- if (response.status !== 200) {
30
- throw `multisend request failed , status: ${response.status} , data: ${JSON.stringify(response.data)}`;
31
- }
32
- if (!response.data.success) {
33
- throw `http request to multisend error ${JSON.stringify(response.data.error)}`;
34
- }
35
- await keep_outgoing_sms(recepient, text, "multisend", msgId, details);
36
- logger.log("send_local_sms. message sent successfully", { number: recepient, text, response: response.data });
37
- return "multisend";
38
- };
39
- const send_international_sms = async (recepient, text, details) => {
40
- const { sms_provider: { twilio }, } = cache_manager.getObjectData("nx-settings");
41
- const twilioClient = new Twilio(twilio.account_sid, twilio.token);
42
- const message = await twilioClient.messages.create({
43
- messagingServiceSid: twilio.messaging_service_sid,
44
- body: text,
45
- to: recepient,
46
- });
47
- logger.log("twilio response", message);
48
- if (message.errorMessage) {
49
- throw `twilioClient.messages.create failed: ${message.errorMessage} `;
50
- }
51
- await keep_outgoing_sms(recepient, text, "twilio", message.sid, details);
52
- logger.log("send_international_sms. message sent successfully", { number: recepient, text, response: message });
53
- return "twilio";
54
- };
55
- const login_to_monogoto = async () => {
56
- try {
57
- const { sms_provider: { monogoto }, } = cache_manager.getObjectData("nx-settings");
58
- const data = { UserName: monogoto.user, Password: monogoto.password };
59
- const response = await axios({
60
- method: "post",
61
- url: `https://console.monogoto.io/Auth`,
62
- data,
63
- });
64
- return response.data;
65
- }
66
- catch (error) {
67
- throw `login_to_monogoto failed: ` + error;
68
- }
69
- };
70
- const send_iccid_sms = async (recepient, text, details) => {
71
- const { sms_provider: { monogoto }, } = cache_manager.getObjectData("nx-settings");
72
- const monogoto_auth = await login_to_monogoto();
73
- const data = { Message: text, From: monogoto.from };
74
- const response = await axios({
75
- method: "post",
76
- url: `https://console.monogoto.io/thing/ThingId_ICCID_${recepient}/sms`,
77
- data: data,
78
- headers: {
79
- Authorization: `Bearer ${monogoto_auth.token}`,
80
- apikey: monogoto_auth.CustomerId,
81
- },
82
- });
83
- if (response.status !== 200) {
84
- throw `monogoto request failed , status: ${response.status} , data: ${JSON.stringify(response.data)}`;
85
- }
86
- await keep_outgoing_sms(recepient, text, "monogoto", response.data, details);
87
- logger.log("send_iccid_sms. message sent successfully", { number: recepient, text, response: response.data });
88
- return "monogoto";
89
- };
90
- export const send_sms = async (recepient, text, entity_for_audit, details) => {
91
- try {
92
- const send = async () => {
93
- if (is_iccid(recepient)) {
94
- return await send_iccid_sms(recepient, text, details);
95
- }
96
- const is_international = is_international_phone_number(recepient) && !is_thailand_long_phone_number(recepient) && !is_israel_long_phone_number(recepient);
97
- if (is_international) {
98
- return send_international_sms(recepient, text, details);
99
- }
100
- return await send_local_sms(recepient, text, details);
101
- };
102
- const service = await send();
103
- await add_audit_record("send_sms", entity_for_audit || "general", {
104
- recepient,
105
- message: text,
106
- service,
107
- });
108
- }
109
- catch (error) {
110
- logger.error(`${entity_for_audit}, send_sms failed:`, error);
111
- throw `${entity_for_audit}, send_sms failed: ` + error;
112
- }
113
- };
114
- const keep_outgoing_sms = async (recepient, content, service, external_id, details) => {
115
- const timestamp = Timestamp.now();
116
- const data = {
117
- external_id,
118
- content,
119
- recipient: recepient,
120
- service,
121
- timestamp,
122
- status: "new",
123
- };
124
- if (details) {
125
- data.details = details;
126
- }
127
- await add_document("nx-sms-out", data);
128
- };
129
- export const push_event_to_mobile_users = async (event) => {
130
- const units = cache_manager.getArrayData("units");
131
- const users_units = cache_manager.getArrayData("usersUnits");
132
- const mobile_users_app_pro = cache_manager.getArrayData("mobile_users_app_pro");
133
- const app_pro_extra_pushes = cache_manager.getArrayData("app_pro_extra_pushes");
134
- console.log(`units: ${units.length}, users_units: ${users_units.length}, mobile_users_app_pro: ${mobile_users_app_pro.length}, app_pro_extra_pushes: ${app_pro_extra_pushes.length}`);
135
- if (!units.length || !users_units.length || !mobile_users_app_pro.length) {
136
- throw "push_event_to_mobile_users. missing cached data for any of the following: units, usersUnits, mobile_users_app_pro, app_pro_extra_pushes";
137
- }
138
- ///-- main driver
139
- const unit = units.find((unit) => unit.carId == event.car_number);
140
- const main_driver = mobile_users_app_pro.find((user) => user.short_phone_number == unit.userPhone);
141
- ///-- secondary drivers
142
- const secondary_units = users_units.filter((unit) => unit.carId == event.car_number);
143
- const secondary_phone_numbers = secondary_units.map((unit) => unit.phone);
144
- const secondary_drivers = mobile_users_app_pro.filter((user) => secondary_phone_numbers.includes(user.long_phone_number));
145
- ///-- extra users
146
- const extra_uids = app_pro_extra_pushes.filter((doc) => doc.car_number == event.car_number).map((doc) => doc.uid);
147
- const extra_drivers = extra_uids.length > 0 ? mobile_users_app_pro.filter((user) => extra_uids.includes(user.uid)) : [];
148
- const drivers = [main_driver, ...secondary_drivers, ...extra_drivers];
149
- for (const mobile_user of drivers) {
150
- const source = event.source == "erm" || event.source == "erm2" ? "erm" : event.source;
151
- if (mobile_user.disabled_events?.[event.car_number]?.[source]?.includes(event.event_id)) {
152
- logger.log(`push_event_to_mobile_users. event ${event.event_id} / ${event.event_name} is disabled for user ${mobile_user.uid} / ${mobile_user.short_phone_number}`);
153
- continue;
154
- }
155
- const mobile_user_language = mobile_user.language;
156
- const language = { heb: "he", en: "en", ru: "ru" }[mobile_user_language];
157
- const message_title = translation_manager.get_translation("push_notifications", language, "title", "event_from_device");
158
- const message_body = translation_manager.get_translation("events_from_device", language, "", event.event_name);
159
- await send_fcm_message(message_title, message_body, [mobile_user.fcm_token], "");
160
- }
161
- };
162
- export const send_fcm_message = async (title, body, fcm_tokens, custom_sound) => {
163
- fcm_tokens = [...new Set(fcm_tokens)];
164
- if (fcm_tokens.length == 0) {
165
- return {
166
- success: false,
167
- response: "No recipients",
168
- };
169
- }
170
- if (fcm_tokens.length == 0) {
171
- return {
172
- success: false,
173
- response: "No recipients",
174
- success_count: 0,
175
- failure_count: 0,
176
- };
177
- }
178
- const message = {
179
- tokens: fcm_tokens,
180
- notification: {
181
- title: title,
182
- body: body,
183
- },
184
- android: {
185
- ttl: 3600 * 1000,
186
- priority: "high",
187
- notification: {
188
- sound: custom_sound || "default",
189
- channelId: custom_sound,
190
- title: title,
191
- body: body,
192
- },
193
- },
194
- apns: {
195
- payload: {
196
- aps: {
197
- sound: custom_sound ? `${custom_sound}.wav` : "default",
198
- alert: {
199
- title: title,
200
- body: body,
201
- },
202
- },
203
- },
204
- },
205
- };
206
- try {
207
- const response = await messaging.sendEachForMulticast(message);
208
- const { successCount: success_count, failureCount: failure_count, responses } = response;
209
- if (success_count && !failure_count) {
210
- logger.log(`send_fcm_message. Successfully sent to all ${success_count} recipients. `, { title, body });
211
- }
212
- else if (success_count && failure_count) {
213
- logger.log(`send_fcm_message. Successfully sent to ${success_count} recipients, but failed to sent to ${failure_count} recipients`, {
214
- title,
215
- body,
216
- responses,
217
- });
218
- }
219
- else {
220
- logger.log(`send_fcm_message. Failed to sent to ${failure_count} recipients`, { title, body, responses: response.responses });
221
- }
222
- return {
223
- success: success_count > 0 && failure_count == 0,
224
- response: JSON.stringify(response.responses),
225
- };
226
- }
227
- catch (error) {
228
- logger.error("Exception", error.message);
229
- return {
230
- success: false,
231
- response: `Exception: ${error.message}`,
232
- };
233
- }
234
- };
@@ -1,91 +0,0 @@
1
- import { SimProvider } from "../types/enums";
2
- export const is_long_phone_number = (phone_number) => {
3
- return phone_number.startsWith("+");
4
- };
5
- export const is_israel_long_phone_number = (phone_number) => {
6
- return phone_number.startsWith("+9725") || phone_number.startsWith("+972 5");
7
- };
8
- export const is_thailand_long_phone_number = (phone_number) => {
9
- return phone_number.startsWith("+66");
10
- };
11
- export const is_international_phone_number = (phone_number) => {
12
- return is_long_phone_number(phone_number) && !is_israel_long_phone_number(phone_number);
13
- };
14
- export const is_iccid = (number) => {
15
- if (number.length < 19 || number.length > 22)
16
- return false;
17
- if (!/^\d+$/.test(number))
18
- return false;
19
- if (!number.startsWith("89"))
20
- return false;
21
- return true;
22
- };
23
- export const convert_to_short_israel_phone = (international_number) => {
24
- return international_number.replace("+972", "0");
25
- };
26
- export const is_sim_provider_partner = (phone_number) => {
27
- const { short_phone_number } = long_short_phone_numbers(phone_number);
28
- return short_phone_number.startsWith("054");
29
- };
30
- export const is_sim_provider_pelephone = (phone_number) => {
31
- const { short_phone_number } = long_short_phone_numbers(phone_number);
32
- return short_phone_number.startsWith("050");
33
- };
34
- export const is_sim_provider_celcom = (phone_number) => {
35
- const { short_phone_number } = long_short_phone_numbers(phone_number);
36
- return short_phone_number.startsWith("052");
37
- };
38
- export const is_sim_provider_monogoto = (phone_number) => {
39
- return is_iccid(phone_number);
40
- };
41
- export const get_sim_provider = (phone_number) => {
42
- if (is_sim_provider_partner(phone_number)) {
43
- return SimProvider.partner;
44
- }
45
- if (is_sim_provider_pelephone(phone_number)) {
46
- return SimProvider.pelephone;
47
- }
48
- if (is_sim_provider_celcom(phone_number)) {
49
- return SimProvider.celcom;
50
- }
51
- if (is_sim_provider_monogoto(phone_number)) {
52
- return SimProvider.monogoto;
53
- }
54
- return SimProvider.unknown;
55
- };
56
- export const long_short_phone_numbers = (phone_number) => {
57
- phone_number = phone_number.trim();
58
- if (!phone_number.length) {
59
- return {
60
- short_phone_number: phone_number,
61
- long_phone_number: phone_number,
62
- is_israeli: true,
63
- };
64
- }
65
- if (is_iccid(phone_number)) {
66
- return {
67
- short_phone_number: phone_number,
68
- long_phone_number: phone_number,
69
- is_israeli: false,
70
- };
71
- }
72
- let short_phone_number = phone_number;
73
- let long_phone_number = phone_number;
74
- if (phone_number.startsWith("05")) {
75
- short_phone_number = phone_number;
76
- long_phone_number = `+9725${short_phone_number.slice(2)}`;
77
- }
78
- else if (phone_number.startsWith("+972")) {
79
- long_phone_number = phone_number;
80
- short_phone_number = long_phone_number.replace("+9725", "05");
81
- }
82
- else if (phone_number.startsWith("+1")) {
83
- long_phone_number = phone_number;
84
- short_phone_number = long_phone_number.replace("+1", "");
85
- }
86
- return {
87
- short_phone_number,
88
- long_phone_number,
89
- is_israeli: long_phone_number.startsWith("+972"),
90
- };
91
- };
@@ -1,3 +0,0 @@
1
- export * from "./initialize";
2
- export * from "./keys";
3
- export * from "./snapshot";
@@ -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
- };