Přihlašování souborů FlowStream a provedení izolovaných pracovníků
Flow.init(directory, callback) čte soubory JSON .flow a načte každé důvěryhodné schéma; názvy obsahující -bk nebo _bk se přeskočí. Výchozí adresář je flowstreams/. Flow.load(schema, callback) v této verzi přijímá také worker:'worker' pro worker vlákno Node a worker:true pro podproces. Workery Flow mají oddělené globální proměnné: nečekejte, že objekty MAIN rodiče ani jeho closures budou dostupné uvnitř komponenty.
Designér vizuálního toku a jeho specifický UI jsou odděleny od této záložní API. Komponenty jsou prováděné důvěryhodný kód; pracovníci jsou procesní / třídní izolace, ne nedůvěřovaný kód písek.
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); }
}