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.
Files changed (52) hide show
  1. package/dist/client/CommandBuilder.d.ts +32 -0
  2. package/dist/client/CommandBuilder.js +168 -0
  3. package/dist/client/CommandBuilder.js.map +1 -0
  4. package/dist/client/MikrotikClient.d.ts +43 -0
  5. package/dist/client/MikrotikClient.js +276 -0
  6. package/dist/client/MikrotikClient.js.map +1 -0
  7. package/dist/client/MikrotikPool.d.ts +18 -0
  8. package/dist/client/MikrotikPool.js +55 -0
  9. package/dist/client/MikrotikPool.js.map +1 -0
  10. package/dist/client/ResultParser.d.ts +5 -0
  11. package/dist/client/ResultParser.js +30 -0
  12. package/dist/client/ResultParser.js.map +1 -0
  13. package/dist/core/Auth.d.ts +5 -0
  14. package/dist/core/Auth.js +87 -0
  15. package/dist/core/Auth.js.map +1 -0
  16. package/dist/core/CircuitBreaker.d.ts +23 -0
  17. package/dist/core/CircuitBreaker.js +64 -0
  18. package/dist/core/CircuitBreaker.js.map +1 -0
  19. package/dist/core/OfflineQueue.d.ts +13 -0
  20. package/dist/core/OfflineQueue.js +25 -0
  21. package/dist/core/OfflineQueue.js.map +1 -0
  22. package/dist/core/RateLimiter.d.ts +17 -0
  23. package/dist/core/RateLimiter.js +65 -0
  24. package/dist/core/RateLimiter.js.map +1 -0
  25. package/dist/core/RosProtocol.d.ts +7 -0
  26. package/dist/core/RosProtocol.js +80 -0
  27. package/dist/core/RosProtocol.js.map +1 -0
  28. package/dist/core/SchemaMapper.d.ts +14 -0
  29. package/dist/core/SchemaMapper.js +65 -0
  30. package/dist/core/SchemaMapper.js.map +1 -0
  31. package/dist/core/SocketClient.d.ts +22 -0
  32. package/dist/core/SocketClient.js +160 -0
  33. package/dist/core/SocketClient.js.map +1 -0
  34. package/dist/features/FileManager.d.ts +8 -0
  35. package/dist/features/FileManager.js +41 -0
  36. package/dist/features/FileManager.js.map +1 -0
  37. package/dist/features/PrometheusExporter.d.ts +15 -0
  38. package/dist/features/PrometheusExporter.js +38 -0
  39. package/dist/features/PrometheusExporter.js.map +1 -0
  40. package/dist/index.d.ts +11 -0
  41. package/dist/index.js +41 -0
  42. package/dist/index.js.map +1 -0
  43. package/dist/types/index.d.ts +14 -0
  44. package/dist/types/index.js +47 -0
  45. package/dist/types/index.js.map +1 -0
  46. package/dist/utils/Helpers.d.ts +4 -0
  47. package/dist/utils/Helpers.js +25 -0
  48. package/dist/utils/Helpers.js.map +1 -0
  49. package/dist/utils/MikrotikCollection.d.ts +14 -0
  50. package/dist/utils/MikrotikCollection.js +79 -0
  51. package/dist/utils/MikrotikCollection.js.map +1 -0
  52. package/package.json +42 -0
