rosinterface 1.0.0
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/dist/client/CommandBuilder.d.ts +32 -0
- package/dist/client/CommandBuilder.js +168 -0
- package/dist/client/CommandBuilder.js.map +1 -0
- package/dist/client/MikrotikClient.d.ts +43 -0
- package/dist/client/MikrotikClient.js +276 -0
- package/dist/client/MikrotikClient.js.map +1 -0
- package/dist/client/MikrotikPool.d.ts +18 -0
- package/dist/client/MikrotikPool.js +55 -0
- package/dist/client/MikrotikPool.js.map +1 -0
- package/dist/client/ResultParser.d.ts +5 -0
- package/dist/client/ResultParser.js +30 -0
- package/dist/client/ResultParser.js.map +1 -0
- package/dist/core/Auth.d.ts +5 -0
- package/dist/core/Auth.js +87 -0
- package/dist/core/Auth.js.map +1 -0
- package/dist/core/CircuitBreaker.d.ts +23 -0
- package/dist/core/CircuitBreaker.js +64 -0
- package/dist/core/CircuitBreaker.js.map +1 -0
- package/dist/core/OfflineQueue.d.ts +13 -0
- package/dist/core/OfflineQueue.js +25 -0
- package/dist/core/OfflineQueue.js.map +1 -0
- package/dist/core/RateLimiter.d.ts +17 -0
- package/dist/core/RateLimiter.js +65 -0
- package/dist/core/RateLimiter.js.map +1 -0
- package/dist/core/RosProtocol.d.ts +7 -0
- package/dist/core/RosProtocol.js +80 -0
- package/dist/core/RosProtocol.js.map +1 -0
- package/dist/core/SchemaMapper.d.ts +14 -0
- package/dist/core/SchemaMapper.js +65 -0
- package/dist/core/SchemaMapper.js.map +1 -0
- package/dist/core/SocketClient.d.ts +22 -0
- package/dist/core/SocketClient.js +160 -0
- package/dist/core/SocketClient.js.map +1 -0
- package/dist/features/FileManager.d.ts +8 -0
- package/dist/features/FileManager.js +41 -0
- package/dist/features/FileManager.js.map +1 -0
- package/dist/features/PrometheusExporter.d.ts +15 -0
- package/dist/features/PrometheusExporter.js +38 -0
- package/dist/features/PrometheusExporter.js.map +1 -0
- package/dist/index.d.ts +11 -0
- package/dist/index.js +41 -0
- package/dist/index.js.map +1 -0
- package/dist/types/index.d.ts +14 -0
- package/dist/types/index.js +47 -0
- package/dist/types/index.js.map +1 -0
- package/dist/utils/Helpers.d.ts +4 -0
- package/dist/utils/Helpers.js +25 -0
- package/dist/utils/Helpers.js.map +1 -0
- package/dist/utils/MikrotikCollection.d.ts +14 -0
- package/dist/utils/MikrotikCollection.js +79 -0
- package/dist/utils/MikrotikCollection.js.map +1 -0
- package/package.json +42 -0
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.SocketClient = void 0;
|
|
37
|
+
const net = __importStar(require("net"));
|
|
38
|
+
const tls = __importStar(require("tls"));
|
|
39
|
+
const events_1 = require("events");
|
|
40
|
+
const buffer_1 = require("buffer");
|
|
41
|
+
const RosProtocol_1 = require("./RosProtocol");
|
|
42
|
+
class SocketClient extends events_1.EventEmitter {
|
|
43
|
+
constructor(options) {
|
|
44
|
+
super();
|
|
45
|
+
this.socket = null;
|
|
46
|
+
this.connected = false;
|
|
47
|
+
this.receiveBuffer = buffer_1.Buffer.alloc(0);
|
|
48
|
+
this.options = {
|
|
49
|
+
timeout: 10,
|
|
50
|
+
rejectUnauthorized: false,
|
|
51
|
+
keepAlive: true,
|
|
52
|
+
useTLS: false,
|
|
53
|
+
...options
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
connect() {
|
|
57
|
+
return new Promise((resolve, reject) => {
|
|
58
|
+
if (this.connected)
|
|
59
|
+
return resolve();
|
|
60
|
+
if (this.socket) {
|
|
61
|
+
this.socket.removeAllListeners();
|
|
62
|
+
this.socket.destroy();
|
|
63
|
+
this.socket = null;
|
|
64
|
+
}
|
|
65
|
+
const timeoutMs = (this.options.timeout || 10) * 1000;
|
|
66
|
+
try {
|
|
67
|
+
if (this.options.useTLS) {
|
|
68
|
+
const tlsOptions = {
|
|
69
|
+
host: this.options.host,
|
|
70
|
+
port: this.options.port,
|
|
71
|
+
rejectUnauthorized: this.options.rejectUnauthorized,
|
|
72
|
+
timeout: timeoutMs
|
|
73
|
+
};
|
|
74
|
+
this.socket = tls.connect(tlsOptions);
|
|
75
|
+
}
|
|
76
|
+
else {
|
|
77
|
+
this.socket = new net.Socket();
|
|
78
|
+
this.socket.setTimeout(timeoutMs);
|
|
79
|
+
this.socket.connect(this.options.port, this.options.host);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
catch (err) {
|
|
83
|
+
return reject(err);
|
|
84
|
+
}
|
|
85
|
+
this.socket.once('timeout', () => {
|
|
86
|
+
const err = new Error(`Connection timed out after ${this.options.timeout} seconds`);
|
|
87
|
+
this.destroy();
|
|
88
|
+
reject(err);
|
|
89
|
+
});
|
|
90
|
+
this.socket.setNoDelay(true);
|
|
91
|
+
if (this.options.keepAlive && this.socket instanceof net.Socket) {
|
|
92
|
+
this.socket.setKeepAlive(true, 10000);
|
|
93
|
+
}
|
|
94
|
+
const connectEvent = this.options.useTLS ? 'secureConnect' : 'connect';
|
|
95
|
+
this.socket.once(connectEvent, () => {
|
|
96
|
+
this.connected = true;
|
|
97
|
+
if (this.socket)
|
|
98
|
+
this.socket.setTimeout(0);
|
|
99
|
+
resolve();
|
|
100
|
+
this.emit('connect');
|
|
101
|
+
});
|
|
102
|
+
this.socket.on('error', (err) => {
|
|
103
|
+
if (!this.connected) {
|
|
104
|
+
reject(err);
|
|
105
|
+
}
|
|
106
|
+
else {
|
|
107
|
+
this.emit('error', err);
|
|
108
|
+
}
|
|
109
|
+
});
|
|
110
|
+
this.socket.on('close', (hadError) => {
|
|
111
|
+
this.connected = false;
|
|
112
|
+
this.emit('close', hadError);
|
|
113
|
+
});
|
|
114
|
+
this.socket.on('data', (chunk) => {
|
|
115
|
+
const bufferChunk = buffer_1.Buffer.isBuffer(chunk)
|
|
116
|
+
? chunk
|
|
117
|
+
: buffer_1.Buffer.from(chunk, 'utf8');
|
|
118
|
+
this.handleDataChunk(bufferChunk);
|
|
119
|
+
});
|
|
120
|
+
});
|
|
121
|
+
}
|
|
122
|
+
write(data) {
|
|
123
|
+
if (!this.connected || !this.socket) {
|
|
124
|
+
throw new Error('Socket is not connected. Call connect() first.');
|
|
125
|
+
}
|
|
126
|
+
this.socket.write(data);
|
|
127
|
+
}
|
|
128
|
+
close() {
|
|
129
|
+
if (this.socket && !this.socket.destroyed) {
|
|
130
|
+
this.socket.end();
|
|
131
|
+
this.connected = false;
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
destroy() {
|
|
135
|
+
if (this.socket && !this.socket.destroyed) {
|
|
136
|
+
this.socket.destroy();
|
|
137
|
+
this.connected = false;
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
handleDataChunk(chunk) {
|
|
141
|
+
this.receiveBuffer = buffer_1.Buffer.concat([this.receiveBuffer, chunk]);
|
|
142
|
+
while (this.receiveBuffer.length > 0) {
|
|
143
|
+
const lengthInfo = RosProtocol_1.RosProtocol.decodeLength(this.receiveBuffer);
|
|
144
|
+
if (!lengthInfo) {
|
|
145
|
+
break;
|
|
146
|
+
}
|
|
147
|
+
const { length, byteLength } = lengthInfo;
|
|
148
|
+
const totalPacketSize = byteLength + length;
|
|
149
|
+
if (this.receiveBuffer.length < totalPacketSize) {
|
|
150
|
+
break;
|
|
151
|
+
}
|
|
152
|
+
const payload = this.receiveBuffer.slice(byteLength, totalPacketSize);
|
|
153
|
+
this.receiveBuffer = this.receiveBuffer.slice(totalPacketSize);
|
|
154
|
+
const sentence = payload.toString('utf8');
|
|
155
|
+
this.emit('data', sentence);
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
exports.SocketClient = SocketClient;
|
|
160
|
+
//# sourceMappingURL=SocketClient.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SocketClient.js","sourceRoot":"","sources":["../../src/core/SocketClient.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { MikrotikClient } from '../client/MikrotikClient';
|
|
2
|
+
export declare class FileManager {
|
|
3
|
+
private client;
|
|
4
|
+
constructor(client: MikrotikClient);
|
|
5
|
+
upload(fileName: string, content: string): Promise<void>;
|
|
6
|
+
download(fileName: string): Promise<string | null>;
|
|
7
|
+
delete(fileName: string): Promise<void>;
|
|
8
|
+
}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.FileManager = void 0;
|
|
4
|
+
class FileManager {
|
|
5
|
+
constructor(client) {
|
|
6
|
+
this.client = client;
|
|
7
|
+
}
|
|
8
|
+
async upload(fileName, content) {
|
|
9
|
+
if (content.length > 1024 * 1024) {
|
|
10
|
+
console.warn('[FileManager] Warning: Uploading large files via API is risky. Content > 1MB.');
|
|
11
|
+
}
|
|
12
|
+
const exists = await this.client.command('/file')
|
|
13
|
+
.where('name', fileName)
|
|
14
|
+
.first();
|
|
15
|
+
if (!exists) {
|
|
16
|
+
await this.client.write('/file/print', {
|
|
17
|
+
file: fileName,
|
|
18
|
+
where: 'false'
|
|
19
|
+
}).catch(() => { });
|
|
20
|
+
}
|
|
21
|
+
await this.client.write('/file/set', {
|
|
22
|
+
'numbers': fileName,
|
|
23
|
+
'contents': content
|
|
24
|
+
});
|
|
25
|
+
console.log(`[FileManager] Successfully uploaded: ${fileName} (${content.length} bytes)`);
|
|
26
|
+
}
|
|
27
|
+
async download(fileName) {
|
|
28
|
+
const file = await this.client.command('/file')
|
|
29
|
+
.where('name', fileName)
|
|
30
|
+
.first();
|
|
31
|
+
if (!file)
|
|
32
|
+
return null;
|
|
33
|
+
return file.contents || '(Binary or Empty)';
|
|
34
|
+
}
|
|
35
|
+
async delete(fileName) {
|
|
36
|
+
await this.client.command('/file').remove(fileName);
|
|
37
|
+
console.log(`[FileManager] Deleted: ${fileName}`);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
exports.FileManager = FileManager;
|
|
41
|
+
//# sourceMappingURL=FileManager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FileManager.js","sourceRoot":"","sources":["../../src/features/FileManager.ts"],"names":[],"mappings":";;;AAOA,MAAa,WAAW;IAGpB,YAAY,MAAsB;QAC9B,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACzB,CAAC;IAQM,KAAK,CAAC,MAAM,CAAC,QAAgB,EAAE,OAAe;QAIjD,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,GAAG,IAAI,EAAE,CAAC;YAC/B,OAAO,CAAC,IAAI,CAAC,+EAA+E,CAAC,CAAC;QAClG,CAAC;QAGD,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC;aAC5C,KAAK,CAAC,MAAM,EAAE,QAAQ,CAAC;aACvB,KAAK,EAAE,CAAC;QAEb,IAAI,CAAC,MAAM,EAAE,CAAC;YAEV,MAAM,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,aAAa,EAAE;gBACnC,IAAI,EAAE,QAAQ;gBACd,KAAK,EAAE,OAAO;aACjB,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QAEvB,CAAC;QAID,MAAM,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,WAAW,EAAE;YACjC,SAAS,EAAE,QAAQ;YACnB,UAAU,EAAE,OAAO;SACtB,CAAC,CAAC;QAEH,OAAO,CAAC,GAAG,CAAC,wCAAwC,QAAQ,KAAK,OAAO,CAAC,MAAM,SAAS,CAAC,CAAC;IAC9F,CAAC;IAOM,KAAK,CAAC,QAAQ,CAAC,QAAgB;QAClC,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC;aAC1C,KAAK,CAAC,MAAM,EAAE,QAAQ,CAAC;aACvB,KAAK,EAAE,CAAC;QAEb,IAAI,CAAC,IAAI;YAAE,OAAO,IAAI,CAAC;QAIvB,OAAO,IAAI,CAAC,QAAQ,IAAI,mBAAmB,CAAC;IAChD,CAAC;IAKM,KAAK,CAAC,MAAM,CAAC,QAAgB;QAChC,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QACpD,OAAO,CAAC,GAAG,CAAC,0BAA0B,QAAQ,EAAE,CAAC,CAAC;IACtD,CAAC;CACJ;AArED,kCAqEC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { MikrotikCollection } from '../utils/MikrotikCollection';
|
|
2
|
+
export declare enum MetricType {
|
|
3
|
+
GAUGE = "gauge",
|
|
4
|
+
COUNTER = "counter"
|
|
5
|
+
}
|
|
6
|
+
export interface MetricDefinition {
|
|
7
|
+
sourceField: string;
|
|
8
|
+
metricName: string;
|
|
9
|
+
help: string;
|
|
10
|
+
type: MetricType;
|
|
11
|
+
labels?: string[];
|
|
12
|
+
}
|
|
13
|
+
export declare class PrometheusExporter {
|
|
14
|
+
static export(collection: MikrotikCollection<any>, definitions: MetricDefinition[]): string;
|
|
15
|
+
}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.PrometheusExporter = exports.MetricType = void 0;
|
|
4
|
+
var MetricType;
|
|
5
|
+
(function (MetricType) {
|
|
6
|
+
MetricType["GAUGE"] = "gauge";
|
|
7
|
+
MetricType["COUNTER"] = "counter";
|
|
8
|
+
})(MetricType || (exports.MetricType = MetricType = {}));
|
|
9
|
+
class PrometheusExporter {
|
|
10
|
+
static export(collection, definitions) {
|
|
11
|
+
let output = '';
|
|
12
|
+
const items = collection.all();
|
|
13
|
+
for (const def of definitions) {
|
|
14
|
+
output += `# HELP ${def.metricName} ${def.help}\n`;
|
|
15
|
+
output += `# TYPE ${def.metricName} ${def.type}\n`;
|
|
16
|
+
for (const item of items) {
|
|
17
|
+
const value = item[def.sourceField];
|
|
18
|
+
if (value === undefined || value === null)
|
|
19
|
+
continue;
|
|
20
|
+
let labelString = '';
|
|
21
|
+
if (def.labels && def.labels.length > 0) {
|
|
22
|
+
const labelParts = def.labels.map(labelField => {
|
|
23
|
+
const rawLabelVal = String(item[labelField] || 'unknown');
|
|
24
|
+
const cleanLabelVal = rawLabelVal.replace(/"/g, '\\"');
|
|
25
|
+
const cleanLabelName = labelField.replace(/-/g, '_');
|
|
26
|
+
return `${cleanLabelName}="${cleanLabelVal}"`;
|
|
27
|
+
});
|
|
28
|
+
labelString = `{${labelParts.join(',')}}`;
|
|
29
|
+
}
|
|
30
|
+
output += `${def.metricName}${labelString} ${value}\n`;
|
|
31
|
+
}
|
|
32
|
+
output += '\n';
|
|
33
|
+
}
|
|
34
|
+
return output;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
exports.PrometheusExporter = PrometheusExporter;
|
|
38
|
+
//# sourceMappingURL=PrometheusExporter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PrometheusExporter.js","sourceRoot":"","sources":["../../src/features/PrometheusExporter.ts"],"names":[],"mappings":";;;AAEA,IAAY,UAGX;AAHD,WAAY,UAAU;IAClB,6BAAe,CAAA;IACf,iCAAmB,CAAA;AACvB,CAAC,EAHW,UAAU,0BAAV,UAAU,QAGrB;AAoBD,MAAa,kBAAkB;IAQpB,MAAM,CAAC,MAAM,CAAC,UAAmC,EAAE,WAA+B;QACrF,IAAI,MAAM,GAAG,EAAE,CAAC;QAChB,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC;QAE/B,KAAK,MAAM,GAAG,IAAI,WAAW,EAAE,CAAC;YAE5B,MAAM,IAAI,UAAU,GAAG,CAAC,UAAU,IAAI,GAAG,CAAC,IAAI,IAAI,CAAC;YACnD,MAAM,IAAI,UAAU,GAAG,CAAC,UAAU,IAAI,GAAG,CAAC,IAAI,IAAI,CAAC;YAGnD,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;gBACvB,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;gBAGpC,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI;oBAAE,SAAS;gBAGpD,IAAI,WAAW,GAAG,EAAE,CAAC;gBACrB,IAAI,GAAG,CAAC,MAAM,IAAI,GAAG,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBACtC,MAAM,UAAU,GAAG,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE;wBAE3C,MAAM,WAAW,GAAG,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,SAAS,CAAC,CAAC;wBAC1D,MAAM,aAAa,GAAG,WAAW,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;wBAEvD,MAAM,cAAc,GAAG,UAAU,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;wBACrD,OAAO,GAAG,cAAc,KAAK,aAAa,GAAG,CAAC;oBAClD,CAAC,CAAC,CAAC;oBACH,WAAW,GAAG,IAAI,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;gBAC9C,CAAC;gBAID,MAAM,IAAI,GAAG,GAAG,CAAC,UAAU,GAAG,WAAW,IAAI,KAAK,IAAI,CAAC;YAC3D,CAAC;YACD,MAAM,IAAI,IAAI,CAAC;QACnB,CAAC;QAED,OAAO,MAAM,CAAC;IAClB,CAAC;CACJ;AA/CD,gDA+CC"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export { MikrotikClient, MikrotikOptions, Subscription } from './client/MikrotikClient';
|
|
2
|
+
export { MikrotikPool, PoolOptions } from './client/MikrotikPool';
|
|
3
|
+
export { CommandBuilder } from './client/CommandBuilder';
|
|
4
|
+
export { PrometheusExporter, MetricDefinition, MetricType } from './features/PrometheusExporter';
|
|
5
|
+
export { FileManager } from './features/FileManager';
|
|
6
|
+
export { CircuitBreaker, CircuitBreakerOptions, CircuitBreakerState } from './core/CircuitBreaker';
|
|
7
|
+
export { RateLimiter } from './core/RateLimiter';
|
|
8
|
+
export { SchemaMapper } from './core/SchemaMapper';
|
|
9
|
+
export { ResultParser } from './client/ResultParser';
|
|
10
|
+
export { MikrotikCollection } from './utils/MikrotikCollection';
|
|
11
|
+
export * from './utils/Helpers';
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
exports.MikrotikCollection = exports.ResultParser = exports.SchemaMapper = exports.RateLimiter = exports.CircuitBreakerState = exports.CircuitBreaker = exports.FileManager = exports.MetricType = exports.PrometheusExporter = exports.CommandBuilder = exports.MikrotikPool = exports.MikrotikClient = void 0;
|
|
18
|
+
var MikrotikClient_1 = require("./client/MikrotikClient");
|
|
19
|
+
Object.defineProperty(exports, "MikrotikClient", { enumerable: true, get: function () { return MikrotikClient_1.MikrotikClient; } });
|
|
20
|
+
var MikrotikPool_1 = require("./client/MikrotikPool");
|
|
21
|
+
Object.defineProperty(exports, "MikrotikPool", { enumerable: true, get: function () { return MikrotikPool_1.MikrotikPool; } });
|
|
22
|
+
var CommandBuilder_1 = require("./client/CommandBuilder");
|
|
23
|
+
Object.defineProperty(exports, "CommandBuilder", { enumerable: true, get: function () { return CommandBuilder_1.CommandBuilder; } });
|
|
24
|
+
var PrometheusExporter_1 = require("./features/PrometheusExporter");
|
|
25
|
+
Object.defineProperty(exports, "PrometheusExporter", { enumerable: true, get: function () { return PrometheusExporter_1.PrometheusExporter; } });
|
|
26
|
+
Object.defineProperty(exports, "MetricType", { enumerable: true, get: function () { return PrometheusExporter_1.MetricType; } });
|
|
27
|
+
var FileManager_1 = require("./features/FileManager");
|
|
28
|
+
Object.defineProperty(exports, "FileManager", { enumerable: true, get: function () { return FileManager_1.FileManager; } });
|
|
29
|
+
var CircuitBreaker_1 = require("./core/CircuitBreaker");
|
|
30
|
+
Object.defineProperty(exports, "CircuitBreaker", { enumerable: true, get: function () { return CircuitBreaker_1.CircuitBreaker; } });
|
|
31
|
+
Object.defineProperty(exports, "CircuitBreakerState", { enumerable: true, get: function () { return CircuitBreaker_1.CircuitBreakerState; } });
|
|
32
|
+
var RateLimiter_1 = require("./core/RateLimiter");
|
|
33
|
+
Object.defineProperty(exports, "RateLimiter", { enumerable: true, get: function () { return RateLimiter_1.RateLimiter; } });
|
|
34
|
+
var SchemaMapper_1 = require("./core/SchemaMapper");
|
|
35
|
+
Object.defineProperty(exports, "SchemaMapper", { enumerable: true, get: function () { return SchemaMapper_1.SchemaMapper; } });
|
|
36
|
+
var ResultParser_1 = require("./client/ResultParser");
|
|
37
|
+
Object.defineProperty(exports, "ResultParser", { enumerable: true, get: function () { return ResultParser_1.ResultParser; } });
|
|
38
|
+
var MikrotikCollection_1 = require("./utils/MikrotikCollection");
|
|
39
|
+
Object.defineProperty(exports, "MikrotikCollection", { enumerable: true, get: function () { return MikrotikCollection_1.MikrotikCollection; } });
|
|
40
|
+
__exportStar(require("./utils/Helpers"), exports);
|
|
41
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAsBA,0DAAwF;AAA/E,gHAAA,cAAc,OAAA;AAOvB,sDAAkE;AAAzD,4GAAA,YAAY,OAAA;AAOrB,0DAAyD;AAAhD,gHAAA,cAAc,OAAA;AAWvB,oEAAiG;AAAxF,wHAAA,kBAAkB,OAAA;AAAoB,gHAAA,UAAU,OAAA;AAOzD,sDAAqD;AAA5C,0GAAA,WAAW,OAAA;AAWpB,wDAAmG;AAA1F,gHAAA,cAAc,OAAA;AAAyB,qHAAA,mBAAmB,OAAA;AAOnE,kDAAiD;AAAxC,0GAAA,WAAW,OAAA;AAOpB,oDAAmD;AAA1C,4GAAA,YAAY,OAAA;AAWrB,sDAAqD;AAA5C,4GAAA,YAAY,OAAA;AAOrB,iEAAgE;AAAvD,wHAAA,kBAAkB,OAAA;AAM3B,kDAAgC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export { MikrotikClient, MikrotikOptions, Subscription } from '../client/MikrotikClient';
|
|
2
|
+
export { MikrotikPool, PoolOptions } from '../client/MikrotikPool';
|
|
3
|
+
export { CommandBuilder } from '../client/CommandBuilder';
|
|
4
|
+
export { PrometheusExporter, MetricDefinition, MetricType } from '../features/PrometheusExporter';
|
|
5
|
+
export { FileManager } from '../features/FileManager';
|
|
6
|
+
export { CircuitBreaker, CircuitBreakerOptions, CircuitBreakerState } from '../core/CircuitBreaker';
|
|
7
|
+
export { RateLimiter } from '../core/RateLimiter';
|
|
8
|
+
export { SchemaMapper } from '../core/SchemaMapper';
|
|
9
|
+
export { ResultParser } from '../client/ResultParser';
|
|
10
|
+
export { MikrotikCollection } from '../utils/MikrotikCollection';
|
|
11
|
+
export * from '../utils/Helpers';
|
|
12
|
+
export { SocketClient, SocketClientOptions } from '../core/SocketClient';
|
|
13
|
+
export { RosProtocol } from '../core/RosProtocol';
|
|
14
|
+
export { Auth } from '../core/Auth';
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
exports.Auth = exports.RosProtocol = exports.SocketClient = exports.MikrotikCollection = exports.ResultParser = exports.SchemaMapper = exports.RateLimiter = exports.CircuitBreakerState = exports.CircuitBreaker = exports.FileManager = exports.MetricType = exports.PrometheusExporter = exports.CommandBuilder = exports.MikrotikPool = exports.MikrotikClient = void 0;
|
|
18
|
+
var MikrotikClient_1 = require("../client/MikrotikClient");
|
|
19
|
+
Object.defineProperty(exports, "MikrotikClient", { enumerable: true, get: function () { return MikrotikClient_1.MikrotikClient; } });
|
|
20
|
+
var MikrotikPool_1 = require("../client/MikrotikPool");
|
|
21
|
+
Object.defineProperty(exports, "MikrotikPool", { enumerable: true, get: function () { return MikrotikPool_1.MikrotikPool; } });
|
|
22
|
+
var CommandBuilder_1 = require("../client/CommandBuilder");
|
|
23
|
+
Object.defineProperty(exports, "CommandBuilder", { enumerable: true, get: function () { return CommandBuilder_1.CommandBuilder; } });
|
|
24
|
+
var PrometheusExporter_1 = require("../features/PrometheusExporter");
|
|
25
|
+
Object.defineProperty(exports, "PrometheusExporter", { enumerable: true, get: function () { return PrometheusExporter_1.PrometheusExporter; } });
|
|
26
|
+
Object.defineProperty(exports, "MetricType", { enumerable: true, get: function () { return PrometheusExporter_1.MetricType; } });
|
|
27
|
+
var FileManager_1 = require("../features/FileManager");
|
|
28
|
+
Object.defineProperty(exports, "FileManager", { enumerable: true, get: function () { return FileManager_1.FileManager; } });
|
|
29
|
+
var CircuitBreaker_1 = require("../core/CircuitBreaker");
|
|
30
|
+
Object.defineProperty(exports, "CircuitBreaker", { enumerable: true, get: function () { return CircuitBreaker_1.CircuitBreaker; } });
|
|
31
|
+
Object.defineProperty(exports, "CircuitBreakerState", { enumerable: true, get: function () { return CircuitBreaker_1.CircuitBreakerState; } });
|
|
32
|
+
var RateLimiter_1 = require("../core/RateLimiter");
|
|
33
|
+
Object.defineProperty(exports, "RateLimiter", { enumerable: true, get: function () { return RateLimiter_1.RateLimiter; } });
|
|
34
|
+
var SchemaMapper_1 = require("../core/SchemaMapper");
|
|
35
|
+
Object.defineProperty(exports, "SchemaMapper", { enumerable: true, get: function () { return SchemaMapper_1.SchemaMapper; } });
|
|
36
|
+
var ResultParser_1 = require("../client/ResultParser");
|
|
37
|
+
Object.defineProperty(exports, "ResultParser", { enumerable: true, get: function () { return ResultParser_1.ResultParser; } });
|
|
38
|
+
var MikrotikCollection_1 = require("../utils/MikrotikCollection");
|
|
39
|
+
Object.defineProperty(exports, "MikrotikCollection", { enumerable: true, get: function () { return MikrotikCollection_1.MikrotikCollection; } });
|
|
40
|
+
__exportStar(require("../utils/Helpers"), exports);
|
|
41
|
+
var SocketClient_1 = require("../core/SocketClient");
|
|
42
|
+
Object.defineProperty(exports, "SocketClient", { enumerable: true, get: function () { return SocketClient_1.SocketClient; } });
|
|
43
|
+
var RosProtocol_1 = require("../core/RosProtocol");
|
|
44
|
+
Object.defineProperty(exports, "RosProtocol", { enumerable: true, get: function () { return RosProtocol_1.RosProtocol; } });
|
|
45
|
+
var Auth_1 = require("../core/Auth");
|
|
46
|
+
Object.defineProperty(exports, "Auth", { enumerable: true, get: function () { return Auth_1.Auth; } });
|
|
47
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAQA,2DAAyF;AAAhF,gHAAA,cAAc,OAAA;AACvB,uDAAmE;AAA1D,4GAAA,YAAY,OAAA;AACrB,2DAA0D;AAAjD,gHAAA,cAAc,OAAA;AAMvB,qEAAkG;AAAzF,wHAAA,kBAAkB,OAAA;AAAoB,gHAAA,UAAU,OAAA;AAGzD,uDAAsD;AAA7C,0GAAA,WAAW,OAAA;AAMpB,yDAAoG;AAA3F,gHAAA,cAAc,OAAA;AAAyB,qHAAA,mBAAmB,OAAA;AAGnE,mDAAkD;AAAzC,0GAAA,WAAW,OAAA;AAGpB,qDAAoD;AAA3C,4GAAA,YAAY,OAAA;AAKrB,uDAAsD;AAA7C,4GAAA,YAAY,OAAA;AACrB,kEAAiE;AAAxD,wHAAA,kBAAkB,OAAA;AAC3B,mDAAiC;AAKjC,qDAAyE;AAAhE,4GAAA,YAAY,OAAA;AACrB,mDAAkD;AAAzC,0GAAA,WAAW,OAAA;AACpB,qCAAoC;AAA3B,4FAAA,IAAI,OAAA"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.kebabToCamel = kebabToCamel;
|
|
4
|
+
exports.camelToKebab = camelToKebab;
|
|
5
|
+
exports.isNumeric = isNumeric;
|
|
6
|
+
exports.parseBoolean = parseBoolean;
|
|
7
|
+
function kebabToCamel(str) {
|
|
8
|
+
return str.replace(/-./g, (x) => x[1].toUpperCase());
|
|
9
|
+
}
|
|
10
|
+
function camelToKebab(str) {
|
|
11
|
+
return str.replace(/[A-Z]/g, (x) => `-${x.toLowerCase()}`);
|
|
12
|
+
}
|
|
13
|
+
function isNumeric(str) {
|
|
14
|
+
if (typeof str !== "string")
|
|
15
|
+
return false;
|
|
16
|
+
return !isNaN(parseFloat(str)) && isFinite(Number(str));
|
|
17
|
+
}
|
|
18
|
+
function parseBoolean(value) {
|
|
19
|
+
if (value === 'true' || value === 'yes')
|
|
20
|
+
return true;
|
|
21
|
+
if (value === 'false' || value === 'no')
|
|
22
|
+
return false;
|
|
23
|
+
return null;
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=Helpers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Helpers.js","sourceRoot":"","sources":["../../src/utils/Helpers.ts"],"names":[],"mappings":";;AAQA,oCAEC;AAKD,oCAEC;AAKD,8BAGC;AAKD,oCAIC;AA1BD,SAAgB,YAAY,CAAC,GAAW;IACpC,OAAO,GAAG,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC;AACzD,CAAC;AAKD,SAAgB,YAAY,CAAC,GAAW;IACpC,OAAO,GAAG,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;AAC/D,CAAC;AAKD,SAAgB,SAAS,CAAC,GAAW;IACjC,IAAI,OAAO,GAAG,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IAC1C,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,IAAI,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;AAC5D,CAAC;AAKD,SAAgB,YAAY,CAAC,KAAa;IACtC,IAAI,KAAK,KAAK,MAAM,IAAI,KAAK,KAAK,KAAK;QAAE,OAAO,IAAI,CAAC;IACrD,IAAI,KAAK,KAAK,OAAO,IAAI,KAAK,KAAK,IAAI;QAAE,OAAO,KAAK,CAAC;IACtD,OAAO,IAAI,CAAC;AAChB,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export declare class MikrotikCollection<T extends Record<string, any>> {
|
|
2
|
+
private readonly _items;
|
|
3
|
+
constructor(items: T[]);
|
|
4
|
+
all(): T[];
|
|
5
|
+
first(): T | null;
|
|
6
|
+
last(): T | null;
|
|
7
|
+
count(): number;
|
|
8
|
+
keyBy(key: keyof T): Map<string, T>;
|
|
9
|
+
groupBy(key: keyof T): Map<string, MikrotikCollection<T>>;
|
|
10
|
+
sortBy(key: keyof T, direction?: 'asc' | 'desc'): this;
|
|
11
|
+
sortByIp(key: keyof T, direction?: 'asc' | 'desc'): this;
|
|
12
|
+
filter(predicate: (item: T) => boolean): MikrotikCollection<T>;
|
|
13
|
+
private ipToLong;
|
|
14
|
+
}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.MikrotikCollection = void 0;
|
|
4
|
+
class MikrotikCollection {
|
|
5
|
+
constructor(items) {
|
|
6
|
+
this._items = items;
|
|
7
|
+
}
|
|
8
|
+
all() {
|
|
9
|
+
return this._items;
|
|
10
|
+
}
|
|
11
|
+
first() {
|
|
12
|
+
return this._items.length > 0 ? this._items[0] : null;
|
|
13
|
+
}
|
|
14
|
+
last() {
|
|
15
|
+
return this._items.length > 0 ? this._items[this._items.length - 1] : null;
|
|
16
|
+
}
|
|
17
|
+
count() {
|
|
18
|
+
return this._items.length;
|
|
19
|
+
}
|
|
20
|
+
keyBy(key) {
|
|
21
|
+
const map = new Map();
|
|
22
|
+
for (const item of this._items) {
|
|
23
|
+
const val = String(item[key]);
|
|
24
|
+
map.set(val, item);
|
|
25
|
+
}
|
|
26
|
+
return map;
|
|
27
|
+
}
|
|
28
|
+
groupBy(key) {
|
|
29
|
+
const map = new Map();
|
|
30
|
+
for (const item of this._items) {
|
|
31
|
+
const groupValue = String(item[key]);
|
|
32
|
+
if (!map.has(groupValue)) {
|
|
33
|
+
map.set(groupValue, []);
|
|
34
|
+
}
|
|
35
|
+
map.get(groupValue).push(item);
|
|
36
|
+
}
|
|
37
|
+
const collectionMap = new Map();
|
|
38
|
+
for (const [k, v] of map) {
|
|
39
|
+
collectionMap.set(k, new MikrotikCollection(v));
|
|
40
|
+
}
|
|
41
|
+
return collectionMap;
|
|
42
|
+
}
|
|
43
|
+
sortBy(key, direction = 'asc') {
|
|
44
|
+
this._items.sort((a, b) => {
|
|
45
|
+
const valA = a[key];
|
|
46
|
+
const valB = b[key];
|
|
47
|
+
if (typeof valA === 'number' && typeof valB === 'number') {
|
|
48
|
+
return direction === 'asc' ? valA - valB : valB - valA;
|
|
49
|
+
}
|
|
50
|
+
const strA = String(valA).toLowerCase();
|
|
51
|
+
const strB = String(valB).toLowerCase();
|
|
52
|
+
if (strA < strB)
|
|
53
|
+
return direction === 'asc' ? -1 : 1;
|
|
54
|
+
if (strA > strB)
|
|
55
|
+
return direction === 'asc' ? 1 : -1;
|
|
56
|
+
return 0;
|
|
57
|
+
});
|
|
58
|
+
return this;
|
|
59
|
+
}
|
|
60
|
+
sortByIp(key, direction = 'asc') {
|
|
61
|
+
this._items.sort((a, b) => {
|
|
62
|
+
const ipA = String(a[key]);
|
|
63
|
+
const ipB = String(b[key]);
|
|
64
|
+
const numA = this.ipToLong(ipA);
|
|
65
|
+
const numB = this.ipToLong(ipB);
|
|
66
|
+
return direction === 'asc' ? numA - numB : numB - numA;
|
|
67
|
+
});
|
|
68
|
+
return this;
|
|
69
|
+
}
|
|
70
|
+
filter(predicate) {
|
|
71
|
+
return new MikrotikCollection(this._items.filter(predicate));
|
|
72
|
+
}
|
|
73
|
+
ipToLong(ip) {
|
|
74
|
+
const cleanIp = ip.split('/')[0];
|
|
75
|
+
return cleanIp.split('.').reduce((acc, octet) => (acc << 8) + parseInt(octet, 10), 0) >>> 0;
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
exports.MikrotikCollection = MikrotikCollection;
|
|
79
|
+
//# sourceMappingURL=MikrotikCollection.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MikrotikCollection.js","sourceRoot":"","sources":["../../src/utils/MikrotikCollection.ts"],"names":[],"mappings":";;;AAKA,MAAa,kBAAkB;IAG3B,YAAY,KAAU;QAClB,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC;IACxB,CAAC;IAKM,GAAG;QACN,OAAO,IAAI,CAAC,MAAM,CAAC;IACvB,CAAC;IAKM,KAAK;QACR,OAAO,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAC1D,CAAC;IAKM,IAAI;QACP,OAAO,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAC/E,CAAC;IAKM,KAAK;QACR,OAAO,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC;IAC9B,CAAC;IASM,KAAK,CAAC,GAAY;QACrB,MAAM,GAAG,GAAG,IAAI,GAAG,EAAa,CAAC;QACjC,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAE7B,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;YAC9B,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;QACvB,CAAC;QACD,OAAO,GAAG,CAAC;IACf,CAAC;IAQM,OAAO,CAAC,GAAY;QACvB,MAAM,GAAG,GAAG,IAAI,GAAG,EAAe,CAAC;QAEnC,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAC7B,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;YACrC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC;gBACvB,GAAG,CAAC,GAAG,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;YAC5B,CAAC;YACD,GAAG,CAAC,GAAG,CAAC,UAAU,CAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACpC,CAAC;QAGD,MAAM,aAAa,GAAG,IAAI,GAAG,EAAiC,CAAC;QAC/D,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,GAAG,EAAE,CAAC;YACvB,aAAa,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,kBAAkB,CAAC,CAAC,CAAC,CAAC,CAAC;QACpD,CAAC;QAED,OAAO,aAAa,CAAC;IACzB,CAAC;IAQM,MAAM,CAAC,GAAY,EAAE,YAA4B,KAAK;QACzD,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;YACtB,MAAM,IAAI,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;YACpB,MAAM,IAAI,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;YAGpB,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;gBACvD,OAAO,SAAS,KAAK,KAAK,CAAC,CAAC,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,GAAG,IAAI,CAAC;YAC3D,CAAC;YAGD,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,CAAC;YACxC,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,CAAC;YAExC,IAAI,IAAI,GAAG,IAAI;gBAAE,OAAO,SAAS,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YACrD,IAAI,IAAI,GAAG,IAAI;gBAAE,OAAO,SAAS,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YACrD,OAAO,CAAC,CAAC;QACb,CAAC,CAAC,CAAC;QAEH,OAAO,IAAI,CAAC;IAChB,CAAC;IAOM,QAAQ,CAAC,GAAY,EAAE,YAA4B,KAAK;QAC3D,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;YACtB,MAAM,GAAG,GAAG,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;YAC3B,MAAM,GAAG,GAAG,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;YAE3B,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;YAChC,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;YAEhC,OAAO,SAAS,KAAK,KAAK,CAAC,CAAC,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,GAAG,IAAI,CAAC;QAC3D,CAAC,CAAC,CAAC;QACH,OAAO,IAAI,CAAC;IAChB,CAAC;IAMM,MAAM,CAAC,SAA+B;QACzC,OAAO,IAAI,kBAAkB,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC;IACjE,CAAC;IAMO,QAAQ,CAAC,EAAU;QACvB,MAAM,OAAO,GAAG,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QACjC,OAAO,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,QAAQ,CAAC,KAAK,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC;IAChG,CAAC;CACJ;AA5ID,gDA4IC"}
|
package/package.json
ADDED
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "rosinterface",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "High-performance, Offline-First Mikrotik RouterOS API Client for Enterprise.",
|
|
5
|
+
"main": "dist/index.js",
|
|
6
|
+
"types": "dist/index.d.ts",
|
|
7
|
+
"author": "IVMEX",
|
|
8
|
+
"license": "MIT",
|
|
9
|
+
"keywords": [
|
|
10
|
+
"mikrotik",
|
|
11
|
+
"routeros",
|
|
12
|
+
"api",
|
|
13
|
+
"client",
|
|
14
|
+
"isp",
|
|
15
|
+
"rosinterface",
|
|
16
|
+
"winbox",
|
|
17
|
+
"automation",
|
|
18
|
+
"offline-first",
|
|
19
|
+
"pooling"
|
|
20
|
+
],
|
|
21
|
+
"files": [
|
|
22
|
+
"dist",
|
|
23
|
+
"README.md",
|
|
24
|
+
"LICENSE"
|
|
25
|
+
],
|
|
26
|
+
"scripts": {
|
|
27
|
+
"build": "tsc",
|
|
28
|
+
"prepublishOnly": "npm run build",
|
|
29
|
+
"test": "ts-node test_integration.ts"
|
|
30
|
+
},
|
|
31
|
+
"dependencies": {
|
|
32
|
+
"dotenv": "^16.4.5"
|
|
33
|
+
},
|
|
34
|
+
"devDependencies": {
|
|
35
|
+
"@types/node": "^20.12.7",
|
|
36
|
+
"ts-node": "^10.9.2",
|
|
37
|
+
"typescript": "^5.4.5"
|
|
38
|
+
},
|
|
39
|
+
"engines": {
|
|
40
|
+
"node": ">=14.0.0"
|
|
41
|
+
}
|
|
42
|
+
}
|