Workify
Vos workflows asynchrones. Votre interface. Zéro dépendance runtime.
Un moteur TypeScript headless pour connecter et exécuter des tâches asynchrones sous forme de graphes orientés acycliques (DAG), dans Node.js, Bun et le navigateur.
GitHub · accès requis · Voir sur npm · Site du projet · Documentation officielle
Installation
npm install @newvexa/workifyUn moteur, pas un framework
Workify exécute le graphe ; votre application gère l’interface. Le cœur est indépendant de React, Vue ou Angular et fournit des exports ESM, CommonJS et des déclarations TypeScript.
Le package est distribué publiquement sous licence MIT. Cette présentation s’appuie sur la documentation publiée avec la version 0.1.4, sans figer la version installée par npm.
Les concepts essentiels
Un nœud réalise une tâche asynchrone. Un lien connecte des ports nommés et peut transformer la valeur transmise. Le moteur exécute le graphe dans une limite de concurrence partagée.
Les branches If/Else et Switch orientent le parcours ; les snapshots immuables, abonnements et événements permettent d’observer l’exécution. L’annulation est coopérative via AbortSignal.
Premier workflow TypeScript
Cet exemple reçoit le nombre 21, le transmet à un second nœud et affiche succeeded puis 42. Les types importés font partie des exports publics du package.
Dans une application Node ESM, installez TypeScript, définissez type: module dans package.json et enregistrez l’exemple dans demo.ts. Compilez avec : npx tsc demo.ts --target ES2022 --module NodeNext --moduleResolution NodeNext --outDir build, puis exécutez node build/demo.js.
import { Engine, Workflow } from '@newvexa/workify';
import type { NodeInput, NodeContext, NodeResult, RunResult } from '@newvexa/workify';
async function runDemo(): Promise<RunResult> {
const workflow: Workflow = new Workflow({ id: 'demo', name: 'Double a number' });
workflow.addNode({
id: 'start', name: 'Receive input', type: 'trigger',
async execute(input: NodeInput): Promise<NodeResult> {
return { outputs: { main: input.initial } };
},
});
workflow.addNode({
id: 'double', name: 'Double the value', type: 'action',
async execute(input: NodeInput, context: NodeContext): Promise<NodeResult> {
context.signal.throwIfAborted();
const value = input.incoming[0]?.value;
if (typeof value !== 'number') throw new Error('Expected a number');
return { outputs: { main: value * 2 } };
},
});
workflow.addLink({
id: 'start-double', name: 'Input to calculation',
source: { nodeId: 'start', port: 'main' },
target: { nodeId: 'double', port: 'main' },
});
const engine: Engine = new Engine(workflow, { concurrency: 4, historyLimit: 500 });
return engine.run(21);
}
void runDemo().then((result: RunResult): void => {
console.log(result.status); // succeeded
console.log(result.results.double?.outputs.main); // 42
});Ce que le cœur ne fait pas
Workify est un moteur en mémoire, pas un service de jobs durables. Il ne fournit ni stockage persistant, ni reprise distribuée, ni planification hébergée, ni retries automatiques ou éditeur visuel intégré au package.
Une seule exécution peut être active par instance de moteur. Les données doivent respecter le contrat JsonValue. L’annulation ne supprime pas les effets externes déjà exécutés ; prévoyez cette limite dans votre application. L’API pré-1.0 peut évoluer.
Documentation et contributions
Le site Workify propose les guides, la référence API et les exemples complets. Le dépôt GitHub est actuellement privé et nécessite un accès ; le package npm et sa documentation publiée sont accessibles au public.
Si vous avez accès au dépôt, utilisez les issues et les pull requests pour proposer une amélioration. Sinon, contactez Newvexa via la section contact du site. Aucun accès GitHub n’est requis pour utiliser le package npm.