real-browser-mcp-server 1.3.3 → 1.4.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 +96 -9
- package/dist/lib/cjs/index.d.ts +2 -0
- package/dist/lib/cjs/index.d.ts.map +1 -0
- package/dist/lib/cjs/index.js +386 -0
- package/dist/lib/cjs/index.js.map +1 -0
- package/dist/lib/cjs/module/pageController.d.ts +2 -0
- package/dist/lib/cjs/module/pageController.d.ts.map +1 -0
- package/{lib → dist/lib}/cjs/module/pageController.js +28 -29
- package/dist/lib/cjs/module/pageController.js.map +1 -0
- package/dist/lib/cjs/module/turnstile.d.ts +2 -0
- package/dist/lib/cjs/module/turnstile.d.ts.map +1 -0
- package/{lib → dist/lib}/cjs/module/turnstile.js +24 -12
- package/dist/lib/cjs/module/turnstile.js.map +1 -0
- package/dist/src/index.d.ts +11 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.js +118 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/mcp/handlers/browser.d.ts +30 -0
- package/dist/src/mcp/handlers/browser.d.ts.map +1 -0
- package/dist/src/mcp/handlers/browser.js +232 -0
- package/dist/src/mcp/handlers/browser.js.map +1 -0
- package/dist/src/mcp/handlers/dom.d.ts +149 -0
- package/dist/src/mcp/handlers/dom.d.ts.map +1 -0
- package/dist/src/mcp/handlers/dom.js +577 -0
- package/dist/src/mcp/handlers/dom.js.map +1 -0
- package/dist/src/mcp/handlers/extract.d.ts +59 -0
- package/dist/src/mcp/handlers/extract.d.ts.map +1 -0
- package/dist/src/mcp/handlers/extract.js +455 -0
- package/dist/src/mcp/handlers/extract.js.map +1 -0
- package/dist/src/mcp/handlers/form-handlers.d.ts +9 -0
- package/dist/src/mcp/handlers/form-handlers.d.ts.map +1 -0
- package/dist/src/mcp/handlers/form-handlers.js +56 -0
- package/dist/src/mcp/handlers/form-handlers.js.map +1 -0
- package/dist/src/mcp/handlers/helpers.d.ts +47 -0
- package/dist/src/mcp/handlers/helpers.d.ts.map +1 -0
- package/dist/src/mcp/handlers/helpers.js +515 -0
- package/dist/src/mcp/handlers/helpers.js.map +1 -0
- package/dist/src/mcp/handlers/index.d.ts +6 -0
- package/dist/src/mcp/handlers/index.d.ts.map +1 -0
- package/dist/src/mcp/handlers/index.js +61 -0
- package/dist/src/mcp/handlers/index.js.map +1 -0
- package/dist/src/mcp/handlers/media-handlers.d.ts +10 -0
- package/dist/src/mcp/handlers/media-handlers.d.ts.map +1 -0
- package/dist/src/mcp/handlers/media-handlers.js +535 -0
- package/dist/src/mcp/handlers/media-handlers.js.map +1 -0
- package/dist/src/mcp/handlers/network.d.ts +147 -0
- package/dist/src/mcp/handlers/network.d.ts.map +1 -0
- package/dist/src/mcp/handlers/network.js +1135 -0
- package/dist/src/mcp/handlers/network.js.map +1 -0
- package/dist/src/mcp/handlers/state.d.ts +34 -0
- package/dist/src/mcp/handlers/state.d.ts.map +1 -0
- package/dist/src/mcp/handlers/state.js +226 -0
- package/dist/src/mcp/handlers/state.js.map +1 -0
- package/dist/src/mcp/handlers/utility-handlers.d.ts +167 -0
- package/dist/src/mcp/handlers/utility-handlers.d.ts.map +1 -0
- package/dist/src/mcp/handlers/utility-handlers.js +280 -0
- package/dist/src/mcp/handlers/utility-handlers.js.map +1 -0
- package/dist/src/mcp/handlers/vision.d.ts +127 -0
- package/dist/src/mcp/handlers/vision.d.ts.map +1 -0
- package/dist/src/mcp/handlers/vision.js +549 -0
- package/dist/src/mcp/handlers/vision.js.map +1 -0
- package/dist/src/mcp/index.d.ts +3 -0
- package/dist/src/mcp/index.d.ts.map +1 -0
- package/dist/src/mcp/index.js +166 -0
- package/dist/src/mcp/index.js.map +1 -0
- package/dist/src/mcp/server.d.ts +2 -0
- package/dist/src/mcp/server.d.ts.map +1 -0
- package/dist/src/mcp/server.js +117 -0
- package/dist/src/mcp/server.js.map +1 -0
- package/dist/src/mcp/tools.d.ts +8 -0
- package/dist/src/mcp/tools.d.ts.map +1 -0
- package/{src → dist/src}/mcp/tools.js +12 -11
- package/dist/src/mcp/tools.js.map +1 -0
- package/dist/src/shared/cache-manager.d.ts +80 -0
- package/dist/src/shared/cache-manager.d.ts.map +1 -0
- package/dist/src/shared/cache-manager.js +221 -0
- package/dist/src/shared/cache-manager.js.map +1 -0
- package/dist/src/shared/tools.d.ts +2 -0
- package/dist/src/shared/tools.d.ts.map +1 -0
- package/dist/src/shared/tools.js +606 -0
- package/dist/src/shared/tools.js.map +1 -0
- package/dist/src/types.d.ts +376 -0
- package/dist/src/types.d.ts.map +1 -0
- package/dist/src/types.js +9 -0
- package/dist/src/types.js.map +1 -0
- package/dist/test/cjs/test.d.ts +11 -0
- package/dist/test/cjs/test.d.ts.map +1 -0
- package/dist/test/cjs/test.js +289 -0
- package/dist/test/cjs/test.js.map +1 -0
- package/dist/test/mcp/smoke-test.d.ts +29 -0
- package/dist/test/mcp/smoke-test.d.ts.map +1 -0
- package/dist/test/mcp/smoke-test.js +132 -0
- package/dist/test/mcp/smoke-test.js.map +1 -0
- package/lib/esm/index.mjs +230 -154
- package/lib/esm/module/pageController.mjs +21 -18
- package/lib/esm/module/turnstile.mjs +7 -0
- package/package.json +25 -16
- package/typings.d.ts +7 -1
- package/.github/ISSUE_TEMPLATE/general_issue.yaml +0 -58
- package/.github/SETUP.md +0 -111
- package/.github/workflows/publish.yml +0 -135
- package/Dockerfile +0 -79
- package/lib/cjs/adblocker.bin +0 -0
- package/lib/cjs/index.js +0 -321
- package/src/ai/action-parser.js +0 -274
- package/src/ai/core.js +0 -378
- package/src/ai/element-finder.js +0 -466
- package/src/ai/index.js +0 -82
- package/src/ai/page-analyzer.js +0 -304
- package/src/ai/selector-healer.js +0 -236
- package/src/index.js +0 -121
- package/src/mcp/handlers.js +0 -5071
- package/src/mcp/index.js +0 -190
- package/src/mcp/server.js +0 -144
- package/src/shared/tools.js +0 -618
- package/test/cjs/test.js +0 -259
- package/test/esm/package.json +0 -13
- package/test/esm/test.js +0 -226
package/src/mcp/index.js
DELETED
|
@@ -1,190 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
// CRITICAL: Redirect ALL console.log to STDERR BEFORE any imports.
|
|
3
|
-
// MCP uses STDIO transport — STDOUT must contain ONLY JSON-RPC messages.
|
|
4
|
-
// Any console.log from ANY dependency will corrupt the JSON-RPC stream.
|
|
5
|
-
console.log = function (...args) { console.error(...args); };
|
|
6
|
-
|
|
7
|
-
/**
|
|
8
|
-
* Brave Real Browser MCP Server - Entry Point
|
|
9
|
-
*
|
|
10
|
-
* Usage:
|
|
11
|
-
* npm run dev - Start MCP server
|
|
12
|
-
* npm run mcp - Start MCP server (alias)
|
|
13
|
-
*
|
|
14
|
-
* For AI Assistants:
|
|
15
|
-
* Claude Desktop, Cursor, Copilot, etc.
|
|
16
|
-
*/
|
|
17
|
-
|
|
18
|
-
const { TOOL_DISPLAY } = require('./tools.js');
|
|
19
|
-
const { startServer, shutdownServer } = require('./server.js');
|
|
20
|
-
const { cleanup } = require('./handlers.js');
|
|
21
|
-
|
|
22
|
-
// ANSI colors for terminal
|
|
23
|
-
const colors = {
|
|
24
|
-
reset: '\x1b[0m',
|
|
25
|
-
bright: '\x1b[1m',
|
|
26
|
-
dim: '\x1b[2m',
|
|
27
|
-
green: '\x1b[32m',
|
|
28
|
-
yellow: '\x1b[33m',
|
|
29
|
-
blue: '\x1b[34m',
|
|
30
|
-
magenta: '\x1b[35m',
|
|
31
|
-
cyan: '\x1b[36m',
|
|
32
|
-
red: '\x1b[31m',
|
|
33
|
-
};
|
|
34
|
-
|
|
35
|
-
/**
|
|
36
|
-
* Display startup banner and tools
|
|
37
|
-
*/
|
|
38
|
-
function displayStartupBanner() {
|
|
39
|
-
console.error('');
|
|
40
|
-
console.error(`${colors.bright}${colors.cyan}╔════════════════════════════════════════════════════════════╗${colors.reset}`);
|
|
41
|
-
console.error(`${colors.bright}${colors.cyan}║${colors.reset} ${colors.bright}${colors.magenta}🦁 Real Browser MCP Server${colors.reset} ${colors.cyan}║${colors.reset}`);
|
|
42
|
-
console.error(`${colors.bright}${colors.cyan}║${colors.reset} ${colors.dim}Playwright + Patchright + Stealth + Turnstile${colors.reset} ${colors.cyan}║${colors.reset}`);
|
|
43
|
-
console.error(`${colors.bright}${colors.cyan}╚════════════════════════════════════════════════════════════╝${colors.reset}`);
|
|
44
|
-
console.error('');
|
|
45
|
-
|
|
46
|
-
console.error(`${colors.bright}${colors.green}📦 Available Tools (${TOOL_DISPLAY.length}):${colors.reset}`);
|
|
47
|
-
console.error(`${colors.dim}${'─'.repeat(60)}${colors.reset}`);
|
|
48
|
-
|
|
49
|
-
// Display tools in 2 columns
|
|
50
|
-
const half = Math.ceil(TOOL_DISPLAY.length / 2);
|
|
51
|
-
|
|
52
|
-
for (let i = 0; i < half; i++) {
|
|
53
|
-
const left = TOOL_DISPLAY[i];
|
|
54
|
-
const right = TOOL_DISPLAY[i + half];
|
|
55
|
-
|
|
56
|
-
const leftStr = left
|
|
57
|
-
? `${left.emoji} ${colors.yellow}${left.name.padEnd(22)}${colors.reset}`
|
|
58
|
-
: '';
|
|
59
|
-
const rightStr = right
|
|
60
|
-
? `${right.emoji} ${colors.yellow}${right.name}${colors.reset}`
|
|
61
|
-
: '';
|
|
62
|
-
|
|
63
|
-
console.error(` ${leftStr}${rightStr}`);
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
console.error(`${colors.dim}${'─'.repeat(60)}${colors.reset}`);
|
|
67
|
-
console.error('');
|
|
68
|
-
// Fetch SDK version dynamically
|
|
69
|
-
let sdkVersion = 'Latest';
|
|
70
|
-
try {
|
|
71
|
-
const pkgPath = require('path').join(__dirname, '..', '..', 'package.json');
|
|
72
|
-
const pkg = require('fs').readFileSync(pkgPath, 'utf8');
|
|
73
|
-
const deps = JSON.parse(pkg).dependencies || {};
|
|
74
|
-
if (deps['@modelcontextprotocol/sdk']) {
|
|
75
|
-
sdkVersion = deps['@modelcontextprotocol/sdk'].replace(/[\^~]/g, '');
|
|
76
|
-
}
|
|
77
|
-
} catch (e) { /* ignore */ }
|
|
78
|
-
|
|
79
|
-
console.error(`${colors.bright}${colors.blue}🔗 Transport:${colors.reset} STDIO (for MCP clients)`);
|
|
80
|
-
console.error(`${colors.bright}${colors.blue}📡 Protocol:${colors.reset} Model Context Protocol (SDK v${sdkVersion})`);
|
|
81
|
-
console.error('');
|
|
82
|
-
console.error(`${colors.dim}Press CTRL+C to stop the server${colors.reset}`);
|
|
83
|
-
console.error('');
|
|
84
|
-
}
|
|
85
|
-
|
|
86
|
-
/**
|
|
87
|
-
* Display tool details (verbose mode)
|
|
88
|
-
*/
|
|
89
|
-
function displayToolDetails() {
|
|
90
|
-
console.error(`${colors.bright}${colors.green}📋 Tool Details:${colors.reset}`);
|
|
91
|
-
console.error('');
|
|
92
|
-
|
|
93
|
-
for (const tool of TOOL_DISPLAY) {
|
|
94
|
-
console.error(` ${tool.emoji} ${colors.bright}${colors.yellow}${tool.name}${colors.reset}`);
|
|
95
|
-
console.error(` ${colors.dim}${tool.description}${colors.reset}`);
|
|
96
|
-
if (tool.descriptionHindi) {
|
|
97
|
-
console.error(` ${colors.dim}(${tool.descriptionHindi})${colors.reset}`);
|
|
98
|
-
}
|
|
99
|
-
console.error('');
|
|
100
|
-
}
|
|
101
|
-
}
|
|
102
|
-
|
|
103
|
-
/**
|
|
104
|
-
* Setup graceful shutdown handlers
|
|
105
|
-
*/
|
|
106
|
-
function setupShutdownHandlers(server) {
|
|
107
|
-
let isShuttingDown = false;
|
|
108
|
-
|
|
109
|
-
const gracefulShutdown = async (signal) => {
|
|
110
|
-
if (isShuttingDown) return;
|
|
111
|
-
isShuttingDown = true;
|
|
112
|
-
|
|
113
|
-
console.error('');
|
|
114
|
-
console.error(`${colors.bright}${colors.yellow}🧹 Cleanup in progress...${colors.reset}`);
|
|
115
|
-
|
|
116
|
-
try {
|
|
117
|
-
await cleanup();
|
|
118
|
-
console.error(`${colors.bright}${colors.green}✅ Browser closed${colors.reset}`);
|
|
119
|
-
} catch (e) {
|
|
120
|
-
console.error(`${colors.dim}Browser already closed${colors.reset}`);
|
|
121
|
-
}
|
|
122
|
-
|
|
123
|
-
try {
|
|
124
|
-
await shutdownServer(server);
|
|
125
|
-
console.error(`${colors.bright}${colors.green}✅ MCP Server stopped${colors.reset}`);
|
|
126
|
-
} catch (e) {
|
|
127
|
-
// Server may already be closed
|
|
128
|
-
}
|
|
129
|
-
|
|
130
|
-
console.error(`${colors.bright}${colors.magenta}👋 Goodbye!${colors.reset}`);
|
|
131
|
-
console.error('');
|
|
132
|
-
|
|
133
|
-
process.exit(0);
|
|
134
|
-
};
|
|
135
|
-
|
|
136
|
-
// Handle various termination signals
|
|
137
|
-
process.on('SIGINT', () => gracefulShutdown('SIGINT'));
|
|
138
|
-
process.on('SIGTERM', () => gracefulShutdown('SIGTERM'));
|
|
139
|
-
process.on('SIGHUP', () => gracefulShutdown('SIGHUP'));
|
|
140
|
-
|
|
141
|
-
// Handle uncaught errors
|
|
142
|
-
process.on('uncaughtException', async (error) => {
|
|
143
|
-
console.error(`${colors.bright}${colors.red}❌ Uncaught Exception:${colors.reset}`, error.message);
|
|
144
|
-
await gracefulShutdown('error');
|
|
145
|
-
});
|
|
146
|
-
|
|
147
|
-
process.on('unhandledRejection', async (reason) => {
|
|
148
|
-
console.error(`${colors.bright}${colors.red}❌ Unhandled Rejection:${colors.reset}`, reason);
|
|
149
|
-
await gracefulShutdown('error');
|
|
150
|
-
});
|
|
151
|
-
}
|
|
152
|
-
|
|
153
|
-
/**
|
|
154
|
-
* Main entry point
|
|
155
|
-
*/
|
|
156
|
-
async function main() {
|
|
157
|
-
// Check for verbose flag
|
|
158
|
-
const verbose = process.argv.includes('--verbose') || process.argv.includes('-v');
|
|
159
|
-
|
|
160
|
-
// Display startup info
|
|
161
|
-
displayStartupBanner();
|
|
162
|
-
|
|
163
|
-
if (verbose) {
|
|
164
|
-
displayToolDetails();
|
|
165
|
-
}
|
|
166
|
-
|
|
167
|
-
try {
|
|
168
|
-
// Start MCP server
|
|
169
|
-
console.error(`${colors.bright}${colors.green}🚀 Starting MCP Server...${colors.reset}`);
|
|
170
|
-
|
|
171
|
-
const { server } = await startServer();
|
|
172
|
-
|
|
173
|
-
console.error(`${colors.bright}${colors.green}✅ MCP Server running${colors.reset}`);
|
|
174
|
-
console.error(`${colors.dim}Waiting for client connections via STDIO...${colors.reset}`);
|
|
175
|
-
console.error('');
|
|
176
|
-
|
|
177
|
-
// Setup shutdown handlers
|
|
178
|
-
setupShutdownHandlers(server);
|
|
179
|
-
|
|
180
|
-
} catch (error) {
|
|
181
|
-
console.error(`${colors.bright}${colors.red}❌ Failed to start server:${colors.reset}`, error.message);
|
|
182
|
-
process.exit(1);
|
|
183
|
-
}
|
|
184
|
-
}
|
|
185
|
-
|
|
186
|
-
// Run main
|
|
187
|
-
main().catch(error => {
|
|
188
|
-
console.error(`${colors.bright}${colors.red}❌ Fatal error:${colors.reset}`, error.message);
|
|
189
|
-
process.exit(1);
|
|
190
|
-
});
|
package/src/mcp/server.js
DELETED
|
@@ -1,144 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Brave Real Browser MCP Server
|
|
3
|
-
*
|
|
4
|
-
* Model Context Protocol Server with STDIO Transport
|
|
5
|
-
* Supports: Claude, Cursor, Copilot, and other MCP-compatible AI assistants
|
|
6
|
-
*/
|
|
7
|
-
|
|
8
|
-
// CRITICAL: Redirect ALL console.log to STDERR before ANY imports
|
|
9
|
-
// MCP uses STDIO transport — STDOUT must contain ONLY JSON-RPC messages.
|
|
10
|
-
// Any console.log from this code or ANY dependency (browser, blocker, etc.)
|
|
11
|
-
// will corrupt the JSON-RPC stream and cause parsing errors.
|
|
12
|
-
const _originalConsoleLog = console.log;
|
|
13
|
-
console.log = function (...args) {
|
|
14
|
-
console.error(...args);
|
|
15
|
-
};
|
|
16
|
-
|
|
17
|
-
const { Server } = require('@modelcontextprotocol/sdk/server/index.js');
|
|
18
|
-
const { StdioServerTransport } = require('@modelcontextprotocol/sdk/server/stdio.js');
|
|
19
|
-
const {
|
|
20
|
-
CallToolRequestSchema,
|
|
21
|
-
ListToolsRequestSchema,
|
|
22
|
-
ErrorCode,
|
|
23
|
-
McpError,
|
|
24
|
-
} = require('@modelcontextprotocol/sdk/types.js');
|
|
25
|
-
|
|
26
|
-
const { TOOLS } = require('./tools.js');
|
|
27
|
-
const { executeTool, cleanup } = require('./handlers.js');
|
|
28
|
-
|
|
29
|
-
/**
|
|
30
|
-
* Create and configure MCP Server
|
|
31
|
-
*/
|
|
32
|
-
function createServer() {
|
|
33
|
-
const server = new Server(
|
|
34
|
-
{
|
|
35
|
-
name: 'real-browser-mcp-server',
|
|
36
|
-
version: '2.48.36',
|
|
37
|
-
},
|
|
38
|
-
{
|
|
39
|
-
capabilities: {
|
|
40
|
-
tools: {},
|
|
41
|
-
},
|
|
42
|
-
}
|
|
43
|
-
);
|
|
44
|
-
|
|
45
|
-
// Handle list tools request
|
|
46
|
-
server.setRequestHandler(ListToolsRequestSchema, async () => {
|
|
47
|
-
return {
|
|
48
|
-
tools: TOOLS.map(tool => ({
|
|
49
|
-
name: tool.name,
|
|
50
|
-
description: `${tool.emoji} ${tool.description}`,
|
|
51
|
-
inputSchema: tool.inputSchema,
|
|
52
|
-
})),
|
|
53
|
-
};
|
|
54
|
-
});
|
|
55
|
-
|
|
56
|
-
// Handle call tool request
|
|
57
|
-
server.setRequestHandler(CallToolRequestSchema, async (request) => {
|
|
58
|
-
const { name, arguments: args } = request.params;
|
|
59
|
-
|
|
60
|
-
// Find tool definition
|
|
61
|
-
const tool = TOOLS.find(t => t.name === name);
|
|
62
|
-
if (!tool) {
|
|
63
|
-
throw new McpError(
|
|
64
|
-
ErrorCode.MethodNotFound,
|
|
65
|
-
`Unknown tool: ${name}`
|
|
66
|
-
);
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
try {
|
|
70
|
-
// Execute the tool
|
|
71
|
-
const result = await executeTool(name, args || {});
|
|
72
|
-
|
|
73
|
-
// Format response
|
|
74
|
-
if (result.success === false && result.error) {
|
|
75
|
-
return {
|
|
76
|
-
content: [
|
|
77
|
-
{
|
|
78
|
-
type: 'text',
|
|
79
|
-
text: JSON.stringify({ error: result.error }, null, 2),
|
|
80
|
-
},
|
|
81
|
-
],
|
|
82
|
-
isError: true,
|
|
83
|
-
};
|
|
84
|
-
}
|
|
85
|
-
|
|
86
|
-
if (result.mcpContent) {
|
|
87
|
-
return { content: result.mcpContent };
|
|
88
|
-
}
|
|
89
|
-
|
|
90
|
-
return {
|
|
91
|
-
content: [
|
|
92
|
-
{
|
|
93
|
-
type: 'text',
|
|
94
|
-
text: JSON.stringify(result, null, 2),
|
|
95
|
-
},
|
|
96
|
-
],
|
|
97
|
-
};
|
|
98
|
-
} catch (error) {
|
|
99
|
-
return {
|
|
100
|
-
content: [
|
|
101
|
-
{
|
|
102
|
-
type: 'text',
|
|
103
|
-
text: JSON.stringify({ error: error.message }, null, 2),
|
|
104
|
-
},
|
|
105
|
-
],
|
|
106
|
-
isError: true,
|
|
107
|
-
};
|
|
108
|
-
}
|
|
109
|
-
});
|
|
110
|
-
|
|
111
|
-
return server;
|
|
112
|
-
}
|
|
113
|
-
|
|
114
|
-
/**
|
|
115
|
-
* Start MCP Server with STDIO transport
|
|
116
|
-
*/
|
|
117
|
-
async function startServer() {
|
|
118
|
-
const server = createServer();
|
|
119
|
-
const transport = new StdioServerTransport();
|
|
120
|
-
|
|
121
|
-
// Connect server to transport
|
|
122
|
-
await server.connect(transport);
|
|
123
|
-
|
|
124
|
-
return { server, transport };
|
|
125
|
-
}
|
|
126
|
-
|
|
127
|
-
/**
|
|
128
|
-
* Graceful shutdown
|
|
129
|
-
*/
|
|
130
|
-
async function shutdownServer(server) {
|
|
131
|
-
// Cleanup browser resources
|
|
132
|
-
await cleanup();
|
|
133
|
-
|
|
134
|
-
// Close server
|
|
135
|
-
if (server) {
|
|
136
|
-
await server.close();
|
|
137
|
-
}
|
|
138
|
-
}
|
|
139
|
-
|
|
140
|
-
module.exports = {
|
|
141
|
-
createServer,
|
|
142
|
-
startServer,
|
|
143
|
-
shutdownServer,
|
|
144
|
-
};
|