Handles the invoke method from the internals of the responder. Use onInvoke to handle when a node is invoked.
Source
InvokeResponse invoke(
Map<String, dynamic> params,
Responder responder,
InvokeResponse response,
Node parentNode,
[int maxPermission = Permission.CONFIG]) {
Object rslt;
try {
rslt = onInvoke(params);
} catch (e, stack) {
var error = new DSError("invokeException", msg: e.toString());
try {
error.detail = stack.toString();
} catch (e) {}
response.close(error);
return response;
}
var rtype = "values";
if (configs.containsKey(r"$result")) {
rtype = configs[r"$result"];
}
if (rslt == null) {
// Create a default result based on the result type
if (rtype == "values") {
rslt = {};
} else if (rtype == "table") {
rslt = [];
} else if (rtype == "stream") {
rslt = [];
}
}
if (rslt is Iterable) {
response.updateStream(rslt.toList(), streamStatus: StreamStatus.closed);
} else if (rslt is Map) {
var columns = [];
var out = [];
for (var x in rslt.keys) {
columns.add({
"name": x,
"type": "dynamic"
});
out.add(rslt[x]);
}
response.updateStream(
[out],
columns: columns,
streamStatus: StreamStatus.closed
);
} else if (rslt is SimpleTableResult) {
response.updateStream(rslt.rows,
columns: rslt.columns, streamStatus: StreamStatus.closed);
} else if (rslt is AsyncTableResult) {
(rslt as AsyncTableResult).write(response);
response.onClose = (var response) {
if ((rslt as AsyncTableResult).onClose != null) {
(rslt as AsyncTableResult).onClose(response);
}
};
return response;
} else if (rslt is Table) {
response.updateStream(rslt.rows,
columns: rslt.columns, streamStatus: StreamStatus.closed);
} else if (rslt is Stream) {
var r = new AsyncTableResult();
response.onClose = (var response) {
if (r.onClose != null) {
r.onClose(response);
}
};
Stream stream = rslt;
if (rtype == "stream") {
StreamSubscription sub;
r.onClose = (_) {
if (sub != null) {
sub.cancel();
}
};
sub = stream.listen((v) {
if (v is TableMetadata) {
r.meta = v.meta;
return;
} else if (v is TableColumns) {
r.columns = v.columns.map((x) => x.getData()).toList();
return;
}
if (v is Iterable) {
r.update(v.toList(), StreamStatus.open);
} else if (v is Map) {
var meta;
if (v.containsKey("__META__")) {
meta = v["__META__"];
}
r.update([v], StreamStatus.open, meta);
} else {
throw new Exception("Unknown Value from Stream");
}
}, onDone: () {
r.close();
}, onError: (e, stack) {
var error = new DSError("invokeException", msg: e.toString());
try {
error.detail = stack.toString();
} catch (e) {}
response.close(error);
}, cancelOnError: true);
r.write(response);
return response;
} else {
var list = [];
StreamSubscription sub;
r.onClose = (_) {
if (sub != null) {
sub.cancel();
}
};
sub = stream.listen((v) {
if (v is TableMetadata) {
r.meta = v.meta;
return;
} else if (v is TableColumns) {
r.columns = v.columns.map((x) => x.getData()).toList();
return;
}
if (v is Iterable) {
list.addAll(v);
} else if (v is Map) {
list.add(v);
} else {
throw new Exception("Unknown Value from Stream");
}
}, onDone: () {
r.update(list);
r.close();
}, onError: (e, stack) {
var error = new DSError("invokeException", msg: e.toString());
try {
error.detail = stack.toString();
} catch (e) {}
response.close(error);
}, cancelOnError: true);
}
r.write(response);
return response;
} else if (rslt is Future) {
var r = new AsyncTableResult();
response.onClose = (var response) {
if (r.onClose != null) {
r.onClose(response);
}
};
rslt.then((value) {
if (value is LiveTable) {
r = null;
value.sendTo(response);
} else if (value is Stream) {
Stream stream = value;
StreamSubscription sub;
r.onClose = (_) {
if (sub != null) {
sub.cancel();
}
};
sub = stream.listen((v) {
if (v is TableMetadata) {
r.meta = v.meta;
return;
} else if (v is TableColumns) {
r.columns = v.columns.map((x) => x.getData()).toList();
return;
}
if (v is Iterable) {
r.update(v.toList());
} else if (v is Map) {
var meta;
if (v.containsKey("__META__")) {
meta = v["__META__"];
}
r.update([v], StreamStatus.open, meta);
} else {
throw new Exception("Unknown Value from Stream");
}
}, onDone: () {
r.close();
}, onError: (e, stack) {
var error = new DSError("invokeException", msg: e.toString());
try {
error.detail = stack.toString();
} catch (e) {}
response.close(error);
}, cancelOnError: true);
} else if (value is Table) {
Table table = value;
r.columns = table.columns.map((x) => x.getData()).toList();
r.update(table.rows, StreamStatus.closed, table.meta);
r.close();
} else {
r.update(value is Iterable ? value.toList() : [value]);
r.close();
}
}).catchError((e, stack) {
var error = new DSError("invokeException", msg: e.toString());
try {
error.detail = stack.toString();
} catch (e) {}
response.close(error);
});
r.write(response);
return response;
} else if (rslt is LiveTable) {
rslt.sendTo(response);
} else {
response.close();
}
return response;
}