Is possible to spawn a worker inside an http?
Is it possible to spawn background workers on Deno Deploy? My goal is to handle an HTTP request, return a response immediately, and continue running a long-running process (3–5 minutes) in the background. trigger a worker rather than call a separate application. The background task involves agents/Mistral
implementation below, this are the logs:
[2025-11-19T21:09:32.969Z] [INFO] [LINE 559][chat_response.ts][spawn_agent_worker] Function called for answer agent
[2025-11-19T21:09:32.969Z] [INFO] [LINE 563][chat_response.ts][spawn_agent_worker] Worker URL constructed
[2025-11-19T21:09:32.987Z] [INFO] [LINE 577][chat_response.ts][spawn_agent_worker] Worker instance created
[2025-11-19T21:09:32.987Z] [INFO] [LINE 580][chat_response.ts][spawn_agent_worker] Worker stored in registry
[2025-11-19T21:09:32.988Z] [INFO] [LINE 602][chat_response.ts][spawn_agent_worker] Message sent to worker
[2025-11-19T21:09:32.988Z] [INFO] [LINE 614][chat_response.ts][call_agent_answer] STEP 4: spawn_agent_worker returned
[2025-11-19T21:09:32.988Z] [INFO] [LINE 615][chat_response.ts][call_agent_answer] STEP 4: Worker spawn initiated
[2025-11-19T21:09:32.969Z] [INFO] [LINE 559][chat_response.ts][spawn_agent_worker] Function called for answer agent
[2025-11-19T21:09:32.969Z] [INFO] [LINE 563][chat_response.ts][spawn_agent_worker] Worker URL constructed
[2025-11-19T21:09:32.987Z] [INFO] [LINE 577][chat_response.ts][spawn_agent_worker] Worker instance created
[2025-11-19T21:09:32.987Z] [INFO] [LINE 580][chat_response.ts][spawn_agent_worker] Worker stored in registry
[2025-11-19T21:09:32.988Z] [INFO] [LINE 602][chat_response.ts][spawn_agent_worker] Message sent to worker
[2025-11-19T21:09:32.988Z] [INFO] [LINE 614][chat_response.ts][call_agent_answer] STEP 4: spawn_agent_worker returned
[2025-11-19T21:09:32.988Z] [INFO] [LINE 615][chat_response.ts][call_agent_answer] STEP 4: Worker spawn initiated
1 Reply
const spawn_agent_worker = (task: {
type: "answer" | "action";
id_message: string;
messages: TmessageResponseSchema;
system_prompt?: string;
}) => {
logger.info(`[LINE 559][chat_response.ts][spawn_agent_worker] Function called for ${task.type} agent`);
try {
// Get the current file's directory to construct worker path
const workerUrl = new URL("../workers/agent_worker.ts", import.meta.url)
.href;
logger.info(`[LINE 563][chat_response.ts][spawn_agent_worker] Worker URL constructed`);
// Create new worker
const worker = new Worker(workerUrl, {
type: "module",
deno: {
permissions: {
net: true, // Redis requires network
env: true, // Redis needs environment variables
write: true, // Logger needs to write to logs.txt
read: true, // May need to read files
},
},
});
logger.info(`[LINE 577][chat_response.ts][spawn_agent_worker] Worker instance created`);
// Store worker in registry to prevent garbage collection
activeWorkers.set(task.id_message, worker);
logger.info(`[LINE 580][chat_response.ts][spawn_agent_worker] Worker stored in registry`);
// Listen for worker messages (for logging and verification)
worker.onmessage = (event) => {
logger.info(`[LINE 583][chat_response.ts][spawn_agent_worker] Worker completed: ${event.data.success ? 'success' : 'error'}`);
// Remove from registry and terminate
activeWorkers.delete(task.id_message);
worker.terminate();
};
worker.onerror = (error) => {
logger.error(`[LINE ][chat_response.ts][spawn_agent_worker] Worker error: ${error instanceof ErrorEvent ? error.message : String(error)}`);
// Remove registry n terminate
activeWorkers.delete(task.id_message);
worker.terminate();
};
worker.onmessageerror = (_error) => {
logger.error(`[LINE 597][chat_response.ts][spawn_agent_worker] Worker message error`);
};
const spawn_agent_worker = (task: {
type: "answer" | "action";
id_message: string;
messages: TmessageResponseSchema;
system_prompt?: string;
}) => {
logger.info(`[LINE 559][chat_response.ts][spawn_agent_worker] Function called for ${task.type} agent`);
try {
// Get the current file's directory to construct worker path
const workerUrl = new URL("../workers/agent_worker.ts", import.meta.url)
.href;
logger.info(`[LINE 563][chat_response.ts][spawn_agent_worker] Worker URL constructed`);
// Create new worker
const worker = new Worker(workerUrl, {
type: "module",
deno: {
permissions: {
net: true, // Redis requires network
env: true, // Redis needs environment variables
write: true, // Logger needs to write to logs.txt
read: true, // May need to read files
},
},
});
logger.info(`[LINE 577][chat_response.ts][spawn_agent_worker] Worker instance created`);
// Store worker in registry to prevent garbage collection
activeWorkers.set(task.id_message, worker);
logger.info(`[LINE 580][chat_response.ts][spawn_agent_worker] Worker stored in registry`);
// Listen for worker messages (for logging and verification)
worker.onmessage = (event) => {
logger.info(`[LINE 583][chat_response.ts][spawn_agent_worker] Worker completed: ${event.data.success ? 'success' : 'error'}`);
// Remove from registry and terminate
activeWorkers.delete(task.id_message);
worker.terminate();
};
worker.onerror = (error) => {
logger.error(`[LINE ][chat_response.ts][spawn_agent_worker] Worker error: ${error instanceof ErrorEvent ? error.message : String(error)}`);
// Remove registry n terminate
activeWorkers.delete(task.id_message);
worker.terminate();
};
worker.onmessageerror = (_error) => {
logger.error(`[LINE 597][chat_response.ts][spawn_agent_worker] Worker message error`);
};
// Send task to worker
try {
worker.postMessage(task);
logger.info(`[LINE 602][chat_response.ts][spawn_agent_worker] Message sent to worker`);
} catch (error) {
logger.error(`[LINE 604][chat_response.ts][spawn_agent_worker] Failed to send message: ${error instanceof Error ? error.message : String(error)}`);
activeWorkers.delete(task.id_message);
worker.terminate();
throw error;
}
} catch (error) {
logger.error(`[LINE 609][chat_response.ts][spawn_agent_worker] Exception in spawn_agent_worker: ${error instanceof Error ? error.message : String(error)}`);
throw error;
}
};
// Send task to worker
try {
worker.postMessage(task);
logger.info(`[LINE 602][chat_response.ts][spawn_agent_worker] Message sent to worker`);
} catch (error) {
logger.error(`[LINE 604][chat_response.ts][spawn_agent_worker] Failed to send message: ${error instanceof Error ? error.message : String(error)}`);
activeWorkers.delete(task.id_message);
worker.terminate();
throw error;
}
} catch (error) {
logger.error(`[LINE 609][chat_response.ts][spawn_agent_worker] Exception in spawn_agent_worker: ${error instanceof Error ? error.message : String(error)}`);
throw error;
}
};