farm-runner 1.1.0 → 1.1.3
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/dist/src/bundle.js +1 -1
- package/package.json +3 -2
- package/dist/src/common/middleware/trace.middleware.d.ts.map +0 -1
- package/dist/src/common/middleware/trace.middleware.js +0 -56
- package/dist/src/common/middleware/trace.middleware.js.map +0 -1
- package/dist/src/server.d.ts.map +0 -1
- package/dist/src/server.js +0 -394
- package/dist/src/server.js.map +0 -1
- package/dist/src/services/tracingUtils.d.ts.map +0 -1
- package/dist/src/services/tracingUtils.js +0 -73
- package/dist/src/services/tracingUtils.js.map +0 -1
- package/dist/tsconfig.tsbuildinfo +0 -1
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "farm-runner",
|
|
3
|
-
"version": "1.1.
|
|
3
|
+
"version": "1.1.3",
|
|
4
4
|
"description": "Node package with Express server",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
@@ -103,6 +103,7 @@
|
|
|
103
103
|
"webpack-shebang-plugin": "^1.1.8"
|
|
104
104
|
},
|
|
105
105
|
"files": [
|
|
106
|
-
"dist"
|
|
106
|
+
"dist/src/bundle.js",
|
|
107
|
+
"dist/src/scripts"
|
|
107
108
|
]
|
|
108
109
|
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"trace.middleware.d.ts","sourceRoot":"","sources":["../../../../src/common/middleware/trace.middleware.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAI1D;;GAEG;AACH,MAAM,WAAW,YAAa,SAAQ,OAAO;IAC3C,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;;;GAIG;AACH,eAAO,MAAM,eAAe,GAAI,KAAK,OAAO,EAAE,KAAK,QAAQ,EAAE,MAAM,YAAY,KAAG,IAwDjF,CAAC"}
|
|
@@ -1,56 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.traceMiddleware = void 0;
|
|
4
|
-
const api_1 = require("@opentelemetry/api");
|
|
5
|
-
const trace_utils_1 = require("../utils/trace.utils");
|
|
6
|
-
/**
|
|
7
|
-
* Middleware to extract or generate trace ID from request
|
|
8
|
-
* Uses OpenTelemetry context propagation for distributed tracing
|
|
9
|
-
* Also maintains backward compatibility with traceId on request object
|
|
10
|
-
*/
|
|
11
|
-
const traceMiddleware = (req, res, next) => {
|
|
12
|
-
// Extract trace context from headers (W3C Trace Context format)
|
|
13
|
-
const parentContext = api_1.propagation.extract(api_1.context.active(), req.headers);
|
|
14
|
-
// Start a new span for this request
|
|
15
|
-
const tracer = api_1.trace.getTracer('farm-runner');
|
|
16
|
-
const span = tracer.startSpan(`${req.method} ${req.path}`, {
|
|
17
|
-
kind: 1, // SpanKind.SERVER
|
|
18
|
-
attributes: {
|
|
19
|
-
'http.method': req.method,
|
|
20
|
-
'http.url': req.url,
|
|
21
|
-
'http.route': req.route?.path || req.path,
|
|
22
|
-
'http.target': req.path,
|
|
23
|
-
},
|
|
24
|
-
}, parentContext);
|
|
25
|
-
// Set span context as active
|
|
26
|
-
api_1.context.with(api_1.trace.setSpan(parentContext, span), () => {
|
|
27
|
-
// Extract trace ID for backward compatibility
|
|
28
|
-
const traceRequest = req;
|
|
29
|
-
const spanContextData = span.spanContext();
|
|
30
|
-
const traceId = spanContextData.traceId;
|
|
31
|
-
// Set traceId on request for backward compatibility
|
|
32
|
-
traceRequest.traceId = traceId;
|
|
33
|
-
// Set trace ID in response header (W3C Trace Context format)
|
|
34
|
-
const traceParent = `00-${spanContextData.traceId}-${spanContextData.spanId}-0${spanContextData.traceFlags.toString(16).padStart(2, '0')}`;
|
|
35
|
-
res.setHeader('traceparent', traceParent);
|
|
36
|
-
// Also set X-Trace-Id for backward compatibility
|
|
37
|
-
(0, trace_utils_1.setTraceIdHeader)(res, traceId);
|
|
38
|
-
// Handle request completion
|
|
39
|
-
res.on('finish', () => {
|
|
40
|
-
span.setAttributes({
|
|
41
|
-
'http.status_code': res.statusCode,
|
|
42
|
-
'http.status_text': res.statusMessage || '',
|
|
43
|
-
});
|
|
44
|
-
if (res.statusCode >= 400) {
|
|
45
|
-
span.setStatus({
|
|
46
|
-
code: res.statusCode >= 500 ? api_1.SpanStatusCode.ERROR : api_1.SpanStatusCode.ERROR,
|
|
47
|
-
message: `HTTP ${res.statusCode}`,
|
|
48
|
-
});
|
|
49
|
-
}
|
|
50
|
-
span.end();
|
|
51
|
-
});
|
|
52
|
-
next();
|
|
53
|
-
});
|
|
54
|
-
};
|
|
55
|
-
exports.traceMiddleware = traceMiddleware;
|
|
56
|
-
//# sourceMappingURL=trace.middleware.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"trace.middleware.js","sourceRoot":"","sources":["../../../../src/common/middleware/trace.middleware.ts"],"names":[],"mappings":";;;AAAA,4CAAiF;AAGjF,sDAAwD;AASxD;;;;GAIG;AACI,MAAM,eAAe,GAAG,CAAC,GAAY,EAAE,GAAa,EAAE,IAAkB,EAAQ,EAAE;IACvF,gEAAgE;IAChE,MAAM,aAAa,GAAG,iBAAW,CAAC,OAAO,CAAC,aAAO,CAAC,MAAM,EAAE,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC;IAEzE,oCAAoC;IACpC,MAAM,MAAM,GAAG,WAAK,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC;IAC9C,MAAM,IAAI,GAAG,MAAM,CAAC,SAAS,CAC3B,GAAG,GAAG,CAAC,MAAM,IAAI,GAAG,CAAC,IAAI,EAAE,EAC3B;QACE,IAAI,EAAE,CAAC,EAAE,kBAAkB;QAC3B,UAAU,EAAE;YACV,aAAa,EAAE,GAAG,CAAC,MAAM;YACzB,UAAU,EAAE,GAAG,CAAC,GAAG;YACnB,YAAY,EAAE,GAAG,CAAC,KAAK,EAAE,IAAI,IAAI,GAAG,CAAC,IAAI;YACzC,aAAa,EAAE,GAAG,CAAC,IAAI;SACxB;KACF,EACD,aAAa,CACd,CAAC;IAEF,6BAA6B;IAC7B,aAAO,CAAC,IAAI,CAAC,WAAK,CAAC,OAAO,CAAC,aAAa,EAAE,IAAI,CAAC,EAAE,GAAG,EAAE;QACpD,8CAA8C;QAC9C,MAAM,YAAY,GAAG,GAAmB,CAAC;QACzC,MAAM,eAAe,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;QAC3C,MAAM,OAAO,GAAG,eAAe,CAAC,OAAO,CAAC;QAExC,oDAAoD;QACpD,YAAY,CAAC,OAAO,GAAG,OAAO,CAAC;QAE/B,6DAA6D;QAC7D,MAAM,WAAW,GAAG,MAAM,eAAe,CAAC,OAAO,IAAI,eAAe,CAAC,MAAM,KAAK,eAAe,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC;QAC3I,GAAG,CAAC,SAAS,CAAC,aAAa,EAAE,WAAW,CAAC,CAAC;QAE1C,iDAAiD;QACjD,IAAA,8BAAgB,EAAC,GAAG,EAAE,OAAO,CAAC,CAAC;QAE/B,4BAA4B;QAC5B,GAAG,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE;YACpB,IAAI,CAAC,aAAa,CAAC;gBACjB,kBAAkB,EAAE,GAAG,CAAC,UAAU;gBAClC,kBAAkB,EAAE,GAAG,CAAC,aAAa,IAAI,EAAE;aAC5C,CAAC,CAAC;YAEH,IAAI,GAAG,CAAC,UAAU,IAAI,GAAG,EAAE,CAAC;gBAC1B,IAAI,CAAC,SAAS,CAAC;oBACb,IAAI,EAAE,GAAG,CAAC,UAAU,IAAI,GAAG,CAAC,CAAC,CAAC,oBAAc,CAAC,KAAK,CAAC,CAAC,CAAC,oBAAc,CAAC,KAAK;oBACzE,OAAO,EAAE,QAAQ,GAAG,CAAC,UAAU,EAAE;iBAClC,CAAC,CAAC;YACL,CAAC;YAED,IAAI,CAAC,GAAG,EAAE,CAAC;QACb,CAAC,CAAC,CAAC;QAEH,IAAI,EAAE,CAAC;IACT,CAAC,CAAC,CAAC;AACL,CAAC,CAAC;AAxDW,QAAA,eAAe,mBAwD1B"}
|
package/dist/src/server.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/server.ts"],"names":[],"mappings":""}
|
package/dist/src/server.js
DELETED
|
@@ -1,394 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
-
if (k2 === undefined) k2 = k;
|
|
4
|
-
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
-
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
-
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
-
}
|
|
8
|
-
Object.defineProperty(o, k2, desc);
|
|
9
|
-
}) : (function(o, m, k, k2) {
|
|
10
|
-
if (k2 === undefined) k2 = k;
|
|
11
|
-
o[k2] = m[k];
|
|
12
|
-
}));
|
|
13
|
-
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
-
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
-
}) : function(o, v) {
|
|
16
|
-
o["default"] = v;
|
|
17
|
-
});
|
|
18
|
-
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
-
var ownKeys = function(o) {
|
|
20
|
-
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
-
var ar = [];
|
|
22
|
-
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
-
return ar;
|
|
24
|
-
};
|
|
25
|
-
return ownKeys(o);
|
|
26
|
-
};
|
|
27
|
-
return function (mod) {
|
|
28
|
-
if (mod && mod.__esModule) return mod;
|
|
29
|
-
var result = {};
|
|
30
|
-
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
-
__setModuleDefault(result, mod);
|
|
32
|
-
return result;
|
|
33
|
-
};
|
|
34
|
-
})();
|
|
35
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
36
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
37
|
-
};
|
|
38
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
-
/* eslint-disable import/order */
|
|
40
|
-
const path_1 = __importDefault(require("path"));
|
|
41
|
-
const dotenv_1 = __importDefault(require("dotenv"));
|
|
42
|
-
const express_1 = __importDefault(require("express"));
|
|
43
|
-
const trace_middleware_1 = require("./common/middleware/trace.middleware");
|
|
44
|
-
const observability_1 = require("./common/observability");
|
|
45
|
-
const node_config_1 = require("./config/node.config");
|
|
46
|
-
const androidDeviceManager_service_1 = require("./services/androidDeviceManager.service");
|
|
47
|
-
const deviceHub_service_1 = require("./services/deviceHub.service");
|
|
48
|
-
const iosDeviceManager_service_1 = require("./services/iosDeviceManager.service");
|
|
49
|
-
const registration_service_1 = require("./services/registration.service");
|
|
50
|
-
const websocketHeartbeat_service_1 = require("./services/websocketHeartbeat.service");
|
|
51
|
-
const cache_1 = require("./utils/cache");
|
|
52
|
-
const logger_1 = __importDefault(require("./utils/logger"));
|
|
53
|
-
const os_1 = require("./utils/os");
|
|
54
|
-
dotenv_1.default.config({ path: path_1.default.resolve(__dirname, '../../../.env') });
|
|
55
|
-
// Initialize OpenTelemetry
|
|
56
|
-
(0, observability_1.initializeTelemetry)({
|
|
57
|
-
serviceName: 'farm-runner',
|
|
58
|
-
serviceVersion: process.env.npm_package_version || '1.0.0',
|
|
59
|
-
enabled: process.env.OTEL_SDK_DISABLED !== 'true',
|
|
60
|
-
traceEnabled: process.env.OTEL_TRACES_ENABLED !== 'false',
|
|
61
|
-
logEnabled: process.env.OTEL_LOGS_ENABLED !== 'false',
|
|
62
|
-
});
|
|
63
|
-
const index_1 = require("./index");
|
|
64
|
-
const app = (0, express_1.default)();
|
|
65
|
-
const PORT = parseInt(process.env.NODE_PORT || '3003', 10);
|
|
66
|
-
// Default port range for free ports (can be made configurable via config file or env vars later)
|
|
67
|
-
const DEFAULT_PORT_RANGE = { min: 8900, max: 8999 };
|
|
68
|
-
// Middleware
|
|
69
|
-
app.use(express_1.default.json());
|
|
70
|
-
app.use(express_1.default.urlencoded({ extended: true }));
|
|
71
|
-
// Trace middleware (must be after body parsing, before routes)
|
|
72
|
-
app.use(trace_middleware_1.traceMiddleware);
|
|
73
|
-
// Health check endpoint
|
|
74
|
-
app.get('/health', (_req, res) => {
|
|
75
|
-
res.json({ status: 'ok', timestamp: new Date().toISOString() });
|
|
76
|
-
});
|
|
77
|
-
// Register routes
|
|
78
|
-
const apiRouter = express_1.default.Router();
|
|
79
|
-
(0, index_1.registerRoutes)(apiRouter);
|
|
80
|
-
app.use('/api', apiRouter);
|
|
81
|
-
// Register WebDriver routes (Appium endpoints)
|
|
82
|
-
const wdRouter = express_1.default.Router();
|
|
83
|
-
(0, index_1.registerWebDriverRoutes)(wdRouter);
|
|
84
|
-
app.use('/', wdRouter);
|
|
85
|
-
// WebSocket heartbeat service instance (will be initialized after registration)
|
|
86
|
-
let heartbeatService = null;
|
|
87
|
-
// Android device manager instance
|
|
88
|
-
let androidDeviceManager = null;
|
|
89
|
-
// iOS device manager instance
|
|
90
|
-
let iosDeviceManager = null;
|
|
91
|
-
// Device hub service instance
|
|
92
|
-
let deviceHubService = null;
|
|
93
|
-
/**
|
|
94
|
-
* Register node with hub before starting server
|
|
95
|
-
*/
|
|
96
|
-
async function registerWithHub() {
|
|
97
|
-
const config = (0, node_config_1.getMergedConfig)();
|
|
98
|
-
// Check if required config is present
|
|
99
|
-
const hubUrl = config.hubUrl;
|
|
100
|
-
const accessKey = config.accessKey;
|
|
101
|
-
const token = config.token;
|
|
102
|
-
if (!hubUrl || !accessKey || !token) {
|
|
103
|
-
console.warn('⚠️ Hub registration skipped: Missing required configuration');
|
|
104
|
-
console.warn(' Required: hubUrl, accessKey, token');
|
|
105
|
-
console.warn(' Provide via: CLI args, config file (node.config.json), or environment variables');
|
|
106
|
-
console.warn(' Example: npm run start:node -- --hub-url http://localhost:3000 --access-key KEY --token TOKEN');
|
|
107
|
-
return undefined;
|
|
108
|
-
}
|
|
109
|
-
try {
|
|
110
|
-
const configPath = (0, node_config_1.getConfigPathFromCLI)();
|
|
111
|
-
if (configPath) {
|
|
112
|
-
console.log(`📋 Using config file: ${configPath}`);
|
|
113
|
-
}
|
|
114
|
-
// Check cache for existing node ID
|
|
115
|
-
const cachedNodeId = (0, cache_1.readNodeId)();
|
|
116
|
-
let nodeId;
|
|
117
|
-
if (cachedNodeId) {
|
|
118
|
-
console.log(`🔍 Found cached node ID: ${cachedNodeId}`);
|
|
119
|
-
console.log('🔍 Verifying node exists in hub...');
|
|
120
|
-
// Check if node exists in hub
|
|
121
|
-
// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-call
|
|
122
|
-
const nodeExists = await registration_service_1.registrationService.checkNodeExists(hubUrl, accessKey, token, cachedNodeId);
|
|
123
|
-
if (nodeExists) {
|
|
124
|
-
console.log(`✅ Node ${cachedNodeId} already exists in hub. Skipping registration.`);
|
|
125
|
-
nodeId = cachedNodeId;
|
|
126
|
-
}
|
|
127
|
-
else {
|
|
128
|
-
console.log(`⚠️ Cached node ID ${cachedNodeId} not found in hub. Will register as new node.`);
|
|
129
|
-
}
|
|
130
|
-
}
|
|
131
|
-
// If node doesn't exist in cache or hub, register it
|
|
132
|
-
if (!nodeId) {
|
|
133
|
-
console.log('📡 Registering node with hub...');
|
|
134
|
-
console.log(` Hub URL: ${hubUrl}`);
|
|
135
|
-
// Auto-detect OS and host (IP:PORT format)
|
|
136
|
-
const osName = typeof config.os === 'string' ? config.os : (0, os_1.getOSName)();
|
|
137
|
-
// Use IP:PORT format for host, or use config if provided
|
|
138
|
-
const host = config.host ? config.host : (0, os_1.getNodeHost)(PORT);
|
|
139
|
-
const hostname = (0, os_1.getHostname)();
|
|
140
|
-
const nodeName = typeof config.name === 'string' ? config.name : `Node-${hostname}`;
|
|
141
|
-
const tags = typeof config.tags === 'string' || config.tags === null ? config.tags : undefined;
|
|
142
|
-
console.log(` Node Name: ${nodeName}`);
|
|
143
|
-
console.log(` Host: ${host} (IP:PORT)`);
|
|
144
|
-
console.log(` OS: ${osName}`);
|
|
145
|
-
const response = await registration_service_1.registrationService.registerWithHub({
|
|
146
|
-
hubUrl,
|
|
147
|
-
accessKey,
|
|
148
|
-
token,
|
|
149
|
-
name: nodeName,
|
|
150
|
-
host: host,
|
|
151
|
-
tags,
|
|
152
|
-
os: osName,
|
|
153
|
-
});
|
|
154
|
-
console.log(`✅ Node registered successfully with ID: ${response.id}`);
|
|
155
|
-
// Save node ID to cache file
|
|
156
|
-
(0, cache_1.saveNodeId)(response.id);
|
|
157
|
-
nodeId = response.id;
|
|
158
|
-
}
|
|
159
|
-
// Auto-detect host for device manager initialization
|
|
160
|
-
const host = config.host ? config.host : (0, os_1.getNodeHost)(PORT);
|
|
161
|
-
const capabilityPortRange = config.capabilityPortRange
|
|
162
|
-
? config.capabilityPortRange
|
|
163
|
-
: DEFAULT_PORT_RANGE;
|
|
164
|
-
// Initialize Android device manager and fetch devices first
|
|
165
|
-
// (needed for capability processing in websocket heartbeat service)
|
|
166
|
-
await initializeDeviceManager(nodeId, config, host, PORT, capabilityPortRange);
|
|
167
|
-
// Initialize and start WebSocket heartbeat service with device lookup function
|
|
168
|
-
heartbeatService = new websocketHeartbeat_service_1.WebSocketHeartbeatService({
|
|
169
|
-
hubUrl: config.hubUrl,
|
|
170
|
-
accessKey: config.accessKey,
|
|
171
|
-
token: config.token,
|
|
172
|
-
nodeId: nodeId,
|
|
173
|
-
reconnectDelay: 5000,
|
|
174
|
-
maxReconnectAttempts: Infinity,
|
|
175
|
-
getDeviceByUdid: async (udid) => {
|
|
176
|
-
if (androidDeviceManager) {
|
|
177
|
-
const device = await androidDeviceManager.getDeviceByUdid(udid);
|
|
178
|
-
if (device)
|
|
179
|
-
return device;
|
|
180
|
-
}
|
|
181
|
-
if (iosDeviceManager) {
|
|
182
|
-
const device = await iosDeviceManager.getDeviceByUdid(udid);
|
|
183
|
-
if (device)
|
|
184
|
-
return device;
|
|
185
|
-
}
|
|
186
|
-
return undefined;
|
|
187
|
-
},
|
|
188
|
-
capabilityPortRange: capabilityPortRange, // Use port range from config or default
|
|
189
|
-
chromeDriverPath: config.chromeDriverPath, // Use ChromeDriver path from config if provided
|
|
190
|
-
wdaResignedIpaPath: config.wdaResignedIpaPath, // Use WDA resigned IPA path from config if provided
|
|
191
|
-
});
|
|
192
|
-
// Set singleton instance for access from other services
|
|
193
|
-
const { setWebSocketHeartbeatInstance } = await Promise.resolve().then(() => __importStar(require('./services/websocketHeartbeat.service')));
|
|
194
|
-
setWebSocketHeartbeatInstance(heartbeatService);
|
|
195
|
-
heartbeatService.start();
|
|
196
|
-
return nodeId;
|
|
197
|
-
}
|
|
198
|
-
catch (error) {
|
|
199
|
-
console.error('❌ Failed to register with hub:', error instanceof Error ? error.message : String(error));
|
|
200
|
-
console.error(' Server will start but node is not registered with hub');
|
|
201
|
-
return undefined;
|
|
202
|
-
}
|
|
203
|
-
}
|
|
204
|
-
/**
|
|
205
|
-
* Initialize Android device manager and fetch devices
|
|
206
|
-
*/
|
|
207
|
-
async function initializeDeviceManager(nodeId, config, host, port, capabilityPortRange) {
|
|
208
|
-
try {
|
|
209
|
-
// Extract IP from host (host is in format IP:PORT)
|
|
210
|
-
const bindHostOrIp = host.split(':')[0] || (0, os_1.getLocalIPAddress)();
|
|
211
|
-
logger_1.default.info('📱 Initializing Device Managers...');
|
|
212
|
-
// Initialize device hub service first (before device manager)
|
|
213
|
-
if (config.hubUrl && config.accessKey && config.token) {
|
|
214
|
-
deviceHubService = new deviceHub_service_1.DeviceHubService({
|
|
215
|
-
hubUrl: config.hubUrl,
|
|
216
|
-
accessKey: config.accessKey,
|
|
217
|
-
token: config.token,
|
|
218
|
-
});
|
|
219
|
-
}
|
|
220
|
-
else {
|
|
221
|
-
logger_1.default.warn('⚠️ Hub configuration not available. Devices will not be sent to hub.');
|
|
222
|
-
}
|
|
223
|
-
const platform = config.platform || 'android';
|
|
224
|
-
if (platform === 'android' || platform === 'both') {
|
|
225
|
-
logger_1.default.info('🤖 Initializing Android device manager...');
|
|
226
|
-
// Initialize Android device manager with deviceHubService
|
|
227
|
-
androidDeviceManager = new androidDeviceManager_service_1.AndroidDeviceManager({
|
|
228
|
-
bindHostOrIp,
|
|
229
|
-
hostPort: port,
|
|
230
|
-
nodeId,
|
|
231
|
-
portRange: capabilityPortRange, // Use capability port range from config or default
|
|
232
|
-
skipChromeDownload: false, // Can be made configurable later
|
|
233
|
-
liveStreaming: false, // Can be made configurable later
|
|
234
|
-
deviceHubService: deviceHubService || undefined,
|
|
235
|
-
});
|
|
236
|
-
}
|
|
237
|
-
if (platform === 'ios' || platform === 'both') {
|
|
238
|
-
logger_1.default.info('🍎 Initializing iOS device manager...');
|
|
239
|
-
const iosDeviceType = config.iosDeviceType || 'both';
|
|
240
|
-
iosDeviceManager = new iosDeviceManager_service_1.IOSDeviceManager({
|
|
241
|
-
bindHostOrIp,
|
|
242
|
-
hostPort: port,
|
|
243
|
-
nodeId,
|
|
244
|
-
portRange: capabilityPortRange,
|
|
245
|
-
liveStreaming: false,
|
|
246
|
-
deviceHubService: deviceHubService || undefined,
|
|
247
|
-
bootedSimulators: config.bootedSimulators,
|
|
248
|
-
iosDeviceType: iosDeviceType,
|
|
249
|
-
});
|
|
250
|
-
}
|
|
251
|
-
// Fetch and send initial devices to hub
|
|
252
|
-
if (deviceHubService) {
|
|
253
|
-
await fetchAndSendDevices(nodeId, config);
|
|
254
|
-
}
|
|
255
|
-
}
|
|
256
|
-
catch (error) {
|
|
257
|
-
logger_1.default.error(`❌ Failed to initialize device managers: ${error instanceof Error ? error.message : String(error)}`);
|
|
258
|
-
// Don't fail server startup if device manager fails
|
|
259
|
-
}
|
|
260
|
-
}
|
|
261
|
-
/**
|
|
262
|
-
* Fetch devices and send them to hub
|
|
263
|
-
*/
|
|
264
|
-
async function fetchAndSendDevices(nodeId, config) {
|
|
265
|
-
if (!deviceHubService) {
|
|
266
|
-
return;
|
|
267
|
-
}
|
|
268
|
-
try {
|
|
269
|
-
logger_1.default.info('🔍 Fetching devices...');
|
|
270
|
-
const allDevices = [];
|
|
271
|
-
// Fetch Android devices
|
|
272
|
-
if (androidDeviceManager) {
|
|
273
|
-
const androidType = (config.androidDeviceType || 'both');
|
|
274
|
-
const devices = await androidDeviceManager.getDevices({ androidDeviceType: androidType }, []);
|
|
275
|
-
if (devices.length > 0) {
|
|
276
|
-
logger_1.default.info(`✅ Found ${devices.length} Android device(s)`);
|
|
277
|
-
allDevices.push(...devices);
|
|
278
|
-
}
|
|
279
|
-
else {
|
|
280
|
-
logger_1.default.info('ℹ️ No Android devices found');
|
|
281
|
-
}
|
|
282
|
-
}
|
|
283
|
-
// Fetch iOS devices
|
|
284
|
-
if (iosDeviceManager) {
|
|
285
|
-
const iosType = (config.iosDeviceType || 'both');
|
|
286
|
-
const devices = await iosDeviceManager.getDevices({ iosDeviceType: iosType }, []);
|
|
287
|
-
if (devices.length > 0) {
|
|
288
|
-
logger_1.default.info(`✅ Found ${devices.length} iOS device(s)`);
|
|
289
|
-
allDevices.push(...devices);
|
|
290
|
-
}
|
|
291
|
-
else {
|
|
292
|
-
logger_1.default.info('ℹ️ No iOS devices found');
|
|
293
|
-
}
|
|
294
|
-
}
|
|
295
|
-
if (allDevices.length > 0) {
|
|
296
|
-
// Send devices to hub
|
|
297
|
-
await deviceHubService.postDevicesToHub(allDevices, nodeId);
|
|
298
|
-
}
|
|
299
|
-
}
|
|
300
|
-
catch (error) {
|
|
301
|
-
logger_1.default.error(`❌ Failed to fetch/send devices: ${error instanceof Error ? error.message : String(error)}`);
|
|
302
|
-
// Don't throw - we don't want this to fail server startup
|
|
303
|
-
}
|
|
304
|
-
}
|
|
305
|
-
// Start server
|
|
306
|
-
async function startServer() {
|
|
307
|
-
try {
|
|
308
|
-
// Initialize storage service before registering with hub
|
|
309
|
-
await initializeStorageService();
|
|
310
|
-
// Register with hub first
|
|
311
|
-
await registerWithHub();
|
|
312
|
-
// Start listening
|
|
313
|
-
app.listen(PORT, () => {
|
|
314
|
-
console.log(`🚀 Node server is running on http://localhost:${PORT}`);
|
|
315
|
-
console.log(`📚 API endpoints available at http://localhost:${PORT}/api`);
|
|
316
|
-
console.log(`\nAvailable endpoints:`);
|
|
317
|
-
console.log(` GET /health`);
|
|
318
|
-
});
|
|
319
|
-
}
|
|
320
|
-
catch (error) {
|
|
321
|
-
console.error('❌ Failed to start server:', error);
|
|
322
|
-
process.exit(1);
|
|
323
|
-
}
|
|
324
|
-
}
|
|
325
|
-
/**
|
|
326
|
-
* Initialize session log storage service
|
|
327
|
-
* Session logs are uploaded to hub after session ends
|
|
328
|
-
*/
|
|
329
|
-
async function initializeStorageService() {
|
|
330
|
-
try {
|
|
331
|
-
const config = (0, node_config_1.getMergedConfig)();
|
|
332
|
-
if (!config.hubUrl) {
|
|
333
|
-
console.warn('⚠️ Hub URL not configured. Session logs will not be uploaded.');
|
|
334
|
-
return;
|
|
335
|
-
}
|
|
336
|
-
// Initialize storage service with hub URL
|
|
337
|
-
const { initializeSessionLogStorage } = await Promise.resolve().then(() => __importStar(require('./services/storage/sessionLogStorage.service')));
|
|
338
|
-
initializeSessionLogStorage(config.hubUrl);
|
|
339
|
-
console.log(`✅ Session log storage initialized (uploading to hub: ${config.hubUrl})`);
|
|
340
|
-
const { getSessionLogStorage } = await Promise.resolve().then(() => __importStar(require('./services/storage/sessionLogStorage.service')));
|
|
341
|
-
const storageService = getSessionLogStorage();
|
|
342
|
-
const isReady = await storageService.isReady();
|
|
343
|
-
if (isReady) {
|
|
344
|
-
console.log(`✅ Hub is reachable for log uploads`);
|
|
345
|
-
}
|
|
346
|
-
else {
|
|
347
|
-
console.warn('⚠️ Hub is not reachable. Log uploads may fail until hub is available.');
|
|
348
|
-
}
|
|
349
|
-
}
|
|
350
|
-
catch (error) {
|
|
351
|
-
console.error('❌ Failed to initialize storage service:', error instanceof Error ? error.message : String(error));
|
|
352
|
-
console.warn(' Session logs will not be uploaded');
|
|
353
|
-
}
|
|
354
|
-
}
|
|
355
|
-
// Handle graceful shutdown
|
|
356
|
-
let isShuttingDown = false;
|
|
357
|
-
async function gracefulShutdown(signal) {
|
|
358
|
-
// Prevent multiple shutdown attempts
|
|
359
|
-
if (isShuttingDown) {
|
|
360
|
-
console.log(`${signal} received, but shutdown already in progress...`);
|
|
361
|
-
return;
|
|
362
|
-
}
|
|
363
|
-
isShuttingDown = true;
|
|
364
|
-
console.log(`${signal} received, shutting down gracefully...`);
|
|
365
|
-
try {
|
|
366
|
-
// Stop heartbeat service
|
|
367
|
-
if (heartbeatService !== null) {
|
|
368
|
-
heartbeatService.stop();
|
|
369
|
-
}
|
|
370
|
-
// Cleanup Appium session manager
|
|
371
|
-
try {
|
|
372
|
-
const { appiumSessionManager } = await Promise.resolve().then(() => __importStar(require('./services/appiumSessionManager.service')));
|
|
373
|
-
await appiumSessionManager.cleanup();
|
|
374
|
-
}
|
|
375
|
-
catch (error) {
|
|
376
|
-
console.error('Error cleaning up Appium session manager:', error);
|
|
377
|
-
}
|
|
378
|
-
await (0, observability_1.shutdownTelemetry)();
|
|
379
|
-
console.log('✅ Shutdown complete');
|
|
380
|
-
process.exit(0);
|
|
381
|
-
}
|
|
382
|
-
catch (error) {
|
|
383
|
-
console.error('❌ Error during shutdown:', error);
|
|
384
|
-
process.exit(1);
|
|
385
|
-
}
|
|
386
|
-
}
|
|
387
|
-
process.on('SIGTERM', () => {
|
|
388
|
-
void gracefulShutdown('SIGTERM');
|
|
389
|
-
});
|
|
390
|
-
process.on('SIGINT', () => {
|
|
391
|
-
void gracefulShutdown('SIGINT');
|
|
392
|
-
});
|
|
393
|
-
void startServer();
|
|
394
|
-
//# sourceMappingURL=server.js.map
|
package/dist/src/server.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/server.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"tracingUtils.d.ts","sourceRoot":"","sources":["../../../src/services/tracingUtils.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAW,OAAO,EAAE,IAAI,EAAqB,MAAM,oBAAoB,CAAC;AAE/E;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,GAAG,EAAE,OAAO,CAAC;IACb,IAAI,EAAE,IAAI,CAAC;CACZ;AAED;;;;;;;GAOG;AACH,wBAAgB,wBAAwB,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,kBAAkB,CA6CjG;AAED;;;;;;;GAOG;AACH,wBAAsB,gBAAgB,CAAC,CAAC,EACtC,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,MAAM,EAChB,EAAE,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,GAC7B,OAAO,CAAC,CAAC,CAAC,CAUZ"}
|
|
@@ -1,73 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
/**
|
|
3
|
-
* Tracing Utilities - OpenTelemetry helpers for distributed tracing
|
|
4
|
-
*
|
|
5
|
-
* This module provides utilities for creating trace contexts from
|
|
6
|
-
* hub's traceId, enabling proper distributed tracing across Socket.IO boundaries.
|
|
7
|
-
*/
|
|
8
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
-
exports.createContextFromTraceId = createContextFromTraceId;
|
|
10
|
-
exports.withTraceContext = withTraceContext;
|
|
11
|
-
const api_1 = require("@opentelemetry/api");
|
|
12
|
-
/**
|
|
13
|
-
* Create OpenTelemetry context from hub's traceId
|
|
14
|
-
* This enables proper distributed tracing across Socket.IO boundaries
|
|
15
|
-
*
|
|
16
|
-
* @param hubTraceId - The trace ID from the hub (32 character hex string)
|
|
17
|
-
* @param spanName - Name for the new span
|
|
18
|
-
* @returns Object containing the context and span
|
|
19
|
-
*/
|
|
20
|
-
function createContextFromTraceId(hubTraceId, spanName) {
|
|
21
|
-
const tracer = api_1.trace.getTracer('farm-runner');
|
|
22
|
-
// If hubTraceId is valid, create a proper parent span context
|
|
23
|
-
let parentContext = api_1.context.active();
|
|
24
|
-
if (hubTraceId && hubTraceId !== 'unknown' && hubTraceId.length === 32) {
|
|
25
|
-
// We need to generate a spanId for the parent (hub's span)
|
|
26
|
-
// Since we don't have the actual hub spanId, we'll use a derived one
|
|
27
|
-
const hubSpanId = hubTraceId.substring(16, 32); // Use second half of traceId as spanId
|
|
28
|
-
// Create a proper remote span context that will be used as the parent
|
|
29
|
-
const remoteSpanContext = {
|
|
30
|
-
traceId: hubTraceId,
|
|
31
|
-
spanId: hubSpanId,
|
|
32
|
-
traceFlags: api_1.TraceFlags.SAMPLED,
|
|
33
|
-
isRemote: true,
|
|
34
|
-
};
|
|
35
|
-
// Create a non-recording span from the remote context
|
|
36
|
-
// This represents the hub's span in our node's trace tree
|
|
37
|
-
const nonRecordingSpan = api_1.trace.wrapSpanContext(remoteSpanContext);
|
|
38
|
-
// Set this as the parent span in the context
|
|
39
|
-
parentContext = api_1.trace.setSpan(api_1.context.active(), nonRecordingSpan);
|
|
40
|
-
}
|
|
41
|
-
// Create a new span that will inherit the traceId from parent context
|
|
42
|
-
const span = tracer.startSpan(spanName, {
|
|
43
|
-
kind: 1, // SpanKind.SERVER - we're receiving a request from hub
|
|
44
|
-
attributes: {
|
|
45
|
-
'messaging.system': 'socket.io',
|
|
46
|
-
'messaging.operation': 'receive',
|
|
47
|
-
'peer.service': 'farm-orchestrator',
|
|
48
|
-
},
|
|
49
|
-
}, parentContext);
|
|
50
|
-
// Create context with the new span
|
|
51
|
-
const ctx = api_1.trace.setSpan(parentContext, span);
|
|
52
|
-
return { ctx, span };
|
|
53
|
-
}
|
|
54
|
-
/**
|
|
55
|
-
* Execute a function within a trace context
|
|
56
|
-
* Handles errors and ensures span is properly ended
|
|
57
|
-
*
|
|
58
|
-
* @param hubTraceId - The trace ID from the hub
|
|
59
|
-
* @param spanName - Name for the span
|
|
60
|
-
* @param fn - Async function to execute within the context
|
|
61
|
-
*/
|
|
62
|
-
async function withTraceContext(hubTraceId, spanName, fn) {
|
|
63
|
-
const { ctx, span } = createContextFromTraceId(hubTraceId, spanName);
|
|
64
|
-
return api_1.context.with(ctx, async () => {
|
|
65
|
-
try {
|
|
66
|
-
return await fn(span);
|
|
67
|
-
}
|
|
68
|
-
finally {
|
|
69
|
-
span.end();
|
|
70
|
-
}
|
|
71
|
-
});
|
|
72
|
-
}
|
|
73
|
-
//# sourceMappingURL=tracingUtils.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"tracingUtils.js","sourceRoot":"","sources":["../../../src/services/tracingUtils.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;AAoBH,4DA6CC;AAUD,4CAcC;AAvFD,4CAA+E;AAU/E;;;;;;;GAOG;AACH,SAAgB,wBAAwB,CAAC,UAAkB,EAAE,QAAgB;IAC3E,MAAM,MAAM,GAAG,WAAK,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC;IAE9C,8DAA8D;IAC9D,IAAI,aAAa,GAAG,aAAO,CAAC,MAAM,EAAE,CAAC;IAErC,IAAI,UAAU,IAAI,UAAU,KAAK,SAAS,IAAI,UAAU,CAAC,MAAM,KAAK,EAAE,EAAE,CAAC;QACvE,2DAA2D;QAC3D,qEAAqE;QACrE,MAAM,SAAS,GAAG,UAAU,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,uCAAuC;QAEvF,sEAAsE;QACtE,MAAM,iBAAiB,GAAG;YACxB,OAAO,EAAE,UAAU;YACnB,MAAM,EAAE,SAAS;YACjB,UAAU,EAAE,gBAAU,CAAC,OAAO;YAC9B,QAAQ,EAAE,IAAI;SACf,CAAC;QAEF,sDAAsD;QACtD,0DAA0D;QAC1D,MAAM,gBAAgB,GAAG,WAAK,CAAC,eAAe,CAAC,iBAAiB,CAAC,CAAC;QAElE,6CAA6C;QAC7C,aAAa,GAAG,WAAK,CAAC,OAAO,CAAC,aAAO,CAAC,MAAM,EAAE,EAAE,gBAAgB,CAAC,CAAC;IACpE,CAAC;IAED,sEAAsE;IACtE,MAAM,IAAI,GAAG,MAAM,CAAC,SAAS,CAC3B,QAAQ,EACR;QACE,IAAI,EAAE,CAAC,EAAE,uDAAuD;QAChE,UAAU,EAAE;YACV,kBAAkB,EAAE,WAAW;YAC/B,qBAAqB,EAAE,SAAS;YAChC,cAAc,EAAE,mBAAmB;SACpC;KACF,EACD,aAAa,CACd,CAAC;IAEF,mCAAmC;IACnC,MAAM,GAAG,GAAG,WAAK,CAAC,OAAO,CAAC,aAAa,EAAE,IAAI,CAAC,CAAC;IAE/C,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC;AACvB,CAAC;AAED;;;;;;;GAOG;AACI,KAAK,UAAU,gBAAgB,CACpC,UAAkB,EAClB,QAAgB,EAChB,EAA8B;IAE9B,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,wBAAwB,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;IAErE,OAAO,aAAO,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,IAAI,EAAE;QAClC,IAAI,CAAC;YACH,OAAO,MAAM,EAAE,CAAC,IAAI,CAAC,CAAC;QACxB,CAAC;gBAAS,CAAC;YACT,IAAI,CAAC,GAAG,EAAE,CAAC;QACb,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC"}
|