UNPKG

1.68 kBJavaScriptView Raw
1import {Transform, ingest} from 'vega-dataflow';
2import {array, inherits} from 'vega-util';
3
4/**
5 * Load and parse data from an external source. Marshalls parameter
6 * values and then invokes the Dataflow request method.
7 * @constructor
8 * @param {object} params - The parameters for this operator.
9 * @param {string} params.url - The URL to load from.
10 * @param {object} params.format - The data format options.
11 */
12export default function Load(params) {
13 Transform.call(this, [], params);
14 this._pending = null;
15}
16
17var prototype = inherits(Load, Transform);
18
19prototype.transform = function(_, pulse) {
20 const df = pulse.dataflow;
21
22 if (this._pending) {
23 // update state and return pulse
24 return output(this, pulse, this._pending);
25 }
26
27 if (stop(_)) return pulse.StopPropagation;
28
29 if (_.values) {
30 // parse and ingest values, return output pulse
31 return output(this, pulse, df.parse(_.values, _.format));
32 } else if (_.async) {
33 // return promise for non-blocking async loading
34 const p = df.request(_.url, _.format).then(res => {
35 this._pending = array(res.data);
36 return df => df.touch(this);
37 });
38 return {async: p};
39 } else {
40 // return promise for synchronous loading
41 return df.request(_.url, _.format)
42 .then(res => output(this, pulse, array(res.data)));
43 }
44};
45
46function stop(_) {
47 return _.modified('async') && !(
48 _.modified('values') || _.modified('url') || _.modified('format')
49 );
50}
51
52function output(op, pulse, data) {
53 data.forEach(ingest);
54 const out = pulse.fork(pulse.NO_FIELDS & pulse.NO_SOURCE);
55 out.rem = op.value;
56 op.value = out.source = out.add = data;
57 op._pending = null;
58 return out;
59}