Annuler l’attente locale avec le SDK Node.js
Passezz le signal d’un AbortController à solve pour arrêter l’attente locale. Enregistrez les données d’entrée complètes de la tâche, y compris son requestId, avant d’appeler le SDK afin de pouvoir récupérer la tâche même si l’appel se termine avant que vous receviez un ID de tâche.
Sur cette page
Enregistrez la requête, puis passez le signal
Utilisez le SDK JavaScript officiel avec Node.js 22 ou version ultérieure, en conservant votre clé API côté serveur. Remplacez le nom d’hôte et l’action de l’exemple par vos valeurs cibles, configurez un profil de site actif et définissez la variable d’environnement du proxy.
L’exemple génère un requestId avant d’appeler solve. Enregistrez durablement cet ID et les données d’entrée inchangées de la tâche avant l’appel, pas seulement dans le gestionnaire d’erreurs. Générer un nouvel ID lors de la récupération ferait perdre le lien avec la requête d’origine.
import { randomUUID } from 'node:crypto';
import { Solvethree, SolvethreeError, TaskFailedError } from '@solvethree/sdk';
const client = new Solvethree({ apiKey: process.env.SOLVETHREE_API_KEY });
const task = { site: 'accounts.example.com', action: 'login', proxy: process.env.SOLVETHREE_PROXY, requestId: randomUUID() };
const controller = new AbortController();
const timer = setTimeout(() => controller.abort(), 5000);
try {
const result = await client.solve(task, { signal: controller.signal, timeoutMs: 180000 });
console.log('Ready task:', result.id);
// Submit this result with its browser identity and original proxy.
} catch (error) {
if (error instanceof TaskFailedError) {
console.error('Failed task:', error.taskId, error.errorCode);
} else if (error instanceof SolvethreeError) {
console.error('Recovery IDs:', error.requestId ?? task.requestId, error.taskId);
// If taskId exists, retrieve it. Otherwise replay the unchanged task with
// this requestId. Canceling local waiting did not cancel the remote task.
}
throw error;
} finally { clearTimeout(timer); }Le minuteur de cinq secondes appelle abort ; signal relie ce contrôleur à l’opération du SDK. La valeur distincte timeoutMs fixe le délai de résolution à 180 secondes. L’un comme l’autre peut mettre fin à l’attente : conservez donc les informations de récupération pour les deux cas. Le bloc finally supprime le minuteur si l’opération se termine avant.
Récupérez la tâche avec les ID dont vous disposez déjà
Le bloc catch journalise les ID de récupération et relance l’erreur ; il ne reprend pas la tâche. Le code appelant doit conserver ces ID et choisir la méthode de récupération appropriée.
- Échec terminal : Traitez d’abord
TaskFailedError, comme dans l’exemple. ExaminezerrorCodeet le message d’erreur, puis arrêtez d’interroger cette tâche en échec. - ID de tâche connu : Si
SolvethreeError.taskIdest présent, reprenez la récupération avecgetTasken utilisant ce même ID. Ne rappelez passolvesimplement pour reprendre l’interrogation. - Aucun ID de tâche : Récupérez le résultat de la création en passant la tâche enregistrée et inchangée à
createTaskavec le mêmerequestId. Utilisez lerequestIdde l’erreur s’il est disponible, sinon l’ID enregistré avant l’appel. Une connexion interrompue ne prouve pas que la création a échoué.
Renvoyer des entrées identiques avec le même requestId renvoie la tâche existante. Modifier les entrées tout en réutilisant cet ID provoque un conflit : ne changez donc pas le proxy, le nom d’hôte ni l’action lors de la récupération.
Lors de la récupération de la tâche, pending et solving indiquent qu’il faut continuer à attendre dans la limite locale choisie. Seul ready contient une solution utilisable. Arrêtez-vous sur failed et examinez les détails de l’erreur.
Testez l’annulation et la récupération avec une attente limitée
- 1.
Enregistrez une requête de test
Enregistrez les données d’entrée complètes de la tâche et son requestId avant d’exécuter l’exemple. Conservez ces valeurs pendant tout le test.
- 2.
Observez comment le premier appel se termine
Si l’opération est toujours en attente lorsque le minuteur de cinq secondes se déclenche, capturez l’erreur obtenue et les ID de récupération. Un résultat prêt ou un échec terminal peut arriver avant ; cette exécution n’a alors pas testé l’annulation.
- 3.
Reprenez la même tâche
Utilisez la méthode de récupération ci-dessus pour obtenir l’ID de tâche, puis appelez getTask avec cet ID et waitMs défini sur 15000. Limitez le nombre de tentatives de récupération ou fixez une échéance locale pour le test. Si la tâche reste au statut pending ou solving lorsque cette limite est atteinte, conservez son ID pour la reprendre plus tard au lieu de créer une autre tâche.
Vérifiez que la récupération renvoie l’ID de tâche d’origine chaque fois qu’il était déjà connu. Cela vérifie l’annulation locale et la récupération de la tâche, pas l’acceptation d’un jeton obtenu par le site cible.
Sources et référence de l’API
Lancez votre première tâche.
Démarrez avec $5 de crédit dans votre espace de travail.