{"version":3,"sources":["../Security/AES.ts","../Security/RSA.ts","../Main.ts"],"sourcesContent":["import crypto from \"crypto\";\r\n\r\nconst defaultKeyLength: number = 32;\r\nconst algorithum = 'aes-256-ecb';\r\n/* const algorithum = 'aes-256-gcm'; */\r\nexport function aesGenerateKeys(): string {\r\n  try {\r\n    const newAesKey: string = crypto.randomBytes(defaultKeyLength).toString(\"base64\");\r\n    return newAesKey || \"\";\r\n  } catch (error: any) {\r\n    console.error(\"AES Keygen Exception :\", error);\r\n    throw new Error(error instanceof Error ? error.message : \"Unknown error occurred AES Keygen.\");\r\n  }\r\n}\r\n\r\nexport function aesEncrypt(secretKey: string = \"\", plainText: string = \"\"): String {\r\n  try {\r\n    let encmsg = \"\";\r\n    if (typeof plainText == \"object\") {\r\n      plainText = JSON.stringify(plainText);\r\n    }\r\n\r\n    let aesKey = Buffer.from(secretKey, \"base64\");\r\n\r\n    const cipher = crypto.createCipheriv(algorithum, aesKey, null); // Note the use of null for IV\r\n    encmsg = cipher.update(plainText, \"utf8\", \"base64\");\r\n    encmsg += cipher.final(\"base64\");\r\n\r\n    return encmsg;\r\n  } catch (error: any) {\r\n    console.error(\"AES Keygen Exception :\", error);\r\n    throw new Error(error instanceof Error ? error.message : \"Unknown error occurred AES Keygen.\");\r\n  }\r\n}\r\n\r\nexport function aesDecrypt(secretKey: string = \"\", encryptedText: string = \"\"): String {\r\n  try {\r\n    \r\n    if(!secretKey || secretKey === \"\"){\r\n      return \"Invalid / blank secret key received for decryption\";\r\n    }\r\n    \r\n    if(!encryptedText || encryptedText === \"\"){\r\n      return \"Invalid / blank encrypted data received for decryption\";\r\n    }\r\n\r\n\r\n    let decryptedData = null;\r\n\r\n    let aesKey = Buffer.from(secretKey, \"base64\");\r\n    // const decipher = crypto.createDecipheriv(\"aes-256-ecb\", aesKey, null); // Note the use of null for IV\r\n    const decipher = crypto.createDecipheriv(algorithum, aesKey, null); // Note the use of null for IV\r\n    decryptedData = decipher.update(encryptedText, \"base64\", \"utf8\");\r\n    decryptedData += decipher.final(\"utf8\");\r\n\r\n    let plainText = decryptedData || \"\";\r\n\r\n    if (plainText.trim() !== \"\" && plainText.includes(\"{\") && typeof plainText === \"string\") {\r\n      plainText = JSON.parse(plainText);\r\n    }\r\n\r\n    return plainText;\r\n  } catch (error: any) {\r\n    console.error(\"AES Keygen Exception :\", error);\r\n    throw new Error(error instanceof Error ? error.message : \"Unknown error occurred AES Keygen.\");\r\n  }\r\n}\r\n","import forge from \"node-forge\";\r\nimport fs from \"fs\";\r\nimport { rsaKey } from \"../DataFormats\";\r\n\r\nconst forgeKeyCreationOptions: any = {\r\n  bits: 2048,\r\n  // e: 0x10001,\r\n};\r\n\r\nexport function rsaGenerateKeys(): rsaKey {\r\n  try {\r\n    const keys = forge.pki.rsa.generateKeyPair(forgeKeyCreationOptions);\r\n    const privateKey = forge.pki.privateKeyToPem(keys.privateKey);\r\n    const publicKey = forge.pki.publicKeyToPem(keys.publicKey);\r\n\r\n    return { privateKey, publicKey };\r\n  } catch (error) {\r\n    console.error(\"RSA Keygen exception: \", error);\r\n    throw new Error(error instanceof Error ? error.message : \"Unknown error occurred> RSA Keygen.\");\r\n  }\r\n}\r\n\r\nexport function rsaEncrypt(keyFilePath: string = \"\", plainText: string = \"\"): String {\r\n  try {\r\n    let PUBKEY = fs.readFileSync(keyFilePath, \"utf8\");\r\n    let _input = plainText;\r\n    if (typeof plainText == \"object\") {\r\n      _input = JSON.stringify(plainText);\r\n    }\r\n    const forgePublicKey = forge.pki.publicKeyFromPem(PUBKEY);\r\n    const _encryptedData = forgePublicKey.encrypt(_input);\r\n    const encmsg = forge.util.encode64(_encryptedData);\r\n\r\n    return encmsg;\r\n  } catch (error) {\r\n    console.error(\"RSA Keygen exception: \", error);\r\n    throw new Error(error instanceof Error ? error.message : \"Unknown error occurred> RSA Keygen.\");\r\n  }\r\n}\r\n\r\nexport function rsaDecrypt(keyFilePath: string = \"\", encryptedText: string = \"\"): String {\r\n  try {\r\n\r\n    if(!keyFilePath || keyFilePath === \"\"){\r\n      return \"Invalid / blank Private key file path received for decryption\";\r\n    }\r\n    \r\n    if(!encryptedText || encryptedText === \"\"){\r\n      return \"Invalid / blank encrypted data received for decryption\";\r\n    }\r\n\r\n    let PRIVKEY = fs.readFileSync(keyFilePath, \"utf8\");\r\n    let plainText = \"\";\r\n\r\n    const forgePrivateKey = forge.pki.privateKeyFromPem(PRIVKEY);\r\n    const base64Decode_to_byte = forge.util.decode64(encryptedText);\r\n    plainText = forgePrivateKey.decrypt(base64Decode_to_byte);\r\n\r\n    if (plainText.trim() !== \"\" && plainText.includes(\"{\") && typeof plainText === \"string\") {\r\n      plainText = JSON.parse(plainText);\r\n    }\r\n\r\n    return plainText;\r\n  } catch (error) {\r\n    console.error(\"RSA Keygen exception: \", error);\r\n    throw new Error(error instanceof Error ? error.message : \"Unknown error occurred> RSA Keygen.\");\r\n  }\r\n}\r\n","import ip from \"ip\";\r\nimport os from \"os\";\r\nimport axios from \"axios\";\r\nimport moment from \"moment-timezone\";\r\nimport { clientInputData, DeviceDetails, responseData, rsaKey } from \"./DataFormats\";\r\nimport fs from \"fs\";\r\nimport { rsaDecrypt, rsaEncrypt, rsaGenerateKeys } from \"./Security/RSA\";\r\nimport { aesDecrypt, aesEncrypt, aesGenerateKeys } from \"./Security/AES\";\r\nimport cron from \"node-cron\";\r\nimport path from \"path\";\r\nimport { sha256 } from \"hash.js\";\r\n\r\nconst licenseBaseFolder: string = \"License\";\r\nconst licenseFile: string = \"License.pem\";\r\nconst baseFolderPath: string = \"bbLicenseUtils\";\r\nconst infoTracerFile: string = \"infoTrace.json\";\r\nconst initFile: string = \"init\";\r\nconst deviceFile: string = \"device.json\";\r\nconst publicFile: string = \"public.pem\";\r\nconst privateFile: string = \"private.pem\";\r\nconst serverFile: string = \"server.pem\";\r\nconst logFile: string = \"log\";\r\n\r\nconst OSLIST: Array<string> = [\"win32\", \"win64\", \"linux\", \"darwin\"];\r\n\r\nconst logging = async (org_Id: String = \"\", reason: String = \"\", result: String = \"\") => {\r\n  if (fs) {\r\n    if (fs.existsSync(`${baseFolderPath}/${logFile}`)) {\r\n      try {\r\n        // Read existing content of the file\r\n        const existingData = fs.readFileSync(`${baseFolderPath}/${logFile}`, \"utf8\");\r\n\r\n        const newData = `${new Date().toISOString()} > ${org_Id}: ${reason}: ${result}`;\r\n        // Append new data with a newline character\r\n        const updatedData = `${existingData.trim()}\\n${newData}`;\r\n\r\n        // Write the updated content back to the file\r\n        fs.writeFileSync(`${baseFolderPath}/${logFile}`, updatedData);\r\n      } catch (err) {\r\n        console.error(`Error updating file log file`);\r\n      }\r\n    } else {\r\n      try {\r\n        const newData = `${new Date().toISOString()} > ${org_Id}: ${reason}: ${result}`;\r\n        // Append new data with a newline character\r\n        const updatedData = `${newData}`;\r\n\r\n        // Write the updated content back to the file\r\n        fs.writeFileSync(`${baseFolderPath}/${logFile}`, updatedData);\r\n      } catch (err) {\r\n        console.error(`Error updating file log file`);\r\n      }\r\n    }\r\n  }\r\n  // return true;\r\n};\r\n\r\nconst getTrace = async (org_Id: String = \"\") => {\r\n  if (fs) {\r\n    if (fs.existsSync(`${baseFolderPath}/${org_Id}/${infoTracerFile}`)) {\r\n      let traceFileData = fs.readFileSync(`${baseFolderPath}/${org_Id}/${infoTracerFile}`, \"utf8\");\r\n\r\n      if (traceFileData) {\r\n        return JSON.parse(traceFileData);\r\n      }\r\n    }\r\n\r\n    return null;\r\n  }\r\n};\r\n\r\nconst updateTrace = async (org_Id: String = \"\", JsonData: any) => {\r\n  if (fs) {\r\n    let oldTrace = await getTrace(org_Id);\r\n\r\n    if (oldTrace && oldTrace !== null && JsonData) {\r\n      let newTraceData = { ...oldTrace, ...JsonData };\r\n\r\n      fs.writeFileSync(`${baseFolderPath}/${org_Id}/${infoTracerFile}`, JSON.stringify(newTraceData, null, 2));\r\n    } else if (!oldTrace && JsonData) {\r\n      fs.writeFileSync(`${baseFolderPath}/${org_Id}/${infoTracerFile}`, JSON.stringify(JsonData, null, 2));\r\n    }\r\n  }\r\n};\r\n\r\nconst hashString = async (input: string) => {\r\n  const data = new TextEncoder().encode(input);\r\n\r\n  const hash = sha256().update(data).digest(\"hex\");\r\n\r\n  return hash;\r\n};\r\n\r\nconst getDeviceDetails = async (): Promise<DeviceDetails> => {\r\n  let _deviceDetails: DeviceDetails = {\r\n    deviceId: \"\",\r\n    osType: \"\",\r\n    deviceType: \"\",\r\n    browser: \"\",\r\n  };\r\n\r\n  let filePath = `${baseFolderPath}/${deviceFile}`;\r\n  if (fs.existsSync(filePath)) {\r\n    let fileData = fs.readFileSync(`${baseFolderPath}/${deviceFile}`, \"utf8\");\r\n    const parseData = fileData ? JSON.parse(fileData) : null;\r\n    if (parseData) {\r\n      return parseData || null;\r\n    }\r\n  }\r\n\r\n  const platform = process?.platform || os.platform();\r\n  const _host = process?.env?.HOSTNAME || os.hostname();\r\n  /** Type of Device ID Start */\r\n\r\n  const systemInfo = `${_host || \"\"}${process?.arch || \"\"}${platform}${process?.version || \"\"}`;\r\n\r\n  const hashedData = await hashString(systemInfo);\r\n  _deviceDetails.deviceId = hashedData;\r\n\r\n  /** Type of Device ID End */\r\n\r\n  /** Type of OS Start */\r\n  if (platform?.toLowerCase() === \"linux\") {\r\n    _deviceDetails.osType = \"Linux\";\r\n  } else if (platform?.toLowerCase() === \"darwin\") {\r\n    _deviceDetails.osType = \"Mac\";\r\n  } else if (platform?.toLowerCase() === \"win32\") {\r\n    _deviceDetails.osType = \"Windows\";\r\n  } else {\r\n    _deviceDetails.osType = \"Unknown\";\r\n  }\r\n\r\n  /** Type of OS END */\r\n\r\n  /** Type of Device Start */\r\n  if (fs.existsSync(\"/proc/1/cgroup\")) {\r\n    fs.readFile(\"/proc/1/cgroup\", \"utf8\", (err, data) => {\r\n      if (err) {\r\n        console.error(\"Error reading /proc/1/cgroup to identify MACHINE :\", err);\r\n      } else {\r\n        if (data.includes(\"/docker/\")) {\r\n          _deviceDetails.deviceType = \"Docker\";\r\n        } else if (data.includes(\"/machine.slice/machine-qemu\") || data.includes(\"/machine.slice/machine-vmware\")) {\r\n          _deviceDetails.deviceType = \"Virtual Machine\";\r\n        } else {\r\n          _deviceDetails.deviceType = \"Server\";\r\n        }\r\n      }\r\n    });\r\n  } else {\r\n    _deviceDetails.deviceType = \"Server\";\r\n  }\r\n  /** Type of Device END */\r\n\r\n  try {\r\n    fs.writeFileSync(`${baseFolderPath}/${deviceFile}`, JSON.stringify(_deviceDetails, null, 2));\r\n  } catch (error) {\r\n    console.error(\"SDK EXCEPTION :> on device details save \", error);\r\n    // throw new Error(error instanceof Error ? error.message : \"License Device File Save Exception.\");\r\n  }\r\n\r\n  return _deviceDetails;\r\n};\r\nexport class License {\r\n  private static task: any;\r\n\r\n  private static licenseKey: string = \"\";\r\n  private static baseUrl: string = \"\";\r\n  private static secretId: string = \"\";\r\n  // private static platform: string = \"\";\r\n  // private static deviceId: string = \"\";\r\n  private static device: object = {};\r\n  private static org_Id: string = \"default\";\r\n  // private static _ip: string = ip.address() || \"\";\r\n  private static dateTime: Date = new Date();\r\n  private static timeZone: string = moment.tz.guess();\r\n\r\n  private static doExchange = async (org_Id: string = this.org_Id, clientData: any): Promise<responseData> => {\r\n    try {\r\n      // const clientData = await this.readFileAndParse(org_Id);\r\n\r\n      if (!org_Id) {\r\n        console.error(`Org id should't be blank '${org_Id}'.`);\r\n        throw new Error(`Org id should't be blank '${org_Id}'.`);\r\n      }\r\n\r\n      if (clientData) {\r\n        let publicFilePath = `${baseFolderPath}/${org_Id.toString().trim()}/${publicFile}`;\r\n        let tempPublicFilePath = `${baseFolderPath}/${org_Id.toString().trim()}/temp_${publicFile}`;\r\n\r\n        let _public_Key = fs.existsSync(tempPublicFilePath)\r\n          ? await fs.readFileSync(tempPublicFilePath, \"utf8\")\r\n          : await fs.readFileSync(publicFilePath, \"utf8\");\r\n\r\n        if (!clientData?.licenseKey) {\r\n          console.error(`No client license key found, please call init() again with required data.`);\r\n          throw new Error(`No client license key found, please call init() again with required data.`);\r\n        } else if (!_public_Key) {\r\n          console.error(`No client public key found, please call init() again with required data.`);\r\n          throw new Error(`No client public key found, please call init() again with required data.`);\r\n        }\r\n\r\n        const _doExchangeApi = `${clientData.baseUrl}/sdk/api/doExchange`;\r\n\r\n        const _clientData = { ...clientData };\r\n        if (_clientData.secretId) delete _clientData.secretId;\r\n        if (_clientData.baseUrl) delete _clientData.baseUrl;\r\n\r\n        const apiBody = {\r\n          key: _public_Key.toString(),\r\n          licenseKey: _clientData?.licenseKey,\r\n          email: _clientData?.email,\r\n          orgId: _clientData?.orgId,\r\n          assignType: _clientData?.assignType,\r\n        };\r\n\r\n        return await axios\r\n          .post(`${_doExchangeApi}`, apiBody, {\r\n            headers: {\r\n              \"Content-Type\": \"application/json\",\r\n            },\r\n          })\r\n          .then(async (res) => {\r\n            if (res.data?.resultCode == 1) {\r\n              fs.writeFileSync(`${baseFolderPath}/${org_Id.toString().trim()}/${serverFile}`, res.data?.data || \"\");\r\n\r\n              return await this.getLicense(org_Id.toString().trim(), clientData).then((getLic) => {\r\n                if (Number(getLic?.code) < 0) {\r\n                  // file deepcode ignore PromiseNotCaughtGeneral: not blocking next execution if we add catch everywhere.\r\n                  return getLic;\r\n                } else {\r\n                  return {\r\n                    code: 1,\r\n                    data: null,\r\n                    result: \"Successfully exchanged and received license.\",\r\n                  };\r\n                }\r\n              });\r\n            } else {\r\n              console.error(`Exchange fail with license server for org '${org_Id}'.`);\r\n              throw new Error(`Exchange fail with license server for org '${org_Id}'.`);\r\n            }\r\n          })\r\n          .catch((err: any) => {\r\n            if (err?.code == \"ECONNREFUSED\" || err?.message?.includes(\"ECONNREFUSED\")) {\r\n              console.error(\"Unable to connect License server :\", err?.message);\r\n              throw new Error(\r\n                err instanceof Error\r\n                  ? `Unable to connect License server : ${err?.message}`\r\n                  : \"Something went wrong at licensing server end.\"\r\n              );\r\n            }\r\n            console.debug(\r\n              \"License Server Response : \",\r\n              `Status: ${err?.response?.status} : ${err?.message} : `,\r\n              err?.response?.data\r\n            );\r\n\r\n            let _errorMsg = err?.response?.data?.message || \"Fail to get license from server.\";\r\n\r\n            console.error({ _errorMsg });\r\n            throw new Error(_errorMsg);\r\n          });\r\n      } else {\r\n        console.error(`Invalid client details for org id '${org_Id}'.`, { clientData });\r\n        throw new Error(`Invalid client details for org id '${org_Id}'.`);\r\n      }\r\n    } catch (error) {\r\n      console.error(\"Exchange exception : \", error);\r\n      throw new Error(error instanceof Error ? error.message : \"Unknown error occurred> Exchange Files.\");\r\n    }\r\n  };\r\n\r\n  private static getLicense = async (org_Id: String = \"\", clientData: any): Promise<responseData> => {\r\n    try {\r\n      const _clientEncryptedData = await aesEncrypt(clientData?.secretId, clientData);\r\n      const _clientKeyData = await rsaEncrypt(`${baseFolderPath}/${org_Id}/${serverFile}`, clientData?.secretId);\r\n\r\n      const licenseServerAPI = `${clientData?.baseUrl}/sdk/api/generateLicense`;\r\n\r\n      const apiBody = {\r\n        key: _clientKeyData,\r\n        licenseKey: clientData?.licenseKey,\r\n        client: _clientEncryptedData,\r\n      };\r\n\r\n      let licenseUrl = \"\";\r\n      return await axios\r\n        .post(`${licenseServerAPI}`, apiBody, {\r\n          headers: {\r\n            \"Content-Type\": \"application/json\",\r\n          },\r\n        })\r\n        .then((res) => {\r\n          if (res.data?.resultCode == 1) {\r\n            try {\r\n              fs.writeFileSync(\r\n                `${licenseBaseFolder}/${org_Id}/${licenseFile}`,\r\n                JSON.stringify(JSON.parse(res.data?.data), null, 2)\r\n              );\r\n            } catch (error) {\r\n              console.error(\"SDK EXCEPTION :> \", error);\r\n              throw new Error(error instanceof Error ? error.message : \"License File Save Exception.\");\r\n            }\r\n            licenseUrl = res.data?.downloadUrl;\r\n\r\n            updateTrace(org_Id, { isExpired: false, isActive: true, dateTime: new Date() });\r\n\r\n            return {\r\n              code: 1,\r\n              data: { licenseUrl },\r\n              result: \"License received and saved.\",\r\n            };\r\n          } else {\r\n            console.error(`Get License fail with license server. '${org_Id}'.`);\r\n            throw new Error(`Get License fail with license server. '${org_Id}'.`);\r\n          }\r\n        })\r\n        .catch((err: any) => {\r\n          if (err?.code == \"ECONNREFUSED\" || err?.message?.includes(\"ECONNREFUSED\")) {\r\n            console.error(\"Unable to connect License server :\", err?.message);\r\n            throw new Error(\r\n              err instanceof Error\r\n                ? `Unable to connect License server : ${err?.message}`\r\n                : \"Something went wrong at licensing server end.\"\r\n            );\r\n          }\r\n\r\n          console.debug(\r\n            \"License Server Response : \",\r\n            `Status: ${err?.response?.status} : ${err?.message} : `,\r\n            err?.response?.data\r\n          );\r\n\r\n          let _errorMsg = err?.response?.data?.message || \"Fail to get license from server.\";\r\n\r\n          console.error({ _errorMsg });\r\n          throw new Error(_errorMsg);\r\n        });\r\n    } catch (error) {\r\n      console.error(\"Get License Exception :\", error);\r\n      throw new Error(error instanceof Error ? error.message : \"Unknown error occurred> Get License.\");\r\n    }\r\n  };\r\n\r\n  private static checkValidKey = async (license_Key: String = \"\", baseUrl: String = \"\"): Promise<responseData> => {\r\n    try {\r\n      const licenseServerAPI = `${baseUrl}/sdk/api/keyCheck/${license_Key}`;\r\n\r\n      return await axios\r\n        .get(`${licenseServerAPI}`, {\r\n          headers: {\r\n            \"Content-Type\": \"application/json\",\r\n          },\r\n        })\r\n        .then((res) => {\r\n          if (res.data?.resultCode == 1) {\r\n            return {\r\n              code: 1,\r\n              data: null,\r\n              result: res.data?.message || \"Key is valid\",\r\n            };\r\n          } else {\r\n            console.error(`Key is invalid.`);\r\n            throw new Error(`Key is invalid.`);\r\n          }\r\n        })\r\n        .catch((err: any) => {\r\n          if (err?.code == \"ECONNREFUSED\" || err?.message?.includes(\"ECONNREFUSED\")) {\r\n            console.error(\"Unable to connect License server :\", err?.message);\r\n            throw new Error(\r\n              err instanceof Error\r\n                ? `Unable to connect License server : ${err?.message}`\r\n                : \"Something went wrong at licensing server end.\"\r\n            );\r\n          }\r\n          console.debug(\r\n            \"License Server Response : \",\r\n            `Status: ${err?.response?.status} : ${err?.message} :`,\r\n            err?.response?.data || err?.response || err\r\n          );\r\n\r\n          let _errorMsg =\r\n            err?.response?.status == 400\r\n              ? `Invalid license key '${license_Key}', please check the license key`\r\n              : `Fail to check license key '${license_Key}'`;\r\n\r\n          console.error({ _errorMsg });\r\n          throw new Error(_errorMsg);\r\n        });\r\n    } catch (error) {\r\n      console.error(\"Key Check Exception :\", error);\r\n      throw new Error(error instanceof Error ? error.message : \"Unknown error occurred> Key Check.\");\r\n    }\r\n  };\r\n\r\n  private static checkPreinit = async (org_Id: String = \"\"): Promise<any> => {\r\n    let isInitFile: Boolean = fs.existsSync(`${baseFolderPath}/${org_Id}/${initFile}`) || false;\r\n    let isPublicFile: Boolean = fs.existsSync(`${baseFolderPath}/${org_Id}/${publicFile}`) || false;\r\n    let isPrivateFile: Boolean = fs.existsSync(`${baseFolderPath}/${org_Id}/${privateFile}`) || false;\r\n    return { isInitFile, isPublicFile, isPrivateFile };\r\n  };\r\n\r\n  private static checkExchangeFiles = async (org_Id: String = \"\"): Promise<any> => {\r\n    let isServerFile: Boolean = fs.existsSync(`${baseFolderPath}/${org_Id}/${serverFile}`) || false;\r\n    let isLicenseFile: Boolean = fs.existsSync(`${licenseBaseFolder}/${org_Id}/${licenseFile}`) || false;\r\n    return { isServerFile, isLicenseFile };\r\n  };\r\n\r\n  private static removeKeyFiles = async (org_Id: String = \"\", reason: String = \"init()\") => {\r\n    let orgPublicFile = `${baseFolderPath}/${org_Id}/${publicFile}`;\r\n    let orgPrivateFile = `${baseFolderPath}/${org_Id}/${privateFile}`;\r\n    let orgServerFile = `${baseFolderPath}/${org_Id}/${serverFile}`;\r\n\r\n    const filesToDelete = [orgPublicFile, orgPrivateFile, orgServerFile];\r\n\r\n    try {\r\n      filesToDelete.forEach((filePath) => {\r\n        if (fs.existsSync(filePath)) {\r\n          fs.unlinkSync(filePath);\r\n        }\r\n      });\r\n    } catch (error) {\r\n      console.error(\"Remove Files Exception :\", error);\r\n      throw new Error(error instanceof Error ? error.message : \"Unknown error occurred> Remove Files.\");\r\n    }\r\n\r\n    return true;\r\n  };\r\n\r\n  private static readFileAndParse = async (org_Id: String = \"\"): Promise<any> => {\r\n    let fileData = fs.readFileSync(`${baseFolderPath}/${org_Id}/${initFile}`, \"utf8\");\r\n    const parseData = JSON.parse(fileData);\r\n    return parseData || null;\r\n  };\r\n\r\n  private static extractLicense = async (org_Id: String = \"\"): Promise<responseData> => {\r\n    try {\r\n      const filePath = `${licenseBaseFolder}/${org_Id}/${licenseFile}`;\r\n\r\n      let oldTrace = await getTrace(org_Id);\r\n\r\n      if (oldTrace && oldTrace.isActive == false) {\r\n        return { code: -2, result: \"License is not active, please contact admin.\", data: null };\r\n      } else if (oldTrace && oldTrace.isExpired == true) {\r\n        return { code: -2, result: \"License is Expired, please contact admin.\", data: null };\r\n      }\r\n      if (fs.existsSync(filePath)) {\r\n        /** Read License File */\r\n        let _encryptedLicense: any = await fs.readFileSync(filePath, \"utf8\");\r\n\r\n        /** Format JSON and decode sign */\r\n        _encryptedLicense = JSON.parse(_encryptedLicense);\r\n\r\n        const decodedSign: any = rsaDecrypt(`${baseFolderPath}/${org_Id}/${privateFile}`, _encryptedLicense?.sign);\r\n\r\n        if (decodedSign?.toString()?.includes(\"Invalid\")) {\r\n          console.error(decodedSign || `Invalid encrypted data received for decrypt signature for org ${org_Id}`);\r\n          throw new Error(decodedSign || \"Invalid encrypted data received for decrypt signature.\");\r\n        }\r\n        /** after success of sign decode use decoded sign and do 'enc' decryption using AES */\r\n        let decodedLicense: any = aesDecrypt(decodedSign, _encryptedLicense?.enc);\r\n\r\n        if (decodedLicense?.toString()?.includes(\"Invalid\")) {\r\n          console.error(decodedSign || `Invalid encrypted data received for decrypt license for org ${org_Id}`);\r\n          throw new Error(decodedSign || \"Invalid encrypted data received for decrypt license.\");\r\n        }\r\n\r\n        const fullLicense: any = typeof decodedLicense == \"string\" ? JSON.parse(decodedLicense) : decodedLicense;\r\n\r\n        return { code: 1, result: \"License extracted.\", data: fullLicense };\r\n      } else {\r\n        console.log(`No License found at '${filePath}' for org id ${org_Id}`);\r\n        console.error(`No license found for organization ${org_Id || \"blank org id\"}, please initialize again.`);\r\n        throw new Error(`No license found for organization ${org_Id || \"blank org id\"}, please initialize again.`);\r\n      }\r\n    } catch (error) {\r\n      console.error(\"Extract License Exception>>\", error);\r\n      throw new Error(error instanceof Error ? error.message : \"Extract License Exception\");\r\n    }\r\n  };\r\n\r\n  /** External access functions */\r\n\r\n  static async init(\r\n    base_Url: string = \"\",\r\n    license_Key: string = \"\",\r\n    clientData: clientInputData\r\n  ): Promise<responseData> {\r\n    try {\r\n      try {\r\n        [baseFolderPath, licenseBaseFolder].forEach((folderPath) => {\r\n          if (!fs.existsSync(folderPath)) {\r\n            fs.mkdirSync(folderPath, { recursive: true });\r\n          }\r\n        });\r\n      } catch (error) {\r\n        console.error(\"SDK EXCEPTION older Creation Exception:> \", error);\r\n        throw new Error(error instanceof Error ? error.message : \"Unknown error occurred> init folder create.\");\r\n      }\r\n      if (!base_Url) {\r\n        console.error(`Please provide valid base url of license server.`);\r\n        throw new Error(`Please provide valid base url of license server.`);\r\n      }\r\n\r\n      if (!license_Key) {\r\n        console.error(`Please provide valid license key.`);\r\n        throw new Error(`Please provide valid license key.`);\r\n      }\r\n\r\n      const keyCheckRes = await this.checkValidKey(license_Key, base_Url);\r\n\r\n      if (Number(keyCheckRes?.code) < 0) {\r\n        return keyCheckRes;\r\n      }\r\n\r\n      if (!clientData.assignType) {\r\n        clientData.assignType = \"default\";\r\n      }\r\n\r\n      if (!clientData.email || !clientData.orgId || !clientData.userName) {\r\n        console.error(\r\n          `Please provide required client data {email,orgId,userName}. Data received ${JSON.stringify(clientData)}`\r\n        );\r\n        throw new Error(`Please provide required client data {email,orgId,userName}.`);\r\n      }\r\n\r\n      let org_Id = clientData?.orgId?.toString()?.trim() || \"\";\r\n\r\n      if (!org_Id) {\r\n        console.error(`Org id should't be blank '${org_Id}'.`);\r\n        throw new Error(`Org id should't be blank '${org_Id}'.`);\r\n      }\r\n\r\n      // /** make ORG ID path */\r\n      try {\r\n        [`${baseFolderPath}/${org_Id}`, `${licenseBaseFolder}/${org_Id}`].forEach((folderPath) => {\r\n          if (!fs.existsSync(folderPath)) {\r\n            fs.mkdirSync(folderPath, { recursive: true });\r\n          }\r\n        });\r\n      } catch (error) {\r\n        console.error(\"Path creation error for org id. \", error);\r\n        throw new Error(\r\n          error instanceof Error ? error.message : \"Unknown error occurred > Path creation error for org id.\"\r\n        );\r\n      }\r\n\r\n      let preChecks: any = await this.checkPreinit(org_Id);\r\n      let clientConfig: any = null;\r\n      if (!preChecks.isInitFile) {\r\n        // If init file not present then need to create with clientData\r\n\r\n        // await machineId().then((id) => {\r\n        //   this.deviceId = id;\r\n        // });\r\n        // this.platform = process?.platform || \"\";\r\n        this.licenseKey = license_Key;\r\n        this.baseUrl = base_Url;\r\n\r\n        this.device = await getDeviceDetails();\r\n        this.secretId = await aesGenerateKeys();\r\n\r\n        clientConfig = {\r\n          baseUrl: this.baseUrl,\r\n          licenseKey: this.licenseKey,\r\n          device: this.device,\r\n          secretId: this.secretId || \"\",\r\n          dateTime: this.dateTime,\r\n          timeZone: this.timeZone,\r\n          ...clientData,\r\n          orgId: org_Id,\r\n        };\r\n\r\n        // fs.writeFileSync(`${baseFolderPath}/${org_Id}/${initFile}`, JSON.stringify(_configData));\r\n      } else {\r\n        const existingClientObj = await this.readFileAndParse(org_Id);\r\n\r\n        if (existingClientObj.licenseKey !== license_Key) {\r\n          existingClientObj.licenseKey = license_Key;\r\n          existingClientObj.dateTime = new Date();\r\n\r\n          if (existingClientObj) {\r\n            clientConfig = { ...existingClientObj };\r\n          } else {\r\n            console.warn(`Empty existing client details found:${org_Id}`, { existingClientObj });\r\n          }\r\n\r\n          // fs.writeFileSync(`${baseFolderPath}/${org_Id}/${initFile}`, JSON.stringify(existingClientObj));\r\n\r\n          try {\r\n            // await this.removeKeyFiles(org_Id, \"init()\");\r\n            // preChecks = await this.checkPreinit(org_Id);\r\n            preChecks = { isPublicFile: false, isPrivateFile: false };\r\n          } catch (error) {\r\n            console.error(\"EXCEPTION removeKeyFiles/configFiles :> \", error);\r\n            throw new Error(\r\n              error instanceof Error ? error.message : \"Unknown error occurred > While updating user config files.\"\r\n            );\r\n          }\r\n        } else {\r\n          clientConfig = { ...existingClientObj };\r\n        }\r\n      }\r\n\r\n      let isExchangeNow: Boolean = false;\r\n\r\n      let keyGen: rsaKey;\r\n      if (!preChecks.isPublicFile || !preChecks.isPrivateFile) {\r\n        keyGen = await rsaGenerateKeys();\r\n\r\n        // fs.writeFileSync(`${baseFolderPath}/${org_Id}/${publicFile}`, keyGen.publicKey);\r\n        // fs.writeFileSync(`${baseFolderPath}/${org_Id}/${privateFile}`, keyGen.privateKey);\r\n\r\n        /** store temprary till exchange success */\r\n        fs.writeFileSync(`${baseFolderPath}/${org_Id}/temp_${publicFile}`, keyGen.publicKey);\r\n        fs.writeFileSync(`${baseFolderPath}/${org_Id}/temp_${privateFile}`, keyGen.privateKey);\r\n\r\n        isExchangeNow = true;\r\n      }\r\n\r\n      if (!isExchangeNow) {\r\n        let exchangeFiles = await this.checkExchangeFiles(org_Id);\r\n        // console.debug(\"Exchange Files : \", { exchangeFiles });\r\n        isExchangeNow = !exchangeFiles?.isServerFile || !exchangeFiles?.isLicenseFile ? true : false;\r\n      }\r\n\r\n      if (isExchangeNow) {\r\n        return await this.doExchange(org_Id, clientConfig).then((exchRes) => {\r\n          if (Number(exchRes?.code) < 0) {\r\n            return exchRes;\r\n          } else {\r\n            try {\r\n              /** remove existing files and check temp file is available then rename it */\r\n              if (fs.existsSync(`${baseFolderPath}/${org_Id}/temp_${publicFile}`)) {\r\n                fs.renameSync(\r\n                  `${baseFolderPath}/${org_Id}/temp_${publicFile}`,\r\n                  `${baseFolderPath}/${org_Id}/${publicFile}`\r\n                );\r\n              }\r\n              if (fs.existsSync(`${baseFolderPath}/${org_Id}/temp_${privateFile}`)) {\r\n                fs.renameSync(\r\n                  `${baseFolderPath}/${org_Id}/temp_${privateFile}`,\r\n                  `${baseFolderPath}/${org_Id}/${privateFile}`\r\n                );\r\n              }\r\n              fs.writeFileSync(`${baseFolderPath}/${org_Id}/${initFile}`, JSON.stringify(clientConfig));\r\n            } catch (error) {\r\n              console.error(\"EXCEPTION writing client config File :> \", error);\r\n              throw new Error(\r\n                error instanceof Error ? error.message : \"Unknown error occurred > While writing client config File.\"\r\n              );\r\n            }\r\n            return {\r\n              code: 1,\r\n              data: null,\r\n              result: \"Successfully license exchange/received.\",\r\n            };\r\n          }\r\n        });\r\n      } else {\r\n        /** If already init file present then sync only */\r\n        return await License.sync(license_Key, org_Id).then((syncRes) => {\r\n          if (Number(syncRes?.code) < 0) {\r\n            return syncRes;\r\n          } else {\r\n            return {\r\n              code: 1,\r\n              data: null,\r\n              result: \"Successfully license sync.\",\r\n            };\r\n          }\r\n        });\r\n      }\r\n    } catch (error) {\r\n      console.error(\"Initialization fail: \", error);\r\n      throw new Error(error instanceof Error ? error.message : \"Unknown error occurred > Initialization failed.\");\r\n    }\r\n  }\r\n\r\n  static async getConfig(org_Id: String = \"\"): Promise<responseData> {\r\n    if (!org_Id) {\r\n      console.error(`Org id should't be blank '${org_Id}'.`);\r\n      throw new Error(`Org id should't be blank '${org_Id}'.`);\r\n    }\r\n\r\n    const clientData = await this.readFileAndParse(org_Id.toString().trim());\r\n\r\n    if (!clientData) {\r\n      console.error(`No client config found. please call init() with org id ${org_Id}.`);\r\n      throw new Error(`No client config found. please call init() with org id ${org_Id}.`);\r\n    }\r\n\r\n    return {\r\n      code: 1,\r\n      data: clientData,\r\n      result: \"Success\",\r\n    };\r\n  }\r\n\r\n  static async update(\r\n    license_Key: string = \"\",\r\n    org_Id: string = \"\",\r\n    assignType: string = \"update\"\r\n  ): Promise<responseData> {\r\n    if (!license_Key || !org_Id) {\r\n      console.error(`license_Key & org_Id should't be blank '${org_Id}'.`);\r\n      throw new Error(`license_Key & org_Id should't be blank '${org_Id}'.`);\r\n    }\r\n\r\n    let orgInitFile = `${baseFolderPath}/${org_Id.toString().trim()}/${initFile}`;\r\n\r\n    if (fs.existsSync(orgInitFile)) {\r\n      let fileData = fs.readFileSync(orgInitFile, \"utf8\");\r\n      const parseData = JSON.parse(fileData);\r\n\r\n      // parseData.assignType == license_Key.toString().trim() ? \"default\" : assignType;\r\n      parseData.assignType = assignType;\r\n      parseData.device = await getDeviceDetails();\r\n      parseData.licenseKey = license_Key;\r\n      parseData.orgId = org_Id.toString().trim();\r\n      parseData.dateTime = new Date();\r\n\r\n      const res_init = await License.init(parseData?.baseUrl, license_Key, parseData);\r\n      return res_init;\r\n    } else {\r\n      console.error(`No exiting init file found please do initialize client using init() org id ${org_Id}.`);\r\n      throw new Error(`No exiting init file found please do initialize client using init()`);\r\n    }\r\n  }\r\n\r\n  static async sync(license_Key: string = \"\", org_Id: string = \"\"): Promise<responseData> {\r\n    if (!license_Key || !org_Id) {\r\n      console.error(`license_Key & org_Id should't be blank '${org_Id}'.`);\r\n      throw new Error(`license_Key & org_Id should't be blank '${org_Id}'.`);\r\n    }\r\n\r\n    let orgInitFile = `${baseFolderPath}/${org_Id.toString().trim()}/${initFile}`;\r\n\r\n    if (fs.existsSync(orgInitFile)) {\r\n      let fileData = fs.readFileSync(orgInitFile, \"utf8\");\r\n      const parseData = JSON.parse(fileData);\r\n\r\n      if (parseData.licenseKey !== license_Key) {\r\n        console.error(`License key '${license_Key}' doesn't match with existing license to sync.`);\r\n        throw new Error(`License key '${license_Key}' doesn't match with existing license to sync.`);\r\n      } else {\r\n        return await this.getLicense(org_Id.toString().trim(), parseData).then((exchRes) => {\r\n          if (Number(exchRes?.code) < 0) {\r\n            return exchRes;\r\n          } else {\r\n            return {\r\n              code: 1,\r\n              data: null,\r\n              result: \"License synced successfully.\",\r\n            };\r\n          }\r\n        });\r\n      }\r\n    } else {\r\n      console.error(`No exiting init file found for org id ${org_Id}, please do initialize client again.`);\r\n      throw new Error(`No exiting init file found for org id ${org_Id}, please do initialize client again.`);\r\n    }\r\n  }\r\n\r\n  private static calculateDays(startDate: string = \"\"): number {\r\n    if (startDate !== \"\") {\r\n      const date = new Date(startDate);\r\n\r\n      // Get today's date\r\n      const today = new Date();\r\n\r\n      date.setUTCHours(0, 0, 0, 0);\r\n      today.setUTCHours(0, 0, 0, 0);\r\n      // Calculate the difference in milliseconds between the two dates\r\n      const differenceInMilliseconds = today.getTime() - date.getTime();\r\n\r\n      // Convert milliseconds to days\r\n      const differenceInDays = Math.floor(differenceInMilliseconds / (1000 * 60 * 60 * 24)) + 1;\r\n\r\n      return differenceInDays;\r\n    }\r\n    return -1;\r\n  }\r\n\r\n  static async getFeatures(org_Id: string = \"\", featureName: string | string[] | any = \"all\"): Promise<responseData> {\r\n    try {\r\n      if (!org_Id) {\r\n        console.error(`Org id should't be blank '${org_Id}'.`);\r\n        throw new Error(`Org id should't be blank '${org_Id}'.`);\r\n      }\r\n      if (!featureName) {\r\n        console.debug(`Feature name should't be blank '${featureName}', Now auto set to \"all\".`);\r\n        // throw new Error(`Feature name should't be blank '${featureName}'.`);\r\n        featureName = \"all\";\r\n      }\r\n\r\n      let licenseData = await this.extractLicense(org_Id.toString().trim());\r\n\r\n      if (Number(licenseData?.code) < 0) return licenseData;\r\n\r\n      let fullLicense = { ...licenseData?.data };\r\n\r\n      let _lic_package = fullLicense?.include?.package;\r\n      let _features = _lic_package?.featuresList || _lic_package?.features || [];\r\n      let _lic_meta = {\r\n        issueDate: fullLicense?.meta?.issued || \"\",\r\n        expiryDate: fullLicense?.meta?.expiry || \"\",\r\n        package_id: _lic_package?._id || \"\",\r\n        isExpired: false,\r\n      };\r\n\r\n      if (fullLicense?.include?.package && _features && _features?.length > 0) {\r\n        /** Expiry logic checking */\r\n\r\n        let expiryDateDays: number = License.calculateDays(_lic_meta?.expiryDate);\r\n        if (expiryDateDays >= 2) {\r\n          _lic_meta.isExpired = true;\r\n        }\r\n\r\n        /** If not Expired extract the features */\r\n\r\n        if (typeof featureName === \"string\" && featureName?.toLowerCase() === \"all\") {\r\n          let _fList: any = [];\r\n          _features.forEach((item: any) => {\r\n            _fList.push({\r\n              ...item,\r\n              data:\r\n                item?.type == \"number\" && item?.data !== \"\"\r\n                  ? Number(item?.data)\r\n                  : item?.type == \"boolean\" && item?.data !== \"\"\r\n                  ? item.data === \"false\"\r\n                    ? false\r\n                    : Boolean(item.data)\r\n                  : item?.type == \"date\" && item?.data !== \"\"\r\n                  ? new Date(item?.data)\r\n                  : item.data,\r\n            });\r\n          });\r\n\r\n          return {\r\n            code: 1,\r\n            data: _fList,\r\n            result: \"List of all features\",\r\n            meta: _lic_meta || null,\r\n          };\r\n        } else if (typeof featureName === \"object\" && Array.isArray(featureName)) {\r\n          const filteredList =\r\n            _features.length > 0 ? _features?.filter((obj: any) => featureName?.includes(obj.name)) : [];\r\n          let _fList: any = [];\r\n          if (filteredList && filteredList?.length > 0) {\r\n            filteredList?.forEach((item: any) => {\r\n              _fList.push({\r\n                ...item,\r\n                data:\r\n                  item?.type == \"number\" && item?.data !== \"\"\r\n                    ? Number(item?.data)\r\n                    : item?.type == \"boolean\" && item?.data !== \"\"\r\n                    ? item.data === \"false\"\r\n                      ? false\r\n                      : Boolean(item.data)\r\n                    : item?.type == \"date\" && item?.data !== \"\"\r\n                    ? new Date(item?.data)\r\n                    : item.data,\r\n              });\r\n            });\r\n\r\n            return {\r\n              code: 1,\r\n              data: _fList,\r\n              result: \"List of features\",\r\n              meta: _lic_meta || null,\r\n            };\r\n          }\r\n        } else {\r\n          const item =\r\n            _features.length > 0\r\n              ? _features?.find((data: any) => data?.name?.toLowerCase() === featureName?.toLowerCase())\r\n              : null;\r\n\r\n          if (item) {\r\n            return {\r\n              code: 1,\r\n              data: {\r\n                ...item,\r\n                data:\r\n                  item?.type == \"number\" && item?.data !== \"\"\r\n                    ? Number(item?.data)\r\n                    : item?.type == \"boolean\" && item?.data !== \"\"\r\n                    ? item.data === \"false\"\r\n                      ? false\r\n                      : Boolean(item.data)\r\n                    : item?.type == \"date\" && item?.data !== \"\"\r\n                    ? new Date(item?.data)\r\n                    : item.data,\r\n              },\r\n              meta: _lic_meta || null,\r\n              result: item ? \"Success\" : \"No Feature Found.\",\r\n            };\r\n          }\r\n        }\r\n\r\n        let _errorMsg = `No Feature found with this name '${\r\n          typeof featureName === \"string\" ? featureName : featureName?.join(\",\")\r\n        }'`;\r\n\r\n        console.error({ _errorMsg });\r\n        throw new Error(_errorMsg);\r\n      } else {\r\n        console.error(\"No feature available in current license.\");\r\n        throw new Error(\"No feature available in current license.\");\r\n      }\r\n    } catch (error) {\r\n      console.error(\"Get License Features fail: \", error);\r\n      throw new Error(error instanceof Error ? error.message : \"Unknown error occurred > GetFeatures().\");\r\n    }\r\n  }\r\n\r\n  static async getLicenseDetails(org_Id: string = \"\"): Promise<responseData> {\r\n    try {\r\n      if (!org_Id) {\r\n        console.error(`Org id should't be blank '${org_Id}'.`);\r\n        throw new Error(`Org id should't be blank '${org_Id}'.`);\r\n      }\r\n\r\n      let licenseData = await this.extractLicense(org_Id.toString().trim());\r\n\r\n      if (Number(licenseData?.code) < 0) return licenseData;\r\n\r\n      let fullLicense = { ...licenseData?.data };\r\n      let _lic_package = fullLicense?.include?.package;\r\n      let _lic_meta = {\r\n        issueDate: fullLicense?.meta?.issued || \"\",\r\n        expiryDate: fullLicense?.meta?.expiry || \"\",\r\n        package_id: _lic_package?._id || \"\",\r\n        isExpired: false,\r\n      };\r\n\r\n      let expiryDateDays: number = License.calculateDays(_lic_meta?.expiryDate);\r\n      if (expiryDateDays >= 2) {\r\n        _lic_meta.isExpired = true;\r\n      }\r\n\r\n      let featuresList = _lic_package?.featuresList || _lic_package?.features || [];\r\n\r\n      fullLicense.meta = _lic_meta;\r\n\r\n      /*if (fullLicense?.include?.package && featuresList) {*/\r\n\r\n      let _fList: any = [];\r\n      if (featuresList?.length > 0) {\r\n        featuresList.forEach((item: any) => {\r\n          _fList.push({\r\n            ...item,\r\n            data:\r\n              item?.type == \"number\" && item?.data !== \"\"\r\n                ? Number(item?.data)\r\n                : item?.type == \"boolean\" && item?.data !== \"\"\r\n                ? item.data === \"false\"\r\n                  ? false\r\n                  : Boolean(item.data)\r\n                : item?.type == \"date\" && item?.data !== \"\"\r\n                ? new Date(item?.data)\r\n                : item.data,\r\n          });\r\n        });\r\n      }\r\n      /*else {\r\n        console.error(`No License found for org Id '${org_Id}' to get details.`);\r\n        throw new Error(`No License found for org Id '${org_Id}' to get details.`);\r\n        \r\n      }*/\r\n      fullLicense.include.package.features = _fList;\r\n\r\n      return {\r\n        code: 1,\r\n        data: fullLicense,\r\n        result: \"License Details\",\r\n        meta: _lic_meta || null,\r\n      };\r\n      /*} else {\r\n      console.error(`No Feature Available.`);\r\n      throw new Error(`No Feature Available.`);      \r\n    }*/\r\n    } catch (error) {\r\n      console.error(\"Get License Details fail: \", error);\r\n      throw new Error(error instanceof Error ? error.message : \"Unknown error occurred > GetLicenseDetail().\");\r\n    }\r\n  }\r\n\r\n  static delete = async (org_Id: String = \"\"): Promise<responseData> => {\r\n    if (!org_Id) {\r\n      console.error(`Org id should't be blank '${org_Id}'.`);\r\n      throw new Error(`Org id should't be blank '${org_Id}'.`);\r\n    }\r\n    try {\r\n      let orgInitFile = `${baseFolderPath}/${org_Id.toString().trim()}/${initFile}`;\r\n\r\n      if (fs.existsSync(orgInitFile)) {\r\n        let fileData = fs.readFileSync(orgInitFile, \"utf8\");\r\n        const parseData = JSON.parse(fileData);\r\n\r\n        return await axios\r\n          .delete(`${parseData?.baseUrl}/sdk/api/delete/${org_Id}`, {\r\n            headers: {\r\n              \"Content-Type\": \"application/json\",\r\n            },\r\n          })\r\n          .then((res) => {\r\n            if (res.data?.resultCode == 1) {\r\n              try {\r\n                this.removeKeyFiles(org_Id, \"deleteLicense()\");\r\n                if (fs.existsSync(`${licenseBaseFolder}/${org_Id}/${licenseFile}`)) {\r\n                  fs.unlink(`${licenseBaseFolder}/${org_Id}/${licenseFile}`, () => {});\r\n                }\r\n              } catch (error) {\r\n                console.error(\"Fail to delete files after delete license. \", error);\r\n                throw new Error(error instanceof Error ? error.message : \"License File Delete Exception.\");\r\n              }\r\n\r\n              return {\r\n                code: 1,\r\n                data: {},\r\n                result: \"License deleted.\",\r\n              };\r\n            } else {\r\n              console.error(`Fail to delete license on server. '${org_Id}'.`);\r\n              throw new Error(`Fail to delete license on server. '${org_Id}'.`);\r\n            }\r\n          })\r\n          .catch((err: any) => {\r\n            if (err?.code == \"ECONNREFUSED\" || err?.message?.includes(\"ECONNREFUSED\")) {\r\n              console.error(\"Unable to connect License server :\", err?.message);\r\n              throw new Error(\r\n                err instanceof Error\r\n                  ? `Unable to connect License server : ${err?.message}`\r\n                  : \"Something went wrong at licensing server end.\"\r\n              );\r\n            }\r\n\r\n            console.debug(\r\n              \"License Server Response : \",\r\n              `Status: ${err?.response?.status} : ${err?.message} : `,\r\n              err?.response?.data\r\n            );\r\n\r\n            let _errorMsg = err?.response?.data?.message || \"Fail to delete license from server.\";\r\n\r\n            console.error({ _errorMsg });\r\n            throw new Error(_errorMsg);\r\n          });\r\n      } else {\r\n        console.error(`No License issued to org id ${org_Id}.`);\r\n        throw new Error(`No License issued to org id ${org_Id}. Unable to delete.`);\r\n      }\r\n    } catch (error) {\r\n      console.error(\"Delete License Exception :\", error);\r\n      throw new Error(error instanceof Error ? error.message : \"Unknown error occurred > Delete License.\");\r\n    }\r\n  };\r\n}\r\n(async function () {\r\n  function readDirectories(directoryPath: string): string[] {\r\n    const subFolders: string[] = [];\r\n\r\n    // Read the contents of the directory\r\n    const contents = fs.readdirSync(directoryPath);\r\n\r\n    // Iterate through the contents\r\n    for (const item of contents) {\r\n      const itemPath = path.join(directoryPath, item);\r\n      // Check if the item is a directory\r\n      if (fs.statSync(itemPath).isDirectory()) {\r\n        subFolders.push(item);\r\n      }\r\n    }\r\n\r\n    return subFolders;\r\n  }\r\n\r\n  // cron.schedule(\"*/10 * * * * *\", async () => { // this is 10 sec\r\n  // Define your scheduler initialization logic\r\n  const midnight = \"0 30 0 * * *\";\r\n  cron.schedule(midnight, async () => {\r\n    /** this is 30 min */\r\n    try {\r\n      const subFolders = (await readDirectories(baseFolderPath)) || [];\r\n\r\n      for (const orgId of subFolders) {\r\n        let orgInitFile = `${baseFolderPath}/${orgId}/${initFile}`;\r\n\r\n        if (fs.existsSync(orgInitFile)) {\r\n          let fileData = fs.readFileSync(orgInitFile, \"utf8\");\r\n          const parseData = JSON.parse(fileData);\r\n\r\n          parseData.device = await getDeviceDetails();\r\n\r\n          if (\r\n            parseData &&\r\n            parseData?.licenseKey &&\r\n            parseData?.licenseKey !== \"\" &&\r\n            fs.existsSync(`${baseFolderPath}/${orgId}/${serverFile}`)\r\n          ) {\r\n            try {\r\n              const _clientEncryptedData = await aesEncrypt(parseData?.secretId, parseData);\r\n\r\n              const _clientKeyData = await rsaEncrypt(`${baseFolderPath}/${orgId}/${serverFile}`, parseData?.secretId);\r\n\r\n              const licenseServerAPI = `${parseData.baseUrl}/sdk/api/generateLicense`;\r\n\r\n              const apiBody = {\r\n                key: _clientKeyData,\r\n                licenseKey: parseData?.licenseKey,\r\n                client: _clientEncryptedData,\r\n              };\r\n\r\n              await axios\r\n                .post(`${licenseServerAPI}`, apiBody, {\r\n                  headers: {\r\n                    \"Content-Type\": \"application/json\",\r\n                  },\r\n                })\r\n                .then(async (res) => {\r\n                  if (res.data?.resultCode == 1) {\r\n                    try {\r\n                      fs.writeFileSync(\r\n                        `${licenseBaseFolder}/${orgId}/${licenseFile}`,\r\n                        JSON.stringify(JSON.parse(res.data?.data), null, 2)\r\n                      );\r\n                    } catch (error: any) {\r\n                      logging(\r\n                        orgId,\r\n                        \"Auto sync license\",\r\n                        `License File Save Exception: ${\r\n                          error instanceof Error ? error.message : \"License File Save Exception.\"\r\n                        }`\r\n                      );\r\n                    }\r\n                    updateTrace(orgId, { isExpired: false, isActive: true, dateTime: new Date() });\r\n                  } else {\r\n                    logging(orgId, \"Auto sync license\", `Fail: ${JSON.stringify(res.data)}`);\r\n                  }\r\n                })\r\n                .catch(async (err) => {\r\n                  // if(err?.code == \"ECONNREFUSED\" || err?.message?.includes(\"ECONNREFUSED\")){\r\n                  //   console.error(\"License server exception  :\", err?.message);\r\n                  //   throw new Error(err instanceof Error ? `License server exception : ${err?.message}` : \"Something went wrong at licensing server end.\");\r\n                  // }\r\n\r\n                  logging(\r\n                    orgId,\r\n                    \"Auto sync license\",\r\n                    `Fail: Status: ${err?.response?.status} : ${err?.message} : ${JSON.stringify(err?.response?.data)}`\r\n                  );\r\n                });\r\n            } catch (error) {\r\n              // console.error(\"Get License Exception :\", error);\r\n              // throw new Error(error instanceof Error ? error.message : \"Unknown error occurred> Get License.\");\r\n              logging(\r\n                orgId,\r\n                \"Auto sync license\",\r\n                `Exception: ${error instanceof Error ? error.message : \"Unknown error occurred> Sync License.\"}`\r\n              );\r\n            }\r\n          }\r\n        }\r\n      }\r\n    } catch (error) {\r\n      logging(\r\n        \"N.A\",\r\n        \"Auto sync license\",\r\n        `Schedular Exception: ${error instanceof Error ? error.message : \"Schedular exception auto sync License.\"}`\r\n      );\r\n    }\r\n  });\r\n\r\n  return true;\r\n})();\r\n"],"mappings":"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","names":["fs","fs","_a"]}