n8n-nodes-dominusnode 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 (42) hide show
  1. package/CHANGELOG.md +21 -0
  2. package/LICENSE +21 -0
  3. package/README.md +99 -0
  4. package/dist/credentials/DominusNodeApi.credentials.d.ts +7 -0
  5. package/dist/credentials/DominusNodeApi.credentials.js +42 -0
  6. package/dist/credentials/DominusNodeApi.credentials.js.map +1 -0
  7. package/dist/index.d.ts +4 -0
  8. package/dist/index.js +12 -0
  9. package/dist/index.js.map +1 -0
  10. package/dist/nodes/DominusNodeProxy/DominusNodeProxy.node.d.ts +24 -0
  11. package/dist/nodes/DominusNodeProxy/DominusNodeProxy.node.js +436 -0
  12. package/dist/nodes/DominusNodeProxy/DominusNodeProxy.node.js.map +1 -0
  13. package/dist/nodes/DominusNodeUsage/DominusNodeUsage.node.d.ts +13 -0
  14. package/dist/nodes/DominusNodeUsage/DominusNodeUsage.node.js +105 -0
  15. package/dist/nodes/DominusNodeUsage/DominusNodeUsage.node.js.map +1 -0
  16. package/dist/nodes/DominusNodeWallet/DominusNodeWallet.node.d.ts +33 -0
  17. package/dist/nodes/DominusNodeWallet/DominusNodeWallet.node.js +656 -0
  18. package/dist/nodes/DominusNodeWallet/DominusNodeWallet.node.js.map +1 -0
  19. package/dist/shared/auth.d.ts +74 -0
  20. package/dist/shared/auth.js +264 -0
  21. package/dist/shared/auth.js.map +1 -0
  22. package/dist/shared/constants.d.ts +9 -0
  23. package/dist/shared/constants.js +13 -0
  24. package/dist/shared/constants.js.map +1 -0
  25. package/dist/shared/ssrf.d.ts +42 -0
  26. package/dist/shared/ssrf.js +252 -0
  27. package/dist/shared/ssrf.js.map +1 -0
  28. package/package.json +41 -0
  29. package/src/credentials/DominusNodeApi.credentials.ts +39 -0
  30. package/src/index.ts +4 -0
  31. package/src/nodes/DominusNodeProxy/DominusNodeProxy.node.ts +459 -0
  32. package/src/nodes/DominusNodeUsage/DominusNodeUsage.node.ts +130 -0
  33. package/src/nodes/DominusNodeWallet/DominusNodeWallet.node.ts +898 -0
  34. package/src/shared/auth.ts +272 -0
  35. package/src/shared/constants.ts +11 -0
  36. package/src/shared/ssrf.ts +257 -0
  37. package/tests/DominusNodeProxy.test.ts +281 -0
  38. package/tests/DominusNodeUsage.test.ts +250 -0
  39. package/tests/DominusNodeWallet.test.ts +591 -0
  40. package/tests/ssrf.test.ts +238 -0
  41. package/tsconfig.json +18 -0
  42. package/vitest.config.ts +8 -0
