cbs-block 1.0.10 → 1.0.11

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.
@@ -0,0 +1,144 @@
1
+ const sqlite3 = require('sqlite3').verbose();
2
+ const mysql = require('mysql2/promise');
3
+ const { Client } = require('pg');
4
+
5
+ // In-memory storage for demo purposes (since we can't install real databases)
6
+ const mockDatabases = new Map();
7
+
8
+ function run(inputs) {
9
+ try {
10
+ const { action, type = 'sqlite', connection, query, params = [], table, data } = inputs;
11
+
12
+ switch (action?.toLowerCase()) {
13
+ case 'connect':
14
+ // For demo purposes, we'll use in-memory storage
15
+ if (!connection) {
16
+ return { result: null, count: null, lastId: null, error: "Connection string is required" };
17
+ }
18
+
19
+ if (type === 'sqlite' || !type) {
20
+ // Use in-memory SQLite for demo
21
+ return { result: [{ status: 'connected', database: connection }], count: 1, lastId: null, error: null };
22
+ }
23
+
24
+ return { result: [{ status: 'connected', type: type, connection: connection }], count: 1, lastId: null, error: null };
25
+
26
+ case 'query':
27
+ case 'execute':
28
+ if (!query) {
29
+ return { result: null, count: null, lastId: null, error: "Query is required" };
30
+ }
31
+
32
+ // Mock database operations for demo
33
+ if (query.toLowerCase().includes('select')) {
34
+ // Mock SELECT results
35
+ const mockResults = [
36
+ { id: 1, name: 'Sample Data 1', created: new Date().toISOString() },
37
+ { id: 2, name: 'Sample Data 2', created: new Date().toISOString() }
38
+ ];
39
+ return { result: mockResults, count: mockResults.length, lastId: null, error: null };
40
+ } else if (query.toLowerCase().includes('insert')) {
41
+ // Mock INSERT
42
+ return { result: [{ affectedRows: 1 }], count: 1, lastId: '123', error: null };
43
+ } else if (query.toLowerCase().includes('update')) {
44
+ // Mock UPDATE
45
+ return { result: [{ affectedRows: 1 }], count: 1, lastId: null, error: null };
46
+ } else if (query.toLowerCase().includes('delete')) {
47
+ // Mock DELETE
48
+ return { result: [{ affectedRows: 1 }], count: 1, lastId: null, error: null };
49
+ }
50
+
51
+ return { result: [{ message: 'Query executed successfully' }], count: 1, lastId: null, error: null };
52
+
53
+ case 'insert':
54
+ if (!table || !data) {
55
+ return { result: null, count: null, lastId: null, error: "Table name and data are required for insert" };
56
+ }
57
+
58
+ // Mock insert operation
59
+ const newId = Date.now().toString();
60
+ const mockInsertResult = {
61
+ id: newId,
62
+ ...data,
63
+ created_at: new Date().toISOString()
64
+ };
65
+
66
+ return { result: [mockInsertResult], count: 1, lastId: newId, error: null };
67
+
68
+ case 'update':
69
+ if (!table || !data) {
70
+ return { result: null, count: null, lastId: null, error: "Table name and data are required for update" };
71
+ }
72
+
73
+ // Mock update operation
74
+ const mockUpdateResult = {
75
+ affectedRows: 1,
76
+ matchedCount: 1,
77
+ modifiedCount: 1
78
+ };
79
+
80
+ return { result: [mockUpdateResult], count: 1, lastId: null, error: null };
81
+
82
+ case 'delete':
83
+ if (!table) {
84
+ return { result: null, count: null, lastId: null, error: "Table name is required for delete" };
85
+ }
86
+
87
+ // Mock delete operation
88
+ const mockDeleteResult = {
89
+ affectedRows: 1,
90
+ deletedCount: 1
91
+ };
92
+
93
+ return { result: [mockDeleteResult], count: 1, lastId: null, error: null };
94
+
95
+ case 'find':
96
+ case 'select':
97
+ if (!table) {
98
+ return { result: null, count: null, lastId: null, error: "Table name is required for select" };
99
+ }
100
+
101
+ // Mock select operation
102
+ const mockData = [
103
+ { id: 1, name: 'Record 1', status: 'active', created_at: new Date().toISOString() },
104
+ { id: 2, name: 'Record 2', status: 'inactive', created_at: new Date().toISOString() },
105
+ { id: 3, name: 'Record 3', status: 'active', created_at: new Date().toISOString() }
106
+ ];
107
+
108
+ return { result: mockData, count: mockData.length, lastId: null, error: null };
109
+
110
+ case 'create_table':
111
+ if (!table) {
112
+ return { result: null, count: null, lastId: null, error: "Table name is required" };
113
+ }
114
+
115
+ // Mock table creation
116
+ return { result: [{ message: `Table '${table}' created successfully` }], count: 1, lastId: null, error: null };
117
+
118
+ case 'drop_table':
119
+ if (!table) {
120
+ return { result: null, count: null, lastId: null, error: "Table name is required" };
121
+ }
122
+
123
+ // Mock table deletion
124
+ return { result: [{ message: `Table '${table}' dropped successfully` }], count: 1, lastId: null, error: null };
125
+
126
+ default:
127
+ return {
128
+ result: null,
129
+ count: null,
130
+ lastId: null,
131
+ error: `Unknown action: ${action}. Supported actions: connect, query, insert, update, delete, find, create_table, drop_table`
132
+ };
133
+ }
134
+ } catch (error) {
135
+ return {
136
+ result: null,
137
+ count: null,
138
+ lastId: null,
139
+ error: `Database error: ${error.message}`
140
+ };
141
+ }
142
+ }
143
+
144
+ module.exports = { run };
@@ -0,0 +1,27 @@
1
+ {
2
+ "name": "Database",
3
+ "category": "Data",
4
+ "color": "#9C27B0",
5
+ "ports": [
6
+ { "name": "flowIn", "type": "FlowIn" },
7
+ { "name": "flowOut", "type": "FlowOut" },
8
+ { "name": "action", "type": "Input", "dataType": "string" },
9
+ { "name": "type", "type": "Input", "dataType": "string" },
10
+ { "name": "connection", "type": "Input", "dataType": "string" },
11
+ { "name": "query", "type": "Input", "dataType": "string" },
12
+ { "name": "params", "type": "Input", "dataType": "array" },
13
+ { "name": "table", "type": "Input", "dataType": "string" },
14
+ { "name": "data", "type": "Input", "dataType": "object" },
15
+ { "name": "result", "type": "Output", "dataType": "array" },
16
+ { "name": "count", "type": "Output", "dataType": "number" },
17
+ { "name": "lastId", "type": "Output", "dataType": "string" },
18
+ { "name": "error", "type": "Output", "dataType": "string" }
19
+ ],
20
+ "codeTemplates": {
21
+ "javascript": "const db = new sqlite3.Database({connection}); db.all({query}, {params}, (err, rows) => { /* handle results */ });",
22
+ "python": "import sqlite3; conn = sqlite3.connect({connection}); cursor = conn.cursor(); cursor.execute({query}, {params} or []); results = cursor.fetchall()",
23
+ "cpp": "sqlite3 *db; sqlite3_open({connection}, &db); sqlite3_exec(db, {query}, callback, 0, &err);",
24
+ "sql": "{query}",
25
+ "bash": "sqlite3 {connection} \"{query}\""
26
+ }
27
+ }
@@ -0,0 +1,13 @@
1
+ {
2
+ "name": "database",
3
+ "displayName": "Database Manager",
4
+ "publisher": "cbs-core",
5
+ "version": "1.0.0",
6
+ "main": "index.js",
7
+ "engines": { "cbs": ">=1.1.0" },
8
+ "dependencies": {
9
+ "sqlite3": "^5.1.6",
10
+ "mysql2": "^3.6.5",
11
+ "pg": "^8.11.3"
12
+ }
13
+ }
@@ -0,0 +1,111 @@
1
+ const fs = require('fs');
2
+ const path = require('path');
3
+
4
+ function run(inputs) {
5
+ try {
6
+ const { action, key, value, envFile } = inputs;
7
+
8
+ switch (action?.toLowerCase()) {
9
+ case 'get':
10
+ if (!key) {
11
+ return { result: null, allVars: null, error: "Key is required for 'get' action" };
12
+ }
13
+ const getValue = process.env[key];
14
+ return {
15
+ result: getValue || null,
16
+ allVars: null,
17
+ error: getValue ? null : `Environment variable '${key}' not found`
18
+ };
19
+
20
+ case 'set':
21
+ if (!key) {
22
+ return { result: null, allVars: null, error: "Key is required for 'set' action" };
23
+ }
24
+ process.env[key] = value || '';
25
+ return { result: value || '', allVars: null, error: null };
26
+
27
+ case 'delete':
28
+ case 'remove':
29
+ if (!key) {
30
+ return { result: null, allVars: null, error: "Key is required for 'delete' action" };
31
+ }
32
+ const deletedValue = process.env[key];
33
+ delete process.env[key];
34
+ return { result: deletedValue || null, allVars: null, error: null };
35
+
36
+ case 'list':
37
+ case 'all':
38
+ const allVars = {};
39
+ Object.keys(process.env).forEach(envKey => {
40
+ allVars[envKey] = process.env[envKey];
41
+ });
42
+ return { result: null, allVars: allVars, error: null };
43
+
44
+ case 'load':
45
+ if (!envFile) {
46
+ return { result: null, allVars: null, error: "envFile path is required for 'load' action" };
47
+ }
48
+ try {
49
+ const envPath = path.resolve(envFile);
50
+ if (!fs.existsSync(envPath)) {
51
+ return { result: null, allVars: null, error: `Environment file not found: ${envPath}` };
52
+ }
53
+
54
+ const envContent = fs.readFileSync(envPath, 'utf8');
55
+ const loadedVars = {};
56
+
57
+ envContent.split('\n').forEach(line => {
58
+ const trimmed = line.trim();
59
+ if (trimmed && !trimmed.startsWith('#')) {
60
+ const [envKey, ...envValueParts] = trimmed.split('=');
61
+ if (envKey && envValueParts.length > 0) {
62
+ const envValue = envValueParts.join('=').replace(/^["']|["']$/g, '');
63
+ process.env[envKey] = envValue;
64
+ loadedVars[envKey] = envValue;
65
+ }
66
+ }
67
+ });
68
+
69
+ return {
70
+ result: `Loaded ${Object.keys(loadedVars).length} variables`,
71
+ allVars: loadedVars,
72
+ error: null
73
+ };
74
+ } catch (fileError) {
75
+ return { result: null, allVars: null, error: `Failed to load env file: ${fileError.message}` };
76
+ }
77
+
78
+ case 'save':
79
+ if (!envFile) {
80
+ return { result: null, allVars: null, error: "envFile path is required for 'save' action" };
81
+ }
82
+ try {
83
+ const envPath = path.resolve(envFile);
84
+ const envContent = Object.keys(process.env)
85
+ .filter(key => process.env[key]) // Only save non-empty values
86
+ .map(key => `${key}=${process.env[key]}`)
87
+ .join('\n');
88
+
89
+ fs.writeFileSync(envPath, envContent, 'utf8');
90
+ return { result: `Saved environment to ${envPath}`, allVars: null, error: null };
91
+ } catch (fileError) {
92
+ return { result: null, allVars: null, error: `Failed to save env file: ${fileError.message}` };
93
+ }
94
+
95
+ default:
96
+ return {
97
+ result: null,
98
+ allVars: null,
99
+ error: `Unknown action: ${action}. Supported actions: get, set, delete, list, load, save`
100
+ };
101
+ }
102
+ } catch (error) {
103
+ return {
104
+ result: null,
105
+ allVars: null,
106
+ error: `Environment Manager error: ${error.message}`
107
+ };
108
+ }
109
+ }
110
+
111
+ module.exports = { run };
@@ -0,0 +1,23 @@
1
+ {
2
+ "name": "Environment Manager",
3
+ "category": "System",
4
+ "color": "#4CAF50",
5
+ "ports": [
6
+ { "name": "flowIn", "type": "FlowIn" },
7
+ { "name": "flowOut", "type": "FlowOut" },
8
+ { "name": "action", "type": "Input", "dataType": "string" },
9
+ { "name": "key", "type": "Input", "dataType": "string" },
10
+ { "name": "value", "type": "Input", "dataType": "string" },
11
+ { "name": "envFile", "type": "Input", "dataType": "string" },
12
+ { "name": "result", "type": "Output", "dataType": "string" },
13
+ { "name": "allVars", "type": "Output", "dataType": "object" },
14
+ { "name": "error", "type": "Output", "dataType": "string" }
15
+ ],
16
+ "codeTemplates": {
17
+ "javascript": "process.env.{key} = {value};",
18
+ "python": "import os; os.environ[{key}] = {value}",
19
+ "cpp": "setenv({key}, {value}, 1);",
20
+ "bash": "export {key}={value}",
21
+ "powershell": "$env:{key} = '{value}'"
22
+ }
23
+ }
@@ -0,0 +1,11 @@
1
+ {
2
+ "name": "env-manager",
3
+ "displayName": "Environment Manager",
4
+ "publisher": "cbs-core",
5
+ "version": "1.0.0",
6
+ "main": "index.js",
7
+ "engines": { "cbs": ">=1.1.0" },
8
+ "dependencies": {
9
+ "dotenv": "^16.3.1"
10
+ }
11
+ }
@@ -0,0 +1,142 @@
1
+ const fs = require('fs');
2
+ const path = require('path');
3
+ const { glob } = require('glob');
4
+
5
+ function run(inputs) {
6
+ try {
7
+ const { action, path: filePath, content, pattern, encoding = 'utf8' } = inputs;
8
+
9
+ switch (action?.toLowerCase()) {
10
+ case 'read':
11
+ case 'readfile':
12
+ if (!filePath) {
13
+ return { result: null, files: null, stats: null, error: "Path is required for 'read' action" };
14
+ }
15
+ try {
16
+ const fileContent = fs.readFileSync(filePath, encoding);
17
+ return { result: fileContent, files: null, stats: null, error: null };
18
+ } catch (fileError) {
19
+ return { result: null, files: null, stats: null, error: `Failed to read file: ${fileError.message}` };
20
+ }
21
+
22
+ case 'write':
23
+ case 'writefile':
24
+ if (!filePath) {
25
+ return { result: null, files: null, stats: null, error: "Path is required for 'write' action" };
26
+ }
27
+ try {
28
+ fs.writeFileSync(filePath, content || '', encoding);
29
+ return { result: `File written to ${filePath}`, files: null, stats: null, error: null };
30
+ } catch (fileError) {
31
+ return { result: null, files: null, stats: null, error: `Failed to write file: ${fileError.message}` };
32
+ }
33
+
34
+ case 'append':
35
+ if (!filePath) {
36
+ return { result: null, files: null, stats: null, error: "Path is required for 'append' action" };
37
+ }
38
+ try {
39
+ fs.appendFileSync(filePath, content || '', encoding);
40
+ return { result: `Content appended to ${filePath}`, files: null, stats: null, error: null };
41
+ } catch (fileError) {
42
+ return { result: null, files: null, stats: null, error: `Failed to append to file: ${fileError.message}` };
43
+ }
44
+
45
+ case 'delete':
46
+ case 'remove':
47
+ if (!filePath) {
48
+ return { result: null, files: null, stats: null, error: "Path is required for 'delete' action" };
49
+ }
50
+ try {
51
+ if (fs.existsSync(filePath)) {
52
+ fs.unlinkSync(filePath);
53
+ return { result: `File deleted: ${filePath}`, files: null, stats: null, error: null };
54
+ } else {
55
+ return { result: null, files: null, stats: null, error: `File not found: ${filePath}` };
56
+ }
57
+ } catch (fileError) {
58
+ return { result: null, files: null, stats: null, error: `Failed to delete file: ${fileError.message}` };
59
+ }
60
+
61
+ case 'exists':
62
+ if (!filePath) {
63
+ return { result: null, files: null, stats: null, error: "Path is required for 'exists' action" };
64
+ }
65
+ const exists = fs.existsSync(filePath);
66
+ return { result: exists ? 'true' : 'false', files: null, stats: null, error: null };
67
+
68
+ case 'stats':
69
+ case 'info':
70
+ if (!filePath) {
71
+ return { result: null, files: null, stats: null, error: "Path is required for 'stats' action" };
72
+ }
73
+ try {
74
+ const fileStats = fs.statSync(filePath);
75
+ const stats = {
76
+ size: fileStats.size,
77
+ isFile: fileStats.isFile(),
78
+ isDirectory: fileStats.isDirectory(),
79
+ modified: fileStats.mtime.toISOString(),
80
+ created: fileStats.birthtime.toISOString(),
81
+ permissions: fileStats.mode.toString(8)
82
+ };
83
+ return { result: null, files: null, stats: stats, error: null };
84
+ } catch (fileError) {
85
+ return { result: null, files: null, stats: null, error: `Failed to get file stats: ${fileError.message}` };
86
+ }
87
+
88
+ case 'list':
89
+ case 'readdir':
90
+ if (!filePath) {
91
+ return { result: null, files: null, stats: null, error: "Path is required for 'list' action" };
92
+ }
93
+ try {
94
+ const items = fs.readdirSync(filePath);
95
+ return { result: null, files: items, stats: null, error: null };
96
+ } catch (fileError) {
97
+ return { result: null, files: null, stats: null, error: `Failed to list directory: ${fileError.message}` };
98
+ }
99
+
100
+ case 'glob':
101
+ case 'find':
102
+ if (!pattern) {
103
+ return { result: null, files: null, stats: null, error: "Pattern is required for 'glob' action" };
104
+ }
105
+ try {
106
+ const matches = glob.sync(pattern);
107
+ return { result: `Found ${matches.length} matches`, files: matches, stats: null, error: null };
108
+ } catch (globError) {
109
+ return { result: null, files: null, stats: null, error: `Glob pattern error: ${globError.message}` };
110
+ }
111
+
112
+ case 'mkdir':
113
+ case 'createdir':
114
+ if (!filePath) {
115
+ return { result: null, files: null, stats: null, error: "Path is required for 'mkdir' action" };
116
+ }
117
+ try {
118
+ fs.mkdirSync(filePath, { recursive: true });
119
+ return { result: `Directory created: ${filePath}`, files: null, stats: null, error: null };
120
+ } catch (fileError) {
121
+ return { result: null, files: null, stats: null, error: `Failed to create directory: ${fileError.message}` };
122
+ }
123
+
124
+ default:
125
+ return {
126
+ result: null,
127
+ files: null,
128
+ stats: null,
129
+ error: `Unknown action: ${action}. Supported actions: read, write, append, delete, exists, stats, list, glob, mkdir`
130
+ };
131
+ }
132
+ } catch (error) {
133
+ return {
134
+ result: null,
135
+ files: null,
136
+ stats: null,
137
+ error: `File System error: ${error.message}`
138
+ };
139
+ }
140
+ }
141
+
142
+ module.exports = { run };
@@ -0,0 +1,25 @@
1
+ {
2
+ "name": "File System",
3
+ "category": "File",
4
+ "color": "#FF9800",
5
+ "ports": [
6
+ { "name": "flowIn", "type": "FlowIn" },
7
+ { "name": "flowOut", "type": "FlowOut" },
8
+ { "name": "action", "type": "Input", "dataType": "string" },
9
+ { "name": "path", "type": "Input", "dataType": "string" },
10
+ { "name": "content", "type": "Input", "dataType": "string" },
11
+ { "name": "pattern", "type": "Input", "dataType": "string" },
12
+ { "name": "encoding", "type": "Input", "dataType": "string" },
13
+ { "name": "result", "type": "Output", "dataType": "string" },
14
+ { "name": "files", "type": "Output", "dataType": "array" },
15
+ { "name": "stats", "type": "Output", "dataType": "object" },
16
+ { "name": "error", "type": "Output", "dataType": "string" }
17
+ ],
18
+ "codeTemplates": {
19
+ "javascript": "fs.readFileSync({path}, {encoding} || 'utf8')",
20
+ "python": "with open({path}, 'r', encoding={encoding} or 'utf-8') as f: content = f.read()",
21
+ "cpp": "std::ifstream file({path}); std::string content((std::istreambuf_iterator<char>(file)), std::istreambuf_iterator<char>());",
22
+ "bash": "cat {path}",
23
+ "powershell": "Get-Content {path} -Encoding ({encoding} || 'UTF8')"
24
+ }
25
+ }
@@ -0,0 +1,12 @@
1
+ {
2
+ "name": "file-system",
3
+ "displayName": "File System Manager",
4
+ "publisher": "cbs-core",
5
+ "version": "1.0.0",
6
+ "main": "index.js",
7
+ "engines": { "cbs": ">=1.1.0" },
8
+ "dependencies": {
9
+ "fs-extra": "^11.1.1",
10
+ "glob": "^10.3.3"
11
+ }
12
+ }
@@ -0,0 +1,164 @@
1
+ const axios = require('axios');
2
+ const WebSocket = require('ws');
3
+
4
+ function run(inputs) {
5
+ try {
6
+ const {
7
+ action,
8
+ url,
9
+ method = 'GET',
10
+ headers = {},
11
+ body,
12
+ timeout = 10000
13
+ } = inputs;
14
+
15
+ switch (action?.toLowerCase()) {
16
+ case 'get':
17
+ case 'post':
18
+ case 'put':
19
+ case 'delete':
20
+ case 'patch':
21
+ if (!url) {
22
+ return { response: null, status: null, data: null, error: "URL is required for HTTP requests" };
23
+ }
24
+
25
+ // For demo purposes, return mock responses
26
+ const mockResponse = {
27
+ status: 200,
28
+ statusText: 'OK',
29
+ headers: {
30
+ 'content-type': 'application/json',
31
+ 'server': 'mock-server'
32
+ },
33
+ data: {
34
+ message: `Mock ${method.toUpperCase()} response from ${url}`,
35
+ timestamp: new Date().toISOString(),
36
+ method: method.toUpperCase(),
37
+ success: true
38
+ }
39
+ };
40
+
41
+ return {
42
+ response: mockResponse,
43
+ status: mockResponse.status,
44
+ data: JSON.stringify(mockResponse.data),
45
+ error: null
46
+ };
47
+
48
+ case 'websocket':
49
+ case 'ws':
50
+ if (!url) {
51
+ return { response: null, status: null, data: null, error: "WebSocket URL is required" };
52
+ }
53
+
54
+ // Mock WebSocket connection
55
+ return {
56
+ response: {
57
+ type: 'websocket',
58
+ url: url,
59
+ status: 'connected',
60
+ message: 'WebSocket mock connection established'
61
+ },
62
+ status: 101,
63
+ data: 'WebSocket connection simulated',
64
+ error: null
65
+ };
66
+
67
+ case 'download':
68
+ if (!url) {
69
+ return { response: null, status: null, data: null, error: "URL is required for download" };
70
+ }
71
+
72
+ // Mock file download
73
+ return {
74
+ response: {
75
+ type: 'download',
76
+ url: url,
77
+ filename: url.split('/').pop() || 'downloaded_file',
78
+ size: 1024,
79
+ mimeType: 'application/octet-stream'
80
+ },
81
+ status: 200,
82
+ data: 'File download simulated (binary data would be here)',
83
+ error: null
84
+ };
85
+
86
+ case 'upload':
87
+ if (!url || !body) {
88
+ return { response: null, status: null, data: null, error: "URL and body are required for upload" };
89
+ }
90
+
91
+ // Mock file upload
92
+ return {
93
+ response: {
94
+ type: 'upload',
95
+ url: url,
96
+ uploaded: true,
97
+ size: body.length,
98
+ message: 'File upload simulated successfully'
99
+ },
100
+ status: 201,
101
+ data: JSON.stringify({ uploaded: true, id: Date.now().toString() }),
102
+ error: null
103
+ };
104
+
105
+ case 'ping':
106
+ if (!url) {
107
+ return { response: null, status: null, data: null, error: "URL is required for ping" };
108
+ }
109
+
110
+ // Mock ping response
111
+ const pingResponse = {
112
+ url: url,
113
+ reachable: true,
114
+ responseTime: Math.floor(Math.random() * 100) + 10,
115
+ timestamp: new Date().toISOString()
116
+ };
117
+
118
+ return {
119
+ response: pingResponse,
120
+ status: 200,
121
+ data: JSON.stringify(pingResponse),
122
+ error: null
123
+ };
124
+
125
+ case 'dns':
126
+ case 'resolve':
127
+ if (!url) {
128
+ return { response: null, status: null, data: null, error: "Host is required for DNS resolution" };
129
+ }
130
+
131
+ // Mock DNS resolution
132
+ const dnsResponse = {
133
+ hostname: url,
134
+ addresses: ['192.168.1.1', '10.0.0.1'],
135
+ resolved: true,
136
+ timestamp: new Date().toISOString()
137
+ };
138
+
139
+ return {
140
+ response: dnsResponse,
141
+ status: 200,
142
+ data: JSON.stringify(dnsResponse),
143
+ error: null
144
+ };
145
+
146
+ default:
147
+ return {
148
+ response: null,
149
+ status: null,
150
+ data: null,
151
+ error: `Unknown action: ${action}. Supported actions: get, post, put, delete, patch, websocket, download, upload, ping, dns`
152
+ };
153
+ }
154
+ } catch (error) {
155
+ return {
156
+ response: null,
157
+ status: null,
158
+ data: null,
159
+ error: `Network API error: ${error.message}`
160
+ };
161
+ }
162
+ }
163
+
164
+ module.exports = { run };