UNPKG

@layr-labs/hourglass-performer

Version:

TypeScript SDK for building Hourglass AVS performers

161 lines 5.63 kB
"use strict"; // Worker interface for user implementation // Based on the Go IWorker interface in ponos/pkg/performer/worker/worker.go var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { if (k2 === undefined) k2 = k; var desc = Object.getOwnPropertyDescriptor(m, k); if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { desc = { enumerable: true, get: function() { return m[k]; } }; } Object.defineProperty(o, k2, desc); }) : (function(o, m, k, k2) { if (k2 === undefined) k2 = k; o[k2] = m[k]; })); var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { Object.defineProperty(o, "default", { enumerable: true, value: v }); }) : function(o, v) { o["default"] = v; }); var __importStar = (this && this.__importStar) || (function () { var ownKeys = function(o) { ownKeys = Object.getOwnPropertyNames || function (o) { var ar = []; for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k; return ar; }; return ownKeys(o); }; return function (mod) { if (mod && mod.__esModule) return mod; var result = {}; if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]); __setModuleDefault(result, mod); return result; }; })(); Object.defineProperty(exports, "__esModule", { value: true }); exports.EchoWorker = exports.BaseWorker = void 0; /** * Abstract base class for Workers that provides common functionality * Users can extend this class for convenience */ class BaseWorker { /** * Default validation - can be overridden by subclasses * @param task The task request to validate */ async validateTask(task) { if (!task.taskId) { throw new Error('Task ID is required'); } if (!task.payload) { throw new Error('Task payload is required'); } } /** * Handle task - can be overridden in two ways: * 1. Override this method for full TaskRequest/TaskResponse handling * 2. Override handleTask(input) for simplified payload handling */ async handleTask(task) { // Parse payload and call simplified handler const input = this.parsePayload(task.payload); const result = await this.handleSimpleTask(input); const encoded = this.encodePayload(result); return this.createResponse(task.taskId, encoded); } /** * Simplified task handler - override this for easy development * @param input Parsed input from task payload * @returns Result to be encoded and returned */ async handleSimpleTask(input) { throw new Error('Either handleTask or handleSimpleTask must be implemented'); } /** * Helper method to create a task response * @param taskId The task ID * @param result The result as bytes * @returns TaskResponse object */ createResponse(taskId, result) { return { taskId, result, }; } /** * Parse payload from bytes to JavaScript object * @param payload The raw payload bytes * @returns Parsed object */ parsePayload(payload) { try { const text = new TextDecoder().decode(payload); return JSON.parse(text); } catch { // If not JSON, return as string return new TextDecoder().decode(payload); } } /** * Encode result to bytes * @param result The result to encode * @returns Encoded bytes */ encodePayload(result) { if (result instanceof Uint8Array) { return result; } const json = typeof result === 'object' ? JSON.stringify(result) : String(result); return new TextEncoder().encode(json); } /** * Simple start method for one-line usage */ async start(port) { const { PerformerServer } = await Promise.resolve().then(() => __importStar(require('../server/performerServer'))); const { loadEnvironmentConfig, printConfigSummary } = await Promise.resolve().then(() => __importStar(require('../utils/envConfig'))); // Load environment configuration const envConfig = loadEnvironmentConfig(); // Override port if provided if (port) { envConfig.port = port; } // Print configuration summary printConfigSummary(envConfig); const server = new PerformerServer(this, { port: envConfig.port, timeout: envConfig.timeout, debug: envConfig.debug, }); // Set up graceful shutdown server.setupGracefulShutdown(); try { await server.start(); console.log(`🚀 Performer is running on port ${envConfig.port}!`); } catch (error) { console.error('❌ Failed to start server:', error); process.exit(1); } } } exports.BaseWorker = BaseWorker; /** * Simple worker implementation for testing and examples */ class EchoWorker extends BaseWorker { /** * Echo worker that returns the input payload as result * @param task The task request * @returns The task response with the same payload */ async handleTask(task) { return this.createResponse(task.taskId, task.payload); } } exports.EchoWorker = EchoWorker; //# sourceMappingURL=iWorker.js.map