@robinpath/cli 1.73.0 → 1.75.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/README.md +111 -111
- package/dist/cli.mjs +344 -301
- package/modules/_helpers.js +33 -33
- package/modules/assert.js +270 -270
- package/modules/buffer.js +245 -245
- package/modules/child.js +176 -176
- package/modules/crypto.js +352 -352
- package/modules/dns.js +146 -146
- package/modules/events.js +174 -174
- package/modules/file.js +361 -361
- package/modules/http.js +268 -268
- package/modules/index.js +76 -76
- package/modules/net.js +189 -189
- package/modules/os.js +219 -219
- package/modules/path.js +162 -162
- package/modules/process.js +214 -214
- package/modules/stream.js +322 -322
- package/modules/string_decoder.js +106 -106
- package/modules/timer.js +167 -167
- package/modules/tls.js +264 -264
- package/modules/tty.js +169 -169
- package/modules/url.js +189 -189
- package/modules/util.js +275 -275
- package/modules/zlib.js +126 -126
- package/package.json +1 -1
package/modules/dns.js
CHANGED
|
@@ -1,146 +1,146 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Native DNS module for RobinPath.
|
|
3
|
-
* DNS resolution and lookup.
|
|
4
|
-
*/
|
|
5
|
-
import { promises as dns } from 'node:dns';
|
|
6
|
-
import { toStr, requireArgs } from './_helpers.js';
|
|
7
|
-
|
|
8
|
-
export const DnsFunctions = {
|
|
9
|
-
|
|
10
|
-
lookup: async (args) => {
|
|
11
|
-
requireArgs('dns.lookup', args, 1);
|
|
12
|
-
const hostname = toStr(args[0]);
|
|
13
|
-
const result = await dns.lookup(hostname, { all: true });
|
|
14
|
-
if (Array.isArray(result)) {
|
|
15
|
-
return result.map(r => ({ address: r.address, family: r.family }));
|
|
16
|
-
}
|
|
17
|
-
return { address: result.address, family: result.family };
|
|
18
|
-
},
|
|
19
|
-
|
|
20
|
-
resolve: async (args) => {
|
|
21
|
-
requireArgs('dns.resolve', args, 1);
|
|
22
|
-
const hostname = toStr(args[0]);
|
|
23
|
-
const rrtype = toStr(args[1], 'A');
|
|
24
|
-
return await dns.resolve(hostname, rrtype);
|
|
25
|
-
},
|
|
26
|
-
|
|
27
|
-
resolve4: async (args) => {
|
|
28
|
-
requireArgs('dns.resolve4', args, 1);
|
|
29
|
-
return await dns.resolve4(toStr(args[0]));
|
|
30
|
-
},
|
|
31
|
-
|
|
32
|
-
resolve6: async (args) => {
|
|
33
|
-
requireArgs('dns.resolve6', args, 1);
|
|
34
|
-
return await dns.resolve6(toStr(args[0]));
|
|
35
|
-
},
|
|
36
|
-
|
|
37
|
-
resolveMx: async (args) => {
|
|
38
|
-
requireArgs('dns.resolveMx', args, 1);
|
|
39
|
-
return await dns.resolveMx(toStr(args[0]));
|
|
40
|
-
},
|
|
41
|
-
|
|
42
|
-
resolveTxt: async (args) => {
|
|
43
|
-
requireArgs('dns.resolveTxt', args, 1);
|
|
44
|
-
const records = await dns.resolveTxt(toStr(args[0]));
|
|
45
|
-
return records.map(r => r.join(''));
|
|
46
|
-
},
|
|
47
|
-
|
|
48
|
-
resolveNs: async (args) => {
|
|
49
|
-
requireArgs('dns.resolveNs', args, 1);
|
|
50
|
-
return await dns.resolveNs(toStr(args[0]));
|
|
51
|
-
},
|
|
52
|
-
|
|
53
|
-
resolveCname: async (args) => {
|
|
54
|
-
requireArgs('dns.resolveCname', args, 1);
|
|
55
|
-
return await dns.resolveCname(toStr(args[0]));
|
|
56
|
-
},
|
|
57
|
-
|
|
58
|
-
resolveSrv: async (args) => {
|
|
59
|
-
requireArgs('dns.resolveSrv', args, 1);
|
|
60
|
-
return await dns.resolveSrv(toStr(args[0]));
|
|
61
|
-
},
|
|
62
|
-
|
|
63
|
-
resolveSoa: async (args) => {
|
|
64
|
-
requireArgs('dns.resolveSoa', args, 1);
|
|
65
|
-
return await dns.resolveSoa(toStr(args[0]));
|
|
66
|
-
},
|
|
67
|
-
|
|
68
|
-
reverse: async (args) => {
|
|
69
|
-
requireArgs('dns.reverse', args, 1);
|
|
70
|
-
return await dns.reverse(toStr(args[0]));
|
|
71
|
-
}
|
|
72
|
-
};
|
|
73
|
-
|
|
74
|
-
export const DnsFunctionMetadata = {
|
|
75
|
-
lookup: {
|
|
76
|
-
description: 'Resolve hostname to IP address(es)',
|
|
77
|
-
parameters: [{ name: 'hostname', dataType: 'string', description: 'Hostname to resolve', formInputType: 'text', required: true }],
|
|
78
|
-
returnType: 'array', returnDescription: 'Array of {address, family}', example: 'dns.lookup "google.com"'
|
|
79
|
-
},
|
|
80
|
-
resolve: {
|
|
81
|
-
description: 'Resolve DNS records by type',
|
|
82
|
-
parameters: [
|
|
83
|
-
{ name: 'hostname', dataType: 'string', description: 'Hostname', formInputType: 'text', required: true },
|
|
84
|
-
{ name: 'rrtype', dataType: 'string', description: 'Record type (A, AAAA, MX, TXT, etc.)', formInputType: 'text', required: false, defaultValue: 'A' }
|
|
85
|
-
],
|
|
86
|
-
returnType: 'array', returnDescription: 'Array of DNS records', example: 'dns.resolve "example.com" "MX"'
|
|
87
|
-
},
|
|
88
|
-
resolve4: {
|
|
89
|
-
description: 'Resolve IPv4 addresses',
|
|
90
|
-
parameters: [{ name: 'hostname', dataType: 'string', description: 'Hostname', formInputType: 'text', required: true }],
|
|
91
|
-
returnType: 'array', returnDescription: 'Array of IPv4 addresses', example: 'dns.resolve4 "google.com"'
|
|
92
|
-
},
|
|
93
|
-
resolve6: {
|
|
94
|
-
description: 'Resolve IPv6 addresses',
|
|
95
|
-
parameters: [{ name: 'hostname', dataType: 'string', description: 'Hostname', formInputType: 'text', required: true }],
|
|
96
|
-
returnType: 'array', returnDescription: 'Array of IPv6 addresses', example: 'dns.resolve6 "google.com"'
|
|
97
|
-
},
|
|
98
|
-
resolveMx: {
|
|
99
|
-
description: 'Resolve MX (mail) records',
|
|
100
|
-
parameters: [{ name: 'hostname', dataType: 'string', description: 'Domain', formInputType: 'text', required: true }],
|
|
101
|
-
returnType: 'array', returnDescription: 'Array of {exchange, priority}', example: 'dns.resolveMx "gmail.com"'
|
|
102
|
-
},
|
|
103
|
-
resolveTxt: {
|
|
104
|
-
description: 'Resolve TXT records',
|
|
105
|
-
parameters: [{ name: 'hostname', dataType: 'string', description: 'Domain', formInputType: 'text', required: true }],
|
|
106
|
-
returnType: 'array', returnDescription: 'Array of TXT record strings', example: 'dns.resolveTxt "example.com"'
|
|
107
|
-
},
|
|
108
|
-
resolveNs: {
|
|
109
|
-
description: 'Resolve NS (nameserver) records',
|
|
110
|
-
parameters: [{ name: 'hostname', dataType: 'string', description: 'Domain', formInputType: 'text', required: true }],
|
|
111
|
-
returnType: 'array', returnDescription: 'Array of nameserver hostnames', example: 'dns.resolveNs "example.com"'
|
|
112
|
-
},
|
|
113
|
-
resolveCname: {
|
|
114
|
-
description: 'Resolve CNAME records',
|
|
115
|
-
parameters: [{ name: 'hostname', dataType: 'string', description: 'Hostname', formInputType: 'text', required: true }],
|
|
116
|
-
returnType: 'array', returnDescription: 'Array of CNAME records', example: 'dns.resolveCname "www.example.com"'
|
|
117
|
-
},
|
|
118
|
-
resolveSrv: {
|
|
119
|
-
description: 'Resolve SRV records',
|
|
120
|
-
parameters: [{ name: 'hostname', dataType: 'string', description: 'Hostname', formInputType: 'text', required: true }],
|
|
121
|
-
returnType: 'array', returnDescription: 'Array of SRV records', example: 'dns.resolveSrv "_http._tcp.example.com"'
|
|
122
|
-
},
|
|
123
|
-
resolveSoa: {
|
|
124
|
-
description: 'Resolve SOA (Start of Authority) record',
|
|
125
|
-
parameters: [{ name: 'hostname', dataType: 'string', description: 'Domain', formInputType: 'text', required: true }],
|
|
126
|
-
returnType: 'object', returnDescription: 'SOA record object', example: 'dns.resolveSoa "example.com"'
|
|
127
|
-
},
|
|
128
|
-
reverse: {
|
|
129
|
-
description: 'Reverse DNS lookup (IP to hostname)',
|
|
130
|
-
parameters: [{ name: 'ip', dataType: 'string', description: 'IP address', formInputType: 'text', required: true }],
|
|
131
|
-
returnType: 'array', returnDescription: 'Array of hostnames', example: 'dns.reverse "8.8.8.8"'
|
|
132
|
-
}
|
|
133
|
-
};
|
|
134
|
-
|
|
135
|
-
export const DnsModuleMetadata = {
|
|
136
|
-
description: 'DNS resolution: lookup, resolve A/AAAA/MX/TXT/NS/SRV/SOA records, reverse lookup',
|
|
137
|
-
methods: Object.keys(DnsFunctions)
|
|
138
|
-
};
|
|
139
|
-
|
|
140
|
-
export default {
|
|
141
|
-
name: 'dns',
|
|
142
|
-
functions: DnsFunctions,
|
|
143
|
-
functionMetadata: DnsFunctionMetadata,
|
|
144
|
-
moduleMetadata: DnsModuleMetadata,
|
|
145
|
-
global: false
|
|
146
|
-
};
|
|
1
|
+
/**
|
|
2
|
+
* Native DNS module for RobinPath.
|
|
3
|
+
* DNS resolution and lookup.
|
|
4
|
+
*/
|
|
5
|
+
import { promises as dns } from 'node:dns';
|
|
6
|
+
import { toStr, requireArgs } from './_helpers.js';
|
|
7
|
+
|
|
8
|
+
export const DnsFunctions = {
|
|
9
|
+
|
|
10
|
+
lookup: async (args) => {
|
|
11
|
+
requireArgs('dns.lookup', args, 1);
|
|
12
|
+
const hostname = toStr(args[0]);
|
|
13
|
+
const result = await dns.lookup(hostname, { all: true });
|
|
14
|
+
if (Array.isArray(result)) {
|
|
15
|
+
return result.map(r => ({ address: r.address, family: r.family }));
|
|
16
|
+
}
|
|
17
|
+
return { address: result.address, family: result.family };
|
|
18
|
+
},
|
|
19
|
+
|
|
20
|
+
resolve: async (args) => {
|
|
21
|
+
requireArgs('dns.resolve', args, 1);
|
|
22
|
+
const hostname = toStr(args[0]);
|
|
23
|
+
const rrtype = toStr(args[1], 'A');
|
|
24
|
+
return await dns.resolve(hostname, rrtype);
|
|
25
|
+
},
|
|
26
|
+
|
|
27
|
+
resolve4: async (args) => {
|
|
28
|
+
requireArgs('dns.resolve4', args, 1);
|
|
29
|
+
return await dns.resolve4(toStr(args[0]));
|
|
30
|
+
},
|
|
31
|
+
|
|
32
|
+
resolve6: async (args) => {
|
|
33
|
+
requireArgs('dns.resolve6', args, 1);
|
|
34
|
+
return await dns.resolve6(toStr(args[0]));
|
|
35
|
+
},
|
|
36
|
+
|
|
37
|
+
resolveMx: async (args) => {
|
|
38
|
+
requireArgs('dns.resolveMx', args, 1);
|
|
39
|
+
return await dns.resolveMx(toStr(args[0]));
|
|
40
|
+
},
|
|
41
|
+
|
|
42
|
+
resolveTxt: async (args) => {
|
|
43
|
+
requireArgs('dns.resolveTxt', args, 1);
|
|
44
|
+
const records = await dns.resolveTxt(toStr(args[0]));
|
|
45
|
+
return records.map(r => r.join(''));
|
|
46
|
+
},
|
|
47
|
+
|
|
48
|
+
resolveNs: async (args) => {
|
|
49
|
+
requireArgs('dns.resolveNs', args, 1);
|
|
50
|
+
return await dns.resolveNs(toStr(args[0]));
|
|
51
|
+
},
|
|
52
|
+
|
|
53
|
+
resolveCname: async (args) => {
|
|
54
|
+
requireArgs('dns.resolveCname', args, 1);
|
|
55
|
+
return await dns.resolveCname(toStr(args[0]));
|
|
56
|
+
},
|
|
57
|
+
|
|
58
|
+
resolveSrv: async (args) => {
|
|
59
|
+
requireArgs('dns.resolveSrv', args, 1);
|
|
60
|
+
return await dns.resolveSrv(toStr(args[0]));
|
|
61
|
+
},
|
|
62
|
+
|
|
63
|
+
resolveSoa: async (args) => {
|
|
64
|
+
requireArgs('dns.resolveSoa', args, 1);
|
|
65
|
+
return await dns.resolveSoa(toStr(args[0]));
|
|
66
|
+
},
|
|
67
|
+
|
|
68
|
+
reverse: async (args) => {
|
|
69
|
+
requireArgs('dns.reverse', args, 1);
|
|
70
|
+
return await dns.reverse(toStr(args[0]));
|
|
71
|
+
}
|
|
72
|
+
};
|
|
73
|
+
|
|
74
|
+
export const DnsFunctionMetadata = {
|
|
75
|
+
lookup: {
|
|
76
|
+
description: 'Resolve hostname to IP address(es)',
|
|
77
|
+
parameters: [{ name: 'hostname', dataType: 'string', description: 'Hostname to resolve', formInputType: 'text', required: true }],
|
|
78
|
+
returnType: 'array', returnDescription: 'Array of {address, family}', example: 'dns.lookup "google.com"'
|
|
79
|
+
},
|
|
80
|
+
resolve: {
|
|
81
|
+
description: 'Resolve DNS records by type',
|
|
82
|
+
parameters: [
|
|
83
|
+
{ name: 'hostname', dataType: 'string', description: 'Hostname', formInputType: 'text', required: true },
|
|
84
|
+
{ name: 'rrtype', dataType: 'string', description: 'Record type (A, AAAA, MX, TXT, etc.)', formInputType: 'text', required: false, defaultValue: 'A' }
|
|
85
|
+
],
|
|
86
|
+
returnType: 'array', returnDescription: 'Array of DNS records', example: 'dns.resolve "example.com" "MX"'
|
|
87
|
+
},
|
|
88
|
+
resolve4: {
|
|
89
|
+
description: 'Resolve IPv4 addresses',
|
|
90
|
+
parameters: [{ name: 'hostname', dataType: 'string', description: 'Hostname', formInputType: 'text', required: true }],
|
|
91
|
+
returnType: 'array', returnDescription: 'Array of IPv4 addresses', example: 'dns.resolve4 "google.com"'
|
|
92
|
+
},
|
|
93
|
+
resolve6: {
|
|
94
|
+
description: 'Resolve IPv6 addresses',
|
|
95
|
+
parameters: [{ name: 'hostname', dataType: 'string', description: 'Hostname', formInputType: 'text', required: true }],
|
|
96
|
+
returnType: 'array', returnDescription: 'Array of IPv6 addresses', example: 'dns.resolve6 "google.com"'
|
|
97
|
+
},
|
|
98
|
+
resolveMx: {
|
|
99
|
+
description: 'Resolve MX (mail) records',
|
|
100
|
+
parameters: [{ name: 'hostname', dataType: 'string', description: 'Domain', formInputType: 'text', required: true }],
|
|
101
|
+
returnType: 'array', returnDescription: 'Array of {exchange, priority}', example: 'dns.resolveMx "gmail.com"'
|
|
102
|
+
},
|
|
103
|
+
resolveTxt: {
|
|
104
|
+
description: 'Resolve TXT records',
|
|
105
|
+
parameters: [{ name: 'hostname', dataType: 'string', description: 'Domain', formInputType: 'text', required: true }],
|
|
106
|
+
returnType: 'array', returnDescription: 'Array of TXT record strings', example: 'dns.resolveTxt "example.com"'
|
|
107
|
+
},
|
|
108
|
+
resolveNs: {
|
|
109
|
+
description: 'Resolve NS (nameserver) records',
|
|
110
|
+
parameters: [{ name: 'hostname', dataType: 'string', description: 'Domain', formInputType: 'text', required: true }],
|
|
111
|
+
returnType: 'array', returnDescription: 'Array of nameserver hostnames', example: 'dns.resolveNs "example.com"'
|
|
112
|
+
},
|
|
113
|
+
resolveCname: {
|
|
114
|
+
description: 'Resolve CNAME records',
|
|
115
|
+
parameters: [{ name: 'hostname', dataType: 'string', description: 'Hostname', formInputType: 'text', required: true }],
|
|
116
|
+
returnType: 'array', returnDescription: 'Array of CNAME records', example: 'dns.resolveCname "www.example.com"'
|
|
117
|
+
},
|
|
118
|
+
resolveSrv: {
|
|
119
|
+
description: 'Resolve SRV records',
|
|
120
|
+
parameters: [{ name: 'hostname', dataType: 'string', description: 'Hostname', formInputType: 'text', required: true }],
|
|
121
|
+
returnType: 'array', returnDescription: 'Array of SRV records', example: 'dns.resolveSrv "_http._tcp.example.com"'
|
|
122
|
+
},
|
|
123
|
+
resolveSoa: {
|
|
124
|
+
description: 'Resolve SOA (Start of Authority) record',
|
|
125
|
+
parameters: [{ name: 'hostname', dataType: 'string', description: 'Domain', formInputType: 'text', required: true }],
|
|
126
|
+
returnType: 'object', returnDescription: 'SOA record object', example: 'dns.resolveSoa "example.com"'
|
|
127
|
+
},
|
|
128
|
+
reverse: {
|
|
129
|
+
description: 'Reverse DNS lookup (IP to hostname)',
|
|
130
|
+
parameters: [{ name: 'ip', dataType: 'string', description: 'IP address', formInputType: 'text', required: true }],
|
|
131
|
+
returnType: 'array', returnDescription: 'Array of hostnames', example: 'dns.reverse "8.8.8.8"'
|
|
132
|
+
}
|
|
133
|
+
};
|
|
134
|
+
|
|
135
|
+
export const DnsModuleMetadata = {
|
|
136
|
+
description: 'DNS resolution: lookup, resolve A/AAAA/MX/TXT/NS/SRV/SOA records, reverse lookup',
|
|
137
|
+
methods: Object.keys(DnsFunctions)
|
|
138
|
+
};
|
|
139
|
+
|
|
140
|
+
export default {
|
|
141
|
+
name: 'dns',
|
|
142
|
+
functions: DnsFunctions,
|
|
143
|
+
functionMetadata: DnsFunctionMetadata,
|
|
144
|
+
moduleMetadata: DnsModuleMetadata,
|
|
145
|
+
global: false
|
|
146
|
+
};
|
package/modules/events.js
CHANGED
|
@@ -1,174 +1,174 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Native events module for RobinPath.
|
|
3
|
-
* EventEmitter pattern for pub/sub communication.
|
|
4
|
-
*/
|
|
5
|
-
import { EventEmitter } from 'node:events';
|
|
6
|
-
import { toStr, requireArgs } from './_helpers.js';
|
|
7
|
-
|
|
8
|
-
const _emitters = new Map();
|
|
9
|
-
let _nextId = 1;
|
|
10
|
-
|
|
11
|
-
export const EventsFunctions = {
|
|
12
|
-
|
|
13
|
-
create: () => {
|
|
14
|
-
const id = `emitter_${_nextId++}`;
|
|
15
|
-
_emitters.set(id, new EventEmitter());
|
|
16
|
-
return id;
|
|
17
|
-
},
|
|
18
|
-
|
|
19
|
-
on: (args, callback) => {
|
|
20
|
-
requireArgs('events.on', args, 2);
|
|
21
|
-
const id = toStr(args[0]);
|
|
22
|
-
const event = toStr(args[1]);
|
|
23
|
-
const emitter = _emitters.get(id);
|
|
24
|
-
if (!emitter) throw new Error(`events.on: emitter ${id} not found`);
|
|
25
|
-
if (callback) {
|
|
26
|
-
emitter.on(event, (...eventArgs) => callback(eventArgs));
|
|
27
|
-
}
|
|
28
|
-
return true;
|
|
29
|
-
},
|
|
30
|
-
|
|
31
|
-
once: (args, callback) => {
|
|
32
|
-
requireArgs('events.once', args, 2);
|
|
33
|
-
const id = toStr(args[0]);
|
|
34
|
-
const event = toStr(args[1]);
|
|
35
|
-
const emitter = _emitters.get(id);
|
|
36
|
-
if (!emitter) throw new Error(`events.once: emitter ${id} not found`);
|
|
37
|
-
if (callback) {
|
|
38
|
-
emitter.once(event, (...eventArgs) => callback(eventArgs));
|
|
39
|
-
}
|
|
40
|
-
return true;
|
|
41
|
-
},
|
|
42
|
-
|
|
43
|
-
emit: (args) => {
|
|
44
|
-
requireArgs('events.emit', args, 2);
|
|
45
|
-
const id = toStr(args[0]);
|
|
46
|
-
const event = toStr(args[1]);
|
|
47
|
-
const emitter = _emitters.get(id);
|
|
48
|
-
if (!emitter) throw new Error(`events.emit: emitter ${id} not found`);
|
|
49
|
-
return emitter.emit(event, ...args.slice(2));
|
|
50
|
-
},
|
|
51
|
-
|
|
52
|
-
off: (args) => {
|
|
53
|
-
requireArgs('events.off', args, 2);
|
|
54
|
-
const id = toStr(args[0]);
|
|
55
|
-
const event = toStr(args[1]);
|
|
56
|
-
const emitter = _emitters.get(id);
|
|
57
|
-
if (!emitter) throw new Error(`events.off: emitter ${id} not found`);
|
|
58
|
-
emitter.removeAllListeners(event);
|
|
59
|
-
return true;
|
|
60
|
-
},
|
|
61
|
-
|
|
62
|
-
listeners: (args) => {
|
|
63
|
-
requireArgs('events.listeners', args, 2);
|
|
64
|
-
const id = toStr(args[0]);
|
|
65
|
-
const event = toStr(args[1]);
|
|
66
|
-
const emitter = _emitters.get(id);
|
|
67
|
-
if (!emitter) throw new Error(`events.listeners: emitter ${id} not found`);
|
|
68
|
-
return emitter.listenerCount(event);
|
|
69
|
-
},
|
|
70
|
-
|
|
71
|
-
eventNames: (args) => {
|
|
72
|
-
requireArgs('events.eventNames', args, 1);
|
|
73
|
-
const id = toStr(args[0]);
|
|
74
|
-
const emitter = _emitters.get(id);
|
|
75
|
-
if (!emitter) throw new Error(`events.eventNames: emitter ${id} not found`);
|
|
76
|
-
return emitter.eventNames();
|
|
77
|
-
},
|
|
78
|
-
|
|
79
|
-
removeAll: (args) => {
|
|
80
|
-
requireArgs('events.removeAll', args, 1);
|
|
81
|
-
const id = toStr(args[0]);
|
|
82
|
-
const emitter = _emitters.get(id);
|
|
83
|
-
if (!emitter) throw new Error(`events.removeAll: emitter ${id} not found`);
|
|
84
|
-
emitter.removeAllListeners();
|
|
85
|
-
return true;
|
|
86
|
-
},
|
|
87
|
-
|
|
88
|
-
destroy: (args) => {
|
|
89
|
-
requireArgs('events.destroy', args, 1);
|
|
90
|
-
const id = toStr(args[0]);
|
|
91
|
-
const emitter = _emitters.get(id);
|
|
92
|
-
if (emitter) {
|
|
93
|
-
emitter.removeAllListeners();
|
|
94
|
-
_emitters.delete(id);
|
|
95
|
-
return true;
|
|
96
|
-
}
|
|
97
|
-
return false;
|
|
98
|
-
},
|
|
99
|
-
|
|
100
|
-
list: () => Array.from(_emitters.keys())
|
|
101
|
-
};
|
|
102
|
-
|
|
103
|
-
export const EventsFunctionMetadata = {
|
|
104
|
-
create: { description: 'Create a new event emitter', parameters: [], returnType: 'string', returnDescription: 'Emitter handle ID', example: 'events.create' },
|
|
105
|
-
on: {
|
|
106
|
-
description: 'Listen for an event',
|
|
107
|
-
parameters: [
|
|
108
|
-
{ name: 'emitterId', dataType: 'string', description: 'Emitter handle', formInputType: 'text', required: true },
|
|
109
|
-
{ name: 'event', dataType: 'string', description: 'Event name', formInputType: 'text', required: true }
|
|
110
|
-
],
|
|
111
|
-
returnType: 'boolean', returnDescription: 'true', example: 'events.on $emitter "data"'
|
|
112
|
-
},
|
|
113
|
-
once: {
|
|
114
|
-
description: 'Listen for an event once',
|
|
115
|
-
parameters: [
|
|
116
|
-
{ name: 'emitterId', dataType: 'string', description: 'Emitter handle', formInputType: 'text', required: true },
|
|
117
|
-
{ name: 'event', dataType: 'string', description: 'Event name', formInputType: 'text', required: true }
|
|
118
|
-
],
|
|
119
|
-
returnType: 'boolean', returnDescription: 'true', example: 'events.once $emitter "ready"'
|
|
120
|
-
},
|
|
121
|
-
emit: {
|
|
122
|
-
description: 'Emit an event with arguments',
|
|
123
|
-
parameters: [
|
|
124
|
-
{ name: 'emitterId', dataType: 'string', description: 'Emitter handle', formInputType: 'text', required: true },
|
|
125
|
-
{ name: 'event', dataType: 'string', description: 'Event name', formInputType: 'text', required: true }
|
|
126
|
-
],
|
|
127
|
-
returnType: 'boolean', returnDescription: 'true if listeners were called', example: 'events.emit $emitter "data" "payload"'
|
|
128
|
-
},
|
|
129
|
-
off: {
|
|
130
|
-
description: 'Remove all listeners for an event',
|
|
131
|
-
parameters: [
|
|
132
|
-
{ name: 'emitterId', dataType: 'string', description: 'Emitter handle', formInputType: 'text', required: true },
|
|
133
|
-
{ name: 'event', dataType: 'string', description: 'Event name', formInputType: 'text', required: true }
|
|
134
|
-
],
|
|
135
|
-
returnType: 'boolean', returnDescription: 'true', example: 'events.off $emitter "data"'
|
|
136
|
-
},
|
|
137
|
-
listeners: {
|
|
138
|
-
description: 'Get listener count for an event',
|
|
139
|
-
parameters: [
|
|
140
|
-
{ name: 'emitterId', dataType: 'string', description: 'Emitter handle', formInputType: 'text', required: true },
|
|
141
|
-
{ name: 'event', dataType: 'string', description: 'Event name', formInputType: 'text', required: true }
|
|
142
|
-
],
|
|
143
|
-
returnType: 'number', returnDescription: 'Number of listeners', example: 'events.listeners $emitter "data"'
|
|
144
|
-
},
|
|
145
|
-
eventNames: {
|
|
146
|
-
description: 'Get all event names with listeners',
|
|
147
|
-
parameters: [{ name: 'emitterId', dataType: 'string', description: 'Emitter handle', formInputType: 'text', required: true }],
|
|
148
|
-
returnType: 'array', returnDescription: 'Array of event names', example: 'events.eventNames $emitter'
|
|
149
|
-
},
|
|
150
|
-
removeAll: {
|
|
151
|
-
description: 'Remove all listeners from an emitter',
|
|
152
|
-
parameters: [{ name: 'emitterId', dataType: 'string', description: 'Emitter handle', formInputType: 'text', required: true }],
|
|
153
|
-
returnType: 'boolean', returnDescription: 'true', example: 'events.removeAll $emitter'
|
|
154
|
-
},
|
|
155
|
-
destroy: {
|
|
156
|
-
description: 'Destroy an emitter',
|
|
157
|
-
parameters: [{ name: 'emitterId', dataType: 'string', description: 'Emitter handle', formInputType: 'text', required: true }],
|
|
158
|
-
returnType: 'boolean', returnDescription: 'true if destroyed', example: 'events.destroy $emitter'
|
|
159
|
-
},
|
|
160
|
-
list: { description: 'List all active emitters', parameters: [], returnType: 'array', returnDescription: 'Array of emitter IDs', example: 'events.list' }
|
|
161
|
-
};
|
|
162
|
-
|
|
163
|
-
export const EventsModuleMetadata = {
|
|
164
|
-
description: 'EventEmitter pattern: create emitters, listen, emit, and manage events',
|
|
165
|
-
methods: Object.keys(EventsFunctions)
|
|
166
|
-
};
|
|
167
|
-
|
|
168
|
-
export default {
|
|
169
|
-
name: 'events',
|
|
170
|
-
functions: EventsFunctions,
|
|
171
|
-
functionMetadata: EventsFunctionMetadata,
|
|
172
|
-
moduleMetadata: EventsModuleMetadata,
|
|
173
|
-
global: false
|
|
174
|
-
};
|
|
1
|
+
/**
|
|
2
|
+
* Native events module for RobinPath.
|
|
3
|
+
* EventEmitter pattern for pub/sub communication.
|
|
4
|
+
*/
|
|
5
|
+
import { EventEmitter } from 'node:events';
|
|
6
|
+
import { toStr, requireArgs } from './_helpers.js';
|
|
7
|
+
|
|
8
|
+
const _emitters = new Map();
|
|
9
|
+
let _nextId = 1;
|
|
10
|
+
|
|
11
|
+
export const EventsFunctions = {
|
|
12
|
+
|
|
13
|
+
create: () => {
|
|
14
|
+
const id = `emitter_${_nextId++}`;
|
|
15
|
+
_emitters.set(id, new EventEmitter());
|
|
16
|
+
return id;
|
|
17
|
+
},
|
|
18
|
+
|
|
19
|
+
on: (args, callback) => {
|
|
20
|
+
requireArgs('events.on', args, 2);
|
|
21
|
+
const id = toStr(args[0]);
|
|
22
|
+
const event = toStr(args[1]);
|
|
23
|
+
const emitter = _emitters.get(id);
|
|
24
|
+
if (!emitter) throw new Error(`events.on: emitter ${id} not found`);
|
|
25
|
+
if (callback) {
|
|
26
|
+
emitter.on(event, (...eventArgs) => callback(eventArgs));
|
|
27
|
+
}
|
|
28
|
+
return true;
|
|
29
|
+
},
|
|
30
|
+
|
|
31
|
+
once: (args, callback) => {
|
|
32
|
+
requireArgs('events.once', args, 2);
|
|
33
|
+
const id = toStr(args[0]);
|
|
34
|
+
const event = toStr(args[1]);
|
|
35
|
+
const emitter = _emitters.get(id);
|
|
36
|
+
if (!emitter) throw new Error(`events.once: emitter ${id} not found`);
|
|
37
|
+
if (callback) {
|
|
38
|
+
emitter.once(event, (...eventArgs) => callback(eventArgs));
|
|
39
|
+
}
|
|
40
|
+
return true;
|
|
41
|
+
},
|
|
42
|
+
|
|
43
|
+
emit: (args) => {
|
|
44
|
+
requireArgs('events.emit', args, 2);
|
|
45
|
+
const id = toStr(args[0]);
|
|
46
|
+
const event = toStr(args[1]);
|
|
47
|
+
const emitter = _emitters.get(id);
|
|
48
|
+
if (!emitter) throw new Error(`events.emit: emitter ${id} not found`);
|
|
49
|
+
return emitter.emit(event, ...args.slice(2));
|
|
50
|
+
},
|
|
51
|
+
|
|
52
|
+
off: (args) => {
|
|
53
|
+
requireArgs('events.off', args, 2);
|
|
54
|
+
const id = toStr(args[0]);
|
|
55
|
+
const event = toStr(args[1]);
|
|
56
|
+
const emitter = _emitters.get(id);
|
|
57
|
+
if (!emitter) throw new Error(`events.off: emitter ${id} not found`);
|
|
58
|
+
emitter.removeAllListeners(event);
|
|
59
|
+
return true;
|
|
60
|
+
},
|
|
61
|
+
|
|
62
|
+
listeners: (args) => {
|
|
63
|
+
requireArgs('events.listeners', args, 2);
|
|
64
|
+
const id = toStr(args[0]);
|
|
65
|
+
const event = toStr(args[1]);
|
|
66
|
+
const emitter = _emitters.get(id);
|
|
67
|
+
if (!emitter) throw new Error(`events.listeners: emitter ${id} not found`);
|
|
68
|
+
return emitter.listenerCount(event);
|
|
69
|
+
},
|
|
70
|
+
|
|
71
|
+
eventNames: (args) => {
|
|
72
|
+
requireArgs('events.eventNames', args, 1);
|
|
73
|
+
const id = toStr(args[0]);
|
|
74
|
+
const emitter = _emitters.get(id);
|
|
75
|
+
if (!emitter) throw new Error(`events.eventNames: emitter ${id} not found`);
|
|
76
|
+
return emitter.eventNames();
|
|
77
|
+
},
|
|
78
|
+
|
|
79
|
+
removeAll: (args) => {
|
|
80
|
+
requireArgs('events.removeAll', args, 1);
|
|
81
|
+
const id = toStr(args[0]);
|
|
82
|
+
const emitter = _emitters.get(id);
|
|
83
|
+
if (!emitter) throw new Error(`events.removeAll: emitter ${id} not found`);
|
|
84
|
+
emitter.removeAllListeners();
|
|
85
|
+
return true;
|
|
86
|
+
},
|
|
87
|
+
|
|
88
|
+
destroy: (args) => {
|
|
89
|
+
requireArgs('events.destroy', args, 1);
|
|
90
|
+
const id = toStr(args[0]);
|
|
91
|
+
const emitter = _emitters.get(id);
|
|
92
|
+
if (emitter) {
|
|
93
|
+
emitter.removeAllListeners();
|
|
94
|
+
_emitters.delete(id);
|
|
95
|
+
return true;
|
|
96
|
+
}
|
|
97
|
+
return false;
|
|
98
|
+
},
|
|
99
|
+
|
|
100
|
+
list: () => Array.from(_emitters.keys())
|
|
101
|
+
};
|
|
102
|
+
|
|
103
|
+
export const EventsFunctionMetadata = {
|
|
104
|
+
create: { description: 'Create a new event emitter', parameters: [], returnType: 'string', returnDescription: 'Emitter handle ID', example: 'events.create' },
|
|
105
|
+
on: {
|
|
106
|
+
description: 'Listen for an event',
|
|
107
|
+
parameters: [
|
|
108
|
+
{ name: 'emitterId', dataType: 'string', description: 'Emitter handle', formInputType: 'text', required: true },
|
|
109
|
+
{ name: 'event', dataType: 'string', description: 'Event name', formInputType: 'text', required: true }
|
|
110
|
+
],
|
|
111
|
+
returnType: 'boolean', returnDescription: 'true', example: 'events.on $emitter "data"'
|
|
112
|
+
},
|
|
113
|
+
once: {
|
|
114
|
+
description: 'Listen for an event once',
|
|
115
|
+
parameters: [
|
|
116
|
+
{ name: 'emitterId', dataType: 'string', description: 'Emitter handle', formInputType: 'text', required: true },
|
|
117
|
+
{ name: 'event', dataType: 'string', description: 'Event name', formInputType: 'text', required: true }
|
|
118
|
+
],
|
|
119
|
+
returnType: 'boolean', returnDescription: 'true', example: 'events.once $emitter "ready"'
|
|
120
|
+
},
|
|
121
|
+
emit: {
|
|
122
|
+
description: 'Emit an event with arguments',
|
|
123
|
+
parameters: [
|
|
124
|
+
{ name: 'emitterId', dataType: 'string', description: 'Emitter handle', formInputType: 'text', required: true },
|
|
125
|
+
{ name: 'event', dataType: 'string', description: 'Event name', formInputType: 'text', required: true }
|
|
126
|
+
],
|
|
127
|
+
returnType: 'boolean', returnDescription: 'true if listeners were called', example: 'events.emit $emitter "data" "payload"'
|
|
128
|
+
},
|
|
129
|
+
off: {
|
|
130
|
+
description: 'Remove all listeners for an event',
|
|
131
|
+
parameters: [
|
|
132
|
+
{ name: 'emitterId', dataType: 'string', description: 'Emitter handle', formInputType: 'text', required: true },
|
|
133
|
+
{ name: 'event', dataType: 'string', description: 'Event name', formInputType: 'text', required: true }
|
|
134
|
+
],
|
|
135
|
+
returnType: 'boolean', returnDescription: 'true', example: 'events.off $emitter "data"'
|
|
136
|
+
},
|
|
137
|
+
listeners: {
|
|
138
|
+
description: 'Get listener count for an event',
|
|
139
|
+
parameters: [
|
|
140
|
+
{ name: 'emitterId', dataType: 'string', description: 'Emitter handle', formInputType: 'text', required: true },
|
|
141
|
+
{ name: 'event', dataType: 'string', description: 'Event name', formInputType: 'text', required: true }
|
|
142
|
+
],
|
|
143
|
+
returnType: 'number', returnDescription: 'Number of listeners', example: 'events.listeners $emitter "data"'
|
|
144
|
+
},
|
|
145
|
+
eventNames: {
|
|
146
|
+
description: 'Get all event names with listeners',
|
|
147
|
+
parameters: [{ name: 'emitterId', dataType: 'string', description: 'Emitter handle', formInputType: 'text', required: true }],
|
|
148
|
+
returnType: 'array', returnDescription: 'Array of event names', example: 'events.eventNames $emitter'
|
|
149
|
+
},
|
|
150
|
+
removeAll: {
|
|
151
|
+
description: 'Remove all listeners from an emitter',
|
|
152
|
+
parameters: [{ name: 'emitterId', dataType: 'string', description: 'Emitter handle', formInputType: 'text', required: true }],
|
|
153
|
+
returnType: 'boolean', returnDescription: 'true', example: 'events.removeAll $emitter'
|
|
154
|
+
},
|
|
155
|
+
destroy: {
|
|
156
|
+
description: 'Destroy an emitter',
|
|
157
|
+
parameters: [{ name: 'emitterId', dataType: 'string', description: 'Emitter handle', formInputType: 'text', required: true }],
|
|
158
|
+
returnType: 'boolean', returnDescription: 'true if destroyed', example: 'events.destroy $emitter'
|
|
159
|
+
},
|
|
160
|
+
list: { description: 'List all active emitters', parameters: [], returnType: 'array', returnDescription: 'Array of emitter IDs', example: 'events.list' }
|
|
161
|
+
};
|
|
162
|
+
|
|
163
|
+
export const EventsModuleMetadata = {
|
|
164
|
+
description: 'EventEmitter pattern: create emitters, listen, emit, and manage events',
|
|
165
|
+
methods: Object.keys(EventsFunctions)
|
|
166
|
+
};
|
|
167
|
+
|
|
168
|
+
export default {
|
|
169
|
+
name: 'events',
|
|
170
|
+
functions: EventsFunctions,
|
|
171
|
+
functionMetadata: EventsFunctionMetadata,
|
|
172
|
+
moduleMetadata: EventsModuleMetadata,
|
|
173
|
+
global: false
|
|
174
|
+
};
|