API support for Get/SetParameterAttributes

This commit is contained in:
Zaid Abdulla committed 2019-12-17 23:01:28 -08:00
1 parent d311dad861
commit 96add7efe2
4 files changed
+74 -11

No files matched your search

+12
View File
@@ -241,6 +241,18 @@ function sanitizeTask(task): void {
)
throw new Error("Invalid 'targetFileName' property");
break;
case "provisions":
if (
!Array.isArray(task.provisions) ||
!task.provisions.every(arr =>
arr.every(
s => s == null || ["boolean", "number", "string"].includes(typeof s)
)
)
)
throw new Error("Invalid 'provisions' property");
break;
}
return task;
+7
View File
@@ -686,6 +686,13 @@ async function nextRpc(sessionContext: SessionContext): Promise<void> {
["instances", task.objectName, 0]
]);
break;
case "provisions":
session.addProvisions(
sessionContext,
`task_${task._id}`,
task.provisions
);
break;
default:
throw new Error("Task name not recognized");
}
+54 -11
View File
@@ -29,25 +29,45 @@ export function refresh(sessionContext, provision, declarations): boolean {
(provision.length !== 2 || typeof provision[1] !== "string") &&
(provision.length !== 3 ||
typeof provision[1] !== "string" ||
typeof provision[2] !== "number")
typeof provision[2] !== "number") &&
(provision.length < 4 ||
typeof provision[1] !== "string" ||
typeof provision[2] !== "number" ||
typeof provision[3] !== "boolean")
)
throw new Error("Invalid arguments");
const segments = Path.parse(provision[1]).segments.slice();
const l = segments.length;
segments.length = MAX_DEPTH;
segments.fill("*", l);
const path = Path.parse(segments.join("."));
const every = 1000 * (provision[2] || 1);
const offset = scheduling.variance(sessionContext.deviceId, every);
const t = scheduling.interval(sessionContext.timestamp, every, offset);
for (let i = l; i < path.length; ++i) {
let attrGet;
let refreshChildren;
if (provision[3] == null) {
refreshChildren = true;
attrGet = { object: 1, writable: 1, value: t };
} else {
attrGet = {};
refreshChildren = !!provision[3];
for (const a of provision.slice(4)) attrGet[a] = t;
}
let path = Path.parse(provision[1]);
let l = path.length;
if (refreshChildren) {
const segments = path.segments.slice();
l = segments.length;
segments.length = MAX_DEPTH;
segments.fill("*", l);
path = Path.parse(segments.join("."));
}
for (let i = l; i <= path.length; ++i) {
declarations.push({
path: path.slice(0, i),
pathGet: t,
pathSet: null,
attrGet: { object: 1, writable: 1, value: t },
attrGet: attrGet,
attrSet: null,
defer: true
});
@@ -57,15 +77,38 @@ export function refresh(sessionContext, provision, declarations): boolean {
}
export function value(sessionContext, provision, declarations): boolean {
if (provision.length !== 3 || typeof provision[1] !== "string")
if (
provision.length < 3 ||
provision.length > 4 ||
typeof provision[1] !== "string"
)
throw new Error("Invalid arguments");
let attr: string, val: any;
if (provision.length === 3) {
attr = "value";
val = provision[2];
} else {
attr = provision[2] || "";
val = provision[3];
}
if (attr === "accessList") {
val = (val || "")
.split(",")
.map(s => s.trim())
.filter(s => !!s);
} else if (attr === "value") {
val = [val];
}
declarations.push({
path: Path.parse(provision[1]),
pathGet: 1,
pathSet: null,
attrGet: { value: 1 },
attrSet: { value: [provision[2]] },
attrGet: { [attr]: 1 },
attrSet: { [attr]: val },
defer: true
});
+1
View File
@@ -178,6 +178,7 @@ export interface Task {
fileName?: string;
targetFileName?: string;
expiry?: number;
provisions?: (string | number | boolean)[][];
}
export interface Operation {