@@ -0,0 +1,32 @@
1
+ import { MikrotikClient, Subscription } from './MikrotikClient';
2
+ import { MikrotikCollection } from '../utils/MikrotikCollection';
3
+ export declare class CommandBuilder<T extends Record<string, any>> {
4
+ private readonly client;
5
+ private readonly menuPath;
6
+ private queryParams;
7
+ private propList;
8
+ private isPersistentRequest;
9
+ private static queryCache;
10
+ private static readonly CACHE_TTL_MS;
11
+ constructor(client: MikrotikClient, menuPath: string);
12
+ where(key: string, value: string | number | boolean): this;
13
+ whereExists(key: string): this;
14
+ select(fields: string[]): this;
15
+ persistent(): this;
16
+ findBy(criteria: Partial<T>): Promise<MikrotikCollection<T>>;
17
+ findOne(criteria: Partial<T>): Promise<T | null>;
18
+ print(extraParams?: Record<string, any>): Promise<MikrotikCollection<T>>;
19
+ private pruneCache;
20
+ first(): Promise<T | null>;
21
+ add(data: Partial<T>): Promise<string>;
22
+ set(id: string, data: Partial<T>): Promise<void>;
23
+ remove(id: string | string[]): Promise<void>;
24
+ listen(callback: (item: T) => void): Subscription;
25
+ listenMonitor(callback: (item: T) => void): Subscription;
26
+ private invalidatePathCache;
27
+ private shouldDefer;
28
+ private isClientConnected;
29
+ private getParams;
30
+ private formatValue;
31
+ private prepareParams;
32
+ }
@@ -0,0 +1,168 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.CommandBuilder = void 0;
4
+ const Helpers_1 = require("../utils/Helpers");
5
+ const MikrotikCollection_1 = require("../utils/MikrotikCollection");
6
+ const OfflineQueue_1 = require("../core/OfflineQueue");
7
+ class CommandBuilder {
8
+ constructor(client, menuPath) {
9
+ this.queryParams = {};
10
+ this.propList = [];
11
+ this.isPersistentRequest = false;
12
+ this.client = client;
13
+ this.menuPath = menuPath.startsWith('/') ? menuPath : '/' + menuPath;
14
+ if (this.menuPath.endsWith('/') && this.menuPath.length > 1) {
15
+ this.menuPath = this.menuPath.slice(0, -1);
16
+ }
17
+ }
18
+ where(key, value) {
19
+ const kebabKey = (0, Helpers_1.camelToKebab)(key);
20
+ const formattedValue = this.formatValue(value);
21
+ this.queryParams[`?${kebabKey}`] = formattedValue;
22
+ return this;
23
+ }
24
+ whereExists(key) {
25
+ const kebabKey = (0, Helpers_1.camelToKebab)(key);
26
+ this.queryParams[`?${kebabKey}`] = '';
27
+ return this;
28
+ }
29
+ select(fields) {
30
+ const kebabFields = fields.map(f => (0, Helpers_1.camelToKebab)(f));
31
+ this.propList.push(...kebabFields);
32
+ return this;
33
+ }
34
+ persistent() {
35
+ this.isPersistentRequest = true;
36
+ return this;
37
+ }
38
+ async findBy(criteria) {
39
+ for (const [key, value] of Object.entries(criteria)) {
40
+ this.where(key, value);
41
+ }
42
+ return this.print();
43
+ }
44
+ async findOne(criteria) {
45
+ const collection = await this.findBy(criteria);
46
+ return collection.first();
47
+ }
48
+ async print(extraParams) {
49
+ const fluentParams = this.getParams();
50
+ const finalParams = { ...fluentParams, ...extraParams };
51
+ const host = this.client.options?.host || 'default';
52
+ const cacheKey = `${host}:${this.menuPath}:${JSON.stringify(finalParams)}`;
53
+ const cached = CommandBuilder.queryCache.get(cacheKey);
54
+ if (cached && Date.now() < cached.expires) {
55
+ return new MikrotikCollection_1.MikrotikCollection(cached.data);
56
+ }
57
+ const rawData = await this.client.write(`${this.menuPath}/print`, finalParams);
58
+ CommandBuilder.queryCache.set(cacheKey, {
59
+ data: rawData,
60
+ expires: Date.now() + CommandBuilder.CACHE_TTL_MS
61
+ });
62
+ if (Math.random() > 0.95)
63
+ this.pruneCache();
64
+ return new MikrotikCollection_1.MikrotikCollection(rawData);
65
+ }
66
+ pruneCache() {
67
+ const now = Date.now();
68
+ for (const [key, val] of CommandBuilder.queryCache.entries()) {
69
+ if (now > val.expires)
70
+ CommandBuilder.queryCache.delete(key);
71
+ }
72
+ }
73
+ async first() {
74
+ const collection = await this.print();
75
+ return collection.first();
76
+ }
77
+ async add(data) {
78
+ const params = this.prepareParams(data);
79
+ if (this.shouldDefer()) {
80
+ OfflineQueue_1.OfflineQueue.enqueue({ action: 'add', path: this.menuPath, params: params });
81
+ return 'QUEUED_OFFLINE';
82
+ }
83
+ const response = await this.client.write(`${this.menuPath}/add`, params);
84
+ this.invalidatePathCache();
85
+ const retItem = response.find(r => r.ret);
86
+ return retItem ? retItem.ret : '';
87
+ }
88
+ async set(id, data) {
89
+ const params = this.prepareParams(data);
90
+ params['.id'] = id;
91
+ if (this.shouldDefer()) {
92
+ OfflineQueue_1.OfflineQueue.enqueue({ action: 'set', path: this.menuPath, params: params });
93
+ return;
94
+ }
95
+ await this.client.write(`${this.menuPath}/set`, params);
96
+ this.invalidatePathCache();
97
+ }
98
+ async remove(id) {
99
+ const ids = Array.isArray(id) ? id.join(',') : id;
100
+ const params = { '.id': ids };
101
+ if (this.shouldDefer()) {
102
+ OfflineQueue_1.OfflineQueue.enqueue({ action: 'remove', path: this.menuPath, params: params });
103
+ return;
104
+ }
105
+ await this.client.write(`${this.menuPath}/remove`, params);
106
+ this.invalidatePathCache();
107
+ }
108
+ listen(callback) {
109
+ const params = this.getParams();
110
+ return this.client.stream(`${this.menuPath}/print`, params, callback);
111
+ }
112
+ listenMonitor(callback) {
113
+ const rawParams = this.getParams();
114
+ const actionParams = {};
115
+ for (const [key, value] of Object.entries(rawParams)) {
116
+ const cleanKey = key.startsWith('?') ? key.substring(1) : key;
117
+ actionParams[cleanKey] = value;
118
+ }
119
+ let cmd = this.menuPath;
120
+ if (!cmd.endsWith('monitor-traffic') && !cmd.endsWith('torch')) {
121
+ cmd = `${cmd}/monitor-traffic`;
122
+ }
123
+ return this.client.stream(cmd, actionParams, callback);
124
+ }
125
+ invalidatePathCache() {
126
+ const host = this.client.options?.host || 'default';
127
+ const prefix = `${host}:${this.menuPath}`;
128
+ for (const key of CommandBuilder.queryCache.keys()) {
129
+ if (key.startsWith(prefix)) {
130
+ CommandBuilder.queryCache.delete(key);
131
+ }
132
+ }
133
+ }
134
+ shouldDefer() {
135
+ if (!this.isPersistentRequest)
136
+ return false;
137
+ return !this.isClientConnected();
138
+ }
139
+ isClientConnected() {
140
+ const socket = this.client['socket'];
141
+ return socket && socket['connected'] === true;
142
+ }
143
+ getParams() {
144
+ const params = { ...this.queryParams };
145
+ if (this.propList.length > 0) {
146
+ params['.proplist'] = this.propList.join(',');
147
+ }
148
+ return params;
149
+ }
150
+ formatValue(value) {
151
+ if (typeof value === 'boolean') {
152
+ return value ? 'yes' : 'no';
153
+ }
154
+ return String(value);
155
+ }
156
+ prepareParams(data) {
157
+ const params = {};
158
+ for (const [key, value] of Object.entries(data)) {
159
+ const kebabKey = (0, Helpers_1.camelToKebab)(key);
160
+ params[kebabKey] = this.formatValue(value);
161
+ }
162
+ return params;
163
+ }
164
+ }
165
+ exports.CommandBuilder = CommandBuilder;
166
+ CommandBuilder.queryCache = new Map();
167
+ CommandBuilder.CACHE_TTL_MS = 5000;
168
+ //# sourceMappingURL=CommandBuilder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CommandBuilder.js","sourceRoot":"","sources":["../../src/client/CommandBuilder.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,43 @@
1
+ import { SocketClientOptions } from "../core/SocketClient";
2
+ import { CommandBuilder } from "./CommandBuilder";
3
+ import { SchemaMapper } from '../core/SchemaMapper';
4
+ import { CircuitBreakerOptions } from '../core/CircuitBreaker';
5
+ import { FileManager } from '../features/FileManager';
6
+ import { MetricDefinition } from '../features/PrometheusExporter';
7
+ export interface MikrotikOptions extends SocketClientOptions {
8
+ user?: string;
9
+ password?: string;
10
+ allowInsecureConfig?: boolean;
11
+ rateLimit?: number;
12
+ circuitBreaker?: CircuitBreakerOptions;
13
+ }
14
+ export interface Subscription {
15
+ stop: () => Promise<void>;
16
+ }
17
+ export declare class MikrotikClient {
18
+ private socket;
19
+ private readonly options;
20
+ private readonly isConfigFromEnv;
21
+ readonly files: FileManager;
22
+ readonly schema: SchemaMapper;
23
+ private rateLimiter;
24
+ private breaker;
25
+ private pendingCommands;
26
+ private currentSentence;
27
+ constructor(options: MikrotikOptions);
28
+ connect(): Promise<void>;
29
+ private printSeriousWarning;
30
+ close(): void;
31
+ command<T extends Record<string, any> = any>(path: string): CommandBuilder<T>;
32
+ getMetrics(path: string, metrics: MetricDefinition[], params?: Record<string, any>): Promise<string>;
33
+ write(command: string, parameters?: Record<string, string | boolean | number>): Promise<any[]>;
34
+ stream(command: string, parameters: Record<string, string | boolean | number> | undefined, callback: (data: any) => void): Subscription;
35
+ private generateTag;
36
+ private buildPayload;
37
+ private sendPayload;
38
+ private login;
39
+ private writeInternal;
40
+ private processIncomingWord;
41
+ private routeSentence;
42
+ private rejectAllCommands;
43
+ }
@@ -0,0 +1,276 @@
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.MikrotikClient = void 0;
37
+ const dotenv = __importStar(require("dotenv"));
38
+ const Auth_1 = require("../core/Auth");
39
+ const SocketClient_1 = require("../core/SocketClient");
40
+ const RosProtocol_1 = require("../core/RosProtocol");
41
+ const ResultParser_1 = require("./ResultParser");
42
+ const CommandBuilder_1 = require("./CommandBuilder");
43
+ const SchemaMapper_1 = require("../core/SchemaMapper");
44
+ const RateLimiter_1 = require("../core/RateLimiter");
45
+ const CircuitBreaker_1 = require("../core/CircuitBreaker");
46
+ const FileManager_1 = require("../features/FileManager");
47
+ const PrometheusExporter_1 = require("../features/PrometheusExporter");
48
+ dotenv.config();
49
+ class MikrotikClient {
50
+ constructor(options) {
51
+ this.isConfigFromEnv = false;
52
+ this.schema = new SchemaMapper_1.SchemaMapper();
53
+ this.pendingCommands = new Map();
54
+ this.currentSentence = {};
55
+ const envHost = process.env.MIKROTIK_HOST;
56
+ const envUser = process.env.MIKROTIK_USER;
57
+ const envPass = process.env.MIKROTIK_PASS;
58
+ const envPort = process.env.MIKROTIK_PORT;
59
+ this.isConfigFromEnv = !!(envHost && envUser && envPass);
60
+ this.options = {
61
+ host: envHost || options.host,
62
+ user: envUser || options.user,
63
+ password: envPass || options.password,
64
+ port: envPort ? Number(envPort) : options.port,
65
+ useTLS: options.useTLS ?? false,
66
+ rejectUnauthorized: options.rejectUnauthorized ?? false,
67
+ allowInsecureConfig: options.allowInsecureConfig ?? false,
68
+ timeout: options.timeout || 10,
69
+ rateLimit: options.rateLimit || 50,
70
+ };
71
+ this.rateLimiter = new RateLimiter_1.RateLimiter(this.options.rateLimit);
72
+ this.breaker = new CircuitBreaker_1.CircuitBreaker(options.circuitBreaker);
73
+ this.files = new FileManager_1.FileManager(this);
74
+ if (!this.isConfigFromEnv && this.options.allowInsecureConfig) {
75
+ this.printSeriousWarning();
76
+ }
77
+ this.socket = new SocketClient_1.SocketClient(this.options);
78
+ this.socket.on('data', (word) => this.processIncomingWord(word));
79
+ this.socket.on('close', () => this.rejectAllCommands(new Error('Connection closed')));
80
+ this.socket.on('error', (err) => this.rejectAllCommands(err));
81
+ }
82
+ async connect() {
83
+ if (!this.isConfigFromEnv && !this.options.allowInsecureConfig) {
84
+ throw new Error('FATAL: Insecure Configuration. Use .env or allowInsecureConfig: true');
85
+ }
86
+ await this.breaker.execute(async () => {
87
+ await this.socket.connect();
88
+ await this.login();
89
+ await this.schema.load(this);
90
+ });
91
+ }
92
+ printSeriousWarning() {
93
+ const border = "=".repeat(60);
94
+ console.warn(`\n\x1b[33m${border}\x1b[0m`);
95
+ console.warn('\x1b[43m\x1b[30m %s \x1b[0m', ' SERIOUS SECURITY ADVISORY ');
96
+ console.warn('\x1b[33m%s\x1b[0m', 'Using hardcoded credentials. Please use .env file.');
97
+ console.warn(`\x1b[33m${border}\x1b[0m\n`);
98
+ }
99
+ close() {
100
+ this.socket.close();
101
+ }
102
+ command(path) {
103
+ const realPath = this.schema.resolve(path);
104
+ return new CommandBuilder_1.CommandBuilder(this, realPath);
105
+ }
106
+ async getMetrics(path, metrics, params) {
107
+ const data = await this.command(path).print(params);
108
+ return PrometheusExporter_1.PrometheusExporter.export(data, metrics);
109
+ }
110
+ async write(command, parameters) {
111
+ return this.breaker.execute(async () => {
112
+ await this.rateLimiter.acquire();
113
+ return new Promise((resolve, reject) => {
114
+ const tag = this.generateTag();
115
+ const payload = this.buildPayload(command, parameters, tag);
116
+ this.pendingCommands.set(tag, {
117
+ resolve,
118
+ reject,
119
+ data: [],
120
+ isStream: false,
121
+ startTime: Date.now()
122
+ });
123
+ this.sendPayload(payload);
124
+ });
125
+ });
126
+ }
127
+ stream(command, parameters, callback) {
128
+ const tag = this.generateTag();
129
+ this.rateLimiter.acquire().then(() => {
130
+ const payload = this.buildPayload(command, parameters, tag);
131
+ this.pendingCommands.set(tag, {
132
+ reject: (err) => console.error(`Stream error [${tag}]:`, err),
133
+ data: [],
134
+ isStream: true,
135
+ onData: callback,
136
+ startTime: Date.now()
137
+ });
138
+ this.sendPayload(payload);
139
+ });
140
+ return {
141
+ stop: async () => {
142
+ await this.writeInternal('/cancel', { 'tag': tag });
143
+ }
144
+ };
145
+ }
146
+ generateTag() {
147
+ return 't' + Math.random().toString(36).substring(2, 9);
148
+ }
149
+ buildPayload(command, params, tag) {
150
+ const payload = [command];
151
+ if (params) {
152
+ for (const [key, value] of Object.entries(params)) {
153
+ const prefix = key.startsWith('?') ? '' : '=';
154
+ payload.push(`${prefix}${key}=${value}`);
155
+ }
156
+ }
157
+ payload.push(`.tag=${tag}`);
158
+ return payload;
159
+ }
160
+ sendPayload(payload) {
161
+ for (const word of payload) {
162
+ this.socket.write(RosProtocol_1.RosProtocol.encodeSentence(word));
163
+ }
164
+ this.socket.write(RosProtocol_1.RosProtocol.encodeSentence(''));
165
+ }
166
+ async login() {
167
+ return new Promise(async (resolve, reject) => {
168
+ try {
169
+ const response = await this.writeInternal('/login', {
170
+ name: this.options.user || '',
171
+ password: this.options.password || ''
172
+ });
173
+ const lastMsg = response[response.length - 1] || {};
174
+ if (lastMsg['ret']) {
175
+ const challenge = lastMsg['ret'];
176
+ const md5Response = Auth_1.Auth.calculateLegacyMD5(this.options.password || '', challenge);
177
+ await this.writeInternal('/login', {
178
+ name: this.options.user || '',
179
+ response: md5Response
180
+ });
181
+ }
182
+ resolve();
183
+ }
184
+ catch (error) {
185
+ reject(error);
186
+ }
187
+ });
188
+ }
189
+ writeInternal(command, parameters) {
190
+ return new Promise((resolve, reject) => {
191
+ const tag = this.generateTag();
192
+ const payload = this.buildPayload(command, parameters, tag);
193
+ this.pendingCommands.set(tag, {
194
+ resolve,
195
+ reject,
196
+ data: [],
197
+ isStream: false,
198
+ startTime: Date.now()
199
+ });
200
+ this.sendPayload(payload);
201
+ });
202
+ }
203
+ processIncomingWord(word) {
204
+ if (word.length === 0) {
205
+ this.routeSentence(this.currentSentence);
206
+ this.currentSentence = {};
207
+ return;
208
+ }
209
+ if (word.startsWith('!'))
210
+ this.currentSentence['!type'] = word;
211
+ else if (word.startsWith('.tag='))
212
+ this.currentSentence['.tag'] = word.substring(5);
213
+ else if (word.startsWith('=')) {
214
+ const parts = word.substring(1).split('=');
215
+ this.currentSentence[parts[0]] = parts.slice(1).join('=');
216
+ }
217
+ else if (word.startsWith('ret=')) {
218
+ this.currentSentence['ret'] = word.substring(4);
219
+ }
220
+ else {
221
+ this.currentSentence[word] = true;
222
+ }
223
+ }
224
+ routeSentence(sentence) {
225
+ const tag = sentence['.tag'];
226
+ const type = sentence['!type'];
227
+ if (!tag || !this.pendingCommands.has(tag))
228
+ return;
229
+ const cmd = this.pendingCommands.get(tag);
230
+ if (type === '!re') {
231
+ const cleanObj = { ...sentence };
232
+ delete cleanObj['!type'];
233
+ delete cleanObj['.tag'];
234
+ if (cmd.isStream && cmd.onData) {
235
+ const parsed = ResultParser_1.ResultParser.parse([cleanObj])[0];
236
+ cmd.onData(parsed);
237
+ }
238
+ else {
239
+ cmd.data.push(cleanObj);
240
+ }
241
+ }
242
+ else if (type === '!done') {
243
+ const duration = Date.now() - cmd.startTime;
244
+ this.rateLimiter.submitFeedback(duration);
245
+ if (!cmd.isStream && cmd.resolve) {
246
+ if (cmd.data.length === 0 && Object.keys(sentence).length > 2) {
247
+ const cleanObj = { ...sentence };
248
+ delete cleanObj['!type'];
249
+ delete cleanObj['.tag'];
250
+ cmd.data.push(cleanObj);
251
+ }
252
+ cmd.resolve(ResultParser_1.ResultParser.parse(cmd.data));
253
+ }
254
+ this.pendingCommands.delete(tag);
255
+ }
256
+ else if (type === '!trap') {
257
+ const duration = Date.now() - cmd.startTime;
258
+ this.rateLimiter.submitFeedback(duration);
259
+ const errorMsg = sentence['message'] || 'Unknown MikroTik Error';
260
+ if (errorMsg.includes('interrupted')) {
261
+ this.pendingCommands.delete(tag);
262
+ return;
263
+ }
264
+ cmd.reject(new Error(errorMsg));
265
+ this.pendingCommands.delete(tag);
266
+ }
267
+ }
268
+ rejectAllCommands(error) {
269
+ for (const [tag, cmd] of this.pendingCommands) {
270
+ cmd.reject(error);
271
+ }
272
+ this.pendingCommands.clear();
273
+ }
274
+ }
275
+ exports.MikrotikClient = MikrotikClient;
276
+ //# sourceMappingURL=MikrotikClient.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MikrotikClient.js","sourceRoot":"","sources":["../../src/client/MikrotikClient.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ import { MikrotikOptions, Subscription } from './MikrotikClient';
2
+ import { CommandBuilder } from './CommandBuilder';
3
+ export interface PoolOptions extends MikrotikOptions {
4
+ poolSize?: number;
5
+ }
6
+ export declare class MikrotikPool {
7
+ private clients;
8
+ private readonly options;
9
+ private nextClientIndex;
10
+ private isConnected;
11
+ constructor(options: PoolOptions);
12
+ connect(): Promise<void>;
13
+ close(): void;
14
+ private getScheduledClient;
15
+ command<T extends Record<string, any> = any>(path: string): CommandBuilder<T>;
16
+ write(command: string, parameters?: Record<string, any>): Promise<any[]>;
17
+ stream(command: string, parameters: Record<string, any> | undefined, callback: (data: any) => void): Subscription;
18
+ }
@@ -0,0 +1,55 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.MikrotikPool = void 0;
4
+ const MikrotikClient_1 = require("./MikrotikClient");
5
+ const CommandBuilder_1 = require("./CommandBuilder");
6
+ class MikrotikPool {
7
+ constructor(options) {
8
+ this.clients = [];
9
+ this.nextClientIndex = 0;
10
+ this.isConnected = false;
11
+ this.options = {
12
+ poolSize: 5,
13
+ ...options
14
+ };
15
+ }
16
+ async connect() {
17
+ if (this.isConnected)
18
+ return;
19
+ console.log(`🚀 Initializing Pool with ${this.options.poolSize} connections...`);
20
+ const connectionPromises = [];
21
+ for (let i = 0; i < (this.options.poolSize || 5); i++) {
22
+ const client = new MikrotikClient_1.MikrotikClient(this.options);
23
+ this.clients.push(client);
24
+ connectionPromises.push(client.connect());
25
+ }
26
+ await Promise.all(connectionPromises);
27
+ this.isConnected = true;
28
+ console.log(`✅ Pool Ready: ${this.clients.length} sockets connected.`);
29
+ }
30
+ close() {
31
+ this.clients.forEach(client => client.close());
32
+ this.isConnected = false;
33
+ this.clients = [];
34
+ }
35
+ getScheduledClient() {
36
+ if (this.clients.length === 0) {
37
+ throw new Error('Pool is not connected. Call connect() first.');
38
+ }
39
+ const client = this.clients[this.nextClientIndex];
40
+ this.nextClientIndex = (this.nextClientIndex + 1) % this.clients.length;
41
+ return client;
42
+ }
43
+ command(path) {
44
+ const selectedClient = this.getScheduledClient();
45
+ return new CommandBuilder_1.CommandBuilder(selectedClient, path);
46
+ }
47
+ write(command, parameters) {
48
+ return this.getScheduledClient().write(command, parameters);
49
+ }
50
+ stream(command, parameters, callback) {
51
+ return this.getScheduledClient().stream(command, parameters, callback);
52
+ }
53
+ }
54
+ exports.MikrotikPool = MikrotikPool;
55
+ //# sourceMappingURL=MikrotikPool.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MikrotikPool.js","sourceRoot":"","sources":["../../src/client/MikrotikPool.ts"],"names":[],"mappings":";;;AAAA,qDAAiF;AACjF,qDAAkD;AAelD,MAAa,YAAY;IAMrB,YAAY,OAAoB;QALxB,YAAO,GAAqB,EAAE,CAAC;QAE/B,oBAAe,GAAW,CAAC,CAAC;QAC5B,gBAAW,GAAY,KAAK,CAAC;QAGjC,IAAI,CAAC,OAAO,GAAG;YACX,QAAQ,EAAE,CAAC;YACX,GAAG,OAAO;SACb,CAAC;IACN,CAAC;IAKM,KAAK,CAAC,OAAO;QAChB,IAAI,IAAI,CAAC,WAAW;YAAE,OAAO;QAE7B,OAAO,CAAC,GAAG,CAAC,6BAA6B,IAAI,CAAC,OAAO,CAAC,QAAQ,iBAAiB,CAAC,CAAC;QAEjF,MAAM,kBAAkB,GAAoB,EAAE,CAAC;QAE/C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;YACpD,MAAM,MAAM,GAAG,IAAI,+BAAc,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAChD,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YAE1B,kBAAkB,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC;QAC9C,CAAC;QAGD,MAAM,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC;QACtC,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;QACxB,OAAO,CAAC,GAAG,CAAC,iBAAiB,IAAI,CAAC,OAAO,CAAC,MAAM,qBAAqB,CAAC,CAAC;IAC3E,CAAC;IAKM,KAAK;QACR,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;QAC/C,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC;QACzB,IAAI,CAAC,OAAO,GAAG,EAAE,CAAC;IACtB,CAAC;IAMO,kBAAkB;QACtB,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC5B,MAAM,IAAI,KAAK,CAAC,8CAA8C,CAAC,CAAC;QACpE,CAAC;QAED,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;QAGlD,IAAI,CAAC,eAAe,GAAG,CAAC,IAAI,CAAC,eAAe,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC;QAExE,OAAO,MAAM,CAAC;IAClB,CAAC;IAMM,OAAO,CAAsC,IAAY;QAE5D,MAAM,cAAc,GAAG,IAAI,CAAC,kBAAkB,EAAE,CAAC;QACjD,OAAO,IAAI,+BAAc,CAAI,cAAc,EAAE,IAAI,CAAC,CAAC;IACvD,CAAC;IAKM,KAAK,CAAC,OAAe,EAAE,UAAgC;QAC1D,OAAO,IAAI,CAAC,kBAAkB,EAAE,CAAC,KAAK,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;IAChE,CAAC;IAMM,MAAM,CACT,OAAe,EACf,UAA2C,EAC3C,QAA6B;QAE7B,OAAO,IAAI,CAAC,kBAAkB,EAAE,CAAC,MAAM,CAAC,OAAO,EAAE,UAAU,EAAE,QAAQ,CAAC,CAAC;IAC3E,CAAC;CACJ;AA1FD,oCA0FC"}
@@ -0,0 +1,5 @@
1
+ export declare class ResultParser {
2
+ static parse(rawData: any[]): any[];
3
+ private static parseItem;
4
+ private static inferType;
5
+ }