axiodb 2.25.71 → 2.26.74
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/Services/Aggregation/Aggregation.Operation.js +2 -2
- package/lib/Services/Aggregation/Aggregation.Operation.js.map +1 -1
- package/lib/Services/CRUD Operation/Delete.operation.js +2 -2
- package/lib/Services/CRUD Operation/Delete.operation.js.map +1 -1
- package/lib/Services/CRUD Operation/Reader.operation.js +2 -2
- package/lib/Services/CRUD Operation/Reader.operation.js.map +1 -1
- package/lib/Services/CRUD Operation/Update.operation.js +2 -2
- package/lib/Services/CRUD Operation/Update.operation.js.map +1 -1
- package/lib/Services/Database/database.operation.d.ts +1 -0
- package/lib/Services/Database/database.operation.js +1 -0
- package/lib/Services/Database/database.operation.js.map +1 -1
- package/lib/Services/Indexation.operation.js +1 -2
- package/lib/Services/Indexation.operation.js.map +1 -1
- package/lib/caching/cache.operation.d.ts +19 -0
- package/lib/caching/cache.operation.js +63 -0
- package/lib/caching/cache.operation.js.map +1 -1
- package/lib/config/Interfaces/Operation/Indexation.operation.interface.d.ts +0 -1
- package/lib/engine/node/WorkerForDataLoad.engine.js +6 -1
- package/lib/engine/node/WorkerForDataLoad.engine.js.map +1 -1
- package/lib/server/config/PortFreeChecker.d.ts +0 -22
- package/lib/server/config/PortFreeChecker.js +0 -41
- package/lib/server/config/PortFreeChecker.js.map +1 -1
- package/lib/server/controller/Stats.controller.d.ts +28 -0
- package/lib/server/controller/Stats.controller.js +127 -0
- package/lib/server/controller/Stats.controller.js.map +1 -0
- package/lib/server/public/AxioControl/.vite/manifest.json +1 -1
- package/lib/server/public/AxioControl/assets/{index-CAFsNx4j.js → index-BCa5aR5j.js} +22 -22
- package/lib/server/public/AxioControl/index.html +1 -1
- package/lib/server/public/AxioControl/sw.js +1 -1
- package/lib/server/router/Router.js +6 -1
- package/lib/server/router/Router.js.map +1 -1
- package/lib/utility/BufferLoaderWithWorker.utils.d.ts +1 -1
- package/lib/utility/BufferLoaderWithWorker.utils.js +3 -3
- package/lib/utility/BufferLoaderWithWorker.utils.js.map +1 -1
- package/package.json +2 -2
|
@@ -13,11 +13,9 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
13
13
|
};
|
|
14
14
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
15
|
exports.isPortInUse = isPortInUse;
|
|
16
|
-
exports.checkDockerPortMapping = checkDockerPortMapping;
|
|
17
16
|
exports.default = checkPortAndDocker;
|
|
18
17
|
/* eslint-disable @typescript-eslint/no-unused-vars */
|
|
19
18
|
const net_1 = __importDefault(require("net"));
|
|
20
|
-
const child_process_1 = require("child_process");
|
|
21
19
|
const keys_1 = require("./keys");
|
|
22
20
|
/**
|
|
23
21
|
* Checks whether a specific port is already in use.
|
|
@@ -58,44 +56,6 @@ function isPortInUse(port, host = keys_1.ServerKeys.LOCALHOST) {
|
|
|
58
56
|
.listen(port, String(host));
|
|
59
57
|
});
|
|
60
58
|
}
|
|
61
|
-
/**
|
|
62
|
-
* Checks if a specified port is currently mapped to any running Docker container.
|
|
63
|
-
*
|
|
64
|
-
* This function executes a Docker command to list all running containers and their port mappings,
|
|
65
|
-
* then filters for containers that are using the specified port.
|
|
66
|
-
*
|
|
67
|
-
* @param port - The port number to check for Docker container mappings
|
|
68
|
-
* @throws {Error} If the specified port is already mapped to a Docker container
|
|
69
|
-
* @returns {Promise<void>}
|
|
70
|
-
*
|
|
71
|
-
* @example
|
|
72
|
-
* ```typescript
|
|
73
|
-
* try {
|
|
74
|
-
* await checkDockerPortMapping(3000);
|
|
75
|
-
* // Port 3000 is free for use
|
|
76
|
-
* } catch (error) {
|
|
77
|
-
* // Port 3000 is already in use by a Docker container
|
|
78
|
-
* console.error(error.message);
|
|
79
|
-
* }
|
|
80
|
-
* ```
|
|
81
|
-
*/
|
|
82
|
-
function checkDockerPortMapping(port) {
|
|
83
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
84
|
-
(0, child_process_1.exec)(`docker ps --format "{{.ID}} {{.Ports}}"`, (error, stdout, _stderr) => {
|
|
85
|
-
if (error) {
|
|
86
|
-
console.error(`Error executing docker: ${error.message}`);
|
|
87
|
-
return;
|
|
88
|
-
}
|
|
89
|
-
const containers = stdout.trim().split("\n");
|
|
90
|
-
const matching = containers.filter((line) => line.includes(`:${port}->`));
|
|
91
|
-
if (matching.length > 0) {
|
|
92
|
-
console.log(`Docker container(s) found using port ${port}:`);
|
|
93
|
-
matching.forEach((c) => console.log(c));
|
|
94
|
-
throw new Error(`Port ${port} is already mapped to a Docker container. Please stop the container or Please Free the port to get the GUI.`);
|
|
95
|
-
}
|
|
96
|
-
});
|
|
97
|
-
});
|
|
98
|
-
}
|
|
99
59
|
/**
|
|
100
60
|
* Checks if a specified port is in use and if there's a Docker port mapping for that port.
|
|
101
61
|
*
|
|
@@ -106,7 +66,6 @@ function checkDockerPortMapping(port) {
|
|
|
106
66
|
function checkPortAndDocker(port) {
|
|
107
67
|
return __awaiter(this, void 0, void 0, function* () {
|
|
108
68
|
yield isPortInUse(port);
|
|
109
|
-
yield checkDockerPortMapping(port);
|
|
110
69
|
});
|
|
111
70
|
}
|
|
112
71
|
//# sourceMappingURL=PortFreeChecker.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PortFreeChecker.js","sourceRoot":"","sources":["../../../source/server/config/PortFreeChecker.ts"],"names":[],"mappings":";;;;;;;;;;;;;;AAwBA,kCAoBC;
|
|
1
|
+
{"version":3,"file":"PortFreeChecker.js","sourceRoot":"","sources":["../../../source/server/config/PortFreeChecker.ts"],"names":[],"mappings":";;;;;;;;;;;;;;AAwBA,kCAoBC;AASD,qCAEC;AAvDD,sDAAsD;AACtD,8CAAsB;AAEtB,iCAAoC;AAEpC;;;;;;;;;;;;;;;;;;GAkBG;AACH,SAAgB,WAAW,CAAC,IAAY,EAAE,IAAI,GAAG,iBAAU,CAAC,SAAS;IACnE,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,MAAM,MAAM,GAAG,aAAG;aACf,YAAY,EAAE;aACd,IAAI,CAAC,OAAO,EAAE,CAAC,GAA0B,EAAE,EAAE;YAC5C,IAAI,GAAG,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC;gBAC9B,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,iBAAiB;gBAChC,MAAM,IAAI,KAAK,CACb,QAAQ,IAAI,0DAA0D,CACvE,CAAC;YACJ,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,cAAc;YAChC,CAAC;QACH,CAAC,CAAC;aACD,IAAI,CAAC,WAAW,EAAE,GAAG,EAAE;YACtB,MAAM,CAAC,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,eAAe;QACjC,CAAC,CAAC;aACD,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;IAChC,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;;;;;GAMG;AACH,SAA8B,kBAAkB,CAAC,IAAY;;QAC3D,MAAM,WAAW,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC;CAAA"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { AxioDB } from "../../Services/Indexation.operation";
|
|
2
|
+
export default class StatsController {
|
|
3
|
+
private AxioDBInstance;
|
|
4
|
+
constructor(AxioDBInstance: AxioDB);
|
|
5
|
+
/**
|
|
6
|
+
* Retrieves dashboard statistics for the AxioDB instance.
|
|
7
|
+
*
|
|
8
|
+
* This method gathers and compiles various statistics about the database system:
|
|
9
|
+
* - Count of databases, collections, and documents
|
|
10
|
+
* - Storage information (used storage and total machine storage)
|
|
11
|
+
* - In-memory cache details
|
|
12
|
+
*
|
|
13
|
+
* All storage metrics are converted to MB for consistency.
|
|
14
|
+
*
|
|
15
|
+
* @returns {Promise<Object>} A formatted response object containing:
|
|
16
|
+
* - HTTP status code
|
|
17
|
+
* - Status message
|
|
18
|
+
* - Data payload with the following statistics:
|
|
19
|
+
* - totalDatabases: Number of databases in the instance
|
|
20
|
+
* - totalCollections: Total number of collections across all databases
|
|
21
|
+
* - totalDocuments: Total number of documents across all collections
|
|
22
|
+
* - storageInfo: Object containing storage metrics (total used, machine total, and units)
|
|
23
|
+
* - cacheStorage: Object containing cache storage metrics (current usage, maximum, and units)
|
|
24
|
+
*
|
|
25
|
+
* @throws Will return an error response with status 500 if the operation fails
|
|
26
|
+
*/
|
|
27
|
+
getDashBoardStat(): Promise<object>;
|
|
28
|
+
}
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
+
});
|
|
10
|
+
};
|
|
11
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
12
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
13
|
+
};
|
|
14
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
+
/* eslint-disable no-self-assign */
|
|
16
|
+
const outers_1 = require("outers");
|
|
17
|
+
const responseBuilder_helper_1 = __importDefault(require("../helper/responseBuilder.helper")); // ResponseBuilder,
|
|
18
|
+
// import { FastifyRequest } from "fastify";
|
|
19
|
+
// import countFilesRecursive from "../../helper/filesCounterInFolder.helper";
|
|
20
|
+
const cache_operation_1 = __importDefault(require("../../caching/cache.operation"));
|
|
21
|
+
const fs_1 = __importDefault(require("fs"));
|
|
22
|
+
class StatsController {
|
|
23
|
+
constructor(AxioDBInstance) {
|
|
24
|
+
this.AxioDBInstance = AxioDBInstance;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Retrieves dashboard statistics for the AxioDB instance.
|
|
28
|
+
*
|
|
29
|
+
* This method gathers and compiles various statistics about the database system:
|
|
30
|
+
* - Count of databases, collections, and documents
|
|
31
|
+
* - Storage information (used storage and total machine storage)
|
|
32
|
+
* - In-memory cache details
|
|
33
|
+
*
|
|
34
|
+
* All storage metrics are converted to MB for consistency.
|
|
35
|
+
*
|
|
36
|
+
* @returns {Promise<Object>} A formatted response object containing:
|
|
37
|
+
* - HTTP status code
|
|
38
|
+
* - Status message
|
|
39
|
+
* - Data payload with the following statistics:
|
|
40
|
+
* - totalDatabases: Number of databases in the instance
|
|
41
|
+
* - totalCollections: Total number of collections across all databases
|
|
42
|
+
* - totalDocuments: Total number of documents across all collections
|
|
43
|
+
* - storageInfo: Object containing storage metrics (total used, machine total, and units)
|
|
44
|
+
* - cacheStorage: Object containing cache storage metrics (current usage, maximum, and units)
|
|
45
|
+
*
|
|
46
|
+
* @throws Will return an error response with status 500 if the operation fails
|
|
47
|
+
*/
|
|
48
|
+
getDashBoardStat() {
|
|
49
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
50
|
+
var _a, _b, _c, _d, _e;
|
|
51
|
+
try {
|
|
52
|
+
const InstanceInfo = yield this.AxioDBInstance.getInstanceInfo();
|
|
53
|
+
let totalCollections = 0;
|
|
54
|
+
let totalDocuments = 0;
|
|
55
|
+
const treeMap = [];
|
|
56
|
+
// Extract Total Stats from the InstanceInfo
|
|
57
|
+
if (InstanceInfo && InstanceInfo.data) {
|
|
58
|
+
for (const db of InstanceInfo.data.ListOfDatabases) {
|
|
59
|
+
const dbTree = {
|
|
60
|
+
name: db,
|
|
61
|
+
collections: [],
|
|
62
|
+
};
|
|
63
|
+
const DB_instance = this.AxioDBInstance.createDB(db);
|
|
64
|
+
const Collection_stats = yield (yield DB_instance).getCollectionInfo();
|
|
65
|
+
if (Collection_stats) {
|
|
66
|
+
totalCollections +=
|
|
67
|
+
Collection_stats.data.ListOfCollections.length || 0;
|
|
68
|
+
for (const collection of Collection_stats.data.ListOfCollections) {
|
|
69
|
+
const Collection_Instance = yield (yield this.AxioDBInstance.createDB(db)).createCollection(collection);
|
|
70
|
+
const Document_stats = yield Collection_Instance.totalDocuments();
|
|
71
|
+
totalDocuments += ((_a = Document_stats.data) === null || _a === void 0 ? void 0 : _a.total) || 0;
|
|
72
|
+
dbTree.collections.push({
|
|
73
|
+
name: collection,
|
|
74
|
+
documentCount: ((_b = Document_stats.data) === null || _b === void 0 ? void 0 : _b.total) || 0,
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
treeMap.push(dbTree);
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
// Get storage info and convert to MB
|
|
82
|
+
let totalMachineStorage = 0;
|
|
83
|
+
let totalUsedStorage = ((_c = InstanceInfo === null || InstanceInfo === void 0 ? void 0 : InstanceInfo.data) === null || _c === void 0 ? void 0 : _c.TotalSize) || 0;
|
|
84
|
+
try {
|
|
85
|
+
// Get disk info for the root directory
|
|
86
|
+
const stats = fs_1.default.statfsSync("/");
|
|
87
|
+
const totalBytes = stats.blocks * stats.bsize;
|
|
88
|
+
// Convert to MB
|
|
89
|
+
totalMachineStorage = parseFloat((totalBytes / (1024 * 1024)).toFixed(2));
|
|
90
|
+
totalUsedStorage = parseFloat((totalUsedStorage / (1024 * 1024)).toFixed(2));
|
|
91
|
+
}
|
|
92
|
+
catch (storageError) {
|
|
93
|
+
console.error("Error fetching machine storage:", storageError);
|
|
94
|
+
}
|
|
95
|
+
const MatrixUnitsForUsedStorage = "MB";
|
|
96
|
+
const MatrixUnitsForMachineStorage = "MB";
|
|
97
|
+
const CacheStorageDetails = yield cache_operation_1.default.getCacheDetails();
|
|
98
|
+
const totalCacheSize = parseFloat((CacheStorageDetails.cacheSizeInBytes / (1024 * 1024)).toFixed(2));
|
|
99
|
+
const maxCacheSize = parseFloat((CacheStorageDetails.availableMemoryInBytes / (1024 * 1024)).toFixed(2));
|
|
100
|
+
const response = {
|
|
101
|
+
totalDatabases: ((_e = (_d = InstanceInfo === null || InstanceInfo === void 0 ? void 0 : InstanceInfo.data) === null || _d === void 0 ? void 0 : _d.ListOfDatabases) === null || _e === void 0 ? void 0 : _e.length) || 0,
|
|
102
|
+
totalCollections: totalCollections || 0,
|
|
103
|
+
totalDocuments: totalDocuments || 0,
|
|
104
|
+
storageInfo: {
|
|
105
|
+
total: totalUsedStorage || 0,
|
|
106
|
+
matrixUnit: MatrixUnitsForUsedStorage || "MB",
|
|
107
|
+
machine: totalMachineStorage || 0,
|
|
108
|
+
machineUnit: MatrixUnitsForMachineStorage || "B",
|
|
109
|
+
},
|
|
110
|
+
cacheStorage: {
|
|
111
|
+
Storage: totalCacheSize || 0,
|
|
112
|
+
Max: maxCacheSize || 0,
|
|
113
|
+
Unit: "MB",
|
|
114
|
+
},
|
|
115
|
+
nodeTree: treeMap,
|
|
116
|
+
};
|
|
117
|
+
return (0, responseBuilder_helper_1.default)(outers_1.StatusCodes.OK, "Dashboard stats fetched successfully", response);
|
|
118
|
+
}
|
|
119
|
+
catch (error) {
|
|
120
|
+
console.error("Error fetching dashboard stats:", error);
|
|
121
|
+
return (0, responseBuilder_helper_1.default)(outers_1.StatusCodes.INTERNAL_SERVER_ERROR, "Failed to fetch dashboard stats");
|
|
122
|
+
}
|
|
123
|
+
});
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
exports.default = StatsController;
|
|
127
|
+
//# sourceMappingURL=Stats.controller.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Stats.controller.js","sourceRoot":"","sources":["../../../source/server/controller/Stats.controller.ts"],"names":[],"mappings":"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"}
|