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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "farm-runner",
3
- "version": "1.1.0",
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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/server.ts"],"names":[],"mappings":""}
@@ -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
@@ -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"}