ForgeTotal.js 5
fr

Total.js 5

Remplir les fichiers FlowStream et exécuter des travailleurs isolés

Total.js 5 · total5@0.0.19 total5reference Exécutée avec Total.js 5

Flow.init(directory, callback) lit des fichiers JSON .flow et charge chaque schéma de confiance ; les noms contenant -bk ou _bk sont ignorés. Le dossier par défaut est flowstreams/. Flow.load(schema, callback) accepte aussi worker:'worker' pour un thread worker Node et worker:true pour un processus enfant dans cette version. Les workers Flow ont des globales séparées : n'attendez pas que les objets MAIN du parent ni ses closures soient disponibles dans un composant.

Le concepteur de flux visuel et son UI spécifique sont séparés de cette API en arrière-plan. Les composants sont exécutables codes confiés; les travailleurs sont l'isolation processus/trade, pas une boîte à sable non confiée.

controllers/flows.js
exports.install = function() {
	ROUTE('GET /flow-workers/', exercise);
};
async function exercise($) {
	var ids = [];
	try {
		var source = '<script total>exports.id="echo";exports.name="Echo";exports.inputs=[{id:"input",name:"Input"}];exports.config={prefix:""};exports.make=function(instance,config){instance.message=function($){$.data=config.prefix+String($.data);$.destroy();};};</script>';
		var out = [];
		for (var worker of ['worker', true]) {
			var id = worker === true ? 'file-process' : 'file-thread';
			ids.push(id);
			var schema = { id: id, name: id, worker: worker, components: { echo: source }, design: { a: { id: 'a', component: 'echo', config: { prefix: 'one:' }, connections: {} } }, variables: {} };
			var dir = PATH.root(id);
			F.Fs.mkdirSync(dir, { recursive: true });
			F.Fs.writeFileSync(dir + '/demo.flow', JSON.stringify(schema));
			F.Fs.writeFileSync(dir + '/ignored-bk.flow', JSON.stringify({ id: 'must-not-load' }));
			await new Promise(resolve => Flow.init(dir, resolve));
			var instance = Flow.instances[id];
			var first = await new Promise((resolve, reject) => instance.exec({ id: 'a', data: 'hello', callback: (err, msg) => err ? reject(err) : resolve(msg.data) }));
			instance.reconfigure('a', { prefix: 'two:' });
			var second = await new Promise((resolve, reject) => instance.exec({ id: 'a', data: 'again', callback: (err, msg) => err ? reject(err) : resolve(msg.data) }));
			out.push({ worker: worker, first: first, second: second, isolated: !!instance.flow.isworkerthread });
			Flow.remove(id);
		}
		$.json({ results: out, removed: ids.every(id => !Flow.instances[id]), backupSkipped: !Flow.instances['must-not-load'] });
	} catch (e) { $.invalid(e); }
	finally { for (var id of ids) if (Flow.instances[id]) Flow.remove(id); }
}