@@ -0,0 +1,436 @@
1
+ "use strict";
2
+ /**
3
+ * DomiNode Proxy n8n community node.
4
+ *
5
+ * Operations:
6
+ * - Proxied Fetch: Make HTTP requests through DomiNode's rotating proxy network
7
+ * - Get Proxy Config: Retrieve proxy endpoint configuration
8
+ * - List Active Sessions: List currently active proxy sessions
9
+ *
10
+ * Security:
11
+ * - Full SSRF prevention (private IPs, hex/octal/decimal, IPv6 variants,
12
+ * Teredo, 6to4, CGNAT, multicast, .localhost/.local/.internal/.arpa)
13
+ * - DNS rebinding protection
14
+ * - OFAC sanctioned country blocking
15
+ * - Read-only HTTP methods only (GET, HEAD, OPTIONS)
16
+ * - Credential sanitization in error messages
17
+ * - Prototype pollution prevention
18
+ *
19
+ * @module
20
+ */
21
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
22
+ if (k2 === undefined) k2 = k;
23
+ var desc = Object.getOwnPropertyDescriptor(m, k);
24
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
25
+ desc = { enumerable: true, get: function() { return m[k]; } };
26
+ }
27
+ Object.defineProperty(o, k2, desc);
28
+ }) : (function(o, m, k, k2) {
29
+ if (k2 === undefined) k2 = k;
30
+ o[k2] = m[k];
31
+ }));
32
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
33
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
34
+ }) : function(o, v) {
35
+ o["default"] = v;
36
+ });
37
+ var __importStar = (this && this.__importStar) || (function () {
38
+ var ownKeys = function(o) {
39
+ ownKeys = Object.getOwnPropertyNames || function (o) {
40
+ var ar = [];
41
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
42
+ return ar;
43
+ };
44
+ return ownKeys(o);
45
+ };
46
+ return function (mod) {
47
+ if (mod && mod.__esModule) return mod;
48
+ var result = {};
49
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
50
+ __setModuleDefault(result, mod);
51
+ return result;
52
+ };
53
+ })();
54
+ Object.defineProperty(exports, "__esModule", { value: true });
55
+ exports.DominusNodeProxy = void 0;
56
+ const http = __importStar(require("node:http"));
57
+ const tls = __importStar(require("node:tls"));
58
+ const n8n_workflow_1 = require("n8n-workflow");
59
+ const ssrf_1 = require("../../shared/ssrf");
60
+ const auth_1 = require("../../shared/auth");
61
+ const constants_1 = require("../../shared/constants");
62
+ const BLOCKED_HEADERS = new Set([
63
+ "host",
64
+ "connection",
65
+ "content-length",
66
+ "transfer-encoding",
67
+ "proxy-authorization",
68
+ "authorization",
69
+ "user-agent",
70
+ ]);
71
+ class DominusNodeProxy {
72
+ description = {
73
+ displayName: "DomiNode Proxy",
74
+ name: "dominusNodeProxy",
75
+ icon: "file:dominusnode.svg",
76
+ group: ["transform"],
77
+ version: 1,
78
+ subtitle: '={{$parameter["operation"]}}',
79
+ description: "Make requests through DomiNode rotating proxy network",
80
+ defaults: { name: "DomiNode Proxy" },
81
+ inputs: ["main"],
82
+ outputs: ["main"],
83
+ credentials: [{ name: "dominusNodeApi", required: true }],
84
+ properties: [
85
+ {
86
+ displayName: "Operation",
87
+ name: "operation",
88
+ type: "options",
89
+ noDataExpression: true,
90
+ options: [
91
+ {
92
+ name: "Proxied Fetch",
93
+ value: "proxiedFetch",
94
+ description: "Make an HTTP request through the proxy network",
95
+ action: "Proxied fetch",
96
+ },
97
+ {
98
+ name: "Get Proxy Config",
99
+ value: "getProxyConfig",
100
+ description: "Get proxy endpoint configuration",
101
+ action: "Get proxy config",
102
+ },
103
+ {
104
+ name: "List Active Sessions",
105
+ value: "listActiveSessions",
106
+ description: "List currently active proxy sessions",
107
+ action: "List active sessions",
108
+ },
109
+ ],
110
+ default: "proxiedFetch",
111
+ },
112
+ // Proxied Fetch parameters
113
+ {
114
+ displayName: "URL",
115
+ name: "url",
116
+ type: "string",
117
+ default: "",
118
+ required: true,
119
+ description: "The URL to fetch through the proxy",
120
+ displayOptions: { show: { operation: ["proxiedFetch"] } },
121
+ },
122
+ {
123
+ displayName: "Method",
124
+ name: "method",
125
+ type: "options",
126
+ options: [
127
+ { name: "GET", value: "GET" },
128
+ { name: "HEAD", value: "HEAD" },
129
+ { name: "OPTIONS", value: "OPTIONS" },
130
+ ],
131
+ default: "GET",
132
+ description: "HTTP method (only read-only methods allowed)",
133
+ displayOptions: { show: { operation: ["proxiedFetch"] } },
134
+ },
135
+ {
136
+ displayName: "Proxy Type",
137
+ name: "proxyType",
138
+ type: "options",
139
+ options: [
140
+ { name: "Datacenter ($3/GB)", value: "dc" },
141
+ { name: "Residential ($5/GB)", value: "residential" },
142
+ { name: "Auto", value: "auto" },
143
+ ],
144
+ default: "dc",
145
+ description: "Type of proxy IP to use",
146
+ displayOptions: { show: { operation: ["proxiedFetch"] } },
147
+ },
148
+ {
149
+ displayName: "Country",
150
+ name: "country",
151
+ type: "string",
152
+ default: "",
153
+ description: "Two-letter country code for geo-targeting (e.g., US, GB, DE). Leave empty for any.",
154
+ displayOptions: { show: { operation: ["proxiedFetch"] } },
155
+ },
156
+ {
157
+ displayName: "Custom Headers",
158
+ name: "headers",
159
+ type: "fixedCollection",
160
+ typeOptions: { multipleValues: true },
161
+ default: {},
162
+ description: "Custom HTTP headers to include in the request",
163
+ displayOptions: { show: { operation: ["proxiedFetch"] } },
164
+ options: [
165
+ {
166
+ name: "header",
167
+ displayName: "Header",
168
+ values: [
169
+ {
170
+ displayName: "Name",
171
+ name: "name",
172
+ type: "string",
173
+ default: "",
174
+ },
175
+ {
176
+ displayName: "Value",
177
+ name: "value",
178
+ type: "string",
179
+ default: "",
180
+ },
181
+ ],
182
+ },
183
+ ],
184
+ },
185
+ ],
186
+ };
187
+ async execute() {
188
+ const items = this.getInputData();
189
+ const returnData = [];
190
+ const credentials = await this.getCredentials("dominusNodeApi");
191
+ const apiKey = credentials.apiKey;
192
+ const baseUrl = credentials.baseUrl || "https://api.dominusnode.com";
193
+ const proxyHost = credentials.proxyHost || "proxy.dominusnode.com";
194
+ const proxyPort = Number(credentials.proxyPort) || 8080;
195
+ if (!apiKey) {
196
+ throw new n8n_workflow_1.NodeOperationError(this.getNode(), "API Key is required");
197
+ }
198
+ const auth = new auth_1.DominusNodeAuth(apiKey, baseUrl);
199
+ const operation = this.getNodeParameter("operation", 0);
200
+ for (let i = 0; i < items.length; i++) {
201
+ try {
202
+ if (operation === "proxiedFetch") {
203
+ const url = this.getNodeParameter("url", i);
204
+ const method = this.getNodeParameter("method", i, "GET");
205
+ const proxyType = this.getNodeParameter("proxyType", i, "dc");
206
+ const country = this.getNodeParameter("country", i, "");
207
+ const headersParam = this.getNodeParameter("headers", i, {});
208
+ // Validate URL (SSRF prevention)
209
+ if (!url || typeof url !== "string") {
210
+ throw new n8n_workflow_1.NodeOperationError(this.getNode(), "URL is required", { itemIndex: i });
211
+ }
212
+ let parsedUrl;
213
+ try {
214
+ parsedUrl = (0, ssrf_1.validateUrl)(url);
215
+ }
216
+ catch (err) {
217
+ throw new n8n_workflow_1.NodeOperationError(this.getNode(), err instanceof Error ? err.message : "URL validation failed", { itemIndex: i });
218
+ }
219
+ // DNS rebinding protection
220
+ try {
221
+ await (0, auth_1.checkDnsRebinding)(parsedUrl.hostname);
222
+ }
223
+ catch (err) {
224
+ throw new n8n_workflow_1.NodeOperationError(this.getNode(), err instanceof Error ? err.message : "DNS validation failed", { itemIndex: i });
225
+ }
226
+ // Validate method
227
+ const upperMethod = method.toUpperCase();
228
+ if (!constants_1.ALLOWED_METHODS.has(upperMethod)) {
229
+ throw new n8n_workflow_1.NodeOperationError(this.getNode(), `HTTP method '${upperMethod}' is not allowed. Only GET, HEAD, OPTIONS are permitted.`, { itemIndex: i });
230
+ }
231
+ // OFAC sanctioned country check
232
+ if (country) {
233
+ const upper = country.toUpperCase();
234
+ if (auth_1.SANCTIONED_COUNTRIES.has(upper)) {
235
+ throw new n8n_workflow_1.NodeOperationError(this.getNode(), `Country '${upper}' is blocked (OFAC sanctioned country)`, { itemIndex: i });
236
+ }
237
+ }
238
+ // Build proxy username for geo-targeting (uses hyphens, not underscores)
239
+ const userParts = [];
240
+ if (proxyType && proxyType !== "auto")
241
+ userParts.push(proxyType);
242
+ if (country)
243
+ userParts.push(`country-${country.toUpperCase()}`);
244
+ const username = userParts.length > 0 ? userParts.join("-") : "auto";
245
+ const proxyAuth = "Basic " + Buffer.from(`${username}:${apiKey}`).toString("base64");
246
+ // Build safe headers
247
+ const safeHeaders = {};
248
+ if (headersParam.header) {
249
+ for (const { name, value } of headersParam.header) {
250
+ if (!name)
251
+ continue;
252
+ if (BLOCKED_HEADERS.has(name.toLowerCase()))
253
+ continue;
254
+ // CRLF injection prevention
255
+ if (/[\r\n\0]/.test(name) || /[\r\n\0]/.test(value))
256
+ continue;
257
+ safeHeaders[name] = value;
258
+ }
259
+ }
260
+ // Route through proxy gateway
261
+ const MAX_BODY_BYTES = 1_048_576; // 1MB response cap
262
+ const result = await new Promise((resolve, reject) => {
263
+ const timeout = setTimeout(() => reject(new Error("Proxy request timed out after 30000ms")), 30_000);
264
+ if (parsedUrl.protocol === "https:") {
265
+ // HTTPS: CONNECT tunnel + TLS
266
+ const connectHost = parsedUrl.hostname.includes(":") ? `[${parsedUrl.hostname}]` : parsedUrl.hostname;
267
+ const connectReq = http.request({
268
+ hostname: proxyHost,
269
+ port: proxyPort,
270
+ method: "CONNECT",
271
+ path: `${connectHost}:${parsedUrl.port || 443}`,
272
+ headers: {
273
+ "Proxy-Authorization": proxyAuth,
274
+ Host: `${connectHost}:${parsedUrl.port || 443}`,
275
+ },
276
+ });
277
+ connectReq.on("connect", (_res, tunnelSocket) => {
278
+ if (_res.statusCode !== 200) {
279
+ clearTimeout(timeout);
280
+ tunnelSocket.destroy();
281
+ reject(new Error(`CONNECT failed: ${_res.statusCode}`));
282
+ return;
283
+ }
284
+ const tlsSocket = tls.connect({
285
+ host: parsedUrl.hostname,
286
+ socket: tunnelSocket,
287
+ servername: parsedUrl.hostname,
288
+ minVersion: "TLSv1.2",
289
+ }, () => {
290
+ const reqPath = parsedUrl.pathname + parsedUrl.search;
291
+ let reqLine = `${upperMethod} ${reqPath} HTTP/1.1\r\nHost: ${parsedUrl.host}\r\nUser-Agent: n8n-nodes-dominusnode/1.0.0\r\nAccept: */*\r\nConnection: close\r\n`;
292
+ for (const [k, v] of Object.entries(safeHeaders)) {
293
+ if (!["host", "user-agent", "connection"].includes(k.toLowerCase())) {
294
+ reqLine += `${k}: ${v}\r\n`;
295
+ }
296
+ }
297
+ reqLine += "\r\n";
298
+ tlsSocket.write(reqLine);
299
+ const chunks = [];
300
+ let byteCount = 0;
301
+ tlsSocket.on("data", (chunk) => {
302
+ byteCount += chunk.length;
303
+ if (byteCount <= MAX_BODY_BYTES + 16384)
304
+ chunks.push(chunk);
305
+ });
306
+ let finalized = false;
307
+ const finalize = () => {
308
+ if (finalized)
309
+ return;
310
+ finalized = true;
311
+ clearTimeout(timeout);
312
+ const raw = Buffer.concat(chunks).toString("utf-8");
313
+ const headerEnd = raw.indexOf("\r\n\r\n");
314
+ if (headerEnd === -1) {
315
+ reject(new Error("Malformed response"));
316
+ return;
317
+ }
318
+ const headerSection = raw.substring(0, headerEnd);
319
+ const body = raw.substring(headerEnd + 4).substring(0, MAX_BODY_BYTES);
320
+ const statusLine = headerSection.split("\r\n")[0];
321
+ const statusMatch = statusLine.match(/^HTTP\/\d\.\d\s+(\d+)/);
322
+ const status = statusMatch ? parseInt(statusMatch[1], 10) : 0;
323
+ const respHeaders = {};
324
+ for (const line of headerSection.split("\r\n").slice(1)) {
325
+ const ci = line.indexOf(":");
326
+ if (ci > 0) {
327
+ respHeaders[line.substring(0, ci).trim().toLowerCase()] =
328
+ line.substring(ci + 1).trim();
329
+ }
330
+ }
331
+ resolve({ status, headers: respHeaders, body });
332
+ };
333
+ tlsSocket.on("end", finalize);
334
+ tlsSocket.on("close", finalize);
335
+ tlsSocket.on("error", (err) => {
336
+ clearTimeout(timeout);
337
+ reject(err);
338
+ });
339
+ });
340
+ tlsSocket.on("error", (err) => {
341
+ clearTimeout(timeout);
342
+ reject(err);
343
+ });
344
+ });
345
+ connectReq.on("error", (err) => {
346
+ clearTimeout(timeout);
347
+ reject(err);
348
+ });
349
+ connectReq.end();
350
+ }
351
+ else {
352
+ // HTTP: direct proxy request (full-URL path)
353
+ const req = http.request({
354
+ hostname: proxyHost,
355
+ port: proxyPort,
356
+ method: upperMethod,
357
+ path: url,
358
+ headers: {
359
+ ...safeHeaders,
360
+ "Proxy-Authorization": proxyAuth,
361
+ Host: parsedUrl.host,
362
+ },
363
+ }, (res) => {
364
+ const chunks = [];
365
+ let byteCount = 0;
366
+ res.on("data", (chunk) => {
367
+ byteCount += chunk.length;
368
+ if (byteCount <= MAX_BODY_BYTES)
369
+ chunks.push(chunk);
370
+ });
371
+ let finalized = false;
372
+ const finalize = () => {
373
+ if (finalized)
374
+ return;
375
+ finalized = true;
376
+ clearTimeout(timeout);
377
+ const body = Buffer.concat(chunks).toString("utf-8").substring(0, MAX_BODY_BYTES);
378
+ const respHeaders = {};
379
+ for (const [k, v] of Object.entries(res.headers)) {
380
+ if (v)
381
+ respHeaders[k] = Array.isArray(v) ? v.join(", ") : v;
382
+ }
383
+ resolve({ status: res.statusCode ?? 0, headers: respHeaders, body });
384
+ };
385
+ res.on("end", finalize);
386
+ res.on("close", finalize);
387
+ res.on("error", (err) => {
388
+ clearTimeout(timeout);
389
+ reject(err);
390
+ });
391
+ });
392
+ req.on("error", (err) => {
393
+ clearTimeout(timeout);
394
+ reject(err);
395
+ });
396
+ req.end();
397
+ }
398
+ });
399
+ returnData.push({
400
+ json: {
401
+ status: result.status,
402
+ headers: result.headers,
403
+ body: result.body.substring(0, constants_1.MAX_BODY_TRUNCATE),
404
+ url,
405
+ method: upperMethod,
406
+ proxyType,
407
+ country: country || undefined,
408
+ },
409
+ });
410
+ }
411
+ else if (operation === "getProxyConfig") {
412
+ const result = await auth.apiRequest("GET", "/api/proxy/config");
413
+ returnData.push({ json: result });
414
+ }
415
+ else if (operation === "listActiveSessions") {
416
+ const result = await auth.apiRequest("GET", "/api/sessions/active");
417
+ returnData.push({ json: result });
418
+ }
419
+ }
420
+ catch (err) {
421
+ if (this.continueOnFail()) {
422
+ returnData.push({
423
+ json: {
424
+ error: (0, auth_1.sanitizeError)(err instanceof Error ? err.message : String(err)),
425
+ },
426
+ });
427
+ continue;
428
+ }
429
+ throw new n8n_workflow_1.NodeOperationError(this.getNode(), (0, auth_1.sanitizeError)(err instanceof Error ? err.message : String(err)), { itemIndex: i });
430
+ }
431
+ }
432
+ return [returnData];
433
+ }
434
+ }
435
+ exports.DominusNodeProxy = DominusNodeProxy;
436
+ //# sourceMappingURL=DominusNodeProxy.node.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DominusNodeProxy.node.js","sourceRoot":"","sources":["../../../src/nodes/DominusNodeProxy/DominusNodeProxy.node.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * DomiNode Usage n8n community node.
3
+ *
4
+ * Operations:
5
+ * - Check Usage: Get proxy usage statistics for a given period
6
+ *
7
+ * @module
8
+ */
9
+ import { IExecuteFunctions, INodeExecutionData, INodeType, INodeTypeDescription } from "n8n-workflow";
10
+ export declare class DominusNodeUsage implements INodeType {
11
+ description: INodeTypeDescription;
12
+ execute(this: IExecuteFunctions): Promise<INodeExecutionData[][]>;
13
+ }
@@ -0,0 +1,105 @@
1
+ "use strict";
2
+ /**
3
+ * DomiNode Usage n8n community node.
4
+ *
5
+ * Operations:
6
+ * - Check Usage: Get proxy usage statistics for a given period
7
+ *
8
+ * @module
9
+ */
10
+ Object.defineProperty(exports, "__esModule", { value: true });
11
+ exports.DominusNodeUsage = void 0;
12
+ const n8n_workflow_1 = require("n8n-workflow");
13
+ const auth_1 = require("../../shared/auth");
14
+ const VALID_PERIODS = new Set(["day", "week", "month"]);
15
+ class DominusNodeUsage {
16
+ description = {
17
+ displayName: "DomiNode Usage",
18
+ name: "dominusNodeUsage",
19
+ icon: "file:dominusnode.svg",
20
+ group: ["transform"],
21
+ version: 1,
22
+ subtitle: '={{$parameter["operation"]}}',
23
+ description: "Check DomiNode proxy usage statistics",
24
+ defaults: { name: "DomiNode Usage" },
25
+ inputs: ["main"],
26
+ outputs: ["main"],
27
+ credentials: [{ name: "dominusNodeApi", required: true }],
28
+ properties: [
29
+ {
30
+ displayName: "Operation",
31
+ name: "operation",
32
+ type: "options",
33
+ noDataExpression: true,
34
+ options: [
35
+ {
36
+ name: "Check Usage",
37
+ value: "checkUsage",
38
+ description: "Get proxy usage statistics for a given period",
39
+ action: "Check usage",
40
+ },
41
+ ],
42
+ default: "checkUsage",
43
+ },
44
+ {
45
+ displayName: "Period",
46
+ name: "period",
47
+ type: "options",
48
+ options: [
49
+ { name: "Day", value: "day" },
50
+ { name: "Week", value: "week" },
51
+ { name: "Month", value: "month" },
52
+ ],
53
+ default: "month",
54
+ description: "Time period for usage statistics",
55
+ displayOptions: { show: { operation: ["checkUsage"] } },
56
+ },
57
+ ],
58
+ };
59
+ async execute() {
60
+ const items = this.getInputData();
61
+ const returnData = [];
62
+ const credentials = await this.getCredentials("dominusNodeApi");
63
+ const apiKey = credentials.apiKey;
64
+ const baseUrl = credentials.baseUrl || "https://api.dominusnode.com";
65
+ if (!apiKey) {
66
+ throw new n8n_workflow_1.NodeOperationError(this.getNode(), "API Key is required");
67
+ }
68
+ const auth = new auth_1.DominusNodeAuth(apiKey, baseUrl);
69
+ for (let i = 0; i < items.length; i++) {
70
+ try {
71
+ const operation = this.getNodeParameter("operation", i);
72
+ if (operation === "checkUsage") {
73
+ const period = this.getNodeParameter("period", i, "month");
74
+ if (!VALID_PERIODS.has(period)) {
75
+ throw new n8n_workflow_1.NodeOperationError(this.getNode(), `Invalid period '${period}'. Must be one of: day, week, month`, { itemIndex: i });
76
+ }
77
+ // Backend expects since/until ISO dates, NOT a days integer
78
+ const { since, until } = (0, auth_1.periodToDateRange)(period);
79
+ const params = new URLSearchParams({ since, until });
80
+ const result = await auth.apiRequest("GET", `/api/usage?${params.toString()}`);
81
+ returnData.push({ json: (result ?? {}) });
82
+ }
83
+ else {
84
+ throw new n8n_workflow_1.NodeOperationError(this.getNode(), `Unknown operation: ${operation}`, { itemIndex: i });
85
+ }
86
+ }
87
+ catch (err) {
88
+ if (this.continueOnFail()) {
89
+ returnData.push({
90
+ json: {
91
+ error: (0, auth_1.sanitizeError)(err instanceof Error ? err.message : String(err)),
92
+ },
93
+ });
94
+ continue;
95
+ }
96
+ if (err instanceof n8n_workflow_1.NodeOperationError)
97
+ throw err;
98
+ throw new n8n_workflow_1.NodeOperationError(this.getNode(), (0, auth_1.sanitizeError)(err instanceof Error ? err.message : String(err)), { itemIndex: i });
99
+ }
100
+ }
101
+ return [returnData];
102
+ }
103
+ }
104
+ exports.DominusNodeUsage = DominusNodeUsage;
105
+ //# sourceMappingURL=DominusNodeUsage.node.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DominusNodeUsage.node.js","sourceRoot":"","sources":["../../../src/nodes/DominusNodeUsage/DominusNodeUsage.node.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,33 @@
1
+ /**
2
+ * DomiNode Wallet n8n community node.
3
+ *
4
+ * Operations:
5
+ * - Check Balance: Get current wallet balance
6
+ * - Top Up (Stripe): Create a Stripe checkout session
7
+ * - Top Up (Crypto): Create a crypto payment invoice
8
+ * - Top Up (PayPal): Create a PayPal checkout session via Stripe
9
+ * - Create Agentic Wallet: Create a sub-wallet with spending limits
10
+ * - Fund Agentic Wallet: Transfer funds to an agentic wallet
11
+ * - Get Agentic Wallet Balance: Check an agentic wallet's balance
12
+ * - List Agentic Wallets: List all agentic wallets
13
+ * - Get Agentic Transactions: Get transaction history for an agentic wallet
14
+ * - Freeze Agentic Wallet: Freeze an agentic wallet
15
+ * - Unfreeze Agentic Wallet: Unfreeze an agentic wallet
16
+ * - Delete Agentic Wallet: Delete an agentic wallet
17
+ * - Update Wallet Policy: Update agentic wallet spending policy
18
+ * - Create Team: Create a new team
19
+ * - List Teams: List all teams
20
+ * - Team Details: Get team details
21
+ * - Fund Team: Fund a team wallet
22
+ * - Create Team Key: Create an API key for a team
23
+ * - Team Usage: Get team wallet transaction history
24
+ * - Update Team: Update team name/max members
25
+ * - Update Team Member Role: Update a team member's role
26
+ *
27
+ * @module
28
+ */
29
+ import { IExecuteFunctions, INodeExecutionData, INodeType, INodeTypeDescription } from "n8n-workflow";
30
+ export declare class DominusNodeWallet implements INodeType {
31
+ description: INodeTypeDescription;
32
+ execute(this: IExecuteFunctions): Promise<INodeExecutionData[][]>;
33
+ }